Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
authorDavid S. Miller <davem@davemloft.net>
Tue, 6 Mar 2012 02:16:26 +0000 (21:16 -0500)
committerDavid S. Miller <davem@davemloft.net>
Tue, 6 Mar 2012 02:16:26 +0000 (21:16 -0500)
Conflicts:
drivers/net/vmxnet3/vmxnet3_drv.c

Small vmxnet3 conflict with header size bug fix in 'net'.

Signed-off-by: David S. Miller <davem@davemloft.net>

1423 files changed:
Documentation/ABI/testing/sysfs-class-net-mesh
Documentation/DocBook/80211.tmpl
Documentation/ioctl/ioctl-number.txt
Documentation/magic-number.txt
Documentation/networking/LICENSE.qlge
Documentation/networking/l2tp.txt
Documentation/networking/netdev-features.txt
Documentation/networking/phy.txt
Documentation/networking/ppp_generic.txt
Documentation/zh_CN/magic-number.txt
MAINTAINERS
arch/alpha/include/asm/socket.h
arch/arm/include/asm/socket.h
arch/avr32/include/asm/socket.h
arch/blackfin/mach-bf518/boards/ezbrd.c
arch/blackfin/mach-bf518/boards/tcm-bf518.c
arch/blackfin/mach-bf527/boards/ad7160eval.c
arch/blackfin/mach-bf527/boards/cm_bf527.c
arch/blackfin/mach-bf527/boards/ezbrd.c
arch/blackfin/mach-bf527/boards/ezkit.c
arch/blackfin/mach-bf527/boards/tll6527m.c
arch/blackfin/mach-bf537/boards/cm_bf537e.c
arch/blackfin/mach-bf537/boards/cm_bf537u.c
arch/blackfin/mach-bf537/boards/dnp5370.c
arch/blackfin/mach-bf537/boards/pnav10.c
arch/blackfin/mach-bf537/boards/stamp.c
arch/blackfin/mach-bf537/boards/tcm_bf537.c
arch/cris/include/asm/socket.h
arch/frv/include/asm/socket.h
arch/h8300/include/asm/socket.h
arch/ia64/hp/sim/simeth.c
arch/ia64/include/asm/socket.h
arch/m32r/include/asm/socket.h
arch/m68k/include/asm/socket.h
arch/mips/include/asm/socket.h
arch/mips/pci/pci-bcm47xx.c
arch/mn10300/include/asm/socket.h
arch/parisc/include/asm/socket.h
arch/powerpc/include/asm/socket.h
arch/s390/include/asm/qeth.h
arch/s390/include/asm/socket.h
arch/sparc/include/asm/socket.h
arch/um/drivers/net_kern.c
arch/xtensa/include/asm/socket.h
crypto/crypto_user.c
drivers/atm/lanai.c
drivers/bcma/bcma_private.h
drivers/bcma/driver_pci.c
drivers/bcma/driver_pci_host.c
drivers/bcma/host_pci.c
drivers/bcma/main.c
drivers/bcma/scan.c
drivers/bcma/sprom.c
drivers/infiniband/core/addr.c
drivers/infiniband/core/netlink.c
drivers/infiniband/hw/cxgb4/cm.c
drivers/infiniband/hw/nes/nes_cm.c
drivers/isdn/act2000/act2000.h
drivers/isdn/act2000/act2000_isa.c
drivers/isdn/act2000/act2000_isa.h
drivers/isdn/act2000/capi.c
drivers/isdn/act2000/capi.h
drivers/isdn/act2000/module.c
drivers/isdn/capi/capi.c
drivers/isdn/capi/capidrv.c
drivers/isdn/capi/capidrv.h
drivers/isdn/capi/capilib.c
drivers/isdn/capi/capiutil.c
drivers/isdn/capi/kcapi.c
drivers/isdn/capi/kcapi.h
drivers/isdn/capi/kcapi_proc.c
drivers/isdn/divert/divert_init.c
drivers/isdn/divert/divert_procfs.c
drivers/isdn/divert/isdn_divert.c
drivers/isdn/divert/isdn_divert.h
drivers/isdn/gigaset/asyncdata.c
drivers/isdn/gigaset/bas-gigaset.c
drivers/isdn/gigaset/capi.c
drivers/isdn/gigaset/common.c
drivers/isdn/gigaset/ev-layer.c
drivers/isdn/gigaset/gigaset.h
drivers/isdn/gigaset/i4l.c
drivers/isdn/gigaset/interface.c
drivers/isdn/gigaset/isocdata.c
drivers/isdn/gigaset/proc.c
drivers/isdn/gigaset/ser-gigaset.c
drivers/isdn/gigaset/usb-gigaset.c
drivers/isdn/hardware/avm/avm_cs.c
drivers/isdn/hardware/avm/avmcard.h
drivers/isdn/hardware/avm/b1.c
drivers/isdn/hardware/avm/b1dma.c
drivers/isdn/hardware/avm/b1isa.c
drivers/isdn/hardware/avm/b1pci.c
drivers/isdn/hardware/avm/b1pcmcia.c
drivers/isdn/hardware/avm/c4.c
drivers/isdn/hardware/avm/t1isa.c
drivers/isdn/hardware/avm/t1pci.c
drivers/isdn/hardware/eicon/capi20.h
drivers/isdn/hardware/eicon/capidtmf.c
drivers/isdn/hardware/eicon/capidtmf.h
drivers/isdn/hardware/eicon/capifunc.c
drivers/isdn/hardware/eicon/capifunc.h
drivers/isdn/hardware/eicon/capimain.c
drivers/isdn/hardware/eicon/cardtype.h
drivers/isdn/hardware/eicon/cp_vers.h
drivers/isdn/hardware/eicon/dadapter.c
drivers/isdn/hardware/eicon/dadapter.h
drivers/isdn/hardware/eicon/debug.c
drivers/isdn/hardware/eicon/debug_if.h
drivers/isdn/hardware/eicon/debuglib.c
drivers/isdn/hardware/eicon/debuglib.h
drivers/isdn/hardware/eicon/dfifo.h
drivers/isdn/hardware/eicon/di.c
drivers/isdn/hardware/eicon/di.h
drivers/isdn/hardware/eicon/di_dbg.h
drivers/isdn/hardware/eicon/di_defs.h
drivers/isdn/hardware/eicon/did_vers.h
drivers/isdn/hardware/eicon/diddfunc.c
drivers/isdn/hardware/eicon/diva.c
drivers/isdn/hardware/eicon/diva_didd.c
drivers/isdn/hardware/eicon/diva_dma.c
drivers/isdn/hardware/eicon/diva_dma.h
drivers/isdn/hardware/eicon/diva_pci.h
drivers/isdn/hardware/eicon/divacapi.h
drivers/isdn/hardware/eicon/divamnt.c
drivers/isdn/hardware/eicon/divasfunc.c
drivers/isdn/hardware/eicon/divasi.c
drivers/isdn/hardware/eicon/divasmain.c
drivers/isdn/hardware/eicon/divasproc.c
drivers/isdn/hardware/eicon/divasync.h
drivers/isdn/hardware/eicon/dqueue.c
drivers/isdn/hardware/eicon/dqueue.h
drivers/isdn/hardware/eicon/dsp_defs.h
drivers/isdn/hardware/eicon/dsp_tst.h
drivers/isdn/hardware/eicon/dspdids.h
drivers/isdn/hardware/eicon/dsrv4bri.h
drivers/isdn/hardware/eicon/dsrv_bri.h
drivers/isdn/hardware/eicon/dsrv_pri.h
drivers/isdn/hardware/eicon/entity.h
drivers/isdn/hardware/eicon/helpers.h
drivers/isdn/hardware/eicon/idifunc.c
drivers/isdn/hardware/eicon/io.c
drivers/isdn/hardware/eicon/io.h
drivers/isdn/hardware/eicon/istream.c
drivers/isdn/hardware/eicon/kst_ifc.h
drivers/isdn/hardware/eicon/maintidi.c
drivers/isdn/hardware/eicon/maintidi.h
drivers/isdn/hardware/eicon/man_defs.h
drivers/isdn/hardware/eicon/mdm_msg.h
drivers/isdn/hardware/eicon/message.c
drivers/isdn/hardware/eicon/mi_pc.h
drivers/isdn/hardware/eicon/mntfunc.c
drivers/isdn/hardware/eicon/os_4bri.c
drivers/isdn/hardware/eicon/os_4bri.h
drivers/isdn/hardware/eicon/os_bri.c
drivers/isdn/hardware/eicon/os_bri.h
drivers/isdn/hardware/eicon/os_capi.h
drivers/isdn/hardware/eicon/os_pri.c
drivers/isdn/hardware/eicon/os_pri.h
drivers/isdn/hardware/eicon/pc.h
drivers/isdn/hardware/eicon/pc_init.h
drivers/isdn/hardware/eicon/pc_maint.h
drivers/isdn/hardware/eicon/pkmaint.h
drivers/isdn/hardware/eicon/platform.h
drivers/isdn/hardware/eicon/pr_pc.h
drivers/isdn/hardware/eicon/s_4bri.c
drivers/isdn/hardware/eicon/s_bri.c
drivers/isdn/hardware/eicon/s_pri.c
drivers/isdn/hardware/eicon/sdp_hdr.h
drivers/isdn/hardware/eicon/um_idi.c
drivers/isdn/hardware/eicon/um_idi.h
drivers/isdn/hardware/eicon/xdi_adapter.h
drivers/isdn/hardware/eicon/xdi_msg.h
drivers/isdn/hardware/eicon/xdi_vers.h
drivers/isdn/hardware/mISDN/avmfritz.c
drivers/isdn/hardware/mISDN/hfc_multi.h
drivers/isdn/hardware/mISDN/hfc_multi_8xx.h
drivers/isdn/hardware/mISDN/hfc_pci.h
drivers/isdn/hardware/mISDN/hfcmulti.c
drivers/isdn/hardware/mISDN/hfcpci.c
drivers/isdn/hardware/mISDN/hfcsusb.c
drivers/isdn/hardware/mISDN/hfcsusb.h
drivers/isdn/hardware/mISDN/iohelper.h
drivers/isdn/hardware/mISDN/isar.h
drivers/isdn/hardware/mISDN/mISDNinfineon.c
drivers/isdn/hardware/mISDN/mISDNipac.c
drivers/isdn/hardware/mISDN/mISDNisar.c
drivers/isdn/hardware/mISDN/netjet.c
drivers/isdn/hardware/mISDN/netjet.h
drivers/isdn/hardware/mISDN/speedfax.c
drivers/isdn/hardware/mISDN/w6692.c
drivers/isdn/hisax/amd7930_fn.c
drivers/isdn/hisax/arcofi.c
drivers/isdn/hisax/arcofi.h
drivers/isdn/hisax/asuscom.c
drivers/isdn/hisax/avm_a1.c
drivers/isdn/hisax/avm_a1p.c
drivers/isdn/hisax/avm_pci.c
drivers/isdn/hisax/avma1_cs.c
drivers/isdn/hisax/bkm_a4t.c
drivers/isdn/hisax/bkm_a8.c
drivers/isdn/hisax/bkm_ax.h
drivers/isdn/hisax/callc.c
drivers/isdn/hisax/config.c
drivers/isdn/hisax/diva.c
drivers/isdn/hisax/elsa.c
drivers/isdn/hisax/elsa_cs.c
drivers/isdn/hisax/elsa_ser.c
drivers/isdn/hisax/enternow_pci.c
drivers/isdn/hisax/fsm.c
drivers/isdn/hisax/fsm.h
drivers/isdn/hisax/gazel.c
drivers/isdn/hisax/hfc4s8s_l1.c
drivers/isdn/hisax/hfc4s8s_l1.h
drivers/isdn/hisax/hfc_2bds0.c
drivers/isdn/hisax/hfc_2bds0.h
drivers/isdn/hisax/hfc_2bs0.c
drivers/isdn/hisax/hfc_2bs0.h
drivers/isdn/hisax/hfc_pci.c
drivers/isdn/hisax/hfc_pci.h
drivers/isdn/hisax/hfc_sx.c
drivers/isdn/hisax/hfc_sx.h
drivers/isdn/hisax/hfc_usb.c
drivers/isdn/hisax/hfc_usb.h
drivers/isdn/hisax/hfcscard.c
drivers/isdn/hisax/hisax.h
drivers/isdn/hisax/hisax_cfg.h
drivers/isdn/hisax/hisax_debug.h
drivers/isdn/hisax/hisax_fcpcipnp.c
drivers/isdn/hisax/hisax_fcpcipnp.h
drivers/isdn/hisax/hisax_if.h
drivers/isdn/hisax/hisax_isac.c
drivers/isdn/hisax/hscx.c
drivers/isdn/hisax/hscx.h
drivers/isdn/hisax/hscx_irq.c
drivers/isdn/hisax/icc.c
drivers/isdn/hisax/icc.h
drivers/isdn/hisax/ipac.h
drivers/isdn/hisax/ipacx.c
drivers/isdn/hisax/isac.c
drivers/isdn/hisax/isac.h
drivers/isdn/hisax/isar.c
drivers/isdn/hisax/isar.h
drivers/isdn/hisax/isdnl1.c
drivers/isdn/hisax/isdnl2.c
drivers/isdn/hisax/isdnl2.h
drivers/isdn/hisax/isdnl3.c
drivers/isdn/hisax/isdnl3.h
drivers/isdn/hisax/isurf.c
drivers/isdn/hisax/ix1_micro.c
drivers/isdn/hisax/jade.c
drivers/isdn/hisax/jade.h
drivers/isdn/hisax/jade_irq.c
drivers/isdn/hisax/l3_1tr6.c
drivers/isdn/hisax/l3dss1.c
drivers/isdn/hisax/l3dss1.h
drivers/isdn/hisax/l3ni1.c
drivers/isdn/hisax/l3ni1.h
drivers/isdn/hisax/lmgr.c
drivers/isdn/hisax/mic.c
drivers/isdn/hisax/netjet.c
drivers/isdn/hisax/netjet.h
drivers/isdn/hisax/niccy.c
drivers/isdn/hisax/nj_s.c
drivers/isdn/hisax/nj_u.c
drivers/isdn/hisax/q931.c
drivers/isdn/hisax/s0box.c
drivers/isdn/hisax/saphir.c
drivers/isdn/hisax/sedlbauer.c
drivers/isdn/hisax/sedlbauer_cs.c
drivers/isdn/hisax/sportster.c
drivers/isdn/hisax/st5481.h
drivers/isdn/hisax/st5481_b.c
drivers/isdn/hisax/st5481_d.c
drivers/isdn/hisax/st5481_init.c
drivers/isdn/hisax/st5481_usb.c
drivers/isdn/hisax/tei.c
drivers/isdn/hisax/teleint.c
drivers/isdn/hisax/teles0.c
drivers/isdn/hisax/teles3.c
drivers/isdn/hisax/teles_cs.c
drivers/isdn/hisax/telespci.c
drivers/isdn/hisax/w6692.c
drivers/isdn/hisax/w6692.h
drivers/isdn/hysdn/boardergo.c
drivers/isdn/hysdn/boardergo.h
drivers/isdn/hysdn/hycapi.c
drivers/isdn/hysdn/hysdn_boot.c
drivers/isdn/hysdn/hysdn_defs.h
drivers/isdn/hysdn/hysdn_init.c
drivers/isdn/hysdn/hysdn_net.c
drivers/isdn/hysdn/hysdn_pof.h
drivers/isdn/hysdn/hysdn_procconf.c
drivers/isdn/hysdn/hysdn_proclog.c
drivers/isdn/hysdn/hysdn_sched.c
drivers/isdn/hysdn/ince1pc.h
drivers/isdn/i4l/isdn_audio.c
drivers/isdn/i4l/isdn_bsdcomp.c
drivers/isdn/i4l/isdn_common.c
drivers/isdn/i4l/isdn_common.h
drivers/isdn/i4l/isdn_concap.c
drivers/isdn/i4l/isdn_concap.h
drivers/isdn/i4l/isdn_net.c
drivers/isdn/i4l/isdn_net.h
drivers/isdn/i4l/isdn_ppp.c
drivers/isdn/i4l/isdn_ppp.h
drivers/isdn/i4l/isdn_tty.c
drivers/isdn/i4l/isdn_tty.h
drivers/isdn/i4l/isdn_ttyfax.c
drivers/isdn/i4l/isdn_ttyfax.h
drivers/isdn/i4l/isdn_v110.c
drivers/isdn/i4l/isdn_v110.h
drivers/isdn/i4l/isdn_x25iface.c
drivers/isdn/i4l/isdn_x25iface.h
drivers/isdn/i4l/isdnhdlc.c
drivers/isdn/icn/icn.c
drivers/isdn/icn/icn.h
drivers/isdn/isdnloop/isdnloop.c
drivers/isdn/isdnloop/isdnloop.h
drivers/isdn/mISDN/clock.c
drivers/isdn/mISDN/core.c
drivers/isdn/mISDN/core.h
drivers/isdn/mISDN/dsp.h
drivers/isdn/mISDN/dsp_audio.c
drivers/isdn/mISDN/dsp_biquad.h
drivers/isdn/mISDN/dsp_blowfish.c
drivers/isdn/mISDN/dsp_cmx.c
drivers/isdn/mISDN/dsp_core.c
drivers/isdn/mISDN/dsp_dtmf.c
drivers/isdn/mISDN/dsp_ecdis.h
drivers/isdn/mISDN/dsp_hwec.c
drivers/isdn/mISDN/dsp_hwec.h
drivers/isdn/mISDN/dsp_pipeline.c
drivers/isdn/mISDN/dsp_tones.c
drivers/isdn/mISDN/fsm.c
drivers/isdn/mISDN/hwchannel.c
drivers/isdn/mISDN/l1oip.h
drivers/isdn/mISDN/l1oip_codec.c
drivers/isdn/mISDN/l1oip_core.c
drivers/isdn/mISDN/layer1.c
drivers/isdn/mISDN/layer1.h
drivers/isdn/mISDN/layer2.c
drivers/isdn/mISDN/layer2.h
drivers/isdn/mISDN/socket.c
drivers/isdn/mISDN/stack.c
drivers/isdn/mISDN/tei.c
drivers/isdn/mISDN/timerdev.c
drivers/isdn/pcbit/callbacks.c
drivers/isdn/pcbit/callbacks.h
drivers/isdn/pcbit/capi.c
drivers/isdn/pcbit/capi.h
drivers/isdn/pcbit/drv.c
drivers/isdn/pcbit/edss1.c
drivers/isdn/pcbit/edss1.h
drivers/isdn/pcbit/layer2.c
drivers/isdn/pcbit/layer2.h
drivers/isdn/pcbit/module.c
drivers/isdn/pcbit/pcbit.h
drivers/isdn/sc/card.h
drivers/isdn/sc/command.c
drivers/isdn/sc/event.c
drivers/isdn/sc/hardware.h
drivers/isdn/sc/init.c
drivers/isdn/sc/interrupt.c
drivers/isdn/sc/ioctl.c
drivers/isdn/sc/message.c
drivers/isdn/sc/message.h
drivers/isdn/sc/packet.c
drivers/isdn/sc/scioc.h
drivers/isdn/sc/shmem.c
drivers/isdn/sc/timer.c
drivers/net/bonding/bond_3ad.c
drivers/net/bonding/bond_alb.c
drivers/net/caif/caif_hsi.c
drivers/net/can/Kconfig
drivers/net/can/bfin_can.c
drivers/net/can/cc770/cc770.c
drivers/net/can/dev.c
drivers/net/can/flexcan.c
drivers/net/can/mcp251x.c
drivers/net/can/mscan/mscan.c
drivers/net/can/pch_can.c
drivers/net/can/sja1000/Kconfig
drivers/net/can/sja1000/Makefile
drivers/net/can/sja1000/peak_pci.c
drivers/net/can/sja1000/peak_pcmcia.c [new file with mode: 0644]
drivers/net/can/sja1000/plx_pci.c
drivers/net/can/sja1000/sja1000.c
drivers/net/can/slcan.c
drivers/net/can/ti_hecc.c
drivers/net/can/usb/Kconfig
drivers/net/can/usb/Makefile
drivers/net/can/usb/ems_usb.c
drivers/net/can/usb/esd_usb2.c
drivers/net/can/usb/peak_usb/Makefile [new file with mode: 0644]
drivers/net/can/usb/peak_usb/pcan_usb.c [new file with mode: 0644]
drivers/net/can/usb/peak_usb/pcan_usb_core.c [new file with mode: 0644]
drivers/net/can/usb/peak_usb/pcan_usb_core.h [new file with mode: 0644]
drivers/net/can/usb/peak_usb/pcan_usb_pro.c [new file with mode: 0644]
drivers/net/can/usb/peak_usb/pcan_usb_pro.h [new file with mode: 0644]
drivers/net/dummy.c
drivers/net/ethernet/3com/3c501.c
drivers/net/ethernet/3com/3c509.c
drivers/net/ethernet/3com/3c515.c
drivers/net/ethernet/3com/3c574_cs.c
drivers/net/ethernet/3com/3c589_cs.c
drivers/net/ethernet/3com/3c59x.c
drivers/net/ethernet/3com/Kconfig
drivers/net/ethernet/3com/typhoon.c
drivers/net/ethernet/8390/ax88796.c
drivers/net/ethernet/8390/axnet_cs.c
drivers/net/ethernet/8390/lib8390.c
drivers/net/ethernet/8390/pcnet_cs.c
drivers/net/ethernet/adaptec/starfire.c
drivers/net/ethernet/adi/bfin_mac.c
drivers/net/ethernet/adi/bfin_mac.h
drivers/net/ethernet/aeroflex/greth.c
drivers/net/ethernet/alteon/acenic.c
drivers/net/ethernet/amd/7990.c
drivers/net/ethernet/amd/Kconfig
drivers/net/ethernet/amd/a2065.c
drivers/net/ethernet/amd/am79c961a.c
drivers/net/ethernet/amd/am79c961a.h
drivers/net/ethernet/amd/amd8111e.c
drivers/net/ethernet/amd/ariadne.c
drivers/net/ethernet/amd/atarilance.c
drivers/net/ethernet/amd/au1000_eth.c
drivers/net/ethernet/amd/declance.c
drivers/net/ethernet/amd/depca.c
drivers/net/ethernet/amd/hplance.c
drivers/net/ethernet/amd/ni65.c
drivers/net/ethernet/amd/nmclan_cs.c
drivers/net/ethernet/amd/pcnet32.c
drivers/net/ethernet/amd/sun3lance.c
drivers/net/ethernet/amd/sunlance.c
drivers/net/ethernet/apple/bmac.c
drivers/net/ethernet/apple/mace.c
drivers/net/ethernet/apple/macmace.c
drivers/net/ethernet/atheros/atl1c/atl1c_hw.c
drivers/net/ethernet/atheros/atl1c/atl1c_main.c
drivers/net/ethernet/atheros/atl1e/atl1e_main.c
drivers/net/ethernet/atheros/atlx/atl1.c
drivers/net/ethernet/atheros/atlx/atlx.c
drivers/net/ethernet/broadcom/b44.c
drivers/net/ethernet/broadcom/bnx2.c
drivers/net/ethernet/broadcom/bnx2.h
drivers/net/ethernet/broadcom/bnx2x/bnx2x.h
drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c
drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.h
drivers/net/ethernet/broadcom/bnx2x/bnx2x_dcb.c
drivers/net/ethernet/broadcom/bnx2x/bnx2x_dcb.h
drivers/net/ethernet/broadcom/bnx2x/bnx2x_dump.h
drivers/net/ethernet/broadcom/bnx2x/bnx2x_ethtool.c
drivers/net/ethernet/broadcom/bnx2x/bnx2x_fw_defs.h
drivers/net/ethernet/broadcom/bnx2x/bnx2x_fw_file_hdr.h
drivers/net/ethernet/broadcom/bnx2x/bnx2x_hsi.h
drivers/net/ethernet/broadcom/bnx2x/bnx2x_init.h
drivers/net/ethernet/broadcom/bnx2x/bnx2x_init_ops.h
drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.c
drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.h
drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c
drivers/net/ethernet/broadcom/bnx2x/bnx2x_reg.h
drivers/net/ethernet/broadcom/bnx2x/bnx2x_sp.c
drivers/net/ethernet/broadcom/bnx2x/bnx2x_sp.h
drivers/net/ethernet/broadcom/bnx2x/bnx2x_stats.c
drivers/net/ethernet/broadcom/bnx2x/bnx2x_stats.h
drivers/net/ethernet/broadcom/cnic.c
drivers/net/ethernet/broadcom/cnic_defs.h
drivers/net/ethernet/broadcom/cnic_if.h
drivers/net/ethernet/broadcom/sb1250-mac.c
drivers/net/ethernet/broadcom/tg3.c
drivers/net/ethernet/broadcom/tg3.h
drivers/net/ethernet/brocade/bna/bfa_cee.c
drivers/net/ethernet/brocade/bna/bfa_defs.h
drivers/net/ethernet/brocade/bna/bfa_ioc.c
drivers/net/ethernet/brocade/bna/bnad.c
drivers/net/ethernet/brocade/bna/bnad_debugfs.c
drivers/net/ethernet/brocade/bna/bnad_ethtool.c
drivers/net/ethernet/cadence/at91_ether.c
drivers/net/ethernet/cadence/macb.c
drivers/net/ethernet/calxeda/xgmac.c
drivers/net/ethernet/chelsio/cxgb3/cxgb3_main.c
drivers/net/ethernet/chelsio/cxgb3/version.h
drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c
drivers/net/ethernet/chelsio/cxgb4vf/cxgb4vf_main.c
drivers/net/ethernet/cirrus/cs89x0.c
drivers/net/ethernet/cirrus/ep93xx_eth.c
drivers/net/ethernet/cirrus/mac89x0.c
drivers/net/ethernet/cisco/enic/enic.h
drivers/net/ethernet/cisco/enic/enic_main.c
drivers/net/ethernet/cisco/enic/enic_pp.c
drivers/net/ethernet/cisco/enic/enic_res.c
drivers/net/ethernet/cisco/enic/vnic_dev.c
drivers/net/ethernet/cisco/enic/vnic_dev.h
drivers/net/ethernet/cisco/enic/vnic_devcmd.h
drivers/net/ethernet/cisco/enic/vnic_rq.c
drivers/net/ethernet/cisco/enic/vnic_wq.c
drivers/net/ethernet/davicom/dm9000.c
drivers/net/ethernet/dec/ewrk3.c
drivers/net/ethernet/dec/tulip/21142.c
drivers/net/ethernet/dec/tulip/de2104x.c
drivers/net/ethernet/dec/tulip/de4x5.c
drivers/net/ethernet/dec/tulip/dmfe.c
drivers/net/ethernet/dec/tulip/eeprom.c
drivers/net/ethernet/dec/tulip/interrupt.c
drivers/net/ethernet/dec/tulip/media.c
drivers/net/ethernet/dec/tulip/pnic.c
drivers/net/ethernet/dec/tulip/pnic2.c
drivers/net/ethernet/dec/tulip/timer.c
drivers/net/ethernet/dec/tulip/tulip.h
drivers/net/ethernet/dec/tulip/tulip_core.c
drivers/net/ethernet/dec/tulip/uli526x.c
drivers/net/ethernet/dec/tulip/winbond-840.c
drivers/net/ethernet/dec/tulip/xircom_cb.c
drivers/net/ethernet/dlink/de600.c
drivers/net/ethernet/dlink/de620.c
drivers/net/ethernet/dlink/sundance.c
drivers/net/ethernet/dnet.c
drivers/net/ethernet/emulex/benet/be.h
drivers/net/ethernet/emulex/benet/be_cmds.c
drivers/net/ethernet/emulex/benet/be_cmds.h
drivers/net/ethernet/emulex/benet/be_ethtool.c
drivers/net/ethernet/emulex/benet/be_main.c
drivers/net/ethernet/ethoc.c
drivers/net/ethernet/faraday/ftgmac100.c
drivers/net/ethernet/faraday/ftmac100.c
drivers/net/ethernet/fealnx.c
drivers/net/ethernet/freescale/fec.c
drivers/net/ethernet/freescale/fec_mpc52xx.c
drivers/net/ethernet/freescale/fec_mpc52xx.h
drivers/net/ethernet/freescale/fs_enet/fs_enet-main.c
drivers/net/ethernet/freescale/gianfar.c
drivers/net/ethernet/freescale/gianfar.h
drivers/net/ethernet/freescale/gianfar_ethtool.c
drivers/net/ethernet/freescale/gianfar_sysfs.c
drivers/net/ethernet/freescale/ucc_geth.c
drivers/net/ethernet/fujitsu/at1700.c
drivers/net/ethernet/fujitsu/eth16i.c
drivers/net/ethernet/fujitsu/fmvj18x_cs.c
drivers/net/ethernet/hp/hp100.c
drivers/net/ethernet/i825xx/3c505.c
drivers/net/ethernet/i825xx/3c507.c
drivers/net/ethernet/i825xx/3c523.c
drivers/net/ethernet/i825xx/3c527.c
drivers/net/ethernet/i825xx/82596.c
drivers/net/ethernet/i825xx/eepro.c
drivers/net/ethernet/i825xx/eexpress.c
drivers/net/ethernet/i825xx/ether1.c
drivers/net/ethernet/i825xx/lp486e.c
drivers/net/ethernet/i825xx/ni52.c
drivers/net/ethernet/i825xx/sun3_82586.c
drivers/net/ethernet/i825xx/znet.c
drivers/net/ethernet/ibm/ehea/ehea.h
drivers/net/ethernet/ibm/ehea/ehea_ethtool.c
drivers/net/ethernet/ibm/ehea/ehea_hw.h
drivers/net/ethernet/ibm/ehea/ehea_main.c
drivers/net/ethernet/ibm/ehea/ehea_phyp.c
drivers/net/ethernet/ibm/ehea/ehea_phyp.h
drivers/net/ethernet/ibm/ehea/ehea_qmr.c
drivers/net/ethernet/ibm/ehea/ehea_qmr.h
drivers/net/ethernet/ibm/emac/core.c
drivers/net/ethernet/ibm/emac/core.h
drivers/net/ethernet/ibm/emac/debug.c
drivers/net/ethernet/ibm/emac/debug.h
drivers/net/ethernet/ibm/emac/emac.h
drivers/net/ethernet/ibm/emac/mal.c
drivers/net/ethernet/ibm/emac/mal.h
drivers/net/ethernet/ibm/emac/phy.c
drivers/net/ethernet/ibm/emac/phy.h
drivers/net/ethernet/ibm/emac/rgmii.c
drivers/net/ethernet/ibm/emac/rgmii.h
drivers/net/ethernet/ibm/emac/tah.c
drivers/net/ethernet/ibm/emac/tah.h
drivers/net/ethernet/ibm/emac/zmii.c
drivers/net/ethernet/ibm/emac/zmii.h
drivers/net/ethernet/ibm/iseries_veth.c
drivers/net/ethernet/icplus/ipg.c
drivers/net/ethernet/intel/e100.c
drivers/net/ethernet/intel/e1000/e1000.h
drivers/net/ethernet/intel/e1000/e1000_hw.c
drivers/net/ethernet/intel/e1000/e1000_hw.h
drivers/net/ethernet/intel/e1000/e1000_main.c
drivers/net/ethernet/intel/e1000e/80003es2lan.c
drivers/net/ethernet/intel/e1000e/82571.c
drivers/net/ethernet/intel/e1000e/Makefile
drivers/net/ethernet/intel/e1000e/defines.h
drivers/net/ethernet/intel/e1000e/e1000.h
drivers/net/ethernet/intel/e1000e/ethtool.c
drivers/net/ethernet/intel/e1000e/hw.h
drivers/net/ethernet/intel/e1000e/ich8lan.c
drivers/net/ethernet/intel/e1000e/lib.c [deleted file]
drivers/net/ethernet/intel/e1000e/mac.c [new file with mode: 0644]
drivers/net/ethernet/intel/e1000e/manage.c [new file with mode: 0644]
drivers/net/ethernet/intel/e1000e/netdev.c
drivers/net/ethernet/intel/e1000e/nvm.c [new file with mode: 0644]
drivers/net/ethernet/intel/e1000e/param.c
drivers/net/ethernet/intel/e1000e/phy.c
drivers/net/ethernet/intel/igb/igb_main.c
drivers/net/ethernet/intel/igbvf/ethtool.c
drivers/net/ethernet/intel/igbvf/igbvf.h
drivers/net/ethernet/intel/igbvf/netdev.c
drivers/net/ethernet/intel/ixgb/ixgb_ee.c
drivers/net/ethernet/intel/ixgb/ixgb_main.c
drivers/net/ethernet/intel/ixgbe/ixgbe.h
drivers/net/ethernet/intel/ixgbe/ixgbe_82598.c
drivers/net/ethernet/intel/ixgbe/ixgbe_common.c
drivers/net/ethernet/intel/ixgbe/ixgbe_dcb_nl.c
drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c
drivers/net/ethernet/intel/ixgbe/ixgbe_fcoe.c
drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
drivers/net/ethernet/intel/ixgbe/ixgbe_phy.c
drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c
drivers/net/ethernet/intel/ixgbe/ixgbe_type.h
drivers/net/ethernet/intel/ixgbe/ixgbe_x540.c
drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c
drivers/net/ethernet/jme.c
drivers/net/ethernet/korina.c
drivers/net/ethernet/lantiq_etop.c
drivers/net/ethernet/marvell/mv643xx_eth.c
drivers/net/ethernet/marvell/pxa168_eth.c
drivers/net/ethernet/marvell/skge.c
drivers/net/ethernet/marvell/sky2.c
drivers/net/ethernet/mellanox/mlx4/cmd.c
drivers/net/ethernet/mellanox/mlx4/en_netdev.c
drivers/net/ethernet/mellanox/mlx4/en_rx.c
drivers/net/ethernet/mellanox/mlx4/en_tx.c
drivers/net/ethernet/mellanox/mlx4/main.c
drivers/net/ethernet/mellanox/mlx4/mcg.c
drivers/net/ethernet/mellanox/mlx4/mlx4.h
drivers/net/ethernet/mellanox/mlx4/port.c
drivers/net/ethernet/micrel/ks8695net.c
drivers/net/ethernet/micrel/ks8842.c
drivers/net/ethernet/micrel/ks8851.c
drivers/net/ethernet/micrel/ks8851.h
drivers/net/ethernet/micrel/ks8851_mll.c
drivers/net/ethernet/micrel/ksz884x.c
drivers/net/ethernet/microchip/enc28j60.c
drivers/net/ethernet/mipsnet.c
drivers/net/ethernet/myricom/myri10ge/myri10ge.c
drivers/net/ethernet/natsemi/ibmlana.c
drivers/net/ethernet/natsemi/macsonic.c
drivers/net/ethernet/natsemi/natsemi.c
drivers/net/ethernet/natsemi/sonic.c
drivers/net/ethernet/neterion/s2io.c
drivers/net/ethernet/netx-eth.c
drivers/net/ethernet/nuvoton/w90p910_ether.c
drivers/net/ethernet/nvidia/forcedeth.c
drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_main.c
drivers/net/ethernet/packetengines/hamachi.c
drivers/net/ethernet/packetengines/yellowfin.c
drivers/net/ethernet/pasemi/pasemi_mac.c
drivers/net/ethernet/qlogic/netxen/netxen_nic.h
drivers/net/ethernet/qlogic/netxen/netxen_nic_ctx.c
drivers/net/ethernet/qlogic/netxen/netxen_nic_ethtool.c
drivers/net/ethernet/qlogic/netxen/netxen_nic_hdr.h
drivers/net/ethernet/qlogic/netxen/netxen_nic_hw.c
drivers/net/ethernet/qlogic/netxen/netxen_nic_init.c
drivers/net/ethernet/qlogic/netxen/netxen_nic_main.c
drivers/net/ethernet/qlogic/qla3xxx.c
drivers/net/ethernet/qlogic/qlcnic/qlcnic.h
drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c
drivers/net/ethernet/qlogic/qlcnic/qlcnic_init.c
drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c
drivers/net/ethernet/qlogic/qlge/qlge.h
drivers/net/ethernet/qlogic/qlge/qlge_dbg.c
drivers/net/ethernet/qlogic/qlge/qlge_main.c
drivers/net/ethernet/racal/ni5010.c
drivers/net/ethernet/rdc/r6040.c
drivers/net/ethernet/realtek/8139too.c
drivers/net/ethernet/realtek/Kconfig
drivers/net/ethernet/realtek/atp.c
drivers/net/ethernet/realtek/r8169.c
drivers/net/ethernet/renesas/sh_eth.c
drivers/net/ethernet/renesas/sh_eth.h
drivers/net/ethernet/s6gmac.c
drivers/net/ethernet/seeq/ether3.c
drivers/net/ethernet/seeq/seeq8005.c
drivers/net/ethernet/seeq/sgiseeq.c
drivers/net/ethernet/sfc/Kconfig
drivers/net/ethernet/sfc/Makefile
drivers/net/ethernet/sfc/bitfield.h
drivers/net/ethernet/sfc/efx.c
drivers/net/ethernet/sfc/efx.h
drivers/net/ethernet/sfc/ethtool.c
drivers/net/ethernet/sfc/falcon.c
drivers/net/ethernet/sfc/falcon_boards.c
drivers/net/ethernet/sfc/falcon_xmac.c
drivers/net/ethernet/sfc/filter.c
drivers/net/ethernet/sfc/filter.h
drivers/net/ethernet/sfc/mac.h [deleted file]
drivers/net/ethernet/sfc/mcdi.c
drivers/net/ethernet/sfc/mcdi.h
drivers/net/ethernet/sfc/mcdi_mac.c
drivers/net/ethernet/sfc/mcdi_mon.c [new file with mode: 0644]
drivers/net/ethernet/sfc/mcdi_pcol.h
drivers/net/ethernet/sfc/mcdi_phy.c
drivers/net/ethernet/sfc/mdio_10g.c
drivers/net/ethernet/sfc/mtd.c
drivers/net/ethernet/sfc/net_driver.h
drivers/net/ethernet/sfc/nic.c
drivers/net/ethernet/sfc/nic.h
drivers/net/ethernet/sfc/qt202x_phy.c
drivers/net/ethernet/sfc/regs.h
drivers/net/ethernet/sfc/rx.c
drivers/net/ethernet/sfc/selftest.c
drivers/net/ethernet/sfc/selftest.h
drivers/net/ethernet/sfc/siena.c
drivers/net/ethernet/sfc/siena_sriov.c [new file with mode: 0644]
drivers/net/ethernet/sfc/spi.h
drivers/net/ethernet/sfc/tenxpress.c
drivers/net/ethernet/sfc/tx.c
drivers/net/ethernet/sfc/txc43128_phy.c
drivers/net/ethernet/sfc/vfdi.h [new file with mode: 0644]
drivers/net/ethernet/sis/sis190.c
drivers/net/ethernet/sis/sis900.c
drivers/net/ethernet/smsc/epic100.c
drivers/net/ethernet/smsc/smc911x.c
drivers/net/ethernet/smsc/smc9194.c
drivers/net/ethernet/smsc/smc91c92_cs.c
drivers/net/ethernet/smsc/smc91x.c
drivers/net/ethernet/smsc/smsc911x.c
drivers/net/ethernet/smsc/smsc9420.c
drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
drivers/net/ethernet/stmicro/stmmac/stmmac_pci.c
drivers/net/ethernet/sun/cassini.c
drivers/net/ethernet/sun/niu.c
drivers/net/ethernet/sun/sunbmac.c
drivers/net/ethernet/sun/sungem.c
drivers/net/ethernet/sun/sunhme.c
drivers/net/ethernet/sun/sunqe.c
drivers/net/ethernet/sun/sunvnet.c
drivers/net/ethernet/tehuti/tehuti.c
drivers/net/ethernet/ti/cpmac.c
drivers/net/ethernet/ti/davinci_cpdma.c
drivers/net/ethernet/ti/davinci_emac.c
drivers/net/ethernet/ti/davinci_mdio.c
drivers/net/ethernet/ti/tlan.c
drivers/net/ethernet/tile/tilepro.c
drivers/net/ethernet/toshiba/ps3_gelic_wireless.c
drivers/net/ethernet/toshiba/tc35815.c
drivers/net/ethernet/tundra/tsi108_eth.c
drivers/net/ethernet/via/via-rhine.c
drivers/net/ethernet/via/via-velocity.c
drivers/net/ethernet/xilinx/Kconfig
drivers/net/ethernet/xilinx/Makefile
drivers/net/ethernet/xilinx/ll_temac_main.c
drivers/net/ethernet/xilinx/xilinx_axienet.h [new file with mode: 0644]
drivers/net/ethernet/xilinx/xilinx_axienet_main.c [new file with mode: 0644]
drivers/net/ethernet/xilinx/xilinx_axienet_mdio.c [new file with mode: 0644]
drivers/net/ethernet/xilinx/xilinx_emaclite.c
drivers/net/ethernet/xircom/xirc2ps_cs.c
drivers/net/ethernet/xscale/ixp2000/ixpdev.c
drivers/net/hamradio/baycom_epp.c
drivers/net/hamradio/baycom_par.c
drivers/net/hamradio/yam.c
drivers/net/hippi/rrunner.c
drivers/net/hyperv/netvsc_drv.c
drivers/net/hyperv/rndis_filter.c
drivers/net/ifb.c
drivers/net/irda/donauboe.c
drivers/net/macvlan.c
drivers/net/mdio.c
drivers/net/mii.c
drivers/net/netconsole.c
drivers/net/phy/broadcom.c
drivers/net/plip/plip.c
drivers/net/ppp/ppp_async.c
drivers/net/ppp/ppp_deflate.c
drivers/net/ppp/ppp_generic.c
drivers/net/ppp/ppp_synctty.c
drivers/net/ppp/pppoe.c
drivers/net/ppp/pppox.c
drivers/net/ppp/pptp.c
drivers/net/rionet.c
drivers/net/slip/slip.c
drivers/net/team/team.c
drivers/net/tokenring/3c359.c
drivers/net/tokenring/madgemc.c
drivers/net/tokenring/tms380tr.c
drivers/net/tun.c
drivers/net/usb/Kconfig
drivers/net/usb/Makefile
drivers/net/usb/cdc_ncm.c
drivers/net/usb/kaweth.c
drivers/net/usb/mcs7830.c
drivers/net/usb/pegasus.c
drivers/net/usb/qmi_wwan.c [new file with mode: 0644]
drivers/net/usb/rtl8150.c
drivers/net/usb/smsc75xx.c
drivers/net/usb/smsc95xx.c
drivers/net/usb/usbnet.c
drivers/net/veth.c
drivers/net/virtio_net.c
drivers/net/vmxnet3/vmxnet3_drv.c
drivers/net/wan/c101.c
drivers/net/wan/dscc4.c
drivers/net/wan/hdlc_fr.c
drivers/net/wan/hdlc_raw_eth.c
drivers/net/wan/lmc/lmc_main.c
drivers/net/wan/n2.c
drivers/net/wan/pc300too.c
drivers/net/wan/pci200syn.c
drivers/net/wan/wanxl.c
drivers/net/wan/x25_asy.c
drivers/net/wireless/ath/ath5k/ahb.c
drivers/net/wireless/ath/ath5k/ani.c
drivers/net/wireless/ath/ath5k/ath5k.h
drivers/net/wireless/ath/ath5k/base.c
drivers/net/wireless/ath/ath5k/mac80211-ops.c
drivers/net/wireless/ath/ath5k/reset.c
drivers/net/wireless/ath/ath6kl/Kconfig
drivers/net/wireless/ath/ath6kl/Makefile
drivers/net/wireless/ath/ath6kl/bmi.c
drivers/net/wireless/ath/ath6kl/cfg80211.c
drivers/net/wireless/ath/ath6kl/cfg80211.h
drivers/net/wireless/ath/ath6kl/common.h
drivers/net/wireless/ath/ath6kl/core.c [new file with mode: 0644]
drivers/net/wireless/ath/ath6kl/core.h
drivers/net/wireless/ath/ath6kl/debug.c
drivers/net/wireless/ath/ath6kl/debug.h
drivers/net/wireless/ath/ath6kl/hif.c
drivers/net/wireless/ath/ath6kl/htc.c
drivers/net/wireless/ath/ath6kl/init.c
drivers/net/wireless/ath/ath6kl/main.c
drivers/net/wireless/ath/ath6kl/sdio.c
drivers/net/wireless/ath/ath6kl/testmode.c
drivers/net/wireless/ath/ath6kl/testmode.h
drivers/net/wireless/ath/ath6kl/txrx.c
drivers/net/wireless/ath/ath6kl/usb.c [new file with mode: 0644]
drivers/net/wireless/ath/ath6kl/wmi.c
drivers/net/wireless/ath/ath6kl/wmi.h
drivers/net/wireless/ath/ath9k/Kconfig
drivers/net/wireless/ath/ath9k/Makefile
drivers/net/wireless/ath/ath9k/ani.c
drivers/net/wireless/ath/ath9k/ar9001_initvals.h
drivers/net/wireless/ath/ath9k/ar9002_hw.c
drivers/net/wireless/ath/ath9k/ar9002_initvals.h
drivers/net/wireless/ath/ath9k/ar9003_calib.c
drivers/net/wireless/ath/ath9k/ar9003_eeprom.c
drivers/net/wireless/ath/ath9k/ar9003_hw.c
drivers/net/wireless/ath/ath9k/ar9003_mac.c
drivers/net/wireless/ath/ath9k/ar9003_mac.h
drivers/net/wireless/ath/ath9k/ar9003_mci.c
drivers/net/wireless/ath/ath9k/ar9003_mci.h
drivers/net/wireless/ath/ath9k/ar9003_phy.c
drivers/net/wireless/ath/ath9k/ar9003_phy.h
drivers/net/wireless/ath/ath9k/ar9462_1p0_initvals.h [deleted file]
drivers/net/wireless/ath/ath9k/ar9462_2p0_initvals.h
drivers/net/wireless/ath/ath9k/ath9k.h
drivers/net/wireless/ath/ath9k/btcoex.c
drivers/net/wireless/ath/ath9k/btcoex.h
drivers/net/wireless/ath/ath9k/debug.c
drivers/net/wireless/ath/ath9k/gpio.c
drivers/net/wireless/ath/ath9k/hif_usb.c
drivers/net/wireless/ath/ath9k/hif_usb.h
drivers/net/wireless/ath/ath9k/htc.h
drivers/net/wireless/ath/ath9k/htc_drv_gpio.c
drivers/net/wireless/ath/ath9k/htc_drv_init.c
drivers/net/wireless/ath/ath9k/htc_drv_main.c
drivers/net/wireless/ath/ath9k/htc_hst.c
drivers/net/wireless/ath/ath9k/hw-ops.h
drivers/net/wireless/ath/ath9k/hw.c
drivers/net/wireless/ath/ath9k/hw.h
drivers/net/wireless/ath/ath9k/init.c
drivers/net/wireless/ath/ath9k/main.c
drivers/net/wireless/ath/ath9k/mci.c
drivers/net/wireless/ath/ath9k/mci.h
drivers/net/wireless/ath/ath9k/rc.c
drivers/net/wireless/ath/ath9k/reg.h
drivers/net/wireless/ath/ath9k/xmit.c
drivers/net/wireless/ath/carl9170/carl9170.h
drivers/net/wireless/ath/carl9170/fw.c
drivers/net/wireless/ath/carl9170/mac.c
drivers/net/wireless/ath/carl9170/main.c
drivers/net/wireless/ath/carl9170/phy.c
drivers/net/wireless/ath/carl9170/tx.c
drivers/net/wireless/atmel.c
drivers/net/wireless/b43/b43.h
drivers/net/wireless/b43/main.c
drivers/net/wireless/b43/phy_n.c
drivers/net/wireless/b43/phy_n.h
drivers/net/wireless/b43/tables_nphy.c
drivers/net/wireless/b43/tables_nphy.h
drivers/net/wireless/brcm80211/Kconfig
drivers/net/wireless/brcm80211/Makefile
drivers/net/wireless/brcm80211/brcmfmac/Makefile
drivers/net/wireless/brcm80211/brcmfmac/bcmsdh.c
drivers/net/wireless/brcm80211/brcmfmac/bcmsdh_sdmmc.c
drivers/net/wireless/brcm80211/brcmfmac/dhd.h
drivers/net/wireless/brcm80211/brcmfmac/dhd_bus.h
drivers/net/wireless/brcm80211/brcmfmac/dhd_cdc.c
drivers/net/wireless/brcm80211/brcmfmac/dhd_common.c
drivers/net/wireless/brcm80211/brcmfmac/dhd_dbg.h
drivers/net/wireless/brcm80211/brcmfmac/dhd_linux.c
drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c
drivers/net/wireless/brcm80211/brcmfmac/sdio_chip.c
drivers/net/wireless/brcm80211/brcmfmac/usb.c [new file with mode: 0644]
drivers/net/wireless/brcm80211/brcmfmac/usb.h [new file with mode: 0644]
drivers/net/wireless/brcm80211/brcmfmac/usb_rdl.h [new file with mode: 0644]
drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c
drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.h
drivers/net/wireless/brcm80211/brcmsmac/aiutils.c
drivers/net/wireless/brcm80211/brcmsmac/ampdu.c
drivers/net/wireless/brcm80211/brcmsmac/dma.c
drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c
drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.h
drivers/net/wireless/brcm80211/brcmsmac/main.c
drivers/net/wireless/brcm80211/brcmsmac/main.h
drivers/net/wireless/brcm80211/brcmsmac/phy/phy_n.c
drivers/net/wireless/brcm80211/brcmsmac/srom.c
drivers/net/wireless/brcm80211/brcmutil/utils.c
drivers/net/wireless/brcm80211/include/brcmu_utils.h
drivers/net/wireless/hostap/hostap_hw.c
drivers/net/wireless/ipw2x00/ipw2100.c
drivers/net/wireless/ipw2x00/libipw_module.c
drivers/net/wireless/ipw2x00/libipw_rx.c
drivers/net/wireless/iwlegacy/3945-debug.c
drivers/net/wireless/iwlegacy/3945-mac.c
drivers/net/wireless/iwlegacy/3945-rs.c
drivers/net/wireless/iwlegacy/3945.c
drivers/net/wireless/iwlegacy/3945.h
drivers/net/wireless/iwlegacy/4965-calib.c
drivers/net/wireless/iwlegacy/4965-debug.c
drivers/net/wireless/iwlegacy/4965-mac.c
drivers/net/wireless/iwlegacy/4965-rs.c
drivers/net/wireless/iwlegacy/4965.c
drivers/net/wireless/iwlegacy/4965.h
drivers/net/wireless/iwlegacy/Kconfig
drivers/net/wireless/iwlegacy/common.c
drivers/net/wireless/iwlegacy/common.h
drivers/net/wireless/iwlegacy/debug.c
drivers/net/wireless/iwlwifi/Makefile
drivers/net/wireless/iwlwifi/iwl-1000.c
drivers/net/wireless/iwlwifi/iwl-2000.c
drivers/net/wireless/iwlwifi/iwl-5000.c
drivers/net/wireless/iwlwifi/iwl-6000.c
drivers/net/wireless/iwlwifi/iwl-agn-calib.c
drivers/net/wireless/iwlwifi/iwl-agn-calib.h
drivers/net/wireless/iwlwifi/iwl-agn-hw.h
drivers/net/wireless/iwlwifi/iwl-agn-lib.c
drivers/net/wireless/iwlwifi/iwl-agn-rs.c
drivers/net/wireless/iwlwifi/iwl-agn-rs.h
drivers/net/wireless/iwlwifi/iwl-agn-rx.c
drivers/net/wireless/iwlwifi/iwl-agn-rxon.c
drivers/net/wireless/iwlwifi/iwl-agn-sta.c
drivers/net/wireless/iwlwifi/iwl-agn-tt.c
drivers/net/wireless/iwlwifi/iwl-agn-tt.h
drivers/net/wireless/iwlwifi/iwl-agn-tx.c
drivers/net/wireless/iwlwifi/iwl-agn.c
drivers/net/wireless/iwlwifi/iwl-agn.h
drivers/net/wireless/iwlwifi/iwl-bus.h [deleted file]
drivers/net/wireless/iwlwifi/iwl-cfg.h
drivers/net/wireless/iwlwifi/iwl-commands.h
drivers/net/wireless/iwlwifi/iwl-core.c
drivers/net/wireless/iwlwifi/iwl-core.h
drivers/net/wireless/iwlwifi/iwl-csr.h
drivers/net/wireless/iwlwifi/iwl-debug.c [new file with mode: 0644]
drivers/net/wireless/iwlwifi/iwl-debug.h
drivers/net/wireless/iwlwifi/iwl-debugfs.c
drivers/net/wireless/iwlwifi/iwl-dev.h
drivers/net/wireless/iwlwifi/iwl-devtrace.c
drivers/net/wireless/iwlwifi/iwl-devtrace.h
drivers/net/wireless/iwlwifi/iwl-drv.c [new file with mode: 0644]
drivers/net/wireless/iwlwifi/iwl-drv.h [new file with mode: 0644]
drivers/net/wireless/iwlwifi/iwl-eeprom.c
drivers/net/wireless/iwlwifi/iwl-eeprom.h
drivers/net/wireless/iwlwifi/iwl-fh.h
drivers/net/wireless/iwlwifi/iwl-io.c
drivers/net/wireless/iwlwifi/iwl-io.h
drivers/net/wireless/iwlwifi/iwl-led.c
drivers/net/wireless/iwlwifi/iwl-led.h
drivers/net/wireless/iwlwifi/iwl-mac80211.c
drivers/net/wireless/iwlwifi/iwl-op-mode.h [new file with mode: 0644]
drivers/net/wireless/iwlwifi/iwl-pci.c
drivers/net/wireless/iwlwifi/iwl-power.c
drivers/net/wireless/iwlwifi/iwl-power.h
drivers/net/wireless/iwlwifi/iwl-prph.h
drivers/net/wireless/iwlwifi/iwl-scan.c
drivers/net/wireless/iwlwifi/iwl-shared.h
drivers/net/wireless/iwlwifi/iwl-testmode.c
drivers/net/wireless/iwlwifi/iwl-testmode.h
drivers/net/wireless/iwlwifi/iwl-trans-pcie-int.h
drivers/net/wireless/iwlwifi/iwl-trans-pcie-rx.c
drivers/net/wireless/iwlwifi/iwl-trans-pcie-tx.c
drivers/net/wireless/iwlwifi/iwl-trans-pcie.c
drivers/net/wireless/iwlwifi/iwl-trans.c
drivers/net/wireless/iwlwifi/iwl-trans.h
drivers/net/wireless/iwlwifi/iwl-ucode.c
drivers/net/wireless/iwlwifi/iwl-ucode.h [new file with mode: 0644]
drivers/net/wireless/iwlwifi/iwl-wifi.h
drivers/net/wireless/iwmc3200wifi/trace.h
drivers/net/wireless/libertas/if_cs.c
drivers/net/wireless/libertas/if_usb.c
drivers/net/wireless/libertas_tf/if_usb.c
drivers/net/wireless/mac80211_hwsim.c
drivers/net/wireless/mwifiex/11n_aggr.c
drivers/net/wireless/mwifiex/cfg80211.c
drivers/net/wireless/mwifiex/cmdevt.c
drivers/net/wireless/mwifiex/decl.h
drivers/net/wireless/mwifiex/fw.h
drivers/net/wireless/mwifiex/init.c
drivers/net/wireless/mwifiex/join.c
drivers/net/wireless/mwifiex/main.c
drivers/net/wireless/mwifiex/main.h
drivers/net/wireless/mwifiex/pcie.c
drivers/net/wireless/mwifiex/scan.c
drivers/net/wireless/mwifiex/sdio.c
drivers/net/wireless/mwifiex/sta_cmd.c
drivers/net/wireless/mwifiex/sta_cmdresp.c
drivers/net/wireless/mwifiex/sta_ioctl.c
drivers/net/wireless/mwifiex/sta_rx.c
drivers/net/wireless/mwifiex/sta_tx.c
drivers/net/wireless/mwifiex/txrx.c
drivers/net/wireless/mwifiex/util.c
drivers/net/wireless/mwifiex/wmm.c
drivers/net/wireless/mwifiex/wmm.h
drivers/net/wireless/mwl8k.c
drivers/net/wireless/orinoco/main.c
drivers/net/wireless/orinoco/orinoco_usb.c
drivers/net/wireless/p54/main.c
drivers/net/wireless/p54/txrx.c
drivers/net/wireless/prism54/islpci_mgt.c
drivers/net/wireless/rt2x00/Kconfig
drivers/net/wireless/rt2x00/rt2800.h
drivers/net/wireless/rt2x00/rt2800lib.c
drivers/net/wireless/rt2x00/rt2800lib.h
drivers/net/wireless/rt2x00/rt2800pci.c
drivers/net/wireless/rt2x00/rt2800usb.c
drivers/net/wireless/rt2x00/rt2x00.h
drivers/net/wireless/rt2x00/rt2x00config.c
drivers/net/wireless/rt2x00/rt2x00dev.c
drivers/net/wireless/rt2x00/rt2x00lib.h
drivers/net/wireless/rt2x00/rt2x00link.c
drivers/net/wireless/rtlwifi/Kconfig
drivers/net/wireless/rtlwifi/base.c
drivers/net/wireless/rtlwifi/base.h
drivers/net/wireless/rtlwifi/cam.c
drivers/net/wireless/rtlwifi/cam.h
drivers/net/wireless/rtlwifi/core.c
drivers/net/wireless/rtlwifi/core.h
drivers/net/wireless/rtlwifi/debug.c
drivers/net/wireless/rtlwifi/debug.h
drivers/net/wireless/rtlwifi/efuse.c
drivers/net/wireless/rtlwifi/efuse.h
drivers/net/wireless/rtlwifi/pci.c
drivers/net/wireless/rtlwifi/pci.h
drivers/net/wireless/rtlwifi/ps.c
drivers/net/wireless/rtlwifi/ps.h
drivers/net/wireless/rtlwifi/rc.c
drivers/net/wireless/rtlwifi/rc.h
drivers/net/wireless/rtlwifi/regd.c
drivers/net/wireless/rtlwifi/regd.h
drivers/net/wireless/rtlwifi/rtl8192c/dm_common.c
drivers/net/wireless/rtlwifi/rtl8192c/dm_common.h
drivers/net/wireless/rtlwifi/rtl8192c/fw_common.c
drivers/net/wireless/rtlwifi/rtl8192c/fw_common.h
drivers/net/wireless/rtlwifi/rtl8192c/main.c
drivers/net/wireless/rtlwifi/rtl8192c/phy_common.c
drivers/net/wireless/rtlwifi/rtl8192c/phy_common.h
drivers/net/wireless/rtlwifi/rtl8192ce/def.h
drivers/net/wireless/rtlwifi/rtl8192ce/dm.c
drivers/net/wireless/rtlwifi/rtl8192ce/dm.h
drivers/net/wireless/rtlwifi/rtl8192ce/hw.c
drivers/net/wireless/rtlwifi/rtl8192ce/hw.h
drivers/net/wireless/rtlwifi/rtl8192ce/led.c
drivers/net/wireless/rtlwifi/rtl8192ce/led.h
drivers/net/wireless/rtlwifi/rtl8192ce/phy.c
drivers/net/wireless/rtlwifi/rtl8192ce/phy.h
drivers/net/wireless/rtlwifi/rtl8192ce/reg.h
drivers/net/wireless/rtlwifi/rtl8192ce/rf.c
drivers/net/wireless/rtlwifi/rtl8192ce/rf.h
drivers/net/wireless/rtlwifi/rtl8192ce/sw.c
drivers/net/wireless/rtlwifi/rtl8192ce/sw.h
drivers/net/wireless/rtlwifi/rtl8192ce/table.c
drivers/net/wireless/rtlwifi/rtl8192ce/table.h
drivers/net/wireless/rtlwifi/rtl8192ce/trx.c
drivers/net/wireless/rtlwifi/rtl8192ce/trx.h
drivers/net/wireless/rtlwifi/rtl8192cu/def.h
drivers/net/wireless/rtlwifi/rtl8192cu/dm.c
drivers/net/wireless/rtlwifi/rtl8192cu/dm.h
drivers/net/wireless/rtlwifi/rtl8192cu/hw.c
drivers/net/wireless/rtlwifi/rtl8192cu/hw.h
drivers/net/wireless/rtlwifi/rtl8192cu/led.c
drivers/net/wireless/rtlwifi/rtl8192cu/led.h
drivers/net/wireless/rtlwifi/rtl8192cu/mac.c
drivers/net/wireless/rtlwifi/rtl8192cu/mac.h
drivers/net/wireless/rtlwifi/rtl8192cu/phy.c
drivers/net/wireless/rtlwifi/rtl8192cu/phy.h
drivers/net/wireless/rtlwifi/rtl8192cu/reg.h
drivers/net/wireless/rtlwifi/rtl8192cu/rf.c
drivers/net/wireless/rtlwifi/rtl8192cu/rf.h
drivers/net/wireless/rtlwifi/rtl8192cu/sw.c
drivers/net/wireless/rtlwifi/rtl8192cu/sw.h
drivers/net/wireless/rtlwifi/rtl8192cu/table.c
drivers/net/wireless/rtlwifi/rtl8192cu/table.h
drivers/net/wireless/rtlwifi/rtl8192cu/trx.c
drivers/net/wireless/rtlwifi/rtl8192cu/trx.h
drivers/net/wireless/rtlwifi/rtl8192de/def.h
drivers/net/wireless/rtlwifi/rtl8192de/dm.c
drivers/net/wireless/rtlwifi/rtl8192de/dm.h
drivers/net/wireless/rtlwifi/rtl8192de/fw.c
drivers/net/wireless/rtlwifi/rtl8192de/fw.h
drivers/net/wireless/rtlwifi/rtl8192de/hw.c
drivers/net/wireless/rtlwifi/rtl8192de/hw.h
drivers/net/wireless/rtlwifi/rtl8192de/led.c
drivers/net/wireless/rtlwifi/rtl8192de/led.h
drivers/net/wireless/rtlwifi/rtl8192de/phy.c
drivers/net/wireless/rtlwifi/rtl8192de/phy.h
drivers/net/wireless/rtlwifi/rtl8192de/reg.h
drivers/net/wireless/rtlwifi/rtl8192de/rf.c
drivers/net/wireless/rtlwifi/rtl8192de/rf.h
drivers/net/wireless/rtlwifi/rtl8192de/sw.c
drivers/net/wireless/rtlwifi/rtl8192de/sw.h
drivers/net/wireless/rtlwifi/rtl8192de/table.c
drivers/net/wireless/rtlwifi/rtl8192de/table.h
drivers/net/wireless/rtlwifi/rtl8192de/trx.c
drivers/net/wireless/rtlwifi/rtl8192de/trx.h
drivers/net/wireless/rtlwifi/rtl8192se/def.h
drivers/net/wireless/rtlwifi/rtl8192se/dm.c
drivers/net/wireless/rtlwifi/rtl8192se/dm.h
drivers/net/wireless/rtlwifi/rtl8192se/fw.c
drivers/net/wireless/rtlwifi/rtl8192se/fw.h
drivers/net/wireless/rtlwifi/rtl8192se/hw.c
drivers/net/wireless/rtlwifi/rtl8192se/hw.h
drivers/net/wireless/rtlwifi/rtl8192se/led.c
drivers/net/wireless/rtlwifi/rtl8192se/led.h
drivers/net/wireless/rtlwifi/rtl8192se/phy.c
drivers/net/wireless/rtlwifi/rtl8192se/phy.h
drivers/net/wireless/rtlwifi/rtl8192se/reg.h
drivers/net/wireless/rtlwifi/rtl8192se/rf.c
drivers/net/wireless/rtlwifi/rtl8192se/rf.h
drivers/net/wireless/rtlwifi/rtl8192se/sw.c
drivers/net/wireless/rtlwifi/rtl8192se/sw.h
drivers/net/wireless/rtlwifi/rtl8192se/table.c
drivers/net/wireless/rtlwifi/rtl8192se/table.h
drivers/net/wireless/rtlwifi/rtl8192se/trx.c
drivers/net/wireless/rtlwifi/rtl8192se/trx.h
drivers/net/wireless/rtlwifi/usb.c
drivers/net/wireless/rtlwifi/usb.h
drivers/net/wireless/rtlwifi/wifi.h
drivers/net/wireless/wl1251/Makefile
drivers/net/wireless/wl1251/boot.c
drivers/net/wireless/wl1251/io.h
drivers/net/wireless/wl1251/main.c
drivers/net/wireless/wl1251/wl1251.h
drivers/net/wireless/wl12xx/Makefile
drivers/net/wireless/wl12xx/acx.c
drivers/net/wireless/wl12xx/acx.h
drivers/net/wireless/wl12xx/boot.c
drivers/net/wireless/wl12xx/boot.h
drivers/net/wireless/wl12xx/cmd.c
drivers/net/wireless/wl12xx/cmd.h
drivers/net/wireless/wl12xx/conf.h
drivers/net/wireless/wl12xx/debug.h
drivers/net/wireless/wl12xx/debugfs.c
drivers/net/wireless/wl12xx/event.c
drivers/net/wireless/wl12xx/event.h
drivers/net/wireless/wl12xx/init.c
drivers/net/wireless/wl12xx/io.c
drivers/net/wireless/wl12xx/io.h
drivers/net/wireless/wl12xx/main.c
drivers/net/wireless/wl12xx/ps.c
drivers/net/wireless/wl12xx/ps.h
drivers/net/wireless/wl12xx/reg.h
drivers/net/wireless/wl12xx/rx.c
drivers/net/wireless/wl12xx/scan.c
drivers/net/wireless/wl12xx/scan.h
drivers/net/wireless/wl12xx/sdio.c
drivers/net/wireless/wl12xx/spi.c
drivers/net/wireless/wl12xx/testmode.c
drivers/net/wireless/wl12xx/tx.c
drivers/net/wireless/wl12xx/tx.h
drivers/net/wireless/wl12xx/wl12xx.h
drivers/net/wireless/wl12xx/wl12xx_80211.h
drivers/net/wireless/zd1211rw/zd_mac.c
drivers/net/xen-netback/netback.c
drivers/net/xen-netfront.c
drivers/nfc/nfcwilink.c
drivers/pci/quirks.c
drivers/s390/net/qeth_core.h
drivers/s390/net/qeth_core_main.c
drivers/s390/net/qeth_core_mpc.h
drivers/s390/net/qeth_l2_main.c
drivers/s390/net/qeth_l3_main.c
drivers/scsi/bnx2fc/bnx2fc_constants.h
drivers/scsi/bnx2fc/bnx2fc_hwi.c
drivers/ssb/driver_chipcommon_pmu.c
drivers/ssb/driver_mipscore.c
drivers/ssb/main.c
drivers/ssb/pci.c
drivers/ssb/scan.c
drivers/ssb/ssb_private.h
drivers/staging/et131x/et131x.c
drivers/staging/ft1000/ft1000-pcmcia/ft1000_hw.c
drivers/staging/wlags49_h2/wl_cs.c
drivers/tty/ipwireless/network.c
drivers/tty/ipwireless/tty.c
fs/compat_ioctl.c
include/asm-generic/socket.h
include/linux/Kbuild
include/linux/bcma/bcma.h
include/linux/bcma/bcma_driver_chipcommon.h
include/linux/bcma/bcma_driver_pci.h
include/linux/bcma/bcma_regs.h
include/linux/can/dev.h
include/linux/dccp.h
include/linux/etherdevice.h
include/linux/ethtool.h
include/linux/if.h
include/linux/if_ppp.h
include/linux/in.h
include/linux/in6.h
include/linux/ipv6.h
include/linux/isdn.h
include/linux/mdio.h
include/linux/mlx4/qp.h
include/linux/net.h
include/linux/netdev_features.h
include/linux/netdevice.h
include/linux/netfilter/nfnetlink_conntrack.h
include/linux/netlink.h
include/linux/nfc.h
include/linux/nl80211.h
include/linux/pci_ids.h
include/linux/pkt_sched.h
include/linux/ppp-comp.h
include/linux/ppp-ioctl.h [new file with mode: 0644]
include/linux/ppp_defs.h
include/linux/sh_eth.h
include/linux/skbuff.h
include/linux/snmp.h
include/linux/ssb/ssb.h
include/linux/ssb/ssb_regs.h
include/linux/tcp.h
include/net/addrconf.h
include/net/arp.h
include/net/caif/caif_hsi.h
include/net/cfg80211.h
include/net/dcbnl.h
include/net/dn.h
include/net/genetlink.h
include/net/inet_sock.h
include/net/iucv/af_iucv.h
include/net/mac80211.h
include/net/ndisc.h
include/net/netlink.h
include/net/nfc/nci.h
include/net/nfc/nci_core.h
include/net/nfc/nfc.h
include/net/sock.h
include/net/tcp.h
include/net/xfrm.h
net/atm/clip.c
net/atm/pppoatm.c
net/batman-adv/Makefile
net/batman-adv/bat_algo.h [new file with mode: 0644]
net/batman-adv/bat_debugfs.c
net/batman-adv/bat_debugfs.h
net/batman-adv/bat_iv_ogm.c
net/batman-adv/bat_ogm.h [deleted file]
net/batman-adv/bat_sysfs.c
net/batman-adv/bat_sysfs.h
net/batman-adv/bitarray.c
net/batman-adv/bitarray.h
net/batman-adv/gateway_client.c
net/batman-adv/gateway_client.h
net/batman-adv/gateway_common.c
net/batman-adv/gateway_common.h
net/batman-adv/hard-interface.c
net/batman-adv/hard-interface.h
net/batman-adv/hash.c
net/batman-adv/hash.h
net/batman-adv/icmp_socket.c
net/batman-adv/icmp_socket.h
net/batman-adv/main.c
net/batman-adv/main.h
net/batman-adv/originator.c
net/batman-adv/originator.h
net/batman-adv/packet.h
net/batman-adv/ring_buffer.c
net/batman-adv/ring_buffer.h
net/batman-adv/routing.c
net/batman-adv/routing.h
net/batman-adv/send.c
net/batman-adv/send.h
net/batman-adv/soft-interface.c
net/batman-adv/soft-interface.h
net/batman-adv/translation-table.c
net/batman-adv/translation-table.h
net/batman-adv/types.h
net/batman-adv/unicast.c
net/batman-adv/unicast.h
net/batman-adv/vis.c
net/batman-adv/vis.h
net/bridge/br_device.c
net/caif/caif_dev.c
net/caif/caif_socket.c
net/caif/chnl_net.c
net/core/datagram.c
net/core/dev.c
net/core/ethtool.c
net/core/neighbour.c
net/core/netpoll.c
net/core/rtnetlink.c
net/core/skbuff.c
net/core/sock.c
net/dccp/ccids/ccid3.c
net/dccp/ipv4.c
net/dccp/ipv6.c
net/dccp/minisocks.c
net/dccp/output.c
net/decnet/dn_neigh.c
net/decnet/dn_route.c
net/ethernet/eth.c
net/ieee802154/6lowpan.c
net/ipv4/af_inet.c
net/ipv4/inet_diag.c
net/ipv4/ip_gre.c
net/ipv4/ip_sockglue.c
net/ipv4/ipip.c
net/ipv4/ping.c
net/ipv4/proc.c
net/ipv4/raw.c
net/ipv4/route.c
net/ipv4/tcp_ipv4.c
net/ipv4/tcp_minisocks.c
net/ipv4/tcp_output.c
net/ipv4/udp.c
net/ipv6/af_inet6.c
net/ipv6/anycast.c
net/ipv6/datagram.c
net/ipv6/icmp.c
net/ipv6/ip6_fib.c
net/ipv6/ip6_output.c
net/ipv6/ipv6_sockglue.c
net/ipv6/ndisc.c
net/ipv6/raw.c
net/ipv6/reassembly.c
net/ipv6/route.c
net/ipv6/sit.c
net/ipv6/tcp_ipv6.c
net/ipv6/udp.c
net/ipv6/xfrm6_output.c
net/irda/irnet/irnet.h
net/iucv/af_iucv.c
net/l2tp/l2tp_eth.c
net/l2tp/l2tp_ppp.c
net/mac80211/Makefile
net/mac80211/cfg.c
net/mac80211/chan.c
net/mac80211/debugfs.c
net/mac80211/debugfs_netdev.c
net/mac80211/debugfs_sta.c
net/mac80211/driver-ops.h
net/mac80211/driver-trace.h
net/mac80211/ibss.c
net/mac80211/ieee80211_i.h
net/mac80211/iface.c
net/mac80211/key.c
net/mac80211/main.c
net/mac80211/mesh.h
net/mac80211/mesh_hwmp.c
net/mac80211/mesh_pathtbl.c
net/mac80211/mesh_plink.c
net/mac80211/mlme.c
net/mac80211/pm.c
net/mac80211/rate.c
net/mac80211/rate.h
net/mac80211/rx.c
net/mac80211/sta_info.c
net/mac80211/sta_info.h
net/mac80211/status.c
net/mac80211/tx.c
net/mac80211/util.c
net/mac80211/work.c
net/netfilter/ipset/ip_set_core.c
net/netfilter/nf_conntrack_netlink.c
net/netfilter/nfnetlink_acct.c
net/netlink/af_netlink.c
net/netlink/genetlink.c
net/nfc/core.c
net/nfc/nci/core.c
net/nfc/nci/data.c
net/nfc/nci/ntf.c
net/nfc/nci/rsp.c
net/nfc/netlink.c
net/nfc/rawsock.c
net/openvswitch/vport-internal_dev.c
net/packet/af_packet.c
net/sched/Kconfig
net/sched/Makefile
net/sched/sch_plug.c [new file with mode: 0644]
net/tipc/bcast.c
net/tipc/bcast.h
net/tipc/bearer.c
net/tipc/config.c
net/tipc/core.c
net/tipc/core.h
net/tipc/discover.c
net/tipc/link.c
net/tipc/log.c
net/tipc/msg.c
net/tipc/msg.h
net/tipc/name_distr.c
net/tipc/name_table.c
net/tipc/name_table.h
net/tipc/net.c
net/tipc/node.c
net/tipc/node.h
net/tipc/port.c
net/tipc/port.h
net/tipc/socket.c
net/tipc/subscr.c
net/unix/af_unix.c
net/unix/diag.c
net/wireless/core.h
net/wireless/mesh.c
net/wireless/mlme.c
net/wireless/nl80211.c
net/wireless/reg.c
net/wireless/scan.c
net/wireless/sme.c
net/xfrm/xfrm_user.c

index b020014..b218e0f 100644 (file)
@@ -65,6 +65,13 @@ Description:
                Defines the penalty which will be applied to an
                originator message's tq-field on every hop.
 
+What:          /sys/class/net/<mesh_iface>/mesh/routing_algo
+Date:          Dec 2011
+Contact:       Marek Lindner <lindner_marek@yahoo.de>
+Description:
+               Defines the routing procotol this mesh instance
+               uses to find the optimal paths through the mesh.
+
 What:           /sys/class/net/<mesh_iface>/mesh/vis_mode
 Date:           May 2010
 Contact:        Marek Lindner <lindner_marek@yahoo.de>
index 2014155..c5ac692 100644 (file)
 !Finclude/net/cfg80211.h cfg80211_pmksa
 !Finclude/net/cfg80211.h cfg80211_send_rx_auth
 !Finclude/net/cfg80211.h cfg80211_send_auth_timeout
-!Finclude/net/cfg80211.h __cfg80211_auth_canceled
 !Finclude/net/cfg80211.h cfg80211_send_rx_assoc
 !Finclude/net/cfg80211.h cfg80211_send_assoc_timeout
 !Finclude/net/cfg80211.h cfg80211_send_deauth
index 4840334..85af548 100644 (file)
@@ -255,7 +255,7 @@ Code  Seq#(hex)     Include File            Comments
                linux/ixjuser.h         <http://web.archive.org/web/*/http://www.quicknet.net>
 'r'    00-1F   linux/msdos_fs.h and fs/fat/dir.c
 's'    all     linux/cdk.h
-'t'    00-7F   linux/if_ppp.h
+'t'    00-7F   linux/ppp-ioctl.h
 't'    80-8F   linux/isdn_ppp.h
 't'    90      linux/toshiba.h
 'u'    00-1F   linux/smb_fs.h          gone
index abf481f..82761a3 100644 (file)
@@ -89,7 +89,7 @@ TTY_DRIVER_MAGIC      0x5402      tty_driver        include/linux/tty_driver.h
 MGSLPC_MAGIC          0x5402      mgslpc_info       drivers/char/pcmcia/synclink_cs.c
 TTY_LDISC_MAGIC       0x5403      tty_ldisc         include/linux/tty_ldisc.h
 USB_SERIAL_MAGIC      0x6702      usb_serial        drivers/usb/serial/usb-serial.h
-FULL_DUPLEX_MAGIC     0x6969                        drivers/net/tulip/de2104x.c
+FULL_DUPLEX_MAGIC     0x6969                        drivers/net/ethernet/dec/tulip/de2104x.c
 USB_BLUETOOTH_MAGIC   0x6d02      usb_bluetooth     drivers/usb/class/bluetty.c
 RFCOMM_TTY_MAGIC      0x6d02                        net/bluetooth/rfcomm/tty.c
 USB_SERIAL_PORT_MAGIC 0x7301      usb_serial_port   drivers/usb/serial/usb-serial.h
index 123b6ed..ce64e4d 100644 (file)
-Copyright (c)  2003-2008 QLogic Corporation
-QLogic Linux Networking HBA Driver
+Copyright (c) 2003-2011 QLogic Corporation
+QLogic Linux qlge NIC Driver
 
-This program includes a device driver for Linux 2.6 that may be
-distributed with QLogic hardware specific firmware binary file.
 You may modify and redistribute the device driver code under the
-GNU General Public License as published by the Free Software
-Foundation (version 2 or a later version).
-
-You may redistribute the hardware specific firmware binary file
-under the following terms:
-
-       1. Redistribution of source code (only if applicable),
-          must retain the above copyright notice, this list of
-          conditions and the following disclaimer.
-
-       2. Redistribution in binary form must reproduce the above
-          copyright notice, this list of conditions and the
-          following disclaimer in the documentation and/or other
-          materials provided with the distribution.
-
-       3. The name of QLogic Corporation may not be used to
-          endorse or promote products derived from this software
-          without specific prior written permission
-
-REGARDLESS OF WHAT LICENSING MECHANISM IS USED OR APPLICABLE,
-THIS PROGRAM IS PROVIDED BY QLOGIC CORPORATION "AS IS'' AND ANY
-EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
-PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR
-BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
-TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGE.
-
-USER ACKNOWLEDGES AND AGREES THAT USE OF THIS PROGRAM WILL NOT
-CREATE OR GIVE GROUNDS FOR A LICENSE BY IMPLICATION, ESTOPPEL, OR
-OTHERWISE IN ANY INTELLECTUAL PROPERTY RIGHTS (PATENT, COPYRIGHT,
-TRADE SECRET, MASK WORK, OR OTHER PROPRIETARY RIGHT) EMBODIED IN
-ANY OTHER QLOGIC HARDWARE OR SOFTWARE EITHER SOLELY OR IN
-COMBINATION WITH THIS PROGRAM.
+GNU General Public License (a copy of which is attached hereto as
+Exhibit A) published by the Free Software Foundation (version 2).
 
+
+EXHIBIT A
+
+                   GNU GENERAL PUBLIC LICENSE
+                      Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                           Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                   GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+                           NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
index e7bf397..e63fc1f 100644 (file)
@@ -111,7 +111,7 @@ When creating PPPoL2TP sockets, the application provides information
 to the driver about the socket in a socket connect() call. Source and
 destination tunnel and session ids are provided, as well as the file
 descriptor of a UDP socket. See struct pppol2tp_addr in
-include/linux/if_ppp.h. Note that zero tunnel / session ids are
+include/linux/if_pppol2tp.h. Note that zero tunnel / session ids are
 treated specially. When creating the per-tunnel PPPoL2TP management
 socket in Step 2 above, zero source and destination session ids are
 specified, which tells the driver to prepare the supplied UDP file
index 4b1c0dc..4164f5c 100644 (file)
@@ -152,3 +152,16 @@ NETIF_F_VLAN_CHALLENGED should be set for devices which can't cope with VLAN
 headers. Some drivers set this because the cards can't handle the bigger MTU.
 [FIXME: Those cases could be fixed in VLAN code by allowing only reduced-MTU
 VLANs. This may be not useful, though.]
+
+*  rx-fcs
+
+This requests that the NIC append the Ethernet Frame Checksum (FCS)
+to the end of the skb data.  This allows sniffers and other tools to
+read the CRC recorded by the NIC on receipt of the packet.
+
+*  rx-all
+
+This requests that the NIC receive all possible frames, including errored
+frames (such as bad FCS, etc).  This can be helpful when sniffing a link with
+bad packets on it.  Some NICs may receive more packets if also put into normal
+PROMISC mdoe.
index 9eb1ba5..95e5f59 100644 (file)
@@ -62,7 +62,8 @@ The MDIO bus
  5) The bus must also be declared somewhere as a device, and registered.
 
  As an example for how one driver implemented an mdio bus driver, see
- drivers/net/gianfar_mii.c and arch/ppc/syslib/mpc85xx_devices.c
+ drivers/net/ethernet/freescale/fsl_pq_mdio.c and an associated DTS file
+ for one of the users. (e.g. "git grep fsl,.*-mdio arch/powerpc/boot/dts/")
 
 Connecting to a PHY
 
index 15b5172..091d202 100644 (file)
@@ -342,7 +342,7 @@ an interface unit are:
                                numbers on received multilink fragments
        SC_MP_XSHORTSEQ         transmit short multilink sequence nos.
 
-  The values of these flags are defined in <linux/if_ppp.h>.  Note
+  The values of these flags are defined in <linux/ppp-ioctl.h>.  Note
   that the values of the SC_MULTILINK, SC_MP_SHORTSEQ and
   SC_MP_XSHORTSEQ bits are ignored if the CONFIG_PPP_MULTILINK option
   is not selected.
@@ -358,7 +358,7 @@ an interface unit are:
 
 * PPPIOCSCOMPRESS sets the parameters for packet compression or
   decompression.  The argument should point to a ppp_option_data
-  structure (defined in <linux/if_ppp.h>), which contains a
+  structure (defined in <linux/ppp-ioctl.h>), which contains a
   pointer/length pair which should describe a block of memory
   containing a CCP option specifying a compression method and its
   parameters.  The ppp_option_data struct also contains a `transmit'
@@ -395,7 +395,7 @@ an interface unit are:
 
 * PPPIOCSNPMODE sets the network-protocol mode for a given network
   protocol.  The argument should point to an npioctl struct (defined
-  in <linux/if_ppp.h>).  The `protocol' field gives the PPP protocol
+  in <linux/ppp-ioctl.h>).  The `protocol' field gives the PPP protocol
   number for the protocol to be affected, and the `mode' field
   specifies what to do with packets for that protocol:
 
index c278f41..f606ba8 100644 (file)
@@ -89,7 +89,7 @@ TTY_DRIVER_MAGIC      0x5402      tty_driver        include/linux/tty_driver.h
 MGSLPC_MAGIC          0x5402      mgslpc_info       drivers/char/pcmcia/synclink_cs.c
 TTY_LDISC_MAGIC       0x5403      tty_ldisc         include/linux/tty_ldisc.h
 USB_SERIAL_MAGIC      0x6702      usb_serial        drivers/usb/serial/usb-serial.h
-FULL_DUPLEX_MAGIC     0x6969                        drivers/net/tulip/de2104x.c
+FULL_DUPLEX_MAGIC     0x6969                        drivers/net/ethernet/dec/tulip/de2104x.c
 USB_BLUETOOTH_MAGIC   0x6d02      usb_bluetooth     drivers/usb/class/bluetty.c
 RFCOMM_TTY_MAGIC      0x6d02                        net/bluetooth/rfcomm/tty.c
 USB_SERIAL_PORT_MAGIC 0x7301      usb_serial_port   drivers/usb/serial/usb-serial.h
index b087b3b..dd6decd 100644 (file)
@@ -1405,7 +1405,7 @@ F:        net/ax25/
 B43 WIRELESS DRIVER
 M:     Stefano Brivio <stefano.brivio@polimi.it>
 L:     linux-wireless@vger.kernel.org
-L:     b43-dev@lists.infradead.org (moderated for non-subscribers)
+L:     b43-dev@lists.infradead.org
 W:     http://linuxwireless.org/en/users/Drivers/b43
 S:     Maintained
 F:     drivers/net/wireless/b43/
@@ -1414,6 +1414,7 @@ B43LEGACY WIRELESS DRIVER
 M:     Larry Finger <Larry.Finger@lwfinger.net>
 M:     Stefano Brivio <stefano.brivio@polimi.it>
 L:     linux-wireless@vger.kernel.org
+L:     b43-dev@lists.infradead.org
 W:     http://linuxwireless.org/en/users/Drivers/b43
 S:     Maintained
 F:     drivers/net/wireless/b43legacy/
@@ -1567,7 +1568,6 @@ F:        drivers/net/ethernet/broadcom/tg3.*
 
 BROADCOM BRCM80211 IEEE802.11n WIRELESS DRIVER
 M:     Brett Rudley <brudley@broadcom.com>
-M:     Henry Ptasinski <henryp@broadcom.com>
 M:     Roland Vossen <rvossen@broadcom.com>
 M:     Arend van Spriel <arend@broadcom.com>
 M:     Franky (Zhenhui) Lin <frankyl@broadcom.com>
@@ -1797,7 +1797,8 @@ F:        Documentation/zh_CN/
 CISCO VIC ETHERNET NIC DRIVER
 M:     Christian Benvenuti <benve@cisco.com>
 M:     Roopa Prabhu <roprabhu@cisco.com>
-M:     David Wang <dwang2@cisco.com>
+M:     Neel Patel <neepatel@cisco.com>
+M:     Nishank Trivedi <nistrive@cisco.com>
 S:     Supported
 F:     drivers/net/ethernet/cisco/enic/
 
@@ -4910,8 +4911,6 @@ F:        fs/ocfs2/
 
 ORINOCO DRIVER
 L:     linux-wireless@vger.kernel.org
-L:     orinoco-users@lists.sourceforge.net
-L:     orinoco-devel@lists.sourceforge.net
 W:     http://linuxwireless.org/en/users/Drivers/orinoco
 W:     http://www.nongnu.org/orinoco/
 S:     Orphan
@@ -7458,6 +7457,12 @@ S:       Supported
 F:     Documentation/filesystems/xfs.txt
 F:     fs/xfs/
 
+XILINX AXI ETHERNET DRIVER
+M:     Ariane Keller <ariane.keller@tik.ee.ethz.ch>
+M:     Daniel Borkmann <daniel.borkmann@tik.ee.ethz.ch>
+S:     Maintained
+F:     drivers/net/ethernet/xilinx/xilinx_axienet*
+
 XILINX SYSTEMACE DRIVER
 M:     Grant Likely <grant.likely@secretlab.ca>
 W:     http://www.secretlab.ca/
index 082355f..dcb221a 100644 (file)
 
 #define SO_WIFI_STATUS         41
 #define SCM_WIFI_STATUS                SO_WIFI_STATUS
+#define SO_PEEK_OFF            42
+
+/* Instruct lower device to use last 4-bytes of skb data as FCS */
+#define SO_NOFCS               43
 
 /* O_NONBLOCK clashes with the bits used for socket types.  Therefore we
  * have to define SOCK_NONBLOCK to a different value here.
index dec6f9a..6433cad 100644 (file)
@@ -64,5 +64,9 @@
 
 #define SO_WIFI_STATUS         41
 #define SCM_WIFI_STATUS                SO_WIFI_STATUS
+#define SO_PEEK_OFF            42
+
+/* Instruct lower device to use last 4-bytes of skb data as FCS */
+#define SO_NOFCS               43
 
 #endif /* _ASM_SOCKET_H */
index 247b88c..a473f8c 100644 (file)
@@ -64,5 +64,9 @@
 
 #define SO_WIFI_STATUS         41
 #define SCM_WIFI_STATUS                SO_WIFI_STATUS
+#define SO_PEEK_OFF            42
+
+/* Instruct lower device to use last 4-bytes of skb data as FCS */
+#define SO_NOFCS               43
 
 #endif /* __ASM_AVR32_SOCKET_H */
index a2d96d3..a173957 100644 (file)
@@ -821,7 +821,7 @@ void native_machine_restart(char *cmd)
                bfin_reset_boot_spi_cs(P_DEFAULT_BOOT_SPI_CS);
 }
 
-void bfin_get_ether_addr(char *addr)
+int bfin_get_ether_addr(char *addr)
 {
        /* the MAC is stored in OTP memory page 0xDF */
        u32 ret;
@@ -834,5 +834,6 @@ void bfin_get_ether_addr(char *addr)
                for (ret = 0; ret < 6; ++ret)
                        addr[ret] = otp_mac_p[5 - ret];
        }
+       return 0;
 }
 EXPORT_SYMBOL(bfin_get_ether_addr);
index f271310..6eebee4 100644 (file)
@@ -730,9 +730,8 @@ void native_machine_restart(char *cmd)
                bfin_reset_boot_spi_cs(P_DEFAULT_BOOT_SPI_CS);
 }
 
-void bfin_get_ether_addr(char *addr)
+int bfin_get_ether_addr(char *addr)
 {
-       random_ether_addr(addr);
-       printk(KERN_WARNING "%s:%s: Setting Ethernet MAC to a random one\n", __FILE__, __func__);
+       return 1;
 }
 EXPORT_SYMBOL(bfin_get_ether_addr);
index c8d5d2b..fad7fea 100644 (file)
@@ -846,7 +846,7 @@ void native_machine_restart(char *cmd)
                bfin_reset_boot_spi_cs(P_DEFAULT_BOOT_SPI_CS);
 }
 
-void bfin_get_ether_addr(char *addr)
+int bfin_get_ether_addr(char *addr)
 {
        /* the MAC is stored in OTP memory page 0xDF */
        u32 ret;
@@ -859,5 +859,6 @@ void bfin_get_ether_addr(char *addr)
                for (ret = 0; ret < 6; ++ret)
                        addr[ret] = otp_mac_p[5 - ret];
        }
+       return 0;
 }
 EXPORT_SYMBOL(bfin_get_ether_addr);
index 7330607..65b7fbd 100644 (file)
@@ -983,9 +983,8 @@ void native_machine_restart(char *cmd)
                bfin_reset_boot_spi_cs(P_DEFAULT_BOOT_SPI_CS);
 }
 
-void bfin_get_ether_addr(char *addr)
+int bfin_get_ether_addr(char *addr)
 {
-       random_ether_addr(addr);
-       printk(KERN_WARNING "%s:%s: Setting Ethernet MAC to a random one\n", __FILE__, __func__);
+       return 1;
 }
 EXPORT_SYMBOL(bfin_get_ether_addr);
index db3ecfc..17c6a24 100644 (file)
@@ -870,7 +870,7 @@ void native_machine_restart(char *cmd)
                bfin_reset_boot_spi_cs(P_DEFAULT_BOOT_SPI_CS);
 }
 
-void bfin_get_ether_addr(char *addr)
+int bfin_get_ether_addr(char *addr)
 {
        /* the MAC is stored in OTP memory page 0xDF */
        u32 ret;
@@ -883,5 +883,6 @@ void bfin_get_ether_addr(char *addr)
                for (ret = 0; ret < 6; ++ret)
                        addr[ret] = otp_mac_p[5 - ret];
        }
+       return 0;
 }
 EXPORT_SYMBOL(bfin_get_ether_addr);
index dfdd8e6..2f9a2bd 100644 (file)
@@ -1311,7 +1311,7 @@ void native_machine_restart(char *cmd)
                bfin_reset_boot_spi_cs(P_DEFAULT_BOOT_SPI_CS);
 }
 
-void bfin_get_ether_addr(char *addr)
+int bfin_get_ether_addr(char *addr)
 {
        /* the MAC is stored in OTP memory page 0xDF */
        u32 ret;
@@ -1324,5 +1324,6 @@ void bfin_get_ether_addr(char *addr)
                for (ret = 0; ret < 6; ++ret)
                        addr[ret] = otp_mac_p[5 - ret];
        }
+       return 0;
 }
 EXPORT_SYMBOL(bfin_get_ether_addr);
index 360e97f..d192c0a 100644 (file)
@@ -931,7 +931,7 @@ void native_machine_restart(char *cmd)
                bfin_reset_boot_spi_cs(P_DEFAULT_BOOT_SPI_CS);
 }
 
-void bfin_get_ether_addr(char *addr)
+int bfin_get_ether_addr(char *addr)
 {
        /* the MAC is stored in OTP memory page 0xDF */
        u32 ret;
@@ -945,5 +945,6 @@ void bfin_get_ether_addr(char *addr)
                for (ret = 0; ret < 6; ++ret)
                        addr[ret] = otp_mac_p[5 - ret];
        }
+       return 0;
 }
 EXPORT_SYMBOL(bfin_get_ether_addr);
index 0d4a2f6..27fd2c3 100644 (file)
@@ -813,9 +813,8 @@ void __init native_machine_early_platform_add_devices(void)
                ARRAY_SIZE(cm_bf537e_early_devices));
 }
 
-void bfin_get_ether_addr(char *addr)
+int bfin_get_ether_addr(char *addr)
 {
-       random_ether_addr(addr);
-       printk(KERN_WARNING "%s:%s: Setting Ethernet MAC to a random one\n", __FILE__, __func__);
+       return 1;
 }
 EXPORT_SYMBOL(bfin_get_ether_addr);
index f553698..3f3abad 100644 (file)
@@ -790,9 +790,8 @@ void __init native_machine_early_platform_add_devices(void)
                ARRAY_SIZE(cm_bf537u_early_devices));
 }
 
-void bfin_get_ether_addr(char *addr)
+int bfin_get_ether_addr(char *addr)
 {
-       random_ether_addr(addr);
-       printk(KERN_WARNING "%s:%s: Setting Ethernet MAC to a random one\n", __FILE__, __func__);
+       return 1;
 }
 EXPORT_SYMBOL(bfin_get_ether_addr);
index 11dadeb..6f77bf7 100644 (file)
@@ -399,9 +399,10 @@ arch_initcall(dnp5370_init);
 /*
  * Currently the MAC address is saved in Flash by U-Boot
  */
-void bfin_get_ether_addr(char *addr)
+int bfin_get_ether_addr(char *addr)
 {
        *(u32 *)(&(addr[0])) = bfin_read32(FLASH_MAC);
        *(u16 *)(&(addr[4])) = bfin_read16(FLASH_MAC + 4);
+       return 0;
 }
 EXPORT_SYMBOL(bfin_get_ether_addr);
index 6fd8470..e9507fe 100644 (file)
@@ -535,9 +535,8 @@ void __init native_machine_early_platform_add_devices(void)
                ARRAY_SIZE(stamp_early_devices));
 }
 
-void bfin_get_ether_addr(char *addr)
+int bfin_get_ether_addr(char *addr)
 {
-       random_ether_addr(addr);
-       printk(KERN_WARNING "%s:%s: Setting Ethernet MAC to a random one\n", __FILE__, __func__);
+       return 1;
 }
 EXPORT_SYMBOL(bfin_get_ether_addr);
index 2221173..0b80725 100644 (file)
@@ -2993,9 +2993,10 @@ void native_machine_restart(char *cmd)
  * Currently the MAC address is saved in Flash by U-Boot
  */
 #define FLASH_MAC      0x203f0000
-void bfin_get_ether_addr(char *addr)
+int bfin_get_ether_addr(char *addr)
 {
        *(u32 *)(&(addr[0])) = bfin_read32(FLASH_MAC);
        *(u16 *)(&(addr[4])) = bfin_read16(FLASH_MAC + 4);
+       return 0;
 }
 EXPORT_SYMBOL(bfin_get_ether_addr);
index 9885176..3fb4218 100644 (file)
@@ -780,9 +780,8 @@ void __init native_machine_early_platform_add_devices(void)
                ARRAY_SIZE(cm_bf537_early_devices));
 }
 
-void bfin_get_ether_addr(char *addr)
+int bfin_get_ether_addr(char *addr)
 {
-       random_ether_addr(addr);
-       printk(KERN_WARNING "%s:%s: Setting Ethernet MAC to a random one\n", __FILE__, __func__);
+       return 1;
 }
 EXPORT_SYMBOL(bfin_get_ether_addr);
index e269264..ae52825 100644 (file)
 
 #define SO_WIFI_STATUS         41
 #define SCM_WIFI_STATUS                SO_WIFI_STATUS
+#define SO_PEEK_OFF            42
+
+/* Instruct lower device to use last 4-bytes of skb data as FCS */
+#define SO_NOFCS               43
 
 #endif /* _ASM_SOCKET_H */
 
index ce80fda..a5b1d7d 100644 (file)
 
 #define SO_WIFI_STATUS         41
 #define SCM_WIFI_STATUS                SO_WIFI_STATUS
+#define SO_PEEK_OFF            42
+
+/* Instruct lower device to use last 4-bytes of skb data as FCS */
+#define SO_NOFCS               43
 
 #endif /* _ASM_SOCKET_H */
 
index cf1daab..ec4554e 100644 (file)
@@ -64,5 +64,9 @@
 
 #define SO_WIFI_STATUS         41
 #define SCM_WIFI_STATUS                SO_WIFI_STATUS
+#define SO_PEEK_OFF            42
+
+/* Instruct lower device to use last 4-bytes of skb data as FCS */
+#define SO_NOFCS               43
 
 #endif /* _ASM_SOCKET_H */
index 47afcc6..440001e 100644 (file)
@@ -193,7 +193,7 @@ simeth_probe1(void)
        unsigned char mac_addr[ETH_ALEN];
        struct simeth_local *local;
        struct net_device *dev;
-       int fd, i, err, rc;
+       int fd, err, rc;
 
        /*
         * XXX Fix me
@@ -236,12 +236,8 @@ simeth_probe1(void)
         */
        netdev_connect(dev->irq);
 
-       printk(KERN_INFO "%s: hosteth=%s simfd=%d, HwAddr",
-              dev->name, simeth_device, local->simfd);
-       for(i = 0; i < ETH_ALEN; i++) {
-               printk(" %2.2x", dev->dev_addr[i]);
-       }
-       printk(", IRQ %d\n", dev->irq);
+       printk(KERN_INFO "%s: hosteth=%s simfd=%d, HwAddr=%pm, IRQ %d\n",
+              dev->name, simeth_device, local->simfd, dev->dev_addr, dev->irq);
 
        return 0;
 }
index 4b03664..41fc28a 100644 (file)
@@ -73,5 +73,9 @@
 
 #define SO_WIFI_STATUS         41
 #define SCM_WIFI_STATUS                SO_WIFI_STATUS
+#define SO_PEEK_OFF            42
+
+/* Instruct lower device to use last 4-bytes of skb data as FCS */
+#define SO_NOFCS               43
 
 #endif /* _ASM_IA64_SOCKET_H */
index e8b8c5b..a15f40b 100644 (file)
@@ -64,5 +64,9 @@
 
 #define SO_WIFI_STATUS         41
 #define SCM_WIFI_STATUS                SO_WIFI_STATUS
+#define SO_PEEK_OFF            42
+
+/* Instruct lower device to use last 4-bytes of skb data as FCS */
+#define SO_NOFCS               43
 
 #endif /* _ASM_M32R_SOCKET_H */
index d4708ce..d1be684 100644 (file)
@@ -64,5 +64,9 @@
 
 #define SO_WIFI_STATUS         41
 #define SCM_WIFI_STATUS                SO_WIFI_STATUS
+#define SO_PEEK_OFF            42
+
+/* Instruct lower device to use last 4-bytes of skb data as FCS */
+#define SO_NOFCS               43
 
 #endif /* _ASM_SOCKET_H */
index ad5c0a7..a2ed6fd 100644 (file)
@@ -84,6 +84,10 @@ To add: #define SO_REUSEPORT 0x0200  /* Allow local address and port reuse.  */
 
 #define SO_WIFI_STATUS         41
 #define SCM_WIFI_STATUS                SO_WIFI_STATUS
+#define SO_PEEK_OFF            42
+
+/* Instruct lower device to use last 4-bytes of skb data as FCS */
+#define SO_NOFCS               43
 
 #ifdef __KERNEL__
 
index 400535a..c682468 100644 (file)
@@ -25,6 +25,7 @@
 #include <linux/types.h>
 #include <linux/pci.h>
 #include <linux/ssb/ssb.h>
+#include <linux/bcma/bcma.h>
 #include <bcm47xx.h>
 
 int __init pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
@@ -32,15 +33,12 @@ int __init pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
        return 0;
 }
 
-int pcibios_plat_dev_init(struct pci_dev *dev)
-{
 #ifdef CONFIG_BCM47XX_SSB
+static int bcm47xx_pcibios_plat_dev_init_ssb(struct pci_dev *dev)
+{
        int res;
        u8 slot, pin;
 
-       if (bcm47xx_bus_type !=  BCM47XX_BUS_TYPE_SSB)
-               return 0;
-
        res = ssb_pcibios_plat_dev_init(dev);
        if (res < 0) {
                printk(KERN_ALERT "PCI: Failed to init device %s\n",
@@ -60,6 +58,47 @@ int pcibios_plat_dev_init(struct pci_dev *dev)
        }
 
        dev->irq = res;
+       return 0;
+}
 #endif
+
+#ifdef CONFIG_BCM47XX_BCMA
+static int bcm47xx_pcibios_plat_dev_init_bcma(struct pci_dev *dev)
+{
+       int res;
+
+       res = bcma_core_pci_plat_dev_init(dev);
+       if (res < 0) {
+               printk(KERN_ALERT "PCI: Failed to init device %s\n",
+                      pci_name(dev));
+               return res;
+       }
+
+       res = bcma_core_pci_pcibios_map_irq(dev);
+
+       /* IRQ-0 and IRQ-1 are software interrupts. */
+       if (res < 2) {
+               printk(KERN_ALERT "PCI: Failed to map IRQ of device %s\n",
+                      pci_name(dev));
+               return res;
+       }
+
+       dev->irq = res;
        return 0;
 }
+#endif
+
+int pcibios_plat_dev_init(struct pci_dev *dev)
+{
+#ifdef CONFIG_BCM47XX_SSB
+       if (bcm47xx_bus_type ==  BCM47XX_BUS_TYPE_SSB)
+               return bcm47xx_pcibios_plat_dev_init_ssb(dev);
+       else
+#endif
+#ifdef CONFIG_BCM47XX_BCMA
+       if  (bcm47xx_bus_type ==  BCM47XX_BUS_TYPE_BCMA)
+               return bcm47xx_pcibios_plat_dev_init_bcma(dev);
+       else
+#endif
+               return 0;
+}
index 876356d..820463a 100644 (file)
@@ -64,5 +64,9 @@
 
 #define SO_WIFI_STATUS         41
 #define SCM_WIFI_STATUS                SO_WIFI_STATUS
+#define SO_PEEK_OFF            42
+
+/* Instruct lower device to use last 4-bytes of skb data as FCS */
+#define SO_NOFCS               43
 
 #endif /* _ASM_SOCKET_H */
index d28c51b..1b52c2c 100644 (file)
 
 #define SO_WIFI_STATUS         0x4022
 #define SCM_WIFI_STATUS                SO_WIFI_STATUS
+#define SO_PEEK_OFF            0x4023
+
+/* Instruct lower device to use last 4-bytes of skb data as FCS */
+#define SO_NOFCS               0x4024
+
 
 /* O_NONBLOCK clashes with the bits used for socket types.  Therefore we
  * have to define SOCK_NONBLOCK to a different value here.
index 2fc2af8..3d5179b 100644 (file)
@@ -71,5 +71,9 @@
 
 #define SO_WIFI_STATUS         41
 #define SCM_WIFI_STATUS                SO_WIFI_STATUS
+#define SO_PEEK_OFF            42
+
+/* Instruct lower device to use last 4-bytes of skb data as FCS */
+#define SO_NOFCS               43
 
 #endif /* _ASM_POWERPC_SOCKET_H */
index 90efda0..2c7c898 100644 (file)
@@ -20,6 +20,7 @@
 #define SIOC_QETH_ARP_FLUSH_CACHE       (SIOCDEVPRIVATE + 4)
 #define SIOC_QETH_ADP_SET_SNMP_CONTROL  (SIOCDEVPRIVATE + 5)
 #define SIOC_QETH_GET_CARD_TYPE         (SIOCDEVPRIVATE + 6)
+#define SIOC_QETH_QUERY_OAT            (SIOCDEVPRIVATE + 7)
 
 struct qeth_arp_cache_entry {
        __u8  macaddr[6];
@@ -107,4 +108,10 @@ struct qeth_arp_query_user_data {
        char *entries;
 } __attribute__((packed));
 
+struct qeth_query_oat_data {
+       __u32 command;
+       __u32 buffer_len;
+       __u32 response_len;
+       __u64 ptr;
+};
 #endif /* __ASM_S390_QETH_IOCTL_H__ */
index 67b5c1b..c91b720 100644 (file)
@@ -72,5 +72,9 @@
 
 #define SO_WIFI_STATUS         41
 #define SCM_WIFI_STATUS                SO_WIFI_STATUS
+#define SO_PEEK_OFF            42
+
+/* Instruct lower device to use last 4-bytes of skb data as FCS */
+#define SO_NOFCS               43
 
 #endif /* _ASM_SOCKET_H */
index 8af1b64..bea1568 100644 (file)
 
 #define SO_WIFI_STATUS         0x0025
 #define SCM_WIFI_STATUS                SO_WIFI_STATUS
+#define SO_PEEK_OFF            0x0026
+
+/* Instruct lower device to use last 4-bytes of skb data as FCS */
+#define SO_NOFCS               0x0027
+
 
 /* Security levels - as per NRL IPv6 - don't actually do anything */
 #define SO_SECURITY_AUTHENTICATION             0x5001
index a492e59..d299618 100644 (file)
@@ -293,7 +293,7 @@ static void uml_net_user_timer_expire(unsigned long _conn)
 #endif
 }
 
-static void setup_etheraddr(char *str, unsigned char *addr, char *name)
+static int setup_etheraddr(char *str, unsigned char *addr, char *name)
 {
        char *end;
        int i;
@@ -334,12 +334,13 @@ static void setup_etheraddr(char *str, unsigned char *addr, char *name)
                       addr[0] | 0x02, addr[1], addr[2], addr[3], addr[4],
                       addr[5]);
        }
-       return;
+       return 0;
 
 random:
        printk(KERN_INFO
               "Choosing a random ethernet address for device %s\n", name);
        random_ether_addr(addr);
+       return 1;
 }
 
 static DEFINE_SPINLOCK(devices_lock);
@@ -391,6 +392,7 @@ static void eth_configure(int n, void *init, char *mac,
        struct net_device *dev;
        struct uml_net_private *lp;
        int err, size;
+       int random_mac;
 
        size = transport->private_size + sizeof(struct uml_net_private);
 
@@ -417,7 +419,7 @@ static void eth_configure(int n, void *init, char *mac,
         */
        snprintf(dev->name, sizeof(dev->name), "eth%d", n);
 
-       setup_etheraddr(mac, device->mac, dev->name);
+       random_mac = setup_etheraddr(mac, device->mac, dev->name);
 
        printk(KERN_INFO "Netdevice %d (%pM) : ", n, device->mac);
 
@@ -474,6 +476,9 @@ static void eth_configure(int n, void *init, char *mac,
 
        /* don't use eth_mac_addr, it will not work here */
        memcpy(dev->dev_addr, device->mac, ETH_ALEN);
+       if (random_mac)
+               dev->addr_assign_type |= NET_ADDR_RANDOM;
+
        dev->mtu = transport->user->mtu;
        dev->netdev_ops = &uml_netdev_ops;
        dev->ethtool_ops = &uml_net_ethtool_ops;
index bb06968..e36c681 100644 (file)
@@ -75,5 +75,9 @@
 
 #define SO_WIFI_STATUS         41
 #define SCM_WIFI_STATUS                SO_WIFI_STATUS
+#define SO_PEEK_OFF            42
+
+/* Instruct lower device to use last 4-bytes of skb data as FCS */
+#define SO_NOFCS               43
 
 #endif /* _XTENSA_SOCKET_H */
index 16f8693..b6ac138 100644 (file)
@@ -389,9 +389,13 @@ static int crypto_user_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh)
            (nlh->nlmsg_flags & NLM_F_DUMP))) {
                if (link->dump == NULL)
                        return -EINVAL;
-
-               return netlink_dump_start(crypto_nlsk, skb, nlh,
-                                         link->dump, link->done, 0);
+               {
+                       struct netlink_dump_control c = {
+                               .dump = link->dump,
+                               .done = link->done,
+                       };
+                       return netlink_dump_start(crypto_nlsk, skb, nlh, &c);
+               }
        }
 
        err = nlmsg_parse(nlh, crypto_msg_min[type], attrs, CRYPTOCFGA_MAX,
index f556969..68c7588 100644 (file)
@@ -1572,7 +1572,7 @@ static inline void host_vcc_unbind(struct lanai_dev *lanai,
 
 static void lanai_reset(struct lanai_dev *lanai)
 {
-       printk(KERN_CRIT DEV_LABEL "(itf %d): *NOT* reseting - not "
+       printk(KERN_CRIT DEV_LABEL "(itf %d): *NOT* resetting - not "
            "implemented\n", lanai->number);
        /* TODO */
        /* The following is just a hack until we write the real
index 0def898..b81755b 100644 (file)
@@ -13,7 +13,7 @@
 struct bcma_bus;
 
 /* main.c */
-int bcma_bus_register(struct bcma_bus *bus);
+int __devinit bcma_bus_register(struct bcma_bus *bus);
 void bcma_bus_unregister(struct bcma_bus *bus);
 int __init bcma_bus_early_register(struct bcma_bus *bus,
                                   struct bcma_device *core_cc,
@@ -48,8 +48,12 @@ extern int __init bcma_host_pci_init(void);
 extern void __exit bcma_host_pci_exit(void);
 #endif /* CONFIG_BCMA_HOST_PCI */
 
+/* driver_pci.c */
+u32 bcma_pcie_read(struct bcma_drv_pci *pc, u32 address);
+
 #ifdef CONFIG_BCMA_DRIVER_PCI_HOSTMODE
-void bcma_core_pci_hostmode_init(struct bcma_drv_pci *pc);
+bool __devinit bcma_core_pci_is_in_hostmode(struct bcma_drv_pci *pc);
+void __devinit bcma_core_pci_hostmode_init(struct bcma_drv_pci *pc);
 #endif /* CONFIG_BCMA_DRIVER_PCI_HOSTMODE */
 
 #endif
index 4fde625..4d38ae1 100644 (file)
@@ -2,8 +2,9 @@
  * Broadcom specific AMBA
  * PCI Core
  *
- * Copyright 2005, Broadcom Corporation
+ * Copyright 2005, 2011, Broadcom Corporation
  * Copyright 2006, 2007, Michael Buesch <m@bues.ch>
+ * Copyright 2011, 2012, Hauke Mehrtens <hauke@hauke-m.de>
  *
  * Licensed under the GNU/GPL. See COPYING for details.
  */
  * R/W ops.
  **************************************************/
 
-static u32 bcma_pcie_read(struct bcma_drv_pci *pc, u32 address)
+u32 bcma_pcie_read(struct bcma_drv_pci *pc, u32 address)
 {
-       pcicore_write32(pc, 0x130, address);
-       pcicore_read32(pc, 0x130);
-       return pcicore_read32(pc, 0x134);
+       pcicore_write32(pc, BCMA_CORE_PCI_PCIEIND_ADDR, address);
+       pcicore_read32(pc, BCMA_CORE_PCI_PCIEIND_ADDR);
+       return pcicore_read32(pc, BCMA_CORE_PCI_PCIEIND_DATA);
 }
 
 #if 0
 static void bcma_pcie_write(struct bcma_drv_pci *pc, u32 address, u32 data)
 {
-       pcicore_write32(pc, 0x130, address);
-       pcicore_read32(pc, 0x130);
-       pcicore_write32(pc, 0x134, data);
+       pcicore_write32(pc, BCMA_CORE_PCI_PCIEIND_ADDR, address);
+       pcicore_read32(pc, BCMA_CORE_PCI_PCIEIND_ADDR);
+       pcicore_write32(pc, BCMA_CORE_PCI_PCIEIND_DATA, data);
 }
 #endif
 
 static void bcma_pcie_mdio_set_phy(struct bcma_drv_pci *pc, u8 phy)
 {
-       const u16 mdio_control = 0x128;
-       const u16 mdio_data = 0x12C;
        u32 v;
        int i;
 
-       v = (1 << 30); /* Start of Transaction */
-       v |= (1 << 28); /* Write Transaction */
-       v |= (1 << 17); /* Turnaround */
-       v |= (0x1F << 18);
+       v = BCMA_CORE_PCI_MDIODATA_START;
+       v |= BCMA_CORE_PCI_MDIODATA_WRITE;
+       v |= (BCMA_CORE_PCI_MDIODATA_DEV_ADDR <<
+             BCMA_CORE_PCI_MDIODATA_DEVADDR_SHF);
+       v |= (BCMA_CORE_PCI_MDIODATA_BLK_ADDR <<
+             BCMA_CORE_PCI_MDIODATA_REGADDR_SHF);
+       v |= BCMA_CORE_PCI_MDIODATA_TA;
        v |= (phy << 4);
-       pcicore_write32(pc, mdio_data, v);
+       pcicore_write32(pc, BCMA_CORE_PCI_MDIO_DATA, v);
 
        udelay(10);
        for (i = 0; i < 200; i++) {
-               v = pcicore_read32(pc, mdio_control);
-               if (v & 0x100 /* Trans complete */)
+               v = pcicore_read32(pc, BCMA_CORE_PCI_MDIO_CONTROL);
+               if (v & BCMA_CORE_PCI_MDIOCTL_ACCESS_DONE)
                        break;
                msleep(1);
        }
@@ -57,79 +59,84 @@ static void bcma_pcie_mdio_set_phy(struct bcma_drv_pci *pc, u8 phy)
 
 static u16 bcma_pcie_mdio_read(struct bcma_drv_pci *pc, u8 device, u8 address)
 {
-       const u16 mdio_control = 0x128;
-       const u16 mdio_data = 0x12C;
        int max_retries = 10;
        u16 ret = 0;
        u32 v;
        int i;
 
-       v = 0x80; /* Enable Preamble Sequence */
-       v |= 0x2; /* MDIO Clock Divisor */
-       pcicore_write32(pc, mdio_control, v);
+       /* enable mdio access to SERDES */
+       v = BCMA_CORE_PCI_MDIOCTL_PREAM_EN;
+       v |= BCMA_CORE_PCI_MDIOCTL_DIVISOR_VAL;
+       pcicore_write32(pc, BCMA_CORE_PCI_MDIO_CONTROL, v);
 
        if (pc->core->id.rev >= 10) {
                max_retries = 200;
                bcma_pcie_mdio_set_phy(pc, device);
+               v = (BCMA_CORE_PCI_MDIODATA_DEV_ADDR <<
+                    BCMA_CORE_PCI_MDIODATA_DEVADDR_SHF);
+               v |= (address << BCMA_CORE_PCI_MDIODATA_REGADDR_SHF);
+       } else {
+               v = (device << BCMA_CORE_PCI_MDIODATA_DEVADDR_SHF_OLD);
+               v |= (address << BCMA_CORE_PCI_MDIODATA_REGADDR_SHF_OLD);
        }
 
-       v = (1 << 30); /* Start of Transaction */
-       v |= (1 << 29); /* Read Transaction */
-       v |= (1 << 17); /* Turnaround */
-       if (pc->core->id.rev < 10)
-               v |= (u32)device << 22;
-       v |= (u32)address << 18;
-       pcicore_write32(pc, mdio_data, v);
+       v = BCMA_CORE_PCI_MDIODATA_START;
+       v |= BCMA_CORE_PCI_MDIODATA_READ;
+       v |= BCMA_CORE_PCI_MDIODATA_TA;
+
+       pcicore_write32(pc, BCMA_CORE_PCI_MDIO_DATA, v);
        /* Wait for the device to complete the transaction */
        udelay(10);
        for (i = 0; i < max_retries; i++) {
-               v = pcicore_read32(pc, mdio_control);
-               if (v & 0x100 /* Trans complete */) {
+               v = pcicore_read32(pc, BCMA_CORE_PCI_MDIO_CONTROL);
+               if (v & BCMA_CORE_PCI_MDIOCTL_ACCESS_DONE) {
                        udelay(10);
-                       ret = pcicore_read32(pc, mdio_data);
+                       ret = pcicore_read32(pc, BCMA_CORE_PCI_MDIO_DATA);
                        break;
                }
                msleep(1);
        }
-       pcicore_write32(pc, mdio_control, 0);
+       pcicore_write32(pc, BCMA_CORE_PCI_MDIO_CONTROL, 0);
        return ret;
 }
 
 static void bcma_pcie_mdio_write(struct bcma_drv_pci *pc, u8 device,
                                u8 address, u16 data)
 {
-       const u16 mdio_control = 0x128;
-       const u16 mdio_data = 0x12C;
        int max_retries = 10;
        u32 v;
        int i;
 
-       v = 0x80; /* Enable Preamble Sequence */
-       v |= 0x2; /* MDIO Clock Divisor */
-       pcicore_write32(pc, mdio_control, v);
+       /* enable mdio access to SERDES */
+       v = BCMA_CORE_PCI_MDIOCTL_PREAM_EN;
+       v |= BCMA_CORE_PCI_MDIOCTL_DIVISOR_VAL;
+       pcicore_write32(pc, BCMA_CORE_PCI_MDIO_CONTROL, v);
 
        if (pc->core->id.rev >= 10) {
                max_retries = 200;
                bcma_pcie_mdio_set_phy(pc, device);
+               v = (BCMA_CORE_PCI_MDIODATA_DEV_ADDR <<
+                    BCMA_CORE_PCI_MDIODATA_DEVADDR_SHF);
+               v |= (address << BCMA_CORE_PCI_MDIODATA_REGADDR_SHF);
+       } else {
+               v = (device << BCMA_CORE_PCI_MDIODATA_DEVADDR_SHF_OLD);
+               v |= (address << BCMA_CORE_PCI_MDIODATA_REGADDR_SHF_OLD);
        }
 
-       v = (1 << 30); /* Start of Transaction */
-       v |= (1 << 28); /* Write Transaction */
-       v |= (1 << 17); /* Turnaround */
-       if (pc->core->id.rev < 10)
-               v |= (u32)device << 22;
-       v |= (u32)address << 18;
+       v = BCMA_CORE_PCI_MDIODATA_START;
+       v |= BCMA_CORE_PCI_MDIODATA_WRITE;
+       v |= BCMA_CORE_PCI_MDIODATA_TA;
        v |= data;
-       pcicore_write32(pc, mdio_data, v);
+       pcicore_write32(pc, BCMA_CORE_PCI_MDIO_DATA, v);
        /* Wait for the device to complete the transaction */
        udelay(10);
        for (i = 0; i < max_retries; i++) {
-               v = pcicore_read32(pc, mdio_control);
-               if (v & 0x100 /* Trans complete */)
+               v = pcicore_read32(pc, BCMA_CORE_PCI_MDIO_CONTROL);
+               if (v & BCMA_CORE_PCI_MDIOCTL_ACCESS_DONE)
                        break;
                msleep(1);
        }
-       pcicore_write32(pc, mdio_control, 0);
+       pcicore_write32(pc, BCMA_CORE_PCI_MDIO_CONTROL, 0);
 }
 
 /**************************************************
@@ -138,72 +145,53 @@ static void bcma_pcie_mdio_write(struct bcma_drv_pci *pc, u8 device,
 
 static u8 bcma_pcicore_polarity_workaround(struct bcma_drv_pci *pc)
 {
-       return (bcma_pcie_read(pc, 0x204) & 0x10) ? 0xC0 : 0x80;
+       u32 tmp;
+
+       tmp = bcma_pcie_read(pc, BCMA_CORE_PCI_PLP_STATUSREG);
+       if (tmp & BCMA_CORE_PCI_PLP_POLARITYINV_STAT)
+               return BCMA_CORE_PCI_SERDES_RX_CTRL_FORCE |
+                      BCMA_CORE_PCI_SERDES_RX_CTRL_POLARITY;
+       else
+               return BCMA_CORE_PCI_SERDES_RX_CTRL_FORCE;
 }
 
 static void bcma_pcicore_serdes_workaround(struct bcma_drv_pci *pc)
 {
-       const u8 serdes_pll_device = 0x1D;
-       const u8 serdes_rx_device = 0x1F;
        u16 tmp;
 
-       bcma_pcie_mdio_write(pc, serdes_rx_device, 1 /* Control */,
-                             bcma_pcicore_polarity_workaround(pc));
-       tmp = bcma_pcie_mdio_read(pc, serdes_pll_device, 1 /* Control */);
-       if (tmp & 0x4000)
-               bcma_pcie_mdio_write(pc, serdes_pll_device, 1, tmp & ~0x4000);
+       bcma_pcie_mdio_write(pc, BCMA_CORE_PCI_MDIODATA_DEV_RX,
+                            BCMA_CORE_PCI_SERDES_RX_CTRL,
+                            bcma_pcicore_polarity_workaround(pc));
+       tmp = bcma_pcie_mdio_read(pc, BCMA_CORE_PCI_MDIODATA_DEV_PLL,
+                                 BCMA_CORE_PCI_SERDES_PLL_CTRL);
+       if (tmp & BCMA_CORE_PCI_PLL_CTRL_FREQDET_EN)
+               bcma_pcie_mdio_write(pc, BCMA_CORE_PCI_MDIODATA_DEV_PLL,
+                                    BCMA_CORE_PCI_SERDES_PLL_CTRL,
+                                    tmp & ~BCMA_CORE_PCI_PLL_CTRL_FREQDET_EN);
 }
 
 /**************************************************
  * Init.
  **************************************************/
 
-static void bcma_core_pci_clientmode_init(struct bcma_drv_pci *pc)
+static void __devinit bcma_core_pci_clientmode_init(struct bcma_drv_pci *pc)
 {
        bcma_pcicore_serdes_workaround(pc);
 }
 
-static bool bcma_core_pci_is_in_hostmode(struct bcma_drv_pci *pc)
-{
-       struct bcma_bus *bus = pc->core->bus;
-       u16 chipid_top;
-
-       chipid_top = (bus->chipinfo.id & 0xFF00);
-       if (chipid_top != 0x4700 &&
-           chipid_top != 0x5300)
-               return false;
-
-#ifdef CONFIG_SSB_DRIVER_PCICORE
-       if (bus->sprom.boardflags_lo & SSB_BFL_NOPCI)
-               return false;
-#endif /* CONFIG_SSB_DRIVER_PCICORE */
-
-#if 0
-       /* TODO: on BCMA we use address from EROM instead of magic formula */
-       u32 tmp;
-       return !mips_busprobe32(tmp, (bus->mmio +
-               (pc->core->core_index * BCMA_CORE_SIZE)));
-#endif
-
-       return true;
-}
-
-void bcma_core_pci_init(struct bcma_drv_pci *pc)
+void __devinit bcma_core_pci_init(struct bcma_drv_pci *pc)
 {
        if (pc->setup_done)
                return;
 
-       if (bcma_core_pci_is_in_hostmode(pc)) {
 #ifdef CONFIG_BCMA_DRIVER_PCI_HOSTMODE
+       pc->hostmode = bcma_core_pci_is_in_hostmode(pc);
+       if (pc->hostmode)
                bcma_core_pci_hostmode_init(pc);
-#else
-               pr_err("Driver compiled without support for hostmode PCI\n");
 #endif /* CONFIG_BCMA_DRIVER_PCI_HOSTMODE */
-       } else {
-               bcma_core_pci_clientmode_init(pc);
-       }
 
-       pc->setup_done = true;
+       if (!pc->hostmode)
+               bcma_core_pci_clientmode_init(pc);
 }
 
 int bcma_core_pci_irq_ctl(struct bcma_drv_pci *pc, struct bcma_device *core,
index eb332b7..4e20bcf 100644 (file)
  * Broadcom specific AMBA
  * PCI Core in hostmode
  *
+ * Copyright 2005 - 2011, Broadcom Corporation
+ * Copyright 2006, 2007, Michael Buesch <m@bues.ch>
+ * Copyright 2011, 2012, Hauke Mehrtens <hauke@hauke-m.de>
+ *
  * Licensed under the GNU/GPL. See COPYING for details.
  */
 
 #include "bcma_private.h"
+#include <linux/export.h>
 #include <linux/bcma/bcma.h>
+#include <asm/paccess.h>
+
+/* Probe a 32bit value on the bus and catch bus exceptions.
+ * Returns nonzero on a bus exception.
+ * This is MIPS specific */
+#define mips_busprobe32(val, addr)     get_dbe((val), ((u32 *)(addr)))
+
+/* Assume one-hot slot wiring */
+#define BCMA_PCI_SLOT_MAX      16
+#define        PCI_CONFIG_SPACE_SIZE   256
+
+bool __devinit bcma_core_pci_is_in_hostmode(struct bcma_drv_pci *pc)
+{
+       struct bcma_bus *bus = pc->core->bus;
+       u16 chipid_top;
+       u32 tmp;
+
+       chipid_top = (bus->chipinfo.id & 0xFF00);
+       if (chipid_top != 0x4700 &&
+           chipid_top != 0x5300)
+               return false;
+
+       if (bus->sprom.boardflags_lo & BCMA_CORE_PCI_BFL_NOPCI) {
+               pr_info("This PCI core is disabled and not working\n");
+               return false;
+       }
+
+       bcma_core_enable(pc->core, 0);
+
+       return !mips_busprobe32(tmp, pc->core->io_addr);
+}
+
+static u32 bcma_pcie_read_config(struct bcma_drv_pci *pc, u32 address)
+{
+       pcicore_write32(pc, BCMA_CORE_PCI_CONFIG_ADDR, address);
+       pcicore_read32(pc, BCMA_CORE_PCI_CONFIG_ADDR);
+       return pcicore_read32(pc, BCMA_CORE_PCI_CONFIG_DATA);
+}
+
+static void bcma_pcie_write_config(struct bcma_drv_pci *pc, u32 address,
+                                  u32 data)
+{
+       pcicore_write32(pc, BCMA_CORE_PCI_CONFIG_ADDR, address);
+       pcicore_read32(pc, BCMA_CORE_PCI_CONFIG_ADDR);
+       pcicore_write32(pc, BCMA_CORE_PCI_CONFIG_DATA, data);
+}
+
+static u32 bcma_get_cfgspace_addr(struct bcma_drv_pci *pc, unsigned int dev,
+                            unsigned int func, unsigned int off)
+{
+       u32 addr = 0;
+
+       /* Issue config commands only when the data link is up (atleast
+        * one external pcie device is present).
+        */
+       if (dev >= 2 || !(bcma_pcie_read(pc, BCMA_CORE_PCI_DLLP_LSREG)
+                         & BCMA_CORE_PCI_DLLP_LSREG_LINKUP))
+               goto out;
+
+       /* Type 0 transaction */
+       /* Slide the PCI window to the appropriate slot */
+       pcicore_write32(pc, BCMA_CORE_PCI_SBTOPCI1, BCMA_CORE_PCI_SBTOPCI_CFG0);
+       /* Calculate the address */
+       addr = pc->host_controller->host_cfg_addr;
+       addr |= (dev << BCMA_CORE_PCI_CFG_SLOT_SHIFT);
+       addr |= (func << BCMA_CORE_PCI_CFG_FUN_SHIFT);
+       addr |= (off & ~3);
+
+out:
+       return addr;
+}
 
-void bcma_core_pci_hostmode_init(struct bcma_drv_pci *pc)
+static int bcma_extpci_read_config(struct bcma_drv_pci *pc, unsigned int dev,
+                                 unsigned int func, unsigned int off,
+                                 void *buf, int len)
 {
-       pr_err("No support for PCI core in hostmode yet\n");
+       int err = -EINVAL;
+       u32 addr, val;
+       void __iomem *mmio = 0;
+
+       WARN_ON(!pc->hostmode);
+       if (unlikely(len != 1 && len != 2 && len != 4))
+               goto out;
+       if (dev == 0) {
+               /* we support only two functions on device 0 */
+               if (func > 1)
+                       return -EINVAL;
+
+               /* accesses to config registers with offsets >= 256
+                * requires indirect access.
+                */
+               if (off >= PCI_CONFIG_SPACE_SIZE) {
+                       addr = (func << 12);
+                       addr |= (off & 0x0FFF);
+                       val = bcma_pcie_read_config(pc, addr);
+               } else {
+                       addr = BCMA_CORE_PCI_PCICFG0;
+                       addr |= (func << 8);
+                       addr |= (off & 0xfc);
+                       val = pcicore_read32(pc, addr);
+               }
+       } else {
+               addr = bcma_get_cfgspace_addr(pc, dev, func, off);
+               if (unlikely(!addr))
+                       goto out;
+               err = -ENOMEM;
+               mmio = ioremap_nocache(addr, len);
+               if (!mmio)
+                       goto out;
+
+               if (mips_busprobe32(val, mmio)) {
+                       val = 0xffffffff;
+                       goto unmap;
+               }
+
+               val = readl(mmio);
+       }
+       val >>= (8 * (off & 3));
+
+       switch (len) {
+       case 1:
+               *((u8 *)buf) = (u8)val;
+               break;
+       case 2:
+               *((u16 *)buf) = (u16)val;
+               break;
+       case 4:
+               *((u32 *)buf) = (u32)val;
+               break;
+       }
+       err = 0;
+unmap:
+       if (mmio)
+               iounmap(mmio);
+out:
+       return err;
+}
+
+static int bcma_extpci_write_config(struct bcma_drv_pci *pc, unsigned int dev,
+                                  unsigned int func, unsigned int off,
+                                  const void *buf, int len)
+{
+       int err = -EINVAL;
+       u32 addr = 0, val = 0;
+       void __iomem *mmio = 0;
+       u16 chipid = pc->core->bus->chipinfo.id;
+
+       WARN_ON(!pc->hostmode);
+       if (unlikely(len != 1 && len != 2 && len != 4))
+               goto out;
+       if (dev == 0) {
+               /* accesses to config registers with offsets >= 256
+                * requires indirect access.
+                */
+               if (off < PCI_CONFIG_SPACE_SIZE) {
+                       addr = pc->core->addr + BCMA_CORE_PCI_PCICFG0;
+                       addr |= (func << 8);
+                       addr |= (off & 0xfc);
+                       mmio = ioremap_nocache(addr, len);
+                       if (!mmio)
+                               goto out;
+               }
+       } else {
+               addr = bcma_get_cfgspace_addr(pc, dev, func, off);
+               if (unlikely(!addr))
+                       goto out;
+               err = -ENOMEM;
+               mmio = ioremap_nocache(addr, len);
+               if (!mmio)
+                       goto out;
+
+               if (mips_busprobe32(val, mmio)) {
+                       val = 0xffffffff;
+                       goto unmap;
+               }
+       }
+
+       switch (len) {
+       case 1:
+               val = readl(mmio);
+               val &= ~(0xFF << (8 * (off & 3)));
+               val |= *((const u8 *)buf) << (8 * (off & 3));
+               break;
+       case 2:
+               val = readl(mmio);
+               val &= ~(0xFFFF << (8 * (off & 3)));
+               val |= *((const u16 *)buf) << (8 * (off & 3));
+               break;
+       case 4:
+               val = *((const u32 *)buf);
+               break;
+       }
+       if (dev == 0 && !addr) {
+               /* accesses to config registers with offsets >= 256
+                * requires indirect access.
+                */
+               addr = (func << 12);
+               addr |= (off & 0x0FFF);
+               bcma_pcie_write_config(pc, addr, val);
+       } else {
+               writel(val, mmio);
+
+               if (chipid == 0x4716 || chipid == 0x4748)
+                       readl(mmio);
+       }
+
+       err = 0;
+unmap:
+       if (mmio)
+               iounmap(mmio);
+out:
+       return err;
+}
+
+static int bcma_core_pci_hostmode_read_config(struct pci_bus *bus,
+                                             unsigned int devfn,
+                                             int reg, int size, u32 *val)
+{
+       unsigned long flags;
+       int err;
+       struct bcma_drv_pci *pc;
+       struct bcma_drv_pci_host *pc_host;
+
+       pc_host = container_of(bus->ops, struct bcma_drv_pci_host, pci_ops);
+       pc = pc_host->pdev;
+
+       spin_lock_irqsave(&pc_host->cfgspace_lock, flags);
+       err = bcma_extpci_read_config(pc, PCI_SLOT(devfn),
+                                    PCI_FUNC(devfn), reg, val, size);
+       spin_unlock_irqrestore(&pc_host->cfgspace_lock, flags);
+
+       return err ? PCIBIOS_DEVICE_NOT_FOUND : PCIBIOS_SUCCESSFUL;
+}
+
+static int bcma_core_pci_hostmode_write_config(struct pci_bus *bus,
+                                              unsigned int devfn,
+                                              int reg, int size, u32 val)
+{
+       unsigned long flags;
+       int err;
+       struct bcma_drv_pci *pc;
+       struct bcma_drv_pci_host *pc_host;
+
+       pc_host = container_of(bus->ops, struct bcma_drv_pci_host, pci_ops);
+       pc = pc_host->pdev;
+
+       spin_lock_irqsave(&pc_host->cfgspace_lock, flags);
+       err = bcma_extpci_write_config(pc, PCI_SLOT(devfn),
+                                     PCI_FUNC(devfn), reg, &val, size);
+       spin_unlock_irqrestore(&pc_host->cfgspace_lock, flags);
+
+       return err ? PCIBIOS_DEVICE_NOT_FOUND : PCIBIOS_SUCCESSFUL;
+}
+
+/* return cap_offset if requested capability exists in the PCI config space */
+static u8 __devinit bcma_find_pci_capability(struct bcma_drv_pci *pc,
+                                            unsigned int dev,
+                                            unsigned int func, u8 req_cap_id,
+                                            unsigned char *buf, u32 *buflen)
+{
+       u8 cap_id;
+       u8 cap_ptr = 0;
+       u32 bufsize;
+       u8 byte_val;
+
+       /* check for Header type 0 */
+       bcma_extpci_read_config(pc, dev, func, PCI_HEADER_TYPE, &byte_val,
+                               sizeof(u8));
+       if ((byte_val & 0x7f) != PCI_HEADER_TYPE_NORMAL)
+               return cap_ptr;
+
+       /* check if the capability pointer field exists */
+       bcma_extpci_read_config(pc, dev, func, PCI_STATUS, &byte_val,
+                               sizeof(u8));
+       if (!(byte_val & PCI_STATUS_CAP_LIST))
+               return cap_ptr;
+
+       /* check if the capability pointer is 0x00 */
+       bcma_extpci_read_config(pc, dev, func, PCI_CAPABILITY_LIST, &cap_ptr,
+                               sizeof(u8));
+       if (cap_ptr == 0x00)
+               return cap_ptr;
+
+       /* loop thr'u the capability list and see if the requested capabilty
+        * exists */
+       bcma_extpci_read_config(pc, dev, func, cap_ptr, &cap_id, sizeof(u8));
+       while (cap_id != req_cap_id) {
+               bcma_extpci_read_config(pc, dev, func, cap_ptr + 1, &cap_ptr,
+                                       sizeof(u8));
+               if (cap_ptr == 0x00)
+                       return cap_ptr;
+               bcma_extpci_read_config(pc, dev, func, cap_ptr, &cap_id,
+                                       sizeof(u8));
+       }
+
+       /* found the caller requested capability */
+       if ((buf != NULL) && (buflen != NULL)) {
+               u8 cap_data;
+
+               bufsize = *buflen;
+               if (!bufsize)
+                       return cap_ptr;
+
+               *buflen = 0;
+
+               /* copy the cpability data excluding cap ID and next ptr */
+               cap_data = cap_ptr + 2;
+               if ((bufsize + cap_data)  > PCI_CONFIG_SPACE_SIZE)
+                       bufsize = PCI_CONFIG_SPACE_SIZE - cap_data;
+               *buflen = bufsize;
+               while (bufsize--) {
+                       bcma_extpci_read_config(pc, dev, func, cap_data, buf,
+                                               sizeof(u8));
+                       cap_data++;
+                       buf++;
+               }
+       }
+
+       return cap_ptr;
+}
+
+/* If the root port is capable of returning Config Request
+ * Retry Status (CRS) Completion Status to software then
+ * enable the feature.
+ */
+static void __devinit bcma_core_pci_enable_crs(struct bcma_drv_pci *pc)
+{
+       u8 cap_ptr, root_ctrl, root_cap, dev;
+       u16 val16;
+       int i;
+
+       cap_ptr = bcma_find_pci_capability(pc, 0, 0, PCI_CAP_ID_EXP, NULL,
+                                          NULL);
+       root_cap = cap_ptr + PCI_EXP_RTCAP;
+       bcma_extpci_read_config(pc, 0, 0, root_cap, &val16, sizeof(u16));
+       if (val16 & BCMA_CORE_PCI_RC_CRS_VISIBILITY) {
+               /* Enable CRS software visibility */
+               root_ctrl = cap_ptr + PCI_EXP_RTCTL;
+               val16 = PCI_EXP_RTCTL_CRSSVE;
+               bcma_extpci_read_config(pc, 0, 0, root_ctrl, &val16,
+                                       sizeof(u16));
+
+               /* Initiate a configuration request to read the vendor id
+                * field of the device function's config space header after
+                * 100 ms wait time from the end of Reset. If the device is
+                * not done with its internal initialization, it must at
+                * least return a completion TLP, with a completion status
+                * of "Configuration Request Retry Status (CRS)". The root
+                * complex must complete the request to the host by returning
+                * a read-data value of 0001h for the Vendor ID field and
+                * all 1s for any additional bytes included in the request.
+                * Poll using the config reads for max wait time of 1 sec or
+                * until we receive the successful completion status. Repeat
+                * the procedure for all the devices.
+                */
+               for (dev = 1; dev < BCMA_PCI_SLOT_MAX; dev++) {
+                       for (i = 0; i < 100000; i++) {
+                               bcma_extpci_read_config(pc, dev, 0,
+                                                       PCI_VENDOR_ID, &val16,
+                                                       sizeof(val16));
+                               if (val16 != 0x1)
+                                       break;
+                               udelay(10);
+                       }
+                       if (val16 == 0x1)
+                               pr_err("PCI: Broken device in slot %d\n", dev);
+               }
+       }
+}
+
+void __devinit bcma_core_pci_hostmode_init(struct bcma_drv_pci *pc)
+{
+       struct bcma_bus *bus = pc->core->bus;
+       struct bcma_drv_pci_host *pc_host;
+       u32 tmp;
+       u32 pci_membase_1G;
+       unsigned long io_map_base;
+
+       pr_info("PCIEcore in host mode found\n");
+
+       pc_host = kzalloc(sizeof(*pc_host), GFP_KERNEL);
+       if (!pc_host)  {
+               pr_err("can not allocate memory");
+               return;
+       }
+
+       pc->host_controller = pc_host;
+       pc_host->pci_controller.io_resource = &pc_host->io_resource;
+       pc_host->pci_controller.mem_resource = &pc_host->mem_resource;
+       pc_host->pci_controller.pci_ops = &pc_host->pci_ops;
+       pc_host->pdev = pc;
+
+       pci_membase_1G = BCMA_SOC_PCI_DMA;
+       pc_host->host_cfg_addr = BCMA_SOC_PCI_CFG;
+
+       pc_host->pci_ops.read = bcma_core_pci_hostmode_read_config;
+       pc_host->pci_ops.write = bcma_core_pci_hostmode_write_config;
+
+       pc_host->mem_resource.name = "BCMA PCIcore external memory",
+       pc_host->mem_resource.start = BCMA_SOC_PCI_DMA;
+       pc_host->mem_resource.end = BCMA_SOC_PCI_DMA + BCMA_SOC_PCI_DMA_SZ - 1;
+       pc_host->mem_resource.flags = IORESOURCE_MEM | IORESOURCE_PCI_FIXED;
+
+       pc_host->io_resource.name = "BCMA PCIcore external I/O",
+       pc_host->io_resource.start = 0x100;
+       pc_host->io_resource.end = 0x7FF;
+       pc_host->io_resource.flags = IORESOURCE_IO | IORESOURCE_PCI_FIXED;
+
+       /* Reset RC */
+       udelay(3000);
+       pcicore_write32(pc, BCMA_CORE_PCI_CTL, BCMA_CORE_PCI_CTL_RST_OE);
+       udelay(1000);
+       pcicore_write32(pc, BCMA_CORE_PCI_CTL, BCMA_CORE_PCI_CTL_RST |
+                       BCMA_CORE_PCI_CTL_RST_OE);
+
+       /* 64 MB I/O access window. On 4716, use
+        * sbtopcie0 to access the device registers. We
+        * can't use address match 2 (1 GB window) region
+        * as mips can't generate 64-bit address on the
+        * backplane.
+        */
+       if (bus->chipinfo.id == 0x4716 || bus->chipinfo.id == 0x4748) {
+               pc_host->mem_resource.start = BCMA_SOC_PCI_MEM;
+               pc_host->mem_resource.end = BCMA_SOC_PCI_MEM +
+                                           BCMA_SOC_PCI_MEM_SZ - 1;
+               pcicore_write32(pc, BCMA_CORE_PCI_SBTOPCI0,
+                               BCMA_CORE_PCI_SBTOPCI_MEM | BCMA_SOC_PCI_MEM);
+       } else if (bus->chipinfo.id == 0x5300) {
+               tmp = BCMA_CORE_PCI_SBTOPCI_MEM;
+               tmp |= BCMA_CORE_PCI_SBTOPCI_PREF;
+               tmp |= BCMA_CORE_PCI_SBTOPCI_BURST;
+               if (pc->core->core_unit == 0) {
+                       pc_host->mem_resource.start = BCMA_SOC_PCI_MEM;
+                       pc_host->mem_resource.end = BCMA_SOC_PCI_MEM +
+                                                   BCMA_SOC_PCI_MEM_SZ - 1;
+                       pci_membase_1G = BCMA_SOC_PCIE_DMA_H32;
+                       pcicore_write32(pc, BCMA_CORE_PCI_SBTOPCI0,
+                                       tmp | BCMA_SOC_PCI_MEM);
+               } else if (pc->core->core_unit == 1) {
+                       pc_host->mem_resource.start = BCMA_SOC_PCI1_MEM;
+                       pc_host->mem_resource.end = BCMA_SOC_PCI1_MEM +
+                                                   BCMA_SOC_PCI_MEM_SZ - 1;
+                       pci_membase_1G = BCMA_SOC_PCIE1_DMA_H32;
+                       pc_host->host_cfg_addr = BCMA_SOC_PCI1_CFG;
+                       pcicore_write32(pc, BCMA_CORE_PCI_SBTOPCI0,
+                                       tmp | BCMA_SOC_PCI1_MEM);
+               }
+       } else
+               pcicore_write32(pc, BCMA_CORE_PCI_SBTOPCI0,
+                               BCMA_CORE_PCI_SBTOPCI_IO);
+
+       /* 64 MB configuration access window */
+       pcicore_write32(pc, BCMA_CORE_PCI_SBTOPCI1, BCMA_CORE_PCI_SBTOPCI_CFG0);
+
+       /* 1 GB memory access window */
+       pcicore_write32(pc, BCMA_CORE_PCI_SBTOPCI2,
+                       BCMA_CORE_PCI_SBTOPCI_MEM | pci_membase_1G);
+
+
+       /* As per PCI Express Base Spec 1.1 we need to wait for
+        * at least 100 ms from the end of a reset (cold/warm/hot)
+        * before issuing configuration requests to PCI Express
+        * devices.
+        */
+       udelay(100000);
+
+       bcma_core_pci_enable_crs(pc);
+
+       /* Enable PCI bridge BAR0 memory & master access */
+       tmp = PCI_COMMAND_MASTER | PCI_COMMAND_MEMORY;
+       bcma_extpci_write_config(pc, 0, 0, PCI_COMMAND, &tmp, sizeof(tmp));
+
+       /* Enable PCI interrupts */
+       pcicore_write32(pc, BCMA_CORE_PCI_IMASK, BCMA_CORE_PCI_IMASK_INTA);
+
+       /* Ok, ready to run, register it to the system.
+        * The following needs change, if we want to port hostmode
+        * to non-MIPS platform. */
+       io_map_base = (unsigned long)ioremap_nocache(BCMA_SOC_PCI_MEM,
+                                                    0x04000000);
+       pc_host->pci_controller.io_map_base = io_map_base;
+       set_io_port_base(pc_host->pci_controller.io_map_base);
+       /* Give some time to the PCI controller to configure itself with the new
+        * values. Not waiting at this point causes crashes of the machine. */
+       mdelay(10);
+       register_pci_controller(&pc_host->pci_controller);
+       return;
+}
+
+/* Early PCI fixup for a device on the PCI-core bridge. */
+static void bcma_core_pci_fixup_pcibridge(struct pci_dev *dev)
+{
+       if (dev->bus->ops->read != bcma_core_pci_hostmode_read_config) {
+               /* This is not a device on the PCI-core bridge. */
+               return;
+       }
+       if (PCI_SLOT(dev->devfn) != 0)
+               return;
+
+       pr_info("PCI: Fixing up bridge %s\n", pci_name(dev));
+
+       /* Enable PCI bridge bus mastering and memory space */
+       pci_set_master(dev);
+       if (pcibios_enable_device(dev, ~0) < 0) {
+               pr_err("PCI: BCMA bridge enable failed\n");
+               return;
+       }
+
+       /* Enable PCI bridge BAR1 prefetch and burst */
+       pci_write_config_dword(dev, BCMA_PCI_BAR1_CONTROL, 3);
+}
+DECLARE_PCI_FIXUP_EARLY(PCI_ANY_ID, PCI_ANY_ID, bcma_core_pci_fixup_pcibridge);
+
+/* Early PCI fixup for all PCI-cores to set the correct memory address. */
+static void bcma_core_pci_fixup_addresses(struct pci_dev *dev)
+{
+       struct resource *res;
+       int pos;
+
+       if (dev->bus->ops->read != bcma_core_pci_hostmode_read_config) {
+               /* This is not a device on the PCI-core bridge. */
+               return;
+       }
+       if (PCI_SLOT(dev->devfn) == 0)
+               return;
+
+       pr_info("PCI: Fixing up addresses %s\n", pci_name(dev));
+
+       for (pos = 0; pos < 6; pos++) {
+               res = &dev->resource[pos];
+               if (res->flags & (IORESOURCE_IO | IORESOURCE_MEM))
+                       pci_assign_resource(dev, pos);
+       }
+}
+DECLARE_PCI_FIXUP_HEADER(PCI_ANY_ID, PCI_ANY_ID, bcma_core_pci_fixup_addresses);
+
+/* This function is called when doing a pci_enable_device().
+ * We must first check if the device is a device on the PCI-core bridge. */
+int bcma_core_pci_plat_dev_init(struct pci_dev *dev)
+{
+       struct bcma_drv_pci_host *pc_host;
+
+       if (dev->bus->ops->read != bcma_core_pci_hostmode_read_config) {
+               /* This is not a device on the PCI-core bridge. */
+               return -ENODEV;
+       }
+       pc_host = container_of(dev->bus->ops, struct bcma_drv_pci_host,
+                              pci_ops);
+
+       pr_info("PCI: Fixing up device %s\n", pci_name(dev));
+
+       /* Fix up interrupt lines */
+       dev->irq = bcma_core_mips_irq(pc_host->pdev->core) + 2;
+       pci_write_config_byte(dev, PCI_INTERRUPT_LINE, dev->irq);
+
+       return 0;
+}
+EXPORT_SYMBOL(bcma_core_pci_plat_dev_init);
+
+/* PCI device IRQ mapping. */
+int bcma_core_pci_pcibios_map_irq(const struct pci_dev *dev)
+{
+       struct bcma_drv_pci_host *pc_host;
+
+       if (dev->bus->ops->read != bcma_core_pci_hostmode_read_config) {
+               /* This is not a device on the PCI-core bridge. */
+               return -ENODEV;
+       }
+
+       pc_host = container_of(dev->bus->ops, struct bcma_drv_pci_host,
+                              pci_ops);
+       return bcma_core_mips_irq(pc_host->pdev->core) + 2;
 }
+EXPORT_SYMBOL(bcma_core_pci_pcibios_map_irq);
index f59244e..e3928d6 100644 (file)
@@ -154,8 +154,8 @@ const struct bcma_host_ops bcma_host_pci_ops = {
        .awrite32       = bcma_host_pci_awrite32,
 };
 
-static int bcma_host_pci_probe(struct pci_dev *dev,
-                            const struct pci_device_id *id)
+static int __devinit bcma_host_pci_probe(struct pci_dev *dev,
+                                        const struct pci_device_id *id)
 {
        struct bcma_bus *bus;
        int err = -ENOMEM;
index ec31f7d..b8379b9 100644 (file)
 MODULE_DESCRIPTION("Broadcom's specific AMBA driver");
 MODULE_LICENSE("GPL");
 
+/* contains the number the next bus should get. */
+static unsigned int bcma_bus_next_num = 0;
+
+/* bcma_buses_mutex locks the bcma_bus_next_num */
+static DEFINE_MUTEX(bcma_buses_mutex);
+
 static int bcma_bus_match(struct device *dev, struct device_driver *drv);
 static int bcma_device_probe(struct device *dev);
 static int bcma_device_remove(struct device *dev);
@@ -93,7 +99,7 @@ static int bcma_register_cores(struct bcma_bus *bus)
 
                core->dev.release = bcma_release_core_dev;
                core->dev.bus = &bcma_bus_type;
-               dev_set_name(&core->dev, "bcma%d:%d", 0/*bus->num*/, dev_id);
+               dev_set_name(&core->dev, "bcma%d:%d", bus->num, dev_id);
 
                switch (bus->hosttype) {
                case BCMA_HOSTTYPE_PCI:
@@ -132,11 +138,15 @@ static void bcma_unregister_cores(struct bcma_bus *bus)
        }
 }
 
-int bcma_bus_register(struct bcma_bus *bus)
+int __devinit bcma_bus_register(struct bcma_bus *bus)
 {
        int err;
        struct bcma_device *core;
 
+       mutex_lock(&bcma_buses_mutex);
+       bus->num = bcma_bus_next_num++;
+       mutex_unlock(&bcma_buses_mutex);
+
        /* Scan for devices (cores) */
        err = bcma_bus_scan(bus);
        if (err) {
index 3a2f672..f94cccc 100644 (file)
@@ -212,6 +212,17 @@ static struct bcma_device *bcma_find_core_by_index(struct bcma_bus *bus,
        return NULL;
 }
 
+static struct bcma_device *bcma_find_core_reverse(struct bcma_bus *bus, u16 coreid)
+{
+       struct bcma_device *core;
+
+       list_for_each_entry_reverse(core, &bus->cores, list) {
+               if (core->id.id == coreid)
+                       return core;
+       }
+       return NULL;
+}
+
 static int bcma_get_next_core(struct bcma_bus *bus, u32 __iomem **eromptr,
                              struct bcma_device_id *match, int core_num,
                              struct bcma_device *core)
@@ -353,6 +364,7 @@ static int bcma_get_next_core(struct bcma_bus *bus, u32 __iomem **eromptr,
 void bcma_init_bus(struct bcma_bus *bus)
 {
        s32 tmp;
+       struct bcma_chipinfo *chipinfo = &(bus->chipinfo);
 
        if (bus->init_done)
                return;
@@ -363,9 +375,12 @@ void bcma_init_bus(struct bcma_bus *bus)
        bcma_scan_switch_core(bus, BCMA_ADDR_BASE);
 
        tmp = bcma_scan_read32(bus, 0, BCMA_CC_ID);
-       bus->chipinfo.id = (tmp & BCMA_CC_ID_ID) >> BCMA_CC_ID_ID_SHIFT;
-       bus->chipinfo.rev = (tmp & BCMA_CC_ID_REV) >> BCMA_CC_ID_REV_SHIFT;
-       bus->chipinfo.pkg = (tmp & BCMA_CC_ID_PKG) >> BCMA_CC_ID_PKG_SHIFT;
+       chipinfo->id = (tmp & BCMA_CC_ID_ID) >> BCMA_CC_ID_ID_SHIFT;
+       chipinfo->rev = (tmp & BCMA_CC_ID_REV) >> BCMA_CC_ID_REV_SHIFT;
+       chipinfo->pkg = (tmp & BCMA_CC_ID_PKG) >> BCMA_CC_ID_PKG_SHIFT;
+       pr_info("Found chip with id 0x%04X, rev 0x%02X and package 0x%02X\n",
+               chipinfo->id, chipinfo->rev, chipinfo->pkg);
+
        bus->init_done = true;
 }
 
@@ -392,6 +407,7 @@ int bcma_bus_scan(struct bcma_bus *bus)
        bcma_scan_switch_core(bus, erombase);
 
        while (eromptr < eromend) {
+               struct bcma_device *other_core;
                struct bcma_device *core = kzalloc(sizeof(*core), GFP_KERNEL);
                if (!core)
                        return -ENOMEM;
@@ -414,6 +430,8 @@ int bcma_bus_scan(struct bcma_bus *bus)
 
                core->core_index = core_num++;
                bus->nr_cores++;
+               other_core = bcma_find_core_reverse(bus, core->id.id);
+               core->core_unit = (other_core == NULL) ? 0 : other_core->core_unit + 1;
 
                pr_info("Core %d found: %s "
                        "(manuf 0x%03X, id 0x%03X, rev 0x%02X, class 0x%X)\n",
index 6f230fb..ca77525 100644 (file)
@@ -14,8 +14,6 @@
 #include <linux/dma-mapping.h>
 #include <linux/slab.h>
 
-#define SPOFF(offset)  ((offset) / sizeof(u16))
-
 /**************************************************
  * R/W ops.
  **************************************************/
@@ -124,10 +122,21 @@ static int bcma_sprom_valid(const u16 *sprom)
  * SPROM extraction.
  **************************************************/
 
+#define SPOFF(offset)  ((offset) / sizeof(u16))
+
+#define SPEX(_field, _offset, _mask, _shift)   \
+       bus->sprom._field = ((sprom[SPOFF(_offset)] & (_mask)) >> (_shift))
+
 static void bcma_sprom_extract_r8(struct bcma_bus *bus, const u16 *sprom)
 {
-       u16 v;
+       u16 v, o;
        int i;
+       u16 pwr_info_offset[] = {
+               SSB_SROM8_PWR_INFO_CORE0, SSB_SROM8_PWR_INFO_CORE1,
+               SSB_SROM8_PWR_INFO_CORE2, SSB_SROM8_PWR_INFO_CORE3
+       };
+       BUILD_BUG_ON(ARRAY_SIZE(pwr_info_offset) !=
+                       ARRAY_SIZE(bus->sprom.core_pwr_info));
 
        bus->sprom.revision = sprom[SSB_SPROMSIZE_WORDS_R4 - 1] &
                SSB_SPROM_REVISION_REV;
@@ -137,78 +146,111 @@ static void bcma_sprom_extract_r8(struct bcma_bus *bus, const u16 *sprom)
                *(((__be16 *)bus->sprom.il0mac) + i) = cpu_to_be16(v);
        }
 
-       bus->sprom.board_rev = sprom[SPOFF(SSB_SPROM8_BOARDREV)];
-
-       bus->sprom.txpid2g[0] = (sprom[SPOFF(SSB_SPROM4_TXPID2G01)] &
-            SSB_SPROM4_TXPID2G0) >> SSB_SPROM4_TXPID2G0_SHIFT;
-       bus->sprom.txpid2g[1] = (sprom[SPOFF(SSB_SPROM4_TXPID2G01)] &
-            SSB_SPROM4_TXPID2G1) >> SSB_SPROM4_TXPID2G1_SHIFT;
-       bus->sprom.txpid2g[2] = (sprom[SPOFF(SSB_SPROM4_TXPID2G23)] &
-            SSB_SPROM4_TXPID2G2) >> SSB_SPROM4_TXPID2G2_SHIFT;
-       bus->sprom.txpid2g[3] = (sprom[SPOFF(SSB_SPROM4_TXPID2G23)] &
-            SSB_SPROM4_TXPID2G3) >> SSB_SPROM4_TXPID2G3_SHIFT;
-
-       bus->sprom.txpid5gl[0] = (sprom[SPOFF(SSB_SPROM4_TXPID5GL01)] &
-            SSB_SPROM4_TXPID5GL0) >> SSB_SPROM4_TXPID5GL0_SHIFT;
-       bus->sprom.txpid5gl[1] = (sprom[SPOFF(SSB_SPROM4_TXPID5GL01)] &
-            SSB_SPROM4_TXPID5GL1) >> SSB_SPROM4_TXPID5GL1_SHIFT;
-       bus->sprom.txpid5gl[2] = (sprom[SPOFF(SSB_SPROM4_TXPID5GL23)] &
-            SSB_SPROM4_TXPID5GL2) >> SSB_SPROM4_TXPID5GL2_SHIFT;
-       bus->sprom.txpid5gl[3] = (sprom[SPOFF(SSB_SPROM4_TXPID5GL23)] &
-            SSB_SPROM4_TXPID5GL3) >> SSB_SPROM4_TXPID5GL3_SHIFT;
-
-       bus->sprom.txpid5g[0] = (sprom[SPOFF(SSB_SPROM4_TXPID5G01)] &
-            SSB_SPROM4_TXPID5G0) >> SSB_SPROM4_TXPID5G0_SHIFT;
-       bus->sprom.txpid5g[1] = (sprom[SPOFF(SSB_SPROM4_TXPID5G01)] &
-            SSB_SPROM4_TXPID5G1) >> SSB_SPROM4_TXPID5G1_SHIFT;
-       bus->sprom.txpid5g[2] = (sprom[SPOFF(SSB_SPROM4_TXPID5G23)] &
-            SSB_SPROM4_TXPID5G2) >> SSB_SPROM4_TXPID5G2_SHIFT;
-       bus->sprom.txpid5g[3] = (sprom[SPOFF(SSB_SPROM4_TXPID5G23)] &
-            SSB_SPROM4_TXPID5G3) >> SSB_SPROM4_TXPID5G3_SHIFT;
-
-       bus->sprom.txpid5gh[0] = (sprom[SPOFF(SSB_SPROM4_TXPID5GH01)] &
-            SSB_SPROM4_TXPID5GH0) >> SSB_SPROM4_TXPID5GH0_SHIFT;
-       bus->sprom.txpid5gh[1] = (sprom[SPOFF(SSB_SPROM4_TXPID5GH01)] &
-            SSB_SPROM4_TXPID5GH1) >> SSB_SPROM4_TXPID5GH1_SHIFT;
-       bus->sprom.txpid5gh[2] = (sprom[SPOFF(SSB_SPROM4_TXPID5GH23)] &
-            SSB_SPROM4_TXPID5GH2) >> SSB_SPROM4_TXPID5GH2_SHIFT;
-       bus->sprom.txpid5gh[3] = (sprom[SPOFF(SSB_SPROM4_TXPID5GH23)] &
-            SSB_SPROM4_TXPID5GH3) >> SSB_SPROM4_TXPID5GH3_SHIFT;
-
-       bus->sprom.boardflags_lo = sprom[SPOFF(SSB_SPROM8_BFLLO)];
-       bus->sprom.boardflags_hi = sprom[SPOFF(SSB_SPROM8_BFLHI)];
-       bus->sprom.boardflags2_lo = sprom[SPOFF(SSB_SPROM8_BFL2LO)];
-       bus->sprom.boardflags2_hi = sprom[SPOFF(SSB_SPROM8_BFL2HI)];
-
-       bus->sprom.country_code = sprom[SPOFF(SSB_SPROM8_CCODE)];
-
-       bus->sprom.fem.ghz2.tssipos = (sprom[SPOFF(SSB_SPROM8_FEM2G)] &
-               SSB_SROM8_FEM_TSSIPOS) >> SSB_SROM8_FEM_TSSIPOS_SHIFT;
-       bus->sprom.fem.ghz2.extpa_gain = (sprom[SPOFF(SSB_SPROM8_FEM2G)] &
-               SSB_SROM8_FEM_EXTPA_GAIN) >> SSB_SROM8_FEM_EXTPA_GAIN_SHIFT;
-       bus->sprom.fem.ghz2.pdet_range = (sprom[SPOFF(SSB_SPROM8_FEM2G)] &
-               SSB_SROM8_FEM_PDET_RANGE) >> SSB_SROM8_FEM_PDET_RANGE_SHIFT;
-       bus->sprom.fem.ghz2.tr_iso = (sprom[SPOFF(SSB_SPROM8_FEM2G)] &
-               SSB_SROM8_FEM_TR_ISO) >> SSB_SROM8_FEM_TR_ISO_SHIFT;
-       bus->sprom.fem.ghz2.antswlut = (sprom[SPOFF(SSB_SPROM8_FEM2G)] &
-               SSB_SROM8_FEM_ANTSWLUT) >> SSB_SROM8_FEM_ANTSWLUT_SHIFT;
-
-       bus->sprom.fem.ghz5.tssipos = (sprom[SPOFF(SSB_SPROM8_FEM5G)] &
-               SSB_SROM8_FEM_TSSIPOS) >> SSB_SROM8_FEM_TSSIPOS_SHIFT;
-       bus->sprom.fem.ghz5.extpa_gain = (sprom[SPOFF(SSB_SPROM8_FEM5G)] &
-               SSB_SROM8_FEM_EXTPA_GAIN) >> SSB_SROM8_FEM_EXTPA_GAIN_SHIFT;
-       bus->sprom.fem.ghz5.pdet_range = (sprom[SPOFF(SSB_SPROM8_FEM5G)] &
-               SSB_SROM8_FEM_PDET_RANGE) >> SSB_SROM8_FEM_PDET_RANGE_SHIFT;
-       bus->sprom.fem.ghz5.tr_iso = (sprom[SPOFF(SSB_SPROM8_FEM5G)] &
-               SSB_SROM8_FEM_TR_ISO) >> SSB_SROM8_FEM_TR_ISO_SHIFT;
-       bus->sprom.fem.ghz5.antswlut = (sprom[SPOFF(SSB_SPROM8_FEM5G)] &
-               SSB_SROM8_FEM_ANTSWLUT) >> SSB_SROM8_FEM_ANTSWLUT_SHIFT;
+       SPEX(board_rev, SSB_SPROM8_BOARDREV, ~0, 0);
+
+       SPEX(txpid2g[0], SSB_SPROM4_TXPID2G01, SSB_SPROM4_TXPID2G0,
+            SSB_SPROM4_TXPID2G0_SHIFT);
+       SPEX(txpid2g[1], SSB_SPROM4_TXPID2G01, SSB_SPROM4_TXPID2G1,
+            SSB_SPROM4_TXPID2G1_SHIFT);
+       SPEX(txpid2g[2], SSB_SPROM4_TXPID2G23, SSB_SPROM4_TXPID2G2,
+            SSB_SPROM4_TXPID2G2_SHIFT);
+       SPEX(txpid2g[3], SSB_SPROM4_TXPID2G23, SSB_SPROM4_TXPID2G3,
+            SSB_SPROM4_TXPID2G3_SHIFT);
+
+       SPEX(txpid5gl[0], SSB_SPROM4_TXPID5GL01, SSB_SPROM4_TXPID5GL0,
+            SSB_SPROM4_TXPID5GL0_SHIFT);
+       SPEX(txpid5gl[1], SSB_SPROM4_TXPID5GL01, SSB_SPROM4_TXPID5GL1,
+            SSB_SPROM4_TXPID5GL1_SHIFT);
+       SPEX(txpid5gl[2], SSB_SPROM4_TXPID5GL23, SSB_SPROM4_TXPID5GL2,
+            SSB_SPROM4_TXPID5GL2_SHIFT);
+       SPEX(txpid5gl[3], SSB_SPROM4_TXPID5GL23, SSB_SPROM4_TXPID5GL3,
+            SSB_SPROM4_TXPID5GL3_SHIFT);
+
+       SPEX(txpid5g[0], SSB_SPROM4_TXPID5G01, SSB_SPROM4_TXPID5G0,
+            SSB_SPROM4_TXPID5G0_SHIFT);
+       SPEX(txpid5g[1], SSB_SPROM4_TXPID5G01, SSB_SPROM4_TXPID5G1,
+            SSB_SPROM4_TXPID5G1_SHIFT);
+       SPEX(txpid5g[2], SSB_SPROM4_TXPID5G23, SSB_SPROM4_TXPID5G2,
+            SSB_SPROM4_TXPID5G2_SHIFT);
+       SPEX(txpid5g[3], SSB_SPROM4_TXPID5G23, SSB_SPROM4_TXPID5G3,
+            SSB_SPROM4_TXPID5G3_SHIFT);
+
+       SPEX(txpid5gh[0], SSB_SPROM4_TXPID5GH01, SSB_SPROM4_TXPID5GH0,
+            SSB_SPROM4_TXPID5GH0_SHIFT);
+       SPEX(txpid5gh[1], SSB_SPROM4_TXPID5GH01, SSB_SPROM4_TXPID5GH1,
+            SSB_SPROM4_TXPID5GH1_SHIFT);
+       SPEX(txpid5gh[2], SSB_SPROM4_TXPID5GH23, SSB_SPROM4_TXPID5GH2,
+            SSB_SPROM4_TXPID5GH2_SHIFT);
+       SPEX(txpid5gh[3], SSB_SPROM4_TXPID5GH23, SSB_SPROM4_TXPID5GH3,
+            SSB_SPROM4_TXPID5GH3_SHIFT);
+
+       SPEX(boardflags_lo, SSB_SPROM8_BFLLO, ~0, 0);
+       SPEX(boardflags_hi, SSB_SPROM8_BFLHI, ~0, 0);
+       SPEX(boardflags2_lo, SSB_SPROM8_BFL2LO, ~0, 0);
+       SPEX(boardflags2_hi, SSB_SPROM8_BFL2HI, ~0, 0);
+
+       SPEX(country_code, SSB_SPROM8_CCODE, ~0, 0);
+
+       /* Extract cores power info info */
+       for (i = 0; i < ARRAY_SIZE(pwr_info_offset); i++) {
+               o = pwr_info_offset[i];
+               SPEX(core_pwr_info[i].itssi_2g, o + SSB_SROM8_2G_MAXP_ITSSI,
+                       SSB_SPROM8_2G_ITSSI, SSB_SPROM8_2G_ITSSI_SHIFT);
+               SPEX(core_pwr_info[i].maxpwr_2g, o + SSB_SROM8_2G_MAXP_ITSSI,
+                       SSB_SPROM8_2G_MAXP, 0);
+
+               SPEX(core_pwr_info[i].pa_2g[0], o + SSB_SROM8_2G_PA_0, ~0, 0);
+               SPEX(core_pwr_info[i].pa_2g[1], o + SSB_SROM8_2G_PA_1, ~0, 0);
+               SPEX(core_pwr_info[i].pa_2g[2], o + SSB_SROM8_2G_PA_2, ~0, 0);
+
+               SPEX(core_pwr_info[i].itssi_5g, o + SSB_SROM8_5G_MAXP_ITSSI,
+                       SSB_SPROM8_5G_ITSSI, SSB_SPROM8_5G_ITSSI_SHIFT);
+               SPEX(core_pwr_info[i].maxpwr_5g, o + SSB_SROM8_5G_MAXP_ITSSI,
+                       SSB_SPROM8_5G_MAXP, 0);
+               SPEX(core_pwr_info[i].maxpwr_5gh, o + SSB_SPROM8_5GHL_MAXP,
+                       SSB_SPROM8_5GH_MAXP, 0);
+               SPEX(core_pwr_info[i].maxpwr_5gl, o + SSB_SPROM8_5GHL_MAXP,
+                       SSB_SPROM8_5GL_MAXP, SSB_SPROM8_5GL_MAXP_SHIFT);
+
+               SPEX(core_pwr_info[i].pa_5gl[0], o + SSB_SROM8_5GL_PA_0, ~0, 0);
+               SPEX(core_pwr_info[i].pa_5gl[1], o + SSB_SROM8_5GL_PA_1, ~0, 0);
+               SPEX(core_pwr_info[i].pa_5gl[2], o + SSB_SROM8_5GL_PA_2, ~0, 0);
+               SPEX(core_pwr_info[i].pa_5g[0], o + SSB_SROM8_5G_PA_0, ~0, 0);
+               SPEX(core_pwr_info[i].pa_5g[1], o + SSB_SROM8_5G_PA_1, ~0, 0);
+               SPEX(core_pwr_info[i].pa_5g[2], o + SSB_SROM8_5G_PA_2, ~0, 0);
+               SPEX(core_pwr_info[i].pa_5gh[0], o + SSB_SROM8_5GH_PA_0, ~0, 0);
+               SPEX(core_pwr_info[i].pa_5gh[1], o + SSB_SROM8_5GH_PA_1, ~0, 0);
+               SPEX(core_pwr_info[i].pa_5gh[2], o + SSB_SROM8_5GH_PA_2, ~0, 0);
+       }
+
+       SPEX(fem.ghz2.tssipos, SSB_SPROM8_FEM2G, SSB_SROM8_FEM_TSSIPOS,
+            SSB_SROM8_FEM_TSSIPOS_SHIFT);
+       SPEX(fem.ghz2.extpa_gain, SSB_SPROM8_FEM2G, SSB_SROM8_FEM_EXTPA_GAIN,
+            SSB_SROM8_FEM_EXTPA_GAIN_SHIFT);
+       SPEX(fem.ghz2.pdet_range, SSB_SPROM8_FEM2G, SSB_SROM8_FEM_PDET_RANGE,
+            SSB_SROM8_FEM_PDET_RANGE_SHIFT);
+       SPEX(fem.ghz2.tr_iso, SSB_SPROM8_FEM2G, SSB_SROM8_FEM_TR_ISO,
+            SSB_SROM8_FEM_TR_ISO_SHIFT);
+       SPEX(fem.ghz2.antswlut, SSB_SPROM8_FEM2G, SSB_SROM8_FEM_ANTSWLUT,
+            SSB_SROM8_FEM_ANTSWLUT_SHIFT);
+
+       SPEX(fem.ghz5.tssipos, SSB_SPROM8_FEM5G, SSB_SROM8_FEM_TSSIPOS,
+            SSB_SROM8_FEM_TSSIPOS_SHIFT);
+       SPEX(fem.ghz5.extpa_gain, SSB_SPROM8_FEM5G, SSB_SROM8_FEM_EXTPA_GAIN,
+            SSB_SROM8_FEM_EXTPA_GAIN_SHIFT);
+       SPEX(fem.ghz5.pdet_range, SSB_SPROM8_FEM5G, SSB_SROM8_FEM_PDET_RANGE,
+            SSB_SROM8_FEM_PDET_RANGE_SHIFT);
+       SPEX(fem.ghz5.tr_iso, SSB_SPROM8_FEM5G, SSB_SROM8_FEM_TR_ISO,
+            SSB_SROM8_FEM_TR_ISO_SHIFT);
+       SPEX(fem.ghz5.antswlut, SSB_SPROM8_FEM5G, SSB_SROM8_FEM_ANTSWLUT,
+            SSB_SROM8_FEM_ANTSWLUT_SHIFT);
 }
 
 int bcma_sprom_get(struct bcma_bus *bus)
 {
        u16 offset;
        u16 *sprom;
+       u32 sromctrl;
        int err = 0;
 
        if (!bus->drv_cc.core)
@@ -217,6 +259,12 @@ int bcma_sprom_get(struct bcma_bus *bus)
        if (!(bus->drv_cc.capabilities & BCMA_CC_CAP_SPROM))
                return -ENOENT;
 
+       if (bus->drv_cc.core->id.rev >= 32) {
+               sromctrl = bcma_read32(bus->drv_cc.core, BCMA_CC_SROM_CONTROL);
+               if (!(sromctrl & BCMA_CC_SROM_CONTROL_PRESENT))
+                       return -ENOENT;
+       }
+
        sprom = kcalloc(SSB_SPROMSIZE_WORDS_R4, sizeof(u16),
                        GFP_KERNEL);
        if (!sprom)
@@ -230,6 +278,7 @@ int bcma_sprom_get(struct bcma_bus *bus)
         * TODO: understand this condition and use it */
        offset = (bus->chipinfo.id == 0x4331) ? BCMA_CC_SPROM :
                BCMA_CC_SPROM_PCIE6;
+       pr_debug("SPROM offset 0x%x\n", offset);
        bcma_sprom_read(bus, offset, sprom);
 
        if (bus->chipinfo.id == 0x4331)
index 1612cfd..6ef660c 100644 (file)
@@ -178,22 +178,26 @@ static void queue_req(struct addr_req *req)
        mutex_unlock(&lock);
 }
 
-static int dst_fetch_ha(struct dst_entry *dst, struct rdma_dev_addr *addr)
+static int dst_fetch_ha(struct dst_entry *dst, struct rdma_dev_addr *dev_addr, void *daddr)
 {
        struct neighbour *n;
        int ret;
 
+       n = dst_neigh_lookup(dst, daddr);
+
        rcu_read_lock();
-       n = dst_get_neighbour_noref(dst);
        if (!n || !(n->nud_state & NUD_VALID)) {
                if (n)
                        neigh_event_send(n, NULL);
                ret = -ENODATA;
        } else {
-               ret = rdma_copy_addr(addr, dst->dev, n->ha);
+               ret = rdma_copy_addr(dev_addr, dst->dev, n->ha);
        }
        rcu_read_unlock();
 
+       if (n)
+               neigh_release(n);
+
        return ret;
 }
 
@@ -232,7 +236,7 @@ static int addr4_resolve(struct sockaddr_in *src_in,
                goto put;
        }
 
-       ret = dst_fetch_ha(&rt->dst, addr);
+       ret = dst_fetch_ha(&rt->dst, addr, &fl4.daddr);
 put:
        ip_rt_put(rt);
 out:
@@ -280,7 +284,7 @@ static int addr6_resolve(struct sockaddr_in6 *src_in,
                goto put;
        }
 
-       ret = dst_fetch_ha(dst, addr);
+       ret = dst_fetch_ha(dst, addr, &fl6.daddr);
 put:
        dst_release(dst);
        return ret;
index d1c8196..396e293 100644 (file)
@@ -147,9 +147,13 @@ static int ibnl_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh)
                        if (op < 0 || op >= client->nops ||
                            !client->cb_table[RDMA_NL_GET_OP(op)].dump)
                                return -EINVAL;
-                       return netlink_dump_start(nls, skb, nlh,
-                                                 client->cb_table[op].dump,
-                                                 NULL, 0);
+
+                       {
+                               struct netlink_dump_control c = {
+                                       .dump = client->cb_table[op].dump,
+                               };
+                               return netlink_dump_start(nls, skb, nlh, &c);
+                       }
                }
        }
 
index 0668bb3..0cf6155 100644 (file)
@@ -1562,11 +1562,11 @@ static int import_ep(struct c4iw_ep *ep, __be32 peer_ip, struct dst_entry *dst,
        struct neighbour *n;
        int err, step;
 
-       rcu_read_lock();
-       n = dst_get_neighbour_noref(dst);
-       err = -ENODEV;
+       n = dst_neigh_lookup(dst, &peer_ip);
        if (!n)
-               goto out;
+               return -ENODEV;
+
+       rcu_read_lock();
        err = -ENOMEM;
        if (n->dev->flags & IFF_LOOPBACK) {
                struct net_device *pdev;
@@ -1614,6 +1614,8 @@ static int import_ep(struct c4iw_ep *ep, __be32 peer_ip, struct dst_entry *dst,
 out:
        rcu_read_unlock();
 
+       neigh_release(n);
+
        return err;
 }
 
index a4972ab..c5e4cb2 100644 (file)
@@ -1351,8 +1351,9 @@ static int nes_addr_resolve_neigh(struct nes_vnic *nesvnic, u32 dst_ip, int arpi
        else
                netdev = nesvnic->netdev;
 
+       neigh = dst_neigh_lookup(&rt->dst, &dst_ip);
+
        rcu_read_lock();
-       neigh = dst_get_neighbour_noref(&rt->dst);
        if (neigh) {
                if (neigh->nud_state & NUD_VALID) {
                        nes_debug(NES_DBG_CM, "Neighbor MAC address for 0x%08X"
@@ -1379,9 +1380,12 @@ static int nes_addr_resolve_neigh(struct nes_vnic *nesvnic, u32 dst_ip, int arpi
                        neigh_event_send(neigh, NULL);
                }
        }
-
 out:
        rcu_read_unlock();
+
+       if (neigh)
+               neigh_release(neigh);
+
        ip_rt_put(rt);
        return rc;
 }
index 88c9423..321d437 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Author       Fritz Elfert
  * Copyright    by Fritz Elfert      <fritz@isdn4linux.de>
- * 
+ *
  * This software may be used and distributed according to the terms
  * of the GNU General Public License, incorporated herein by reference.
  *
 /* Struct for adding new cards */
 typedef struct act2000_cdef {
        int bus;
-        int port;
-        int irq;
-        char id[10];
+       int port;
+       int irq;
+       char id[10];
 } act2000_cdef;
 
 /* Struct for downloading firmware */
 typedef struct act2000_ddef {
-        int length;             /* Length of code */
-        char __user *buffer;    /* Ptr. to code   */
+       int length;             /* Length of code */
+       char __user *buffer;    /* Ptr. to code   */
 } act2000_ddef;
 
 typedef struct act2000_fwid {
-        char isdn[4];
-        char revlen[2];
-        char revision[504];
+       char isdn[4];
+       char revlen[2];
+       char revision[504];
 } act2000_fwid;
 
 #if defined(__KERNEL__) || defined(__DEBUGVAR__)
@@ -128,8 +128,8 @@ typedef struct act2000_chan {
 
 typedef struct msn_entry {
        char eaz;
-        char msn[16];
-        struct msn_entry * next;
+       char msn[16];
+       struct msn_entry *next;
 } msn_entry;
 
 typedef struct irq_data_isa {
@@ -183,17 +183,17 @@ typedef struct act2000_card {
 
 static inline void act2000_schedule_tx(act2000_card *card)
 {
-        schedule_work(&card->snd_tq);
+       schedule_work(&card->snd_tq);
 }
 
 static inline void act2000_schedule_rx(act2000_card *card)
 {
-        schedule_work(&card->rcv_tq);
+       schedule_work(&card->rcv_tq);
 }
 
 static inline void act2000_schedule_poll(act2000_card *card)
 {
-        schedule_work(&card->poll_tq);
+       schedule_work(&card->poll_tq);
 }
 
 extern char *act2000_find_eaz(act2000_card *, char);
index fea5b78..b5fad29 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Author       Fritz Elfert
  * Copyright    by Fritz Elfert      <fritz@isdn4linux.de>
- * 
+ *
  * This software may be used and distributed according to the terms
  * of the GNU General Public License, incorporated herein by reference.
  *
 static int
 act2000_isa_reset(unsigned short portbase)
 {
-        unsigned char reg;
-        int i;
-        int found;
-        int serial = 0;
-
-        found = 0;
-        if ((reg = inb(portbase + ISA_COR)) != 0xff) {
-                outb(reg | ISA_COR_RESET, portbase + ISA_COR);
-                mdelay(10);
-                outb(reg, portbase + ISA_COR);
-                mdelay(10);
-
-                for (i = 0; i < 16; i++) {
-                        if (inb(portbase + ISA_ISR) & ISA_ISR_SERIAL)
-                                serial |= 0x10000;
-                        serial >>= 1;
-                }
-                if (serial == ISA_SER_ID)
-                        found++;
-        }
-        return found;
+       unsigned char reg;
+       int i;
+       int found;
+       int serial = 0;
+
+       found = 0;
+       if ((reg = inb(portbase + ISA_COR)) != 0xff) {
+               outb(reg | ISA_COR_RESET, portbase + ISA_COR);
+               mdelay(10);
+               outb(reg, portbase + ISA_COR);
+               mdelay(10);
+
+               for (i = 0; i < 16; i++) {
+                       if (inb(portbase + ISA_ISR) & ISA_ISR_SERIAL)
+                               serial |= 0x10000;
+                       serial >>= 1;
+               }
+               if (serial == ISA_SER_ID)
+                       found++;
+       }
+       return found;
 }
 
 int
 act2000_isa_detect(unsigned short portbase)
 {
-        int ret = 0;
+       int ret = 0;
 
        if (request_region(portbase, ACT2000_PORTLEN, "act2000isa")) {
-                ret = act2000_isa_reset(portbase);
+               ret = act2000_isa_reset(portbase);
                release_region(portbase, ISA_REGION);
        }
-        return ret;
+       return ret;
 }
 
 static irqreturn_t
 act2000_isa_interrupt(int dummy, void *dev_id)
 {
-        act2000_card *card = dev_id;
-        u_char istatus;
+       act2000_card *card = dev_id;
+       u_char istatus;
 
-        istatus = (inb(ISA_PORT_ISR) & 0x07);
-        if (istatus & ISA_ISR_OUT) {
-                /* RX fifo has data */
+       istatus = (inb(ISA_PORT_ISR) & 0x07);
+       if (istatus & ISA_ISR_OUT) {
+               /* RX fifo has data */
                istatus &= ISA_ISR_OUT_MASK;
                outb(0, ISA_PORT_SIS);
                act2000_isa_receive(card);
                outb(ISA_SIS_INT, ISA_PORT_SIS);
-        }
-        if (istatus & ISA_ISR_ERR) {
-                /* Error Interrupt */
+       }
+       if (istatus & ISA_ISR_ERR) {
+               /* Error Interrupt */
                istatus &= ISA_ISR_ERR_MASK;
-                printk(KERN_WARNING "act2000: errIRQ\n");
-        }
+               printk(KERN_WARNING "act2000: errIRQ\n");
+       }
        if (istatus)
                printk(KERN_DEBUG "act2000: ?IRQ %d %02x\n", card->irq, istatus);
        return IRQ_HANDLED;
 }
 
 static void
-act2000_isa_select_irq(act2000_card * card)
+act2000_isa_select_irq(act2000_card *card)
 {
        unsigned char reg;
 
        reg = (inb(ISA_PORT_COR) & ~ISA_COR_IRQOFF) | ISA_COR_PERR;
        switch (card->irq) {
-               case 3:
-                       reg = ISA_COR_IRQ03;
-                       break;
-               case 5:
-                       reg = ISA_COR_IRQ05;
-                       break;
-               case 7:
-                       reg = ISA_COR_IRQ07;
-                       break;
-               case 10:
-                       reg = ISA_COR_IRQ10;
-                       break;
-               case 11:
-                       reg = ISA_COR_IRQ11;
-                       break;
-               case 12:
-                       reg = ISA_COR_IRQ12;
-                       break;
-               case 15:
-                       reg = ISA_COR_IRQ15;
-                       break;
+       case 3:
+               reg = ISA_COR_IRQ03;
+               break;
+       case 5:
+               reg = ISA_COR_IRQ05;
+               break;
+       case 7:
+               reg = ISA_COR_IRQ07;
+               break;
+       case 10:
+               reg = ISA_COR_IRQ10;
+               break;
+       case 11:
+               reg = ISA_COR_IRQ11;
+               break;
+       case 12:
+               reg = ISA_COR_IRQ12;
+               break;
+       case 15:
+               reg = ISA_COR_IRQ15;
+               break;
        }
        outb(reg, ISA_PORT_COR);
 }
 
 static void
-act2000_isa_enable_irq(act2000_card * card)
+act2000_isa_enable_irq(act2000_card *card)
 {
        act2000_isa_select_irq(card);
        /* Enable READ irq */
@@ -129,102 +129,102 @@ act2000_isa_enable_irq(act2000_card * card)
  * If irq is -1, choose next free irq, else irq is given explicitly.
  */
 int
-act2000_isa_config_irq(act2000_card * card, short irq)
+act2000_isa_config_irq(act2000_card *card, short irq)
 {
        int old_irq;
 
-        if (card->flags & ACT2000_FLAGS_IVALID) {
-                free_irq(card->irq, card);
-        }
-        card->flags &= ~ACT2000_FLAGS_IVALID;
-        outb(ISA_COR_IRQOFF, ISA_PORT_COR);
-        if (!irq)
-                return 0;
+       if (card->flags & ACT2000_FLAGS_IVALID) {
+               free_irq(card->irq, card);
+       }
+       card->flags &= ~ACT2000_FLAGS_IVALID;
+       outb(ISA_COR_IRQOFF, ISA_PORT_COR);
+       if (!irq)
+               return 0;
 
        old_irq = card->irq;
        card->irq = irq;
        if (request_irq(irq, &act2000_isa_interrupt, 0, card->regname, card)) {
                card->irq = old_irq;
                card->flags |= ACT2000_FLAGS_IVALID;
-                printk(KERN_WARNING
-                       "act2000: Could not request irq %d\n",irq);
-                return -EBUSY;
-        } else {
+               printk(KERN_WARNING
+                      "act2000: Could not request irq %d\n", irq);
+               return -EBUSY;
+       } else {
                act2000_isa_select_irq(card);
-                /* Disable READ and WRITE irq */
-                outb(0, ISA_PORT_SIS);
-                outb(0, ISA_PORT_SOS);
-        }
-        return 0;
+               /* Disable READ and WRITE irq */
+               outb(0, ISA_PORT_SIS);
+               outb(0, ISA_PORT_SOS);
+       }
+       return 0;
 }
 
 int
-act2000_isa_config_port(act2000_card * card, unsigned short portbase)
+act2000_isa_config_port(act2000_card *card, unsigned short portbase)
 {
-        if (card->flags & ACT2000_FLAGS_PVALID) {
-                release_region(card->port, ISA_REGION);
-                card->flags &= ~ACT2000_FLAGS_PVALID;
-        }
+       if (card->flags & ACT2000_FLAGS_PVALID) {
+               release_region(card->port, ISA_REGION);
+               card->flags &= ~ACT2000_FLAGS_PVALID;
+       }
        if (request_region(portbase, ACT2000_PORTLEN, card->regname) == NULL)
                return -EBUSY;
        else {
-                card->port = portbase;
-                card->flags |= ACT2000_FLAGS_PVALID;
-                return 0;
-        }
+               card->port = portbase;
+               card->flags |= ACT2000_FLAGS_PVALID;
+               return 0;
+       }
 }
 
 /*
  * Release ressources, used by an adaptor.
  */
 void
-act2000_isa_release(act2000_card * card)
+act2000_isa_release(act2000_card *card)
 {
-        unsigned long flags;
+       unsigned long flags;
 
-        spin_lock_irqsave(&card->lock, flags);
-        if (card->flags & ACT2000_FLAGS_IVALID)
-                free_irq(card->irq, card);
+       spin_lock_irqsave(&card->lock, flags);
+       if (card->flags & ACT2000_FLAGS_IVALID)
+               free_irq(card->irq, card);
 
-        card->flags &= ~ACT2000_FLAGS_IVALID;
-        if (card->flags & ACT2000_FLAGS_PVALID)
-                release_region(card->port, ISA_REGION);
-        card->flags &= ~ACT2000_FLAGS_PVALID;
-        spin_unlock_irqrestore(&card->lock, flags);
+       card->flags &= ~ACT2000_FLAGS_IVALID;
+       if (card->flags & ACT2000_FLAGS_PVALID)
+               release_region(card->port, ISA_REGION);
+       card->flags &= ~ACT2000_FLAGS_PVALID;
+       spin_unlock_irqrestore(&card->lock, flags);
 }
 
 static int
-act2000_isa_writeb(act2000_card * card, u_char data)
+act2000_isa_writeb(act2000_card *card, u_char data)
 {
-        u_char timeout = 40;
-
-        while (timeout) {
-                if (inb(ISA_PORT_SOS) & ISA_SOS_READY) {
-                        outb(data, ISA_PORT_SDO);
-                        return 0;
-                } else {
-                        timeout--;
-                        udelay(10);
-                }
-        }
-        return 1;
+       u_char timeout = 40;
+
+       while (timeout) {
+               if (inb(ISA_PORT_SOS) & ISA_SOS_READY) {
+                       outb(data, ISA_PORT_SDO);
+                       return 0;
+               } else {
+                       timeout--;
+                       udelay(10);
+               }
+       }
+       return 1;
 }
 
 static int
-act2000_isa_readb(act2000_card * card, u_char * data)
+act2000_isa_readb(act2000_card *card, u_char *data)
 {
-        u_char timeout = 40;
-
-        while (timeout) {
-                if (inb(ISA_PORT_SIS) & ISA_SIS_READY) {
-                        *data = inb(ISA_PORT_SDI);
-                        return 0;
-                } else {
-                        timeout--;
-                        udelay(10);
-                }
-        }
-        return 1;
+       u_char timeout = 40;
+
+       while (timeout) {
+               if (inb(ISA_PORT_SIS) & ISA_SIS_READY) {
+                       *data = inb(ISA_PORT_SDI);
+                       return 0;
+               } else {
+                       timeout--;
+                       udelay(10);
+               }
+       }
+       return 1;
 }
 
 void
@@ -232,11 +232,11 @@ act2000_isa_receive(act2000_card *card)
 {
        u_char c;
 
-        if (test_and_set_bit(ACT2000_LOCK_RX, (void *) &card->ilock) != 0)
+       if (test_and_set_bit(ACT2000_LOCK_RX, (void *) &card->ilock) != 0)
                return;
        while (!act2000_isa_readb(card, &c)) {
                if (card->idat.isa.rcvidx < 8) {
-                        card->idat.isa.rcvhdr[card->idat.isa.rcvidx++] = c;
+                       card->idat.isa.rcvhdr[card->idat.isa.rcvidx++] = c;
                        if (card->idat.isa.rcvidx == 8) {
                                int valid = actcapi_chkhdr(card, (actcapi_msghdr *)&card->idat.isa.rcvhdr);
 
@@ -291,14 +291,14 @@ act2000_isa_receive(act2000_card *card)
 }
 
 void
-act2000_isa_send(act2000_card * card)
+act2000_isa_send(act2000_card *card)
 {
        unsigned long flags;
        struct sk_buff *skb;
        actcapi_msg *msg;
        int l;
 
-        if (test_and_set_bit(ACT2000_LOCK_TX, (void *) &card->ilock) != 0)
+       if (test_and_set_bit(ACT2000_LOCK_TX, (void *) &card->ilock) != 0)
                return;
        while (1) {
                spin_lock_irqsave(&card->lock, flags);
@@ -307,7 +307,7 @@ act2000_isa_send(act2000_card * card)
                                card->ack_msg = card->sbuf->data;
                                msg = (actcapi_msg *)card->sbuf->data;
                                if ((msg->hdr.cmd.cmd == 0x86) &&
-                                   (msg->hdr.cmd.subcmd == 0)   ) {
+                                   (msg->hdr.cmd.subcmd == 0)) {
                                        /* Save flags in message */
                                        card->need_b3ack = msg->msg.data_b3_req.flags;
                                        msg->msg.data_b3_req.flags = 0;
@@ -335,7 +335,7 @@ act2000_isa_send(act2000_card * card)
                }
                msg = (actcapi_msg *)card->ack_msg;
                if ((msg->hdr.cmd.cmd == 0x86) &&
-                   (msg->hdr.cmd.subcmd == 0)   ) {
+                   (msg->hdr.cmd.subcmd == 0)) {
                        /*
                         * If it's user data, reset data-ptr
                         * and put skb into ackq.
@@ -354,90 +354,90 @@ act2000_isa_send(act2000_card * card)
  * Get firmware ID, check for 'ISDN' signature.
  */
 static int
-act2000_isa_getid(act2000_card * card)
+act2000_isa_getid(act2000_card *card)
 {
 
-        act2000_fwid fid;
-        u_char *p = (u_char *) & fid;
-        int count = 0;
-
-        while (1) {
-                if (count > 510)
-                        return -EPROTO;
-                if (act2000_isa_readb(card, p++))
-                        break;
-                count++;
-        }
-        if (count <= 20) {
-                printk(KERN_WARNING "act2000: No Firmware-ID!\n");
-                return -ETIME;
-        }
-        *p = '\0';
-        fid.revlen[0] = '\0';
-        if (strcmp(fid.isdn, "ISDN")) {
-                printk(KERN_WARNING "act2000: Wrong Firmware-ID!\n");
-                return -EPROTO;
-        }
+       act2000_fwid fid;
+       u_char *p = (u_char *)&fid;
+       int count = 0;
+
+       while (1) {
+               if (count > 510)
+                       return -EPROTO;
+               if (act2000_isa_readb(card, p++))
+                       break;
+               count++;
+       }
+       if (count <= 20) {
+               printk(KERN_WARNING "act2000: No Firmware-ID!\n");
+               return -ETIME;
+       }
+       *p = '\0';
+       fid.revlen[0] = '\0';
+       if (strcmp(fid.isdn, "ISDN")) {
+               printk(KERN_WARNING "act2000: Wrong Firmware-ID!\n");
+               return -EPROTO;
+       }
        if ((p = strchr(fid.revision, '\n')))
                *p = '\0';
-        printk(KERN_INFO "act2000: Firmware-ID: %s\n", fid.revision);
+       printk(KERN_INFO "act2000: Firmware-ID: %s\n", fid.revision);
        if (card->flags & ACT2000_FLAGS_IVALID) {
                printk(KERN_DEBUG "Enabling Interrupts ...\n");
                act2000_isa_enable_irq(card);
        }
-        return 0;
+       return 0;
 }
 
 /*
  * Download microcode into card, check Firmware signature.
  */
 int
-act2000_isa_download(act2000_card * card, act2000_ddef __user * cb)
+act2000_isa_download(act2000_card *card, act2000_ddef __user *cb)
 {
-        unsigned int length;
-        int l;
-        int c;
-        long timeout;
-        u_char *b;
-        u_char __user *p;
-        u_char *buf;
-        act2000_ddef cblock;
-
-        if (!act2000_isa_reset(card->port))
-                return -ENXIO;
-        msleep_interruptible(500);
-        if (copy_from_user(&cblock, cb, sizeof(cblock)))
-               return -EFAULT;
-        length = cblock.length;
-        p = cblock.buffer;
-        if (!access_ok(VERIFY_READ, p, length))
-                return -EFAULT;
-        buf = kmalloc(1024, GFP_KERNEL);
-        if (!buf)
-                return -ENOMEM;
-        timeout = 0;
-        while (length) {
-                l = (length > 1024) ? 1024 : length;
-                c = 0;
-                b = buf;
-                if (copy_from_user(buf, p, l)) {
-                        kfree(buf);
-                        return -EFAULT;
-                }
-                while (c < l) {
-                        if (act2000_isa_writeb(card, *b++)) {
-                                printk(KERN_WARNING
-                                       "act2000: loader timed out"
-                                       " len=%d c=%d\n", length, c);
-                                kfree(buf);
-                                return -ETIME;
-                        }
-                        c++;
-                }
-                length -= l;
-                p += l;
-        }
-        kfree(buf);
-        msleep_interruptible(500);
-        return (act2000_isa_getid(card));
+       unsigned int length;
+       int l;
+       int c;
+       long timeout;
+       u_char *b;
+       u_char __user *p;
+       u_char *buf;
+       act2000_ddef cblock;
+
+       if (!act2000_isa_reset(card->port))
+               return -ENXIO;
+       msleep_interruptible(500);
+       if (copy_from_user(&cblock, cb, sizeof(cblock)))
+               return -EFAULT;
+       length = cblock.length;
+       p = cblock.buffer;
+       if (!access_ok(VERIFY_READ, p, length))
+               return -EFAULT;
+       buf = kmalloc(1024, GFP_KERNEL);
+       if (!buf)
+               return -ENOMEM;
+       timeout = 0;
+       while (length) {
+               l = (length > 1024) ? 1024 : length;
+               c = 0;
+               b = buf;
+               if (copy_from_user(buf, p, l)) {
+                       kfree(buf);
+                       return -EFAULT;
+               }
+               while (c < l) {
+                       if (act2000_isa_writeb(card, *b++)) {
+                               printk(KERN_WARNING
+                                      "act2000: loader timed out"
+                                      " len=%d c=%d\n", length, c);
+                               kfree(buf);
+                               return -ETIME;
+                       }
+                       c++;
+               }
+               length -= l;
+               p += l;
+       }
+       kfree(buf);
+       msleep_interruptible(500);
+       return (act2000_isa_getid(card));
 }
index ad86c5e..1a72898 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Author       Fritz Elfert
  * Copyright    by Fritz Elfert      <fritz@isdn4linux.de>
- * 
+ *
  * This software may be used and distributed according to the terms
  * of the GNU General Public License, incorporated herein by reference.
  *
@@ -18,9 +18,9 @@
 #define ISA_POLL_LOOP 40        /* Try to read-write before give up */
 
 typedef enum {
-        INT_NO_CHANGE = 0,      /* Do not change the Mask */
-        INT_ON = 1,             /* Set to Enable */
-        INT_OFF = 2,            /* Set to Disable */
+       INT_NO_CHANGE = 0,      /* Do not change the Mask */
+       INT_ON = 1,             /* Set to Enable */
+       INT_OFF = 2,            /* Set to Disable */
 } ISA_INT_T;
 
 /**************************************************************************/
@@ -114,22 +114,22 @@ typedef enum {
 
 
 /* Macros for accessing ports */
-#define ISA_PORT_COR (card->port+ISA_COR)
-#define ISA_PORT_ISR (card->port+ISA_ISR)
-#define ISA_PORT_EPR (card->port+ISA_EPR)
-#define ISA_PORT_EER (card->port+ISA_EER)
-#define ISA_PORT_SDI (card->port+ISA_SDI)
-#define ISA_PORT_SDO (card->port+ISA_SDO)
-#define ISA_PORT_SIS (card->port+ISA_SIS)
-#define ISA_PORT_SOS (card->port+ISA_SOS)
+#define ISA_PORT_COR (card->port + ISA_COR)
+#define ISA_PORT_ISR (card->port + ISA_ISR)
+#define ISA_PORT_EPR (card->port + ISA_EPR)
+#define ISA_PORT_EER (card->port + ISA_EER)
+#define ISA_PORT_SDI (card->port + ISA_SDI)
+#define ISA_PORT_SDO (card->port + ISA_SDO)
+#define ISA_PORT_SIS (card->port + ISA_SIS)
+#define ISA_PORT_SOS (card->port + ISA_SOS)
 
 /* Prototypes */
 
 extern int act2000_isa_detect(unsigned short portbase);
-extern int act2000_isa_config_irq(act2000_card * card, short irq);
-extern int act2000_isa_config_port(act2000_card * card, unsigned short portbase);
-extern int act2000_isa_download(act2000_card * card, act2000_ddef __user * cb);
-extern void act2000_isa_release(act2000_card * card);
+extern int act2000_isa_config_irq(act2000_card *card, short irq);
+extern int act2000_isa_config_port(act2000_card *card, unsigned short portbase);
+extern int act2000_isa_download(act2000_card *card, act2000_ddef __user *cb);
+extern void act2000_isa_release(act2000_card *card);
 extern void act2000_isa_receive(act2000_card *card);
 extern void act2000_isa_send(act2000_card *card);
 
index 1f0a949..3f66ca2 100644 (file)
@@ -5,7 +5,7 @@
  *
  * Author       Fritz Elfert
  * Copyright    by Fritz Elfert      <fritz@isdn4linux.de>
- * 
+ *
  * This software may be used and distributed according to the terms
  * of the GNU General Public License, incorporated herein by reference.
  *
@@ -64,14 +64,14 @@ static actcapi_msgdsc valid_msg[] = {
        {{ 0x86, 0x00}, "DATA_B3_REQ"},
        {{ 0xff, 0x00}, "MANUFACTURER_REQ"},
        /* Responses */
-       {{ 0x01, 0x03}, "RESET_B3_RESP"},       
-       {{ 0x02, 0x03}, "CONNECT_RESP"},        
-       {{ 0x03, 0x03}, "CONNECT_ACTIVE_RESP"}, 
-       {{ 0x04, 0x03}, "DISCONNECT_RESP"},     
-       {{ 0x07, 0x03}, "INFO_RESP"},   
-       {{ 0x08, 0x03}, "DATA_RESP"},   
-       {{ 0x82, 0x03}, "CONNECT_B3_RESP"},     
-       {{ 0x83, 0x03}, "CONNECT_B3_ACTIVE_RESP"},      
+       {{ 0x01, 0x03}, "RESET_B3_RESP"},
+       {{ 0x02, 0x03}, "CONNECT_RESP"},
+       {{ 0x03, 0x03}, "CONNECT_ACTIVE_RESP"},
+       {{ 0x04, 0x03}, "DISCONNECT_RESP"},
+       {{ 0x07, 0x03}, "INFO_RESP"},
+       {{ 0x08, 0x03}, "DATA_RESP"},
+       {{ 0x82, 0x03}, "CONNECT_B3_RESP"},
+       {{ 0x83, 0x03}, "CONNECT_B3_ACTIVE_RESP"},
        {{ 0x84, 0x03}, "DISCONNECT_B3_RESP"},
        {{ 0x86, 0x03}, "DATA_B3_RESP"},
        {{ 0xff, 0x03}, "MANUFACTURER_RESP"},
@@ -88,7 +88,7 @@ static actcapi_msgdsc valid_msg[] = {
  *   2 = Valid message, B-Channel-data
  */
 int
-actcapi_chkhdr(act2000_card * card, actcapi_msghdr *hdr)
+actcapi_chkhdr(act2000_card *card, actcapi_msghdr *hdr)
 {
        int i;
 
@@ -99,33 +99,33 @@ actcapi_chkhdr(act2000_card * card, actcapi_msghdr *hdr)
        for (i = 0; i < num_valid_imsg; i++)
                if ((hdr->cmd.cmd == valid_msg[i].cmd.cmd) &&
                    (hdr->cmd.subcmd == valid_msg[i].cmd.subcmd)) {
-                       return (i?1:2);
+                       return (i ? 1 : 2);
                }
        return 0;
 }
 
-#define ACTCAPI_MKHDR(l, c, s) { \
-       skb = alloc_skb(l + 8, GFP_ATOMIC); \
-       if (skb) { \
-               m = (actcapi_msg *)skb_put(skb, l + 8); \
-               m->hdr.len = l + 8; \
-               m->hdr.applicationID = 1; \
-               m->hdr.cmd.cmd = c; \
-               m->hdr.cmd.subcmd = s; \
-               m->hdr.msgnum = actcapi_nextsmsg(card); \
-       } else m = NULL;\
-}
+#define ACTCAPI_MKHDR(l, c, s) {                               \
+               skb = alloc_skb(l + 8, GFP_ATOMIC);             \
+               if (skb) {                                      \
+                       m = (actcapi_msg *)skb_put(skb, l + 8); \
+                       m->hdr.len = l + 8;                     \
+                       m->hdr.applicationID = 1;               \
+                       m->hdr.cmd.cmd = c;                     \
+                       m->hdr.cmd.subcmd = s;                  \
+                       m->hdr.msgnum = actcapi_nextsmsg(card); \
+               } else m = NULL;                                \
+       }
 
-#define ACTCAPI_CHKSKB if (!skb) { \
-       printk(KERN_WARNING "actcapi: alloc_skb failed\n"); \
-       return; \
-}
+#define ACTCAPI_CHKSKB if (!skb) {                                     \
+               printk(KERN_WARNING "actcapi: alloc_skb failed\n");     \
+               return;                                                 \
+       }
 
-#define ACTCAPI_QUEUE_TX { \
-       actcapi_debug_msg(skb, 1); \
-       skb_queue_tail(&card->sndq, skb); \
-       act2000_schedule_tx(card); \
-}
+#define ACTCAPI_QUEUE_TX {                             \
+               actcapi_debug_msg(skb, 1);              \
+               skb_queue_tail(&card->sndq, skb);       \
+               act2000_schedule_tx(card);              \
+       }
 
 int
 actcapi_listen_req(act2000_card *card)
@@ -138,16 +138,16 @@ actcapi_listen_req(act2000_card *card)
        for (i = 0; i < ACT2000_BCH; i++)
                eazmask |= card->bch[i].eazmask;
        ACTCAPI_MKHDR(9, 0x05, 0x00);
-        if (!skb) {
-                printk(KERN_WARNING "actcapi: alloc_skb failed\n");
-                return -ENOMEM;
-        }
+       if (!skb) {
+               printk(KERN_WARNING "actcapi: alloc_skb failed\n");
+               return -ENOMEM;
+       }
        m->msg.listen_req.controller = 0;
        m->msg.listen_req.infomask = 0x3f; /* All information */
        m->msg.listen_req.eazmask = eazmask;
-       m->msg.listen_req.simask = (eazmask)?0x86:0; /* All SI's  */
+       m->msg.listen_req.simask = (eazmask) ? 0x86 : 0; /* All SI's  */
        ACTCAPI_QUEUE_TX;
-        return 0;
+       return 0;
 }
 
 int
@@ -159,7 +159,7 @@ actcapi_connect_req(act2000_card *card, act2000_chan *chan, char *phone,
 
        ACTCAPI_MKHDR((11 + strlen(phone)), 0x02, 0x00);
        if (!skb) {
-                printk(KERN_WARNING "actcapi: alloc_skb failed\n");
+               printk(KERN_WARNING "actcapi: alloc_skb failed\n");
                chan->fsm_state = ACT2000_STATE_NULL;
                return -ENOMEM;
        }
@@ -168,7 +168,7 @@ actcapi_connect_req(act2000_card *card, act2000_chan *chan, char *phone,
        m->msg.connect_req.infomask = 0x3f;
        m->msg.connect_req.si1 = si1;
        m->msg.connect_req.si2 = si2;
-       m->msg.connect_req.eaz = eaz?eaz:'0';
+       m->msg.connect_req.eaz = eaz ? eaz : '0';
        m->msg.connect_req.addr.len = strlen(phone) + 1;
        m->msg.connect_req.addr.tnp = 0x81;
        memcpy(m->msg.connect_req.addr.num, phone, strlen(phone));
@@ -203,21 +203,21 @@ actcapi_manufacturer_req_net(act2000_card *card)
        struct sk_buff *skb;
 
        ACTCAPI_MKHDR(5, 0xff, 0x00);
-        if (!skb) {
-                printk(KERN_WARNING "actcapi: alloc_skb failed\n");
-                return -ENOMEM;
-        }
+       if (!skb) {
+               printk(KERN_WARNING "actcapi: alloc_skb failed\n");
+               return -ENOMEM;
+       }
        m->msg.manufacturer_req_net.manuf_msg = 0x11;
        m->msg.manufacturer_req_net.controller = 1;
-       m->msg.manufacturer_req_net.nettype = (card->ptype == ISDN_PTYPE_EURO)?1:0;
+       m->msg.manufacturer_req_net.nettype = (card->ptype == ISDN_PTYPE_EURO) ? 1 : 0;
        ACTCAPI_QUEUE_TX;
        printk(KERN_INFO "act2000 %s: D-channel protocol now %s\n",
-              card->interface.id, (card->ptype == ISDN_PTYPE_EURO)?"euro":"1tr6");
+              card->interface.id, (card->ptype == ISDN_PTYPE_EURO) ? "euro" : "1tr6");
        card->interface.features &=
                ~(ISDN_FEATURE_P_UNKNOWN | ISDN_FEATURE_P_EURO | ISDN_FEATURE_P_1TR6);
        card->interface.features |=
-               ((card->ptype == ISDN_PTYPE_EURO)?ISDN_FEATURE_P_EURO:ISDN_FEATURE_P_1TR6);
-        return 0;
+               ((card->ptype == ISDN_PTYPE_EURO) ? ISDN_FEATURE_P_EURO : ISDN_FEATURE_P_1TR6);
+       return 0;
 }
 
 /*
@@ -231,16 +231,16 @@ actcapi_manufacturer_req_v42(act2000_card *card, ulong arg)
        struct sk_buff *skb;
 
        ACTCAPI_MKHDR(8, 0xff, 0x00);
-        if (!skb) {
+       if (!skb) {
 
-                printk(KERN_WARNING "actcapi: alloc_skb failed\n");
-                return -ENOMEM;
-        }
+               printk(KERN_WARNING "actcapi: alloc_skb failed\n");
+               return -ENOMEM;
+       }
        m->msg.manufacturer_req_v42.manuf_msg = 0x10;
        m->msg.manufacturer_req_v42.controller = 0;
-       m->msg.manufacturer_req_v42.v42control = (arg?1:0);
+       m->msg.manufacturer_req_v42.v42control = (arg ? 1 : 0);
        ACTCAPI_QUEUE_TX;
-        return 0;
+       return 0;
 }
 #endif  /*  0  */
 
@@ -254,15 +254,15 @@ actcapi_manufacturer_req_errh(act2000_card *card)
        struct sk_buff *skb;
 
        ACTCAPI_MKHDR(4, 0xff, 0x00);
-        if (!skb) {
+       if (!skb) {
 
-                printk(KERN_WARNING "actcapi: alloc_skb failed\n");
-                return -ENOMEM;
-        }
+               printk(KERN_WARNING "actcapi: alloc_skb failed\n");
+               return -ENOMEM;
+       }
        m->msg.manufacturer_req_err.manuf_msg = 0x03;
        m->msg.manufacturer_req_err.controller = 0;
        ACTCAPI_QUEUE_TX;
-        return 0;
+       return 0;
 }
 
 /*
@@ -295,7 +295,7 @@ actcapi_manufacturer_req_msn(act2000_card *card)
                }
                p = p->next;
        }
-        return 0;
+       return 0;
 }
 
 void
@@ -311,24 +311,24 @@ actcapi_select_b2_protocol_req(act2000_card *card, act2000_chan *chan)
               sizeof(m->msg.select_b2_protocol_req.dlpd));
        m->msg.select_b2_protocol_req.dlpd.len = 6;
        switch (chan->l2prot) {
-               case ISDN_PROTO_L2_TRANS:
-                       m->msg.select_b2_protocol_req.protocol = 0x03;
-                       m->msg.select_b2_protocol_req.dlpd.dlen = 4000;
-                       break;
-               case ISDN_PROTO_L2_HDLC:
-                       m->msg.select_b2_protocol_req.protocol = 0x02;
-                       m->msg.select_b2_protocol_req.dlpd.dlen = 4000;
-                       break;
-               case ISDN_PROTO_L2_X75I:
-               case ISDN_PROTO_L2_X75UI:
-               case ISDN_PROTO_L2_X75BUI:
-                       m->msg.select_b2_protocol_req.protocol = 0x01;
-                       m->msg.select_b2_protocol_req.dlpd.dlen = 4000;
-                       m->msg.select_b2_protocol_req.dlpd.laa = 3;
-                       m->msg.select_b2_protocol_req.dlpd.lab = 1;
-                       m->msg.select_b2_protocol_req.dlpd.win = 7;
-                       m->msg.select_b2_protocol_req.dlpd.modulo = 8;
-                       break;
+       case ISDN_PROTO_L2_TRANS:
+               m->msg.select_b2_protocol_req.protocol = 0x03;
+               m->msg.select_b2_protocol_req.dlpd.dlen = 4000;
+               break;
+       case ISDN_PROTO_L2_HDLC:
+               m->msg.select_b2_protocol_req.protocol = 0x02;
+               m->msg.select_b2_protocol_req.dlpd.dlen = 4000;
+               break;
+       case ISDN_PROTO_L2_X75I:
+       case ISDN_PROTO_L2_X75UI:
+       case ISDN_PROTO_L2_X75BUI:
+               m->msg.select_b2_protocol_req.protocol = 0x01;
+               m->msg.select_b2_protocol_req.dlpd.dlen = 4000;
+               m->msg.select_b2_protocol_req.dlpd.laa = 3;
+               m->msg.select_b2_protocol_req.dlpd.lab = 1;
+               m->msg.select_b2_protocol_req.dlpd.win = 7;
+               m->msg.select_b2_protocol_req.dlpd.modulo = 8;
+               break;
        }
        ACTCAPI_QUEUE_TX;
 }
@@ -345,11 +345,11 @@ actcapi_select_b3_protocol_req(act2000_card *card, act2000_chan *chan)
        memset(&m->msg.select_b3_protocol_req.ncpd, 0,
               sizeof(m->msg.select_b3_protocol_req.ncpd));
        switch (chan->l3prot) {
-               case ISDN_PROTO_L3_TRANS:
-                       m->msg.select_b3_protocol_req.protocol = 0x04;
-                       m->msg.select_b3_protocol_req.ncpd.len = 13;
-                       m->msg.select_b3_protocol_req.ncpd.modulo = 8;
-                       break;
+       case ISDN_PROTO_L3_TRANS:
+               m->msg.select_b3_protocol_req.protocol = 0x04;
+               m->msg.select_b3_protocol_req.ncpd.len = 13;
+               m->msg.select_b3_protocol_req.ncpd.modulo = 8;
+               break;
        }
        ACTCAPI_QUEUE_TX;
 }
@@ -434,7 +434,7 @@ actcapi_connect_b3_resp(act2000_card *card, act2000_chan *chan, __u8 rejectcause
        actcapi_msg *m;
        struct sk_buff *skb;
 
-       ACTCAPI_MKHDR((rejectcause?3:17), 0x82, 0x03);
+       ACTCAPI_MKHDR((rejectcause ? 3 : 17), 0x82, 0x03);
        ACTCAPI_CHKSKB;
        m->msg.connect_b3_resp.ncci = chan->ncci;
        m->msg.connect_b3_resp.rejectcause = rejectcause;
@@ -563,10 +563,10 @@ actcapi_data_b3_ind(act2000_card *card, struct sk_buff *skb) {
        blocknr = msg->msg.data_b3_ind.blocknr;
        skb_pull(skb, 19);
        card->interface.rcvcallb_skb(card->myid, chan, skb);
-        if (!(skb = alloc_skb(11, GFP_ATOMIC))) {
-                printk(KERN_WARNING "actcapi: alloc_skb failed\n");
-                return 1;
-        }
+       if (!(skb = alloc_skb(11, GFP_ATOMIC))) {
+               printk(KERN_WARNING "actcapi: alloc_skb failed\n");
+               return 1;
+       }
        msg = (actcapi_msg *)skb_put(skb, 11);
        msg->hdr.len = 11;
        msg->hdr.applicationID = 1;
@@ -595,34 +595,34 @@ handle_ack(act2000_card *card, act2000_chan *chan, __u8 blocknr) {
        spin_lock_irqsave(&card->lock, flags);
        skb = skb_peek(&card->ackq);
        spin_unlock_irqrestore(&card->lock, flags);
-        if (!skb) {
+       if (!skb) {
                printk(KERN_WARNING "act2000: handle_ack nothing found!\n");
                return 0;
        }
-        tmp = skb;
-        while (1) {
-                m = (actcapi_msg *)tmp->data;
-                if ((((m->msg.data_b3_req.fakencci >> 8) & 0xff) == chan->ncci) &&
+       tmp = skb;
+       while (1) {
+               m = (actcapi_msg *)tmp->data;
+               if ((((m->msg.data_b3_req.fakencci >> 8) & 0xff) == chan->ncci) &&
                    (m->msg.data_b3_req.blocknr == blocknr)) {
                        /* found corresponding DATA_B3_REQ */
-                        skb_unlink(tmp, &card->ackq);
+                       skb_unlink(tmp, &card->ackq);
                        chan->queued -= m->msg.data_b3_req.datalen;
                        if (m->msg.data_b3_req.flags)
                                ret = m->msg.data_b3_req.datalen;
                        dev_kfree_skb(tmp);
                        if (chan->queued < 0)
                                chan->queued = 0;
-                        return ret;
-                }
-                spin_lock_irqsave(&card->lock, flags);
-                tmp = skb_peek((struct sk_buff_head *)tmp);
-                spin_unlock_irqrestore(&card->lock, flags);
-                if ((tmp == skb) || (tmp == NULL)) {
+                       return ret;
+               }
+               spin_lock_irqsave(&card->lock, flags);
+               tmp = skb_peek((struct sk_buff_head *)tmp);
+               spin_unlock_irqrestore(&card->lock, flags);
+               if ((tmp == skb) || (tmp == NULL)) {
                        /* reached end of queue */
                        printk(KERN_WARNING "act2000: handle_ack nothing found!\n");
-                        return 0;
+                       return 0;
                }
-        }
+       }
 }
 
 void
@@ -644,294 +644,294 @@ actcapi_dispatch(struct work_struct *work)
                msg = (actcapi_msg *)skb->data;
                ccmd = ((msg->hdr.cmd.cmd << 8) | msg->hdr.cmd.subcmd);
                switch (ccmd) {
-                       case 0x8602:
-                               /* DATA_B3_IND */
-                               if (actcapi_data_b3_ind(card, skb))
-                                       return;
-                               break;
-                       case 0x8601:
-                               /* DATA_B3_CONF */
-                               chan = find_ncci(card, msg->msg.data_b3_conf.ncci);
-                               if ((chan >= 0) && (card->bch[chan].fsm_state == ACT2000_STATE_ACTIVE)) {
-                                       if (msg->msg.data_b3_conf.info != 0)
-                                               printk(KERN_WARNING "act2000: DATA_B3_CONF: %04x\n",
-                                                      msg->msg.data_b3_conf.info);
-                                       len = handle_ack(card, &card->bch[chan],
-                                                        msg->msg.data_b3_conf.blocknr);
-                                       if (len) {
+               case 0x8602:
+                       /* DATA_B3_IND */
+                       if (actcapi_data_b3_ind(card, skb))
+                               return;
+                       break;
+               case 0x8601:
+                       /* DATA_B3_CONF */
+                       chan = find_ncci(card, msg->msg.data_b3_conf.ncci);
+                       if ((chan >= 0) && (card->bch[chan].fsm_state == ACT2000_STATE_ACTIVE)) {
+                               if (msg->msg.data_b3_conf.info != 0)
+                                       printk(KERN_WARNING "act2000: DATA_B3_CONF: %04x\n",
+                                              msg->msg.data_b3_conf.info);
+                               len = handle_ack(card, &card->bch[chan],
+                                                msg->msg.data_b3_conf.blocknr);
+                               if (len) {
+                                       cmd.driver = card->myid;
+                                       cmd.command = ISDN_STAT_BSENT;
+                                       cmd.arg = chan;
+                                       cmd.parm.length = len;
+                                       card->interface.statcallb(&cmd);
+                               }
+                       }
+                       break;
+               case 0x0201:
+                       /* CONNECT_CONF */
+                       chan = find_dialing(card, msg->hdr.msgnum);
+                       if (chan >= 0) {
+                               if (msg->msg.connect_conf.info) {
+                                       card->bch[chan].fsm_state = ACT2000_STATE_NULL;
+                                       cmd.driver = card->myid;
+                                       cmd.command = ISDN_STAT_DHUP;
+                                       cmd.arg = chan;
+                                       card->interface.statcallb(&cmd);
+                               } else {
+                                       card->bch[chan].fsm_state = ACT2000_STATE_OWAIT;
+                                       card->bch[chan].plci = msg->msg.connect_conf.plci;
+                               }
+                       }
+                       break;
+               case 0x0202:
+                       /* CONNECT_IND */
+                       chan = new_plci(card, msg->msg.connect_ind.plci);
+                       if (chan < 0) {
+                               ctmp = (act2000_chan *)tmp;
+                               ctmp->plci = msg->msg.connect_ind.plci;
+                               actcapi_connect_resp(card, ctmp, 0x11); /* All Card-Cannels busy */
+                       } else {
+                               card->bch[chan].fsm_state = ACT2000_STATE_ICALL;
+                               cmd.driver = card->myid;
+                               cmd.command = ISDN_STAT_ICALL;
+                               cmd.arg = chan;
+                               cmd.parm.setup.si1 = msg->msg.connect_ind.si1;
+                               cmd.parm.setup.si2 = msg->msg.connect_ind.si2;
+                               if (card->ptype == ISDN_PTYPE_EURO)
+                                       strcpy(cmd.parm.setup.eazmsn,
+                                              act2000_find_eaz(card, msg->msg.connect_ind.eaz));
+                               else {
+                                       cmd.parm.setup.eazmsn[0] = msg->msg.connect_ind.eaz;
+                                       cmd.parm.setup.eazmsn[1] = 0;
+                               }
+                               memset(cmd.parm.setup.phone, 0, sizeof(cmd.parm.setup.phone));
+                               memcpy(cmd.parm.setup.phone, msg->msg.connect_ind.addr.num,
+                                      msg->msg.connect_ind.addr.len - 1);
+                               cmd.parm.setup.plan = msg->msg.connect_ind.addr.tnp;
+                               cmd.parm.setup.screen = 0;
+                               if (card->interface.statcallb(&cmd) == 2)
+                                       actcapi_connect_resp(card, &card->bch[chan], 0x15); /* Reject Call */
+                       }
+                       break;
+               case 0x0302:
+                       /* CONNECT_ACTIVE_IND */
+                       chan = find_plci(card, msg->msg.connect_active_ind.plci);
+                       if (chan >= 0)
+                               switch (card->bch[chan].fsm_state) {
+                               case ACT2000_STATE_IWAIT:
+                                       actcapi_connect_active_resp(card, &card->bch[chan]);
+                                       break;
+                               case ACT2000_STATE_OWAIT:
+                                       actcapi_connect_active_resp(card, &card->bch[chan]);
+                                       actcapi_select_b2_protocol_req(card, &card->bch[chan]);
+                                       break;
+                               }
+                       break;
+               case 0x8202:
+                       /* CONNECT_B3_IND */
+                       chan = find_plci(card, msg->msg.connect_b3_ind.plci);
+                       if ((chan >= 0) && (card->bch[chan].fsm_state == ACT2000_STATE_IBWAIT)) {
+                               card->bch[chan].ncci = msg->msg.connect_b3_ind.ncci;
+                               actcapi_connect_b3_resp(card, &card->bch[chan], 0);
+                       } else {
+                               ctmp = (act2000_chan *)tmp;
+                               ctmp->ncci = msg->msg.connect_b3_ind.ncci;
+                               actcapi_connect_b3_resp(card, ctmp, 0x11); /* All Card-Cannels busy */
+                       }
+                       break;
+               case 0x8302:
+                       /* CONNECT_B3_ACTIVE_IND */
+                       chan = find_ncci(card, msg->msg.connect_b3_active_ind.ncci);
+                       if ((chan >= 0) && (card->bch[chan].fsm_state == ACT2000_STATE_BWAIT)) {
+                               actcapi_connect_b3_active_resp(card, &card->bch[chan]);
+                               cmd.driver = card->myid;
+                               cmd.command = ISDN_STAT_BCONN;
+                               cmd.arg = chan;
+                               card->interface.statcallb(&cmd);
+                       }
+                       break;
+               case 0x8402:
+                       /* DISCONNECT_B3_IND */
+                       chan = find_ncci(card, msg->msg.disconnect_b3_ind.ncci);
+                       if (chan >= 0) {
+                               ctmp = &card->bch[chan];
+                               actcapi_disconnect_b3_resp(card, ctmp);
+                               switch (ctmp->fsm_state) {
+                               case ACT2000_STATE_ACTIVE:
+                                       ctmp->fsm_state = ACT2000_STATE_DHWAIT2;
+                                       cmd.driver = card->myid;
+                                       cmd.command = ISDN_STAT_BHUP;
+                                       cmd.arg = chan;
+                                       card->interface.statcallb(&cmd);
+                                       break;
+                               case ACT2000_STATE_BHWAIT2:
+                                       actcapi_disconnect_req(card, ctmp);
+                                       ctmp->fsm_state = ACT2000_STATE_DHWAIT;
+                                       cmd.driver = card->myid;
+                                       cmd.command = ISDN_STAT_BHUP;
+                                       cmd.arg = chan;
+                                       card->interface.statcallb(&cmd);
+                                       break;
+                               }
+                       }
+                       break;
+               case 0x0402:
+                       /* DISCONNECT_IND */
+                       chan = find_plci(card, msg->msg.disconnect_ind.plci);
+                       if (chan >= 0) {
+                               ctmp = &card->bch[chan];
+                               actcapi_disconnect_resp(card, ctmp);
+                               ctmp->fsm_state = ACT2000_STATE_NULL;
+                               cmd.driver = card->myid;
+                               cmd.command = ISDN_STAT_DHUP;
+                               cmd.arg = chan;
+                               card->interface.statcallb(&cmd);
+                       } else {
+                               ctmp = (act2000_chan *)tmp;
+                               ctmp->plci = msg->msg.disconnect_ind.plci;
+                               actcapi_disconnect_resp(card, ctmp);
+                       }
+                       break;
+               case 0x4001:
+                       /* SELECT_B2_PROTOCOL_CONF */
+                       chan = find_plci(card, msg->msg.select_b2_protocol_conf.plci);
+                       if (chan >= 0)
+                               switch (card->bch[chan].fsm_state) {
+                               case ACT2000_STATE_ICALL:
+                               case ACT2000_STATE_OWAIT:
+                                       ctmp = &card->bch[chan];
+                                       if (msg->msg.select_b2_protocol_conf.info == 0)
+                                               actcapi_select_b3_protocol_req(card, ctmp);
+                                       else {
+                                               ctmp->fsm_state = ACT2000_STATE_NULL;
                                                cmd.driver = card->myid;
-                                               cmd.command = ISDN_STAT_BSENT;
+                                               cmd.command = ISDN_STAT_DHUP;
                                                cmd.arg = chan;
-                                               cmd.parm.length = len;
                                                card->interface.statcallb(&cmd);
                                        }
+                                       break;
                                }
-                               break;
-                       case 0x0201:
-                               /* CONNECT_CONF */
-                               chan = find_dialing(card, msg->hdr.msgnum);
-                               if (chan >= 0) {
-                                       if (msg->msg.connect_conf.info) {
-                                               card->bch[chan].fsm_state = ACT2000_STATE_NULL;
+                       break;
+               case 0x8001:
+                       /* SELECT_B3_PROTOCOL_CONF */
+                       chan = find_plci(card, msg->msg.select_b3_protocol_conf.plci);
+                       if (chan >= 0)
+                               switch (card->bch[chan].fsm_state) {
+                               case ACT2000_STATE_ICALL:
+                               case ACT2000_STATE_OWAIT:
+                                       ctmp = &card->bch[chan];
+                                       if (msg->msg.select_b3_protocol_conf.info == 0)
+                                               actcapi_listen_b3_req(card, ctmp);
+                                       else {
+                                               ctmp->fsm_state = ACT2000_STATE_NULL;
                                                cmd.driver = card->myid;
                                                cmd.command = ISDN_STAT_DHUP;
                                                cmd.arg = chan;
                                                card->interface.statcallb(&cmd);
-                                       } else {
-                                               card->bch[chan].fsm_state = ACT2000_STATE_OWAIT;
-                                               card->bch[chan].plci = msg->msg.connect_conf.plci;
                                        }
                                }
-                               break;
-                       case 0x0202:
-                               /* CONNECT_IND */
-                               chan = new_plci(card, msg->msg.connect_ind.plci);
-                               if (chan < 0) {
-                                       ctmp = (act2000_chan *)tmp;
-                                       ctmp->plci = msg->msg.connect_ind.plci;
-                                       actcapi_connect_resp(card, ctmp, 0x11); /* All Card-Cannels busy */
-                               } else {
-                                       card->bch[chan].fsm_state = ACT2000_STATE_ICALL;
-                                       cmd.driver = card->myid;
-                                       cmd.command = ISDN_STAT_ICALL;
-                                       cmd.arg = chan;
-                                       cmd.parm.setup.si1 = msg->msg.connect_ind.si1;
-                                       cmd.parm.setup.si2 = msg->msg.connect_ind.si2;
-                                       if (card->ptype == ISDN_PTYPE_EURO)
-                                               strcpy(cmd.parm.setup.eazmsn,
-                                                      act2000_find_eaz(card, msg->msg.connect_ind.eaz));
+                       break;
+               case 0x8101:
+                       /* LISTEN_B3_CONF */
+                       chan = find_plci(card, msg->msg.listen_b3_conf.plci);
+                       if (chan >= 0)
+                               switch (card->bch[chan].fsm_state) {
+                               case ACT2000_STATE_ICALL:
+                                       ctmp = &card->bch[chan];
+                                       if (msg->msg.listen_b3_conf.info == 0)
+                                               actcapi_connect_resp(card, ctmp, 0);
                                        else {
-                                               cmd.parm.setup.eazmsn[0] = msg->msg.connect_ind.eaz;
-                                               cmd.parm.setup.eazmsn[1] = 0;
-                                       }
-                                       memset(cmd.parm.setup.phone, 0, sizeof(cmd.parm.setup.phone));
-                                       memcpy(cmd.parm.setup.phone, msg->msg.connect_ind.addr.num,
-                                              msg->msg.connect_ind.addr.len - 1);
-                                       cmd.parm.setup.plan = msg->msg.connect_ind.addr.tnp;
-                                       cmd.parm.setup.screen = 0;
-                                       if (card->interface.statcallb(&cmd) == 2)
-                                               actcapi_connect_resp(card, &card->bch[chan], 0x15); /* Reject Call */
-                               }
-                               break;
-                       case 0x0302:
-                               /* CONNECT_ACTIVE_IND */
-                               chan = find_plci(card, msg->msg.connect_active_ind.plci);
-                               if (chan >= 0)
-                                       switch (card->bch[chan].fsm_state) {
-                                               case ACT2000_STATE_IWAIT:
-                                                       actcapi_connect_active_resp(card, &card->bch[chan]);
-                                                       break;
-                                               case ACT2000_STATE_OWAIT:
-                                                       actcapi_connect_active_resp(card, &card->bch[chan]);
-                                                       actcapi_select_b2_protocol_req(card, &card->bch[chan]);
-                                                       break;
+                                               ctmp->fsm_state = ACT2000_STATE_NULL;
+                                               cmd.driver = card->myid;
+                                               cmd.command = ISDN_STAT_DHUP;
+                                               cmd.arg = chan;
+                                               card->interface.statcallb(&cmd);
                                        }
-                               break;
-                       case 0x8202:
-                               /* CONNECT_B3_IND */
-                               chan = find_plci(card, msg->msg.connect_b3_ind.plci);
-                               if ((chan >= 0) && (card->bch[chan].fsm_state == ACT2000_STATE_IBWAIT)) {
-                                       card->bch[chan].ncci = msg->msg.connect_b3_ind.ncci;
-                                       actcapi_connect_b3_resp(card, &card->bch[chan], 0);
-                               } else {
-                                       ctmp = (act2000_chan *)tmp;
-                                       ctmp->ncci = msg->msg.connect_b3_ind.ncci;
-                                       actcapi_connect_b3_resp(card, ctmp, 0x11); /* All Card-Cannels busy */
-                               }
-                               break;
-                       case 0x8302:
-                               /* CONNECT_B3_ACTIVE_IND */
-                               chan = find_ncci(card, msg->msg.connect_b3_active_ind.ncci);
-                               if ((chan >= 0) && (card->bch[chan].fsm_state == ACT2000_STATE_BWAIT)) {
-                                       actcapi_connect_b3_active_resp(card, &card->bch[chan]);
-                                       cmd.driver = card->myid;
-                                       cmd.command = ISDN_STAT_BCONN;
-                                       cmd.arg = chan;
-                                       card->interface.statcallb(&cmd);
-                               }
-                               break;
-                       case 0x8402:
-                               /* DISCONNECT_B3_IND */
-                               chan = find_ncci(card, msg->msg.disconnect_b3_ind.ncci);
-                               if (chan >= 0) {
+                                       break;
+                               case ACT2000_STATE_OWAIT:
                                        ctmp = &card->bch[chan];
-                                       actcapi_disconnect_b3_resp(card, ctmp);
-                                       switch (ctmp->fsm_state) {
-                                               case ACT2000_STATE_ACTIVE:
-                                                       ctmp->fsm_state = ACT2000_STATE_DHWAIT2;
-                                                       cmd.driver = card->myid;
-                                                       cmd.command = ISDN_STAT_BHUP;
-                                                       cmd.arg = chan;
-                                                       card->interface.statcallb(&cmd);
-                                                       break;
-                                               case ACT2000_STATE_BHWAIT2:
-                                                       actcapi_disconnect_req(card, ctmp);
-                                                       ctmp->fsm_state = ACT2000_STATE_DHWAIT;
-                                                       cmd.driver = card->myid;
-                                                       cmd.command = ISDN_STAT_BHUP;
-                                                       cmd.arg = chan;
-                                                       card->interface.statcallb(&cmd);
-                                                       break;
+                                       if (msg->msg.listen_b3_conf.info == 0) {
+                                               actcapi_connect_b3_req(card, ctmp);
+                                               ctmp->fsm_state = ACT2000_STATE_OBWAIT;
+                                               cmd.driver = card->myid;
+                                               cmd.command = ISDN_STAT_DCONN;
+                                               cmd.arg = chan;
+                                               card->interface.statcallb(&cmd);
+                                       } else {
+                                               ctmp->fsm_state = ACT2000_STATE_NULL;
+                                               cmd.driver = card->myid;
+                                               cmd.command = ISDN_STAT_DHUP;
+                                               cmd.arg = chan;
+                                               card->interface.statcallb(&cmd);
                                        }
+                                       break;
                                }
-                               break;
-                       case 0x0402:
-                               /* DISCONNECT_IND */
-                               chan = find_plci(card, msg->msg.disconnect_ind.plci);
-                               if (chan >= 0) {
-                                       ctmp = &card->bch[chan];
-                                       actcapi_disconnect_resp(card, ctmp);
+                       break;
+               case 0x8201:
+                       /* CONNECT_B3_CONF */
+                       chan = find_plci(card, msg->msg.connect_b3_conf.plci);
+                       if ((chan >= 0) && (card->bch[chan].fsm_state == ACT2000_STATE_OBWAIT)) {
+                               ctmp = &card->bch[chan];
+                               if (msg->msg.connect_b3_conf.info) {
                                        ctmp->fsm_state = ACT2000_STATE_NULL;
                                        cmd.driver = card->myid;
                                        cmd.command = ISDN_STAT_DHUP;
                                        cmd.arg = chan;
                                        card->interface.statcallb(&cmd);
                                } else {
-                                       ctmp = (act2000_chan *)tmp;
-                                       ctmp->plci = msg->msg.disconnect_ind.plci;
-                                       actcapi_disconnect_resp(card, ctmp);
+                                       ctmp->ncci = msg->msg.connect_b3_conf.ncci;
+                                       ctmp->fsm_state = ACT2000_STATE_BWAIT;
                                }
-                               break;
-                       case 0x4001:
-                               /* SELECT_B2_PROTOCOL_CONF */
-                               chan = find_plci(card, msg->msg.select_b2_protocol_conf.plci);
-                               if (chan >= 0)
-                                       switch (card->bch[chan].fsm_state) {
-                                               case ACT2000_STATE_ICALL:
-                                               case ACT2000_STATE_OWAIT:
-                                                       ctmp = &card->bch[chan];
-                                                       if (msg->msg.select_b2_protocol_conf.info == 0)
-                                                               actcapi_select_b3_protocol_req(card, ctmp);
-                                                       else {
-                                                               ctmp->fsm_state = ACT2000_STATE_NULL;
-                                                               cmd.driver = card->myid;
-                                                               cmd.command = ISDN_STAT_DHUP;
-                                                               cmd.arg = chan;
-                                                               card->interface.statcallb(&cmd);
-                                                       }
-                                                       break;
-                                       }
-                               break;
-                       case 0x8001:
-                               /* SELECT_B3_PROTOCOL_CONF */
-                               chan = find_plci(card, msg->msg.select_b3_protocol_conf.plci);
-                               if (chan >= 0)
-                                       switch (card->bch[chan].fsm_state) {
-                                               case ACT2000_STATE_ICALL:
-                                               case ACT2000_STATE_OWAIT:
-                                                       ctmp = &card->bch[chan];
-                                                       if (msg->msg.select_b3_protocol_conf.info == 0)
-                                                               actcapi_listen_b3_req(card, ctmp);
-                                                       else {
-                                                               ctmp->fsm_state = ACT2000_STATE_NULL;
-                                                               cmd.driver = card->myid;
-                                                               cmd.command = ISDN_STAT_DHUP;
-                                                               cmd.arg = chan;
-                                                               card->interface.statcallb(&cmd);
-                                                       }
-                                       }
-                               break;
-                       case 0x8101:
-                               /* LISTEN_B3_CONF */
-                               chan = find_plci(card, msg->msg.listen_b3_conf.plci);
-                               if (chan >= 0)
-                                       switch (card->bch[chan].fsm_state) {
-                                               case ACT2000_STATE_ICALL:
-                                                       ctmp = &card->bch[chan];
-                                                       if (msg->msg.listen_b3_conf.info == 0)
-                                                               actcapi_connect_resp(card, ctmp, 0);
-                                                       else {
-                                                               ctmp->fsm_state = ACT2000_STATE_NULL;
-                                                               cmd.driver = card->myid;
-                                                               cmd.command = ISDN_STAT_DHUP;
-                                                               cmd.arg = chan;
-                                                               card->interface.statcallb(&cmd);
-                                                       }
-                                                       break;
-                                               case ACT2000_STATE_OWAIT:
-                                                       ctmp = &card->bch[chan];
-                                                       if (msg->msg.listen_b3_conf.info == 0) {
-                                                               actcapi_connect_b3_req(card, ctmp);
-                                                               ctmp->fsm_state = ACT2000_STATE_OBWAIT;
-                                                               cmd.driver = card->myid;
-                                                               cmd.command = ISDN_STAT_DCONN;
-                                                               cmd.arg = chan;
-                                                               card->interface.statcallb(&cmd);
-                                                       } else {
-                                                               ctmp->fsm_state = ACT2000_STATE_NULL;
-                                                               cmd.driver = card->myid;
-                                                               cmd.command = ISDN_STAT_DHUP;
-                                                               cmd.arg = chan;
-                                                               card->interface.statcallb(&cmd);
-                                                       }
-                                                       break;
-                                       }
-                               break;
-                       case 0x8201:
-                               /* CONNECT_B3_CONF */
-                               chan = find_plci(card, msg->msg.connect_b3_conf.plci);
-                               if ((chan >= 0) && (card->bch[chan].fsm_state == ACT2000_STATE_OBWAIT)) {
-                                       ctmp = &card->bch[chan];
-                                       if (msg->msg.connect_b3_conf.info) {
-                                               ctmp->fsm_state = ACT2000_STATE_NULL;
+                       }
+                       break;
+               case 0x8401:
+                       /* DISCONNECT_B3_CONF */
+                       chan = find_ncci(card, msg->msg.disconnect_b3_conf.ncci);
+                       if ((chan >= 0) && (card->bch[chan].fsm_state == ACT2000_STATE_BHWAIT))
+                               card->bch[chan].fsm_state = ACT2000_STATE_BHWAIT2;
+                       break;
+               case 0x0702:
+                       /* INFO_IND */
+                       chan = find_plci(card, msg->msg.info_ind.plci);
+                       if (chan >= 0)
+                               /* TODO: Eval Charging info / cause */
+                               actcapi_info_resp(card, &card->bch[chan]);
+                       break;
+               case 0x0401:
+                       /* LISTEN_CONF */
+               case 0x0501:
+                       /* LISTEN_CONF */
+               case 0xff01:
+                       /* MANUFACTURER_CONF */
+                       break;
+               case 0xff02:
+                       /* MANUFACTURER_IND */
+                       if (msg->msg.manuf_msg == 3) {
+                               memset(tmp, 0, sizeof(tmp));
+                               strncpy(tmp,
+                                       &msg->msg.manufacturer_ind_err.errstring,
+                                       msg->hdr.len - 16);
+                               if (msg->msg.manufacturer_ind_err.errcode)
+                                       printk(KERN_WARNING "act2000: %s\n", tmp);
+                               else {
+                                       printk(KERN_DEBUG "act2000: %s\n", tmp);
+                                       if ((!strncmp(tmp, "INFO: Trace buffer con", 22)) ||
+                                           (!strncmp(tmp, "INFO: Compile Date/Tim", 22))) {
+                                               card->flags |= ACT2000_FLAGS_RUNNING;
+                                               cmd.command = ISDN_STAT_RUN;
                                                cmd.driver = card->myid;
-                                               cmd.command = ISDN_STAT_DHUP;
-                                               cmd.arg = chan;
+                                               cmd.arg = 0;
+                                               actcapi_manufacturer_req_net(card);
+                                               actcapi_manufacturer_req_msn(card);
+                                               actcapi_listen_req(card);
                                                card->interface.statcallb(&cmd);
-                                       } else {
-                                               ctmp->ncci = msg->msg.connect_b3_conf.ncci;
-                                               ctmp->fsm_state = ACT2000_STATE_BWAIT;
                                        }
                                }
-                               break;
-                       case 0x8401:
-                               /* DISCONNECT_B3_CONF */
-                               chan = find_ncci(card, msg->msg.disconnect_b3_conf.ncci);
-                               if ((chan >= 0) && (card->bch[chan].fsm_state == ACT2000_STATE_BHWAIT))
-                                       card->bch[chan].fsm_state = ACT2000_STATE_BHWAIT2;
-                               break;
-                       case 0x0702:
-                               /* INFO_IND */
-                               chan = find_plci(card, msg->msg.info_ind.plci);
-                               if (chan >= 0)
-                                       /* TODO: Eval Charging info / cause */
-                                       actcapi_info_resp(card, &card->bch[chan]);
-                               break;
-                       case 0x0401:
-                               /* LISTEN_CONF */
-                       case 0x0501:
-                               /* LISTEN_CONF */
-                       case 0xff01:
-                               /* MANUFACTURER_CONF */
-                               break;
-                       case 0xff02:
-                               /* MANUFACTURER_IND */
-                               if (msg->msg.manuf_msg == 3) {
-                                       memset(tmp, 0, sizeof(tmp));
-                                       strncpy(tmp,
-                                               &msg->msg.manufacturer_ind_err.errstring,
-                                               msg->hdr.len - 16);
-                                       if (msg->msg.manufacturer_ind_err.errcode)
-                                               printk(KERN_WARNING "act2000: %s\n", tmp);
-                                       else {
-                                               printk(KERN_DEBUG "act2000: %s\n", tmp);
-                                               if ((!strncmp(tmp, "INFO: Trace buffer con", 22)) ||
-                                                   (!strncmp(tmp, "INFO: Compile Date/Tim", 22))) {
-                                                       card->flags |= ACT2000_FLAGS_RUNNING;
-                                                       cmd.command = ISDN_STAT_RUN;
-                                                       cmd.driver = card->myid;
-                                                       cmd.arg = 0;
-                                                       actcapi_manufacturer_req_net(card);
-                                                       actcapi_manufacturer_req_msn(card);
-                                                       actcapi_listen_req(card);
-                                                       card->interface.statcallb(&cmd);
-                                               }
-                                       }
-                               }
-                               break;
-                       default:
-                               printk(KERN_WARNING "act2000: UNHANDLED Message %04x\n", ccmd);
-                               break;
+                       }
+                       break;
+               default:
+                       printk(KERN_WARNING "act2000: UNHANDLED Message %04x\n", ccmd);
+                       break;
                }
                dev_kfree_skb(skb);
        }
@@ -1015,7 +1015,7 @@ actcapi_debug_msg(struct sk_buff *skb, int direction)
        char *descr;
        int i;
        char tmp[170];
-       
+
 #ifndef DEBUG_DATA_MSG
        if (msg->hdr.cmd.cmd == 0x86)
                return;
@@ -1030,151 +1030,151 @@ actcapi_debug_msg(struct sk_buff *skb, int direction)
                        descr = valid_msg[i].description;
                        break;
                }
-       printk(KERN_DEBUG "%s %s msg\n", direction?"Outgoing":"Incoming", descr);
+       printk(KERN_DEBUG "%s %s msg\n", direction ? "Outgoing" : "Incoming", descr);
        printk(KERN_DEBUG " ApplID = %d\n", msg->hdr.applicationID);
        printk(KERN_DEBUG " Len    = %d\n", msg->hdr.len);
        printk(KERN_DEBUG " MsgNum = 0x%04x\n", msg->hdr.msgnum);
        printk(KERN_DEBUG " Cmd    = 0x%02x\n", msg->hdr.cmd.cmd);
        printk(KERN_DEBUG " SubCmd = 0x%02x\n", msg->hdr.cmd.subcmd);
        switch (i) {
-               case 0:
-                       /* DATA B3 IND */
-                       printk(KERN_DEBUG " BLOCK = 0x%02x\n",
-                              msg->msg.data_b3_ind.blocknr);
-                       break;
-               case 2:
-                       /* CONNECT CONF */
-                       printk(KERN_DEBUG " PLCI = 0x%04x\n",
-                              msg->msg.connect_conf.plci);
-                       printk(KERN_DEBUG " Info = 0x%04x\n",
-                              msg->msg.connect_conf.info);
-                       break;
+       case 0:
+               /* DATA B3 IND */
+               printk(KERN_DEBUG " BLOCK = 0x%02x\n",
+                      msg->msg.data_b3_ind.blocknr);
+               break;
+       case 2:
+               /* CONNECT CONF */
+               printk(KERN_DEBUG " PLCI = 0x%04x\n",
+                      msg->msg.connect_conf.plci);
+               printk(KERN_DEBUG " Info = 0x%04x\n",
+                      msg->msg.connect_conf.info);
+               break;
+       case 3:
+               /* CONNECT IND */
+               printk(KERN_DEBUG " PLCI = 0x%04x\n",
+                      msg->msg.connect_ind.plci);
+               printk(KERN_DEBUG " Contr = %d\n",
+                      msg->msg.connect_ind.controller);
+               printk(KERN_DEBUG " SI1   = %d\n",
+                      msg->msg.connect_ind.si1);
+               printk(KERN_DEBUG " SI2   = %d\n",
+                      msg->msg.connect_ind.si2);
+               printk(KERN_DEBUG " EAZ   = '%c'\n",
+                      msg->msg.connect_ind.eaz);
+               actcapi_debug_caddr(&msg->msg.connect_ind.addr);
+               break;
+       case 5:
+               /* CONNECT ACTIVE IND */
+               printk(KERN_DEBUG " PLCI = 0x%04x\n",
+                      msg->msg.connect_active_ind.plci);
+               actcapi_debug_caddr(&msg->msg.connect_active_ind.addr);
+               break;
+       case 8:
+               /* LISTEN CONF */
+               printk(KERN_DEBUG " Contr = %d\n",
+                      msg->msg.listen_conf.controller);
+               printk(KERN_DEBUG " Info = 0x%04x\n",
+                      msg->msg.listen_conf.info);
+               break;
+       case 11:
+               /* INFO IND */
+               printk(KERN_DEBUG " PLCI = 0x%04x\n",
+                      msg->msg.info_ind.plci);
+               printk(KERN_DEBUG " Imsk = 0x%04x\n",
+                      msg->msg.info_ind.nr.mask);
+               if (msg->hdr.len > 12) {
+                       int l = msg->hdr.len - 12;
+                       int j;
+                       char *p = tmp;
+                       for (j = 0; j < l; j++)
+                               p += sprintf(p, "%02x ", msg->msg.info_ind.el.display[j]);
+                       printk(KERN_DEBUG " D = '%s'\n", tmp);
+               }
+               break;
+       case 14:
+               /* SELECT B2 PROTOCOL CONF */
+               printk(KERN_DEBUG " PLCI = 0x%04x\n",
+                      msg->msg.select_b2_protocol_conf.plci);
+               printk(KERN_DEBUG " Info = 0x%04x\n",
+                      msg->msg.select_b2_protocol_conf.info);
+               break;
+       case 15:
+               /* SELECT B3 PROTOCOL CONF */
+               printk(KERN_DEBUG " PLCI = 0x%04x\n",
+                      msg->msg.select_b3_protocol_conf.plci);
+               printk(KERN_DEBUG " Info = 0x%04x\n",
+                      msg->msg.select_b3_protocol_conf.info);
+               break;
+       case 16:
+               /* LISTEN B3 CONF */
+               printk(KERN_DEBUG " PLCI = 0x%04x\n",
+                      msg->msg.listen_b3_conf.plci);
+               printk(KERN_DEBUG " Info = 0x%04x\n",
+                      msg->msg.listen_b3_conf.info);
+               break;
+       case 18:
+               /* CONNECT B3 IND */
+               printk(KERN_DEBUG " NCCI = 0x%04x\n",
+                      msg->msg.connect_b3_ind.ncci);
+               printk(KERN_DEBUG " PLCI = 0x%04x\n",
+                      msg->msg.connect_b3_ind.plci);
+               actcapi_debug_ncpi(&msg->msg.connect_b3_ind.ncpi);
+               break;
+       case 19:
+               /* CONNECT B3 ACTIVE IND */
+               printk(KERN_DEBUG " NCCI = 0x%04x\n",
+                      msg->msg.connect_b3_active_ind.ncci);
+               actcapi_debug_ncpi(&msg->msg.connect_b3_active_ind.ncpi);
+               break;
+       case 26:
+               /* MANUFACTURER IND */
+               printk(KERN_DEBUG " Mmsg = 0x%02x\n",
+                      msg->msg.manufacturer_ind_err.manuf_msg);
+               switch (msg->msg.manufacturer_ind_err.manuf_msg) {
                case 3:
-                       /* CONNECT IND */
-                       printk(KERN_DEBUG " PLCI = 0x%04x\n",
-                              msg->msg.connect_ind.plci);
                        printk(KERN_DEBUG " Contr = %d\n",
-                              msg->msg.connect_ind.controller);
-                       printk(KERN_DEBUG " SI1   = %d\n",
-                              msg->msg.connect_ind.si1);
-                       printk(KERN_DEBUG " SI2   = %d\n",
-                              msg->msg.connect_ind.si2);
-                       printk(KERN_DEBUG " EAZ   = '%c'\n",
-                              msg->msg.connect_ind.eaz);
-                       actcapi_debug_caddr(&msg->msg.connect_ind.addr);
-                       break;
-               case 5:
-                       /* CONNECT ACTIVE IND */
-                       printk(KERN_DEBUG " PLCI = 0x%04x\n",
-                              msg->msg.connect_active_ind.plci);
-                       actcapi_debug_caddr(&msg->msg.connect_active_ind.addr);
-                       break;
-               case 8:
-                       /* LISTEN CONF */
-                       printk(KERN_DEBUG " Contr = %d\n",
-                              msg->msg.listen_conf.controller);
-                       printk(KERN_DEBUG " Info = 0x%04x\n",
-                              msg->msg.listen_conf.info);
-                       break;
-               case 11:
-                       /* INFO IND */
-                       printk(KERN_DEBUG " PLCI = 0x%04x\n",
-                              msg->msg.info_ind.plci);
-                       printk(KERN_DEBUG " Imsk = 0x%04x\n",
-                              msg->msg.info_ind.nr.mask);
-                       if (msg->hdr.len > 12) {
-                               int l = msg->hdr.len - 12;
-                               int j;
-                               char *p = tmp;
-                               for (j = 0; j < l ; j++)
-                                       p += sprintf(p, "%02x ", msg->msg.info_ind.el.display[j]);
-                               printk(KERN_DEBUG " D = '%s'\n", tmp);
-                       }
-                       break;
-               case 14:
-                       /* SELECT B2 PROTOCOL CONF */
-                       printk(KERN_DEBUG " PLCI = 0x%04x\n",
-                              msg->msg.select_b2_protocol_conf.plci);
-                       printk(KERN_DEBUG " Info = 0x%04x\n",
-                              msg->msg.select_b2_protocol_conf.info);
-                       break;
-               case 15:
-                       /* SELECT B3 PROTOCOL CONF */
-                       printk(KERN_DEBUG " PLCI = 0x%04x\n",
-                              msg->msg.select_b3_protocol_conf.plci);
-                       printk(KERN_DEBUG " Info = 0x%04x\n",
-                              msg->msg.select_b3_protocol_conf.info);
-                       break;
-               case 16:
-                       /* LISTEN B3 CONF */
-                       printk(KERN_DEBUG " PLCI = 0x%04x\n",
-                              msg->msg.listen_b3_conf.plci);
-                       printk(KERN_DEBUG " Info = 0x%04x\n",
-                              msg->msg.listen_b3_conf.info);
-                       break;
-               case 18:
-                       /* CONNECT B3 IND */
-                       printk(KERN_DEBUG " NCCI = 0x%04x\n",
-                              msg->msg.connect_b3_ind.ncci);
-                       printk(KERN_DEBUG " PLCI = 0x%04x\n",
-                              msg->msg.connect_b3_ind.plci);
-                       actcapi_debug_ncpi(&msg->msg.connect_b3_ind.ncpi);
-                       break;
-               case 19:
-                       /* CONNECT B3 ACTIVE IND */
-                       printk(KERN_DEBUG " NCCI = 0x%04x\n",
-                              msg->msg.connect_b3_active_ind.ncci);
-                       actcapi_debug_ncpi(&msg->msg.connect_b3_active_ind.ncpi);
-                       break;
-               case 26:
-                       /* MANUFACTURER IND */
-                       printk(KERN_DEBUG " Mmsg = 0x%02x\n",
-                              msg->msg.manufacturer_ind_err.manuf_msg);
-                       switch (msg->msg.manufacturer_ind_err.manuf_msg) {
-                               case 3:
-                                       printk(KERN_DEBUG " Contr = %d\n",
-                                              msg->msg.manufacturer_ind_err.controller);
-                                       printk(KERN_DEBUG " Code = 0x%08x\n",
-                                              msg->msg.manufacturer_ind_err.errcode);
-                                       memset(tmp, 0, sizeof(tmp));
-                                       strncpy(tmp, &msg->msg.manufacturer_ind_err.errstring,
-                                               msg->hdr.len - 16);
-                                       printk(KERN_DEBUG " Emsg = '%s'\n", tmp);
-                                       break;
-                       }
-                       break;
-               case 30:
-                       /* LISTEN REQ */
-                       printk(KERN_DEBUG " Imsk = 0x%08x\n",
-                              msg->msg.listen_req.infomask);
-                       printk(KERN_DEBUG " Emsk = 0x%04x\n",
-                              msg->msg.listen_req.eazmask);
-                       printk(KERN_DEBUG " Smsk = 0x%04x\n",
-                              msg->msg.listen_req.simask);
-                       break;
-               case 35:
-                       /* SELECT_B2_PROTOCOL_REQ */
-                       printk(KERN_DEBUG " PLCI  = 0x%04x\n",
-                              msg->msg.select_b2_protocol_req.plci);
-                       printk(KERN_DEBUG " prot  = 0x%02x\n",
-                              msg->msg.select_b2_protocol_req.protocol);
-                       if (msg->hdr.len >= 11)
-                               printk(KERN_DEBUG "No dlpd\n");
-                       else
-                               actcapi_debug_dlpd(&msg->msg.select_b2_protocol_req.dlpd);
-                       break;
-               case 44:
-                       /* CONNECT RESP */
-                       printk(KERN_DEBUG " PLCI  = 0x%04x\n",
-                              msg->msg.connect_resp.plci);
-                       printk(KERN_DEBUG " CAUSE = 0x%02x\n",
-                              msg->msg.connect_resp.rejectcause);
-                       break;
-               case 45:
-                       /* CONNECT ACTIVE RESP */
-                       printk(KERN_DEBUG " PLCI  = 0x%04x\n",
-                              msg->msg.connect_active_resp.plci);
+                              msg->msg.manufacturer_ind_err.controller);
+                       printk(KERN_DEBUG " Code = 0x%08x\n",
+                              msg->msg.manufacturer_ind_err.errcode);
+                       memset(tmp, 0, sizeof(tmp));
+                       strncpy(tmp, &msg->msg.manufacturer_ind_err.errstring,
+                               msg->hdr.len - 16);
+                       printk(KERN_DEBUG " Emsg = '%s'\n", tmp);
                        break;
+               }
+               break;
+       case 30:
+               /* LISTEN REQ */
+               printk(KERN_DEBUG " Imsk = 0x%08x\n",
+                      msg->msg.listen_req.infomask);
+               printk(KERN_DEBUG " Emsk = 0x%04x\n",
+                      msg->msg.listen_req.eazmask);
+               printk(KERN_DEBUG " Smsk = 0x%04x\n",
+                      msg->msg.listen_req.simask);
+               break;
+       case 35:
+               /* SELECT_B2_PROTOCOL_REQ */
+               printk(KERN_DEBUG " PLCI  = 0x%04x\n",
+                      msg->msg.select_b2_protocol_req.plci);
+               printk(KERN_DEBUG " prot  = 0x%02x\n",
+                      msg->msg.select_b2_protocol_req.protocol);
+               if (msg->hdr.len >= 11)
+                       printk(KERN_DEBUG "No dlpd\n");
+               else
+                       actcapi_debug_dlpd(&msg->msg.select_b2_protocol_req.dlpd);
+               break;
+       case 44:
+               /* CONNECT RESP */
+               printk(KERN_DEBUG " PLCI  = 0x%04x\n",
+                      msg->msg.connect_resp.plci);
+               printk(KERN_DEBUG " CAUSE = 0x%02x\n",
+                      msg->msg.connect_resp.rejectcause);
+               break;
+       case 45:
+               /* CONNECT ACTIVE RESP */
+               printk(KERN_DEBUG " PLCI  = 0x%04x\n",
+                      msg->msg.connect_active_resp.plci);
+               break;
        }
 }
 #endif
index e55f6a9..01ccdec 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Author       Fritz Elfert
  * Copyright    by Fritz Elfert      <fritz@isdn4linux.de>
- * 
+ *
  * This software may be used and distributed according to the terms
  * of the GNU General Public License, incorporated herein by reference.
  *
@@ -46,10 +46,10 @@ typedef struct actcapi_addr {
 typedef  union actcapi_infonr {              /* info number                  */
        __u16 mask;                          /* info-mask field              */
        struct bmask {                       /* bit definitions              */
-               unsigned  codes : 3;         /* code set                     */
-               unsigned  rsvd  : 5;         /* reserved                     */
-               unsigned  svind : 1;         /* single, variable length ind. */
-               unsigned  wtype : 7;         /* W-element type               */
+               unsigned  codes:3;           /* code set                     */
+               unsigned  rsvd:5;            /* reserved                     */
+               unsigned  svind:1;           /* single, variable length ind. */
+               unsigned  wtype:7;           /* W-element type               */
        } bmask;
 } actcapi_infonr;
 
@@ -59,13 +59,13 @@ typedef union  actcapi_infoel {              /* info element                 */
        __u8 display[40];                    /* display contents             */
        __u8 uuinfo[40];                     /* User-user info field         */
        struct cause {                       /* Cause information            */
-               unsigned ext2  : 1;          /* extension                    */
-               unsigned cod   : 2;          /* coding standard              */
-               unsigned spare : 1;          /* spare                        */
-               unsigned loc   : 4;          /* location                     */
-               unsigned ext1  : 1;          /* extension                    */
-               unsigned cval  : 7;          /* Cause value                  */
-       } cause;                     
+               unsigned ext2:1;             /* extension                    */
+               unsigned cod:2;              /* coding standard              */
+               unsigned spare:1;            /* spare                        */
+               unsigned loc:4;              /* location                     */
+               unsigned ext1:1;             /* extension                    */
+               unsigned cval:7;             /* Cause value                  */
+       } cause;
        struct charge {                      /* Charging information         */
                __u8 toc;                    /* type of charging info        */
                __u8 unit[10];               /* charging units               */
@@ -111,14 +111,14 @@ typedef struct actcapi_ncpd {
  * Bit 5-7  = Controller
  * Bit 8-15 = NCCI
  */
-#define MAKE_NCCI(plci,contr,ncci) \
-        ((plci & 0x1f) | ((contr & 0x7) << 5) | ((ncci & 0xff) << 8))
+#define MAKE_NCCI(plci, contr, ncci)                                   \
+       ((plci & 0x1f) | ((contr & 0x7) << 5) | ((ncci & 0xff) << 8))
 
-#define EVAL_NCCI(fakencci,plci,contr,ncci) { \
-       plci  = fakencci & 0x1f; \
-       contr = (fakencci >> 5) & 0x7; \
-       ncci  = (fakencci >> 8) & 0xff; \
-}
+#define EVAL_NCCI(fakencci, plci, contr, ncci) {       \
+               plci  = fakencci & 0x1f;                \
+               contr = (fakencci >> 5) & 0x7;          \
+               ncci  = (fakencci >> 8) & 0xff;         \
+       }
 
 /*
  * Layout of PLCI field in a B3 DATA CAPI message is different from
@@ -128,13 +128,13 @@ typedef struct actcapi_ncpd {
  * Bit 5-7  = Controller
  * Bit 8-15 = reserved (must be 0)
  */
-#define MAKE_PLCI(plci,contr) \
-        ((plci & 0x1f) | ((contr & 0x7) << 5))
+#define MAKE_PLCI(plci, contr)                 \
+       ((plci & 0x1f) | ((contr & 0x7) << 5))
 
-#define EVAL_PLCI(fakeplci,plci,contr) { \
-       plci  = fakeplci & 0x1f; \
-       contr = (fakeplci >> 5) & 0x7; \
-}
+#define EVAL_PLCI(fakeplci, plci, contr) {     \
+               plci  = fakeplci & 0x1f;        \
+               contr = (fakeplci >> 5) & 0x7;  \
+       }
 
 typedef struct actcapi_msg {
        actcapi_msghdr hdr;
index 05ed72c..b4147c0 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Author       Fritz Elfert
  * Copyright    by Fritz Elfert      <fritz@isdn4linux.de>
- * 
+ *
  * This software may be used and distributed according to the terms
  * of the GNU General Public License, incorporated herein by reference.
  *
@@ -21,8 +21,8 @@
 
 static unsigned short act2000_isa_ports[] =
 {
-        0x0200, 0x0240, 0x0280, 0x02c0, 0x0300, 0x0340, 0x0380,
-        0xcfe0, 0xcfa0, 0xcf60, 0xcf20, 0xcee0, 0xcea0, 0xce60,
+       0x0200, 0x0240, 0x0280, 0x02c0, 0x0300, 0x0340, 0x0380,
+       0xcfe0, 0xcfa0, 0xcf60, 0xcf20, 0xcee0, 0xcea0, 0xce60,
 };
 
 static act2000_card *cards = (act2000_card *) NULL;
@@ -33,14 +33,14 @@ static int   act_port = -1;  /* -1 = Autoprobe  */
 static int   act_irq  = -1;
 static char *act_id   = "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";
 
-MODULE_DESCRIPTION(       "ISDN4Linux: Driver for IBM Active 2000 ISDN card");
-MODULE_AUTHOR(            "Fritz Elfert");
-MODULE_LICENSE(           "GPL");
+MODULE_DESCRIPTION("ISDN4Linux: Driver for IBM Active 2000 ISDN card");
+MODULE_AUTHOR("Fritz Elfert");
+MODULE_LICENSE("GPL");
 MODULE_PARM_DESC(act_bus, "BusType of first card, 1=ISA, 2=MCA, 3=PCMCIA, currently only ISA");
 MODULE_PARM_DESC(membase, "Base port address of first card");
 MODULE_PARM_DESC(act_irq, "IRQ of first card");
-MODULE_PARM_DESC(act_id,  "ID-String of first card");
-module_param(act_bus,  int, 0);
+MODULE_PARM_DESC(act_id, "ID-String of first card");
+module_param(act_bus, int, 0);
 module_param(act_port, int, 0);
 module_param(act_irq, int, 0);
 module_param(act_id, charp, 0);
@@ -51,7 +51,7 @@ static act2000_chan *
 find_channel(act2000_card *card, int channel)
 {
        if ((channel >= 0) && (channel < ACT2000_BCH))
-               return &(card->bch[channel]);
+               return &(card->bch[channel]);
        printk(KERN_WARNING "act2000: Invalid channel %d\n", channel);
        return NULL;
 }
@@ -84,7 +84,7 @@ act2000_clear_msn(act2000_card *card)
 static __u16
 act2000_find_msn(act2000_card *card, char *msn, int ia5)
 {
-        struct msn_entry *p = card->msn_list;
+       struct msn_entry *p = card->msn_list;
        __u8 eaz = '0';
 
        while (p) {
@@ -107,14 +107,14 @@ act2000_find_msn(act2000_card *card, char *msn, int ia5)
 char *
 act2000_find_eaz(act2000_card *card, char eaz)
 {
-        struct msn_entry *p = card->msn_list;
+       struct msn_entry *p = card->msn_list;
 
        while (p) {
                if (p->eaz == eaz)
-                       return(p->msn);
+                       return (p->msn);
                p = p->next;
        }
-       return("\0");
+       return ("\0");
 }
 
 /*
@@ -126,11 +126,11 @@ act2000_find_eaz(act2000_card *card, char eaz)
 static int
 act2000_set_msn(act2000_card *card, char *eazmsn)
 {
-        struct msn_entry *p = card->msn_list;
-        struct msn_entry *q = NULL;
+       struct msn_entry *p = card->msn_list;
+       struct msn_entry *q = NULL;
        unsigned long flags;
        int i;
-       
+
        if (!strlen(eazmsn))
                return 0;
        if (strlen(eazmsn) > 16)
@@ -138,7 +138,7 @@ act2000_set_msn(act2000_card *card, char *eazmsn)
        for (i = 0; i < strlen(eazmsn); i++)
                if (!isdigit(eazmsn[i]))
                        return -EINVAL;
-        if (strlen(eazmsn) == 1) {
+       if (strlen(eazmsn) == 1) {
                /* Delete a single MSN */
                while (p) {
                        if (p->eaz == eazmsn[0]) {
@@ -158,7 +158,7 @@ act2000_set_msn(act2000_card *card, char *eazmsn)
                        p = p->next;
                }
                return 0;
-        }
+       }
        /* Add a single MSN */
        while (p) {
                /* Found in list, replace MSN */
@@ -198,14 +198,14 @@ act2000_transmit(struct work_struct *work)
                container_of(work, struct act2000_card, snd_tq);
 
        switch (card->bus) {
-               case ACT2000_BUS_ISA:
-                       act2000_isa_send(card);
-                       break;
-               case ACT2000_BUS_PCMCIA:
-               case ACT2000_BUS_MCA:
-               default:
-                       printk(KERN_WARNING
-                              "act2000_transmit: Illegal bustype %d\n", card->bus);
+       case ACT2000_BUS_ISA:
+               act2000_isa_send(card);
+               break;
+       case ACT2000_BUS_PCMCIA:
+       case ACT2000_BUS_MCA:
+       default:
+               printk(KERN_WARNING
+                      "act2000_transmit: Illegal bustype %d\n", card->bus);
        }
 }
 
@@ -216,221 +216,221 @@ act2000_receive(struct work_struct *work)
                container_of(work, struct act2000_card, poll_tq);
 
        switch (card->bus) {
-               case ACT2000_BUS_ISA:
-                       act2000_isa_receive(card);
-                       break;
-               case ACT2000_BUS_PCMCIA:
-               case ACT2000_BUS_MCA:
-               default:
-                       printk(KERN_WARNING
-                              "act2000_receive: Illegal bustype %d\n", card->bus);
+       case ACT2000_BUS_ISA:
+               act2000_isa_receive(card);
+               break;
+       case ACT2000_BUS_PCMCIA:
+       case ACT2000_BUS_MCA:
+       default:
+               printk(KERN_WARNING
+                      "act2000_receive: Illegal bustype %d\n", card->bus);
        }
 }
 
 static void
 act2000_poll(unsigned long data)
 {
-       act2000_card * card = (act2000_card *)data;
+       act2000_card *card = (act2000_card *)data;
        unsigned long flags;
 
        act2000_receive(&card->poll_tq);
        spin_lock_irqsave(&card->lock, flags);
-       mod_timer(&card->ptimer, jiffies+3);
+       mod_timer(&card->ptimer, jiffies + 3);
        spin_unlock_irqrestore(&card->lock, flags);
 }
 
 static int
-act2000_command(act2000_card * card, isdn_ctrl * c)
+act2000_command(act2000_card *card, isdn_ctrl *c)
 {
-        ulong a;
-        act2000_chan *chan;
+       ulong a;
+       act2000_chan *chan;
        act2000_cdef cdef;
        isdn_ctrl cmd;
        char tmp[17];
        int ret;
        unsigned long flags;
        void __user *arg;
-        switch (c->command) {
-               case ISDN_CMD_IOCTL:
-                       memcpy(&a, c->parm.num, sizeof(ulong));
-                       arg = (void __user *)a;
-                       switch (c->arg) {
-                               case ACT2000_IOCTL_LOADBOOT:
-                                       switch (card->bus) {
-                                               case ACT2000_BUS_ISA:
-                                                       ret = act2000_isa_download(card,
-                                                                          arg);
-                                                       if (!ret) {
-                                                               card->flags |= ACT2000_FLAGS_LOADED;
-                                                               if (!(card->flags & ACT2000_FLAGS_IVALID)) {
-                                                                       card->ptimer.expires = jiffies + 3;
-                                                                       card->ptimer.function = act2000_poll;
-                                                                       card->ptimer.data = (unsigned long)card;
-                                                                       add_timer(&card->ptimer);
-                                                               }
-                                                               actcapi_manufacturer_req_errh(card);
-                                                       }
-                                                       break;
-                                               default:
-                                                       printk(KERN_WARNING
-                                                              "act2000: Illegal BUS type %d\n",
-                                                              card->bus);
-                                                       ret = -EIO;
+
+       switch (c->command) {
+       case ISDN_CMD_IOCTL:
+               memcpy(&a, c->parm.num, sizeof(ulong));
+               arg = (void __user *)a;
+               switch (c->arg) {
+               case ACT2000_IOCTL_LOADBOOT:
+                       switch (card->bus) {
+                       case ACT2000_BUS_ISA:
+                               ret = act2000_isa_download(card,
+                                                          arg);
+                               if (!ret) {
+                                       card->flags |= ACT2000_FLAGS_LOADED;
+                                       if (!(card->flags & ACT2000_FLAGS_IVALID)) {
+                                               card->ptimer.expires = jiffies + 3;
+                                               card->ptimer.function = act2000_poll;
+                                               card->ptimer.data = (unsigned long)card;
+                                               add_timer(&card->ptimer);
                                        }
-                                       return ret;
-                               case ACT2000_IOCTL_SETPROTO:
-                                       card->ptype = a?ISDN_PTYPE_EURO:ISDN_PTYPE_1TR6;
-                                       if (!(card->flags & ACT2000_FLAGS_RUNNING))
-                                               return 0;
-                                       actcapi_manufacturer_req_net(card);
-                                       return 0;
-                               case ACT2000_IOCTL_SETMSN:
-                                       if (copy_from_user(tmp, arg,
-                                                          sizeof(tmp)))
-                                               return -EFAULT;
-                                       if ((ret = act2000_set_msn(card, tmp)))
-                                               return ret;
-                                       if (card->flags & ACT2000_FLAGS_RUNNING)
-                                               return(actcapi_manufacturer_req_msn(card));
-                                       return 0;
-                               case ACT2000_IOCTL_ADDCARD:
-                                       if (copy_from_user(&cdef, arg,
-                                                          sizeof(cdef)))
-                                               return -EFAULT;
-                                       if (act2000_addcard(cdef.bus, cdef.port, cdef.irq, cdef.id))
-                                               return -EIO;
-                                       return 0;
-                               case ACT2000_IOCTL_TEST:
-                                       if (!(card->flags & ACT2000_FLAGS_RUNNING))
-                                               return -ENODEV;
-                                       return 0;
-                               default:
-                                       return -EINVAL;
-                       }
-                       break;
-               case ISDN_CMD_DIAL:
-                       if (!(card->flags & ACT2000_FLAGS_RUNNING))
-                               return -ENODEV;
-                       if (!(chan = find_channel(card, c->arg & 0x0f)))
+                                       actcapi_manufacturer_req_errh(card);
+                               }
                                break;
-                       spin_lock_irqsave(&card->lock, flags);
-                       if (chan->fsm_state != ACT2000_STATE_NULL) {
-                               spin_unlock_irqrestore(&card->lock, flags);
-                               printk(KERN_WARNING "Dial on channel with state %d\n",
-                                       chan->fsm_state);
-                               return -EBUSY;
-                       }
-                       if (card->ptype == ISDN_PTYPE_EURO)
-                               tmp[0] = act2000_find_msn(card, c->parm.setup.eazmsn, 1);
-                       else
-                               tmp[0] = c->parm.setup.eazmsn[0];
-                       chan->fsm_state = ACT2000_STATE_OCALL;
-                       chan->callref = 0xffff;
-                       spin_unlock_irqrestore(&card->lock, flags);
-                       ret = actcapi_connect_req(card, chan, c->parm.setup.phone,
-                                                 tmp[0], c->parm.setup.si1,
-                                                 c->parm.setup.si2);
-                       if (ret) {
-                               cmd.driver = card->myid;
-                               cmd.command = ISDN_STAT_DHUP;
-                               cmd.arg &= 0x0f;
-                               card->interface.statcallb(&cmd);
+                       default:
+                               printk(KERN_WARNING
+                                      "act2000: Illegal BUS type %d\n",
+                                      card->bus);
+                               ret = -EIO;
                        }
                        return ret;
-               case ISDN_CMD_ACCEPTD:
-                       if (!(card->flags & ACT2000_FLAGS_RUNNING))
-                               return -ENODEV;
-                       if (!(chan = find_channel(card, c->arg & 0x0f)))
-                               break;
-                       if (chan->fsm_state == ACT2000_STATE_ICALL)
-                               actcapi_select_b2_protocol_req(card, chan);
-                       return 0;
-               case ISDN_CMD_ACCEPTB:
-                       if (!(card->flags & ACT2000_FLAGS_RUNNING))
-                               return -ENODEV;
-                       return 0;
-               case ISDN_CMD_HANGUP:
+               case ACT2000_IOCTL_SETPROTO:
+                       card->ptype = a ? ISDN_PTYPE_EURO : ISDN_PTYPE_1TR6;
                        if (!(card->flags & ACT2000_FLAGS_RUNNING))
-                               return -ENODEV;
-                       if (!(chan = find_channel(card, c->arg & 0x0f)))
-                               break;
-                       switch (chan->fsm_state) {
-                               case ACT2000_STATE_ICALL:
-                               case ACT2000_STATE_BSETUP:
-                                       actcapi_connect_resp(card, chan, 0x15);
-                                       break;
-                               case ACT2000_STATE_ACTIVE:
-                                       actcapi_disconnect_b3_req(card, chan);
-                                       break;
-                       }
+                               return 0;
+                       actcapi_manufacturer_req_net(card);
                        return 0;
-               case ISDN_CMD_SETEAZ:
-                       if (!(card->flags & ACT2000_FLAGS_RUNNING))
-                               return -ENODEV;
-                       if (!(chan = find_channel(card, c->arg & 0x0f)))
-                               break;
-                       if (strlen(c->parm.num)) {
-                               if (card->ptype == ISDN_PTYPE_EURO) {
-                                       chan->eazmask = act2000_find_msn(card, c->parm.num, 0);
-                               }
-                               if (card->ptype == ISDN_PTYPE_1TR6) {
-                                       int i;
-                                       chan->eazmask = 0;
-                                       for (i = 0; i < strlen(c->parm.num); i++)
-                                               if (isdigit(c->parm.num[i]))
-                                                       chan->eazmask |= (1 << (c->parm.num[i] - '0'));
-                               }
-                       } else
-                               chan->eazmask = 0x3ff;
-                       actcapi_listen_req(card);
+               case ACT2000_IOCTL_SETMSN:
+                       if (copy_from_user(tmp, arg,
+                                          sizeof(tmp)))
+                               return -EFAULT;
+                       if ((ret = act2000_set_msn(card, tmp)))
+                               return ret;
+                       if (card->flags & ACT2000_FLAGS_RUNNING)
+                               return (actcapi_manufacturer_req_msn(card));
                        return 0;
-               case ISDN_CMD_CLREAZ:
-                       if (!(card->flags & ACT2000_FLAGS_RUNNING))
-                               return -ENODEV;
-                       if (!(chan = find_channel(card, c->arg & 0x0f)))
-                               break;
-                       chan->eazmask = 0;
-                       actcapi_listen_req(card);
+               case ACT2000_IOCTL_ADDCARD:
+                       if (copy_from_user(&cdef, arg,
+                                          sizeof(cdef)))
+                               return -EFAULT;
+                       if (act2000_addcard(cdef.bus, cdef.port, cdef.irq, cdef.id))
+                               return -EIO;
                        return 0;
-               case ISDN_CMD_SETL2:
+               case ACT2000_IOCTL_TEST:
                        if (!(card->flags & ACT2000_FLAGS_RUNNING))
                                return -ENODEV;
-                       if (!(chan = find_channel(card, c->arg & 0x0f)))
-                               break;
-                       chan->l2prot = (c->arg >> 8);
                        return 0;
-               case ISDN_CMD_SETL3:
-                       if (!(card->flags & ACT2000_FLAGS_RUNNING))
-                               return -ENODEV;
-                       if ((c->arg >> 8) != ISDN_PROTO_L3_TRANS) {
-                               printk(KERN_WARNING "L3 protocol unknown\n");
-                               return -1;
+               default:
+                       return -EINVAL;
+               }
+               break;
+       case ISDN_CMD_DIAL:
+               if (!(card->flags & ACT2000_FLAGS_RUNNING))
+                       return -ENODEV;
+               if (!(chan = find_channel(card, c->arg & 0x0f)))
+                       break;
+               spin_lock_irqsave(&card->lock, flags);
+               if (chan->fsm_state != ACT2000_STATE_NULL) {
+                       spin_unlock_irqrestore(&card->lock, flags);
+                       printk(KERN_WARNING "Dial on channel with state %d\n",
+                              chan->fsm_state);
+                       return -EBUSY;
+               }
+               if (card->ptype == ISDN_PTYPE_EURO)
+                       tmp[0] = act2000_find_msn(card, c->parm.setup.eazmsn, 1);
+               else
+                       tmp[0] = c->parm.setup.eazmsn[0];
+               chan->fsm_state = ACT2000_STATE_OCALL;
+               chan->callref = 0xffff;
+               spin_unlock_irqrestore(&card->lock, flags);
+               ret = actcapi_connect_req(card, chan, c->parm.setup.phone,
+                                         tmp[0], c->parm.setup.si1,
+                                         c->parm.setup.si2);
+               if (ret) {
+                       cmd.driver = card->myid;
+                       cmd.command = ISDN_STAT_DHUP;
+                       cmd.arg &= 0x0f;
+                       card->interface.statcallb(&cmd);
+               }
+               return ret;
+       case ISDN_CMD_ACCEPTD:
+               if (!(card->flags & ACT2000_FLAGS_RUNNING))
+                       return -ENODEV;
+               if (!(chan = find_channel(card, c->arg & 0x0f)))
+                       break;
+               if (chan->fsm_state == ACT2000_STATE_ICALL)
+                       actcapi_select_b2_protocol_req(card, chan);
+               return 0;
+       case ISDN_CMD_ACCEPTB:
+               if (!(card->flags & ACT2000_FLAGS_RUNNING))
+                       return -ENODEV;
+               return 0;
+       case ISDN_CMD_HANGUP:
+               if (!(card->flags & ACT2000_FLAGS_RUNNING))
+                       return -ENODEV;
+               if (!(chan = find_channel(card, c->arg & 0x0f)))
+                       break;
+               switch (chan->fsm_state) {
+               case ACT2000_STATE_ICALL:
+               case ACT2000_STATE_BSETUP:
+                       actcapi_connect_resp(card, chan, 0x15);
+                       break;
+               case ACT2000_STATE_ACTIVE:
+                       actcapi_disconnect_b3_req(card, chan);
+                       break;
+               }
+               return 0;
+       case ISDN_CMD_SETEAZ:
+               if (!(card->flags & ACT2000_FLAGS_RUNNING))
+                       return -ENODEV;
+               if (!(chan = find_channel(card, c->arg & 0x0f)))
+                       break;
+               if (strlen(c->parm.num)) {
+                       if (card->ptype == ISDN_PTYPE_EURO) {
+                               chan->eazmask = act2000_find_msn(card, c->parm.num, 0);
                        }
-                       if (!(chan = find_channel(card, c->arg & 0x0f)))
-                               break;
-                       chan->l3prot = (c->arg >> 8);
-                       return 0;
-        }
-       
-        return -EINVAL;
+                       if (card->ptype == ISDN_PTYPE_1TR6) {
+                               int i;
+                               chan->eazmask = 0;
+                               for (i = 0; i < strlen(c->parm.num); i++)
+                                       if (isdigit(c->parm.num[i]))
+                                               chan->eazmask |= (1 << (c->parm.num[i] - '0'));
+                       }
+               } else
+                       chan->eazmask = 0x3ff;
+               actcapi_listen_req(card);
+               return 0;
+       case ISDN_CMD_CLREAZ:
+               if (!(card->flags & ACT2000_FLAGS_RUNNING))
+                       return -ENODEV;
+               if (!(chan = find_channel(card, c->arg & 0x0f)))
+                       break;
+               chan->eazmask = 0;
+               actcapi_listen_req(card);
+               return 0;
+       case ISDN_CMD_SETL2:
+               if (!(card->flags & ACT2000_FLAGS_RUNNING))
+                       return -ENODEV;
+               if (!(chan = find_channel(card, c->arg & 0x0f)))
+                       break;
+               chan->l2prot = (c->arg >> 8);
+               return 0;
+       case ISDN_CMD_SETL3:
+               if (!(card->flags & ACT2000_FLAGS_RUNNING))
+                       return -ENODEV;
+               if ((c->arg >> 8) != ISDN_PROTO_L3_TRANS) {
+                       printk(KERN_WARNING "L3 protocol unknown\n");
+                       return -1;
+               }
+               if (!(chan = find_channel(card, c->arg & 0x0f)))
+                       break;
+               chan->l3prot = (c->arg >> 8);
+               return 0;
+       }
+
+       return -EINVAL;
 }
 
 static int
 act2000_sendbuf(act2000_card *card, int channel, int ack, struct sk_buff *skb)
 {
-        struct sk_buff *xmit_skb;
-        int len;
-        act2000_chan *chan;
+       struct sk_buff *xmit_skb;
+       int len;
+       act2000_chan *chan;
        actcapi_msg *msg;
 
-        if (!(chan = find_channel(card, channel)))
+       if (!(chan = find_channel(card, channel)))
+               return -1;
+       if (chan->fsm_state != ACT2000_STATE_ACTIVE)
                return -1;
-        if (chan->fsm_state != ACT2000_STATE_ACTIVE)
-                return -1;
-        len = skb->len;
-        if ((chan->queued + len) >= ACT2000_MAX_QUEUED)
-                return 0;
+       len = skb->len;
+       if ((chan->queued + len) >= ACT2000_MAX_QUEUED)
+               return 0;
        if (!len)
                return 0;
        if (skb_headroom(skb) < 19) {
@@ -462,28 +462,28 @@ act2000_sendbuf(act2000_card *card, int channel, int ack, struct sk_buff *skb)
        msg->msg.data_b3_req.fakencci = MAKE_NCCI(chan->plci, 0, chan->ncci);
        msg->msg.data_b3_req.flags = ack; /* Will be set to 0 on actual sending */
        actcapi_debug_msg(xmit_skb, 1);
-        chan->queued += len;
+       chan->queued += len;
        skb_queue_tail(&card->sndq, xmit_skb);
        act2000_schedule_tx(card);
-        return len;
+       return len;
 }
 
 
 /* Read the Status-replies from the Interface */
 static int
-act2000_readstatus(u_char __user * buf, int len, act2000_card * card)
+act2000_readstatus(u_char __user *buf, int len, act2000_card *card)
 {
-        int count;
-        u_char __user *p;
+       int count;
+       u_char __user *p;
 
-        for (p = buf, count = 0; count < len; p++, count++) {
-                if (card->status_buf_read == card->status_buf_write)
-                        return count;
+       for (p = buf, count = 0; count < len; p++, count++) {
+               if (card->status_buf_read == card->status_buf_write)
+                       return count;
                put_user(*card->status_buf_read++, p);
-                if (card->status_buf_read > card->status_buf_end)
-                        card->status_buf_read = card->status_buf;
-        }
-        return count;
+               if (card->status_buf_read > card->status_buf_end)
+                       card->status_buf_read = card->status_buf;
+       }
+       return count;
 }
 
 /*
@@ -492,75 +492,75 @@ act2000_readstatus(u_char __user * buf, int len, act2000_card * card)
 static inline act2000_card *
 act2000_findcard(int driverid)
 {
-        act2000_card *p = cards;
-
-        while (p) {
-                if (p->myid == driverid)
-                        return p;
-                p = p->next;
-        }
-        return (act2000_card *) 0;
+       act2000_card *p = cards;
+
+       while (p) {
+               if (p->myid == driverid)
+                       return p;
+               p = p->next;
+       }
+       return (act2000_card *) 0;
 }
 
 /*
  * Wrapper functions for interface to linklevel
  */
 static int
-if_command(isdn_ctrl * c)
+if_command(isdn_ctrl *c)
 {
-        act2000_card *card = act2000_findcard(c->driver);
-
-        if (card)
-                return (act2000_command(card, c));
-        printk(KERN_ERR
-             "act2000: if_command %d called with invalid driverId %d!\n",
-               c->command, c->driver);
-        return -ENODEV;
+       act2000_card *card = act2000_findcard(c->driver);
+
+       if (card)
+               return (act2000_command(card, c));
+       printk(KERN_ERR
+              "act2000: if_command %d called with invalid driverId %d!\n",
+              c->command, c->driver);
+       return -ENODEV;
 }
 
 static int
 if_writecmd(const u_char __user *buf, int len, int id, int channel)
 {
-        act2000_card *card = act2000_findcard(id);
-
-        if (card) {
-                if (!(card->flags & ACT2000_FLAGS_RUNNING))
-                        return -ENODEV;
-                return (len);
-        }
-        printk(KERN_ERR
-               "act2000: if_writecmd called with invalid driverId!\n");
-        return -ENODEV;
+       act2000_card *card = act2000_findcard(id);
+
+       if (card) {
+               if (!(card->flags & ACT2000_FLAGS_RUNNING))
+                       return -ENODEV;
+               return (len);
+       }
+       printk(KERN_ERR
+              "act2000: if_writecmd called with invalid driverId!\n");
+       return -ENODEV;
 }
 
 static int
-if_readstatus(u_char __user * buf, int len, int id, int channel)
+if_readstatus(u_char __user *buf, int len, int id, int channel)
 {
-        act2000_card *card = act2000_findcard(id);
-       
-        if (card) {
-                if (!(card->flags & ACT2000_FLAGS_RUNNING))
-                        return -ENODEV;
-                return (act2000_readstatus(buf, len, card));
-        }
-        printk(KERN_ERR
-               "act2000: if_readstatus called with invalid driverId!\n");
-        return -ENODEV;
+       act2000_card *card = act2000_findcard(id);
+
+       if (card) {
+               if (!(card->flags & ACT2000_FLAGS_RUNNING))
+                       return -ENODEV;
+               return (act2000_readstatus(buf, len, card));
+       }
+       printk(KERN_ERR
+              "act2000: if_readstatus called with invalid driverId!\n");
+       return -ENODEV;
 }
 
 static int
 if_sendbuf(int id, int channel, int ack, struct sk_buff *skb)
 {
-        act2000_card *card = act2000_findcard(id);
-       
-        if (card) {
-                if (!(card->flags & ACT2000_FLAGS_RUNNING))
-                        return -ENODEV;
+       act2000_card *card = act2000_findcard(id);
+
+       if (card) {
+               if (!(card->flags & ACT2000_FLAGS_RUNNING))
+                       return -ENODEV;
                return (act2000_sendbuf(card, channel, ack, skb));
-        }
-        printk(KERN_ERR
-               "act2000: if_sendbuf called with invalid driverId!\n");
-        return -ENODEV;
+       }
+       printk(KERN_ERR
+              "act2000: if_sendbuf called with invalid driverId!\n");
+       return -ENODEV;
 }
 
 
@@ -572,14 +572,14 @@ static void
 act2000_alloccard(int bus, int port, int irq, char *id)
 {
        int i;
-        act2000_card *card;
-        if (!(card = kzalloc(sizeof(act2000_card), GFP_KERNEL))) {
-                printk(KERN_WARNING
+       act2000_card *card;
+       if (!(card = kzalloc(sizeof(act2000_card), GFP_KERNEL))) {
+               printk(KERN_WARNING
                       "act2000: (%s) Could not allocate card-struct.\n", id);
-                return;
-        }
-        spin_lock_init(&card->lock);
-        spin_lock_init(&card->mnlock);
+               return;
+       }
+       spin_lock_init(&card->lock);
+       spin_lock_init(&card->mnlock);
        skb_queue_head_init(&card->sndq);
        skb_queue_head_init(&card->rcvq);
        skb_queue_head_init(&card->ackq);
@@ -588,82 +588,82 @@ act2000_alloccard(int bus, int port, int irq, char *id)
        INIT_WORK(&card->poll_tq, act2000_receive);
        init_timer(&card->ptimer);
        card->interface.owner = THIS_MODULE;
-        card->interface.channels = ACT2000_BCH;
-        card->interface.maxbufsize = 4000;
-        card->interface.command = if_command;
-        card->interface.writebuf_skb = if_sendbuf;
-        card->interface.writecmd = if_writecmd;
-        card->interface.readstat = if_readstatus;
-        card->interface.features =
+       card->interface.channels = ACT2000_BCH;
+       card->interface.maxbufsize = 4000;
+       card->interface.command = if_command;
+       card->interface.writebuf_skb = if_sendbuf;
+       card->interface.writecmd = if_writecmd;
+       card->interface.readstat = if_readstatus;
+       card->interface.features =
                ISDN_FEATURE_L2_X75I |
                ISDN_FEATURE_L2_HDLC |
                ISDN_FEATURE_L3_TRANS |
                ISDN_FEATURE_P_UNKNOWN;
-        card->interface.hl_hdrlen = 20;
-        card->ptype = ISDN_PTYPE_EURO;
-        strlcpy(card->interface.id, id, sizeof(card->interface.id));
-        for (i=0; i<ACT2000_BCH; i++) {
-                card->bch[i].plci = 0x8000;
-                card->bch[i].ncci = 0x8000;
-                card->bch[i].l2prot = ISDN_PROTO_L2_X75I;
-                card->bch[i].l3prot = ISDN_PROTO_L3_TRANS;
-        }
-        card->myid = -1;
-        card->bus = bus;
-        card->port = port;
-        card->irq = irq;
-        card->next = cards;
-        cards = card;
+       card->interface.hl_hdrlen = 20;
+       card->ptype = ISDN_PTYPE_EURO;
+       strlcpy(card->interface.id, id, sizeof(card->interface.id));
+       for (i = 0; i < ACT2000_BCH; i++) {
+               card->bch[i].plci = 0x8000;
+               card->bch[i].ncci = 0x8000;
+               card->bch[i].l2prot = ISDN_PROTO_L2_X75I;
+               card->bch[i].l3prot = ISDN_PROTO_L3_TRANS;
+       }
+       card->myid = -1;
+       card->bus = bus;
+       card->port = port;
+       card->irq = irq;
+       card->next = cards;
+       cards = card;
 }
 
 /*
  * register card at linklevel
  */
 static int
-act2000_registercard(act2000_card * card)
+act2000_registercard(act2000_card *card)
 {
-        switch (card->bus) {
-               case ACT2000_BUS_ISA:
-                       break;
-               case ACT2000_BUS_MCA:
-               case ACT2000_BUS_PCMCIA:
-               default:
-                       printk(KERN_WARNING
-                              "act2000: Illegal BUS type %d\n",
-                              card->bus);
-                       return -1;
-        }
-        if (!register_isdn(&card->interface)) {
-                printk(KERN_WARNING
-                       "act2000: Unable to register %s\n",
-                       card->interface.id);
-                return -1;
-        }
-        card->myid = card->interface.channels;
-        sprintf(card->regname, "act2000-isdn (%s)", card->interface.id);
-        return 0;
+       switch (card->bus) {
+       case ACT2000_BUS_ISA:
+               break;
+       case ACT2000_BUS_MCA:
+       case ACT2000_BUS_PCMCIA:
+       default:
+               printk(KERN_WARNING
+                      "act2000: Illegal BUS type %d\n",
+                      card->bus);
+               return -1;
+       }
+       if (!register_isdn(&card->interface)) {
+               printk(KERN_WARNING
+                      "act2000: Unable to register %s\n",
+                      card->interface.id);
+               return -1;
+       }
+       card->myid = card->interface.channels;
+       sprintf(card->regname, "act2000-isdn (%s)", card->interface.id);
+       return 0;
 }
 
 static void
-unregister_card(act2000_card * card)
+unregister_card(act2000_card *card)
 {
-        isdn_ctrl cmd;
+       isdn_ctrl cmd;
 
-        cmd.command = ISDN_STAT_UNLOAD;
-        cmd.driver = card->myid;
-        card->interface.statcallb(&cmd);
-        switch (card->bus) {
-               case ACT2000_BUS_ISA:
-                       act2000_isa_release(card);
-                       break;
-               case ACT2000_BUS_MCA:
-               case ACT2000_BUS_PCMCIA:
-               default:
-                       printk(KERN_WARNING
-                              "act2000: Invalid BUS type %d\n",
-                              card->bus);
-                       break;
-        }
+       cmd.command = ISDN_STAT_UNLOAD;
+       cmd.driver = card->myid;
+       card->interface.statcallb(&cmd);
+       switch (card->bus) {
+       case ACT2000_BUS_ISA:
+               act2000_isa_release(card);
+               break;
+       case ACT2000_BUS_MCA:
+       case ACT2000_BUS_PCMCIA:
+       default:
+               printk(KERN_WARNING
+                      "act2000: Invalid BUS type %d\n",
+                      card->bus);
+               break;
+       }
 }
 
 static int
@@ -690,23 +690,23 @@ act2000_addcard(int bus, int port, int irq, char *id)
                        for (i = 0; i < ARRAY_SIZE(act2000_isa_ports); i++)
                                if (act2000_isa_detect(act2000_isa_ports[i])) {
                                        printk(KERN_INFO "act2000: Detected "
-                                               "ISA card at port 0x%x\n",
-                                               act2000_isa_ports[i]);
+                                              "ISA card at port 0x%x\n",
+                                              act2000_isa_ports[i]);
                                        act2000_alloccard(bus,
-                                               act2000_isa_ports[i], irq, id);
+                                                         act2000_isa_ports[i], irq, id);
                                }
                        break;
                case ACT2000_BUS_MCA:
                case ACT2000_BUS_PCMCIA:
                default:
                        printk(KERN_WARNING
-                               "act2000: addcard: Invalid BUS type %d\n", bus);
+                              "act2000: addcard: Invalid BUS type %d\n", bus);
                }
        }
        if (!cards)
                return 1;
-        p = cards;
-        while (p) {
+       p = cards;
+       while (p) {
                initialized = 0;
                if (!p->interface.statcallb) {
                        /* Not yet registered.
@@ -714,99 +714,99 @@ act2000_addcard(int bus, int port, int irq, char *id)
                         */
                        added++;
                        switch (p->bus) {
-                               case ACT2000_BUS_ISA:
-                                       if (act2000_isa_detect(p->port)) {
-                                               if (act2000_registercard(p))
-                                                       break;
-                                               if (act2000_isa_config_port(p, p->port)) {
-                                                       printk(KERN_WARNING
-                                                              "act2000: Could not request port 0x%04x\n",
-                                                              p->port);
-                                                       unregister_card(p);
-                                                       p->interface.statcallb = NULL;
-                                                       break;
-                                               }
-                                               if (act2000_isa_config_irq(p, p->irq)) {
-                                                       printk(KERN_INFO
-                                                              "act2000: No IRQ available, fallback to polling\n");
-                                                       /* Fall back to polled operation */
-                                                       p->irq = 0;
-                                               }
-                                               printk(KERN_INFO
-                                                      "act2000: ISA"
-                                                      "-type card at port "
-                                                      "0x%04x ",
+                       case ACT2000_BUS_ISA:
+                               if (act2000_isa_detect(p->port)) {
+                                       if (act2000_registercard(p))
+                                               break;
+                                       if (act2000_isa_config_port(p, p->port)) {
+                                               printk(KERN_WARNING
+                                                      "act2000: Could not request port 0x%04x\n",
                                                       p->port);
-                                               if (p->irq)
-                                                       printk("irq %d\n", p->irq);
-                                               else
-                                                       printk("polled\n");
-                                               initialized = 1;
+                                               unregister_card(p);
+                                               p->interface.statcallb = NULL;
+                                               break;
+                                       }
+                                       if (act2000_isa_config_irq(p, p->irq)) {
+                                               printk(KERN_INFO
+                                                      "act2000: No IRQ available, fallback to polling\n");
+                                               /* Fall back to polled operation */
+                                               p->irq = 0;
                                        }
-                                       break;
-                               case ACT2000_BUS_MCA:
-                               case ACT2000_BUS_PCMCIA:
-                               default:
-                                       printk(KERN_WARNING
-                                              "act2000: addcard: Invalid BUS type %d\n",
-                                              p->bus);
+                                       printk(KERN_INFO
+                                              "act2000: ISA"
+                                              "-type card at port "
+                                              "0x%04x ",
+                                              p->port);
+                                       if (p->irq)
+                                               printk("irq %d\n", p->irq);
+                                       else
+                                               printk("polled\n");
+                                       initialized = 1;
+                               }
+                               break;
+                       case ACT2000_BUS_MCA:
+                       case ACT2000_BUS_PCMCIA:
+                       default:
+                               printk(KERN_WARNING
+                                      "act2000: addcard: Invalid BUS type %d\n",
+                                      p->bus);
                        }
                } else
                        /* Card already initialized */
                        initialized = 1;
-                if (initialized) {
+               if (initialized) {
                        /* Init OK, next card ... */
-                        q = p;
-                        p = p->next;
-                } else {
-                        /* Init failed, remove card from list, free memory */
-                        printk(KERN_WARNING
-                               "act2000: Initialization of %s failed\n",
-                               p->interface.id);
-                        if (q) {
-                                q->next = p->next;
-                                kfree(p);
-                                p = q->next;
-                        } else {
-                                cards = p->next;
-                                kfree(p);
-                                p = cards;
-                        }
+                       q = p;
+                       p = p->next;
+               } else {
+                       /* Init failed, remove card from list, free memory */
+                       printk(KERN_WARNING
+                              "act2000: Initialization of %s failed\n",
+                              p->interface.id);
+                       if (q) {
+                               q->next = p->next;
+                               kfree(p);
+                               p = q->next;
+                       } else {
+                               cards = p->next;
+                               kfree(p);
+                               p = cards;
+                       }
                        failed++;
-                }
+               }
        }
-        return (added - failed);
+       return (added - failed);
 }
 
 #define DRIVERNAME "IBM Active 2000 ISDN driver"
 
 static int __init act2000_init(void)
 {
-        printk(KERN_INFO "%s\n", DRIVERNAME);
-        if (!cards)
+       printk(KERN_INFO "%s\n", DRIVERNAME);
+       if (!cards)
                act2000_addcard(act_bus, act_port, act_irq, act_id);
-        if (!cards)
-                printk(KERN_INFO "act2000: No cards defined yet\n");
-        return 0;
+       if (!cards)
+               printk(KERN_INFO "act2000: No cards defined yet\n");
+       return 0;
 }
 
 static void __exit act2000_exit(void)
 {
-        act2000_card *card = cards;
-        act2000_card *last;
-        while (card) {
-                unregister_card(card);
+       act2000_card *card = cards;
+       act2000_card *last;
+       while (card) {
+               unregister_card(card);
                del_timer(&card->ptimer);
-                card = card->next;
-        }
-        card = cards;
-        while (card) {
-                last = card;
-                card = card->next;
+               card = card->next;
+       }
+       card = cards;
+       while (card) {
+               last = card;
+               card = card->next;
                act2000_clear_msn(last);
-                kfree(last);
-        }
-        printk(KERN_INFO "%s unloaded\n", DRIVERNAME);
+               kfree(last);
+       }
+       printk(KERN_INFO "%s unloaded\n", DRIVERNAME);
 }
 
 module_init(act2000_init);
index e44933d..0cf0546 100644 (file)
@@ -25,7 +25,7 @@
 #include <linux/tty.h>
 #include <linux/netdevice.h>
 #include <linux/ppp_defs.h>
-#include <linux/if_ppp.h>
+#include <linux/ppp-ioctl.h>
 #include <linux/skbuff.h>
 #include <linux/proc_fs.h>
 #include <linux/seq_file.h>
@@ -164,7 +164,7 @@ static int capiminor_del_ack(struct capiminor *mp, u16 datahandle)
 
        spin_lock_bh(&mp->ackqlock);
        list_for_each_entry_safe(p, tmp, &mp->ackqueue, list) {
-               if (p->datahandle == datahandle) {
+               if (p->datahandle == datahandle) {
                        list_del(&p->list);
                        mp->nack--;
                        spin_unlock_bh(&mp->ackqlock);
@@ -199,8 +199,8 @@ static struct capiminor *capiminor_alloc(struct capi20_appl *ap, u32 ncci)
        unsigned int minor;
 
        mp = kzalloc(sizeof(*mp), GFP_KERNEL);
-       if (!mp) {
-               printk(KERN_ERR "capi: can't alloc capiminor\n");
+       if (!mp) {
+               printk(KERN_ERR "capi: can't alloc capiminor\n");
                return NULL;
        }
 
@@ -391,7 +391,7 @@ gen_data_b3_resp_for(struct capiminor *mp, struct sk_buff *skb)
        struct sk_buff *nskb;
        nskb = alloc_skb(CAPI_DATA_B3_RESP_LEN, GFP_KERNEL);
        if (nskb) {
-               u16 datahandle = CAPIMSG_U16(skb->data,CAPIMSG_BASELEN+4+4+2);
+               u16 datahandle = CAPIMSG_U16(skb->data, CAPIMSG_BASELEN + 4 + 4 + 2);
                unsigned char *s = skb_put(nskb, CAPI_DATA_B3_RESP_LEN);
                capimsg_setu16(s, 0, CAPI_DATA_B3_RESP_LEN);
                capimsg_setu16(s, 2, mp->ap->applid);
@@ -418,7 +418,7 @@ static int handle_recv_skb(struct capiminor *mp, struct sk_buff *skb)
                pr_debug("capi: currently no receiver\n");
                return -1;
        }
-       
+
        ld = tty_ldisc_ref(tty);
        if (!ld) {
                /* fatal error, do not requeue */
@@ -459,7 +459,7 @@ static int handle_recv_skb(struct capiminor *mp, struct sk_buff *skb)
                ld->ops->receive_buf(tty, skb->data, NULL, skb->len);
        } else {
                printk(KERN_ERR "capi: send DATA_B3_RESP failed=%x\n",
-                               errcode);
+                      errcode);
                kfree_skb(nskb);
 
                if (errcode == CAPI_SENDQUEUEFULL)
@@ -618,7 +618,7 @@ static void capi_recv_message(struct capi20_appl *ap, struct sk_buff *skb)
                goto unlock_out;
        }
        if (CAPIMSG_SUBCOMMAND(skb->data) == CAPI_IND) {
-               datahandle = CAPIMSG_U16(skb->data, CAPIMSG_BASELEN+4+4+2);
+               datahandle = CAPIMSG_U16(skb->data, CAPIMSG_BASELEN + 4 + 4 + 2);
                pr_debug("capi_signal: DATA_B3_IND %u len=%d\n",
                         datahandle, skb->len-CAPIMSG_LEN(skb->data));
                skb_queue_tail(&mp->inqueue, skb);
@@ -627,10 +627,10 @@ static void capi_recv_message(struct capi20_appl *ap, struct sk_buff *skb)
 
        } else if (CAPIMSG_SUBCOMMAND(skb->data) == CAPI_CONF) {
 
-               datahandle = CAPIMSG_U16(skb->data, CAPIMSG_BASELEN+4);
+               datahandle = CAPIMSG_U16(skb->data, CAPIMSG_BASELEN + 4);
                pr_debug("capi_signal: DATA_B3_CONF %u 0x%x\n",
                         datahandle,
-                        CAPIMSG_U16(skb->data, CAPIMSG_BASELEN+4+2));
+                        CAPIMSG_U16(skb->data, CAPIMSG_BASELEN + 4 + 2));
                kfree_skb(skb);
                capiminor_del_ack(mp, datahandle);
                tty = tty_port_tty_get(&mp->port);
@@ -669,7 +669,7 @@ capi_read(struct file *file, char __user *buf, size_t count, loff_t *ppos)
                if (file->f_flags & O_NONBLOCK)
                        return -EAGAIN;
                err = wait_event_interruptible(cdev->recvwait,
-                               (skb = skb_dequeue(&cdev->recvqueue)));
+                                              (skb = skb_dequeue(&cdev->recvqueue)));
                if (err)
                        return err;
        }
@@ -736,7 +736,7 @@ capi_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos
 }
 
 static unsigned int
-capi_poll(struct file *file, poll_table * wait)
+capi_poll(struct file *file, poll_table *wait)
 {
        struct capidev *cdev = file->private_data;
        unsigned int mask = 0;
@@ -786,75 +786,75 @@ register_out:
                return retval;
 
        case CAPI_GET_VERSION:
-               {
-                       if (copy_from_user(&data.contr, argp,
-                                               sizeof(data.contr)))
-                               return -EFAULT;
-                       cdev->errcode = capi20_get_version(data.contr, &data.version);
-                       if (cdev->errcode)
-                               return -EIO;
-                       if (copy_to_user(argp, &data.version,
-                                        sizeof(data.version)))
-                               return -EFAULT;
-               }
-               return 0;
+       {
+               if (copy_from_user(&data.contr, argp,
+                                  sizeof(data.contr)))
+                       return -EFAULT;
+               cdev->errcode = capi20_get_version(data.contr, &data.version);
+               if (cdev->errcode)
+                       return -EIO;
+               if (copy_to_user(argp, &data.version,
+                                sizeof(data.version)))
+                       return -EFAULT;
+       }
+       return 0;
 
        case CAPI_GET_SERIAL:
-               {
-                       if (copy_from_user(&data.contr, argp,
-                                          sizeof(data.contr)))
-                               return -EFAULT;
-                       cdev->errcode = capi20_get_serial (data.contr, data.serial);
-                       if (cdev->errcode)
-                               return -EIO;
-                       if (copy_to_user(argp, data.serial,
-                                        sizeof(data.serial)))
-                               return -EFAULT;
-               }
-               return 0;
+       {
+               if (copy_from_user(&data.contr, argp,
+                                  sizeof(data.contr)))
+                       return -EFAULT;
+               cdev->errcode = capi20_get_serial(data.contr, data.serial);
+               if (cdev->errcode)
+                       return -EIO;
+               if (copy_to_user(argp, data.serial,
+                                sizeof(data.serial)))
+                       return -EFAULT;
+       }
+       return 0;
        case CAPI_GET_PROFILE:
-               {
-                       if (copy_from_user(&data.contr, argp,
-                                          sizeof(data.contr)))
-                               return -EFAULT;
+       {
+               if (copy_from_user(&data.contr, argp,
+                                  sizeof(data.contr)))
+                       return -EFAULT;
 
-                       if (data.contr == 0) {
-                               cdev->errcode = capi20_get_profile(data.contr, &data.profile);
-                               if (cdev->errcode)
-                                       return -EIO;
+               if (data.contr == 0) {
+                       cdev->errcode = capi20_get_profile(data.contr, &data.profile);
+                       if (cdev->errcode)
+                               return -EIO;
 
-                               retval = copy_to_user(argp,
-                                     &data.profile.ncontroller,
-                                      sizeof(data.profile.ncontroller));
+                       retval = copy_to_user(argp,
+                                             &data.profile.ncontroller,
+                                             sizeof(data.profile.ncontroller));
 
-                       } else {
-                               cdev->errcode = capi20_get_profile(data.contr, &data.profile);
-                               if (cdev->errcode)
-                                       return -EIO;
+               } else {
+                       cdev->errcode = capi20_get_profile(data.contr, &data.profile);
+                       if (cdev->errcode)
+                               return -EIO;
 
-                               retval = copy_to_user(argp, &data.profile,
-                                                  sizeof(data.profile));
-                       }
-                       if (retval)
-                               return -EFAULT;
+                       retval = copy_to_user(argp, &data.profile,
+                                             sizeof(data.profile));
                }
-               return 0;
+               if (retval)
+                       return -EFAULT;
+       }
+       return 0;
 
        case CAPI_GET_MANUFACTURER:
-               {
-                       if (copy_from_user(&data.contr, argp,
-                                          sizeof(data.contr)))
-                               return -EFAULT;
-                       cdev->errcode = capi20_get_manufacturer(data.contr, data.manufacturer);
-                       if (cdev->errcode)
-                               return -EIO;
+       {
+               if (copy_from_user(&data.contr, argp,
+                                  sizeof(data.contr)))
+                       return -EFAULT;
+               cdev->errcode = capi20_get_manufacturer(data.contr, data.manufacturer);
+               if (cdev->errcode)
+                       return -EIO;
 
-                       if (copy_to_user(argp, data.manufacturer,
-                                        sizeof(data.manufacturer)))
-                               return -EFAULT;
+               if (copy_to_user(argp, data.manufacturer,
+                                sizeof(data.manufacturer)))
+                       return -EFAULT;
 
-               }
-               return 0;
+       }
+       return 0;
        case CAPI_GET_ERRCODE:
                data.errcode = cdev->errcode;
                cdev->errcode = CAPI_NOERROR;
@@ -871,15 +871,15 @@ register_out:
                return -ENXIO;
 
        case CAPI_MANUFACTURER_CMD:
-               {
-                       struct capi_manufacturer_cmd mcmd;
-                       if (!capable(CAP_SYS_ADMIN))
-                               return -EPERM;
-                       if (copy_from_user(&mcmd, argp, sizeof(mcmd)))
-                               return -EFAULT;
-                       return capi20_manufacturer(mcmd.cmd, mcmd.data);
-               }
-               return 0;
+       {
+               struct capi_manufacturer_cmd mcmd;
+               if (!capable(CAP_SYS_ADMIN))
+                       return -EPERM;
+               if (copy_from_user(&mcmd, argp, sizeof(mcmd)))
+                       return -EFAULT;
+               return capi20_manufacturer(mcmd.cmd, mcmd.data);
+       }
+       return 0;
 
        case CAPI_SET_FLAGS:
        case CAPI_CLR_FLAGS: {
@@ -1070,7 +1070,7 @@ static int capinc_tty_write(struct tty_struct *tty,
                mp->outbytes += skb->len;
        }
 
-       skb = alloc_skb(CAPI_DATA_B3_REQ_LEN+count, GFP_ATOMIC);
+       skb = alloc_skb(CAPI_DATA_B3_REQ_LEN + count, GFP_ATOMIC);
        if (!skb) {
                printk(KERN_ERR "capinc_tty_write: alloc_skb failed\n");
                spin_unlock_bh(&mp->outlock);
@@ -1111,7 +1111,7 @@ static int capinc_tty_put_char(struct tty_struct *tty, unsigned char ch)
                invoke_send = true;
        }
 
-       skb = alloc_skb(CAPI_DATA_B3_REQ_LEN+CAPI_MAX_BLKSIZE, GFP_ATOMIC);
+       skb = alloc_skb(CAPI_DATA_B3_REQ_LEN + CAPI_MAX_BLKSIZE, GFP_ATOMIC);
        if (skb) {
                skb_reserve(skb, CAPI_DATA_B3_REQ_LEN);
                *(skb_put(skb, 1)) = ch;
@@ -1175,12 +1175,12 @@ static int capinc_tty_chars_in_buffer(struct tty_struct *tty)
 }
 
 static int capinc_tty_ioctl(struct tty_struct *tty,
-                   unsigned int cmd, unsigned long arg)
+                           unsigned int cmd, unsigned long arg)
 {
        return -ENOIOCTLCMD;
 }
 
-static void capinc_tty_set_termios(struct tty_struct *tty, struct ktermios * old)
+static void capinc_tty_set_termios(struct tty_struct *tty, struct ktermios *old)
 {
        pr_debug("capinc_tty_set_termios\n");
 }
@@ -1344,18 +1344,18 @@ static inline void capinc_tty_exit(void) { }
  */
 static int capi20_proc_show(struct seq_file *m, void *v)
 {
-        struct capidev *cdev;
+       struct capidev *cdev;
        struct list_head *l;
 
        mutex_lock(&capidev_list_lock);
        list_for_each(l, &capidev_list) {
                cdev = list_entry(l, struct capidev, list);
                seq_printf(m, "0 %d %lu %lu %lu %lu\n",
-                       cdev->ap.applid,
-                       cdev->ap.nrecvctlpkt,
-                       cdev->ap.nrecvdatapkt,
-                       cdev->ap.nsentctlpkt,
-                       cdev->ap.nsentdatapkt);
+                          cdev->ap.applid,
+                          cdev->ap.nrecvctlpkt,
+                          cdev->ap.nrecvdatapkt,
+                          cdev->ap.nsentctlpkt,
+                          cdev->ap.nsentdatapkt);
        }
        mutex_unlock(&capidev_list_lock);
        return 0;
@@ -1450,9 +1450,9 @@ static int __init capi_init(void)
        proc_init();
 
 #ifdef CONFIG_ISDN_CAPI_MIDDLEWARE
-        compileinfo = " (middleware)";
+       compileinfo = " (middleware)";
 #else
-        compileinfo = " (no middleware)";
+       compileinfo = " (no middleware)";
 #endif
        printk(KERN_NOTICE "CAPI 2.0 started up with major %d%s\n",
               capi_major, compileinfo);
index 92607ed..6f5016b 100644 (file)
@@ -40,7 +40,7 @@ static int debugmode = 0;
 MODULE_DESCRIPTION("CAPI4Linux: Interface to ISDN4Linux");
 MODULE_AUTHOR("Carsten Paeth");
 MODULE_LICENSE("GPL");
-module_param(debugmode, uint, S_IRUGO|S_IWUSR);
+module_param(debugmode, uint, S_IRUGO | S_IWUSR);
 
 /* -------- type definitions ----------------------------------------- */
 
@@ -64,7 +64,7 @@ struct capidrv_contr {
        int state;
        u32 cipmask;
        u32 cipmask2;
-        struct timer_list listentimer;
+       struct timer_list listentimer;
 
        /*
         * ID of capi message sent
@@ -105,9 +105,9 @@ struct capidrv_contr {
                                /* */
                                u16 datahandle;
                                struct ncci_datahandle_queue {
-                                   struct ncci_datahandle_queue *next;
-                                   u16                         datahandle;
-                                   int                           len;
+                                       struct ncci_datahandle_queue *next;
+                                       u16                         datahandle;
+                                       int                           len;
                                } *ackqueue;
                        } *ncci_list;
                } *plcip;
@@ -142,7 +142,7 @@ static capidrv_data global;
 static DEFINE_SPINLOCK(global_lock);
 
 static void handle_dtrace_data(capidrv_contr *card,
-       int send, int level2, u8 *data, u16 len);
+                              int send, int level2, u8 *data, u16 len);
 
 /* -------- convert functions ---------------------------------------- */
 
@@ -158,11 +158,11 @@ static inline u32 b1prot(int l2, int l3)
                return 0;
        case ISDN_PROTO_L2_TRANS:
                return 1;
-        case ISDN_PROTO_L2_V11096:
-        case ISDN_PROTO_L2_V11019:
-        case ISDN_PROTO_L2_V11038:
+       case ISDN_PROTO_L2_V11096:
+       case ISDN_PROTO_L2_V11019:
+       case ISDN_PROTO_L2_V11038:
                return 2;
-        case ISDN_PROTO_L2_FAX:
+       case ISDN_PROTO_L2_FAX:
                return 4;
        case ISDN_PROTO_L2_MODEM:
                return 8;
@@ -179,12 +179,12 @@ static inline u32 b2prot(int l2, int l3)
                return 0;
        case ISDN_PROTO_L2_HDLC:
        case ISDN_PROTO_L2_TRANS:
-        case ISDN_PROTO_L2_V11096:
-        case ISDN_PROTO_L2_V11019:
-        case ISDN_PROTO_L2_V11038:
+       case ISDN_PROTO_L2_V11096:
+       case ISDN_PROTO_L2_V11019:
+       case ISDN_PROTO_L2_V11038:
        case ISDN_PROTO_L2_MODEM:
                return 1;
-        case ISDN_PROTO_L2_FAX:
+       case ISDN_PROTO_L2_FAX:
                return 4;
        }
 }
@@ -197,13 +197,13 @@ static inline u32 b3prot(int l2, int l3)
        case ISDN_PROTO_L2_X75BUI:
        case ISDN_PROTO_L2_HDLC:
        case ISDN_PROTO_L2_TRANS:
-        case ISDN_PROTO_L2_V11096:
-        case ISDN_PROTO_L2_V11019:
-        case ISDN_PROTO_L2_V11038:
+       case ISDN_PROTO_L2_V11096:
+       case ISDN_PROTO_L2_V11019:
+       case ISDN_PROTO_L2_V11038:
        case ISDN_PROTO_L2_MODEM:
        default:
                return 0;
-        case ISDN_PROTO_L2_FAX:
+       case ISDN_PROTO_L2_FAX:
                return 4;
        }
 }
@@ -231,38 +231,38 @@ static _cstruct b1config(int l2, int l3)
        case ISDN_PROTO_L2_TRANS:
        default:
                return NULL;
-        case ISDN_PROTO_L2_V11096:
-           return b1config_async_v110(9600);
-        case ISDN_PROTO_L2_V11019:
-           return b1config_async_v110(19200);
-        case ISDN_PROTO_L2_V11038:
-           return b1config_async_v110(38400);
+       case ISDN_PROTO_L2_V11096:
+               return b1config_async_v110(9600);
+       case ISDN_PROTO_L2_V11019:
+               return b1config_async_v110(19200);
+       case ISDN_PROTO_L2_V11038:
+               return b1config_async_v110(38400);
        }
 }
 
 static inline u16 si2cip(u8 si1, u8 si2)
 {
        static const u8 cip[17][5] =
-       {
-       /*  0  1  2  3  4  */
-               {0, 0, 0, 0, 0},        /*0 */
-               {16, 16, 4, 26, 16},    /*1 */
-               {17, 17, 17, 4, 4},     /*2 */
-               {2, 2, 2, 2, 2},        /*3 */
-               {18, 18, 18, 18, 18},   /*4 */
-               {2, 2, 2, 2, 2},        /*5 */
-               {0, 0, 0, 0, 0},        /*6 */
-               {2, 2, 2, 2, 2},        /*7 */
-               {2, 2, 2, 2, 2},        /*8 */
-               {21, 21, 21, 21, 21},   /*9 */
-               {19, 19, 19, 19, 19},   /*10 */
-               {0, 0, 0, 0, 0},        /*11 */
-               {0, 0, 0, 0, 0},        /*12 */
-               {0, 0, 0, 0, 0},        /*13 */
-               {0, 0, 0, 0, 0},        /*14 */
-               {22, 22, 22, 22, 22},   /*15 */
-               {27, 27, 27, 28, 27}    /*16 */
-       };
+               {
+                       /*  0  1  2  3  4  */
+                       {0, 0, 0, 0, 0},        /*0 */
+                       {16, 16, 4, 26, 16},    /*1 */
+                       {17, 17, 17, 4, 4},     /*2 */
+                       {2, 2, 2, 2, 2},        /*3 */
+                       {18, 18, 18, 18, 18},   /*4 */
+                       {2, 2, 2, 2, 2},        /*5 */
+                       {0, 0, 0, 0, 0},        /*6 */
+                       {2, 2, 2, 2, 2},        /*7 */
+                       {2, 2, 2, 2, 2},        /*8 */
+                       {21, 21, 21, 21, 21},   /*9 */
+                       {19, 19, 19, 19, 19},   /*10 */
+                       {0, 0, 0, 0, 0},        /*11 */
+                       {0, 0, 0, 0, 0},        /*12 */
+                       {0, 0, 0, 0, 0},        /*13 */
+                       {0, 0, 0, 0, 0},        /*14 */
+                       {22, 22, 22, 22, 22},   /*15 */
+                       {27, 27, 27, 28, 27}    /*16 */
+               };
        if (si1 > 16)
                si1 = 0;
        if (si2 > 4)
@@ -274,10 +274,10 @@ static inline u16 si2cip(u8 si1, u8 si2)
 static inline u8 cip2si1(u16 cipval)
 {
        static const u8 si[32] =
-       {7, 1, 7, 7, 1, 1, 7, 7,        /*0-7 */
-        7, 1, 0, 0, 0, 0, 0, 0,        /*8-15 */
-        1, 2, 4, 10, 9, 9, 15, 7,      /*16-23 */
-        7, 7, 1, 16, 16, 0, 0, 0};     /*24-31 */
+               {7, 1, 7, 7, 1, 1, 7, 7,        /*0-7 */
+                7, 1, 0, 0, 0, 0, 0, 0,        /*8-15 */
+                1, 2, 4, 10, 9, 9, 15, 7,      /*16-23 */
+                7, 7, 1, 16, 16, 0, 0, 0};     /*24-31 */
 
        if (cipval > 31)
                cipval = 0;     /* .... */
@@ -287,10 +287,10 @@ static inline u8 cip2si1(u16 cipval)
 static inline u8 cip2si2(u16 cipval)
 {
        static const u8 si[32] =
-       {0, 0, 0, 0, 2, 3, 0, 0,        /*0-7 */
-        0, 3, 0, 0, 0, 0, 0, 0,        /*8-15 */
-        1, 2, 0, 0, 9, 0, 0, 0,        /*16-23 */
-        0, 0, 3, 2, 3, 0, 0, 0};       /*24-31 */
+               {0, 0, 0, 0, 2, 3, 0, 0,        /*0-7 */
+                0, 3, 0, 0, 0, 0, 0, 0,        /*8-15 */
+                1, 2, 0, 0, 9, 0, 0, 0,        /*16-23 */
+                0, 0, 3, 2, 3, 0, 0, 0};       /*24-31 */
 
        if (cipval > 31)
                cipval = 0;     /* .... */
@@ -302,7 +302,7 @@ static inline u8 cip2si2(u16 cipval)
 
 static inline capidrv_contr *findcontrbydriverid(int driverid)
 {
-       unsigned long flags;
+       unsigned long flags;
        capidrv_contr *p;
 
        spin_lock_irqsave(&global_lock, flags);
@@ -329,7 +329,7 @@ static capidrv_contr *findcontrbynumber(u32 contr)
 
 /* -------- plci management ------------------------------------------ */
 
-static capidrv_plci *new_plci(capidrv_contr * card, int chan)
+static capidrv_plci *new_plci(capidrv_contr *card, int chan)
 {
        capidrv_plci *plcip;
 
@@ -349,7 +349,7 @@ static capidrv_plci *new_plci(capidrv_contr * card, int chan)
        return plcip;
 }
 
-static capidrv_plci *find_plci_by_plci(capidrv_contr * card, u32 plci)
+static capidrv_plci *find_plci_by_plci(capidrv_contr *card, u32 plci)
 {
        capidrv_plci *p;
        for (p = card->plci_list; p; p = p->next)
@@ -358,7 +358,7 @@ static capidrv_plci *find_plci_by_plci(capidrv_contr * card, u32 plci)
        return NULL;
 }
 
-static capidrv_plci *find_plci_by_msgid(capidrv_contr * card, u16 msgid)
+static capidrv_plci *find_plci_by_msgid(capidrv_contr *card, u16 msgid)
 {
        capidrv_plci *p;
        for (p = card->plci_list; p; p = p->next)
@@ -367,7 +367,7 @@ static capidrv_plci *find_plci_by_msgid(capidrv_contr * card, u16 msgid)
        return NULL;
 }
 
-static capidrv_plci *find_plci_by_ncci(capidrv_contr * card, u32 ncci)
+static capidrv_plci *find_plci_by_ncci(capidrv_contr *card, u32 ncci)
 {
        capidrv_plci *p;
        for (p = card->plci_list; p; p = p->next)
@@ -376,7 +376,7 @@ static capidrv_plci *find_plci_by_ncci(capidrv_contr * card, u32 ncci)
        return NULL;
 }
 
-static void free_plci(capidrv_contr * card, capidrv_plci * plcip)
+static void free_plci(capidrv_contr *card, capidrv_plci *plcip)
 {
        capidrv_plci **pp;
 
@@ -396,8 +396,8 @@ static void free_plci(capidrv_contr * card, capidrv_plci * plcip)
 
 /* -------- ncci management ------------------------------------------ */
 
-static inline capidrv_ncci *new_ncci(capidrv_contr * card,
-                                    capidrv_plci * plcip,
+static inline capidrv_ncci *new_ncci(capidrv_contr *card,
+                                    capidrv_plci *plcip,
                                     u32 ncci)
 {
        capidrv_ncci *nccip;
@@ -421,7 +421,7 @@ static inline capidrv_ncci *new_ncci(capidrv_contr * card,
        return nccip;
 }
 
-static inline capidrv_ncci *find_ncci(capidrv_contr * card, u32 ncci)
+static inline capidrv_ncci *find_ncci(capidrv_contr *card, u32 ncci)
 {
        capidrv_plci *plcip;
        capidrv_ncci *p;
@@ -435,7 +435,7 @@ static inline capidrv_ncci *find_ncci(capidrv_contr * card, u32 ncci)
        return NULL;
 }
 
-static inline capidrv_ncci *find_ncci_by_msgid(capidrv_contr * card,
+static inline capidrv_ncci *find_ncci_by_msgid(capidrv_contr *card,
                                               u32 ncci, u16 msgid)
 {
        capidrv_plci *plcip;
@@ -450,7 +450,7 @@ static inline capidrv_ncci *find_ncci_by_msgid(capidrv_contr * card,
        return NULL;
 }
 
-static void free_ncci(capidrv_contr * card, struct capidrv_ncci *nccip)
+static void free_ncci(capidrv_contr *card, struct capidrv_ncci *nccip)
 {
        struct capidrv_ncci **pp;
 
@@ -465,20 +465,20 @@ static void free_ncci(capidrv_contr * card, struct capidrv_ncci *nccip)
 }
 
 static int capidrv_add_ack(struct capidrv_ncci *nccip,
-                          u16 datahandle, int len)
+                          u16 datahandle, int len)
 {
        struct ncci_datahandle_queue *n, **pp;
 
        n = (struct ncci_datahandle_queue *)
                kmalloc(sizeof(struct ncci_datahandle_queue), GFP_ATOMIC);
        if (!n) {
-          printk(KERN_ERR "capidrv: kmalloc ncci_datahandle failed\n");
-          return -1;
+               printk(KERN_ERR "capidrv: kmalloc ncci_datahandle failed\n");
+               return -1;
        }
        n->next = NULL;
        n->datahandle = datahandle;
        n->len = len;
-       for (pp = &nccip->ackqueue; *pp; pp = &(*pp)->next) ;
+       for (pp = &nccip->ackqueue; *pp; pp = &(*pp)->next);
        *pp = n;
        return 0;
 }
@@ -489,11 +489,11 @@ static int capidrv_del_ack(struct capidrv_ncci *nccip, u16 datahandle)
        int len;
 
        for (pp = &nccip->ackqueue; *pp; pp = &(*pp)->next) {
-               if ((*pp)->datahandle == datahandle) {
+               if ((*pp)->datahandle == datahandle) {
                        p = *pp;
                        len = p->len;
                        *pp = (*pp)->next;
-                       kfree(p);
+                       kfree(p);
                        return len;
                }
        }
@@ -502,7 +502,7 @@ static int capidrv_del_ack(struct capidrv_ncci *nccip, u16 datahandle)
 
 /* -------- convert and send capi message ---------------------------- */
 
-static void send_message(capidrv_contr * card, _cmsg * cmsg)
+static void send_message(capidrv_contr *card, _cmsg *cmsg)
 {
        struct sk_buff *skb;
        size_t len;
@@ -529,18 +529,18 @@ struct listenstatechange {
 
 static struct listenstatechange listentable[] =
 {
-  {ST_LISTEN_NONE, ST_LISTEN_WAIT_CONF, EV_LISTEN_REQ},
-  {ST_LISTEN_ACTIVE, ST_LISTEN_ACTIVE_WAIT_CONF, EV_LISTEN_REQ},
-  {ST_LISTEN_WAIT_CONF, ST_LISTEN_NONE, EV_LISTEN_CONF_ERROR},
-  {ST_LISTEN_ACTIVE_WAIT_CONF, ST_LISTEN_ACTIVE, EV_LISTEN_CONF_ERROR},
-  {ST_LISTEN_WAIT_CONF, ST_LISTEN_NONE, EV_LISTEN_CONF_EMPTY},
-  {ST_LISTEN_ACTIVE_WAIT_CONF, ST_LISTEN_NONE, EV_LISTEN_CONF_EMPTY},
-  {ST_LISTEN_WAIT_CONF, ST_LISTEN_ACTIVE, EV_LISTEN_CONF_OK},
-  {ST_LISTEN_ACTIVE_WAIT_CONF, ST_LISTEN_ACTIVE, EV_LISTEN_CONF_OK},
-  {},
+       {ST_LISTEN_NONE, ST_LISTEN_WAIT_CONF, EV_LISTEN_REQ},
+       {ST_LISTEN_ACTIVE, ST_LISTEN_ACTIVE_WAIT_CONF, EV_LISTEN_REQ},
+       {ST_LISTEN_WAIT_CONF, ST_LISTEN_NONE, EV_LISTEN_CONF_ERROR},
+       {ST_LISTEN_ACTIVE_WAIT_CONF, ST_LISTEN_ACTIVE, EV_LISTEN_CONF_ERROR},
+       {ST_LISTEN_WAIT_CONF, ST_LISTEN_NONE, EV_LISTEN_CONF_EMPTY},
+       {ST_LISTEN_ACTIVE_WAIT_CONF, ST_LISTEN_NONE, EV_LISTEN_CONF_EMPTY},
+       {ST_LISTEN_WAIT_CONF, ST_LISTEN_ACTIVE, EV_LISTEN_CONF_OK},
+       {ST_LISTEN_ACTIVE_WAIT_CONF, ST_LISTEN_ACTIVE, EV_LISTEN_CONF_OK},
+       {},
 };
 
-static void listen_change_state(capidrv_contr * card, int event)
+static void listen_change_state(capidrv_contr *card, int event)
 {
        struct listenstatechange *p = listentable;
        while (p->event) {
@@ -560,7 +560,7 @@ static void listen_change_state(capidrv_contr * card, int event)
 
 /* ------------------------------------------------------------------ */
 
-static void p0(capidrv_contr * card, capidrv_plci * plci)
+static void p0(capidrv_contr *card, capidrv_plci *plci)
 {
        isdn_ctrl cmd;
 
@@ -578,71 +578,71 @@ struct plcistatechange {
        int actstate;
        int nextstate;
        int event;
-       void (*changefunc) (capidrv_contr * card, capidrv_plci * plci);
+       void (*changefunc)(capidrv_contr *card, capidrv_plci *plci);
 };
 
 static struct plcistatechange plcitable[] =
 {
-  /* P-0 */
-  {ST_PLCI_NONE, ST_PLCI_OUTGOING, EV_PLCI_CONNECT_REQ, NULL},
-  {ST_PLCI_NONE, ST_PLCI_ALLOCATED, EV_PLCI_FACILITY_IND_UP, NULL},
-  {ST_PLCI_NONE, ST_PLCI_INCOMING, EV_PLCI_CONNECT_IND, NULL},
-  {ST_PLCI_NONE, ST_PLCI_RESUMEING, EV_PLCI_RESUME_REQ, NULL},
-  /* P-0.1 */
-  {ST_PLCI_OUTGOING, ST_PLCI_NONE, EV_PLCI_CONNECT_CONF_ERROR, p0},
-  {ST_PLCI_OUTGOING, ST_PLCI_ALLOCATED, EV_PLCI_CONNECT_CONF_OK, NULL},
-  /* P-1 */
-  {ST_PLCI_ALLOCATED, ST_PLCI_ACTIVE, EV_PLCI_CONNECT_ACTIVE_IND, NULL},
-  {ST_PLCI_ALLOCATED, ST_PLCI_DISCONNECTING, EV_PLCI_DISCONNECT_REQ, NULL},
-  {ST_PLCI_ALLOCATED, ST_PLCI_DISCONNECTING, EV_PLCI_FACILITY_IND_DOWN, NULL},
-  {ST_PLCI_ALLOCATED, ST_PLCI_DISCONNECTED, EV_PLCI_DISCONNECT_IND, NULL},
-  /* P-ACT */
-  {ST_PLCI_ACTIVE, ST_PLCI_DISCONNECTING, EV_PLCI_DISCONNECT_REQ, NULL},
-  {ST_PLCI_ACTIVE, ST_PLCI_DISCONNECTING, EV_PLCI_FACILITY_IND_DOWN, NULL},
-  {ST_PLCI_ACTIVE, ST_PLCI_DISCONNECTED, EV_PLCI_DISCONNECT_IND, NULL},
-  {ST_PLCI_ACTIVE, ST_PLCI_HELD, EV_PLCI_HOLD_IND, NULL},
-  {ST_PLCI_ACTIVE, ST_PLCI_DISCONNECTING, EV_PLCI_SUSPEND_IND, NULL},
-  /* P-2 */
-  {ST_PLCI_INCOMING, ST_PLCI_DISCONNECTING, EV_PLCI_CONNECT_REJECT, NULL},
-  {ST_PLCI_INCOMING, ST_PLCI_FACILITY_IND, EV_PLCI_FACILITY_IND_UP, NULL},
-  {ST_PLCI_INCOMING, ST_PLCI_ACCEPTING, EV_PLCI_CONNECT_RESP, NULL},
-  {ST_PLCI_INCOMING, ST_PLCI_DISCONNECTING, EV_PLCI_DISCONNECT_REQ, NULL},
-  {ST_PLCI_INCOMING, ST_PLCI_DISCONNECTING, EV_PLCI_FACILITY_IND_DOWN, NULL},
-  {ST_PLCI_INCOMING, ST_PLCI_DISCONNECTED, EV_PLCI_DISCONNECT_IND, NULL},
-  {ST_PLCI_INCOMING, ST_PLCI_DISCONNECTING, EV_PLCI_CD_IND, NULL},
-  /* P-3 */
-  {ST_PLCI_FACILITY_IND, ST_PLCI_DISCONNECTING, EV_PLCI_CONNECT_REJECT, NULL},
-  {ST_PLCI_FACILITY_IND, ST_PLCI_ACCEPTING, EV_PLCI_CONNECT_ACTIVE_IND, NULL},
-  {ST_PLCI_FACILITY_IND, ST_PLCI_DISCONNECTING, EV_PLCI_DISCONNECT_REQ, NULL},
-  {ST_PLCI_FACILITY_IND, ST_PLCI_DISCONNECTING, EV_PLCI_FACILITY_IND_DOWN, NULL},
-  {ST_PLCI_FACILITY_IND, ST_PLCI_DISCONNECTED, EV_PLCI_DISCONNECT_IND, NULL},
-  /* P-4 */
-  {ST_PLCI_ACCEPTING, ST_PLCI_ACTIVE, EV_PLCI_CONNECT_ACTIVE_IND, NULL},
-  {ST_PLCI_ACCEPTING, ST_PLCI_DISCONNECTING, EV_PLCI_DISCONNECT_REQ, NULL},
-  {ST_PLCI_ACCEPTING, ST_PLCI_DISCONNECTING, EV_PLCI_FACILITY_IND_DOWN, NULL},
-  {ST_PLCI_ACCEPTING, ST_PLCI_DISCONNECTED, EV_PLCI_DISCONNECT_IND, NULL},
-  /* P-5 */
-  {ST_PLCI_DISCONNECTING, ST_PLCI_DISCONNECTED, EV_PLCI_DISCONNECT_IND, NULL},
-  /* P-6 */
-  {ST_PLCI_DISCONNECTED, ST_PLCI_NONE, EV_PLCI_DISCONNECT_RESP, p0},
-  /* P-0.Res */
-  {ST_PLCI_RESUMEING, ST_PLCI_NONE, EV_PLCI_RESUME_CONF_ERROR, p0},
-  {ST_PLCI_RESUMEING, ST_PLCI_RESUME, EV_PLCI_RESUME_CONF_OK, NULL},
-  /* P-RES */
-  {ST_PLCI_RESUME, ST_PLCI_ACTIVE, EV_PLCI_RESUME_IND, NULL},
-  /* P-HELD */
-  {ST_PLCI_HELD, ST_PLCI_ACTIVE, EV_PLCI_RETRIEVE_IND, NULL},
-  {},
+       /* P-0 */
+       {ST_PLCI_NONE, ST_PLCI_OUTGOING, EV_PLCI_CONNECT_REQ, NULL},
+       {ST_PLCI_NONE, ST_PLCI_ALLOCATED, EV_PLCI_FACILITY_IND_UP, NULL},
+       {ST_PLCI_NONE, ST_PLCI_INCOMING, EV_PLCI_CONNECT_IND, NULL},
+       {ST_PLCI_NONE, ST_PLCI_RESUMEING, EV_PLCI_RESUME_REQ, NULL},
+       /* P-0.1 */
+       {ST_PLCI_OUTGOING, ST_PLCI_NONE, EV_PLCI_CONNECT_CONF_ERROR, p0},
+       {ST_PLCI_OUTGOING, ST_PLCI_ALLOCATED, EV_PLCI_CONNECT_CONF_OK, NULL},
+       /* P-1 */
+       {ST_PLCI_ALLOCATED, ST_PLCI_ACTIVE, EV_PLCI_CONNECT_ACTIVE_IND, NULL},
+       {ST_PLCI_ALLOCATED, ST_PLCI_DISCONNECTING, EV_PLCI_DISCONNECT_REQ, NULL},
+       {ST_PLCI_ALLOCATED, ST_PLCI_DISCONNECTING, EV_PLCI_FACILITY_IND_DOWN, NULL},
+       {ST_PLCI_ALLOCATED, ST_PLCI_DISCONNECTED, EV_PLCI_DISCONNECT_IND, NULL},
+       /* P-ACT */
+       {ST_PLCI_ACTIVE, ST_PLCI_DISCONNECTING, EV_PLCI_DISCONNECT_REQ, NULL},
+       {ST_PLCI_ACTIVE, ST_PLCI_DISCONNECTING, EV_PLCI_FACILITY_IND_DOWN, NULL},
+       {ST_PLCI_ACTIVE, ST_PLCI_DISCONNECTED, EV_PLCI_DISCONNECT_IND, NULL},
+       {ST_PLCI_ACTIVE, ST_PLCI_HELD, EV_PLCI_HOLD_IND, NULL},
+       {ST_PLCI_ACTIVE, ST_PLCI_DISCONNECTING, EV_PLCI_SUSPEND_IND, NULL},
+       /* P-2 */
+       {ST_PLCI_INCOMING, ST_PLCI_DISCONNECTING, EV_PLCI_CONNECT_REJECT, NULL},
+       {ST_PLCI_INCOMING, ST_PLCI_FACILITY_IND, EV_PLCI_FACILITY_IND_UP, NULL},
+       {ST_PLCI_INCOMING, ST_PLCI_ACCEPTING, EV_PLCI_CONNECT_RESP, NULL},
+       {ST_PLCI_INCOMING, ST_PLCI_DISCONNECTING, EV_PLCI_DISCONNECT_REQ, NULL},
+       {ST_PLCI_INCOMING, ST_PLCI_DISCONNECTING, EV_PLCI_FACILITY_IND_DOWN, NULL},
+       {ST_PLCI_INCOMING, ST_PLCI_DISCONNECTED, EV_PLCI_DISCONNECT_IND, NULL},
+       {ST_PLCI_INCOMING, ST_PLCI_DISCONNECTING, EV_PLCI_CD_IND, NULL},
+       /* P-3 */
+       {ST_PLCI_FACILITY_IND, ST_PLCI_DISCONNECTING, EV_PLCI_CONNECT_REJECT, NULL},
+       {ST_PLCI_FACILITY_IND, ST_PLCI_ACCEPTING, EV_PLCI_CONNECT_ACTIVE_IND, NULL},
+       {ST_PLCI_FACILITY_IND, ST_PLCI_DISCONNECTING, EV_PLCI_DISCONNECT_REQ, NULL},
+       {ST_PLCI_FACILITY_IND, ST_PLCI_DISCONNECTING, EV_PLCI_FACILITY_IND_DOWN, NULL},
+       {ST_PLCI_FACILITY_IND, ST_PLCI_DISCONNECTED, EV_PLCI_DISCONNECT_IND, NULL},
+       /* P-4 */
+       {ST_PLCI_ACCEPTING, ST_PLCI_ACTIVE, EV_PLCI_CONNECT_ACTIVE_IND, NULL},
+       {ST_PLCI_ACCEPTING, ST_PLCI_DISCONNECTING, EV_PLCI_DISCONNECT_REQ, NULL},
+       {ST_PLCI_ACCEPTING, ST_PLCI_DISCONNECTING, EV_PLCI_FACILITY_IND_DOWN, NULL},
+       {ST_PLCI_ACCEPTING, ST_PLCI_DISCONNECTED, EV_PLCI_DISCONNECT_IND, NULL},
+       /* P-5 */
+       {ST_PLCI_DISCONNECTING, ST_PLCI_DISCONNECTED, EV_PLCI_DISCONNECT_IND, NULL},
+       /* P-6 */
+       {ST_PLCI_DISCONNECTED, ST_PLCI_NONE, EV_PLCI_DISCONNECT_RESP, p0},
+       /* P-0.Res */
+       {ST_PLCI_RESUMEING, ST_PLCI_NONE, EV_PLCI_RESUME_CONF_ERROR, p0},
+       {ST_PLCI_RESUMEING, ST_PLCI_RESUME, EV_PLCI_RESUME_CONF_OK, NULL},
+       /* P-RES */
+       {ST_PLCI_RESUME, ST_PLCI_ACTIVE, EV_PLCI_RESUME_IND, NULL},
+       /* P-HELD */
+       {ST_PLCI_HELD, ST_PLCI_ACTIVE, EV_PLCI_RETRIEVE_IND, NULL},
+       {},
 };
 
-static void plci_change_state(capidrv_contr * card, capidrv_plci * plci, int event)
+static void plci_change_state(capidrv_contr *card, capidrv_plci *plci, int event)
 {
        struct plcistatechange *p = plcitable;
        while (p->event) {
                if (plci->state == p->actstate && p->event == event) {
                        if (debugmode)
                                printk(KERN_DEBUG "capidrv-%d: plci_change_state:0x%x %d -> %d\n",
-                                 card->contrnr, plci->plci, plci->state, p->nextstate);
+                                      card->contrnr, plci->plci, plci->state, p->nextstate);
                        plci->state = p->nextstate;
                        if (p->changefunc)
                                p->changefunc(card, plci);
@@ -658,7 +658,7 @@ static void plci_change_state(capidrv_contr * card, capidrv_plci * plci, int eve
 
 static _cmsg cmsg;
 
-static void n0(capidrv_contr * card, capidrv_ncci * ncci)
+static void n0(capidrv_contr *card, capidrv_ncci *ncci)
 {
        isdn_ctrl cmd;
 
@@ -670,7 +670,7 @@ static void n0(capidrv_contr * card, capidrv_ncci * ncci)
                                 NULL,  /* Keypadfacility */
                                 NULL,  /* Useruserdata */   /* $$$$ */
                                 NULL   /* Facilitydataarray */
-       );
+               );
        plci_change_state(card, ncci->plcip, EV_PLCI_DISCONNECT_REQ);
        send_message(card, &cmsg);
 
@@ -687,51 +687,51 @@ struct nccistatechange {
        int actstate;
        int nextstate;
        int event;
-       void (*changefunc) (capidrv_contr * card, capidrv_ncci * ncci);
+       void (*changefunc)(capidrv_contr *card, capidrv_ncci *ncci);
 };
 
 static struct nccistatechange nccitable[] =
 {
-  /* N-0 */
-  {ST_NCCI_NONE, ST_NCCI_OUTGOING, EV_NCCI_CONNECT_B3_REQ, NULL},
-  {ST_NCCI_NONE, ST_NCCI_INCOMING, EV_NCCI_CONNECT_B3_IND, NULL},
-  /* N-0.1 */
-  {ST_NCCI_OUTGOING, ST_NCCI_ALLOCATED, EV_NCCI_CONNECT_B3_CONF_OK, NULL},
-  {ST_NCCI_OUTGOING, ST_NCCI_NONE, EV_NCCI_CONNECT_B3_CONF_ERROR, n0},
-  /* N-1 */
-  {ST_NCCI_INCOMING, ST_NCCI_DISCONNECTING, EV_NCCI_CONNECT_B3_REJECT, NULL},
-  {ST_NCCI_INCOMING, ST_NCCI_ALLOCATED, EV_NCCI_CONNECT_B3_RESP, NULL},
-  {ST_NCCI_INCOMING, ST_NCCI_DISCONNECTED, EV_NCCI_DISCONNECT_B3_IND, NULL},
-  {ST_NCCI_INCOMING, ST_NCCI_DISCONNECTING, EV_NCCI_DISCONNECT_B3_REQ, NULL},
-  /* N-2 */
-  {ST_NCCI_ALLOCATED, ST_NCCI_ACTIVE, EV_NCCI_CONNECT_B3_ACTIVE_IND, NULL},
-  {ST_NCCI_ALLOCATED, ST_NCCI_DISCONNECTED, EV_NCCI_DISCONNECT_B3_IND, NULL},
-  {ST_NCCI_ALLOCATED, ST_NCCI_DISCONNECTING, EV_NCCI_DISCONNECT_B3_REQ, NULL},
-  /* N-ACT */
-  {ST_NCCI_ACTIVE, ST_NCCI_ACTIVE, EV_NCCI_RESET_B3_IND, NULL},
-  {ST_NCCI_ACTIVE, ST_NCCI_RESETING, EV_NCCI_RESET_B3_REQ, NULL},
-  {ST_NCCI_ACTIVE, ST_NCCI_DISCONNECTED, EV_NCCI_DISCONNECT_B3_IND, NULL},
-  {ST_NCCI_ACTIVE, ST_NCCI_DISCONNECTING, EV_NCCI_DISCONNECT_B3_REQ, NULL},
-  /* N-3 */
-  {ST_NCCI_RESETING, ST_NCCI_ACTIVE, EV_NCCI_RESET_B3_IND, NULL},
-  {ST_NCCI_RESETING, ST_NCCI_DISCONNECTED, EV_NCCI_DISCONNECT_B3_IND, NULL},
-  {ST_NCCI_RESETING, ST_NCCI_DISCONNECTING, EV_NCCI_DISCONNECT_B3_REQ, NULL},
-  /* N-4 */
-  {ST_NCCI_DISCONNECTING, ST_NCCI_DISCONNECTED, EV_NCCI_DISCONNECT_B3_IND, NULL},
-  {ST_NCCI_DISCONNECTING, ST_NCCI_PREVIOUS, EV_NCCI_DISCONNECT_B3_CONF_ERROR,NULL},
-  /* N-5 */
-  {ST_NCCI_DISCONNECTED, ST_NCCI_NONE, EV_NCCI_DISCONNECT_B3_RESP, n0},
-  {},
+       /* N-0 */
+       {ST_NCCI_NONE, ST_NCCI_OUTGOING, EV_NCCI_CONNECT_B3_REQ, NULL},
+       {ST_NCCI_NONE, ST_NCCI_INCOMING, EV_NCCI_CONNECT_B3_IND, NULL},
+       /* N-0.1 */
+       {ST_NCCI_OUTGOING, ST_NCCI_ALLOCATED, EV_NCCI_CONNECT_B3_CONF_OK, NULL},
+       {ST_NCCI_OUTGOING, ST_NCCI_NONE, EV_NCCI_CONNECT_B3_CONF_ERROR, n0},
+       /* N-1 */
+       {ST_NCCI_INCOMING, ST_NCCI_DISCONNECTING, EV_NCCI_CONNECT_B3_REJECT, NULL},
+       {ST_NCCI_INCOMING, ST_NCCI_ALLOCATED, EV_NCCI_CONNECT_B3_RESP, NULL},
+       {ST_NCCI_INCOMING, ST_NCCI_DISCONNECTED, EV_NCCI_DISCONNECT_B3_IND, NULL},
+       {ST_NCCI_INCOMING, ST_NCCI_DISCONNECTING, EV_NCCI_DISCONNECT_B3_REQ, NULL},
+       /* N-2 */
+       {ST_NCCI_ALLOCATED, ST_NCCI_ACTIVE, EV_NCCI_CONNECT_B3_ACTIVE_IND, NULL},
+       {ST_NCCI_ALLOCATED, ST_NCCI_DISCONNECTED, EV_NCCI_DISCONNECT_B3_IND, NULL},
+       {ST_NCCI_ALLOCATED, ST_NCCI_DISCONNECTING, EV_NCCI_DISCONNECT_B3_REQ, NULL},
+       /* N-ACT */
+       {ST_NCCI_ACTIVE, ST_NCCI_ACTIVE, EV_NCCI_RESET_B3_IND, NULL},
+       {ST_NCCI_ACTIVE, ST_NCCI_RESETING, EV_NCCI_RESET_B3_REQ, NULL},
+       {ST_NCCI_ACTIVE, ST_NCCI_DISCONNECTED, EV_NCCI_DISCONNECT_B3_IND, NULL},
+       {ST_NCCI_ACTIVE, ST_NCCI_DISCONNECTING, EV_NCCI_DISCONNECT_B3_REQ, NULL},
+       /* N-3 */
+       {ST_NCCI_RESETING, ST_NCCI_ACTIVE, EV_NCCI_RESET_B3_IND, NULL},
+       {ST_NCCI_RESETING, ST_NCCI_DISCONNECTED, EV_NCCI_DISCONNECT_B3_IND, NULL},
+       {ST_NCCI_RESETING, ST_NCCI_DISCONNECTING, EV_NCCI_DISCONNECT_B3_REQ, NULL},
+       /* N-4 */
+       {ST_NCCI_DISCONNECTING, ST_NCCI_DISCONNECTED, EV_NCCI_DISCONNECT_B3_IND, NULL},
+       {ST_NCCI_DISCONNECTING, ST_NCCI_PREVIOUS, EV_NCCI_DISCONNECT_B3_CONF_ERROR, NULL},
+       /* N-5 */
+       {ST_NCCI_DISCONNECTED, ST_NCCI_NONE, EV_NCCI_DISCONNECT_B3_RESP, n0},
+       {},
 };
 
-static void ncci_change_state(capidrv_contr * card, capidrv_ncci * ncci, int event)
+static void ncci_change_state(capidrv_contr *card, capidrv_ncci *ncci, int event)
 {
        struct nccistatechange *p = nccitable;
        while (p->event) {
                if (ncci->state == p->actstate && p->event == event) {
                        if (debugmode)
                                printk(KERN_DEBUG "capidrv-%d: ncci_change_state:0x%x %d -> %d\n",
-                                 card->contrnr, ncci->ncci, ncci->state, p->nextstate);
+                                      card->contrnr, ncci->ncci, ncci->state, p->nextstate);
                        if (p->nextstate == ST_NCCI_PREVIOUS) {
                                ncci->state = ncci->oldstate;
                                ncci->oldstate = p->actstate;
@@ -751,7 +751,7 @@ static void ncci_change_state(capidrv_contr * card, capidrv_ncci * ncci, int eve
 
 /* ------------------------------------------------------------------- */
 
-static inline int new_bchan(capidrv_contr * card)
+static inline int new_bchan(capidrv_contr *card)
 {
        int i;
        for (i = 0; i < card->nbchan; i++) {
@@ -765,7 +765,7 @@ static inline int new_bchan(capidrv_contr * card)
 
 /* ------------------------------------------------------------------- */
 
-static void handle_controller(_cmsg * cmsg)
+static void handle_controller(_cmsg *cmsg)
 {
        capidrv_contr *card = findcontrbynumber(cmsg->adr.adrController & 0x7f);
 
@@ -791,54 +791,54 @@ static void handle_controller(_cmsg * cmsg)
                break;
 
        case CAPI_MANUFACTURER_IND:     /* Controller */
-               if (   cmsg->ManuID == 0x214D5641
+               if (cmsg->ManuID == 0x214D5641
                    && cmsg->Class == 0
                    && cmsg->Function == 1) {
-                  u8  *data = cmsg->ManuData+3;
-                  u16  len = cmsg->ManuData[0];
-                  u16 layer;
-                  int direction;
-                  if (len == 255) {
-                     len = (cmsg->ManuData[1] | (cmsg->ManuData[2] << 8));
-                     data += 2;
-                  }
-                  len -= 2;
-                  layer = ((*(data-1)) << 8) | *(data-2);
-                  if (layer & 0x300)
-                       direction = (layer & 0x200) ? 0 : 1;
-                  else direction = (layer & 0x800) ? 0 : 1;
-                  if (layer & 0x0C00) {
-                       if ((layer & 0xff) == 0x80) {
-                          handle_dtrace_data(card, direction, 1, data, len);
-                          break;
-                       }
-                  } else if ((layer & 0xff) < 0x80) {
-                     handle_dtrace_data(card, direction, 0, data, len);
-                     break;
-                  }
-                  printk(KERN_INFO "capidrv-%d: %s from controller 0x%x layer 0x%x, ignored\n",
-                        card->contrnr, 
-                       capi_cmd2str(cmsg->Command, cmsg->Subcommand),
-                       cmsg->adr.adrController, layer);
-                   break;
+                       u8  *data = cmsg->ManuData + 3;
+                       u16  len = cmsg->ManuData[0];
+                       u16 layer;
+                       int direction;
+                       if (len == 255) {
+                               len = (cmsg->ManuData[1] | (cmsg->ManuData[2] << 8));
+                               data += 2;
+                       }
+                       len -= 2;
+                       layer = ((*(data - 1)) << 8) | *(data - 2);
+                       if (layer & 0x300)
+                               direction = (layer & 0x200) ? 0 : 1;
+                       else direction = (layer & 0x800) ? 0 : 1;
+                       if (layer & 0x0C00) {
+                               if ((layer & 0xff) == 0x80) {
+                                       handle_dtrace_data(card, direction, 1, data, len);
+                                       break;
+                               }
+                       } else if ((layer & 0xff) < 0x80) {
+                               handle_dtrace_data(card, direction, 0, data, len);
+                               break;
+                       }
+                       printk(KERN_INFO "capidrv-%d: %s from controller 0x%x layer 0x%x, ignored\n",
+                              card->contrnr,
+                              capi_cmd2str(cmsg->Command, cmsg->Subcommand),
+                              cmsg->adr.adrController, layer);
+                       break;
                }
                goto ignored;
        case CAPI_MANUFACTURER_CONF:    /* Controller */
                if (cmsg->ManuID == 0x214D5641) {
-                  char *s = NULL;
-                  switch (cmsg->Class) {
-                     case 0: break;
-                     case 1: s = "unknown class"; break;
-                     case 2: s = "unknown function"; break;
-                     default: s = "unknown error"; break;
-                  }
-                  if (s)
-                  printk(KERN_INFO "capidrv-%d: %s from controller 0x%x function %d: %s\n",
-                       card->contrnr,
-                       capi_cmd2str(cmsg->Command, cmsg->Subcommand),
-                       cmsg->adr.adrController,
-                       cmsg->Function, s);
-                  break;
+                       char *s = NULL;
+                       switch (cmsg->Class) {
+                       case 0: break;
+                       case 1: s = "unknown class"; break;
+                       case 2: s = "unknown function"; break;
+                       default: s = "unknown error"; break;
+                       }
+                       if (s)
+                               printk(KERN_INFO "capidrv-%d: %s from controller 0x%x function %d: %s\n",
+                                      card->contrnr,
+                                      capi_cmd2str(cmsg->Command, cmsg->Subcommand),
+                                      cmsg->adr.adrController,
+                                      cmsg->Function, s);
+                       break;
                }
                goto ignored;
        case CAPI_FACILITY_IND: /* Controller/plci/ncci */
@@ -858,14 +858,14 @@ static void handle_controller(_cmsg * cmsg)
        }
        return;
 
-      ignored:
+ignored:
        printk(KERN_INFO "capidrv-%d: %s from controller 0x%x ignored\n",
               card->contrnr,
               capi_cmd2str(cmsg->Command, cmsg->Subcommand),
               cmsg->adr.adrController);
 }
 
-static void handle_incoming_call(capidrv_contr * card, _cmsg * cmsg)
+static void handle_incoming_call(capidrv_contr *card, _cmsg *cmsg)
 {
        capidrv_plci *plcip;
        capidrv_bchan *bchan;
@@ -890,27 +890,27 @@ static void handle_incoming_call(capidrv_contr * card, _cmsg * cmsg)
        cmd.arg = chan;
        memset(&cmd.parm.setup, 0, sizeof(cmd.parm.setup));
        strncpy(cmd.parm.setup.phone,
-               cmsg->CallingPartyNumber + 3,
+               cmsg->CallingPartyNumber + 3,
                cmsg->CallingPartyNumber[0] - 2);
        strncpy(cmd.parm.setup.eazmsn,
-               cmsg->CalledPartyNumber + 2,
+               cmsg->CalledPartyNumber + 2,
                cmsg->CalledPartyNumber[0] - 1);
        cmd.parm.setup.si1 = cip2si1(cmsg->CIPValue);
        cmd.parm.setup.si2 = cip2si2(cmsg->CIPValue);
        cmd.parm.setup.plan = cmsg->CallingPartyNumber[1];
        cmd.parm.setup.screen = cmsg->CallingPartyNumber[2];
 
-       printk(KERN_INFO "capidrv-%d: incoming call %s,%d,%d,%s\n", 
-                       card->contrnr,
-                       cmd.parm.setup.phone,
-                       cmd.parm.setup.si1,
-                       cmd.parm.setup.si2,
-                       cmd.parm.setup.eazmsn);
+       printk(KERN_INFO "capidrv-%d: incoming call %s,%d,%d,%s\n",
+              card->contrnr,
+              cmd.parm.setup.phone,
+              cmd.parm.setup.si1,
+              cmd.parm.setup.si2,
+              cmd.parm.setup.eazmsn);
 
        if (cmd.parm.setup.si1 == 1 && cmd.parm.setup.si2 != 0) {
-               printk(KERN_INFO "capidrv-%d: patching si2=%d to 0 for VBOX\n", 
-                       card->contrnr,
-                       cmd.parm.setup.si2);
+               printk(KERN_INFO "capidrv-%d: patching si2=%d to 0 for VBOX\n",
+                      card->contrnr,
+                      cmd.parm.setup.si2);
                cmd.parm.setup.si2 = 0;
        }
 
@@ -927,11 +927,11 @@ static void handle_incoming_call(capidrv_contr * card, _cmsg * cmsg)
                plci_change_state(card, plcip, EV_PLCI_CONNECT_REJECT);
                send_message(card, cmsg);
                printk(KERN_INFO "capidrv-%d: incoming call %s,%d,%d,%s ignored\n",
-                       card->contrnr,
-                       cmd.parm.setup.phone,
-                       cmd.parm.setup.si1,
-                       cmd.parm.setup.si2,
-                       cmd.parm.setup.eazmsn);
+                      card->contrnr,
+                      cmd.parm.setup.phone,
+                      cmd.parm.setup.si1,
+                      cmd.parm.setup.si2,
+                      cmd.parm.setup.eazmsn);
                break;
        case 1:
                /* At least one device matching this call (RING on ttyI)
@@ -945,11 +945,11 @@ static void handle_incoming_call(capidrv_contr * card, _cmsg * cmsg)
                 */
                if (plcip->state == ST_PLCI_INCOMING) {
                        printk(KERN_INFO "capidrv-%d: incoming call %s,%d,%d,%s tty alerting\n",
-                               card->contrnr,
-                               cmd.parm.setup.phone,
-                               cmd.parm.setup.si1,
-                               cmd.parm.setup.si2,
-                               cmd.parm.setup.eazmsn);
+                              card->contrnr,
+                              cmd.parm.setup.phone,
+                              cmd.parm.setup.si1,
+                              cmd.parm.setup.si2,
+                              cmd.parm.setup.eazmsn);
                        capi_fill_ALERT_REQ(cmsg,
                                            global.ap.applid,
                                            card->msgid++,
@@ -958,16 +958,16 @@ static void handle_incoming_call(capidrv_contr * card, _cmsg * cmsg)
                                            NULL,/* Keypadfacility */
                                            NULL,/* Useruserdata */
                                            NULL /* Facilitydataarray */
-                       );
+                               );
                        plcip->msgid = cmsg->Messagenumber;
                        send_message(card, cmsg);
                } else {
                        printk(KERN_INFO "capidrv-%d: incoming call %s,%d,%d,%s on netdev\n",
-                               card->contrnr,
-                               cmd.parm.setup.phone,
-                               cmd.parm.setup.si1,
-                               cmd.parm.setup.si2,
-                               cmd.parm.setup.eazmsn);
+                              card->contrnr,
+                              cmd.parm.setup.phone,
+                              cmd.parm.setup.si1,
+                              cmd.parm.setup.si2,
+                              cmd.parm.setup.eazmsn);
                }
                break;
 
@@ -990,7 +990,7 @@ static void handle_incoming_call(capidrv_contr * card, _cmsg * cmsg)
        return;
 }
 
-static void handle_plci(_cmsg * cmsg)
+static void handle_plci(_cmsg *cmsg)
 {
        capidrv_contr *card = findcontrbynumber(cmsg->adr.adrController & 0x7f);
        capidrv_plci *plcip;
@@ -1008,8 +1008,8 @@ static void handle_plci(_cmsg * cmsg)
        case CAPI_DISCONNECT_IND:       /* plci */
                if (cmsg->Reason) {
                        printk(KERN_INFO "capidrv-%d: %s reason 0x%x (%s) for plci 0x%x\n",
-                          card->contrnr,
-                          capi_cmd2str(cmsg->Command, cmsg->Subcommand),
+                              card->contrnr,
+                              capi_cmd2str(cmsg->Command, cmsg->Subcommand),
                               cmsg->Reason, capi_info2str(cmsg->Reason), cmsg->adr.adrPLCI);
                }
                if (!(plcip = find_plci_by_plci(card, cmsg->adr.adrPLCI))) {
@@ -1027,9 +1027,9 @@ static void handle_plci(_cmsg * cmsg)
        case CAPI_DISCONNECT_CONF:      /* plci */
                if (cmsg->Info) {
                        printk(KERN_INFO "capidrv-%d: %s info 0x%x (%s) for plci 0x%x\n",
-                          card->contrnr,
-                          capi_cmd2str(cmsg->Command, cmsg->Subcommand),
-                              cmsg->Info, capi_info2str(cmsg->Info), 
+                              card->contrnr,
+                              capi_cmd2str(cmsg->Command, cmsg->Subcommand),
+                              cmsg->Info, capi_info2str(cmsg->Info),
                               cmsg->adr.adrPLCI);
                }
                if (!(plcip = find_plci_by_plci(card, cmsg->adr.adrPLCI)))
@@ -1041,9 +1041,9 @@ static void handle_plci(_cmsg * cmsg)
        case CAPI_ALERT_CONF:   /* plci */
                if (cmsg->Info) {
                        printk(KERN_INFO "capidrv-%d: %s info 0x%x (%s) for plci 0x%x\n",
-                          card->contrnr,
-                          capi_cmd2str(cmsg->Command, cmsg->Subcommand),
-                              cmsg->Info, capi_info2str(cmsg->Info), 
+                              card->contrnr,
+                              capi_cmd2str(cmsg->Command, cmsg->Subcommand),
+                              cmsg->Info, capi_info2str(cmsg->Info),
                               cmsg->adr.adrPLCI);
                }
                break;
@@ -1055,9 +1055,9 @@ static void handle_plci(_cmsg * cmsg)
        case CAPI_CONNECT_CONF: /* plci */
                if (cmsg->Info) {
                        printk(KERN_INFO "capidrv-%d: %s info 0x%x (%s) for plci 0x%x\n",
-                          card->contrnr,
-                          capi_cmd2str(cmsg->Command, cmsg->Subcommand),
-                              cmsg->Info, capi_info2str(cmsg->Info), 
+                              card->contrnr,
+                              capi_cmd2str(cmsg->Command, cmsg->Subcommand),
+                              cmsg->Info, capi_info2str(cmsg->Info),
                               cmsg->adr.adrPLCI);
                }
                if (!(plcip = find_plci_by_msgid(card, cmsg->Messagenumber)))
@@ -1096,7 +1096,7 @@ static void handle_plci(_cmsg * cmsg)
                                                 card->msgid++,
                                                 plcip->plci,   /* adr */
                                                 NULL   /* NCPI */
-                       );
+                               );
                        nccip->msgid = cmsg->Messagenumber;
                        plci_change_state(card, plcip,
                                          EV_PLCI_CONNECT_ACTIVE_IND);
@@ -1122,8 +1122,8 @@ static void handle_plci(_cmsg * cmsg)
                                sprintf(cmd.parm.num, "%lu",
                                        (unsigned long)
                                        ((u32) cmsg->InfoElement[1]
-                                 | ((u32) (cmsg->InfoElement[2]) << 8)
-                                | ((u32) (cmsg->InfoElement[3]) << 16)
+                                        | ((u32) (cmsg->InfoElement[2]) << 8)
+                                        | ((u32) (cmsg->InfoElement[3]) << 16)
                                         | ((u32) (cmsg->InfoElement[4]) << 24)));
                                card->interface.statcallb(&cmd);
                                break;
@@ -1132,11 +1132,11 @@ static void handle_plci(_cmsg * cmsg)
                cdb = capi_cmsg2str(cmsg);
                if (cdb) {
                        printk(KERN_WARNING "capidrv-%d: %s\n",
-                               card->contrnr, cdb->buf);
+                              card->contrnr, cdb->buf);
                        cdebbuf_free(cdb);
                } else
                        printk(KERN_WARNING "capidrv-%d: CAPI_INFO_IND InfoNumber %x not handled\n",
-                               card->contrnr, cmsg->InfoNumber);
+                              card->contrnr, cmsg->InfoNumber);
 
                break;
 
@@ -1159,13 +1159,13 @@ static void handle_plci(_cmsg * cmsg)
                       cmsg->adr.adrPLCI);
        }
        return;
-      ignored:
+ignored:
        printk(KERN_INFO "capidrv-%d: %s for plci 0x%x ignored\n",
               card->contrnr,
               capi_cmd2str(cmsg->Command, cmsg->Subcommand),
               cmsg->adr.adrPLCI);
        return;
-      notfound:
+notfound:
        printk(KERN_ERR "capidrv-%d: %s: plci 0x%x not found\n",
               card->contrnr,
               capi_cmd2str(cmsg->Command, cmsg->Subcommand),
@@ -1173,7 +1173,7 @@ static void handle_plci(_cmsg * cmsg)
        return;
 }
 
-static void handle_ncci(_cmsg * cmsg)
+static void handle_ncci(_cmsg *cmsg)
 {
        capidrv_contr *card = findcontrbynumber(cmsg->adr.adrController & 0x7f);
        capidrv_plci *plcip;
@@ -1222,7 +1222,7 @@ static void handle_ncci(_cmsg * cmsg)
                                                          nccip->ncci,  /* adr */
                                                          0,    /* Reject */
                                                          NULL  /* NCPI */
-                               );
+                                       );
                                ncci_change_state(card, nccip, EV_NCCI_CONNECT_B3_RESP);
                                send_message(card, cmsg);
                                break;
@@ -1230,8 +1230,8 @@ static void handle_ncci(_cmsg * cmsg)
                        printk(KERN_ERR "capidrv-%d: no mem for ncci, sorry\n",                                                 card->contrnr);
                } else {
                        printk(KERN_ERR "capidrv-%d: %s: plci for ncci 0x%x not found\n",
-                          card->contrnr,
-                          capi_cmd2str(cmsg->Command, cmsg->Subcommand),
+                              card->contrnr,
+                              capi_cmd2str(cmsg->Command, cmsg->Subcommand),
                               cmsg->adr.adrNCCI);
                }
                capi_fill_CONNECT_B3_RESP(cmsg,
@@ -1240,7 +1240,7 @@ static void handle_ncci(_cmsg * cmsg)
                                          cmsg->adr.adrNCCI,
                                          2,    /* Reject */
                                          NULL  /* NCPI */
-               );
+                       );
                send_message(card, cmsg);
                break;
 
@@ -1254,9 +1254,9 @@ static void handle_ncci(_cmsg * cmsg)
                nccip->ncci = cmsg->adr.adrNCCI;
                if (cmsg->Info) {
                        printk(KERN_INFO "capidrv-%d: %s info 0x%x (%s) for ncci 0x%x\n",
-                          card->contrnr,
-                          capi_cmd2str(cmsg->Command, cmsg->Subcommand),
-                              cmsg->Info, capi_info2str(cmsg->Info), 
+                              card->contrnr,
+                              capi_cmd2str(cmsg->Command, cmsg->Subcommand),
+                              cmsg->Info, capi_info2str(cmsg->Info),
                               cmsg->adr.adrNCCI);
                }
 
@@ -1278,7 +1278,7 @@ static void handle_ncci(_cmsg * cmsg)
        case CAPI_DATA_B3_CONF: /* ncci */
                if (cmsg->Info) {
                        printk(KERN_WARNING "CAPI_DATA_B3_CONF: Info %x - %s\n",
-                               cmsg->Info, capi_info2str(cmsg->Info));
+                              cmsg->Info, capi_info2str(cmsg->Info));
                }
                if (!(nccip = find_ncci(card, cmsg->adr.adrNCCI)))
                        goto notfound;
@@ -1286,11 +1286,11 @@ static void handle_ncci(_cmsg * cmsg)
                len = capidrv_del_ack(nccip, cmsg->DataHandle);
                if (len < 0)
                        break;
-               cmd.command = ISDN_STAT_BSENT;
-               cmd.driver = card->myid;
-               cmd.arg = nccip->chan;
+               cmd.command = ISDN_STAT_BSENT;
+               cmd.driver = card->myid;
+               cmd.arg = nccip->chan;
                cmd.parm.length = len;
-               card->interface.statcallb(&cmd);
+               card->interface.statcallb(&cmd);
                break;
 
        case CAPI_DISCONNECT_B3_IND:    /* ncci */
@@ -1309,9 +1309,9 @@ static void handle_ncci(_cmsg * cmsg)
                        goto notfound;
                if (cmsg->Info) {
                        printk(KERN_INFO "capidrv-%d: %s info 0x%x (%s) for ncci 0x%x\n",
-                          card->contrnr,
-                          capi_cmd2str(cmsg->Command, cmsg->Subcommand),
-                              cmsg->Info, capi_info2str(cmsg->Info), 
+                              card->contrnr,
+                              capi_cmd2str(cmsg->Command, cmsg->Subcommand),
+                              cmsg->Info, capi_info2str(cmsg->Info),
                               cmsg->adr.adrNCCI);
                        ncci_change_state(card, nccip, EV_NCCI_DISCONNECT_B3_CONF_ERROR);
                }
@@ -1340,13 +1340,13 @@ static void handle_ncci(_cmsg * cmsg)
                       cmsg->adr.adrNCCI);
        }
        return;
-      ignored:
+ignored:
        printk(KERN_INFO "capidrv-%d: %s for ncci 0x%x ignored\n",
               card->contrnr,
               capi_cmd2str(cmsg->Command, cmsg->Subcommand),
               cmsg->adr.adrNCCI);
        return;
-      notfound:
+notfound:
        printk(KERN_ERR "capidrv-%d: %s: ncci 0x%x not found\n",
               card->contrnr,
               capi_cmd2str(cmsg->Command, cmsg->Subcommand),
@@ -1354,7 +1354,7 @@ static void handle_ncci(_cmsg * cmsg)
 }
 
 
-static void handle_data(_cmsg * cmsg, struct sk_buff *skb)
+static void handle_data(_cmsg *cmsg, struct sk_buff *skb)
 {
        capidrv_contr *card = findcontrbynumber(cmsg->adr.adrController & 0x7f);
        capidrv_ncci *nccip;
@@ -1390,12 +1390,12 @@ static void capidrv_recv_message(struct capi20_appl *ap, struct sk_buff *skb)
 
                if (cdb) {
                        printk(KERN_DEBUG "%s: applid=%d %s\n", __func__,
-                               ap->applid, cdb->buf);
+                              ap->applid, cdb->buf);
                        cdebbuf_free(cdb);
                } else
                        printk(KERN_DEBUG "%s: applid=%d %s not traced\n",
-                               __func__, ap->applid,
-                               capi_cmd2str(s_cmsg.Command, s_cmsg.Subcommand));
+                              __func__, ap->applid,
+                              capi_cmd2str(s_cmsg.Command, s_cmsg.Subcommand));
        }
        if (s_cmsg.Command == CAPI_DATA_B3
            && s_cmsg.Subcommand == CAPI_IND) {
@@ -1418,38 +1418,38 @@ static void capidrv_recv_message(struct capi20_appl *ap, struct sk_buff *skb)
 
 /* ------------------------------------------------------------------- */
 
-#define PUTBYTE_TO_STATUS(card, byte) \
-       do { \
-               *(card)->q931_write++ = (byte); \
-               if ((card)->q931_write > (card)->q931_end) \
-                       (card)->q931_write = (card)->q931_buf; \
+#define PUTBYTE_TO_STATUS(card, byte)                          \
+       do {                                                    \
+               *(card)->q931_write++ = (byte);                 \
+               if ((card)->q931_write > (card)->q931_end)      \
+                       (card)->q931_write = (card)->q931_buf;  \
        } while (0)
 
 static void handle_dtrace_data(capidrv_contr *card,
-                            int send, int level2, u8 *data, u16 len)
+                              int send, int level2, u8 *data, u16 len)
 {
-       u8 *p, *end;
-       isdn_ctrl cmd;
+       u8 *p, *end;
+       isdn_ctrl cmd;
 
-       if (!len) {
+       if (!len) {
                printk(KERN_DEBUG "capidrv-%d: avmb1_q931_data: len == %d\n",
-                               card->contrnr, len);
+                      card->contrnr, len);
                return;
        }
 
        if (level2) {
                PUTBYTE_TO_STATUS(card, 'D');
                PUTBYTE_TO_STATUS(card, '2');
-               PUTBYTE_TO_STATUS(card, send ? '>' : '<');
-               PUTBYTE_TO_STATUS(card, ':');
+               PUTBYTE_TO_STATUS(card, send ? '>' : '<');
+               PUTBYTE_TO_STATUS(card, ':');
        } else {
-               PUTBYTE_TO_STATUS(card, 'D');
-               PUTBYTE_TO_STATUS(card, '3');
-               PUTBYTE_TO_STATUS(card, send ? '>' : '<');
-               PUTBYTE_TO_STATUS(card, ':');
-       }
+               PUTBYTE_TO_STATUS(card, 'D');
+               PUTBYTE_TO_STATUS(card, '3');
+               PUTBYTE_TO_STATUS(card, send ? '>' : '<');
+               PUTBYTE_TO_STATUS(card, ':');
+       }
 
-       for (p = data, end = data+len; p < end; p++) {
+       for (p = data, end = data + len; p < end; p++) {
                PUTBYTE_TO_STATUS(card, ' ');
                PUTBYTE_TO_STATUS(card, hex_asc_hi(*p));
                PUTBYTE_TO_STATUS(card, hex_asc_lo(*p));
@@ -1458,7 +1458,7 @@ static void handle_dtrace_data(capidrv_contr *card,
 
        cmd.command = ISDN_STAT_STAVAIL;
        cmd.driver = card->myid;
-       cmd.arg = len*3+5;
+       cmd.arg = len * 3 + 5;
        card->interface.statcallb(&cmd);
 }
 
@@ -1466,17 +1466,17 @@ static void handle_dtrace_data(capidrv_contr *card,
 
 static _cmsg cmdcmsg;
 
-static int capidrv_ioctl(isdn_ctrl * c, capidrv_contr * card)
+static int capidrv_ioctl(isdn_ctrl *c, capidrv_contr *card)
 {
        switch (c->arg) {
        case 1:
                debugmode = (int)(*((unsigned int *)c->parm.num));
                printk(KERN_DEBUG "capidrv-%d: debugmode=%d\n",
-                               card->contrnr, debugmode);
+                      card->contrnr, debugmode);
                return 0;
        default:
                printk(KERN_DEBUG "capidrv-%d: capidrv_ioctl(%ld) called ??\n",
-                               card->contrnr, c->arg);
+                      card->contrnr, c->arg);
                return -EINVAL;
        }
        return -EINVAL;
@@ -1487,9 +1487,9 @@ static int capidrv_ioctl(isdn_ctrl * c, capidrv_contr * card)
  */
 
 struct internal_bchannelinfo {
-   unsigned short channelalloc;
-   unsigned short operation;
-   unsigned char  cmask[31];
+       unsigned short channelalloc;
+       unsigned short operation;
+       unsigned char  cmask[31];
 };
 
 static int decodeFVteln(char *teln, unsigned long *bmaskp, int *activep)
@@ -1540,10 +1540,10 @@ static int decodeFVteln(char *teln, unsigned long *bmaskp, int *activep)
                if (digit2 <= 0 || digit2 > 30) return -4;
                if (*s == 0 || *s == ',' || *s == ' ') {
                        if (digit1 > digit2)
-                               for (i = digit2; i <= digit1 ; i++)
+                               for (i = digit2; i <= digit1; i++)
                                        bmask |= (1 << i);
-                       else 
-                               for (i = digit1; i <= digit2 ; i++)
+                       else
+                               for (i = digit1; i <= digit2; i++)
                                        bmask |= (1 << i);
                        digit1 = digit2 = 0;
                        if (*s) s++;
@@ -1556,131 +1556,131 @@ static int decodeFVteln(char *teln, unsigned long *bmaskp, int *activep)
        return 0;
 }
 
-static int FVteln2capi20(char *teln, u8 AdditionalInfo[1+2+2+31])
+static int FVteln2capi20(char *teln, u8 AdditionalInfo[1 + 2 + 2 + 31])
 {
        unsigned long bmask;
        int active;
        int rc, i;
-   
+
        rc = decodeFVteln(teln, &bmask, &active);
        if (rc) return rc;
        /* Length */
-       AdditionalInfo[0] = 2+2+31;
-        /* Channel: 3 => use channel allocation */
-        AdditionalInfo[1] = 3; AdditionalInfo[2] = 0;
+       AdditionalInfo[0] = 2 + 2 + 31;
+       /* Channel: 3 => use channel allocation */
+       AdditionalInfo[1] = 3; AdditionalInfo[2] = 0;
        /* Operation: 0 => DTE mode, 1 => DCE mode */
-        if (active) {
-               AdditionalInfo[3] = 0; AdditionalInfo[4] = 0;
-       } else {
-               AdditionalInfo[3] = 1; AdditionalInfo[4] = 0;
+       if (active) {
+               AdditionalInfo[3] = 0; AdditionalInfo[4] = 0;
+       } else {
+               AdditionalInfo[3] = 1; AdditionalInfo[4] = 0;
        }
        /* Channel mask array */
        AdditionalInfo[5] = 0; /* no D-Channel */
-       for (i=1; i <= 30; i++)
-               AdditionalInfo[5+i] = (bmask & (1 << i)) ? 0xff : 0;
+       for (i = 1; i <= 30; i++)
+               AdditionalInfo[5 + i] = (bmask & (1 << i)) ? 0xff : 0;
        return 0;
 }
 
-static int capidrv_command(isdn_ctrl * c, capidrv_contr * card)
+static int capidrv_command(isdn_ctrl *c, capidrv_contr *card)
 {
        isdn_ctrl cmd;
        struct capidrv_bchan *bchan;
        struct capidrv_plci *plcip;
-       u8 AdditionalInfo[1+2+2+31];
-        int rc, isleasedline = 0;
+       u8 AdditionalInfo[1 + 2 + 2 + 31];
+       int rc, isleasedline = 0;
 
        if (c->command == ISDN_CMD_IOCTL)
                return capidrv_ioctl(c, card);
 
        switch (c->command) {
        case ISDN_CMD_DIAL:{
-                       u8 calling[ISDN_MSNLEN + 3];
-                       u8 called[ISDN_MSNLEN + 2];
+               u8 calling[ISDN_MSNLEN + 3];
+               u8 called[ISDN_MSNLEN + 2];
 
-                       if (debugmode)
-                               printk(KERN_DEBUG "capidrv-%d: ISDN_CMD_DIAL(ch=%ld,\"%s,%d,%d,%s\")\n",
-                                       card->contrnr,
-                                       c->arg,
-                                       c->parm.setup.phone,
-                                       c->parm.setup.si1,
-                                       c->parm.setup.si2,
-                                       c->parm.setup.eazmsn);
-
-                       bchan = &card->bchans[c->arg % card->nbchan];
-
-                       if (bchan->plcip) {
-                               printk(KERN_ERR "capidrv-%d: dail ch=%ld,\"%s,%d,%d,%s\" in use (plci=0x%x)\n",
-                                       card->contrnr,
-                                       c->arg, 
-                                       c->parm.setup.phone,
-                                       c->parm.setup.si1,
-                                       c->parm.setup.si2,
-                                       c->parm.setup.eazmsn,
-                                       bchan->plcip->plci);
-                               return 0;
-                       }
-                       bchan->si1 = c->parm.setup.si1;
-                       bchan->si2 = c->parm.setup.si2;
-
-                       strncpy(bchan->num, c->parm.setup.phone, sizeof(bchan->num));
-                       strncpy(bchan->mynum, c->parm.setup.eazmsn, sizeof(bchan->mynum));
-                        rc = FVteln2capi20(bchan->num, AdditionalInfo);
-                       isleasedline = (rc == 0);
-                       if (rc < 0)
-                               printk(KERN_ERR "capidrv-%d: WARNING: invalid leased linedefinition \"%s\"\n", card->contrnr, bchan->num);
-
-                       if (isleasedline) {
-                               calling[0] = 0;
-                               called[0] = 0;
-                               if (debugmode)
-                                       printk(KERN_DEBUG "capidrv-%d: connecting leased line\n", card->contrnr);
-                       } else {
-                               calling[0] = strlen(bchan->mynum) + 2;
-                               calling[1] = 0;
-                               calling[2] = 0x80;
-                               strncpy(calling + 3, bchan->mynum, ISDN_MSNLEN);
-                               called[0] = strlen(bchan->num) + 1;
-                               called[1] = 0x80;
-                               strncpy(called + 2, bchan->num, ISDN_MSNLEN);
-                       }
+               if (debugmode)
+                       printk(KERN_DEBUG "capidrv-%d: ISDN_CMD_DIAL(ch=%ld,\"%s,%d,%d,%s\")\n",
+                              card->contrnr,
+                              c->arg,
+                              c->parm.setup.phone,
+                              c->parm.setup.si1,
+                              c->parm.setup.si2,
+                              c->parm.setup.eazmsn);
 
-                       capi_fill_CONNECT_REQ(&cmdcmsg,
-                                             global.ap.applid,
-                                             card->msgid++,
-                                             card->contrnr,    /* adr */
-                                         si2cip(bchan->si1, bchan->si2),       /* cipvalue */
-                                             called,   /* CalledPartyNumber */
-                                             calling,  /* CallingPartyNumber */
-                                             NULL,     /* CalledPartySubaddress */
-                                             NULL,     /* CallingPartySubaddress */
-                                           b1prot(bchan->l2, bchan->l3),       /* B1protocol */
-                                           b2prot(bchan->l2, bchan->l3),       /* B2protocol */
-                                           b3prot(bchan->l2, bchan->l3),       /* B3protocol */
-                                           b1config(bchan->l2, bchan->l3),     /* B1configuration */
-                                             NULL,     /* B2configuration */
-                                             NULL,     /* B3configuration */
-                                             NULL,     /* BC */
-                                             NULL,     /* LLC */
-                                             NULL,     /* HLC */
-                                             /* BChannelinformation */
-                                             isleasedline ? AdditionalInfo : NULL,
-                                             NULL,     /* Keypadfacility */
-                                             NULL,     /* Useruserdata */
-                                             NULL      /* Facilitydataarray */
-                           );
-                       if ((plcip = new_plci(card, (c->arg % card->nbchan))) == NULL) {
-                               cmd.command = ISDN_STAT_DHUP;
-                               cmd.driver = card->myid;
-                               cmd.arg = (c->arg % card->nbchan);
-                               card->interface.statcallb(&cmd);
-                               return -1;
-                       }
-                       plcip->msgid = cmdcmsg.Messagenumber;
-                       plcip->leasedline = isleasedline;
-                       plci_change_state(card, plcip, EV_PLCI_CONNECT_REQ);
-                       send_message(card, &cmdcmsg);
+               bchan = &card->bchans[c->arg % card->nbchan];
+
+               if (bchan->plcip) {
+                       printk(KERN_ERR "capidrv-%d: dail ch=%ld,\"%s,%d,%d,%s\" in use (plci=0x%x)\n",
+                              card->contrnr,
+                              c->arg,
+                              c->parm.setup.phone,
+                              c->parm.setup.si1,
+                              c->parm.setup.si2,
+                              c->parm.setup.eazmsn,
+                              bchan->plcip->plci);
                        return 0;
                }
+               bchan->si1 = c->parm.setup.si1;
+               bchan->si2 = c->parm.setup.si2;
+
+               strncpy(bchan->num, c->parm.setup.phone, sizeof(bchan->num));
+               strncpy(bchan->mynum, c->parm.setup.eazmsn, sizeof(bchan->mynum));
+               rc = FVteln2capi20(bchan->num, AdditionalInfo);
+               isleasedline = (rc == 0);
+               if (rc < 0)
+                       printk(KERN_ERR "capidrv-%d: WARNING: invalid leased linedefinition \"%s\"\n", card->contrnr, bchan->num);
+
+               if (isleasedline) {
+                       calling[0] = 0;
+                       called[0] = 0;
+                       if (debugmode)
+                               printk(KERN_DEBUG "capidrv-%d: connecting leased line\n", card->contrnr);
+               } else {
+                       calling[0] = strlen(bchan->mynum) + 2;
+                       calling[1] = 0;
+                       calling[2] = 0x80;
+                       strncpy(calling + 3, bchan->mynum, ISDN_MSNLEN);
+                       called[0] = strlen(bchan->num) + 1;
+                       called[1] = 0x80;
+                       strncpy(called + 2, bchan->num, ISDN_MSNLEN);
+               }
+
+               capi_fill_CONNECT_REQ(&cmdcmsg,
+                                     global.ap.applid,
+                                     card->msgid++,
+                                     card->contrnr,    /* adr */
+                                     si2cip(bchan->si1, bchan->si2),   /* cipvalue */
+                                     called,   /* CalledPartyNumber */
+                                     calling,  /* CallingPartyNumber */
+                                     NULL,     /* CalledPartySubaddress */
+                                     NULL,     /* CallingPartySubaddress */
+                                     b1prot(bchan->l2, bchan->l3),     /* B1protocol */
+                                     b2prot(bchan->l2, bchan->l3),     /* B2protocol */
+                                     b3prot(bchan->l2, bchan->l3),     /* B3protocol */
+                                     b1config(bchan->l2, bchan->l3),   /* B1configuration */
+                                     NULL,     /* B2configuration */
+                                     NULL,     /* B3configuration */
+                                     NULL,     /* BC */
+                                     NULL,     /* LLC */
+                                     NULL,     /* HLC */
+                                     /* BChannelinformation */
+                                     isleasedline ? AdditionalInfo : NULL,
+                                     NULL,     /* Keypadfacility */
+                                     NULL,     /* Useruserdata */
+                                     NULL      /* Facilitydataarray */
+                       );
+               if ((plcip = new_plci(card, (c->arg % card->nbchan))) == NULL) {
+                       cmd.command = ISDN_STAT_DHUP;
+                       cmd.driver = card->myid;
+                       cmd.arg = (c->arg % card->nbchan);
+                       card->interface.statcallb(&cmd);
+                       return -1;
+               }
+               plcip->msgid = cmdcmsg.Messagenumber;
+               plcip->leasedline = isleasedline;
+               plci_change_state(card, plcip, EV_PLCI_CONNECT_REQ);
+               send_message(card, &cmdcmsg);
+               return 0;
+       }
 
        case ISDN_CMD_ACCEPTD:
 
@@ -1708,7 +1708,7 @@ static int capidrv_command(isdn_ctrl * c, capidrv_contr * card)
                                       NULL,    /* Keypadfacility */
                                       NULL,    /* Useruserdata */
                                       NULL     /* Facilitydataarray */
-               );
+                       );
                capi_cmsg2message(&cmdcmsg, cmdcmsg.buf);
                plci_change_state(card, bchan->plcip, EV_PLCI_CONNECT_RESP);
                send_message(card, &cmdcmsg);
@@ -1742,7 +1742,7 @@ static int capidrv_command(isdn_ctrl * c, capidrv_contr * card)
                                                    card->msgid++,
                                                    bchan->nccip->ncci,
                                                    NULL        /* NCPI */
-                       );
+                               );
                        ncci_change_state(card, bchan->nccip, EV_NCCI_DISCONNECT_B3_REQ);
                        send_message(card, &cmdcmsg);
                        return 0;
@@ -1761,12 +1761,12 @@ static int capidrv_command(isdn_ctrl * c, capidrv_contr * card)
                                capi_fill_DISCONNECT_REQ(&cmdcmsg,
                                                         global.ap.applid,
                                                         card->msgid++,
-                                                     bchan->plcip->plci,
+                                                        bchan->plcip->plci,
                                                         NULL,  /* BChannelinformation */
                                                         NULL,  /* Keypadfacility */
                                                         NULL,  /* Useruserdata */
                                                         NULL   /* Facilitydataarray */
-                               );
+                                       );
                                plci_change_state(card, bchan->plcip, EV_PLCI_DISCONNECT_REQ);
                                send_message(card, &cmdcmsg);
                                return 0;
@@ -1778,8 +1778,8 @@ static int capidrv_command(isdn_ctrl * c, capidrv_contr * card)
                        }
                }
                printk(KERN_ERR "capidrv-%d: chan %ld disconnect request on free channel\n",
-                                      card->contrnr,
-                                      c->arg);
+                      card->contrnr,
+                      c->arg);
                return -EINVAL;
 /* ready */
 
@@ -1813,20 +1813,20 @@ static int capidrv_command(isdn_ctrl * c, capidrv_contr * card)
        case ISDN_CMD_CLREAZ:
                if (debugmode)
                        printk(KERN_DEBUG "capidrv-%d: clearing EAZ on chan %ld\n",
-                                       card->contrnr, c->arg);
+                              card->contrnr, c->arg);
                bchan = &card->bchans[c->arg % card->nbchan];
                bchan->msn[0] = 0;
                return 0;
 
        default:
                printk(KERN_ERR "capidrv-%d: ISDN_CMD_%d, Huh?\n",
-                                       card->contrnr, c->command);
+                      card->contrnr, c->command);
                return -EINVAL;
        }
        return 0;
 }
 
-static int if_command(isdn_ctrl * c)
+static int if_command(isdn_ctrl *c)
 {
        capidrv_contr *card = findcontrbydriverid(c->driver);
 
@@ -1834,8 +1834,8 @@ static int if_command(isdn_ctrl * c)
                return capidrv_command(c, card);
 
        printk(KERN_ERR
-            "capidrv: if_command %d called with invalid driverId %d!\n",
-                                               c->command, c->driver);
+              "capidrv: if_command %d called with invalid driverId %d!\n",
+              c->command, c->driver);
        return -ENODEV;
 }
 
@@ -1859,7 +1859,7 @@ static int if_sendbuf(int id, int channel, int doack, struct sk_buff *skb)
        }
        if (debugmode > 4)
                printk(KERN_DEBUG "capidrv-%d: sendbuf len=%d skb=%p doack=%d\n",
-                                       card->contrnr, len, skb, doack);
+                      card->contrnr, len, skb, doack);
        bchan = &card->bchans[channel % card->nbchan];
        nccip = bchan->nccip;
        if (!nccip || nccip->state != ST_NCCI_ACTIVE) {
@@ -1891,10 +1891,10 @@ static int if_sendbuf(int id, int channel, int doack, struct sk_buff *skb)
                              skb->len,         /* DataLength */
                              datahandle,       /* DataHandle */
                              0 /* Flags */
-           );
+               );
 
        if (capidrv_add_ack(nccip, datahandle, doack ? (int)skb->len : -1) < 0)
-          return 0;
+               return 0;
 
        capi_cmsg2message(&sendcmsg, sendcmsg.buf);
        msglen = CAPIMSG_LEN(sendcmsg.buf);
@@ -1902,8 +1902,8 @@ static int if_sendbuf(int id, int channel, int doack, struct sk_buff *skb)
                struct sk_buff *nskb = skb_realloc_headroom(skb, msglen);
                if (!nskb) {
                        printk(KERN_ERR "capidrv-%d: if_sendbuf: no memory\n",
-                               card->contrnr);
-                       (void)capidrv_del_ack(nccip, datahandle);
+                              card->contrnr);
+                       (void)capidrv_del_ack(nccip, datahandle);
                        return 0;
                }
                printk(KERN_DEBUG "capidrv-%d: only %d bytes headroom, need %d\n",
@@ -1917,9 +1917,9 @@ static int if_sendbuf(int id, int channel, int doack, struct sk_buff *skb)
                }
                if (debugmode > 3)
                        printk(KERN_DEBUG "capidrv-%d: sendbuf putmsg ret(%x) - %s\n",
-                               card->contrnr, errcode, capi_info2str(errcode));
-               (void)capidrv_del_ack(nccip, datahandle);
-               dev_kfree_skb(nskb);
+                              card->contrnr, errcode, capi_info2str(errcode));
+               (void)capidrv_del_ack(nccip, datahandle);
+               dev_kfree_skb(nskb);
                return errcode == CAPI_SENDQUEUEFULL ? 0 : -1;
        } else {
                memcpy(skb_push(skb, msglen), sendcmsg.buf, msglen);
@@ -1930,9 +1930,9 @@ static int if_sendbuf(int id, int channel, int doack, struct sk_buff *skb)
                }
                if (debugmode > 3)
                        printk(KERN_DEBUG "capidrv-%d: sendbuf putmsg ret(%x) - %s\n",
-                               card->contrnr, errcode, capi_info2str(errcode));
+                              card->contrnr, errcode, capi_info2str(errcode));
                skb_pull(skb, msglen);
-               (void)capidrv_del_ack(nccip, datahandle);
+               (void)capidrv_del_ack(nccip, datahandle);
                return errcode == CAPI_SENDQUEUEFULL ? 0 : -1;
        }
 }
@@ -1949,11 +1949,11 @@ static int if_readstat(u8 __user *buf, int len, int id, int channel)
                return -ENODEV;
        }
 
-       for (p=buf, count=0; count < len; p++, count++) {
+       for (p = buf, count = 0; count < len; p++, count++) {
                if (put_user(*card->q931_read++, p))
                        return -EFAULT;
-               if (card->q931_read > card->q931_end)
-                       card->q931_read = card->q931_buf;
+               if (card->q931_read > card->q931_end)
+                       card->q931_read = card->q931_buf;
        }
        return count;
 
@@ -1961,35 +1961,35 @@ static int if_readstat(u8 __user *buf, int len, int id, int channel)
 
 static void enable_dchannel_trace(capidrv_contr *card)
 {
-        u8 manufacturer[CAPI_MANUFACTURER_LEN];
-        capi_version version;
+       u8 manufacturer[CAPI_MANUFACTURER_LEN];
+       capi_version version;
        u16 contr = card->contrnr;
        u16 errcode;
        u16 avmversion[3];
 
-        errcode = capi20_get_manufacturer(contr, manufacturer);
-        if (errcode != CAPI_NOERROR) {
-          printk(KERN_ERR "%s: can't get manufacturer (0x%x)\n",
-                       card->name, errcode);
-          return;
+       errcode = capi20_get_manufacturer(contr, manufacturer);
+       if (errcode != CAPI_NOERROR) {
+               printk(KERN_ERR "%s: can't get manufacturer (0x%x)\n",
+                      card->name, errcode);
+               return;
        }
        if (strstr(manufacturer, "AVM") == NULL) {
-          printk(KERN_ERR "%s: not from AVM, no d-channel trace possible (%s)\n",
-                       card->name, manufacturer);
-          return;
+               printk(KERN_ERR "%s: not from AVM, no d-channel trace possible (%s)\n",
+                      card->name, manufacturer);
+               return;
        }
-        errcode = capi20_get_version(contr, &version);
-        if (errcode != CAPI_NOERROR) {
-          printk(KERN_ERR "%s: can't get version (0x%x)\n",
-                       card->name, errcode);
-          return;
+       errcode = capi20_get_version(contr, &version);
+       if (errcode != CAPI_NOERROR) {
+               printk(KERN_ERR "%s: can't get version (0x%x)\n",
+                      card->name, errcode);
+               return;
        }
        avmversion[0] = (version.majormanuversion >> 4) & 0x0f;
        avmversion[1] = (version.majormanuversion << 4) & 0xf0;
        avmversion[1] |= (version.minormanuversion >> 4) & 0x0f;
        avmversion[2] |= version.minormanuversion & 0x0f;
 
-        if (avmversion[0] > 3 || (avmversion[0] == 3 && avmversion[1] > 5)) {
+       if (avmversion[0] > 3 || (avmversion[0] == 3 && avmversion[1] > 5)) {
                printk(KERN_INFO "%s: D2 trace enabled\n", card->name);
                capi_fill_MANUFACTURER_REQ(&cmdcmsg, global.ap.applid,
                                           card->msgid++,
@@ -2030,8 +2030,8 @@ static void listentimerfunc(unsigned long x)
        capidrv_contr *card = (capidrv_contr *)x;
        if (card->state != ST_LISTEN_NONE && card->state != ST_LISTEN_ACTIVE)
                printk(KERN_ERR "%s: controller dead ??\n", card->name);
-        send_listen(card);
-       mod_timer(&card->listentimer, jiffies + 60*HZ);
+       send_listen(card);
+       mod_timer(&card->listentimer, jiffies + 60 * HZ);
 }
 
 
@@ -2050,7 +2050,7 @@ static int capidrv_addcontr(u16 contr, struct capi_profile *profp)
        }
        if (!(card = kzalloc(sizeof(capidrv_contr), GFP_ATOMIC))) {
                printk(KERN_WARNING
-                "capidrv: (%s) Could not allocate contr-struct.\n", id);
+                      "capidrv: (%s) Could not allocate contr-struct.\n", id);
                return -1;
        }
        card->owner = THIS_MODULE;
@@ -2061,7 +2061,7 @@ static int capidrv_addcontr(u16 contr, struct capi_profile *profp)
        card->bchans = kmalloc(sizeof(capidrv_bchan) * card->nbchan, GFP_ATOMIC);
        if (!card->bchans) {
                printk(KERN_WARNING
-               "capidrv: (%s) Could not allocate bchan-structs.\n", id);
+                      "capidrv: (%s) Could not allocate bchan-structs.\n", id);
                module_put(card->owner);
                kfree(card);
                return -1;
@@ -2073,17 +2073,17 @@ static int capidrv_addcontr(u16 contr, struct capi_profile *profp)
        card->interface.writecmd = NULL;
        card->interface.readstat = if_readstat;
        card->interface.features = ISDN_FEATURE_L2_HDLC |
-                                  ISDN_FEATURE_L2_TRANS |
-                                  ISDN_FEATURE_L3_TRANS |
-                                  ISDN_FEATURE_P_UNKNOWN |
-                                  ISDN_FEATURE_L2_X75I |
-                                  ISDN_FEATURE_L2_X75UI |
-                                  ISDN_FEATURE_L2_X75BUI;
-       if (profp->support1 & (1<<2))
+               ISDN_FEATURE_L2_TRANS |
+               ISDN_FEATURE_L3_TRANS |
+               ISDN_FEATURE_P_UNKNOWN |
+               ISDN_FEATURE_L2_X75I |
+               ISDN_FEATURE_L2_X75UI |
+               ISDN_FEATURE_L2_X75BUI;
+       if (profp->support1 & (1 << 2))
                card->interface.features |= ISDN_FEATURE_L2_V11096 |
-                                           ISDN_FEATURE_L2_V11019 |
-                                           ISDN_FEATURE_L2_V11038;
-       if (profp->support1 & (1<<8))
+                       ISDN_FEATURE_L2_V11019 |
+                       ISDN_FEATURE_L2_V11038;
+       if (profp->support1 & (1 << 8))
                card->interface.features |= ISDN_FEATURE_L2_MODEM;
        card->interface.hl_hdrlen = 22; /* len of DATA_B3_REQ */
        strncpy(card->interface.id, id, sizeof(card->interface.id) - 1);
@@ -2122,10 +2122,10 @@ static int capidrv_addcontr(u16 contr, struct capi_profile *profp)
        card->listentimer.data = (unsigned long)card;
        card->listentimer.function = listentimerfunc;
        send_listen(card);
-       mod_timer(&card->listentimer, jiffies + 60*HZ);
+       mod_timer(&card->listentimer, jiffies + 60 * HZ);
 
        printk(KERN_INFO "%s: now up (%d B channels)\n",
-               card->name, card->nbchan);
+              card->name, card->nbchan);
 
        enable_dchannel_trace(card);
 
@@ -2158,7 +2158,7 @@ static int capidrv_delcontr(u16 contr)
 
        if (debugmode)
                printk(KERN_DEBUG "capidrv-%d: id=%d unloading\n",
-                                       card->contrnr, card->myid);
+                      card->contrnr, card->myid);
 
        cmd.command = ISDN_STAT_STOP;
        cmd.driver = card->myid;
@@ -2168,17 +2168,17 @@ static int capidrv_delcontr(u16 contr)
 
                cmd.command = ISDN_STAT_DISCH;
                cmd.driver = card->myid;
-               cmd.arg = card->nbchan-1;
-               cmd.parm.num[0] = 0;
+               cmd.arg = card->nbchan - 1;
+               cmd.parm.num[0] = 0;
                if (debugmode)
                        printk(KERN_DEBUG "capidrv-%d: id=%d disable chan=%ld\n",
-                                       card->contrnr, card->myid, cmd.arg);
+                              card->contrnr, card->myid, cmd.arg);
                card->interface.statcallb(&cmd);
 
-               if (card->bchans[card->nbchan-1].nccip)
-                       free_ncci(card, card->bchans[card->nbchan-1].nccip);
-               if (card->bchans[card->nbchan-1].plcip)
-                       free_plci(card, card->bchans[card->nbchan-1].plcip);
+               if (card->bchans[card->nbchan - 1].nccip)
+                       free_ncci(card, card->bchans[card->nbchan - 1].nccip);
+               if (card->bchans[card->nbchan - 1].plcip)
+                       free_plci(card, card->bchans[card->nbchan - 1].plcip);
                if (card->plci_list)
                        printk(KERN_ERR "capidrv: bug in free_plci()\n");
                card->nbchan--;
@@ -2188,7 +2188,7 @@ static int capidrv_delcontr(u16 contr)
 
        if (debugmode)
                printk(KERN_DEBUG "capidrv-%d: id=%d isdn unload\n",
-                                       card->contrnr, card->myid);
+                      card->contrnr, card->myid);
 
        cmd.command = ISDN_STAT_UNLOAD;
        cmd.driver = card->myid;
@@ -2196,7 +2196,7 @@ static int capidrv_delcontr(u16 contr)
 
        if (debugmode)
                printk(KERN_DEBUG "capidrv-%d: id=%d remove contr from list\n",
-                                       card->contrnr, card->myid);
+                      card->contrnr, card->myid);
 
        spin_lock_irqsave(&global_lock, flags);
        for (pp = &global.contr_list; *pp; pp = &(*pp)->next) {
@@ -2243,10 +2243,10 @@ lower_callback(struct notifier_block *nb, unsigned long val, void *v)
 static int capidrv_proc_show(struct seq_file *m, void *v)
 {
        seq_printf(m, "%lu %lu %lu %lu\n",
-                       global.ap.nrecvctlpkt,
-                       global.ap.nrecvdatapkt,
-                       global.ap.nsentctlpkt,
-                       global.ap.nsentdatapkt);
+                  global.ap.nrecvctlpkt,
+                  global.ap.nrecvdatapkt,
+                  global.ap.nsentctlpkt,
+                  global.ap.nsentdatapkt);
        return 0;
 }
 
index 1e698e1..4466b2e 100644 (file)
@@ -34,7 +34,7 @@
  * per plci state machine
  */
 #define ST_PLCI_NONE                   0       /* P-0 */
-#define ST_PLCI_OUTGOING               1       /* P-0.1 */
+#define ST_PLCI_OUTGOING               1       /* P-0.1 */
 #define ST_PLCI_ALLOCATED              2       /* P-1 */
 #define ST_PLCI_ACTIVE                 3       /* P-ACT */
 #define ST_PLCI_INCOMING               4       /* P-2 */
 #define ST_PLCI_HELD                   11      /* P-HELD */
 
 #define EV_PLCI_CONNECT_REQ            1       /* P-0 -> P-0.1
-                                                 */
+                                                */
 #define EV_PLCI_CONNECT_CONF_ERROR     2       /* P-0.1 -> P-0
-                                                 */
+                                                */
 #define EV_PLCI_CONNECT_CONF_OK                3       /* P-0.1 -> P-1
-                                                 */
+                                                */
 #define EV_PLCI_FACILITY_IND_UP                4       /* P-0 -> P-1
-                                                 */
+                                                */
 #define EV_PLCI_CONNECT_IND            5       /* P-0 -> P-2
-                                                 */
+                                                */
 #define EV_PLCI_CONNECT_ACTIVE_IND     6       /* P-1 -> P-ACT
-                                                 */
+                                                */
 #define EV_PLCI_CONNECT_REJECT         7       /* P-2 -> P-5
                                                   P-3 -> P-5
-                                                */
+                                               */
 #define EV_PLCI_DISCONNECT_REQ         8       /* P-1 -> P-5
                                                   P-2 -> P-5
                                                   P-3 -> P-5
@@ -68,7 +68,7 @@
                                                   P-ACT -> P-5
                                                   P-Res -> P-5 (*)
                                                   P-HELD -> P-5 (*)
-                                                  */
+                                               */
 #define EV_PLCI_DISCONNECT_IND         9       /* P-1 -> P-6
                                                   P-2 -> P-6
                                                   P-3 -> P-6
                                                   P-ACT -> P-6
                                                   P-Res -> P-6 (*)
                                                   P-HELD -> P-6 (*)
-                                                  */
+                                               */
 #define EV_PLCI_FACILITY_IND_DOWN      10      /* P-0.1 -> P-5
                                                   P-1 -> P-5
                                                   P-ACT -> P-5
                                                   P-2 -> P-5
                                                   P-3 -> P-5
                                                   P-4 -> P-5
-                                                  */
+                                               */
 #define EV_PLCI_DISCONNECT_RESP                11      /* P-6 -> P-0
-                                                   */
+                                                */
 #define EV_PLCI_CONNECT_RESP           12      /* P-6 -> P-0
-                                                   */
+                                                */
 
 #define EV_PLCI_RESUME_REQ             13      /* P-0 -> P-0.Res
-                                                 */
+                                                */
 #define EV_PLCI_RESUME_CONF_OK         14      /* P-0.Res -> P-Res
-                                                 */
+                                                */
 #define EV_PLCI_RESUME_CONF_ERROR      15      /* P-0.Res -> P-0
-                                                 */
+                                                */
 #define EV_PLCI_RESUME_IND             16      /* P-Res -> P-ACT
-                                                 */
+                                                */
 #define EV_PLCI_HOLD_IND               17      /* P-ACT -> P-HELD
-                                                 */
+                                                */
 #define EV_PLCI_RETRIEVE_IND           18      /* P-HELD -> P-ACT
-                                                 */
+                                                */
 #define EV_PLCI_SUSPEND_IND            19      /* P-ACT -> P-5
-                                                 */
+                                                */
 #define EV_PLCI_CD_IND                 20      /* P-2 -> P-5
-                                                 */
+                                                */
 
 /*
  * per ncci state machine
index 0b041df..33361f8 100644 (file)
@@ -4,9 +4,9 @@
 #include <linux/module.h>
 #include <linux/isdn/capilli.h>
 
-#define DBG(format, arg...) do { \
-printk(KERN_DEBUG "%s: " format "\n" , __func__ , ## arg); \
-} while (0)
+#define DBG(format, arg...) do {                                       \
+               printk(KERN_DEBUG "%s: " format "\n" , __func__ , ## arg); \
+       } while (0)
 
 struct capilib_msgidqueue {
        struct capilib_msgidqueue *next;
@@ -28,7 +28,7 @@ struct capilib_ncci {
 // ---------------------------------------------------------------------------
 // NCCI Handling
 
-static inline void mq_init(struct capilib_ncci * np)
+static inline void mq_init(struct capilib_ncci *np)
 {
        u_int i;
        np->msgidqueue = NULL;
@@ -42,7 +42,7 @@ static inline void mq_init(struct capilib_ncci * np)
        }
 }
 
-static inline int mq_enqueue(struct capilib_ncci * np, u16 msgid)
+static inline int mq_enqueue(struct capilib_ncci *np, u16 msgid)
 {
        struct capilib_msgidqueue *mq;
        if ((mq = np->msgidfree) == NULL)
@@ -59,7 +59,7 @@ static inline int mq_enqueue(struct capilib_ncci * np, u16 msgid)
        return 1;
 }
 
-static inline int mq_dequeue(struct capilib_ncci * np, u16 msgid)
+static inline int mq_dequeue(struct capilib_ncci *np, u16 msgid)
 {
        struct capilib_msgidqueue **pp;
        for (pp = &np->msgidqueue; *pp; pp = &(*pp)->next) {
@@ -165,7 +165,7 @@ u16 capilib_data_b3_req(struct list_head *head, u16 applid, u32 ncci, u16 msgid)
                        continue;
                if (np->ncci != ncci)
                        continue;
-               
+
                if (mq_enqueue(np, msgid) == 0)
                        return CAPI_SENDQUEUEFULL;
 
@@ -188,7 +188,7 @@ void capilib_data_b3_conf(struct list_head *head, u16 applid, u32 ncci, u16 msgi
                        continue;
                if (np->ncci != ncci)
                        continue;
-               
+
                if (mq_dequeue(np, msgid) == 0) {
                        printk(KERN_ERR "kcapi: msgid %hu ncci 0x%x not on queue\n",
                               msgid, ncci);
index 03c469e..d26f170 100644 (file)
 #ifndef CONFIG_ISDN_DRV_AVMB1_VERBOSE_REASON
 char *capi_info2str(u16 reason)
 {
-    return "..";
+       return "..";
 }
 #else
 char *capi_info2str(u16 reason)
 {
-    switch (reason) {
+       switch (reason) {
 
 /*-- informative values (corresponding message was processed) -----*/
        case 0x0001:
-          return "NCPI not supported by current protocol, NCPI ignored";
+               return "NCPI not supported by current protocol, NCPI ignored";
        case 0x0002:
-          return "Flags not supported by current protocol, flags ignored";
+               return "Flags not supported by current protocol, flags ignored";
        case 0x0003:
-          return "Alert already sent by another application";
+               return "Alert already sent by another application";
 
 /*-- error information concerning CAPI_REGISTER -----*/
        case 0x1001:
-          return "Too many applications";
+               return "Too many applications";
        case 0x1002:
-          return "Logical block size too small, must be at least 128 Bytes";
+               return "Logical block size too small, must be at least 128 Bytes";
        case 0x1003:
-          return "Buffer exceeds 64 kByte";
+               return "Buffer exceeds 64 kByte";
        case 0x1004:
-          return "Message buffer size too small, must be at least 1024 Bytes";
+               return "Message buffer size too small, must be at least 1024 Bytes";
        case 0x1005:
-          return "Max. number of logical connections not supported";
+               return "Max. number of logical connections not supported";
        case 0x1006:
-          return "Reserved";
+               return "Reserved";
        case 0x1007:
-          return "The message could not be accepted because of an internal busy condition";
+               return "The message could not be accepted because of an internal busy condition";
        case 0x1008:
-          return "OS resource error (no memory ?)";
+               return "OS resource error (no memory ?)";
        case 0x1009:
-          return "CAPI not installed";
+               return "CAPI not installed";
        case 0x100A:
-          return "Controller does not support external equipment";
+               return "Controller does not support external equipment";
        case 0x100B:
-          return "Controller does only support external equipment";
+               return "Controller does only support external equipment";
 
 /*-- error information concerning message exchange functions -----*/
        case 0x1101:
-          return "Illegal application number";
+               return "Illegal application number";
        case 0x1102:
-          return "Illegal command or subcommand or message length less than 12 bytes";
+               return "Illegal command or subcommand or message length less than 12 bytes";
        case 0x1103:
-          return "The message could not be accepted because of a queue full condition !! The error code does not imply that CAPI cannot receive messages directed to another controller, PLCI or NCCI";
+               return "The message could not be accepted because of a queue full condition !! The error code does not imply that CAPI cannot receive messages directed to another controller, PLCI or NCCI";
        case 0x1104:
-          return "Queue is empty";
+               return "Queue is empty";
        case 0x1105:
-          return "Queue overflow, a message was lost !! This indicates a configuration error. The only recovery from this error is to perform a CAPI_RELEASE";
+               return "Queue overflow, a message was lost !! This indicates a configuration error. The only recovery from this error is to perform a CAPI_RELEASE";
        case 0x1106:
-          return "Unknown notification parameter";
+               return "Unknown notification parameter";
        case 0x1107:
-          return "The Message could not be accepted because of an internal busy condition";
+               return "The Message could not be accepted because of an internal busy condition";
        case 0x1108:
-          return "OS Resource error (no memory ?)";
+               return "OS Resource error (no memory ?)";
        case 0x1109:
-          return "CAPI not installed";
+               return "CAPI not installed";
        case 0x110A:
-          return "Controller does not support external equipment";
+               return "Controller does not support external equipment";
        case 0x110B:
-          return "Controller does only support external equipment";
+               return "Controller does only support external equipment";
 
 /*-- error information concerning resource / coding problems -----*/
        case 0x2001:
-          return "Message not supported in current state";
+               return "Message not supported in current state";
        case 0x2002:
-          return "Illegal Controller / PLCI / NCCI";
+               return "Illegal Controller / PLCI / NCCI";
        case 0x2003:
-          return "Out of PLCI";
+               return "Out of PLCI";
        case 0x2004:
-          return "Out of NCCI";
+               return "Out of NCCI";
        case 0x2005:
-          return "Out of LISTEN";
+               return "Out of LISTEN";
        case 0x2006:
-          return "Out of FAX resources (protocol T.30)";
+               return "Out of FAX resources (protocol T.30)";
        case 0x2007:
-          return "Illegal message parameter coding";
+               return "Illegal message parameter coding";
 
 /*-- error information concerning requested services  -----*/
        case 0x3001:
-          return "B1 protocol not supported";
-       case 0x3002: 
-          return "B2 protocol not supported";
-       case 0x3003: 
-          return "B3 protocol not supported";
-       case 0x3004: 
-          return "B1 protocol parameter not supported";
-       case 0x3005: 
-          return "B2 protocol parameter not supported";
-       case 0x3006: 
-          return "B3 protocol parameter not supported";
-       case 0x3007: 
-          return "B protocol combination not supported";
-       case 0x3008: 
-          return "NCPI not supported";
-       case 0x3009: 
-          return "CIP Value unknown";
-       case 0x300A: 
-          return "Flags not supported (reserved bits)";
-       case 0x300B: 
-          return "Facility not supported";
-       case 0x300C: 
-          return "Data length not supported by current protocol";
-       case 0x300D: 
-          return "Reset procedure not supported by current protocol";
+               return "B1 protocol not supported";
+       case 0x3002:
+               return "B2 protocol not supported";
+       case 0x3003:
+               return "B3 protocol not supported";
+       case 0x3004:
+               return "B1 protocol parameter not supported";
+       case 0x3005:
+               return "B2 protocol parameter not supported";
+       case 0x3006:
+               return "B3 protocol parameter not supported";
+       case 0x3007:
+               return "B protocol combination not supported";
+       case 0x3008:
+               return "NCPI not supported";
+       case 0x3009:
+               return "CIP Value unknown";
+       case 0x300A:
+               return "Flags not supported (reserved bits)";
+       case 0x300B:
+               return "Facility not supported";
+       case 0x300C:
+               return "Data length not supported by current protocol";
+       case 0x300D:
+               return "Reset procedure not supported by current protocol";
 
 /*-- informations about the clearing of a physical connection -----*/
-       case 0x3301: 
-          return "Protocol error layer 1 (broken line or B-channel removed by signalling protocol)";
-       case 0x3302: 
-          return "Protocol error layer 2";
-       case 0x3303: 
-          return "Protocol error layer 3";
-       case 0x3304: 
-          return "Another application got that call";
+       case 0x3301:
+               return "Protocol error layer 1 (broken line or B-channel removed by signalling protocol)";
+       case 0x3302:
+               return "Protocol error layer 2";
+       case 0x3303:
+               return "Protocol error layer 3";
+       case 0x3304:
+               return "Another application got that call";
 /*-- T.30 specific reasons -----*/
-       case 0x3311: 
-          return "Connecting not successful (remote station is no FAX G3 machine)";
-       case 0x3312: 
-          return "Connecting not successful (training error)";
-       case 0x3313: 
-          return "Disconnected before transfer (remote station does not support transfer mode, e.g. resolution)";
-       case 0x3314: 
-          return "Disconnected during transfer (remote abort)";
-       case 0x3315: 
-          return "Disconnected during transfer (remote procedure error, e.g. unsuccessful repetition of T.30 commands)";
-       case 0x3316: 
-          return "Disconnected during transfer (local tx data underrun)";
-       case 0x3317: 
-          return "Disconnected during transfer (local rx data overflow)";
-       case 0x3318: 
-          return "Disconnected during transfer (local abort)";
-       case 0x3319: 
-          return "Illegal parameter coding (e.g. SFF coding error)";
+       case 0x3311:
+               return "Connecting not successful (remote station is no FAX G3 machine)";
+       case 0x3312:
+               return "Connecting not successful (training error)";
+       case 0x3313:
+               return "Disconnected before transfer (remote station does not support transfer mode, e.g. resolution)";
+       case 0x3314:
+               return "Disconnected during transfer (remote abort)";
+       case 0x3315:
+               return "Disconnected during transfer (remote procedure error, e.g. unsuccessful repetition of T.30 commands)";
+       case 0x3316:
+               return "Disconnected during transfer (local tx data underrun)";
+       case 0x3317:
+               return "Disconnected during transfer (local rx data overflow)";
+       case 0x3318:
+               return "Disconnected during transfer (local abort)";
+       case 0x3319:
+               return "Illegal parameter coding (e.g. SFF coding error)";
 
 /*-- disconnect causes from the network according to ETS 300 102-1/Q.931 -----*/
        case 0x3481: return "Unallocated (unassigned) number";
        case 0x3482: return "No route to specified transit network";
        case 0x3483: return "No route to destination";
        case 0x3486: return "Channel unacceptable";
-       case 0x3487: 
-          return "Call awarded and being delivered in an established channel";
+       case 0x3487:
+               return "Call awarded and being delivered in an established channel";
        case 0x3490: return "Normal call clearing";
        case 0x3491: return "User busy";
        case 0x3492: return "No user responding";
@@ -217,7 +217,7 @@ char *capi_info2str(u16 reason)
        case 0x34FF: return "Interworking, unspecified";
 
        default: return "No additional information";
-    }
+       }
 }
 #endif
 
@@ -235,169 +235,169 @@ typedef struct {
 
 static _cdef cdef[] =
 {
-    /*00 */ 
- {_CEND},
-    /*01 */ 
- {_CEND},
-    /*02 */ 
- {_CEND},
-    /*03 */ 
- {_CDWORD, offsetof(_cmsg, adr.adrController)},
-    /*04 */ 
- {_CMSTRUCT, offsetof(_cmsg, AdditionalInfo)},
-    /*05 */ 
- {_CSTRUCT, offsetof(_cmsg, B1configuration)},
-    /*06 */ 
- {_CWORD, offsetof(_cmsg, B1protocol)},
-    /*07 */ 
- {_CSTRUCT, offsetof(_cmsg, B2configuration)},
-    /*08 */ 
- {_CWORD, offsetof(_cmsg, B2protocol)},
-    /*09 */ 
- {_CSTRUCT, offsetof(_cmsg, B3configuration)},
-    /*0a */ 
- {_CWORD, offsetof(_cmsg, B3protocol)},
-    /*0b */ 
- {_CSTRUCT, offsetof(_cmsg, BC)},
-    /*0c */ 
- {_CSTRUCT, offsetof(_cmsg, BChannelinformation)},
-    /*0d */ 
- {_CMSTRUCT, offsetof(_cmsg, BProtocol)},
-    /*0e */ 
- {_CSTRUCT, offsetof(_cmsg, CalledPartyNumber)},
-    /*0f */ 
- {_CSTRUCT, offsetof(_cmsg, CalledPartySubaddress)},
-    /*10 */ 
- {_CSTRUCT, offsetof(_cmsg, CallingPartyNumber)},
-    /*11 */ 
- {_CSTRUCT, offsetof(_cmsg, CallingPartySubaddress)},
-    /*12 */ 
- {_CDWORD, offsetof(_cmsg, CIPmask)},
-    /*13 */ 
- {_CDWORD, offsetof(_cmsg, CIPmask2)},
-    /*14 */ 
- {_CWORD, offsetof(_cmsg, CIPValue)},
-    /*15 */ 
- {_CDWORD, offsetof(_cmsg, Class)},
-    /*16 */ 
- {_CSTRUCT, offsetof(_cmsg, ConnectedNumber)},
-    /*17 */ 
- {_CSTRUCT, offsetof(_cmsg, ConnectedSubaddress)},
-    /*18 */ 
- {_CDWORD, offsetof(_cmsg, Data)},
-    /*19 */ 
- {_CWORD, offsetof(_cmsg, DataHandle)},
-    /*1a */ 
- {_CWORD, offsetof(_cmsg, DataLength)},
-    /*1b */ 
- {_CSTRUCT, offsetof(_cmsg, FacilityConfirmationParameter)},
-    /*1c */ 
- {_CSTRUCT, offsetof(_cmsg, Facilitydataarray)},
-    /*1d */ 
- {_CSTRUCT, offsetof(_cmsg, FacilityIndicationParameter)},
-    /*1e */ 
- {_CSTRUCT, offsetof(_cmsg, FacilityRequestParameter)},
-    /*1f */ 
- {_CWORD, offsetof(_cmsg, FacilitySelector)},
-    /*20 */ 
- {_CWORD, offsetof(_cmsg, Flags)},
-    /*21 */ 
- {_CDWORD, offsetof(_cmsg, Function)},
-    /*22 */ 
- {_CSTRUCT, offsetof(_cmsg, HLC)},
-    /*23 */ 
- {_CWORD, offsetof(_cmsg, Info)},
-    /*24 */ 
- {_CSTRUCT, offsetof(_cmsg, InfoElement)},
-    /*25 */ 
- {_CDWORD, offsetof(_cmsg, InfoMask)},
-    /*26 */ 
- {_CWORD, offsetof(_cmsg, InfoNumber)},
-    /*27 */ 
- {_CSTRUCT, offsetof(_cmsg, Keypadfacility)},
-    /*28 */ 
- {_CSTRUCT, offsetof(_cmsg, LLC)},
-    /*29 */ 
- {_CSTRUCT, offsetof(_cmsg, ManuData)},
-    /*2a */ 
- {_CDWORD, offsetof(_cmsg, ManuID)},
-    /*2b */ 
- {_CSTRUCT, offsetof(_cmsg, NCPI)},
-    /*2c */ 
- {_CWORD, offsetof(_cmsg, Reason)},
-    /*2d */ 
- {_CWORD, offsetof(_cmsg, Reason_B3)},
-    /*2e */ 
- {_CWORD, offsetof(_cmsg, Reject)},
-    /*2f */ 
- {_CSTRUCT, offsetof(_cmsg, Useruserdata)}
+       /*00 */
+       {_CEND},
+       /*01 */
+       {_CEND},
+       /*02 */
+       {_CEND},
+       /*03 */
+       {_CDWORD, offsetof(_cmsg, adr.adrController)},
+       /*04 */
+       {_CMSTRUCT, offsetof(_cmsg, AdditionalInfo)},
+       /*05 */
+       {_CSTRUCT, offsetof(_cmsg, B1configuration)},
+       /*06 */
+       {_CWORD, offsetof(_cmsg, B1protocol)},
+       /*07 */
+       {_CSTRUCT, offsetof(_cmsg, B2configuration)},
+       /*08 */
+       {_CWORD, offsetof(_cmsg, B2protocol)},
+       /*09 */
+       {_CSTRUCT, offsetof(_cmsg, B3configuration)},
+       /*0a */
+       {_CWORD, offsetof(_cmsg, B3protocol)},
+       /*0b */
+       {_CSTRUCT, offsetof(_cmsg, BC)},
+       /*0c */
+       {_CSTRUCT, offsetof(_cmsg, BChannelinformation)},
+       /*0d */
+       {_CMSTRUCT, offsetof(_cmsg, BProtocol)},
+       /*0e */
+       {_CSTRUCT, offsetof(_cmsg, CalledPartyNumber)},
+       /*0f */
+       {_CSTRUCT, offsetof(_cmsg, CalledPartySubaddress)},
+       /*10 */
+       {_CSTRUCT, offsetof(_cmsg, CallingPartyNumber)},
+       /*11 */
+       {_CSTRUCT, offsetof(_cmsg, CallingPartySubaddress)},
+       /*12 */
+       {_CDWORD, offsetof(_cmsg, CIPmask)},
+       /*13 */
+       {_CDWORD, offsetof(_cmsg, CIPmask2)},
+       /*14 */
+       {_CWORD, offsetof(_cmsg, CIPValue)},
+       /*15 */
+       {_CDWORD, offsetof(_cmsg, Class)},
+       /*16 */
+       {_CSTRUCT, offsetof(_cmsg, ConnectedNumber)},
+       /*17 */
+       {_CSTRUCT, offsetof(_cmsg, ConnectedSubaddress)},
+       /*18 */
+       {_CDWORD, offsetof(_cmsg, Data)},
+       /*19 */
+       {_CWORD, offsetof(_cmsg, DataHandle)},
+       /*1a */
+       {_CWORD, offsetof(_cmsg, DataLength)},
+       /*1b */
+       {_CSTRUCT, offsetof(_cmsg, FacilityConfirmationParameter)},
+       /*1c */
+       {_CSTRUCT, offsetof(_cmsg, Facilitydataarray)},
+       /*1d */
+       {_CSTRUCT, offsetof(_cmsg, FacilityIndicationParameter)},
+       /*1e */
+       {_CSTRUCT, offsetof(_cmsg, FacilityRequestParameter)},
+       /*1f */
+       {_CWORD, offsetof(_cmsg, FacilitySelector)},
+       /*20 */
+       {_CWORD, offsetof(_cmsg, Flags)},
+       /*21 */
+       {_CDWORD, offsetof(_cmsg, Function)},
+       /*22 */
+       {_CSTRUCT, offsetof(_cmsg, HLC)},
+       /*23 */
+       {_CWORD, offsetof(_cmsg, Info)},
+       /*24 */
+       {_CSTRUCT, offsetof(_cmsg, InfoElement)},
+       /*25 */
+       {_CDWORD, offsetof(_cmsg, InfoMask)},
+       /*26 */
+       {_CWORD, offsetof(_cmsg, InfoNumber)},
+       /*27 */
+       {_CSTRUCT, offsetof(_cmsg, Keypadfacility)},
+       /*28 */
+       {_CSTRUCT, offsetof(_cmsg, LLC)},
+       /*29 */
+       {_CSTRUCT, offsetof(_cmsg, ManuData)},
+       /*2a */
+       {_CDWORD, offsetof(_cmsg, ManuID)},
+       /*2b */
+       {_CSTRUCT, offsetof(_cmsg, NCPI)},
+       /*2c */
+       {_CWORD, offsetof(_cmsg, Reason)},
+       /*2d */
+       {_CWORD, offsetof(_cmsg, Reason_B3)},
+       /*2e */
+       {_CWORD, offsetof(_cmsg, Reject)},
+       /*2f */
+       {_CSTRUCT, offsetof(_cmsg, Useruserdata)}
 };
 
 static unsigned char *cpars[] =
 {
-    /* ALERT_REQ */ [0x01] = "\x03\x04\x0c\x27\x2f\x1c\x01\x01",
-    /* CONNECT_REQ */ [0x02] = "\x03\x14\x0e\x10\x0f\x11\x0d\x06\x08\x0a\x05\x07\x09\x01\x0b\x28\x22\x04\x0c\x27\x2f\x1c\x01\x01",
-    /* DISCONNECT_REQ */ [0x04] = "\x03\x04\x0c\x27\x2f\x1c\x01\x01",
-    /* LISTEN_REQ */ [0x05] = "\x03\x25\x12\x13\x10\x11\x01",
-    /* INFO_REQ */ [0x08] = "\x03\x0e\x04\x0c\x27\x2f\x1c\x01\x01",
-    /* FACILITY_REQ */ [0x09] = "\x03\x1f\x1e\x01",
-    /* SELECT_B_PROTOCOL_REQ */ [0x0a] = "\x03\x0d\x06\x08\x0a\x05\x07\x09\x01\x01",
-    /* CONNECT_B3_REQ */ [0x0b] = "\x03\x2b\x01",
-    /* DISCONNECT_B3_REQ */ [0x0d] = "\x03\x2b\x01",
-    /* DATA_B3_REQ */ [0x0f] = "\x03\x18\x1a\x19\x20\x01",
-    /* RESET_B3_REQ */ [0x10] = "\x03\x2b\x01",
-    /* ALERT_CONF */ [0x13] = "\x03\x23\x01",
-    /* CONNECT_CONF */ [0x14] = "\x03\x23\x01",
-    /* DISCONNECT_CONF */ [0x16] = "\x03\x23\x01",
-    /* LISTEN_CONF */ [0x17] = "\x03\x23\x01",
-    /* MANUFACTURER_REQ */ [0x18] = "\x03\x2a\x15\x21\x29\x01",
-    /* INFO_CONF */ [0x1a] = "\x03\x23\x01",
-    /* FACILITY_CONF */ [0x1b] = "\x03\x23\x1f\x1b\x01",
-    /* SELECT_B_PROTOCOL_CONF */ [0x1c] = "\x03\x23\x01",
-    /* CONNECT_B3_CONF */ [0x1d] = "\x03\x23\x01",
-    /* DISCONNECT_B3_CONF */ [0x1f] = "\x03\x23\x01",
-    /* DATA_B3_CONF */ [0x21] = "\x03\x19\x23\x01",
-    /* RESET_B3_CONF */ [0x22] = "\x03\x23\x01",
-    /* CONNECT_IND */ [0x26] = "\x03\x14\x0e\x10\x0f\x11\x0b\x28\x22\x04\x0c\x27\x2f\x1c\x01\x01",
-    /* CONNECT_ACTIVE_IND */ [0x27] = "\x03\x16\x17\x28\x01",
-    /* DISCONNECT_IND */ [0x28] = "\x03\x2c\x01",
-    /* MANUFACTURER_CONF */ [0x2a] = "\x03\x2a\x15\x21\x29\x01",
-    /* INFO_IND */ [0x2c] = "\x03\x26\x24\x01",
-    /* FACILITY_IND */ [0x2d] = "\x03\x1f\x1d\x01",
-    /* CONNECT_B3_IND */ [0x2f] = "\x03\x2b\x01",
-    /* CONNECT_B3_ACTIVE_IND */ [0x30] = "\x03\x2b\x01",
-    /* DISCONNECT_B3_IND */ [0x31] = "\x03\x2d\x2b\x01",
-    /* DATA_B3_IND */ [0x33] = "\x03\x18\x1a\x19\x20\x01",
-    /* RESET_B3_IND */ [0x34] = "\x03\x2b\x01",
-    /* CONNECT_B3_T90_ACTIVE_IND */ [0x35] = "\x03\x2b\x01",
-    /* CONNECT_RESP */ [0x38] = "\x03\x2e\x0d\x06\x08\x0a\x05\x07\x09\x01\x16\x17\x28\x04\x0c\x27\x2f\x1c\x01\x01",
-    /* CONNECT_ACTIVE_RESP */ [0x39] = "\x03\x01",
-    /* DISCONNECT_RESP */ [0x3a] = "\x03\x01",
-    /* MANUFACTURER_IND */ [0x3c] = "\x03\x2a\x15\x21\x29\x01",
-    /* INFO_RESP */ [0x3e] = "\x03\x01",
-    /* FACILITY_RESP */ [0x3f] = "\x03\x1f\x01",
-    /* CONNECT_B3_RESP */ [0x41] = "\x03\x2e\x2b\x01",
-    /* CONNECT_B3_ACTIVE_RESP */ [0x42] = "\x03\x01",
-    /* DISCONNECT_B3_RESP */ [0x43] = "\x03\x01",
-    /* DATA_B3_RESP */ [0x45] = "\x03\x19\x01",
-    /* RESET_B3_RESP */ [0x46] = "\x03\x01",
-    /* CONNECT_B3_T90_ACTIVE_RESP */ [0x47] = "\x03\x01",
-    /* MANUFACTURER_RESP */ [0x4e] = "\x03\x2a\x15\x21\x29\x01",
+       /* ALERT_REQ */ [0x01] = "\x03\x04\x0c\x27\x2f\x1c\x01\x01",
+       /* CONNECT_REQ */ [0x02] = "\x03\x14\x0e\x10\x0f\x11\x0d\x06\x08\x0a\x05\x07\x09\x01\x0b\x28\x22\x04\x0c\x27\x2f\x1c\x01\x01",
+       /* DISCONNECT_REQ */ [0x04] = "\x03\x04\x0c\x27\x2f\x1c\x01\x01",
+       /* LISTEN_REQ */ [0x05] = "\x03\x25\x12\x13\x10\x11\x01",
+       /* INFO_REQ */ [0x08] = "\x03\x0e\x04\x0c\x27\x2f\x1c\x01\x01",
+       /* FACILITY_REQ */ [0x09] = "\x03\x1f\x1e\x01",
+       /* SELECT_B_PROTOCOL_REQ */ [0x0a] = "\x03\x0d\x06\x08\x0a\x05\x07\x09\x01\x01",
+       /* CONNECT_B3_REQ */ [0x0b] = "\x03\x2b\x01",
+       /* DISCONNECT_B3_REQ */ [0x0d] = "\x03\x2b\x01",
+       /* DATA_B3_REQ */ [0x0f] = "\x03\x18\x1a\x19\x20\x01",
+       /* RESET_B3_REQ */ [0x10] = "\x03\x2b\x01",
+       /* ALERT_CONF */ [0x13] = "\x03\x23\x01",
+       /* CONNECT_CONF */ [0x14] = "\x03\x23\x01",
+       /* DISCONNECT_CONF */ [0x16] = "\x03\x23\x01",
+       /* LISTEN_CONF */ [0x17] = "\x03\x23\x01",
+       /* MANUFACTURER_REQ */ [0x18] = "\x03\x2a\x15\x21\x29\x01",
+       /* INFO_CONF */ [0x1a] = "\x03\x23\x01",
+       /* FACILITY_CONF */ [0x1b] = "\x03\x23\x1f\x1b\x01",
+       /* SELECT_B_PROTOCOL_CONF */ [0x1c] = "\x03\x23\x01",
+       /* CONNECT_B3_CONF */ [0x1d] = "\x03\x23\x01",
+       /* DISCONNECT_B3_CONF */ [0x1f] = "\x03\x23\x01",
+       /* DATA_B3_CONF */ [0x21] = "\x03\x19\x23\x01",
+       /* RESET_B3_CONF */ [0x22] = "\x03\x23\x01",
+       /* CONNECT_IND */ [0x26] = "\x03\x14\x0e\x10\x0f\x11\x0b\x28\x22\x04\x0c\x27\x2f\x1c\x01\x01",
+       /* CONNECT_ACTIVE_IND */ [0x27] = "\x03\x16\x17\x28\x01",
+       /* DISCONNECT_IND */ [0x28] = "\x03\x2c\x01",
+       /* MANUFACTURER_CONF */ [0x2a] = "\x03\x2a\x15\x21\x29\x01",
+       /* INFO_IND */ [0x2c] = "\x03\x26\x24\x01",
+       /* FACILITY_IND */ [0x2d] = "\x03\x1f\x1d\x01",
+       /* CONNECT_B3_IND */ [0x2f] = "\x03\x2b\x01",
+       /* CONNECT_B3_ACTIVE_IND */ [0x30] = "\x03\x2b\x01",
+       /* DISCONNECT_B3_IND */ [0x31] = "\x03\x2d\x2b\x01",
+       /* DATA_B3_IND */ [0x33] = "\x03\x18\x1a\x19\x20\x01",
+       /* RESET_B3_IND */ [0x34] = "\x03\x2b\x01",
+       /* CONNECT_B3_T90_ACTIVE_IND */ [0x35] = "\x03\x2b\x01",
+       /* CONNECT_RESP */ [0x38] = "\x03\x2e\x0d\x06\x08\x0a\x05\x07\x09\x01\x16\x17\x28\x04\x0c\x27\x2f\x1c\x01\x01",
+       /* CONNECT_ACTIVE_RESP */ [0x39] = "\x03\x01",
+       /* DISCONNECT_RESP */ [0x3a] = "\x03\x01",
+       /* MANUFACTURER_IND */ [0x3c] = "\x03\x2a\x15\x21\x29\x01",
+       /* INFO_RESP */ [0x3e] = "\x03\x01",
+       /* FACILITY_RESP */ [0x3f] = "\x03\x1f\x01",
+       /* CONNECT_B3_RESP */ [0x41] = "\x03\x2e\x2b\x01",
+       /* CONNECT_B3_ACTIVE_RESP */ [0x42] = "\x03\x01",
+       /* DISCONNECT_B3_RESP */ [0x43] = "\x03\x01",
+       /* DATA_B3_RESP */ [0x45] = "\x03\x19\x01",
+       /* RESET_B3_RESP */ [0x46] = "\x03\x01",
+       /* CONNECT_B3_T90_ACTIVE_RESP */ [0x47] = "\x03\x01",
+       /* MANUFACTURER_RESP */ [0x4e] = "\x03\x2a\x15\x21\x29\x01",
 };
 
 /*-------------------------------------------------------*/
 
-#define byteTLcpy(x,y)        *(u8 *)(x)=*(u8 *)(y);
-#define wordTLcpy(x,y)        *(u16 *)(x)=*(u16 *)(y);
-#define dwordTLcpy(x,y)       memcpy(x,y,4);
-#define structTLcpy(x,y,l)    memcpy (x,y,l)
-#define structTLcpyovl(x,y,l) memmove (x,y,l)
+#define byteTLcpy(x, y)         *(u8 *)(x) = *(u8 *)(y);
+#define wordTLcpy(x, y)         *(u16 *)(x) = *(u16 *)(y);
+#define dwordTLcpy(x, y)        memcpy(x, y, 4);
+#define structTLcpy(x, y, l)    memcpy(x, y, l)
+#define structTLcpyovl(x, y, l) memmove(x, y, l)
 
-#define byteTRcpy(x,y)        *(u8 *)(y)=*(u8 *)(x);
-#define wordTRcpy(x,y)        *(u16 *)(y)=*(u16 *)(x);
-#define dwordTRcpy(x,y)       memcpy(y,x,4);
-#define structTRcpy(x,y,l)    memcpy (y,x,l)
-#define structTRcpyovl(x,y,l) memmove (y,x,l)
+#define byteTRcpy(x, y)         *(u8 *)(y) = *(u8 *)(x);
+#define wordTRcpy(x, y)         *(u16 *)(y) = *(u16 *)(x);
+#define dwordTRcpy(x, y)        memcpy(y, x, 4);
+#define structTRcpy(x, y, l)    memcpy(y, x, l)
+#define structTRcpyovl(x, y, l) memmove(y, x, l)
 
 /*-------------------------------------------------------*/
 static unsigned command_2_index(unsigned c, unsigned sc)
@@ -414,9 +414,9 @@ static unsigned command_2_index(unsigned c, unsigned sc)
 
 /*-------------------------------------------------------*/
 #define TYP (cdef[cmsg->par[cmsg->p]].typ)
-#define OFF (((u8 *)cmsg)+cdef[cmsg->par[cmsg->p]].off)
+#define OFF (((u8 *)cmsg) + cdef[cmsg->par[cmsg->p]].off)
 
-static void jumpcstruct(_cmsg * cmsg)
+static void jumpcstruct(_cmsg *cmsg)
 {
        unsigned layer;
        for (cmsg->p++, layer = 1; layer;) {
@@ -433,7 +433,7 @@ static void jumpcstruct(_cmsg * cmsg)
        }
 }
 /*-------------------------------------------------------*/
-static void pars_2_message(_cmsg * cmsg)
+static void pars_2_message(_cmsg *cmsg)
 {
 
        for (; TYP != _CEND; cmsg->p++) {
@@ -499,7 +499,7 @@ static void pars_2_message(_cmsg * cmsg)
  * Return value: 0 for success
  */
 
-unsigned capi_cmsg2message(_cmsg * cmsg, u8 * msg)
+unsigned capi_cmsg2message(_cmsg *cmsg, u8 *msg)
 {
        cmsg->m = msg;
        cmsg->l = 8;
@@ -518,7 +518,7 @@ unsigned capi_cmsg2message(_cmsg * cmsg, u8 * msg)
 }
 
 /*-------------------------------------------------------*/
-static void message_2_pars(_cmsg * cmsg)
+static void message_2_pars(_cmsg *cmsg)
 {
        for (; TYP != _CEND; cmsg->p++) {
 
@@ -569,7 +569,7 @@ static void message_2_pars(_cmsg * cmsg)
  * Return value: 0 for success
  */
 
-unsigned capi_message2cmsg(_cmsg * cmsg, u8 * msg)
+unsigned capi_message2cmsg(_cmsg *cmsg, u8 *msg)
 {
        memset(cmsg, 0, sizeof(_cmsg));
        cmsg->m = msg;
@@ -600,7 +600,7 @@ unsigned capi_message2cmsg(_cmsg * cmsg, u8 * msg)
  * Return value: 0 for success
  */
 
-unsigned capi_cmsg_header(_cmsg * cmsg, u16 _ApplId,
+unsigned capi_cmsg_header(_cmsg *cmsg, u16 _ApplId,
                          u8 _Command, u8 _Subcommand,
                          u16 _Messagenumber, u32 _Controller)
 {
@@ -689,54 +689,54 @@ char *capi_cmd2str(u8 cmd, u8 subcmd)
 
 static char *pnames[] =
 {
-    /*00 */ NULL,
-    /*01 */ NULL,
-    /*02 */ NULL,
-    /*03 */ "Controller/PLCI/NCCI",
-    /*04 */ "AdditionalInfo",
-    /*05 */ "B1configuration",
-    /*06 */ "B1protocol",
-    /*07 */ "B2configuration",
-    /*08 */ "B2protocol",
-    /*09 */ "B3configuration",
-    /*0a */ "B3protocol",
-    /*0b */ "BC",
-    /*0c */ "BChannelinformation",
-    /*0d */ "BProtocol",
-    /*0e */ "CalledPartyNumber",
-    /*0f */ "CalledPartySubaddress",
-    /*10 */ "CallingPartyNumber",
-    /*11 */ "CallingPartySubaddress",
-    /*12 */ "CIPmask",
-    /*13 */ "CIPmask2",
-    /*14 */ "CIPValue",
-    /*15 */ "Class",
-    /*16 */ "ConnectedNumber",
-    /*17 */ "ConnectedSubaddress",
-    /*18 */ "Data32",
-    /*19 */ "DataHandle",
-    /*1a */ "DataLength",
-    /*1b */ "FacilityConfirmationParameter",
-    /*1c */ "Facilitydataarray",
-    /*1d */ "FacilityIndicationParameter",
-    /*1e */ "FacilityRequestParameter",
-    /*1f */ "FacilitySelector",
-    /*20 */ "Flags",
-    /*21 */ "Function",
-    /*22 */ "HLC",
-    /*23 */ "Info",
-    /*24 */ "InfoElement",
-    /*25 */ "InfoMask",
-    /*26 */ "InfoNumber",
-    /*27 */ "Keypadfacility",
-    /*28 */ "LLC",
-    /*29 */ "ManuData",
-    /*2a */ "ManuID",
-    /*2b */ "NCPI",
-    /*2c */ "Reason",
-    /*2d */ "Reason_B3",
-    /*2e */ "Reject",
-    /*2f */ "Useruserdata"
+       /*00 */ NULL,
+       /*01 */ NULL,
+       /*02 */ NULL,
+       /*03 */ "Controller/PLCI/NCCI",
+       /*04 */ "AdditionalInfo",
+       /*05 */ "B1configuration",
+       /*06 */ "B1protocol",
+       /*07 */ "B2configuration",
+       /*08 */ "B2protocol",
+       /*09 */ "B3configuration",
+       /*0a */ "B3protocol",
+       /*0b */ "BC",
+       /*0c */ "BChannelinformation",
+       /*0d */ "BProtocol",
+       /*0e */ "CalledPartyNumber",
+       /*0f */ "CalledPartySubaddress",
+       /*10 */ "CallingPartyNumber",
+       /*11 */ "CallingPartySubaddress",
+       /*12 */ "CIPmask",
+       /*13 */ "CIPmask2",
+       /*14 */ "CIPValue",
+       /*15 */ "Class",
+       /*16 */ "ConnectedNumber",
+       /*17 */ "ConnectedSubaddress",
+       /*18 */ "Data32",
+       /*19 */ "DataHandle",
+       /*1a */ "DataLength",
+       /*1b */ "FacilityConfirmationParameter",
+       /*1c */ "Facilitydataarray",
+       /*1d */ "FacilityIndicationParameter",
+       /*1e */ "FacilityRequestParameter",
+       /*1f */ "FacilitySelector",
+       /*20 */ "Flags",
+       /*21 */ "Function",
+       /*22 */ "HLC",
+       /*23 */ "Info",
+       /*24 */ "InfoElement",
+       /*25 */ "InfoMask",
+       /*26 */ "InfoNumber",
+       /*27 */ "Keypadfacility",
+       /*28 */ "LLC",
+       /*29 */ "ManuData",
+       /*2a */ "ManuID",
+       /*2b */ "NCPI",
+       /*2c */ "Reason",
+       /*2d */ "Reason_B3",
+       /*2e */ "Reject",
+       /*2f */ "Useruserdata"
 };
 
 
@@ -744,10 +744,10 @@ static char *pnames[] =
 #include <stdarg.h>
 
 /*-------------------------------------------------------*/
-static _cdebbuf *bufprint(_cdebbuf *cdb, char *fmt,...)
+static _cdebbuf *bufprint(_cdebbuf *cdb, char *fmt, ...)
 {
        va_list f;
-       size_t n,r;
+       size_t n, r;
 
        if (!cdb)
                return NULL;
@@ -783,7 +783,7 @@ static _cdebbuf *bufprint(_cdebbuf *cdb, char *fmt,...)
        return cdb;
 }
 
-static _cdebbuf *printstructlen(_cdebbuf *cdb, u8 * m, unsigned len)
+static _cdebbuf *printstructlen(_cdebbuf *cdb, u8 *m, unsigned len)
 {
        unsigned hex = 0;
 
@@ -807,7 +807,7 @@ static _cdebbuf *printstructlen(_cdebbuf *cdb, u8 * m, unsigned len)
        return cdb;
 }
 
-static _cdebbuf *printstruct(_cdebbuf *cdb, u8 * m)
+static _cdebbuf *printstruct(_cdebbuf *cdb, u8 *m)
 {
        unsigned len;
 
@@ -940,7 +940,7 @@ void cdebbuf_free(_cdebbuf *cdb)
  * The returned buffer should be freed by a call to cdebbuf_free() after use.
  */
 
-_cdebbuf *capi_message2str(u8 * msg)
+_cdebbuf *capi_message2str(u8 *msg)
 {
        _cdebbuf *cdb;
        _cmsg   *cmsg;
@@ -964,10 +964,10 @@ _cdebbuf *capi_message2str(u8 * msg)
        cmsg->par = cpars[command_2_index(cmsg->Command, cmsg->Subcommand)];
 
        cdb = bufprint(cdb, "%-26s ID=%03d #0x%04x LEN=%04d\n",
-                mnames[command_2_index(cmsg->Command, cmsg->Subcommand)],
-                ((unsigned short *) msg)[1],
-                ((unsigned short *) msg)[3],
-                ((unsigned short *) msg)[0]);
+                      mnames[command_2_index(cmsg->Command, cmsg->Subcommand)],
+                      ((unsigned short *) msg)[1],
+                      ((unsigned short *) msg)[3],
+                      ((unsigned short *) msg)[0]);
 
        cdb = protocol_message_2_pars(cdb, cmsg, 1);
        if (unlikely(cmsg != g_cmsg))
@@ -986,7 +986,7 @@ _cdebbuf *capi_message2str(u8 * msg)
  * The returned buffer should be freed by a call to cdebbuf_free() after use.
  */
 
-_cdebbuf *capi_cmsg2str(_cmsg * cmsg)
+_cdebbuf *capi_cmsg2str(_cmsg *cmsg)
 {
        _cdebbuf *cdb;
 
@@ -998,17 +998,17 @@ _cdebbuf *capi_cmsg2str(_cmsg * cmsg)
        cmsg->l = 8;
        cmsg->p = 0;
        cdb = bufprint(cdb, "%s ID=%03d #0x%04x LEN=%04d\n",
-                mnames[command_2_index(cmsg->Command, cmsg->Subcommand)],
-                ((u16 *) cmsg->m)[1],
-                ((u16 *) cmsg->m)[3],
-                ((u16 *) cmsg->m)[0]);
+                      mnames[command_2_index(cmsg->Command, cmsg->Subcommand)],
+                      ((u16 *) cmsg->m)[1],
+                      ((u16 *) cmsg->m)[3],
+                      ((u16 *) cmsg->m)[0]);
        cdb = protocol_message_2_pars(cdb, cmsg, 1);
        return cdb;
 }
 
 int __init cdebug_init(void)
 {
-       g_cmsg= kmalloc(sizeof(_cmsg), GFP_KERNEL);
+       g_cmsg = kmalloc(sizeof(_cmsg), GFP_KERNEL);
        if (!g_cmsg)
                return -ENOMEM;
        g_debbuf = kmalloc(sizeof(_cdebbuf), GFP_KERNEL);
@@ -1041,12 +1041,12 @@ void __exit cdebug_exit(void)
 
 static _cdebbuf g_debbuf = {"CONFIG_CAPI_TRACE not enabled", NULL, 0, 0};
 
-_cdebbuf *capi_message2str(u8 * msg)
+_cdebbuf *capi_message2str(u8 *msg)
 {
        return &g_debbuf;
 }
 
-_cdebbuf *capi_cmsg2str(_cmsg * cmsg)
+_cdebbuf *capi_cmsg2str(_cmsg *cmsg)
 {
        return &g_debbuf;
 }
index 2b33b26..9b1b274 100644 (file)
@@ -1,10 +1,10 @@
 /* $Id: kcapi.c,v 1.1.2.8 2004/03/26 19:57:20 armin Exp $
- * 
+ *
  * Kernel CAPI 2.0 Module
- * 
+ *
  * Copyright 1999 by Carsten Paeth <calle@calle.de>
  * Copyright 2002 by Kai Germaschewski <kai@germaschewski.name>
- * 
+ *
  * This software may be used and distributed according to the terms
  * of the GNU General Public License, incorporated herein by reference.
  *
@@ -55,7 +55,7 @@ struct capictr_event {
 
 /* ------------------------------------------------------------- */
 
-static struct capi_version driver_version = {2, 0, 1, 1<<4};
+static struct capi_version driver_version = {2, 0, 1, 1 << 4};
 static char driver_serial[CAPI_SERIAL_LEN] = "0004711";
 static char capi_manufakturer[64] = "AVM Berlin";
 
@@ -172,7 +172,7 @@ register_appl(struct capi_ctr *ctr, u16 applid, capi_register_params *rparam)
 static void release_appl(struct capi_ctr *ctr, u16 applid)
 {
        DBG("applid %#x", applid);
-       
+
        ctr->release_appl(ctr, applid);
        capi_ctr_put(ctr);
 }
@@ -186,7 +186,7 @@ static void notify_up(u32 contr)
        mutex_lock(&capi_controller_lock);
 
        if (showcapimsgs & 1)
-               printk(KERN_DEBUG "kcapi: notify up contr %d\n", contr);
+               printk(KERN_DEBUG "kcapi: notify up contr %d\n", contr);
 
        ctr = get_capi_ctr_by_nr(contr);
        if (ctr) {
@@ -352,16 +352,16 @@ void capi_ctr_handle_message(struct capi_ctr *ctr, u16 appl,
                cdb = capi_message2str(skb->data);
                if (cdb) {
                        printk(KERN_INFO "kcapi: controller [%03d] not active, got: %s",
-                               ctr->cnr, cdb->buf);
+                              ctr->cnr, cdb->buf);
                        cdebbuf_free(cdb);
                } else
                        printk(KERN_INFO "kcapi: controller [%03d] not active, cannot trace\n",
-                               ctr->cnr);
+                              ctr->cnr);
                goto error;
        }
 
        cmd = CAPIMSG_COMMAND(skb->data);
-        subcmd = CAPIMSG_SUBCOMMAND(skb->data);
+       subcmd = CAPIMSG_SUBCOMMAND(skb->data);
        if (cmd == CAPI_DATA_B3 && subcmd == CAPI_IND) {
                ctr->nrecvdatapkt++;
                if (ctr->traceflag > 2)
@@ -382,13 +382,13 @@ void capi_ctr_handle_message(struct capi_ctr *ctr, u16 appl,
                        cdb = capi_message2str(skb->data);
                        if (cdb) {
                                printk(KERN_DEBUG "kcapi: got [%03d] %s\n",
-                                       ctr->cnr, cdb->buf);
+                                      ctr->cnr, cdb->buf);
                                cdebbuf_free(cdb);
                        } else
                                printk(KERN_DEBUG "kcapi: got [%03d] id#%d %s len=%u, cannot trace\n",
-                                       ctr->cnr, CAPIMSG_APPID(skb->data),
-                                       capi_cmd2str(cmd, subcmd),
-                                       CAPIMSG_LEN(skb->data));
+                                      ctr->cnr, CAPIMSG_APPID(skb->data),
+                                      capi_cmd2str(cmd, subcmd),
+                                      CAPIMSG_LEN(skb->data));
                }
 
        }
@@ -400,12 +400,12 @@ void capi_ctr_handle_message(struct capi_ctr *ctr, u16 appl,
                cdb = capi_message2str(skb->data);
                if (cdb) {
                        printk(KERN_ERR "kcapi: handle_message: applid %d state released (%s)\n",
-                       CAPIMSG_APPID(skb->data), cdb->buf);
+                              CAPIMSG_APPID(skb->data), cdb->buf);
                        cdebbuf_free(cdb);
                } else
                        printk(KERN_ERR "kcapi: handle_message: applid %d state released (%s) cannot trace\n",
-                               CAPIMSG_APPID(skb->data),
-                               capi_cmd2str(cmd, subcmd));
+                              CAPIMSG_APPID(skb->data),
+                              capi_cmd2str(cmd, subcmd));
                goto error;
        }
        skb_queue_tail(&ap->recv_queue, skb);
@@ -519,7 +519,7 @@ int attach_capi_ctr(struct capi_ctr *ctr)
        if (i == CAPI_MAXCONTR) {
                mutex_unlock(&capi_controller_lock);
                printk(KERN_ERR "kcapi: out of controller slots\n");
-               return -EBUSY;
+               return -EBUSY;
        }
        capi_controller[i] = ctr;
 
@@ -541,7 +541,7 @@ int attach_capi_ctr(struct capi_ctr *ctr)
        mutex_unlock(&capi_controller_lock);
 
        printk(KERN_NOTICE "kcapi: controller [%03d]: %s attached\n",
-                       ctr->cnr, ctr->name);
+              ctr->cnr, ctr->name);
        return 0;
 }
 
@@ -772,7 +772,7 @@ u16 capi20_put_message(struct capi20_appl *ap, struct sk_buff *skb)
        u8 cmd, subcmd;
 
        DBG("applid %#x", ap->applid);
+
        if (ncontrollers == 0)
                return CAPI_REGNOTINSTALLED;
        if ((ap->applid == 0) || ap->release_in_progress)
@@ -794,9 +794,9 @@ u16 capi20_put_message(struct capi20_appl *ap, struct sk_buff *skb)
                return CAPI_SENDQUEUEFULL;
 
        cmd = CAPIMSG_COMMAND(skb->data);
-        subcmd = CAPIMSG_SUBCOMMAND(skb->data);
+       subcmd = CAPIMSG_SUBCOMMAND(skb->data);
 
-       if (cmd == CAPI_DATA_B3 && subcmd== CAPI_REQ) {
+       if (cmd == CAPI_DATA_B3 && subcmd == CAPI_REQ) {
                ctr->nsentdatapkt++;
                ap->nsentdatapkt++;
                if (ctr->traceflag > 2)
@@ -819,15 +819,15 @@ u16 capi20_put_message(struct capi20_appl *ap, struct sk_buff *skb)
                        _cdebbuf *cdb = capi_message2str(skb->data);
                        if (cdb) {
                                printk(KERN_DEBUG "kcapi: put [%03d] %s\n",
-                                       CAPIMSG_CONTROLLER(skb->data),
-                                       cdb->buf);
+                                      CAPIMSG_CONTROLLER(skb->data),
+                                      cdb->buf);
                                cdebbuf_free(cdb);
                        } else
                                printk(KERN_DEBUG "kcapi: put [%03d] id#%d %s len=%u cannot trace\n",
-                                       CAPIMSG_CONTROLLER(skb->data),
-                                       CAPIMSG_APPID(skb->data),
-                                       capi_cmd2str(cmd, subcmd),
-                                       CAPIMSG_LEN(skb->data));
+                                      CAPIMSG_CONTROLLER(skb->data),
+                                      CAPIMSG_APPID(skb->data),
+                                      capi_cmd2str(cmd, subcmd),
+                                      CAPIMSG_LEN(skb->data));
                }
        }
        return ctr->send_message(ctr, skb);
@@ -1028,14 +1028,14 @@ static int old_capi_manufacturer(unsigned int cmd, void __user *data)
        case AVMB1_ADDCARD:
        case AVMB1_ADDCARD_WITH_TYPE:
                if (cmd == AVMB1_ADDCARD) {
-                  if ((retval = copy_from_user(&cdef, data,
-                                           sizeof(avmb1_carddef))))
-                          return -EFAULT;
-                  cdef.cardtype = AVM_CARDTYPE_B1;
+                       if ((retval = copy_from_user(&cdef, data,
+                                                    sizeof(avmb1_carddef))))
+                               return -EFAULT;
+                       cdef.cardtype = AVM_CARDTYPE_B1;
                } else {
-                  if ((retval = copy_from_user(&cdef, data,
-                                           sizeof(avmb1_extcarddef))))
-                          return -EFAULT;
+                       if ((retval = copy_from_user(&cdef, data,
+                                                    sizeof(avmb1_extcarddef))))
+                               return -EFAULT;
                }
                cparams.port = cdef.port;
                cparams.irq = cdef.irq;
@@ -1043,24 +1043,24 @@ static int old_capi_manufacturer(unsigned int cmd, void __user *data)
 
                mutex_lock(&capi_drivers_lock);
 
-                switch (cdef.cardtype) {
-                       case AVM_CARDTYPE_B1:
-                               list_for_each(l, &capi_drivers) {
-                                       driver = list_entry(l, struct capi_driver, list);
-                                       if (strcmp(driver->name, "b1isa") == 0)
-                                               break;
-                               }
-                               break;
-                       case AVM_CARDTYPE_T1:
-                               list_for_each(l, &capi_drivers) {
-                                       driver = list_entry(l, struct capi_driver, list);
-                                       if (strcmp(driver->name, "t1isa") == 0)
-                                               break;
-                               }
-                               break;
-                       default:
-                               driver = NULL;
-                               break;
+               switch (cdef.cardtype) {
+               case AVM_CARDTYPE_B1:
+                       list_for_each(l, &capi_drivers) {
+                               driver = list_entry(l, struct capi_driver, list);
+                               if (strcmp(driver->name, "b1isa") == 0)
+                                       break;
+                       }
+                       break;
+               case AVM_CARDTYPE_T1:
+                       list_for_each(l, &capi_drivers) {
+                               driver = list_entry(l, struct capi_driver, list);
+                               if (strcmp(driver->name, "t1isa") == 0)
+                                       break;
+                       }
+                       break;
+               default:
+                       driver = NULL;
+                       break;
                }
                if (!driver) {
                        printk(KERN_ERR "kcapi: driver not loaded.\n");
@@ -1136,7 +1136,7 @@ static int old_capi_manufacturer(unsigned int cmd, void __user *data)
 
                retval = wait_on_ctr_state(ctr, CAPI_CTR_RUNNING);
 
-load_unlock_out:
+       load_unlock_out:
                mutex_unlock(&capi_controller_lock);
                return retval;
 
@@ -1167,7 +1167,7 @@ load_unlock_out:
 
                retval = wait_on_ctr_state(ctr, CAPI_CTR_DETECTED);
 
-reset_unlock_out:
+       reset_unlock_out:
                mutex_unlock(&capi_controller_lock);
                return retval;
        }
@@ -1235,7 +1235,7 @@ int capi20_manufacturer(unsigned int cmd, void __user *data)
                cparams.membase = cdef.membase;
                cparams.cardnr = cdef.cardnr;
                cparams.cardtype = 0;
-               cdef.driver[sizeof(cdef.driver)-1] = 0;
+               cdef.driver[sizeof(cdef.driver) - 1] = 0;
 
                mutex_lock(&capi_drivers_lock);
 
@@ -1246,7 +1246,7 @@ int capi20_manufacturer(unsigned int cmd, void __user *data)
                }
                if (driver == NULL) {
                        printk(KERN_ERR "kcapi: driver \"%s\" not loaded.\n",
-                                       cdef.driver);
+                              cdef.driver);
                        retval = -ESRCH;
                } else if (!driver->add_card) {
                        printk(KERN_ERR "kcapi: driver \"%s\" has no add card function.\n", cdef.driver);
@@ -1260,7 +1260,7 @@ int capi20_manufacturer(unsigned int cmd, void __user *data)
 
        default:
                printk(KERN_ERR "kcapi: manufacturer command %d unknown.\n",
-                                       cmd);
+                      cmd);
                break;
 
        }
@@ -1305,7 +1305,7 @@ static int __init kcapi_init(void)
 
 static void __exit kcapi_exit(void)
 {
-        kcapi_proc_exit();
+       kcapi_proc_exit();
 
        unregister_capictr_notifier(&capictr_nb);
        cdebug_exit();
index f4620b3..6d439f9 100644 (file)
@@ -1,9 +1,9 @@
 /*
  * Kernel CAPI 2.0 Module
- * 
+ *
  * Copyright 1999 by Carsten Paeth <calle@calle.de>
  * Copyright 2002 by Kai Germaschewski <kai@germaschewski.name>
- * 
+ *
  * This software may be used and distributed according to the terms
  * of the GNU General Public License, incorporated herein by reference.
  *
@@ -16,9 +16,9 @@
 #include <linux/isdn/capilli.h>
 
 #ifdef KCAPI_DEBUG
-#define DBG(format, arg...) do { \
-printk(KERN_DEBUG "%s: " format "\n" , __func__ , ## arg); \
-} while (0)
+#define DBG(format, arg...) do {                                       \
+               printk(KERN_DEBUG "%s: " format "\n" , __func__ , ## arg); \
+       } while (0)
 #else
 #define DBG(format, arg...) /* */
 #endif
@@ -49,4 +49,3 @@ static inline void kcapi_proc_init(void) { };
 static inline void kcapi_proc_exit(void) { };
 
 #endif
-
index 8d51cd1..68db3c5 100644 (file)
@@ -1,9 +1,9 @@
 /*
  * Kernel CAPI 2.0 Module - /proc/capi handling
- * 
+ *
  * Copyright 1999 by Carsten Paeth <calle@calle.de>
  * Copyright 2002 by Kai Germaschewski <kai@germaschewski.name>
- * 
+ *
  * This software may be used and distributed according to the terms
  * of the GNU General Public License, incorporated herein by reference.
  *
@@ -29,7 +29,7 @@ static char *state2str(unsigned short state)
 // /proc/capi
 // ===========================================================================
 
-// /proc/capi/controller: 
+// /proc/capi/controller:
 //      cnr driver cardstate name driverinfo
 // /proc/capi/contrstats:
 //      cnr nrecvctlpkt nrecvdatapkt nsentctlpkt nsentdatapkt
@@ -85,7 +85,7 @@ static int contrstats_show(struct seq_file *seq, void *v)
                return 0;
 
        seq_printf(seq, "%d %lu %lu %lu %lu\n",
-                  ctr->cnr, 
+                  ctr->cnr,
                   ctr->nrecvctlpkt,
                   ctr->nrecvdatapkt,
                   ctr->nsentctlpkt,
@@ -134,9 +134,9 @@ static const struct file_operations proc_contrstats_ops = {
        .release        = seq_release,
 };
 
-// /proc/capi/applications: 
+// /proc/capi/applications:
 //      applid l3cnt dblkcnt dblklen #ncci recvqueuelen
-// /proc/capi/applstats: 
+// /proc/capi/applstats:
 //      applid nrecvctlpkt nrecvdatapkt nsentctlpkt nsentdatapkt
 // ---------------------------------------------------------------------------
 
@@ -297,7 +297,7 @@ static const struct file_operations proc_driver_ops = {
 
 // ---------------------------------------------------------------------------
 
-void __init 
+void __init
 kcapi_proc_init(void)
 {
        proc_mkdir("capi",             NULL);
index 2f7c9fc..5374c25 100644 (file)
@@ -3,7 +3,7 @@
  * Module init for DSS1 diversion services for i4l.
  *
  * Copyright 1999       by Werner Cornelius (werner@isdn4linux.de)
- * 
+ *
  * This software may be used and distributed according to the terms
  * of the GNU General Public License, incorporated herein by reference.
  *
@@ -23,13 +23,13 @@ MODULE_LICENSE("GPL");
 /* structure containing interface to hl */
 /****************************************/
 isdn_divert_if divert_if =
-  { DIVERT_IF_MAGIC,  /* magic value */
-    DIVERT_CMD_REG,   /* register cmd */
-    ll_callback,      /* callback routine from ll */
-    NULL,             /* command still not specified */
-    NULL,             /* drv_to_name */
-    NULL,             /* name_to_drv */
-  };
+{ DIVERT_IF_MAGIC,  /* magic value */
+  DIVERT_CMD_REG,   /* register cmd */
+  ll_callback,      /* callback routine from ll */
+  NULL,             /* command still not specified */
+  NULL,             /* drv_to_name */
+  NULL,             /* name_to_drv */
+};
 
 /*************************/
 /* Module interface code */
@@ -38,17 +38,17 @@ isdn_divert_if divert_if =
 static int __init divert_init(void)
 { int i;
 
-  if (divert_dev_init())
-   { printk(KERN_WARNING "dss1_divert: cannot install device, not loaded\n");
-     return(-EIO);
-   }
-  if ((i = DIVERT_REG_NAME(&divert_if)) != DIVERT_NO_ERR)
-   { divert_dev_deinit();
-     printk(KERN_WARNING "dss1_divert: error %d registering module, not loaded\n",i);
-     return(-EIO);
-   } 
-  printk(KERN_INFO "dss1_divert module successfully installed\n");
-  return(0);
+       if (divert_dev_init())
+       { printk(KERN_WARNING "dss1_divert: cannot install device, not loaded\n");
+               return (-EIO);
+       }
+       if ((i = DIVERT_REG_NAME(&divert_if)) != DIVERT_NO_ERR)
+       { divert_dev_deinit();
+               printk(KERN_WARNING "dss1_divert: error %d registering module, not loaded\n", i);
+               return (-EIO);
+       }
+       printk(KERN_INFO "dss1_divert module successfully installed\n");
+       return (0);
 }
 
 /**********************/
@@ -56,27 +56,26 @@ static int __init divert_init(void)
 /**********************/
 static void __exit divert_exit(void)
 {
-  unsigned long flags;
-  int i;
+       unsigned long flags;
+       int i;
 
-  spin_lock_irqsave(&divert_lock, flags);
-  divert_if.cmd = DIVERT_CMD_REL; /* release */
-  if ((i = DIVERT_REG_NAME(&divert_if)) != DIVERT_NO_ERR)
-   { printk(KERN_WARNING "dss1_divert: error %d releasing module\n",i);
-     spin_unlock_irqrestore(&divert_lock, flags);
-     return;
-   } 
-  if (divert_dev_deinit()) 
-   { printk(KERN_WARNING "dss1_divert: device busy, remove cancelled\n");
-     spin_unlock_irqrestore(&divert_lock, flags);
-     return;
-   }
-  spin_unlock_irqrestore(&divert_lock, flags);
-  deleterule(-1); /* delete all rules and free mem */
-  deleteprocs();
-  printk(KERN_INFO "dss1_divert module successfully removed \n");
+       spin_lock_irqsave(&divert_lock, flags);
+       divert_if.cmd = DIVERT_CMD_REL; /* release */
+       if ((i = DIVERT_REG_NAME(&divert_if)) != DIVERT_NO_ERR)
+       { printk(KERN_WARNING "dss1_divert: error %d releasing module\n", i);
+               spin_unlock_irqrestore(&divert_lock, flags);
+               return;
+       }
+       if (divert_dev_deinit())
+       { printk(KERN_WARNING "dss1_divert: device busy, remove cancelled\n");
+               spin_unlock_irqrestore(&divert_lock, flags);
+               return;
+       }
+       spin_unlock_irqrestore(&divert_lock, flags);
+       deleterule(-1); /* delete all rules and free mem */
+       deleteprocs();
+       printk(KERN_INFO "dss1_divert module successfully removed \n");
 }
 
 module_init(divert_init);
 module_exit(divert_exit);
-
index 9021182..fb4f1ba 100644 (file)
@@ -50,10 +50,10 @@ put_info_buffer(char *cp)
        if (!*cp)
                return;
        if (!(ib = kmalloc(sizeof(struct divert_info) + strlen(cp), GFP_ATOMIC)))
-                return;        /* no memory */
+               return; /* no memory */
        strcpy(ib->info_start, cp);     /* set output string */
        ib->next = NULL;
-       spin_lock_irqsave( &divert_info_lock, flags );
+       spin_lock_irqsave(&divert_info_lock, flags);
        ib->usage_cnt = if_used;
        if (!divert_info_head)
                divert_info_head = ib;  /* new head */
@@ -71,7 +71,7 @@ put_info_buffer(char *cp)
                } else
                        break;
        }                       /* divert_info_head->next */
-       spin_unlock_irqrestore( &divert_info_lock, flags );
+       spin_unlock_irqrestore(&divert_info_lock, flags);
        wake_up_interruptible(&(rd_queue));
 }                              /* put_info_buffer */
 
@@ -81,7 +81,7 @@ put_info_buffer(char *cp)
 /* deflection device read routine */
 /**********************************/
 static ssize_t
-isdn_divert_read(struct file *file, char __user *buf, size_t count, loff_t * off)
+isdn_divert_read(struct file *file, char __user *buf, size_t count, loff_t *off)
 {
        struct divert_info *inf;
        int len;
@@ -109,7 +109,7 @@ isdn_divert_read(struct file *file, char __user *buf, size_t count, loff_t * off
 /* deflection device write routine */
 /**********************************/
 static ssize_t
-isdn_divert_write(struct file *file, const char __user *buf, size_t count, loff_t * off)
+isdn_divert_write(struct file *file, const char __user *buf, size_t count, loff_t *off)
 {
        return (-ENODEV);
 }                              /* isdn_divert_write */
@@ -119,7 +119,7 @@ isdn_divert_write(struct file *file, const char __user *buf, size_t count, loff_
 /* select routines for various kernels */
 /***************************************/
 static unsigned int
-isdn_divert_poll(struct file *file, poll_table * wait)
+isdn_divert_poll(struct file *file, poll_table *wait)
 {
        unsigned int mask = 0;
 
@@ -139,13 +139,13 @@ isdn_divert_open(struct inode *ino, struct file *filep)
 {
        unsigned long flags;
 
-       spin_lock_irqsave( &divert_info_lock, flags );
-       if_used++;
+       spin_lock_irqsave(&divert_info_lock, flags);
+       if_used++;
        if (divert_info_head)
                filep->private_data = &(divert_info_tail->next);
        else
                filep->private_data = &divert_info_head;
-       spin_unlock_irqrestore( &divert_info_lock, flags );
+       spin_unlock_irqrestore(&divert_info_lock, flags);
        /*  start_divert(); */
        return nonseekable_open(ino, filep);
 }                              /* isdn_divert_open */
@@ -159,7 +159,7 @@ isdn_divert_close(struct inode *ino, struct file *filep)
        struct divert_info *inf;
        unsigned long flags;
 
-       spin_lock_irqsave( &divert_info_lock, flags );
+       spin_lock_irqsave(&divert_info_lock, flags);
        if_used--;
        inf = *((struct divert_info **) filep->private_data);
        while (inf) {
@@ -172,7 +172,7 @@ isdn_divert_close(struct inode *ino, struct file *filep)
                        divert_info_head = divert_info_head->next;
                        kfree(inf);
                }
-       spin_unlock_irqrestore( &divert_info_lock, flags );
+       spin_unlock_irqrestore(&divert_info_lock, flags);
        return (0);
 }                              /* isdn_divert_close */
 
@@ -191,75 +191,75 @@ static int isdn_divert_ioctl_unlocked(struct file *file, uint cmd, ulong arg)
                return -EFAULT;
 
        switch (cmd) {
-               case IIOCGETVER:
-                       dioctl.drv_version = DIVERT_IIOC_VERSION;       /* set version */
-                       break;
-
-               case IIOCGETDRV:
-                       if ((dioctl.getid.drvid = divert_if.name_to_drv(dioctl.getid.drvnam)) < 0)
-                               return (-EINVAL);
-                       break;
-
-               case IIOCGETNAM:
-                       cp = divert_if.drv_to_name(dioctl.getid.drvid);
-                       if (!cp)
-                               return (-EINVAL);
-                       if (!*cp)
-                               return (-EINVAL);
-                       strcpy(dioctl.getid.drvnam, cp);
-                       break;
-
-               case IIOCGETRULE:
-                       if (!(rulep = getruleptr(dioctl.getsetrule.ruleidx)))
-                               return (-EINVAL);
-                       dioctl.getsetrule.rule = *rulep;        /* copy data */
-                       break;
-
-               case IIOCMODRULE:
-                       if (!(rulep = getruleptr(dioctl.getsetrule.ruleidx)))
-                               return (-EINVAL);
-            spin_lock_irqsave(&divert_lock, flags);
-                       *rulep = dioctl.getsetrule.rule;        /* copy data */
-                       spin_unlock_irqrestore(&divert_lock, flags);
-                       return (0);     /* no copy required */
-                       break;
+       case IIOCGETVER:
+               dioctl.drv_version = DIVERT_IIOC_VERSION;       /* set version */
+               break;
 
-               case IIOCINSRULE:
-                       return (insertrule(dioctl.getsetrule.ruleidx, &dioctl.getsetrule.rule));
-                       break;
+       case IIOCGETDRV:
+               if ((dioctl.getid.drvid = divert_if.name_to_drv(dioctl.getid.drvnam)) < 0)
+                       return (-EINVAL);
+               break;
 
-               case IIOCDELRULE:
-                       return (deleterule(dioctl.getsetrule.ruleidx));
-                       break;
+       case IIOCGETNAM:
+               cp = divert_if.drv_to_name(dioctl.getid.drvid);
+               if (!cp)
+                       return (-EINVAL);
+               if (!*cp)
+                       return (-EINVAL);
+               strcpy(dioctl.getid.drvnam, cp);
+               break;
 
-               case IIOCDODFACT:
-                       return (deflect_extern_action(dioctl.fwd_ctrl.subcmd,
-                                                 dioctl.fwd_ctrl.callid,
-                                                dioctl.fwd_ctrl.to_nr));
-
-               case IIOCDOCFACT:
-               case IIOCDOCFDIS:
-               case IIOCDOCFINT:
-                       if (!divert_if.drv_to_name(dioctl.cf_ctrl.drvid))
-                               return (-EINVAL);       /* invalid driver */
-                       if (strnlen(dioctl.cf_ctrl.msn, sizeof(dioctl.cf_ctrl.msn)) ==
-                                       sizeof(dioctl.cf_ctrl.msn))
-                               return -EINVAL;
-                       if (strnlen(dioctl.cf_ctrl.fwd_nr, sizeof(dioctl.cf_ctrl.fwd_nr)) ==
-                                       sizeof(dioctl.cf_ctrl.fwd_nr))
-                               return -EINVAL;
-                       if ((i = cf_command(dioctl.cf_ctrl.drvid,
-                                           (cmd == IIOCDOCFACT) ? 1 : (cmd == IIOCDOCFDIS) ? 0 : 2,
-                                           dioctl.cf_ctrl.cfproc,
-                                           dioctl.cf_ctrl.msn,
-                                           dioctl.cf_ctrl.service,
-                                           dioctl.cf_ctrl.fwd_nr,
-                                           &dioctl.cf_ctrl.procid)))
-                               return (i);
-                       break;
+       case IIOCGETRULE:
+               if (!(rulep = getruleptr(dioctl.getsetrule.ruleidx)))
+                       return (-EINVAL);
+               dioctl.getsetrule.rule = *rulep;        /* copy data */
+               break;
 
-               default:
+       case IIOCMODRULE:
+               if (!(rulep = getruleptr(dioctl.getsetrule.ruleidx)))
                        return (-EINVAL);
+               spin_lock_irqsave(&divert_lock, flags);
+               *rulep = dioctl.getsetrule.rule;        /* copy data */
+               spin_unlock_irqrestore(&divert_lock, flags);
+               return (0);     /* no copy required */
+               break;
+
+       case IIOCINSRULE:
+               return (insertrule(dioctl.getsetrule.ruleidx, &dioctl.getsetrule.rule));
+               break;
+
+       case IIOCDELRULE:
+               return (deleterule(dioctl.getsetrule.ruleidx));
+               break;
+
+       case IIOCDODFACT:
+               return (deflect_extern_action(dioctl.fwd_ctrl.subcmd,
+                                             dioctl.fwd_ctrl.callid,
+                                             dioctl.fwd_ctrl.to_nr));
+
+       case IIOCDOCFACT:
+       case IIOCDOCFDIS:
+       case IIOCDOCFINT:
+               if (!divert_if.drv_to_name(dioctl.cf_ctrl.drvid))
+                       return (-EINVAL);       /* invalid driver */
+               if (strnlen(dioctl.cf_ctrl.msn, sizeof(dioctl.cf_ctrl.msn)) ==
+                   sizeof(dioctl.cf_ctrl.msn))
+                       return -EINVAL;
+               if (strnlen(dioctl.cf_ctrl.fwd_nr, sizeof(dioctl.cf_ctrl.fwd_nr)) ==
+                   sizeof(dioctl.cf_ctrl.fwd_nr))
+                       return -EINVAL;
+               if ((i = cf_command(dioctl.cf_ctrl.drvid,
+                                   (cmd == IIOCDOCFACT) ? 1 : (cmd == IIOCDOCFDIS) ? 0 : 2,
+                                   dioctl.cf_ctrl.cfproc,
+                                   dioctl.cf_ctrl.msn,
+                                   dioctl.cf_ctrl.service,
+                                   dioctl.cf_ctrl.fwd_nr,
+                                   &dioctl.cf_ctrl.procid)))
+                       return (i);
+               break;
+
+       default:
+               return (-EINVAL);
        }                       /* switch cmd */
        return copy_to_user((void __user *)arg, &dioctl, sizeof(dioctl)) ? -EFAULT : 0;
 }                              /* isdn_divert_ioctl */
@@ -284,7 +284,7 @@ static const struct file_operations isdn_fops =
        .poll           = isdn_divert_poll,
        .unlocked_ioctl = isdn_divert_ioctl,
        .open           = isdn_divert_open,
-       .release        = isdn_divert_close,                                      
+       .release        = isdn_divert_close,
 };
 
 /****************************/
index 48e6d22..e61e55f 100644 (file)
@@ -3,7 +3,7 @@
  * DSS1 main diversion supplementary handling for i4l.
  *
  * Copyright 1999       by Werner Cornelius (werner@isdn4linux.de)
- * 
+ *
  * This software may be used and distributed according to the terms
  * of the GNU General Public License, incorporated herein by reference.
  *
 /* structure keeping calling info */
 /**********************************/
 struct call_struc
-  { isdn_ctrl ics; /* delivered setup + driver parameters */
-    ulong divert_id; /* Id delivered to user */
-    unsigned char akt_state; /* actual state */
-    char deflect_dest[35]; /* deflection destination */   
-    struct timer_list timer; /* timer control structure */
-    char info[90]; /* device info output */ 
-    struct call_struc *next; /* pointer to next entry */
-    struct call_struc *prev;
-  };
+{ isdn_ctrl ics; /* delivered setup + driver parameters */
+       ulong divert_id; /* Id delivered to user */
+       unsigned char akt_state; /* actual state */
+       char deflect_dest[35]; /* deflection destination */
+       struct timer_list timer; /* timer control structure */
+       char info[90]; /* device info output */
+       struct call_struc *next; /* pointer to next entry */
+       struct call_struc *prev;
+};
 
 
 /********************************************/
 /* structure keeping deflection table entry */
 /********************************************/
 struct deflect_struc
-  { struct deflect_struc *next,*prev; 
-    divert_rule rule; /* used rule */
-  };
+{ struct deflect_struc *next, *prev;
+       divert_rule rule; /* used rule */
+};
 
 
 /*****************************************/
@@ -45,10 +45,10 @@ struct deflect_struc
 /*****************************************/
 /* diversion/deflection processes */
 static struct call_struc *divert_head = NULL; /* head of remembered entrys */
-static ulong next_id = 1; /* next info id */   
+static ulong next_id = 1; /* next info id */
 static struct deflect_struc *table_head = NULL;
-static struct deflect_struc *table_tail = NULL; 
-static unsigned char extern_wait_max = 4; /* maximum wait in s for external process */ 
+static struct deflect_struc *table_tail = NULL;
+static unsigned char extern_wait_max = 4; /* maximum wait in s for external process */
 
 DEFINE_SPINLOCK(divert_lock);
 
@@ -57,50 +57,50 @@ DEFINE_SPINLOCK(divert_lock);
 /***************************/
 static void deflect_timer_expire(ulong arg)
 {
-  unsigned long flags;
-  struct call_struc *cs = (struct call_struc *) arg;
-
-  spin_lock_irqsave(&divert_lock, flags);
-  del_timer(&cs->timer); /* delete active timer */
-  spin_unlock_irqrestore(&divert_lock, flags);
-
-  switch(cs->akt_state)
-   { case DEFLECT_PROCEED:
-       cs->ics.command = ISDN_CMD_HANGUP; /* cancel action */
-       divert_if.ll_cmd(&cs->ics);                       
-       spin_lock_irqsave(&divert_lock, flags);
-       cs->akt_state = DEFLECT_AUTODEL; /* delete after timeout */
-       cs->timer.expires = jiffies + (HZ * AUTODEL_TIME);
-       add_timer(&cs->timer);
-       spin_unlock_irqrestore(&divert_lock, flags);
-       break;
-
-     case DEFLECT_ALERT:
-       cs->ics.command = ISDN_CMD_REDIR; /* protocol */
-       strlcpy(cs->ics.parm.setup.phone, cs->deflect_dest, sizeof(cs->ics.parm.setup.phone));
-       strcpy(cs->ics.parm.setup.eazmsn,"Testtext delayed");
-       divert_if.ll_cmd(&cs->ics);
-       spin_lock_irqsave(&divert_lock, flags);
-       cs->akt_state = DEFLECT_AUTODEL; /* delete after timeout */
-       cs->timer.expires = jiffies + (HZ * AUTODEL_TIME);
-       add_timer(&cs->timer);
-       spin_unlock_irqrestore(&divert_lock, flags);
-       break;
-
-     case DEFLECT_AUTODEL:
-     default:
-       spin_lock_irqsave(&divert_lock, flags);
-       if (cs->prev) 
-         cs->prev->next = cs->next; /* forward link */
-        else
-         divert_head = cs->next;
-       if (cs->next)
-         cs->next->prev = cs->prev; /* back link */           
-       spin_unlock_irqrestore(&divert_lock, flags);
-       kfree(cs);
-       return;
-
-   } /* switch */
+       unsigned long flags;
+       struct call_struc *cs = (struct call_struc *) arg;
+
+       spin_lock_irqsave(&divert_lock, flags);
+       del_timer(&cs->timer); /* delete active timer */
+       spin_unlock_irqrestore(&divert_lock, flags);
+
+       switch (cs->akt_state)
+       { case DEFLECT_PROCEED:
+                       cs->ics.command = ISDN_CMD_HANGUP; /* cancel action */
+                       divert_if.ll_cmd(&cs->ics);
+                       spin_lock_irqsave(&divert_lock, flags);
+                       cs->akt_state = DEFLECT_AUTODEL; /* delete after timeout */
+                       cs->timer.expires = jiffies + (HZ * AUTODEL_TIME);
+                       add_timer(&cs->timer);
+                       spin_unlock_irqrestore(&divert_lock, flags);
+                       break;
+
+       case DEFLECT_ALERT:
+               cs->ics.command = ISDN_CMD_REDIR; /* protocol */
+               strlcpy(cs->ics.parm.setup.phone, cs->deflect_dest, sizeof(cs->ics.parm.setup.phone));
+               strcpy(cs->ics.parm.setup.eazmsn, "Testtext delayed");
+               divert_if.ll_cmd(&cs->ics);
+               spin_lock_irqsave(&divert_lock, flags);
+               cs->akt_state = DEFLECT_AUTODEL; /* delete after timeout */
+               cs->timer.expires = jiffies + (HZ * AUTODEL_TIME);
+               add_timer(&cs->timer);
+               spin_unlock_irqrestore(&divert_lock, flags);
+               break;
+
+       case DEFLECT_AUTODEL:
+       default:
+               spin_lock_irqsave(&divert_lock, flags);
+               if (cs->prev)
+                       cs->prev->next = cs->next; /* forward link */
+               else
+                       divert_head = cs->next;
+               if (cs->next)
+                       cs->next->prev = cs->prev; /* back link */
+               spin_unlock_irqrestore(&divert_lock, flags);
+               kfree(cs);
+               return;
+
+       } /* switch */
 } /* deflect_timer_func */
 
 
@@ -108,94 +108,94 @@ static void deflect_timer_expire(ulong arg)
 /* handle call forwarding de/activations */
 /* 0 = deact, 1 = act, 2 = interrogate   */
 /*****************************************/
-int cf_command(int drvid, int mode, 
-               u_char proc, char *msn, 
-               u_char service, char *fwd_nr, ulong *procid)
+int cf_command(int drvid, int mode,
+              u_char proc, char *msn,
+              u_char service, char *fwd_nr, ulong *procid)
 { unsigned long flags;
-  int retval,msnlen;
-  int fwd_len;
-  char *p,*ielenp,tmp[60];
-  struct call_struc *cs;
-
-  if (strchr(msn,'.')) return(-EINVAL); /* subaddress not allowed in msn */
-  if ((proc & 0x7F) > 2) return(-EINVAL);
-  proc &= 3;
-  p = tmp;
-  *p++ = 0x30; /* enumeration */
-  ielenp = p++; /* remember total length position */
-  *p++ = 0xa; /* proc tag */
-  *p++ = 1;   /* length */
-  *p++ = proc & 0x7F; /* procedure to de/activate/interrogate */
-  *p++ = 0xa; /* service tag */
-  *p++ = 1;   /* length */
-  *p++ = service; /* service to handle */
-
-  if (mode == 1) 
-   { if (!*fwd_nr) return(-EINVAL); /* destination missing */
-     if (strchr(fwd_nr,'.')) return(-EINVAL); /* subaddress not allowed */
-     fwd_len = strlen(fwd_nr);
-     *p++ = 0x30; /* number enumeration */
-     *p++ = fwd_len + 2; /* complete forward to len */ 
-     *p++ = 0x80; /* fwd to nr */
-     *p++ = fwd_len; /* length of number */
-     strcpy(p,fwd_nr); /* copy number */
-     p += fwd_len; /* pointer beyond fwd */
-   } /* activate */
-
-  msnlen = strlen(msn);
-  *p++ = 0x80; /* msn number */
-  if (msnlen > 1)
-   { *p++ = msnlen; /* length */
-     strcpy(p,msn);
-     p += msnlen;
-   }
-  else *p++ = 0;
-
-  *ielenp = p - ielenp - 1; /* set total IE length */ 
-
-  /* allocate mem for information struct */  
-  if (!(cs = kmalloc(sizeof(struct call_struc), GFP_ATOMIC)))
-             return(-ENOMEM); /* no memory */
-  init_timer(&cs->timer);
-  cs->info[0] = '\0';
-  cs->timer.function = deflect_timer_expire;
-  cs->timer.data = (ulong) cs; /* pointer to own structure */
-  cs->ics.driver = drvid;
-  cs->ics.command = ISDN_CMD_PROT_IO; /* protocol specific io */
-  cs->ics.arg = DSS1_CMD_INVOKE; /* invoke supplementary service */
-  cs->ics.parm.dss1_io.proc = (mode == 1) ? 7: (mode == 2) ? 11:8; /* operation */ 
-  cs->ics.parm.dss1_io.timeout = 4000; /* from ETS 300 207-1 */
-  cs->ics.parm.dss1_io.datalen = p - tmp; /* total len */
-  cs->ics.parm.dss1_io.data = tmp; /* start of buffer */
-  
-  spin_lock_irqsave(&divert_lock, flags);
-  cs->ics.parm.dss1_io.ll_id = next_id++; /* id for callback */
-  spin_unlock_irqrestore(&divert_lock, flags);
-  *procid = cs->ics.parm.dss1_io.ll_id;  
-
-  sprintf(cs->info,"%d 0x%lx %s%s 0 %s %02x %d%s%s\n",
-         (!mode ) ? DIVERT_DEACTIVATE : (mode == 1) ? DIVERT_ACTIVATE : DIVERT_REPORT,
-          cs->ics.parm.dss1_io.ll_id,
-          (mode != 2) ? "" : "0 ",
-          divert_if.drv_to_name(cs->ics.driver),
-          msn,
-          service & 0xFF,
-          proc,
-          (mode != 1) ? "" : " 0 ",
-          (mode != 1) ? "" : fwd_nr);
-  retval = divert_if.ll_cmd(&cs->ics); /* execute command */
-
-  if (!retval)
-   { cs->prev = NULL;
-     spin_lock_irqsave(&divert_lock, flags);
-     cs->next = divert_head;
-     divert_head = cs; 
-     spin_unlock_irqrestore(&divert_lock, flags);
-   }
-  else
-   kfree(cs);
-  return(retval); 
+       int retval, msnlen;
+       int fwd_len;
+       char *p, *ielenp, tmp[60];
+       struct call_struc *cs;
+
+       if (strchr(msn, '.')) return (-EINVAL); /* subaddress not allowed in msn */
+       if ((proc & 0x7F) > 2) return (-EINVAL);
+       proc &= 3;
+       p = tmp;
+       *p++ = 0x30; /* enumeration */
+       ielenp = p++; /* remember total length position */
+       *p++ = 0xa; /* proc tag */
+       *p++ = 1;   /* length */
+       *p++ = proc & 0x7F; /* procedure to de/activate/interrogate */
+       *p++ = 0xa; /* service tag */
+       *p++ = 1;   /* length */
+       *p++ = service; /* service to handle */
+
+       if (mode == 1)
+       { if (!*fwd_nr) return (-EINVAL); /* destination missing */
+               if (strchr(fwd_nr, '.')) return (-EINVAL); /* subaddress not allowed */
+               fwd_len = strlen(fwd_nr);
+               *p++ = 0x30; /* number enumeration */
+               *p++ = fwd_len + 2; /* complete forward to len */
+               *p++ = 0x80; /* fwd to nr */
+               *p++ = fwd_len; /* length of number */
+               strcpy(p, fwd_nr); /* copy number */
+               p += fwd_len; /* pointer beyond fwd */
+       } /* activate */
+
+       msnlen = strlen(msn);
+       *p++ = 0x80; /* msn number */
+       if (msnlen > 1)
+       { *p++ = msnlen; /* length */
+               strcpy(p, msn);
+               p += msnlen;
+       }
+       else *p++ = 0;
+
+       *ielenp = p - ielenp - 1; /* set total IE length */
+
+       /* allocate mem for information struct */
+       if (!(cs = kmalloc(sizeof(struct call_struc), GFP_ATOMIC)))
+               return (-ENOMEM); /* no memory */
+       init_timer(&cs->timer);
+       cs->info[0] = '\0';
+       cs->timer.function = deflect_timer_expire;
+       cs->timer.data = (ulong) cs; /* pointer to own structure */
+       cs->ics.driver = drvid;
+       cs->ics.command = ISDN_CMD_PROT_IO; /* protocol specific io */
+       cs->ics.arg = DSS1_CMD_INVOKE; /* invoke supplementary service */
+       cs->ics.parm.dss1_io.proc = (mode == 1) ? 7 : (mode == 2) ? 11 : 8; /* operation */
+       cs->ics.parm.dss1_io.timeout = 4000; /* from ETS 300 207-1 */
+       cs->ics.parm.dss1_io.datalen = p - tmp; /* total len */
+       cs->ics.parm.dss1_io.data = tmp; /* start of buffer */
+
+       spin_lock_irqsave(&divert_lock, flags);
+       cs->ics.parm.dss1_io.ll_id = next_id++; /* id for callback */
+       spin_unlock_irqrestore(&divert_lock, flags);
+       *procid = cs->ics.parm.dss1_io.ll_id;
+
+       sprintf(cs->info, "%d 0x%lx %s%s 0 %s %02x %d%s%s\n",
+               (!mode) ? DIVERT_DEACTIVATE : (mode == 1) ? DIVERT_ACTIVATE : DIVERT_REPORT,
+               cs->ics.parm.dss1_io.ll_id,
+               (mode != 2) ? "" : "0 ",
+               divert_if.drv_to_name(cs->ics.driver),
+               msn,
+               service & 0xFF,
+               proc,
+               (mode != 1) ? "" : " 0 ",
+               (mode != 1) ? "" : fwd_nr);
+
+       retval = divert_if.ll_cmd(&cs->ics); /* execute command */
+
+       if (!retval)
+       { cs->prev = NULL;
+               spin_lock_irqsave(&divert_lock, flags);
+               cs->next = divert_head;
+               divert_head = cs;
+               spin_unlock_irqrestore(&divert_lock, flags);
+       }
+       else
+               kfree(cs);
+       return (retval);
 } /* cf_command */
 
 
@@ -204,165 +204,165 @@ int cf_command(int drvid, int mode,
 /****************************************/
 int deflect_extern_action(u_char cmd, ulong callid, char *to_nr)
 { struct call_struc *cs;
-  isdn_ctrl ic;
-  unsigned long flags;
-  int i;
-
-  if ((cmd & 0x7F) > 2) return(-EINVAL); /* invalid command */
-  cs = divert_head; /* start of parameter list */
-  while (cs)
-   { if (cs->divert_id == callid) break; /* found */
-     cs = cs->next;  
-   } /* search entry */
-  if (!cs) return(-EINVAL); /* invalid callid */
-
-  ic.driver = cs->ics.driver;
-  ic.arg = cs->ics.arg;
-  i = -EINVAL;
-  if (cs->akt_state == DEFLECT_AUTODEL) return(i); /* no valid call */
-  switch (cmd & 0x7F)
-   { case 0: /* hangup */
-       del_timer(&cs->timer); 
-       ic.command = ISDN_CMD_HANGUP;
-       i = divert_if.ll_cmd(&ic);
-       spin_lock_irqsave(&divert_lock, flags);
-       cs->akt_state = DEFLECT_AUTODEL; /* delete after timeout */
-       cs->timer.expires = jiffies + (HZ * AUTODEL_TIME);
-       add_timer(&cs->timer);
-       spin_unlock_irqrestore(&divert_lock, flags);
-     break;      
-
-     case 1: /* alert */
-       if (cs->akt_state == DEFLECT_ALERT) return(0);
-       cmd &= 0x7F; /* never wait */
-       del_timer(&cs->timer); 
-       ic.command = ISDN_CMD_ALERT;
-       if ((i = divert_if.ll_cmd(&ic)))
-       {
-          spin_lock_irqsave(&divert_lock, flags);
-          cs->akt_state = DEFLECT_AUTODEL; /* delete after timeout */
-          cs->timer.expires = jiffies + (HZ * AUTODEL_TIME);
-          add_timer(&cs->timer);
-          spin_unlock_irqrestore(&divert_lock, flags);
-        }
-       else
-          cs->akt_state = DEFLECT_ALERT; 
-     break;      
-
-     case 2: /* redir */
-       del_timer(&cs->timer); 
-       strlcpy(cs->ics.parm.setup.phone, to_nr, sizeof(cs->ics.parm.setup.phone));
-       strcpy(cs->ics.parm.setup.eazmsn, "Testtext manual");
-       ic.command = ISDN_CMD_REDIR;
-       if ((i = divert_if.ll_cmd(&ic)))
-       {
-          spin_lock_irqsave(&divert_lock, flags);
-          cs->akt_state = DEFLECT_AUTODEL; /* delete after timeout */
-          cs->timer.expires = jiffies + (HZ * AUTODEL_TIME);
-          add_timer(&cs->timer);
-          spin_unlock_irqrestore(&divert_lock, flags);
-        }
-       else
-          cs->akt_state = DEFLECT_ALERT; 
-     break;      
-
-   } /* switch */
-  return(i);
+       isdn_ctrl ic;
+       unsigned long flags;
+       int i;
+
+       if ((cmd & 0x7F) > 2) return (-EINVAL); /* invalid command */
+       cs = divert_head; /* start of parameter list */
+       while (cs)
+       { if (cs->divert_id == callid) break; /* found */
+               cs = cs->next;
+       } /* search entry */
+       if (!cs) return (-EINVAL); /* invalid callid */
+
+       ic.driver = cs->ics.driver;
+       ic.arg = cs->ics.arg;
+       i = -EINVAL;
+       if (cs->akt_state == DEFLECT_AUTODEL) return (i); /* no valid call */
+       switch (cmd & 0x7F)
+       { case 0: /* hangup */
+                       del_timer(&cs->timer);
+                       ic.command = ISDN_CMD_HANGUP;
+                       i = divert_if.ll_cmd(&ic);
+                       spin_lock_irqsave(&divert_lock, flags);
+                       cs->akt_state = DEFLECT_AUTODEL; /* delete after timeout */
+                       cs->timer.expires = jiffies + (HZ * AUTODEL_TIME);
+                       add_timer(&cs->timer);
+                       spin_unlock_irqrestore(&divert_lock, flags);
+                       break;
+
+       case 1: /* alert */
+               if (cs->akt_state == DEFLECT_ALERT) return (0);
+               cmd &= 0x7F; /* never wait */
+               del_timer(&cs->timer);
+               ic.command = ISDN_CMD_ALERT;
+               if ((i = divert_if.ll_cmd(&ic)))
+               {
+                       spin_lock_irqsave(&divert_lock, flags);
+                       cs->akt_state = DEFLECT_AUTODEL; /* delete after timeout */
+                       cs->timer.expires = jiffies + (HZ * AUTODEL_TIME);
+                       add_timer(&cs->timer);
+                       spin_unlock_irqrestore(&divert_lock, flags);
+               }
+               else
+                       cs->akt_state = DEFLECT_ALERT;
+               break;
+
+       case 2: /* redir */
+               del_timer(&cs->timer);
+               strlcpy(cs->ics.parm.setup.phone, to_nr, sizeof(cs->ics.parm.setup.phone));
+               strcpy(cs->ics.parm.setup.eazmsn, "Testtext manual");
+               ic.command = ISDN_CMD_REDIR;
+               if ((i = divert_if.ll_cmd(&ic)))
+               {
+                       spin_lock_irqsave(&divert_lock, flags);
+                       cs->akt_state = DEFLECT_AUTODEL; /* delete after timeout */
+                       cs->timer.expires = jiffies + (HZ * AUTODEL_TIME);
+                       add_timer(&cs->timer);
+                       spin_unlock_irqrestore(&divert_lock, flags);
+               }
+               else
+                       cs->akt_state = DEFLECT_ALERT;
+               break;
+
+       } /* switch */
+       return (i);
 } /* deflect_extern_action */
 
 /********************************/
 /* insert a new rule before idx */
 /********************************/
 int insertrule(int idx, divert_rule *newrule)
-{ struct deflect_struc *ds,*ds1=NULL;
-  unsigned long flags;
-
-  if (!(ds = kmalloc(sizeof(struct deflect_struc),
-                                              GFP_KERNEL))) 
-    return(-ENOMEM); /* no memory */
-
-  ds->rule = *newrule; /* set rule */
-
-  spin_lock_irqsave(&divert_lock, flags);
-
-  if (idx >= 0)
-   { ds1 = table_head;
-     while ((ds1) && (idx > 0))
-      { idx--;
-        ds1 = ds1->next;
-      } 
-     if (!ds1) idx = -1; 
-   }
-
-  if (idx < 0)
-   { ds->prev = table_tail; /* previous entry */
-     ds->next = NULL; /* end of chain */
-     if (ds->prev) 
-       ds->prev->next = ds; /* last forward */
-      else
-        table_head = ds; /* is first entry */
-     table_tail = ds; /* end of queue */
-   }
-  else
-    { ds->next = ds1; /* next entry */
-      ds->prev = ds1->prev; /* prev entry */
-      ds1->prev = ds; /* backward chain old element */
-      if (!ds->prev)
-        table_head = ds; /* first element */
-   }
-
-  spin_unlock_irqrestore(&divert_lock, flags);
-  return(0);
+{ struct deflect_struc *ds, *ds1 = NULL;
+       unsigned long flags;
+
+       if (!(ds = kmalloc(sizeof(struct deflect_struc),
+                          GFP_KERNEL)))
+               return (-ENOMEM); /* no memory */
+
+       ds->rule = *newrule; /* set rule */
+
+       spin_lock_irqsave(&divert_lock, flags);
+
+       if (idx >= 0)
+       { ds1 = table_head;
+               while ((ds1) && (idx > 0))
+               { idx--;
+                       ds1 = ds1->next;
+               }
+               if (!ds1) idx = -1;
+       }
+
+       if (idx < 0)
+       { ds->prev = table_tail; /* previous entry */
+               ds->next = NULL; /* end of chain */
+               if (ds->prev)
+                       ds->prev->next = ds; /* last forward */
+               else
+                       table_head = ds; /* is first entry */
+               table_tail = ds; /* end of queue */
+       }
+       else
+       { ds->next = ds1; /* next entry */
+               ds->prev = ds1->prev; /* prev entry */
+               ds1->prev = ds; /* backward chain old element */
+               if (!ds->prev)
+                       table_head = ds; /* first element */
+       }
+
+       spin_unlock_irqrestore(&divert_lock, flags);
+       return (0);
 } /* insertrule */
 
 /***********************************/
 /* delete the rule at position idx */
 /***********************************/
 int deleterule(int idx)
-{ struct deflect_struc *ds,*ds1;
-  unsigned long flags;
-  
-  if (idx < 0) 
-   { spin_lock_irqsave(&divert_lock, flags);
-     ds = table_head;
-     table_head = NULL;
-     table_tail = NULL;
-     spin_unlock_irqrestore(&divert_lock, flags);
-     while (ds)
-      { ds1 = ds; 
-        ds = ds->next;
-        kfree(ds1);
-      } 
-     return(0); 
-   }
-
-  spin_lock_irqsave(&divert_lock, flags);
-  ds = table_head;
-
-  while ((ds) && (idx > 0))
-   { idx--; 
-     ds = ds->next;  
-   }
-
-  if (!ds) 
-   {
-     spin_unlock_irqrestore(&divert_lock, flags);
-     return(-EINVAL);
-   }  
-
-  if (ds->next) 
-    ds->next->prev = ds->prev; /* backward chain */
-   else
-     table_tail = ds->prev; /* end of chain */
-
-  if (ds->prev)
-    ds->prev->next = ds->next; /* forward chain */
-   else
-     table_head = ds->next; /* start of chain */      
-  
-  spin_unlock_irqrestore(&divert_lock, flags);
-  kfree(ds);
-  return(0);
+{ struct deflect_struc *ds, *ds1;
+       unsigned long flags;
+
+       if (idx < 0)
+       { spin_lock_irqsave(&divert_lock, flags);
+               ds = table_head;
+               table_head = NULL;
+               table_tail = NULL;
+               spin_unlock_irqrestore(&divert_lock, flags);
+               while (ds)
+               { ds1 = ds;
+                       ds = ds->next;
+                       kfree(ds1);
+               }
+               return (0);
+       }
+
+       spin_lock_irqsave(&divert_lock, flags);
+       ds = table_head;
+
+       while ((ds) && (idx > 0))
+       { idx--;
+               ds = ds->next;
+       }
+
+       if (!ds)
+       {
+               spin_unlock_irqrestore(&divert_lock, flags);
+               return (-EINVAL);
+       }
+
+       if (ds->next)
+               ds->next->prev = ds->prev; /* backward chain */
+       else
+               table_tail = ds->prev; /* end of chain */
+
+       if (ds->prev)
+               ds->prev->next = ds->next; /* forward chain */
+       else
+               table_head = ds->next; /* start of chain */
+
+       spin_unlock_irqrestore(&divert_lock, flags);
+       kfree(ds);
+       return (0);
 } /* deleterule */
 
 /*******************************************/
@@ -370,16 +370,16 @@ int deleterule(int idx)
 /*******************************************/
 divert_rule *getruleptr(int idx)
 { struct deflect_struc *ds = table_head;
-  
-  if (idx < 0) return(NULL);
-  while ((ds) && (idx >= 0))
-   { if (!(idx--)) 
-      { return(&ds->rule);
-        break;
-      }
-     ds = ds->next;  
-   }
-  return(NULL);
+
+       if (idx < 0) return (NULL);
+       while ((ds) && (idx >= 0))
+       { if (!(idx--))
+               { return (&ds->rule);
+                       break;
+               }
+               ds = ds->next;
+       }
+       return (NULL);
 } /* getruleptr */
 
 /*************************************************/
@@ -387,168 +387,168 @@ divert_rule *getruleptr(int idx)
 /*************************************************/
 static int isdn_divert_icall(isdn_ctrl *ic)
 { int retval = 0;
-  unsigned long flags;
-  struct call_struc *cs = NULL; 
-  struct deflect_struc *dv;
-  char *p,*p1;
-  u_char accept;
-
-  /* first check the internal deflection table */
-  for (dv = table_head; dv ; dv = dv->next )
-   { /* scan table */
-     if (((dv->rule.callopt == 1) && (ic->command == ISDN_STAT_ICALLW)) ||
-         ((dv->rule.callopt == 2) && (ic->command == ISDN_STAT_ICALL)))
-       continue; /* call option check */  
-     if (!(dv->rule.drvid & (1L << ic->driver))) 
-       continue; /* driver not matching */ 
-     if ((dv->rule.si1) && (dv->rule.si1 != ic->parm.setup.si1)) 
-       continue; /* si1 not matching */
-     if ((dv->rule.si2) && (dv->rule.si2 != ic->parm.setup.si2)) 
-       continue; /* si2 not matching */
-
-     p = dv->rule.my_msn;
-     p1 = ic->parm.setup.eazmsn;
-     accept = 0;
-     while (*p)
-      { /* complete compare */
-        if (*p == '-')
-         { accept = 1; /* call accepted */
-            break;
-          }
-        if (*p++ != *p1++) 
-          break; /* not accepted */
-        if ((!*p) && (!*p1))
-          accept = 1;
-      } /* complete compare */
-     if (!accept) continue; /* not accepted */
-     if ((strcmp(dv->rule.caller,"0")) || (ic->parm.setup.phone[0]))
-      { p = dv->rule.caller;
-        p1 = ic->parm.setup.phone;
-        accept = 0;
-        while (*p)
-        { /* complete compare */
-           if (*p == '-')
-           { accept = 1; /* call accepted */
-              break;
-            }
-           if (*p++ != *p1++) 
-             break; /* not accepted */
-           if ((!*p) && (!*p1))
-             accept = 1;
-         } /* complete compare */
-        if (!accept) continue; /* not accepted */
-      }  
-
-     switch (dv->rule.action)
-       { case DEFLECT_IGNORE:
-           return(0);
-           break;
-
-         case DEFLECT_ALERT:
-         case DEFLECT_PROCEED:
-         case DEFLECT_REPORT:
-         case DEFLECT_REJECT:
-           if (dv->rule.action == DEFLECT_PROCEED)
-           if ((!if_used) || ((!extern_wait_max) && (!dv->rule.waittime))) 
-              return(0); /* no external deflection needed */  
-           if (!(cs = kmalloc(sizeof(struct call_struc), GFP_ATOMIC)))
-             return(0); /* no memory */
-           init_timer(&cs->timer);
-           cs->info[0] = '\0';
-           cs->timer.function = deflect_timer_expire;
-           cs->timer.data = (ulong) cs; /* pointer to own structure */
-           
-           cs->ics = *ic; /* copy incoming data */
-           if (!cs->ics.parm.setup.phone[0]) strcpy(cs->ics.parm.setup.phone,"0");
-           if (!cs->ics.parm.setup.eazmsn[0]) strcpy(cs->ics.parm.setup.eazmsn,"0");
-          cs->ics.parm.setup.screen = dv->rule.screen;  
-           if (dv->rule.waittime) 
-             cs->timer.expires = jiffies + (HZ * dv->rule.waittime);
-           else
-            if (dv->rule.action == DEFLECT_PROCEED)
-              cs->timer.expires = jiffies + (HZ * extern_wait_max); 
-            else  
-              cs->timer.expires = 0;
-           cs->akt_state = dv->rule.action;                
-           spin_lock_irqsave(&divert_lock, flags);
-           cs->divert_id = next_id++; /* new sequence number */
-           spin_unlock_irqrestore(&divert_lock, flags);
-           cs->prev = NULL;
-           if (cs->akt_state == DEFLECT_ALERT)
-             { strcpy(cs->deflect_dest,dv->rule.to_nr);
-               if (!cs->timer.expires)
-                { strcpy(ic->parm.setup.eazmsn,"Testtext direct");
-                   ic->parm.setup.screen = dv->rule.screen;
-                   strlcpy(ic->parm.setup.phone, dv->rule.to_nr, sizeof(ic->parm.setup.phone));
-                   cs->akt_state = DEFLECT_AUTODEL; /* delete after timeout */
-                   cs->timer.expires = jiffies + (HZ * AUTODEL_TIME);
-                   retval = 5; 
-                 }
-               else
-                 retval = 1; /* alerting */                 
-             }
-           else
-             { cs->deflect_dest[0] = '\0';
-              retval = 4; /* only proceed */
-             }  
-           sprintf(cs->info,"%d 0x%lx %s %s %s %s 0x%x 0x%x %d %d %s\n",
-                   cs->akt_state,
-                   cs->divert_id,
-                   divert_if.drv_to_name(cs->ics.driver),
-                   (ic->command == ISDN_STAT_ICALLW) ? "1":"0", 
-                   cs->ics.parm.setup.phone, 
-                   cs->ics.parm.setup.eazmsn,
-                   cs->ics.parm.setup.si1,
-                   cs->ics.parm.setup.si2,
-                   cs->ics.parm.setup.screen,
-                   dv->rule.waittime,
-                   cs->deflect_dest);
-           if ((dv->rule.action == DEFLECT_REPORT) ||
-               (dv->rule.action == DEFLECT_REJECT))
-           { put_info_buffer(cs->info);
-             kfree(cs); /* remove */
-              return((dv->rule.action == DEFLECT_REPORT) ? 0:2); /* nothing to do */ 
-            }              
-           break;
-  
-         default:
-           return(0); /* ignore call */
-           break;
-       } /* switch action */    
-     break; 
-   } /* scan_table */
-
-  if (cs) 
-   { cs->prev = NULL;
-     spin_lock_irqsave(&divert_lock, flags);
-     cs->next = divert_head;
-     divert_head = cs; 
-     if (cs->timer.expires) add_timer(&cs->timer);
-     spin_unlock_irqrestore(&divert_lock, flags);
-
-     put_info_buffer(cs->info); 
-     return(retval);
-   }
-  else
-     return(0);
+       unsigned long flags;
+       struct call_struc *cs = NULL;
+       struct deflect_struc *dv;
+       char *p, *p1;
+       u_char accept;
+
+       /* first check the internal deflection table */
+       for (dv = table_head; dv; dv = dv->next)
+       { /* scan table */
+               if (((dv->rule.callopt == 1) && (ic->command == ISDN_STAT_ICALLW)) ||
+                   ((dv->rule.callopt == 2) && (ic->command == ISDN_STAT_ICALL)))
+                       continue; /* call option check */
+               if (!(dv->rule.drvid & (1L << ic->driver)))
+                       continue; /* driver not matching */
+               if ((dv->rule.si1) && (dv->rule.si1 != ic->parm.setup.si1))
+                       continue; /* si1 not matching */
+               if ((dv->rule.si2) && (dv->rule.si2 != ic->parm.setup.si2))
+                       continue; /* si2 not matching */
+
+               p = dv->rule.my_msn;
+               p1 = ic->parm.setup.eazmsn;
+               accept = 0;
+               while (*p)
+               { /* complete compare */
+                       if (*p == '-')
+                       { accept = 1; /* call accepted */
+                               break;
+                       }
+                       if (*p++ != *p1++)
+                               break; /* not accepted */
+                       if ((!*p) && (!*p1))
+                               accept = 1;
+               } /* complete compare */
+               if (!accept) continue; /* not accepted */
+
+               if ((strcmp(dv->rule.caller, "0")) || (ic->parm.setup.phone[0]))
+               { p = dv->rule.caller;
+                       p1 = ic->parm.setup.phone;
+                       accept = 0;
+                       while (*p)
+                       { /* complete compare */
+                               if (*p == '-')
+                               { accept = 1; /* call accepted */
+                                       break;
+                               }
+                               if (*p++ != *p1++)
+                                       break; /* not accepted */
+                               if ((!*p) && (!*p1))
+                                       accept = 1;
+                       } /* complete compare */
+                       if (!accept) continue; /* not accepted */
+               }
+
+               switch (dv->rule.action)
+               { case DEFLECT_IGNORE:
+                               return (0);
+                               break;
+
+               case DEFLECT_ALERT:
+               case DEFLECT_PROCEED:
+               case DEFLECT_REPORT:
+               case DEFLECT_REJECT:
+                       if (dv->rule.action == DEFLECT_PROCEED)
+                               if ((!if_used) || ((!extern_wait_max) && (!dv->rule.waittime)))
+                                       return (0); /* no external deflection needed */
+                       if (!(cs = kmalloc(sizeof(struct call_struc), GFP_ATOMIC)))
+                               return (0); /* no memory */
+                       init_timer(&cs->timer);
+                       cs->info[0] = '\0';
+                       cs->timer.function = deflect_timer_expire;
+                       cs->timer.data = (ulong) cs; /* pointer to own structure */
+
+                       cs->ics = *ic; /* copy incoming data */
+                       if (!cs->ics.parm.setup.phone[0]) strcpy(cs->ics.parm.setup.phone, "0");
+                       if (!cs->ics.parm.setup.eazmsn[0]) strcpy(cs->ics.parm.setup.eazmsn, "0");
+                       cs->ics.parm.setup.screen = dv->rule.screen;
+                       if (dv->rule.waittime)
+                               cs->timer.expires = jiffies + (HZ * dv->rule.waittime);
+                       else
+                               if (dv->rule.action == DEFLECT_PROCEED)
+                                       cs->timer.expires = jiffies + (HZ * extern_wait_max);
+                               else
+                                       cs->timer.expires = 0;
+                       cs->akt_state = dv->rule.action;
+                       spin_lock_irqsave(&divert_lock, flags);
+                       cs->divert_id = next_id++; /* new sequence number */
+                       spin_unlock_irqrestore(&divert_lock, flags);
+                       cs->prev = NULL;
+                       if (cs->akt_state == DEFLECT_ALERT)
+                       { strcpy(cs->deflect_dest, dv->rule.to_nr);
+                               if (!cs->timer.expires)
+                               { strcpy(ic->parm.setup.eazmsn, "Testtext direct");
+                                       ic->parm.setup.screen = dv->rule.screen;
+                                       strlcpy(ic->parm.setup.phone, dv->rule.to_nr, sizeof(ic->parm.setup.phone));
+                                       cs->akt_state = DEFLECT_AUTODEL; /* delete after timeout */
+                                       cs->timer.expires = jiffies + (HZ * AUTODEL_TIME);
+                                       retval = 5;
+                               }
+                               else
+                                       retval = 1; /* alerting */
+                       }
+                       else
+                       { cs->deflect_dest[0] = '\0';
+                               retval = 4; /* only proceed */
+                       }
+                       sprintf(cs->info, "%d 0x%lx %s %s %s %s 0x%x 0x%x %d %d %s\n",
+                               cs->akt_state,
+                               cs->divert_id,
+                               divert_if.drv_to_name(cs->ics.driver),
+                               (ic->command == ISDN_STAT_ICALLW) ? "1" : "0",
+                               cs->ics.parm.setup.phone,
+                               cs->ics.parm.setup.eazmsn,
+                               cs->ics.parm.setup.si1,
+                               cs->ics.parm.setup.si2,
+                               cs->ics.parm.setup.screen,
+                               dv->rule.waittime,
+                               cs->deflect_dest);
+                       if ((dv->rule.action == DEFLECT_REPORT) ||
+                           (dv->rule.action == DEFLECT_REJECT))
+                       { put_info_buffer(cs->info);
+                               kfree(cs); /* remove */
+                               return ((dv->rule.action == DEFLECT_REPORT) ? 0 : 2); /* nothing to do */
+                       }
+                       break;
+
+               default:
+                       return (0); /* ignore call */
+                       break;
+               } /* switch action */
+               break;
+       } /* scan_table */
+
+       if (cs)
+       { cs->prev = NULL;
+               spin_lock_irqsave(&divert_lock, flags);
+               cs->next = divert_head;
+               divert_head = cs;
+               if (cs->timer.expires) add_timer(&cs->timer);
+               spin_unlock_irqrestore(&divert_lock, flags);
+
+               put_info_buffer(cs->info);
+               return (retval);
+       }
+       else
+               return (0);
 } /* isdn_divert_icall */
 
 
 void deleteprocs(void)
-{ struct call_struc *cs, *cs1; 
-  unsigned long flags;
-
-  spin_lock_irqsave(&divert_lock, flags);
-  cs = divert_head;
-  divert_head = NULL;
-  while (cs)
-   { del_timer(&cs->timer);
-     cs1 = cs;
-     cs = cs->next;
-     kfree(cs1);
-   } 
-  spin_unlock_irqrestore(&divert_lock, flags);
+{ struct call_struc *cs, *cs1;
+       unsigned long flags;
+
+       spin_lock_irqsave(&divert_lock, flags);
+       cs = divert_head;
+       divert_head = NULL;
+       while (cs)
+       { del_timer(&cs->timer);
+               cs1 = cs;
+               cs = cs->next;
+               kfree(cs1);
+       }
+       spin_unlock_irqrestore(&divert_lock, flags);
 } /* deleteprocs */
 
 /****************************************************/
@@ -556,42 +556,42 @@ void deleteprocs(void)
 /****************************************************/
 static int put_address(char *st, u_char *p, int len)
 { u_char retval = 0;
-  u_char adr_typ = 0; /* network standard */
-
-  if (len < 2) return(retval);
-  if (*p == 0xA1)
-   { retval = *(++p) + 2; /* total length */
-     if (retval > len) return(0); /* too short */
-     len = retval - 2; /* remaining length */
-     if (len < 3) return(0);
-     if ((*(++p) != 0x0A) || (*(++p) != 1)) return(0);
-     adr_typ = *(++p);
-     len -= 3;
-     p++;
-     if (len < 2) return(0);
-     if (*p++ != 0x12) return(0);
-     if (*p > len) return(0); /* check number length */
-     len = *p++;
-   }   
-  else
-   if (*p == 0x80)
-    { retval = *(++p) + 2; /* total length */
-      if (retval > len) return(0);
-      len = retval - 2;
-      p++;
-    }
-   else  
-    return(0); /* invalid address information */
-
-  sprintf(st,"%d ",adr_typ);
-  st += strlen(st);
-  if (!len) 
-    *st++ = '-';
-  else
-   while (len--)
-     *st++ = *p++;
-  *st = '\0';
-  return(retval);
+       u_char adr_typ = 0; /* network standard */
+
+       if (len < 2) return (retval);
+       if (*p == 0xA1)
+       { retval = *(++p) + 2; /* total length */
+               if (retval > len) return (0); /* too short */
+               len = retval - 2; /* remaining length */
+               if (len < 3) return (0);
+               if ((*(++p) != 0x0A) || (*(++p) != 1)) return (0);
+               adr_typ = *(++p);
+               len -= 3;
+               p++;
+               if (len < 2) return (0);
+               if (*p++ != 0x12) return (0);
+               if (*p > len) return (0); /* check number length */
+               len = *p++;
+       }
+       else
+               if (*p == 0x80)
+               { retval = *(++p) + 2; /* total length */
+                       if (retval > len) return (0);
+                       len = retval - 2;
+                       p++;
+               }
+               else
+                       return (0); /* invalid address information */
+
+       sprintf(st, "%d ", adr_typ);
+       st += strlen(st);
+       if (!len)
+               *st++ = '-';
+       else
+               while (len--)
+                       *st++ = *p++;
+       *st = '\0';
+       return (retval);
 } /* put_address */
 
 /*************************************/
@@ -599,93 +599,93 @@ static int put_address(char *st, u_char *p, int len)
 /*************************************/
 static int interrogate_success(isdn_ctrl *ic, struct call_struc *cs)
 { char *src = ic->parm.dss1_io.data;
-  int restlen = ic->parm.dss1_io.datalen;
-  int cnt = 1;
-  u_char n,n1;
-  char st[90], *p, *stp;
-
-  if (restlen < 2) return(-100); /* frame too short */
-  if (*src++ != 0x30) return(-101);
-  if ((n = *src++) > 0x81) return(-102); /* invalid length field */
-  restlen -= 2; /* remaining bytes */
-  if (n == 0x80)
-   { if (restlen < 2) return(-103);
-     if ((*(src+restlen-1)) || (*(src+restlen-2))) return(-104);
-     restlen -= 2;
-   }
-  else
-   if ( n == 0x81)
-    { n = *src++;
-      restlen--;
-      if (n > restlen) return(-105);
-      restlen = n;
-    }
-   else
-    if (n > restlen) return(-106);
-     else 
-      restlen = n; /* standard format */   
-  if (restlen < 3) return(-107); /* no procedure */
-  if ((*src++ != 2) || (*src++ != 1) || (*src++ != 0x0B)) return(-108);
-  restlen -= 3; 
-  if (restlen < 2) return(-109); /* list missing */
-  if (*src == 0x31)
-   { src++; 
-     if ((n = *src++) > 0x81) return(-110); /* invalid length field */
-     restlen -= 2; /* remaining bytes */
-     if (n == 0x80)
-      { if (restlen < 2) return(-111);
-        if ((*(src+restlen-1)) || (*(src+restlen-2))) return(-112);
-        restlen -= 2;
-      }
-     else
-      if ( n == 0x81)
-       { n = *src++;
-         restlen--;
-         if (n > restlen) return(-113);
-         restlen = n;
-       }
-      else
-       if (n > restlen) return(-114);
-        else 
-         restlen = n; /* standard format */   
-   } /* result list header */ 
-
-  while (restlen >= 2)
-   { stp = st;
-     sprintf(stp,"%d 0x%lx %d %s ",DIVERT_REPORT, ic->parm.dss1_io.ll_id,
-                 cnt++,divert_if.drv_to_name(ic->driver));
-     stp += strlen(stp);
-     if (*src++ != 0x30) return(-115); /* invalid enum */
-     n = *src++;
-     restlen -= 2;
-     if (n > restlen) return(-116); /* enum length wrong */
-     restlen -= n;
-     p = src; /* one entry */
-     src += n;
-     if (!(n1 = put_address(stp,p,n & 0xFF))) continue;
-     stp += strlen(stp);
-     p += n1;
-     n -= n1;
-     if (n < 6) continue; /* no service and proc */
-     if ((*p++ != 0x0A) || (*p++ != 1)) continue;
-     sprintf(stp," 0x%02x ",(*p++) & 0xFF);
-     stp += strlen(stp);
-     if ((*p++ != 0x0A) || (*p++ != 1)) continue;
-     sprintf(stp,"%d ",(*p++) & 0xFF);
-     stp += strlen(stp);
-     n -= 6;
-     if (n > 2)
-      { if (*p++ != 0x30) continue;
-        if (*p > (n-2)) continue;
-        n = *p++;
-        if (!(n1 = put_address(stp,p,n & 0xFF))) continue;
-        stp += strlen(stp);
-      }
-     sprintf(stp,"\n");
-     put_info_buffer(st);
-   } /* while restlen */
-  if (restlen) return(-117);
-  return(0);   
+       int restlen = ic->parm.dss1_io.datalen;
+       int cnt = 1;
+       u_char n, n1;
+       char st[90], *p, *stp;
+
+       if (restlen < 2) return (-100); /* frame too short */
+       if (*src++ != 0x30) return (-101);
+       if ((n = *src++) > 0x81) return (-102); /* invalid length field */
+       restlen -= 2; /* remaining bytes */
+       if (n == 0x80)
+       { if (restlen < 2) return (-103);
+               if ((*(src + restlen - 1)) || (*(src + restlen - 2))) return (-104);
+               restlen -= 2;
+       }
+       else
+               if (n == 0x81)
+               { n = *src++;
+                       restlen--;
+                       if (n > restlen) return (-105);
+                       restlen = n;
+               }
+               else
+                       if (n > restlen) return (-106);
+                       else
+                               restlen = n; /* standard format */
+       if (restlen < 3) return (-107); /* no procedure */
+       if ((*src++ != 2) || (*src++ != 1) || (*src++ != 0x0B)) return (-108);
+       restlen -= 3;
+       if (restlen < 2) return (-109); /* list missing */
+       if (*src == 0x31)
+       { src++;
+               if ((n = *src++) > 0x81) return (-110); /* invalid length field */
+               restlen -= 2; /* remaining bytes */
+               if (n == 0x80)
+               { if (restlen < 2) return (-111);
+                       if ((*(src + restlen - 1)) || (*(src + restlen - 2))) return (-112);
+                       restlen -= 2;
+               }
+               else
+                       if (n == 0x81)
+                       { n = *src++;
+                               restlen--;
+                               if (n > restlen) return (-113);
+                               restlen = n;
+                       }
+                       else
+                               if (n > restlen) return (-114);
+                               else
+                                       restlen = n; /* standard format */
+       } /* result list header */
+
+       while (restlen >= 2)
+       { stp = st;
+               sprintf(stp, "%d 0x%lx %d %s ", DIVERT_REPORT, ic->parm.dss1_io.ll_id,
+                       cnt++, divert_if.drv_to_name(ic->driver));
+               stp += strlen(stp);
+               if (*src++ != 0x30) return (-115); /* invalid enum */
+               n = *src++;
+               restlen -= 2;
+               if (n > restlen) return (-116); /* enum length wrong */
+               restlen -= n;
+               p = src; /* one entry */
+               src += n;
+               if (!(n1 = put_address(stp, p, n & 0xFF))) continue;
+               stp += strlen(stp);
+               p += n1;
+               n -= n1;
+               if (n < 6) continue; /* no service and proc */
+               if ((*p++ != 0x0A) || (*p++ != 1)) continue;
+               sprintf(stp, " 0x%02x ", (*p++) & 0xFF);
+               stp += strlen(stp);
+               if ((*p++ != 0x0A) || (*p++ != 1)) continue;
+               sprintf(stp, "%d ", (*p++) & 0xFF);
+               stp += strlen(stp);
+               n -= 6;
+               if (n > 2)
+               { if (*p++ != 0x30) continue;
+                       if (*p > (n - 2)) continue;
+                       n = *p++;
+                       if (!(n1 = put_address(stp, p, n & 0xFF))) continue;
+                       stp += strlen(stp);
+               }
+               sprintf(stp, "\n");
+               put_info_buffer(st);
+       } /* while restlen */
+       if (restlen) return (-117);
+       return (0);
 } /* interrogate_success */
 
 /*********************************************/
@@ -693,90 +693,90 @@ static int interrogate_success(isdn_ctrl *ic, struct call_struc *cs)
 /*********************************************/
 static int prot_stat_callback(isdn_ctrl *ic)
 { struct call_struc *cs, *cs1;
-  int i;
-  unsigned long flags;
-
-  cs = divert_head; /* start of list */
-  cs1 = NULL;
-  while (cs)
-   { if (ic->driver == cs->ics.driver) 
-      { switch (cs->ics.arg)
-        { case DSS1_CMD_INVOKE:
-             if ((cs->ics.parm.dss1_io.ll_id == ic->parm.dss1_io.ll_id) &&
-                 (cs->ics.parm.dss1_io.hl_id == ic->parm.dss1_io.hl_id))
-             { switch (ic->arg)
-               {  case DSS1_STAT_INVOKE_ERR:
-                     sprintf(cs->info,"128 0x%lx 0x%x\n", 
-                             ic->parm.dss1_io.ll_id,
-                             ic->parm.dss1_io.timeout);
-                     put_info_buffer(cs->info);
-                   break;
-                   
-                   case DSS1_STAT_INVOKE_RES:
-                     switch (cs->ics.parm.dss1_io.proc)
-                     {  case  7:
-                         case  8:
-                            put_info_buffer(cs->info); 
-                           break;
-                       
-                         case  11:
-                           i = interrogate_success(ic,cs);
-                           if (i)
-                             sprintf(cs->info,"%d 0x%lx %d\n",DIVERT_REPORT, 
-                                     ic->parm.dss1_io.ll_id,i);
-                           put_info_buffer(cs->info); 
-                           break;
-                       
-                        default: 
-                           printk(KERN_WARNING "dss1_divert: unknown proc %d\n",cs->ics.parm.dss1_io.proc);
-                           break;
-                      } 
-
-
-                   break;
-                  default:
-                     printk(KERN_WARNING "dss1_divert unknown invoke answer %lx\n",ic->arg);
-                   break;  
-                 } 
-                cs1 = cs; /* remember structure */
-                cs = NULL; 
-                continue; /* abort search */
-              } /* id found */ 
-           break;
-   
-          case DSS1_CMD_INVOKE_ABORT:
-             printk(KERN_WARNING "dss1_divert unhandled invoke abort\n"); 
-           break;   
-         
-          default:
-             printk(KERN_WARNING "dss1_divert unknown cmd 0x%lx\n",cs->ics.arg); 
-           break; 
-         } /* switch ics.arg */ 
-        cs = cs->next; 
-      } /* driver ok */
-   }  
-   
-  if (!cs1) 
-   { printk(KERN_WARNING "dss1_divert unhandled process\n");
-     return(0);
-   }  
-
-  if (cs1->ics.driver == -1)
-   {
-     spin_lock_irqsave(&divert_lock, flags);
-     del_timer(&cs1->timer);
-     if (cs1->prev) 
-       cs1->prev->next = cs1->next; /* forward link */
-     else
-       divert_head = cs1->next;
-     if (cs1->next)
-       cs1->next->prev = cs1->prev; /* back link */           
-     spin_unlock_irqrestore(&divert_lock, flags);
-     kfree(cs1);
-   } 
-
-  return(0);
+       int i;
+       unsigned long flags;
+
+       cs = divert_head; /* start of list */
+       cs1 = NULL;
+       while (cs)
+       { if (ic->driver == cs->ics.driver)
+               { switch (cs->ics.arg)
+                       { case DSS1_CMD_INVOKE:
+                                       if ((cs->ics.parm.dss1_io.ll_id == ic->parm.dss1_io.ll_id) &&
+                                           (cs->ics.parm.dss1_io.hl_id == ic->parm.dss1_io.hl_id))
+                                       { switch (ic->arg)
+                                               {  case DSS1_STAT_INVOKE_ERR:
+                                                               sprintf(cs->info, "128 0x%lx 0x%x\n",
+                                                                       ic->parm.dss1_io.ll_id,
+                                                                       ic->parm.dss1_io.timeout);
+                                                               put_info_buffer(cs->info);
+                                                               break;
+
+                                               case DSS1_STAT_INVOKE_RES:
+                                                       switch (cs->ics.parm.dss1_io.proc)
+                                                       {  case  7:
+                                                       case  8:
+                                                               put_info_buffer(cs->info);
+                                                               break;
+
+                                                       case  11:
+                                                               i = interrogate_success(ic, cs);
+                                                               if (i)
+                                                                       sprintf(cs->info, "%d 0x%lx %d\n", DIVERT_REPORT,
+                                                                               ic->parm.dss1_io.ll_id, i);
+                                                               put_info_buffer(cs->info);
+                                                               break;
+
+                                                       default:
+                                                               printk(KERN_WARNING "dss1_divert: unknown proc %d\n", cs->ics.parm.dss1_io.proc);
+                                                               break;
+                                                       }
+
+
+                                                       break;
+
+                                               default:
+                                                       printk(KERN_WARNING "dss1_divert unknown invoke answer %lx\n", ic->arg);
+                                                       break;
+                                               }
+                                               cs1 = cs; /* remember structure */
+                                               cs = NULL;
+                                               continue; /* abort search */
+                                       } /* id found */
+                                       break;
+
+                       case DSS1_CMD_INVOKE_ABORT:
+                               printk(KERN_WARNING "dss1_divert unhandled invoke abort\n");
+                               break;
+
+                       default:
+                               printk(KERN_WARNING "dss1_divert unknown cmd 0x%lx\n", cs->ics.arg);
+                               break;
+                       } /* switch ics.arg */
+                       cs = cs->next;
+               } /* driver ok */
+       }
+
+       if (!cs1)
+       { printk(KERN_WARNING "dss1_divert unhandled process\n");
+               return (0);
+       }
+
+       if (cs1->ics.driver == -1)
+       {
+               spin_lock_irqsave(&divert_lock, flags);
+               del_timer(&cs1->timer);
+               if (cs1->prev)
+                       cs1->prev->next = cs1->next; /* forward link */
+               else
+                       divert_head = cs1->next;
+               if (cs1->next)
+                       cs1->next->prev = cs1->prev; /* back link */
+               spin_unlock_irqrestore(&divert_lock, flags);
+               kfree(cs1);
+       }
+
+       return (0);
 } /* prot_stat_callback */
 
 
@@ -785,79 +785,78 @@ static int prot_stat_callback(isdn_ctrl *ic)
 /***************************/
 static int isdn_divert_stat_callback(isdn_ctrl *ic)
 { struct call_struc *cs, *cs1;
-  unsigned long flags;
-  int retval;
-
-  retval = -1;
-  cs = divert_head; /* start of list */
-     while (cs)
-      { if ((ic->driver == cs->ics.driver) && (ic->arg == cs->ics.arg))
-         { switch (ic->command)
-           { case ISDN_STAT_DHUP:
-                sprintf(cs->info,"129 0x%lx\n",cs->divert_id);
-                del_timer(&cs->timer);
-                cs->ics.driver = -1;
-                break;
-
-             case ISDN_STAT_CAUSE:
-                sprintf(cs->info,"130 0x%lx %s\n",cs->divert_id,ic->parm.num);
-                break;
-
-             case ISDN_STAT_REDIR:
-                sprintf(cs->info,"131 0x%lx\n",cs->divert_id);
-                del_timer(&cs->timer);
-                cs->ics.driver = -1;
-                break; 
-
-             default:
-                sprintf(cs->info,"999 0x%lx 0x%x\n",cs->divert_id,(int)(ic->command));
-                break; 
-            }
-          put_info_buffer(cs->info);
-          retval = 0; 
-         }
-        cs1 = cs; 
-        cs = cs->next;
-        if (cs1->ics.driver == -1)
-          { 
-            spin_lock_irqsave(&divert_lock, flags);
-            if (cs1->prev) 
-              cs1->prev->next = cs1->next; /* forward link */
-            else
-              divert_head = cs1->next;
-            if (cs1->next)
-              cs1->next->prev = cs1->prev; /* back link */           
-            spin_unlock_irqrestore(&divert_lock, flags);
-            kfree(cs1);
-          } 
-      }  
-  return(retval); /* not found */
-} /* isdn_divert_stat_callback */ 
+       unsigned long flags;
+       int retval;
+
+       retval = -1;
+       cs = divert_head; /* start of list */
+       while (cs)
+       { if ((ic->driver == cs->ics.driver) && (ic->arg == cs->ics.arg))
+               { switch (ic->command)
+                       { case ISDN_STAT_DHUP:
+                                       sprintf(cs->info, "129 0x%lx\n", cs->divert_id);
+                                       del_timer(&cs->timer);
+                                       cs->ics.driver = -1;
+                                       break;
+
+                       case ISDN_STAT_CAUSE:
+                               sprintf(cs->info, "130 0x%lx %s\n", cs->divert_id, ic->parm.num);
+                               break;
+
+                       case ISDN_STAT_REDIR:
+                               sprintf(cs->info, "131 0x%lx\n", cs->divert_id);
+                               del_timer(&cs->timer);
+                               cs->ics.driver = -1;
+                               break;
+
+                       default:
+                               sprintf(cs->info, "999 0x%lx 0x%x\n", cs->divert_id, (int)(ic->command));
+                               break;
+                       }
+                       put_info_buffer(cs->info);
+                       retval = 0;
+               }
+               cs1 = cs;
+               cs = cs->next;
+               if (cs1->ics.driver == -1)
+               {
+                       spin_lock_irqsave(&divert_lock, flags);
+                       if (cs1->prev)
+                               cs1->prev->next = cs1->next; /* forward link */
+                       else
+                               divert_head = cs1->next;
+                       if (cs1->next)
+                               cs1->next->prev = cs1->prev; /* back link */
+                       spin_unlock_irqrestore(&divert_lock, flags);
+                       kfree(cs1);
+               }
+       }
+       return (retval); /* not found */
+} /* isdn_divert_stat_callback */
 
 
 /********************/
 /* callback from ll */
-/********************/ 
+/********************/
 int ll_callback(isdn_ctrl *ic)
 {
-  switch (ic->command)
-   { case ISDN_STAT_ICALL:
-     case ISDN_STAT_ICALLW:
-       return(isdn_divert_icall(ic));
-     break;
-
-     case ISDN_STAT_PROT:
-       if ((ic->arg & 0xFF) == ISDN_PTYPE_EURO)
-       { if (ic->arg != DSS1_STAT_INVOKE_BRD)
-            return(prot_stat_callback(ic));
-          else
-            return(0); /* DSS1 invoke broadcast */
-        }
-       else
-         return(-1); /* protocol not euro */    
-
-     default:
-       return(isdn_divert_stat_callback(ic));
-   }
+       switch (ic->command)
+       { case ISDN_STAT_ICALL:
+       case ISDN_STAT_ICALLW:
+               return (isdn_divert_icall(ic));
+               break;
+
+       case ISDN_STAT_PROT:
+               if ((ic->arg & 0xFF) == ISDN_PTYPE_EURO)
+               { if (ic->arg != DSS1_STAT_INVOKE_BRD)
+                               return (prot_stat_callback(ic));
+                       else
+                               return (0); /* DSS1 invoke broadcast */
+               }
+               else
+                       return (-1); /* protocol not euro */
+
+       default:
+               return (isdn_divert_stat_callback(ic));
+       }
 } /* ll_callback */
-
index 19439a6..42f2893 100644 (file)
@@ -3,7 +3,7 @@
  * Header for the diversion supplementary ioctl interface.
  *
  * Copyright 1998       by Werner Cornelius (werner@ikt.de)
- * 
+ *
  * This software may be used and distributed according to the terms
  * of the GNU General Public License, incorporated herein by reference.
  *
 #define IIOCGETDRV   _IO('I', 2)  /* get driver number */
 #define IIOCGETNAM   _IO('I', 3)  /* get driver name */
 #define IIOCGETRULE  _IO('I', 4)  /* read one rule */
-#define IIOCMODRULE  _IO('I', 5)  /* modify/replace a rule */  
+#define IIOCMODRULE  _IO('I', 5)  /* modify/replace a rule */
 #define IIOCINSRULE  _IO('I', 6)  /* insert/append one rule */
 #define IIOCDELRULE  _IO('I', 7)  /* delete a rule */
 #define IIOCDODFACT  _IO('I', 8)  /* hangup/reject/alert/immediately deflect a call */
 #define IIOCDOCFACT  _IO('I', 9)  /* activate control forwarding in PBX */
-#define IIOCDOCFDIS  _IO('I',10)  /* deactivate control forwarding in PBX */
-#define IIOCDOCFINT  _IO('I',11)  /* interrogate control forwarding in PBX */
+#define IIOCDOCFDIS  _IO('I', 10)  /* deactivate control forwarding in PBX */
+#define IIOCDOCFINT  _IO('I', 11)  /* interrogate control forwarding in PBX */
 
 /*************************************/
 /* states reported through interface */
 #define DEFLECT_IGNORE    0  /* ignore incoming call */
 #define DEFLECT_REPORT    1  /* only report */
 #define DEFLECT_PROCEED   2  /* deflect when externally triggered */
-#define DEFLECT_ALERT     3  /* alert and deflect after delay */ 
+#define DEFLECT_ALERT     3  /* alert and deflect after delay */
 #define DEFLECT_REJECT    4  /* reject immediately */
 #define DIVERT_ACTIVATE   5  /* diversion activate */
 #define DIVERT_DEACTIVATE 6  /* diversion deactivate */
-#define DIVERT_REPORT     7  /* interrogation result */ 
-#define DEFLECT_AUTODEL 255  /* only for internal use */ 
+#define DIVERT_REPORT     7  /* interrogation result */
+#define DEFLECT_AUTODEL 255  /* only for internal use */
 
 #define DEFLECT_ALL_IDS   0xFFFFFFFF /* all drivers selected */
 
 typedef struct
- { ulong drvid;     /* driver ids, bit mapped */
-   char my_msn[35]; /* desired msn, subaddr allowed */
-   char caller[35]; /* caller id, partial string with * + subaddr allowed */
-   char to_nr[35];  /* deflected to number incl. subaddress */
-   u_char si1,si2;  /* service indicators, si1=bitmask, si1+2 0 = all */
-   u_char screen;   /* screening: 0 = no info, 1 = info, 2 = nfo with nr */
-   u_char callopt;  /* option for call handling: 
-                       0 = all calls
-                       1 = only non waiting calls
-                       2 = only waiting calls */
-   u_char action;   /* desired action: 
-                       0 = don't report call -> ignore
-                       1 = report call, do not allow/proceed for deflection
-                       2 = report call, send proceed, wait max waittime secs
-                       3 = report call, alert and deflect after waittime 
-                       4 = report call, reject immediately  
-                       actions 1-2 only take place if interface is opened 
-                   */
-   u_char waittime; /* maximum wait time for proceeding */ 
- } divert_rule;
+{ ulong drvid;     /* driver ids, bit mapped */
+       char my_msn[35]; /* desired msn, subaddr allowed */
+       char caller[35]; /* caller id, partial string with * + subaddr allowed */
+       char to_nr[35];  /* deflected to number incl. subaddress */
+       u_char si1, si2;  /* service indicators, si1=bitmask, si1+2 0 = all */
+       u_char screen;   /* screening: 0 = no info, 1 = info, 2 = nfo with nr */
+       u_char callopt;  /* option for call handling:
+                           0 = all calls
+                           1 = only non waiting calls
+                           2 = only waiting calls */
+       u_char action;   /* desired action:
+                           0 = don't report call -> ignore
+                           1 = report call, do not allow/proceed for deflection
+                           2 = report call, send proceed, wait max waittime secs
+                           3 = report call, alert and deflect after waittime
+                           4 = report call, reject immediately
+                           actions 1-2 only take place if interface is opened
+                        */
+       u_char waittime; /* maximum wait time for proceeding */
+} divert_rule;
 
 typedef union
- { int drv_version; /* return of driver version */
-   struct 
-   { int drvid;                /* id of driver */
-     char drvnam[30];  /* name of driver */
-   } getid;
-   struct
-   { int ruleidx;      /* index of rule */
-     divert_rule rule; /* rule parms */ 
-   } getsetrule;
-   struct
-   { u_char subcmd;  /* 0 = hangup/reject,
-                        1 = alert,
-                        2 = deflect */
-     ulong callid;   /* id of call delivered by ascii output */
-     char to_nr[35]; /* destination when deflect,
-                        else uus1 string (maxlen 31),
-                        data from rule used if empty */ 
-   } fwd_ctrl; 
-   struct
-   { int drvid;      /* id of driver */
-     u_char cfproc;  /* cfu = 0, cfb = 1, cfnr = 2 */
-     ulong procid;   /* process id returned when no error */ 
-     u_char service; /* basically coded service, 0 = all */
-     char msn[25];   /* desired msn, empty = all */
-     char fwd_nr[35];/* forwarded to number + subaddress */
-   } cf_ctrl;  
- } divert_ioctl;
+{ int drv_version; /* return of driver version */
+       struct
+       { int drvid;            /* id of driver */
+               char drvnam[30];        /* name of driver */
+       } getid;
+       struct
+       { int ruleidx;  /* index of rule */
+               divert_rule rule;       /* rule parms */
+       } getsetrule;
+       struct
+       { u_char subcmd;  /* 0 = hangup/reject,
+                            1 = alert,
+                            2 = deflect */
+               ulong callid;   /* id of call delivered by ascii output */
+               char to_nr[35]; /* destination when deflect,
+                                  else uus1 string (maxlen 31),
+                                  data from rule used if empty */
+       } fwd_ctrl;
+       struct
+       { int drvid;      /* id of driver */
+               u_char cfproc;  /* cfu = 0, cfb = 1, cfnr = 2 */
+               ulong procid;   /* process id returned when no error */
+               u_char service; /* basically coded service, 0 = all */
+               char msn[25];   /* desired msn, empty = all */
+               char fwd_nr[35];/* forwarded to number + subaddress */
+       } cf_ctrl;
+} divert_ioctl;
 
 #ifdef __KERNEL__
 
@@ -105,10 +105,10 @@ typedef union
 /* structure keeping ascii info for device output */
 /**************************************************/
 struct divert_info
-  { struct divert_info *next;
-    ulong usage_cnt; /* number of files still to work */   
-    char info_start[2]; /* info string start */ 
-  }; 
+{ struct divert_info *next;
+       ulong usage_cnt; /* number of files still to work */
+       char info_start[2]; /* info string start */
+};
 
 
 /**************/
index fddae72..c90dca5 100644 (file)
@@ -214,7 +214,7 @@ byte_stuff:
                                } else if (fcs != PPP_GOODFCS) {
                                        /* frame check error */
                                        dev_err(cs->dev,
-                               "Checksum failed, %u bytes corrupted!\n",
+                                               "Checksum failed, %u bytes corrupted!\n",
                                                skb->len);
                                        gigaset_isdn_rcv_err(bcs);
                                        dev_kfree_skb_any(skb);
@@ -543,7 +543,7 @@ static struct sk_buff *iraw_encode(struct sk_buff *skb)
        /* size of new buffer (worst case = every byte must be stuffed):
         * 2 * original size + room for link layer header
         */
-       iraw_skb = dev_alloc_skb(2*skb->len + skb->mac_len);
+       iraw_skb = dev_alloc_skb(2 * skb->len + skb->mac_len);
        if (!iraw_skb) {
                dev_kfree_skb_any(skb);
                return NULL;
index 3913f47..afa0802 100644 (file)
@@ -410,10 +410,10 @@ static void check_pending(struct bas_cardstate *ucs)
                if (!(ucs->basstate & BS_RESETTING))
                        ucs->pending = 0;
                break;
-       /*
-        * HD_READ_ATMESSAGE and HD_WRITE_ATMESSAGE are handled separately
-        * and should never end up here
-        */
+               /*
+                * HD_READ_ATMESSAGE and HD_WRITE_ATMESSAGE are handled separately
+                * and should never end up here
+                */
        default:
                dev_warn(&ucs->interface->dev,
                         "unknown pending request 0x%02x cleared\n",
@@ -491,7 +491,7 @@ static void read_ctrl_callback(struct urb *urb)
                numbytes = urb->actual_length;
                if (unlikely(numbytes != ucs->rcvbuf_size)) {
                        dev_warn(cs->dev,
-                              "control read: received %d chars, expected %d\n",
+                                "control read: received %d chars, expected %d\n",
                                 numbytes, ucs->rcvbuf_size);
                        if (numbytes > ucs->rcvbuf_size)
                                numbytes = ucs->rcvbuf_size;
@@ -710,7 +710,7 @@ static void read_int_callback(struct urb *urb)
        }
 
        l = (unsigned) ucs->int_in_buf[1] +
-           (((unsigned) ucs->int_in_buf[2]) << 8);
+               (((unsigned) ucs->int_in_buf[2]) << 8);
 
        gig_dbg(DEBUG_USBREQ, "<-------%d: 0x%02x (%u [0x%02x 0x%02x])",
                urb->actual_length, (int)ucs->int_in_buf[0], l,
@@ -770,14 +770,14 @@ static void read_int_callback(struct urb *urb)
        case HD_RECEIVEATDATA_ACK:      /* AT response ready to be received */
                if (!l) {
                        dev_warn(cs->dev,
-                               "HD_RECEIVEATDATA_ACK with length 0 ignored\n");
+                                "HD_RECEIVEATDATA_ACK with length 0 ignored\n");
                        break;
                }
                spin_lock_irqsave(&cs->lock, flags);
                if (ucs->basstate & BS_ATRDPEND) {
                        spin_unlock_irqrestore(&cs->lock, flags);
                        dev_warn(cs->dev,
-       "HD_RECEIVEATDATA_ACK(%d) during HD_READ_ATMESSAGE(%d) ignored\n",
+                                "HD_RECEIVEATDATA_ACK(%d) during HD_READ_ATMESSAGE(%d) ignored\n",
                                 l, ucs->rcvbuf_size);
                        break;
                }
@@ -878,7 +878,7 @@ static void read_iso_callback(struct urb *urb)
                        ubc->isoinlost += urb->iso_frame_desc[i].actual_length;
                        if (unlikely(urb->iso_frame_desc[i].status != 0 &&
                                     urb->iso_frame_desc[i].status !=
-                                                               -EINPROGRESS))
+                                    -EINPROGRESS))
                                ubc->loststatus = urb->iso_frame_desc[i].status;
                        urb->iso_frame_desc[i].status = 0;
                        urb->iso_frame_desc[i].actual_length = 0;
@@ -891,7 +891,7 @@ static void read_iso_callback(struct urb *urb)
                        rc = usb_submit_urb(urb, GFP_ATOMIC);
                        if (unlikely(rc != 0 && rc != -ENODEV)) {
                                dev_err(bcs->cs->dev,
-                                      "could not resubmit isoc read URB: %s\n",
+                                       "could not resubmit isoc read URB: %s\n",
                                        get_usb_rcmsg(rc));
                                dump_urb(DEBUG_ISO, "isoc read", urb);
                                error_hangup(bcs);
@@ -1017,17 +1017,17 @@ static int starturbs(struct bc_state *bcs)
        }
 
        /* keep one URB free, submit the others */
-       for (k = 0; k < BAS_OUTURBS-1; ++k) {
+       for (k = 0; k < BAS_OUTURBS - 1; ++k) {
                dump_urb(DEBUG_ISO, "Initial isoc write", urb);
                rc = usb_submit_urb(ubc->isoouturbs[k].urb, GFP_ATOMIC);
                if (rc != 0)
                        goto error;
        }
        dump_urb(DEBUG_ISO, "Initial isoc write (free)", urb);
-       ubc->isooutfree = &ubc->isoouturbs[BAS_OUTURBS-1];
+       ubc->isooutfree = &ubc->isoouturbs[BAS_OUTURBS - 1];
        ubc->isooutdone = ubc->isooutovfl = NULL;
        return 0;
- error:
+error:
        stopurbs(ubc);
        return rc;
 }
@@ -1229,7 +1229,7 @@ static void write_iso_tasklet(unsigned long data)
                                if (ifd->status ||
                                    ifd->actual_length != ifd->length) {
                                        dev_warn(cs->dev,
-                                           "isoc write: frame %d[%d/%d]: %s\n",
+                                                "isoc write: frame %d[%d/%d]: %s\n",
                                                 i, ifd->actual_length,
                                                 ifd->length,
                                                 get_usb_statmsg(ifd->status));
@@ -1316,7 +1316,7 @@ static void read_iso_tasklet(unsigned long data)
                ubc->isoindone = NULL;
                if (unlikely(ubc->loststatus != -EINPROGRESS)) {
                        dev_warn(cs->dev,
-               "isoc read overrun, URB dropped (status: %s, %d bytes)\n",
+                                "isoc read overrun, URB dropped (status: %s, %d bytes)\n",
                                 get_usb_statmsg(ubc->loststatus),
                                 ubc->isoinlost);
                        ubc->loststatus = -EINPROGRESS;
@@ -1965,7 +1965,7 @@ static int gigaset_write_cmd(struct cardstate *cs, struct cmdbuf_t *cb)
        int rc;
 
        gigaset_dbg_buffer(cs->mstate != MS_LOCKED ?
-                            DEBUG_TRANSCMD : DEBUG_LOCKCMD,
+                          DEBUG_TRANSCMD : DEBUG_LOCKCMD,
                           "CMD Transmit", cb->len, cb->buf);
 
        /* translate "+++" escape sequence sent as a single separate command
@@ -2453,13 +2453,13 @@ static int gigaset_suspend(struct usb_interface *intf, pm_message_t message)
 
        /* wait a bit for blocking conditions to go away */
        rc = wait_event_timeout(ucs->waitqueue,
-                       !(ucs->basstate &
-                         (BS_B1OPEN|BS_B2OPEN|BS_ATRDPEND|BS_ATWRPEND)),
-                       BAS_TIMEOUT*HZ/10);
+                               !(ucs->basstate &
+                                 (BS_B1OPEN | BS_B2OPEN | BS_ATRDPEND | BS_ATWRPEND)),
+                               BAS_TIMEOUT * HZ / 10);
        gig_dbg(DEBUG_SUSPEND, "wait_event_timeout() -> %d", rc);
 
        /* check for conditions preventing suspend */
-       if (ucs->basstate & (BS_B1OPEN|BS_B2OPEN|BS_ATRDPEND|BS_ATWRPEND)) {
+       if (ucs->basstate & (BS_B1OPEN | BS_B2OPEN | BS_ATRDPEND | BS_ATWRPEND)) {
                dev_warn(cs->dev, "cannot suspend:\n");
                if (ucs->basstate & BS_B1OPEN)
                        dev_warn(cs->dev, " B channel 1 open\n");
@@ -2482,7 +2482,7 @@ static int gigaset_suspend(struct usb_interface *intf, pm_message_t message)
                        return rc;
                }
                wait_event_timeout(ucs->waitqueue, !ucs->pending,
-                                  BAS_TIMEOUT*HZ/10);
+                                  BAS_TIMEOUT * HZ / 10);
                /* in case of timeout, proceed anyway */
        }
 
index 6d5ceee..343b5c8 100644 (file)
 #define CapiFacilitySpecificFunctionNotSupported       0x3011
 
 /* missing from capicmd.h */
-#define CAPI_CONNECT_IND_BASELEN       (CAPI_MSG_BASELEN+4+2+8*1)
-#define CAPI_CONNECT_ACTIVE_IND_BASELEN        (CAPI_MSG_BASELEN+4+3*1)
-#define CAPI_CONNECT_B3_IND_BASELEN    (CAPI_MSG_BASELEN+4+1)
-#define CAPI_CONNECT_B3_ACTIVE_IND_BASELEN     (CAPI_MSG_BASELEN+4+1)
-#define CAPI_DATA_B3_REQ_LEN64         (CAPI_MSG_BASELEN+4+4+2+2+2+8)
-#define CAPI_DATA_B3_CONF_LEN          (CAPI_MSG_BASELEN+4+2+2)
-#define CAPI_DISCONNECT_IND_LEN                (CAPI_MSG_BASELEN+4+2)
-#define CAPI_DISCONNECT_B3_IND_BASELEN (CAPI_MSG_BASELEN+4+2+1)
-#define CAPI_FACILITY_CONF_BASELEN     (CAPI_MSG_BASELEN+4+2+2+1)
+#define CAPI_CONNECT_IND_BASELEN       (CAPI_MSG_BASELEN + 4 + 2 + 8 * 1)
+#define CAPI_CONNECT_ACTIVE_IND_BASELEN        (CAPI_MSG_BASELEN + 4 + 3 * 1)
+#define CAPI_CONNECT_B3_IND_BASELEN    (CAPI_MSG_BASELEN + 4 + 1)
+#define CAPI_CONNECT_B3_ACTIVE_IND_BASELEN     (CAPI_MSG_BASELEN + 4 + 1)
+#define CAPI_DATA_B3_REQ_LEN64         (CAPI_MSG_BASELEN + 4 + 4 + 2 + 2 + 2 + 8)
+#define CAPI_DATA_B3_CONF_LEN          (CAPI_MSG_BASELEN + 4 + 2 + 2)
+#define CAPI_DISCONNECT_IND_LEN                (CAPI_MSG_BASELEN + 4 + 2)
+#define CAPI_DISCONNECT_B3_IND_BASELEN (CAPI_MSG_BASELEN + 4 + 2 + 1)
+#define CAPI_FACILITY_CONF_BASELEN     (CAPI_MSG_BASELEN + 4 + 2 + 2 + 1)
 /* most _CONF messages contain only Controller/PLCI/NCCI and Info parameters */
-#define CAPI_STDCONF_LEN               (CAPI_MSG_BASELEN+4+2)
+#define CAPI_STDCONF_LEN               (CAPI_MSG_BASELEN + 4 + 2)
 
 #define CAPI_FACILITY_HANDSET  0x0000
 #define CAPI_FACILITY_DTMF     0x0001
@@ -97,10 +97,10 @@ struct gigaset_capi_ctr {
        /* two _cmsg structures possibly used concurrently: */
        _cmsg hcmsg;    /* for message composition triggered from hardware */
        _cmsg acmsg;    /* for dissection of messages sent from application */
-       u8 bc_buf[MAX_BC_OCTETS+1];
-       u8 hlc_buf[MAX_HLC_OCTETS+1];
-       u8 cgpty_buf[MAX_NUMBER_DIGITS+3];
-       u8 cdpty_buf[MAX_NUMBER_DIGITS+2];
+       u8 bc_buf[MAX_BC_OCTETS + 1];
+       u8 hlc_buf[MAX_HLC_OCTETS + 1];
+       u8 cgpty_buf[MAX_NUMBER_DIGITS + 3];
+       u8 cdpty_buf[MAX_NUMBER_DIGITS + 2];
 };
 
 /* CIP Value table (from CAPI 2.0 standard, ch. 6.1) */
@@ -109,50 +109,50 @@ static struct {
        u8 *hlc;
 } cip2bchlc[] = {
        [1] = { "8090A3", NULL },
-               /* Speech (A-law) */
+       /* Speech (A-law) */
        [2] = { "8890", NULL },
-               /* Unrestricted digital information */
+       /* Unrestricted digital information */
        [3] = { "8990", NULL },
-               /* Restricted digital information */
+       /* Restricted digital information */
        [4] = { "9090A3", NULL },
-               /* 3,1 kHz audio (A-law) */
+       /* 3,1 kHz audio (A-law) */
        [5] = { "9190", NULL },
-               /* 7 kHz audio */
+       /* 7 kHz audio */
        [6] = { "9890", NULL },
-               /* Video */
+       /* Video */
        [7] = { "88C0C6E6", NULL },
-               /* Packet mode */
+       /* Packet mode */
        [8] = { "8890218F", NULL },
-               /* 56 kbit/s rate adaptation */
+       /* 56 kbit/s rate adaptation */
        [9] = { "9190A5", NULL },
-               /* Unrestricted digital information with tones/announcements */
+       /* Unrestricted digital information with tones/announcements */
        [16] = { "8090A3", "9181" },
-               /* Telephony */
+       /* Telephony */
        [17] = { "9090A3", "9184" },
-               /* Group 2/3 facsimile */
+       /* Group 2/3 facsimile */
        [18] = { "8890", "91A1" },
-               /* Group 4 facsimile Class 1 */
+       /* Group 4 facsimile Class 1 */
        [19] = { "8890", "91A4" },
-               /* Teletex service basic and mixed mode
-                  and Group 4 facsimile service Classes II and III */
+       /* Teletex service basic and mixed mode
+          and Group 4 facsimile service Classes II and III */
        [20] = { "8890", "91A8" },
-               /* Teletex service basic and processable mode */
+       /* Teletex service basic and processable mode */
        [21] = { "8890", "91B1" },
-               /* Teletex service basic mode */
+       /* Teletex service basic mode */
        [22] = { "8890", "91B2" },
-               /* International interworking for Videotex */
+       /* International interworking for Videotex */
        [23] = { "8890", "91B5" },
-               /* Telex */
+       /* Telex */
        [24] = { "8890", "91B8" },
-               /* Message Handling Systems in accordance with X.400 */
+       /* Message Handling Systems in accordance with X.400 */
        [25] = { "8890", "91C1" },
-               /* OSI application in accordance with X.200 */
+       /* OSI application in accordance with X.200 */
        [26] = { "9190A5", "9181" },
-               /* 7 kHz telephony */
+       /* 7 kHz telephony */
        [27] = { "9190A5", "916001" },
-               /* Video telephony, first connection */
+       /* Video telephony, first connection */
        [28] = { "8890", "916002" },
-               /* Video telephony, second connection */
+       /* Video telephony, second connection */
 };
 
 /*
@@ -164,7 +164,7 @@ static struct {
  * emit unsupported parameter warning
  */
 static inline void ignore_cstruct_param(struct cardstate *cs, _cstruct param,
-                                      char *msgname, char *paramname)
+                                       char *msgname, char *paramname)
 {
        if (param && *param)
                dev_warn(cs->dev, "%s: ignoring unsupported parameter: %s\n",
@@ -259,15 +259,15 @@ static inline void dump_rawmsg(enum debuglevel level, const char *tag,
                CAPIMSG_APPID(data), CAPIMSG_MSGID(data), l,
                CAPIMSG_CONTROL(data));
        l -= 12;
-       dbgline = kmalloc(3*l, GFP_ATOMIC);
+       dbgline = kmalloc(3 * l, GFP_ATOMIC);
        if (!dbgline)
                return;
        for (i = 0; i < l; i++) {
-               dbgline[3*i] = hex_asc_hi(data[12+i]);
-               dbgline[3*i+1] = hex_asc_lo(data[12+i]);
-               dbgline[3*i+2] = ' ';
+               dbgline[3 * i] = hex_asc_hi(data[12 + i]);
+               dbgline[3 * i + 1] = hex_asc_lo(data[12 + i]);
+               dbgline[3 * i + 2] = ' ';
        }
-       dbgline[3*l-1] = '\0';
+       dbgline[3 * l - 1] = '\0';
        gig_dbg(level, "  %s", dbgline);
        kfree(dbgline);
        if (CAPIMSG_COMMAND(data) == CAPI_DATA_B3 &&
@@ -279,16 +279,16 @@ static inline void dump_rawmsg(enum debuglevel level, const char *tag,
                        return;
                if (l > 64)
                        l = 64; /* arbitrary limit */
-               dbgline = kmalloc(3*l, GFP_ATOMIC);
+               dbgline = kmalloc(3 * l, GFP_ATOMIC);
                if (!dbgline)
                        return;
                data += CAPIMSG_LEN(data);
                for (i = 0; i < l; i++) {
-                       dbgline[3*i] = hex_asc_hi(data[i]);
-                       dbgline[3*i+1] = hex_asc_lo(data[i]);
-                       dbgline[3*i+2] = ' ';
+                       dbgline[3 * i] = hex_asc_hi(data[i]);
+                       dbgline[3 * i + 1] = hex_asc_lo(data[i]);
+                       dbgline[3 * i + 2] = ' ';
                }
-               dbgline[3*l-1] = '\0';
+               dbgline[3 * l - 1] = '\0';
                gig_dbg(level, "  %s", dbgline);
                kfree(dbgline);
        }
@@ -301,7 +301,7 @@ static inline void dump_rawmsg(enum debuglevel level, const char *tag,
 
 static const char *format_ie(const char *ie)
 {
-       static char result[3*MAX_FMT_IE_LEN];
+       static char result[3 * MAX_FMT_IE_LEN];
        int len, count;
        char *pout = result;
 
@@ -310,7 +310,7 @@ static const char *format_ie(const char *ie)
 
        count = len = ie[0];
        if (count > MAX_FMT_IE_LEN)
-               count = MAX_FMT_IE_LEN-1;
+               count = MAX_FMT_IE_LEN - 1;
        while (count--) {
                *pout++ = hex_asc_hi(*++ie);
                *pout++ = hex_asc_lo(*ie);
@@ -403,8 +403,8 @@ void gigaset_skb_sent(struct bc_state *bcs, struct sk_buff *dskb)
                send_data_b3_conf(cs, &iif->ctr, ap->id, CAPIMSG_MSGID(req),
                                  bcs->channel + 1, CAPIMSG_HANDLE_REQ(req),
                                  (flags & ~CAPI_FLAGS_DELIVERY_CONFIRMATION) ?
-                                       CapiFlagsNotSupportedByProtocol :
-                                       CAPI_NOERROR);
+                                 CapiFlagsNotSupportedByProtocol :
+                                 CAPI_NOERROR);
 }
 EXPORT_SYMBOL_GPL(gigaset_skb_sent);
 
@@ -589,7 +589,7 @@ int gigaset_isdn_icall(struct at_state_t *at_state)
                }
                iif->cdpty_buf[0] = i + 1;
                iif->cdpty_buf[1] = 0x80; /* type / numbering plan unknown */
-               memcpy(iif->cdpty_buf+2, at_state->str_var[STR_ZCPN], i);
+               memcpy(iif->cdpty_buf + 2, at_state->str_var[STR_ZCPN], i);
                iif->hcmsg.CalledPartyNumber = iif->cdpty_buf;
                msgsize += iif->hcmsg.CalledPartyNumber[0];
        }
@@ -605,7 +605,7 @@ int gigaset_isdn_icall(struct at_state_t *at_state)
                iif->cgpty_buf[0] = i + 2;
                iif->cgpty_buf[1] = 0x00; /* type / numbering plan unknown */
                iif->cgpty_buf[2] = 0x80; /* pres. allowed, not screened */
-               memcpy(iif->cgpty_buf+3, at_state->str_var[STR_NMBR], i);
+               memcpy(iif->cgpty_buf + 3, at_state->str_var[STR_NMBR], i);
                iif->hcmsg.CallingPartyNumber = iif->cgpty_buf;
                msgsize += iif->hcmsg.CallingPartyNumber[0];
        }
@@ -977,7 +977,7 @@ void gigaset_isdn_stop(struct cardstate *cs)
  * register CAPI application
  */
 static void gigaset_register_appl(struct capi_ctr *ctr, u16 appl,
-                          capi_register_params *rp)
+                                 capi_register_params *rp)
 {
        struct gigaset_capi_ctr *iif
                = container_of(ctr, struct gigaset_capi_ctr, ctr);
@@ -1181,21 +1181,21 @@ static void do_facility_req(struct gigaset_capi_ctr *iif,
                        }
                        if (CAPIMSG_U32(pparam, 4) != 0) {
                                dev_notice(cs->dev,
-       "%s: unsupported supplementary service notification mask 0x%x\n",
-                                  "FACILITY_REQ", CAPIMSG_U32(pparam, 4));
+                                          "%s: unsupported supplementary service notification mask 0x%x\n",
+                                          "FACILITY_REQ", CAPIMSG_U32(pparam, 4));
                                info = CapiFacilitySpecificFunctionNotSupported;
                                confparam[3] = 2;       /* length */
                                capimsg_setu16(confparam, 4,
-                                       CapiSupplementaryServiceNotSupported);
+                                              CapiSupplementaryServiceNotSupported);
                        }
                        info = CapiSuccess;
                        confparam[3] = 2;       /* length */
                        capimsg_setu16(confparam, 4, CapiSuccess);
                        break;
-               /* ToDo: add supported services */
+                       /* ToDo: add supported services */
                default:
                        dev_notice(cs->dev,
-               "%s: unsupported supplementary service function 0x%04x\n",
+                                  "%s: unsupported supplementary service function 0x%04x\n",
                                   "FACILITY_REQ", function);
                        info = CapiFacilitySpecificFunctionNotSupported;
                        /* Supplementary Service specific parameter */
@@ -1318,7 +1318,7 @@ static void do_connect_req(struct gigaset_capi_ctr *iif,
        cmsg->adr.adrPLCI |= (bcs->channel + 1) << 8;
 
        /* build command table */
-       commands = kzalloc(AT_NUM*(sizeof *commands), GFP_KERNEL);
+       commands = kzalloc(AT_NUM * (sizeof *commands), GFP_KERNEL);
        if (!commands)
                goto oom;
 
@@ -1353,10 +1353,10 @@ static void do_connect_req(struct gigaset_capi_ctr *iif,
        commands[AT_TYPE] = kstrdup(s, GFP_KERNEL);
        if (!commands[AT_TYPE])
                goto oom;
-       commands[AT_DIAL] = kmalloc(l+3, GFP_KERNEL);
+       commands[AT_DIAL] = kmalloc(l + 3, GFP_KERNEL);
        if (!commands[AT_DIAL])
                goto oom;
-       snprintf(commands[AT_DIAL], l+3, "D%.*s\r", l, pp);
+       snprintf(commands[AT_DIAL], l + 3, "D%.*s\r", l, pp);
 
        /* encode parameter: Calling party number */
        pp = cmsg->CallingPartyNumber;
@@ -1406,10 +1406,10 @@ static void do_connect_req(struct gigaset_capi_ctr *iif,
 
                if (l) {
                        /* number */
-                       commands[AT_MSN] = kmalloc(l+8, GFP_KERNEL);
+                       commands[AT_MSN] = kmalloc(l + 8, GFP_KERNEL);
                        if (!commands[AT_MSN])
                                goto oom;
-                       snprintf(commands[AT_MSN], l+8, "^SMSN=%*s\r", l, pp);
+                       snprintf(commands[AT_MSN], l + 8, "^SMSN=%*s\r", l, pp);
                }
        }
 
@@ -1430,13 +1430,13 @@ static void do_connect_req(struct gigaset_capi_ctr *iif,
 
        /* determine lengths */
        if (cmsg->BC && cmsg->BC[0])            /* BC specified explicitly */
-               lbc = 2*cmsg->BC[0];
+               lbc = 2 * cmsg->BC[0];
        else if (cip2bchlc[cmsg->CIPValue].bc)  /* BC derived from CIP */
                lbc = strlen(cip2bchlc[cmsg->CIPValue].bc);
        else                                    /* no BC */
                lbc = 0;
        if (cmsg->HLC && cmsg->HLC[0])          /* HLC specified explicitly */
-               lhlc = 2*cmsg->HLC[0];
+               lhlc = 2 * cmsg->HLC[0];
        else if (cip2bchlc[cmsg->CIPValue].hlc) /* HLC derived from CIP */
                lhlc = strlen(cip2bchlc[cmsg->CIPValue].hlc);
        else                                    /* no HLC */
@@ -1481,7 +1481,7 @@ static void do_connect_req(struct gigaset_capi_ctr *iif,
        if (cmsg->BProtocol == CAPI_DEFAULT) {
                bcs->proto2 = L2_HDLC;
                dev_warn(cs->dev,
-                   "B2 Protocol X.75 SLP unsupported, using Transparent\n");
+                        "B2 Protocol X.75 SLP unsupported, using Transparent\n");
        } else {
                switch (cmsg->B1protocol) {
                case 0:
@@ -1492,24 +1492,24 @@ static void do_connect_req(struct gigaset_capi_ctr *iif,
                        break;
                default:
                        dev_warn(cs->dev,
-                           "B1 Protocol %u unsupported, using Transparent\n",
+                                "B1 Protocol %u unsupported, using Transparent\n",
                                 cmsg->B1protocol);
                        bcs->proto2 = L2_VOICE;
                }
                if (cmsg->B2protocol != 1)
                        dev_warn(cs->dev,
-                           "B2 Protocol %u unsupported, using Transparent\n",
+                                "B2 Protocol %u unsupported, using Transparent\n",
                                 cmsg->B2protocol);
                if (cmsg->B3protocol != 0)
                        dev_warn(cs->dev,
-                           "B3 Protocol %u unsupported, using Transparent\n",
+                                "B3 Protocol %u unsupported, using Transparent\n",
                                 cmsg->B3protocol);
                ignore_cstruct_param(cs, cmsg->B1configuration,
-                                       "CONNECT_REQ", "B1 Configuration");
+                                    "CONNECT_REQ", "B1 Configuration");
                ignore_cstruct_param(cs, cmsg->B2configuration,
-                                       "CONNECT_REQ", "B2 Configuration");
+                                    "CONNECT_REQ", "B2 Configuration");
                ignore_cstruct_param(cs, cmsg->B3configuration,
-                                       "CONNECT_REQ", "B3 Configuration");
+                                    "CONNECT_REQ", "B3 Configuration");
        }
        commands[AT_PROTO] = kmalloc(9, GFP_KERNEL);
        if (!commands[AT_PROTO])
@@ -1518,20 +1518,20 @@ static void do_connect_req(struct gigaset_capi_ctr *iif,
 
        /* ToDo: check/encode remaining parameters */
        ignore_cstruct_param(cs, cmsg->CalledPartySubaddress,
-                                       "CONNECT_REQ", "Called pty subaddr");
+                            "CONNECT_REQ", "Called pty subaddr");
        ignore_cstruct_param(cs, cmsg->CallingPartySubaddress,
-                                       "CONNECT_REQ", "Calling pty subaddr");
+                            "CONNECT_REQ", "Calling pty subaddr");
        ignore_cstruct_param(cs, cmsg->LLC,
-                                       "CONNECT_REQ", "LLC");
+                            "CONNECT_REQ", "LLC");
        if (cmsg->AdditionalInfo != CAPI_DEFAULT) {
                ignore_cstruct_param(cs, cmsg->BChannelinformation,
-                                       "CONNECT_REQ", "B Channel Information");
+                                    "CONNECT_REQ", "B Channel Information");
                ignore_cstruct_param(cs, cmsg->Keypadfacility,
-                                       "CONNECT_REQ", "Keypad Facility");
+                                    "CONNECT_REQ", "Keypad Facility");
                ignore_cstruct_param(cs, cmsg->Useruserdata,
-                                       "CONNECT_REQ", "User-User Data");
+                                    "CONNECT_REQ", "User-User Data");
                ignore_cstruct_param(cs, cmsg->Facilitydataarray,
-                                       "CONNECT_REQ", "Facility Data Array");
+                                    "CONNECT_REQ", "Facility Data Array");
        }
 
        /* encode parameter: B channel to use */
@@ -1602,7 +1602,7 @@ static void do_connect_resp(struct gigaset_capi_ctr *iif,
                        if (oap != ap) {
                                spin_unlock_irqrestore(&bcs->aplock, flags);
                                send_disconnect_ind(bcs, oap,
-                                       CapiCallGivenToOtherApplication);
+                                                   CapiCallGivenToOtherApplication);
                                spin_lock_irqsave(&bcs->aplock, flags);
                        }
                }
@@ -1619,7 +1619,7 @@ static void do_connect_resp(struct gigaset_capi_ctr *iif,
                if (cmsg->BProtocol == CAPI_DEFAULT) {
                        bcs->proto2 = L2_HDLC;
                        dev_warn(cs->dev,
-               "B2 Protocol X.75 SLP unsupported, using Transparent\n");
+                                "B2 Protocol X.75 SLP unsupported, using Transparent\n");
                } else {
                        switch (cmsg->B1protocol) {
                        case 0:
@@ -1630,46 +1630,46 @@ static void do_connect_resp(struct gigaset_capi_ctr *iif,
                                break;
                        default:
                                dev_warn(cs->dev,
-                       "B1 Protocol %u unsupported, using Transparent\n",
+                                        "B1 Protocol %u unsupported, using Transparent\n",
                                         cmsg->B1protocol);
                                bcs->proto2 = L2_VOICE;
                        }
                        if (cmsg->B2protocol != 1)
                                dev_warn(cs->dev,
-                       "B2 Protocol %u unsupported, using Transparent\n",
+                                        "B2 Protocol %u unsupported, using Transparent\n",
                                         cmsg->B2protocol);
                        if (cmsg->B3protocol != 0)
                                dev_warn(cs->dev,
-                       "B3 Protocol %u unsupported, using Transparent\n",
+                                        "B3 Protocol %u unsupported, using Transparent\n",
                                         cmsg->B3protocol);
                        ignore_cstruct_param(cs, cmsg->B1configuration,
-                                       "CONNECT_RESP", "B1 Configuration");
+                                            "CONNECT_RESP", "B1 Configuration");
                        ignore_cstruct_param(cs, cmsg->B2configuration,
-                                       "CONNECT_RESP", "B2 Configuration");
+                                            "CONNECT_RESP", "B2 Configuration");
                        ignore_cstruct_param(cs, cmsg->B3configuration,
-                                       "CONNECT_RESP", "B3 Configuration");
+                                            "CONNECT_RESP", "B3 Configuration");
                }
 
                /* ToDo: check/encode remaining parameters */
                ignore_cstruct_param(cs, cmsg->ConnectedNumber,
-                                       "CONNECT_RESP", "Connected Number");
+                                    "CONNECT_RESP", "Connected Number");
                ignore_cstruct_param(cs, cmsg->ConnectedSubaddress,
-                                       "CONNECT_RESP", "Connected Subaddress");
+                                    "CONNECT_RESP", "Connected Subaddress");
                ignore_cstruct_param(cs, cmsg->LLC,
-                                       "CONNECT_RESP", "LLC");
+                                    "CONNECT_RESP", "LLC");
                if (cmsg->AdditionalInfo != CAPI_DEFAULT) {
                        ignore_cstruct_param(cs, cmsg->BChannelinformation,
-                                       "CONNECT_RESP", "BChannel Information");
+                                            "CONNECT_RESP", "BChannel Information");
                        ignore_cstruct_param(cs, cmsg->Keypadfacility,
-                                       "CONNECT_RESP", "Keypad Facility");
+                                            "CONNECT_RESP", "Keypad Facility");
                        ignore_cstruct_param(cs, cmsg->Useruserdata,
-                                       "CONNECT_RESP", "User-User Data");
+                                            "CONNECT_RESP", "User-User Data");
                        ignore_cstruct_param(cs, cmsg->Facilitydataarray,
-                                       "CONNECT_RESP", "Facility Data Array");
+                                            "CONNECT_RESP", "Facility Data Array");
                }
 
                /* Accept call */
-               if (!gigaset_add_event(cs, &cs->bcs[channel-1].at_state,
+               if (!gigaset_add_event(cs, &cs->bcs[channel - 1].at_state,
                                       EV_ACCEPT, NULL, 0, NULL))
                        return;
                gigaset_schedule_event(cs);
@@ -1712,7 +1712,7 @@ static void do_connect_resp(struct gigaset_capi_ctr *iif,
                        if (oap != ap) {
                                spin_unlock_irqrestore(&bcs->aplock, flags);
                                send_disconnect_ind(bcs, oap,
-                                       CapiCallGivenToOtherApplication);
+                                                   CapiCallGivenToOtherApplication);
                                spin_lock_irqsave(&bcs->aplock, flags);
                        }
                }
@@ -1723,7 +1723,7 @@ static void do_connect_resp(struct gigaset_capi_ctr *iif,
                /* reject call - will trigger DISCONNECT_IND for this app */
                dev_info(cs->dev, "%s: Reject=%x\n",
                         "CONNECT_RESP", cmsg->Reject);
-               if (!gigaset_add_event(cs, &cs->bcs[channel-1].at_state,
+               if (!gigaset_add_event(cs, &cs->bcs[channel - 1].at_state,
                                       EV_HUP, NULL, 0, NULL))
                        return;
                gigaset_schedule_event(cs);
@@ -1756,7 +1756,7 @@ static void do_connect_b3_req(struct gigaset_capi_ctr *iif,
                send_conf(iif, ap, skb, CapiIllContrPlciNcci);
                return;
        }
-       bcs = &cs->bcs[channel-1];
+       bcs = &cs->bcs[channel - 1];
 
        /* mark logical connection active */
        bcs->apconnstate = APCONN_ACTIVE;
@@ -1767,7 +1767,7 @@ static void do_connect_b3_req(struct gigaset_capi_ctr *iif,
        /* NCPI parameter: not applicable for B3 Transparent */
        ignore_cstruct_param(cs, cmsg->NCPI, "CONNECT_B3_REQ", "NCPI");
        send_conf(iif, ap, skb, (cmsg->NCPI && cmsg->NCPI[0]) ?
-                               CapiNcpiNotSupportedByProtocol : CapiSuccess);
+                 CapiNcpiNotSupportedByProtocol : CapiSuccess);
 }
 
 /*
@@ -1801,7 +1801,7 @@ static void do_connect_b3_resp(struct gigaset_capi_ctr *iif,
                dev_kfree_skb_any(skb);
                return;
        }
-       bcs = &cs->bcs[channel-1];
+       bcs = &cs->bcs[channel - 1];
 
        if (cmsg->Reject) {
                /* Reject: clear B3 connect received flag */
@@ -1905,7 +1905,7 @@ static void do_disconnect_req(struct gigaset_capi_ctr *iif,
                        return;
                }
                capi_cmsg2message(b3cmsg,
-                       __skb_put(b3skb, CAPI_DISCONNECT_B3_IND_BASELEN));
+                                 __skb_put(b3skb, CAPI_DISCONNECT_B3_IND_BASELEN));
                kfree(b3cmsg);
                capi_ctr_handle_message(&iif->ctr, ap->id, b3skb);
        }
@@ -1947,7 +1947,7 @@ static void do_disconnect_b3_req(struct gigaset_capi_ctr *iif,
                send_conf(iif, ap, skb, CapiIllContrPlciNcci);
                return;
        }
-       bcs = &cs->bcs[channel-1];
+       bcs = &cs->bcs[channel - 1];
 
        /* reject if logical connection not active */
        if (bcs->apconnstate < APCONN_ACTIVE) {
@@ -1965,9 +1965,9 @@ static void do_disconnect_b3_req(struct gigaset_capi_ctr *iif,
 
        /* NCPI parameter: not applicable for B3 Transparent */
        ignore_cstruct_param(cs, cmsg->NCPI,
-                               "DISCONNECT_B3_REQ", "NCPI");
+                            "DISCONNECT_B3_REQ", "NCPI");
        send_conf(iif, ap, skb, (cmsg->NCPI && cmsg->NCPI[0]) ?
-                               CapiNcpiNotSupportedByProtocol : CapiSuccess);
+                 CapiNcpiNotSupportedByProtocol : CapiSuccess);
 }
 
 /*
@@ -1997,7 +1997,7 @@ static void do_data_b3_req(struct gigaset_capi_ctr *iif,
                send_conf(iif, ap, skb, CapiIllContrPlciNcci);
                return;
        }
-       bcs = &cs->bcs[channel-1];
+       bcs = &cs->bcs[channel - 1];
        if (msglen != CAPI_DATA_B3_REQ_LEN && msglen != CAPI_DATA_B3_REQ_LEN64)
                dev_notice(cs->dev, "%s: unexpected length %d\n",
                           "DATA_B3_REQ", msglen);
@@ -2040,7 +2040,7 @@ static void do_data_b3_req(struct gigaset_capi_ctr *iif,
        if (!(flags & CAPI_FLAGS_DELIVERY_CONFIRMATION))
                send_data_b3_conf(cs, &iif->ctr, ap->id, msgid, channel, handle,
                                  flags ? CapiFlagsNotSupportedByProtocol
-                                       : CAPI_NOERROR);
+                                 : CAPI_NOERROR);
 }
 
 /*
@@ -2258,11 +2258,11 @@ static int gigaset_proc_show(struct seq_file *m, void *v)
 
        seq_printf(m, "%-16s %s\n", "name", ctr->name);
        seq_printf(m, "%-16s %s %s\n", "dev",
-                       dev_driver_string(cs->dev), dev_name(cs->dev));
+                  dev_driver_string(cs->dev), dev_name(cs->dev));
        seq_printf(m, "%-16s %d\n", "id", cs->myid);
        if (cs->gotfwver)
                seq_printf(m, "%-16s %d.%d.%d.%d\n", "firmware",
-                       cs->fwver[0], cs->fwver[1], cs->fwver[2], cs->fwver[3]);
+                          cs->fwver[0], cs->fwver[1], cs->fwver[2], cs->fwver[3]);
        seq_printf(m, "%-16s %d\n", "channels", cs->channels);
        seq_printf(m, "%-16s %s\n", "onechannel", cs->onechannel ? "yes" : "no");
 
@@ -2315,13 +2315,13 @@ static int gigaset_proc_show(struct seq_file *m, void *v)
 
        for (i = 0; i < cs->channels; i++) {
                seq_printf(m, "[%d]%-13s %d\n", i, "corrupted",
-                               cs->bcs[i].corrupted);
+                          cs->bcs[i].corrupted);
                seq_printf(m, "[%d]%-13s %d\n", i, "trans_down",
-                               cs->bcs[i].trans_down);
+                          cs->bcs[i].trans_down);
                seq_printf(m, "[%d]%-13s %d\n", i, "trans_up",
-                               cs->bcs[i].trans_up);
+                          cs->bcs[i].trans_up);
                seq_printf(m, "[%d]%-13s %d\n", i, "chstate",
-                               cs->bcs[i].chstate);
+                          cs->bcs[i].chstate);
                switch (cs->bcs[i].proto2) {
                case L2_BITSYNC:
                        s = "bitsync";
index db621db..e55aabf 100644 (file)
@@ -30,7 +30,7 @@
 /* Module parameters */
 int gigaset_debuglevel;
 EXPORT_SYMBOL_GPL(gigaset_debuglevel);
-module_param_named(debug, gigaset_debuglevel, int, S_IRUGO|S_IWUSR);
+module_param_named(debug, gigaset_debuglevel, int, S_IRUGO | S_IWUSR);
 MODULE_PARM_DESC(debug, "debug level");
 
 /* driver state flags */
@@ -123,7 +123,7 @@ int gigaset_enterconfigmode(struct cardstate *cs)
                if (r < 0)
                        goto error;
        }
-       r = setflags(cs, TIOCM_RTS|TIOCM_DTR, 800);
+       r = setflags(cs, TIOCM_RTS | TIOCM_DTR, 800);
        if (r < 0)
                goto error;
 
@@ -131,8 +131,8 @@ int gigaset_enterconfigmode(struct cardstate *cs)
 
 error:
        dev_err(cs->dev, "error %d on setuartbits\n", -r);
-       cs->control_state = TIOCM_RTS|TIOCM_DTR;
-       cs->ops->set_modem_ctrl(cs, 0, TIOCM_RTS|TIOCM_DTR);
+       cs->control_state = TIOCM_RTS | TIOCM_DTR;
+       cs->ops->set_modem_ctrl(cs, 0, TIOCM_RTS | TIOCM_DTR);
 
        return -1;
 }
@@ -591,7 +591,7 @@ int gigaset_fill_inbuf(struct inbuf_t *inbuf, const unsigned char *src,
                if (head > tail)
                        n = head - 1 - tail;
                else if (head == 0)
-                       n = (RBUFSIZE-1) - tail;
+                       n = (RBUFSIZE - 1) - tail;
                else
                        n = RBUFSIZE - tail;
                if (!n) {
@@ -911,10 +911,10 @@ int gigaset_start(struct cardstate *cs)
        spin_unlock_irqrestore(&cs->lock, flags);
 
        if (cs->mstate != MS_LOCKED) {
-               cs->ops->set_modem_ctrl(cs, 0, TIOCM_DTR|TIOCM_RTS);
+               cs->ops->set_modem_ctrl(cs, 0, TIOCM_DTR | TIOCM_RTS);
                cs->ops->baud_rate(cs, B115200);
                cs->ops->set_line_ctrl(cs, CS8);
-               cs->control_state = TIOCM_DTR|TIOCM_RTS;
+               cs->control_state = TIOCM_DTR | TIOCM_RTS;
        }
 
        cs->waiting = 1;
index 6d12623..624a825 100644 (file)
@@ -153,104 +153,104 @@ struct reply_t gigaset_tab_nocid[] =
  * action, command */
 
 /* initialize device, set cid mode if possible */
-{RSP_INIT,      -1,  -1, SEQ_INIT,             100,  1, {ACT_TIMEOUT} },
+       {RSP_INIT,       -1,  -1, SEQ_INIT,             100,  1, {ACT_TIMEOUT} },
 
-{EV_TIMEOUT,   100, 100, -1,                   101,  3, {0},   "Z\r"},
-{RSP_OK,       101, 103, -1,                   120,  5, {ACT_GETSTRING},
-                                                               "+GMR\r"},
+       {EV_TIMEOUT,    100, 100, -1,                   101,  3, {0},   "Z\r"},
+       {RSP_OK,        101, 103, -1,                   120,  5, {ACT_GETSTRING},
+        "+GMR\r"},
 
-{EV_TIMEOUT,   101, 101, -1,                   102,  5, {0},   "Z\r"},
-{RSP_ERROR,    101, 101, -1,                   102,  5, {0},   "Z\r"},
+       {EV_TIMEOUT,    101, 101, -1,                   102,  5, {0},   "Z\r"},
+       {RSP_ERROR,     101, 101, -1,                   102,  5, {0},   "Z\r"},
 
-{EV_TIMEOUT,   102, 102, -1,                   108,  5, {ACT_SETDLE1},
-                                                               "^SDLE=0\r"},
-{RSP_OK,       108, 108, -1,                   104, -1},
-{RSP_ZDLE,     104, 104,  0,                   103,  5, {0},   "Z\r"},
-{EV_TIMEOUT,   104, 104, -1,                     0,  0, {ACT_FAILINIT} },
-{RSP_ERROR,    108, 108, -1,                     0,  0, {ACT_FAILINIT} },
+       {EV_TIMEOUT,    102, 102, -1,                   108,  5, {ACT_SETDLE1},
+        "^SDLE=0\r"},
+       {RSP_OK,        108, 108, -1,                   104, -1},
+       {RSP_ZDLE,      104, 104,  0,                   103,  5, {0},   "Z\r"},
+       {EV_TIMEOUT,    104, 104, -1,                     0,  0, {ACT_FAILINIT} },
+       {RSP_ERROR,     108, 108, -1,                     0,  0, {ACT_FAILINIT} },
 
-{EV_TIMEOUT,   108, 108, -1,                   105,  2, {ACT_SETDLE0,
-                                                         ACT_HUPMODEM,
-                                                         ACT_TIMEOUT} },
-{EV_TIMEOUT,   105, 105, -1,                   103,  5, {0},   "Z\r"},
+       {EV_TIMEOUT,    108, 108, -1,                   105,  2, {ACT_SETDLE0,
+                                                                 ACT_HUPMODEM,
+                                                                 ACT_TIMEOUT} },
+       {EV_TIMEOUT,    105, 105, -1,                   103,  5, {0},   "Z\r"},
 
-{RSP_ERROR,    102, 102, -1,                   107,  5, {0},   "^GETPRE\r"},
-{RSP_OK,       107, 107, -1,                     0,  0, {ACT_CONFIGMODE} },
-{RSP_ERROR,    107, 107, -1,                     0,  0, {ACT_FAILINIT} },
-{EV_TIMEOUT,   107, 107, -1,                     0,  0, {ACT_FAILINIT} },
+       {RSP_ERROR,     102, 102, -1,                   107,  5, {0},   "^GETPRE\r"},
+       {RSP_OK,        107, 107, -1,                     0,  0, {ACT_CONFIGMODE} },
+       {RSP_ERROR,     107, 107, -1,                     0,  0, {ACT_FAILINIT} },
+       {EV_TIMEOUT,    107, 107, -1,                     0,  0, {ACT_FAILINIT} },
 
-{RSP_ERROR,    103, 103, -1,                     0,  0, {ACT_FAILINIT} },
-{EV_TIMEOUT,   103, 103, -1,                     0,  0, {ACT_FAILINIT} },
+       {RSP_ERROR,     103, 103, -1,                     0,  0, {ACT_FAILINIT} },
+       {EV_TIMEOUT,    103, 103, -1,                     0,  0, {ACT_FAILINIT} },
 
-{RSP_STRING,   120, 120, -1,                   121, -1, {ACT_SETVER} },
+       {RSP_STRING,    120, 120, -1,                   121, -1, {ACT_SETVER} },
 
-{EV_TIMEOUT,   120, 121, -1,                     0,  0, {ACT_FAILVER,
-                                                         ACT_INIT} },
-{RSP_ERROR,    120, 121, -1,                     0,  0, {ACT_FAILVER,
-                                                         ACT_INIT} },
-{RSP_OK,       121, 121, -1,                     0,  0, {ACT_GOTVER,
-                                                         ACT_INIT} },
+       {EV_TIMEOUT,    120, 121, -1,                     0,  0, {ACT_FAILVER,
+                                                                 ACT_INIT} },
+       {RSP_ERROR,     120, 121, -1,                     0,  0, {ACT_FAILVER,
+                                                                 ACT_INIT} },
+       {RSP_OK,        121, 121, -1,                     0,  0, {ACT_GOTVER,
+                                                                 ACT_INIT} },
 
 /* leave dle mode */
-{RSP_INIT,       0,   0, SEQ_DLE0,             201,  5, {0},   "^SDLE=0\r"},
-{RSP_OK,       201, 201, -1,                   202, -1},
-{RSP_ZDLE,     202, 202,  0,                     0,  0, {ACT_DLE0} },
-{RSP_NODEV,    200, 249, -1,                     0,  0, {ACT_FAKEDLE0} },
-{RSP_ERROR,    200, 249, -1,                     0,  0, {ACT_FAILDLE0} },
-{EV_TIMEOUT,   200, 249, -1,                     0,  0, {ACT_FAILDLE0} },
+       {RSP_INIT,        0,   0, SEQ_DLE0,             201,  5, {0},   "^SDLE=0\r"},
+       {RSP_OK,        201, 201, -1,                   202, -1},
+       {RSP_ZDLE,      202, 202,  0,                     0,  0, {ACT_DLE0} },
+       {RSP_NODEV,     200, 249, -1,                     0,  0, {ACT_FAKEDLE0} },
+       {RSP_ERROR,     200, 249, -1,                     0,  0, {ACT_FAILDLE0} },
+       {EV_TIMEOUT,    200, 249, -1,                     0,  0, {ACT_FAILDLE0} },
 
 /* enter dle mode */
-{RSP_INIT,       0,   0, SEQ_DLE1,             251,  5, {0},   "^SDLE=1\r"},
-{RSP_OK,       251, 251, -1,                   252, -1},
-{RSP_ZDLE,     252, 252,  1,                     0,  0, {ACT_DLE1} },
-{RSP_ERROR,    250, 299, -1,                     0,  0, {ACT_FAILDLE1} },
-{EV_TIMEOUT,   250, 299, -1,                     0,  0, {ACT_FAILDLE1} },
+       {RSP_INIT,        0,   0, SEQ_DLE1,             251,  5, {0},   "^SDLE=1\r"},
+       {RSP_OK,        251, 251, -1,                   252, -1},
+       {RSP_ZDLE,      252, 252,  1,                     0,  0, {ACT_DLE1} },
+       {RSP_ERROR,     250, 299, -1,                     0,  0, {ACT_FAILDLE1} },
+       {EV_TIMEOUT,    250, 299, -1,                     0,  0, {ACT_FAILDLE1} },
 
 /* incoming call */
-{RSP_RING,      -1,  -1, -1,                    -1, -1, {ACT_RING} },
+       {RSP_RING,       -1,  -1, -1,                    -1, -1, {ACT_RING} },
 
 /* get cid */
-{RSP_INIT,       0,   0, SEQ_CID,              301,  5, {0},   "^SGCI?\r"},
-{RSP_OK,       301, 301, -1,                   302, -1},
-{RSP_ZGCI,     302, 302, -1,                     0,  0, {ACT_CID} },
-{RSP_ERROR,    301, 349, -1,                     0,  0, {ACT_FAILCID} },
-{EV_TIMEOUT,   301, 349, -1,                     0,  0, {ACT_FAILCID} },
+       {RSP_INIT,        0,   0, SEQ_CID,              301,  5, {0},   "^SGCI?\r"},
+       {RSP_OK,        301, 301, -1,                   302, -1},
+       {RSP_ZGCI,      302, 302, -1,                     0,  0, {ACT_CID} },
+       {RSP_ERROR,     301, 349, -1,                     0,  0, {ACT_FAILCID} },
+       {EV_TIMEOUT,    301, 349, -1,                     0,  0, {ACT_FAILCID} },
 
 /* enter cid mode */
-{RSP_INIT,       0,   0, SEQ_CIDMODE,          150,  5, {0},   "^SGCI=1\r"},
-{RSP_OK,       150, 150, -1,                     0,  0, {ACT_CMODESET} },
-{RSP_ERROR,    150, 150, -1,                     0,  0, {ACT_FAILCMODE} },
-{EV_TIMEOUT,   150, 150, -1,                     0,  0, {ACT_FAILCMODE} },
+       {RSP_INIT,        0,   0, SEQ_CIDMODE,          150,  5, {0},   "^SGCI=1\r"},
+       {RSP_OK,        150, 150, -1,                     0,  0, {ACT_CMODESET} },
+       {RSP_ERROR,     150, 150, -1,                     0,  0, {ACT_FAILCMODE} },
+       {EV_TIMEOUT,    150, 150, -1,                     0,  0, {ACT_FAILCMODE} },
 
 /* leave cid mode */
-{RSP_INIT,       0,   0, SEQ_UMMODE,           160,  5, {0},   "Z\r"},
-{RSP_OK,       160, 160, -1,                     0,  0, {ACT_UMODESET} },
-{RSP_ERROR,    160, 160, -1,                     0,  0, {ACT_FAILUMODE} },
-{EV_TIMEOUT,   160, 160, -1,                     0,  0, {ACT_FAILUMODE} },
+       {RSP_INIT,        0,   0, SEQ_UMMODE,           160,  5, {0},   "Z\r"},
+       {RSP_OK,        160, 160, -1,                     0,  0, {ACT_UMODESET} },
+       {RSP_ERROR,     160, 160, -1,                     0,  0, {ACT_FAILUMODE} },
+       {EV_TIMEOUT,    160, 160, -1,                     0,  0, {ACT_FAILUMODE} },
 
 /* abort getting cid */
-{RSP_INIT,       0,   0, SEQ_NOCID,              0,  0, {ACT_ABORTCID} },
+       {RSP_INIT,        0,   0, SEQ_NOCID,              0,  0, {ACT_ABORTCID} },
 
 /* reset */
-{RSP_INIT,       0,   0, SEQ_SHUTDOWN,         504,  5, {0},   "Z\r"},
-{RSP_OK,       504, 504, -1,                     0,  0, {ACT_SDOWN} },
-{RSP_ERROR,    501, 599, -1,                     0,  0, {ACT_FAILSDOWN} },
-{EV_TIMEOUT,   501, 599, -1,                     0,  0, {ACT_FAILSDOWN} },
-{RSP_NODEV,    501, 599, -1,                     0,  0, {ACT_FAKESDOWN} },
-
-{EV_PROC_CIDMODE, -1, -1, -1,                   -1, -1, {ACT_PROC_CIDMODE} },
-{EV_IF_LOCK,    -1,  -1, -1,                    -1, -1, {ACT_IF_LOCK} },
-{EV_IF_VER,     -1,  -1, -1,                    -1, -1, {ACT_IF_VER} },
-{EV_START,      -1,  -1, -1,                    -1, -1, {ACT_START} },
-{EV_STOP,       -1,  -1, -1,                    -1, -1, {ACT_STOP} },
-{EV_SHUTDOWN,   -1,  -1, -1,                    -1, -1, {ACT_SHUTDOWN} },
+       {RSP_INIT,        0,   0, SEQ_SHUTDOWN,         504,  5, {0},   "Z\r"},
+       {RSP_OK,        504, 504, -1,                     0,  0, {ACT_SDOWN} },
+       {RSP_ERROR,     501, 599, -1,                     0,  0, {ACT_FAILSDOWN} },
+       {EV_TIMEOUT,    501, 599, -1,                     0,  0, {ACT_FAILSDOWN} },
+       {RSP_NODEV,     501, 599, -1,                     0,  0, {ACT_FAKESDOWN} },
+
+       {EV_PROC_CIDMODE, -1, -1, -1,                    -1, -1, {ACT_PROC_CIDMODE} },
+       {EV_IF_LOCK,     -1,  -1, -1,                    -1, -1, {ACT_IF_LOCK} },
+       {EV_IF_VER,      -1,  -1, -1,                    -1, -1, {ACT_IF_VER} },
+       {EV_START,       -1,  -1, -1,                    -1, -1, {ACT_START} },
+       {EV_STOP,        -1,  -1, -1,                    -1, -1, {ACT_STOP} },
+       {EV_SHUTDOWN,    -1,  -1, -1,                    -1, -1, {ACT_SHUTDOWN} },
 
 /* misc. */
-{RSP_ERROR,     -1,  -1, -1,                    -1, -1, {ACT_ERROR} },
-{RSP_ZCAU,      -1,  -1, -1,                    -1, -1, {ACT_ZCAU} },
-{RSP_NONE,      -1,  -1, -1,                    -1, -1, {ACT_DEBUG} },
-{RSP_ANY,       -1,  -1, -1,                    -1, -1, {ACT_WARN} },
-{RSP_LAST}
+       {RSP_ERROR,      -1,  -1, -1,                    -1, -1, {ACT_ERROR} },
+       {RSP_ZCAU,       -1,  -1, -1,                    -1, -1, {ACT_ZCAU} },
+       {RSP_NONE,       -1,  -1, -1,                    -1, -1, {ACT_DEBUG} },
+       {RSP_ANY,        -1,  -1, -1,                    -1, -1, {ACT_WARN} },
+       {RSP_LAST}
 };
 
 /* 600: start dialing, 650: dial in progress, 800: connection is up, 700: ring,
@@ -261,91 +261,91 @@ struct reply_t gigaset_tab_cid[] =
  * action, command */
 
 /* dial */
-{EV_DIAL,       -1,  -1, -1,                    -1, -1, {ACT_DIAL} },
-{RSP_INIT,       0,   0, SEQ_DIAL,             601,  5, {ACT_CMD+AT_BC} },
-{RSP_OK,       601, 601, -1,                   603,  5, {ACT_CMD+AT_PROTO} },
-{RSP_OK,       603, 603, -1,                   604,  5, {ACT_CMD+AT_TYPE} },
-{RSP_OK,       604, 604, -1,                   605,  5, {ACT_CMD+AT_MSN} },
-{RSP_NULL,     605, 605, -1,                   606,  5, {ACT_CMD+AT_CLIP} },
-{RSP_OK,       605, 605, -1,                   606,  5, {ACT_CMD+AT_CLIP} },
-{RSP_NULL,     606, 606, -1,                   607,  5, {ACT_CMD+AT_ISO} },
-{RSP_OK,       606, 606, -1,                   607,  5, {ACT_CMD+AT_ISO} },
-{RSP_OK,       607, 607, -1,                   608,  5, {0},   "+VLS=17\r"},
-{RSP_OK,       608, 608, -1,                   609, -1},
-{RSP_ZSAU,     609, 609, ZSAU_PROCEEDING,      610,  5, {ACT_CMD+AT_DIAL} },
-{RSP_OK,       610, 610, -1,                   650,  0, {ACT_DIALING} },
-
-{RSP_ERROR,    601, 610, -1,                     0,  0, {ACT_ABORTDIAL} },
-{EV_TIMEOUT,   601, 610, -1,                     0,  0, {ACT_ABORTDIAL} },
+       {EV_DIAL,        -1,  -1, -1,                    -1, -1, {ACT_DIAL} },
+       {RSP_INIT,        0,   0, SEQ_DIAL,             601,  5, {ACT_CMD + AT_BC} },
+       {RSP_OK,        601, 601, -1,                   603,  5, {ACT_CMD + AT_PROTO} },
+       {RSP_OK,        603, 603, -1,                   604,  5, {ACT_CMD + AT_TYPE} },
+       {RSP_OK,        604, 604, -1,                   605,  5, {ACT_CMD + AT_MSN} },
+       {RSP_NULL,      605, 605, -1,                   606,  5, {ACT_CMD + AT_CLIP} },
+       {RSP_OK,        605, 605, -1,                   606,  5, {ACT_CMD + AT_CLIP} },
+       {RSP_NULL,      606, 606, -1,                   607,  5, {ACT_CMD + AT_ISO} },
+       {RSP_OK,        606, 606, -1,                   607,  5, {ACT_CMD + AT_ISO} },
+       {RSP_OK,        607, 607, -1,                   608,  5, {0},   "+VLS=17\r"},
+       {RSP_OK,        608, 608, -1,                   609, -1},
+       {RSP_ZSAU,      609, 609, ZSAU_PROCEEDING,      610,  5, {ACT_CMD + AT_DIAL} },
+       {RSP_OK,        610, 610, -1,                   650,  0, {ACT_DIALING} },
+
+       {RSP_ERROR,     601, 610, -1,                     0,  0, {ACT_ABORTDIAL} },
+       {EV_TIMEOUT,    601, 610, -1,                     0,  0, {ACT_ABORTDIAL} },
 
 /* optional dialing responses */
-{EV_BC_OPEN,   650, 650, -1,                   651, -1},
-{RSP_ZVLS,     609, 651, 17,                    -1, -1, {ACT_DEBUG} },
-{RSP_ZCTP,     610, 651, -1,                    -1, -1, {ACT_DEBUG} },
-{RSP_ZCPN,     610, 651, -1,                    -1, -1, {ACT_DEBUG} },
-{RSP_ZSAU,     650, 651, ZSAU_CALL_DELIVERED,   -1, -1, {ACT_DEBUG} },
+       {EV_BC_OPEN,    650, 650, -1,                   651, -1},
+       {RSP_ZVLS,      609, 651, 17,                    -1, -1, {ACT_DEBUG} },
+       {RSP_ZCTP,      610, 651, -1,                    -1, -1, {ACT_DEBUG} },
+       {RSP_ZCPN,      610, 651, -1,                    -1, -1, {ACT_DEBUG} },
+       {RSP_ZSAU,      650, 651, ZSAU_CALL_DELIVERED,   -1, -1, {ACT_DEBUG} },
 
 /* connect */
-{RSP_ZSAU,     650, 650, ZSAU_ACTIVE,          800, -1, {ACT_CONNECT} },
-{RSP_ZSAU,     651, 651, ZSAU_ACTIVE,          800, -1, {ACT_CONNECT,
-                                                         ACT_NOTIFY_BC_UP} },
-{RSP_ZSAU,     750, 750, ZSAU_ACTIVE,          800, -1, {ACT_CONNECT} },
-{RSP_ZSAU,     751, 751, ZSAU_ACTIVE,          800, -1, {ACT_CONNECT,
-                                                         ACT_NOTIFY_BC_UP} },
-{EV_BC_OPEN,   800, 800, -1,                   800, -1, {ACT_NOTIFY_BC_UP} },
+       {RSP_ZSAU,      650, 650, ZSAU_ACTIVE,          800, -1, {ACT_CONNECT} },
+       {RSP_ZSAU,      651, 651, ZSAU_ACTIVE,          800, -1, {ACT_CONNECT,
+                                                                 ACT_NOTIFY_BC_UP} },
+       {RSP_ZSAU,      750, 750, ZSAU_ACTIVE,          800, -1, {ACT_CONNECT} },
+       {RSP_ZSAU,      751, 751, ZSAU_ACTIVE,          800, -1, {ACT_CONNECT,
+                                                                 ACT_NOTIFY_BC_UP} },
+       {EV_BC_OPEN,    800, 800, -1,                   800, -1, {ACT_NOTIFY_BC_UP} },
 
 /* remote hangup */
-{RSP_ZSAU,     650, 651, ZSAU_DISCONNECT_IND,    0,  0, {ACT_REMOTEREJECT} },
-{RSP_ZSAU,     750, 751, ZSAU_DISCONNECT_IND,    0,  0, {ACT_REMOTEHUP} },
-{RSP_ZSAU,     800, 800, ZSAU_DISCONNECT_IND,    0,  0, {ACT_REMOTEHUP} },
+       {RSP_ZSAU,      650, 651, ZSAU_DISCONNECT_IND,    0,  0, {ACT_REMOTEREJECT} },
+       {RSP_ZSAU,      750, 751, ZSAU_DISCONNECT_IND,    0,  0, {ACT_REMOTEHUP} },
+       {RSP_ZSAU,      800, 800, ZSAU_DISCONNECT_IND,    0,  0, {ACT_REMOTEHUP} },
 
 /* hangup */
-{EV_HUP,        -1,  -1, -1,                    -1, -1, {ACT_HUP} },
-{RSP_INIT,      -1,  -1, SEQ_HUP,              401,  5, {0},   "+VLS=0\r"},
-{RSP_OK,       401, 401, -1,                   402,  5},
-{RSP_ZVLS,     402, 402,  0,                   403,  5},
-{RSP_ZSAU,     403, 403, ZSAU_DISCONNECT_REQ,   -1, -1, {ACT_DEBUG} },
-{RSP_ZSAU,     403, 403, ZSAU_NULL,              0,  0, {ACT_DISCONNECT} },
-{RSP_NODEV,    401, 403, -1,                     0,  0, {ACT_FAKEHUP} },
-{RSP_ERROR,    401, 401, -1,                     0,  0, {ACT_ABORTHUP} },
-{EV_TIMEOUT,   401, 403, -1,                     0,  0, {ACT_ABORTHUP} },
-
-{EV_BC_CLOSED,   0,   0, -1,                     0, -1, {ACT_NOTIFY_BC_DOWN} },
+       {EV_HUP,         -1,  -1, -1,                    -1, -1, {ACT_HUP} },
+       {RSP_INIT,       -1,  -1, SEQ_HUP,              401,  5, {0},   "+VLS=0\r"},
+       {RSP_OK,        401, 401, -1,                   402,  5},
+       {RSP_ZVLS,      402, 402,  0,                   403,  5},
+       {RSP_ZSAU,      403, 403, ZSAU_DISCONNECT_REQ,   -1, -1, {ACT_DEBUG} },
+       {RSP_ZSAU,      403, 403, ZSAU_NULL,              0,  0, {ACT_DISCONNECT} },
+       {RSP_NODEV,     401, 403, -1,                     0,  0, {ACT_FAKEHUP} },
+       {RSP_ERROR,     401, 401, -1,                     0,  0, {ACT_ABORTHUP} },
+       {EV_TIMEOUT,    401, 403, -1,                     0,  0, {ACT_ABORTHUP} },
+
+       {EV_BC_CLOSED,    0,   0, -1,                     0, -1, {ACT_NOTIFY_BC_DOWN} },
 
 /* ring */
-{RSP_ZBC,      700, 700, -1,                    -1, -1, {0} },
-{RSP_ZHLC,     700, 700, -1,                    -1, -1, {0} },
-{RSP_NMBR,     700, 700, -1,                    -1, -1, {0} },
-{RSP_ZCPN,     700, 700, -1,                    -1, -1, {0} },
-{RSP_ZCTP,     700, 700, -1,                    -1, -1, {0} },
-{EV_TIMEOUT,   700, 700, -1,                   720, 720, {ACT_ICALL} },
-{EV_BC_CLOSED, 720, 720, -1,                     0, -1, {ACT_NOTIFY_BC_DOWN} },
+       {RSP_ZBC,       700, 700, -1,                    -1, -1, {0} },
+       {RSP_ZHLC,      700, 700, -1,                    -1, -1, {0} },
+       {RSP_NMBR,      700, 700, -1,                    -1, -1, {0} },
+       {RSP_ZCPN,      700, 700, -1,                    -1, -1, {0} },
+       {RSP_ZCTP,      700, 700, -1,                    -1, -1, {0} },
+       {EV_TIMEOUT,    700, 700, -1,                   720, 720, {ACT_ICALL} },
+       {EV_BC_CLOSED,  720, 720, -1,                     0, -1, {ACT_NOTIFY_BC_DOWN} },
 
 /*accept icall*/
-{EV_ACCEPT,     -1,  -1, -1,                    -1, -1, {ACT_ACCEPT} },
-{RSP_INIT,     720, 720, SEQ_ACCEPT,           721,  5, {ACT_CMD+AT_PROTO} },
-{RSP_OK,       721, 721, -1,                   722,  5, {ACT_CMD+AT_ISO} },
-{RSP_OK,       722, 722, -1,                   723,  5, {0},   "+VLS=17\r"},
-{RSP_OK,       723, 723, -1,                   724,  5, {0} },
-{RSP_ZVLS,     724, 724, 17,                   750, 50, {ACT_ACCEPTED} },
-{RSP_ERROR,    721, 729, -1,                     0,  0, {ACT_ABORTACCEPT} },
-{EV_TIMEOUT,   721, 729, -1,                     0,  0, {ACT_ABORTACCEPT} },
-{RSP_ZSAU,     700, 729, ZSAU_NULL,              0,  0, {ACT_ABORTACCEPT} },
-{RSP_ZSAU,     700, 729, ZSAU_ACTIVE,            0,  0, {ACT_ABORTACCEPT} },
-{RSP_ZSAU,     700, 729, ZSAU_DISCONNECT_IND,    0,  0, {ACT_ABORTACCEPT} },
-
-{EV_BC_OPEN,   750, 750, -1,                   751, -1},
-{EV_TIMEOUT,   750, 751, -1,                     0,  0, {ACT_CONNTIMEOUT} },
+       {EV_ACCEPT,      -1,  -1, -1,                    -1, -1, {ACT_ACCEPT} },
+       {RSP_INIT,      720, 720, SEQ_ACCEPT,           721,  5, {ACT_CMD + AT_PROTO} },
+       {RSP_OK,        721, 721, -1,                   722,  5, {ACT_CMD + AT_ISO} },
+       {RSP_OK,        722, 722, -1,                   723,  5, {0},   "+VLS=17\r"},
+       {RSP_OK,        723, 723, -1,                   724,  5, {0} },
+       {RSP_ZVLS,      724, 724, 17,                   750, 50, {ACT_ACCEPTED} },
+       {RSP_ERROR,     721, 729, -1,                     0,  0, {ACT_ABORTACCEPT} },
+       {EV_TIMEOUT,    721, 729, -1,                     0,  0, {ACT_ABORTACCEPT} },
+       {RSP_ZSAU,      700, 729, ZSAU_NULL,              0,  0, {ACT_ABORTACCEPT} },
+       {RSP_ZSAU,      700, 729, ZSAU_ACTIVE,            0,  0, {ACT_ABORTACCEPT} },
+       {RSP_ZSAU,      700, 729, ZSAU_DISCONNECT_IND,    0,  0, {ACT_ABORTACCEPT} },
+
+       {EV_BC_OPEN,    750, 750, -1,                   751, -1},
+       {EV_TIMEOUT,    750, 751, -1,                     0,  0, {ACT_CONNTIMEOUT} },
 
 /* B channel closed (general case) */
-{EV_BC_CLOSED,  -1,  -1, -1,                    -1, -1, {ACT_NOTIFY_BC_DOWN} },
+       {EV_BC_CLOSED,   -1,  -1, -1,                    -1, -1, {ACT_NOTIFY_BC_DOWN} },
 
 /* misc. */
-{RSP_ZCON,      -1,  -1, -1,                    -1, -1, {ACT_DEBUG} },
-{RSP_ZCAU,      -1,  -1, -1,                    -1, -1, {ACT_ZCAU} },
-{RSP_NONE,      -1,  -1, -1,                    -1, -1, {ACT_DEBUG} },
-{RSP_ANY,       -1,  -1, -1,                    -1, -1, {ACT_WARN} },
-{RSP_LAST}
+       {RSP_ZCON,       -1,  -1, -1,                    -1, -1, {ACT_DEBUG} },
+       {RSP_ZCAU,       -1,  -1, -1,                    -1, -1, {ACT_ZCAU} },
+       {RSP_NONE,       -1,  -1, -1,                    -1, -1, {ACT_DEBUG} },
+       {RSP_ANY,        -1,  -1, -1,                    -1, -1, {ACT_WARN} },
+       {RSP_LAST}
 };
 
 
@@ -453,7 +453,7 @@ void gigaset_handle_modem_response(struct cardstate *cs)
                        case '=':
                                if (params > MAX_REC_PARAMS) {
                                        dev_warn(cs->dev,
-                                          "too many parameters in response\n");
+                                                "too many parameters in response\n");
                                        /* need last parameter (might be CID) */
                                        params--;
                                }
@@ -461,7 +461,7 @@ void gigaset_handle_modem_response(struct cardstate *cs)
                        }
 
                rawstring = 0;
-               cid = params > 1 ? cid_of_response(argv[params-1]) : 0;
+               cid = params > 1 ? cid_of_response(argv[params - 1]) : 0;
                if (cid < 0) {
                        gigaset_add_event(cs, &cs->at_state, RSP_INVAL,
                                          NULL, 0, NULL);
@@ -550,7 +550,7 @@ void gigaset_handle_modem_response(struct cardstate *cs)
                        event->parameter = zr->code;
                        if (!zr->str)
                                dev_warn(cs->dev,
-                                       "%s: unknown parameter %s after ZSAU\n",
+                                        "%s: unknown parameter %s after ZSAU\n",
                                         __func__, argv[curarg]);
                        ++curarg;
                        break;
@@ -648,8 +648,8 @@ static void disconnect(struct at_state_t **at_state_p)
 static inline struct at_state_t *get_free_channel(struct cardstate *cs,
                                                  int cid)
 /* cids: >0: siemens-cid
-         0: without cid
-        -1: no cid assigned yet
+   0: without cid
+   -1: no cid assigned yet
 */
 {
        unsigned long flags;
@@ -722,12 +722,12 @@ static void send_command(struct cardstate *cs, const char *cmd, int cid,
        }
        if (cid > 0 && cid <= 65535)
                cb->len = snprintf(cb->buf, buflen,
-                                 dle ? "\020(AT%d%s\020)" : "AT%d%s",
-                                 cid, cmd);
+                                  dle ? "\020(AT%d%s\020)" : "AT%d%s",
+                                  cid, cmd);
        else
                cb->len = snprintf(cb->buf, buflen,
-                                 dle ? "\020(AT%s\020)" : "AT%s",
-                                 cmd);
+                                  dle ? "\020(AT%s\020)" : "AT%s",
+                                  cmd);
        cb->offset = 0;
        cb->next = NULL;
        cb->wake_tasklet = NULL;
@@ -790,7 +790,7 @@ static void bchannel_up(struct bc_state *bcs)
 }
 
 static void start_dial(struct at_state_t *at_state, void *data,
-                       unsigned seq_index)
+                      unsigned seq_index)
 {
        struct bc_state *bcs = at_state->bcs;
        struct cardstate *cs = at_state->cs;
@@ -937,10 +937,10 @@ static int reinit_and_retry(struct cardstate *cs, int channel)
 
        if (channel < 0)
                dev_warn(cs->dev,
-                   "Could not enter cid mode. Reinit device and try again.\n");
+                        "Could not enter cid mode. Reinit device and try again.\n");
        else {
                dev_warn(cs->dev,
-                   "Could not get a call id. Reinit device and try again.\n");
+                        "Could not get a call id. Reinit device and try again.\n");
                cs->bcs[channel].at_state.pending_commands |= PC_CID;
        }
        schedule_init(cs, MS_INIT);
@@ -1155,7 +1155,7 @@ static void do_action(int action, struct cardstate *cs,
                at_state2 = get_free_channel(cs, ev->parameter);
                if (!at_state2) {
                        dev_warn(cs->dev,
-                       "RING ignored: could not allocate channel structure\n");
+                                "RING ignored: could not allocate channel structure\n");
                        break;
                }
 
@@ -1372,7 +1372,7 @@ static void do_action(int action, struct cardstate *cs,
                         ev->parameter, at_state->ConState);
                break;
 
-       /* events from the LL */
+               /* events from the LL */
        case ACT_DIAL:
                start_dial(at_state, ev->ptr, ev->parameter);
                break;
@@ -1385,7 +1385,7 @@ static void do_action(int action, struct cardstate *cs,
                cs->commands_pending = 1;
                break;
 
-       /* hotplug events */
+               /* hotplug events */
        case ACT_STOP:
                do_stop(cs);
                break;
@@ -1393,7 +1393,7 @@ static void do_action(int action, struct cardstate *cs,
                do_start(cs);
                break;
 
-       /* events from the interface */
+               /* events from the interface */
        case ACT_IF_LOCK:
                cs->cmd_result = ev->parameter ? do_lock(cs) : do_unlock(cs);
                cs->waiting = 0;
@@ -1412,7 +1412,7 @@ static void do_action(int action, struct cardstate *cs,
                wake_up(&cs->waitqueue);
                break;
 
-       /* events from the proc file system */
+               /* events from the proc file system */
        case ACT_PROC_CIDMODE:
                spin_lock_irqsave(&cs->lock, flags);
                if (ev->parameter != cs->cidmode) {
@@ -1431,7 +1431,7 @@ static void do_action(int action, struct cardstate *cs,
                wake_up(&cs->waitqueue);
                break;
 
-       /* events from the hardware drivers */
+               /* events from the hardware drivers */
        case ACT_NOTIFY_BC_DOWN:
                bchannel_down(bcs);
                break;
@@ -1533,15 +1533,15 @@ static void process_event(struct cardstate *cs, struct event_t *ev)
                if (rcode == RSP_LAST) {
                        /* found nothing...*/
                        dev_warn(cs->dev, "%s: rcode=RSP_LAST: "
-                                       "resp_code %d in ConState %d!\n",
+                                "resp_code %d in ConState %d!\n",
                                 __func__, ev->type, at_state->ConState);
                        return;
                }
                if ((rcode == RSP_ANY || rcode == ev->type)
-                 && ((int) at_state->ConState >= rep->min_ConState)
-                 && (rep->max_ConState < 0
-                     || (int) at_state->ConState <= rep->max_ConState)
-                 && (rep->parameter < 0 || rep->parameter == ev->parameter))
+                   && ((int) at_state->ConState >= rep->min_ConState)
+                   && (rep->max_ConState < 0
+                       || (int) at_state->ConState <= rep->max_ConState)
+                   && (rep->parameter < 0 || rep->parameter == ev->parameter))
                        break;
        }
 
index 212efaf..8fad99e 100644 (file)
@@ -91,11 +91,11 @@ enum debuglevel {
 
 #ifdef CONFIG_GIGASET_DEBUG
 
-#define gig_dbg(level, format, arg...) \
-       do { \
+#define gig_dbg(level, format, arg...)                                 \
+       do {                                                            \
                if (unlikely(((enum debuglevel)gigaset_debuglevel) & (level))) \
                        printk(KERN_DEBUG KBUILD_MODNAME ": " format "\n", \
-                              ## arg); \
+                              ## arg);                                 \
        } while (0)
 #define DEBUG_DEFAULT (DEBUG_TRANSCMD | DEBUG_CMD | DEBUG_USBREQ)
 
@@ -164,7 +164,7 @@ void gigaset_dbg_buffer(enum debuglevel level, const unsigned char *msg,
 #define BAS_CORRFRAMES 4       /* flow control multiplicator */
 
 #define BAS_INBUFSIZE  (BAS_MAXFRAME * BAS_NUMFRAMES)
-                                       /* size of isoc in buf per URB */
+/* size of isoc in buf per URB */
 #define BAS_OUTBUFSIZE 4096            /* size of common isoc out buffer */
 #define BAS_OUTBUFPAD  BAS_MAXFRAME    /* size of pad area for isoc out buf */
 
@@ -473,17 +473,17 @@ struct cardstate {
        int commands_pending;           /* flag(s) in xxx.commands_pending have
                                           been set */
        struct tasklet_struct event_tasklet;
-                                       /* tasklet for serializing AT commands.
-                                        * Scheduled
-                                        *   -> for modem reponses (and
-                                        *      incoming data for M10x)
-                                        *   -> on timeout
-                                        *   -> after setting bits in
-                                        *      xxx.at_state.pending_command
-                                        *      (e.g. command from LL) */
+       /* tasklet for serializing AT commands.
+        * Scheduled
+        *   -> for modem reponses (and
+        *      incoming data for M10x)
+        *   -> on timeout
+        *   -> after setting bits in
+        *      xxx.at_state.pending_command
+        *      (e.g. command from LL) */
        struct tasklet_struct write_tasklet;
-                                       /* tasklet for serial output
-                                        * (not used in base driver) */
+       /* tasklet for serial output
+        * (not used in base driver) */
 
        /* event queue */
        struct event_t events[MAX_EVENTS];
@@ -491,7 +491,7 @@ struct cardstate {
        spinlock_t ev_lock;
 
        /* current modem response */
-       unsigned char respdata[MAX_RESP_SIZE+1];
+       unsigned char respdata[MAX_RESP_SIZE + 1];
        unsigned cbytes;
 
        /* private data of hardware drivers */
index 1793ba1..0f13eb1 100644 (file)
@@ -243,7 +243,7 @@ static int command_from_LL(isdn_ctrl *cntrl)
                dev_kfree_skb(bcs->rx_skb);
                gigaset_new_rx_skb(bcs);
 
-               commands = kzalloc(AT_NUM*(sizeof *commands), GFP_ATOMIC);
+               commands = kzalloc(AT_NUM * (sizeof *commands), GFP_ATOMIC);
                if (!commands) {
                        gigaset_free_channel(bcs);
                        dev_err(cs->dev, "ISDN_CMD_DIAL: out of memory\n");
@@ -261,7 +261,7 @@ static int command_from_LL(isdn_ctrl *cntrl)
                        if (!commands[AT_TYPE])
                                goto oom;
                        snprintf(commands[AT_DIAL], l,
-                                "D%s\r", cntrl->parm.setup.phone+2);
+                                "D%s\r", cntrl->parm.setup.phone + 2);
                } else {
                        commands[AT_TYPE] = kstrdup("^SCTP=1\r", GFP_ATOMIC);
                        if (!commands[AT_TYPE])
@@ -482,7 +482,7 @@ int gigaset_isdn_icall(struct at_state_t *at_state)
                response.parm.setup.si2 = 2;
        } else {
                dev_warn(cs->dev, "RING ignored - unsupported BC %s\n",
-                    at_state->str_var[STR_ZBC]);
+                        at_state->str_var[STR_ZBC]);
                return ICALL_IGNORE;
        }
        if (at_state->str_var[STR_NMBR]) {
@@ -518,7 +518,7 @@ int gigaset_isdn_icall(struct at_state_t *at_state)
                return ICALL_REJECT;
        case 3: /* incomplete */
                dev_warn(cs->dev,
-                      "LL requested unsupported feature: Incomplete Number\n");
+                        "LL requested unsupported feature: Incomplete Number\n");
                return ICALL_IGNORE;
        case 4: /* proceeding */
                /* Gigaset will send ALERTING anyway.
index ee0a549..b826dac 100644 (file)
@@ -33,10 +33,10 @@ static int if_lock(struct cardstate *cs, int *arg)
        }
 
        if (!cmd && cs->mstate == MS_LOCKED && cs->connected) {
-               cs->ops->set_modem_ctrl(cs, 0, TIOCM_DTR|TIOCM_RTS);
+               cs->ops->set_modem_ctrl(cs, 0, TIOCM_DTR | TIOCM_RTS);
                cs->ops->baud_rate(cs, B115200);
                cs->ops->set_line_ctrl(cs, CS8);
-               cs->control_state = TIOCM_DTR|TIOCM_RTS;
+               cs->control_state = TIOCM_DTR | TIOCM_RTS;
        }
 
        cs->waiting = 1;
@@ -252,17 +252,17 @@ static int if_ioctl(struct tty_struct *tty,
                        break;
                case GIGASET_BRKCHARS:
                        retval = copy_from_user(&buf,
-                                       (const unsigned char __user *) arg, 6)
+                                               (const unsigned char __user *) arg, 6)
                                ? -EFAULT : 0;
                        if (retval >= 0) {
                                gigaset_dbg_buffer(DEBUG_IF, "GIGASET_BRKCHARS",
-                                               6, (const unsigned char *) arg);
+                                                  6, (const unsigned char *) arg);
                                retval = cs->ops->brkchars(cs, buf);
                        }
                        break;
                case GIGASET_VERSION:
                        retval = copy_from_user(version,
-                                       (unsigned __user *) arg, sizeof version)
+                                               (unsigned __user *) arg, sizeof version)
                                ? -EFAULT : 0;
                        if (retval >= 0)
                                retval = if_version(cs, version);
@@ -299,7 +299,7 @@ static int if_tiocmget(struct tty_struct *tty)
        if (mutex_lock_interruptible(&cs->mutex))
                return -ERESTARTSYS;
 
-       retval = cs->control_state & (TIOCM_RTS|TIOCM_DTR);
+       retval = cs->control_state & (TIOCM_RTS | TIOCM_DTR);
 
        mutex_unlock(&cs->mutex);
 
@@ -329,7 +329,7 @@ static int if_tiocmset(struct tty_struct *tty,
                gig_dbg(DEBUG_IF, "not connected");
                retval = -ENODEV;
        } else {
-               mc = (cs->control_state | set) & ~clear & (TIOCM_RTS|TIOCM_DTR);
+               mc = (cs->control_state | set) & ~clear & (TIOCM_RTS | TIOCM_DTR);
                retval = cs->ops->set_modem_ctrl(cs, cs->control_state, mc);
                cs->control_state = mc;
        }
@@ -679,9 +679,9 @@ void gigaset_if_initdriver(struct gigaset_driver *drv, const char *procname,
        if (tty == NULL)
                goto enomem;
 
-       tty->magic =            TTY_DRIVER_MAGIC,
-       tty->type =             TTY_DRIVER_TYPE_SERIAL,
-       tty->subtype =          SERIAL_TYPE_NORMAL,
+       tty->magic =            TTY_DRIVER_MAGIC;
+       tty->type =             TTY_DRIVER_TYPE_SERIAL;
+       tty->subtype =          SERIAL_TYPE_NORMAL;
        tty->flags =            TTY_DRIVER_REAL_RAW | TTY_DRIVER_DYNAMIC_DEV;
 
        tty->driver_name =      procname;
index f39ccdf..a351c16 100644 (file)
@@ -250,94 +250,94 @@ static inline void dump_bytes(enum debuglevel level, const char *tag,
  */
 static const u16 stufftab[5 * 256] = {
 /* previous 1s = 0: */
- 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f,
- 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x201f,
- 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f,
- 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x203e, 0x205f,
- 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f,
- 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x209f,
- 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f,
- 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x007b, 0x207c, 0x207d, 0x20be, 0x20df,
- 0x0480, 0x0481, 0x0482, 0x0483, 0x0484, 0x0485, 0x0486, 0x0487, 0x0488, 0x0489, 0x048a, 0x048b, 0x048c, 0x048d, 0x048e, 0x048f,
- 0x0490, 0x0491, 0x0492, 0x0493, 0x0494, 0x0495, 0x0496, 0x0497, 0x0498, 0x0499, 0x049a, 0x049b, 0x049c, 0x049d, 0x049e, 0x251f,
- 0x04a0, 0x04a1, 0x04a2, 0x04a3, 0x04a4, 0x04a5, 0x04a6, 0x04a7, 0x04a8, 0x04a9, 0x04aa, 0x04ab, 0x04ac, 0x04ad, 0x04ae, 0x04af,
- 0x04b0, 0x04b1, 0x04b2, 0x04b3, 0x04b4, 0x04b5, 0x04b6, 0x04b7, 0x04b8, 0x04b9, 0x04ba, 0x04bb, 0x04bc, 0x04bd, 0x253e, 0x255f,
- 0x08c0, 0x08c1, 0x08c2, 0x08c3, 0x08c4, 0x08c5, 0x08c6, 0x08c7, 0x08c8, 0x08c9, 0x08ca, 0x08cb, 0x08cc, 0x08cd, 0x08ce, 0x08cf,
- 0x08d0, 0x08d1, 0x08d2, 0x08d3, 0x08d4, 0x08d5, 0x08d6, 0x08d7, 0x08d8, 0x08d9, 0x08da, 0x08db, 0x08dc, 0x08dd, 0x08de, 0x299f,
- 0x0ce0, 0x0ce1, 0x0ce2, 0x0ce3, 0x0ce4, 0x0ce5, 0x0ce6, 0x0ce7, 0x0ce8, 0x0ce9, 0x0cea, 0x0ceb, 0x0cec, 0x0ced, 0x0cee, 0x0cef,
- 0x10f0, 0x10f1, 0x10f2, 0x10f3, 0x10f4, 0x10f5, 0x10f6, 0x10f7, 0x20f8, 0x20f9, 0x20fa, 0x20fb, 0x257c, 0x257d, 0x29be, 0x2ddf,
+       0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f,
+       0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x201f,
+       0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f,
+       0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x203e, 0x205f,
+       0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f,
+       0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x209f,
+       0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f,
+       0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x007b, 0x207c, 0x207d, 0x20be, 0x20df,
+       0x0480, 0x0481, 0x0482, 0x0483, 0x0484, 0x0485, 0x0486, 0x0487, 0x0488, 0x0489, 0x048a, 0x048b, 0x048c, 0x048d, 0x048e, 0x048f,
+       0x0490, 0x0491, 0x0492, 0x0493, 0x0494, 0x0495, 0x0496, 0x0497, 0x0498, 0x0499, 0x049a, 0x049b, 0x049c, 0x049d, 0x049e, 0x251f,
+       0x04a0, 0x04a1, 0x04a2, 0x04a3, 0x04a4, 0x04a5, 0x04a6, 0x04a7, 0x04a8, 0x04a9, 0x04aa, 0x04ab, 0x04ac, 0x04ad, 0x04ae, 0x04af,
+       0x04b0, 0x04b1, 0x04b2, 0x04b3, 0x04b4, 0x04b5, 0x04b6, 0x04b7, 0x04b8, 0x04b9, 0x04ba, 0x04bb, 0x04bc, 0x04bd, 0x253e, 0x255f,
+       0x08c0, 0x08c1, 0x08c2, 0x08c3, 0x08c4, 0x08c5, 0x08c6, 0x08c7, 0x08c8, 0x08c9, 0x08ca, 0x08cb, 0x08cc, 0x08cd, 0x08ce, 0x08cf,
+       0x08d0, 0x08d1, 0x08d2, 0x08d3, 0x08d4, 0x08d5, 0x08d6, 0x08d7, 0x08d8, 0x08d9, 0x08da, 0x08db, 0x08dc, 0x08dd, 0x08de, 0x299f,
+       0x0ce0, 0x0ce1, 0x0ce2, 0x0ce3, 0x0ce4, 0x0ce5, 0x0ce6, 0x0ce7, 0x0ce8, 0x0ce9, 0x0cea, 0x0ceb, 0x0cec, 0x0ced, 0x0cee, 0x0cef,
+       0x10f0, 0x10f1, 0x10f2, 0x10f3, 0x10f4, 0x10f5, 0x10f6, 0x10f7, 0x20f8, 0x20f9, 0x20fa, 0x20fb, 0x257c, 0x257d, 0x29be, 0x2ddf,
 
 /* previous 1s = 1: */
- 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x200f,
- 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x202f,
- 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x204f,
- 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x203e, 0x206f,
- 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x208f,
- 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x20af,
- 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x20cf,
- 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x007b, 0x207c, 0x207d, 0x20be, 0x20ef,
- 0x0480, 0x0481, 0x0482, 0x0483, 0x0484, 0x0485, 0x0486, 0x0487, 0x0488, 0x0489, 0x048a, 0x048b, 0x048c, 0x048d, 0x048e, 0x250f,
- 0x0490, 0x0491, 0x0492, 0x0493, 0x0494, 0x0495, 0x0496, 0x0497, 0x0498, 0x0499, 0x049a, 0x049b, 0x049c, 0x049d, 0x049e, 0x252f,
- 0x04a0, 0x04a1, 0x04a2, 0x04a3, 0x04a4, 0x04a5, 0x04a6, 0x04a7, 0x04a8, 0x04a9, 0x04aa, 0x04ab, 0x04ac, 0x04ad, 0x04ae, 0x254f,
- 0x04b0, 0x04b1, 0x04b2, 0x04b3, 0x04b4, 0x04b5, 0x04b6, 0x04b7, 0x04b8, 0x04b9, 0x04ba, 0x04bb, 0x04bc, 0x04bd, 0x253e, 0x256f,
- 0x08c0, 0x08c1, 0x08c2, 0x08c3, 0x08c4, 0x08c5, 0x08c6, 0x08c7, 0x08c8, 0x08c9, 0x08ca, 0x08cb, 0x08cc, 0x08cd, 0x08ce, 0x298f,
- 0x08d0, 0x08d1, 0x08d2, 0x08d3, 0x08d4, 0x08d5, 0x08d6, 0x08d7, 0x08d8, 0x08d9, 0x08da, 0x08db, 0x08dc, 0x08dd, 0x08de, 0x29af,
- 0x0ce0, 0x0ce1, 0x0ce2, 0x0ce3, 0x0ce4, 0x0ce5, 0x0ce6, 0x0ce7, 0x0ce8, 0x0ce9, 0x0cea, 0x0ceb, 0x0cec, 0x0ced, 0x0cee, 0x2dcf,
- 0x10f0, 0x10f1, 0x10f2, 0x10f3, 0x10f4, 0x10f5, 0x10f6, 0x10f7, 0x20f8, 0x20f9, 0x20fa, 0x20fb, 0x257c, 0x257d, 0x29be, 0x31ef,
+       0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x200f,
+       0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x202f,
+       0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x204f,
+       0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x203e, 0x206f,
+       0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x208f,
+       0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x20af,
+       0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x20cf,
+       0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x007b, 0x207c, 0x207d, 0x20be, 0x20ef,
+       0x0480, 0x0481, 0x0482, 0x0483, 0x0484, 0x0485, 0x0486, 0x0487, 0x0488, 0x0489, 0x048a, 0x048b, 0x048c, 0x048d, 0x048e, 0x250f,
+       0x0490, 0x0491, 0x0492, 0x0493, 0x0494, 0x0495, 0x0496, 0x0497, 0x0498, 0x0499, 0x049a, 0x049b, 0x049c, 0x049d, 0x049e, 0x252f,
+       0x04a0, 0x04a1, 0x04a2, 0x04a3, 0x04a4, 0x04a5, 0x04a6, 0x04a7, 0x04a8, 0x04a9, 0x04aa, 0x04ab, 0x04ac, 0x04ad, 0x04ae, 0x254f,
+       0x04b0, 0x04b1, 0x04b2, 0x04b3, 0x04b4, 0x04b5, 0x04b6, 0x04b7, 0x04b8, 0x04b9, 0x04ba, 0x04bb, 0x04bc, 0x04bd, 0x253e, 0x256f,
+       0x08c0, 0x08c1, 0x08c2, 0x08c3, 0x08c4, 0x08c5, 0x08c6, 0x08c7, 0x08c8, 0x08c9, 0x08ca, 0x08cb, 0x08cc, 0x08cd, 0x08ce, 0x298f,
+       0x08d0, 0x08d1, 0x08d2, 0x08d3, 0x08d4, 0x08d5, 0x08d6, 0x08d7, 0x08d8, 0x08d9, 0x08da, 0x08db, 0x08dc, 0x08dd, 0x08de, 0x29af,
+       0x0ce0, 0x0ce1, 0x0ce2, 0x0ce3, 0x0ce4, 0x0ce5, 0x0ce6, 0x0ce7, 0x0ce8, 0x0ce9, 0x0cea, 0x0ceb, 0x0cec, 0x0ced, 0x0cee, 0x2dcf,
+       0x10f0, 0x10f1, 0x10f2, 0x10f3, 0x10f4, 0x10f5, 0x10f6, 0x10f7, 0x20f8, 0x20f9, 0x20fa, 0x20fb, 0x257c, 0x257d, 0x29be, 0x31ef,
 
 /* previous 1s = 2: */
- 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x2007, 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x2017,
- 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x2027, 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x2037,
- 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x2047, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x2057,
- 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x2067, 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x203e, 0x2077,
- 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x2087, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x2097,
- 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x20a7, 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x20b7,
- 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x20c7, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x20d7,
- 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x20e7, 0x0078, 0x0079, 0x007a, 0x007b, 0x207c, 0x207d, 0x20be, 0x20f7,
- 0x0480, 0x0481, 0x0482, 0x0483, 0x0484, 0x0485, 0x0486, 0x2507, 0x0488, 0x0489, 0x048a, 0x048b, 0x048c, 0x048d, 0x048e, 0x2517,
- 0x0490, 0x0491, 0x0492, 0x0493, 0x0494, 0x0495, 0x0496, 0x2527, 0x0498, 0x0499, 0x049a, 0x049b, 0x049c, 0x049d, 0x049e, 0x2537,
- 0x04a0, 0x04a1, 0x04a2, 0x04a3, 0x04a4, 0x04a5, 0x04a6, 0x2547, 0x04a8, 0x04a9, 0x04aa, 0x04ab, 0x04ac, 0x04ad, 0x04ae, 0x2557,
- 0x04b0, 0x04b1, 0x04b2, 0x04b3, 0x04b4, 0x04b5, 0x04b6, 0x2567, 0x04b8, 0x04b9, 0x04ba, 0x04bb, 0x04bc, 0x04bd, 0x253e, 0x2577,
- 0x08c0, 0x08c1, 0x08c2, 0x08c3, 0x08c4, 0x08c5, 0x08c6, 0x2987, 0x08c8, 0x08c9, 0x08ca, 0x08cb, 0x08cc, 0x08cd, 0x08ce, 0x2997,
- 0x08d0, 0x08d1, 0x08d2, 0x08d3, 0x08d4, 0x08d5, 0x08d6, 0x29a7, 0x08d8, 0x08d9, 0x08da, 0x08db, 0x08dc, 0x08dd, 0x08de, 0x29b7,
- 0x0ce0, 0x0ce1, 0x0ce2, 0x0ce3, 0x0ce4, 0x0ce5, 0x0ce6, 0x2dc7, 0x0ce8, 0x0ce9, 0x0cea, 0x0ceb, 0x0cec, 0x0ced, 0x0cee, 0x2dd7,
- 0x10f0, 0x10f1, 0x10f2, 0x10f3, 0x10f4, 0x10f5, 0x10f6, 0x31e7, 0x20f8, 0x20f9, 0x20fa, 0x20fb, 0x257c, 0x257d, 0x29be, 0x41f7,
+       0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x2007, 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x2017,
+       0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x2027, 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x2037,
+       0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x2047, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x2057,
+       0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x2067, 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x203e, 0x2077,
+       0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x2087, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x2097,
+       0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x20a7, 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x20b7,
+       0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x20c7, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x20d7,
+       0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x20e7, 0x0078, 0x0079, 0x007a, 0x007b, 0x207c, 0x207d, 0x20be, 0x20f7,
+       0x0480, 0x0481, 0x0482, 0x0483, 0x0484, 0x0485, 0x0486, 0x2507, 0x0488, 0x0489, 0x048a, 0x048b, 0x048c, 0x048d, 0x048e, 0x2517,
+       0x0490, 0x0491, 0x0492, 0x0493, 0x0494, 0x0495, 0x0496, 0x2527, 0x0498, 0x0499, 0x049a, 0x049b, 0x049c, 0x049d, 0x049e, 0x2537,
+       0x04a0, 0x04a1, 0x04a2, 0x04a3, 0x04a4, 0x04a5, 0x04a6, 0x2547, 0x04a8, 0x04a9, 0x04aa, 0x04ab, 0x04ac, 0x04ad, 0x04ae, 0x2557,
+       0x04b0, 0x04b1, 0x04b2, 0x04b3, 0x04b4, 0x04b5, 0x04b6, 0x2567, 0x04b8, 0x04b9, 0x04ba, 0x04bb, 0x04bc, 0x04bd, 0x253e, 0x2577,
+       0x08c0, 0x08c1, 0x08c2, 0x08c3, 0x08c4, 0x08c5, 0x08c6, 0x2987, 0x08c8, 0x08c9, 0x08ca, 0x08cb, 0x08cc, 0x08cd, 0x08ce, 0x2997,
+       0x08d0, 0x08d1, 0x08d2, 0x08d3, 0x08d4, 0x08d5, 0x08d6, 0x29a7, 0x08d8, 0x08d9, 0x08da, 0x08db, 0x08dc, 0x08dd, 0x08de, 0x29b7,
+       0x0ce0, 0x0ce1, 0x0ce2, 0x0ce3, 0x0ce4, 0x0ce5, 0x0ce6, 0x2dc7, 0x0ce8, 0x0ce9, 0x0cea, 0x0ceb, 0x0cec, 0x0ced, 0x0cee, 0x2dd7,
+       0x10f0, 0x10f1, 0x10f2, 0x10f3, 0x10f4, 0x10f5, 0x10f6, 0x31e7, 0x20f8, 0x20f9, 0x20fa, 0x20fb, 0x257c, 0x257d, 0x29be, 0x41f7,
 
 /* previous 1s = 3: */
- 0x0000, 0x0001, 0x0002, 0x2003, 0x0004, 0x0005, 0x0006, 0x200b, 0x0008, 0x0009, 0x000a, 0x2013, 0x000c, 0x000d, 0x000e, 0x201b,
- 0x0010, 0x0011, 0x0012, 0x2023, 0x0014, 0x0015, 0x0016, 0x202b, 0x0018, 0x0019, 0x001a, 0x2033, 0x001c, 0x001d, 0x001e, 0x203b,
- 0x0020, 0x0021, 0x0022, 0x2043, 0x0024, 0x0025, 0x0026, 0x204b, 0x0028, 0x0029, 0x002a, 0x2053, 0x002c, 0x002d, 0x002e, 0x205b,
- 0x0030, 0x0031, 0x0032, 0x2063, 0x0034, 0x0035, 0x0036, 0x206b, 0x0038, 0x0039, 0x003a, 0x2073, 0x003c, 0x003d, 0x203e, 0x207b,
- 0x0040, 0x0041, 0x0042, 0x2083, 0x0044, 0x0045, 0x0046, 0x208b, 0x0048, 0x0049, 0x004a, 0x2093, 0x004c, 0x004d, 0x004e, 0x209b,
- 0x0050, 0x0051, 0x0052, 0x20a3, 0x0054, 0x0055, 0x0056, 0x20ab, 0x0058, 0x0059, 0x005a, 0x20b3, 0x005c, 0x005d, 0x005e, 0x20bb,
- 0x0060, 0x0061, 0x0062, 0x20c3, 0x0064, 0x0065, 0x0066, 0x20cb, 0x0068, 0x0069, 0x006a, 0x20d3, 0x006c, 0x006d, 0x006e, 0x20db,
- 0x0070, 0x0071, 0x0072, 0x20e3, 0x0074, 0x0075, 0x0076, 0x20eb, 0x0078, 0x0079, 0x007a, 0x20f3, 0x207c, 0x207d, 0x20be, 0x40fb,
- 0x0480, 0x0481, 0x0482, 0x2503, 0x0484, 0x0485, 0x0486, 0x250b, 0x0488, 0x0489, 0x048a, 0x2513, 0x048c, 0x048d, 0x048e, 0x251b,
- 0x0490, 0x0491, 0x0492, 0x2523, 0x0494, 0x0495, 0x0496, 0x252b, 0x0498, 0x0499, 0x049a, 0x2533, 0x049c, 0x049d, 0x049e, 0x253b,
- 0x04a0, 0x04a1, 0x04a2, 0x2543, 0x04a4, 0x04a5, 0x04a6, 0x254b, 0x04a8, 0x04a9, 0x04aa, 0x2553, 0x04ac, 0x04ad, 0x04ae, 0x255b,
- 0x04b0, 0x04b1, 0x04b2, 0x2563, 0x04b4, 0x04b5, 0x04b6, 0x256b, 0x04b8, 0x04b9, 0x04ba, 0x2573, 0x04bc, 0x04bd, 0x253e, 0x257b,
- 0x08c0, 0x08c1, 0x08c2, 0x2983, 0x08c4, 0x08c5, 0x08c6, 0x298b, 0x08c8, 0x08c9, 0x08ca, 0x2993, 0x08cc, 0x08cd, 0x08ce, 0x299b,
- 0x08d0, 0x08d1, 0x08d2, 0x29a3, 0x08d4, 0x08d5, 0x08d6, 0x29ab, 0x08d8, 0x08d9, 0x08da, 0x29b3, 0x08dc, 0x08dd, 0x08de, 0x29bb,
- 0x0ce0, 0x0ce1, 0x0ce2, 0x2dc3, 0x0ce4, 0x0ce5, 0x0ce6, 0x2dcb, 0x0ce8, 0x0ce9, 0x0cea, 0x2dd3, 0x0cec, 0x0ced, 0x0cee, 0x2ddb,
- 0x10f0, 0x10f1, 0x10f2, 0x31e3, 0x10f4, 0x10f5, 0x10f6, 0x31eb, 0x20f8, 0x20f9, 0x20fa, 0x41f3, 0x257c, 0x257d, 0x29be, 0x46fb,
+       0x0000, 0x0001, 0x0002, 0x2003, 0x0004, 0x0005, 0x0006, 0x200b, 0x0008, 0x0009, 0x000a, 0x2013, 0x000c, 0x000d, 0x000e, 0x201b,
+       0x0010, 0x0011, 0x0012, 0x2023, 0x0014, 0x0015, 0x0016, 0x202b, 0x0018, 0x0019, 0x001a, 0x2033, 0x001c, 0x001d, 0x001e, 0x203b,
+       0x0020, 0x0021, 0x0022, 0x2043, 0x0024, 0x0025, 0x0026, 0x204b, 0x0028, 0x0029, 0x002a, 0x2053, 0x002c, 0x002d, 0x002e, 0x205b,
+       0x0030, 0x0031, 0x0032, 0x2063, 0x0034, 0x0035, 0x0036, 0x206b, 0x0038, 0x0039, 0x003a, 0x2073, 0x003c, 0x003d, 0x203e, 0x207b,
+       0x0040, 0x0041, 0x0042, 0x2083, 0x0044, 0x0045, 0x0046, 0x208b, 0x0048, 0x0049, 0x004a, 0x2093, 0x004c, 0x004d, 0x004e, 0x209b,
+       0x0050, 0x0051, 0x0052, 0x20a3, 0x0054, 0x0055, 0x0056, 0x20ab, 0x0058, 0x0059, 0x005a, 0x20b3, 0x005c, 0x005d, 0x005e, 0x20bb,
+       0x0060, 0x0061, 0x0062, 0x20c3, 0x0064, 0x0065, 0x0066, 0x20cb, 0x0068, 0x0069, 0x006a, 0x20d3, 0x006c, 0x006d, 0x006e, 0x20db,
+       0x0070, 0x0071, 0x0072, 0x20e3, 0x0074, 0x0075, 0x0076, 0x20eb, 0x0078, 0x0079, 0x007a, 0x20f3, 0x207c, 0x207d, 0x20be, 0x40fb,
+       0x0480, 0x0481, 0x0482, 0x2503, 0x0484, 0x0485, 0x0486, 0x250b, 0x0488, 0x0489, 0x048a, 0x2513, 0x048c, 0x048d, 0x048e, 0x251b,
+       0x0490, 0x0491, 0x0492, 0x2523, 0x0494, 0x0495, 0x0496, 0x252b, 0x0498, 0x0499, 0x049a, 0x2533, 0x049c, 0x049d, 0x049e, 0x253b,
+       0x04a0, 0x04a1, 0x04a2, 0x2543, 0x04a4, 0x04a5, 0x04a6, 0x254b, 0x04a8, 0x04a9, 0x04aa, 0x2553, 0x04ac, 0x04ad, 0x04ae, 0x255b,
+       0x04b0, 0x04b1, 0x04b2, 0x2563, 0x04b4, 0x04b5, 0x04b6, 0x256b, 0x04b8, 0x04b9, 0x04ba, 0x2573, 0x04bc, 0x04bd, 0x253e, 0x257b,
+       0x08c0, 0x08c1, 0x08c2, 0x2983, 0x08c4, 0x08c5, 0x08c6, 0x298b, 0x08c8, 0x08c9, 0x08ca, 0x2993, 0x08cc, 0x08cd, 0x08ce, 0x299b,
+       0x08d0, 0x08d1, 0x08d2, 0x29a3, 0x08d4, 0x08d5, 0x08d6, 0x29ab, 0x08d8, 0x08d9, 0x08da, 0x29b3, 0x08dc, 0x08dd, 0x08de, 0x29bb,
+       0x0ce0, 0x0ce1, 0x0ce2, 0x2dc3, 0x0ce4, 0x0ce5, 0x0ce6, 0x2dcb, 0x0ce8, 0x0ce9, 0x0cea, 0x2dd3, 0x0cec, 0x0ced, 0x0cee, 0x2ddb,
+       0x10f0, 0x10f1, 0x10f2, 0x31e3, 0x10f4, 0x10f5, 0x10f6, 0x31eb, 0x20f8, 0x20f9, 0x20fa, 0x41f3, 0x257c, 0x257d, 0x29be, 0x46fb,
 
 /* previous 1s = 4: */
- 0x0000, 0x2001, 0x0002, 0x2005, 0x0004, 0x2009, 0x0006, 0x200d, 0x0008, 0x2011, 0x000a, 0x2015, 0x000c, 0x2019, 0x000e, 0x201d,
- 0x0010, 0x2021, 0x0012, 0x2025, 0x0014, 0x2029, 0x0016, 0x202d, 0x0018, 0x2031, 0x001a, 0x2035, 0x001c, 0x2039, 0x001e, 0x203d,
- 0x0020, 0x2041, 0x0022, 0x2045, 0x0024, 0x2049, 0x0026, 0x204d, 0x0028, 0x2051, 0x002a, 0x2055, 0x002c, 0x2059, 0x002e, 0x205d,
- 0x0030, 0x2061, 0x0032, 0x2065, 0x0034, 0x2069, 0x0036, 0x206d, 0x0038, 0x2071, 0x003a, 0x2075, 0x003c, 0x2079, 0x203e, 0x407d,
- 0x0040, 0x2081, 0x0042, 0x2085, 0x0044, 0x2089, 0x0046, 0x208d, 0x0048, 0x2091, 0x004a, 0x2095, 0x004c, 0x2099, 0x004e, 0x209d,
- 0x0050, 0x20a1, 0x0052, 0x20a5, 0x0054, 0x20a9, 0x0056, 0x20ad, 0x0058, 0x20b1, 0x005a, 0x20b5, 0x005c, 0x20b9, 0x005e, 0x20bd,
- 0x0060, 0x20c1, 0x0062, 0x20c5, 0x0064, 0x20c9, 0x0066, 0x20cd, 0x0068, 0x20d1, 0x006a, 0x20d5, 0x006c, 0x20d9, 0x006e, 0x20dd,
- 0x0070, 0x20e1, 0x0072, 0x20e5, 0x0074, 0x20e9, 0x0076, 0x20ed, 0x0078, 0x20f1, 0x007a, 0x20f5, 0x207c, 0x40f9, 0x20be, 0x417d,
- 0x0480, 0x2501, 0x0482, 0x2505, 0x0484, 0x2509, 0x0486, 0x250d, 0x0488, 0x2511, 0x048a, 0x2515, 0x048c, 0x2519, 0x048e, 0x251d,
- 0x0490, 0x2521, 0x0492, 0x2525, 0x0494, 0x2529, 0x0496, 0x252d, 0x0498, 0x2531, 0x049a, 0x2535, 0x049c, 0x2539, 0x049e, 0x253d,
- 0x04a0, 0x2541, 0x04a2, 0x2545, 0x04a4, 0x2549, 0x04a6, 0x254d, 0x04a8, 0x2551, 0x04aa, 0x2555, 0x04ac, 0x2559, 0x04ae, 0x255d,
- 0x04b0, 0x2561, 0x04b2, 0x2565, 0x04b4, 0x2569, 0x04b6, 0x256d, 0x04b8, 0x2571, 0x04ba, 0x2575, 0x04bc, 0x2579, 0x253e, 0x467d,
- 0x08c0, 0x2981, 0x08c2, 0x2985, 0x08c4, 0x2989, 0x08c6, 0x298d, 0x08c8, 0x2991, 0x08ca, 0x2995, 0x08cc, 0x2999, 0x08ce, 0x299d,
- 0x08d0, 0x29a1, 0x08d2, 0x29a5, 0x08d4, 0x29a9, 0x08d6, 0x29ad, 0x08d8, 0x29b1, 0x08da, 0x29b5, 0x08dc, 0x29b9, 0x08de, 0x29bd,
- 0x0ce0, 0x2dc1, 0x0ce2, 0x2dc5, 0x0ce4, 0x2dc9, 0x0ce6, 0x2dcd, 0x0ce8, 0x2dd1, 0x0cea, 0x2dd5, 0x0cec, 0x2dd9, 0x0cee, 0x2ddd,
- 0x10f0, 0x31e1, 0x10f2, 0x31e5, 0x10f4, 0x31e9, 0x10f6, 0x31ed, 0x20f8, 0x41f1, 0x20fa, 0x41f5, 0x257c, 0x46f9, 0x29be, 0x4b7d
+       0x0000, 0x2001, 0x0002, 0x2005, 0x0004, 0x2009, 0x0006, 0x200d, 0x0008, 0x2011, 0x000a, 0x2015, 0x000c, 0x2019, 0x000e, 0x201d,
+       0x0010, 0x2021, 0x0012, 0x2025, 0x0014, 0x2029, 0x0016, 0x202d, 0x0018, 0x2031, 0x001a, 0x2035, 0x001c, 0x2039, 0x001e, 0x203d,
+       0x0020, 0x2041, 0x0022, 0x2045, 0x0024, 0x2049, 0x0026, 0x204d, 0x0028, 0x2051, 0x002a, 0x2055, 0x002c, 0x2059, 0x002e, 0x205d,
+       0x0030, 0x2061, 0x0032, 0x2065, 0x0034, 0x2069, 0x0036, 0x206d, 0x0038, 0x2071, 0x003a, 0x2075, 0x003c, 0x2079, 0x203e, 0x407d,
+       0x0040, 0x2081, 0x0042, 0x2085, 0x0044, 0x2089, 0x0046, 0x208d, 0x0048, 0x2091, 0x004a, 0x2095, 0x004c, 0x2099, 0x004e, 0x209d,
+       0x0050, 0x20a1, 0x0052, 0x20a5, 0x0054, 0x20a9, 0x0056, 0x20ad, 0x0058, 0x20b1, 0x005a, 0x20b5, 0x005c, 0x20b9, 0x005e, 0x20bd,
+       0x0060, 0x20c1, 0x0062, 0x20c5, 0x0064, 0x20c9, 0x0066, 0x20cd, 0x0068, 0x20d1, 0x006a, 0x20d5, 0x006c, 0x20d9, 0x006e, 0x20dd,
+       0x0070, 0x20e1, 0x0072, 0x20e5, 0x0074, 0x20e9, 0x0076, 0x20ed, 0x0078, 0x20f1, 0x007a, 0x20f5, 0x207c, 0x40f9, 0x20be, 0x417d,
+       0x0480, 0x2501, 0x0482, 0x2505, 0x0484, 0x2509, 0x0486, 0x250d, 0x0488, 0x2511, 0x048a, 0x2515, 0x048c, 0x2519, 0x048e, 0x251d,
+       0x0490, 0x2521, 0x0492, 0x2525, 0x0494, 0x2529, 0x0496, 0x252d, 0x0498, 0x2531, 0x049a, 0x2535, 0x049c, 0x2539, 0x049e, 0x253d,
+       0x04a0, 0x2541, 0x04a2, 0x2545, 0x04a4, 0x2549, 0x04a6, 0x254d, 0x04a8, 0x2551, 0x04aa, 0x2555, 0x04ac, 0x2559, 0x04ae, 0x255d,
+       0x04b0, 0x2561, 0x04b2, 0x2565, 0x04b4, 0x2569, 0x04b6, 0x256d, 0x04b8, 0x2571, 0x04ba, 0x2575, 0x04bc, 0x2579, 0x253e, 0x467d,
+       0x08c0, 0x2981, 0x08c2, 0x2985, 0x08c4, 0x2989, 0x08c6, 0x298d, 0x08c8, 0x2991, 0x08ca, 0x2995, 0x08cc, 0x2999, 0x08ce, 0x299d,
+       0x08d0, 0x29a1, 0x08d2, 0x29a5, 0x08d4, 0x29a9, 0x08d6, 0x29ad, 0x08d8, 0x29b1, 0x08da, 0x29b5, 0x08dc, 0x29b9, 0x08de, 0x29bd,
+       0x0ce0, 0x2dc1, 0x0ce2, 0x2dc5, 0x0ce4, 0x2dc9, 0x0ce6, 0x2dcd, 0x0ce8, 0x2dd1, 0x0cea, 0x2dd5, 0x0cec, 0x2dd9, 0x0cee, 0x2ddd,
+       0x10f0, 0x31e1, 0x10f2, 0x31e5, 0x10f4, 0x31e9, 0x10f6, 0x31ed, 0x20f8, 0x41f1, 0x20fa, 0x41f5, 0x257c, 0x46f9, 0x29be, 0x4b7d
 };
 
 /* hdlc_bitstuff_byte
@@ -598,22 +598,22 @@ static inline void hdlc_frag(struct bc_state *bcs, unsigned inbits)
  *        bit 7 set if there are 5 or more "interior" consecutive '1' bits
  */
 static const unsigned char bitcounts[256] = {
-  0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x04,
-  0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x05,
-  0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x04,
-  0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x80, 0x06,
-  0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x04,
-  0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x05,
-  0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x04,
-  0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x02, 0x80, 0x81, 0x80, 0x07,
-  0x10, 0x11, 0x10, 0x12, 0x10, 0x11, 0x10, 0x13, 0x10, 0x11, 0x10, 0x12, 0x10, 0x11, 0x10, 0x14,
-  0x10, 0x11, 0x10, 0x12, 0x10, 0x11, 0x10, 0x13, 0x10, 0x11, 0x10, 0x12, 0x10, 0x11, 0x10, 0x15,
-  0x10, 0x11, 0x10, 0x12, 0x10, 0x11, 0x10, 0x13, 0x10, 0x11, 0x10, 0x12, 0x10, 0x11, 0x10, 0x14,
-  0x10, 0x11, 0x10, 0x12, 0x10, 0x11, 0x10, 0x13, 0x10, 0x11, 0x10, 0x12, 0x10, 0x11, 0x90, 0x16,
-  0x20, 0x21, 0x20, 0x22, 0x20, 0x21, 0x20, 0x23, 0x20, 0x21, 0x20, 0x22, 0x20, 0x21, 0x20, 0x24,
-  0x20, 0x21, 0x20, 0x22, 0x20, 0x21, 0x20, 0x23, 0x20, 0x21, 0x20, 0x22, 0x20, 0x21, 0x20, 0x25,
-  0x30, 0x31, 0x30, 0x32, 0x30, 0x31, 0x30, 0x33, 0x30, 0x31, 0x30, 0x32, 0x30, 0x31, 0x30, 0x34,
-  0x40, 0x41, 0x40, 0x42, 0x40, 0x41, 0x40, 0x43, 0x50, 0x51, 0x50, 0x52, 0x60, 0x61, 0x70, 0x78
+       0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x04,
+       0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x05,
+       0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x04,
+       0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x80, 0x06,
+       0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x04,
+       0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x05,
+       0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x04,
+       0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x02, 0x80, 0x81, 0x80, 0x07,
+       0x10, 0x11, 0x10, 0x12, 0x10, 0x11, 0x10, 0x13, 0x10, 0x11, 0x10, 0x12, 0x10, 0x11, 0x10, 0x14,
+       0x10, 0x11, 0x10, 0x12, 0x10, 0x11, 0x10, 0x13, 0x10, 0x11, 0x10, 0x12, 0x10, 0x11, 0x10, 0x15,
+       0x10, 0x11, 0x10, 0x12, 0x10, 0x11, 0x10, 0x13, 0x10, 0x11, 0x10, 0x12, 0x10, 0x11, 0x10, 0x14,
+       0x10, 0x11, 0x10, 0x12, 0x10, 0x11, 0x10, 0x13, 0x10, 0x11, 0x10, 0x12, 0x10, 0x11, 0x90, 0x16,
+       0x20, 0x21, 0x20, 0x22, 0x20, 0x21, 0x20, 0x23, 0x20, 0x21, 0x20, 0x22, 0x20, 0x21, 0x20, 0x24,
+       0x20, 0x21, 0x20, 0x22, 0x20, 0x21, 0x20, 0x23, 0x20, 0x21, 0x20, 0x22, 0x20, 0x21, 0x20, 0x25,
+       0x30, 0x31, 0x30, 0x32, 0x30, 0x31, 0x30, 0x33, 0x30, 0x31, 0x30, 0x32, 0x30, 0x31, 0x30, 0x34,
+       0x40, 0x41, 0x40, 0x42, 0x40, 0x41, 0x40, 0x43, 0x50, 0x51, 0x50, 0x52, 0x60, 0x61, 0x70, 0x78
 };
 
 /* hdlc_unpack
index b943efb..e3f9d0f 100644 (file)
@@ -35,7 +35,7 @@ static ssize_t set_cidmode(struct device *dev, struct device_attribute *attr,
                if (!isspace(*end++))
                        return -EINVAL;
        if (value < 0 || value > 1)
-                       return -EINVAL;
+               return -EINVAL;
 
        if (mutex_lock_interruptible(&cs->mutex))
                return -ERESTARTSYS;
@@ -56,7 +56,7 @@ static ssize_t set_cidmode(struct device *dev, struct device_attribute *attr,
        return count;
 }
 
-static DEVICE_ATTR(cidmode, S_IRUGO|S_IWUSR, show_cidmode, set_cidmode);
+static DEVICE_ATTR(cidmode, S_IRUGO | S_IWUSR, show_cidmode, set_cidmode);
 
 /* free sysfs for device */
 void gigaset_free_dev_sysfs(struct cardstate *cs)
index 86a5c4f..6f3fd4c 100644 (file)
@@ -246,7 +246,7 @@ static int gigaset_write_cmd(struct cardstate *cs, struct cmdbuf_t *cb)
        unsigned long flags;
 
        gigaset_dbg_buffer(cs->mstate != MS_LOCKED ?
-                               DEBUG_TRANSCMD : DEBUG_LOCKCMD,
+                          DEBUG_TRANSCMD : DEBUG_LOCKCMD,
                           "CMD Transmit", cb->len, cb->buf);
 
        spin_lock_irqsave(&cs->cmdlock, flags);
@@ -773,8 +773,8 @@ static int __init ser_gigaset_init(void)
 
        /* allocate memory for our driver state and initialize it */
        driver = gigaset_initdriver(GIGASET_MINOR, GIGASET_MINORS,
-                                         GIGASET_MODULENAME, GIGASET_DEVNAME,
-                                         &ops, THIS_MODULE);
+                                   GIGASET_MODULENAME, GIGASET_DEVNAME,
+                                   &ops, THIS_MODULE);
        if (!driver)
                goto error;
 
index 5e3300d..049da67 100644 (file)
@@ -184,7 +184,7 @@ static int set_value(struct cardstate *cs, u8 req, u16 val)
                (unsigned)req, (unsigned)val);
        r = usb_control_msg(udev, usb_sndctrlpipe(udev, 0), 0x12, 0x41,
                            0xf /*?*/, 0, NULL, 0, 2000 /*?*/);
-                           /* no idea what this does */
+       /* no idea what this does */
        if (r < 0) {
                dev_err(&udev->dev, "error %d on request 0x12\n", -r);
                return r;
@@ -365,7 +365,7 @@ static void gigaset_read_int_callback(struct urb *urb)
                        src = cs->hw.usb->rcvbuf;
                        if (unlikely(*src))
                                dev_warn(cs->dev,
-                                   "%s: There was no leading 0, but 0x%02x!\n",
+                                        "%s: There was no leading 0, but 0x%02x!\n",
                                         __func__, (unsigned) *src);
                        ++src; /* skip leading 0x00 */
                        --numbytes;
@@ -465,7 +465,7 @@ static int send_cb(struct cardstate *cs, struct cmdbuf_t *cb)
 
                        usb_fill_bulk_urb(ucs->bulk_out_urb, ucs->udev,
                                          usb_sndbulkpipe(ucs->udev,
-                                            ucs->bulk_out_endpointAddr & 0x0f),
+                                                         ucs->bulk_out_endpointAddr & 0x0f),
                                          cb->buf + cb->offset, count,
                                          gigaset_write_bulk_callback, cs);
 
@@ -499,7 +499,7 @@ static int gigaset_write_cmd(struct cardstate *cs, struct cmdbuf_t *cb)
        unsigned long flags;
 
        gigaset_dbg_buffer(cs->mstate != MS_LOCKED ?
-                            DEBUG_TRANSCMD : DEBUG_LOCKCMD,
+                          DEBUG_TRANSCMD : DEBUG_LOCKCMD,
                           "CMD Transmit", cb->len, cb->buf);
 
        spin_lock_irqsave(&cs->cmdlock, flags);
index 61f516f..44b50cc 100644 (file)
@@ -44,12 +44,12 @@ static void avmcs_detach(struct pcmcia_device *p_dev);
 
 static int avmcs_probe(struct pcmcia_device *p_dev)
 {
-    /* General socket configuration */
-    p_dev->config_flags |= CONF_ENABLE_IRQ | CONF_AUTO_SET_IO;
-    p_dev->config_index = 1;
-    p_dev->config_regs = PRESENT_OPTION;
+       /* General socket configuration */
+       p_dev->config_flags |= CONF_ENABLE_IRQ | CONF_AUTO_SET_IO;
+       p_dev->config_index = 1;
+       p_dev->config_regs = PRESENT_OPTION;
 
-    return avmcs_config(p_dev);
+       return avmcs_config(p_dev);
 } /* avmcs_attach */
 
 
@@ -69,75 +69,75 @@ static int avmcs_configcheck(struct pcmcia_device *p_dev, void *priv_data)
 
 static int avmcs_config(struct pcmcia_device *link)
 {
-    int i = -1;
-    char devname[128];
-    int cardtype;
-    int (*addcard)(unsigned int port, unsigned irq);
-
-    devname[0] = 0;
-    if (link->prod_id[1])
-           strlcpy(devname, link->prod_id[1], sizeof(devname));
-
-    /*
-     * find IO port
-     */
-    if (pcmcia_loop_config(link, avmcs_configcheck, NULL))
-           return -ENODEV;
-
-    do {
-       if (!link->irq) {
-           /* undo */
-           pcmcia_disable_device(link);
-           break;
-       }
+       int i = -1;
+       char devname[128];
+       int cardtype;
+       int (*addcard)(unsigned int port, unsigned irq);
+
+       devname[0] = 0;
+       if (link->prod_id[1])
+               strlcpy(devname, link->prod_id[1], sizeof(devname));
 
        /*
-         * configure the PCMCIA socket
-         */
-       i = pcmcia_enable_device(link);
+        * find IO port
+        */
+       if (pcmcia_loop_config(link, avmcs_configcheck, NULL))
+               return -ENODEV;
+
+       do {
+               if (!link->irq) {
+                       /* undo */
+                       pcmcia_disable_device(link);
+                       break;
+               }
+
+               /*
+                * configure the PCMCIA socket
+                */
+               i = pcmcia_enable_device(link);
+               if (i != 0) {
+                       pcmcia_disable_device(link);
+                       break;
+               }
+
+       } while (0);
+
+       if (devname[0]) {
+               char *s = strrchr(devname, ' ');
+               if (!s)
+                       s = devname;
+               else s++;
+               if (strcmp("M1", s) == 0) {
+                       cardtype = AVM_CARDTYPE_M1;
+               } else if (strcmp("M2", s) == 0) {
+                       cardtype = AVM_CARDTYPE_M2;
+               } else {
+                       cardtype = AVM_CARDTYPE_B1;
+               }
+       } else
+               cardtype = AVM_CARDTYPE_B1;
+
+       /* If any step failed, release any partially configured state */
        if (i != 0) {
-           pcmcia_disable_device(link);
-           break;
-       }
-
-    } while (0);
-
-    if (devname[0]) {
-       char *s = strrchr(devname, ' ');
-       if (!s)
-          s = devname;
-       else s++;
-        if (strcmp("M1", s) == 0) {
-           cardtype = AVM_CARDTYPE_M1;
-        } else if (strcmp("M2", s) == 0) {
-           cardtype = AVM_CARDTYPE_M2;
-       } else {
-           cardtype = AVM_CARDTYPE_B1;
+               avmcs_release(link);
+               return -ENODEV;
        }
-    } else
-        cardtype = AVM_CARDTYPE_B1;
-
-    /* If any step failed, release any partially configured state */
-    if (i != 0) {
-       avmcs_release(link);
-       return -ENODEV;
-    }
 
 
-    switch (cardtype) {
-        case AVM_CARDTYPE_M1: addcard = b1pcmcia_addcard_m1; break;
-        case AVM_CARDTYPE_M2: addcard = b1pcmcia_addcard_m2; break;
+       switch (cardtype) {
+       case AVM_CARDTYPE_M1: addcard = b1pcmcia_addcard_m1; break;
+       case AVM_CARDTYPE_M2: addcard = b1pcmcia_addcard_m2; break;
        default:
-        case AVM_CARDTYPE_B1: addcard = b1pcmcia_addcard_b1; break;
-    }
-    if ((i = (*addcard)(link->resource[0]->start, link->irq)) < 0) {
-           dev_err(&link->dev,
-                   "avm_cs: failed to add AVM-Controller at i/o %#x, irq %d\n",
-                   (unsigned int) link->resource[0]->start, link->irq);
-           avmcs_release(link);
-           return -ENODEV;
-    }
-    return 0;
+       case AVM_CARDTYPE_B1: addcard = b1pcmcia_addcard_b1; break;
+       }
+       if ((i = (*addcard)(link->resource[0]->start, link->irq)) < 0) {
+               dev_err(&link->dev,
+                       "avm_cs: failed to add AVM-Controller at i/o %#x, irq %d\n",
+                       (unsigned int) link->resource[0]->start, link->irq);
+               avmcs_release(link);
+               return -ENODEV;
+       }
+       return 0;
 
 } /* avmcs_config */
 
index a70e885..c95712d 100644 (file)
@@ -44,16 +44,16 @@ enum avmcardtype {
 };
 
 typedef struct avmcard_dmabuf {
-    long        size;
-    u8       *dmabuf;
-    dma_addr_t  dmaaddr;
+       long        size;
+       u8       *dmabuf;
+       dma_addr_t  dmaaddr;
 } avmcard_dmabuf;
 
 typedef struct avmcard_dmainfo {
        u32                recvlen;
-        avmcard_dmabuf       recvbuf;
+       avmcard_dmabuf       recvbuf;
 
-        avmcard_dmabuf       sendbuf;
+       avmcard_dmabuf       sendbuf;
        struct sk_buff_head  send_queue;
 
        struct pci_dev      *pcidev;
@@ -61,22 +61,22 @@ typedef struct avmcard_dmainfo {
 
 typedef        struct avmctrl_info {
        char cardname[32];
-       
+
        int versionlen;
        char versionbuf[1024];
        char *version[AVM_MAXVERSION];
-       
+
        char infobuf[128];      /* for function procinfo */
-       
+
        struct avmcard  *card;
        struct capi_ctr  capi_ctrl;
-       
+
        struct list_head ncci_head;
 } avmctrl_info;
 
 typedef struct avmcard {
        char name[32];
-  
+
        spinlock_t lock;
        unsigned int port;
        unsigned irq;
@@ -103,95 +103,95 @@ typedef struct avmcard {
 extern int b1_irq_table[16];
 
 /*
- * LLI Messages to the ISDN-ControllerISDN Controller 
+ * LLI Messages to the ISDN-ControllerISDN Controller
  */
 
 #define        SEND_POLL               0x72    /*
-                                          * after load <- RECEIVE_POLL 
+                                        * after load <- RECEIVE_POLL
                                         */
 #define SEND_INIT              0x11    /*
-                                          * first message <- RECEIVE_INIT
-                                          * int32 NumApplications  int32
-                                          * NumNCCIs int32 BoardNumber 
+                                        * first message <- RECEIVE_INIT
+                                        * int32 NumApplications  int32
+                                        * NumNCCIs int32 BoardNumber
                                         */
 #define SEND_REGISTER          0x12    /*
-                                          * register an application int32
-                                          * ApplIDId int32 NumMessages
-                                          * int32 NumB3Connections int32
-                                          * NumB3Blocks int32 B3Size
-                                          * 
-                                          * AnzB3Connection != 0 &&
-                                          * AnzB3Blocks >= 1 && B3Size >= 1 
+                                        * register an application int32
+                                        * ApplIDId int32 NumMessages
+                                        * int32 NumB3Connections int32
+                                        * NumB3Blocks int32 B3Size
+                                        *
+                                        * AnzB3Connection != 0 &&
+                                        * AnzB3Blocks >= 1 && B3Size >= 1
                                         */
 #define SEND_RELEASE           0x14    /*
-                                          * deregister an application int32 
-                                          * ApplID 
+                                        * deregister an application int32
+                                        * ApplID
                                         */
 #define SEND_MESSAGE           0x15    /*
-                                          * send capi-message int32 length
-                                          * capi-data ... 
+                                        * send capi-message int32 length
+                                        * capi-data ...
                                         */
 #define SEND_DATA_B3_REQ       0x13    /*
-                                          * send capi-data-message int32
-                                          * MsgLength capi-data ... int32
-                                          * B3Length data .... 
+                                        * send capi-data-message int32
+                                        * MsgLength capi-data ... int32
+                                        * B3Length data ....
                                         */
 
 #define SEND_CONFIG            0x21    /*
-                                         */
+                                        */
 
 #define SEND_POLLACK           0x73    /* T1 Watchdog */
 
 /*
- * LLI Messages from the ISDN-ControllerISDN Controller 
+ * LLI Messages from the ISDN-ControllerISDN Controller
  */
 
 #define RECEIVE_POLL           0x32    /*
-                                          * <- after SEND_POLL 
+                                        * <- after SEND_POLL
                                         */
 #define RECEIVE_INIT           0x27    /*
-                                          * <- after SEND_INIT int32 length
-                                          * byte total length b1struct board 
-                                          * driver revision b1struct card
-                                          * type b1struct reserved b1struct
-                                          * serial number b1struct driver
-                                          * capability b1struct d-channel
-                                          * protocol b1struct CAPI-2.0
-                                          * profile b1struct capi version 
+                                        * <- after SEND_INIT int32 length
+                                        * byte total length b1struct board
+                                        * driver revision b1struct card
+                                        * type b1struct reserved b1struct
+                                        * serial number b1struct driver
+                                        * capability b1struct d-channel
+                                        * protocol b1struct CAPI-2.0
+                                        * profile b1struct capi version
                                         */
 #define RECEIVE_MESSAGE                0x21    /*
-                                          * <- after SEND_MESSAGE int32
-                                          * AppllID int32 Length capi-data
-                                          * .... 
+                                        * <- after SEND_MESSAGE int32
+                                        * AppllID int32 Length capi-data
+                                        * ....
                                         */
 #define RECEIVE_DATA_B3_IND    0x22    /*
-                                          * received data int32 AppllID
-                                          * int32 Length capi-data ...
-                                          * int32 B3Length data ... 
+                                        * received data int32 AppllID
+                                        * int32 Length capi-data ...
+                                        * int32 B3Length data ...
                                         */
 #define RECEIVE_START          0x23    /*
-                                          * Handshake 
+                                        * Handshake
                                         */
 #define RECEIVE_STOP           0x24    /*
-                                          * Handshake 
+                                        * Handshake
                                         */
 #define RECEIVE_NEW_NCCI       0x25    /*
-                                          * int32 AppllID int32 NCCI int32
-                                          * WindowSize 
+                                        * int32 AppllID int32 NCCI int32
+                                        * WindowSize
                                         */
 #define RECEIVE_FREE_NCCI      0x26    /*
-                                          * int32 AppllID int32 NCCI 
+                                        * int32 AppllID int32 NCCI
                                         */
 #define RECEIVE_RELEASE                0x26    /*
-                                          * int32 AppllID int32 0xffffffff 
+                                        * int32 AppllID int32 0xffffffff
                                         */
 #define RECEIVE_TASK_READY     0x31    /*
-                                          * int32 tasknr
-                                          * int32 Length Taskname ...
+                                        * int32 tasknr
+                                        * int32 Length Taskname ...
                                         */
 #define RECEIVE_DEBUGMSG       0x71    /*
-                                          * int32 Length message
-                                          * 
+                                        * int32 Length message
+                                        *
                                         */
 #define RECEIVE_POLLDWORD      0x75    /* t1pci in dword mode */
 
@@ -264,7 +264,7 @@ static inline void b1_put_byte(unsigned int base, unsigned char val)
 static inline int b1_save_put_byte(unsigned int base, unsigned char val)
 {
        unsigned long stop = jiffies + 2 * HZ;
-       while (!b1_tx_empty(base) && time_before(jiffies,stop));
+       while (!b1_tx_empty(base) && time_before(jiffies, stop));
        if (!b1_tx_empty(base)) return -1;
        b1outp(base, B1_WRITE, val);
        return 0;
@@ -298,21 +298,21 @@ static inline void b1_put_slice(unsigned int base,
 }
 
 static void b1_wr_reg(unsigned int base,
-                      unsigned int reg,
+                     unsigned int reg,
                      unsigned int value)
 {
        b1_put_byte(base, WRITE_REGISTER);
-        b1_put_word(base, reg);
-        b1_put_word(base, value);
+       b1_put_word(base, reg);
+       b1_put_word(base, value);
 }
 
 static inline unsigned int b1_rd_reg(unsigned int base,
-                                     unsigned int reg)
+                                    unsigned int reg)
 {
        b1_put_byte(base, READ_REGISTER);
-        b1_put_word(base, reg);
-        return b1_get_word(base);
-       
+       b1_put_word(base, reg);
+       return b1_get_word(base);
+
 }
 
 static inline void b1_reset(unsigned int base)
@@ -338,13 +338,13 @@ static inline void b1_set_test_bit(unsigned int base,
                                   enum avmcardtype cardtype,
                                   int onoff)
 {
-    b1_wr_reg(base, B1_STAT0(cardtype), onoff ? 0x21 : 0x20);
+       b1_wr_reg(base, B1_STAT0(cardtype), onoff ? 0x21 : 0x20);
 }
 
 static inline int b1_get_test_bit(unsigned int base,
-                                  enum avmcardtype cardtype)
+                                 enum avmcardtype cardtype)
 {
-    return (b1_rd_reg(base, B1_STAT0(cardtype)) & 0x01) != 0;
+       return (b1_rd_reg(base, B1_STAT0(cardtype)) & 0x01) != 0;
 }
 
 /* ---------------------------------------------------------------- */
@@ -391,7 +391,7 @@ static inline void t1outp(unsigned int base,
 }
 
 static inline unsigned char t1inp(unsigned int base,
-                                 unsigned short offset)
+                                 unsigned short offset)
 {
        return inb(base + offset);
 }
@@ -415,42 +415,42 @@ static inline unsigned int t1_get_slice(unsigned int base,
 #endif
 
        len = i = b1_get_word(base);
-        if (t1_isfastlink(base)) {
+       if (t1_isfastlink(base)) {
                int status;
                while (i > 0) {
-                       status = t1_fifostatus(base) & (T1F_IREADY|T1F_IHALF);
+                       status = t1_fifostatus(base) & (T1F_IREADY | T1F_IHALF);
                        if (i >= FIFO_INPBSIZE) status |= T1F_IFULL;
 
                        switch (status) {
-                               case T1F_IREADY|T1F_IHALF|T1F_IFULL:
-                                       insb(base+B1_READ, dp, FIFO_INPBSIZE);
-                                       dp += FIFO_INPBSIZE;
-                                       i -= FIFO_INPBSIZE;
+                       case T1F_IREADY | T1F_IHALF | T1F_IFULL:
+                               insb(base + B1_READ, dp, FIFO_INPBSIZE);
+                               dp += FIFO_INPBSIZE;
+                               i -= FIFO_INPBSIZE;
 #ifdef FASTLINK_DEBUG
-                                       wcnt += FIFO_INPBSIZE;
+                               wcnt += FIFO_INPBSIZE;
 #endif
-                                       break;
-                               case T1F_IREADY|T1F_IHALF: 
-                                       insb(base+B1_READ,dp, i);
+                               break;
+                       case T1F_IREADY | T1F_IHALF:
+                               insb(base + B1_READ, dp, i);
 #ifdef FASTLINK_DEBUG
-                                       wcnt += i;
+                               wcnt += i;
 #endif
-                                       dp += i;
-                                       i = 0;
-                                       break;
-                               default:
-                                       *dp++ = b1_get_byte(base);
-                                       i--;
+                               dp += i;
+                               i = 0;
+                               break;
+                       default:
+                               *dp++ = b1_get_byte(base);
+                               i--;
 #ifdef FASTLINK_DEBUG
-                                       bcnt++;
+                               bcnt++;
 #endif
-                                       break;
+                               break;
                        }
-           }
+               }
 #ifdef FASTLINK_DEBUG
-           if (wcnt)
-           printk(KERN_DEBUG "b1lli(0x%x): get_slice l=%d w=%d b=%d\n",
-                               base, len, wcnt, bcnt);
+               if (wcnt)
+                       printk(KERN_DEBUG "b1lli(0x%x): get_slice l=%d w=%d b=%d\n",
+                              base, len, wcnt, bcnt);
 #endif
        } else {
                while (i-- > 0)
@@ -464,26 +464,26 @@ static inline void t1_put_slice(unsigned int base,
 {
        unsigned i = len;
        b1_put_word(base, i);
-        if (t1_isfastlink(base)) {
+       if (t1_isfastlink(base)) {
                int status;
                while (i > 0) {
-                       status = t1_fifostatus(base) & (T1F_OREADY|T1F_OHALF);
+                       status = t1_fifostatus(base) & (T1F_OREADY | T1F_OHALF);
                        if (i >= FIFO_OUTBSIZE) status |= T1F_OEMPTY;
                        switch (status) {
-                               case T1F_OREADY|T1F_OHALF|T1F_OEMPTY: 
-                                       outsb(base+B1_WRITE, dp, FIFO_OUTBSIZE);
-                                       dp += FIFO_OUTBSIZE;
-                                       i -= FIFO_OUTBSIZE;
-                                       break;
-                               case T1F_OREADY|T1F_OHALF: 
-                                       outsb(base+B1_WRITE, dp, i);
-                                       dp += i;
-                                       i = 0;
-                                       break;
-                               default:
-                                       b1_put_byte(base, *dp++);
-                                       i--;
-                                       break;
+                       case T1F_OREADY | T1F_OHALF | T1F_OEMPTY:
+                               outsb(base + B1_WRITE, dp, FIFO_OUTBSIZE);
+                               dp += FIFO_OUTBSIZE;
+                               i -= FIFO_OUTBSIZE;
+                               break;
+                       case T1F_OREADY | T1F_OHALF:
+                               outsb(base + B1_WRITE, dp, i);
+                               dp += i;
+                               i = 0;
+                               break;
+                       default:
+                               b1_put_byte(base, *dp++);
+                               i--;
+                               break;
                        }
                }
        } else {
@@ -494,18 +494,18 @@ static inline void t1_put_slice(unsigned int base,
 
 static inline void t1_disable_irq(unsigned int base)
 {
-      t1outp(base, T1_IRQMASTER, 0x00);
+       t1outp(base, T1_IRQMASTER, 0x00);
 }
 
 static inline void t1_reset(unsigned int base)
 {
-        /* reset T1 Controller */
-        b1_reset(base);
-        /* disable irq on HEMA */
-        t1outp(base, B1_INSTAT, 0x00);
-        t1outp(base, B1_OUTSTAT, 0x00);
-        t1outp(base, T1_IRQMASTER, 0x00);
-        /* reset HEMA board configuration */
+       /* reset T1 Controller */
+       b1_reset(base);
+       /* disable irq on HEMA */
+       t1outp(base, B1_INSTAT, 0x00);
+       t1outp(base, B1_OUTSTAT, 0x00);
+       t1outp(base, T1_IRQMASTER, 0x00);
+       /* reset HEMA board configuration */
        t1outp(base, T1_RESETBOARD, 0xf);
 }
 
@@ -513,29 +513,29 @@ static inline void b1_setinterrupt(unsigned int base, unsigned irq,
                                   enum avmcardtype cardtype)
 {
        switch (cardtype) {
-          case avm_t1isa:
-              t1outp(base, B1_INSTAT, 0x00);
-              t1outp(base, B1_INSTAT, 0x02);
-             t1outp(base, T1_IRQMASTER, 0x08);
-             break;
-          case avm_b1isa:
-             b1outp(base, B1_INSTAT, 0x00);
-             b1outp(base, B1_RESET, b1_irq_table[irq]);
-             b1outp(base, B1_INSTAT, 0x02);
-             break;
-          default:
-          case avm_m1:
-          case avm_m2:
-          case avm_b1pci:
-             b1outp(base, B1_INSTAT, 0x00);
-             b1outp(base, B1_RESET, 0xf0);
-             b1outp(base, B1_INSTAT, 0x02);
-             break;
-          case avm_c4:
-          case avm_t1pci:
-             b1outp(base, B1_RESET, 0xf0);
-             break;
-        }
+       case avm_t1isa:
+               t1outp(base, B1_INSTAT, 0x00);
+               t1outp(base, B1_INSTAT, 0x02);
+               t1outp(base, T1_IRQMASTER, 0x08);
+               break;
+       case avm_b1isa:
+               b1outp(base, B1_INSTAT, 0x00);
+               b1outp(base, B1_RESET, b1_irq_table[irq]);
+               b1outp(base, B1_INSTAT, 0x02);
+               break;
+       default:
+       case avm_m1:
+       case avm_m2:
+       case avm_b1pci:
+               b1outp(base, B1_INSTAT, 0x00);
+               b1outp(base, B1_RESET, 0xf0);
+               b1outp(base, B1_INSTAT, 0x02);
+               break;
+       case avm_c4:
+       case avm_t1pci:
+               b1outp(base, B1_RESET, 0xf0);
+               break;
+       }
 }
 
 /* b1.c */
@@ -543,14 +543,14 @@ avmcard *b1_alloc_card(int nr_controllers);
 void b1_free_card(avmcard *card);
 int b1_detect(unsigned int base, enum avmcardtype cardtype);
 void b1_getrevision(avmcard *card);
-int b1_load_t4file(avmcard *card, capiloaddatapart * t4file);
-int b1_load_config(avmcard *card, capiloaddatapart * config);
+int b1_load_t4file(avmcard *card, capiloaddatapart *t4file);
+int b1_load_config(avmcard *card, capiloaddatapart *config);
 int b1_loaded(avmcard *card);
 
 int b1_load_firmware(struct capi_ctr *ctrl, capiloaddata *data);
 void b1_reset_ctr(struct capi_ctr *ctrl);
 void b1_register_appl(struct capi_ctr *ctrl, u16 appl,
-                               capi_register_params *rp);
+                     capi_register_params *rp);
 void b1_release_appl(struct capi_ctr *ctrl, u16 appl);
 u16  b1_send_message(struct capi_ctr *ctrl, struct sk_buff *skb);
 void b1_parse_version(avmctrl_info *card);
@@ -572,8 +572,8 @@ int b1dma_load_firmware(struct capi_ctr *ctrl, capiloaddata *data);
 void b1dma_reset_ctr(struct capi_ctr *ctrl);
 void b1dma_remove_ctr(struct capi_ctr *ctrl);
 void b1dma_register_appl(struct capi_ctr *ctrl,
-                               u16 appl,
-                               capi_register_params *rp);
+                        u16 appl,
+                        capi_register_params *rp);
 void b1dma_release_appl(struct capi_ctr *ctrl, u16 appl);
 u16  b1dma_send_message(struct capi_ctr *ctrl, struct sk_buff *skb);
 extern const struct file_operations b1dmactl_proc_fops;
index 2a57da5..821f7ac 100644 (file)
@@ -1,7 +1,7 @@
 /* $Id: b1.c,v 1.1.2.2 2004/01/16 21:09:27 keil Exp $
- * 
+ *
  * Common module for AVM B1 cards.
- * 
+ *
  * Copyright 1999 by Carsten Paeth <calle@calle.de>
  *
  * This software may be used and distributed according to the terms
@@ -60,7 +60,7 @@ int b1_irq_table[16] =
  112,                          /* irq 15 */
 };
 
-/* ------------------------------------------------------------- */    
+/* ------------------------------------------------------------- */
 
 avmcard *b1_alloc_card(int nr_controllers)
 {
@@ -104,13 +104,13 @@ int b1_detect(unsigned int base, enum avmcardtype cardtype)
        int onoff, i;
 
        /*
-        * Statusregister 0000 00xx 
+        * Statusregister 0000 00xx
         */
        if ((inb(base + B1_INSTAT) & 0xfc)
            || (inb(base + B1_OUTSTAT) & 0xfc))
                return 1;
        /*
-        * Statusregister 0000 001x 
+        * Statusregister 0000 001x
         */
        b1outp(base, B1_INSTAT, 0x2);   /* enable irq */
        /* b1outp(base, B1_OUTSTAT, 0x2); */
@@ -118,38 +118,38 @@ int b1_detect(unsigned int base, enum avmcardtype cardtype)
            /* || (inb(base + B1_OUTSTAT) & 0xfe) != 0x2 */)
                return 2;
        /*
-        * Statusregister 0000 000x 
+        * Statusregister 0000 000x
         */
        b1outp(base, B1_INSTAT, 0x0);   /* disable irq */
        b1outp(base, B1_OUTSTAT, 0x0);
        if ((inb(base + B1_INSTAT) & 0xfe)
            || (inb(base + B1_OUTSTAT) & 0xfe))
                return 3;
-        
-       for (onoff = !0, i= 0; i < 10 ; i++) {
+
+       for (onoff = !0, i = 0; i < 10; i++) {
                b1_set_test_bit(base, cardtype, onoff);
                if (b1_get_test_bit(base, cardtype) != onoff)
-                  return 4;
+                       return 4;
                onoff = !onoff;
        }
 
        if (cardtype == avm_m1)
-          return 0;
+               return 0;
 
-        if ((b1_rd_reg(base, B1_STAT1(cardtype)) & 0x0f) != 0x01)
-          return 5;
+       if ((b1_rd_reg(base, B1_STAT1(cardtype)) & 0x0f) != 0x01)
+               return 5;
 
        return 0;
 }
 
 void b1_getrevision(avmcard *card)
 {
-    card->class = inb(card->port + B1_ANALYSE);
-    card->revision = inb(card->port + B1_REVISION);
+       card->class = inb(card->port + B1_ANALYSE);
+       card->revision = inb(card->port + B1_REVISION);
 }
 
 #define FWBUF_SIZE     256
-int b1_load_t4file(avmcard *card, capiloaddatapart * t4file)
+int b1_load_t4file(avmcard *card, capiloaddatapart *t4file)
 {
        unsigned char buf[FWBUF_SIZE];
        unsigned char *dp;
@@ -168,7 +168,7 @@ int b1_load_t4file(avmcard *card, capiloaddatapart * t4file)
                for (i = 0; i < FWBUF_SIZE; i++)
                        if (b1_save_put_byte(base, buf[i]) < 0) {
                                printk(KERN_ERR "%s: corrupted firmware file ?\n",
-                                               card->name);
+                                      card->name);
                                return -EIO;
                        }
                left -= FWBUF_SIZE;
@@ -184,14 +184,14 @@ int b1_load_t4file(avmcard *card, capiloaddatapart * t4file)
                for (i = 0; i < left; i++)
                        if (b1_save_put_byte(base, buf[i]) < 0) {
                                printk(KERN_ERR "%s: corrupted firmware file ?\n",
-                                               card->name);
+                                      card->name);
                                return -EIO;
                        }
        }
        return 0;
 }
 
-int b1_load_config(avmcard *card, capiloaddatapart * config)
+int b1_load_config(avmcard *card, capiloaddatapart *config)
 {
        unsigned char buf[FWBUF_SIZE];
        unsigned char *dp;
@@ -202,9 +202,9 @@ int b1_load_config(avmcard *card, capiloaddatapart * config)
        left = config->len;
        if (left) {
                b1_put_byte(base, SEND_CONFIG);
-               b1_put_word(base, 1);
+               b1_put_word(base, 1);
                b1_put_byte(base, SEND_CONFIG);
-               b1_put_word(base, left);
+               b1_put_word(base, left);
        }
        while (left > FWBUF_SIZE) {
                if (config->user) {
@@ -215,7 +215,7 @@ int b1_load_config(avmcard *card, capiloaddatapart * config)
                }
                for (i = 0; i < FWBUF_SIZE; ) {
                        b1_put_byte(base, SEND_CONFIG);
-                       for (j=0; j < 4; j++) {
+                       for (j = 0; j < 4; j++) {
                                b1_put_byte(base, buf[i++]);
                        }
                }
@@ -231,7 +231,7 @@ int b1_load_config(avmcard *card, capiloaddatapart * config)
                }
                for (i = 0; i < left; ) {
                        b1_put_byte(base, SEND_CONFIG);
-                       for (j=0; j < 4; j++) {
+                       for (j = 0; j < 4; j++) {
                                if (i < left)
                                        b1_put_byte(base, buf[i++]);
                                else
@@ -255,7 +255,7 @@ int b1_loaded(avmcard *card)
        }
        if (!b1_tx_empty(base)) {
                printk(KERN_ERR "%s: b1_loaded: tx err, corrupted t4 file ?\n",
-                               card->name);
+                      card->name);
                return 0;
        }
        b1_put_byte(base, SEND_POLL);
@@ -265,7 +265,7 @@ int b1_loaded(avmcard *card)
                                return 1;
                        }
                        printk(KERN_ERR "%s: b1_loaded: got 0x%x, firmware not running\n",
-                                       card->name, ans);
+                              card->name, ans);
                        return 0;
                }
        }
@@ -288,7 +288,7 @@ int b1_load_firmware(struct capi_ctr *ctrl, capiloaddata *data)
        if ((retval = b1_load_t4file(card, &data->firmware))) {
                b1_reset(port);
                printk(KERN_ERR "%s: failed to load t4file!!\n",
-                                       card->name);
+                      card->name);
                return retval;
        }
 
@@ -298,7 +298,7 @@ int b1_load_firmware(struct capi_ctr *ctrl, capiloaddata *data)
                if ((retval = b1_load_config(card, &data->configuration))) {
                        b1_reset(port);
                        printk(KERN_ERR "%s: failed to load config!!\n",
-                                       card->name);
+                              card->name);
                        return retval;
                }
        }
@@ -312,7 +312,7 @@ int b1_load_firmware(struct capi_ctr *ctrl, capiloaddata *data)
        b1_setinterrupt(port, card->irq, card->cardtype);
        b1_put_byte(port, SEND_INIT);
        b1_put_word(port, CAPI_MAXAPPL);
-       b1_put_word(port, AVM_NCCI_PER_CHANNEL*2);
+       b1_put_word(port, AVM_NCCI_PER_CHANNEL * 2);
        b1_put_word(port, ctrl->cnr - 1);
        spin_unlock_irqrestore(&card->lock, flags);
 
@@ -337,8 +337,8 @@ void b1_reset_ctr(struct capi_ctr *ctrl)
 }
 
 void b1_register_appl(struct capi_ctr *ctrl,
-                               u16 appl,
-                               capi_register_params *rp)
+                     u16 appl,
+                     capi_register_params *rp)
 {
        avmctrl_info *cinfo = (avmctrl_info *)(ctrl->driverdata);
        avmcard *card = cinfo->card;
@@ -353,7 +353,7 @@ void b1_register_appl(struct capi_ctr *ctrl,
        spin_lock_irqsave(&card->lock, flags);
        b1_put_byte(port, SEND_REGISTER);
        b1_put_word(port, appl);
-       b1_put_word(port, 1024 * (nconn+1));
+       b1_put_word(port, 1024 * (nconn + 1));
        b1_put_word(port, nconn);
        b1_put_word(port, rp->datablkcnt);
        b1_put_word(port, rp->datablklen);
@@ -430,7 +430,7 @@ void b1_parse_version(avmctrl_info *cinfo)
                cinfo->version[j] = &cinfo->versionbuf[i + 1];
 
        strlcpy(ctrl->serial, cinfo->version[VER_SERIAL], sizeof(ctrl->serial));
-       memcpy(&ctrl->profile, cinfo->version[VER_PROFILE],sizeof(capi_profile));
+       memcpy(&ctrl->profile, cinfo->version[VER_PROFILE], sizeof(capi_profile));
        strlcpy(ctrl->manu, "AVM GmbH", sizeof(ctrl->manu));
        dversion = cinfo->version[VER_DRIVER];
        ctrl->version.majorversion = 2;
@@ -439,49 +439,49 @@ void b1_parse_version(avmctrl_info *cinfo)
        ctrl->version.majormanuversion |= ((dversion[2] - '0') & 0xf);
        ctrl->version.minormanuversion = (dversion[3] - '0') << 4;
        ctrl->version.minormanuversion |=
-                       (dversion[5] - '0') * 10 + ((dversion[6] - '0') & 0xf);
+               (dversion[5] - '0') * 10 + ((dversion[6] - '0') & 0xf);
 
        profp = &ctrl->profile;
 
        flag = ((u8 *)(profp->manu))[1];
        switch (flag) {
        case 0: if (cinfo->version[VER_CARDTYPE])
-                  strcpy(cinfo->cardname, cinfo->version[VER_CARDTYPE]);
-               else strcpy(cinfo->cardname, "B1");
+                       strcpy(cinfo->cardname, cinfo->version[VER_CARDTYPE]);
+               else strcpy(cinfo->cardname, "B1");
                break;
-       case 3: strcpy(cinfo->cardname,"PCMCIA B"); break;
-       case 4: strcpy(cinfo->cardname,"PCMCIA M1"); break;
-       case 5: strcpy(cinfo->cardname,"PCMCIA M2"); break;
-       case 6: strcpy(cinfo->cardname,"B1 V3.0"); break;
-       case 7: strcpy(cinfo->cardname,"B1 PCI"); break;
+       case 3: strcpy(cinfo->cardname, "PCMCIA B"); break;
+       case 4: strcpy(cinfo->cardname, "PCMCIA M1"); break;
+       case 5: strcpy(cinfo->cardname, "PCMCIA M2"); break;
+       case 6: strcpy(cinfo->cardname, "B1 V3.0"); break;
+       case 7: strcpy(cinfo->cardname, "B1 PCI"); break;
        default: sprintf(cinfo->cardname, "AVM?%u", (unsigned int)flag); break;
-        }
-        printk(KERN_NOTICE "%s: card %d \"%s\" ready.\n",
-                               card->name, ctrl->cnr, cinfo->cardname);
+       }
+       printk(KERN_NOTICE "%s: card %d \"%s\" ready.\n",
+              card->name, ctrl->cnr, cinfo->cardname);
 
-        flag = ((u8 *)(profp->manu))[3];
-        if (flag)
+       flag = ((u8 *)(profp->manu))[3];
+       if (flag)
                printk(KERN_NOTICE "%s: card %d Protocol:%s%s%s%s%s%s%s\n",
-                       card->name,
-                       ctrl->cnr,
-                       (flag & 0x01) ? " DSS1" : "",
-                       (flag & 0x02) ? " CT1" : "",
-                       (flag & 0x04) ? " VN3" : "",
-                       (flag & 0x08) ? " NI1" : "",
-                       (flag & 0x10) ? " AUSTEL" : "",
-                       (flag & 0x20) ? " ESS" : "",
-                       (flag & 0x40) ? " 1TR6" : ""
+                      card->name,
+                      ctrl->cnr,
+                      (flag & 0x01) ? " DSS1" : "",
+                      (flag & 0x02) ? " CT1" : "",
+                      (flag & 0x04) ? " VN3" : "",
+                      (flag & 0x08) ? " NI1" : "",
+                      (flag & 0x10) ? " AUSTEL" : "",
+                      (flag & 0x20) ? " ESS" : "",
+                      (flag & 0x40) ? " 1TR6" : ""
                        );
 
-        flag = ((u8 *)(profp->manu))[5];
+       flag = ((u8 *)(profp->manu))[5];
        if (flag)
                printk(KERN_NOTICE "%s: card %d Linetype:%s%s%s%s\n",
-                       card->name,
-                       ctrl->cnr,
-                       (flag & 0x01) ? " point to point" : "",
-                       (flag & 0x02) ? " point to multipoint" : "",
-                       (flag & 0x08) ? " leased line without D-channel" : "",
-                       (flag & 0x04) ? " leased line with D-channel" : ""
+                      card->name,
+                      ctrl->cnr,
+                      (flag & 0x01) ? " point to point" : "",
+                      (flag & 0x02) ? " point to multipoint" : "",
+                      (flag & 0x08) ? " leased line without D-channel" : "",
+                      (flag & 0x04) ? " leased line with D-channel" : ""
                        );
 }
 
@@ -521,13 +521,13 @@ irqreturn_t b1_interrupt(int interrupt, void *devptr)
                spin_unlock_irqrestore(&card->lock, flags);
 
                if (MsgLen < 30) { /* not CAPI 64Bit */
-                       memset(card->msgbuf+MsgLen, 0, 30-MsgLen);
+                       memset(card->msgbuf + MsgLen, 0, 30-MsgLen);
                        MsgLen = 30;
                        CAPIMSG_SETLEN(card->msgbuf, 30);
                }
                if (!(skb = alloc_skb(DataB3Len + MsgLen, GFP_ATOMIC))) {
                        printk(KERN_ERR "%s: incoming packet dropped\n",
-                                       card->name);
+                              card->name);
                } else {
                        memcpy(skb_put(skb, MsgLen), card->msgbuf, MsgLen);
                        memcpy(skb_put(skb, DataB3Len), card->databuf, DataB3Len);
@@ -541,7 +541,7 @@ irqreturn_t b1_interrupt(int interrupt, void *devptr)
                MsgLen = b1_get_slice(card->port, card->msgbuf);
                if (!(skb = alloc_skb(MsgLen, GFP_ATOMIC))) {
                        printk(KERN_ERR "%s: incoming packet dropped\n",
-                                       card->name);
+                              card->name);
                        spin_unlock_irqrestore(&card->lock, flags);
                } else {
                        memcpy(skb_put(skb, MsgLen), card->msgbuf, MsgLen);
@@ -573,7 +573,7 @@ irqreturn_t b1_interrupt(int interrupt, void *devptr)
                break;
 
        case RECEIVE_START:
-               /* b1_put_byte(card->port, SEND_POLLACK); */
+               /* b1_put_byte(card->port, SEND_POLLACK); */
                spin_unlock_irqrestore(&card->lock, flags);
                capi_ctr_resume_output(ctrl);
                break;
@@ -600,24 +600,24 @@ irqreturn_t b1_interrupt(int interrupt, void *devptr)
                MsgLen = b1_get_slice(card->port, card->msgbuf);
                spin_unlock_irqrestore(&card->lock, flags);
                card->msgbuf[MsgLen] = 0;
-               while (    MsgLen > 0
-                      && (   card->msgbuf[MsgLen-1] == '\n'
-                          || card->msgbuf[MsgLen-1] == '\r')) {
-                       card->msgbuf[MsgLen-1] = 0;
+               while (MsgLen > 0
+                      && (card->msgbuf[MsgLen - 1] == '\n'
+                          || card->msgbuf[MsgLen - 1] == '\r')) {
+                       card->msgbuf[MsgLen - 1] = 0;
                        MsgLen--;
                }
                printk(KERN_INFO "%s: task %d \"%s\" ready.\n",
-                               card->name, ApplId, card->msgbuf);
+                      card->name, ApplId, card->msgbuf);
                break;
 
        case RECEIVE_DEBUGMSG:
                MsgLen = b1_get_slice(card->port, card->msgbuf);
                spin_unlock_irqrestore(&card->lock, flags);
                card->msgbuf[MsgLen] = 0;
-               while (    MsgLen > 0
-                      && (   card->msgbuf[MsgLen-1] == '\n'
-                          || card->msgbuf[MsgLen-1] == '\r')) {
-                       card->msgbuf[MsgLen-1] = 0;
+               while (MsgLen > 0
+                      && (card->msgbuf[MsgLen - 1] == '\n'
+                          || card->msgbuf[MsgLen - 1] == '\r')) {
+                       card->msgbuf[MsgLen - 1] = 0;
                        MsgLen--;
                }
                printk(KERN_INFO "%s: DEBUG: %s\n", card->name, card->msgbuf);
@@ -630,7 +630,7 @@ irqreturn_t b1_interrupt(int interrupt, void *devptr)
        default:
                spin_unlock_irqrestore(&card->lock, flags);
                printk(KERN_ERR "%s: b1_interrupt: 0x%x ???\n",
-                               card->name, b1cmd);
+                      card->name, b1cmd);
                return IRQ_HANDLED;
        }
        return IRQ_HANDLED;
@@ -671,29 +671,29 @@ static int b1ctl_proc_show(struct seq_file *m, void *v)
                seq_printf(m, "%-16s %s\n", "ver_serial", s);
 
        if (card->cardtype != avm_m1) {
-               flag = ((u8 *)(ctrl->profile.manu))[3];
-               if (flag)
+               flag = ((u8 *)(ctrl->profile.manu))[3];
+               if (flag)
                        seq_printf(m, "%-16s%s%s%s%s%s%s%s\n",
-                       "protocol",
-                       (flag & 0x01) ? " DSS1" : "",
-                       (flag & 0x02) ? " CT1" : "",
-                       (flag & 0x04) ? " VN3" : "",
-                       (flag & 0x08) ? " NI1" : "",
-                       (flag & 0x10) ? " AUSTEL" : "",
-                       (flag & 0x20) ? " ESS" : "",
-                       (flag & 0x40) ? " 1TR6" : ""
-                       );
+                                  "protocol",
+                                  (flag & 0x01) ? " DSS1" : "",
+                                  (flag & 0x02) ? " CT1" : "",
+                                  (flag & 0x04) ? " VN3" : "",
+                                  (flag & 0x08) ? " NI1" : "",
+                                  (flag & 0x10) ? " AUSTEL" : "",
+                                  (flag & 0x20) ? " ESS" : "",
+                                  (flag & 0x40) ? " 1TR6" : ""
+                               );
        }
        if (card->cardtype != avm_m1) {
-               flag = ((u8 *)(ctrl->profile.manu))[5];
+               flag = ((u8 *)(ctrl->profile.manu))[5];
                if (flag)
                        seq_printf(m, "%-16s%s%s%s%s\n",
-                       "linetype",
-                       (flag & 0x01) ? " point to point" : "",
-                       (flag & 0x02) ? " point to multipoint" : "",
-                       (flag & 0x08) ? " leased line without D-channel" : "",
-                       (flag & 0x04) ? " leased line with D-channel" : ""
-                       );
+                                  "linetype",
+                                  (flag & 0x01) ? " point to point" : "",
+                                  (flag & 0x02) ? " point to multipoint" : "",
+                                  (flag & 0x08) ? " leased line without D-channel" : "",
+                                  (flag & 0x04) ? " leased line with D-channel" : ""
+                               );
        }
        seq_printf(m, "%-16s %s\n", "cardname", cinfo->cardname);
 
@@ -750,12 +750,12 @@ avmcard_dma_alloc(char *name, struct pci_dev *pdev, long rsize, long ssize)
 
        return p;
 
- err_free_consistent:
+err_free_consistent:
        pci_free_consistent(p->pcidev, p->recvbuf.size,
                            p->recvbuf.dmabuf, p->recvbuf.dmaaddr);
- err_kfree:
+err_kfree:
        kfree(p);
- err:
+err:
        return NULL;
 }
 
@@ -800,7 +800,7 @@ static int __init b1_init(void)
        if ((p = strchr(revision, ':')) != NULL && p[1]) {
                strlcpy(rev, p + 2, 32);
                if ((p = strchr(rev, '$')) != NULL && p > rev)
-                  *(p-1) = 0;
+                       *(p - 1) = 0;
        } else
                strcpy(rev, "1.0");
 
index a0ed668..0896aa8 100644 (file)
@@ -1,9 +1,9 @@
 /* $Id: b1dma.c,v 1.1.2.3 2004/02/10 01:07:12 keil Exp $
- * 
+ *
  * Common module for AVM B1 cards that support dma with AMCC
- * 
+ *
  * Copyright 2000 by Carsten Paeth <calle@calle.de>
- * 
+ *
  * This software may be used and distributed according to the terms
  * of the GNU General Public License, incorporated herein by reference.
  *
@@ -110,11 +110,11 @@ static int b1dma_tolink(avmcard *card, void *buf, unsigned int len)
        unsigned long stop = jiffies + 1 * HZ;  /* maximum wait time 1 sec */
        unsigned char *s = (unsigned char *)buf;
        while (len--) {
-               while (   !b1dma_tx_empty(card->port)
+               while (!b1dma_tx_empty(card->port)
                       && time_before(jiffies, stop));
-               if (!b1dma_tx_empty(card->port)) 
+               if (!b1dma_tx_empty(card->port))
                        return -1;
-               t1outp(card->port, 0x01, *s++);
+               t1outp(card->port, 0x01, *s++);
        }
        return 0;
 }
@@ -124,11 +124,11 @@ static int b1dma_fromlink(avmcard *card, void *buf, unsigned int len)
        unsigned long stop = jiffies + 1 * HZ;  /* maximum wait time 1 sec */
        unsigned char *s = (unsigned char *)buf;
        while (len--) {
-               while (   !b1dma_rx_full(card->port)
+               while (!b1dma_rx_full(card->port)
                       && time_before(jiffies, stop));
-               if (!b1dma_rx_full(card->port)) 
+               if (!b1dma_rx_full(card->port))
                        return -1;
-               *s++ = t1inp(card->port, 0x00);
+               *s++ = t1inp(card->port, 0x00);
        }
        return 0;
 }
@@ -136,7 +136,7 @@ static int b1dma_fromlink(avmcard *card, void *buf, unsigned int len)
 static int WriteReg(avmcard *card, u32 reg, u8 val)
 {
        u8 cmd = 0x00;
-       if (   b1dma_tolink(card, &cmd, 1) == 0
+       if (b1dma_tolink(card, &cmd, 1) == 0
            && b1dma_tolink(card, &reg, 4) == 0) {
                u32 tmp = val;
                return b1dma_tolink(card, &tmp, 4);
@@ -147,7 +147,7 @@ static int WriteReg(avmcard *card, u32 reg, u8 val)
 static u8 ReadReg(avmcard *card, u32 reg)
 {
        u8 cmd = 0x01;
-       if (   b1dma_tolink(card, &cmd, 1) == 0
+       if (b1dma_tolink(card, &cmd, 1) == 0
            && b1dma_tolink(card, &reg, 4) == 0) {
                u32 tmp;
                if (b1dma_fromlink(card, &tmp, 4) == 0)
@@ -258,30 +258,30 @@ static int b1dma_detect(avmcard *card)
 
        b1dma_writel(card, 0xffffffff, AMCC_RXPTR);
        b1dma_writel(card, 0xffffffff, AMCC_TXPTR);
-       if (   b1dma_readl(card, AMCC_RXPTR) != 0xfffffffc
+       if (b1dma_readl(card, AMCC_RXPTR) != 0xfffffffc
            || b1dma_readl(card, AMCC_TXPTR) != 0xfffffffc)
                return 2;
 
        b1dma_writel(card, 0x0, AMCC_RXPTR);
        b1dma_writel(card, 0x0, AMCC_TXPTR);
-       if (   b1dma_readl(card, AMCC_RXPTR) != 0x0
+       if (b1dma_readl(card, AMCC_RXPTR) != 0x0
            || b1dma_readl(card, AMCC_TXPTR) != 0x0)
                return 3;
 
        t1outp(card->port, 0x10, 0x00);
        t1outp(card->port, 0x07, 0x00);
-       
+
        t1outp(card->port, 0x02, 0x02);
        t1outp(card->port, 0x03, 0x02);
 
-       if (   (t1inp(card->port, 0x02) & 0xFE) != 0x02
+       if ((t1inp(card->port, 0x02) & 0xFE) != 0x02
            || t1inp(card->port, 0x3) != 0x03)
                return 4;
 
        t1outp(card->port, 0x02, 0x00);
        t1outp(card->port, 0x03, 0x00);
 
-       if (   (t1inp(card->port, 0x02) & 0xFE) != 0x00
+       if ((t1inp(card->port, 0x02) & 0xFE) != 0x00
            || t1inp(card->port, 0x3) != 0x01)
                return 5;
 
@@ -294,28 +294,28 @@ int t1pci_detect(avmcard *card)
 
        if ((ret = b1dma_detect(card)) != 0)
                return ret;
-       
+
        /* Transputer test */
-       
-       if (   WriteReg(card, 0x80001000, 0x11) != 0
+
+       if (WriteReg(card, 0x80001000, 0x11) != 0
            || WriteReg(card, 0x80101000, 0x22) != 0
            || WriteReg(card, 0x80201000, 0x33) != 0
            || WriteReg(card, 0x80301000, 0x44) != 0)
                return 6;
 
-       if (   ReadReg(card, 0x80001000) != 0x11
+       if (ReadReg(card, 0x80001000) != 0x11
            || ReadReg(card, 0x80101000) != 0x22
            || ReadReg(card, 0x80201000) != 0x33
            || ReadReg(card, 0x80301000) != 0x44)
                return 7;
 
-       if (   WriteReg(card, 0x80001000, 0x55) != 0
+       if (WriteReg(card, 0x80001000, 0x55) != 0
            || WriteReg(card, 0x80101000, 0x66) != 0
            || WriteReg(card, 0x80201000, 0x77) != 0
            || WriteReg(card, 0x80301000, 0x88) != 0)
                return 8;
 
-       if (   ReadReg(card, 0x80001000) != 0x55
+       if (ReadReg(card, 0x80001000) != 0x55
            || ReadReg(card, 0x80101000) != 0x66
            || ReadReg(card, 0x80201000) != 0x77
            || ReadReg(card, 0x80301000) != 0x88)
@@ -330,20 +330,20 @@ int b1pciv4_detect(avmcard *card)
 
        if ((ret = b1dma_detect(card)) != 0)
                return ret;
-       
-       for (i=0; i < 5 ; i++) {
+
+       for (i = 0; i < 5; i++) {
                if (WriteReg(card, 0x80A00000, 0x21) != 0)
                        return 6;
                if ((ReadReg(card, 0x80A00000) & 0x01) != 0x01)
                        return 7;
        }
-       for (i=0; i < 5 ; i++) {
+       for (i = 0; i < 5; i++) {
                if (WriteReg(card, 0x80A00000, 0x20) != 0)
                        return 8;
                if ((ReadReg(card, 0x80A00000) & 0x01) != 0x00)
                        return 9;
        }
-       
+
        return 0;
 }
 
@@ -373,7 +373,7 @@ static void b1dma_dispatch_tx(avmcard *card)
        u16 len;
        u32 txlen;
        void *p;
-       
+
        skb = skb_dequeue(&dma->send_queue);
 
        len = CAPIMSG_LEN(skb->data);
@@ -398,13 +398,13 @@ static void b1dma_dispatch_tx(avmcard *card)
                printk(KERN_DEBUG "tx: put msg len=%d\n", txlen);
 #endif
        } else {
-               txlen = skb->len-2;
+               txlen = skb->len - 2;
 #ifdef AVM_B1DMA_POLLDEBUG
                if (skb->data[2] == SEND_POLLACK)
                        printk(KERN_INFO "%s: send ack\n", card->name);
 #endif
 #ifdef AVM_B1DMA_DEBUG
-               printk(KERN_DEBUG "tx: put 0x%x len=%d\n", 
+               printk(KERN_DEBUG "tx: put 0x%x len=%d\n",
                       skb->data[2], txlen);
 #endif
                skb_copy_from_linear_data_offset(skb, 2, dma->sendbuf.dmabuf,
@@ -430,7 +430,7 @@ static void queue_pollack(avmcard *card)
        skb = alloc_skb(3, GFP_ATOMIC);
        if (!skb) {
                printk(KERN_CRIT "%s: no memory, lost poll ack\n",
-                                       card->name);
+                      card->name);
                return;
        }
        p = skb->data;
@@ -450,14 +450,14 @@ static void b1dma_handle_rx(avmcard *card)
        avmcard_dmainfo *dma = card->dma;
        struct capi_ctr *ctrl = &cinfo->capi_ctrl;
        struct sk_buff *skb;
-       void *p = dma->recvbuf.dmabuf+4;
+       void *p = dma->recvbuf.dmabuf + 4;
        u32 ApplId, MsgLen, DataB3Len, NCCI, WindowSize;
        u8 b1cmd =  _get_byte(&p);
 
 #ifdef AVM_B1DMA_DEBUG
        printk(KERN_DEBUG "rx: 0x%x %lu\n", b1cmd, (unsigned long)dma->recvlen);
 #endif
-       
+
        switch (b1cmd) {
        case RECEIVE_DATA_B3_IND:
 
@@ -466,13 +466,13 @@ static void b1dma_handle_rx(avmcard *card)
                DataB3Len = _get_slice(&p, card->databuf);
 
                if (MsgLen < 30) { /* not CAPI 64Bit */
-                       memset(card->msgbuf+MsgLen, 0, 30-MsgLen);
+                       memset(card->msgbuf + MsgLen, 0, 30 - MsgLen);
                        MsgLen = 30;
                        CAPIMSG_SETLEN(card->msgbuf, 30);
                }
-               if (!(skb = alloc_skb(DataB3Len+MsgLen, GFP_ATOMIC))) {
+               if (!(skb = alloc_skb(DataB3Len + MsgLen, GFP_ATOMIC))) {
                        printk(KERN_ERR "%s: incoming packet dropped\n",
-                                       card->name);
+                              card->name);
                } else {
                        memcpy(skb_put(skb, MsgLen), card->msgbuf, MsgLen);
                        memcpy(skb_put(skb, DataB3Len), card->databuf, DataB3Len);
@@ -486,14 +486,14 @@ static void b1dma_handle_rx(avmcard *card)
                MsgLen = _get_slice(&p, card->msgbuf);
                if (!(skb = alloc_skb(MsgLen, GFP_ATOMIC))) {
                        printk(KERN_ERR "%s: incoming packet dropped\n",
-                                       card->name);
+                              card->name);
                } else {
                        memcpy(skb_put(skb, MsgLen), card->msgbuf, MsgLen);
                        if (CAPIMSG_CMD(skb->data) == CAPI_DATA_B3_CONF) {
                                spin_lock(&card->lock);
                                capilib_data_b3_conf(&cinfo->ncci_head, ApplId,
-                                       CAPIMSG_NCCI(skb->data),
-                                       CAPIMSG_MSGID(skb->data));
+                                                    CAPIMSG_NCCI(skb->data),
+                                                    CAPIMSG_MSGID(skb->data));
                                spin_unlock(&card->lock);
                        }
                        capi_ctr_handle_message(ctrl, ApplId, skb);
@@ -550,23 +550,23 @@ static void b1dma_handle_rx(avmcard *card)
                ApplId = (unsigned) _get_word(&p);
                MsgLen = _get_slice(&p, card->msgbuf);
                card->msgbuf[MsgLen] = 0;
-               while (    MsgLen > 0
-                      && (   card->msgbuf[MsgLen-1] == '\n'
-                          || card->msgbuf[MsgLen-1] == '\r')) {
-                       card->msgbuf[MsgLen-1] = 0;
+               while (MsgLen > 0
+                      && (card->msgbuf[MsgLen - 1] == '\n'
+                          || card->msgbuf[MsgLen - 1] == '\r')) {
+                       card->msgbuf[MsgLen - 1] = 0;
                        MsgLen--;
                }
                printk(KERN_INFO "%s: task %d \"%s\" ready.\n",
-                               card->name, ApplId, card->msgbuf);
+                      card->name, ApplId, card->msgbuf);
                break;
 
        case RECEIVE_DEBUGMSG:
                MsgLen = _get_slice(&p, card->msgbuf);
                card->msgbuf[MsgLen] = 0;
-               while (    MsgLen > 0
-                      && (   card->msgbuf[MsgLen-1] == '\n'
-                          || card->msgbuf[MsgLen-1] == '\r')) {
-                       card->msgbuf[MsgLen-1] = 0;
+               while (MsgLen > 0
+                      && (card->msgbuf[MsgLen - 1] == '\n'
+                          || card->msgbuf[MsgLen - 1] == '\r')) {
+                       card->msgbuf[MsgLen - 1] = 0;
                        MsgLen--;
                }
                printk(KERN_INFO "%s: DEBUG: %s\n", card->name, card->msgbuf);
@@ -574,7 +574,7 @@ static void b1dma_handle_rx(avmcard *card)
 
        default:
                printk(KERN_ERR "%s: b1dma_interrupt: 0x%x ???\n",
-                               card->name, b1cmd);
+                      card->name, b1cmd);
                return;
        }
 }
@@ -594,7 +594,7 @@ static void b1dma_handle_interrupt(avmcard *card)
                return;
        }
 
-        newcsr = card->csr | (status & ALL_INT);
+       newcsr = card->csr | (status & ALL_INT);
        if (status & TX_TC_INT) newcsr &= ~EN_TX_TC_INT;
        if (status & RX_TC_INT) newcsr &= ~EN_RX_TC_INT;
        b1dma_writel(card, newcsr, AMCC_INTCSR);
@@ -602,23 +602,23 @@ static void b1dma_handle_interrupt(avmcard *card)
        if ((status & RX_TC_INT) != 0) {
                struct avmcard_dmainfo *dma = card->dma;
                u32 rxlen;
-               if (card->dma->recvlen == 0) {
-                       rxlen = b1dma_readl(card, AMCC_RXLEN);
+               if (card->dma->recvlen == 0) {
+                       rxlen = b1dma_readl(card, AMCC_RXLEN);
                        if (rxlen == 0) {
                                dma->recvlen = *((u32 *)dma->recvbuf.dmabuf);
                                rxlen = (dma->recvlen + 3) & ~3;
-                               b1dma_writel(card, dma->recvbuf.dmaaddr+4, AMCC_RXPTR);
+                               b1dma_writel(card, dma->recvbuf.dmaaddr + 4, AMCC_RXPTR);
                                b1dma_writel(card, rxlen, AMCC_RXLEN);
 #ifdef AVM_B1DMA_DEBUG
                        } else {
                                printk(KERN_ERR "%s: rx not complete (%d).\n",
-                                       card->name, rxlen);
+                                      card->name, rxlen);
 #endif
                        }
                } else {
                        spin_unlock(&card->lock);
                        b1dma_handle_rx(card);
-                       dma->recvlen = 0;
+                       dma->recvlen = 0;
                        spin_lock(&card->lock);
                        b1dma_writel(card, dma->recvbuf.dmaaddr, AMCC_RXPTR);
                        b1dma_writel(card, 4, AMCC_RXLEN);
@@ -659,7 +659,7 @@ static int b1dma_loaded(avmcard *card)
        }
        if (!b1_tx_empty(base)) {
                printk(KERN_ERR "%s: b1dma_loaded: tx err, corrupted t4 file ?\n",
-                               card->name);
+                      card->name);
                return 0;
        }
        b1_put_byte(base, SEND_POLLACK);
@@ -686,7 +686,7 @@ static void b1dma_send_init(avmcard *card)
        skb = alloc_skb(15, GFP_ATOMIC);
        if (!skb) {
                printk(KERN_CRIT "%s: no memory, lost register appl.\n",
-                                       card->name);
+                      card->name);
                return;
        }
        p = skb->data;
@@ -694,7 +694,7 @@ static void b1dma_send_init(avmcard *card)
        _put_byte(&p, 0);
        _put_byte(&p, SEND_INIT);
        _put_word(&p, CAPI_MAXAPPL);
-       _put_word(&p, AVM_NCCI_PER_CHANNEL*30);
+       _put_word(&p, AVM_NCCI_PER_CHANNEL * 30);
        _put_word(&p, card->cardnr - 1);
        skb_put(skb, (u8 *)p - (u8 *)skb->data);
 
@@ -712,7 +712,7 @@ int b1dma_load_firmware(struct capi_ctr *ctrl, capiloaddata *data)
        if ((retval = b1_load_t4file(card, &data->firmware))) {
                b1dma_reset(card);
                printk(KERN_ERR "%s: failed to load t4file!!\n",
-                                       card->name);
+                      card->name);
                return retval;
        }
 
@@ -720,7 +720,7 @@ int b1dma_load_firmware(struct capi_ctr *ctrl, capiloaddata *data)
                if ((retval = b1_load_config(card, &data->configuration))) {
                        b1dma_reset(card);
                        printk(KERN_ERR "%s: failed to load config!!\n",
-                                       card->name);
+                              card->name);
                        return retval;
                }
        }
@@ -733,8 +733,8 @@ int b1dma_load_firmware(struct capi_ctr *ctrl, capiloaddata *data)
 
        card->csr = AVM_FLAG;
        b1dma_writel(card, card->csr, AMCC_INTCSR);
-       b1dma_writel(card, EN_A2P_TRANSFERS|EN_P2A_TRANSFERS|A2P_HI_PRIORITY|
-                    P2A_HI_PRIORITY|RESET_A2P_FLAGS|RESET_P2A_FLAGS, 
+       b1dma_writel(card, EN_A2P_TRANSFERS | EN_P2A_TRANSFERS | A2P_HI_PRIORITY |
+                    P2A_HI_PRIORITY | RESET_A2P_FLAGS | RESET_P2A_FLAGS,
                     AMCC_MCSR);
        t1outp(card->port, 0x07, 0x30);
        t1outp(card->port, 0x10, 0xF0);
@@ -745,7 +745,7 @@ int b1dma_load_firmware(struct capi_ctr *ctrl, capiloaddata *data)
        card->csr |= EN_RX_TC_INT;
        b1dma_writel(card, card->csr, AMCC_INTCSR);
 
-        b1dma_send_init(card);
+       b1dma_send_init(card);
 
        return 0;
 }
@@ -757,7 +757,7 @@ void b1dma_reset_ctr(struct capi_ctr *ctrl)
        unsigned long flags;
 
        spin_lock_irqsave(&card->lock, flags);
-       b1dma_reset(card);
+       b1dma_reset(card);
 
        memset(cinfo->version, 0, sizeof(cinfo->version));
        capilib_release(&cinfo->ncci_head);
@@ -768,8 +768,8 @@ void b1dma_reset_ctr(struct capi_ctr *ctrl)
 /* ------------------------------------------------------------- */
 
 void b1dma_register_appl(struct capi_ctr *ctrl,
-                               u16 appl,
-                               capi_register_params *rp)
+                        u16 appl,
+                        capi_register_params *rp)
 {
        avmctrl_info *cinfo = (avmctrl_info *)(ctrl->driverdata);
        avmcard *card = cinfo->card;
@@ -785,7 +785,7 @@ void b1dma_register_appl(struct capi_ctr *ctrl,
        skb = alloc_skb(23, GFP_ATOMIC);
        if (!skb) {
                printk(KERN_CRIT "%s: no memory, lost register appl.\n",
-                                       card->name);
+                      card->name);
                return;
        }
        p = skb->data;
@@ -793,7 +793,7 @@ void b1dma_register_appl(struct capi_ctr *ctrl,
        _put_byte(&p, 0);
        _put_byte(&p, SEND_REGISTER);
        _put_word(&p, appl);
-       _put_word(&p, 1024 * (nconn+1));
+       _put_word(&p, 1024 * (nconn + 1));
        _put_word(&p, nconn);
        _put_word(&p, rp->datablkcnt);
        _put_word(&p, rp->datablklen);
@@ -819,7 +819,7 @@ void b1dma_release_appl(struct capi_ctr *ctrl, u16 appl)
        skb = alloc_skb(7, GFP_ATOMIC);
        if (!skb) {
                printk(KERN_CRIT "%s: no memory, lost release appl.\n",
-                                       card->name);
+                      card->name);
                return;
        }
        p = skb->data;
@@ -841,7 +841,7 @@ u16 b1dma_send_message(struct capi_ctr *ctrl, struct sk_buff *skb)
        avmcard *card = cinfo->card;
        u16 retval = CAPI_NOERROR;
 
-       if (CAPIMSG_CMD(skb->data) == CAPI_DATA_B3_REQ) {
+       if (CAPIMSG_CMD(skb->data) == CAPI_DATA_B3_REQ) {
                unsigned long flags;
                spin_lock_irqsave(&card->lock, flags);
                retval = capilib_data_b3_req(&cinfo->ncci_head,
@@ -850,7 +850,7 @@ u16 b1dma_send_message(struct capi_ctr *ctrl, struct sk_buff *skb)
                                             CAPIMSG_MSGID(skb->data));
                spin_unlock_irqrestore(&card->lock, flags);
        }
-       if (retval == CAPI_NOERROR) 
+       if (retval == CAPI_NOERROR)
                b1dma_queue_tx(card, skb);
 
        return retval;
@@ -893,29 +893,29 @@ static int b1dmactl_proc_show(struct seq_file *m, void *v)
                seq_printf(m, "%-16s %s\n", "ver_serial", s);
 
        if (card->cardtype != avm_m1) {
-               flag = ((u8 *)(ctrl->profile.manu))[3];
-               if (flag)
+               flag = ((u8 *)(ctrl->profile.manu))[3];
+               if (flag)
                        seq_printf(m, "%-16s%s%s%s%s%s%s%s\n",
-                       "protocol",
-                       (flag & 0x01) ? " DSS1" : "",
-                       (flag & 0x02) ? " CT1" : "",
-                       (flag & 0x04) ? " VN3" : "",
-                       (flag & 0x08) ? " NI1" : "",
-                       (flag & 0x10) ? " AUSTEL" : "",
-                       (flag & 0x20) ? " ESS" : "",
-                       (flag & 0x40) ? " 1TR6" : ""
-                       );
+                                  "protocol",
+                                  (flag & 0x01) ? " DSS1" : "",
+                                  (flag & 0x02) ? " CT1" : "",
+                                  (flag & 0x04) ? " VN3" : "",
+                                  (flag & 0x08) ? " NI1" : "",
+                                  (flag & 0x10) ? " AUSTEL" : "",
+                                  (flag & 0x20) ? " ESS" : "",
+                                  (flag & 0x40) ? " 1TR6" : ""
+                               );
        }
        if (card->cardtype != avm_m1) {
-               flag = ((u8 *)(ctrl->profile.manu))[5];
+               flag = ((u8 *)(ctrl->profile.manu))[5];
                if (flag)
                        seq_printf(m, "%-16s%s%s%s%s\n",
-                       "linetype",
-                       (flag & 0x01) ? " point to point" : "",
-                       (flag & 0x02) ? " point to multipoint" : "",
-                       (flag & 0x08) ? " leased line without D-channel" : "",
-                       (flag & 0x04) ? " leased line with D-channel" : ""
-                       );
+                                  "linetype",
+                                  (flag & 0x01) ? " point to point" : "",
+                                  (flag & 0x02) ? " point to multipoint" : "",
+                                  (flag & 0x08) ? " leased line without D-channel" : "",
+                                  (flag & 0x04) ? " leased line with D-channel" : ""
+                               );
        }
        seq_printf(m, "%-16s %s\n", "cardname", cinfo->cardname);
 
@@ -977,7 +977,7 @@ static int __init b1dma_init(void)
        if ((p = strchr(revision, ':')) != NULL && p[1]) {
                strlcpy(rev, p + 2, sizeof(rev));
                if ((p = strchr(rev, '$')) != NULL && p > rev)
-                  *(p-1) = 0;
+                       *(p - 1) = 0;
        } else
                strcpy(rev, "1.0");
 
index ff53905..31ef813 100644 (file)
@@ -1,9 +1,9 @@
 /* $Id: b1isa.c,v 1.1.2.3 2004/02/10 01:07:12 keil Exp $
- * 
+ *
  * Module for AVM B1 ISA-card.
- * 
+ *
  * Copyright 1999 by Carsten Paeth <calle@calle.de>
- * 
+ *
  * This software may be used and distributed according to the terms
  * of the GNU General Public License, incorporated herein by reference.
  *
@@ -80,7 +80,7 @@ static int b1isa_probe(struct pci_dev *pdev)
        card->cardtype = avm_b1isa;
        sprintf(card->name, "b1isa-%x", card->port);
 
-       if (   card->port != 0x150 && card->port != 0x250
+       if (card->port != 0x150 && card->port != 0x250
            && card->port != 0x300 && card->port != 0x340) {
                printk(KERN_WARNING "b1isa: invalid port 0x%x.\n", card->port);
                retval = -EINVAL;
@@ -136,13 +136,13 @@ static int b1isa_probe(struct pci_dev *pdev)
        pci_set_drvdata(pdev, cinfo);
        return 0;
 
- err_free_irq:
+err_free_irq:
        free_irq(card->irq, card);
- err_release_region:
+err_release_region:
        release_region(card->port, AVMB1_PORTLEN);
- err_free:
+err_free:
        b1_free_card(card);
- err:
+err:
        return retval;
 }
 
@@ -206,7 +206,7 @@ static int __init b1isa_init(void)
        if ((p = strchr(revision, ':')) != NULL && p[1]) {
                strlcpy(rev, p + 2, 32);
                if ((p = strchr(rev, '$')) != NULL && p > rev)
-                  *(p-1) = 0;
+                       *(p - 1) = 0;
        } else
                strcpy(rev, "1.0");
 
index c97e431..b305e6b 100644 (file)
@@ -1,9 +1,9 @@
 /* $Id: b1pci.c,v 1.1.2.2 2004/01/16 21:09:27 keil Exp $
- * 
+ *
  * Module for AVM B1 PCI-card.
- * 
+ *
  * Copyright 1999 by Carsten Paeth <calle@calle.de>
- * 
+ *
  * This software may be used and distributed according to the terms
  * of the GNU General Public License, incorporated herein by reference.
  *
@@ -79,7 +79,7 @@ static int b1pci_probe(struct capicardparams *p, struct pci_dev *pdev)
        card->port = p->port;
        card->irq = p->irq;
        card->cardtype = avm_b1pci;
-       
+
        if (!request_region(card->port, AVMB1_PORTLEN, card->name)) {
                printk(KERN_WARNING "b1pci: ports 0x%03x-0x%03x in use.\n",
                       card->port, card->port + AVMB1_PORTLEN);
@@ -96,14 +96,14 @@ static int b1pci_probe(struct capicardparams *p, struct pci_dev *pdev)
        }
        b1_reset(card->port);
        b1_getrevision(card);
-       
+
        retval = request_irq(card->irq, b1_interrupt, IRQF_SHARED, card->name, card);
        if (retval) {
                printk(KERN_ERR "b1pci: unable to get IRQ %d.\n", card->irq);
                retval = -EBUSY;
                goto err_release_region;
        }
-       
+
        cinfo->capi_ctrl.driver_name   = "b1pci";
        cinfo->capi_ctrl.driverdata    = cinfo;
        cinfo->capi_ctrl.register_appl = b1_register_appl;
@@ -133,13 +133,13 @@ static int b1pci_probe(struct capicardparams *p, struct pci_dev *pdev)
        pci_set_drvdata(pdev, card);
        return 0;
 
- err_free_irq:
+err_free_irq:
        free_irq(card->irq, card);
- err_release_region:
+err_release_region:
        release_region(card->port, AVMB1_PORTLEN);
- err_free:
+err_free:
        b1_free_card(card);
- err:
+err:
        return retval;
 }
 
@@ -193,7 +193,7 @@ static int b1pciv4_probe(struct capicardparams *p, struct pci_dev *pdev)
                goto err;
        }
 
-        card->dma = avmcard_dma_alloc("b1pci", pdev, 2048+128, 2048+128);
+       card->dma = avmcard_dma_alloc("b1pci", pdev, 2048 + 128, 2048 + 128);
        if (!card->dma) {
                printk(KERN_WARNING "b1pci: dma alloc.\n");
                retval = -ENOMEM;
@@ -267,17 +267,17 @@ static int b1pciv4_probe(struct capicardparams *p, struct pci_dev *pdev)
        pci_set_drvdata(pdev, card);
        return 0;
 
- err_free_irq:
+err_free_irq:
        free_irq(card->irq, card);
- err_unmap:
+err_unmap:
        iounmap(card->mbase);
- err_release_region:
+err_release_region:
        release_region(card->port, AVMB1_PORTLEN);
- err_free_dma:
+err_free_dma:
        avmcard_dma_free(card->dma);
- err_free:
+err_free:
        b1_free_card(card);
- err:
+err:
        return retval;
 
 }
@@ -287,13 +287,13 @@ static void b1pciv4_remove(struct pci_dev *pdev)
        avmcard *card = pci_get_drvdata(pdev);
        avmctrl_info *cinfo = card->ctrlinfo;
 
-       b1dma_reset(card);
+       b1dma_reset(card);
 
        detach_capi_ctr(&cinfo->capi_ctrl);
        free_irq(card->irq, card);
        iounmap(card->mbase);
        release_region(card->port, AVMB1_PORTLEN);
-        avmcard_dma_free(card->dma);
+       avmcard_dma_free(card->dma);
        b1_free_card(card);
 }
 
@@ -326,7 +326,7 @@ static int __devinit b1pci_pci_probe(struct pci_dev *pdev,
                retval = b1pci_probe(&param, pdev);
 #endif
                if (retval != 0) {
-                       printk(KERN_ERR "b1pci: no AVM-B1 V4 at i/o %#x, irq %d, mem %#x detected\n",
+                       printk(KERN_ERR "b1pci: no AVM-B1 V4 at i/o %#x, irq %d, mem %#x detected\n",
                               param.port, param.irq, param.membase);
                }
        } else {
@@ -337,7 +337,7 @@ static int __devinit b1pci_pci_probe(struct pci_dev *pdev,
                       param.port, param.irq);
                retval = b1pci_probe(&param, pdev);
                if (retval != 0) {
-                       printk(KERN_ERR "b1pci: no AVM-B1 at i/o %#x, irq %d detected\n",
+                       printk(KERN_ERR "b1pci: no AVM-B1 at i/o %#x, irq %d detected\n",
                               param.port, param.irq);
                }
        }
@@ -385,7 +385,7 @@ static int __init b1pci_init(void)
        if ((p = strchr(revision, ':')) != NULL && p[1]) {
                strlcpy(rev, p + 2, 32);
                if ((p = strchr(rev, '$')) != NULL && p > rev)
-                  *(p-1) = 0;
+                       *(p - 1) = 0;
        } else
                strcpy(rev, "1.0");
 
index d6391e0..6b0d19d 100644 (file)
@@ -1,9 +1,9 @@
 /* $Id: b1pcmcia.c,v 1.1.2.2 2004/01/16 21:09:27 keil Exp $
- * 
+ *
  * Module for AVM B1/M1/M2 PCMCIA-card.
- * 
+ *
  * Copyright 1999 by Carsten Paeth <calle@calle.de>
- * 
+ *
  * This software may be used and distributed according to the terms
  * of the GNU General Public License, incorporated herein by reference.
  *
@@ -74,9 +74,9 @@ static int b1pcmcia_add_card(unsigned int port, unsigned irq,
        cinfo = card->ctrlinfo;
 
        switch (cardtype) {
-               case avm_m1: sprintf(card->name, "m1-%x", port); break;
-               case avm_m2: sprintf(card->name, "m2-%x", port); break;
-               default: sprintf(card->name, "b1pcmcia-%x", port); break;
+       case avm_m1: sprintf(card->name, "m1-%x", port); break;
+       case avm_m2: sprintf(card->name, "m2-%x", port); break;
+       default: sprintf(card->name, "b1pcmcia-%x", port); break;
        }
        card->port = port;
        card->irq = irq;
@@ -117,9 +117,9 @@ static int b1pcmcia_add_card(unsigned int port, unsigned irq,
                goto err_free_irq;
        }
        switch (cardtype) {
-               case avm_m1: cardname = "M1"; break;
-               case avm_m2: cardname = "M2"; break;
-               default    : cardname = "B1 PCMCIA"; break;
+       case avm_m1: cardname = "M1"; break;
+       case avm_m2: cardname = "M2"; break;
+       default: cardname = "B1 PCMCIA"; break;
        }
 
        printk(KERN_INFO "b1pcmcia: AVM %s at i/o %#x, irq %d, revision %d\n",
@@ -128,11 +128,11 @@ static int b1pcmcia_add_card(unsigned int port, unsigned irq,
        list_add(&card->list, &cards);
        return cinfo->capi_ctrl.cnr;
 
- err_free_irq:
+err_free_irq:
        free_irq(card->irq, card);
- err_free:
+err_free:
        b1_free_card(card);
- err:
+err:
        return retval;
 }
 
@@ -175,7 +175,7 @@ int b1pcmcia_delcard(unsigned int port, unsigned irq)
 {
        struct list_head *l;
        avmcard *card;
-       
+
        list_for_each(l, &cards) {
                card = list_entry(l, avmcard, list);
                if (card->port == port && card->irq == irq) {
@@ -204,7 +204,7 @@ static int __init b1pcmcia_init(void)
        if ((p = strchr(revision, ':')) != NULL && p[1]) {
                strlcpy(rev, p + 2, 32);
                if ((p = strchr(rev, '$')) != NULL && p > rev)
-                  *(p-1) = 0;
+                       *(p - 1) = 0;
        } else
                strcpy(rev, "1.0");
 
index 9743b24..98f1881 100644 (file)
@@ -1,7 +1,7 @@
 /* $Id: c4.c,v 1.1.2.2 2004/01/16 21:09:27 keil Exp $
- * 
+ *
  * Module for AVM C4 & C2 card.
- * 
+ *
  * Copyright 1999 by Carsten Paeth <calle@calle.de>
  *
  * This software may be used and distributed according to the terms
@@ -129,8 +129,8 @@ static void c4_dispatch_tx(avmcard *card);
 
 /* ------------------------------------------------------------- */
 
-#define        RESET_TIMEOUT           (15*HZ) /* 15 sec */
-#define        PEEK_POKE_TIMEOUT       (HZ/10) /* 0.1 sec */
+#define        RESET_TIMEOUT           (15 * HZ)       /* 15 sec */
+#define        PEEK_POKE_TIMEOUT       (HZ / 10)       /* 0.1 sec */
 
 /* ------------------------------------------------------------- */
 
@@ -148,7 +148,7 @@ static inline int wait_for_doorbell(avmcard *card, unsigned long t)
        unsigned long stop;
 
        stop = jiffies + t;
-       while (c4inmeml(card->mbase+DOORBELL) != 0xffffffff) {
+       while (c4inmeml(card->mbase + DOORBELL) != 0xffffffff) {
                if (!time_before(jiffies, stop))
                        return -1;
                mb();
@@ -159,40 +159,40 @@ static inline int wait_for_doorbell(avmcard *card, unsigned long t)
 static int c4_poke(avmcard *card,  unsigned long off, unsigned long value)
 {
 
-       if (wait_for_doorbell(card, HZ/10) < 0)
+       if (wait_for_doorbell(card, HZ / 10) < 0)
                return -1;
-       
-       c4outmeml(card->mbase+MBOX_PEEK_POKE, off);
-       c4outmeml(card->mbase+DOORBELL, DBELL_ADDR);
 
-       if (wait_for_doorbell(card, HZ/10) < 0)
+       c4outmeml(card->mbase + MBOX_PEEK_POKE, off);
+       c4outmeml(card->mbase + DOORBELL, DBELL_ADDR);
+
+       if (wait_for_doorbell(card, HZ / 10) < 0)
                return -1;
 
-       c4outmeml(card->mbase+MBOX_PEEK_POKE, value);
-       c4outmeml(card->mbase+DOORBELL, DBELL_DATA | DBELL_ADDR);
+       c4outmeml(card->mbase + MBOX_PEEK_POKE, value);
+       c4outmeml(card->mbase + DOORBELL, DBELL_DATA | DBELL_ADDR);
 
        return 0;
 }
 
 static int c4_peek(avmcard *card,  unsigned long off, unsigned long *valuep)
 {
-       if (wait_for_doorbell(card, HZ/10) < 0)
+       if (wait_for_doorbell(card, HZ / 10) < 0)
                return -1;
 
-       c4outmeml(card->mbase+MBOX_PEEK_POKE, off);
-       c4outmeml(card->mbase+DOORBELL, DBELL_RNWR | DBELL_ADDR);
+       c4outmeml(card->mbase + MBOX_PEEK_POKE, off);
+       c4outmeml(card->mbase + DOORBELL, DBELL_RNWR | DBELL_ADDR);
 
-       if (wait_for_doorbell(card, HZ/10) < 0)
+       if (wait_for_doorbell(card, HZ / 10) < 0)
                return -1;
 
-       *valuep = c4inmeml(card->mbase+MBOX_PEEK_POKE);
+       *valuep = c4inmeml(card->mbase + MBOX_PEEK_POKE);
 
        return 0;
 }
 
 /* ------------------------------------------------------------- */
 
-static int c4_load_t4file(avmcard *card, capiloaddatapart * t4file)
+static int c4_load_t4file(avmcard *card, capiloaddatapart *t4file)
 {
        u32 val;
        unsigned char *dp;
@@ -202,7 +202,7 @@ static int c4_load_t4file(avmcard *card, capiloaddatapart * t4file)
        dp = t4file->data;
        left = t4file->len;
        while (left >= sizeof(u32)) {
-               if (t4file->user) {
+               if (t4file->user) {
                        if (copy_from_user(&val, dp, sizeof(val)))
                                return -EFAULT;
                } else {
@@ -210,7 +210,7 @@ static int c4_load_t4file(avmcard *card, capiloaddatapart * t4file)
                }
                if (c4_poke(card, loadoff, val)) {
                        printk(KERN_ERR "%s: corrupted firmware file ?\n",
-                                       card->name);
+                              card->name);
                        return -EIO;
                }
                left -= sizeof(u32);
@@ -227,7 +227,7 @@ static int c4_load_t4file(avmcard *card, capiloaddatapart * t4file)
                }
                if (c4_poke(card, loadoff, val)) {
                        printk(KERN_ERR "%s: corrupted firmware file ?\n",
-                                       card->name);
+                              card->name);
                        return -EIO;
                }
        }
@@ -297,13 +297,13 @@ static void c4_reset(avmcard *card)
 {
        unsigned long stop;
 
-       c4outmeml(card->mbase+DOORBELL, DBELL_RESET_ARM);
+       c4outmeml(card->mbase + DOORBELL, DBELL_RESET_ARM);
 
-       stop = jiffies + HZ*10;
-       while (c4inmeml(card->mbase+DOORBELL) != 0xffffffff) {
+       stop = jiffies + HZ * 10;
+       while (c4inmeml(card->mbase + DOORBELL) != 0xffffffff) {
                if (!time_before(jiffies, stop))
                        return;
-               c4outmeml(card->mbase+DOORBELL, DBELL_ADDR);
+               c4outmeml(card->mbase + DOORBELL, DBELL_ADDR);
                mb();
        }
 
@@ -317,89 +317,89 @@ static int c4_detect(avmcard *card)
 {
        unsigned long stop, dummy;
 
-       c4outmeml(card->mbase+PCI_OUT_INT_MASK, 0x0c);
-       if (c4inmeml(card->mbase+PCI_OUT_INT_MASK) != 0x0c)
+       c4outmeml(card->mbase + PCI_OUT_INT_MASK, 0x0c);
+       if (c4inmeml(card->mbase + PCI_OUT_INT_MASK) != 0x0c)
                return  1;
 
-       c4outmeml(card->mbase+DOORBELL, DBELL_RESET_ARM);
+       c4outmeml(card->mbase + DOORBELL, DBELL_RESET_ARM);
 
-       stop = jiffies + HZ*10;
-       while (c4inmeml(card->mbase+DOORBELL) != 0xffffffff) {
+       stop = jiffies + HZ * 10;
+       while (c4inmeml(card->mbase + DOORBELL) != 0xffffffff) {
                if (!time_before(jiffies, stop))
                        return 2;
-               c4outmeml(card->mbase+DOORBELL, DBELL_ADDR);
+               c4outmeml(card->mbase + DOORBELL, DBELL_ADDR);
                mb();
        }
 
        c4_poke(card, DC21285_ARMCSR_BASE + CHAN_1_CONTROL, 0);
        c4_poke(card, DC21285_ARMCSR_BASE + CHAN_2_CONTROL, 0);
 
-       c4outmeml(card->mbase+MAILBOX_0, 0x55aa55aa);
-       if (c4inmeml(card->mbase+MAILBOX_0) != 0x55aa55aa) return 3;
+       c4outmeml(card->mbase + MAILBOX_0, 0x55aa55aa);
+       if (c4inmeml(card->mbase + MAILBOX_0) != 0x55aa55aa) return 3;
 
-       c4outmeml(card->mbase+MAILBOX_0, 0xaa55aa55);
-       if (c4inmeml(card->mbase+MAILBOX_0) != 0xaa55aa55) return 4;
+       c4outmeml(card->mbase + MAILBOX_0, 0xaa55aa55);
+       if (c4inmeml(card->mbase + MAILBOX_0) != 0xaa55aa55) return 4;
 
-       if (c4_poke(card, DC21285_ARMCSR_BASE+DBELL_SA_MASK, 0)) return 5;
-       if (c4_poke(card, DC21285_ARMCSR_BASE+DBELL_PCI_MASK, 0)) return 6;
-       if (c4_poke(card, DC21285_ARMCSR_BASE+SA_CONTROL, SA_CTL_ALLRIGHT))
+       if (c4_poke(card, DC21285_ARMCSR_BASE + DBELL_SA_MASK, 0)) return 5;
+       if (c4_poke(card, DC21285_ARMCSR_BASE + DBELL_PCI_MASK, 0)) return 6;
+       if (c4_poke(card, DC21285_ARMCSR_BASE + SA_CONTROL, SA_CTL_ALLRIGHT))
                return 7;
-       if (c4_poke(card, DC21285_ARMCSR_BASE+XBUS_CYCLE, INIT_XBUS_CYCLE))
+       if (c4_poke(card, DC21285_ARMCSR_BASE + XBUS_CYCLE, INIT_XBUS_CYCLE))
                return 8;
-       if (c4_poke(card, DC21285_ARMCSR_BASE+XBUS_STROBE, INIT_XBUS_STROBE))
+       if (c4_poke(card, DC21285_ARMCSR_BASE + XBUS_STROBE, INIT_XBUS_STROBE))
                return 8;
-       if (c4_poke(card, DC21285_ARMCSR_BASE+DRAM_TIMING, 0)) return 9;
+       if (c4_poke(card, DC21285_ARMCSR_BASE + DRAM_TIMING, 0)) return 9;
 
-        mdelay(1);
+       mdelay(1);
 
        if (c4_peek(card, DC21285_DRAM_A0MR, &dummy)) return 10;
        if (c4_peek(card, DC21285_DRAM_A1MR, &dummy)) return 11;
        if (c4_peek(card, DC21285_DRAM_A2MR, &dummy)) return 12;
        if (c4_peek(card, DC21285_DRAM_A3MR, &dummy)) return 13;
 
-       if (c4_poke(card, DC21285_DRAM_A0MR+CAS_OFFSET, 0)) return 14;
-       if (c4_poke(card, DC21285_DRAM_A1MR+CAS_OFFSET, 0)) return 15;
-       if (c4_poke(card, DC21285_DRAM_A2MR+CAS_OFFSET, 0)) return 16;
-       if (c4_poke(card, DC21285_DRAM_A3MR+CAS_OFFSET, 0)) return 17;
+       if (c4_poke(card, DC21285_DRAM_A0MR + CAS_OFFSET, 0)) return 14;
+       if (c4_poke(card, DC21285_DRAM_A1MR + CAS_OFFSET, 0)) return 15;
+       if (c4_poke(card, DC21285_DRAM_A2MR + CAS_OFFSET, 0)) return 16;
+       if (c4_poke(card, DC21285_DRAM_A3MR + CAS_OFFSET, 0)) return 17;
 
-        mdelay(1);
+       mdelay(1);
 
-       if (c4_poke(card, DC21285_ARMCSR_BASE+DRAM_TIMING, DRAM_TIMING_DEF))
+       if (c4_poke(card, DC21285_ARMCSR_BASE + DRAM_TIMING, DRAM_TIMING_DEF))
                return 18;
 
-       if (c4_poke(card, DC21285_ARMCSR_BASE+DRAM_ADDR_SIZE_0,DRAM_AD_SZ_DEF0))
+       if (c4_poke(card, DC21285_ARMCSR_BASE + DRAM_ADDR_SIZE_0, DRAM_AD_SZ_DEF0))
                return 19;
-       if (c4_poke(card, DC21285_ARMCSR_BASE+DRAM_ADDR_SIZE_1,DRAM_AD_SZ_NULL))
+       if (c4_poke(card, DC21285_ARMCSR_BASE + DRAM_ADDR_SIZE_1, DRAM_AD_SZ_NULL))
                return 20;
-       if (c4_poke(card, DC21285_ARMCSR_BASE+DRAM_ADDR_SIZE_2,DRAM_AD_SZ_NULL))
+       if (c4_poke(card, DC21285_ARMCSR_BASE + DRAM_ADDR_SIZE_2, DRAM_AD_SZ_NULL))
                return 21;
-       if (c4_poke(card, DC21285_ARMCSR_BASE+DRAM_ADDR_SIZE_3,DRAM_AD_SZ_NULL))
+       if (c4_poke(card, DC21285_ARMCSR_BASE + DRAM_ADDR_SIZE_3, DRAM_AD_SZ_NULL))
                return 22;
 
        /* Transputer test */
-       
-       if (   c4_poke(card, 0x000000, 0x11111111)
+
+       if (c4_poke(card, 0x000000, 0x11111111)
            || c4_poke(card, 0x400000, 0x22222222)
-           || c4_poke(card, 0x800000, 0x33333333)
-           || c4_poke(card, 0xC00000, 0x44444444))
+              || c4_poke(card, 0x800000, 0x33333333)
+              || c4_poke(card, 0xC00000, 0x44444444))
                return 23;
 
-       if (   c4_peek(card, 0x000000, &dummy) || dummy != 0x11111111
+       if (c4_peek(card, 0x000000, &dummy) || dummy != 0x11111111
            || c4_peek(card, 0x400000, &dummy) || dummy != 0x22222222
-           || c4_peek(card, 0x800000, &dummy) || dummy != 0x33333333
-           || c4_peek(card, 0xC00000, &dummy) || dummy != 0x44444444)
+              || c4_peek(card, 0x800000, &dummy) || dummy != 0x33333333
+              || c4_peek(card, 0xC00000, &dummy) || dummy != 0x44444444)
                return 24;
 
-       if (   c4_poke(card, 0x000000, 0x55555555)
+       if (c4_poke(card, 0x000000, 0x55555555)
            || c4_poke(card, 0x400000, 0x66666666)
-           || c4_poke(card, 0x800000, 0x77777777)
-           || c4_poke(card, 0xC00000, 0x88888888))
+              || c4_poke(card, 0x800000, 0x77777777)
+              || c4_poke(card, 0xC00000, 0x88888888))
                return 25;
 
-       if (   c4_peek(card, 0x000000, &dummy) || dummy != 0x55555555
+       if (c4_peek(card, 0x000000, &dummy) || dummy != 0x55555555
            || c4_peek(card, 0x400000, &dummy) || dummy != 0x66666666
-           || c4_peek(card, 0x800000, &dummy) || dummy != 0x77777777
-           || c4_peek(card, 0xC00000, &dummy) || dummy != 0x88888888)
+              || c4_peek(card, 0x800000, &dummy) || dummy != 0x77777777
+              || c4_peek(card, 0xC00000, &dummy) || dummy != 0x88888888)
                return 26;
 
        return 0;
@@ -451,26 +451,26 @@ static void c4_dispatch_tx(avmcard *card)
                printk(KERN_DEBUG "%s: tx put msg len=%d\n", card->name, txlen);
 #endif
        } else {
-               txlen = skb->len-2;
+               txlen = skb->len - 2;
 #ifdef AVM_C4_POLLDEBUG
                if (skb->data[2] == SEND_POLLACK)
                        printk(KERN_INFO "%s: ack to c4\n", card->name);
 #endif
 #ifdef AVM_C4_DEBUG
                printk(KERN_DEBUG "%s: tx put 0x%x len=%d\n",
-                               card->name, skb->data[2], txlen);
+                      card->name, skb->data[2], txlen);
 #endif
                skb_copy_from_linear_data_offset(skb, 2, dma->sendbuf.dmabuf,
                                                 skb->len - 2);
        }
        txlen = (txlen + 3) & ~3;
 
-       c4outmeml(card->mbase+MBOX_DOWN_ADDR, dma->sendbuf.dmaaddr);
-       c4outmeml(card->mbase+MBOX_DOWN_LEN, txlen);
+       c4outmeml(card->mbase + MBOX_DOWN_ADDR, dma->sendbuf.dmaaddr);
+       c4outmeml(card->mbase + MBOX_DOWN_LEN, txlen);
 
        card->csr |= DBELL_DOWN_ARM;
 
-       c4outmeml(card->mbase+DOORBELL, DBELL_DOWN_ARM);
+       c4outmeml(card->mbase + DOORBELL, DBELL_DOWN_ARM);
 
        dev_kfree_skb_any(skb);
 }
@@ -485,7 +485,7 @@ static void queue_pollack(avmcard *card)
        skb = alloc_skb(3, GFP_ATOMIC);
        if (!skb) {
                printk(KERN_CRIT "%s: no memory, lost poll ack\n",
-                                       card->name);
+                      card->name);
                return;
        }
        p = skb->data;
@@ -514,9 +514,9 @@ static void c4_handle_rx(avmcard *card)
 
 #ifdef AVM_C4_DEBUG
        printk(KERN_DEBUG "%s: rx 0x%x len=%lu\n", card->name,
-                               b1cmd, (unsigned long)dma->recvlen);
+              b1cmd, (unsigned long)dma->recvlen);
 #endif
-       
+
        switch (b1cmd) {
        case RECEIVE_DATA_B3_IND:
 
@@ -528,13 +528,13 @@ static void c4_handle_rx(avmcard *card)
                ctrl = &card->ctrlinfo[cidx].capi_ctrl;
 
                if (MsgLen < 30) { /* not CAPI 64Bit */
-                       memset(card->msgbuf+MsgLen, 0, 30-MsgLen);
+                       memset(card->msgbuf + MsgLen, 0, 30 - MsgLen);
                        MsgLen = 30;
                        CAPIMSG_SETLEN(card->msgbuf, 30);
                }
-               if (!(skb = alloc_skb(DataB3Len+MsgLen, GFP_ATOMIC))) {
+               if (!(skb = alloc_skb(DataB3Len + MsgLen, GFP_ATOMIC))) {
                        printk(KERN_ERR "%s: incoming packet dropped\n",
-                                       card->name);
+                              card->name);
                } else {
                        memcpy(skb_put(skb, MsgLen), card->msgbuf, MsgLen);
                        memcpy(skb_put(skb, DataB3Len), card->databuf, DataB3Len);
@@ -553,7 +553,7 @@ static void c4_handle_rx(avmcard *card)
 
                if (!(skb = alloc_skb(MsgLen, GFP_ATOMIC))) {
                        printk(KERN_ERR "%s: incoming packet dropped\n",
-                                       card->name);
+                              card->name);
                } else {
                        memcpy(skb_put(skb, MsgLen), card->msgbuf, MsgLen);
                        if (CAPIMSG_CMD(skb->data) == CAPI_DATA_B3_CONF)
@@ -570,7 +570,7 @@ static void c4_handle_rx(avmcard *card)
                ApplId = _get_word(&p);
                NCCI = _get_word(&p);
                WindowSize = _get_word(&p);
-               cidx = (NCCI&0x7f) - card->cardnr;
+               cidx = (NCCI & 0x7f) - card->cardnr;
                if (cidx >= card->nlogcontr) cidx = 0;
 
                capilib_new_ncci(&card->ctrlinfo[cidx].ncci_head, ApplId, NCCI, WindowSize);
@@ -583,7 +583,7 @@ static void c4_handle_rx(avmcard *card)
                NCCI = _get_word(&p);
 
                if (NCCI != 0xffffffff) {
-                       cidx = (NCCI&0x7f) - card->cardnr;
+                       cidx = (NCCI & 0x7f) - card->cardnr;
                        if (cidx >= card->nlogcontr) cidx = 0;
                        capilib_free_ncci(&card->ctrlinfo[cidx].ncci_head, ApplId, NCCI);
                }
@@ -595,14 +595,14 @@ static void c4_handle_rx(avmcard *card)
 #endif
                if (!suppress_pollack)
                        queue_pollack(card);
-               for (cidx=0; cidx < card->nr_controllers; cidx++) {
+               for (cidx = 0; cidx < card->nr_controllers; cidx++) {
                        ctrl = &card->ctrlinfo[cidx].capi_ctrl;
                        capi_ctr_resume_output(ctrl);
                }
                break;
 
        case RECEIVE_STOP:
-               for (cidx=0; cidx < card->nr_controllers; cidx++) {
+               for (cidx = 0; cidx < card->nr_controllers; cidx++) {
                        ctrl = &card->ctrlinfo[cidx].capi_ctrl;
                        capi_ctr_suspend_output(ctrl);
                }
@@ -610,14 +610,14 @@ static void c4_handle_rx(avmcard *card)
 
        case RECEIVE_INIT:
 
-               cidx = card->nlogcontr;
+               cidx = card->nlogcontr;
                if (cidx >= card->nr_controllers) {
                        printk(KERN_ERR "%s: card with %d controllers ??\n",
-                                       card->name, cidx+1);
+                              card->name, cidx + 1);
                        break;
                }
-               card->nlogcontr++;
-               cinfo = &card->ctrlinfo[cidx];
+               card->nlogcontr++;
+               cinfo = &card->ctrlinfo[cidx];
                ctrl = &cinfo->capi_ctrl;
                cinfo->versionlen = _get_slice(&p, cinfo->versionbuf);
                b1_parse_version(cinfo);
@@ -632,23 +632,23 @@ static void c4_handle_rx(avmcard *card)
                ApplId = (unsigned) _get_word(&p);
                MsgLen = _get_slice(&p, card->msgbuf);
                card->msgbuf[MsgLen] = 0;
-               while (    MsgLen > 0
-                      && (   card->msgbuf[MsgLen-1] == '\n'
-                          || card->msgbuf[MsgLen-1] == '\r')) {
-                       card->msgbuf[MsgLen-1] = 0;
+               while (MsgLen > 0
+                      && (card->msgbuf[MsgLen - 1] == '\n'
+                          || card->msgbuf[MsgLen - 1] == '\r')) {
+                       card->msgbuf[MsgLen - 1] = 0;
                        MsgLen--;
                }
                printk(KERN_INFO "%s: task %d \"%s\" ready.\n",
-                               card->name, ApplId, card->msgbuf);
+                      card->name, ApplId, card->msgbuf);
                break;
 
        case RECEIVE_DEBUGMSG:
                MsgLen = _get_slice(&p, card->msgbuf);
                card->msgbuf[MsgLen] = 0;
-               while (    MsgLen > 0
-                      && (   card->msgbuf[MsgLen-1] == '\n'
-                          || card->msgbuf[MsgLen-1] == '\r')) {
-                       card->msgbuf[MsgLen-1] = 0;
+               while (MsgLen > 0
+                      && (card->msgbuf[MsgLen - 1] == '\n'
+                          || card->msgbuf[MsgLen - 1] == '\r')) {
+                       card->msgbuf[MsgLen - 1] = 0;
                        MsgLen--;
                }
                printk(KERN_INFO "%s: DEBUG: %s\n", card->name, card->msgbuf);
@@ -656,7 +656,7 @@ static void c4_handle_rx(avmcard *card)
 
        default:
                printk(KERN_ERR "%s: c4_interrupt: 0x%x ???\n",
-                               card->name, b1cmd);
+                      card->name, b1cmd);
                return;
        }
 }
@@ -669,16 +669,16 @@ static irqreturn_t c4_handle_interrupt(avmcard *card)
        u32 status;
 
        spin_lock_irqsave(&card->lock, flags);
-       status = c4inmeml(card->mbase+DOORBELL);
+       status = c4inmeml(card->mbase + DOORBELL);
 
        if (status & DBELL_RESET_HOST) {
                u_int i;
-               c4outmeml(card->mbase+PCI_OUT_INT_MASK, 0x0c);
+               c4outmeml(card->mbase + PCI_OUT_INT_MASK, 0x0c);
                spin_unlock_irqrestore(&card->lock, flags);
                if (card->nlogcontr == 0)
                        return IRQ_HANDLED;
                printk(KERN_ERR "%s: unexpected reset\n", card->name);
-                for (i=0; i < card->nr_controllers; i++) {
+               for (i = 0; i < card->nr_controllers; i++) {
                        avmctrl_info *cinfo = &card->ctrlinfo[i];
                        memset(cinfo->version, 0, sizeof(cinfo->version));
                        spin_lock_irqsave(&card->lock, flags);
@@ -695,23 +695,23 @@ static irqreturn_t c4_handle_interrupt(avmcard *card)
                spin_unlock_irqrestore(&card->lock, flags);
                return IRQ_HANDLED;
        }
-       c4outmeml(card->mbase+DOORBELL, status);
+       c4outmeml(card->mbase + DOORBELL, status);
 
        if ((status & DBELL_UP_HOST) != 0) {
-               card->dma->recvlen = c4inmeml(card->mbase+MBOX_UP_LEN);
-               c4outmeml(card->mbase+MBOX_UP_LEN, 0);
+               card->dma->recvlen = c4inmeml(card->mbase + MBOX_UP_LEN);
+               c4outmeml(card->mbase + MBOX_UP_LEN, 0);
                c4_handle_rx(card);
                card->dma->recvlen = 0;
-               c4outmeml(card->mbase+MBOX_UP_LEN, card->dma->recvbuf.size);
-               c4outmeml(card->mbase+DOORBELL, DBELL_UP_ARM);
+               c4outmeml(card->mbase + MBOX_UP_LEN, card->dma->recvbuf.size);
+               c4outmeml(card->mbase + DOORBELL, DBELL_UP_ARM);
        }
 
        if ((status & DBELL_DOWN_HOST) != 0) {
                card->csr &= ~DBELL_DOWN_ARM;
-               c4_dispatch_tx(card);
+               c4_dispatch_tx(card);
        } else if (card->csr & DBELL_DOWN_HOST) {
-               if (c4inmeml(card->mbase+MBOX_DOWN_LEN) == 0) {
-                       card->csr &= ~DBELL_DOWN_ARM;
+               if (c4inmeml(card->mbase + MBOX_DOWN_LEN) == 0) {
+                       card->csr &= ~DBELL_DOWN_ARM;
                        c4_dispatch_tx(card);
                }
        }
@@ -737,7 +737,7 @@ static void c4_send_init(avmcard *card)
        skb = alloc_skb(15, GFP_ATOMIC);
        if (!skb) {
                printk(KERN_CRIT "%s: no memory, lost register appl.\n",
-                                       card->name);
+                      card->name);
                return;
        }
        p = skb->data;
@@ -745,7 +745,7 @@ static void c4_send_init(avmcard *card)
        _put_byte(&p, 0);
        _put_byte(&p, SEND_INIT);
        _put_word(&p, CAPI_MAXAPPL);
-       _put_word(&p, AVM_NCCI_PER_CHANNEL*30);
+       _put_word(&p, AVM_NCCI_PER_CHANNEL * 30);
        _put_word(&p, card->cardnr - 1);
        skb_put(skb, (u8 *)p - (u8 *)skb->data);
 
@@ -761,10 +761,10 @@ static int queue_sendconfigword(avmcard *card, u32 val)
        unsigned long flags;
        void *p;
 
-       skb = alloc_skb(3+4, GFP_ATOMIC);
+       skb = alloc_skb(3 + 4, GFP_ATOMIC);
        if (!skb) {
                printk(KERN_CRIT "%s: no memory, send config\n",
-                                       card->name);
+                      card->name);
                return -ENOMEM;
        }
        p = skb->data;
@@ -787,10 +787,10 @@ static int queue_sendconfig(avmcard *card, char cval[4])
        unsigned long flags;
        void *p;
 
-       skb = alloc_skb(3+4, GFP_ATOMIC);
+       skb = alloc_skb(3 + 4, GFP_ATOMIC);
        if (!skb) {
                printk(KERN_CRIT "%s: no memory, send config\n",
-                                       card->name);
+                      card->name);
                return -ENOMEM;
        }
        p = skb->data;
@@ -804,20 +804,20 @@ static int queue_sendconfig(avmcard *card, char cval[4])
        skb_put(skb, (u8 *)p - (u8 *)skb->data);
 
        skb_queue_tail(&card->dma->send_queue, skb);
-       
+
        spin_lock_irqsave(&card->lock, flags);
        c4_dispatch_tx(card);
        spin_unlock_irqrestore(&card->lock, flags);
        return 0;
 }
 
-static int c4_send_config(avmcard *card, capiloaddatapart * config)
+static int c4_send_config(avmcard *card, capiloaddatapart *config)
 {
        u8 val[4];
        unsigned char *dp;
        u_int left;
        int retval;
-       
+
        if ((retval = queue_sendconfigword(card, 1)) != 0)
                return retval;
        if ((retval = queue_sendconfigword(card, config->len)) != 0)
@@ -826,7 +826,7 @@ static int c4_send_config(avmcard *card, capiloaddatapart * config)
        dp = config->data;
        left = config->len;
        while (left >= sizeof(u32)) {
-               if (config->user) {
+               if (config->user) {
                        if (copy_from_user(val, dp, sizeof(val)))
                                return -EFAULT;
                } else {
@@ -860,37 +860,37 @@ static int c4_load_firmware(struct capi_ctr *ctrl, capiloaddata *data)
 
        if ((retval = c4_load_t4file(card, &data->firmware))) {
                printk(KERN_ERR "%s: failed to load t4file!!\n",
-                                       card->name);
+                      card->name);
                c4_reset(card);
                return retval;
        }
 
        card->csr = 0;
-       c4outmeml(card->mbase+MBOX_UP_LEN, 0);
-       c4outmeml(card->mbase+MBOX_DOWN_LEN, 0);
-       c4outmeml(card->mbase+DOORBELL, DBELL_INIT);
+       c4outmeml(card->mbase + MBOX_UP_LEN, 0);
+       c4outmeml(card->mbase + MBOX_DOWN_LEN, 0);
+       c4outmeml(card->mbase + DOORBELL, DBELL_INIT);
        mdelay(1);
-       c4outmeml(card->mbase+DOORBELL,
-                       DBELL_UP_HOST | DBELL_DOWN_HOST | DBELL_RESET_HOST);
+       c4outmeml(card->mbase + DOORBELL,
+                 DBELL_UP_HOST | DBELL_DOWN_HOST | DBELL_RESET_HOST);
 
-       c4outmeml(card->mbase+PCI_OUT_INT_MASK, 0x08);
+       c4outmeml(card->mbase + PCI_OUT_INT_MASK, 0x08);
 
        card->dma->recvlen = 0;
-       c4outmeml(card->mbase+MBOX_UP_ADDR, card->dma->recvbuf.dmaaddr);
-       c4outmeml(card->mbase+MBOX_UP_LEN, card->dma->recvbuf.size);
-       c4outmeml(card->mbase+DOORBELL, DBELL_UP_ARM);
+       c4outmeml(card->mbase + MBOX_UP_ADDR, card->dma->recvbuf.dmaaddr);
+       c4outmeml(card->mbase + MBOX_UP_LEN, card->dma->recvbuf.size);
+       c4outmeml(card->mbase + DOORBELL, DBELL_UP_ARM);
 
        if (data->configuration.len > 0 && data->configuration.data) {
                retval = c4_send_config(card, &data->configuration);
                if (retval) {
                        printk(KERN_ERR "%s: failed to set config!!\n",
-                                       card->name);
+                              card->name);
                        c4_reset(card);
                        return retval;
                }
        }
 
-        c4_send_init(card);
+       c4_send_init(card);
 
        return 0;
 }
@@ -905,11 +905,11 @@ static void c4_reset_ctr(struct capi_ctr *ctrl)
 
        spin_lock_irqsave(&card->lock, flags);
 
-       c4_reset(card);
+       c4_reset(card);
 
        spin_unlock_irqrestore(&card->lock, flags);
 
-        for (i=0; i < card->nr_controllers; i++) {
+       for (i = 0; i < card->nr_controllers; i++) {
                cinfo = &card->ctrlinfo[i];
                memset(cinfo->version, 0, sizeof(cinfo->version));
                capi_ctr_down(&cinfo->capi_ctrl);
@@ -926,9 +926,9 @@ static void c4_remove(struct pci_dev *pdev)
        if (!card)
                return;
 
-       c4_reset(card);
+       c4_reset(card);
 
-        for (i=0; i < card->nr_controllers; i++) {
+       for (i = 0; i < card->nr_controllers; i++) {
                cinfo = &card->ctrlinfo[i];
                detach_capi_ctr(&cinfo->capi_ctrl);
        }
@@ -936,8 +936,8 @@ static void c4_remove(struct pci_dev *pdev)
        free_irq(card->irq, card);
        iounmap(card->mbase);
        release_region(card->port, AVMB1_PORTLEN);
-        avmcard_dma_free(card->dma);
-        pci_set_drvdata(pdev, NULL);
+       avmcard_dma_free(card->dma);
+       pci_set_drvdata(pdev, NULL);
        b1_free_card(card);
 }
 
@@ -945,8 +945,8 @@ static void c4_remove(struct pci_dev *pdev)
 
 
 static void c4_register_appl(struct capi_ctr *ctrl,
-                               u16 appl,
-                               capi_register_params *rp)
+                            u16 appl,
+                            capi_register_params *rp)
 {
        avmctrl_info *cinfo = (avmctrl_info *)(ctrl->driverdata);
        avmcard *card = cinfo->card;
@@ -965,7 +965,7 @@ static void c4_register_appl(struct capi_ctr *ctrl,
                skb = alloc_skb(23, GFP_ATOMIC);
                if (!skb) {
                        printk(KERN_CRIT "%s: no memory, lost register appl.\n",
-                                               card->name);
+                              card->name);
                        return;
                }
                p = skb->data;
@@ -973,14 +973,14 @@ static void c4_register_appl(struct capi_ctr *ctrl,
                _put_byte(&p, 0);
                _put_byte(&p, SEND_REGISTER);
                _put_word(&p, appl);
-               _put_word(&p, 1024 * (nconn+1));
+               _put_word(&p, 1024 * (nconn + 1));
                _put_word(&p, nconn);
                _put_word(&p, rp->datablkcnt);
                _put_word(&p, rp->datablklen);
                skb_put(skb, (u8 *)p - (u8 *)skb->data);
 
                skb_queue_tail(&card->dma->send_queue, skb);
-       
+
                spin_lock_irqsave(&card->lock, flags);
                c4_dispatch_tx(card);
                spin_unlock_irqrestore(&card->lock, flags);
@@ -1005,7 +1005,7 @@ static void c4_release_appl(struct capi_ctr *ctrl, u16 appl)
                skb = alloc_skb(7, GFP_ATOMIC);
                if (!skb) {
                        printk(KERN_CRIT "%s: no memory, lost release appl.\n",
-                                               card->name);
+                              card->name);
                        return;
                }
                p = skb->data;
@@ -1098,29 +1098,29 @@ static int c4_proc_show(struct seq_file *m, void *v)
                seq_printf(m, "%-16s %s\n", "ver_serial", s);
 
        if (card->cardtype != avm_m1) {
-               flag = ((u8 *)(ctrl->profile.manu))[3];
-               if (flag)
+               flag = ((u8 *)(ctrl->profile.manu))[3];
+               if (flag)
                        seq_printf(m, "%-16s%s%s%s%s%s%s%s\n",
-                       "protocol",
-                       (flag & 0x01) ? " DSS1" : "",
-                       (flag & 0x02) ? " CT1" : "",
-                       (flag & 0x04) ? " VN3" : "",
-                       (flag & 0x08) ? " NI1" : "",
-                       (flag & 0x10) ? " AUSTEL" : "",
-                       (flag & 0x20) ? " ESS" : "",
-                       (flag & 0x40) ? " 1TR6" : ""
-                       );
+                                  "protocol",
+                                  (flag & 0x01) ? " DSS1" : "",
+                                  (flag & 0x02) ? " CT1" : "",
+                                  (flag & 0x04) ? " VN3" : "",
+                                  (flag & 0x08) ? " NI1" : "",
+                                  (flag & 0x10) ? " AUSTEL" : "",
+                                  (flag & 0x20) ? " ESS" : "",
+                                  (flag & 0x40) ? " 1TR6" : ""
+                               );
        }
        if (card->cardtype != avm_m1) {
-               flag = ((u8 *)(ctrl->profile.manu))[5];
+               flag = ((u8 *)(ctrl->profile.manu))[5];
                if (flag)
                        seq_printf(m, "%-16s%s%s%s%s\n",
-                       "linetype",
-                       (flag & 0x01) ? " point to point" : "",
-                       (flag & 0x02) ? " point to multipoint" : "",
-                       (flag & 0x08) ? " leased line without D-channel" : "",
-                       (flag & 0x04) ? " leased line with D-channel" : ""
-                       );
+                                  "linetype",
+                                  (flag & 0x01) ? " point to point" : "",
+                                  (flag & 0x02) ? " point to multipoint" : "",
+                                  (flag & 0x08) ? " leased line without D-channel" : "",
+                                  (flag & 0x04) ? " leased line with D-channel" : ""
+                               );
        }
        seq_printf(m, "%-16s %s\n", "cardname", cinfo->cardname);
 
@@ -1156,7 +1156,7 @@ static int c4_add_card(struct capicardparams *p, struct pci_dev *dev,
                retval = -ENOMEM;
                goto err;
        }
-        card->dma = avmcard_dma_alloc("c4", dev, 2048+128, 2048+128);
+       card->dma = avmcard_dma_alloc("c4", dev, 2048 + 128, 2048 + 128);
        if (!card->dma) {
                printk(KERN_WARNING "c4: no memory.\n");
                retval = -ENOMEM;
@@ -1195,12 +1195,12 @@ static int c4_add_card(struct capicardparams *p, struct pci_dev *dev,
 
        retval = request_irq(card->irq, c4_interrupt, IRQF_SHARED, card->name, card);
        if (retval) {
-               printk(KERN_ERR "c4: unable to get IRQ %d.\n",card->irq);
+               printk(KERN_ERR "c4: unable to get IRQ %d.\n", card->irq);
                retval = -EBUSY;
                goto err_unmap;
        }
 
-       for (i=0; i < nr_controllers ; i++) {
+       for (i = 0; i < nr_controllers; i++) {
                cinfo = &card->ctrlinfo[i];
                cinfo->capi_ctrl.owner = THIS_MODULE;
                cinfo->capi_ctrl.driver_name   = "c4";
@@ -1233,17 +1233,17 @@ static int c4_add_card(struct capicardparams *p, struct pci_dev *dev,
        pci_set_drvdata(dev, card);
        return 0;
 
- err_free_irq:
+err_free_irq:
        free_irq(card->irq, card);
- err_unmap:
+err_unmap:
        iounmap(card->mbase);
- err_release_region:
+err_release_region:
        release_region(card->port, AVMB1_PORTLEN);
- err_free_dma:
+err_free_dma:
        avmcard_dma_free(card->dma);
- err_free:
+err_free:
        b1_free_card(card);
- err:
+err:
        return retval;
 }
 
@@ -1265,10 +1265,10 @@ static int __devinit c4_probe(struct pci_dev *dev,
        param.port = pci_resource_start(dev, 1);
        param.irq = dev->irq;
        param.membase = pci_resource_start(dev, 0);
-       
+
        printk(KERN_INFO "c4: PCI BIOS reports AVM-C%d at i/o %#x, irq %d, mem %#x\n",
               nr, param.port, param.irq, param.membase);
-       
+
        retval = c4_add_card(&param, dev, nr);
        if (retval != 0) {
                printk(KERN_ERR "c4: no AVM-C%d at i/o %#x, irq %d detected, mem %#x\n",
@@ -1280,10 +1280,10 @@ static int __devinit c4_probe(struct pci_dev *dev,
 }
 
 static struct pci_driver c4_pci_driver = {
-       .name           = "c4",
-       .id_table       = c4_pci_tbl,
-       .probe          = c4_probe,
-       .remove         = c4_remove,
+       .name           = "c4",
+       .id_table       = c4_pci_tbl,
+       .probe          = c4_probe,
+       .remove         = c4_remove,
 };
 
 static struct capi_driver capi_driver_c2 = {
@@ -1305,7 +1305,7 @@ static int __init c4_init(void)
        if ((p = strchr(revision, ':')) != NULL && p[1]) {
                strlcpy(rev, p + 2, 32);
                if ((p = strchr(rev, '$')) != NULL && p > rev)
-                  *(p-1) = 0;
+                       *(p - 1) = 0;
        } else
                strcpy(rev, "1.0");
 
index 08216b1..72ef188 100644 (file)
@@ -1,9 +1,9 @@
 /* $Id: t1isa.c,v 1.1.2.3 2004/02/10 01:07:12 keil Exp $
- * 
+ *
  * Module for AVM T1 HEMA-card.
- * 
+ *
  * Copyright 1999 by Carsten Paeth <calle@calle.de>
- * 
+ *
  * This software may be used and distributed according to the terms
  * of the GNU General Public License, incorporated herein by reference.
  *
@@ -67,7 +67,7 @@ static int t1_detectandinit(unsigned int base, unsigned irq, int cardnr)
        int i;
 
        reverse_cardnr =   ((cardnr & 0x01) << 3) | ((cardnr & 0x02) << 1)
-                        | ((cardnr & 0x04) >> 1) | ((cardnr & 0x08) >> 3);
+               | ((cardnr & 0x04) >> 1) | ((cardnr & 0x08) >> 3);
        cregs[0] = (HEMA_VERSION_ID << 4) | (reverse_cardnr & 0xf);
        cregs[1] = 0x00; /* fast & slow link connected to CON1 */
        cregs[2] = 0x05; /* fast link 20MBit, slow link 20 MBit */
@@ -86,50 +86,50 @@ static int t1_detectandinit(unsigned int base, unsigned irq, int cardnr)
        /* board reset */
        t1outp(base, T1_RESETBOARD, 0xf);
        mdelay(100);
-       dummy = t1inp(base, T1_FASTLINK+T1_OUTSTAT); /* first read */
+       dummy = t1inp(base, T1_FASTLINK + T1_OUTSTAT); /* first read */
 
        /* write config */
        dummy = (base >> 4) & 0xff;
-       for (i=1;i<=0xf;i++) t1outp(base, i, dummy);
+       for (i = 1; i <= 0xf; i++) t1outp(base, i, dummy);
        t1outp(base, HEMA_PAL_ID & 0xf, dummy);
        t1outp(base, HEMA_PAL_ID >> 4, cregs[0]);
-       for(i=1;i<7;i++) t1outp(base, 0, cregs[i]);
+       for (i = 1; i < 7; i++) t1outp(base, 0, cregs[i]);
        t1outp(base, ((base >> 4)) & 0x3, cregs[7]);
        /* restore_flags(flags); */
 
        mdelay(100);
-       t1outp(base, T1_FASTLINK+T1_RESETLINK, 0);
-       t1outp(base, T1_SLOWLINK+T1_RESETLINK, 0);
+       t1outp(base, T1_FASTLINK + T1_RESETLINK, 0);
+       t1outp(base, T1_SLOWLINK + T1_RESETLINK, 0);
        mdelay(10);
-       t1outp(base, T1_FASTLINK+T1_RESETLINK, 1);
-       t1outp(base, T1_SLOWLINK+T1_RESETLINK, 1);
+       t1outp(base, T1_FASTLINK + T1_RESETLINK, 1);
+       t1outp(base, T1_SLOWLINK + T1_RESETLINK, 1);
        mdelay(100);
-       t1outp(base, T1_FASTLINK+T1_RESETLINK, 0);
-       t1outp(base, T1_SLOWLINK+T1_RESETLINK, 0);
+       t1outp(base, T1_FASTLINK + T1_RESETLINK, 0);
+       t1outp(base, T1_SLOWLINK + T1_RESETLINK, 0);
        mdelay(10);
-       t1outp(base, T1_FASTLINK+T1_ANALYSE, 0);
+       t1outp(base, T1_FASTLINK + T1_ANALYSE, 0);
        mdelay(5);
-       t1outp(base, T1_SLOWLINK+T1_ANALYSE, 0);
+       t1outp(base, T1_SLOWLINK + T1_ANALYSE, 0);
 
-       if (t1inp(base, T1_FASTLINK+T1_OUTSTAT) != 0x1) /* tx empty */
+       if (t1inp(base, T1_FASTLINK + T1_OUTSTAT) != 0x1) /* tx empty */
                return 1;
-       if (t1inp(base, T1_FASTLINK+T1_INSTAT) != 0x0) /* rx empty */
+       if (t1inp(base, T1_FASTLINK + T1_INSTAT) != 0x0) /* rx empty */
                return 2;
-       if (t1inp(base, T1_FASTLINK+T1_IRQENABLE) != 0x0)
+       if (t1inp(base, T1_FASTLINK + T1_IRQENABLE) != 0x0)
                return 3;
-       if ((t1inp(base, T1_FASTLINK+T1_FIFOSTAT) & 0xf0) != 0x70)
+       if ((t1inp(base, T1_FASTLINK + T1_FIFOSTAT) & 0xf0) != 0x70)
                return 4;
-       if ((t1inp(base, T1_FASTLINK+T1_IRQMASTER) & 0x0e) != 0)
+       if ((t1inp(base, T1_FASTLINK + T1_IRQMASTER) & 0x0e) != 0)
                return 5;
-       if ((t1inp(base, T1_FASTLINK+T1_IDENT) & 0x7d) != 1)
+       if ((t1inp(base, T1_FASTLINK + T1_IDENT) & 0x7d) != 1)
                return 6;
-       if (t1inp(base, T1_SLOWLINK+T1_OUTSTAT) != 0x1) /* tx empty */
+       if (t1inp(base, T1_SLOWLINK + T1_OUTSTAT) != 0x1) /* tx empty */
                return 7;
-       if ((t1inp(base, T1_SLOWLINK+T1_IRQMASTER) & 0x0e) != 0)
+       if ((t1inp(base, T1_SLOWLINK + T1_IRQMASTER) & 0x0e) != 0)
                return 8;
-       if ((t1inp(base, T1_SLOWLINK+T1_IDENT) & 0x7d) != 0)
+       if ((t1inp(base, T1_SLOWLINK + T1_IDENT) & 0x7d) != 0)
                return 9;
-        return 0;
+       return 0;
 }
 
 static irqreturn_t t1isa_interrupt(int interrupt, void *devptr)
@@ -163,13 +163,13 @@ static irqreturn_t t1isa_interrupt(int interrupt, void *devptr)
                        spin_unlock_irqrestore(&card->lock, flags);
 
                        if (MsgLen < 30) { /* not CAPI 64Bit */
-                               memset(card->msgbuf+MsgLen, 0, 30-MsgLen);
+                               memset(card->msgbuf + MsgLen, 0, 30 - MsgLen);
                                MsgLen = 30;
                                CAPIMSG_SETLEN(card->msgbuf, 30);
                        }
-                       if (!(skb = alloc_skb(DataB3Len+MsgLen, GFP_ATOMIC))) {
+                       if (!(skb = alloc_skb(DataB3Len + MsgLen, GFP_ATOMIC))) {
                                printk(KERN_ERR "%s: incoming packet dropped\n",
-                                       card->name);
+                                      card->name);
                        } else {
                                memcpy(skb_put(skb, MsgLen), card->msgbuf, MsgLen);
                                memcpy(skb_put(skb, DataB3Len), card->databuf, DataB3Len);
@@ -184,7 +184,7 @@ static irqreturn_t t1isa_interrupt(int interrupt, void *devptr)
                        if (!(skb = alloc_skb(MsgLen, GFP_ATOMIC))) {
                                spin_unlock_irqrestore(&card->lock, flags);
                                printk(KERN_ERR "%s: incoming packet dropped\n",
-                                               card->name);
+                                      card->name);
                        } else {
                                memcpy(skb_put(skb, MsgLen), card->msgbuf, MsgLen);
                                if (CAPIMSG_CMD(skb->data) == CAPI_DATA_B3)
@@ -242,24 +242,24 @@ static irqreturn_t t1isa_interrupt(int interrupt, void *devptr)
                        MsgLen = t1_get_slice(card->port, card->msgbuf);
                        spin_unlock_irqrestore(&card->lock, flags);
                        card->msgbuf[MsgLen] = 0;
-                       while (    MsgLen > 0
-                              && (   card->msgbuf[MsgLen-1] == '\n'
-                                  || card->msgbuf[MsgLen-1] == '\r')) {
-                               card->msgbuf[MsgLen-1] = 0;
+                       while (MsgLen > 0
+                              && (card->msgbuf[MsgLen - 1] == '\n'
+                                  || card->msgbuf[MsgLen - 1] == '\r')) {
+                               card->msgbuf[MsgLen - 1] = 0;
                                MsgLen--;
                        }
                        printk(KERN_INFO "%s: task %d \"%s\" ready.\n",
-                                       card->name, ApplId, card->msgbuf);
+                              card->name, ApplId, card->msgbuf);
                        break;
 
                case RECEIVE_DEBUGMSG:
                        MsgLen = t1_get_slice(card->port, card->msgbuf);
                        spin_unlock_irqrestore(&card->lock, flags);
                        card->msgbuf[MsgLen] = 0;
-                       while (    MsgLen > 0
-                              && (   card->msgbuf[MsgLen-1] == '\n'
-                                  || card->msgbuf[MsgLen-1] == '\r')) {
-                               card->msgbuf[MsgLen-1] = 0;
+                       while (MsgLen > 0
+                              && (card->msgbuf[MsgLen - 1] == '\n'
+                                  || card->msgbuf[MsgLen - 1] == '\r')) {
+                               card->msgbuf[MsgLen - 1] = 0;
                                MsgLen--;
                        }
                        printk(KERN_INFO "%s: DEBUG: %s\n", card->name, card->msgbuf);
@@ -273,7 +273,7 @@ static irqreturn_t t1isa_interrupt(int interrupt, void *devptr)
                default:
                        spin_unlock_irqrestore(&card->lock, flags);
                        printk(KERN_ERR "%s: b1_interrupt: 0x%x ???\n",
-                                       card->name, b1cmd);
+                              card->name, b1cmd);
                        return IRQ_NONE;
                }
        }
@@ -296,7 +296,7 @@ static int t1isa_load_firmware(struct capi_ctr *ctrl, capiloaddata *data)
        if ((retval = b1_load_t4file(card, &data->firmware))) {
                b1_reset(port);
                printk(KERN_ERR "%s: failed to load t4file!!\n",
-                                       card->name);
+                      card->name);
                return retval;
        }
 
@@ -304,7 +304,7 @@ static int t1isa_load_firmware(struct capi_ctr *ctrl, capiloaddata *data)
                if ((retval = b1_load_config(card, &data->configuration))) {
                        b1_reset(port);
                        printk(KERN_ERR "%s: failed to load config!!\n",
-                                       card->name);
+                              card->name);
                        return retval;
                }
        }
@@ -318,7 +318,7 @@ static int t1isa_load_firmware(struct capi_ctr *ctrl, capiloaddata *data)
        b1_setinterrupt(port, card->irq, card->cardtype);
        b1_put_byte(port, SEND_INIT);
        b1_put_word(port, CAPI_MAXAPPL);
-       b1_put_word(port, AVM_NCCI_PER_CHANNEL*30);
+       b1_put_word(port, AVM_NCCI_PER_CHANNEL * 30);
        b1_put_word(port, ctrl->cnr - 1);
        spin_unlock_irqrestore(&card->lock, flags);
 
@@ -347,7 +347,7 @@ static void t1isa_remove(struct pci_dev *pdev)
 {
        avmctrl_info *cinfo = pci_get_drvdata(pdev);
        avmcard *card;
-       
+
        if (!cinfo)
                return;
 
@@ -393,7 +393,7 @@ static int t1isa_probe(struct pci_dev *pdev, int cardnr)
                printk(KERN_WARNING "t1isa: invalid port 0x%x.\n", card->port);
                retval = -EINVAL;
                goto err_free;
-        }
+       }
        if (hema_irq_table[card->irq & 0xf] == 0) {
                printk(KERN_WARNING "t1isa: irq %d not valid.\n", card->irq);
                retval = -EINVAL;
@@ -412,7 +412,7 @@ static int t1isa_probe(struct pci_dev *pdev, int cardnr)
                goto err_release_region;
        }
 
-        if ((retval = t1_detectandinit(card->port, card->irq, card->cardnr)) != 0) {
+       if ((retval = t1_detectandinit(card->port, card->irq, card->cardnr)) != 0) {
                printk(KERN_INFO "t1isa: NO card at 0x%x (%d)\n",
                       card->port, retval);
                retval = -ENODEV;
@@ -445,13 +445,13 @@ static int t1isa_probe(struct pci_dev *pdev, int cardnr)
        pci_set_drvdata(pdev, cinfo);
        return 0;
 
- err_free_irq:
+err_free_irq:
        free_irq(card->irq, card);
- err_release_region:
+err_release_region:
        release_region(card->port, AVMB1_PORTLEN);
- err_free:
+err_free:
        b1_free_card(card);
- err:
+err:
        return retval;
 }
 
@@ -555,7 +555,7 @@ static int __init t1isa_init(void)
        if ((p = strchr(revision, ':')) != NULL && p[1]) {
                strlcpy(rev, p + 2, 32);
                if ((p = strchr(rev, '$')) != NULL && p > rev)
-                  *(p-1) = 0;
+                       *(p - 1) = 0;
        } else
                strcpy(rev, "1.0");
 
index a79eb5a..cb9a304 100644 (file)
@@ -1,9 +1,9 @@
 /* $Id: t1pci.c,v 1.1.2.2 2004/01/16 21:09:27 keil Exp $
- * 
+ *
  * Module for AVM T1 PCI-card.
- * 
+ *
  * Copyright 1999 by Carsten Paeth <calle@calle.de>
- * 
+ *
  * This software may be used and distributed according to the terms
  * of the GNU General Public License, incorporated herein by reference.
  *
@@ -59,7 +59,7 @@ static int t1pci_add_card(struct capicardparams *p, struct pci_dev *pdev)
                goto err;
        }
 
-        card->dma = avmcard_dma_alloc("t1pci", pdev, 2048+128, 2048+128);
+       card->dma = avmcard_dma_alloc("t1pci", pdev, 2048 + 128, 2048 + 128);
        if (!card->dma) {
                printk(KERN_WARNING "t1pci: no memory.\n");
                retval = -ENOMEM;
@@ -136,17 +136,17 @@ static int t1pci_add_card(struct capicardparams *p, struct pci_dev *pdev)
        pci_set_drvdata(pdev, card);
        return 0;
 
- err_free_irq:
+err_free_irq:
        free_irq(card->irq, card);
- err_unmap:
+err_unmap:
        iounmap(card->mbase);
- err_release_region:
+err_release_region:
        release_region(card->port, AVMB1_PORTLEN);
- err_free_dma:
+err_free_dma:
        avmcard_dma_free(card->dma);
- err_free:
+err_free:
        b1_free_card(card);
- err:
+err:
        return retval;
 }
 
@@ -157,7 +157,7 @@ static void t1pci_remove(struct pci_dev *pdev)
        avmcard *card = pci_get_drvdata(pdev);
        avmctrl_info *cinfo = card->ctrlinfo;
 
-       b1dma_reset(card);
+       b1dma_reset(card);
 
        detach_capi_ctr(&cinfo->capi_ctrl);
        free_irq(card->irq, card);
@@ -217,10 +217,10 @@ static int __devinit t1pci_probe(struct pci_dev *dev,
 }
 
 static struct pci_driver t1pci_pci_driver = {
-       .name           = "t1pci",
-       .id_table       = t1pci_pci_tbl,
-       .probe          = t1pci_probe,
-       .remove         = t1pci_remove,
+       .name           = "t1pci",
+       .id_table       = t1pci_pci_tbl,
+       .probe          = t1pci_probe,
+       .remove         = t1pci_remove,
 };
 
 static struct capi_driver capi_driver_t1pci = {
@@ -237,7 +237,7 @@ static int __init t1pci_init(void)
        if ((p = strchr(revision, ':')) != NULL && p[1]) {
                strlcpy(rev, p + 2, 32);
                if ((p = strchr(rev, '$')) != NULL && p > rev)
-                  *(p-1) = 0;
+                       *(p - 1) = 0;
        } else
                strcpy(rev, "1.0");
 
index 7ebcccd..391e417 100644 (file)
@@ -1,74 +1,74 @@
 
 /*
  *
-  Copyright (c) Eicon Networks, 2002.
+ Copyright (c) Eicon Networks, 2002.
  *
-  This source file is supplied for the use with
-  Eicon Networks range of DIVA Server Adapters.
+ This source file is supplied for the use with
+ Eicon Networks range of DIVA Server Adapters.
  *
-  Eicon File Revision :    2.1
+ Eicon File Revision :    2.1
  *
-  This program is free software; you can redistribute it and/or modify
-  it under the terms of the GNU General Public License as published by
-  the Free Software Foundation; either version 2, or (at your option)
-  any later version.
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
  *
-  This program is distributed in the hope that it will be useful,
-  but WITHOUT ANY WARRANTY OF ANY KIND WHATSOEVER INCLUDING ANY
-  implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-  See the GNU General Public License for more details.
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY OF ANY KIND WHATSOEVER INCLUDING ANY
+ implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ See the GNU General Public License for more details.
  *
-  You should have received a copy of the GNU General Public License
-  along with this program; if not, write to the Free Software
-  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  *
  */
-#ifndef _INC_CAPI20  
+#ifndef _INC_CAPI20
 #define _INC_CAPI20
-        /* operations on message queues                             */
-        /* the common device type for CAPI20 drivers */
+/* operations on message queues                             */
+/* the common device type for CAPI20 drivers */
 #define FILE_DEVICE_CAPI20 0x8001
-        /* DEVICE_CONTROL codes for user and kernel mode applications */
+/* DEVICE_CONTROL codes for user and kernel mode applications */
 #define CAPI20_CTL_REGISTER             0x0801
 #define CAPI20_CTL_RELEASE              0x0802
 #define CAPI20_CTL_GET_MANUFACTURER     0x0805
 #define CAPI20_CTL_GET_VERSION          0x0806
 #define CAPI20_CTL_GET_SERIAL           0x0807
 #define CAPI20_CTL_GET_PROFILE          0x0808
-        /* INTERNAL_DEVICE_CONTROL codes for kernel mode applicatios only */
+/* INTERNAL_DEVICE_CONTROL codes for kernel mode applicatios only */
 #define CAPI20_CTL_PUT_MESSAGE          0x0803
 #define CAPI20_CTL_GET_MESSAGE          0x0804
-        /* the wrapped codes as required by the system */
-#define CAPI_CTL_CODE(f,m)              CTL_CODE(FILE_DEVICE_CAPI20,f,m,FILE_ANY_ACCESS)
-#define IOCTL_CAPI_REGISTER             CAPI_CTL_CODE(CAPI20_CTL_REGISTER,METHOD_BUFFERED)
-#define IOCTL_CAPI_RELEASE              CAPI_CTL_CODE(CAPI20_CTL_RELEASE,METHOD_BUFFERED)
-#define IOCTL_CAPI_GET_MANUFACTURER     CAPI_CTL_CODE(CAPI20_CTL_GET_MANUFACTURER,METHOD_BUFFERED)
-#define IOCTL_CAPI_GET_VERSION          CAPI_CTL_CODE(CAPI20_CTL_GET_VERSION,METHOD_BUFFERED)
-#define IOCTL_CAPI_GET_SERIAL           CAPI_CTL_CODE(CAPI20_CTL_GET_SERIAL,METHOD_BUFFERED)
-#define IOCTL_CAPI_GET_PROFILE          CAPI_CTL_CODE(CAPI20_CTL_GET_PROFILE,METHOD_BUFFERED)
-#define IOCTL_CAPI_PUT_MESSAGE          CAPI_CTL_CODE(CAPI20_CTL_PUT_MESSAGE,METHOD_BUFFERED)
-#define IOCTL_CAPI_GET_MESSAGE          CAPI_CTL_CODE(CAPI20_CTL_GET_MESSAGE,METHOD_BUFFERED)
+/* the wrapped codes as required by the system */
+#define CAPI_CTL_CODE(f, m)             CTL_CODE(FILE_DEVICE_CAPI20, f, m, FILE_ANY_ACCESS)
+#define IOCTL_CAPI_REGISTER             CAPI_CTL_CODE(CAPI20_CTL_REGISTER, METHOD_BUFFERED)
+#define IOCTL_CAPI_RELEASE              CAPI_CTL_CODE(CAPI20_CTL_RELEASE, METHOD_BUFFERED)
+#define IOCTL_CAPI_GET_MANUFACTURER     CAPI_CTL_CODE(CAPI20_CTL_GET_MANUFACTURER, METHOD_BUFFERED)
+#define IOCTL_CAPI_GET_VERSION          CAPI_CTL_CODE(CAPI20_CTL_GET_VERSION, METHOD_BUFFERED)
+#define IOCTL_CAPI_GET_SERIAL           CAPI_CTL_CODE(CAPI20_CTL_GET_SERIAL, METHOD_BUFFERED)
+#define IOCTL_CAPI_GET_PROFILE          CAPI_CTL_CODE(CAPI20_CTL_GET_PROFILE, METHOD_BUFFERED)
+#define IOCTL_CAPI_PUT_MESSAGE          CAPI_CTL_CODE(CAPI20_CTL_PUT_MESSAGE, METHOD_BUFFERED)
+#define IOCTL_CAPI_GET_MESSAGE          CAPI_CTL_CODE(CAPI20_CTL_GET_MESSAGE, METHOD_BUFFERED)
 struct divas_capi_register_params  {
-  word MessageBufferSize;
-  word maxLogicalConnection;
-  word maxBDataBlocks;
-  word maxBDataLen;
+       word MessageBufferSize;
+       word maxLogicalConnection;
+       word maxBDataBlocks;
+       word maxBDataLen;
 };
 struct divas_capi_version  {
-  word CapiMajor;
-  word CapiMinor;
-  word ManuMajor;
-  word ManuMinor;
+       word CapiMajor;
+       word CapiMinor;
+       word ManuMajor;
+       word ManuMinor;
 };
 typedef struct api_profile_s {
-  word          Number;
-  word          Channels;
-  dword         Global_Options;
-  dword         B1_Protocols;
-  dword         B2_Protocols;
-  dword         B3_Protocols;
+       word          Number;
+       word          Channels;
+       dword         Global_Options;
+       dword         B1_Protocols;
+       dword         B2_Protocols;
+       dword         B3_Protocols;
 } API_PROFILE;
-        /* ISDN Common API message types                            */
+/* ISDN Common API message types                            */
 #define _ALERT_R                        0x8001
 #define _CONNECT_R                      0x8002
 #define _CONNECT_I                      0x8202
@@ -93,9 +93,9 @@ typedef struct api_profile_s {
 #define _CONNECT_B3_T90_ACTIVE_I        0x8288
 #define _MANUFACTURER_R                 0x80ff
 #define _MANUFACTURER_I                 0x82ff
-        /* OR this to convert a REQUEST to a CONFIRM                */
+/* OR this to convert a REQUEST to a CONFIRM                */
 #define CONFIRM                 0x0100
-        /* OR this to convert a INDICATION to a RESPONSE            */
+/* OR this to convert a INDICATION to a RESPONSE            */
 #define RESPONSE                0x0100
 /*------------------------------------------------------------------*/
 /* diehl isdn private MANUFACTURER codes                            */
@@ -115,248 +115,248 @@ typedef struct api_profile_s {
 /*------------------------------------------------------------------*/
 /* parameter structures                                             */
 /*------------------------------------------------------------------*/
-        /* ALERT-REQUEST                                            */
+/* ALERT-REQUEST                                            */
 typedef struct {
-  byte structs[1];      /* Additional Info */
+       byte structs[0];      /* Additional Info */
 } _ALT_REQP;
-        /* ALERT-CONFIRM                                            */
+/* ALERT-CONFIRM                                            */
 typedef struct {
-  word Info;
+       word Info;
 } _ALT_CONP;
-        /* CONNECT-REQUEST                                          */
-typedef struct {
-  word CIP_Value;
-  byte structs[1];      /* Called party number,
-                           Called party subaddress,
-                           Calling party number,
-                           Calling party subaddress,
-                           B_protocol,
-                           BC,
-                           LLC,
-                           HLC,
-                           Additional Info */
+/* CONNECT-REQUEST                                          */
+typedef struct {
+       word CIP_Value;
+       byte structs[0];      /* Called party number,
+                                Called party subaddress,
+                                Calling party number,
+                                Calling party subaddress,
+                                B_protocol,
+                                BC,
+                                LLC,
+                                HLC,
+                                Additional Info */
 } _CON_REQP;
-        /* CONNECT-CONFIRM                                          */
+/* CONNECT-CONFIRM                                          */
 typedef struct {
-  word Info;
+       word Info;
 } _CON_CONP;
-        /* CONNECT-INDICATION                                       */
-typedef struct {
-  word CIP_Value;
-  byte structs[1];      /* Called party number,
-                           Called party subaddress,
-                           Calling party number,
-                           Calling party subaddress,
-                           BC,
-                           LLC,
-                           HLC,
-                           Additional Info */
+/* CONNECT-INDICATION                                       */
+typedef struct {
+       word CIP_Value;
+       byte structs[0];      /* Called party number,
+                                Called party subaddress,
+                                Calling party number,
+                                Calling party subaddress,
+                                BC,
+                                LLC,
+                                HLC,
+                                Additional Info */
 } _CON_INDP;
-        /* CONNECT-RESPONSE                                         */
+/* CONNECT-RESPONSE                                         */
 typedef struct {
-  word Accept;
-  byte structs[1];      /* B_protocol,
-                           Connected party number,
-                           Connected party subaddress,
-                           LLC */
+       word Accept;
+       byte structs[0];      /* B_protocol,
+                                Connected party number,
+                                Connected party subaddress,
+                                LLC */
 } _CON_RESP;
-        /* CONNECT-ACTIVE-INDICATION                                */
+/* CONNECT-ACTIVE-INDICATION                                */
 typedef struct {
-  byte structs[1];      /* Connected party number,
-                           Connected party subaddress,
-                           LLC */
+       byte structs[0];      /* Connected party number,
+                                Connected party subaddress,
+                                LLC */
 } _CON_A_INDP;
-        /* CONNECT-ACTIVE-RESPONSE                                  */
+/* CONNECT-ACTIVE-RESPONSE                                  */
 typedef struct {
-  byte structs[1];      /* empty */
+       byte structs[0];      /* empty */
 } _CON_A_RESP;
-        /* DISCONNECT-REQUEST                                       */
+/* DISCONNECT-REQUEST                                       */
 typedef struct {
-  byte structs[1];      /* Additional Info */
+       byte structs[0];      /* Additional Info */
 } _DIS_REQP;
-        /* DISCONNECT-CONFIRM                                       */
+/* DISCONNECT-CONFIRM                                       */
 typedef struct {
-  word Info;
+       word Info;
 } _DIS_CONP;
-        /* DISCONNECT-INDICATION                                    */
+/* DISCONNECT-INDICATION                                    */
 typedef struct {
-  word Info;
+       word Info;
 } _DIS_INDP;
-        /* DISCONNECT-RESPONSE                                      */
+/* DISCONNECT-RESPONSE                                      */
 typedef struct {
-  byte structs[1];      /* empty */
+       byte structs[0];      /* empty */
 } _DIS_RESP;
-        /* LISTEN-REQUEST                                           */
+/* LISTEN-REQUEST                                           */
 typedef struct {
-  dword Info_Mask;
-  dword CIP_Mask;
-  byte structs[1];      /* Calling party number,
-                           Calling party subaddress */
+       dword Info_Mask;
+       dword CIP_Mask;
+       byte structs[0];      /* Calling party number,
+                                Calling party subaddress */
 } _LIS_REQP;
-        /* LISTEN-CONFIRM                                           */
+/* LISTEN-CONFIRM                                           */
 typedef struct {
-  word Info;
+       word Info;
 } _LIS_CONP;
-        /* INFO-REQUEST                                             */
+/* INFO-REQUEST                                             */
 typedef struct {
-  byte structs[1];      /* Called party number,
-                           Additional Info */
+       byte structs[0];      /* Called party number,
+                                Additional Info */
 } _INF_REQP;
-        /* INFO-CONFIRM                                             */
+/* INFO-CONFIRM                                             */
 typedef struct {
-  word Info;
+       word Info;
 } _INF_CONP;
-        /* INFO-INDICATION                                          */
+/* INFO-INDICATION                                          */
 typedef struct {
-  word Number;
-  byte structs[1];      /* Info element */
+       word Number;
+       byte structs[0];      /* Info element */
 } _INF_INDP;
-        /* INFO-RESPONSE                                            */
+/* INFO-RESPONSE                                            */
 typedef struct {
-  byte structs[1];      /* empty */
+       byte structs[0];      /* empty */
 } _INF_RESP;
-        /* SELECT-B-REQUEST                                         */
+/* SELECT-B-REQUEST                                         */
 typedef struct {
-  byte structs[1];      /* B-protocol */
+       byte structs[0];      /* B-protocol */
 } _SEL_B_REQP;
-        /* SELECT-B-CONFIRM                                         */
+/* SELECT-B-CONFIRM                                         */
 typedef struct {
-  word Info;
+       word Info;
 } _SEL_B_CONP;
-        /* FACILITY-REQUEST */
+/* FACILITY-REQUEST */
 typedef struct {
-  word Selector;
-  byte structs[1];      /* Facility parameters */
+       word Selector;
+       byte structs[0];      /* Facility parameters */
 } _FAC_REQP;
-        /* FACILITY-CONFIRM STRUCT FOR SUPPLEMENT. SERVICES */
+/* FACILITY-CONFIRM STRUCT FOR SUPPLEMENT. SERVICES */
 typedef struct {
-  byte  struct_length;
-  word  function;
-  byte  length;
-  word  SupplementaryServiceInfo;
-  dword SupportedServices;
+       byte  struct_length;
+       word  function;
+       byte  length;
+       word  SupplementaryServiceInfo;
+       dword SupportedServices;
 } _FAC_CON_STRUCTS;
-        /* FACILITY-CONFIRM */
+/* FACILITY-CONFIRM */
 typedef struct {
-  word Info;
-  word Selector;
-  byte structs[1];      /* Facility parameters */
+       word Info;
+       word Selector;
+       byte structs[0];      /* Facility parameters */
 } _FAC_CONP;
-        /* FACILITY-INDICATION */
+/* FACILITY-INDICATION */
 typedef struct {
-  word Selector;
-  byte structs[1];      /* Facility parameters */
+       word Selector;
+       byte structs[0];      /* Facility parameters */
 } _FAC_INDP;
-        /* FACILITY-RESPONSE */
+/* FACILITY-RESPONSE */
 typedef struct {
-  word Selector;
-  byte structs[1];      /* Facility parameters */
+       word Selector;
+       byte structs[0];      /* Facility parameters */
 } _FAC_RESP;
-        /* CONNECT-B3-REQUEST                                       */
+/* CONNECT-B3-REQUEST                                       */
 typedef struct {
-  byte structs[1];      /* NCPI */
+       byte structs[0];      /* NCPI */
 } _CON_B3_REQP;
-        /* CONNECT-B3-CONFIRM                                       */
+/* CONNECT-B3-CONFIRM                                       */
 typedef struct {
-  word Info;
+       word Info;
 } _CON_B3_CONP;
-        /* CONNECT-B3-INDICATION                                    */
+/* CONNECT-B3-INDICATION                                    */
 typedef struct {
-  byte structs[1];      /* NCPI */
+       byte structs[0];      /* NCPI */
 } _CON_B3_INDP;
-        /* CONNECT-B3-RESPONSE                                      */
+/* CONNECT-B3-RESPONSE                                      */
 typedef struct {
-  word Accept;
-  byte structs[1];      /* NCPI */
+       word Accept;
+       byte structs[0];      /* NCPI */
 } _CON_B3_RESP;
-        /* CONNECT-B3-ACTIVE-INDICATION                             */
+/* CONNECT-B3-ACTIVE-INDICATION                             */
 typedef struct {
-  byte structs[1];      /* NCPI */
+       byte structs[0];      /* NCPI */
 } _CON_B3_A_INDP;
-        /* CONNECT-B3-ACTIVE-RESPONSE                               */
+/* CONNECT-B3-ACTIVE-RESPONSE                               */
 typedef struct {
-  byte structs[1];      /* empty */
+       byte structs[0];      /* empty */
 } _CON_B3_A_RESP;
-        /* DISCONNECT-B3-REQUEST                                    */
+/* DISCONNECT-B3-REQUEST                                    */
 typedef struct {
-  byte structs[1];      /* NCPI */
+       byte structs[0];      /* NCPI */
 } _DIS_B3_REQP;
-        /* DISCONNECT-B3-CONFIRM                                    */
+/* DISCONNECT-B3-CONFIRM                                    */
 typedef struct {
-  word Info;
+       word Info;
 } _DIS_B3_CONP;
-        /* DISCONNECT-B3-INDICATION                                 */
+/* DISCONNECT-B3-INDICATION                                 */
 typedef struct {
-  word Info;
-  byte structs[1];      /* NCPI */
+       word Info;
+       byte structs[0];      /* NCPI */
 } _DIS_B3_INDP;
-        /* DISCONNECT-B3-RESPONSE                                   */
+/* DISCONNECT-B3-RESPONSE                                   */
 typedef struct {
-  byte structs[1];      /* empty */
+       byte structs[0];      /* empty */
 } _DIS_B3_RESP;
-        /* DATA-B3-REQUEST                                          */
+/* DATA-B3-REQUEST                                          */
 typedef struct {
-  dword         Data;
-  word          Data_Length;
-  word          Number;
-  word          Flags;
+       dword         Data;
+       word          Data_Length;
+       word          Number;
+       word          Flags;
 } _DAT_B3_REQP;
-        /* DATA-B3-REQUEST 64 BIT Systems                           */
+/* DATA-B3-REQUEST 64 BIT Systems                           */
 typedef struct {
-  dword         Data;
-  word          Data_Length;
-  word          Number;
-  word          Flags;
-  void          *pData;
+       dword         Data;
+       word          Data_Length;
+       word          Number;
+       word          Flags;
+       void          *pData;
 } _DAT_B3_REQ64P;
-        /* DATA-B3-CONFIRM                                          */
+/* DATA-B3-CONFIRM                                          */
 typedef struct {
-  word          Number;
-  word          Info;
+       word          Number;
+       word          Info;
 } _DAT_B3_CONP;
-        /* DATA-B3-INDICATION                                       */
+/* DATA-B3-INDICATION                                       */
 typedef struct {
-  dword         Data;
-  word          Data_Length;
-  word          Number;
-  word          Flags;
+       dword         Data;
+       word          Data_Length;
+       word          Number;
+       word          Flags;
 } _DAT_B3_INDP;
-        /* DATA-B3-INDICATION  64 BIT Systems                       */
+/* DATA-B3-INDICATION  64 BIT Systems                       */
 typedef struct {
-  dword         Data;
-  word          Data_Length;
-  word          Number;
-  word          Flags;
-  void          *pData;
+       dword         Data;
+       word          Data_Length;
+       word          Number;
+       word          Flags;
+       void          *pData;
 } _DAT_B3_IND64P;
-        /* DATA-B3-RESPONSE                                         */
+/* DATA-B3-RESPONSE                                         */
 typedef struct {
-  word          Number;
+       word          Number;
 } _DAT_B3_RESP;
-        /* RESET-B3-REQUEST                                         */
+/* RESET-B3-REQUEST                                         */
 typedef struct {
-  byte structs[1];      /* NCPI */
+       byte structs[0];      /* NCPI */
 } _RES_B3_REQP;
-        /* RESET-B3-CONFIRM                                         */
+/* RESET-B3-CONFIRM                                         */
 typedef struct {
-  word Info;
+       word Info;
 } _RES_B3_CONP;
-        /* RESET-B3-INDICATION                                      */
+/* RESET-B3-INDICATION                                      */
 typedef struct {
-  byte structs[1];      /* NCPI */
+       byte structs[0];      /* NCPI */
 } _RES_B3_INDP;
-        /* RESET-B3-RESPONSE                                        */
+/* RESET-B3-RESPONSE                                        */
 typedef struct {
-  byte structs[1];      /* empty */
+       byte structs[0];      /* empty */
 } _RES_B3_RESP;
-        /* CONNECT-B3-T90-ACTIVE-INDICATION                         */
+/* CONNECT-B3-T90-ACTIVE-INDICATION                         */
 typedef struct {
-  byte structs[1];      /* NCPI */
+       byte structs[0];      /* NCPI */
 } _CON_B3_T90_A_INDP;
-        /* CONNECT-B3-T90-ACTIVE-RESPONSE                           */
+/* CONNECT-B3-T90-ACTIVE-RESPONSE                           */
 typedef struct {
-  word Reject;
-  byte structs[1];      /* NCPI */
+       word Reject;
+       byte structs[0];      /* NCPI */
 } _CON_B3_T90_A_RESP;
 /*------------------------------------------------------------------*/
 /* message structure                                                */
@@ -364,64 +364,64 @@ typedef struct {
 typedef struct _API_MSG CAPI_MSG;
 typedef struct _MSG_HEADER CAPI_MSG_HEADER;
 struct _API_MSG {
-  struct _MSG_HEADER {
-    word        length;
-    word        appl_id;
-    word        command;
-    word        number;
-    byte        controller;
-    byte        plci;
-    word        ncci;
-  } header;
-  union {
-    _ALT_REQP           alert_req;
-    _ALT_CONP           alert_con;
-    _CON_REQP           connect_req;
-    _CON_CONP           connect_con;
-    _CON_INDP           connect_ind;
-    _CON_RESP           connect_res;
-    _CON_A_INDP         connect_a_ind;
-    _CON_A_RESP         connect_a_res;
-    _DIS_REQP           disconnect_req;
-    _DIS_CONP           disconnect_con;
-    _DIS_INDP           disconnect_ind;
-    _DIS_RESP           disconnect_res;
-    _LIS_REQP           listen_req;
-    _LIS_CONP           listen_con;
-    _INF_REQP           info_req;
-    _INF_CONP           info_con;
-    _INF_INDP           info_ind;
-    _INF_RESP           info_res;
-    _SEL_B_REQP         select_b_req;
-    _SEL_B_CONP         select_b_con;
-    _FAC_REQP           facility_req;
-    _FAC_CONP           facility_con;
-    _FAC_INDP           facility_ind;
-    _FAC_RESP           facility_res;
-    _CON_B3_REQP        connect_b3_req;
-    _CON_B3_CONP        connect_b3_con;
-    _CON_B3_INDP        connect_b3_ind;
-    _CON_B3_RESP        connect_b3_res;
-    _CON_B3_A_INDP      connect_b3_a_ind;
-    _CON_B3_A_RESP      connect_b3_a_res;
-    _DIS_B3_REQP        disconnect_b3_req;
-    _DIS_B3_CONP        disconnect_b3_con;
-    _DIS_B3_INDP        disconnect_b3_ind;
-    _DIS_B3_RESP        disconnect_b3_res;
-    _DAT_B3_REQP        data_b3_req;
-    _DAT_B3_REQ64P      data_b3_req64;
-    _DAT_B3_CONP        data_b3_con;
-    _DAT_B3_INDP        data_b3_ind;
-    _DAT_B3_IND64P      data_b3_ind64;
-    _DAT_B3_RESP        data_b3_res;
-    _RES_B3_REQP        reset_b3_req;
-    _RES_B3_CONP        reset_b3_con;
-    _RES_B3_INDP        reset_b3_ind;
-    _RES_B3_RESP        reset_b3_res;
-    _CON_B3_T90_A_INDP  connect_b3_t90_a_ind;
-    _CON_B3_T90_A_RESP  connect_b3_t90_a_res;
-    byte                b[200];
-  } info;
+       struct _MSG_HEADER {
+               word        length;
+               word        appl_id;
+               word        command;
+               word        number;
+               byte        controller;
+               byte        plci;
+               word        ncci;
+       } header;
+       union {
+               _ALT_REQP           alert_req;
+               _ALT_CONP           alert_con;
+               _CON_REQP           connect_req;
+               _CON_CONP           connect_con;
+               _CON_INDP           connect_ind;
+               _CON_RESP           connect_res;
+               _CON_A_INDP         connect_a_ind;
+               _CON_A_RESP         connect_a_res;
+               _DIS_REQP           disconnect_req;
+               _DIS_CONP           disconnect_con;
+               _DIS_INDP           disconnect_ind;
+               _DIS_RESP           disconnect_res;
+               _LIS_REQP           listen_req;
+               _LIS_CONP           listen_con;
+               _INF_REQP           info_req;
+               _INF_CONP           info_con;
+               _INF_INDP           info_ind;
+               _INF_RESP           info_res;
+               _SEL_B_REQP         select_b_req;
+               _SEL_B_CONP         select_b_con;
+               _FAC_REQP           facility_req;
+               _FAC_CONP           facility_con;
+               _FAC_INDP           facility_ind;
+               _FAC_RESP           facility_res;
+               _CON_B3_REQP        connect_b3_req;
+               _CON_B3_CONP        connect_b3_con;
+               _CON_B3_INDP        connect_b3_ind;
+               _CON_B3_RESP        connect_b3_res;
+               _CON_B3_A_INDP      connect_b3_a_ind;
+               _CON_B3_A_RESP      connect_b3_a_res;
+               _DIS_B3_REQP        disconnect_b3_req;
+               _DIS_B3_CONP        disconnect_b3_con;
+               _DIS_B3_INDP        disconnect_b3_ind;
+               _DIS_B3_RESP        disconnect_b3_res;
+               _DAT_B3_REQP        data_b3_req;
+               _DAT_B3_REQ64P      data_b3_req64;
+               _DAT_B3_CONP        data_b3_con;
+               _DAT_B3_INDP        data_b3_ind;
+               _DAT_B3_IND64P      data_b3_ind64;
+               _DAT_B3_RESP        data_b3_res;
+               _RES_B3_REQP        reset_b3_req;
+               _RES_B3_CONP        reset_b3_con;
+               _RES_B3_INDP        reset_b3_ind;
+               _RES_B3_RESP        reset_b3_res;
+               _CON_B3_T90_A_INDP  connect_b3_t90_a_ind;
+               _CON_B3_T90_A_RESP  connect_b3_t90_a_res;
+               byte                b[200];
+       } info;
 };
 /*------------------------------------------------------------------*/
 /* non-fatal errors                                                 */
@@ -696,4 +696,4 @@ struct _API_MSG {
 /* function prototypes                                              */
 /*------------------------------------------------------------------*/
 /*------------------------------------------------------------------*/
-#endif /* _INC_CAPI20 */  
+#endif /* _INC_CAPI20 */
index f130724..e3f7784 100644 (file)
@@ -1,34 +1,34 @@
 
 /*
  *
-  Copyright (c) Eicon Networks, 2002.
+ Copyright (c) Eicon Networks, 2002.
  *
-  This source file is supplied for the use with
-  Eicon Networks range of DIVA Server Adapters.
+ This source file is supplied for the use with
+ Eicon Networks range of DIVA Server Adapters.
  *
-  Eicon File Revision :    2.1
+ Eicon File Revision :    2.1
  *
-  This program is free software; you can redistribute it and/or modify
-  it under the terms of the GNU General Public License as published by
-  the Free Software Foundation; either version 2, or (at your option)
-  any later version.
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
  *
-  This program is distributed in the hope that it will be useful,
-  but WITHOUT ANY WARRANTY OF ANY KIND WHATSOEVER INCLUDING ANY
-  implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-  See the GNU General Public License for more details.
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY OF ANY KIND WHATSOEVER INCLUDING ANY
+ implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ See the GNU General Public License for more details.
  *
-  You should have received a copy of the GNU General Public License
-  along with this program; if not, write to the Free Software
-  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  *
  */
 
 #include "platform.h"
 
 
-  
-  
+
+
 
 
 
 
 static short capidtmf_expand_table_alaw[0x0100] =
 {
-   -5504,   5504,   -344,    344, -22016,  22016,  -1376,   1376,
-   -2752,   2752,    -88,     88, -11008,  11008,   -688,    688,
-   -7552,   7552,   -472,    472, -30208,  30208,  -1888,   1888,
-   -3776,   3776,   -216,    216, -15104,  15104,   -944,    944,
-   -4480,   4480,   -280,    280, -17920,  17920,  -1120,   1120,
-   -2240,   2240,    -24,     24,  -8960,   8960,   -560,    560,
-   -6528,   6528,   -408,    408, -26112,  26112,  -1632,   1632,
-   -3264,   3264,   -152,    152, -13056,  13056,   -816,    816,
-   -6016,   6016,   -376,    376, -24064,  24064,  -1504,   1504,
-   -3008,   3008,   -120,    120, -12032,  12032,   -752,    752,
-   -8064,   8064,   -504,    504, -32256,  32256,  -2016,   2016,
-   -4032,   4032,   -248,    248, -16128,  16128,  -1008,   1008,
-   -4992,   4992,   -312,    312, -19968,  19968,  -1248,   1248,
-   -2496,   2496,    -56,     56,  -9984,   9984,   -624,    624,
-   -7040,   7040,   -440,    440, -28160,  28160,  -1760,   1760,
-   -3520,   3520,   -184,    184, -14080,  14080,   -880,    880,
-   -5248,   5248,   -328,    328, -20992,  20992,  -1312,   1312,
-   -2624,   2624,    -72,     72, -10496,  10496,   -656,    656,
-   -7296,   7296,   -456,    456, -29184,  29184,  -1824,   1824,
-   -3648,   3648,   -200,    200, -14592,  14592,   -912,    912,
-   -4224,   4224,   -264,    264, -16896,  16896,  -1056,   1056,
-   -2112,   2112,     -8,      8,  -8448,   8448,   -528,    528,
-   -6272,   6272,   -392,    392, -25088,  25088,  -1568,   1568,
-   -3136,   3136,   -136,    136, -12544,  12544,   -784,    784,
-   -5760,   5760,   -360,    360, -23040,  23040,  -1440,   1440,
-   -2880,   2880,   -104,    104, -11520,  11520,   -720,    720,
-   -7808,   7808,   -488,    488, -31232,  31232,  -1952,   1952,
-   -3904,   3904,   -232,    232, -15616,  15616,   -976,    976,
-   -4736,   4736,   -296,    296, -18944,  18944,  -1184,   1184,
-   -2368,   2368,    -40,     40,  -9472,   9472,   -592,    592,
-   -6784,   6784,   -424,    424, -27136,  27136,  -1696,   1696,
-   -3392,   3392,   -168,    168, -13568,  13568,   -848,    848
+       -5504,   5504,   -344,    344, -22016,  22016,  -1376,   1376,
+       -2752,   2752,    -88,     88, -11008,  11008,   -688,    688,
+       -7552,   7552,   -472,    472, -30208,  30208,  -1888,   1888,
+       -3776,   3776,   -216,    216, -15104,  15104,   -944,    944,
+       -4480,   4480,   -280,    280, -17920,  17920,  -1120,   1120,
+       -2240,   2240,    -24,     24,  -8960,   8960,   -560,    560,
+       -6528,   6528,   -408,    408, -26112,  26112,  -1632,   1632,
+       -3264,   3264,   -152,    152, -13056,  13056,   -816,    816,
+       -6016,   6016,   -376,    376, -24064,  24064,  -1504,   1504,
+       -3008,   3008,   -120,    120, -12032,  12032,   -752,    752,
+       -8064,   8064,   -504,    504, -32256,  32256,  -2016,   2016,
+       -4032,   4032,   -248,    248, -16128,  16128,  -1008,   1008,
+       -4992,   4992,   -312,    312, -19968,  19968,  -1248,   1248,
+       -2496,   2496,    -56,     56,  -9984,   9984,   -624,    624,
+       -7040,   7040,   -440,    440, -28160,  28160,  -1760,   1760,
+       -3520,   3520,   -184,    184, -14080,  14080,   -880,    880,
+       -5248,   5248,   -328,    328, -20992,  20992,  -1312,   1312,
+       -2624,   2624,    -72,     72, -10496,  10496,   -656,    656,
+       -7296,   7296,   -456,    456, -29184,  29184,  -1824,   1824,
+       -3648,   3648,   -200,    200, -14592,  14592,   -912,    912,
+       -4224,   4224,   -264,    264, -16896,  16896,  -1056,   1056,
+       -2112,   2112,     -8,      8,  -8448,   8448,   -528,    528,
+       -6272,   6272,   -392,    392, -25088,  25088,  -1568,   1568,
+       -3136,   3136,   -136,    136, -12544,  12544,   -784,    784,
+       -5760,   5760,   -360,    360, -23040,  23040,  -1440,   1440,
+       -2880,   2880,   -104,    104, -11520,  11520,   -720,    720,
+       -7808,   7808,   -488,    488, -31232,  31232,  -1952,   1952,
+       -3904,   3904,   -232,    232, -15616,  15616,   -976,    976,
+       -4736,   4736,   -296,    296, -18944,  18944,  -1184,   1184,
+       -2368,   2368,    -40,     40,  -9472,   9472,   -592,    592,
+       -6784,   6784,   -424,    424, -27136,  27136,  -1696,   1696,
+       -3392,   3392,   -168,    168, -13568,  13568,   -848,    848
 };
 
 static short capidtmf_expand_table_ulaw[0x0100] =
 {
-  -32124,  32124,  -1884,   1884,  -7932,   7932,   -372,    372,
-  -15996,  15996,   -876,    876,  -3900,   3900,   -120,    120,
-  -23932,  23932,  -1372,   1372,  -5884,   5884,   -244,    244,
-  -11900,  11900,   -620,    620,  -2876,   2876,    -56,     56,
-  -28028,  28028,  -1628,   1628,  -6908,   6908,   -308,    308,
-  -13948,  13948,   -748,    748,  -3388,   3388,    -88,     88,
-  -19836,  19836,  -1116,   1116,  -4860,   4860,   -180,    180,
-   -9852,   9852,   -492,    492,  -2364,   2364,    -24,     24,
-  -30076,  30076,  -1756,   1756,  -7420,   7420,   -340,    340,
-  -14972,  14972,   -812,    812,  -3644,   3644,   -104,    104,
-  -21884,  21884,  -1244,   1244,  -5372,   5372,   -212,    212,
-  -10876,  10876,   -556,    556,  -2620,   2620,    -40,     40,
-  -25980,  25980,  -1500,   1500,  -6396,   6396,   -276,    276,
-  -12924,  12924,   -684,    684,  -3132,   3132,    -72,     72,
-  -17788,  17788,   -988,    988,  -4348,   4348,   -148,    148,
-   -8828,   8828,   -428,    428,  -2108,   2108,     -8,      8,
-  -31100,  31100,  -1820,   1820,  -7676,   7676,   -356,    356,
-  -15484,  15484,   -844,    844,  -3772,   3772,   -112,    112,
-  -22908,  22908,  -1308,   1308,  -5628,   5628,   -228,    228,
-  -11388,  11388,   -588,    588,  -2748,   2748,    -48,     48,
-  -27004,  27004,  -1564,   1564,  -6652,   6652,   -292,    292,
-  -13436,  13436,   -716,    716,  -3260,   3260,    -80,     80,
-  -18812,  18812,  -1052,   1052,  -4604,   4604,   -164,    164,
-   -9340,   9340,   -460,    460,  -2236,   2236,    -16,     16,
-  -29052,  29052,  -1692,   1692,  -7164,   7164,   -324,    324,
-  -14460,  14460,   -780,    780,  -3516,   3516,    -96,     96,
-  -20860,  20860,  -1180,   1180,  -5116,   5116,   -196,    196,
-  -10364,  10364,   -524,    524,  -2492,   2492,    -32,     32,
-  -24956,  24956,  -1436,   1436,  -6140,   6140,   -260,    260,
-  -12412,  12412,   -652,    652,  -3004,   3004,    -64,     64,
-  -16764,  16764,   -924,    924,  -4092,   4092,   -132,    132,
-   -8316,   8316,   -396,    396,  -1980,   1980,      0,      0
+       -32124,  32124,  -1884,   1884,  -7932,   7932,   -372,    372,
+       -15996,  15996,   -876,    876,  -3900,   3900,   -120,    120,
+       -23932,  23932,  -1372,   1372,  -5884,   5884,   -244,    244,
+       -11900,  11900,   -620,    620,  -2876,   2876,    -56,     56,
+       -28028,  28028,  -1628,   1628,  -6908,   6908,   -308,    308,
+       -13948,  13948,   -748,    748,  -3388,   3388,    -88,     88,
+       -19836,  19836,  -1116,   1116,  -4860,   4860,   -180,    180,
+       -9852,   9852,   -492,    492,  -2364,   2364,    -24,     24,
+       -30076,  30076,  -1756,   1756,  -7420,   7420,   -340,    340,
+       -14972,  14972,   -812,    812,  -3644,   3644,   -104,    104,
+       -21884,  21884,  -1244,   1244,  -5372,   5372,   -212,    212,
+       -10876,  10876,   -556,    556,  -2620,   2620,    -40,     40,
+       -25980,  25980,  -1500,   1500,  -6396,   6396,   -276,    276,
+       -12924,  12924,   -684,    684,  -3132,   3132,    -72,     72,
+       -17788,  17788,   -988,    988,  -4348,   4348,   -148,    148,
+       -8828,   8828,   -428,    428,  -2108,   2108,     -8,      8,
+       -31100,  31100,  -1820,   1820,  -7676,   7676,   -356,    356,
+       -15484,  15484,   -844,    844,  -3772,   3772,   -112,    112,
+       -22908,  22908,  -1308,   1308,  -5628,   5628,   -228,    228,
+       -11388,  11388,   -588,    588,  -2748,   2748,    -48,     48,
+       -27004,  27004,  -1564,   1564,  -6652,   6652,   -292,    292,
+       -13436,  13436,   -716,    716,  -3260,   3260,    -80,     80,
+       -18812,  18812,  -1052,   1052,  -4604,   4604,   -164,    164,
+       -9340,   9340,   -460,    460,  -2236,   2236,    -16,     16,
+       -29052,  29052,  -1692,   1692,  -7164,   7164,   -324,    324,
+       -14460,  14460,   -780,    780,  -3516,   3516,    -96,     96,
+       -20860,  20860,  -1180,   1180,  -5116,   5116,   -196,    196,
+       -10364,  10364,   -524,    524,  -2492,   2492,    -32,     32,
+       -24956,  24956,  -1436,   1436,  -6140,   6140,   -260,    260,
+       -12412,  12412,   -652,    652,  -3004,   3004,    -64,     64,
+       -16764,  16764,   -924,    924,  -4092,   4092,   -132,    132,
+       -8316,   8316,   -396,    396,  -1980,   1980,      0,      0
 };
 
 
@@ -126,52 +126,52 @@ static short capidtmf_expand_table_ulaw[0x0100] =
 
 static short capidtmf_recv_window_function[CAPIDTMF_RECV_ACCUMULATE_CYCLES] =
 {
-    -500L,   -999L,  -1499L,  -1998L,  -2496L,  -2994L,  -3491L,  -3988L,
-   -4483L,  -4978L,  -5471L,  -5963L,  -6454L,  -6943L,  -7431L,  -7917L,
-   -8401L,  -8883L,  -9363L,  -9840L, -10316L, -10789L, -11259L, -11727L,
-  -12193L, -12655L, -13115L, -13571L, -14024L, -14474L, -14921L, -15364L,
-  -15804L, -16240L, -16672L, -17100L, -17524L, -17944L, -18360L, -18772L,
-  -19180L, -19583L, -19981L, -20375L, -20764L, -21148L, -21527L, -21901L,
-  -22270L, -22634L, -22993L, -23346L, -23694L, -24037L, -24374L, -24705L,
-  -25030L, -25350L, -25664L, -25971L, -26273L, -26568L, -26858L, -27141L,
-  -27418L, -27688L, -27952L, -28210L, -28461L, -28705L, -28943L, -29174L,
-  -29398L, -29615L, -29826L, -30029L, -30226L, -30415L, -30598L, -30773L,
-  -30941L, -31102L, -31256L, -31402L, -31541L, -31673L, -31797L, -31914L,
-  -32024L, -32126L, -32221L, -32308L, -32388L, -32460L, -32524L, -32581L,
-  -32631L, -32673L, -32707L, -32734L, -32753L, -32764L, -32768L, -32764L,
-  -32753L, -32734L, -32707L, -32673L, -32631L, -32581L, -32524L, -32460L,
-  -32388L, -32308L, -32221L, -32126L, -32024L, -31914L, -31797L, -31673L,
-  -31541L, -31402L, -31256L, -31102L, -30941L, -30773L, -30598L, -30415L,
-  -30226L, -30029L, -29826L, -29615L, -29398L, -29174L, -28943L, -28705L,
-  -28461L, -28210L, -27952L, -27688L, -27418L, -27141L, -26858L, -26568L,
-  -26273L, -25971L, -25664L, -25350L, -25030L, -24705L, -24374L, -24037L,
-  -23694L, -23346L, -22993L, -22634L, -22270L, -21901L, -21527L, -21148L,
-  -20764L, -20375L, -19981L, -19583L, -19180L, -18772L, -18360L, -17944L,
-  -17524L, -17100L, -16672L, -16240L, -15804L, -15364L, -14921L, -14474L,
-  -14024L, -13571L, -13115L, -12655L, -12193L, -11727L, -11259L, -10789L,
-  -10316L,  -9840L,  -9363L,  -8883L,  -8401L,  -7917L,  -7431L,  -6943L,
-   -6454L,  -5963L,  -5471L,  -4978L,  -4483L,  -3988L,  -3491L,  -2994L,
-   -2496L,  -1998L,  -1499L,   -999L,   -500L, 
+       -500L,   -999L,  -1499L,  -1998L,  -2496L,  -2994L,  -3491L,  -3988L,
+       -4483L,  -4978L,  -5471L,  -5963L,  -6454L,  -6943L,  -7431L,  -7917L,
+       -8401L,  -8883L,  -9363L,  -9840L, -10316L, -10789L, -11259L, -11727L,
+       -12193L, -12655L, -13115L, -13571L, -14024L, -14474L, -14921L, -15364L,
+       -15804L, -16240L, -16672L, -17100L, -17524L, -17944L, -18360L, -18772L,
+       -19180L, -19583L, -19981L, -20375L, -20764L, -21148L, -21527L, -21901L,
+       -22270L, -22634L, -22993L, -23346L, -23694L, -24037L, -24374L, -24705L,
+       -25030L, -25350L, -25664L, -25971L, -26273L, -26568L, -26858L, -27141L,
+       -27418L, -27688L, -27952L, -28210L, -28461L, -28705L, -28943L, -29174L,
+       -29398L, -29615L, -29826L, -30029L, -30226L, -30415L, -30598L, -30773L,
+       -30941L, -31102L, -31256L, -31402L, -31541L, -31673L, -31797L, -31914L,
+       -32024L, -32126L, -32221L, -32308L, -32388L, -32460L, -32524L, -32581L,
+       -32631L, -32673L, -32707L, -32734L, -32753L, -32764L, -32768L, -32764L,
+       -32753L, -32734L, -32707L, -32673L, -32631L, -32581L, -32524L, -32460L,
+       -32388L, -32308L, -32221L, -32126L, -32024L, -31914L, -31797L, -31673L,
+       -31541L, -31402L, -31256L, -31102L, -30941L, -30773L, -30598L, -30415L,
+       -30226L, -30029L, -29826L, -29615L, -29398L, -29174L, -28943L, -28705L,
+       -28461L, -28210L, -27952L, -27688L, -27418L, -27141L, -26858L, -26568L,
+       -26273L, -25971L, -25664L, -25350L, -25030L, -24705L, -24374L, -24037L,
+       -23694L, -23346L, -22993L, -22634L, -22270L, -21901L, -21527L, -21148L,
+       -20764L, -20375L, -19981L, -19583L, -19180L, -18772L, -18360L, -17944L,
+       -17524L, -17100L, -16672L, -16240L, -15804L, -15364L, -14921L, -14474L,
+       -14024L, -13571L, -13115L, -12655L, -12193L, -11727L, -11259L, -10789L,
+       -10316L,  -9840L,  -9363L,  -8883L,  -8401L,  -7917L,  -7431L,  -6943L,
+       -6454L,  -5963L,  -5471L,  -4978L,  -4483L,  -3988L,  -3491L,  -2994L,
+       -2496L,  -1998L,  -1499L,   -999L,   -500L,
 };
 
 static byte capidtmf_leading_zeroes_table[0x100] =
 {
-  8, 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4,
-  3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
-  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+       8, 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4,
+       3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+       2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+       2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
 };
 
 #define capidtmf_byte_leading_zeroes(b)  (capidtmf_leading_zeroes_table[(BYTE)(b)])
@@ -182,140 +182,140 @@ static byte capidtmf_leading_zeroes_table[0x100] =
 /*---------------------------------------------------------------------------*/
 
 
-static void capidtmf_goertzel_loop (long *buffer, long *coeffs, short *sample, long count)
+static void capidtmf_goertzel_loop(long *buffer, long *coeffs, short *sample, long count)
 {
-  int i, j;
-  long c, d, q0, q1, q2;
-
-  for (i = 0; i < CAPIDTMF_RECV_TOTAL_FREQUENCY_COUNT - 1; i++)
-  {
-    q1 = buffer[i];
-    q2 = buffer[i + CAPIDTMF_RECV_TOTAL_FREQUENCY_COUNT];
-    d = coeffs[i] >> 1;
-    c = d << 1;
-    if (c >= 0)
-    {
-      for (j = 0; j < count; j++)
-      {
-        q0 = sample[j] - q2 + (c * (q1 >> 16)) + (((dword)(((dword) d) * ((dword)(q1 & 0xffff)))) >> 15);
-        q2 = q1;
-        q1 = q0;
-      }
-    }
-    else
-    {
-      c = -c;
-      d = -d;
-      for (j = 0; j < count; j++)
-      {
-        q0 = sample[j] - q2 - ((c * (q1 >> 16)) + (((dword)(((dword) d) * ((dword)(q1 & 0xffff)))) >> 15));
-        q2 = q1;
-        q1 = q0;
-      }
-    }
-    buffer[i] = q1;
-    buffer[i + CAPIDTMF_RECV_TOTAL_FREQUENCY_COUNT] = q2;
-  }
-  q1 = buffer[i];
-  q2 = buffer[i + CAPIDTMF_RECV_TOTAL_FREQUENCY_COUNT];
-  c = (coeffs[i] >> 1) << 1;
-  if (c >= 0)
-  {
-    for (j = 0; j < count; j++)
-    {
-      q0 = sample[j] - q2 + (c * (q1 >> 16)) + (((dword)(((dword)(c >> 1)) * ((dword)(q1 & 0xffff)))) >> 15);
-      q2 = q1;
-      q1 = q0;
-      c -= CAPIDTMF_RECV_FUNDAMENTAL_DECREMENT;
-    }
-  }
-  else
-  {
-    c = -c;
-    for (j = 0; j < count; j++)
-    {
-      q0 = sample[j] - q2 - ((c * (q1 >> 16)) + (((dword)(((dword)(c >> 1)) * ((dword)(q1 & 0xffff)))) >> 15));
-      q2 = q1;
-      q1 = q0;
-      c += CAPIDTMF_RECV_FUNDAMENTAL_DECREMENT;
-    }
-  }
-  coeffs[i] = c;
-  buffer[i] = q1;
-  buffer[i + CAPIDTMF_RECV_TOTAL_FREQUENCY_COUNT] = q2;
+       int i, j;
+       long c, d, q0, q1, q2;
+
+       for (i = 0; i < CAPIDTMF_RECV_TOTAL_FREQUENCY_COUNT - 1; i++)
+       {
+               q1 = buffer[i];
+               q2 = buffer[i + CAPIDTMF_RECV_TOTAL_FREQUENCY_COUNT];
+               d = coeffs[i] >> 1;
+               c = d << 1;
+               if (c >= 0)
+               {
+                       for (j = 0; j < count; j++)
+                       {
+                               q0 = sample[j] - q2 + (c * (q1 >> 16)) + (((dword)(((dword) d) * ((dword)(q1 & 0xffff)))) >> 15);
+                               q2 = q1;
+                               q1 = q0;
+                       }
+               }
+               else
+               {
+                       c = -c;
+                       d = -d;
+                       for (j = 0; j < count; j++)
+                       {
+                               q0 = sample[j] - q2 - ((c * (q1 >> 16)) + (((dword)(((dword) d) * ((dword)(q1 & 0xffff)))) >> 15));
+                               q2 = q1;
+                               q1 = q0;
+                       }
+               }
+               buffer[i] = q1;
+               buffer[i + CAPIDTMF_RECV_TOTAL_FREQUENCY_COUNT] = q2;
+       }
+       q1 = buffer[i];
+       q2 = buffer[i + CAPIDTMF_RECV_TOTAL_FREQUENCY_COUNT];
+       c = (coeffs[i] >> 1) << 1;
+       if (c >= 0)
+       {
+               for (j = 0; j < count; j++)
+               {
+                       q0 = sample[j] - q2 + (c * (q1 >> 16)) + (((dword)(((dword)(c >> 1)) * ((dword)(q1 & 0xffff)))) >> 15);
+                       q2 = q1;
+                       q1 = q0;
+                       c -= CAPIDTMF_RECV_FUNDAMENTAL_DECREMENT;
+               }
+       }
+       else
+       {
+               c = -c;
+               for (j = 0; j < count; j++)
+               {
+                       q0 = sample[j] - q2 - ((c * (q1 >> 16)) + (((dword)(((dword)(c >> 1)) * ((dword)(q1 & 0xffff)))) >> 15));
+                       q2 = q1;
+                       q1 = q0;
+                       c += CAPIDTMF_RECV_FUNDAMENTAL_DECREMENT;
+               }
+       }
+       coeffs[i] = c;
+       buffer[i] = q1;
+       buffer[i + CAPIDTMF_RECV_TOTAL_FREQUENCY_COUNT] = q2;
 }
 
 
-static void capidtmf_goertzel_result (long *buffer, long *coeffs)
+static void capidtmf_goertzel_result(long *buffer, long *coeffs)
 {
-  int i;
-  long d, e, q1, q2, lo, mid, hi;
-  dword k;
-
-  for (i = 0; i < CAPIDTMF_RECV_TOTAL_FREQUENCY_COUNT; i++)
-  {
-    q1 = buffer[i];
-    q2 = buffer[i + CAPIDTMF_RECV_TOTAL_FREQUENCY_COUNT];
-    d = coeffs[i] >> 1;
-    if (d >= 0)
-      d = ((d << 1) * (-q1 >> 16)) + (((dword)(((dword) d) * ((dword)(-q1 & 0xffff)))) >> 15);
-    else
-      d = ((-d << 1) * (-q1 >> 16)) + (((dword)(((dword) -d) * ((dword)(-q1 & 0xffff)))) >> 15);
-    e = (q2 >= 0) ? q2 : -q2;
-    if (d >= 0)
-    {
-      k = ((dword)(d & 0xffff)) * ((dword)(e & 0xffff));
-      lo = k & 0xffff;
-      mid = k >> 16;
-      k = ((dword)(d >> 16)) * ((dword)(e & 0xffff));
-      mid += k & 0xffff;
-      hi = k >> 16;
-      k = ((dword)(d & 0xffff)) * ((dword)(e >> 16));
-      mid += k & 0xffff;
-      hi += k >> 16;
-      hi += ((dword)(d >> 16)) * ((dword)(e >> 16));
-    }
-    else
-    {
-      d = -d;
-      k = ((dword)(d & 0xffff)) * ((dword)(e & 0xffff));
-      lo = -((long)(k & 0xffff));
-      mid = -((long)(k >> 16));
-      k = ((dword)(d >> 16)) * ((dword)(e & 0xffff));
-      mid -= k & 0xffff;
-      hi = -((long)(k >> 16));
-      k = ((dword)(d & 0xffff)) * ((dword)(e >> 16));
-      mid -= k & 0xffff;
-      hi -= k >> 16;
-      hi -= ((dword)(d >> 16)) * ((dword)(e >> 16));
-    }
-    if (q2 < 0)
-    {
-      lo = -lo;
-      mid = -mid;
-      hi = -hi;
-    }
-    d = (q1 >= 0) ? q1 : -q1;
-    k = ((dword)(d & 0xffff)) * ((dword)(d & 0xffff));
-    lo += k & 0xffff;
-    mid += k >> 16;
-    k = ((dword)(d >> 16)) * ((dword)(d & 0xffff));
-    mid += (k & 0xffff) << 1;
-    hi += (k >> 16) << 1;
-    hi += ((dword)(d >> 16)) * ((dword)(d >> 16));
-    d = (q2 >= 0) ? q2 : -q2;
-    k = ((dword)(d & 0xffff)) * ((dword)(d & 0xffff));
-    lo += k & 0xffff;
-    mid += k >> 16;
-    k = ((dword)(d >> 16)) * ((dword)(d & 0xffff));
-    mid += (k & 0xffff) << 1;
-    hi += (k >> 16) << 1;
-    hi += ((dword)(d >> 16)) * ((dword)(d >> 16));
-    mid += lo >> 16;
-    hi += mid >> 16;
-    buffer[i] = (lo & 0xffff) | (mid << 16);
-    buffer[i + CAPIDTMF_RECV_TOTAL_FREQUENCY_COUNT] = hi;
-  }
+       int i;
+       long d, e, q1, q2, lo, mid, hi;
+       dword k;
+
+       for (i = 0; i < CAPIDTMF_RECV_TOTAL_FREQUENCY_COUNT; i++)
+       {
+               q1 = buffer[i];
+               q2 = buffer[i + CAPIDTMF_RECV_TOTAL_FREQUENCY_COUNT];
+               d = coeffs[i] >> 1;
+               if (d >= 0)
+                       d = ((d << 1) * (-q1 >> 16)) + (((dword)(((dword) d) * ((dword)(-q1 & 0xffff)))) >> 15);
+               else
+                       d = ((-d << 1) * (-q1 >> 16)) + (((dword)(((dword) -d) * ((dword)(-q1 & 0xffff)))) >> 15);
+               e = (q2 >= 0) ? q2 : -q2;
+               if (d >= 0)
+               {
+                       k = ((dword)(d & 0xffff)) * ((dword)(e & 0xffff));
+                       lo = k & 0xffff;
+                       mid = k >> 16;
+                       k = ((dword)(d >> 16)) * ((dword)(e & 0xffff));
+                       mid += k & 0xffff;
+                       hi = k >> 16;
+                       k = ((dword)(d & 0xffff)) * ((dword)(e >> 16));
+                       mid += k & 0xffff;
+                       hi += k >> 16;
+                       hi += ((dword)(d >> 16)) * ((dword)(e >> 16));
+               }
+               else
+               {
+                       d = -d;
+                       k = ((dword)(d & 0xffff)) * ((dword)(e & 0xffff));
+                       lo = -((long)(k & 0xffff));
+                       mid = -((long)(k >> 16));
+                       k = ((dword)(d >> 16)) * ((dword)(e & 0xffff));
+                       mid -= k & 0xffff;
+                       hi = -((long)(k >> 16));
+                       k = ((dword)(d & 0xffff)) * ((dword)(e >> 16));
+                       mid -= k & 0xffff;
+                       hi -= k >> 16;
+                       hi -= ((dword)(d >> 16)) * ((dword)(e >> 16));
+               }
+               if (q2 < 0)
+               {
+                       lo = -lo;
+                       mid = -mid;
+                       hi = -hi;
+               }
+               d = (q1 >= 0) ? q1 : -q1;
+               k = ((dword)(d & 0xffff)) * ((dword)(d & 0xffff));
+               lo += k & 0xffff;
+               mid += k >> 16;
+               k = ((dword)(d >> 16)) * ((dword)(d & 0xffff));
+               mid += (k & 0xffff) << 1;
+               hi += (k >> 16) << 1;
+               hi += ((dword)(d >> 16)) * ((dword)(d >> 16));
+               d = (q2 >= 0) ? q2 : -q2;
+               k = ((dword)(d & 0xffff)) * ((dword)(d & 0xffff));
+               lo += k & 0xffff;
+               mid += k >> 16;
+               k = ((dword)(d >> 16)) * ((dword)(d & 0xffff));
+               mid += (k & 0xffff) << 1;
+               hi += (k >> 16) << 1;
+               hi += ((dword)(d >> 16)) * ((dword)(d >> 16));
+               mid += lo >> 16;
+               hi += mid >> 16;
+               buffer[i] = (lo & 0xffff) | (mid << 16);
+               buffer[i + CAPIDTMF_RECV_TOTAL_FREQUENCY_COUNT] = hi;
+       }
 }
 
 
@@ -346,339 +346,339 @@ static void capidtmf_goertzel_result (long *buffer, long *coeffs)
 
 static long capidtmf_recv_goertzel_coef_table[CAPIDTMF_RECV_TOTAL_FREQUENCY_COUNT] =
 {
-  0xda97L * 2,  /* 697 Hz (Low group 697 Hz) */
-  0xd299L * 2,  /* 770 Hz (Low group 770 Hz) */
-  0xc8cbL * 2,  /* 852 Hz (Low group 852 Hz) */
-  0xbd36L * 2,  /* 941 Hz (Low group 941 Hz) */
-  0x9501L * 2,  /* 1209 Hz (High group 1209 Hz) */
-  0x7f89L * 2,  /* 1336 Hz (High group 1336 Hz) */
-  0x6639L * 2,  /* 1477 Hz (High group 1477 Hz) */
-  0x48c6L * 2,  /* 1633 Hz (High group 1633 Hz) */
-  0xe14cL * 2,  /* 630 Hz (Lower guard of low group 631 Hz) */
-  0xb2e0L * 2,  /* 1015 Hz (Upper guard of low group 1039 Hz) */
-  0xa1a0L * 2,  /* 1130 Hz (Lower guard of high group 1140 Hz) */
-  0x8a87L * 2,  /* 1272 Hz (Guard between 1209 Hz and 1336 Hz: 1271 Hz) */
-  0x7353L * 2,  /* 1405 Hz (2nd harmonics of 697 Hz and guard between 1336 Hz and 1477 Hz: 1405 Hz) */
-  0x583bL * 2,  /* 1552 Hz (2nd harmonics of 770 Hz and guard between 1477 Hz and 1633 Hz: 1553 Hz) */
-  0x37d8L * 2,  /* 1720 Hz (2nd harmonics of 852 Hz and upper guard of high group: 1715 Hz) */
-  0x0000L * 2   /* 100-630 Hz (fundamentals) */
+       0xda97L * 2,  /* 697 Hz (Low group 697 Hz) */
+       0xd299L * 2,  /* 770 Hz (Low group 770 Hz) */
+       0xc8cbL * 2,  /* 852 Hz (Low group 852 Hz) */
+       0xbd36L * 2,  /* 941 Hz (Low group 941 Hz) */
+       0x9501L * 2,  /* 1209 Hz (High group 1209 Hz) */
+       0x7f89L * 2,  /* 1336 Hz (High group 1336 Hz) */
+       0x6639L * 2,  /* 1477 Hz (High group 1477 Hz) */
+       0x48c6L * 2,  /* 1633 Hz (High group 1633 Hz) */
+       0xe14cL * 2,  /* 630 Hz (Lower guard of low group 631 Hz) */
+       0xb2e0L * 2,  /* 1015 Hz (Upper guard of low group 1039 Hz) */
+       0xa1a0L * 2,  /* 1130 Hz (Lower guard of high group 1140 Hz) */
+       0x8a87L * 2,  /* 1272 Hz (Guard between 1209 Hz and 1336 Hz: 1271 Hz) */
+       0x7353L * 2,  /* 1405 Hz (2nd harmonics of 697 Hz and guard between 1336 Hz and 1477 Hz: 1405 Hz) */
+       0x583bL * 2,  /* 1552 Hz (2nd harmonics of 770 Hz and guard between 1477 Hz and 1633 Hz: 1553 Hz) */
+       0x37d8L * 2,  /* 1720 Hz (2nd harmonics of 852 Hz and upper guard of high group: 1715 Hz) */
+       0x0000L * 2   /* 100-630 Hz (fundamentals) */
 };
 
 
 static word capidtmf_recv_guard_snr_low_table[CAPIDTMF_RECV_TOTAL_FREQUENCY_COUNT] =
 {
-  14,                                    /* Low group peak versus 697 Hz */
-  14,                                    /* Low group peak versus 770 Hz */
-  16,                                    /* Low group peak versus 852 Hz */
-  16,                                    /* Low group peak versus 941 Hz */
-  CAPIDTMF_RECV_GUARD_SNR_DONTCARE,      /* Low group peak versus 1209 Hz */
-  CAPIDTMF_RECV_GUARD_SNR_DONTCARE,      /* Low group peak versus 1336 Hz */
-  CAPIDTMF_RECV_GUARD_SNR_DONTCARE,      /* Low group peak versus 1477 Hz */
-  CAPIDTMF_RECV_GUARD_SNR_DONTCARE,      /* Low group peak versus 1633 Hz */
-  14,                                    /* Low group peak versus 635 Hz */
-  16,                                    /* Low group peak versus 1010 Hz */
-  CAPIDTMF_RECV_GUARD_SNR_DONTCARE,      /* Low group peak versus 1140 Hz */
-  CAPIDTMF_RECV_GUARD_SNR_DONTCARE,      /* Low group peak versus 1272 Hz */
-  DSPDTMF_RX_HARMONICS_SEL_DEFAULT - 8,  /* Low group peak versus 1405 Hz */
-  DSPDTMF_RX_HARMONICS_SEL_DEFAULT - 4,  /* Low group peak versus 1555 Hz */
-  DSPDTMF_RX_HARMONICS_SEL_DEFAULT - 4,  /* Low group peak versus 1715 Hz */
-  12                                     /* Low group peak versus 100-630 Hz */
+       14,                                    /* Low group peak versus 697 Hz */
+       14,                                    /* Low group peak versus 770 Hz */
+       16,                                    /* Low group peak versus 852 Hz */
+       16,                                    /* Low group peak versus 941 Hz */
+       CAPIDTMF_RECV_GUARD_SNR_DONTCARE,      /* Low group peak versus 1209 Hz */
+       CAPIDTMF_RECV_GUARD_SNR_DONTCARE,      /* Low group peak versus 1336 Hz */
+       CAPIDTMF_RECV_GUARD_SNR_DONTCARE,      /* Low group peak versus 1477 Hz */
+       CAPIDTMF_RECV_GUARD_SNR_DONTCARE,      /* Low group peak versus 1633 Hz */
+       14,                                    /* Low group peak versus 635 Hz */
+       16,                                    /* Low group peak versus 1010 Hz */
+       CAPIDTMF_RECV_GUARD_SNR_DONTCARE,      /* Low group peak versus 1140 Hz */
+       CAPIDTMF_RECV_GUARD_SNR_DONTCARE,      /* Low group peak versus 1272 Hz */
+       DSPDTMF_RX_HARMONICS_SEL_DEFAULT - 8,  /* Low group peak versus 1405 Hz */
+       DSPDTMF_RX_HARMONICS_SEL_DEFAULT - 4,  /* Low group peak versus 1555 Hz */
+       DSPDTMF_RX_HARMONICS_SEL_DEFAULT - 4,  /* Low group peak versus 1715 Hz */
+       12                                     /* Low group peak versus 100-630 Hz */
 };
 
 
 static word capidtmf_recv_guard_snr_high_table[CAPIDTMF_RECV_TOTAL_FREQUENCY_COUNT] =
 {
-  CAPIDTMF_RECV_GUARD_SNR_DONTCARE,      /* High group peak versus 697 Hz */
-  CAPIDTMF_RECV_GUARD_SNR_DONTCARE,      /* High group peak versus 770 Hz */
-  CAPIDTMF_RECV_GUARD_SNR_DONTCARE,      /* High group peak versus 852 Hz */
-  CAPIDTMF_RECV_GUARD_SNR_DONTCARE,      /* High group peak versus 941 Hz */
-  20,                                    /* High group peak versus 1209 Hz */
-  20,                                    /* High group peak versus 1336 Hz */
-  20,                                    /* High group peak versus 1477 Hz */
-  20,                                    /* High group peak versus 1633 Hz */
-  CAPIDTMF_RECV_GUARD_SNR_DONTCARE,      /* High group peak versus 635 Hz */
-  CAPIDTMF_RECV_GUARD_SNR_DONTCARE,      /* High group peak versus 1010 Hz */
-  16,                                    /* High group peak versus 1140 Hz */
-  4,                                     /* High group peak versus 1272 Hz */
-  6,                                     /* High group peak versus 1405 Hz */
-  8,                                     /* High group peak versus 1555 Hz */
-  16,                                    /* High group peak versus 1715 Hz */
-  12                                     /* High group peak versus 100-630 Hz */
+       CAPIDTMF_RECV_GUARD_SNR_DONTCARE,      /* High group peak versus 697 Hz */
+       CAPIDTMF_RECV_GUARD_SNR_DONTCARE,      /* High group peak versus 770 Hz */
+       CAPIDTMF_RECV_GUARD_SNR_DONTCARE,      /* High group peak versus 852 Hz */
+       CAPIDTMF_RECV_GUARD_SNR_DONTCARE,      /* High group peak versus 941 Hz */
+       20,                                    /* High group peak versus 1209 Hz */
+       20,                                    /* High group peak versus 1336 Hz */
+       20,                                    /* High group peak versus 1477 Hz */
+       20,                                    /* High group peak versus 1633 Hz */
+       CAPIDTMF_RECV_GUARD_SNR_DONTCARE,      /* High group peak versus 635 Hz */
+       CAPIDTMF_RECV_GUARD_SNR_DONTCARE,      /* High group peak versus 1010 Hz */
+       16,                                    /* High group peak versus 1140 Hz */
+       4,                                     /* High group peak versus 1272 Hz */
+       6,                                     /* High group peak versus 1405 Hz */
+       8,                                     /* High group peak versus 1555 Hz */
+       16,                                    /* High group peak versus 1715 Hz */
+       12                                     /* High group peak versus 100-630 Hz */
 };
 
 
 /*---------------------------------------------------------------------------*/
 
-static void capidtmf_recv_init (t_capidtmf_state   *p_state)
+static void capidtmf_recv_init(t_capidtmf_state *p_state)
 {
-  p_state->recv.min_gap_duration = 1;
-  p_state->recv.min_digit_duration = 1;
-
-  p_state->recv.cycle_counter = 0;
-  p_state->recv.current_digit_on_time = 0;
-  p_state->recv.current_digit_off_time = 0;
-  p_state->recv.current_digit_value = CAPIDTMF_RECV_NO_DIGIT;
-
-  p_state->recv.digit_write_pos = 0;
-  p_state->recv.digit_read_pos = 0;
-  p_state->recv.indication_state = 0;
-  p_state->recv.indication_state_ack = 0;
-  p_state->recv.state = CAPIDTMF_RECV_STATE_IDLE;
+       p_state->recv.min_gap_duration = 1;
+       p_state->recv.min_digit_duration = 1;
+
+       p_state->recv.cycle_counter = 0;
+       p_state->recv.current_digit_on_time = 0;
+       p_state->recv.current_digit_off_time = 0;
+       p_state->recv.current_digit_value = CAPIDTMF_RECV_NO_DIGIT;
+
+       p_state->recv.digit_write_pos = 0;
+       p_state->recv.digit_read_pos = 0;
+       p_state->recv.indication_state = 0;
+       p_state->recv.indication_state_ack = 0;
+       p_state->recv.state = CAPIDTMF_RECV_STATE_IDLE;
 }
 
 
-void capidtmf_recv_enable (t_capidtmf_state   *p_state, word min_digit_duration, word min_gap_duration)
+void capidtmf_recv_enable(t_capidtmf_state *p_state, word min_digit_duration, word min_gap_duration)
 {
-  p_state->recv.indication_state_ack &= CAPIDTMF_RECV_INDICATION_DIGIT;
-  p_state->recv.min_digit_duration = (word)(((((dword) min_digit_duration) * 8) +
-    ((dword)(CAPIDTMF_RECV_TIME_GRANULARITY / 2))) / ((dword) CAPIDTMF_RECV_TIME_GRANULARITY));
-  if (p_state->recv.min_digit_duration <= 1)
-    p_state->recv.min_digit_duration = 1;
-  else
-    (p_state->recv.min_digit_duration)--;
-  p_state->recv.min_gap_duration =
-    (word)((((dword) min_gap_duration) * 8) / ((dword) CAPIDTMF_RECV_TIME_GRANULARITY));
-  if (p_state->recv.min_gap_duration <= 1)
-    p_state->recv.min_gap_duration = 1;
-  else
-    (p_state->recv.min_gap_duration)--;
-  p_state->recv.state |= CAPIDTMF_RECV_STATE_DTMF_ACTIVE;
+       p_state->recv.indication_state_ack &= CAPIDTMF_RECV_INDICATION_DIGIT;
+       p_state->recv.min_digit_duration = (word)(((((dword) min_digit_duration) * 8) +
+                                                  ((dword)(CAPIDTMF_RECV_TIME_GRANULARITY / 2))) / ((dword) CAPIDTMF_RECV_TIME_GRANULARITY));
+       if (p_state->recv.min_digit_duration <= 1)
+               p_state->recv.min_digit_duration = 1;
+       else
+               (p_state->recv.min_digit_duration)--;
+       p_state->recv.min_gap_duration =
+               (word)((((dword) min_gap_duration) * 8) / ((dword) CAPIDTMF_RECV_TIME_GRANULARITY));
+       if (p_state->recv.min_gap_duration <= 1)
+               p_state->recv.min_gap_duration = 1;
+       else
+               (p_state->recv.min_gap_duration)--;
+       p_state->recv.state |= CAPIDTMF_RECV_STATE_DTMF_ACTIVE;
 }
 
 
-void capidtmf_recv_disable (t_capidtmf_state   *p_state)
+void capidtmf_recv_disable(t_capidtmf_state *p_state)
 {
-  p_state->recv.state &= ~CAPIDTMF_RECV_STATE_DTMF_ACTIVE;
-  if (p_state->recv.state == CAPIDTMF_RECV_STATE_IDLE)
-    capidtmf_recv_init (p_state);
-  else
-  {
-    p_state->recv.cycle_counter = 0;
-    p_state->recv.current_digit_on_time = 0;
-    p_state->recv.current_digit_off_time = 0;
-    p_state->recv.current_digit_value = CAPIDTMF_RECV_NO_DIGIT;
-  }
+       p_state->recv.state &= ~CAPIDTMF_RECV_STATE_DTMF_ACTIVE;
+       if (p_state->recv.state == CAPIDTMF_RECV_STATE_IDLE)
+               capidtmf_recv_init(p_state);
+       else
+       {
+               p_state->recv.cycle_counter = 0;
+               p_state->recv.current_digit_on_time = 0;
+               p_state->recv.current_digit_off_time = 0;
+               p_state->recv.current_digit_value = CAPIDTMF_RECV_NO_DIGIT;
+       }
 }
 
 
-word capidtmf_recv_indication (t_capidtmf_state   *p_state, byte *buffer)
+word capidtmf_recv_indication(t_capidtmf_state *p_state, byte *buffer)
 {
-  word i, j, k, flags;
-
-  flags = p_state->recv.indication_state ^ p_state->recv.indication_state_ack;
-  p_state->recv.indication_state_ack ^= flags & CAPIDTMF_RECV_INDICATION_DIGIT;
-  if (p_state->recv.digit_write_pos != p_state->recv.digit_read_pos)
-  {
-    i = 0;
-    k = p_state->recv.digit_write_pos;
-    j = p_state->recv.digit_read_pos;
-    do
-    {
-      buffer[i++] = p_state->recv.digit_buffer[j];
-      j = (j == CAPIDTMF_RECV_DIGIT_BUFFER_SIZE - 1) ? 0 : j + 1;
-    } while (j != k);
-    p_state->recv.digit_read_pos = k;
-    return (i);
-  }
-  p_state->recv.indication_state_ack ^= flags;
-  return (0);
+       word i, j, k, flags;
+
+       flags = p_state->recv.indication_state ^ p_state->recv.indication_state_ack;
+       p_state->recv.indication_state_ack ^= flags & CAPIDTMF_RECV_INDICATION_DIGIT;
+       if (p_state->recv.digit_write_pos != p_state->recv.digit_read_pos)
+       {
+               i = 0;
+               k = p_state->recv.digit_write_pos;
+               j = p_state->recv.digit_read_pos;
+               do
+               {
+                       buffer[i++] = p_state->recv.digit_buffer[j];
+                       j = (j == CAPIDTMF_RECV_DIGIT_BUFFER_SIZE - 1) ? 0 : j + 1;
+               } while (j != k);
+               p_state->recv.digit_read_pos = k;
+               return (i);
+       }
+       p_state->recv.indication_state_ack ^= flags;
+       return (0);
 }
 
 
 #define CAPIDTMF_RECV_WINDOWED_SAMPLES  32
 
-void capidtmf_recv_block (t_capidtmf_state   *p_state, byte   *buffer, word length)
+void capidtmf_recv_block(t_capidtmf_state *p_state, byte *buffer, word length)
 {
-  byte result_digit;
-  word sample_number, cycle_counter, n, i;
-  word low_peak, high_peak;
-  dword lo, hi;
-  byte   *p;
-  short *q;
-  byte goertzel_result_buffer[CAPIDTMF_RECV_TOTAL_FREQUENCY_COUNT];
-    short windowed_sample_buffer[CAPIDTMF_RECV_WINDOWED_SAMPLES];
-
-
-  if (p_state->recv.state & CAPIDTMF_RECV_STATE_DTMF_ACTIVE)
-  {
-    cycle_counter = p_state->recv.cycle_counter;
-    sample_number = 0;
-    while (sample_number < length)
-    {
-      if (cycle_counter < CAPIDTMF_RECV_ACCUMULATE_CYCLES)
-      {
-        if (cycle_counter == 0)
-        {
-          for (i = 0; i < CAPIDTMF_RECV_TOTAL_FREQUENCY_COUNT; i++)
-          {
-            p_state->recv.goertzel_buffer[0][i] = 0;
-            p_state->recv.goertzel_buffer[1][i] = 0;
-          }
-        }
-        n = CAPIDTMF_RECV_ACCUMULATE_CYCLES - cycle_counter;
-        if (n > length - sample_number)
-          n = length - sample_number;
-        if (n > CAPIDTMF_RECV_WINDOWED_SAMPLES)
-          n = CAPIDTMF_RECV_WINDOWED_SAMPLES;
-        p = buffer + sample_number;
-        q = capidtmf_recv_window_function + cycle_counter;
-        if (p_state->ulaw)
-        {
-          for (i = 0; i < n; i++)
-          {
-            windowed_sample_buffer[i] =
-              (short)((capidtmf_expand_table_ulaw[p[i]] * ((long)(q[i]))) >> 15);
-         }
-        }
-        else
-        {
-          for (i = 0; i < n; i++)
-          {
-            windowed_sample_buffer[i] =
-              (short)((capidtmf_expand_table_alaw[p[i]] * ((long)(q[i]))) >> 15);
-         }
-        }
-        capidtmf_recv_goertzel_coef_table[CAPIDTMF_RECV_TOTAL_FREQUENCY_COUNT - 1] = CAPIDTMF_RECV_FUNDAMENTAL_OFFSET;
-        capidtmf_goertzel_loop (p_state->recv.goertzel_buffer[0],
-          capidtmf_recv_goertzel_coef_table, windowed_sample_buffer, n);
-        cycle_counter += n;
-        sample_number += n;
-      }
-      else
-      {
-        capidtmf_goertzel_result (p_state->recv.goertzel_buffer[0],
-          capidtmf_recv_goertzel_coef_table);
-        for (i = 0; i < CAPIDTMF_RECV_TOTAL_FREQUENCY_COUNT; i++)
-        {
-          lo = (dword)(p_state->recv.goertzel_buffer[0][i]);
-          hi = (dword)(p_state->recv.goertzel_buffer[1][i]);
-          if (hi != 0)
-          {
-            n = capidtmf_dword_leading_zeroes (hi);
-            hi = (hi << n) | (lo >> (32 - n));
-          }
-          else
-          {
-            n = capidtmf_dword_leading_zeroes (lo);
-            hi = lo << n;
-           n += 32;
-          }
-          n = 195 - 3 * n;
-          if (hi >= 0xcb300000L)
-            n += 2;
-          else if (hi >= 0xa1450000L)
-            n++;
-         goertzel_result_buffer[i] = (byte) n;
-        }
-        low_peak = DSPDTMF_RX_SENSITIVITY_LOW_DEFAULT;
-        result_digit = CAPIDTMF_RECV_NO_DIGIT;
-        for (i = 0; i < CAPIDTMF_LOW_GROUP_FREQUENCIES; i++)
-        {
-          if (goertzel_result_buffer[i] > low_peak)
-         {
-           low_peak = goertzel_result_buffer[i];
-           result_digit = (byte) i;
-         }
-        }
-        high_peak = DSPDTMF_RX_SENSITIVITY_HIGH_DEFAULT;
-        n = CAPIDTMF_RECV_NO_DIGIT;
-        for (i = CAPIDTMF_LOW_GROUP_FREQUENCIES; i < CAPIDTMF_RECV_BASE_FREQUENCY_COUNT; i++)
-        {
-          if (goertzel_result_buffer[i] > high_peak)
-         {
-           high_peak = goertzel_result_buffer[i];
-           n = (i - CAPIDTMF_LOW_GROUP_FREQUENCIES) << 2;
-         }
-        }
-        result_digit |= (byte) n;
-        if (low_peak + DSPDTMF_RX_HIGH_EXCEEDING_LOW_DEFAULT < high_peak)
-          result_digit = CAPIDTMF_RECV_NO_DIGIT;
-        if (high_peak + DSPDTMF_RX_LOW_EXCEEDING_HIGH_DEFAULT < low_peak)
-          result_digit = CAPIDTMF_RECV_NO_DIGIT;
-        n = 0;
-        for (i = 0; i < CAPIDTMF_RECV_TOTAL_FREQUENCY_COUNT; i++)
-        {
-          if ((((short)(low_peak - goertzel_result_buffer[i] - capidtmf_recv_guard_snr_low_table[i])) < 0)
-           || (((short)(high_peak - goertzel_result_buffer[i] - capidtmf_recv_guard_snr_high_table[i])) < 0))
-         {
-           n++;
-         }
-        }
-        if (n != 2)
-          result_digit = CAPIDTMF_RECV_NO_DIGIT;
-
-        if (result_digit == CAPIDTMF_RECV_NO_DIGIT)
-        {
-          if (p_state->recv.current_digit_on_time != 0)
-          {
-            if (++(p_state->recv.current_digit_off_time) >= p_state->recv.min_gap_duration)
-            {
-              p_state->recv.current_digit_on_time = 0;
-              p_state->recv.current_digit_off_time = 0;
-            }
-          }
-          else
-          {
-            if (p_state->recv.current_digit_off_time != 0)
-              (p_state->recv.current_digit_off_time)--;
-          }
-        }
-        else
-        {
-          if ((p_state->recv.current_digit_on_time == 0)
-           && (p_state->recv.current_digit_off_time != 0))
-          {
-            (p_state->recv.current_digit_off_time)--;
-          }
-          else
-          {
-            n = p_state->recv.current_digit_off_time;
-            if ((p_state->recv.current_digit_on_time != 0)
-             && (result_digit != p_state->recv.current_digit_value))
-            {
-              p_state->recv.current_digit_on_time = 0;
-              n = 0;
-            }
-            p_state->recv.current_digit_value = result_digit;
-            p_state->recv.current_digit_off_time = 0;
-            if (p_state->recv.current_digit_on_time != 0xffff)
-            {
-              p_state->recv.current_digit_on_time += n + 1;
-              if (p_state->recv.current_digit_on_time >= p_state->recv.min_digit_duration)
-              {
-                p_state->recv.current_digit_on_time = 0xffff;
-                i = (p_state->recv.digit_write_pos == CAPIDTMF_RECV_DIGIT_BUFFER_SIZE - 1) ?
-                  0 : p_state->recv.digit_write_pos + 1;
-                if (i == p_state->recv.digit_read_pos)
-                {
-                  trace (dprintf ("%s,%d: Receive digit overrun",
-                    (char   *)(FILE_), __LINE__));
-                }
-                else
-                {
-                  p_state->recv.digit_buffer[p_state->recv.digit_write_pos] = result_digit;
-                  p_state->recv.digit_write_pos = i;
-                  p_state->recv.indication_state =
-                    (p_state->recv.indication_state & ~CAPIDTMF_RECV_INDICATION_DIGIT) |
-                    (~p_state->recv.indication_state_ack & CAPIDTMF_RECV_INDICATION_DIGIT);
-                }
-              }
-            }
-          }
-        }
-        cycle_counter = 0;
-        sample_number++;
-      }
-    }
-    p_state->recv.cycle_counter = cycle_counter;
-  }
+       byte result_digit;
+       word sample_number, cycle_counter, n, i;
+       word low_peak, high_peak;
+       dword lo, hi;
+       byte   *p;
+       short *q;
+       byte goertzel_result_buffer[CAPIDTMF_RECV_TOTAL_FREQUENCY_COUNT];
+       short windowed_sample_buffer[CAPIDTMF_RECV_WINDOWED_SAMPLES];
+
+
+       if (p_state->recv.state & CAPIDTMF_RECV_STATE_DTMF_ACTIVE)
+       {
+               cycle_counter = p_state->recv.cycle_counter;
+               sample_number = 0;
+               while (sample_number < length)
+               {
+                       if (cycle_counter < CAPIDTMF_RECV_ACCUMULATE_CYCLES)
+                       {
+                               if (cycle_counter == 0)
+                               {
+                                       for (i = 0; i < CAPIDTMF_RECV_TOTAL_FREQUENCY_COUNT; i++)
+                                       {
+                                               p_state->recv.goertzel_buffer[0][i] = 0;
+                                               p_state->recv.goertzel_buffer[1][i] = 0;
+                                       }
+                               }
+                               n = CAPIDTMF_RECV_ACCUMULATE_CYCLES - cycle_counter;
+                               if (n > length - sample_number)
+                                       n = length - sample_number;
+                               if (n > CAPIDTMF_RECV_WINDOWED_SAMPLES)
+                                       n = CAPIDTMF_RECV_WINDOWED_SAMPLES;
+                               p = buffer + sample_number;
+                               q = capidtmf_recv_window_function + cycle_counter;
+                               if (p_state->ulaw)
+                               {
+                                       for (i = 0; i < n; i++)
+                                       {
+                                               windowed_sample_buffer[i] =
+                                                       (short)((capidtmf_expand_table_ulaw[p[i]] * ((long)(q[i]))) >> 15);
+                                       }
+                               }
+                               else
+                               {
+                                       for (i = 0; i < n; i++)
+                                       {
+                                               windowed_sample_buffer[i] =
+                                                       (short)((capidtmf_expand_table_alaw[p[i]] * ((long)(q[i]))) >> 15);
+                                       }
+                               }
+                               capidtmf_recv_goertzel_coef_table[CAPIDTMF_RECV_TOTAL_FREQUENCY_COUNT - 1] = CAPIDTMF_RECV_FUNDAMENTAL_OFFSET;
+                               capidtmf_goertzel_loop(p_state->recv.goertzel_buffer[0],
+                                                      capidtmf_recv_goertzel_coef_table, windowed_sample_buffer, n);
+                               cycle_counter += n;
+                               sample_number += n;
+                       }
+                       else
+                       {
+                               capidtmf_goertzel_result(p_state->recv.goertzel_buffer[0],
+                                                        capidtmf_recv_goertzel_coef_table);
+                               for (i = 0; i < CAPIDTMF_RECV_TOTAL_FREQUENCY_COUNT; i++)
+                               {
+                                       lo = (dword)(p_state->recv.goertzel_buffer[0][i]);
+                                       hi = (dword)(p_state->recv.goertzel_buffer[1][i]);
+                                       if (hi != 0)
+                                       {
+                                               n = capidtmf_dword_leading_zeroes(hi);
+                                               hi = (hi << n) | (lo >> (32 - n));
+                                       }
+                                       else
+                                       {
+                                               n = capidtmf_dword_leading_zeroes(lo);
+                                               hi = lo << n;
+                                               n += 32;
+                                       }
+                                       n = 195 - 3 * n;
+                                       if (hi >= 0xcb300000L)
+                                               n += 2;
+                                       else if (hi >= 0xa1450000L)
+                                               n++;
+                                       goertzel_result_buffer[i] = (byte) n;
+                               }
+                               low_peak = DSPDTMF_RX_SENSITIVITY_LOW_DEFAULT;
+                               result_digit = CAPIDTMF_RECV_NO_DIGIT;
+                               for (i = 0; i < CAPIDTMF_LOW_GROUP_FREQUENCIES; i++)
+                               {
+                                       if (goertzel_result_buffer[i] > low_peak)
+                                       {
+                                               low_peak = goertzel_result_buffer[i];
+                                               result_digit = (byte) i;
+                                       }
+                               }
+                               high_peak = DSPDTMF_RX_SENSITIVITY_HIGH_DEFAULT;
+                               n = CAPIDTMF_RECV_NO_DIGIT;
+                               for (i = CAPIDTMF_LOW_GROUP_FREQUENCIES; i < CAPIDTMF_RECV_BASE_FREQUENCY_COUNT; i++)
+                               {
+                                       if (goertzel_result_buffer[i] > high_peak)
+                                       {
+                                               high_peak = goertzel_result_buffer[i];
+                                               n = (i - CAPIDTMF_LOW_GROUP_FREQUENCIES) << 2;
+                                       }
+                               }
+                               result_digit |= (byte) n;
+                               if (low_peak + DSPDTMF_RX_HIGH_EXCEEDING_LOW_DEFAULT < high_peak)
+                                       result_digit = CAPIDTMF_RECV_NO_DIGIT;
+                               if (high_peak + DSPDTMF_RX_LOW_EXCEEDING_HIGH_DEFAULT < low_peak)
+                                       result_digit = CAPIDTMF_RECV_NO_DIGIT;
+                               n = 0;
+                               for (i = 0; i < CAPIDTMF_RECV_TOTAL_FREQUENCY_COUNT; i++)
+                               {
+                                       if ((((short)(low_peak - goertzel_result_buffer[i] - capidtmf_recv_guard_snr_low_table[i])) < 0)
+                                           || (((short)(high_peak - goertzel_result_buffer[i] - capidtmf_recv_guard_snr_high_table[i])) < 0))
+                                       {
+                                               n++;
+                                       }
+                               }
+                               if (n != 2)
+                                       result_digit = CAPIDTMF_RECV_NO_DIGIT;
+
+                               if (result_digit == CAPIDTMF_RECV_NO_DIGIT)
+                               {
+                                       if (p_state->recv.current_digit_on_time != 0)
+                                       {
+                                               if (++(p_state->recv.current_digit_off_time) >= p_state->recv.min_gap_duration)
+                                               {
+                                                       p_state->recv.current_digit_on_time = 0;
+                                                       p_state->recv.current_digit_off_time = 0;
+                                               }
+                                       }
+                                       else
+                                       {
+                                               if (p_state->recv.current_digit_off_time != 0)
+                                                       (p_state->recv.current_digit_off_time)--;
+                                       }
+                               }
+                               else
+                               {
+                                       if ((p_state->recv.current_digit_on_time == 0)
+                                           && (p_state->recv.current_digit_off_time != 0))
+                                       {
+                                               (p_state->recv.current_digit_off_time)--;
+                                       }
+                                       else
+                                       {
+                                               n = p_state->recv.current_digit_off_time;
+                                               if ((p_state->recv.current_digit_on_time != 0)
+                                                   && (result_digit != p_state->recv.current_digit_value))
+                                               {
+                                                       p_state->recv.current_digit_on_time = 0;
+                                                       n = 0;
+                                               }
+                                               p_state->recv.current_digit_value = result_digit;
+                                               p_state->recv.current_digit_off_time = 0;
+                                               if (p_state->recv.current_digit_on_time != 0xffff)
+                                               {
+                                                       p_state->recv.current_digit_on_time += n + 1;
+                                                       if (p_state->recv.current_digit_on_time >= p_state->recv.min_digit_duration)
+                                                       {
+                                                               p_state->recv.current_digit_on_time = 0xffff;
+                                                               i = (p_state->recv.digit_write_pos == CAPIDTMF_RECV_DIGIT_BUFFER_SIZE - 1) ?
+                                                                       0 : p_state->recv.digit_write_pos + 1;
+                                                               if (i == p_state->recv.digit_read_pos)
+                                                               {
+                                                                       trace(dprintf("%s,%d: Receive digit overrun",
+                                                                                     (char *)(FILE_), __LINE__));
+                                                               }
+                                                               else
+                                                               {
+                                                                       p_state->recv.digit_buffer[p_state->recv.digit_write_pos] = result_digit;
+                                                                       p_state->recv.digit_write_pos = i;
+                                                                       p_state->recv.indication_state =
+                                                                               (p_state->recv.indication_state & ~CAPIDTMF_RECV_INDICATION_DIGIT) |
+                                                                               (~p_state->recv.indication_state_ack & CAPIDTMF_RECV_INDICATION_DIGIT);
+                                                               }
+                                                       }
+                                               }
+                                       }
+                               }
+                               cycle_counter = 0;
+                               sample_number++;
+                       }
+               }
+               p_state->recv.cycle_counter = cycle_counter;
+       }
 }
 
 
-void capidtmf_init (t_capidtmf_state   *p_state, byte ulaw)
+void capidtmf_init(t_capidtmf_state *p_state, byte ulaw)
 {
-  p_state->ulaw = ulaw;
-  capidtmf_recv_init (p_state);
+       p_state->ulaw = ulaw;
+       capidtmf_recv_init(p_state);
 }
 
 
index 242048f..0a9cf59 100644 (file)
@@ -1,29 +1,29 @@
 
 /*
  *
-  Copyright (c) Eicon Networks, 2002.
+ Copyright (c) Eicon Networks, 2002.
  *
-  This source file is supplied for the use with
-  Eicon Networks range of DIVA Server Adapters.
+ This source file is supplied for the use with
+ Eicon Networks range of DIVA Server Adapters.
  *
-  Eicon File Revision :    2.1
+ Eicon File Revision :    2.1
  *
-  This program is free software; you can redistribute it and/or modify
-  it under the terms of the GNU General Public License as published by
-  the Free Software Foundation; either version 2, or (at your option)
-  any later version.
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
  *
-  This program is distributed in the hope that it will be useful,
-  but WITHOUT ANY WARRANTY OF ANY KIND WHATSOEVER INCLUDING ANY
-  implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-  See the GNU General Public License for more details.
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY OF ANY KIND WHATSOEVER INCLUDING ANY
+ implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ See the GNU General Public License for more details.
  *
-  You should have received a copy of the GNU General Public License
-  along with this program; if not, write to the Free Software
-  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  *
  */
-#ifndef CAPIDTMF_H_  
+#ifndef CAPIDTMF_H_
 #define CAPIDTMF_H_
 /*---------------------------------------------------------------------------*/
 /*---------------------------------------------------------------------------*/
 #define CAPIDTMF_RECV_STATE_DTMF_ACTIVE      0x01
 typedef struct tag_capidtmf_recv_state
 {
-  byte digit_buffer[CAPIDTMF_RECV_DIGIT_BUFFER_SIZE];
-  word digit_write_pos;
-  word digit_read_pos;
-  word indication_state;
-  word indication_state_ack;
-  long goertzel_buffer[2][CAPIDTMF_RECV_TOTAL_FREQUENCY_COUNT];
-  word min_gap_duration;
-  word min_digit_duration;
-  word cycle_counter;
-  word current_digit_on_time;
-  word current_digit_off_time;
-  byte current_digit_value;
-  byte state;
+       byte digit_buffer[CAPIDTMF_RECV_DIGIT_BUFFER_SIZE];
+       word digit_write_pos;
+       word digit_read_pos;
+       word indication_state;
+       word indication_state_ack;
+       long goertzel_buffer[2][CAPIDTMF_RECV_TOTAL_FREQUENCY_COUNT];
+       word min_gap_duration;
+       word min_digit_duration;
+       word cycle_counter;
+       word current_digit_on_time;
+       word current_digit_off_time;
+       byte current_digit_value;
+       byte state;
 } t_capidtmf_recv_state;
 typedef struct tag_capidtmf_state
 {
-  byte ulaw;
-  t_capidtmf_recv_state recv;
+       byte ulaw;
+       t_capidtmf_recv_state recv;
 } t_capidtmf_state;
-word capidtmf_recv_indication (t_capidtmf_state   *p_state, byte *buffer);
-void capidtmf_recv_block (t_capidtmf_state   *p_state, byte   *buffer, word length);
-void capidtmf_init (t_capidtmf_state   *p_state, byte ulaw);
-void capidtmf_recv_enable (t_capidtmf_state   *p_state, word min_digit_duration, word min_gap_duration);
-void capidtmf_recv_disable (t_capidtmf_state   *p_state);
-#define capidtmf_indication(p_state,buffer)  (((p_state)->recv.indication_state != (p_state)->recv.indication_state_ack) ?    capidtmf_recv_indication (p_state, buffer) : 0)
-#define capidtmf_recv_process_block(p_state,buffer,length)  { if ((p_state)->recv.state != CAPIDTMF_RECV_STATE_IDLE) capidtmf_recv_block (p_state, buffer, length); }
+word capidtmf_recv_indication(t_capidtmf_state *p_state, byte *buffer);
+void capidtmf_recv_block(t_capidtmf_state *p_state, byte *buffer, word length);
+void capidtmf_init(t_capidtmf_state *p_state, byte ulaw);
+void capidtmf_recv_enable(t_capidtmf_state *p_state, word min_digit_duration, word min_gap_duration);
+void capidtmf_recv_disable(t_capidtmf_state *p_state);
+#define capidtmf_indication(p_state, buffer)  (((p_state)->recv.indication_state != (p_state)->recv.indication_state_ack) ? capidtmf_recv_indication(p_state, buffer) : 0)
+#define capidtmf_recv_process_block(p_state, buffer, length)  { if ((p_state)->recv.state != CAPIDTMF_RECV_STATE_IDLE) capidtmf_recv_block(p_state, buffer, length); }
 /*---------------------------------------------------------------------------*/
 /*---------------------------------------------------------------------------*/
-#endif  
+#endif
index 4d425c6..a576f32 100644 (file)
@@ -2,10 +2,10 @@
  *
  * ISDN interface module for Eicon active cards DIVA.
  * CAPI Interface common functions
- * 
- * Copyright 2000-2003 by Armin Schindler (mac@melware.de) 
+ *
+ * Copyright 2000-2003 by Armin Schindler (mac@melware.de)
  * Copyright 2000-2003 Cytronics & Melware (info@melware.de)
- * 
+ *
  * This software may be used and distributed according to the terms
  * of the GNU General Public License, incorporated herein by reference.
  *
@@ -43,7 +43,7 @@ static diva_os_spin_lock_t api_lock;
 static LIST_HEAD(cards);
 
 static dword notify_handle;
-static void DIRequest(ENTITY * e);
+static void DIRequest(ENTITY *e);
 static DESCRIPTOR MAdapter;
 static DESCRIPTOR DAdapter;
 static byte ControllerMap[MAX_DESCRIPTORS + 1];
@@ -160,7 +160,7 @@ static int find_free_id(void)
                        break;
                num++;
        }
-       return(num + 1);
+       return (num + 1);
 }
 
 /*
@@ -176,23 +176,23 @@ static diva_card *find_card_by_ctrl(word controller)
                if (ControllerMap[card->Id] == controller) {
                        if (card->remove_in_progress)
                                card = NULL;
-                       return(card);
+                       return (card);
                }
        }
        return (diva_card *) 0;
 }
 
 /*
- * Buffer RX/TX 
+ * Buffer RX/TX
  */
-void *TransmitBufferSet(APPL * appl, dword ref)
+void *TransmitBufferSet(APPL *appl, dword ref)
 {
        appl->xbuffer_used[ref] = true;
        DBG_PRV1(("%d:xbuf_used(%d)", appl->Id, ref + 1))
-           return (void *)(long)ref;
+               return (void *)(long)ref;
 }
 
-void *TransmitBufferGet(APPL * appl, void *p)
+void *TransmitBufferGet(APPL *appl, void *p)
 {
        if (appl->xbuffer_internal[(dword)(long)p])
                return appl->xbuffer_internal[(dword)(long)p];
@@ -200,13 +200,13 @@ void *TransmitBufferGet(APPL * appl, void *p)
        return appl->xbuffer_ptr[(dword)(long)p];
 }
 
-void TransmitBufferFree(APPL * appl, void *p)
+void TransmitBufferFree(APPL *appl, void *p)
 {
        appl->xbuffer_used[(dword)(long)p] = false;
        DBG_PRV1(("%d:xbuf_free(%d)", appl->Id, ((dword)(long)p) + 1))
-}
+               }
 
-void *ReceiveBufferGet(APPL * appl, int Num)
+void *ReceiveBufferGet(APPL *appl, int Num)
 {
        return &appl->ReceiveBuffer[Num * appl->MaxDataLength];
 }
@@ -217,12 +217,12 @@ void *ReceiveBufferGet(APPL * appl, int Num)
 void api_remove_complete(void)
 {
        DBG_PRV1(("api_remove_complete"))
-}
+               }
 
 /*
  * main function called by message.c
  */
-void sendf(APPL * appl, word command, dword Id, word Number, byte * format, ...)
+void sendf(APPL *appl, word command, dword Id, word Number, byte *format, ...)
 {
        word i, j;
        word length = 12, dlength = 0;
@@ -240,14 +240,14 @@ void sendf(APPL * appl, word command, dword Id, word Number, byte * format, ...)
        DBG_PRV1(("sendf(a=%d,cmd=%x,format=%s)",
                  appl->Id, command, (byte *) format))
 
-       PUT_WORD(&msg.header.appl_id, appl->Id);
+               PUT_WORD(&msg.header.appl_id, appl->Id);
        PUT_WORD(&msg.header.command, command);
        if ((byte) (command >> 8) == 0x82)
                Number = appl->Number++;
        PUT_WORD(&msg.header.number, Number);
 
        PUT_DWORD(&msg.header.controller, Id);
-       write = (byte *) & msg;
+       write = (byte *)&msg;
        write += 12;
 
        va_start(ap, format);
@@ -287,16 +287,16 @@ void sendf(APPL * appl, word command, dword Id, word Number, byte * format, ...)
 
        if (command == _DATA_B3_I)
                dlength = GET_WORD(
-                             ((byte *) & msg.info.data_b3_ind.Data_Length));
+                       ((byte *)&msg.info.data_b3_ind.Data_Length));
 
        if (!(dmb = diva_os_alloc_message_buffer(length + dlength,
-                                         (void **) &write))) {
+                                                (void **) &write))) {
                DBG_ERR(("sendf: alloc_message_buffer failed, incoming msg dropped."))
-               return;
+                       return;
        }
 
        /* copy msg header to sk_buff */
-       memcpy(write, (byte *) & msg, length);
+       memcpy(write, (byte *)&msg, length);
 
        /* if DATA_B3_IND, copy data too */
        if (command == _DATA_B3_I) {
@@ -318,10 +318,10 @@ void sendf(APPL * appl, word command, dword Id, word Number, byte * format, ...)
                        if (myDriverDebugHandle.dbgMask & DL_BLK) {
                                xlog("\x00\x02", &msg, 0x81, length);
                                for (i = 0; i < dlength; i += 256) {
-                                 DBG_BLK((((char *)(long)GET_DWORD(&msg.info.data_b3_ind.Data)) + i,
-                                       ((dlength - i) < 256) ? (dlength - i) : 256))
-                                 if (!(myDriverDebugHandle.dbgMask & DL_PRV0))
-                                         break; /* not more if not explicitly requested */
+                                       DBG_BLK((((char *)(long)GET_DWORD(&msg.info.data_b3_ind.Data)) + i,
+                                                ((dlength - i) < 256) ? (dlength - i) : 256))
+                                               if (!(myDriverDebugHandle.dbgMask & DL_PRV0))
+                                                       break; /* not more if not explicitly requested */
                                }
                        }
                        break;
@@ -333,7 +333,7 @@ void sendf(APPL * appl, word command, dword Id, word Number, byte * format, ...)
        if (!(card = find_card_by_ctrl(write[8] & 0x7f))) {
                DBG_ERR(("sendf - controller %d not found, incoming msg dropped",
                         write[8] & 0x7f))
-               diva_os_free_message_buffer(dmb);
+                       diva_os_free_message_buffer(dmb);
                return;
        }
        /* send capi msg to capi layer */
@@ -388,7 +388,7 @@ static void clean_adapter(int id, struct list_head *free_mem_q)
  * remove a card, but ensures consistent state of LI tables
  * in the time adapter is removed
  */
-static void divacapi_remove_card(DESCRIPTOR * d)
+static void divacapi_remove_card(DESCRIPTOR *d)
 {
        diva_card *card = NULL;
        diva_os_spin_lock_magic_t old_irql;
@@ -427,14 +427,14 @@ static void divacapi_remove_card(DESCRIPTOR * d)
 
                clean_adapter(card->Id - 1, &free_mem_q);
                DBG_TRC(("DelAdapterMap (%d) -> (%d)",
-                               ControllerMap[card->Id], card->Id))
-                               ControllerMap[card->Id] = 0;
+                        ControllerMap[card->Id], card->Id))
+                       ControllerMap[card->Id] = 0;
                DBG_TRC(("adapter remove, max_adapter=%d",
-                               max_adapter));
+                        max_adapter));
                diva_os_leave_spin_lock(&api_lock, &old_irql, "remove card");
-               
+
                /* After releasing the lock, we can free the memory */
-               diva_os_free (0, card);
+               diva_os_free(0, card);
        }
 
        /* free queued memory areas */
@@ -469,13 +469,13 @@ rescan:
 /*
  * sync_callback
  */
-static void sync_callback(ENTITY * e)
+static void sync_callback(ENTITY *e)
 {
        diva_os_spin_lock_magic_t old_irql;
 
        DBG_TRC(("cb:Id=%x,Rc=%x,Ind=%x", e->Id, e->Rc, e->Ind))
 
-       diva_os_enter_spin_lock(&api_lock, &old_irql, "sync_callback");
+               diva_os_enter_spin_lock(&api_lock, &old_irql, "sync_callback");
        callback(e);
        diva_os_leave_spin_lock(&api_lock, &old_irql, "sync_callback");
 }
@@ -483,7 +483,7 @@ static void sync_callback(ENTITY * e)
 /*
  * add a new card
  */
-static int diva_add_card(DESCRIPTOR * d)
+static int diva_add_card(DESCRIPTOR *d)
 {
        int k = 0, i = 0;
        diva_os_spin_lock_magic_t old_irql;
@@ -492,19 +492,19 @@ static int diva_add_card(DESCRIPTOR * d)
        DIVA_CAPI_ADAPTER *a = NULL;
        IDI_SYNC_REQ sync_req;
        char serial[16];
-       void* mem_to_free;
+       void *mem_to_free;
        LI_CONFIG *new_li_config_table;
        int j;
 
        if (!(card = (diva_card *) diva_os_malloc(0, sizeof(diva_card)))) {
                DBG_ERR(("diva_add_card: failed to allocate card struct."))
-                   return (0);
+                       return (0);
        }
        memset((char *) card, 0x00, sizeof(diva_card));
        memcpy(&card->d, d, sizeof(DESCRIPTOR));
        sync_req.GetName.Req = 0;
        sync_req.GetName.Rc = IDI_SYNC_REQ_GET_NAME;
-       card->d.request((ENTITY *) & sync_req);
+       card->d.request((ENTITY *)&sync_req);
        strlcpy(card->name, sync_req.GetName.name, sizeof(card->name));
        ctrl = &card->capi_ctrl;
        strcpy(ctrl->name, card->name);
@@ -517,14 +517,14 @@ static int diva_add_card(DESCRIPTOR * d)
 
        if (attach_capi_ctr(ctrl)) {
                DBG_ERR(("diva_add_card: failed to attach controller."))
-                   diva_os_free(0, card);
+                       diva_os_free(0, card);
                return (0);
        }
-       
+
        diva_os_enter_spin_lock(&api_lock, &old_irql, "find id");
        card->Id = find_free_id();
        diva_os_leave_spin_lock(&api_lock, &old_irql, "find id");
-       
+
        strlcpy(ctrl->manu, M_COMPANY, sizeof(ctrl->manu));
        ctrl->version.majorversion = 2;
        ctrl->version.minorversion = 0;
@@ -533,7 +533,7 @@ static int diva_add_card(DESCRIPTOR * d)
        sync_req.GetSerial.Req = 0;
        sync_req.GetSerial.Rc = IDI_SYNC_REQ_GET_SERIAL;
        sync_req.GetSerial.serial = 0;
-       card->d.request((ENTITY *) & sync_req);
+       card->d.request((ENTITY *)&sync_req);
        if ((i = ((sync_req.GetSerial.serial & 0xff000000) >> 24))) {
                sprintf(serial, "%ld-%d",
                        sync_req.GetSerial.serial & 0x00ffffff, i + 1);
@@ -550,15 +550,15 @@ static int diva_add_card(DESCRIPTOR * d)
 
        DBG_TRC(("AddAdapterMap (%d) -> (%d)", ctrl->cnr, card->Id))
 
-           sync_req.xdi_capi_prms.Req = 0;
+               sync_req.xdi_capi_prms.Req = 0;
        sync_req.xdi_capi_prms.Rc = IDI_SYNC_REQ_XDI_GET_CAPI_PARAMS;
        sync_req.xdi_capi_prms.info.structure_length =
-           sizeof(diva_xdi_get_capi_parameters_t);
-       card->d.request((ENTITY *) & sync_req);
+               sizeof(diva_xdi_get_capi_parameters_t);
+       card->d.request((ENTITY *)&sync_req);
        a->flag_dynamic_l1_down =
-           sync_req.xdi_capi_prms.info.flag_dynamic_l1_down;
+               sync_req.xdi_capi_prms.info.flag_dynamic_l1_down;
        a->group_optimization_enabled =
-           sync_req.xdi_capi_prms.info.group_optimization_enabled;
+               sync_req.xdi_capi_prms.info.group_optimization_enabled;
        a->request = DIRequest; /* card->d.request; */
        a->max_plci = card->d.channels + 30;
        a->max_listen = (card->d.channels > 2) ? 8 : 2;
@@ -566,7 +566,7 @@ static int diva_add_card(DESCRIPTOR * d)
            (a->plci =
             (PLCI *) diva_os_malloc(0, sizeof(PLCI) * a->max_plci))) {
                DBG_ERR(("diva_add_card: failed alloc plci struct."))
-                   memset(a, 0, sizeof(DIVA_CAPI_ADAPTER));
+                       memset(a, 0, sizeof(DIVA_CAPI_ADAPTER));
                return (0);
        }
        memset(a->plci, 0, sizeof(PLCI) * a->max_plci);
@@ -625,13 +625,13 @@ static int diva_add_card(DESCRIPTOR * d)
                (LI_CONFIG *) diva_os_malloc(0, ((k * sizeof(LI_CONFIG) + 3) & ~3) + (2 * k) * ((k + 3) & ~3));
        if (new_li_config_table == NULL) {
                DBG_ERR(("diva_add_card: failed alloc li_config table."))
-               memset(a, 0, sizeof(DIVA_CAPI_ADAPTER));
+                       memset(a, 0, sizeof(DIVA_CAPI_ADAPTER));
                return (0);
        }
 
        /* Prevent access to line interconnect table in process update */
        diva_os_enter_spin_lock(&api_lock, &old_irql, "add card");
-       
+
        j = 0;
        for (i = 0; i < k; i++) {
                if ((i >= a->li_base) && (i < a->li_base + a->li_channels))
@@ -659,11 +659,11 @@ static int diva_add_card(DESCRIPTOR * d)
                        memset(&new_li_config_table[i].coef_table[a->li_base], 0, a->li_channels);
                        if (a->li_base + a->li_channels < k) {
                                memcpy(&new_li_config_table[i].flag_table[a->li_base +
-                                      a->li_channels],
+                                                                         a->li_channels],
                                       &li_config_table[j].flag_table[a->li_base],
                                       k - (a->li_base + a->li_channels));
                                memcpy(&new_li_config_table[i].coef_table[a->li_base +
-                                      a->li_channels],
+                                                                         a->li_channels],
                                       &li_config_table[j].coef_table[a->li_base],
                                       k - (a->li_base + a->li_channels));
                        }
@@ -689,7 +689,7 @@ static int diva_add_card(DESCRIPTOR * d)
        diva_os_leave_spin_lock(&api_lock, &old_irql, "add card");
 
        if (mem_to_free) {
-               diva_os_free (0, mem_to_free);
+               diva_os_free(0, mem_to_free);
        }
 
        i = 0;
@@ -722,7 +722,7 @@ static int diva_add_card(DESCRIPTOR * d)
  *  register appl
  */
 static void diva_register_appl(struct capi_ctr *ctrl, __u16 appl,
-                              capi_register_params * rp)
+                              capi_register_params *rp)
 {
        APPL *this;
        word bnum, xnum;
@@ -737,38 +737,38 @@ static void diva_register_appl(struct capi_ctr *ctrl, __u16 appl,
 
        if (diva_os_in_irq()) {
                DBG_ERR(("CAPI_REGISTER - in irq context !"))
-               return;
+                       return;
        }
 
        DBG_TRC(("application register Id=%d", appl))
 
-       if (appl > MAX_APPL) {
-               DBG_ERR(("CAPI_REGISTER - appl.Id exceeds MAX_APPL"))
-               return;
-       }
+               if (appl > MAX_APPL) {
+                       DBG_ERR(("CAPI_REGISTER - appl.Id exceeds MAX_APPL"))
+                               return;
+               }
 
        if (nconn <= 0)
                nconn = ctrl->profile.nbchannel * -nconn;
 
-        if (nconn == 0)
+       if (nconn == 0)
                nconn = ctrl->profile.nbchannel;
 
        DBG_LOG(("CAPI_REGISTER - Id = %d", appl))
-       DBG_LOG(("  MaxLogicalConnections = %d(%d)", nconn, rp->level3cnt))
-       DBG_LOG(("  MaxBDataBuffers       = %d", rp->datablkcnt))
-       DBG_LOG(("  MaxBDataLength        = %d", rp->datablklen))
-
-       if (nconn < 1 ||
-           nconn > 255 ||
-           rp->datablklen < 80 ||
-           rp->datablklen > 2150 || rp->datablkcnt > 255) {
-               DBG_ERR(("CAPI_REGISTER - invalid parameters"))
-               return;
-       }
+               DBG_LOG(("  MaxLogicalConnections = %d(%d)", nconn, rp->level3cnt))
+               DBG_LOG(("  MaxBDataBuffers       = %d", rp->datablkcnt))
+               DBG_LOG(("  MaxBDataLength        = %d", rp->datablklen))
+
+               if (nconn < 1 ||
+                   nconn > 255 ||
+                   rp->datablklen < 80 ||
+                   rp->datablklen > 2150 || rp->datablkcnt > 255) {
+                       DBG_ERR(("CAPI_REGISTER - invalid parameters"))
+                               return;
+               }
 
        if (application[appl - 1].Id == appl) {
                DBG_LOG(("CAPI_REGISTER - appl already registered"))
-               return; /* appl already registered */
+                       return; /* appl already registered */
        }
 
        /* alloc memory */
@@ -785,10 +785,10 @@ static void diva_register_appl(struct capi_ctr *ctrl, __u16 appl,
        mem_len += xnum * rp->datablklen;       /* xbuffer_ptr[xnum] */
 
        DBG_LOG(("  Allocated Memory      = %d", mem_len))
-       if (!(p = diva_os_malloc(0, mem_len))) {
-               DBG_ERR(("CAPI_REGISTER - memory allocation failed"))
-               return;
-       }
+               if (!(p = diva_os_malloc(0, mem_len))) {
+                       DBG_ERR(("CAPI_REGISTER - memory allocation failed"))
+                               return;
+               }
        memset(p, 0, mem_len);
 
        DataNCCI = (void *)p;
@@ -853,10 +853,10 @@ static void diva_release_appl(struct capi_ctr *ctrl, __u16 appl)
 
        DBG_TRC(("application %d(%d) cleanup", this->Id, appl))
 
-       if (diva_os_in_irq()) {
-               DBG_ERR(("CAPI_RELEASE - in irq context !"))
-               return;
-       }
+               if (diva_os_in_irq()) {
+                       DBG_ERR(("CAPI_RELEASE - in irq context !"))
+                               return;
+               }
 
        diva_os_enter_spin_lock(&api_lock, &old_irql, "release_appl");
        if (this->Id) {
@@ -876,7 +876,7 @@ static void diva_release_appl(struct capi_ctr *ctrl, __u16 appl)
  *  send message
  */
 static u16 diva_send_message(struct capi_ctr *ctrl,
-                            diva_os_message_buffer_s * dmb)
+                            diva_os_message_buffer_s *dmb)
 {
        int i = 0;
        word ret = 0;
@@ -891,14 +891,14 @@ static u16 diva_send_message(struct capi_ctr *ctrl,
 
        if (diva_os_in_irq()) {
                DBG_ERR(("CAPI_SEND_MSG - in irq context !"))
-               return CAPI_REGOSRESOURCEERR;
+                       return CAPI_REGOSRESOURCEERR;
        }
        DBG_PRV1(("Write - appl = %d, cmd = 0x%x", this->Id, command))
 
-       if (card->remove_in_progress) {
-               DBG_ERR(("CAPI_SEND_MSG - remove in progress!"))
-               return CAPI_REGOSRESOURCEERR;
-       }
+               if (card->remove_in_progress) {
+                       DBG_ERR(("CAPI_SEND_MSG - remove in progress!"))
+                               return CAPI_REGOSRESOURCEERR;
+               }
 
        diva_os_enter_spin_lock(&api_lock, &old_irql, "send message");
 
@@ -909,7 +909,7 @@ static u16 diva_send_message(struct capi_ctr *ctrl,
 
        /* patch controller number */
        msg->header.controller = ControllerMap[card->Id]
-           | (msg->header.controller & 0x80);  /* preserve external controller bit */
+               | (msg->header.controller & 0x80);      /* preserve external controller bit */
 
        switch (command) {
        default:
@@ -937,15 +937,15 @@ static u16 diva_send_message(struct capi_ctr *ctrl,
                    || GET_WORD(&msg->info.data_b3_req.Data_Length) >
                    (length - clength)) {
                        DBG_ERR(("Write - invalid message size"))
-                       retval = CAPI_ILLCMDORSUBCMDORMSGTOSMALL;
+                               retval = CAPI_ILLCMDORSUBCMDORMSGTOSMALL;
                        goto write_end;
                }
 
                for (i = 0; i < (MAX_DATA_B3 * this->MaxNCCI)
-                    && this->xbuffer_used[i]; i++);
+                            && this->xbuffer_used[i]; i++);
                if (i == (MAX_DATA_B3 * this->MaxNCCI)) {
                        DBG_ERR(("Write - too many data pending"))
-                       retval = CAPI_SENDQUEUEFULL;
+                               retval = CAPI_SENDQUEUEFULL;
                        goto write_end;
                }
                msg->info.data_b3_req.Data = i;
@@ -959,13 +959,13 @@ static u16 diva_send_message(struct capi_ctr *ctrl,
                    && (myDriverDebugHandle.dbgMask & DL_XLOG)) {
                        int j;
                        for (j = 0; j <
-                            GET_WORD(&msg->info.data_b3_req.Data_Length);
+                                    GET_WORD(&msg->info.data_b3_req.Data_Length);
                             j += 256) {
                                DBG_BLK((((char *) this->xbuffer_ptr[i]) + j,
-                                       ((GET_WORD(&msg->info.data_b3_req.Data_Length) - j) <
+                                        ((GET_WORD(&msg->info.data_b3_req.Data_Length) - j) <
                                          256) ? (GET_WORD(&msg->info.data_b3_req.Data_Length) - j) : 256))
-                               if (!(myDriverDebugHandle.dbgMask & DL_PRV0))
-                                       break;  /* not more if not explicitly requested */
+                                       if (!(myDriverDebugHandle.dbgMask & DL_PRV0))
+                                               break;  /* not more if not explicitly requested */
                        }
                }
 #endif
@@ -984,19 +984,19 @@ static u16 diva_send_message(struct capi_ctr *ctrl,
                break;
        case _BAD_MSG:
                DBG_ERR(("Write - bad message"))
-               retval = CAPI_ILLCMDORSUBCMDORMSGTOSMALL;
+                       retval = CAPI_ILLCMDORSUBCMDORMSGTOSMALL;
                break;
        case _QUEUE_FULL:
                DBG_ERR(("Write - queue full"))
-               retval = CAPI_SENDQUEUEFULL;
+                       retval = CAPI_SENDQUEUEFULL;
                break;
        default:
                DBG_ERR(("Write - api_put returned unknown error"))
-               retval = CAPI_UNKNOWNNOTPAR;
+                       retval = CAPI_UNKNOWNNOTPAR;
                break;
        }
 
-      write_end:
+write_end:
        diva_os_leave_spin_lock(&api_lock, &old_irql, "send message");
        if (retval == CAPI_NOERROR)
                diva_os_free_message_buffer(dmb);
@@ -1007,7 +1007,7 @@ static u16 diva_send_message(struct capi_ctr *ctrl,
 /*
  * cards request function
  */
-static void DIRequest(ENTITY * e)
+static void DIRequest(ENTITY *e)
 {
        DIVA_CAPI_ADAPTER *a = &(adapter[(byte) e->user[0]]);
        diva_card *os_card = (diva_card *) a->os_card;
@@ -1022,7 +1022,7 @@ static void DIRequest(ENTITY * e)
 /*
  * callback function from didd
  */
-static void didd_callback(void *context, DESCRIPTOR * adapter, int removal)
+static void didd_callback(void *context, DESCRIPTOR *adapter, int removal)
 {
        if (adapter->type == IDI_DADAPTER) {
                DBG_ERR(("Notification about IDI_DADAPTER change ! Oops."));
@@ -1071,17 +1071,17 @@ static int divacapi_connect_didd(void)
                        memcpy(&DAdapter, &DIDD_Table[x], sizeof(DAdapter));
                        req.didd_notify.e.Req = 0;
                        req.didd_notify.e.Rc =
-                           IDI_SYNC_REQ_DIDD_REGISTER_ADAPTER_NOTIFY;
+                               IDI_SYNC_REQ_DIDD_REGISTER_ADAPTER_NOTIFY;
                        req.didd_notify.info.callback = (void *)didd_callback;
                        req.didd_notify.info.context = NULL;
-                       DAdapter.request((ENTITY *) & req);
+                       DAdapter.request((ENTITY *)&req);
                        if (req.didd_notify.e.Rc != 0xff) {
                                stop_dbg();
                                return (0);
                        }
                        notify_handle = req.didd_notify.info.handle;
                }
-                       else if ((DIDD_Table[x].type > 0) && (DIDD_Table[x].type < 16)) {       /* IDI Adapter found */
+               else if ((DIDD_Table[x].type > 0) && (DIDD_Table[x].type < 16)) {       /* IDI Adapter found */
                        diva_add_card(&DIDD_Table[x]);
                }
        }
@@ -1105,12 +1105,12 @@ static void divacapi_disconnect_didd(void)
        req.didd_notify.e.Req = 0;
        req.didd_notify.e.Rc = IDI_SYNC_REQ_DIDD_REMOVE_ADAPTER_NOTIFY;
        req.didd_notify.info.handle = notify_handle;
-       DAdapter.request((ENTITY *) & req);
+       DAdapter.request((ENTITY *)&req);
 }
 
 /*
  * we do not provide date/time here,
- * the application should do this. 
+ * the application should do this.
  */
 int fax_head_line_time(char *buffer)
 {
@@ -1124,19 +1124,19 @@ static int DIVA_INIT_FUNCTION init_main_structs(void)
 {
        if (!(mapped_msg = (CAPI_MSG *) diva_os_malloc(0, MAX_MSG_SIZE))) {
                DBG_ERR(("init: failed alloc mapped_msg."))
-                   return 0;
+                       return 0;
        }
 
        if (!(adapter = diva_os_malloc(0, sizeof(DIVA_CAPI_ADAPTER) * MAX_DESCRIPTORS))) {
                DBG_ERR(("init: failed alloc adapter struct."))
-               diva_os_free(0, mapped_msg);
+                       diva_os_free(0, mapped_msg);
                return 0;
        }
        memset(adapter, 0, sizeof(DIVA_CAPI_ADAPTER) * MAX_DESCRIPTORS);
 
        if (!(application = diva_os_malloc(0, sizeof(APPL) * MAX_APPL))) {
                DBG_ERR(("init: failed alloc application struct."))
-               diva_os_free(0, mapped_msg);
+                       diva_os_free(0, mapped_msg);
                diva_os_free(0, adapter);
                return 0;
        }
@@ -1176,7 +1176,7 @@ static void do_api_remove_start(void)
 
        if (ret)
                DBG_ERR(("could not remove signaling ID's"))
-}
+                       }
 
 /*
  * init
@@ -1190,13 +1190,13 @@ int DIVA_INIT_FUNCTION init_capifunc(void)
 
        if (!init_main_structs()) {
                DBG_ERR(("init: failed to init main structs."))
-               diva_os_destroy_spin_lock(&api_lock, "capifunc");
+                       diva_os_destroy_spin_lock(&api_lock, "capifunc");
                return (0);
        }
 
        if (!divacapi_connect_didd()) {
                DBG_ERR(("init: failed to connect to DIDD."))
-               do_api_remove_start();
+                       do_api_remove_start();
                divacapi_remove_cards();
                remove_main_structs();
                diva_os_destroy_spin_lock(&api_lock, "capifunc");
index bd256f2..e96c45b 100644 (file)
@@ -2,8 +2,8 @@
  *
  * ISDN interface module for Eicon active cards DIVA.
  * CAPI Interface common functions
- * 
- * Copyright 2000-2003 by Armin Schindler (mac@melware.de) 
+ *
+ * Copyright 2000-2003 by Armin Schindler (mac@melware.de)
  * Copyright 2000-2003 Cytronics & Melware (info@melware.de)
  *
  * This software may be used and distributed according to the terms
index 97a2096..eabe0fa 100644 (file)
@@ -2,10 +2,10 @@
  *
  * ISDN interface module for Eicon active cards DIVA.
  * CAPI Interface
- * 
- * Copyright 2000-2003 by Armin Schindler (mac@melware.de) 
+ *
+ * Copyright 2000-2003 by Armin Schindler (mac@melware.de)
  * Copyright 2000-2003 Cytronics & Melware (info@melware.de)
- * 
+ *
  * This software may be used and distributed according to the terms
  * of the GNU General Public License, incorporated herein by reference.
  */
@@ -28,7 +28,7 @@
 
 static char *main_revision = "$Revision: 1.24 $";
 static char *DRIVERNAME =
-    "Eicon DIVA - CAPI Interface driver (http://www.melware.net)";
+       "Eicon DIVA - CAPI Interface driver (http://www.melware.net)";
 static char *DRIVERLNAME = "divacapi";
 
 MODULE_DESCRIPTION("CAPI driver for Eicon DIVA cards");
@@ -69,7 +69,7 @@ diva_os_message_buffer_s *diva_os_alloc_message_buffer(unsigned long size,
 /*
  * free a message buffer
  */
-void diva_os_free_message_buffer(diva_os_message_buffer_s * dmb)
+void diva_os_free_message_buffer(diva_os_message_buffer_s *dmb)
 {
        kfree_skb(dmb);
 }
index 18a5c42..8b20e22 100644 (file)
@@ -1,26 +1,26 @@
 
 /*
  *
-  Copyright (c) Eicon Networks, 2002.
+ Copyright (c) Eicon Networks, 2002.
  *
-  This source file is supplied for the use with
-  Eicon Networks range of DIVA Server Adapters.
+ This source file is supplied for the use with
+ Eicon Networks range of DIVA Server Adapters.
  *
-  Eicon File Revision :    2.1
+ Eicon File Revision :    2.1
  *
-  This program is free software; you can redistribute it and/or modify
-  it under the terms of the GNU General Public License as published by
-  the Free Software Foundation; either version 2, or (at your option)
-  any later version.
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
  *
-  This program is distributed in the hope that it will be useful,
-  but WITHOUT ANY WARRANTY OF ANY KIND WHATSOEVER INCLUDING ANY
-  implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-  See the GNU General Public License for more details.
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY OF ANY KIND WHATSOEVER INCLUDING ANY
+ implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ See the GNU General Public License for more details.
  *
-  You should have received a copy of the GNU General Public License
-  along with this program; if not, write to the Free Software
-  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  *
  */
 #ifndef _CARDTYPE_H_
@@ -94,7 +94,7 @@
  */
 #define CARD_UNKNOWN                      0
 #define CARD_NONE                         0
-  /* DIVA cards */
+/* DIVA cards */
 #define CARDTYPE_DIVA_MCA                 0
 #define CARDTYPE_DIVA_ISA                 1
 #define CARDTYPE_DIVA_PCM                 2
 #define CARDTYPE_DIVAPRO_PCM              4
 #define CARDTYPE_DIVAPICO_ISA             5
 #define CARDTYPE_DIVAPICO_PCM             6
-  /* DIVA 2.0 cards */
+/* DIVA 2.0 cards */
 #define CARDTYPE_DIVAPRO20_PCI            7
 #define CARDTYPE_DIVA20_PCI               8
-  /* S cards */
+/* S cards */
 #define CARDTYPE_QUADRO_ISA               9
 #define CARDTYPE_S_ISA                    10
 #define CARDTYPE_S_MCA                    11
 #define CARDTYPE_SCOM_MCA                 17
 #define CARDTYPE_PR_ISA                   18
 #define CARDTYPE_PR_MCA                   19
-  /* Diva Server cards (formerly called Maestra, later Amadeo) */
+/* Diva Server cards (formerly called Maestra, later Amadeo) */
 #define CARDTYPE_MAESTRA_ISA              20
 #define CARDTYPE_MAESTRA_PCI              21
-  /* Diva Server cards to be developed (Quadro, Primary rate) */
+/* Diva Server cards to be developed (Quadro, Primary rate) */
 #define CARDTYPE_DIVASRV_Q_8M_PCI         22
 #define CARDTYPE_DIVASRV_P_30M_PCI        23
 #define CARDTYPE_DIVASRV_P_2M_PCI         24
 #define CARDTYPE_DIVASRV_P_9M_PCI         25
-  /* DIVA 2.0 cards */
+/* DIVA 2.0 cards */
 #define CARDTYPE_DIVA20_ISA               26
 #define CARDTYPE_DIVA20U_ISA              27
 #define CARDTYPE_DIVA20U_PCI              28
 #define CARDTYPE_DIVAPRO20_ISA            29
 #define CARDTYPE_DIVAPRO20U_ISA           30
 #define CARDTYPE_DIVAPRO20U_PCI           31
-  /* DIVA combi cards (piccola ISDN + rockwell V.34 modem) */
+/* DIVA combi cards (piccola ISDN + rockwell V.34 modem) */
 #define CARDTYPE_DIVAMOBILE_PCM           32
 #define CARDTYPE_TDKGLOBALPRO_PCM         33
-  /* DIVA Pro PC OEM card for 'New Media Corporation' */
+/* DIVA Pro PC OEM card for 'New Media Corporation' */
 #define CARDTYPE_NMC_DIVAPRO_PCM          34
-  /* DIVA Pro 2.0 OEM cards for 'British Telecom' */
+/* DIVA Pro 2.0 OEM cards for 'British Telecom' */
 #define CARDTYPE_BT_EXLANE_PCI            35
 #define CARDTYPE_BT_EXLANE_ISA            36
-  /* DIVA low cost cards, 1st name DIVA 3.0, 2nd DIVA 2.01, 3rd ??? */
+/* DIVA low cost cards, 1st name DIVA 3.0, 2nd DIVA 2.01, 3rd ??? */
 #define CARDTYPE_DIVALOW_ISA              37
 #define CARDTYPE_DIVALOWU_ISA             38
 #define CARDTYPE_DIVALOW_PCI              39
 #define CARDTYPE_DIVALOWU_PCI             40
-  /* DIVA combi cards (piccola ISDN + rockwell V.90 modem) */
+/* DIVA combi cards (piccola ISDN + rockwell V.90 modem) */
 #define CARDTYPE_DIVAMOBILE_V90_PCM       41
 #define CARDTYPE_TDKGLOBPRO_V90_PCM       42
 #define CARDTYPE_DIVASRV_P_23M_PCI        43
 #define CARDTYPE_DIVALOW_USB              44
-  /* DIVA Audio (CT) family */
+/* DIVA Audio (CT) family */
 #define CARDTYPE_DIVA_CT_ST               45
 #define CARDTYPE_DIVA_CT_U                46
 #define CARDTYPE_DIVA_CTLITE_ST           47
 #define CARDTYPE_DIVA_CTLITE_U            48
-  /* DIVA ISDN plus V.90 series */
+/* DIVA ISDN plus V.90 series */
 #define CARDTYPE_DIVAISDN_V90_PCM         49
 #define CARDTYPE_DIVAISDN_V90_PCI         50
 #define CARDTYPE_DIVAISDN_TA              51
-  /* DIVA Server Voice cards */
+/* DIVA Server Voice cards */
 #define CARDTYPE_DIVASRV_VOICE_Q_8M_PCI   52
-  /* DIVA Server V2 cards */
+/* DIVA Server V2 cards */
 #define CARDTYPE_DIVASRV_Q_8M_V2_PCI      53
 #define CARDTYPE_DIVASRV_P_30M_V2_PCI     54
-  /* DIVA Server Voice V2 cards */
+/* DIVA Server Voice V2 cards */
 #define CARDTYPE_DIVASRV_VOICE_Q_8M_V2_PCI 55
 #define CARDTYPE_DIVASRV_VOICE_P_30M_V2_PCI 56
-    /* Diva LAN */
+/* Diva LAN */
 #define CARDTYPE_DIVAISDN_LAN             57
 #define CARDTYPE_DIVA_202_PCI_ST          58
 #define CARDTYPE_DIVA_202_PCI_U           59
 #define CARDTYPE_DIVA_V2_PCM              67
 /* Re-badged Diva Pro PC Card */
 #define CARDTYPE_DIVA_PC_CARD             68
-  /* next free card type identifier */
+/* next free card type identifier */
 #define CARDTYPE_MAX                      69
 /*
  * The card families
  */
 typedef struct CARD_PROPERTIES
 {   char     *Name;  /* official marketing name     */
- unsigned short PnPId;  /* plug and play ID (for non PCMIA cards) */
- unsigned short Version; /* major and minor version no of the card */
- unsigned char DescType; /* card type to set in the IDI descriptor */
- unsigned char  Family;  /* basic family of the card     */
- unsigned short  Features; /* features bits to set in the IDI desc. */
- unsigned char Card;  /* basic card type       */
- unsigned char IType;  /* internal type of S cards (read from ram) */
- unsigned char  Bus;  /* bus type this card is designed for  */
- unsigned char  Chip;  /* chipset used on card      */
- unsigned char Adapters; /* number of adapters on card    */
- unsigned char Channels; /* # of channels per adapter    */
- unsigned short E_info;  /* # of ram entity info structs per adapter */
- unsigned short SizeIo;  /* size of IO window per adapter   */
- unsigned short SizeMem; /* size of memory window per adapter  */
+       unsigned short PnPId;  /* plug and play ID (for non PCMIA cards) */
+       unsigned short Version; /* major and minor version no of the card */
+       unsigned char DescType; /* card type to set in the IDI descriptor */
+       unsigned char  Family;  /* basic family of the card     */
+       unsigned short  Features; /* features bits to set in the IDI desc. */
+       unsigned char Card;  /* basic card type       */
+       unsigned char IType;  /* internal type of S cards (read from ram) */
+       unsigned char  Bus;  /* bus type this card is designed for  */
+       unsigned char  Chip;  /* chipset used on card      */
+       unsigned char Adapters; /* number of adapters on card    */
+       unsigned char Channels; /* # of channels per adapter    */
+       unsigned short E_info;  /* # of ram entity info structs per adapter */
+       unsigned short SizeIo;  /* size of IO window per adapter   */
+       unsigned short SizeMem; /* size of memory window per adapter  */
 } CARD_PROPERTIES;
 typedef struct CARD_RESOURCE
-{ unsigned char Int [10];
- unsigned short IoFirst;
- unsigned short IoStep;
- unsigned short IoCnt;
- unsigned long MemFirst;
- unsigned long MemStep;
- unsigned short MemCnt;
+{ unsigned char Int[10];
+       unsigned short IoFirst;
+       unsigned short IoStep;
+       unsigned short IoCnt;
+       unsigned long MemFirst;
+       unsigned long MemStep;
+       unsigned short MemCnt;
 } CARD_RESOURCE;
 /* test if the card of type 't' is a plug & play card */
-#define IS_PNP(t) \
-( \
- ( \
-  CardProperties[t].Bus != BUS_ISA \
-  && \
-  CardProperties[t].Bus != BUS_MCA \
- ) \
- || \
- ( \
-  CardProperties[t].Family != FAMILY_S \
-  && \
-  CardProperties[t].Card != CARD_DIVA \
- ) \
-)
+#define IS_PNP(t)                                              \
+       (                                                       \
+               (                                               \
+                       CardProperties[t].Bus != BUS_ISA        \
+                       &&                                      \
+                       CardProperties[t].Bus != BUS_MCA        \
+                       )                                       \
+               ||                                              \
+               (                                               \
+                       CardProperties[t].Family != FAMILY_S    \
+                       &&                                      \
+                       CardProperties[t].Card != CARD_DIVA     \
+                       )                                       \
+               )
 /* extract IDI Descriptor info for card type 't' (p == DescType/Features) */
-#define IDI_PROP(t,p) (CardProperties[t].p)
+#define IDI_PROP(t, p) (CardProperties[t].p)
 #if CARDTYPE_H_WANT_DATA
 #if CARDTYPE_H_WANT_IDI_DATA
 /* include "di_defs.h" for IDI adapter type and feature flag definitions */
@@ -328,502 +328,502 @@ typedef struct CARD_RESOURCE
 #define DI_SOFT_V110  0
 #endif
 /*--- CardProperties [Index=CARDTYPE_....] ---------------------------------*/
-CARD_PROPERTIES CardProperties [ ] =
+CARD_PROPERTIES CardProperties[] =
 {
-{ /*  0  */
- "Diva MCA",       0x6336,  0x0100,
- IDI_ADAPTER_DIVA, FAMILY_DIVA, DI_V1x0 | DI_FAX3,
- CARD_DIVA,   CARD_I_NONE, BUS_MCA, CHIP_DSP,
- 1, 2,  0,   8,      0
-},
-{ /*  1  */
- "Diva ISA",       0x0000,  0x0100,
- IDI_ADAPTER_DIVA, FAMILY_DIVA, DI_V1x0 | DI_FAX3,
- CARD_DIVA,   CARD_I_NONE, BUS_ISA, CHIP_DSP,
- 1, 2,  0,   8,      0
-},
-{ /*  2  */
- "Diva/PCM",       0x0000,  0x0100,
- IDI_ADAPTER_DIVA, FAMILY_DIVA, DI_V1x0 | DI_FAX3,
- CARD_DIVA,   CARD_I_NONE, BUS_PCM, CHIP_DSP,
- 1, 2,  0,   8,      0
-},
-{ /*  3  */
- "Diva PRO ISA",      0x0031,  0x0100,
- IDI_ADAPTER_DIVA, FAMILY_DIVA, DI_V1x0 | DI_FAX3 | DI_MODEM | DI_CODEC,
- CARD_PRO,   CARD_I_NONE, BUS_ISA, CHIP_DSP,
- 1, 2,  0,   8,      0
-},
-{ /*  4  */
- "Diva PRO PC-Card",     0x0000,  0x0100,
- IDI_ADAPTER_DIVA, FAMILY_DIVA, DI_V1x0 | DI_FAX3 | DI_MODEM,
- CARD_PRO,   CARD_I_NONE, BUS_PCM, CHIP_DSP,
- 1, 2,   0,   8,      0
-},
-{ /*  5  */
- "Diva PICCOLA ISA",     0x0051,  0x0100,
- IDI_ADAPTER_DIVA, FAMILY_DIVA, DI_V120 | SOFT_DSP_ADD_FEATURES,
- CARD_PICO,   CARD_I_NONE, BUS_ISA, CHIP_HSCX,
- 1, 2,   0,   8,      0
-},
-{ /*  6  */
- "Diva PICCOLA PCM",     0x0000,  0x0100,
- IDI_ADAPTER_DIVA, FAMILY_DIVA, DI_V120 | SOFT_DSP_ADD_FEATURES,
- CARD_PICO,   CARD_I_NONE, BUS_PCM, CHIP_HSCX,
- 1, 2,   0,   8,      0
-},
-{ /*  7  */
- "Diva PRO 2.0 S/T PCI",    0xe001,  0x0200,
- IDI_ADAPTER_DIVA, FAMILY_DIVA, DI_V1x0 | DI_FAX3 | DI_MODEM | DI_POTS,
- CARD_PRO,   CARD_I_NONE, BUS_PCI, CHIP_DSP,
- 1, 2,   0,   8,      0
-},
-{ /*  8  */
- "Diva 2.0 S/T PCI",     0xe002,  0x0200,
- IDI_ADAPTER_DIVA, FAMILY_DIVA, DI_V120 | DI_POTS | SOFT_DSP_ADD_FEATURES,
- CARD_PICO,   CARD_I_NONE, BUS_PCI, CHIP_HSCX,
- 1, 2,   0,   8,      0
-},
-{ /*  9  */
- "QUADRO ISA",      0x0000,  0x0100,
- IDI_ADAPTER_S,  FAMILY_S,  DI_NULL,
- CARD_QUAD,   CARD_I_QUAD, BUS_ISA, CHIP_NONE,
- 4, 2,   16,  0,  0x800
-},
-{ /* 10  */
- "S ISA",       0x0000,  0x0100,
- IDI_ADAPTER_S,  FAMILY_S,  DI_CODEC,
- CARD_S,    CARD_I_S,  BUS_ISA, CHIP_NONE,
- 1, 1,   16,  0,  0x800
-},
-{ /* 11  */
- "S MCA",       0x6a93,  0x0100,
- IDI_ADAPTER_S,  FAMILY_S,  DI_CODEC,
- CARD_S,    CARD_I_S,  BUS_MCA, CHIP_NONE,
- 1, 1,   16,  16,  0x400
-},
-{ /* 12 */
- "SX ISA",       0x0000,  0x0100,
- IDI_ADAPTER_S,  FAMILY_S,  DI_NULL,
- CARD_SX,   CARD_I_SX,  BUS_ISA, CHIP_NONE,
- 1, 2,  16,  0,  0x800
-},
-{ /* 13 */
- "SX MCA",       0x6a93,  0x0100,
- IDI_ADAPTER_S,  FAMILY_S,  DI_NULL,
- CARD_SX,   CARD_I_SX,  BUS_MCA, CHIP_NONE,
- 1, 2,  16,  16,  0x400
-},
-{ /* 14 */
- "SXN ISA",       0x0000,  0x0100,
- IDI_ADAPTER_S,  FAMILY_S,  DI_NULL,
- CARD_SXN,   CARD_I_SCOM, BUS_ISA, CHIP_NONE,
- 1, 2,   16,  0,   0x800
-},
-{ /* 15 */
- "SXN MCA",       0x6a93,  0x0100,
- IDI_ADAPTER_S,  FAMILY_S,  DI_NULL,
- CARD_SXN,   CARD_I_SCOM, BUS_MCA, CHIP_NONE,
- 1, 2,  16,  16,  0x400
-},
-{ /* 16 */
- "SCOM ISA",       0x0000,  0x0100,
- IDI_ADAPTER_S,  FAMILY_S,  DI_CODEC,
- CARD_SCOM,   CARD_I_SCOM, BUS_ISA, CHIP_NONE,
- 1, 2,   16,  0,   0x800
-},
-{ /* 17 */
- "SCOM MCA",       0x6a93,  0x0100,
- IDI_ADAPTER_S,  FAMILY_S,  DI_CODEC,
- CARD_SCOM,   CARD_I_SCOM, BUS_MCA, CHIP_NONE,
- 1, 2,  16,  16,  0x400
-},
-{ /* 18 */
- "S2M ISA",       0x0000,  0x0100,
- IDI_ADAPTER_PR,  FAMILY_S,  DI_NULL,
- CARD_PR,   CARD_I_PR,  BUS_ISA, CHIP_NONE,
- 1, 30,  256, 0,   0x4000
-},
-{ /* 19 */
- "S2M MCA",       0x6abb,  0x0100,
- IDI_ADAPTER_PR,  FAMILY_S,  DI_NULL,
- CARD_PR,   CARD_I_PR,  BUS_MCA, CHIP_NONE,
- 1, 30,  256, 16,  0x4000
-},
-{ /* 20 */
- "Diva Server BRI-2M ISA",   0x0041,  0x0100,
- IDI_ADAPTER_MAESTRA,FAMILY_MAESTRA, DI_V1x0 | DI_FAX3 | DI_MODEM,
- CARD_MAE,   CARD_I_NONE, BUS_ISA, CHIP_DSP,
- 1, 2,   16,  8,  0
-},
-{ /* 21 */
- "Diva Server BRI-2M PCI",   0xE010,  0x0100,
- IDI_ADAPTER_MAESTRA,FAMILY_MAESTRA, DI_V1x0 | DI_FAX3 | DI_MODEM,
- CARD_MAE,   CARD_I_NONE, BUS_PCI, CHIP_DSP,
- 1, 2,   16,  8,   0
-},
-{ /* 22 */
- "Diva Server 4BRI-8M PCI",   0xE012,  0x0100,
- IDI_ADAPTER_MAESTRA,FAMILY_MAESTRA, DI_V1x0 | DI_FAX3 | DI_MODEM,
- CARD_MAEQ,   CARD_I_NONE, BUS_PCI, CHIP_DSP,
- 4, 2,   16,  8,   0
-},
-{ /* 23 */
- "Diva Server PRI-30M PCI",   0xE014,  0x0100,
- IDI_ADAPTER_MAESTRA,FAMILY_MAESTRA, DI_V1x0 | DI_FAX3 | DI_MODEM,
- CARD_MAEP,   CARD_I_NONE, BUS_PCI, CHIP_DSP,
- 1, 30,  256,  8,   0
-},
-{ /* 24 */
- "Diva Server PRI-2M PCI",   0xe014,  0x0100,
- IDI_ADAPTER_MAESTRA,FAMILY_MAESTRA, DI_V1x0 | DI_FAX3 | DI_MODEM,
- CARD_MAEP,   CARD_I_NONE, BUS_PCI, CHIP_DSP,
- 1, 30,  256,  8,   0
-},
-{ /* 25 */
- "Diva Server PRI-9M PCI",   0x0000,  0x0100,
- IDI_ADAPTER_MAESTRA,FAMILY_MAESTRA, DI_V1x0 | DI_FAX3 | DI_MODEM,
- CARD_MAEP,   CARD_I_NONE, BUS_PCI, CHIP_DSP,
- 1, 30,     256,  8,   0
-},
-{ /* 26 */
- "Diva 2.0 S/T ISA",     0x0071,  0x0200,
- IDI_ADAPTER_DIVA, FAMILY_DIVA, DI_V120 | DI_POTS | SOFT_DSP_ADD_FEATURES,
- CARD_PICO,   CARD_I_NONE, BUS_ISA, CHIP_HSCX,
- 1, 2,  0,   8,   0
-},
-{ /* 27 */
- "Diva 2.0 U ISA",     0x0091,  0x0200,
- IDI_ADAPTER_DIVA, FAMILY_DIVA, DI_V120 | DI_POTS | SOFT_DSP_ADD_FEATURES,
- CARD_PICO,   CARD_I_NONE, BUS_ISA, CHIP_HSCX,
- 1, 2,   0,   8,   0
-},
-{ /* 28 */
- "Diva 2.0 U PCI",     0xe004,  0x0200,
- IDI_ADAPTER_DIVA, FAMILY_DIVA, DI_V120 | DI_POTS | SOFT_DSP_ADD_FEATURES,
- CARD_PICO,   CARD_I_NONE, BUS_PCI, CHIP_HSCX,
- 1, 2,   0,   8,   0
-},
-{ /* 29 */
- "Diva PRO 2.0 S/T ISA",    0x0061,  0x0200,
- IDI_ADAPTER_DIVA, FAMILY_DIVA, DI_V1x0 | DI_FAX3 | DI_MODEM | DI_POTS,
- CARD_PRO,   CARD_I_NONE, BUS_ISA, CHIP_DSP,
- 1, 2,  0,   8,   0
-},
-{ /* 30 */
- "Diva PRO 2.0 U ISA",    0x0081,  0x0200,
- IDI_ADAPTER_DIVA, FAMILY_DIVA, DI_V1x0 | DI_FAX3 | DI_MODEM | DI_POTS,
- CARD_PRO,   CARD_I_NONE, BUS_ISA, CHIP_DSP,
- 1, 2,  0,   8,   0
-},
-{ /* 31 */
- "Diva PRO 2.0 U PCI",    0xe003,  0x0200,
- IDI_ADAPTER_DIVA, FAMILY_DIVA, DI_V1x0 | DI_FAX3 | DI_MODEM | DI_POTS,
- CARD_PRO,   CARD_I_NONE, BUS_PCI, CHIP_DSP,
- 1, 2,   0,   8,   0
-},
-{ /* 32 */
- "Diva MOBILE",      0x0000,  0x0100,
- IDI_ADAPTER_DIVA, FAMILY_DIVA, DI_V120 | SOFT_DSP_ADD_FEATURES,
- CARD_PICO,   CARD_I_NONE, BUS_PCM, CHIP_HSCX,
- 1, 2,  0,   8,   0
-},
-{ /* 33 */
- "TDK DFI3600",      0x0000,  0x0100,
- IDI_ADAPTER_DIVA, FAMILY_DIVA, DI_V120 | SOFT_DSP_ADD_FEATURES,
- CARD_PICO,   CARD_I_NONE, BUS_PCM, CHIP_HSCX,
- 1, 2,  0,   8,   0
-},
-{ /* 34 (OEM version of 4 - "Diva PRO PC-Card") */
- "New Media ISDN",     0x0000,  0x0100,
- IDI_ADAPTER_DIVA, FAMILY_DIVA, DI_V1x0 | DI_FAX3 | DI_MODEM,
- CARD_PRO,   CARD_I_NONE, BUS_PCM, CHIP_DSP,
- 1, 2,   0,   8,   0
-},
-{ /* 35 (OEM version of 7 - "Diva PRO 2.0 S/T PCI") */
- "BT ExLane PCI",     0xe101,  0x0200,
- IDI_ADAPTER_DIVA, FAMILY_DIVA, DI_V1x0 | DI_FAX3 | DI_MODEM | DI_POTS,
- CARD_PRO,   CARD_I_NONE, BUS_PCI, CHIP_DSP,
- 1, 2,   0,   8,   0
-},
-{ /* 36 (OEM version of 29 - "Diva PRO 2.0 S/T ISA") */
- "BT ExLane ISA",     0x1061,  0x0200,
- IDI_ADAPTER_DIVA, FAMILY_DIVA, DI_V1x0 | DI_FAX3 | DI_MODEM | DI_POTS,
- CARD_PRO,   CARD_I_NONE, BUS_ISA, CHIP_DSP,
- 1, 2,   0,   8,   0
-},
-{ /* 37 */
- "Diva 2.01 S/T ISA",    0x00A1,  0x0300,
- IDI_ADAPTER_DIVA, FAMILY_DIVA, DI_V120 | SOFT_DSP_ADD_FEATURES,
- CARD_DIVALOW,  CARD_I_NONE, BUS_ISA, CHIP_IPAC,
- 1, 2,   0,   8,      0
-},
-{ /* 38 */
- "Diva 2.01 U ISA",     0x00B1,  0x0300,
- IDI_ADAPTER_DIVA, FAMILY_DIVA, DI_V120 | SOFT_DSP_ADD_FEATURES,
- CARD_DIVALOW,  CARD_I_NONE, BUS_ISA, CHIP_IPAC,
- 1, 2,   0,   8,      0
-},
-{ /* 39 */
- "Diva 2.01 S/T PCI",    0xe005,  0x0300,
- IDI_ADAPTER_DIVA, FAMILY_DIVA, DI_V120 | SOFT_DSP_ADD_FEATURES,
- CARD_DIVALOW,  CARD_I_NONE, BUS_PCI, CHIP_IPAC,
- 1, 2,   0,   8,   0
-},
-{ /* 40        no ID yet */
- "Diva 2.01 U PCI",     0x0000,  0x0300,
- IDI_ADAPTER_DIVA, FAMILY_DIVA, DI_V120 | SOFT_DSP_ADD_FEATURES,
- CARD_DIVALOW,  CARD_I_NONE, BUS_PCI, CHIP_IPAC,
- 1, 2,   0,   8,   0
-},
-{ /* 41 */
- "Diva MOBILE V.90",     0x0000,  0x0100,
- IDI_ADAPTER_DIVA, FAMILY_DIVA, DI_V120 | SOFT_DSP_ADD_FEATURES,
- CARD_PICO,   CARD_I_NONE, BUS_PCM, CHIP_HSCX,
- 1, 2,  0,   8,   0
-},
-{ /* 42 */
- "TDK DFI3600 V.90",     0x0000,  0x0100,
- IDI_ADAPTER_DIVA, FAMILY_DIVA, DI_V120 | SOFT_DSP_ADD_FEATURES,
- CARD_PICO,   CARD_I_NONE, BUS_PCM, CHIP_HSCX,
- 1, 2,  0,   8,   0
-},
-{ /* 43 */
- "Diva Server PRI-23M PCI",   0xe014,  0x0100,
- IDI_ADAPTER_MAESTRA,FAMILY_MAESTRA, DI_V1x0 | DI_FAX3 | DI_MODEM,
- CARD_MAEP,   CARD_I_NONE, BUS_PCI, CHIP_DSP,
- 1, 30,  256,  8,   0
-},
-{ /* 44 */
- "Diva 2.01 S/T USB",    0x1000,     0x0300,
- IDI_ADAPTER_DIVA   ,FAMILY_DIVA, DI_V120 | SOFT_DSP_ADD_FEATURES,
- CARD_DIVALOW,  CARD_I_NONE, BUS_USB, CHIP_IPAC,
- 1,  2,  0,  8,   0
-},
-{ /* 45 */
- "Diva CT S/T PCI",    0xe006,  0x0300,
- IDI_ADAPTER_DIVA   ,FAMILY_DIVA, DI_V1x0 | DI_FAX3 | DI_MODEM | DI_CODEC,
- CARD_CT,       CARD_I_NONE, BUS_PCI, CHIP_DSP,
- 1,  2,  0,  0,   0
-},
-{ /* 46 */
- "Diva CT U PCI",     0xe007,  0x0300,
- IDI_ADAPTER_DIVA   ,FAMILY_DIVA, DI_V1x0 | DI_FAX3 | DI_MODEM | DI_CODEC,
- CARD_CT,       CARD_I_NONE, BUS_PCI, CHIP_DSP,
- 1,  2,  0,  0,   0
-},
-{ /* 47 */
- "Diva CT Lite S/T PCI",   0xe008,  0x0300,
- IDI_ADAPTER_DIVA   ,FAMILY_DIVA, DI_V1x0 | DI_FAX3 | DI_MODEM | DI_CODEC,
- CARD_CT,       CARD_I_NONE, BUS_PCI, CHIP_DSP,
- 1,  2,  0,  0,   0
-},
-{ /* 48 */
- "Diva CT Lite U PCI",   0xe009,  0x0300,
- IDI_ADAPTER_DIVA   ,FAMILY_DIVA, DI_V1x0 | DI_FAX3 | DI_MODEM | DI_CODEC,
- CARD_CT,       CARD_I_NONE, BUS_PCI, CHIP_DSP,
- 1,  2,  0,  0,   0
-},
-{ /* 49 */
- "Diva ISDN+V.90 PC Card", 0x8D8C, 0x0100,
- IDI_ADAPTER_DIVA, FAMILY_DIVA, DI_V1x0 | DI_FAX3 | DI_MODEM | DI_CODEC,
- CARD_DIVALOW, CARD_I_NONE, BUS_PCM, CHIP_IPAC,
- 1, 2,  0,   8,   0
-},
-{ /* 50 */
- "Diva ISDN+V.90 PCI",    0xe00A,  0x0100,
- IDI_ADAPTER_DIVA, FAMILY_DIVA, DI_V120  | SOFT_DSP_ADD_FEATURES,
- CARD_DIVALOW,  CARD_I_NONE, BUS_PCI, CHIP_IPAC,
- 1, 2,   0,   8,   0
-},
-{ /* 51 (DivaTA)      no ID */
- "Diva TA",       0x0000,  0x0300,
- IDI_ADAPTER_DIVA, FAMILY_DIVA, DI_V110 | DI_FAX3 | SOFT_DSP_ADD_FEATURES,
- CARD_DIVATA,  CARD_I_NONE, BUS_COM, CHIP_EXTERN,
- 1, 1,   0,   8,   0
-},
-{ /* 52 (Diva Server 4BRI-8M PCI adapter enabled for Voice) */
- "Diva Server Voice 4BRI-8M PCI", 0xE016,  0x0100,
- IDI_ADAPTER_MAESTRA,FAMILY_MAESTRA, DI_V1x0 | DI_FAX3 | DI_MODEM | DI_VOICE_OVER_IP,
- CARD_MAEQ,   CARD_I_NONE, BUS_PCI, CHIP_DSP,
- 4, 2,   16,  8,   0
-},
-{ /* 53 (Diva Server 4BRI 2.0 adapter) */
- "Diva Server 4BRI-8M 2.0 PCI",  0xE013,  0x0200,
- IDI_ADAPTER_MAESTRA,FAMILY_MAESTRA, DI_V1x0 | DI_FAX3 | DI_MODEM,
- CARD_MAEQ,   CARD_I_NONE, BUS_PCI, CHIP_DSP,
- 4, 2,   16,  8,   0
-},
-{ /* 54 (Diva Server PRI 2.0 adapter) */
- "Diva Server PRI 2.0 PCI",   0xE015,  0x0200,
- IDI_ADAPTER_MAESTRA,FAMILY_MAESTRA, DI_V1x0 | DI_FAX3 | DI_MODEM,
- CARD_MAEP,   CARD_I_NONE, BUS_PCI, CHIP_DSP,
- 1, 30,  256,  8,   0
-},
-{ /* 55 (Diva Server 4BRI-8M 2.0 PCI adapter enabled for Voice) */
- "Diva Server Voice 4BRI-8M 2.0 PCI", 0xE017,  0x0200,
- IDI_ADAPTER_MAESTRA,FAMILY_MAESTRA, DI_V1x0 | DI_FAX3 | DI_MODEM | DI_VOICE_OVER_IP,
- CARD_MAEQ,   CARD_I_NONE, BUS_PCI, CHIP_DSP,
- 4, 2,   16,  8,   0
-},
-{ /* 56 (Diva Server PRI 2.0 PCI adapter enabled for Voice) */
- "Diva Server Voice PRI 2.0 PCI",  0xE019,  0x0200,
- IDI_ADAPTER_MAESTRA,FAMILY_MAESTRA, DI_V1x0 | DI_FAX3 | DI_MODEM | DI_VOICE_OVER_IP,
- CARD_MAEP,   CARD_I_NONE, BUS_PCI, CHIP_DSP,
- 1, 30,  256,  8,   0
-},
-{
- /* 57 (DivaLan )      no ID */
- "Diva LAN",       0x0000,  0x0300,
- IDI_ADAPTER_DIVA, FAMILY_DIVA, DI_V110 | DI_FAX3 | SOFT_DSP_ADD_FEATURES,
- CARD_DIVALAN,  CARD_I_NONE, BUS_LAN, CHIP_EXTERN,
- 1, 1,   0,   8,   0
-},
-{ /* 58 */
- "Diva 2.02 PCI S/T",    0xE00B,  0x0300,
- IDI_ADAPTER_DIVA, FAMILY_DIVA, DI_V120 | SOFT_DSP_ADD_FEATURES | DI_SOFT_V110,
- CARD_DIVALOW,  CARD_I_NONE, BUS_PCI, CHIP_IPACX,
- 1, 2,   0,   8,   0
-},
-{ /* 59 */
- "Diva 2.02 PCI U",     0xE00C,  0x0300,
- IDI_ADAPTER_DIVA, FAMILY_DIVA, DI_V120 | SOFT_DSP_ADD_FEATURES,
- CARD_DIVALOW,  CARD_I_NONE, BUS_PCI, CHIP_IPACX,
- 1, 2,   0,   8,   0
-},
-{ /* 60 */
- "Diva Server BRI-2M 2.0 PCI",     0xE018,  0x0200,
- IDI_ADAPTER_MAESTRA,FAMILY_MAESTRA, DI_V1x0 | DI_FAX3 | DI_MODEM,
- CARD_MAE2,   CARD_I_NONE, BUS_PCI, CHIP_DSP,
- 1, 2,   16,  8,   0
-},
-{ /* 61  (the previous name was Diva Server BRI-2F 2.0 PCI) */
- "Diva Server 2FX",                      0xE01A,     0x0200,
- IDI_ADAPTER_MAESTRA,FAMILY_MAESTRA, DI_V1x0 | DI_FAX3 | DI_MODEM | DI_SOFT_V110,
- CARD_MAE2,          CARD_I_NONE,    BUS_PCI,    CHIP_IPACX,
- 1,  2,      16,     8,   0
-},
-{ /* 62 */
- " Diva ISDN USB 2.0",    0x1003,     0x0300,
- IDI_ADAPTER_DIVA   ,FAMILY_DIVA, DI_V120 | SOFT_DSP_ADD_FEATURES,
- CARD_DIVALOW,  CARD_I_NONE, BUS_USB, CHIP_IPACX,
- 1, 2,  0,  8,   0
-},
-{ /* 63 (Diva Server BRI-2M 2.0 PCI adapter enabled for Voice) */
- "Diva Server Voice BRI-2M 2.0 PCI", 0xE01B,  0x0200,
- IDI_ADAPTER_MAESTRA,FAMILY_MAESTRA, DI_V1x0 | DI_FAX3 | DI_MODEM | DI_VOICE_OVER_IP,
- CARD_MAE2,   CARD_I_NONE, BUS_PCI, CHIP_DSP,
- 1, 2,   16,  8,   0
-},
-{ /* 64 */
- "Diva Pro 3.0 PCI",    0xe00d,  0x0300,
- IDI_ADAPTER_DIVA   ,FAMILY_DIVA, DI_V1x0 | DI_FAX3 | DI_MODEM,
- CARD_PRO,       CARD_I_NONE, BUS_PCI, CHIP_DSP,
- 1,  2,  0,  0,   0
-},
-{ /* 65 */
- "Diva ISDN + CT 2.0",    0xE00E,  0x0300,
- IDI_ADAPTER_DIVA   ,FAMILY_DIVA, DI_V1x0 | DI_FAX3 | DI_MODEM | DI_CODEC,
- CARD_CT,       CARD_I_NONE, BUS_PCI, CHIP_DSP,
- 1,  2,  0,  0,   0
-},
-{ /* 66 */
- "Diva Mobile V.90 PC Card",  0x8331,  0x0100,
- IDI_ADAPTER_DIVA, FAMILY_DIVA, DI_V120 | SOFT_DSP_ADD_FEATURES,
- CARD_PICO,   CARD_I_NONE, BUS_PCM, CHIP_IPACX,
- 1, 2,  0,   8,   0
-},
-{ /* 67 */
- "Diva ISDN PC Card",  0x8311,  0x0100,
- IDI_ADAPTER_DIVA, FAMILY_DIVA, DI_V120 | SOFT_DSP_ADD_FEATURES,
- CARD_PICO,   CARD_I_NONE, BUS_PCM, CHIP_IPACX,
- 1, 2,  0,   8,   0
-},
-{ /* 68 */
- "Diva ISDN PC Card",  0x0000,  0x0100,
- IDI_ADAPTER_DIVA, FAMILY_DIVA, DI_V120 | SOFT_DSP_ADD_FEATURES,
- CARD_PRO,   CARD_I_NONE, BUS_PCM, CHIP_DSP,
- 1, 2,   0,   8,      0
-},
-} ;
+       { /*  0  */
+               "Diva MCA",       0x6336,  0x0100,
+               IDI_ADAPTER_DIVA, FAMILY_DIVA, DI_V1x0 | DI_FAX3,
+               CARD_DIVA,   CARD_I_NONE, BUS_MCA, CHIP_DSP,
+               1, 2,  0,   8,      0
+       },
+       { /*  1  */
+               "Diva ISA",       0x0000,  0x0100,
+               IDI_ADAPTER_DIVA, FAMILY_DIVA, DI_V1x0 | DI_FAX3,
+               CARD_DIVA,   CARD_I_NONE, BUS_ISA, CHIP_DSP,
+               1, 2,  0,   8,      0
+       },
+       { /*  2  */
+               "Diva/PCM",       0x0000,  0x0100,
+               IDI_ADAPTER_DIVA, FAMILY_DIVA, DI_V1x0 | DI_FAX3,
+               CARD_DIVA,   CARD_I_NONE, BUS_PCM, CHIP_DSP,
+               1, 2,  0,   8,      0
+       },
+       { /*  3  */
+               "Diva PRO ISA",      0x0031,  0x0100,
+               IDI_ADAPTER_DIVA, FAMILY_DIVA, DI_V1x0 | DI_FAX3 | DI_MODEM | DI_CODEC,
+               CARD_PRO,   CARD_I_NONE, BUS_ISA, CHIP_DSP,
+               1, 2,  0,   8,      0
+       },
+       { /*  4  */
+               "Diva PRO PC-Card",     0x0000,  0x0100,
+               IDI_ADAPTER_DIVA, FAMILY_DIVA, DI_V1x0 | DI_FAX3 | DI_MODEM,
+               CARD_PRO,   CARD_I_NONE, BUS_PCM, CHIP_DSP,
+               1, 2,   0,   8,      0
+       },
+       { /*  5  */
+               "Diva PICCOLA ISA",     0x0051,  0x0100,
+               IDI_ADAPTER_DIVA, FAMILY_DIVA, DI_V120 | SOFT_DSP_ADD_FEATURES,
+               CARD_PICO,   CARD_I_NONE, BUS_ISA, CHIP_HSCX,
+               1, 2,   0,   8,      0
+       },
+       { /*  6  */
+               "Diva PICCOLA PCM",     0x0000,  0x0100,
+               IDI_ADAPTER_DIVA, FAMILY_DIVA, DI_V120 | SOFT_DSP_ADD_FEATURES,
+               CARD_PICO,   CARD_I_NONE, BUS_PCM, CHIP_HSCX,
+               1, 2,   0,   8,      0
+       },
+       { /*  7  */
+               "Diva PRO 2.0 S/T PCI",    0xe001,  0x0200,
+               IDI_ADAPTER_DIVA, FAMILY_DIVA, DI_V1x0 | DI_FAX3 | DI_MODEM | DI_POTS,
+               CARD_PRO,   CARD_I_NONE, BUS_PCI, CHIP_DSP,
+               1, 2,   0,   8,      0
+       },
+       { /*  8  */
+               "Diva 2.0 S/T PCI",     0xe002,  0x0200,
+               IDI_ADAPTER_DIVA, FAMILY_DIVA, DI_V120 | DI_POTS | SOFT_DSP_ADD_FEATURES,
+               CARD_PICO,   CARD_I_NONE, BUS_PCI, CHIP_HSCX,
+               1, 2,   0,   8,      0
+       },
+       { /*  9  */
+               "QUADRO ISA",      0x0000,  0x0100,
+               IDI_ADAPTER_S,  FAMILY_S,  DI_NULL,
+               CARD_QUAD,   CARD_I_QUAD, BUS_ISA, CHIP_NONE,
+               4, 2,   16,  0,  0x800
+       },
+       { /* 10  */
+               "S ISA",       0x0000,  0x0100,
+               IDI_ADAPTER_S,  FAMILY_S,  DI_CODEC,
+               CARD_S,    CARD_I_S,  BUS_ISA, CHIP_NONE,
+               1, 1,   16,  0,  0x800
+       },
+       { /* 11  */
+               "S MCA",       0x6a93,  0x0100,
+               IDI_ADAPTER_S,  FAMILY_S,  DI_CODEC,
+               CARD_S,    CARD_I_S,  BUS_MCA, CHIP_NONE,
+               1, 1,   16,  16,  0x400
+       },
+       { /* 12 */
+               "SX ISA",       0x0000,  0x0100,
+               IDI_ADAPTER_S,  FAMILY_S,  DI_NULL,
+               CARD_SX,   CARD_I_SX,  BUS_ISA, CHIP_NONE,
+               1, 2,  16,  0,  0x800
+       },
+       { /* 13 */
+               "SX MCA",       0x6a93,  0x0100,
+               IDI_ADAPTER_S,  FAMILY_S,  DI_NULL,
+               CARD_SX,   CARD_I_SX,  BUS_MCA, CHIP_NONE,
+               1, 2,  16,  16,  0x400
+       },
+       { /* 14 */
+               "SXN ISA",       0x0000,  0x0100,
+               IDI_ADAPTER_S,  FAMILY_S,  DI_NULL,
+               CARD_SXN,   CARD_I_SCOM, BUS_ISA, CHIP_NONE,
+               1, 2,   16,  0,   0x800
+       },
+       { /* 15 */
+               "SXN MCA",       0x6a93,  0x0100,
+               IDI_ADAPTER_S,  FAMILY_S,  DI_NULL,
+               CARD_SXN,   CARD_I_SCOM, BUS_MCA, CHIP_NONE,
+               1, 2,  16,  16,  0x400
+       },
+       { /* 16 */
+               "SCOM ISA",       0x0000,  0x0100,
+               IDI_ADAPTER_S,  FAMILY_S,  DI_CODEC,
+               CARD_SCOM,   CARD_I_SCOM, BUS_ISA, CHIP_NONE,
+               1, 2,   16,  0,   0x800
+       },
+       { /* 17 */
+               "SCOM MCA",       0x6a93,  0x0100,
+               IDI_ADAPTER_S,  FAMILY_S,  DI_CODEC,
+               CARD_SCOM,   CARD_I_SCOM, BUS_MCA, CHIP_NONE,
+               1, 2,  16,  16,  0x400
+       },
+       { /* 18 */
+               "S2M ISA",       0x0000,  0x0100,
+               IDI_ADAPTER_PR,  FAMILY_S,  DI_NULL,
+               CARD_PR,   CARD_I_PR,  BUS_ISA, CHIP_NONE,
+               1, 30,  256, 0,   0x4000
+       },
+       { /* 19 */
+               "S2M MCA",       0x6abb,  0x0100,
+               IDI_ADAPTER_PR,  FAMILY_S,  DI_NULL,
+               CARD_PR,   CARD_I_PR,  BUS_MCA, CHIP_NONE,
+               1, 30,  256, 16,  0x4000
+       },
+       { /* 20 */
+               "Diva Server BRI-2M ISA",   0x0041,  0x0100,
+               IDI_ADAPTER_MAESTRA, FAMILY_MAESTRA, DI_V1x0 | DI_FAX3 | DI_MODEM,
+               CARD_MAE,   CARD_I_NONE, BUS_ISA, CHIP_DSP,
+               1, 2,   16,  8,  0
+       },
+       { /* 21 */
+               "Diva Server BRI-2M PCI",   0xE010,  0x0100,
+               IDI_ADAPTER_MAESTRA, FAMILY_MAESTRA, DI_V1x0 | DI_FAX3 | DI_MODEM,
+               CARD_MAE,   CARD_I_NONE, BUS_PCI, CHIP_DSP,
+               1, 2,   16,  8,   0
+       },
+       { /* 22 */
+               "Diva Server 4BRI-8M PCI",   0xE012,  0x0100,
+               IDI_ADAPTER_MAESTRA, FAMILY_MAESTRA, DI_V1x0 | DI_FAX3 | DI_MODEM,
+               CARD_MAEQ,   CARD_I_NONE, BUS_PCI, CHIP_DSP,
+               4, 2,   16,  8,   0
+       },
+       { /* 23 */
+               "Diva Server PRI-30M PCI",   0xE014,  0x0100,
+               IDI_ADAPTER_MAESTRA, FAMILY_MAESTRA, DI_V1x0 | DI_FAX3 | DI_MODEM,
+               CARD_MAEP,   CARD_I_NONE, BUS_PCI, CHIP_DSP,
+               1, 30,  256,  8,   0
+       },
+       { /* 24 */
+               "Diva Server PRI-2M PCI",   0xe014,  0x0100,
+               IDI_ADAPTER_MAESTRA, FAMILY_MAESTRA, DI_V1x0 | DI_FAX3 | DI_MODEM,
+               CARD_MAEP,   CARD_I_NONE, BUS_PCI, CHIP_DSP,
+               1, 30,  256,  8,   0
+       },
+       { /* 25 */
+               "Diva Server PRI-9M PCI",   0x0000,  0x0100,
+               IDI_ADAPTER_MAESTRA, FAMILY_MAESTRA, DI_V1x0 | DI_FAX3 | DI_MODEM,
+               CARD_MAEP,   CARD_I_NONE, BUS_PCI, CHIP_DSP,
+               1, 30,     256,  8,   0
+       },
+       { /* 26 */
+               "Diva 2.0 S/T ISA",     0x0071,  0x0200,
+               IDI_ADAPTER_DIVA, FAMILY_DIVA, DI_V120 | DI_POTS | SOFT_DSP_ADD_FEATURES,
+               CARD_PICO,   CARD_I_NONE, BUS_ISA, CHIP_HSCX,
+               1, 2,  0,   8,   0
+       },
+       { /* 27 */
+               "Diva 2.0 U ISA",     0x0091,  0x0200,
+               IDI_ADAPTER_DIVA, FAMILY_DIVA, DI_V120 | DI_POTS | SOFT_DSP_ADD_FEATURES,
+               CARD_PICO,   CARD_I_NONE, BUS_ISA, CHIP_HSCX,
+               1, 2,   0,   8,   0
+       },
+       { /* 28 */
+               "Diva 2.0 U PCI",     0xe004,  0x0200,
+               IDI_ADAPTER_DIVA, FAMILY_DIVA, DI_V120 | DI_POTS | SOFT_DSP_ADD_FEATURES,
+               CARD_PICO,   CARD_I_NONE, BUS_PCI, CHIP_HSCX,
+               1, 2,   0,   8,   0
+       },
+       { /* 29 */
+               "Diva PRO 2.0 S/T ISA",    0x0061,  0x0200,
+               IDI_ADAPTER_DIVA, FAMILY_DIVA, DI_V1x0 | DI_FAX3 | DI_MODEM | DI_POTS,
+               CARD_PRO,   CARD_I_NONE, BUS_ISA, CHIP_DSP,
+               1, 2,  0,   8,   0
+       },
+       { /* 30 */
+               "Diva PRO 2.0 U ISA",    0x0081,  0x0200,
+               IDI_ADAPTER_DIVA, FAMILY_DIVA, DI_V1x0 | DI_FAX3 | DI_MODEM | DI_POTS,
+               CARD_PRO,   CARD_I_NONE, BUS_ISA, CHIP_DSP,
+               1, 2,  0,   8,   0
+       },
+       { /* 31 */
+               "Diva PRO 2.0 U PCI",    0xe003,  0x0200,
+               IDI_ADAPTER_DIVA, FAMILY_DIVA, DI_V1x0 | DI_FAX3 | DI_MODEM | DI_POTS,
+               CARD_PRO,   CARD_I_NONE, BUS_PCI, CHIP_DSP,
+               1, 2,   0,   8,   0
+       },
+       { /* 32 */
+               "Diva MOBILE",      0x0000,  0x0100,
+               IDI_ADAPTER_DIVA, FAMILY_DIVA, DI_V120 | SOFT_DSP_ADD_FEATURES,
+               CARD_PICO,   CARD_I_NONE, BUS_PCM, CHIP_HSCX,
+               1, 2,  0,   8,   0
+       },
+       { /* 33 */
+               "TDK DFI3600",      0x0000,  0x0100,
+               IDI_ADAPTER_DIVA, FAMILY_DIVA, DI_V120 | SOFT_DSP_ADD_FEATURES,
+               CARD_PICO,   CARD_I_NONE, BUS_PCM, CHIP_HSCX,
+               1, 2,  0,   8,   0
+       },
+       { /* 34 (OEM version of 4 - "Diva PRO PC-Card") */
+               "New Media ISDN",     0x0000,  0x0100,
+               IDI_ADAPTER_DIVA, FAMILY_DIVA, DI_V1x0 | DI_FAX3 | DI_MODEM,
+               CARD_PRO,   CARD_I_NONE, BUS_PCM, CHIP_DSP,
+               1, 2,   0,   8,   0
+       },
+       { /* 35 (OEM version of 7 - "Diva PRO 2.0 S/T PCI") */
+               "BT ExLane PCI",     0xe101,  0x0200,
+               IDI_ADAPTER_DIVA, FAMILY_DIVA, DI_V1x0 | DI_FAX3 | DI_MODEM | DI_POTS,
+               CARD_PRO,   CARD_I_NONE, BUS_PCI, CHIP_DSP,
+               1, 2,   0,   8,   0
+       },
+       { /* 36 (OEM version of 29 - "Diva PRO 2.0 S/T ISA") */
+               "BT ExLane ISA",     0x1061,  0x0200,
+               IDI_ADAPTER_DIVA, FAMILY_DIVA, DI_V1x0 | DI_FAX3 | DI_MODEM | DI_POTS,
+               CARD_PRO,   CARD_I_NONE, BUS_ISA, CHIP_DSP,
+               1, 2,   0,   8,   0
+       },
+       { /* 37 */
+               "Diva 2.01 S/T ISA",    0x00A1,  0x0300,
+               IDI_ADAPTER_DIVA, FAMILY_DIVA, DI_V120 | SOFT_DSP_ADD_FEATURES,
+               CARD_DIVALOW,  CARD_I_NONE, BUS_ISA, CHIP_IPAC,
+               1, 2,   0,   8,      0
+       },
+       { /* 38 */
+               "Diva 2.01 U ISA",     0x00B1,  0x0300,
+               IDI_ADAPTER_DIVA, FAMILY_DIVA, DI_V120 | SOFT_DSP_ADD_FEATURES,
+               CARD_DIVALOW,  CARD_I_NONE, BUS_ISA, CHIP_IPAC,
+               1, 2,   0,   8,      0
+       },
+       { /* 39 */
+               "Diva 2.01 S/T PCI",    0xe005,  0x0300,
+               IDI_ADAPTER_DIVA, FAMILY_DIVA, DI_V120 | SOFT_DSP_ADD_FEATURES,
+               CARD_DIVALOW,  CARD_I_NONE, BUS_PCI, CHIP_IPAC,
+               1, 2,   0,   8,   0
+       },
+       { /* 40        no ID yet */
+               "Diva 2.01 U PCI",     0x0000,  0x0300,
+               IDI_ADAPTER_DIVA, FAMILY_DIVA, DI_V120 | SOFT_DSP_ADD_FEATURES,
+               CARD_DIVALOW,  CARD_I_NONE, BUS_PCI, CHIP_IPAC,
+               1, 2,   0,   8,   0
+       },
+       { /* 41 */
+               "Diva MOBILE V.90",     0x0000,  0x0100,
+               IDI_ADAPTER_DIVA, FAMILY_DIVA, DI_V120 | SOFT_DSP_ADD_FEATURES,
+               CARD_PICO,   CARD_I_NONE, BUS_PCM, CHIP_HSCX,
+               1, 2,  0,   8,   0
+       },
+       { /* 42 */
+               "TDK DFI3600 V.90",     0x0000,  0x0100,
+               IDI_ADAPTER_DIVA, FAMILY_DIVA, DI_V120 | SOFT_DSP_ADD_FEATURES,
+               CARD_PICO,   CARD_I_NONE, BUS_PCM, CHIP_HSCX,
+               1, 2,  0,   8,   0
+       },
+       { /* 43 */
+               "Diva Server PRI-23M PCI",   0xe014,  0x0100,
+               IDI_ADAPTER_MAESTRA, FAMILY_MAESTRA, DI_V1x0 | DI_FAX3 | DI_MODEM,
+               CARD_MAEP,   CARD_I_NONE, BUS_PCI, CHIP_DSP,
+               1, 30,  256,  8,   0
+       },
+       { /* 44 */
+               "Diva 2.01 S/T USB",    0x1000,     0x0300,
+               IDI_ADAPTER_DIVA   , FAMILY_DIVA, DI_V120 | SOFT_DSP_ADD_FEATURES,
+               CARD_DIVALOW,  CARD_I_NONE, BUS_USB, CHIP_IPAC,
+               1,  2,  0,  8,   0
+       },
+       { /* 45 */
+               "Diva CT S/T PCI",    0xe006,  0x0300,
+               IDI_ADAPTER_DIVA   , FAMILY_DIVA, DI_V1x0 | DI_FAX3 | DI_MODEM | DI_CODEC,
+               CARD_CT,       CARD_I_NONE, BUS_PCI, CHIP_DSP,
+               1,  2,  0,  0,   0
+       },
+       { /* 46 */
+               "Diva CT U PCI",     0xe007,  0x0300,
+               IDI_ADAPTER_DIVA   , FAMILY_DIVA, DI_V1x0 | DI_FAX3 | DI_MODEM | DI_CODEC,
+               CARD_CT,       CARD_I_NONE, BUS_PCI, CHIP_DSP,
+               1,  2,  0,  0,   0
+       },
+       { /* 47 */
+               "Diva CT Lite S/T PCI",   0xe008,  0x0300,
+               IDI_ADAPTER_DIVA   , FAMILY_DIVA, DI_V1x0 | DI_FAX3 | DI_MODEM | DI_CODEC,
+               CARD_CT,       CARD_I_NONE, BUS_PCI, CHIP_DSP,
+               1,  2,  0,  0,   0
+       },
+       { /* 48 */
+               "Diva CT Lite U PCI",   0xe009,  0x0300,
+               IDI_ADAPTER_DIVA   , FAMILY_DIVA, DI_V1x0 | DI_FAX3 | DI_MODEM | DI_CODEC,
+               CARD_CT,       CARD_I_NONE, BUS_PCI, CHIP_DSP,
+               1,  2,  0,  0,   0
+       },
+       { /* 49 */
+               "Diva ISDN+V.90 PC Card", 0x8D8C, 0x0100,
+               IDI_ADAPTER_DIVA, FAMILY_DIVA, DI_V1x0 | DI_FAX3 | DI_MODEM | DI_CODEC,
+               CARD_DIVALOW, CARD_I_NONE, BUS_PCM, CHIP_IPAC,
+               1, 2,  0,   8,   0
+       },
+       { /* 50 */
+               "Diva ISDN+V.90 PCI",    0xe00A,  0x0100,
+               IDI_ADAPTER_DIVA, FAMILY_DIVA, DI_V120  | SOFT_DSP_ADD_FEATURES,
+               CARD_DIVALOW,  CARD_I_NONE, BUS_PCI, CHIP_IPAC,
+               1, 2,   0,   8,   0
+       },
+       { /* 51 (DivaTA)      no ID */
+               "Diva TA",       0x0000,  0x0300,
+               IDI_ADAPTER_DIVA, FAMILY_DIVA, DI_V110 | DI_FAX3 | SOFT_DSP_ADD_FEATURES,
+               CARD_DIVATA,  CARD_I_NONE, BUS_COM, CHIP_EXTERN,
+               1, 1,   0,   8,   0
+       },
+       { /* 52 (Diva Server 4BRI-8M PCI adapter enabled for Voice) */
+               "Diva Server Voice 4BRI-8M PCI", 0xE016,  0x0100,
+               IDI_ADAPTER_MAESTRA, FAMILY_MAESTRA, DI_V1x0 | DI_FAX3 | DI_MODEM | DI_VOICE_OVER_IP,
+               CARD_MAEQ,   CARD_I_NONE, BUS_PCI, CHIP_DSP,
+               4, 2,   16,  8,   0
+       },
+       { /* 53 (Diva Server 4BRI 2.0 adapter) */
+               "Diva Server 4BRI-8M 2.0 PCI",  0xE013,  0x0200,
+               IDI_ADAPTER_MAESTRA, FAMILY_MAESTRA, DI_V1x0 | DI_FAX3 | DI_MODEM,
+               CARD_MAEQ,   CARD_I_NONE, BUS_PCI, CHIP_DSP,
+               4, 2,   16,  8,   0
+       },
+       { /* 54 (Diva Server PRI 2.0 adapter) */
+               "Diva Server PRI 2.0 PCI",   0xE015,  0x0200,
+               IDI_ADAPTER_MAESTRA, FAMILY_MAESTRA, DI_V1x0 | DI_FAX3 | DI_MODEM,
+               CARD_MAEP,   CARD_I_NONE, BUS_PCI, CHIP_DSP,
+               1, 30,  256,  8,   0
+       },
+       { /* 55 (Diva Server 4BRI-8M 2.0 PCI adapter enabled for Voice) */
+               "Diva Server Voice 4BRI-8M 2.0 PCI", 0xE017,  0x0200,
+               IDI_ADAPTER_MAESTRA, FAMILY_MAESTRA, DI_V1x0 | DI_FAX3 | DI_MODEM | DI_VOICE_OVER_IP,
+               CARD_MAEQ,   CARD_I_NONE, BUS_PCI, CHIP_DSP,
+               4, 2,   16,  8,   0
+       },
+       { /* 56 (Diva Server PRI 2.0 PCI adapter enabled for Voice) */
+               "Diva Server Voice PRI 2.0 PCI",  0xE019,  0x0200,
+               IDI_ADAPTER_MAESTRA, FAMILY_MAESTRA, DI_V1x0 | DI_FAX3 | DI_MODEM | DI_VOICE_OVER_IP,
+               CARD_MAEP,   CARD_I_NONE, BUS_PCI, CHIP_DSP,
+               1, 30,  256,  8,   0
+       },
+       {
+               /* 57 (DivaLan )      no ID */
+               "Diva LAN",       0x0000,  0x0300,
+               IDI_ADAPTER_DIVA, FAMILY_DIVA, DI_V110 | DI_FAX3 | SOFT_DSP_ADD_FEATURES,
+               CARD_DIVALAN,  CARD_I_NONE, BUS_LAN, CHIP_EXTERN,
+               1, 1,   0,   8,   0
+       },
+       { /* 58 */
+               "Diva 2.02 PCI S/T",    0xE00B,  0x0300,
+               IDI_ADAPTER_DIVA, FAMILY_DIVA, DI_V120 | SOFT_DSP_ADD_FEATURES | DI_SOFT_V110,
+               CARD_DIVALOW,  CARD_I_NONE, BUS_PCI, CHIP_IPACX,
+               1, 2,   0,   8,   0
+       },
+       { /* 59 */
+               "Diva 2.02 PCI U",     0xE00C,  0x0300,
+               IDI_ADAPTER_DIVA, FAMILY_DIVA, DI_V120 | SOFT_DSP_ADD_FEATURES,
+               CARD_DIVALOW,  CARD_I_NONE, BUS_PCI, CHIP_IPACX,
+               1, 2,   0,   8,   0
+       },
+       { /* 60 */
+               "Diva Server BRI-2M 2.0 PCI",     0xE018,  0x0200,
+               IDI_ADAPTER_MAESTRA, FAMILY_MAESTRA, DI_V1x0 | DI_FAX3 | DI_MODEM,
+               CARD_MAE2,   CARD_I_NONE, BUS_PCI, CHIP_DSP,
+               1, 2,   16,  8,   0
+       },
+       { /* 61  (the previous name was Diva Server BRI-2F 2.0 PCI) */
+               "Diva Server 2FX",                      0xE01A,     0x0200,
+               IDI_ADAPTER_MAESTRA, FAMILY_MAESTRA, DI_V1x0 | DI_FAX3 | DI_MODEM | DI_SOFT_V110,
+               CARD_MAE2,          CARD_I_NONE,    BUS_PCI,    CHIP_IPACX,
+               1,  2,      16,     8,   0
+       },
+       { /* 62 */
+               " Diva ISDN USB 2.0",    0x1003,     0x0300,
+               IDI_ADAPTER_DIVA   , FAMILY_DIVA, DI_V120 | SOFT_DSP_ADD_FEATURES,
+               CARD_DIVALOW,  CARD_I_NONE, BUS_USB, CHIP_IPACX,
+               1, 2,  0,  8,   0
+       },
+       { /* 63 (Diva Server BRI-2M 2.0 PCI adapter enabled for Voice) */
+               "Diva Server Voice BRI-2M 2.0 PCI", 0xE01B,  0x0200,
+               IDI_ADAPTER_MAESTRA, FAMILY_MAESTRA, DI_V1x0 | DI_FAX3 | DI_MODEM | DI_VOICE_OVER_IP,
+               CARD_MAE2,   CARD_I_NONE, BUS_PCI, CHIP_DSP,
+               1, 2,   16,  8,   0
+       },
+       { /* 64 */
+               "Diva Pro 3.0 PCI",    0xe00d,  0x0300,
+               IDI_ADAPTER_DIVA   , FAMILY_DIVA, DI_V1x0 | DI_FAX3 | DI_MODEM,
+               CARD_PRO,       CARD_I_NONE, BUS_PCI, CHIP_DSP,
+               1,  2,  0,  0,   0
+       },
+       { /* 65 */
+               "Diva ISDN + CT 2.0",    0xE00E,  0x0300,
+               IDI_ADAPTER_DIVA   , FAMILY_DIVA, DI_V1x0 | DI_FAX3 | DI_MODEM | DI_CODEC,
+               CARD_CT,       CARD_I_NONE, BUS_PCI, CHIP_DSP,
+               1,  2,  0,  0,   0
+       },
+       { /* 66 */
+               "Diva Mobile V.90 PC Card",  0x8331,  0x0100,
+               IDI_ADAPTER_DIVA, FAMILY_DIVA, DI_V120 | SOFT_DSP_ADD_FEATURES,
+               CARD_PICO,   CARD_I_NONE, BUS_PCM, CHIP_IPACX,
+               1, 2,  0,   8,   0
+       },
+       { /* 67 */
+               "Diva ISDN PC Card",  0x8311,  0x0100,
+               IDI_ADAPTER_DIVA, FAMILY_DIVA, DI_V120 | SOFT_DSP_ADD_FEATURES,
+               CARD_PICO,   CARD_I_NONE, BUS_PCM, CHIP_IPACX,
+               1, 2,  0,   8,   0
+       },
+       { /* 68 */
+               "Diva ISDN PC Card",  0x0000,  0x0100,
+               IDI_ADAPTER_DIVA, FAMILY_DIVA, DI_V120 | SOFT_DSP_ADD_FEATURES,
+               CARD_PRO,   CARD_I_NONE, BUS_PCM, CHIP_DSP,
+               1, 2,   0,   8,      0
+       },
+};
 #if CARDTYPE_H_WANT_RESOURCE_DATA
 /*--- CardResource [Index=CARDTYPE_....]   ---------------------------(GEI)-*/
-CARD_RESOURCE CardResource [ ] =  {
+CARD_RESOURCE CardResource[] = {
 /*   Interrupts     IO-Address   Mem-Address */
-/* 0*/ {  3,4,9,0,0,0,0,0,0,0,   0x200,0x20,16,   0x0,0x0,0   }, // DIVA MCA
-/* 1*/ {  3,4,9,10,11,12,0,0,0,0,  0x200,0x20,16,   0x0,0x0,0   }, // DIVA ISA
-/* 2*/ {  3,4,5,7,9,10,11,12,14,15, 0x0,0x8,8192,  0x0,0x0,0   }, // DIVA PCMCIA
-/* 3*/ {  3,5,7,9,10,11,12,14,15,0, 0x200,0x20,16,   0x0,0x0,0   }, // DIVA PRO ISA
-/* 4*/ {  3,4,5,7,9,10,11,12,14,15, 0x0,0x8,8192,  0x0,0x0,0   }, // DIVA PRO PCMCIA
-/* 5*/ {  3,5,7,9,10,11,12,14,15,0, 0x200,0x20,16,  0x0,0x0,0   }, // DIVA PICCOLA ISA
-/* 6*/ {  0,0,0,0,0,0,0,0,0,0,  0x0,0x0,0,   0x0,0x0,0   }, // DIVA PICCOLA PCMCIA
-/* 7*/ {  3,4,5,7,9,10,11,12,14,15, 0x0,0x8,8192,  0x0,0x0,0   }, // DIVA PRO 2.0 PCI
-/* 8*/ {  3,4,5,7,9,10,11,12,14,15, 0x0,0x8,8192,  0x0,0x0,0   }, // DIVA 2.0 PCI
-/* 9*/ {  3,4,5,7,9,10,11,12,0,0,  0x0,0x0,0,   0x80000,0x2000,64 }, // QUADRO ISA
-/*10*/ {  3,4,9,10,11,12,0,0,0,0,  0x0,0x0,0,   0xc0000,0x2000,16 }, // S ISA
-/*11*/ {  3,4,9,0,0,0,0,0,0,0,  0xc00,0x10,16,  0xc0000,0x2000,16 }, // S MCA
-/*12*/ {  3,4,9,10,11,12,0,0,0,0,  0x0,0x0,0,   0xc0000,0x2000,16 }, // SX ISA
-/*13*/ {  3,4,9,0,0,0,0,0,0,0,  0xc00,0x10,16,  0xc0000,0x2000,16 }, // SX MCA
-/*14*/ {  3,4,5,7,9,10,11,12,0,0,  0x0,0x0,0,   0x80000,0x0800,256 }, // SXN ISA
-/*15*/ {  3,4,9,0,0,0,0,0,0,0,  0xc00,0x10,16,  0xc0000,0x2000,16 }, // SXN MCA
-/*16*/ {  3,4,5,7,9,10,11,12,0,0,  0x0,0x0,0,   0x80000,0x0800,256 }, // SCOM ISA
-/*17*/ {  3,4,9,0,0,0,0,0,0,0,  0xc00,0x10,16,  0xc0000,0x2000,16 }, // SCOM MCA
-/*18*/ {  3,4,5,7,9,10,11,12,0,0,  0x0,0x0,0,   0xc0000,0x4000,16 }, // S2M ISA
-/*19*/ {  3,4,9,0,0,0,0,0,0,0,  0xc00,0x10,16,  0xc0000,0x4000,16 }, // S2M MCA
-/*20*/ {  3,5,7,9,10,11,12,14,15,0, 0x200,0x20,16,  0x0,0x0,0   }, // MAESTRA ISA
-/*21*/ {  3,4,5,7,9,10,11,12,14,15, 0x0,0x8,8192,  0x0,0x0,0   }, // MAESTRA PCI
-/*22*/ {  3,5,7,9,10,11,12,14,15,0, 0x200,0x20,16,  0x0,0x0,0   }, // MAESTRA QUADRO ISA
-/*23*/ {  3,4,5,7,9,10,11,12,14,15, 0x0,0x20,2048,  0x0,0x0,0   }, // MAESTRA QUADRO PCI
-/*24*/ {  3,5,7,9,10,11,12,14,15,0, 0x200,0x20,16,  0x0,0x0,0   }, // MAESTRA PRIMARY ISA
-/*25*/ {  3,4,5,7,9,10,11,12,14,15, 0x0,0x8,8192,  0x0,0x0,0   }, // MAESTRA PRIMARY PCI
-/*26*/ {  3,5,7,9,10,11,12,14,15,0, 0x200,0x20,16,  0x0,0x0,0   }, // DIVA 2.0 ISA
-/*27*/ {  3,5,7,9,10,11,12,14,15,0, 0x200,0x20,16,  0x0,0x0,0   }, // DIVA 2.0 /U ISA
-/*28*/ {  3,4,5,7,9,10,11,12,14,15, 0x0,0x8,8192,  0x0,0x0,0   }, // DIVA 2.0 /U PCI
-/*29*/ {  3,5,7,9,10,11,12,14,15,0, 0x200,0x20,16,   0x0,0x0,0   }, // DIVA PRO 2.0 ISA
-/*30*/ {  3,5,7,9,10,11,12,14,15,0, 0x200,0x20,16,   0x0,0x0,0   }, // DIVA PRO 2.0 /U ISA
-/*31*/ {  3,4,5,7,9,10,11,12,14,15, 0x0,0x8,8192,  0x0,0x0,0   }, // DIVA PRO 2.0 /U PCI
-/*32*/ {  0,0,0,0,0,0,0,0,0,0,  0x0,0x0,0,   0x0,0x0,0   }, // DIVA MOBILE
-/*33*/ {  0,0,0,0,0,0,0,0,0,0,  0x0,0x0,0,   0x0,0x0,0   }, // TDK DFI3600 (same as DIVA MOBILE [32])
-/*34*/ {  3,4,5,7,9,10,11,12,14,15, 0x0,0x8,8192,  0x0,0x0,0   }, // New Media ISDN (same as DIVA PRO PCMCIA [4])
-/*35*/ {  3,4,5,7,9,10,11,12,14,15, 0x0,0x8,8192,  0x0,0x0,0   }, // BT ExLane PCI (same as DIVA PRO 2.0 PCI [7])
-/*36*/ {  3,5,7,9,10,11,12,14,15,0, 0x200,0x20,16,   0x0,0x0,0   }, // BT ExLane ISA (same as DIVA PRO 2.0 ISA [29])
-/*37*/ {  3,5,7,9,10,11,12,14,15,0, 0x200,0x20,16,  0x0,0x0,0   }, // DIVA 2.01 S/T ISA
-/*38*/ {  3,5,7,9,10,11,12,14,15,0, 0x200,0x20,16,  0x0,0x0,0   }, // DIVA 2.01 U ISA
-/*39*/ {  3,4,5,7,9,10,11,12,14,15, 0x0,0x8,8192,  0x0,0x0,0   }, // DIVA 2.01 S/T PCI
-/*40*/ {  3,4,5,7,9,10,11,12,14,15, 0x0,0x8,8192,  0x0,0x0,0   }, // DIVA 2.01 U PCI
-/*41*/ {  0,0,0,0,0,0,0,0,0,0,  0x0,0x0,0,   0x0,0x0,0   }, // DIVA MOBILE V.90
-/*42*/ {  0,0,0,0,0,0,0,0,0,0,  0x0,0x0,0,   0x0,0x0,0   }, // TDK DFI3600 V.90 (same as DIVA MOBILE V.90 [39])
-/*43*/ {  3,4,5,7,9,10,11,12,14,15, 0x0,0x20,2048,  0x0,0x0,0   }, // DIVA Server PRI-23M PCI
-/*44*/ {  0,0,0,0,0,0,0,0,0,0,  0x0,0x0,0,   0x0,0x0,0   }, // DIVA 2.01 S/T USB
-/*45*/ {  0,0,0,0,0,0,0,0,0,0,  0x0,0x0,0,   0x0,0x0,0   }, // DIVA CT S/T PCI
-/*46*/ {  0,0,0,0,0,0,0,0,0,0,  0x0,0x0,0,   0x0,0x0,0   }, // DIVA CT U PCI
-/*47*/ {  0,0,0,0,0,0,0,0,0,0,  0x0,0x0,0,   0x0,0x0,0   }, // DIVA CT Lite S/T PCI
-/*48*/ {  0,0,0,0,0,0,0,0,0,0,  0x0,0x0,0,   0x0,0x0,0   }, // DIVA CT Lite U PCI
-/*49*/ {  0,0,0,0,0,0,0,0,0,0,  0x0,0x0,0,   0x0,0x0,0   }, // DIVA ISDN+V.90 PC Card
-/*50*/ {  3,4,5,7,9,10,11,12,14,15, 0x0,0x8,8192,  0x0,0x0,0   }, // DIVA ISDN+V.90 PCI
-/*51*/ {  0,0,0,0,0,0,0,0,0,0,  0x0,0x0,0,   0x0,0x0,0   }, // DIVA TA
-/*52*/ {  3,4,5,7,9,10,11,12,14,15, 0x0,0x20,2048,  0x0,0x0,0   }, // MAESTRA VOICE QUADRO PCI
-/*53*/ {  3,4,5,7,9,10,11,12,14,15, 0x0,0x20,2048,  0x0,0x0,0   }, // MAESTRA VOICE QUADRO PCI
-/*54*/ {  3,4,5,7,9,10,11,12,14,15, 0x0,0x8,8192,  0x0,0x0,0   }, // MAESTRA VOICE PRIMARY PCI
-/*55*/ {  3,4,5,7,9,10,11,12,14,15, 0x0,0x20,2048,  0x0,0x0,0   }, // MAESTRA VOICE QUADRO PCI
-/*56*/ {  3,4,5,7,9,10,11,12,14,15, 0x0,0x8,8192,  0x0,0x0,0   }, // MAESTRA VOICE PRIMARY PCI
-/*57*/ {  0,0,0,0,0,0,0,0,0,0,  0x0,0x0,0,   0x0,0x0,0   }, // DIVA LAN
-/*58*/ {  3,4,5,7,9,10,11,12,14,15, 0x0,0x8,8192,  0x0,0x0,0   }, // DIVA 2.02 S/T PCI
-/*59*/ {  3,4,5,7,9,10,11,12,14,15, 0x0,0x8,8192,  0x0,0x0,0   }, // DIVA 2.02 U PCI
-/*60*/ {  0,0,0,0,0,0,0,0,0,0,  0x0,0x0,0,   0x0,0x0,0   }, // Diva Server BRI-2M 2.0 PCI
-/*61*/ {  0,0,0,0,0,0,0,0,0,0,  0x0,0x0,0,   0x0,0x0,0   }, // Diva Server BRI-2F PCI
-/*62*/ {  0,0,0,0,0,0,0,0,0,0,  0x0,0x0,0,   0x0,0x0,0   }, // DIVA 2.01 S/T USB
-/*63*/ {  0,0,0,0,0,0,0,0,0,0,  0x0,0x0,0,   0x0,0x0,0   }, // Diva Server Voice BRI-2M 2.0 PCI
-/*64*/ {  3,4,5,7,9,10,11,12,14,15, 0x0,0x8,8192,  0x0,0x0,0   }, // DIVA 3.0 PCI
-/*65*/ {  0,0,0,0,0,0,0,0,0,0,  0x0,0x0,0,   0x0,0x0,0   }, // DIVA CT S/T PCI V2.0
-/*66*/ {  0,0,0,0,0,0,0,0,0,0,  0x0,0x0,0,   0x0,0x0,0   }, // DIVA Mobile V.90 PC Card
-/*67*/ {  0,0,0,0,0,0,0,0,0,0,  0x0,0x0,0,   0x0,0x0,0   }, // DIVA ISDN PC Card
-/*68*/ {  3,4,5,7,9,10,11,12,14,15, 0x0,0x8,8192,  0x0,0x0,0   }, // DIVA ISDN PC Card
+       /* 0*/ {  3,4,9,0,0,0,0,0,0,0,   0x200,0x20,16,   0x0,0x0,0   }, // DIVA MCA
+       /* 1*/ {  3,4,9,10,11,12,0,0,0,0,  0x200,0x20,16,   0x0,0x0,0   }, // DIVA ISA
+       /* 2*/ {  3,4,5,7,9,10,11,12,14,15, 0x0,0x8,8192,  0x0,0x0,0   }, // DIVA PCMCIA
+       /* 3*/ {  3,5,7,9,10,11,12,14,15,0, 0x200,0x20,16,   0x0,0x0,0   }, // DIVA PRO ISA
+       /* 4*/ {  3,4,5,7,9,10,11,12,14,15, 0x0,0x8,8192,  0x0,0x0,0   }, // DIVA PRO PCMCIA
+       /* 5*/ {  3,5,7,9,10,11,12,14,15,0, 0x200,0x20,16,  0x0,0x0,0   }, // DIVA PICCOLA ISA
+       /* 6*/ {  0,0,0,0,0,0,0,0,0,0,  0x0,0x0,0,   0x0,0x0,0   }, // DIVA PICCOLA PCMCIA
+       /* 7*/ {  3,4,5,7,9,10,11,12,14,15, 0x0,0x8,8192,  0x0,0x0,0   }, // DIVA PRO 2.0 PCI
+       /* 8*/ {  3,4,5,7,9,10,11,12,14,15, 0x0,0x8,8192,  0x0,0x0,0   }, // DIVA 2.0 PCI
+       /* 9*/ {  3,4,5,7,9,10,11,12,0,0,  0x0,0x0,0,   0x80000,0x2000,64 }, // QUADRO ISA
+       /*10*/ {  3,4,9,10,11,12,0,0,0,0,  0x0,0x0,0,   0xc0000,0x2000,16 }, // S ISA
+       /*11*/ {  3,4,9,0,0,0,0,0,0,0,  0xc00,0x10,16,  0xc0000,0x2000,16 }, // S MCA
+       /*12*/ {  3,4,9,10,11,12,0,0,0,0,  0x0,0x0,0,   0xc0000,0x2000,16 }, // SX ISA
+       /*13*/ {  3,4,9,0,0,0,0,0,0,0,  0xc00,0x10,16,  0xc0000,0x2000,16 }, // SX MCA
+       /*14*/ {  3,4,5,7,9,10,11,12,0,0,  0x0,0x0,0,   0x80000,0x0800,256 }, // SXN ISA
+       /*15*/ {  3,4,9,0,0,0,0,0,0,0,  0xc00,0x10,16,  0xc0000,0x2000,16 }, // SXN MCA
+       /*16*/ {  3,4,5,7,9,10,11,12,0,0,  0x0,0x0,0,   0x80000,0x0800,256 }, // SCOM ISA
+       /*17*/ {  3,4,9,0,0,0,0,0,0,0,  0xc00,0x10,16,  0xc0000,0x2000,16 }, // SCOM MCA
+       /*18*/ {  3,4,5,7,9,10,11,12,0,0,  0x0,0x0,0,   0xc0000,0x4000,16 }, // S2M ISA
+       /*19*/ {  3,4,9,0,0,0,0,0,0,0,  0xc00,0x10,16,  0xc0000,0x4000,16 }, // S2M MCA
+       /*20*/ {  3,5,7,9,10,11,12,14,15,0, 0x200,0x20,16,  0x0,0x0,0   }, // MAESTRA ISA
+       /*21*/ {  3,4,5,7,9,10,11,12,14,15, 0x0,0x8,8192,  0x0,0x0,0   }, // MAESTRA PCI
+       /*22*/ {  3,5,7,9,10,11,12,14,15,0, 0x200,0x20,16,  0x0,0x0,0   }, // MAESTRA QUADRO ISA
+       /*23*/ {  3,4,5,7,9,10,11,12,14,15, 0x0,0x20,2048,  0x0,0x0,0   }, // MAESTRA QUADRO PCI
+       /*24*/ {  3,5,7,9,10,11,12,14,15,0, 0x200,0x20,16,  0x0,0x0,0   }, // MAESTRA PRIMARY ISA
+       /*25*/ {  3,4,5,7,9,10,11,12,14,15, 0x0,0x8,8192,  0x0,0x0,0   }, // MAESTRA PRIMARY PCI
+       /*26*/ {  3,5,7,9,10,11,12,14,15,0, 0x200,0x20,16,  0x0,0x0,0   }, // DIVA 2.0 ISA
+       /*27*/ {  3,5,7,9,10,11,12,14,15,0, 0x200,0x20,16,  0x0,0x0,0   }, // DIVA 2.0 /U ISA
+       /*28*/ {  3,4,5,7,9,10,11,12,14,15, 0x0,0x8,8192,  0x0,0x0,0   }, // DIVA 2.0 /U PCI
+       /*29*/ {  3,5,7,9,10,11,12,14,15,0, 0x200,0x20,16,   0x0,0x0,0   }, // DIVA PRO 2.0 ISA
+       /*30*/ {  3,5,7,9,10,11,12,14,15,0, 0x200,0x20,16,   0x0,0x0,0   }, // DIVA PRO 2.0 /U ISA
+       /*31*/ {  3,4,5,7,9,10,11,12,14,15, 0x0,0x8,8192,  0x0,0x0,0   }, // DIVA PRO 2.0 /U PCI
+       /*32*/ {  0,0,0,0,0,0,0,0,0,0,  0x0,0x0,0,   0x0,0x0,0   }, // DIVA MOBILE
+       /*33*/ {  0,0,0,0,0,0,0,0,0,0,  0x0,0x0,0,   0x0,0x0,0   }, // TDK DFI3600 (same as DIVA MOBILE [32])
+       /*34*/ {  3,4,5,7,9,10,11,12,14,15, 0x0,0x8,8192,  0x0,0x0,0   }, // New Media ISDN (same as DIVA PRO PCMCIA [4])
+       /*35*/ {  3,4,5,7,9,10,11,12,14,15, 0x0,0x8,8192,  0x0,0x0,0   }, // BT ExLane PCI (same as DIVA PRO 2.0 PCI [7])
+       /*36*/ {  3,5,7,9,10,11,12,14,15,0, 0x200,0x20,16,   0x0,0x0,0   }, // BT ExLane ISA (same as DIVA PRO 2.0 ISA [29])
+       /*37*/ {  3,5,7,9,10,11,12,14,15,0, 0x200,0x20,16,  0x0,0x0,0   }, // DIVA 2.01 S/T ISA
+       /*38*/ {  3,5,7,9,10,11,12,14,15,0, 0x200,0x20,16,  0x0,0x0,0   }, // DIVA 2.01 U ISA
+       /*39*/ {  3,4,5,7,9,10,11,12,14,15, 0x0,0x8,8192,  0x0,0x0,0   }, // DIVA 2.01 S/T PCI
+       /*40*/ {  3,4,5,7,9,10,11,12,14,15, 0x0,0x8,8192,  0x0,0x0,0   }, // DIVA 2.01 U PCI
+       /*41*/ {  0,0,0,0,0,0,0,0,0,0,  0x0,0x0,0,   0x0,0x0,0   }, // DIVA MOBILE V.90
+       /*42*/ {  0,0,0,0,0,0,0,0,0,0,  0x0,0x0,0,   0x0,0x0,0   }, // TDK DFI3600 V.90 (same as DIVA MOBILE V.90 [39])
+       /*43*/ {  3,4,5,7,9,10,11,12,14,15, 0x0,0x20,2048,  0x0,0x0,0   }, // DIVA Server PRI-23M PCI
+       /*44*/ {  0,0,0,0,0,0,0,0,0,0,  0x0,0x0,0,   0x0,0x0,0   }, // DIVA 2.01 S/T USB
+       /*45*/ {  0,0,0,0,0,0,0,0,0,0,  0x0,0x0,0,   0x0,0x0,0   }, // DIVA CT S/T PCI
+       /*46*/ {  0,0,0,0,0,0,0,0,0,0,  0x0,0x0,0,   0x0,0x0,0   }, // DIVA CT U PCI
+       /*47*/ {  0,0,0,0,0,0,0,0,0,0,  0x0,0x0,0,   0x0,0x0,0   }, // DIVA CT Lite S/T PCI
+       /*48*/ {  0,0,0,0,0,0,0,0,0,0,  0x0,0x0,0,   0x0,0x0,0   }, // DIVA CT Lite U PCI
+       /*49*/ {  0,0,0,0,0,0,0,0,0,0,  0x0,0x0,0,   0x0,0x0,0   }, // DIVA ISDN+V.90 PC Card
+       /*50*/ {  3,4,5,7,9,10,11,12,14,15, 0x0,0x8,8192,  0x0,0x0,0   }, // DIVA ISDN+V.90 PCI
+       /*51*/ {  0,0,0,0,0,0,0,0,0,0,  0x0,0x0,0,   0x0,0x0,0   }, // DIVA TA
+       /*52*/ {  3,4,5,7,9,10,11,12,14,15, 0x0,0x20,2048,  0x0,0x0,0   }, // MAESTRA VOICE QUADRO PCI
+       /*53*/ {  3,4,5,7,9,10,11,12,14,15, 0x0,0x20,2048,  0x0,0x0,0   }, // MAESTRA VOICE QUADRO PCI
+       /*54*/ {  3,4,5,7,9,10,11,12,14,15, 0x0,0x8,8192,  0x0,0x0,0   }, // MAESTRA VOICE PRIMARY PCI
+       /*55*/ {  3,4,5,7,9,10,11,12,14,15, 0x0,0x20,2048,  0x0,0x0,0   }, // MAESTRA VOICE QUADRO PCI
+       /*56*/ {  3,4,5,7,9,10,11,12,14,15, 0x0,0x8,8192,  0x0,0x0,0   }, // MAESTRA VOICE PRIMARY PCI
+       /*57*/ {  0,0,0,0,0,0,0,0,0,0,  0x0,0x0,0,   0x0,0x0,0   }, // DIVA LAN
+       /*58*/ {  3,4,5,7,9,10,11,12,14,15, 0x0,0x8,8192,  0x0,0x0,0   }, // DIVA 2.02 S/T PCI
+       /*59*/ {  3,4,5,7,9,10,11,12,14,15, 0x0,0x8,8192,  0x0,0x0,0   }, // DIVA 2.02 U PCI
+       /*60*/ {  0,0,0,0,0,0,0,0,0,0,  0x0,0x0,0,   0x0,0x0,0   }, // Diva Server BRI-2M 2.0 PCI
+       /*61*/ {  0,0,0,0,0,0,0,0,0,0,  0x0,0x0,0,   0x0,0x0,0   }, // Diva Server BRI-2F PCI
+       /*62*/ {  0,0,0,0,0,0,0,0,0,0,  0x0,0x0,0,   0x0,0x0,0   }, // DIVA 2.01 S/T USB
+       /*63*/ {  0,0,0,0,0,0,0,0,0,0,  0x0,0x0,0,   0x0,0x0,0   }, // Diva Server Voice BRI-2M 2.0 PCI
+       /*64*/ {  3,4,5,7,9,10,11,12,14,15, 0x0,0x8,8192,  0x0,0x0,0   }, // DIVA 3.0 PCI
+       /*65*/ {  0,0,0,0,0,0,0,0,0,0,  0x0,0x0,0,   0x0,0x0,0   }, // DIVA CT S/T PCI V2.0
+       /*66*/ {  0,0,0,0,0,0,0,0,0,0,  0x0,0x0,0,   0x0,0x0,0   }, // DIVA Mobile V.90 PC Card
+       /*67*/ {  0,0,0,0,0,0,0,0,0,0,  0x0,0x0,0,   0x0,0x0,0   }, // DIVA ISDN PC Card
+       /*68*/ {  3,4,5,7,9,10,11,12,14,15, 0x0,0x8,8192,  0x0,0x0,0   }, // DIVA ISDN PC Card
 };
 #endif /*CARDTYPE_H_WANT_RESOURCE_DATA*/
 #else /*!CARDTYPE_H_WANT_DATA*/
-extern CARD_PROPERTIES  CardProperties [] ;
-extern CARD_RESOURCE  CardResource [] ;
+extern CARD_PROPERTIES  CardProperties[];
+extern CARD_RESOURCE  CardResource[];
 #endif /*CARDTYPE_H_WANT_DATA*/
 /*
  * all existing download files
@@ -902,197 +902,197 @@ extern CARD_RESOURCE  CardResource [] ;
 #define CARD_D_NEW_DSP_COMBIFILE 63
 typedef struct CARD_FILES_DATA
 {
- char *    Name;
- unsigned char  Type;
+       char *Name;
+       unsigned char  Type;
 }
-CARD_FILES_DATA;
+       CARD_FILES_DATA;
 typedef struct CARD_FILES
 {
- unsigned char  Boot;
- unsigned char  Dsp  [CARD_DSP_CNT];
- unsigned char  DspTelindus;
- unsigned char  Prot [CARD_PROT_CNT];
+       unsigned char  Boot;
+       unsigned char  Dsp[CARD_DSP_CNT];
+       unsigned char  DspTelindus;
+       unsigned char  Prot[CARD_PROT_CNT];
 }
-CARD_FILES;
+       CARD_FILES;
 #if CARDTYPE_H_WANT_DATA
 #if CARDTYPE_H_WANT_FILE_DATA
-CARD_FILES_DATA CardFData [] =  {
+CARD_FILES_DATA CardFData[] = {
 // Filename   Filetype
- 0,     CARD_FT_UNKNOWN,
- "didnload.bin",  CARD_FT_B,
- "diprload.bin",  CARD_FT_B,
- "didiva.bin",  CARD_FT_D,
- "didivapp.bin",  CARD_FT_D,
- "dihscx.bin",  CARD_FT_D,
- "div110.bin",  CARD_FT_D,
- "dimodem.bin",  CARD_FT_D,
- "difax.bin",  CARD_FT_D,
- "di_etsi.bin",  CARD_FT_S,
- "di_1tr6.bin",  CARD_FT_S,
- "di_belg.bin",  CARD_FT_S,
- "di_franc.bin",  CARD_FT_S,
- "di_atel.bin",  CARD_FT_S,
- "di_ni.bin",  CARD_FT_S,
- "di_5ess.bin",  CARD_FT_S,
- "di_japan.bin",  CARD_FT_S,
- "di_etsi.sx",  CARD_FT_S,
- "di_1tr6.sx",  CARD_FT_S,
- "di_belg.sx",  CARD_FT_S,
- "di_franc.sx",  CARD_FT_S,
- "di_atel.sx",  CARD_FT_S,
- "di_ni.sx",   CARD_FT_S,
- "di_5ess.sx",  CARD_FT_S,
- "di_japan.sx",  CARD_FT_S,
- "di_etsi.sy",  CARD_FT_S,
- "di_1tr6.sy",  CARD_FT_S,
- "di_belg.sy",  CARD_FT_S,
- "di_franc.sy",  CARD_FT_S,
- "di_atel.sy",  CARD_FT_S,
- "di_ni.sy",   CARD_FT_S,
- "di_5ess.sy",  CARD_FT_S,
- "di_japan.sy",  CARD_FT_S,
- "di_etsi.sq",  CARD_FT_S,
- "di_1tr6.sq",  CARD_FT_S,
- "di_belg.sq",  CARD_FT_S,
- "di_franc.sq",  CARD_FT_S,
- "di_atel.sq",  CARD_FT_S,
- "di_ni.sq",   CARD_FT_S,
- "di_5ess.sq",  CARD_FT_S,
- "di_japan.sq",  CARD_FT_S,
- "di_etsi.p",  CARD_FT_S,
- "di_1tr6.p",  CARD_FT_S,
- "di_belg.p",  CARD_FT_S,
- "di_franc.p",  CARD_FT_S,
- "di_atel.p",  CARD_FT_S,
- "di_ni.p",   CARD_FT_S,
- "di_5ess.p",  CARD_FT_S,
- "di_japan.p",  CARD_FT_S,
- "di_etsi.sm",  CARD_FT_M,
- "di_1tr6.sm",  CARD_FT_M,
- "di_belg.sm",  CARD_FT_M,
- "di_franc.sm",  CARD_FT_M,
- "di_atel.sm",  CARD_FT_M,
- "di_ni.sm",   CARD_FT_M,
- "di_5ess.sm",  CARD_FT_M,
- "di_japan.sm",  CARD_FT_M,
- "di_swed.bin",  CARD_FT_S,
- "di_swed.sx",  CARD_FT_S,
- "di_swed.sy",  CARD_FT_S,
- "di_swed.sq",  CARD_FT_S,
- "di_swed.p",  CARD_FT_S,
- "di_swed.sm",  CARD_FT_M,
-    "didspdld.bin",     CARD_FT_NEW_DSP_COMBIFILE
+       0,     CARD_FT_UNKNOWN,
+       "didnload.bin",  CARD_FT_B,
+       "diprload.bin",  CARD_FT_B,
+       "didiva.bin",  CARD_FT_D,
+       "didivapp.bin",  CARD_FT_D,
+       "dihscx.bin",  CARD_FT_D,
+       "div110.bin",  CARD_FT_D,
+       "dimodem.bin",  CARD_FT_D,
+       "difax.bin",  CARD_FT_D,
+       "di_etsi.bin",  CARD_FT_S,
+       "di_1tr6.bin",  CARD_FT_S,
+       "di_belg.bin",  CARD_FT_S,
+       "di_franc.bin",  CARD_FT_S,
+       "di_atel.bin",  CARD_FT_S,
+       "di_ni.bin",  CARD_FT_S,
+       "di_5ess.bin",  CARD_FT_S,
+       "di_japan.bin",  CARD_FT_S,
+       "di_etsi.sx",  CARD_FT_S,
+       "di_1tr6.sx",  CARD_FT_S,
+       "di_belg.sx",  CARD_FT_S,
+       "di_franc.sx",  CARD_FT_S,
+       "di_atel.sx",  CARD_FT_S,
+       "di_ni.sx",   CARD_FT_S,
+       "di_5ess.sx",  CARD_FT_S,
+       "di_japan.sx",  CARD_FT_S,
+       "di_etsi.sy",  CARD_FT_S,
+       "di_1tr6.sy",  CARD_FT_S,
+       "di_belg.sy",  CARD_FT_S,
+       "di_franc.sy",  CARD_FT_S,
+       "di_atel.sy",  CARD_FT_S,
+       "di_ni.sy",   CARD_FT_S,
+       "di_5ess.sy",  CARD_FT_S,
+       "di_japan.sy",  CARD_FT_S,
+       "di_etsi.sq",  CARD_FT_S,
+       "di_1tr6.sq",  CARD_FT_S,
+       "di_belg.sq",  CARD_FT_S,
+       "di_franc.sq",  CARD_FT_S,
+       "di_atel.sq",  CARD_FT_S,
+       "di_ni.sq",   CARD_FT_S,
+       "di_5ess.sq",  CARD_FT_S,
+       "di_japan.sq",  CARD_FT_S,
+       "di_etsi.p",  CARD_FT_S,
+       "di_1tr6.p",  CARD_FT_S,
+       "di_belg.p",  CARD_FT_S,
+       "di_franc.p",  CARD_FT_S,
+       "di_atel.p",  CARD_FT_S,
+       "di_ni.p",   CARD_FT_S,
+       "di_5ess.p",  CARD_FT_S,
+       "di_japan.p",  CARD_FT_S,
+       "di_etsi.sm",  CARD_FT_M,
+       "di_1tr6.sm",  CARD_FT_M,
+       "di_belg.sm",  CARD_FT_M,
+       "di_franc.sm",  CARD_FT_M,
+       "di_atel.sm",  CARD_FT_M,
+       "di_ni.sm",   CARD_FT_M,
+       "di_5ess.sm",  CARD_FT_M,
+       "di_japan.sm",  CARD_FT_M,
+       "di_swed.bin",  CARD_FT_S,
+       "di_swed.sx",  CARD_FT_S,
+       "di_swed.sy",  CARD_FT_S,
+       "di_swed.sq",  CARD_FT_S,
+       "di_swed.p",  CARD_FT_S,
+       "di_swed.sm",  CARD_FT_M,
+       "didspdld.bin",     CARD_FT_NEW_DSP_COMBIFILE
 };
-CARD_FILES CardFiles [] =
+CARD_FILES CardFiles[] =
 {
- { /* CARD_UNKNOWN */
-  CARD_FILE_NONE,
-  CARD_FILE_NONE, CARD_FILE_NONE, CARD_FILE_NONE, CARD_FILE_NONE, CARD_FILE_NONE,
-  CARD_FILE_NONE,
-  CARD_FILE_NONE, CARD_FILE_NONE, CARD_FILE_NONE, CARD_FILE_NONE,
-  CARD_FILE_NONE, CARD_FILE_NONE, CARD_FILE_NONE, CARD_FILE_NONE,
-  CARD_FILE_NONE
- },
- { /* CARD_DIVA */
-  CARD_FILE_NONE,
-  CARD_D_K1, CARD_D_H, CARD_D_V, CARD_FILE_NONE, CARD_D_F,
-  CARD_D_NEW_DSP_COMBIFILE,
-  CARD_FILE_NONE, CARD_FILE_NONE, CARD_FILE_NONE, CARD_FILE_NONE,
-  CARD_FILE_NONE, CARD_FILE_NONE, CARD_FILE_NONE, CARD_FILE_NONE,
-  CARD_FILE_NONE
- },
- { /* CARD_PRO  */
-  CARD_FILE_NONE,
-  CARD_D_K2, CARD_D_H, CARD_D_V, CARD_D_M, CARD_D_F,
-  CARD_D_NEW_DSP_COMBIFILE,
-  CARD_FILE_NONE, CARD_FILE_NONE, CARD_FILE_NONE, CARD_FILE_NONE,
-  CARD_FILE_NONE, CARD_FILE_NONE, CARD_FILE_NONE, CARD_FILE_NONE,
-  CARD_FILE_NONE
- },
- { /* CARD_PICO */
-  CARD_FILE_NONE,
-  CARD_FILE_NONE, CARD_FILE_NONE, CARD_FILE_NONE, CARD_FILE_NONE, CARD_FILE_NONE,
-  CARD_FILE_NONE,
-  CARD_FILE_NONE, CARD_FILE_NONE, CARD_FILE_NONE, CARD_FILE_NONE,
-  CARD_FILE_NONE, CARD_FILE_NONE, CARD_FILE_NONE, CARD_FILE_NONE,
-  CARD_FILE_NONE
- },
- { /* CARD_S    */
-  CARD_B_S,
-  CARD_FILE_NONE, CARD_FILE_NONE, CARD_FILE_NONE, CARD_FILE_NONE, CARD_FILE_NONE,
-  CARD_FILE_NONE,
-  CARD_P_S_E, CARD_P_S_1, CARD_P_S_B, CARD_P_S_F,
-  CARD_P_S_A, CARD_P_S_N, CARD_P_S_5, CARD_P_S_J,
-  CARD_P_S_S
- },
- { /* CARD_SX   */
-  CARD_B_S,
-  CARD_FILE_NONE, CARD_FILE_NONE, CARD_FILE_NONE, CARD_FILE_NONE, CARD_FILE_NONE,
-  CARD_FILE_NONE,
-  CARD_P_SX_E, CARD_P_SX_1, CARD_P_SX_B, CARD_P_SX_F,
-  CARD_P_SX_A, CARD_P_SX_N, CARD_P_SX_5, CARD_P_SX_J,
-  CARD_P_SX_S
- },
- { /* CARD_SXN  */
-  CARD_B_S,
-  CARD_FILE_NONE, CARD_FILE_NONE, CARD_FILE_NONE, CARD_FILE_NONE, CARD_FILE_NONE,
-  CARD_FILE_NONE,
-  CARD_P_SY_E, CARD_P_SY_1, CARD_P_SY_B, CARD_P_SY_F,
-  CARD_P_SY_A, CARD_P_SY_N, CARD_P_SY_5, CARD_P_SY_J,
-  CARD_P_SY_S
- },
- { /* CARD_SCOM */
-  CARD_B_S,
-  CARD_FILE_NONE, CARD_FILE_NONE, CARD_FILE_NONE, CARD_FILE_NONE, CARD_FILE_NONE,
-  CARD_FILE_NONE,
-  CARD_P_SY_E, CARD_P_SY_1, CARD_P_SY_B, CARD_P_SY_F,
-  CARD_P_SY_A, CARD_P_SY_N, CARD_P_SY_5, CARD_P_SY_J,
-  CARD_P_SY_S
- },
- { /* CARD_QUAD */
-  CARD_B_S,
-  CARD_FILE_NONE, CARD_FILE_NONE, CARD_FILE_NONE, CARD_FILE_NONE, CARD_FILE_NONE,
-  CARD_FILE_NONE,
-  CARD_P_SQ_E, CARD_P_SQ_1, CARD_P_SQ_B, CARD_P_SQ_F,
-  CARD_P_SQ_A, CARD_P_SQ_N, CARD_P_SQ_5, CARD_P_SQ_J,
-  CARD_P_SQ_S
- },
- { /* CARD_PR   */
-  CARD_B_P,
-  CARD_FILE_NONE, CARD_FILE_NONE, CARD_FILE_NONE, CARD_FILE_NONE, CARD_FILE_NONE,
-  CARD_FILE_NONE,
-  CARD_P_P_E, CARD_P_P_1, CARD_P_P_B, CARD_P_P_F,
-  CARD_P_P_A, CARD_P_P_N, CARD_P_P_5, CARD_P_P_J,
-  CARD_P_P_S
- },
- { /* CARD_MAE  */
-  CARD_FILE_NONE,
-  CARD_D_K2, CARD_D_H, CARD_D_V, CARD_D_M, CARD_D_F,
-  CARD_D_NEW_DSP_COMBIFILE,
-  CARD_P_M_E, CARD_P_M_1, CARD_P_M_B, CARD_P_M_F,
-  CARD_P_M_A, CARD_P_M_N, CARD_P_M_5, CARD_P_M_J,
-  CARD_P_M_S
- },
- { /* CARD_MAEQ */  /* currently not supported */
-  CARD_FILE_NONE,
-  CARD_FILE_NONE, CARD_FILE_NONE, CARD_FILE_NONE, CARD_FILE_NONE, CARD_FILE_NONE,
-  CARD_FILE_NONE,
-  CARD_FILE_NONE, CARD_FILE_NONE, CARD_FILE_NONE, CARD_FILE_NONE,
-  CARD_FILE_NONE, CARD_FILE_NONE, CARD_FILE_NONE, CARD_FILE_NONE,
-  CARD_FILE_NONE
- },
- { /* CARD_MAEP */  /* currently not supported */
-  CARD_FILE_NONE,
-  CARD_FILE_NONE, CARD_FILE_NONE, CARD_FILE_NONE, CARD_FILE_NONE, CARD_FILE_NONE,
-  CARD_FILE_NONE,
-  CARD_FILE_NONE, CARD_FILE_NONE, CARD_FILE_NONE, CARD_FILE_NONE,
-  CARD_FILE_NONE, CARD_FILE_NONE, CARD_FILE_NONE, CARD_FILE_NONE,
-  CARD_FILE_NONE
- }
+       { /* CARD_UNKNOWN */
+               CARD_FILE_NONE,
+               CARD_FILE_NONE, CARD_FILE_NONE, CARD_FILE_NONE, CARD_FILE_NONE, CARD_FILE_NONE,
+               CARD_FILE_NONE,
+               CARD_FILE_NONE, CARD_FILE_NONE, CARD_FILE_NONE, CARD_FILE_NONE,
+               CARD_FILE_NONE, CARD_FILE_NONE, CARD_FILE_NONE, CARD_FILE_NONE,
+               CARD_FILE_NONE
+       },
+       { /* CARD_DIVA */
+               CARD_FILE_NONE,
+               CARD_D_K1, CARD_D_H, CARD_D_V, CARD_FILE_NONE, CARD_D_F,
+               CARD_D_NEW_DSP_COMBIFILE,
+               CARD_FILE_NONE, CARD_FILE_NONE, CARD_FILE_NONE, CARD_FILE_NONE,
+               CARD_FILE_NONE, CARD_FILE_NONE, CARD_FILE_NONE, CARD_FILE_NONE,
+               CARD_FILE_NONE
+       },
+       { /* CARD_PRO  */
+               CARD_FILE_NONE,
+               CARD_D_K2, CARD_D_H, CARD_D_V, CARD_D_M, CARD_D_F,
+               CARD_D_NEW_DSP_COMBIFILE,
+               CARD_FILE_NONE, CARD_FILE_NONE, CARD_FILE_NONE, CARD_FILE_NONE,
+               CARD_FILE_NONE, CARD_FILE_NONE, CARD_FILE_NONE, CARD_FILE_NONE,
+               CARD_FILE_NONE
+       },
+       { /* CARD_PICO */
+               CARD_FILE_NONE,
+               CARD_FILE_NONE, CARD_FILE_NONE, CARD_FILE_NONE, CARD_FILE_NONE, CARD_FILE_NONE,
+               CARD_FILE_NONE,
+               CARD_FILE_NONE, CARD_FILE_NONE, CARD_FILE_NONE, CARD_FILE_NONE,
+               CARD_FILE_NONE, CARD_FILE_NONE, CARD_FILE_NONE, CARD_FILE_NONE,
+               CARD_FILE_NONE
+       },
+       { /* CARD_S    */
+               CARD_B_S,
+               CARD_FILE_NONE, CARD_FILE_NONE, CARD_FILE_NONE, CARD_FILE_NONE, CARD_FILE_NONE,
+               CARD_FILE_NONE,
+               CARD_P_S_E, CARD_P_S_1, CARD_P_S_B, CARD_P_S_F,
+               CARD_P_S_A, CARD_P_S_N, CARD_P_S_5, CARD_P_S_J,
+               CARD_P_S_S
+       },
+       { /* CARD_SX   */
+               CARD_B_S,
+               CARD_FILE_NONE, CARD_FILE_NONE, CARD_FILE_NONE, CARD_FILE_NONE, CARD_FILE_NONE,
+               CARD_FILE_NONE,
+               CARD_P_SX_E, CARD_P_SX_1, CARD_P_SX_B, CARD_P_SX_F,
+               CARD_P_SX_A, CARD_P_SX_N, CARD_P_SX_5, CARD_P_SX_J,
+               CARD_P_SX_S
+       },
+       { /* CARD_SXN  */
+               CARD_B_S,
+               CARD_FILE_NONE, CARD_FILE_NONE, CARD_FILE_NONE, CARD_FILE_NONE, CARD_FILE_NONE,
+               CARD_FILE_NONE,
+               CARD_P_SY_E, CARD_P_SY_1, CARD_P_SY_B, CARD_P_SY_F,
+               CARD_P_SY_A, CARD_P_SY_N, CARD_P_SY_5, CARD_P_SY_J,
+               CARD_P_SY_S
+       },
+       { /* CARD_SCOM */
+               CARD_B_S,
+               CARD_FILE_NONE, CARD_FILE_NONE, CARD_FILE_NONE, CARD_FILE_NONE, CARD_FILE_NONE,
+               CARD_FILE_NONE,
+               CARD_P_SY_E, CARD_P_SY_1, CARD_P_SY_B, CARD_P_SY_F,
+               CARD_P_SY_A, CARD_P_SY_N, CARD_P_SY_5, CARD_P_SY_J,
+               CARD_P_SY_S
+       },
+       { /* CARD_QUAD */
+               CARD_B_S,
+               CARD_FILE_NONE, CARD_FILE_NONE, CARD_FILE_NONE, CARD_FILE_NONE, CARD_FILE_NONE,
+               CARD_FILE_NONE,
+               CARD_P_SQ_E, CARD_P_SQ_1, CARD_P_SQ_B, CARD_P_SQ_F,
+               CARD_P_SQ_A, CARD_P_SQ_N, CARD_P_SQ_5, CARD_P_SQ_J,
+               CARD_P_SQ_S
+       },
+       { /* CARD_PR   */
+               CARD_B_P,
+               CARD_FILE_NONE, CARD_FILE_NONE, CARD_FILE_NONE, CARD_FILE_NONE, CARD_FILE_NONE,
+               CARD_FILE_NONE,
+               CARD_P_P_E, CARD_P_P_1, CARD_P_P_B, CARD_P_P_F,
+               CARD_P_P_A, CARD_P_P_N, CARD_P_P_5, CARD_P_P_J,
+               CARD_P_P_S
+       },
+       { /* CARD_MAE  */
+               CARD_FILE_NONE,
+               CARD_D_K2, CARD_D_H, CARD_D_V, CARD_D_M, CARD_D_F,
+               CARD_D_NEW_DSP_COMBIFILE,
+               CARD_P_M_E, CARD_P_M_1, CARD_P_M_B, CARD_P_M_F,
+               CARD_P_M_A, CARD_P_M_N, CARD_P_M_5, CARD_P_M_J,
+               CARD_P_M_S
+       },
+       { /* CARD_MAEQ */  /* currently not supported */
+               CARD_FILE_NONE,
+               CARD_FILE_NONE, CARD_FILE_NONE, CARD_FILE_NONE, CARD_FILE_NONE, CARD_FILE_NONE,
+               CARD_FILE_NONE,
+               CARD_FILE_NONE, CARD_FILE_NONE, CARD_FILE_NONE, CARD_FILE_NONE,
+               CARD_FILE_NONE, CARD_FILE_NONE, CARD_FILE_NONE, CARD_FILE_NONE,
+               CARD_FILE_NONE
+       },
+       { /* CARD_MAEP */  /* currently not supported */
+               CARD_FILE_NONE,
+               CARD_FILE_NONE, CARD_FILE_NONE, CARD_FILE_NONE, CARD_FILE_NONE, CARD_FILE_NONE,
+               CARD_FILE_NONE,
+               CARD_FILE_NONE, CARD_FILE_NONE, CARD_FILE_NONE, CARD_FILE_NONE,
+               CARD_FILE_NONE, CARD_FILE_NONE, CARD_FILE_NONE, CARD_FILE_NONE,
+               CARD_FILE_NONE
+       }
 };
 #endif /*CARDTYPE_H_WANT_FILE_DATA*/
 #else /*!CARDTYPE_H_WANT_DATA*/
-extern CARD_FILES_DATA  CardFData [] ;
-extern CARD_FILES   CardFiles [] ;
+extern CARD_FILES_DATA  CardFData[];
+extern CARD_FILES   CardFiles[];
 #endif /*CARDTYPE_H_WANT_DATA*/
 #endif /* _CARDTYPE_H_ */
index cb5ada3..c97230c 100644 (file)
@@ -1,26 +1,26 @@
 
 /*
  *
-  Copyright (c) Eicon Networks, 2002.
+ Copyright (c) Eicon Networks, 2002.
  *
-  This source file is supplied for the use with
-  Eicon Networks range of DIVA Server Adapters.
+ This source file is supplied for the use with
+ Eicon Networks range of DIVA Server Adapters.
  *
-  Eicon File Revision :    2.1
+ Eicon File Revision :    2.1
  *
-  This program is free software; you can redistribute it and/or modify
-  it under the terms of the GNU General Public License as published by
-  the Free Software Foundation; either version 2, or (at your option)
-  any later version.
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
  *
-  This program is distributed in the hope that it will be useful,
-  but WITHOUT ANY WARRANTY OF ANY KIND WHATSOEVER INCLUDING ANY
-  implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-  See the GNU General Public License for more details.
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY OF ANY KIND WHATSOEVER INCLUDING ANY
+ implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ See the GNU General Public License for more details.
  *
-  You should have received a copy of the GNU General Public License
-  along with this program; if not, write to the Free Software
-  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  *
  */
-static char diva_capi_common_code_build[] = "102-28";  
+static char diva_capi_common_code_build[] = "102-28";
index 8949789..5142099 100644 (file)
@@ -1,26 +1,25 @@
-
 /*
  *
-  Copyright (c) Eicon Networks, 2002.
+ Copyright (c) Eicon Networks, 2002.
  *
-  This source file is supplied for the use with
-  Eicon Networks range of DIVA Server Adapters.
+ This source file is supplied for the use with
+ Eicon Networks range of DIVA Server Adapters.
  *
-  Eicon File Revision :    2.1
+ Eicon File Revision :    2.1
  *
-  This program is free software; you can redistribute it and/or modify
-  it under the terms of the GNU General Public License as published by
-  the Free Software Foundation; either version 2, or (at your option)
-  any later version.
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
  *
-  This program is distributed in the hope that it will be useful,
-  but WITHOUT ANY WARRANTY OF ANY KIND WHATSOEVER INCLUDING ANY
-  implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-  See the GNU General Public License for more details.
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY OF ANY KIND WHATSOEVER INCLUDING ANY
+ implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ See the GNU General Public License for more details.
  *
-  You should have received a copy of the GNU General Public License
-  along with this program; if not, write to the Free Software
-  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  *
  */
 #include "platform.h"
 #include "divasync.h"
 #include "dadapter.h"
 /* --------------------------------------------------------------------------
-  Adapter array change notification framework
+   Adapter array change notification framework
    -------------------------------------------------------------------------- */
 typedef struct _didd_adapter_change_notification {
- didd_adapter_change_callback_t callback;
- void IDI_CALL_ENTITY_T *    context;
-} didd_adapter_change_notification_t, \
- * IDI_CALL_ENTITY_T pdidd_adapter_change_notification_t;
+       didd_adapter_change_callback_t callback;
+       void IDI_CALL_ENTITY_T *context;
+} didd_adapter_change_notification_t,                          \
+       * IDI_CALL_ENTITY_T pdidd_adapter_change_notification_t;
 #define DIVA_DIDD_MAX_NOTIFICATIONS 256
-static didd_adapter_change_notification_t\
-              NotificationTable[DIVA_DIDD_MAX_NOTIFICATIONS];
+static didd_adapter_change_notification_t      \
+NotificationTable[DIVA_DIDD_MAX_NOTIFICATIONS];
 /* --------------------------------------------------------------------------
-  Array to held adapter information
+   Array to held adapter information
    -------------------------------------------------------------------------- */
 static DESCRIPTOR  HandleTable[NEW_MAX_DESCRIPTORS];
 static dword Adapters = 0; /* Number of adapters */
 /* --------------------------------------------------------------------------
-  Shadow IDI_DIMAINT
-  and 'shadow' debug stuff
+   Shadow IDI_DIMAINT
+   and 'shadow' debug stuff
    -------------------------------------------------------------------------- */
-static void no_printf (unsigned char * format, ...)
+static void no_printf(unsigned char *format, ...)
 {
 #ifdef EBUG
        va_list ap;
-       va_start (ap, format);
+       va_start(ap, format);
        debug((format, ap));
-       va_end (ap);
+       va_end(ap);
 #endif
 }
 
 /* -------------------------------------------------------------------------
-  Portable debug Library
-  ------------------------------------------------------------------------- */
+   Portable debug Library
+   ------------------------------------------------------------------------- */
 #include "debuglib.c"
-  
+
 static DESCRIPTOR  MAdapter =  {IDI_DIMAINT, /* Adapter Type */
-                0x00,     /* Channels */
-                0x0000,    /* Features */
-                (IDI_CALL)no_printf};
+                               0x00,     /* Channels */
+                               0x0000,    /* Features */
+                               (IDI_CALL)no_printf};
 /* --------------------------------------------------------------------------
-  DAdapter. Only IDI clients with buffer, that is huge enough to
-  get all descriptors will receive information about DAdapter
-  { byte type, byte channels, word features, IDI_CALL request }
+   DAdapter. Only IDI clients with buffer, that is huge enough to
+   get all descriptors will receive information about DAdapter
+   { byte type, byte channels, word features, IDI_CALL request }
    -------------------------------------------------------------------------- */
-static void IDI_CALL_LINK_T diva_dadapter_request (ENTITY IDI_CALL_ENTITY_T *);
+static void IDI_CALL_LINK_T diva_dadapter_request(ENTITY IDI_CALL_ENTITY_T *);
 static DESCRIPTOR  DAdapter =  {IDI_DADAPTER, /* Adapter Type */
-                0x00,     /* Channels */
-                0x0000,    /* Features */
-                diva_dadapter_request };
+                               0x00,     /* Channels */
+                               0x0000,    /* Features */
+                               diva_dadapter_request };
 /* --------------------------------------------------------------------------
-  LOCALS
+   LOCALS
    -------------------------------------------------------------------------- */
-static dword diva_register_adapter_callback (\
-                   didd_adapter_change_callback_t callback,
-                   void IDI_CALL_ENTITY_T* context);
-static void diva_remove_adapter_callback (dword handle);
-static void diva_notify_adapter_change (DESCRIPTOR* d, int removal);
+static dword diva_register_adapter_callback(\
+       didd_adapter_change_callback_t callback,
+       void IDI_CALL_ENTITY_T *context);
+static void diva_remove_adapter_callback(dword handle);
+static void diva_notify_adapter_change(DESCRIPTOR *d, int removal);
 static diva_os_spin_lock_t didd_spin;
 /* --------------------------------------------------------------------------
-  Should be called as first step, after driver init
-  -------------------------------------------------------------------------- */
-void diva_didd_load_time_init (void) {
- memset (&HandleTable[0], 0x00, sizeof(HandleTable));
- memset (&NotificationTable[0], 0x00, sizeof(NotificationTable));
- diva_os_initialize_spin_lock (&didd_spin, "didd");
+   Should be called as first step, after driver init
+   -------------------------------------------------------------------------- */
+void diva_didd_load_time_init(void) {
+       memset(&HandleTable[0], 0x00, sizeof(HandleTable));
+       memset(&NotificationTable[0], 0x00, sizeof(NotificationTable));
+       diva_os_initialize_spin_lock(&didd_spin, "didd");
 }
 /* --------------------------------------------------------------------------
-  Should be called as last step, if driver does unload
-  -------------------------------------------------------------------------- */
-void diva_didd_load_time_finit (void) {
- diva_os_destroy_spin_lock (&didd_spin, "didd");
+   Should be called as last step, if driver does unload
+   -------------------------------------------------------------------------- */
+void diva_didd_load_time_finit(void) {
+       diva_os_destroy_spin_lock(&didd_spin, "didd");
 }
 /* --------------------------------------------------------------------------
-  Called in order to register new adapter in adapter array
-  return adapter handle (> 0) on success
-  return -1 adapter array overflow
-  -------------------------------------------------------------------------- */
-static int diva_didd_add_descriptor (DESCRIPTOR* d) {
- diva_os_spin_lock_magic_t      irql;
- int i;
- if (d->type == IDI_DIMAINT) {
-  if (d->request) {
-   MAdapter.request = d->request;
-   dprintf = (DIVA_DI_PRINTF)d->request;
-   diva_notify_adapter_change (&MAdapter, 0); /* Inserted */
-   DBG_TRC (("DIMAINT registered, dprintf=%08x", d->request))
-  } else {
-   DBG_TRC (("DIMAINT removed"))
-   diva_notify_adapter_change (&MAdapter, 1); /* About to remove */
-   MAdapter.request = (IDI_CALL)no_printf;
-   dprintf = no_printf;
-  }
-  return (NEW_MAX_DESCRIPTORS);
- }
- for (i = 0; i < NEW_MAX_DESCRIPTORS; i++) {
-  diva_os_enter_spin_lock (&didd_spin, &irql, "didd_add");
-  if (HandleTable[i].type == 0) {
-   memcpy (&HandleTable[i], d, sizeof(*d));
-   Adapters++;
-   diva_os_leave_spin_lock (&didd_spin, &irql, "didd_add");
-   diva_notify_adapter_change (d, 0); /* we have new adapter */
-   DBG_TRC (("Add adapter[%d], request=%08x", (i+1), d->request))
-   return (i+1);
-  }
-  diva_os_leave_spin_lock (&didd_spin, &irql, "didd_add");
- }
- DBG_ERR (("Can't add adapter, out of resources"))
- return (-1);
+   Called in order to register new adapter in adapter array
+   return adapter handle (> 0) on success
+   return -1 adapter array overflow
+   -------------------------------------------------------------------------- */
+static int diva_didd_add_descriptor(DESCRIPTOR *d) {
+       diva_os_spin_lock_magic_t      irql;
+       int i;
+       if (d->type == IDI_DIMAINT) {
+               if (d->request) {
+                       MAdapter.request = d->request;
+                       dprintf = (DIVA_DI_PRINTF)d->request;
+                       diva_notify_adapter_change(&MAdapter, 0); /* Inserted */
+                       DBG_TRC(("DIMAINT registered, dprintf=%08x", d->request))
+                               } else {
+                       DBG_TRC(("DIMAINT removed"))
+                               diva_notify_adapter_change(&MAdapter, 1); /* About to remove */
+                       MAdapter.request = (IDI_CALL)no_printf;
+                       dprintf = no_printf;
+               }
+               return (NEW_MAX_DESCRIPTORS);
+       }
+       for (i = 0; i < NEW_MAX_DESCRIPTORS; i++) {
+               diva_os_enter_spin_lock(&didd_spin, &irql, "didd_add");
+               if (HandleTable[i].type == 0) {
+                       memcpy(&HandleTable[i], d, sizeof(*d));
+                       Adapters++;
+                       diva_os_leave_spin_lock(&didd_spin, &irql, "didd_add");
+                       diva_notify_adapter_change(d, 0); /* we have new adapter */
+                       DBG_TRC(("Add adapter[%d], request=%08x", (i + 1), d->request))
+                               return (i + 1);
+               }
+               diva_os_leave_spin_lock(&didd_spin, &irql, "didd_add");
+       }
+       DBG_ERR(("Can't add adapter, out of resources"))
+               return (-1);
 }
 /* --------------------------------------------------------------------------
-  Called in order to remove one registered adapter from array
-  return adapter handle (> 0) on success
-  return 0 on success
-  -------------------------------------------------------------------------- */
-static int diva_didd_remove_descriptor (IDI_CALL request) {
- diva_os_spin_lock_magic_t      irql;
- int i;
- if (request == MAdapter.request) {
-  DBG_TRC(("DIMAINT removed"))
-  dprintf = no_printf;
-  diva_notify_adapter_change (&MAdapter, 1); /* About to remove */
-  MAdapter.request = (IDI_CALL)no_printf;
-  return (0);
- }
- for (i = 0; (Adapters && (i < NEW_MAX_DESCRIPTORS)); i++) {
-  if (HandleTable[i].request == request) {
-   diva_notify_adapter_change (&HandleTable[i], 1); /* About to remove */
-   diva_os_enter_spin_lock (&didd_spin, &irql, "didd_rm");
-   memset (&HandleTable[i], 0x00, sizeof(HandleTable[0]));
-   Adapters--;
-   diva_os_leave_spin_lock (&didd_spin, &irql, "didd_rm");
-   DBG_TRC (("Remove adapter[%d], request=%08x", (i+1), request))
-   return (0);
-  }
- }
- DBG_ERR (("Invalid request=%08x, can't remove adapter", request))
- return (-1);
+   Called in order to remove one registered adapter from array
+   return adapter handle (> 0) on success
+   return 0 on success
+   -------------------------------------------------------------------------- */
+static int diva_didd_remove_descriptor(IDI_CALL request) {
+       diva_os_spin_lock_magic_t      irql;
+       int i;
+       if (request == MAdapter.request) {
+               DBG_TRC(("DIMAINT removed"))
+                       dprintf = no_printf;
+               diva_notify_adapter_change(&MAdapter, 1); /* About to remove */
+               MAdapter.request = (IDI_CALL)no_printf;
+               return (0);
+       }
+       for (i = 0; (Adapters && (i < NEW_MAX_DESCRIPTORS)); i++) {
+               if (HandleTable[i].request == request) {
+                       diva_notify_adapter_change(&HandleTable[i], 1); /* About to remove */
+                       diva_os_enter_spin_lock(&didd_spin, &irql, "didd_rm");
+                       memset(&HandleTable[i], 0x00, sizeof(HandleTable[0]));
+                       Adapters--;
+                       diva_os_leave_spin_lock(&didd_spin, &irql, "didd_rm");
+                       DBG_TRC(("Remove adapter[%d], request=%08x", (i + 1), request))
+                               return (0);
+               }
+       }
+       DBG_ERR(("Invalid request=%08x, can't remove adapter", request))
+               return (-1);
 }
 /* --------------------------------------------------------------------------
-  Read adapter array
-  return 1 if not enough space to save all available adapters
+   Read adapter array
+   return 1 if not enough space to save all available adapters
    -------------------------------------------------------------------------- */
-static int diva_didd_read_adapter_array (DESCRIPTOR* buffer, int length) {
- diva_os_spin_lock_magic_t      irql;
- int src, dst;
- memset (buffer, 0x00, length);
- length /= sizeof(DESCRIPTOR);
- DBG_TRC (("DIDD_Read, space = %d, Adapters = %d", length, Adapters+2))
- diva_os_enter_spin_lock (&didd_spin, &irql, "didd_read");
- for (src = 0, dst = 0;
-    (Adapters && (src < NEW_MAX_DESCRIPTORS) && (dst < length));
-    src++) {
-  if (HandleTable[src].type) {
-   memcpy (&buffer[dst], &HandleTable[src], sizeof(DESCRIPTOR));
-   dst++;
-  }
- }
- diva_os_leave_spin_lock (&didd_spin, &irql, "didd_read");
- if (dst < length) {
-  memcpy (&buffer[dst], &MAdapter, sizeof(DESCRIPTOR));
-  dst++;
- } else {
-  DBG_ERR (("Can't write DIMAINT. Array too small"))
- }
- if (dst < length) {
-  memcpy (&buffer[dst], &DAdapter, sizeof(DESCRIPTOR));
-  dst++;
- } else {
-  DBG_ERR (("Can't write DADAPTER. Array too small"))
- }
- DBG_TRC (("Read %d adapters", dst))
- return (dst == length);
+static int diva_didd_read_adapter_array(DESCRIPTOR *buffer, int length) {
+       diva_os_spin_lock_magic_t      irql;
+       int src, dst;
+       memset(buffer, 0x00, length);
+       length /= sizeof(DESCRIPTOR);
+       DBG_TRC(("DIDD_Read, space = %d, Adapters = %d", length, Adapters + 2))
+
+               diva_os_enter_spin_lock(&didd_spin, &irql, "didd_read");
+       for (src = 0, dst = 0;
+            (Adapters && (src < NEW_MAX_DESCRIPTORS) && (dst < length));
+            src++) {
+               if (HandleTable[src].type) {
+                       memcpy(&buffer[dst], &HandleTable[src], sizeof(DESCRIPTOR));
+                       dst++;
+               }
+       }
+       diva_os_leave_spin_lock(&didd_spin, &irql, "didd_read");
+       if (dst < length) {
+               memcpy(&buffer[dst], &MAdapter, sizeof(DESCRIPTOR));
+               dst++;
+       } else {
+               DBG_ERR(("Can't write DIMAINT. Array too small"))
+                       }
+       if (dst < length) {
+               memcpy(&buffer[dst], &DAdapter, sizeof(DESCRIPTOR));
+               dst++;
+       } else {
+               DBG_ERR(("Can't write DADAPTER. Array too small"))
+                       }
+       DBG_TRC(("Read %d adapters", dst))
+               return (dst == length);
 }
 /* --------------------------------------------------------------------------
-  DAdapter request function.
-  This function does process only synchronous requests, and is used
-  for reception/registration of new interfaces
+   DAdapter request function.
+   This function does process only synchronous requests, and is used
+   for reception/registration of new interfaces
    -------------------------------------------------------------------------- */
-static void IDI_CALL_LINK_T diva_dadapter_request (\
-                      ENTITY IDI_CALL_ENTITY_T *e) {
- IDI_SYNC_REQ *syncReq = (IDI_SYNC_REQ *)e ;
- if (e->Req) { /* We do not process it, also return error */
-  e->Rc = OUT_OF_RESOURCES;
-  DBG_ERR (("Can't process async request, Req=%02x", e->Req))
-  return;
- }
- /*
-  So, we process sync request
-  */
- switch (e->Rc) {
-  case IDI_SYNC_REQ_DIDD_REGISTER_ADAPTER_NOTIFY: {
-   diva_didd_adapter_notify_t* pinfo = &syncReq->didd_notify.info;
-   pinfo->handle = diva_register_adapter_callback (\
-             (didd_adapter_change_callback_t)pinfo->callback,
-             (void IDI_CALL_ENTITY_T *)pinfo->context);
-   e->Rc = 0xff;
-  } break;
-  case IDI_SYNC_REQ_DIDD_REMOVE_ADAPTER_NOTIFY: {
-   diva_didd_adapter_notify_t* pinfo = &syncReq->didd_notify.info;
-   diva_remove_adapter_callback (pinfo->handle);
-   e->Rc = 0xff;
-  } break;
-  case IDI_SYNC_REQ_DIDD_ADD_ADAPTER: {
-   diva_didd_add_adapter_t* pinfo = &syncReq->didd_add_adapter.info;
-   if (diva_didd_add_descriptor ((DESCRIPTOR*)pinfo->descriptor) < 0) {
-    e->Rc = OUT_OF_RESOURCES;
-   } else {
-    e->Rc = 0xff;
-   }
-  } break;
-  case IDI_SYNC_REQ_DIDD_REMOVE_ADAPTER: {
-   diva_didd_remove_adapter_t* pinfo = &syncReq->didd_remove_adapter.info;
-   if (diva_didd_remove_descriptor ((IDI_CALL)pinfo->p_request) < 0) {
-    e->Rc = OUT_OF_RESOURCES;
-   } else {
-    e->Rc = 0xff;
-   }
-  } break;
-  case IDI_SYNC_REQ_DIDD_READ_ADAPTER_ARRAY: {
-   diva_didd_read_adapter_array_t* pinfo =\
-                &syncReq->didd_read_adapter_array.info;
-   if (diva_didd_read_adapter_array ((DESCRIPTOR*)pinfo->buffer,
-                  (int)pinfo->length)) {
-    e->Rc = OUT_OF_RESOURCES;
-   } else {
-    e->Rc = 0xff;
-   }
-  } break;
-  default:
-   DBG_ERR (("Can't process sync request, Req=%02x", e->Rc))
-   e->Rc = OUT_OF_RESOURCES;
- }
+static void IDI_CALL_LINK_T diva_dadapter_request(     \
+       ENTITY IDI_CALL_ENTITY_T *e) {
+       IDI_SYNC_REQ *syncReq = (IDI_SYNC_REQ *)e;
+       if (e->Req) { /* We do not process it, also return error */
+               e->Rc = OUT_OF_RESOURCES;
+               DBG_ERR(("Can't process async request, Req=%02x", e->Req))
+                       return;
+       }
+       /*
+         So, we process sync request
+       */
+       switch (e->Rc) {
+       case IDI_SYNC_REQ_DIDD_REGISTER_ADAPTER_NOTIFY: {
+               diva_didd_adapter_notify_t *pinfo = &syncReq->didd_notify.info;
+               pinfo->handle = diva_register_adapter_callback(         \
+                       (didd_adapter_change_callback_t)pinfo->callback,
+                       (void IDI_CALL_ENTITY_T *)pinfo->context);
+               e->Rc = 0xff;
+       } break;
+       case IDI_SYNC_REQ_DIDD_REMOVE_ADAPTER_NOTIFY: {
+               diva_didd_adapter_notify_t *pinfo = &syncReq->didd_notify.info;
+               diva_remove_adapter_callback(pinfo->handle);
+               e->Rc = 0xff;
+       } break;
+       case IDI_SYNC_REQ_DIDD_ADD_ADAPTER: {
+               diva_didd_add_adapter_t *pinfo = &syncReq->didd_add_adapter.info;
+               if (diva_didd_add_descriptor((DESCRIPTOR *)pinfo->descriptor) < 0) {
+                       e->Rc = OUT_OF_RESOURCES;
+               } else {
+                       e->Rc = 0xff;
+               }
+       } break;
+       case IDI_SYNC_REQ_DIDD_REMOVE_ADAPTER: {
+               diva_didd_remove_adapter_t *pinfo = &syncReq->didd_remove_adapter.info;
+               if (diva_didd_remove_descriptor((IDI_CALL)pinfo->p_request) < 0) {
+                       e->Rc = OUT_OF_RESOURCES;
+               } else {
+                       e->Rc = 0xff;
+               }
+       } break;
+       case IDI_SYNC_REQ_DIDD_READ_ADAPTER_ARRAY: {
+               diva_didd_read_adapter_array_t *pinfo =\
+                       &syncReq->didd_read_adapter_array.info;
+               if (diva_didd_read_adapter_array((DESCRIPTOR *)pinfo->buffer,
+                                                 (int)pinfo->length)) {
+                       e->Rc = OUT_OF_RESOURCES;
+               } else {
+                       e->Rc = 0xff;
+               }
+       } break;
+       default:
+               DBG_ERR(("Can't process sync request, Req=%02x", e->Rc))
+                       e->Rc = OUT_OF_RESOURCES;
+       }
 }
 /* --------------------------------------------------------------------------
-  IDI client does register his notification function
-  -------------------------------------------------------------------------- */
-static dword diva_register_adapter_callback (\
-                   didd_adapter_change_callback_t callback,
-                   void IDI_CALL_ENTITY_T* context) {
- diva_os_spin_lock_magic_t irql;
- dword i;
- for (i = 0; i < DIVA_DIDD_MAX_NOTIFICATIONS; i++) {
-  diva_os_enter_spin_lock (&didd_spin, &irql, "didd_nfy_add");
-  if (!NotificationTable[i].callback) {
-   NotificationTable[i].callback = callback;
-   NotificationTable[i].context = context;
-   diva_os_leave_spin_lock (&didd_spin, &irql, "didd_nfy_add");
-   DBG_TRC(("Register adapter notification[%d]=%08x", i+1, callback))
-   return (i+1);
-  }
-  diva_os_leave_spin_lock (&didd_spin, &irql, "didd_nfy_add");
- }
- DBG_ERR (("Can't register adapter notification, overflow"))
- return (0);
+   IDI client does register his notification function
+   -------------------------------------------------------------------------- */
+static dword diva_register_adapter_callback(           \
+       didd_adapter_change_callback_t callback,
+       void IDI_CALL_ENTITY_T *context) {
+       diva_os_spin_lock_magic_t irql;
+       dword i;
+
+       for (i = 0; i < DIVA_DIDD_MAX_NOTIFICATIONS; i++) {
+               diva_os_enter_spin_lock(&didd_spin, &irql, "didd_nfy_add");
+               if (!NotificationTable[i].callback) {
+                       NotificationTable[i].callback = callback;
+                       NotificationTable[i].context = context;
+                       diva_os_leave_spin_lock(&didd_spin, &irql, "didd_nfy_add");
+                       DBG_TRC(("Register adapter notification[%d]=%08x", i + 1, callback))
+                               return (i + 1);
+               }
+               diva_os_leave_spin_lock(&didd_spin, &irql, "didd_nfy_add");
+       }
+       DBG_ERR(("Can't register adapter notification, overflow"))
+               return (0);
 }
 /* --------------------------------------------------------------------------
-  IDI client does register his notification function
-  -------------------------------------------------------------------------- */
-static void diva_remove_adapter_callback (dword handle) {
- diva_os_spin_lock_magic_t irql;
- if (handle && ((--handle) < DIVA_DIDD_MAX_NOTIFICATIONS)) {
-  diva_os_enter_spin_lock (&didd_spin, &irql, "didd_nfy_rm");
-  NotificationTable[handle].callback = NULL;
-  NotificationTable[handle].context  = NULL;
-  diva_os_leave_spin_lock (&didd_spin, &irql, "didd_nfy_rm");
-  DBG_TRC(("Remove adapter notification[%d]", (int)(handle+1)))
-  return;
- }
- DBG_ERR(("Can't remove adapter notification, handle=%d", handle))
-}
+   IDI client does register his notification function
+   -------------------------------------------------------------------------- */
+static void diva_remove_adapter_callback(dword handle) {
+       diva_os_spin_lock_magic_t irql;
+       if (handle && ((--handle) < DIVA_DIDD_MAX_NOTIFICATIONS)) {
+               diva_os_enter_spin_lock(&didd_spin, &irql, "didd_nfy_rm");
+               NotificationTable[handle].callback = NULL;
+               NotificationTable[handle].context  = NULL;
+               diva_os_leave_spin_lock(&didd_spin, &irql, "didd_nfy_rm");
+               DBG_TRC(("Remove adapter notification[%d]", (int)(handle + 1)))
+                       return;
+       }
+       DBG_ERR(("Can't remove adapter notification, handle=%d", handle))
+               }
 /* --------------------------------------------------------------------------
-  Notify all client about adapter array change
-  Does suppose following behavior in the client side:
-  Step 1: Redister Notification
-  Step 2: Read Adapter Array
-  -------------------------------------------------------------------------- */
-static void diva_notify_adapter_change (DESCRIPTOR* d, int removal) {
- int i, do_notify;
- didd_adapter_change_notification_t nfy;
- diva_os_spin_lock_magic_t irql;
- for (i = 0; i < DIVA_DIDD_MAX_NOTIFICATIONS; i++) {
-  do_notify = 0;
-  diva_os_enter_spin_lock (&didd_spin, &irql, "didd_nfy");
-  if (NotificationTable[i].callback) {
-   memcpy (&nfy, &NotificationTable[i], sizeof(nfy));
-   do_notify = 1;
-  }
-  diva_os_leave_spin_lock (&didd_spin, &irql, "didd_nfy");
-  if (do_notify) {
-   (*(nfy.callback))(nfy.context, d, removal);
-  }
- }
+   Notify all client about adapter array change
+   Does suppose following behavior in the client side:
+   Step 1: Redister Notification
+   Step 2: Read Adapter Array
+   -------------------------------------------------------------------------- */
+static void diva_notify_adapter_change(DESCRIPTOR *d, int removal) {
+       int i, do_notify;
+       didd_adapter_change_notification_t nfy;
+       diva_os_spin_lock_magic_t irql;
+       for (i = 0; i < DIVA_DIDD_MAX_NOTIFICATIONS; i++) {
+               do_notify = 0;
+               diva_os_enter_spin_lock(&didd_spin, &irql, "didd_nfy");
+               if (NotificationTable[i].callback) {
+                       memcpy(&nfy, &NotificationTable[i], sizeof(nfy));
+                       do_notify = 1;
+               }
+               diva_os_leave_spin_lock(&didd_spin, &irql, "didd_nfy");
+               if (do_notify) {
+                       (*(nfy.callback))(nfy.context, d, removal);
+               }
+       }
 }
 /* --------------------------------------------------------------------------
-  For all systems, that are linked by Kernel Mode Linker this is ONLY one
-  function thet should be exported by this device driver
-  IDI clients should look for IDI_DADAPTER, and use request function
-  of this adapter (sync request) in order to receive appropriate services:
-  - add new adapter
-  - remove existing adapter
-  - add adapter array notification
-  - remove adapter array notification
-  (read adapter is redundant in this case)
-  INPUT:
+   For all systems, that are linked by Kernel Mode Linker this is ONLY one
+   function thet should be exported by this device driver
+   IDI clients should look for IDI_DADAPTER, and use request function
+   of this adapter (sync request) in order to receive appropriate services:
+   - add new adapter
+   - remove existing adapter
+   - add adapter array notification
+   - remove adapter array notification
+   (read adapter is redundant in this case)
+   INPUT:
    buffer - pointer to buffer that will receive adapter array
    length  - length (in bytes) of space in buffer
-  OUTPUT:
+   OUTPUT:
    Adapter array will be written to memory described by 'buffer'
    If the last adapter seen in the returned adapter array is
    IDI_DADAPTER or if last adapter in array does have type '0', then
    it was enougth space in buffer to accommodate all available
    adapter descriptors
-  *NOTE 1 (debug interface):
+   *NOTE 1 (debug interface):
    The IDI adapter of type 'IDI_DIMAINT' does register as 'request'
    famous 'dprintf' function (of type DI_PRINTF, please look
    include/debuglib.c and include/debuglib.h) for details.
    So dprintf is not exported from module debug module directly,
    instead of this IDI_DIMAINT is registered.
    Module load order will receive in this case:
-    1. DIDD (this file)
-    2. DIMAINT does load and register 'IDI_DIMAINT', at this step
-      DIDD should be able to get 'dprintf', save it, and
-      register with DIDD by means of 'dprintf' function.
-    3. any other driver is loaded and is able to access adapter array
-      and debug interface
+   1. DIDD (this file)
+   2. DIMAINT does load and register 'IDI_DIMAINT', at this step
+   DIDD should be able to get 'dprintf', save it, and
+   register with DIDD by means of 'dprintf' function.
+   3. any other driver is loaded and is able to access adapter array
+   and debug interface
    This approach does allow to load/unload debug interface on demand,
    and save memory, it it is necessary.
-  -------------------------------------------------------------------------- */
-void IDI_CALL_LINK_T DIVA_DIDD_Read (void IDI_CALL_ENTITY_T * buffer,
-                   int length) {
- diva_didd_read_adapter_array (buffer, length);
+   -------------------------------------------------------------------------- */
+void IDI_CALL_LINK_T DIVA_DIDD_Read(void IDI_CALL_ENTITY_T *buffer,
+                                   int length) {
+       diva_didd_read_adapter_array(buffer, length);
 }
-
index 3575ac9..5540f46 100644 (file)
@@ -1,33 +1,33 @@
 
 /*
  *
-  Copyright (c) Eicon Networks, 2002.
+ Copyright (c) Eicon Networks, 2002.
  *
-  This source file is supplied for the use with
-  Eicon Networks range of DIVA Server Adapters.
+ This source file is supplied for the use with
+ Eicon Networks range of DIVA Server Adapters.
  *
-  Eicon File Revision :    2.1
+ Eicon File Revision :    2.1
  *
-  This program is free software; you can redistribute it and/or modify
-  it under the terms of the GNU General Public License as published by
-  the Free Software Foundation; either version 2, or (at your option)
-  any later version.
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
  *
-  This program is distributed in the hope that it will be useful,
-  but WITHOUT ANY WARRANTY OF ANY KIND WHATSOEVER INCLUDING ANY
-  implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-  See the GNU General Public License for more details.
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY OF ANY KIND WHATSOEVER INCLUDING ANY
+ implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ See the GNU General Public License for more details.
  *
-  You should have received a copy of the GNU General Public License
-  along with this program; if not, write to the Free Software
-  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  *
  */
 #ifndef __DIVA_DIDD_DADAPTER_INC__
 #define __DIVA_DIDD_DADAPTER_INC__
-void diva_didd_load_time_init (void);
-void diva_didd_load_time_finit (void);
+
+void diva_didd_load_time_init(void);
+void diva_didd_load_time_finit(void);
 
 #define NEW_MAX_DESCRIPTORS     64
 
index 7a9894c..b5226af 100644 (file)
@@ -9,67 +9,67 @@
 
 /*
   LOCALS
-  */
+*/
 #define DBG_MAGIC (0x47114711L)
 
-static void DI_register (void *arg);
-static void DI_deregister (pDbgHandle hDbg);
-static void DI_format (int do_lock, word id, int type, char *format, va_list argument_list);
-static void DI_format_locked   (word id, int type, char *format, va_list argument_list);
-static void DI_format_old (word id, char *format, va_list ap) { }
-static void DiProcessEventLog (unsigned short id, unsigned long msgID, va_list ap) { }
-static void single_p (byte * P, word * PLength, byte Id);
-static void diva_maint_xdi_cb (ENTITY* e);
-static word SuperTraceCreateReadReq (byte* P, const char* path);
-static int diva_mnt_cmp_nmbr (const char* nmbr);
-static void diva_free_dma_descriptor (IDI_CALL request, int nr);
-static int diva_get_dma_descriptor (IDI_CALL request, dword *dma_magic);
-void diva_mnt_internal_dprintf (dword drv_id, dword type, char* p, ...);
-
-static dword MaxDumpSize = 256 ;
-static dword MaxXlogSize = 2 + 128 ;
-static char  TraceFilter[DIVA_MAX_SELECTIVE_FILTER_LENGTH+1];
+static void DI_register(void *arg);
+static void DI_deregister(pDbgHandle hDbg);
+static void DI_format(int do_lock, word id, int type, char *format, va_list argument_list);
+static void DI_format_locked(word id, int type, char *format, va_list argument_list);
+static void DI_format_old(word id, char *format, va_list ap) { }
+static void DiProcessEventLog(unsigned short id, unsigned long msgID, va_list ap) { }
+static void single_p(byte *P, word *PLength, byte Id);
+static void diva_maint_xdi_cb(ENTITY *e);
+static word SuperTraceCreateReadReq(byte *P, const char *path);
+static int diva_mnt_cmp_nmbr(const char *nmbr);
+static void diva_free_dma_descriptor(IDI_CALL request, int nr);
+static int diva_get_dma_descriptor(IDI_CALL request, dword *dma_magic);
+void diva_mnt_internal_dprintf(dword drv_id, dword type, char *p, ...);
+
+static dword MaxDumpSize = 256;
+static dword MaxXlogSize = 2 + 128;
+static char  TraceFilter[DIVA_MAX_SELECTIVE_FILTER_LENGTH + 1];
 static int TraceFilterIdent   = -1;
 static int TraceFilterChannel = -1;
 
 typedef struct _diva_maint_client {
-  dword       sec;
-  dword       usec;
-  pDbgHandle  hDbg;
-  char        drvName[128];
-  dword       dbgMask;
-  dword       last_dbgMask;
-  IDI_CALL    request;
-  _DbgHandle_ Dbg;
-  int         logical;
-  int         channels;
-  diva_strace_library_interface_t* pIdiLib;
-  BUFFERS     XData;
-  char        xbuffer[2048+512];
-  byte*       pmem;
-  int         request_pending;
-  int         dma_handle;
+       dword       sec;
+       dword       usec;
+       pDbgHandle  hDbg;
+       char        drvName[128];
+       dword       dbgMask;
+       dword       last_dbgMask;
+       IDI_CALL    request;
+       _DbgHandle_ Dbg;
+       int         logical;
+       int         channels;
+       diva_strace_library_interface_t *pIdiLib;
+       BUFFERS     XData;
+       char        xbuffer[2048 + 512];
+       byte        *pmem;
+       int         request_pending;
+       int         dma_handle;
 } diva_maint_client_t;
 static diva_maint_client_t clients[MAX_DESCRIPTORS];
 
-static void diva_change_management_debug_mask (diva_maint_client_t* pC, dword old_mask);
+static void diva_change_management_debug_mask(diva_maint_client_t *pC, dword old_mask);
 
-static void diva_maint_error (void* user_context,
-                              diva_strace_library_interface_t* hLib,
-                              int Adapter,
-                              int error,
-                              const char* file,
-                              int line);
-static void diva_maint_state_change_notify (void* user_context,
-                                            diva_strace_library_interface_t* hLib,
-                                            int Adapter,
-                                            diva_trace_line_state_t* channel,
-                                            int notify_subject);
-static void diva_maint_trace_notify (void* user_context,
-                                     diva_strace_library_interface_t* hLib,
-                                     int Adapter,
-                                     void* xlog_buffer,
-                                     int length);
+static void diva_maint_error(void *user_context,
+                            diva_strace_library_interface_t *hLib,
+                            int Adapter,
+                            int error,
+                            const char *file,
+                            int line);
+static void diva_maint_state_change_notify(void *user_context,
+                                          diva_strace_library_interface_t *hLib,
+                                          int Adapter,
+                                          diva_trace_line_state_t *channel,
+                                          int notify_subject);
+static void diva_maint_trace_notify(void *user_context,
+                                   diva_strace_library_interface_t *hLib,
+                                   int Adapter,
+                                   void *xlog_buffer,
+                                   int length);
 
 
 
@@ -79,36 +79,36 @@ typedef struct MSG_QUEUE {
        byte    *High;          /* Base + Size (constant)               */
        byte    *Head;          /* first message in queue (if any)      */
        byte    *Tail;          /* first free position                  */
-       byte    *Wrap;          /* current wraparound position          */
+       byte    *Wrap;          /* current wraparound position          */
        dword   Count;          /* current no of bytes in queue         */
 } MSG_QUEUE;
 
 typedef struct MSG_HEAD {
        volatile dword  Size;           /* size of data following MSG_HEAD      */
-#define        MSG_INCOMPLETE  0x8000  /* ored to Size until queueCompleteMsg  */
+#define        MSG_INCOMPLETE  0x8000  /* ored to Size until queueCompleteMsg  */
 } MSG_HEAD;
 
-#define queueCompleteMsg(p) do{ ((MSG_HEAD *)p - 1)->Size &= ~MSG_INCOMPLETE; }while(0)
+#define queueCompleteMsg(p) do { ((MSG_HEAD *)p - 1)->Size &= ~MSG_INCOMPLETE; } while (0)
 #define queueCount(q)  ((q)->Count)
-#define MSG_NEED(size) \
-       ( (sizeof(MSG_HEAD) + size + sizeof(dword) - 1) & ~(sizeof(dword) - 1) )
+#define MSG_NEED(size)                                                 \
+       ((sizeof(MSG_HEAD) + size + sizeof(dword) - 1) & ~(sizeof(dword) - 1))
 
-static void queueInit (MSG_QUEUE *Q, byte *Buffer, dword sizeBuffer) {
+static void queueInit(MSG_QUEUE *Q, byte *Buffer, dword sizeBuffer) {
        Q->Size = sizeBuffer;
        Q->Base = Q->Head = Q->Tail = Buffer;
        Q->High = Buffer + sizeBuffer;
        Q->Wrap = NULL;
-       Q->Count= 0;
+       Q->Count = 0;
 }
 
-static byte *queueAllocMsg (MSG_QUEUE *Q, word size) {
+static byte *queueAllocMsg(MSG_QUEUE *Q, word size) {
        /* Allocate 'size' bytes at tail of queue which will be filled later
-   * directly with callers own message header info and/or message.
-   * An 'alloced' message is marked incomplete by oring the 'Size' field
-   * with MSG_INCOMPLETE.
-   * This must be reset via queueCompleteMsg() after the message is filled.
-   * As long as a message is marked incomplete queuePeekMsg() will return
-   * a 'queue empty' condition when it reaches such a message.  */
+        * directly with callers own message header info and/or message.
+        * An 'alloced' message is marked incomplete by oring the 'Size' field
+        * with MSG_INCOMPLETE.
+        * This must be reset via queueCompleteMsg() after the message is filled.
+        * As long as a message is marked incomplete queuePeekMsg() will return
+        * a 'queue empty' condition when it reaches such a message.  */
 
        MSG_HEAD *Msg;
        word need = MSG_NEED(size);
@@ -119,7 +119,7 @@ static byte *queueAllocMsg (MSG_QUEUE *Q, word size) {
                }
                goto alloc; /* empty */
        }
-       
+
        if (Q->Tail > Q->Head) {
                if (Q->Tail + need <= Q->High) goto alloc; /* append */
                if (Q->Base + need > Q->Head) {
@@ -145,10 +145,10 @@ alloc:
 
 
 
-       return ((byte*)(Msg + 1));
+       return ((byte *)(Msg + 1));
 }
 
-static void queueFreeMsg (MSG_QUEUE *Q) {
+static void queueFreeMsg(MSG_QUEUE *Q) {
 /* Free the message at head of queue */
 
        word size = ((MSG_HEAD *)Q->Head)->Size & ~MSG_INCOMPLETE;
@@ -166,10 +166,10 @@ static void queueFreeMsg (MSG_QUEUE *Q) {
        }
 }
 
-static byte *queuePeekMsg (MSG_QUEUE *Q, word *size) {
+static byte *queuePeekMsg(MSG_QUEUE *Q, word *size) {
        /* Show the first valid message in queue BUT DON'T free the message.
-   * After looking on the message contents it can be freed queueFreeMsg()
-   * or simply remain in message queue.  */
+        * After looking on the message contents it can be freed queueFreeMsg()
+        * or simply remain in message queue.  */
 
        MSG_HEAD *Msg = (MSG_HEAD *)Q->Head;
 
@@ -184,9 +184,9 @@ static byte *queuePeekMsg (MSG_QUEUE *Q, word *size) {
 
 /*
   Message queue header
-  */
-static MSG_QUEUE*          dbg_queue;
-static byte*               dbg_base;
+*/
+static MSG_QUEUE *dbg_queue;
+static byte *dbg_base;
 static int                 external_dbg_queue;
 static diva_os_spin_lock_t dbg_q_lock;
 static diva_os_spin_lock_t dbg_adapter_lock;
@@ -196,1147 +196,1147 @@ static dword               start_sec;
 static dword               start_usec;
 
 /*
-       INTERFACE:
-    Initialize run time queue structures.
-    base:    base of the message queue
-    length:  length of the message queue
-    do_init: perfor queue reset
-
-    return:  zero on success, -1 on error
-  */
-int diva_maint_init (byte* base, unsigned long length, int do_init) {
-  if (dbg_queue || (!base) || (length < (4096*4))) {
-    return (-1);
-  }
+  INTERFACE:
+  Initialize run time queue structures.
+  base:    base of the message queue
+  length:  length of the message queue
+  do_init: perfor queue reset
+
+  return:  zero on success, -1 on error
+*/
+int diva_maint_init(byte *base, unsigned long length, int do_init) {
+       if (dbg_queue || (!base) || (length < (4096 * 4))) {
+               return (-1);
+       }
 
-  TraceFilter[0]     =  0;
-  TraceFilterIdent   = -1;
-  TraceFilterChannel = -1;
+       TraceFilter[0]     =  0;
+       TraceFilterIdent   = -1;
+       TraceFilterChannel = -1;
 
-  dbg_base = base;
+       dbg_base = base;
 
-  diva_os_get_time (&start_sec, &start_usec);
+       diva_os_get_time(&start_sec, &start_usec);
 
-  *(dword*)base  = (dword)DBG_MAGIC; /* Store Magic */
-  base   += sizeof(dword);
-  length -= sizeof(dword);
+       *(dword *)base  = (dword)DBG_MAGIC; /* Store Magic */
+       base   += sizeof(dword);
+       length -= sizeof(dword);
 
-  *(dword*)base = 2048; /* Extension Field Length */
-  base   += sizeof(dword);
-  length -= sizeof(dword);
+       *(dword *)base = 2048; /* Extension Field Length */
+       base   += sizeof(dword);
+       length -= sizeof(dword);
 
-  strcpy (base, "KERNEL MODE BUFFER\n");
-  base   += 2048;
-  length -= 2048;
+       strcpy(base, "KERNEL MODE BUFFER\n");
+       base   += 2048;
+       length -= 2048;
 
-  *(dword*)base = 0; /* Terminate extension */
-  base   += sizeof(dword);
-  length -= sizeof(dword);
+       *(dword *)base = 0; /* Terminate extension */
+       base   += sizeof(dword);
+       length -= sizeof(dword);
 
-  *(void**)base  =  (void*)(base+sizeof(void*)); /* Store Base  */
-  base   += sizeof(void*);
-  length -= sizeof(void*);
+       *(void **)base  =  (void *)(base + sizeof(void *)); /* Store Base  */
+       base   += sizeof(void *);
+       length -= sizeof(void *);
 
-  dbg_queue = (MSG_QUEUE*)base;
-  queueInit (dbg_queue, base + sizeof(MSG_QUEUE), length - sizeof(MSG_QUEUE) - 512);
-  external_dbg_queue = 0;
+       dbg_queue = (MSG_QUEUE *)base;
+       queueInit(dbg_queue, base + sizeof(MSG_QUEUE), length - sizeof(MSG_QUEUE) - 512);
+       external_dbg_queue = 0;
 
-  if (!do_init) {
-    external_dbg_queue = 1; /* memory was located on the external device */
-  }
+       if (!do_init) {
+               external_dbg_queue = 1; /* memory was located on the external device */
+       }
 
 
-       if (diva_os_initialize_spin_lock (&dbg_q_lock, "dbg_init")) {
-    dbg_queue = NULL;
-    dbg_base = NULL;
-    external_dbg_queue = 0;
+       if (diva_os_initialize_spin_lock(&dbg_q_lock, "dbg_init")) {
+               dbg_queue = NULL;
+               dbg_base = NULL;
+               external_dbg_queue = 0;
                return (-1);
-  }
+       }
 
-       if (diva_os_initialize_spin_lock (&dbg_adapter_lock, "dbg_init")) {
-    diva_os_destroy_spin_lock(&dbg_q_lock, "dbg_init");
-    dbg_queue = NULL;
-    dbg_base = NULL;
-    external_dbg_queue = 0;
+       if (diva_os_initialize_spin_lock(&dbg_adapter_lock, "dbg_init")) {
+               diva_os_destroy_spin_lock(&dbg_q_lock, "dbg_init");
+               dbg_queue = NULL;
+               dbg_base = NULL;
+               external_dbg_queue = 0;
                return (-1);
-  }
+       }
 
-  return (0);
+       return (0);
 }
 
 /*
   INTERFACE:
-    Finit at unload time
-    return address of internal queue or zero if queue
-    was external
-  */
-void* diva_maint_finit (void) {
-  void* ret = (void*)dbg_base;
-  int i;
-
-  dbg_queue = NULL;
-  dbg_base  = NULL;
-
-  if (ret) {
-    diva_os_destroy_spin_lock(&dbg_q_lock, "dbg_finit");
-    diva_os_destroy_spin_lock(&dbg_adapter_lock, "dbg_finit");
-  }
-
-  if (external_dbg_queue) {
-    ret = NULL;
-  }
-  external_dbg_queue = 0;
-
-  for (i = 1; i < ARRAY_SIZE(clients); i++) {
-    if (clients[i].pmem) {
-      diva_os_free (0, clients[i].pmem);
-    }
-  }
-
-  return (ret);
+  Finit at unload time
+  return address of internal queue or zero if queue
+  was external
+*/
+void *diva_maint_finit(void) {
+       void *ret = (void *)dbg_base;
+       int i;
+
+       dbg_queue = NULL;
+       dbg_base  = NULL;
+
+       if (ret) {
+               diva_os_destroy_spin_lock(&dbg_q_lock, "dbg_finit");
+               diva_os_destroy_spin_lock(&dbg_adapter_lock, "dbg_finit");
+       }
+
+       if (external_dbg_queue) {
+               ret = NULL;
+       }
+       external_dbg_queue = 0;
+
+       for (i = 1; i < ARRAY_SIZE(clients); i++) {
+               if (clients[i].pmem) {
+                       diva_os_free(0, clients[i].pmem);
+               }
+       }
+
+       return (ret);
 }
 
 /*
   INTERFACE:
-    Return amount of messages in debug queue
-  */
-dword diva_dbg_q_length (void) {
+  Return amount of messages in debug queue
+*/
+dword diva_dbg_q_length(void) {
        return (dbg_queue ? queueCount(dbg_queue)       : 0);
 }
 
 /*
   INTERFACE:
-    Lock message queue and return the pointer to the first
-    entry.
-  */
-diva_dbg_entry_head_t* diva_maint_get_message (word* size,
-                                               diva_os_spin_lock_magic_t* old_irql) {
-  diva_dbg_entry_head_t*     pmsg = NULL;
-
-  diva_os_enter_spin_lock (&dbg_q_lock, old_irql, "read");
-  if (dbg_q_busy) {
-    diva_os_leave_spin_lock (&dbg_q_lock, old_irql, "read_busy");
-    return NULL;
-  }
-  dbg_q_busy = 1;
-
-  if (!(pmsg = (diva_dbg_entry_head_t*)queuePeekMsg (dbg_queue, size))) {
-    dbg_q_busy = 0;
-    diva_os_leave_spin_lock (&dbg_q_lock, old_irql, "read_empty");
-  }
-
-  return (pmsg);
+  Lock message queue and return the pointer to the first
+  entry.
+*/
+diva_dbg_entry_head_t *diva_maint_get_message(word *size,
+                                             diva_os_spin_lock_magic_t *old_irql) {
+       diva_dbg_entry_head_t *pmsg = NULL;
+
+       diva_os_enter_spin_lock(&dbg_q_lock, old_irql, "read");
+       if (dbg_q_busy) {
+               diva_os_leave_spin_lock(&dbg_q_lock, old_irql, "read_busy");
+               return NULL;
+       }
+       dbg_q_busy = 1;
+
+       if (!(pmsg = (diva_dbg_entry_head_t *)queuePeekMsg(dbg_queue, size))) {
+               dbg_q_busy = 0;
+               diva_os_leave_spin_lock(&dbg_q_lock, old_irql, "read_empty");
+       }
+
+       return (pmsg);
 }
 
 /*
   INTERFACE:
-    acknowledge last message and unlock queue
-  */
-void diva_maint_ack_message (int do_release,
-                             diva_os_spin_lock_magic_t* old_irql) {
+  acknowledge last message and unlock queue
+*/
+void diva_maint_ack_message(int do_release,
+                           diva_os_spin_lock_magic_t *old_irql) {
        if (!dbg_q_busy) {
                return;
        }
        if (do_release) {
-               queueFreeMsg (dbg_queue);
+               queueFreeMsg(dbg_queue);
        }
        dbg_q_busy = 0;
-  diva_os_leave_spin_lock (&dbg_q_lock, old_irql, "read_ack");
+       diva_os_leave_spin_lock(&dbg_q_lock, old_irql, "read_ack");
 }
 
 
 /*
   INTERFACE:
-    PRT COMP function used to register
-    with MAINT adapter or log in compatibility
-    mode in case older driver version is connected too
-  */
-void diva_maint_prtComp (char *format, ...) {
-  void    *hDbg;
-  va_list ap;
-
-  if (!format)
-    return;
-
-  va_start(ap, format);
-
-  /*
-    register to new log driver functions
-   */
-  if ((format[0] == 0) && ((unsigned char)format[1] == 255)) {
-    hDbg = va_arg(ap, void *); /* ptr to DbgHandle */
-    DI_register (hDbg);
-  }
-
-  va_end (ap);
+  PRT COMP function used to register
+  with MAINT adapter or log in compatibility
+  mode in case older driver version is connected too
+*/
+void diva_maint_prtComp(char *format, ...) {
+       void    *hDbg;
+       va_list ap;
+
+       if (!format)
+               return;
+
+       va_start(ap, format);
+
+       /*
+         register to new log driver functions
+       */
+       if ((format[0] == 0) && ((unsigned char)format[1] == 255)) {
+               hDbg = va_arg(ap, void *); /* ptr to DbgHandle */
+               DI_register(hDbg);
+       }
+
+       va_end(ap);
 }
 
-static void DI_register (void *arg) {
-  diva_os_spin_lock_magic_t old_irql;
-  dword sec, usec;
-  pDbgHandle   hDbg ;
-  int id, free_id = -1, best_id = 0;
-  
-  diva_os_get_time (&sec, &usec);
-
-       hDbg = (pDbgHandle)arg ;
-  /*
-    Check for bad args, specially for the old obsolete debug handle
-    */
-  if ((hDbg == NULL) ||
-      ((hDbg->id == 0) && (((_OldDbgHandle_ *)hDbg)->id == -1)) ||
-      (hDbg->Registered != 0)) {
-               return ;
-  }
-
-  diva_os_enter_spin_lock (&dbg_q_lock, &old_irql, "register");
-
-  for (id = 1; id < ARRAY_SIZE(clients); id++) {
-    if (clients[id].hDbg == hDbg) {
-      /*
-        driver already registered
-        */
-      diva_os_leave_spin_lock (&dbg_q_lock, &old_irql, "register");
-      return;
-    }
-    if (clients[id].hDbg) { /* slot is busy */
-      continue;
-    }
-    free_id = id;
-    if (!strcmp (clients[id].drvName, hDbg->drvName)) {
-      /*
-        This driver was already registered with this name
-        and slot is still free - reuse it
-        */
-      best_id = 1;
-      break;
-    }
-    if (!clients[id].hDbg) { /* slot is busy */
-      break;
-    }
-  }
-
-  if (free_id != -1) {
-    diva_dbg_entry_head_t* pmsg = NULL;
-    int len;
-    char tmp[256];
-    word size;
-
-    /*
-      Register new driver with id == free_id
-      */
-    clients[free_id].hDbg = hDbg;
-    clients[free_id].sec  = sec;
-    clients[free_id].usec = usec;
-    strcpy (clients[free_id].drvName, hDbg->drvName);
-
-    clients[free_id].dbgMask = hDbg->dbgMask;
-    if (best_id) {
-      hDbg->dbgMask |= clients[free_id].last_dbgMask;
-    } else {
-      clients[free_id].last_dbgMask = 0;
-    }
-
-    hDbg->Registered = DBG_HANDLE_REG_NEW ;
-    hDbg->id         = (byte)free_id;
-    hDbg->dbg_end    = DI_deregister;
-    hDbg->dbg_prt    = DI_format_locked;
-    hDbg->dbg_ev     = DiProcessEventLog;
-    hDbg->dbg_irq    = DI_format_locked;
-    if (hDbg->Version > 0) {
-      hDbg->dbg_old  = DI_format_old;
-    }
-    hDbg->next       = (pDbgHandle)DBG_MAGIC;
-
-    /*
-      Log driver register, MAINT driver ID is '0'
-      */
-    len = sprintf (tmp, "DIMAINT - drv # %d = '%s' registered",
-                   free_id, hDbg->drvName);
-
-    while (!(pmsg = (diva_dbg_entry_head_t*)queueAllocMsg (dbg_queue,
-                                        (word)(len+1+sizeof(*pmsg))))) {
-      if ((pmsg = (diva_dbg_entry_head_t*)queuePeekMsg (dbg_queue, &size))) {
-        queueFreeMsg (dbg_queue);
-      } else {
-        break;
-      }
-    }
-
-    if (pmsg) {
-      pmsg->sequence    = dbg_sequence++;
-      pmsg->time_sec    = sec;
-      pmsg->time_usec   = usec;
-      pmsg->facility    = MSG_TYPE_STRING;
-      pmsg->dli         = DLI_REG;
-      pmsg->drv_id      = 0; /* id 0 - DIMAINT */
-      pmsg->di_cpu      = 0;
-      pmsg->data_length = len+1;
-
-      memcpy (&pmsg[1], tmp, len+1);
-                 queueCompleteMsg (pmsg);
-      diva_maint_wakeup_read();
-    }
-  }
-
-  diva_os_leave_spin_lock (&dbg_q_lock, &old_irql, "register");
+static void DI_register(void *arg) {
+       diva_os_spin_lock_magic_t old_irql;
+       dword sec, usec;
+       pDbgHandle      hDbg;
+       int id, free_id = -1, best_id = 0;
+
+       diva_os_get_time(&sec, &usec);
+
+       hDbg = (pDbgHandle)arg;
+       /*
+         Check for bad args, specially for the old obsolete debug handle
+       */
+       if ((hDbg == NULL) ||
+           ((hDbg->id == 0) && (((_OldDbgHandle_ *)hDbg)->id == -1)) ||
+           (hDbg->Registered != 0)) {
+               return;
+       }
+
+       diva_os_enter_spin_lock(&dbg_q_lock, &old_irql, "register");
+
+       for (id = 1; id < ARRAY_SIZE(clients); id++) {
+               if (clients[id].hDbg == hDbg) {
+                       /*
+                         driver already registered
+                       */
+                       diva_os_leave_spin_lock(&dbg_q_lock, &old_irql, "register");
+                       return;
+               }
+               if (clients[id].hDbg) { /* slot is busy */
+                       continue;
+               }
+               free_id = id;
+               if (!strcmp(clients[id].drvName, hDbg->drvName)) {
+                       /*
+                         This driver was already registered with this name
+                         and slot is still free - reuse it
+                       */
+                       best_id = 1;
+                       break;
+               }
+               if (!clients[id].hDbg) { /* slot is busy */
+                       break;
+               }
+       }
+
+       if (free_id != -1) {
+               diva_dbg_entry_head_t *pmsg = NULL;
+               int len;
+               char tmp[256];
+               word size;
+
+               /*
+                 Register new driver with id == free_id
+               */
+               clients[free_id].hDbg = hDbg;
+               clients[free_id].sec  = sec;
+               clients[free_id].usec = usec;
+               strcpy(clients[free_id].drvName, hDbg->drvName);
+
+               clients[free_id].dbgMask = hDbg->dbgMask;
+               if (best_id) {
+                       hDbg->dbgMask |= clients[free_id].last_dbgMask;
+               } else {
+                       clients[free_id].last_dbgMask = 0;
+               }
+
+               hDbg->Registered = DBG_HANDLE_REG_NEW;
+               hDbg->id         = (byte)free_id;
+               hDbg->dbg_end    = DI_deregister;
+               hDbg->dbg_prt    = DI_format_locked;
+               hDbg->dbg_ev     = DiProcessEventLog;
+               hDbg->dbg_irq    = DI_format_locked;
+               if (hDbg->Version > 0) {
+                       hDbg->dbg_old  = DI_format_old;
+               }
+               hDbg->next       = (pDbgHandle)DBG_MAGIC;
+
+               /*
+                 Log driver register, MAINT driver ID is '0'
+               */
+               len = sprintf(tmp, "DIMAINT - drv # %d = '%s' registered",
+                             free_id, hDbg->drvName);
+
+               while (!(pmsg = (diva_dbg_entry_head_t *)queueAllocMsg(dbg_queue,
+                                                                      (word)(len + 1 + sizeof(*pmsg))))) {
+                       if ((pmsg = (diva_dbg_entry_head_t *)queuePeekMsg(dbg_queue, &size))) {
+                               queueFreeMsg(dbg_queue);
+                       } else {
+                               break;
+                       }
+               }
+
+               if (pmsg) {
+                       pmsg->sequence    = dbg_sequence++;
+                       pmsg->time_sec    = sec;
+                       pmsg->time_usec   = usec;
+                       pmsg->facility    = MSG_TYPE_STRING;
+                       pmsg->dli         = DLI_REG;
+                       pmsg->drv_id      = 0; /* id 0 - DIMAINT */
+                       pmsg->di_cpu      = 0;
+                       pmsg->data_length = len + 1;
+
+                       memcpy(&pmsg[1], tmp, len + 1);
+                       queueCompleteMsg(pmsg);
+                       diva_maint_wakeup_read();
+               }
+       }
+
+       diva_os_leave_spin_lock(&dbg_q_lock, &old_irql, "register");
 }
 
-static void DI_deregister (pDbgHandle hDbg) {
-  diva_os_spin_lock_magic_t old_irql, old_irql1;
-  dword sec, usec;
-  int i;
-  word size;
-  byte* pmem = NULL;
-
-  diva_os_get_time (&sec, &usec);
-
-  diva_os_enter_spin_lock (&dbg_adapter_lock, &old_irql1, "read");
-  diva_os_enter_spin_lock (&dbg_q_lock, &old_irql, "read");
-
-  for (i = 1; i < ARRAY_SIZE(clients); i++) {
-    if (clients[i].hDbg == hDbg) {
-      diva_dbg_entry_head_t* pmsg;
-      char tmp[256];
-      int len;
-
-      clients[i].hDbg = NULL;
-
-      hDbg->id       = -1;
-      hDbg->dbgMask  = 0;
-      hDbg->dbg_end  = NULL;
-      hDbg->dbg_prt  = NULL;
-      hDbg->dbg_irq  = NULL;
-      if (hDbg->Version > 0)
-        hDbg->dbg_old = NULL;
-      hDbg->Registered = 0;
-      hDbg->next     = NULL;
-
-      if (clients[i].pIdiLib) {
-        (*(clients[i].pIdiLib->DivaSTraceLibraryFinit))(clients[i].pIdiLib->hLib);
-        clients[i].pIdiLib = NULL;
-
-        pmem = clients[i].pmem;
-        clients[i].pmem = NULL;
-      }
-
-      /*
-        Log driver register, MAINT driver ID is '0'
-        */
-      len = sprintf (tmp, "DIMAINT - drv # %d = '%s' de-registered",
-                     i, hDbg->drvName);
-
-      while (!(pmsg = (diva_dbg_entry_head_t*)queueAllocMsg (dbg_queue,
-                                        (word)(len+1+sizeof(*pmsg))))) {
-        if ((pmsg = (diva_dbg_entry_head_t*)queuePeekMsg (dbg_queue, &size))) {
-          queueFreeMsg (dbg_queue);
-        } else {
-          break;
-        }
-      }
-
-      if (pmsg) {
-        pmsg->sequence    = dbg_sequence++;
-        pmsg->time_sec    = sec;
-        pmsg->time_usec   = usec;
-        pmsg->facility    = MSG_TYPE_STRING;
-        pmsg->dli         = DLI_REG;
-        pmsg->drv_id      = 0; /* id 0 - DIMAINT */
-        pmsg->di_cpu      = 0;
-        pmsg->data_length = len+1;
-
-        memcpy (&pmsg[1], tmp, len+1);
-                 queueCompleteMsg (pmsg);
-        diva_maint_wakeup_read();
-      }
-
-      break;
-    }
-  }
-
-  diva_os_leave_spin_lock (&dbg_q_lock, &old_irql, "read_ack");
-  diva_os_leave_spin_lock (&dbg_adapter_lock, &old_irql1, "read_ack");
-
-  if (pmem) {
-    diva_os_free (0, pmem);
-  }
+static void DI_deregister(pDbgHandle hDbg) {
+       diva_os_spin_lock_magic_t old_irql, old_irql1;
+       dword sec, usec;
+       int i;
+       word size;
+       byte *pmem = NULL;
+
+       diva_os_get_time(&sec, &usec);
+
+       diva_os_enter_spin_lock(&dbg_adapter_lock, &old_irql1, "read");
+       diva_os_enter_spin_lock(&dbg_q_lock, &old_irql, "read");
+
+       for (i = 1; i < ARRAY_SIZE(clients); i++) {
+               if (clients[i].hDbg == hDbg) {
+                       diva_dbg_entry_head_t *pmsg;
+                       char tmp[256];
+                       int len;
+
+                       clients[i].hDbg = NULL;
+
+                       hDbg->id       = -1;
+                       hDbg->dbgMask  = 0;
+                       hDbg->dbg_end  = NULL;
+                       hDbg->dbg_prt  = NULL;
+                       hDbg->dbg_irq  = NULL;
+                       if (hDbg->Version > 0)
+                               hDbg->dbg_old = NULL;
+                       hDbg->Registered = 0;
+                       hDbg->next     = NULL;
+
+                       if (clients[i].pIdiLib) {
+                               (*(clients[i].pIdiLib->DivaSTraceLibraryFinit))(clients[i].pIdiLib->hLib);
+                               clients[i].pIdiLib = NULL;
+
+                               pmem = clients[i].pmem;
+                               clients[i].pmem = NULL;
+                       }
+
+                       /*
+                         Log driver register, MAINT driver ID is '0'
+                       */
+                       len = sprintf(tmp, "DIMAINT - drv # %d = '%s' de-registered",
+                                     i, hDbg->drvName);
+
+                       while (!(pmsg = (diva_dbg_entry_head_t *)queueAllocMsg(dbg_queue,
+                                                                             (word)(len + 1 + sizeof(*pmsg))))) {
+                               if ((pmsg = (diva_dbg_entry_head_t *)queuePeekMsg(dbg_queue, &size))) {
+                                       queueFreeMsg(dbg_queue);
+                               } else {
+                                       break;
+                               }
+                       }
+
+                       if (pmsg) {
+                               pmsg->sequence    = dbg_sequence++;
+                               pmsg->time_sec    = sec;
+                               pmsg->time_usec   = usec;
+                               pmsg->facility    = MSG_TYPE_STRING;
+                               pmsg->dli         = DLI_REG;
+                               pmsg->drv_id      = 0; /* id 0 - DIMAINT */
+                               pmsg->di_cpu      = 0;
+                               pmsg->data_length = len + 1;
+
+                               memcpy(&pmsg[1], tmp, len + 1);
+                               queueCompleteMsg(pmsg);
+                               diva_maint_wakeup_read();
+                       }
+
+                       break;
+               }
+       }
+
+       diva_os_leave_spin_lock(&dbg_q_lock, &old_irql, "read_ack");
+       diva_os_leave_spin_lock(&dbg_adapter_lock, &old_irql1, "read_ack");
+
+       if (pmem) {
+               diva_os_free(0, pmem);
+       }
 }
 
-static void DI_format_locked (unsigned short id,
-                       int type,
-                       char *format,
-                       va_list argument_list) {
-  DI_format (1, id, type, format, argument_list);
+static void DI_format_locked(unsigned short id,
+                            int type,
+                            char *format,
+                            va_list argument_list) {
+       DI_format(1, id, type, format, argument_list);
 }
 
-static void DI_format (int do_lock,
-                       unsigned short id,
-                       int type,
-                       char *format,
-                       va_list ap) {
-  diva_os_spin_lock_magic_t old_irql;
-  dword sec, usec;
-  diva_dbg_entry_head_t* pmsg = NULL;
-  dword length;
-  word size;
-  static char fmtBuf[MSG_FRAME_MAX_SIZE+sizeof(*pmsg)+1];
-  char          *data;
-  unsigned short code;
-
-  if (diva_os_in_irq()) {
-    dbg_sequence++;
-    return;
-  }
+static void DI_format(int do_lock,
+                     unsigned short id,
+                     int type,
+                     char *format,
+                     va_list ap) {
+       diva_os_spin_lock_magic_t old_irql;
+       dword sec, usec;
+       diva_dbg_entry_head_t *pmsg = NULL;
+       dword length;
+       word size;
+       static char fmtBuf[MSG_FRAME_MAX_SIZE + sizeof(*pmsg) + 1];
+       char          *data;
+       unsigned short code;
+
+       if (diva_os_in_irq()) {
+               dbg_sequence++;
+               return;
+       }
 
        if ((!format) ||
-                       ((TraceFilter[0] != 0) && ((TraceFilterIdent < 0) || (TraceFilterChannel < 0)))) {
+           ((TraceFilter[0] != 0) && ((TraceFilterIdent < 0) || (TraceFilterChannel < 0)))) {
                return;
        }
 
 
-  
-  diva_os_get_time (&sec, &usec);
-
-  if (do_lock) {
-    diva_os_enter_spin_lock (&dbg_q_lock, &old_irql, "format");
-  }
-
-  switch (type) {
-  case DLI_MXLOG :
-  case DLI_BLK :
-  case DLI_SEND:
-  case DLI_RECV:
-    if (!(length = va_arg(ap, unsigned long))) {
-      break;
-    }
-    if (length > MaxDumpSize) {
-      length = MaxDumpSize;
-    }
-    while (!(pmsg = (diva_dbg_entry_head_t*)queueAllocMsg (dbg_queue,
-                                (word)length+sizeof(*pmsg)))) {
-      if ((pmsg = (diva_dbg_entry_head_t*)queuePeekMsg (dbg_queue, &size))) {
-        queueFreeMsg (dbg_queue);
-      } else {
-        break;
-      }
-    }
-    if (pmsg) {
-      memcpy (&pmsg[1], format, length);
-      pmsg->sequence    = dbg_sequence++;
-      pmsg->time_sec    = sec;
-      pmsg->time_usec   = usec;
-      pmsg->facility    = MSG_TYPE_BINARY ;
-      pmsg->dli         = type; /* DLI_XXX */
-      pmsg->drv_id      = id;   /* driver MAINT id */
-      pmsg->di_cpu      = 0;
-      pmsg->data_length = length;
-      queueCompleteMsg (pmsg);
-    }
+
+       diva_os_get_time(&sec, &usec);
+
+       if (do_lock) {
+               diva_os_enter_spin_lock(&dbg_q_lock, &old_irql, "format");
+       }
+
+       switch (type) {
+       case DLI_MXLOG:
+       case DLI_BLK:
+       case DLI_SEND:
+       case DLI_RECV:
+               if (!(length = va_arg(ap, unsigned long))) {
+                       break;
+               }
+               if (length > MaxDumpSize) {
+                       length = MaxDumpSize;
+               }
+               while (!(pmsg = (diva_dbg_entry_head_t *)queueAllocMsg(dbg_queue,
+                                                                      (word)length + sizeof(*pmsg)))) {
+                       if ((pmsg = (diva_dbg_entry_head_t *)queuePeekMsg(dbg_queue, &size))) {
+                               queueFreeMsg(dbg_queue);
+                       } else {
+                               break;
+                       }
+               }
+               if (pmsg) {
+                       memcpy(&pmsg[1], format, length);
+                       pmsg->sequence    = dbg_sequence++;
+                       pmsg->time_sec    = sec;
+                       pmsg->time_usec   = usec;
+                       pmsg->facility    = MSG_TYPE_BINARY;
+                       pmsg->dli         = type; /* DLI_XXX */
+                       pmsg->drv_id      = id;   /* driver MAINT id */
+                       pmsg->di_cpu      = 0;
+                       pmsg->data_length = length;
+                       queueCompleteMsg(pmsg);
+               }
                break;
 
-  case DLI_XLOG: {
-    byte* p;
-    data    = va_arg(ap, char*);
-    code    = (unsigned short)va_arg(ap, unsigned int);
-    length     = (unsigned long) va_arg(ap, unsigned int);
-
-    if (length > MaxXlogSize)
-      length = MaxXlogSize;
-
-    while (!(pmsg = (diva_dbg_entry_head_t*)queueAllocMsg (dbg_queue,
-                                  (word)length+sizeof(*pmsg)+2))) {
-      if ((pmsg = (diva_dbg_entry_head_t*)queuePeekMsg (dbg_queue, &size))) {
-        queueFreeMsg (dbg_queue);
-      } else {
-        break;
-      }
-    }
-    if (pmsg) {
-      p = (byte*)&pmsg[1];
-      p[0] = (char)(code) ;
-      p[1] = (char)(code >> 8) ;
-      if (data && length) {
-        memcpy (&p[2], &data[0], length) ;
-      }
-      length += 2 ;
-
-      pmsg->sequence    = dbg_sequence++;
-      pmsg->time_sec    = sec;
-      pmsg->time_usec   = usec;
-      pmsg->facility    = MSG_TYPE_BINARY ;
-      pmsg->dli         = type; /* DLI_XXX */
-      pmsg->drv_id      = id;   /* driver MAINT id */
-      pmsg->di_cpu      = 0;
-      pmsg->data_length = length;
-      queueCompleteMsg (pmsg);
-    }
-  } break;
-
-  case DLI_LOG :
-  case DLI_FTL :
-  case DLI_ERR :
-  case DLI_TRC :
-  case DLI_REG :
-  case DLI_MEM :
-  case DLI_SPL :
-  case DLI_IRP :
-  case DLI_TIM :
-  case DLI_TAPI:
-  case DLI_NDIS:
-  case DLI_CONN:
-  case DLI_STAT:
-  case DLI_PRV0:
-  case DLI_PRV1:
-  case DLI_PRV2:
-  case DLI_PRV3:
-    if ((length = (unsigned long)vsprintf (&fmtBuf[0], format, ap)) > 0) {
-      length += (sizeof(*pmsg)+1);
-
-      while (!(pmsg = (diva_dbg_entry_head_t*)queueAllocMsg (dbg_queue,
-                                                          (word)length))) {
-        if ((pmsg = (diva_dbg_entry_head_t*)queuePeekMsg (dbg_queue, &size))) {
-          queueFreeMsg (dbg_queue);
-        } else {
-          break;
-        }
-      }
-
-      pmsg->sequence    = dbg_sequence++;
-      pmsg->time_sec    = sec;
-      pmsg->time_usec   = usec;
-      pmsg->facility    = MSG_TYPE_STRING;
-      pmsg->dli         = type; /* DLI_XXX */
-      pmsg->drv_id      = id;   /* driver MAINT id */
-      pmsg->di_cpu      = 0;
-      pmsg->data_length = length - sizeof(*pmsg);
-
-      memcpy (&pmsg[1], fmtBuf, pmsg->data_length);
-                 queueCompleteMsg (pmsg);
-    }
-    break;
-
-  } /* switch type */
-
-
-  if (queueCount(dbg_queue)) {
-    diva_maint_wakeup_read();
-  }
-
-  if (do_lock) {
-    diva_os_leave_spin_lock (&dbg_q_lock, &old_irql, "format");
-  }
+       case DLI_XLOG: {
+               byte *p;
+               data    = va_arg(ap, char *);
+               code    = (unsigned short)va_arg(ap, unsigned int);
+               length  = (unsigned long)va_arg(ap, unsigned int);
+
+               if (length > MaxXlogSize)
+                       length = MaxXlogSize;
+
+               while (!(pmsg = (diva_dbg_entry_head_t *)queueAllocMsg(dbg_queue,
+                                                                     (word)length + sizeof(*pmsg) + 2))) {
+                       if ((pmsg = (diva_dbg_entry_head_t *)queuePeekMsg(dbg_queue, &size))) {
+                               queueFreeMsg(dbg_queue);
+                       } else {
+                               break;
+                       }
+               }
+               if (pmsg) {
+                       p = (byte *)&pmsg[1];
+                       p[0] = (char)(code);
+                       p[1] = (char)(code >> 8);
+                       if (data && length) {
+                               memcpy(&p[2], &data[0], length);
+                       }
+                       length += 2;
+
+                       pmsg->sequence    = dbg_sequence++;
+                       pmsg->time_sec    = sec;
+                       pmsg->time_usec   = usec;
+                       pmsg->facility    = MSG_TYPE_BINARY;
+                       pmsg->dli         = type; /* DLI_XXX */
+                       pmsg->drv_id      = id;   /* driver MAINT id */
+                       pmsg->di_cpu      = 0;
+                       pmsg->data_length = length;
+                       queueCompleteMsg(pmsg);
+               }
+       } break;
+
+       case DLI_LOG:
+       case DLI_FTL:
+       case DLI_ERR:
+       case DLI_TRC:
+       case DLI_REG:
+       case DLI_MEM:
+       case DLI_SPL:
+       case DLI_IRP:
+       case DLI_TIM:
+       case DLI_TAPI:
+       case DLI_NDIS:
+       case DLI_CONN:
+       case DLI_STAT:
+       case DLI_PRV0:
+       case DLI_PRV1:
+       case DLI_PRV2:
+       case DLI_PRV3:
+               if ((length = (unsigned long)vsprintf(&fmtBuf[0], format, ap)) > 0) {
+                       length += (sizeof(*pmsg) + 1);
+
+                       while (!(pmsg = (diva_dbg_entry_head_t *)queueAllocMsg(dbg_queue,
+                                                                              (word)length))) {
+                               if ((pmsg = (diva_dbg_entry_head_t *)queuePeekMsg(dbg_queue, &size))) {
+                                       queueFreeMsg(dbg_queue);
+                               } else {
+                                       break;
+                               }
+                       }
+
+                       pmsg->sequence    = dbg_sequence++;
+                       pmsg->time_sec    = sec;
+                       pmsg->time_usec   = usec;
+                       pmsg->facility    = MSG_TYPE_STRING;
+                       pmsg->dli         = type; /* DLI_XXX */
+                       pmsg->drv_id      = id;   /* driver MAINT id */
+                       pmsg->di_cpu      = 0;
+                       pmsg->data_length = length - sizeof(*pmsg);
+
+                       memcpy(&pmsg[1], fmtBuf, pmsg->data_length);
+                       queueCompleteMsg(pmsg);
+               }
+               break;
+
+       } /* switch type */
+
+
+       if (queueCount(dbg_queue)) {
+               diva_maint_wakeup_read();
+       }
+
+       if (do_lock) {
+               diva_os_leave_spin_lock(&dbg_q_lock, &old_irql, "format");
+       }
 }
 
 /*
   Write driver ID and driver revision to callers buffer
-  */
-int diva_get_driver_info (dword id, byte* data, int data_length) {
-  diva_os_spin_lock_magic_t old_irql;
-  byte* p = data;
-  int to_copy;
-
-  if (!data || !id || (data_length < 17) ||
-      (id >= ARRAY_SIZE(clients))) {
-    return (-1);
-  }
-
-  diva_os_enter_spin_lock (&dbg_q_lock, &old_irql, "driver info");
-
-  if (clients[id].hDbg) {
-    *p++ = 1;
-    *p++ = (byte)clients[id].sec; /* save seconds */
-    *p++ = (byte)(clients[id].sec >>  8);
-    *p++ = (byte)(clients[id].sec >> 16);
-    *p++ = (byte)(clients[id].sec >> 24);
-
-    *p++ = (byte)(clients[id].usec/1000); /* save mseconds */
-    *p++ = (byte)((clients[id].usec/1000) >>  8);
-    *p++ = (byte)((clients[id].usec/1000) >> 16);
-    *p++ = (byte)((clients[id].usec/1000) >> 24);
-
-    data_length -= 9;
-
-    if ((to_copy = min(strlen(clients[id].drvName), (size_t)(data_length-1)))) {
-      memcpy (p, clients[id].drvName, to_copy);
-      p += to_copy;
-      data_length -= to_copy;
-      if ((data_length >= 4) && clients[id].hDbg->drvTag[0]) {
-        *p++ = '(';
-        data_length -= 1;
-        if ((to_copy = min(strlen(clients[id].hDbg->drvTag), (size_t)(data_length-2)))) {
-          memcpy (p, clients[id].hDbg->drvTag, to_copy);
-          p += to_copy;
-          data_length -= to_copy;
-          if (data_length >= 2) {
-            *p++ = ')';
-            data_length--;
-          }
-        }
-      }
-    }
-  }
-  *p++ = 0;
-
-  diva_os_leave_spin_lock (&dbg_q_lock, &old_irql, "driver info");
-
-  return (p - data);
-}
+*/
+int diva_get_driver_info(dword id, byte *data, int data_length) {
+       diva_os_spin_lock_magic_t old_irql;
+       byte *p = data;
+       int to_copy;
+
+       if (!data || !id || (data_length < 17) ||
+           (id >= ARRAY_SIZE(clients))) {
+               return (-1);
+       }
 
-int diva_get_driver_dbg_mask (dword id, byte* data) {
-  diva_os_spin_lock_magic_t old_irql;
-  int ret = -1;
+       diva_os_enter_spin_lock(&dbg_q_lock, &old_irql, "driver info");
+
+       if (clients[id].hDbg) {
+               *p++ = 1;
+               *p++ = (byte)clients[id].sec; /* save seconds */
+               *p++ = (byte)(clients[id].sec >>  8);
+               *p++ = (byte)(clients[id].sec >> 16);
+               *p++ = (byte)(clients[id].sec >> 24);
+
+               *p++ = (byte)(clients[id].usec / 1000); /* save mseconds */
+               *p++ = (byte)((clients[id].usec / 1000) >>  8);
+               *p++ = (byte)((clients[id].usec / 1000) >> 16);
+               *p++ = (byte)((clients[id].usec / 1000) >> 24);
+
+               data_length -= 9;
+
+               if ((to_copy = min(strlen(clients[id].drvName), (size_t)(data_length - 1)))) {
+                       memcpy(p, clients[id].drvName, to_copy);
+                       p += to_copy;
+                       data_length -= to_copy;
+                       if ((data_length >= 4) && clients[id].hDbg->drvTag[0]) {
+                               *p++ = '(';
+                               data_length -= 1;
+                               if ((to_copy = min(strlen(clients[id].hDbg->drvTag), (size_t)(data_length - 2)))) {
+                                       memcpy(p, clients[id].hDbg->drvTag, to_copy);
+                                       p += to_copy;
+                                       data_length -= to_copy;
+                                       if (data_length >= 2) {
+                                               *p++ = ')';
+                                               data_length--;
+                                       }
+                               }
+                       }
+               }
+       }
+       *p++ = 0;
 
-  if (!data || !id || (id >= ARRAY_SIZE(clients))) {
-    return (-1);
-  }
-  diva_os_enter_spin_lock (&dbg_q_lock, &old_irql, "driver info");
+       diva_os_leave_spin_lock(&dbg_q_lock, &old_irql, "driver info");
 
-  if (clients[id].hDbg) {
-    ret = 4;
-    *data++= (byte)(clients[id].hDbg->dbgMask);
-    *data++= (byte)(clients[id].hDbg->dbgMask >>  8);
-    *data++= (byte)(clients[id].hDbg->dbgMask >> 16);
-    *data++= (byte)(clients[id].hDbg->dbgMask >> 24);
-  }
+       return (p - data);
+}
+
+int diva_get_driver_dbg_mask(dword id, byte *data) {
+       diva_os_spin_lock_magic_t old_irql;
+       int ret = -1;
+
+       if (!data || !id || (id >= ARRAY_SIZE(clients))) {
+               return (-1);
+       }
+       diva_os_enter_spin_lock(&dbg_q_lock, &old_irql, "driver info");
+
+       if (clients[id].hDbg) {
+               ret = 4;
+               *data++ = (byte)(clients[id].hDbg->dbgMask);
+               *data++ = (byte)(clients[id].hDbg->dbgMask >>  8);
+               *data++ = (byte)(clients[id].hDbg->dbgMask >> 16);
+               *data++ = (byte)(clients[id].hDbg->dbgMask >> 24);
+       }
 
-  diva_os_leave_spin_lock (&dbg_q_lock, &old_irql, "driver info");
+       diva_os_leave_spin_lock(&dbg_q_lock, &old_irql, "driver info");
 
-  return (ret);
+       return (ret);
 }
 
-int diva_set_driver_dbg_mask (dword id, dword mask) {
-  diva_os_spin_lock_magic_t old_irql, old_irql1;
-  int ret = -1;
-  
+int diva_set_driver_dbg_mask(dword id, dword mask) {
+       diva_os_spin_lock_magic_t old_irql, old_irql1;
+       int ret = -1;
 
-  if (!id || (id >= ARRAY_SIZE(clients))) {
-    return (-1);
-  }
 
-  diva_os_enter_spin_lock (&dbg_adapter_lock, &old_irql1, "dbg mask");
-  diva_os_enter_spin_lock (&dbg_q_lock, &old_irql, "dbg mask");
+       if (!id || (id >= ARRAY_SIZE(clients))) {
+               return (-1);
+       }
 
-  if (clients[id].hDbg) {
-    dword old_mask = clients[id].hDbg->dbgMask;
-    mask &= 0x7fffffff;
-    clients[id].hDbg->dbgMask = mask;
-    clients[id].last_dbgMask = (clients[id].hDbg->dbgMask | clients[id].dbgMask);
-    ret = 4;
-    diva_change_management_debug_mask (&clients[id], old_mask);
-  }
+       diva_os_enter_spin_lock(&dbg_adapter_lock, &old_irql1, "dbg mask");
+       diva_os_enter_spin_lock(&dbg_q_lock, &old_irql, "dbg mask");
 
+       if (clients[id].hDbg) {
+               dword old_mask = clients[id].hDbg->dbgMask;
+               mask &= 0x7fffffff;
+               clients[id].hDbg->dbgMask = mask;
+               clients[id].last_dbgMask = (clients[id].hDbg->dbgMask | clients[id].dbgMask);
+               ret = 4;
+               diva_change_management_debug_mask(&clients[id], old_mask);
+       }
 
-  diva_os_leave_spin_lock (&dbg_q_lock, &old_irql, "dbg mask");
 
-  if (clients[id].request_pending) {
-    clients[id].request_pending = 0;
-    (*(clients[id].request))((ENTITY*)(*(clients[id].pIdiLib->DivaSTraceGetHandle))(clients[id].pIdiLib->hLib));
-  }
+       diva_os_leave_spin_lock(&dbg_q_lock, &old_irql, "dbg mask");
 
-  diva_os_leave_spin_lock (&dbg_adapter_lock, &old_irql1, "dbg mask");
+       if (clients[id].request_pending) {
+               clients[id].request_pending = 0;
+               (*(clients[id].request))((ENTITY *)(*(clients[id].pIdiLib->DivaSTraceGetHandle))(clients[id].pIdiLib->hLib));
+       }
+
+       diva_os_leave_spin_lock(&dbg_adapter_lock, &old_irql1, "dbg mask");
 
-  return (ret);
+       return (ret);
 }
 
-static int diva_get_idi_adapter_info (IDI_CALL request, dword* serial, dword* logical) {
-  IDI_SYNC_REQ sync_req;
+static int diva_get_idi_adapter_info(IDI_CALL request, dword *serial, dword *logical) {
+       IDI_SYNC_REQ sync_req;
 
-  sync_req.xdi_logical_adapter_number.Req = 0;
-  sync_req.xdi_logical_adapter_number.Rc = IDI_SYNC_REQ_XDI_GET_LOGICAL_ADAPTER_NUMBER;
-  (*request)((ENTITY *)&sync_req);
-  *logical = sync_req.xdi_logical_adapter_number.info.logical_adapter_number;
+       sync_req.xdi_logical_adapter_number.Req = 0;
+       sync_req.xdi_logical_adapter_number.Rc = IDI_SYNC_REQ_XDI_GET_LOGICAL_ADAPTER_NUMBER;
+       (*request)((ENTITY *)&sync_req);
+       *logical = sync_req.xdi_logical_adapter_number.info.logical_adapter_number;
 
-  sync_req.GetSerial.Req = 0;
-  sync_req.GetSerial.Rc = IDI_SYNC_REQ_GET_SERIAL;
-  sync_req.GetSerial.serial = 0;
-  (*request)((ENTITY *)&sync_req);
+       sync_req.GetSerial.Req = 0;
+       sync_req.GetSerial.Rc = IDI_SYNC_REQ_GET_SERIAL;
+       sync_req.GetSerial.serial = 0;
+       (*request)((ENTITY *)&sync_req);
        *serial = sync_req.GetSerial.serial;
 
-  return (0);
+       return (0);
 }
 
 /*
   Register XDI adapter as MAINT compatible driver
-  */
-void diva_mnt_add_xdi_adapter (const DESCRIPTOR* d) {
-  diva_os_spin_lock_magic_t old_irql, old_irql1;
-  dword sec, usec, logical, serial, org_mask;
-  int id, free_id = -1;
-  char tmp[128];
-  diva_dbg_entry_head_t* pmsg = NULL;
-  int len;
-  word size;
-  byte* pmem;
-
-  diva_os_get_time (&sec, &usec);
-  diva_get_idi_adapter_info (d->request, &serial, &logical);
-  if (serial & 0xff000000) {
-    sprintf (tmp, "ADAPTER:%d SN:%u-%d",
-             (int)logical,
-             serial & 0x00ffffff,
-             (byte)(((serial & 0xff000000) >> 24) + 1));
-  } else {
-    sprintf (tmp, "ADAPTER:%d SN:%u", (int)logical, serial);
-  }
-
-  if (!(pmem = diva_os_malloc (0, DivaSTraceGetMemotyRequirement (d->channels)))) {
-    return;
-  }
-  memset (pmem, 0x00, DivaSTraceGetMemotyRequirement (d->channels));
-
-  diva_os_enter_spin_lock (&dbg_adapter_lock, &old_irql1, "register");
-  diva_os_enter_spin_lock (&dbg_q_lock, &old_irql, "register");
-
-  for (id = 1; id < ARRAY_SIZE(clients); id++) {
-    if (clients[id].hDbg && (clients[id].request == d->request)) {
-      diva_os_leave_spin_lock (&dbg_q_lock, &old_irql, "register");
-      diva_os_leave_spin_lock (&dbg_adapter_lock, &old_irql1, "register");
-      diva_os_free(0, pmem);
-      return;
-    }
-    if (clients[id].hDbg) { /* slot is busy */
-      continue;
-    }
-    if (free_id < 0) {
-      free_id = id;
-    }
-    if (!strcmp (clients[id].drvName, tmp)) {
-      /*
-        This driver was already registered with this name
-        and slot is still free - reuse it
-        */
-      free_id = id;
-      break;
-    }
-  }
-
-  if (free_id < 0) {
-    diva_os_leave_spin_lock (&dbg_q_lock, &old_irql, "register");
-    diva_os_leave_spin_lock (&dbg_adapter_lock, &old_irql1, "register");
-    diva_os_free (0, pmem);
-    return;
-  }
-
-  id = free_id;
-  clients[id].request  = d->request;
-  clients[id].request_pending = 0;
-  clients[id].hDbg     = &clients[id].Dbg;
-  clients[id].sec      = sec;
-  clients[id].usec     = usec;
-  strcpy (clients[id].drvName,     tmp);
-  strcpy (clients[id].Dbg.drvName, tmp);
-  clients[id].Dbg.drvTag[0] = 0;
-  clients[id].logical  = (int)logical;
-  clients[id].channels = (int)d->channels;
-  clients[id].dma_handle = -1;
-
-  clients[id].Dbg.dbgMask    = 0;
-  clients[id].dbgMask        = clients[id].Dbg.dbgMask;
-  if (id) {
-    clients[id].Dbg.dbgMask |= clients[free_id].last_dbgMask;
-  } else {
-    clients[id].last_dbgMask = 0;
-  }
-  clients[id].Dbg.Registered = DBG_HANDLE_REG_NEW;
-  clients[id].Dbg.id         = (byte)id;
-  clients[id].Dbg.dbg_end    = DI_deregister;
-  clients[id].Dbg.dbg_prt    = DI_format_locked;
-  clients[id].Dbg.dbg_ev     = DiProcessEventLog;
-  clients[id].Dbg.dbg_irq    = DI_format_locked;
-  clients[id].Dbg.next       = (pDbgHandle)DBG_MAGIC;
-
-  {
-    diva_trace_library_user_interface_t diva_maint_user_ifc = { &clients[id],
-                                                                                                                                                                                        diva_maint_state_change_notify,
-                                                                                                                                                                                        diva_maint_trace_notify,
-                                                                                                                                                                                        diva_maint_error };
-
-    /*
-      Attach to adapter management interface
-      */
-    if ((clients[id].pIdiLib =
-               DivaSTraceLibraryCreateInstance ((int)logical, &diva_maint_user_ifc, pmem))) {
-      if (((*(clients[id].pIdiLib->DivaSTraceLibraryStart))(clients[id].pIdiLib->hLib))) {
-        diva_mnt_internal_dprintf (0, DLI_ERR, "Adapter(%d) Start failed", (int)logical);
-        (*(clients[id].pIdiLib->DivaSTraceLibraryFinit))(clients[id].pIdiLib->hLib);
-        clients[id].pIdiLib = NULL;
-      }
-    } else {
-      diva_mnt_internal_dprintf (0, DLI_ERR, "A(%d) management init failed", (int)logical);
-    }
-  }
-
-  if (!clients[id].pIdiLib) {
-    clients[id].request = NULL;
-    clients[id].request_pending = 0;
-    clients[id].hDbg    = NULL;
-    diva_os_leave_spin_lock (&dbg_q_lock, &old_irql, "register");
-    diva_os_leave_spin_lock (&dbg_adapter_lock, &old_irql1, "register");
-    diva_os_free (0, pmem);
-    return;
-  }
-
-  /*
-    Log driver register, MAINT driver ID is '0'
-    */
-  len = sprintf (tmp, "DIMAINT - drv # %d = '%s' registered",
-                 id, clients[id].Dbg.drvName);
-
-  while (!(pmsg = (diva_dbg_entry_head_t*)queueAllocMsg (dbg_queue,
-                                      (word)(len+1+sizeof(*pmsg))))) {
-    if ((pmsg = (diva_dbg_entry_head_t*)queuePeekMsg (dbg_queue, &size))) {
-      queueFreeMsg (dbg_queue);
-    } else {
-      break;
-    }
-  }
-
-  if (pmsg) {
-    pmsg->sequence    = dbg_sequence++;
-    pmsg->time_sec    = sec;
-    pmsg->time_usec   = usec;
-    pmsg->facility    = MSG_TYPE_STRING;
-    pmsg->dli         = DLI_REG;
-    pmsg->drv_id      = 0; /* id 0 - DIMAINT */
-    pmsg->di_cpu      = 0;
-    pmsg->data_length = len+1;
-
-    memcpy (&pmsg[1], tmp, len+1);
-    queueCompleteMsg (pmsg);
-    diva_maint_wakeup_read();
-  }
-
-  org_mask = clients[id].Dbg.dbgMask;
-  clients[id].Dbg.dbgMask = 0;
-
-  diva_os_leave_spin_lock (&dbg_q_lock, &old_irql, "register");
-
-  if (clients[id].request_pending) {
-    clients[id].request_pending = 0;
-    (*(clients[id].request))((ENTITY*)(*(clients[id].pIdiLib->DivaSTraceGetHandle))(clients[id].pIdiLib->hLib));
-  }
-
-  diva_os_leave_spin_lock (&dbg_adapter_lock, &old_irql1, "register");
-
-       diva_set_driver_dbg_mask (id, org_mask);
+*/
+void diva_mnt_add_xdi_adapter(const DESCRIPTOR *d) {
+       diva_os_spin_lock_magic_t old_irql, old_irql1;
+       dword sec, usec, logical, serial, org_mask;
+       int id, free_id = -1;
+       char tmp[128];
+       diva_dbg_entry_head_t *pmsg = NULL;
+       int len;
+       word size;
+       byte *pmem;
+
+       diva_os_get_time(&sec, &usec);
+       diva_get_idi_adapter_info(d->request, &serial, &logical);
+       if (serial & 0xff000000) {
+               sprintf(tmp, "ADAPTER:%d SN:%u-%d",
+                       (int)logical,
+                       serial & 0x00ffffff,
+                       (byte)(((serial & 0xff000000) >> 24) + 1));
+       } else {
+               sprintf(tmp, "ADAPTER:%d SN:%u", (int)logical, serial);
+       }
+
+       if (!(pmem = diva_os_malloc(0, DivaSTraceGetMemotyRequirement(d->channels)))) {
+               return;
+       }
+       memset(pmem, 0x00, DivaSTraceGetMemotyRequirement(d->channels));
+
+       diva_os_enter_spin_lock(&dbg_adapter_lock, &old_irql1, "register");
+       diva_os_enter_spin_lock(&dbg_q_lock, &old_irql, "register");
+
+       for (id = 1; id < ARRAY_SIZE(clients); id++) {
+               if (clients[id].hDbg && (clients[id].request == d->request)) {
+                       diva_os_leave_spin_lock(&dbg_q_lock, &old_irql, "register");
+                       diva_os_leave_spin_lock(&dbg_adapter_lock, &old_irql1, "register");
+                       diva_os_free(0, pmem);
+                       return;
+               }
+               if (clients[id].hDbg) { /* slot is busy */
+                       continue;
+               }
+               if (free_id < 0) {
+                       free_id = id;
+               }
+               if (!strcmp(clients[id].drvName, tmp)) {
+                       /*
+                         This driver was already registered with this name
+                         and slot is still free - reuse it
+                       */
+                       free_id = id;
+                       break;
+               }
+       }
+
+       if (free_id < 0) {
+               diva_os_leave_spin_lock(&dbg_q_lock, &old_irql, "register");
+               diva_os_leave_spin_lock(&dbg_adapter_lock, &old_irql1, "register");
+               diva_os_free(0, pmem);
+               return;
+       }
+
+       id = free_id;
+       clients[id].request  = d->request;
+       clients[id].request_pending = 0;
+       clients[id].hDbg     = &clients[id].Dbg;
+       clients[id].sec      = sec;
+       clients[id].usec     = usec;
+       strcpy(clients[id].drvName,     tmp);
+       strcpy(clients[id].Dbg.drvName, tmp);
+       clients[id].Dbg.drvTag[0] = 0;
+       clients[id].logical  = (int)logical;
+       clients[id].channels = (int)d->channels;
+       clients[id].dma_handle = -1;
+
+       clients[id].Dbg.dbgMask    = 0;
+       clients[id].dbgMask        = clients[id].Dbg.dbgMask;
+       if (id) {
+               clients[id].Dbg.dbgMask |= clients[free_id].last_dbgMask;
+       } else {
+               clients[id].last_dbgMask = 0;
+       }
+       clients[id].Dbg.Registered = DBG_HANDLE_REG_NEW;
+       clients[id].Dbg.id         = (byte)id;
+       clients[id].Dbg.dbg_end    = DI_deregister;
+       clients[id].Dbg.dbg_prt    = DI_format_locked;
+       clients[id].Dbg.dbg_ev     = DiProcessEventLog;
+       clients[id].Dbg.dbg_irq    = DI_format_locked;
+       clients[id].Dbg.next       = (pDbgHandle)DBG_MAGIC;
+
+       {
+               diva_trace_library_user_interface_t diva_maint_user_ifc = { &clients[id],
+                                                                           diva_maint_state_change_notify,
+                                                                           diva_maint_trace_notify,
+                                                                           diva_maint_error };
+
+               /*
+                 Attach to adapter management interface
+               */
+               if ((clients[id].pIdiLib =
+                    DivaSTraceLibraryCreateInstance((int)logical, &diva_maint_user_ifc, pmem))) {
+                       if (((*(clients[id].pIdiLib->DivaSTraceLibraryStart))(clients[id].pIdiLib->hLib))) {
+                               diva_mnt_internal_dprintf(0, DLI_ERR, "Adapter(%d) Start failed", (int)logical);
+                               (*(clients[id].pIdiLib->DivaSTraceLibraryFinit))(clients[id].pIdiLib->hLib);
+                               clients[id].pIdiLib = NULL;
+                       }
+               } else {
+                       diva_mnt_internal_dprintf(0, DLI_ERR, "A(%d) management init failed", (int)logical);
+               }
+       }
+
+       if (!clients[id].pIdiLib) {
+               clients[id].request = NULL;
+               clients[id].request_pending = 0;
+               clients[id].hDbg    = NULL;
+               diva_os_leave_spin_lock(&dbg_q_lock, &old_irql, "register");
+               diva_os_leave_spin_lock(&dbg_adapter_lock, &old_irql1, "register");
+               diva_os_free(0, pmem);
+               return;
+       }
+
+       /*
+         Log driver register, MAINT driver ID is '0'
+       */
+       len = sprintf(tmp, "DIMAINT - drv # %d = '%s' registered",
+                     id, clients[id].Dbg.drvName);
+
+       while (!(pmsg = (diva_dbg_entry_head_t *)queueAllocMsg(dbg_queue,
+                                                              (word)(len + 1 + sizeof(*pmsg))))) {
+               if ((pmsg = (diva_dbg_entry_head_t *)queuePeekMsg(dbg_queue, &size))) {
+                       queueFreeMsg(dbg_queue);
+               } else {
+                       break;
+               }
+       }
+
+       if (pmsg) {
+               pmsg->sequence    = dbg_sequence++;
+               pmsg->time_sec    = sec;
+               pmsg->time_usec   = usec;
+               pmsg->facility    = MSG_TYPE_STRING;
+               pmsg->dli         = DLI_REG;
+               pmsg->drv_id      = 0; /* id 0 - DIMAINT */
+               pmsg->di_cpu      = 0;
+               pmsg->data_length = len + 1;
+
+               memcpy(&pmsg[1], tmp, len + 1);
+               queueCompleteMsg(pmsg);
+               diva_maint_wakeup_read();
+       }
+
+       org_mask = clients[id].Dbg.dbgMask;
+       clients[id].Dbg.dbgMask = 0;
+
+       diva_os_leave_spin_lock(&dbg_q_lock, &old_irql, "register");
+
+       if (clients[id].request_pending) {
+               clients[id].request_pending = 0;
+               (*(clients[id].request))((ENTITY *)(*(clients[id].pIdiLib->DivaSTraceGetHandle))(clients[id].pIdiLib->hLib));
+       }
+
+       diva_os_leave_spin_lock(&dbg_adapter_lock, &old_irql1, "register");
+
+       diva_set_driver_dbg_mask(id, org_mask);
 }
 
 /*
   De-Register XDI adapter
-  */
-void diva_mnt_remove_xdi_adapter (const DESCRIPTOR* d) {
-  diva_os_spin_lock_magic_t old_irql, old_irql1;
-  dword sec, usec;
-  int i;
-  word size;
-  byte* pmem = NULL;
-
-  diva_os_get_time (&sec, &usec);
-
-  diva_os_enter_spin_lock (&dbg_adapter_lock, &old_irql1, "read");
-  diva_os_enter_spin_lock (&dbg_q_lock, &old_irql, "read");
-
-  for (i = 1; i < ARRAY_SIZE(clients); i++) {
-    if (clients[i].hDbg && (clients[i].request == d->request)) {
-      diva_dbg_entry_head_t* pmsg;
-      char tmp[256];
-      int len;
-
-      if (clients[i].pIdiLib) {
-        (*(clients[i].pIdiLib->DivaSTraceLibraryFinit))(clients[i].pIdiLib->hLib);
-        clients[i].pIdiLib = NULL;
-
-        pmem = clients[i].pmem;
-        clients[i].pmem = NULL;
-      }
-
-      clients[i].hDbg    = NULL;
-      clients[i].request_pending = 0;
-      if (clients[i].dma_handle >= 0) {
-        /*
-          Free DMA handle
-          */
-        diva_free_dma_descriptor (clients[i].request, clients[i].dma_handle);
-        clients[i].dma_handle = -1;
-      }
-      clients[i].request = NULL;
-
-      /*
-        Log driver register, MAINT driver ID is '0'
-        */
-      len = sprintf (tmp, "DIMAINT - drv # %d = '%s' de-registered",
-                     i, clients[i].Dbg.drvName);
-
-      memset (&clients[i].Dbg, 0x00, sizeof(clients[i].Dbg));
-
-      while (!(pmsg = (diva_dbg_entry_head_t*)queueAllocMsg (dbg_queue,
-                                        (word)(len+1+sizeof(*pmsg))))) {
-        if ((pmsg = (diva_dbg_entry_head_t*)queuePeekMsg (dbg_queue, &size))) {
-          queueFreeMsg (dbg_queue);
-        } else {
-          break;
-        }
-      }
-
-      if (pmsg) {
-        pmsg->sequence    = dbg_sequence++;
-        pmsg->time_sec    = sec;
-        pmsg->time_usec   = usec;
-        pmsg->facility    = MSG_TYPE_STRING;
-        pmsg->dli         = DLI_REG;
-        pmsg->drv_id      = 0; /* id 0 - DIMAINT */
-        pmsg->di_cpu      = 0;
-        pmsg->data_length = len+1;
-
-        memcpy (&pmsg[1], tmp, len+1);
-                 queueCompleteMsg (pmsg);
-        diva_maint_wakeup_read();
-      }
-
-      break;
-    }
-  }
-
-  diva_os_leave_spin_lock (&dbg_q_lock, &old_irql, "read_ack");
-  diva_os_leave_spin_lock (&dbg_adapter_lock, &old_irql1, "read_ack");
-
-  if (pmem) {
-    diva_os_free (0, pmem);
-  }
+*/
+void diva_mnt_remove_xdi_adapter(const DESCRIPTOR *d) {
+       diva_os_spin_lock_magic_t old_irql, old_irql1;
+       dword sec, usec;
+       int i;
+       word size;
+       byte *pmem = NULL;
+
+       diva_os_get_time(&sec, &usec);
+
+       diva_os_enter_spin_lock(&dbg_adapter_lock, &old_irql1, "read");
+       diva_os_enter_spin_lock(&dbg_q_lock, &old_irql, "read");
+
+       for (i = 1; i < ARRAY_SIZE(clients); i++) {
+               if (clients[i].hDbg && (clients[i].request == d->request)) {
+                       diva_dbg_entry_head_t *pmsg;
+                       char tmp[256];
+                       int len;
+
+                       if (clients[i].pIdiLib) {
+                               (*(clients[i].pIdiLib->DivaSTraceLibraryFinit))(clients[i].pIdiLib->hLib);
+                               clients[i].pIdiLib = NULL;
+
+                               pmem = clients[i].pmem;
+                               clients[i].pmem = NULL;
+                       }
+
+                       clients[i].hDbg    = NULL;
+                       clients[i].request_pending = 0;
+                       if (clients[i].dma_handle >= 0) {
+                               /*
+                                 Free DMA handle
+                               */
+                               diva_free_dma_descriptor(clients[i].request, clients[i].dma_handle);
+                               clients[i].dma_handle = -1;
+                       }
+                       clients[i].request = NULL;
+
+                       /*
+                         Log driver register, MAINT driver ID is '0'
+                       */
+                       len = sprintf(tmp, "DIMAINT - drv # %d = '%s' de-registered",
+                                     i, clients[i].Dbg.drvName);
+
+                       memset(&clients[i].Dbg, 0x00, sizeof(clients[i].Dbg));
+
+                       while (!(pmsg = (diva_dbg_entry_head_t *)queueAllocMsg(dbg_queue,
+                                                                              (word)(len + 1 + sizeof(*pmsg))))) {
+                               if ((pmsg = (diva_dbg_entry_head_t *)queuePeekMsg(dbg_queue, &size))) {
+                                       queueFreeMsg(dbg_queue);
+                               } else {
+                                       break;
+                               }
+                       }
+
+                       if (pmsg) {
+                               pmsg->sequence    = dbg_sequence++;
+                               pmsg->time_sec    = sec;
+                               pmsg->time_usec   = usec;
+                               pmsg->facility    = MSG_TYPE_STRING;
+                               pmsg->dli         = DLI_REG;
+                               pmsg->drv_id      = 0; /* id 0 - DIMAINT */
+                               pmsg->di_cpu      = 0;
+                               pmsg->data_length = len + 1;
+
+                               memcpy(&pmsg[1], tmp, len + 1);
+                               queueCompleteMsg(pmsg);
+                               diva_maint_wakeup_read();
+                       }
+
+                       break;
+               }
+       }
+
+       diva_os_leave_spin_lock(&dbg_q_lock, &old_irql, "read_ack");
+       diva_os_leave_spin_lock(&dbg_adapter_lock, &old_irql1, "read_ack");
+
+       if (pmem) {
+               diva_os_free(0, pmem);
+       }
 }
 
 /* ----------------------------------------------------------------
-     Low level interface for management interface client
+   Low level interface for management interface client
    ---------------------------------------------------------------- */
 /*
   Return handle to client structure
-  */
-void* SuperTraceOpenAdapter   (int AdapterNumber) {
-  int i;
+*/
+void *SuperTraceOpenAdapter(int AdapterNumber) {
+       int i;
 
-  for (i = 1; i < ARRAY_SIZE(clients); i++) {
-    if (clients[i].hDbg && clients[i].request && (clients[i].logical == AdapterNumber)) {
-      return (&clients[i]);
-    }
-  }
+       for (i = 1; i < ARRAY_SIZE(clients); i++) {
+               if (clients[i].hDbg && clients[i].request && (clients[i].logical == AdapterNumber)) {
+                       return (&clients[i]);
+               }
+       }
 
-  return NULL;
+       return NULL;
 }
 
-int SuperTraceCloseAdapter  (void* AdapterHandle) {
-  return (0);
+int SuperTraceCloseAdapter(void *AdapterHandle) {
+       return (0);
 }
 
-int SuperTraceReadRequest (void* AdapterHandle, const char* name, byte* data) {
-  diva_maint_client_t* pC = (diva_maint_client_t*)AdapterHandle;
+int SuperTraceReadRequest(void *AdapterHandle, const char *name, byte *data) {
+       diva_maint_client_t *pC = (diva_maint_client_t *)AdapterHandle;
 
-  if (pC && pC->pIdiLib && pC->request) {
-    ENTITY* e = (ENTITY*)(*(pC->pIdiLib->DivaSTraceGetHandle))(pC->pIdiLib->hLib);
-    byte* xdata = (byte*)&pC->xbuffer[0];
-    char tmp = 0;
-    word length;
+       if (pC && pC->pIdiLib && pC->request) {
+               ENTITY *e = (ENTITY *)(*(pC->pIdiLib->DivaSTraceGetHandle))(pC->pIdiLib->hLib);
+               byte *xdata = (byte *)&pC->xbuffer[0];
+               char tmp = 0;
+               word length;
 
-    if (!strcmp(name, "\\")) { /* Read ROOT */
-      name = &tmp;
-    }
-    length = SuperTraceCreateReadReq (xdata, name);
-    single_p (xdata, &length, 0); /* End Of Message */
+               if (!strcmp(name, "\\")) { /* Read ROOT */
+                       name = &tmp;
+               }
+               length = SuperTraceCreateReadReq(xdata, name);
+               single_p(xdata, &length, 0); /* End Of Message */
 
-    e->Req        = MAN_READ;
-    e->ReqCh      = 0;
-    e->X->PLength = length;
-    e->X->P                      = (byte*)xdata;
+               e->Req        = MAN_READ;
+               e->ReqCh      = 0;
+               e->X->PLength = length;
+               e->X->P = (byte *)xdata;
 
-    pC->request_pending = 1;
+               pC->request_pending = 1;
 
-    return (0);
-  }
+               return (0);
+       }
 
-  return (-1);
+       return (-1);
 }
 
-int SuperTraceGetNumberOfChannels (void* AdapterHandle) {
-  if (AdapterHandle) {
-    diva_maint_client_t* pC = (diva_maint_client_t*)AdapterHandle;
+int SuperTraceGetNumberOfChannels(void *AdapterHandle) {
+       if (AdapterHandle) {
+               diva_maint_client_t *pC = (diva_maint_client_t *)AdapterHandle;
 
-    return (pC->channels);
-  }
+               return (pC->channels);
+       }
 
-  return (0);
+       return (0);
 }
 
-int SuperTraceASSIGN (void* AdapterHandle, byte* data) {
-  diva_maint_client_t* pC = (diva_maint_client_t*)AdapterHandle;
-
-  if (pC && pC->pIdiLib && pC->request) {
-    ENTITY* e = (ENTITY*)(*(pC->pIdiLib->DivaSTraceGetHandle))(pC->pIdiLib->hLib);
-    IDI_SYNC_REQ* preq;
-    char buffer[((sizeof(preq->xdi_extended_features)+4) > sizeof(ENTITY)) ? (sizeof(preq->xdi_extended_features)+4) : sizeof(ENTITY)];
-    char features[4];
-    word assign_data_length = 1;
-
-    features[0] = 0;
-    pC->xbuffer[0] = 0;
-    preq = (IDI_SYNC_REQ*)&buffer[0];
-    preq->xdi_extended_features.Req = 0;
-    preq->xdi_extended_features.Rc  = IDI_SYNC_REQ_XDI_GET_EXTENDED_FEATURES;
-    preq->xdi_extended_features.info.buffer_length_in_bytes = sizeof(features);
-    preq->xdi_extended_features.info.features = &features[0];
-
-    (*(pC->request))((ENTITY*)preq);
-
-    if ((features[0] & DIVA_XDI_EXTENDED_FEATURES_VALID) &&
-        (features[0] & DIVA_XDI_EXTENDED_FEATURE_MANAGEMENT_DMA)) {
-      dword uninitialized_var(rx_dma_magic);
-      if ((pC->dma_handle = diva_get_dma_descriptor (pC->request, &rx_dma_magic)) >= 0) {
-        pC->xbuffer[0] = LLI;
-        pC->xbuffer[1] = 8;
-        pC->xbuffer[2] = 0x40;
-        pC->xbuffer[3] = (byte)pC->dma_handle;
-        pC->xbuffer[4] = (byte)rx_dma_magic;
-        pC->xbuffer[5] = (byte)(rx_dma_magic >>  8);
-        pC->xbuffer[6] = (byte)(rx_dma_magic >> 16);
-        pC->xbuffer[7] = (byte)(rx_dma_magic >> 24);
-       pC->xbuffer[8] = (byte)(DIVA_MAX_MANAGEMENT_TRANSFER_SIZE & 0xFF);
-        pC->xbuffer[9] = (byte)(DIVA_MAX_MANAGEMENT_TRANSFER_SIZE >> 8);
-        pC->xbuffer[10] = 0;
-
-        assign_data_length = 11;
-      }
-    } else {
-      pC->dma_handle = -1;
-    }
-
-    e->Id          = MAN_ID;
-    e->callback    = diva_maint_xdi_cb;
-    e->XNum        = 1;
-    e->X           = &pC->XData;
-    e->Req         = ASSIGN;
-    e->ReqCh       = 0;
-    e->X->PLength  = assign_data_length;
-    e->X->P        = (byte*)&pC->xbuffer[0];
-
-    pC->request_pending = 1;
-
-    return (0);
-  }
-
-  return (-1);
+int SuperTraceASSIGN(void *AdapterHandle, byte *data) {
+       diva_maint_client_t *pC = (diva_maint_client_t *)AdapterHandle;
+
+       if (pC && pC->pIdiLib && pC->request) {
+               ENTITY *e = (ENTITY *)(*(pC->pIdiLib->DivaSTraceGetHandle))(pC->pIdiLib->hLib);
+               IDI_SYNC_REQ *preq;
+               char buffer[((sizeof(preq->xdi_extended_features) + 4) > sizeof(ENTITY)) ? (sizeof(preq->xdi_extended_features) + 4) : sizeof(ENTITY)];
+               char features[4];
+               word assign_data_length = 1;
+
+               features[0] = 0;
+               pC->xbuffer[0] = 0;
+               preq = (IDI_SYNC_REQ *)&buffer[0];
+               preq->xdi_extended_features.Req = 0;
+               preq->xdi_extended_features.Rc  = IDI_SYNC_REQ_XDI_GET_EXTENDED_FEATURES;
+               preq->xdi_extended_features.info.buffer_length_in_bytes = sizeof(features);
+               preq->xdi_extended_features.info.features = &features[0];
+
+               (*(pC->request))((ENTITY *)preq);
+
+               if ((features[0] & DIVA_XDI_EXTENDED_FEATURES_VALID) &&
+                   (features[0] & DIVA_XDI_EXTENDED_FEATURE_MANAGEMENT_DMA)) {
+                       dword uninitialized_var(rx_dma_magic);
+                       if ((pC->dma_handle = diva_get_dma_descriptor(pC->request, &rx_dma_magic)) >= 0) {
+                               pC->xbuffer[0] = LLI;
+                               pC->xbuffer[1] = 8;
+                               pC->xbuffer[2] = 0x40;
+                               pC->xbuffer[3] = (byte)pC->dma_handle;
+                               pC->xbuffer[4] = (byte)rx_dma_magic;
+                               pC->xbuffer[5] = (byte)(rx_dma_magic >>  8);
+                               pC->xbuffer[6] = (byte)(rx_dma_magic >> 16);
+                               pC->xbuffer[7] = (byte)(rx_dma_magic >> 24);
+                               pC->xbuffer[8] = (byte)(DIVA_MAX_MANAGEMENT_TRANSFER_SIZE & 0xFF);
+                               pC->xbuffer[9] = (byte)(DIVA_MAX_MANAGEMENT_TRANSFER_SIZE >> 8);
+                               pC->xbuffer[10] = 0;
+
+                               assign_data_length = 11;
+                       }
+               } else {
+                       pC->dma_handle = -1;
+               }
+
+               e->Id          = MAN_ID;
+               e->callback    = diva_maint_xdi_cb;
+               e->XNum        = 1;
+               e->X           = &pC->XData;
+               e->Req         = ASSIGN;
+               e->ReqCh       = 0;
+               e->X->PLength  = assign_data_length;
+               e->X->P        = (byte *)&pC->xbuffer[0];
+
+               pC->request_pending = 1;
+
+               return (0);
+       }
+
+       return (-1);
 }
 
-int SuperTraceREMOVE (void* AdapterHandle) {
-  diva_maint_client_t* pC = (diva_maint_client_t*)AdapterHandle;
+int SuperTraceREMOVE(void *AdapterHandle) {
+       diva_maint_client_t *pC = (diva_maint_client_t *)AdapterHandle;
 
-  if (pC && pC->pIdiLib && pC->request) {
-    ENTITY* e = (ENTITY*)(*(pC->pIdiLib->DivaSTraceGetHandle))(pC->pIdiLib->hLib);
+       if (pC && pC->pIdiLib && pC->request) {
+               ENTITY *e = (ENTITY *)(*(pC->pIdiLib->DivaSTraceGetHandle))(pC->pIdiLib->hLib);
 
-    e->XNum        = 1;
-    e->X           = &pC->XData;
-    e->Req         = REMOVE;
-    e->ReqCh       = 0;
-    e->X->PLength  = 1;
-    e->X->P        = (byte*)&pC->xbuffer[0];
-    pC->xbuffer[0] = 0;
+               e->XNum        = 1;
+               e->X           = &pC->XData;
+               e->Req         = REMOVE;
+               e->ReqCh       = 0;
+               e->X->PLength  = 1;
+               e->X->P        = (byte *)&pC->xbuffer[0];
+               pC->xbuffer[0] = 0;
 
-    pC->request_pending = 1;
+               pC->request_pending = 1;
 
-    return (0);
-  }
+               return (0);
+       }
 
-  return (-1);
+       return (-1);
 }
 
-int SuperTraceTraceOnRequest(void* hAdapter, const char* name, byte* data) {
-  diva_maint_client_t* pC = (diva_maint_client_t*)hAdapter;
+int SuperTraceTraceOnRequest(void *hAdapter, const char *name, byte *data) {
+       diva_maint_client_t *pC = (diva_maint_client_t *)hAdapter;
 
-  if (pC && pC->pIdiLib && pC->request) {
-    ENTITY* e = (ENTITY*)(*(pC->pIdiLib->DivaSTraceGetHandle))(pC->pIdiLib->hLib);
-    byte* xdata = (byte*)&pC->xbuffer[0];
-    char tmp = 0;
-    word length;
+       if (pC && pC->pIdiLib && pC->request) {
+               ENTITY *e = (ENTITY *)(*(pC->pIdiLib->DivaSTraceGetHandle))(pC->pIdiLib->hLib);
+               byte *xdata = (byte *)&pC->xbuffer[0];
+               char tmp = 0;
+               word length;
 
-    if (!strcmp(name, "\\")) { /* Read ROOT */
-      name = &tmp;
-    }
-    length = SuperTraceCreateReadReq (xdata, name);
-    single_p (xdata, &length, 0); /* End Of Message */
-    e->Req          = MAN_EVENT_ON;
-    e->ReqCh        = 0;
-    e->X->PLength   = length;
-    e->X->P                        = (byte*)xdata;
+               if (!strcmp(name, "\\")) { /* Read ROOT */
+                       name = &tmp;
+               }
+               length = SuperTraceCreateReadReq(xdata, name);
+               single_p(xdata, &length, 0); /* End Of Message */
+               e->Req          = MAN_EVENT_ON;
+               e->ReqCh        = 0;
+               e->X->PLength   = length;
+               e->X->P = (byte *)xdata;
 
-    pC->request_pending = 1;
+               pC->request_pending = 1;
 
-    return (0);
-  }
+               return (0);
+       }
 
-  return (-1);
+       return (-1);
 }
 
-int SuperTraceWriteVar (void* AdapterHandle,
-                        byte* data,
-                        const char* name,
-                        void* var,
-                        byte type,
-                        byte var_length) {
-  diva_maint_client_t* pC = (diva_maint_client_t*)AdapterHandle;
-
-  if (pC && pC->pIdiLib && pC->request) {
-    ENTITY* e = (ENTITY*)(*(pC->pIdiLib->DivaSTraceGetHandle))(pC->pIdiLib->hLib);
-    diva_man_var_header_t* pVar = (diva_man_var_header_t*)&pC->xbuffer[0];
-    word length = SuperTraceCreateReadReq ((byte*)pVar, name);
-
-    memcpy (&pC->xbuffer[length], var, var_length);
-    length += var_length;
-    pVar->length += var_length;
-    pVar->value_length = var_length;
-    pVar->type = type;
-    single_p ((byte*)pVar, &length, 0); /* End Of Message */
-
-    e->Req          = MAN_WRITE;
-    e->ReqCh                     = 0;
-    e->X->PLength   = length;
-    e->X->P                        = (byte*)pVar;
-
-    pC->request_pending = 1;
-
-    return (0);
-  }
-
-  return (-1);
+int SuperTraceWriteVar(void *AdapterHandle,
+                      byte *data,
+                      const char *name,
+                      void *var,
+                      byte type,
+                      byte var_length) {
+       diva_maint_client_t *pC = (diva_maint_client_t *)AdapterHandle;
+
+       if (pC && pC->pIdiLib && pC->request) {
+               ENTITY *e = (ENTITY *)(*(pC->pIdiLib->DivaSTraceGetHandle))(pC->pIdiLib->hLib);
+               diva_man_var_header_t *pVar = (diva_man_var_header_t *)&pC->xbuffer[0];
+               word length = SuperTraceCreateReadReq((byte *)pVar, name);
+
+               memcpy(&pC->xbuffer[length], var, var_length);
+               length += var_length;
+               pVar->length += var_length;
+               pVar->value_length = var_length;
+               pVar->type = type;
+               single_p((byte *)pVar, &length, 0); /* End Of Message */
+
+               e->Req = MAN_WRITE;
+               e->ReqCh = 0;
+               e->X->PLength   = length;
+               e->X->P = (byte *)pVar;
+
+               pC->request_pending = 1;
+
+               return (0);
+       }
+
+       return (-1);
 }
 
-int SuperTraceExecuteRequest (void* AdapterHandle,
-                              const char* name,
-                              byte* data) {
-  diva_maint_client_t* pC = (diva_maint_client_t*)AdapterHandle;
+int SuperTraceExecuteRequest(void *AdapterHandle,
+                            const char *name,
+                            byte *data) {
+       diva_maint_client_t *pC = (diva_maint_client_t *)AdapterHandle;
 
-  if (pC && pC->pIdiLib && pC->request) {
-    ENTITY* e = (ENTITY*)(*(pC->pIdiLib->DivaSTraceGetHandle))(pC->pIdiLib->hLib);
-    byte* xdata = (byte*)&pC->xbuffer[0];
-    word length;
+       if (pC && pC->pIdiLib && pC->request) {
+               ENTITY *e = (ENTITY *)(*(pC->pIdiLib->DivaSTraceGetHandle))(pC->pIdiLib->hLib);
+               byte *xdata = (byte *)&pC->xbuffer[0];
+               word length;
 
-    length = SuperTraceCreateReadReq (xdata, name);
-    single_p (xdata, &length, 0); /* End Of Message */
+               length = SuperTraceCreateReadReq(xdata, name);
+               single_p(xdata, &length, 0); /* End Of Message */
 
-    e->Req          = MAN_EXECUTE;
-    e->ReqCh                     = 0;
-    e->X->PLength   = length;
-    e->X->P                        = (byte*)xdata;
+               e->Req = MAN_EXECUTE;
+               e->ReqCh = 0;
+               e->X->PLength = length;
+               e->X->P = (byte *)xdata;
 
-    pC->request_pending = 1;
+               pC->request_pending = 1;
 
-    return (0);
-  }
+               return (0);
+       }
 
-  return (-1);
+       return (-1);
 }
 
-static word SuperTraceCreateReadReq (byte* P, const char* path) {
+static word SuperTraceCreateReadReq(byte *P, const char *path) {
        byte var_length;
-       byte* plen;
+       byte *plen;
 
-       var_length = (byte)strlen (path);
+       var_length = (byte)strlen(path);
 
        *P++ = ESC;
        plen = P++;
@@ -1346,708 +1346,708 @@ static word SuperTraceCreateReadReq (byte* P, const char* path) {
        *P++ = 0x00; /* Status */
        *P++ = 0x00; /* Variable Length */
        *P++ = var_length;
-       memcpy (P, path, var_length);
+       memcpy(P, path, var_length);
        P += var_length;
        *plen = var_length + 0x06;
 
        return ((word)(var_length + 0x08));
 }
 
-static void single_p (byte * P, word * PLength, byte Id) {
-  P[(*PLength)++] = Id;
+static void single_p(byte *P, word *PLength, byte Id) {
+       P[(*PLength)++] = Id;
 }
 
-static void diva_maint_xdi_cb (ENTITY* e) {
-  diva_strace_context_t* pLib = DIVAS_CONTAINING_RECORD(e,diva_strace_context_t,e);
-  diva_maint_client_t* pC;
-  diva_os_spin_lock_magic_t old_irql, old_irql1;
+static void diva_maint_xdi_cb(ENTITY *e) {
+       diva_strace_context_t *pLib = DIVAS_CONTAINING_RECORD(e, diva_strace_context_t, e);
+       diva_maint_client_t *pC;
+       diva_os_spin_lock_magic_t old_irql, old_irql1;
 
 
-  diva_os_enter_spin_lock (&dbg_adapter_lock, &old_irql1, "xdi_cb");
-  diva_os_enter_spin_lock (&dbg_q_lock, &old_irql, "xdi_cb");
+       diva_os_enter_spin_lock(&dbg_adapter_lock, &old_irql1, "xdi_cb");
+       diva_os_enter_spin_lock(&dbg_q_lock, &old_irql, "xdi_cb");
 
-  pC = (diva_maint_client_t*)pLib->hAdapter;
+       pC = (diva_maint_client_t *)pLib->hAdapter;
 
-  if ((e->complete == 255) || (pC->dma_handle < 0)) {
-    if ((*(pLib->instance.DivaSTraceMessageInput))(&pLib->instance)) {
-      diva_mnt_internal_dprintf (0, DLI_ERR, "Trace internal library error");
-    }
-  } else {
-    /*
-      Process combined management interface indication
-      */
-    if ((*(pLib->instance.DivaSTraceMessageInput))(&pLib->instance)) {
-      diva_mnt_internal_dprintf (0, DLI_ERR, "Trace internal library error (DMA mode)");
-    }
-  }
+       if ((e->complete == 255) || (pC->dma_handle < 0)) {
+               if ((*(pLib->instance.DivaSTraceMessageInput))(&pLib->instance)) {
+                       diva_mnt_internal_dprintf(0, DLI_ERR, "Trace internal library error");
+               }
+       } else {
+               /*
+                 Process combined management interface indication
+               */
+               if ((*(pLib->instance.DivaSTraceMessageInput))(&pLib->instance)) {
+                       diva_mnt_internal_dprintf(0, DLI_ERR, "Trace internal library error (DMA mode)");
+               }
+       }
 
-  diva_os_leave_spin_lock (&dbg_q_lock, &old_irql, "xdi_cb");
+       diva_os_leave_spin_lock(&dbg_q_lock, &old_irql, "xdi_cb");
 
 
        if (pC->request_pending) {
-    pC->request_pending = 0;
-    (*(pC->request))(e);
+               pC->request_pending = 0;
+               (*(pC->request))(e);
        }
 
-  diva_os_leave_spin_lock (&dbg_adapter_lock, &old_irql1, "xdi_cb");
+       diva_os_leave_spin_lock(&dbg_adapter_lock, &old_irql1, "xdi_cb");
 }
 
 
-static void diva_maint_error (void* user_context,
-                              diva_strace_library_interface_t* hLib,
-                              int Adapter,
-                              int error,
-                              const char* file,
-                              int line) {
-       diva_mnt_internal_dprintf (0, DLI_ERR,
-                             "Trace library error(%d) A(%d) %s %d", error, Adapter, file, line);
+static void diva_maint_error(void *user_context,
+                            diva_strace_library_interface_t *hLib,
+                            int Adapter,
+                            int error,
+                            const char *file,
+                            int line) {
+       diva_mnt_internal_dprintf(0, DLI_ERR,
+                                 "Trace library error(%d) A(%d) %s %d", error, Adapter, file, line);
 }
 
-static void print_ie (diva_trace_ie_t* ie, char* buffer, int length) {
+static void print_ie(diva_trace_ie_t *ie, char *buffer, int length) {
        int i;
 
-  buffer[0] = 0;
-
-  if (length > 32) {
-    for (i = 0; ((i < ie->length) && (length > 3)); i++) {
-      sprintf (buffer, "%02x", ie->data[i]);
-      buffer += 2;
-      length -= 2;
-      if (i < (ie->length-1)) {
-        strcpy (buffer, " ");
-        buffer++;
-        length--;
-      }
-    }
-  }
+       buffer[0] = 0;
+
+       if (length > 32) {
+               for (i = 0; ((i < ie->length) && (length > 3)); i++) {
+                       sprintf(buffer, "%02x", ie->data[i]);
+                       buffer += 2;
+                       length -= 2;
+                       if (i < (ie->length - 1)) {
+                               strcpy(buffer, " ");
+                               buffer++;
+                               length--;
+                       }
+               }
+       }
 }
 
-static void diva_maint_state_change_notify (void* user_context,
-                                            diva_strace_library_interface_t* hLib,
-                                            int Adapter,
-                                            diva_trace_line_state_t* channel,
-                                            int notify_subject) {
-  diva_maint_client_t*      pC    = (diva_maint_client_t*)user_context;
-  diva_trace_fax_state_t*   fax   = &channel->fax;
-  diva_trace_modem_state_t* modem = &channel->modem;
-  char tmp[256];
-
-  if (!pC->hDbg) {
-    return;
-  }
-
-  switch (notify_subject) {
-    case DIVA_SUPER_TRACE_NOTIFY_LINE_CHANGE: {
-      int view = (TraceFilter[0] == 0);
-      /*
-        Process selective Trace
-        */
-      if (channel->Line[0] == 'I' && channel->Line[1] == 'd' &&
-          channel->Line[2] == 'l' && channel->Line[3] == 'e') {
-        if ((TraceFilterIdent == pC->hDbg->id) && (TraceFilterChannel == (int)channel->ChannelNumber)) {
-          (*(hLib->DivaSTraceSetBChannel))(hLib, (int)channel->ChannelNumber, 0);
-          (*(hLib->DivaSTraceSetAudioTap))(hLib, (int)channel->ChannelNumber, 0);
-          diva_mnt_internal_dprintf (pC->hDbg->id, DLI_LOG, "Selective Trace OFF for Ch=%d",
-                                     (int)channel->ChannelNumber);
-          TraceFilterIdent   = -1;
-          TraceFilterChannel = -1;
-          view = 1;
-        }
-      } else if (TraceFilter[0] && (TraceFilterIdent < 0) && !(diva_mnt_cmp_nmbr (&channel->RemoteAddress[0]) &&
-                                                               diva_mnt_cmp_nmbr (&channel->LocalAddress[0]))) {
-
-        if ((pC->hDbg->dbgMask & DIVA_MGT_DBG_IFC_BCHANNEL) != 0) { /* Activate B-channel trace */
-          (*(hLib->DivaSTraceSetBChannel))(hLib, (int)channel->ChannelNumber, 1);
-        }
-        if ((pC->hDbg->dbgMask & DIVA_MGT_DBG_IFC_AUDIO) != 0) { /* Activate AudioTap Trace */
-          (*(hLib->DivaSTraceSetAudioTap))(hLib, (int)channel->ChannelNumber, 1);
-        }
-
-        TraceFilterIdent   = pC->hDbg->id;
-        TraceFilterChannel = (int)channel->ChannelNumber;
-
-        if (TraceFilterIdent >= 0) {
-          diva_mnt_internal_dprintf (pC->hDbg->id, DLI_LOG, "Selective Trace ON for Ch=%d",
-                                     (int)channel->ChannelNumber);
-          view = 1;
-        }
-      }
-      if (view && (pC->hDbg->dbgMask & DIVA_MGT_DBG_LINE_EVENTS)) {
-        diva_mnt_internal_dprintf (pC->hDbg->id, DLI_STAT, "L Ch     = %d",
-                                                                     (int)channel->ChannelNumber);
-        diva_mnt_internal_dprintf (pC->hDbg->id, DLI_STAT, "L Status = <%s>", &channel->Line[0]);
-        diva_mnt_internal_dprintf (pC->hDbg->id, DLI_STAT, "L Layer1 = <%s>", &channel->Framing[0]);
-        diva_mnt_internal_dprintf (pC->hDbg->id, DLI_STAT, "L Layer2 = <%s>", &channel->Layer2[0]);
-        diva_mnt_internal_dprintf (pC->hDbg->id, DLI_STAT, "L Layer3 = <%s>", &channel->Layer3[0]);
-        diva_mnt_internal_dprintf (pC->hDbg->id, DLI_STAT, "L RAddr  = <%s>",
-                                                                     &channel->RemoteAddress[0]);
-        diva_mnt_internal_dprintf (pC->hDbg->id, DLI_STAT, "L RSAddr = <%s>",
-                                                                     &channel->RemoteSubAddress[0]);
-        diva_mnt_internal_dprintf (pC->hDbg->id, DLI_STAT, "L LAddr  = <%s>",
-                                                                     &channel->LocalAddress[0]);
-        diva_mnt_internal_dprintf (pC->hDbg->id, DLI_STAT, "L LSAddr = <%s>",
-                                                                     &channel->LocalSubAddress[0]);
-        print_ie(&channel->call_BC, tmp, sizeof(tmp));
-        diva_mnt_internal_dprintf (pC->hDbg->id, DLI_STAT, "L BC     = <%s>", tmp);
-        print_ie(&channel->call_HLC, tmp, sizeof(tmp));
-        diva_mnt_internal_dprintf (pC->hDbg->id, DLI_STAT, "L HLC    = <%s>", tmp);
-        print_ie(&channel->call_LLC, tmp, sizeof(tmp));
-        diva_mnt_internal_dprintf (pC->hDbg->id, DLI_STAT, "L LLC    = <%s>", tmp);
-        diva_mnt_internal_dprintf (pC->hDbg->id, DLI_STAT, "L CR     = 0x%x", channel->CallReference);
-        diva_mnt_internal_dprintf (pC->hDbg->id, DLI_STAT, "L Disc   = 0x%x",
-                                                                    channel->LastDisconnecCause);
-        diva_mnt_internal_dprintf (pC->hDbg->id, DLI_STAT, "L Owner  = <%s>", &channel->UserID[0]);
-      }
-
-               } break;
-
-    case DIVA_SUPER_TRACE_NOTIFY_MODEM_CHANGE:
-      if (pC->hDbg->dbgMask & DIVA_MGT_DBG_MDM_PROGRESS) {
-                               {
-                                       int ch = TraceFilterChannel;
-                                       int id = TraceFilterIdent;
-
-                                       if ((id >= 0) && (ch >= 0) && (id < ARRAY_SIZE(clients)) &&
-                                               (clients[id].Dbg.id == (byte)id) && (clients[id].pIdiLib == hLib)) {
-                                               if (ch != (int)modem->ChannelNumber) {
-                                                       break;
-                                               }
-                                       } else if (TraceFilter[0] != 0) {
+static void diva_maint_state_change_notify(void *user_context,
+                                          diva_strace_library_interface_t *hLib,
+                                          int Adapter,
+                                          diva_trace_line_state_t *channel,
+                                          int notify_subject) {
+       diva_maint_client_t *pC = (diva_maint_client_t *)user_context;
+       diva_trace_fax_state_t *fax = &channel->fax;
+       diva_trace_modem_state_t *modem = &channel->modem;
+       char tmp[256];
+
+       if (!pC->hDbg) {
+               return;
+       }
+
+       switch (notify_subject) {
+       case DIVA_SUPER_TRACE_NOTIFY_LINE_CHANGE: {
+               int view = (TraceFilter[0] == 0);
+               /*
+                 Process selective Trace
+               */
+               if (channel->Line[0] == 'I' && channel->Line[1] == 'd' &&
+                   channel->Line[2] == 'l' && channel->Line[3] == 'e') {
+                       if ((TraceFilterIdent == pC->hDbg->id) && (TraceFilterChannel == (int)channel->ChannelNumber)) {
+                               (*(hLib->DivaSTraceSetBChannel))(hLib, (int)channel->ChannelNumber, 0);
+                               (*(hLib->DivaSTraceSetAudioTap))(hLib, (int)channel->ChannelNumber, 0);
+                               diva_mnt_internal_dprintf(pC->hDbg->id, DLI_LOG, "Selective Trace OFF for Ch=%d",
+                                                         (int)channel->ChannelNumber);
+                               TraceFilterIdent   = -1;
+                               TraceFilterChannel = -1;
+                               view = 1;
+                       }
+               } else if (TraceFilter[0] && (TraceFilterIdent < 0) && !(diva_mnt_cmp_nmbr(&channel->RemoteAddress[0]) &&
+                                                                        diva_mnt_cmp_nmbr(&channel->LocalAddress[0]))) {
+
+                       if ((pC->hDbg->dbgMask & DIVA_MGT_DBG_IFC_BCHANNEL) != 0) { /* Activate B-channel trace */
+                               (*(hLib->DivaSTraceSetBChannel))(hLib, (int)channel->ChannelNumber, 1);
+                       }
+                       if ((pC->hDbg->dbgMask & DIVA_MGT_DBG_IFC_AUDIO) != 0) { /* Activate AudioTap Trace */
+                               (*(hLib->DivaSTraceSetAudioTap))(hLib, (int)channel->ChannelNumber, 1);
+                       }
+
+                       TraceFilterIdent   = pC->hDbg->id;
+                       TraceFilterChannel = (int)channel->ChannelNumber;
+
+                       if (TraceFilterIdent >= 0) {
+                               diva_mnt_internal_dprintf(pC->hDbg->id, DLI_LOG, "Selective Trace ON for Ch=%d",
+                                                         (int)channel->ChannelNumber);
+                               view = 1;
+                       }
+               }
+               if (view && (pC->hDbg->dbgMask & DIVA_MGT_DBG_LINE_EVENTS)) {
+                       diva_mnt_internal_dprintf(pC->hDbg->id, DLI_STAT, "L Ch     = %d",
+                                                 (int)channel->ChannelNumber);
+                       diva_mnt_internal_dprintf(pC->hDbg->id, DLI_STAT, "L Status = <%s>", &channel->Line[0]);
+                       diva_mnt_internal_dprintf(pC->hDbg->id, DLI_STAT, "L Layer1 = <%s>", &channel->Framing[0]);
+                       diva_mnt_internal_dprintf(pC->hDbg->id, DLI_STAT, "L Layer2 = <%s>", &channel->Layer2[0]);
+                       diva_mnt_internal_dprintf(pC->hDbg->id, DLI_STAT, "L Layer3 = <%s>", &channel->Layer3[0]);
+                       diva_mnt_internal_dprintf(pC->hDbg->id, DLI_STAT, "L RAddr  = <%s>",
+                                                 &channel->RemoteAddress[0]);
+                       diva_mnt_internal_dprintf(pC->hDbg->id, DLI_STAT, "L RSAddr = <%s>",
+                                                 &channel->RemoteSubAddress[0]);
+                       diva_mnt_internal_dprintf(pC->hDbg->id, DLI_STAT, "L LAddr  = <%s>",
+                                                 &channel->LocalAddress[0]);
+                       diva_mnt_internal_dprintf(pC->hDbg->id, DLI_STAT, "L LSAddr = <%s>",
+                                                 &channel->LocalSubAddress[0]);
+                       print_ie(&channel->call_BC, tmp, sizeof(tmp));
+                       diva_mnt_internal_dprintf(pC->hDbg->id, DLI_STAT, "L BC     = <%s>", tmp);
+                       print_ie(&channel->call_HLC, tmp, sizeof(tmp));
+                       diva_mnt_internal_dprintf(pC->hDbg->id, DLI_STAT, "L HLC    = <%s>", tmp);
+                       print_ie(&channel->call_LLC, tmp, sizeof(tmp));
+                       diva_mnt_internal_dprintf(pC->hDbg->id, DLI_STAT, "L LLC    = <%s>", tmp);
+                       diva_mnt_internal_dprintf(pC->hDbg->id, DLI_STAT, "L CR     = 0x%x", channel->CallReference);
+                       diva_mnt_internal_dprintf(pC->hDbg->id, DLI_STAT, "L Disc   = 0x%x",
+                                                 channel->LastDisconnecCause);
+                       diva_mnt_internal_dprintf(pC->hDbg->id, DLI_STAT, "L Owner  = <%s>", &channel->UserID[0]);
+               }
+
+       } break;
+
+       case DIVA_SUPER_TRACE_NOTIFY_MODEM_CHANGE:
+               if (pC->hDbg->dbgMask & DIVA_MGT_DBG_MDM_PROGRESS) {
+                       {
+                               int ch = TraceFilterChannel;
+                               int id = TraceFilterIdent;
+
+                               if ((id >= 0) && (ch >= 0) && (id < ARRAY_SIZE(clients)) &&
+                                   (clients[id].Dbg.id == (byte)id) && (clients[id].pIdiLib == hLib)) {
+                                       if (ch != (int)modem->ChannelNumber) {
                                                break;
                                        }
+                               } else if (TraceFilter[0] != 0) {
+                                       break;
                                }
+                       }
+
+
+                       diva_mnt_internal_dprintf(pC->hDbg->id, DLI_STAT, "MDM Ch    = %lu",
+                                                 (int)modem->ChannelNumber);
+                       diva_mnt_internal_dprintf(pC->hDbg->id, DLI_STAT, "MDM Event = %lu", modem->Event);
+                       diva_mnt_internal_dprintf(pC->hDbg->id, DLI_STAT, "MDM Norm  = %lu", modem->Norm);
+                       diva_mnt_internal_dprintf(pC->hDbg->id, DLI_STAT, "MDM Opts. = 0x%08x", modem->Options);
+                       diva_mnt_internal_dprintf(pC->hDbg->id, DLI_STAT, "MDM Tx    = %lu Bps", modem->TxSpeed);
+                       diva_mnt_internal_dprintf(pC->hDbg->id, DLI_STAT, "MDM Rx    = %lu Bps", modem->RxSpeed);
+                       diva_mnt_internal_dprintf(pC->hDbg->id, DLI_STAT, "MDM RT    = %lu mSec",
+                                                 modem->RoundtripMsec);
+                       diva_mnt_internal_dprintf(pC->hDbg->id, DLI_STAT, "MDM Sr    = %lu", modem->SymbolRate);
+                       diva_mnt_internal_dprintf(pC->hDbg->id, DLI_STAT, "MDM Rxl   = %d dBm", modem->RxLeveldBm);
+                       diva_mnt_internal_dprintf(pC->hDbg->id, DLI_STAT, "MDM El    = %d dBm", modem->EchoLeveldBm);
+                       diva_mnt_internal_dprintf(pC->hDbg->id, DLI_STAT, "MDM SNR   = %lu dB", modem->SNRdb);
+                       diva_mnt_internal_dprintf(pC->hDbg->id, DLI_STAT, "MDM MAE   = %lu", modem->MAE);
+                       diva_mnt_internal_dprintf(pC->hDbg->id, DLI_STAT, "MDM LRet  = %lu",
+                                                 modem->LocalRetrains);
+                       diva_mnt_internal_dprintf(pC->hDbg->id, DLI_STAT, "MDM RRet  = %lu",
+                                                 modem->RemoteRetrains);
+                       diva_mnt_internal_dprintf(pC->hDbg->id, DLI_STAT, "MDM LRes  = %lu", modem->LocalResyncs);
+                       diva_mnt_internal_dprintf(pC->hDbg->id, DLI_STAT, "MDM RRes  = %lu",
+                                                 modem->RemoteResyncs);
+                       if (modem->Event == 3) {
+                               diva_mnt_internal_dprintf(pC->hDbg->id, DLI_STAT, "MDM Disc  =  %lu", modem->DiscReason);
+                       }
+               }
+               if ((modem->Event == 3) && (pC->hDbg->dbgMask & DIVA_MGT_DBG_MDM_STATISTICS)) {
+                       (*(pC->pIdiLib->DivaSTraceGetModemStatistics))(pC->pIdiLib);
+               }
+               break;
 
+       case DIVA_SUPER_TRACE_NOTIFY_FAX_CHANGE:
+               if (pC->hDbg->dbgMask & DIVA_MGT_DBG_FAX_PROGRESS) {
+                       {
+                               int ch = TraceFilterChannel;
+                               int id = TraceFilterIdent;
 
-        diva_mnt_internal_dprintf(pC->hDbg->id, DLI_STAT, "MDM Ch    = %lu",
-                                                                     (int)modem->ChannelNumber);
-        diva_mnt_internal_dprintf(pC->hDbg->id, DLI_STAT, "MDM Event = %lu",     modem->Event);
-        diva_mnt_internal_dprintf(pC->hDbg->id, DLI_STAT, "MDM Norm  = %lu",     modem->Norm);
-        diva_mnt_internal_dprintf(pC->hDbg->id, DLI_STAT, "MDM Opts. = 0x%08x",  modem->Options);
-        diva_mnt_internal_dprintf(pC->hDbg->id, DLI_STAT, "MDM Tx    = %lu Bps", modem->TxSpeed);
-        diva_mnt_internal_dprintf(pC->hDbg->id, DLI_STAT, "MDM Rx    = %lu Bps", modem->RxSpeed);
-        diva_mnt_internal_dprintf(pC->hDbg->id, DLI_STAT, "MDM RT    = %lu mSec",
-                                                                     modem->RoundtripMsec);
-        diva_mnt_internal_dprintf(pC->hDbg->id, DLI_STAT, "MDM Sr    = %lu",     modem->SymbolRate);
-        diva_mnt_internal_dprintf(pC->hDbg->id, DLI_STAT, "MDM Rxl   = %d dBm",  modem->RxLeveldBm);
-        diva_mnt_internal_dprintf(pC->hDbg->id, DLI_STAT, "MDM El    = %d dBm",  modem->EchoLeveldBm);
-        diva_mnt_internal_dprintf(pC->hDbg->id, DLI_STAT, "MDM SNR   = %lu dB",  modem->SNRdb);
-        diva_mnt_internal_dprintf(pC->hDbg->id, DLI_STAT, "MDM MAE   = %lu",     modem->MAE);
-        diva_mnt_internal_dprintf(pC->hDbg->id, DLI_STAT, "MDM LRet  = %lu",
-                                                                     modem->LocalRetrains);
-        diva_mnt_internal_dprintf(pC->hDbg->id, DLI_STAT, "MDM RRet  = %lu",
-                                                                     modem->RemoteRetrains);
-        diva_mnt_internal_dprintf(pC->hDbg->id, DLI_STAT, "MDM LRes  = %lu",     modem->LocalResyncs);
-        diva_mnt_internal_dprintf(pC->hDbg->id, DLI_STAT, "MDM RRes  = %lu",
-                                                                     modem->RemoteResyncs);
-        if (modem->Event == 3) {
-          diva_mnt_internal_dprintf(pC->hDbg->id,DLI_STAT,"MDM Disc  =  %lu",    modem->DiscReason);
-        }
-      }
-      if ((modem->Event == 3) && (pC->hDbg->dbgMask & DIVA_MGT_DBG_MDM_STATISTICS)) {
-        (*(pC->pIdiLib->DivaSTraceGetModemStatistics))(pC->pIdiLib);
-      }
-      break;
-
-    case DIVA_SUPER_TRACE_NOTIFY_FAX_CHANGE:
-      if (pC->hDbg->dbgMask & DIVA_MGT_DBG_FAX_PROGRESS) {
-                               {
-                                       int ch = TraceFilterChannel;
-                                       int id = TraceFilterIdent;
-
-                                       if ((id >= 0) && (ch >= 0) && (id < ARRAY_SIZE(clients)) &&
-                                               (clients[id].Dbg.id == (byte)id) && (clients[id].pIdiLib == hLib)) {
-                                               if (ch != (int)fax->ChannelNumber) {
-                                                       break;
-                                               }
-                                       } else if (TraceFilter[0] != 0) {
+                               if ((id >= 0) && (ch >= 0) && (id < ARRAY_SIZE(clients)) &&
+                                   (clients[id].Dbg.id == (byte)id) && (clients[id].pIdiLib == hLib)) {
+                                       if (ch != (int)fax->ChannelNumber) {
                                                break;
                                        }
+                               } else if (TraceFilter[0] != 0) {
+                                       break;
                                }
+                       }
+
+                       diva_mnt_internal_dprintf(pC->hDbg->id, DLI_STAT, "FAX Ch    = %lu", (int)fax->ChannelNumber);
+                       diva_mnt_internal_dprintf(pC->hDbg->id, DLI_STAT, "FAX Event = %lu",     fax->Event);
+                       diva_mnt_internal_dprintf(pC->hDbg->id, DLI_STAT, "FAX Pages = %lu",     fax->Page_Counter);
+                       diva_mnt_internal_dprintf(pC->hDbg->id, DLI_STAT, "FAX Feat. = 0x%08x",  fax->Features);
+                       diva_mnt_internal_dprintf(pC->hDbg->id, DLI_STAT, "FAX ID    = <%s>",    &fax->Station_ID[0]);
+                       diva_mnt_internal_dprintf(pC->hDbg->id, DLI_STAT, "FAX Saddr = <%s>",    &fax->Subaddress[0]);
+                       diva_mnt_internal_dprintf(pC->hDbg->id, DLI_STAT, "FAX Pwd   = <%s>",    &fax->Password[0]);
+                       diva_mnt_internal_dprintf(pC->hDbg->id, DLI_STAT, "FAX Speed = %lu",     fax->Speed);
+                       diva_mnt_internal_dprintf(pC->hDbg->id, DLI_STAT, "FAX Res.  = 0x%08x",  fax->Resolution);
+                       diva_mnt_internal_dprintf(pC->hDbg->id, DLI_STAT, "FAX Width = %lu",     fax->Paper_Width);
+                       diva_mnt_internal_dprintf(pC->hDbg->id, DLI_STAT, "FAX Length= %lu",     fax->Paper_Length);
+                       diva_mnt_internal_dprintf(pC->hDbg->id, DLI_STAT, "FAX SLT   = %lu",     fax->Scanline_Time);
+                       if (fax->Event == 3) {
+                               diva_mnt_internal_dprintf(pC->hDbg->id, DLI_STAT, "FAX Disc  = %lu",     fax->Disc_Reason);
+                       }
+               }
+               if ((fax->Event == 3) && (pC->hDbg->dbgMask & DIVA_MGT_DBG_FAX_STATISTICS)) {
+                       (*(pC->pIdiLib->DivaSTraceGetFaxStatistics))(pC->pIdiLib);
+               }
+               break;
+
+       case DIVA_SUPER_TRACE_INTERFACE_CHANGE:
+               if (pC->hDbg->dbgMask & DIVA_MGT_DBG_IFC_EVENTS) {
+                       diva_mnt_internal_dprintf(pC->hDbg->id, DLI_STAT,
+                                                 "Layer 1 -> [%s]", channel->pInterface->Layer1);
+                       diva_mnt_internal_dprintf(pC->hDbg->id, DLI_STAT,
+                                                 "Layer 2 -> [%s]", channel->pInterface->Layer2);
+               }
+               break;
+
+       case DIVA_SUPER_TRACE_NOTIFY_STAT_CHANGE:
+               if (pC->hDbg->dbgMask & DIVA_MGT_DBG_IFC_STATISTICS) {
+                       /*
+                         Incoming Statistics
+                       */
+                       if (channel->pInterfaceStat->inc.Calls) {
+                               diva_mnt_internal_dprintf(pC->hDbg->id, DLI_LOG,
+                                                         "Inc Calls                     =%lu", channel->pInterfaceStat->inc.Calls);
+                       }
+                       if (channel->pInterfaceStat->inc.Connected) {
+                               diva_mnt_internal_dprintf(pC->hDbg->id, DLI_LOG,
+                                                         "Inc Connected                 =%lu", channel->pInterfaceStat->inc.Connected);
+                       }
+                       if (channel->pInterfaceStat->inc.User_Busy) {
+                               diva_mnt_internal_dprintf(pC->hDbg->id, DLI_LOG,
+                                                         "Inc Busy                      =%lu", channel->pInterfaceStat->inc.User_Busy);
+                       }
+                       if (channel->pInterfaceStat->inc.Call_Rejected) {
+                               diva_mnt_internal_dprintf(pC->hDbg->id, DLI_LOG,
+                                                         "Inc Rejected                  =%lu", channel->pInterfaceStat->inc.Call_Rejected);
+                       }
+                       if (channel->pInterfaceStat->inc.Wrong_Number) {
+                               diva_mnt_internal_dprintf(pC->hDbg->id, DLI_LOG,
+                                                         "Inc Wrong Nr                  =%lu", channel->pInterfaceStat->inc.Wrong_Number);
+                       }
+                       if (channel->pInterfaceStat->inc.Incompatible_Dst) {
+                               diva_mnt_internal_dprintf(pC->hDbg->id, DLI_LOG,
+                                                         "Inc Incomp. Dest              =%lu", channel->pInterfaceStat->inc.Incompatible_Dst);
+                       }
+                       if (channel->pInterfaceStat->inc.Out_of_Order) {
+                               diva_mnt_internal_dprintf(pC->hDbg->id, DLI_LOG,
+                                                         "Inc Out of Order              =%lu", channel->pInterfaceStat->inc.Out_of_Order);
+                       }
+                       if (channel->pInterfaceStat->inc.Ignored) {
+                               diva_mnt_internal_dprintf(pC->hDbg->id, DLI_LOG,
+                                                         "Inc Ignored                   =%lu", channel->pInterfaceStat->inc.Ignored);
+                       }
+
+                       /*
+                         Outgoing Statistics
+                       */
+                       if (channel->pInterfaceStat->outg.Calls) {
+                               diva_mnt_internal_dprintf(pC->hDbg->id, DLI_LOG,
+                                                         "Outg Calls                    =%lu", channel->pInterfaceStat->outg.Calls);
+                       }
+                       if (channel->pInterfaceStat->outg.Connected) {
+                               diva_mnt_internal_dprintf(pC->hDbg->id, DLI_LOG,
+                                                         "Outg Connected                =%lu", channel->pInterfaceStat->outg.Connected);
+                       }
+                       if (channel->pInterfaceStat->outg.User_Busy) {
+                               diva_mnt_internal_dprintf(pC->hDbg->id, DLI_LOG,
+                                                         "Outg Busy                     =%lu", channel->pInterfaceStat->outg.User_Busy);
+                       }
+                       if (channel->pInterfaceStat->outg.No_Answer) {
+                               diva_mnt_internal_dprintf(pC->hDbg->id, DLI_LOG,
+                                                         "Outg No Answer                =%lu", channel->pInterfaceStat->outg.No_Answer);
+                       }
+                       if (channel->pInterfaceStat->outg.Wrong_Number) {
+                               diva_mnt_internal_dprintf(pC->hDbg->id, DLI_LOG,
+                                                         "Outg Wrong Nr                 =%lu", channel->pInterfaceStat->outg.Wrong_Number);
+                       }
+                       if (channel->pInterfaceStat->outg.Call_Rejected) {
+                               diva_mnt_internal_dprintf(pC->hDbg->id, DLI_LOG,
+                                                         "Outg Rejected                 =%lu", channel->pInterfaceStat->outg.Call_Rejected);
+                       }
+                       if (channel->pInterfaceStat->outg.Other_Failures) {
+                               diva_mnt_internal_dprintf(pC->hDbg->id, DLI_LOG,
+                                                         "Outg Other Failures           =%lu", channel->pInterfaceStat->outg.Other_Failures);
+                       }
+               }
+               break;
+
+       case DIVA_SUPER_TRACE_NOTIFY_MDM_STAT_CHANGE:
+               if (channel->pInterfaceStat->mdm.Disc_Normal) {
+                       diva_mnt_internal_dprintf(pC->hDbg->id, DLI_LOG,
+                                                 "MDM Disc Normal        = %lu", channel->pInterfaceStat->mdm.Disc_Normal);
+               }
+               if (channel->pInterfaceStat->mdm.Disc_Unspecified) {
+                       diva_mnt_internal_dprintf(pC->hDbg->id, DLI_LOG,
+                                                 "MDM Disc Unsp.         = %lu", channel->pInterfaceStat->mdm.Disc_Unspecified);
+               }
+               if (channel->pInterfaceStat->mdm.Disc_Busy_Tone) {
+                       diva_mnt_internal_dprintf(pC->hDbg->id, DLI_LOG,
+                                                 "MDM Disc Busy Tone     = %lu", channel->pInterfaceStat->mdm.Disc_Busy_Tone);
+               }
+               if (channel->pInterfaceStat->mdm.Disc_Congestion) {
+                       diva_mnt_internal_dprintf(pC->hDbg->id, DLI_LOG,
+                                                 "MDM Disc Congestion    = %lu", channel->pInterfaceStat->mdm.Disc_Congestion);
+               }
+               if (channel->pInterfaceStat->mdm.Disc_Carr_Wait) {
+                       diva_mnt_internal_dprintf(pC->hDbg->id, DLI_LOG,
+                                                 "MDM Disc Carrier Wait  = %lu", channel->pInterfaceStat->mdm.Disc_Carr_Wait);
+               }
+               if (channel->pInterfaceStat->mdm.Disc_Trn_Timeout) {
+                       diva_mnt_internal_dprintf(pC->hDbg->id, DLI_LOG,
+                                                 "MDM Disc Trn. T.o.     = %lu", channel->pInterfaceStat->mdm.Disc_Trn_Timeout);
+               }
+               if (channel->pInterfaceStat->mdm.Disc_Incompat) {
+                       diva_mnt_internal_dprintf(pC->hDbg->id, DLI_LOG,
+                                                 "MDM Disc Incompatible  = %lu", channel->pInterfaceStat->mdm.Disc_Incompat);
+               }
+               if (channel->pInterfaceStat->mdm.Disc_Frame_Rej) {
+                       diva_mnt_internal_dprintf(pC->hDbg->id, DLI_LOG,
+                                                 "MDM Disc Frame Reject  = %lu", channel->pInterfaceStat->mdm.Disc_Frame_Rej);
+               }
+               if (channel->pInterfaceStat->mdm.Disc_V42bis) {
+                       diva_mnt_internal_dprintf(pC->hDbg->id, DLI_LOG,
+                                                 "MDM Disc V.42bis       = %lu", channel->pInterfaceStat->mdm.Disc_V42bis);
+               }
+               break;
 
-        diva_mnt_internal_dprintf(pC->hDbg->id, DLI_STAT, "FAX Ch    = %lu",(int)fax->ChannelNumber);
-        diva_mnt_internal_dprintf(pC->hDbg->id, DLI_STAT, "FAX Event = %lu",     fax->Event);
-        diva_mnt_internal_dprintf(pC->hDbg->id, DLI_STAT, "FAX Pages = %lu",     fax->Page_Counter);
-        diva_mnt_internal_dprintf(pC->hDbg->id, DLI_STAT, "FAX Feat. = 0x%08x",  fax->Features);
-        diva_mnt_internal_dprintf(pC->hDbg->id, DLI_STAT, "FAX ID    = <%s>",    &fax->Station_ID[0]);
-        diva_mnt_internal_dprintf(pC->hDbg->id, DLI_STAT, "FAX Saddr = <%s>",    &fax->Subaddress[0]);
-        diva_mnt_internal_dprintf(pC->hDbg->id, DLI_STAT, "FAX Pwd   = <%s>",    &fax->Password[0]);
-        diva_mnt_internal_dprintf(pC->hDbg->id, DLI_STAT, "FAX Speed = %lu",     fax->Speed);
-        diva_mnt_internal_dprintf(pC->hDbg->id, DLI_STAT, "FAX Res.  = 0x%08x",  fax->Resolution);
-        diva_mnt_internal_dprintf(pC->hDbg->id, DLI_STAT, "FAX Width = %lu",     fax->Paper_Width);
-        diva_mnt_internal_dprintf(pC->hDbg->id, DLI_STAT, "FAX Length= %lu",     fax->Paper_Length);
-        diva_mnt_internal_dprintf(pC->hDbg->id, DLI_STAT, "FAX SLT   = %lu",     fax->Scanline_Time);
-        if (fax->Event == 3) {
-          diva_mnt_internal_dprintf(pC->hDbg->id, DLI_STAT, "FAX Disc  = %lu",     fax->Disc_Reason);
-        }
-      }
-      if ((fax->Event == 3) && (pC->hDbg->dbgMask & DIVA_MGT_DBG_FAX_STATISTICS)) {
-        (*(pC->pIdiLib->DivaSTraceGetFaxStatistics))(pC->pIdiLib);
-      }
-      break;
-
-    case DIVA_SUPER_TRACE_INTERFACE_CHANGE:
-      if (pC->hDbg->dbgMask & DIVA_MGT_DBG_IFC_EVENTS) {
-        diva_mnt_internal_dprintf (pC->hDbg->id, DLI_STAT,
-                                 "Layer 1 -> [%s]", channel->pInterface->Layer1);
-        diva_mnt_internal_dprintf (pC->hDbg->id, DLI_STAT,
-                                 "Layer 2 -> [%s]", channel->pInterface->Layer2);
-      }
-      break;
-
-    case DIVA_SUPER_TRACE_NOTIFY_STAT_CHANGE:
-      if (pC->hDbg->dbgMask & DIVA_MGT_DBG_IFC_STATISTICS) {
-        /*
-          Incoming Statistics
-          */
-        if (channel->pInterfaceStat->inc.Calls) {
-          diva_mnt_internal_dprintf (pC->hDbg->id, DLI_LOG,
-          "Inc Calls                     =%lu", channel->pInterfaceStat->inc.Calls);
-        }
-        if (channel->pInterfaceStat->inc.Connected) {
-          diva_mnt_internal_dprintf (pC->hDbg->id, DLI_LOG,
-          "Inc Connected                 =%lu", channel->pInterfaceStat->inc.Connected);
-        }
-        if (channel->pInterfaceStat->inc.User_Busy) {
-          diva_mnt_internal_dprintf (pC->hDbg->id, DLI_LOG,
-          "Inc Busy                      =%lu", channel->pInterfaceStat->inc.User_Busy);
-        }
-        if (channel->pInterfaceStat->inc.Call_Rejected) {
-          diva_mnt_internal_dprintf (pC->hDbg->id, DLI_LOG,
-          "Inc Rejected                  =%lu", channel->pInterfaceStat->inc.Call_Rejected);
-        }
-        if (channel->pInterfaceStat->inc.Wrong_Number) {
-          diva_mnt_internal_dprintf (pC->hDbg->id, DLI_LOG,
-          "Inc Wrong Nr                  =%lu", channel->pInterfaceStat->inc.Wrong_Number);
-        }
-        if (channel->pInterfaceStat->inc.Incompatible_Dst) {
-          diva_mnt_internal_dprintf (pC->hDbg->id, DLI_LOG,
-          "Inc Incomp. Dest              =%lu", channel->pInterfaceStat->inc.Incompatible_Dst);
-        }
-        if (channel->pInterfaceStat->inc.Out_of_Order) {
-          diva_mnt_internal_dprintf (pC->hDbg->id, DLI_LOG,
-          "Inc Out of Order              =%lu", channel->pInterfaceStat->inc.Out_of_Order);
-        }
-        if (channel->pInterfaceStat->inc.Ignored) {
-          diva_mnt_internal_dprintf (pC->hDbg->id, DLI_LOG,
-          "Inc Ignored                   =%lu", channel->pInterfaceStat->inc.Ignored);
-        }
-        
-        /*
-          Outgoing Statistics
-          */
-        if (channel->pInterfaceStat->outg.Calls) {
-          diva_mnt_internal_dprintf (pC->hDbg->id, DLI_LOG,
-          "Outg Calls                    =%lu", channel->pInterfaceStat->outg.Calls);
-        }
-        if (channel->pInterfaceStat->outg.Connected) {
-          diva_mnt_internal_dprintf (pC->hDbg->id, DLI_LOG,
-          "Outg Connected                =%lu", channel->pInterfaceStat->outg.Connected);
-        }
-        if (channel->pInterfaceStat->outg.User_Busy) {
-          diva_mnt_internal_dprintf (pC->hDbg->id, DLI_LOG,
-          "Outg Busy                     =%lu", channel->pInterfaceStat->outg.User_Busy);
-        }
-        if (channel->pInterfaceStat->outg.No_Answer) {
-          diva_mnt_internal_dprintf (pC->hDbg->id, DLI_LOG,
-          "Outg No Answer                =%lu", channel->pInterfaceStat->outg.No_Answer);
-        }
-        if (channel->pInterfaceStat->outg.Wrong_Number) {
-          diva_mnt_internal_dprintf (pC->hDbg->id, DLI_LOG,
-          "Outg Wrong Nr                 =%lu", channel->pInterfaceStat->outg.Wrong_Number);
-        }
-        if (channel->pInterfaceStat->outg.Call_Rejected) {
-          diva_mnt_internal_dprintf (pC->hDbg->id, DLI_LOG,
-          "Outg Rejected                 =%lu", channel->pInterfaceStat->outg.Call_Rejected);
-        }
-        if (channel->pInterfaceStat->outg.Other_Failures) {
-          diva_mnt_internal_dprintf (pC->hDbg->id, DLI_LOG,
-          "Outg Other Failures           =%lu", channel->pInterfaceStat->outg.Other_Failures);
-        }
-      }
-      break;
-
-    case DIVA_SUPER_TRACE_NOTIFY_MDM_STAT_CHANGE:
-      if (channel->pInterfaceStat->mdm.Disc_Normal) {
-        diva_mnt_internal_dprintf (pC->hDbg->id, DLI_LOG,
-        "MDM Disc Normal        = %lu", channel->pInterfaceStat->mdm.Disc_Normal);
-      }
-      if (channel->pInterfaceStat->mdm.Disc_Unspecified) {
-        diva_mnt_internal_dprintf (pC->hDbg->id, DLI_LOG,
-        "MDM Disc Unsp.         = %lu", channel->pInterfaceStat->mdm.Disc_Unspecified);
-      }
-      if (channel->pInterfaceStat->mdm.Disc_Busy_Tone) {
-        diva_mnt_internal_dprintf (pC->hDbg->id, DLI_LOG,
-        "MDM Disc Busy Tone     = %lu", channel->pInterfaceStat->mdm.Disc_Busy_Tone);
-      }
-      if (channel->pInterfaceStat->mdm.Disc_Congestion) {
-        diva_mnt_internal_dprintf (pC->hDbg->id, DLI_LOG,
-        "MDM Disc Congestion    = %lu", channel->pInterfaceStat->mdm.Disc_Congestion);
-      }
-      if (channel->pInterfaceStat->mdm.Disc_Carr_Wait) {
-        diva_mnt_internal_dprintf (pC->hDbg->id, DLI_LOG,
-        "MDM Disc Carrier Wait  = %lu", channel->pInterfaceStat->mdm.Disc_Carr_Wait);
-      }
-      if (channel->pInterfaceStat->mdm.Disc_Trn_Timeout) {
-        diva_mnt_internal_dprintf (pC->hDbg->id, DLI_LOG,
-        "MDM Disc Trn. T.o.     = %lu", channel->pInterfaceStat->mdm.Disc_Trn_Timeout);
-      }
-      if (channel->pInterfaceStat->mdm.Disc_Incompat) {
-        diva_mnt_internal_dprintf (pC->hDbg->id, DLI_LOG,
-        "MDM Disc Incompatible  = %lu", channel->pInterfaceStat->mdm.Disc_Incompat);
-      }
-      if (channel->pInterfaceStat->mdm.Disc_Frame_Rej) {
-        diva_mnt_internal_dprintf (pC->hDbg->id, DLI_LOG,
-        "MDM Disc Frame Reject  = %lu", channel->pInterfaceStat->mdm.Disc_Frame_Rej);
-      }
-      if (channel->pInterfaceStat->mdm.Disc_V42bis) {
-        diva_mnt_internal_dprintf (pC->hDbg->id, DLI_LOG,
-        "MDM Disc V.42bis       = %lu", channel->pInterfaceStat->mdm.Disc_V42bis);
-      }
-      break;
-
-    case DIVA_SUPER_TRACE_NOTIFY_FAX_STAT_CHANGE:
-      if (channel->pInterfaceStat->fax.Disc_Normal) {
-        diva_mnt_internal_dprintf (pC->hDbg->id, DLI_LOG,
-        "FAX Disc Normal        = %lu", channel->pInterfaceStat->fax.Disc_Normal);
-      }
-      if (channel->pInterfaceStat->fax.Disc_Not_Ident) {
-        diva_mnt_internal_dprintf (pC->hDbg->id, DLI_LOG,
-        "FAX Disc Not Ident.    = %lu", channel->pInterfaceStat->fax.Disc_Not_Ident);
-      }
-      if (channel->pInterfaceStat->fax.Disc_No_Response) {
-        diva_mnt_internal_dprintf (pC->hDbg->id, DLI_LOG,
-        "FAX Disc No Response   = %lu", channel->pInterfaceStat->fax.Disc_No_Response);
-      }
-      if (channel->pInterfaceStat->fax.Disc_Retries) {
-        diva_mnt_internal_dprintf (pC->hDbg->id, DLI_LOG,
-        "FAX Disc Max Retries   = %lu", channel->pInterfaceStat->fax.Disc_Retries);
-      }
-      if (channel->pInterfaceStat->fax.Disc_Unexp_Msg) {
-        diva_mnt_internal_dprintf (pC->hDbg->id, DLI_LOG,
-        "FAX Unexp. Msg.        = %lu", channel->pInterfaceStat->fax.Disc_Unexp_Msg);
-      }
-      if (channel->pInterfaceStat->fax.Disc_No_Polling) {
-        diva_mnt_internal_dprintf (pC->hDbg->id, DLI_LOG,
-        "FAX Disc No Polling    = %lu", channel->pInterfaceStat->fax.Disc_No_Polling);
-      }
-      if (channel->pInterfaceStat->fax.Disc_Training) {
-        diva_mnt_internal_dprintf (pC->hDbg->id, DLI_LOG,
-        "FAX Disc Training      = %lu", channel->pInterfaceStat->fax.Disc_Training);
-      }
-      if (channel->pInterfaceStat->fax.Disc_Unexpected) {
-        diva_mnt_internal_dprintf (pC->hDbg->id, DLI_LOG,
-        "FAX Disc Unexpected    = %lu", channel->pInterfaceStat->fax.Disc_Unexpected);
-      }
-      if (channel->pInterfaceStat->fax.Disc_Application) {
-        diva_mnt_internal_dprintf (pC->hDbg->id, DLI_LOG,
-        "FAX Disc Application   = %lu", channel->pInterfaceStat->fax.Disc_Application);
-      }
-      if (channel->pInterfaceStat->fax.Disc_Incompat) {
-        diva_mnt_internal_dprintf (pC->hDbg->id, DLI_LOG,
-        "FAX Disc Incompatible  = %lu", channel->pInterfaceStat->fax.Disc_Incompat);
-      }
-      if (channel->pInterfaceStat->fax.Disc_No_Command) {
-        diva_mnt_internal_dprintf (pC->hDbg->id, DLI_LOG,
-        "FAX Disc No Command    = %lu", channel->pInterfaceStat->fax.Disc_No_Command);
-      }
-      if (channel->pInterfaceStat->fax.Disc_Long_Msg) {
-        diva_mnt_internal_dprintf (pC->hDbg->id, DLI_LOG,
-        "FAX Disc Long Msg.     = %lu", channel->pInterfaceStat->fax.Disc_Long_Msg);
-      }
-      if (channel->pInterfaceStat->fax.Disc_Supervisor) {
-        diva_mnt_internal_dprintf (pC->hDbg->id, DLI_LOG,
-        "FAX Disc Supervisor    = %lu", channel->pInterfaceStat->fax.Disc_Supervisor);
-      }
-      if (channel->pInterfaceStat->fax.Disc_SUB_SEP_PWD) {
-        diva_mnt_internal_dprintf (pC->hDbg->id, DLI_LOG,
-        "FAX Disc SUP SEP PWD   = %lu", channel->pInterfaceStat->fax.Disc_SUB_SEP_PWD);
-      }
-      if (channel->pInterfaceStat->fax.Disc_Invalid_Msg) {
-        diva_mnt_internal_dprintf (pC->hDbg->id, DLI_LOG,
-        "FAX Disc Invalid Msg.  = %lu", channel->pInterfaceStat->fax.Disc_Invalid_Msg);
-      }
-      if (channel->pInterfaceStat->fax.Disc_Page_Coding) {
-        diva_mnt_internal_dprintf (pC->hDbg->id, DLI_LOG,
-        "FAX Disc Page Coding   = %lu", channel->pInterfaceStat->fax.Disc_Page_Coding);
-      }
-      if (channel->pInterfaceStat->fax.Disc_App_Timeout) {
-        diva_mnt_internal_dprintf (pC->hDbg->id, DLI_LOG,
-        "FAX Disc Appl. T.o.    = %lu", channel->pInterfaceStat->fax.Disc_App_Timeout);
-      }
-      if (channel->pInterfaceStat->fax.Disc_Unspecified) {
-        diva_mnt_internal_dprintf (pC->hDbg->id, DLI_LOG,
-        "FAX Disc Unspec.       = %lu", channel->pInterfaceStat->fax.Disc_Unspecified);
-      }
-      break;
-  }
+       case DIVA_SUPER_TRACE_NOTIFY_FAX_STAT_CHANGE:
+               if (channel->pInterfaceStat->fax.Disc_Normal) {
+                       diva_mnt_internal_dprintf(pC->hDbg->id, DLI_LOG,
+                                                 "FAX Disc Normal        = %lu", channel->pInterfaceStat->fax.Disc_Normal);
+               }
+               if (channel->pInterfaceStat->fax.Disc_Not_Ident) {
+                       diva_mnt_internal_dprintf(pC->hDbg->id, DLI_LOG,
+                                                 "FAX Disc Not Ident.    = %lu", channel->pInterfaceStat->fax.Disc_Not_Ident);
+               }
+               if (channel->pInterfaceStat->fax.Disc_No_Response) {
+                       diva_mnt_internal_dprintf(pC->hDbg->id, DLI_LOG,
+                                                 "FAX Disc No Response   = %lu", channel->pInterfaceStat->fax.Disc_No_Response);
+               }
+               if (channel->pInterfaceStat->fax.Disc_Retries) {
+                       diva_mnt_internal_dprintf(pC->hDbg->id, DLI_LOG,
+                                                 "FAX Disc Max Retries   = %lu", channel->pInterfaceStat->fax.Disc_Retries);
+               }
+               if (channel->pInterfaceStat->fax.Disc_Unexp_Msg) {
+                       diva_mnt_internal_dprintf(pC->hDbg->id, DLI_LOG,
+                                                 "FAX Unexp. Msg.        = %lu", channel->pInterfaceStat->fax.Disc_Unexp_Msg);
+               }
+               if (channel->pInterfaceStat->fax.Disc_No_Polling) {
+                       diva_mnt_internal_dprintf(pC->hDbg->id, DLI_LOG,
+                                                 "FAX Disc No Polling    = %lu", channel->pInterfaceStat->fax.Disc_No_Polling);
+               }
+               if (channel->pInterfaceStat->fax.Disc_Training) {
+                       diva_mnt_internal_dprintf(pC->hDbg->id, DLI_LOG,
+                                                 "FAX Disc Training      = %lu", channel->pInterfaceStat->fax.Disc_Training);
+               }
+               if (channel->pInterfaceStat->fax.Disc_Unexpected) {
+                       diva_mnt_internal_dprintf(pC->hDbg->id, DLI_LOG,
+                                                 "FAX Disc Unexpected    = %lu", channel->pInterfaceStat->fax.Disc_Unexpected);
+               }
+               if (channel->pInterfaceStat->fax.Disc_Application) {
+                       diva_mnt_internal_dprintf(pC->hDbg->id, DLI_LOG,
+                                                 "FAX Disc Application   = %lu", channel->pInterfaceStat->fax.Disc_Application);
+               }
+               if (channel->pInterfaceStat->fax.Disc_Incompat) {
+                       diva_mnt_internal_dprintf(pC->hDbg->id, DLI_LOG,
+                                                 "FAX Disc Incompatible  = %lu", channel->pInterfaceStat->fax.Disc_Incompat);
+               }
+               if (channel->pInterfaceStat->fax.Disc_No_Command) {
+                       diva_mnt_internal_dprintf(pC->hDbg->id, DLI_LOG,
+                                                 "FAX Disc No Command    = %lu", channel->pInterfaceStat->fax.Disc_No_Command);
+               }
+               if (channel->pInterfaceStat->fax.Disc_Long_Msg) {
+                       diva_mnt_internal_dprintf(pC->hDbg->id, DLI_LOG,
+                                                 "FAX Disc Long Msg.     = %lu", channel->pInterfaceStat->fax.Disc_Long_Msg);
+               }
+               if (channel->pInterfaceStat->fax.Disc_Supervisor) {
+                       diva_mnt_internal_dprintf(pC->hDbg->id, DLI_LOG,
+                                                 "FAX Disc Supervisor    = %lu", channel->pInterfaceStat->fax.Disc_Supervisor);
+               }
+               if (channel->pInterfaceStat->fax.Disc_SUB_SEP_PWD) {
+                       diva_mnt_internal_dprintf(pC->hDbg->id, DLI_LOG,
+                                                 "FAX Disc SUP SEP PWD   = %lu", channel->pInterfaceStat->fax.Disc_SUB_SEP_PWD);
+               }
+               if (channel->pInterfaceStat->fax.Disc_Invalid_Msg) {
+                       diva_mnt_internal_dprintf(pC->hDbg->id, DLI_LOG,
+                                                 "FAX Disc Invalid Msg.  = %lu", channel->pInterfaceStat->fax.Disc_Invalid_Msg);
+               }
+               if (channel->pInterfaceStat->fax.Disc_Page_Coding) {
+                       diva_mnt_internal_dprintf(pC->hDbg->id, DLI_LOG,
+                                                 "FAX Disc Page Coding   = %lu", channel->pInterfaceStat->fax.Disc_Page_Coding);
+               }
+               if (channel->pInterfaceStat->fax.Disc_App_Timeout) {
+                       diva_mnt_internal_dprintf(pC->hDbg->id, DLI_LOG,
+                                                 "FAX Disc Appl. T.o.    = %lu", channel->pInterfaceStat->fax.Disc_App_Timeout);
+               }
+               if (channel->pInterfaceStat->fax.Disc_Unspecified) {
+                       diva_mnt_internal_dprintf(pC->hDbg->id, DLI_LOG,
+                                                 "FAX Disc Unspec.       = %lu", channel->pInterfaceStat->fax.Disc_Unspecified);
+               }
+               break;
+       }
 }
 
 /*
   Receive trace information from the Management Interface and store it in the
   internal trace buffer with MSG_TYPE_MLOG as is, without any filtering.
   Event Filtering and formatting is done in  Management Interface self.
-  */
-static void diva_maint_trace_notify (void* user_context,
-                                     diva_strace_library_interface_t* hLib,
-                                     int Adapter,
-                                     void* xlog_buffer,
-                                     int length) {
-  diva_maint_client_t* pC = (diva_maint_client_t*)user_context;
-  diva_dbg_entry_head_t* pmsg;
-  word size;
-  dword sec, usec;
-  int ch = TraceFilterChannel;
-  int id = TraceFilterIdent;
-
-  /*
-    Selective trace
-    */
-  if ((id >= 0) && (ch >= 0) && (id < ARRAY_SIZE(clients)) &&
-      (clients[id].Dbg.id == (byte)id) && (clients[id].pIdiLib == hLib)) {
-    const char* p = NULL;
-    int ch_value = -1;
-    MI_XLOG_HDR *TrcData = (MI_XLOG_HDR *)xlog_buffer;
-
-    if (Adapter != clients[id].logical) {
-      return; /* Ignore all trace messages from other adapters */
-    }
-
-    if (TrcData->code == 24) {
-      p = (char*)&TrcData->code;
-      p += 2;
-    }
-
-    /*
-      All L1 messages start as [dsp,ch], so we can filter this information
-      and filter out all messages that use different channel
-      */
-    if (p && p[0] == '[') {
-      if (p[2] == ',') {
-        p += 3;
-        ch_value = *p - '0';
-      } else if (p[3] == ',') {
-        p += 4;
-        ch_value = *p - '0';
-      }
-      if (ch_value >= 0) {
-        if (p[2] == ']') {
-          ch_value = ch_value * 10 + p[1] - '0';
-        }
-        if (ch_value != ch) {
-          return; /* Ignore other channels */
-        }
-      }
-    }
+*/
+static void diva_maint_trace_notify(void *user_context,
+                                   diva_strace_library_interface_t *hLib,
+                                   int Adapter,
+                                   void *xlog_buffer,
+                                   int length) {
+       diva_maint_client_t *pC = (diva_maint_client_t *)user_context;
+       diva_dbg_entry_head_t *pmsg;
+       word size;
+       dword sec, usec;
+       int ch = TraceFilterChannel;
+       int id = TraceFilterIdent;
+
+       /*
+         Selective trace
+       */
+       if ((id >= 0) && (ch >= 0) && (id < ARRAY_SIZE(clients)) &&
+           (clients[id].Dbg.id == (byte)id) && (clients[id].pIdiLib == hLib)) {
+               const char *p = NULL;
+               int ch_value = -1;
+               MI_XLOG_HDR *TrcData = (MI_XLOG_HDR *)xlog_buffer;
+
+               if (Adapter != clients[id].logical) {
+                       return; /* Ignore all trace messages from other adapters */
+               }
+
+               if (TrcData->code == 24) {
+                       p = (char *)&TrcData->code;
+                       p += 2;
+               }
+
+               /*
+                 All L1 messages start as [dsp,ch], so we can filter this information
+                 and filter out all messages that use different channel
+               */
+               if (p && p[0] == '[') {
+                       if (p[2] == ',') {
+                               p += 3;
+                               ch_value = *p - '0';
+                       } else if (p[3] == ',') {
+                               p += 4;
+                               ch_value = *p - '0';
+                       }
+                       if (ch_value >= 0) {
+                               if (p[2] == ']') {
+                                       ch_value = ch_value * 10 + p[1] - '0';
+                               }
+                               if (ch_value != ch) {
+                                       return; /* Ignore other channels */
+                               }
+                       }
+               }
 
        } else if (TraceFilter[0] != 0) {
-    return; /* Ignore trace if trace filter is activated, but idle */
-  }
-
-  diva_os_get_time (&sec, &usec);
-
-  while (!(pmsg = (diva_dbg_entry_head_t*)queueAllocMsg (dbg_queue,
-                              (word)length+sizeof(*pmsg)))) {
-    if ((pmsg = (diva_dbg_entry_head_t*)queuePeekMsg (dbg_queue, &size))) {
-      queueFreeMsg (dbg_queue);
-    } else {
-      break;
-    }
-  }
-  if (pmsg) {
-    memcpy (&pmsg[1], xlog_buffer, length);
-    pmsg->sequence    = dbg_sequence++;
-    pmsg->time_sec    = sec;
-    pmsg->time_usec   = usec;
-    pmsg->facility    = MSG_TYPE_MLOG;
-    pmsg->dli         = pC->logical;
-    pmsg->drv_id      = pC->hDbg->id;
-    pmsg->di_cpu      = 0;
-    pmsg->data_length = length;
-    queueCompleteMsg (pmsg);
-    if (queueCount(dbg_queue)) {
-      diva_maint_wakeup_read();
-    }
-  }
+               return; /* Ignore trace if trace filter is activated, but idle */
+       }
+
+       diva_os_get_time(&sec, &usec);
+
+       while (!(pmsg = (diva_dbg_entry_head_t *)queueAllocMsg(dbg_queue,
+                                                              (word)length + sizeof(*pmsg)))) {
+               if ((pmsg = (diva_dbg_entry_head_t *)queuePeekMsg(dbg_queue, &size))) {
+                       queueFreeMsg(dbg_queue);
+               } else {
+                       break;
+               }
+       }
+       if (pmsg) {
+               memcpy(&pmsg[1], xlog_buffer, length);
+               pmsg->sequence    = dbg_sequence++;
+               pmsg->time_sec    = sec;
+               pmsg->time_usec   = usec;
+               pmsg->facility    = MSG_TYPE_MLOG;
+               pmsg->dli         = pC->logical;
+               pmsg->drv_id      = pC->hDbg->id;
+               pmsg->di_cpu      = 0;
+               pmsg->data_length = length;
+               queueCompleteMsg(pmsg);
+               if (queueCount(dbg_queue)) {
+                       diva_maint_wakeup_read();
+               }
+       }
 }
 
 
 /*
   Convert MAINT trace mask to management interface trace mask/work/facility and
   issue command to management interface
-  */
-static void diva_change_management_debug_mask (diva_maint_client_t* pC, dword old_mask) {
-  if (pC->request && pC->hDbg && pC->pIdiLib) {
-    dword changed = pC->hDbg->dbgMask ^ old_mask;
-
-    if (changed & DIVA_MGT_DBG_TRACE) {
-      (*(pC->pIdiLib->DivaSTraceSetInfo))(pC->pIdiLib,
-                                          (pC->hDbg->dbgMask & DIVA_MGT_DBG_TRACE) != 0);
-    }
-    if (changed & DIVA_MGT_DBG_DCHAN) {
-      (*(pC->pIdiLib->DivaSTraceSetDChannel))(pC->pIdiLib,
-                                              (pC->hDbg->dbgMask & DIVA_MGT_DBG_DCHAN) != 0);
-    }
-    if (!TraceFilter[0]) {
-      if (changed & DIVA_MGT_DBG_IFC_BCHANNEL) {
-        int i, state = ((pC->hDbg->dbgMask & DIVA_MGT_DBG_IFC_BCHANNEL) != 0);
-
-        for (i = 0; i < pC->channels; i++) {
-          (*(pC->pIdiLib->DivaSTraceSetBChannel))(pC->pIdiLib, i+1, state);
-        }
-      }
-      if (changed & DIVA_MGT_DBG_IFC_AUDIO) {
-        int i, state = ((pC->hDbg->dbgMask & DIVA_MGT_DBG_IFC_AUDIO) != 0);
-
-        for (i = 0; i < pC->channels; i++) {
-          (*(pC->pIdiLib->DivaSTraceSetAudioTap))(pC->pIdiLib, i+1, state);
-        }
-      }
-    }
-  }
+*/
+static void diva_change_management_debug_mask(diva_maint_client_t *pC, dword old_mask) {
+       if (pC->request && pC->hDbg && pC->pIdiLib) {
+               dword changed = pC->hDbg->dbgMask ^ old_mask;
+
+               if (changed & DIVA_MGT_DBG_TRACE) {
+                       (*(pC->pIdiLib->DivaSTraceSetInfo))(pC->pIdiLib,
+                                                           (pC->hDbg->dbgMask & DIVA_MGT_DBG_TRACE) != 0);
+               }
+               if (changed & DIVA_MGT_DBG_DCHAN) {
+                       (*(pC->pIdiLib->DivaSTraceSetDChannel))(pC->pIdiLib,
+                                                               (pC->hDbg->dbgMask & DIVA_MGT_DBG_DCHAN) != 0);
+               }
+               if (!TraceFilter[0]) {
+                       if (changed & DIVA_MGT_DBG_IFC_BCHANNEL) {
+                               int i, state = ((pC->hDbg->dbgMask & DIVA_MGT_DBG_IFC_BCHANNEL) != 0);
+
+                               for (i = 0; i < pC->channels; i++) {
+                                       (*(pC->pIdiLib->DivaSTraceSetBChannel))(pC->pIdiLib, i + 1, state);
+                               }
+                       }
+                       if (changed & DIVA_MGT_DBG_IFC_AUDIO) {
+                               int i, state = ((pC->hDbg->dbgMask & DIVA_MGT_DBG_IFC_AUDIO) != 0);
+
+                               for (i = 0; i < pC->channels; i++) {
+                                       (*(pC->pIdiLib->DivaSTraceSetAudioTap))(pC->pIdiLib, i + 1, state);
+                               }
+                       }
+               }
+       }
 }
 
 
-void diva_mnt_internal_dprintf (dword drv_id, dword type, char* fmt, ...) {
-  va_list ap;
+void diva_mnt_internal_dprintf(dword drv_id, dword type, char *fmt, ...) {
+       va_list ap;
 
        va_start(ap, fmt);
-  DI_format (0, (word)drv_id, (int)type, fmt, ap);
+       DI_format(0, (word)drv_id, (int)type, fmt, ap);
        va_end(ap);
 }
 
 /*
   Shutdown all adapters before driver removal
-  */
-int diva_mnt_shutdown_xdi_adapters (void) {
-  diva_os_spin_lock_magic_t old_irql, old_irql1;
-  int i, fret = 0;
-  byte * pmem;
-
-
-  for (i = 1; i < ARRAY_SIZE(clients); i++) {
-    pmem = NULL;
-
-    diva_os_enter_spin_lock (&dbg_adapter_lock, &old_irql1, "unload");
-    diva_os_enter_spin_lock (&dbg_q_lock, &old_irql, "unload");
-
-    if (clients[i].hDbg && clients[i].pIdiLib && clients[i].request) {
-      if ((*(clients[i].pIdiLib->DivaSTraceLibraryStop))(clients[i].pIdiLib) == 1) {
-        /*
-          Adapter removal complete
-          */
-        if (clients[i].pIdiLib) {
-          (*(clients[i].pIdiLib->DivaSTraceLibraryFinit))(clients[i].pIdiLib->hLib);
-          clients[i].pIdiLib = NULL;
-
-          pmem = clients[i].pmem;
-          clients[i].pmem = NULL;
-        }
-        clients[i].hDbg    = NULL;
-        clients[i].request_pending = 0;
-
-        if (clients[i].dma_handle >= 0) {
-          /*
-            Free DMA handle
-            */
-          diva_free_dma_descriptor (clients[i].request, clients[i].dma_handle);
-          clients[i].dma_handle = -1;
+*/
+int diva_mnt_shutdown_xdi_adapters(void) {
+       diva_os_spin_lock_magic_t old_irql, old_irql1;
+       int i, fret = 0;
+       byte *pmem;
+
+
+       for (i = 1; i < ARRAY_SIZE(clients); i++) {
+               pmem = NULL;
+
+               diva_os_enter_spin_lock(&dbg_adapter_lock, &old_irql1, "unload");
+               diva_os_enter_spin_lock(&dbg_q_lock, &old_irql, "unload");
+
+               if (clients[i].hDbg && clients[i].pIdiLib && clients[i].request) {
+                       if ((*(clients[i].pIdiLib->DivaSTraceLibraryStop))(clients[i].pIdiLib) == 1) {
+                               /*
+                                 Adapter removal complete
+                               */
+                               if (clients[i].pIdiLib) {
+                                       (*(clients[i].pIdiLib->DivaSTraceLibraryFinit))(clients[i].pIdiLib->hLib);
+                                       clients[i].pIdiLib = NULL;
+
+                                       pmem = clients[i].pmem;
+                                       clients[i].pmem = NULL;
                                }
-        clients[i].request = NULL;
-      } else {
-        fret = -1;
-      }
-    }
-
-    diva_os_leave_spin_lock (&dbg_q_lock, &old_irql, "unload");
-    if (clients[i].hDbg && clients[i].pIdiLib && clients[i].request && clients[i].request_pending) {
-      clients[i].request_pending = 0;
-      (*(clients[i].request))((ENTITY*)(*(clients[i].pIdiLib->DivaSTraceGetHandle))(clients[i].pIdiLib->hLib));
-      if (clients[i].dma_handle >= 0) {
-        diva_free_dma_descriptor (clients[i].request, clients[i].dma_handle);
-        clients[i].dma_handle = -1;
-      }
-    }
-    diva_os_leave_spin_lock (&dbg_adapter_lock, &old_irql1, "unload");
-
-    if (pmem) {
-      diva_os_free (0, pmem);
-    }
-  }
-
-  return (fret);
+                               clients[i].hDbg    = NULL;
+                               clients[i].request_pending = 0;
+
+                               if (clients[i].dma_handle >= 0) {
+                                       /*
+                                         Free DMA handle
+                                       */
+                                       diva_free_dma_descriptor(clients[i].request, clients[i].dma_handle);
+                                       clients[i].dma_handle = -1;
+                               }
+                               clients[i].request = NULL;
+                       } else {
+                               fret = -1;
+                       }
+               }
+
+               diva_os_leave_spin_lock(&dbg_q_lock, &old_irql, "unload");
+               if (clients[i].hDbg && clients[i].pIdiLib && clients[i].request && clients[i].request_pending) {
+                       clients[i].request_pending = 0;
+                       (*(clients[i].request))((ENTITY *)(*(clients[i].pIdiLib->DivaSTraceGetHandle))(clients[i].pIdiLib->hLib));
+                       if (clients[i].dma_handle >= 0) {
+                               diva_free_dma_descriptor(clients[i].request, clients[i].dma_handle);
+                               clients[i].dma_handle = -1;
+                       }
+               }
+               diva_os_leave_spin_lock(&dbg_adapter_lock, &old_irql1, "unload");
+
+               if (pmem) {
+                       diva_os_free(0, pmem);
+               }
+       }
+
+       return (fret);
 }
 
 /*
   Set/Read the trace filter used for selective tracing.
   Affects B- and Audio Tap trace mask at run time
-  */
-int diva_set_trace_filter (int filter_length, const char* filter) {
-  diva_os_spin_lock_magic_t old_irql, old_irql1;
-  int i, ch, on, client_b_on, client_atap_on;
-
-  diva_os_enter_spin_lock (&dbg_adapter_lock, &old_irql1, "dbg mask");
-  diva_os_enter_spin_lock (&dbg_q_lock, &old_irql, "write_filter");
-
-  if (filter_length <= DIVA_MAX_SELECTIVE_FILTER_LENGTH) {
-    memcpy (&TraceFilter[0], filter, filter_length);
-    if (TraceFilter[filter_length]) {
-      TraceFilter[filter_length] = 0;
-    }
-    if (TraceFilter[0] == '*') {
-      TraceFilter[0] = 0;
-    }
-  } else {
-    filter_length = -1;
-  }
-
-  TraceFilterIdent   = -1;
-  TraceFilterChannel = -1;
-
-  on = (TraceFilter[0] == 0);
-
-  for (i = 1; i < ARRAY_SIZE(clients); i++) {
-    if (clients[i].hDbg && clients[i].pIdiLib && clients[i].request) {
-      client_b_on    = on && ((clients[i].hDbg->dbgMask & DIVA_MGT_DBG_IFC_BCHANNEL) != 0);
-      client_atap_on = on && ((clients[i].hDbg->dbgMask & DIVA_MGT_DBG_IFC_AUDIO)    != 0);
-      for (ch = 0; ch < clients[i].channels; ch++) {
-        (*(clients[i].pIdiLib->DivaSTraceSetBChannel))(clients[i].pIdiLib->hLib, ch+1, client_b_on);
-        (*(clients[i].pIdiLib->DivaSTraceSetAudioTap))(clients[i].pIdiLib->hLib, ch+1, client_atap_on);
-      }
-    }
-  }
-
-  for (i = 1; i < ARRAY_SIZE(clients); i++) {
-    if (clients[i].hDbg && clients[i].pIdiLib && clients[i].request && clients[i].request_pending) {
-      diva_os_leave_spin_lock (&dbg_q_lock, &old_irql, "write_filter");
-      clients[i].request_pending = 0;
-      (*(clients[i].request))((ENTITY*)(*(clients[i].pIdiLib->DivaSTraceGetHandle))(clients[i].pIdiLib->hLib));
-      diva_os_enter_spin_lock (&dbg_q_lock, &old_irql, "write_filter");
-    }
-  }
-
-  diva_os_leave_spin_lock (&dbg_q_lock, &old_irql, "write_filter");
-  diva_os_leave_spin_lock (&dbg_adapter_lock, &old_irql1, "dbg mask");
-
-  return (filter_length);
+*/
+int diva_set_trace_filter(int filter_length, const char *filter) {
+       diva_os_spin_lock_magic_t old_irql, old_irql1;
+       int i, ch, on, client_b_on, client_atap_on;
+
+       diva_os_enter_spin_lock(&dbg_adapter_lock, &old_irql1, "dbg mask");
+       diva_os_enter_spin_lock(&dbg_q_lock, &old_irql, "write_filter");
+
+       if (filter_length <= DIVA_MAX_SELECTIVE_FILTER_LENGTH) {
+               memcpy(&TraceFilter[0], filter, filter_length);
+               if (TraceFilter[filter_length]) {
+                       TraceFilter[filter_length] = 0;
+               }
+               if (TraceFilter[0] == '*') {
+                       TraceFilter[0] = 0;
+               }
+       } else {
+               filter_length = -1;
+       }
+
+       TraceFilterIdent   = -1;
+       TraceFilterChannel = -1;
+
+       on = (TraceFilter[0] == 0);
+
+       for (i = 1; i < ARRAY_SIZE(clients); i++) {
+               if (clients[i].hDbg && clients[i].pIdiLib && clients[i].request) {
+                       client_b_on    = on && ((clients[i].hDbg->dbgMask & DIVA_MGT_DBG_IFC_BCHANNEL) != 0);
+                       client_atap_on = on && ((clients[i].hDbg->dbgMask & DIVA_MGT_DBG_IFC_AUDIO)    != 0);
+                       for (ch = 0; ch < clients[i].channels; ch++) {
+                               (*(clients[i].pIdiLib->DivaSTraceSetBChannel))(clients[i].pIdiLib->hLib, ch + 1, client_b_on);
+                               (*(clients[i].pIdiLib->DivaSTraceSetAudioTap))(clients[i].pIdiLib->hLib, ch + 1, client_atap_on);
+                       }
+               }
+       }
+
+       for (i = 1; i < ARRAY_SIZE(clients); i++) {
+               if (clients[i].hDbg && clients[i].pIdiLib && clients[i].request && clients[i].request_pending) {
+                       diva_os_leave_spin_lock(&dbg_q_lock, &old_irql, "write_filter");
+                       clients[i].request_pending = 0;
+                       (*(clients[i].request))((ENTITY *)(*(clients[i].pIdiLib->DivaSTraceGetHandle))(clients[i].pIdiLib->hLib));
+                       diva_os_enter_spin_lock(&dbg_q_lock, &old_irql, "write_filter");
+               }
+       }
+
+       diva_os_leave_spin_lock(&dbg_q_lock, &old_irql, "write_filter");
+       diva_os_leave_spin_lock(&dbg_adapter_lock, &old_irql1, "dbg mask");
+
+       return (filter_length);
 }
 
-int diva_get_trace_filter (int max_length, char* filter) {
-  diva_os_spin_lock_magic_t old_irql;
-  int len;
+int diva_get_trace_filter(int max_length, char *filter) {
+       diva_os_spin_lock_magic_t old_irql;
+       int len;
 
-  diva_os_enter_spin_lock (&dbg_q_lock, &old_irql, "read_filter");
-  len = strlen (&TraceFilter[0]) + 1;
-  if (max_length >= len) {
-    memcpy (filter, &TraceFilter[0], len);
-  }
-  diva_os_leave_spin_lock (&dbg_q_lock, &old_irql, "read_filter");
+       diva_os_enter_spin_lock(&dbg_q_lock, &old_irql, "read_filter");
+       len = strlen(&TraceFilter[0]) + 1;
+       if (max_length >= len) {
+               memcpy(filter, &TraceFilter[0], len);
+       }
+       diva_os_leave_spin_lock(&dbg_q_lock, &old_irql, "read_filter");
 
-  return (len);
+       return (len);
 }
 
-static int diva_dbg_cmp_key (const char* ref, const char* key) {
+static int diva_dbg_cmp_key(const char *ref, const char *key) {
        while (*key && (*ref++ == *key++));
-  return (!*key && !*ref);
+       return (!*key && !*ref);
 }
 
 /*
@@ -2055,78 +2055,77 @@ static int diva_dbg_cmp_key (const char* ref, const char* key) {
   all following characters are interpreted as command.
   Followings commands are available:
   - single, trace single call at time, independent from CPN/CiPN
-  */
-static int diva_mnt_cmp_nmbr (const char* nmbr) {
-  const char* ref = &TraceFilter[0];
-  int ref_len = strlen(&TraceFilter[0]), nmbr_len = strlen(nmbr);
-
-  if (ref[0] == 'C') {
-    if (diva_dbg_cmp_key (&ref[1], "single")) {
-      return (0);
-    }
-    return (-1);
-  }
-
-  if (!ref_len || (ref_len > nmbr_len)) {
-    return (-1);
-  }
-
-  nmbr = nmbr + nmbr_len - 1;
-  ref  = ref  + ref_len  - 1;
-
-  while (ref_len--) {
-    if (*nmbr-- != *ref--) {
-      return (-1);
-    }
-  }
-
-  return (0);
+*/
+static int diva_mnt_cmp_nmbr(const char *nmbr) {
+       const char *ref = &TraceFilter[0];
+       int ref_len = strlen(&TraceFilter[0]), nmbr_len = strlen(nmbr);
+
+       if (ref[0] == 'C') {
+               if (diva_dbg_cmp_key(&ref[1], "single")) {
+                       return (0);
+               }
+               return (-1);
+       }
+
+       if (!ref_len || (ref_len > nmbr_len)) {
+               return (-1);
+       }
+
+       nmbr = nmbr + nmbr_len - 1;
+       ref  = ref  + ref_len  - 1;
+
+       while (ref_len--) {
+               if (*nmbr-- != *ref--) {
+                       return (-1);
+               }
+       }
+
+       return (0);
 }
 
-static int diva_get_dma_descriptor (IDI_CALL request, dword *dma_magic) {
-  ENTITY e;
-  IDI_SYNC_REQ* pReq = (IDI_SYNC_REQ*)&e;
+static int diva_get_dma_descriptor(IDI_CALL request, dword *dma_magic) {
+       ENTITY e;
+       IDI_SYNC_REQ *pReq = (IDI_SYNC_REQ *)&e;
 
-  if (!request) {
-    return (-1);
-  }
+       if (!request) {
+               return (-1);
+       }
 
-  pReq->xdi_dma_descriptor_operation.Req = 0;
-  pReq->xdi_dma_descriptor_operation.Rc = IDI_SYNC_REQ_DMA_DESCRIPTOR_OPERATION;
+       pReq->xdi_dma_descriptor_operation.Req = 0;
+       pReq->xdi_dma_descriptor_operation.Rc = IDI_SYNC_REQ_DMA_DESCRIPTOR_OPERATION;
 
-  pReq->xdi_dma_descriptor_operation.info.operation =     IDI_SYNC_REQ_DMA_DESCRIPTOR_ALLOC;
-  pReq->xdi_dma_descriptor_operation.info.descriptor_number  = -1;
-  pReq->xdi_dma_descriptor_operation.info.descriptor_address = NULL;
-  pReq->xdi_dma_descriptor_operation.info.descriptor_magic   = 0;
+       pReq->xdi_dma_descriptor_operation.info.operation =     IDI_SYNC_REQ_DMA_DESCRIPTOR_ALLOC;
+       pReq->xdi_dma_descriptor_operation.info.descriptor_number  = -1;
+       pReq->xdi_dma_descriptor_operation.info.descriptor_address = NULL;
+       pReq->xdi_dma_descriptor_operation.info.descriptor_magic   = 0;
 
-  (*request)((ENTITY*)pReq);
+       (*request)((ENTITY *)pReq);
 
-  if (!pReq->xdi_dma_descriptor_operation.info.operation &&
-      (pReq->xdi_dma_descriptor_operation.info.descriptor_number >= 0) &&
-      pReq->xdi_dma_descriptor_operation.info.descriptor_magic) {
-    *dma_magic = pReq->xdi_dma_descriptor_operation.info.descriptor_magic;
-    return (pReq->xdi_dma_descriptor_operation.info.descriptor_number);
-  } else {
-    return (-1);
-  }
+       if (!pReq->xdi_dma_descriptor_operation.info.operation &&
+           (pReq->xdi_dma_descriptor_operation.info.descriptor_number >= 0) &&
+           pReq->xdi_dma_descriptor_operation.info.descriptor_magic) {
+               *dma_magic = pReq->xdi_dma_descriptor_operation.info.descriptor_magic;
+               return (pReq->xdi_dma_descriptor_operation.info.descriptor_number);
+       } else {
+               return (-1);
+       }
 }
 
-static void diva_free_dma_descriptor (IDI_CALL request, int nr) {
-  ENTITY e;
-  IDI_SYNC_REQ* pReq = (IDI_SYNC_REQ*)&e;
+static void diva_free_dma_descriptor(IDI_CALL request, int nr) {
+       ENTITY e;
+       IDI_SYNC_REQ *pReq = (IDI_SYNC_REQ *)&e;
 
-  if (!request || (nr < 0)) {
-    return;
-  }
+       if (!request || (nr < 0)) {
+               return;
+       }
 
-  pReq->xdi_dma_descriptor_operation.Req = 0;
-  pReq->xdi_dma_descriptor_operation.Rc = IDI_SYNC_REQ_DMA_DESCRIPTOR_OPERATION;
+       pReq->xdi_dma_descriptor_operation.Req = 0;
+       pReq->xdi_dma_descriptor_operation.Rc = IDI_SYNC_REQ_DMA_DESCRIPTOR_OPERATION;
 
-  pReq->xdi_dma_descriptor_operation.info.operation = IDI_SYNC_REQ_DMA_DESCRIPTOR_FREE;
-  pReq->xdi_dma_descriptor_operation.info.descriptor_number  = nr;
-  pReq->xdi_dma_descriptor_operation.info.descriptor_address = NULL;
-  pReq->xdi_dma_descriptor_operation.info.descriptor_magic   = 0;
+       pReq->xdi_dma_descriptor_operation.info.operation = IDI_SYNC_REQ_DMA_DESCRIPTOR_FREE;
+       pReq->xdi_dma_descriptor_operation.info.descriptor_number  = nr;
+       pReq->xdi_dma_descriptor_operation.info.descriptor_address = NULL;
+       pReq->xdi_dma_descriptor_operation.info.descriptor_magic   = 0;
 
-  (*request)((ENTITY*)pReq);
+       (*request)((ENTITY *)pReq);
 }
-
index 4db739d..fc5953a 100644 (file)
@@ -1,23 +1,23 @@
 /*
  *
-  Copyright (c) Eicon Technology Corporation, 2000.
+ Copyright (c) Eicon Technology Corporation, 2000.
  *
-  This source file is supplied for the use with Eicon
-  Technology Corporation's range of DIVA Server Adapters.
+ This source file is supplied for the use with Eicon
+ Technology Corporation's range of DIVA Server Adapters.
  *
-  This program is free software; you can redistribute it and/or modify
-  it under the terms of the GNU General Public License as published by
-  the Free Software Foundation; either version 2, or (at your option)
-  any later version.
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
  *
-  This program is distributed in the hope that it will be useful,
-  but WITHOUT ANY WARRANTY OF ANY KIND WHATSOEVER INCLUDING ANY
-  implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-  See the GNU General Public License for more details.
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY OF ANY KIND WHATSOEVER INCLUDING ANY
+ implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ See the GNU General Public License for more details.
  *
-  You should have received a copy of the GNU General Public License
-  along with this program; if not, write to the Free Software
-  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  *
  */
 #ifndef __DIVA_DEBUG_IF_H__
 #define MSG_FRAME_MAX_SIZE 2150
 
 typedef struct _diva_dbg_entry_head {
-  dword sequence;
-  dword time_sec;
-  dword time_usec;
-  dword facility;
-  dword dli;
-  dword drv_id;
-  dword di_cpu;
-  dword data_length;
+       dword sequence;
+       dword time_sec;
+       dword time_usec;
+       dword facility;
+       dword dli;
+       dword drv_id;
+       dword di_cpu;
+       dword data_length;
 } diva_dbg_entry_head_t;
 
-int diva_maint_init (byte* base, unsigned long length, int do_init);
-void* diva_maint_finit (void);
-dword diva_dbg_q_length (void);
-diva_dbg_entry_head_t* diva_maint_get_message (word* size,
-                                               diva_os_spin_lock_magic_t* old_irql);
-void diva_maint_ack_message (int do_release,
-                             diva_os_spin_lock_magic_t* old_irql);
-void diva_maint_prtComp (char *format, ...);
-void diva_maint_wakeup_read (void);
-int diva_get_driver_info (dword id, byte* data, int data_length);
-int diva_get_driver_dbg_mask (dword id, byte* data);
-int diva_set_driver_dbg_mask (dword id, dword mask);
-void diva_mnt_remove_xdi_adapter (const DESCRIPTOR* d);
-void diva_mnt_add_xdi_adapter    (const DESCRIPTOR* d);
-int diva_mnt_shutdown_xdi_adapters (void);
+int diva_maint_init(byte *base, unsigned long length, int do_init);
+void *diva_maint_finit(void);
+dword diva_dbg_q_length(void);
+diva_dbg_entry_head_t *diva_maint_get_message(word *size,
+                                             diva_os_spin_lock_magic_t *old_irql);
+void diva_maint_ack_message(int do_release,
+                           diva_os_spin_lock_magic_t *old_irql);
+void diva_maint_prtComp(char *format, ...);
+void diva_maint_wakeup_read(void);
+int diva_get_driver_info(dword id, byte *data, int data_length);
+int diva_get_driver_dbg_mask(dword id, byte *data);
+int diva_set_driver_dbg_mask(dword id, dword mask);
+void diva_mnt_remove_xdi_adapter(const DESCRIPTOR *d);
+void diva_mnt_add_xdi_adapter(const DESCRIPTOR *d);
+int diva_mnt_shutdown_xdi_adapters(void);
 
 #define DIVA_MAX_SELECTIVE_FILTER_LENGTH 127
-int diva_set_trace_filter (int filter_length, const char* filter);
-int diva_get_trace_filter (int max_length,    char*       filter);
+int diva_set_trace_filter(int filter_length, const char *filter);
+int diva_get_trace_filter(int max_length, char *filter);
 
 
 #define DITRACE_CMD_GET_DRIVER_INFO   1
@@ -72,7 +72,7 @@ int diva_get_trace_filter (int max_length,    char*       filter);
 
 /*
   Trace lavels for debug via management interface
-  */
+*/
 #define DIVA_MGT_DBG_TRACE          0x00000001 /* All trace messages from the card */
 #define DIVA_MGT_DBG_DCHAN          0x00000002 /* All D-channel relater trace messages */
 #define DIVA_MGT_DBG_MDM_PROGRESS   0x00000004 /* Modem progress events */
@@ -86,5 +86,3 @@ int diva_get_trace_filter (int max_length,    char*       filter);
 #define DIVA_MGT_DBG_IFC_AUDIO      0x00000400 /* Audio Tap trace for all channels */
 
 # endif /* DEBUG_IF___H */
-
-
index e39c5c1..d5b1092 100644 (file)
@@ -1,26 +1,26 @@
 
 /*
  *
-  Copyright (c) Eicon Networks, 2002.
+ Copyright (c) Eicon Networks, 2002.
  *
-  This source file is supplied for the use with
-  Eicon Networks range of DIVA Server Adapters.
+ This source file is supplied for the use with
+ Eicon Networks range of DIVA Server Adapters.
  *
-  Eicon File Revision :    2.1
+ Eicon File Revision :    2.1
  *
-  This program is free software; you can redistribute it and/or modify
-  it under the terms of the GNU General Public License as published by
-  the Free Software Foundation; either version 2, or (at your option)
-  any later version.
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
  *
-  This program is distributed in the hope that it will be useful,
-  but WITHOUT ANY WARRANTY OF ANY KIND WHATSOEVER INCLUDING ANY
-  implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-  See the GNU General Public License for more details.
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY OF ANY KIND WHATSOEVER INCLUDING ANY
+ implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ See the GNU General Public License for more details.
  *
-  You should have received a copy of the GNU General Public License
-  along with this program; if not, write to the Free Software
-  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  *
  */
 
 #ifdef DIVA_NO_DEBUGLIB
 static DIVA_DI_PRINTF dprintf;
 #else /* DIVA_NO_DEBUGLIB */
+
 _DbgHandle_ myDriverDebugHandle = { 0 /*!Registered*/, DBG_HANDLE_VERSION };
 DIVA_DI_PRINTF dprintf = no_printf;
 /*****************************************************************************/
-#define DBG_FUNC(name) \
-void  \
-myDbgPrint_##name (char *format, ...) \
-{ va_list ap ; \
- if ( myDriverDebugHandle.dbg_prt ) \
- { va_start (ap, format) ; \
-  (myDriverDebugHandle.dbg_prt) \
-   (myDriverDebugHandle.id, DLI_##name, format, ap) ; \
-  va_end (ap) ; \
-} }
+#define DBG_FUNC(name)                                                 \
+       void                                                            \
+       myDbgPrint_##name(char *format, ...)                            \
+       { va_list ap;                                                   \
+               if (myDriverDebugHandle.dbg_prt)                        \
+               { va_start(ap, format);                         \
+                       (myDriverDebugHandle.dbg_prt)                   \
+                               (myDriverDebugHandle.id, DLI_##name, format, ap); \
+                       va_end(ap);                                     \
+               } }
 DBG_FUNC(LOG)
 DBG_FUNC(FTL)
 DBG_FUNC(ERR)
 DBG_FUNC(TRC)
 DBG_FUNC(MXLOG)
 DBG_FUNC(FTL_MXLOG)
-void 
-myDbgPrint_EVL (long msgID, ...)
-{ va_list ap ;
- if ( myDriverDebugHandle.dbg_ev )
- { va_start (ap, msgID) ;
-  (myDriverDebugHandle.dbg_ev)
-   (myDriverDebugHandle.id, (unsigned long)msgID, ap) ;
-  va_end (ap) ;
-} }
+void
+myDbgPrint_EVL(long msgID, ...)
+{ va_list ap;
+       if (myDriverDebugHandle.dbg_ev)
+       { va_start(ap, msgID);
+               (myDriverDebugHandle.dbg_ev)
+                       (myDriverDebugHandle.id, (unsigned long)msgID, ap);
+               va_end(ap);
+       } }
 DBG_FUNC(REG)
 DBG_FUNC(MEM)
 DBG_FUNC(SPL)
@@ -76,81 +76,81 @@ DBG_FUNC(PRV2)
 DBG_FUNC(PRV3)
 /*****************************************************************************/
 int
-DbgRegister (char *drvName, char *drvTag, unsigned long dbgMask)
+DbgRegister(char *drvName, char *drvTag, unsigned long dbgMask)
 {
- int len;
+       int len;
 /*
  * deregister (if already registered) and zero out myDriverDebugHandle
  */
- DbgDeregister () ;
+       DbgDeregister();
 /*
  * initialize the debug handle
  */
- myDriverDebugHandle.Version = DBG_HANDLE_VERSION ;
- myDriverDebugHandle.id  = -1 ;
- myDriverDebugHandle.dbgMask = dbgMask | (DL_EVL | DL_FTL | DL_LOG) ;
- len = strlen (drvName) ;
- memcpy (myDriverDebugHandle.drvName, drvName,
-         (len < sizeof(myDriverDebugHandle.drvName)) ?
-    len : sizeof(myDriverDebugHandle.drvName) - 1) ;
- len = strlen (drvTag) ;
- memcpy (myDriverDebugHandle.drvTag, drvTag,
-         (len < sizeof(myDriverDebugHandle.drvTag)) ?
-    len : sizeof(myDriverDebugHandle.drvTag) - 1) ;
+       myDriverDebugHandle.Version = DBG_HANDLE_VERSION;
+       myDriverDebugHandle.id  = -1;
+       myDriverDebugHandle.dbgMask = dbgMask | (DL_EVL | DL_FTL | DL_LOG);
+       len = strlen(drvName);
+       memcpy(myDriverDebugHandle.drvName, drvName,
+              (len < sizeof(myDriverDebugHandle.drvName)) ?
+              len : sizeof(myDriverDebugHandle.drvName) - 1);
+       len = strlen(drvTag);
+       memcpy(myDriverDebugHandle.drvTag, drvTag,
+              (len < sizeof(myDriverDebugHandle.drvTag)) ?
+              len : sizeof(myDriverDebugHandle.drvTag) - 1);
 /*
  * Try to register debugging via old (and only) interface
  */
- dprintf("\000\377", &myDriverDebugHandle) ;
- if ( myDriverDebugHandle.dbg_prt )
- {
-  return (1) ;
- }
+       dprintf("\000\377", &myDriverDebugHandle);
+       if (myDriverDebugHandle.dbg_prt)
+       {
+               return (1);
+       }
 /*
  * Check if we registered with an old maint driver (see debuglib.h)
  */
- if ( myDriverDebugHandle.dbg_end != NULL
-   /* location of 'dbg_prt' in _OldDbgHandle_ struct */
-   && (myDriverDebugHandle.regTime.LowPart ||
-       myDriverDebugHandle.regTime.HighPart  ) )
-   /* same location as in _OldDbgHandle_ struct */
- {
-  dprintf("%s: Cannot log to old maint driver !", drvName) ;
-  myDriverDebugHandle.dbg_end =
-  ((_OldDbgHandle_ *)&myDriverDebugHandle)->dbg_end ;
-  DbgDeregister () ;
- }
- return (0) ;
+       if (myDriverDebugHandle.dbg_end != NULL
+            /* location of 'dbg_prt' in _OldDbgHandle_ struct */
+            && (myDriverDebugHandle.regTime.LowPart ||
+                myDriverDebugHandle.regTime.HighPart))
+               /* same location as in _OldDbgHandle_ struct */
+       {
+               dprintf("%s: Cannot log to old maint driver !", drvName);
+               myDriverDebugHandle.dbg_end =
+                       ((_OldDbgHandle_ *)&myDriverDebugHandle)->dbg_end;
+               DbgDeregister();
+       }
+       return (0);
 }
 /*****************************************************************************/
 void
-DbgSetLevel (unsigned long dbgMask)
+DbgSetLevel(unsigned long dbgMask)
 {
- myDriverDebugHandle.dbgMask = dbgMask | (DL_EVL | DL_FTL | DL_LOG) ;
+       myDriverDebugHandle.dbgMask = dbgMask | (DL_EVL | DL_FTL | DL_LOG);
 }
 /*****************************************************************************/
 void
-DbgDeregister (void)
+DbgDeregister(void)
 {
- if ( myDriverDebugHandle.dbg_end )
- {
-  (myDriverDebugHandle.dbg_end)(&myDriverDebugHandle) ;
- }
- memset (&myDriverDebugHandle, 0, sizeof(myDriverDebugHandle)) ;
+       if (myDriverDebugHandle.dbg_end)
+       {
+               (myDriverDebugHandle.dbg_end)(&myDriverDebugHandle);
+       }
+       memset(&myDriverDebugHandle, 0, sizeof(myDriverDebugHandle));
 }
-void  xdi_dbg_xlog (char* x, ...) {
- va_list ap;
- va_start (ap, x);
- if (myDriverDebugHandle.dbg_end &&
-   (myDriverDebugHandle.dbg_irq || myDriverDebugHandle.dbg_old) &&
-   (myDriverDebugHandle.dbgMask & DL_STAT)) {
-  if (myDriverDebugHandle.dbg_irq) {
-   (*(myDriverDebugHandle.dbg_irq))(myDriverDebugHandle.id,
-       (x[0] != 0) ? DLI_TRC : DLI_XLOG, x, ap);
-  } else {
-   (*(myDriverDebugHandle.dbg_old))(myDriverDebugHandle.id, x, ap);
-  }
- }
- va_end(ap);
+void xdi_dbg_xlog(char *x, ...) {
+       va_list ap;
+       va_start(ap, x);
+       if (myDriverDebugHandle.dbg_end &&
+           (myDriverDebugHandle.dbg_irq || myDriverDebugHandle.dbg_old) &&
+           (myDriverDebugHandle.dbgMask & DL_STAT)) {
+               if (myDriverDebugHandle.dbg_irq) {
+                       (*(myDriverDebugHandle.dbg_irq))(myDriverDebugHandle.id,
+                                                        (x[0] != 0) ? DLI_TRC : DLI_XLOG, x, ap);
+               } else {
+                       (*(myDriverDebugHandle.dbg_old))(myDriverDebugHandle.id, x, ap);
+               }
+       }
+       va_end(ap);
 }
 /*****************************************************************************/
 #endif /* DIVA_NO_DEBUGLIB */
index 02eed6b..6dcbf6a 100644 (file)
@@ -1,26 +1,26 @@
 
 /*
  *
-  Copyright (c) Eicon Networks, 2002.
+ Copyright (c) Eicon Networks, 2002.
  *
-  This source file is supplied for the use with
-  Eicon Networks range of DIVA Server Adapters.
+ This source file is supplied for the use with
+ Eicon Networks range of DIVA Server Adapters.
  *
-  Eicon File Revision :    2.1
+ Eicon File Revision :    2.1
  *
-  This program is free software; you can redistribute it and/or modify
-  it under the terms of the GNU General Public License as published by
-  the Free Software Foundation; either version 2, or (at your option)
-  any later version.
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
  *
-  This program is distributed in the hope that it will be useful,
-  but WITHOUT ANY WARRANTY OF ANY KIND WHATSOEVER INCLUDING ANY
-  implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-  See the GNU General Public License for more details.
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY OF ANY KIND WHATSOEVER INCLUDING ANY
+ implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ See the GNU General Public License for more details.
  *
-  You should have received a copy of the GNU General Public License
-  along with this program; if not, write to the Free Software
-  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  *
  */
 #if !defined(__DEBUGLIB_H__)
 #define DL_TO_KERNEL    0x40000000
 
 #ifdef DIVA_NO_DEBUGLIB
-#define myDbgPrint_LOG(x...) do { } while(0);
-#define myDbgPrint_FTL(x...) do { } while(0);
-#define myDbgPrint_ERR(x...) do { } while(0);
-#define myDbgPrint_TRC(x...) do { } while(0);
-#define myDbgPrint_MXLOG(x...) do { } while(0);
-#define myDbgPrint_EVL(x...) do { } while(0);
-#define myDbgPrint_REG(x...) do { } while(0);
-#define myDbgPrint_MEM(x...) do { } while(0);
-#define myDbgPrint_SPL(x...) do { } while(0);
-#define myDbgPrint_IRP(x...) do { } while(0);
-#define myDbgPrint_TIM(x...) do { } while(0);
-#define myDbgPrint_BLK(x...) do { } while(0);
-#define myDbgPrint_TAPI(x...) do { } while(0);
-#define myDbgPrint_NDIS(x...) do { } while(0);
-#define myDbgPrint_CONN(x...) do { } while(0);
-#define myDbgPrint_STAT(x...) do { } while(0);
-#define myDbgPrint_SEND(x...) do { } while(0);
-#define myDbgPrint_RECV(x...) do { } while(0);
-#define myDbgPrint_PRV0(x...) do { } while(0);
-#define myDbgPrint_PRV1(x...) do { } while(0);
-#define myDbgPrint_PRV2(x...) do { } while(0);
-#define myDbgPrint_PRV3(x...) do { } while(0);
-#define DBG_TEST(func,args) do { } while(0);
-#define DBG_EVL_ID(args) do { } while(0);
+#define myDbgPrint_LOG(x...) do { } while (0);
+#define myDbgPrint_FTL(x...) do { } while (0);
+#define myDbgPrint_ERR(x...) do { } while (0);
+#define myDbgPrint_TRC(x...) do { } while (0);
+#define myDbgPrint_MXLOG(x...) do { } while (0);
+#define myDbgPrint_EVL(x...) do { } while (0);
+#define myDbgPrint_REG(x...) do { } while (0);
+#define myDbgPrint_MEM(x...) do { } while (0);
+#define myDbgPrint_SPL(x...) do { } while (0);
+#define myDbgPrint_IRP(x...) do { } while (0);
+#define myDbgPrint_TIM(x...) do { } while (0);
+#define myDbgPrint_BLK(x...) do { } while (0);
+#define myDbgPrint_TAPI(x...) do { } while (0);
+#define myDbgPrint_NDIS(x...) do { } while (0);
+#define myDbgPrint_CONN(x...) do { } while (0);
+#define myDbgPrint_STAT(x...) do { } while (0);
+#define myDbgPrint_SEND(x...) do { } while (0);
+#define myDbgPrint_RECV(x...) do { } while (0);
+#define myDbgPrint_PRV0(x...) do { } while (0);
+#define myDbgPrint_PRV1(x...) do { } while (0);
+#define myDbgPrint_PRV2(x...) do { } while (0);
+#define myDbgPrint_PRV3(x...) do { } while (0);
+#define DBG_TEST(func, args) do { } while (0);
+#define DBG_EVL_ID(args) do { } while (0);
 
 #else /* DIVA_NO_DEBUGLIB */
 /*
  * define low level macros for formatted & raw debugging
  */
-#define DBG_DECL(func) extern void  myDbgPrint_##func (char *, ...) ;
+#define DBG_DECL(func) extern void  myDbgPrint_##func(char *, ...);
 DBG_DECL(LOG)
 DBG_DECL(FTL)
 DBG_DECL(ERR)
 DBG_DECL(TRC)
 DBG_DECL(MXLOG)
 DBG_DECL(FTL_MXLOG)
-extern void  myDbgPrint_EVL (long, ...) ;
+extern void  myDbgPrint_EVL(long, ...);
 DBG_DECL(REG)
 DBG_DECL(MEM)
 DBG_DECL(SPL)
@@ -156,34 +156,34 @@ DBG_DECL(PRV0)
 DBG_DECL(PRV1)
 DBG_DECL(PRV2)
 DBG_DECL(PRV3)
-#ifdef  _KERNEL_DBG_PRINT_
+#ifdef _KERNEL_DBG_PRINT_
 /*
  * tracing to maint and kernel if selected in the trace mask.
  */
-#define DBG_TEST(func,args) \
-{ if ( (myDriverDebugHandle.dbgMask) & (unsigned long)DL_##func ) \
- { \
-        if ( (myDriverDebugHandle.dbgMask) & DL_TO_KERNEL ) \
-            {DbgPrint args; DbgPrint ("\r\n");} \
-        myDbgPrint_##func args ; \
-} }
+#define DBG_TEST(func, args)                                           \
+       { if ((myDriverDebugHandle.dbgMask) & (unsigned long)DL_##func) \
+               {                                                       \
+                       if ((myDriverDebugHandle.dbgMask) & DL_TO_KERNEL) \
+                       { DbgPrint args; DbgPrint("\r\n"); }            \
+                       myDbgPrint_##func args;                 \
+               } }
 #else
 /*
  * Standard tracing to maint driver.
  */
-#define DBG_TEST(func,args) \
-{ if ( (myDriverDebugHandle.dbgMask) & (unsigned long)DL_##func ) \
- { myDbgPrint_##func args ; \
-} }
+#define DBG_TEST(func, args)                                           \
+       { if ((myDriverDebugHandle.dbgMask) & (unsigned long)DL_##func) \
+               { myDbgPrint_##func args;                               \
+               } }
 #endif
 /*
  * For event level debug use a separate define, the parameter are
  * different and cause compiler errors on some systems.
  */
-#define DBG_EVL_ID(args) \
-{ if ( (myDriverDebugHandle.dbgMask) & (unsigned long)DL_EVL ) \
- { myDbgPrint_EVL args ; \
-} }
+#define DBG_EVL_ID(args)                                               \
+       { if ((myDriverDebugHandle.dbgMask) & (unsigned long)DL_EVL)    \
+               { myDbgPrint_EVL args;                                  \
+               } }
 
 #endif /* DIVA_NO_DEBUGLIB */
 
@@ -214,109 +214,109 @@ DBG_DECL(PRV3)
  * prototypes for debug register/deregister functions in "debuglib.c"
  */
 #ifdef DIVA_NO_DEBUGLIB
-#define DbgRegister(name,tag, mask) do { } while(0)
-#define DbgDeregister() do { } while(0)
-#define DbgSetLevel(mask) do { } while(0)
+#define DbgRegister(name, tag, mask) do { } while (0)
+#define DbgDeregister() do { } while (0)
+#define DbgSetLevel(mask) do { } while (0)
 #else
 extern DIVA_DI_PRINTF dprintf;
-extern int  DbgRegister (char *drvName, char *drvTag, unsigned long dbgMask) ;
-extern void DbgDeregister (void) ;
-extern void DbgSetLevel (unsigned long dbgMask) ;
+extern int  DbgRegister(char *drvName, char *drvTag, unsigned long dbgMask);
+extern void DbgDeregister(void);
+extern void DbgSetLevel(unsigned long dbgMask);
 #endif
 /*
  * driver internal structure for debug handling;
  * in client drivers this structure is maintained in "debuglib.c",
  * in the debug driver "debug.c" maintains a chain of such structs.
  */
-typedef struct _DbgHandle_ *pDbgHandle ;
-typedef void ( * DbgEnd) (pDbgHandle) ;
-typedef void ( * DbgLog) (unsigned short, int, char *, va_list) ;
-typedef void ( * DbgOld) (unsigned short, char *, va_list) ;
-typedef void ( * DbgEv)  (unsigned short, unsigned long, va_list) ;
-typedef void ( * DbgIrq) (unsigned short, int, char *, va_list) ;
+typedef struct _DbgHandle_ *pDbgHandle;
+typedef void (*DbgEnd)(pDbgHandle);
+typedef void (*DbgLog)(unsigned short, int, char *, va_list);
+typedef void (*DbgOld)(unsigned short, char *, va_list);
+typedef void (*DbgEv)(unsigned short, unsigned long, va_list);
+typedef void (*DbgIrq)(unsigned short, int, char *, va_list);
 typedef struct _DbgHandle_
-{ char    Registered ; /* driver successfully registered */
+{ char    Registered; /* driver successfully registered */
 #define DBG_HANDLE_REG_NEW 0x01  /* this (new) structure    */
 #define DBG_HANDLE_REG_OLD 0x7f  /* old structure (see below)  */
- char    Version;  /* version of this structure  */
+       char    Version;  /* version of this structure  */
 #define DBG_HANDLE_VERSION 1   /* contains dbg_old function now */
 #define DBG_HANDLE_VER_EXT  2           /* pReserved points to extended info*/
- short               id ;   /* internal id of registered driver */
-  struct _DbgHandle_ *next ;   /* ptr to next registered driver    */
- struct /*LARGE_INTEGER*/ {
-  unsigned long LowPart;
-  long          HighPart;
- }     regTime ;  /* timestamp for registration       */
- void               *pIrp ;   /* ptr to pending i/o request       */
- unsigned long       dbgMask ;  /* current debug mask               */
- char                drvName[128] ; /* ASCII name of registered driver  */
- char                drvTag[64] ; /* revision string     */
- DbgEnd              dbg_end ;  /* function for debug closing       */
- DbgLog              dbg_prt ;  /* function for debug appending     */
- DbgOld              dbg_old ;  /* function for old debug appending */
- DbgEv       dbg_ev ;  /* function for Windows NT Eventlog */
- DbgIrq    dbg_irq ;  /* function for irql checked debug  */
- void      *pReserved3 ;
-} _DbgHandle_ ;
-extern _DbgHandle_ myDriverDebugHandle ;
+       short               id;   /* internal id of registered driver */
+       struct _DbgHandle_ *next;   /* ptr to next registered driver    */
+       struct /*LARGE_INTEGER*/ {
+               unsigned long LowPart;
+               long          HighPart;
+       }     regTime;  /* timestamp for registration       */
+       void               *pIrp;   /* ptr to pending i/o request       */
+       unsigned long       dbgMask;  /* current debug mask               */
+       char                drvName[128]; /* ASCII name of registered driver  */
+       char                drvTag[64]; /* revision string     */
+       DbgEnd              dbg_end;  /* function for debug closing       */
+       DbgLog              dbg_prt;  /* function for debug appending     */
+       DbgOld              dbg_old;  /* function for old debug appending */
+       DbgEv       dbg_ev;  /* function for Windows NT Eventlog */
+       DbgIrq    dbg_irq;  /* function for irql checked debug  */
+       void      *pReserved3;
+} _DbgHandle_;
+extern _DbgHandle_ myDriverDebugHandle;
 typedef struct _OldDbgHandle_
-{ struct _OldDbgHandle_ *next ;
- void                *pIrp ;
- long    regTime[2] ;
- unsigned long       dbgMask ;
- short               id ;
- char                drvName[78] ;
- DbgEnd              dbg_end ;
- DbgLog              dbg_prt ;
-} _OldDbgHandle_ ;
+{ struct _OldDbgHandle_ *next;
+       void                *pIrp;
+       long    regTime[2];
+       unsigned long       dbgMask;
+       short               id;
+       char                drvName[78];
+       DbgEnd              dbg_end;
+       DbgLog              dbg_prt;
+} _OldDbgHandle_;
 /* the differences in DbgHandles
    old:    tmp:     new:
- 0 long next  char Registered  char Registered
-       char filler   char Version
-       short id    short id
- 4 long pIrp  long    regTime.lo  long next
- 8 long    regTime.lo long    regTime.hi  long    regTime.lo
- 12 long    regTime.hi long next   long regTime.hi
- 16 long dbgMask  long pIrp   long pIrp
- 20 short id   long dbgMask   long dbgMask
- 22 char    drvName[78] ..
- 24 ..     char drvName[16]  char drvName[16]
- 40 ..     char drvTag[64]  char drvTag[64]
- 100 void *dbg_end ..      ..
- 104 void *dbg_prt void *dbg_end  void *dbg_end
- 108 ..     void *dbg_prt  void *dbg_prt
- 112 ..     ..      void *dbg_old
- 116 ..     ..      void *dbg_ev
- 120 ..     ..      void *dbg_irq
- 124 ..     ..      void *pReserved3
- ( new->id == 0 && *((short *)&new->dbgMask) == -1 ) identifies "old",
- new->Registered and new->Version overlay old->next,
- new->next overlays old->pIrp, new->regTime matches old->regTime and
- thus these fields can be maintained in new struct whithout trouble;
- id, dbgMask, drvName, dbg_end and dbg_prt need special handling !
+   0 long next  char Registered  char Registered
+   char filler   char Version
+   short id    short id
+   4 long pIrp  long    regTime.lo  long next
+   8 long    regTime.lo long    regTime.hi  long    regTime.lo
+   12 long    regTime.hi long next   long regTime.hi
+   16 long dbgMask  long pIrp   long pIrp
+   20 short id   long dbgMask   long dbgMask
+   22 char    drvName[78] ..
+   24 ..     char drvName[16]  char drvName[16]
+   40 ..     char drvTag[64]  char drvTag[64]
+   100 void *dbg_end ..      ..
+   104 void *dbg_prt void *dbg_end  void *dbg_end
+   108 ..     void *dbg_prt  void *dbg_prt
+   112 ..     ..      void *dbg_old
+   116 ..     ..      void *dbg_ev
+   120 ..     ..      void *dbg_irq
+   124 ..     ..      void *pReserved3
+   ( new->id == 0 && *((short *)&new->dbgMask) == -1 ) identifies "old",
+   new->Registered and new->Version overlay old->next,
+   new->next overlays old->pIrp, new->regTime matches old->regTime and
+   thus these fields can be maintained in new struct whithout trouble;
+   id, dbgMask, drvName, dbg_end and dbg_prt need special handling !
 */
 #define DBG_EXT_TYPE_CARD_TRACE     0x00000001
 typedef struct
 {
-    unsigned long       ExtendedType;
-    union
-    {
-        /* DBG_EXT_TYPE_CARD_TRACE */
-        struct
-        {
-            void ( * MaskChangedNotify) (void *pContext);
-            unsigned long   ModuleTxtMask;
-            unsigned long   DebugLevel;
-            unsigned long   B_ChannelMask;
-            unsigned long   LogBufferSize;
-        } CardTrace;
-    }Data;     
+       unsigned long ExtendedType;
+       union
+       {
+               /* DBG_EXT_TYPE_CARD_TRACE */
+               struct
+               {
+                       void (*MaskChangedNotify)(void *pContext);
+                       unsigned long ModuleTxtMask;
+                       unsigned long DebugLevel;
+                       unsigned long B_ChannelMask;
+                       unsigned long LogBufferSize;
+               } CardTrace;
+       } Data;
 } _DbgExtendedInfo_;
 #ifndef DIVA_NO_DEBUGLIB
 /* -------------------------------------------------------------
-    Function used for xlog-style debug
+   Function used for xlog-style debug
    ------------------------------------------------------------- */
 #define XDI_USE_XLOG 1
-void  xdi_dbg_xlog (char* x, ...);
+void xdi_dbg_xlog(char *x, ...);
 #endif /* DIVA_NO_DEBUGLIB */
 #endif /* __DEBUGLIB_H__ */
index 9a109c7..6a1d333 100644 (file)
@@ -1,54 +1,54 @@
 
 /*
  *
-  Copyright (c) Eicon Networks, 2002.
+ Copyright (c) Eicon Networks, 2002.
  *
-  This source file is supplied for the use with
-  Eicon Networks range of DIVA Server Adapters.
+ This source file is supplied for the use with
+ Eicon Networks range of DIVA Server Adapters.
  *
-  Eicon File Revision :    2.1
+ Eicon File Revision :    2.1
  *
-  This program is free software; you can redistribute it and/or modify
-  it under the terms of the GNU General Public License as published by
-  the Free Software Foundation; either version 2, or (at your option)
-  any later version.
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
  *
-  This program is distributed in the hope that it will be useful,
-  but WITHOUT ANY WARRANTY OF ANY KIND WHATSOEVER INCLUDING ANY
-  implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-  See the GNU General Public License for more details.
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY OF ANY KIND WHATSOEVER INCLUDING ANY
+ implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ See the GNU General Public License for more details.
  *
-  You should have received a copy of the GNU General Public License
-  along with this program; if not, write to the Free Software
-  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  *
  */
 #ifndef __DIVA_IDI_DFIFO_INC__
 #define __DIVA_IDI_DFIFO_INC__
 #define DIVA_DFIFO_CACHE_SZ   64 /* Used to isolate pipe from
-                    rest of the world
-                   should be divisible by 4
-                   */
-#define DIVA_DFIFO_RAW_SZ    (2512*8)
+                                   rest of the world
+                                   should be divisible by 4
+                                */
+#define DIVA_DFIFO_RAW_SZ    (2512 * 8)
 #define DIVA_DFIFO_DATA_SZ   68
 #define DIVA_DFIFO_HDR_SZ    4
-#define DIVA_DFIFO_SEGMENT_SZ  (DIVA_DFIFO_DATA_SZ+DIVA_DFIFO_HDR_SZ)
-#define DIVA_DFIFO_SEGMENTS   ((DIVA_DFIFO_RAW_SZ)/(DIVA_DFIFO_SEGMENT_SZ)+1)
-#define DIVA_DFIFO_MEM_SZ (\
-        (DIVA_DFIFO_SEGMENT_SZ)*(DIVA_DFIFO_SEGMENTS)+\
-        (DIVA_DFIFO_CACHE_SZ)*2\
-             )
+#define DIVA_DFIFO_SEGMENT_SZ  (DIVA_DFIFO_DATA_SZ + DIVA_DFIFO_HDR_SZ)
+#define DIVA_DFIFO_SEGMENTS   ((DIVA_DFIFO_RAW_SZ) / (DIVA_DFIFO_SEGMENT_SZ) + 1)
+#define DIVA_DFIFO_MEM_SZ (                                            \
+               (DIVA_DFIFO_SEGMENT_SZ) * (DIVA_DFIFO_SEGMENTS) +       \
+               (DIVA_DFIFO_CACHE_SZ) * 2                               \
+               )
 #define DIVA_DFIFO_STEP DIVA_DFIFO_SEGMENT_SZ
 /* -------------------------------------------------------------------------
-  Block header layout is:
+   Block header layout is:
    byte[0] -> flags
    byte[1] -> length of data in block
    byte[2] -> reserved
    byte[4] -> reserved
-  ------------------------------------------------------------------------- */
+   ------------------------------------------------------------------------- */
 #define DIVA_DFIFO_WRAP   0x80 /* This is the last block in fifo   */
 #define DIVA_DFIFO_READY  0x40 /* This block is ready for processing */
 #define DIVA_DFIFO_LAST   0x20 /* This block is last in message      */
 #define DIVA_DFIFO_AUTO   0x10 /* Don't look for 'ready', don't ack */
-int diva_dfifo_create (void* start, int length);
+int diva_dfifo_create(void *start, int length);
 #endif
index cb14ae3..cd3fba1 100644 (file)
@@ -1,26 +1,26 @@
 
 /*
  *
-  Copyright (c) Eicon Networks, 2002.
+ Copyright (c) Eicon Networks, 2002.
  *
-  This source file is supplied for the use with
-  Eicon Networks range of DIVA Server Adapters.
+ This source file is supplied for the use with
+ Eicon Networks range of DIVA Server Adapters.
  *
-  Eicon File Revision :    2.1
+ Eicon File Revision :    2.1
  *
-  This program is free software; you can redistribute it and/or modify
-  it under the terms of the GNU General Public License as published by
-  the Free Software Foundation; either version 2, or (at your option)
-  any later version.
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
  *
-  This program is distributed in the hope that it will be useful,
-  but WITHOUT ANY WARRANTY OF ANY KIND WHATSOEVER INCLUDING ANY
-  implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-  See the GNU General Public License for more details.
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY OF ANY KIND WHATSOEVER INCLUDING ANY
+ implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ See the GNU General Public License for more details.
  *
-  You should have received a copy of the GNU General Public License
-  along with this program; if not, write to the Free Software
-  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  *
  */
 #include "platform.h"
@@ -29,9 +29,9 @@
 #include "di_defs.h"
 #include "di.h"
 #if !defined USE_EXTENDED_DEBUGS
-  #include "dimaint.h"
+#include "dimaint.h"
 #else
-  #define dprintf
+#define dprintf
 #endif
 #include "io.h"
 #include "dfifo.h"
 /*------------------------------------------------------------------*/
 /* local function prototypes                                        */
 /*------------------------------------------------------------------*/
-void pr_out(ADAPTER * a);
-byte pr_dpc(ADAPTER * a);
-static byte pr_ready(ADAPTER * a);
+void pr_out(ADAPTER *a);
+byte pr_dpc(ADAPTER *a);
+static byte pr_ready(ADAPTER *a);
 static byte isdn_rc(ADAPTER *, byte, byte, byte, word, dword, dword);
 static byte isdn_ind(ADAPTER *, byte, byte, byte, PBUFFER *, byte, word);
 /* -----------------------------------------------------------------
-    Functions used for the extended XDI Debug
-    macros
-    global convergence counter (used by all adapters)
-    Look by the implementation part of the functions
-    about the parameters.
-    If you change the dubugging parameters, then you should update
-    the aididbg.doc in the IDI doc's.
+   Functions used for the extended XDI Debug
+   macros
+   global convergence counter (used by all adapters)
+   Look by the implementation part of the functions
+   about the parameters.
+   If you change the dubugging parameters, then you should update
+   the aididbg.doc in the IDI doc's.
    ----------------------------------------------------------------- */
 #if defined(XDI_USE_XLOG)
 #define XDI_A_NR(_x_) ((byte)(((ISDN_ADAPTER *)(_x_->io))->ANum))
-static void xdi_xlog (byte *msg, word code, int length);
+static void xdi_xlog(byte *msg, word code, int length);
 static byte xdi_xlog_sec = 0;
 #else
 #define XDI_A_NR(_x_) ((byte)0)
 #endif
-static void xdi_xlog_rc_event (byte Adapter,
-                               byte Id, byte Ch, byte Rc, byte cb, byte type);
-static void xdi_xlog_request (byte Adapter, byte Id,
-                              byte Ch, byte Req, byte type);
-static void xdi_xlog_ind (byte Adapter,
-                          byte Id,
-                          byte Ch,
-                          byte Ind,
-                          byte rnr_valid,
-                          byte rnr,
-                          byte type);
+static void xdi_xlog_rc_event(byte Adapter,
+                             byte Id, byte Ch, byte Rc, byte cb, byte type);
+static void xdi_xlog_request(byte Adapter, byte Id,
+                            byte Ch, byte Req, byte type);
+static void xdi_xlog_ind(byte Adapter,
+                        byte Id,
+                        byte Ch,
+                        byte Ind,
+                        byte rnr_valid,
+                        byte rnr,
+                        byte type);
 /*------------------------------------------------------------------*/
 /* output function                                                  */
 /*------------------------------------------------------------------*/
-void pr_out(ADAPTER * a)
+void pr_out(ADAPTER *a)
 {
-  byte e_no;
-  ENTITY  * this = NULL;
-  BUFFERS  *X;
-  word length;
-  word i;
-  word clength;
-  REQ * ReqOut;
-  byte more;
-  byte ReadyCount;
-  byte ReqCount;
-  byte Id;
-  dtrc(dprintf("pr_out"));
-        /* while a request is pending ...                           */
-  e_no = look_req(a);
-  if(!e_no)
-  {
-    dtrc(dprintf("no_req"));
-    return;
-  }
-  ReadyCount = pr_ready(a);
-  if(!ReadyCount)
-  {
-    dtrc(dprintf("not_ready"));
-    return;
-  }
-  ReqCount = 0;
-  while(e_no && ReadyCount) {
-    next_req(a);
-    this = entity_ptr(a, e_no);
+       byte e_no;
+       ENTITY *this = NULL;
+       BUFFERS *X;
+       word length;
+       word i;
+       word clength;
+       REQ *ReqOut;
+       byte more;
+       byte ReadyCount;
+       byte ReqCount;
+       byte Id;
+       dtrc(dprintf("pr_out"));
+       /* while a request is pending ...                           */
+       e_no = look_req(a);
+       if (!e_no)
+       {
+               dtrc(dprintf("no_req"));
+               return;
+       }
+       ReadyCount = pr_ready(a);
+       if (!ReadyCount)
+       {
+               dtrc(dprintf("not_ready"));
+               return;
+       }
+       ReqCount = 0;
+       while (e_no && ReadyCount) {
+               next_req(a);
+               this = entity_ptr(a, e_no);
 #ifdef USE_EXTENDED_DEBUGS
-    if ( !this )
-    {
-      DBG_FTL(("XDI: [%02x] !A%d ==> NULL entity ptr - try to ignore",
-               xdi_xlog_sec++, (int)((ISDN_ADAPTER *)a->io)->ANum))
-      e_no = look_req(a) ;
-      ReadyCount-- ;
-      continue ;
-    }
-    {
-      DBG_TRC((">A%d Id=0x%x Req=0x%x", ((ISDN_ADAPTER *)a->io)->ANum, this->Id, this->Req))
-    }
+               if (!this)
+               {
+                       DBG_FTL(("XDI: [%02x] !A%d ==> NULL entity ptr - try to ignore",
+                                xdi_xlog_sec++, (int)((ISDN_ADAPTER *)a->io)->ANum))
+                               e_no = look_req(a);
+                       ReadyCount--;
+                       continue;
+               }
+               {
+                       DBG_TRC((">A%d Id=0x%x Req=0x%x", ((ISDN_ADAPTER *)a->io)->ANum, this->Id, this->Req))
+                               }
 #else
-    dbug(dprintf("out:Req=%x,Id=%x,Ch=%x",this->Req,this->Id,this->ReqCh));
+               dbug(dprintf("out:Req=%x,Id=%x,Ch=%x", this->Req, this->Id, this->ReqCh));
 #endif
-        /* get address of next available request buffer             */
-    ReqOut = (REQ *)&PR_RAM->B[a->ram_inw(a, &PR_RAM->NextReq)];
+               /* get address of next available request buffer             */
+               ReqOut = (REQ *)&PR_RAM->B[a->ram_inw(a, &PR_RAM->NextReq)];
 #if defined(DIVA_ISTREAM)
-    if (!(a->tx_stream[this->Id]   &&
-        this->Req == N_DATA)) {
+               if (!(a->tx_stream[this->Id]   &&
+                     this->Req == N_DATA)) {
 #endif
-        /* now copy the data from the current data buffer into the  */
-        /* adapters request buffer                                  */
-    length = 0;
-    i = this->XCurrent;
-    X = PTR_X(a,this);
-    while(i<this->XNum && length<270) {
-      clength = min((word)(270-length),(word)(X[i].PLength-this->XOffset));
-      a->ram_out_buffer(a,
-                        &ReqOut->XBuffer.P[length],
-                        PTR_P(a,this,&X[i].P[this->XOffset]),
-                        clength);
-      length +=clength;
-      this->XOffset +=clength;
-      if(this->XOffset==X[i].PLength) {
-        this->XCurrent = (byte)++i;
-        this->XOffset = 0;
-      }
-    }
+                       /* now copy the data from the current data buffer into the  */
+                       /* adapters request buffer                                  */
+                       length = 0;
+                       i = this->XCurrent;
+                       X = PTR_X(a, this);
+                       while (i < this->XNum && length < 270) {
+                               clength = min((word)(270 - length), (word)(X[i].PLength-this->XOffset));
+                               a->ram_out_buffer(a,
+                                                 &ReqOut->XBuffer.P[length],
+                                                 PTR_P(a, this, &X[i].P[this->XOffset]),
+                                                 clength);
+                               length += clength;
+                               this->XOffset += clength;
+                               if (this->XOffset == X[i].PLength) {
+                                       this->XCurrent = (byte)++i;
+                                       this->XOffset = 0;
+                               }
+                       }
 #if defined(DIVA_ISTREAM)
-   } else { /* Use CMA extension in order to transfer data to the card */
-      i = this->XCurrent;
-      X = PTR_X(a,this);
-      while (i < this->XNum) {
-        diva_istream_write (a,
-                            this->Id,
-                            PTR_P(a,this,&X[i].P[0]),
-                            X[i].PLength,
-                            ((i+1) == this->XNum),
-                            0, 0);
-        this->XCurrent = (byte)++i;
-      }
-      length = 0;
-   }
+               } else { /* Use CMA extension in order to transfer data to the card */
+                       i = this->XCurrent;
+                       X = PTR_X(a, this);
+                       while (i < this->XNum) {
+                               diva_istream_write(a,
+                                                  this->Id,
+                                                  PTR_P(a, this, &X[i].P[0]),
+                                                  X[i].PLength,
+                                                  ((i + 1) == this->XNum),
+                                                  0, 0);
+                               this->XCurrent = (byte)++i;
+                       }
+                       length = 0;
+               }
 #endif
-    a->ram_outw(a, &ReqOut->XBuffer.length, length);
-    a->ram_out(a, &ReqOut->ReqId, this->Id);
-    a->ram_out(a, &ReqOut->ReqCh, this->ReqCh);
-        /* if it's a specific request (no ASSIGN) ...                */
-    if(this->Id &0x1f) {
-        /* if buffers are left in the list of data buffers do       */
-        /* do chaining (LL_MDATA, N_MDATA)                          */
-      this->More++;
-      if(i<this->XNum && this->MInd) {
-        xdi_xlog_request (XDI_A_NR(a), this->Id, this->ReqCh, this->MInd,
-                          a->IdTypeTable[this->No]);
-        a->ram_out(a, &ReqOut->Req, this->MInd);
-        more = true;
-      }
-      else {
-        xdi_xlog_request (XDI_A_NR(a), this->Id, this->ReqCh, this->Req,
-                          a->IdTypeTable[this->No]);
-        this->More |=XMOREF;
-        a->ram_out(a, &ReqOut->Req, this->Req);
-        more = false;
-        if (a->FlowControlIdTable[this->ReqCh] == this->Id)
-          a->FlowControlSkipTable[this->ReqCh] = true;
-        /*
-           Note that remove request was sent to the card
-           */
-        if (this->Req == REMOVE) {
-          a->misc_flags_table[e_no] |= DIVA_MISC_FLAGS_REMOVE_PENDING;
-        }
-      }
-        /* if we did chaining, this entity is put back into the     */
-        /* request queue                                            */
-      if(more) {
-        req_queue(a,this->No);
-      }
-    }
-        /* else it's a ASSIGN                                       */
-    else {
-        /* save the request code used for buffer chaining           */
-      this->MInd = 0;
-      if (this->Id==BLLC_ID) this->MInd = LL_MDATA;
-      if (this->Id==NL_ID   ||
-          this->Id==TASK_ID ||
-          this->Id==MAN_ID
-        ) this->MInd = N_MDATA;
-        /* send the ASSIGN                                          */
-      a->IdTypeTable[this->No] = this->Id;
-      xdi_xlog_request (XDI_A_NR(a),this->Id,this->ReqCh,this->Req, this->Id);
-      this->More |=XMOREF;
-      a->ram_out(a, &ReqOut->Req, this->Req);
-        /* save the reference of the ASSIGN                         */
-      assign_queue(a, this->No, a->ram_inw(a, &ReqOut->Reference));
-    }
-    a->ram_outw(a, &PR_RAM->NextReq, a->ram_inw(a, &ReqOut->next));
-    ReadyCount--;
-    ReqCount++;
-    e_no = look_req(a);
-  }
-        /* send the filled request buffers to the ISDN adapter      */
-  a->ram_out(a, &PR_RAM->ReqInput,
-             (byte)(a->ram_in(a, &PR_RAM->ReqInput) + ReqCount));
-        /* if it is a 'unreturncoded' UREMOVE request, remove the  */
-        /* Id from our table after sending the request             */
-  if(this && (this->Req==UREMOVE) && this->Id) {
-    Id = this->Id;
-    e_no = a->IdTable[Id];
-    free_entity(a, e_no);
-    for (i = 0; i < 256; i++)
-    {
-      if (a->FlowControlIdTable[i] == Id)
-        a->FlowControlIdTable[i] = 0;
-    }
-    a->IdTable[Id] = 0;
-    this->Id = 0;
-  }
+               a->ram_outw(a, &ReqOut->XBuffer.length, length);
+               a->ram_out(a, &ReqOut->ReqId, this->Id);
+               a->ram_out(a, &ReqOut->ReqCh, this->ReqCh);
+               /* if it's a specific request (no ASSIGN) ...                */
+               if (this->Id & 0x1f) {
+                       /* if buffers are left in the list of data buffers do       */
+                       /* do chaining (LL_MDATA, N_MDATA)                          */
+                       this->More++;
+                       if (i < this->XNum && this->MInd) {
+                               xdi_xlog_request(XDI_A_NR(a), this->Id, this->ReqCh, this->MInd,
+                                                a->IdTypeTable[this->No]);
+                               a->ram_out(a, &ReqOut->Req, this->MInd);
+                               more = true;
+                       }
+                       else {
+                               xdi_xlog_request(XDI_A_NR(a), this->Id, this->ReqCh, this->Req,
+                                                a->IdTypeTable[this->No]);
+                               this->More |= XMOREF;
+                               a->ram_out(a, &ReqOut->Req, this->Req);
+                               more = false;
+                               if (a->FlowControlIdTable[this->ReqCh] == this->Id)
+                                       a->FlowControlSkipTable[this->ReqCh] = true;
+                               /*
+                                 Note that remove request was sent to the card
+                               */
+                               if (this->Req == REMOVE) {
+                                       a->misc_flags_table[e_no] |= DIVA_MISC_FLAGS_REMOVE_PENDING;
+                               }
+                       }
+                       /* if we did chaining, this entity is put back into the     */
+                       /* request queue                                            */
+                       if (more) {
+                               req_queue(a, this->No);
+                       }
+               }
+               /* else it's a ASSIGN                                       */
+               else {
+                       /* save the request code used for buffer chaining           */
+                       this->MInd = 0;
+                       if (this->Id == BLLC_ID) this->MInd = LL_MDATA;
+                       if (this->Id == NL_ID ||
+                           this->Id == TASK_ID ||
+                           this->Id == MAN_ID
+                               ) this->MInd = N_MDATA;
+                       /* send the ASSIGN                                          */
+                       a->IdTypeTable[this->No] = this->Id;
+                       xdi_xlog_request(XDI_A_NR(a), this->Id, this->ReqCh, this->Req, this->Id);
+                       this->More |= XMOREF;
+                       a->ram_out(a, &ReqOut->Req, this->Req);
+                       /* save the reference of the ASSIGN                         */
+                       assign_queue(a, this->No, a->ram_inw(a, &ReqOut->Reference));
+               }
+               a->ram_outw(a, &PR_RAM->NextReq, a->ram_inw(a, &ReqOut->next));
+               ReadyCount--;
+               ReqCount++;
+               e_no = look_req(a);
+       }
+       /* send the filled request buffers to the ISDN adapter      */
+       a->ram_out(a, &PR_RAM->ReqInput,
+                  (byte)(a->ram_in(a, &PR_RAM->ReqInput) + ReqCount));
+       /* if it is a 'unreturncoded' UREMOVE request, remove the  */
+       /* Id from our table after sending the request             */
+       if (this && (this->Req == UREMOVE) && this->Id) {
+               Id = this->Id;
+               e_no = a->IdTable[Id];
+               free_entity(a, e_no);
+               for (i = 0; i < 256; i++)
+               {
+                       if (a->FlowControlIdTable[i] == Id)
+                               a->FlowControlIdTable[i] = 0;
+               }
+               a->IdTable[Id] = 0;
+               this->Id = 0;
+       }
 }
-static byte pr_ready(ADAPTER * a)
+static byte pr_ready(ADAPTER *a)
 {
-  byte ReadyCount;
-  ReadyCount = (byte)(a->ram_in(a, &PR_RAM->ReqOutput) -
-                      a->ram_in(a, &PR_RAM->ReqInput));
-  if(!ReadyCount) {
-    if(!a->ReadyInt) {
-      a->ram_inc(a, &PR_RAM->ReadyInt);
-      a->ReadyInt++;
-    }
-  }
-  return ReadyCount;
+       byte ReadyCount;
+       ReadyCount = (byte)(a->ram_in(a, &PR_RAM->ReqOutput) -
+                           a->ram_in(a, &PR_RAM->ReqInput));
+       if (!ReadyCount) {
+               if (!a->ReadyInt) {
+                       a->ram_inc(a, &PR_RAM->ReadyInt);
+                       a->ReadyInt++;
+               }
+       }
+       return ReadyCount;
 }
 /*------------------------------------------------------------------*/
 /* isdn interrupt handler                                           */
 /*------------------------------------------------------------------*/
-byte pr_dpc(ADAPTER * a)
+byte pr_dpc(ADAPTER *a)
 {
-  byte Count;
-  RC * RcIn;
-  IND * IndIn;
-  byte c;
-  byte RNRId;
-  byte Rc;
-  byte Ind;
-        /* if return codes are available ...                        */
-  if((Count = a->ram_in(a, &PR_RAM->RcOutput)) != 0) {
-    dtrc(dprintf("#Rc=%x",Count));
-        /* get the buffer address of the first return code          */
-    RcIn = (RC *)&PR_RAM->B[a->ram_inw(a, &PR_RAM->NextRc)];
-        /* for all return codes do ...                              */
-    while(Count--) {
-      if((Rc=a->ram_in(a, &RcIn->Rc)) != 0) {
-        dword tmp[2];
-        /*
-          Get extended information, associated with return code
-          */
-        a->ram_in_buffer(a,
-                         &RcIn->Reserved2[0],
-                         (byte*)&tmp[0],
-                         8);
-        /* call return code handler, if it is not our return code   */
-        /* the handler returns 2                                    */
-        /* for all return codes we process, we clear the Rc field   */
-        isdn_rc(a,
-                Rc,
-                a->ram_in(a, &RcIn->RcId),
-                a->ram_in(a, &RcIn->RcCh),
-                a->ram_inw(a, &RcIn->Reference),
-                tmp[0],  /* type of extended information */
-                tmp[1]); /* extended information        */
-        a->ram_out(a, &RcIn->Rc, 0);
-      }
-        /* get buffer address of next return code                   */
-      RcIn = (RC *)&PR_RAM->B[a->ram_inw(a, &RcIn->next)];
-    }
-        /* clear all return codes (no chaining!)                    */
-    a->ram_out(a, &PR_RAM->RcOutput ,0);
-        /* call output function                                     */
-    pr_out(a);
-  }
-        /* clear RNR flag                                           */
-  RNRId = 0;
-        /* if indications are available ...                         */
-  if((Count = a->ram_in(a, &PR_RAM->IndOutput)) != 0) {
-    dtrc(dprintf("#Ind=%x",Count));
-        /* get the buffer address of the first indication           */
-    IndIn = (IND *)&PR_RAM->B[a->ram_inw(a, &PR_RAM->NextInd)];
-        /* for all indications do ...                               */
-    while(Count--) {
-        /* if the application marks an indication as RNR, all       */
-        /* indications from the same Id delivered in this interrupt */
-        /* are marked RNR                                           */
-      if(RNRId && RNRId==a->ram_in(a, &IndIn->IndId)) {
-        a->ram_out(a, &IndIn->Ind, 0);
-        a->ram_out(a, &IndIn->RNR, true);
-      }
-      else {
-        Ind = a->ram_in(a, &IndIn->Ind);
-        if(Ind) {
-          RNRId = 0;
-        /* call indication handler, a return value of 2 means chain */
-        /* a return value of 1 means RNR                            */
-        /* for all indications we process, we clear the Ind field   */
-          c = isdn_ind(a,
-                       Ind,
-                       a->ram_in(a, &IndIn->IndId),
-                       a->ram_in(a, &IndIn->IndCh),
-                       &IndIn->RBuffer,
-                       a->ram_in(a, &IndIn->MInd),
-                       a->ram_inw(a, &IndIn->MLength));
-          if(c==1) {
-            dtrc(dprintf("RNR"));
-            a->ram_out(a, &IndIn->Ind, 0);
-            RNRId = a->ram_in(a, &IndIn->IndId);
-            a->ram_out(a, &IndIn->RNR, true);
-          }
-        }
-      }
-        /* get buffer address of next indication                    */
-      IndIn = (IND *)&PR_RAM->B[a->ram_inw(a, &IndIn->next)];
-    }
-    a->ram_out(a, &PR_RAM->IndOutput, 0);
-  }
-  return false;
+       byte Count;
+       RC *RcIn;
+       IND *IndIn;
+       byte c;
+       byte RNRId;
+       byte Rc;
+       byte Ind;
+       /* if return codes are available ...                        */
+       if ((Count = a->ram_in(a, &PR_RAM->RcOutput)) != 0) {
+               dtrc(dprintf("#Rc=%x", Count));
+               /* get the buffer address of the first return code          */
+               RcIn = (RC *)&PR_RAM->B[a->ram_inw(a, &PR_RAM->NextRc)];
+               /* for all return codes do ...                              */
+               while (Count--) {
+                       if ((Rc = a->ram_in(a, &RcIn->Rc)) != 0) {
+                               dword tmp[2];
+                               /*
+                                 Get extended information, associated with return code
+                               */
+                               a->ram_in_buffer(a,
+                                                &RcIn->Reserved2[0],
+                                                (byte *)&tmp[0],
+                                                8);
+                               /* call return code handler, if it is not our return code   */
+                               /* the handler returns 2                                    */
+                               /* for all return codes we process, we clear the Rc field   */
+                               isdn_rc(a,
+                                       Rc,
+                                       a->ram_in(a, &RcIn->RcId),
+                                       a->ram_in(a, &RcIn->RcCh),
+                                       a->ram_inw(a, &RcIn->Reference),
+                                       tmp[0],  /* type of extended information */
+                                       tmp[1]); /* extended information        */
+                               a->ram_out(a, &RcIn->Rc, 0);
+                       }
+                       /* get buffer address of next return code                   */
+                       RcIn = (RC *)&PR_RAM->B[a->ram_inw(a, &RcIn->next)];
+               }
+               /* clear all return codes (no chaining!)                    */
+               a->ram_out(a, &PR_RAM->RcOutput, 0);
+               /* call output function                                     */
+               pr_out(a);
+       }
+       /* clear RNR flag                                           */
+       RNRId = 0;
+       /* if indications are available ...                         */
+       if ((Count = a->ram_in(a, &PR_RAM->IndOutput)) != 0) {
+               dtrc(dprintf("#Ind=%x", Count));
+               /* get the buffer address of the first indication           */
+               IndIn = (IND *)&PR_RAM->B[a->ram_inw(a, &PR_RAM->NextInd)];
+               /* for all indications do ...                               */
+               while (Count--) {
+                       /* if the application marks an indication as RNR, all       */
+                       /* indications from the same Id delivered in this interrupt */
+                       /* are marked RNR                                           */
+                       if (RNRId && RNRId == a->ram_in(a, &IndIn->IndId)) {
+                               a->ram_out(a, &IndIn->Ind, 0);
+                               a->ram_out(a, &IndIn->RNR, true);
+                       }
+                       else {
+                               Ind = a->ram_in(a, &IndIn->Ind);
+                               if (Ind) {
+                                       RNRId = 0;
+                                       /* call indication handler, a return value of 2 means chain */
+                                       /* a return value of 1 means RNR                            */
+                                       /* for all indications we process, we clear the Ind field   */
+                                       c = isdn_ind(a,
+                                                    Ind,
+                                                    a->ram_in(a, &IndIn->IndId),
+                                                    a->ram_in(a, &IndIn->IndCh),
+                                                    &IndIn->RBuffer,
+                                                    a->ram_in(a, &IndIn->MInd),
+                                                    a->ram_inw(a, &IndIn->MLength));
+                                       if (c == 1) {
+                                               dtrc(dprintf("RNR"));
+                                               a->ram_out(a, &IndIn->Ind, 0);
+                                               RNRId = a->ram_in(a, &IndIn->IndId);
+                                               a->ram_out(a, &IndIn->RNR, true);
+                                       }
+                               }
+                       }
+                       /* get buffer address of next indication                    */
+                       IndIn = (IND *)&PR_RAM->B[a->ram_inw(a, &IndIn->next)];
+               }
+               a->ram_out(a, &PR_RAM->IndOutput, 0);
+       }
+       return false;
 }
-byte scom_test_int(ADAPTER * a)
+byte scom_test_int(ADAPTER *a)
 {
-  return a->ram_in(a,(void *)0x3fe);
+       return a->ram_in(a, (void *)0x3fe);
 }
-void scom_clear_int(ADAPTER * a)
+void scom_clear_int(ADAPTER *a)
 {
-  a->ram_out(a,(void *)0x3fe,0);
+       a->ram_out(a, (void *)0x3fe, 0);
 }
 /*------------------------------------------------------------------*/
 /* return code handler                                              */
@@ -361,196 +361,196 @@ static byte isdn_rc(ADAPTER *a,
                    dword extended_info_type,
                    dword extended_info)
 {
-  ENTITY  * this;
-  byte e_no;
-  word i;
-  int cancel_rc;
+       ENTITY *this;
+       byte e_no;
+       word i;
+       int cancel_rc;
 #ifdef USE_EXTENDED_DEBUGS
-  {
-    DBG_TRC(("<A%d Id=0x%x Rc=0x%x", ((ISDN_ADAPTER *)a->io)->ANum, Id, Rc))
-  }
+       {
+               DBG_TRC(("<A%d Id=0x%x Rc=0x%x", ((ISDN_ADAPTER *)a->io)->ANum, Id, Rc))
+                       }
 #else
-  dbug(dprintf("isdn_rc(Rc=%x,Id=%x,Ch=%x)",Rc,Id,Ch));
+       dbug(dprintf("isdn_rc(Rc=%x,Id=%x,Ch=%x)", Rc, Id, Ch));
 #endif
-        /* check for ready interrupt                                */
-  if(Rc==READY_INT) {
-    xdi_xlog_rc_event (XDI_A_NR(a), Id, Ch, Rc, 0, 0);
-    if(a->ReadyInt) {
-      a->ReadyInt--;
-      return 0;
-    }
-    return 2;
-  }
-        /* if we know this Id ...                                   */
-  e_no = a->IdTable[Id];
-  if(e_no) {
-    this = entity_ptr(a,e_no);
-    xdi_xlog_rc_event (XDI_A_NR(a), Id, Ch, Rc, 0, a->IdTypeTable[this->No]);
-    this->RcCh = Ch;
-        /* if it is a return code to a REMOVE request, remove the   */
-        /* Id from our table                                        */
-    if ((a->misc_flags_table[e_no] & DIVA_MISC_FLAGS_REMOVE_PENDING) &&
-        (Rc==OK)) {
-      if (a->IdTypeTable[e_no] == NL_ID) {
-        if (a->RcExtensionSupported &&
-            (extended_info_type != DIVA_RC_TYPE_REMOVE_COMPLETE)) {
-        dtrc(dprintf("XDI: N-REMOVE, A(%02x) Id:%02x, ignore RC=OK",
-                        XDI_A_NR(a),Id));
-          return (0);
-        }
-        if (extended_info_type == DIVA_RC_TYPE_REMOVE_COMPLETE)
-          a->RcExtensionSupported = true;
-      }
-      a->misc_flags_table[e_no] &= ~DIVA_MISC_FLAGS_REMOVE_PENDING;
-      a->misc_flags_table[e_no] &= ~DIVA_MISC_FLAGS_NO_RC_CANCELLING;
-      free_entity(a, e_no);
-      for (i = 0; i < 256; i++)
-      {
-        if (a->FlowControlIdTable[i] == Id)
-          a->FlowControlIdTable[i] = 0;
-      }
-      a->IdTable[Id] = 0;
-      this->Id = 0;
-      /* ---------------------------------------------------------------
-        If we send N_DISC or N_DISK_ACK after we have received OK_FC
-        then the card will respond with OK_FC and later with RC==OK.
-        If we send N_REMOVE in this state we will receive only RC==OK
-        This will create the state in that the XDI is waiting for the
-        additional RC and does not delivery the RC to the client. This
-        code corrects the counter of outstanding RC's in this case.
-      --------------------------------------------------------------- */
-      if ((this->More & XMOREC) > 1) {
-        this->More &= ~XMOREC;
-        this->More |= 1;
-        dtrc(dprintf("XDI: correct MORE on REMOVE A(%02x) Id:%02x",
-                     XDI_A_NR(a),Id));
-      }
-    }
-    if (Rc==OK_FC) {
-      a->FlowControlIdTable[Ch] = Id;
-      a->FlowControlSkipTable[Ch] = false;
-      this->Rc = Rc;
-      this->More &= ~(XBUSY | XMOREC);
-      this->complete=0xff;
-      xdi_xlog_rc_event (XDI_A_NR(a), Id, Ch, Rc, 1, a->IdTypeTable[this->No]);
-      CALLBACK(a, this);
-      return 0;
-    }
-    /*
-      New protocol code sends return codes that comes from release
-      of flow control condition marked with DIVA_RC_TYPE_OK_FC extended
-      information element type.
-      If like return code arrives then application is able to process
-      all return codes self and XDI should not cances return codes.
-      This return code does not decrement XMOREC partial return code
-      counter due to fact that it was no request for this return code,
-      also XMOREC was not incremented.
-      */
-    if (extended_info_type == DIVA_RC_TYPE_OK_FC) {
-      a->misc_flags_table[e_no] |= DIVA_MISC_FLAGS_NO_RC_CANCELLING;
-      this->Rc = Rc;
-      this->complete=0xff;
-      xdi_xlog_rc_event (XDI_A_NR(a), Id, Ch, Rc, 1, a->IdTypeTable[this->No]);
-      DBG_TRC(("XDI OK_FC A(%02x) Id:%02x Ch:%02x Rc:%02x",
-      XDI_A_NR(a), Id, Ch, Rc))
-      CALLBACK(a, this);
-      return 0;
-    }
-    cancel_rc = !(a->misc_flags_table[e_no] & DIVA_MISC_FLAGS_NO_RC_CANCELLING);
-    if (cancel_rc && (a->FlowControlIdTable[Ch] == Id))
-    {
-      a->FlowControlIdTable[Ch] = 0;
-      if ((Rc != OK) || !a->FlowControlSkipTable[Ch])
-      {
-        this->Rc = Rc;
-        if (Ch == this->ReqCh)
-        {
-          this->More &=~(XBUSY | XMOREC);
-          this->complete=0xff;
-        }
-        xdi_xlog_rc_event (XDI_A_NR(a), Id, Ch, Rc, 1, a->IdTypeTable[this->No]);
-        CALLBACK(a, this);
-      }
-      return 0;
-    }
-    if (this->More &XMOREC)
-      this->More--;
-        /* call the application callback function                   */
-    if (((!cancel_rc) || (this->More & XMOREF)) && !(this->More & XMOREC)) {
-      this->Rc = Rc;
-      this->More &=~XBUSY;
-      this->complete=0xff;
-      xdi_xlog_rc_event (XDI_A_NR(a), Id, Ch, Rc, 1, a->IdTypeTable[this->No]);
-      CALLBACK(a, this);
-    }
-    return 0;
-  }
-        /* if it's an ASSIGN return code check if it's a return     */
-        /* code to an ASSIGN request from us                        */
-  if((Rc &0xf0)==ASSIGN_RC) {
-    e_no = get_assign(a, Ref);
-    if(e_no) {
-      this = entity_ptr(a,e_no);
-      this->Id = Id;
-      xdi_xlog_rc_event (XDI_A_NR(a), Id, Ch, Rc, 2, a->IdTypeTable[this->No]);
-        /* call the application callback function                   */
-      this->Rc = Rc;
-      this->More &=~XBUSY;
-      this->complete=0xff;
+       /* check for ready interrupt                                */
+       if (Rc == READY_INT) {
+               xdi_xlog_rc_event(XDI_A_NR(a), Id, Ch, Rc, 0, 0);
+               if (a->ReadyInt) {
+                       a->ReadyInt--;
+                       return 0;
+               }
+               return 2;
+       }
+       /* if we know this Id ...                                   */
+       e_no = a->IdTable[Id];
+       if (e_no) {
+               this = entity_ptr(a, e_no);
+               xdi_xlog_rc_event(XDI_A_NR(a), Id, Ch, Rc, 0, a->IdTypeTable[this->No]);
+               this->RcCh = Ch;
+               /* if it is a return code to a REMOVE request, remove the   */
+               /* Id from our table                                        */
+               if ((a->misc_flags_table[e_no] & DIVA_MISC_FLAGS_REMOVE_PENDING) &&
+                   (Rc == OK)) {
+                       if (a->IdTypeTable[e_no] == NL_ID) {
+                               if (a->RcExtensionSupported &&
+                                   (extended_info_type != DIVA_RC_TYPE_REMOVE_COMPLETE)) {
+                                       dtrc(dprintf("XDI: N-REMOVE, A(%02x) Id:%02x, ignore RC=OK",
+                                                    XDI_A_NR(a), Id));
+                                       return (0);
+                               }
+                               if (extended_info_type == DIVA_RC_TYPE_REMOVE_COMPLETE)
+                                       a->RcExtensionSupported = true;
+                       }
+                       a->misc_flags_table[e_no] &= ~DIVA_MISC_FLAGS_REMOVE_PENDING;
+                       a->misc_flags_table[e_no] &= ~DIVA_MISC_FLAGS_NO_RC_CANCELLING;
+                       free_entity(a, e_no);
+                       for (i = 0; i < 256; i++)
+                       {
+                               if (a->FlowControlIdTable[i] == Id)
+                                       a->FlowControlIdTable[i] = 0;
+                       }
+                       a->IdTable[Id] = 0;
+                       this->Id = 0;
+                       /* ---------------------------------------------------------------
+                          If we send N_DISC or N_DISK_ACK after we have received OK_FC
+                          then the card will respond with OK_FC and later with RC==OK.
+                          If we send N_REMOVE in this state we will receive only RC==OK
+                          This will create the state in that the XDI is waiting for the
+                          additional RC and does not delivery the RC to the client. This
+                          code corrects the counter of outstanding RC's in this case.
+                          --------------------------------------------------------------- */
+                       if ((this->More & XMOREC) > 1) {
+                               this->More &= ~XMOREC;
+                               this->More |= 1;
+                               dtrc(dprintf("XDI: correct MORE on REMOVE A(%02x) Id:%02x",
+                                            XDI_A_NR(a), Id));
+                       }
+               }
+               if (Rc == OK_FC) {
+                       a->FlowControlIdTable[Ch] = Id;
+                       a->FlowControlSkipTable[Ch] = false;
+                       this->Rc = Rc;
+                       this->More &= ~(XBUSY | XMOREC);
+                       this->complete = 0xff;
+                       xdi_xlog_rc_event(XDI_A_NR(a), Id, Ch, Rc, 1, a->IdTypeTable[this->No]);
+                       CALLBACK(a, this);
+                       return 0;
+               }
+               /*
+                 New protocol code sends return codes that comes from release
+                 of flow control condition marked with DIVA_RC_TYPE_OK_FC extended
+                 information element type.
+                 If like return code arrives then application is able to process
+                 all return codes self and XDI should not cances return codes.
+                 This return code does not decrement XMOREC partial return code
+                 counter due to fact that it was no request for this return code,
+                 also XMOREC was not incremented.
+               */
+               if (extended_info_type == DIVA_RC_TYPE_OK_FC) {
+                       a->misc_flags_table[e_no] |= DIVA_MISC_FLAGS_NO_RC_CANCELLING;
+                       this->Rc = Rc;
+                       this->complete = 0xff;
+                       xdi_xlog_rc_event(XDI_A_NR(a), Id, Ch, Rc, 1, a->IdTypeTable[this->No]);
+                       DBG_TRC(("XDI OK_FC A(%02x) Id:%02x Ch:%02x Rc:%02x",
+                                XDI_A_NR(a), Id, Ch, Rc))
+                               CALLBACK(a, this);
+                       return 0;
+               }
+               cancel_rc = !(a->misc_flags_table[e_no] & DIVA_MISC_FLAGS_NO_RC_CANCELLING);
+               if (cancel_rc && (a->FlowControlIdTable[Ch] == Id))
+               {
+                       a->FlowControlIdTable[Ch] = 0;
+                       if ((Rc != OK) || !a->FlowControlSkipTable[Ch])
+                       {
+                               this->Rc = Rc;
+                               if (Ch == this->ReqCh)
+                               {
+                                       this->More &= ~(XBUSY | XMOREC);
+                                       this->complete = 0xff;
+                               }
+                               xdi_xlog_rc_event(XDI_A_NR(a), Id, Ch, Rc, 1, a->IdTypeTable[this->No]);
+                               CALLBACK(a, this);
+                       }
+                       return 0;
+               }
+               if (this->More & XMOREC)
+                       this->More--;
+               /* call the application callback function                   */
+               if (((!cancel_rc) || (this->More & XMOREF)) && !(this->More & XMOREC)) {
+                       this->Rc = Rc;
+                       this->More &= ~XBUSY;
+                       this->complete = 0xff;
+                       xdi_xlog_rc_event(XDI_A_NR(a), Id, Ch, Rc, 1, a->IdTypeTable[this->No]);
+                       CALLBACK(a, this);
+               }
+               return 0;
+       }
+       /* if it's an ASSIGN return code check if it's a return     */
+       /* code to an ASSIGN request from us                        */
+       if ((Rc & 0xf0) == ASSIGN_RC) {
+               e_no = get_assign(a, Ref);
+               if (e_no) {
+                       this = entity_ptr(a, e_no);
+                       this->Id = Id;
+                       xdi_xlog_rc_event(XDI_A_NR(a), Id, Ch, Rc, 2, a->IdTypeTable[this->No]);
+                       /* call the application callback function                   */
+                       this->Rc = Rc;
+                       this->More &= ~XBUSY;
+                       this->complete = 0xff;
 #if defined(DIVA_ISTREAM) /* { */
-      if ((Rc == ASSIGN_OK) && a->ram_offset &&
-          (a->IdTypeTable[this->No] == NL_ID) &&
-          ((extended_info_type == DIVA_RC_TYPE_RX_DMA) ||
-          (extended_info_type == DIVA_RC_TYPE_CMA_PTR)) &&
-          extended_info) {
-        dword offset = (*(a->ram_offset)) (a);
-        dword tmp[2];
-        extended_info -= offset;
+                       if ((Rc == ASSIGN_OK) && a->ram_offset &&
+                           (a->IdTypeTable[this->No] == NL_ID) &&
+                           ((extended_info_type == DIVA_RC_TYPE_RX_DMA) ||
+                            (extended_info_type == DIVA_RC_TYPE_CMA_PTR)) &&
+                           extended_info) {
+                               dword offset = (*(a->ram_offset)) (a);
+                               dword tmp[2];
+                               extended_info -= offset;
 #ifdef PLATFORM_GT_32BIT
-        a->ram_in_dw(a, (void*)ULongToPtr(extended_info), (dword*)&tmp[0], 2);
+                               a->ram_in_dw(a, (void *)ULongToPtr(extended_info), (dword *)&tmp[0], 2);
 #else
-        a->ram_in_dw(a, (void*)extended_info, (dword*)&tmp[0], 2);
+                               a->ram_in_dw(a, (void *)extended_info, (dword *)&tmp[0], 2);
 #endif
-        a->tx_stream[Id]  = tmp[0];
-        a->rx_stream[Id]  = tmp[1];
-        if (extended_info_type == DIVA_RC_TYPE_RX_DMA) {
-          DBG_TRC(("Id=0x%x RxDMA=%08x:%08x",
-                    Id, a->tx_stream[Id], a->rx_stream[Id]))
-          a->misc_flags_table[this->No] |= DIVA_MISC_FLAGS_RX_DMA;
-        } else {
-          DBG_TRC(("Id=0x%x CMA=%08x:%08x",
-                    Id, a->tx_stream[Id], a->rx_stream[Id]))
-          a->misc_flags_table[this->No] &= ~DIVA_MISC_FLAGS_RX_DMA;
-          a->rx_pos[Id]     = 0;
-          a->rx_stream[Id] -= offset;
-        }
-        a->tx_pos[Id]     = 0;
-        a->tx_stream[Id] -= offset;
-      } else {
-        a->tx_stream[Id] = 0;
-        a->rx_stream[Id] = 0;
-        a->misc_flags_table[this->No] &= ~DIVA_MISC_FLAGS_RX_DMA;
-      }
+                               a->tx_stream[Id]  = tmp[0];
+                               a->rx_stream[Id]  = tmp[1];
+                               if (extended_info_type == DIVA_RC_TYPE_RX_DMA) {
+                                       DBG_TRC(("Id=0x%x RxDMA=%08x:%08x",
+                                                Id, a->tx_stream[Id], a->rx_stream[Id]))
+                                               a->misc_flags_table[this->No] |= DIVA_MISC_FLAGS_RX_DMA;
+                               } else {
+                                       DBG_TRC(("Id=0x%x CMA=%08x:%08x",
+                                                Id, a->tx_stream[Id], a->rx_stream[Id]))
+                                               a->misc_flags_table[this->No] &= ~DIVA_MISC_FLAGS_RX_DMA;
+                                       a->rx_pos[Id]     = 0;
+                                       a->rx_stream[Id] -= offset;
+                               }
+                               a->tx_pos[Id]     = 0;
+                               a->tx_stream[Id] -= offset;
+                       } else {
+                               a->tx_stream[Id] = 0;
+                               a->rx_stream[Id] = 0;
+                               a->misc_flags_table[this->No] &= ~DIVA_MISC_FLAGS_RX_DMA;
+                       }
 #endif /* } */
-      CALLBACK(a, this);
-      if(Rc==ASSIGN_OK) {
-        a->IdTable[Id] = e_no;
-      }
-      else
-      {
-        free_entity(a, e_no);
-        for (i = 0; i < 256; i++)
-        {
-          if (a->FlowControlIdTable[i] == Id)
-            a->FlowControlIdTable[i] = 0;
-        }
-        a->IdTable[Id] = 0;
-        this->Id = 0;
-      }
-      return 1;
-    }
-  }
-  return 2;
+                       CALLBACK(a, this);
+                       if (Rc == ASSIGN_OK) {
+                               a->IdTable[Id] = e_no;
+                       }
+                       else
+                       {
+                               free_entity(a, e_no);
+                               for (i = 0; i < 256; i++)
+                               {
+                                       if (a->FlowControlIdTable[i] == Id)
+                                               a->FlowControlIdTable[i] = 0;
+                               }
+                               a->IdTable[Id] = 0;
+                               this->Id = 0;
+                       }
+                       return 1;
+               }
+       }
+       return 2;
 }
 /*------------------------------------------------------------------*/
 /* indication handler                                               */
@@ -563,273 +563,273 @@ static byte isdn_ind(ADAPTER *a,
                     byte MInd,
                     word MLength)
 {
-  ENTITY  * this;
-  word clength;
-  word offset;
-  BUFFERS  *R;
-  byte* cma = NULL;
+       ENTITY *this;
+       word clength;
+       word offset;
+       BUFFERS *R;
+       byte *cma = NULL;
 #ifdef USE_EXTENDED_DEBUGS
-  {
-    DBG_TRC(("<A%d Id=0x%x Ind=0x%x", ((ISDN_ADAPTER *)a->io)->ANum, Id, Ind))
-  }
+       {
+               DBG_TRC(("<A%d Id=0x%x Ind=0x%x", ((ISDN_ADAPTER *)a->io)->ANum, Id, Ind))
+                       }
 #else
-  dbug(dprintf("isdn_ind(Ind=%x,Id=%x,Ch=%x)",Ind,Id,Ch));
+       dbug(dprintf("isdn_ind(Ind=%x,Id=%x,Ch=%x)", Ind, Id, Ch));
 #endif
-  if(a->IdTable[Id]) {
-    this = entity_ptr(a,a->IdTable[Id]);
-    this->IndCh = Ch;
-    xdi_xlog_ind (XDI_A_NR(a), Id, Ch, Ind,
-                  0/* rnr_valid */, 0 /* rnr */, a->IdTypeTable[this->No]);
-        /* if the Receive More flag is not yet set, this is the     */
-        /* first buffer of the packet                               */
-    if(this->RCurrent==0xff) {
-        /* check for receive buffer chaining                        */
-      if(Ind==this->MInd) {
-        this->complete = 0;
-        this->Ind = MInd;
-      }
-      else {
-        this->complete = 1;
-        this->Ind = Ind;
-      }
-        /* call the application callback function for the receive   */
-        /* look ahead                                               */
-      this->RLength = MLength;
+       if (a->IdTable[Id]) {
+               this = entity_ptr(a, a->IdTable[Id]);
+               this->IndCh = Ch;
+               xdi_xlog_ind(XDI_A_NR(a), Id, Ch, Ind,
+                            0/* rnr_valid */, 0 /* rnr */, a->IdTypeTable[this->No]);
+               /* if the Receive More flag is not yet set, this is the     */
+               /* first buffer of the packet                               */
+               if (this->RCurrent == 0xff) {
+                       /* check for receive buffer chaining                        */
+                       if (Ind == this->MInd) {
+                               this->complete = 0;
+                               this->Ind = MInd;
+                       }
+                       else {
+                               this->complete = 1;
+                               this->Ind = Ind;
+                       }
+                       /* call the application callback function for the receive   */
+                       /* look ahead                                               */
+                       this->RLength = MLength;
 #if defined(DIVA_ISTREAM)
-      if ((a->rx_stream[this->Id] ||
-           (a->misc_flags_table[this->No] & DIVA_MISC_FLAGS_RX_DMA)) &&
-          ((Ind == N_DATA) ||
-           (a->protocol_capabilities & PROTCAP_CMA_ALLPR))) {
-        PISDN_ADAPTER IoAdapter = (PISDN_ADAPTER)a->io ;
-        if (a->misc_flags_table[this->No] & DIVA_MISC_FLAGS_RX_DMA) {
+                       if ((a->rx_stream[this->Id] ||
+                            (a->misc_flags_table[this->No] & DIVA_MISC_FLAGS_RX_DMA)) &&
+                           ((Ind == N_DATA) ||
+                            (a->protocol_capabilities & PROTCAP_CMA_ALLPR))) {
+                               PISDN_ADAPTER IoAdapter = (PISDN_ADAPTER)a->io;
+                               if (a->misc_flags_table[this->No] & DIVA_MISC_FLAGS_RX_DMA) {
 #if defined(DIVA_IDI_RX_DMA)
-          dword d;
-          diva_get_dma_map_entry (\
-                   (struct _diva_dma_map_entry*)IoAdapter->dma_map,
-                   (int)a->rx_stream[this->Id], (void**)&cma, &d);
+                                       dword d;
+                                       diva_get_dma_map_entry(\
+                                               (struct _diva_dma_map_entry *)IoAdapter->dma_map,
+                                               (int)a->rx_stream[this->Id], (void **)&cma, &d);
 #else
-          cma = &a->stream_buffer[0];
-          cma[0] = cma[1] = cma[2] = cma[3] = 0;
+                                       cma = &a->stream_buffer[0];
+                                       cma[0] = cma[1] = cma[2] = cma[3] = 0;
 #endif
-          this->RLength = MLength = (word)*(dword*)cma;
-          cma += 4;
-        } else {
-        int final = 0;
-        cma = &a->stream_buffer[0];
-        this->RLength = MLength = (word)diva_istream_read (a,
-                                                     Id,
-                                                     cma,
-                                                     sizeof(a->stream_buffer),
-                                                     &final, NULL, NULL);
-        }
-        IoAdapter->RBuffer.length = min(MLength, (word)270);
-        if (IoAdapter->RBuffer.length != MLength) {
-          this->complete = 0;
-        } else {
-          this->complete = 1;
-        }
-        memcpy (IoAdapter->RBuffer.P, cma, IoAdapter->RBuffer.length) ;
-        this->RBuffer = (DBUFFER *)&IoAdapter->RBuffer ;
-      }
+                                       this->RLength = MLength = (word)*(dword *)cma;
+                                       cma += 4;
+                               } else {
+                                       int final = 0;
+                                       cma = &a->stream_buffer[0];
+                                       this->RLength = MLength = (word)diva_istream_read(a,
+                                                                                         Id,
+                                                                                         cma,
+                                                                                         sizeof(a->stream_buffer),
+                                                                                         &final, NULL, NULL);
+                               }
+                               IoAdapter->RBuffer.length = min(MLength, (word)270);
+                               if (IoAdapter->RBuffer.length != MLength) {
+                                       this->complete = 0;
+                               } else {
+                                       this->complete = 1;
+                               }
+                               memcpy(IoAdapter->RBuffer.P, cma, IoAdapter->RBuffer.length);
+                               this->RBuffer = (DBUFFER *)&IoAdapter->RBuffer;
+                       }
 #endif
-      if (!cma) {
-        a->ram_look_ahead(a, RBuffer, this);
-      }
-      this->RNum = 0;
-      CALLBACK(a, this);
-        /* map entity ptr, selector could be re-mapped by call to   */
-        /* IDI from within callback                                 */
-      this = entity_ptr(a,a->IdTable[Id]);
-      xdi_xlog_ind (XDI_A_NR(a), Id, Ch, Ind,
-          1/* rnr_valid */, this->RNR/* rnr */, a->IdTypeTable[this->No]);
-        /* check for RNR                                            */
-      if(this->RNR==1) {
-        this->RNR = 0;
-        return 1;
-      }
-        /* if no buffers are provided by the application, the       */
-        /* application want to copy the data itself including       */
-        /* N_MDATA/LL_MDATA chaining                                */
-      if(!this->RNR && !this->RNum) {
-        xdi_xlog_ind (XDI_A_NR(a), Id, Ch, Ind,
-            2/* rnr_valid */, 0/* rnr */, a->IdTypeTable[this->No]);
-        return 0;
-      }
-        /* if there is no RNR, set the More flag                    */
-      this->RCurrent = 0;
-      this->ROffset = 0;
-    }
-    if(this->RNR==2) {
-      if(Ind!=this->MInd) {
-        this->RCurrent = 0xff;
-        this->RNR = 0;
-      }
-      return 0;
-    }
-        /* if we have received buffers from the application, copy   */
-        /* the data into these buffers                              */
-    offset = 0;
-    R = PTR_R(a,this);
-    do {
-      if(this->ROffset==R[this->RCurrent].PLength) {
-        this->ROffset = 0;
-        this->RCurrent++;
-      }
-      if (cma) {
-        clength = min(MLength, (word)(R[this->RCurrent].PLength-this->ROffset));
-      } else {
-        clength = min(a->ram_inw(a, &RBuffer->length)-offset,
-                      R[this->RCurrent].PLength-this->ROffset);
-      }
-      if(R[this->RCurrent].P) {
-        if (cma) {
-          memcpy (PTR_P(a,this,&R[this->RCurrent].P[this->ROffset]),
-                  &cma[offset],
-                  clength);
-        } else {
-          a->ram_in_buffer(a,
-                           &RBuffer->P[offset],
-                           PTR_P(a,this,&R[this->RCurrent].P[this->ROffset]),
-                           clength);
-        }
-      }
-      offset +=clength;
-      this->ROffset +=clength;
-      if (cma) {
-        if (offset >= MLength) {
-          break;
-        }
-        continue;
-      }
-    } while(offset<(a->ram_inw(a, &RBuffer->length)));
-        /* if it's the last buffer of the packet, call the          */
-        /* application callback function for the receive complete   */
-        /* call                                                     */
-    if(Ind!=this->MInd) {
-      R[this->RCurrent].PLength = this->ROffset;
-      if(this->ROffset) this->RCurrent++;
-      this->RNum = this->RCurrent;
-      this->RCurrent = 0xff;
-      this->Ind = Ind;
-      this->complete = 2;
-      xdi_xlog_ind (XDI_A_NR(a), Id, Ch, Ind,
-          3/* rnr_valid */, 0/* rnr */, a->IdTypeTable[this->No]);
-      CALLBACK(a, this);
-    }
-    return 0;
-  }
-  return 2;
+                       if (!cma) {
+                               a->ram_look_ahead(a, RBuffer, this);
+                       }
+                       this->RNum = 0;
+                       CALLBACK(a, this);
+                       /* map entity ptr, selector could be re-mapped by call to   */
+                       /* IDI from within callback                                 */
+                       this = entity_ptr(a, a->IdTable[Id]);
+                       xdi_xlog_ind(XDI_A_NR(a), Id, Ch, Ind,
+                                    1/* rnr_valid */, this->RNR/* rnr */, a->IdTypeTable[this->No]);
+                       /* check for RNR                                            */
+                       if (this->RNR == 1) {
+                               this->RNR = 0;
+                               return 1;
+                       }
+                       /* if no buffers are provided by the application, the       */
+                       /* application want to copy the data itself including       */
+                       /* N_MDATA/LL_MDATA chaining                                */
+                       if (!this->RNR && !this->RNum) {
+                               xdi_xlog_ind(XDI_A_NR(a), Id, Ch, Ind,
+                                            2/* rnr_valid */, 0/* rnr */, a->IdTypeTable[this->No]);
+                               return 0;
+                       }
+                       /* if there is no RNR, set the More flag                    */
+                       this->RCurrent = 0;
+                       this->ROffset = 0;
+               }
+               if (this->RNR == 2) {
+                       if (Ind != this->MInd) {
+                               this->RCurrent = 0xff;
+                               this->RNR = 0;
+                       }
+                       return 0;
+               }
+               /* if we have received buffers from the application, copy   */
+               /* the data into these buffers                              */
+               offset = 0;
+               R = PTR_R(a, this);
+               do {
+                       if (this->ROffset == R[this->RCurrent].PLength) {
+                               this->ROffset = 0;
+                               this->RCurrent++;
+                       }
+                       if (cma) {
+                               clength = min(MLength, (word)(R[this->RCurrent].PLength-this->ROffset));
+                       } else {
+                               clength = min(a->ram_inw(a, &RBuffer->length)-offset,
+                                             R[this->RCurrent].PLength-this->ROffset);
+                       }
+                       if (R[this->RCurrent].P) {
+                               if (cma) {
+                                       memcpy(PTR_P(a, this, &R[this->RCurrent].P[this->ROffset]),
+                                              &cma[offset],
+                                              clength);
+                               } else {
+                                       a->ram_in_buffer(a,
+                                                        &RBuffer->P[offset],
+                                                        PTR_P(a, this, &R[this->RCurrent].P[this->ROffset]),
+                                                        clength);
+                               }
+                       }
+                       offset += clength;
+                       this->ROffset += clength;
+                       if (cma) {
+                               if (offset >= MLength) {
+                                       break;
+                               }
+                               continue;
+                       }
+               } while (offset < (a->ram_inw(a, &RBuffer->length)));
+               /* if it's the last buffer of the packet, call the          */
+               /* application callback function for the receive complete   */
+               /* call                                                     */
+               if (Ind != this->MInd) {
+                       R[this->RCurrent].PLength = this->ROffset;
+                       if (this->ROffset) this->RCurrent++;
+                       this->RNum = this->RCurrent;
+                       this->RCurrent = 0xff;
+                       this->Ind = Ind;
+                       this->complete = 2;
+                       xdi_xlog_ind(XDI_A_NR(a), Id, Ch, Ind,
+                                    3/* rnr_valid */, 0/* rnr */, a->IdTypeTable[this->No]);
+                       CALLBACK(a, this);
+               }
+               return 0;
+       }
+       return 2;
 }
 #if defined(XDI_USE_XLOG)
 /* -----------------------------------------------------------
    This function works in the same way as xlog on the
    active board
    ----------------------------------------------------------- */
-static void xdi_xlog (byte *msg, word code, int length) {
-  xdi_dbg_xlog ("\x00\x02", msg, code, length);
+static void xdi_xlog(byte *msg, word code, int length) {
+       xdi_dbg_xlog("\x00\x02", msg, code, length);
 }
 #endif
 /* -----------------------------------------------------------
-    This function writes the information about the Return Code
-    processing in the trace buffer. Trace ID is 221.
-    INPUT:
-        Adapter - system unicue adapter number (0 ... 255)
-        Id      - Id of the entity that had sent this return code
-        Ch      - Channel of the entity that had sent this return code
-        Rc      - return code value
-        cb:       (0...2)
-                  switch (cb) {
-                   case 0: printf ("DELIVERY"); break;
-                   case 1: printf ("CALLBACK"); break;
-                   case 2: printf ("ASSIGN"); break;
-                  }
-                  DELIVERY - have entered isdn_rc with this RC
-                  CALLBACK - about to make callback to the application
-                             for this RC
-                  ASSIGN   - about to make callback for RC that is result
-                             of ASSIGN request. It is no DELIVERY message
-                             before of this message
-        type   - the Id that was sent by the ASSIGN of this entity.
-                 This should be global Id like NL_ID, DSIG_ID, MAN_ID.
-                 An unknown Id will cause "?-" in the front of the request.
-                 In this case the log.c is to be extended.
+   This function writes the information about the Return Code
+   processing in the trace buffer. Trace ID is 221.
+   INPUT:
+   Adapter - system unicue adapter number (0 ... 255)
+   Id      - Id of the entity that had sent this return code
+   Ch      - Channel of the entity that had sent this return code
+   Rc      - return code value
+   cb:       (0...2)
+   switch (cb) {
+   case 0: printf ("DELIVERY"); break;
+   case 1: printf ("CALLBACK"); break;
+   case 2: printf ("ASSIGN"); break;
+   }
+   DELIVERY - have entered isdn_rc with this RC
+   CALLBACK - about to make callback to the application
+   for this RC
+   ASSIGN   - about to make callback for RC that is result
+   of ASSIGN request. It is no DELIVERY message
+   before of this message
+   type   - the Id that was sent by the ASSIGN of this entity.
+   This should be global Id like NL_ID, DSIG_ID, MAN_ID.
+   An unknown Id will cause "?-" in the front of the request.
+   In this case the log.c is to be extended.
    ----------------------------------------------------------- */
-static void xdi_xlog_rc_event (byte Adapter,
-                               byte Id, byte Ch, byte Rc, byte cb, byte type) {
+static void xdi_xlog_rc_event(byte Adapter,
+                             byte Id, byte Ch, byte Rc, byte cb, byte type) {
 #if defined(XDI_USE_XLOG)
-  word LogInfo[4];
-  PUT_WORD(&LogInfo[0], ((word)Adapter | (word)(xdi_xlog_sec++ << 8)));
-  PUT_WORD(&LogInfo[1], ((word)Id | (word)(Ch << 8)));
-  PUT_WORD(&LogInfo[2], ((word)Rc | (word)(type << 8)));
-  PUT_WORD(&LogInfo[3], cb);
-  xdi_xlog ((byte*)&LogInfo[0], 221, sizeof(LogInfo));
+       word LogInfo[4];
+       PUT_WORD(&LogInfo[0], ((word)Adapter | (word)(xdi_xlog_sec++ << 8)));
+       PUT_WORD(&LogInfo[1], ((word)Id | (word)(Ch << 8)));
+       PUT_WORD(&LogInfo[2], ((word)Rc | (word)(type << 8)));
+       PUT_WORD(&LogInfo[3], cb);
+       xdi_xlog((byte *)&LogInfo[0], 221, sizeof(LogInfo));
 #endif
 }
 /* ------------------------------------------------------------------------
-    This function writes the information about the request processing
-    in the trace buffer. Trace ID is 220.
-    INPUT:
-        Adapter - system unicue adapter number (0 ... 255)
-        Id      - Id of the entity that had sent this request
-        Ch      - Channel of the entity that had sent this request
-        Req     - Code of the request
-        type    - the Id that was sent by the ASSIGN of this entity.
-                  This should be global Id like NL_ID, DSIG_ID, MAN_ID.
-                  An unknown Id will cause "?-" in the front of the request.
-                  In this case the log.c is to be extended.
+   This function writes the information about the request processing
+   in the trace buffer. Trace ID is 220.
+   INPUT:
+   Adapter - system unicue adapter number (0 ... 255)
+   Id      - Id of the entity that had sent this request
+   Ch      - Channel of the entity that had sent this request
+   Req     - Code of the request
+   type    - the Id that was sent by the ASSIGN of this entity.
+   This should be global Id like NL_ID, DSIG_ID, MAN_ID.
+   An unknown Id will cause "?-" in the front of the request.
+   In this case the log.c is to be extended.
    ------------------------------------------------------------------------ */
-static void xdi_xlog_request (byte Adapter, byte Id,
-                              byte Ch, byte Req, byte type) {
+static void xdi_xlog_request(byte Adapter, byte Id,
+                            byte Ch, byte Req, byte type) {
 #if defined(XDI_USE_XLOG)
-  word LogInfo[3];
-  PUT_WORD(&LogInfo[0], ((word)Adapter | (word)(xdi_xlog_sec++ << 8)));
-  PUT_WORD(&LogInfo[1], ((word)Id | (word)(Ch << 8)));
-  PUT_WORD(&LogInfo[2], ((word)Req | (word)(type << 8)));
-  xdi_xlog ((byte*)&LogInfo[0], 220, sizeof(LogInfo));
+       word LogInfo[3];
+       PUT_WORD(&LogInfo[0], ((word)Adapter | (word)(xdi_xlog_sec++ << 8)));
+       PUT_WORD(&LogInfo[1], ((word)Id | (word)(Ch << 8)));
+       PUT_WORD(&LogInfo[2], ((word)Req | (word)(type << 8)));
+       xdi_xlog((byte *)&LogInfo[0], 220, sizeof(LogInfo));
 #endif
 }
 /* ------------------------------------------------------------------------
-    This function writes the information about the indication processing
-    in the trace buffer. Trace ID is 222.
-    INPUT:
-        Adapter - system unicue adapter number (0 ... 255)
-        Id      - Id of the entity that had sent this indication
-        Ch      - Channel of the entity that had sent this indication
-        Ind     - Code of the indication
-        rnr_valid: (0 .. 3) supported
-          switch (rnr_valid) {
-            case 0: printf ("DELIVERY"); break;
-            case 1: printf ("RNR=%d", rnr);
-            case 2: printf ("RNum=0");
-            case 3: printf ("COMPLETE");
-          }
-          DELIVERY - indication entered isdn_rc function
-          RNR=...  - application had returned RNR=... after the
-                     look ahead callback
-          RNum=0   - application had not returned any buffer to copy
-                     this indication and will copy it self
-          COMPLETE - XDI had copied the data to the buffers provided
-                     bu the application and is about to issue the
-                     final callback
-        rnr:  Look case 1 of the rnr_valid
-        type: the Id that was sent by the ASSIGN of this entity. This should
-              be global Id like NL_ID, DSIG_ID, MAN_ID. An unknown Id will
-              cause "?-" in the front of the request. In this case the
-              log.c is to be extended.
+   This function writes the information about the indication processing
+   in the trace buffer. Trace ID is 222.
+   INPUT:
+   Adapter - system unicue adapter number (0 ... 255)
+   Id      - Id of the entity that had sent this indication
+   Ch      - Channel of the entity that had sent this indication
+   Ind     - Code of the indication
+   rnr_valid: (0 .. 3) supported
+   switch (rnr_valid) {
+   case 0: printf ("DELIVERY"); break;
+   case 1: printf ("RNR=%d", rnr);
+   case 2: printf ("RNum=0");
+   case 3: printf ("COMPLETE");
+   }
+   DELIVERY - indication entered isdn_rc function
+   RNR=...  - application had returned RNR=... after the
+   look ahead callback
+   RNum=0   - application had not returned any buffer to copy
+   this indication and will copy it self
+   COMPLETE - XDI had copied the data to the buffers provided
+   bu the application and is about to issue the
+   final callback
+   rnr:  Look case 1 of the rnr_valid
+   type: the Id that was sent by the ASSIGN of this entity. This should
+   be global Id like NL_ID, DSIG_ID, MAN_ID. An unknown Id will
+   cause "?-" in the front of the request. In this case the
+   log.c is to be extended.
    ------------------------------------------------------------------------ */
-static void xdi_xlog_ind (byte Adapter,
-                          byte Id,
-                          byte Ch,
-                          byte Ind,
-                          byte rnr_valid,
-                          byte rnr,
-                          byte type) {
+static void xdi_xlog_ind(byte Adapter,
+                        byte Id,
+                        byte Ch,
+                        byte Ind,
+                        byte rnr_valid,
+                        byte rnr,
+                        byte type) {
 #if defined(XDI_USE_XLOG)
-  word LogInfo[4];
-  PUT_WORD(&LogInfo[0], ((word)Adapter | (word)(xdi_xlog_sec++ << 8)));
-  PUT_WORD(&LogInfo[1], ((word)Id | (word)(Ch << 8)));
-  PUT_WORD(&LogInfo[2], ((word)Ind | (word)(type << 8)));
-  PUT_WORD(&LogInfo[3], ((word)rnr | (word)(rnr_valid << 8)));
-  xdi_xlog ((byte*)&LogInfo[0], 222, sizeof(LogInfo));
+       word LogInfo[4];
+       PUT_WORD(&LogInfo[0], ((word)Adapter | (word)(xdi_xlog_sec++ << 8)));
+       PUT_WORD(&LogInfo[1], ((word)Id | (word)(Ch << 8)));
+       PUT_WORD(&LogInfo[2], ((word)Ind | (word)(type << 8)));
+       PUT_WORD(&LogInfo[3], ((word)rnr | (word)(rnr_valid << 8)));
+       xdi_xlog((byte *)&LogInfo[0], 222, sizeof(LogInfo));
 #endif
 }
index dcf37b1..ff26c65 100644 (file)
@@ -1,26 +1,26 @@
 
 /*
  *
-  Copyright (c) Eicon Networks, 2002.
+ Copyright (c) Eicon Networks, 2002.
  *
-  This source file is supplied for the use with
-  Eicon Networks range of DIVA Server Adapters.
+ This source file is supplied for the use with
+ Eicon Networks range of DIVA Server Adapters.
  *
-  Eicon File Revision :    2.1
+ Eicon File Revision :    2.1
  *
-  This program is free software; you can redistribute it and/or modify
-  it under the terms of the GNU General Public License as published by
-  the Free Software Foundation; either version 2, or (at your option)
-  any later version.
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
  *
-  This program is distributed in the hope that it will be useful,
-  but WITHOUT ANY WARRANTY OF ANY KIND WHATSOEVER INCLUDING ANY
-  implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-  See the GNU General Public License for more details.
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY OF ANY KIND WHATSOEVER INCLUDING ANY
+ implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ See the GNU General Public License for more details.
  *
-  You should have received a copy of the GNU General Public License
-  along with this program; if not, write to the Free Software
-  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  *
  */
 /*
 #define DIVA_MISC_FLAGS_REMOVE_PENDING    0x01
 #define DIVA_MISC_FLAGS_NO_RC_CANCELLING  0x02
 #define DIVA_MISC_FLAGS_RX_DMA            0x04
-        /* structure for all information we have to keep on a per   */
-        /* adapater basis                                           */
+/* structure for all information we have to keep on a per   */
+/* adapater basis                                           */
 typedef struct adapter_s ADAPTER;
 struct adapter_s {
-  void * io;
-  byte IdTable[256];
-  byte IdTypeTable[256];
-  byte FlowControlIdTable[256];
-  byte FlowControlSkipTable[256];
-  byte ReadyInt;
-  byte RcExtensionSupported;
-  byte misc_flags_table[256];
-  dword protocol_capabilities;
-  byte ( * ram_in)(ADAPTER * a, void * adr);
-  word ( * ram_inw)(ADAPTER * a, void * adr);
-  void (* ram_in_buffer)(ADAPTER * a, void * adr, void  * P, word length);
-  void (* ram_look_ahead)(ADAPTER * a, PBUFFER * RBuffer, ENTITY  * e);
-  void ( * ram_out)(ADAPTER * a, void * adr, byte data);
-  void ( * ram_outw)(ADAPTER * a, void * adr, word data);
-  void (* ram_out_buffer)(ADAPTER * a, void * adr, void  * P, word length);
-  void ( * ram_inc)(ADAPTER * a, void * adr);
+       void *io;
+       byte IdTable[256];
+       byte IdTypeTable[256];
+       byte FlowControlIdTable[256];
+       byte FlowControlSkipTable[256];
+       byte ReadyInt;
+       byte RcExtensionSupported;
+       byte misc_flags_table[256];
+       dword protocol_capabilities;
+       byte (*ram_in)(ADAPTER *a, void *adr);
+       word (*ram_inw)(ADAPTER *a, void *adr);
+       void (*ram_in_buffer)(ADAPTER *a, void *adr, void *P, word length);
+       void (*ram_look_ahead)(ADAPTER *a, PBUFFER *RBuffer, ENTITY *e);
+       void (*ram_out)(ADAPTER *a, void *adr, byte data);
+       void (*ram_outw)(ADAPTER *a, void *adr, word data);
+       void (*ram_out_buffer)(ADAPTER *a, void *adr, void *P, word length);
+       void (*ram_inc)(ADAPTER *a, void *adr);
 #if defined(DIVA_ISTREAM)
-  dword rx_stream[256];
-  dword tx_stream[256];
-  word tx_pos[256];
-  word rx_pos[256];
-  byte stream_buffer[2512];
-  dword ( * ram_offset)(ADAPTER * a);
-  void ( * ram_out_dw) (ADAPTER *a,
-                                    void *addr,
-                                    const dword* data,
-                                    int dwords);
-  void ( * ram_in_dw) (ADAPTER *a,
-                                   void *addr,
-                                   dword* data,
-                                   int dwords);
-  void ( * istream_wakeup)(ADAPTER* a);
+       dword rx_stream[256];
+       dword tx_stream[256];
+       word tx_pos[256];
+       word rx_pos[256];
+       byte stream_buffer[2512];
+       dword (*ram_offset)(ADAPTER *a);
+       void (*ram_out_dw)(ADAPTER *a,
+                          void *addr,
+                          const dword *data,
+                          int dwords);
+       void (*ram_in_dw)(ADAPTER *a,
+                         void *addr,
+                         dword *data,
+                         int dwords);
+       void (*istream_wakeup)(ADAPTER *a);
 #else
-  byte stream_buffer[4];
+       byte stream_buffer[4];
 #endif
 };
 /*------------------------------------------------------------------*/
 /* public functions of IDI common code                              */
 /*------------------------------------------------------------------*/
-void pr_out(ADAPTER * a);
-byte pr_dpc(ADAPTER * a);
-byte scom_test_int(ADAPTER * a);
-void scom_clear_int(ADAPTER * a);
+void pr_out(ADAPTER *a);
+byte pr_dpc(ADAPTER *a);
+byte scom_test_int(ADAPTER *a);
+void scom_clear_int(ADAPTER *a);
 /*------------------------------------------------------------------*/
 /* OS specific functions used by IDI common code                    */
 /*------------------------------------------------------------------*/
-void free_entity(ADAPTER * a, byte e_no);
-void assign_queue(ADAPTER * a, byte e_no, word ref);
-byte get_assign(ADAPTER * a, word ref);
-void req_queue(ADAPTER * a, byte e_no);
-byte look_req(ADAPTER * a);
-void next_req(ADAPTER * a);
-ENTITY  * entity_ptr(ADAPTER * a, byte e_no);
+void free_entity(ADAPTER *a, byte e_no);
+void assign_queue(ADAPTER *a, byte e_no, word ref);
+byte get_assign(ADAPTER *a, word ref);
+void req_queue(ADAPTER *a, byte e_no);
+byte look_req(ADAPTER *a);
+void next_req(ADAPTER *a);
+ENTITY *entity_ptr(ADAPTER *a, byte e_no);
 #if defined(DIVA_ISTREAM)
 struct _diva_xdi_stream_interface;
-void diva_xdi_provide_istream_info (ADAPTER* a,
-                                    struct _diva_xdi_stream_interface* pI);
-void pr_stream (ADAPTER * a);
-int diva_istream_write (void* context,
-                        int Id,
-                        void* data,
-                        int length,
-                        int final,
-                        byte usr1,
-                        byte usr2);
-int diva_istream_read (void* context,
-                        int Id,
-                        void* data,
-                        int max_length,
-                        int* final,
-                        byte* usr1,
-                        byte* usr2);
+void diva_xdi_provide_istream_info(ADAPTER *a,
+                                  struct _diva_xdi_stream_interface *pI);
+void pr_stream(ADAPTER *a);
+int diva_istream_write(void *context,
+                      int Id,
+                      void *data,
+                      int length,
+                      int final,
+                      byte usr1,
+                      byte usr2);
+int diva_istream_read(void *context,
+                     int Id,
+                     void *data,
+                     int max_length,
+                     int *final,
+                     byte *usr1,
+                     byte *usr2);
 #if defined(DIVA_IDI_RX_DMA)
 #include "diva_dma.h"
 #endif
index d576ff3..1380b60 100644 (file)
@@ -1,34 +1,34 @@
 
 /*
  *
-  Copyright (c) Eicon Networks, 2002.
+ Copyright (c) Eicon Networks, 2002.
  *
-  This source file is supplied for the use with
-  Eicon Networks range of DIVA Server Adapters.
+ This source file is supplied for the use with
+ Eicon Networks range of DIVA Server Adapters.
  *
-  Eicon File Revision :    2.1
+ Eicon File Revision :    2.1
  *
-  This program is free software; you can redistribute it and/or modify
-  it under the terms of the GNU General Public License as published by
-  the Free Software Foundation; either version 2, or (at your option)
-  any later version.
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
  *
-  This program is distributed in the hope that it will be useful,
-  but WITHOUT ANY WARRANTY OF ANY KIND WHATSOEVER INCLUDING ANY
-  implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-  See the GNU General Public License for more details.
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY OF ANY KIND WHATSOEVER INCLUDING ANY
+ implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ See the GNU General Public License for more details.
  *
-  You should have received a copy of the GNU General Public License
-  along with this program; if not, write to the Free Software
-  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  *
  */
 #ifndef __DIVA_DI_DBG_INC__
 #define __DIVA_DI_DBG_INC__
-#if !defined (dtrc)
+#if !defined(dtrc)
 #define dtrc(a)
 #endif
-#if !defined (dbug)
+#if !defined(dbug)
 #define dbug(a)
 #endif
 #if !defined USE_EXTENDED_DEBUGS
index 4c2f612..a5094d2 100644 (file)
@@ -1,31 +1,31 @@
 
 /*
  *
-  Copyright (c) Eicon Networks, 2002.
+ Copyright (c) Eicon Networks, 2002.
  *
-  This source file is supplied for the use with
-  Eicon Networks range of DIVA Server Adapters.
+ This source file is supplied for the use with
+ Eicon Networks range of DIVA Server Adapters.
  *
-  Eicon File Revision :    2.1
+ Eicon File Revision :    2.1
  *
-  This program is free software; you can redistribute it and/or modify
-  it under the terms of the GNU General Public License as published by
-  the Free Software Foundation; either version 2, or (at your option)
-  any later version.
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
  *
-  This program is distributed in the hope that it will be useful,
-  but WITHOUT ANY WARRANTY OF ANY KIND WHATSOEVER INCLUDING ANY
-  implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-  See the GNU General Public License for more details.
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY OF ANY KIND WHATSOEVER INCLUDING ANY
+ implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ See the GNU General Public License for more details.
  *
-  You should have received a copy of the GNU General Public License
-  along with this program; if not, write to the Free Software
-  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  *
  */
-#ifndef _DI_DEFS_  
+#ifndef _DI_DEFS_
 #define _DI_DEFS_
-        /* typedefs for our data structures                         */
+/* typedefs for our data structures                         */
 typedef struct get_name_s GET_NAME;
 /*  The entity_s structure is used to pass all
     parameters between application and IDI   */
@@ -38,72 +38,72 @@ typedef struct get_para_s GET_PARA;
 #define IDI_CALL_ENTITY_T
 /* typedef void ( * IDI_CALL)(ENTITY *); */
 /* --------------------------------------------------------
-    IDI_CALL
+   IDI_CALL
    -------------------------------------------------------- */
-typedef void (IDI_CALL_LINK_T * IDI_CALL)(ENTITY IDI_CALL_ENTITY_T *);
+typedef void (IDI_CALL_LINK_T *IDI_CALL)(ENTITY IDI_CALL_ENTITY_T *);
 typedef struct {
-  word length;          /* length of data/parameter field           */
-  byte P[270];          /* data/parameter field                     */
+       word length;          /* length of data/parameter field           */
+       byte P[270];          /* data/parameter field                     */
 } DBUFFER;
 struct get_name_s {
-  word command;         /* command = 0x0100 */
-  byte name[BOARD_NAME_LENGTH];
+       word command;         /* command = 0x0100 */
+       byte name[BOARD_NAME_LENGTH];
 };
 struct postcall_s {
-  word      command;                           /* command = 0x0300 */
-  word      dummy;                             /* not used */
-  void      (  * callback)(void   *);      /* call back */
-  void    *context;                          /* context pointer */
+       word      command;                           /* command = 0x0300 */
+       word      dummy;                             /* not used */
+       void      (*callback)(void *);      /* call back */
+       void      *context;                          /* context pointer */
 };
 #define REQ_PARA            0x0600   /* request command line parameters */
 #define REQ_PARA_LEN             1   /* number of data bytes */
 #define L1_STARTUP_DOWN_POS      0   /* '-y' command line parameter in......*/
 #define L1_STARTUP_DOWN_MSK   0x01   /* first byte position (index 0) with value 0x01 */
 struct get_para_s {
-  word  command;            /* command = 0x0600 */
-  byte  len;                /* max length of para field in bytes */
-  byte  para[REQ_PARA_LEN]; /* parameter field */
+       word  command;            /* command = 0x0600 */
+       byte  len;                /* max length of para field in bytes */
+       byte  para[REQ_PARA_LEN]; /* parameter field */
 };
 struct buffers_s {
-  word PLength;
-  byte   * P;
+       word PLength;
+       byte *P;
 };
 struct entity_s {
-  byte                  Req;            /* pending request          */
-  byte                  Rc;             /* return code received     */
-  byte                  Ind;            /* indication received      */
-  byte                  ReqCh;          /* channel of current Req   */
-  byte                  RcCh;           /* channel of current Rc    */
-  byte                  IndCh;          /* channel of current Ind   */
-  byte                  Id;             /* ID used by this entity   */
-  byte                  GlobalId;       /* reserved field           */
-  byte                  XNum;           /* number of X-buffers      */
-  byte                  RNum;           /* number of R-buffers      */
-  BUFFERS                 * X;        /* pointer to X-buffer list */
-  BUFFERS                 * R;        /* pointer to R-buffer list */
-  word                  RLength;        /* length of current R-data */
-  DBUFFER   *         RBuffer;        /* buffer of current R-data */
-  byte                  RNR;            /* receive not ready flag   */
-  byte                  complete;       /* receive complete status  */
-  IDI_CALL              callback;
-  word                  user[2];
-        /* fields used by the driver internally                     */
-  byte                  No;             /* entity number            */
-  byte                  reserved2;      /* reserved field           */
-  byte                  More;           /* R/X More flags           */
-  byte                  MInd;           /* MDATA coding for this ID */
-  byte                  XCurrent;       /* current transmit buffer  */
-  byte                  RCurrent;       /* current receive buffer   */
-  word                  XOffset;        /* offset in x-buffer       */
-  word                  ROffset;        /* offset in r-buffer       */
+       byte                  Req;            /* pending request          */
+       byte                  Rc;             /* return code received     */
+       byte                  Ind;            /* indication received      */
+       byte                  ReqCh;          /* channel of current Req   */
+       byte                  RcCh;           /* channel of current Rc    */
+       byte                  IndCh;          /* channel of current Ind   */
+       byte                  Id;             /* ID used by this entity   */
+       byte                  GlobalId;       /* reserved field           */
+       byte                  XNum;           /* number of X-buffers      */
+       byte                  RNum;           /* number of R-buffers      */
+       BUFFERS               *X;             /* pointer to X-buffer list */
+       BUFFERS               *R;             /* pointer to R-buffer list */
+       word                  RLength;        /* length of current R-data */
+       DBUFFER               *RBuffer;       /* buffer of current R-data */
+       byte                  RNR;            /* receive not ready flag   */
+       byte                  complete;       /* receive complete status  */
+       IDI_CALL              callback;
+       word                  user[2];
+       /* fields used by the driver internally                     */
+       byte                  No;             /* entity number            */
+       byte                  reserved2;      /* reserved field           */
+       byte                  More;           /* R/X More flags           */
+       byte                  MInd;           /* MDATA coding for this ID */
+       byte                  XCurrent;       /* current transmit buffer  */
+       byte                  RCurrent;       /* current receive buffer   */
+       word                  XOffset;        /* offset in x-buffer       */
+       word                  ROffset;        /* offset in r-buffer       */
 };
 typedef struct {
-  byte                  type;
-  byte                  channels;
-  word                  features;
-  IDI_CALL              request;
+       byte                  type;
+       byte                  channels;
+       word                  features;
+       IDI_CALL              request;
 } DESCRIPTOR;
-        /* descriptor type field coding */
+/* descriptor type field coding */
 #define IDI_ADAPTER_S           1
 #define IDI_ADAPTER_PR          2
 #define IDI_ADAPTER_DIVA        3
@@ -113,7 +113,7 @@ typedef struct {
 #define IDI_DADAPTER            0xfd
 #define IDI_DIDDPNP             0xfe
 #define IDI_DIMAINT             0xff
-        /* Hardware IDs ISA PNP */
+/* Hardware IDs ISA PNP */
 #define HW_ID_DIVA_PRO     3    /* same as IDI_ADAPTER_DIVA    */
 #define HW_ID_MAESTRA      4    /* same as IDI_ADAPTER_MAESTRA */
 #define HW_ID_PICCOLA      5
@@ -123,7 +123,7 @@ typedef struct {
 #define HW_ID_DIVA20_U     9
 #define HW_ID_DIVA30       10
 #define HW_ID_DIVA30_U     11
-        /* Hardware IDs PCI */
+/* Hardware IDs PCI */
 #define HW_ID_EICON_PCI              0x1133
 #define HW_ID_SIEMENS_PCI            0x8001 /* unused SubVendor ID for Siemens Cornet-N cards */
 #define HW_ID_PROTTYPE_CORNETN       0x0014 /* SubDevice ID for Siemens Cornet-N cards */
@@ -153,16 +153,16 @@ typedef struct {
 #define HW_ID_DSRV_VOICE_P30M_V2_PCI 0xe019
 #define HW_ID_DSRV_B2F_PCI           0xe01a
 #define HW_ID_DSRV_VOICE_B2M_V2_PCI  0xe01b
-        /* Hardware IDs USB */
+/* Hardware IDs USB */
 #define EICON_USB_VENDOR_ID          0x071D
 #define HW_ID_DIVA_USB_REV1          0x1000
 #define HW_ID_DIVA_USB_REV2          0x1003
 #define HW_ID_TELEDAT_SURF_USB_REV2  0x1004
 #define HW_ID_TELEDAT_SURF_USB_REV1  0x2000
 /* --------------------------------------------------------------------------
-  Adapter array change notification framework
-  -------------------------------------------------------------------------- */
-typedef void (IDI_CALL_LINK_T* didd_adapter_change_callback_t)(     void IDI_CALL_ENTITY_T * context, DESCRIPTOR* adapter, int removal);
+   Adapter array change notification framework
+   -------------------------------------------------------------------------- */
+typedef void (IDI_CALL_LINK_T *didd_adapter_change_callback_t)(void IDI_CALL_ENTITY_T *context, DESCRIPTOR *adapter, int removal);
 /* -------------------------------------------------------------------------- */
 #define DI_VOICE          0x0 /* obsolete define */
 #define DI_FAX3           0x1
@@ -177,5 +177,5 @@ typedef void (IDI_CALL_LINK_T* didd_adapter_change_callback_t)(     void IDI_CAL
 #define DI_EXTD_FAX       0x0200 /* Extended FAX (ECM, 2D, T.6, Polling) */
 #define DI_AT_PARSER      0x0400 /* Build-in AT Parser in the L2 */
 #define DI_VOICE_OVER_IP  0x0800 /* Voice over IP support */
-typedef void (IDI_CALL_LINK_T* _IDI_CALL)(void*, ENTITY*);  
-#endif  
+typedef void (IDI_CALL_LINK_T *_IDI_CALL)(void *, ENTITY *);
+#endif
index 538c590..fa8db82 100644 (file)
@@ -1,26 +1,26 @@
 
 /*
  *
-  Copyright (c) Eicon Networks, 2002.
+ Copyright (c) Eicon Networks, 2002.
  *
-  This source file is supplied for the use with
-  Eicon Networks range of DIVA Server Adapters.
+ This source file is supplied for the use with
+ Eicon Networks range of DIVA Server Adapters.
  *
-  Eicon File Revision :    2.1
+ Eicon File Revision :    2.1
  *
-  This program is free software; you can redistribute it and/or modify
-  it under the terms of the GNU General Public License as published by
-  the Free Software Foundation; either version 2, or (at your option)
-  any later version.
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
  *
-  This program is distributed in the hope that it will be useful,
-  but WITHOUT ANY WARRANTY OF ANY KIND WHATSOEVER INCLUDING ANY
-  implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-  See the GNU General Public License for more details.
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY OF ANY KIND WHATSOEVER INCLUDING ANY
+ implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ See the GNU General Public License for more details.
  *
-  You should have received a copy of the GNU General Public License
-  along with this program; if not, write to the Free Software
-  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  *
  */
-static char diva_didd_common_code_build[] = "102-51";  
+static char diva_didd_common_code_build[] = "102-51";
index 3029234..c4c8220 100644 (file)
@@ -1,12 +1,12 @@
 /* $Id: diddfunc.c,v 1.14.6.2 2004/08/28 20:03:53 armin Exp $
  *
  * DIDD Interface module for Eicon active cards.
- * 
- * Functions are in dadapter.c 
- * 
- * Copyright 2002-2003 by Armin Schindler (mac@melware.de) 
+ *
+ * Functions are in dadapter.c
+ *
+ * Copyright 2002-2003 by Armin Schindler (mac@melware.de)
  * Copyright 2002-2003 Cytronics & Melware (info@melware.de)
- * 
+ *
  * This software may be used and distributed according to the terms
  * of the GNU General Public License, incorporated herein by reference.
  */
@@ -28,12 +28,12 @@ static DESCRIPTOR _DAdapter;
 /*
  * didd callback function
  */
-static void *didd_callback(void *context, DESCRIPTOR * adapter,
+static void *didd_callback(void *context, DESCRIPTOR *adapter,
                           int removal)
 {
        if (adapter->type == IDI_DADAPTER) {
                DBG_ERR(("Notification about IDI_DADAPTER change ! Oops."))
-               return (NULL);
+                       return (NULL);
        } else if (adapter->type == IDI_DIMAINT) {
                if (removal) {
                        DbgDeregister();
@@ -62,10 +62,10 @@ static int DIVA_INIT_FUNCTION connect_didd(void)
                        memcpy(&_DAdapter, &DIDD_Table[x], sizeof(_DAdapter));
                        req.didd_notify.e.Req = 0;
                        req.didd_notify.e.Rc =
-                           IDI_SYNC_REQ_DIDD_REGISTER_ADAPTER_NOTIFY;
+                               IDI_SYNC_REQ_DIDD_REGISTER_ADAPTER_NOTIFY;
                        req.didd_notify.info.callback = (void *)didd_callback;
                        req.didd_notify.info.context = NULL;
-                       _DAdapter.request((ENTITY *) & req);
+                       _DAdapter.request((ENTITY *)&req);
                        if (req.didd_notify.e.Rc != 0xff)
                                return (0);
                        notify_handle = req.didd_notify.info.handle;
@@ -86,7 +86,7 @@ static void DIVA_EXIT_FUNCTION disconnect_didd(void)
        req.didd_notify.e.Req = 0;
        req.didd_notify.e.Rc = IDI_SYNC_REQ_DIDD_REMOVE_ADAPTER_NOTIFY;
        req.didd_notify.info.handle = notify_handle;
-       _DAdapter.request((ENTITY *) & req);
+       _DAdapter.request((ENTITY *)&req);
 }
 
 /*
@@ -98,7 +98,7 @@ int DIVA_INIT_FUNCTION diddfunc_init(void)
 
        if (!connect_didd()) {
                DBG_ERR(("init: failed to connect to DIDD."))
-               diva_didd_load_time_finit();
+                       diva_didd_load_time_finit();
                return (0);
        }
        return (1);
index 1403a54..d91dd58 100644 (file)
 
 PISDN_ADAPTER IoAdapters[MAX_ADAPTER];
 extern IDI_CALL Requests[MAX_ADAPTER];
-extern int create_adapter_proc(diva_os_xdi_adapter_t * a);
-extern void remove_adapter_proc(diva_os_xdi_adapter_t * a);
+extern int create_adapter_proc(diva_os_xdi_adapter_t *a);
+extern void remove_adapter_proc(diva_os_xdi_adapter_t *a);
 
-#define DivaIdiReqFunc(N) \
-static void DivaIdiRequest##N(ENTITY *e) \
-{ if ( IoAdapters[N] ) (* IoAdapters[N]->DIRequest)(IoAdapters[N], e) ; }
+#define DivaIdiReqFunc(N)                                              \
+       static void DivaIdiRequest##N(ENTITY *e)                        \
+       { if (IoAdapters[N]) (*IoAdapters[N]->DIRequest)(IoAdapters[N], e); }
 
 /*
 **  Create own 32 Adapters
@@ -91,44 +91,44 @@ typedef struct _diva_supported_cards_info {
 static diva_supported_cards_info_t divas_supported_cards[] = {
 #ifdef CONFIG_ISDN_DIVAS_PRIPCI
        /*
-          PRI Cards
-        */
+         PRI Cards
+       */
        {CARDTYPE_DIVASRV_P_30M_PCI, diva_pri_init_card},
        /*
-          PRI Rev.2 Cards
-        */
+         PRI Rev.2 Cards
+       */
        {CARDTYPE_DIVASRV_P_30M_V2_PCI, diva_pri_init_card},
        /*
-          PRI Rev.2 VoIP Cards
-        */
+         PRI Rev.2 VoIP Cards
+       */
        {CARDTYPE_DIVASRV_VOICE_P_30M_V2_PCI, diva_pri_init_card},
 #endif
 #ifdef CONFIG_ISDN_DIVAS_BRIPCI
        /*
-          4BRI Rev 1 Cards
-        */
+         4BRI Rev 1 Cards
+       */
        {CARDTYPE_DIVASRV_Q_8M_PCI, diva_4bri_init_card},
        {CARDTYPE_DIVASRV_VOICE_Q_8M_PCI, diva_4bri_init_card},
        /*
-          4BRI Rev 2 Cards
-        */
+         4BRI Rev 2 Cards
+       */
        {CARDTYPE_DIVASRV_Q_8M_V2_PCI, diva_4bri_init_card},
        {CARDTYPE_DIVASRV_VOICE_Q_8M_V2_PCI, diva_4bri_init_card},
        /*
-          4BRI Based BRI Rev 2 Cards
-        */
+         4BRI Based BRI Rev 2 Cards
+       */
        {CARDTYPE_DIVASRV_B_2M_V2_PCI, diva_4bri_init_card},
        {CARDTYPE_DIVASRV_B_2F_PCI, diva_4bri_init_card},
        {CARDTYPE_DIVASRV_VOICE_B_2M_V2_PCI, diva_4bri_init_card},
        /*
-          BRI
-        */
+         BRI
+       */
        {CARDTYPE_MAESTRA_PCI, diva_bri_init_card},
 #endif
 
        /*
-          EOL
-        */
+         EOL
+       */
        {-1}
 };
 
@@ -150,18 +150,18 @@ static int diva_find_free_adapters(int base, int nr)
        return (0);
 }
 
-static diva_os_xdi_adapter_t *diva_q_get_next(struct list_head * what)
+static diva_os_xdi_adapter_t *diva_q_get_next(struct list_head *what)
 {
        diva_os_xdi_adapter_t *a = NULL;
 
        if (what && (what->next != &adapter_queue))
                a = list_entry(what->next, diva_os_xdi_adapter_t, link);
 
-       return(a);
+       return (a);
 }
 
 /* --------------------------------------------------------------------------
-    Add card to the card list
+   Add card to the card list
    -------------------------------------------------------------------------- */
 void *diva_driver_add_card(void *pdev, unsigned long CardOrdinal)
 {
@@ -203,7 +203,7 @@ void *diva_driver_add_card(void *pdev, unsigned long CardOrdinal)
                                                 [CardOrdinal].Name,
                                                 pdiva->controller))
 
-                                       diva_os_enter_spin_lock(&adapter_lock, &old_irql, "add card");
+                                               diva_os_enter_spin_lock(&adapter_lock, &old_irql, "add card");
                                        pa = pdiva;
                                        for (j = 1; j < nr; j++) {      /* slave adapters, if any */
                                                pa = diva_q_get_next(&pa->link);
@@ -214,11 +214,11 @@ void *diva_driver_add_card(void *pdev, unsigned long CardOrdinal)
                                                        diva_os_leave_spin_lock(&adapter_lock, &old_irql, "add card");
                                                        DBG_LOG(("add slave adapter (%d)",
                                                                 pa->controller))
-                                                       create_adapter_proc(pa);        /* add adapter to proc file system */
+                                                               create_adapter_proc(pa);        /* add adapter to proc file system */
                                                        diva_os_enter_spin_lock(&adapter_lock, &old_irql, "add card");
                                                } else {
                                                        DBG_ERR(("slave adapter problem"))
-                                                       break;
+                                                               break;
                                                }
                                        }
 
@@ -230,10 +230,10 @@ void *diva_driver_add_card(void *pdev, unsigned long CardOrdinal)
                        diva_os_leave_spin_lock(&adapter_lock, &old_irql, "add card");
 
                        /*
-                          Not able to add adapter - remove it and return error
-                        */
+                         Not able to add adapter - remove it and return error
+                       */
                        DBG_ERR(("can not alloc request array"))
-                       diva_driver_remove_card(pdiva);
+                               diva_driver_remove_card(pdiva);
 
                        return NULL;
                }
@@ -243,7 +243,7 @@ void *diva_driver_add_card(void *pdev, unsigned long CardOrdinal)
 }
 
 /* --------------------------------------------------------------------------
-    Called on driver load, MAIN, main, DriverEntry
+   Called on driver load, MAIN, main, DriverEntry
    -------------------------------------------------------------------------- */
 int divasa_xdi_driver_entry(void)
 {
@@ -255,7 +255,7 @@ int divasa_xdi_driver_entry(void)
 }
 
 /* --------------------------------------------------------------------------
-    Remove adapter from list
+   Remove adapter from list
    -------------------------------------------------------------------------- */
 static diva_os_xdi_adapter_t *get_and_remove_from_queue(void)
 {
@@ -274,7 +274,7 @@ static diva_os_xdi_adapter_t *get_and_remove_from_queue(void)
 }
 
 /* --------------------------------------------------------------------------
-    Remove card from the card list
+   Remove card from the card list
    -------------------------------------------------------------------------- */
 void diva_driver_remove_card(void *pdiva)
 {
@@ -318,7 +318,7 @@ void diva_driver_remove_card(void *pdiva)
 }
 
 /* --------------------------------------------------------------------------
-    Create diva PCI adapter and init internal adapter structures
+   Create diva PCI adapter and init internal adapter structures
    -------------------------------------------------------------------------- */
 static void *divas_create_pci_card(int handle, void *pci_dev_handle)
 {
@@ -328,10 +328,10 @@ static void *divas_create_pci_card(int handle, void *pci_dev_handle)
 
        DBG_LOG(("found %d-%s", pI->CardOrdinal, CardProperties[pI->CardOrdinal].Name))
 
-       if (!(a = (diva_os_xdi_adapter_t *) diva_os_malloc(0, sizeof(*a)))) {
-               DBG_ERR(("A: can't alloc adapter"));
-               return NULL;
-       }
+               if (!(a = (diva_os_xdi_adapter_t *) diva_os_malloc(0, sizeof(*a)))) {
+                       DBG_ERR(("A: can't alloc adapter"));
+                       return NULL;
+               }
 
        memset(a, 0x00, sizeof(*a));
 
@@ -344,9 +344,9 @@ static void *divas_create_pci_card(int handle, void *pci_dev_handle)
        a->resources.pci.hdev = pci_dev_handle;
 
        /*
-          Add master adapter first, so slave adapters will receive higher
-          numbers as master adapter
-        */
+         Add master adapter first, so slave adapters will receive higher
+         numbers as master adapter
+       */
        diva_os_enter_spin_lock(&adapter_lock, &old_irql, "found_pci_card");
        list_add_tail(&a->link, &adapter_queue);
        diva_os_leave_spin_lock(&adapter_lock, &old_irql, "found_pci_card");
@@ -364,7 +364,7 @@ static void *divas_create_pci_card(int handle, void *pci_dev_handle)
 }
 
 /* --------------------------------------------------------------------------
-    Called on driver unload FINIT, finit, Unload
+   Called on driver unload FINIT, finit, Unload
    -------------------------------------------------------------------------- */
 void divasa_xdi_driver_unload(void)
 {
@@ -398,11 +398,11 @@ void *diva_xdi_open_adapter(void *os_handle, const void __user *src,
        if (length < sizeof(diva_xdi_um_cfg_cmd_t)) {
                DBG_ERR(("A: A(?) open, msg too small (%d < %d)",
                         length, sizeof(diva_xdi_um_cfg_cmd_t)))
-               return NULL;
+                       return NULL;
        }
        if ((*cp_fn) (os_handle, &msg, src, sizeof(msg)) <= 0) {
                DBG_ERR(("A: A(?) open, write error"))
-               return NULL;
+                       return NULL;
        }
        diva_os_enter_spin_lock(&adapter_lock, &old_irql, "open_adapter");
        list_for_each(tmp, &adapter_queue) {
@@ -415,7 +415,7 @@ void *diva_xdi_open_adapter(void *os_handle, const void __user *src,
 
        if (!a) {
                DBG_ERR(("A: A(%d) open, adapter not found", msg.adapter))
-       }
+                       }
 
        return (a);
 }
@@ -443,19 +443,19 @@ diva_xdi_write(void *adapter, void *os_handle, const void __user *src,
 
        if (a->xdi_mbox.status & DIVA_XDI_MBOX_BUSY) {
                DBG_ERR(("A: A(%d) write, mbox busy", a->controller))
-               return (-1);
+                       return (-1);
        }
 
        if (length < sizeof(diva_xdi_um_cfg_cmd_t)) {
                DBG_ERR(("A: A(%d) write, message too small (%d < %d)",
                         a->controller, length,
                         sizeof(diva_xdi_um_cfg_cmd_t)))
-               return (-3);
+                       return (-3);
        }
 
        if (!(data = diva_os_malloc(0, length))) {
                DBG_ERR(("A: A(%d) write, ENOMEM", a->controller))
-               return (-2);
+                       return (-2);
        }
 
        length = (*cp_fn) (os_handle, data, src, length);
@@ -467,7 +467,7 @@ diva_xdi_write(void *adapter, void *os_handle, const void __user *src,
        } else {
                DBG_ERR(("A: A(%d) write error (%d)", a->controller,
                         length))
-       }
+                       }
 
        diva_os_free(0, data);
 
@@ -486,23 +486,23 @@ diva_xdi_read(void *adapter, void *os_handle, void __user *dst,
 
        if (!(a->xdi_mbox.status & DIVA_XDI_MBOX_BUSY)) {
                DBG_ERR(("A: A(%d) rx mbox empty", a->controller))
-               return (-1);
+                       return (-1);
        }
        if (!a->xdi_mbox.data) {
                a->xdi_mbox.status &= ~DIVA_XDI_MBOX_BUSY;
                DBG_ERR(("A: A(%d) rx ENOMEM", a->controller))
-               return (-2);
+                       return (-2);
        }
 
        if (max_length < a->xdi_mbox.data_length) {
                DBG_ERR(("A: A(%d) rx buffer too short(%d < %d)",
                         a->controller, max_length,
                         a->xdi_mbox.data_length))
-               return (-3);
+                       return (-3);
        }
 
        ret = (*cp_fn) (os_handle, dst, a->xdi_mbox.data,
-                     a->xdi_mbox.data_length);
+                       a->xdi_mbox.data_length);
        if (ret > 0) {
                diva_os_free(0, a->xdi_mbox.data);
                a->xdi_mbox.data = NULL;
@@ -577,33 +577,33 @@ void diva_xdi_display_adapter_features(int card)
        features = IoAdapters[card]->Properties.Features;
 
        DBG_LOG(("FEATURES FOR ADAPTER: %d", card + 1))
-       DBG_LOG((" DI_FAX3          :  %s",
-                    (features & DI_FAX3) ? "Y" : "N"))
-       DBG_LOG((" DI_MODEM         :  %s",
-                    (features & DI_MODEM) ? "Y" : "N"))
-       DBG_LOG((" DI_POST          :  %s",
-                    (features & DI_POST) ? "Y" : "N"))
-       DBG_LOG((" DI_V110          :  %s",
-                    (features & DI_V110) ? "Y" : "N"))
-       DBG_LOG((" DI_V120          :  %s",
-                    (features & DI_V120) ? "Y" : "N"))
-       DBG_LOG((" DI_POTS          :  %s",
-                    (features & DI_POTS) ? "Y" : "N"))
-       DBG_LOG((" DI_CODEC         :  %s",
-                    (features & DI_CODEC) ? "Y" : "N"))
-       DBG_LOG((" DI_MANAGE        :  %s",
-                    (features & DI_MANAGE) ? "Y" : "N"))
-       DBG_LOG((" DI_V_42          :  %s",
-                    (features & DI_V_42) ? "Y" : "N"))
-       DBG_LOG((" DI_EXTD_FAX      :  %s",
-                    (features & DI_EXTD_FAX) ? "Y" : "N"))
-       DBG_LOG((" DI_AT_PARSER     :  %s",
-                    (features & DI_AT_PARSER) ? "Y" : "N"))
-       DBG_LOG((" DI_VOICE_OVER_IP :  %s",
-                    (features & DI_VOICE_OVER_IP) ? "Y" : "N"))
-}
+               DBG_LOG((" DI_FAX3          :  %s",
+                        (features & DI_FAX3) ? "Y" : "N"))
+               DBG_LOG((" DI_MODEM         :  %s",
+                        (features & DI_MODEM) ? "Y" : "N"))
+               DBG_LOG((" DI_POST          :  %s",
+                        (features & DI_POST) ? "Y" : "N"))
+               DBG_LOG((" DI_V110          :  %s",
+                        (features & DI_V110) ? "Y" : "N"))
+               DBG_LOG((" DI_V120          :  %s",
+                        (features & DI_V120) ? "Y" : "N"))
+               DBG_LOG((" DI_POTS          :  %s",
+                        (features & DI_POTS) ? "Y" : "N"))
+               DBG_LOG((" DI_CODEC         :  %s",
+                        (features & DI_CODEC) ? "Y" : "N"))
+               DBG_LOG((" DI_MANAGE        :  %s",
+                        (features & DI_MANAGE) ? "Y" : "N"))
+               DBG_LOG((" DI_V_42          :  %s",
+                        (features & DI_V_42) ? "Y" : "N"))
+               DBG_LOG((" DI_EXTD_FAX      :  %s",
+                        (features & DI_EXTD_FAX) ? "Y" : "N"))
+               DBG_LOG((" DI_AT_PARSER     :  %s",
+                        (features & DI_AT_PARSER) ? "Y" : "N"))
+               DBG_LOG((" DI_VOICE_OVER_IP :  %s",
+                        (features & DI_VOICE_OVER_IP) ? "Y" : "N"))
+               }
 
-void diva_add_slave_adapter(diva_os_xdi_adapter_t * a)
+void diva_add_slave_adapter(diva_os_xdi_adapter_t *a)
 {
        diva_os_spin_lock_magic_t old_irql;
 
@@ -612,7 +612,7 @@ void diva_add_slave_adapter(diva_os_xdi_adapter_t * a)
        diva_os_leave_spin_lock(&adapter_lock, &old_irql, "add_slave");
 }
 
-int diva_card_read_xlog(diva_os_xdi_adapter_t * a)
+int diva_card_read_xlog(diva_os_xdi_adapter_t *a)
 {
        diva_get_xlog_t *req;
        byte *data;
index 5d06a74..d1d3de0 100644 (file)
@@ -1,12 +1,12 @@
 /* $Id: diva_didd.c,v 1.13.6.4 2005/02/11 19:40:25 armin Exp $
  *
  * DIDD Interface module for Eicon active cards.
- * 
- * Functions are in dadapter.c 
- * 
- * Copyright 2002-2003 by Armin Schindler (mac@melware.de) 
+ *
+ * Functions are in dadapter.c
+ *
+ * Copyright 2002-2003 by Armin Schindler (mac@melware.de)
  * Copyright 2002-2003 Cytronics & Melware (info@melware.de)
- * 
+ *
  * This software may be used and distributed according to the terms
  * of the GNU General Public License, incorporated herein by reference.
  */
@@ -27,7 +27,7 @@
 static char *main_revision = "$Revision: 1.13.6.4 $";
 
 static char *DRIVERNAME =
-    "Eicon DIVA - DIDD table (http://www.melware.net)";
+       "Eicon DIVA - DIDD table (http://www.melware.net)";
 static char *DRIVERLNAME = "divadidd";
 char *DRIVERRELEASE_DIDD = "2.0";
 
@@ -72,7 +72,7 @@ static int divadidd_proc_show(struct seq_file *m, void *v)
        seq_printf(m, "name     : %s\n", DRIVERLNAME);
        seq_printf(m, "release  : %s\n", DRIVERRELEASE_DIDD);
        seq_printf(m, "build    : %s(%s)\n",
-                      diva_didd_common_code_build, DIVA_BUILD);
+                  diva_didd_common_code_build, DIVA_BUILD);
        seq_printf(m, "revision : %s\n", getrev(tmprev));
 
        return 0;
@@ -137,7 +137,7 @@ static int DIVA_INIT_FUNCTION divadidd_init(void)
                goto out;
        }
 
-      out:
+out:
        return (ret);
 }
 
index f53a740..217b6aa 100644 (file)
@@ -1,26 +1,26 @@
 
 /*
  *
-  Copyright (c) Eicon Networks, 2002.
+ Copyright (c) Eicon Networks, 2002.
  *
-  This source file is supplied for the use with
-  Eicon Networks range of DIVA Server Adapters.
+ This source file is supplied for the use with
+ Eicon Networks range of DIVA Server Adapters.
  *
-  Eicon File Revision :    2.1
+ Eicon File Revision :    2.1
  *
-  This program is free software; you can redistribute it and/or modify
-  it under the terms of the GNU General Public License as published by
-  the Free Software Foundation; either version 2, or (at your option)
-  any later version.
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
  *
-  This program is distributed in the hope that it will be useful,
-  but WITHOUT ANY WARRANTY OF ANY KIND WHATSOEVER INCLUDING ANY
-  implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-  See the GNU General Public License for more details.
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY OF ANY KIND WHATSOEVER INCLUDING ANY
+ implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ See the GNU General Public License for more details.
  *
-  You should have received a copy of the GNU General Public License
-  along with this program; if not, write to the Free Software
-  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  *
  */
 #include "platform.h"
 /*
   Every entry has length of PAGE_SIZE
   and represents one single physical page
-  */
+*/
 struct _diva_dma_map_entry {
-  int   busy;
-  dword phys_bus_addr;  /* 32bit address as seen by the card */
-  void* local_ram_addr; /* local address as seen by the host */
-  void* addr_handle;    /* handle uset to free allocated memory */
+       int busy;
+       dword phys_bus_addr;  /* 32bit address as seen by the card */
+       void *local_ram_addr; /* local address as seen by the host */
+       void *addr_handle;    /* handle uset to free allocated memory */
 };
 /*
   Create local mapping structure and init it to default state
-  */
-struct _diva_dma_map_entry* diva_alloc_dma_map (void* os_context, int nentries) {
-  diva_dma_map_entry_t* pmap = diva_os_malloc(0, sizeof(*pmap)*(nentries+1));
-  if (pmap)
-         memset (pmap, 0, sizeof(*pmap)*(nentries+1));
-  return pmap;
+*/
+struct _diva_dma_map_entry *diva_alloc_dma_map(void *os_context, int nentries) {
+       diva_dma_map_entry_t *pmap = diva_os_malloc(0, sizeof(*pmap) * (nentries + 1));
+       if (pmap)
+               memset(pmap, 0, sizeof(*pmap) * (nentries + 1));
+       return pmap;
 }
 /*
   Free local map (context should be freed before) if any
-  */
-void diva_free_dma_mapping (struct _diva_dma_map_entry* pmap) {
-  if (pmap) {
-    diva_os_free (0, pmap);
-  }
+*/
+void diva_free_dma_mapping(struct _diva_dma_map_entry *pmap) {
+       if (pmap) {
+               diva_os_free(0, pmap);
+       }
 }
 /*
   Set information saved on the map entry
-  */
-void diva_init_dma_map_entry (struct _diva_dma_map_entry* pmap,
-                              int nr, void* virt, dword phys,
-                              void* addr_handle) {
-  pmap[nr].phys_bus_addr  = phys;
-  pmap[nr].local_ram_addr = virt;
-  pmap[nr].addr_handle    = addr_handle;
+*/
+void diva_init_dma_map_entry(struct _diva_dma_map_entry *pmap,
+                            int nr, void *virt, dword phys,
+                            void *addr_handle) {
+       pmap[nr].phys_bus_addr  = phys;
+       pmap[nr].local_ram_addr = virt;
+       pmap[nr].addr_handle    = addr_handle;
 }
 /*
   Allocate one single entry in the map
-  */
-int diva_alloc_dma_map_entry (struct _diva_dma_map_entry* pmap) {
-  int i;
-  for (i = 0; (pmap && pmap[i].local_ram_addr); i++) {
-    if (!pmap[i].busy) {
-      pmap[i].busy = 1;
-      return (i);
-    }
-  }
-  return (-1);
+*/
+int diva_alloc_dma_map_entry(struct _diva_dma_map_entry *pmap) {
+       int i;
+       for (i = 0; (pmap && pmap[i].local_ram_addr); i++) {
+               if (!pmap[i].busy) {
+                       pmap[i].busy = 1;
+                       return (i);
+               }
+       }
+       return (-1);
 }
 /*
   Free one single entry in the map
-  */
-void diva_free_dma_map_entry (struct _diva_dma_map_entry* pmap, int nr) {
-  pmap[nr].busy = 0;
+*/
+void diva_free_dma_map_entry(struct _diva_dma_map_entry *pmap, int nr) {
+       pmap[nr].busy = 0;
 }
 /*
   Get information saved on the map entry
-  */
-void diva_get_dma_map_entry (struct _diva_dma_map_entry* pmap, int nr,
-                             void** pvirt, dword* pphys) {
-  *pphys = pmap[nr].phys_bus_addr;
-  *pvirt = pmap[nr].local_ram_addr;
+*/
+void diva_get_dma_map_entry(struct _diva_dma_map_entry *pmap, int nr,
+                           void **pvirt, dword *pphys) {
+       *pphys = pmap[nr].phys_bus_addr;
+       *pvirt = pmap[nr].local_ram_addr;
 }
-void* diva_get_entry_handle (struct _diva_dma_map_entry* pmap, int nr) {
-  return (pmap[nr].addr_handle);
+void *diva_get_entry_handle(struct _diva_dma_map_entry *pmap, int nr) {
+       return (pmap[nr].addr_handle);
 }
index dff8072..d32c91b 100644 (file)
@@ -1,48 +1,48 @@
 
 /*
  *
-  Copyright (c) Eicon Networks, 2002.
+ Copyright (c) Eicon Networks, 2002.
  *
-  This source file is supplied for the use with
-  Eicon Networks range of DIVA Server Adapters.
+ This source file is supplied for the use with
+ Eicon Networks range of DIVA Server Adapters.
  *
-  Eicon File Revision :    2.1
+ Eicon File Revision :    2.1
  *
-  This program is free software; you can redistribute it and/or modify
-  it under the terms of the GNU General Public License as published by
-  the Free Software Foundation; either version 2, or (at your option)
-  any later version.
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
  *
-  This program is distributed in the hope that it will be useful,
-  but WITHOUT ANY WARRANTY OF ANY KIND WHATSOEVER INCLUDING ANY
-  implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-  See the GNU General Public License for more details.
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY OF ANY KIND WHATSOEVER INCLUDING ANY
+ implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ See the GNU General Public License for more details.
  *
-  You should have received a copy of the GNU General Public License
-  along with this program; if not, write to the Free Software
-  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  *
  */
 #ifndef __DIVA_DMA_MAPPING_IFC_H__
 #define __DIVA_DMA_MAPPING_IFC_H__
 typedef struct _diva_dma_map_entry  diva_dma_map_entry_t;
-struct _diva_dma_map_entry* diva_alloc_dma_map (void* os_context, int nentries);
-void diva_init_dma_map_entry (struct _diva_dma_map_entry* pmap,
-                              int nr, void* virt, dword phys,
-                              void* addr_handle);
-int diva_alloc_dma_map_entry (struct _diva_dma_map_entry* pmap);
-void diva_free_dma_map_entry (struct _diva_dma_map_entry* pmap, int entry);
-void diva_get_dma_map_entry (struct _diva_dma_map_entry* pmap, int nr,
-                             void** pvirt, dword* pphys);
-void diva_free_dma_mapping (struct _diva_dma_map_entry* pmap);
+struct _diva_dma_map_entry *diva_alloc_dma_map(void *os_context, int nentries);
+void diva_init_dma_map_entry(struct _diva_dma_map_entry *pmap,
+                            int nr, void *virt, dword phys,
+                            void *addr_handle);
+int diva_alloc_dma_map_entry(struct _diva_dma_map_entry *pmap);
+void diva_free_dma_map_entry(struct _diva_dma_map_entry *pmap, int entry);
+void diva_get_dma_map_entry(struct _diva_dma_map_entry *pmap, int nr,
+                           void **pvirt, dword *pphys);
+void diva_free_dma_mapping(struct _diva_dma_map_entry *pmap);
 /*
   Functionality to be implemented by OS wrapper
   and running in process context
-  */
-void diva_init_dma_map (void* hdev,
-                        struct _diva_dma_map_entry** ppmap,
-                        int nentries);
-void diva_free_dma_map (void* hdev,
-                        struct _diva_dma_map_entry* pmap);
-void* diva_get_entry_handle (struct _diva_dma_map_entry* pmap, int nr);
+*/
+void diva_init_dma_map(void *hdev,
+                      struct _diva_dma_map_entry **ppmap,
+                      int nentries);
+void diva_free_dma_map(void *hdev,
+                      struct _diva_dma_map_entry *pmap);
+void *diva_get_entry_handle(struct _diva_dma_map_entry *pmap, int nr);
 #endif
index cc0d510..bb4b562 100644 (file)
@@ -4,9 +4,9 @@
 #define __DIVA_PCI_INTERFACE_H__
 
 void __iomem *divasa_remap_pci_bar(diva_os_xdi_adapter_t *a,
-                          int id,
-                          unsigned long bar,
-                          unsigned long area_length);
+                                  int id,
+                                  unsigned long bar,
+                                  unsigned long area_length);
 void divasa_unmap_pci_bar(void __iomem *bar);
 unsigned long divasa_get_pci_irq(unsigned char bus,
                                 unsigned char func, void *pci_dev_handle);
index e330da0..3942efb 100644 (file)
@@ -1,26 +1,26 @@
 
 /*
  *
-  Copyright (c) Eicon Networks, 2002.
+ Copyright (c) Eicon Networks, 2002.
  *
-  This source file is supplied for the use with
-  Eicon Networks range of DIVA Server Adapters.
+ This source file is supplied for the use with
+ Eicon Networks range of DIVA Server Adapters.
  *
-  Eicon File Revision :    2.1
+ Eicon File Revision :    2.1
  *
-  This program is free software; you can redistribute it and/or modify
-  it under the terms of the GNU General Public License as published by
-  the Free Software Foundation; either version 2, or (at your option)
-  any later version.
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
  *
-  This program is distributed in the hope that it will be useful,
-  but WITHOUT ANY WARRANTY OF ANY KIND WHATSOEVER INCLUDING ANY
-  implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-  See the GNU General Public License for more details.
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY OF ANY KIND WHATSOEVER INCLUDING ANY
+ implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ See the GNU General Public License for more details.
  *
-  You should have received a copy of the GNU General Public License
-  along with this program; if not, write to the Free Software
-  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  *
  */
 
@@ -29,8 +29,8 @@
 
 
 
-  
-  
+
+
 
 
 
@@ -82,7 +82,7 @@
 #define CODEC_PERMANENT    0x02
 #define ADV_VOICE          0x03
 #define MAX_CIP_TYPES      5  /* kind of CIP types for group optimization */
-#define C_IND_MASK_DWORDS  ((MAX_APPL+32) >> 5)
+#define C_IND_MASK_DWORDS  ((MAX_APPL + 32) >> 5)
 
 
 #define FAX_CONNECT_INFO_BUFFER_SIZE  256
@@ -116,289 +116,289 @@ typedef struct msn_config_max_s MSN_CONFIG_MAX;
 typedef struct msn_ld_s MSN_LD;
 
 struct manufacturer_profile_s {
-  dword private_options;
-  dword rtp_primary_payloads;
-  dword rtp_additional_payloads;
+       dword private_options;
+       dword rtp_primary_payloads;
+       dword rtp_additional_payloads;
 };
 
 struct fax_ncpi_s {
-  word options;
-  word format;
+       word options;
+       word format;
 };
 
 struct msn_config_s {
-  byte msn[MAX_CPN_MASK_SIZE];
+       byte msn[MAX_CPN_MASK_SIZE];
 };
 
 struct msn_config_max_s {
-  MSN_CONFIG    msn_conf[MAX_MSN_CONFIG];
+       MSN_CONFIG    msn_conf[MAX_MSN_CONFIG];
 };
 
 struct msn_ld_s {
-  dword low;
-  dword high;
+       dword low;
+       dword high;
 };
 
 struct api_parse_s {
-  word          length;
-  byte   *    info;
+       word          length;
+       byte *info;
 };
 
 struct api_save_s {
-  API_PARSE     parms[MAX_MSG_PARMS+1];
-  byte          info[MAX_MSG_SIZE];
+       API_PARSE     parms[MAX_MSG_PARMS + 1];
+       byte          info[MAX_MSG_SIZE];
 };
 
 struct _DATA_B3_DESC {
-  word          Handle;
-  word          Number;
-  word          Flags;
-  word          Length;
-  void   *    P;
+       word          Handle;
+       word          Number;
+       word          Flags;
+       word          Length;
+       void *P;
 };
 
 struct _DATA_ACK_DESC {
-  word          Handle;
-  word          Number;
+       word          Handle;
+       word          Number;
 };
 
-typedef void (* t_std_internal_command)(dword Id, PLCI   *plci, byte Rc);
+typedef void (*t_std_internal_command)(dword Id, PLCI *plci, byte Rc);
 
 /************************************************************************/
 /* Don't forget to adapt dos.asm after changing the _APPL structure!!!! */
 struct _APPL {
-  word          Id;
-  word          NullCREnable;
-  word          CDEnable;
-  dword         S_Handle;
+       word          Id;
+       word          NullCREnable;
+       word          CDEnable;
+       dword         S_Handle;
 
 
 
 
 
 
-  LIST_ENTRY    s_function;
-  dword         s_context;
-  word          s_count;
-  APPL *        s_next;
-  byte *        xbuffer_used;
-  void **       xbuffer_internal;
-  void **       xbuffer_ptr;
+       LIST_ENTRY    s_function;
+       dword         s_context;
+       word          s_count;
+       APPL *s_next;
+       byte *xbuffer_used;
+       void **xbuffer_internal;
+       void **xbuffer_ptr;
 
 
 
 
 
 
-  byte   *    queue;
-  word          queue_size;
-  word          queue_free;
-  word          queue_read;
-  word          queue_write;
-  word          queue_signal;
-  byte          msg_lost;
-  byte          appl_flags;
-  word          Number;
+       byte *queue;
+       word          queue_size;
+       word          queue_free;
+       word          queue_read;
+       word          queue_write;
+       word          queue_signal;
+       byte          msg_lost;
+       byte          appl_flags;
+       word          Number;
 
-  word          MaxBuffer;
-  byte          MaxNCCI;
-  byte          MaxNCCIData;
-  word          MaxDataLength;
-  word          NCCIDataFlowCtrlTimer;
-  byte   *    ReceiveBuffer;
-  word   *    DataNCCI;
-  word   *    DataFlags;
+       word          MaxBuffer;
+       byte          MaxNCCI;
+       byte          MaxNCCIData;
+       word          MaxDataLength;
+       word          NCCIDataFlowCtrlTimer;
+       byte *ReceiveBuffer;
+       word *DataNCCI;
+       word *DataFlags;
 };
 
 
 struct _PLCI {
-  ENTITY        Sig;
-  ENTITY        NL;
-  word          RNum;
-  word          RFlags;
-  BUFFERS       RData[2];
-  BUFFERS       XData[1];
-  BUFFERS       NData[2];
-
-  DIVA_CAPI_ADAPTER   *adapter;
-  APPL      *appl;
-  PLCI      *relatedPTYPLCI;
-  byte          Id;
-  byte          State;
-  byte          sig_req;
-  byte          nl_req;
-  byte          SuppState;
-  byte          channels;
-  byte          tel;
-  byte          B1_resource;
-  byte          B2_prot;
-  byte          B3_prot;
-
-  word          command;
-  word          m_command;
-  word          internal_command;
-  word          number;
-  word          req_in_start;
-  word          req_in;
-  word          req_out;
-  word          msg_in_write_pos;
-  word          msg_in_read_pos;
-  word          msg_in_wrap_pos;
-
-  void   *    data_sent_ptr;
-  byte          data_sent;
-  byte          send_disc;
-  byte          sig_global_req;
-  byte          sig_remove_id;
-  byte          nl_global_req;
-  byte          nl_remove_id;
-  byte          b_channel;
-  byte          adv_nl;
-  byte          manufacturer;
-  byte          call_dir;
-  byte          hook_state;
-  byte          spoofed_msg;
-  byte          ptyState;
-  byte          cr_enquiry;
-  word          hangup_flow_ctrl_timer;
-
-  word          ncci_ring_list;
-  byte          inc_dis_ncci_table[MAX_CHANNELS_PER_PLCI];
-  t_std_internal_command internal_command_queue[MAX_INTERNAL_COMMAND_LEVELS];
-  dword         c_ind_mask_table[C_IND_MASK_DWORDS];
-  dword         group_optimization_mask_table[C_IND_MASK_DWORDS];
-  byte          RBuffer[200];
-  dword         msg_in_queue[MSG_IN_QUEUE_SIZE/sizeof(dword)];
-  API_SAVE      saved_msg;
-  API_SAVE      B_protocol;
-  byte          fax_connect_info_length;
-  byte          fax_connect_info_buffer[FAX_CONNECT_INFO_BUFFER_SIZE];
-  byte          fax_edata_ack_length;
-  word          nsf_control_bits;
-  byte          ncpi_state;
-  byte          ncpi_buffer[NCPI_BUFFER_SIZE];
-
-  byte          internal_req_buffer[INTERNAL_REQ_BUFFER_SIZE];
-  byte          internal_ind_buffer[INTERNAL_IND_BUFFER_SIZE + 3];
-  dword         requested_options_conn;
-  dword         requested_options;
-  word          B1_facilities;
-  API_SAVE   *adjust_b_parms_msg;
-  word          adjust_b_facilities;
-  word          adjust_b_command;
-  word          adjust_b_ncci;
-  word          adjust_b_mode;
-  word          adjust_b_state;
-  byte          adjust_b_restore;
-
-  byte          dtmf_rec_active;
-  word          dtmf_rec_pulse_ms;
-  word          dtmf_rec_pause_ms;
-  byte          dtmf_send_requests;
-  word          dtmf_send_pulse_ms;
-  word          dtmf_send_pause_ms;
-  word          dtmf_cmd;
-  word          dtmf_msg_number_queue[8];
-  byte          dtmf_parameter_length;
-  byte          dtmf_parameter_buffer[DTMF_PARAMETER_BUFFER_SIZE];
-
-
-  t_capidtmf_state capidtmf_state;
-
-
-  byte          li_bchannel_id;    /* BRI: 1..2, PRI: 1..32 */
-  byte          li_channel_bits;
-  byte          li_notify_update;
-  word          li_cmd;
-  word          li_write_command;
-  word          li_write_channel;
-  word          li_plci_b_write_pos;
-  word          li_plci_b_read_pos;
-  word          li_plci_b_req_pos;
-  dword         li_plci_b_queue[LI_PLCI_B_QUEUE_ENTRIES];
-
-
-  word          ec_cmd;
-  word          ec_idi_options;
-  word          ec_tail_length;
-
-
-  byte          tone_last_indication_code;
-
-  byte          vswitchstate;
-  byte          vsprot;
-  byte          vsprotdialect;
-  byte          notifiedcall; /* Flag if it is a spoofed call */
-
-  int           rx_dma_descriptor;
-  dword         rx_dma_magic;
+       ENTITY        Sig;
+       ENTITY        NL;
+       word          RNum;
+       word          RFlags;
+       BUFFERS       RData[2];
+       BUFFERS       XData[1];
+       BUFFERS       NData[2];
+
+       DIVA_CAPI_ADAPTER   *adapter;
+       APPL      *appl;
+       PLCI      *relatedPTYPLCI;
+       byte          Id;
+       byte          State;
+       byte          sig_req;
+       byte          nl_req;
+       byte          SuppState;
+       byte          channels;
+       byte          tel;
+       byte          B1_resource;
+       byte          B2_prot;
+       byte          B3_prot;
+
+       word          command;
+       word          m_command;
+       word          internal_command;
+       word          number;
+       word          req_in_start;
+       word          req_in;
+       word          req_out;
+       word          msg_in_write_pos;
+       word          msg_in_read_pos;
+       word          msg_in_wrap_pos;
+
+       void *data_sent_ptr;
+       byte          data_sent;
+       byte          send_disc;
+       byte          sig_global_req;
+       byte          sig_remove_id;
+       byte          nl_global_req;
+       byte          nl_remove_id;
+       byte          b_channel;
+       byte          adv_nl;
+       byte          manufacturer;
+       byte          call_dir;
+       byte          hook_state;
+       byte          spoofed_msg;
+       byte          ptyState;
+       byte          cr_enquiry;
+       word          hangup_flow_ctrl_timer;
+
+       word          ncci_ring_list;
+       byte          inc_dis_ncci_table[MAX_CHANNELS_PER_PLCI];
+       t_std_internal_command internal_command_queue[MAX_INTERNAL_COMMAND_LEVELS];
+       dword         c_ind_mask_table[C_IND_MASK_DWORDS];
+       dword         group_optimization_mask_table[C_IND_MASK_DWORDS];
+       byte          RBuffer[200];
+       dword         msg_in_queue[MSG_IN_QUEUE_SIZE/sizeof(dword)];
+       API_SAVE      saved_msg;
+       API_SAVE      B_protocol;
+       byte          fax_connect_info_length;
+       byte          fax_connect_info_buffer[FAX_CONNECT_INFO_BUFFER_SIZE];
+       byte          fax_edata_ack_length;
+       word          nsf_control_bits;
+       byte          ncpi_state;
+       byte          ncpi_buffer[NCPI_BUFFER_SIZE];
+
+       byte          internal_req_buffer[INTERNAL_REQ_BUFFER_SIZE];
+       byte          internal_ind_buffer[INTERNAL_IND_BUFFER_SIZE + 3];
+       dword         requested_options_conn;
+       dword         requested_options;
+       word          B1_facilities;
+       API_SAVE   *adjust_b_parms_msg;
+       word          adjust_b_facilities;
+       word          adjust_b_command;
+       word          adjust_b_ncci;
+       word          adjust_b_mode;
+       word          adjust_b_state;
+       byte          adjust_b_restore;
+
+       byte          dtmf_rec_active;
+       word          dtmf_rec_pulse_ms;
+       word          dtmf_rec_pause_ms;
+       byte          dtmf_send_requests;
+       word          dtmf_send_pulse_ms;
+       word          dtmf_send_pause_ms;
+       word          dtmf_cmd;
+       word          dtmf_msg_number_queue[8];
+       byte          dtmf_parameter_length;
+       byte          dtmf_parameter_buffer[DTMF_PARAMETER_BUFFER_SIZE];
+
+
+       t_capidtmf_state capidtmf_state;
+
+
+       byte          li_bchannel_id;    /* BRI: 1..2, PRI: 1..32 */
+       byte          li_channel_bits;
+       byte          li_notify_update;
+       word          li_cmd;
+       word          li_write_command;
+       word          li_write_channel;
+       word          li_plci_b_write_pos;
+       word          li_plci_b_read_pos;
+       word          li_plci_b_req_pos;
+       dword         li_plci_b_queue[LI_PLCI_B_QUEUE_ENTRIES];
+
+
+       word          ec_cmd;
+       word          ec_idi_options;
+       word          ec_tail_length;
+
+
+       byte          tone_last_indication_code;
+
+       byte          vswitchstate;
+       byte          vsprot;
+       byte          vsprotdialect;
+       byte          notifiedcall; /* Flag if it is a spoofed call */
+
+       int           rx_dma_descriptor;
+       dword         rx_dma_magic;
 };
 
 
 struct _NCCI {
-  byte          data_out;
-  byte          data_pending;
-  byte          data_ack_out;
-  byte          data_ack_pending;
-  DATA_B3_DESC  DBuffer[MAX_DATA_B3];
-  DATA_ACK_DESC DataAck[MAX_DATA_ACK];
+       byte          data_out;
+       byte          data_pending;
+       byte          data_ack_out;
+       byte          data_ack_pending;
+       DATA_B3_DESC  DBuffer[MAX_DATA_B3];
+       DATA_ACK_DESC DataAck[MAX_DATA_ACK];
 };
 
 
 struct _DIVA_CAPI_ADAPTER {
-  IDI_CALL      request;
-  byte          Id;
-  byte          max_plci;
-  byte          max_listen;
-  byte          listen_active;
-  PLCI      *plci;
-  byte          ch_ncci[MAX_NL_CHANNEL+1];
-  byte          ncci_ch[MAX_NCCI+1];
-  byte          ncci_plci[MAX_NCCI+1];
-  byte          ncci_state[MAX_NCCI+1];
-  byte          ncci_next[MAX_NCCI+1];
-  NCCI          ncci[MAX_NCCI+1];
-
-  byte          ch_flow_control[MAX_NL_CHANNEL+1];  /* Used by XON protocol */
-  byte          ch_flow_control_pending;
-  byte          ch_flow_plci[MAX_NL_CHANNEL+1];
-  int           last_flow_control_ch;
-
-  dword         Info_Mask[MAX_APPL];
-  dword         CIP_Mask[MAX_APPL];
-
-  dword         Notification_Mask[MAX_APPL];
-  PLCI      *codec_listen[MAX_APPL];
-  dword         requested_options_table[MAX_APPL];
-  API_PROFILE   profile;
-  MANUFACTURER_PROFILE man_profile;
-  dword         manufacturer_features;
-
-  byte          AdvCodecFLAG;
-  PLCI      *AdvCodecPLCI;
-  PLCI      *AdvSignalPLCI;
-  APPL      *AdvSignalAppl;
-  byte          TelOAD[23];
-  byte          TelOSA[23];
-  byte          scom_appl_disable;
-  PLCI      *automatic_lawPLCI;
-  byte          automatic_law;
-  byte          u_law;
-
-  byte          adv_voice_coef_length;
-  byte          adv_voice_coef_buffer[ADV_VOICE_COEF_BUFFER_SIZE];
-
-  byte          li_pri;
-  byte          li_channels;
-  word          li_base;
-
-  byte adapter_disabled;
-  byte group_optimization_enabled; /* use application groups if enabled */
-  dword sdram_bar;
-  byte flag_dynamic_l1_down; /* for hunt groups:down layer 1 if no appl present*/
-  byte FlowControlIdTable[256];
-  byte FlowControlSkipTable[256];
-  void* os_card; /* pointer to associated OS dependent adapter structure */
+       IDI_CALL      request;
+       byte          Id;
+       byte          max_plci;
+       byte          max_listen;
+       byte          listen_active;
+       PLCI      *plci;
+       byte          ch_ncci[MAX_NL_CHANNEL + 1];
+       byte          ncci_ch[MAX_NCCI + 1];
+       byte          ncci_plci[MAX_NCCI + 1];
+       byte          ncci_state[MAX_NCCI + 1];
+       byte          ncci_next[MAX_NCCI + 1];
+       NCCI          ncci[MAX_NCCI + 1];
+
+       byte          ch_flow_control[MAX_NL_CHANNEL + 1];  /* Used by XON protocol */
+       byte          ch_flow_control_pending;
+       byte          ch_flow_plci[MAX_NL_CHANNEL + 1];
+       int           last_flow_control_ch;
+
+       dword         Info_Mask[MAX_APPL];
+       dword         CIP_Mask[MAX_APPL];
+
+       dword         Notification_Mask[MAX_APPL];
+       PLCI      *codec_listen[MAX_APPL];
+       dword         requested_options_table[MAX_APPL];
+       API_PROFILE   profile;
+       MANUFACTURER_PROFILE man_profile;
+       dword         manufacturer_features;
+
+       byte          AdvCodecFLAG;
+       PLCI      *AdvCodecPLCI;
+       PLCI      *AdvSignalPLCI;
+       APPL      *AdvSignalAppl;
+       byte          TelOAD[23];
+       byte          TelOSA[23];
+       byte          scom_appl_disable;
+       PLCI      *automatic_lawPLCI;
+       byte          automatic_law;
+       byte          u_law;
+
+       byte          adv_voice_coef_length;
+       byte          adv_voice_coef_buffer[ADV_VOICE_COEF_BUFFER_SIZE];
+
+       byte          li_pri;
+       byte          li_channels;
+       word          li_base;
+
+       byte adapter_disabled;
+       byte group_optimization_enabled; /* use application groups if enabled */
+       dword sdram_bar;
+       byte flag_dynamic_l1_down; /* for hunt groups:down layer 1 if no appl present*/
+       byte FlowControlIdTable[256];
+       byte FlowControlSkipTable[256];
+       void *os_card; /* pointer to associated OS dependent adapter structure */
 };
 
 
@@ -451,23 +451,23 @@ struct _DIVA_CAPI_ADAPTER {
 
 typedef struct t30_info_s T30_INFO;
 struct t30_info_s {
-  byte          code;
-  byte          rate_div_2400;
-  byte          resolution;
-  byte          data_format;
-  byte          pages_low;
-  byte          pages_high;
-  byte          operating_mode;
-  byte          control_bits_low;
-  byte          control_bits_high;
-  byte          feature_bits_low;
-  byte          feature_bits_high;
-  byte          recording_properties;
-  byte          universal_6;
-  byte          universal_7;
-  byte          station_id_len;
-  byte          head_line_len;
-  byte          station_id[T30_MAX_STATION_ID_LENGTH];
+       byte          code;
+       byte          rate_div_2400;
+       byte          resolution;
+       byte          data_format;
+       byte          pages_low;
+       byte          pages_high;
+       byte          operating_mode;
+       byte          control_bits_low;
+       byte          control_bits_high;
+       byte          feature_bits_low;
+       byte          feature_bits_high;
+       byte          recording_properties;
+       byte          universal_6;
+       byte          universal_7;
+       byte          station_id_len;
+       byte          head_line_len;
+       byte          station_id[T30_MAX_STATION_ID_LENGTH];
 /* byte          head_line[];      */
 /* byte          sub_sep_length;   */
 /* byte          sub_sep_field[];  */
@@ -528,13 +528,13 @@ struct t30_info_s {
 #define T30_OPERATING_MODE_CAPI_NEG     4
 #define T30_OPERATING_MODE_COUNT        5
 
-        /* EDATA transmit messages */
+/* EDATA transmit messages */
 #define EDATA_T30_DIS         0x01
 #define EDATA_T30_FTT         0x02
 #define EDATA_T30_MCF         0x03
 #define EDATA_T30_PARAMETERS  0x04
 
-        /* EDATA receive messages */
+/* EDATA receive messages */
 #define EDATA_T30_DCS         0x81
 #define EDATA_T30_TRAIN_OK    0x82
 #define EDATA_T30_EOP         0x83
@@ -639,11 +639,11 @@ struct t30_info_s {
 
 typedef struct async_s ASYNC_FORMAT;
 struct async_s {
-  unsigned pe:    1;
-  unsigned parity:2;
-  unsigned spare: 2;
-  unsigned stp:   1;
-  unsigned ch_len:2;   /* 3th octett in CAI */
+       unsigned pe:1;
+       unsigned parity:2;
+       unsigned spare:2;
+       unsigned stp:1;
+       unsigned ch_len:2;   /* 3th octett in CAI */
 };
 
 
@@ -686,14 +686,14 @@ struct async_s {
 /*------------------------------------------------------------------*/
 /* Capi IE + Msg types                                              */
 /*------------------------------------------------------------------*/
-#define ESC_CAUSE        0x800|CAU          /* Escape cause element */
-#define ESC_MSGTYPE      0x800|MSGTYPEIE    /* Escape message type  */
-#define ESC_CHI          0x800|CHI          /* Escape channel id    */
-#define ESC_LAW          0x800|BC           /* Escape law info      */
-#define ESC_CR           0x800|CRIE         /* Escape CallReference */
-#define ESC_PROFILE      0x800|PROFILEIE    /* Escape profile       */
-#define ESC_SSEXT        0x800|SSEXTIE      /* Escape Supplem. Serv.*/
-#define ESC_VSWITCH      0x800|VSWITCHIE    /* Escape VSwitch       */
+#define ESC_CAUSE        0x800 | CAU        /* Escape cause element */
+#define ESC_MSGTYPE      0x800 | MSGTYPEIE  /* Escape message type  */
+#define ESC_CHI          0x800 | CHI        /* Escape channel id    */
+#define ESC_LAW          0x800 | BC         /* Escape law info      */
+#define ESC_CR           0x800 | CRIE       /* Escape CallReference */
+#define ESC_PROFILE      0x800 | PROFILEIE  /* Escape profile       */
+#define ESC_SSEXT        0x800 | SSEXTIE    /* Escape Supplem. Serv.*/
+#define ESC_VSWITCH      0x800 | VSWITCHIE  /* Escape VSwitch       */
 #define CST              0x14               /* Call State i.e.      */
 #define PI               0x1E               /* Progress Indicator   */
 #define NI               0x27               /* Notification Ind     */
@@ -903,25 +903,25 @@ struct async_s {
 typedef struct li_config_s LI_CONFIG;
 
 struct xconnect_card_address_s {
-  dword low;
-  dword high;
+       dword low;
+       dword high;
 };
 
 struct xconnect_transfer_address_s {
-  struct xconnect_card_address_s card_address;
-  dword offset;
+       struct xconnect_card_address_s card_address;
+       dword offset;
 };
 
 struct li_config_s {
-  DIVA_CAPI_ADAPTER   *adapter;
-  PLCI   *plci;
-  struct xconnect_transfer_address_s send_b;
-  struct xconnect_transfer_address_s send_pc;
-  byte   *flag_table;  /* dword aligned and sized */
-  byte   *coef_table;  /* dword aligned and sized */
-  byte channel;
-  byte curchnl;
-  byte chflags;
+       DIVA_CAPI_ADAPTER   *adapter;
+       PLCI   *plci;
+       struct xconnect_transfer_address_s send_b;
+       struct xconnect_transfer_address_s send_pc;
+       byte   *flag_table;  /* dword aligned and sized */
+       byte   *coef_table;  /* dword aligned and sized */
+       byte channel;
+       byte curchnl;
+       byte chflags;
 };
 
 extern LI_CONFIG   *li_config_table;
@@ -1110,33 +1110,33 @@ extern word li_total_channels;
 #define B1_PIAFS                29
 #define B2_PIAFS                29
 
-#define PRIVATE_PIAFS           29 
+#define PRIVATE_PIAFS           29
 
 /*
   B2 configuration for PIAFS:
-+---------------------+------+-----------------------------------------+
-| PIAFS Protocol      | byte | Bit 1 - Protocol Speed                  |
-| Speed configuration |      |         0 - 32K                         |
-|                     |      |         1 - 64K (default)               |
-|                     |      | Bit 2 - Variable Protocol Speed         |
-|                     |      |         0 - Speed is fix                |
-|                     |      |         1 - Speed is variable (default) |
-+---------------------+------+-----------------------------------------+
-| Direction           | word | Enable compression/decompression for    |
-|                     |      | 0: All direction                        |
-|                     |      | 1: disable outgoing data                |
-|                     |      | 2: disable incomming data               |
-|                     |      | 3: disable both direction (default)     |
-+---------------------+------+-----------------------------------------+
-| Number of code      | word | Parameter P1 of V.42bis in accordance   |
-| words               |      | with V.42bis                            |
-+---------------------+------+-----------------------------------------+
-| Maximum String      | word | Parameter P2 of V.42bis in accordance   |
-| Length              |      | with V.42bis                            |
-+---------------------+------+-----------------------------------------+
-| control (UDATA)     | byte | enable PIAFS control communication      |
-| abilities           |      |                                         |
-+---------------------+------+-----------------------------------------+
+  +---------------------+------+-----------------------------------------+
+  | PIAFS Protocol      | byte | Bit 1 - Protocol Speed                  |
+  | Speed configuration |      |         0 - 32K                         |
+  |                     |      |         1 - 64K (default)               |
+  |                     |      | Bit 2 - Variable Protocol Speed         |
+  |                     |      |         0 - Speed is fix                |
+  |                     |      |         1 - Speed is variable (default) |
+  +---------------------+------+-----------------------------------------+
+  | Direction           | word | Enable compression/decompression for    |
+  |                     |      | 0: All direction                        |
+  |                     |      | 1: disable outgoing data                |
+  |                     |      | 2: disable incomming data               |
+  |                     |      | 3: disable both direction (default)     |
+  +---------------------+------+-----------------------------------------+
+  | Number of code      | word | Parameter P1 of V.42bis in accordance   |
+  | words               |      | with V.42bis                            |
+  +---------------------+------+-----------------------------------------+
+  | Maximum String      | word | Parameter P2 of V.42bis in accordance   |
+  | Length              |      | with V.42bis                            |
+  +---------------------+------+-----------------------------------------+
+  | control (UDATA)     | byte | enable PIAFS control communication      |
+  | abilities           |      |                                         |
+  +---------------------+------+-----------------------------------------+
 */
 #define PIAFS_UDATA_ABILITIES  0x80
 
index f1d464f..ffa0c31 100644 (file)
@@ -38,7 +38,7 @@ static unsigned long diva_dbg_mem = 0;
 module_param(diva_dbg_mem, ulong, 0);
 
 static char *DRIVERNAME =
-    "Eicon DIVA - MAINT module (http://www.melware.net)";
+       "Eicon DIVA - MAINT module (http://www.melware.net)";
 static char *DRIVERLNAME = "diva_mnt";
 static char *DEVNAME = "DivasMAINT";
 char *DRIVERRELEASE_MNT = "2.0";
@@ -86,7 +86,7 @@ int diva_os_copy_from_user(void *os_handle, void *dst, const void __user *src,
 /*
  * get time
  */
-void diva_os_get_time(dword * sec, dword * usec)
+void diva_os_get_time(dword *sec, dword *usec)
 {
        struct timeval tv;
 
@@ -115,7 +115,7 @@ void diva_os_get_time(dword * sec, dword * usec)
 /*
  * device node operations
  */
-static unsigned int maint_poll(struct file *file, poll_table * wait)
+static unsigned int maint_poll(struct file *file, poll_table *wait)
 {
        unsigned int mask = 0;
 
@@ -153,18 +153,18 @@ static int maint_close(struct inode *ino, struct file *filep)
 
        /* clear 'used' flag */
        clear_bit(0, &opened);
-       
+
        return (0);
 }
 
 static ssize_t divas_maint_write(struct file *file, const char __user *buf,
-                                size_t count, loff_t * ppos)
+                                size_t count, loff_t *ppos)
 {
        return (maint_read_write((char __user *) buf, (int) count));
 }
 
 static ssize_t divas_maint_read(struct file *file, char __user *buf,
-                               size_t count, loff_t * ppos)
+                               size_t count, loff_t *ppos)
 {
        return (maint_read_write(buf, (int) count));
 }
@@ -238,7 +238,7 @@ static int DIVA_INIT_FUNCTION maint_init(void)
               DRIVERLNAME, buffer, (buffer_length / 1024),
               (diva_dbg_mem == 0) ? "internal" : "external", major);
 
-      out:
+out:
        return (ret);
 }
 
@@ -255,4 +255,3 @@ static void DIVA_EXIT_FUNCTION maint_exit(void)
 
 module_init(maint_init);
 module_exit(maint_exit);
-
index 0bbee78..60aaf95 100644 (file)
@@ -34,7 +34,7 @@ static DESCRIPTOR DAdapter;
 static DESCRIPTOR MAdapter;
 
 /* --------------------------------------------------------------------------
-    MAINT driver connector section
+   MAINT driver connector section
    -------------------------------------------------------------------------- */
 static void no_printf(unsigned char *x, ...)
 {
@@ -74,17 +74,17 @@ void diva_xdi_didd_register_adapter(int card)
                d.features = IoAdapters[card - 1]->Properties.Features;
                DBG_TRC(("DIDD register A(%d) channels=%d", card,
                         d.channels))
-                   /* workaround for different Name in structure */
-                   strlcpy(IoAdapters[card - 1]->Name,
-                           IoAdapters[card - 1]->Properties.Name,
-                           sizeof(IoAdapters[card - 1]->Name));
+                       /* workaround for different Name in structure */
+                       strlcpy(IoAdapters[card - 1]->Name,
+                               IoAdapters[card - 1]->Properties.Name,
+                               sizeof(IoAdapters[card - 1]->Name));
                req.didd_remove_adapter.e.Req = 0;
                req.didd_add_adapter.e.Rc = IDI_SYNC_REQ_DIDD_ADD_ADAPTER;
                req.didd_add_adapter.info.descriptor = (void *) &d;
-               DAdapter.request((ENTITY *) & req);
+               DAdapter.request((ENTITY *)&req);
                if (req.didd_add_adapter.e.Rc != 0xff) {
                        DBG_ERR(("DIDD register A(%d) failed !", card))
-               }
+                               }
                IoAdapters[card - 1]->os_trap_nfy_Fnc = NULL;
        }
 }
@@ -99,11 +99,11 @@ void diva_xdi_didd_remove_adapter(int card)
 
        IoAdapters[card - 1]->os_trap_nfy_Fnc = NULL;
        DBG_TRC(("DIDD de-register A(%d)", card))
-       req.didd_remove_adapter.e.Req = 0;
+               req.didd_remove_adapter.e.Req = 0;
        req.didd_remove_adapter.e.Rc = IDI_SYNC_REQ_DIDD_REMOVE_ADAPTER;
        req.didd_remove_adapter.info.p_request =
-           (IDI_CALL) Requests[card - 1];
-       DAdapter.request((ENTITY *) & req);
+               (IDI_CALL) Requests[card - 1];
+       DAdapter.request((ENTITY *)&req);
        memset(&(a->IdTable), 0x00, 256);
 }
 
@@ -115,7 +115,7 @@ static void start_dbg(void)
        DbgRegister("DIVAS", DRIVERRELEASE_DIVAS, (debugmask) ? debugmask : DBG_DEFAULT);
        DBG_LOG(("DIVA ISDNXDI BUILD (%s[%s])",
                 DIVA_BUILD, diva_xdi_common_code_build))
-}
+               }
 
 /*
  * stop debug
@@ -130,7 +130,7 @@ static void stop_dbg(void)
 /*
  * didd callback function
  */
-static void *didd_callback(void *context, DESCRIPTOR * adapter,
+static void *didd_callback(void *context, DESCRIPTOR *adapter,
                           int removal)
 {
        if (adapter->type == IDI_DADAPTER) {
@@ -168,10 +168,10 @@ static int DIVA_INIT_FUNCTION connect_didd(void)
                        memcpy(&DAdapter, &DIDD_Table[x], sizeof(DAdapter));
                        req.didd_notify.e.Req = 0;
                        req.didd_notify.e.Rc =
-                           IDI_SYNC_REQ_DIDD_REGISTER_ADAPTER_NOTIFY;
+                               IDI_SYNC_REQ_DIDD_REGISTER_ADAPTER_NOTIFY;
                        req.didd_notify.info.callback = (void *)didd_callback;
                        req.didd_notify.info.context = NULL;
-                       DAdapter.request((ENTITY *) & req);
+                       DAdapter.request((ENTITY *)&req);
                        if (req.didd_notify.e.Rc != 0xff) {
                                stop_dbg();
                                return (0);
@@ -203,7 +203,7 @@ static void disconnect_didd(void)
        req.didd_notify.e.Req = 0;
        req.didd_notify.e.Rc = IDI_SYNC_REQ_DIDD_REMOVE_ADAPTER_NOTIFY;
        req.didd_notify.info.handle = notify_handle;
-       DAdapter.request((ENTITY *) & req);
+       DAdapter.request((ENTITY *)&req);
 }
 
 /*
@@ -214,10 +214,10 @@ int DIVA_INIT_FUNCTION divasfunc_init(int dbgmask)
        char *version;
 
        debugmask = dbgmask;
-       
+
        if (!connect_didd()) {
                DBG_ERR(("divasfunc: failed to connect to DIDD."))
-               return (0);
+                       return (0);
        }
 
        version = diva_xdi_common_code_build;
index 42d3b83..a5c8f90 100644 (file)
@@ -1,7 +1,7 @@
 /* $Id: divasi.c,v 1.25.6.2 2005/01/31 12:22:20 armin Exp $
  *
  * Driver for Eicon DIVA Server ISDN cards.
- * User Mode IDI Interface 
+ * User Mode IDI Interface
  *
  * Copyright 2000-2003 by Armin Schindler (mac@melware.de)
  * Copyright 2000-2003 Cytronics & Melware (info@melware.de)
@@ -71,10 +71,10 @@ static char *getrev(const char *revision)
  *  LOCALS
  */
 static ssize_t um_idi_read(struct file *file, char __user *buf, size_t count,
-                          loff_t * offset);
+                          loff_t *offset);
 static ssize_t um_idi_write(struct file *file, const char __user *buf,
-                           size_t count, loff_t * offset);
-static unsigned int um_idi_poll(struct file *file, poll_table * wait);
+                           size_t count, loff_t *offset);
+static unsigned int um_idi_poll(struct file *file, poll_table *wait);
 static int um_idi_open(struct inode *inode, struct file *file);
 static int um_idi_release(struct inode *inode, struct file *file);
 static int remove_entity(void *entity);
@@ -194,7 +194,7 @@ static int DIVA_INIT_FUNCTION divasi_init(void)
        }
        printk(KERN_INFO "%s: started with major %d\n", DRIVERLNAME, major);
 
-      out:
+out:
        return (ret);
 }
 
@@ -228,7 +228,7 @@ divas_um_idi_copy_to_user(void *os_handle, void *dst, const void *src,
 }
 
 static ssize_t
-um_idi_read(struct file *file, char __user *buf, size_t count, loff_t * offset)
+um_idi_read(struct file *file, char __user *buf, size_t count, loff_t *offset)
 {
        diva_um_idi_os_context_t *p_os;
        int ret = -EINVAL;
@@ -292,7 +292,7 @@ static int um_idi_open_adapter(struct file *file, int adapter_nr)
 {
        diva_um_idi_os_context_t *p_os;
        void *e =
-           divas_um_idi_create_entity((dword) adapter_nr, (void *) file);
+               divas_um_idi_create_entity((dword) adapter_nr, (void *) file);
 
        if (!(file->private_data = e)) {
                return (0);
@@ -310,7 +310,7 @@ static int um_idi_open_adapter(struct file *file, int adapter_nr)
 
 static ssize_t
 um_idi_write(struct file *file, const char __user *buf, size_t count,
-            loff_t * offset)
+            loff_t *offset)
 {
        diva_um_idi_os_context_t *p_os;
        int ret = -EINVAL;
@@ -331,8 +331,8 @@ um_idi_write(struct file *file, const char __user *buf, size_t count,
        }
 
        if (!(p_os =
-            (diva_um_idi_os_context_t *) diva_um_id_get_os_context(file->
-                                                                   private_data)))
+             (diva_um_idi_os_context_t *) diva_um_id_get_os_context(file->
+                                                                    private_data)))
        {
                return (-ENODEV);
        }
@@ -367,7 +367,7 @@ um_idi_write(struct file *file, const char __user *buf, size_t count,
        return (ret);
 }
 
-static unsigned int um_idi_poll(struct file *file, poll_table * wait)
+static unsigned int um_idi_poll(struct file *file, poll_table *wait)
 {
        diva_um_idi_os_context_t *p_os;
 
@@ -417,7 +417,7 @@ static int um_idi_release(struct inode *inode, struct file *file)
        }
 
        if (!(p_os =
-               (diva_um_idi_os_context_t *) diva_um_id_get_os_context(file->private_data))) {
+             (diva_um_idi_os_context_t *) diva_um_id_get_os_context(file->private_data))) {
                ret = -ENODEV;
                goto out;
        }
@@ -434,7 +434,7 @@ static int um_idi_release(struct inode *inode, struct file *file)
                goto out;
        }
 
-      out:
+out:
        return (ret);
 }
 
@@ -446,14 +446,14 @@ int diva_os_get_context_size(void)
 void diva_os_wakeup_read(void *os_context)
 {
        diva_um_idi_os_context_t *p_os =
-           (diva_um_idi_os_context_t *) os_context;
+               (diva_um_idi_os_context_t *) os_context;
        wake_up_interruptible(&p_os->read_wait);
 }
 
 void diva_os_wakeup_close(void *os_context)
 {
        diva_um_idi_os_context_t *p_os =
-           (diva_um_idi_os_context_t *) os_context;
+               (diva_um_idi_os_context_t *) os_context;
        wake_up_interruptible(&p_os->close_wait);
 }
 
@@ -466,7 +466,7 @@ void diva_um_timer_function(unsigned long data)
        wake_up_interruptible(&p_os->read_wait);
        wake_up_interruptible(&p_os->close_wait);
        DBG_ERR(("entity removal watchdog"))
-}
+               }
 
 /*
 **  If application exits without entity removal this function will remove
@@ -481,30 +481,30 @@ static int remove_entity(void *entity)
 
        if (!entity) {
                DBG_FTL(("Zero entity on remove"))
-               return (0);
+                       return (0);
        }
 
        if (!(p_os =
-            (diva_um_idi_os_context_t *)
-            diva_um_id_get_os_context(entity))) {
+             (diva_um_idi_os_context_t *)
+             diva_um_id_get_os_context(entity))) {
                DBG_FTL(("Zero entity os context on remove"))
-               return (0);
+                       return (0);
        }
 
        if (!divas_um_idi_entity_assigned(entity) || p_os->aborted) {
                /*
-                  Entity is not assigned, also can be removed
-                */
+                 Entity is not assigned, also can be removed
+               */
                return (0);
        }
 
        DBG_TRC(("E(%08x) check remove", entity))
 
-       /*
-          If adapter not answers on remove request inside of
-          10 Sec, then adapter is dead
-        */
-       diva_um_idi_start_wdog(entity);
+               /*
+                 If adapter not answers on remove request inside of
+                 10 Sec, then adapter is dead
+               */
+               diva_um_idi_start_wdog(entity);
 
        {
                DECLARE_WAITQUEUE(wait, curtask);
@@ -542,7 +542,7 @@ static int remove_entity(void *entity)
        DBG_TRC(("E(%08x) remove complete, aborted:%d", entity,
                 p_os->aborted))
 
-       diva_um_idi_stop_wdog(entity);
+               diva_um_idi_stop_wdog(entity);
 
        p_os->aborted = 0;
 
index f332b60..7eaab06 100644 (file)
@@ -50,7 +50,7 @@ module_param(dbgmask, int, 0);
 MODULE_PARM_DESC(dbgmask, "initial debug mask");
 
 static char *DRIVERNAME =
-    "Eicon DIVA Server driver (http://www.melware.net)";
+       "Eicon DIVA Server driver (http://www.melware.net)";
 static char *DRIVERLNAME = "divas";
 static char *DEVNAME = "Divas";
 char *DRIVERRELEASE_DIVAS = "2.0";
@@ -68,7 +68,7 @@ typedef struct _diva_os_thread_dpc {
 } diva_os_thread_dpc_t;
 
 /* --------------------------------------------------------------------------
-    PCI driver interface section
+   PCI driver interface section
    -------------------------------------------------------------------------- */
 /*
   vendor, device       Vendor and device ID to match (or PCI_ANY_ID)
@@ -77,7 +77,7 @@ typedef struct _diva_os_thread_dpc {
   class,               Device class to match. The class_mask tells which bits
   class_mask   of the class are honored during the comparison.
   driver_data  Data private to the driver.
-  */
+*/
 
 #if !defined(PCI_DEVICE_ID_EICON_MAESTRAP_2)
 #define PCI_DEVICE_ID_EICON_MAESTRAP_2       0xE015
@@ -109,41 +109,41 @@ typedef struct _diva_os_thread_dpc {
 
 /*
   This table should be sorted by PCI device ID
-  */
+*/
 static struct pci_device_id divas_pci_tbl[] = {
        /* Diva Server BRI-2M PCI 0xE010 */
        { PCI_VDEVICE(EICON, PCI_DEVICE_ID_EICON_MAESTRA),
-               CARDTYPE_MAESTRA_PCI },
+         CARDTYPE_MAESTRA_PCI },
        /* Diva Server 4BRI-8M PCI 0xE012 */
        { PCI_VDEVICE(EICON, PCI_DEVICE_ID_EICON_MAESTRAQ),
-               CARDTYPE_DIVASRV_Q_8M_PCI },
+         CARDTYPE_DIVASRV_Q_8M_PCI },
        /* Diva Server 4BRI-8M 2.0 PCI 0xE013 */
        { PCI_VDEVICE(EICON, PCI_DEVICE_ID_EICON_MAESTRAQ_U),
-               CARDTYPE_DIVASRV_Q_8M_V2_PCI },
+         CARDTYPE_DIVASRV_Q_8M_V2_PCI },
        /* Diva Server PRI-30M PCI 0xE014 */
        { PCI_VDEVICE(EICON, PCI_DEVICE_ID_EICON_MAESTRAP),
-               CARDTYPE_DIVASRV_P_30M_PCI },
+         CARDTYPE_DIVASRV_P_30M_PCI },
        /* Diva Server PRI 2.0 adapter 0xE015 */
        { PCI_VDEVICE(EICON, PCI_DEVICE_ID_EICON_MAESTRAP_2),
-               CARDTYPE_DIVASRV_P_30M_V2_PCI },
+         CARDTYPE_DIVASRV_P_30M_V2_PCI },
        /* Diva Server Voice 4BRI-8M PCI 0xE016 */
        { PCI_VDEVICE(EICON, PCI_DEVICE_ID_EICON_4BRI_VOIP),
-               CARDTYPE_DIVASRV_VOICE_Q_8M_PCI },
+         CARDTYPE_DIVASRV_VOICE_Q_8M_PCI },
        /* Diva Server Voice 4BRI-8M 2.0 PCI 0xE017 */
        { PCI_VDEVICE(EICON, PCI_DEVICE_ID_EICON_4BRI_2_VOIP),
-               CARDTYPE_DIVASRV_VOICE_Q_8M_V2_PCI },
+         CARDTYPE_DIVASRV_VOICE_Q_8M_V2_PCI },
        /* Diva Server BRI-2M 2.0 PCI 0xE018 */
        { PCI_VDEVICE(EICON, PCI_DEVICE_ID_EICON_BRI2M_2),
-               CARDTYPE_DIVASRV_B_2M_V2_PCI },
+         CARDTYPE_DIVASRV_B_2M_V2_PCI },
        /* Diva Server Voice PRI 2.0 PCI 0xE019 */
        { PCI_VDEVICE(EICON, PCI_DEVICE_ID_EICON_MAESTRAP_2_VOIP),
-               CARDTYPE_DIVASRV_VOICE_P_30M_V2_PCI },
+         CARDTYPE_DIVASRV_VOICE_P_30M_V2_PCI },
        /* Diva Server 2FX 0xE01A */
        { PCI_VDEVICE(EICON, PCI_DEVICE_ID_EICON_2F),
-               CARDTYPE_DIVASRV_B_2F_PCI },
+         CARDTYPE_DIVASRV_B_2F_PCI },
        /* Diva Server Voice BRI-2M 2.0 PCI 0xE01B */
        { PCI_VDEVICE(EICON, PCI_DEVICE_ID_EICON_BRI2M_2_VOIP),
-               CARDTYPE_DIVASRV_VOICE_B_2M_V2_PCI },
+         CARDTYPE_DIVASRV_VOICE_B_2M_V2_PCI },
        { 0, }                  /* 0 terminated list. */
 };
 MODULE_DEVICE_TABLE(pci, divas_pci_tbl);
@@ -197,7 +197,7 @@ void divas_get_version(char *p)
 }
 
 /* --------------------------------------------------------------------------
-    PCI Bus services  
+   PCI Bus services
    -------------------------------------------------------------------------- */
 byte diva_os_get_pci_bus(void *pci_dev_handle)
 {
@@ -332,10 +332,10 @@ void PCIread(byte bus, byte func, int offset, void *data, int length,
   Init map with DMA pages. It is not problem if some allocations fail -
   the channels that will not get one DMA page will use standard PIO
   interface
-  */
+*/
 static void *diva_pci_alloc_consistent(struct pci_dev *hwdev,
                                       size_t size,
-                                      dma_addr_t * dma_handle,
+                                      dma_addr_t *dma_handle,
                                       void **addr_handle)
 {
        void *addr = pci_alloc_consistent(hwdev, size, dma_handle);
@@ -350,7 +350,7 @@ void diva_init_dma_map(void *hdev,
 {
        struct pci_dev *pdev = (struct pci_dev *) hdev;
        struct _diva_dma_map_entry *pmap =
-           diva_alloc_dma_map(hdev, nentries);
+               diva_alloc_dma_map(hdev, nentries);
 
        if (pmap) {
                int i;
@@ -381,7 +381,7 @@ void diva_init_dma_map(void *hdev,
 /*
   Free all contained in the map entries and memory used by the map
   Should be always called after adapter removal from DIDD array
-  */
+*/
 void diva_free_dma_map(void *hdev, struct _diva_dma_map_entry *pmap)
 {
        struct pci_dev *pdev = (struct pci_dev *) hdev;
@@ -403,14 +403,14 @@ void diva_free_dma_map(void *hdev, struct _diva_dma_map_entry *pmap)
                DBG_TRC(("dma map free [%d]=(%08lx:%08x:%08lx)", i,
                         (unsigned long) cpu_addr, (dword) dma_handle,
                         (unsigned long) addr_handle))
-       }
+                       }
 
        diva_free_dma_mapping(pmap);
 }
 
 
 /*********************************************************
- ** I/O port utilities  
+ ** I/O port utilities
  *********************************************************/
 
 int
@@ -420,7 +420,7 @@ diva_os_register_io_port(void *adapter, int on, unsigned long port,
        if (on) {
                if (!request_region(port, length, name)) {
                        DBG_ERR(("A: I/O: can't register port=%08x", port))
-                       return (-1);
+                               return (-1);
                }
        } else {
                release_region(port, length);
@@ -443,7 +443,7 @@ void divasa_unmap_pci_bar(void __iomem *bar)
 }
 
 /*********************************************************
- ** I/O port access 
+ ** I/O port access
  *********************************************************/
 byte __inline__ inpp(void __iomem *addr)
 {
@@ -476,7 +476,7 @@ void __inline__ outpp(void __iomem *addr, word p)
 }
 
 /* --------------------------------------------------------------------------
-    IRQ request / remove  
+   IRQ request / remove
    -------------------------------------------------------------------------- */
 int diva_os_register_irq(void *context, byte irq, const char *name)
 {
@@ -491,7 +491,7 @@ void diva_os_remove_irq(void *context, byte irq)
 }
 
 /* --------------------------------------------------------------------------
-    DPC framework implementation
+   DPC framework implementation
    -------------------------------------------------------------------------- */
 static void diva_os_dpc_proc(unsigned long context)
 {
@@ -501,7 +501,7 @@ static void diva_os_dpc_proc(unsigned long context)
        (*(pisr->callback)) (pisr, pisr->callback_context);
 }
 
-int diva_os_initialize_soft_isr(diva_os_soft_isr_t * psoft_isr,
+int diva_os_initialize_soft_isr(diva_os_soft_isr_t *psoft_isr,
                                diva_os_soft_isr_callback_t callback,
                                void *callback_context)
 {
@@ -520,11 +520,11 @@ int diva_os_initialize_soft_isr(diva_os_soft_isr_t * psoft_isr,
        return (0);
 }
 
-int diva_os_schedule_soft_isr(diva_os_soft_isr_t * psoft_isr)
+int diva_os_schedule_soft_isr(diva_os_soft_isr_t *psoft_isr)
 {
        if (psoft_isr && psoft_isr->object) {
                diva_os_thread_dpc_t *pdpc =
-                   (diva_os_thread_dpc_t *) psoft_isr->object;
+                       (diva_os_thread_dpc_t *) psoft_isr->object;
 
                tasklet_schedule(&pdpc->divas_task);
        }
@@ -532,16 +532,16 @@ int diva_os_schedule_soft_isr(diva_os_soft_isr_t * psoft_isr)
        return (1);
 }
 
-int diva_os_cancel_soft_isr(diva_os_soft_isr_t * psoft_isr)
+int diva_os_cancel_soft_isr(diva_os_soft_isr_t *psoft_isr)
 {
        return (0);
 }
 
-void diva_os_remove_soft_isr(diva_os_soft_isr_t * psoft_isr)
+void diva_os_remove_soft_isr(diva_os_soft_isr_t *psoft_isr)
 {
        if (psoft_isr && psoft_isr->object) {
                diva_os_thread_dpc_t *pdpc =
-                   (diva_os_thread_dpc_t *) psoft_isr->object;
+                       (diva_os_thread_dpc_t *) psoft_isr->object;
                void *mem;
 
                tasklet_kill(&pdpc->divas_task);
@@ -589,7 +589,7 @@ static int divas_release(struct inode *inode, struct file *file)
 }
 
 static ssize_t divas_write(struct file *file, const char __user *buf,
-                          size_t count, loff_t * ppos)
+                          size_t count, loff_t *ppos)
 {
        int ret = -EINVAL;
 
@@ -620,7 +620,7 @@ static ssize_t divas_write(struct file *file, const char __user *buf,
 }
 
 static ssize_t divas_read(struct file *file, char __user *buf,
-                         size_t count, loff_t * ppos)
+                         size_t count, loff_t *ppos)
 {
        int ret = -EINVAL;
 
@@ -650,7 +650,7 @@ static ssize_t divas_read(struct file *file, char __user *buf,
        return (ret);
 }
 
-static unsigned int divas_poll(struct file *file, poll_table * wait)
+static unsigned int divas_poll(struct file *file, poll_table *wait)
 {
        if (!file->private_data) {
                return (POLLERR);
@@ -686,7 +686,7 @@ static int DIVA_INIT_FUNCTION divas_register_chrdev(void)
 }
 
 /* --------------------------------------------------------------------------
-    PCI driver section
+   PCI driver section
    -------------------------------------------------------------------------- */
 static int __devinit divas_init_one(struct pci_dev *pdev,
                                    const struct pci_device_id *ent)
@@ -698,9 +698,9 @@ static int __devinit divas_init_one(struct pci_dev *pdev,
        DBG_TRC(("%s bus: %08x fn: %08x insertion.\n",
                 CardProperties[ent->driver_data].Name,
                 pdev->bus->number, pdev->devfn))
-       printk(KERN_INFO "%s: %s bus: %08x fn: %08x insertion.\n",
-               DRIVERLNAME, CardProperties[ent->driver_data].Name,
-               pdev->bus->number, pdev->devfn);
+               printk(KERN_INFO "%s: %s bus: %08x fn: %08x insertion.\n",
+                      DRIVERLNAME, CardProperties[ent->driver_data].Name,
+                      pdev->bus->number, pdev->devfn);
 
        if (pci_enable_device(pdev)) {
                DBG_TRC(("%s: %s bus: %08x fn: %08x device init failed.\n",
@@ -708,12 +708,12 @@ static int __devinit divas_init_one(struct pci_dev *pdev,
                         CardProperties[ent->driver_data].Name,
                         pdev->bus->number,
                         pdev->devfn))
-               printk(KERN_ERR
-                       "%s: %s bus: %08x fn: %08x device init failed.\n",
-                       DRIVERLNAME,
-                       CardProperties[ent->driver_data].
-                       Name, pdev->bus->number,
-                       pdev->devfn);
+                       printk(KERN_ERR
+                              "%s: %s bus: %08x fn: %08x device init failed.\n",
+                              DRIVERLNAME,
+                              CardProperties[ent->driver_data].
+                              Name, pdev->bus->number,
+                              pdev->devfn);
                return (-EIO);
        }
 
@@ -723,9 +723,9 @@ static int __devinit divas_init_one(struct pci_dev *pdev,
        if (!pci_latency) {
                DBG_TRC(("%s: bus: %08x fn: %08x fix latency.\n",
                         DRIVERLNAME, pdev->bus->number, pdev->devfn))
-               printk(KERN_INFO
-                       "%s: bus: %08x fn: %08x fix latency.\n",
-                        DRIVERLNAME, pdev->bus->number, pdev->devfn);
+                       printk(KERN_INFO
+                              "%s: bus: %08x fn: %08x fix latency.\n",
+                              DRIVERLNAME, pdev->bus->number, pdev->devfn);
                pci_write_config_byte(pdev, PCI_LATENCY_TIMER, new_latency);
        }
 
@@ -735,12 +735,12 @@ static int __devinit divas_init_one(struct pci_dev *pdev,
                         CardProperties[ent->driver_data].Name,
                         pdev->bus->number,
                         pdev->devfn))
-               printk(KERN_ERR
-                       "%s: %s bus: %08x fn: %08x card init failed.\n",
-                       DRIVERLNAME,
-                       CardProperties[ent->driver_data].
-                       Name, pdev->bus->number,
-                       pdev->devfn);
+                       printk(KERN_ERR
+                              "%s: %s bus: %08x fn: %08x card init failed.\n",
+                              DRIVERLNAME,
+                              CardProperties[ent->driver_data].
+                              Name, pdev->bus->number,
+                              pdev->devfn);
                return (-EIO);
        }
 
@@ -755,8 +755,8 @@ static void __devexit divas_remove_one(struct pci_dev *pdev)
 
        DBG_TRC(("bus: %08x fn: %08x removal.\n",
                 pdev->bus->number, pdev->devfn))
-       printk(KERN_INFO "%s: bus: %08x fn: %08x removal.\n",
-               DRIVERLNAME, pdev->bus->number, pdev->devfn);
+               printk(KERN_INFO "%s: bus: %08x fn: %08x removal.\n",
+                      DRIVERLNAME, pdev->bus->number, pdev->devfn);
 
        if (pdiva) {
                diva_driver_remove_card(pdiva);
@@ -765,7 +765,7 @@ static void __devexit divas_remove_one(struct pci_dev *pdev)
 }
 
 /* --------------------------------------------------------------------------
-    Driver Load / Startup  
+   Driver Load / Startup
    -------------------------------------------------------------------------- */
 static int DIVA_INIT_FUNCTION divas_init(void)
 {
@@ -824,12 +824,12 @@ static int DIVA_INIT_FUNCTION divas_init(void)
        }
        printk(KERN_INFO "%s: started with major %d\n", DRIVERLNAME, major);
 
-      out:
+out:
        return (ret);
 }
 
 /* --------------------------------------------------------------------------
-    Driver Unload
+   Driver Unload
    -------------------------------------------------------------------------- */
 static void DIVA_EXIT_FUNCTION divas_exit(void)
 {
index 46d44a9..af4fd3d 100644 (file)
@@ -55,7 +55,7 @@ extern struct proc_dir_entry *proc_net_eicon;
 static struct proc_dir_entry *divas_proc_entry = NULL;
 
 static ssize_t
-divas_read(struct file *file, char __user *buf, size_t count, loff_t * off)
+divas_read(struct file *file, char __user *buf, size_t count, loff_t *off)
 {
        int len = 0;
        int cadapter;
@@ -94,12 +94,12 @@ divas_read(struct file *file, char __user *buf, size_t count, loff_t * off)
 }
 
 static ssize_t
-divas_write(struct file *file, const char __user *buf, size_t count, loff_t * off)
+divas_write(struct file *file, const char __user *buf, size_t count, loff_t *off)
 {
        return (-ENODEV);
 }
 
-static unsigned int divas_poll(struct file *file, poll_table * wait)
+static unsigned int divas_poll(struct file *file, poll_table *wait)
 {
        return (POLLERR);
 }
@@ -127,7 +127,7 @@ static const struct file_operations divas_fops = {
 int create_divas_proc(void)
 {
        divas_proc_entry = proc_create(divas_proc_name, S_IFREG | S_IRUGO,
-                                       proc_net_eicon, &divas_fops);
+                                      proc_net_eicon, &divas_fops);
        if (!divas_proc_entry)
                return (0);
 
@@ -155,11 +155,11 @@ static ssize_t grp_opt_proc_write(struct file *file, const char __user *buffer,
                switch (c) {
                case '0':
                        IoAdapter->capi_cfg.cfg_1 &=
-                           ~DIVA_XDI_CAPI_CFG_1_GROUP_POPTIMIZATION_ON;
+                               ~DIVA_XDI_CAPI_CFG_1_GROUP_POPTIMIZATION_ON;
                        break;
                case '1':
                        IoAdapter->capi_cfg.cfg_1 |=
-                           DIVA_XDI_CAPI_CFG_1_GROUP_POPTIMIZATION_ON;
+                               DIVA_XDI_CAPI_CFG_1_GROUP_POPTIMIZATION_ON;
                        break;
                default:
                        return (-EINVAL);
@@ -182,11 +182,11 @@ static ssize_t d_l1_down_proc_write(struct file *file, const char __user *buffer
                switch (c) {
                case '0':
                        IoAdapter->capi_cfg.cfg_1 &=
-                           ~DIVA_XDI_CAPI_CFG_1_DYNAMIC_L1_ON;
+                               ~DIVA_XDI_CAPI_CFG_1_DYNAMIC_L1_ON;
                        break;
                case '1':
                        IoAdapter->capi_cfg.cfg_1 |=
-                           DIVA_XDI_CAPI_CFG_1_DYNAMIC_L1_ON;
+                               DIVA_XDI_CAPI_CFG_1_DYNAMIC_L1_ON;
                        break;
                default:
                        return (-EINVAL);
@@ -202,9 +202,9 @@ static int d_l1_down_proc_show(struct seq_file *m, void *v)
        PISDN_ADAPTER IoAdapter = IoAdapters[a->controller - 1];
 
        seq_printf(m, "%s\n",
-                      (IoAdapter->capi_cfg.
-                       cfg_1 & DIVA_XDI_CAPI_CFG_1_DYNAMIC_L1_ON) ? "1" :
-                      "0");
+                  (IoAdapter->capi_cfg.
+                   cfg_1 & DIVA_XDI_CAPI_CFG_1_DYNAMIC_L1_ON) ? "1" :
+                  "0");
        return 0;
 }
 
@@ -228,9 +228,9 @@ static int grp_opt_proc_show(struct seq_file *m, void *v)
        PISDN_ADAPTER IoAdapter = IoAdapters[a->controller - 1];
 
        seq_printf(m, "%s\n",
-                      (IoAdapter->capi_cfg.
-                       cfg_1 & DIVA_XDI_CAPI_CFG_1_GROUP_POPTIMIZATION_ON)
-                      ? "1" : "0");
+                  (IoAdapter->capi_cfg.
+                   cfg_1 & DIVA_XDI_CAPI_CFG_1_GROUP_POPTIMIZATION_ON)
+                  ? "1" : "0");
        return 0;
 }
 
@@ -281,7 +281,7 @@ static int info_proc_show(struct seq_file *m, void *v)
        seq_printf(m, "DSP state   : %08x\n", a->dsp_mask);
        seq_printf(m, "Channels    : %02d\n", IoAdapter->Properties.Channels);
        seq_printf(m, "E. max/used : %03d/%03d\n",
-                      IoAdapter->e_max, IoAdapter->e_count);
+                  IoAdapter->e_max, IoAdapter->e_count);
        diva_get_vserial_number(IoAdapter, tmpser);
        seq_printf(m, "Serial      : %s\n", tmpser);
        seq_printf(m, "IRQ         : %d\n", IoAdapter->irq_info.irq_nr);
@@ -289,8 +289,8 @@ static int info_proc_show(struct seq_file *m, void *v)
        seq_printf(m, "CardOrdinal : %d\n", a->CardOrdinal);
        seq_printf(m, "Controller  : %d\n", a->controller);
        seq_printf(m, "Bus-Type    : %s\n",
-                      (a->Bus ==
-                       DIVAS_XDI_ADAPTER_BUS_ISA) ? "ISA" : "PCI");
+                  (a->Bus ==
+                   DIVAS_XDI_ADAPTER_BUS_ISA) ? "ISA" : "PCI");
        seq_printf(m, "Port-Name   : %s\n", a->port_name);
        if (a->Bus == DIVAS_XDI_ADAPTER_BUS_PCI) {
                seq_printf(m, "PCI-bus     : %d\n", a->resources.pci.bus);
@@ -298,15 +298,15 @@ static int info_proc_show(struct seq_file *m, void *v)
                for (i = 0; i < 8; i++) {
                        if (a->resources.pci.bar[i]) {
                                seq_printf(m,
-                                           "Mem / I/O %d : 0x%x / mapped : 0x%lx",
-                                           i, a->resources.pci.bar[i],
-                                           (unsigned long) a->resources.
-                                           pci.addr[i]);
+                                          "Mem / I/O %d : 0x%x / mapped : 0x%lx",
+                                          i, a->resources.pci.bar[i],
+                                          (unsigned long) a->resources.
+                                          pci.addr[i]);
                                if (a->resources.pci.length[i]) {
                                        seq_printf(m,
-                                                   " / length : %d",
-                                                   a->resources.pci.
-                                                   length[i]);
+                                                  " / length : %d",
+                                                  a->resources.pci.
+                                                  length[i]);
                                }
                                seq_putc(m, '\n');
                        }
@@ -314,7 +314,7 @@ static int info_proc_show(struct seq_file *m, void *v)
        }
        if ((!a->xdi_adapter.port) &&
            ((!a->xdi_adapter.ram) ||
-           (!a->xdi_adapter.reset)
+            (!a->xdi_adapter.reset)
             || (!a->xdi_adapter.cfg))) {
                if (!IoAdapter->irq_info.irq_nr) {
                        p = "slave";
@@ -352,9 +352,9 @@ static const struct file_operations info_proc_fops = {
 */
 
 /* --------------------------------------------------------------------------
-    Create adapter directory and files in proc file system
+   Create adapter directory and files in proc file system
    -------------------------------------------------------------------------- */
-int create_adapter_proc(diva_os_xdi_adapter_t * a)
+int create_adapter_proc(diva_os_xdi_adapter_t *a)
 {
        struct proc_dir_entry *de, *pe;
        char tmp[16];
@@ -385,9 +385,9 @@ int create_adapter_proc(diva_os_xdi_adapter_t * a)
 }
 
 /* --------------------------------------------------------------------------
-    Remove adapter directory and files in proc file system
+   Remove adapter directory and files in proc file system
    -------------------------------------------------------------------------- */
-void remove_adapter_proc(diva_os_xdi_adapter_t * a)
+void remove_adapter_proc(diva_os_xdi_adapter_t *a)
 {
        char tmp[16];
 
index 85784a7..dd6b53a 100644 (file)
@@ -1,29 +1,29 @@
 
 /*
  *
-  Copyright (c) Eicon Networks, 2002.
+ Copyright (c) Eicon Networks, 2002.
  *
-  This source file is supplied for the use with
-  Eicon Networks range of DIVA Server Adapters.
+ This source file is supplied for the use with
+ Eicon Networks range of DIVA Server Adapters.
  *
-  Eicon File Revision :    2.1
+ Eicon File Revision :    2.1
  *
-  This program is free software; you can redistribute it and/or modify
-  it under the terms of the GNU General Public License as published by
-  the Free Software Foundation; either version 2, or (at your option)
-  any later version.
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
  *
-  This program is distributed in the hope that it will be useful,
-  but WITHOUT ANY WARRANTY OF ANY KIND WHATSOEVER INCLUDING ANY
-  implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-  See the GNU General Public License for more details.
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY OF ANY KIND WHATSOEVER INCLUDING ANY
+ implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ See the GNU General Public License for more details.
  *
-  You should have received a copy of the GNU General Public License
-  along with this program; if not, write to the Free Software
-  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  *
  */
-#ifndef __DIVA_SYNC__H  
+#ifndef __DIVA_SYNC__H
 #define __DIVA_SYNC__H
 #define IDI_SYNC_REQ_REMOVE             0x00
 #define IDI_SYNC_REQ_GET_NAME           0x01
 /******************************************************************************/
 #define IDI_SYNC_REQ_XDI_GET_EXTENDED_FEATURES  0x92
 /*
-   To receive XDI features:
-   1. set 'buffer_length_in_bytes' to length of you buffer
-   2. set 'features' to pointer to your buffer
-   3. issue synchronous request to XDI
-   4. Check that feature 'DIVA_XDI_EXTENDED_FEATURES_VALID' is present
-      after call. This feature does indicate that your request
-      was processed and XDI does support this synchronous request
-   5. if on return bit 31 (0x80000000) in 'buffer_length_in_bytes' is
-      set then provided buffer was too small, and bits 30-0 does
-      contain necessary length of buffer.
-      in this case only features that do find place in the buffer
-      are indicated to caller
+  To receive XDI features:
+  1. set 'buffer_length_in_bytes' to length of you buffer
+  2. set 'features' to pointer to your buffer
+  3. issue synchronous request to XDI
+  4. Check that feature 'DIVA_XDI_EXTENDED_FEATURES_VALID' is present
+  after call. This feature does indicate that your request
+  was processed and XDI does support this synchronous request
+  5. if on return bit 31 (0x80000000) in 'buffer_length_in_bytes' is
+  set then provided buffer was too small, and bits 30-0 does
+  contain necessary length of buffer.
+  in this case only features that do find place in the buffer
+  are indicated to caller
 */
 typedef struct _diva_xdi_get_extended_xdi_features {
-  dword buffer_length_in_bytes;
-  byte  *features;
+       dword buffer_length_in_bytes;
+       byte  *features;
 } diva_xdi_get_extended_xdi_features_t;
 /*
-   features[0]
-  */
+  features[0]
+*/
 #define DIVA_XDI_EXTENDED_FEATURES_VALID          0x01
 #define DIVA_XDI_EXTENDED_FEATURE_CMA             0x02
 #define DIVA_XDI_EXTENDED_FEATURE_SDRAM_BAR       0x04
@@ -91,17 +91,17 @@ typedef struct _diva_xdi_get_extended_xdi_features {
 /******************************************************************************/
 #define IDI_SYNC_REQ_XDI_GET_ADAPTER_SDRAM_BAR   0x93
 typedef struct _diva_xdi_get_adapter_sdram_bar {
- dword bar;
+       dword bar;
 } diva_xdi_get_adapter_sdram_bar_t;
 /******************************************************************************/
 #define IDI_SYNC_REQ_XDI_GET_CAPI_PARAMS   0x94
 /*
   CAPI Parameters will be written in the caller's buffer
-  */
+*/
 typedef struct _diva_xdi_get_capi_parameters {
-  dword structure_length;
-  byte flag_dynamic_l1_down;
-  byte group_optimization_enabled;
+       dword structure_length;
+       byte flag_dynamic_l1_down;
+       byte group_optimization_enabled;
 } diva_xdi_get_capi_parameters_t;
 /******************************************************************************/
 #define IDI_SYNC_REQ_XDI_GET_LOGICAL_ADAPTER_NUMBER   0x95
@@ -111,11 +111,11 @@ typedef struct _diva_xdi_get_capi_parameters {
   in case of one adapter that supports multiple interfaces
   'controller' is zero for Master adapter (and adapter that supports
   only one interface)
-  */
+*/
 typedef struct _diva_xdi_get_logical_adapter_number {
-  dword logical_adapter_number;
-  dword controller;
-  dword total_controllers;
+       dword logical_adapter_number;
+       dword controller;
+       dword total_controllers;
 } diva_xdi_get_logical_adapter_number_s_t;
 /******************************************************************************/
 #define IDI_SYNC_REQ_UP1DM_OPERATION   0x96
@@ -124,10 +124,10 @@ typedef struct _diva_xdi_get_logical_adapter_number {
 #define IDI_SYNC_REQ_DMA_DESCRIPTOR_ALLOC     0x01
 #define IDI_SYNC_REQ_DMA_DESCRIPTOR_FREE      0x02
 typedef struct _diva_xdi_dma_descriptor_operation {
-  int   operation;
-  int   descriptor_number;
-  void* descriptor_address;
-  dword descriptor_magic;
+       int operation;
+       int descriptor_number;
+       void *descriptor_address;
+       dword descriptor_magic;
 } diva_xdi_dma_descriptor_operation_t;
 /******************************************************************************/
 #define IDI_SYNC_REQ_DIDD_REGISTER_ADAPTER_NOTIFY   0x01
@@ -137,22 +137,22 @@ typedef struct _diva_xdi_dma_descriptor_operation {
 #define IDI_SYNC_REQ_DIDD_READ_ADAPTER_ARRAY        0x05
 #define IDI_SYNC_REQ_DIDD_GET_CFG_LIB_IFC           0x10
 typedef struct _diva_didd_adapter_notify {
- dword handle; /* Notification handle */
- void   * callback;
- void   * context;
+       dword handle; /* Notification handle */
+       void *callback;
+       void *context;
 } diva_didd_adapter_notify_t;
 typedef struct _diva_didd_add_adapter {
- void   * descriptor;
+       void *descriptor;
 } diva_didd_add_adapter_t;
 typedef struct _diva_didd_remove_adapter {
- IDI_CALL p_request;
+       IDI_CALL p_request;
 } diva_didd_remove_adapter_t;
 typedef struct _diva_didd_read_adapter_array {
- void   * buffer;
- dword length;
+       void *buffer;
+       dword length;
 } diva_didd_read_adapter_array_t;
 typedef struct _diva_didd_get_cfg_lib_ifc {
- void* ifc;
+       void *ifc;
 } diva_didd_get_cfg_lib_ifc_t;
 /******************************************************************************/
 #define IDI_SYNC_REQ_XDI_GET_STREAM    0x91
@@ -163,31 +163,31 @@ typedef struct _diva_didd_get_cfg_lib_ifc {
 #define DIVA_ISTREAM_COMPLETE_READ     1
 #define DIVA_ISTREAM_COMPLETE_WRITE    2
 typedef struct _diva_xdi_stream_interface {
-  unsigned char  Id;                 /* filled by XDI client */
- unsigned char provided_service;    /* filled by XDI        */
- unsigned char requested_service;   /* filled by XDI Client */
- void* xdi_context;    /* filled by XDI     */
- void* client_context;   /* filled by XDI client */
- int (*write)(void* context,
-               int Id,
-               void* data,
-               int length,
-               int final,
-               byte usr1,
-               byte usr2);
- int (*read)(void* context,
-              int Id,
-              void* data,
-              int max_length,
-              int* final,
-              byte* usr1,
-              byte* usr2);
- int (*complete)(void* client_context,
-         int Id,
-          int what,
-         void* data,
-         int length,
-         int* final);
+       unsigned char  Id;                 /* filled by XDI client */
+       unsigned char provided_service;    /* filled by XDI        */
+       unsigned char requested_service;   /* filled by XDI Client */
+       void *xdi_context;    /* filled by XDI */
+       void *client_context;   /* filled by XDI client */
+       int (*write)(void *context,
+                    int Id,
+                    void *data,
+                    int length,
+                    int final,
+                    byte usr1,
+                    byte usr2);
+       int (*read)(void *context,
+                   int Id,
+                   void *data,
+                   int max_length,
+                   int *final,
+                   byte *usr1,
+                   byte *usr2);
+       int (*complete)(void *client_context,
+                       int Id,
+                       int what,
+                       void *data,
+                       int length,
+                       int *final);
 } diva_xdi_stream_interface_t;
 /******************************************************************************/
 /*
@@ -196,37 +196,37 @@ typedef struct _diva_xdi_stream_interface {
 typedef struct
 { unsigned char LineState;         /* Modem line state (STATUS_R) */
 #define SERIAL_GSM_CELL 0x01   /* GSM or CELL cable attached  */
- unsigned char CardState;          /* PCMCIA card state (0 = down) */
- unsigned char IsdnState;          /* ISDN layer 1 state (0 = down)*/
- unsigned char HookState;          /* current logical hook state */
+       unsigned char CardState;          /* PCMCIA card state (0 = down) */
+       unsigned char IsdnState;          /* ISDN layer 1 state (0 = down)*/
+       unsigned char HookState;          /* current logical hook state */
 #define SERIAL_ON_HOOK 0x02   /* set in DIVA CTRL_R register */
 } SERIAL_STATE;
-typedef int (  * SERIAL_INT_CB) (void *Context) ;
-typedef int (  * SERIAL_DPC_CB) (void *Context) ;
-typedef unsigned char (  * SERIAL_I_SYNC) (void *Context) ;
+typedef int (*SERIAL_INT_CB)(void *Context);
+typedef int (*SERIAL_DPC_CB)(void *Context);
+typedef unsigned char (*SERIAL_I_SYNC)(void *Context);
 typedef struct
 { /* 'Req' and 'Rc' must be at the same place as in the ENTITY struct */
- unsigned char Req;             /* request (must be always 0) */
- unsigned char Rc;              /* return code (is the request) */
- unsigned char Function;           /* private function code  */
+       unsigned char Req;             /* request (must be always 0) */
+       unsigned char Rc;              /* return code (is the request) */
+       unsigned char Function;           /* private function code  */
 #define SERIAL_HOOK_ATTACH 0x81
 #define SERIAL_HOOK_STATUS 0x82
 #define SERIAL_HOOK_I_SYNC 0x83
 #define SERIAL_HOOK_NOECHO 0x84
 #define SERIAL_HOOK_RING 0x85
 #define SERIAL_HOOK_DETACH 0x8f
- unsigned char Flags;           /* function refinements   */
- /* parameters passed by the ATTACH request      */
- SERIAL_INT_CB InterruptHandler; /* called on each interrupt  */
- SERIAL_DPC_CB DeferredHandler; /* called on hook state changes */
- void   *HandlerContext; /* context for both handlers */
- /* return values for both the ATTACH and the STATUS request   */
- unsigned long IoBase;    /* IO port assigned to UART  */
- SERIAL_STATE State;
- /* parameters and return values for the I_SYNC function    */
- SERIAL_I_SYNC SyncFunction;  /* to be called synchronized */
- void   *SyncContext;  /* context for this function */
- unsigned char SyncResult;   /* return value of function  */
+       unsigned char Flags;           /* function refinements   */
+       /* parameters passed by the ATTACH request      */
+       SERIAL_INT_CB InterruptHandler; /* called on each interrupt  */
+       SERIAL_DPC_CB DeferredHandler; /* called on hook state changes */
+       void   *HandlerContext; /* context for both handlers */
+       /* return values for both the ATTACH and the STATUS request   */
+       unsigned long IoBase;    /* IO port assigned to UART  */
+       SERIAL_STATE State;
+       /* parameters and return values for the I_SYNC function    */
+       SERIAL_I_SYNC SyncFunction;  /* to be called synchronized */
+       void   *SyncContext;  /* context for this function */
+       unsigned char SyncResult;   /* return value of function  */
 } SERIAL_HOOK;
 /*
  * IDI_SYNC_REQ_XCHANGE_STATUS - exchange the status between IDI and WMP
@@ -234,22 +234,22 @@ typedef struct
  */
 typedef struct
 { /* 'Req' and 'Rc' must be at the same place as in the ENTITY struct */
- unsigned char Req;             /* request (must be always 0) */
- unsigned char Rc;              /* return code (is the request) */
+       unsigned char Req;             /* request (must be always 0) */
+       unsigned char Rc;              /* return code (is the request) */
 #define DRIVER_STATUS_BOOT  0xA1
 #define DRIVER_STATUS_INIT_DEV 0xA2
 #define DRIVER_STATUS_RUNNING 0xA3
 #define DRIVER_STATUS_SHUTDOWN 0xAF
 #define DRIVER_STATUS_TRAPPED 0xAE
- unsigned char wmpStatus;          /* exported by WMP              */
- unsigned char idiStatus;   /* exported by IDI              */
- unsigned long wizProto ;   /* from WMP registry to IDI     */
- /* the cardtype value is defined by cardtype.h */
- unsigned long cardType ;   /* from IDI registry to WMP     */
- unsigned long nt2 ;    /* from IDI registry to WMP     */
- unsigned long permanent ;   /* from IDI registry to WMP     */
- unsigned long stableL2 ;   /* from IDI registry to WMP     */
- unsigned long tei ;    /* from IDI registry to WMP     */
+       unsigned char wmpStatus;          /* exported by WMP              */
+       unsigned char idiStatus;   /* exported by IDI              */
+       unsigned long wizProto;   /* from WMP registry to IDI     */
+       /* the cardtype value is defined by cardtype.h */
+       unsigned long cardType;   /* from IDI registry to WMP     */
+       unsigned long nt2;    /* from IDI registry to WMP     */
+       unsigned long permanent;   /* from IDI registry to WMP     */
+       unsigned long stableL2;   /* from IDI registry to WMP     */
+       unsigned long tei;    /* from IDI registry to WMP     */
 #define CRC4_MASK   0x00000003
 #define L1_TRISTATE_MASK 0x00000004
 #define WATCHDOG_MASK  0x00000008
@@ -271,36 +271,36 @@ typedef struct
 #define SET_STABLEL2  0x20000000
 #define SET_TEI    0x40000000
 #define SET_NUMBERLEN  0x80000000
- unsigned long Flag ;  /* |31-Type-16|15-Mask-0| */
- unsigned long NumberLen ; /* reconfiguration: union is empty */
- union {
-  struct {    /* possible reconfiguration, but ... ; SET_BOARD */
-   unsigned long SerialNumber ;
-   char     *pCardname ; /* di_defs.h: BOARD_NAME_LENGTH */
-  } board ;
-  struct {      /* reset: need resources */
-   void * pRawResources ;
-   void * pXlatResources ;
-  } res ;
-  struct { /* reconfiguration: wizProto == PROTTYPE_RBSCAS */
+       unsigned long Flag;  /* |31-Type-16|15-Mask-0| */
+       unsigned long NumberLen; /* reconfiguration: union is empty */
+       union {
+               struct {    /* possible reconfiguration, but ... ; SET_BOARD */
+                       unsigned long SerialNumber;
+                       char     *pCardname; /* di_defs.h: BOARD_NAME_LENGTH */
+               } board;
+               struct {      /* reset: need resources */
+                       void *pRawResources;
+                       void *pXlatResources;
+               } res;
+               struct { /* reconfiguration: wizProto == PROTTYPE_RBSCAS */
 #define GLARE_RESOLVE_MASK 0x00000001
 #define DID_MASK   0x00000002
 #define BEARER_CAP_MASK  0x0000000c
 #define SET_GLARE_RESOLVE 0x00010000
 #define SET_DID    0x00020000
 #define SET_BEARER_CAP  0x000c0000
-   unsigned long Flag ;  /* |31-Type-16|15-VALUE-0| */
-   unsigned short DigitTimeout ;
-   unsigned short AnswerDelay ;
-  } rbs ;
-  struct { /* reconfiguration: wizProto == PROTTYPE_QSIG */
+                       unsigned long Flag;  /* |31-Type-16|15-VALUE-0| */
+                       unsigned short DigitTimeout;
+                       unsigned short AnswerDelay;
+               } rbs;
+               struct { /* reconfiguration: wizProto == PROTTYPE_QSIG */
 #define CALL_REF_LENGTH1_MASK 0x00000001
 #define BRI_CHANNEL_ID_MASK  0x00000002
 #define SET_CALL_REF_LENGTH  0x00010000
 #define SET_BRI_CHANNEL_ID  0x00020000
-   unsigned long Flag ;  /* |31-Type-16|15-VALUE-0| */
-  } qsig ;
-  struct { /* reconfiguration: NumberLen != 0 */
+                       unsigned long Flag;  /* |31-Type-16|15-VALUE-0| */
+               } qsig;
+               struct { /* reconfiguration: NumberLen != 0 */
 #define SET_SPID1   0x00010000
 #define SET_NUMBER1   0x00020000
 #define SET_SUBADDRESS1  0x00040000
@@ -308,50 +308,50 @@ typedef struct
 #define SET_NUMBER2   0x00200000
 #define SET_SUBADDRESS2  0x00400000
 #define MASK_SET   0xffff0000
-   unsigned long Flag ;   /* |31-Type-16|15-Channel-0| */
-   unsigned char *pBuffer ; /* number value */
-  } isdnNo ;
- }
-parms
-;
-} isdnProps ;
+                       unsigned long Flag;   /* |31-Type-16|15-Channel-0| */
+                       unsigned char *pBuffer; /* number value */
+               } isdnNo;
+       }
+               parms
+               ;
+} isdnProps;
 /*
  * IDI_SYNC_REQ_PORTDRV_HOOK - signal plug/unplug (Award Cardware only)
  */
-typedef void (  * PORTDRV_HOOK_CB) (void *Context, int Plug) ;
+typedef void (*PORTDRV_HOOK_CB)(void *Context, int Plug);
 typedef struct
 { /* 'Req' and 'Rc' must be at the same place as in the ENTITY struct */
- unsigned char Req;             /* request (must be always 0) */
- unsigned char Rc;              /* return code (is the request) */
- unsigned char Function;           /* private function code  */
- unsigned char Flags;           /* function refinements   */
- PORTDRV_HOOK_CB Callback;   /* to be called on plug/unplug */
- void   *Context;   /* context for callback   */
- unsigned long Info;    /* more info if needed   */
-} PORTDRV_HOOK ;
+       unsigned char Req;             /* request (must be always 0) */
+       unsigned char Rc;              /* return code (is the request) */
+       unsigned char Function;           /* private function code  */
+       unsigned char Flags;           /* function refinements   */
+       PORTDRV_HOOK_CB Callback;   /* to be called on plug/unplug */
+       void   *Context;   /* context for callback   */
+       unsigned long Info;    /* more info if needed   */
+} PORTDRV_HOOK;
 /*  Codes for the 'Rc' element in structure below. */
 #define SLI_INSTALL     (0xA1)
 #define SLI_UNINSTALL   (0xA2)
-typedef int ( * SLIENTRYPOINT)(void* p3SignalAPI, void* pContext);
+typedef int (*SLIENTRYPOINT)(void *p3SignalAPI, void *pContext);
 typedef struct
 {   /* 'Req' and 'Rc' must be at the same place as in the ENTITY struct */
-    unsigned char   Req;                /* request (must be always 0)   */
-    unsigned char   Rc;                 /* return code (is the request) */
-    unsigned char   Function;           /* private function code        */
-    unsigned char   Flags;              /* function refinements         */
-    SLIENTRYPOINT   Callback;           /* to be called on plug/unplug  */
-    void            *Context;           /* context for callback         */
-    unsigned long   Info;               /* more info if needed          */
-} SLIENTRYPOINT_REQ ;
+       unsigned char   Req;                /* request (must be always 0)   */
+       unsigned char   Rc;                 /* return code (is the request) */
+       unsigned char   Function;           /* private function code        */
+       unsigned char   Flags;              /* function refinements         */
+       SLIENTRYPOINT   Callback;           /* to be called on plug/unplug  */
+       void            *Context;           /* context for callback         */
+       unsigned long   Info;               /* more info if needed          */
+} SLIENTRYPOINT_REQ;
 /******************************************************************************/
 /*
  *  Definitions for DIVA USB
  */
-typedef int  (  * USB_SEND_REQ) (unsigned char PipeIndex, unsigned char Type,void *Data, int sizeData);
-typedef int  (  * USB_START_DEV) (void *Adapter, void *Ipac) ;
+typedef int (*USB_SEND_REQ)(unsigned char PipeIndex, unsigned char Type, void *Data, int sizeData);
+typedef int (*USB_START_DEV)(void *Adapter, void *Ipac);
 /* called from WDM */
-typedef void (  * USB_RECV_NOTIFY) (void *Ipac, void *msg) ;
-typedef void (  * USB_XMIT_NOTIFY) (void *Ipac, unsigned char PipeIndex) ;
+typedef void (*USB_RECV_NOTIFY)(void *Ipac, void *msg);
+typedef void (*USB_XMIT_NOTIFY)(void *Ipac, unsigned char PipeIndex);
 /******************************************************************************/
 /*
  * Parameter description for synchronous requests.
@@ -361,129 +361,129 @@ typedef void (  * USB_XMIT_NOTIFY) (void *Ipac, unsigned char PipeIndex) ;
  */
 typedef union
 { ENTITY Entity;
- struct
- { /* 'Req' and 'Rc' are at the same place as in the ENTITY struct */
-  unsigned char   Req; /* request (must be always 0) */
-  unsigned char   Rc;  /* return code (is the request) */
- }   Request;
- struct
- { unsigned char   Req; /* request (must be always 0) */
-  unsigned char   Rc;  /* return code (0x01)   */
-  unsigned char   name[BOARD_NAME_LENGTH];
- }   GetName;
- struct
- { unsigned char   Req; /* request (must be always 0) */
-  unsigned char   Rc;  /* return code (0x02)   */
-  unsigned long   serial; /* serial number    */
- }   GetSerial;
- struct
- { unsigned char   Req; /* request (must be always 0) */
-  unsigned char   Rc;  /* return code (0x02)   */
-  unsigned long   lineIdx;/* line, 0 if card has only one */
- }   GetLineIdx;
- struct
- { unsigned char  Req;     /* request (must be always 0) */
-  unsigned char  Rc;      /* return code (0x02)   */
-  unsigned long  cardtype;/* card type        */
- }   GetCardType;
- struct
- { unsigned short command;/* command = 0x0300 */
-  unsigned short dummy; /* not used */
-  IDI_CALL       callback;/* routine to call back */
-  ENTITY      *contxt; /* ptr to entity to use */
- }   PostCall;
- struct
- { unsigned char  Req;  /* request (must be always 0) */
-  unsigned char  Rc;   /* return code (0x04)   */
-  unsigned char  pcm[1]; /* buffer (a pc_maint struct) */
- }   GetXlog;
- struct
- { unsigned char  Req;  /* request (must be always 0) */
-  unsigned char  Rc;   /* return code (0x05)   */
-  unsigned short features;/* feature defines see below */
- }   GetFeatures;
- SERIAL_HOOK  SerialHook;
+       struct
+       { /* 'Req' and 'Rc' are at the same place as in the ENTITY struct */
+               unsigned char   Req; /* request (must be always 0) */
+               unsigned char   Rc;  /* return code (is the request) */
+       }   Request;
+       struct
+       { unsigned char   Req; /* request (must be always 0) */
+               unsigned char   Rc;  /* return code (0x01)   */
+               unsigned char   name[BOARD_NAME_LENGTH];
+       }   GetName;
+       struct
+       { unsigned char   Req; /* request (must be always 0) */
+               unsigned char   Rc;  /* return code (0x02)   */
+               unsigned long   serial; /* serial number    */
+       }   GetSerial;
+       struct
+       { unsigned char   Req; /* request (must be always 0) */
+               unsigned char   Rc;  /* return code (0x02)   */
+               unsigned long   lineIdx;/* line, 0 if card has only one */
+       }   GetLineIdx;
+       struct
+       { unsigned char  Req;     /* request (must be always 0) */
+               unsigned char  Rc;      /* return code (0x02)   */
+               unsigned long  cardtype;/* card type        */
+       }   GetCardType;
+       struct
+       { unsigned short command;/* command = 0x0300 */
+               unsigned short dummy; /* not used */
+               IDI_CALL       callback;/* routine to call back */
+               ENTITY      *contxt; /* ptr to entity to use */
+       }   PostCall;
+       struct
+       { unsigned char  Req;  /* request (must be always 0) */
+               unsigned char  Rc;   /* return code (0x04)   */
+               unsigned char  pcm[1]; /* buffer (a pc_maint struct) */
+       }   GetXlog;
+       struct
+       { unsigned char  Req;  /* request (must be always 0) */
+               unsigned char  Rc;   /* return code (0x05)   */
+               unsigned short features;/* feature defines see below */
+       }   GetFeatures;
+       SERIAL_HOOK  SerialHook;
 /* Added for DIVA USB */
- struct
- { unsigned char   Req;
-  unsigned char   Rc;
-  USB_SEND_REQ    UsbSendRequest; /* function in Diva Usb WDM driver in usb_os.c, */
-                                        /* called from usb_drv.c to send a message to our device */
-                                        /* eg UsbSendRequest (USB_PIPE_SIGNAL, USB_IPAC_START, 0, 0) ; */
-  USB_RECV_NOTIFY usb_recv;       /* called from usb_os.c to pass a received message and ptr to IPAC */
-                                        /* on to usb_drv.c by a call to usb_recv(). */
-  USB_XMIT_NOTIFY usb_xmit;       /* called from usb_os.c in DivaUSB.sys WDM to indicate a completed transmit */
-                                        /* to usb_drv.c by a call to usb_xmit(). */
-  USB_START_DEV   UsbStartDevice; /* Start the USB Device, in usb_os.c */
-  IDI_CALL        callback;       /* routine to call back */
-  ENTITY          *contxt;     /* ptr to entity to use */
-  void            ** ipac_ptr;    /* pointer to struct IPAC in VxD */
- } Usb_Msg_old;
+       struct
+       { unsigned char   Req;
+               unsigned char   Rc;
+               USB_SEND_REQ    UsbSendRequest; /* function in Diva Usb WDM driver in usb_os.c, */
+               /* called from usb_drv.c to send a message to our device */
+               /* eg UsbSendRequest (USB_PIPE_SIGNAL, USB_IPAC_START, 0, 0); */
+               USB_RECV_NOTIFY usb_recv;       /* called from usb_os.c to pass a received message and ptr to IPAC */
+               /* on to usb_drv.c by a call to usb_recv(). */
+               USB_XMIT_NOTIFY usb_xmit;       /* called from usb_os.c in DivaUSB.sys WDM to indicate a completed transmit */
+               /* to usb_drv.c by a call to usb_xmit(). */
+               USB_START_DEV   UsbStartDevice; /* Start the USB Device, in usb_os.c */
+               IDI_CALL        callback;       /* routine to call back */
+               ENTITY          *contxt;     /* ptr to entity to use */
+               void **ipac_ptr;    /* pointer to struct IPAC in VxD */
+       } Usb_Msg_old;
 /* message used by WDM and VXD to pass pointers of function and IPAC* */
- struct
- { unsigned char Req;
-  unsigned char Rc;
-        USB_SEND_REQ    pUsbSendRequest;/* function in Diva Usb WDM driver in usb_os.c, */
-                                        /* called from usb_drv.c to send a message to our device */
-                                        /* eg UsbSendRequest (USB_PIPE_SIGNAL, USB_IPAC_START, 0, 0) ; */
-        USB_RECV_NOTIFY p_usb_recv;     /* called from usb_os.c to pass a received message and ptr to IPAC */
-                                        /* on to usb_drv.c by a call to usb_recv(). */
-        USB_XMIT_NOTIFY p_usb_xmit;     /* called from usb_os.c in DivaUSB.sys WDM to indicate a completed transmit */
-                                        /* to usb_drv.c by a call to usb_xmit().*/
-  void            *ipac_ptr;      /* &Diva.ipac pointer to struct IPAC in VxD */
- } Usb_Msg;
- PORTDRV_HOOK PortdrvHook;
-    SLIENTRYPOINT_REQ   sliEntryPointReq;
-  struct {
-    unsigned char Req;
-    unsigned char Rc;
-    diva_xdi_stream_interface_t info;
-  } xdi_stream_info;
-  struct {
-    unsigned char Req;
-    unsigned char Rc;
-    diva_xdi_get_extended_xdi_features_t info;
-  } xdi_extended_features;
- struct {
-    unsigned char Req;
-    unsigned char Rc;
-  diva_xdi_get_adapter_sdram_bar_t info;
- } xdi_sdram_bar;
-  struct {
-    unsigned char Req;
-    unsigned char Rc;
-    diva_xdi_get_capi_parameters_t info;
-  } xdi_capi_prms;
- struct {
-  ENTITY           e;
-  diva_didd_adapter_notify_t info;
- } didd_notify;
- struct {
-  ENTITY           e;
-  diva_didd_add_adapter_t   info;
- } didd_add_adapter;
- struct {
-  ENTITY           e;
-  diva_didd_remove_adapter_t info;
- } didd_remove_adapter;
- struct {
-  ENTITY             e;
-  diva_didd_read_adapter_array_t info;
- } didd_read_adapter_array;
- struct {
-  ENTITY             e;
-  diva_didd_get_cfg_lib_ifc_t     info;
- } didd_get_cfg_lib_ifc;
-  struct {
-    unsigned char Req;
-    unsigned char Rc;
-    diva_xdi_get_logical_adapter_number_s_t info;
-  } xdi_logical_adapter_number;
-  struct {
-    unsigned char Req;
-    unsigned char Rc;
-    diva_xdi_dma_descriptor_operation_t info;
-  } xdi_dma_descriptor_operation;
+       struct
+       { unsigned char Req;
+               unsigned char Rc;
+               USB_SEND_REQ    pUsbSendRequest;/* function in Diva Usb WDM driver in usb_os.c, */
+               /* called from usb_drv.c to send a message to our device */
+               /* eg UsbSendRequest (USB_PIPE_SIGNAL, USB_IPAC_START, 0, 0); */
+               USB_RECV_NOTIFY p_usb_recv;     /* called from usb_os.c to pass a received message and ptr to IPAC */
+               /* on to usb_drv.c by a call to usb_recv(). */
+               USB_XMIT_NOTIFY p_usb_xmit;     /* called from usb_os.c in DivaUSB.sys WDM to indicate a completed transmit */
+               /* to usb_drv.c by a call to usb_xmit().*/
+               void            *ipac_ptr;      /* &Diva.ipac pointer to struct IPAC in VxD */
+       } Usb_Msg;
+       PORTDRV_HOOK PortdrvHook;
+       SLIENTRYPOINT_REQ   sliEntryPointReq;
+       struct {
+               unsigned char Req;
+               unsigned char Rc;
+               diva_xdi_stream_interface_t info;
+       } xdi_stream_info;
+       struct {
+               unsigned char Req;
+               unsigned char Rc;
+               diva_xdi_get_extended_xdi_features_t info;
+       } xdi_extended_features;
+       struct {
+               unsigned char Req;
+               unsigned char Rc;
+               diva_xdi_get_adapter_sdram_bar_t info;
+       } xdi_sdram_bar;
+       struct {
+               unsigned char Req;
+               unsigned char Rc;
+               diva_xdi_get_capi_parameters_t info;
+       } xdi_capi_prms;
+       struct {
+               ENTITY           e;
+               diva_didd_adapter_notify_t info;
+       } didd_notify;
+       struct {
+               ENTITY           e;
+               diva_didd_add_adapter_t   info;
+       } didd_add_adapter;
+       struct {
+               ENTITY           e;
+               diva_didd_remove_adapter_t info;
+       } didd_remove_adapter;
+       struct {
+               ENTITY             e;
+               diva_didd_read_adapter_array_t info;
+       } didd_read_adapter_array;
+       struct {
+               ENTITY             e;
+               diva_didd_get_cfg_lib_ifc_t     info;
+       } didd_get_cfg_lib_ifc;
+       struct {
+               unsigned char Req;
+               unsigned char Rc;
+               diva_xdi_get_logical_adapter_number_s_t info;
+       } xdi_logical_adapter_number;
+       struct {
+               unsigned char Req;
+               unsigned char Rc;
+               diva_xdi_dma_descriptor_operation_t info;
+       } xdi_dma_descriptor_operation;
 } IDI_SYNC_REQ;
 /******************************************************************************/
-#endif /* __DIVA_SYNC__H */  
+#endif /* __DIVA_SYNC__H */
index 9822582..7958a25 100644 (file)
@@ -14,7 +14,7 @@
 #include "dqueue.h"
 
 int
-diva_data_q_init(diva_um_idi_data_queue_t * q,
+diva_data_q_init(diva_um_idi_data_queue_t *q,
                 int max_length, int max_segments)
 {
        int i;
@@ -38,7 +38,7 @@ diva_data_q_init(diva_um_idi_data_queue_t * q,
        return (0);
 }
 
-int diva_data_q_finit(diva_um_idi_data_queue_t * q)
+int diva_data_q_finit(diva_um_idi_data_queue_t *q)
 {
        int i;
 
@@ -54,12 +54,12 @@ int diva_data_q_finit(diva_um_idi_data_queue_t * q)
        return (0);
 }
 
-int diva_data_q_get_max_length(const diva_um_idi_data_queue_t * q)
+int diva_data_q_get_max_length(const diva_um_idi_data_queue_t *q)
 {
        return (q->max_length);
 }
 
-void *diva_data_q_get_segment4write(diva_um_idi_data_queue_t * q)
+void *diva_data_q_get_segment4write(diva_um_idi_data_queue_t *q)
 {
        if ((!q->segment_pending) && (q->count < q->segments)) {
                q->segment_pending = 1;
@@ -70,7 +70,7 @@ void *diva_data_q_get_segment4write(diva_um_idi_data_queue_t * q)
 }
 
 void
-diva_data_q_ack_segment4write(diva_um_idi_data_queue_t * q, int length)
+diva_data_q_ack_segment4write(diva_um_idi_data_queue_t *q, int length)
 {
        if (q->segment_pending) {
                q->length[q->write] = length;
@@ -92,12 +92,12 @@ const void *diva_data_q_get_segment4read(const diva_um_idi_data_queue_t *
        return NULL;
 }
 
-int diva_data_q_get_segment_length(const diva_um_idi_data_queue_t * q)
+int diva_data_q_get_segment_length(const diva_um_idi_data_queue_t *q)
 {
        return (q->length[q->read]);
 }
 
-void diva_data_q_ack_segment4read(diva_um_idi_data_queue_t * q)
+void diva_data_q_ack_segment4read(diva_um_idi_data_queue_t *q)
 {
        if (q->count) {
                q->length[q->read] = 0;
index 72d21c9..6992c45 100644 (file)
@@ -16,16 +16,16 @@ typedef struct _diva_um_idi_data_queue {
        int length[DIVA_UM_IDI_MAX_MSGS];
 } diva_um_idi_data_queue_t;
 
-int diva_data_q_init(diva_um_idi_data_queue_t * q,
+int diva_data_q_init(diva_um_idi_data_queue_t *q,
                     int max_length, int max_segments);
-int diva_data_q_finit(diva_um_idi_data_queue_t * q);
-int diva_data_q_get_max_length(const diva_um_idi_data_queue_t * q);
-void *diva_data_q_get_segment4write(diva_um_idi_data_queue_t * q);
-void diva_data_q_ack_segment4write(diva_um_idi_data_queue_t * q,
+int diva_data_q_finit(diva_um_idi_data_queue_t *q);
+int diva_data_q_get_max_length(const diva_um_idi_data_queue_t *q);
+void *diva_data_q_get_segment4write(diva_um_idi_data_queue_t *q);
+void diva_data_q_ack_segment4write(diva_um_idi_data_queue_t *q,
                                   int length);
 const void *diva_data_q_get_segment4read(const diva_um_idi_data_queue_t *
                                         q);
-int diva_data_q_get_segment_length(const diva_um_idi_data_queue_t * q);
-void diva_data_q_ack_segment4read(diva_um_idi_data_queue_t * q);
+int diva_data_q_get_segment_length(const diva_um_idi_data_queue_t *q);
+void diva_data_q_ack_segment4read(diva_um_idi_data_queue_t *q);
 
 #endif
index fec1e38..94828c8 100644 (file)
@@ -1,33 +1,33 @@
 
 /*
  *
-  Copyright (c) Eicon Networks, 2002.
+ Copyright (c) Eicon Networks, 2002.
  *
-  This source file is supplied for the use with
-  Eicon Networks range of DIVA Server Adapters.
+ This source file is supplied for the use with
+ Eicon Networks range of DIVA Server Adapters.
  *
-  Eicon File Revision :    2.1
+ Eicon File Revision :    2.1
  *
-  This program is free software; you can redistribute it and/or modify
-  it under the terms of the GNU General Public License as published by
-  the Free Software Foundation; either version 2, or (at your option)
-  any later version.
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
  *
-  This program is distributed in the hope that it will be useful,
-  but WITHOUT ANY WARRANTY OF ANY KIND WHATSOEVER INCLUDING ANY
-  implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-  See the GNU General Public License for more details.
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY OF ANY KIND WHATSOEVER INCLUDING ANY
+ implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ See the GNU General Public License for more details.
  *
-  You should have received a copy of the GNU General Public License
-  along with this program; if not, write to the Free Software
-  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  *
  */
-#ifndef DSP_DEFS_H_  
+#ifndef DSP_DEFS_H_
 #define DSP_DEFS_H_
 #include "dspdids.h"
 /*---------------------------------------------------------------------------*/
-#define dsp_download_reserve_space(fp,length)
+#define dsp_download_reserve_space(fp, length)
 /*****************************************************************************/
 /*
  * OS file access abstraction layer
  * I/O functions returns -1 on error, 0 on EOF
  */
 struct _OsFileHandle_;
-typedef long (  * OsFileIo)  (struct _OsFileHandle_    *handle,
-                                void                     *buffer,
-                                long                       size) ;
-typedef long (  * OsFileSeek)(struct _OsFileHandle_    *handle,
-                                long                       position,
-                                int                        mode) ;
-typedef long (  * OsCardLoad)(struct _OsFileHandle_    *handle,
-                                long                       length,
-                                void                         *   *addr) ;
+typedef long (*OsFileIo)(struct _OsFileHandle_ *handle,
+                        void *buffer,
+                        long size);
+typedef long (*OsFileSeek)(struct _OsFileHandle_ *handle,
+                          long position,
+                          int mode);
+typedef long (*OsCardLoad)(struct _OsFileHandle_    *handle,
+                          long length,
+                          void **addr);
 typedef struct _OsFileHandle_
-{ void       *sysFileDesc ;
- unsigned long sysFileSize ;
- OsFileIo      sysFileRead ;
- OsFileSeek    sysFileSeek ;
- void       *sysLoadDesc ;
- OsCardLoad    sysCardLoad ;
-} OsFileHandle ;
-extern OsFileHandle *OsOpenFile (char *path_name) ;
-extern void          OsCloseFile (OsFileHandle *fp) ;
+{ void       *sysFileDesc;
+       unsigned long sysFileSize;
+       OsFileIo      sysFileRead;
+       OsFileSeek    sysFileSeek;
+       void       *sysLoadDesc;
+       OsCardLoad    sysCardLoad;
+} OsFileHandle;
+extern OsFileHandle *OsOpenFile(char *path_name);
+extern void          OsCloseFile(OsFileHandle *fp);
 /*****************************************************************************/
 #define DSP_TELINDUS_FILE "dspdload.bin"
 /* special DSP file for BRI cards for Qsig and CornetN because of missing memory */
@@ -93,109 +93,109 @@ extern void          OsCloseFile (OsFileHandle *fp) ;
 #define DSP_FILE_FORMAT_VERSION_BCD         0x0100
 typedef struct tag_dsp_combifile_header
 {
-  char                  format_identification[DSP_COMBIFILE_FORMAT_IDENTIFICATION_SIZE];
-  word                  format_version_bcd;
-  word                  header_size;
-  word                  combifile_description_size;
-  word                  directory_entries;
-  word                  directory_size;
-  word                  download_count;
-  word                  usage_mask_size;
+       char                  format_identification[DSP_COMBIFILE_FORMAT_IDENTIFICATION_SIZE];
+       word                  format_version_bcd;
+       word                  header_size;
+       word                  combifile_description_size;
+       word                  directory_entries;
+       word                  directory_size;
+       word                  download_count;
+       word                  usage_mask_size;
 } t_dsp_combifile_header;
 typedef struct tag_dsp_combifile_directory_entry
 {
-  word                  card_type_number;
-  word                  file_set_number;
+       word                  card_type_number;
+       word                  file_set_number;
 } t_dsp_combifile_directory_entry;
 typedef struct tag_dsp_file_header
 {
-  char                  format_identification[DSP_FILE_FORMAT_IDENTIFICATION_SIZE];
-  word                  format_version_bcd;
-  word                  download_id;
-  word                  download_flags;
-  word                  required_processing_power;
-  word                  interface_channel_count;
-  word                  header_size;
-  word                  download_description_size;
-  word                  memory_block_table_size;
-  word                  memory_block_count;
-  word                  segment_table_size;
-  word                  segment_count;
-  word                  symbol_table_size;
-  word                  symbol_count;
-  word                  total_data_size_dm;
-  word                  data_block_count_dm;
-  word                  total_data_size_pm;
-  word                  data_block_count_pm;
+       char                  format_identification[DSP_FILE_FORMAT_IDENTIFICATION_SIZE];
+       word                  format_version_bcd;
+       word                  download_id;
+       word                  download_flags;
+       word                  required_processing_power;
+       word                  interface_channel_count;
+       word                  header_size;
+       word                  download_description_size;
+       word                  memory_block_table_size;
+       word                  memory_block_count;
+       word                  segment_table_size;
+       word                  segment_count;
+       word                  symbol_table_size;
+       word                  symbol_count;
+       word                  total_data_size_dm;
+       word                  data_block_count_dm;
+       word                  total_data_size_pm;
+       word                  data_block_count_pm;
 } t_dsp_file_header;
 typedef struct tag_dsp_memory_block_desc
 {
-  word                  alias_memory_block;
-  word                  memory_type;
-  word                  address;
-  word                  size;             /* DSP words */
+       word                  alias_memory_block;
+       word                  memory_type;
+       word                  address;
+       word                  size;             /* DSP words */
 } t_dsp_memory_block_desc;
 typedef struct tag_dsp_segment_desc
 {
-  word                  memory_block;
-  word                  attributes;
-  word                  base;
-  word                  size;
-  word                  alignment;        /* ==0 -> no other legal start address than base */
+       word                  memory_block;
+       word                  attributes;
+       word                  base;
+       word                  size;
+       word                  alignment;        /* ==0 -> no other legal start address than base */
 } t_dsp_segment_desc;
 typedef struct tag_dsp_symbol_desc
 {
-  word                  symbol_id;
-  word                  segment;
-  word                  offset;
-  word                  size;             /* DSP words */
+       word                  symbol_id;
+       word                  segment;
+       word                  offset;
+       word                  size;             /* DSP words */
 } t_dsp_symbol_desc;
 typedef struct tag_dsp_data_block_header
 {
-  word                  attributes;
-  word                  segment;
-  word                  offset;
-  word                  size;             /* DSP words */
+       word                  attributes;
+       word                  segment;
+       word                  offset;
+       word                  size;             /* DSP words */
 } t_dsp_data_block_header;
 typedef struct tag_dsp_download_desc
 {
-  word                  download_id;
-  word                  download_flags;
-  word                  required_processing_power;
-  word                  interface_channel_count;
-  word                  excess_header_size;
-  word                  memory_block_count;
-  word                  segment_count;
-  word                  symbol_count;
-  word                  data_block_count_dm;
-  word                  data_block_count_pm;
-  byte   *            p_excess_header_data;
-  char   *            p_download_description;
-  t_dsp_memory_block_desc   *p_memory_block_table;
-  t_dsp_segment_desc   *p_segment_table;
-  t_dsp_symbol_desc   *p_symbol_table;
-  word   *            p_data_blocks_dm;
-  word   *            p_data_blocks_pm;
+       word                  download_id;
+       word                  download_flags;
+       word                  required_processing_power;
+       word                  interface_channel_count;
+       word                  excess_header_size;
+       word                  memory_block_count;
+       word                  segment_count;
+       word                  symbol_count;
+       word                  data_block_count_dm;
+       word                  data_block_count_pm;
+       byte *p_excess_header_data;
+       char *p_download_description;
+       t_dsp_memory_block_desc *p_memory_block_table;
+       t_dsp_segment_desc *p_segment_table;
+       t_dsp_symbol_desc *p_symbol_table;
+       word *p_data_blocks_dm;
+       word *p_data_blocks_pm;
 } t_dsp_desc;
 typedef struct tag_dsp_portable_download_desc /* be sure to keep native alignment for MAESTRA's */
 {
-  word                  download_id;
-  word                  download_flags;
-  word                  required_processing_power;
-  word                  interface_channel_count;
-  word                  excess_header_size;
-  word                  memory_block_count;
-  word                  segment_count;
-  word                  symbol_count;
-  word                  data_block_count_dm;
-  word                  data_block_count_pm;
-  dword                 p_excess_header_data;
-  dword                 p_download_description;
-  dword                 p_memory_block_table;
-  dword                 p_segment_table;
-  dword                 p_symbol_table;
-  dword                 p_data_blocks_dm;
-  dword                 p_data_blocks_pm;
+       word                  download_id;
+       word                  download_flags;
+       word                  required_processing_power;
+       word                  interface_channel_count;
+       word                  excess_header_size;
+       word                  memory_block_count;
+       word                  segment_count;
+       word                  symbol_count;
+       word                  data_block_count_dm;
+       word                  data_block_count_pm;
+       dword                 p_excess_header_data;
+       dword                 p_download_description;
+       dword                 p_memory_block_table;
+       dword                 p_segment_table;
+       dword                 p_symbol_table;
+       dword                 p_data_blocks_dm;
+       dword                 p_data_blocks_pm;
 } t_dsp_portable_desc;
 #define DSP_DOWNLOAD_INDEX_KERNEL               0
 #define DSP30TX_DOWNLOAD_INDEX_KERNEL           1
@@ -204,7 +204,7 @@ typedef struct tag_dsp_portable_download_desc /* be sure to keep native alignmen
 #define DSP_DOWNLOAD_MAX_SEGMENTS         16
 #define DSP_UDATA_REQUEST_RECONFIGURE     0
 /*
-parameters:
+  parameters:
   <word> reconfigure delay (in 8kHz samples)
   <word> reconfigure code
   <byte> reconfigure hdlc preamble flags
@@ -229,11 +229,11 @@ parameters:
 #define DSP_RECONFIGURE_V17_12000         11
 #define DSP_RECONFIGURE_V17_14400         12
 /*
-data indications if transparent framer
+  data indications if transparent framer
   <byte> data 0
   <byte> data 1
   ...
-data indications if HDLC framer
+  data indications if HDLC framer
   <byte> data 0
   <byte> data 1
   ...
@@ -243,17 +243,17 @@ data indications if HDLC framer
 */
 #define DSP_UDATA_INDICATION_SYNC         0
 /*
-returns:
+  returns:
   <word> time of sync (sampled from counter at 8kHz)
 */
 #define DSP_UDATA_INDICATION_DCD_OFF      1
 /*
-returns:
+  returns:
   <word> time of DCD off (sampled from counter at 8kHz)
 */
 #define DSP_UDATA_INDICATION_DCD_ON       2
 /*
-returns:
+  returns:
   <word> time of DCD on (sampled from counter at 8kHz)
   <byte> connected norm
   <word> connected options
@@ -261,12 +261,12 @@ returns:
 */
 #define DSP_UDATA_INDICATION_CTS_OFF      3
 /*
-returns:
+  returns:
   <word> time of CTS off (sampled from counter at 8kHz)
 */
 #define DSP_UDATA_INDICATION_CTS_ON       4
 /*
-returns:
+  returns:
   <word> time of CTS on (sampled from counter at 8kHz)
   <byte> connected norm
   <word> connected options
@@ -292,10 +292,10 @@ returns:
 #define DSP_CONNECTED_NORM_V17              17
 #define DSP_CONNECTED_OPTION_TRELLIS        0x0001
 /*---------------------------------------------------------------------------*/
-extern char *dsp_read_file (OsFileHandle          *fp,
-                            word                     card_type_number,
-                            word                  *p_dsp_download_count,
-                            t_dsp_desc            *p_dsp_download_table,
-                            t_dsp_portable_desc   *p_dsp_portable_download_table) ;
+extern char *dsp_read_file(OsFileHandle *fp,
+                          word card_type_number,
+                          word *p_dsp_download_count,
+                          t_dsp_desc *p_dsp_download_table,
+                          t_dsp_portable_desc *p_dsp_portable_download_table);
 /*---------------------------------------------------------------------------*/
-#endif /* DSP_DEFS_H_ */  
+#endif /* DSP_DEFS_H_ */
index a6021e5..fe36f13 100644 (file)
@@ -4,8 +4,8 @@
 #define __DIVA_PRI_HOST_TEST_DSPS_H__
 
 /*
-   DSP registers on maestra pri
-   */
+  DSP registers on maestra pri
+*/
 #define DSP1_PORT       (0x00)
 #define DSP2_PORT       (0x8)
 #define DSP3_PORT       (0x800)
@@ -39,9 +39,9 @@
 #define DSP_ADR_OFFS    0x80
 
 /*------------------------------------------------------------------
-               Dsp related definitions
+  Dsp related definitions
   ------------------------------------------------------------------ */
 #define DSP_SIGNATURE_PROBE_WORD 0x5a5a
-#define dsp_make_address_ex(pm,address) ((word)((pm) ? (address) : (address) + 0x4000))
+#define dsp_make_address_ex(pm, address) ((word)((pm) ? (address) : (address) + 0x4000))
 
 #endif
index ebe131a..957b33c 100644 (file)
@@ -1,26 +1,26 @@
 
 /*
  *
-  Copyright (c) Eicon Networks, 2002.
+ Copyright (c) Eicon Networks, 2002.
  *
-  This source file is supplied for the use with
-  Eicon Networks range of DIVA Server Adapters.
+ This source file is supplied for the use with
+ Eicon Networks range of DIVA Server Adapters.
  *
-  Eicon File Revision :    2.1
+ Eicon File Revision :    2.1
  *
-  This program is free software; you can redistribute it and/or modify
-  it under the terms of the GNU General Public License as published by
-  the Free Software Foundation; either version 2, or (at your option)
-  any later version.
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
  *
-  This program is distributed in the hope that it will be useful,
-  but WITHOUT ANY WARRANTY OF ANY KIND WHATSOEVER INCLUDING ANY
-  implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-  See the GNU General Public License for more details.
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY OF ANY KIND WHATSOEVER INCLUDING ANY
+ implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ See the GNU General Public License for more details.
  *
-  You should have received a copy of the GNU General Public License
-  along with this program; if not, write to the Free Software
-  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  *
  */
 #ifndef DSPDIDS_H_
index 732d22d..f353fb6 100644 (file)
@@ -1,26 +1,26 @@
 
 /*
  *
-  Copyright (c) Eicon Networks, 2002.
+ Copyright (c) Eicon Networks, 2002.
  *
-  This source file is supplied for the use with
-  Eicon Networks range of DIVA Server Adapters.
+ This source file is supplied for the use with
+ Eicon Networks range of DIVA Server Adapters.
  *
-  Eicon File Revision :    2.1
+ Eicon File Revision :    2.1
  *
-  This program is free software; you can redistribute it and/or modify
-  it under the terms of the GNU General Public License as published by
-  the Free Software Foundation; either version 2, or (at your option)
-  any later version.
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
  *
-  This program is distributed in the hope that it will be useful,
-  but WITHOUT ANY WARRANTY OF ANY KIND WHATSOEVER INCLUDING ANY
-  implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-  See the GNU General Public License for more details.
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY OF ANY KIND WHATSOEVER INCLUDING ANY
+ implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ See the GNU General Public License for more details.
  *
-  You should have received a copy of the GNU General Public License
-  along with this program; if not, write to the Free Software
-  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  *
  */
 #ifndef __DIVA_XDI_DSRV_4_BRI_INC__
@@ -35,6 +35,6 @@
 #define PLX9054_SOFT_RESET 0x4000
 #define PLX9054_RELOAD_EEPROM 0x2000
 #define DIVA_4BRI_REVISION(__x__) (((__x__)->cardType == CARDTYPE_DIVASRV_Q_8M_V2_PCI) || ((__x__)->cardType == CARDTYPE_DIVASRV_VOICE_Q_8M_V2_PCI) || ((__x__)->cardType == CARDTYPE_DIVASRV_B_2M_V2_PCI) || ((__x__)->cardType == CARDTYPE_DIVASRV_B_2F_PCI) || ((__x__)->cardType == CARDTYPE_DIVASRV_VOICE_B_2M_V2_PCI))
-void diva_os_set_qBri_functions (PISDN_ADAPTER IoAdapter);
-void diva_os_set_qBri2_functions (PISDN_ADAPTER IoAdapter);
+void diva_os_set_qBri_functions(PISDN_ADAPTER IoAdapter);
+void diva_os_set_qBri2_functions(PISDN_ADAPTER IoAdapter);
 #endif
index f38ebbe..8a67dbc 100644 (file)
@@ -1,37 +1,37 @@
 
 /*
  *
-  Copyright (c) Eicon Networks, 2002.
+ Copyright (c) Eicon Networks, 2002.
  *
-  This source file is supplied for the use with
-  Eicon Networks range of DIVA Server Adapters.
+ This source file is supplied for the use with
+ Eicon Networks range of DIVA Server Adapters.
  *
-  Eicon File Revision :    2.1
+ Eicon File Revision :    2.1
  *
-  This program is free software; you can redistribute it and/or modify
-  it under the terms of the GNU General Public License as published by
-  the Free Software Foundation; either version 2, or (at your option)
-  any later version.
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
  *
-  This program is distributed in the hope that it will be useful,
-  but WITHOUT ANY WARRANTY OF ANY KIND WHATSOEVER INCLUDING ANY
-  implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-  See the GNU General Public License for more details.
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY OF ANY KIND WHATSOEVER INCLUDING ANY
+ implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ See the GNU General Public License for more details.
  *
-  You should have received a copy of the GNU General Public License
-  along with this program; if not, write to the Free Software
-  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  *
  */
 #ifndef __DIVA_XDI_DSRV_BRI_INC__
 #define __DIVA_XDI_DSRV_BRI_INC__
 /*
- Functions exported from os dependent part of
- BRI card configuration and used in
- OS independed part
- */
+  Functions exported from os dependent part of
+  BRI card configuration and used in
+  OS independed part
+*/
 /*
- Prepare OS dependent part of BRI functions
- */
-void diva_os_prepare_maestra_functions (PISDN_ADAPTER IoAdapter);
+  Prepare OS dependent part of BRI functions
+*/
+void diva_os_prepare_maestra_functions(PISDN_ADAPTER IoAdapter);
 #endif
index 8611826..fd1a9ff 100644 (file)
@@ -1,38 +1,38 @@
 
 /*
  *
-  Copyright (c) Eicon Networks, 2002.
+ Copyright (c) Eicon Networks, 2002.
  *
-  This source file is supplied for the use with
-  Eicon Networks range of DIVA Server Adapters.
+ This source file is supplied for the use with
+ Eicon Networks range of DIVA Server Adapters.
  *
-  Eicon File Revision :    2.1
+ Eicon File Revision :    2.1
  *
-  This program is free software; you can redistribute it and/or modify
-  it under the terms of the GNU General Public License as published by
-  the Free Software Foundation; either version 2, or (at your option)
-  any later version.
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
  *
-  This program is distributed in the hope that it will be useful,
-  but WITHOUT ANY WARRANTY OF ANY KIND WHATSOEVER INCLUDING ANY
-  implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-  See the GNU General Public License for more details.
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY OF ANY KIND WHATSOEVER INCLUDING ANY
+ implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ See the GNU General Public License for more details.
  *
-  You should have received a copy of the GNU General Public License
-  along with this program; if not, write to the Free Software
-  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  *
  */
 #ifndef __DIVA_XDI_DSRV_PRI_INC__
 #define __DIVA_XDI_DSRV_PRI_INC__
 /*
- Functions exported from os dependent part of
- PRI card configuration and used in
- OS independed part
- */
+  Functions exported from os dependent part of
+  PRI card configuration and used in
+  OS independed part
+*/
 /*
- Prepare OS dependent part of PRI/PRI Rev.2 functions
- */
-void diva_os_prepare_pri_functions (PISDN_ADAPTER IoAdapter);
-void diva_os_prepare_pri2_functions (PISDN_ADAPTER IoAdapter);
+  Prepare OS dependent part of PRI/PRI Rev.2 functions
+*/
+void diva_os_prepare_pri_functions(PISDN_ADAPTER IoAdapter);
+void diva_os_prepare_pri2_functions(PISDN_ADAPTER IoAdapter);
 #endif
index 16252cf..fdb8341 100644 (file)
 
 typedef struct _divas_um_idi_entity {
        struct list_head          link;
-       diva_um_idi_adapter_t*    adapter; /* Back to adapter */
-       ENTITY                    e;
-       void*                     os_ref;
-       dword                     status;
-       void*                     os_context;
-       int                       rc_count;
+       diva_um_idi_adapter_t *adapter; /* Back to adapter */
+       ENTITY e;
+       void *os_ref;
+       dword status;
+       void *os_context;
+       int rc_count;
        diva_um_idi_data_queue_t  data; /* definad by user 1 ... MAX */
        diva_um_idi_data_queue_t  rc;   /* two entries */
        BUFFERS                   XData;
        BUFFERS                   RData;
-       byte                      buffer[2048+512];
+       byte                      buffer[2048 + 512];
 } divas_um_idi_entity_t;
 
 
index b212311..c9156b0 100644 (file)
@@ -1,51 +1,51 @@
 
 /*
  *
-  Copyright (c) Eicon Networks, 2002.
+ Copyright (c) Eicon Networks, 2002.
  *
-  This source file is supplied for the use with
-  Eicon Networks range of DIVA Server Adapters.
+ This source file is supplied for the use with
+ Eicon Networks range of DIVA Server Adapters.
  *
-  Eicon File Revision :    2.1
+ Eicon File Revision :    2.1
  *
-  This program is free software; you can redistribute it and/or modify
-  it under the terms of the GNU General Public License as published by
-  the Free Software Foundation; either version 2, or (at your option)
-  any later version.
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
  *
-  This program is distributed in the hope that it will be useful,
-  but WITHOUT ANY WARRANTY OF ANY KIND WHATSOEVER INCLUDING ANY
-  implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-  See the GNU General Public License for more details.
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY OF ANY KIND WHATSOEVER INCLUDING ANY
+ implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ See the GNU General Public License for more details.
  *
-  You should have received a copy of the GNU General Public License
-  along with this program; if not, write to the Free Software
-  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  *
  */
 #ifndef __DIVA_XDI_CARD_CONFIG_HELPERS_INC__
 #define __DIVA_XDI_CARD_CONFIG_HELPERS_INC__
-dword diva_get_protocol_file_features  (byte* File,
-                      int offset,
-                      char *IdStringBuffer,
-                      dword IdBufferSize);
-void diva_configure_protocol (PISDN_ADAPTER IoAdapter);
+dword diva_get_protocol_file_features(byte *File,
+                                     int offset,
+                                     char *IdStringBuffer,
+                                     dword IdBufferSize);
+void diva_configure_protocol(PISDN_ADAPTER IoAdapter);
 /*
- Low level file access system abstraction
- */
+  Low level file access system abstraction
+*/
 /* -------------------------------------------------------------------------
-  Access to single file
-  Return pointer to the image of the requested file,
-  write image length to 'FileLength'
-  ------------------------------------------------------------------------- */
-void *xdiLoadFile (char *FileName, dword *FileLength, unsigned long MaxLoadSize) ;
+   Access to single file
+   Return pointer to the image of the requested file,
+   write image length to 'FileLength'
+   ------------------------------------------------------------------------- */
+void *xdiLoadFile(char *FileName, dword *FileLength, unsigned long MaxLoadSize);
 /* -------------------------------------------------------------------------
-  Dependent on the protocol settings does read return pointer
-  to the image of appropriate protocol file
-  ------------------------------------------------------------------------- */
-void *xdiLoadArchive (PISDN_ADAPTER IoAdapter, dword *FileLength, unsigned long MaxLoadSize) ;
+   Dependent on the protocol settings does read return pointer
+   to the image of appropriate protocol file
+   ------------------------------------------------------------------------- */
+void *xdiLoadArchive(PISDN_ADAPTER IoAdapter, dword *FileLength, unsigned long MaxLoadSize);
 /* --------------------------------------------------------------------------
-  Free all system resources accessed by xdiLoadFile and xdiLoadArchive
-  -------------------------------------------------------------------------- */
-void xdiFreeFile (void* handle);
+   Free all system resources accessed by xdiLoadFile and xdiLoadArchive
+   -------------------------------------------------------------------------- */
+void xdiFreeFile(void *handle);
 #endif
index db87d51..d153e3c 100644 (file)
@@ -1,7 +1,7 @@
 /* $Id: idifunc.c,v 1.14.4.4 2004/08/28 20:03:53 armin Exp $
  *
  * Driver for Eicon DIVA Server ISDN cards.
- * User Mode IDI Interface 
+ * User Mode IDI Interface
  *
  * Copyright 2000-2003 by Armin Schindler (mac@melware.de)
  * Copyright 2000-2003 Cytronics & Melware (info@melware.de)
@@ -58,7 +58,7 @@ static diva_os_spin_lock_t ll_lock;
 /*
  * find card in list
  */
-static udiva_card *find_card_in_list(DESCRIPTOR * d)
+static udiva_card *find_card_in_list(DESCRIPTOR *d)
 {
        udiva_card *card;
        struct list_head *tmp;
@@ -80,7 +80,7 @@ static udiva_card *find_card_in_list(DESCRIPTOR * d)
 /*
  * new card
  */
-static void um_new_card(DESCRIPTOR * d)
+static void um_new_card(DESCRIPTOR *d)
 {
        int adapter_nr = 0;
        udiva_card *card = NULL;
@@ -94,10 +94,10 @@ static void um_new_card(DESCRIPTOR * d)
        memcpy(&card->d, d, sizeof(DESCRIPTOR));
        sync_req.xdi_logical_adapter_number.Req = 0;
        sync_req.xdi_logical_adapter_number.Rc =
-           IDI_SYNC_REQ_XDI_GET_LOGICAL_ADAPTER_NUMBER;
-       card->d.request((ENTITY *) & sync_req);
+               IDI_SYNC_REQ_XDI_GET_LOGICAL_ADAPTER_NUMBER;
+       card->d.request((ENTITY *)&sync_req);
        adapter_nr =
-           sync_req.xdi_logical_adapter_number.info.logical_adapter_number;
+               sync_req.xdi_logical_adapter_number.info.logical_adapter_number;
        card->Id = adapter_nr;
        if (!(diva_user_mode_idi_create_adapter(d, adapter_nr))) {
                diva_os_enter_spin_lock(&ll_lock, &old_irql, "add card");
@@ -113,7 +113,7 @@ static void um_new_card(DESCRIPTOR * d)
 /*
  * remove card
  */
-static void um_remove_card(DESCRIPTOR * d)
+static void um_remove_card(DESCRIPTOR *d)
 {
        diva_os_spin_lock_magic_t old_irql;
        udiva_card *card = NULL;
@@ -154,7 +154,7 @@ rescan:
 /*
  * DIDD notify callback
  */
-static void *didd_callback(void *context, DESCRIPTOR * adapter,
+static void *didd_callback(void *context, DESCRIPTOR *adapter,
                           int removal)
 {
        if (adapter->type == IDI_DADAPTER) {
@@ -196,10 +196,10 @@ static int DIVA_INIT_FUNCTION connect_didd(void)
                        memcpy(&DAdapter, &DIDD_Table[x], sizeof(DAdapter));
                        req.didd_notify.e.Req = 0;
                        req.didd_notify.e.Rc =
-                           IDI_SYNC_REQ_DIDD_REGISTER_ADAPTER_NOTIFY;
+                               IDI_SYNC_REQ_DIDD_REGISTER_ADAPTER_NOTIFY;
                        req.didd_notify.info.callback = (void *)didd_callback;
                        req.didd_notify.info.context = NULL;
-                       DAdapter.request((ENTITY *) & req);
+                       DAdapter.request((ENTITY *)&req);
                        if (req.didd_notify.e.Rc != 0xff) {
                                stop_dbg();
                                return (0);
@@ -234,7 +234,7 @@ static void DIVA_EXIT_FUNCTION disconnect_didd(void)
        req.didd_notify.e.Req = 0;
        req.didd_notify.e.Rc = IDI_SYNC_REQ_DIDD_REMOVE_ADAPTER_NOTIFY;
        req.didd_notify.info.handle = notify_handle;
-       DAdapter.request((ENTITY *) & req);
+       DAdapter.request((ENTITY *)&req);
 }
 
 /*
index 6fd9b00..8851ce5 100644 (file)
@@ -1,26 +1,26 @@
 
 /*
  *
-  Copyright (c) Eicon Networks, 2002.
+ Copyright (c) Eicon Networks, 2002.
  *
-  This source file is supplied for the use with
-  Eicon Networks range of DIVA Server Adapters.
+ This source file is supplied for the use with
+ Eicon Networks range of DIVA Server Adapters.
  *
-  Eicon File Revision :    2.1
+ Eicon File Revision :    2.1
  *
-  This program is free software; you can redistribute it and/or modify
-  it under the terms of the GNU General Public License as published by
-  the Free Software Foundation; either version 2, or (at your option)
-  any later version.
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
  *
-  This program is distributed in the hope that it will be useful,
-  but WITHOUT ANY WARRANTY OF ANY KIND WHATSOEVER INCLUDING ANY
-  implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-  See the GNU General Public License for more details.
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY OF ANY KIND WHATSOEVER INCLUDING ANY
+ implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ See the GNU General Public License for more details.
  *
-  You should have received a copy of the GNU General Public License
-  along with this program; if not, write to the Free Software
-  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  *
  */
 #include "platform.h"
 #include "di.h"
 #include "mi_pc.h"
 #include "io.h"
-extern ADAPTER * adapter[MAX_ADAPTER];
+extern ADAPTER *adapter[MAX_ADAPTER];
 extern PISDN_ADAPTER IoAdapters[MAX_ADAPTER];
-void request (PISDN_ADAPTER, ENTITY *);
-static void pcm_req (PISDN_ADAPTER, ENTITY *);
+void request(PISDN_ADAPTER, ENTITY *);
+static void pcm_req(PISDN_ADAPTER, ENTITY *);
 /* --------------------------------------------------------------------------
-  local functions
-  -------------------------------------------------------------------------- */
-#define ReqFunc(N) \
-static void Request##N(ENTITY *e) \
-{ if ( IoAdapters[N] ) (* IoAdapters[N]->DIRequest)(IoAdapters[N], e) ; }
+   local functions
+   -------------------------------------------------------------------------- */
+#define ReqFunc(N)                                                     \
+       static void Request##N(ENTITY *e)                               \
+       { if (IoAdapters[N]) (*IoAdapters[N]->DIRequest)(IoAdapters[N], e); }
 ReqFunc(0)
 ReqFunc(1)
 ReqFunc(2)
@@ -61,792 +61,792 @@ ReqFunc(14)
 ReqFunc(15)
 IDI_CALL Requests[MAX_ADAPTER] =
 { &Request0, &Request1, &Request2, &Request3,
- &Request4, &Request5, &Request6, &Request7,
- &Request8, &Request9, &Request10, &Request11,
- &Request12, &Request13, &Request14, &Request15
+  &Request4, &Request5, &Request6, &Request7,
+  &Request8, &Request9, &Request10, &Request11,
+  &Request12, &Request13, &Request14, &Request15
 };
 /*****************************************************************************/
 /*
   This array should indicate all new services, that this version of XDI
   is able to provide to his clients
-  */
-static byte extended_xdi_features[DIVA_XDI_EXTENDED_FEATURES_MAX_SZ+1] = {
- (DIVA_XDI_EXTENDED_FEATURES_VALID       |
-  DIVA_XDI_EXTENDED_FEATURE_SDRAM_BAR    |
-  DIVA_XDI_EXTENDED_FEATURE_CAPI_PRMS    |
+*/
+static byte extended_xdi_features[DIVA_XDI_EXTENDED_FEATURES_MAX_SZ + 1] = {
+       (DIVA_XDI_EXTENDED_FEATURES_VALID       |
+        DIVA_XDI_EXTENDED_FEATURE_SDRAM_BAR    |
+        DIVA_XDI_EXTENDED_FEATURE_CAPI_PRMS    |
 #if defined(DIVA_IDI_RX_DMA)
-  DIVA_XDI_EXTENDED_FEATURE_CMA          |
-  DIVA_XDI_EXTENDED_FEATURE_RX_DMA       |
-  DIVA_XDI_EXTENDED_FEATURE_MANAGEMENT_DMA |
+        DIVA_XDI_EXTENDED_FEATURE_CMA          |
+        DIVA_XDI_EXTENDED_FEATURE_RX_DMA       |
+        DIVA_XDI_EXTENDED_FEATURE_MANAGEMENT_DMA |
 #endif
-  DIVA_XDI_EXTENDED_FEATURE_NO_CANCEL_RC),
- 0
+        DIVA_XDI_EXTENDED_FEATURE_NO_CANCEL_RC),
+       0
 };
 /*****************************************************************************/
 void
-dump_xlog_buffer (PISDN_ADAPTER IoAdapter, Xdesc *xlogDesc)
-{
- dword   logLen ;
- word *Xlog   = xlogDesc->buf ;
- word  logCnt = xlogDesc->cnt ;
- word  logOut = xlogDesc->out / sizeof(*Xlog) ;
- DBG_FTL(("%s: ************* XLOG recovery (%d) *************",
-          &IoAdapter->Name[0], (int)logCnt))
- DBG_FTL(("Microcode: %s", &IoAdapter->ProtocolIdString[0]))
- for ( ; logCnt > 0 ; --logCnt )
- {
-  if ( !GET_WORD(&Xlog[logOut]) )
-  {
-   if ( --logCnt == 0 )
-    break ;
-   logOut = 0 ;
-  }
-  if ( GET_WORD(&Xlog[logOut]) <= (logOut * sizeof(*Xlog)) )
-  {
-   if ( logCnt > 2 )
-   {
-    DBG_FTL(("Possibly corrupted XLOG: %d entries left",
-             (int)logCnt))
-   }
-   break ;
-  }
-  logLen = (dword)(GET_WORD(&Xlog[logOut]) - (logOut * sizeof(*Xlog))) ;
-  DBG_FTL_MXLOG(( (char *)&Xlog[logOut + 1], (dword)(logLen - 2) ))
-  logOut = (GET_WORD(&Xlog[logOut]) + 1) / sizeof(*Xlog) ;
- }
- DBG_FTL(("%s: ***************** end of XLOG *****************",
-          &IoAdapter->Name[0]))
-}
+dump_xlog_buffer(PISDN_ADAPTER IoAdapter, Xdesc *xlogDesc)
+{
+       dword   logLen;
+       word *Xlog   = xlogDesc->buf;
+       word  logCnt = xlogDesc->cnt;
+       word  logOut = xlogDesc->out / sizeof(*Xlog);
+       DBG_FTL(("%s: ************* XLOG recovery (%d) *************",
+                &IoAdapter->Name[0], (int)logCnt))
+               DBG_FTL(("Microcode: %s", &IoAdapter->ProtocolIdString[0]))
+               for (; logCnt > 0; --logCnt)
+               {
+                       if (!GET_WORD(&Xlog[logOut]))
+                       {
+                               if (--logCnt == 0)
+                                       break;
+                               logOut = 0;
+                       }
+                       if (GET_WORD(&Xlog[logOut]) <= (logOut * sizeof(*Xlog)))
+                       {
+                               if (logCnt > 2)
+                               {
+                                       DBG_FTL(("Possibly corrupted XLOG: %d entries left",
+                                                (int)logCnt))
+                                               }
+                               break;
+                       }
+                       logLen = (dword)(GET_WORD(&Xlog[logOut]) - (logOut * sizeof(*Xlog)));
+                       DBG_FTL_MXLOG(((char *)&Xlog[logOut + 1], (dword)(logLen - 2)))
+                               logOut = (GET_WORD(&Xlog[logOut]) + 1) / sizeof(*Xlog);
+               }
+       DBG_FTL(("%s: ***************** end of XLOG *****************",
+                &IoAdapter->Name[0]))
+               }
 /*****************************************************************************/
 #if defined(XDI_USE_XLOG)
 static char *(ExceptionCauseTable[]) =
 {
- "Interrupt",
- "TLB mod /IBOUND",
- "TLB load /DBOUND",
- "TLB store",
- "Address error load",
- "Address error store",
- "Instruction load bus error",
- "Data load/store bus error",
- "Syscall",
- "Breakpoint",
- "Reverd instruction",
- "Coprocessor unusable",
- "Overflow",
- "TRAP",
- "VCEI",
- "Floating Point Exception",
- "CP2",
- "Reserved 17",
- "Reserved 18",
- "Reserved 19",
- "Reserved 20",
- "Reserved 21",
- "Reserved 22",
- "WATCH",
- "Reserved 24",
- "Reserved 25",
- "Reserved 26",
- "Reserved 27",
- "Reserved 28",
- "Reserved 29",
- "Reserved 30",
- "VCED"
-} ;
+       "Interrupt",
+       "TLB mod /IBOUND",
+       "TLB load /DBOUND",
+       "TLB store",
+       "Address error load",
+       "Address error store",
+       "Instruction load bus error",
+       "Data load/store bus error",
+       "Syscall",
+       "Breakpoint",
+       "Reverd instruction",
+       "Coprocessor unusable",
+       "Overflow",
+       "TRAP",
+       "VCEI",
+       "Floating Point Exception",
+       "CP2",
+       "Reserved 17",
+       "Reserved 18",
+       "Reserved 19",
+       "Reserved 20",
+       "Reserved 21",
+       "Reserved 22",
+       "WATCH",
+       "Reserved 24",
+       "Reserved 25",
+       "Reserved 26",
+       "Reserved 27",
+       "Reserved 28",
+       "Reserved 29",
+       "Reserved 30",
+       "VCED"
+};
 #endif
 void
-dump_trap_frame (PISDN_ADAPTER IoAdapter, byte __iomem *exceptionFrame)
-{
- MP_XCPTC __iomem *xcept = (MP_XCPTC __iomem *)exceptionFrame ;
- dword    __iomem *regs;
- regs  = &xcept->regs[0] ;
- DBG_FTL(("%s: ***************** CPU TRAPPED *****************",
-          &IoAdapter->Name[0]))
- DBG_FTL(("Microcode: %s", &IoAdapter->ProtocolIdString[0]))
- DBG_FTL(("Cause: %s",
-          ExceptionCauseTable[(READ_DWORD(&xcept->cr) & 0x0000007c) >> 2]))
- DBG_FTL(("sr    0x%08x cr    0x%08x epc   0x%08x vaddr 0x%08x",
-          READ_DWORD(&xcept->sr), READ_DWORD(&xcept->cr),
-                                       READ_DWORD(&xcept->epc), READ_DWORD(&xcept->vaddr)))
- DBG_FTL(("zero  0x%08x at    0x%08x v0    0x%08x v1    0x%08x",
-          READ_DWORD(&regs[ 0]), READ_DWORD(&regs[ 1]),
-                                       READ_DWORD(&regs[ 2]), READ_DWORD(&regs[ 3])))
- DBG_FTL(("a0    0x%08x a1    0x%08x a2    0x%08x a3    0x%08x",
-          READ_DWORD(&regs[ 4]), READ_DWORD(&regs[ 5]),
-                                       READ_DWORD(&regs[ 6]), READ_DWORD(&regs[ 7])))
- DBG_FTL(("t0    0x%08x t1    0x%08x t2    0x%08x t3    0x%08x",
-          READ_DWORD(&regs[ 8]), READ_DWORD(&regs[ 9]),
-                                       READ_DWORD(&regs[10]), READ_DWORD(&regs[11])))
- DBG_FTL(("t4    0x%08x t5    0x%08x t6    0x%08x t7    0x%08x",
-          READ_DWORD(&regs[12]), READ_DWORD(&regs[13]),
-                                       READ_DWORD(&regs[14]), READ_DWORD(&regs[15])))
- DBG_FTL(("s0    0x%08x s1    0x%08x s2    0x%08x s3    0x%08x",
-          READ_DWORD(&regs[16]), READ_DWORD(&regs[17]),
-                                       READ_DWORD(&regs[18]), READ_DWORD(&regs[19])))
- DBG_FTL(("s4    0x%08x s5    0x%08x s6    0x%08x s7    0x%08x",
-          READ_DWORD(&regs[20]), READ_DWORD(&regs[21]),
-                                       READ_DWORD(&regs[22]), READ_DWORD(&regs[23])))
- DBG_FTL(("t8    0x%08x t9    0x%08x k0    0x%08x k1    0x%08x",
-          READ_DWORD(&regs[24]), READ_DWORD(&regs[25]),
-                                       READ_DWORD(&regs[26]), READ_DWORD(&regs[27])))
- DBG_FTL(("gp    0x%08x sp    0x%08x s8    0x%08x ra    0x%08x",
-          READ_DWORD(&regs[28]), READ_DWORD(&regs[29]),
-                                       READ_DWORD(&regs[30]), READ_DWORD(&regs[31])))
- DBG_FTL(("md    0x%08x|%08x         resvd 0x%08x class 0x%08x",
-          READ_DWORD(&xcept->mdhi), READ_DWORD(&xcept->mdlo),
-                                       READ_DWORD(&xcept->reseverd), READ_DWORD(&xcept->xclass)))
-}
+dump_trap_frame(PISDN_ADAPTER IoAdapter, byte __iomem *exceptionFrame)
+{
+       MP_XCPTC __iomem *xcept = (MP_XCPTC __iomem *)exceptionFrame;
+       dword    __iomem *regs;
+       regs  = &xcept->regs[0];
+       DBG_FTL(("%s: ***************** CPU TRAPPED *****************",
+                &IoAdapter->Name[0]))
+               DBG_FTL(("Microcode: %s", &IoAdapter->ProtocolIdString[0]))
+               DBG_FTL(("Cause: %s",
+                        ExceptionCauseTable[(READ_DWORD(&xcept->cr) & 0x0000007c) >> 2]))
+               DBG_FTL(("sr    0x%08x cr    0x%08x epc   0x%08x vaddr 0x%08x",
+                        READ_DWORD(&xcept->sr), READ_DWORD(&xcept->cr),
+                        READ_DWORD(&xcept->epc), READ_DWORD(&xcept->vaddr)))
+               DBG_FTL(("zero  0x%08x at    0x%08x v0    0x%08x v1    0x%08x",
+                        READ_DWORD(&regs[0]), READ_DWORD(&regs[1]),
+                        READ_DWORD(&regs[2]), READ_DWORD(&regs[3])))
+               DBG_FTL(("a0    0x%08x a1    0x%08x a2    0x%08x a3    0x%08x",
+                        READ_DWORD(&regs[4]), READ_DWORD(&regs[5]),
+                        READ_DWORD(&regs[6]), READ_DWORD(&regs[7])))
+               DBG_FTL(("t0    0x%08x t1    0x%08x t2    0x%08x t3    0x%08x",
+                        READ_DWORD(&regs[8]), READ_DWORD(&regs[9]),
+                        READ_DWORD(&regs[10]), READ_DWORD(&regs[11])))
+               DBG_FTL(("t4    0x%08x t5    0x%08x t6    0x%08x t7    0x%08x",
+                        READ_DWORD(&regs[12]), READ_DWORD(&regs[13]),
+                        READ_DWORD(&regs[14]), READ_DWORD(&regs[15])))
+               DBG_FTL(("s0    0x%08x s1    0x%08x s2    0x%08x s3    0x%08x",
+                        READ_DWORD(&regs[16]), READ_DWORD(&regs[17]),
+                        READ_DWORD(&regs[18]), READ_DWORD(&regs[19])))
+               DBG_FTL(("s4    0x%08x s5    0x%08x s6    0x%08x s7    0x%08x",
+                        READ_DWORD(&regs[20]), READ_DWORD(&regs[21]),
+                        READ_DWORD(&regs[22]), READ_DWORD(&regs[23])))
+               DBG_FTL(("t8    0x%08x t9    0x%08x k0    0x%08x k1    0x%08x",
+                        READ_DWORD(&regs[24]), READ_DWORD(&regs[25]),
+                        READ_DWORD(&regs[26]), READ_DWORD(&regs[27])))
+               DBG_FTL(("gp    0x%08x sp    0x%08x s8    0x%08x ra    0x%08x",
+                        READ_DWORD(&regs[28]), READ_DWORD(&regs[29]),
+                        READ_DWORD(&regs[30]), READ_DWORD(&regs[31])))
+               DBG_FTL(("md    0x%08x|%08x         resvd 0x%08x class 0x%08x",
+                        READ_DWORD(&xcept->mdhi), READ_DWORD(&xcept->mdlo),
+                        READ_DWORD(&xcept->reseverd), READ_DWORD(&xcept->xclass)))
+               }
 /* --------------------------------------------------------------------------
-  Real XDI Request function
-  -------------------------------------------------------------------------- */
-void request(PISDN_ADAPTER IoAdapter, ENTITY * e)
+   Real XDI Request function
+   -------------------------------------------------------------------------- */
+void request(PISDN_ADAPTER IoAdapter, ENTITY *e)
 {
- byte i;
- diva_os_spin_lock_magic_t irql;
+       byte i;
+       diva_os_spin_lock_magic_t irql;
 /*
  * if the Req field in the entity structure is 0,
  * we treat this request as a special function call
  */
- if ( !e->Req )
- {
-  IDI_SYNC_REQ *syncReq = (IDI_SYNC_REQ *)e ;
-  switch (e->Rc)
-  {
+       if (!e->Req)
+       {
+               IDI_SYNC_REQ *syncReq = (IDI_SYNC_REQ *)e;
+               switch (e->Rc)
+               {
 #if defined(DIVA_IDI_RX_DMA)
-    case IDI_SYNC_REQ_DMA_DESCRIPTOR_OPERATION: {
-      diva_xdi_dma_descriptor_operation_t* pI = \
-                                   &syncReq->xdi_dma_descriptor_operation.info;
-      if (!IoAdapter->dma_map) {
-        pI->operation         = -1;
-        pI->descriptor_number = -1;
-        return;
-      }
-      diva_os_enter_spin_lock (&IoAdapter->data_spin_lock, &irql, "dma_op");
-      if (pI->operation == IDI_SYNC_REQ_DMA_DESCRIPTOR_ALLOC) {
-        pI->descriptor_number = diva_alloc_dma_map_entry (\
-                               (struct _diva_dma_map_entry*)IoAdapter->dma_map);
-        if (pI->descriptor_number >= 0) {
-          dword dma_magic;
-          void* local_addr;
-          diva_get_dma_map_entry (\
-                               (struct _diva_dma_map_entry*)IoAdapter->dma_map,
-                               pI->descriptor_number,
-                               &local_addr, &dma_magic);
-          pI->descriptor_address  = local_addr;
-          pI->descriptor_magic    = dma_magic;
-          pI->operation           = 0;
-        } else {
-          pI->operation           = -1;
-        }
-      } else if ((pI->operation == IDI_SYNC_REQ_DMA_DESCRIPTOR_FREE) &&
-                 (pI->descriptor_number >= 0)) {
-        diva_free_dma_map_entry((struct _diva_dma_map_entry*)IoAdapter->dma_map,
-                                pI->descriptor_number);
-        pI->descriptor_number = -1;
-        pI->operation         = 0;
-      } else {
-        pI->descriptor_number = -1;
-        pI->operation         = -1;
-      }
-      diva_os_leave_spin_lock (&IoAdapter->data_spin_lock, &irql, "dma_op");
-    } return;
+               case IDI_SYNC_REQ_DMA_DESCRIPTOR_OPERATION: {
+                       diva_xdi_dma_descriptor_operation_t *pI = \
+                               &syncReq->xdi_dma_descriptor_operation.info;
+                       if (!IoAdapter->dma_map) {
+                               pI->operation         = -1;
+                               pI->descriptor_number = -1;
+                               return;
+                       }
+                       diva_os_enter_spin_lock(&IoAdapter->data_spin_lock, &irql, "dma_op");
+                       if (pI->operation == IDI_SYNC_REQ_DMA_DESCRIPTOR_ALLOC) {
+                               pI->descriptor_number = diva_alloc_dma_map_entry(\
+                                       (struct _diva_dma_map_entry *)IoAdapter->dma_map);
+                               if (pI->descriptor_number >= 0) {
+                                       dword dma_magic;
+                                       void *local_addr;
+                                       diva_get_dma_map_entry(\
+                                               (struct _diva_dma_map_entry *)IoAdapter->dma_map,
+                                               pI->descriptor_number,
+                                               &local_addr, &dma_magic);
+                                       pI->descriptor_address  = local_addr;
+                                       pI->descriptor_magic    = dma_magic;
+                                       pI->operation           = 0;
+                               } else {
+                                       pI->operation           = -1;
+                               }
+                       } else if ((pI->operation == IDI_SYNC_REQ_DMA_DESCRIPTOR_FREE) &&
+                                  (pI->descriptor_number >= 0)) {
+                               diva_free_dma_map_entry((struct _diva_dma_map_entry *)IoAdapter->dma_map,
+                                                       pI->descriptor_number);
+                               pI->descriptor_number = -1;
+                               pI->operation         = 0;
+                       } else {
+                               pI->descriptor_number = -1;
+                               pI->operation         = -1;
+                       }
+                       diva_os_leave_spin_lock(&IoAdapter->data_spin_lock, &irql, "dma_op");
+               } return;
 #endif
-    case IDI_SYNC_REQ_XDI_GET_LOGICAL_ADAPTER_NUMBER: {
-      diva_xdi_get_logical_adapter_number_s_t *pI = \
-                                     &syncReq->xdi_logical_adapter_number.info;
-      pI->logical_adapter_number = IoAdapter->ANum;
-      pI->controller = IoAdapter->ControllerNumber;
-      pI->total_controllers = IoAdapter->Properties.Adapters;
-    } return;
-    case IDI_SYNC_REQ_XDI_GET_CAPI_PARAMS: {
-       diva_xdi_get_capi_parameters_t prms, *pI = &syncReq->xdi_capi_prms.info;
-       memset (&prms, 0x00, sizeof(prms));
-       prms.structure_length = min_t(size_t, sizeof(prms), pI->structure_length);
-       memset (pI, 0x00, pI->structure_length);
-       prms.flag_dynamic_l1_down    = (IoAdapter->capi_cfg.cfg_1 & \
-         DIVA_XDI_CAPI_CFG_1_DYNAMIC_L1_ON) ? 1 : 0;
-       prms.group_optimization_enabled = (IoAdapter->capi_cfg.cfg_1 & \
-         DIVA_XDI_CAPI_CFG_1_GROUP_POPTIMIZATION_ON) ? 1 : 0;
-       memcpy (pI, &prms, prms.structure_length);
-      } return;
-    case IDI_SYNC_REQ_XDI_GET_ADAPTER_SDRAM_BAR:
-      syncReq->xdi_sdram_bar.info.bar = IoAdapter->sdram_bar;
-      return;
-    case IDI_SYNC_REQ_XDI_GET_EXTENDED_FEATURES: {
-      dword i;
-      diva_xdi_get_extended_xdi_features_t* pI =\
-                                 &syncReq->xdi_extended_features.info;
-      pI->buffer_length_in_bytes &= ~0x80000000;
-      if (pI->buffer_length_in_bytes && pI->features) {
-        memset (pI->features, 0x00, pI->buffer_length_in_bytes);
-      }
-      for (i = 0; ((pI->features) && (i < pI->buffer_length_in_bytes) &&
-                   (i < DIVA_XDI_EXTENDED_FEATURES_MAX_SZ)); i++) {
-        pI->features[i] = extended_xdi_features[i];
-      }
-      if ((pI->buffer_length_in_bytes < DIVA_XDI_EXTENDED_FEATURES_MAX_SZ) ||
-          (!pI->features)) {
-        pI->buffer_length_in_bytes =\
-                           (0x80000000 | DIVA_XDI_EXTENDED_FEATURES_MAX_SZ);
-      }
-     } return;
-    case IDI_SYNC_REQ_XDI_GET_STREAM:
-      if (IoAdapter) {
-        diva_xdi_provide_istream_info (&IoAdapter->a,
-                                       &syncReq->xdi_stream_info.info);
-      } else {
-        syncReq->xdi_stream_info.info.provided_service = 0;
-      }
-      return;
-  case IDI_SYNC_REQ_GET_NAME:
-   if ( IoAdapter )
-   {
-    strcpy (&syncReq->GetName.name[0], IoAdapter->Name) ;
-    DBG_TRC(("xdi: Adapter %d / Name '%s'",
-             IoAdapter->ANum, IoAdapter->Name))
-    return ;
-   }
-   syncReq->GetName.name[0] = '\0' ;
-   break ;
-  case IDI_SYNC_REQ_GET_SERIAL:
-   if ( IoAdapter )
-   {
-    syncReq->GetSerial.serial = IoAdapter->serialNo ;
-    DBG_TRC(("xdi: Adapter %d / SerialNo %ld",
-             IoAdapter->ANum, IoAdapter->serialNo))
-    return ;
-   }
-   syncReq->GetSerial.serial = 0 ;
-   break ;
-  case IDI_SYNC_REQ_GET_CARDTYPE:
-   if ( IoAdapter )
-   {
-    syncReq->GetCardType.cardtype = IoAdapter->cardType ;
-    DBG_TRC(("xdi: Adapter %d / CardType %ld",
-             IoAdapter->ANum, IoAdapter->cardType))
-    return ;
-   }
-   syncReq->GetCardType.cardtype = 0 ;
-   break ;
-  case IDI_SYNC_REQ_GET_XLOG:
-   if ( IoAdapter )
-   {
-    pcm_req (IoAdapter, e) ;
-    return ;
-   }
-   e->Ind = 0 ;
-   break ;
-  case IDI_SYNC_REQ_GET_DBG_XLOG:
-   if ( IoAdapter )
-   {
-    pcm_req (IoAdapter, e) ;
-    return ;
-   }
-   e->Ind = 0 ;
-   break ;
-  case IDI_SYNC_REQ_GET_FEATURES:
-   if ( IoAdapter )
-   {
-    syncReq->GetFeatures.features =
-      (unsigned short)IoAdapter->features ;
-    return ;
-   }
-   syncReq->GetFeatures.features = 0 ;
-   break ;
-        case IDI_SYNC_REQ_PORTDRV_HOOK:
-            if ( IoAdapter )
-            {
-                DBG_TRC(("Xdi:IDI_SYNC_REQ_PORTDRV_HOOK - ignored"))
-                return ;
-            }
-            break;
-  }
-  if ( IoAdapter )
-  {
-   return ;
-  }
- }
- DBG_TRC(("xdi: Id 0x%x / Req 0x%x / Rc 0x%x", e->Id, e->Req, e->Rc))
- if ( !IoAdapter )
- {
-  DBG_FTL(("xdi: uninitialized Adapter used - ignore request"))
-  return ;
- }
- diva_os_enter_spin_lock (&IoAdapter->data_spin_lock, &irql, "data_req");
+               case IDI_SYNC_REQ_XDI_GET_LOGICAL_ADAPTER_NUMBER: {
+                       diva_xdi_get_logical_adapter_number_s_t *pI = \
+                               &syncReq->xdi_logical_adapter_number.info;
+                       pI->logical_adapter_number = IoAdapter->ANum;
+                       pI->controller = IoAdapter->ControllerNumber;
+                       pI->total_controllers = IoAdapter->Properties.Adapters;
+               } return;
+               case IDI_SYNC_REQ_XDI_GET_CAPI_PARAMS: {
+                       diva_xdi_get_capi_parameters_t prms, *pI = &syncReq->xdi_capi_prms.info;
+                       memset(&prms, 0x00, sizeof(prms));
+                       prms.structure_length = min_t(size_t, sizeof(prms), pI->structure_length);
+                       memset(pI, 0x00, pI->structure_length);
+                       prms.flag_dynamic_l1_down    = (IoAdapter->capi_cfg.cfg_1 & \
+                                                       DIVA_XDI_CAPI_CFG_1_DYNAMIC_L1_ON) ? 1 : 0;
+                       prms.group_optimization_enabled = (IoAdapter->capi_cfg.cfg_1 & \
+                                                          DIVA_XDI_CAPI_CFG_1_GROUP_POPTIMIZATION_ON) ? 1 : 0;
+                       memcpy(pI, &prms, prms.structure_length);
+               } return;
+               case IDI_SYNC_REQ_XDI_GET_ADAPTER_SDRAM_BAR:
+                       syncReq->xdi_sdram_bar.info.bar = IoAdapter->sdram_bar;
+                       return;
+               case IDI_SYNC_REQ_XDI_GET_EXTENDED_FEATURES: {
+                       dword i;
+                       diva_xdi_get_extended_xdi_features_t *pI =\
+                               &syncReq->xdi_extended_features.info;
+                       pI->buffer_length_in_bytes &= ~0x80000000;
+                       if (pI->buffer_length_in_bytes && pI->features) {
+                               memset(pI->features, 0x00, pI->buffer_length_in_bytes);
+                       }
+                       for (i = 0; ((pI->features) && (i < pI->buffer_length_in_bytes) &&
+                                    (i < DIVA_XDI_EXTENDED_FEATURES_MAX_SZ)); i++) {
+                               pI->features[i] = extended_xdi_features[i];
+                       }
+                       if ((pI->buffer_length_in_bytes < DIVA_XDI_EXTENDED_FEATURES_MAX_SZ) ||
+                           (!pI->features)) {
+                               pI->buffer_length_in_bytes =\
+                                       (0x80000000 | DIVA_XDI_EXTENDED_FEATURES_MAX_SZ);
+                       }
+               } return;
+               case IDI_SYNC_REQ_XDI_GET_STREAM:
+                       if (IoAdapter) {
+                               diva_xdi_provide_istream_info(&IoAdapter->a,
+                                                             &syncReq->xdi_stream_info.info);
+                       } else {
+                               syncReq->xdi_stream_info.info.provided_service = 0;
+                       }
+                       return;
+               case IDI_SYNC_REQ_GET_NAME:
+                       if (IoAdapter)
+                       {
+                               strcpy(&syncReq->GetName.name[0], IoAdapter->Name);
+                               DBG_TRC(("xdi: Adapter %d / Name '%s'",
+                                        IoAdapter->ANum, IoAdapter->Name))
+                                       return;
+                       }
+                       syncReq->GetName.name[0] = '\0';
+                       break;
+               case IDI_SYNC_REQ_GET_SERIAL:
+                       if (IoAdapter)
+                       {
+                               syncReq->GetSerial.serial = IoAdapter->serialNo;
+                               DBG_TRC(("xdi: Adapter %d / SerialNo %ld",
+                                        IoAdapter->ANum, IoAdapter->serialNo))
+                                       return;
+                       }
+                       syncReq->GetSerial.serial = 0;
+                       break;
+               case IDI_SYNC_REQ_GET_CARDTYPE:
+                       if (IoAdapter)
+                       {
+                               syncReq->GetCardType.cardtype = IoAdapter->cardType;
+                               DBG_TRC(("xdi: Adapter %d / CardType %ld",
+                                        IoAdapter->ANum, IoAdapter->cardType))
+                                       return;
+                       }
+                       syncReq->GetCardType.cardtype = 0;
+                       break;
+               case IDI_SYNC_REQ_GET_XLOG:
+                       if (IoAdapter)
+                       {
+                               pcm_req(IoAdapter, e);
+                               return;
+                       }
+                       e->Ind = 0;
+                       break;
+               case IDI_SYNC_REQ_GET_DBG_XLOG:
+                       if (IoAdapter)
+                       {
+                               pcm_req(IoAdapter, e);
+                               return;
+                       }
+                       e->Ind = 0;
+                       break;
+               case IDI_SYNC_REQ_GET_FEATURES:
+                       if (IoAdapter)
+                       {
+                               syncReq->GetFeatures.features =
+                                       (unsigned short)IoAdapter->features;
+                               return;
+                       }
+                       syncReq->GetFeatures.features = 0;
+                       break;
+               case IDI_SYNC_REQ_PORTDRV_HOOK:
+                       if (IoAdapter)
+                       {
+                               DBG_TRC(("Xdi:IDI_SYNC_REQ_PORTDRV_HOOK - ignored"))
+                                       return;
+                       }
+                       break;
+               }
+               if (IoAdapter)
+               {
+                       return;
+               }
+       }
+       DBG_TRC(("xdi: Id 0x%x / Req 0x%x / Rc 0x%x", e->Id, e->Req, e->Rc))
+               if (!IoAdapter)
+               {
+                       DBG_FTL(("xdi: uninitialized Adapter used - ignore request"))
+                               return;
+               }
+       diva_os_enter_spin_lock(&IoAdapter->data_spin_lock, &irql, "data_req");
 /*
  * assign an entity
  */
- if ( !(e->Id &0x1f) )
- {
-  if ( IoAdapter->e_count >= IoAdapter->e_max )
-  {
-   DBG_FTL(("xdi: all Ids in use (max=%d) --> Req ignored",
-            IoAdapter->e_max))
-   diva_os_leave_spin_lock (&IoAdapter->data_spin_lock, &irql, "data_req");
-   return ;
-  }
+       if (!(e->Id & 0x1f))
+       {
+               if (IoAdapter->e_count >= IoAdapter->e_max)
+               {
+                       DBG_FTL(("xdi: all Ids in use (max=%d) --> Req ignored",
+                                IoAdapter->e_max))
+                               diva_os_leave_spin_lock(&IoAdapter->data_spin_lock, &irql, "data_req");
+                       return;
+               }
 /*
  * find a new free id
  */
-  for ( i = 1 ; IoAdapter->e_tbl[i].e ; ++i ) ;
-  IoAdapter->e_tbl[i].e = e ;
-  IoAdapter->e_count++ ;
-  e->No = (byte)i ;
-  e->More = 0 ;
-  e->RCurrent = 0xff ;
- }
- else
- {
-  i = e->No ;
- }
+               for (i = 1; IoAdapter->e_tbl[i].e; ++i);
+               IoAdapter->e_tbl[i].e = e;
+               IoAdapter->e_count++;
+               e->No = (byte)i;
+               e->More = 0;
+               e->RCurrent = 0xff;
+       }
+       else
+       {
+               i = e->No;
+       }
 /*
  * if the entity is still busy, ignore the request call
  */
- if ( e->More & XBUSY )
- {
-  DBG_FTL(("xdi: Id 0x%x busy --> Req 0x%x ignored", e->Id, e->Req))
-  if ( !IoAdapter->trapped && IoAdapter->trapFnc )
-  {
-   IoAdapter->trapFnc (IoAdapter) ;
-      /*
-        Firs trap, also notify user if supported
-       */
-      if (IoAdapter->trapped && IoAdapter->os_trap_nfy_Fnc) {
-        (*(IoAdapter->os_trap_nfy_Fnc))(IoAdapter, IoAdapter->ANum);
-      }
-  }
-  diva_os_leave_spin_lock (&IoAdapter->data_spin_lock, &irql, "data_req");
-  return ;
- }
+       if (e->More & XBUSY)
+       {
+               DBG_FTL(("xdi: Id 0x%x busy --> Req 0x%x ignored", e->Id, e->Req))
+                       if (!IoAdapter->trapped && IoAdapter->trapFnc)
+                       {
+                               IoAdapter->trapFnc(IoAdapter);
+                               /*
+                                 Firs trap, also notify user if supported
+                               */
+                               if (IoAdapter->trapped && IoAdapter->os_trap_nfy_Fnc) {
+                                       (*(IoAdapter->os_trap_nfy_Fnc))(IoAdapter, IoAdapter->ANum);
+                               }
+                       }
+               diva_os_leave_spin_lock(&IoAdapter->data_spin_lock, &irql, "data_req");
+               return;
+       }
 /*
  * initialize transmit status variables
  */
- e->More |= XBUSY ;
- e->More &= ~XMOREF ;
- e->XCurrent = 0 ;
- e->XOffset = 0 ;
+       e->More |= XBUSY;
+       e->More &= ~XMOREF;
+       e->XCurrent = 0;
+       e->XOffset = 0;
 /*
  * queue this entity in the adapter request queue
  */
- IoAdapter->e_tbl[i].next = 0 ;
- if ( IoAdapter->head )
- {
-  IoAdapter->e_tbl[IoAdapter->tail].next = i ;
-  IoAdapter->tail = i ;
- }
- else
- {
-  IoAdapter->head = i ;
-  IoAdapter->tail = i ;
- }
+       IoAdapter->e_tbl[i].next = 0;
+       if (IoAdapter->head)
+       {
+               IoAdapter->e_tbl[IoAdapter->tail].next = i;
+               IoAdapter->tail = i;
+       }
+       else
+       {
+               IoAdapter->head = i;
+               IoAdapter->tail = i;
+       }
 /*
  * queue the DPC to process the request
  */
- diva_os_schedule_soft_isr (&IoAdapter->req_soft_isr);
- diva_os_leave_spin_lock (&IoAdapter->data_spin_lock, &irql, "data_req");
+       diva_os_schedule_soft_isr(&IoAdapter->req_soft_isr);
+       diva_os_leave_spin_lock(&IoAdapter->data_spin_lock, &irql, "data_req");
 }
 /* ---------------------------------------------------------------------
-  Main DPC routine
+   Main DPC routine
    --------------------------------------------------------------------- */
-void DIDpcRoutine (struct _diva_os_soft_isr* psoft_isr, void* Context) {
- PISDN_ADAPTER IoAdapter  = (PISDN_ADAPTER)Context ;
- ADAPTER* a        = &IoAdapter->a ;
- diva_os_atomic_t* pin_dpc = &IoAdapter->in_dpc;
- if (diva_os_atomic_increment (pin_dpc) == 1) {
-  do {
-   if ( IoAdapter->tst_irq (a) )
-   {
-    if ( !IoAdapter->Unavailable )
-     IoAdapter->dpc (a) ;
-    IoAdapter->clr_irq (a) ;
-   }
-   IoAdapter->out (a) ;
-  } while (diva_os_atomic_decrement (pin_dpc) > 0);
-  /* ----------------------------------------------------------------
-    Look for XLOG request (cards with indirect addressing)
-    ---------------------------------------------------------------- */
-  if (IoAdapter->pcm_pending) {
-   struct pc_maint *pcm;
-   diva_os_spin_lock_magic_t OldIrql ;
-   diva_os_enter_spin_lock (&IoAdapter->data_spin_lock,
-                &OldIrql,
-                "data_dpc");
-   pcm = (struct pc_maint *)IoAdapter->pcm_data;
-   switch (IoAdapter->pcm_pending) {
-    case 1: /* ask card for XLOG */
-     a->ram_out (a, &IoAdapter->pcm->rc, 0) ;
-     a->ram_out (a, &IoAdapter->pcm->req, pcm->req) ;
-     IoAdapter->pcm_pending = 2;
-     break;
-    case 2: /* Try to get XLOG from the card */
-     if ((int)(a->ram_in (a, &IoAdapter->pcm->rc))) {
-      a->ram_in_buffer (a, IoAdapter->pcm, pcm, sizeof(*pcm)) ;
-      IoAdapter->pcm_pending = 3;
-     }
-     break;
-    case 3: /* let XDI recovery XLOG */
-     break;
-   }
-   diva_os_leave_spin_lock (&IoAdapter->data_spin_lock,
-                &OldIrql,
-                "data_dpc");
-  }
-  /* ---------------------------------------------------------------- */
- }
+void DIDpcRoutine(struct _diva_os_soft_isr *psoft_isr, void *Context) {
+       PISDN_ADAPTER IoAdapter = (PISDN_ADAPTER)Context;
+       ADAPTER *a = &IoAdapter->a;
+       diva_os_atomic_t *pin_dpc = &IoAdapter->in_dpc;
+       if (diva_os_atomic_increment(pin_dpc) == 1) {
+               do {
+                       if (IoAdapter->tst_irq(a))
+                       {
+                               if (!IoAdapter->Unavailable)
+                                       IoAdapter->dpc(a);
+                               IoAdapter->clr_irq(a);
+                       }
+                       IoAdapter->out(a);
+               } while (diva_os_atomic_decrement(pin_dpc) > 0);
+               /* ----------------------------------------------------------------
+                  Look for XLOG request (cards with indirect addressing)
+                  ---------------------------------------------------------------- */
+               if (IoAdapter->pcm_pending) {
+                       struct pc_maint *pcm;
+                       diva_os_spin_lock_magic_t OldIrql;
+                       diva_os_enter_spin_lock(&IoAdapter->data_spin_lock,
+                                               &OldIrql,
+                                               "data_dpc");
+                       pcm = (struct pc_maint *)IoAdapter->pcm_data;
+                       switch (IoAdapter->pcm_pending) {
+                       case 1: /* ask card for XLOG */
+                               a->ram_out(a, &IoAdapter->pcm->rc, 0);
+                               a->ram_out(a, &IoAdapter->pcm->req, pcm->req);
+                               IoAdapter->pcm_pending = 2;
+                               break;
+                       case 2: /* Try to get XLOG from the card */
+                               if ((int)(a->ram_in(a, &IoAdapter->pcm->rc))) {
+                                       a->ram_in_buffer(a, IoAdapter->pcm, pcm, sizeof(*pcm));
+                                       IoAdapter->pcm_pending = 3;
+                               }
+                               break;
+                       case 3: /* let XDI recovery XLOG */
+                               break;
+                       }
+                       diva_os_leave_spin_lock(&IoAdapter->data_spin_lock,
+                                               &OldIrql,
+                                               "data_dpc");
+               }
+               /* ---------------------------------------------------------------- */
+       }
 }
 /* --------------------------------------------------------------------------
-  XLOG interface
-  -------------------------------------------------------------------------- */
+   XLOG interface
+   -------------------------------------------------------------------------- */
 static void
-pcm_req (PISDN_ADAPTER IoAdapter, ENTITY *e)
+pcm_req(PISDN_ADAPTER IoAdapter, ENTITY *e)
 {
- diva_os_spin_lock_magic_t OldIrql ;
- int              i, rc ;
- ADAPTER         *a = &IoAdapter->a ;
- struct pc_maint *pcm = (struct pc_maint *)&e->Ind ;
+       diva_os_spin_lock_magic_t OldIrql;
+       int              i, rc;
+       ADAPTER         *a = &IoAdapter->a;
+       struct pc_maint *pcm = (struct pc_maint *)&e->Ind;
 /*
  * special handling of I/O based card interface
  * the memory access isn't an atomic operation !
  */
- if ( IoAdapter->Properties.Card == CARD_MAE )
- {
-  diva_os_enter_spin_lock (&IoAdapter->data_spin_lock,
-               &OldIrql,
-               "data_pcm_1");
-  IoAdapter->pcm_data = (void *)pcm;
-  IoAdapter->pcm_pending = 1;
-  diva_os_schedule_soft_isr (&IoAdapter->req_soft_isr);
-  diva_os_leave_spin_lock (&IoAdapter->data_spin_lock,
-               &OldIrql,
-               "data_pcm_1");
-  for ( rc = 0, i = (IoAdapter->trapped ? 3000 : 250) ; !rc && (i > 0) ; --i )
-  {
-   diva_os_sleep (1) ;
-   if (IoAdapter->pcm_pending == 3) {
-    diva_os_enter_spin_lock (&IoAdapter->data_spin_lock,
-                 &OldIrql,
-                 "data_pcm_3");
-    IoAdapter->pcm_pending = 0;
-    IoAdapter->pcm_data    = NULL ;
-    diva_os_leave_spin_lock (&IoAdapter->data_spin_lock,
-                 &OldIrql,
-                 "data_pcm_3");
-    return ;
-   }
-   diva_os_enter_spin_lock (&IoAdapter->data_spin_lock,
-                &OldIrql,
-                "data_pcm_2");
-   diva_os_schedule_soft_isr (&IoAdapter->req_soft_isr);
-   diva_os_leave_spin_lock (&IoAdapter->data_spin_lock,
-                &OldIrql,
-                "data_pcm_2");
-  }
-  diva_os_enter_spin_lock (&IoAdapter->data_spin_lock,
-               &OldIrql,
-               "data_pcm_4");
-  IoAdapter->pcm_pending = 0;
-  IoAdapter->pcm_data    = NULL ;
-  diva_os_leave_spin_lock (&IoAdapter->data_spin_lock,
-               &OldIrql,
-               "data_pcm_4");
-  goto Trapped ;
- }
+       if (IoAdapter->Properties.Card == CARD_MAE)
+       {
+               diva_os_enter_spin_lock(&IoAdapter->data_spin_lock,
+                                       &OldIrql,
+                                       "data_pcm_1");
+               IoAdapter->pcm_data = (void *)pcm;
+               IoAdapter->pcm_pending = 1;
+               diva_os_schedule_soft_isr(&IoAdapter->req_soft_isr);
+               diva_os_leave_spin_lock(&IoAdapter->data_spin_lock,
+                                       &OldIrql,
+                                       "data_pcm_1");
+               for (rc = 0, i = (IoAdapter->trapped ? 3000 : 250); !rc && (i > 0); --i)
+               {
+                       diva_os_sleep(1);
+                       if (IoAdapter->pcm_pending == 3) {
+                               diva_os_enter_spin_lock(&IoAdapter->data_spin_lock,
+                                                       &OldIrql,
+                                                       "data_pcm_3");
+                               IoAdapter->pcm_pending = 0;
+                               IoAdapter->pcm_data    = NULL;
+                               diva_os_leave_spin_lock(&IoAdapter->data_spin_lock,
+                                                       &OldIrql,
+                                                       "data_pcm_3");
+                               return;
+                       }
+                       diva_os_enter_spin_lock(&IoAdapter->data_spin_lock,
+                                               &OldIrql,
+                                               "data_pcm_2");
+                       diva_os_schedule_soft_isr(&IoAdapter->req_soft_isr);
+                       diva_os_leave_spin_lock(&IoAdapter->data_spin_lock,
+                                               &OldIrql,
+                                               "data_pcm_2");
+               }
+               diva_os_enter_spin_lock(&IoAdapter->data_spin_lock,
+                                       &OldIrql,
+                                       "data_pcm_4");
+               IoAdapter->pcm_pending = 0;
+               IoAdapter->pcm_data    = NULL;
+               diva_os_leave_spin_lock(&IoAdapter->data_spin_lock,
+                                       &OldIrql,
+                                       "data_pcm_4");
+               goto Trapped;
+       }
 /*
  * memory based shared ram is accessible from different
  * processors without disturbing concurrent processes.
  */
- a->ram_out (a, &IoAdapter->pcm->rc, 0) ;
- a->ram_out (a, &IoAdapter->pcm->req, pcm->req) ;
- for ( i = (IoAdapter->trapped ? 3000 : 250) ; --i > 0 ; )
- {
-  diva_os_sleep (1) ;
-  rc = (int)(a->ram_in (a, &IoAdapter->pcm->rc)) ;
-  if ( rc )
-  {
-   a->ram_in_buffer (a, IoAdapter->pcm, pcm, sizeof(*pcm)) ;
-   return ;
-  }
- }
+       a->ram_out(a, &IoAdapter->pcm->rc, 0);
+       a->ram_out(a, &IoAdapter->pcm->req, pcm->req);
+       for (i = (IoAdapter->trapped ? 3000 : 250); --i > 0;)
+       {
+               diva_os_sleep(1);
+               rc = (int)(a->ram_in(a, &IoAdapter->pcm->rc));
+               if (rc)
+               {
+                       a->ram_in_buffer(a, IoAdapter->pcm, pcm, sizeof(*pcm));
+                       return;
+               }
+       }
 Trapped:
- if ( IoAdapter->trapFnc )
- {
-    int trapped = IoAdapter->trapped;
-  IoAdapter->trapFnc (IoAdapter) ;
-    /*
-      Firs trap, also notify user if supported
-     */
-    if (!trapped && IoAdapter->trapped && IoAdapter->os_trap_nfy_Fnc) {
-      (*(IoAdapter->os_trap_nfy_Fnc))(IoAdapter, IoAdapter->ANum);
-    }
- }
+       if (IoAdapter->trapFnc)
+       {
+               int trapped = IoAdapter->trapped;
+               IoAdapter->trapFnc(IoAdapter);
+               /*
+                 Firs trap, also notify user if supported
+               */
+               if (!trapped && IoAdapter->trapped && IoAdapter->os_trap_nfy_Fnc) {
+                       (*(IoAdapter->os_trap_nfy_Fnc))(IoAdapter, IoAdapter->ANum);
+               }
+       }
 }
 /*------------------------------------------------------------------*/
 /* ram access functions for memory mapped cards                     */
 /*------------------------------------------------------------------*/
-byte mem_in (ADAPTER *a, void *addr)
+byte mem_in(ADAPTER *a, void *addr)
 {
- byte val;
- volatile byte __iomem *Base = DIVA_OS_MEM_ATTACH_RAM((PISDN_ADAPTER)a->io);
- val = READ_BYTE(Base + (unsigned long)addr);
- DIVA_OS_MEM_DETACH_RAM((PISDN_ADAPTER)a->io, Base);
- return (val);
+       byte val;
+       volatile byte __iomem *Base = DIVA_OS_MEM_ATTACH_RAM((PISDN_ADAPTER)a->io);
+       val = READ_BYTE(Base + (unsigned long)addr);
+       DIVA_OS_MEM_DETACH_RAM((PISDN_ADAPTER)a->io, Base);
+       return (val);
 }
-word mem_inw (ADAPTER *a, void *addr)
+word mem_inw(ADAPTER *a, void *addr)
 {
- word val;
- volatile byte __iomem *Base = DIVA_OS_MEM_ATTACH_RAM((PISDN_ADAPTER)a->io);
- val = READ_WORD((Base + (unsigned long)addr));
- DIVA_OS_MEM_DETACH_RAM((PISDN_ADAPTER)a->io, Base);
- return (val);
+       word val;
+       volatile byte __iomem *Base = DIVA_OS_MEM_ATTACH_RAM((PISDN_ADAPTER)a->io);
+       val = READ_WORD((Base + (unsigned long)addr));
+       DIVA_OS_MEM_DETACH_RAM((PISDN_ADAPTER)a->io, Base);
+       return (val);
 }
-void mem_in_dw (ADAPTER *a, void *addr, dword* data, int dwords)
+void mem_in_dw(ADAPTER *a, void *addr, dword *data, int dwords)
 {
- volatile byte __iomem * Base = DIVA_OS_MEM_ATTACH_RAM((PISDN_ADAPTER)a->io);
- while (dwords--) {
-  *data++ = READ_DWORD((Base + (unsigned long)addr));
-  addr+=4;
- }
- DIVA_OS_MEM_DETACH_RAM((PISDN_ADAPTER)a->io, Base);
+       volatile byte __iomem *Base = DIVA_OS_MEM_ATTACH_RAM((PISDN_ADAPTER)a->io);
+       while (dwords--) {
+               *data++ = READ_DWORD((Base + (unsigned long)addr));
+               addr += 4;
+       }
+       DIVA_OS_MEM_DETACH_RAM((PISDN_ADAPTER)a->io, Base);
 }
-void mem_in_buffer (ADAPTER *a, void *addr, void *buffer, word length)
+void mem_in_buffer(ADAPTER *a, void *addr, void *buffer, word length)
 {
- volatile byte __iomem *Base = DIVA_OS_MEM_ATTACH_RAM((PISDN_ADAPTER)a->io);
- memcpy_fromio(buffer, (Base + (unsigned long)addr), length);
- DIVA_OS_MEM_DETACH_RAM((PISDN_ADAPTER)a->io, Base);
+       volatile byte __iomem *Base = DIVA_OS_MEM_ATTACH_RAM((PISDN_ADAPTER)a->io);
+       memcpy_fromio(buffer, (Base + (unsigned long)addr), length);
+       DIVA_OS_MEM_DETACH_RAM((PISDN_ADAPTER)a->io, Base);
 }
-void mem_look_ahead (ADAPTER *a, PBUFFER *RBuffer, ENTITY *e)
+void mem_look_ahead(ADAPTER *a, PBUFFER *RBuffer, ENTITY *e)
 {
- PISDN_ADAPTER IoAdapter = (PISDN_ADAPTER)a->io ;
- IoAdapter->RBuffer.length = mem_inw (a, &RBuffer->length) ;
- mem_in_buffer (a, RBuffer->P, IoAdapter->RBuffer.P,
-                IoAdapter->RBuffer.length) ;
- e->RBuffer = (DBUFFER *)&IoAdapter->RBuffer ;
+       PISDN_ADAPTER IoAdapter = (PISDN_ADAPTER)a->io;
+       IoAdapter->RBuffer.length = mem_inw(a, &RBuffer->length);
+       mem_in_buffer(a, RBuffer->P, IoAdapter->RBuffer.P,
+                     IoAdapter->RBuffer.length);
+       e->RBuffer = (DBUFFER *)&IoAdapter->RBuffer;
 }
-void mem_out (ADAPTER *a, void *addr, byte data)
+void mem_out(ADAPTER *a, void *addr, byte data)
 {
- volatile byte __iomem *Base = DIVA_OS_MEM_ATTACH_RAM((PISDN_ADAPTER)a->io);
- WRITE_BYTE(Base + (unsigned long)addr, data);
- DIVA_OS_MEM_DETACH_RAM((PISDN_ADAPTER)a->io, Base);
+       volatile byte __iomem *Base = DIVA_OS_MEM_ATTACH_RAM((PISDN_ADAPTER)a->io);
+       WRITE_BYTE(Base + (unsigned long)addr, data);
+       DIVA_OS_MEM_DETACH_RAM((PISDN_ADAPTER)a->io, Base);
 }
-void mem_outw (ADAPTER *a, void *addr, word data)
+void mem_outw(ADAPTER *a, void *addr, word data)
 {
- volatile byte __iomem * Base = DIVA_OS_MEM_ATTACH_RAM((PISDN_ADAPTER)a->io);
- WRITE_WORD((Base + (unsigned long)addr), data);
- DIVA_OS_MEM_DETACH_RAM((PISDN_ADAPTER)a->io, Base);
+       volatile byte __iomem *Base = DIVA_OS_MEM_ATTACH_RAM((PISDN_ADAPTER)a->io);
+       WRITE_WORD((Base + (unsigned long)addr), data);
+       DIVA_OS_MEM_DETACH_RAM((PISDN_ADAPTER)a->io, Base);
 }
-void mem_out_dw (ADAPTER *a, void *addr, const dword* data, int dwords)
+void mem_out_dw(ADAPTER *a, void *addr, const dword *data, int dwords)
 {
- volatile byte __iomem * Base = DIVA_OS_MEM_ATTACH_RAM((PISDN_ADAPTER)a->io);
- while (dwords--) {
-       WRITE_DWORD((Base + (unsigned long)addr), *data);
-       addr+=4;
-       data++;
- }
- DIVA_OS_MEM_DETACH_RAM((PISDN_ADAPTER)a->io, Base);
+       volatile byte __iomem *Base = DIVA_OS_MEM_ATTACH_RAM((PISDN_ADAPTER)a->io);
+       while (dwords--) {
+               WRITE_DWORD((Base + (unsigned long)addr), *data);
+               addr += 4;
+               data++;
+       }
+       DIVA_OS_MEM_DETACH_RAM((PISDN_ADAPTER)a->io, Base);
 }
-void mem_out_buffer (ADAPTER *a, void *addr, void *buffer, word length)
+void mem_out_buffer(ADAPTER *a, void *addr, void *buffer, word length)
 {
- volatile byte __iomem * Base = DIVA_OS_MEM_ATTACH_RAM((PISDN_ADAPTER)a->io);
- memcpy_toio((Base + (unsigned long)addr), buffer, length) ;
- DIVA_OS_MEM_DETACH_RAM((PISDN_ADAPTER)a->io, Base);
+       volatile byte __iomem *Base = DIVA_OS_MEM_ATTACH_RAM((PISDN_ADAPTER)a->io);
+       memcpy_toio((Base + (unsigned long)addr), buffer, length);
+       DIVA_OS_MEM_DETACH_RAM((PISDN_ADAPTER)a->io, Base);
 }
-void mem_inc (ADAPTER *a, void *addr)
+void mem_inc(ADAPTER *a, void *addr)
 {
- volatile byte __iomem *Base = DIVA_OS_MEM_ATTACH_RAM((PISDN_ADAPTER)a->io);
- byte  x = READ_BYTE(Base + (unsigned long)addr);
- WRITE_BYTE(Base + (unsigned long)addr, x + 1);
- DIVA_OS_MEM_DETACH_RAM((PISDN_ADAPTER)a->io, Base);
+       volatile byte __iomem *Base = DIVA_OS_MEM_ATTACH_RAM((PISDN_ADAPTER)a->io);
+       byte  x = READ_BYTE(Base + (unsigned long)addr);
+       WRITE_BYTE(Base + (unsigned long)addr, x + 1);
+       DIVA_OS_MEM_DETACH_RAM((PISDN_ADAPTER)a->io, Base);
 }
 /*------------------------------------------------------------------*/
 /* ram access functions for io-mapped cards                         */
 /*------------------------------------------------------------------*/
-byte io_in(ADAPTER * a, void * adr)
-{
-  byte val;
-  byte __iomem *Port = DIVA_OS_MEM_ATTACH_PORT((PISDN_ADAPTER)a->io);
-  outppw(Port + 4, (word)(unsigned long)adr);
-  val = inpp(Port);
-  DIVA_OS_MEM_DETACH_PORT((PISDN_ADAPTER)a->io, Port);
-  return(val);
-}
-word io_inw(ADAPTER * a, void * adr)
-{
-  word val;
-  byte __iomem *Port = DIVA_OS_MEM_ATTACH_PORT((PISDN_ADAPTER)a->io);
-  outppw(Port + 4, (word)(unsigned long)adr);
-  val = inppw(Port);
-  DIVA_OS_MEM_DETACH_PORT((PISDN_ADAPTER)a->io, Port);
-  return(val);
-}
-void io_in_buffer(ADAPTER * a, void * adr, void * buffer, word len)
-{
-  byte __iomem *Port = DIVA_OS_MEM_ATTACH_PORT((PISDN_ADAPTER)a->io);
-  byte* P = (byte*)buffer;
-  if ((long)adr & 1) {
-    outppw(Port+4, (word)(unsigned long)adr);
-    *P = inpp(Port);
-    P++;
-    adr = ((byte *) adr) + 1;
-    len--;
-    if (!len) {
+byte io_in(ADAPTER *a, void *adr)
+{
+       byte val;
+       byte __iomem *Port = DIVA_OS_MEM_ATTACH_PORT((PISDN_ADAPTER)a->io);
+       outppw(Port + 4, (word)(unsigned long)adr);
+       val = inpp(Port);
+       DIVA_OS_MEM_DETACH_PORT((PISDN_ADAPTER)a->io, Port);
+       return (val);
+}
+word io_inw(ADAPTER *a, void *adr)
+{
+       word val;
+       byte __iomem *Port = DIVA_OS_MEM_ATTACH_PORT((PISDN_ADAPTER)a->io);
+       outppw(Port + 4, (word)(unsigned long)adr);
+       val = inppw(Port);
+       DIVA_OS_MEM_DETACH_PORT((PISDN_ADAPTER)a->io, Port);
+       return (val);
+}
+void io_in_buffer(ADAPTER *a, void *adr, void *buffer, word len)
+{
+       byte __iomem *Port = DIVA_OS_MEM_ATTACH_PORT((PISDN_ADAPTER)a->io);
+       byte *P = (byte *)buffer;
+       if ((long)adr & 1) {
+               outppw(Port + 4, (word)(unsigned long)adr);
+               *P = inpp(Port);
+               P++;
+               adr = ((byte *) adr) + 1;
+               len--;
+               if (!len) {
+                       DIVA_OS_MEM_DETACH_PORT((PISDN_ADAPTER)a->io, Port);
+                       return;
+               }
+       }
+       outppw(Port + 4, (word)(unsigned long)adr);
+       inppw_buffer(Port, P, len + 1);
+       DIVA_OS_MEM_DETACH_PORT((PISDN_ADAPTER)a->io, Port);
+}
+void io_look_ahead(ADAPTER *a, PBUFFER *RBuffer, ENTITY *e)
+{
+       byte __iomem *Port = DIVA_OS_MEM_ATTACH_PORT((PISDN_ADAPTER)a->io);
+       outppw(Port + 4, (word)(unsigned long)RBuffer);
+       ((PISDN_ADAPTER)a->io)->RBuffer.length = inppw(Port);
+       inppw_buffer(Port, ((PISDN_ADAPTER)a->io)->RBuffer.P, ((PISDN_ADAPTER)a->io)->RBuffer.length + 1);
+       e->RBuffer = (DBUFFER *) &(((PISDN_ADAPTER)a->io)->RBuffer);
        DIVA_OS_MEM_DETACH_PORT((PISDN_ADAPTER)a->io, Port);
-       return;
-    }
-  }
-  outppw(Port+4, (word)(unsigned long)adr);
-  inppw_buffer (Port, P, len+1);
-  DIVA_OS_MEM_DETACH_PORT((PISDN_ADAPTER)a->io, Port);
-}
-void io_look_ahead(ADAPTER * a, PBUFFER * RBuffer, ENTITY * e)
-{
-  byte __iomem *Port = DIVA_OS_MEM_ATTACH_PORT((PISDN_ADAPTER)a->io);
-  outppw(Port+4, (word)(unsigned long)RBuffer);
-  ((PISDN_ADAPTER)a->io)->RBuffer.length = inppw(Port);
-  inppw_buffer (Port, ((PISDN_ADAPTER)a->io)->RBuffer.P, ((PISDN_ADAPTER)a->io)->RBuffer.length + 1);
-  e->RBuffer = (DBUFFER *) &(((PISDN_ADAPTER)a->io)->RBuffer);
-  DIVA_OS_MEM_DETACH_PORT((PISDN_ADAPTER)a->io, Port);
-}
-void io_out(ADAPTER * a, void * adr, byte data)
-{
-  byte __iomem *Port = DIVA_OS_MEM_ATTACH_PORT((PISDN_ADAPTER)a->io);
-  outppw(Port+4, (word)(unsigned long)adr);
-  outpp(Port, data);
-  DIVA_OS_MEM_DETACH_PORT((PISDN_ADAPTER)a->io, Port);
-}
-void io_outw(ADAPTER * a, void * adr, word data)
-{
-  byte __iomem *Port = DIVA_OS_MEM_ATTACH_PORT((PISDN_ADAPTER)a->io);
-  outppw(Port+4, (word)(unsigned long)adr);
-  outppw(Port, data);
-  DIVA_OS_MEM_DETACH_PORT((PISDN_ADAPTER)a->io, Port);
-}
-void io_out_buffer(ADAPTER * a, void * adr, void * buffer, word len)
-{
-  byte __iomem *Port = DIVA_OS_MEM_ATTACH_PORT((PISDN_ADAPTER)a->io);
-  byte* P = (byte*)buffer;
-  if ((long)adr & 1) {
-    outppw(Port+4, (word)(unsigned long)adr);
-    outpp(Port, *P);
-    P++;
-    adr = ((byte *) adr) + 1;
-    len--;
-    if (!len) {
+}
+void io_out(ADAPTER *a, void *adr, byte data)
+{
+       byte __iomem *Port = DIVA_OS_MEM_ATTACH_PORT((PISDN_ADAPTER)a->io);
+       outppw(Port + 4, (word)(unsigned long)adr);
+       outpp(Port, data);
+       DIVA_OS_MEM_DETACH_PORT((PISDN_ADAPTER)a->io, Port);
+}
+void io_outw(ADAPTER *a, void *adr, word data)
+{
+       byte __iomem *Port = DIVA_OS_MEM_ATTACH_PORT((PISDN_ADAPTER)a->io);
+       outppw(Port + 4, (word)(unsigned long)adr);
+       outppw(Port, data);
+       DIVA_OS_MEM_DETACH_PORT((PISDN_ADAPTER)a->io, Port);
+}
+void io_out_buffer(ADAPTER *a, void *adr, void *buffer, word len)
+{
+       byte __iomem *Port = DIVA_OS_MEM_ATTACH_PORT((PISDN_ADAPTER)a->io);
+       byte *P = (byte *)buffer;
+       if ((long)adr & 1) {
+               outppw(Port + 4, (word)(unsigned long)adr);
+               outpp(Port, *P);
+               P++;
+               adr = ((byte *) adr) + 1;
+               len--;
+               if (!len) {
+                       DIVA_OS_MEM_DETACH_PORT((PISDN_ADAPTER)a->io, Port);
+                       return;
+               }
+       }
+       outppw(Port + 4, (word)(unsigned long)adr);
+       outppw_buffer(Port, P, len + 1);
+       DIVA_OS_MEM_DETACH_PORT((PISDN_ADAPTER)a->io, Port);
+}
+void io_inc(ADAPTER *a, void *adr)
+{
+       byte x;
+       byte __iomem *Port = DIVA_OS_MEM_ATTACH_PORT((PISDN_ADAPTER)a->io);
+       outppw(Port + 4, (word)(unsigned long)adr);
+       x = inpp(Port);
+       outppw(Port + 4, (word)(unsigned long)adr);
+       outpp(Port, x + 1);
        DIVA_OS_MEM_DETACH_PORT((PISDN_ADAPTER)a->io, Port);
-       return;
-    }
-  }
-  outppw(Port+4, (word)(unsigned long)adr);
-  outppw_buffer (Port, P, len+1);
-  DIVA_OS_MEM_DETACH_PORT((PISDN_ADAPTER)a->io, Port);
-}
-void io_inc(ADAPTER * a, void * adr)
-{
-  byte x;
-  byte __iomem *Port = DIVA_OS_MEM_ATTACH_PORT((PISDN_ADAPTER)a->io);
-  outppw(Port+4, (word)(unsigned long)adr);
-  x = inpp(Port);
-  outppw(Port+4, (word)(unsigned long)adr);
-  outpp(Port, x+1);
-  DIVA_OS_MEM_DETACH_PORT((PISDN_ADAPTER)a->io, Port);
 }
 /*------------------------------------------------------------------*/
 /* OS specific functions related to queuing of entities             */
 /*------------------------------------------------------------------*/
-void free_entity(ADAPTER * a, byte e_no)
-{
-  PISDN_ADAPTER IoAdapter;
- diva_os_spin_lock_magic_t irql;
-  IoAdapter = (PISDN_ADAPTER) a->io;
- diva_os_enter_spin_lock (&IoAdapter->data_spin_lock, &irql, "data_free");
-  IoAdapter->e_tbl[e_no].e = NULL;
-  IoAdapter->e_count--;
- diva_os_leave_spin_lock (&IoAdapter->data_spin_lock, &irql, "data_free");
-}
-void assign_queue(ADAPTER * a, byte e_no, word ref)
-{
-  PISDN_ADAPTER IoAdapter;
- diva_os_spin_lock_magic_t irql;
-  IoAdapter = (PISDN_ADAPTER) a->io;
- diva_os_enter_spin_lock (&IoAdapter->data_spin_lock, &irql, "data_assign");
-  IoAdapter->e_tbl[e_no].assign_ref = ref;
-  IoAdapter->e_tbl[e_no].next = (byte)IoAdapter->assign;
-  IoAdapter->assign = e_no;
- diva_os_leave_spin_lock (&IoAdapter->data_spin_lock, &irql, "data_assign");
-}
-byte get_assign(ADAPTER * a, word ref)
-{
-  PISDN_ADAPTER IoAdapter;
- diva_os_spin_lock_magic_t irql;
-  byte e_no;
-  IoAdapter = (PISDN_ADAPTER) a->io;
- diva_os_enter_spin_lock (&IoAdapter->data_spin_lock,
-              &irql,
-              "data_assign_get");
-  for(e_no = (byte)IoAdapter->assign;
-      e_no && IoAdapter->e_tbl[e_no].assign_ref!=ref;
-      e_no = IoAdapter->e_tbl[e_no].next);
- diva_os_leave_spin_lock (&IoAdapter->data_spin_lock,
-              &irql,
-              "data_assign_get");
-  return e_no;
-}
-void req_queue(ADAPTER * a, byte e_no)
-{
-  PISDN_ADAPTER IoAdapter;
- diva_os_spin_lock_magic_t irql;
-  IoAdapter = (PISDN_ADAPTER) a->io;
- diva_os_enter_spin_lock (&IoAdapter->data_spin_lock, &irql, "data_req_q");
-  IoAdapter->e_tbl[e_no].next = 0;
-  if(IoAdapter->head) {
-    IoAdapter->e_tbl[IoAdapter->tail].next = e_no;
-    IoAdapter->tail = e_no;
-  }
-  else {
-    IoAdapter->head = e_no;
-    IoAdapter->tail = e_no;
-  }
- diva_os_leave_spin_lock (&IoAdapter->data_spin_lock, &irql, "data_req_q");
-}
-byte look_req(ADAPTER * a)
-{
-  PISDN_ADAPTER IoAdapter;
-  IoAdapter = (PISDN_ADAPTER) a->io;
-  return ((byte)IoAdapter->head) ;
-}
-void next_req(ADAPTER * a)
-{
-  PISDN_ADAPTER IoAdapter;
- diva_os_spin_lock_magic_t irql;
-  IoAdapter = (PISDN_ADAPTER) a->io;
- diva_os_enter_spin_lock (&IoAdapter->data_spin_lock, &irql, "data_req_next");
-  IoAdapter->head = IoAdapter->e_tbl[IoAdapter->head].next;
-  if(!IoAdapter->head) IoAdapter->tail = 0;
- diva_os_leave_spin_lock (&IoAdapter->data_spin_lock, &irql, "data_req_next");
+void free_entity(ADAPTER *a, byte e_no)
+{
+       PISDN_ADAPTER IoAdapter;
+       diva_os_spin_lock_magic_t irql;
+       IoAdapter = (PISDN_ADAPTER) a->io;
+       diva_os_enter_spin_lock(&IoAdapter->data_spin_lock, &irql, "data_free");
+       IoAdapter->e_tbl[e_no].e = NULL;
+       IoAdapter->e_count--;
+       diva_os_leave_spin_lock(&IoAdapter->data_spin_lock, &irql, "data_free");
+}
+void assign_queue(ADAPTER *a, byte e_no, word ref)
+{
+       PISDN_ADAPTER IoAdapter;
+       diva_os_spin_lock_magic_t irql;
+       IoAdapter = (PISDN_ADAPTER) a->io;
+       diva_os_enter_spin_lock(&IoAdapter->data_spin_lock, &irql, "data_assign");
+       IoAdapter->e_tbl[e_no].assign_ref = ref;
+       IoAdapter->e_tbl[e_no].next = (byte)IoAdapter->assign;
+       IoAdapter->assign = e_no;
+       diva_os_leave_spin_lock(&IoAdapter->data_spin_lock, &irql, "data_assign");
+}
+byte get_assign(ADAPTER *a, word ref)
+{
+       PISDN_ADAPTER IoAdapter;
+       diva_os_spin_lock_magic_t irql;
+       byte e_no;
+       IoAdapter = (PISDN_ADAPTER) a->io;
+       diva_os_enter_spin_lock(&IoAdapter->data_spin_lock,
+                               &irql,
+                               "data_assign_get");
+       for (e_no = (byte)IoAdapter->assign;
+           e_no && IoAdapter->e_tbl[e_no].assign_ref != ref;
+           e_no = IoAdapter->e_tbl[e_no].next);
+       diva_os_leave_spin_lock(&IoAdapter->data_spin_lock,
+                               &irql,
+                               "data_assign_get");
+       return e_no;
+}
+void req_queue(ADAPTER *a, byte e_no)
+{
+       PISDN_ADAPTER IoAdapter;
+       diva_os_spin_lock_magic_t irql;
+       IoAdapter = (PISDN_ADAPTER) a->io;
+       diva_os_enter_spin_lock(&IoAdapter->data_spin_lock, &irql, "data_req_q");
+       IoAdapter->e_tbl[e_no].next = 0;
+       if (IoAdapter->head) {
+               IoAdapter->e_tbl[IoAdapter->tail].next = e_no;
+               IoAdapter->tail = e_no;
+       }
+       else {
+               IoAdapter->head = e_no;
+               IoAdapter->tail = e_no;
+       }
+       diva_os_leave_spin_lock(&IoAdapter->data_spin_lock, &irql, "data_req_q");
+}
+byte look_req(ADAPTER *a)
+{
+       PISDN_ADAPTER IoAdapter;
+       IoAdapter = (PISDN_ADAPTER) a->io;
+       return ((byte)IoAdapter->head);
+}
+void next_req(ADAPTER *a)
+{
+       PISDN_ADAPTER IoAdapter;
+       diva_os_spin_lock_magic_t irql;
+       IoAdapter = (PISDN_ADAPTER) a->io;
+       diva_os_enter_spin_lock(&IoAdapter->data_spin_lock, &irql, "data_req_next");
+       IoAdapter->head = IoAdapter->e_tbl[IoAdapter->head].next;
+       if (!IoAdapter->head) IoAdapter->tail = 0;
+       diva_os_leave_spin_lock(&IoAdapter->data_spin_lock, &irql, "data_req_next");
 }
 /*------------------------------------------------------------------*/
 /* memory map functions                                             */
 /*------------------------------------------------------------------*/
-ENTITY * entity_ptr(ADAPTER * a, byte e_no)
+ENTITY *entity_ptr(ADAPTER *a, byte e_no)
 {
-  PISDN_ADAPTER IoAdapter;
-  IoAdapter = (PISDN_ADAPTER) a->io;
-  return (IoAdapter->e_tbl[e_no].e);
+       PISDN_ADAPTER IoAdapter;
+       IoAdapter = (PISDN_ADAPTER)a->io;
+       return (IoAdapter->e_tbl[e_no].e);
 }
-void * PTR_X(ADAPTER * a, ENTITY * e)
+void *PTR_X(ADAPTER *a, ENTITY *e)
 {
-  return ((void *) e->X);
+       return ((void *) e->X);
 }
-void * PTR_R(ADAPTER * a, ENTITY * e)
+void *PTR_R(ADAPTER *a, ENTITY *e)
 {
-  return ((void *) e->R);
+       return ((void *) e->R);
 }
-void * PTR_P(ADAPTER * a, ENTITY * e, void * P)
+void *PTR_P(ADAPTER *a, ENTITY *e, void *P)
 {
-  return P;
+       return P;
 }
-void CALLBACK(ADAPTER * a, ENTITY * e)
+void CALLBACK(ADAPTER *a, ENTITY *e)
 {
- if ( e && e->callback )
-  e->callback (e) ;
+       if (e && e->callback)
+               e->callback(e);
 }
index a6f1755..01deced 100644 (file)
 
 /*
  *
-  Copyright (c) Eicon Networks, 2002.
+ Copyright (c) Eicon Networks, 2002.
  *
-  This source file is supplied for the use with
-  Eicon Networks range of DIVA Server Adapters.
+ This source file is supplied for the use with
+ Eicon Networks range of DIVA Server Adapters.
  *
-  Eicon File Revision :    2.1
+ Eicon File Revision :    2.1
  *
-  This program is free software; you can redistribute it and/or modify
-  it under the terms of the GNU General Public License as published by
-  the Free Software Foundation; either version 2, or (at your option)
-  any later version.
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
  *
-  This program is distributed in the hope that it will be useful,
-  but WITHOUT ANY WARRANTY OF ANY KIND WHATSOEVER INCLUDING ANY
-  implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-  See the GNU General Public License for more details.
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY OF ANY KIND WHATSOEVER INCLUDING ANY
+ implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ See the GNU General Public License for more details.
  *
-  You should have received a copy of the GNU General Public License
-  along with this program; if not, write to the Free Software
-  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  *
  */
 #ifndef __DIVA_XDI_COMMON_IO_H_INC__ /* { */
 #define __DIVA_XDI_COMMON_IO_H_INC__
 /*
- maximum = 16 adapters
- */
+  maximum = 16 adapters
+*/
 #define DI_MAX_LINKS    MAX_ADAPTER
 #define ISDN_MAX_NUM_LEN 60
 /* --------------------------------------------------------------------------
-  structure for quadro card management (obsolete for
-  systems that do provide per card load event)
-  -------------------------------------------------------------------------- */
+   structure for quadro card management (obsolete for
+   systems that do provide per card load event)
+   -------------------------------------------------------------------------- */
 typedef struct {
- dword         Num ;
- DEVICE_NAME   DeviceName[4] ;
- PISDN_ADAPTER QuadroAdapter[4] ;
-} ADAPTER_LIST_ENTRY, *PADAPTER_LIST_ENTRY ;
+       dword         Num;
+       DEVICE_NAME   DeviceName[4];
+       PISDN_ADAPTER QuadroAdapter[4];
+} ADAPTER_LIST_ENTRY, *PADAPTER_LIST_ENTRY;
 /* --------------------------------------------------------------------------
-  Special OS memory support structures
-  -------------------------------------------------------------------------- */
+   Special OS memory support structures
+   -------------------------------------------------------------------------- */
 #define MAX_MAPPED_ENTRIES 8
 typedef struct {
- void  * Address;
- dword    Length;
-} ADAPTER_MEMORY ;
+       void *Address;
+       dword    Length;
+} ADAPTER_MEMORY;
 /* --------------------------------------------------------------------------
-  Configuration of XDI clients carried by XDI
-  -------------------------------------------------------------------------- */
+   Configuration of XDI clients carried by XDI
+   -------------------------------------------------------------------------- */
 #define DIVA_XDI_CAPI_CFG_1_DYNAMIC_L1_ON      0x01
 #define DIVA_XDI_CAPI_CFG_1_GROUP_POPTIMIZATION_ON 0x02
 typedef struct _diva_xdi_capi_cfg {
-  byte cfg_1;
+       byte cfg_1;
 } diva_xdi_capi_cfg_t;
 /* --------------------------------------------------------------------------
-  Main data structure kept per adapter
-  -------------------------------------------------------------------------- */
+   Main data structure kept per adapter
+   -------------------------------------------------------------------------- */
 struct _ISDN_ADAPTER {
- void             (* DIRequest)(PISDN_ADAPTER, ENTITY *) ;
- int                 State ; /* from NT4 1.srv, a good idea, but  a poor achievement */
- int                 Initialized ;
- int         RegisteredWithDidd ;
- int                 Unavailable ;  /* callback function possible? */
- int         ResourcesClaimed ;
- int         PnpBiosConfigUsed ;
- dword        Logging ;
- dword        features ;
- char        ProtocolIdString[80] ;
- /*
-  remember mapped memory areas
- */
- ADAPTER_MEMORY     MappedMemory[MAX_MAPPED_ENTRIES] ;
- CARD_PROPERTIES     Properties ;
- dword               cardType ;
- dword               protocol_id ;       /* configured protocol identifier */
- char                protocol_name[8] ;  /* readable name of protocol */
- dword               BusType ;
- dword               BusNumber ;
- dword               slotNumber ;
- dword               slotId ;
- dword               ControllerNumber ;  /* for QUADRO cards only */
- PISDN_ADAPTER       MultiMaster ;       /* for 4-BRI card only - use MultiMaster or QuadroList */
- PADAPTER_LIST_ENTRY QuadroList ;        /* for QUADRO card  only */
- PDEVICE_OBJECT      DeviceObject ;
- dword               DeviceId ;
- diva_os_adapter_irq_info_t irq_info;
- dword volatile      IrqCount ;
- int                 trapped ;
- dword               DspCodeBaseAddr ;
- dword               MaxDspCodeSize ;
- dword               downloadAddr ;
- dword               DspCodeBaseAddrTable[4] ; /* add. for MultiMaster */
- dword               MaxDspCodeSizeTable[4] ; /* add. for MultiMaster */
- dword               downloadAddrTable[4] ; /* add. for MultiMaster */
- dword               MemoryBase ;
- dword               MemorySize ;
- byte                __iomem *Address ;
- byte                __iomem *Config ;
- byte                __iomem *Control ;
- byte                __iomem *reset ;
- byte                __iomem *port ;
- byte                __iomem *ram ;
- byte                __iomem *cfg ;
- byte                __iomem *prom ;
- byte                __iomem *ctlReg ;
- struct pc_maint  *pcm ;
- diva_os_dependent_devica_name_t os_name;
- byte                Name[32] ;
- dword               serialNo ;
- dword               ANum ;
- dword               ArchiveType ; /* ARCHIVE_TYPE_NONE ..._SINGLE ..._USGEN ..._MULTI */
- char               *ProtocolSuffix ; /* internal protocolfile table */
- char                Archive[32] ;
- char                Protocol[32] ;
- char                AddDownload[32] ; /* Dsp- or other additional download files */
- char                Oad1[ISDN_MAX_NUM_LEN] ;
- char                Osa1[ISDN_MAX_NUM_LEN] ;
- char                Oad2[ISDN_MAX_NUM_LEN] ;
- char                Osa2[ISDN_MAX_NUM_LEN] ;
- char                Spid1[ISDN_MAX_NUM_LEN] ;
- char                Spid2[ISDN_MAX_NUM_LEN] ;
-  byte                nosig ;
-  byte                BriLayer2LinkCount ; /* amount of TEI's that adapter will support in P2MP mode */
- dword               Channels ;
- dword               tei ;
- dword               nt2 ;
- dword               TerminalCount ;
- dword               WatchDog ;
- dword               Permanent ;
- dword               BChMask ; /* B channel mask for unchannelized modes */
- dword               StableL2 ;
- dword               DidLen ;
- dword               NoOrderCheck ;
- dword               ForceLaw; /* VoiceCoding - default:0, a-law: 1, my-law: 2 */
- dword               SigFlags ;
- dword               LowChannel ;
- dword               NoHscx30 ;
- dword               ProtVersion ;
- dword               crc4 ;
- dword               L1TristateOrQsig ; /* enable Layer 1 Tristate (bit 2)Or Qsig params (bit 0,1)*/
- dword               InitialDspInfo ;
- dword               ModemGuardTone ;
- dword               ModemMinSpeed ;
- dword               ModemMaxSpeed ;
- dword               ModemOptions ;
- dword               ModemOptions2 ;
- dword               ModemNegotiationMode ;
- dword               ModemModulationsMask ;
- dword               ModemTransmitLevel ;
- dword               FaxOptions ;
- dword               FaxMaxSpeed ;
- dword               Part68LevelLimiter ;
- dword               UsEktsNumCallApp ;
- byte                UsEktsFeatAddConf ;
- byte                UsEktsFeatRemoveConf ;
- byte                UsEktsFeatCallTransfer ;
- byte                UsEktsFeatMsgWaiting ;
- byte                QsigDialect;
- byte                ForceVoiceMailAlert;
- byte                DisableAutoSpid;
- byte                ModemCarrierWaitTimeSec;
- byte                ModemCarrierLossWaitTimeTenthSec;
- byte                PiafsLinkTurnaroundInFrames;
- byte                DiscAfterProgress;
- byte                AniDniLimiter[3];
- byte                TxAttenuation;  /* PRI/E1 only: attenuate TX signal */
- word                QsigFeatures;
- dword               GenerateRingtone ;
- dword               SupplementaryServicesFeatures;
- dword               R2Dialect;
- dword               R2CasOptions;
- dword               FaxV34Options;
- dword               DisabledDspMask;
- dword               AdapterTestMask;
- dword               DspImageLength;
- word                AlertToIn20mSecTicks;
- word                ModemEyeSetup;
- byte                R2CtryLength;
- byte                CCBSRelTimer;
- byte               *PcCfgBufferFile;/* flexible parameter via file */
- byte               *PcCfgBuffer ; /* flexible parameter via multistring */
- diva_os_dump_file_t dump_file; /* dump memory to file at lowest irq level */
- diva_os_board_trace_t board_trace ; /* traces from the board */
- diva_os_spin_lock_t isr_spin_lock;
- diva_os_spin_lock_t data_spin_lock;
- diva_os_soft_isr_t req_soft_isr;
- diva_os_soft_isr_t isr_soft_isr;
- diva_os_atomic_t  in_dpc;
- PBUFFER             RBuffer;        /* Copy of receive lookahead buffer */
- word                e_max;
- word                e_count;
- E_INFO             *e_tbl;
- word                assign;         /* list of pending ASSIGNs  */
- word                head;           /* head of request queue    */
- word                tail;           /* tail of request queue    */
- ADAPTER             a ;             /* not a separate structure */
- void        (* out)(ADAPTER * a) ;
- byte        (* dpc)(ADAPTER * a) ;
- byte        (* tst_irq)(ADAPTER * a) ;
- void        (* clr_irq)(ADAPTER * a) ;
- int         (* load)(PISDN_ADAPTER) ;
- int         (* mapmem)(PISDN_ADAPTER) ;
- int         (* chkIrq)(PISDN_ADAPTER) ;
- void        (* disIrq)(PISDN_ADAPTER) ;
- void        (* start)(PISDN_ADAPTER) ;
- void        (* stop)(PISDN_ADAPTER) ;
- void        (* rstFnc)(PISDN_ADAPTER) ;
- void        (* trapFnc)(PISDN_ADAPTER) ;
- dword            (* DetectDsps)(PISDN_ADAPTER) ;
- void        (* os_trap_nfy_Fnc)(PISDN_ADAPTER, dword) ;
- diva_os_isr_callback_t diva_isr_handler;
- dword               sdram_bar;  /* must be 32 bit */
- dword               fpga_features;
- volatile int        pcm_pending;
- volatile void *     pcm_data;
- diva_xdi_capi_cfg_t capi_cfg;
- dword               tasks;
- void               *dma_map;
- int             (*DivaAdapterTestProc)(PISDN_ADAPTER);
- void               *AdapterTestMemoryStart;
- dword               AdapterTestMemoryLength;
- const byte* cfg_lib_memory_init;
- dword       cfg_lib_memory_init_length;
+       void (*DIRequest)(PISDN_ADAPTER, ENTITY *);
+       int State; /* from NT4 1.srv, a good idea, but  a poor achievement */
+       int Initialized;
+       int RegisteredWithDidd;
+       int Unavailable;  /* callback function possible? */
+       int ResourcesClaimed;
+       int PnpBiosConfigUsed;
+       dword Logging;
+       dword features;
+       char ProtocolIdString[80];
+       /*
+         remember mapped memory areas
+       */
+       ADAPTER_MEMORY MappedMemory[MAX_MAPPED_ENTRIES];
+       CARD_PROPERTIES Properties;
+       dword cardType;
+       dword protocol_id;       /* configured protocol identifier */
+       char protocol_name[8];  /* readable name of protocol */
+       dword BusType;
+       dword BusNumber;
+       dword slotNumber;
+       dword slotId;
+       dword ControllerNumber;  /* for QUADRO cards only */
+       PISDN_ADAPTER MultiMaster;       /* for 4-BRI card only - use MultiMaster or QuadroList */
+       PADAPTER_LIST_ENTRY QuadroList;        /* for QUADRO card  only */
+       PDEVICE_OBJECT DeviceObject;
+       dword DeviceId;
+       diva_os_adapter_irq_info_t irq_info;
+       dword volatile IrqCount;
+       int trapped;
+       dword DspCodeBaseAddr;
+       dword MaxDspCodeSize;
+       dword downloadAddr;
+       dword DspCodeBaseAddrTable[4]; /* add. for MultiMaster */
+       dword MaxDspCodeSizeTable[4]; /* add. for MultiMaster */
+       dword downloadAddrTable[4]; /* add. for MultiMaster */
+       dword MemoryBase;
+       dword MemorySize;
+       byte __iomem *Address;
+       byte __iomem *Config;
+       byte __iomem *Control;
+       byte __iomem *reset;
+       byte __iomem *port;
+       byte __iomem *ram;
+       byte __iomem *cfg;
+       byte __iomem *prom;
+       byte __iomem *ctlReg;
+       struct pc_maint  *pcm;
+       diva_os_dependent_devica_name_t os_name;
+       byte Name[32];
+       dword serialNo;
+       dword ANum;
+       dword ArchiveType; /* ARCHIVE_TYPE_NONE ..._SINGLE ..._USGEN ..._MULTI */
+       char *ProtocolSuffix; /* internal protocolfile table */
+       char Archive[32];
+       char Protocol[32];
+       char AddDownload[32]; /* Dsp- or other additional download files */
+       char Oad1[ISDN_MAX_NUM_LEN];
+       char Osa1[ISDN_MAX_NUM_LEN];
+       char Oad2[ISDN_MAX_NUM_LEN];
+       char Osa2[ISDN_MAX_NUM_LEN];
+       char Spid1[ISDN_MAX_NUM_LEN];
+       char Spid2[ISDN_MAX_NUM_LEN];
+       byte nosig;
+       byte BriLayer2LinkCount; /* amount of TEI's that adapter will support in P2MP mode */
+       dword Channels;
+       dword tei;
+       dword nt2;
+       dword TerminalCount;
+       dword WatchDog;
+       dword Permanent;
+       dword BChMask; /* B channel mask for unchannelized modes */
+       dword StableL2;
+       dword DidLen;
+       dword NoOrderCheck;
+       dword ForceLaw; /* VoiceCoding - default:0, a-law: 1, my-law: 2 */
+       dword SigFlags;
+       dword LowChannel;
+       dword NoHscx30;
+       dword ProtVersion;
+       dword crc4;
+       dword L1TristateOrQsig; /* enable Layer 1 Tristate (bit 2)Or Qsig params (bit 0,1)*/
+       dword InitialDspInfo;
+       dword ModemGuardTone;
+       dword ModemMinSpeed;
+       dword ModemMaxSpeed;
+       dword ModemOptions;
+       dword ModemOptions2;
+       dword ModemNegotiationMode;
+       dword ModemModulationsMask;
+       dword ModemTransmitLevel;
+       dword FaxOptions;
+       dword FaxMaxSpeed;
+       dword Part68LevelLimiter;
+       dword UsEktsNumCallApp;
+       byte UsEktsFeatAddConf;
+       byte UsEktsFeatRemoveConf;
+       byte UsEktsFeatCallTransfer;
+       byte UsEktsFeatMsgWaiting;
+       byte QsigDialect;
+       byte ForceVoiceMailAlert;
+       byte DisableAutoSpid;
+       byte ModemCarrierWaitTimeSec;
+       byte ModemCarrierLossWaitTimeTenthSec;
+       byte PiafsLinkTurnaroundInFrames;
+       byte DiscAfterProgress;
+       byte AniDniLimiter[3];
+       byte TxAttenuation;  /* PRI/E1 only: attenuate TX signal */
+       word QsigFeatures;
+       dword GenerateRingtone;
+       dword SupplementaryServicesFeatures;
+       dword R2Dialect;
+       dword R2CasOptions;
+       dword FaxV34Options;
+       dword DisabledDspMask;
+       dword AdapterTestMask;
+       dword DspImageLength;
+       word AlertToIn20mSecTicks;
+       word ModemEyeSetup;
+       byte R2CtryLength;
+       byte CCBSRelTimer;
+       byte *PcCfgBufferFile;/* flexible parameter via file */
+       byte *PcCfgBuffer; /* flexible parameter via multistring */
+       diva_os_dump_file_t dump_file; /* dump memory to file at lowest irq level */
+       diva_os_board_trace_t board_trace; /* traces from the board */
+       diva_os_spin_lock_t isr_spin_lock;
+       diva_os_spin_lock_t data_spin_lock;
+       diva_os_soft_isr_t req_soft_isr;
+       diva_os_soft_isr_t isr_soft_isr;
+       diva_os_atomic_t  in_dpc;
+       PBUFFER RBuffer;        /* Copy of receive lookahead buffer */
+       word e_max;
+       word e_count;
+       E_INFO *e_tbl;
+       word assign;         /* list of pending ASSIGNs  */
+       word head;           /* head of request queue    */
+       word tail;           /* tail of request queue    */
+       ADAPTER a;             /* not a separate structure */
+       void (*out)(ADAPTER *a);
+       byte (*dpc)(ADAPTER *a);
+       byte (*tst_irq)(ADAPTER *a);
+       void (*clr_irq)(ADAPTER *a);
+       int (*load)(PISDN_ADAPTER);
+       int (*mapmem)(PISDN_ADAPTER);
+       int (*chkIrq)(PISDN_ADAPTER);
+       void (*disIrq)(PISDN_ADAPTER);
+       void (*start)(PISDN_ADAPTER);
+       void (*stop)(PISDN_ADAPTER);
+       void (*rstFnc)(PISDN_ADAPTER);
+       void (*trapFnc)(PISDN_ADAPTER);
+       dword (*DetectDsps)(PISDN_ADAPTER);
+       void (*os_trap_nfy_Fnc)(PISDN_ADAPTER, dword);
+       diva_os_isr_callback_t diva_isr_handler;
+       dword sdram_bar;  /* must be 32 bit */
+       dword fpga_features;
+       volatile int pcm_pending;
+       volatile void *pcm_data;
+       diva_xdi_capi_cfg_t capi_cfg;
+       dword tasks;
+       void *dma_map;
+       int (*DivaAdapterTestProc)(PISDN_ADAPTER);
+       void *AdapterTestMemoryStart;
+       dword AdapterTestMemoryLength;
+       const byte *cfg_lib_memory_init;
+       dword cfg_lib_memory_init_length;
 };
 /* ---------------------------------------------------------------------
-  Entity table
+   Entity table
    --------------------------------------------------------------------- */
 struct e_info_s {
-  ENTITY *      e;
-  byte          next;                   /* chaining index           */
-  word          assign_ref;             /* assign reference         */
+       ENTITY *e;
+       byte          next;                   /* chaining index           */
+       word          assign_ref;             /* assign reference         */
 };
 /* ---------------------------------------------------------------------
-  S-cards shared ram structure for loading
+   S-cards shared ram structure for loading
    --------------------------------------------------------------------- */
 struct s_load {
- byte ctrl;
- byte card;
- byte msize;
- byte fill0;
- word ebit;
- word elocl;
- word eloch;
- byte reserved[20];
- word signature;
- byte fill[224];
- byte b[256];
+       byte ctrl;
+       byte card;
+       byte msize;
+       byte fill0;
+       word ebit;
+       word elocl;
+       word eloch;
+       byte reserved[20];
+       word signature;
+       byte fill[224];
+       byte b[256];
 };
 #define PR_RAM  ((struct pr_ram *)0)
 #define RAM ((struct dual *)0)
 /* ---------------------------------------------------------------------
-  platform specific conversions
+   platform specific conversions
    --------------------------------------------------------------------- */
-extern void * PTR_P(ADAPTER * a, ENTITY * e, void * P);
-extern void * PTR_X(ADAPTER * a, ENTITY * e);
-extern void * PTR_R(ADAPTER * a, ENTITY * e);
-extern void CALLBACK(ADAPTER * a, ENTITY * e);
-extern void set_ram(void * * adr_ptr);
+extern void *PTR_P(ADAPTER *a, ENTITY *e, void *P);
+extern void *PTR_X(ADAPTER *a, ENTITY *e);
+extern void *PTR_R(ADAPTER *a, ENTITY *e);
+extern void CALLBACK(ADAPTER *a, ENTITY *e);
+extern void set_ram(void **adr_ptr);
 /* ---------------------------------------------------------------------
-  ram access functions for io mapped cards
+   ram access functions for io mapped cards
    --------------------------------------------------------------------- */
-byte io_in(ADAPTER * a, void * adr);
-word io_inw(ADAPTER * a, void * adr);
-void io_in_buffer(ADAPTER * a, void * adr, void * P, word length);
-void io_look_ahead(ADAPTER * a, PBUFFER * RBuffer, ENTITY * e);
-void io_out(ADAPTER * a, void * adr, byte data);
-void io_outw(ADAPTER * a, void * adr, word data);
-void io_out_buffer(ADAPTER * a, void * adr, void * P, word length);
-void io_inc(ADAPTER * a, void * adr);
-void bri_in_buffer (PISDN_ADAPTER IoAdapter, dword Pos,
-                    void *Buf, dword Len);
-int bri_out_buffer (PISDN_ADAPTER IoAdapter, dword Pos,
-                    void *Buf, dword Len, int Verify);
+byte io_in(ADAPTER *a, void *adr);
+word io_inw(ADAPTER *a, void *adr);
+void io_in_buffer(ADAPTER *a, void *adr, void *P, word length);
+void io_look_ahead(ADAPTER *a, PBUFFER *RBuffer, ENTITY *e);
+void io_out(ADAPTER *a, void *adr, byte data);
+void io_outw(ADAPTER *a, void *adr, word data);
+void io_out_buffer(ADAPTER *a, void *adr, void *P, word length);
+void io_inc(ADAPTER *a, void *adr);
+void bri_in_buffer(PISDN_ADAPTER IoAdapter, dword Pos,
+                  void *Buf, dword Len);
+int bri_out_buffer(PISDN_ADAPTER IoAdapter, dword Pos,
+                  void *Buf, dword Len, int Verify);
 /* ---------------------------------------------------------------------
-  ram access functions for memory mapped cards
+   ram access functions for memory mapped cards
    --------------------------------------------------------------------- */
-byte mem_in(ADAPTER * a, void * adr);
-word mem_inw(ADAPTER * a, void * adr);
-void mem_in_buffer(ADAPTER * a, void * adr, void * P, word length);
-void mem_look_ahead(ADAPTER * a, PBUFFER * RBuffer, ENTITY * e);
-void mem_out(ADAPTER * a, void * adr, byte data);
-void mem_outw(ADAPTER * a, void * adr, word data);
-void mem_out_buffer(ADAPTER * a, void * adr, void * P, word length);
-void mem_inc(ADAPTER * a, void * adr);
-void mem_in_dw (ADAPTER *a, void *addr, dword* data, int dwords);
-void mem_out_dw (ADAPTER *a, void *addr, const dword* data, int dwords);
+byte mem_in(ADAPTER *a, void *adr);
+word mem_inw(ADAPTER *a, void *adr);
+void mem_in_buffer(ADAPTER *a, void *adr, void *P, word length);
+void mem_look_ahead(ADAPTER *a, PBUFFER *RBuffer, ENTITY *e);
+void mem_out(ADAPTER *a, void *adr, byte data);
+void mem_outw(ADAPTER *a, void *adr, word data);
+void mem_out_buffer(ADAPTER *a, void *adr, void *P, word length);
+void mem_inc(ADAPTER *a, void *adr);
+void mem_in_dw(ADAPTER *a, void *addr, dword *data, int dwords);
+void mem_out_dw(ADAPTER *a, void *addr, const dword *data, int dwords);
 /* ---------------------------------------------------------------------
-  functions exported by io.c
+   functions exported by io.c
    --------------------------------------------------------------------- */
-extern IDI_CALL Requests[MAX_ADAPTER] ;
-extern void     DIDpcRoutine (struct _diva_os_soft_isr* psoft_isr,
-               void* context);
-extern void     request (PISDN_ADAPTER, ENTITY *) ;
+extern IDI_CALL Requests[MAX_ADAPTER];
+extern void     DIDpcRoutine(struct _diva_os_soft_isr *psoft_isr,
+                            void *context);
+extern void     request(PISDN_ADAPTER, ENTITY *);
 /* ---------------------------------------------------------------------
-  trapFn helpers, used to recover debug trace from dead card
+   trapFn helpers, used to recover debug trace from dead card
    --------------------------------------------------------------------- */
 typedef struct {
- word *buf ;
- word  cnt ;
- word  out ;
-} Xdesc ;
-extern void     dump_trap_frame  (PISDN_ADAPTER IoAdapter, byte __iomem *exception) ;
-extern void     dump_xlog_buffer (PISDN_ADAPTER IoAdapter, Xdesc *xlogDesc) ;
+       word *buf;
+       word  cnt;
+       word  out;
+} Xdesc;
+extern void dump_trap_frame(PISDN_ADAPTER IoAdapter, byte __iomem *exception);
+extern void dump_xlog_buffer(PISDN_ADAPTER IoAdapter, Xdesc *xlogDesc);
 /* --------------------------------------------------------------------- */
 #endif  /* } __DIVA_XDI_COMMON_IO_H_INC__ */
index 7bd5baa..045bda5 100644 (file)
@@ -1,26 +1,26 @@
 
 /*
  *
-  Copyright (c) Eicon Networks, 2002.
+ Copyright (c) Eicon Networks, 2002.
  *
-  This source file is supplied for the use with
-  Eicon Networks range of DIVA Server Adapters.
+ This source file is supplied for the use with
+ Eicon Networks range of DIVA Server Adapters.
  *
-  Eicon File Revision :    2.1
+ Eicon File Revision :    2.1
  *
-  This program is free software; you can redistribute it and/or modify
-  it under the terms of the GNU General Public License as published by
-  the Free Software Foundation; either version 2, or (at your option)
-  any later version.
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
  *
-  This program is distributed in the hope that it will be useful,
-  but WITHOUT ANY WARRANTY OF ANY KIND WHATSOEVER INCLUDING ANY
-  implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-  See the GNU General Public License for more details.
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY OF ANY KIND WHATSOEVER INCLUDING ANY
+ implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ See the GNU General Public License for more details.
  *
-  You should have received a copy of the GNU General Public License
-  along with this program; if not, write to the Free Software
-  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  *
  */
 #include "platform.h"
 #include "divasync.h"
 #include "di.h"
 #if !defined USE_EXTENDED_DEBUGS
-  #include "dimaint.h"
+#include "dimaint.h"
 #else
-  #define dprintf
+#define dprintf
 #endif
 #include "dfifo.h"
-int diva_istream_write (void* context,
-             int   Id,
-              void* data,
-             int length,
-             int final,
-            byte usr1,
-            byte usr2);
-int diva_istream_read (void* context,
-            int Id,
-            void* data,
-            int max_length,
-            int* final,
-            byte* usr1,
-            byte* usr2);
+int diva_istream_write(void *context,
+                      int   Id,
+                      void *data,
+                      int length,
+                      int final,
+                      byte usr1,
+                      byte usr2);
+int diva_istream_read(void *context,
+                     int Id,
+                     void *data,
+                     int max_length,
+                     int *final,
+                     byte *usr1,
+                     byte *usr2);
 /* -------------------------------------------------------------------
-  Does provide iStream interface to the client
+   Does provide iStream interface to the client
    ------------------------------------------------------------------- */
-void diva_xdi_provide_istream_info (ADAPTER* a,
-                  diva_xdi_stream_interface_t* pi) {
-  pi->provided_service = 0;
+void diva_xdi_provide_istream_info(ADAPTER *a,
+                                  diva_xdi_stream_interface_t *pi) {
+       pi->provided_service = 0;
 }
 /* ------------------------------------------------------------------
-  Does write the data from caller's buffer to the card's
-  stream interface.
-  If synchronous service was requested, then function
-  does return amount of data written to stream.
-  'final' does indicate that piece of data to be written is
-  final part of frame (necessary only by structured datatransfer)
-  return  0 if zero lengh packet was written
-  return -1 if stream is full
-  ------------------------------------------------------------------ */
-int diva_istream_write (void* context,
-                int   Id,
-                  void* data,
-                 int length,
-                 int final,
-                byte usr1,
-                byte usr2) {
- ADAPTER* a = (ADAPTER*)context;
- int written = 0, to_write = -1;
- char tmp[4];
- byte* data_ptr = (byte*)data;
- for (;;) {
-  a->ram_in_dw (a,
+   Does write the data from caller's buffer to the card's
+   stream interface.
+   If synchronous service was requested, then function
+   does return amount of data written to stream.
+   'final' does indicate that piece of data to be written is
+   final part of frame (necessary only by structured datatransfer)
+   return  0 if zero lengh packet was written
+   return -1 if stream is full
+   ------------------------------------------------------------------ */
+int diva_istream_write(void *context,
+                      int Id,
+                      void *data,
+                      int length,
+                      int final,
+                      byte usr1,
+                      byte usr2) {
+       ADAPTER *a = (ADAPTER *)context;
+       int written = 0, to_write = -1;
+       char tmp[4];
+       byte *data_ptr = (byte *)data;
+       for (;;) {
+               a->ram_in_dw(a,
 #ifdef PLATFORM_GT_32BIT
-         ULongToPtr(a->tx_stream[Id] + a->tx_pos[Id]),
+                             ULongToPtr(a->tx_stream[Id] + a->tx_pos[Id]),
 #else
-         (void*)(a->tx_stream[Id] + a->tx_pos[Id]),
+                             (void *)(a->tx_stream[Id] + a->tx_pos[Id]),
 #endif
-                  (dword*)&tmp[0],
-         1);
-  if (tmp[0] & DIVA_DFIFO_READY) { /* No free blocks more */
-   if (to_write < 0)
-    return (-1); /* was not able to write       */
-   break;     /* only part of message was written */
-  }
-  to_write = min(length, DIVA_DFIFO_DATA_SZ);
-  if (to_write) {
-   a->ram_out_buffer (a,
+                             (dword *)&tmp[0],
+                             1);
+               if (tmp[0] & DIVA_DFIFO_READY) { /* No free blocks more */
+                       if (to_write < 0)
+                               return (-1); /* was not able to write       */
+                       break;     /* only part of message was written */
+               }
+               to_write = min(length, DIVA_DFIFO_DATA_SZ);
+               if (to_write) {
+                       a->ram_out_buffer(a,
 #ifdef PLATFORM_GT_32BIT
-            ULongToPtr(a->tx_stream[Id] + a->tx_pos[Id]+4),
+                                          ULongToPtr(a->tx_stream[Id] + a->tx_pos[Id] + 4),
 #else
-              (void*)(a->tx_stream[Id] + a->tx_pos[Id] + 4),
+                                          (void *)(a->tx_stream[Id] + a->tx_pos[Id] + 4),
 #endif
-                         data_ptr,
-             (word)to_write);
-   length  -= to_write;
-   written  += to_write;
-   data_ptr += to_write;
-  }
-  tmp[1] = (char)to_write;
-  tmp[0] = (tmp[0] & DIVA_DFIFO_WRAP) |
-       DIVA_DFIFO_READY |
-       ((!length && final) ? DIVA_DFIFO_LAST : 0);
-  if (tmp[0] & DIVA_DFIFO_LAST) {
-   tmp[2] = usr1;
-   tmp[3] = usr2;
-  }
-    a->ram_out_dw (a,
+                                          data_ptr,
+                                          (word)to_write);
+                       length  -= to_write;
+                       written  += to_write;
+                       data_ptr += to_write;
+               }
+               tmp[1] = (char)to_write;
+               tmp[0] = (tmp[0] & DIVA_DFIFO_WRAP) |
+                       DIVA_DFIFO_READY |
+                       ((!length && final) ? DIVA_DFIFO_LAST : 0);
+               if (tmp[0] & DIVA_DFIFO_LAST) {
+                       tmp[2] = usr1;
+                       tmp[3] = usr2;
+               }
+               a->ram_out_dw(a,
 #ifdef PLATFORM_GT_32BIT
-         ULongToPtr(a->tx_stream[Id] + a->tx_pos[Id]),
+                              ULongToPtr(a->tx_stream[Id] + a->tx_pos[Id]),
 #else
-           (void*)(a->tx_stream[Id] + a->tx_pos[Id]),
+                              (void *)(a->tx_stream[Id] + a->tx_pos[Id]),
 #endif
-                   (dword*)&tmp[0],
-          1);
-  if (tmp[0] & DIVA_DFIFO_WRAP) {
-   a->tx_pos[Id]  = 0;
-  } else {
-   a->tx_pos[Id] += DIVA_DFIFO_STEP;
-  }
-  if (!length) {
-   break;
-  }
- }
- return (written);
+                              (dword *)&tmp[0],
+                              1);
+               if (tmp[0] & DIVA_DFIFO_WRAP) {
+                       a->tx_pos[Id]  = 0;
+               } else {
+                       a->tx_pos[Id] += DIVA_DFIFO_STEP;
+               }
+               if (!length) {
+                       break;
+               }
+       }
+       return (written);
 }
 /* -------------------------------------------------------------------
-  In case of SYNCRONOUS service:
-  Does write data from stream in caller's buffer.
-  Does return amount of data written to buffer
-  Final flag is set on return if last part of structured frame
-  was received
-  return 0  if zero packet was received
-  return -1 if stream is empty
-    return -2 if read buffer does not profide sufficient space
-              to accommodate entire segment
-  max_length should be at least 68 bytes
-  ------------------------------------------------------------------- */
-int diva_istream_read (void* context,
-                int Id,
-                void* data,
-                int max_length,
-                int* final,
-               byte* usr1,
-               byte* usr2) {
- ADAPTER* a = (ADAPTER*)context;
- int read = 0, to_read = -1;
- char tmp[4];
- byte* data_ptr = (byte*)data;
- *final = 0;
- for (;;) {
-  a->ram_in_dw (a,
+   In case of SYNCRONOUS service:
+   Does write data from stream in caller's buffer.
+   Does return amount of data written to buffer
+   Final flag is set on return if last part of structured frame
+   was received
+   return 0  if zero packet was received
+   return -1 if stream is empty
+   return -2 if read buffer does not profide sufficient space
+   to accommodate entire segment
+   max_length should be at least 68 bytes
+   ------------------------------------------------------------------- */
+int diva_istream_read(void *context,
+                     int Id,
+                     void *data,
+                     int max_length,
+                     int *final,
+                     byte *usr1,
+                     byte *usr2) {
+       ADAPTER *a = (ADAPTER *)context;
+       int read = 0, to_read = -1;
+       char tmp[4];
+       byte *data_ptr = (byte *)data;
+       *final = 0;
+       for (;;) {
+               a->ram_in_dw(a,
 #ifdef PLATFORM_GT_32BIT
-         ULongToPtr(a->rx_stream[Id] + a->rx_pos[Id]),
+                             ULongToPtr(a->rx_stream[Id] + a->rx_pos[Id]),
 #else
-         (void*)(a->rx_stream[Id] + a->rx_pos[Id]),
+                             (void *)(a->rx_stream[Id] + a->rx_pos[Id]),
 #endif
-                  (dword*)&tmp[0],
-         1);
-  if (tmp[1] > max_length) {
-   if (to_read < 0)
-    return (-2); /* was not able to read */
-   break;
-    }
-  if (!(tmp[0] & DIVA_DFIFO_READY)) {
-   if (to_read < 0)
-    return (-1); /* was not able to read */
-   break;
-  }
-  to_read = min(max_length, (int)tmp[1]);
-  if (to_read) {
-   a->ram_in_buffer(a,
+                             (dword *)&tmp[0],
+                             1);
+               if (tmp[1] > max_length) {
+                       if (to_read < 0)
+                               return (-2); /* was not able to read */
+                       break;
+               }
+               if (!(tmp[0] & DIVA_DFIFO_READY)) {
+                       if (to_read < 0)
+                               return (-1); /* was not able to read */
+                       break;
+               }
+               to_read = min(max_length, (int)tmp[1]);
+               if (to_read) {
+                       a->ram_in_buffer(a,
 #ifdef PLATFORM_GT_32BIT
-           ULongToPtr(a->rx_stream[Id] + a->rx_pos[Id] + 4),
+                                        ULongToPtr(a->rx_stream[Id] + a->rx_pos[Id] + 4),
 #else
-            (void*)(a->rx_stream[Id] + a->rx_pos[Id] + 4),
+                                        (void *)(a->rx_stream[Id] + a->rx_pos[Id] + 4),
 #endif
-                       data_ptr,
-            (word)to_read);
-   max_length -= to_read;
-   read     += to_read;
-   data_ptr  += to_read;
-  }
-  if (tmp[0] & DIVA_DFIFO_LAST) {
-   *final = 1;
-  }
-  tmp[0] &= DIVA_DFIFO_WRAP;
-    a->ram_out_dw(a,
+                                        data_ptr,
+                                        (word)to_read);
+                       max_length -= to_read;
+                       read     += to_read;
+                       data_ptr  += to_read;
+               }
+               if (tmp[0] & DIVA_DFIFO_LAST) {
+                       *final = 1;
+               }
+               tmp[0] &= DIVA_DFIFO_WRAP;
+               a->ram_out_dw(a,
 #ifdef PLATFORM_GT_32BIT
-         ULongToPtr(a->rx_stream[Id] + a->rx_pos[Id]),
+                             ULongToPtr(a->rx_stream[Id] + a->rx_pos[Id]),
 #else
-         (void*)(a->rx_stream[Id] + a->rx_pos[Id]),
+                             (void *)(a->rx_stream[Id] + a->rx_pos[Id]),
 #endif
-         (dword*)&tmp[0],
-         1);
-  if (tmp[0] & DIVA_DFIFO_WRAP) {
-   a->rx_pos[Id]  = 0;
-  } else {
-   a->rx_pos[Id] += DIVA_DFIFO_STEP;
-  }
-  if (*final) {
-   if (usr1)
-    *usr1 = tmp[2];
-   if (usr2)
-    *usr2 = tmp[3];
-   break;
-  }
- }
- return (read);
+                             (dword *)&tmp[0],
+                             1);
+               if (tmp[0] & DIVA_DFIFO_WRAP) {
+                       a->rx_pos[Id]  = 0;
+               } else {
+                       a->rx_pos[Id] += DIVA_DFIFO_STEP;
+               }
+               if (*final) {
+                       if (usr1)
+                               *usr1 = tmp[2];
+                       if (usr2)
+                               *usr2 = tmp[3];
+                       break;
+               }
+       }
+       return (read);
 }
 /* ---------------------------------------------------------------------
-  Does check if one of streams had caused interrupt and does
-  wake up corresponding application
+   Does check if one of streams had caused interrupt and does
+   wake up corresponding application
    --------------------------------------------------------------------- */
-void pr_stream (ADAPTER * a) {
+void pr_stream(ADAPTER *a) {
 }
 #endif /* } */
index 203189a..894fdfd 100644 (file)
@@ -1,25 +1,25 @@
 /*
  *
-  Copyright (c) Eicon Networks, 2000.
+ Copyright (c) Eicon Networks, 2000.
  *
-  This source file is supplied for the use with
-  Eicon Networks range of DIVA Server Adapters.
+ This source file is supplied for the use with
+ Eicon Networks range of DIVA Server Adapters.
  *
-  Eicon File Revision :    1.9
+ Eicon File Revision :    1.9
  *
-  This program is free software; you can redistribute it and/or modify
-  it under the terms of the GNU General Public License as published by
-  the Free Software Foundation; either version 2, or (at your option)
-  any later version.
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
  *
-  This program is distributed in the hope that it will be useful,
-  but WITHOUT ANY WARRANTY OF ANY KIND WHATSOEVER INCLUDING ANY
-  implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-  See the GNU General Public License for more details.
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY OF ANY KIND WHATSOEVER INCLUDING ANY
+ implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ See the GNU General Public License for more details.
  *
-  You should have received a copy of the GNU General Public License
-  along with this program; if not, write to the Free Software
-  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  *
  */
 #ifndef __DIVA_EICON_TRACE_API__
@@ -35,9 +35,9 @@ typedef struct _diva_trace_ie {
 } diva_trace_ie_t;
 
 /*
-       Structure used to represent "State\\BX\\Modem" directory
-       to user.
-       */
+  Structure used to represent "State\\BX\\Modem" directory
+  to user.
+*/
 typedef struct _diva_trace_modem_state {
        dword   ChannelNumber;
 
@@ -70,8 +70,8 @@ typedef struct _diva_trace_modem_state {
 } diva_trace_modem_state_t;
 
 /*
-       Representation of "State\\BX\\FAX" directory
-       */
+  Representation of "State\\BX\\FAX" directory
+*/
 typedef struct _diva_trace_fax_state {
        dword   ChannelNumber;
        dword Event;
@@ -90,9 +90,9 @@ typedef struct _diva_trace_fax_state {
 } diva_trace_fax_state_t;
 
 /*
-       Structure used to represent Interface State in the abstract
-       and interface/D-channel protocol independent form.
-       */
+  Structure used to represent Interface State in the abstract
+  and interface/D-channel protocol independent form.
+*/
 typedef struct _diva_trace_interface_state {
        char Layer1[DIVA_TRACE_LINE_TYPE_LEN];
        char Layer2[DIVA_TRACE_LINE_TYPE_LEN];
@@ -164,18 +164,18 @@ typedef struct _diva_prot_statistics {
 typedef struct _diva_ifc_statistics {
        diva_incoming_call_statistics_t inc;
        diva_outgoing_call_statistics_t outg;
-       diva_modem_call_statistics_t            mdm;
-       diva_fax_call_statistics_t                      fax;
-       diva_prot_statistics_t                                  b1;
-       diva_prot_statistics_t                                  b2;
-       diva_prot_statistics_t                                  d1;
-       diva_prot_statistics_t                                  d2;
+       diva_modem_call_statistics_t mdm;
+       diva_fax_call_statistics_t fax;
+       diva_prot_statistics_t b1;
+       diva_prot_statistics_t b2;
+       diva_prot_statistics_t d1;
+       diva_prot_statistics_t d2;
 } diva_ifc_statistics_t;
 
 /*
-       Structure used to represent "State\\BX" directory
-       to user.
-       */
+  Structure used to represent "State\\BX" directory
+  to user.
+*/
 typedef struct _diva_trace_line_state {
        dword   ChannelNumber;
 
@@ -192,9 +192,9 @@ typedef struct _diva_trace_line_state {
        char LocalAddress[DIVA_TRACE_LINE_TYPE_LEN];
        char LocalSubAddress[DIVA_TRACE_LINE_TYPE_LEN];
 
-       diva_trace_ie_t call_BC;
-       diva_trace_ie_t call_HLC;
-       diva_trace_ie_t call_LLC;
+       diva_trace_ie_t call_BC;
+       diva_trace_ie_t call_HLC;
+       diva_trace_ie_t call_LLC;
 
        dword Charges;
 
@@ -205,11 +205,11 @@ typedef struct _diva_trace_line_state {
        char UserID[DIVA_TRACE_LINE_TYPE_LEN];
 
        diva_trace_modem_state_t modem;
-       diva_trace_fax_state_t   fax;
+       diva_trace_fax_state_t fax;
 
-       diva_trace_interface_state_t* pInterface;
+       diva_trace_interface_state_t *pInterface;
 
-       diva_ifc_statistics_t*                          pInterfaceStat;
+       diva_ifc_statistics_t *pInterfaceStat;
 
 } diva_trace_line_state_t;
 
@@ -222,115 +222,114 @@ typedef struct _diva_trace_line_state {
 #define DIVA_SUPER_TRACE_NOTIFY_FAX_STAT_CHANGE         ('F')
 
 struct _diva_strace_library_interface;
-typedef void (*diva_trace_channel_state_change_proc_t)(void* user_context,
-                                                       struct _diva_strace_library_interface* hLib,
-                                                       int Adapter,
-                                                       diva_trace_line_state_t* channel, int notify_subject);
-typedef void (*diva_trace_channel_trace_proc_t)(void* user_context,
-                                                       struct _diva_strace_library_interface* hLib,
-                                                       int Adapter, void* xlog_buffer, int length);
-typedef void (*diva_trace_error_proc_t)(void* user_context,
-                                                       struct _diva_strace_library_interface* hLib,
-                                                       int Adapter,
-                                                       int error, const char* file, int line);
+typedef void (*diva_trace_channel_state_change_proc_t)(void *user_context,
+                                                      struct _diva_strace_library_interface *hLib,
+                                                      int Adapter,
+                                                      diva_trace_line_state_t *channel, int notify_subject);
+typedef void (*diva_trace_channel_trace_proc_t)(void *user_context,
+                                               struct _diva_strace_library_interface *hLib,
+                                               int Adapter, void *xlog_buffer, int length);
+typedef void (*diva_trace_error_proc_t)(void *user_context,
+                                       struct _diva_strace_library_interface *hLib,
+                                       int Adapter,
+                                       int error, const char *file, int line);
 
 /*
-       This structure creates interface from user to library
-       */
+  This structure creates interface from user to library
+*/
 typedef struct _diva_trace_library_user_interface {
-       void*                                                                                                                                           user_context;
-       diva_trace_channel_state_change_proc_t  notify_proc;
-       diva_trace_channel_trace_proc_t                                 trace_proc;
-       diva_trace_error_proc_t                                                                 error_notify_proc;
+       void *user_context;
+       diva_trace_channel_state_change_proc_t notify_proc;
+       diva_trace_channel_trace_proc_t trace_proc;
+       diva_trace_error_proc_t error_notify_proc;
 } diva_trace_library_user_interface_t;
 
 /*
-       Interface from Library to User
-       */
-typedef int   (*DivaSTraceLibraryStart_proc_t)(void* hLib);
-typedef int   (*DivaSTraceLibraryFinit_proc_t)(void* hLib);
-typedef int   (*DivaSTraceMessageInput_proc_t)(void* hLib);
-typedef void*  (*DivaSTraceGetHandle_proc_t)(void* hLib);
+  Interface from Library to User
+*/
+typedef int (*DivaSTraceLibraryStart_proc_t)(void *hLib);
+typedef int (*DivaSTraceLibraryFinit_proc_t)(void *hLib);
+typedef int (*DivaSTraceMessageInput_proc_t)(void *hLib);
+typedef void* (*DivaSTraceGetHandle_proc_t)(void *hLib);
 
 /*
-       Turn Audio Tap trace on/off
-       Channel should be in the range 1 ... Number of Channels
-       */
-typedef int (*DivaSTraceSetAudioTap_proc_t)(void* hLib, int Channel, int on);
+  Turn Audio Tap trace on/off
+  Channel should be in the range 1 ... Number of Channels
+*/
+typedef int (*DivaSTraceSetAudioTap_proc_t)(void *hLib, int Channel, int on);
 
 /*
-       Turn B-channel trace on/off
-       Channel should be in the range 1 ... Number of Channels
-       */
-typedef int (*DivaSTraceSetBChannel_proc_t)(void* hLib, int Channel, int on);
+  Turn B-channel trace on/off
+  Channel should be in the range 1 ... Number of Channels
+*/
+typedef int (*DivaSTraceSetBChannel_proc_t)(void *hLib, int Channel, int on);
 
 /*
-       Turn    D-channel (Layer1/Layer2/Layer3) trace on/off
-               Layer1 - All D-channel frames received/sent over the interface
-                                                inclusive Layer 2 headers, Layer 2 frames and TEI management frames
-               Layer2 - Events from LAPD protocol instance with SAPI of signalling protocol
-               Layer3 - All D-channel frames addressed to assigned to the card TEI and
-                                                SAPI of signalling protocol, and signalling protocol events.
-       */
-typedef int (*DivaSTraceSetDChannel_proc_t)(void* hLib, int on);
+  Turn D-channel (Layer1/Layer2/Layer3) trace on/off
+  Layer1 - All D-channel frames received/sent over the interface
+  inclusive Layer 2 headers, Layer 2 frames and TEI management frames
+  Layer2 - Events from LAPD protocol instance with SAPI of signalling protocol
+  Layer3 - All D-channel frames addressed to assigned to the card TEI and
+  SAPI of signalling protocol, and signalling protocol events.
+*/
+typedef int (*DivaSTraceSetDChannel_proc_t)(void *hLib, int on);
 
 /*
-       Get overall card statistics
-       */
-typedef int (*DivaSTraceGetOutgoingCallStatistics_proc_t)(void* hLib);
-typedef int (*DivaSTraceGetIncomingCallStatistics_proc_t)(void* hLib);
-typedef int (*DivaSTraceGetModemStatistics_proc_t)(void* hLib);
-typedef int (*DivaSTraceGetFaxStatistics_proc_t)(void* hLib);
-typedef int (*DivaSTraceGetBLayer1Statistics_proc_t)(void* hLib);
-typedef int (*DivaSTraceGetBLayer2Statistics_proc_t)(void* hLib);
-typedef int (*DivaSTraceGetDLayer1Statistics_proc_t)(void* hLib);
-typedef int (*DivaSTraceGetDLayer2Statistics_proc_t)(void* hLib);
+  Get overall card statistics
+*/
+typedef int (*DivaSTraceGetOutgoingCallStatistics_proc_t)(void *hLib);
+typedef int (*DivaSTraceGetIncomingCallStatistics_proc_t)(void *hLib);
+typedef int (*DivaSTraceGetModemStatistics_proc_t)(void *hLib);
+typedef int (*DivaSTraceGetFaxStatistics_proc_t)(void *hLib);
+typedef int (*DivaSTraceGetBLayer1Statistics_proc_t)(void *hLib);
+typedef int (*DivaSTraceGetBLayer2Statistics_proc_t)(void *hLib);
+typedef int (*DivaSTraceGetDLayer1Statistics_proc_t)(void *hLib);
+typedef int (*DivaSTraceGetDLayer2Statistics_proc_t)(void *hLib);
 
 /*
-       Call control
-       */
-typedef int (*DivaSTraceClearCall_proc_t)(void* hLib, int Channel);
+  Call control
+*/
+typedef int (*DivaSTraceClearCall_proc_t)(void *hLib, int Channel);
 
 typedef struct _diva_strace_library_interface {
-       void* hLib;
-  DivaSTraceLibraryStart_proc_t DivaSTraceLibraryStart;
-  DivaSTraceLibraryStart_proc_t DivaSTraceLibraryStop;
+       void *hLib;
+       DivaSTraceLibraryStart_proc_t DivaSTraceLibraryStart;
+       DivaSTraceLibraryStart_proc_t DivaSTraceLibraryStop;
        DivaSTraceLibraryFinit_proc_t DivaSTraceLibraryFinit;
        DivaSTraceMessageInput_proc_t DivaSTraceMessageInput;
-       DivaSTraceGetHandle_proc_t    DivaSTraceGetHandle;
-       DivaSTraceSetAudioTap_proc_t  DivaSTraceSetAudioTap;
-       DivaSTraceSetBChannel_proc_t  DivaSTraceSetBChannel;
-       DivaSTraceSetDChannel_proc_t  DivaSTraceSetDChannel;
-       DivaSTraceSetDChannel_proc_t  DivaSTraceSetInfo;
+       DivaSTraceGetHandle_proc_t DivaSTraceGetHandle;
+       DivaSTraceSetAudioTap_proc_t DivaSTraceSetAudioTap;
+       DivaSTraceSetBChannel_proc_t DivaSTraceSetBChannel;
+       DivaSTraceSetDChannel_proc_t DivaSTraceSetDChannel;
+       DivaSTraceSetDChannel_proc_t DivaSTraceSetInfo;
        DivaSTraceGetOutgoingCallStatistics_proc_t \
-                                                                                                                               DivaSTraceGetOutgoingCallStatistics;
+       DivaSTraceGetOutgoingCallStatistics;
        DivaSTraceGetIncomingCallStatistics_proc_t \
-                                                                                                                               DivaSTraceGetIncomingCallStatistics;
+       DivaSTraceGetIncomingCallStatistics;
        DivaSTraceGetModemStatistics_proc_t \
-                                                                                                                               DivaSTraceGetModemStatistics;
+       DivaSTraceGetModemStatistics;
        DivaSTraceGetFaxStatistics_proc_t \
-                                                                                                                               DivaSTraceGetFaxStatistics;
+       DivaSTraceGetFaxStatistics;
        DivaSTraceGetBLayer1Statistics_proc_t \
-                                                                                                                               DivaSTraceGetBLayer1Statistics;
+       DivaSTraceGetBLayer1Statistics;
        DivaSTraceGetBLayer2Statistics_proc_t \
-                                                                                                                               DivaSTraceGetBLayer2Statistics;
+       DivaSTraceGetBLayer2Statistics;
        DivaSTraceGetDLayer1Statistics_proc_t \
-                                                                                                                               DivaSTraceGetDLayer1Statistics;
+       DivaSTraceGetDLayer1Statistics;
        DivaSTraceGetDLayer2Statistics_proc_t \
-                                                                                                                               DivaSTraceGetDLayer2Statistics;
-       DivaSTraceClearCall_proc_t    DivaSTraceClearCall;
+       DivaSTraceGetDLayer2Statistics;
+       DivaSTraceClearCall_proc_t DivaSTraceClearCall;
 } diva_strace_library_interface_t;
 
 /*
-       Create and return Library interface
-       */
-diva_strace_library_interface_t* DivaSTraceLibraryCreateInstance (int Adapter,
-                                                                                                       const diva_trace_library_user_interface_t* user_proc,
-                          byte* pmem);
-dword DivaSTraceGetMemotyRequirement (int channels);
+  Create and return Library interface
+*/
+diva_strace_library_interface_t *DivaSTraceLibraryCreateInstance(int Adapter,
+                                                                const diva_trace_library_user_interface_t *user_proc,
+                                                                byte *pmem);
+dword DivaSTraceGetMemotyRequirement(int channels);
 
 #define DIVA_MAX_ADAPTERS  64
 #define DIVA_MAX_LINES     32
 
 #endif
-
index 534978b..2ee789f 100644 (file)
@@ -1,25 +1,25 @@
 /*
  *
-  Copyright (c) Eicon Networks, 2000.
+ Copyright (c) Eicon Networks, 2000.
  *
-  This source file is supplied for the use with
-  Eicon Networks range of DIVA Server Adapters.
+ This source file is supplied for the use with
+ Eicon Networks range of DIVA Server Adapters.
  *
-  Eicon File Revision :    1.9
+ Eicon File Revision :    1.9
  *
-  This program is free software; you can redistribute it and/or modify
-  it under the terms of the GNU General Public License as published by
-  the Free Software Foundation; either version 2, or (at your option)
-  any later version.
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
  *
-  This program is distributed in the hope that it will be useful,
-  but WITHOUT ANY WARRANTY OF ANY KIND WHATSOEVER INCLUDING ANY
-  implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-  See the GNU General Public License for more details.
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY OF ANY KIND WHATSOEVER INCLUDING ANY
+ implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ See the GNU General Public License for more details.
  *
-  You should have received a copy of the GNU General Public License
-  along with this program; if not, write to the Free Software
-  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  *
  */
 #include "platform.h"
@@ -30,7 +30,7 @@
 #include "man_defs.h"
 
 
-extern void diva_mnt_internal_dprintf (dword drv_id, dword type, char* p, ...);
+extern void diva_mnt_internal_dprintf(dword drv_id, dword type, char *p, ...);
 
 #define MODEM_PARSE_ENTRIES  16 /* amount of variables of interest */
 #define FAX_PARSE_ENTRIES    12 /* amount of variables of interest */
@@ -38,77 +38,77 @@ extern void diva_mnt_internal_dprintf (dword drv_id, dword type, char* p, ...);
 #define STAT_PARSE_ENTRIES   70 /* amount of variables of interest */
 
 /*
-       LOCAL FUNCTIONS
-       */
-static int DivaSTraceLibraryStart (void* hLib);
-static int DivaSTraceLibraryStop  (void* hLib);
-static int SuperTraceLibraryFinit (void* hLib);
-static void*   SuperTraceGetHandle (void* hLib);
-static int SuperTraceMessageInput (void* hLib);
-static int SuperTraceSetAudioTap  (void* hLib, int Channel, int on);
-static int SuperTraceSetBChannel  (void* hLib, int Channel, int on);
-static int SuperTraceSetDChannel  (void* hLib, int on);
-static int SuperTraceSetInfo      (void* hLib, int on);
-static int SuperTraceClearCall (void* hLib, int Channel);
-static int SuperTraceGetOutgoingCallStatistics (void* hLib);
-static int SuperTraceGetIncomingCallStatistics (void* hLib);
-static int SuperTraceGetModemStatistics (void* hLib);
-static int SuperTraceGetFaxStatistics (void* hLib);
-static int SuperTraceGetBLayer1Statistics (void* hLib);
-static int SuperTraceGetBLayer2Statistics (void* hLib);
-static int SuperTraceGetDLayer1Statistics (void* hLib);
-static int SuperTraceGetDLayer2Statistics (void* hLib);
+  LOCAL FUNCTIONS
+*/
+static int DivaSTraceLibraryStart(void *hLib);
+static int DivaSTraceLibraryStop(void *hLib);
+static int SuperTraceLibraryFinit(void *hLib);
+static void *SuperTraceGetHandle(void *hLib);
+static int SuperTraceMessageInput(void *hLib);
+static int SuperTraceSetAudioTap(void *hLib, int Channel, int on);
+static int SuperTraceSetBChannel(void *hLib, int Channel, int on);
+static int SuperTraceSetDChannel(void *hLib, int on);
+static int SuperTraceSetInfo(void *hLib, int on);
+static int SuperTraceClearCall(void *hLib, int Channel);
+static int SuperTraceGetOutgoingCallStatistics(void *hLib);
+static int SuperTraceGetIncomingCallStatistics(void *hLib);
+static int SuperTraceGetModemStatistics(void *hLib);
+static int SuperTraceGetFaxStatistics(void *hLib);
+static int SuperTraceGetBLayer1Statistics(void *hLib);
+static int SuperTraceGetBLayer2Statistics(void *hLib);
+static int SuperTraceGetDLayer1Statistics(void *hLib);
+static int SuperTraceGetDLayer2Statistics(void *hLib);
 
 /*
-       LOCAL FUNCTIONS
-       */
-static int ScheduleNextTraceRequest (diva_strace_context_t* pLib);
-static int process_idi_event (diva_strace_context_t* pLib,
-                                                                                                                       diva_man_var_header_t* pVar);
-static int process_idi_info  (diva_strace_context_t* pLib,
-                                                                                                                       diva_man_var_header_t* pVar);
-static int diva_modem_event (diva_strace_context_t* pLib, int Channel);
-static int diva_fax_event   (diva_strace_context_t* pLib, int Channel);
-static int diva_line_event (diva_strace_context_t* pLib, int Channel);
-static int diva_modem_info (diva_strace_context_t* pLib,
-                                                                                                               int Channel,
-                                                                                                               diva_man_var_header_t* pVar);
-static int diva_fax_info   (diva_strace_context_t* pLib,
-                                                                                                               int Channel,
-                                                                                                               diva_man_var_header_t* pVar);
-static int diva_line_info  (diva_strace_context_t* pLib,
-                                                                                                               int Channel,
-                                                                                                               diva_man_var_header_t* pVar);
-static int diva_ifc_statistics (diva_strace_context_t* pLib,
-                                                                                                                               diva_man_var_header_t* pVar);
-static diva_man_var_header_t* get_next_var (diva_man_var_header_t* pVar);
-static diva_man_var_header_t* find_var (diva_man_var_header_t* pVar,
-                                                                                                                                                               const char* name);
-static int diva_strace_read_int  (diva_man_var_header_t* pVar, int* var);
-static int diva_strace_read_uint (diva_man_var_header_t* pVar, dword* var);
-static int diva_strace_read_asz  (diva_man_var_header_t* pVar, char* var);
-static int diva_strace_read_asc  (diva_man_var_header_t* pVar, char* var);
-static int  diva_strace_read_ie  (diva_man_var_header_t* pVar,
-                                                                                                                                       diva_trace_ie_t* var);
-static void diva_create_parse_table (diva_strace_context_t* pLib);
-static void diva_trace_error (diva_strace_context_t* pLib,
-                                                                                                                       int error, const char* file, int line);
-static void diva_trace_notify_user (diva_strace_context_t* pLib,
-                                                                                                                int Channel,
-                                                                                                                int notify_subject);
-static int diva_trace_read_variable (diva_man_var_header_t* pVar,
-                                                                                                                                                void* variable);
+  LOCAL FUNCTIONS
+*/
+static int ScheduleNextTraceRequest(diva_strace_context_t *pLib);
+static int process_idi_event(diva_strace_context_t *pLib,
+                            diva_man_var_header_t *pVar);
+static int process_idi_info(diva_strace_context_t *pLib,
+                           diva_man_var_header_t *pVar);
+static int diva_modem_event(diva_strace_context_t *pLib, int Channel);
+static int diva_fax_event(diva_strace_context_t *pLib, int Channel);
+static int diva_line_event(diva_strace_context_t *pLib, int Channel);
+static int diva_modem_info(diva_strace_context_t *pLib,
+                          int Channel,
+                          diva_man_var_header_t *pVar);
+static int diva_fax_info(diva_strace_context_t *pLib,
+                        int Channel,
+                        diva_man_var_header_t *pVar);
+static int diva_line_info(diva_strace_context_t *pLib,
+                         int Channel,
+                         diva_man_var_header_t *pVar);
+static int diva_ifc_statistics(diva_strace_context_t *pLib,
+                              diva_man_var_header_t *pVar);
+static diva_man_var_header_t *get_next_var(diva_man_var_header_t *pVar);
+static diva_man_var_header_t *find_var(diva_man_var_header_t *pVar,
+                                      const char *name);
+static int diva_strace_read_int(diva_man_var_header_t *pVar, int *var);
+static int diva_strace_read_uint(diva_man_var_header_t *pVar, dword *var);
+static int diva_strace_read_asz(diva_man_var_header_t *pVar, char *var);
+static int diva_strace_read_asc(diva_man_var_header_t *pVar, char *var);
+static int diva_strace_read_ie(diva_man_var_header_t *pVar,
+                              diva_trace_ie_t *var);
+static void diva_create_parse_table(diva_strace_context_t *pLib);
+static void diva_trace_error(diva_strace_context_t *pLib,
+                            int error, const char *file, int line);
+static void diva_trace_notify_user(diva_strace_context_t *pLib,
+                                  int Channel,
+                                  int notify_subject);
+static int diva_trace_read_variable(diva_man_var_header_t *pVar,
+                                   void *variable);
 
 /*
-       Initialize the library and return context
-       of the created trace object that will represent
-       the IDI adapter.
-       Return 0 on error.
-       */
-diva_strace_library_interface_t* DivaSTraceLibraryCreateInstance (int Adapter,
-                                                                                       const diva_trace_library_user_interface_t* user_proc,
-                      byte* pmem) {
-       diva_strace_context_t* pLib = (diva_strace_context_t*)pmem;
+  Initialize the library and return context
+  of the created trace object that will represent
+  the IDI adapter.
+  Return 0 on error.
+*/
+diva_strace_library_interface_t *DivaSTraceLibraryCreateInstance(int Adapter,
+                                                                const diva_trace_library_user_interface_t *user_proc,
+                                                                byte *pmem) {
+       diva_strace_context_t *pLib = (diva_strace_context_t *)pmem;
        int i;
 
        if (!pLib) {
@@ -121,11 +121,11 @@ diva_strace_library_interface_t* DivaSTraceLibraryCreateInstance (int Adapter,
        pLib->Adapter  = Adapter;
 
        /*
-               Set up Library Interface
-               */
+         Set up Library Interface
+       */
        pLib->instance.hLib                                = pLib;
-  pLib->instance.DivaSTraceLibraryStart              = DivaSTraceLibraryStart;
-  pLib->instance.DivaSTraceLibraryStop               = DivaSTraceLibraryStop;
+       pLib->instance.DivaSTraceLibraryStart              = DivaSTraceLibraryStart;
+       pLib->instance.DivaSTraceLibraryStop               = DivaSTraceLibraryStop;
        pLib->instance.DivaSTraceLibraryFinit              = SuperTraceLibraryFinit;
        pLib->instance.DivaSTraceMessageInput              = SuperTraceMessageInput;
        pLib->instance.DivaSTraceGetHandle                 = SuperTraceGetHandle;
@@ -134,21 +134,21 @@ diva_strace_library_interface_t* DivaSTraceLibraryCreateInstance (int Adapter,
        pLib->instance.DivaSTraceSetDChannel               = SuperTraceSetDChannel;
        pLib->instance.DivaSTraceSetInfo                   = SuperTraceSetInfo;
        pLib->instance.DivaSTraceGetOutgoingCallStatistics = \
-                                                                                                                                                       SuperTraceGetOutgoingCallStatistics;
+               SuperTraceGetOutgoingCallStatistics;
        pLib->instance.DivaSTraceGetIncomingCallStatistics = \
-                                                                                                                                                       SuperTraceGetIncomingCallStatistics;
+               SuperTraceGetIncomingCallStatistics;
        pLib->instance.DivaSTraceGetModemStatistics        = \
-                                                                                                                                                       SuperTraceGetModemStatistics;
+               SuperTraceGetModemStatistics;
        pLib->instance.DivaSTraceGetFaxStatistics          = \
-                                                                                                                                                       SuperTraceGetFaxStatistics;
+               SuperTraceGetFaxStatistics;
        pLib->instance.DivaSTraceGetBLayer1Statistics      = \
-                                                                                                                                                       SuperTraceGetBLayer1Statistics;
+               SuperTraceGetBLayer1Statistics;
        pLib->instance.DivaSTraceGetBLayer2Statistics      = \
-                                                                                                                                                       SuperTraceGetBLayer2Statistics;
+               SuperTraceGetBLayer2Statistics;
        pLib->instance.DivaSTraceGetDLayer1Statistics      = \
-                                                                                                                                                       SuperTraceGetDLayer1Statistics;
+               SuperTraceGetDLayer1Statistics;
        pLib->instance.DivaSTraceGetDLayer2Statistics      = \
-                                                                                                                                                       SuperTraceGetDLayer2Statistics;
+               SuperTraceGetDLayer2Statistics;
        pLib->instance.DivaSTraceClearCall                 = SuperTraceClearCall;
 
 
@@ -159,272 +159,272 @@ diva_strace_library_interface_t* DivaSTraceLibraryCreateInstance (int Adapter,
                pLib->user_proc_table.error_notify_proc = user_proc->error_notify_proc;
        }
 
-       if (!(pLib->hAdapter = SuperTraceOpenAdapter (Adapter))) {
-    diva_mnt_internal_dprintf (0, DLI_ERR, "Can not open XDI adapter");
+       if (!(pLib->hAdapter = SuperTraceOpenAdapter(Adapter))) {
+               diva_mnt_internal_dprintf(0, DLI_ERR, "Can not open XDI adapter");
                return NULL;
        }
-       pLib->Channels = SuperTraceGetNumberOfChannels (pLib->hAdapter);
+       pLib->Channels = SuperTraceGetNumberOfChannels(pLib->hAdapter);
 
        /*
-               Calculate amount of parte table entites necessary to translate
-               information from all events of onterest
-               */
+         Calculate amount of parte table entites necessary to translate
+         information from all events of onterest
+       */
        pLib->parse_entries = (MODEM_PARSE_ENTRIES + FAX_PARSE_ENTRIES + \
-                                                                                                STAT_PARSE_ENTRIES + \
-                                                                                                LINE_PARSE_ENTRIES + 1) * pLib->Channels;
-       pLib->parse_table = (diva_strace_path2action_t*)pmem;
+                              STAT_PARSE_ENTRIES + \
+                              LINE_PARSE_ENTRIES + 1) * pLib->Channels;
+       pLib->parse_table = (diva_strace_path2action_t *)pmem;
 
        for (i = 0; i < 30; i++) {
                pLib->lines[i].pInterface     = &pLib->Interface;
                pLib->lines[i].pInterfaceStat = &pLib->InterfaceStat;
        }
 
-  pLib->e.R = &pLib->RData;
+       pLib->e.R = &pLib->RData;
 
        pLib->req_busy = 1;
        pLib->rc_ok    = ASSIGN_OK;
 
-       diva_create_parse_table (pLib);
+       diva_create_parse_table(pLib);
 
-       return ((diva_strace_library_interface_t*)pLib);
+       return ((diva_strace_library_interface_t *)pLib);
 }
 
-static int DivaSTraceLibraryStart (void* hLib) {
-  diva_strace_context_t* pLib = (diva_strace_context_t*)hLib;
+static int DivaSTraceLibraryStart(void *hLib) {
+       diva_strace_context_t *pLib = (diva_strace_context_t *)hLib;
 
-  return (SuperTraceASSIGN (pLib->hAdapter, pLib->buffer));
+       return (SuperTraceASSIGN(pLib->hAdapter, pLib->buffer));
 }
 
 /*
   Return (-1) on error
   Return (0) if was initiated or pending
   Return (1) if removal is complete
-  */
-static int DivaSTraceLibraryStop  (void* hLib) {
-  diva_strace_context_t* pLib = (diva_strace_context_t*)hLib;
+*/
+static int DivaSTraceLibraryStop(void *hLib) {
+       diva_strace_context_t *pLib = (diva_strace_context_t *)hLib;
 
-  if (!pLib->e.Id) { /* Was never started/assigned */
-    return (1);
-  }
+       if (!pLib->e.Id) { /* Was never started/assigned */
+               return (1);
+       }
 
-  switch (pLib->removal_state) {
-    case 0:
-      pLib->removal_state = 1;
-      ScheduleNextTraceRequest(pLib);
-      break;
+       switch (pLib->removal_state) {
+       case 0:
+               pLib->removal_state = 1;
+               ScheduleNextTraceRequest(pLib);
+               break;
 
-    case 3:
-      return (1);
-  }
+       case 3:
+               return (1);
+       }
 
-  return (0);
+       return (0);
 }
 
-static int SuperTraceLibraryFinit (void* hLib) {
-       diva_strace_context_t* pLib = (diva_strace_context_t*)hLib;
+static int SuperTraceLibraryFinit(void *hLib) {
+       diva_strace_context_t *pLib = (diva_strace_context_t *)hLib;
        if (pLib) {
                if (pLib->hAdapter) {
-                       SuperTraceCloseAdapter  (pLib->hAdapter);
+                       SuperTraceCloseAdapter(pLib->hAdapter);
                }
                return (0);
        }
        return (-1);
 }
 
-static void*   SuperTraceGetHandle (void* hLib) {
-       diva_strace_context_t* pLib = (diva_strace_context_t*)hLib;
+static void *SuperTraceGetHandle(void *hLib) {
+       diva_strace_context_t *pLib = (diva_strace_context_t *)hLib;
 
-  return (&pLib->e);
+       return (&pLib->e);
 }
 
 /*
-       After library handle object is gone in signaled state
-       this function should be called and will pick up incoming
-       IDI messages (return codes and indications).
-       */
-static int SuperTraceMessageInput (void* hLib) {
-       diva_strace_context_t* pLib = (diva_strace_context_t*)hLib;
+  After library handle object is gone in signaled state
+  this function should be called and will pick up incoming
+  IDI messages (return codes and indications).
+*/
+static int SuperTraceMessageInput(void *hLib) {
+       diva_strace_context_t *pLib = (diva_strace_context_t *)hLib;
        int ret = 0;
-  byte Rc, Ind;
+       byte Rc, Ind;
 
-  if (pLib->e.complete == 255) {
-    /*
-      Process return code
-      */
-    pLib->req_busy = 0;
-    Rc             = pLib->e.Rc;
-    pLib->e.Rc     = 0;
+       if (pLib->e.complete == 255) {
+               /*
+                 Process return code
+               */
+               pLib->req_busy = 0;
+               Rc             = pLib->e.Rc;
+               pLib->e.Rc     = 0;
 
-    if (pLib->removal_state == 2) {
-      pLib->removal_state = 3;
-      return (0);
-    }
+               if (pLib->removal_state == 2) {
+                       pLib->removal_state = 3;
+                       return (0);
+               }
 
                if (Rc != pLib->rc_ok) {
-      int ignore = 0;
-      /*
-        Auto-detect amount of events/channels and features
-        */
-      if (pLib->general_b_ch_event == 1) {
-        pLib->general_b_ch_event = 2;
-        ignore = 1;
-      } else if (pLib->general_fax_event == 1) {
-        pLib->general_fax_event = 2;
-        ignore = 1;
-      } else if (pLib->general_mdm_event == 1) {
-        pLib->general_mdm_event = 2;
-        ignore = 1;
-      } else if ((pLib->ChannelsTraceActive < pLib->Channels) && pLib->ChannelsTraceActive) {
-        pLib->ChannelsTraceActive = pLib->Channels;
-        ignore = 1;
-      } else if (pLib->ModemTraceActive < pLib->Channels) {
-        pLib->ModemTraceActive = pLib->Channels;
-        ignore = 1;
-      } else if (pLib->FaxTraceActive < pLib->Channels) {
-        pLib->FaxTraceActive = pLib->Channels;
-        ignore = 1;
-      } else if (pLib->audio_trace_init == 2) {
-        ignore = 1;
-        pLib->audio_trace_init = 1;
-      } else if (pLib->eye_pattern_pending) {
+                       int ignore = 0;
+                       /*
+                         Auto-detect amount of events/channels and features
+                       */
+                       if (pLib->general_b_ch_event == 1) {
+                               pLib->general_b_ch_event = 2;
+                               ignore = 1;
+                       } else if (pLib->general_fax_event == 1) {
+                               pLib->general_fax_event = 2;
+                               ignore = 1;
+                       } else if (pLib->general_mdm_event == 1) {
+                               pLib->general_mdm_event = 2;
+                               ignore = 1;
+                       } else if ((pLib->ChannelsTraceActive < pLib->Channels) && pLib->ChannelsTraceActive) {
+                               pLib->ChannelsTraceActive = pLib->Channels;
+                               ignore = 1;
+                       } else if (pLib->ModemTraceActive < pLib->Channels) {
+                               pLib->ModemTraceActive = pLib->Channels;
+                               ignore = 1;
+                       } else if (pLib->FaxTraceActive < pLib->Channels) {
+                               pLib->FaxTraceActive = pLib->Channels;
+                               ignore = 1;
+                       } else if (pLib->audio_trace_init == 2) {
+                               ignore = 1;
+                               pLib->audio_trace_init = 1;
+                       } else if (pLib->eye_pattern_pending) {
                                pLib->eye_pattern_pending =  0;
                                ignore = 1;
                        } else if (pLib->audio_tap_pending) {
                                pLib->audio_tap_pending = 0;
                                ignore = 1;
-      }
-
-      if (!ignore) {
-        return (-1); /* request failed */
-      }
-    } else {
-      if (pLib->general_b_ch_event == 1) {
-        pLib->ChannelsTraceActive = pLib->Channels;
-        pLib->general_b_ch_event = 2;
-      } else if (pLib->general_fax_event == 1) {
-        pLib->general_fax_event = 2;
-        pLib->FaxTraceActive = pLib->Channels;
-      } else if (pLib->general_mdm_event == 1) {
-        pLib->general_mdm_event = 2;
-        pLib->ModemTraceActive = pLib->Channels;
-      }
-    }
-    if (pLib->audio_trace_init == 2) {
-      pLib->audio_trace_init = 1;
-    }
-    pLib->rc_ok = 0xff; /* default OK after assign was done */
-    if ((ret = ScheduleNextTraceRequest(pLib))) {
-      return (-1);
-    }
-  } else {
-    /*
-      Process indication
-      Always 'RNR' indication if return code is pending
-      */
-    Ind         = pLib->e.Ind;
-    pLib->e.Ind = 0;
-    if (pLib->removal_state) {
-      pLib->e.RNum     = 0;
-      pLib->e.RNR      = 2;
-    } else if (pLib->req_busy) {
-      pLib->e.RNum     = 0;
-      pLib->e.RNR      = 1;
-    } else {
-      if (pLib->e.complete != 0x02) {
-        /*
-          Look-ahead call, set up buffers
-          */
-        pLib->e.RNum       = 1;
-        pLib->e.R->P       = (byte*)&pLib->buffer[0];
-        pLib->e.R->PLength = (word)(sizeof(pLib->buffer) - 1);
-
-      } else {
-        /*
-          Indication reception complete, process it now
-          */
-        byte* p = (byte*)&pLib->buffer[0];
-        pLib->buffer[pLib->e.R->PLength] = 0; /* terminate I.E. with zero */
-
-        switch (Ind) {
-          case MAN_COMBI_IND: {
-            int total_length    = pLib->e.R->PLength;
-            word  this_ind_length;
-
-            while (total_length > 3 && *p) {
-              Ind = *p++;
-              this_ind_length = (word)p[0] | ((word)p[1] << 8);
-              p += 2;
-
-              switch (Ind) {
-                case MAN_INFO_IND:
-                  if (process_idi_info (pLib, (diva_man_var_header_t*)p)) {
-                    return (-1);
-                  }
-                  break;
-                                       case MAN_EVENT_IND:
-                  if (process_idi_event (pLib, (diva_man_var_header_t*)p)) {
-                    return (-1);
-                  }
-                  break;
-                case MAN_TRACE_IND:
-                  if (pLib->trace_on == 1) {
-                    /*
-                      Ignore first trace event that is result of
-                      EVENT_ON operation
-                    */
-                    pLib->trace_on++;
-                  } else {
-                    /*
-                      Delivery XLOG buffer to application
-                      */
-                    if (pLib->user_proc_table.trace_proc) {
-                      (*(pLib->user_proc_table.trace_proc))(pLib->user_proc_table.user_context,
-                                                            &pLib->instance, pLib->Adapter,
-                                                            p, this_ind_length);
-                    }
-                  }
-                  break;
-                default:
-                  diva_mnt_internal_dprintf (0, DLI_ERR, "Unknown IDI Ind (DMA mode): %02x", Ind);
-              }
-              p += (this_ind_length+1);
-              total_length -= (4 + this_ind_length);
-            }
-          } break;
-          case MAN_INFO_IND:
-            if (process_idi_info (pLib, (diva_man_var_header_t*)p)) {
-              return (-1);
-            }
-            break;
-                                       case MAN_EVENT_IND:
-            if (process_idi_event (pLib, (diva_man_var_header_t*)p)) {
-              return (-1);
-            }
-            break;
-          case MAN_TRACE_IND:
-            if (pLib->trace_on == 1) {
-              /*
-                Ignore first trace event that is result of
-                EVENT_ON operation
-              */
-              pLib->trace_on++;
-            } else {
-              /*
-                Delivery XLOG buffer to application
-                */
-              if (pLib->user_proc_table.trace_proc) {
-                (*(pLib->user_proc_table.trace_proc))(pLib->user_proc_table.user_context,
-                                                      &pLib->instance, pLib->Adapter,
-                                                      p, pLib->e.R->PLength);
-              }
-            }
-            break;
-          default:
-            diva_mnt_internal_dprintf (0, DLI_ERR, "Unknown IDI Ind: %02x", Ind);
-        }
-      }
-    }
-  }
+                       }
+
+                       if (!ignore) {
+                               return (-1); /* request failed */
+                       }
+               } else {
+                       if (pLib->general_b_ch_event == 1) {
+                               pLib->ChannelsTraceActive = pLib->Channels;
+                               pLib->general_b_ch_event = 2;
+                       } else if (pLib->general_fax_event == 1) {
+                               pLib->general_fax_event = 2;
+                               pLib->FaxTraceActive = pLib->Channels;
+                       } else if (pLib->general_mdm_event == 1) {
+                               pLib->general_mdm_event = 2;
+                               pLib->ModemTraceActive = pLib->Channels;
+                       }
+               }
+               if (pLib->audio_trace_init == 2) {
+                       pLib->audio_trace_init = 1;
+               }
+               pLib->rc_ok = 0xff; /* default OK after assign was done */
+               if ((ret = ScheduleNextTraceRequest(pLib))) {
+                       return (-1);
+               }
+       } else {
+               /*
+                 Process indication
+                 Always 'RNR' indication if return code is pending
+               */
+               Ind         = pLib->e.Ind;
+               pLib->e.Ind = 0;
+               if (pLib->removal_state) {
+                       pLib->e.RNum    = 0;
+                       pLib->e.RNR     = 2;
+               } else if (pLib->req_busy) {
+                       pLib->e.RNum    = 0;
+                       pLib->e.RNR     = 1;
+               } else {
+                       if (pLib->e.complete != 0x02) {
+                               /*
+                                 Look-ahead call, set up buffers
+                               */
+                               pLib->e.RNum       = 1;
+                               pLib->e.R->P       = (byte *)&pLib->buffer[0];
+                               pLib->e.R->PLength = (word)(sizeof(pLib->buffer) - 1);
+
+                       } else {
+                               /*
+                                 Indication reception complete, process it now
+                               */
+                               byte *p = (byte *)&pLib->buffer[0];
+                               pLib->buffer[pLib->e.R->PLength] = 0; /* terminate I.E. with zero */
+
+                               switch (Ind) {
+                               case MAN_COMBI_IND: {
+                                       int total_length    = pLib->e.R->PLength;
+                                       word  this_ind_length;
+
+                                       while (total_length > 3 && *p) {
+                                               Ind = *p++;
+                                               this_ind_length = (word)p[0] | ((word)p[1] << 8);
+                                               p += 2;
+
+                                               switch (Ind) {
+                                               case MAN_INFO_IND:
+                                                       if (process_idi_info(pLib, (diva_man_var_header_t *)p)) {
+                                                               return (-1);
+                                                       }
+                                                       break;
+                                               case MAN_EVENT_IND:
+                                                       if (process_idi_event(pLib, (diva_man_var_header_t *)p)) {
+                                                               return (-1);
+                                                       }
+                                                       break;
+                                               case MAN_TRACE_IND:
+                                                       if (pLib->trace_on == 1) {
+                                                               /*
+                                                                 Ignore first trace event that is result of
+                                                                 EVENT_ON operation
+                                                               */
+                                                               pLib->trace_on++;
+                                                       } else {
+                                                               /*
+                                                                 Delivery XLOG buffer to application
+                                                               */
+                                                               if (pLib->user_proc_table.trace_proc) {
+                                                                       (*(pLib->user_proc_table.trace_proc))(pLib->user_proc_table.user_context,
+                                                                                                             &pLib->instance, pLib->Adapter,
+                                                                                                             p, this_ind_length);
+                                                               }
+                                                       }
+                                                       break;
+                                               default:
+                                                       diva_mnt_internal_dprintf(0, DLI_ERR, "Unknown IDI Ind (DMA mode): %02x", Ind);
+                                               }
+                                               p += (this_ind_length + 1);
+                                               total_length -= (4 + this_ind_length);
+                                       }
+                               } break;
+                               case MAN_INFO_IND:
+                                       if (process_idi_info(pLib, (diva_man_var_header_t *)p)) {
+                                               return (-1);
+                                       }
+                                       break;
+                               case MAN_EVENT_IND:
+                                       if (process_idi_event(pLib, (diva_man_var_header_t *)p)) {
+                                               return (-1);
+                                       }
+                                       break;
+                               case MAN_TRACE_IND:
+                                       if (pLib->trace_on == 1) {
+                                               /*
+                                                 Ignore first trace event that is result of
+                                                 EVENT_ON operation
+                                               */
+                                               pLib->trace_on++;
+                                       } else {
+                                               /*
+                                                 Delivery XLOG buffer to application
+                                               */
+                                               if (pLib->user_proc_table.trace_proc) {
+                                                       (*(pLib->user_proc_table.trace_proc))(pLib->user_proc_table.user_context,
+                                                                                             &pLib->instance, pLib->Adapter,
+                                                                                             p, pLib->e.R->PLength);
+                                               }
+                                       }
+                                       break;
+                               default:
+                                       diva_mnt_internal_dprintf(0, DLI_ERR, "Unknown IDI Ind: %02x", Ind);
+                               }
+                       }
+               }
+       }
 
        if ((ret = ScheduleNextTraceRequest(pLib))) {
                return (-1);
@@ -434,9 +434,9 @@ static int SuperTraceMessageInput (void* hLib) {
 }
 
 /*
-       Internal state machine responsible for scheduling of requests
-       */
-static int ScheduleNextTraceRequest (diva_strace_context_t* pLib) {
+  Internal state machine responsible for scheduling of requests
+*/
+static int ScheduleNextTraceRequest(diva_strace_context_t *pLib) {
        char name[64];
        int ret = 0;
        int i;
@@ -445,50 +445,50 @@ static int ScheduleNextTraceRequest (diva_strace_context_t* pLib) {
                return (0);
        }
 
-  if (pLib->removal_state == 1) {
-               if (SuperTraceREMOVE (pLib->hAdapter)) {
-      pLib->removal_state = 3;
-    } else {
-      pLib->req_busy = 1;
-      pLib->removal_state = 2;
-    }
-    return (0);
-  }
+       if (pLib->removal_state == 1) {
+               if (SuperTraceREMOVE(pLib->hAdapter)) {
+                       pLib->removal_state = 3;
+               } else {
+                       pLib->req_busy = 1;
+                       pLib->removal_state = 2;
+               }
+               return (0);
+       }
 
-  if (pLib->removal_state) {
-    return (0);
-  }
+       if (pLib->removal_state) {
+               return (0);
+       }
 
-  if (!pLib->general_b_ch_event) {
+       if (!pLib->general_b_ch_event) {
                if ((ret = SuperTraceTraceOnRequest(pLib->hAdapter, "State\\B Event", pLib->buffer))) {
-      return (-1);
-    }
-    pLib->general_b_ch_event = 1;
+                       return (-1);
+               }
+               pLib->general_b_ch_event = 1;
                pLib->req_busy = 1;
                return (0);
-  }
+       }
 
-  if (!pLib->general_fax_event) {
+       if (!pLib->general_fax_event) {
                if ((ret = SuperTraceTraceOnRequest(pLib->hAdapter, "State\\FAX Event", pLib->buffer))) {
-      return (-1);
-    }
-    pLib->general_fax_event = 1;
+                       return (-1);
+               }
+               pLib->general_fax_event = 1;
                pLib->req_busy = 1;
                return (0);
-  }
+       }
 
-  if (!pLib->general_mdm_event) {
+       if (!pLib->general_mdm_event) {
                if ((ret = SuperTraceTraceOnRequest(pLib->hAdapter, "State\\Modem Event", pLib->buffer))) {
-      return (-1);
-    }
-    pLib->general_mdm_event = 1;
+                       return (-1);
+               }
+               pLib->general_mdm_event = 1;
                pLib->req_busy = 1;
                return (0);
-  }
+       }
 
        if (pLib->ChannelsTraceActive < pLib->Channels) {
                pLib->ChannelsTraceActive++;
-               sprintf (name, "State\\B%d\\Line", pLib->ChannelsTraceActive);
+               sprintf(name, "State\\B%d\\Line", pLib->ChannelsTraceActive);
                if ((ret = SuperTraceTraceOnRequest(pLib->hAdapter, name, pLib->buffer))) {
                        pLib->ChannelsTraceActive--;
                        return (-1);
@@ -499,7 +499,7 @@ static int ScheduleNextTraceRequest (diva_strace_context_t* pLib) {
 
        if (pLib->ModemTraceActive < pLib->Channels) {
                pLib->ModemTraceActive++;
-               sprintf (name, "State\\B%d\\Modem\\Event", pLib->ModemTraceActive);
+               sprintf(name, "State\\B%d\\Modem\\Event", pLib->ModemTraceActive);
                if ((ret = SuperTraceTraceOnRequest(pLib->hAdapter, name, pLib->buffer))) {
                        pLib->ModemTraceActive--;
                        return (-1);
@@ -510,7 +510,7 @@ static int ScheduleNextTraceRequest (diva_strace_context_t* pLib) {
 
        if (pLib->FaxTraceActive < pLib->Channels) {
                pLib->FaxTraceActive++;
-               sprintf (name, "State\\B%d\\FAX\\Event", pLib->FaxTraceActive);
+               sprintf(name, "State\\B%d\\FAX\\Event", pLib->FaxTraceActive);
                if ((ret = SuperTraceTraceOnRequest(pLib->hAdapter, name, pLib->buffer))) {
                        pLib->FaxTraceActive--;
                        return (-1);
@@ -521,12 +521,12 @@ static int ScheduleNextTraceRequest (diva_strace_context_t* pLib) {
 
        if (!pLib->trace_mask_init) {
                word tmp = 0x0000;
-               if (SuperTraceWriteVar (pLib->hAdapter,
-                                                                                                               pLib->buffer,
-                                                                                                               "Trace\\Event Enable",
-                                                                                                               &tmp,
-                                                                                                               0x87, /* MI_BITFLD */
-                                                                                                               sizeof(tmp))) {
+               if (SuperTraceWriteVar(pLib->hAdapter,
+                                      pLib->buffer,
+                                      "Trace\\Event Enable",
+                                      &tmp,
+                                      0x87, /* MI_BITFLD */
+                                       sizeof(tmp))) {
                        return (-1);
                }
                pLib->trace_mask_init = 1;
@@ -536,12 +536,12 @@ static int ScheduleNextTraceRequest (diva_strace_context_t* pLib) {
 
        if (!pLib->audio_trace_init) {
                dword tmp = 0x00000000;
-               if (SuperTraceWriteVar (pLib->hAdapter,
-                                                                                                               pLib->buffer,
-                                                                                                               "Trace\\AudioCh# Enable",
-                                                                                                               &tmp,
-                                                                                                               0x87, /* MI_BITFLD */
-                                                                                                               sizeof(tmp))) {
+               if (SuperTraceWriteVar(pLib->hAdapter,
+                                      pLib->buffer,
+                                      "Trace\\AudioCh# Enable",
+                                      &tmp,
+                                      0x87, /* MI_BITFLD */
+                                       sizeof(tmp))) {
                        return (-1);
                }
                pLib->audio_trace_init = 2;
@@ -551,12 +551,12 @@ static int ScheduleNextTraceRequest (diva_strace_context_t* pLib) {
 
        if (!pLib->bchannel_init) {
                dword tmp = 0x00000000;
-               if (SuperTraceWriteVar (pLib->hAdapter,
-                                                                                                               pLib->buffer,
-                                                                                                               "Trace\\B-Ch# Enable",
-                                                                                                               &tmp,
-                                                                                                               0x87, /* MI_BITFLD */
-                                                                                                               sizeof(tmp))) {
+               if (SuperTraceWriteVar(pLib->hAdapter,
+                                      pLib->buffer,
+                                      "Trace\\B-Ch# Enable",
+                                      &tmp,
+                                      0x87, /* MI_BITFLD */
+                                       sizeof(tmp))) {
                        return (-1);
                }
                pLib->bchannel_init = 1;
@@ -566,12 +566,12 @@ static int ScheduleNextTraceRequest (diva_strace_context_t* pLib) {
 
        if (!pLib->trace_length_init) {
                word tmp = 30;
-               if (SuperTraceWriteVar (pLib->hAdapter,
-                                                                                                               pLib->buffer,
-                                                                                                               "Trace\\Max Log Length",
-                                                                                                               &tmp,
-                                                                                                               0x82, /* MI_UINT */
-                                                                                                               sizeof(tmp))) {
+               if (SuperTraceWriteVar(pLib->hAdapter,
+                                      pLib->buffer,
+                                      "Trace\\Max Log Length",
+                                      &tmp,
+                                      0x82, /* MI_UINT */
+                                       sizeof(tmp))) {
                        return (-1);
                }
                pLib->trace_length_init = 1;
@@ -580,9 +580,9 @@ static int ScheduleNextTraceRequest (diva_strace_context_t* pLib) {
        }
 
        if (!pLib->trace_on) {
-               if (SuperTraceTraceOnRequest (pLib->hAdapter,
-                                                                                                                                       "Trace\\Log Buffer",
-                                                                                                                                       pLib->buffer)) {
+               if (SuperTraceTraceOnRequest(pLib->hAdapter,
+                                            "Trace\\Log Buffer",
+                                            pLib->buffer)) {
                        return (-1);
                }
                pLib->trace_on = 1;
@@ -591,12 +591,12 @@ static int ScheduleNextTraceRequest (diva_strace_context_t* pLib) {
        }
 
        if (pLib->trace_event_mask != pLib->current_trace_event_mask) {
-               if (SuperTraceWriteVar (pLib->hAdapter,
-                                                                                                               pLib->buffer,
-                                                                                                               "Trace\\Event Enable",
-                                                                                                               &pLib->trace_event_mask,
-                                                                                                               0x87, /* MI_BITFLD */
-                                                                                                               sizeof(pLib->trace_event_mask))) {
+               if (SuperTraceWriteVar(pLib->hAdapter,
+                                      pLib->buffer,
+                                      "Trace\\Event Enable",
+                                      &pLib->trace_event_mask,
+                                      0x87, /* MI_BITFLD */
+                                       sizeof(pLib->trace_event_mask))) {
                        return (-1);
                }
                pLib->current_trace_event_mask = pLib->trace_event_mask;
@@ -605,12 +605,12 @@ static int ScheduleNextTraceRequest (diva_strace_context_t* pLib) {
        }
 
        if ((pLib->audio_tap_pending >= 0) && (pLib->audio_tap_mask != pLib->current_audio_tap_mask)) {
-               if (SuperTraceWriteVar (pLib->hAdapter,
-                                                                                                               pLib->buffer,
-                                                                                                               "Trace\\AudioCh# Enable",
-                                                                                                               &pLib->audio_tap_mask,
-                                                                                                               0x87, /* MI_BITFLD */
-                                                                                                               sizeof(pLib->audio_tap_mask))) {
+               if (SuperTraceWriteVar(pLib->hAdapter,
+                                      pLib->buffer,
+                                      "Trace\\AudioCh# Enable",
+                                      &pLib->audio_tap_mask,
+                                      0x87, /* MI_BITFLD */
+                                       sizeof(pLib->audio_tap_mask))) {
                        return (-1);
                }
                pLib->current_audio_tap_mask = pLib->audio_tap_mask;
@@ -620,12 +620,12 @@ static int ScheduleNextTraceRequest (diva_strace_context_t* pLib) {
        }
 
        if ((pLib->eye_pattern_pending >= 0) && (pLib->audio_tap_mask != pLib->current_eye_pattern_mask)) {
-               if (SuperTraceWriteVar (pLib->hAdapter,
-                                                                                                               pLib->buffer,
-                                                                                                               "Trace\\EyeCh# Enable",
-                                                                                                               &pLib->audio_tap_mask,
-                                                                                                               0x87, /* MI_BITFLD */
-                                                                                                               sizeof(pLib->audio_tap_mask))) {
+               if (SuperTraceWriteVar(pLib->hAdapter,
+                                      pLib->buffer,
+                                      "Trace\\EyeCh# Enable",
+                                      &pLib->audio_tap_mask,
+                                      0x87, /* MI_BITFLD */
+                                       sizeof(pLib->audio_tap_mask))) {
                        return (-1);
                }
                pLib->current_eye_pattern_mask = pLib->audio_tap_mask;
@@ -635,12 +635,12 @@ static int ScheduleNextTraceRequest (diva_strace_context_t* pLib) {
        }
 
        if (pLib->bchannel_trace_mask != pLib->current_bchannel_trace_mask) {
-               if (SuperTraceWriteVar (pLib->hAdapter,
-                                                                                                               pLib->buffer,
-                                                                                                               "Trace\\B-Ch# Enable",
-                                                                                                               &pLib->bchannel_trace_mask,
-                                                                                                               0x87, /* MI_BITFLD */
-                                                                                                               sizeof(pLib->bchannel_trace_mask))) {
+               if (SuperTraceWriteVar(pLib->hAdapter,
+                                      pLib->buffer,
+                                      "Trace\\B-Ch# Enable",
+                                      &pLib->bchannel_trace_mask,
+                                      0x87, /* MI_BITFLD */
+                                       sizeof(pLib->bchannel_trace_mask))) {
                        return (-1);
                }
                pLib->current_bchannel_trace_mask = pLib->bchannel_trace_mask;
@@ -649,9 +649,9 @@ static int ScheduleNextTraceRequest (diva_strace_context_t* pLib) {
        }
 
        if (!pLib->trace_events_down) {
-               if (SuperTraceTraceOnRequest (pLib->hAdapter,
-                                                                                                                                       "Events Down",
-                                                                                                                                       pLib->buffer)) {
+               if (SuperTraceTraceOnRequest(pLib->hAdapter,
+                                            "Events Down",
+                                            pLib->buffer)) {
                        return (-1);
                }
                pLib->trace_events_down = 1;
@@ -660,9 +660,9 @@ static int ScheduleNextTraceRequest (diva_strace_context_t* pLib) {
        }
 
        if (!pLib->l1_trace) {
-               if (SuperTraceTraceOnRequest (pLib->hAdapter,
-                                                                                                                                       "State\\Layer1",
-                                                                                                                                       pLib->buffer)) {
+               if (SuperTraceTraceOnRequest(pLib->hAdapter,
+                                            "State\\Layer1",
+                                            pLib->buffer)) {
                        return (-1);
                }
                pLib->l1_trace = 1;
@@ -671,9 +671,9 @@ static int ScheduleNextTraceRequest (diva_strace_context_t* pLib) {
        }
 
        if (!pLib->l2_trace) {
-               if (SuperTraceTraceOnRequest (pLib->hAdapter,
-                                                                                                                                       "State\\Layer2 No1",
-                                                                                                                                       pLib->buffer)) {
+               if (SuperTraceTraceOnRequest(pLib->hAdapter,
+                                            "State\\Layer2 No1",
+                                            pLib->buffer)) {
                        return (-1);
                }
                pLib->l2_trace = 1;
@@ -683,8 +683,8 @@ static int ScheduleNextTraceRequest (diva_strace_context_t* pLib) {
 
        for (i = 0; i < 30; i++) {
                if (pLib->pending_line_status & (1L << i)) {
-                       sprintf (name, "State\\B%d", i+1);
-                       if (SuperTraceReadRequest (pLib->hAdapter, name, pLib->buffer)) {
+                       sprintf(name, "State\\B%d", i + 1);
+                       if (SuperTraceReadRequest(pLib->hAdapter, name, pLib->buffer)) {
                                return (-1);
                        }
                        pLib->pending_line_status &= ~(1L << i);
@@ -692,8 +692,8 @@ static int ScheduleNextTraceRequest (diva_strace_context_t* pLib) {
                        return (0);
                }
                if (pLib->pending_modem_status & (1L << i)) {
-                       sprintf (name, "State\\B%d\\Modem", i+1);
-                       if (SuperTraceReadRequest (pLib->hAdapter, name, pLib->buffer)) {
+                       sprintf(name, "State\\B%d\\Modem", i + 1);
+                       if (SuperTraceReadRequest(pLib->hAdapter, name, pLib->buffer)) {
                                return (-1);
                        }
                        pLib->pending_modem_status &= ~(1L << i);
@@ -701,8 +701,8 @@ static int ScheduleNextTraceRequest (diva_strace_context_t* pLib) {
                        return (0);
                }
                if (pLib->pending_fax_status & (1L << i)) {
-                       sprintf (name, "State\\B%d\\FAX", i+1);
-                       if (SuperTraceReadRequest (pLib->hAdapter, name, pLib->buffer)) {
+                       sprintf(name, "State\\B%d\\FAX", i + 1);
+                       if (SuperTraceReadRequest(pLib->hAdapter, name, pLib->buffer)) {
                                return (-1);
                        }
                        pLib->pending_fax_status &= ~(1L << i);
@@ -710,8 +710,8 @@ static int ScheduleNextTraceRequest (diva_strace_context_t* pLib) {
                        return (0);
                }
                if (pLib->clear_call_command & (1L << i)) {
-                       sprintf (name, "State\\B%d\\Clear Call", i+1);
-                       if (SuperTraceExecuteRequest (pLib->hAdapter, name, pLib->buffer)) {
+                       sprintf(name, "State\\B%d\\Clear Call", i + 1);
+                       if (SuperTraceExecuteRequest(pLib->hAdapter, name, pLib->buffer)) {
                                return (-1);
                        }
                        pLib->clear_call_command &= ~(1L << i);
@@ -721,9 +721,9 @@ static int ScheduleNextTraceRequest (diva_strace_context_t* pLib) {
        }
 
        if (pLib->outgoing_ifc_stats) {
-               if (SuperTraceReadRequest (pLib->hAdapter,
-                                                                                                                        "Statistics\\Outgoing Calls",
-                                                                                                                        pLib->buffer)) {
+               if (SuperTraceReadRequest(pLib->hAdapter,
+                                         "Statistics\\Outgoing Calls",
+                                         pLib->buffer)) {
                        return (-1);
                }
                pLib->outgoing_ifc_stats = 0;
@@ -732,9 +732,9 @@ static int ScheduleNextTraceRequest (diva_strace_context_t* pLib) {
        }
 
        if (pLib->incoming_ifc_stats) {
-               if (SuperTraceReadRequest (pLib->hAdapter,
-                                                                                                                        "Statistics\\Incoming Calls",
-                                                                                                                        pLib->buffer)) {
+               if (SuperTraceReadRequest(pLib->hAdapter,
+                                         "Statistics\\Incoming Calls",
+                                         pLib->buffer)) {
                        return (-1);
                }
                pLib->incoming_ifc_stats = 0;
@@ -743,9 +743,9 @@ static int ScheduleNextTraceRequest (diva_strace_context_t* pLib) {
        }
 
        if (pLib->modem_ifc_stats) {
-               if (SuperTraceReadRequest (pLib->hAdapter,
-                                                                                                                        "Statistics\\Modem",
-                                                                                                                        pLib->buffer)) {
+               if (SuperTraceReadRequest(pLib->hAdapter,
+                                         "Statistics\\Modem",
+                                         pLib->buffer)) {
                        return (-1);
                }
                pLib->modem_ifc_stats = 0;
@@ -754,9 +754,9 @@ static int ScheduleNextTraceRequest (diva_strace_context_t* pLib) {
        }
 
        if (pLib->fax_ifc_stats) {
-               if (SuperTraceReadRequest (pLib->hAdapter,
-                                                                                                                        "Statistics\\FAX",
-                                                                                                                        pLib->buffer)) {
+               if (SuperTraceReadRequest(pLib->hAdapter,
+                                         "Statistics\\FAX",
+                                         pLib->buffer)) {
                        return (-1);
                }
                pLib->fax_ifc_stats = 0;
@@ -765,9 +765,9 @@ static int ScheduleNextTraceRequest (diva_strace_context_t* pLib) {
        }
 
        if (pLib->b1_ifc_stats) {
-               if (SuperTraceReadRequest (pLib->hAdapter,
-                                                                                                                        "Statistics\\B-Layer1",
-                                                                                                                        pLib->buffer)) {
+               if (SuperTraceReadRequest(pLib->hAdapter,
+                                         "Statistics\\B-Layer1",
+                                         pLib->buffer)) {
                        return (-1);
                }
                pLib->b1_ifc_stats = 0;
@@ -776,9 +776,9 @@ static int ScheduleNextTraceRequest (diva_strace_context_t* pLib) {
        }
 
        if (pLib->b2_ifc_stats) {
-               if (SuperTraceReadRequest (pLib->hAdapter,
-                                                                                                                        "Statistics\\B-Layer2",
-                                                                                                                        pLib->buffer)) {
+               if (SuperTraceReadRequest(pLib->hAdapter,
+                                         "Statistics\\B-Layer2",
+                                         pLib->buffer)) {
                        return (-1);
                }
                pLib->b2_ifc_stats = 0;
@@ -787,9 +787,9 @@ static int ScheduleNextTraceRequest (diva_strace_context_t* pLib) {
        }
 
        if (pLib->d1_ifc_stats) {
-               if (SuperTraceReadRequest (pLib->hAdapter,
-                                                                                                                        "Statistics\\D-Layer1",
-                                                                                                                        pLib->buffer)) {
+               if (SuperTraceReadRequest(pLib->hAdapter,
+                                         "Statistics\\D-Layer1",
+                                         pLib->buffer)) {
                        return (-1);
                }
                pLib->d1_ifc_stats = 0;
@@ -798,9 +798,9 @@ static int ScheduleNextTraceRequest (diva_strace_context_t* pLib) {
        }
 
        if (pLib->d2_ifc_stats) {
-               if (SuperTraceReadRequest (pLib->hAdapter,
-                                                                                                                        "Statistics\\D-Layer2",
-                                                                                                                        pLib->buffer)) {
+               if (SuperTraceReadRequest(pLib->hAdapter,
+                                         "Statistics\\D-Layer2",
+                                         pLib->buffer)) {
                        return (-1);
                }
                pLib->d2_ifc_stats = 0;
@@ -810,7 +810,7 @@ static int ScheduleNextTraceRequest (diva_strace_context_t* pLib) {
 
        if (!pLib->IncomingCallsCallsActive) {
                pLib->IncomingCallsCallsActive = 1;
-               sprintf (name, "%s", "Statistics\\Incoming Calls\\Calls");
+               sprintf(name, "%s", "Statistics\\Incoming Calls\\Calls");
                if ((ret = SuperTraceTraceOnRequest(pLib->hAdapter, name, pLib->buffer))) {
                        pLib->IncomingCallsCallsActive = 0;
                        return (-1);
@@ -820,7 +820,7 @@ static int ScheduleNextTraceRequest (diva_strace_context_t* pLib) {
        }
        if (!pLib->IncomingCallsConnectedActive) {
                pLib->IncomingCallsConnectedActive = 1;
-               sprintf (name, "%s", "Statistics\\Incoming Calls\\Connected");
+               sprintf(name, "%s", "Statistics\\Incoming Calls\\Connected");
                if ((ret = SuperTraceTraceOnRequest(pLib->hAdapter, name, pLib->buffer))) {
                        pLib->IncomingCallsConnectedActive = 0;
                        return (-1);
@@ -830,7 +830,7 @@ static int ScheduleNextTraceRequest (diva_strace_context_t* pLib) {
        }
        if (!pLib->OutgoingCallsCallsActive) {
                pLib->OutgoingCallsCallsActive = 1;
-               sprintf (name, "%s", "Statistics\\Outgoing Calls\\Calls");
+               sprintf(name, "%s", "Statistics\\Outgoing Calls\\Calls");
                if ((ret = SuperTraceTraceOnRequest(pLib->hAdapter, name, pLib->buffer))) {
                        pLib->OutgoingCallsCallsActive = 0;
                        return (-1);
@@ -840,7 +840,7 @@ static int ScheduleNextTraceRequest (diva_strace_context_t* pLib) {
        }
        if (!pLib->OutgoingCallsConnectedActive) {
                pLib->OutgoingCallsConnectedActive = 1;
-               sprintf (name, "%s", "Statistics\\Outgoing Calls\\Connected");
+               sprintf(name, "%s", "Statistics\\Outgoing Calls\\Connected");
                if ((ret = SuperTraceTraceOnRequest(pLib->hAdapter, name, pLib->buffer))) {
                        pLib->OutgoingCallsConnectedActive = 0;
                        return (-1);
@@ -852,241 +852,241 @@ static int ScheduleNextTraceRequest (diva_strace_context_t* pLib) {
        return (0);
 }
 
-static int process_idi_event (diva_strace_context_t* pLib,
-                               diva_man_var_header_t* pVar) {
-       const char* path = (char*)&pVar->path_length+1;
+static int process_idi_event(diva_strace_context_t *pLib,
+                            diva_man_var_header_t *pVar) {
+       const char *path = (char *)&pVar->path_length + 1;
        char name[64];
        int i;
 
        if (!strncmp("State\\B Event", path, pVar->path_length)) {
-    dword ch_id;
-    if (!diva_trace_read_variable (pVar, &ch_id)) {
-      if (!pLib->line_init_event && !pLib->pending_line_status) {
-        for (i = 1; i <= pLib->Channels; i++) {
-          diva_line_event(pLib, i);
-        }
-        return (0);
-      } else if (ch_id && ch_id <= pLib->Channels) {
-        return (diva_line_event(pLib, (int)ch_id));
-      }
-      return (0);
-    }
-    return (-1);
-  }
+               dword ch_id;
+               if (!diva_trace_read_variable(pVar, &ch_id)) {
+                       if (!pLib->line_init_event && !pLib->pending_line_status) {
+                               for (i = 1; i <= pLib->Channels; i++) {
+                                       diva_line_event(pLib, i);
+                               }
+                               return (0);
+                       } else if (ch_id && ch_id <= pLib->Channels) {
+                               return (diva_line_event(pLib, (int)ch_id));
+                       }
+                       return (0);
+               }
+               return (-1);
+       }
 
        if (!strncmp("State\\FAX Event", path, pVar->path_length)) {
-    dword ch_id;
-    if (!diva_trace_read_variable (pVar, &ch_id)) {
-      if (!pLib->pending_fax_status && !pLib->fax_init_event) {
-        for (i = 1; i <= pLib->Channels; i++) {
-          diva_fax_event(pLib, i);
-        }
-        return (0);
-      } else if (ch_id && ch_id <= pLib->Channels) {
-        return (diva_fax_event(pLib, (int)ch_id));
-      }
-      return (0);
-    }
-    return (-1);
-  }
+               dword ch_id;
+               if (!diva_trace_read_variable(pVar, &ch_id)) {
+                       if (!pLib->pending_fax_status && !pLib->fax_init_event) {
+                               for (i = 1; i <= pLib->Channels; i++) {
+                                       diva_fax_event(pLib, i);
+                               }
+                               return (0);
+                       } else if (ch_id && ch_id <= pLib->Channels) {
+                               return (diva_fax_event(pLib, (int)ch_id));
+                       }
+                       return (0);
+               }
+               return (-1);
+       }
 
        if (!strncmp("State\\Modem Event", path, pVar->path_length)) {
-    dword ch_id;
-    if (!diva_trace_read_variable (pVar, &ch_id)) {
-      if (!pLib->pending_modem_status && !pLib->modem_init_event) {
-        for (i = 1; i <= pLib->Channels; i++) {
-          diva_modem_event(pLib, i);
-        }
-        return (0);
-      } else if (ch_id && ch_id <= pLib->Channels) {
-        return (diva_modem_event(pLib, (int)ch_id));
-      }
-      return (0);
-    }
-    return (-1);
-  }
+               dword ch_id;
+               if (!diva_trace_read_variable(pVar, &ch_id)) {
+                       if (!pLib->pending_modem_status && !pLib->modem_init_event) {
+                               for (i = 1; i <= pLib->Channels; i++) {
+                                       diva_modem_event(pLib, i);
+                               }
+                               return (0);
+                       } else if (ch_id && ch_id <= pLib->Channels) {
+                               return (diva_modem_event(pLib, (int)ch_id));
+                       }
+                       return (0);
+               }
+               return (-1);
+       }
 
        /*
-               First look for Line Event
-               */
+         First look for Line Event
+       */
        for (i = 1; i <= pLib->Channels; i++) {
-               sprintf (name, "State\\B%d\\Line", i);
-               if (find_var (pVar, name)) {
+               sprintf(name, "State\\B%d\\Line", i);
+               if (find_var(pVar, name)) {
                        return (diva_line_event(pLib, i));
                }
        }
 
        /*
-               Look for Moden Progress Event
-               */
+         Look for Moden Progress Event
+       */
        for (i = 1; i <= pLib->Channels; i++) {
-               sprintf (name, "State\\B%d\\Modem\\Event", i);
-               if (find_var (pVar, name)) {
-                       return (diva_modem_event (pLib, i));
+               sprintf(name, "State\\B%d\\Modem\\Event", i);
+               if (find_var(pVar, name)) {
+                       return (diva_modem_event(pLib, i));
                }
        }
 
        /*
-               Look for Fax Event
-               */
+         Look for Fax Event
+       */
        for (i = 1; i <= pLib->Channels; i++) {
-               sprintf (name, "State\\B%d\\FAX\\Event", i);
-               if (find_var (pVar, name)) {
-                       return (diva_fax_event (pLib, i));
+               sprintf(name, "State\\B%d\\FAX\\Event", i);
+               if (find_var(pVar, name)) {
+                       return (diva_fax_event(pLib, i));
                }
        }
 
        /*
-               Notification about loss of events
-               */
+         Notification about loss of events
+       */
        if (!strncmp("Events Down", path, pVar->path_length)) {
                if (pLib->trace_events_down == 1) {
                        pLib->trace_events_down = 2;
                } else {
-                       diva_trace_error (pLib, 1, "Events Down", 0);
+                       diva_trace_error(pLib, 1, "Events Down", 0);
                }
                return (0);
        }
 
        if (!strncmp("State\\Layer1", path, pVar->path_length)) {
-               diva_strace_read_asz  (pVar, &pLib->lines[0].pInterface->Layer1[0]);
+               diva_strace_read_asz(pVar, &pLib->lines[0].pInterface->Layer1[0]);
                if (pLib->l1_trace == 1) {
                        pLib->l1_trace = 2;
                } else {
-                       diva_trace_notify_user (pLib, 0, DIVA_SUPER_TRACE_INTERFACE_CHANGE);
+                       diva_trace_notify_user(pLib, 0, DIVA_SUPER_TRACE_INTERFACE_CHANGE);
                }
                return (0);
        }
        if (!strncmp("State\\Layer2 No1", path, pVar->path_length)) {
-               char* tmp = &pLib->lines[0].pInterface->Layer2[0];
+               char *tmp = &pLib->lines[0].pInterface->Layer2[0];
                dword l2_state;
                if (diva_strace_read_uint(pVar, &l2_state))
                        return -1;
 
                switch (l2_state) {
-                       case 0:
-                               strcpy (tmp, "Idle");
-                               break;
-                       case 1:
-                               strcpy (tmp, "Layer2 UP");
-                               break;
-                       case 2:
-                               strcpy (tmp, "Layer2 Disconnecting");
-                               break;
-                       case 3:
-                               strcpy (tmp, "Layer2 Connecting");
-                               break;
-                       case 4:
-                               strcpy (tmp, "SPID Initializing");
-                               break;
-                       case 5:
-                               strcpy (tmp, "SPID Initialised");
-                               break;
-                       case 6:
-                               strcpy (tmp, "Layer2 Connecting");
-                               break;
-
-                       case  7:
-                               strcpy (tmp, "Auto SPID Stopped");
-                               break;
-
-                       case  8:
-                               strcpy (tmp, "Auto SPID Idle");
-                               break;
-
-                       case  9:
-                               strcpy (tmp, "Auto SPID Requested");
-                               break;
-
-                       case  10:
-                               strcpy (tmp, "Auto SPID Delivery");
-                               break;
-
-                       case 11:
-                               strcpy (tmp, "Auto SPID Complete");
-                               break;
-
-                       default:
-                               sprintf (tmp, "U:%d", (int)l2_state);
+               case 0:
+                       strcpy(tmp, "Idle");
+                       break;
+               case 1:
+                       strcpy(tmp, "Layer2 UP");
+                       break;
+               case 2:
+                       strcpy(tmp, "Layer2 Disconnecting");
+                       break;
+               case 3:
+                       strcpy(tmp, "Layer2 Connecting");
+                       break;
+               case 4:
+                       strcpy(tmp, "SPID Initializing");
+                       break;
+               case 5:
+                       strcpy(tmp, "SPID Initialised");
+                       break;
+               case 6:
+                       strcpy(tmp, "Layer2 Connecting");
+                       break;
+
+               case  7:
+                       strcpy(tmp, "Auto SPID Stopped");
+                       break;
+
+               case  8:
+                       strcpy(tmp, "Auto SPID Idle");
+                       break;
+
+               case  9:
+                       strcpy(tmp, "Auto SPID Requested");
+                       break;
+
+               case  10:
+                       strcpy(tmp, "Auto SPID Delivery");
+                       break;
+
+               case 11:
+                       strcpy(tmp, "Auto SPID Complete");
+                       break;
+
+               default:
+                       sprintf(tmp, "U:%d", (int)l2_state);
                }
                if (pLib->l2_trace == 1) {
                        pLib->l2_trace = 2;
                } else {
-                       diva_trace_notify_user (pLib, 0, DIVA_SUPER_TRACE_INTERFACE_CHANGE);
+                       diva_trace_notify_user(pLib, 0, DIVA_SUPER_TRACE_INTERFACE_CHANGE);
                }
                return (0);
        }
 
        if (!strncmp("Statistics\\Incoming Calls\\Calls", path, pVar->path_length) ||
-                       !strncmp("Statistics\\Incoming Calls\\Connected", path, pVar->path_length)) {
-               return (SuperTraceGetIncomingCallStatistics (pLib));
+           !strncmp("Statistics\\Incoming Calls\\Connected", path, pVar->path_length)) {
+               return (SuperTraceGetIncomingCallStatistics(pLib));
        }
 
        if (!strncmp("Statistics\\Outgoing Calls\\Calls", path, pVar->path_length) ||
-                       !strncmp("Statistics\\Outgoing Calls\\Connected", path, pVar->path_length)) {
-               return (SuperTraceGetOutgoingCallStatistics (pLib));
+           !strncmp("Statistics\\Outgoing Calls\\Connected", path, pVar->path_length)) {
+               return (SuperTraceGetOutgoingCallStatistics(pLib));
        }
 
        return (-1);
 }
 
-static int diva_line_event (diva_strace_context_t* pLib, int Channel) {
-       pLib->pending_line_status |= (1L << (Channel-1));
+static int diva_line_event(diva_strace_context_t *pLib, int Channel) {
+       pLib->pending_line_status |= (1L << (Channel - 1));
        return (0);
 }
 
-static int diva_modem_event (diva_strace_context_t* pLib, int Channel) {
-       pLib->pending_modem_status |= (1L << (Channel-1));
+static int diva_modem_event(diva_strace_context_t *pLib, int Channel) {
+       pLib->pending_modem_status |= (1L << (Channel - 1));
        return (0);
 }
 
-static int diva_fax_event (diva_strace_context_t* pLib, int Channel) {
-       pLib->pending_fax_status |= (1L << (Channel-1));
+static int diva_fax_event(diva_strace_context_t *pLib, int Channel) {
+       pLib->pending_fax_status |= (1L << (Channel - 1));
        return (0);
 }
 
 /*
-       Process INFO indications that arrive from the card
-       Uses path of first I.E. to detect the source of the
-       infication
-       */
-static int process_idi_info  (diva_strace_context_t* pLib,
-                                                                                                                       diva_man_var_header_t* pVar) {
-       const char* path = (char*)&pVar->path_length+1;
+  Process INFO indications that arrive from the card
+  Uses path of first I.E. to detect the source of the
+  infication
+*/
+static int process_idi_info(diva_strace_context_t *pLib,
+                           diva_man_var_header_t *pVar) {
+       const char *path = (char *)&pVar->path_length + 1;
        char name[64];
        int i, len;
 
        /*
-               First look for Modem Status Info
-               */
+         First look for Modem Status Info
+       */
        for (i = pLib->Channels; i > 0; i--) {
-               len = sprintf (name, "State\\B%d\\Modem", i);
+               len = sprintf(name, "State\\B%d\\Modem", i);
                if (!strncmp(name, path, len)) {
-                       return (diva_modem_info (pLib, i, pVar));
+                       return (diva_modem_info(pLib, i, pVar));
                }
        }
 
        /*
-               Look for Fax Status Info
-               */
+         Look for Fax Status Info
+       */
        for (i = pLib->Channels; i > 0; i--) {
-               len = sprintf (name, "State\\B%d\\FAX", i);
+               len = sprintf(name, "State\\B%d\\FAX", i);
                if (!strncmp(name, path, len)) {
-                       return (diva_fax_info (pLib, i, pVar));
+                       return (diva_fax_info(pLib, i, pVar));
                }
        }
 
        /*
-               Look for Line Status Info
-               */
+         Look for Line Status Info
+       */
        for (i = pLib->Channels; i > 0; i--) {
-               len = sprintf (name, "State\\B%d", i);
+               len = sprintf(name, "State\\B%d", i);
                if (!strncmp(name, path, len)) {
-                       return (diva_line_info (pLib, i, pVar));
+                       return (diva_line_info(pLib, i, pVar));
                }
        }
 
-       if (!diva_ifc_statistics (pLib, pVar)) {
+       if (!diva_ifc_statistics(pLib, pVar)) {
                return (0);
        }
 
@@ -1094,38 +1094,38 @@ static int process_idi_info  (diva_strace_context_t* pLib,
 }
 
 /*
-       MODEM INSTANCE STATE UPDATE
-
-       Update Modem Status Information and issue notification to user,
-       that will inform about change in the state of modem instance, that is
-       associuated with this channel
-       */
-static int diva_modem_info (diva_strace_context_t* pLib,
-                                                                                                               int Channel,
-                                                                                                               diva_man_var_header_t* pVar) {
-       diva_man_var_header_t* cur;
+  MODEM INSTANCE STATE UPDATE
+
+  Update Modem Status Information and issue notification to user,
+  that will inform about change in the state of modem instance, that is
+  associuated with this channel
+*/
+static int diva_modem_info(diva_strace_context_t *pLib,
+                          int Channel,
+                          diva_man_var_header_t *pVar) {
+       diva_man_var_header_t *cur;
        int i, nr = Channel - 1;
 
        for (i  = pLib->modem_parse_entry_first[nr];
-                        i <= pLib->modem_parse_entry_last[nr]; i++) {
-               if ((cur = find_var (pVar, pLib->parse_table[i].path))) {
-                       if (diva_trace_read_variable (cur, pLib->parse_table[i].variable)) {
-                               diva_trace_error (pLib, -3 , __FILE__, __LINE__);
+            i <= pLib->modem_parse_entry_last[nr]; i++) {
+               if ((cur = find_var(pVar, pLib->parse_table[i].path))) {
+                       if (diva_trace_read_variable(cur, pLib->parse_table[i].variable)) {
+                               diva_trace_error(pLib, -3, __FILE__, __LINE__);
                                return (-1);
                        }
                } else {
-                       diva_trace_error (pLib, -2 , __FILE__, __LINE__);
+                       diva_trace_error(pLib, -2, __FILE__, __LINE__);
                        return (-1);
                }
        }
 
        /*
-               We do not use first event to notify user - this is the event that is
-               generated as result of EVENT ON operation and is used only to initialize
-               internal variables of application
-               */
+         We do not use first event to notify user - this is the event that is
+         generated as result of EVENT ON operation and is used only to initialize
+         internal variables of application
+       */
        if (pLib->modem_init_event & (1L << nr)) {
-               diva_trace_notify_user (pLib, nr, DIVA_SUPER_TRACE_NOTIFY_MODEM_CHANGE);
+               diva_trace_notify_user(pLib, nr, DIVA_SUPER_TRACE_NOTIFY_MODEM_CHANGE);
        } else {
                pLib->modem_init_event |= (1L << nr);
        }
@@ -1133,32 +1133,32 @@ static int diva_modem_info (diva_strace_context_t* pLib,
        return (0);
 }
 
-static int diva_fax_info (diva_strace_context_t* pLib,
-                                                                                                       int Channel,
-                                                                                                       diva_man_var_header_t* pVar) {
-       diva_man_var_header_t* cur;
+static int diva_fax_info(diva_strace_context_t *pLib,
+                        int Channel,
+                        diva_man_var_header_t *pVar) {
+       diva_man_var_header_t *cur;
        int i, nr = Channel - 1;
 
        for (i  = pLib->fax_parse_entry_first[nr];
-                        i <= pLib->fax_parse_entry_last[nr]; i++) {
-               if ((cur = find_var (pVar, pLib->parse_table[i].path))) {
-                       if (diva_trace_read_variable (cur, pLib->parse_table[i].variable)) {
-                               diva_trace_error (pLib, -3 , __FILE__, __LINE__);
+            i <= pLib->fax_parse_entry_last[nr]; i++) {
+               if ((cur = find_var(pVar, pLib->parse_table[i].path))) {
+                       if (diva_trace_read_variable(cur, pLib->parse_table[i].variable)) {
+                               diva_trace_error(pLib, -3, __FILE__, __LINE__);
                                return (-1);
                        }
                } else {
-                       diva_trace_error (pLib, -2 , __FILE__, __LINE__);
+                       diva_trace_error(pLib, -2, __FILE__, __LINE__);
                        return (-1);
                }
        }
 
        /*
-               We do not use first event to notify user - this is the event that is
-               generated as result of EVENT ON operation and is used only to initialize
-               internal variables of application
-               */
+         We do not use first event to notify user - this is the event that is
+         generated as result of EVENT ON operation and is used only to initialize
+         internal variables of application
+       */
        if (pLib->fax_init_event & (1L << nr)) {
-               diva_trace_notify_user (pLib, nr, DIVA_SUPER_TRACE_NOTIFY_FAX_CHANGE);
+               diva_trace_notify_user(pLib, nr, DIVA_SUPER_TRACE_NOTIFY_FAX_CHANGE);
        } else {
                pLib->fax_init_event |= (1L << nr);
        }
@@ -1167,43 +1167,43 @@ static int diva_fax_info (diva_strace_context_t* pLib,
 }
 
 /*
-       LINE STATE UPDATE
-       Update Line Status Information and issue notification to user,
-       that will inform about change in the line state.
-       */
-static int diva_line_info  (diva_strace_context_t* pLib,
-                                                                                                               int Channel,
-                                                                                                               diva_man_var_header_t* pVar) {
-       diva_man_var_header_t* cur;
+  LINE STATE UPDATE
+  Update Line Status Information and issue notification to user,
+  that will inform about change in the line state.
+*/
+static int diva_line_info(diva_strace_context_t *pLib,
+                         int Channel,
+                         diva_man_var_header_t *pVar) {
+       diva_man_var_header_t *cur;
        int i, nr = Channel - 1;
 
-       for (i  = pLib->line_parse_entry_first[nr];
-                        i <= pLib->line_parse_entry_last[nr]; i++) {
-               if ((cur = find_var (pVar, pLib->parse_table[i].path))) {
-                       if (diva_trace_read_variable (cur, pLib->parse_table[i].variable)) {
-                               diva_trace_error (pLib, -3 , __FILE__, __LINE__);
+       for (i = pLib->line_parse_entry_first[nr];
+            i <= pLib->line_parse_entry_last[nr]; i++) {
+               if ((cur = find_var(pVar, pLib->parse_table[i].path))) {
+                       if (diva_trace_read_variable(cur, pLib->parse_table[i].variable)) {
+                               diva_trace_error(pLib, -3, __FILE__, __LINE__);
                                return (-1);
                        }
                } else {
-                       diva_trace_error (pLib, -2 , __FILE__, __LINE__);
+                       diva_trace_error(pLib, -2 , __FILE__, __LINE__);
                        return (-1);
                }
        }
 
        /*
-               We do not use first event to notify user - this is the event that is
-               generated as result of EVENT ON operation and is used only to initialize
-               internal variables of application
+         We do not use first event to notify user - this is the event that is
+         generated as result of EVENT ON operation and is used only to initialize
+         internal variables of application
 
-               Exception is is if the line is "online". In this case we have to notify
-               user about this confition.
-               */
+         Exception is is if the line is "online". In this case we have to notify
+         user about this confition.
+       */
        if (pLib->line_init_event & (1L << nr)) {
-               diva_trace_notify_user (pLib, nr, DIVA_SUPER_TRACE_NOTIFY_LINE_CHANGE);
+               diva_trace_notify_user(pLib, nr, DIVA_SUPER_TRACE_NOTIFY_LINE_CHANGE);
        } else {
                pLib->line_init_event |= (1L << nr);
-               if (strcmp (&pLib->lines[nr].Line[0], "Idle")) {
-                       diva_trace_notify_user (pLib, nr, DIVA_SUPER_TRACE_NOTIFY_LINE_CHANGE);
+               if (strcmp(&pLib->lines[nr].Line[0], "Idle")) {
+                       diva_trace_notify_user(pLib, nr, DIVA_SUPER_TRACE_NOTIFY_LINE_CHANGE);
                }
        }
 
@@ -1211,49 +1211,49 @@ static int diva_line_info  (diva_strace_context_t* pLib,
 }
 
 /*
-       Move position to next vatianle in the chain
-       */
-static diva_man_var_header_t* get_next_var (diva_man_var_header_t* pVar) {
-       byte* msg   = (byte*)pVar;
-       byte* start;
+  Move position to next vatianle in the chain
+*/
+static diva_man_var_header_t *get_next_var(diva_man_var_header_t *pVar) {
+       byte *msg = (byte *)pVar;
+       byte *start;
        int msg_length;
 
        if (*msg != ESC) return NULL;
 
        start = msg + 2;
-       msg_length = *(msg+1);
-       msg = (start+msg_length);
+       msg_length = *(msg + 1);
+       msg = (start + msg_length);
 
        if (*msg != ESC) return NULL;
 
-       return ((diva_man_var_header_t*)msg);
+       return ((diva_man_var_header_t *)msg);
 }
 
 /*
-       Move position to variable with given name
-       */
-static diva_man_var_header_t* find_var (diva_man_var_header_t* pVar,
-                                                                                                                                                               const char* name) {
-       const char* path;
+  Move position to variable with given name
+*/
+static diva_man_var_header_t *find_var(diva_man_var_header_t *pVar,
+                                      const char *name) {
+       const char *path;
 
        do {
-               path = (char*)&pVar->path_length+1;
+               path = (char *)&pVar->path_length + 1;
 
-               if (!strncmp (name, path, pVar->path_length)) {
+               if (!strncmp(name, path, pVar->path_length)) {
                        break;
                }
-       } while ((pVar = get_next_var (pVar)));
+       } while ((pVar = get_next_var(pVar)));
 
        return (pVar);
 }
 
-static void diva_create_line_parse_table  (diva_strace_context_t* pLib,
-                                                                                                                                                                        int Channel) {
-       diva_trace_line_state_t* pLine = &pLib->lines[Channel];
-       int nr = Channel+1;
+static void diva_create_line_parse_table(diva_strace_context_t *pLib,
+                                        int Channel) {
+       diva_trace_line_state_t *pLine = &pLib->lines[Channel];
+       int nr = Channel + 1;
 
        if ((pLib->cur_parse_entry + LINE_PARSE_ENTRIES) >= pLib->parse_entries) {
-               diva_trace_error (pLib, -1, __FILE__, __LINE__);
+               diva_trace_error(pLib, -1, __FILE__, __LINE__);
                return;
        }
 
@@ -1261,674 +1261,674 @@ static void diva_create_line_parse_table  (diva_strace_context_t* pLib,
 
        pLib->line_parse_entry_first[Channel] = pLib->cur_parse_entry;
 
-       sprintf (pLib->parse_table[pLib->cur_parse_entry].path,
-                                        "State\\B%d\\Framing", nr);
+       sprintf(pLib->parse_table[pLib->cur_parse_entry].path,
+               "State\\B%d\\Framing", nr);
        pLib->parse_table[pLib->cur_parse_entry++].variable = &pLine->Framing[0];
 
-       sprintf (pLib->parse_table[pLib->cur_parse_entry].path,
-                                        "State\\B%d\\Line", nr);
+       sprintf(pLib->parse_table[pLib->cur_parse_entry].path,
+               "State\\B%d\\Line", nr);
        pLib->parse_table[pLib->cur_parse_entry++].variable = &pLine->Line[0];
 
-       sprintf (pLib->parse_table[pLib->cur_parse_entry].path,
-                                        "State\\B%d\\Layer2", nr);
+       sprintf(pLib->parse_table[pLib->cur_parse_entry].path,
+               "State\\B%d\\Layer2", nr);
        pLib->parse_table[pLib->cur_parse_entry++].variable = &pLine->Layer2[0];
 
-       sprintf (pLib->parse_table[pLib->cur_parse_entry].path,
-                                        "State\\B%d\\Layer3", nr);
+       sprintf(pLib->parse_table[pLib->cur_parse_entry].path,
+               "State\\B%d\\Layer3", nr);
        pLib->parse_table[pLib->cur_parse_entry++].variable = &pLine->Layer3[0];
 
-       sprintf (pLib->parse_table[pLib->cur_parse_entry].path,
-                                        "State\\B%d\\Remote Address", nr);
+       sprintf(pLib->parse_table[pLib->cur_parse_entry].path,
+               "State\\B%d\\Remote Address", nr);
        pLib->parse_table[pLib->cur_parse_entry++].variable = \
-                                                                                                                                                                                               &pLine->RemoteAddress[0];
+               &pLine->RemoteAddress[0];
 
-       sprintf (pLib->parse_table[pLib->cur_parse_entry].path,
-                                        "State\\B%d\\Remote SubAddr", nr);
+       sprintf(pLib->parse_table[pLib->cur_parse_entry].path,
+               "State\\B%d\\Remote SubAddr", nr);
        pLib->parse_table[pLib->cur_parse_entry++].variable = \
-                                                                                                                                                                                               &pLine->RemoteSubAddress[0];
+               &pLine->RemoteSubAddress[0];
 
-       sprintf (pLib->parse_table[pLib->cur_parse_entry].path,
-                                        "State\\B%d\\Local Address", nr);
+       sprintf(pLib->parse_table[pLib->cur_parse_entry].path,
+               "State\\B%d\\Local Address", nr);
        pLib->parse_table[pLib->cur_parse_entry++].variable = \
-                                                                                                                                                                                               &pLine->LocalAddress[0];
+               &pLine->LocalAddress[0];
 
-       sprintf (pLib->parse_table[pLib->cur_parse_entry].path,
-                                        "State\\B%d\\Local SubAddr", nr);
+       sprintf(pLib->parse_table[pLib->cur_parse_entry].path,
+               "State\\B%d\\Local SubAddr", nr);
        pLib->parse_table[pLib->cur_parse_entry++].variable = \
-                                                                                                                                                                                               &pLine->LocalSubAddress[0];
+               &pLine->LocalSubAddress[0];
 
-       sprintf (pLib->parse_table[pLib->cur_parse_entry].path,
-                                        "State\\B%d\\BC", nr);
+       sprintf(pLib->parse_table[pLib->cur_parse_entry].path,
+               "State\\B%d\\BC", nr);
        pLib->parse_table[pLib->cur_parse_entry++].variable = &pLine->call_BC;
 
-       sprintf (pLib->parse_table[pLib->cur_parse_entry].path,
-                                        "State\\B%d\\HLC", nr);
+       sprintf(pLib->parse_table[pLib->cur_parse_entry].path,
+               "State\\B%d\\HLC", nr);
        pLib->parse_table[pLib->cur_parse_entry++].variable = &pLine->call_HLC;
 
-       sprintf (pLib->parse_table[pLib->cur_parse_entry].path,
-                                        "State\\B%d\\LLC", nr);
+       sprintf(pLib->parse_table[pLib->cur_parse_entry].path,
+               "State\\B%d\\LLC", nr);
        pLib->parse_table[pLib->cur_parse_entry++].variable = &pLine->call_LLC;
 
-       sprintf (pLib->parse_table[pLib->cur_parse_entry].path,
-                                        "State\\B%d\\Charges", nr);
+       sprintf(pLib->parse_table[pLib->cur_parse_entry].path,
+               "State\\B%d\\Charges", nr);
        pLib->parse_table[pLib->cur_parse_entry++].variable = &pLine->Charges;
 
-       sprintf (pLib->parse_table[pLib->cur_parse_entry].path,
-                                        "State\\B%d\\Call Reference", nr);
+       sprintf(pLib->parse_table[pLib->cur_parse_entry].path,
+               "State\\B%d\\Call Reference", nr);
        pLib->parse_table[pLib->cur_parse_entry++].variable = &pLine->CallReference;
 
-       sprintf (pLib->parse_table[pLib->cur_parse_entry].path,
-                                        "State\\B%d\\Last Disc Cause", nr);
+       sprintf(pLib->parse_table[pLib->cur_parse_entry].path,
+               "State\\B%d\\Last Disc Cause", nr);
        pLib->parse_table[pLib->cur_parse_entry++].variable = \
-                                                                                                                                                                                                               &pLine->LastDisconnecCause;
+               &pLine->LastDisconnecCause;
 
-       sprintf (pLib->parse_table[pLib->cur_parse_entry].path,
-                                        "State\\B%d\\User ID", nr);
+       sprintf(pLib->parse_table[pLib->cur_parse_entry].path,
+               "State\\B%d\\User ID", nr);
        pLib->parse_table[pLib->cur_parse_entry++].variable = &pLine->UserID[0];
 
        pLib->line_parse_entry_last[Channel] = pLib->cur_parse_entry - 1;
 }
 
-static void diva_create_fax_parse_table (diva_strace_context_t* pLib,
-                                                                                                                                                                int Channel) {
-       diva_trace_fax_state_t* pFax = &pLib->lines[Channel].fax;
-       int nr = Channel+1;
+static void diva_create_fax_parse_table(diva_strace_context_t *pLib,
+                                       int Channel) {
+       diva_trace_fax_state_t *pFax = &pLib->lines[Channel].fax;
+       int nr = Channel + 1;
 
        if ((pLib->cur_parse_entry + FAX_PARSE_ENTRIES) >= pLib->parse_entries) {
-               diva_trace_error (pLib, -1, __FILE__, __LINE__);
+               diva_trace_error(pLib, -1, __FILE__, __LINE__);
                return;
        }
        pFax->ChannelNumber = nr;
 
        pLib->fax_parse_entry_first[Channel] = pLib->cur_parse_entry;
 
-       sprintf (pLib->parse_table[pLib->cur_parse_entry].path,
-                                        "State\\B%d\\FAX\\Event", nr);
+       sprintf(pLib->parse_table[pLib->cur_parse_entry].path,
+               "State\\B%d\\FAX\\Event", nr);
        pLib->parse_table[pLib->cur_parse_entry++].variable = &pFax->Event;
 
-       sprintf (pLib->parse_table[pLib->cur_parse_entry].path,
-                                        "State\\B%d\\FAX\\Page Counter", nr);
+       sprintf(pLib->parse_table[pLib->cur_parse_entry].path,
+               "State\\B%d\\FAX\\Page Counter", nr);
        pLib->parse_table[pLib->cur_parse_entry++].variable = &pFax->Page_Counter;
 
-       sprintf (pLib->parse_table[pLib->cur_parse_entry].path,
-                                        "State\\B%d\\FAX\\Features", nr);
+       sprintf(pLib->parse_table[pLib->cur_parse_entry].path,
+               "State\\B%d\\FAX\\Features", nr);
        pLib->parse_table[pLib->cur_parse_entry++].variable = &pFax->Features;
 
-       sprintf (pLib->parse_table[pLib->cur_parse_entry].path,
-                                        "State\\B%d\\FAX\\Station ID", nr);
+       sprintf(pLib->parse_table[pLib->cur_parse_entry].path,
+               "State\\B%d\\FAX\\Station ID", nr);
        pLib->parse_table[pLib->cur_parse_entry++].variable = &pFax->Station_ID[0];
 
-       sprintf (pLib->parse_table[pLib->cur_parse_entry].path,
-                                        "State\\B%d\\FAX\\Subaddress", nr);
+       sprintf(pLib->parse_table[pLib->cur_parse_entry].path,
+               "State\\B%d\\FAX\\Subaddress", nr);
        pLib->parse_table[pLib->cur_parse_entry++].variable = &pFax->Subaddress[0];
 
-       sprintf (pLib->parse_table[pLib->cur_parse_entry].path,
-                                        "State\\B%d\\FAX\\Password", nr);
+       sprintf(pLib->parse_table[pLib->cur_parse_entry].path,
+               "State\\B%d\\FAX\\Password", nr);
        pLib->parse_table[pLib->cur_parse_entry++].variable = &pFax->Password[0];
 
-       sprintf (pLib->parse_table[pLib->cur_parse_entry].path,
-                                        "State\\B%d\\FAX\\Speed", nr);
+       sprintf(pLib->parse_table[pLib->cur_parse_entry].path,
+               "State\\B%d\\FAX\\Speed", nr);
        pLib->parse_table[pLib->cur_parse_entry++].variable = &pFax->Speed;
 
-       sprintf (pLib->parse_table[pLib->cur_parse_entry].path,
-                                        "State\\B%d\\FAX\\Resolution", nr);
+       sprintf(pLib->parse_table[pLib->cur_parse_entry].path,
+               "State\\B%d\\FAX\\Resolution", nr);
        pLib->parse_table[pLib->cur_parse_entry++].variable = &pFax->Resolution;
 
-       sprintf (pLib->parse_table[pLib->cur_parse_entry].path,
-                                        "State\\B%d\\FAX\\Paper Width", nr);
+       sprintf(pLib->parse_table[pLib->cur_parse_entry].path,
+               "State\\B%d\\FAX\\Paper Width", nr);
        pLib->parse_table[pLib->cur_parse_entry++].variable = &pFax->Paper_Width;
 
-       sprintf (pLib->parse_table[pLib->cur_parse_entry].path,
-                                        "State\\B%d\\FAX\\Paper Length", nr);
+       sprintf(pLib->parse_table[pLib->cur_parse_entry].path,
+               "State\\B%d\\FAX\\Paper Length", nr);
        pLib->parse_table[pLib->cur_parse_entry++].variable = &pFax->Paper_Length;
 
-       sprintf (pLib->parse_table[pLib->cur_parse_entry].path,
-                                        "State\\B%d\\FAX\\Scanline Time", nr);
+       sprintf(pLib->parse_table[pLib->cur_parse_entry].path,
+               "State\\B%d\\FAX\\Scanline Time", nr);
        pLib->parse_table[pLib->cur_parse_entry++].variable = &pFax->Scanline_Time;
 
-       sprintf (pLib->parse_table[pLib->cur_parse_entry].path,
-                                        "State\\B%d\\FAX\\Disc Reason", nr);
+       sprintf(pLib->parse_table[pLib->cur_parse_entry].path,
+               "State\\B%d\\FAX\\Disc Reason", nr);
        pLib->parse_table[pLib->cur_parse_entry++].variable = &pFax->Disc_Reason;
 
        pLib->fax_parse_entry_last[Channel] = pLib->cur_parse_entry - 1;
 }
 
-static void diva_create_modem_parse_table (diva_strace_context_t* pLib,
-                                                                                                                                                                        int Channel) {
-       diva_trace_modem_state_t* pModem = &pLib->lines[Channel].modem;
-       int nr = Channel+1;
+static void diva_create_modem_parse_table(diva_strace_context_t *pLib,
+                                         int Channel) {
+       diva_trace_modem_state_t *pModem = &pLib->lines[Channel].modem;
+       int nr = Channel + 1;
 
        if ((pLib->cur_parse_entry + MODEM_PARSE_ENTRIES) >= pLib->parse_entries) {
-               diva_trace_error (pLib, -1, __FILE__, __LINE__);
+               diva_trace_error(pLib, -1, __FILE__, __LINE__);
                return;
        }
        pModem->ChannelNumber = nr;
 
        pLib->modem_parse_entry_first[Channel] = pLib->cur_parse_entry;
 
-       sprintf (pLib->parse_table[pLib->cur_parse_entry].path,
-                                        "State\\B%d\\Modem\\Event", nr);
+       sprintf(pLib->parse_table[pLib->cur_parse_entry].path,
+               "State\\B%d\\Modem\\Event", nr);
        pLib->parse_table[pLib->cur_parse_entry++].variable = &pModem->Event;
 
-       sprintf (pLib->parse_table[pLib->cur_parse_entry].path,
-                                        "State\\B%d\\Modem\\Norm", nr);
+       sprintf(pLib->parse_table[pLib->cur_parse_entry].path,
+               "State\\B%d\\Modem\\Norm", nr);
        pLib->parse_table[pLib->cur_parse_entry++].variable = &pModem->Norm;
 
-       sprintf (pLib->parse_table[pLib->cur_parse_entry].path,
-                                        "State\\B%d\\Modem\\Options", nr);
+       sprintf(pLib->parse_table[pLib->cur_parse_entry].path,
+               "State\\B%d\\Modem\\Options", nr);
        pLib->parse_table[pLib->cur_parse_entry++].variable = &pModem->Options;
 
-       sprintf (pLib->parse_table[pLib->cur_parse_entry].path,
-                                        "State\\B%d\\Modem\\TX Speed", nr);
+       sprintf(pLib->parse_table[pLib->cur_parse_entry].path,
+               "State\\B%d\\Modem\\TX Speed", nr);
        pLib->parse_table[pLib->cur_parse_entry++].variable = &pModem->TxSpeed;
 
-       sprintf (pLib->parse_table[pLib->cur_parse_entry].path,
-                                        "State\\B%d\\Modem\\RX Speed", nr);
+       sprintf(pLib->parse_table[pLib->cur_parse_entry].path,
+               "State\\B%d\\Modem\\RX Speed", nr);
        pLib->parse_table[pLib->cur_parse_entry++].variable = &pModem->RxSpeed;
 
-       sprintf (pLib->parse_table[pLib->cur_parse_entry].path,
-                                        "State\\B%d\\Modem\\Roundtrip ms", nr);
+       sprintf(pLib->parse_table[pLib->cur_parse_entry].path,
+               "State\\B%d\\Modem\\Roundtrip ms", nr);
        pLib->parse_table[pLib->cur_parse_entry++].variable = &pModem->RoundtripMsec;
 
-       sprintf (pLib->parse_table[pLib->cur_parse_entry].path,
-                                        "State\\B%d\\Modem\\Symbol Rate", nr);
+       sprintf(pLib->parse_table[pLib->cur_parse_entry].path,
+               "State\\B%d\\Modem\\Symbol Rate", nr);
        pLib->parse_table[pLib->cur_parse_entry++].variable = &pModem->SymbolRate;
 
-       sprintf (pLib->parse_table[pLib->cur_parse_entry].path,
-                                        "State\\B%d\\Modem\\RX Level dBm", nr);
+       sprintf(pLib->parse_table[pLib->cur_parse_entry].path,
+               "State\\B%d\\Modem\\RX Level dBm", nr);
        pLib->parse_table[pLib->cur_parse_entry++].variable = &pModem->RxLeveldBm;
 
-       sprintf (pLib->parse_table[pLib->cur_parse_entry].path,
-                                        "State\\B%d\\Modem\\Echo Level dBm", nr);
+       sprintf(pLib->parse_table[pLib->cur_parse_entry].path,
+               "State\\B%d\\Modem\\Echo Level dBm", nr);
        pLib->parse_table[pLib->cur_parse_entry++].variable = &pModem->EchoLeveldBm;
 
-       sprintf (pLib->parse_table[pLib->cur_parse_entry].path,
-                                        "State\\B%d\\Modem\\SNR dB", nr);
+       sprintf(pLib->parse_table[pLib->cur_parse_entry].path,
+               "State\\B%d\\Modem\\SNR dB", nr);
        pLib->parse_table[pLib->cur_parse_entry++].variable = &pModem->SNRdb;
 
-       sprintf (pLib->parse_table[pLib->cur_parse_entry].path,
-                                        "State\\B%d\\Modem\\MAE", nr);
+       sprintf(pLib->parse_table[pLib->cur_parse_entry].path,
+               "State\\B%d\\Modem\\MAE", nr);
        pLib->parse_table[pLib->cur_parse_entry++].variable = &pModem->MAE;
 
-       sprintf (pLib->parse_table[pLib->cur_parse_entry].path,
-                                        "State\\B%d\\Modem\\Local Retrains", nr);
+       sprintf(pLib->parse_table[pLib->cur_parse_entry].path,
+               "State\\B%d\\Modem\\Local Retrains", nr);
        pLib->parse_table[pLib->cur_parse_entry++].variable = &pModem->LocalRetrains;
 
-       sprintf (pLib->parse_table[pLib->cur_parse_entry].path,
-                                        "State\\B%d\\Modem\\Remote Retrains", nr);
+       sprintf(pLib->parse_table[pLib->cur_parse_entry].path,
+               "State\\B%d\\Modem\\Remote Retrains", nr);
        pLib->parse_table[pLib->cur_parse_entry++].variable = &pModem->RemoteRetrains;
 
-       sprintf (pLib->parse_table[pLib->cur_parse_entry].path,
-                                        "State\\B%d\\Modem\\Local Resyncs", nr);
+       sprintf(pLib->parse_table[pLib->cur_parse_entry].path,
+               "State\\B%d\\Modem\\Local Resyncs", nr);
        pLib->parse_table[pLib->cur_parse_entry++].variable = &pModem->LocalResyncs;
 
-       sprintf (pLib->parse_table[pLib->cur_parse_entry].path,
-                                        "State\\B%d\\Modem\\Remote Resyncs", nr);
+       sprintf(pLib->parse_table[pLib->cur_parse_entry].path,
+               "State\\B%d\\Modem\\Remote Resyncs", nr);
        pLib->parse_table[pLib->cur_parse_entry++].variable = &pModem->RemoteResyncs;
 
-       sprintf (pLib->parse_table[pLib->cur_parse_entry].path,
-                                        "State\\B%d\\Modem\\Disc Reason", nr);
+       sprintf(pLib->parse_table[pLib->cur_parse_entry].path,
+               "State\\B%d\\Modem\\Disc Reason", nr);
        pLib->parse_table[pLib->cur_parse_entry++].variable = &pModem->DiscReason;
 
        pLib->modem_parse_entry_last[Channel] = pLib->cur_parse_entry - 1;
 }
 
-static void diva_create_parse_table (diva_strace_context_t* pLib) {
+static void diva_create_parse_table(diva_strace_context_t *pLib) {
        int i;
 
        for (i = 0; i < pLib->Channels; i++) {
-               diva_create_line_parse_table  (pLib, i);
-               diva_create_modem_parse_table (pLib, i);
-               diva_create_fax_parse_table   (pLib, i);
+               diva_create_line_parse_table(pLib, i);
+               diva_create_modem_parse_table(pLib, i);
+               diva_create_fax_parse_table(pLib, i);
        }
 
        pLib->statistic_parse_first = pLib->cur_parse_entry;
 
        /*
-               Outgoing Calls
-               */
-       strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
-                                       "Statistics\\Outgoing Calls\\Calls");
+         Outgoing Calls
+       */
+       strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
+              "Statistics\\Outgoing Calls\\Calls");
        pLib->parse_table[pLib->cur_parse_entry++].variable = \
-                                                                                                                                               &pLib->InterfaceStat.outg.Calls;
+               &pLib->InterfaceStat.outg.Calls;
 
-       strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
-                                       "Statistics\\Outgoing Calls\\Connected");
+       strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
+              "Statistics\\Outgoing Calls\\Connected");
        pLib->parse_table[pLib->cur_parse_entry++].variable = \
-                                                                                                                                               &pLib->InterfaceStat.outg.Connected;
+               &pLib->InterfaceStat.outg.Connected;
 
-       strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
-                                       "Statistics\\Outgoing Calls\\User Busy");
+       strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
+              "Statistics\\Outgoing Calls\\User Busy");
        pLib->parse_table[pLib->cur_parse_entry++].variable = \
-                                                                                                                                               &pLib->InterfaceStat.outg.User_Busy;
+               &pLib->InterfaceStat.outg.User_Busy;
 
-       strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
-                                       "Statistics\\Outgoing Calls\\No Answer");
+       strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
+              "Statistics\\Outgoing Calls\\No Answer");
        pLib->parse_table[pLib->cur_parse_entry++].variable = \
-                                                                                                                                               &pLib->InterfaceStat.outg.No_Answer;
+               &pLib->InterfaceStat.outg.No_Answer;
 
-       strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
-                                       "Statistics\\Outgoing Calls\\Wrong Number");
+       strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
+              "Statistics\\Outgoing Calls\\Wrong Number");
        pLib->parse_table[pLib->cur_parse_entry++].variable = \
-                                                                                                                                               &pLib->InterfaceStat.outg.Wrong_Number;
+               &pLib->InterfaceStat.outg.Wrong_Number;
 
-       strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
-                                       "Statistics\\Outgoing Calls\\Call Rejected");
+       strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
+              "Statistics\\Outgoing Calls\\Call Rejected");
        pLib->parse_table[pLib->cur_parse_entry++].variable = \
-                                                                                                                                               &pLib->InterfaceStat.outg.Call_Rejected;
+               &pLib->InterfaceStat.outg.Call_Rejected;
 
-       strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
-                                       "Statistics\\Outgoing Calls\\Other Failures");
+       strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
+              "Statistics\\Outgoing Calls\\Other Failures");
        pLib->parse_table[pLib->cur_parse_entry++].variable = \
-                                                                                                                                               &pLib->InterfaceStat.outg.Other_Failures;
+               &pLib->InterfaceStat.outg.Other_Failures;
 
        /*
-               Incoming Calls
-               */
-       strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
-                                       "Statistics\\Incoming Calls\\Calls");
+         Incoming Calls
+       */
+       strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
+              "Statistics\\Incoming Calls\\Calls");
        pLib->parse_table[pLib->cur_parse_entry++].variable = \
-                                                                                                                                               &pLib->InterfaceStat.inc.Calls;
+               &pLib->InterfaceStat.inc.Calls;
 
-       strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
-                                       "Statistics\\Incoming Calls\\Connected");
+       strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
+              "Statistics\\Incoming Calls\\Connected");
        pLib->parse_table[pLib->cur_parse_entry++].variable = \
-                                                                                                                                               &pLib->InterfaceStat.inc.Connected;
+               &pLib->InterfaceStat.inc.Connected;
 
-       strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
-                                       "Statistics\\Incoming Calls\\User Busy");
+       strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
+              "Statistics\\Incoming Calls\\User Busy");
        pLib->parse_table[pLib->cur_parse_entry++].variable = \
-                                                                                                                                               &pLib->InterfaceStat.inc.User_Busy;
+               &pLib->InterfaceStat.inc.User_Busy;
 
-       strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
-                                       "Statistics\\Incoming Calls\\Call Rejected");
+       strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
+              "Statistics\\Incoming Calls\\Call Rejected");
        pLib->parse_table[pLib->cur_parse_entry++].variable = \
-                                                                                                                                               &pLib->InterfaceStat.inc.Call_Rejected;
+               &pLib->InterfaceStat.inc.Call_Rejected;
 
-       strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
-                                       "Statistics\\Incoming Calls\\Wrong Number");
+       strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
+              "Statistics\\Incoming Calls\\Wrong Number");
        pLib->parse_table[pLib->cur_parse_entry++].variable = \
-                                                                                                                                               &pLib->InterfaceStat.inc.Wrong_Number;
+               &pLib->InterfaceStat.inc.Wrong_Number;
 
-       strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
-                                       "Statistics\\Incoming Calls\\Incompatible Dst");
+       strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
+              "Statistics\\Incoming Calls\\Incompatible Dst");
        pLib->parse_table[pLib->cur_parse_entry++].variable = \
-                                                                                                                                               &pLib->InterfaceStat.inc.Incompatible_Dst;
+               &pLib->InterfaceStat.inc.Incompatible_Dst;
 
-       strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
-                                       "Statistics\\Incoming Calls\\Out of Order");
+       strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
+              "Statistics\\Incoming Calls\\Out of Order");
        pLib->parse_table[pLib->cur_parse_entry++].variable = \
-                                                                                                                                               &pLib->InterfaceStat.inc.Out_of_Order;
+               &pLib->InterfaceStat.inc.Out_of_Order;
 
-       strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
-                                       "Statistics\\Incoming Calls\\Ignored");
+       strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
+              "Statistics\\Incoming Calls\\Ignored");
        pLib->parse_table[pLib->cur_parse_entry++].variable = \
-                                                                                                                                               &pLib->InterfaceStat.inc.Ignored;
+               &pLib->InterfaceStat.inc.Ignored;
 
        /*
-               Modem Statistics
-               */
+         Modem Statistics
+       */
        pLib->mdm_statistic_parse_first = pLib->cur_parse_entry;
 
-       strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
-                                       "Statistics\\Modem\\Disc Normal");
+       strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
+              "Statistics\\Modem\\Disc Normal");
        pLib->parse_table[pLib->cur_parse_entry++].variable = \
-                                                                                                                                               &pLib->InterfaceStat.mdm.Disc_Normal;
+               &pLib->InterfaceStat.mdm.Disc_Normal;
 
-       strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
-                                       "Statistics\\Modem\\Disc Unspecified");
+       strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
+              "Statistics\\Modem\\Disc Unspecified");
        pLib->parse_table[pLib->cur_parse_entry++].variable = \
-                                                                                                                                               &pLib->InterfaceStat.mdm.Disc_Unspecified;
+               &pLib->InterfaceStat.mdm.Disc_Unspecified;
 
-       strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
-                                       "Statistics\\Modem\\Disc Busy Tone");
+       strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
+              "Statistics\\Modem\\Disc Busy Tone");
        pLib->parse_table[pLib->cur_parse_entry++].variable = \
-                                                                                                                                               &pLib->InterfaceStat.mdm.Disc_Busy_Tone;
+               &pLib->InterfaceStat.mdm.Disc_Busy_Tone;
 
-       strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
-                                       "Statistics\\Modem\\Disc Congestion");
+       strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
+              "Statistics\\Modem\\Disc Congestion");
        pLib->parse_table[pLib->cur_parse_entry++].variable = \
-                                                                                                                                               &pLib->InterfaceStat.mdm.Disc_Congestion;
+               &pLib->InterfaceStat.mdm.Disc_Congestion;
 
-       strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
-                                       "Statistics\\Modem\\Disc Carr. Wait");
+       strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
+              "Statistics\\Modem\\Disc Carr. Wait");
        pLib->parse_table[pLib->cur_parse_entry++].variable = \
-                                                                                                                                               &pLib->InterfaceStat.mdm.Disc_Carr_Wait;
+               &pLib->InterfaceStat.mdm.Disc_Carr_Wait;
 
-       strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
-                                       "Statistics\\Modem\\Disc Trn Timeout");
+       strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
+              "Statistics\\Modem\\Disc Trn Timeout");
        pLib->parse_table[pLib->cur_parse_entry++].variable = \
-                                                                                                                                               &pLib->InterfaceStat.mdm.Disc_Trn_Timeout;
+               &pLib->InterfaceStat.mdm.Disc_Trn_Timeout;
 
-       strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
-                                       "Statistics\\Modem\\Disc Incompat.");
+       strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
+              "Statistics\\Modem\\Disc Incompat.");
        pLib->parse_table[pLib->cur_parse_entry++].variable = \
-                                                                                                                                               &pLib->InterfaceStat.mdm.Disc_Incompat;
+               &pLib->InterfaceStat.mdm.Disc_Incompat;
 
-       strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
-                                       "Statistics\\Modem\\Disc Frame Rej.");
+       strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
+              "Statistics\\Modem\\Disc Frame Rej.");
        pLib->parse_table[pLib->cur_parse_entry++].variable = \
-                                                                                                                                               &pLib->InterfaceStat.mdm.Disc_Frame_Rej;
+               &pLib->InterfaceStat.mdm.Disc_Frame_Rej;
 
-       strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
-                                       "Statistics\\Modem\\Disc V42bis");
+       strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
+              "Statistics\\Modem\\Disc V42bis");
        pLib->parse_table[pLib->cur_parse_entry++].variable = \
-                                                                                                                                               &pLib->InterfaceStat.mdm.Disc_V42bis;
+               &pLib->InterfaceStat.mdm.Disc_V42bis;
 
        pLib->mdm_statistic_parse_last  = pLib->cur_parse_entry - 1;
 
        /*
-               Fax Statistics
-               */
+         Fax Statistics
+       */
        pLib->fax_statistic_parse_first = pLib->cur_parse_entry;
 
-       strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
-                                       "Statistics\\FAX\\Disc Normal");
+       strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
+              "Statistics\\FAX\\Disc Normal");
        pLib->parse_table[pLib->cur_parse_entry++].variable = \
-                                                                                                                                               &pLib->InterfaceStat.fax.Disc_Normal;
+               &pLib->InterfaceStat.fax.Disc_Normal;
 
-       strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
-                                       "Statistics\\FAX\\Disc Not Ident.");
+       strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
+              "Statistics\\FAX\\Disc Not Ident.");
        pLib->parse_table[pLib->cur_parse_entry++].variable = \
-                                                                                                                                               &pLib->InterfaceStat.fax.Disc_Not_Ident;
+               &pLib->InterfaceStat.fax.Disc_Not_Ident;
 
-       strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
-                                       "Statistics\\FAX\\Disc No Response");
+       strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
+              "Statistics\\FAX\\Disc No Response");
        pLib->parse_table[pLib->cur_parse_entry++].variable = \
-                                                                                                                                               &pLib->InterfaceStat.fax.Disc_No_Response;
+               &pLib->InterfaceStat.fax.Disc_No_Response;
 
-       strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
-                                       "Statistics\\FAX\\Disc Retries");
+       strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
+              "Statistics\\FAX\\Disc Retries");
        pLib->parse_table[pLib->cur_parse_entry++].variable = \
-                                                                                                                                               &pLib->InterfaceStat.fax.Disc_Retries;
+               &pLib->InterfaceStat.fax.Disc_Retries;
 
-       strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
-                                       "Statistics\\FAX\\Disc Unexp. Msg.");
+       strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
+              "Statistics\\FAX\\Disc Unexp. Msg.");
        pLib->parse_table[pLib->cur_parse_entry++].variable = \
-                                                                                                                                               &pLib->InterfaceStat.fax.Disc_Unexp_Msg;
+               &pLib->InterfaceStat.fax.Disc_Unexp_Msg;
 
-       strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
-                                       "Statistics\\FAX\\Disc No Polling.");
+       strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
+              "Statistics\\FAX\\Disc No Polling.");
        pLib->parse_table[pLib->cur_parse_entry++].variable = \
-                                                                                                                                               &pLib->InterfaceStat.fax.Disc_No_Polling;
+               &pLib->InterfaceStat.fax.Disc_No_Polling;
 
-       strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
-                                       "Statistics\\FAX\\Disc Training");
+       strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
+              "Statistics\\FAX\\Disc Training");
        pLib->parse_table[pLib->cur_parse_entry++].variable = \
-                                                                                                                                               &pLib->InterfaceStat.fax.Disc_Training;
+               &pLib->InterfaceStat.fax.Disc_Training;
 
-       strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
-                                       "Statistics\\FAX\\Disc Unexpected");
+       strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
+              "Statistics\\FAX\\Disc Unexpected");
        pLib->parse_table[pLib->cur_parse_entry++].variable = \
-                                                                                                                                               &pLib->InterfaceStat.fax.Disc_Unexpected;
+               &pLib->InterfaceStat.fax.Disc_Unexpected;
 
-       strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
-                                       "Statistics\\FAX\\Disc Application");
+       strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
+              "Statistics\\FAX\\Disc Application");
        pLib->parse_table[pLib->cur_parse_entry++].variable = \
-                                                                                                                                               &pLib->InterfaceStat.fax.Disc_Application;
+               &pLib->InterfaceStat.fax.Disc_Application;
 
-       strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
-                                       "Statistics\\FAX\\Disc Incompat.");
+       strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
+              "Statistics\\FAX\\Disc Incompat.");
        pLib->parse_table[pLib->cur_parse_entry++].variable = \
-                                                                                                                                               &pLib->InterfaceStat.fax.Disc_Incompat;
+               &pLib->InterfaceStat.fax.Disc_Incompat;
 
-       strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
-                                       "Statistics\\FAX\\Disc No Command");
+       strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
+              "Statistics\\FAX\\Disc No Command");
        pLib->parse_table[pLib->cur_parse_entry++].variable = \
-                                                                                                                                               &pLib->InterfaceStat.fax.Disc_No_Command;
+               &pLib->InterfaceStat.fax.Disc_No_Command;
 
-       strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
-                                       "Statistics\\FAX\\Disc Long Msg");
+       strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
+              "Statistics\\FAX\\Disc Long Msg");
        pLib->parse_table[pLib->cur_parse_entry++].variable = \
-                                                                                                                                               &pLib->InterfaceStat.fax.Disc_Long_Msg;
+               &pLib->InterfaceStat.fax.Disc_Long_Msg;
 
-       strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
-                                       "Statistics\\FAX\\Disc Supervisor");
+       strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
+              "Statistics\\FAX\\Disc Supervisor");
        pLib->parse_table[pLib->cur_parse_entry++].variable = \
-                                                                                                                                               &pLib->InterfaceStat.fax.Disc_Supervisor;
+               &pLib->InterfaceStat.fax.Disc_Supervisor;
 
-       strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
-                                       "Statistics\\FAX\\Disc SUB SEP PWD");
+       strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
+              "Statistics\\FAX\\Disc SUB SEP PWD");
        pLib->parse_table[pLib->cur_parse_entry++].variable = \
-                                                                                                                                               &pLib->InterfaceStat.fax.Disc_SUB_SEP_PWD;
+               &pLib->InterfaceStat.fax.Disc_SUB_SEP_PWD;
 
-       strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
-                                       "Statistics\\FAX\\Disc Invalid Msg");
+       strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
+              "Statistics\\FAX\\Disc Invalid Msg");
        pLib->parse_table[pLib->cur_parse_entry++].variable = \
-                                                                                                                                               &pLib->InterfaceStat.fax.Disc_Invalid_Msg;
+               &pLib->InterfaceStat.fax.Disc_Invalid_Msg;
 
-       strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
-                                       "Statistics\\FAX\\Disc Page Coding");
+       strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
+              "Statistics\\FAX\\Disc Page Coding");
        pLib->parse_table[pLib->cur_parse_entry++].variable = \
-                                                                                                                                               &pLib->InterfaceStat.fax.Disc_Page_Coding;
+               &pLib->InterfaceStat.fax.Disc_Page_Coding;
 
-       strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
-                                       "Statistics\\FAX\\Disc App Timeout");
+       strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
+              "Statistics\\FAX\\Disc App Timeout");
        pLib->parse_table[pLib->cur_parse_entry++].variable = \
-                                                                                                                                               &pLib->InterfaceStat.fax.Disc_App_Timeout;
+               &pLib->InterfaceStat.fax.Disc_App_Timeout;
 
-       strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
-                                       "Statistics\\FAX\\Disc Unspecified");
+       strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
+              "Statistics\\FAX\\Disc Unspecified");
        pLib->parse_table[pLib->cur_parse_entry++].variable = \
-                                                                                                                                               &pLib->InterfaceStat.fax.Disc_Unspecified;
+               &pLib->InterfaceStat.fax.Disc_Unspecified;
 
        pLib->fax_statistic_parse_last  = pLib->cur_parse_entry - 1;
 
        /*
-               B-Layer1"
-               */
-       strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
-                                       "Statistics\\B-Layer1\\X-Frames");
+         B-Layer1"
+       */
+       strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
+              "Statistics\\B-Layer1\\X-Frames");
        pLib->parse_table[pLib->cur_parse_entry++].variable = \
-                                                                                                                                               &pLib->InterfaceStat.b1.X_Frames;
+               &pLib->InterfaceStat.b1.X_Frames;
 
-       strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
-                                       "Statistics\\B-Layer1\\X-Bytes");
+       strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
+              "Statistics\\B-Layer1\\X-Bytes");
        pLib->parse_table[pLib->cur_parse_entry++].variable = \
-                                                                                                                                               &pLib->InterfaceStat.b1.X_Bytes;
+               &pLib->InterfaceStat.b1.X_Bytes;
 
-       strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
-                                       "Statistics\\B-Layer1\\X-Errors");
+       strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
+              "Statistics\\B-Layer1\\X-Errors");
        pLib->parse_table[pLib->cur_parse_entry++].variable = \
-                                                                                                                                               &pLib->InterfaceStat.b1.X_Errors;
+               &pLib->InterfaceStat.b1.X_Errors;
 
-       strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
-                                       "Statistics\\B-Layer1\\R-Frames");
+       strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
+              "Statistics\\B-Layer1\\R-Frames");
        pLib->parse_table[pLib->cur_parse_entry++].variable = \
-                                                                                                                                               &pLib->InterfaceStat.b1.R_Frames;
+               &pLib->InterfaceStat.b1.R_Frames;
 
-       strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
-                                       "Statistics\\B-Layer1\\R-Bytes");
+       strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
+              "Statistics\\B-Layer1\\R-Bytes");
        pLib->parse_table[pLib->cur_parse_entry++].variable = \
-                                                                                                                                               &pLib->InterfaceStat.b1.R_Bytes;
+               &pLib->InterfaceStat.b1.R_Bytes;
 
-       strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
-                                       "Statistics\\B-Layer1\\R-Errors");
+       strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
+              "Statistics\\B-Layer1\\R-Errors");
        pLib->parse_table[pLib->cur_parse_entry++].variable = \
-                                                                                                                                               &pLib->InterfaceStat.b1.R_Errors;
+               &pLib->InterfaceStat.b1.R_Errors;
 
        /*
-               B-Layer2
-               */
-       strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
-                                       "Statistics\\B-Layer2\\X-Frames");
+         B-Layer2
+       */
+       strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
+              "Statistics\\B-Layer2\\X-Frames");
        pLib->parse_table[pLib->cur_parse_entry++].variable = \
-                                                                                                                                               &pLib->InterfaceStat.b2.X_Frames;
+               &pLib->InterfaceStat.b2.X_Frames;
 
-       strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
-                                       "Statistics\\B-Layer2\\X-Bytes");
+       strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
+              "Statistics\\B-Layer2\\X-Bytes");
        pLib->parse_table[pLib->cur_parse_entry++].variable = \
-                                                                                                                                               &pLib->InterfaceStat.b2.X_Bytes;
+               &pLib->InterfaceStat.b2.X_Bytes;
 
-       strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
-                                       "Statistics\\B-Layer2\\X-Errors");
+       strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
+              "Statistics\\B-Layer2\\X-Errors");
        pLib->parse_table[pLib->cur_parse_entry++].variable = \
-                                                                                                                                               &pLib->InterfaceStat.b2.X_Errors;
+               &pLib->InterfaceStat.b2.X_Errors;
 
-       strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
-                                       "Statistics\\B-Layer2\\R-Frames");
+       strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
+              "Statistics\\B-Layer2\\R-Frames");
        pLib->parse_table[pLib->cur_parse_entry++].variable = \
-                                                                                                                                               &pLib->InterfaceStat.b2.R_Frames;
+               &pLib->InterfaceStat.b2.R_Frames;
 
-       strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
-                                       "Statistics\\B-Layer2\\R-Bytes");
+       strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
+              "Statistics\\B-Layer2\\R-Bytes");
        pLib->parse_table[pLib->cur_parse_entry++].variable = \
-                                                                                                                                               &pLib->InterfaceStat.b2.R_Bytes;
+               &pLib->InterfaceStat.b2.R_Bytes;
 
-       strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
-                                       "Statistics\\B-Layer2\\R-Errors");
+       strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
+              "Statistics\\B-Layer2\\R-Errors");
        pLib->parse_table[pLib->cur_parse_entry++].variable = \
-                                                                                                                                               &pLib->InterfaceStat.b2.R_Errors;
+               &pLib->InterfaceStat.b2.R_Errors;
 
        /*
-               D-Layer1
-               */
-       strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
-                                       "Statistics\\D-Layer1\\X-Frames");
+         D-Layer1
+       */
+       strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
+              "Statistics\\D-Layer1\\X-Frames");
        pLib->parse_table[pLib->cur_parse_entry++].variable = \
-                                                                                                                                               &pLib->InterfaceStat.d1.X_Frames;
+               &pLib->InterfaceStat.d1.X_Frames;
 
-       strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
-                                       "Statistics\\D-Layer1\\X-Bytes");
+       strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
+              "Statistics\\D-Layer1\\X-Bytes");
        pLib->parse_table[pLib->cur_parse_entry++].variable = \
-                                                                                                                                               &pLib->InterfaceStat.d1.X_Bytes;
+               &pLib->InterfaceStat.d1.X_Bytes;
 
-       strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
-                                       "Statistics\\D-Layer1\\X-Errors");
+       strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
+              "Statistics\\D-Layer1\\X-Errors");
        pLib->parse_table[pLib->cur_parse_entry++].variable = \
-                                                                                                                                               &pLib->InterfaceStat.d1.X_Errors;
+               &pLib->InterfaceStat.d1.X_Errors;
 
-       strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
-                                       "Statistics\\D-Layer1\\R-Frames");
+       strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
+              "Statistics\\D-Layer1\\R-Frames");
        pLib->parse_table[pLib->cur_parse_entry++].variable = \
-                                                                                                                                               &pLib->InterfaceStat.d1.R_Frames;
+               &pLib->InterfaceStat.d1.R_Frames;
 
-       strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
-                                       "Statistics\\D-Layer1\\R-Bytes");
+       strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
+              "Statistics\\D-Layer1\\R-Bytes");
        pLib->parse_table[pLib->cur_parse_entry++].variable = \
-                                                                                                                                               &pLib->InterfaceStat.d1.R_Bytes;
+               &pLib->InterfaceStat.d1.R_Bytes;
 
-       strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
-                                       "Statistics\\D-Layer1\\R-Errors");
+       strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
+              "Statistics\\D-Layer1\\R-Errors");
        pLib->parse_table[pLib->cur_parse_entry++].variable = \
-                                                                                                                                               &pLib->InterfaceStat.d1.R_Errors;
+               &pLib->InterfaceStat.d1.R_Errors;
 
        /*
-               D-Layer2
-               */
-       strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
-                                       "Statistics\\D-Layer2\\X-Frames");
+         D-Layer2
+       */
+       strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
+              "Statistics\\D-Layer2\\X-Frames");
        pLib->parse_table[pLib->cur_parse_entry++].variable = \
-                                                                                                                                               &pLib->InterfaceStat.d2.X_Frames;
+               &pLib->InterfaceStat.d2.X_Frames;
 
-       strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
-                                       "Statistics\\D-Layer2\\X-Bytes");
+       strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
+              "Statistics\\D-Layer2\\X-Bytes");
        pLib->parse_table[pLib->cur_parse_entry++].variable = \
-                                                                                                                                               &pLib->InterfaceStat.d2.X_Bytes;
+               &pLib->InterfaceStat.d2.X_Bytes;
 
-       strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
-                                       "Statistics\\D-Layer2\\X-Errors");
+       strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
+              "Statistics\\D-Layer2\\X-Errors");
        pLib->parse_table[pLib->cur_parse_entry++].variable = \
-                                                                                                                                               &pLib->InterfaceStat.d2.X_Errors;
+               &pLib->InterfaceStat.d2.X_Errors;
 
-       strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
-                                       "Statistics\\D-Layer2\\R-Frames");
+       strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
+              "Statistics\\D-Layer2\\R-Frames");
        pLib->parse_table[pLib->cur_parse_entry++].variable = \
-                                                                                                                                               &pLib->InterfaceStat.d2.R_Frames;
+               &pLib->InterfaceStat.d2.R_Frames;
 
-       strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
-                                       "Statistics\\D-Layer2\\R-Bytes");
+       strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
+              "Statistics\\D-Layer2\\R-Bytes");
        pLib->parse_table[pLib->cur_parse_entry++].variable = \
-                                                                                                                                               &pLib->InterfaceStat.d2.R_Bytes;
+               &pLib->InterfaceStat.d2.R_Bytes;
 
-       strcpy (pLib->parse_table[pLib->cur_parse_entry].path,
-                                       "Statistics\\D-Layer2\\R-Errors");
+       strcpy(pLib->parse_table[pLib->cur_parse_entry].path,
+              "Statistics\\D-Layer2\\R-Errors");
        pLib->parse_table[pLib->cur_parse_entry++].variable = \
-                                                                                                                                               &pLib->InterfaceStat.d2.R_Errors;
+               &pLib->InterfaceStat.d2.R_Errors;
 
 
        pLib->statistic_parse_last  = pLib->cur_parse_entry - 1;
 }
 
-static void diva_trace_error (diva_strace_context_t* pLib,
-                                                                                                                       int error, const char* file, int line) {
+static void diva_trace_error(diva_strace_context_t *pLib,
+                            int error, const char *file, int line) {
        if (pLib->user_proc_table.error_notify_proc) {
                (*(pLib->user_proc_table.error_notify_proc))(\
-                                                                                                                                                                               pLib->user_proc_table.user_context,
-                                                                                                                                                                               &pLib->instance, pLib->Adapter,
-                                                                                                                                                                               error, file, line);
+                       pLib->user_proc_table.user_context,
+                       &pLib->instance, pLib->Adapter,
+                       error, file, line);
        }
 }
 
 /*
-       Delivery notification to user
-       */
-static void diva_trace_notify_user (diva_strace_context_t* pLib,
-                                                                                                                int Channel,
-                                                                                                                int notify_subject) {
+  Delivery notification to user
+*/
+static void diva_trace_notify_user(diva_strace_context_t *pLib,
+                                  int Channel,
+                                  int notify_subject) {
        if (pLib->user_proc_table.notify_proc) {
                (*(pLib->user_proc_table.notify_proc))(pLib->user_proc_table.user_context,
-                                                                                                                                                                        &pLib->instance,
-                                                                                                                                                                        pLib->Adapter,
-                                                                                                                                                                        &pLib->lines[Channel],
-                                                                                                                                                                        notify_subject);
+                                                      &pLib->instance,
+                                                      pLib->Adapter,
+                                                      &pLib->lines[Channel],
+                                                      notify_subject);
        }
 }
 
 /*
-       Read variable value to they destination based on the variable type
-       */
-static int diva_trace_read_variable (diva_man_var_header_t* pVar,
-                                                                                                                                                void* variable) {
+  Read variable value to they destination based on the variable type
+*/
+static int diva_trace_read_variable(diva_man_var_header_t *pVar,
+                                   void *variable) {
        switch (pVar->type) {
-               case 0x03: /* MI_ASCIIZ - syting                               */
-                       return (diva_strace_read_asz  (pVar, (char*)variable));
-               case 0x04: /* MI_ASCII  - string                               */
-                       return (diva_strace_read_asc  (pVar, (char*)variable));
-               case 0x05: /* MI_NUMBER - counted sequence of bytes            */
-                       return (diva_strace_read_ie  (pVar, (diva_trace_ie_t*)variable));
-               case 0x81: /* MI_INT    - signed integer                       */
-                       return (diva_strace_read_int (pVar, (int*)variable));
-               case 0x82: /* MI_UINT   - unsigned integer                     */
-                       return (diva_strace_read_uint (pVar, (dword*)variable));
-               case 0x83: /* MI_HINT   - unsigned integer, hex representetion */
-                       return (diva_strace_read_uint (pVar, (dword*)variable));
-               case 0x87: /* MI_BITFLD - unsigned integer, bit representation */
-                       return (diva_strace_read_uint (pVar, (dword*)variable));
+       case 0x03: /* MI_ASCIIZ - syting                               */
+               return (diva_strace_read_asz(pVar, (char *)variable));
+       case 0x04: /* MI_ASCII  - string                               */
+               return (diva_strace_read_asc(pVar, (char *)variable));
+       case 0x05: /* MI_NUMBER - counted sequence of bytes            */
+               return (diva_strace_read_ie(pVar, (diva_trace_ie_t *)variable));
+       case 0x81: /* MI_INT    - signed integer                       */
+               return (diva_strace_read_int(pVar, (int *)variable));
+       case 0x82: /* MI_UINT   - unsigned integer                     */
+               return (diva_strace_read_uint(pVar, (dword *)variable));
+       case 0x83: /* MI_HINT   - unsigned integer, hex representetion */
+               return (diva_strace_read_uint(pVar, (dword *)variable));
+       case 0x87: /* MI_BITFLD - unsigned integer, bit representation */
+               return (diva_strace_read_uint(pVar, (dword *)variable));
        }
 
        /*
-               This type of variable is not handled, indicate error
-               Or one problem in management interface, or in application recodeing
-               table, or this application should handle it.
-               */
+         This type of variable is not handled, indicate error
+         Or one problem in management interface, or in application recodeing
+         table, or this application should handle it.
+       */
        return (-1);
 }
 
 /*
-       Read signed integer to destination
-       */
-static int diva_strace_read_int  (diva_man_var_header_t* pVar, int* var) {
-       byte* ptr = (char*)&pVar->path_length;
+  Read signed integer to destination
+*/
+static int diva_strace_read_int(diva_man_var_header_t *pVar, int *var) {
+       byte *ptr = (char *)&pVar->path_length;
        int value;
 
        ptr += (pVar->path_length + 1);
 
        switch (pVar->value_length) {
-               case 1:
-                       value = *(char*)ptr;
-                       break;
+       case 1:
+               value = *(char *)ptr;
+               break;
 
-               case 2:
-                       value = (short)GET_WORD(ptr);
-                       break;
+       case 2:
+               value = (short)GET_WORD(ptr);
+               break;
 
-               case 4:
-                       value = (int)GET_DWORD(ptr);
-                       break;
+       case 4:
+               value = (int)GET_DWORD(ptr);
+               break;
 
-               default:
-                       return (-1);
+       default:
+               return (-1);
        }
 
        *var = value;
@@ -1936,32 +1936,32 @@ static int diva_strace_read_int  (diva_man_var_header_t* pVar, int* var) {
        return (0);
 }
 
-static int diva_strace_read_uint (diva_man_var_header_t* pVar, dword* var) {
-       byte* ptr = (char*)&pVar->path_length;
+static int diva_strace_read_uint(diva_man_var_header_t *pVar, dword *var) {
+       byte *ptr = (char *)&pVar->path_length;
        dword value;
 
        ptr += (pVar->path_length + 1);
 
        switch (pVar->value_length) {
-               case 1:
-                       value = (byte)(*ptr);
-                       break;
+       case 1:
+               value = (byte)(*ptr);
+               break;
 
-               case 2:
-                       value = (word)GET_WORD(ptr);
-                       break;
+       case 2:
+               value = (word)GET_WORD(ptr);
+               break;
 
-               case 3:
-                       value  = (dword)GET_DWORD(ptr);
-                       value &= 0x00ffffff;
-                       break;
+       case 3:
+               value  = (dword)GET_DWORD(ptr);
+               value &= 0x00ffffff;
+               break;
 
-               case 4:
-                       value = (dword)GET_DWORD(ptr);
-                       break;
+       case 4:
+               value = (dword)GET_DWORD(ptr);
+               break;
 
-               default:
-                       return (-1);
+       default:
+               return (-1);
        }
 
        *var = value;
@@ -1970,54 +1970,54 @@ static int diva_strace_read_uint (diva_man_var_header_t* pVar, dword* var) {
 }
 
 /*
-       Read zero terminated ASCII string
-       */
-static int diva_strace_read_asz  (diva_man_var_header_t* pVar, char* var) {
-       char* ptr = (char*)&pVar->path_length;
+  Read zero terminated ASCII string
+*/
+static int diva_strace_read_asz(diva_man_var_header_t *pVar, char *var) {
+       char *ptr = (char *)&pVar->path_length;
        int length;
 
        ptr += (pVar->path_length + 1);
 
        if (!(length = pVar->value_length)) {
-               length = strlen (ptr);
+               length = strlen(ptr);
        }
-       memcpy (var, ptr, length);
+       memcpy(var, ptr, length);
        var[length] = 0;
 
        return (0);
 }
 
 /*
-       Read counted (with leading length byte) ASCII string
-       */
-static int diva_strace_read_asc  (diva_man_var_header_t* pVar, char* var) {
-       char* ptr = (char*)&pVar->path_length;
+  Read counted (with leading length byte) ASCII string
+*/
+static int diva_strace_read_asc(diva_man_var_header_t *pVar, char *var) {
+       char *ptr = (char *)&pVar->path_length;
 
        ptr += (pVar->path_length + 1);
-       memcpy (var, ptr+1, *ptr);
+       memcpy(var, ptr + 1, *ptr);
        var[(int)*ptr] = 0;
 
        return (0);
 }
 
 /*
-               Read one information element - i.e. one string of byte values with
-               one length byte in front
-       */
-static int  diva_strace_read_ie  (diva_man_var_header_t* pVar,
-                                                                                                                                       diva_trace_ie_t* var) {
-       char* ptr = (char*)&pVar->path_length;
+  Read one information element - i.e. one string of byte values with
+  one length byte in front
+*/
+static int diva_strace_read_ie(diva_man_var_header_t *pVar,
+                              diva_trace_ie_t *var) {
+       char *ptr = (char *)&pVar->path_length;
 
        ptr += (pVar->path_length + 1);
 
        var->length = *ptr;
-       memcpy (&var->data[0], ptr+1, *ptr);
+       memcpy(&var->data[0], ptr + 1, *ptr);
 
        return (0);
 }
 
-static int SuperTraceSetAudioTap  (void* hLib, int Channel, int on) {
-       diva_strace_context_t* pLib = (diva_strace_context_t*)hLib;
+static int SuperTraceSetAudioTap(void *hLib, int Channel, int on) {
+       diva_strace_context_t *pLib = (diva_strace_context_t *)hLib;
 
        if ((Channel < 1) || (Channel > pLib->Channels)) {
                return (-1);
@@ -2030,21 +2030,21 @@ static int SuperTraceSetAudioTap  (void* hLib, int Channel, int on) {
                pLib->audio_tap_mask &= ~(1L << Channel);
        }
 
-  /*
-    EYE patterns have TM_M_DATA set as additional
-    condition
-    */
-  if (pLib->audio_tap_mask) {
-    pLib->trace_event_mask |= TM_M_DATA;
-  } else {
-    pLib->trace_event_mask &= ~TM_M_DATA;
-  }
+       /*
+         EYE patterns have TM_M_DATA set as additional
+         condition
+       */
+       if (pLib->audio_tap_mask) {
+               pLib->trace_event_mask |= TM_M_DATA;
+       } else {
+               pLib->trace_event_mask &= ~TM_M_DATA;
+       }
 
-       return (ScheduleNextTraceRequest (pLib));
+       return (ScheduleNextTraceRequest(pLib));
 }
 
-static int SuperTraceSetBChannel  (void* hLib, int Channel, int on) {
-       diva_strace_context_t* pLib = (diva_strace_context_t*)hLib;
+static int SuperTraceSetBChannel(void *hLib, int Channel, int on) {
+       diva_strace_context_t *pLib = (diva_strace_context_t *)hLib;
 
        if ((Channel < 1) || (Channel > pLib->Channels)) {
                return (-1);
@@ -2057,11 +2057,11 @@ static int SuperTraceSetBChannel  (void* hLib, int Channel, int on) {
                pLib->bchannel_trace_mask &= ~(1L << Channel);
        }
 
-       return (ScheduleNextTraceRequest (pLib));
+       return (ScheduleNextTraceRequest(pLib));
 }
 
-static int SuperTraceSetDChannel  (void* hLib, int on) {
-       diva_strace_context_t* pLib = (diva_strace_context_t*)hLib;
+static int SuperTraceSetDChannel(void *hLib, int on) {
+       diva_strace_context_t *pLib = (diva_strace_context_t *)hLib;
 
        if (on) {
                pLib->trace_event_mask |= (TM_D_CHAN | TM_C_COMM | TM_DL_ERR | TM_LAYER1);
@@ -2069,11 +2069,11 @@ static int SuperTraceSetDChannel  (void* hLib, int on) {
                pLib->trace_event_mask &= ~(TM_D_CHAN | TM_C_COMM | TM_DL_ERR | TM_LAYER1);
        }
 
-       return (ScheduleNextTraceRequest (pLib));
+       return (ScheduleNextTraceRequest(pLib));
 }
 
-static int SuperTraceSetInfo (void* hLib, int on) {
-       diva_strace_context_t* pLib = (diva_strace_context_t*)hLib;
+static int SuperTraceSetInfo(void *hLib, int on) {
+       diva_strace_context_t *pLib = (diva_strace_context_t *)hLib;
 
        if (on) {
                pLib->trace_event_mask |= TM_STRING;
@@ -2081,11 +2081,11 @@ static int SuperTraceSetInfo (void* hLib, int on) {
                pLib->trace_event_mask &= ~TM_STRING;
        }
 
-       return (ScheduleNextTraceRequest (pLib));
+       return (ScheduleNextTraceRequest(pLib));
 }
 
-static int SuperTraceClearCall (void* hLib, int Channel) {
-       diva_strace_context_t* pLib = (diva_strace_context_t*)hLib;
+static int SuperTraceClearCall(void *hLib, int Channel) {
+       diva_strace_context_t *pLib = (diva_strace_context_t *)hLib;
 
        if ((Channel < 1) || (Channel > pLib->Channels)) {
                return (-1);
@@ -2094,102 +2094,101 @@ static int SuperTraceClearCall (void* hLib, int Channel) {
 
        pLib->clear_call_command |= (1L << Channel);
 
-       return (ScheduleNextTraceRequest (pLib));
+       return (ScheduleNextTraceRequest(pLib));
 }
 
 /*
-       Parse and update cumulative statistice
-       */
-static int diva_ifc_statistics (diva_strace_context_t* pLib,
-                                                                                                                               diva_man_var_header_t* pVar) {
-       diva_man_var_header_t* cur;
+  Parse and update cumulative statistice
+*/
+static int diva_ifc_statistics(diva_strace_context_t *pLib,
+                              diva_man_var_header_t *pVar) {
+       diva_man_var_header_t *cur;
        int i, one_updated = 0, mdm_updated = 0, fax_updated = 0;
 
        for (i  = pLib->statistic_parse_first; i <= pLib->statistic_parse_last; i++) {
-               if ((cur = find_var (pVar, pLib->parse_table[i].path))) {
-                       if (diva_trace_read_variable (cur, pLib->parse_table[i].variable)) {
-                               diva_trace_error (pLib, -3 , __FILE__, __LINE__);
+               if ((cur = find_var(pVar, pLib->parse_table[i].path))) {
+                       if (diva_trace_read_variable(cur, pLib->parse_table[i].variable)) {
+                               diva_trace_error(pLib, -3 , __FILE__, __LINE__);
                                return (-1);
                        }
                        one_updated = 1;
-      if ((i >= pLib->mdm_statistic_parse_first) && (i <= pLib->mdm_statistic_parse_last)) {
-        mdm_updated = 1;
-      }
-      if ((i >= pLib->fax_statistic_parse_first) && (i <= pLib->fax_statistic_parse_last)) {
-        fax_updated = 1;
-      }
+                       if ((i >= pLib->mdm_statistic_parse_first) && (i <= pLib->mdm_statistic_parse_last)) {
+                               mdm_updated = 1;
+                       }
+                       if ((i >= pLib->fax_statistic_parse_first) && (i <= pLib->fax_statistic_parse_last)) {
+                               fax_updated = 1;
+                       }
                }
        }
 
        /*
-               We do not use first event to notify user - this is the event that is
-               generated as result of EVENT ON operation and is used only to initialize
-               internal variables of application
-               */
-  if (mdm_updated) {
-               diva_trace_notify_user (pLib, 0, DIVA_SUPER_TRACE_NOTIFY_MDM_STAT_CHANGE);
-  } else if (fax_updated) {
-               diva_trace_notify_user (pLib, 0, DIVA_SUPER_TRACE_NOTIFY_FAX_STAT_CHANGE);
-  } else if (one_updated) {
-               diva_trace_notify_user (pLib, 0, DIVA_SUPER_TRACE_NOTIFY_STAT_CHANGE);
+         We do not use first event to notify user - this is the event that is
+         generated as result of EVENT ON operation and is used only to initialize
+         internal variables of application
+       */
+       if (mdm_updated) {
+               diva_trace_notify_user(pLib, 0, DIVA_SUPER_TRACE_NOTIFY_MDM_STAT_CHANGE);
+       } else if (fax_updated) {
+               diva_trace_notify_user(pLib, 0, DIVA_SUPER_TRACE_NOTIFY_FAX_STAT_CHANGE);
+       } else if (one_updated) {
+               diva_trace_notify_user(pLib, 0, DIVA_SUPER_TRACE_NOTIFY_STAT_CHANGE);
        }
 
        return (one_updated ? 0 : -1);
 }
 
-static int SuperTraceGetOutgoingCallStatistics (void* hLib) {
-       diva_strace_context_t* pLib = (diva_strace_context_t*)hLib;
+static int SuperTraceGetOutgoingCallStatistics(void *hLib) {
+       diva_strace_context_t *pLib = (diva_strace_context_t *)hLib;
        pLib->outgoing_ifc_stats = 1;
-       return (ScheduleNextTraceRequest (pLib));
+       return (ScheduleNextTraceRequest(pLib));
 }
 
-static int SuperTraceGetIncomingCallStatistics (void* hLib) {
-       diva_strace_context_t* pLib = (diva_strace_context_t*)hLib;
+static int SuperTraceGetIncomingCallStatistics(void *hLib) {
+       diva_strace_context_t *pLib = (diva_strace_context_t *)hLib;
        pLib->incoming_ifc_stats = 1;
-       return (ScheduleNextTraceRequest (pLib));
+       return (ScheduleNextTraceRequest(pLib));
 }
 
-static int SuperTraceGetModemStatistics (void* hLib) {
-       diva_strace_context_t* pLib = (diva_strace_context_t*)hLib;
+static int SuperTraceGetModemStatistics(void *hLib) {
+       diva_strace_context_t *pLib = (diva_strace_context_t *)hLib;
        pLib->modem_ifc_stats = 1;
-       return (ScheduleNextTraceRequest (pLib));
+       return (ScheduleNextTraceRequest(pLib));
 }
 
-static int SuperTraceGetFaxStatistics (void* hLib) {
-       diva_strace_context_t* pLib = (diva_strace_context_t*)hLib;
+static int SuperTraceGetFaxStatistics(void *hLib) {
+       diva_strace_context_t *pLib = (diva_strace_context_t *)hLib;
        pLib->fax_ifc_stats = 1;
-       return (ScheduleNextTraceRequest (pLib));
+       return (ScheduleNextTraceRequest(pLib));
 }
 
-static int SuperTraceGetBLayer1Statistics (void* hLib) {
-       diva_strace_context_t* pLib = (diva_strace_context_t*)hLib;
+static int SuperTraceGetBLayer1Statistics(void *hLib) {
+       diva_strace_context_t *pLib = (diva_strace_context_t *)hLib;
        pLib->b1_ifc_stats = 1;
-       return (ScheduleNextTraceRequest (pLib));
+       return (ScheduleNextTraceRequest(pLib));
 }
 
-static int SuperTraceGetBLayer2Statistics (void* hLib) {
-       diva_strace_context_t* pLib = (diva_strace_context_t*)hLib;
+static int SuperTraceGetBLayer2Statistics(void *hLib) {
+       diva_strace_context_t *pLib = (diva_strace_context_t *)hLib;
        pLib->b2_ifc_stats = 1;
-       return (ScheduleNextTraceRequest (pLib));
+       return (ScheduleNextTraceRequest(pLib));
 }
 
-static int SuperTraceGetDLayer1Statistics (void* hLib) {
-       diva_strace_context_t* pLib = (diva_strace_context_t*)hLib;
+static int SuperTraceGetDLayer1Statistics(void *hLib) {
+       diva_strace_context_t *pLib = (diva_strace_context_t *)hLib;
        pLib->d1_ifc_stats = 1;
-       return (ScheduleNextTraceRequest (pLib));
+       return (ScheduleNextTraceRequest(pLib));
 }
 
-static int SuperTraceGetDLayer2Statistics (void* hLib) {
-       diva_strace_context_t* pLib = (diva_strace_context_t*)hLib;
+static int SuperTraceGetDLayer2Statistics(void *hLib) {
+       diva_strace_context_t *pLib = (diva_strace_context_t *)hLib;
        pLib->d2_ifc_stats = 1;
-       return (ScheduleNextTraceRequest (pLib));
+       return (ScheduleNextTraceRequest(pLib));
 }
 
-dword DivaSTraceGetMemotyRequirement (int channels) {
-  dword parse_entries = (MODEM_PARSE_ENTRIES + FAX_PARSE_ENTRIES + \
-                                                                                                STAT_PARSE_ENTRIES + \
-                                                                                                LINE_PARSE_ENTRIES + 1) * channels;
-  return (sizeof(diva_strace_context_t) + \
-          (parse_entries * sizeof(diva_strace_path2action_t)));
+dword DivaSTraceGetMemotyRequirement(int channels) {
+       dword parse_entries = (MODEM_PARSE_ENTRIES + FAX_PARSE_ENTRIES + \
+                              STAT_PARSE_ENTRIES + \
+                              LINE_PARSE_ENTRIES + 1) * channels;
+       return (sizeof(diva_strace_context_t) + \
+               (parse_entries * sizeof(diva_strace_path2action_t)));
 }
-
index 4f06294..2b46147 100644 (file)
@@ -1,52 +1,52 @@
 /*
  *
-  Copyright (c) Eicon Networks, 2000.
+ Copyright (c) Eicon Networks, 2000.
  *
-  This source file is supplied for the use with
-  Eicon Networks range of DIVA Server Adapters.
+ This source file is supplied for the use with
+ Eicon Networks range of DIVA Server Adapters.
  *
-  Eicon File Revision :    1.9
+ Eicon File Revision :    1.9
  *
-  This program is free software; you can redistribute it and/or modify
-  it under the terms of the GNU General Public License as published by
-  the Free Software Foundation; either version 2, or (at your option)
-  any later version.
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
  *
-  This program is distributed in the hope that it will be useful,
-  but WITHOUT ANY WARRANTY OF ANY KIND WHATSOEVER INCLUDING ANY
-  implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-  See the GNU General Public License for more details.
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY OF ANY KIND WHATSOEVER INCLUDING ANY
+ implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ See the GNU General Public License for more details.
  *
-  You should have received a copy of the GNU General Public License
-  along with this program; if not, write to the Free Software
-  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  *
  */
 #ifndef __DIVA_EICON_TRACE_IDI_IFC_H__
 #define __DIVA_EICON_TRACE_IDI_IFC_H__
 
-void* SuperTraceOpenAdapter   (int AdapterNumber);
-int   SuperTraceCloseAdapter  (void* AdapterHandle);
-int   SuperTraceWrite         (void* AdapterHandle,
-                               const void* data, int length);
-int   SuperTraceReadRequest   (void* AdapterHandle,const char* name,byte* data);
-int   SuperTraceGetNumberOfChannels (void* AdapterHandle);
-int   SuperTraceASSIGN        (void* AdapterHandle, byte* data);
-int   SuperTraceREMOVE        (void* AdapterHandle);
-int   SuperTraceTraceOnRequest(void* hAdapter, const char* name, byte* data);
-int   SuperTraceWriteVar (void* AdapterHandle,
-                                                                                               byte* data,
-                                                                                               const char* name,
-                                                                                               void* var,
-                                                                                               byte type,
-                                                                                               byte var_length);
-int   SuperTraceExecuteRequest (void* AdapterHandle,
-                                                                                                                               const char* name,
-                                                                                                                               byte* data);
+void *SuperTraceOpenAdapter(int AdapterNumber);
+int SuperTraceCloseAdapter(void *AdapterHandle);
+int SuperTraceWrite(void *AdapterHandle,
+                   const void *data, int length);
+int SuperTraceReadRequest(void *AdapterHandle, const char *name, byte *data);
+int SuperTraceGetNumberOfChannels(void *AdapterHandle);
+int SuperTraceASSIGN(void *AdapterHandle, byte *data);
+int SuperTraceREMOVE(void *AdapterHandle);
+int SuperTraceTraceOnRequest(void *hAdapter, const char *name, byte *data);
+int SuperTraceWriteVar(void *AdapterHandle,
+                      byte *data,
+                      const char *name,
+                      void *var,
+                      byte type,
+                      byte var_length);
+int SuperTraceExecuteRequest(void *AdapterHandle,
+                            const char *name,
+                            byte *data);
 
 typedef struct _diva_strace_path2action {
-       char               path[64]; /* Full path to variable            */
-       void*                                                    variable; /* Variable that will receive value */
+       char path[64]; /* Full path to variable            */
+       void *variable; /* Variable that will receive value */
 } diva_strace_path2action_t;
 
 #define DIVA_MAX_MANAGEMENT_TRANSFER_SIZE 4096
@@ -54,27 +54,27 @@ typedef struct _diva_strace_path2action {
 typedef struct _diva_strace_context {
        diva_strace_library_interface_t instance;
 
-       int   Adapter;
-       void* hAdapter;
+       int Adapter;
+       void *hAdapter;
 
        int Channels;
-       int     req_busy;
+       int req_busy;
 
-  ENTITY   e;
-  IDI_CALL request;
-  BUFFERS  XData;
-  BUFFERS  RData;
+       ENTITY e;
+       IDI_CALL request;
+       BUFFERS XData;
+       BUFFERS RData;
        byte buffer[DIVA_MAX_MANAGEMENT_TRANSFER_SIZE + 1];
-  int removal_state;
-  int general_b_ch_event;
-  int general_fax_event;
-  int general_mdm_event;
+       int removal_state;
+       int general_b_ch_event;
+       int general_fax_event;
+       int general_mdm_event;
 
-       byte    rc_ok;
+       byte rc_ok;
 
        /*
-               Initialization request state machine
-               */
+         Initialization request state machine
+       */
        int ChannelsTraceActive;
        int ModemTraceActive;
        int FaxTraceActive;
@@ -93,8 +93,8 @@ typedef struct _diva_strace_context {
        int l2_trace;
 
        /*
-               Trace\Event Enable
-               */
+         Trace\Event Enable
+       */
        word trace_event_mask;
        word current_trace_event_mask;
 
@@ -112,7 +112,7 @@ typedef struct _diva_strace_context {
 
        int     parse_entries;
        int     cur_parse_entry;
-       diva_strace_path2action_t* parse_table;
+       diva_strace_path2action_t *parse_table;
 
        diva_trace_library_user_interface_t user_proc_table;
 
@@ -169,4 +169,3 @@ typedef struct _diva_man_var_header {
 } diva_man_var_header_t;
 
 #endif
-
index cb4ef4c..249c471 100644 (file)
@@ -1,25 +1,25 @@
 /*
  *
-  Copyright (c) Eicon Networks, 2002.
+ Copyright (c) Eicon Networks, 2002.
  *
-  This source file is supplied for the use with
-  Eicon Networks range of DIVA Server Adapters.
+ This source file is supplied for the use with
+ Eicon Networks range of DIVA Server Adapters.
  *
-  Eicon File Revision :    1.9
+ Eicon File Revision :    1.9
  *
-  This program is free software; you can redistribute it and/or modify
-  it under the terms of the GNU General Public License as published by
-  the Free Software Foundation; either version 2, or (at your option)
-  any later version.
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
  *
-  This program is distributed in the hope that it will be useful,
-  but WITHOUT ANY WARRANTY OF ANY KIND WHATSOEVER INCLUDING ANY
-  implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-  See the GNU General Public License for more details.
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY OF ANY KIND WHATSOEVER INCLUDING ANY
+ implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ See the GNU General Public License for more details.
  *
-  You should have received a copy of the GNU General Public License
-  along with this program; if not, write to the Free Software
-  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  *
  */
 /* Definitions for use with the Management Information Element      */
 typedef struct mi_xlog_hdr_s MI_XLOG_HDR;
 struct mi_xlog_hdr_s
 {
-  unsigned long  time;   /* Timestamp in msec units                 */
-  unsigned short size;   /* Size of data that follows               */
-  unsigned short code;   /* code of trace event                     */
+       unsigned long  time;   /* Timestamp in msec units                 */
+       unsigned short size;   /* Size of data that follows               */
+       unsigned short code;   /* code of trace event                     */
 };                       /* unspecified data follows this header    */
 
 /*------------------------------------------------------------------*/
index 7a737e1..0e6b2e0 100644 (file)
@@ -1,26 +1,26 @@
 
 /*
  *
-  Copyright (c) Eicon Networks, 2002.
+ Copyright (c) Eicon Networks, 2002.
  *
-  This source file is supplied for the use with
-  Eicon Networks range of DIVA Server Adapters.
+ This source file is supplied for the use with
+ Eicon Networks range of DIVA Server Adapters.
  *
-  Eicon File Revision :    2.1
+ Eicon File Revision :    2.1
  *
-  This program is free software; you can redistribute it and/or modify
-  it under the terms of the GNU General Public License as published by
-  the Free Software Foundation; either version 2, or (at your option)
-  any later version.
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
  *
-  This program is distributed in the hope that it will be useful,
-  but WITHOUT ANY WARRANTY OF ANY KIND WHATSOEVER INCLUDING ANY
-  implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-  See the GNU General Public License for more details.
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY OF ANY KIND WHATSOEVER INCLUDING ANY
+ implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ See the GNU General Public License for more details.
  *
-  You should have received a copy of the GNU General Public License
-  along with this program; if not, write to the Free Software
-  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  *
  */
 #ifndef __EICON_MDM_MSG_H__
 #define DSP_UDATA_INDICATION_CTS_OFF  0x03
 #define DSP_UDATA_INDICATION_CTS_ON  0x04
 /* =====================================================================
-DCD_OFF Message:
-  <word> time of DCD off (sampled from counter at 8kHz)
-DCD_ON Message:
-  <word> time of DCD on (sampled from counter at 8kHz)
-  <byte> connected norm
-  <word> connected options
-  <dword> connected speed (bit/s, max of tx and rx speed)
-  <word> roundtrip delay (ms)
-  <dword> connected speed tx (bit/s)
-  <dword> connected speed rx (bit/s)
-  Size of this message == 19 bytes, but we will receive only 11
-  ===================================================================== */
+   DCD_OFF Message:
+   <word> time of DCD off (sampled from counter at 8kHz)
+   DCD_ON Message:
+   <word> time of DCD on (sampled from counter at 8kHz)
+   <byte> connected norm
+   <word> connected options
+   <dword> connected speed (bit/s, max of tx and rx speed)
+   <word> roundtrip delay (ms)
+   <dword> connected speed tx (bit/s)
+   <dword> connected speed rx (bit/s)
+   Size of this message == 19 bytes, but we will receive only 11
+   ===================================================================== */
 #define DSP_CONNECTED_NORM_UNSPECIFIED      0
 #define DSP_CONNECTED_NORM_V21              1
 #define DSP_CONNECTED_NORM_V23              2
@@ -129,14 +129,14 @@ DCD_ON Message:
 #define DSP_CONNECTED_OPTION_MASK_COMPRESSION    0x0320
 #define DSP_UDATA_INDICATION_DISCONNECT         5
 /*
-returns:
+  returns:
   <byte> cause
 */
 /* ==========================================================
-    DLC: B2 modem configuration
+   DLC: B2 modem configuration
    ========================================================== */
 /*
-Fields in assign DLC information element for modem protocol V.42/MNP:
+  Fields in assign DLC information element for modem protocol V.42/MNP:
   <byte> length of information element
   <word> information field length
   <byte> address A       (not used, default 3)
@@ -172,10 +172,10 @@ Fields in assign DLC information element for modem protocol V.42/MNP:
 #define DLC_MODEMPROT_APPL_EARLY_CONNECT     0x01
 #define DLC_MODEMPROT_APPL_PASS_INDICATIONS  0x02
 /* ==========================================================
-    CAI parameters used for the modem L1 configuration
+   CAI parameters used for the modem L1 configuration
    ========================================================== */
 /*
-Fields in assign CAI information element:
+  Fields in assign CAI information element:
   <byte> length of information element
   <byte> info field and B-channel hardware
   <byte> rate adaptation bit rate
@@ -311,21 +311,21 @@ Fields in assign CAI information element:
 #define DSP_CAI_MODEM_SPEAKER_VOLUME_MAX   0x0c
 #define DSP_CAI_MODEM_SPEAKER_VOLUME_MASK  0x0c
 /* ==========================================================
-    DCD/CTS State
+   DCD/CTS State
    ========================================================== */
 #define MDM_WANT_CONNECT_B3_ACTIVE_I  0x01
 #define MDM_NCPI_VALID                0x02
 #define MDM_NCPI_CTS_ON_RECEIVED      0x04
 #define MDM_NCPI_DCD_ON_RECEIVED      0x08
 /* ==========================================================
-    CAPI NCPI Constants
+   CAPI NCPI Constants
    ========================================================== */
 #define MDM_NCPI_ECM_V42              0x0001
 #define MDM_NCPI_ECM_MNP              0x0002
 #define MDM_NCPI_TRANSPARENT          0x0004
 #define MDM_NCPI_COMPRESSED           0x0010
 /* ==========================================================
-    CAPI B2 Config Constants
+   CAPI B2 Config Constants
    ========================================================== */
 #define MDM_B2_DISABLE_V42bis         0x0001
 #define MDM_B2_DISABLE_MNP            0x0002
@@ -333,7 +333,7 @@ Fields in assign CAI information element:
 #define MDM_B2_DISABLE_V42            0x0008
 #define MDM_B2_DISABLE_COMP           0x0010
 /* ==========================================================
-    CAPI B1 Config Constants
+   CAPI B1 Config Constants
    ========================================================== */
 #define MDM_CAPI_DISABLE_RETRAIN      0x0001
 #define MDM_CAPI_DISABLE_RING_TONE    0x0002
index a339598..a82e542 100644 (file)
@@ -1,25 +1,25 @@
 /*
  *
-  Copyright (c) Eicon Networks, 2002.
+ Copyright (c) Eicon Networks, 2002.
  *
-  This source file is supplied for the use with
-  Eicon Networks range of DIVA Server Adapters.
+ This source file is supplied for the use with
+ Eicon Networks range of DIVA Server Adapters.
  *
-  Eicon File Revision :    2.1
+ Eicon File Revision :    2.1
  *
-  This program is free software; you can redistribute it and/or modify
-  it under the terms of the GNU General Public License as published by
-  the Free Software Foundation; either version 2, or (at your option)
-  any later version.
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
  *
-  This program is distributed in the hope that it will be useful,
-  but WITHOUT ANY WARRANTY OF ANY KIND WHATSOEVER INCLUDING ANY
-  implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-  See the GNU General Public License for more details.
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY OF ANY KIND WHATSOEVER INCLUDING ANY
+ implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ See the GNU General Public License for more details.
  *
-  You should have received a copy of the GNU General Public License
-  along with this program; if not, write to the Free Software
-  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  *
  */
 
@@ -64,178 +64,178 @@ static dword diva_xdi_extended_features = 0;
 /*
   CAPI can request to process all return codes self only if:
   protocol code supports this && xdi supports this
- */
-#define DIVA_CAPI_SUPPORTS_NO_CANCEL(__a__)   (((__a__)->manufacturer_features&MANUFACTURER_FEATURE_XONOFF_FLOW_CONTROL)&&    ((__a__)->manufacturer_features & MANUFACTURER_FEATURE_OK_FC_LABEL) &&     (diva_xdi_extended_features   & DIVA_CAPI_XDI_PROVIDES_NO_CANCEL))
+*/
+#define DIVA_CAPI_SUPPORTS_NO_CANCEL(__a__)   (((__a__)->manufacturer_features & MANUFACTURER_FEATURE_XONOFF_FLOW_CONTROL) && ((__a__)->manufacturer_features & MANUFACTURER_FEATURE_OK_FC_LABEL) && (diva_xdi_extended_features & DIVA_CAPI_XDI_PROVIDES_NO_CANCEL))
 
 /*------------------------------------------------------------------*/
 /* local function prototypes                                        */
 /*------------------------------------------------------------------*/
 
-static void group_optimization(DIVA_CAPI_ADAPTER   * a, PLCI   * plci);
-static void set_group_ind_mask (PLCI   *plci);
-static void clear_group_ind_mask_bit (PLCI   *plci, word b);
-static byte test_group_ind_mask_bit (PLCI   *plci, word b);
-void AutomaticLaw(DIVA_CAPI_ADAPTER   *);
+static void group_optimization(DIVA_CAPI_ADAPTER *a, PLCI *plci);
+static void set_group_ind_mask(PLCI *plci);
+static void clear_group_ind_mask_bit(PLCI *plci, word b);
+static byte test_group_ind_mask_bit(PLCI *plci, word b);
+void AutomaticLaw(DIVA_CAPI_ADAPTER *);
 word CapiRelease(word);
 word CapiRegister(word);
-word api_put(APPL   *, CAPI_MSG   *);
-static word api_parse(byte   *, word, byte *, API_PARSE *);
-static void api_save_msg(API_PARSE   *in, byte *format, API_SAVE   *out);
-static void api_load_msg(API_SAVE   *in, API_PARSE   *out);
+word api_put(APPL *, CAPI_MSG *);
+static word api_parse(byte *, word, byte *, API_PARSE *);
+static void api_save_msg(API_PARSE *in, byte *format, API_SAVE *out);
+static void api_load_msg(API_SAVE *in, API_PARSE *out);
 
 word api_remove_start(void);
 void api_remove_complete(void);
 
-static void plci_remove(PLCI   *);
-static void diva_get_extended_adapter_features (DIVA_CAPI_ADAPTER  * a);
-static void diva_ask_for_xdi_sdram_bar (DIVA_CAPI_ADAPTER  *, IDI_SYNC_REQ  *);
-
-void   callback(ENTITY   *);
-
-static void control_rc(PLCI   *, byte, byte, byte, byte, byte);
-static void data_rc(PLCI   *, byte);
-static void data_ack(PLCI   *, byte);
-static void sig_ind(PLCI   *);
-static void SendInfo(PLCI   *, dword, byte   * *, byte);
-static void SendSetupInfo(APPL   *, PLCI   *, dword, byte   * *, byte);
-static void SendSSExtInd(APPL   *, PLCI   * plci, dword Id, byte   * * parms);
-
-static void VSwitchReqInd(PLCI   *plci, dword Id, byte   **parms);
-
-static void nl_ind(PLCI   *);
-
-static byte connect_req(dword, word, DIVA_CAPI_ADAPTER   *, PLCI   *, APPL   *, API_PARSE *);
-static byte connect_res(dword, word, DIVA_CAPI_ADAPTER   *, PLCI   *, APPL   *, API_PARSE *);
-static byte connect_a_res(dword,word, DIVA_CAPI_ADAPTER   *, PLCI   *, APPL   *, API_PARSE *);
-static byte disconnect_req(dword, word, DIVA_CAPI_ADAPTER   *, PLCI   *, APPL   *, API_PARSE *);
-static byte disconnect_res(dword, word, DIVA_CAPI_ADAPTER   *, PLCI   *, APPL   *, API_PARSE *);
-static byte listen_req(dword, word, DIVA_CAPI_ADAPTER   *, PLCI   *, APPL   *, API_PARSE *);
-static byte info_req(dword, word, DIVA_CAPI_ADAPTER   *, PLCI   *, APPL   *, API_PARSE *);
-static byte info_res(dword, word, DIVA_CAPI_ADAPTER   *, PLCI   *, APPL   *, API_PARSE *);
-static byte alert_req(dword, word, DIVA_CAPI_ADAPTER   *, PLCI   *, APPL   *, API_PARSE *);
-static byte facility_req(dword, word, DIVA_CAPI_ADAPTER   *, PLCI   *, APPL   *, API_PARSE *);
-static byte facility_res(dword, word, DIVA_CAPI_ADAPTER   *, PLCI   *, APPL   *, API_PARSE *);
-static byte connect_b3_req(dword, word, DIVA_CAPI_ADAPTER   *, PLCI   *, APPL   *, API_PARSE *);
-static byte connect_b3_res(dword, word, DIVA_CAPI_ADAPTER   *, PLCI   *, APPL   *, API_PARSE *);
-static byte connect_b3_a_res(dword, word, DIVA_CAPI_ADAPTER   *, PLCI   *, APPL   *, API_PARSE *);
-static byte disconnect_b3_req(dword, word, DIVA_CAPI_ADAPTER   *, PLCI   *, APPL   *, API_PARSE *);
-static byte disconnect_b3_res(dword, word, DIVA_CAPI_ADAPTER   *, PLCI   *, APPL   *, API_PARSE *);
-static byte data_b3_req(dword, word, DIVA_CAPI_ADAPTER   *, PLCI   *, APPL   *, API_PARSE *);
-static byte data_b3_res(dword, word, DIVA_CAPI_ADAPTER   *, PLCI   *, APPL   *, API_PARSE *);
-static byte reset_b3_req(dword, word, DIVA_CAPI_ADAPTER   *, PLCI   *, APPL   *, API_PARSE *);
-static byte reset_b3_res(dword, word, DIVA_CAPI_ADAPTER   *, PLCI   *, APPL   *, API_PARSE *);
-static byte connect_b3_t90_a_res(dword, word, DIVA_CAPI_ADAPTER   *, PLCI   *, APPL   *, API_PARSE *);
-static byte select_b_req(dword, word, DIVA_CAPI_ADAPTER   *, PLCI   *, APPL   *, API_PARSE *);
-static byte manufacturer_req(dword, word, DIVA_CAPI_ADAPTER   *, PLCI   *, APPL   *, API_PARSE *);
-static byte manufacturer_res(dword, word, DIVA_CAPI_ADAPTER   *, PLCI   *, APPL   *, API_PARSE *);
-
-static word get_plci(DIVA_CAPI_ADAPTER   *);
-static void add_p(PLCI   *, byte, byte   *);
-static void add_s(PLCI   * plci, byte code, API_PARSE * p);
-static void add_ss(PLCI   * plci, byte code, API_PARSE * p);
-static void add_ie(PLCI   * plci, byte code, byte   * p, word p_length);
-static void add_d(PLCI   *, word, byte   *);
-static void add_ai(PLCI   *, API_PARSE *);
-static word add_b1(PLCI   *, API_PARSE *, word, word);
-static word add_b23(PLCI   *, API_PARSE *);
-static word add_modem_b23 (PLCI  * plci, API_PARSE* bp_parms);
-static void sig_req(PLCI   *, byte, byte);
-static void nl_req_ncci(PLCI   *, byte, byte);
-static void send_req(PLCI   *);
-static void send_data(PLCI   *);
-static word plci_remove_check(PLCI   *);
-static void listen_check(DIVA_CAPI_ADAPTER   *);
-static byte AddInfo(byte   **, byte   **, byte   *, byte *);
+static void plci_remove(PLCI *);
+static void diva_get_extended_adapter_features(DIVA_CAPI_ADAPTER *a);
+static void diva_ask_for_xdi_sdram_bar(DIVA_CAPI_ADAPTER *, IDI_SYNC_REQ *);
+
+void callback(ENTITY *);
+
+static void control_rc(PLCI *, byte, byte, byte, byte, byte);
+static void data_rc(PLCI *, byte);
+static void data_ack(PLCI *, byte);
+static void sig_ind(PLCI *);
+static void SendInfo(PLCI *, dword, byte **, byte);
+static void SendSetupInfo(APPL *, PLCI *, dword, byte **, byte);
+static void SendSSExtInd(APPL *, PLCI *plci, dword Id, byte **parms);
+
+static void VSwitchReqInd(PLCI *plci, dword Id, byte **parms);
+
+static void nl_ind(PLCI *);
+
+static byte connect_req(dword, word, DIVA_CAPI_ADAPTER *, PLCI *, APPL *, API_PARSE *);
+static byte connect_res(dword, word, DIVA_CAPI_ADAPTER *, PLCI *, APPL *, API_PARSE *);
+static byte connect_a_res(dword, word, DIVA_CAPI_ADAPTER *, PLCI *, APPL *, API_PARSE *);
+static byte disconnect_req(dword, word, DIVA_CAPI_ADAPTER *, PLCI *, APPL *, API_PARSE *);
+static byte disconnect_res(dword, word, DIVA_CAPI_ADAPTER *, PLCI *, APPL *, API_PARSE *);
+static byte listen_req(dword, word, DIVA_CAPI_ADAPTER *, PLCI *, APPL *, API_PARSE *);
+static byte info_req(dword, word, DIVA_CAPI_ADAPTER *, PLCI *, APPL *, API_PARSE *);
+static byte info_res(dword, word, DIVA_CAPI_ADAPTER *, PLCI *, APPL *, API_PARSE *);
+static byte alert_req(dword, word, DIVA_CAPI_ADAPTER *, PLCI *, APPL *, API_PARSE *);
+static byte facility_req(dword, word, DIVA_CAPI_ADAPTER *, PLCI *, APPL *, API_PARSE *);
+static byte facility_res(dword, word, DIVA_CAPI_ADAPTER *, PLCI *, APPL *, API_PARSE *);
+static byte connect_b3_req(dword, word, DIVA_CAPI_ADAPTER *, PLCI *, APPL *, API_PARSE *);
+static byte connect_b3_res(dword, word, DIVA_CAPI_ADAPTER *, PLCI *, APPL *, API_PARSE *);
+static byte connect_b3_a_res(dword, word, DIVA_CAPI_ADAPTER *, PLCI *, APPL *, API_PARSE *);
+static byte disconnect_b3_req(dword, word, DIVA_CAPI_ADAPTER *, PLCI *, APPL *, API_PARSE *);
+static byte disconnect_b3_res(dword, word, DIVA_CAPI_ADAPTER *, PLCI *, APPL *, API_PARSE *);
+static byte data_b3_req(dword, word, DIVA_CAPI_ADAPTER *, PLCI *, APPL *, API_PARSE *);
+static byte data_b3_res(dword, word, DIVA_CAPI_ADAPTER *, PLCI *, APPL *, API_PARSE *);
+static byte reset_b3_req(dword, word, DIVA_CAPI_ADAPTER *, PLCI *, APPL *, API_PARSE *);
+static byte reset_b3_res(dword, word, DIVA_CAPI_ADAPTER *, PLCI *, APPL *, API_PARSE *);
+static byte connect_b3_t90_a_res(dword, word, DIVA_CAPI_ADAPTER *, PLCI *, APPL *, API_PARSE *);
+static byte select_b_req(dword, word, DIVA_CAPI_ADAPTER *, PLCI *, APPL *, API_PARSE *);
+static byte manufacturer_req(dword, word, DIVA_CAPI_ADAPTER *, PLCI *, APPL *, API_PARSE *);
+static byte manufacturer_res(dword, word, DIVA_CAPI_ADAPTER *, PLCI *, APPL *, API_PARSE *);
+
+static word get_plci(DIVA_CAPI_ADAPTER *);
+static void add_p(PLCI *, byte, byte *);
+static void add_s(PLCI *plci, byte code, API_PARSE *p);
+static void add_ss(PLCI *plci, byte code, API_PARSE *p);
+static void add_ie(PLCI *plci, byte code, byte *p, word p_length);
+static void add_d(PLCI *, word, byte *);
+static void add_ai(PLCI *, API_PARSE *);
+static word add_b1(PLCI *, API_PARSE *, word, word);
+static word add_b23(PLCI *, API_PARSE *);
+static word add_modem_b23(PLCI *plci, API_PARSE *bp_parms);
+static void sig_req(PLCI *, byte, byte);
+static void nl_req_ncci(PLCI *, byte, byte);
+static void send_req(PLCI *);
+static void send_data(PLCI *);
+static word plci_remove_check(PLCI *);
+static void listen_check(DIVA_CAPI_ADAPTER *);
+static byte AddInfo(byte **, byte **, byte *, byte *);
 static byte getChannel(API_PARSE *);
-static void IndParse(PLCI   *, word *, byte   **, byte);
-static byte ie_compare(byte   *, byte *);
-static word find_cip(DIVA_CAPI_ADAPTER   *, byte   *, byte   *);
-static word CPN_filter_ok(byte   *cpn,DIVA_CAPI_ADAPTER   *,word);
+static void IndParse(PLCI *, word *, byte **, byte);
+static byte ie_compare(byte *, byte *);
+static word find_cip(DIVA_CAPI_ADAPTER *, byte *, byte *);
+static word CPN_filter_ok(byte *cpn, DIVA_CAPI_ADAPTER *, word);
 
 /*
   XON protocol helpers
-  */
-static void channel_flow_control_remove (PLCI   * plci);
-static void channel_x_off (PLCI   * plci, byte ch, byte flag);
-static void channel_x_on (PLCI   * plci, byte ch);
-static void channel_request_xon (PLCI   * plci, byte ch);
-static void channel_xmit_xon (PLCI   * plci);
-static int channel_can_xon (PLCI   * plci, byte ch);
-static void channel_xmit_extended_xon (PLCI   * plci);
-
-static byte SendMultiIE(PLCI   * plci, dword Id, byte   * * parms, byte ie_type, dword info_mask, byte setupParse);
-static word AdvCodecSupport(DIVA_CAPI_ADAPTER   *, PLCI   *, APPL   *, byte);
-static void CodecIdCheck(DIVA_CAPI_ADAPTER   *, PLCI   *);
-static void SetVoiceChannel(PLCI   *, byte   *, DIVA_CAPI_ADAPTER   * );
-static void VoiceChannelOff(PLCI   *plci);
-static void adv_voice_write_coefs (PLCI   *plci, word write_command);
-static void adv_voice_clear_config (PLCI   *plci);
-
-static word get_b1_facilities (PLCI   * plci, byte b1_resource);
-static byte add_b1_facilities (PLCI   * plci, byte b1_resource, word b1_facilities);
-static void adjust_b1_facilities (PLCI   *plci, byte new_b1_resource, word new_b1_facilities);
-static word adjust_b_process (dword Id, PLCI   *plci, byte Rc);
-static void adjust_b1_resource (dword Id, PLCI   *plci, API_SAVE   *bp_msg, word b1_facilities, word internal_command);
-static void adjust_b_restore (dword Id, PLCI   *plci, byte Rc);
-static void reset_b3_command (dword Id, PLCI   *plci, byte Rc);
-static void select_b_command (dword Id, PLCI   *plci, byte Rc);
-static void fax_connect_ack_command (dword Id, PLCI   *plci, byte Rc);
-static void fax_edata_ack_command (dword Id, PLCI   *plci, byte Rc);
-static void fax_connect_info_command (dword Id, PLCI   *plci, byte Rc);
-static void fax_adjust_b23_command (dword Id, PLCI   *plci, byte Rc);
-static void fax_disconnect_command (dword Id, PLCI   *plci, byte Rc);
-static void hold_save_command (dword Id, PLCI   *plci, byte Rc);
-static void retrieve_restore_command (dword Id, PLCI   *plci, byte Rc);
-static void init_b1_config (PLCI   *plci);
-static void clear_b1_config (PLCI   *plci);
-
-static void dtmf_command (dword Id, PLCI   *plci, byte Rc);
-static byte dtmf_request (dword Id, word Number, DIVA_CAPI_ADAPTER   *a, PLCI   *plci, APPL   *appl, API_PARSE *msg);
-static void dtmf_confirmation (dword Id, PLCI   *plci);
-static void dtmf_indication (dword Id, PLCI   *plci, byte   *msg, word length);
-static void dtmf_parameter_write (PLCI   *plci);
-
-
-static void mixer_set_bchannel_id_esc (PLCI   *plci, byte bchannel_id);
-static void mixer_set_bchannel_id (PLCI   *plci, byte   *chi);
-static void mixer_clear_config (PLCI   *plci);
-static void mixer_notify_update (PLCI   *plci, byte others);
-static void mixer_command (dword Id, PLCI   *plci, byte Rc);
-static byte mixer_request (dword Id, word Number, DIVA_CAPI_ADAPTER   *a, PLCI   *plci, APPL   *appl, API_PARSE *msg);
-static void mixer_indication_coefs_set (dword Id, PLCI   *plci);
-static void mixer_indication_xconnect_from (dword Id, PLCI   *plci, byte   *msg, word length);
-static void mixer_indication_xconnect_to (dword Id, PLCI   *plci, byte   *msg, word length);
-static void mixer_remove (PLCI   *plci);
-
-
-static void ec_command (dword Id, PLCI   *plci, byte Rc);
-static byte ec_request (dword Id, word Number, DIVA_CAPI_ADAPTER   *a, PLCI   *plci, APPL   *appl, API_PARSE *msg);
-static void ec_indication (dword Id, PLCI   *plci, byte   *msg, word length);
-
-
-static void rtp_connect_b3_req_command (dword Id, PLCI   *plci, byte Rc);
-static void rtp_connect_b3_res_command (dword Id, PLCI   *plci, byte Rc);
-
-
-static int  diva_get_dma_descriptor  (PLCI   *plci, dword   *dma_magic);
-static void diva_free_dma_descriptor (PLCI   *plci, int nr);
+*/
+static void channel_flow_control_remove(PLCI *plci);
+static void channel_x_off(PLCI *plci, byte ch, byte flag);
+static void channel_x_on(PLCI *plci, byte ch);
+static void channel_request_xon(PLCI *plci, byte ch);
+static void channel_xmit_xon(PLCI *plci);
+static int channel_can_xon(PLCI *plci, byte ch);
+static void channel_xmit_extended_xon(PLCI *plci);
+
+static byte SendMultiIE(PLCI *plci, dword Id, byte **parms, byte ie_type, dword info_mask, byte setupParse);
+static word AdvCodecSupport(DIVA_CAPI_ADAPTER *, PLCI *, APPL *, byte);
+static void CodecIdCheck(DIVA_CAPI_ADAPTER *, PLCI *);
+static void SetVoiceChannel(PLCI *, byte *, DIVA_CAPI_ADAPTER *);
+static void VoiceChannelOff(PLCI *plci);
+static void adv_voice_write_coefs(PLCI *plci, word write_command);
+static void adv_voice_clear_config(PLCI *plci);
+
+static word get_b1_facilities(PLCI *plci, byte b1_resource);
+static byte add_b1_facilities(PLCI *plci, byte b1_resource, word b1_facilities);
+static void adjust_b1_facilities(PLCI *plci, byte new_b1_resource, word new_b1_facilities);
+static word adjust_b_process(dword Id, PLCI *plci, byte Rc);
+static void adjust_b1_resource(dword Id, PLCI *plci, API_SAVE *bp_msg, word b1_facilities, word internal_command);
+static void adjust_b_restore(dword Id, PLCI *plci, byte Rc);
+static void reset_b3_command(dword Id, PLCI *plci, byte Rc);
+static void select_b_command(dword Id, PLCI *plci, byte Rc);
+static void fax_connect_ack_command(dword Id, PLCI *plci, byte Rc);
+static void fax_edata_ack_command(dword Id, PLCI *plci, byte Rc);
+static void fax_connect_info_command(dword Id, PLCI *plci, byte Rc);
+static void fax_adjust_b23_command(dword Id, PLCI *plci, byte Rc);
+static void fax_disconnect_command(dword Id, PLCI *plci, byte Rc);
+static void hold_save_command(dword Id, PLCI *plci, byte Rc);
+static void retrieve_restore_command(dword Id, PLCI *plci, byte Rc);
+static void init_b1_config(PLCI *plci);
+static void clear_b1_config(PLCI *plci);
+
+static void dtmf_command(dword Id, PLCI *plci, byte Rc);
+static byte dtmf_request(dword Id, word Number, DIVA_CAPI_ADAPTER *a, PLCI *plci, APPL *appl, API_PARSE *msg);
+static void dtmf_confirmation(dword Id, PLCI *plci);
+static void dtmf_indication(dword Id, PLCI *plci, byte *msg, word length);
+static void dtmf_parameter_write(PLCI *plci);
+
+
+static void mixer_set_bchannel_id_esc(PLCI *plci, byte bchannel_id);
+static void mixer_set_bchannel_id(PLCI *plci, byte *chi);
+static void mixer_clear_config(PLCI *plci);
+static void mixer_notify_update(PLCI *plci, byte others);
+static void mixer_command(dword Id, PLCI *plci, byte Rc);
+static byte mixer_request(dword Id, word Number, DIVA_CAPI_ADAPTER *a, PLCI *plci, APPL *appl, API_PARSE *msg);
+static void mixer_indication_coefs_set(dword Id, PLCI *plci);
+static void mixer_indication_xconnect_from(dword Id, PLCI *plci, byte *msg, word length);
+static void mixer_indication_xconnect_to(dword Id, PLCI *plci, byte *msg, word length);
+static void mixer_remove(PLCI *plci);
+
+
+static void ec_command(dword Id, PLCI *plci, byte Rc);
+static byte ec_request(dword Id, word Number, DIVA_CAPI_ADAPTER *a, PLCI *plci, APPL *appl, API_PARSE *msg);
+static void ec_indication(dword Id, PLCI *plci, byte *msg, word length);
+
+
+static void rtp_connect_b3_req_command(dword Id, PLCI *plci, byte Rc);
+static void rtp_connect_b3_res_command(dword Id, PLCI *plci, byte Rc);
+
+
+static int diva_get_dma_descriptor(PLCI *plci, dword *dma_magic);
+static void diva_free_dma_descriptor(PLCI *plci, int nr);
 
 /*------------------------------------------------------------------*/
 /* external function prototypes                                     */
 /*------------------------------------------------------------------*/
 
-extern byte MapController (byte);
-extern byte UnMapController (byte);
-#define MapId(Id) (((Id) & 0xffffff00L) | MapController ((byte)(Id)))
-#define UnMapId(Id) (((Id) & 0xffffff00L) | UnMapController ((byte)(Id)))
+extern byte MapController(byte);
+extern byte UnMapController(byte);
+#define MapId(Id)(((Id) & 0xffffff00L) | MapController((byte)(Id)))
+#define UnMapId(Id)(((Id) & 0xffffff00L) | UnMapController((byte)(Id)))
 
-void   sendf(APPL   *, word, dword, word, byte *, ...);
-void   * TransmitBufferSet(APPL   * appl, dword ref);
-void   * TransmitBufferGet(APPL   * appl, void   * p);
-void TransmitBufferFree(APPL   * appl, void   * p);
-void   * ReceiveBufferGet(APPL   * appl, int Num);
+void sendf(APPL *, word, dword, word, byte *, ...);
+void *TransmitBufferSet(APPL *appl, dword ref);
+void *TransmitBufferGet(APPL *appl, void *p);
+void TransmitBufferFree(APPL *appl, void *p);
+void *ReceiveBufferGet(APPL *appl, int Num);
 
-int fax_head_line_time (char *buffer);
+int fax_head_line_time(char *buffer);
 
 
 /*------------------------------------------------------------------*/
@@ -243,8 +243,8 @@ int fax_head_line_time (char *buffer);
 /*------------------------------------------------------------------*/
 extern byte max_adapter;
 extern byte max_appl;
-extern DIVA_CAPI_ADAPTER   * adapter;
-extern APPL   * application;
+extern DIVA_CAPI_ADAPTER *adapter;
+extern APPL *application;
 
 
 
@@ -257,102 +257,102 @@ static PLCI dummy_plci;
 
 
 static struct _ftable {
-  word command;
-  byte * format;
-  byte (* function)(dword, word, DIVA_CAPI_ADAPTER   *, PLCI   *, APPL   *, API_PARSE *);
+       word command;
+       byte *format;
+       byte (*function)(dword, word, DIVA_CAPI_ADAPTER *, PLCI *, APPL *, API_PARSE *);
 } ftable[] = {
-  {_DATA_B3_R,                          "dwww",         data_b3_req},
-  {_DATA_B3_I|RESPONSE,                 "w",            data_b3_res},
-  {_INFO_R,                             "ss",           info_req},
-  {_INFO_I|RESPONSE,                    "",             info_res},
-  {_CONNECT_R,                          "wsssssssss",   connect_req},
-  {_CONNECT_I|RESPONSE,                 "wsssss",       connect_res},
-  {_CONNECT_ACTIVE_I|RESPONSE,          "",             connect_a_res},
-  {_DISCONNECT_R,                       "s",            disconnect_req},
-  {_DISCONNECT_I|RESPONSE,              "",             disconnect_res},
-  {_LISTEN_R,                           "dddss",        listen_req},
-  {_ALERT_R,                            "s",            alert_req},
-  {_FACILITY_R,                         "ws",           facility_req},
-  {_FACILITY_I|RESPONSE,                "ws",           facility_res},
-  {_CONNECT_B3_R,                       "s",            connect_b3_req},
-  {_CONNECT_B3_I|RESPONSE,              "ws",           connect_b3_res},
-  {_CONNECT_B3_ACTIVE_I|RESPONSE,       "",             connect_b3_a_res},
-  {_DISCONNECT_B3_R,                    "s",            disconnect_b3_req},
-  {_DISCONNECT_B3_I|RESPONSE,           "",             disconnect_b3_res},
-  {_RESET_B3_R,                         "s",            reset_b3_req},
-  {_RESET_B3_I|RESPONSE,                "",             reset_b3_res},
-  {_CONNECT_B3_T90_ACTIVE_I|RESPONSE,   "ws",           connect_b3_t90_a_res},
-  {_CONNECT_B3_T90_ACTIVE_I|RESPONSE,   "",             connect_b3_t90_a_res},
-  {_SELECT_B_REQ,                       "s",            select_b_req},
-  {_MANUFACTURER_R,                     "dws",          manufacturer_req},
-  {_MANUFACTURER_I|RESPONSE,            "dws",          manufacturer_res},
-  {_MANUFACTURER_I|RESPONSE,            "",             manufacturer_res}
+       {_DATA_B3_R,                          "dwww",         data_b3_req},
+       {_DATA_B3_I | RESPONSE,               "w",            data_b3_res},
+       {_INFO_R,                             "ss",           info_req},
+       {_INFO_I | RESPONSE,                  "",             info_res},
+       {_CONNECT_R,                          "wsssssssss",   connect_req},
+       {_CONNECT_I | RESPONSE,               "wsssss",       connect_res},
+       {_CONNECT_ACTIVE_I | RESPONSE,        "",             connect_a_res},
+       {_DISCONNECT_R,                       "s",            disconnect_req},
+       {_DISCONNECT_I | RESPONSE,            "",             disconnect_res},
+       {_LISTEN_R,                           "dddss",        listen_req},
+       {_ALERT_R,                            "s",            alert_req},
+       {_FACILITY_R,                         "ws",           facility_req},
+       {_FACILITY_I | RESPONSE,              "ws",           facility_res},
+       {_CONNECT_B3_R,                       "s",            connect_b3_req},
+       {_CONNECT_B3_I | RESPONSE,            "ws",           connect_b3_res},
+       {_CONNECT_B3_ACTIVE_I | RESPONSE,     "",             connect_b3_a_res},
+       {_DISCONNECT_B3_R,                    "s",            disconnect_b3_req},
+       {_DISCONNECT_B3_I | RESPONSE,         "",             disconnect_b3_res},
+       {_RESET_B3_R,                         "s",            reset_b3_req},
+       {_RESET_B3_I | RESPONSE,              "",             reset_b3_res},
+       {_CONNECT_B3_T90_ACTIVE_I | RESPONSE, "ws",           connect_b3_t90_a_res},
+       {_CONNECT_B3_T90_ACTIVE_I | RESPONSE, "",             connect_b3_t90_a_res},
+       {_SELECT_B_REQ,                       "s",            select_b_req},
+       {_MANUFACTURER_R,                     "dws",          manufacturer_req},
+       {_MANUFACTURER_I | RESPONSE,          "dws",          manufacturer_res},
+       {_MANUFACTURER_I | RESPONSE,          "",             manufacturer_res}
 };
 
-static byte * cip_bc[29][2] = {
-  { "",                     ""                     }, /* 0 */
-  { "\x03\x80\x90\xa3",     "\x03\x80\x90\xa2"     }, /* 1 */
-  { "\x02\x88\x90",         "\x02\x88\x90"         }, /* 2 */
-  { "\x02\x89\x90",         "\x02\x89\x90"         }, /* 3 */
-  { "\x03\x90\x90\xa3",     "\x03\x90\x90\xa2"     }, /* 4 */
-  { "\x03\x91\x90\xa5",     "\x03\x91\x90\xa5"     }, /* 5 */
-  { "\x02\x98\x90",         "\x02\x98\x90"         }, /* 6 */
-  { "\x04\x88\xc0\xc6\xe6", "\x04\x88\xc0\xc6\xe6" }, /* 7 */
-  { "\x04\x88\x90\x21\x8f", "\x04\x88\x90\x21\x8f" }, /* 8 */
-  { "\x03\x91\x90\xa5",     "\x03\x91\x90\xa5"     }, /* 9 */
-  { "",                     ""                     }, /* 10 */
-  { "",                     ""                     }, /* 11 */
-  { "",                     ""                     }, /* 12 */
-  { "",                     ""                     }, /* 13 */
-  { "",                     ""                     }, /* 14 */
-  { "",                     ""                     }, /* 15 */
-
-  { "\x03\x80\x90\xa3",     "\x03\x80\x90\xa2"     }, /* 16 */
-  { "\x03\x90\x90\xa3",     "\x03\x90\x90\xa2"     }, /* 17 */
-  { "\x02\x88\x90",         "\x02\x88\x90"         }, /* 18 */
-  { "\x02\x88\x90",         "\x02\x88\x90"         }, /* 19 */
-  { "\x02\x88\x90",         "\x02\x88\x90"         }, /* 20 */
-  { "\x02\x88\x90",         "\x02\x88\x90"         }, /* 21 */
-  { "\x02\x88\x90",         "\x02\x88\x90"         }, /* 22 */
-  { "\x02\x88\x90",         "\x02\x88\x90"         }, /* 23 */
-  { "\x02\x88\x90",         "\x02\x88\x90"         }, /* 24 */
-  { "\x02\x88\x90",         "\x02\x88\x90"         }, /* 25 */
-  { "\x03\x91\x90\xa5",     "\x03\x91\x90\xa5"     }, /* 26 */
-  { "\x03\x91\x90\xa5",     "\x03\x91\x90\xa5"     }, /* 27 */
-  { "\x02\x88\x90",         "\x02\x88\x90"         }  /* 28 */
+static byte *cip_bc[29][2] = {
+       { "",                     ""                     }, /* 0 */
+       { "\x03\x80\x90\xa3",     "\x03\x80\x90\xa2"     }, /* 1 */
+       { "\x02\x88\x90",         "\x02\x88\x90"         }, /* 2 */
+       { "\x02\x89\x90",         "\x02\x89\x90"         }, /* 3 */
+       { "\x03\x90\x90\xa3",     "\x03\x90\x90\xa2"     }, /* 4 */
+       { "\x03\x91\x90\xa5",     "\x03\x91\x90\xa5"     }, /* 5 */
+       { "\x02\x98\x90",         "\x02\x98\x90"         }, /* 6 */
+       { "\x04\x88\xc0\xc6\xe6", "\x04\x88\xc0\xc6\xe6" }, /* 7 */
+       { "\x04\x88\x90\x21\x8f", "\x04\x88\x90\x21\x8f" }, /* 8 */
+       { "\x03\x91\x90\xa5",     "\x03\x91\x90\xa5"     }, /* 9 */
+       { "",                     ""                     }, /* 10 */
+       { "",                     ""                     }, /* 11 */
+       { "",                     ""                     }, /* 12 */
+       { "",                     ""                     }, /* 13 */
+       { "",                     ""                     }, /* 14 */
+       { "",                     ""                     }, /* 15 */
+
+       { "\x03\x80\x90\xa3",     "\x03\x80\x90\xa2"     }, /* 16 */
+       { "\x03\x90\x90\xa3",     "\x03\x90\x90\xa2"     }, /* 17 */
+       { "\x02\x88\x90",         "\x02\x88\x90"         }, /* 18 */
+       { "\x02\x88\x90",         "\x02\x88\x90"         }, /* 19 */
+       { "\x02\x88\x90",         "\x02\x88\x90"         }, /* 20 */
+       { "\x02\x88\x90",         "\x02\x88\x90"         }, /* 21 */
+       { "\x02\x88\x90",         "\x02\x88\x90"         }, /* 22 */
+       { "\x02\x88\x90",         "\x02\x88\x90"         }, /* 23 */
+       { "\x02\x88\x90",         "\x02\x88\x90"         }, /* 24 */
+       { "\x02\x88\x90",         "\x02\x88\x90"         }, /* 25 */
+       { "\x03\x91\x90\xa5",     "\x03\x91\x90\xa5"     }, /* 26 */
+       { "\x03\x91\x90\xa5",     "\x03\x91\x90\xa5"     }, /* 27 */
+       { "\x02\x88\x90",         "\x02\x88\x90"         }  /* 28 */
 };
 
-static byte * cip_hlc[29] = {
-  "",                           /* 0 */
-  "",                           /* 1 */
-  "",                           /* 2 */
-  "",                           /* 3 */
-  "",                           /* 4 */
-  "",                           /* 5 */
-  "",                           /* 6 */
-  "",                           /* 7 */
-  "",                           /* 8 */
-  "",                           /* 9 */
-  "",                           /* 10 */
-  "",                           /* 11 */
-  "",                           /* 12 */
-  "",                           /* 13 */
-  "",                           /* 14 */
-  "",                           /* 15 */
-
-  "\x02\x91\x81",               /* 16 */
-  "\x02\x91\x84",               /* 17 */
-  "\x02\x91\xa1",               /* 18 */
-  "\x02\x91\xa4",               /* 19 */
-  "\x02\x91\xa8",               /* 20 */
-  "\x02\x91\xb1",               /* 21 */
-  "\x02\x91\xb2",               /* 22 */
-  "\x02\x91\xb5",               /* 23 */
-  "\x02\x91\xb8",               /* 24 */
-  "\x02\x91\xc1",               /* 25 */
-  "\x02\x91\x81",               /* 26 */
-  "\x03\x91\xe0\x01",           /* 27 */
-  "\x03\x91\xe0\x02"            /* 28 */
+static byte *cip_hlc[29] = {
+       "",                           /* 0 */
+       "",                           /* 1 */
+       "",                           /* 2 */
+       "",                           /* 3 */
+       "",                           /* 4 */
+       "",                           /* 5 */
+       "",                           /* 6 */
+       "",                           /* 7 */
+       "",                           /* 8 */
+       "",                           /* 9 */
+       "",                           /* 10 */
+       "",                           /* 11 */
+       "",                           /* 12 */
+       "",                           /* 13 */
+       "",                           /* 14 */
+       "",                           /* 15 */
+
+       "\x02\x91\x81",               /* 16 */
+       "\x02\x91\x84",               /* 17 */
+       "\x02\x91\xa1",               /* 18 */
+       "\x02\x91\xa4",               /* 19 */
+       "\x02\x91\xa8",               /* 20 */
+       "\x02\x91\xb1",               /* 21 */
+       "\x02\x91\xb2",               /* 22 */
+       "\x02\x91\xb5",               /* 23 */
+       "\x02\x91\xb8",               /* 24 */
+       "\x02\x91\xc1",               /* 25 */
+       "\x02\x91\x81",               /* 26 */
+       "\x03\x91\xe0\x01",           /* 27 */
+       "\x03\x91\xe0\x02"            /* 28 */
 };
 
 /*------------------------------------------------------------------*/
@@ -367,14 +367,14 @@ static byte * cip_hlc[29] = {
 static byte v120_default_header[] =
 {
 
-  0x83                          /*  Ext, BR , res, res, C2 , C1 , B  , F   */
+       0x83                          /*  Ext, BR , res, res, C2 , C1 , B  , F   */
 
 };
 
 static byte v120_break_header[] =
 {
 
-  0xc3 | V120_HEADER_BREAK_BIT  /*  Ext, BR , res, res, C2 , C1 , B  , F   */
+       0xc3 | V120_HEADER_BREAK_BIT  /*  Ext, BR , res, res, C2 , C1 , B  , F   */
 
 };
 
@@ -383,206 +383,206 @@ static byte v120_break_header[] =
 /* API_PUT function                                                 */
 /*------------------------------------------------------------------*/
 
-word api_put(APPL   * appl, CAPI_MSG   * msg)
-{
-  word i, j, k, l, n;
-  word ret;
-  byte c;
-  byte controller;
-  DIVA_CAPI_ADAPTER   * a;
-  PLCI   * plci;
-  NCCI   * ncci_ptr;
-  word ncci;
-  CAPI_MSG   *m;
-    API_PARSE msg_parms[MAX_MSG_PARMS+1];
-
-  if (msg->header.length < sizeof (msg->header) ||
-      msg->header.length > MAX_MSG_SIZE) {
-    dbug(1,dprintf("bad len"));
-    return _BAD_MSG;
-  }
-
-  controller = (byte)((msg->header.controller &0x7f)-1);
-
-  /* controller starts with 0 up to (max_adapter - 1) */
-  if ( controller >= max_adapter )
-  {
-    dbug(1,dprintf("invalid ctrl"));
-    return _BAD_MSG;
-  }
-  
-  a = &adapter[controller];
-  plci = NULL;
-  if ((msg->header.plci != 0) && (msg->header.plci <= a->max_plci) && !a->adapter_disabled)
-  {
-    dbug(1,dprintf("plci=%x",msg->header.plci));
-    plci = &a->plci[msg->header.plci-1];
-    ncci = GET_WORD(&msg->header.ncci);
-    if (plci->Id
-     && (plci->appl
-      || (plci->State == INC_CON_PENDING)
-      || (plci->State == INC_CON_ALERT)
-      || (msg->header.command == (_DISCONNECT_I|RESPONSE)))
-     && ((ncci == 0)
-      || (msg->header.command == (_DISCONNECT_B3_I|RESPONSE))
-      || ((ncci < MAX_NCCI+1) && (a->ncci_plci[ncci] == plci->Id))))
-    {
-      i = plci->msg_in_read_pos;
-      j = plci->msg_in_write_pos;
-      if (j >= i)
-      {
-        if (j + msg->header.length + MSG_IN_OVERHEAD <= MSG_IN_QUEUE_SIZE)
-          i += MSG_IN_QUEUE_SIZE - j;
-        else
-          j = 0;
-      }
-      else
-      {
-
-        n = (((CAPI_MSG   *)(plci->msg_in_queue))->header.length + MSG_IN_OVERHEAD + 3) & 0xfffc;
-
-        if (i > MSG_IN_QUEUE_SIZE - n)
-          i = MSG_IN_QUEUE_SIZE - n + 1;
-        i -= j;
-      }
-
-      if (i <= ((msg->header.length + MSG_IN_OVERHEAD + 3) & 0xfffc))
-
-      {
-        dbug(0,dprintf("Q-FULL1(msg) - len=%d write=%d read=%d wrap=%d free=%d",
-          msg->header.length, plci->msg_in_write_pos,
-          plci->msg_in_read_pos, plci->msg_in_wrap_pos, i));
-
-        return _QUEUE_FULL;
-      }
-      c = false;
-      if ((((byte   *) msg) < ((byte   *)(plci->msg_in_queue)))
-       || (((byte   *) msg) >= ((byte   *)(plci->msg_in_queue)) + sizeof(plci->msg_in_queue)))
-      {
-        if (plci->msg_in_write_pos != plci->msg_in_read_pos)
-          c = true;
-      }
-      if (msg->header.command == _DATA_B3_R)
-      {
-        if (msg->header.length < 20)
-        {
-          dbug(1,dprintf("DATA_B3 REQ wrong length %d", msg->header.length));
-          return _BAD_MSG;
-        }
-        ncci_ptr = &(a->ncci[ncci]);
-        n = ncci_ptr->data_pending;
-        l = ncci_ptr->data_ack_pending;
-        k = plci->msg_in_read_pos;
-        while (k != plci->msg_in_write_pos)
-        {
-          if (k == plci->msg_in_wrap_pos)
-            k = 0;
-          if ((((CAPI_MSG   *)(&((byte   *)(plci->msg_in_queue))[k]))->header.command == _DATA_B3_R)
-           && (((CAPI_MSG   *)(&((byte   *)(plci->msg_in_queue))[k]))->header.ncci == ncci))
-          {
-            n++;
-            if (((CAPI_MSG   *)(&((byte   *)(plci->msg_in_queue))[k]))->info.data_b3_req.Flags & 0x0004)
-              l++;
-          }
-
-          k += (((CAPI_MSG   *)(&((byte   *)(plci->msg_in_queue))[k]))->header.length +
-            MSG_IN_OVERHEAD + 3) & 0xfffc;
-
-        }
-        if ((n >= MAX_DATA_B3) || (l >= MAX_DATA_ACK))
-        {
-          dbug(0,dprintf("Q-FULL2(data) - pending=%d/%d ack_pending=%d/%d",
-                          ncci_ptr->data_pending, n, ncci_ptr->data_ack_pending, l));
-
-          return _QUEUE_FULL;
-        }
-        if (plci->req_in || plci->internal_command)
-        {
-          if ((((byte   *) msg) >= ((byte   *)(plci->msg_in_queue)))
-           && (((byte   *) msg) < ((byte   *)(plci->msg_in_queue)) + sizeof(plci->msg_in_queue)))
-          {
-            dbug(0,dprintf("Q-FULL3(requeue)"));
-
-            return _QUEUE_FULL;
-          }
-          c = true;
-        }
-      }
-      else
-      {
-        if (plci->req_in || plci->internal_command)
-          c = true;
-        else
-        {
-          plci->command = msg->header.command;
-          plci->number = msg->header.number;
-        }
-      }
-      if (c)
-      {
-        dbug(1,dprintf("enqueue msg(0x%04x,0x%x,0x%x) - len=%d write=%d read=%d wrap=%d free=%d",
-          msg->header.command, plci->req_in, plci->internal_command,
-          msg->header.length, plci->msg_in_write_pos,
-          plci->msg_in_read_pos, plci->msg_in_wrap_pos, i));
-        if (j == 0)
-          plci->msg_in_wrap_pos = plci->msg_in_write_pos;
-        m = (CAPI_MSG   *)(&((byte   *)(plci->msg_in_queue))[j]);
-        for (i = 0; i < msg->header.length; i++)
-          ((byte   *)(plci->msg_in_queue))[j++] = ((byte   *) msg)[i];
-        if (m->header.command == _DATA_B3_R)
-        {
-
-          m->info.data_b3_req.Data = (dword)(long)(TransmitBufferSet (appl, m->info.data_b3_req.Data));
-
-        }
-
-        j = (j + 3) & 0xfffc;
-
-        *((APPL   *   *)(&((byte   *)(plci->msg_in_queue))[j])) = appl;
-        plci->msg_in_write_pos = j + MSG_IN_OVERHEAD;
-        return 0;
-      }
-    }
-    else
-    {
-      plci = NULL;
-    }
-  }
-  dbug(1,dprintf("com=%x",msg->header.command));
-
-  for(j=0;j<MAX_MSG_PARMS+1;j++) msg_parms[j].length = 0;
-  for(i=0, ret = _BAD_MSG; i < ARRAY_SIZE(ftable); i++) {
-
-    if(ftable[i].command==msg->header.command) {
-      /* break loop if the message is correct, otherwise continue scan  */
-      /* (for example: CONNECT_B3_T90_ACT_RES has two specifications)   */
-      if(!api_parse(msg->info.b,(word)(msg->header.length-12),ftable[i].format,msg_parms)) {
-        ret = 0;
-        break;
-      }
-      for(j=0;j<MAX_MSG_PARMS+1;j++) msg_parms[j].length = 0;
-    }
-  }
-  if(ret) {
-    dbug(1,dprintf("BAD_MSG"));
-    if(plci) plci->command = 0;
-    return ret;
-  }
-
-
-  c = ftable[i].function(GET_DWORD(&msg->header.controller),
-                         msg->header.number,
-                         a,
-                         plci,
-                         appl,
-                         msg_parms);
-
-  channel_xmit_extended_xon (plci);
-
-  if(c==1) send_req(plci);
-  if(c==2 && plci) plci->req_in = plci->req_in_start = plci->req_out = 0;
-  if(plci && !plci->req_in) plci->command = 0;
-  return 0;
+word api_put(APPL *appl, CAPI_MSG *msg)
+{
+       word i, j, k, l, n;
+       word ret;
+       byte c;
+       byte controller;
+       DIVA_CAPI_ADAPTER *a;
+       PLCI *plci;
+       NCCI *ncci_ptr;
+       word ncci;
+       CAPI_MSG *m;
+       API_PARSE msg_parms[MAX_MSG_PARMS + 1];
+
+       if (msg->header.length < sizeof(msg->header) ||
+           msg->header.length > MAX_MSG_SIZE) {
+               dbug(1, dprintf("bad len"));
+               return _BAD_MSG;
+       }
+
+       controller = (byte)((msg->header.controller & 0x7f) - 1);
+
+       /* controller starts with 0 up to (max_adapter - 1) */
+       if (controller >= max_adapter)
+       {
+               dbug(1, dprintf("invalid ctrl"));
+               return _BAD_MSG;
+       }
+
+       a = &adapter[controller];
+       plci = NULL;
+       if ((msg->header.plci != 0) && (msg->header.plci <= a->max_plci) && !a->adapter_disabled)
+       {
+               dbug(1, dprintf("plci=%x", msg->header.plci));
+               plci = &a->plci[msg->header.plci - 1];
+               ncci = GET_WORD(&msg->header.ncci);
+               if (plci->Id
+                   && (plci->appl
+                       || (plci->State == INC_CON_PENDING)
+                       || (plci->State == INC_CON_ALERT)
+                       || (msg->header.command == (_DISCONNECT_I | RESPONSE)))
+                   && ((ncci == 0)
+                       || (msg->header.command == (_DISCONNECT_B3_I | RESPONSE))
+                       || ((ncci < MAX_NCCI + 1) && (a->ncci_plci[ncci] == plci->Id))))
+               {
+                       i = plci->msg_in_read_pos;
+                       j = plci->msg_in_write_pos;
+                       if (j >= i)
+                       {
+                               if (j + msg->header.length + MSG_IN_OVERHEAD <= MSG_IN_QUEUE_SIZE)
+                                       i += MSG_IN_QUEUE_SIZE - j;
+                               else
+                                       j = 0;
+                       }
+                       else
+                       {
+
+                               n = (((CAPI_MSG *)(plci->msg_in_queue))->header.length + MSG_IN_OVERHEAD + 3) & 0xfffc;
+
+                               if (i > MSG_IN_QUEUE_SIZE - n)
+                                       i = MSG_IN_QUEUE_SIZE - n + 1;
+                               i -= j;
+                       }
+
+                       if (i <= ((msg->header.length + MSG_IN_OVERHEAD + 3) & 0xfffc))
+
+                       {
+                               dbug(0, dprintf("Q-FULL1(msg) - len=%d write=%d read=%d wrap=%d free=%d",
+                                               msg->header.length, plci->msg_in_write_pos,
+                                               plci->msg_in_read_pos, plci->msg_in_wrap_pos, i));
+
+                               return _QUEUE_FULL;
+                       }
+                       c = false;
+                       if ((((byte *) msg) < ((byte *)(plci->msg_in_queue)))
+                           || (((byte *) msg) >= ((byte *)(plci->msg_in_queue)) + sizeof(plci->msg_in_queue)))
+                       {
+                               if (plci->msg_in_write_pos != plci->msg_in_read_pos)
+                                       c = true;
+                       }
+                       if (msg->header.command == _DATA_B3_R)
+                       {
+                               if (msg->header.length < 20)
+                               {
+                                       dbug(1, dprintf("DATA_B3 REQ wrong length %d", msg->header.length));
+                                       return _BAD_MSG;
+                               }
+                               ncci_ptr = &(a->ncci[ncci]);
+                               n = ncci_ptr->data_pending;
+                               l = ncci_ptr->data_ack_pending;
+                               k = plci->msg_in_read_pos;
+                               while (k != plci->msg_in_write_pos)
+                               {
+                                       if (k == plci->msg_in_wrap_pos)
+                                               k = 0;
+                                       if ((((CAPI_MSG *)(&((byte *)(plci->msg_in_queue))[k]))->header.command == _DATA_B3_R)
+                                           && (((CAPI_MSG *)(&((byte *)(plci->msg_in_queue))[k]))->header.ncci == ncci))
+                                       {
+                                               n++;
+                                               if (((CAPI_MSG *)(&((byte *)(plci->msg_in_queue))[k]))->info.data_b3_req.Flags & 0x0004)
+                                                       l++;
+                                       }
+
+                                       k += (((CAPI_MSG *)(&((byte *)(plci->msg_in_queue))[k]))->header.length +
+                                             MSG_IN_OVERHEAD + 3) & 0xfffc;
+
+                               }
+                               if ((n >= MAX_DATA_B3) || (l >= MAX_DATA_ACK))
+                               {
+                                       dbug(0, dprintf("Q-FULL2(data) - pending=%d/%d ack_pending=%d/%d",
+                                                       ncci_ptr->data_pending, n, ncci_ptr->data_ack_pending, l));
+
+                                       return _QUEUE_FULL;
+                               }
+                               if (plci->req_in || plci->internal_command)
+                               {
+                                       if ((((byte *) msg) >= ((byte *)(plci->msg_in_queue)))
+                                           && (((byte *) msg) < ((byte *)(plci->msg_in_queue)) + sizeof(plci->msg_in_queue)))
+                                       {
+                                               dbug(0, dprintf("Q-FULL3(requeue)"));
+
+                                               return _QUEUE_FULL;
+                                       }
+                                       c = true;
+                               }
+                       }
+                       else
+                       {
+                               if (plci->req_in || plci->internal_command)
+                                       c = true;
+                               else
+                               {
+                                       plci->command = msg->header.command;
+                                       plci->number = msg->header.number;
+                               }
+                       }
+                       if (c)
+                       {
+                               dbug(1, dprintf("enqueue msg(0x%04x,0x%x,0x%x) - len=%d write=%d read=%d wrap=%d free=%d",
+                                               msg->header.command, plci->req_in, plci->internal_command,
+                                               msg->header.length, plci->msg_in_write_pos,
+                                               plci->msg_in_read_pos, plci->msg_in_wrap_pos, i));
+                               if (j == 0)
+                                       plci->msg_in_wrap_pos = plci->msg_in_write_pos;
+                               m = (CAPI_MSG *)(&((byte *)(plci->msg_in_queue))[j]);
+                               for (i = 0; i < msg->header.length; i++)
+                                       ((byte *)(plci->msg_in_queue))[j++] = ((byte *) msg)[i];
+                               if (m->header.command == _DATA_B3_R)
+                               {
+
+                                       m->info.data_b3_req.Data = (dword)(long)(TransmitBufferSet(appl, m->info.data_b3_req.Data));
+
+                               }
+
+                               j = (j + 3) & 0xfffc;
+
+                               *((APPL **)(&((byte *)(plci->msg_in_queue))[j])) = appl;
+                               plci->msg_in_write_pos = j + MSG_IN_OVERHEAD;
+                               return 0;
+                       }
+               }
+               else
+               {
+                       plci = NULL;
+               }
+       }
+       dbug(1, dprintf("com=%x", msg->header.command));
+
+       for (j = 0; j < MAX_MSG_PARMS + 1; j++) msg_parms[j].length = 0;
+       for (i = 0, ret = _BAD_MSG; i < ARRAY_SIZE(ftable); i++) {
+
+               if (ftable[i].command == msg->header.command) {
+                       /* break loop if the message is correct, otherwise continue scan  */
+                       /* (for example: CONNECT_B3_T90_ACT_RES has two specifications)   */
+                       if (!api_parse(msg->info.b, (word)(msg->header.length - 12), ftable[i].format, msg_parms)) {
+                               ret = 0;
+                               break;
+                       }
+                       for (j = 0; j < MAX_MSG_PARMS + 1; j++) msg_parms[j].length = 0;
+               }
+       }
+       if (ret) {
+               dbug(1, dprintf("BAD_MSG"));
+               if (plci) plci->command = 0;
+               return ret;
+       }
+
+
+       c = ftable[i].function(GET_DWORD(&msg->header.controller),
+                              msg->header.number,
+                              a,
+                              plci,
+                              appl,
+                              msg_parms);
+
+       channel_xmit_extended_xon(plci);
+
+       if (c == 1) send_req(plci);
+       if (c == 2 && plci) plci->req_in = plci->req_in_start = plci->req_out = 0;
+       if (plci && !plci->req_in) plci->command = 0;
+       return 0;
 }
 
 
@@ -592,85 +592,85 @@ word api_put(APPL   * appl, CAPI_MSG   * msg)
 
 static word api_parse(byte *msg, word length, byte *format, API_PARSE *parms)
 {
-  word i;
-  word p;
-
-  for(i=0,p=0; format[i]; i++) {
-    if(parms)
-    {
-      parms[i].info = &msg[p];
-    }
-    switch(format[i]) {
-    case 'b':
-      p +=1;
-      break;
-    case 'w':
-      p +=2;
-      break;
-    case 'd':
-      p +=4;
-      break;
-    case 's':
-      if(msg[p]==0xff) {
-        parms[i].info +=2;
-        parms[i].length = msg[p+1] + (msg[p+2]<<8);
-        p +=(parms[i].length +3);
-      }
-      else {
-        parms[i].length = msg[p];
-        p +=(parms[i].length +1);
-      }
-      break;
-    }
-
-    if(p>length) return true;
-  }
-  if(parms) parms[i].info = NULL;
-  return false;
+       word i;
+       word p;
+
+       for (i = 0, p = 0; format[i]; i++) {
+               if (parms)
+               {
+                       parms[i].info = &msg[p];
+               }
+               switch (format[i]) {
+               case 'b':
+                       p += 1;
+                       break;
+               case 'w':
+                       p += 2;
+                       break;
+               case 'd':
+                       p += 4;
+                       break;
+               case 's':
+                       if (msg[p] == 0xff) {
+                               parms[i].info += 2;
+                               parms[i].length = msg[p + 1] + (msg[p + 2] << 8);
+                               p += (parms[i].length + 3);
+                       }
+                       else {
+                               parms[i].length = msg[p];
+                               p += (parms[i].length + 1);
+                       }
+                       break;
+               }
+
+               if (p > length) return true;
+       }
+       if (parms) parms[i].info = NULL;
+       return false;
 }
 
 static void api_save_msg(API_PARSE *in, byte *format, API_SAVE *out)
 {
-  word i, j, n = 0;
-  byte   *p;
-
-  p = out->info;
-  for (i = 0; format[i] != '\0'; i++)
-  {
-    out->parms[i].info = p;
-    out->parms[i].length = in[i].length;
-    switch (format[i])
-    {
-    case 'b':
-      n = 1;
-      break;
-    case 'w':
-      n = 2;
-      break;
-    case 'd':
-      n = 4;
-      break;
-    case 's':
-      n = in[i].length + 1;
-      break;
-    }
-    for (j = 0; j < n; j++)
-      *(p++) = in[i].info[j];
-  }
-  out->parms[i].info = NULL;
-  out->parms[i].length = 0;
+       word i, j, n = 0;
+       byte *p;
+
+       p = out->info;
+       for (i = 0; format[i] != '\0'; i++)
+       {
+               out->parms[i].info = p;
+               out->parms[i].length = in[i].length;
+               switch (format[i])
+               {
+               case 'b':
+                       n = 1;
+                       break;
+               case 'w':
+                       n = 2;
+                       break;
+               case 'd':
+                       n = 4;
+                       break;
+               case 's':
+                       n = in[i].length + 1;
+                       break;
+               }
+               for (j = 0; j < n; j++)
+                       *(p++) = in[i].info[j];
+       }
+       out->parms[i].info = NULL;
+       out->parms[i].length = 0;
 }
 
 static void api_load_msg(API_SAVE *in, API_PARSE *out)
 {
-  word i;
+       word i;
 
-  i = 0;
-  do
-  {
-    out[i].info = in->parms[i].info;
-    out[i].length = in->parms[i].length;
-  } while (in->parms[i++].info);
+       i = 0;
+       do
+       {
+               out[i].info = in->parms[i].info;
+               out[i].length = in->parms[i].length;
+       } while (in->parms[i++].info);
 }
 
 
@@ -680,31 +680,31 @@ static void api_load_msg(API_SAVE *in, API_PARSE *out)
 
 word api_remove_start(void)
 {
-  word i;
-  word j;
-
-  if(!remove_started) {
-    remove_started = true;
-    for(i=0;i<max_adapter;i++) {
-      if(adapter[i].request) {
-        for(j=0;j<adapter[i].max_plci;j++) {
-          if(adapter[i].plci[j].Sig.Id) plci_remove(&adapter[i].plci[j]);
-        }
-      }
-    }
-    return 1;
-  }
-  else {
-    for(i=0;i<max_adapter;i++) {
-      if(adapter[i].request) {
-        for(j=0;j<adapter[i].max_plci;j++) {
-          if(adapter[i].plci[j].Sig.Id) return 1;
-        }
-      }
-    }
-  }
-  api_remove_complete();
-  return 0;
+       word i;
+       word j;
+
+       if (!remove_started) {
+               remove_started = true;
+               for (i = 0; i < max_adapter; i++) {
+                       if (adapter[i].request) {
+                               for (j = 0; j < adapter[i].max_plci; j++) {
+                                       if (adapter[i].plci[j].Sig.Id) plci_remove(&adapter[i].plci[j]);
+                               }
+                       }
+               }
+               return 1;
+       }
+       else {
+               for (i = 0; i < max_adapter; i++) {
+                       if (adapter[i].request) {
+                               for (j = 0; j < adapter[i].max_plci; j++) {
+                                       if (adapter[i].plci[j].Sig.Id) return 1;
+                               }
+                       }
+               }
+       }
+       api_remove_complete();
+       return 0;
 }
 
 
@@ -712,60 +712,60 @@ word api_remove_start(void)
 /* internal command queue                                           */
 /*------------------------------------------------------------------*/
 
-static void init_internal_command_queue (PLCI   *plci)
+static void init_internal_command_queue(PLCI *plci)
 {
-  word i;
+       word i;
 
-  dbug (1, dprintf ("%s,%d: init_internal_command_queue",
-    (char   *)(FILE_), __LINE__));
+       dbug(1, dprintf("%s,%d: init_internal_command_queue",
+                       (char *)(FILE_), __LINE__));
 
-  plci->internal_command = 0;
-  for (i = 0; i < MAX_INTERNAL_COMMAND_LEVELS; i++)
-    plci->internal_command_queue[i] = NULL;
+       plci->internal_command = 0;
+       for (i = 0; i < MAX_INTERNAL_COMMAND_LEVELS; i++)
+               plci->internal_command_queue[i] = NULL;
 }
 
 
-static void start_internal_command (dword Id, PLCI   *plci, t_std_internal_command command_function)
+static void start_internal_command(dword Id, PLCI *plci, t_std_internal_command command_function)
 {
-  word i;
+       word i;
 
-  dbug (1, dprintf ("[%06lx] %s,%d: start_internal_command",
-    UnMapId (Id), (char   *)(FILE_), __LINE__));
+       dbug(1, dprintf("[%06lx] %s,%d: start_internal_command",
+                       UnMapId(Id), (char *)(FILE_), __LINE__));
 
-  if (plci->internal_command == 0)
-  {
-    plci->internal_command_queue[0] = command_function;
-    (* command_function)(Id, plci, OK);
-  }
-  else
-  {
-    i = 1;
-    while (plci->internal_command_queue[i] != NULL)
-      i++;
-    plci->internal_command_queue[i] = command_function;
-  }
+       if (plci->internal_command == 0)
+       {
+               plci->internal_command_queue[0] = command_function;
+               (*command_function)(Id, plci, OK);
+       }
+       else
+       {
+               i = 1;
+               while (plci->internal_command_queue[i] != NULL)
+                       i++;
+               plci->internal_command_queue[i] = command_function;
+       }
 }
 
 
-static void next_internal_command (dword Id, PLCI   *plci)
+static void next_internal_command(dword Id, PLCI *plci)
 {
-  word i;
+       word i;
 
-  dbug (1, dprintf ("[%06lx] %s,%d: next_internal_command",
-    UnMapId (Id), (char   *)(FILE_), __LINE__));
+       dbug(1, dprintf("[%06lx] %s,%d: next_internal_command",
+                       UnMapId(Id), (char *)(FILE_), __LINE__));
 
-  plci->internal_command = 0;
-  plci->internal_command_queue[0] = NULL;
-  while (plci->internal_command_queue[1] != NULL)
-  {
-    for (i = 0; i < MAX_INTERNAL_COMMAND_LEVELS - 1; i++)
-      plci->internal_command_queue[i] = plci->internal_command_queue[i+1];
-    plci->internal_command_queue[MAX_INTERNAL_COMMAND_LEVELS - 1] = NULL;
-    (*(plci->internal_command_queue[0]))(Id, plci, OK);
-    if (plci->internal_command != 0)
-      return;
-    plci->internal_command_queue[0] = NULL;
-  }
+       plci->internal_command = 0;
+       plci->internal_command_queue[0] = NULL;
+       while (plci->internal_command_queue[1] != NULL)
+       {
+               for (i = 0; i < MAX_INTERNAL_COMMAND_LEVELS - 1; i++)
+                       plci->internal_command_queue[i] = plci->internal_command_queue[i + 1];
+               plci->internal_command_queue[MAX_INTERNAL_COMMAND_LEVELS - 1] = NULL;
+               (*(plci->internal_command_queue[0]))(Id, plci, OK);
+               if (plci->internal_command != 0)
+                       return;
+               plci->internal_command_queue[0] = NULL;
+       }
 }
 
 
@@ -775,238 +775,238 @@ static void next_internal_command (dword Id, PLCI   *plci)
 
 static dword ncci_mapping_bug = 0;
 
-static word get_ncci (PLCI   *plci, byte ch, word force_ncci)
-{
-  DIVA_CAPI_ADAPTER   *a;
-  word ncci, i, j, k;
-
-  a = plci->adapter;
-  if (!ch || a->ch_ncci[ch])
-  {
-    ncci_mapping_bug++;
-    dbug(1,dprintf("NCCI mapping exists %ld %02x %02x %02x-%02x",
-      ncci_mapping_bug, ch, force_ncci, a->ncci_ch[a->ch_ncci[ch]], a->ch_ncci[ch]));
-    ncci = ch;
-  }
-  else
-  {
-    if (force_ncci)
-      ncci = force_ncci;
-    else
-    {
-      if ((ch < MAX_NCCI+1) && !a->ncci_ch[ch])
-        ncci = ch;
-      else
-      {
-        ncci = 1;
-        while ((ncci < MAX_NCCI+1) && a->ncci_ch[ncci])
-          ncci++;
-        if (ncci == MAX_NCCI+1)
-        {
-          ncci_mapping_bug++;
-          i = 1;
-          do
-          {
-            j = 1;
-            while ((j < MAX_NCCI+1) && (a->ncci_ch[j] != i))
-              j++;
-            k = j;
-            if (j < MAX_NCCI+1)
-            {
-              do
-              {
-                j++;
-              } while ((j < MAX_NCCI+1) && (a->ncci_ch[j] != i));
-            }
-          } while ((i < MAX_NL_CHANNEL+1) && (j < MAX_NCCI+1));
-          if (i < MAX_NL_CHANNEL+1)
-          {
-            dbug(1,dprintf("NCCI mapping overflow %ld %02x %02x %02x-%02x-%02x",
-              ncci_mapping_bug, ch, force_ncci, i, k, j));
-          }
-          else
-          {
-            dbug(1,dprintf("NCCI mapping overflow %ld %02x %02x",
-              ncci_mapping_bug, ch, force_ncci));
-          }
-          ncci = ch;
-        }
-      }
-      a->ncci_plci[ncci] = plci->Id;
-      a->ncci_state[ncci] = IDLE;
-      if (!plci->ncci_ring_list)
-        plci->ncci_ring_list = ncci;
-      else
-        a->ncci_next[ncci] = a->ncci_next[plci->ncci_ring_list];
-      a->ncci_next[plci->ncci_ring_list] = (byte) ncci;
-    }
-    a->ncci_ch[ncci] = ch;
-    a->ch_ncci[ch] = (byte) ncci;
-    dbug(1,dprintf("NCCI mapping established %ld %02x %02x %02x-%02x",
-      ncci_mapping_bug, ch, force_ncci, ch, ncci));
-  }
-  return (ncci);
-}
-
-
-static void ncci_free_receive_buffers (PLCI   *plci, word ncci)
-{
-  DIVA_CAPI_ADAPTER   *a;
-  APPL   *appl;
-  word i, ncci_code;
-  dword Id;
-
-  a = plci->adapter;
-  Id = (((dword) ncci) << 16) | (((word)(plci->Id)) << 8) | a->Id;
-  if (ncci)
-  {
-    if (a->ncci_plci[ncci] == plci->Id)
-    {
-      if (!plci->appl)
-      {
-        ncci_mapping_bug++;
-        dbug(1,dprintf("NCCI mapping appl expected %ld %08lx",
-          ncci_mapping_bug, Id));
-      }
-      else
-      {
-        appl = plci->appl;
-        ncci_code = ncci | (((word) a->Id) << 8);
-        for (i = 0; i < appl->MaxBuffer; i++)
-        {
-          if ((appl->DataNCCI[i] == ncci_code)
-           && (((byte)(appl->DataFlags[i] >> 8)) == plci->Id))
-          {
-            appl->DataNCCI[i] = 0;
-          }
-        }
-      }
-    }
-  }
-  else
-  {
-    for (ncci = 1; ncci < MAX_NCCI+1; ncci++)
-    {
-      if (a->ncci_plci[ncci] == plci->Id)
-      {
-        if (!plci->appl)
-        {
-          ncci_mapping_bug++;
-          dbug(1,dprintf("NCCI mapping no appl %ld %08lx",
-            ncci_mapping_bug, Id));
-        }
-        else
-        {
-          appl = plci->appl;
-          ncci_code = ncci | (((word) a->Id) << 8);
-          for (i = 0; i < appl->MaxBuffer; i++)
-          {
-            if ((appl->DataNCCI[i] == ncci_code)
-             && (((byte)(appl->DataFlags[i] >> 8)) == plci->Id))
-            {
-              appl->DataNCCI[i] = 0;
-            }
-          }
-        }
-      }
-    }
-  }
-}
-
-
-static void cleanup_ncci_data (PLCI   *plci, word ncci)
-{
-  NCCI   *ncci_ptr;
-
-  if (ncci && (plci->adapter->ncci_plci[ncci] == plci->Id))
-  {
-    ncci_ptr = &(plci->adapter->ncci[ncci]);
-    if (plci->appl)
-    {
-      while (ncci_ptr->data_pending != 0)
-      {
-        if (!plci->data_sent || (ncci_ptr->DBuffer[ncci_ptr->data_out].P != plci->data_sent_ptr))
-          TransmitBufferFree (plci->appl, ncci_ptr->DBuffer[ncci_ptr->data_out].P);
-        (ncci_ptr->data_out)++;
-        if (ncci_ptr->data_out == MAX_DATA_B3)
-          ncci_ptr->data_out = 0;
-        (ncci_ptr->data_pending)--;
-      }
-    }
-    ncci_ptr->data_out = 0;
-    ncci_ptr->data_pending = 0;
-    ncci_ptr->data_ack_out = 0;
-    ncci_ptr->data_ack_pending = 0;
-  }
-}
-
-
-static void ncci_remove (PLCI   *plci, word ncci, byte preserve_ncci)
-{
-  DIVA_CAPI_ADAPTER   *a;
-  dword Id;
-  word i;
-
-  a = plci->adapter;
-  Id = (((dword) ncci) << 16) | (((word)(plci->Id)) << 8) | a->Id;
-  if (!preserve_ncci)
-    ncci_free_receive_buffers (plci, ncci);
-  if (ncci)
-  {
-    if (a->ncci_plci[ncci] != plci->Id)
-    {
-      ncci_mapping_bug++;
-      dbug(1,dprintf("NCCI mapping doesn't exist %ld %08lx %02x",
-        ncci_mapping_bug, Id, preserve_ncci));
-    }
-    else
-    {
-      cleanup_ncci_data (plci, ncci);
-      dbug(1,dprintf("NCCI mapping released %ld %08lx %02x %02x-%02x",
-        ncci_mapping_bug, Id, preserve_ncci, a->ncci_ch[ncci], ncci));
-      a->ch_ncci[a->ncci_ch[ncci]] = 0;
-      if (!preserve_ncci)
-      {
-        a->ncci_ch[ncci] = 0;
-        a->ncci_plci[ncci] = 0;
-        a->ncci_state[ncci] = IDLE;
-        i = plci->ncci_ring_list;
-        while ((i != 0) && (a->ncci_next[i] != plci->ncci_ring_list) && (a->ncci_next[i] != ncci))
-          i = a->ncci_next[i];
-        if ((i != 0) && (a->ncci_next[i] == ncci))
-        {
-          if (i == ncci)
-            plci->ncci_ring_list = 0;
-          else if (plci->ncci_ring_list == ncci)
-            plci->ncci_ring_list = i;
-          a->ncci_next[i] = a->ncci_next[ncci];
-        }
-        a->ncci_next[ncci] = 0;
-      }
-    }
-  }
-  else
-  {
-    for (ncci = 1; ncci < MAX_NCCI+1; ncci++)
-    {
-      if (a->ncci_plci[ncci] == plci->Id)
-      {
-        cleanup_ncci_data (plci, ncci);
-        dbug(1,dprintf("NCCI mapping released %ld %08lx %02x %02x-%02x",
-          ncci_mapping_bug, Id, preserve_ncci, a->ncci_ch[ncci], ncci));
-        a->ch_ncci[a->ncci_ch[ncci]] = 0;
-        if (!preserve_ncci)
-        {
-          a->ncci_ch[ncci] = 0;
-          a->ncci_plci[ncci] = 0;
-          a->ncci_state[ncci] = IDLE;
-          a->ncci_next[ncci] = 0;
-        }
-      }
-    }
-    if (!preserve_ncci)
-      plci->ncci_ring_list = 0;
-  }
+static word get_ncci(PLCI *plci, byte ch, word force_ncci)
+{
+       DIVA_CAPI_ADAPTER *a;
+       word ncci, i, j, k;
+
+       a = plci->adapter;
+       if (!ch || a->ch_ncci[ch])
+       {
+               ncci_mapping_bug++;
+               dbug(1, dprintf("NCCI mapping exists %ld %02x %02x %02x-%02x",
+                               ncci_mapping_bug, ch, force_ncci, a->ncci_ch[a->ch_ncci[ch]], a->ch_ncci[ch]));
+               ncci = ch;
+       }
+       else
+       {
+               if (force_ncci)
+                       ncci = force_ncci;
+               else
+               {
+                       if ((ch < MAX_NCCI + 1) && !a->ncci_ch[ch])
+                               ncci = ch;
+                       else
+                       {
+                               ncci = 1;
+                               while ((ncci < MAX_NCCI + 1) && a->ncci_ch[ncci])
+                                       ncci++;
+                               if (ncci == MAX_NCCI + 1)
+                               {
+                                       ncci_mapping_bug++;
+                                       i = 1;
+                                       do
+                                       {
+                                               j = 1;
+                                               while ((j < MAX_NCCI + 1) && (a->ncci_ch[j] != i))
+                                                       j++;
+                                               k = j;
+                                               if (j < MAX_NCCI + 1)
+                                               {
+                                                       do
+                                                       {
+                                                               j++;
+                                                       } while ((j < MAX_NCCI + 1) && (a->ncci_ch[j] != i));
+                                               }
+                                       } while ((i < MAX_NL_CHANNEL + 1) && (j < MAX_NCCI + 1));
+                                       if (i < MAX_NL_CHANNEL + 1)
+                                       {
+                                               dbug(1, dprintf("NCCI mapping overflow %ld %02x %02x %02x-%02x-%02x",
+                                                               ncci_mapping_bug, ch, force_ncci, i, k, j));
+                                       }
+                                       else
+                                       {
+                                               dbug(1, dprintf("NCCI mapping overflow %ld %02x %02x",
+                                                               ncci_mapping_bug, ch, force_ncci));
+                                       }
+                                       ncci = ch;
+                               }
+                       }
+                       a->ncci_plci[ncci] = plci->Id;
+                       a->ncci_state[ncci] = IDLE;
+                       if (!plci->ncci_ring_list)
+                               plci->ncci_ring_list = ncci;
+                       else
+                               a->ncci_next[ncci] = a->ncci_next[plci->ncci_ring_list];
+                       a->ncci_next[plci->ncci_ring_list] = (byte) ncci;
+               }
+               a->ncci_ch[ncci] = ch;
+               a->ch_ncci[ch] = (byte) ncci;
+               dbug(1, dprintf("NCCI mapping established %ld %02x %02x %02x-%02x",
+                               ncci_mapping_bug, ch, force_ncci, ch, ncci));
+       }
+       return (ncci);
+}
+
+
+static void ncci_free_receive_buffers(PLCI *plci, word ncci)
+{
+       DIVA_CAPI_ADAPTER *a;
+       APPL *appl;
+       word i, ncci_code;
+       dword Id;
+
+       a = plci->adapter;
+       Id = (((dword) ncci) << 16) | (((word)(plci->Id)) << 8) | a->Id;
+       if (ncci)
+       {
+               if (a->ncci_plci[ncci] == plci->Id)
+               {
+                       if (!plci->appl)
+                       {
+                               ncci_mapping_bug++;
+                               dbug(1, dprintf("NCCI mapping appl expected %ld %08lx",
+                                               ncci_mapping_bug, Id));
+                       }
+                       else
+                       {
+                               appl = plci->appl;
+                               ncci_code = ncci | (((word) a->Id) << 8);
+                               for (i = 0; i < appl->MaxBuffer; i++)
+                               {
+                                       if ((appl->DataNCCI[i] == ncci_code)
+                                           && (((byte)(appl->DataFlags[i] >> 8)) == plci->Id))
+                                       {
+                                               appl->DataNCCI[i] = 0;
+                                       }
+                               }
+                       }
+               }
+       }
+       else
+       {
+               for (ncci = 1; ncci < MAX_NCCI + 1; ncci++)
+               {
+                       if (a->ncci_plci[ncci] == plci->Id)
+                       {
+                               if (!plci->appl)
+                               {
+                                       ncci_mapping_bug++;
+                                       dbug(1, dprintf("NCCI mapping no appl %ld %08lx",
+                                                       ncci_mapping_bug, Id));
+                               }
+                               else
+                               {
+                                       appl = plci->appl;
+                                       ncci_code = ncci | (((word) a->Id) << 8);
+                                       for (i = 0; i < appl->MaxBuffer; i++)
+                                       {
+                                               if ((appl->DataNCCI[i] == ncci_code)
+                                                   && (((byte)(appl->DataFlags[i] >> 8)) == plci->Id))
+                                               {
+                                                       appl->DataNCCI[i] = 0;
+                                               }
+                                       }
+                               }
+                       }
+               }
+       }
+}
+
+
+static void cleanup_ncci_data(PLCI *plci, word ncci)
+{
+       NCCI *ncci_ptr;
+
+       if (ncci && (plci->adapter->ncci_plci[ncci] == plci->Id))
+       {
+               ncci_ptr = &(plci->adapter->ncci[ncci]);
+               if (plci->appl)
+               {
+                       while (ncci_ptr->data_pending != 0)
+                       {
+                               if (!plci->data_sent || (ncci_ptr->DBuffer[ncci_ptr->data_out].P != plci->data_sent_ptr))
+                                       TransmitBufferFree(plci->appl, ncci_ptr->DBuffer[ncci_ptr->data_out].P);
+                               (ncci_ptr->data_out)++;
+                               if (ncci_ptr->data_out == MAX_DATA_B3)
+                                       ncci_ptr->data_out = 0;
+                               (ncci_ptr->data_pending)--;
+                       }
+               }
+               ncci_ptr->data_out = 0;
+               ncci_ptr->data_pending = 0;
+               ncci_ptr->data_ack_out = 0;
+               ncci_ptr->data_ack_pending = 0;
+       }
+}
+
+
+static void ncci_remove(PLCI *plci, word ncci, byte preserve_ncci)
+{
+       DIVA_CAPI_ADAPTER *a;
+       dword Id;
+       word i;
+
+       a = plci->adapter;
+       Id = (((dword) ncci) << 16) | (((word)(plci->Id)) << 8) | a->Id;
+       if (!preserve_ncci)
+               ncci_free_receive_buffers(plci, ncci);
+       if (ncci)
+       {
+               if (a->ncci_plci[ncci] != plci->Id)
+               {
+                       ncci_mapping_bug++;
+                       dbug(1, dprintf("NCCI mapping doesn't exist %ld %08lx %02x",
+                                       ncci_mapping_bug, Id, preserve_ncci));
+               }
+               else
+               {
+                       cleanup_ncci_data(plci, ncci);
+                       dbug(1, dprintf("NCCI mapping released %ld %08lx %02x %02x-%02x",
+                                       ncci_mapping_bug, Id, preserve_ncci, a->ncci_ch[ncci], ncci));
+                       a->ch_ncci[a->ncci_ch[ncci]] = 0;
+                       if (!preserve_ncci)
+                       {
+                               a->ncci_ch[ncci] = 0;
+                               a->ncci_plci[ncci] = 0;
+                               a->ncci_state[ncci] = IDLE;
+                               i = plci->ncci_ring_list;
+                               while ((i != 0) && (a->ncci_next[i] != plci->ncci_ring_list) && (a->ncci_next[i] != ncci))
+                                       i = a->ncci_next[i];
+                               if ((i != 0) && (a->ncci_next[i] == ncci))
+                               {
+                                       if (i == ncci)
+                                               plci->ncci_ring_list = 0;
+                                       else if (plci->ncci_ring_list == ncci)
+                                               plci->ncci_ring_list = i;
+                                       a->ncci_next[i] = a->ncci_next[ncci];
+                               }
+                               a->ncci_next[ncci] = 0;
+                       }
+               }
+       }
+       else
+       {
+               for (ncci = 1; ncci < MAX_NCCI + 1; ncci++)
+               {
+                       if (a->ncci_plci[ncci] == plci->Id)
+                       {
+                               cleanup_ncci_data(plci, ncci);
+                               dbug(1, dprintf("NCCI mapping released %ld %08lx %02x %02x-%02x",
+                                               ncci_mapping_bug, Id, preserve_ncci, a->ncci_ch[ncci], ncci));
+                               a->ch_ncci[a->ncci_ch[ncci]] = 0;
+                               if (!preserve_ncci)
+                               {
+                                       a->ncci_ch[ncci] = 0;
+                                       a->ncci_plci[ncci] = 0;
+                                       a->ncci_state[ncci] = IDLE;
+                                       a->ncci_next[ncci] = 0;
+                               }
+                       }
+               }
+               if (!preserve_ncci)
+                       plci->ncci_ring_list = 0;
+       }
 }
 
 
@@ -1014,170 +1014,170 @@ static void ncci_remove (PLCI   *plci, word ncci, byte preserve_ncci)
 /* PLCI remove function                                             */
 /*------------------------------------------------------------------*/
 
-static void plci_free_msg_in_queue (PLCI   *plci)
-{
-  word i;
-
-  if (plci->appl)
-  {
-    i = plci->msg_in_read_pos;
-    while (i != plci->msg_in_write_pos)
-    {
-      if (i == plci->msg_in_wrap_pos)
-        i = 0;
-      if (((CAPI_MSG   *)(&((byte   *)(plci->msg_in_queue))[i]))->header.command == _DATA_B3_R)
-      {
-
-        TransmitBufferFree (plci->appl,
-          (byte *)(long)(((CAPI_MSG *)(&((byte *)(plci->msg_in_queue))[i]))->info.data_b3_req.Data));
-
-      }
-
-      i += (((CAPI_MSG   *)(&((byte   *)(plci->msg_in_queue))[i]))->header.length +
-        MSG_IN_OVERHEAD + 3) & 0xfffc;
-
-    }
-  }
-  plci->msg_in_write_pos = MSG_IN_QUEUE_SIZE;
-  plci->msg_in_read_pos = MSG_IN_QUEUE_SIZE;
-  plci->msg_in_wrap_pos = MSG_IN_QUEUE_SIZE;
-}
-
-
-static void plci_remove(PLCI   * plci)
-{
-
-  if(!plci) {
-    dbug(1,dprintf("plci_remove(no plci)"));
-    return;
-  }
-  init_internal_command_queue (plci);
-  dbug(1,dprintf("plci_remove(%x,tel=%x)",plci->Id,plci->tel));
-  if(plci_remove_check(plci))
-  {
-    return;
-  }
-  if (plci->Sig.Id == 0xff)
-  {
-    dbug(1,dprintf("D-channel X.25 plci->NL.Id:%0x", plci->NL.Id));
-    if (plci->NL.Id && !plci->nl_remove_id)
-    {
-      nl_req_ncci(plci,REMOVE,0);
-      send_req(plci);
-    }
-  }
-  else
-  {
-    if (!plci->sig_remove_id
-     && (plci->Sig.Id
-      || (plci->req_in!=plci->req_out)
-      || (plci->nl_req || plci->sig_req)))
-    {
-      sig_req(plci,HANGUP,0);
-      send_req(plci);
-    }
-  }
-  ncci_remove (plci, 0, false);
-  plci_free_msg_in_queue (plci);
-
-  plci->channels = 0;
-  plci->appl = NULL;
-  if ((plci->State == INC_CON_PENDING) || (plci->State == INC_CON_ALERT))
-    plci->State = OUTG_DIS_PENDING;
+static void plci_free_msg_in_queue(PLCI *plci)
+{
+       word i;
+
+       if (plci->appl)
+       {
+               i = plci->msg_in_read_pos;
+               while (i != plci->msg_in_write_pos)
+               {
+                       if (i == plci->msg_in_wrap_pos)
+                               i = 0;
+                       if (((CAPI_MSG *)(&((byte *)(plci->msg_in_queue))[i]))->header.command == _DATA_B3_R)
+                       {
+
+                               TransmitBufferFree(plci->appl,
+                                                  (byte *)(long)(((CAPI_MSG *)(&((byte *)(plci->msg_in_queue))[i]))->info.data_b3_req.Data));
+
+                       }
+
+                       i += (((CAPI_MSG *)(&((byte *)(plci->msg_in_queue))[i]))->header.length +
+                             MSG_IN_OVERHEAD + 3) & 0xfffc;
+
+               }
+       }
+       plci->msg_in_write_pos = MSG_IN_QUEUE_SIZE;
+       plci->msg_in_read_pos = MSG_IN_QUEUE_SIZE;
+       plci->msg_in_wrap_pos = MSG_IN_QUEUE_SIZE;
+}
+
+
+static void plci_remove(PLCI *plci)
+{
+
+       if (!plci) {
+               dbug(1, dprintf("plci_remove(no plci)"));
+               return;
+       }
+       init_internal_command_queue(plci);
+       dbug(1, dprintf("plci_remove(%x,tel=%x)", plci->Id, plci->tel));
+       if (plci_remove_check(plci))
+       {
+               return;
+       }
+       if (plci->Sig.Id == 0xff)
+       {
+               dbug(1, dprintf("D-channel X.25 plci->NL.Id:%0x", plci->NL.Id));
+               if (plci->NL.Id && !plci->nl_remove_id)
+               {
+                       nl_req_ncci(plci, REMOVE, 0);
+                       send_req(plci);
+               }
+       }
+       else
+       {
+               if (!plci->sig_remove_id
+                   && (plci->Sig.Id
+                       || (plci->req_in != plci->req_out)
+                       || (plci->nl_req || plci->sig_req)))
+               {
+                       sig_req(plci, HANGUP, 0);
+                       send_req(plci);
+               }
+       }
+       ncci_remove(plci, 0, false);
+       plci_free_msg_in_queue(plci);
+
+       plci->channels = 0;
+       plci->appl = NULL;
+       if ((plci->State == INC_CON_PENDING) || (plci->State == INC_CON_ALERT))
+               plci->State = OUTG_DIS_PENDING;
 }
 
 /*------------------------------------------------------------------*/
 /* Application Group function helpers                               */
 /*------------------------------------------------------------------*/
 
-static void set_group_ind_mask (PLCI   *plci)
+static void set_group_ind_mask(PLCI *plci)
 {
-  word i;
+       word i;
 
-  for (i = 0; i < C_IND_MASK_DWORDS; i++)
-    plci->group_optimization_mask_table[i] = 0xffffffffL;
+       for (i = 0; i < C_IND_MASK_DWORDS; i++)
+               plci->group_optimization_mask_table[i] = 0xffffffffL;
 }
 
-static void clear_group_ind_mask_bit (PLCI   *plci, word b)
+static void clear_group_ind_mask_bit(PLCI *plci, word b)
 {
-  plci->group_optimization_mask_table[b >> 5] &= ~(1L << (b & 0x1f));
+       plci->group_optimization_mask_table[b >> 5] &= ~(1L << (b & 0x1f));
 }
 
-static byte test_group_ind_mask_bit (PLCI   *plci, word b)
+static byte test_group_ind_mask_bit(PLCI *plci, word b)
 {
-  return ((plci->group_optimization_mask_table[b >> 5] & (1L << (b & 0x1f))) != 0);
+       return ((plci->group_optimization_mask_table[b >> 5] & (1L << (b & 0x1f))) != 0);
 }
 
 /*------------------------------------------------------------------*/
 /* c_ind_mask operations for arbitrary MAX_APPL                     */
 /*------------------------------------------------------------------*/
 
-static void clear_c_ind_mask (PLCI   *plci)
+static void clear_c_ind_mask(PLCI *plci)
 {
-  word i;
+       word i;
 
-  for (i = 0; i < C_IND_MASK_DWORDS; i++)
-    plci->c_ind_mask_table[i] = 0;
+       for (i = 0; i < C_IND_MASK_DWORDS; i++)
+               plci->c_ind_mask_table[i] = 0;
 }
 
-static byte c_ind_mask_empty (PLCI   *plci)
+static byte c_ind_mask_empty(PLCI *plci)
 {
-  word i;
+       word i;
 
-  i = 0;
-  while ((i < C_IND_MASK_DWORDS) && (plci->c_ind_mask_table[i] == 0))
-    i++;
-  return (i == C_IND_MASK_DWORDS);
+       i = 0;
+       while ((i < C_IND_MASK_DWORDS) && (plci->c_ind_mask_table[i] == 0))
+               i++;
+       return (i == C_IND_MASK_DWORDS);
 }
 
-static void set_c_ind_mask_bit (PLCI   *plci, word b)
+static void set_c_ind_mask_bit(PLCI *plci, word b)
 {
-  plci->c_ind_mask_table[b >> 5] |= (1L << (b & 0x1f));
+       plci->c_ind_mask_table[b >> 5] |= (1L << (b & 0x1f));
 }
 
-static void clear_c_ind_mask_bit (PLCI   *plci, word b)
+static void clear_c_ind_mask_bit(PLCI *plci, word b)
 {
-  plci->c_ind_mask_table[b >> 5] &= ~(1L << (b & 0x1f));
+       plci->c_ind_mask_table[b >> 5] &= ~(1L << (b & 0x1f));
 }
 
-static byte test_c_ind_mask_bit (PLCI   *plci, word b)
+static byte test_c_ind_mask_bit(PLCI *plci, word b)
 {
-  return ((plci->c_ind_mask_table[b >> 5] & (1L << (b & 0x1f))) != 0);
+       return ((plci->c_ind_mask_table[b >> 5] & (1L << (b & 0x1f))) != 0);
 }
 
-static void dump_c_ind_mask (PLCI   *plci)
+static void dump_c_ind_mask(PLCI *plci)
 {
-static char hex_digit_table[0x10] =
-  {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};
-  word i, j, k;
-  dword d;
-    char *p;
-    char buf[40];
+       static char hex_digit_table[0x10] =
+               {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
+       word i, j, k;
+       dword d;
+       char *p;
+       char buf[40];
 
-  for (i = 0; i < C_IND_MASK_DWORDS; i += 4)
-  {
-    p = buf + 36;
-    *p = '\0';
-    for (j = 0; j < 4; j++)
-    {
-      if (i+j < C_IND_MASK_DWORDS)
-      {
-        d = plci->c_ind_mask_table[i+j];
-        for (k = 0; k < 8; k++)
-        {
-          *(--p) = hex_digit_table[d & 0xf];
-          d >>= 4;
-        }
-      }
-      else if (i != 0)
-      {
-        for (k = 0; k < 8; k++)
-          *(--p) = ' ';
-      }
-      *(--p) = ' ';
-    }
-    dbug(1,dprintf ("c_ind_mask =%s", (char   *) p));
-  }
+       for (i = 0; i < C_IND_MASK_DWORDS; i += 4)
+       {
+               p = buf + 36;
+               *p = '\0';
+               for (j = 0; j < 4; j++)
+               {
+                       if (i + j < C_IND_MASK_DWORDS)
+                       {
+                               d = plci->c_ind_mask_table[i + j];
+                               for (k = 0; k < 8; k++)
+                               {
+                                       *(--p) = hex_digit_table[d & 0xf];
+                                       d >>= 4;
+                               }
+                       }
+                       else if (i != 0)
+                       {
+                               for (k = 0; k < 8; k++)
+                                       *(--p) = ' ';
+                       }
+                       *(--p) = ' ';
+               }
+               dbug(1, dprintf("c_ind_mask =%s", (char *) p));
+       }
 }
 
 
@@ -1195,6204 +1195,6204 @@ static char hex_digit_table[0x10] =
 static byte connect_req(dword Id, word Number, DIVA_CAPI_ADAPTER *a,
                        PLCI *plci, APPL *appl, API_PARSE *parms)
 {
-  word ch;
-  word i;
-  word Info;
-  byte LinkLayer;
-  API_PARSE * ai;
-  API_PARSE * bp;
-    API_PARSE ai_parms[5];
-  word channel = 0;
-  dword ch_mask;
-  byte m;
-  static byte esc_chi[35] = {0x02,0x18,0x01};
-  static byte lli[2] = {0x01,0x00};
-  byte noCh = 0;
-  word dir = 0;
-  byte   *p_chi = "";
-
-  for(i=0;i<5;i++) ai_parms[i].length = 0;
-
-  dbug(1,dprintf("connect_req(%d)",parms->length));
-  Info = _WRONG_IDENTIFIER;
-  if(a)
-  {
-    if(a->adapter_disabled)
-    {
-      dbug(1,dprintf("adapter disabled"));
-      Id = ((word)1<<8)|a->Id;
-      sendf(appl,_CONNECT_R|CONFIRM,Id,Number,"w",0);
-      sendf(appl, _DISCONNECT_I, Id, 0, "w", _L1_ERROR);
-      return false;
-    }
-    Info = _OUT_OF_PLCI;
-    if((i=get_plci(a)))
-    {
-      Info = 0;
-      plci = &a->plci[i-1];
-      plci->appl = appl;
-      plci->call_dir = CALL_DIR_OUT | CALL_DIR_ORIGINATE;
-      /* check 'external controller' bit for codec support */
-      if(Id & EXT_CONTROLLER)
-      {
-        if(AdvCodecSupport(a, plci, appl, 0) )
-        {
-          plci->Id = 0;
-          sendf(appl, _CONNECT_R|CONFIRM, Id, Number, "w", _WRONG_IDENTIFIER);
-          return 2;
-        }
-      }
-      ai = &parms[9];
-      bp = &parms[5];
-      ch = 0;
-      if(bp->length)LinkLayer = bp->info[3];
-      else LinkLayer = 0;
-      if(ai->length)
-      {
-        ch=0xffff;
-        if(!api_parse(&ai->info[1],(word)ai->length,"ssss",ai_parms))
-        {
-          ch = 0;
-          if(ai_parms[0].length)
-          {
-            ch = GET_WORD(ai_parms[0].info+1);
-            if(ch>4) ch=0; /* safety -> ignore ChannelID */
-            if(ch==4) /* explizit CHI in message */
-            {
-              /* check length of B-CH struct */
-              if((ai_parms[0].info)[3]>=1)
-              {
-                if((ai_parms[0].info)[4]==CHI)
-                {
-                  p_chi = &((ai_parms[0].info)[5]);
-                }
-                else
-                {
-                  p_chi = &((ai_parms[0].info)[3]);
-                }
-                if(p_chi[0]>35) /* check length of channel ID */
-                {
-                  Info = _WRONG_MESSAGE_FORMAT;    
-                }
-              }
-              else Info = _WRONG_MESSAGE_FORMAT;    
-            }
-
-            if(ch==3 && ai_parms[0].length>=7 && ai_parms[0].length<=36)
-            {
-              dir = GET_WORD(ai_parms[0].info+3);
-              ch_mask = 0;
-              m = 0x3f;
-              for(i=0; i+5<=ai_parms[0].length; i++)
-              {
-                if(ai_parms[0].info[i+5]!=0)
-                {
-                  if((ai_parms[0].info[i+5] | m) != 0xff)
-                    Info = _WRONG_MESSAGE_FORMAT;
-                  else
-                  {
-                    if (ch_mask == 0)
-                      channel = i;
-                    ch_mask |= 1L << i;
-                  }
-                }
-                m = 0;
-              }
-              if (ch_mask == 0)
-                Info = _WRONG_MESSAGE_FORMAT;
-              if (!Info)
-              {
-                if ((ai_parms[0].length == 36) || (ch_mask != ((dword)(1L << channel))))
-                {
-                  esc_chi[0] = (byte)(ai_parms[0].length - 2);
-                  for(i=0; i+5<=ai_parms[0].length; i++)
-                    esc_chi[i+3] = ai_parms[0].info[i+5];
-                }
-                else
-                  esc_chi[0] = 2;
-                esc_chi[2] = (byte)channel;
-                plci->b_channel = (byte)channel; /* not correct for ETSI ch 17..31 */
-                add_p(plci,LLI,lli);
-                add_p(plci,ESC,esc_chi);
-                plci->State = LOCAL_CONNECT;
-                if(!dir) plci->call_dir |= CALL_DIR_FORCE_OUTG_NL;     /* dir 0=DTE, 1=DCE */
-              }
-            }
-          }
-        }
-        else  Info = _WRONG_MESSAGE_FORMAT;
-      }
-
-      dbug(1,dprintf("ch=%x,dir=%x,p_ch=%d",ch,dir,channel));
-      plci->command = _CONNECT_R;
-      plci->number = Number;
-      /* x.31 or D-ch free SAPI in LinkLayer? */
-      if(ch==1 && LinkLayer!=3 && LinkLayer!=12) noCh = true;
-      if((ch==0 || ch==2 || noCh || ch==3 || ch==4) && !Info)
-      {
-        /* B-channel used for B3 connections (ch==0), or no B channel    */
-        /* is used (ch==2) or perm. connection (3) is used  do a CALL    */
-        if(noCh) Info = add_b1(plci,&parms[5],2,0);    /* no resource    */
-        else     Info = add_b1(plci,&parms[5],ch,0); 
-        add_s(plci,OAD,&parms[2]);
-        add_s(plci,OSA,&parms[4]);
-        add_s(plci,BC,&parms[6]);
-        add_s(plci,LLC,&parms[7]);
-        add_s(plci,HLC,&parms[8]);
-        if (a->Info_Mask[appl->Id-1] & 0x200)
-        {
-          /* early B3 connect (CIP mask bit 9) no release after a disc */
-          add_p(plci,LLI,"\x01\x01");
-        }
-        if(GET_WORD(parms[0].info)<29) {
-          add_p(plci,BC,cip_bc[GET_WORD(parms[0].info)][a->u_law]);
-          add_p(plci,HLC,cip_hlc[GET_WORD(parms[0].info)]);
-        }
-        add_p(plci,UID,"\x06\x43\x61\x70\x69\x32\x30");
-        sig_req(plci,ASSIGN,DSIG_ID);
-      }
-      else if(ch==1) {
-
-        /* D-Channel used for B3 connections */
-        plci->Sig.Id = 0xff;
-        Info = 0;
-      }
-
-      if(!Info && ch!=2 && !noCh ) {
-        Info = add_b23(plci,&parms[5]);
-        if(!Info) {
-          if(!(plci->tel && !plci->adv_nl))nl_req_ncci(plci,ASSIGN,0);
-        }
-      }
-
-      if(!Info)
-      {
-        if(ch==0 || ch==2 || ch==3 || noCh || ch==4)
-        {
-          if(plci->spoofed_msg==SPOOFING_REQUIRED)
-          {
-            api_save_msg(parms, "wsssssssss", &plci->saved_msg);
-            plci->spoofed_msg = CALL_REQ;
-            plci->internal_command = BLOCK_PLCI;
-            plci->command = 0;
-            dbug(1,dprintf("Spoof"));
-            send_req(plci);
-            return false;
-          }
-          if(ch==4)add_p(plci,CHI,p_chi);
-          add_s(plci,CPN,&parms[1]);
-          add_s(plci,DSA,&parms[3]);
-          if(noCh) add_p(plci,ESC,"\x02\x18\xfd");  /* D-channel, no B-L3 */
-          add_ai(plci,&parms[9]);
-          if(!dir)sig_req(plci,CALL_REQ,0);
-          else
-          {
-            plci->command = PERM_LIST_REQ;
-            plci->appl = appl;
-            sig_req(plci,LISTEN_REQ,0);
-            send_req(plci);
-            return false;
-          }
-        }
-        send_req(plci);
-        return false;
-      }
-      plci->Id = 0;
-    }
-  }
-  sendf(appl,
-        _CONNECT_R|CONFIRM,
-        Id,
-        Number,
-        "w",Info);
-  return 2;
+       word ch;
+       word i;
+       word Info;
+       byte LinkLayer;
+       API_PARSE *ai;
+       API_PARSE *bp;
+       API_PARSE ai_parms[5];
+       word channel = 0;
+       dword ch_mask;
+       byte m;
+       static byte esc_chi[35] = {0x02, 0x18, 0x01};
+       static byte lli[2] = {0x01, 0x00};
+       byte noCh = 0;
+       word dir = 0;
+       byte *p_chi = "";
+
+       for (i = 0; i < 5; i++) ai_parms[i].length = 0;
+
+       dbug(1, dprintf("connect_req(%d)", parms->length));
+       Info = _WRONG_IDENTIFIER;
+       if (a)
+       {
+               if (a->adapter_disabled)
+               {
+                       dbug(1, dprintf("adapter disabled"));
+                       Id = ((word)1 << 8) | a->Id;
+                       sendf(appl, _CONNECT_R | CONFIRM, Id, Number, "w", 0);
+                       sendf(appl, _DISCONNECT_I, Id, 0, "w", _L1_ERROR);
+                       return false;
+               }
+               Info = _OUT_OF_PLCI;
+               if ((i = get_plci(a)))
+               {
+                       Info = 0;
+                       plci = &a->plci[i - 1];
+                       plci->appl = appl;
+                       plci->call_dir = CALL_DIR_OUT | CALL_DIR_ORIGINATE;
+                       /* check 'external controller' bit for codec support */
+                       if (Id & EXT_CONTROLLER)
+                       {
+                               if (AdvCodecSupport(a, plci, appl, 0))
+                               {
+                                       plci->Id = 0;
+                                       sendf(appl, _CONNECT_R | CONFIRM, Id, Number, "w", _WRONG_IDENTIFIER);
+                                       return 2;
+                               }
+                       }
+                       ai = &parms[9];
+                       bp = &parms[5];
+                       ch = 0;
+                       if (bp->length)LinkLayer = bp->info[3];
+                       else LinkLayer = 0;
+                       if (ai->length)
+                       {
+                               ch = 0xffff;
+                               if (!api_parse(&ai->info[1], (word)ai->length, "ssss", ai_parms))
+                               {
+                                       ch = 0;
+                                       if (ai_parms[0].length)
+                                       {
+                                               ch = GET_WORD(ai_parms[0].info + 1);
+                                               if (ch > 4) ch = 0; /* safety -> ignore ChannelID */
+                                               if (ch == 4) /* explizit CHI in message */
+                                               {
+                                                       /* check length of B-CH struct */
+                                                       if ((ai_parms[0].info)[3] >= 1)
+                                                       {
+                                                               if ((ai_parms[0].info)[4] == CHI)
+                                                               {
+                                                                       p_chi = &((ai_parms[0].info)[5]);
+                                                               }
+                                                               else
+                                                               {
+                                                                       p_chi = &((ai_parms[0].info)[3]);
+                                                               }
+                                                               if (p_chi[0] > 35) /* check length of channel ID */
+                                                               {
+                                                                       Info = _WRONG_MESSAGE_FORMAT;
+                                                               }
+                                                       }
+                                                       else Info = _WRONG_MESSAGE_FORMAT;
+                                               }
+
+                                               if (ch == 3 && ai_parms[0].length >= 7 && ai_parms[0].length <= 36)
+                                               {
+                                                       dir = GET_WORD(ai_parms[0].info + 3);
+                                                       ch_mask = 0;
+                                                       m = 0x3f;
+                                                       for (i = 0; i + 5 <= ai_parms[0].length; i++)
+                                                       {
+                                                               if (ai_parms[0].info[i + 5] != 0)
+                                                               {
+                                                                       if ((ai_parms[0].info[i + 5] | m) != 0xff)
+                                                                               Info = _WRONG_MESSAGE_FORMAT;
+                                                                       else
+                                                                       {
+                                                                               if (ch_mask == 0)
+                                                                                       channel = i;
+                                                                               ch_mask |= 1L << i;
+                                                                       }
+                                                               }
+                                                               m = 0;
+                                                       }
+                                                       if (ch_mask == 0)
+                                                               Info = _WRONG_MESSAGE_FORMAT;
+                                                       if (!Info)
+                                                       {
+                                                               if ((ai_parms[0].length == 36) || (ch_mask != ((dword)(1L << channel))))
+                                                               {
+                                                                       esc_chi[0] = (byte)(ai_parms[0].length - 2);
+                                                                       for (i = 0; i + 5 <= ai_parms[0].length; i++)
+                                                                               esc_chi[i + 3] = ai_parms[0].info[i + 5];
+                                                               }
+                                                               else
+                                                                       esc_chi[0] = 2;
+                                                               esc_chi[2] = (byte)channel;
+                                                               plci->b_channel = (byte)channel; /* not correct for ETSI ch 17..31 */
+                                                               add_p(plci, LLI, lli);
+                                                               add_p(plci, ESC, esc_chi);
+                                                               plci->State = LOCAL_CONNECT;
+                                                               if (!dir) plci->call_dir |= CALL_DIR_FORCE_OUTG_NL;     /* dir 0=DTE, 1=DCE */
+                                                       }
+                                               }
+                                       }
+                               }
+                               else  Info = _WRONG_MESSAGE_FORMAT;
+                       }
+
+                       dbug(1, dprintf("ch=%x,dir=%x,p_ch=%d", ch, dir, channel));
+                       plci->command = _CONNECT_R;
+                       plci->number = Number;
+                       /* x.31 or D-ch free SAPI in LinkLayer? */
+                       if (ch == 1 && LinkLayer != 3 && LinkLayer != 12) noCh = true;
+                       if ((ch == 0 || ch == 2 || noCh || ch == 3 || ch == 4) && !Info)
+                       {
+                               /* B-channel used for B3 connections (ch==0), or no B channel    */
+                               /* is used (ch==2) or perm. connection (3) is used  do a CALL    */
+                               if (noCh) Info = add_b1(plci, &parms[5], 2, 0);    /* no resource    */
+                               else     Info = add_b1(plci, &parms[5], ch, 0);
+                               add_s(plci, OAD, &parms[2]);
+                               add_s(plci, OSA, &parms[4]);
+                               add_s(plci, BC, &parms[6]);
+                               add_s(plci, LLC, &parms[7]);
+                               add_s(plci, HLC, &parms[8]);
+                               if (a->Info_Mask[appl->Id - 1] & 0x200)
+                               {
+                                       /* early B3 connect (CIP mask bit 9) no release after a disc */
+                                       add_p(plci, LLI, "\x01\x01");
+                               }
+                               if (GET_WORD(parms[0].info) < 29) {
+                                       add_p(plci, BC, cip_bc[GET_WORD(parms[0].info)][a->u_law]);
+                                       add_p(plci, HLC, cip_hlc[GET_WORD(parms[0].info)]);
+                               }
+                               add_p(plci, UID, "\x06\x43\x61\x70\x69\x32\x30");
+                               sig_req(plci, ASSIGN, DSIG_ID);
+                       }
+                       else if (ch == 1) {
+
+                               /* D-Channel used for B3 connections */
+                               plci->Sig.Id = 0xff;
+                               Info = 0;
+                       }
+
+                       if (!Info && ch != 2 && !noCh) {
+                               Info = add_b23(plci, &parms[5]);
+                               if (!Info) {
+                                       if (!(plci->tel && !plci->adv_nl))nl_req_ncci(plci, ASSIGN, 0);
+                               }
+                       }
+
+                       if (!Info)
+                       {
+                               if (ch == 0 || ch == 2 || ch == 3 || noCh || ch == 4)
+                               {
+                                       if (plci->spoofed_msg == SPOOFING_REQUIRED)
+                                       {
+                                               api_save_msg(parms, "wsssssssss", &plci->saved_msg);
+                                               plci->spoofed_msg = CALL_REQ;
+                                               plci->internal_command = BLOCK_PLCI;
+                                               plci->command = 0;
+                                               dbug(1, dprintf("Spoof"));
+                                               send_req(plci);
+                                               return false;
+                                       }
+                                       if (ch == 4)add_p(plci, CHI, p_chi);
+                                       add_s(plci, CPN, &parms[1]);
+                                       add_s(plci, DSA, &parms[3]);
+                                       if (noCh) add_p(plci, ESC, "\x02\x18\xfd");  /* D-channel, no B-L3 */
+                                       add_ai(plci, &parms[9]);
+                                       if (!dir)sig_req(plci, CALL_REQ, 0);
+                                       else
+                                       {
+                                               plci->command = PERM_LIST_REQ;
+                                               plci->appl = appl;
+                                               sig_req(plci, LISTEN_REQ, 0);
+                                               send_req(plci);
+                                               return false;
+                                       }
+                               }
+                               send_req(plci);
+                               return false;
+                       }
+                       plci->Id = 0;
+               }
+       }
+       sendf(appl,
+             _CONNECT_R | CONFIRM,
+             Id,
+             Number,
+             "w", Info);
+       return 2;
 }
 
 static byte connect_res(dword Id, word Number, DIVA_CAPI_ADAPTER *a,
                        PLCI *plci, APPL *appl, API_PARSE *parms)
 {
-  word i, Info;
-  word Reject;
-  static byte cau_t[] = {0,0,0x90,0x91,0xac,0x9d,0x86,0xd8,0x9b};
-  static byte esc_t[] = {0x03,0x08,0x00,0x00};
-  API_PARSE * ai;
-    API_PARSE ai_parms[5];
-  word ch=0;
-
-  if(!plci) {
-    dbug(1,dprintf("connect_res(no plci)"));
-    return 0;  /* no plci, no send */
-  }
-
-  dbug(1,dprintf("connect_res(State=0x%x)",plci->State));
-  for(i=0;i<5;i++) ai_parms[i].length = 0;
-  ai = &parms[5];
-  dbug(1,dprintf("ai->length=%d",ai->length));
-
-  if(ai->length)
-  {
-    if(!api_parse(&ai->info[1],(word)ai->length,"ssss",ai_parms))
-    {
-      dbug(1,dprintf("ai_parms[0].length=%d/0x%x",ai_parms[0].length,GET_WORD(ai_parms[0].info+1)));
-      ch = 0;
-      if(ai_parms[0].length)
-      {
-        ch = GET_WORD(ai_parms[0].info+1);
-        dbug(1,dprintf("BCH-I=0x%x",ch));
-      }
-    }
-  }
-
-  if(plci->State==INC_CON_CONNECTED_ALERT)
-  {
-    dbug(1,dprintf("Connected Alert Call_Res"));
-    if (a->Info_Mask[appl->Id-1] & 0x200)
-    {
-    /* early B3 connect (CIP mask bit 9) no release after a disc */
-      add_p(plci,LLI,"\x01\x01");
-    }
-    add_s(plci, CONN_NR, &parms[2]);
-    add_s(plci, LLC, &parms[4]);
-    add_ai(plci, &parms[5]);
-    plci->State = INC_CON_ACCEPT;
-    sig_req(plci, CALL_RES,0);
-    return 1;
-  }
-  else if(plci->State==INC_CON_PENDING || plci->State==INC_CON_ALERT) {
-    clear_c_ind_mask_bit (plci, (word)(appl->Id-1));
-    dump_c_ind_mask (plci);
-    Reject = GET_WORD(parms[0].info);
-    dbug(1,dprintf("Reject=0x%x",Reject));
-    if(Reject) 
-    {
-      if(c_ind_mask_empty (plci)) 
-      {
-        if((Reject&0xff00)==0x3400) 
-        {
-          esc_t[2] = ((byte)(Reject&0x00ff)) | 0x80;
-          add_p(plci,ESC,esc_t);
-          add_ai(plci, &parms[5]);
-          sig_req(plci,REJECT,0);
-        }      
-        else if(Reject==1 || Reject>9) 
-        {
-          add_ai(plci, &parms[5]);
-          sig_req(plci,HANGUP,0);
-        }
-        else 
-        {
-          esc_t[2] = cau_t[(Reject&0x000f)];
-          add_p(plci,ESC,esc_t);
-          add_ai(plci, &parms[5]);
-          sig_req(plci,REJECT,0);
-        }
-        plci->appl = appl;
-      }
-      else 
-      {
-        sendf(appl, _DISCONNECT_I, Id, 0, "w", _OTHER_APPL_CONNECTED);
-      }
-    }
-    else {
-      plci->appl = appl;
-      if(Id & EXT_CONTROLLER){
-        if(AdvCodecSupport(a, plci, appl, 0)){
-          dbug(1,dprintf("connect_res(error from AdvCodecSupport)"));
-          sig_req(plci,HANGUP,0);
-          return 1;
-        }
-        if(plci->tel == ADV_VOICE && a->AdvCodecPLCI)
-        {
-          Info = add_b23(plci, &parms[1]);
-          if (Info)
-          {
-            dbug(1,dprintf("connect_res(error from add_b23)"));
-            sig_req(plci,HANGUP,0);
-            return 1;
-          }
-          if(plci->adv_nl)
-          {
-            nl_req_ncci(plci, ASSIGN, 0);
-          }
-        }
-      }
-      else
-      {
-        plci->tel = 0;
-        if(ch!=2)
-        {
-          Info = add_b23(plci, &parms[1]);
-          if (Info)
-          {
-            dbug(1,dprintf("connect_res(error from add_b23 2)"));
-            sig_req(plci,HANGUP,0);
-            return 1;
-          }
-        }
-        nl_req_ncci(plci, ASSIGN, 0);
-      }
-
-      if(plci->spoofed_msg==SPOOFING_REQUIRED)
-      {
-        api_save_msg(parms, "wsssss", &plci->saved_msg);
-        plci->spoofed_msg = CALL_RES;
-        plci->internal_command = BLOCK_PLCI;
-        plci->command = 0;
-        dbug(1,dprintf("Spoof"));
-      }
-      else
-      {
-        add_b1 (plci, &parms[1], ch, plci->B1_facilities);
-        if (a->Info_Mask[appl->Id-1] & 0x200)
-        {
-          /* early B3 connect (CIP mask bit 9) no release after a disc */
-          add_p(plci,LLI,"\x01\x01");
-        }
-        add_s(plci, CONN_NR, &parms[2]);
-        add_s(plci, LLC, &parms[4]);
-        add_ai(plci, &parms[5]);
-        plci->State = INC_CON_ACCEPT;
-        sig_req(plci, CALL_RES,0);
-      }
-
-      for(i=0; i<max_appl; i++) {
-        if(test_c_ind_mask_bit (plci, i)) {
-          sendf(&application[i], _DISCONNECT_I, Id, 0, "w", _OTHER_APPL_CONNECTED);
-        }
-      }
-    }
-  }
-  return 1;
+       word i, Info;
+       word Reject;
+       static byte cau_t[] = {0, 0, 0x90, 0x91, 0xac, 0x9d, 0x86, 0xd8, 0x9b};
+       static byte esc_t[] = {0x03, 0x08, 0x00, 0x00};
+       API_PARSE *ai;
+       API_PARSE ai_parms[5];
+       word ch = 0;
+
+       if (!plci) {
+               dbug(1, dprintf("connect_res(no plci)"));
+               return 0;  /* no plci, no send */
+       }
+
+       dbug(1, dprintf("connect_res(State=0x%x)", plci->State));
+       for (i = 0; i < 5; i++) ai_parms[i].length = 0;
+       ai = &parms[5];
+       dbug(1, dprintf("ai->length=%d", ai->length));
+
+       if (ai->length)
+       {
+               if (!api_parse(&ai->info[1], (word)ai->length, "ssss", ai_parms))
+               {
+                       dbug(1, dprintf("ai_parms[0].length=%d/0x%x", ai_parms[0].length, GET_WORD(ai_parms[0].info + 1)));
+                       ch = 0;
+                       if (ai_parms[0].length)
+                       {
+                               ch = GET_WORD(ai_parms[0].info + 1);
+                               dbug(1, dprintf("BCH-I=0x%x", ch));
+                       }
+               }
+       }
+
+       if (plci->State == INC_CON_CONNECTED_ALERT)
+       {
+               dbug(1, dprintf("Connected Alert Call_Res"));
+               if (a->Info_Mask[appl->Id - 1] & 0x200)
+               {
+                       /* early B3 connect (CIP mask bit 9) no release after a disc */
+                       add_p(plci, LLI, "\x01\x01");
+               }
+               add_s(plci, CONN_NR, &parms[2]);
+               add_s(plci, LLC, &parms[4]);
+               add_ai(plci, &parms[5]);
+               plci->State = INC_CON_ACCEPT;
+               sig_req(plci, CALL_RES, 0);
+               return 1;
+       }
+       else if (plci->State == INC_CON_PENDING || plci->State == INC_CON_ALERT) {
+               clear_c_ind_mask_bit(plci, (word)(appl->Id - 1));
+               dump_c_ind_mask(plci);
+               Reject = GET_WORD(parms[0].info);
+               dbug(1, dprintf("Reject=0x%x", Reject));
+               if (Reject)
+               {
+                       if (c_ind_mask_empty(plci))
+                       {
+                               if ((Reject & 0xff00) == 0x3400)
+                               {
+                                       esc_t[2] = ((byte)(Reject & 0x00ff)) | 0x80;
+                                       add_p(plci, ESC, esc_t);
+                                       add_ai(plci, &parms[5]);
+                                       sig_req(plci, REJECT, 0);
+                               }
+                               else if (Reject == 1 || Reject > 9)
+                               {
+                                       add_ai(plci, &parms[5]);
+                                       sig_req(plci, HANGUP, 0);
+                               }
+                               else
+                               {
+                                       esc_t[2] = cau_t[(Reject&0x000f)];
+                                       add_p(plci, ESC, esc_t);
+                                       add_ai(plci, &parms[5]);
+                                       sig_req(plci, REJECT, 0);
+                               }
+                               plci->appl = appl;
+                       }
+                       else
+                       {
+                               sendf(appl, _DISCONNECT_I, Id, 0, "w", _OTHER_APPL_CONNECTED);
+                       }
+               }
+               else {
+                       plci->appl = appl;
+                       if (Id & EXT_CONTROLLER) {
+                               if (AdvCodecSupport(a, plci, appl, 0)) {
+                                       dbug(1, dprintf("connect_res(error from AdvCodecSupport)"));
+                                       sig_req(plci, HANGUP, 0);
+                                       return 1;
+                               }
+                               if (plci->tel == ADV_VOICE && a->AdvCodecPLCI)
+                               {
+                                       Info = add_b23(plci, &parms[1]);
+                                       if (Info)
+                                       {
+                                               dbug(1, dprintf("connect_res(error from add_b23)"));
+                                               sig_req(plci, HANGUP, 0);
+                                               return 1;
+                                       }
+                                       if (plci->adv_nl)
+                                       {
+                                               nl_req_ncci(plci, ASSIGN, 0);
+                                       }
+                               }
+                       }
+                       else
+                       {
+                               plci->tel = 0;
+                               if (ch != 2)
+                               {
+                                       Info = add_b23(plci, &parms[1]);
+                                       if (Info)
+                                       {
+                                               dbug(1, dprintf("connect_res(error from add_b23 2)"));
+                                               sig_req(plci, HANGUP, 0);
+                                               return 1;
+                                       }
+                               }
+                               nl_req_ncci(plci, ASSIGN, 0);
+                       }
+
+                       if (plci->spoofed_msg == SPOOFING_REQUIRED)
+                       {
+                               api_save_msg(parms, "wsssss", &plci->saved_msg);
+                               plci->spoofed_msg = CALL_RES;
+                               plci->internal_command = BLOCK_PLCI;
+                               plci->command = 0;
+                               dbug(1, dprintf("Spoof"));
+                       }
+                       else
+                       {
+                               add_b1(plci, &parms[1], ch, plci->B1_facilities);
+                               if (a->Info_Mask[appl->Id - 1] & 0x200)
+                               {
+                                       /* early B3 connect (CIP mask bit 9) no release after a disc */
+                                       add_p(plci, LLI, "\x01\x01");
+                               }
+                               add_s(plci, CONN_NR, &parms[2]);
+                               add_s(plci, LLC, &parms[4]);
+                               add_ai(plci, &parms[5]);
+                               plci->State = INC_CON_ACCEPT;
+                               sig_req(plci, CALL_RES, 0);
+                       }
+
+                       for (i = 0; i < max_appl; i++) {
+                               if (test_c_ind_mask_bit(plci, i)) {
+                                       sendf(&application[i], _DISCONNECT_I, Id, 0, "w", _OTHER_APPL_CONNECTED);
+                               }
+                       }
+               }
+       }
+       return 1;
 }
 
 static byte connect_a_res(dword Id, word Number, DIVA_CAPI_ADAPTER *a,
                          PLCI *plci, APPL *appl, API_PARSE *msg)
 {
-  dbug(1,dprintf("connect_a_res"));
-  return false;
+       dbug(1, dprintf("connect_a_res"));
+       return false;
 }
 
 static byte disconnect_req(dword Id, word Number, DIVA_CAPI_ADAPTER *a,
                           PLCI *plci, APPL *appl, API_PARSE *msg)
 {
-  word Info;
-  word i;
-
-  dbug(1,dprintf("disconnect_req"));
-
-  Info = _WRONG_IDENTIFIER;
-
-  if(plci)
-  {
-    if(plci->State==INC_CON_PENDING || plci->State==INC_CON_ALERT)
-    {
-      clear_c_ind_mask_bit (plci, (word)(appl->Id-1));
-      plci->appl = appl;
-      for(i=0; i<max_appl; i++)
-      {
-        if(test_c_ind_mask_bit (plci, i))
-          sendf(&application[i], _DISCONNECT_I, Id, 0, "w", 0);
-      }
-      plci->State = OUTG_DIS_PENDING;
-    }
-    if(plci->Sig.Id && plci->appl)
-    {
-      Info = 0;
-        if(plci->Sig.Id!=0xff)
-        {
-          if(plci->State!=INC_DIS_PENDING)
-          {
-            add_ai(plci, &msg[0]);
-            sig_req(plci,HANGUP,0);
-            plci->State = OUTG_DIS_PENDING;
-            return 1;
-          }
-        }
-        else
-        {
-          if (plci->NL.Id && !plci->nl_remove_id)
-          {
-            mixer_remove (plci);
-            nl_req_ncci(plci,REMOVE,0);
-          sendf(appl,_DISCONNECT_R|CONFIRM,Id,Number,"w",0);
-          sendf(appl, _DISCONNECT_I, Id, 0, "w", 0);
-          plci->State = INC_DIS_PENDING;
-          }
-          return 1;
-        }
-      }
-    }
-
-  if(!appl)  return false;
-  sendf(appl, _DISCONNECT_R|CONFIRM, Id, Number, "w",Info);
-  return false;
+       word Info;
+       word i;
+
+       dbug(1, dprintf("disconnect_req"));
+
+       Info = _WRONG_IDENTIFIER;
+
+       if (plci)
+       {
+               if (plci->State == INC_CON_PENDING || plci->State == INC_CON_ALERT)
+               {
+                       clear_c_ind_mask_bit(plci, (word)(appl->Id - 1));
+                       plci->appl = appl;
+                       for (i = 0; i < max_appl; i++)
+                       {
+                               if (test_c_ind_mask_bit(plci, i))
+                                       sendf(&application[i], _DISCONNECT_I, Id, 0, "w", 0);
+                       }
+                       plci->State = OUTG_DIS_PENDING;
+               }
+               if (plci->Sig.Id && plci->appl)
+               {
+                       Info = 0;
+                       if (plci->Sig.Id != 0xff)
+                       {
+                               if (plci->State != INC_DIS_PENDING)
+                               {
+                                       add_ai(plci, &msg[0]);
+                                       sig_req(plci, HANGUP, 0);
+                                       plci->State = OUTG_DIS_PENDING;
+                                       return 1;
+                               }
+                       }
+                       else
+                       {
+                               if (plci->NL.Id && !plci->nl_remove_id)
+                               {
+                                       mixer_remove(plci);
+                                       nl_req_ncci(plci, REMOVE, 0);
+                                       sendf(appl, _DISCONNECT_R | CONFIRM, Id, Number, "w", 0);
+                                       sendf(appl, _DISCONNECT_I, Id, 0, "w", 0);
+                                       plci->State = INC_DIS_PENDING;
+                               }
+                               return 1;
+                       }
+               }
+       }
+
+       if (!appl)  return false;
+       sendf(appl, _DISCONNECT_R | CONFIRM, Id, Number, "w", Info);
+       return false;
 }
 
 static byte disconnect_res(dword Id, word Number, DIVA_CAPI_ADAPTER *a,
                           PLCI *plci, APPL *appl, API_PARSE *msg)
 {
-  dbug(1,dprintf("disconnect_res"));
-  if(plci)
-  {
-        /* clear ind mask bit, just in case of collsion of          */
-        /* DISCONNECT_IND and CONNECT_RES                           */
-    clear_c_ind_mask_bit (plci, (word)(appl->Id-1));
-    ncci_free_receive_buffers (plci, 0);
-    if(plci_remove_check(plci))
-    {
-      return 0;
-    }
-    if(plci->State==INC_DIS_PENDING
-    || plci->State==SUSPENDING) {
-      if(c_ind_mask_empty (plci)) {
-        if(plci->State!=SUSPENDING)plci->State = IDLE;
-        dbug(1,dprintf("chs=%d",plci->channels));
-        if(!plci->channels) {
-          plci_remove(plci);
-        }
-      }
-    }
-  }
-  return 0;
+       dbug(1, dprintf("disconnect_res"));
+       if (plci)
+       {
+               /* clear ind mask bit, just in case of collsion of          */
+               /* DISCONNECT_IND and CONNECT_RES                           */
+               clear_c_ind_mask_bit(plci, (word)(appl->Id - 1));
+               ncci_free_receive_buffers(plci, 0);
+               if (plci_remove_check(plci))
+               {
+                       return 0;
+               }
+               if (plci->State == INC_DIS_PENDING
+                   || plci->State == SUSPENDING) {
+                       if (c_ind_mask_empty(plci)) {
+                               if (plci->State != SUSPENDING) plci->State = IDLE;
+                               dbug(1, dprintf("chs=%d", plci->channels));
+                               if (!plci->channels) {
+                                       plci_remove(plci);
+                               }
+                       }
+               }
+       }
+       return 0;
 }
 
 static byte listen_req(dword Id, word Number, DIVA_CAPI_ADAPTER *a,
                       PLCI *plci, APPL *appl, API_PARSE *parms)
 {
-  word Info;
-  byte i;
-
-  dbug(1,dprintf("listen_req(Appl=0x%x)",appl->Id));
-
-  Info = _WRONG_IDENTIFIER;
-  if(a) {
-    Info = 0;
-    a->Info_Mask[appl->Id-1] = GET_DWORD(parms[0].info);
-    a->CIP_Mask[appl->Id-1] = GET_DWORD(parms[1].info);
-    dbug(1,dprintf("CIP_MASK=0x%lx",GET_DWORD(parms[1].info)));
-    if (a->Info_Mask[appl->Id-1] & 0x200){ /* early B3 connect provides */
-      a->Info_Mask[appl->Id-1] |=  0x10;   /* call progression infos    */
-    }
-
-    /* check if external controller listen and switch listen on or off*/
-    if(Id&EXT_CONTROLLER && GET_DWORD(parms[1].info)){
-      if(a->profile.Global_Options & ON_BOARD_CODEC) {
-        dummy_plci.State = IDLE;
-        a->codec_listen[appl->Id-1] = &dummy_plci;
-        a->TelOAD[0] = (byte)(parms[3].length);
-        for(i=1;parms[3].length>=i && i<22;i++) {
-          a->TelOAD[i] = parms[3].info[i];
-        }
-        a->TelOAD[i] = 0;
-        a->TelOSA[0] = (byte)(parms[4].length);
-        for(i=1;parms[4].length>=i && i<22;i++) {
-          a->TelOSA[i] = parms[4].info[i];
-        }
-        a->TelOSA[i] = 0;
-      }
-      else Info = 0x2002; /* wrong controller, codec not supported */
-    }
-    else{               /* clear listen */
-      a->codec_listen[appl->Id-1] = (PLCI   *)0;
-    }
-  }
-  sendf(appl,
-        _LISTEN_R|CONFIRM,
-        Id,
-        Number,
-        "w",Info);
-
-  if (a) listen_check(a);
-  return false;
+       word Info;
+       byte i;
+
+       dbug(1, dprintf("listen_req(Appl=0x%x)", appl->Id));
+
+       Info = _WRONG_IDENTIFIER;
+       if (a) {
+               Info = 0;
+               a->Info_Mask[appl->Id - 1] = GET_DWORD(parms[0].info);
+               a->CIP_Mask[appl->Id - 1] = GET_DWORD(parms[1].info);
+               dbug(1, dprintf("CIP_MASK=0x%lx", GET_DWORD(parms[1].info)));
+               if (a->Info_Mask[appl->Id - 1] & 0x200) { /* early B3 connect provides */
+                       a->Info_Mask[appl->Id - 1] |=  0x10;   /* call progression infos    */
+               }
+
+               /* check if external controller listen and switch listen on or off*/
+               if (Id&EXT_CONTROLLER && GET_DWORD(parms[1].info)) {
+                       if (a->profile.Global_Options & ON_BOARD_CODEC) {
+                               dummy_plci.State = IDLE;
+                               a->codec_listen[appl->Id - 1] = &dummy_plci;
+                               a->TelOAD[0] = (byte)(parms[3].length);
+                               for (i = 1; parms[3].length >= i && i < 22; i++) {
+                                       a->TelOAD[i] = parms[3].info[i];
+                               }
+                               a->TelOAD[i] = 0;
+                               a->TelOSA[0] = (byte)(parms[4].length);
+                               for (i = 1; parms[4].length >= i && i < 22; i++) {
+                                       a->TelOSA[i] = parms[4].info[i];
+                               }
+                               a->TelOSA[i] = 0;
+                       }
+                       else Info = 0x2002; /* wrong controller, codec not supported */
+               }
+               else{               /* clear listen */
+                       a->codec_listen[appl->Id - 1] = (PLCI *)0;
+               }
+       }
+       sendf(appl,
+             _LISTEN_R | CONFIRM,
+             Id,
+             Number,
+             "w", Info);
+
+       if (a) listen_check(a);
+       return false;
 }
 
 static byte info_req(dword Id, word Number, DIVA_CAPI_ADAPTER *a,
                     PLCI *plci, APPL *appl, API_PARSE *msg)
 {
-  word i;
-  API_PARSE * ai;
-  PLCI   * rc_plci = NULL;
-    API_PARSE ai_parms[5];
-  word Info = 0;
-
-  dbug(1,dprintf("info_req"));
-  for(i=0;i<5;i++) ai_parms[i].length = 0;
-
-  ai = &msg[1];
-
-  if(ai->length)
-  {
-    if(api_parse(&ai->info[1],(word)ai->length,"ssss",ai_parms))
-    {
-      dbug(1,dprintf("AddInfo wrong"));
-      Info = _WRONG_MESSAGE_FORMAT;
-    }
-  }
-  if(!a) Info = _WRONG_STATE;
-
-  if(!Info && plci)
-  {                /* no fac, with CPN, or KEY */
-    rc_plci = plci;
-    if(!ai_parms[3].length && plci->State && (msg[0].length || ai_parms[1].length) )
-    {
-      /* overlap sending option */
-      dbug(1,dprintf("OvlSnd"));
-      add_s(plci,CPN,&msg[0]);
-      add_s(plci,KEY,&ai_parms[1]);
-      sig_req(plci,INFO_REQ,0);
-      send_req(plci);
-      return false;
-    }
-
-    if(plci->State && ai_parms[2].length)
-    {
-      /* User_Info option */
-      dbug(1,dprintf("UUI"));
-      add_s(plci,UUI,&ai_parms[2]);
-      sig_req(plci,USER_DATA,0);
-    }
-    else if(plci->State && ai_parms[3].length)
-    {
-      /* Facility option */
-      dbug(1,dprintf("FAC"));
-      add_s(plci,CPN,&msg[0]);
-      add_ai(plci, &msg[1]);
-      sig_req(plci,FACILITY_REQ,0);
-    }
-    else
-    {
-      Info = _WRONG_STATE;
-    }
-  }
-  else if((ai_parms[1].length || ai_parms[2].length || ai_parms[3].length) && !Info)
-  {
-    /* NCR_Facility option -> send UUI and Keypad too */
-    dbug(1,dprintf("NCR_FAC"));
-    if((i=get_plci(a)))
-    {
-      rc_plci = &a->plci[i-1];
-      appl->NullCREnable  = true;
-      rc_plci->internal_command = C_NCR_FAC_REQ;
-      rc_plci->appl = appl;
-      add_p(rc_plci,CAI,"\x01\x80");
-      add_p(rc_plci,UID,"\x06\x43\x61\x70\x69\x32\x30");
-      sig_req(rc_plci,ASSIGN,DSIG_ID);
-      send_req(rc_plci);
-    }
-    else
-    {
-      Info = _OUT_OF_PLCI;
-    }
-
-    if(!Info)
-    {
-      add_s(rc_plci,CPN,&msg[0]);
-      add_ai(rc_plci, &msg[1]);
-      sig_req(rc_plci,NCR_FACILITY,0);
-      send_req(rc_plci);
-      return false;
-     /* for application controlled supplementary services    */
-    }
-  }
-
-  if (!rc_plci)
-  {
-    Info = _WRONG_MESSAGE_FORMAT;
-  }
-
-  if(!Info)
-  {
-    send_req(rc_plci);
-  }
-  else
-  {  /* appl is not assigned to a PLCI or error condition */
-    dbug(1,dprintf("localInfoCon"));
-    sendf(appl,
-          _INFO_R|CONFIRM,
-          Id,
-          Number,
-          "w",Info);
-  }
-  return false;
+       word i;
+       API_PARSE *ai;
+       PLCI *rc_plci = NULL;
+       API_PARSE ai_parms[5];
+       word Info = 0;
+
+       dbug(1, dprintf("info_req"));
+       for (i = 0; i < 5; i++) ai_parms[i].length = 0;
+
+       ai = &msg[1];
+
+       if (ai->length)
+       {
+               if (api_parse(&ai->info[1], (word)ai->length, "ssss", ai_parms))
+               {
+                       dbug(1, dprintf("AddInfo wrong"));
+                       Info = _WRONG_MESSAGE_FORMAT;
+               }
+       }
+       if (!a) Info = _WRONG_STATE;
+
+       if (!Info && plci)
+       {                /* no fac, with CPN, or KEY */
+               rc_plci = plci;
+               if (!ai_parms[3].length && plci->State && (msg[0].length || ai_parms[1].length))
+               {
+                       /* overlap sending option */
+                       dbug(1, dprintf("OvlSnd"));
+                       add_s(plci, CPN, &msg[0]);
+                       add_s(plci, KEY, &ai_parms[1]);
+                       sig_req(plci, INFO_REQ, 0);
+                       send_req(plci);
+                       return false;
+               }
+
+               if (plci->State && ai_parms[2].length)
+               {
+                       /* User_Info option */
+                       dbug(1, dprintf("UUI"));
+                       add_s(plci, UUI, &ai_parms[2]);
+                       sig_req(plci, USER_DATA, 0);
+               }
+               else if (plci->State && ai_parms[3].length)
+               {
+                       /* Facility option */
+                       dbug(1, dprintf("FAC"));
+                       add_s(plci, CPN, &msg[0]);
+                       add_ai(plci, &msg[1]);
+                       sig_req(plci, FACILITY_REQ, 0);
+               }
+               else
+               {
+                       Info = _WRONG_STATE;
+               }
+       }
+       else if ((ai_parms[1].length || ai_parms[2].length || ai_parms[3].length) && !Info)
+       {
+               /* NCR_Facility option -> send UUI and Keypad too */
+               dbug(1, dprintf("NCR_FAC"));
+               if ((i = get_plci(a)))
+               {
+                       rc_plci = &a->plci[i - 1];
+                       appl->NullCREnable = true;
+                       rc_plci->internal_command = C_NCR_FAC_REQ;
+                       rc_plci->appl = appl;
+                       add_p(rc_plci, CAI, "\x01\x80");
+                       add_p(rc_plci, UID, "\x06\x43\x61\x70\x69\x32\x30");
+                       sig_req(rc_plci, ASSIGN, DSIG_ID);
+                       send_req(rc_plci);
+               }
+               else
+               {
+                       Info = _OUT_OF_PLCI;
+               }
+
+               if (!Info)
+               {
+                       add_s(rc_plci, CPN, &msg[0]);
+                       add_ai(rc_plci, &msg[1]);
+                       sig_req(rc_plci, NCR_FACILITY, 0);
+                       send_req(rc_plci);
+                       return false;
+                       /* for application controlled supplementary services    */
+               }
+       }
+
+       if (!rc_plci)
+       {
+               Info = _WRONG_MESSAGE_FORMAT;
+       }
+
+       if (!Info)
+       {
+               send_req(rc_plci);
+       }
+       else
+       {  /* appl is not assigned to a PLCI or error condition */
+               dbug(1, dprintf("localInfoCon"));
+               sendf(appl,
+                     _INFO_R | CONFIRM,
+                     Id,
+                     Number,
+                     "w", Info);
+       }
+       return false;
 }
 
 static byte info_res(dword Id, word Number, DIVA_CAPI_ADAPTER *a,
                     PLCI *plci, APPL *appl, API_PARSE *msg)
 {
-  dbug(1,dprintf("info_res"));
-  return false;
+       dbug(1, dprintf("info_res"));
+       return false;
 }
 
 static byte alert_req(dword Id, word Number, DIVA_CAPI_ADAPTER *a,
                      PLCI *plci, APPL *appl, API_PARSE *msg)
 {
-  word Info;
-  byte ret;
-
-  dbug(1,dprintf("alert_req"));
-
-  Info = _WRONG_IDENTIFIER;
-  ret = false;
-  if(plci) {
-    Info = _ALERT_IGNORED;
-    if(plci->State!=INC_CON_ALERT) {
-      Info = _WRONG_STATE;
-      if(plci->State==INC_CON_PENDING) {
-        Info = 0;
-        plci->State=INC_CON_ALERT;
-        add_ai(plci, &msg[0]);
-        sig_req(plci,CALL_ALERT,0);
-        ret = 1;
-      }
-    }
-  }
-  sendf(appl,
-        _ALERT_R|CONFIRM,
-        Id,
-        Number,
-        "w",Info);
-  return ret;
+       word Info;
+       byte ret;
+
+       dbug(1, dprintf("alert_req"));
+
+       Info = _WRONG_IDENTIFIER;
+       ret = false;
+       if (plci) {
+               Info = _ALERT_IGNORED;
+               if (plci->State != INC_CON_ALERT) {
+                       Info = _WRONG_STATE;
+                       if (plci->State == INC_CON_PENDING) {
+                               Info = 0;
+                               plci->State = INC_CON_ALERT;
+                               add_ai(plci, &msg[0]);
+                               sig_req(plci, CALL_ALERT, 0);
+                               ret = 1;
+                       }
+               }
+       }
+       sendf(appl,
+             _ALERT_R | CONFIRM,
+             Id,
+             Number,
+             "w", Info);
+       return ret;
 }
 
 static byte facility_req(dword Id, word Number, DIVA_CAPI_ADAPTER *a,
                         PLCI *plci, APPL *appl, API_PARSE *msg)
 {
-  word Info = 0;
-  word i    = 0;
-
-  word selector;
-  word SSreq;
-  long relatedPLCIvalue;
-  DIVA_CAPI_ADAPTER   * relatedadapter;
-  byte * SSparms  = "";
-    byte RCparms[]  = "\x05\x00\x00\x02\x00\x00";
-    byte SSstruct[] = "\x09\x00\x00\x06\x00\x00\x00\x00\x00\x00";
-  API_PARSE * parms;
-    API_PARSE ss_parms[11];
-  PLCI   *rplci;
-    byte cai[15];
-  dword d;
-    API_PARSE dummy;
-
-  dbug(1,dprintf("facility_req"));
-  for(i=0;i<9;i++) ss_parms[i].length = 0;
-
-  parms = &msg[1];
-
-  if(!a)
-  {
-    dbug(1,dprintf("wrong Ctrl"));
-    Info = _WRONG_IDENTIFIER;
-  }
-
-  selector = GET_WORD(msg[0].info);
-
-  if(!Info)
-  {
-    switch(selector)
-    {
-      case SELECTOR_HANDSET:
-        Info = AdvCodecSupport(a, plci, appl, HOOK_SUPPORT);
-        break;
-
-      case SELECTOR_SU_SERV:
-        if(!msg[1].length)
-        {
-          Info = _WRONG_MESSAGE_FORMAT;
-          break;
-        }
-        SSreq = GET_WORD(&(msg[1].info[1]));
-        PUT_WORD(&RCparms[1],SSreq);
-        SSparms = RCparms;
-        switch(SSreq)
-        {
-          case S_GET_SUPPORTED_SERVICES:
-            if((i=get_plci(a)))
-            {
-              rplci = &a->plci[i-1];
-              rplci->appl = appl;
-              add_p(rplci,CAI,"\x01\x80");
-              add_p(rplci,UID,"\x06\x43\x61\x70\x69\x32\x30");
-              sig_req(rplci,ASSIGN,DSIG_ID);
-              send_req(rplci);
-            }
-            else
-            {
-              PUT_DWORD(&SSstruct[6], MASK_TERMINAL_PORTABILITY);
-              SSparms = (byte *)SSstruct;
-              break;
-            }
-            rplci->internal_command = GETSERV_REQ_PEND;
-            rplci->number = Number;
-            rplci->appl = appl;
-            sig_req(rplci,S_SUPPORTED,0);
-            send_req(rplci);
-            return false;
-            break;
-
-          case S_LISTEN:
-            if(parms->length==7)
-            {
-              if(api_parse(&parms->info[1],(word)parms->length,"wbd",ss_parms))
-              {
-                dbug(1,dprintf("format wrong"));
-                Info = _WRONG_MESSAGE_FORMAT;
-                break;
-              }
-            }
-            else
-            {
-              Info = _WRONG_MESSAGE_FORMAT;
-              break;
-            }
-            a->Notification_Mask[appl->Id-1] = GET_DWORD(ss_parms[2].info);
-            if(a->Notification_Mask[appl->Id-1] & SMASK_MWI) /* MWI active? */
-            {
-              if((i=get_plci(a)))
-              {
-                rplci = &a->plci[i-1];
-                rplci->appl = appl;
-                add_p(rplci,CAI,"\x01\x80");
-                add_p(rplci,UID,"\x06\x43\x61\x70\x69\x32\x30");
-                sig_req(rplci,ASSIGN,DSIG_ID);
-                send_req(rplci);
-              }
-              else
-              {
-                break;
-              }
-              rplci->internal_command = GET_MWI_STATE;
-              rplci->number = Number;
-              sig_req(rplci,MWI_POLL,0);
-              send_req(rplci);
-            }
-            break;
-
-          case S_HOLD:
-            api_parse(&parms->info[1],(word)parms->length,"ws",ss_parms);
-            if(plci && plci->State && plci->SuppState==IDLE)
-            {
-              plci->SuppState = HOLD_REQUEST;
-              plci->command = C_HOLD_REQ;
-              add_s(plci,CAI,&ss_parms[1]);
-              sig_req(plci,CALL_HOLD,0);
-              send_req(plci);
-              return false;
-            }
-            else Info = 0x3010;                    /* wrong state           */
-            break;
-          case S_RETRIEVE:
-            if(plci && plci->State && plci->SuppState==CALL_HELD)
-            {
-              if(Id & EXT_CONTROLLER)
-              {
-                if(AdvCodecSupport(a, plci, appl, 0))
-                {
-                  Info = 0x3010;                    /* wrong state           */
-                  break;
-                }
-              }
-              else plci->tel = 0;
-
-              plci->SuppState = RETRIEVE_REQUEST;
-              plci->command = C_RETRIEVE_REQ;
-              if(plci->spoofed_msg==SPOOFING_REQUIRED)
-              {
-                plci->spoofed_msg = CALL_RETRIEVE;
-                plci->internal_command = BLOCK_PLCI;
-                plci->command = 0;
-                dbug(1,dprintf("Spoof"));
-                return false;
-              }
-              else
-              {
-                sig_req(plci,CALL_RETRIEVE,0);
-                send_req(plci);
-                return false;
-              }
-            }
-            else Info = 0x3010;                    /* wrong state           */
-            break;
-          case S_SUSPEND:
-            if(parms->length)
-            {
-              if(api_parse(&parms->info[1],(word)parms->length,"wbs",ss_parms))
-              {
-                dbug(1,dprintf("format wrong"));
-                Info = _WRONG_MESSAGE_FORMAT;
-                break;
-              }
-            }
-            if(plci && plci->State)
-            {
-              add_s(plci,CAI,&ss_parms[2]);
-              plci->command = SUSPEND_REQ;
-              sig_req(plci,SUSPEND,0);
-              plci->State = SUSPENDING;
-              send_req(plci);
-            }
-            else Info = 0x3010;                    /* wrong state           */
-            break;
-
-          case S_RESUME:
-            if(!(i=get_plci(a)) )
-            {
-              Info = _OUT_OF_PLCI;
-              break;
-            }
-            rplci = &a->plci[i-1];
-            rplci->appl = appl;
-            rplci->number = Number;
-            rplci->tel = 0;
-            rplci->call_dir = CALL_DIR_OUT | CALL_DIR_ORIGINATE;
-            /* check 'external controller' bit for codec support */
-            if(Id & EXT_CONTROLLER)
-            {
-              if(AdvCodecSupport(a, rplci, appl, 0) )
-              {
-                rplci->Id = 0;
-                Info = 0x300A;
-                break;
-              }
-            }
-            if(parms->length)
-            {
-              if(api_parse(&parms->info[1],(word)parms->length,"wbs",ss_parms))
-              {
-                dbug(1,dprintf("format wrong"));
-                rplci->Id = 0;
-                Info = _WRONG_MESSAGE_FORMAT;
-                break;
-              }
-            }
-            dummy.length = 0;
-            dummy.info = "\x00";
-            add_b1(rplci, &dummy, 0, 0);
-            if (a->Info_Mask[appl->Id-1] & 0x200)
-            {
-              /* early B3 connect (CIP mask bit 9) no release after a disc */
-              add_p(rplci,LLI,"\x01\x01");
-            }
-            add_p(rplci,UID,"\x06\x43\x61\x70\x69\x32\x30");
-            sig_req(rplci,ASSIGN,DSIG_ID);
-            send_req(rplci);
-            add_s(rplci,CAI,&ss_parms[2]);
-            rplci->command = RESUME_REQ;
-            sig_req(rplci,RESUME,0);
-            rplci->State = RESUMING;
-            send_req(rplci);
-            break;
-
-          case S_CONF_BEGIN: /* Request */
-          case S_CONF_DROP:
-          case S_CONF_ISOLATE:
-          case S_CONF_REATTACH:
-            if(api_parse(&parms->info[1],(word)parms->length,"wbd",ss_parms))
-            {
-              dbug(1,dprintf("format wrong"));
-              Info = _WRONG_MESSAGE_FORMAT;
-              break;
-            }
-            if(plci && plci->State && ((plci->SuppState==IDLE)||(plci->SuppState==CALL_HELD)))
-            {
-              d = GET_DWORD(ss_parms[2].info);     
-              if(d>=0x80)
-              {
-                dbug(1,dprintf("format wrong"));
-                Info = _WRONG_MESSAGE_FORMAT;
-                break;
-              }
-              plci->ptyState = (byte)SSreq;
-              plci->command = 0;
-              cai[0] = 2;
-              switch(SSreq)
-              {
-              case S_CONF_BEGIN:
-                  cai[1] = CONF_BEGIN;
-                  plci->internal_command = CONF_BEGIN_REQ_PEND;
-                  break;
-              case S_CONF_DROP:
-                  cai[1] = CONF_DROP;
-                  plci->internal_command = CONF_DROP_REQ_PEND;
-                  break;
-              case S_CONF_ISOLATE:
-                  cai[1] = CONF_ISOLATE;
-                  plci->internal_command = CONF_ISOLATE_REQ_PEND;
-                  break;
-              case S_CONF_REATTACH:
-                  cai[1] = CONF_REATTACH;
-                  plci->internal_command = CONF_REATTACH_REQ_PEND;
-                  break;
-              }
-              cai[2] = (byte)d; /* Conference Size resp. PartyId */
-              add_p(plci,CAI,cai);
-              sig_req(plci,S_SERVICE,0);
-              send_req(plci);
-              return false;
-            }
-            else Info = 0x3010;                    /* wrong state           */
-            break;
-
-          case S_ECT:
-          case S_3PTY_BEGIN:
-          case S_3PTY_END:
-          case S_CONF_ADD:
-            if(parms->length==7)
-            {
-              if(api_parse(&parms->info[1],(word)parms->length,"wbd",ss_parms))
-              {
-                dbug(1,dprintf("format wrong"));
-                Info = _WRONG_MESSAGE_FORMAT;
-                break;
-              }
-            }
-            else if(parms->length==8) /* workaround for the T-View-S */
-            {
-              if(api_parse(&parms->info[1],(word)parms->length,"wbdb",ss_parms))
-              {
-                dbug(1,dprintf("format wrong"));
-                Info = _WRONG_MESSAGE_FORMAT;
-                break;
-              }
-            }
-            else
-            {
-              Info = _WRONG_MESSAGE_FORMAT;
-              break;
-            }
-            if(!msg[1].length)
-            {
-              Info = _WRONG_MESSAGE_FORMAT;
-              break;
-            }
-            if (!plci)
-            {
-              Info = _WRONG_IDENTIFIER;
-              break;
-            }
-            relatedPLCIvalue = GET_DWORD(ss_parms[2].info);
-            relatedPLCIvalue &= 0x0000FFFF;
-            dbug(1,dprintf("PTY/ECT/addCONF,relPLCI=%lx",relatedPLCIvalue));
-            /* controller starts with 0 up to (max_adapter - 1) */
-            if (((relatedPLCIvalue & 0x7f) == 0)
-             || (MapController ((byte)(relatedPLCIvalue & 0x7f)) == 0)
-             || (MapController ((byte)(relatedPLCIvalue & 0x7f)) > max_adapter))
-            {
-              if(SSreq==S_3PTY_END)
-              {
-                dbug(1, dprintf("wrong Controller use 2nd PLCI=PLCI"));
-                rplci = plci;
-              }
-              else
-              {
-                Info = 0x3010;                    /* wrong state           */
-                break;
-              }
-            }
-            else
-            {  
-              relatedadapter = &adapter[MapController ((byte)(relatedPLCIvalue & 0x7f))-1];
-              relatedPLCIvalue >>=8;
-              /* find PLCI PTR*/
-              for(i=0,rplci=NULL;i<relatedadapter->max_plci;i++)
-              {
-                if(relatedadapter->plci[i].Id == (byte)relatedPLCIvalue)
-                {
-                  rplci = &relatedadapter->plci[i];
-                }
-              }
-              if(!rplci || !relatedPLCIvalue)
-              {
-                if(SSreq==S_3PTY_END)
-                {
-                  dbug(1, dprintf("use 2nd PLCI=PLCI"));
-                  rplci = plci;
-                }
-                else
-                {
-                  Info = 0x3010;                    /* wrong state           */
-                  break;
-                }
-              }
-            }
+       word Info = 0;
+       word i    = 0;
+
+       word selector;
+       word SSreq;
+       long relatedPLCIvalue;
+       DIVA_CAPI_ADAPTER *relatedadapter;
+       byte *SSparms  = "";
+       byte RCparms[]  = "\x05\x00\x00\x02\x00\x00";
+       byte SSstruct[] = "\x09\x00\x00\x06\x00\x00\x00\x00\x00\x00";
+       API_PARSE *parms;
+       API_PARSE ss_parms[11];
+       PLCI *rplci;
+       byte cai[15];
+       dword d;
+       API_PARSE dummy;
+
+       dbug(1, dprintf("facility_req"));
+       for (i = 0; i < 9; i++) ss_parms[i].length = 0;
+
+       parms = &msg[1];
+
+       if (!a)
+       {
+               dbug(1, dprintf("wrong Ctrl"));
+               Info = _WRONG_IDENTIFIER;
+       }
+
+       selector = GET_WORD(msg[0].info);
+
+       if (!Info)
+       {
+               switch (selector)
+               {
+               case SELECTOR_HANDSET:
+                       Info = AdvCodecSupport(a, plci, appl, HOOK_SUPPORT);
+                       break;
+
+               case SELECTOR_SU_SERV:
+                       if (!msg[1].length)
+                       {
+                               Info = _WRONG_MESSAGE_FORMAT;
+                               break;
+                       }
+                       SSreq = GET_WORD(&(msg[1].info[1]));
+                       PUT_WORD(&RCparms[1], SSreq);
+                       SSparms = RCparms;
+                       switch (SSreq)
+                       {
+                       case S_GET_SUPPORTED_SERVICES:
+                               if ((i = get_plci(a)))
+                               {
+                                       rplci = &a->plci[i - 1];
+                                       rplci->appl = appl;
+                                       add_p(rplci, CAI, "\x01\x80");
+                                       add_p(rplci, UID, "\x06\x43\x61\x70\x69\x32\x30");
+                                       sig_req(rplci, ASSIGN, DSIG_ID);
+                                       send_req(rplci);
+                               }
+                               else
+                               {
+                                       PUT_DWORD(&SSstruct[6], MASK_TERMINAL_PORTABILITY);
+                                       SSparms = (byte *)SSstruct;
+                                       break;
+                               }
+                               rplci->internal_command = GETSERV_REQ_PEND;
+                               rplci->number = Number;
+                               rplci->appl = appl;
+                               sig_req(rplci, S_SUPPORTED, 0);
+                               send_req(rplci);
+                               return false;
+                               break;
+
+                       case S_LISTEN:
+                               if (parms->length == 7)
+                               {
+                                       if (api_parse(&parms->info[1], (word)parms->length, "wbd", ss_parms))
+                                       {
+                                               dbug(1, dprintf("format wrong"));
+                                               Info = _WRONG_MESSAGE_FORMAT;
+                                               break;
+                                       }
+                               }
+                               else
+                               {
+                                       Info = _WRONG_MESSAGE_FORMAT;
+                                       break;
+                               }
+                               a->Notification_Mask[appl->Id - 1] = GET_DWORD(ss_parms[2].info);
+                               if (a->Notification_Mask[appl->Id - 1] & SMASK_MWI) /* MWI active? */
+                               {
+                                       if ((i = get_plci(a)))
+                                       {
+                                               rplci = &a->plci[i - 1];
+                                               rplci->appl = appl;
+                                               add_p(rplci, CAI, "\x01\x80");
+                                               add_p(rplci, UID, "\x06\x43\x61\x70\x69\x32\x30");
+                                               sig_req(rplci, ASSIGN, DSIG_ID);
+                                               send_req(rplci);
+                                       }
+                                       else
+                                       {
+                                               break;
+                                       }
+                                       rplci->internal_command = GET_MWI_STATE;
+                                       rplci->number = Number;
+                                       sig_req(rplci, MWI_POLL, 0);
+                                       send_req(rplci);
+                               }
+                               break;
+
+                       case S_HOLD:
+                               api_parse(&parms->info[1], (word)parms->length, "ws", ss_parms);
+                               if (plci && plci->State && plci->SuppState == IDLE)
+                               {
+                                       plci->SuppState = HOLD_REQUEST;
+                                       plci->command = C_HOLD_REQ;
+                                       add_s(plci, CAI, &ss_parms[1]);
+                                       sig_req(plci, CALL_HOLD, 0);
+                                       send_req(plci);
+                                       return false;
+                               }
+                               else Info = 0x3010;                    /* wrong state           */
+                               break;
+                       case S_RETRIEVE:
+                               if (plci && plci->State && plci->SuppState == CALL_HELD)
+                               {
+                                       if (Id & EXT_CONTROLLER)
+                                       {
+                                               if (AdvCodecSupport(a, plci, appl, 0))
+                                               {
+                                                       Info = 0x3010;                    /* wrong state           */
+                                                       break;
+                                               }
+                                       }
+                                       else plci->tel = 0;
+
+                                       plci->SuppState = RETRIEVE_REQUEST;
+                                       plci->command = C_RETRIEVE_REQ;
+                                       if (plci->spoofed_msg == SPOOFING_REQUIRED)
+                                       {
+                                               plci->spoofed_msg = CALL_RETRIEVE;
+                                               plci->internal_command = BLOCK_PLCI;
+                                               plci->command = 0;
+                                               dbug(1, dprintf("Spoof"));
+                                               return false;
+                                       }
+                                       else
+                                       {
+                                               sig_req(plci, CALL_RETRIEVE, 0);
+                                               send_req(plci);
+                                               return false;
+                                       }
+                               }
+                               else Info = 0x3010;                    /* wrong state           */
+                               break;
+                       case S_SUSPEND:
+                               if (parms->length)
+                               {
+                                       if (api_parse(&parms->info[1], (word)parms->length, "wbs", ss_parms))
+                                       {
+                                               dbug(1, dprintf("format wrong"));
+                                               Info = _WRONG_MESSAGE_FORMAT;
+                                               break;
+                                       }
+                               }
+                               if (plci && plci->State)
+                               {
+                                       add_s(plci, CAI, &ss_parms[2]);
+                                       plci->command = SUSPEND_REQ;
+                                       sig_req(plci, SUSPEND, 0);
+                                       plci->State = SUSPENDING;
+                                       send_req(plci);
+                               }
+                               else Info = 0x3010;                    /* wrong state           */
+                               break;
+
+                       case S_RESUME:
+                               if (!(i = get_plci(a)))
+                               {
+                                       Info = _OUT_OF_PLCI;
+                                       break;
+                               }
+                               rplci = &a->plci[i - 1];
+                               rplci->appl = appl;
+                               rplci->number = Number;
+                               rplci->tel = 0;
+                               rplci->call_dir = CALL_DIR_OUT | CALL_DIR_ORIGINATE;
+                               /* check 'external controller' bit for codec support */
+                               if (Id & EXT_CONTROLLER)
+                               {
+                                       if (AdvCodecSupport(a, rplci, appl, 0))
+                                       {
+                                               rplci->Id = 0;
+                                               Info = 0x300A;
+                                               break;
+                                       }
+                               }
+                               if (parms->length)
+                               {
+                                       if (api_parse(&parms->info[1], (word)parms->length, "wbs", ss_parms))
+                                       {
+                                               dbug(1, dprintf("format wrong"));
+                                               rplci->Id = 0;
+                                               Info = _WRONG_MESSAGE_FORMAT;
+                                               break;
+                                       }
+                               }
+                               dummy.length = 0;
+                               dummy.info = "\x00";
+                               add_b1(rplci, &dummy, 0, 0);
+                               if (a->Info_Mask[appl->Id - 1] & 0x200)
+                               {
+                                       /* early B3 connect (CIP mask bit 9) no release after a disc */
+                                       add_p(rplci, LLI, "\x01\x01");
+                               }
+                               add_p(rplci, UID, "\x06\x43\x61\x70\x69\x32\x30");
+                               sig_req(rplci, ASSIGN, DSIG_ID);
+                               send_req(rplci);
+                               add_s(rplci, CAI, &ss_parms[2]);
+                               rplci->command = RESUME_REQ;
+                               sig_req(rplci, RESUME, 0);
+                               rplci->State = RESUMING;
+                               send_req(rplci);
+                               break;
+
+                       case S_CONF_BEGIN: /* Request */
+                       case S_CONF_DROP:
+                       case S_CONF_ISOLATE:
+                       case S_CONF_REATTACH:
+                               if (api_parse(&parms->info[1], (word)parms->length, "wbd", ss_parms))
+                               {
+                                       dbug(1, dprintf("format wrong"));
+                                       Info = _WRONG_MESSAGE_FORMAT;
+                                       break;
+                               }
+                               if (plci && plci->State && ((plci->SuppState == IDLE) || (plci->SuppState == CALL_HELD)))
+                               {
+                                       d = GET_DWORD(ss_parms[2].info);
+                                       if (d >= 0x80)
+                                       {
+                                               dbug(1, dprintf("format wrong"));
+                                               Info = _WRONG_MESSAGE_FORMAT;
+                                               break;
+                                       }
+                                       plci->ptyState = (byte)SSreq;
+                                       plci->command = 0;
+                                       cai[0] = 2;
+                                       switch (SSreq)
+                                       {
+                                       case S_CONF_BEGIN:
+                                               cai[1] = CONF_BEGIN;
+                                               plci->internal_command = CONF_BEGIN_REQ_PEND;
+                                               break;
+                                       case S_CONF_DROP:
+                                               cai[1] = CONF_DROP;
+                                               plci->internal_command = CONF_DROP_REQ_PEND;
+                                               break;
+                                       case S_CONF_ISOLATE:
+                                               cai[1] = CONF_ISOLATE;
+                                               plci->internal_command = CONF_ISOLATE_REQ_PEND;
+                                               break;
+                                       case S_CONF_REATTACH:
+                                               cai[1] = CONF_REATTACH;
+                                               plci->internal_command = CONF_REATTACH_REQ_PEND;
+                                               break;
+                                       }
+                                       cai[2] = (byte)d; /* Conference Size resp. PartyId */
+                                       add_p(plci, CAI, cai);
+                                       sig_req(plci, S_SERVICE, 0);
+                                       send_req(plci);
+                                       return false;
+                               }
+                               else Info = 0x3010;                    /* wrong state           */
+                               break;
+
+                       case S_ECT:
+                       case S_3PTY_BEGIN:
+                       case S_3PTY_END:
+                       case S_CONF_ADD:
+                               if (parms->length == 7)
+                               {
+                                       if (api_parse(&parms->info[1], (word)parms->length, "wbd", ss_parms))
+                                       {
+                                               dbug(1, dprintf("format wrong"));
+                                               Info = _WRONG_MESSAGE_FORMAT;
+                                               break;
+                                       }
+                               }
+                               else if (parms->length == 8) /* workaround for the T-View-S */
+                               {
+                                       if (api_parse(&parms->info[1], (word)parms->length, "wbdb", ss_parms))
+                                       {
+                                               dbug(1, dprintf("format wrong"));
+                                               Info = _WRONG_MESSAGE_FORMAT;
+                                               break;
+                                       }
+                               }
+                               else
+                               {
+                                       Info = _WRONG_MESSAGE_FORMAT;
+                                       break;
+                               }
+                               if (!msg[1].length)
+                               {
+                                       Info = _WRONG_MESSAGE_FORMAT;
+                                       break;
+                               }
+                               if (!plci)
+                               {
+                                       Info = _WRONG_IDENTIFIER;
+                                       break;
+                               }
+                               relatedPLCIvalue = GET_DWORD(ss_parms[2].info);
+                               relatedPLCIvalue &= 0x0000FFFF;
+                               dbug(1, dprintf("PTY/ECT/addCONF,relPLCI=%lx", relatedPLCIvalue));
+                               /* controller starts with 0 up to (max_adapter - 1) */
+                               if (((relatedPLCIvalue & 0x7f) == 0)
+                                   || (MapController((byte)(relatedPLCIvalue & 0x7f)) == 0)
+                                   || (MapController((byte)(relatedPLCIvalue & 0x7f)) > max_adapter))
+                               {
+                                       if (SSreq == S_3PTY_END)
+                                       {
+                                               dbug(1, dprintf("wrong Controller use 2nd PLCI=PLCI"));
+                                               rplci = plci;
+                                       }
+                                       else
+                                       {
+                                               Info = 0x3010;                    /* wrong state           */
+                                               break;
+                                       }
+                               }
+                               else
+                               {
+                                       relatedadapter = &adapter[MapController((byte)(relatedPLCIvalue & 0x7f)) - 1];
+                                       relatedPLCIvalue >>= 8;
+                                       /* find PLCI PTR*/
+                                       for (i = 0, rplci = NULL; i < relatedadapter->max_plci; i++)
+                                       {
+                                               if (relatedadapter->plci[i].Id == (byte)relatedPLCIvalue)
+                                               {
+                                                       rplci = &relatedadapter->plci[i];
+                                               }
+                                       }
+                                       if (!rplci || !relatedPLCIvalue)
+                                       {
+                                               if (SSreq == S_3PTY_END)
+                                               {
+                                                       dbug(1, dprintf("use 2nd PLCI=PLCI"));
+                                                       rplci = plci;
+                                               }
+                                               else
+                                               {
+                                                       Info = 0x3010;                    /* wrong state           */
+                                                       break;
+                                               }
+                                       }
+                               }
 /*
-            dbug(1,dprintf("rplci:%x",rplci));
-            dbug(1,dprintf("plci:%x",plci));
-            dbug(1,dprintf("rplci->ptyState:%x",rplci->ptyState));
-            dbug(1,dprintf("plci->ptyState:%x",plci->ptyState));
-            dbug(1,dprintf("SSreq:%x",SSreq));
-            dbug(1,dprintf("rplci->internal_command:%x",rplci->internal_command));
-            dbug(1,dprintf("rplci->appl:%x",rplci->appl));
-            dbug(1,dprintf("rplci->Id:%x",rplci->Id));
+  dbug(1, dprintf("rplci:%x", rplci));
+  dbug(1, dprintf("plci:%x", plci));
+  dbug(1, dprintf("rplci->ptyState:%x", rplci->ptyState));
+  dbug(1, dprintf("plci->ptyState:%x", plci->ptyState));
+  dbug(1, dprintf("SSreq:%x", SSreq));
+  dbug(1, dprintf("rplci->internal_command:%x", rplci->internal_command));
+  dbug(1, dprintf("rplci->appl:%x", rplci->appl));
+  dbug(1, dprintf("rplci->Id:%x", rplci->Id));
 */
-            /* send PTY/ECT req, cannot check all states because of US stuff */
-            if( !rplci->internal_command && rplci->appl )
-            {
-              plci->command = 0;
-              rplci->relatedPTYPLCI = plci;
-              plci->relatedPTYPLCI = rplci;
-              rplci->ptyState = (byte)SSreq;
-              if(SSreq==S_ECT)
-              {
-                rplci->internal_command = ECT_REQ_PEND;
-                cai[1] = ECT_EXECUTE;
-
-                rplci->vswitchstate=0;
-                rplci->vsprot=0;
-                rplci->vsprotdialect=0;
-                plci->vswitchstate=0;
-                plci->vsprot=0;
-                plci->vsprotdialect=0;
-
-              }
-              else if(SSreq==S_CONF_ADD)
-              {
-                rplci->internal_command = CONF_ADD_REQ_PEND;
-                cai[1] = CONF_ADD;
-              }
-              else
-              {
-                rplci->internal_command = PTY_REQ_PEND;
-                cai[1] = (byte)(SSreq-3);
-              }
-              rplci->number = Number;
-              if(plci!=rplci) /* explicit invocation */
-              {
-                cai[0] = 2;
-                cai[2] = plci->Sig.Id;
-                dbug(1,dprintf("explicit invocation"));
-              }
-              else
-              {
-                dbug(1,dprintf("implicit invocation"));
-                cai[0] = 1;
-              }
-              add_p(rplci,CAI,cai);
-              sig_req(rplci,S_SERVICE,0);
-              send_req(rplci);
-              return false;
-            }
-            else
-            {
-              dbug(0,dprintf("Wrong line"));
-              Info = 0x3010;                    /* wrong state           */
-              break;
-            }
-            break;
-
-          case S_CALL_DEFLECTION:
-            if(api_parse(&parms->info[1],(word)parms->length,"wbwss",ss_parms))
-            {
-              dbug(1,dprintf("format wrong"));
-              Info = _WRONG_MESSAGE_FORMAT;
-              break;
-            }
-            if (!plci)
-            {
-              Info = _WRONG_IDENTIFIER;
-              break;
-            }
-            /* reuse unused screening indicator */
-            ss_parms[3].info[3] = (byte)GET_WORD(&(ss_parms[2].info[0]));
-            plci->command = 0;
-            plci->internal_command = CD_REQ_PEND;
-            appl->CDEnable = true;
-            cai[0] = 1;
-            cai[1] = CALL_DEFLECTION;
-            add_p(plci,CAI,cai);
-            add_p(plci,CPN,ss_parms[3].info);
-            sig_req(plci,S_SERVICE,0);
-            send_req(plci);
-            return false;
-            break;
-
-          case S_CALL_FORWARDING_START:
-            if(api_parse(&parms->info[1],(word)parms->length,"wbdwwsss",ss_parms))
-            {
-              dbug(1,dprintf("format wrong"));
-              Info = _WRONG_MESSAGE_FORMAT;
-              break;
-            }
-
-            if((i=get_plci(a)))
-            {
-              rplci = &a->plci[i-1];
-              rplci->appl = appl;
-              add_p(rplci,CAI,"\x01\x80");
-              add_p(rplci,UID,"\x06\x43\x61\x70\x69\x32\x30");
-              sig_req(rplci,ASSIGN,DSIG_ID);
-              send_req(rplci);
-            }
-            else
-            {
-              Info = _OUT_OF_PLCI;
-              break;
-            }
-
-            /* reuse unused screening indicator */
-            rplci->internal_command = CF_START_PEND;
-            rplci->appl = appl;
-            rplci->number = Number;
-            appl->S_Handle = GET_DWORD(&(ss_parms[2].info[0]));
-            cai[0] = 2;
-            cai[1] = 0x70|(byte)GET_WORD(&(ss_parms[3].info[0])); /* Function */
-            cai[2] = (byte)GET_WORD(&(ss_parms[4].info[0])); /* Basic Service */
-            add_p(rplci,CAI,cai);
-            add_p(rplci,OAD,ss_parms[5].info);
-            add_p(rplci,CPN,ss_parms[6].info);
-            sig_req(rplci,S_SERVICE,0);
-            send_req(rplci);
-            return false;
-            break;
-
-          case S_INTERROGATE_DIVERSION:
-          case S_INTERROGATE_NUMBERS:
-          case S_CALL_FORWARDING_STOP:
-          case S_CCBS_REQUEST:
-          case S_CCBS_DEACTIVATE:
-          case S_CCBS_INTERROGATE:
-            switch(SSreq)
-            {
-            case S_INTERROGATE_NUMBERS:
-                if(api_parse(&parms->info[1],(word)parms->length,"wbd",ss_parms))
-                {
-                  dbug(0,dprintf("format wrong"));
-                  Info = _WRONG_MESSAGE_FORMAT;
-                }
-                break;
-            case S_CCBS_REQUEST:
-            case S_CCBS_DEACTIVATE:
-                if(api_parse(&parms->info[1],(word)parms->length,"wbdw",ss_parms))
-                {
-                  dbug(0,dprintf("format wrong"));
-                  Info = _WRONG_MESSAGE_FORMAT;
-                }
-                break;
-            case S_CCBS_INTERROGATE:
-                if(api_parse(&parms->info[1],(word)parms->length,"wbdws",ss_parms))
-                {
-                  dbug(0,dprintf("format wrong"));
-                  Info = _WRONG_MESSAGE_FORMAT;
-                }
-                break;
-            default:
-            if(api_parse(&parms->info[1],(word)parms->length,"wbdwws",ss_parms))
-            {
-              dbug(0,dprintf("format wrong"));
-              Info = _WRONG_MESSAGE_FORMAT;
-              break;
-            }
-                break;
-            }
-
-            if(Info) break;
-            if((i=get_plci(a)))
-            {
-              rplci = &a->plci[i-1];
-              switch(SSreq)
-              {
-                case S_INTERROGATE_DIVERSION: /* use cai with S_SERVICE below */
-                  cai[1] = 0x60|(byte)GET_WORD(&(ss_parms[3].info[0])); /* Function */
-                  rplci->internal_command = INTERR_DIVERSION_REQ_PEND; /* move to rplci if assigned */
-                  break;
-                case S_INTERROGATE_NUMBERS: /* use cai with S_SERVICE below */
-                  cai[1] = DIVERSION_INTERROGATE_NUM; /* Function */
-                  rplci->internal_command = INTERR_NUMBERS_REQ_PEND; /* move to rplci if assigned */
-                  break;
-                case S_CALL_FORWARDING_STOP:
-                  rplci->internal_command = CF_STOP_PEND;
-                  cai[1] = 0x80|(byte)GET_WORD(&(ss_parms[3].info[0])); /* Function */
-                  break;
-                case S_CCBS_REQUEST:
-                  cai[1] = CCBS_REQUEST;
-                  rplci->internal_command = CCBS_REQUEST_REQ_PEND;
-                  break;
-                case S_CCBS_DEACTIVATE:
-                  cai[1] = CCBS_DEACTIVATE;
-                  rplci->internal_command = CCBS_DEACTIVATE_REQ_PEND;
-                  break;
-                case S_CCBS_INTERROGATE:
-                  cai[1] = CCBS_INTERROGATE;
-                  rplci->internal_command = CCBS_INTERROGATE_REQ_PEND;
-                  break;
-                default:
-                  cai[1] = 0;
-                break;
-              }
-              rplci->appl = appl;
-              rplci->number = Number;
-              add_p(rplci,CAI,"\x01\x80");
-              add_p(rplci,UID,"\x06\x43\x61\x70\x69\x32\x30");
-              sig_req(rplci,ASSIGN,DSIG_ID);
-              send_req(rplci);
-            }
-            else
-            {
-              Info = _OUT_OF_PLCI;
-              break;
-            }
-
-            appl->S_Handle = GET_DWORD(&(ss_parms[2].info[0]));
-            switch(SSreq)
-            {
-            case S_INTERROGATE_NUMBERS:
-                cai[0] = 1;
-                add_p(rplci,CAI,cai);
-                break;
-            case S_CCBS_REQUEST:
-            case S_CCBS_DEACTIVATE:
-                cai[0] = 3;
-                PUT_WORD(&cai[2],GET_WORD(&(ss_parms[3].info[0])));
-                add_p(rplci,CAI,cai);
-                break;
-            case S_CCBS_INTERROGATE:
-                cai[0] = 3;
-                PUT_WORD(&cai[2],GET_WORD(&(ss_parms[3].info[0])));
-                add_p(rplci,CAI,cai);
-                add_p(rplci,OAD,ss_parms[4].info);
-                break;
-            default:
-            cai[0] = 2;
-            cai[2] = (byte)GET_WORD(&(ss_parms[4].info[0])); /* Basic Service */
-            add_p(rplci,CAI,cai);
-            add_p(rplci,OAD,ss_parms[5].info);
-                break;
-            }
-                        
-            sig_req(rplci,S_SERVICE,0);
-            send_req(rplci);
-            return false;
-            break;
-
-          case S_MWI_ACTIVATE:
-            if(api_parse(&parms->info[1],(word)parms->length,"wbwdwwwssss",ss_parms))
-            {
-              dbug(1,dprintf("format wrong"));
-              Info = _WRONG_MESSAGE_FORMAT;
-              break;
-            }
-            if(!plci)
-            {                               
-              if((i=get_plci(a)))
-              {
-                rplci = &a->plci[i-1];
-                rplci->appl = appl;
-                rplci->cr_enquiry=true;
-                add_p(rplci,CAI,"\x01\x80");
-                add_p(rplci,UID,"\x06\x43\x61\x70\x69\x32\x30");
-                sig_req(rplci,ASSIGN,DSIG_ID);
-                send_req(rplci);
-              }
-              else
-              {
-                Info = _OUT_OF_PLCI;
-                break;
-              }
-            }
-            else
-            {
-              rplci = plci;
-              rplci->cr_enquiry=false;
-            }
-
-            rplci->command = 0;
-            rplci->internal_command = MWI_ACTIVATE_REQ_PEND;
-            rplci->appl = appl;
-            rplci->number = Number;
-
-            cai[0] = 13;
-            cai[1] = ACTIVATION_MWI; /* Function */
-            PUT_WORD(&cai[2],GET_WORD(&(ss_parms[2].info[0]))); /* Basic Service */
-            PUT_DWORD(&cai[4],GET_DWORD(&(ss_parms[3].info[0]))); /* Number of Messages */
-            PUT_WORD(&cai[8],GET_WORD(&(ss_parms[4].info[0]))); /* Message Status */
-            PUT_WORD(&cai[10],GET_WORD(&(ss_parms[5].info[0]))); /* Message Reference */
-            PUT_WORD(&cai[12],GET_WORD(&(ss_parms[6].info[0]))); /* Invocation Mode */
-            add_p(rplci,CAI,cai);
-            add_p(rplci,CPN,ss_parms[7].info); /* Receiving User Number */
-            add_p(rplci,OAD,ss_parms[8].info); /* Controlling User Number */
-            add_p(rplci,OSA,ss_parms[9].info); /* Controlling User Provided Number */
-            add_p(rplci,UID,ss_parms[10].info); /* Time */
-            sig_req(rplci,S_SERVICE,0);
-            send_req(rplci);
-            return false;
-
-          case S_MWI_DEACTIVATE:
-            if(api_parse(&parms->info[1],(word)parms->length,"wbwwss",ss_parms))
-            {
-              dbug(1,dprintf("format wrong"));
-              Info = _WRONG_MESSAGE_FORMAT;
-              break;
-            }
-            if(!plci)
-            {                               
-              if((i=get_plci(a)))
-              {
-                rplci = &a->plci[i-1];
-                rplci->appl = appl;
-                rplci->cr_enquiry=true;
-                add_p(rplci,CAI,"\x01\x80");
-                add_p(rplci,UID,"\x06\x43\x61\x70\x69\x32\x30");
-                sig_req(rplci,ASSIGN,DSIG_ID);
-                send_req(rplci);
-              }
-              else
-              {
-                Info = _OUT_OF_PLCI;
-                break;
-              }
-            }
-            else
-            {
-              rplci = plci;
-              rplci->cr_enquiry=false;
-            }
-
-            rplci->command = 0;
-            rplci->internal_command = MWI_DEACTIVATE_REQ_PEND;
-            rplci->appl = appl;
-            rplci->number = Number;
-
-            cai[0] = 5;
-            cai[1] = DEACTIVATION_MWI; /* Function */
-            PUT_WORD(&cai[2],GET_WORD(&(ss_parms[2].info[0]))); /* Basic Service */
-            PUT_WORD(&cai[4],GET_WORD(&(ss_parms[3].info[0]))); /* Invocation Mode */
-            add_p(rplci,CAI,cai);
-            add_p(rplci,CPN,ss_parms[4].info); /* Receiving User Number */
-            add_p(rplci,OAD,ss_parms[5].info); /* Controlling User Number */
-            sig_req(rplci,S_SERVICE,0);
-            send_req(rplci);
-            return false;
-
-          default:
-            Info = 0x300E;  /* not supported */
-            break;
-        }
-        break; /* case SELECTOR_SU_SERV: end */
-
-
-      case SELECTOR_DTMF:
-        return (dtmf_request (Id, Number, a, plci, appl, msg));
-
-
-
-      case SELECTOR_LINE_INTERCONNECT:
-        return (mixer_request (Id, Number, a, plci, appl, msg));
-
-
-
-      case PRIV_SELECTOR_ECHO_CANCELLER:
-        appl->appl_flags |= APPL_FLAG_PRIV_EC_SPEC;
-        return (ec_request (Id, Number, a, plci, appl, msg));
-
-      case SELECTOR_ECHO_CANCELLER:
-        appl->appl_flags &= ~APPL_FLAG_PRIV_EC_SPEC;
-        return (ec_request (Id, Number, a, plci, appl, msg));
-
-
-      case SELECTOR_V42BIS:
-      default:
-        Info = _FACILITY_NOT_SUPPORTED;
-        break;
-    } /* end of switch(selector) */
-  }
-
-  dbug(1,dprintf("SendFacRc"));
-  sendf(appl,
-        _FACILITY_R|CONFIRM,
-        Id,
-        Number,
-        "wws",Info,selector,SSparms);
-  return false;
+                               /* send PTY/ECT req, cannot check all states because of US stuff */
+                               if (!rplci->internal_command && rplci->appl)
+                               {
+                                       plci->command = 0;
+                                       rplci->relatedPTYPLCI = plci;
+                                       plci->relatedPTYPLCI = rplci;
+                                       rplci->ptyState = (byte)SSreq;
+                                       if (SSreq == S_ECT)
+                                       {
+                                               rplci->internal_command = ECT_REQ_PEND;
+                                               cai[1] = ECT_EXECUTE;
+
+                                               rplci->vswitchstate = 0;
+                                               rplci->vsprot = 0;
+                                               rplci->vsprotdialect = 0;
+                                               plci->vswitchstate = 0;
+                                               plci->vsprot = 0;
+                                               plci->vsprotdialect = 0;
+
+                                       }
+                                       else if (SSreq == S_CONF_ADD)
+                                       {
+                                               rplci->internal_command = CONF_ADD_REQ_PEND;
+                                               cai[1] = CONF_ADD;
+                                       }
+                                       else
+                                       {
+                                               rplci->internal_command = PTY_REQ_PEND;
+                                               cai[1] = (byte)(SSreq - 3);
+                                       }
+                                       rplci->number = Number;
+                                       if (plci != rplci) /* explicit invocation */
+                                       {
+                                               cai[0] = 2;
+                                               cai[2] = plci->Sig.Id;
+                                               dbug(1, dprintf("explicit invocation"));
+                                       }
+                                       else
+                                       {
+                                               dbug(1, dprintf("implicit invocation"));
+                                               cai[0] = 1;
+                                       }
+                                       add_p(rplci, CAI, cai);
+                                       sig_req(rplci, S_SERVICE, 0);
+                                       send_req(rplci);
+                                       return false;
+                               }
+                               else
+                               {
+                                       dbug(0, dprintf("Wrong line"));
+                                       Info = 0x3010;                    /* wrong state           */
+                                       break;
+                               }
+                               break;
+
+                       case S_CALL_DEFLECTION:
+                               if (api_parse(&parms->info[1], (word)parms->length, "wbwss", ss_parms))
+                               {
+                                       dbug(1, dprintf("format wrong"));
+                                       Info = _WRONG_MESSAGE_FORMAT;
+                                       break;
+                               }
+                               if (!plci)
+                               {
+                                       Info = _WRONG_IDENTIFIER;
+                                       break;
+                               }
+                               /* reuse unused screening indicator */
+                               ss_parms[3].info[3] = (byte)GET_WORD(&(ss_parms[2].info[0]));
+                               plci->command = 0;
+                               plci->internal_command = CD_REQ_PEND;
+                               appl->CDEnable = true;
+                               cai[0] = 1;
+                               cai[1] = CALL_DEFLECTION;
+                               add_p(plci, CAI, cai);
+                               add_p(plci, CPN, ss_parms[3].info);
+                               sig_req(plci, S_SERVICE, 0);
+                               send_req(plci);
+                               return false;
+                               break;
+
+                       case S_CALL_FORWARDING_START:
+                               if (api_parse(&parms->info[1], (word)parms->length, "wbdwwsss", ss_parms))
+                               {
+                                       dbug(1, dprintf("format wrong"));
+                                       Info = _WRONG_MESSAGE_FORMAT;
+                                       break;
+                               }
+
+                               if ((i = get_plci(a)))
+                               {
+                                       rplci = &a->plci[i - 1];
+                                       rplci->appl = appl;
+                                       add_p(rplci, CAI, "\x01\x80");
+                                       add_p(rplci, UID, "\x06\x43\x61\x70\x69\x32\x30");
+                                       sig_req(rplci, ASSIGN, DSIG_ID);
+                                       send_req(rplci);
+                               }
+                               else
+                               {
+                                       Info = _OUT_OF_PLCI;
+                                       break;
+                               }
+
+                               /* reuse unused screening indicator */
+                               rplci->internal_command = CF_START_PEND;
+                               rplci->appl = appl;
+                               rplci->number = Number;
+                               appl->S_Handle = GET_DWORD(&(ss_parms[2].info[0]));
+                               cai[0] = 2;
+                               cai[1] = 0x70 | (byte)GET_WORD(&(ss_parms[3].info[0])); /* Function */
+                               cai[2] = (byte)GET_WORD(&(ss_parms[4].info[0])); /* Basic Service */
+                               add_p(rplci, CAI, cai);
+                               add_p(rplci, OAD, ss_parms[5].info);
+                               add_p(rplci, CPN, ss_parms[6].info);
+                               sig_req(rplci, S_SERVICE, 0);
+                               send_req(rplci);
+                               return false;
+                               break;
+
+                       case S_INTERROGATE_DIVERSION:
+                       case S_INTERROGATE_NUMBERS:
+                       case S_CALL_FORWARDING_STOP:
+                       case S_CCBS_REQUEST:
+                       case S_CCBS_DEACTIVATE:
+                       case S_CCBS_INTERROGATE:
+                               switch (SSreq)
+                               {
+                               case S_INTERROGATE_NUMBERS:
+                                       if (api_parse(&parms->info[1], (word)parms->length, "wbd", ss_parms))
+                                       {
+                                               dbug(0, dprintf("format wrong"));
+                                               Info = _WRONG_MESSAGE_FORMAT;
+                                       }
+                                       break;
+                               case S_CCBS_REQUEST:
+                               case S_CCBS_DEACTIVATE:
+                                       if (api_parse(&parms->info[1], (word)parms->length, "wbdw", ss_parms))
+                                       {
+                                               dbug(0, dprintf("format wrong"));
+                                               Info = _WRONG_MESSAGE_FORMAT;
+                                       }
+                                       break;
+                               case S_CCBS_INTERROGATE:
+                                       if (api_parse(&parms->info[1], (word)parms->length, "wbdws", ss_parms))
+                                       {
+                                               dbug(0, dprintf("format wrong"));
+                                               Info = _WRONG_MESSAGE_FORMAT;
+                                       }
+                                       break;
+                               default:
+                                       if (api_parse(&parms->info[1], (word)parms->length, "wbdwws", ss_parms))
+                                       {
+                                               dbug(0, dprintf("format wrong"));
+                                               Info = _WRONG_MESSAGE_FORMAT;
+                                               break;
+                                       }
+                                       break;
+                               }
+
+                               if (Info) break;
+                               if ((i = get_plci(a)))
+                               {
+                                       rplci = &a->plci[i - 1];
+                                       switch (SSreq)
+                                       {
+                                       case S_INTERROGATE_DIVERSION: /* use cai with S_SERVICE below */
+                                               cai[1] = 0x60 | (byte)GET_WORD(&(ss_parms[3].info[0])); /* Function */
+                                               rplci->internal_command = INTERR_DIVERSION_REQ_PEND; /* move to rplci if assigned */
+                                               break;
+                                       case S_INTERROGATE_NUMBERS: /* use cai with S_SERVICE below */
+                                               cai[1] = DIVERSION_INTERROGATE_NUM; /* Function */
+                                               rplci->internal_command = INTERR_NUMBERS_REQ_PEND; /* move to rplci if assigned */
+                                               break;
+                                       case S_CALL_FORWARDING_STOP:
+                                               rplci->internal_command = CF_STOP_PEND;
+                                               cai[1] = 0x80 | (byte)GET_WORD(&(ss_parms[3].info[0])); /* Function */
+                                               break;
+                                       case S_CCBS_REQUEST:
+                                               cai[1] = CCBS_REQUEST;
+                                               rplci->internal_command = CCBS_REQUEST_REQ_PEND;
+                                               break;
+                                       case S_CCBS_DEACTIVATE:
+                                               cai[1] = CCBS_DEACTIVATE;
+                                               rplci->internal_command = CCBS_DEACTIVATE_REQ_PEND;
+                                               break;
+                                       case S_CCBS_INTERROGATE:
+                                               cai[1] = CCBS_INTERROGATE;
+                                               rplci->internal_command = CCBS_INTERROGATE_REQ_PEND;
+                                               break;
+                                       default:
+                                               cai[1] = 0;
+                                               break;
+                                       }
+                                       rplci->appl = appl;
+                                       rplci->number = Number;
+                                       add_p(rplci, CAI, "\x01\x80");
+                                       add_p(rplci, UID, "\x06\x43\x61\x70\x69\x32\x30");
+                                       sig_req(rplci, ASSIGN, DSIG_ID);
+                                       send_req(rplci);
+                               }
+                               else
+                               {
+                                       Info = _OUT_OF_PLCI;
+                                       break;
+                               }
+
+                               appl->S_Handle = GET_DWORD(&(ss_parms[2].info[0]));
+                               switch (SSreq)
+                               {
+                               case S_INTERROGATE_NUMBERS:
+                                       cai[0] = 1;
+                                       add_p(rplci, CAI, cai);
+                                       break;
+                               case S_CCBS_REQUEST:
+                               case S_CCBS_DEACTIVATE:
+                                       cai[0] = 3;
+                                       PUT_WORD(&cai[2], GET_WORD(&(ss_parms[3].info[0])));
+                                       add_p(rplci, CAI, cai);
+                                       break;
+                               case S_CCBS_INTERROGATE:
+                                       cai[0] = 3;
+                                       PUT_WORD(&cai[2], GET_WORD(&(ss_parms[3].info[0])));
+                                       add_p(rplci, CAI, cai);
+                                       add_p(rplci, OAD, ss_parms[4].info);
+                                       break;
+                               default:
+                                       cai[0] = 2;
+                                       cai[2] = (byte)GET_WORD(&(ss_parms[4].info[0])); /* Basic Service */
+                                       add_p(rplci, CAI, cai);
+                                       add_p(rplci, OAD, ss_parms[5].info);
+                                       break;
+                               }
+
+                               sig_req(rplci, S_SERVICE, 0);
+                               send_req(rplci);
+                               return false;
+                               break;
+
+                       case S_MWI_ACTIVATE:
+                               if (api_parse(&parms->info[1], (word)parms->length, "wbwdwwwssss", ss_parms))
+                               {
+                                       dbug(1, dprintf("format wrong"));
+                                       Info = _WRONG_MESSAGE_FORMAT;
+                                       break;
+                               }
+                               if (!plci)
+                               {
+                                       if ((i = get_plci(a)))
+                                       {
+                                               rplci = &a->plci[i - 1];
+                                               rplci->appl = appl;
+                                               rplci->cr_enquiry = true;
+                                               add_p(rplci, CAI, "\x01\x80");
+                                               add_p(rplci, UID, "\x06\x43\x61\x70\x69\x32\x30");
+                                               sig_req(rplci, ASSIGN, DSIG_ID);
+                                               send_req(rplci);
+                                       }
+                                       else
+                                       {
+                                               Info = _OUT_OF_PLCI;
+                                               break;
+                                       }
+                               }
+                               else
+                               {
+                                       rplci = plci;
+                                       rplci->cr_enquiry = false;
+                               }
+
+                               rplci->command = 0;
+                               rplci->internal_command = MWI_ACTIVATE_REQ_PEND;
+                               rplci->appl = appl;
+                               rplci->number = Number;
+
+                               cai[0] = 13;
+                               cai[1] = ACTIVATION_MWI; /* Function */
+                               PUT_WORD(&cai[2], GET_WORD(&(ss_parms[2].info[0]))); /* Basic Service */
+                               PUT_DWORD(&cai[4], GET_DWORD(&(ss_parms[3].info[0]))); /* Number of Messages */
+                               PUT_WORD(&cai[8], GET_WORD(&(ss_parms[4].info[0]))); /* Message Status */
+                               PUT_WORD(&cai[10], GET_WORD(&(ss_parms[5].info[0]))); /* Message Reference */
+                               PUT_WORD(&cai[12], GET_WORD(&(ss_parms[6].info[0]))); /* Invocation Mode */
+                               add_p(rplci, CAI, cai);
+                               add_p(rplci, CPN, ss_parms[7].info); /* Receiving User Number */
+                               add_p(rplci, OAD, ss_parms[8].info); /* Controlling User Number */
+                               add_p(rplci, OSA, ss_parms[9].info); /* Controlling User Provided Number */
+                               add_p(rplci, UID, ss_parms[10].info); /* Time */
+                               sig_req(rplci, S_SERVICE, 0);
+                               send_req(rplci);
+                               return false;
+
+                       case S_MWI_DEACTIVATE:
+                               if (api_parse(&parms->info[1], (word)parms->length, "wbwwss", ss_parms))
+                               {
+                                       dbug(1, dprintf("format wrong"));
+                                       Info = _WRONG_MESSAGE_FORMAT;
+                                       break;
+                               }
+                               if (!plci)
+                               {
+                                       if ((i = get_plci(a)))
+                                       {
+                                               rplci = &a->plci[i - 1];
+                                               rplci->appl = appl;
+                                               rplci->cr_enquiry = true;
+                                               add_p(rplci, CAI, "\x01\x80");
+                                               add_p(rplci, UID, "\x06\x43\x61\x70\x69\x32\x30");
+                                               sig_req(rplci, ASSIGN, DSIG_ID);
+                                               send_req(rplci);
+                                       }
+                                       else
+                                       {
+                                               Info = _OUT_OF_PLCI;
+                                               break;
+                                       }
+                               }
+                               else
+                               {
+                                       rplci = plci;
+                                       rplci->cr_enquiry = false;
+                               }
+
+                               rplci->command = 0;
+                               rplci->internal_command = MWI_DEACTIVATE_REQ_PEND;
+                               rplci->appl = appl;
+                               rplci->number = Number;
+
+                               cai[0] = 5;
+                               cai[1] = DEACTIVATION_MWI; /* Function */
+                               PUT_WORD(&cai[2], GET_WORD(&(ss_parms[2].info[0]))); /* Basic Service */
+                               PUT_WORD(&cai[4], GET_WORD(&(ss_parms[3].info[0]))); /* Invocation Mode */
+                               add_p(rplci, CAI, cai);
+                               add_p(rplci, CPN, ss_parms[4].info); /* Receiving User Number */
+                               add_p(rplci, OAD, ss_parms[5].info); /* Controlling User Number */
+                               sig_req(rplci, S_SERVICE, 0);
+                               send_req(rplci);
+                               return false;
+
+                       default:
+                               Info = 0x300E;  /* not supported */
+                               break;
+                       }
+                       break; /* case SELECTOR_SU_SERV: end */
+
+
+               case SELECTOR_DTMF:
+                       return (dtmf_request(Id, Number, a, plci, appl, msg));
+
+
+
+               case SELECTOR_LINE_INTERCONNECT:
+                       return (mixer_request(Id, Number, a, plci, appl, msg));
+
+
+
+               case PRIV_SELECTOR_ECHO_CANCELLER:
+                       appl->appl_flags |= APPL_FLAG_PRIV_EC_SPEC;
+                       return (ec_request(Id, Number, a, plci, appl, msg));
+
+               case SELECTOR_ECHO_CANCELLER:
+                       appl->appl_flags &= ~APPL_FLAG_PRIV_EC_SPEC;
+                       return (ec_request(Id, Number, a, plci, appl, msg));
+
+
+               case SELECTOR_V42BIS:
+               default:
+                       Info = _FACILITY_NOT_SUPPORTED;
+                       break;
+               } /* end of switch (selector) */
+       }
+
+       dbug(1, dprintf("SendFacRc"));
+       sendf(appl,
+             _FACILITY_R | CONFIRM,
+             Id,
+             Number,
+             "wws", Info, selector, SSparms);
+       return false;
 }
 
 static byte facility_res(dword Id, word Number, DIVA_CAPI_ADAPTER *a,
                         PLCI *plci, APPL *appl, API_PARSE *msg)
 {
-  dbug(1,dprintf("facility_res"));
-  return false;
+       dbug(1, dprintf("facility_res"));
+       return false;
 }
 
 static byte connect_b3_req(dword Id, word Number, DIVA_CAPI_ADAPTER *a,
                           PLCI *plci, APPL *appl, API_PARSE *parms)
 {
-  word Info = 0;
-  byte req;
-  byte len;
-  word w;
-  word fax_control_bits, fax_feature_bits, fax_info_change;
-  API_PARSE * ncpi;
-    byte pvc[2];
-
-    API_PARSE fax_parms[9];
-  word i;
-
-
-  dbug(1,dprintf("connect_b3_req"));
-  if(plci)
-  {
-    if ((plci->State == IDLE) || (plci->State == OUTG_DIS_PENDING)
-     || (plci->State == INC_DIS_PENDING) || (plci->SuppState != IDLE))
-    {
-      Info = _WRONG_STATE;
-    }
-    else
-    {
-      /* local reply if assign unsuccessful
-         or B3 protocol allows only one layer 3 connection
-           and already connected
-             or B2 protocol not any LAPD
-               and connect_b3_req contradicts originate/answer direction */
-      if (!plci->NL.Id
-       || (((plci->B3_prot != B3_T90NL) && (plci->B3_prot != B3_ISO8208) && (plci->B3_prot != B3_X25_DCE))
-        && ((plci->channels != 0)
-         || (((plci->B2_prot != B2_SDLC) && (plci->B2_prot != B2_LAPD) && (plci->B2_prot != B2_LAPD_FREE_SAPI_SEL))
-          && ((plci->call_dir & CALL_DIR_ANSWER) && !(plci->call_dir & CALL_DIR_FORCE_OUTG_NL))))))
-      {
-        dbug(1,dprintf("B3 already connected=%d or no NL.Id=0x%x, dir=%d sstate=0x%x",
-                       plci->channels,plci->NL.Id,plci->call_dir,plci->SuppState));
-        Info = _WRONG_STATE;
-        sendf(appl,                                                        
-              _CONNECT_B3_R|CONFIRM,
-              Id,
-              Number,
-              "w",Info);
-        return false;
-      }
-      plci->requested_options_conn = 0;
-
-      req = N_CONNECT;
-      ncpi = &parms[0];
-      if(plci->B3_prot==2 || plci->B3_prot==3)
-      {
-        if(ncpi->length>2)
-        {
-          /* check for PVC */
-          if(ncpi->info[2] || ncpi->info[3])
-          {
-            pvc[0] = ncpi->info[3];
-            pvc[1] = ncpi->info[2];
-            add_d(plci,2,pvc);
-            req = N_RESET;
-          }
-          else
-          {
-            if(ncpi->info[1] &1) req = N_CONNECT | N_D_BIT;
-            add_d(plci,(word)(ncpi->length-3),&ncpi->info[4]);
-          }
-        }
-      }
-      else if(plci->B3_prot==5)
-      {
-        if (plci->NL.Id && !plci->nl_remove_id)
-        {
-          fax_control_bits = GET_WORD(&((T30_INFO   *)plci->fax_connect_info_buffer)->control_bits_low);
-          fax_feature_bits = GET_WORD(&((T30_INFO   *)plci->fax_connect_info_buffer)->feature_bits_low);
-          if (!(fax_control_bits & T30_CONTROL_BIT_MORE_DOCUMENTS)
-           || (fax_feature_bits & T30_FEATURE_BIT_MORE_DOCUMENTS))
-          {
-            len = offsetof(T30_INFO, universal_6);
-            fax_info_change = false;
-            if (ncpi->length >= 4)
-            {
-              w = GET_WORD(&ncpi->info[3]);
-              if ((w & 0x0001) != ((word)(((T30_INFO   *)(plci->fax_connect_info_buffer))->resolution & 0x0001)))
-              {
-                ((T30_INFO   *)(plci->fax_connect_info_buffer))->resolution =
-                  (byte)((((T30_INFO   *)(plci->fax_connect_info_buffer))->resolution & ~T30_RESOLUTION_R8_0770_OR_200) |
-                  ((w & 0x0001) ? T30_RESOLUTION_R8_0770_OR_200 : 0));
-                fax_info_change = true;
-              }
-              fax_control_bits &= ~(T30_CONTROL_BIT_REQUEST_POLLING | T30_CONTROL_BIT_MORE_DOCUMENTS);
-              if (w & 0x0002)  /* Fax-polling request */
-                fax_control_bits |= T30_CONTROL_BIT_REQUEST_POLLING;
-              if ((w & 0x0004) /* Request to send / poll another document */
-               && (a->manufacturer_features & MANUFACTURER_FEATURE_FAX_MORE_DOCUMENTS))
-              {
-                fax_control_bits |= T30_CONTROL_BIT_MORE_DOCUMENTS;
-              }
-              if (ncpi->length >= 6)
-              {
-                w = GET_WORD(&ncpi->info[5]);
-                if (((byte) w) != ((T30_INFO   *)(plci->fax_connect_info_buffer))->data_format)
-                {
-                  ((T30_INFO   *)(plci->fax_connect_info_buffer))->data_format = (byte) w;
-                  fax_info_change = true;
-                }
-
-                if ((a->man_profile.private_options & (1L << PRIVATE_FAX_SUB_SEP_PWD))
-                 && (GET_WORD(&ncpi->info[5]) & 0x8000)) /* Private SEP/SUB/PWD enable */
-                {
-                  plci->requested_options_conn |= (1L << PRIVATE_FAX_SUB_SEP_PWD);
-                }
-                if ((a->man_profile.private_options & (1L << PRIVATE_FAX_NONSTANDARD))
-                 && (GET_WORD(&ncpi->info[5]) & 0x4000)) /* Private non-standard facilities enable */
-                {
-                  plci->requested_options_conn |= (1L << PRIVATE_FAX_NONSTANDARD);
-                }
-                fax_control_bits &= ~(T30_CONTROL_BIT_ACCEPT_SUBADDRESS | T30_CONTROL_BIT_ACCEPT_SEL_POLLING |
-                  T30_CONTROL_BIT_ACCEPT_PASSWORD);
-                if ((plci->requested_options_conn | plci->requested_options | a->requested_options_table[appl->Id-1])
-                  & ((1L << PRIVATE_FAX_SUB_SEP_PWD) | (1L << PRIVATE_FAX_NONSTANDARD)))
-                {
-                  if (api_parse (&ncpi->info[1], ncpi->length, "wwwwsss", fax_parms))
-                    Info = _WRONG_MESSAGE_FORMAT;
-                  else
-                  {
-                    if ((plci->requested_options_conn | plci->requested_options | a->requested_options_table[appl->Id-1])
-                      & (1L << PRIVATE_FAX_SUB_SEP_PWD))
-      {
-                    fax_control_bits |= T30_CONTROL_BIT_ACCEPT_SUBADDRESS | T30_CONTROL_BIT_ACCEPT_PASSWORD;
-                    if (fax_control_bits & T30_CONTROL_BIT_ACCEPT_POLLING)
-                      fax_control_bits |= T30_CONTROL_BIT_ACCEPT_SEL_POLLING;
-      }
-                    w = fax_parms[4].length;
-                    if (w > 20)
-                      w = 20;
-                    ((T30_INFO   *)(plci->fax_connect_info_buffer))->station_id_len = (byte) w;
-                    for (i = 0; i < w; i++)
-                      ((T30_INFO   *)(plci->fax_connect_info_buffer))->station_id[i] = fax_parms[4].info[1+i];
-                    ((T30_INFO   *)(plci->fax_connect_info_buffer))->head_line_len = 0;
-                    len = offsetof(T30_INFO, station_id) + T30_MAX_STATION_ID_LENGTH;
-                    w = fax_parms[5].length;
-                    if (w > 20)
-                      w = 20;
-                    plci->fax_connect_info_buffer[len++] = (byte) w;
-                    for (i = 0; i < w; i++)
-                      plci->fax_connect_info_buffer[len++] = fax_parms[5].info[1+i];
-                    w = fax_parms[6].length;
-                    if (w > 20)
-                      w = 20;
-                    plci->fax_connect_info_buffer[len++] = (byte) w;
-                    for (i = 0; i < w; i++)
-                      plci->fax_connect_info_buffer[len++] = fax_parms[6].info[1+i];
-                    if ((plci->requested_options_conn | plci->requested_options | a->requested_options_table[appl->Id-1])
-                      & (1L << PRIVATE_FAX_NONSTANDARD))
-      {
-                      if (api_parse (&ncpi->info[1], ncpi->length, "wwwwssss", fax_parms))
-        {
-                        dbug(1,dprintf("non-standard facilities info missing or wrong format"));
-                        plci->fax_connect_info_buffer[len++] = 0;
-        }
-                      else
-                      {
-          if ((fax_parms[7].length >= 3) && (fax_parms[7].info[1] >= 2))
-            plci->nsf_control_bits = GET_WORD(&fax_parms[7].info[2]);
-   plci->fax_connect_info_buffer[len++] = (byte)(fax_parms[7].length);
-          for (i = 0; i < fax_parms[7].length; i++)
-     plci->fax_connect_info_buffer[len++] = fax_parms[7].info[1+i];
-                      }
-                    }
-                  }
-                }
-                else
-                {
-                  len = offsetof(T30_INFO, universal_6);
-                }
-                fax_info_change = true;
-
-              }
-              if (fax_control_bits != GET_WORD(&((T30_INFO   *)plci->fax_connect_info_buffer)->control_bits_low))
-              {
-                PUT_WORD (&((T30_INFO   *)plci->fax_connect_info_buffer)->control_bits_low, fax_control_bits);
-                fax_info_change = true;
-              }
-            }
-            if (Info == GOOD)
-            {
-              plci->fax_connect_info_length = len;
-              if (fax_info_change)
-              {
-                if (fax_feature_bits & T30_FEATURE_BIT_MORE_DOCUMENTS)
-                {
-                  start_internal_command (Id, plci, fax_connect_info_command);
-                  return false;
-                }
-                else
-                {
-                  start_internal_command (Id, plci, fax_adjust_b23_command);
-                  return false;
-                }
-              }
-            }
-          }
-          else  Info = _WRONG_STATE;
-        }
-        else  Info = _WRONG_STATE;
-      }
-
-      else if (plci->B3_prot == B3_RTP)
-      {
-        plci->internal_req_buffer[0] = ncpi->length + 1;
-        plci->internal_req_buffer[1] = UDATA_REQUEST_RTP_RECONFIGURE;
-        for (w = 0; w < ncpi->length; w++)
-          plci->internal_req_buffer[2+w] = ncpi->info[1+w];
-        start_internal_command (Id, plci, rtp_connect_b3_req_command);
-        return false;
-      }
-
-      if(!Info)
-      {
-        nl_req_ncci(plci,req,0);
-        return 1;
-      }
-    }
-  }
-  else Info = _WRONG_IDENTIFIER;
-
-  sendf(appl,
-        _CONNECT_B3_R|CONFIRM,
-        Id,
-        Number,
-        "w",Info);
-  return false;
+       word Info = 0;
+       byte req;
+       byte len;
+       word w;
+       word fax_control_bits, fax_feature_bits, fax_info_change;
+       API_PARSE *ncpi;
+       byte pvc[2];
+
+       API_PARSE fax_parms[9];
+       word i;
+
+
+       dbug(1, dprintf("connect_b3_req"));
+       if (plci)
+       {
+               if ((plci->State == IDLE) || (plci->State == OUTG_DIS_PENDING)
+                   || (plci->State == INC_DIS_PENDING) || (plci->SuppState != IDLE))
+               {
+                       Info = _WRONG_STATE;
+               }
+               else
+               {
+                       /* local reply if assign unsuccessful
+                          or B3 protocol allows only one layer 3 connection
+                          and already connected
+                          or B2 protocol not any LAPD
+                          and connect_b3_req contradicts originate/answer direction */
+                       if (!plci->NL.Id
+                           || (((plci->B3_prot != B3_T90NL) && (plci->B3_prot != B3_ISO8208) && (plci->B3_prot != B3_X25_DCE))
+                               && ((plci->channels != 0)
+                                   || (((plci->B2_prot != B2_SDLC) && (plci->B2_prot != B2_LAPD) && (plci->B2_prot != B2_LAPD_FREE_SAPI_SEL))
+                                       && ((plci->call_dir & CALL_DIR_ANSWER) && !(plci->call_dir & CALL_DIR_FORCE_OUTG_NL))))))
+                       {
+                               dbug(1, dprintf("B3 already connected=%d or no NL.Id=0x%x, dir=%d sstate=0x%x",
+                                               plci->channels, plci->NL.Id, plci->call_dir, plci->SuppState));
+                               Info = _WRONG_STATE;
+                               sendf(appl,
+                                     _CONNECT_B3_R | CONFIRM,
+                                     Id,
+                                     Number,
+                                     "w", Info);
+                               return false;
+                       }
+                       plci->requested_options_conn = 0;
+
+                       req = N_CONNECT;
+                       ncpi = &parms[0];
+                       if (plci->B3_prot == 2 || plci->B3_prot == 3)
+                       {
+                               if (ncpi->length > 2)
+                               {
+                                       /* check for PVC */
+                                       if (ncpi->info[2] || ncpi->info[3])
+                                       {
+                                               pvc[0] = ncpi->info[3];
+                                               pvc[1] = ncpi->info[2];
+                                               add_d(plci, 2, pvc);
+                                               req = N_RESET;
+                                       }
+                                       else
+                                       {
+                                               if (ncpi->info[1] & 1) req = N_CONNECT | N_D_BIT;
+                                               add_d(plci, (word)(ncpi->length - 3), &ncpi->info[4]);
+                                       }
+                               }
+                       }
+                       else if (plci->B3_prot == 5)
+                       {
+                               if (plci->NL.Id && !plci->nl_remove_id)
+                               {
+                                       fax_control_bits = GET_WORD(&((T30_INFO *)plci->fax_connect_info_buffer)->control_bits_low);
+                                       fax_feature_bits = GET_WORD(&((T30_INFO *)plci->fax_connect_info_buffer)->feature_bits_low);
+                                       if (!(fax_control_bits & T30_CONTROL_BIT_MORE_DOCUMENTS)
+                                           || (fax_feature_bits & T30_FEATURE_BIT_MORE_DOCUMENTS))
+                                       {
+                                               len = offsetof(T30_INFO, universal_6);
+                                               fax_info_change = false;
+                                               if (ncpi->length >= 4)
+                                               {
+                                                       w = GET_WORD(&ncpi->info[3]);
+                                                       if ((w & 0x0001) != ((word)(((T30_INFO *)(plci->fax_connect_info_buffer))->resolution & 0x0001)))
+                                                       {
+                                                               ((T30_INFO *)(plci->fax_connect_info_buffer))->resolution =
+                                                                       (byte)((((T30_INFO *)(plci->fax_connect_info_buffer))->resolution & ~T30_RESOLUTION_R8_0770_OR_200) |
+                                                                              ((w & 0x0001) ? T30_RESOLUTION_R8_0770_OR_200 : 0));
+                                                               fax_info_change = true;
+                                                       }
+                                                       fax_control_bits &= ~(T30_CONTROL_BIT_REQUEST_POLLING | T30_CONTROL_BIT_MORE_DOCUMENTS);
+                                                       if (w & 0x0002)  /* Fax-polling request */
+                                                               fax_control_bits |= T30_CONTROL_BIT_REQUEST_POLLING;
+                                                       if ((w & 0x0004) /* Request to send / poll another document */
+                                                           && (a->manufacturer_features & MANUFACTURER_FEATURE_FAX_MORE_DOCUMENTS))
+                                                       {
+                                                               fax_control_bits |= T30_CONTROL_BIT_MORE_DOCUMENTS;
+                                                       }
+                                                       if (ncpi->length >= 6)
+                                                       {
+                                                               w = GET_WORD(&ncpi->info[5]);
+                                                               if (((byte) w) != ((T30_INFO *)(plci->fax_connect_info_buffer))->data_format)
+                                                               {
+                                                                       ((T30_INFO *)(plci->fax_connect_info_buffer))->data_format = (byte) w;
+                                                                       fax_info_change = true;
+                                                               }
+
+                                                               if ((a->man_profile.private_options & (1L << PRIVATE_FAX_SUB_SEP_PWD))
+                                                                   && (GET_WORD(&ncpi->info[5]) & 0x8000)) /* Private SEP/SUB/PWD enable */
+                                                               {
+                                                                       plci->requested_options_conn |= (1L << PRIVATE_FAX_SUB_SEP_PWD);
+                                                               }
+                                                               if ((a->man_profile.private_options & (1L << PRIVATE_FAX_NONSTANDARD))
+                                                                   && (GET_WORD(&ncpi->info[5]) & 0x4000)) /* Private non-standard facilities enable */
+                                                               {
+                                                                       plci->requested_options_conn |= (1L << PRIVATE_FAX_NONSTANDARD);
+                                                               }
+                                                               fax_control_bits &= ~(T30_CONTROL_BIT_ACCEPT_SUBADDRESS | T30_CONTROL_BIT_ACCEPT_SEL_POLLING |
+                                                                                     T30_CONTROL_BIT_ACCEPT_PASSWORD);
+                                                               if ((plci->requested_options_conn | plci->requested_options | a->requested_options_table[appl->Id - 1])
+                                                                   & ((1L << PRIVATE_FAX_SUB_SEP_PWD) | (1L << PRIVATE_FAX_NONSTANDARD)))
+                                                               {
+                                                                       if (api_parse(&ncpi->info[1], ncpi->length, "wwwwsss", fax_parms))
+                                                                               Info = _WRONG_MESSAGE_FORMAT;
+                                                                       else
+                                                                       {
+                                                                               if ((plci->requested_options_conn | plci->requested_options | a->requested_options_table[appl->Id - 1])
+                                                                                   & (1L << PRIVATE_FAX_SUB_SEP_PWD))
+                                                                               {
+                                                                                       fax_control_bits |= T30_CONTROL_BIT_ACCEPT_SUBADDRESS | T30_CONTROL_BIT_ACCEPT_PASSWORD;
+                                                                                       if (fax_control_bits & T30_CONTROL_BIT_ACCEPT_POLLING)
+                                                                                               fax_control_bits |= T30_CONTROL_BIT_ACCEPT_SEL_POLLING;
+                                                                               }
+                                                                               w = fax_parms[4].length;
+                                                                               if (w > 20)
+                                                                                       w = 20;
+                                                                               ((T30_INFO *)(plci->fax_connect_info_buffer))->station_id_len = (byte) w;
+                                                                               for (i = 0; i < w; i++)
+                                                                                       ((T30_INFO *)(plci->fax_connect_info_buffer))->station_id[i] = fax_parms[4].info[1 + i];
+                                                                               ((T30_INFO *)(plci->fax_connect_info_buffer))->head_line_len = 0;
+                                                                               len = offsetof(T30_INFO, station_id) + T30_MAX_STATION_ID_LENGTH;
+                                                                               w = fax_parms[5].length;
+                                                                               if (w > 20)
+                                                                                       w = 20;
+                                                                               plci->fax_connect_info_buffer[len++] = (byte) w;
+                                                                               for (i = 0; i < w; i++)
+                                                                                       plci->fax_connect_info_buffer[len++] = fax_parms[5].info[1 + i];
+                                                                               w = fax_parms[6].length;
+                                                                               if (w > 20)
+                                                                                       w = 20;
+                                                                               plci->fax_connect_info_buffer[len++] = (byte) w;
+                                                                               for (i = 0; i < w; i++)
+                                                                                       plci->fax_connect_info_buffer[len++] = fax_parms[6].info[1 + i];
+                                                                               if ((plci->requested_options_conn | plci->requested_options | a->requested_options_table[appl->Id - 1])
+                                                                                   & (1L << PRIVATE_FAX_NONSTANDARD))
+                                                                               {
+                                                                                       if (api_parse(&ncpi->info[1], ncpi->length, "wwwwssss", fax_parms))
+                                                                                       {
+                                                                                               dbug(1, dprintf("non-standard facilities info missing or wrong format"));
+                                                                                               plci->fax_connect_info_buffer[len++] = 0;
+                                                                                       }
+                                                                                       else
+                                                                                       {
+                                                                                               if ((fax_parms[7].length >= 3) && (fax_parms[7].info[1] >= 2))
+                                                                                                       plci->nsf_control_bits = GET_WORD(&fax_parms[7].info[2]);
+                                                                                               plci->fax_connect_info_buffer[len++] = (byte)(fax_parms[7].length);
+                                                                                               for (i = 0; i < fax_parms[7].length; i++)
+                                                                                                       plci->fax_connect_info_buffer[len++] = fax_parms[7].info[1 + i];
+                                                                                       }
+                                                                               }
+                                                                       }
+                                                               }
+                                                               else
+                                                               {
+                                                                       len = offsetof(T30_INFO, universal_6);
+                                                               }
+                                                               fax_info_change = true;
+
+                                                       }
+                                                       if (fax_control_bits != GET_WORD(&((T30_INFO *)plci->fax_connect_info_buffer)->control_bits_low))
+                                                       {
+                                                               PUT_WORD(&((T30_INFO *)plci->fax_connect_info_buffer)->control_bits_low, fax_control_bits);
+                                                               fax_info_change = true;
+                                                       }
+                                               }
+                                               if (Info == GOOD)
+                                               {
+                                                       plci->fax_connect_info_length = len;
+                                                       if (fax_info_change)
+                                                       {
+                                                               if (fax_feature_bits & T30_FEATURE_BIT_MORE_DOCUMENTS)
+                                                               {
+                                                                       start_internal_command(Id, plci, fax_connect_info_command);
+                                                                       return false;
+                                                               }
+                                                               else
+                                                               {
+                                                                       start_internal_command(Id, plci, fax_adjust_b23_command);
+                                                                       return false;
+                                                               }
+                                                       }
+                                               }
+                                       }
+                                       else  Info = _WRONG_STATE;
+                               }
+                               else  Info = _WRONG_STATE;
+                       }
+
+                       else if (plci->B3_prot == B3_RTP)
+                       {
+                               plci->internal_req_buffer[0] = ncpi->length + 1;
+                               plci->internal_req_buffer[1] = UDATA_REQUEST_RTP_RECONFIGURE;
+                               for (w = 0; w < ncpi->length; w++)
+                                       plci->internal_req_buffer[2 + w] = ncpi->info[1 + w];
+                               start_internal_command(Id, plci, rtp_connect_b3_req_command);
+                               return false;
+                       }
+
+                       if (!Info)
+                       {
+                               nl_req_ncci(plci, req, 0);
+                               return 1;
+                       }
+               }
+       }
+       else Info = _WRONG_IDENTIFIER;
+
+       sendf(appl,
+             _CONNECT_B3_R | CONFIRM,
+             Id,
+             Number,
+             "w", Info);
+       return false;
 }
 
 static byte connect_b3_res(dword Id, word Number, DIVA_CAPI_ADAPTER *a,
                           PLCI *plci, APPL *appl, API_PARSE *parms)
 {
-  word ncci;
-  API_PARSE * ncpi;
-  byte req;
-
-  word w;
-
-
-    API_PARSE fax_parms[9];
-  word i;
-  byte len;
-
-
-  dbug(1,dprintf("connect_b3_res"));
-
-  ncci = (word)(Id>>16);
-  if(plci && ncci) {
-    if(a->ncci_state[ncci]==INC_CON_PENDING) {
-      if (GET_WORD (&parms[0].info[0]) != 0)
-      {
-        a->ncci_state[ncci] = OUTG_REJ_PENDING;
-        channel_request_xon (plci, a->ncci_ch[ncci]);
-        channel_xmit_xon (plci);
-        cleanup_ncci_data (plci, ncci);
-        nl_req_ncci(plci,N_DISC,(byte)ncci);
-        return 1;
-      }
-      a->ncci_state[ncci] = INC_ACT_PENDING;
-
-      req = N_CONNECT_ACK;
-      ncpi = &parms[1];
-      if ((plci->B3_prot == 4) || (plci->B3_prot == 5) || (plci->B3_prot == 7))
-      {
-
-        if ((plci->requested_options_conn | plci->requested_options | a->requested_options_table[plci->appl->Id-1])
-          & (1L << PRIVATE_FAX_NONSTANDARD))
- {
-   if (((plci->B3_prot == 4) || (plci->B3_prot == 5))
-    && (plci->nsf_control_bits & T30_NSF_CONTROL_BIT_ENABLE_NSF)
-    && (plci->nsf_control_bits & T30_NSF_CONTROL_BIT_NEGOTIATE_RESP))
-   {
-            len = offsetof(T30_INFO, station_id) + T30_MAX_STATION_ID_LENGTH;
-            if (plci->fax_connect_info_length < len)
-            {
-              ((T30_INFO *)(plci->fax_connect_info_buffer))->station_id_len = 0;
-              ((T30_INFO *)(plci->fax_connect_info_buffer))->head_line_len = 0;
-            }
-            if (api_parse (&ncpi->info[1], ncpi->length, "wwwwssss", fax_parms))
-            {
-              dbug(1,dprintf("non-standard facilities info missing or wrong format"));
-            }
-            else
-            {
-              if (plci->fax_connect_info_length <= len)
-                plci->fax_connect_info_buffer[len] = 0;
-              len += 1 + plci->fax_connect_info_buffer[len];
-              if (plci->fax_connect_info_length <= len)
-                plci->fax_connect_info_buffer[len] = 0;
-              len += 1 + plci->fax_connect_info_buffer[len];
-              if ((fax_parms[7].length >= 3) && (fax_parms[7].info[1] >= 2))
-                plci->nsf_control_bits = GET_WORD(&fax_parms[7].info[2]);
-              plci->fax_connect_info_buffer[len++] = (byte)(fax_parms[7].length);
-              for (i = 0; i < fax_parms[7].length; i++)
-                plci->fax_connect_info_buffer[len++] = fax_parms[7].info[1+i];
-            }
-            plci->fax_connect_info_length = len;
-            ((T30_INFO *)(plci->fax_connect_info_buffer))->code = 0;
-            start_internal_command (Id, plci, fax_connect_ack_command);
-     return false;
-          }
-        }
-
-        nl_req_ncci(plci,req,(byte)ncci);
-        if ((plci->ncpi_state & NCPI_VALID_CONNECT_B3_ACT)
-         && !(plci->ncpi_state & NCPI_CONNECT_B3_ACT_SENT))
-        {
-          if (plci->B3_prot == 4)
-            sendf(appl,_CONNECT_B3_ACTIVE_I,Id,0,"s","");
-          else
-            sendf(appl,_CONNECT_B3_ACTIVE_I,Id,0,"S",plci->ncpi_buffer);
-          plci->ncpi_state |= NCPI_CONNECT_B3_ACT_SENT;
-        }
-      }
-
-      else if (plci->B3_prot == B3_RTP)
-      {
-        plci->internal_req_buffer[0] = ncpi->length + 1;
-        plci->internal_req_buffer[1] = UDATA_REQUEST_RTP_RECONFIGURE;
-        for (w = 0; w < ncpi->length; w++)
-          plci->internal_req_buffer[2+w] = ncpi->info[1+w];
-        start_internal_command (Id, plci, rtp_connect_b3_res_command);
-        return false;
-      }
-
-      else
-      {
-        if(ncpi->length>2) {
-          if(ncpi->info[1] &1) req = N_CONNECT_ACK | N_D_BIT;
-          add_d(plci,(word)(ncpi->length-3),&ncpi->info[4]);
-        }
-        nl_req_ncci(plci,req,(byte)ncci);
-        sendf(appl,_CONNECT_B3_ACTIVE_I,Id,0,"s","");
-        if (plci->adjust_b_restore)
-        {
-          plci->adjust_b_restore = false;
-          start_internal_command (Id, plci, adjust_b_restore);
-        }
-      }
-      return 1;
-    }
-  }
-  return false;
+       word ncci;
+       API_PARSE *ncpi;
+       byte req;
+
+       word w;
+
+
+       API_PARSE fax_parms[9];
+       word i;
+       byte len;
+
+
+       dbug(1, dprintf("connect_b3_res"));
+
+       ncci = (word)(Id >> 16);
+       if (plci && ncci) {
+               if (a->ncci_state[ncci] == INC_CON_PENDING) {
+                       if (GET_WORD(&parms[0].info[0]) != 0)
+                       {
+                               a->ncci_state[ncci] = OUTG_REJ_PENDING;
+                               channel_request_xon(plci, a->ncci_ch[ncci]);
+                               channel_xmit_xon(plci);
+                               cleanup_ncci_data(plci, ncci);
+                               nl_req_ncci(plci, N_DISC, (byte)ncci);
+                               return 1;
+                       }
+                       a->ncci_state[ncci] = INC_ACT_PENDING;
+
+                       req = N_CONNECT_ACK;
+                       ncpi = &parms[1];
+                       if ((plci->B3_prot == 4) || (plci->B3_prot == 5) || (plci->B3_prot == 7))
+                       {
+
+                               if ((plci->requested_options_conn | plci->requested_options | a->requested_options_table[plci->appl->Id - 1])
+                                   & (1L << PRIVATE_FAX_NONSTANDARD))
+                               {
+                                       if (((plci->B3_prot == 4) || (plci->B3_prot == 5))
+                                           && (plci->nsf_control_bits & T30_NSF_CONTROL_BIT_ENABLE_NSF)
+                                           && (plci->nsf_control_bits & T30_NSF_CONTROL_BIT_NEGOTIATE_RESP))
+                                       {
+                                               len = offsetof(T30_INFO, station_id) + T30_MAX_STATION_ID_LENGTH;
+                                               if (plci->fax_connect_info_length < len)
+                                               {
+                                                       ((T30_INFO *)(plci->fax_connect_info_buffer))->station_id_len = 0;
+                                                       ((T30_INFO *)(plci->fax_connect_info_buffer))->head_line_len = 0;
+                                               }
+                                               if (api_parse(&ncpi->info[1], ncpi->length, "wwwwssss", fax_parms))
+                                               {
+                                                       dbug(1, dprintf("non-standard facilities info missing or wrong format"));
+                                               }
+                                               else
+                                               {
+                                                       if (plci->fax_connect_info_length <= len)
+                                                               plci->fax_connect_info_buffer[len] = 0;
+                                                       len += 1 + plci->fax_connect_info_buffer[len];
+                                                       if (plci->fax_connect_info_length <= len)
+                                                               plci->fax_connect_info_buffer[len] = 0;
+                                                       len += 1 + plci->fax_connect_info_buffer[len];
+                                                       if ((fax_parms[7].length >= 3) && (fax_parms[7].info[1] >= 2))
+                                                               plci->nsf_control_bits = GET_WORD(&fax_parms[7].info[2]);
+                                                       plci->fax_connect_info_buffer[len++] = (byte)(fax_parms[7].length);
+                                                       for (i = 0; i < fax_parms[7].length; i++)
+                                                               plci->fax_connect_info_buffer[len++] = fax_parms[7].info[1 + i];
+                                               }
+                                               plci->fax_connect_info_length = len;
+                                               ((T30_INFO *)(plci->fax_connect_info_buffer))->code = 0;
+                                               start_internal_command(Id, plci, fax_connect_ack_command);
+                                               return false;
+                                       }
+                               }
+
+                               nl_req_ncci(plci, req, (byte)ncci);
+                               if ((plci->ncpi_state & NCPI_VALID_CONNECT_B3_ACT)
+                                   && !(plci->ncpi_state & NCPI_CONNECT_B3_ACT_SENT))
+                               {
+                                       if (plci->B3_prot == 4)
+                                               sendf(appl, _CONNECT_B3_ACTIVE_I, Id, 0, "s", "");
+                                       else
+                                               sendf(appl, _CONNECT_B3_ACTIVE_I, Id, 0, "S", plci->ncpi_buffer);
+                                       plci->ncpi_state |= NCPI_CONNECT_B3_ACT_SENT;
+                               }
+                       }
+
+                       else if (plci->B3_prot == B3_RTP)
+                       {
+                               plci->internal_req_buffer[0] = ncpi->length + 1;
+                               plci->internal_req_buffer[1] = UDATA_REQUEST_RTP_RECONFIGURE;
+                               for (w = 0; w < ncpi->length; w++)
+                                       plci->internal_req_buffer[2 + w] = ncpi->info[1+w];
+                               start_internal_command(Id, plci, rtp_connect_b3_res_command);
+                               return false;
+                       }
+
+                       else
+                       {
+                               if (ncpi->length > 2) {
+                                       if (ncpi->info[1] & 1) req = N_CONNECT_ACK | N_D_BIT;
+                                       add_d(plci, (word)(ncpi->length - 3), &ncpi->info[4]);
+                               }
+                               nl_req_ncci(plci, req, (byte)ncci);
+                               sendf(appl, _CONNECT_B3_ACTIVE_I, Id, 0, "s", "");
+                               if (plci->adjust_b_restore)
+                               {
+                                       plci->adjust_b_restore = false;
+                                       start_internal_command(Id, plci, adjust_b_restore);
+                               }
+                       }
+                       return 1;
+               }
+       }
+       return false;
 }
 
 static byte connect_b3_a_res(dword Id, word Number, DIVA_CAPI_ADAPTER *a,
                             PLCI *plci, APPL *appl, API_PARSE *parms)
 {
-  word ncci;
+       word ncci;
 
-  ncci = (word)(Id>>16);
-  dbug(1,dprintf("connect_b3_a_res(ncci=0x%x)",ncci));
+       ncci = (word)(Id >> 16);
+       dbug(1, dprintf("connect_b3_a_res(ncci=0x%x)", ncci));
 
-  if (plci && ncci && (plci->State != IDLE) && (plci->State != INC_DIS_PENDING)
-   && (plci->State != OUTG_DIS_PENDING))
-  {
-    if(a->ncci_state[ncci]==INC_ACT_PENDING) {
-      a->ncci_state[ncci] = CONNECTED;
-      if(plci->State!=INC_CON_CONNECTED_ALERT) plci->State = CONNECTED;
-      channel_request_xon (plci, a->ncci_ch[ncci]);
-      channel_xmit_xon (plci);
-    }
-  }
-  return false;
+       if (plci && ncci && (plci->State != IDLE) && (plci->State != INC_DIS_PENDING)
+           && (plci->State != OUTG_DIS_PENDING))
+       {
+               if (a->ncci_state[ncci] == INC_ACT_PENDING) {
+                       a->ncci_state[ncci] = CONNECTED;
+                       if (plci->State != INC_CON_CONNECTED_ALERT) plci->State = CONNECTED;
+                       channel_request_xon(plci, a->ncci_ch[ncci]);
+                       channel_xmit_xon(plci);
+               }
+       }
+       return false;
 }
 
 static byte disconnect_b3_req(dword Id, word Number, DIVA_CAPI_ADAPTER *a,
                              PLCI *plci, APPL *appl, API_PARSE *parms)
 {
-  word Info;
-  word ncci;
-  API_PARSE * ncpi;
-
-  dbug(1,dprintf("disconnect_b3_req"));
-
-  Info = _WRONG_IDENTIFIER;
-  ncci = (word)(Id>>16);
-  if (plci && ncci)
-  {
-    Info = _WRONG_STATE;
-    if ((a->ncci_state[ncci] == CONNECTED)
-     || (a->ncci_state[ncci] == OUTG_CON_PENDING)
-     || (a->ncci_state[ncci] == INC_CON_PENDING)
-     || (a->ncci_state[ncci] == INC_ACT_PENDING))
-    {
-      a->ncci_state[ncci] = OUTG_DIS_PENDING;
-      channel_request_xon (plci, a->ncci_ch[ncci]);
-      channel_xmit_xon (plci);
-
-      if (a->ncci[ncci].data_pending
-       && ((plci->B3_prot == B3_TRANSPARENT)
-        || (plci->B3_prot == B3_T30)
-        || (plci->B3_prot == B3_T30_WITH_EXTENSIONS)))
-      {
-        plci->send_disc = (byte)ncci;
-        plci->command = 0;
-        return false;
-      }
-      else
-      {
-        cleanup_ncci_data (plci, ncci);
-
-        if(plci->B3_prot==2 || plci->B3_prot==3)
-        {
-          ncpi = &parms[0];
-          if(ncpi->length>3)
-          {
-            add_d(plci, (word)(ncpi->length - 3) ,(byte   *)&(ncpi->info[4]));
-          }
-        }
-        nl_req_ncci(plci,N_DISC,(byte)ncci);
-      }
-      return 1;
-    }
-  }
-  sendf(appl,
-        _DISCONNECT_B3_R|CONFIRM,
-        Id,
-        Number,
-        "w",Info);
-  return false;
+       word Info;
+       word ncci;
+       API_PARSE *ncpi;
+
+       dbug(1, dprintf("disconnect_b3_req"));
+
+       Info = _WRONG_IDENTIFIER;
+       ncci = (word)(Id >> 16);
+       if (plci && ncci)
+       {
+               Info = _WRONG_STATE;
+               if ((a->ncci_state[ncci] == CONNECTED)
+                   || (a->ncci_state[ncci] == OUTG_CON_PENDING)
+                   || (a->ncci_state[ncci] == INC_CON_PENDING)
+                   || (a->ncci_state[ncci] == INC_ACT_PENDING))
+               {
+                       a->ncci_state[ncci] = OUTG_DIS_PENDING;
+                       channel_request_xon(plci, a->ncci_ch[ncci]);
+                       channel_xmit_xon(plci);
+
+                       if (a->ncci[ncci].data_pending
+                           && ((plci->B3_prot == B3_TRANSPARENT)
+                               || (plci->B3_prot == B3_T30)
+                               || (plci->B3_prot == B3_T30_WITH_EXTENSIONS)))
+                       {
+                               plci->send_disc = (byte)ncci;
+                               plci->command = 0;
+                               return false;
+                       }
+                       else
+                       {
+                               cleanup_ncci_data(plci, ncci);
+
+                               if (plci->B3_prot == 2 || plci->B3_prot == 3)
+                               {
+                                       ncpi = &parms[0];
+                                       if (ncpi->length > 3)
+                                       {
+                                               add_d(plci, (word)(ncpi->length - 3), (byte *)&(ncpi->info[4]));
+                                       }
+                               }
+                               nl_req_ncci(plci, N_DISC, (byte)ncci);
+                       }
+                       return 1;
+               }
+       }
+       sendf(appl,
+             _DISCONNECT_B3_R | CONFIRM,
+             Id,
+             Number,
+             "w", Info);
+       return false;
 }
 
 static byte disconnect_b3_res(dword Id, word Number, DIVA_CAPI_ADAPTER *a,
                              PLCI *plci, APPL *appl, API_PARSE *parms)
 {
-  word ncci;
-  word i;
-
-  ncci = (word)(Id>>16);
-  dbug(1,dprintf("disconnect_b3_res(ncci=0x%x",ncci));
-  if(plci && ncci) {
-    plci->requested_options_conn = 0;
-    plci->fax_connect_info_length = 0;
-    plci->ncpi_state = 0x00;
-    if (((plci->B3_prot != B3_T90NL) && (plci->B3_prot != B3_ISO8208) && (plci->B3_prot != B3_X25_DCE))
-      && ((plci->B2_prot != B2_LAPD) && (plci->B2_prot != B2_LAPD_FREE_SAPI_SEL)))
-    {
-      plci->call_dir |= CALL_DIR_FORCE_OUTG_NL;
-    }
-    for(i=0; i<MAX_CHANNELS_PER_PLCI && plci->inc_dis_ncci_table[i]!=(byte)ncci; i++);
-    if(i<MAX_CHANNELS_PER_PLCI) {
-      if(plci->channels)plci->channels--;
-      for(; i<MAX_CHANNELS_PER_PLCI-1; i++) plci->inc_dis_ncci_table[i] = plci->inc_dis_ncci_table[i+1];
-      plci->inc_dis_ncci_table[MAX_CHANNELS_PER_PLCI-1] = 0;
-
-      ncci_free_receive_buffers (plci, ncci);
-
-      if((plci->State==IDLE || plci->State==SUSPENDING) && !plci->channels){
-        if(plci->State == SUSPENDING){
-          sendf(plci->appl,
-                _FACILITY_I,
-                Id & 0xffffL,
-                0,
-                "ws", (word)3, "\x03\x04\x00\x00");
-          sendf(plci->appl, _DISCONNECT_I, Id & 0xffffL, 0, "w", 0);
-        }
-        plci_remove(plci);
-        plci->State=IDLE;
-      }
-    }
-    else
-    {
-      if ((a->manufacturer_features & MANUFACTURER_FEATURE_FAX_PAPER_FORMATS)
-       && ((plci->B3_prot == 4) || (plci->B3_prot == 5))
-       && (a->ncci_state[ncci] == INC_DIS_PENDING))
-      {
-        ncci_free_receive_buffers (plci, ncci);
-
-        nl_req_ncci(plci,N_EDATA,(byte)ncci);
-
-        plci->adapter->ncci_state[ncci] = IDLE;
-        start_internal_command (Id, plci, fax_disconnect_command);
-        return 1;
-      }
-    }
-  }
-  return false;
+       word ncci;
+       word i;
+
+       ncci = (word)(Id >> 16);
+       dbug(1, dprintf("disconnect_b3_res(ncci=0x%x", ncci));
+       if (plci && ncci) {
+               plci->requested_options_conn = 0;
+               plci->fax_connect_info_length = 0;
+               plci->ncpi_state = 0x00;
+               if (((plci->B3_prot != B3_T90NL) && (plci->B3_prot != B3_ISO8208) && (plci->B3_prot != B3_X25_DCE))
+                   && ((plci->B2_prot != B2_LAPD) && (plci->B2_prot != B2_LAPD_FREE_SAPI_SEL)))
+               {
+                       plci->call_dir |= CALL_DIR_FORCE_OUTG_NL;
+               }
+               for (i = 0; i < MAX_CHANNELS_PER_PLCI && plci->inc_dis_ncci_table[i] != (byte)ncci; i++);
+               if (i < MAX_CHANNELS_PER_PLCI) {
+                       if (plci->channels)plci->channels--;
+                       for (; i < MAX_CHANNELS_PER_PLCI - 1; i++) plci->inc_dis_ncci_table[i] = plci->inc_dis_ncci_table[i + 1];
+                       plci->inc_dis_ncci_table[MAX_CHANNELS_PER_PLCI - 1] = 0;
+
+                       ncci_free_receive_buffers(plci, ncci);
+
+                       if ((plci->State == IDLE || plci->State == SUSPENDING) && !plci->channels) {
+                               if (plci->State == SUSPENDING) {
+                                       sendf(plci->appl,
+                                             _FACILITY_I,
+                                             Id & 0xffffL,
+                                             0,
+                                             "ws", (word)3, "\x03\x04\x00\x00");
+                                       sendf(plci->appl, _DISCONNECT_I, Id & 0xffffL, 0, "w", 0);
+                               }
+                               plci_remove(plci);
+                               plci->State = IDLE;
+                       }
+               }
+               else
+               {
+                       if ((a->manufacturer_features & MANUFACTURER_FEATURE_FAX_PAPER_FORMATS)
+                           && ((plci->B3_prot == 4) || (plci->B3_prot == 5))
+                           && (a->ncci_state[ncci] == INC_DIS_PENDING))
+                       {
+                               ncci_free_receive_buffers(plci, ncci);
+
+                               nl_req_ncci(plci, N_EDATA, (byte)ncci);
+
+                               plci->adapter->ncci_state[ncci] = IDLE;
+                               start_internal_command(Id, plci, fax_disconnect_command);
+                               return 1;
+                       }
+               }
+       }
+       return false;
 }
 
 static byte data_b3_req(dword Id, word Number, DIVA_CAPI_ADAPTER *a,
                        PLCI *plci, APPL *appl, API_PARSE *parms)
 {
-  NCCI   *ncci_ptr;
-  DATA_B3_DESC   *data;
-  word Info;
-  word ncci;
-  word i;
-
-  dbug(1,dprintf("data_b3_req"));
-
-  Info = _WRONG_IDENTIFIER;
-  ncci = (word)(Id>>16);
-  dbug(1,dprintf("ncci=0x%x, plci=0x%x",ncci,plci));
-
-  if (plci && ncci)
-  {
-    Info = _WRONG_STATE;
-    if ((a->ncci_state[ncci] == CONNECTED)
-     || (a->ncci_state[ncci] == INC_ACT_PENDING))
-    {
-        /* queue data */
-      ncci_ptr = &(a->ncci[ncci]);
-      i = ncci_ptr->data_out + ncci_ptr->data_pending;
-      if (i >= MAX_DATA_B3)
-        i -= MAX_DATA_B3;
-      data = &(ncci_ptr->DBuffer[i]);
-      data->Number = Number;
-      if ((((byte   *)(parms[0].info)) >= ((byte   *)(plci->msg_in_queue)))
-       && (((byte   *)(parms[0].info)) < ((byte   *)(plci->msg_in_queue)) + sizeof(plci->msg_in_queue)))
-      {
-
-        data->P = (byte *)(long)(*((dword *)(parms[0].info)));
-
-      }
-      else
-        data->P = TransmitBufferSet(appl,*(dword *)parms[0].info);
-      data->Length = GET_WORD(parms[1].info);
-      data->Handle = GET_WORD(parms[2].info);
-      data->Flags = GET_WORD(parms[3].info);
-      (ncci_ptr->data_pending)++;
-
-        /* check for delivery confirmation */
-      if (data->Flags & 0x0004)
-      {
-        i = ncci_ptr->data_ack_out + ncci_ptr->data_ack_pending;
-        if (i >= MAX_DATA_ACK)
-          i -= MAX_DATA_ACK;
-        ncci_ptr->DataAck[i].Number = data->Number;
-        ncci_ptr->DataAck[i].Handle = data->Handle;
-        (ncci_ptr->data_ack_pending)++;
-      }
-
-      send_data(plci);
-      return false;
-    }
-  }
-  if (appl)
-  {
-    if (plci)
-    {
-      if ((((byte   *)(parms[0].info)) >= ((byte   *)(plci->msg_in_queue)))
-       && (((byte   *)(parms[0].info)) < ((byte   *)(plci->msg_in_queue)) + sizeof(plci->msg_in_queue)))
-      {
-
-        TransmitBufferFree (appl, (byte *)(long)(*((dword *)(parms[0].info))));
-
-      }
-    }
-    sendf(appl,
-          _DATA_B3_R|CONFIRM,
-          Id,
-          Number,
-          "ww",GET_WORD(parms[2].info),Info);
-  }
-  return false;
+       NCCI *ncci_ptr;
+       DATA_B3_DESC *data;
+       word Info;
+       word ncci;
+       word i;
+
+       dbug(1, dprintf("data_b3_req"));
+
+       Info = _WRONG_IDENTIFIER;
+       ncci = (word)(Id >> 16);
+       dbug(1, dprintf("ncci=0x%x, plci=0x%x", ncci, plci));
+
+       if (plci && ncci)
+       {
+               Info = _WRONG_STATE;
+               if ((a->ncci_state[ncci] == CONNECTED)
+                   || (a->ncci_state[ncci] == INC_ACT_PENDING))
+               {
+                       /* queue data */
+                       ncci_ptr = &(a->ncci[ncci]);
+                       i = ncci_ptr->data_out + ncci_ptr->data_pending;
+                       if (i >= MAX_DATA_B3)
+                               i -= MAX_DATA_B3;
+                       data = &(ncci_ptr->DBuffer[i]);
+                       data->Number = Number;
+                       if ((((byte *)(parms[0].info)) >= ((byte *)(plci->msg_in_queue)))
+                           && (((byte *)(parms[0].info)) < ((byte *)(plci->msg_in_queue)) + sizeof(plci->msg_in_queue)))
+                       {
+
+                               data->P = (byte *)(long)(*((dword *)(parms[0].info)));
+
+                       }
+                       else
+                               data->P = TransmitBufferSet(appl, *(dword *)parms[0].info);
+                       data->Length = GET_WORD(parms[1].info);
+                       data->Handle = GET_WORD(parms[2].info);
+                       data->Flags = GET_WORD(parms[3].info);
+                       (ncci_ptr->data_pending)++;
+
+                       /* check for delivery confirmation */
+                       if (data->Flags & 0x0004)
+                       {
+                               i = ncci_ptr->data_ack_out + ncci_ptr->data_ack_pending;
+                               if (i >= MAX_DATA_ACK)
+                                       i -= MAX_DATA_ACK;
+                               ncci_ptr->DataAck[i].Number = data->Number;
+                               ncci_ptr->DataAck[i].Handle = data->Handle;
+                               (ncci_ptr->data_ack_pending)++;
+                       }
+
+                       send_data(plci);
+                       return false;
+               }
+       }
+       if (appl)
+       {
+               if (plci)
+               {
+                       if ((((byte *)(parms[0].info)) >= ((byte *)(plci->msg_in_queue)))
+                           && (((byte *)(parms[0].info)) < ((byte *)(plci->msg_in_queue)) + sizeof(plci->msg_in_queue)))
+                       {
+
+                               TransmitBufferFree(appl, (byte *)(long)(*((dword *)(parms[0].info))));
+
+                       }
+               }
+               sendf(appl,
+                     _DATA_B3_R | CONFIRM,
+                     Id,
+                     Number,
+                     "ww", GET_WORD(parms[2].info), Info);
+       }
+       return false;
 }
 
 static byte data_b3_res(dword Id, word Number, DIVA_CAPI_ADAPTER *a,
                        PLCI *plci, APPL *appl, API_PARSE *parms)
 {
-  word n;
-  word ncci;
-  word NCCIcode;
-
-  dbug(1,dprintf("data_b3_res"));
-
-  ncci = (word)(Id>>16);
-  if(plci && ncci) {
-    n = GET_WORD(parms[0].info);
-    dbug(1,dprintf("free(%d)",n));
-    NCCIcode = ncci | (((word) a->Id) << 8);
-    if(n<appl->MaxBuffer &&
-       appl->DataNCCI[n]==NCCIcode &&
-       (byte)(appl->DataFlags[n]>>8)==plci->Id) {
-      dbug(1,dprintf("found"));
-      appl->DataNCCI[n] = 0;
-
-      if (channel_can_xon (plci, a->ncci_ch[ncci])) {
-        channel_request_xon (plci, a->ncci_ch[ncci]);
-      }
-      channel_xmit_xon (plci);
-
-      if(appl->DataFlags[n] &4) {
-        nl_req_ncci(plci,N_DATA_ACK,(byte)ncci);
-        return 1;
-      }
-    }
-  }
-  return false;
+       word n;
+       word ncci;
+       word NCCIcode;
+
+       dbug(1, dprintf("data_b3_res"));
+
+       ncci = (word)(Id >> 16);
+       if (plci && ncci) {
+               n = GET_WORD(parms[0].info);
+               dbug(1, dprintf("free(%d)", n));
+               NCCIcode = ncci | (((word) a->Id) << 8);
+               if (n < appl->MaxBuffer &&
+                   appl->DataNCCI[n] == NCCIcode &&
+                   (byte)(appl->DataFlags[n] >> 8) == plci->Id) {
+                       dbug(1, dprintf("found"));
+                       appl->DataNCCI[n] = 0;
+
+                       if (channel_can_xon(plci, a->ncci_ch[ncci])) {
+                               channel_request_xon(plci, a->ncci_ch[ncci]);
+                       }
+                       channel_xmit_xon(plci);
+
+                       if (appl->DataFlags[n] & 4) {
+                               nl_req_ncci(plci, N_DATA_ACK, (byte)ncci);
+                               return 1;
+                       }
+               }
+       }
+       return false;
 }
 
 static byte reset_b3_req(dword Id, word Number, DIVA_CAPI_ADAPTER *a,
                         PLCI *plci, APPL *appl, API_PARSE *parms)
 {
-  word Info;
-  word ncci;
-
-  dbug(1,dprintf("reset_b3_req"));
-
-  Info = _WRONG_IDENTIFIER;
-  ncci = (word)(Id>>16);
-  if(plci && ncci)
-  {
-    Info = _WRONG_STATE;
-    switch (plci->B3_prot)
-    {
-    case B3_ISO8208:
-    case B3_X25_DCE:
-      if(a->ncci_state[ncci]==CONNECTED)
-      {
-        nl_req_ncci(plci,N_RESET,(byte)ncci);
-        send_req(plci);
-        Info = GOOD;
-      }
-      break;
-    case B3_TRANSPARENT:
-      if(a->ncci_state[ncci]==CONNECTED)
-      {
-        start_internal_command (Id, plci, reset_b3_command);
-        Info = GOOD;
-      }
-      break;
-    }
-  }
-  /* reset_b3 must result in a reset_b3_con & reset_b3_Ind */
-  sendf(appl,
-        _RESET_B3_R|CONFIRM,
-        Id,
-        Number,
-        "w",Info);
-  return false;
+       word Info;
+       word ncci;
+
+       dbug(1, dprintf("reset_b3_req"));
+
+       Info = _WRONG_IDENTIFIER;
+       ncci = (word)(Id >> 16);
+       if (plci && ncci)
+       {
+               Info = _WRONG_STATE;
+               switch (plci->B3_prot)
+               {
+               case B3_ISO8208:
+               case B3_X25_DCE:
+                       if (a->ncci_state[ncci] == CONNECTED)
+                       {
+                               nl_req_ncci(plci, N_RESET, (byte)ncci);
+                               send_req(plci);
+                               Info = GOOD;
+                       }
+                       break;
+               case B3_TRANSPARENT:
+                       if (a->ncci_state[ncci] == CONNECTED)
+                       {
+                               start_internal_command(Id, plci, reset_b3_command);
+                               Info = GOOD;
+                       }
+                       break;
+               }
+       }
+       /* reset_b3 must result in a reset_b3_con & reset_b3_Ind */
+       sendf(appl,
+             _RESET_B3_R | CONFIRM,
+             Id,
+             Number,
+             "w", Info);
+       return false;
 }
 
 static byte reset_b3_res(dword Id, word Number, DIVA_CAPI_ADAPTER *a,
                         PLCI *plci, APPL *appl, API_PARSE *parms)
 {
-  word ncci;
-
-  dbug(1,dprintf("reset_b3_res"));
-
-  ncci = (word)(Id>>16);
-  if(plci && ncci) {
-    switch (plci->B3_prot)
-    {
-    case B3_ISO8208:
-    case B3_X25_DCE:
-      if(a->ncci_state[ncci]==INC_RES_PENDING)
-      {
-        a->ncci_state[ncci] = CONNECTED;
-        nl_req_ncci(plci,N_RESET_ACK,(byte)ncci);
-        return true;
-      }
-    break;
-    }
-  }
-  return false;
+       word ncci;
+
+       dbug(1, dprintf("reset_b3_res"));
+
+       ncci = (word)(Id >> 16);
+       if (plci && ncci) {
+               switch (plci->B3_prot)
+               {
+               case B3_ISO8208:
+               case B3_X25_DCE:
+                       if (a->ncci_state[ncci] == INC_RES_PENDING)
+                       {
+                               a->ncci_state[ncci] = CONNECTED;
+                               nl_req_ncci(plci, N_RESET_ACK, (byte)ncci);
+                               return true;
+                       }
+                       break;
+               }
+       }
+       return false;
 }
 
 static byte connect_b3_t90_a_res(dword Id, word Number, DIVA_CAPI_ADAPTER *a,
                                 PLCI *plci, APPL *appl, API_PARSE *parms)
 {
-  word ncci;
-  API_PARSE * ncpi;
-  byte req;
-
-  dbug(1,dprintf("connect_b3_t90_a_res"));
-
-  ncci = (word)(Id>>16);
-  if(plci && ncci) {
-    if(a->ncci_state[ncci]==INC_ACT_PENDING) {
-      a->ncci_state[ncci] = CONNECTED;
-    }
-    else if(a->ncci_state[ncci]==INC_CON_PENDING) {
-      a->ncci_state[ncci] = CONNECTED;
-
-      req = N_CONNECT_ACK;
-
-        /* parms[0]==0 for CAPI original message definition! */
-      if(parms[0].info) {
-        ncpi = &parms[1];
-        if(ncpi->length>2) {
-          if(ncpi->info[1] &1) req = N_CONNECT_ACK | N_D_BIT;
-          add_d(plci,(word)(ncpi->length-3),&ncpi->info[4]);
-        }
-      }
-      nl_req_ncci(plci,req,(byte)ncci);
-      return 1;
-    }
-  }
-  return false;
+       word ncci;
+       API_PARSE *ncpi;
+       byte req;
+
+       dbug(1, dprintf("connect_b3_t90_a_res"));
+
+       ncci = (word)(Id >> 16);
+       if (plci && ncci) {
+               if (a->ncci_state[ncci] == INC_ACT_PENDING) {
+                       a->ncci_state[ncci] = CONNECTED;
+               }
+               else if (a->ncci_state[ncci] == INC_CON_PENDING) {
+                       a->ncci_state[ncci] = CONNECTED;
+
+                       req = N_CONNECT_ACK;
+
+                       /* parms[0]==0 for CAPI original message definition! */
+                       if (parms[0].info) {
+                               ncpi = &parms[1];
+                               if (ncpi->length > 2) {
+                                       if (ncpi->info[1] & 1) req = N_CONNECT_ACK | N_D_BIT;
+                                       add_d(plci, (word)(ncpi->length - 3), &ncpi->info[4]);
+                               }
+                       }
+                       nl_req_ncci(plci, req, (byte)ncci);
+                       return 1;
+               }
+       }
+       return false;
 }
 
 
 static byte select_b_req(dword Id, word Number, DIVA_CAPI_ADAPTER *a,
                         PLCI *plci, APPL *appl, API_PARSE *msg)
 {
-  word Info=0;
-  word i;
-  byte tel;
-    API_PARSE bp_parms[7];
-
-  if(!plci || !msg)
-  {
-    Info = _WRONG_IDENTIFIER;
-  }
-  else
-  {
-    dbug(1,dprintf("select_b_req[%d],PLCI=0x%x,Tel=0x%x,NL=0x%x,appl=0x%x,sstate=0x%x",
-                   msg->length,plci->Id,plci->tel,plci->NL.Id,plci->appl,plci->SuppState));
-    dbug(1,dprintf("PlciState=0x%x",plci->State));
-    for(i=0;i<7;i++) bp_parms[i].length = 0;
-
-    /* check if no channel is open, no B3 connected only */
-    if((plci->State == IDLE) || (plci->State == OUTG_DIS_PENDING) || (plci->State == INC_DIS_PENDING)
-     || (plci->SuppState != IDLE) || plci->channels || plci->nl_remove_id)
-    {
-      Info = _WRONG_STATE;
-    }
-    /* check message format and fill bp_parms pointer */
-    else if(msg->length && api_parse(&msg->info[1], (word)msg->length, "wwwsss", bp_parms))
-    {
-      Info = _WRONG_MESSAGE_FORMAT;
-    }
-    else
-    {
-      if((plci->State==INC_CON_PENDING) || (plci->State==INC_CON_ALERT)) /* send alert tone inband to the network, */
-      {                                                                  /* e.g. Qsig or RBS or Cornet-N or xess PRI */
-        if(Id & EXT_CONTROLLER)
-        {
-          sendf(appl, _SELECT_B_REQ|CONFIRM, Id, Number, "w", 0x2002); /* wrong controller */
-          return 0;
-        }
-        plci->State=INC_CON_CONNECTED_ALERT;
-        plci->appl = appl;
-        clear_c_ind_mask_bit (plci, (word)(appl->Id-1));
-        dump_c_ind_mask (plci);
-        for(i=0; i<max_appl; i++) /* disconnect the other appls */
-        {                         /* its quasi a connect        */
-          if(test_c_ind_mask_bit (plci, i))
-            sendf(&application[i], _DISCONNECT_I, Id, 0, "w", _OTHER_APPL_CONNECTED);
-        }
-      }
-
-      api_save_msg(msg, "s", &plci->saved_msg);
-      tel = plci->tel;
-      if(Id & EXT_CONTROLLER)
-      {
-        if(tel) /* external controller in use by this PLCI */
-        {
-          if(a->AdvSignalAppl && a->AdvSignalAppl!=appl)
-          {
-            dbug(1,dprintf("Ext_Ctrl in use 1"));
-            Info = _WRONG_STATE;
-          }
-        }
-        else  /* external controller NOT in use by this PLCI ? */
-        {
-          if(a->AdvSignalPLCI)
-          {
-            dbug(1,dprintf("Ext_Ctrl in use 2"));
-            Info = _WRONG_STATE;
-          }
-          else /* activate the codec */
-          {
-            dbug(1,dprintf("Ext_Ctrl start"));
-            if(AdvCodecSupport(a, plci, appl, 0) )
-            {
-              dbug(1,dprintf("Error in codec procedures"));
-              Info = _WRONG_STATE;
-            }
-            else if(plci->spoofed_msg==SPOOFING_REQUIRED) /* wait until codec is active */
-            {
-              plci->spoofed_msg = AWAITING_SELECT_B;
-              plci->internal_command = BLOCK_PLCI; /* lock other commands */
-              plci->command = 0;
-              dbug(1,dprintf("continue if codec loaded"));
-              return false;
-            }
-          }
-        }
-      }
-      else /* external controller bit is OFF */
-      {
-        if(tel) /* external controller in use, need to switch off */
-        {
-          if(a->AdvSignalAppl==appl)
-          {
-            CodecIdCheck(a, plci);
-            plci->tel = 0;
-            plci->adv_nl = 0;
-            dbug(1,dprintf("Ext_Ctrl disable"));
-          }
-          else
-          {
-            dbug(1,dprintf("Ext_Ctrl not requested"));
-          }
-        }
-      }
-      if (!Info)
-      {
-        if (plci->call_dir & CALL_DIR_OUT)
-          plci->call_dir = CALL_DIR_OUT | CALL_DIR_ORIGINATE;
-        else if (plci->call_dir & CALL_DIR_IN)
-          plci->call_dir = CALL_DIR_IN | CALL_DIR_ANSWER;
-        start_internal_command (Id, plci, select_b_command);
-        return false;
-      }
-    }
-  }
-  sendf(appl, _SELECT_B_REQ|CONFIRM, Id, Number, "w", Info);
-  return false;
+       word Info = 0;
+       word i;
+       byte tel;
+       API_PARSE bp_parms[7];
+
+       if (!plci || !msg)
+       {
+               Info = _WRONG_IDENTIFIER;
+       }
+       else
+       {
+               dbug(1, dprintf("select_b_req[%d],PLCI=0x%x,Tel=0x%x,NL=0x%x,appl=0x%x,sstate=0x%x",
+                               msg->length, plci->Id, plci->tel, plci->NL.Id, plci->appl, plci->SuppState));
+               dbug(1, dprintf("PlciState=0x%x", plci->State));
+               for (i = 0; i < 7; i++) bp_parms[i].length = 0;
+
+               /* check if no channel is open, no B3 connected only */
+               if ((plci->State == IDLE) || (plci->State == OUTG_DIS_PENDING) || (plci->State == INC_DIS_PENDING)
+                   || (plci->SuppState != IDLE) || plci->channels || plci->nl_remove_id)
+               {
+                       Info = _WRONG_STATE;
+               }
+               /* check message format and fill bp_parms pointer */
+               else if (msg->length && api_parse(&msg->info[1], (word)msg->length, "wwwsss", bp_parms))
+               {
+                       Info = _WRONG_MESSAGE_FORMAT;
+               }
+               else
+               {
+                       if ((plci->State == INC_CON_PENDING) || (plci->State == INC_CON_ALERT)) /* send alert tone inband to the network, */
+                       {                                                                  /* e.g. Qsig or RBS or Cornet-N or xess PRI */
+                               if (Id & EXT_CONTROLLER)
+                               {
+                                       sendf(appl, _SELECT_B_REQ | CONFIRM, Id, Number, "w", 0x2002); /* wrong controller */
+                                       return 0;
+                               }
+                               plci->State = INC_CON_CONNECTED_ALERT;
+                               plci->appl = appl;
+                               clear_c_ind_mask_bit(plci, (word)(appl->Id - 1));
+                               dump_c_ind_mask(plci);
+                               for (i = 0; i < max_appl; i++) /* disconnect the other appls */
+                               {                         /* its quasi a connect        */
+                                       if (test_c_ind_mask_bit(plci, i))
+                                               sendf(&application[i], _DISCONNECT_I, Id, 0, "w", _OTHER_APPL_CONNECTED);
+                               }
+                       }
+
+                       api_save_msg(msg, "s", &plci->saved_msg);
+                       tel = plci->tel;
+                       if (Id & EXT_CONTROLLER)
+                       {
+                               if (tel) /* external controller in use by this PLCI */
+                               {
+                                       if (a->AdvSignalAppl && a->AdvSignalAppl != appl)
+                                       {
+                                               dbug(1, dprintf("Ext_Ctrl in use 1"));
+                                               Info = _WRONG_STATE;
+                                       }
+                               }
+                               else  /* external controller NOT in use by this PLCI ? */
+                               {
+                                       if (a->AdvSignalPLCI)
+                                       {
+                                               dbug(1, dprintf("Ext_Ctrl in use 2"));
+                                               Info = _WRONG_STATE;
+                                       }
+                                       else /* activate the codec */
+                                       {
+                                               dbug(1, dprintf("Ext_Ctrl start"));
+                                               if (AdvCodecSupport(a, plci, appl, 0))
+                                               {
+                                                       dbug(1, dprintf("Error in codec procedures"));
+                                                       Info = _WRONG_STATE;
+                                               }
+                                               else if (plci->spoofed_msg == SPOOFING_REQUIRED) /* wait until codec is active */
+                                               {
+                                                       plci->spoofed_msg = AWAITING_SELECT_B;
+                                                       plci->internal_command = BLOCK_PLCI; /* lock other commands */
+                                                       plci->command = 0;
+                                                       dbug(1, dprintf("continue if codec loaded"));
+                                                       return false;
+                                               }
+                                       }
+                               }
+                       }
+                       else /* external controller bit is OFF */
+                       {
+                               if (tel) /* external controller in use, need to switch off */
+                               {
+                                       if (a->AdvSignalAppl == appl)
+                                       {
+                                               CodecIdCheck(a, plci);
+                                               plci->tel = 0;
+                                               plci->adv_nl = 0;
+                                               dbug(1, dprintf("Ext_Ctrl disable"));
+                                       }
+                                       else
+                                       {
+                                               dbug(1, dprintf("Ext_Ctrl not requested"));
+                                       }
+                               }
+                       }
+                       if (!Info)
+                       {
+                               if (plci->call_dir & CALL_DIR_OUT)
+                                       plci->call_dir = CALL_DIR_OUT | CALL_DIR_ORIGINATE;
+                               else if (plci->call_dir & CALL_DIR_IN)
+                                       plci->call_dir = CALL_DIR_IN | CALL_DIR_ANSWER;
+                               start_internal_command(Id, plci, select_b_command);
+                               return false;
+                       }
+               }
+       }
+       sendf(appl, _SELECT_B_REQ | CONFIRM, Id, Number, "w", Info);
+       return false;
 }
 
 static byte manufacturer_req(dword Id, word Number, DIVA_CAPI_ADAPTER *a,
                             PLCI *plci, APPL *appl, API_PARSE *parms)
 {
-  word command;
-  word i;
-  word ncci;
-  API_PARSE * m;
-    API_PARSE m_parms[5];
-  word codec;
-  byte req;
-  byte ch;
-  byte dir;
-  static byte chi[2] = {0x01,0x00};
-  static byte lli[2] = {0x01,0x00};
-  static byte codec_cai[2] = {0x01,0x01};
-  static byte null_msg = {0};
-  static API_PARSE null_parms = { 0, &null_msg };
-  PLCI   * v_plci;
-  word Info=0;
-
-  dbug(1,dprintf("manufacturer_req"));
-  for(i=0;i<5;i++) m_parms[i].length = 0;
-
-  if(GET_DWORD(parms[0].info)!=_DI_MANU_ID) {
-    Info = _WRONG_MESSAGE_FORMAT;
-  }
-  command = GET_WORD(parms[1].info);
-  m = &parms[2];
-  if (!Info)
-  {
-    switch(command) {
-    case _DI_ASSIGN_PLCI:
-      if(api_parse(&m->info[1],(word)m->length,"wbbs",m_parms)) {
-        Info = _WRONG_MESSAGE_FORMAT;
-        break;
-      }
-      codec = GET_WORD(m_parms[0].info);
-      ch = m_parms[1].info[0];
-      dir = m_parms[2].info[0];
-      if((i=get_plci(a))) {
-        plci = &a->plci[i-1];
-        plci->appl = appl;
-        plci->command = _MANUFACTURER_R;
-        plci->m_command = command;
-        plci->number = Number;
-        plci->State = LOCAL_CONNECT;
-        Id = ( ((word)plci->Id<<8)|plci->adapter->Id|0x80);
-        dbug(1,dprintf("ManCMD,plci=0x%x",Id));
-
-        if((ch==1 || ch==2) && (dir<=2)) {
-          chi[1] = (byte)(0x80|ch);
-          lli[1] = 0;
-          plci->call_dir = CALL_DIR_OUT | CALL_DIR_ORIGINATE;
-          switch(codec)
-          {
-          case 0:
-            Info = add_b1(plci,&m_parms[3],0,0);
-            break;
-          case 1:
-            add_p(plci,CAI,codec_cai);
-            break;
-          /* manual 'swich on' to the codec support without signalling */
-          /* first 'assign plci' with this function, then use */
-          case 2:
-            if(AdvCodecSupport(a, plci, appl, 0) ) {
-              Info = _RESOURCE_ERROR;
-            }
-            else {
-              Info = add_b1(plci,&null_parms,0,B1_FACILITY_LOCAL);
-              lli[1] = 0x10; /* local call codec stream */
-            }
-            break;
-          }
-
-          plci->State = LOCAL_CONNECT;
-          plci->manufacturer = true;
-          plci->command = _MANUFACTURER_R;
-          plci->m_command = command;
-          plci->number = Number;
-
-          if(!Info)
-          {
-            add_p(plci,LLI,lli);
-            add_p(plci,CHI,chi);
-            add_p(plci,UID,"\x06\x43\x61\x70\x69\x32\x30");
-            sig_req(plci,ASSIGN,DSIG_ID);
-
-            if(!codec)
-            {
-              Info = add_b23(plci,&m_parms[3]);
-              if(!Info)
-              {
-                nl_req_ncci(plci,ASSIGN,0);
-                send_req(plci);
-              }
-            }
-            if(!Info)
-            {
-              dbug(1,dprintf("dir=0x%x,spoof=0x%x",dir,plci->spoofed_msg));
-              if (plci->spoofed_msg==SPOOFING_REQUIRED)
-              {
-                api_save_msg (m_parms, "wbbs", &plci->saved_msg);
-                plci->spoofed_msg = AWAITING_MANUF_CON;
-                plci->internal_command = BLOCK_PLCI; /* reject other req meanwhile */
-                plci->command = 0;
-                send_req(plci);
-                return false;
-              }
-              if(dir==1) {
-                sig_req(plci,CALL_REQ,0);
-              }
-              else if(!dir){
-                sig_req(plci,LISTEN_REQ,0);
-              }
-              send_req(plci);
-            }
-            else
-            {
-              sendf(appl,
-                    _MANUFACTURER_R|CONFIRM,
-                    Id,
-                    Number,
-                    "dww",_DI_MANU_ID,command,Info);
-              return 2;
-            }
-          }
-        }
-      }
-      else  Info = _OUT_OF_PLCI;
-      break;
-
-    case _DI_IDI_CTRL:
-      if(!plci)
-      {
-        Info = _WRONG_IDENTIFIER;
-        break;
-      }
-      if(api_parse(&m->info[1],(word)m->length,"bs",m_parms)) {
-        Info = _WRONG_MESSAGE_FORMAT;
-        break;
-      }
-      req = m_parms[0].info[0];
-      plci->command = _MANUFACTURER_R;
-      plci->m_command = command;
-      plci->number = Number;
-      if(req==CALL_REQ)
-      {
-        plci->b_channel = getChannel(&m_parms[1]);
-        mixer_set_bchannel_id_esc (plci, plci->b_channel);
-        if(plci->spoofed_msg==SPOOFING_REQUIRED)
-        {
-          plci->spoofed_msg = CALL_REQ | AWAITING_MANUF_CON;
-          plci->internal_command = BLOCK_PLCI; /* reject other req meanwhile */
-          plci->command = 0;
-          break;
-        }
-      }
-      else if(req==LAW_REQ)
-      {
-        plci->cr_enquiry = true;
-      }
-      add_ss(plci,FTY,&m_parms[1]);
-      sig_req(plci,req,0);
-      send_req(plci);
-      if(req==HANGUP)
-      {      
-        if (plci->NL.Id && !plci->nl_remove_id)
-        {
-          if (plci->channels)
-          {
-            for (ncci = 1; ncci < MAX_NCCI+1; ncci++)
-            {
-              if ((a->ncci_plci[ncci] == plci->Id) && (a->ncci_state[ncci] == CONNECTED))
-              {
-                a->ncci_state[ncci] = OUTG_DIS_PENDING;
-                cleanup_ncci_data (plci, ncci);
-                nl_req_ncci(plci,N_DISC,(byte)ncci);
-              }
-            }
-          }
-          mixer_remove (plci);
-          nl_req_ncci(plci,REMOVE,0);
-          send_req(plci);
-        }  
-      }
-      break;
-
-    case _DI_SIG_CTRL:
-    /* signalling control for loop activation B-channel */
-      if(!plci)
-      {
-        Info = _WRONG_IDENTIFIER;
-        break;
-      }
-      if(m->length){
-        plci->command = _MANUFACTURER_R;
-        plci->number = Number;
-        add_ss(plci,FTY,m);
-        sig_req(plci,SIG_CTRL,0);
-        send_req(plci);
-      }
-      else Info = _WRONG_MESSAGE_FORMAT;
-      break;
-
-    case _DI_RXT_CTRL:
-    /* activation control for receiver/transmitter B-channel */
-      if(!plci)
-      {
-        Info = _WRONG_IDENTIFIER;
-        break;
-      }
-      if(m->length){
-        plci->command = _MANUFACTURER_R;
-        plci->number = Number;
-        add_ss(plci,FTY,m);
-        sig_req(plci,DSP_CTRL,0);
-        send_req(plci);
-      }
-      else Info = _WRONG_MESSAGE_FORMAT;
-      break;
-
-    case _DI_ADV_CODEC:
-    case _DI_DSP_CTRL:
-      /* TEL_CTRL commands to support non standard adjustments: */
-      /* Ring on/off, Handset micro volume, external micro vol. */
-      /* handset+external speaker volume, receiver+transm. gain,*/
-      /* handsfree on (hookinfo off), set mixer command         */
-
-      if(command == _DI_ADV_CODEC)
-      {
-        if(!a->AdvCodecPLCI) {
-          Info = _WRONG_STATE;
-          break;
-        }
-        v_plci = a->AdvCodecPLCI;
-      }
-      else
-      {
-        if (plci
-         && (m->length >= 3)
-         && (m->info[1] == 0x1c)
-         && (m->info[2] >= 1))
-        {
-          if (m->info[3] == DSP_CTRL_OLD_SET_MIXER_COEFFICIENTS)
-          {
-            if ((plci->tel != ADV_VOICE) || (plci != a->AdvSignalPLCI))
-            {
-              Info = _WRONG_STATE;
-              break;
-            }
-            a->adv_voice_coef_length = m->info[2] - 1;
-            if (a->adv_voice_coef_length > m->length - 3)
-              a->adv_voice_coef_length = (byte)(m->length - 3);
-            if (a->adv_voice_coef_length > ADV_VOICE_COEF_BUFFER_SIZE)
-              a->adv_voice_coef_length = ADV_VOICE_COEF_BUFFER_SIZE;
-            for (i = 0; i < a->adv_voice_coef_length; i++)
-              a->adv_voice_coef_buffer[i] = m->info[4 + i];
-            if (plci->B1_facilities & B1_FACILITY_VOICE)
-              adv_voice_write_coefs (plci, ADV_VOICE_WRITE_UPDATE);
-            break;
-          }
-          else if (m->info[3] == DSP_CTRL_SET_DTMF_PARAMETERS)
-          {
-            if (!(a->manufacturer_features & MANUFACTURER_FEATURE_DTMF_PARAMETERS))
-            {
-              Info = _FACILITY_NOT_SUPPORTED;
-              break;
-            }
-
-            plci->dtmf_parameter_length = m->info[2] - 1;
-            if (plci->dtmf_parameter_length > m->length - 3)
-              plci->dtmf_parameter_length = (byte)(m->length - 3);
-            if (plci->dtmf_parameter_length > DTMF_PARAMETER_BUFFER_SIZE)
-              plci->dtmf_parameter_length = DTMF_PARAMETER_BUFFER_SIZE;
-            for (i = 0; i < plci->dtmf_parameter_length; i++)
-              plci->dtmf_parameter_buffer[i] = m->info[4+i];
-            if (plci->B1_facilities & B1_FACILITY_DTMFR)
-              dtmf_parameter_write (plci);
-            break;
-
-          }
-        }
-        v_plci = plci;
-      }
-
-      if(!v_plci)
-      {
-        Info = _WRONG_IDENTIFIER;
-        break;
-      }
-      if(m->length){
-        add_ss(v_plci,FTY,m);
-        sig_req(v_plci,TEL_CTRL,0);
-        send_req(v_plci);
-      }
-      else Info = _WRONG_MESSAGE_FORMAT;
-
-      break;
-
-    case _DI_OPTIONS_REQUEST:
-      if(api_parse(&m->info[1],(word)m->length,"d",m_parms)) {
-        Info = _WRONG_MESSAGE_FORMAT;
-        break;
-      }
-      if (GET_DWORD (m_parms[0].info) & ~a->man_profile.private_options)
-      {
-        Info = _FACILITY_NOT_SUPPORTED;
-        break;
-      }
-      a->requested_options_table[appl->Id-1] = GET_DWORD (m_parms[0].info);
-      break;
-
-
-
-    default:
-      Info = _WRONG_MESSAGE_FORMAT;
-      break;
-    }
-  }
-
-  sendf(appl,
-        _MANUFACTURER_R|CONFIRM,
-        Id,
-        Number,
-        "dww",_DI_MANU_ID,command,Info);
-  return false;
+       word command;
+       word i;
+       word ncci;
+       API_PARSE *m;
+       API_PARSE m_parms[5];
+       word codec;
+       byte req;
+       byte ch;
+       byte dir;
+       static byte chi[2] = {0x01, 0x00};
+       static byte lli[2] = {0x01, 0x00};
+       static byte codec_cai[2] = {0x01, 0x01};
+       static byte null_msg = {0};
+       static API_PARSE null_parms = { 0, &null_msg };
+       PLCI *v_plci;
+       word Info = 0;
+
+       dbug(1, dprintf("manufacturer_req"));
+       for (i = 0; i < 5; i++) m_parms[i].length = 0;
+
+       if (GET_DWORD(parms[0].info) != _DI_MANU_ID) {
+               Info = _WRONG_MESSAGE_FORMAT;
+       }
+       command = GET_WORD(parms[1].info);
+       m = &parms[2];
+       if (!Info)
+       {
+               switch (command) {
+               case _DI_ASSIGN_PLCI:
+                       if (api_parse(&m->info[1], (word)m->length, "wbbs", m_parms)) {
+                               Info = _WRONG_MESSAGE_FORMAT;
+                               break;
+                       }
+                       codec = GET_WORD(m_parms[0].info);
+                       ch = m_parms[1].info[0];
+                       dir = m_parms[2].info[0];
+                       if ((i = get_plci(a))) {
+                               plci = &a->plci[i - 1];
+                               plci->appl = appl;
+                               plci->command = _MANUFACTURER_R;
+                               plci->m_command = command;
+                               plci->number = Number;
+                               plci->State = LOCAL_CONNECT;
+                               Id = (((word)plci->Id << 8) | plci->adapter->Id | 0x80);
+                               dbug(1, dprintf("ManCMD,plci=0x%x", Id));
+
+                               if ((ch == 1 || ch == 2) && (dir <= 2)) {
+                                       chi[1] = (byte)(0x80 | ch);
+                                       lli[1] = 0;
+                                       plci->call_dir = CALL_DIR_OUT | CALL_DIR_ORIGINATE;
+                                       switch (codec)
+                                       {
+                                       case 0:
+                                               Info = add_b1(plci, &m_parms[3], 0, 0);
+                                               break;
+                                       case 1:
+                                               add_p(plci, CAI, codec_cai);
+                                               break;
+                                               /* manual 'swich on' to the codec support without signalling */
+                                               /* first 'assign plci' with this function, then use */
+                                       case 2:
+                                               if (AdvCodecSupport(a, plci, appl, 0)) {
+                                                       Info = _RESOURCE_ERROR;
+                                               }
+                                               else {
+                                                       Info = add_b1(plci, &null_parms, 0, B1_FACILITY_LOCAL);
+                                                       lli[1] = 0x10; /* local call codec stream */
+                                               }
+                                               break;
+                                       }
+
+                                       plci->State = LOCAL_CONNECT;
+                                       plci->manufacturer = true;
+                                       plci->command = _MANUFACTURER_R;
+                                       plci->m_command = command;
+                                       plci->number = Number;
+
+                                       if (!Info)
+                                       {
+                                               add_p(plci, LLI, lli);
+                                               add_p(plci, CHI, chi);
+                                               add_p(plci, UID, "\x06\x43\x61\x70\x69\x32\x30");
+                                               sig_req(plci, ASSIGN, DSIG_ID);
+
+                                               if (!codec)
+                                               {
+                                                       Info = add_b23(plci, &m_parms[3]);
+                                                       if (!Info)
+                                                       {
+                                                               nl_req_ncci(plci, ASSIGN, 0);
+                                                               send_req(plci);
+                                                       }
+                                               }
+                                               if (!Info)
+                                               {
+                                                       dbug(1, dprintf("dir=0x%x,spoof=0x%x", dir, plci->spoofed_msg));
+                                                       if (plci->spoofed_msg == SPOOFING_REQUIRED)
+                                                       {
+                                                               api_save_msg(m_parms, "wbbs", &plci->saved_msg);
+                                                               plci->spoofed_msg = AWAITING_MANUF_CON;
+                                                               plci->internal_command = BLOCK_PLCI; /* reject other req meanwhile */
+                                                               plci->command = 0;
+                                                               send_req(plci);
+                                                               return false;
+                                                       }
+                                                       if (dir == 1) {
+                                                               sig_req(plci, CALL_REQ, 0);
+                                                       }
+                                                       else if (!dir) {
+                                                               sig_req(plci, LISTEN_REQ, 0);
+                                                       }
+                                                       send_req(plci);
+                                               }
+                                               else
+                                               {
+                                                       sendf(appl,
+                                                             _MANUFACTURER_R | CONFIRM,
+                                                             Id,
+                                                             Number,
+                                                             "dww", _DI_MANU_ID, command, Info);
+                                                       return 2;
+                                               }
+                                       }
+                               }
+                       }
+                       else  Info = _OUT_OF_PLCI;
+                       break;
+
+               case _DI_IDI_CTRL:
+                       if (!plci)
+                       {
+                               Info = _WRONG_IDENTIFIER;
+                               break;
+                       }
+                       if (api_parse(&m->info[1], (word)m->length, "bs", m_parms)) {
+                               Info = _WRONG_MESSAGE_FORMAT;
+                               break;
+                       }
+                       req = m_parms[0].info[0];
+                       plci->command = _MANUFACTURER_R;
+                       plci->m_command = command;
+                       plci->number = Number;
+                       if (req == CALL_REQ)
+                       {
+                               plci->b_channel = getChannel(&m_parms[1]);
+                               mixer_set_bchannel_id_esc(plci, plci->b_channel);
+                               if (plci->spoofed_msg == SPOOFING_REQUIRED)
+                               {
+                                       plci->spoofed_msg = CALL_REQ | AWAITING_MANUF_CON;
+                                       plci->internal_command = BLOCK_PLCI; /* reject other req meanwhile */
+                                       plci->command = 0;
+                                       break;
+                               }
+                       }
+                       else if (req == LAW_REQ)
+                       {
+                               plci->cr_enquiry = true;
+                       }
+                       add_ss(plci, FTY, &m_parms[1]);
+                       sig_req(plci, req, 0);
+                       send_req(plci);
+                       if (req == HANGUP)
+                       {
+                               if (plci->NL.Id && !plci->nl_remove_id)
+                               {
+                                       if (plci->channels)
+                                       {
+                                               for (ncci = 1; ncci < MAX_NCCI + 1; ncci++)
+                                               {
+                                                       if ((a->ncci_plci[ncci] == plci->Id) && (a->ncci_state[ncci] == CONNECTED))
+                                                       {
+                                                               a->ncci_state[ncci] = OUTG_DIS_PENDING;
+                                                               cleanup_ncci_data(plci, ncci);
+                                                               nl_req_ncci(plci, N_DISC, (byte)ncci);
+                                                       }
+                                               }
+                                       }
+                                       mixer_remove(plci);
+                                       nl_req_ncci(plci, REMOVE, 0);
+                                       send_req(plci);
+                               }
+                       }
+                       break;
+
+               case _DI_SIG_CTRL:
+                       /* signalling control for loop activation B-channel */
+                       if (!plci)
+                       {
+                               Info = _WRONG_IDENTIFIER;
+                               break;
+                       }
+                       if (m->length) {
+                               plci->command = _MANUFACTURER_R;
+                               plci->number = Number;
+                               add_ss(plci, FTY, m);
+                               sig_req(plci, SIG_CTRL, 0);
+                               send_req(plci);
+                       }
+                       else Info = _WRONG_MESSAGE_FORMAT;
+                       break;
+
+               case _DI_RXT_CTRL:
+                       /* activation control for receiver/transmitter B-channel */
+                       if (!plci)
+                       {
+                               Info = _WRONG_IDENTIFIER;
+                               break;
+                       }
+                       if (m->length) {
+                               plci->command = _MANUFACTURER_R;
+                               plci->number = Number;
+                               add_ss(plci, FTY, m);
+                               sig_req(plci, DSP_CTRL, 0);
+                               send_req(plci);
+                       }
+                       else Info = _WRONG_MESSAGE_FORMAT;
+                       break;
+
+               case _DI_ADV_CODEC:
+               case _DI_DSP_CTRL:
+                       /* TEL_CTRL commands to support non standard adjustments: */
+                       /* Ring on/off, Handset micro volume, external micro vol. */
+                       /* handset+external speaker volume, receiver+transm. gain,*/
+                       /* handsfree on (hookinfo off), set mixer command         */
+
+                       if (command == _DI_ADV_CODEC)
+                       {
+                               if (!a->AdvCodecPLCI) {
+                                       Info = _WRONG_STATE;
+                                       break;
+                               }
+                               v_plci = a->AdvCodecPLCI;
+                       }
+                       else
+                       {
+                               if (plci
+                                   && (m->length >= 3)
+                                   && (m->info[1] == 0x1c)
+                                   && (m->info[2] >= 1))
+                               {
+                                       if (m->info[3] == DSP_CTRL_OLD_SET_MIXER_COEFFICIENTS)
+                                       {
+                                               if ((plci->tel != ADV_VOICE) || (plci != a->AdvSignalPLCI))
+                                               {
+                                                       Info = _WRONG_STATE;
+                                                       break;
+                                               }
+                                               a->adv_voice_coef_length = m->info[2] - 1;
+                                               if (a->adv_voice_coef_length > m->length - 3)
+                                                       a->adv_voice_coef_length = (byte)(m->length - 3);
+                                               if (a->adv_voice_coef_length > ADV_VOICE_COEF_BUFFER_SIZE)
+                                                       a->adv_voice_coef_length = ADV_VOICE_COEF_BUFFER_SIZE;
+                                               for (i = 0; i < a->adv_voice_coef_length; i++)
+                                                       a->adv_voice_coef_buffer[i] = m->info[4 + i];
+                                               if (plci->B1_facilities & B1_FACILITY_VOICE)
+                                                       adv_voice_write_coefs(plci, ADV_VOICE_WRITE_UPDATE);
+                                               break;
+                                       }
+                                       else if (m->info[3] == DSP_CTRL_SET_DTMF_PARAMETERS)
+                                       {
+                                               if (!(a->manufacturer_features & MANUFACTURER_FEATURE_DTMF_PARAMETERS))
+                                               {
+                                                       Info = _FACILITY_NOT_SUPPORTED;
+                                                       break;
+                                               }
+
+                                               plci->dtmf_parameter_length = m->info[2] - 1;
+                                               if (plci->dtmf_parameter_length > m->length - 3)
+                                                       plci->dtmf_parameter_length = (byte)(m->length - 3);
+                                               if (plci->dtmf_parameter_length > DTMF_PARAMETER_BUFFER_SIZE)
+                                                       plci->dtmf_parameter_length = DTMF_PARAMETER_BUFFER_SIZE;
+                                               for (i = 0; i < plci->dtmf_parameter_length; i++)
+                                                       plci->dtmf_parameter_buffer[i] = m->info[4 + i];
+                                               if (plci->B1_facilities & B1_FACILITY_DTMFR)
+                                                       dtmf_parameter_write(plci);
+                                               break;
+
+                                       }
+                               }
+                               v_plci = plci;
+                       }
+
+                       if (!v_plci)
+                       {
+                               Info = _WRONG_IDENTIFIER;
+                               break;
+                       }
+                       if (m->length) {
+                               add_ss(v_plci, FTY, m);
+                               sig_req(v_plci, TEL_CTRL, 0);
+                               send_req(v_plci);
+                       }
+                       else Info = _WRONG_MESSAGE_FORMAT;
+
+                       break;
+
+               case _DI_OPTIONS_REQUEST:
+                       if (api_parse(&m->info[1], (word)m->length, "d", m_parms)) {
+                               Info = _WRONG_MESSAGE_FORMAT;
+                               break;
+                       }
+                       if (GET_DWORD(m_parms[0].info) & ~a->man_profile.private_options)
+                       {
+                               Info = _FACILITY_NOT_SUPPORTED;
+                               break;
+                       }
+                       a->requested_options_table[appl->Id - 1] = GET_DWORD(m_parms[0].info);
+                       break;
+
+
+
+               default:
+                       Info = _WRONG_MESSAGE_FORMAT;
+                       break;
+               }
+       }
+
+       sendf(appl,
+             _MANUFACTURER_R | CONFIRM,
+             Id,
+             Number,
+             "dww", _DI_MANU_ID, command, Info);
+       return false;
 }
 
 
 static byte manufacturer_res(dword Id, word Number, DIVA_CAPI_ADAPTER *a,
                             PLCI *plci, APPL *appl, API_PARSE *msg)
 {
-  word indication;
-
-    API_PARSE m_parms[3];
-  API_PARSE *ncpi;
-    API_PARSE fax_parms[9];
-  word i;
-  byte len;
-
-
-  dbug(1,dprintf("manufacturer_res"));
-
-  if ((msg[0].length == 0)
-   || (msg[1].length == 0)
-   || (GET_DWORD(msg[0].info)!=_DI_MANU_ID))
-  {
-    return false;
-  }
-  indication = GET_WORD(msg[1].info);
-  switch (indication)
-  {
-
-  case _DI_NEGOTIATE_B3:
-    if(!plci)
-      break;
-    if (((plci->B3_prot != 4) && (plci->B3_prot != 5))
-     || !(plci->ncpi_state & NCPI_NEGOTIATE_B3_SENT))
-    {
-      dbug(1,dprintf("wrong state for NEGOTIATE_B3 parameters"));
-      break;
-    }
-    if (api_parse (&msg[2].info[1], msg[2].length, "ws", m_parms))
-    {
-      dbug(1,dprintf("wrong format in NEGOTIATE_B3 parameters"));
-      break;
-    }
-    ncpi = &m_parms[1];
-    len = offsetof(T30_INFO, station_id) + T30_MAX_STATION_ID_LENGTH;
-    if (plci->fax_connect_info_length < len)
-    {
-      ((T30_INFO *)(plci->fax_connect_info_buffer))->station_id_len = 0;
-      ((T30_INFO *)(plci->fax_connect_info_buffer))->head_line_len = 0;
-    }
-    if (api_parse (&ncpi->info[1], ncpi->length, "wwwwssss", fax_parms))
-    {
-      dbug(1,dprintf("non-standard facilities info missing or wrong format"));
-    }
-    else
-    {
-      if (plci->fax_connect_info_length <= len)
-        plci->fax_connect_info_buffer[len] = 0;
-      len += 1 + plci->fax_connect_info_buffer[len];
-      if (plci->fax_connect_info_length <= len)
-        plci->fax_connect_info_buffer[len] = 0;
-      len += 1 + plci->fax_connect_info_buffer[len];
-      if ((fax_parms[7].length >= 3) && (fax_parms[7].info[1] >= 2))
-        plci->nsf_control_bits = GET_WORD(&fax_parms[7].info[2]);
-      plci->fax_connect_info_buffer[len++] = (byte)(fax_parms[7].length);
-      for (i = 0; i < fax_parms[7].length; i++)
-        plci->fax_connect_info_buffer[len++] = fax_parms[7].info[1+i];
-    }
-    plci->fax_connect_info_length = len;
-    plci->fax_edata_ack_length = plci->fax_connect_info_length;
-    start_internal_command (Id, plci, fax_edata_ack_command);
-    break;
-
-  }
-  return false;
+       word indication;
+
+       API_PARSE m_parms[3];
+       API_PARSE *ncpi;
+       API_PARSE fax_parms[9];
+       word i;
+       byte len;
+
+
+       dbug(1, dprintf("manufacturer_res"));
+
+       if ((msg[0].length == 0)
+           || (msg[1].length == 0)
+           || (GET_DWORD(msg[0].info) != _DI_MANU_ID))
+       {
+               return false;
+       }
+       indication = GET_WORD(msg[1].info);
+       switch (indication)
+       {
+
+       case _DI_NEGOTIATE_B3:
+               if (!plci)
+                       break;
+               if (((plci->B3_prot != 4) && (plci->B3_prot != 5))
+                   || !(plci->ncpi_state & NCPI_NEGOTIATE_B3_SENT))
+               {
+                       dbug(1, dprintf("wrong state for NEGOTIATE_B3 parameters"));
+                       break;
+               }
+               if (api_parse(&msg[2].info[1], msg[2].length, "ws", m_parms))
+               {
+                       dbug(1, dprintf("wrong format in NEGOTIATE_B3 parameters"));
+                       break;
+               }
+               ncpi = &m_parms[1];
+               len = offsetof(T30_INFO, station_id) + T30_MAX_STATION_ID_LENGTH;
+               if (plci->fax_connect_info_length < len)
+               {
+                       ((T30_INFO *)(plci->fax_connect_info_buffer))->station_id_len = 0;
+                       ((T30_INFO *)(plci->fax_connect_info_buffer))->head_line_len = 0;
+               }
+               if (api_parse(&ncpi->info[1], ncpi->length, "wwwwssss", fax_parms))
+               {
+                       dbug(1, dprintf("non-standard facilities info missing or wrong format"));
+               }
+               else
+               {
+                       if (plci->fax_connect_info_length <= len)
+                               plci->fax_connect_info_buffer[len] = 0;
+                       len += 1 + plci->fax_connect_info_buffer[len];
+                       if (plci->fax_connect_info_length <= len)
+                               plci->fax_connect_info_buffer[len] = 0;
+                       len += 1 + plci->fax_connect_info_buffer[len];
+                       if ((fax_parms[7].length >= 3) && (fax_parms[7].info[1] >= 2))
+                               plci->nsf_control_bits = GET_WORD(&fax_parms[7].info[2]);
+                       plci->fax_connect_info_buffer[len++] = (byte)(fax_parms[7].length);
+                       for (i = 0; i < fax_parms[7].length; i++)
+                               plci->fax_connect_info_buffer[len++] = fax_parms[7].info[1 + i];
+               }
+               plci->fax_connect_info_length = len;
+               plci->fax_edata_ack_length = plci->fax_connect_info_length;
+               start_internal_command(Id, plci, fax_edata_ack_command);
+               break;
+
+       }
+       return false;
 }
 
 /*------------------------------------------------------------------*/
 /* IDI callback function                                            */
 /*------------------------------------------------------------------*/
 
-void   callback(ENTITY   * e)
-{
-  DIVA_CAPI_ADAPTER   * a;
-  APPL   * appl;
-  PLCI   * plci;
-  CAPI_MSG   *m;
-  word i, j;
-  byte rc;
-  byte ch;
-  byte req;
-  byte global_req;
-  int no_cancel_rc;
-
-  dbug(1,dprintf("%x:CB(%x:Req=%x,Rc=%x,Ind=%x)",
-                 (e->user[0]+1)&0x7fff,e->Id,e->Req,e->Rc,e->Ind));
-
-  a = &(adapter[(byte)e->user[0]]);
-  plci = &(a->plci[e->user[1]]);
-  no_cancel_rc = DIVA_CAPI_SUPPORTS_NO_CANCEL(a);
-
-  /*
-     If new protocol code and new XDI is used then CAPI should work
-     fully in accordance with IDI cpec an look on callback field instead
-     of Rc field for return codes.
-   */
-  if (((e->complete == 0xff) && no_cancel_rc) ||
-      (e->Rc && !no_cancel_rc)) {
-    rc = e->Rc;
-    ch = e->RcCh;
-    req = e->Req;
-    e->Rc = 0;
-
-    if (e->user[0] & 0x8000)
-    {
-      /*
-         If REMOVE request was sent then we have to wait until
-         return code with Id set to zero arrives.
-         All other return codes should be ignored.
-         */
-      if (req == REMOVE)
-      {
-        if (e->Id)
-        {
-          dbug(1,dprintf("cancel RC in REMOVE state"));
-          return;
-        }
-        channel_flow_control_remove (plci);
-        for (i = 0; i < 256; i++)
-        {
-          if (a->FlowControlIdTable[i] == plci->nl_remove_id)
-            a->FlowControlIdTable[i] = 0;
-        }
-        plci->nl_remove_id = 0;
-        if (plci->rx_dma_descriptor > 0) {
-          diva_free_dma_descriptor (plci, plci->rx_dma_descriptor - 1);
-          plci->rx_dma_descriptor = 0;
-        }
-      }
-      if (rc == OK_FC)
-      {
-        a->FlowControlIdTable[ch] = e->Id;
-        a->FlowControlSkipTable[ch] = 0;
-
-        a->ch_flow_control[ch] |= N_OK_FC_PENDING;
-        a->ch_flow_plci[ch] = plci->Id;
-        plci->nl_req = 0;
-      }
-      else
-      {
-        /*
-          Cancel return codes self, if feature was requested
-          */
-        if (no_cancel_rc && (a->FlowControlIdTable[ch] == e->Id) && e->Id) {
-          a->FlowControlIdTable[ch] = 0;
-          if ((rc == OK) && a->FlowControlSkipTable[ch]) {
-            dbug(3,dprintf ("XDI CAPI: RC cancelled Id:0x02, Ch:%02x",                              e->Id, ch));
-            return;
-          }
-        }
-
-        if (a->ch_flow_control[ch] & N_OK_FC_PENDING)
-        {
-          a->ch_flow_control[ch] &= ~N_OK_FC_PENDING;
-          if (ch == e->ReqCh)
-            plci->nl_req = 0;
-        }
-        else
-          plci->nl_req = 0;
-      }
-      if (plci->nl_req)
-        control_rc (plci, 0, rc, ch, 0, true);
-      else
-      {
-        if (req == N_XON)
-        {
-          channel_x_on (plci, ch);
-          if (plci->internal_command)
-            control_rc (plci, req, rc, ch, 0, true);
-        }
-        else
-        {
-          if (plci->nl_global_req)
-          {
-            global_req = plci->nl_global_req;
-            plci->nl_global_req = 0;
-            if (rc != ASSIGN_OK) {
-              e->Id = 0;
-              if (plci->rx_dma_descriptor > 0) {
-                diva_free_dma_descriptor (plci, plci->rx_dma_descriptor - 1);
-                plci->rx_dma_descriptor = 0;
-              }
-            }
-            channel_xmit_xon (plci);
-            control_rc (plci, 0, rc, ch, global_req, true);
-          }
-          else if (plci->data_sent)
-          {
-            channel_xmit_xon (plci);
-            plci->data_sent = false;
-            plci->NL.XNum = 1;
-            data_rc (plci, ch);
-            if (plci->internal_command)
-              control_rc (plci, req, rc, ch, 0, true);
-          }
-          else
-          {
-            channel_xmit_xon (plci);
-            control_rc (plci, req, rc, ch, 0, true);
-          }
-        }
-      }
-    }
-    else
-    {
-      /*
-         If REMOVE request was sent then we have to wait until
-         return code with Id set to zero arrives.
-         All other return codes should be ignored.
-         */
-      if (req == REMOVE)
-      {
-        if (e->Id)
-        {
-          dbug(1,dprintf("cancel RC in REMOVE state"));
-          return;
-        }
-        plci->sig_remove_id = 0;
-      }
-      plci->sig_req = 0;
-      if (plci->sig_global_req)
-      {
-        global_req = plci->sig_global_req;
-        plci->sig_global_req = 0;
-        if (rc != ASSIGN_OK)
-          e->Id = 0;
-        channel_xmit_xon (plci);
-        control_rc (plci, 0, rc, ch, global_req, false);
-      }
-      else
-      {
-        channel_xmit_xon (plci);
-        control_rc (plci, req, rc, ch, 0, false);
-      }
-    }
-    /*
-      Again: in accordance with IDI spec Rc and Ind can't be delivered in the
-      same callback. Also if new XDI and protocol code used then jump
-      direct to finish.
-      */
-    if (no_cancel_rc) {
-      channel_xmit_xon(plci);
-      goto capi_callback_suffix;
-    }
-  }
-
-  channel_xmit_xon(plci);
-
-  if (e->Ind) {
-    if (e->user[0] &0x8000) {
-      byte Ind = e->Ind & 0x0f;
-      byte Ch = e->IndCh;
-      if (((Ind==N_DISC) || (Ind==N_DISC_ACK)) &&
-          (a->ch_flow_plci[Ch] == plci->Id)) {
-        if (a->ch_flow_control[Ch] & N_RX_FLOW_CONTROL_MASK) {
-          dbug(3,dprintf ("XDI CAPI: I: pending N-XON Ch:%02x", Ch));
-        }
-        a->ch_flow_control[Ch] &= ~N_RX_FLOW_CONTROL_MASK;
-      }
-      nl_ind(plci);
-      if ((e->RNR != 1) &&
-          (a->ch_flow_plci[Ch] == plci->Id) &&
-          (a->ch_flow_control[Ch] & N_RX_FLOW_CONTROL_MASK)) {
-        a->ch_flow_control[Ch] &= ~N_RX_FLOW_CONTROL_MASK;
-        dbug(3,dprintf ("XDI CAPI: I: remove faked N-XON Ch:%02x", Ch));
-      }
-    } else {
-      sig_ind(plci);
-    }
-    e->Ind = 0;
-  }
+void callback(ENTITY *e)
+{
+       DIVA_CAPI_ADAPTER *a;
+       APPL *appl;
+       PLCI *plci;
+       CAPI_MSG *m;
+       word i, j;
+       byte rc;
+       byte ch;
+       byte req;
+       byte global_req;
+       int no_cancel_rc;
+
+       dbug(1, dprintf("%x:CB(%x:Req=%x,Rc=%x,Ind=%x)",
+                       (e->user[0] + 1) & 0x7fff, e->Id, e->Req, e->Rc, e->Ind));
+
+       a = &(adapter[(byte)e->user[0]]);
+       plci = &(a->plci[e->user[1]]);
+       no_cancel_rc = DIVA_CAPI_SUPPORTS_NO_CANCEL(a);
+
+       /*
+         If new protocol code and new XDI is used then CAPI should work
+         fully in accordance with IDI cpec an look on callback field instead
+         of Rc field for return codes.
+       */
+       if (((e->complete == 0xff) && no_cancel_rc) ||
+           (e->Rc && !no_cancel_rc)) {
+               rc = e->Rc;
+               ch = e->RcCh;
+               req = e->Req;
+               e->Rc = 0;
+
+               if (e->user[0] & 0x8000)
+               {
+                       /*
+                         If REMOVE request was sent then we have to wait until
+                         return code with Id set to zero arrives.
+                         All other return codes should be ignored.
+                       */
+                       if (req == REMOVE)
+                       {
+                               if (e->Id)
+                               {
+                                       dbug(1, dprintf("cancel RC in REMOVE state"));
+                                       return;
+                               }
+                               channel_flow_control_remove(plci);
+                               for (i = 0; i < 256; i++)
+                               {
+                                       if (a->FlowControlIdTable[i] == plci->nl_remove_id)
+                                               a->FlowControlIdTable[i] = 0;
+                               }
+                               plci->nl_remove_id = 0;
+                               if (plci->rx_dma_descriptor > 0) {
+                                       diva_free_dma_descriptor(plci, plci->rx_dma_descriptor - 1);
+                                       plci->rx_dma_descriptor = 0;
+                               }
+                       }
+                       if (rc == OK_FC)
+                       {
+                               a->FlowControlIdTable[ch] = e->Id;
+                               a->FlowControlSkipTable[ch] = 0;
+
+                               a->ch_flow_control[ch] |= N_OK_FC_PENDING;
+                               a->ch_flow_plci[ch] = plci->Id;
+                               plci->nl_req = 0;
+                       }
+                       else
+                       {
+                               /*
+                                 Cancel return codes self, if feature was requested
+                               */
+                               if (no_cancel_rc && (a->FlowControlIdTable[ch] == e->Id) && e->Id) {
+                                       a->FlowControlIdTable[ch] = 0;
+                                       if ((rc == OK) && a->FlowControlSkipTable[ch]) {
+                                               dbug(3, dprintf("XDI CAPI: RC cancelled Id:0x02, Ch:%02x", e->Id, ch));
+                                               return;
+                                       }
+                               }
+
+                               if (a->ch_flow_control[ch] & N_OK_FC_PENDING)
+                               {
+                                       a->ch_flow_control[ch] &= ~N_OK_FC_PENDING;
+                                       if (ch == e->ReqCh)
+                                               plci->nl_req = 0;
+                               }
+                               else
+                                       plci->nl_req = 0;
+                       }
+                       if (plci->nl_req)
+                               control_rc(plci, 0, rc, ch, 0, true);
+                       else
+                       {
+                               if (req == N_XON)
+                               {
+                                       channel_x_on(plci, ch);
+                                       if (plci->internal_command)
+                                               control_rc(plci, req, rc, ch, 0, true);
+                               }
+                               else
+                               {
+                                       if (plci->nl_global_req)
+                                       {
+                                               global_req = plci->nl_global_req;
+                                               plci->nl_global_req = 0;
+                                               if (rc != ASSIGN_OK) {
+                                                       e->Id = 0;
+                                                       if (plci->rx_dma_descriptor > 0) {
+                                                               diva_free_dma_descriptor(plci, plci->rx_dma_descriptor - 1);
+                                                               plci->rx_dma_descriptor = 0;
+                                                       }
+                                               }
+                                               channel_xmit_xon(plci);
+                                               control_rc(plci, 0, rc, ch, global_req, true);
+                                       }
+                                       else if (plci->data_sent)
+                                       {
+                                               channel_xmit_xon(plci);
+                                               plci->data_sent = false;
+                                               plci->NL.XNum = 1;
+                                               data_rc(plci, ch);
+                                               if (plci->internal_command)
+                                                       control_rc(plci, req, rc, ch, 0, true);
+                                       }
+                                       else
+                                       {
+                                               channel_xmit_xon(plci);
+                                               control_rc(plci, req, rc, ch, 0, true);
+                                       }
+                               }
+                       }
+               }
+               else
+               {
+                       /*
+                         If REMOVE request was sent then we have to wait until
+                         return code with Id set to zero arrives.
+                         All other return codes should be ignored.
+                       */
+                       if (req == REMOVE)
+                       {
+                               if (e->Id)
+                               {
+                                       dbug(1, dprintf("cancel RC in REMOVE state"));
+                                       return;
+                               }
+                               plci->sig_remove_id = 0;
+                       }
+                       plci->sig_req = 0;
+                       if (plci->sig_global_req)
+                       {
+                               global_req = plci->sig_global_req;
+                               plci->sig_global_req = 0;
+                               if (rc != ASSIGN_OK)
+                                       e->Id = 0;
+                               channel_xmit_xon(plci);
+                               control_rc(plci, 0, rc, ch, global_req, false);
+                       }
+                       else
+                       {
+                               channel_xmit_xon(plci);
+                               control_rc(plci, req, rc, ch, 0, false);
+                       }
+               }
+               /*
+                 Again: in accordance with IDI spec Rc and Ind can't be delivered in the
+                 same callback. Also if new XDI and protocol code used then jump
+                 direct to finish.
+               */
+               if (no_cancel_rc) {
+                       channel_xmit_xon(plci);
+                       goto capi_callback_suffix;
+               }
+       }
+
+       channel_xmit_xon(plci);
+
+       if (e->Ind) {
+               if (e->user[0] & 0x8000) {
+                       byte Ind = e->Ind & 0x0f;
+                       byte Ch = e->IndCh;
+                       if (((Ind == N_DISC) || (Ind == N_DISC_ACK)) &&
+                           (a->ch_flow_plci[Ch] == plci->Id)) {
+                               if (a->ch_flow_control[Ch] & N_RX_FLOW_CONTROL_MASK) {
+                                       dbug(3, dprintf("XDI CAPI: I: pending N-XON Ch:%02x", Ch));
+                               }
+                               a->ch_flow_control[Ch] &= ~N_RX_FLOW_CONTROL_MASK;
+                       }
+                       nl_ind(plci);
+                       if ((e->RNR != 1) &&
+                           (a->ch_flow_plci[Ch] == plci->Id) &&
+                           (a->ch_flow_control[Ch] & N_RX_FLOW_CONTROL_MASK)) {
+                               a->ch_flow_control[Ch] &= ~N_RX_FLOW_CONTROL_MASK;
+                               dbug(3, dprintf("XDI CAPI: I: remove faked N-XON Ch:%02x", Ch));
+                       }
+               } else {
+                       sig_ind(plci);
+               }
+               e->Ind = 0;
+       }
 
 capi_callback_suffix:
 
-  while (!plci->req_in
-   && !plci->internal_command
-   && (plci->msg_in_write_pos != plci->msg_in_read_pos))
-  {
-    j = (plci->msg_in_read_pos == plci->msg_in_wrap_pos) ? 0 : plci->msg_in_read_pos;
-
-    i = (((CAPI_MSG   *)(&((byte   *)(plci->msg_in_queue))[j]))->header.length + 3) & 0xfffc;
-
-    m = (CAPI_MSG   *)(&((byte   *)(plci->msg_in_queue))[j]);
-    appl = *((APPL   *   *)(&((byte   *)(plci->msg_in_queue))[j+i]));
-    dbug(1,dprintf("dequeue msg(0x%04x) - write=%d read=%d wrap=%d",
-      m->header.command, plci->msg_in_write_pos, plci->msg_in_read_pos, plci->msg_in_wrap_pos));
-    if (plci->msg_in_read_pos == plci->msg_in_wrap_pos)
-    {
-      plci->msg_in_wrap_pos = MSG_IN_QUEUE_SIZE;
-      plci->msg_in_read_pos = i + MSG_IN_OVERHEAD;
-    }
-    else
-    {
-      plci->msg_in_read_pos = j + i + MSG_IN_OVERHEAD;
-    }
-    if (plci->msg_in_read_pos == plci->msg_in_write_pos)
-    {
-      plci->msg_in_write_pos = MSG_IN_QUEUE_SIZE;
-      plci->msg_in_read_pos = MSG_IN_QUEUE_SIZE;
-    }
-    else if (plci->msg_in_read_pos == plci->msg_in_wrap_pos)
-    {
-      plci->msg_in_read_pos = MSG_IN_QUEUE_SIZE;
-      plci->msg_in_wrap_pos = MSG_IN_QUEUE_SIZE;
-    }
-    i = api_put (appl, m);
-    if (i != 0)
-    {
-      if (m->header.command == _DATA_B3_R)
-
-        TransmitBufferFree (appl, (byte *)(long)(m->info.data_b3_req.Data));
-
-      dbug(1,dprintf("Error 0x%04x from msg(0x%04x)", i, m->header.command));
-      break;
-    }
-
-    if (plci->li_notify_update)
-    {
-      plci->li_notify_update = false;
-      mixer_notify_update (plci, false);
-    }
-
-  }
-  send_data(plci);
-  send_req(plci);
+       while (!plci->req_in
+              && !plci->internal_command
+              && (plci->msg_in_write_pos != plci->msg_in_read_pos))
+       {
+               j = (plci->msg_in_read_pos == plci->msg_in_wrap_pos) ? 0 : plci->msg_in_read_pos;
+
+               i = (((CAPI_MSG *)(&((byte *)(plci->msg_in_queue))[j]))->header.length + 3) & 0xfffc;
+
+               m = (CAPI_MSG *)(&((byte *)(plci->msg_in_queue))[j]);
+               appl = *((APPL **)(&((byte *)(plci->msg_in_queue))[j + i]));
+               dbug(1, dprintf("dequeue msg(0x%04x) - write=%d read=%d wrap=%d",
+                               m->header.command, plci->msg_in_write_pos, plci->msg_in_read_pos, plci->msg_in_wrap_pos));
+               if (plci->msg_in_read_pos == plci->msg_in_wrap_pos)
+               {
+                       plci->msg_in_wrap_pos = MSG_IN_QUEUE_SIZE;
+                       plci->msg_in_read_pos = i + MSG_IN_OVERHEAD;
+               }
+               else
+               {
+                       plci->msg_in_read_pos = j + i + MSG_IN_OVERHEAD;
+               }
+               if (plci->msg_in_read_pos == plci->msg_in_write_pos)
+               {
+                       plci->msg_in_write_pos = MSG_IN_QUEUE_SIZE;
+                       plci->msg_in_read_pos = MSG_IN_QUEUE_SIZE;
+               }
+               else if (plci->msg_in_read_pos == plci->msg_in_wrap_pos)
+               {
+                       plci->msg_in_read_pos = MSG_IN_QUEUE_SIZE;
+                       plci->msg_in_wrap_pos = MSG_IN_QUEUE_SIZE;
+               }
+               i = api_put(appl, m);
+               if (i != 0)
+               {
+                       if (m->header.command == _DATA_B3_R)
+
+                               TransmitBufferFree(appl, (byte *)(long)(m->info.data_b3_req.Data));
+
+                       dbug(1, dprintf("Error 0x%04x from msg(0x%04x)", i, m->header.command));
+                       break;
+               }
+
+               if (plci->li_notify_update)
+               {
+                       plci->li_notify_update = false;
+                       mixer_notify_update(plci, false);
+               }
+
+       }
+       send_data(plci);
+       send_req(plci);
 }
 
 
 static void control_rc(PLCI *plci, byte req, byte rc, byte ch, byte global_req,
                       byte nl_rc)
 {
-  dword Id;
-  dword rId;
-  word Number;
-  word Info=0;
-  word i;
-  word ncci;
-  DIVA_CAPI_ADAPTER   * a;
-  APPL   * appl;
-  PLCI   * rplci;
-    byte SSparms[]  = "\x05\x00\x00\x02\x00\x00";
-    byte SSstruct[] = "\x09\x00\x00\x06\x00\x00\x00\x00\x00\x00";
-
-  if (!plci) {
-    dbug(0,dprintf("A: control_rc, no plci %02x:%02x:%02x:%02x:%02x", req, rc, ch, global_req, nl_rc));
-    return;
-  }
-  dbug(1,dprintf("req0_in/out=%d/%d",plci->req_in,plci->req_out));
-  if(plci->req_in!=plci->req_out)
-  {
-    if (nl_rc || (global_req != ASSIGN) || (rc == ASSIGN_OK))
-    {
-      dbug(1,dprintf("req_1return"));
-      return;
-    }
-    /* cancel outstanding request on the PLCI after SIG ASSIGN failure */
-  }
-  plci->req_in = plci->req_in_start = plci->req_out = 0;
-  dbug(1,dprintf("control_rc"));
-
-  appl = plci->appl;
-  a = plci->adapter;
-  ncci = a->ch_ncci[ch];
-  if(appl)
-  {
-    Id = (((dword)(ncci ? ncci : ch)) << 16) | ((word)plci->Id << 8) | a->Id;
-    if(plci->tel && plci->SuppState!=CALL_HELD) Id|=EXT_CONTROLLER;
-    Number = plci->number;
-    dbug(1,dprintf("Contr_RC-Id=%08lx,plci=%x,tel=%x, entity=0x%x, command=0x%x, int_command=0x%x",Id,plci->Id,plci->tel,plci->Sig.Id,plci->command,plci->internal_command));
-    dbug(1,dprintf("channels=0x%x",plci->channels));
-    if (plci_remove_check(plci))
-      return;
-    if(req==REMOVE && rc==ASSIGN_OK)
-    {
-      sig_req(plci,HANGUP,0);
-      sig_req(plci,REMOVE,0);
-      send_req(plci);
-    }
-    if(plci->command)
-    {
-      switch(plci->command)
-      {
-      case C_HOLD_REQ:
-        dbug(1,dprintf("HoldRC=0x%x",rc));
-        SSparms[1] = (byte)S_HOLD;
-        if(rc!=OK)
-        {
-          plci->SuppState = IDLE;
-          Info = 0x2001;
-        }
-        sendf(appl,_FACILITY_R|CONFIRM,Id,Number,"wws",Info,3,SSparms);
-        break;
-
-      case C_RETRIEVE_REQ:
-        dbug(1,dprintf("RetrieveRC=0x%x",rc));
-        SSparms[1] = (byte)S_RETRIEVE;
-        if(rc!=OK)
-        {
-          plci->SuppState = CALL_HELD;
-          Info = 0x2001;
-        }
-        sendf(appl,_FACILITY_R|CONFIRM,Id,Number,"wws",Info,3,SSparms);
-        break;
-
-      case _INFO_R:
-        dbug(1,dprintf("InfoRC=0x%x",rc));
-        if(rc!=OK) Info=_WRONG_STATE;
-        sendf(appl,_INFO_R|CONFIRM,Id,Number,"w",Info);
-        break;
-
-      case _CONNECT_R:
-        dbug(1,dprintf("Connect_R=0x%x/0x%x/0x%x/0x%x",req,rc,global_req,nl_rc));
-        if (plci->State == INC_DIS_PENDING)
-          break;
-        if(plci->Sig.Id!=0xff)
-        {
-          if (((global_req == ASSIGN) && (rc != ASSIGN_OK))
-           || (!nl_rc && (req == CALL_REQ) && (rc != OK)))
-          {
-            dbug(1,dprintf("No more IDs/Call_Req failed"));
-            sendf(appl,_CONNECT_R|CONFIRM,Id&0xffL,Number,"w",_OUT_OF_PLCI);
-            plci_remove(plci);
-            plci->State = IDLE;
-            break;
-          }
-          if(plci->State!=LOCAL_CONNECT)plci->State = OUTG_CON_PENDING;
-          sendf(appl,_CONNECT_R|CONFIRM,Id,Number,"w",0);
-        }
-        else /* D-ch activation */
-        {
-          if (rc != ASSIGN_OK)
-          {
-            dbug(1,dprintf("No more IDs/X.25 Call_Req failed"));
-            sendf(appl,_CONNECT_R|CONFIRM,Id&0xffL,Number,"w",_OUT_OF_PLCI);
-            plci_remove(plci);
-            plci->State = IDLE;
-            break;
-          }
-          sendf(appl,_CONNECT_R|CONFIRM,Id,Number,"w",0);
-          sendf(plci->appl,_CONNECT_ACTIVE_I,Id,0,"sss","","","");
-          plci->State = INC_ACT_PENDING;
-        }
-        break;
-
-      case _CONNECT_I|RESPONSE:
-        if (plci->State != INC_DIS_PENDING)
-          plci->State = INC_CON_ACCEPT;
-        break;
-
-      case _DISCONNECT_R:
-        if (plci->State == INC_DIS_PENDING)
-          break;
-        if(plci->Sig.Id!=0xff)
-        {
-          plci->State = OUTG_DIS_PENDING;
-          sendf(appl,_DISCONNECT_R|CONFIRM,Id,Number,"w",0);
-        }
-        break;
-
-      case SUSPEND_REQ:
-        break;
-
-      case RESUME_REQ:
-        break;
-
-      case _CONNECT_B3_R:
-        if(rc!=OK)
-        {
-          sendf(appl,_CONNECT_B3_R|CONFIRM,Id,Number,"w",_WRONG_IDENTIFIER);
-          break;
-        }
-        ncci = get_ncci (plci, ch, 0);
-        Id = (Id & 0xffff) | (((dword) ncci) << 16);
-        plci->channels++;
-        if(req==N_RESET)
-        {
-          a->ncci_state[ncci] = INC_ACT_PENDING;
-          sendf(appl,_CONNECT_B3_R|CONFIRM,Id,Number,"w",0);
-          sendf(appl,_CONNECT_B3_ACTIVE_I,Id,0,"s","");
-        }
-        else
-        {
-          a->ncci_state[ncci] = OUTG_CON_PENDING;
-          sendf(appl,_CONNECT_B3_R|CONFIRM,Id,Number,"w",0);
-        }
-        break;
-
-      case _CONNECT_B3_I|RESPONSE:
-        break;
-
-      case _RESET_B3_R:
-/*        sendf(appl,_RESET_B3_R|CONFIRM,Id,Number,"w",0);*/
-        break;
-
-      case _DISCONNECT_B3_R:
-        sendf(appl,_DISCONNECT_B3_R|CONFIRM,Id,Number,"w",0);
-        break;
-
-      case _MANUFACTURER_R:
-        break;
-
-      case PERM_LIST_REQ:
-        if(rc!=OK)
-        {
-          Info = _WRONG_IDENTIFIER;
-          sendf(plci->appl,_CONNECT_R|CONFIRM,Id,Number,"w",Info);
-          plci_remove(plci);
-        }
-        else
-          sendf(plci->appl,_CONNECT_R|CONFIRM,Id,Number,"w",Info);
-        break;
-
-      default:
-        break;
-      }
-      plci->command = 0;
-    }
-    else if (plci->internal_command)
-    {
-      switch(plci->internal_command)
-      {
-      case BLOCK_PLCI:
-        return;
-
-      case GET_MWI_STATE:
-        if(rc==OK) /* command supported, wait for indication */
-        {
-          return;
-        }
-        plci_remove(plci);
-        break;
-
-        /* Get Supported Services */
-      case GETSERV_REQ_PEND:
-        if(rc==OK) /* command supported, wait for indication */
-        {
-          break;
-        }
-        PUT_DWORD(&SSstruct[6], MASK_TERMINAL_PORTABILITY);
-        sendf(appl, _FACILITY_R|CONFIRM, Id, Number, "wws",0,3,SSstruct);
-        plci_remove(plci);
-        break;
-
-      case INTERR_DIVERSION_REQ_PEND:      /* Interrogate Parameters        */
-      case INTERR_NUMBERS_REQ_PEND:
-      case CF_START_PEND:                  /* Call Forwarding Start pending */
-      case CF_STOP_PEND:                   /* Call Forwarding Stop pending  */
-      case CCBS_REQUEST_REQ_PEND:
-      case CCBS_DEACTIVATE_REQ_PEND:
-      case CCBS_INTERROGATE_REQ_PEND:
-        switch(plci->internal_command)
-        {
-          case INTERR_DIVERSION_REQ_PEND:
-            SSparms[1] = S_INTERROGATE_DIVERSION;
-            break;
-          case INTERR_NUMBERS_REQ_PEND:
-            SSparms[1] = S_INTERROGATE_NUMBERS;
-            break;
-          case CF_START_PEND:
-            SSparms[1] = S_CALL_FORWARDING_START;
-            break;
-          case CF_STOP_PEND:
-            SSparms[1] = S_CALL_FORWARDING_STOP;
-            break;
-          case CCBS_REQUEST_REQ_PEND:
-            SSparms[1] = S_CCBS_REQUEST;
-            break;
-          case CCBS_DEACTIVATE_REQ_PEND:
-            SSparms[1] = S_CCBS_DEACTIVATE;
-            break;
-          case CCBS_INTERROGATE_REQ_PEND:
-            SSparms[1] = S_CCBS_INTERROGATE;
-            break;
-        }
-        if(global_req==ASSIGN)
-        {
-          dbug(1,dprintf("AssignDiversion_RC=0x%x/0x%x",req,rc));
-          return;
-        }
-        if(!plci->appl) break;
-        if(rc==ISDN_GUARD_REJ)
-        {
-          Info = _CAPI_GUARD_ERROR;
-        }
-        else if(rc!=OK)
-        {
-          Info = _SUPPLEMENTARY_SERVICE_NOT_SUPPORTED;
-        }
-        sendf(plci->appl,_FACILITY_R|CONFIRM,Id&0x7,
-              plci->number,"wws",Info,(word)3,SSparms);
-        if(Info) plci_remove(plci);
-        break;
-
-        /* 3pty conference pending */
-      case PTY_REQ_PEND:
-        if(!plci->relatedPTYPLCI) break;
-        rplci = plci->relatedPTYPLCI;
-        SSparms[1] = plci->ptyState;
-        rId = ((word)rplci->Id<<8)|rplci->adapter->Id;
-        if(rplci->tel) rId|=EXT_CONTROLLER;
-        if(rc!=OK)
-        {
-          Info = 0x300E; /* not supported */
-          plci->relatedPTYPLCI = NULL;
-          plci->ptyState = 0;
-        }
-        sendf(rplci->appl,
-              _FACILITY_R|CONFIRM,
-              rId,
-              plci->number,
-              "wws",Info,(word)3,SSparms);
-        break;
-
-        /* Explicit Call Transfer pending */
-      case ECT_REQ_PEND:
-        dbug(1,dprintf("ECT_RC=0x%x/0x%x",req,rc));
-        if(!plci->relatedPTYPLCI) break;
-        rplci = plci->relatedPTYPLCI;
-        SSparms[1] = S_ECT;
-        rId = ((word)rplci->Id<<8)|rplci->adapter->Id;
-        if(rplci->tel) rId|=EXT_CONTROLLER;
-        if(rc!=OK)
-        {
-          Info = 0x300E; /* not supported */
-          plci->relatedPTYPLCI = NULL;
-          plci->ptyState = 0;
-        }
-        sendf(rplci->appl,
-              _FACILITY_R|CONFIRM,
-              rId,
-              plci->number,
-              "wws",Info,(word)3,SSparms);
-        break;
-
-      case _MANUFACTURER_R:
-        dbug(1,dprintf("_Manufacturer_R=0x%x/0x%x",req,rc));
-        if ((global_req == ASSIGN) && (rc != ASSIGN_OK))
-        {
-          dbug(1,dprintf("No more IDs"));
-          sendf(appl,_MANUFACTURER_R|CONFIRM,Id,Number,"dww",_DI_MANU_ID,_MANUFACTURER_R,_OUT_OF_PLCI);
-          plci_remove(plci);  /* after codec init, internal codec commands pending */
-        }
-        break;
-
-      case _CONNECT_R:
-        dbug(1,dprintf("_Connect_R=0x%x/0x%x",req,rc));
-        if ((global_req == ASSIGN) && (rc != ASSIGN_OK))
-        {
-          dbug(1,dprintf("No more IDs"));
-          sendf(appl,_CONNECT_R|CONFIRM,Id&0xffL,Number,"w",_OUT_OF_PLCI);
-          plci_remove(plci);  /* after codec init, internal codec commands pending */
-        }
-        break;
-
-      case PERM_COD_HOOK:                     /* finished with Hook_Ind */
-        return;
-
-      case PERM_COD_CALL:
-        dbug(1,dprintf("***Codec Connect_Pending A, Rc = 0x%x",rc));
-        plci->internal_command = PERM_COD_CONN_PEND;
-        return;
-
-      case PERM_COD_ASSIGN:
-        dbug(1,dprintf("***Codec Assign A, Rc = 0x%x",rc));
-        if(rc!=ASSIGN_OK) break;
-        sig_req(plci,CALL_REQ,0);
-        send_req(plci);
-        plci->internal_command = PERM_COD_CALL;
-        return;
-
-        /* Null Call Reference Request pending */
-      case C_NCR_FAC_REQ:
-        dbug(1,dprintf("NCR_FAC=0x%x/0x%x",req,rc));
-        if(global_req==ASSIGN)
-        {
-          if(rc==ASSIGN_OK)
-          {
-            return;
-          }
-          else
-          {
-            sendf(appl,_INFO_R|CONFIRM,Id&0xf,Number,"w",_WRONG_STATE);
-            appl->NullCREnable = false;
-            plci_remove(plci);
-          }
-        }
-        else if(req==NCR_FACILITY)
-        {
-          if(rc==OK)
-          {
-            sendf(appl,_INFO_R|CONFIRM,Id&0xf,Number,"w",0);
-          }
-          else
-          {
-            sendf(appl,_INFO_R|CONFIRM,Id&0xf,Number,"w",_WRONG_STATE);
-            appl->NullCREnable = false;
-          }
-          plci_remove(plci);
-        }
-        break;
-
-      case HOOK_ON_REQ:
-        if(plci->channels)
-        {
-          if(a->ncci_state[ncci]==CONNECTED)
-          {
-            a->ncci_state[ncci] = OUTG_DIS_PENDING;
-            cleanup_ncci_data (plci, ncci);
-            nl_req_ncci(plci,N_DISC,(byte)ncci);
-          }
-          break;
-        }
-        break;
-
-      case HOOK_OFF_REQ:
-        if (plci->State == INC_DIS_PENDING)
-          break;
-        sig_req(plci,CALL_REQ,0);
-        send_req(plci);
-        plci->State=OUTG_CON_PENDING;
-        break;
-
-
-      case MWI_ACTIVATE_REQ_PEND:
-      case MWI_DEACTIVATE_REQ_PEND:
-        if(global_req == ASSIGN && rc==ASSIGN_OK)
-        {
-          dbug(1,dprintf("MWI_REQ assigned"));
-          return;
-        }
-        else if(rc!=OK)
-        {                 
-          if(rc==WRONG_IE)
-          {
-            Info = 0x2007; /* Illegal message parameter coding */
-            dbug(1,dprintf("MWI_REQ invalid parameter"));
-          }
-          else
-          {
-            Info = 0x300B; /* not supported */                      
-            dbug(1,dprintf("MWI_REQ not supported"));
-          }
-          /* 0x3010: Request not allowed in this state */
-          PUT_WORD(&SSparms[4],0x300E); /* SS not supported */
-                    
-        }
-        if(plci->internal_command==MWI_ACTIVATE_REQ_PEND)
-        {
-          PUT_WORD(&SSparms[1],S_MWI_ACTIVATE);
-        }
-        else PUT_WORD(&SSparms[1],S_MWI_DEACTIVATE);
-
-        if(plci->cr_enquiry)
-        {
-          sendf(plci->appl,
-                _FACILITY_R|CONFIRM,
-                Id&0xf,
-                plci->number,
-                "wws",Info,(word)3,SSparms);
-          if(rc!=OK) plci_remove(plci);
-        }
-        else
-        {
-          sendf(plci->appl,
-                _FACILITY_R|CONFIRM,
-                Id,
-                plci->number,
-                "wws",Info,(word)3,SSparms);
-        }
-        break;
-
-      case CONF_BEGIN_REQ_PEND:
-      case CONF_ADD_REQ_PEND:
-      case CONF_SPLIT_REQ_PEND:
-      case CONF_DROP_REQ_PEND:
-      case CONF_ISOLATE_REQ_PEND:
-      case CONF_REATTACH_REQ_PEND:
-        dbug(1,dprintf("CONF_RC=0x%x/0x%x",req,rc));
-        if((plci->internal_command==CONF_ADD_REQ_PEND)&&(!plci->relatedPTYPLCI)) break;
-        rplci = plci;
-        rId = Id;
-        switch(plci->internal_command)
-        {
-          case CONF_BEGIN_REQ_PEND:
-            SSparms[1] = S_CONF_BEGIN;
-            break;
-          case CONF_ADD_REQ_PEND:
-            SSparms[1] = S_CONF_ADD;
-            rplci = plci->relatedPTYPLCI;
-            rId = ((word)rplci->Id<<8)|rplci->adapter->Id;
-            break;
-          case CONF_SPLIT_REQ_PEND:
-            SSparms[1] = S_CONF_SPLIT;
-            break;
-          case CONF_DROP_REQ_PEND:
-            SSparms[1] = S_CONF_DROP;
-            break;
-          case CONF_ISOLATE_REQ_PEND:
-            SSparms[1] = S_CONF_ISOLATE;
-            break;
-          case CONF_REATTACH_REQ_PEND:
-            SSparms[1] = S_CONF_REATTACH;
-            break;
-        }
-        
-        if(rc!=OK)
-        {
-          Info = 0x300E; /* not supported */
-          plci->relatedPTYPLCI = NULL;
-          plci->ptyState = 0;
-        }
-        sendf(rplci->appl,
-              _FACILITY_R|CONFIRM,
-              rId,
-              plci->number,
-              "wws",Info,(word)3,SSparms);
-        break;
-
-      case VSWITCH_REQ_PEND:
-        if(rc!=OK)
-        {
-          if(plci->relatedPTYPLCI)
-          {
-            plci->relatedPTYPLCI->vswitchstate=0;
-            plci->relatedPTYPLCI->vsprot=0;
-            plci->relatedPTYPLCI->vsprotdialect=0;    
-          }
-          plci->vswitchstate=0;
-          plci->vsprot=0;
-          plci->vsprotdialect=0;
-        }
-        else
-        {
-          if(plci->relatedPTYPLCI &&
-             plci->vswitchstate==1 &&
-             plci->relatedPTYPLCI->vswitchstate==3) /* join complete */
-            plci->vswitchstate=3;
-        }
-        break;
-
-  /* Call Deflection Request pending (SSCT) */
-      case CD_REQ_PEND:
-        SSparms[1] = S_CALL_DEFLECTION;
-        if(rc!=OK)
-        {
-          Info = 0x300E; /* not supported */
-          plci->appl->CDEnable = 0;
-        }  
-        sendf(plci->appl,_FACILITY_R|CONFIRM,Id,
-          plci->number,"wws",Info,(word)3,SSparms);
-        break;
-
-      case RTP_CONNECT_B3_REQ_COMMAND_2:
-        if (rc == OK)
-        {
-          ncci = get_ncci (plci, ch, 0);
-          Id = (Id & 0xffff) | (((dword) ncci) << 16);
-          plci->channels++;
-          a->ncci_state[ncci] = OUTG_CON_PENDING;
-        }
-
-      default:
-        if (plci->internal_command_queue[0])
-        {
-          (*(plci->internal_command_queue[0]))(Id, plci, rc);
-          if (plci->internal_command)
-            return;
-        }
-        break;
-      }
-      next_internal_command (Id, plci);
-    }
-  }
-  else /* appl==0 */
-  {
-    Id = ((word)plci->Id<<8)|plci->adapter->Id;
-    if(plci->tel) Id|=EXT_CONTROLLER;
-
-    switch(plci->internal_command)
-    {
-    case BLOCK_PLCI:
-      return;
-
-    case START_L1_SIG_ASSIGN_PEND:
-    case REM_L1_SIG_ASSIGN_PEND:
-      if(global_req == ASSIGN)
-      {
-        break;
-      }
-      else
-      {
-        dbug(1,dprintf("***L1 Req rem PLCI"));
-        plci->internal_command = 0;
-        sig_req(plci,REMOVE,0);
-        send_req(plci);
-      }
-      break;
-
-      /* Call Deflection Request pending, just no appl ptr assigned */
-    case CD_REQ_PEND:
-      SSparms[1] = S_CALL_DEFLECTION;
-      if(rc!=OK)
-      {
-        Info = 0x300E; /* not supported */
-      }
-      for(i=0; i<max_appl; i++)
-      {
-        if(application[i].CDEnable)
-        {
-          if(!application[i].Id) application[i].CDEnable = 0;
-          else
-          {
-            sendf(&application[i],_FACILITY_R|CONFIRM,Id,
-                  plci->number,"wws",Info,(word)3,SSparms);
-            if(Info) application[i].CDEnable = 0;
-          }
-        }
-      }
-      plci->internal_command = 0;
-      break;
-
-    case PERM_COD_HOOK:                   /* finished with Hook_Ind */
-      return;
-
-    case PERM_COD_CALL:
-      plci->internal_command = PERM_COD_CONN_PEND;
-      dbug(1,dprintf("***Codec Connect_Pending, Rc = 0x%x",rc));
-      return;
-
-    case PERM_COD_ASSIGN:
-      dbug(1,dprintf("***Codec Assign, Rc = 0x%x",rc));
-      plci->internal_command = 0;
-      if(rc!=ASSIGN_OK) break;
-      plci->internal_command = PERM_COD_CALL;
-      sig_req(plci,CALL_REQ,0);
-      send_req(plci);
-      return;
-
-    case LISTEN_SIG_ASSIGN_PEND:
-      if(rc == ASSIGN_OK)
-      {
-        plci->internal_command = 0;
-        dbug(1,dprintf("ListenCheck, new SIG_ID = 0x%x",plci->Sig.Id));
-        add_p(plci,ESC,"\x02\x18\x00");             /* support call waiting */
-        sig_req(plci,INDICATE_REQ,0);
-        send_req(plci);
-      }
-      else
-      {
-        dbug(1,dprintf("ListenCheck failed (assignRc=0x%x)",rc));
-        a->listen_active--;
-        plci_remove(plci);
-        plci->State = IDLE;
-      }
-      break;
-
-    case USELAW_REQ:
-      if(global_req == ASSIGN)
-      {
-        if (rc==ASSIGN_OK)
-      {
-        sig_req(plci,LAW_REQ,0);
-        send_req(plci);
-        dbug(1,dprintf("Auto-Law assigned"));
-        }
-        else
-        {
-          dbug(1,dprintf("Auto-Law assign failed"));
-          a->automatic_law = 3;
-          plci->internal_command = 0;
-          a->automatic_lawPLCI = NULL;
-        }
-        break;
-      }
-      else if(req == LAW_REQ && rc==OK)
-      {
-        dbug(1,dprintf("Auto-Law initiated"));
-        a->automatic_law = 2;
-        plci->internal_command = 0;
-      }
-      else
-      {
-        dbug(1,dprintf("Auto-Law not supported"));
-        a->automatic_law = 3;
-        plci->internal_command = 0;
-        sig_req(plci,REMOVE,0);
-        send_req(plci);
-        a->automatic_lawPLCI = NULL;
-      }
-      break;
-    }
-    plci_remove_check(plci);
-  }
+       dword Id;
+       dword rId;
+       word Number;
+       word Info = 0;
+       word i;
+       word ncci;
+       DIVA_CAPI_ADAPTER *a;
+       APPL *appl;
+       PLCI *rplci;
+       byte SSparms[] = "\x05\x00\x00\x02\x00\x00";
+       byte SSstruct[] = "\x09\x00\x00\x06\x00\x00\x00\x00\x00\x00";
+
+       if (!plci) {
+               dbug(0, dprintf("A: control_rc, no plci %02x:%02x:%02x:%02x:%02x", req, rc, ch, global_req, nl_rc));
+               return;
+       }
+       dbug(1, dprintf("req0_in/out=%d/%d", plci->req_in, plci->req_out));
+       if (plci->req_in != plci->req_out)
+       {
+               if (nl_rc || (global_req != ASSIGN) || (rc == ASSIGN_OK))
+               {
+                       dbug(1, dprintf("req_1return"));
+                       return;
+               }
+               /* cancel outstanding request on the PLCI after SIG ASSIGN failure */
+       }
+       plci->req_in = plci->req_in_start = plci->req_out = 0;
+       dbug(1, dprintf("control_rc"));
+
+       appl = plci->appl;
+       a = plci->adapter;
+       ncci = a->ch_ncci[ch];
+       if (appl)
+       {
+               Id = (((dword)(ncci ? ncci : ch)) << 16) | ((word)plci->Id << 8) | a->Id;
+               if (plci->tel && plci->SuppState != CALL_HELD) Id |= EXT_CONTROLLER;
+               Number = plci->number;
+               dbug(1, dprintf("Contr_RC-Id=%08lx,plci=%x,tel=%x, entity=0x%x, command=0x%x, int_command=0x%x", Id, plci->Id, plci->tel, plci->Sig.Id, plci->command, plci->internal_command));
+               dbug(1, dprintf("channels=0x%x", plci->channels));
+               if (plci_remove_check(plci))
+                       return;
+               if (req == REMOVE && rc == ASSIGN_OK)
+               {
+                       sig_req(plci, HANGUP, 0);
+                       sig_req(plci, REMOVE, 0);
+                       send_req(plci);
+               }
+               if (plci->command)
+               {
+                       switch (plci->command)
+                       {
+                       case C_HOLD_REQ:
+                               dbug(1, dprintf("HoldRC=0x%x", rc));
+                               SSparms[1] = (byte)S_HOLD;
+                               if (rc != OK)
+                               {
+                                       plci->SuppState = IDLE;
+                                       Info = 0x2001;
+                               }
+                               sendf(appl, _FACILITY_R | CONFIRM, Id, Number, "wws", Info, 3, SSparms);
+                               break;
+
+                       case C_RETRIEVE_REQ:
+                               dbug(1, dprintf("RetrieveRC=0x%x", rc));
+                               SSparms[1] = (byte)S_RETRIEVE;
+                               if (rc != OK)
+                               {
+                                       plci->SuppState = CALL_HELD;
+                                       Info = 0x2001;
+                               }
+                               sendf(appl, _FACILITY_R | CONFIRM, Id, Number, "wws", Info, 3, SSparms);
+                               break;
+
+                       case _INFO_R:
+                               dbug(1, dprintf("InfoRC=0x%x", rc));
+                               if (rc != OK) Info = _WRONG_STATE;
+                               sendf(appl, _INFO_R | CONFIRM, Id, Number, "w", Info);
+                               break;
+
+                       case _CONNECT_R:
+                               dbug(1, dprintf("Connect_R=0x%x/0x%x/0x%x/0x%x", req, rc, global_req, nl_rc));
+                               if (plci->State == INC_DIS_PENDING)
+                                       break;
+                               if (plci->Sig.Id != 0xff)
+                               {
+                                       if (((global_req == ASSIGN) && (rc != ASSIGN_OK))
+                                           || (!nl_rc && (req == CALL_REQ) && (rc != OK)))
+                                       {
+                                               dbug(1, dprintf("No more IDs/Call_Req failed"));
+                                               sendf(appl, _CONNECT_R | CONFIRM, Id & 0xffL, Number, "w", _OUT_OF_PLCI);
+                                               plci_remove(plci);
+                                               plci->State = IDLE;
+                                               break;
+                                       }
+                                       if (plci->State != LOCAL_CONNECT) plci->State = OUTG_CON_PENDING;
+                                       sendf(appl, _CONNECT_R | CONFIRM, Id, Number, "w", 0);
+                               }
+                               else /* D-ch activation */
+                               {
+                                       if (rc != ASSIGN_OK)
+                                       {
+                                               dbug(1, dprintf("No more IDs/X.25 Call_Req failed"));
+                                               sendf(appl, _CONNECT_R | CONFIRM, Id & 0xffL, Number, "w", _OUT_OF_PLCI);
+                                               plci_remove(plci);
+                                               plci->State = IDLE;
+                                               break;
+                                       }
+                                       sendf(appl, _CONNECT_R | CONFIRM, Id, Number, "w", 0);
+                                       sendf(plci->appl, _CONNECT_ACTIVE_I, Id, 0, "sss", "", "", "");
+                                       plci->State = INC_ACT_PENDING;
+                               }
+                               break;
+
+                       case _CONNECT_I | RESPONSE:
+                               if (plci->State != INC_DIS_PENDING)
+                                       plci->State = INC_CON_ACCEPT;
+                               break;
+
+                       case _DISCONNECT_R:
+                               if (plci->State == INC_DIS_PENDING)
+                                       break;
+                               if (plci->Sig.Id != 0xff)
+                               {
+                                       plci->State = OUTG_DIS_PENDING;
+                                       sendf(appl, _DISCONNECT_R | CONFIRM, Id, Number, "w", 0);
+                               }
+                               break;
+
+                       case SUSPEND_REQ:
+                               break;
+
+                       case RESUME_REQ:
+                               break;
+
+                       case _CONNECT_B3_R:
+                               if (rc != OK)
+                               {
+                                       sendf(appl, _CONNECT_B3_R | CONFIRM, Id, Number, "w", _WRONG_IDENTIFIER);
+                                       break;
+                               }
+                               ncci = get_ncci(plci, ch, 0);
+                               Id = (Id & 0xffff) | (((dword) ncci) << 16);
+                               plci->channels++;
+                               if (req == N_RESET)
+                               {
+                                       a->ncci_state[ncci] = INC_ACT_PENDING;
+                                       sendf(appl, _CONNECT_B3_R | CONFIRM, Id, Number, "w", 0);
+                                       sendf(appl, _CONNECT_B3_ACTIVE_I, Id, 0, "s", "");
+                               }
+                               else
+                               {
+                                       a->ncci_state[ncci] = OUTG_CON_PENDING;
+                                       sendf(appl, _CONNECT_B3_R | CONFIRM, Id, Number, "w", 0);
+                               }
+                               break;
+
+                       case _CONNECT_B3_I | RESPONSE:
+                               break;
+
+                       case _RESET_B3_R:
+/*        sendf(appl, _RESET_B3_R | CONFIRM, Id, Number, "w", 0);*/
+                               break;
+
+                       case _DISCONNECT_B3_R:
+                               sendf(appl, _DISCONNECT_B3_R | CONFIRM, Id, Number, "w", 0);
+                               break;
+
+                       case _MANUFACTURER_R:
+                               break;
+
+                       case PERM_LIST_REQ:
+                               if (rc != OK)
+                               {
+                                       Info = _WRONG_IDENTIFIER;
+                                       sendf(plci->appl, _CONNECT_R | CONFIRM, Id, Number, "w", Info);
+                                       plci_remove(plci);
+                               }
+                               else
+                                       sendf(plci->appl, _CONNECT_R | CONFIRM, Id, Number, "w", Info);
+                               break;
+
+                       default:
+                               break;
+                       }
+                       plci->command = 0;
+               }
+               else if (plci->internal_command)
+               {
+                       switch (plci->internal_command)
+                       {
+                       case BLOCK_PLCI:
+                               return;
+
+                       case GET_MWI_STATE:
+                               if (rc == OK) /* command supported, wait for indication */
+                               {
+                                       return;
+                               }
+                               plci_remove(plci);
+                               break;
+
+                               /* Get Supported Services */
+                       case GETSERV_REQ_PEND:
+                               if (rc == OK) /* command supported, wait for indication */
+                               {
+                                       break;
+                               }
+                               PUT_DWORD(&SSstruct[6], MASK_TERMINAL_PORTABILITY);
+                               sendf(appl, _FACILITY_R | CONFIRM, Id, Number, "wws", 0, 3, SSstruct);
+                               plci_remove(plci);
+                               break;
+
+                       case INTERR_DIVERSION_REQ_PEND:      /* Interrogate Parameters        */
+                       case INTERR_NUMBERS_REQ_PEND:
+                       case CF_START_PEND:                  /* Call Forwarding Start pending */
+                       case CF_STOP_PEND:                   /* Call Forwarding Stop pending  */
+                       case CCBS_REQUEST_REQ_PEND:
+                       case CCBS_DEACTIVATE_REQ_PEND:
+                       case CCBS_INTERROGATE_REQ_PEND:
+                               switch (plci->internal_command)
+                               {
+                               case INTERR_DIVERSION_REQ_PEND:
+                                       SSparms[1] = S_INTERROGATE_DIVERSION;
+                                       break;
+                               case INTERR_NUMBERS_REQ_PEND:
+                                       SSparms[1] = S_INTERROGATE_NUMBERS;
+                                       break;
+                               case CF_START_PEND:
+                                       SSparms[1] = S_CALL_FORWARDING_START;
+                                       break;
+                               case CF_STOP_PEND:
+                                       SSparms[1] = S_CALL_FORWARDING_STOP;
+                                       break;
+                               case CCBS_REQUEST_REQ_PEND:
+                                       SSparms[1] = S_CCBS_REQUEST;
+                                       break;
+                               case CCBS_DEACTIVATE_REQ_PEND:
+                                       SSparms[1] = S_CCBS_DEACTIVATE;
+                                       break;
+                               case CCBS_INTERROGATE_REQ_PEND:
+                                       SSparms[1] = S_CCBS_INTERROGATE;
+                                       break;
+                               }
+                               if (global_req == ASSIGN)
+                               {
+                                       dbug(1, dprintf("AssignDiversion_RC=0x%x/0x%x", req, rc));
+                                       return;
+                               }
+                               if (!plci->appl) break;
+                               if (rc == ISDN_GUARD_REJ)
+                               {
+                                       Info = _CAPI_GUARD_ERROR;
+                               }
+                               else if (rc != OK)
+                               {
+                                       Info = _SUPPLEMENTARY_SERVICE_NOT_SUPPORTED;
+                               }
+                               sendf(plci->appl, _FACILITY_R | CONFIRM, Id & 0x7,
+                                     plci->number, "wws", Info, (word)3, SSparms);
+                               if (Info) plci_remove(plci);
+                               break;
+
+                               /* 3pty conference pending */
+                       case PTY_REQ_PEND:
+                               if (!plci->relatedPTYPLCI) break;
+                               rplci = plci->relatedPTYPLCI;
+                               SSparms[1] = plci->ptyState;
+                               rId = ((word)rplci->Id << 8) | rplci->adapter->Id;
+                               if (rplci->tel) rId |= EXT_CONTROLLER;
+                               if (rc != OK)
+                               {
+                                       Info = 0x300E; /* not supported */
+                                       plci->relatedPTYPLCI = NULL;
+                                       plci->ptyState = 0;
+                               }
+                               sendf(rplci->appl,
+                                     _FACILITY_R | CONFIRM,
+                                     rId,
+                                     plci->number,
+                                     "wws", Info, (word)3, SSparms);
+                               break;
+
+                               /* Explicit Call Transfer pending */
+                       case ECT_REQ_PEND:
+                               dbug(1, dprintf("ECT_RC=0x%x/0x%x", req, rc));
+                               if (!plci->relatedPTYPLCI) break;
+                               rplci = plci->relatedPTYPLCI;
+                               SSparms[1] = S_ECT;
+                               rId = ((word)rplci->Id << 8) | rplci->adapter->Id;
+                               if (rplci->tel) rId |= EXT_CONTROLLER;
+                               if (rc != OK)
+                               {
+                                       Info = 0x300E; /* not supported */
+                                       plci->relatedPTYPLCI = NULL;
+                                       plci->ptyState = 0;
+                               }
+                               sendf(rplci->appl,
+                                     _FACILITY_R | CONFIRM,
+                                     rId,
+                                     plci->number,
+                                     "wws", Info, (word)3, SSparms);
+                               break;
+
+                       case _MANUFACTURER_R:
+                               dbug(1, dprintf("_Manufacturer_R=0x%x/0x%x", req, rc));
+                               if ((global_req == ASSIGN) && (rc != ASSIGN_OK))
+                               {
+                                       dbug(1, dprintf("No more IDs"));
+                                       sendf(appl, _MANUFACTURER_R | CONFIRM, Id, Number, "dww", _DI_MANU_ID, _MANUFACTURER_R, _OUT_OF_PLCI);
+                                       plci_remove(plci);  /* after codec init, internal codec commands pending */
+                               }
+                               break;
+
+                       case _CONNECT_R:
+                               dbug(1, dprintf("_Connect_R=0x%x/0x%x", req, rc));
+                               if ((global_req == ASSIGN) && (rc != ASSIGN_OK))
+                               {
+                                       dbug(1, dprintf("No more IDs"));
+                                       sendf(appl, _CONNECT_R | CONFIRM, Id & 0xffL, Number, "w", _OUT_OF_PLCI);
+                                       plci_remove(plci);  /* after codec init, internal codec commands pending */
+                               }
+                               break;
+
+                       case PERM_COD_HOOK:                     /* finished with Hook_Ind */
+                               return;
+
+                       case PERM_COD_CALL:
+                               dbug(1, dprintf("***Codec Connect_Pending A, Rc = 0x%x", rc));
+                               plci->internal_command = PERM_COD_CONN_PEND;
+                               return;
+
+                       case PERM_COD_ASSIGN:
+                               dbug(1, dprintf("***Codec Assign A, Rc = 0x%x", rc));
+                               if (rc != ASSIGN_OK) break;
+                               sig_req(plci, CALL_REQ, 0);
+                               send_req(plci);
+                               plci->internal_command = PERM_COD_CALL;
+                               return;
+
+                               /* Null Call Reference Request pending */
+                       case C_NCR_FAC_REQ:
+                               dbug(1, dprintf("NCR_FAC=0x%x/0x%x", req, rc));
+                               if (global_req == ASSIGN)
+                               {
+                                       if (rc == ASSIGN_OK)
+                                       {
+                                               return;
+                                       }
+                                       else
+                                       {
+                                               sendf(appl, _INFO_R | CONFIRM, Id & 0xf, Number, "w", _WRONG_STATE);
+                                               appl->NullCREnable = false;
+                                               plci_remove(plci);
+                                       }
+                               }
+                               else if (req == NCR_FACILITY)
+                               {
+                                       if (rc == OK)
+                                       {
+                                               sendf(appl, _INFO_R | CONFIRM, Id & 0xf, Number, "w", 0);
+                                       }
+                                       else
+                                       {
+                                               sendf(appl, _INFO_R | CONFIRM, Id & 0xf, Number, "w", _WRONG_STATE);
+                                               appl->NullCREnable = false;
+                                       }
+                                       plci_remove(plci);
+                               }
+                               break;
+
+                       case HOOK_ON_REQ:
+                               if (plci->channels)
+                               {
+                                       if (a->ncci_state[ncci] == CONNECTED)
+                                       {
+                                               a->ncci_state[ncci] = OUTG_DIS_PENDING;
+                                               cleanup_ncci_data(plci, ncci);
+                                               nl_req_ncci(plci, N_DISC, (byte)ncci);
+                                       }
+                                       break;
+                               }
+                               break;
+
+                       case HOOK_OFF_REQ:
+                               if (plci->State == INC_DIS_PENDING)
+                                       break;
+                               sig_req(plci, CALL_REQ, 0);
+                               send_req(plci);
+                               plci->State = OUTG_CON_PENDING;
+                               break;
+
+
+                       case MWI_ACTIVATE_REQ_PEND:
+                       case MWI_DEACTIVATE_REQ_PEND:
+                               if (global_req == ASSIGN && rc == ASSIGN_OK)
+                               {
+                                       dbug(1, dprintf("MWI_REQ assigned"));
+                                       return;
+                               }
+                               else if (rc != OK)
+                               {
+                                       if (rc == WRONG_IE)
+                                       {
+                                               Info = 0x2007; /* Illegal message parameter coding */
+                                               dbug(1, dprintf("MWI_REQ invalid parameter"));
+                                       }
+                                       else
+                                       {
+                                               Info = 0x300B; /* not supported */
+                                               dbug(1, dprintf("MWI_REQ not supported"));
+                                       }
+                                       /* 0x3010: Request not allowed in this state */
+                                       PUT_WORD(&SSparms[4], 0x300E); /* SS not supported */
+
+                               }
+                               if (plci->internal_command == MWI_ACTIVATE_REQ_PEND)
+                               {
+                                       PUT_WORD(&SSparms[1], S_MWI_ACTIVATE);
+                               }
+                               else PUT_WORD(&SSparms[1], S_MWI_DEACTIVATE);
+
+                               if (plci->cr_enquiry)
+                               {
+                                       sendf(plci->appl,
+                                             _FACILITY_R | CONFIRM,
+                                             Id & 0xf,
+                                             plci->number,
+                                             "wws", Info, (word)3, SSparms);
+                                       if (rc != OK) plci_remove(plci);
+                               }
+                               else
+                               {
+                                       sendf(plci->appl,
+                                             _FACILITY_R | CONFIRM,
+                                             Id,
+                                             plci->number,
+                                             "wws", Info, (word)3, SSparms);
+                               }
+                               break;
+
+                       case CONF_BEGIN_REQ_PEND:
+                       case CONF_ADD_REQ_PEND:
+                       case CONF_SPLIT_REQ_PEND:
+                       case CONF_DROP_REQ_PEND:
+                       case CONF_ISOLATE_REQ_PEND:
+                       case CONF_REATTACH_REQ_PEND:
+                               dbug(1, dprintf("CONF_RC=0x%x/0x%x", req, rc));
+                               if ((plci->internal_command == CONF_ADD_REQ_PEND) && (!plci->relatedPTYPLCI)) break;
+                               rplci = plci;
+                               rId = Id;
+                               switch (plci->internal_command)
+                               {
+                               case CONF_BEGIN_REQ_PEND:
+                                       SSparms[1] = S_CONF_BEGIN;
+                                       break;
+                               case CONF_ADD_REQ_PEND:
+                                       SSparms[1] = S_CONF_ADD;
+                                       rplci = plci->relatedPTYPLCI;
+                                       rId = ((word)rplci->Id << 8) | rplci->adapter->Id;
+                                       break;
+                               case CONF_SPLIT_REQ_PEND:
+                                       SSparms[1] = S_CONF_SPLIT;
+                                       break;
+                               case CONF_DROP_REQ_PEND:
+                                       SSparms[1] = S_CONF_DROP;
+                                       break;
+                               case CONF_ISOLATE_REQ_PEND:
+                                       SSparms[1] = S_CONF_ISOLATE;
+                                       break;
+                               case CONF_REATTACH_REQ_PEND:
+                                       SSparms[1] = S_CONF_REATTACH;
+                                       break;
+                               }
+
+                               if (rc != OK)
+                               {
+                                       Info = 0x300E; /* not supported */
+                                       plci->relatedPTYPLCI = NULL;
+                                       plci->ptyState = 0;
+                               }
+                               sendf(rplci->appl,
+                                     _FACILITY_R | CONFIRM,
+                                     rId,
+                                     plci->number,
+                                     "wws", Info, (word)3, SSparms);
+                               break;
+
+                       case VSWITCH_REQ_PEND:
+                               if (rc != OK)
+                               {
+                                       if (plci->relatedPTYPLCI)
+                                       {
+                                               plci->relatedPTYPLCI->vswitchstate = 0;
+                                               plci->relatedPTYPLCI->vsprot = 0;
+                                               plci->relatedPTYPLCI->vsprotdialect = 0;
+                                       }
+                                       plci->vswitchstate = 0;
+                                       plci->vsprot = 0;
+                                       plci->vsprotdialect = 0;
+                               }
+                               else
+                               {
+                                       if (plci->relatedPTYPLCI &&
+                                           plci->vswitchstate == 1 &&
+                                           plci->relatedPTYPLCI->vswitchstate == 3) /* join complete */
+                                               plci->vswitchstate = 3;
+                               }
+                               break;
+
+                               /* Call Deflection Request pending (SSCT) */
+                       case CD_REQ_PEND:
+                               SSparms[1] = S_CALL_DEFLECTION;
+                               if (rc != OK)
+                               {
+                                       Info = 0x300E; /* not supported */
+                                       plci->appl->CDEnable = 0;
+                               }
+                               sendf(plci->appl, _FACILITY_R | CONFIRM, Id,
+                                     plci->number, "wws", Info, (word)3, SSparms);
+                               break;
+
+                       case RTP_CONNECT_B3_REQ_COMMAND_2:
+                               if (rc == OK)
+                               {
+                                       ncci = get_ncci(plci, ch, 0);
+                                       Id = (Id & 0xffff) | (((dword) ncci) << 16);
+                                       plci->channels++;
+                                       a->ncci_state[ncci] = OUTG_CON_PENDING;
+                               }
+
+                       default:
+                               if (plci->internal_command_queue[0])
+                               {
+                                       (*(plci->internal_command_queue[0]))(Id, plci, rc);
+                                       if (plci->internal_command)
+                                               return;
+                               }
+                               break;
+                       }
+                       next_internal_command(Id, plci);
+               }
+       }
+       else /* appl==0 */
+       {
+               Id = ((word)plci->Id << 8) | plci->adapter->Id;
+               if (plci->tel) Id |= EXT_CONTROLLER;
+
+               switch (plci->internal_command)
+               {
+               case BLOCK_PLCI:
+                       return;
+
+               case START_L1_SIG_ASSIGN_PEND:
+               case REM_L1_SIG_ASSIGN_PEND:
+                       if (global_req == ASSIGN)
+                       {
+                               break;
+                       }
+                       else
+                       {
+                               dbug(1, dprintf("***L1 Req rem PLCI"));
+                               plci->internal_command = 0;
+                               sig_req(plci, REMOVE, 0);
+                               send_req(plci);
+                       }
+                       break;
+
+                       /* Call Deflection Request pending, just no appl ptr assigned */
+               case CD_REQ_PEND:
+                       SSparms[1] = S_CALL_DEFLECTION;
+                       if (rc != OK)
+                       {
+                               Info = 0x300E; /* not supported */
+                       }
+                       for (i = 0; i < max_appl; i++)
+                       {
+                               if (application[i].CDEnable)
+                               {
+                                       if (!application[i].Id) application[i].CDEnable = 0;
+                                       else
+                                       {
+                                               sendf(&application[i], _FACILITY_R | CONFIRM, Id,
+                                                     plci->number, "wws", Info, (word)3, SSparms);
+                                               if (Info) application[i].CDEnable = 0;
+                                       }
+                               }
+                       }
+                       plci->internal_command = 0;
+                       break;
+
+               case PERM_COD_HOOK:                   /* finished with Hook_Ind */
+                       return;
+
+               case PERM_COD_CALL:
+                       plci->internal_command = PERM_COD_CONN_PEND;
+                       dbug(1, dprintf("***Codec Connect_Pending, Rc = 0x%x", rc));
+                       return;
+
+               case PERM_COD_ASSIGN:
+                       dbug(1, dprintf("***Codec Assign, Rc = 0x%x", rc));
+                       plci->internal_command = 0;
+                       if (rc != ASSIGN_OK) break;
+                       plci->internal_command = PERM_COD_CALL;
+                       sig_req(plci, CALL_REQ, 0);
+                       send_req(plci);
+                       return;
+
+               case LISTEN_SIG_ASSIGN_PEND:
+                       if (rc == ASSIGN_OK)
+                       {
+                               plci->internal_command = 0;
+                               dbug(1, dprintf("ListenCheck, new SIG_ID = 0x%x", plci->Sig.Id));
+                               add_p(plci, ESC, "\x02\x18\x00");             /* support call waiting */
+                               sig_req(plci, INDICATE_REQ, 0);
+                               send_req(plci);
+                       }
+                       else
+                       {
+                               dbug(1, dprintf("ListenCheck failed (assignRc=0x%x)", rc));
+                               a->listen_active--;
+                               plci_remove(plci);
+                               plci->State = IDLE;
+                       }
+                       break;
+
+               case USELAW_REQ:
+                       if (global_req == ASSIGN)
+                       {
+                               if (rc == ASSIGN_OK)
+                               {
+                                       sig_req(plci, LAW_REQ, 0);
+                                       send_req(plci);
+                                       dbug(1, dprintf("Auto-Law assigned"));
+                               }
+                               else
+                               {
+                                       dbug(1, dprintf("Auto-Law assign failed"));
+                                       a->automatic_law = 3;
+                                       plci->internal_command = 0;
+                                       a->automatic_lawPLCI = NULL;
+                               }
+                               break;
+                       }
+                       else if (req == LAW_REQ && rc == OK)
+                       {
+                               dbug(1, dprintf("Auto-Law initiated"));
+                               a->automatic_law = 2;
+                               plci->internal_command = 0;
+                       }
+                       else
+                       {
+                               dbug(1, dprintf("Auto-Law not supported"));
+                               a->automatic_law = 3;
+                               plci->internal_command = 0;
+                               sig_req(plci, REMOVE, 0);
+                               send_req(plci);
+                               a->automatic_lawPLCI = NULL;
+                       }
+                       break;
+               }
+               plci_remove_check(plci);
+       }
 }
 
 static void data_rc(PLCI *plci, byte ch)
 {
-  dword Id;
-  DIVA_CAPI_ADAPTER   * a;
-  NCCI   *ncci_ptr;
-  DATA_B3_DESC   *data;
-  word ncci;
-
-  if (plci->appl)
-  {
-    TransmitBufferFree (plci->appl, plci->data_sent_ptr);
-    a = plci->adapter;
-    ncci = a->ch_ncci[ch];
-    if (ncci && (a->ncci_plci[ncci] == plci->Id))
-    {
-      ncci_ptr = &(a->ncci[ncci]);
-      dbug(1,dprintf("data_out=%d, data_pending=%d",ncci_ptr->data_out,ncci_ptr->data_pending));
-      if (ncci_ptr->data_pending)
-      {
-        data = &(ncci_ptr->DBuffer[ncci_ptr->data_out]);
-        if (!(data->Flags &4) && a->ncci_state[ncci])
-        {
-          Id = (((dword)ncci)<<16)|((word)plci->Id<<8)|a->Id;
-          if(plci->tel) Id|=EXT_CONTROLLER;
-          sendf(plci->appl,_DATA_B3_R|CONFIRM,Id,data->Number,
-                "ww",data->Handle,0);
-        }
-        (ncci_ptr->data_out)++;
-        if (ncci_ptr->data_out == MAX_DATA_B3)
-          ncci_ptr->data_out = 0;
-        (ncci_ptr->data_pending)--;
-      }
-    }
-  }
+       dword Id;
+       DIVA_CAPI_ADAPTER *a;
+       NCCI *ncci_ptr;
+       DATA_B3_DESC *data;
+       word ncci;
+
+       if (plci->appl)
+       {
+               TransmitBufferFree(plci->appl, plci->data_sent_ptr);
+               a = plci->adapter;
+               ncci = a->ch_ncci[ch];
+               if (ncci && (a->ncci_plci[ncci] == plci->Id))
+               {
+                       ncci_ptr = &(a->ncci[ncci]);
+                       dbug(1, dprintf("data_out=%d, data_pending=%d", ncci_ptr->data_out, ncci_ptr->data_pending));
+                       if (ncci_ptr->data_pending)
+                       {
+                               data = &(ncci_ptr->DBuffer[ncci_ptr->data_out]);
+                               if (!(data->Flags & 4) && a->ncci_state[ncci])
+                               {
+                                       Id = (((dword)ncci) << 16) | ((word)plci->Id << 8) | a->Id;
+                                       if (plci->tel) Id |= EXT_CONTROLLER;
+                                       sendf(plci->appl, _DATA_B3_R | CONFIRM, Id, data->Number,
+                                             "ww", data->Handle, 0);
+                               }
+                               (ncci_ptr->data_out)++;
+                               if (ncci_ptr->data_out == MAX_DATA_B3)
+                                       ncci_ptr->data_out = 0;
+                               (ncci_ptr->data_pending)--;
+                       }
+               }
+       }
 }
 
 static void data_ack(PLCI *plci, byte ch)
 {
-  dword Id;
-  DIVA_CAPI_ADAPTER   * a;
-  NCCI   *ncci_ptr;
-  word ncci;
-
-  a = plci->adapter;
-  ncci = a->ch_ncci[ch];
-  ncci_ptr = &(a->ncci[ncci]);
-  if (ncci_ptr->data_ack_pending)
-  {
-    if (a->ncci_state[ncci] && (a->ncci_plci[ncci] == plci->Id))
-    {
-      Id = (((dword)ncci)<<16)|((word)plci->Id<<8)|a->Id;
-      if(plci->tel) Id|=EXT_CONTROLLER;
-      sendf(plci->appl,_DATA_B3_R|CONFIRM,Id,ncci_ptr->DataAck[ncci_ptr->data_ack_out].Number,
-            "ww",ncci_ptr->DataAck[ncci_ptr->data_ack_out].Handle,0);
-    }
-    (ncci_ptr->data_ack_out)++;
-    if (ncci_ptr->data_ack_out == MAX_DATA_ACK)
-      ncci_ptr->data_ack_out = 0;
-    (ncci_ptr->data_ack_pending)--;
-  }
+       dword Id;
+       DIVA_CAPI_ADAPTER *a;
+       NCCI *ncci_ptr;
+       word ncci;
+
+       a = plci->adapter;
+       ncci = a->ch_ncci[ch];
+       ncci_ptr = &(a->ncci[ncci]);
+       if (ncci_ptr->data_ack_pending)
+       {
+               if (a->ncci_state[ncci] && (a->ncci_plci[ncci] == plci->Id))
+               {
+                       Id = (((dword)ncci) << 16) | ((word)plci->Id << 8) | a->Id;
+                       if (plci->tel) Id |= EXT_CONTROLLER;
+                       sendf(plci->appl, _DATA_B3_R | CONFIRM, Id, ncci_ptr->DataAck[ncci_ptr->data_ack_out].Number,
+                             "ww", ncci_ptr->DataAck[ncci_ptr->data_ack_out].Handle, 0);
+               }
+               (ncci_ptr->data_ack_out)++;
+               if (ncci_ptr->data_ack_out == MAX_DATA_ACK)
+                       ncci_ptr->data_ack_out = 0;
+               (ncci_ptr->data_ack_pending)--;
+       }
 }
 
 static void sig_ind(PLCI *plci)
 {
-  dword x_Id;
-  dword Id;
-  dword rId;
-  word i;
-  word cip;
-  dword cip_mask;
-  byte   *ie;
-  DIVA_CAPI_ADAPTER   * a;
-    API_PARSE saved_parms[MAX_MSG_PARMS+1];
+       dword x_Id;
+       dword Id;
+       dword rId;
+       word i;
+       word cip;
+       dword cip_mask;
+       byte *ie;
+       DIVA_CAPI_ADAPTER *a;
+       API_PARSE saved_parms[MAX_MSG_PARMS + 1];
 #define MAXPARMSIDS 31
-    byte   * parms[MAXPARMSIDS];
-    byte   * add_i[4];
-    byte   * multi_fac_parms[MAX_MULTI_IE];
-    byte   * multi_pi_parms [MAX_MULTI_IE];
-    byte   * multi_ssext_parms [MAX_MULTI_IE];
-    byte   * multi_CiPN_parms [MAX_MULTI_IE];
-
-    byte   * multi_vswitch_parms [MAX_MULTI_IE];
-
-  byte ai_len;
-    byte   *esc_chi = "";
-    byte   *esc_law = "";
-    byte   *pty_cai = "";
-    byte   *esc_cr  = "";
-    byte   *esc_profile = "";
-
-    byte facility[256];
-  PLCI   * tplci = NULL;
-  byte chi[] = "\x02\x18\x01";
-  byte voice_cai[]  = "\x06\x14\x00\x00\x00\x00\x08";
-    byte resume_cau[] = "\x05\x05\x00\x02\x00\x00";
-  /* ESC_MSGTYPE must be the last but one message, a new IE has to be */
-  /* included before the ESC_MSGTYPE and MAXPARMSIDS has to be incremented */
-  /* SMSG is situated at the end because its 0 (for compatibility reasons */
-  /* (see Info_Mask Bit 4, first IE. then the message type)           */
-    word parms_id[] =
-         {MAXPARMSIDS, CPN, 0xff, DSA, OSA, BC, LLC, HLC, ESC_CAUSE, DSP, DT, CHA,
-          UUI, CONG_RR, CONG_RNR, ESC_CHI, KEY, CHI, CAU, ESC_LAW,
-          RDN, RDX, CONN_NR, RIN, NI, CAI, ESC_CR,
-          CST, ESC_PROFILE, 0xff, ESC_MSGTYPE, SMSG};
-          /* 14 FTY repl by ESC_CHI */
-          /* 18 PI  repl by ESC_LAW */
-         /* removed OAD changed to 0xff for future use, OAD is multiIE now */
-     word multi_fac_id[] = {1, FTY};
-     word multi_pi_id[]  = {1, PI};
-     word multi_CiPN_id[]  = {1, OAD};
-     word multi_ssext_id[]  = {1, ESC_SSEXT};
-
-     word multi_vswitch_id[]  = {1, ESC_VSWITCH};
-
-  byte   * cau;
-  word ncci;
-    byte SS_Ind[] = "\x05\x02\x00\x02\x00\x00"; /* Hold_Ind struct*/
-    byte CF_Ind[] = "\x09\x02\x00\x06\x00\x00\x00\x00\x00\x00";
-    byte Interr_Err_Ind[] = "\x0a\x02\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00";
-    byte CONF_Ind[] = "\x09\x16\x00\x06\x00\x00\0x00\0x00\0x00\0x00";
-  byte force_mt_info = false;
-  byte dir;
-  dword d;
-  word w;
-
-  a = plci->adapter;
-  Id = ((word)plci->Id<<8)|a->Id;
-  PUT_WORD(&SS_Ind[4],0x0000);
-
-  if (plci->sig_remove_id)
-  {
-    plci->Sig.RNR = 2; /* discard */
-    dbug(1,dprintf("SIG discard while remove pending"));
-    return;
-  }
-  if(plci->tel && plci->SuppState!=CALL_HELD) Id|=EXT_CONTROLLER;
-  dbug(1,dprintf("SigInd-Id=%08lx,plci=%x,tel=%x,state=0x%x,channels=%d,Discflowcl=%d",
-    Id,plci->Id,plci->tel,plci->State,plci->channels,plci->hangup_flow_ctrl_timer));
-  if(plci->Sig.Ind==CALL_HOLD_ACK && plci->channels)
-  {
-    plci->Sig.RNR = 1;
-    return;
-  }
-  if(plci->Sig.Ind==HANGUP && plci->channels)
-  {
-    plci->Sig.RNR = 1;
-    plci->hangup_flow_ctrl_timer++;
-    /* recover the network layer after timeout */
-    if(plci->hangup_flow_ctrl_timer==100)
-    {
-      dbug(1,dprintf("Exceptional disc"));
-      plci->Sig.RNR = 0;
-      plci->hangup_flow_ctrl_timer = 0;
-      for (ncci = 1; ncci < MAX_NCCI+1; ncci++)
-      {
-        if (a->ncci_plci[ncci] == plci->Id)
-        {
-          cleanup_ncci_data (plci, ncci);
-          if(plci->channels)plci->channels--;
-          if (plci->appl)
-            sendf(plci->appl,_DISCONNECT_B3_I, (((dword) ncci) << 16) | Id,0,"ws",0,"");
-        }
-      }
-      if (plci->appl)
-        sendf(plci->appl, _DISCONNECT_I, Id, 0, "w", 0);
-      plci_remove(plci);
-      plci->State=IDLE;
-    }
-    return;
-  }
-
-  /* do first parse the info with no OAD in, because OAD will be converted */
-  /* first the multiple facility IE, then mult. progress ind.              */
-  /* then the parameters for the info_ind + conn_ind                       */
-  IndParse(plci,multi_fac_id,multi_fac_parms,MAX_MULTI_IE);
-  IndParse(plci,multi_pi_id,multi_pi_parms,MAX_MULTI_IE);
-  IndParse(plci,multi_ssext_id,multi_ssext_parms,MAX_MULTI_IE);
-
-  IndParse(plci,multi_vswitch_id,multi_vswitch_parms,MAX_MULTI_IE);
-
-  IndParse(plci,parms_id,parms,0);
-  IndParse(plci,multi_CiPN_id,multi_CiPN_parms,MAX_MULTI_IE);
-  esc_chi  = parms[14];
-  esc_law  = parms[18];
-  pty_cai  = parms[24];
-  esc_cr   = parms[25];
-  esc_profile = parms[27];
-  if(esc_cr[0] && plci)
-  {
-    if(plci->cr_enquiry && plci->appl)
-    {
-      plci->cr_enquiry = false;
-      /* d = MANU_ID            */
-      /* w = m_command          */
-      /* b = total length       */
-      /* b = indication type    */
-      /* b = length of all IEs  */
-      /* b = IE1                */
-      /* S = IE1 length + cont. */
-      /* b = IE2                */
-      /* S = IE2 length + cont. */
-      sendf(plci->appl,
-        _MANUFACTURER_I,
-        Id,
-        0,
-        "dwbbbbSbS",_DI_MANU_ID,plci->m_command,
-        2+1+1+esc_cr[0]+1+1+esc_law[0],plci->Sig.Ind,1+1+esc_cr[0]+1+1+esc_law[0],ESC,esc_cr,ESC,esc_law);
-    }
-  }
-  /* create the additional info structure                                  */
-  add_i[1] = parms[15]; /* KEY of additional info */
-  add_i[2] = parms[11]; /* UUI of additional info */
-  ai_len = AddInfo(add_i,multi_fac_parms, esc_chi, facility);
-
-  /* the ESC_LAW indicates if u-Law or a-Law is actually used by the card  */
-  /* indication returns by the card if requested by the function           */
-  /* AutomaticLaw() after driver init                                      */
-  if (a->automatic_law<4)
-  {
-    if(esc_law[0]){
-      if(esc_law[2]){
-        dbug(0,dprintf("u-Law selected"));
-        a->u_law = 1;
-      }
-      else {
-        dbug(0,dprintf("a-Law selected"));
-        a->u_law = 0;
-      }
-      a->automatic_law = 4;
-      if(plci==a->automatic_lawPLCI) {
-        plci->internal_command = 0;
-        sig_req(plci,REMOVE,0);
-        send_req(plci);
-        a->automatic_lawPLCI = NULL;
-      }
-    }
-    if (esc_profile[0])
-    {
-      dbug (1, dprintf ("[%06x] CardProfile: %lx %lx %lx %lx %lx",
-        UnMapController (a->Id), GET_DWORD (&esc_profile[6]),
-        GET_DWORD (&esc_profile[10]), GET_DWORD (&esc_profile[14]),
-        GET_DWORD (&esc_profile[18]), GET_DWORD (&esc_profile[46])));
-
-      a->profile.Global_Options &= 0x000000ffL;
-      a->profile.B1_Protocols &= 0x000003ffL;
-      a->profile.B2_Protocols &= 0x00001fdfL;
-      a->profile.B3_Protocols &= 0x000000b7L;
-
-      a->profile.Global_Options &= GET_DWORD (&esc_profile[6]) |
-        GL_BCHANNEL_OPERATION_SUPPORTED;
-      a->profile.B1_Protocols &= GET_DWORD (&esc_profile[10]);
-      a->profile.B2_Protocols &= GET_DWORD (&esc_profile[14]);
-      a->profile.B3_Protocols &= GET_DWORD (&esc_profile[18]);
-      a->manufacturer_features = GET_DWORD (&esc_profile[46]);
-      a->man_profile.private_options = 0;
-
-      if (a->manufacturer_features & MANUFACTURER_FEATURE_ECHO_CANCELLER)
-      {
-        a->man_profile.private_options |= 1L << PRIVATE_ECHO_CANCELLER;
-        a->profile.Global_Options |= GL_ECHO_CANCELLER_SUPPORTED;
-      }
-
-
-      if (a->manufacturer_features & MANUFACTURER_FEATURE_RTP)
-        a->man_profile.private_options |= 1L << PRIVATE_RTP;
-      a->man_profile.rtp_primary_payloads = GET_DWORD (&esc_profile[50]);
-      a->man_profile.rtp_additional_payloads = GET_DWORD (&esc_profile[54]);
-
-
-      if (a->manufacturer_features & MANUFACTURER_FEATURE_T38)
-        a->man_profile.private_options |= 1L << PRIVATE_T38;
-
-
-      if (a->manufacturer_features & MANUFACTURER_FEATURE_FAX_SUB_SEP_PWD)
-        a->man_profile.private_options |= 1L << PRIVATE_FAX_SUB_SEP_PWD;
-
-
-      if (a->manufacturer_features & MANUFACTURER_FEATURE_V18)
-        a->man_profile.private_options |= 1L << PRIVATE_V18;
-
-
-      if (a->manufacturer_features & MANUFACTURER_FEATURE_DTMF_TONE)
-        a->man_profile.private_options |= 1L << PRIVATE_DTMF_TONE;
-
-
-      if (a->manufacturer_features & MANUFACTURER_FEATURE_PIAFS)
-        a->man_profile.private_options |= 1L << PRIVATE_PIAFS;
-
-
-      if (a->manufacturer_features & MANUFACTURER_FEATURE_FAX_PAPER_FORMATS)
-        a->man_profile.private_options |= 1L << PRIVATE_FAX_PAPER_FORMATS;
-
-
-      if (a->manufacturer_features & MANUFACTURER_FEATURE_VOWN)
-        a->man_profile.private_options |= 1L << PRIVATE_VOWN;
-
-
-      if (a->manufacturer_features & MANUFACTURER_FEATURE_FAX_NONSTANDARD)
-        a->man_profile.private_options |= 1L << PRIVATE_FAX_NONSTANDARD;
-
-    }
-    else
-    {
-      a->profile.Global_Options &= 0x0000007fL;
-      a->profile.B1_Protocols &= 0x000003dfL;
-      a->profile.B2_Protocols &= 0x00001adfL;
-      a->profile.B3_Protocols &= 0x000000b7L;
-      a->manufacturer_features &= MANUFACTURER_FEATURE_HARDDTMF;
-    }
-    if (a->manufacturer_features & (MANUFACTURER_FEATURE_HARDDTMF |
-      MANUFACTURER_FEATURE_SOFTDTMF_SEND | MANUFACTURER_FEATURE_SOFTDTMF_RECEIVE))
-    {
-      a->profile.Global_Options |= GL_DTMF_SUPPORTED;
-    }
-    a->manufacturer_features &= ~MANUFACTURER_FEATURE_OOB_CHANNEL;
-    dbug (1, dprintf ("[%06x] Profile: %lx %lx %lx %lx %lx",
-      UnMapController (a->Id), a->profile.Global_Options,
-      a->profile.B1_Protocols, a->profile.B2_Protocols,
-      a->profile.B3_Protocols, a->manufacturer_features));
-  }
-  /* codec plci for the handset/hook state support is just an internal id  */
-  if(plci!=a->AdvCodecPLCI)
-  {
-    force_mt_info =  SendMultiIE(plci,Id,multi_fac_parms, FTY, 0x20, 0);
-    force_mt_info |= SendMultiIE(plci,Id,multi_pi_parms, PI, 0x210, 0);
-    SendSSExtInd(NULL,plci,Id,multi_ssext_parms);
-    SendInfo(plci,Id, parms, force_mt_info);
-
-    VSwitchReqInd(plci,Id,multi_vswitch_parms);
-
-  }
-
-  /* switch the codec to the b-channel                                     */
-  if(esc_chi[0] && plci && !plci->SuppState){
-    plci->b_channel = esc_chi[esc_chi[0]]&0x1f;
-    mixer_set_bchannel_id_esc (plci, plci->b_channel);
-    dbug(1,dprintf("storeChannel=0x%x",plci->b_channel));
-    if(plci->tel==ADV_VOICE && plci->appl) {
-      SetVoiceChannel(a->AdvCodecPLCI, esc_chi, a);
-    }
-  }
-
-  if(plci->appl) plci->appl->Number++;
-
-  switch(plci->Sig.Ind) {
-  /* Response to Get_Supported_Services request */
-  case S_SUPPORTED:
-    dbug(1,dprintf("S_Supported"));
-    if(!plci->appl) break;
-    if(pty_cai[0]==4)
-    {
-      PUT_DWORD(&CF_Ind[6],GET_DWORD(&pty_cai[1]) );
-    }
-    else
-    {
-      PUT_DWORD(&CF_Ind[6],MASK_TERMINAL_PORTABILITY | MASK_HOLD_RETRIEVE);
-    }
-    PUT_WORD (&CF_Ind[1], 0);
-    PUT_WORD (&CF_Ind[4], 0);
-    sendf(plci->appl,_FACILITY_R|CONFIRM,Id&0x7,plci->number, "wws",0,3,CF_Ind);
-    plci_remove(plci);
-    break;
-                    
-  /* Supplementary Service rejected */
-  case S_SERVICE_REJ:
-    dbug(1,dprintf("S_Reject=0x%x",pty_cai[5]));
-    if(!pty_cai[0]) break;
-    switch (pty_cai[5])
-    {
-    case ECT_EXECUTE:
-    case THREE_PTY_END:
-    case THREE_PTY_BEGIN:
-      if(!plci->relatedPTYPLCI) break;
-      tplci = plci->relatedPTYPLCI;
-      rId = ( (word)tplci->Id<<8)|tplci->adapter->Id;
-      if(tplci->tel) rId|=EXT_CONTROLLER;
-      if(pty_cai[5]==ECT_EXECUTE)
-      {
-        PUT_WORD(&SS_Ind[1],S_ECT);
-
-        plci->vswitchstate=0;
-        plci->relatedPTYPLCI->vswitchstate=0;
-
-      }
-      else
-      {
-        PUT_WORD(&SS_Ind[1],pty_cai[5]+3);
-      }
-      if(pty_cai[2]!=0xff)
-      {
-        PUT_WORD(&SS_Ind[4],0x3600|(word)pty_cai[2]);
-      }
-      else
-      {
-        PUT_WORD(&SS_Ind[4],0x300E);
-      }
-      plci->relatedPTYPLCI = NULL;
-      plci->ptyState = 0;
-      sendf(tplci->appl,_FACILITY_I,rId,0,"ws",3, SS_Ind);
-      break;
-
-    case CALL_DEFLECTION:
-      if(pty_cai[2]!=0xff)
-      {
-        PUT_WORD(&SS_Ind[4],0x3600|(word)pty_cai[2]);
-      }
-      else
-      {
-        PUT_WORD(&SS_Ind[4],0x300E);
-      }
-      PUT_WORD(&SS_Ind[1],pty_cai[5]);
-      for(i=0; i<max_appl; i++)
-      {
-        if(application[i].CDEnable)
-        {
-          if(application[i].Id) sendf(&application[i],_FACILITY_I,Id,0,"ws",3, SS_Ind);
-          application[i].CDEnable = false;
-        }
-      }
-      break;
-
-    case DEACTIVATION_DIVERSION:
-    case ACTIVATION_DIVERSION:
-    case DIVERSION_INTERROGATE_CFU:
-    case DIVERSION_INTERROGATE_CFB:
-    case DIVERSION_INTERROGATE_CFNR:
-    case DIVERSION_INTERROGATE_NUM:
-    case CCBS_REQUEST:
-    case CCBS_DEACTIVATE:
-    case CCBS_INTERROGATE:
-      if(!plci->appl) break;
-      if(pty_cai[2]!=0xff)
-      {
-        PUT_WORD(&Interr_Err_Ind[4],0x3600|(word)pty_cai[2]);
-      }
-      else
-      {
-        PUT_WORD(&Interr_Err_Ind[4],0x300E);
-      }
-      switch (pty_cai[5])
-      {
-        case DEACTIVATION_DIVERSION:
-          dbug(1,dprintf("Deact_Div"));
-          Interr_Err_Ind[0]=0x9;
-          Interr_Err_Ind[3]=0x6;
-          PUT_WORD(&Interr_Err_Ind[1],S_CALL_FORWARDING_STOP);
-          break;
-        case ACTIVATION_DIVERSION:
-          dbug(1,dprintf("Act_Div"));
-          Interr_Err_Ind[0]=0x9;
-          Interr_Err_Ind[3]=0x6;
-          PUT_WORD(&Interr_Err_Ind[1],S_CALL_FORWARDING_START);
-          break;
-        case DIVERSION_INTERROGATE_CFU:
-        case DIVERSION_INTERROGATE_CFB:
-        case DIVERSION_INTERROGATE_CFNR:
-          dbug(1,dprintf("Interr_Div"));
-          Interr_Err_Ind[0]=0xa;
-          Interr_Err_Ind[3]=0x7;
-          PUT_WORD(&Interr_Err_Ind[1],S_INTERROGATE_DIVERSION);
-          break;
-        case DIVERSION_INTERROGATE_NUM:
-          dbug(1,dprintf("Interr_Num"));
-          Interr_Err_Ind[0]=0xa;
-          Interr_Err_Ind[3]=0x7;
-          PUT_WORD(&Interr_Err_Ind[1],S_INTERROGATE_NUMBERS);
-          break;
-        case CCBS_REQUEST:
-          dbug(1,dprintf("CCBS Request"));
-          Interr_Err_Ind[0]=0xd;
-          Interr_Err_Ind[3]=0xa;
-          PUT_WORD(&Interr_Err_Ind[1],S_CCBS_REQUEST);
-          break;
-        case CCBS_DEACTIVATE:
-          dbug(1,dprintf("CCBS Deactivate"));
-          Interr_Err_Ind[0]=0x9;
-          Interr_Err_Ind[3]=0x6;
-          PUT_WORD(&Interr_Err_Ind[1],S_CCBS_DEACTIVATE);
-          break;
-        case CCBS_INTERROGATE:
-          dbug(1,dprintf("CCBS Interrogate"));
-          Interr_Err_Ind[0]=0xb;
-          Interr_Err_Ind[3]=0x8;
-          PUT_WORD(&Interr_Err_Ind[1],S_CCBS_INTERROGATE);
-          break;
-      }
-      PUT_DWORD(&Interr_Err_Ind[6],plci->appl->S_Handle);
-      sendf(plci->appl,_FACILITY_I,Id&0x7,0,"ws",3, Interr_Err_Ind);
-      plci_remove(plci);
-      break;
-    case ACTIVATION_MWI:      
-    case DEACTIVATION_MWI:
-      if(pty_cai[5]==ACTIVATION_MWI)
-      {
-        PUT_WORD(&SS_Ind[1],S_MWI_ACTIVATE);
-      }
-      else PUT_WORD(&SS_Ind[1],S_MWI_DEACTIVATE);
-      
-      if(pty_cai[2]!=0xff)
-      {
-        PUT_WORD(&SS_Ind[4],0x3600|(word)pty_cai[2]);
-      }
-      else
-      {
-        PUT_WORD(&SS_Ind[4],0x300E);
-      }
-
-      if(plci->cr_enquiry)
-      {
-        sendf(plci->appl,_FACILITY_I,Id&0xf,0,"ws",3, SS_Ind);
-        plci_remove(plci);
-      }
-      else
-      {
-        sendf(plci->appl,_FACILITY_I,Id,0,"ws",3, SS_Ind);
-      }
-      break;
-    case CONF_ADD: /* ERROR */
-    case CONF_BEGIN:
-    case CONF_DROP:
-    case CONF_ISOLATE:
-    case CONF_REATTACH:
-      CONF_Ind[0]=9;
-      CONF_Ind[3]=6;   
-      switch(pty_cai[5])
-      {
-      case CONF_BEGIN:
-          PUT_WORD(&CONF_Ind[1],S_CONF_BEGIN);
-          plci->ptyState = 0;
-          break;
-      case CONF_DROP:
-          CONF_Ind[0]=5;
-          CONF_Ind[3]=2;
-          PUT_WORD(&CONF_Ind[1],S_CONF_DROP);
-          plci->ptyState = CONNECTED;
-          break;
-      case CONF_ISOLATE:
-          CONF_Ind[0]=5;
-          CONF_Ind[3]=2;
-          PUT_WORD(&CONF_Ind[1],S_CONF_ISOLATE);
-          plci->ptyState = CONNECTED;
-          break;
-      case CONF_REATTACH:
-          CONF_Ind[0]=5;
-          CONF_Ind[3]=2;
-          PUT_WORD(&CONF_Ind[1],S_CONF_REATTACH);
-          plci->ptyState = CONNECTED;
-          break;
-      case CONF_ADD:
-          PUT_WORD(&CONF_Ind[1],S_CONF_ADD);
-          plci->relatedPTYPLCI = NULL;
-          tplci=plci->relatedPTYPLCI;
-          if(tplci) tplci->ptyState = CONNECTED;
-          plci->ptyState = CONNECTED;
-          break;
-      }
-          
-      if(pty_cai[2]!=0xff)
-      {
-        PUT_WORD(&CONF_Ind[4],0x3600|(word)pty_cai[2]);
-      }
-      else
-      {
-        PUT_WORD(&CONF_Ind[4],0x3303); /* Time-out: network did not respond
-                                            within the required time */
-      }
-
-      PUT_DWORD(&CONF_Ind[6],0x0);
-      sendf(plci->appl,_FACILITY_I,Id,0,"ws",3, CONF_Ind);
-      break;
-    }
-    break;
-
-  /* Supplementary Service indicates success */
-  case S_SERVICE:
-    dbug(1,dprintf("Service_Ind"));
-    PUT_WORD (&CF_Ind[4], 0);
-    switch (pty_cai[5])
-    {
-    case THREE_PTY_END:
-    case THREE_PTY_BEGIN:
-    case ECT_EXECUTE:
-      if(!plci->relatedPTYPLCI) break;
-      tplci = plci->relatedPTYPLCI;
-      rId = ( (word)tplci->Id<<8)|tplci->adapter->Id;
-      if(tplci->tel) rId|=EXT_CONTROLLER;
-      if(pty_cai[5]==ECT_EXECUTE)
-      {
-        PUT_WORD(&SS_Ind[1],S_ECT);
-
-        if(plci->vswitchstate!=3)
-        {
-
-        plci->ptyState = IDLE;
-        plci->relatedPTYPLCI = NULL;
-        plci->ptyState = 0;
-
-        }
-
-        dbug(1,dprintf("ECT OK"));
-        sendf(tplci->appl,_FACILITY_I,rId,0,"ws",3, SS_Ind);
-
-
-
-      }
-      else
-      {
-        switch (plci->ptyState)
-        {
-        case S_3PTY_BEGIN:
-          plci->ptyState = CONNECTED;
-          dbug(1,dprintf("3PTY ON"));
-          break;
-
-        case S_3PTY_END:
-          plci->ptyState = IDLE;
-          plci->relatedPTYPLCI = NULL;
-          plci->ptyState = 0;
-          dbug(1,dprintf("3PTY OFF"));
-          break;
-        }
-        PUT_WORD(&SS_Ind[1],pty_cai[5]+3);
-        sendf(tplci->appl,_FACILITY_I,rId,0,"ws",3, SS_Ind);
-      }
-      break;
-
-    case CALL_DEFLECTION:
-      PUT_WORD(&SS_Ind[1],pty_cai[5]);
-      for(i=0; i<max_appl; i++)
-      {
-        if(application[i].CDEnable)
-        {
-          if(application[i].Id) sendf(&application[i],_FACILITY_I,Id,0,"ws",3, SS_Ind);
-          application[i].CDEnable = false;
-        }
-      }
-      break;
-
-    case DEACTIVATION_DIVERSION:
-    case ACTIVATION_DIVERSION:
-      if(!plci->appl) break;
-      PUT_WORD(&CF_Ind[1],pty_cai[5]+2);
-      PUT_DWORD(&CF_Ind[6],plci->appl->S_Handle);
-      sendf(plci->appl,_FACILITY_I,Id&0x7,0,"ws",3, CF_Ind);
-      plci_remove(plci);
-      break;
-
-    case DIVERSION_INTERROGATE_CFU:
-    case DIVERSION_INTERROGATE_CFB:
-    case DIVERSION_INTERROGATE_CFNR:
-    case DIVERSION_INTERROGATE_NUM:
-    case CCBS_REQUEST:
-    case CCBS_DEACTIVATE:
-    case CCBS_INTERROGATE:
-      if(!plci->appl) break;
-      switch (pty_cai[5])
-      {
-        case DIVERSION_INTERROGATE_CFU:
-        case DIVERSION_INTERROGATE_CFB:
-        case DIVERSION_INTERROGATE_CFNR:
-          dbug(1,dprintf("Interr_Div"));
-          PUT_WORD(&pty_cai[1],S_INTERROGATE_DIVERSION);
-          pty_cai[3]=pty_cai[0]-3; /* Supplementary Service-specific parameter len */
-          break;
-        case DIVERSION_INTERROGATE_NUM:
-          dbug(1,dprintf("Interr_Num"));
-          PUT_WORD(&pty_cai[1],S_INTERROGATE_NUMBERS);
-          pty_cai[3]=pty_cai[0]-3; /* Supplementary Service-specific parameter len */
-          break;
-        case CCBS_REQUEST:
-          dbug(1,dprintf("CCBS Request"));
-          PUT_WORD(&pty_cai[1],S_CCBS_REQUEST);
-          pty_cai[3]=pty_cai[0]-3; /* Supplementary Service-specific parameter len */
-          break;
-        case CCBS_DEACTIVATE:
-          dbug(1,dprintf("CCBS Deactivate"));
-          PUT_WORD(&pty_cai[1],S_CCBS_DEACTIVATE);
-          pty_cai[3]=pty_cai[0]-3; /* Supplementary Service-specific parameter len */
-          break;
-        case CCBS_INTERROGATE:
-          dbug(1,dprintf("CCBS Interrogate"));
-          PUT_WORD(&pty_cai[1],S_CCBS_INTERROGATE);
-          pty_cai[3]=pty_cai[0]-3; /* Supplementary Service-specific parameter len */
-          break;
-      }
-      PUT_WORD(&pty_cai[4],0); /* Supplementary Service Reason */
-      PUT_DWORD(&pty_cai[6],plci->appl->S_Handle);
-      sendf(plci->appl,_FACILITY_I,Id&0x7,0,"wS",3, pty_cai);
-      plci_remove(plci);
-      break;
-
-    case ACTIVATION_MWI:
-    case DEACTIVATION_MWI:
-      if(pty_cai[5]==ACTIVATION_MWI)
-      {
-        PUT_WORD(&SS_Ind[1],S_MWI_ACTIVATE);
-      }
-      else PUT_WORD(&SS_Ind[1],S_MWI_DEACTIVATE);
-      if(plci->cr_enquiry)
-      {
-        sendf(plci->appl,_FACILITY_I,Id&0xf,0,"ws",3, SS_Ind);
-        plci_remove(plci);
-      }
-      else
-      {
-        sendf(plci->appl,_FACILITY_I,Id,0,"ws",3, SS_Ind);
-      }
-      break;
-    case MWI_INDICATION:
-      if(pty_cai[0]>=0x12)
-      {
-        PUT_WORD(&pty_cai[3],S_MWI_INDICATE);
-        pty_cai[2]=pty_cai[0]-2; /* len Parameter */
-        pty_cai[5]=pty_cai[0]-5; /* Supplementary Service-specific parameter len */
-        if(plci->appl && (a->Notification_Mask[plci->appl->Id-1]&SMASK_MWI))
-        {
-          if(plci->internal_command==GET_MWI_STATE) /* result on Message Waiting Listen */
-          {
-            sendf(plci->appl,_FACILITY_I,Id&0xf,0,"wS",3, &pty_cai[2]);
-            plci_remove(plci);
-            return;
-          }
-          else  sendf(plci->appl,_FACILITY_I,Id,0,"wS",3, &pty_cai[2]);
-          pty_cai[0]=0;
-        }
-        else
-        {
-          for(i=0; i<max_appl; i++)
-          {                     
-            if(a->Notification_Mask[i]&SMASK_MWI)
-            {
-              sendf(&application[i],_FACILITY_I,Id&0x7,0,"wS",3, &pty_cai[2]);
-              pty_cai[0]=0;
-            }
-          }
-        }
-
-        if(!pty_cai[0])
-        { /* acknowledge */
-          facility[2]= 0; /* returncode */
-        }
-        else facility[2]= 0xff;
-      }
-      else
-      {
-        /* reject */
-        facility[2]= 0xff; /* returncode */
-      }
-      facility[0]= 2;
-      facility[1]= MWI_RESPONSE; /* Function */
-      add_p(plci,CAI,facility);
-      add_p(plci,ESC,multi_ssext_parms[0]); /* remembered parameter -> only one possible */
-      sig_req(plci,S_SERVICE,0);
-      send_req(plci);
-      plci->command = 0;
-      next_internal_command (Id, plci);
-      break;
-    case CONF_ADD: /* OK */
-    case CONF_BEGIN:
-    case CONF_DROP:
-    case CONF_ISOLATE:
-    case CONF_REATTACH:
-    case CONF_PARTYDISC:
-      CONF_Ind[0]=9;
-      CONF_Ind[3]=6;
-      switch(pty_cai[5])
-      {
-      case CONF_BEGIN:
-          PUT_WORD(&CONF_Ind[1],S_CONF_BEGIN);
-          if(pty_cai[0]==6)
-          {
-              d=pty_cai[6];
-              PUT_DWORD(&CONF_Ind[6],d); /* PartyID */
-          }
-          else
-          {
-              PUT_DWORD(&CONF_Ind[6],0x0);
-          }
-          break;
-      case CONF_ISOLATE:
-          PUT_WORD(&CONF_Ind[1],S_CONF_ISOLATE);
-          CONF_Ind[0]=5;
-          CONF_Ind[3]=2;
-          break;
-      case CONF_REATTACH:
-          PUT_WORD(&CONF_Ind[1],S_CONF_REATTACH);
-          CONF_Ind[0]=5;
-          CONF_Ind[3]=2;
-          break;
-      case CONF_DROP:
-          PUT_WORD(&CONF_Ind[1],S_CONF_DROP);
-          CONF_Ind[0]=5;
-          CONF_Ind[3]=2;
-          break;
-      case CONF_ADD:
-          PUT_WORD(&CONF_Ind[1],S_CONF_ADD);
-          d=pty_cai[6];
-          PUT_DWORD(&CONF_Ind[6],d); /* PartyID */
-          tplci=plci->relatedPTYPLCI;
-          if(tplci) tplci->ptyState = CONNECTED;
-          break;
-      case CONF_PARTYDISC:
-          CONF_Ind[0]=7;
-          CONF_Ind[3]=4;          
-          PUT_WORD(&CONF_Ind[1],S_CONF_PARTYDISC);
-          d=pty_cai[6];
-          PUT_DWORD(&CONF_Ind[4],d); /* PartyID */
-          break;
-      }
-      plci->ptyState = CONNECTED;
-      sendf(plci->appl,_FACILITY_I,Id,0,"ws",3, CONF_Ind);
-      break;
-    case CCBS_INFO_RETAIN:
-    case CCBS_ERASECALLLINKAGEID:
-    case CCBS_STOP_ALERTING:
-      CONF_Ind[0]=5;
-      CONF_Ind[3]=2;
-      switch(pty_cai[5])
-      {
-      case CCBS_INFO_RETAIN:
-        PUT_WORD(&CONF_Ind[1],S_CCBS_INFO_RETAIN);
-        break;
-      case CCBS_STOP_ALERTING:
-        PUT_WORD(&CONF_Ind[1],S_CCBS_STOP_ALERTING);
-    break;
-      case CCBS_ERASECALLLINKAGEID:
-        PUT_WORD(&CONF_Ind[1],S_CCBS_ERASECALLLINKAGEID);
-        CONF_Ind[0]=7;
-        CONF_Ind[3]=4;
-        CONF_Ind[6]=0;
-        CONF_Ind[7]=0;
-        break;
-      }      
-      w=pty_cai[6];
-      PUT_WORD(&CONF_Ind[4],w); /* PartyID */
-
-      if(plci->appl && (a->Notification_Mask[plci->appl->Id-1]&SMASK_CCBS))
-      {
-        sendf(plci->appl,_FACILITY_I,Id,0,"ws",3, CONF_Ind);
-      }
-      else
-      {
-        for(i=0; i<max_appl; i++)
-            if(a->Notification_Mask[i]&SMASK_CCBS)
-                sendf(&application[i],_FACILITY_I,Id&0x7,0,"ws",3, CONF_Ind);
-      }
-      break;
-    }
-    break;
-  case CALL_HOLD_REJ:
-    cau = parms[7];
-    if(cau)
-    {
-      i = _L3_CAUSE | cau[2];
-      if(cau[2]==0) i = 0x3603;
-    }
-    else
-    {
-      i = 0x3603;
-    }
-    PUT_WORD(&SS_Ind[1],S_HOLD);
-    PUT_WORD(&SS_Ind[4],i);
-    if(plci->SuppState == HOLD_REQUEST)
-    {
-      plci->SuppState = IDLE;
-      sendf(plci->appl,_FACILITY_I,Id,0,"ws",3, SS_Ind);
-    }
-    break;
-
-  case CALL_HOLD_ACK:
-    if(plci->SuppState == HOLD_REQUEST)
-    {
-      plci->SuppState = CALL_HELD;
-      CodecIdCheck(a, plci);
-      start_internal_command (Id, plci, hold_save_command);
-    }
-    break;
-
-  case CALL_RETRIEVE_REJ:
-    cau = parms[7];
-    if(cau)
-    {
-      i = _L3_CAUSE | cau[2];
-      if(cau[2]==0) i = 0x3603;
-    }
-    else
-    {
-      i = 0x3603;
-    }
-    PUT_WORD(&SS_Ind[1],S_RETRIEVE);
-    PUT_WORD(&SS_Ind[4],i);
-    if(plci->SuppState == RETRIEVE_REQUEST)
-    {
-      plci->SuppState = CALL_HELD;
-      CodecIdCheck(a, plci);
-      sendf(plci->appl,_FACILITY_I,Id,0,"ws",3, SS_Ind);
-    }
-    break;
-
-  case CALL_RETRIEVE_ACK:
-    PUT_WORD(&SS_Ind[1],S_RETRIEVE);
-    if(plci->SuppState == RETRIEVE_REQUEST)
-    {
-      plci->SuppState = IDLE;
-      plci->call_dir |= CALL_DIR_FORCE_OUTG_NL;
-      plci->b_channel = esc_chi[esc_chi[0]]&0x1f;
-      if(plci->tel)
-      {
-        mixer_set_bchannel_id_esc (plci, plci->b_channel);
-        dbug(1,dprintf("RetrChannel=0x%x",plci->b_channel));
-        SetVoiceChannel(a->AdvCodecPLCI, esc_chi, a);
-        if(plci->B2_prot==B2_TRANSPARENT && plci->B3_prot==B3_TRANSPARENT)
-        {
-          dbug(1,dprintf("Get B-ch"));
-          start_internal_command (Id, plci, retrieve_restore_command);
-        }
-        else
-          sendf(plci->appl,_FACILITY_I,Id,0,"ws",3, SS_Ind);
-      }
-      else
-        start_internal_command (Id, plci, retrieve_restore_command);
-    }
-    break;
-
-  case INDICATE_IND:
-    if(plci->State != LISTENING) {
-      sig_req(plci,HANGUP,0);
-      send_req(plci);
-      break;
-    }
-    cip = find_cip(a,parms[4],parms[6]);
-    cip_mask = 1L<<cip;
-    dbug(1,dprintf("cip=%d,cip_mask=%lx",cip,cip_mask));
-    clear_c_ind_mask (plci);
-    if (!remove_started && !a->adapter_disabled)
-    {
-      set_c_ind_mask_bit (plci, MAX_APPL);
-      group_optimization(a, plci);
-      for(i=0; i<max_appl; i++) {
-        if(application[i].Id
-        && (a->CIP_Mask[i]&1 || a->CIP_Mask[i]&cip_mask)
-        && CPN_filter_ok(parms[0],a,i)
-        && test_group_ind_mask_bit (plci, i) ) {
-          dbug(1,dprintf("storedcip_mask[%d]=0x%lx",i,a->CIP_Mask[i] ));
-          set_c_ind_mask_bit (plci, i);
-          dump_c_ind_mask (plci);
-          plci->State = INC_CON_PENDING;
-          plci->call_dir = (plci->call_dir & ~(CALL_DIR_OUT | CALL_DIR_ORIGINATE)) |
-            CALL_DIR_IN | CALL_DIR_ANSWER;
-          if(esc_chi[0]) {
-            plci->b_channel = esc_chi[esc_chi[0]]&0x1f;
-            mixer_set_bchannel_id_esc (plci, plci->b_channel);
-          }
-          /* if a listen on the ext controller is done, check if hook states */
-          /* are supported or if just a on board codec must be activated     */
-          if(a->codec_listen[i] && !a->AdvSignalPLCI) {
-            if(a->profile.Global_Options & HANDSET)
-              plci->tel = ADV_VOICE;
-            else if(a->profile.Global_Options & ON_BOARD_CODEC)
-              plci->tel = CODEC;
-            if(plci->tel) Id|=EXT_CONTROLLER;
-            a->codec_listen[i] = plci;
-          }
-
-          sendf(&application[i],_CONNECT_I,Id,0,
-                "wSSSSSSSbSSSSS", cip,    /* CIP                 */
-                             parms[0],    /* CalledPartyNumber   */
-                             multi_CiPN_parms[0],    /* CallingPartyNumber  */
-                             parms[2],    /* CalledPartySubad    */
-                             parms[3],    /* CallingPartySubad   */
-                             parms[4],    /* BearerCapability    */
-                             parms[5],    /* LowLC               */
-                             parms[6],    /* HighLC              */
-                             ai_len,      /* nested struct add_i */
-                             add_i[0],    /* B channel info    */
-                             add_i[1],    /* keypad facility   */
-                             add_i[2],    /* user user data    */
-                             add_i[3],    /* nested facility   */
-                             multi_CiPN_parms[1]    /* second CiPN(SCR)   */
-                             );
-          SendSSExtInd(&application[i],
-                        plci,
-                        Id,
-                        multi_ssext_parms);
-          SendSetupInfo(&application[i],
-                        plci,
-                        Id,
-                        parms,
-                        SendMultiIE(plci,Id,multi_pi_parms, PI, 0x210, true));
-        }
-      }
-      clear_c_ind_mask_bit (plci, MAX_APPL);
-      dump_c_ind_mask (plci);
-    }
-    if(c_ind_mask_empty (plci)) {
-      sig_req(plci,HANGUP,0);
-      send_req(plci);
-      plci->State = IDLE;
-    }
-    plci->notifiedcall = 0;
-    a->listen_active--;
-    listen_check(a);
-    break;
-
-  case CALL_PEND_NOTIFY:
-    plci->notifiedcall = 1;
-    listen_check(a);
-    break;
-
-  case CALL_IND:
-  case CALL_CON:
-    if(plci->State==ADVANCED_VOICE_SIG || plci->State==ADVANCED_VOICE_NOSIG)
-    {
-      if(plci->internal_command==PERM_COD_CONN_PEND)
-      {
-        if(plci->State==ADVANCED_VOICE_NOSIG)
-        {
-          dbug(1,dprintf("***Codec OK"));
-          if(a->AdvSignalPLCI)
-          {
-            tplci = a->AdvSignalPLCI;
-            if(tplci->spoofed_msg)
-            {
-              dbug(1,dprintf("***Spoofed Msg(0x%x)",tplci->spoofed_msg));
-              tplci->command = 0;
-              tplci->internal_command = 0;
-              x_Id = ((word)tplci->Id<<8)|tplci->adapter->Id | 0x80;
-              switch (tplci->spoofed_msg)
-              {
-              case CALL_RES:
-                tplci->command = _CONNECT_I|RESPONSE;
-                api_load_msg (&tplci->saved_msg, saved_parms);
-                add_b1(tplci,&saved_parms[1],0,tplci->B1_facilities);
-                if (tplci->adapter->Info_Mask[tplci->appl->Id-1] & 0x200)
-                {
-                  /* early B3 connect (CIP mask bit 9) no release after a disc */
-                  add_p(tplci,LLI,"\x01\x01");
-                }
-                add_s(tplci, CONN_NR, &saved_parms[2]);
-                add_s(tplci, LLC, &saved_parms[4]);
-                add_ai(tplci, &saved_parms[5]);
-                tplci->State = INC_CON_ACCEPT;
-                sig_req(tplci, CALL_RES,0);
-                send_req(tplci);
-                break;
-
-              case AWAITING_SELECT_B:
-                dbug(1,dprintf("Select_B continue"));
-                start_internal_command (x_Id, tplci, select_b_command);
-                break;
-
-              case AWAITING_MANUF_CON: /* Get_Plci per Manufacturer_Req to ext controller */
-                if(!tplci->Sig.Id)
-                {
-                  dbug(1,dprintf("No SigID!"));
-                  sendf(tplci->appl, _MANUFACTURER_R|CONFIRM,x_Id,tplci->number, "dww",_DI_MANU_ID,_MANUFACTURER_R,_OUT_OF_PLCI);
-                  plci_remove(tplci);
-                  break;
-                }
-                tplci->command = _MANUFACTURER_R;
-                api_load_msg (&tplci->saved_msg, saved_parms);
-                dir = saved_parms[2].info[0];
-                if(dir==1) {
-                  sig_req(tplci,CALL_REQ,0);
-                }
-                else if(!dir){
-                  sig_req(tplci,LISTEN_REQ,0);
-                }
-                send_req(tplci);
-                sendf(tplci->appl, _MANUFACTURER_R|CONFIRM,x_Id,tplci->number, "dww",_DI_MANU_ID,_MANUFACTURER_R,0);
-                break;
-
-              case (CALL_REQ|AWAITING_MANUF_CON):
-                sig_req(tplci,CALL_REQ,0);
-                send_req(tplci);
-                break;
-
-              case CALL_REQ:
-                if(!tplci->Sig.Id)
-                {
-                  dbug(1,dprintf("No SigID!"));
-                  sendf(tplci->appl,_CONNECT_R|CONFIRM,tplci->adapter->Id,0,"w",_OUT_OF_PLCI);
-                  plci_remove(tplci);
-                  break;
-                }
-                tplci->command = _CONNECT_R;
-                api_load_msg (&tplci->saved_msg, saved_parms);
-                add_s(tplci,CPN,&saved_parms[1]);
-                add_s(tplci,DSA,&saved_parms[3]);
-                add_ai(tplci,&saved_parms[9]);
-                sig_req(tplci,CALL_REQ,0);
-                send_req(tplci);
-                break;
-
-              case CALL_RETRIEVE:
-                tplci->command = C_RETRIEVE_REQ;
-                sig_req(tplci,CALL_RETRIEVE,0);
-                send_req(tplci);
-                break;
-              }
-              tplci->spoofed_msg = 0;
-              if (tplci->internal_command == 0)
-                next_internal_command (x_Id, tplci);
-            }
-          }
-          next_internal_command (Id, plci);
-          break;
-        }
-        dbug(1,dprintf("***Codec Hook Init Req"));
-        plci->internal_command = PERM_COD_HOOK;
-        add_p(plci,FTY,"\x01\x09");             /* Get Hook State*/
-        sig_req(plci,TEL_CTRL,0);
-        send_req(plci);
-      }
-    }
-    else if(plci->command != _MANUFACTURER_R  /* old style permanent connect */
-    && plci->State!=INC_ACT_PENDING)
-    {
-      mixer_set_bchannel_id_esc (plci, plci->b_channel);
-      if(plci->tel == ADV_VOICE && plci->SuppState == IDLE) /* with permanent codec switch on immediately */
-      {
-        chi[2] = plci->b_channel;
-        SetVoiceChannel(a->AdvCodecPLCI, chi, a);
-      }
-      sendf(plci->appl,_CONNECT_ACTIVE_I,Id,0,"Sss",parms[21],"","");
-      plci->State = INC_ACT_PENDING;
-    }
-    break;
-
-  case TEL_CTRL:
-    ie = multi_fac_parms[0]; /* inspect the facility hook indications */
-    if(plci->State==ADVANCED_VOICE_SIG && ie[0]){
-      switch (ie[1]&0x91) {
-        case 0x80:   /* hook off */
-        case 0x81:
-          if(plci->internal_command==PERM_COD_HOOK)
-          {
-            dbug(1,dprintf("init:hook_off"));
-            plci->hook_state = ie[1];
-            next_internal_command (Id, plci);
-            break;
-          }
-          else /* ignore doubled hook indications */
-          {
-            if( ((plci->hook_state)&0xf0)==0x80)
-            {
-              dbug(1,dprintf("ignore hook"));
-              break;
-            }
-            plci->hook_state = ie[1]&0x91;
-          }
-          /* check for incoming call pending */
-          /* and signal '+'.Appl must decide */
-          /* with connect_res if call must   */
-          /* accepted or not                 */
-          for(i=0, tplci=NULL;i<max_appl;i++){
-            if(a->codec_listen[i]
-            && (a->codec_listen[i]->State==INC_CON_PENDING
-              ||a->codec_listen[i]->State==INC_CON_ALERT) ){
-              tplci = a->codec_listen[i];
-              tplci->appl = &application[i];
-            }
-          }
-          /* no incoming call, do outgoing call */
-          /* and signal '+' if outg. setup   */
-          if(!a->AdvSignalPLCI && !tplci){
-            if((i=get_plci(a))) {
-              a->AdvSignalPLCI = &a->plci[i-1];
-              tplci = a->AdvSignalPLCI;
-              tplci->tel  = ADV_VOICE;
-              PUT_WORD(&voice_cai[5],a->AdvSignalAppl->MaxDataLength);
-              if (a->Info_Mask[a->AdvSignalAppl->Id-1] & 0x200){
-                /* early B3 connect (CIP mask bit 9) no release after a disc */
-                add_p(tplci,LLI,"\x01\x01");
-              }
-              add_p(tplci, CAI, voice_cai);
-              add_p(tplci, OAD, a->TelOAD);
-              add_p(tplci, OSA, a->TelOSA);
-              add_p(tplci,SHIFT|6,NULL);
-              add_p(tplci,SIN,"\x02\x01\x00");
-              add_p(tplci,UID,"\x06\x43\x61\x70\x69\x32\x30");
-              sig_req(tplci,ASSIGN,DSIG_ID);
-              a->AdvSignalPLCI->internal_command = HOOK_OFF_REQ;
-              a->AdvSignalPLCI->command = 0;
-              tplci->appl = a->AdvSignalAppl;
-              tplci->call_dir = CALL_DIR_OUT | CALL_DIR_ORIGINATE;
-              send_req(tplci);
-            }
-
-          }
-
-          if(!tplci) break;
-          Id = ((word)tplci->Id<<8)|a->Id;
-          Id|=EXT_CONTROLLER;
-          sendf(tplci->appl,
-                _FACILITY_I,
-                Id,
-                0,
-                "ws", (word)0, "\x01+");
-          break;
-
-        case 0x90:   /* hook on  */
-        case 0x91:
-          if(plci->internal_command==PERM_COD_HOOK)
-          {
-            dbug(1,dprintf("init:hook_on"));
-            plci->hook_state = ie[1]&0x91;
-            next_internal_command (Id, plci);
-            break;
-          }
-          else /* ignore doubled hook indications */
-          {
-            if( ((plci->hook_state)&0xf0)==0x90) break;
-            plci->hook_state = ie[1]&0x91;
-          }
-          /* hangup the adv. voice call and signal '-' to the appl */
-          if(a->AdvSignalPLCI) {
-            Id = ((word)a->AdvSignalPLCI->Id<<8)|a->Id;
-            if(plci->tel) Id|=EXT_CONTROLLER;
-            sendf(a->AdvSignalAppl,
-                  _FACILITY_I,
-                  Id,
-                  0,
-                  "ws", (word)0, "\x01-");
-            a->AdvSignalPLCI->internal_command = HOOK_ON_REQ;
-            a->AdvSignalPLCI->command = 0;
-            sig_req(a->AdvSignalPLCI,HANGUP,0);
-            send_req(a->AdvSignalPLCI);
-          }
-          break;
-      }
-    }
-    break;
-
-  case RESUME:
-    clear_c_ind_mask_bit (plci, (word)(plci->appl->Id-1));
-    PUT_WORD(&resume_cau[4],GOOD);
-    sendf(plci->appl,_FACILITY_I,Id,0,"ws", (word)3, resume_cau);
-    break;
-
-  case SUSPEND:
-    clear_c_ind_mask (plci);
-
-    if (plci->NL.Id && !plci->nl_remove_id) {
-      mixer_remove (plci);
-      nl_req_ncci(plci,REMOVE,0);
-    }
-    if (!plci->sig_remove_id) {
-      plci->internal_command = 0;
-      sig_req(plci,REMOVE,0);
-    }
-    send_req(plci);
-    if(!plci->channels) {
-      sendf(plci->appl,_FACILITY_I,Id,0,"ws", (word)3, "\x05\x04\x00\x02\x00\x00");
-      sendf(plci->appl, _DISCONNECT_I, Id, 0, "w", 0);
-    }
-    break;
-
-  case SUSPEND_REJ:
-    break;
-
-  case HANGUP:
-    plci->hangup_flow_ctrl_timer=0;
-    if(plci->manufacturer && plci->State==LOCAL_CONNECT) break;
-    cau = parms[7];
-    if(cau) {
-      i = _L3_CAUSE | cau[2];
-      if(cau[2]==0) i = 0;
-      else if(cau[2]==8) i = _L1_ERROR;
-      else if(cau[2]==9 || cau[2]==10) i = _L2_ERROR;
-      else if(cau[2]==5) i = _CAPI_GUARD_ERROR;
-    }
-    else {
-      i = _L3_ERROR;
-    }
-
-    if(plci->State==INC_CON_PENDING || plci->State==INC_CON_ALERT)
-    {
-      for(i=0; i<max_appl; i++)
-      {
-        if(test_c_ind_mask_bit (plci, i))
-          sendf(&application[i], _DISCONNECT_I, Id, 0, "w", 0);
-      }
-    }
-    else
-    {
-      clear_c_ind_mask (plci);
-    }
-    if(!plci->appl)
-    {
-      if (plci->State == LISTENING)
-      {
-        plci->notifiedcall=0;
-        a->listen_active--;
-      }
-      plci->State = INC_DIS_PENDING;
-      if(c_ind_mask_empty (plci))
-      {
-        plci->State = IDLE;
-        if (plci->NL.Id && !plci->nl_remove_id)
-        {
-          mixer_remove (plci);
-          nl_req_ncci(plci,REMOVE,0);
-        }
-        if (!plci->sig_remove_id)
-        {
-          plci->internal_command = 0;
-          sig_req(plci,REMOVE,0);
-        }
-        send_req(plci);
-      }
-    }
-    else
-    {
-        /* collision of DISCONNECT or CONNECT_RES with HANGUP can   */
-        /* result in a second HANGUP! Don't generate another        */
-        /* DISCONNECT                                               */
-      if(plci->State!=IDLE && plci->State!=INC_DIS_PENDING)
-      {
-        if(plci->State==RESUMING)
-        {
-          PUT_WORD(&resume_cau[4],i);
-          sendf(plci->appl,_FACILITY_I,Id,0,"ws", (word)3, resume_cau);
-        }
-        plci->State = INC_DIS_PENDING;
-        sendf(plci->appl,_DISCONNECT_I,Id,0,"w",i);
-      }
-    }
-    break;
-
-  case SSEXT_IND:
-    SendSSExtInd(NULL,plci,Id,multi_ssext_parms);
-    break;
-
-  case VSWITCH_REQ:
-    VSwitchReqInd(plci,Id,multi_vswitch_parms);
-    break;
-  case VSWITCH_IND:
- if(plci->relatedPTYPLCI &&
-  plci->vswitchstate==3 &&
-  plci->relatedPTYPLCI->vswitchstate==3 &&
-  parms[MAXPARMSIDS-1][0])
- {
-  add_p(plci->relatedPTYPLCI,SMSG,parms[MAXPARMSIDS-1]);
-  sig_req(plci->relatedPTYPLCI,VSWITCH_REQ,0);
-  send_req(plci->relatedPTYPLCI);
- }
-    else VSwitchReqInd(plci,Id,multi_vswitch_parms);
-    break;
-
-  }
-}
-
-
-static void SendSetupInfo(APPL   * appl, PLCI   * plci, dword Id, byte   * * parms, byte Info_Sent_Flag)
-{
-  word i;
-  byte   * ie;
-  word Info_Number;
-  byte   * Info_Element;
-  word Info_Mask = 0;
-
-  dbug(1,dprintf("SetupInfo"));
-
-  for(i=0; i<MAXPARMSIDS; i++) {
-    ie = parms[i];
-    Info_Number = 0;
-    Info_Element = ie;
-    if(ie[0]) {
-      switch(i) {
-      case 0:
-        dbug(1,dprintf("CPN "));
-        Info_Number = 0x0070;
-        Info_Mask   = 0x80;
-        Info_Sent_Flag = true;
-        break;
-      case 8:  /* display      */
-        dbug(1,dprintf("display(%d)",i));
-        Info_Number = 0x0028;
-        Info_Mask = 0x04;
-        Info_Sent_Flag = true;
-        break;
-      case 16: /* Channel Id */
-        dbug(1,dprintf("CHI"));
-        Info_Number = 0x0018;
-        Info_Mask = 0x100;
-        Info_Sent_Flag = true;
-        mixer_set_bchannel_id (plci, Info_Element);
-        break;
-      case 19: /* Redirected Number */
-        dbug(1,dprintf("RDN"));
-        Info_Number = 0x0074;
-        Info_Mask = 0x400;
-        Info_Sent_Flag = true;
-        break;
-      case 20: /* Redirected Number extended */
-        dbug(1,dprintf("RDX"));
-        Info_Number = 0x0073;
-        Info_Mask = 0x400;
-        Info_Sent_Flag = true;
-        break;
-      case 22: /* Redirecing Number  */
-        dbug(1,dprintf("RIN"));
-        Info_Number = 0x0076;
-        Info_Mask = 0x400;
-        Info_Sent_Flag = true;
-        break;
-      default:
-        Info_Number = 0;
-        break;
-      }
-    }
-
-    if(i==MAXPARMSIDS-2){ /* to indicate the message type "Setup" */
-      Info_Number = 0x8000 |5;
-      Info_Mask = 0x10;
-      Info_Element = "";
-    }
-
-    if(Info_Sent_Flag && Info_Number){
-      if(plci->adapter->Info_Mask[appl->Id-1] & Info_Mask) {
-        sendf(appl,_INFO_I,Id,0,"wS",Info_Number,Info_Element);
-      }
-    }
-  }
+       byte *parms[MAXPARMSIDS];
+       byte *add_i[4];
+       byte *multi_fac_parms[MAX_MULTI_IE];
+       byte *multi_pi_parms[MAX_MULTI_IE];
+       byte *multi_ssext_parms[MAX_MULTI_IE];
+       byte *multi_CiPN_parms[MAX_MULTI_IE];
+
+       byte *multi_vswitch_parms[MAX_MULTI_IE];
+
+       byte ai_len;
+       byte *esc_chi = "";
+       byte *esc_law = "";
+       byte *pty_cai = "";
+       byte *esc_cr  = "";
+       byte *esc_profile = "";
+
+       byte facility[256];
+       PLCI *tplci = NULL;
+       byte chi[] = "\x02\x18\x01";
+       byte voice_cai[]  = "\x06\x14\x00\x00\x00\x00\x08";
+       byte resume_cau[] = "\x05\x05\x00\x02\x00\x00";
+       /* ESC_MSGTYPE must be the last but one message, a new IE has to be */
+       /* included before the ESC_MSGTYPE and MAXPARMSIDS has to be incremented */
+       /* SMSG is situated at the end because its 0 (for compatibility reasons */
+       /* (see Info_Mask Bit 4, first IE. then the message type)           */
+       word parms_id[] =
+               {MAXPARMSIDS, CPN, 0xff, DSA, OSA, BC, LLC, HLC, ESC_CAUSE, DSP, DT, CHA,
+                UUI, CONG_RR, CONG_RNR, ESC_CHI, KEY, CHI, CAU, ESC_LAW,
+                RDN, RDX, CONN_NR, RIN, NI, CAI, ESC_CR,
+                CST, ESC_PROFILE, 0xff, ESC_MSGTYPE, SMSG};
+       /* 14 FTY repl by ESC_CHI */
+       /* 18 PI  repl by ESC_LAW */
+       /* removed OAD changed to 0xff for future use, OAD is multiIE now */
+       word multi_fac_id[] = {1, FTY};
+       word multi_pi_id[]  = {1, PI};
+       word multi_CiPN_id[]  = {1, OAD};
+       word multi_ssext_id[]  = {1, ESC_SSEXT};
+
+       word multi_vswitch_id[]  = {1, ESC_VSWITCH};
+
+       byte *cau;
+       word ncci;
+       byte SS_Ind[] = "\x05\x02\x00\x02\x00\x00"; /* Hold_Ind struct*/
+       byte CF_Ind[] = "\x09\x02\x00\x06\x00\x00\x00\x00\x00\x00";
+       byte Interr_Err_Ind[] = "\x0a\x02\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00";
+       byte CONF_Ind[] = "\x09\x16\x00\x06\x00\x00\0x00\0x00\0x00\0x00";
+       byte force_mt_info = false;
+       byte dir;
+       dword d;
+       word w;
+
+       a = plci->adapter;
+       Id = ((word)plci->Id << 8) | a->Id;
+       PUT_WORD(&SS_Ind[4], 0x0000);
+
+       if (plci->sig_remove_id)
+       {
+               plci->Sig.RNR = 2; /* discard */
+               dbug(1, dprintf("SIG discard while remove pending"));
+               return;
+       }
+       if (plci->tel && plci->SuppState != CALL_HELD) Id |= EXT_CONTROLLER;
+       dbug(1, dprintf("SigInd-Id=%08lx,plci=%x,tel=%x,state=0x%x,channels=%d,Discflowcl=%d",
+                       Id, plci->Id, plci->tel, plci->State, plci->channels, plci->hangup_flow_ctrl_timer));
+       if (plci->Sig.Ind == CALL_HOLD_ACK && plci->channels)
+       {
+               plci->Sig.RNR = 1;
+               return;
+       }
+       if (plci->Sig.Ind == HANGUP && plci->channels)
+       {
+               plci->Sig.RNR = 1;
+               plci->hangup_flow_ctrl_timer++;
+               /* recover the network layer after timeout */
+               if (plci->hangup_flow_ctrl_timer == 100)
+               {
+                       dbug(1, dprintf("Exceptional disc"));
+                       plci->Sig.RNR = 0;
+                       plci->hangup_flow_ctrl_timer = 0;
+                       for (ncci = 1; ncci < MAX_NCCI + 1; ncci++)
+                       {
+                               if (a->ncci_plci[ncci] == plci->Id)
+                               {
+                                       cleanup_ncci_data(plci, ncci);
+                                       if (plci->channels)plci->channels--;
+                                       if (plci->appl)
+                                               sendf(plci->appl, _DISCONNECT_B3_I, (((dword) ncci) << 16) | Id, 0, "ws", 0, "");
+                               }
+                       }
+                       if (plci->appl)
+                               sendf(plci->appl, _DISCONNECT_I, Id, 0, "w", 0);
+                       plci_remove(plci);
+                       plci->State = IDLE;
+               }
+               return;
+       }
+
+       /* do first parse the info with no OAD in, because OAD will be converted */
+       /* first the multiple facility IE, then mult. progress ind.              */
+       /* then the parameters for the info_ind + conn_ind                       */
+       IndParse(plci, multi_fac_id, multi_fac_parms, MAX_MULTI_IE);
+       IndParse(plci, multi_pi_id, multi_pi_parms, MAX_MULTI_IE);
+       IndParse(plci, multi_ssext_id, multi_ssext_parms, MAX_MULTI_IE);
+
+       IndParse(plci, multi_vswitch_id, multi_vswitch_parms, MAX_MULTI_IE);
+
+       IndParse(plci, parms_id, parms, 0);
+       IndParse(plci, multi_CiPN_id, multi_CiPN_parms, MAX_MULTI_IE);
+       esc_chi  = parms[14];
+       esc_law  = parms[18];
+       pty_cai  = parms[24];
+       esc_cr   = parms[25];
+       esc_profile = parms[27];
+       if (esc_cr[0] && plci)
+       {
+               if (plci->cr_enquiry && plci->appl)
+               {
+                       plci->cr_enquiry = false;
+                       /* d = MANU_ID            */
+                       /* w = m_command          */
+                       /* b = total length       */
+                       /* b = indication type    */
+                       /* b = length of all IEs  */
+                       /* b = IE1                */
+                       /* S = IE1 length + cont. */
+                       /* b = IE2                */
+                       /* S = IE2 length + cont. */
+                       sendf(plci->appl,
+                             _MANUFACTURER_I,
+                             Id,
+                             0,
+                             "dwbbbbSbS", _DI_MANU_ID, plci->m_command,
+                             2 + 1 + 1 + esc_cr[0] + 1 + 1 + esc_law[0], plci->Sig.Ind, 1 + 1 + esc_cr[0] + 1 + 1 + esc_law[0], ESC, esc_cr, ESC, esc_law);
+               }
+       }
+       /* create the additional info structure                                  */
+       add_i[1] = parms[15]; /* KEY of additional info */
+       add_i[2] = parms[11]; /* UUI of additional info */
+       ai_len = AddInfo(add_i, multi_fac_parms, esc_chi, facility);
+
+       /* the ESC_LAW indicates if u-Law or a-Law is actually used by the card  */
+       /* indication returns by the card if requested by the function           */
+       /* AutomaticLaw() after driver init                                      */
+       if (a->automatic_law < 4)
+       {
+               if (esc_law[0]) {
+                       if (esc_law[2]) {
+                               dbug(0, dprintf("u-Law selected"));
+                               a->u_law = 1;
+                       }
+                       else {
+                               dbug(0, dprintf("a-Law selected"));
+                               a->u_law = 0;
+                       }
+                       a->automatic_law = 4;
+                       if (plci == a->automatic_lawPLCI) {
+                               plci->internal_command = 0;
+                               sig_req(plci, REMOVE, 0);
+                               send_req(plci);
+                               a->automatic_lawPLCI = NULL;
+                       }
+               }
+               if (esc_profile[0])
+               {
+                       dbug(1, dprintf("[%06x] CardProfile: %lx %lx %lx %lx %lx",
+                                       UnMapController(a->Id), GET_DWORD(&esc_profile[6]),
+                                       GET_DWORD(&esc_profile[10]), GET_DWORD(&esc_profile[14]),
+                                       GET_DWORD(&esc_profile[18]), GET_DWORD(&esc_profile[46])));
+
+                       a->profile.Global_Options &= 0x000000ffL;
+                       a->profile.B1_Protocols &= 0x000003ffL;
+                       a->profile.B2_Protocols &= 0x00001fdfL;
+                       a->profile.B3_Protocols &= 0x000000b7L;
+
+                       a->profile.Global_Options &= GET_DWORD(&esc_profile[6]) |
+                               GL_BCHANNEL_OPERATION_SUPPORTED;
+                       a->profile.B1_Protocols &= GET_DWORD(&esc_profile[10]);
+                       a->profile.B2_Protocols &= GET_DWORD(&esc_profile[14]);
+                       a->profile.B3_Protocols &= GET_DWORD(&esc_profile[18]);
+                       a->manufacturer_features = GET_DWORD(&esc_profile[46]);
+                       a->man_profile.private_options = 0;
+
+                       if (a->manufacturer_features & MANUFACTURER_FEATURE_ECHO_CANCELLER)
+                       {
+                               a->man_profile.private_options |= 1L << PRIVATE_ECHO_CANCELLER;
+                               a->profile.Global_Options |= GL_ECHO_CANCELLER_SUPPORTED;
+                       }
+
+
+                       if (a->manufacturer_features & MANUFACTURER_FEATURE_RTP)
+                               a->man_profile.private_options |= 1L << PRIVATE_RTP;
+                       a->man_profile.rtp_primary_payloads = GET_DWORD(&esc_profile[50]);
+                       a->man_profile.rtp_additional_payloads = GET_DWORD(&esc_profile[54]);
+
+
+                       if (a->manufacturer_features & MANUFACTURER_FEATURE_T38)
+                               a->man_profile.private_options |= 1L << PRIVATE_T38;
+
+
+                       if (a->manufacturer_features & MANUFACTURER_FEATURE_FAX_SUB_SEP_PWD)
+                               a->man_profile.private_options |= 1L << PRIVATE_FAX_SUB_SEP_PWD;
+
+
+                       if (a->manufacturer_features & MANUFACTURER_FEATURE_V18)
+                               a->man_profile.private_options |= 1L << PRIVATE_V18;
+
+
+                       if (a->manufacturer_features & MANUFACTURER_FEATURE_DTMF_TONE)
+                               a->man_profile.private_options |= 1L << PRIVATE_DTMF_TONE;
+
+
+                       if (a->manufacturer_features & MANUFACTURER_FEATURE_PIAFS)
+                               a->man_profile.private_options |= 1L << PRIVATE_PIAFS;
+
+
+                       if (a->manufacturer_features & MANUFACTURER_FEATURE_FAX_PAPER_FORMATS)
+                               a->man_profile.private_options |= 1L << PRIVATE_FAX_PAPER_FORMATS;
+
+
+                       if (a->manufacturer_features & MANUFACTURER_FEATURE_VOWN)
+                               a->man_profile.private_options |= 1L << PRIVATE_VOWN;
+
+
+                       if (a->manufacturer_features & MANUFACTURER_FEATURE_FAX_NONSTANDARD)
+                               a->man_profile.private_options |= 1L << PRIVATE_FAX_NONSTANDARD;
+
+               }
+               else
+               {
+                       a->profile.Global_Options &= 0x0000007fL;
+                       a->profile.B1_Protocols &= 0x000003dfL;
+                       a->profile.B2_Protocols &= 0x00001adfL;
+                       a->profile.B3_Protocols &= 0x000000b7L;
+                       a->manufacturer_features &= MANUFACTURER_FEATURE_HARDDTMF;
+               }
+               if (a->manufacturer_features & (MANUFACTURER_FEATURE_HARDDTMF |
+                                               MANUFACTURER_FEATURE_SOFTDTMF_SEND | MANUFACTURER_FEATURE_SOFTDTMF_RECEIVE))
+               {
+                       a->profile.Global_Options |= GL_DTMF_SUPPORTED;
+               }
+               a->manufacturer_features &= ~MANUFACTURER_FEATURE_OOB_CHANNEL;
+               dbug(1, dprintf("[%06x] Profile: %lx %lx %lx %lx %lx",
+                               UnMapController(a->Id), a->profile.Global_Options,
+                               a->profile.B1_Protocols, a->profile.B2_Protocols,
+                               a->profile.B3_Protocols, a->manufacturer_features));
+       }
+       /* codec plci for the handset/hook state support is just an internal id  */
+       if (plci != a->AdvCodecPLCI)
+       {
+               force_mt_info = SendMultiIE(plci, Id, multi_fac_parms, FTY, 0x20, 0);
+               force_mt_info |= SendMultiIE(plci, Id, multi_pi_parms, PI, 0x210, 0);
+               SendSSExtInd(NULL, plci, Id, multi_ssext_parms);
+               SendInfo(plci, Id, parms, force_mt_info);
+
+               VSwitchReqInd(plci, Id, multi_vswitch_parms);
+
+       }
+
+       /* switch the codec to the b-channel                                     */
+       if (esc_chi[0] && plci && !plci->SuppState) {
+               plci->b_channel = esc_chi[esc_chi[0]]&0x1f;
+               mixer_set_bchannel_id_esc(plci, plci->b_channel);
+               dbug(1, dprintf("storeChannel=0x%x", plci->b_channel));
+               if (plci->tel == ADV_VOICE && plci->appl) {
+                       SetVoiceChannel(a->AdvCodecPLCI, esc_chi, a);
+               }
+       }
+
+       if (plci->appl) plci->appl->Number++;
+
+       switch (plci->Sig.Ind) {
+               /* Response to Get_Supported_Services request */
+       case S_SUPPORTED:
+               dbug(1, dprintf("S_Supported"));
+               if (!plci->appl) break;
+               if (pty_cai[0] == 4)
+               {
+                       PUT_DWORD(&CF_Ind[6], GET_DWORD(&pty_cai[1]));
+               }
+               else
+               {
+                       PUT_DWORD(&CF_Ind[6], MASK_TERMINAL_PORTABILITY | MASK_HOLD_RETRIEVE);
+               }
+               PUT_WORD(&CF_Ind[1], 0);
+               PUT_WORD(&CF_Ind[4], 0);
+               sendf(plci->appl, _FACILITY_R | CONFIRM, Id & 0x7, plci->number, "wws", 0, 3, CF_Ind);
+               plci_remove(plci);
+               break;
+
+               /* Supplementary Service rejected */
+       case S_SERVICE_REJ:
+               dbug(1, dprintf("S_Reject=0x%x", pty_cai[5]));
+               if (!pty_cai[0]) break;
+               switch (pty_cai[5])
+               {
+               case ECT_EXECUTE:
+               case THREE_PTY_END:
+               case THREE_PTY_BEGIN:
+                       if (!plci->relatedPTYPLCI) break;
+                       tplci = plci->relatedPTYPLCI;
+                       rId = ((word)tplci->Id << 8) | tplci->adapter->Id;
+                       if (tplci->tel) rId |= EXT_CONTROLLER;
+                       if (pty_cai[5] == ECT_EXECUTE)
+                       {
+                               PUT_WORD(&SS_Ind[1], S_ECT);
+
+                               plci->vswitchstate = 0;
+                               plci->relatedPTYPLCI->vswitchstate = 0;
+
+                       }
+                       else
+                       {
+                               PUT_WORD(&SS_Ind[1], pty_cai[5] + 3);
+                       }
+                       if (pty_cai[2] != 0xff)
+                       {
+                               PUT_WORD(&SS_Ind[4], 0x3600 | (word)pty_cai[2]);
+                       }
+                       else
+                       {
+                               PUT_WORD(&SS_Ind[4], 0x300E);
+                       }
+                       plci->relatedPTYPLCI = NULL;
+                       plci->ptyState = 0;
+                       sendf(tplci->appl, _FACILITY_I, rId, 0, "ws", 3, SS_Ind);
+                       break;
+
+               case CALL_DEFLECTION:
+                       if (pty_cai[2] != 0xff)
+                       {
+                               PUT_WORD(&SS_Ind[4], 0x3600 | (word)pty_cai[2]);
+                       }
+                       else
+                       {
+                               PUT_WORD(&SS_Ind[4], 0x300E);
+                       }
+                       PUT_WORD(&SS_Ind[1], pty_cai[5]);
+                       for (i = 0; i < max_appl; i++)
+                       {
+                               if (application[i].CDEnable)
+                               {
+                                       if (application[i].Id) sendf(&application[i], _FACILITY_I, Id, 0, "ws", 3, SS_Ind);
+                                       application[i].CDEnable = false;
+                               }
+                       }
+                       break;
+
+               case DEACTIVATION_DIVERSION:
+               case ACTIVATION_DIVERSION:
+               case DIVERSION_INTERROGATE_CFU:
+               case DIVERSION_INTERROGATE_CFB:
+               case DIVERSION_INTERROGATE_CFNR:
+               case DIVERSION_INTERROGATE_NUM:
+               case CCBS_REQUEST:
+               case CCBS_DEACTIVATE:
+               case CCBS_INTERROGATE:
+                       if (!plci->appl) break;
+                       if (pty_cai[2] != 0xff)
+                       {
+                               PUT_WORD(&Interr_Err_Ind[4], 0x3600 | (word)pty_cai[2]);
+                       }
+                       else
+                       {
+                               PUT_WORD(&Interr_Err_Ind[4], 0x300E);
+                       }
+                       switch (pty_cai[5])
+                       {
+                       case DEACTIVATION_DIVERSION:
+                               dbug(1, dprintf("Deact_Div"));
+                               Interr_Err_Ind[0] = 0x9;
+                               Interr_Err_Ind[3] = 0x6;
+                               PUT_WORD(&Interr_Err_Ind[1], S_CALL_FORWARDING_STOP);
+                               break;
+                       case ACTIVATION_DIVERSION:
+                               dbug(1, dprintf("Act_Div"));
+                               Interr_Err_Ind[0] = 0x9;
+                               Interr_Err_Ind[3] = 0x6;
+                               PUT_WORD(&Interr_Err_Ind[1], S_CALL_FORWARDING_START);
+                               break;
+                       case DIVERSION_INTERROGATE_CFU:
+                       case DIVERSION_INTERROGATE_CFB:
+                       case DIVERSION_INTERROGATE_CFNR:
+                               dbug(1, dprintf("Interr_Div"));
+                               Interr_Err_Ind[0] = 0xa;
+                               Interr_Err_Ind[3] = 0x7;
+                               PUT_WORD(&Interr_Err_Ind[1], S_INTERROGATE_DIVERSION);
+                               break;
+                       case DIVERSION_INTERROGATE_NUM:
+                               dbug(1, dprintf("Interr_Num"));
+                               Interr_Err_Ind[0] = 0xa;
+                               Interr_Err_Ind[3] = 0x7;
+                               PUT_WORD(&Interr_Err_Ind[1], S_INTERROGATE_NUMBERS);
+                               break;
+                       case CCBS_REQUEST:
+                               dbug(1, dprintf("CCBS Request"));
+                               Interr_Err_Ind[0] = 0xd;
+                               Interr_Err_Ind[3] = 0xa;
+                               PUT_WORD(&Interr_Err_Ind[1], S_CCBS_REQUEST);
+                               break;
+                       case CCBS_DEACTIVATE:
+                               dbug(1, dprintf("CCBS Deactivate"));
+                               Interr_Err_Ind[0] = 0x9;
+                               Interr_Err_Ind[3] = 0x6;
+                               PUT_WORD(&Interr_Err_Ind[1], S_CCBS_DEACTIVATE);
+                               break;
+                       case CCBS_INTERROGATE:
+                               dbug(1, dprintf("CCBS Interrogate"));
+                               Interr_Err_Ind[0] = 0xb;
+                               Interr_Err_Ind[3] = 0x8;
+                               PUT_WORD(&Interr_Err_Ind[1], S_CCBS_INTERROGATE);
+                               break;
+                       }
+                       PUT_DWORD(&Interr_Err_Ind[6], plci->appl->S_Handle);
+                       sendf(plci->appl, _FACILITY_I, Id & 0x7, 0, "ws", 3, Interr_Err_Ind);
+                       plci_remove(plci);
+                       break;
+               case ACTIVATION_MWI:
+               case DEACTIVATION_MWI:
+                       if (pty_cai[5] == ACTIVATION_MWI)
+                       {
+                               PUT_WORD(&SS_Ind[1], S_MWI_ACTIVATE);
+                       }
+                       else PUT_WORD(&SS_Ind[1], S_MWI_DEACTIVATE);
+
+                       if (pty_cai[2] != 0xff)
+                       {
+                               PUT_WORD(&SS_Ind[4], 0x3600 | (word)pty_cai[2]);
+                       }
+                       else
+                       {
+                               PUT_WORD(&SS_Ind[4], 0x300E);
+                       }
+
+                       if (plci->cr_enquiry)
+                       {
+                               sendf(plci->appl, _FACILITY_I, Id & 0xf, 0, "ws", 3, SS_Ind);
+                               plci_remove(plci);
+                       }
+                       else
+                       {
+                               sendf(plci->appl, _FACILITY_I, Id, 0, "ws", 3, SS_Ind);
+                       }
+                       break;
+               case CONF_ADD: /* ERROR */
+               case CONF_BEGIN:
+               case CONF_DROP:
+               case CONF_ISOLATE:
+               case CONF_REATTACH:
+                       CONF_Ind[0] = 9;
+                       CONF_Ind[3] = 6;
+                       switch (pty_cai[5])
+                       {
+                       case CONF_BEGIN:
+                               PUT_WORD(&CONF_Ind[1], S_CONF_BEGIN);
+                               plci->ptyState = 0;
+                               break;
+                       case CONF_DROP:
+                               CONF_Ind[0] = 5;
+                               CONF_Ind[3] = 2;
+                               PUT_WORD(&CONF_Ind[1], S_CONF_DROP);
+                               plci->ptyState = CONNECTED;
+                               break;
+                       case CONF_ISOLATE:
+                               CONF_Ind[0] = 5;
+                               CONF_Ind[3] = 2;
+                               PUT_WORD(&CONF_Ind[1], S_CONF_ISOLATE);
+                               plci->ptyState = CONNECTED;
+                               break;
+                       case CONF_REATTACH:
+                               CONF_Ind[0] = 5;
+                               CONF_Ind[3] = 2;
+                               PUT_WORD(&CONF_Ind[1], S_CONF_REATTACH);
+                               plci->ptyState = CONNECTED;
+                               break;
+                       case CONF_ADD:
+                               PUT_WORD(&CONF_Ind[1], S_CONF_ADD);
+                               plci->relatedPTYPLCI = NULL;
+                               tplci = plci->relatedPTYPLCI;
+                               if (tplci) tplci->ptyState = CONNECTED;
+                               plci->ptyState = CONNECTED;
+                               break;
+                       }
+
+                       if (pty_cai[2] != 0xff)
+                       {
+                               PUT_WORD(&CONF_Ind[4], 0x3600 | (word)pty_cai[2]);
+                       }
+                       else
+                       {
+                               PUT_WORD(&CONF_Ind[4], 0x3303); /* Time-out: network did not respond
+                                                                 within the required time */
+                       }
+
+                       PUT_DWORD(&CONF_Ind[6], 0x0);
+                       sendf(plci->appl, _FACILITY_I, Id, 0, "ws", 3, CONF_Ind);
+                       break;
+               }
+               break;
+
+               /* Supplementary Service indicates success */
+       case S_SERVICE:
+               dbug(1, dprintf("Service_Ind"));
+               PUT_WORD(&CF_Ind[4], 0);
+               switch (pty_cai[5])
+               {
+               case THREE_PTY_END:
+               case THREE_PTY_BEGIN:
+               case ECT_EXECUTE:
+                       if (!plci->relatedPTYPLCI) break;
+                       tplci = plci->relatedPTYPLCI;
+                       rId = ((word)tplci->Id << 8) | tplci->adapter->Id;
+                       if (tplci->tel) rId |= EXT_CONTROLLER;
+                       if (pty_cai[5] == ECT_EXECUTE)
+                       {
+                               PUT_WORD(&SS_Ind[1], S_ECT);
+
+                               if (plci->vswitchstate != 3)
+                               {
+
+                                       plci->ptyState = IDLE;
+                                       plci->relatedPTYPLCI = NULL;
+                                       plci->ptyState = 0;
+
+                               }
+
+                               dbug(1, dprintf("ECT OK"));
+                               sendf(tplci->appl, _FACILITY_I, rId, 0, "ws", 3, SS_Ind);
+
+
+
+                       }
+                       else
+                       {
+                               switch (plci->ptyState)
+                               {
+                               case S_3PTY_BEGIN:
+                                       plci->ptyState = CONNECTED;
+                                       dbug(1, dprintf("3PTY ON"));
+                                       break;
+
+                               case S_3PTY_END:
+                                       plci->ptyState = IDLE;
+                                       plci->relatedPTYPLCI = NULL;
+                                       plci->ptyState = 0;
+                                       dbug(1, dprintf("3PTY OFF"));
+                                       break;
+                               }
+                               PUT_WORD(&SS_Ind[1], pty_cai[5] + 3);
+                               sendf(tplci->appl, _FACILITY_I, rId, 0, "ws", 3, SS_Ind);
+                       }
+                       break;
+
+               case CALL_DEFLECTION:
+                       PUT_WORD(&SS_Ind[1], pty_cai[5]);
+                       for (i = 0; i < max_appl; i++)
+                       {
+                               if (application[i].CDEnable)
+                               {
+                                       if (application[i].Id) sendf(&application[i], _FACILITY_I, Id, 0, "ws", 3, SS_Ind);
+                                       application[i].CDEnable = false;
+                               }
+                       }
+                       break;
+
+               case DEACTIVATION_DIVERSION:
+               case ACTIVATION_DIVERSION:
+                       if (!plci->appl) break;
+                       PUT_WORD(&CF_Ind[1], pty_cai[5] + 2);
+                       PUT_DWORD(&CF_Ind[6], plci->appl->S_Handle);
+                       sendf(plci->appl, _FACILITY_I, Id & 0x7, 0, "ws", 3, CF_Ind);
+                       plci_remove(plci);
+                       break;
+
+               case DIVERSION_INTERROGATE_CFU:
+               case DIVERSION_INTERROGATE_CFB:
+               case DIVERSION_INTERROGATE_CFNR:
+               case DIVERSION_INTERROGATE_NUM:
+               case CCBS_REQUEST:
+               case CCBS_DEACTIVATE:
+               case CCBS_INTERROGATE:
+                       if (!plci->appl) break;
+                       switch (pty_cai[5])
+                       {
+                       case DIVERSION_INTERROGATE_CFU:
+                       case DIVERSION_INTERROGATE_CFB:
+                       case DIVERSION_INTERROGATE_CFNR:
+                               dbug(1, dprintf("Interr_Div"));
+                               PUT_WORD(&pty_cai[1], S_INTERROGATE_DIVERSION);
+                               pty_cai[3] = pty_cai[0] - 3; /* Supplementary Service-specific parameter len */
+                               break;
+                       case DIVERSION_INTERROGATE_NUM:
+                               dbug(1, dprintf("Interr_Num"));
+                               PUT_WORD(&pty_cai[1], S_INTERROGATE_NUMBERS);
+                               pty_cai[3] = pty_cai[0] - 3; /* Supplementary Service-specific parameter len */
+                               break;
+                       case CCBS_REQUEST:
+                               dbug(1, dprintf("CCBS Request"));
+                               PUT_WORD(&pty_cai[1], S_CCBS_REQUEST);
+                               pty_cai[3] = pty_cai[0] - 3; /* Supplementary Service-specific parameter len */
+                               break;
+                       case CCBS_DEACTIVATE:
+                               dbug(1, dprintf("CCBS Deactivate"));
+                               PUT_WORD(&pty_cai[1], S_CCBS_DEACTIVATE);
+                               pty_cai[3] = pty_cai[0] - 3; /* Supplementary Service-specific parameter len */
+                               break;
+                       case CCBS_INTERROGATE:
+                               dbug(1, dprintf("CCBS Interrogate"));
+                               PUT_WORD(&pty_cai[1], S_CCBS_INTERROGATE);
+                               pty_cai[3] = pty_cai[0] - 3; /* Supplementary Service-specific parameter len */
+                               break;
+                       }
+                       PUT_WORD(&pty_cai[4], 0); /* Supplementary Service Reason */
+                       PUT_DWORD(&pty_cai[6], plci->appl->S_Handle);
+                       sendf(plci->appl, _FACILITY_I, Id & 0x7, 0, "wS", 3, pty_cai);
+                       plci_remove(plci);
+                       break;
+
+               case ACTIVATION_MWI:
+               case DEACTIVATION_MWI:
+                       if (pty_cai[5] == ACTIVATION_MWI)
+                       {
+                               PUT_WORD(&SS_Ind[1], S_MWI_ACTIVATE);
+                       }
+                       else PUT_WORD(&SS_Ind[1], S_MWI_DEACTIVATE);
+                       if (plci->cr_enquiry)
+                       {
+                               sendf(plci->appl, _FACILITY_I, Id & 0xf, 0, "ws", 3, SS_Ind);
+                               plci_remove(plci);
+                       }
+                       else
+                       {
+                               sendf(plci->appl, _FACILITY_I, Id, 0, "ws", 3, SS_Ind);
+                       }
+                       break;
+               case MWI_INDICATION:
+                       if (pty_cai[0] >= 0x12)
+                       {
+                               PUT_WORD(&pty_cai[3], S_MWI_INDICATE);
+                               pty_cai[2] = pty_cai[0] - 2; /* len Parameter */
+                               pty_cai[5] = pty_cai[0] - 5; /* Supplementary Service-specific parameter len */
+                               if (plci->appl && (a->Notification_Mask[plci->appl->Id - 1] & SMASK_MWI))
+                               {
+                                       if (plci->internal_command == GET_MWI_STATE) /* result on Message Waiting Listen */
+                                       {
+                                               sendf(plci->appl, _FACILITY_I, Id & 0xf, 0, "wS", 3, &pty_cai[2]);
+                                               plci_remove(plci);
+                                               return;
+                                       }
+                                       else sendf(plci->appl, _FACILITY_I, Id, 0, "wS", 3, &pty_cai[2]);
+                                       pty_cai[0] = 0;
+                               }
+                               else
+                               {
+                                       for (i = 0; i < max_appl; i++)
+                                       {
+                                               if (a->Notification_Mask[i]&SMASK_MWI)
+                                               {
+                                                       sendf(&application[i], _FACILITY_I, Id & 0x7, 0, "wS", 3, &pty_cai[2]);
+                                                       pty_cai[0] = 0;
+                                               }
+                                       }
+                               }
+
+                               if (!pty_cai[0])
+                               { /* acknowledge */
+                                       facility[2] = 0; /* returncode */
+                               }
+                               else facility[2] = 0xff;
+                       }
+                       else
+                       {
+                               /* reject */
+                               facility[2] = 0xff; /* returncode */
+                       }
+                       facility[0] = 2;
+                       facility[1] = MWI_RESPONSE; /* Function */
+                       add_p(plci, CAI, facility);
+                       add_p(plci, ESC, multi_ssext_parms[0]); /* remembered parameter -> only one possible */
+                       sig_req(plci, S_SERVICE, 0);
+                       send_req(plci);
+                       plci->command = 0;
+                       next_internal_command(Id, plci);
+                       break;
+               case CONF_ADD: /* OK */
+               case CONF_BEGIN:
+               case CONF_DROP:
+               case CONF_ISOLATE:
+               case CONF_REATTACH:
+               case CONF_PARTYDISC:
+                       CONF_Ind[0] = 9;
+                       CONF_Ind[3] = 6;
+                       switch (pty_cai[5])
+                       {
+                       case CONF_BEGIN:
+                               PUT_WORD(&CONF_Ind[1], S_CONF_BEGIN);
+                               if (pty_cai[0] == 6)
+                               {
+                                       d = pty_cai[6];
+                                       PUT_DWORD(&CONF_Ind[6], d); /* PartyID */
+                               }
+                               else
+                               {
+                                       PUT_DWORD(&CONF_Ind[6], 0x0);
+                               }
+                               break;
+                       case CONF_ISOLATE:
+                               PUT_WORD(&CONF_Ind[1], S_CONF_ISOLATE);
+                               CONF_Ind[0] = 5;
+                               CONF_Ind[3] = 2;
+                               break;
+                       case CONF_REATTACH:
+                               PUT_WORD(&CONF_Ind[1], S_CONF_REATTACH);
+                               CONF_Ind[0] = 5;
+                               CONF_Ind[3] = 2;
+                               break;
+                       case CONF_DROP:
+                               PUT_WORD(&CONF_Ind[1], S_CONF_DROP);
+                               CONF_Ind[0] = 5;
+                               CONF_Ind[3] = 2;
+                               break;
+                       case CONF_ADD:
+                               PUT_WORD(&CONF_Ind[1], S_CONF_ADD);
+                               d = pty_cai[6];
+                               PUT_DWORD(&CONF_Ind[6], d); /* PartyID */
+                               tplci = plci->relatedPTYPLCI;
+                               if (tplci) tplci->ptyState = CONNECTED;
+                               break;
+                       case CONF_PARTYDISC:
+                               CONF_Ind[0] = 7;
+                               CONF_Ind[3] = 4;
+                               PUT_WORD(&CONF_Ind[1], S_CONF_PARTYDISC);
+                               d = pty_cai[6];
+                               PUT_DWORD(&CONF_Ind[4], d); /* PartyID */
+                               break;
+                       }
+                       plci->ptyState = CONNECTED;
+                       sendf(plci->appl, _FACILITY_I, Id, 0, "ws", 3, CONF_Ind);
+                       break;
+               case CCBS_INFO_RETAIN:
+               case CCBS_ERASECALLLINKAGEID:
+               case CCBS_STOP_ALERTING:
+                       CONF_Ind[0] = 5;
+                       CONF_Ind[3] = 2;
+                       switch (pty_cai[5])
+                       {
+                       case CCBS_INFO_RETAIN:
+                               PUT_WORD(&CONF_Ind[1], S_CCBS_INFO_RETAIN);
+                               break;
+                       case CCBS_STOP_ALERTING:
+                               PUT_WORD(&CONF_Ind[1], S_CCBS_STOP_ALERTING);
+                               break;
+                       case CCBS_ERASECALLLINKAGEID:
+                               PUT_WORD(&CONF_Ind[1], S_CCBS_ERASECALLLINKAGEID);
+                               CONF_Ind[0] = 7;
+                               CONF_Ind[3] = 4;
+                               CONF_Ind[6] = 0;
+                               CONF_Ind[7] = 0;
+                               break;
+                       }
+                       w = pty_cai[6];
+                       PUT_WORD(&CONF_Ind[4], w); /* PartyID */
+
+                       if (plci->appl && (a->Notification_Mask[plci->appl->Id - 1] & SMASK_CCBS))
+                       {
+                               sendf(plci->appl, _FACILITY_I, Id, 0, "ws", 3, CONF_Ind);
+                       }
+                       else
+                       {
+                               for (i = 0; i < max_appl; i++)
+                                       if (a->Notification_Mask[i] & SMASK_CCBS)
+                                               sendf(&application[i], _FACILITY_I, Id & 0x7, 0, "ws", 3, CONF_Ind);
+                       }
+                       break;
+               }
+               break;
+       case CALL_HOLD_REJ:
+               cau = parms[7];
+               if (cau)
+               {
+                       i = _L3_CAUSE | cau[2];
+                       if (cau[2] == 0) i = 0x3603;
+               }
+               else
+               {
+                       i = 0x3603;
+               }
+               PUT_WORD(&SS_Ind[1], S_HOLD);
+               PUT_WORD(&SS_Ind[4], i);
+               if (plci->SuppState == HOLD_REQUEST)
+               {
+                       plci->SuppState = IDLE;
+                       sendf(plci->appl, _FACILITY_I, Id, 0, "ws", 3, SS_Ind);
+               }
+               break;
+
+       case CALL_HOLD_ACK:
+               if (plci->SuppState == HOLD_REQUEST)
+               {
+                       plci->SuppState = CALL_HELD;
+                       CodecIdCheck(a, plci);
+                       start_internal_command(Id, plci, hold_save_command);
+               }
+               break;
+
+       case CALL_RETRIEVE_REJ:
+               cau = parms[7];
+               if (cau)
+               {
+                       i = _L3_CAUSE | cau[2];
+                       if (cau[2] == 0) i = 0x3603;
+               }
+               else
+               {
+                       i = 0x3603;
+               }
+               PUT_WORD(&SS_Ind[1], S_RETRIEVE);
+               PUT_WORD(&SS_Ind[4], i);
+               if (plci->SuppState == RETRIEVE_REQUEST)
+               {
+                       plci->SuppState = CALL_HELD;
+                       CodecIdCheck(a, plci);
+                       sendf(plci->appl, _FACILITY_I, Id, 0, "ws", 3, SS_Ind);
+               }
+               break;
+
+       case CALL_RETRIEVE_ACK:
+               PUT_WORD(&SS_Ind[1], S_RETRIEVE);
+               if (plci->SuppState == RETRIEVE_REQUEST)
+               {
+                       plci->SuppState = IDLE;
+                       plci->call_dir |= CALL_DIR_FORCE_OUTG_NL;
+                       plci->b_channel = esc_chi[esc_chi[0]]&0x1f;
+                       if (plci->tel)
+                       {
+                               mixer_set_bchannel_id_esc(plci, plci->b_channel);
+                               dbug(1, dprintf("RetrChannel=0x%x", plci->b_channel));
+                               SetVoiceChannel(a->AdvCodecPLCI, esc_chi, a);
+                               if (plci->B2_prot == B2_TRANSPARENT && plci->B3_prot == B3_TRANSPARENT)
+                               {
+                                       dbug(1, dprintf("Get B-ch"));
+                                       start_internal_command(Id, plci, retrieve_restore_command);
+                               }
+                               else
+                                       sendf(plci->appl, _FACILITY_I, Id, 0, "ws", 3, SS_Ind);
+                       }
+                       else
+                               start_internal_command(Id, plci, retrieve_restore_command);
+               }
+               break;
+
+       case INDICATE_IND:
+               if (plci->State != LISTENING) {
+                       sig_req(plci, HANGUP, 0);
+                       send_req(plci);
+                       break;
+               }
+               cip = find_cip(a, parms[4], parms[6]);
+               cip_mask = 1L << cip;
+               dbug(1, dprintf("cip=%d,cip_mask=%lx", cip, cip_mask));
+               clear_c_ind_mask(plci);
+               if (!remove_started && !a->adapter_disabled)
+               {
+                       set_c_ind_mask_bit(plci, MAX_APPL);
+                       group_optimization(a, plci);
+                       for (i = 0; i < max_appl; i++) {
+                               if (application[i].Id
+                                   && (a->CIP_Mask[i] & 1 || a->CIP_Mask[i] & cip_mask)
+                                   && CPN_filter_ok(parms[0], a, i)
+                                   && test_group_ind_mask_bit(plci, i)) {
+                                       dbug(1, dprintf("storedcip_mask[%d]=0x%lx", i, a->CIP_Mask[i]));
+                                       set_c_ind_mask_bit(plci, i);
+                                       dump_c_ind_mask(plci);
+                                       plci->State = INC_CON_PENDING;
+                                       plci->call_dir = (plci->call_dir & ~(CALL_DIR_OUT | CALL_DIR_ORIGINATE)) |
+                                               CALL_DIR_IN | CALL_DIR_ANSWER;
+                                       if (esc_chi[0]) {
+                                               plci->b_channel = esc_chi[esc_chi[0]] & 0x1f;
+                                               mixer_set_bchannel_id_esc(plci, plci->b_channel);
+                                       }
+                                       /* if a listen on the ext controller is done, check if hook states */
+                                       /* are supported or if just a on board codec must be activated     */
+                                       if (a->codec_listen[i] && !a->AdvSignalPLCI) {
+                                               if (a->profile.Global_Options & HANDSET)
+                                                       plci->tel = ADV_VOICE;
+                                               else if (a->profile.Global_Options & ON_BOARD_CODEC)
+                                                       plci->tel = CODEC;
+                                               if (plci->tel) Id |= EXT_CONTROLLER;
+                                               a->codec_listen[i] = plci;
+                                       }
+
+                                       sendf(&application[i], _CONNECT_I, Id, 0,
+                                             "wSSSSSSSbSSSSS", cip,    /* CIP                 */
+                                             parms[0],    /* CalledPartyNumber   */
+                                             multi_CiPN_parms[0],    /* CallingPartyNumber  */
+                                             parms[2],    /* CalledPartySubad    */
+                                             parms[3],    /* CallingPartySubad   */
+                                             parms[4],    /* BearerCapability    */
+                                             parms[5],    /* LowLC               */
+                                             parms[6],    /* HighLC              */
+                                             ai_len,      /* nested struct add_i */
+                                             add_i[0],    /* B channel info    */
+                                             add_i[1],    /* keypad facility   */
+                                             add_i[2],    /* user user data    */
+                                             add_i[3],    /* nested facility   */
+                                             multi_CiPN_parms[1]    /* second CiPN(SCR)   */
+                                               );
+                                       SendSSExtInd(&application[i],
+                                                    plci,
+                                                    Id,
+                                                    multi_ssext_parms);
+                                       SendSetupInfo(&application[i],
+                                                     plci,
+                                                     Id,
+                                                     parms,
+                                                     SendMultiIE(plci, Id, multi_pi_parms, PI, 0x210, true));
+                               }
+                       }
+                       clear_c_ind_mask_bit(plci, MAX_APPL);
+                       dump_c_ind_mask(plci);
+               }
+               if (c_ind_mask_empty(plci)) {
+                       sig_req(plci, HANGUP, 0);
+                       send_req(plci);
+                       plci->State = IDLE;
+               }
+               plci->notifiedcall = 0;
+               a->listen_active--;
+               listen_check(a);
+               break;
+
+       case CALL_PEND_NOTIFY:
+               plci->notifiedcall = 1;
+               listen_check(a);
+               break;
+
+       case CALL_IND:
+       case CALL_CON:
+               if (plci->State == ADVANCED_VOICE_SIG || plci->State == ADVANCED_VOICE_NOSIG)
+               {
+                       if (plci->internal_command == PERM_COD_CONN_PEND)
+                       {
+                               if (plci->State == ADVANCED_VOICE_NOSIG)
+                               {
+                                       dbug(1, dprintf("***Codec OK"));
+                                       if (a->AdvSignalPLCI)
+                                       {
+                                               tplci = a->AdvSignalPLCI;
+                                               if (tplci->spoofed_msg)
+                                               {
+                                                       dbug(1, dprintf("***Spoofed Msg(0x%x)", tplci->spoofed_msg));
+                                                       tplci->command = 0;
+                                                       tplci->internal_command = 0;
+                                                       x_Id = ((word)tplci->Id << 8) | tplci->adapter->Id | 0x80;
+                                                       switch (tplci->spoofed_msg)
+                                                       {
+                                                       case CALL_RES:
+                                                               tplci->command = _CONNECT_I | RESPONSE;
+                                                               api_load_msg(&tplci->saved_msg, saved_parms);
+                                                               add_b1(tplci, &saved_parms[1], 0, tplci->B1_facilities);
+                                                               if (tplci->adapter->Info_Mask[tplci->appl->Id - 1] & 0x200)
+                                                               {
+                                                                       /* early B3 connect (CIP mask bit 9) no release after a disc */
+                                                                       add_p(tplci, LLI, "\x01\x01");
+                                                               }
+                                                               add_s(tplci, CONN_NR, &saved_parms[2]);
+                                                               add_s(tplci, LLC, &saved_parms[4]);
+                                                               add_ai(tplci, &saved_parms[5]);
+                                                               tplci->State = INC_CON_ACCEPT;
+                                                               sig_req(tplci, CALL_RES, 0);
+                                                               send_req(tplci);
+                                                               break;
+
+                                                       case AWAITING_SELECT_B:
+                                                               dbug(1, dprintf("Select_B continue"));
+                                                               start_internal_command(x_Id, tplci, select_b_command);
+                                                               break;
+
+                                                       case AWAITING_MANUF_CON: /* Get_Plci per Manufacturer_Req to ext controller */
+                                                               if (!tplci->Sig.Id)
+                                                               {
+                                                                       dbug(1, dprintf("No SigID!"));
+                                                                       sendf(tplci->appl, _MANUFACTURER_R | CONFIRM, x_Id, tplci->number, "dww", _DI_MANU_ID, _MANUFACTURER_R, _OUT_OF_PLCI);
+                                                                       plci_remove(tplci);
+                                                                       break;
+                                                               }
+                                                               tplci->command = _MANUFACTURER_R;
+                                                               api_load_msg(&tplci->saved_msg, saved_parms);
+                                                               dir = saved_parms[2].info[0];
+                                                               if (dir == 1) {
+                                                                       sig_req(tplci, CALL_REQ, 0);
+                                                               }
+                                                               else if (!dir) {
+                                                                       sig_req(tplci, LISTEN_REQ, 0);
+                                                               }
+                                                               send_req(tplci);
+                                                               sendf(tplci->appl, _MANUFACTURER_R | CONFIRM, x_Id, tplci->number, "dww", _DI_MANU_ID, _MANUFACTURER_R, 0);
+                                                               break;
+
+                                                       case (CALL_REQ | AWAITING_MANUF_CON):
+                                                               sig_req(tplci, CALL_REQ, 0);
+                                                               send_req(tplci);
+                                                               break;
+
+                                                       case CALL_REQ:
+                                                               if (!tplci->Sig.Id)
+                                                               {
+                                                                       dbug(1, dprintf("No SigID!"));
+                                                                       sendf(tplci->appl, _CONNECT_R | CONFIRM, tplci->adapter->Id, 0, "w", _OUT_OF_PLCI);
+                                                                       plci_remove(tplci);
+                                                                       break;
+                                                               }
+                                                               tplci->command = _CONNECT_R;
+                                                               api_load_msg(&tplci->saved_msg, saved_parms);
+                                                               add_s(tplci, CPN, &saved_parms[1]);
+                                                               add_s(tplci, DSA, &saved_parms[3]);
+                                                               add_ai(tplci, &saved_parms[9]);
+                                                               sig_req(tplci, CALL_REQ, 0);
+                                                               send_req(tplci);
+                                                               break;
+
+                                                       case CALL_RETRIEVE:
+                                                               tplci->command = C_RETRIEVE_REQ;
+                                                               sig_req(tplci, CALL_RETRIEVE, 0);
+                                                               send_req(tplci);
+                                                               break;
+                                                       }
+                                                       tplci->spoofed_msg = 0;
+                                                       if (tplci->internal_command == 0)
+                                                               next_internal_command(x_Id, tplci);
+                                               }
+                                       }
+                                       next_internal_command(Id, plci);
+                                       break;
+                               }
+                               dbug(1, dprintf("***Codec Hook Init Req"));
+                               plci->internal_command = PERM_COD_HOOK;
+                               add_p(plci, FTY, "\x01\x09");             /* Get Hook State*/
+                               sig_req(plci, TEL_CTRL, 0);
+                               send_req(plci);
+                       }
+               }
+               else if (plci->command != _MANUFACTURER_R  /* old style permanent connect */
+                        && plci->State != INC_ACT_PENDING)
+               {
+                       mixer_set_bchannel_id_esc(plci, plci->b_channel);
+                       if (plci->tel == ADV_VOICE && plci->SuppState == IDLE) /* with permanent codec switch on immediately */
+                       {
+                               chi[2] = plci->b_channel;
+                               SetVoiceChannel(a->AdvCodecPLCI, chi, a);
+                       }
+                       sendf(plci->appl, _CONNECT_ACTIVE_I, Id, 0, "Sss", parms[21], "", "");
+                       plci->State = INC_ACT_PENDING;
+               }
+               break;
+
+       case TEL_CTRL:
+               ie = multi_fac_parms[0]; /* inspect the facility hook indications */
+               if (plci->State == ADVANCED_VOICE_SIG && ie[0]) {
+                       switch (ie[1] & 0x91) {
+                       case 0x80:   /* hook off */
+                       case 0x81:
+                               if (plci->internal_command == PERM_COD_HOOK)
+                               {
+                                       dbug(1, dprintf("init:hook_off"));
+                                       plci->hook_state = ie[1];
+                                       next_internal_command(Id, plci);
+                                       break;
+                               }
+                               else /* ignore doubled hook indications */
+                               {
+                                       if (((plci->hook_state) & 0xf0) == 0x80)
+                                       {
+                                               dbug(1, dprintf("ignore hook"));
+                                               break;
+                                       }
+                                       plci->hook_state = ie[1]&0x91;
+                               }
+                               /* check for incoming call pending */
+                               /* and signal '+'.Appl must decide */
+                               /* with connect_res if call must   */
+                               /* accepted or not                 */
+                               for (i = 0, tplci = NULL; i < max_appl; i++) {
+                                       if (a->codec_listen[i]
+                                           && (a->codec_listen[i]->State == INC_CON_PENDING
+                                               || a->codec_listen[i]->State == INC_CON_ALERT)) {
+                                               tplci = a->codec_listen[i];
+                                               tplci->appl = &application[i];
+                                       }
+                               }
+                               /* no incoming call, do outgoing call */
+                               /* and signal '+' if outg. setup   */
+                               if (!a->AdvSignalPLCI && !tplci) {
+                                       if ((i = get_plci(a))) {
+                                               a->AdvSignalPLCI = &a->plci[i - 1];
+                                               tplci = a->AdvSignalPLCI;
+                                               tplci->tel  = ADV_VOICE;
+                                               PUT_WORD(&voice_cai[5], a->AdvSignalAppl->MaxDataLength);
+                                               if (a->Info_Mask[a->AdvSignalAppl->Id - 1] & 0x200) {
+                                                       /* early B3 connect (CIP mask bit 9) no release after a disc */
+                                                       add_p(tplci, LLI, "\x01\x01");
+                                               }
+                                               add_p(tplci, CAI, voice_cai);
+                                               add_p(tplci, OAD, a->TelOAD);
+                                               add_p(tplci, OSA, a->TelOSA);
+                                               add_p(tplci, SHIFT | 6, NULL);
+                                               add_p(tplci, SIN, "\x02\x01\x00");
+                                               add_p(tplci, UID, "\x06\x43\x61\x70\x69\x32\x30");
+                                               sig_req(tplci, ASSIGN, DSIG_ID);
+                                               a->AdvSignalPLCI->internal_command = HOOK_OFF_REQ;
+                                               a->AdvSignalPLCI->command = 0;
+                                               tplci->appl = a->AdvSignalAppl;
+                                               tplci->call_dir = CALL_DIR_OUT | CALL_DIR_ORIGINATE;
+                                               send_req(tplci);
+                                       }
+
+                               }
+
+                               if (!tplci) break;
+                               Id = ((word)tplci->Id << 8) | a->Id;
+                               Id |= EXT_CONTROLLER;
+                               sendf(tplci->appl,
+                                     _FACILITY_I,
+                                     Id,
+                                     0,
+                                     "ws", (word)0, "\x01+");
+                               break;
+
+                       case 0x90:   /* hook on  */
+                       case 0x91:
+                               if (plci->internal_command == PERM_COD_HOOK)
+                               {
+                                       dbug(1, dprintf("init:hook_on"));
+                                       plci->hook_state = ie[1] & 0x91;
+                                       next_internal_command(Id, plci);
+                                       break;
+                               }
+                               else /* ignore doubled hook indications */
+                               {
+                                       if (((plci->hook_state) & 0xf0) == 0x90) break;
+                                       plci->hook_state = ie[1] & 0x91;
+                               }
+                               /* hangup the adv. voice call and signal '-' to the appl */
+                               if (a->AdvSignalPLCI) {
+                                       Id = ((word)a->AdvSignalPLCI->Id << 8) | a->Id;
+                                       if (plci->tel) Id |= EXT_CONTROLLER;
+                                       sendf(a->AdvSignalAppl,
+                                             _FACILITY_I,
+                                             Id,
+                                             0,
+                                             "ws", (word)0, "\x01-");
+                                       a->AdvSignalPLCI->internal_command = HOOK_ON_REQ;
+                                       a->AdvSignalPLCI->command = 0;
+                                       sig_req(a->AdvSignalPLCI, HANGUP, 0);
+                                       send_req(a->AdvSignalPLCI);
+                               }
+                               break;
+                       }
+               }
+               break;
+
+       case RESUME:
+               clear_c_ind_mask_bit(plci, (word)(plci->appl->Id - 1));
+               PUT_WORD(&resume_cau[4], GOOD);
+               sendf(plci->appl, _FACILITY_I, Id, 0, "ws", (word)3, resume_cau);
+               break;
+
+       case SUSPEND:
+               clear_c_ind_mask(plci);
+
+               if (plci->NL.Id && !plci->nl_remove_id) {
+                       mixer_remove(plci);
+                       nl_req_ncci(plci, REMOVE, 0);
+               }
+               if (!plci->sig_remove_id) {
+                       plci->internal_command = 0;
+                       sig_req(plci, REMOVE, 0);
+               }
+               send_req(plci);
+               if (!plci->channels) {
+                       sendf(plci->appl, _FACILITY_I, Id, 0, "ws", (word)3, "\x05\x04\x00\x02\x00\x00");
+                       sendf(plci->appl, _DISCONNECT_I, Id, 0, "w", 0);
+               }
+               break;
+
+       case SUSPEND_REJ:
+               break;
+
+       case HANGUP:
+               plci->hangup_flow_ctrl_timer = 0;
+               if (plci->manufacturer && plci->State == LOCAL_CONNECT) break;
+               cau = parms[7];
+               if (cau) {
+                       i = _L3_CAUSE | cau[2];
+                       if (cau[2] == 0) i = 0;
+                       else if (cau[2] == 8) i = _L1_ERROR;
+                       else if (cau[2] == 9 || cau[2] == 10) i = _L2_ERROR;
+                       else if (cau[2] == 5) i = _CAPI_GUARD_ERROR;
+               }
+               else {
+                       i = _L3_ERROR;
+               }
+
+               if (plci->State == INC_CON_PENDING || plci->State == INC_CON_ALERT)
+               {
+                       for (i = 0; i < max_appl; i++)
+                       {
+                               if (test_c_ind_mask_bit(plci, i))
+                                       sendf(&application[i], _DISCONNECT_I, Id, 0, "w", 0);
+                       }
+               }
+               else
+               {
+                       clear_c_ind_mask(plci);
+               }
+               if (!plci->appl)
+               {
+                       if (plci->State == LISTENING)
+                       {
+                               plci->notifiedcall = 0;
+                               a->listen_active--;
+                       }
+                       plci->State = INC_DIS_PENDING;
+                       if (c_ind_mask_empty(plci))
+                       {
+                               plci->State = IDLE;
+                               if (plci->NL.Id && !plci->nl_remove_id)
+                               {
+                                       mixer_remove(plci);
+                                       nl_req_ncci(plci, REMOVE, 0);
+                               }
+                               if (!plci->sig_remove_id)
+                               {
+                                       plci->internal_command = 0;
+                                       sig_req(plci, REMOVE, 0);
+                               }
+                               send_req(plci);
+                       }
+               }
+               else
+               {
+                       /* collision of DISCONNECT or CONNECT_RES with HANGUP can   */
+                       /* result in a second HANGUP! Don't generate another        */
+                       /* DISCONNECT                                               */
+                       if (plci->State != IDLE && plci->State != INC_DIS_PENDING)
+                       {
+                               if (plci->State == RESUMING)
+                               {
+                                       PUT_WORD(&resume_cau[4], i);
+                                       sendf(plci->appl, _FACILITY_I, Id, 0, "ws", (word)3, resume_cau);
+                               }
+                               plci->State = INC_DIS_PENDING;
+                               sendf(plci->appl, _DISCONNECT_I, Id, 0, "w", i);
+                       }
+               }
+               break;
+
+       case SSEXT_IND:
+               SendSSExtInd(NULL, plci, Id, multi_ssext_parms);
+               break;
+
+       case VSWITCH_REQ:
+               VSwitchReqInd(plci, Id, multi_vswitch_parms);
+               break;
+       case VSWITCH_IND:
+               if (plci->relatedPTYPLCI &&
+                   plci->vswitchstate == 3 &&
+                   plci->relatedPTYPLCI->vswitchstate == 3 &&
+                   parms[MAXPARMSIDS - 1][0])
+               {
+                       add_p(plci->relatedPTYPLCI, SMSG, parms[MAXPARMSIDS - 1]);
+                       sig_req(plci->relatedPTYPLCI, VSWITCH_REQ, 0);
+                       send_req(plci->relatedPTYPLCI);
+               }
+               else VSwitchReqInd(plci, Id, multi_vswitch_parms);
+               break;
+
+       }
+}
+
+
+static void SendSetupInfo(APPL *appl, PLCI *plci, dword Id, byte **parms, byte Info_Sent_Flag)
+{
+       word i;
+       byte *ie;
+       word Info_Number;
+       byte *Info_Element;
+       word Info_Mask = 0;
+
+       dbug(1, dprintf("SetupInfo"));
+
+       for (i = 0; i < MAXPARMSIDS; i++) {
+               ie = parms[i];
+               Info_Number = 0;
+               Info_Element = ie;
+               if (ie[0]) {
+                       switch (i) {
+                       case 0:
+                               dbug(1, dprintf("CPN "));
+                               Info_Number = 0x0070;
+                               Info_Mask = 0x80;
+                               Info_Sent_Flag = true;
+                               break;
+                       case 8:  /* display      */
+                               dbug(1, dprintf("display(%d)", i));
+                               Info_Number = 0x0028;
+                               Info_Mask = 0x04;
+                               Info_Sent_Flag = true;
+                               break;
+                       case 16: /* Channel Id */
+                               dbug(1, dprintf("CHI"));
+                               Info_Number = 0x0018;
+                               Info_Mask = 0x100;
+                               Info_Sent_Flag = true;
+                               mixer_set_bchannel_id(plci, Info_Element);
+                               break;
+                       case 19: /* Redirected Number */
+                               dbug(1, dprintf("RDN"));
+                               Info_Number = 0x0074;
+                               Info_Mask = 0x400;
+                               Info_Sent_Flag = true;
+                               break;
+                       case 20: /* Redirected Number extended */
+                               dbug(1, dprintf("RDX"));
+                               Info_Number = 0x0073;
+                               Info_Mask = 0x400;
+                               Info_Sent_Flag = true;
+                               break;
+                       case 22: /* Redirecing Number  */
+                               dbug(1, dprintf("RIN"));
+                               Info_Number = 0x0076;
+                               Info_Mask = 0x400;
+                               Info_Sent_Flag = true;
+                               break;
+                       default:
+                               Info_Number = 0;
+                               break;
+                       }
+               }
+
+               if (i == MAXPARMSIDS - 2) { /* to indicate the message type "Setup" */
+                       Info_Number = 0x8000 | 5;
+                       Info_Mask = 0x10;
+                       Info_Element = "";
+               }
+
+               if (Info_Sent_Flag && Info_Number) {
+                       if (plci->adapter->Info_Mask[appl->Id - 1] & Info_Mask) {
+                               sendf(appl, _INFO_I, Id, 0, "wS", Info_Number, Info_Element);
+                       }
+               }
+       }
 }
 
 
 static void SendInfo(PLCI *plci, dword Id, byte **parms, byte iesent)
 {
-  word i;
-  word j;
-  word k;
-  byte   * ie;
-  word Info_Number;
-  byte   * Info_Element;
-  word Info_Mask = 0;
-  static byte charges[5] = {4,0,0,0,0};
-  static byte cause[] = {0x02,0x80,0x00};
-  APPL   *appl;
-
-  dbug(1,dprintf("InfoParse "));
-
-  if(
-        !plci->appl
-        && !plci->State
-        && plci->Sig.Ind!=NCR_FACILITY
-      )
-  {
-    dbug(1,dprintf("NoParse "));
-    return;
-  }
-  cause[2] = 0;
-  for(i=0; i<MAXPARMSIDS; i++) {
-    ie = parms[i];
-    Info_Number = 0;
-    Info_Element = ie;
-    if(ie[0]) {
-      switch(i) {
-      case 0:
-        dbug(1,dprintf("CPN "));
-        Info_Number = 0x0070;
-        Info_Mask   = 0x80;
-        break;
-      case 7: /* ESC_CAU */
-        dbug(1,dprintf("cau(0x%x)",ie[2]));
-        Info_Number = 0x0008;
-        Info_Mask = 0x00;
-        cause[2] = ie[2];
-        Info_Element = NULL;
-        break;
-      case 8:  /* display      */
-        dbug(1,dprintf("display(%d)",i));
-        Info_Number = 0x0028;
-        Info_Mask = 0x04;
-        break;
-      case 9:  /* Date display */
-        dbug(1,dprintf("date(%d)",i));
-        Info_Number = 0x0029;
-        Info_Mask = 0x02;
-        break;
-      case 10: /* charges */
-        for(j=0;j<4;j++) charges[1+j] = 0;
-        for(j=0; j<ie[0] && !(ie[1+j]&0x80); j++);
-        for(k=1,j++; j<ie[0] && k<=4; j++,k++) charges[k] = ie[1+j];
-        Info_Number = 0x4000;
-        Info_Mask = 0x40;
-        Info_Element = charges;
-        break;
-      case 11: /* user user info */
-        dbug(1,dprintf("uui"));
-        Info_Number = 0x007E;
-        Info_Mask = 0x08;
-        break;
-      case 12: /* congestion receiver ready */
-        dbug(1,dprintf("clRDY"));
-        Info_Number = 0x00B0;
-        Info_Mask = 0x08;
-        Info_Element = "";
-        break;
-      case 13: /* congestion receiver not ready */
-        dbug(1,dprintf("clNRDY"));
-        Info_Number = 0x00BF;
-        Info_Mask = 0x08;
-        Info_Element = "";
-        break;
-      case 15: /* Keypad Facility */
-        dbug(1,dprintf("KEY"));
-        Info_Number = 0x002C;
-        Info_Mask = 0x20;
-        break;
-      case 16: /* Channel Id */
-        dbug(1,dprintf("CHI"));
-        Info_Number = 0x0018;
-        Info_Mask = 0x100;
-        mixer_set_bchannel_id (plci, Info_Element);
-        break;
-      case 17: /* if no 1tr6 cause, send full cause, else esc_cause */
-        dbug(1,dprintf("q9cau(0x%x)",ie[2]));
-        if(!cause[2] || cause[2]<0x80) break;  /* eg. layer 1 error */
-        Info_Number = 0x0008;
-        Info_Mask = 0x01;
-        if(cause[2] != ie[2]) Info_Element = cause;
-        break;
-      case 19: /* Redirected Number */
-        dbug(1,dprintf("RDN"));
-        Info_Number = 0x0074;
-        Info_Mask = 0x400;
-        break;
-      case 22: /* Redirecing Number  */
-        dbug(1,dprintf("RIN"));
-        Info_Number = 0x0076;
-        Info_Mask = 0x400;
-        break;
-      case 23: /* Notification Indicator  */
-        dbug(1,dprintf("NI"));
-        Info_Number = (word)NI;
-        Info_Mask = 0x210;
-        break;
-      case 26: /* Call State  */
-        dbug(1,dprintf("CST"));
-        Info_Number = (word)CST;
-        Info_Mask = 0x01; /* do with cause i.e. for now */
-        break;
-      case MAXPARMSIDS-2:  /* Escape Message Type, must be the last indication */
-        dbug(1,dprintf("ESC/MT[0x%x]",ie[3]));
-        Info_Number = 0x8000 |ie[3];
-        if(iesent) Info_Mask = 0xffff;
-        else  Info_Mask = 0x10;
-        Info_Element = "";
-        break;
-      default:
-        Info_Number  = 0;
-        Info_Mask    = 0;
-        Info_Element = "";
-        break;
-      }
-    }
-
-    if(plci->Sig.Ind==NCR_FACILITY)           /* check controller broadcast */
-    {
-      for(j=0; j<max_appl; j++)
-      {
-        appl = &application[j];
-        if(Info_Number
-        && appl->Id
-        && plci->adapter->Info_Mask[appl->Id-1] &Info_Mask)
-        {
-          dbug(1,dprintf("NCR_Ind"));
-          iesent=true;
-          sendf(&application[j],_INFO_I,Id&0x0f,0,"wS",Info_Number,Info_Element);
-        }
-      }
-    }
-    else if(!plci->appl)
-    { /* overlap receiving broadcast */
-      if(Info_Number==CPN
-      || Info_Number==KEY
-      || Info_Number==NI
-      || Info_Number==DSP
-      || Info_Number==UUI )
-      {
-        for(j=0; j<max_appl; j++)
-        {
-          if(test_c_ind_mask_bit (plci, j))
-          {
-            dbug(1,dprintf("Ovl_Ind"));
-            iesent=true;
-            sendf(&application[j],_INFO_I,Id,0,"wS",Info_Number,Info_Element);
-          }
-        }
-      }
-    }               /* all other signalling states */
-    else if(Info_Number
-    && plci->adapter->Info_Mask[plci->appl->Id-1] &Info_Mask)
-    {
-      dbug(1,dprintf("Std_Ind"));
-      iesent=true;
-      sendf(plci->appl,_INFO_I,Id,0,"wS",Info_Number,Info_Element);
-    }
-  }
+       word i;
+       word j;
+       word k;
+       byte *ie;
+       word Info_Number;
+       byte *Info_Element;
+       word Info_Mask = 0;
+       static byte charges[5] = {4, 0, 0, 0, 0};
+       static byte cause[] = {0x02, 0x80, 0x00};
+       APPL *appl;
+
+       dbug(1, dprintf("InfoParse "));
+
+       if (
+               !plci->appl
+               && !plci->State
+               && plci->Sig.Ind != NCR_FACILITY
+               )
+       {
+               dbug(1, dprintf("NoParse "));
+               return;
+       }
+       cause[2] = 0;
+       for (i = 0; i < MAXPARMSIDS; i++) {
+               ie = parms[i];
+               Info_Number = 0;
+               Info_Element = ie;
+               if (ie[0]) {
+                       switch (i) {
+                       case 0:
+                               dbug(1, dprintf("CPN "));
+                               Info_Number = 0x0070;
+                               Info_Mask   = 0x80;
+                               break;
+                       case 7: /* ESC_CAU */
+                               dbug(1, dprintf("cau(0x%x)", ie[2]));
+                               Info_Number = 0x0008;
+                               Info_Mask = 0x00;
+                               cause[2] = ie[2];
+                               Info_Element = NULL;
+                               break;
+                       case 8:  /* display      */
+                               dbug(1, dprintf("display(%d)", i));
+                               Info_Number = 0x0028;
+                               Info_Mask = 0x04;
+                               break;
+                       case 9:  /* Date display */
+                               dbug(1, dprintf("date(%d)", i));
+                               Info_Number = 0x0029;
+                               Info_Mask = 0x02;
+                               break;
+                       case 10: /* charges */
+                               for (j = 0; j < 4; j++) charges[1 + j] = 0;
+                               for (j = 0; j < ie[0] && !(ie[1 + j] & 0x80); j++);
+                               for (k = 1, j++; j < ie[0] && k <= 4; j++, k++) charges[k] = ie[1 + j];
+                               Info_Number = 0x4000;
+                               Info_Mask = 0x40;
+                               Info_Element = charges;
+                               break;
+                       case 11: /* user user info */
+                               dbug(1, dprintf("uui"));
+                               Info_Number = 0x007E;
+                               Info_Mask = 0x08;
+                               break;
+                       case 12: /* congestion receiver ready */
+                               dbug(1, dprintf("clRDY"));
+                               Info_Number = 0x00B0;
+                               Info_Mask = 0x08;
+                               Info_Element = "";
+                               break;
+                       case 13: /* congestion receiver not ready */
+                               dbug(1, dprintf("clNRDY"));
+                               Info_Number = 0x00BF;
+                               Info_Mask = 0x08;
+                               Info_Element = "";
+                               break;
+                       case 15: /* Keypad Facility */
+                               dbug(1, dprintf("KEY"));
+                               Info_Number = 0x002C;
+                               Info_Mask = 0x20;
+                               break;
+                       case 16: /* Channel Id */
+                               dbug(1, dprintf("CHI"));
+                               Info_Number = 0x0018;
+                               Info_Mask = 0x100;
+                               mixer_set_bchannel_id(plci, Info_Element);
+                               break;
+                       case 17: /* if no 1tr6 cause, send full cause, else esc_cause */
+                               dbug(1, dprintf("q9cau(0x%x)", ie[2]));
+                               if (!cause[2] || cause[2] < 0x80) break;  /* eg. layer 1 error */
+                               Info_Number = 0x0008;
+                               Info_Mask = 0x01;
+                               if (cause[2] != ie[2]) Info_Element = cause;
+                               break;
+                       case 19: /* Redirected Number */
+                               dbug(1, dprintf("RDN"));
+                               Info_Number = 0x0074;
+                               Info_Mask = 0x400;
+                               break;
+                       case 22: /* Redirecing Number  */
+                               dbug(1, dprintf("RIN"));
+                               Info_Number = 0x0076;
+                               Info_Mask = 0x400;
+                               break;
+                       case 23: /* Notification Indicator  */
+                               dbug(1, dprintf("NI"));
+                               Info_Number = (word)NI;
+                               Info_Mask = 0x210;
+                               break;
+                       case 26: /* Call State  */
+                               dbug(1, dprintf("CST"));
+                               Info_Number = (word)CST;
+                               Info_Mask = 0x01; /* do with cause i.e. for now */
+                               break;
+                       case MAXPARMSIDS - 2:  /* Escape Message Type, must be the last indication */
+                               dbug(1, dprintf("ESC/MT[0x%x]", ie[3]));
+                               Info_Number = 0x8000 | ie[3];
+                               if (iesent) Info_Mask = 0xffff;
+                               else  Info_Mask = 0x10;
+                               Info_Element = "";
+                               break;
+                       default:
+                               Info_Number  = 0;
+                               Info_Mask    = 0;
+                               Info_Element = "";
+                               break;
+                       }
+               }
+
+               if (plci->Sig.Ind == NCR_FACILITY)           /* check controller broadcast */
+               {
+                       for (j = 0; j < max_appl; j++)
+                       {
+                               appl = &application[j];
+                               if (Info_Number
+                                   && appl->Id
+                                   && plci->adapter->Info_Mask[appl->Id - 1] & Info_Mask)
+                               {
+                                       dbug(1, dprintf("NCR_Ind"));
+                                       iesent = true;
+                                       sendf(&application[j], _INFO_I, Id & 0x0f, 0, "wS", Info_Number, Info_Element);
+                               }
+                       }
+               }
+               else if (!plci->appl)
+               { /* overlap receiving broadcast */
+                       if (Info_Number == CPN
+                           || Info_Number == KEY
+                           || Info_Number == NI
+                           || Info_Number == DSP
+                           || Info_Number == UUI)
+                       {
+                               for (j = 0; j < max_appl; j++)
+                               {
+                                       if (test_c_ind_mask_bit(plci, j))
+                                       {
+                                               dbug(1, dprintf("Ovl_Ind"));
+                                               iesent = true;
+                                               sendf(&application[j], _INFO_I, Id, 0, "wS", Info_Number, Info_Element);
+                                       }
+                               }
+                       }
+               }               /* all other signalling states */
+               else if (Info_Number
+                        && plci->adapter->Info_Mask[plci->appl->Id - 1] & Info_Mask)
+               {
+                       dbug(1, dprintf("Std_Ind"));
+                       iesent = true;
+                       sendf(plci->appl, _INFO_I, Id, 0, "wS", Info_Number, Info_Element);
+               }
+       }
 }
 
 
 static byte SendMultiIE(PLCI *plci, dword Id, byte **parms, byte ie_type,
                        dword info_mask, byte setupParse)
 {
-  word i;
-  word j;
-  byte   * ie;
-  word Info_Number;
-  byte   * Info_Element;
-  APPL   *appl;
-  word Info_Mask = 0;
-  byte iesent=0;
-
-  if(
-      !plci->appl
-      && !plci->State
-      && plci->Sig.Ind!=NCR_FACILITY
-      && !setupParse
-      )
-  {
-    dbug(1,dprintf("NoM-IEParse "));
-    return 0;
-  }
-  dbug(1,dprintf("M-IEParse "));
-
-  for(i=0; i<MAX_MULTI_IE; i++)
-  {
-    ie = parms[i];
-    Info_Number = 0;
-    Info_Element = ie;
-    if(ie[0])
-    {
-      dbug(1,dprintf("[Ind0x%x]:IE=0x%x",plci->Sig.Ind,ie_type));
-      Info_Number = (word)ie_type;
-      Info_Mask = (word)info_mask;
-    }
-
-    if(plci->Sig.Ind==NCR_FACILITY)           /* check controller broadcast */
-    {
-      for(j=0; j<max_appl; j++)
-      {
-        appl = &application[j];
-        if(Info_Number
-        && appl->Id
-        && plci->adapter->Info_Mask[appl->Id-1] &Info_Mask)
-        {
-          iesent = true;
-          dbug(1,dprintf("Mlt_NCR_Ind"));
-          sendf(&application[j],_INFO_I,Id&0x0f,0,"wS",Info_Number,Info_Element);
-        }
-      }
-    }
-    else if(!plci->appl && Info_Number)
-    {                                        /* overlap receiving broadcast */
-      for(j=0; j<max_appl; j++)
-      {
-        if(test_c_ind_mask_bit (plci, j))
-        {
-          iesent = true;
-          dbug(1,dprintf("Mlt_Ovl_Ind"));
-          sendf(&application[j],_INFO_I,Id,0,"wS",Info_Number,Info_Element);
-        }
-      }
-    }                                        /* all other signalling states */
-    else if(Info_Number
-    && plci->adapter->Info_Mask[plci->appl->Id-1] &Info_Mask)
-    {
-      iesent = true;
-      dbug(1,dprintf("Mlt_Std_Ind"));
-      sendf(plci->appl,_INFO_I,Id,0,"wS",Info_Number,Info_Element);
-    }
-  }
-  return iesent;
-}
-
-static void SendSSExtInd(APPL   * appl, PLCI   * plci, dword Id, byte   * * parms)
-{
-  word i;
-   /* Format of multi_ssext_parms[i][]:
-   0 byte length
-   1 byte SSEXTIE
-   2 byte SSEXT_REQ/SSEXT_IND
-   3 byte length
-   4 word SSExtCommand
-   6... Params
-   */
-  if(
-   plci
-   && plci->State
-   && plci->Sig.Ind!=NCR_FACILITY
-    )
- for(i=0;i<MAX_MULTI_IE;i++)
-    {
-      if(parms[i][0]<6) continue;
-   if(parms[i][2]==SSEXT_REQ) continue;
-
-   if(appl)
-   {
-    parms[i][0]=0; /* kill it */
-    sendf(appl,_MANUFACTURER_I,
-    Id,
-    0,
-    "dwS",
-    _DI_MANU_ID,
-    _DI_SSEXT_CTRL,
-    &parms[i][3]);
-   }
-   else if(plci->appl)
-   {
-    parms[i][0]=0; /* kill it */
-    sendf(plci->appl,_MANUFACTURER_I,
-    Id,
-    0,
-    "dwS",
-    _DI_MANU_ID,
-    _DI_SSEXT_CTRL,
-    &parms[i][3]);
-   }
-    }
+       word i;
+       word j;
+       byte *ie;
+       word Info_Number;
+       byte *Info_Element;
+       APPL *appl;
+       word Info_Mask = 0;
+       byte iesent = 0;
+
+       if (
+               !plci->appl
+               && !plci->State
+               && plci->Sig.Ind != NCR_FACILITY
+               && !setupParse
+               )
+       {
+               dbug(1, dprintf("NoM-IEParse "));
+               return 0;
+       }
+       dbug(1, dprintf("M-IEParse "));
+
+       for (i = 0; i < MAX_MULTI_IE; i++)
+       {
+               ie = parms[i];
+               Info_Number = 0;
+               Info_Element = ie;
+               if (ie[0])
+               {
+                       dbug(1, dprintf("[Ind0x%x]:IE=0x%x", plci->Sig.Ind, ie_type));
+                       Info_Number = (word)ie_type;
+                       Info_Mask = (word)info_mask;
+               }
+
+               if (plci->Sig.Ind == NCR_FACILITY)           /* check controller broadcast */
+               {
+                       for (j = 0; j < max_appl; j++)
+                       {
+                               appl = &application[j];
+                               if (Info_Number
+                                   && appl->Id
+                                   && plci->adapter->Info_Mask[appl->Id - 1] & Info_Mask)
+                               {
+                                       iesent = true;
+                                       dbug(1, dprintf("Mlt_NCR_Ind"));
+                                       sendf(&application[j], _INFO_I, Id & 0x0f, 0, "wS", Info_Number, Info_Element);
+                               }
+                       }
+               }
+               else if (!plci->appl && Info_Number)
+               {                                        /* overlap receiving broadcast */
+                       for (j = 0; j < max_appl; j++)
+                       {
+                               if (test_c_ind_mask_bit(plci, j))
+                               {
+                                       iesent = true;
+                                       dbug(1, dprintf("Mlt_Ovl_Ind"));
+                                       sendf(&application[j] , _INFO_I, Id, 0, "wS", Info_Number, Info_Element);
+                               }
+                       }
+               }                                        /* all other signalling states */
+               else if (Info_Number
+                        && plci->adapter->Info_Mask[plci->appl->Id - 1] & Info_Mask)
+               {
+                       iesent = true;
+                       dbug(1, dprintf("Mlt_Std_Ind"));
+                       sendf(plci->appl, _INFO_I, Id, 0, "wS", Info_Number, Info_Element);
+               }
+       }
+       return iesent;
+}
+
+static void SendSSExtInd(APPL *appl, PLCI *plci, dword Id, byte **parms)
+{
+       word i;
+       /* Format of multi_ssext_parms[i][]:
+          0 byte length
+          1 byte SSEXTIE
+          2 byte SSEXT_REQ/SSEXT_IND
+          3 byte length
+          4 word SSExtCommand
+          6... Params
+       */
+       if (
+               plci
+               && plci->State
+               && plci->Sig.Ind != NCR_FACILITY
+               )
+               for (i = 0; i < MAX_MULTI_IE; i++)
+               {
+                       if (parms[i][0] < 6) continue;
+                       if (parms[i][2] == SSEXT_REQ) continue;
+
+                       if (appl)
+                       {
+                               parms[i][0] = 0; /* kill it */
+                               sendf(appl, _MANUFACTURER_I,
+                                     Id,
+                                     0,
+                                     "dwS",
+                                     _DI_MANU_ID,
+                                     _DI_SSEXT_CTRL,
+                                     &parms[i][3]);
+                       }
+                       else if (plci->appl)
+                       {
+                               parms[i][0] = 0; /* kill it */
+                               sendf(plci->appl, _MANUFACTURER_I,
+                                     Id,
+                                     0,
+                                     "dwS",
+                                     _DI_MANU_ID,
+                                     _DI_SSEXT_CTRL,
+                                     &parms[i][3]);
+                       }
+               }
 };
 
 static void nl_ind(PLCI *plci)
 {
-  byte ch;
-  word ncci;
-  dword Id;
-  DIVA_CAPI_ADAPTER   * a;
-  word NCCIcode;
-  APPL   * APPLptr;
-  word count;
-  word Num;
-  word i, ncpi_state;
-  byte len, ncci_state;
-  word msg;
-  word info = 0;
-  word fax_feature_bits;
-  byte fax_send_edata_ack;
-  static byte v120_header_buffer[2 + 3];
-  static word fax_info[] = {
-    0,                     /* T30_SUCCESS                        */
-    _FAX_NO_CONNECTION,    /* T30_ERR_NO_DIS_RECEIVED            */
-    _FAX_PROTOCOL_ERROR,   /* T30_ERR_TIMEOUT_NO_RESPONSE        */
-    _FAX_PROTOCOL_ERROR,   /* T30_ERR_RETRY_NO_RESPONSE          */
-    _FAX_PROTOCOL_ERROR,   /* T30_ERR_TOO_MANY_REPEATS           */
-    _FAX_PROTOCOL_ERROR,   /* T30_ERR_UNEXPECTED_MESSAGE         */
-    _FAX_REMOTE_ABORT,     /* T30_ERR_UNEXPECTED_DCN             */
-    _FAX_LOCAL_ABORT,      /* T30_ERR_DTC_UNSUPPORTED            */
-    _FAX_TRAINING_ERROR,   /* T30_ERR_ALL_RATES_FAILED           */
-    _FAX_TRAINING_ERROR,   /* T30_ERR_TOO_MANY_TRAINS            */
-    _FAX_PARAMETER_ERROR,  /* T30_ERR_RECEIVE_CORRUPTED          */
-    _FAX_REMOTE_ABORT,     /* T30_ERR_UNEXPECTED_DISC            */
-    _FAX_LOCAL_ABORT,      /* T30_ERR_APPLICATION_DISC           */
-    _FAX_REMOTE_REJECT,    /* T30_ERR_INCOMPATIBLE_DIS           */
-    _FAX_LOCAL_ABORT,      /* T30_ERR_INCOMPATIBLE_DCS           */
-    _FAX_PROTOCOL_ERROR,   /* T30_ERR_TIMEOUT_NO_COMMAND         */
-    _FAX_PROTOCOL_ERROR,   /* T30_ERR_RETRY_NO_COMMAND           */
-    _FAX_PROTOCOL_ERROR,   /* T30_ERR_TIMEOUT_COMMAND_TOO_LONG   */
-    _FAX_PROTOCOL_ERROR,   /* T30_ERR_TIMEOUT_RESPONSE_TOO_LONG  */
-    _FAX_NO_CONNECTION,    /* T30_ERR_NOT_IDENTIFIED             */
-    _FAX_PROTOCOL_ERROR,   /* T30_ERR_SUPERVISORY_TIMEOUT        */
-    _FAX_PARAMETER_ERROR,  /* T30_ERR_TOO_LONG_SCAN_LINE         */
-    _FAX_PROTOCOL_ERROR,   /* T30_ERR_RETRY_NO_PAGE_AFTER_MPS    */
-    _FAX_PROTOCOL_ERROR,   /* T30_ERR_RETRY_NO_PAGE_AFTER_CFR    */
-    _FAX_PROTOCOL_ERROR,   /* T30_ERR_RETRY_NO_DCS_AFTER_FTT     */
-    _FAX_PROTOCOL_ERROR,   /* T30_ERR_RETRY_NO_DCS_AFTER_EOM     */
-    _FAX_PROTOCOL_ERROR,   /* T30_ERR_RETRY_NO_DCS_AFTER_MPS     */
-    _FAX_PROTOCOL_ERROR,   /* T30_ERR_RETRY_NO_DCN_AFTER_MCF     */
-    _FAX_PROTOCOL_ERROR,   /* T30_ERR_RETRY_NO_DCN_AFTER_RTN     */
-    _FAX_PROTOCOL_ERROR,   /* T30_ERR_RETRY_NO_CFR               */
-    _FAX_PROTOCOL_ERROR,   /* T30_ERR_RETRY_NO_MCF_AFTER_EOP     */
-    _FAX_PROTOCOL_ERROR,   /* T30_ERR_RETRY_NO_MCF_AFTER_EOM     */
-    _FAX_PROTOCOL_ERROR,   /* T30_ERR_RETRY_NO_MCF_AFTER_MPS     */
-    0x331d,                /* T30_ERR_SUB_SEP_UNSUPPORTED        */
-    0x331e,                /* T30_ERR_PWD_UNSUPPORTED            */
-    0x331f,                /* T30_ERR_SUB_SEP_PWD_UNSUPPORTED    */
-    _FAX_PROTOCOL_ERROR,   /* T30_ERR_INVALID_COMMAND_FRAME      */
-    _FAX_PARAMETER_ERROR,  /* T30_ERR_UNSUPPORTED_PAGE_CODING    */
-    _FAX_PARAMETER_ERROR,  /* T30_ERR_INVALID_PAGE_CODING        */
-    _FAX_REMOTE_REJECT,    /* T30_ERR_INCOMPATIBLE_PAGE_CONFIG   */
-    _FAX_LOCAL_ABORT,      /* T30_ERR_TIMEOUT_FROM_APPLICATION   */
-    _FAX_PROTOCOL_ERROR,   /* T30_ERR_V34FAX_NO_REACTION_ON_MARK */
-    _FAX_PROTOCOL_ERROR,   /* T30_ERR_V34FAX_TRAINING_TIMEOUT    */
-    _FAX_PROTOCOL_ERROR,   /* T30_ERR_V34FAX_UNEXPECTED_V21      */
-    _FAX_PROTOCOL_ERROR,   /* T30_ERR_V34FAX_PRIMARY_CTS_ON      */
-    _FAX_LOCAL_ABORT,      /* T30_ERR_V34FAX_TURNAROUND_POLLING  */
-    _FAX_LOCAL_ABORT       /* T30_ERR_V34FAX_V8_INCOMPATIBILITY  */
-  };
-
-    byte dtmf_code_buffer[CAPIDTMF_RECV_DIGIT_BUFFER_SIZE + 1];
-
-
-  static word rtp_info[] = {
-    GOOD,                  /* RTP_SUCCESS                       */
-    0x3600                 /* RTP_ERR_SSRC_OR_PAYLOAD_CHANGE    */
-  };
-
-  static dword udata_forwarding_table[0x100 / sizeof(dword)] =
-  {
-    0x0020301e, 0x00000000, 0x00000000, 0x00000000,
-    0x00000000, 0x00000000, 0x00000000, 0x00000000
-  };
-
-  ch = plci->NL.IndCh;
-  a = plci->adapter;
-  ncci = a->ch_ncci[ch];
-  Id = (((dword)(ncci ? ncci : ch)) << 16) | (((word) plci->Id) << 8) | a->Id;
-  if(plci->tel) Id|=EXT_CONTROLLER;
-  APPLptr = plci->appl;
-  dbug(1,dprintf("NL_IND-Id(NL:0x%x)=0x%08lx,plci=%x,tel=%x,state=0x%x,ch=0x%x,chs=%d,Ind=%x",
-    plci->NL.Id,Id,plci->Id,plci->tel,plci->State,ch,plci->channels,plci->NL.Ind &0x0f));
-
-  /* in the case if no connect_active_Ind was sent to the appl we wait for */
-
-  if (plci->nl_remove_id)
-  {
-    plci->NL.RNR = 2; /* discard */
-    dbug(1,dprintf("NL discard while remove pending"));
-    return;
-  }
-  if((plci->NL.Ind &0x0f)==N_CONNECT)
-  {
-    if(plci->State==INC_DIS_PENDING
-    || plci->State==OUTG_DIS_PENDING
-    || plci->State==IDLE)
-    {
-      plci->NL.RNR = 2; /* discard */
-      dbug(1,dprintf("discard n_connect"));
-      return;
-    }
-    if(plci->State < INC_ACT_PENDING)
-    {
-      plci->NL.RNR = 1; /* flow control */
-      channel_x_off (plci, ch, N_XON_CONNECT_IND);
-      return;
-    }
-  }
-
-  if(!APPLptr)                         /* no application or invalid data */
-  {                                    /* while reloading the DSP        */
-    dbug(1,dprintf("discard1"));
-    plci->NL.RNR = 2;
-    return;
-  }
-
-  if (((plci->NL.Ind &0x0f) == N_UDATA)
-     && (((plci->B2_prot != B2_SDLC) && ((plci->B1_resource == 17) || (plci->B1_resource == 18)))
-        || (plci->B2_prot == 7)
-        || (plci->B3_prot == 7)) )
-  {
-    plci->ncpi_buffer[0] = 0;
-
-    ncpi_state = plci->ncpi_state;
-    if (plci->NL.complete == 1)
-    {
-      byte  * data = &plci->NL.RBuffer->P[0];
-
-      if ((plci->NL.RBuffer->length >= 12)
-        &&( (*data == DSP_UDATA_INDICATION_DCD_ON)
-          ||(*data == DSP_UDATA_INDICATION_CTS_ON)) )
-      {
-        word conn_opt, ncpi_opt = 0x00;
+       byte ch;
+       word ncci;
+       dword Id;
+       DIVA_CAPI_ADAPTER *a;
+       word NCCIcode;
+       APPL *APPLptr;
+       word count;
+       word Num;
+       word i, ncpi_state;
+       byte len, ncci_state;
+       word msg;
+       word info = 0;
+       word fax_feature_bits;
+       byte fax_send_edata_ack;
+       static byte v120_header_buffer[2 + 3];
+       static word fax_info[] = {
+               0,                     /* T30_SUCCESS                        */
+               _FAX_NO_CONNECTION,    /* T30_ERR_NO_DIS_RECEIVED            */
+               _FAX_PROTOCOL_ERROR,   /* T30_ERR_TIMEOUT_NO_RESPONSE        */
+               _FAX_PROTOCOL_ERROR,   /* T30_ERR_RETRY_NO_RESPONSE          */
+               _FAX_PROTOCOL_ERROR,   /* T30_ERR_TOO_MANY_REPEATS           */
+               _FAX_PROTOCOL_ERROR,   /* T30_ERR_UNEXPECTED_MESSAGE         */
+               _FAX_REMOTE_ABORT,     /* T30_ERR_UNEXPECTED_DCN             */
+               _FAX_LOCAL_ABORT,      /* T30_ERR_DTC_UNSUPPORTED            */
+               _FAX_TRAINING_ERROR,   /* T30_ERR_ALL_RATES_FAILED           */
+               _FAX_TRAINING_ERROR,   /* T30_ERR_TOO_MANY_TRAINS            */
+               _FAX_PARAMETER_ERROR,  /* T30_ERR_RECEIVE_CORRUPTED          */
+               _FAX_REMOTE_ABORT,     /* T30_ERR_UNEXPECTED_DISC            */
+               _FAX_LOCAL_ABORT,      /* T30_ERR_APPLICATION_DISC           */
+               _FAX_REMOTE_REJECT,    /* T30_ERR_INCOMPATIBLE_DIS           */
+               _FAX_LOCAL_ABORT,      /* T30_ERR_INCOMPATIBLE_DCS           */
+               _FAX_PROTOCOL_ERROR,   /* T30_ERR_TIMEOUT_NO_COMMAND         */
+               _FAX_PROTOCOL_ERROR,   /* T30_ERR_RETRY_NO_COMMAND           */
+               _FAX_PROTOCOL_ERROR,   /* T30_ERR_TIMEOUT_COMMAND_TOO_LONG   */
+               _FAX_PROTOCOL_ERROR,   /* T30_ERR_TIMEOUT_RESPONSE_TOO_LONG  */
+               _FAX_NO_CONNECTION,    /* T30_ERR_NOT_IDENTIFIED             */
+               _FAX_PROTOCOL_ERROR,   /* T30_ERR_SUPERVISORY_TIMEOUT        */
+               _FAX_PARAMETER_ERROR,  /* T30_ERR_TOO_LONG_SCAN_LINE         */
+               _FAX_PROTOCOL_ERROR,   /* T30_ERR_RETRY_NO_PAGE_AFTER_MPS    */
+               _FAX_PROTOCOL_ERROR,   /* T30_ERR_RETRY_NO_PAGE_AFTER_CFR    */
+               _FAX_PROTOCOL_ERROR,   /* T30_ERR_RETRY_NO_DCS_AFTER_FTT     */
+               _FAX_PROTOCOL_ERROR,   /* T30_ERR_RETRY_NO_DCS_AFTER_EOM     */
+               _FAX_PROTOCOL_ERROR,   /* T30_ERR_RETRY_NO_DCS_AFTER_MPS     */
+               _FAX_PROTOCOL_ERROR,   /* T30_ERR_RETRY_NO_DCN_AFTER_MCF     */
+               _FAX_PROTOCOL_ERROR,   /* T30_ERR_RETRY_NO_DCN_AFTER_RTN     */
+               _FAX_PROTOCOL_ERROR,   /* T30_ERR_RETRY_NO_CFR               */
+               _FAX_PROTOCOL_ERROR,   /* T30_ERR_RETRY_NO_MCF_AFTER_EOP     */
+               _FAX_PROTOCOL_ERROR,   /* T30_ERR_RETRY_NO_MCF_AFTER_EOM     */
+               _FAX_PROTOCOL_ERROR,   /* T30_ERR_RETRY_NO_MCF_AFTER_MPS     */
+               0x331d,                /* T30_ERR_SUB_SEP_UNSUPPORTED        */
+               0x331e,                /* T30_ERR_PWD_UNSUPPORTED            */
+               0x331f,                /* T30_ERR_SUB_SEP_PWD_UNSUPPORTED    */
+               _FAX_PROTOCOL_ERROR,   /* T30_ERR_INVALID_COMMAND_FRAME      */
+               _FAX_PARAMETER_ERROR,  /* T30_ERR_UNSUPPORTED_PAGE_CODING    */
+               _FAX_PARAMETER_ERROR,  /* T30_ERR_INVALID_PAGE_CODING        */
+               _FAX_REMOTE_REJECT,    /* T30_ERR_INCOMPATIBLE_PAGE_CONFIG   */
+               _FAX_LOCAL_ABORT,      /* T30_ERR_TIMEOUT_FROM_APPLICATION   */
+               _FAX_PROTOCOL_ERROR,   /* T30_ERR_V34FAX_NO_REACTION_ON_MARK */
+               _FAX_PROTOCOL_ERROR,   /* T30_ERR_V34FAX_TRAINING_TIMEOUT    */
+               _FAX_PROTOCOL_ERROR,   /* T30_ERR_V34FAX_UNEXPECTED_V21      */
+               _FAX_PROTOCOL_ERROR,   /* T30_ERR_V34FAX_PRIMARY_CTS_ON      */
+               _FAX_LOCAL_ABORT,      /* T30_ERR_V34FAX_TURNAROUND_POLLING  */
+               _FAX_LOCAL_ABORT       /* T30_ERR_V34FAX_V8_INCOMPATIBILITY  */
+       };
+
+       byte dtmf_code_buffer[CAPIDTMF_RECV_DIGIT_BUFFER_SIZE + 1];
+
+
+       static word rtp_info[] = {
+               GOOD,                  /* RTP_SUCCESS                       */
+               0x3600                 /* RTP_ERR_SSRC_OR_PAYLOAD_CHANGE    */
+       };
+
+       static dword udata_forwarding_table[0x100 / sizeof(dword)] =
+               {
+                       0x0020301e, 0x00000000, 0x00000000, 0x00000000,
+                       0x00000000, 0x00000000, 0x00000000, 0x00000000
+               };
+
+       ch = plci->NL.IndCh;
+       a = plci->adapter;
+       ncci = a->ch_ncci[ch];
+       Id = (((dword)(ncci ? ncci : ch)) << 16) | (((word) plci->Id) << 8) | a->Id;
+       if (plci->tel) Id |= EXT_CONTROLLER;
+       APPLptr = plci->appl;
+       dbug(1, dprintf("NL_IND-Id(NL:0x%x)=0x%08lx,plci=%x,tel=%x,state=0x%x,ch=0x%x,chs=%d,Ind=%x",
+                       plci->NL.Id, Id, plci->Id, plci->tel, plci->State, ch, plci->channels, plci->NL.Ind & 0x0f));
+
+       /* in the case if no connect_active_Ind was sent to the appl we wait for */
+
+       if (plci->nl_remove_id)
+       {
+               plci->NL.RNR = 2; /* discard */
+               dbug(1, dprintf("NL discard while remove pending"));
+               return;
+       }
+       if ((plci->NL.Ind & 0x0f) == N_CONNECT)
+       {
+               if (plci->State == INC_DIS_PENDING
+                   || plci->State == OUTG_DIS_PENDING
+                   || plci->State == IDLE)
+               {
+                       plci->NL.RNR = 2; /* discard */
+                       dbug(1, dprintf("discard n_connect"));
+                       return;
+               }
+               if (plci->State < INC_ACT_PENDING)
+               {
+                       plci->NL.RNR = 1; /* flow control */
+                       channel_x_off(plci, ch, N_XON_CONNECT_IND);
+                       return;
+               }
+       }
+
+       if (!APPLptr)                         /* no application or invalid data */
+       {                                    /* while reloading the DSP        */
+               dbug(1, dprintf("discard1"));
+               plci->NL.RNR = 2;
+               return;
+       }
+
+       if (((plci->NL.Ind & 0x0f) == N_UDATA)
+           && (((plci->B2_prot != B2_SDLC) && ((plci->B1_resource == 17) || (plci->B1_resource == 18)))
+               || (plci->B2_prot == 7)
+               || (plci->B3_prot == 7)))
+       {
+               plci->ncpi_buffer[0] = 0;
+
+               ncpi_state = plci->ncpi_state;
+               if (plci->NL.complete == 1)
+               {
+                       byte *data = &plci->NL.RBuffer->P[0];
+
+                       if ((plci->NL.RBuffer->length >= 12)
+                           && ((*data == DSP_UDATA_INDICATION_DCD_ON)
+                               || (*data == DSP_UDATA_INDICATION_CTS_ON)))
+                       {
+                               word conn_opt, ncpi_opt = 0x00;
 /*      HexDump ("MDM N_UDATA:", plci->NL.RBuffer->length, data); */
 
-        if (*data == DSP_UDATA_INDICATION_DCD_ON)
-          plci->ncpi_state |= NCPI_MDM_DCD_ON_RECEIVED;
-        if (*data == DSP_UDATA_INDICATION_CTS_ON)
-          plci->ncpi_state |= NCPI_MDM_CTS_ON_RECEIVED;
-
-        data++;    /* indication code */
-        data += 2; /* timestamp */
-        if ((*data == DSP_CONNECTED_NORM_V18) || (*data == DSP_CONNECTED_NORM_VOWN))
-          ncpi_state &= ~(NCPI_MDM_DCD_ON_RECEIVED | NCPI_MDM_CTS_ON_RECEIVED);
-        data++;    /* connected norm */
-        conn_opt = GET_WORD(data);
-        data += 2; /* connected options */
-
-        PUT_WORD (&(plci->ncpi_buffer[1]), (word)(GET_DWORD(data) & 0x0000FFFF));
-
-        if (conn_opt & DSP_CONNECTED_OPTION_MASK_V42)
-        {
-          ncpi_opt |= MDM_NCPI_ECM_V42;
-        }
-        else if (conn_opt & DSP_CONNECTED_OPTION_MASK_MNP)
-        {
-          ncpi_opt |= MDM_NCPI_ECM_MNP;
-        }
-        else
-        {
-          ncpi_opt |= MDM_NCPI_TRANSPARENT;
-        }
-        if (conn_opt & DSP_CONNECTED_OPTION_MASK_COMPRESSION)
-        {
-          ncpi_opt |= MDM_NCPI_COMPRESSED;
-        }
-        PUT_WORD (&(plci->ncpi_buffer[3]), ncpi_opt);
-        plci->ncpi_buffer[0] = 4;
-
-        plci->ncpi_state |= NCPI_VALID_CONNECT_B3_IND | NCPI_VALID_CONNECT_B3_ACT | NCPI_VALID_DISC_B3_IND;
-      }
-    }
-    if (plci->B3_prot == 7)
-    {
-      if (((a->ncci_state[ncci] == INC_ACT_PENDING) || (a->ncci_state[ncci] == OUTG_CON_PENDING))
-       && (plci->ncpi_state & NCPI_VALID_CONNECT_B3_ACT)
-       && !(plci->ncpi_state & NCPI_CONNECT_B3_ACT_SENT))
-      {
-        a->ncci_state[ncci] = INC_ACT_PENDING;
-        sendf(plci->appl,_CONNECT_B3_ACTIVE_I,Id,0,"S",plci->ncpi_buffer);
-        plci->ncpi_state |= NCPI_CONNECT_B3_ACT_SENT;
-      }
-    }
-
-    if (!((plci->requested_options_conn | plci->requested_options | plci->adapter->requested_options_table[plci->appl->Id-1])
-        & ((1L << PRIVATE_V18) | (1L << PRIVATE_VOWN)))
-     || !(ncpi_state & NCPI_MDM_DCD_ON_RECEIVED)
-     || !(ncpi_state & NCPI_MDM_CTS_ON_RECEIVED))
-
-    {
-      plci->NL.RNR = 2;
-      return;
-    }
-  }
-
-  if(plci->NL.complete == 2)
-    {
-    if (((plci->NL.Ind &0x0f) == N_UDATA)
-     && !(udata_forwarding_table[plci->RData[0].P[0] >> 5] & (1L << (plci->RData[0].P[0] & 0x1f))))
-    {
-      switch(plci->RData[0].P[0])
-      {
-
-      case DTMF_UDATA_INDICATION_FAX_CALLING_TONE:
-        if (plci->dtmf_rec_active & DTMF_LISTEN_ACTIVE_FLAG)
-          sendf(plci->appl, _FACILITY_I, Id & 0xffffL, 0,"ws", SELECTOR_DTMF, "\x01X");
-        break;
-      case DTMF_UDATA_INDICATION_ANSWER_TONE:
-        if (plci->dtmf_rec_active & DTMF_LISTEN_ACTIVE_FLAG)
-          sendf(plci->appl, _FACILITY_I, Id & 0xffffL, 0,"ws", SELECTOR_DTMF, "\x01Y");
-        break;
-      case DTMF_UDATA_INDICATION_DIGITS_RECEIVED:
-        dtmf_indication (Id, plci, plci->RData[0].P, plci->RData[0].PLength);
-        break;
-      case DTMF_UDATA_INDICATION_DIGITS_SENT:
-        dtmf_confirmation (Id, plci);
-        break;
-
-
-      case UDATA_INDICATION_MIXER_TAP_DATA:
-        capidtmf_recv_process_block (&(plci->capidtmf_state), plci->RData[0].P + 1, (word)(plci->RData[0].PLength - 1));
- i = capidtmf_indication (&(plci->capidtmf_state), dtmf_code_buffer + 1);
- if (i != 0)
- {
-   dtmf_code_buffer[0] = DTMF_UDATA_INDICATION_DIGITS_RECEIVED;
-          dtmf_indication (Id, plci, dtmf_code_buffer, (word)(i + 1));
- }
-        break;
-
-
-      case UDATA_INDICATION_MIXER_COEFS_SET:
-        mixer_indication_coefs_set (Id, plci);
-        break;
-      case UDATA_INDICATION_XCONNECT_FROM:
-        mixer_indication_xconnect_from (Id, plci, plci->RData[0].P, plci->RData[0].PLength);
-        break;
-      case UDATA_INDICATION_XCONNECT_TO:
-        mixer_indication_xconnect_to (Id, plci, plci->RData[0].P, plci->RData[0].PLength);
-        break;
-
-
-      case LEC_UDATA_INDICATION_DISABLE_DETECT:
-        ec_indication (Id, plci, plci->RData[0].P, plci->RData[0].PLength);
-        break;
-
-
-
-      default:
-        break;
-      }
-    }
-    else
-  {
-      if ((plci->RData[0].PLength != 0)
-     && ((plci->B2_prot == B2_V120_ASYNC)
-      || (plci->B2_prot == B2_V120_ASYNC_V42BIS)
-      || (plci->B2_prot == B2_V120_BIT_TRANSPARENT)))
-    {
-
-      sendf(plci->appl,_DATA_B3_I,Id,0,
-            "dwww",
-            plci->RData[1].P,
-              (plci->NL.RNum < 2) ? 0 : plci->RData[1].PLength,
-            plci->RNum,
-            plci->RFlags);
-
-    }
-    else
-    {
-
-      sendf(plci->appl,_DATA_B3_I,Id,0,
-            "dwww",
-            plci->RData[0].P,
-            plci->RData[0].PLength,
-            plci->RNum,
-            plci->RFlags);
-
-    }
-    }
-    return;
-  }
-
-  fax_feature_bits = 0;
-  if((plci->NL.Ind &0x0f)==N_CONNECT ||
-     (plci->NL.Ind &0x0f)==N_CONNECT_ACK ||
-     (plci->NL.Ind &0x0f)==N_DISC ||
-     (plci->NL.Ind &0x0f)==N_EDATA ||
-     (plci->NL.Ind &0x0f)==N_DISC_ACK)
-  {
-    info = 0;
-    plci->ncpi_buffer[0] = 0;
-    switch (plci->B3_prot) {
-    case  0: /*XPARENT*/
-    case  1: /*T.90 NL*/
-      break;    /* no network control protocol info - jfr */
-    case  2: /*ISO8202*/
-    case  3: /*X25 DCE*/
-      for(i=0; i<plci->NL.RLength; i++) plci->ncpi_buffer[4+i] = plci->NL.RBuffer->P[i];
-      plci->ncpi_buffer[0] = (byte)(i+3);
-      plci->ncpi_buffer[1] = (byte)(plci->NL.Ind &N_D_BIT? 1:0);
-      plci->ncpi_buffer[2] = 0;
-      plci->ncpi_buffer[3] = 0;
-      break;
-    case  4: /*T.30 - FAX*/
-    case  5: /*T.30 - FAX*/
-      if(plci->NL.RLength>=sizeof(T30_INFO))
-      {
-        dbug(1,dprintf("FaxStatus %04x", ((T30_INFO   *)plci->NL.RBuffer->P)->code));
-        len = 9;
-        PUT_WORD(&(plci->ncpi_buffer[1]),((T30_INFO   *)plci->NL.RBuffer->P)->rate_div_2400 * 2400);
-        fax_feature_bits = GET_WORD(&((T30_INFO   *)plci->NL.RBuffer->P)->feature_bits_low);
-        i = (((T30_INFO   *)plci->NL.RBuffer->P)->resolution & T30_RESOLUTION_R8_0770_OR_200) ? 0x0001 : 0x0000;
-        if (plci->B3_prot == 5)
-        {
-          if (!(fax_feature_bits & T30_FEATURE_BIT_ECM))
-            i |= 0x8000; /* This is not an ECM connection */
-          if (fax_feature_bits & T30_FEATURE_BIT_T6_CODING)
-            i |= 0x4000; /* This is a connection with MMR compression */
-          if (fax_feature_bits & T30_FEATURE_BIT_2D_CODING)
-            i |= 0x2000; /* This is a connection with MR compression */
-          if (fax_feature_bits & T30_FEATURE_BIT_MORE_DOCUMENTS)
-            i |= 0x0004; /* More documents */
-          if (fax_feature_bits & T30_FEATURE_BIT_POLLING)
-            i |= 0x0002; /* Fax-polling indication */
-        }
-        dbug(1,dprintf("FAX Options %04x %04x",fax_feature_bits,i));
-        PUT_WORD(&(plci->ncpi_buffer[3]),i);
-        PUT_WORD(&(plci->ncpi_buffer[5]),((T30_INFO   *)plci->NL.RBuffer->P)->data_format);
-        plci->ncpi_buffer[7] = ((T30_INFO   *)plci->NL.RBuffer->P)->pages_low;
-        plci->ncpi_buffer[8] = ((T30_INFO   *)plci->NL.RBuffer->P)->pages_high;
-        plci->ncpi_buffer[len] = 0;
-        if(((T30_INFO   *)plci->NL.RBuffer->P)->station_id_len)
-        {
-          plci->ncpi_buffer[len] = 20;
-          for (i = 0; i < T30_MAX_STATION_ID_LENGTH; i++)
-            plci->ncpi_buffer[++len] = ((T30_INFO   *)plci->NL.RBuffer->P)->station_id[i];
-        }
-        if (((plci->NL.Ind & 0x0f) == N_DISC) || ((plci->NL.Ind & 0x0f) == N_DISC_ACK))
-        {
-         if (((T30_INFO   *)plci->NL.RBuffer->P)->code < ARRAY_SIZE(fax_info))
-            info = fax_info[((T30_INFO   *)plci->NL.RBuffer->P)->code];
-          else
-            info = _FAX_PROTOCOL_ERROR;
-        }
-
-        if ((plci->requested_options_conn | plci->requested_options | a->requested_options_table[plci->appl->Id-1])
-          & ((1L << PRIVATE_FAX_SUB_SEP_PWD) | (1L << PRIVATE_FAX_NONSTANDARD)))
-        {
-          i = offsetof(T30_INFO, station_id) + T30_MAX_STATION_ID_LENGTH + ((T30_INFO   *)plci->NL.RBuffer->P)->head_line_len;
-          while (i < plci->NL.RBuffer->length)
-            plci->ncpi_buffer[++len] = plci->NL.RBuffer->P[i++];
-        }
-
-        plci->ncpi_buffer[0] = len;
-        fax_feature_bits = GET_WORD(&((T30_INFO   *)plci->NL.RBuffer->P)->feature_bits_low);
-        PUT_WORD(&((T30_INFO   *)plci->fax_connect_info_buffer)->feature_bits_low, fax_feature_bits);
-
-        plci->ncpi_state |= NCPI_VALID_CONNECT_B3_IND;
- if (((plci->NL.Ind &0x0f) == N_CONNECT_ACK)
-         || (((plci->NL.Ind &0x0f) == N_CONNECT)
-          && (fax_feature_bits & T30_FEATURE_BIT_POLLING))
-         || (((plci->NL.Ind &0x0f) == N_EDATA)
-          && ((((T30_INFO   *)plci->NL.RBuffer->P)->code == EDATA_T30_TRAIN_OK)
-           || (((T30_INFO   *)plci->NL.RBuffer->P)->code == EDATA_T30_DIS)
-           || (((T30_INFO   *)plci->NL.RBuffer->P)->code == EDATA_T30_DTC))))
- {
-          plci->ncpi_state |= NCPI_VALID_CONNECT_B3_ACT;
- }
- if (((plci->NL.Ind &0x0f) == N_DISC)
-  || ((plci->NL.Ind &0x0f) == N_DISC_ACK)
-  || (((plci->NL.Ind &0x0f) == N_EDATA)
-   && (((T30_INFO   *)plci->NL.RBuffer->P)->code == EDATA_T30_EOP_CAPI)))
- {
-          plci->ncpi_state |= NCPI_VALID_CONNECT_B3_ACT | NCPI_VALID_DISC_B3_IND;
- }
-      }
-      break;
-
-    case B3_RTP:
-      if (((plci->NL.Ind & 0x0f) == N_DISC) || ((plci->NL.Ind & 0x0f) == N_DISC_ACK))
-      {
-        if (plci->NL.RLength != 0)
-        {
-          info = rtp_info[plci->NL.RBuffer->P[0]];
-          plci->ncpi_buffer[0] = plci->NL.RLength - 1;
-          for (i = 1; i < plci->NL.RLength; i++)
-            plci->ncpi_buffer[i] = plci->NL.RBuffer->P[i];
-        }
-      }
-      break;
-
-    }
-    plci->NL.RNR = 2;
-  }
-  switch(plci->NL.Ind &0x0f) {
-  case N_EDATA:
-    if ((plci->B3_prot == 4) || (plci->B3_prot == 5))
-    {
-      dbug(1,dprintf("EDATA ncci=0x%x state=%d code=%02x", ncci, a->ncci_state[ncci],
-        ((T30_INFO   *)plci->NL.RBuffer->P)->code));
-      fax_send_edata_ack = (((T30_INFO   *)(plci->fax_connect_info_buffer))->operating_mode == T30_OPERATING_MODE_CAPI_NEG);
-
-      if ((plci->nsf_control_bits & T30_NSF_CONTROL_BIT_ENABLE_NSF)
-       && (plci->nsf_control_bits & (T30_NSF_CONTROL_BIT_NEGOTIATE_IND | T30_NSF_CONTROL_BIT_NEGOTIATE_RESP))
-       && (((T30_INFO   *)plci->NL.RBuffer->P)->code == EDATA_T30_DIS)
-       && (a->ncci_state[ncci] == OUTG_CON_PENDING)
-       && (plci->ncpi_state & NCPI_VALID_CONNECT_B3_ACT)
-       && !(plci->ncpi_state & NCPI_NEGOTIATE_B3_SENT))
-      {
-        ((T30_INFO   *)(plci->fax_connect_info_buffer))->code = ((T30_INFO   *)plci->NL.RBuffer->P)->code;
-        sendf(plci->appl,_MANUFACTURER_I,Id,0,"dwbS",_DI_MANU_ID,_DI_NEGOTIATE_B3,
-          (byte)(plci->ncpi_buffer[0] + 1), plci->ncpi_buffer);
-        plci->ncpi_state |= NCPI_NEGOTIATE_B3_SENT;
- if (plci->nsf_control_bits & T30_NSF_CONTROL_BIT_NEGOTIATE_RESP)
-   fax_send_edata_ack = false;
-      }
-
-      if (a->manufacturer_features & MANUFACTURER_FEATURE_FAX_PAPER_FORMATS)
-      {
-        switch (((T30_INFO   *)plci->NL.RBuffer->P)->code)
-        {
-        case EDATA_T30_DIS:
-          if ((a->ncci_state[ncci] == OUTG_CON_PENDING)
-           && !(GET_WORD(&((T30_INFO   *)plci->fax_connect_info_buffer)->control_bits_low) & T30_CONTROL_BIT_REQUEST_POLLING)
-           && (plci->ncpi_state & NCPI_VALID_CONNECT_B3_ACT)
-           && !(plci->ncpi_state & NCPI_CONNECT_B3_ACT_SENT))
-          {
-            a->ncci_state[ncci] = INC_ACT_PENDING;
-            if (plci->B3_prot == 4)
-              sendf(plci->appl,_CONNECT_B3_ACTIVE_I,Id,0,"s","");
-            else
-              sendf(plci->appl,_CONNECT_B3_ACTIVE_I,Id,0,"S",plci->ncpi_buffer);
-            plci->ncpi_state |= NCPI_CONNECT_B3_ACT_SENT;
-          }
-          break;
-
-        case EDATA_T30_TRAIN_OK:
-          if ((a->ncci_state[ncci] == INC_ACT_PENDING)
-           && (plci->ncpi_state & NCPI_VALID_CONNECT_B3_ACT)
-           && !(plci->ncpi_state & NCPI_CONNECT_B3_ACT_SENT))
-          {
-            if (plci->B3_prot == 4)
-              sendf(plci->appl,_CONNECT_B3_ACTIVE_I,Id,0,"s","");
-            else
-              sendf(plci->appl,_CONNECT_B3_ACTIVE_I,Id,0,"S",plci->ncpi_buffer);
-            plci->ncpi_state |= NCPI_CONNECT_B3_ACT_SENT;
-          }
-          break;
-
-        case EDATA_T30_EOP_CAPI:
-          if (a->ncci_state[ncci] == CONNECTED)
-          {
-            sendf(plci->appl,_DISCONNECT_B3_I,Id,0,"wS",GOOD,plci->ncpi_buffer);
-            a->ncci_state[ncci] = INC_DIS_PENDING;
-            plci->ncpi_state = 0;
-     fax_send_edata_ack = false;
-          }
-          break;
-        }
-      }
-      else
-      {
-        switch (((T30_INFO   *)plci->NL.RBuffer->P)->code)
-        {
-        case EDATA_T30_TRAIN_OK:
-          if ((a->ncci_state[ncci] == INC_ACT_PENDING)
-           && (plci->ncpi_state & NCPI_VALID_CONNECT_B3_ACT)
-           && !(plci->ncpi_state & NCPI_CONNECT_B3_ACT_SENT))
-          {
-            if (plci->B3_prot == 4)
-              sendf(plci->appl,_CONNECT_B3_ACTIVE_I,Id,0,"s","");
-            else
-              sendf(plci->appl,_CONNECT_B3_ACTIVE_I,Id,0,"S",plci->ncpi_buffer);
-            plci->ncpi_state |= NCPI_CONNECT_B3_ACT_SENT;
-          }
-          break;
-        }
-      }
-      if (fax_send_edata_ack)
-      {
-        ((T30_INFO   *)(plci->fax_connect_info_buffer))->code = ((T30_INFO   *)plci->NL.RBuffer->P)->code;
- plci->fax_edata_ack_length = 1;
-        start_internal_command (Id, plci, fax_edata_ack_command);
-      }
-    }
-    else
-    {
-      dbug(1,dprintf("EDATA ncci=0x%x state=%d", ncci, a->ncci_state[ncci]));
-    }
-    break;
-  case N_CONNECT:
-    if (!a->ch_ncci[ch])
-    {
-      ncci = get_ncci (plci, ch, 0);
-      Id = (Id & 0xffff) | (((dword) ncci) << 16);
-    }
-    dbug(1,dprintf("N_CONNECT: ch=%d state=%d plci=%lx plci_Id=%lx plci_State=%d",
-      ch, a->ncci_state[ncci], a->ncci_plci[ncci], plci->Id, plci->State));
-
-    msg = _CONNECT_B3_I;
-    if (a->ncci_state[ncci] == IDLE)
-      plci->channels++;
-    else if (plci->B3_prot == 1)
-      msg = _CONNECT_B3_T90_ACTIVE_I;
-
-    a->ncci_state[ncci] = INC_CON_PENDING;
-    if(plci->B3_prot == 4)
-      sendf(plci->appl,msg,Id,0,"s","");
-    else
-      sendf(plci->appl,msg,Id,0,"S",plci->ncpi_buffer);
-    break;
-  case N_CONNECT_ACK:
-    dbug(1,dprintf("N_connect_Ack"));
-    if (plci->internal_command_queue[0]
-     && ((plci->adjust_b_state == ADJUST_B_CONNECT_2)
-      || (plci->adjust_b_state == ADJUST_B_CONNECT_3)
-      || (plci->adjust_b_state == ADJUST_B_CONNECT_4)))
-    {
-      (*(plci->internal_command_queue[0]))(Id, plci, 0);
-      if (!plci->internal_command)
-        next_internal_command (Id, plci);
-      break;
-    }
-    msg = _CONNECT_B3_ACTIVE_I;
-    if (plci->B3_prot == 1)
-    {
-      if (a->ncci_state[ncci] != OUTG_CON_PENDING)
-        msg = _CONNECT_B3_T90_ACTIVE_I;
-      a->ncci_state[ncci] = INC_ACT_PENDING;
-      sendf(plci->appl,msg,Id,0,"S",plci->ncpi_buffer);
-    }
-    else if ((plci->B3_prot == 4) || (plci->B3_prot == 5) || (plci->B3_prot == 7))
-    {
-      if ((a->ncci_state[ncci] == OUTG_CON_PENDING)
-       && (plci->ncpi_state & NCPI_VALID_CONNECT_B3_ACT)
-       && !(plci->ncpi_state & NCPI_CONNECT_B3_ACT_SENT))
-      {
-        a->ncci_state[ncci] = INC_ACT_PENDING;
-        if (plci->B3_prot == 4)
-          sendf(plci->appl,msg,Id,0,"s","");
-        else
-          sendf(plci->appl,msg,Id,0,"S",plci->ncpi_buffer);
-        plci->ncpi_state |= NCPI_CONNECT_B3_ACT_SENT;
-      }
-    }
-    else
-    {
-      a->ncci_state[ncci] = INC_ACT_PENDING;
-      sendf(plci->appl,msg,Id,0,"S",plci->ncpi_buffer);
-    }
-    if (plci->adjust_b_restore)
-    {
-      plci->adjust_b_restore = false;
-      start_internal_command (Id, plci, adjust_b_restore);
-    }
-    break;
-  case N_DISC:
-  case N_DISC_ACK:
-    if (plci->internal_command_queue[0]
-     && ((plci->internal_command == FAX_DISCONNECT_COMMAND_1)
-      || (plci->internal_command == FAX_DISCONNECT_COMMAND_2)
-      || (plci->internal_command == FAX_DISCONNECT_COMMAND_3)))
-    {
-      (*(plci->internal_command_queue[0]))(Id, plci, 0);
-      if (!plci->internal_command)
-        next_internal_command (Id, plci);
-    }
-    ncci_state = a->ncci_state[ncci];
-    ncci_remove (plci, ncci, false);
-
-        /* with N_DISC or N_DISC_ACK the IDI frees the respective   */
-        /* channel, so we cannot store the state in ncci_state! The */
-        /* information which channel we received a N_DISC is thus   */
-        /* stored in the inc_dis_ncci_table buffer.                 */
-    for(i=0; plci->inc_dis_ncci_table[i]; i++);
-    plci->inc_dis_ncci_table[i] = (byte) ncci;
-
-      /* need a connect_b3_ind before a disconnect_b3_ind with FAX */
-    if (!plci->channels
-     && (plci->B1_resource == 16)
-     && (plci->State <= CONNECTED))
-    {
-      len = 9;
-      i = ((T30_INFO   *)plci->fax_connect_info_buffer)->rate_div_2400 * 2400;
-      PUT_WORD (&plci->ncpi_buffer[1], i);
-      PUT_WORD (&plci->ncpi_buffer[3], 0);
-      i = ((T30_INFO   *)plci->fax_connect_info_buffer)->data_format;
-      PUT_WORD (&plci->ncpi_buffer[5], i);
-      PUT_WORD (&plci->ncpi_buffer[7], 0);
-      plci->ncpi_buffer[len] = 0;
-      plci->ncpi_buffer[0] = len;
-      if(plci->B3_prot == 4)
-        sendf(plci->appl,_CONNECT_B3_I,Id,0,"s","");
-      else
-      {
-
-        if ((plci->requested_options_conn | plci->requested_options | a->requested_options_table[plci->appl->Id-1])
-          & ((1L << PRIVATE_FAX_SUB_SEP_PWD) | (1L << PRIVATE_FAX_NONSTANDARD)))
-        {
-          plci->ncpi_buffer[++len] = 0;
-          plci->ncpi_buffer[++len] = 0;
-          plci->ncpi_buffer[++len] = 0;
-          plci->ncpi_buffer[0] = len;
-        }
-
-        sendf(plci->appl,_CONNECT_B3_I,Id,0,"S",plci->ncpi_buffer);
-      }
-      sendf(plci->appl,_DISCONNECT_B3_I,Id,0,"wS",info,plci->ncpi_buffer);
-      plci->ncpi_state = 0;
-      sig_req(plci,HANGUP,0);
-      send_req(plci);
-      plci->State = OUTG_DIS_PENDING;
-      /* disc here */
-    }
-    else if ((a->manufacturer_features & MANUFACTURER_FEATURE_FAX_PAPER_FORMATS)
-     && ((plci->B3_prot == 4) || (plci->B3_prot == 5))
-     && ((ncci_state == INC_DIS_PENDING) || (ncci_state == IDLE)))
-    {
-      if (ncci_state == IDLE)
-      {
-        if (plci->channels)
-          plci->channels--;
-        if((plci->State==IDLE || plci->State==SUSPENDING) && !plci->channels){
-          if(plci->State == SUSPENDING){
-            sendf(plci->appl,
-                  _FACILITY_I,
-                  Id & 0xffffL,
-                  0,
-                  "ws", (word)3, "\x03\x04\x00\x00");
-            sendf(plci->appl, _DISCONNECT_I, Id & 0xffffL, 0, "w", 0);
-          }
-          plci_remove(plci);
-          plci->State=IDLE;
-        }
-      }
-    }
-    else if (plci->channels)
-    {
-      sendf(plci->appl,_DISCONNECT_B3_I,Id,0,"wS",info,plci->ncpi_buffer);
-      plci->ncpi_state = 0;
-      if ((ncci_state == OUTG_REJ_PENDING)
-       && ((plci->B3_prot != B3_T90NL) && (plci->B3_prot != B3_ISO8208) && (plci->B3_prot != B3_X25_DCE)))
-      {
-        sig_req(plci,HANGUP,0);
-        send_req(plci);
-        plci->State = OUTG_DIS_PENDING;
-      }
-    }
-    break;
-  case N_RESET:
-    a->ncci_state[ncci] = INC_RES_PENDING;
-    sendf(plci->appl,_RESET_B3_I,Id,0,"S",plci->ncpi_buffer);
-    break;
-  case N_RESET_ACK:
-    a->ncci_state[ncci] = CONNECTED;
-    sendf(plci->appl,_RESET_B3_I,Id,0,"S",plci->ncpi_buffer);
-    break;
-
-  case N_UDATA:
-    if (!(udata_forwarding_table[plci->NL.RBuffer->P[0] >> 5] & (1L << (plci->NL.RBuffer->P[0] & 0x1f))))
-    {
-      plci->RData[0].P = plci->internal_ind_buffer + (-((int)(long)(plci->internal_ind_buffer)) & 3);
-      plci->RData[0].PLength = INTERNAL_IND_BUFFER_SIZE;
-      plci->NL.R = plci->RData;
-      plci->NL.RNum = 1;
-      return;
-    }
-  case N_BDATA:
-  case N_DATA:
-    if (((a->ncci_state[ncci] != CONNECTED) && (plci->B2_prot == 1)) /* transparent */
-     || (a->ncci_state[ncci] == IDLE)
-     || (a->ncci_state[ncci] == INC_DIS_PENDING))
-    {
-      plci->NL.RNR = 2;
-      break;
-    }
-    if ((a->ncci_state[ncci] != CONNECTED)
-     && (a->ncci_state[ncci] != OUTG_DIS_PENDING)
-     && (a->ncci_state[ncci] != OUTG_REJ_PENDING))
-    {
-      dbug(1,dprintf("flow control"));
-      plci->NL.RNR = 1; /* flow control  */
-      channel_x_off (plci, ch, 0);
-      break;
-    }
-
-    NCCIcode = ncci | (((word)a->Id) << 8);
-
-                /* count all buffers within the Application pool    */
-                /* belonging to the same NCCI. If this is below the */
-                /* number of buffers available per NCCI we accept   */
-                /* this packet, otherwise we reject it              */
-    count = 0;
-    Num = 0xffff;
-    for(i=0; i<APPLptr->MaxBuffer; i++) {
-      if(NCCIcode==APPLptr->DataNCCI[i]) count++;
-      if(!APPLptr->DataNCCI[i] && Num==0xffff) Num = i;
-    }
-
-    if(count>=APPLptr->MaxNCCIData || Num==0xffff)
-    {
-      dbug(3,dprintf("Flow-Control"));
-      plci->NL.RNR = 1;
-      if( ++(APPLptr->NCCIDataFlowCtrlTimer)>=
-       (word)((a->manufacturer_features & MANUFACTURER_FEATURE_OOB_CHANNEL) ? 40 : 2000))
-      {
-        plci->NL.RNR = 2;
-        dbug(3,dprintf("DiscardData"));
-      } else {
-        channel_x_off (plci, ch, 0);
-      }
-      break;
-    }
-    else
-    {
-      APPLptr->NCCIDataFlowCtrlTimer = 0;
-    }
-
-    plci->RData[0].P = ReceiveBufferGet(APPLptr,Num);
-    if(!plci->RData[0].P) {
-      plci->NL.RNR = 1;
-      channel_x_off (plci, ch, 0);
-      break;
-    }
-
-    APPLptr->DataNCCI[Num] = NCCIcode;
-    APPLptr->DataFlags[Num] = (plci->Id<<8) | (plci->NL.Ind>>4);
-    dbug(3,dprintf("Buffer(%d), Max = %d",Num,APPLptr->MaxBuffer));
-
-    plci->RNum = Num;
-    plci->RFlags = plci->NL.Ind>>4;
-    plci->RData[0].PLength = APPLptr->MaxDataLength;
-    plci->NL.R = plci->RData;
-    if ((plci->NL.RLength != 0)
-     && ((plci->B2_prot == B2_V120_ASYNC)
-      || (plci->B2_prot == B2_V120_ASYNC_V42BIS)
-      || (plci->B2_prot == B2_V120_BIT_TRANSPARENT)))
-    {
-      plci->RData[1].P = plci->RData[0].P;
-      plci->RData[1].PLength = plci->RData[0].PLength;
-      plci->RData[0].P = v120_header_buffer + (-((unsigned long)v120_header_buffer) & 3);
-      if ((plci->NL.RBuffer->P[0] & V120_HEADER_EXTEND_BIT) || (plci->NL.RLength == 1))
-        plci->RData[0].PLength = 1;
-      else
-        plci->RData[0].PLength = 2;
-      if (plci->NL.RBuffer->P[0] & V120_HEADER_BREAK_BIT)
-        plci->RFlags |= 0x0010;
-      if (plci->NL.RBuffer->P[0] & (V120_HEADER_C1_BIT | V120_HEADER_C2_BIT))
-        plci->RFlags |= 0x8000;
-      plci->NL.RNum = 2;
-    }
-    else
-    {
-      if((plci->NL.Ind &0x0f)==N_UDATA)
-        plci->RFlags |= 0x0010;
-
-      else if ((plci->B3_prot == B3_RTP) && ((plci->NL.Ind & 0x0f) == N_BDATA))
-        plci->RFlags |= 0x0001;
-
-      plci->NL.RNum = 1;
-    }
-    break;
-  case N_DATA_ACK:
-    data_ack (plci, ch);
-    break;
-  default:
-    plci->NL.RNR = 2;
-    break;
-  }
+                               if (*data == DSP_UDATA_INDICATION_DCD_ON)
+                                       plci->ncpi_state |= NCPI_MDM_DCD_ON_RECEIVED;
+                               if (*data == DSP_UDATA_INDICATION_CTS_ON)
+                                       plci->ncpi_state |= NCPI_MDM_CTS_ON_RECEIVED;
+
+                               data++;    /* indication code */
+                               data += 2; /* timestamp */
+                               if ((*data == DSP_CONNECTED_NORM_V18) || (*data == DSP_CONNECTED_NORM_VOWN))
+                                       ncpi_state &= ~(NCPI_MDM_DCD_ON_RECEIVED | NCPI_MDM_CTS_ON_RECEIVED);
+                               data++;    /* connected norm */
+                               conn_opt = GET_WORD(data);
+                               data += 2; /* connected options */
+
+                               PUT_WORD(&(plci->ncpi_buffer[1]), (word)(GET_DWORD(data) & 0x0000FFFF));
+
+                               if (conn_opt & DSP_CONNECTED_OPTION_MASK_V42)
+                               {
+                                       ncpi_opt |= MDM_NCPI_ECM_V42;
+                               }
+                               else if (conn_opt & DSP_CONNECTED_OPTION_MASK_MNP)
+                               {
+                                       ncpi_opt |= MDM_NCPI_ECM_MNP;
+                               }
+                               else
+                               {
+                                       ncpi_opt |= MDM_NCPI_TRANSPARENT;
+                               }
+                               if (conn_opt & DSP_CONNECTED_OPTION_MASK_COMPRESSION)
+                               {
+                                       ncpi_opt |= MDM_NCPI_COMPRESSED;
+                               }
+                               PUT_WORD(&(plci->ncpi_buffer[3]), ncpi_opt);
+                               plci->ncpi_buffer[0] = 4;
+
+                               plci->ncpi_state |= NCPI_VALID_CONNECT_B3_IND | NCPI_VALID_CONNECT_B3_ACT | NCPI_VALID_DISC_B3_IND;
+                       }
+               }
+               if (plci->B3_prot == 7)
+               {
+                       if (((a->ncci_state[ncci] == INC_ACT_PENDING) || (a->ncci_state[ncci] == OUTG_CON_PENDING))
+                           && (plci->ncpi_state & NCPI_VALID_CONNECT_B3_ACT)
+                           && !(plci->ncpi_state & NCPI_CONNECT_B3_ACT_SENT))
+                       {
+                               a->ncci_state[ncci] = INC_ACT_PENDING;
+                               sendf(plci->appl, _CONNECT_B3_ACTIVE_I, Id, 0, "S", plci->ncpi_buffer);
+                               plci->ncpi_state |= NCPI_CONNECT_B3_ACT_SENT;
+                       }
+               }
+
+               if (!((plci->requested_options_conn | plci->requested_options | plci->adapter->requested_options_table[plci->appl->Id - 1])
+                     & ((1L << PRIVATE_V18) | (1L << PRIVATE_VOWN)))
+                   || !(ncpi_state & NCPI_MDM_DCD_ON_RECEIVED)
+                   || !(ncpi_state & NCPI_MDM_CTS_ON_RECEIVED))
+
+               {
+                       plci->NL.RNR = 2;
+                       return;
+               }
+       }
+
+       if (plci->NL.complete == 2)
+       {
+               if (((plci->NL.Ind & 0x0f) == N_UDATA)
+                   && !(udata_forwarding_table[plci->RData[0].P[0] >> 5] & (1L << (plci->RData[0].P[0] & 0x1f))))
+               {
+                       switch (plci->RData[0].P[0])
+                       {
+
+                       case DTMF_UDATA_INDICATION_FAX_CALLING_TONE:
+                               if (plci->dtmf_rec_active & DTMF_LISTEN_ACTIVE_FLAG)
+                                       sendf(plci->appl, _FACILITY_I, Id & 0xffffL, 0, "ws", SELECTOR_DTMF, "\x01X");
+                               break;
+                       case DTMF_UDATA_INDICATION_ANSWER_TONE:
+                               if (plci->dtmf_rec_active & DTMF_LISTEN_ACTIVE_FLAG)
+                                       sendf(plci->appl, _FACILITY_I, Id & 0xffffL, 0, "ws", SELECTOR_DTMF, "\x01Y");
+                               break;
+                       case DTMF_UDATA_INDICATION_DIGITS_RECEIVED:
+                               dtmf_indication(Id, plci, plci->RData[0].P, plci->RData[0].PLength);
+                               break;
+                       case DTMF_UDATA_INDICATION_DIGITS_SENT:
+                               dtmf_confirmation(Id, plci);
+                               break;
+
+
+                       case UDATA_INDICATION_MIXER_TAP_DATA:
+                               capidtmf_recv_process_block(&(plci->capidtmf_state), plci->RData[0].P + 1, (word)(plci->RData[0].PLength - 1));
+                               i = capidtmf_indication(&(plci->capidtmf_state), dtmf_code_buffer + 1);
+                               if (i != 0)
+                               {
+                                       dtmf_code_buffer[0] = DTMF_UDATA_INDICATION_DIGITS_RECEIVED;
+                                       dtmf_indication(Id, plci, dtmf_code_buffer, (word)(i + 1));
+                               }
+                               break;
+
+
+                       case UDATA_INDICATION_MIXER_COEFS_SET:
+                               mixer_indication_coefs_set(Id, plci);
+                               break;
+                       case UDATA_INDICATION_XCONNECT_FROM:
+                               mixer_indication_xconnect_from(Id, plci, plci->RData[0].P, plci->RData[0].PLength);
+                               break;
+                       case UDATA_INDICATION_XCONNECT_TO:
+                               mixer_indication_xconnect_to(Id, plci, plci->RData[0].P, plci->RData[0].PLength);
+                               break;
+
+
+                       case LEC_UDATA_INDICATION_DISABLE_DETECT:
+                               ec_indication(Id, plci, plci->RData[0].P, plci->RData[0].PLength);
+                               break;
+
+
+
+                       default:
+                               break;
+                       }
+               }
+               else
+               {
+                       if ((plci->RData[0].PLength != 0)
+                           && ((plci->B2_prot == B2_V120_ASYNC)
+                               || (plci->B2_prot == B2_V120_ASYNC_V42BIS)
+                               || (plci->B2_prot == B2_V120_BIT_TRANSPARENT)))
+                       {
+
+                               sendf(plci->appl, _DATA_B3_I, Id, 0,
+                                     "dwww",
+                                     plci->RData[1].P,
+                                     (plci->NL.RNum < 2) ? 0 : plci->RData[1].PLength,
+                                     plci->RNum,
+                                     plci->RFlags);
+
+                       }
+                       else
+                       {
+
+                               sendf(plci->appl, _DATA_B3_I, Id, 0,
+                                     "dwww",
+                                     plci->RData[0].P,
+                                     plci->RData[0].PLength,
+                                     plci->RNum,
+                                     plci->RFlags);
+
+                       }
+               }
+               return;
+       }
+
+       fax_feature_bits = 0;
+       if ((plci->NL.Ind & 0x0f) == N_CONNECT ||
+           (plci->NL.Ind & 0x0f) == N_CONNECT_ACK ||
+           (plci->NL.Ind & 0x0f) == N_DISC ||
+           (plci->NL.Ind & 0x0f) == N_EDATA ||
+           (plci->NL.Ind & 0x0f) == N_DISC_ACK)
+       {
+               info = 0;
+               plci->ncpi_buffer[0] = 0;
+               switch (plci->B3_prot) {
+               case  0: /*XPARENT*/
+               case  1: /*T.90 NL*/
+                       break;    /* no network control protocol info - jfr */
+               case  2: /*ISO8202*/
+               case  3: /*X25 DCE*/
+                       for (i = 0; i < plci->NL.RLength; i++) plci->ncpi_buffer[4 + i] = plci->NL.RBuffer->P[i];
+                       plci->ncpi_buffer[0] = (byte)(i + 3);
+                       plci->ncpi_buffer[1] = (byte)(plci->NL.Ind & N_D_BIT ? 1 : 0);
+                       plci->ncpi_buffer[2] = 0;
+                       plci->ncpi_buffer[3] = 0;
+                       break;
+               case  4: /*T.30 - FAX*/
+               case  5: /*T.30 - FAX*/
+                       if (plci->NL.RLength >= sizeof(T30_INFO))
+                       {
+                               dbug(1, dprintf("FaxStatus %04x", ((T30_INFO *)plci->NL.RBuffer->P)->code));
+                               len = 9;
+                               PUT_WORD(&(plci->ncpi_buffer[1]), ((T30_INFO *)plci->NL.RBuffer->P)->rate_div_2400 * 2400);
+                               fax_feature_bits = GET_WORD(&((T30_INFO *)plci->NL.RBuffer->P)->feature_bits_low);
+                               i = (((T30_INFO *)plci->NL.RBuffer->P)->resolution & T30_RESOLUTION_R8_0770_OR_200) ? 0x0001 : 0x0000;
+                               if (plci->B3_prot == 5)
+                               {
+                                       if (!(fax_feature_bits & T30_FEATURE_BIT_ECM))
+                                               i |= 0x8000; /* This is not an ECM connection */
+                                       if (fax_feature_bits & T30_FEATURE_BIT_T6_CODING)
+                                               i |= 0x4000; /* This is a connection with MMR compression */
+                                       if (fax_feature_bits & T30_FEATURE_BIT_2D_CODING)
+                                               i |= 0x2000; /* This is a connection with MR compression */
+                                       if (fax_feature_bits & T30_FEATURE_BIT_MORE_DOCUMENTS)
+                                               i |= 0x0004; /* More documents */
+                                       if (fax_feature_bits & T30_FEATURE_BIT_POLLING)
+                                               i |= 0x0002; /* Fax-polling indication */
+                               }
+                               dbug(1, dprintf("FAX Options %04x %04x", fax_feature_bits, i));
+                               PUT_WORD(&(plci->ncpi_buffer[3]), i);
+                               PUT_WORD(&(plci->ncpi_buffer[5]), ((T30_INFO *)plci->NL.RBuffer->P)->data_format);
+                               plci->ncpi_buffer[7] = ((T30_INFO *)plci->NL.RBuffer->P)->pages_low;
+                               plci->ncpi_buffer[8] = ((T30_INFO *)plci->NL.RBuffer->P)->pages_high;
+                               plci->ncpi_buffer[len] = 0;
+                               if (((T30_INFO *)plci->NL.RBuffer->P)->station_id_len)
+                               {
+                                       plci->ncpi_buffer[len] = 20;
+                                       for (i = 0; i < T30_MAX_STATION_ID_LENGTH; i++)
+                                               plci->ncpi_buffer[++len] = ((T30_INFO *)plci->NL.RBuffer->P)->station_id[i];
+                               }
+                               if (((plci->NL.Ind & 0x0f) == N_DISC) || ((plci->NL.Ind & 0x0f) == N_DISC_ACK))
+                               {
+                                       if (((T30_INFO *)plci->NL.RBuffer->P)->code < ARRAY_SIZE(fax_info))
+                                               info = fax_info[((T30_INFO *)plci->NL.RBuffer->P)->code];
+                                       else
+                                               info = _FAX_PROTOCOL_ERROR;
+                               }
+
+                               if ((plci->requested_options_conn | plci->requested_options | a->requested_options_table[plci->appl->Id - 1])
+                                   & ((1L << PRIVATE_FAX_SUB_SEP_PWD) | (1L << PRIVATE_FAX_NONSTANDARD)))
+                               {
+                                       i = offsetof(T30_INFO, station_id) + T30_MAX_STATION_ID_LENGTH + ((T30_INFO *)plci->NL.RBuffer->P)->head_line_len;
+                                       while (i < plci->NL.RBuffer->length)
+                                               plci->ncpi_buffer[++len] = plci->NL.RBuffer->P[i++];
+                               }
+
+                               plci->ncpi_buffer[0] = len;
+                               fax_feature_bits = GET_WORD(&((T30_INFO *)plci->NL.RBuffer->P)->feature_bits_low);
+                               PUT_WORD(&((T30_INFO *)plci->fax_connect_info_buffer)->feature_bits_low, fax_feature_bits);
+
+                               plci->ncpi_state |= NCPI_VALID_CONNECT_B3_IND;
+                               if (((plci->NL.Ind & 0x0f) == N_CONNECT_ACK)
+                                   || (((plci->NL.Ind & 0x0f) == N_CONNECT)
+                                       && (fax_feature_bits & T30_FEATURE_BIT_POLLING))
+                                   || (((plci->NL.Ind & 0x0f) == N_EDATA)
+                                       && ((((T30_INFO *)plci->NL.RBuffer->P)->code == EDATA_T30_TRAIN_OK)
+                                           || (((T30_INFO *)plci->NL.RBuffer->P)->code == EDATA_T30_DIS)
+                                           || (((T30_INFO *)plci->NL.RBuffer->P)->code == EDATA_T30_DTC))))
+                               {
+                                       plci->ncpi_state |= NCPI_VALID_CONNECT_B3_ACT;
+                               }
+                               if (((plci->NL.Ind & 0x0f) == N_DISC)
+                                   || ((plci->NL.Ind & 0x0f) == N_DISC_ACK)
+                                   || (((plci->NL.Ind & 0x0f) == N_EDATA)
+                                       && (((T30_INFO *)plci->NL.RBuffer->P)->code == EDATA_T30_EOP_CAPI)))
+                               {
+                                       plci->ncpi_state |= NCPI_VALID_CONNECT_B3_ACT | NCPI_VALID_DISC_B3_IND;
+                               }
+                       }
+                       break;
+
+               case B3_RTP:
+                       if (((plci->NL.Ind & 0x0f) == N_DISC) || ((plci->NL.Ind & 0x0f) == N_DISC_ACK))
+                       {
+                               if (plci->NL.RLength != 0)
+                               {
+                                       info = rtp_info[plci->NL.RBuffer->P[0]];
+                                       plci->ncpi_buffer[0] = plci->NL.RLength - 1;
+                                       for (i = 1; i < plci->NL.RLength; i++)
+                                               plci->ncpi_buffer[i] = plci->NL.RBuffer->P[i];
+                               }
+                       }
+                       break;
+
+               }
+               plci->NL.RNR = 2;
+       }
+       switch (plci->NL.Ind & 0x0f) {
+       case N_EDATA:
+               if ((plci->B3_prot == 4) || (plci->B3_prot == 5))
+               {
+                       dbug(1, dprintf("EDATA ncci=0x%x state=%d code=%02x", ncci, a->ncci_state[ncci],
+                                       ((T30_INFO *)plci->NL.RBuffer->P)->code));
+                       fax_send_edata_ack = (((T30_INFO *)(plci->fax_connect_info_buffer))->operating_mode == T30_OPERATING_MODE_CAPI_NEG);
+
+                       if ((plci->nsf_control_bits & T30_NSF_CONTROL_BIT_ENABLE_NSF)
+                           && (plci->nsf_control_bits & (T30_NSF_CONTROL_BIT_NEGOTIATE_IND | T30_NSF_CONTROL_BIT_NEGOTIATE_RESP))
+                           && (((T30_INFO *)plci->NL.RBuffer->P)->code == EDATA_T30_DIS)
+                           && (a->ncci_state[ncci] == OUTG_CON_PENDING)
+                           && (plci->ncpi_state & NCPI_VALID_CONNECT_B3_ACT)
+                           && !(plci->ncpi_state & NCPI_NEGOTIATE_B3_SENT))
+                       {
+                               ((T30_INFO *)(plci->fax_connect_info_buffer))->code = ((T30_INFO *)plci->NL.RBuffer->P)->code;
+                               sendf(plci->appl, _MANUFACTURER_I, Id, 0, "dwbS", _DI_MANU_ID, _DI_NEGOTIATE_B3,
+                                     (byte)(plci->ncpi_buffer[0] + 1), plci->ncpi_buffer);
+                               plci->ncpi_state |= NCPI_NEGOTIATE_B3_SENT;
+                               if (plci->nsf_control_bits & T30_NSF_CONTROL_BIT_NEGOTIATE_RESP)
+                                       fax_send_edata_ack = false;
+                       }
+
+                       if (a->manufacturer_features & MANUFACTURER_FEATURE_FAX_PAPER_FORMATS)
+                       {
+                               switch (((T30_INFO *)plci->NL.RBuffer->P)->code)
+                               {
+                               case EDATA_T30_DIS:
+                                       if ((a->ncci_state[ncci] == OUTG_CON_PENDING)
+                                           && !(GET_WORD(&((T30_INFO *)plci->fax_connect_info_buffer)->control_bits_low) & T30_CONTROL_BIT_REQUEST_POLLING)
+                                           && (plci->ncpi_state & NCPI_VALID_CONNECT_B3_ACT)
+                                           && !(plci->ncpi_state & NCPI_CONNECT_B3_ACT_SENT))
+                                       {
+                                               a->ncci_state[ncci] = INC_ACT_PENDING;
+                                               if (plci->B3_prot == 4)
+                                                       sendf(plci->appl, _CONNECT_B3_ACTIVE_I, Id, 0, "s", "");
+                                               else
+                                                       sendf(plci->appl, _CONNECT_B3_ACTIVE_I, Id, 0, "S", plci->ncpi_buffer);
+                                               plci->ncpi_state |= NCPI_CONNECT_B3_ACT_SENT;
+                                       }
+                                       break;
+
+                               case EDATA_T30_TRAIN_OK:
+                                       if ((a->ncci_state[ncci] == INC_ACT_PENDING)
+                                           && (plci->ncpi_state & NCPI_VALID_CONNECT_B3_ACT)
+                                           && !(plci->ncpi_state & NCPI_CONNECT_B3_ACT_SENT))
+                                       {
+                                               if (plci->B3_prot == 4)
+                                                       sendf(plci->appl, _CONNECT_B3_ACTIVE_I, Id, 0, "s", "");
+                                               else
+                                                       sendf(plci->appl, _CONNECT_B3_ACTIVE_I, Id, 0, "S", plci->ncpi_buffer);
+                                               plci->ncpi_state |= NCPI_CONNECT_B3_ACT_SENT;
+                                       }
+                                       break;
+
+                               case EDATA_T30_EOP_CAPI:
+                                       if (a->ncci_state[ncci] == CONNECTED)
+                                       {
+                                               sendf(plci->appl, _DISCONNECT_B3_I, Id, 0, "wS", GOOD, plci->ncpi_buffer);
+                                               a->ncci_state[ncci] = INC_DIS_PENDING;
+                                               plci->ncpi_state = 0;
+                                               fax_send_edata_ack = false;
+                                       }
+                                       break;
+                               }
+                       }
+                       else
+                       {
+                               switch (((T30_INFO *)plci->NL.RBuffer->P)->code)
+                               {
+                               case EDATA_T30_TRAIN_OK:
+                                       if ((a->ncci_state[ncci] == INC_ACT_PENDING)
+                                           && (plci->ncpi_state & NCPI_VALID_CONNECT_B3_ACT)
+                                           && !(plci->ncpi_state & NCPI_CONNECT_B3_ACT_SENT))
+                                       {
+                                               if (plci->B3_prot == 4)
+                                                       sendf(plci->appl, _CONNECT_B3_ACTIVE_I, Id, 0, "s", "");
+                                               else
+                                                       sendf(plci->appl, _CONNECT_B3_ACTIVE_I, Id, 0, "S", plci->ncpi_buffer);
+                                               plci->ncpi_state |= NCPI_CONNECT_B3_ACT_SENT;
+                                       }
+                                       break;
+                               }
+                       }
+                       if (fax_send_edata_ack)
+                       {
+                               ((T30_INFO *)(plci->fax_connect_info_buffer))->code = ((T30_INFO *)plci->NL.RBuffer->P)->code;
+                               plci->fax_edata_ack_length = 1;
+                               start_internal_command(Id, plci, fax_edata_ack_command);
+                       }
+               }
+               else
+               {
+                       dbug(1, dprintf("EDATA ncci=0x%x state=%d", ncci, a->ncci_state[ncci]));
+               }
+               break;
+       case N_CONNECT:
+               if (!a->ch_ncci[ch])
+               {
+                       ncci = get_ncci(plci, ch, 0);
+                       Id = (Id & 0xffff) | (((dword) ncci) << 16);
+               }
+               dbug(1, dprintf("N_CONNECT: ch=%d state=%d plci=%lx plci_Id=%lx plci_State=%d",
+                               ch, a->ncci_state[ncci], a->ncci_plci[ncci], plci->Id, plci->State));
+
+               msg = _CONNECT_B3_I;
+               if (a->ncci_state[ncci] == IDLE)
+                       plci->channels++;
+               else if (plci->B3_prot == 1)
+                       msg = _CONNECT_B3_T90_ACTIVE_I;
+
+               a->ncci_state[ncci] = INC_CON_PENDING;
+               if (plci->B3_prot == 4)
+                       sendf(plci->appl, msg, Id, 0, "s", "");
+               else
+                       sendf(plci->appl, msg, Id, 0, "S", plci->ncpi_buffer);
+               break;
+       case N_CONNECT_ACK:
+               dbug(1, dprintf("N_connect_Ack"));
+               if (plci->internal_command_queue[0]
+                   && ((plci->adjust_b_state == ADJUST_B_CONNECT_2)
+                       || (plci->adjust_b_state == ADJUST_B_CONNECT_3)
+                       || (plci->adjust_b_state == ADJUST_B_CONNECT_4)))
+               {
+                       (*(plci->internal_command_queue[0]))(Id, plci, 0);
+                       if (!plci->internal_command)
+                               next_internal_command(Id, plci);
+                       break;
+               }
+               msg = _CONNECT_B3_ACTIVE_I;
+               if (plci->B3_prot == 1)
+               {
+                       if (a->ncci_state[ncci] != OUTG_CON_PENDING)
+                               msg = _CONNECT_B3_T90_ACTIVE_I;
+                       a->ncci_state[ncci] = INC_ACT_PENDING;
+                       sendf(plci->appl, msg, Id, 0, "S", plci->ncpi_buffer);
+               }
+               else if ((plci->B3_prot == 4) || (plci->B3_prot == 5) || (plci->B3_prot == 7))
+               {
+                       if ((a->ncci_state[ncci] == OUTG_CON_PENDING)
+                           && (plci->ncpi_state & NCPI_VALID_CONNECT_B3_ACT)
+                           && !(plci->ncpi_state & NCPI_CONNECT_B3_ACT_SENT))
+                       {
+                               a->ncci_state[ncci] = INC_ACT_PENDING;
+                               if (plci->B3_prot == 4)
+                                       sendf(plci->appl, msg, Id, 0, "s", "");
+                               else
+                                       sendf(plci->appl, msg, Id, 0, "S", plci->ncpi_buffer);
+                               plci->ncpi_state |= NCPI_CONNECT_B3_ACT_SENT;
+                       }
+               }
+               else
+               {
+                       a->ncci_state[ncci] = INC_ACT_PENDING;
+                       sendf(plci->appl, msg, Id, 0, "S", plci->ncpi_buffer);
+               }
+               if (plci->adjust_b_restore)
+               {
+                       plci->adjust_b_restore = false;
+                       start_internal_command(Id, plci, adjust_b_restore);
+               }
+               break;
+       case N_DISC:
+       case N_DISC_ACK:
+               if (plci->internal_command_queue[0]
+                   && ((plci->internal_command == FAX_DISCONNECT_COMMAND_1)
+                       || (plci->internal_command == FAX_DISCONNECT_COMMAND_2)
+                       || (plci->internal_command == FAX_DISCONNECT_COMMAND_3)))
+               {
+                       (*(plci->internal_command_queue[0]))(Id, plci, 0);
+                       if (!plci->internal_command)
+                               next_internal_command(Id, plci);
+               }
+               ncci_state = a->ncci_state[ncci];
+               ncci_remove(plci, ncci, false);
+
+               /* with N_DISC or N_DISC_ACK the IDI frees the respective   */
+               /* channel, so we cannot store the state in ncci_state! The */
+               /* information which channel we received a N_DISC is thus   */
+               /* stored in the inc_dis_ncci_table buffer.                 */
+               for (i = 0; plci->inc_dis_ncci_table[i]; i++);
+               plci->inc_dis_ncci_table[i] = (byte) ncci;
+
+               /* need a connect_b3_ind before a disconnect_b3_ind with FAX */
+               if (!plci->channels
+                   && (plci->B1_resource == 16)
+                   && (plci->State <= CONNECTED))
+               {
+                       len = 9;
+                       i = ((T30_INFO *)plci->fax_connect_info_buffer)->rate_div_2400 * 2400;
+                       PUT_WORD(&plci->ncpi_buffer[1], i);
+                       PUT_WORD(&plci->ncpi_buffer[3], 0);
+                       i = ((T30_INFO *)plci->fax_connect_info_buffer)->data_format;
+                       PUT_WORD(&plci->ncpi_buffer[5], i);
+                       PUT_WORD(&plci->ncpi_buffer[7], 0);
+                       plci->ncpi_buffer[len] = 0;
+                       plci->ncpi_buffer[0] = len;
+                       if (plci->B3_prot == 4)
+                               sendf(plci->appl, _CONNECT_B3_I, Id, 0, "s", "");
+                       else
+                       {
+
+                               if ((plci->requested_options_conn | plci->requested_options | a->requested_options_table[plci->appl->Id - 1])
+                                   & ((1L << PRIVATE_FAX_SUB_SEP_PWD) | (1L << PRIVATE_FAX_NONSTANDARD)))
+                               {
+                                       plci->ncpi_buffer[++len] = 0;
+                                       plci->ncpi_buffer[++len] = 0;
+                                       plci->ncpi_buffer[++len] = 0;
+                                       plci->ncpi_buffer[0] = len;
+                               }
+
+                               sendf(plci->appl, _CONNECT_B3_I, Id, 0, "S", plci->ncpi_buffer);
+                       }
+                       sendf(plci->appl, _DISCONNECT_B3_I, Id, 0, "wS", info, plci->ncpi_buffer);
+                       plci->ncpi_state = 0;
+                       sig_req(plci, HANGUP, 0);
+                       send_req(plci);
+                       plci->State = OUTG_DIS_PENDING;
+                       /* disc here */
+               }
+               else if ((a->manufacturer_features & MANUFACTURER_FEATURE_FAX_PAPER_FORMATS)
+                        && ((plci->B3_prot == 4) || (plci->B3_prot == 5))
+                        && ((ncci_state == INC_DIS_PENDING) || (ncci_state == IDLE)))
+               {
+                       if (ncci_state == IDLE)
+                       {
+                               if (plci->channels)
+                                       plci->channels--;
+                               if ((plci->State == IDLE || plci->State == SUSPENDING) && !plci->channels) {
+                                       if (plci->State == SUSPENDING) {
+                                               sendf(plci->appl,
+                                                     _FACILITY_I,
+                                                     Id & 0xffffL,
+                                                     0,
+                                                     "ws", (word)3, "\x03\x04\x00\x00");
+                                               sendf(plci->appl, _DISCONNECT_I, Id & 0xffffL, 0, "w", 0);
+                                       }
+                                       plci_remove(plci);
+                                       plci->State = IDLE;
+                               }
+                       }
+               }
+               else if (plci->channels)
+               {
+                       sendf(plci->appl, _DISCONNECT_B3_I, Id, 0, "wS", info, plci->ncpi_buffer);
+                       plci->ncpi_state = 0;
+                       if ((ncci_state == OUTG_REJ_PENDING)
+                           && ((plci->B3_prot != B3_T90NL) && (plci->B3_prot != B3_ISO8208) && (plci->B3_prot != B3_X25_DCE)))
+                       {
+                               sig_req(plci, HANGUP, 0);
+                               send_req(plci);
+                               plci->State = OUTG_DIS_PENDING;
+                       }
+               }
+               break;
+       case N_RESET:
+               a->ncci_state[ncci] = INC_RES_PENDING;
+               sendf(plci->appl, _RESET_B3_I, Id, 0, "S", plci->ncpi_buffer);
+               break;
+       case N_RESET_ACK:
+               a->ncci_state[ncci] = CONNECTED;
+               sendf(plci->appl, _RESET_B3_I, Id, 0, "S", plci->ncpi_buffer);
+               break;
+
+       case N_UDATA:
+               if (!(udata_forwarding_table[plci->NL.RBuffer->P[0] >> 5] & (1L << (plci->NL.RBuffer->P[0] & 0x1f))))
+               {
+                       plci->RData[0].P = plci->internal_ind_buffer + (-((int)(long)(plci->internal_ind_buffer)) & 3);
+                       plci->RData[0].PLength = INTERNAL_IND_BUFFER_SIZE;
+                       plci->NL.R = plci->RData;
+                       plci->NL.RNum = 1;
+                       return;
+               }
+       case N_BDATA:
+       case N_DATA:
+               if (((a->ncci_state[ncci] != CONNECTED) && (plci->B2_prot == 1)) /* transparent */
+                   || (a->ncci_state[ncci] == IDLE)
+                   || (a->ncci_state[ncci] == INC_DIS_PENDING))
+               {
+                       plci->NL.RNR = 2;
+                       break;
+               }
+               if ((a->ncci_state[ncci] != CONNECTED)
+                   && (a->ncci_state[ncci] != OUTG_DIS_PENDING)
+                   && (a->ncci_state[ncci] != OUTG_REJ_PENDING))
+               {
+                       dbug(1, dprintf("flow control"));
+                       plci->NL.RNR = 1; /* flow control  */
+                       channel_x_off(plci, ch, 0);
+                       break;
+               }
+
+               NCCIcode = ncci | (((word)a->Id) << 8);
+
+               /* count all buffers within the Application pool    */
+               /* belonging to the same NCCI. If this is below the */
+               /* number of buffers available per NCCI we accept   */
+               /* this packet, otherwise we reject it              */
+               count = 0;
+               Num = 0xffff;
+               for (i = 0; i < APPLptr->MaxBuffer; i++) {
+                       if (NCCIcode == APPLptr->DataNCCI[i]) count++;
+                       if (!APPLptr->DataNCCI[i] && Num == 0xffff) Num = i;
+               }
+
+               if (count >= APPLptr->MaxNCCIData || Num == 0xffff)
+               {
+                       dbug(3, dprintf("Flow-Control"));
+                       plci->NL.RNR = 1;
+                       if (++(APPLptr->NCCIDataFlowCtrlTimer) >=
+                           (word)((a->manufacturer_features & MANUFACTURER_FEATURE_OOB_CHANNEL) ? 40 : 2000))
+                       {
+                               plci->NL.RNR = 2;
+                               dbug(3, dprintf("DiscardData"));
+                       } else {
+                               channel_x_off(plci, ch, 0);
+                       }
+                       break;
+               }
+               else
+               {
+                       APPLptr->NCCIDataFlowCtrlTimer = 0;
+               }
+
+               plci->RData[0].P = ReceiveBufferGet(APPLptr, Num);
+               if (!plci->RData[0].P) {
+                       plci->NL.RNR = 1;
+                       channel_x_off(plci, ch, 0);
+                       break;
+               }
+
+               APPLptr->DataNCCI[Num] = NCCIcode;
+               APPLptr->DataFlags[Num] = (plci->Id << 8) | (plci->NL.Ind >> 4);
+               dbug(3, dprintf("Buffer(%d), Max = %d", Num, APPLptr->MaxBuffer));
+
+               plci->RNum = Num;
+               plci->RFlags = plci->NL.Ind >> 4;
+               plci->RData[0].PLength = APPLptr->MaxDataLength;
+               plci->NL.R = plci->RData;
+               if ((plci->NL.RLength != 0)
+                   && ((plci->B2_prot == B2_V120_ASYNC)
+                       || (plci->B2_prot == B2_V120_ASYNC_V42BIS)
+                       || (plci->B2_prot == B2_V120_BIT_TRANSPARENT)))
+               {
+                       plci->RData[1].P = plci->RData[0].P;
+                       plci->RData[1].PLength = plci->RData[0].PLength;
+                       plci->RData[0].P = v120_header_buffer + (-((unsigned long)v120_header_buffer) & 3);
+                       if ((plci->NL.RBuffer->P[0] & V120_HEADER_EXTEND_BIT) || (plci->NL.RLength == 1))
+                               plci->RData[0].PLength = 1;
+                       else
+                               plci->RData[0].PLength = 2;
+                       if (plci->NL.RBuffer->P[0] & V120_HEADER_BREAK_BIT)
+                               plci->RFlags |= 0x0010;
+                       if (plci->NL.RBuffer->P[0] & (V120_HEADER_C1_BIT | V120_HEADER_C2_BIT))
+                               plci->RFlags |= 0x8000;
+                       plci->NL.RNum = 2;
+               }
+               else
+               {
+                       if ((plci->NL.Ind & 0x0f) == N_UDATA)
+                               plci->RFlags |= 0x0010;
+
+                       else if ((plci->B3_prot == B3_RTP) && ((plci->NL.Ind & 0x0f) == N_BDATA))
+                               plci->RFlags |= 0x0001;
+
+                       plci->NL.RNum = 1;
+               }
+               break;
+       case N_DATA_ACK:
+               data_ack(plci, ch);
+               break;
+       default:
+               plci->NL.RNR = 2;
+               break;
+       }
 }
 
 /*------------------------------------------------------------------*/
-/* find a free PLCI                                                 */
+/* find a free PLCI */
 /*------------------------------------------------------------------*/
 
 static word get_plci(DIVA_CAPI_ADAPTER *a)
 {
-  word i,j;
-  PLCI   * plci;
-
-  dump_plcis (a);
-  for(i=0;i<a->max_plci && a->plci[i].Id;i++);
-  if(i==a->max_plci) {
-    dbug(1,dprintf("get_plci: out of PLCIs"));
-    return 0;
-  }
-  plci = &a->plci[i];
-  plci->Id = (byte)(i+1);
-
-  plci->Sig.Id = 0;
-  plci->NL.Id = 0;
-  plci->sig_req = 0;
-  plci->nl_req = 0;
-
-  plci->appl = NULL;
-  plci->relatedPTYPLCI = NULL;
-  plci->State = IDLE;
-  plci->SuppState = IDLE;
-  plci->channels = 0;
-  plci->tel = 0;
-  plci->B1_resource = 0;
-  plci->B2_prot = 0;
-  plci->B3_prot = 0;
-
-  plci->command = 0;
-  plci->m_command = 0;
-  init_internal_command_queue (plci);
-  plci->number = 0;
-  plci->req_in_start = 0;
-  plci->req_in = 0;
-  plci->req_out = 0;
-  plci->msg_in_write_pos = MSG_IN_QUEUE_SIZE;
-  plci->msg_in_read_pos = MSG_IN_QUEUE_SIZE;
-  plci->msg_in_wrap_pos = MSG_IN_QUEUE_SIZE;
-
-  plci->data_sent = false;
-  plci->send_disc = 0;
-  plci->sig_global_req = 0;
-  plci->sig_remove_id = 0;
-  plci->nl_global_req = 0;
-  plci->nl_remove_id = 0;
-  plci->adv_nl = 0;
-  plci->manufacturer = false;
-  plci->call_dir = CALL_DIR_OUT | CALL_DIR_ORIGINATE;
-  plci->spoofed_msg = 0;
-  plci->ptyState = 0;
-  plci->cr_enquiry = false;
-  plci->hangup_flow_ctrl_timer = 0;
-
-  plci->ncci_ring_list = 0;
-  for(j=0;j<MAX_CHANNELS_PER_PLCI;j++) plci->inc_dis_ncci_table[j] = 0;
-  clear_c_ind_mask (plci);
-  set_group_ind_mask (plci);
-  plci->fax_connect_info_length = 0;
-  plci->nsf_control_bits = 0;
-  plci->ncpi_state = 0x00;
-  plci->ncpi_buffer[0] = 0;
-
-  plci->requested_options_conn = 0;
-  plci->requested_options = 0;
-  plci->notifiedcall = 0;
-  plci->vswitchstate = 0;
-  plci->vsprot = 0;
-  plci->vsprotdialect = 0;
-  init_b1_config (plci);
-  dbug(1,dprintf("get_plci(%x)",plci->Id));
-  return i+1;
+       word i, j;
+       PLCI *plci;
+
+       dump_plcis(a);
+       for (i = 0; i < a->max_plci && a->plci[i].Id; i++);
+       if (i == a->max_plci) {
+               dbug(1, dprintf("get_plci: out of PLCIs"));
+               return 0;
+       }
+       plci = &a->plci[i];
+       plci->Id = (byte)(i + 1);
+
+       plci->Sig.Id = 0;
+       plci->NL.Id = 0;
+       plci->sig_req = 0;
+       plci->nl_req = 0;
+
+       plci->appl = NULL;
+       plci->relatedPTYPLCI = NULL;
+       plci->State = IDLE;
+       plci->SuppState = IDLE;
+       plci->channels = 0;
+       plci->tel = 0;
+       plci->B1_resource = 0;
+       plci->B2_prot = 0;
+       plci->B3_prot = 0;
+
+       plci->command = 0;
+       plci->m_command = 0;
+       init_internal_command_queue(plci);
+       plci->number = 0;
+       plci->req_in_start = 0;
+       plci->req_in = 0;
+       plci->req_out = 0;
+       plci->msg_in_write_pos = MSG_IN_QUEUE_SIZE;
+       plci->msg_in_read_pos = MSG_IN_QUEUE_SIZE;
+       plci->msg_in_wrap_pos = MSG_IN_QUEUE_SIZE;
+
+       plci->data_sent = false;
+       plci->send_disc = 0;
+       plci->sig_global_req = 0;
+       plci->sig_remove_id = 0;
+       plci->nl_global_req = 0;
+       plci->nl_remove_id = 0;
+       plci->adv_nl = 0;
+       plci->manufacturer = false;
+       plci->call_dir = CALL_DIR_OUT | CALL_DIR_ORIGINATE;
+       plci->spoofed_msg = 0;
+       plci->ptyState = 0;
+       plci->cr_enquiry = false;
+       plci->hangup_flow_ctrl_timer = 0;
+
+       plci->ncci_ring_list = 0;
+       for (j = 0; j < MAX_CHANNELS_PER_PLCI; j++) plci->inc_dis_ncci_table[j] = 0;
+       clear_c_ind_mask(plci);
+       set_group_ind_mask(plci);
+       plci->fax_connect_info_length = 0;
+       plci->nsf_control_bits = 0;
+       plci->ncpi_state = 0x00;
+       plci->ncpi_buffer[0] = 0;
+
+       plci->requested_options_conn = 0;
+       plci->requested_options = 0;
+       plci->notifiedcall = 0;
+       plci->vswitchstate = 0;
+       plci->vsprot = 0;
+       plci->vsprotdialect = 0;
+       init_b1_config(plci);
+       dbug(1, dprintf("get_plci(%x)", plci->Id));
+       return i + 1;
 }
 
 /*------------------------------------------------------------------*/
 /* put a parameter in the parameter buffer                          */
 /*------------------------------------------------------------------*/
 
-static void add_p(PLCI   * plci, byte code, byte   * p)
+static void add_p(PLCI *plci, byte code, byte *p)
 {
-  word p_length;
+       word p_length;
 
-  p_length = 0;
-  if(p) p_length = p[0];
-  add_ie(plci, code, p, p_length);
+       p_length = 0;
+       if (p) p_length = p[0];
+       add_ie(plci, code, p, p_length);
 }
 
 /*------------------------------------------------------------------*/
 /* put a structure in the parameter buffer                          */
 /*------------------------------------------------------------------*/
-static void add_s(PLCI   * plci, byte code, API_PARSE * p)
+static void add_s(PLCI *plci, byte code, API_PARSE *p)
 {
-  if(p) add_ie(plci, code, p->info, (word)p->length);
+       if (p) add_ie(plci, code, p->info, (word)p->length);
 }
 
 /*------------------------------------------------------------------*/
 /* put multiple structures in the parameter buffer                  */
 /*------------------------------------------------------------------*/
-static void add_ss(PLCI   * plci, byte code, API_PARSE * p)
+static void add_ss(PLCI *plci, byte code, API_PARSE *p)
 {
-  byte i;
+       byte i;
 
-  if(p){
-    dbug(1,dprintf("add_ss(%x,len=%d)",code,p->length));
-    for(i=2;i<(byte)p->length;i+=p->info[i]+2){
-      dbug(1,dprintf("add_ss_ie(%x,len=%d)",p->info[i-1],p->info[i]));
-      add_ie(plci, p->info[i-1], (byte   *)&(p->info[i]), (word)p->info[i]);
-    }
-  }
+       if (p) {
+               dbug(1, dprintf("add_ss(%x,len=%d)", code, p->length));
+               for (i = 2; i < (byte)p->length; i += p->info[i] + 2) {
+                       dbug(1, dprintf("add_ss_ie(%x,len=%d)", p->info[i - 1], p->info[i]));
+                       add_ie(plci, p->info[i - 1], (byte *)&(p->info[i]), (word)p->info[i]);
+               }
+       }
 }
 
 /*------------------------------------------------------------------*/
 /* return the channel number sent by the application in a esc_chi   */
 /*------------------------------------------------------------------*/
-static byte getChannel(API_PARSE * p)
+static byte getChannel(API_PARSE *p)
 {
-  byte i;
+       byte i;
 
-  if(p){
-    for(i=2;i<(byte)p->length;i+=p->info[i]+2){
-      if(p->info[i]==2){
-        if(p->info[i-1]==ESC && p->info[i+1]==CHI) return (p->info[i+2]);
-      }
-    }
-  }
-  return 0;
+       if (p) {
+               for (i = 2; i < (byte)p->length; i += p->info[i] + 2) {
+                       if (p->info[i] == 2) {
+                               if (p->info[i - 1] == ESC && p->info[i + 1] == CHI) return (p->info[i + 2]);
+                       }
+               }
+       }
+       return 0;
 }
 
 
@@ -7400,26 +7400,26 @@ static byte getChannel(API_PARSE * p)
 /* put an information element in the parameter buffer               */
 /*------------------------------------------------------------------*/
 
-static void add_ie(PLCI   * plci, byte code, byte   * p, word p_length)
+static void add_ie(PLCI *plci, byte code, byte *p, word p_length)
 {
-  word i;
+       word i;
 
-  if(!(code &0x80) && !p_length) return;
+       if (!(code & 0x80) && !p_length) return;
 
-  if(plci->req_in==plci->req_in_start) {
-    plci->req_in +=2;
-  }
-  else {
-    plci->req_in--;
-  }
-  plci->RBuffer[plci->req_in++] = code;
+       if (plci->req_in == plci->req_in_start) {
+               plci->req_in += 2;
+       }
+       else {
+               plci->req_in--;
+       }
+       plci->RBuffer[plci->req_in++] = code;
 
-  if(p) {
-    plci->RBuffer[plci->req_in++] = (byte)p_length;
-    for(i=0;i<p_length;i++) plci->RBuffer[plci->req_in++] = p[1+i];
-  }
+       if (p) {
+               plci->RBuffer[plci->req_in++] = (byte)p_length;
+               for (i = 0; i < p_length; i++) plci->RBuffer[plci->req_in++] = p[1 + i];
+       }
 
-  plci->RBuffer[plci->req_in++] = 0;
+       plci->RBuffer[plci->req_in++] = 0;
 }
 
 /*------------------------------------------------------------------*/
@@ -7428,15 +7428,15 @@ static void add_ie(PLCI   * plci, byte code, byte   * p, word p_length)
 
 static void add_d(PLCI *plci, word length, byte *p)
 {
-  word i;
+       word i;
 
-  if(plci->req_in==plci->req_in_start) {
-    plci->req_in +=2;
-  }
-  else {
-    plci->req_in--;
-  }
-  for(i=0;i<length;i++) plci->RBuffer[plci->req_in++] = p[i];
+       if (plci->req_in == plci->req_in_start) {
+               plci->req_in += 2;
+       }
+       else {
+               plci->req_in--;
+       }
+       for (i = 0; i < length; i++) plci->RBuffer[plci->req_in++] = p[i];
 }
 
 /*------------------------------------------------------------------*/
@@ -7446,19 +7446,19 @@ static void add_d(PLCI *plci, word length, byte *p)
 
 static void add_ai(PLCI *plci, API_PARSE *ai)
 {
-  word i;
-    API_PARSE ai_parms[5];
+       word i;
+       API_PARSE ai_parms[5];
 
-  for(i=0;i<5;i++) ai_parms[i].length = 0;
+       for (i = 0; i < 5; i++) ai_parms[i].length = 0;
 
-  if(!ai->length)
-    return;
-  if(api_parse(&ai->info[1], (word)ai->length, "ssss", ai_parms))
-    return;
+       if (!ai->length)
+               return;
+       if (api_parse(&ai->info[1], (word)ai->length, "ssss", ai_parms))
+               return;
 
-  add_s (plci,KEY,&ai_parms[1]);
-  add_s (plci,UUI,&ai_parms[2]);
-  add_ss(plci,FTY,&ai_parms[3]);
+       add_s(plci, KEY, &ai_parms[1]);
+       add_s(plci, UUI, &ai_parms[2]);
+       add_ss(plci, FTY, &ai_parms[3]);
 }
 
 /*------------------------------------------------------------------*/
@@ -7468,462 +7468,462 @@ static void add_ai(PLCI *plci, API_PARSE *ai)
 static word add_b1(PLCI *plci, API_PARSE *bp, word b_channel_info,
                   word b1_facilities)
 {
-    API_PARSE bp_parms[8];
-    API_PARSE mdm_cfg[9];
-    API_PARSE global_config[2];
-    byte cai[256];
-  byte resource[] = {5,9,13,12,16,39,9,17,17,18};
-  byte voice_cai[] = "\x06\x14\x00\x00\x00\x00\x08";
-  word i;
-
-    API_PARSE mdm_cfg_v18[4];
-  word j, n, w;
-  dword d;
-
-
-  for(i=0;i<8;i++) bp_parms[i].length = 0;
-  for(i=0;i<2;i++) global_config[i].length = 0;
-
-  dbug(1,dprintf("add_b1"));
-  api_save_msg(bp, "s", &plci->B_protocol);
-
-  if(b_channel_info==2){
-    plci->B1_resource = 0;
-    adjust_b1_facilities (plci, plci->B1_resource, b1_facilities);
-    add_p(plci, CAI, "\x01\x00");
-    dbug(1,dprintf("Cai=1,0 (no resource)"));
-    return 0;
-  }
-
-  if(plci->tel == CODEC_PERMANENT) return 0;
-  else if(plci->tel == CODEC){
-    plci->B1_resource = 1;
-    adjust_b1_facilities (plci, plci->B1_resource, b1_facilities);
-    add_p(plci, CAI, "\x01\x01");
-    dbug(1,dprintf("Cai=1,1 (Codec)"));
-    return 0;
-  }
-  else if(plci->tel == ADV_VOICE){
-    plci->B1_resource = add_b1_facilities (plci, 9, (word)(b1_facilities | B1_FACILITY_VOICE));
-    adjust_b1_facilities (plci, plci->B1_resource, (word)(b1_facilities | B1_FACILITY_VOICE));
-    voice_cai[1] = plci->B1_resource;
-    PUT_WORD (&voice_cai[5], plci->appl->MaxDataLength);
-    add_p(plci, CAI, voice_cai);
-    dbug(1,dprintf("Cai=1,0x%x (AdvVoice)",voice_cai[1]));
-    return 0;
-  }
-  plci->call_dir &= ~(CALL_DIR_ORIGINATE | CALL_DIR_ANSWER);
-  if (plci->call_dir & CALL_DIR_OUT)
-    plci->call_dir |= CALL_DIR_ORIGINATE;
-  else if (plci->call_dir & CALL_DIR_IN)
-    plci->call_dir |= CALL_DIR_ANSWER;
-
-  if(!bp->length){
-    plci->B1_resource = 0x5;
-    adjust_b1_facilities (plci, plci->B1_resource, b1_facilities);
-    add_p(plci, CAI, "\x01\x05");
-    return 0;
-  }
-
-  dbug(1,dprintf("b_prot_len=%d",(word)bp->length));
-  if(bp->length>256) return _WRONG_MESSAGE_FORMAT;
-  if(api_parse(&bp->info[1], (word)bp->length, "wwwsssb", bp_parms))
-  {
-    bp_parms[6].length = 0;
-    if(api_parse(&bp->info[1], (word)bp->length, "wwwsss", bp_parms))
-    {
-      dbug(1,dprintf("b-form.!"));
-      return _WRONG_MESSAGE_FORMAT;
-    }
-  }
-  else if (api_parse(&bp->info[1], (word)bp->length, "wwwssss", bp_parms))
-  {
-    dbug(1,dprintf("b-form.!"));
-    return _WRONG_MESSAGE_FORMAT;
-  }
-
-  if(bp_parms[6].length)
-  {
-    if(api_parse(&bp_parms[6].info[1], (word)bp_parms[6].length, "w", global_config))
-    {
-      return _WRONG_MESSAGE_FORMAT;
-    }
-    switch(GET_WORD(global_config[0].info))
-    {
-    case 1:
-      plci->call_dir = (plci->call_dir & ~CALL_DIR_ANSWER) | CALL_DIR_ORIGINATE;
-      break;
-    case 2:
-      plci->call_dir = (plci->call_dir & ~CALL_DIR_ORIGINATE) | CALL_DIR_ANSWER;
-      break;
-    }
-  }
-  dbug(1,dprintf("call_dir=%04x", plci->call_dir));
-
-
-  if ((GET_WORD(bp_parms[0].info) == B1_RTP)
-   && (plci->adapter->man_profile.private_options & (1L << PRIVATE_RTP)))
-  {
-    plci->B1_resource = add_b1_facilities (plci, 31, (word)(b1_facilities & ~B1_FACILITY_VOICE));
-    adjust_b1_facilities (plci, plci->B1_resource, (word)(b1_facilities & ~B1_FACILITY_VOICE));
-    cai[1] = plci->B1_resource;
-    cai[2] = 0;
-    cai[3] = 0;
-    cai[4] = 0;
-    PUT_WORD(&cai[5],plci->appl->MaxDataLength);
-    for (i = 0; i < bp_parms[3].length; i++)
-      cai[7+i] = bp_parms[3].info[1+i];
-    cai[0] = 6 + bp_parms[3].length;
-    add_p(plci, CAI, cai);
-    return 0;
-  }
-
-
-  if ((GET_WORD(bp_parms[0].info) == B1_PIAFS)
-   && (plci->adapter->man_profile.private_options & (1L << PRIVATE_PIAFS)))
-  {
-    plci->B1_resource = add_b1_facilities (plci, 35/* PIAFS HARDWARE FACILITY */, (word)(b1_facilities & ~B1_FACILITY_VOICE));
-    adjust_b1_facilities (plci, plci->B1_resource, (word)(b1_facilities & ~B1_FACILITY_VOICE));
-    cai[1] = plci->B1_resource;
-    cai[2] = 0;
-    cai[3] = 0;
-    cai[4] = 0;
-    PUT_WORD(&cai[5],plci->appl->MaxDataLength);
-    cai[0] = 6;
-    add_p(plci, CAI, cai);
-    return 0;
-  }
-
-
-  if ((GET_WORD(bp_parms[0].info) >= 32)
-   || (!((1L << GET_WORD(bp_parms[0].info)) & plci->adapter->profile.B1_Protocols)
-    && ((GET_WORD(bp_parms[0].info) != 3)
-     || !((1L << B1_HDLC) & plci->adapter->profile.B1_Protocols)
-     || ((bp_parms[3].length != 0) && (GET_WORD(&bp_parms[3].info[1]) != 0) && (GET_WORD(&bp_parms[3].info[1]) != 56000)))))
-  {
-    return _B1_NOT_SUPPORTED;
-  }
-  plci->B1_resource = add_b1_facilities (plci, resource[GET_WORD(bp_parms[0].info)],
-    (word)(b1_facilities & ~B1_FACILITY_VOICE));
-  adjust_b1_facilities (plci, plci->B1_resource, (word)(b1_facilities & ~B1_FACILITY_VOICE));
-  cai[0] = 6;
-  cai[1] = plci->B1_resource;
-  for (i=2;i<sizeof(cai);i++) cai[i] = 0;
-
-  if ((GET_WORD(bp_parms[0].info) == B1_MODEM_ALL_NEGOTIATE)
-   || (GET_WORD(bp_parms[0].info) == B1_MODEM_ASYNC)
-   || (GET_WORD(bp_parms[0].info) == B1_MODEM_SYNC_HDLC))
-  { /* B1 - modem */
-    for (i=0;i<7;i++) mdm_cfg[i].length = 0;
-
-    if (bp_parms[3].length)
-    {
-      if(api_parse(&bp_parms[3].info[1],(word)bp_parms[3].length,"wwwwww", mdm_cfg))
-      {
-        return (_WRONG_MESSAGE_FORMAT);
-      }
-        
-      cai[2] = 0; /* Bit rate for adaptation */
-
-      dbug(1,dprintf("MDM Max Bit Rate:<%d>", GET_WORD(mdm_cfg[0].info)));
-
-      PUT_WORD (&cai[13], 0);                          /* Min Tx speed */
-      PUT_WORD (&cai[15], GET_WORD(mdm_cfg[0].info)); /* Max Tx speed */
-      PUT_WORD (&cai[17], 0);                          /* Min Rx speed */
-      PUT_WORD (&cai[19], GET_WORD(mdm_cfg[0].info)); /* Max Rx speed */
-
-      cai[3] = 0; /* Async framing parameters */
-      switch (GET_WORD (mdm_cfg[2].info))
-      {       /* Parity     */
-      case 1: /* odd parity */
-        cai[3] |= (DSP_CAI_ASYNC_PARITY_ENABLE | DSP_CAI_ASYNC_PARITY_ODD);
-        dbug(1,dprintf("MDM: odd parity"));
-        break;
-
-      case 2: /* even parity */
-        cai[3] |= (DSP_CAI_ASYNC_PARITY_ENABLE | DSP_CAI_ASYNC_PARITY_EVEN);
-        dbug(1,dprintf("MDM: even parity"));
-        break;
-
-      default:
-        dbug(1,dprintf("MDM: no parity"));
-        break;
-      }
-
-      switch (GET_WORD (mdm_cfg[3].info))
-      {       /* stop bits   */
-      case 1: /* 2 stop bits */
-        cai[3] |= DSP_CAI_ASYNC_TWO_STOP_BITS;
-        dbug(1,dprintf("MDM: 2 stop bits"));
-        break;
-
-      default:
-        dbug(1,dprintf("MDM: 1 stop bit"));
-        break;
-      }
-
-      switch (GET_WORD (mdm_cfg[1].info))
-      {     /* char length */
-      case 5:
-        cai[3] |= DSP_CAI_ASYNC_CHAR_LENGTH_5;
-        dbug(1,dprintf("MDM: 5 bits"));
-        break;
-
-      case 6:
-        cai[3] |= DSP_CAI_ASYNC_CHAR_LENGTH_6;
-        dbug(1,dprintf("MDM: 6 bits"));
-        break;
-
-      case 7:
-        cai[3] |= DSP_CAI_ASYNC_CHAR_LENGTH_7;
-        dbug(1,dprintf("MDM: 7 bits"));
-        break;
-
-      default:
-        dbug(1,dprintf("MDM: 8 bits"));
-        break;
-      }
-
-      cai[7] = 0; /* Line taking options */
-      cai[8] = 0; /* Modulation negotiation options */
-      cai[9] = 0; /* Modulation options */
-
-      if (((plci->call_dir & CALL_DIR_ORIGINATE) != 0) ^ ((plci->call_dir & CALL_DIR_OUT) != 0))
-      {
-        cai[9] |= DSP_CAI_MODEM_REVERSE_DIRECTION;
-        dbug(1, dprintf("MDM: Reverse direction"));
-      }
-
-      if (GET_WORD (mdm_cfg[4].info) & MDM_CAPI_DISABLE_RETRAIN)
-      {
-        cai[9] |= DSP_CAI_MODEM_DISABLE_RETRAIN;
-        dbug(1, dprintf("MDM: Disable retrain"));
-      }
-
-      if (GET_WORD (mdm_cfg[4].info) & MDM_CAPI_DISABLE_RING_TONE)
-      {
-        cai[7] |= DSP_CAI_MODEM_DISABLE_CALLING_TONE | DSP_CAI_MODEM_DISABLE_ANSWER_TONE;
-        dbug(1, dprintf("MDM: Disable ring tone"));
-      }
-
-      if (GET_WORD (mdm_cfg[4].info) & MDM_CAPI_GUARD_1800)
-      {
-        cai[8] |= DSP_CAI_MODEM_GUARD_TONE_1800HZ;
-        dbug(1, dprintf("MDM: 1800 guard tone"));
-      }
-      else if (GET_WORD (mdm_cfg[4].info) & MDM_CAPI_GUARD_550 )
-      {
-        cai[8] |= DSP_CAI_MODEM_GUARD_TONE_550HZ;
-        dbug(1, dprintf("MDM: 550 guard tone"));
-      }
-
-      if ((GET_WORD (mdm_cfg[5].info) & 0x00ff) == MDM_CAPI_NEG_V100)
-      {
-        cai[8] |= DSP_CAI_MODEM_NEGOTIATE_V100;
-        dbug(1, dprintf("MDM: V100"));
-      }
-      else if ((GET_WORD (mdm_cfg[5].info) & 0x00ff) == MDM_CAPI_NEG_MOD_CLASS)
-      {
-        cai[8] |= DSP_CAI_MODEM_NEGOTIATE_IN_CLASS;
-        dbug(1, dprintf("MDM: IN CLASS"));
-      }
-      else if ((GET_WORD (mdm_cfg[5].info) & 0x00ff) == MDM_CAPI_NEG_DISABLED)
-      {
-        cai[8] |= DSP_CAI_MODEM_NEGOTIATE_DISABLED;
-        dbug(1, dprintf("MDM: DISABLED"));
-      }
-      cai[0] = 20;
-
-      if ((plci->adapter->man_profile.private_options & (1L << PRIVATE_V18))
-       && (GET_WORD(mdm_cfg[5].info) & 0x8000)) /* Private V.18 enable */
-      {
-        plci->requested_options |= 1L << PRIVATE_V18;
-      }
-      if (GET_WORD(mdm_cfg[5].info) & 0x4000) /* Private VOWN enable */
-        plci->requested_options |= 1L << PRIVATE_VOWN;
-
-      if ((plci->requested_options_conn | plci->requested_options | plci->adapter->requested_options_table[plci->appl->Id-1])
-        & ((1L << PRIVATE_V18) | (1L << PRIVATE_VOWN)))
-      {
-        if (!api_parse(&bp_parms[3].info[1],(word)bp_parms[3].length,"wwwwwws", mdm_cfg))
-        {
-          i = 27;
-          if (mdm_cfg[6].length >= 4)
-          {
-            d = GET_DWORD(&mdm_cfg[6].info[1]);
-            cai[7] |= (byte) d;          /* line taking options */
-            cai[9] |= (byte)(d >> 8);    /* modulation options */
-            cai[++i] = (byte)(d >> 16);  /* vown modulation options */
-            cai[++i] = (byte)(d >> 24);
-            if (mdm_cfg[6].length >= 8)
-            {
-              d = GET_DWORD(&mdm_cfg[6].info[5]);
-              cai[10] |= (byte) d;        /* disabled modulations mask */
-              cai[11] |= (byte)(d >> 8);
-              if (mdm_cfg[6].length >= 12)
-              {
-                d = GET_DWORD(&mdm_cfg[6].info[9]);
-                cai[12] = (byte) d;          /* enabled modulations mask */
-                cai[++i] = (byte)(d >> 8);   /* vown enabled modulations */
-                cai[++i] = (byte)(d >> 16);
-                cai[++i] = (byte)(d >> 24);
-                cai[++i] = 0;
-                if (mdm_cfg[6].length >= 14)
-                {
-                  w = GET_WORD(&mdm_cfg[6].info[13]);
-                  if (w != 0)
-                    PUT_WORD(&cai[13], w);  /* min tx speed */
-                  if (mdm_cfg[6].length >= 16)
-                  {
-                    w = GET_WORD(&mdm_cfg[6].info[15]);
-                    if (w != 0)
-                      PUT_WORD(&cai[15], w);  /* max tx speed */
-                    if (mdm_cfg[6].length >= 18)
-                    {
-                      w = GET_WORD(&mdm_cfg[6].info[17]);
-                      if (w != 0)
-                        PUT_WORD(&cai[17], w);  /* min rx speed */
-                      if (mdm_cfg[6].length >= 20)
-                      {
-                        w = GET_WORD(&mdm_cfg[6].info[19]);
-                        if (w != 0)
-                          PUT_WORD(&cai[19], w);  /* max rx speed */
-                        if (mdm_cfg[6].length >= 22)
-                        {
-                          w = GET_WORD(&mdm_cfg[6].info[21]);
-                          cai[23] = (byte)(-((short) w));  /* transmit level */
-                          if (mdm_cfg[6].length >= 24)
-                          {
-                            w = GET_WORD(&mdm_cfg[6].info[23]);
-                            cai[22] |= (byte) w;        /* info options mask */
-                            cai[21] |= (byte)(w >> 8);  /* disabled symbol rates */
-                          }
-                        }
-                      }
-                    }
-                  }
-                }
-              }
-            }
-          }
-          cai[27] = i - 27;
-          i++;
-          if (!api_parse(&bp_parms[3].info[1],(word)bp_parms[3].length,"wwwwwwss", mdm_cfg))
-          {
-            if (!api_parse(&mdm_cfg[7].info[1],(word)mdm_cfg[7].length,"sss", mdm_cfg_v18))
-            {
-              for (n = 0; n < 3; n++)
-              {
-                cai[i] = (byte)(mdm_cfg_v18[n].length);
-                for (j = 1; j < ((word)(cai[i] + 1)); j++)
-                  cai[i+j] = mdm_cfg_v18[n].info[j];
-                i += cai[i] + 1;
-              }
-            }
-          }
-          cai[0] = (byte)(i - 1);
-        }
-      }
-
-    }
-  }
-  if(GET_WORD(bp_parms[0].info)==2 ||                         /* V.110 async */
-     GET_WORD(bp_parms[0].info)==3 )                          /* V.110 sync */
-  {
-    if(bp_parms[3].length){
-      dbug(1,dprintf("V.110,%d",GET_WORD(&bp_parms[3].info[1])));
-      switch(GET_WORD(&bp_parms[3].info[1])){                 /* Rate */
-        case 0:
-        case 56000:
-          if(GET_WORD(bp_parms[0].info)==3){                  /* V.110 sync 56k */
-            dbug(1,dprintf("56k sync HSCX"));
-            cai[1] = 8;
-            cai[2] = 0;
-            cai[3] = 0;
-          }
-          else if(GET_WORD(bp_parms[0].info)==2){
-            dbug(1,dprintf("56k async DSP"));
-            cai[2] = 9;
-          }
-          break;
-        case 50:     cai[2] = 1;  break;
-        case 75:     cai[2] = 1;  break;
-        case 110:    cai[2] = 1;  break;
-        case 150:    cai[2] = 1;  break;
-        case 200:    cai[2] = 1;  break;
-        case 300:    cai[2] = 1;  break;
-        case 600:    cai[2] = 1;  break;
-        case 1200:   cai[2] = 2;  break;
-        case 2400:   cai[2] = 3;  break;
-        case 4800:   cai[2] = 4;  break;
-        case 7200:   cai[2] = 10; break;
-        case 9600:   cai[2] = 5;  break;
-        case 12000:  cai[2] = 13; break;
-        case 24000:  cai[2] = 0;  break;
-        case 14400:  cai[2] = 11; break;
-        case 19200:  cai[2] = 6;  break;
-        case 28800:  cai[2] = 12; break;
-        case 38400:  cai[2] = 7;  break;
-        case 48000:  cai[2] = 8;  break;
-        case 76:     cai[2] = 15; break;  /* 75/1200     */
-        case 1201:   cai[2] = 14; break;  /* 1200/75     */
-        case 56001:  cai[2] = 9;  break;  /* V.110 56000 */
-
-        default:
-          return _B1_PARM_NOT_SUPPORTED;
-      }
-      cai[3] = 0;
-      if (cai[1] == 13)                                        /* v.110 async */
-      {
-        if (bp_parms[3].length >= 8)
-        {
-          switch (GET_WORD (&bp_parms[3].info[3]))
-          {       /* char length */
-          case 5:
-            cai[3] |= DSP_CAI_ASYNC_CHAR_LENGTH_5;
-            break;
-          case 6:
-            cai[3] |= DSP_CAI_ASYNC_CHAR_LENGTH_6;
-            break;
-          case 7:
-            cai[3] |= DSP_CAI_ASYNC_CHAR_LENGTH_7;
-            break;
-          }
-          switch (GET_WORD (&bp_parms[3].info[5]))
-          {       /* Parity     */
-          case 1: /* odd parity */
-            cai[3] |= (DSP_CAI_ASYNC_PARITY_ENABLE | DSP_CAI_ASYNC_PARITY_ODD);
-            break;
-          case 2: /* even parity */
-            cai[3] |= (DSP_CAI_ASYNC_PARITY_ENABLE | DSP_CAI_ASYNC_PARITY_EVEN);
-            break;
-          }
-          switch (GET_WORD (&bp_parms[3].info[7]))
-          {       /* stop bits   */
-          case 1: /* 2 stop bits */
-            cai[3] |= DSP_CAI_ASYNC_TWO_STOP_BITS;
-            break;
-          }
-        }
-      }
-    }
-    else if(cai[1]==8 || GET_WORD(bp_parms[0].info)==3 ){
-      dbug(1,dprintf("V.110 default 56k sync"));
-      cai[1] = 8;
-      cai[2] = 0;
-      cai[3] = 0;
-    }
-    else {
-      dbug(1,dprintf("V.110 default 9600 async"));
-      cai[2] = 5;
-    }
-  }
-  PUT_WORD(&cai[5],plci->appl->MaxDataLength);
-  dbug(1,dprintf("CAI[%d]=%x,%x,%x,%x,%x,%x", cai[0], cai[1], cai[2], cai[3], cai[4], cai[5], cai[6]));
+       API_PARSE bp_parms[8];
+       API_PARSE mdm_cfg[9];
+       API_PARSE global_config[2];
+       byte cai[256];
+       byte resource[] = {5, 9, 13, 12, 16, 39, 9, 17, 17, 18};
+       byte voice_cai[] = "\x06\x14\x00\x00\x00\x00\x08";
+       word i;
+
+       API_PARSE mdm_cfg_v18[4];
+       word j, n, w;
+       dword d;
+
+
+       for (i = 0; i < 8; i++) bp_parms[i].length = 0;
+       for (i = 0; i < 2; i++) global_config[i].length = 0;
+
+       dbug(1, dprintf("add_b1"));
+       api_save_msg(bp, "s", &plci->B_protocol);
+
+       if (b_channel_info == 2) {
+               plci->B1_resource = 0;
+               adjust_b1_facilities(plci, plci->B1_resource, b1_facilities);
+               add_p(plci, CAI, "\x01\x00");
+               dbug(1, dprintf("Cai=1,0 (no resource)"));
+               return 0;
+       }
+
+       if (plci->tel == CODEC_PERMANENT) return 0;
+       else if (plci->tel == CODEC) {
+               plci->B1_resource = 1;
+               adjust_b1_facilities(plci, plci->B1_resource, b1_facilities);
+               add_p(plci, CAI, "\x01\x01");
+               dbug(1, dprintf("Cai=1,1 (Codec)"));
+               return 0;
+       }
+       else if (plci->tel == ADV_VOICE) {
+               plci->B1_resource = add_b1_facilities(plci, 9, (word)(b1_facilities | B1_FACILITY_VOICE));
+               adjust_b1_facilities(plci, plci->B1_resource, (word)(b1_facilities | B1_FACILITY_VOICE));
+               voice_cai[1] = plci->B1_resource;
+               PUT_WORD(&voice_cai[5], plci->appl->MaxDataLength);
+               add_p(plci, CAI, voice_cai);
+               dbug(1, dprintf("Cai=1,0x%x (AdvVoice)", voice_cai[1]));
+               return 0;
+       }
+       plci->call_dir &= ~(CALL_DIR_ORIGINATE | CALL_DIR_ANSWER);
+       if (plci->call_dir & CALL_DIR_OUT)
+               plci->call_dir |= CALL_DIR_ORIGINATE;
+       else if (plci->call_dir & CALL_DIR_IN)
+               plci->call_dir |= CALL_DIR_ANSWER;
+
+       if (!bp->length) {
+               plci->B1_resource = 0x5;
+               adjust_b1_facilities(plci, plci->B1_resource, b1_facilities);
+               add_p(plci, CAI, "\x01\x05");
+               return 0;
+       }
+
+       dbug(1, dprintf("b_prot_len=%d", (word)bp->length));
+       if (bp->length > 256) return _WRONG_MESSAGE_FORMAT;
+       if (api_parse(&bp->info[1], (word)bp->length, "wwwsssb", bp_parms))
+       {
+               bp_parms[6].length = 0;
+               if (api_parse(&bp->info[1], (word)bp->length, "wwwsss", bp_parms))
+               {
+                       dbug(1, dprintf("b-form.!"));
+                       return _WRONG_MESSAGE_FORMAT;
+               }
+       }
+       else if (api_parse(&bp->info[1], (word)bp->length, "wwwssss", bp_parms))
+       {
+               dbug(1, dprintf("b-form.!"));
+               return _WRONG_MESSAGE_FORMAT;
+       }
+
+       if (bp_parms[6].length)
+       {
+               if (api_parse(&bp_parms[6].info[1], (word)bp_parms[6].length, "w", global_config))
+               {
+                       return _WRONG_MESSAGE_FORMAT;
+               }
+               switch (GET_WORD(global_config[0].info))
+               {
+               case 1:
+                       plci->call_dir = (plci->call_dir & ~CALL_DIR_ANSWER) | CALL_DIR_ORIGINATE;
+                       break;
+               case 2:
+                       plci->call_dir = (plci->call_dir & ~CALL_DIR_ORIGINATE) | CALL_DIR_ANSWER;
+                       break;
+               }
+       }
+       dbug(1, dprintf("call_dir=%04x", plci->call_dir));
+
+
+       if ((GET_WORD(bp_parms[0].info) == B1_RTP)
+           && (plci->adapter->man_profile.private_options & (1L << PRIVATE_RTP)))
+       {
+               plci->B1_resource = add_b1_facilities(plci, 31, (word)(b1_facilities & ~B1_FACILITY_VOICE));
+               adjust_b1_facilities(plci, plci->B1_resource, (word)(b1_facilities & ~B1_FACILITY_VOICE));
+               cai[1] = plci->B1_resource;
+               cai[2] = 0;
+               cai[3] = 0;
+               cai[4] = 0;
+               PUT_WORD(&cai[5], plci->appl->MaxDataLength);
+               for (i = 0; i < bp_parms[3].length; i++)
+                       cai[7 + i] = bp_parms[3].info[1 + i];
+               cai[0] = 6 + bp_parms[3].length;
+               add_p(plci, CAI, cai);
+               return 0;
+       }
+
+
+       if ((GET_WORD(bp_parms[0].info) == B1_PIAFS)
+           && (plci->adapter->man_profile.private_options & (1L << PRIVATE_PIAFS)))
+       {
+               plci->B1_resource = add_b1_facilities(plci, 35/* PIAFS HARDWARE FACILITY */, (word)(b1_facilities & ~B1_FACILITY_VOICE));
+               adjust_b1_facilities(plci, plci->B1_resource, (word)(b1_facilities & ~B1_FACILITY_VOICE));
+               cai[1] = plci->B1_resource;
+               cai[2] = 0;
+               cai[3] = 0;
+               cai[4] = 0;
+               PUT_WORD(&cai[5], plci->appl->MaxDataLength);
+               cai[0] = 6;
+               add_p(plci, CAI, cai);
+               return 0;
+       }
+
+
+       if ((GET_WORD(bp_parms[0].info) >= 32)
+           || (!((1L << GET_WORD(bp_parms[0].info)) & plci->adapter->profile.B1_Protocols)
+               && ((GET_WORD(bp_parms[0].info) != 3)
+                   || !((1L << B1_HDLC) & plci->adapter->profile.B1_Protocols)
+                   || ((bp_parms[3].length != 0) && (GET_WORD(&bp_parms[3].info[1]) != 0) && (GET_WORD(&bp_parms[3].info[1]) != 56000)))))
+       {
+               return _B1_NOT_SUPPORTED;
+       }
+       plci->B1_resource = add_b1_facilities(plci, resource[GET_WORD(bp_parms[0].info)],
+                                             (word)(b1_facilities & ~B1_FACILITY_VOICE));
+       adjust_b1_facilities(plci, plci->B1_resource, (word)(b1_facilities & ~B1_FACILITY_VOICE));
+       cai[0] = 6;
+       cai[1] = plci->B1_resource;
+       for (i = 2; i < sizeof(cai); i++) cai[i] = 0;
+
+       if ((GET_WORD(bp_parms[0].info) == B1_MODEM_ALL_NEGOTIATE)
+           || (GET_WORD(bp_parms[0].info) == B1_MODEM_ASYNC)
+           || (GET_WORD(bp_parms[0].info) == B1_MODEM_SYNC_HDLC))
+       { /* B1 - modem */
+               for (i = 0; i < 7; i++) mdm_cfg[i].length = 0;
+
+               if (bp_parms[3].length)
+               {
+                       if (api_parse(&bp_parms[3].info[1], (word)bp_parms[3].length, "wwwwww", mdm_cfg))
+                       {
+                               return (_WRONG_MESSAGE_FORMAT);
+                       }
+
+                       cai[2] = 0; /* Bit rate for adaptation */
+
+                       dbug(1, dprintf("MDM Max Bit Rate:<%d>", GET_WORD(mdm_cfg[0].info)));
+
+                       PUT_WORD(&cai[13], 0);                          /* Min Tx speed */
+                       PUT_WORD(&cai[15], GET_WORD(mdm_cfg[0].info)); /* Max Tx speed */
+                       PUT_WORD(&cai[17], 0);                          /* Min Rx speed */
+                       PUT_WORD(&cai[19], GET_WORD(mdm_cfg[0].info)); /* Max Rx speed */
+
+                       cai[3] = 0; /* Async framing parameters */
+                       switch (GET_WORD(mdm_cfg[2].info))
+                       {       /* Parity     */
+                       case 1: /* odd parity */
+                               cai[3] |= (DSP_CAI_ASYNC_PARITY_ENABLE | DSP_CAI_ASYNC_PARITY_ODD);
+                               dbug(1, dprintf("MDM: odd parity"));
+                               break;
+
+                       case 2: /* even parity */
+                               cai[3] |= (DSP_CAI_ASYNC_PARITY_ENABLE | DSP_CAI_ASYNC_PARITY_EVEN);
+                               dbug(1, dprintf("MDM: even parity"));
+                               break;
+
+                       default:
+                               dbug(1, dprintf("MDM: no parity"));
+                               break;
+                       }
+
+                       switch (GET_WORD(mdm_cfg[3].info))
+                       {       /* stop bits   */
+                       case 1: /* 2 stop bits */
+                               cai[3] |= DSP_CAI_ASYNC_TWO_STOP_BITS;
+                               dbug(1, dprintf("MDM: 2 stop bits"));
+                               break;
+
+                       default:
+                               dbug(1, dprintf("MDM: 1 stop bit"));
+                               break;
+                       }
+
+                       switch (GET_WORD(mdm_cfg[1].info))
+                       {     /* char length */
+                       case 5:
+                               cai[3] |= DSP_CAI_ASYNC_CHAR_LENGTH_5;
+                               dbug(1, dprintf("MDM: 5 bits"));
+                               break;
+
+                       case 6:
+                               cai[3] |= DSP_CAI_ASYNC_CHAR_LENGTH_6;
+                               dbug(1, dprintf("MDM: 6 bits"));
+                               break;
+
+                       case 7:
+                               cai[3] |= DSP_CAI_ASYNC_CHAR_LENGTH_7;
+                               dbug(1, dprintf("MDM: 7 bits"));
+                               break;
+
+                       default:
+                               dbug(1, dprintf("MDM: 8 bits"));
+                               break;
+                       }
+
+                       cai[7] = 0; /* Line taking options */
+                       cai[8] = 0; /* Modulation negotiation options */
+                       cai[9] = 0; /* Modulation options */
+
+                       if (((plci->call_dir & CALL_DIR_ORIGINATE) != 0) ^ ((plci->call_dir & CALL_DIR_OUT) != 0))
+                       {
+                               cai[9] |= DSP_CAI_MODEM_REVERSE_DIRECTION;
+                               dbug(1, dprintf("MDM: Reverse direction"));
+                       }
+
+                       if (GET_WORD(mdm_cfg[4].info) & MDM_CAPI_DISABLE_RETRAIN)
+                       {
+                               cai[9] |= DSP_CAI_MODEM_DISABLE_RETRAIN;
+                               dbug(1, dprintf("MDM: Disable retrain"));
+                       }
+
+                       if (GET_WORD(mdm_cfg[4].info) & MDM_CAPI_DISABLE_RING_TONE)
+                       {
+                               cai[7] |= DSP_CAI_MODEM_DISABLE_CALLING_TONE | DSP_CAI_MODEM_DISABLE_ANSWER_TONE;
+                               dbug(1, dprintf("MDM: Disable ring tone"));
+                       }
+
+                       if (GET_WORD(mdm_cfg[4].info) & MDM_CAPI_GUARD_1800)
+                       {
+                               cai[8] |= DSP_CAI_MODEM_GUARD_TONE_1800HZ;
+                               dbug(1, dprintf("MDM: 1800 guard tone"));
+                       }
+                       else if (GET_WORD(mdm_cfg[4].info) & MDM_CAPI_GUARD_550)
+                       {
+                               cai[8] |= DSP_CAI_MODEM_GUARD_TONE_550HZ;
+                               dbug(1, dprintf("MDM: 550 guard tone"));
+                       }
+
+                       if ((GET_WORD(mdm_cfg[5].info) & 0x00ff) == MDM_CAPI_NEG_V100)
+                       {
+                               cai[8] |= DSP_CAI_MODEM_NEGOTIATE_V100;
+                               dbug(1, dprintf("MDM: V100"));
+                       }
+                       else if ((GET_WORD(mdm_cfg[5].info) & 0x00ff) == MDM_CAPI_NEG_MOD_CLASS)
+                       {
+                               cai[8] |= DSP_CAI_MODEM_NEGOTIATE_IN_CLASS;
+                               dbug(1, dprintf("MDM: IN CLASS"));
+                       }
+                       else if ((GET_WORD(mdm_cfg[5].info) & 0x00ff) == MDM_CAPI_NEG_DISABLED)
+                       {
+                               cai[8] |= DSP_CAI_MODEM_NEGOTIATE_DISABLED;
+                               dbug(1, dprintf("MDM: DISABLED"));
+                       }
+                       cai[0] = 20;
+
+                       if ((plci->adapter->man_profile.private_options & (1L << PRIVATE_V18))
+                           && (GET_WORD(mdm_cfg[5].info) & 0x8000)) /* Private V.18 enable */
+                       {
+                               plci->requested_options |= 1L << PRIVATE_V18;
+                       }
+                       if (GET_WORD(mdm_cfg[5].info) & 0x4000) /* Private VOWN enable */
+                               plci->requested_options |= 1L << PRIVATE_VOWN;
+
+                       if ((plci->requested_options_conn | plci->requested_options | plci->adapter->requested_options_table[plci->appl->Id - 1])
+                           & ((1L << PRIVATE_V18) | (1L << PRIVATE_VOWN)))
+                       {
+                               if (!api_parse(&bp_parms[3].info[1], (word)bp_parms[3].length, "wwwwwws", mdm_cfg))
+                               {
+                                       i = 27;
+                                       if (mdm_cfg[6].length >= 4)
+                                       {
+                                               d = GET_DWORD(&mdm_cfg[6].info[1]);
+                                               cai[7] |= (byte) d;          /* line taking options */
+                                               cai[9] |= (byte)(d >> 8);    /* modulation options */
+                                               cai[++i] = (byte)(d >> 16);  /* vown modulation options */
+                                               cai[++i] = (byte)(d >> 24);
+                                               if (mdm_cfg[6].length >= 8)
+                                               {
+                                                       d = GET_DWORD(&mdm_cfg[6].info[5]);
+                                                       cai[10] |= (byte) d;        /* disabled modulations mask */
+                                                       cai[11] |= (byte)(d >> 8);
+                                                       if (mdm_cfg[6].length >= 12)
+                                                       {
+                                                               d = GET_DWORD(&mdm_cfg[6].info[9]);
+                                                               cai[12] = (byte) d;          /* enabled modulations mask */
+                                                               cai[++i] = (byte)(d >> 8);   /* vown enabled modulations */
+                                                               cai[++i] = (byte)(d >> 16);
+                                                               cai[++i] = (byte)(d >> 24);
+                                                               cai[++i] = 0;
+                                                               if (mdm_cfg[6].length >= 14)
+                                                               {
+                                                                       w = GET_WORD(&mdm_cfg[6].info[13]);
+                                                                       if (w != 0)
+                                                                               PUT_WORD(&cai[13], w);  /* min tx speed */
+                                                                       if (mdm_cfg[6].length >= 16)
+                                                                       {
+                                                                               w = GET_WORD(&mdm_cfg[6].info[15]);
+                                                                               if (w != 0)
+                                                                                       PUT_WORD(&cai[15], w);  /* max tx speed */
+                                                                               if (mdm_cfg[6].length >= 18)
+                                                                               {
+                                                                                       w = GET_WORD(&mdm_cfg[6].info[17]);
+                                                                                       if (w != 0)
+                                                                                               PUT_WORD(&cai[17], w);  /* min rx speed */
+                                                                                       if (mdm_cfg[6].length >= 20)
+                                                                                       {
+                                                                                               w = GET_WORD(&mdm_cfg[6].info[19]);
+                                                                                               if (w != 0)
+                                                                                                       PUT_WORD(&cai[19], w);  /* max rx speed */
+                                                                                               if (mdm_cfg[6].length >= 22)
+                                                                                               {
+                                                                                                       w = GET_WORD(&mdm_cfg[6].info[21]);
+                                                                                                       cai[23] = (byte)(-((short) w));  /* transmit level */
+                                                                                                       if (mdm_cfg[6].length >= 24)
+                                                                                                       {
+                                                                                                               w = GET_WORD(&mdm_cfg[6].info[23]);
+                                                                                                               cai[22] |= (byte) w;        /* info options mask */
+                                                                                                               cai[21] |= (byte)(w >> 8);  /* disabled symbol rates */
+                                                                                                       }
+                                                                                               }
+                                                                                       }
+                                                                               }
+                                                                       }
+                                                               }
+                                                       }
+                                               }
+                                       }
+                                       cai[27] = i - 27;
+                                       i++;
+                                       if (!api_parse(&bp_parms[3].info[1], (word)bp_parms[3].length, "wwwwwwss", mdm_cfg))
+                                       {
+                                               if (!api_parse(&mdm_cfg[7].info[1], (word)mdm_cfg[7].length, "sss", mdm_cfg_v18))
+                                               {
+                                                       for (n = 0; n < 3; n++)
+                                                       {
+                                                               cai[i] = (byte)(mdm_cfg_v18[n].length);
+                                                               for (j = 1; j < ((word)(cai[i] + 1)); j++)
+                                                                       cai[i + j] = mdm_cfg_v18[n].info[j];
+                                                               i += cai[i] + 1;
+                                                       }
+                                               }
+                                       }
+                                       cai[0] = (byte)(i - 1);
+                               }
+                       }
+
+               }
+       }
+       if (GET_WORD(bp_parms[0].info) == 2 ||                         /* V.110 async */
+           GET_WORD(bp_parms[0].info) == 3)                           /* V.110 sync */
+       {
+               if (bp_parms[3].length) {
+                       dbug(1, dprintf("V.110,%d", GET_WORD(&bp_parms[3].info[1])));
+                       switch (GET_WORD(&bp_parms[3].info[1])) {                 /* Rate */
+                       case 0:
+                       case 56000:
+                               if (GET_WORD(bp_parms[0].info) == 3) {                  /* V.110 sync 56k */
+                                       dbug(1, dprintf("56k sync HSCX"));
+                                       cai[1] = 8;
+                                       cai[2] = 0;
+                                       cai[3] = 0;
+                               }
+                               else if (GET_WORD(bp_parms[0].info) == 2) {
+                                       dbug(1, dprintf("56k async DSP"));
+                                       cai[2] = 9;
+                               }
+                               break;
+                       case 50:     cai[2] = 1;  break;
+                       case 75:     cai[2] = 1;  break;
+                       case 110:    cai[2] = 1;  break;
+                       case 150:    cai[2] = 1;  break;
+                       case 200:    cai[2] = 1;  break;
+                       case 300:    cai[2] = 1;  break;
+                       case 600:    cai[2] = 1;  break;
+                       case 1200:   cai[2] = 2;  break;
+                       case 2400:   cai[2] = 3;  break;
+                       case 4800:   cai[2] = 4;  break;
+                       case 7200:   cai[2] = 10; break;
+                       case 9600:   cai[2] = 5;  break;
+                       case 12000:  cai[2] = 13; break;
+                       case 24000:  cai[2] = 0;  break;
+                       case 14400:  cai[2] = 11; break;
+                       case 19200:  cai[2] = 6;  break;
+                       case 28800:  cai[2] = 12; break;
+                       case 38400:  cai[2] = 7;  break;
+                       case 48000:  cai[2] = 8;  break;
+                       case 76:     cai[2] = 15; break;  /* 75/1200     */
+                       case 1201:   cai[2] = 14; break;  /* 1200/75     */
+                       case 56001:  cai[2] = 9;  break;  /* V.110 56000 */
+
+                       default:
+                               return _B1_PARM_NOT_SUPPORTED;
+                       }
+                       cai[3] = 0;
+                       if (cai[1] == 13)                                        /* v.110 async */
+                       {
+                               if (bp_parms[3].length >= 8)
+                               {
+                                       switch (GET_WORD(&bp_parms[3].info[3]))
+                                       {       /* char length */
+                                       case 5:
+                                               cai[3] |= DSP_CAI_ASYNC_CHAR_LENGTH_5;
+                                               break;
+                                       case 6:
+                                               cai[3] |= DSP_CAI_ASYNC_CHAR_LENGTH_6;
+                                               break;
+                                       case 7:
+                                               cai[3] |= DSP_CAI_ASYNC_CHAR_LENGTH_7;
+                                               break;
+                                       }
+                                       switch (GET_WORD(&bp_parms[3].info[5]))
+                                       {       /* Parity     */
+                                       case 1: /* odd parity */
+                                               cai[3] |= (DSP_CAI_ASYNC_PARITY_ENABLE | DSP_CAI_ASYNC_PARITY_ODD);
+                                               break;
+                                       case 2: /* even parity */
+                                               cai[3] |= (DSP_CAI_ASYNC_PARITY_ENABLE | DSP_CAI_ASYNC_PARITY_EVEN);
+                                               break;
+                                       }
+                                       switch (GET_WORD(&bp_parms[3].info[7]))
+                                       {       /* stop bits   */
+                                       case 1: /* 2 stop bits */
+                                               cai[3] |= DSP_CAI_ASYNC_TWO_STOP_BITS;
+                                               break;
+                                       }
+                               }
+                       }
+               }
+               else if (cai[1] == 8 || GET_WORD(bp_parms[0].info) == 3) {
+                       dbug(1, dprintf("V.110 default 56k sync"));
+                       cai[1] = 8;
+                       cai[2] = 0;
+                       cai[3] = 0;
+               }
+               else {
+                       dbug(1, dprintf("V.110 default 9600 async"));
+                       cai[2] = 5;
+               }
+       }
+       PUT_WORD(&cai[5], plci->appl->MaxDataLength);
+       dbug(1, dprintf("CAI[%d]=%x,%x,%x,%x,%x,%x", cai[0], cai[1], cai[2], cai[3], cai[4], cai[5], cai[6]));
 /* HexDump ("CAI", sizeof(cai), &cai[0]); */
 
-  add_p(plci, CAI, cai);
-  return 0;
+       add_p(plci, CAI, cai);
+       return 0;
 }
 
 /*------------------------------------------------------------------*/
@@ -7932,624 +7932,624 @@ static word add_b1(PLCI *plci, API_PARSE *bp, word b_channel_info,
 
 static word add_b23(PLCI *plci, API_PARSE *bp)
 {
-  word i, fax_control_bits;
-  byte pos, len;
-  byte SAPI = 0x40;  /* default SAPI 16 for x.31 */
-    API_PARSE bp_parms[8];
-  API_PARSE * b1_config;
-  API_PARSE * b2_config;
-    API_PARSE b2_config_parms[8];
-  API_PARSE * b3_config;
-    API_PARSE b3_config_parms[6];
-    API_PARSE global_config[2];
-
-  static byte llc[3] = {2,0,0};
-  static byte dlc[20] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
-  static byte nlc[256];
-  static byte lli[12] = {1,1};
-
-  const byte llc2_out[] = {1,2,4,6,2,0,0,0, X75_V42BIS,V120_L2,V120_V42BIS,V120_L2,6};
-  const byte llc2_in[]  = {1,3,4,6,3,0,0,0, X75_V42BIS,V120_L2,V120_V42BIS,V120_L2,6};
-
-  const byte llc3[] = {4,3,2,2,6,6,0};
-  const byte header[] = {0,2,3,3,0,0,0};
-
-  for(i=0;i<8;i++) bp_parms[i].length = 0;
-  for(i=0;i<6;i++) b2_config_parms[i].length = 0;
-  for(i=0;i<5;i++) b3_config_parms[i].length = 0;
-
-  lli[0] = 1;
-  lli[1] = 1;
-  if (plci->adapter->manufacturer_features & MANUFACTURER_FEATURE_XONOFF_FLOW_CONTROL)
-    lli[1] |= 2;
-  if (plci->adapter->manufacturer_features & MANUFACTURER_FEATURE_OOB_CHANNEL)
-    lli[1] |= 4;
-
-  if ((lli[1] & 0x02) && (diva_xdi_extended_features & DIVA_CAPI_USE_CMA)) {
-    lli[1] |= 0x10;
-    if (plci->rx_dma_descriptor <= 0) {
-      plci->rx_dma_descriptor=diva_get_dma_descriptor(plci,&plci->rx_dma_magic);
-      if (plci->rx_dma_descriptor >= 0)
-        plci->rx_dma_descriptor++;
-    }
-    if (plci->rx_dma_descriptor > 0) {
-      lli[0] = 6;
-      lli[1] |= 0x40;
-      lli[2] = (byte)(plci->rx_dma_descriptor - 1);
-      lli[3] = (byte)plci->rx_dma_magic;
-      lli[4] = (byte)(plci->rx_dma_magic >>  8);
-      lli[5] = (byte)(plci->rx_dma_magic >> 16);
-      lli[6] = (byte)(plci->rx_dma_magic >> 24);
-    }
-  }
-
-  if (DIVA_CAPI_SUPPORTS_NO_CANCEL(plci->adapter)) {
-    lli[1] |= 0x20;
-  }
-
-  dbug(1,dprintf("add_b23"));
-  api_save_msg(bp, "s", &plci->B_protocol);
-
-  if(!bp->length && plci->tel)
-  {
-    plci->adv_nl = true;
-    dbug(1,dprintf("Default adv.Nl"));
-    add_p(plci,LLI,lli);
-    plci->B2_prot = 1 /*XPARENT*/;
-    plci->B3_prot = 0 /*XPARENT*/;
-    llc[1] = 2;
-    llc[2] = 4;
-    add_p(plci, LLC, llc);
-    dlc[0] = 2;
-    PUT_WORD(&dlc[1],plci->appl->MaxDataLength);
-    add_p(plci, DLC, dlc);
-    return 0;
-  }
-
-  if(!bp->length) /*default*/
-  {   
-    dbug(1,dprintf("ret default"));
-    add_p(plci,LLI,lli);
-    plci->B2_prot = 0 /*X.75   */;
-    plci->B3_prot = 0 /*XPARENT*/;
-    llc[1] = 1;
-    llc[2] = 4;
-    add_p(plci, LLC, llc);
-    dlc[0] = 2;
-    PUT_WORD(&dlc[1],plci->appl->MaxDataLength);
-    add_p(plci, DLC, dlc);
-    return 0;
-  }
-  dbug(1,dprintf("b_prot_len=%d",(word)bp->length));
-  if((word)bp->length > 256)    return _WRONG_MESSAGE_FORMAT;
-
-  if(api_parse(&bp->info[1], (word)bp->length, "wwwsssb", bp_parms))
-  {
-    bp_parms[6].length = 0;
-    if(api_parse(&bp->info[1], (word)bp->length, "wwwsss", bp_parms))
-    {
-      dbug(1,dprintf("b-form.!"));
-      return _WRONG_MESSAGE_FORMAT;
-    }
-  }
-  else if (api_parse(&bp->info[1], (word)bp->length, "wwwssss", bp_parms))
-  {
-    dbug(1,dprintf("b-form.!"));
-    return _WRONG_MESSAGE_FORMAT;
-  }
-
-  if(plci->tel==ADV_VOICE) /* transparent B on advanced voice */
-  {  
-    if(GET_WORD(bp_parms[1].info)!=1
-    || GET_WORD(bp_parms[2].info)!=0) return _B2_NOT_SUPPORTED;
-    plci->adv_nl = true;
-  }
-  else if(plci->tel) return _B2_NOT_SUPPORTED;
-
-
-  if ((GET_WORD(bp_parms[1].info) == B2_RTP)
-   && (GET_WORD(bp_parms[2].info) == B3_RTP)
-   && (plci->adapter->man_profile.private_options & (1L << PRIVATE_RTP)))
-  {
-    add_p(plci,LLI,lli);
-    plci->B2_prot = (byte) GET_WORD(bp_parms[1].info);
-    plci->B3_prot = (byte) GET_WORD(bp_parms[2].info);
-    llc[1] = (plci->call_dir & (CALL_DIR_ORIGINATE | CALL_DIR_FORCE_OUTG_NL)) ? 14 : 13;
-    llc[2] = 4;
-    add_p(plci, LLC, llc);
-    dlc[0] = 2;
-    PUT_WORD(&dlc[1],plci->appl->MaxDataLength);
-    dlc[3] = 3; /* Addr A */
-    dlc[4] = 1; /* Addr B */
-    dlc[5] = 7; /* modulo mode */
-    dlc[6] = 7; /* window size */
-    dlc[7] = 0; /* XID len Lo  */
-    dlc[8] = 0; /* XID len Hi  */
-    for (i = 0; i < bp_parms[4].length; i++)
-      dlc[9+i] = bp_parms[4].info[1+i];
-    dlc[0] = (byte)(8 + bp_parms[4].length);
-    add_p(plci, DLC, dlc);
-    for (i = 0; i < bp_parms[5].length; i++)
-      nlc[1+i] = bp_parms[5].info[1+i];
-    nlc[0] = (byte)(bp_parms[5].length);
-    add_p(plci, NLC, nlc);
-    return 0;
-  }
-
-
-
-  if ((GET_WORD(bp_parms[1].info) >= 32)
-   || (!((1L << GET_WORD(bp_parms[1].info)) & plci->adapter->profile.B2_Protocols)
-    && ((GET_WORD(bp_parms[1].info) != B2_PIAFS)
-     || !(plci->adapter->man_profile.private_options & (1L << PRIVATE_PIAFS)))))
-
-  {
-    return _B2_NOT_SUPPORTED;
-  }
-  if ((GET_WORD(bp_parms[2].info) >= 32)
-   || !((1L << GET_WORD(bp_parms[2].info)) & plci->adapter->profile.B3_Protocols))
-  {
-    return _B3_NOT_SUPPORTED;
-  }
-  if ((GET_WORD(bp_parms[1].info) != B2_SDLC)
-   && ((GET_WORD(bp_parms[0].info) == B1_MODEM_ALL_NEGOTIATE)
-    || (GET_WORD(bp_parms[0].info) == B1_MODEM_ASYNC)
-    || (GET_WORD(bp_parms[0].info) == B1_MODEM_SYNC_HDLC)))
-  {
-    return (add_modem_b23 (plci, bp_parms));
-  }
-
-  add_p(plci,LLI,lli);
-
-  plci->B2_prot = (byte) GET_WORD(bp_parms[1].info);
-  plci->B3_prot = (byte) GET_WORD(bp_parms[2].info);
-  if(plci->B2_prot==12) SAPI = 0; /* default SAPI D-channel */
-
-  if(bp_parms[6].length)
-  {
-    if(api_parse(&bp_parms[6].info[1], (word)bp_parms[6].length, "w", global_config))
-    {
-      return _WRONG_MESSAGE_FORMAT;
-    }
-    switch(GET_WORD(global_config[0].info))
-    {
-    case 1:
-      plci->call_dir = (plci->call_dir & ~CALL_DIR_ANSWER) | CALL_DIR_ORIGINATE;
-      break;
-    case 2:
-      plci->call_dir = (plci->call_dir & ~CALL_DIR_ORIGINATE) | CALL_DIR_ANSWER;
-      break;
-    }
-  }
-  dbug(1,dprintf("call_dir=%04x", plci->call_dir));
-
-
-  if (plci->B2_prot == B2_PIAFS)
-    llc[1] = PIAFS_CRC;
-  else
+       word i, fax_control_bits;
+       byte pos, len;
+       byte SAPI = 0x40;  /* default SAPI 16 for x.31 */
+       API_PARSE bp_parms[8];
+       API_PARSE *b1_config;
+       API_PARSE *b2_config;
+       API_PARSE b2_config_parms[8];
+       API_PARSE *b3_config;
+       API_PARSE b3_config_parms[6];
+       API_PARSE global_config[2];
+
+       static byte llc[3] = {2,0,0};
+       static byte dlc[20] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
+       static byte nlc[256];
+       static byte lli[12] = {1,1};
+
+       const byte llc2_out[] = {1,2,4,6,2,0,0,0, X75_V42BIS,V120_L2,V120_V42BIS,V120_L2,6};
+       const byte llc2_in[]  = {1,3,4,6,3,0,0,0, X75_V42BIS,V120_L2,V120_V42BIS,V120_L2,6};
+
+       const byte llc3[] = {4,3,2,2,6,6,0};
+       const byte header[] = {0,2,3,3,0,0,0};
+
+       for (i = 0; i < 8; i++) bp_parms[i].length = 0;
+       for (i = 0; i < 6; i++) b2_config_parms[i].length = 0;
+       for (i = 0; i < 5; i++) b3_config_parms[i].length = 0;
+
+       lli[0] = 1;
+       lli[1] = 1;
+       if (plci->adapter->manufacturer_features & MANUFACTURER_FEATURE_XONOFF_FLOW_CONTROL)
+               lli[1] |= 2;
+       if (plci->adapter->manufacturer_features & MANUFACTURER_FEATURE_OOB_CHANNEL)
+               lli[1] |= 4;
+
+       if ((lli[1] & 0x02) && (diva_xdi_extended_features & DIVA_CAPI_USE_CMA)) {
+               lli[1] |= 0x10;
+               if (plci->rx_dma_descriptor <= 0) {
+                       plci->rx_dma_descriptor = diva_get_dma_descriptor(plci, &plci->rx_dma_magic);
+                       if (plci->rx_dma_descriptor >= 0)
+                               plci->rx_dma_descriptor++;
+               }
+               if (plci->rx_dma_descriptor > 0) {
+                       lli[0] = 6;
+                       lli[1] |= 0x40;
+                       lli[2] = (byte)(plci->rx_dma_descriptor - 1);
+                       lli[3] = (byte)plci->rx_dma_magic;
+                       lli[4] = (byte)(plci->rx_dma_magic >>  8);
+                       lli[5] = (byte)(plci->rx_dma_magic >> 16);
+                       lli[6] = (byte)(plci->rx_dma_magic >> 24);
+               }
+       }
+
+       if (DIVA_CAPI_SUPPORTS_NO_CANCEL(plci->adapter)) {
+               lli[1] |= 0x20;
+       }
+
+       dbug(1, dprintf("add_b23"));
+       api_save_msg(bp, "s", &plci->B_protocol);
+
+       if (!bp->length && plci->tel)
+       {
+               plci->adv_nl = true;
+               dbug(1, dprintf("Default adv.Nl"));
+               add_p(plci, LLI, lli);
+               plci->B2_prot = 1 /*XPARENT*/;
+               plci->B3_prot = 0 /*XPARENT*/;
+               llc[1] = 2;
+               llc[2] = 4;
+               add_p(plci, LLC, llc);
+               dlc[0] = 2;
+               PUT_WORD(&dlc[1], plci->appl->MaxDataLength);
+               add_p(plci, DLC, dlc);
+               return 0;
+       }
+
+       if (!bp->length) /*default*/
+       {
+               dbug(1, dprintf("ret default"));
+               add_p(plci, LLI, lli);
+               plci->B2_prot = 0 /*X.75   */;
+               plci->B3_prot = 0 /*XPARENT*/;
+               llc[1] = 1;
+               llc[2] = 4;
+               add_p(plci, LLC, llc);
+               dlc[0] = 2;
+               PUT_WORD(&dlc[1], plci->appl->MaxDataLength);
+               add_p(plci, DLC, dlc);
+               return 0;
+       }
+       dbug(1, dprintf("b_prot_len=%d", (word)bp->length));
+       if ((word)bp->length > 256)    return _WRONG_MESSAGE_FORMAT;
+
+       if (api_parse(&bp->info[1], (word)bp->length, "wwwsssb", bp_parms))
+       {
+               bp_parms[6].length = 0;
+               if (api_parse(&bp->info[1], (word)bp->length, "wwwsss", bp_parms))
+               {
+                       dbug(1, dprintf("b-form.!"));
+                       return _WRONG_MESSAGE_FORMAT;
+               }
+       }
+       else if (api_parse(&bp->info[1], (word)bp->length, "wwwssss", bp_parms))
+       {
+               dbug(1, dprintf("b-form.!"));
+               return _WRONG_MESSAGE_FORMAT;
+       }
+
+       if (plci->tel == ADV_VOICE) /* transparent B on advanced voice */
+       {
+               if (GET_WORD(bp_parms[1].info) != 1
+                   || GET_WORD(bp_parms[2].info) != 0) return _B2_NOT_SUPPORTED;
+               plci->adv_nl = true;
+       }
+       else if (plci->tel) return _B2_NOT_SUPPORTED;
+
+
+       if ((GET_WORD(bp_parms[1].info) == B2_RTP)
+           && (GET_WORD(bp_parms[2].info) == B3_RTP)
+           && (plci->adapter->man_profile.private_options & (1L << PRIVATE_RTP)))
+       {
+               add_p(plci, LLI, lli);
+               plci->B2_prot = (byte) GET_WORD(bp_parms[1].info);
+               plci->B3_prot = (byte) GET_WORD(bp_parms[2].info);
+               llc[1] = (plci->call_dir & (CALL_DIR_ORIGINATE | CALL_DIR_FORCE_OUTG_NL)) ? 14 : 13;
+               llc[2] = 4;
+               add_p(plci, LLC, llc);
+               dlc[0] = 2;
+               PUT_WORD(&dlc[1], plci->appl->MaxDataLength);
+               dlc[3] = 3; /* Addr A */
+               dlc[4] = 1; /* Addr B */
+               dlc[5] = 7; /* modulo mode */
+               dlc[6] = 7; /* window size */
+               dlc[7] = 0; /* XID len Lo  */
+               dlc[8] = 0; /* XID len Hi  */
+               for (i = 0; i < bp_parms[4].length; i++)
+                       dlc[9 + i] = bp_parms[4].info[1 + i];
+               dlc[0] = (byte)(8 + bp_parms[4].length);
+               add_p(plci, DLC, dlc);
+               for (i = 0; i < bp_parms[5].length; i++)
+                       nlc[1 + i] = bp_parms[5].info[1 + i];
+               nlc[0] = (byte)(bp_parms[5].length);
+               add_p(plci, NLC, nlc);
+               return 0;
+       }
+
+
+
+       if ((GET_WORD(bp_parms[1].info) >= 32)
+           || (!((1L << GET_WORD(bp_parms[1].info)) & plci->adapter->profile.B2_Protocols)
+               && ((GET_WORD(bp_parms[1].info) != B2_PIAFS)
+                   || !(plci->adapter->man_profile.private_options & (1L << PRIVATE_PIAFS)))))
+
+       {
+               return _B2_NOT_SUPPORTED;
+       }
+       if ((GET_WORD(bp_parms[2].info) >= 32)
+           || !((1L << GET_WORD(bp_parms[2].info)) & plci->adapter->profile.B3_Protocols))
+       {
+               return _B3_NOT_SUPPORTED;
+       }
+       if ((GET_WORD(bp_parms[1].info) != B2_SDLC)
+           && ((GET_WORD(bp_parms[0].info) == B1_MODEM_ALL_NEGOTIATE)
+               || (GET_WORD(bp_parms[0].info) == B1_MODEM_ASYNC)
+               || (GET_WORD(bp_parms[0].info) == B1_MODEM_SYNC_HDLC)))
+       {
+               return (add_modem_b23(plci, bp_parms));
+       }
+
+       add_p(plci, LLI, lli);
+
+       plci->B2_prot = (byte)GET_WORD(bp_parms[1].info);
+       plci->B3_prot = (byte)GET_WORD(bp_parms[2].info);
+       if (plci->B2_prot == 12) SAPI = 0; /* default SAPI D-channel */
+
+       if (bp_parms[6].length)
+       {
+               if (api_parse(&bp_parms[6].info[1], (word)bp_parms[6].length, "w", global_config))
+               {
+                       return _WRONG_MESSAGE_FORMAT;
+               }
+               switch (GET_WORD(global_config[0].info))
+               {
+               case 1:
+                       plci->call_dir = (plci->call_dir & ~CALL_DIR_ANSWER) | CALL_DIR_ORIGINATE;
+                       break;
+               case 2:
+                       plci->call_dir = (plci->call_dir & ~CALL_DIR_ORIGINATE) | CALL_DIR_ANSWER;
+                       break;
+               }
+       }
+       dbug(1, dprintf("call_dir=%04x", plci->call_dir));
+
+
+       if (plci->B2_prot == B2_PIAFS)
+               llc[1] = PIAFS_CRC;
+       else
 /* IMPLEMENT_PIAFS */
-  {
-    llc[1] = (plci->call_dir & (CALL_DIR_ORIGINATE | CALL_DIR_FORCE_OUTG_NL)) ?
-             llc2_out[GET_WORD(bp_parms[1].info)] : llc2_in[GET_WORD(bp_parms[1].info)];
-  }
-  llc[2] = llc3[GET_WORD(bp_parms[2].info)];
-
-  add_p(plci, LLC, llc);
-
-  dlc[0] = 2;
-  PUT_WORD(&dlc[1], plci->appl->MaxDataLength +
-                      header[GET_WORD(bp_parms[2].info)]);
-
-  b1_config = &bp_parms[3];
-  nlc[0] = 0;
-  if(plci->B3_prot == 4
-  || plci->B3_prot == 5)
-  {
-    for (i=0;i<sizeof(T30_INFO);i++) nlc[i] = 0;
-    nlc[0] = sizeof(T30_INFO);
-    if (plci->adapter->manufacturer_features & MANUFACTURER_FEATURE_FAX_PAPER_FORMATS)
-      ((T30_INFO *)&nlc[1])->operating_mode = T30_OPERATING_MODE_CAPI;
-    ((T30_INFO *)&nlc[1])->rate_div_2400 = 0xff;
-    if(b1_config->length>=2)
-    {
-      ((T30_INFO *)&nlc[1])->rate_div_2400 = (byte)(GET_WORD(&b1_config->info[1])/2400);
-    }
-  }
-  b2_config = &bp_parms[4];
-
-
-  if (llc[1] == PIAFS_CRC)
-  {
-    if (plci->B3_prot != B3_TRANSPARENT)
-    {
-      return _B_STACK_NOT_SUPPORTED;
-    }
-    if(b2_config->length && api_parse(&b2_config->info[1], (word)b2_config->length, "bwww", b2_config_parms)) {
-      return _WRONG_MESSAGE_FORMAT;
-    }
-    PUT_WORD(&dlc[1],plci->appl->MaxDataLength);
-    dlc[3] = 0; /* Addr A */
-    dlc[4] = 0; /* Addr B */
-    dlc[5] = 0; /* modulo mode */
-    dlc[6] = 0; /* window size */
-    if (b2_config->length >= 7){
-      dlc[ 7] = 7; 
-      dlc[ 8] = 0; 
-      dlc[ 9] = b2_config_parms[0].info[0]; /* PIAFS protocol Speed configuration */
-      dlc[10] = b2_config_parms[1].info[0]; /* V.42bis P0 */
-      dlc[11] = b2_config_parms[1].info[1]; /* V.42bis P0 */
-      dlc[12] = b2_config_parms[2].info[0]; /* V.42bis P1 */
-      dlc[13] = b2_config_parms[2].info[1]; /* V.42bis P1 */
-      dlc[14] = b2_config_parms[3].info[0]; /* V.42bis P2 */
-      dlc[15] = b2_config_parms[3].info[1]; /* V.42bis P2 */
-      dlc[ 0] = 15;
-      if(b2_config->length >= 8) { /* PIAFS control abilities */
-        dlc[ 7] = 10; 
-        dlc[16] = 2; /* Length of PIAFS extension */
-        dlc[17] = PIAFS_UDATA_ABILITIES; /* control (UDATA) ability */
-        dlc[18] = b2_config_parms[4].info[0]; /* value */
-        dlc[ 0] = 18;
-      }
-    }
-    else /* default values, 64K, variable, no compression */
-    {
-      dlc[ 7] = 7; 
-      dlc[ 8] = 0; 
-      dlc[ 9] = 0x03; /* PIAFS protocol Speed configuration */
-      dlc[10] = 0x03; /* V.42bis P0 */
-      dlc[11] = 0;    /* V.42bis P0 */
-      dlc[12] = 0;    /* V.42bis P1 */
-      dlc[13] = 0;    /* V.42bis P1 */
-      dlc[14] = 0;    /* V.42bis P2 */
-      dlc[15] = 0;    /* V.42bis P2 */
-    dlc[ 0] = 15;
-    }
-    add_p(plci, DLC, dlc);
-  }
-  else
-
-  if ((llc[1] == V120_L2) || (llc[1] == V120_V42BIS))
-  {
-    if (plci->B3_prot != B3_TRANSPARENT)
-      return _B_STACK_NOT_SUPPORTED;
-
-    dlc[0] = 6;
-    PUT_WORD (&dlc[1], GET_WORD (&dlc[1]) + 2);
-    dlc[3] = 0x08;
-    dlc[4] = 0x01;
-    dlc[5] = 127;
-    dlc[6] = 7;
-    if (b2_config->length != 0)
-    {
-      if((llc[1]==V120_V42BIS) && api_parse(&b2_config->info[1], (word)b2_config->length, "bbbbwww", b2_config_parms)) {
-        return _WRONG_MESSAGE_FORMAT;
-      }
-      dlc[3] = (byte)((b2_config->info[2] << 3) | ((b2_config->info[1] >> 5) & 0x04));
-      dlc[4] = (byte)((b2_config->info[1] << 1) | 0x01);
-      if (b2_config->info[3] != 128)
-      {
-        dbug(1,dprintf("1D-dlc= %x %x %x %x %x", dlc[0], dlc[1], dlc[2], dlc[3], dlc[4]));
-        return _B2_PARM_NOT_SUPPORTED;
-      }
-      dlc[5] = (byte)(b2_config->info[3] - 1);
-      dlc[6] = b2_config->info[4];
-      if(llc[1]==V120_V42BIS){
-        if (b2_config->length >= 10){
-          dlc[ 7] = 6; 
-          dlc[ 8] = 0; 
-          dlc[ 9] = b2_config_parms[4].info[0];
-          dlc[10] = b2_config_parms[4].info[1];
-          dlc[11] = b2_config_parms[5].info[0];
-          dlc[12] = b2_config_parms[5].info[1];
-          dlc[13] = b2_config_parms[6].info[0];
-          dlc[14] = b2_config_parms[6].info[1];
-          dlc[ 0] = 14;
-          dbug(1,dprintf("b2_config_parms[4].info[0] [1]:  %x %x", b2_config_parms[4].info[0], b2_config_parms[4].info[1]));
-          dbug(1,dprintf("b2_config_parms[5].info[0] [1]:  %x %x", b2_config_parms[5].info[0], b2_config_parms[5].info[1]));
-          dbug(1,dprintf("b2_config_parms[6].info[0] [1]:  %x %x", b2_config_parms[6].info[0], b2_config_parms[6].info[1]));
-        }
-        else {
-          dlc[ 6] = 14;
-        }
-      }
-    }
-  }
-  else
-  {
-    if(b2_config->length)
-    {
-      dbug(1,dprintf("B2-Config"));
-      if(llc[1]==X75_V42BIS){
-        if(api_parse(&b2_config->info[1], (word)b2_config->length, "bbbbwww", b2_config_parms))
-        {
-          return _WRONG_MESSAGE_FORMAT;
-        }
-      }
-      else {
-        if(api_parse(&b2_config->info[1], (word)b2_config->length, "bbbbs", b2_config_parms))
-        {
-          return _WRONG_MESSAGE_FORMAT;
-        }
-      }
-          /* if B2 Protocol is LAPD, b2_config structure is different */
-      if(llc[1]==6)
-      {
-        dlc[0] = 4;
-        if(b2_config->length>=1) dlc[2] = b2_config->info[1];      /* TEI */
-        else dlc[2] = 0x01;
-        if( (b2_config->length>=2) && (plci->B2_prot==12) )
-        {
-          SAPI = b2_config->info[2];    /* SAPI */
-        }
-        dlc[1] = SAPI;
-        if( (b2_config->length>=3) && (b2_config->info[3]==128) )
-        {
-          dlc[3] = 127;      /* Mode */
-        }
-        else
-        {
-          dlc[3] = 7;        /* Mode */
-        }
-   
-        if(b2_config->length>=4) dlc[4] = b2_config->info[4];      /* Window */
-        else dlc[4] = 1;
-        dbug(1,dprintf("D-dlc[%d]=%x,%x,%x,%x", dlc[0], dlc[1], dlc[2], dlc[3], dlc[4]));
-        if(b2_config->length>5) return _B2_PARM_NOT_SUPPORTED;
-      }
-      else
-      {
-        dlc[0] = (byte)(b2_config_parms[4].length+6);
-        dlc[3] = b2_config->info[1];
-        dlc[4] = b2_config->info[2];
-        if(b2_config->info[3]!=8 && b2_config->info[3]!=128){
-          dbug(1,dprintf("1D-dlc= %x %x %x %x %x", dlc[0], dlc[1], dlc[2], dlc[3], dlc[4]));
-          return _B2_PARM_NOT_SUPPORTED;
-        }
-
-        dlc[5] = (byte)(b2_config->info[3]-1);
-        dlc[6] = b2_config->info[4];
-        if(dlc[6]>dlc[5]){
-          dbug(1,dprintf("2D-dlc= %x %x %x %x %x %x %x", dlc[0], dlc[1], dlc[2], dlc[3], dlc[4], dlc[5], dlc[6]));
-          return _B2_PARM_NOT_SUPPORTED;
-        }
-        if(llc[1]==X75_V42BIS) {
-          if (b2_config->length >= 10){
-            dlc[ 7] = 6; 
-            dlc[ 8] = 0; 
-            dlc[ 9] = b2_config_parms[4].info[0];
-            dlc[10] = b2_config_parms[4].info[1];
-            dlc[11] = b2_config_parms[5].info[0];
-            dlc[12] = b2_config_parms[5].info[1];
-            dlc[13] = b2_config_parms[6].info[0];
-            dlc[14] = b2_config_parms[6].info[1];
-            dlc[ 0] = 14;
-            dbug(1,dprintf("b2_config_parms[4].info[0] [1]:  %x %x", b2_config_parms[4].info[0], b2_config_parms[4].info[1]));
-            dbug(1,dprintf("b2_config_parms[5].info[0] [1]:  %x %x", b2_config_parms[5].info[0], b2_config_parms[5].info[1]));
-            dbug(1,dprintf("b2_config_parms[6].info[0] [1]:  %x %x", b2_config_parms[6].info[0], b2_config_parms[6].info[1]));
-          }
-          else {
-            dlc[ 6] = 14;
-          }
-
-        }
-        else {
-          PUT_WORD(&dlc[7], (word)b2_config_parms[4].length);
-          for(i=0; i<b2_config_parms[4].length; i++)
-            dlc[11+i] = b2_config_parms[4].info[1+i];
-        }
-      }
-    }
-  }
-  add_p(plci, DLC, dlc);
-
-  b3_config = &bp_parms[5];
-  if(b3_config->length)
-  {
-    if(plci->B3_prot == 4 
-    || plci->B3_prot == 5)
-    {
-      if(api_parse(&b3_config->info[1], (word)b3_config->length, "wwss", b3_config_parms))
-      {
-        return _WRONG_MESSAGE_FORMAT;
-      }
-      i = GET_WORD((byte   *)(b3_config_parms[0].info));
-      ((T30_INFO *)&nlc[1])->resolution = (byte)(((i & 0x0001) ||
-        ((plci->B3_prot == 4) && (((byte)(GET_WORD((byte   *)b3_config_parms[1].info))) != 5))) ? T30_RESOLUTION_R8_0770_OR_200 : 0);
-      ((T30_INFO *)&nlc[1])->data_format = (byte)(GET_WORD((byte   *)b3_config_parms[1].info));
-      fax_control_bits = T30_CONTROL_BIT_ALL_FEATURES;
-      if ((((T30_INFO *)&nlc[1])->rate_div_2400 != 0) && (((T30_INFO *)&nlc[1])->rate_div_2400 <= 6))
-        fax_control_bits &= ~T30_CONTROL_BIT_ENABLE_V34FAX;
-      if (plci->adapter->manufacturer_features & MANUFACTURER_FEATURE_FAX_PAPER_FORMATS)
-      {
-
-        if ((plci->requested_options_conn | plci->requested_options | plci->adapter->requested_options_table[plci->appl->Id-1])
-          & (1L << PRIVATE_FAX_PAPER_FORMATS))
-        {
-          ((T30_INFO *)&nlc[1])->resolution |= T30_RESOLUTION_R8_1540 |
-            T30_RESOLUTION_R16_1540_OR_400 | T30_RESOLUTION_300_300 |
-            T30_RESOLUTION_INCH_BASED | T30_RESOLUTION_METRIC_BASED;
-        }
-
- ((T30_INFO *)&nlc[1])->recording_properties =
-   T30_RECORDING_WIDTH_ISO_A3 |
-   (T30_RECORDING_LENGTH_UNLIMITED << 2) |
-   (T30_MIN_SCANLINE_TIME_00_00_00 << 4);
-      }
-      if(plci->B3_prot == 5)
-      {
-        if (i & 0x0002) /* Accept incoming fax-polling requests */
-          fax_control_bits |= T30_CONTROL_BIT_ACCEPT_POLLING;
-        if (i & 0x2000) /* Do not use MR compression */
-          fax_control_bits &= ~T30_CONTROL_BIT_ENABLE_2D_CODING;
-        if (i & 0x4000) /* Do not use MMR compression */
-          fax_control_bits &= ~T30_CONTROL_BIT_ENABLE_T6_CODING;
-        if (i & 0x8000) /* Do not use ECM */
-          fax_control_bits &= ~T30_CONTROL_BIT_ENABLE_ECM;
-        if (plci->fax_connect_info_length != 0)
-        {
-          ((T30_INFO *)&nlc[1])->resolution = ((T30_INFO   *)plci->fax_connect_info_buffer)->resolution;
-          ((T30_INFO *)&nlc[1])->data_format = ((T30_INFO   *)plci->fax_connect_info_buffer)->data_format;
-          ((T30_INFO *)&nlc[1])->recording_properties = ((T30_INFO   *)plci->fax_connect_info_buffer)->recording_properties;
-          fax_control_bits |= GET_WORD(&((T30_INFO   *)plci->fax_connect_info_buffer)->control_bits_low) &
-            (T30_CONTROL_BIT_REQUEST_POLLING | T30_CONTROL_BIT_MORE_DOCUMENTS);
-        }
-      }
-      /* copy station id to NLC */
-      for(i=0; i < T30_MAX_STATION_ID_LENGTH; i++)
-      {
-        if(i<b3_config_parms[2].length)
-        {
-          ((T30_INFO *)&nlc[1])->station_id[i] = ((byte   *)b3_config_parms[2].info)[1+i];
-        }
-        else
-        {
-          ((T30_INFO *)&nlc[1])->station_id[i] = ' ';
-        }
-      }
-      ((T30_INFO *)&nlc[1])->station_id_len = T30_MAX_STATION_ID_LENGTH;
-      /* copy head line to NLC */
-      if(b3_config_parms[3].length)
-      {
-
-        pos = (byte)(fax_head_line_time (&(((T30_INFO *)&nlc[1])->station_id[T30_MAX_STATION_ID_LENGTH])));
-        if (pos != 0)
-        {
-          if (CAPI_MAX_DATE_TIME_LENGTH + 2 + b3_config_parms[3].length > CAPI_MAX_HEAD_LINE_SPACE)
-            pos = 0;
-          else
-          {
-            nlc[1 + offsetof(T30_INFO, station_id) + T30_MAX_STATION_ID_LENGTH + pos++] = ' ';
-            nlc[1 + offsetof(T30_INFO, station_id) + T30_MAX_STATION_ID_LENGTH + pos++] = ' ';
-            len = (byte)b3_config_parms[2].length;
-            if (len > 20)
-              len = 20;
-            if (CAPI_MAX_DATE_TIME_LENGTH + 2 + len + 2 + b3_config_parms[3].length <= CAPI_MAX_HEAD_LINE_SPACE)
-            {
-              for (i = 0; i < len; i++)
-                nlc[1 + offsetof(T30_INFO, station_id) + T30_MAX_STATION_ID_LENGTH + pos++] = ((byte   *)b3_config_parms[2].info)[1+i];
-              nlc[1 + offsetof(T30_INFO, station_id) + T30_MAX_STATION_ID_LENGTH + pos++] = ' ';
-              nlc[1 + offsetof(T30_INFO, station_id) + T30_MAX_STATION_ID_LENGTH + pos++] = ' ';
-            }
-          }
-        }
-
-        len = (byte)b3_config_parms[3].length;
-        if (len > CAPI_MAX_HEAD_LINE_SPACE - pos)
-          len = (byte)(CAPI_MAX_HEAD_LINE_SPACE - pos);
-        ((T30_INFO *)&nlc[1])->head_line_len = (byte)(pos + len);
-        nlc[0] += (byte)(pos + len);
-        for (i = 0; i < len; i++)
-          nlc[1 + offsetof(T30_INFO, station_id) + T30_MAX_STATION_ID_LENGTH + pos++] =  ((byte   *)b3_config_parms[3].info)[1+i];
-      } else
-        ((T30_INFO *)&nlc[1])->head_line_len = 0;
-
-      plci->nsf_control_bits = 0;
-      if(plci->B3_prot == 5)
-      {
-        if ((plci->adapter->man_profile.private_options & (1L << PRIVATE_FAX_SUB_SEP_PWD))
-         && (GET_WORD((byte   *)b3_config_parms[1].info) & 0x8000)) /* Private SUB/SEP/PWD enable */
-        {
-          plci->requested_options |= 1L << PRIVATE_FAX_SUB_SEP_PWD;
-        }
-        if ((plci->adapter->man_profile.private_options & (1L << PRIVATE_FAX_NONSTANDARD))
-         && (GET_WORD((byte   *)b3_config_parms[1].info) & 0x4000)) /* Private non-standard facilities enable */
-        {
-          plci->requested_options |= 1L << PRIVATE_FAX_NONSTANDARD;
-        }
-        if ((plci->requested_options_conn | plci->requested_options | plci->adapter->requested_options_table[plci->appl->Id-1])
-          & ((1L << PRIVATE_FAX_SUB_SEP_PWD) | (1L << PRIVATE_FAX_NONSTANDARD)))
-        {
-        if ((plci->requested_options_conn | plci->requested_options | plci->adapter->requested_options_table[plci->appl->Id-1])
-          & (1L << PRIVATE_FAX_SUB_SEP_PWD))
-        {
-          fax_control_bits |= T30_CONTROL_BIT_ACCEPT_SUBADDRESS | T30_CONTROL_BIT_ACCEPT_PASSWORD;
-          if (fax_control_bits & T30_CONTROL_BIT_ACCEPT_POLLING)
-            fax_control_bits |= T30_CONTROL_BIT_ACCEPT_SEL_POLLING;
-          }
-            len = nlc[0];
-          pos = offsetof(T30_INFO, station_id) + T30_MAX_STATION_ID_LENGTH;
-   if (pos < plci->fax_connect_info_length)
-   {
-     for (i = 1 + plci->fax_connect_info_buffer[pos]; i != 0; i--)
-              nlc[++len] = plci->fax_connect_info_buffer[pos++];
-          }
-   else
-     nlc[++len] = 0;
-   if (pos < plci->fax_connect_info_length)
-   {
-     for (i = 1 + plci->fax_connect_info_buffer[pos]; i != 0; i--)
-              nlc[++len] = plci->fax_connect_info_buffer[pos++];
-          }
-   else
-     nlc[++len] = 0;
-          if ((plci->requested_options_conn | plci->requested_options | plci->adapter->requested_options_table[plci->appl->Id-1])
-            & (1L << PRIVATE_FAX_NONSTANDARD))
-          {
-     if ((pos < plci->fax_connect_info_length) && (plci->fax_connect_info_buffer[pos] != 0))
-     {
-              if ((plci->fax_connect_info_buffer[pos] >= 3) && (plci->fax_connect_info_buffer[pos+1] >= 2))
-                plci->nsf_control_bits = GET_WORD(&plci->fax_connect_info_buffer[pos+2]);
-       for (i = 1 + plci->fax_connect_info_buffer[pos]; i != 0; i--)
-                nlc[++len] = plci->fax_connect_info_buffer[pos++];
-            }
-     else
-     {
-              if(api_parse(&b3_config->info[1], (word)b3_config->length, "wwsss", b3_config_parms))
-              {
-                dbug(1,dprintf("non-standard facilities info missing or wrong format"));
-                nlc[++len] = 0;
-              }
-       else
-       {
-                if ((b3_config_parms[4].length >= 3) && (b3_config_parms[4].info[1] >= 2))
-                  plci->nsf_control_bits = GET_WORD(&b3_config_parms[4].info[2]);
-         nlc[++len] = (byte)(b3_config_parms[4].length);
-         for (i = 0; i < b3_config_parms[4].length; i++)
-    nlc[++len] = b3_config_parms[4].info[1+i];
-       }
-            }
-          }
-            nlc[0] = len;
-   if ((plci->nsf_control_bits & T30_NSF_CONTROL_BIT_ENABLE_NSF)
-    && (plci->nsf_control_bits & T30_NSF_CONTROL_BIT_NEGOTIATE_RESP))
-   {
-            ((T30_INFO *)&nlc[1])->operating_mode = T30_OPERATING_MODE_CAPI_NEG;
-          }
-        }
-      }
-
-      PUT_WORD(&(((T30_INFO *)&nlc[1])->control_bits_low), fax_control_bits);
-      len = offsetof(T30_INFO, station_id) + T30_MAX_STATION_ID_LENGTH;
-      for (i = 0; i < len; i++)
-        plci->fax_connect_info_buffer[i] = nlc[1+i];
-      ((T30_INFO   *) plci->fax_connect_info_buffer)->head_line_len = 0;
-      i += ((T30_INFO *)&nlc[1])->head_line_len;
-      while (i < nlc[0])
-        plci->fax_connect_info_buffer[len++] = nlc[++i];
-      plci->fax_connect_info_length = len;
-    }
-    else
-    {
-      nlc[0] = 14;
-      if(b3_config->length!=16)
-        return _B3_PARM_NOT_SUPPORTED;
-      for(i=0; i<12; i++) nlc[1+i] = b3_config->info[1+i];
-      if(GET_WORD(&b3_config->info[13])!=8 && GET_WORD(&b3_config->info[13])!=128)
-        return _B3_PARM_NOT_SUPPORTED;
-      nlc[13] = b3_config->info[13];
-      if(GET_WORD(&b3_config->info[15])>=nlc[13])
-        return _B3_PARM_NOT_SUPPORTED;
-      nlc[14] = b3_config->info[15];
-    }
-  }
-  else
-  {
-    if (plci->B3_prot == 4 
-     || plci->B3_prot == 5 /*T.30 - FAX*/ ) return _B3_PARM_NOT_SUPPORTED;
-  }
-  add_p(plci, NLC, nlc);
-  return 0;
+       {
+               llc[1] = (plci->call_dir & (CALL_DIR_ORIGINATE | CALL_DIR_FORCE_OUTG_NL)) ?
+                       llc2_out[GET_WORD(bp_parms[1].info)] : llc2_in[GET_WORD(bp_parms[1].info)];
+       }
+       llc[2] = llc3[GET_WORD(bp_parms[2].info)];
+
+       add_p(plci, LLC, llc);
+
+       dlc[0] = 2;
+       PUT_WORD(&dlc[1], plci->appl->MaxDataLength +
+                header[GET_WORD(bp_parms[2].info)]);
+
+       b1_config = &bp_parms[3];
+       nlc[0] = 0;
+       if (plci->B3_prot == 4
+           || plci->B3_prot == 5)
+       {
+               for (i = 0; i < sizeof(T30_INFO); i++) nlc[i] = 0;
+               nlc[0] = sizeof(T30_INFO);
+               if (plci->adapter->manufacturer_features & MANUFACTURER_FEATURE_FAX_PAPER_FORMATS)
+                       ((T30_INFO *)&nlc[1])->operating_mode = T30_OPERATING_MODE_CAPI;
+               ((T30_INFO *)&nlc[1])->rate_div_2400 = 0xff;
+               if (b1_config->length >= 2)
+               {
+                       ((T30_INFO *)&nlc[1])->rate_div_2400 = (byte)(GET_WORD(&b1_config->info[1]) / 2400);
+               }
+       }
+       b2_config = &bp_parms[4];
+
+
+       if (llc[1] == PIAFS_CRC)
+       {
+               if (plci->B3_prot != B3_TRANSPARENT)
+               {
+                       return _B_STACK_NOT_SUPPORTED;
+               }
+               if (b2_config->length && api_parse(&b2_config->info[1], (word)b2_config->length, "bwww", b2_config_parms)) {
+                       return _WRONG_MESSAGE_FORMAT;
+               }
+               PUT_WORD(&dlc[1], plci->appl->MaxDataLength);
+               dlc[3] = 0; /* Addr A */
+               dlc[4] = 0; /* Addr B */
+               dlc[5] = 0; /* modulo mode */
+               dlc[6] = 0; /* window size */
+               if (b2_config->length >= 7) {
+                       dlc[7] = 7;
+                       dlc[8] = 0;
+                       dlc[9] = b2_config_parms[0].info[0]; /* PIAFS protocol Speed configuration */
+                       dlc[10] = b2_config_parms[1].info[0]; /* V.42bis P0 */
+                       dlc[11] = b2_config_parms[1].info[1]; /* V.42bis P0 */
+                       dlc[12] = b2_config_parms[2].info[0]; /* V.42bis P1 */
+                       dlc[13] = b2_config_parms[2].info[1]; /* V.42bis P1 */
+                       dlc[14] = b2_config_parms[3].info[0]; /* V.42bis P2 */
+                       dlc[15] = b2_config_parms[3].info[1]; /* V.42bis P2 */
+                       dlc[0] = 15;
+                       if (b2_config->length >= 8) { /* PIAFS control abilities */
+                               dlc[7] = 10;
+                               dlc[16] = 2; /* Length of PIAFS extension */
+                               dlc[17] = PIAFS_UDATA_ABILITIES; /* control (UDATA) ability */
+                               dlc[18] = b2_config_parms[4].info[0]; /* value */
+                               dlc[0] = 18;
+                       }
+               }
+               else /* default values, 64K, variable, no compression */
+               {
+                       dlc[7] = 7;
+                       dlc[8] = 0;
+                       dlc[9] = 0x03; /* PIAFS protocol Speed configuration */
+                       dlc[10] = 0x03; /* V.42bis P0 */
+                       dlc[11] = 0;    /* V.42bis P0 */
+                       dlc[12] = 0;    /* V.42bis P1 */
+                       dlc[13] = 0;    /* V.42bis P1 */
+                       dlc[14] = 0;    /* V.42bis P2 */
+                       dlc[15] = 0;    /* V.42bis P2 */
+                       dlc[0] = 15;
+               }
+               add_p(plci, DLC, dlc);
+       }
+       else
+
+               if ((llc[1] == V120_L2) || (llc[1] == V120_V42BIS))
+               {
+                       if (plci->B3_prot != B3_TRANSPARENT)
+                               return _B_STACK_NOT_SUPPORTED;
+
+                       dlc[0] = 6;
+                       PUT_WORD(&dlc[1], GET_WORD(&dlc[1]) + 2);
+                       dlc[3] = 0x08;
+                       dlc[4] = 0x01;
+                       dlc[5] = 127;
+                       dlc[6] = 7;
+                       if (b2_config->length != 0)
+                       {
+                               if ((llc[1] == V120_V42BIS) && api_parse(&b2_config->info[1], (word)b2_config->length, "bbbbwww", b2_config_parms)) {
+                                       return _WRONG_MESSAGE_FORMAT;
+                               }
+                               dlc[3] = (byte)((b2_config->info[2] << 3) | ((b2_config->info[1] >> 5) & 0x04));
+                               dlc[4] = (byte)((b2_config->info[1] << 1) | 0x01);
+                               if (b2_config->info[3] != 128)
+                               {
+                                       dbug(1, dprintf("1D-dlc= %x %x %x %x %x", dlc[0], dlc[1], dlc[2], dlc[3], dlc[4]));
+                                       return _B2_PARM_NOT_SUPPORTED;
+                               }
+                               dlc[5] = (byte)(b2_config->info[3] - 1);
+                               dlc[6] = b2_config->info[4];
+                               if (llc[1] == V120_V42BIS) {
+                                       if (b2_config->length >= 10) {
+                                               dlc[7] = 6;
+                                               dlc[8] = 0;
+                                               dlc[9] = b2_config_parms[4].info[0];
+                                               dlc[10] = b2_config_parms[4].info[1];
+                                               dlc[11] = b2_config_parms[5].info[0];
+                                               dlc[12] = b2_config_parms[5].info[1];
+                                               dlc[13] = b2_config_parms[6].info[0];
+                                               dlc[14] = b2_config_parms[6].info[1];
+                                               dlc[0] = 14;
+                                               dbug(1, dprintf("b2_config_parms[4].info[0] [1]:  %x %x", b2_config_parms[4].info[0], b2_config_parms[4].info[1]));
+                                               dbug(1, dprintf("b2_config_parms[5].info[0] [1]:  %x %x", b2_config_parms[5].info[0], b2_config_parms[5].info[1]));
+                                               dbug(1, dprintf("b2_config_parms[6].info[0] [1]:  %x %x", b2_config_parms[6].info[0], b2_config_parms[6].info[1]));
+                                       }
+                                       else {
+                                               dlc[6] = 14;
+                                       }
+                               }
+                       }
+               }
+               else
+               {
+                       if (b2_config->length)
+                       {
+                               dbug(1, dprintf("B2-Config"));
+                               if (llc[1] == X75_V42BIS) {
+                                       if (api_parse(&b2_config->info[1], (word)b2_config->length, "bbbbwww", b2_config_parms))
+                                       {
+                                               return _WRONG_MESSAGE_FORMAT;
+                                       }
+                               }
+                               else {
+                                       if (api_parse(&b2_config->info[1], (word)b2_config->length, "bbbbs", b2_config_parms))
+                                       {
+                                               return _WRONG_MESSAGE_FORMAT;
+                                       }
+                               }
+                               /* if B2 Protocol is LAPD, b2_config structure is different */
+                               if (llc[1] == 6)
+                               {
+                                       dlc[0] = 4;
+                                       if (b2_config->length >= 1) dlc[2] = b2_config->info[1];      /* TEI */
+                                       else dlc[2] = 0x01;
+                                       if ((b2_config->length >= 2) && (plci->B2_prot == 12))
+                                       {
+                                               SAPI = b2_config->info[2];    /* SAPI */
+                                       }
+                                       dlc[1] = SAPI;
+                                       if ((b2_config->length >= 3) && (b2_config->info[3] == 128))
+                                       {
+                                               dlc[3] = 127;      /* Mode */
+                                       }
+                                       else
+                                       {
+                                               dlc[3] = 7;        /* Mode */
+                                       }
+
+                                       if (b2_config->length >= 4) dlc[4] = b2_config->info[4];      /* Window */
+                                       else dlc[4] = 1;
+                                       dbug(1, dprintf("D-dlc[%d]=%x,%x,%x,%x", dlc[0], dlc[1], dlc[2], dlc[3], dlc[4]));
+                                       if (b2_config->length > 5) return _B2_PARM_NOT_SUPPORTED;
+                               }
+                               else
+                               {
+                                       dlc[0] = (byte)(b2_config_parms[4].length + 6);
+                                       dlc[3] = b2_config->info[1];
+                                       dlc[4] = b2_config->info[2];
+                                       if (b2_config->info[3] != 8 && b2_config->info[3] != 128) {
+                                               dbug(1, dprintf("1D-dlc= %x %x %x %x %x", dlc[0], dlc[1], dlc[2], dlc[3], dlc[4]));
+                                               return _B2_PARM_NOT_SUPPORTED;
+                                       }
+
+                                       dlc[5] = (byte)(b2_config->info[3] - 1);
+                                       dlc[6] = b2_config->info[4];
+                                       if (dlc[6] > dlc[5]) {
+                                               dbug(1, dprintf("2D-dlc= %x %x %x %x %x %x %x", dlc[0], dlc[1], dlc[2], dlc[3], dlc[4], dlc[5], dlc[6]));
+                                               return _B2_PARM_NOT_SUPPORTED;
+                                       }
+
+                                       if (llc[1] == X75_V42BIS) {
+                                               if (b2_config->length >= 10) {
+                                                       dlc[7] = 6;
+                                                       dlc[8] = 0;
+                                                       dlc[9] = b2_config_parms[4].info[0];
+                                                       dlc[10] = b2_config_parms[4].info[1];
+                                                       dlc[11] = b2_config_parms[5].info[0];
+                                                       dlc[12] = b2_config_parms[5].info[1];
+                                                       dlc[13] = b2_config_parms[6].info[0];
+                                                       dlc[14] = b2_config_parms[6].info[1];
+                                                       dlc[0] = 14;
+                                                       dbug(1, dprintf("b2_config_parms[4].info[0] [1]:  %x %x", b2_config_parms[4].info[0], b2_config_parms[4].info[1]));
+                                                       dbug(1, dprintf("b2_config_parms[5].info[0] [1]:  %x %x", b2_config_parms[5].info[0], b2_config_parms[5].info[1]));
+                                                       dbug(1, dprintf("b2_config_parms[6].info[0] [1]:  %x %x", b2_config_parms[6].info[0], b2_config_parms[6].info[1]));
+                                               }
+                                               else {
+                                                       dlc[6] = 14;
+                                               }
+
+                                       }
+                                       else {
+                                               PUT_WORD(&dlc[7], (word)b2_config_parms[4].length);
+                                               for (i = 0; i < b2_config_parms[4].length; i++)
+                                                       dlc[11 + i] = b2_config_parms[4].info[1 + i];
+                                       }
+                               }
+                       }
+               }
+       add_p(plci, DLC, dlc);
+
+       b3_config = &bp_parms[5];
+       if (b3_config->length)
+       {
+               if (plci->B3_prot == 4
+                   || plci->B3_prot == 5)
+               {
+                       if (api_parse(&b3_config->info[1], (word)b3_config->length, "wwss", b3_config_parms))
+                       {
+                               return _WRONG_MESSAGE_FORMAT;
+                       }
+                       i = GET_WORD((byte *)(b3_config_parms[0].info));
+                       ((T30_INFO *)&nlc[1])->resolution = (byte)(((i & 0x0001) ||
+                                                                   ((plci->B3_prot == 4) && (((byte)(GET_WORD((byte *)b3_config_parms[1].info))) != 5))) ? T30_RESOLUTION_R8_0770_OR_200 : 0);
+                       ((T30_INFO *)&nlc[1])->data_format = (byte)(GET_WORD((byte *)b3_config_parms[1].info));
+                       fax_control_bits = T30_CONTROL_BIT_ALL_FEATURES;
+                       if ((((T30_INFO *)&nlc[1])->rate_div_2400 != 0) && (((T30_INFO *)&nlc[1])->rate_div_2400 <= 6))
+                               fax_control_bits &= ~T30_CONTROL_BIT_ENABLE_V34FAX;
+                       if (plci->adapter->manufacturer_features & MANUFACTURER_FEATURE_FAX_PAPER_FORMATS)
+                       {
+
+                               if ((plci->requested_options_conn | plci->requested_options | plci->adapter->requested_options_table[plci->appl->Id - 1])
+                                   & (1L << PRIVATE_FAX_PAPER_FORMATS))
+                               {
+                                       ((T30_INFO *)&nlc[1])->resolution |= T30_RESOLUTION_R8_1540 |
+                                               T30_RESOLUTION_R16_1540_OR_400 | T30_RESOLUTION_300_300 |
+                                               T30_RESOLUTION_INCH_BASED | T30_RESOLUTION_METRIC_BASED;
+                               }
+
+                               ((T30_INFO *)&nlc[1])->recording_properties =
+                                       T30_RECORDING_WIDTH_ISO_A3 |
+                                       (T30_RECORDING_LENGTH_UNLIMITED << 2) |
+                                       (T30_MIN_SCANLINE_TIME_00_00_00 << 4);
+                       }
+                       if (plci->B3_prot == 5)
+                       {
+                               if (i & 0x0002) /* Accept incoming fax-polling requests */
+                                       fax_control_bits |= T30_CONTROL_BIT_ACCEPT_POLLING;
+                               if (i & 0x2000) /* Do not use MR compression */
+                                       fax_control_bits &= ~T30_CONTROL_BIT_ENABLE_2D_CODING;
+                               if (i & 0x4000) /* Do not use MMR compression */
+                                       fax_control_bits &= ~T30_CONTROL_BIT_ENABLE_T6_CODING;
+                               if (i & 0x8000) /* Do not use ECM */
+                                       fax_control_bits &= ~T30_CONTROL_BIT_ENABLE_ECM;
+                               if (plci->fax_connect_info_length != 0)
+                               {
+                                       ((T30_INFO *)&nlc[1])->resolution = ((T30_INFO *)plci->fax_connect_info_buffer)->resolution;
+                                       ((T30_INFO *)&nlc[1])->data_format = ((T30_INFO *)plci->fax_connect_info_buffer)->data_format;
+                                       ((T30_INFO *)&nlc[1])->recording_properties = ((T30_INFO *)plci->fax_connect_info_buffer)->recording_properties;
+                                       fax_control_bits |= GET_WORD(&((T30_INFO *)plci->fax_connect_info_buffer)->control_bits_low) &
+                                               (T30_CONTROL_BIT_REQUEST_POLLING | T30_CONTROL_BIT_MORE_DOCUMENTS);
+                               }
+                       }
+                       /* copy station id to NLC */
+                       for (i = 0; i < T30_MAX_STATION_ID_LENGTH; i++)
+                       {
+                               if (i < b3_config_parms[2].length)
+                               {
+                                       ((T30_INFO *)&nlc[1])->station_id[i] = ((byte *)b3_config_parms[2].info)[1 + i];
+                               }
+                               else
+                               {
+                                       ((T30_INFO *)&nlc[1])->station_id[i] = ' ';
+                               }
+                       }
+                       ((T30_INFO *)&nlc[1])->station_id_len = T30_MAX_STATION_ID_LENGTH;
+                       /* copy head line to NLC */
+                       if (b3_config_parms[3].length)
+                       {
+
+                               pos = (byte)(fax_head_line_time(&(((T30_INFO *)&nlc[1])->station_id[T30_MAX_STATION_ID_LENGTH])));
+                               if (pos != 0)
+                               {
+                                       if (CAPI_MAX_DATE_TIME_LENGTH + 2 + b3_config_parms[3].length > CAPI_MAX_HEAD_LINE_SPACE)
+                                               pos = 0;
+                                       else
+                                       {
+                                               nlc[1 + offsetof(T30_INFO, station_id) + T30_MAX_STATION_ID_LENGTH + pos++] = ' ';
+                                               nlc[1 + offsetof(T30_INFO, station_id) + T30_MAX_STATION_ID_LENGTH + pos++] = ' ';
+                                               len = (byte)b3_config_parms[2].length;
+                                               if (len > 20)
+                                                       len = 20;
+                                               if (CAPI_MAX_DATE_TIME_LENGTH + 2 + len + 2 + b3_config_parms[3].length <= CAPI_MAX_HEAD_LINE_SPACE)
+                                               {
+                                                       for (i = 0; i < len; i++)
+                                                               nlc[1 + offsetof(T30_INFO, station_id) + T30_MAX_STATION_ID_LENGTH + pos++] = ((byte *)b3_config_parms[2].info)[1 + i];
+                                                       nlc[1 + offsetof(T30_INFO, station_id) + T30_MAX_STATION_ID_LENGTH + pos++] = ' ';
+                                                       nlc[1 + offsetof(T30_INFO, station_id) + T30_MAX_STATION_ID_LENGTH + pos++] = ' ';
+                                               }
+                                       }
+                               }
+
+                               len = (byte)b3_config_parms[3].length;
+                               if (len > CAPI_MAX_HEAD_LINE_SPACE - pos)
+                                       len = (byte)(CAPI_MAX_HEAD_LINE_SPACE - pos);
+                               ((T30_INFO *)&nlc[1])->head_line_len = (byte)(pos + len);
+                               nlc[0] += (byte)(pos + len);
+                               for (i = 0; i < len; i++)
+                                       nlc[1 + offsetof(T30_INFO, station_id) + T30_MAX_STATION_ID_LENGTH + pos++] =  ((byte *)b3_config_parms[3].info)[1 + i];
+                       } else
+                               ((T30_INFO *)&nlc[1])->head_line_len = 0;
+
+                       plci->nsf_control_bits = 0;
+                       if (plci->B3_prot == 5)
+                       {
+                               if ((plci->adapter->man_profile.private_options & (1L << PRIVATE_FAX_SUB_SEP_PWD))
+                                   && (GET_WORD((byte *)b3_config_parms[1].info) & 0x8000)) /* Private SUB/SEP/PWD enable */
+                               {
+                                       plci->requested_options |= 1L << PRIVATE_FAX_SUB_SEP_PWD;
+                               }
+                               if ((plci->adapter->man_profile.private_options & (1L << PRIVATE_FAX_NONSTANDARD))
+                                   && (GET_WORD((byte *)b3_config_parms[1].info) & 0x4000)) /* Private non-standard facilities enable */
+                               {
+                                       plci->requested_options |= 1L << PRIVATE_FAX_NONSTANDARD;
+                               }
+                               if ((plci->requested_options_conn | plci->requested_options | plci->adapter->requested_options_table[plci->appl->Id - 1])
+                                   & ((1L << PRIVATE_FAX_SUB_SEP_PWD) | (1L << PRIVATE_FAX_NONSTANDARD)))
+                               {
+                                       if ((plci->requested_options_conn | plci->requested_options | plci->adapter->requested_options_table[plci->appl->Id - 1])
+                                           & (1L << PRIVATE_FAX_SUB_SEP_PWD))
+                                       {
+                                               fax_control_bits |= T30_CONTROL_BIT_ACCEPT_SUBADDRESS | T30_CONTROL_BIT_ACCEPT_PASSWORD;
+                                               if (fax_control_bits & T30_CONTROL_BIT_ACCEPT_POLLING)
+                                                       fax_control_bits |= T30_CONTROL_BIT_ACCEPT_SEL_POLLING;
+                                       }
+                                       len = nlc[0];
+                                       pos = offsetof(T30_INFO, station_id) + T30_MAX_STATION_ID_LENGTH;
+                                       if (pos < plci->fax_connect_info_length)
+                                       {
+                                               for (i = 1 + plci->fax_connect_info_buffer[pos]; i != 0; i--)
+                                                       nlc[++len] = plci->fax_connect_info_buffer[pos++];
+                                       }
+                                       else
+                                               nlc[++len] = 0;
+                                       if (pos < plci->fax_connect_info_length)
+                                       {
+                                               for (i = 1 + plci->fax_connect_info_buffer[pos]; i != 0; i--)
+                                                       nlc[++len] = plci->fax_connect_info_buffer[pos++];
+                                       }
+                                       else
+                                               nlc[++len] = 0;
+                                       if ((plci->requested_options_conn | plci->requested_options | plci->adapter->requested_options_table[plci->appl->Id - 1])
+                                           & (1L << PRIVATE_FAX_NONSTANDARD))
+                                       {
+                                               if ((pos < plci->fax_connect_info_length) && (plci->fax_connect_info_buffer[pos] != 0))
+                                               {
+                                                       if ((plci->fax_connect_info_buffer[pos] >= 3) && (plci->fax_connect_info_buffer[pos + 1] >= 2))
+                                                               plci->nsf_control_bits = GET_WORD(&plci->fax_connect_info_buffer[pos + 2]);
+                                                       for (i = 1 + plci->fax_connect_info_buffer[pos]; i != 0; i--)
+                                                               nlc[++len] = plci->fax_connect_info_buffer[pos++];
+                                               }
+                                               else
+                                               {
+                                                       if (api_parse(&b3_config->info[1], (word)b3_config->length, "wwsss", b3_config_parms))
+                                                       {
+                                                               dbug(1, dprintf("non-standard facilities info missing or wrong format"));
+                                                               nlc[++len] = 0;
+                                                       }
+                                                       else
+                                                       {
+                                                               if ((b3_config_parms[4].length >= 3) && (b3_config_parms[4].info[1] >= 2))
+                                                                       plci->nsf_control_bits = GET_WORD(&b3_config_parms[4].info[2]);
+                                                               nlc[++len] = (byte)(b3_config_parms[4].length);
+                                                               for (i = 0; i < b3_config_parms[4].length; i++)
+                                                                       nlc[++len] = b3_config_parms[4].info[1 + i];
+                                                       }
+                                               }
+                                       }
+                                       nlc[0] = len;
+                                       if ((plci->nsf_control_bits & T30_NSF_CONTROL_BIT_ENABLE_NSF)
+                                           && (plci->nsf_control_bits & T30_NSF_CONTROL_BIT_NEGOTIATE_RESP))
+                                       {
+                                               ((T30_INFO *)&nlc[1])->operating_mode = T30_OPERATING_MODE_CAPI_NEG;
+                                       }
+                               }
+                       }
+
+                       PUT_WORD(&(((T30_INFO *)&nlc[1])->control_bits_low), fax_control_bits);
+                       len = offsetof(T30_INFO, station_id) + T30_MAX_STATION_ID_LENGTH;
+                       for (i = 0; i < len; i++)
+                               plci->fax_connect_info_buffer[i] = nlc[1 + i];
+                       ((T30_INFO *) plci->fax_connect_info_buffer)->head_line_len = 0;
+                       i += ((T30_INFO *)&nlc[1])->head_line_len;
+                       while (i < nlc[0])
+                               plci->fax_connect_info_buffer[len++] = nlc[++i];
+                       plci->fax_connect_info_length = len;
+               }
+               else
+               {
+                       nlc[0] = 14;
+                       if (b3_config->length != 16)
+                               return _B3_PARM_NOT_SUPPORTED;
+                       for (i = 0; i < 12; i++) nlc[1 + i] = b3_config->info[1 + i];
+                       if (GET_WORD(&b3_config->info[13]) != 8 && GET_WORD(&b3_config->info[13]) != 128)
+                               return _B3_PARM_NOT_SUPPORTED;
+                       nlc[13] = b3_config->info[13];
+                       if (GET_WORD(&b3_config->info[15]) >= nlc[13])
+                               return _B3_PARM_NOT_SUPPORTED;
+                       nlc[14] = b3_config->info[15];
+               }
+       }
+       else
+       {
+               if (plci->B3_prot == 4
+                   || plci->B3_prot == 5 /*T.30 - FAX*/) return _B3_PARM_NOT_SUPPORTED;
+       }
+       add_p(plci, NLC, nlc);
+       return 0;
 }
 
 /*----------------------------------------------------------------*/
@@ -8567,136 +8567,136 @@ static word add_b23(PLCI *plci, API_PARSE *bp)
 /*      B3 Configuration for modem:                               */
 /*          empty                                                 */
 /*----------------------------------------------------------------*/
-static word add_modem_b23 (PLCI  * plci, API_PARSE* bp_parms)
-{
-  static byte lli[12] = {1,1};
-  static byte llc[3] = {2,0,0};
-  static byte dlc[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
-    API_PARSE mdm_config[2];
-  word i;
-  word b2_config = 0;
-
-  for(i=0;i<2;i++) mdm_config[i].length = 0;
-  for(i=0;i<sizeof(dlc);i++) dlc[i] = 0;
-
-  if (((GET_WORD(bp_parms[0].info) == B1_MODEM_ALL_NEGOTIATE)
-    && (GET_WORD(bp_parms[1].info) != B2_MODEM_EC_COMPRESSION))
-   || ((GET_WORD(bp_parms[0].info) != B1_MODEM_ALL_NEGOTIATE)
-    && (GET_WORD(bp_parms[1].info) != B2_TRANSPARENT)))
-  {
-    return (_B_STACK_NOT_SUPPORTED);
-  }
-  if ((GET_WORD(bp_parms[2].info) != B3_MODEM)
-   && (GET_WORD(bp_parms[2].info) != B3_TRANSPARENT))
-  {
-    return (_B_STACK_NOT_SUPPORTED);
-  }
-
-  plci->B2_prot = (byte) GET_WORD(bp_parms[1].info);
-  plci->B3_prot = (byte) GET_WORD(bp_parms[2].info);
-
-  if ((GET_WORD(bp_parms[1].info) == B2_MODEM_EC_COMPRESSION) && bp_parms[4].length)
-  {
-    if (api_parse (&bp_parms[4].info[1],
-                  (word)bp_parms[4].length, "w",
-                  mdm_config))
-    {
-      return (_WRONG_MESSAGE_FORMAT);
-    }
-    b2_config = GET_WORD(mdm_config[0].info);
-  }
-
-  /* OK, L2 is modem */
-
-  lli[0] = 1;
-  lli[1] = 1;
-  if (plci->adapter->manufacturer_features & MANUFACTURER_FEATURE_XONOFF_FLOW_CONTROL)
-    lli[1] |= 2;
-  if (plci->adapter->manufacturer_features & MANUFACTURER_FEATURE_OOB_CHANNEL)
-    lli[1] |= 4;
-
-  if ((lli[1] & 0x02) && (diva_xdi_extended_features & DIVA_CAPI_USE_CMA)) {
-    lli[1] |= 0x10;
-    if (plci->rx_dma_descriptor <= 0) {
-      plci->rx_dma_descriptor=diva_get_dma_descriptor(plci,&plci->rx_dma_magic);
-      if (plci->rx_dma_descriptor >= 0)
-        plci->rx_dma_descriptor++;
-    }
-    if (plci->rx_dma_descriptor > 0) {
-      lli[1] |= 0x40;
-      lli[0] = 6;
-      lli[2] = (byte)(plci->rx_dma_descriptor - 1);
-      lli[3] = (byte)plci->rx_dma_magic;
-      lli[4] = (byte)(plci->rx_dma_magic >>  8);
-      lli[5] = (byte)(plci->rx_dma_magic >> 16);
-      lli[6] = (byte)(plci->rx_dma_magic >> 24);
-    }
-  }
-
-  if (DIVA_CAPI_SUPPORTS_NO_CANCEL(plci->adapter)) {
-    lli[1] |= 0x20;
-  }
-
-  llc[1] = (plci->call_dir & (CALL_DIR_ORIGINATE | CALL_DIR_FORCE_OUTG_NL)) ?
-    /*V42*/ 10 : /*V42_IN*/ 9;
-  llc[2] = 4;                      /* pass L3 always transparent */
-  add_p(plci, LLI, lli);
-  add_p(plci, LLC, llc);
-  i =  1;
-  PUT_WORD (&dlc[i], plci->appl->MaxDataLength);
-  i += 2;
-  if (GET_WORD(bp_parms[1].info) == B2_MODEM_EC_COMPRESSION)
-  {
-    if (bp_parms[4].length)
-  {
-    dbug(1, dprintf("MDM b2_config=%02x", b2_config));
-    dlc[i++] = 3; /* Addr A */
-    dlc[i++] = 1; /* Addr B */
-    dlc[i++] = 7; /* modulo mode */
-    dlc[i++] = 7; /* window size */
-    dlc[i++] = 0; /* XID len Lo  */
-    dlc[i++] = 0; /* XID len Hi  */
-
-    if (b2_config & MDM_B2_DISABLE_V42bis)
-    {
-      dlc[i] |= DLC_MODEMPROT_DISABLE_V42_V42BIS;
-    }
-    if (b2_config & MDM_B2_DISABLE_MNP)
-    {
-      dlc[i] |= DLC_MODEMPROT_DISABLE_MNP_MNP5;
-    }
-    if (b2_config & MDM_B2_DISABLE_TRANS)
-    {
-      dlc[i] |= DLC_MODEMPROT_REQUIRE_PROTOCOL;
-    }
-    if (b2_config & MDM_B2_DISABLE_V42)
-    {
-      dlc[i] |= DLC_MODEMPROT_DISABLE_V42_DETECT;
-    }
-    if (b2_config & MDM_B2_DISABLE_COMP)
-    {
-      dlc[i] |= DLC_MODEMPROT_DISABLE_COMPRESSION;
-    }
-    i++;
-  }
-  }
-  else
-  {
-    dlc[i++] = 3; /* Addr A */
-    dlc[i++] = 1; /* Addr B */
-    dlc[i++] = 7; /* modulo mode */
-    dlc[i++] = 7; /* window size */
-    dlc[i++] = 0; /* XID len Lo  */
-    dlc[i++] = 0; /* XID len Hi  */
-    dlc[i++] = DLC_MODEMPROT_DISABLE_V42_V42BIS |
-               DLC_MODEMPROT_DISABLE_MNP_MNP5 |
-               DLC_MODEMPROT_DISABLE_V42_DETECT |
-               DLC_MODEMPROT_DISABLE_COMPRESSION;
-  }
-  dlc[0] = (byte)(i - 1);
+static word add_modem_b23(PLCI *plci, API_PARSE *bp_parms)
+{
+       static byte lli[12] = {1,1};
+       static byte llc[3] = {2,0,0};
+       static byte dlc[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
+       API_PARSE mdm_config[2];
+       word i;
+       word b2_config = 0;
+
+       for (i = 0; i < 2; i++) mdm_config[i].length = 0;
+       for (i = 0; i < sizeof(dlc); i++) dlc[i] = 0;
+
+       if (((GET_WORD(bp_parms[0].info) == B1_MODEM_ALL_NEGOTIATE)
+            && (GET_WORD(bp_parms[1].info) != B2_MODEM_EC_COMPRESSION))
+           || ((GET_WORD(bp_parms[0].info) != B1_MODEM_ALL_NEGOTIATE)
+               && (GET_WORD(bp_parms[1].info) != B2_TRANSPARENT)))
+       {
+               return (_B_STACK_NOT_SUPPORTED);
+       }
+       if ((GET_WORD(bp_parms[2].info) != B3_MODEM)
+           && (GET_WORD(bp_parms[2].info) != B3_TRANSPARENT))
+       {
+               return (_B_STACK_NOT_SUPPORTED);
+       }
+
+       plci->B2_prot = (byte) GET_WORD(bp_parms[1].info);
+       plci->B3_prot = (byte) GET_WORD(bp_parms[2].info);
+
+       if ((GET_WORD(bp_parms[1].info) == B2_MODEM_EC_COMPRESSION) && bp_parms[4].length)
+       {
+               if (api_parse(&bp_parms[4].info[1],
+                             (word)bp_parms[4].length, "w",
+                             mdm_config))
+               {
+                       return (_WRONG_MESSAGE_FORMAT);
+               }
+               b2_config = GET_WORD(mdm_config[0].info);
+       }
+
+       /* OK, L2 is modem */
+
+       lli[0] = 1;
+       lli[1] = 1;
+       if (plci->adapter->manufacturer_features & MANUFACTURER_FEATURE_XONOFF_FLOW_CONTROL)
+               lli[1] |= 2;
+       if (plci->adapter->manufacturer_features & MANUFACTURER_FEATURE_OOB_CHANNEL)
+               lli[1] |= 4;
+
+       if ((lli[1] & 0x02) && (diva_xdi_extended_features & DIVA_CAPI_USE_CMA)) {
+               lli[1] |= 0x10;
+               if (plci->rx_dma_descriptor <= 0) {
+                       plci->rx_dma_descriptor = diva_get_dma_descriptor(plci, &plci->rx_dma_magic);
+                       if (plci->rx_dma_descriptor >= 0)
+                               plci->rx_dma_descriptor++;
+               }
+               if (plci->rx_dma_descriptor > 0) {
+                       lli[1] |= 0x40;
+                       lli[0] = 6;
+                       lli[2] = (byte)(plci->rx_dma_descriptor - 1);
+                       lli[3] = (byte)plci->rx_dma_magic;
+                       lli[4] = (byte)(plci->rx_dma_magic >>  8);
+                       lli[5] = (byte)(plci->rx_dma_magic >> 16);
+                       lli[6] = (byte)(plci->rx_dma_magic >> 24);
+               }
+       }
+
+       if (DIVA_CAPI_SUPPORTS_NO_CANCEL(plci->adapter)) {
+               lli[1] |= 0x20;
+       }
+
+       llc[1] = (plci->call_dir & (CALL_DIR_ORIGINATE | CALL_DIR_FORCE_OUTG_NL)) ?
+               /*V42*/ 10 : /*V42_IN*/ 9;
+       llc[2] = 4;                      /* pass L3 always transparent */
+       add_p(plci, LLI, lli);
+       add_p(plci, LLC, llc);
+       i =  1;
+       PUT_WORD(&dlc[i], plci->appl->MaxDataLength);
+       i += 2;
+       if (GET_WORD(bp_parms[1].info) == B2_MODEM_EC_COMPRESSION)
+       {
+               if (bp_parms[4].length)
+               {
+                       dbug(1, dprintf("MDM b2_config=%02x", b2_config));
+                       dlc[i++] = 3; /* Addr A */
+                       dlc[i++] = 1; /* Addr B */
+                       dlc[i++] = 7; /* modulo mode */
+                       dlc[i++] = 7; /* window size */
+                       dlc[i++] = 0; /* XID len Lo  */
+                       dlc[i++] = 0; /* XID len Hi  */
+
+                       if (b2_config & MDM_B2_DISABLE_V42bis)
+                       {
+                               dlc[i] |= DLC_MODEMPROT_DISABLE_V42_V42BIS;
+                       }
+                       if (b2_config & MDM_B2_DISABLE_MNP)
+                       {
+                               dlc[i] |= DLC_MODEMPROT_DISABLE_MNP_MNP5;
+                       }
+                       if (b2_config & MDM_B2_DISABLE_TRANS)
+                       {
+                               dlc[i] |= DLC_MODEMPROT_REQUIRE_PROTOCOL;
+                       }
+                       if (b2_config & MDM_B2_DISABLE_V42)
+                       {
+                               dlc[i] |= DLC_MODEMPROT_DISABLE_V42_DETECT;
+                       }
+                       if (b2_config & MDM_B2_DISABLE_COMP)
+                       {
+                               dlc[i] |= DLC_MODEMPROT_DISABLE_COMPRESSION;
+                       }
+                       i++;
+               }
+       }
+       else
+       {
+               dlc[i++] = 3; /* Addr A */
+               dlc[i++] = 1; /* Addr B */
+               dlc[i++] = 7; /* modulo mode */
+               dlc[i++] = 7; /* window size */
+               dlc[i++] = 0; /* XID len Lo  */
+               dlc[i++] = 0; /* XID len Hi  */
+               dlc[i++] = DLC_MODEMPROT_DISABLE_V42_V42BIS |
+                       DLC_MODEMPROT_DISABLE_MNP_MNP5 |
+                       DLC_MODEMPROT_DISABLE_V42_DETECT |
+                       DLC_MODEMPROT_DISABLE_COMPRESSION;
+       }
+       dlc[0] = (byte)(i - 1);
 /* HexDump ("DLC", sizeof(dlc), &dlc[0]); */
-  add_p(plci, DLC, dlc);
-  return (0);
+       add_p(plci, DLC, dlc);
+       return (0);
 }
 
 
@@ -8706,20 +8706,20 @@ static word add_modem_b23 (PLCI  * plci, API_PARSE* bp_parms)
 
 static void sig_req(PLCI *plci, byte req, byte Id)
 {
-  if(!plci) return;
-  if(plci->adapter->adapter_disabled) return;
-  dbug(1,dprintf("sig_req(%x)",req));
-  if (req == REMOVE)
-    plci->sig_remove_id = plci->Sig.Id;
-  if(plci->req_in==plci->req_in_start) {
-    plci->req_in +=2;
-    plci->RBuffer[plci->req_in++] = 0;
-  }
-  PUT_WORD(&plci->RBuffer[plci->req_in_start], plci->req_in-plci->req_in_start-2);
-  plci->RBuffer[plci->req_in++] = Id;   /* sig/nl flag */
-  plci->RBuffer[plci->req_in++] = req;  /* request */
-  plci->RBuffer[plci->req_in++] = 0;    /* channel */
-  plci->req_in_start = plci->req_in;
+       if (!plci) return;
+       if (plci->adapter->adapter_disabled) return;
+       dbug(1, dprintf("sig_req(%x)", req));
+       if (req == REMOVE)
+               plci->sig_remove_id = plci->Sig.Id;
+       if (plci->req_in == plci->req_in_start) {
+               plci->req_in += 2;
+               plci->RBuffer[plci->req_in++] = 0;
+       }
+       PUT_WORD(&plci->RBuffer[plci->req_in_start], plci->req_in-plci->req_in_start - 2);
+       plci->RBuffer[plci->req_in++] = Id;   /* sig/nl flag */
+       plci->RBuffer[plci->req_in++] = req;  /* request */
+       plci->RBuffer[plci->req_in++] = 0;    /* channel */
+       plci->req_in_start = plci->req_in;
 }
 
 /*------------------------------------------------------------------*/
@@ -8728,198 +8728,198 @@ static void sig_req(PLCI *plci, byte req, byte Id)
 
 static void nl_req_ncci(PLCI *plci, byte req, byte ncci)
 {
-  if(!plci) return;
-  if(plci->adapter->adapter_disabled) return;
-  dbug(1,dprintf("nl_req %02x %02x %02x", plci->Id, req, ncci));
-  if (req == REMOVE)
-  {
-    plci->nl_remove_id = plci->NL.Id;
-    ncci_remove (plci, 0, (byte)(ncci != 0));
-    ncci = 0;
-  }
-  if(plci->req_in==plci->req_in_start) {
-    plci->req_in +=2;
-    plci->RBuffer[plci->req_in++] = 0;
-  }
-  PUT_WORD(&plci->RBuffer[plci->req_in_start], plci->req_in-plci->req_in_start-2);
-  plci->RBuffer[plci->req_in++] = 1;    /* sig/nl flag */
-  plci->RBuffer[plci->req_in++] = req;  /* request */
-  plci->RBuffer[plci->req_in++] = plci->adapter->ncci_ch[ncci];   /* channel */
-  plci->req_in_start = plci->req_in;
+       if (!plci) return;
+       if (plci->adapter->adapter_disabled) return;
+       dbug(1, dprintf("nl_req %02x %02x %02x", plci->Id, req, ncci));
+       if (req == REMOVE)
+       {
+               plci->nl_remove_id = plci->NL.Id;
+               ncci_remove(plci, 0, (byte)(ncci != 0));
+               ncci = 0;
+       }
+       if (plci->req_in == plci->req_in_start) {
+               plci->req_in += 2;
+               plci->RBuffer[plci->req_in++] = 0;
+       }
+       PUT_WORD(&plci->RBuffer[plci->req_in_start], plci->req_in-plci->req_in_start - 2);
+       plci->RBuffer[plci->req_in++] = 1;    /* sig/nl flag */
+       plci->RBuffer[plci->req_in++] = req;  /* request */
+       plci->RBuffer[plci->req_in++] = plci->adapter->ncci_ch[ncci];   /* channel */
+       plci->req_in_start = plci->req_in;
 }
 
 static void send_req(PLCI *plci)
 {
-  ENTITY   * e;
-  word l;
+       ENTITY *e;
+       word l;
 /*  word i; */
 
-  if(!plci) return;
-  if(plci->adapter->adapter_disabled) return;
-  channel_xmit_xon (plci);
-
-        /* if nothing to do, return */
-  if(plci->req_in==plci->req_out) return;
-  dbug(1,dprintf("send_req(in=%d,out=%d)",plci->req_in,plci->req_out));
-
-  if(plci->nl_req || plci->sig_req) return;
-
-  l = GET_WORD(&plci->RBuffer[plci->req_out]);
-  plci->req_out += 2;
-  plci->XData[0].P = &plci->RBuffer[plci->req_out];
-  plci->req_out += l;
-  if(plci->RBuffer[plci->req_out]==1)
-  {
-    e = &plci->NL;
-    plci->req_out++;
-    e->Req = plci->nl_req = plci->RBuffer[plci->req_out++];
-    e->ReqCh = plci->RBuffer[plci->req_out++];
-    if(!(e->Id & 0x1f))
-    {
-      e->Id = NL_ID;
-      plci->RBuffer[plci->req_out-4] = CAI;
-      plci->RBuffer[plci->req_out-3] = 1;
-      plci->RBuffer[plci->req_out-2] = (plci->Sig.Id==0xff) ? 0 : plci->Sig.Id;
-      plci->RBuffer[plci->req_out-1] = 0;
-      l+=3;
-      plci->nl_global_req = plci->nl_req;
-    }
-    dbug(1,dprintf("%x:NLREQ(%x:%x:%x)",plci->adapter->Id,e->Id,e->Req,e->ReqCh));
-  }
-  else
-  {
-    e = &plci->Sig;
-    if(plci->RBuffer[plci->req_out])
-      e->Id = plci->RBuffer[plci->req_out];
-    plci->req_out++;
-    e->Req = plci->sig_req = plci->RBuffer[plci->req_out++];
-    e->ReqCh = plci->RBuffer[plci->req_out++];
-    if(!(e->Id & 0x1f))
-      plci->sig_global_req = plci->sig_req;
-    dbug(1,dprintf("%x:SIGREQ(%x:%x:%x)",plci->adapter->Id,e->Id,e->Req,e->ReqCh));
-  }
-  plci->XData[0].PLength = l;
-  e->X = plci->XData;
-  plci->adapter->request(e);
-  dbug(1,dprintf("send_ok"));
+       if (!plci) return;
+       if (plci->adapter->adapter_disabled) return;
+       channel_xmit_xon(plci);
+
+       /* if nothing to do, return */
+       if (plci->req_in == plci->req_out) return;
+       dbug(1, dprintf("send_req(in=%d,out=%d)", plci->req_in, plci->req_out));
+
+       if (plci->nl_req || plci->sig_req) return;
+
+       l = GET_WORD(&plci->RBuffer[plci->req_out]);
+       plci->req_out += 2;
+       plci->XData[0].P = &plci->RBuffer[plci->req_out];
+       plci->req_out += l;
+       if (plci->RBuffer[plci->req_out] == 1)
+       {
+               e = &plci->NL;
+               plci->req_out++;
+               e->Req = plci->nl_req = plci->RBuffer[plci->req_out++];
+               e->ReqCh = plci->RBuffer[plci->req_out++];
+               if (!(e->Id & 0x1f))
+               {
+                       e->Id = NL_ID;
+                       plci->RBuffer[plci->req_out - 4] = CAI;
+                       plci->RBuffer[plci->req_out - 3] = 1;
+                       plci->RBuffer[plci->req_out - 2] = (plci->Sig.Id == 0xff) ? 0 : plci->Sig.Id;
+                       plci->RBuffer[plci->req_out - 1] = 0;
+                       l += 3;
+                       plci->nl_global_req = plci->nl_req;
+               }
+               dbug(1, dprintf("%x:NLREQ(%x:%x:%x)", plci->adapter->Id, e->Id, e->Req, e->ReqCh));
+       }
+       else
+       {
+               e = &plci->Sig;
+               if (plci->RBuffer[plci->req_out])
+                       e->Id = plci->RBuffer[plci->req_out];
+               plci->req_out++;
+               e->Req = plci->sig_req = plci->RBuffer[plci->req_out++];
+               e->ReqCh = plci->RBuffer[plci->req_out++];
+               if (!(e->Id & 0x1f))
+                       plci->sig_global_req = plci->sig_req;
+               dbug(1, dprintf("%x:SIGREQ(%x:%x:%x)", plci->adapter->Id, e->Id, e->Req, e->ReqCh));
+       }
+       plci->XData[0].PLength = l;
+       e->X = plci->XData;
+       plci->adapter->request(e);
+       dbug(1, dprintf("send_ok"));
 }
 
 static void send_data(PLCI *plci)
 {
-  DIVA_CAPI_ADAPTER   * a;
-  DATA_B3_DESC   * data;
-  NCCI   *ncci_ptr;
-  word ncci;
-
-  if (!plci->nl_req && plci->ncci_ring_list)
-  {
-    a = plci->adapter;
-    ncci = plci->ncci_ring_list;
-    do
-    {
-      ncci = a->ncci_next[ncci];
-      ncci_ptr = &(a->ncci[ncci]);
-      if (!(a->ncci_ch[ncci]
-         && (a->ch_flow_control[a->ncci_ch[ncci]] & N_OK_FC_PENDING)))
-      {
-        if (ncci_ptr->data_pending)
-        {
-          if ((a->ncci_state[ncci] == CONNECTED)
-           || (a->ncci_state[ncci] == INC_ACT_PENDING)
-           || (plci->send_disc == ncci))
-          {
-            data = &(ncci_ptr->DBuffer[ncci_ptr->data_out]);
-            if ((plci->B2_prot == B2_V120_ASYNC)
-             || (plci->B2_prot == B2_V120_ASYNC_V42BIS)
-             || (plci->B2_prot == B2_V120_BIT_TRANSPARENT))
-            {
-              plci->NData[1].P = TransmitBufferGet (plci->appl, data->P);
-              plci->NData[1].PLength = data->Length;
-              if (data->Flags & 0x10)
-                plci->NData[0].P = v120_break_header;
-              else
-                plci->NData[0].P = v120_default_header;
-              plci->NData[0].PLength = 1 ;
-              plci->NL.XNum = 2;
-              plci->NL.Req = plci->nl_req = (byte)((data->Flags&0x07)<<4 |N_DATA);
-            }
-            else
-            {
-              plci->NData[0].P = TransmitBufferGet (plci->appl, data->P);
-              plci->NData[0].PLength = data->Length;
-              if (data->Flags & 0x10)
-                plci->NL.Req = plci->nl_req = (byte)N_UDATA;
-
-              else if ((plci->B3_prot == B3_RTP) && (data->Flags & 0x01))
-                plci->NL.Req = plci->nl_req = (byte)N_BDATA;
-
-              else
-                plci->NL.Req = plci->nl_req = (byte)((data->Flags&0x07)<<4 |N_DATA);
-            }
-            plci->NL.X = plci->NData;
-            plci->NL.ReqCh = a->ncci_ch[ncci];
-            dbug(1,dprintf("%x:DREQ(%x:%x)",a->Id,plci->NL.Id,plci->NL.Req));
-            plci->data_sent = true;
-            plci->data_sent_ptr = data->P;
-            a->request(&plci->NL);
-          }
-          else {
-            cleanup_ncci_data (plci, ncci);
-          }
-        }
-        else if (plci->send_disc == ncci)
-        {
-          /* dprintf("N_DISC"); */
-          plci->NData[0].PLength = 0;
-          plci->NL.ReqCh = a->ncci_ch[ncci];
-          plci->NL.Req = plci->nl_req = N_DISC;
-          a->request(&plci->NL);
-          plci->command = _DISCONNECT_B3_R;
-          plci->send_disc = 0;
-        }
-      }
-    } while (!plci->nl_req && (ncci != plci->ncci_ring_list));
-    plci->ncci_ring_list = ncci;
-  }
+       DIVA_CAPI_ADAPTER *a;
+       DATA_B3_DESC *data;
+       NCCI   *ncci_ptr;
+       word ncci;
+
+       if (!plci->nl_req && plci->ncci_ring_list)
+       {
+               a = plci->adapter;
+               ncci = plci->ncci_ring_list;
+               do
+               {
+                       ncci = a->ncci_next[ncci];
+                       ncci_ptr = &(a->ncci[ncci]);
+                       if (!(a->ncci_ch[ncci]
+                             && (a->ch_flow_control[a->ncci_ch[ncci]] & N_OK_FC_PENDING)))
+                       {
+                               if (ncci_ptr->data_pending)
+                               {
+                                       if ((a->ncci_state[ncci] == CONNECTED)
+                                           || (a->ncci_state[ncci] == INC_ACT_PENDING)
+                                           || (plci->send_disc == ncci))
+                                       {
+                                               data = &(ncci_ptr->DBuffer[ncci_ptr->data_out]);
+                                               if ((plci->B2_prot == B2_V120_ASYNC)
+                                                   || (plci->B2_prot == B2_V120_ASYNC_V42BIS)
+                                                   || (plci->B2_prot == B2_V120_BIT_TRANSPARENT))
+                                               {
+                                                       plci->NData[1].P = TransmitBufferGet(plci->appl, data->P);
+                                                       plci->NData[1].PLength = data->Length;
+                                                       if (data->Flags & 0x10)
+                                                               plci->NData[0].P = v120_break_header;
+                                                       else
+                                                               plci->NData[0].P = v120_default_header;
+                                                       plci->NData[0].PLength = 1;
+                                                       plci->NL.XNum = 2;
+                                                       plci->NL.Req = plci->nl_req = (byte)((data->Flags & 0x07) << 4 | N_DATA);
+                                               }
+                                               else
+                                               {
+                                                       plci->NData[0].P = TransmitBufferGet(plci->appl, data->P);
+                                                       plci->NData[0].PLength = data->Length;
+                                                       if (data->Flags & 0x10)
+                                                               plci->NL.Req = plci->nl_req = (byte)N_UDATA;
+
+                                                       else if ((plci->B3_prot == B3_RTP) && (data->Flags & 0x01))
+                                                               plci->NL.Req = plci->nl_req = (byte)N_BDATA;
+
+                                                       else
+                                                               plci->NL.Req = plci->nl_req = (byte)((data->Flags & 0x07) << 4 | N_DATA);
+                                               }
+                                               plci->NL.X = plci->NData;
+                                               plci->NL.ReqCh = a->ncci_ch[ncci];
+                                               dbug(1, dprintf("%x:DREQ(%x:%x)", a->Id, plci->NL.Id, plci->NL.Req));
+                                               plci->data_sent = true;
+                                               plci->data_sent_ptr = data->P;
+                                               a->request(&plci->NL);
+                                       }
+                                       else {
+                                               cleanup_ncci_data(plci, ncci);
+                                       }
+                               }
+                               else if (plci->send_disc == ncci)
+                               {
+                                       /* dprintf("N_DISC"); */
+                                       plci->NData[0].PLength = 0;
+                                       plci->NL.ReqCh = a->ncci_ch[ncci];
+                                       plci->NL.Req = plci->nl_req = N_DISC;
+                                       a->request(&plci->NL);
+                                       plci->command = _DISCONNECT_B3_R;
+                                       plci->send_disc = 0;
+                               }
+                       }
+               } while (!plci->nl_req && (ncci != plci->ncci_ring_list));
+               plci->ncci_ring_list = ncci;
+       }
 }
 
 static void listen_check(DIVA_CAPI_ADAPTER *a)
 {
-  word i,j;
-  PLCI   * plci;
-  byte activnotifiedcalls = 0;
-
-  dbug(1,dprintf("listen_check(%d,%d)",a->listen_active,a->max_listen));
-  if (!remove_started && !a->adapter_disabled)
-  {
-    for(i=0;i<a->max_plci;i++)
-    {
-      plci = &(a->plci[i]);
-      if(plci->notifiedcall) activnotifiedcalls++;
-    }
-    dbug(1,dprintf("listen_check(%d)",activnotifiedcalls));
-
-    for(i=a->listen_active; i < ((word)(a->max_listen+activnotifiedcalls)); i++) {
-      if((j=get_plci(a))) {
-        a->listen_active++;
-        plci = &a->plci[j-1];
-        plci->State = LISTENING;
-
-        add_p(plci,OAD,"\x01\xfd");
-
-        add_p(plci,KEY,"\x04\x43\x41\x32\x30");
-
-        add_p(plci,CAI,"\x01\xc0");
-        add_p(plci,UID,"\x06\x43\x61\x70\x69\x32\x30");
-        add_p(plci,LLI,"\x01\xc4");                  /* support Dummy CR FAC + MWI + SpoofNotify */       
-        add_p(plci,SHIFT|6,NULL);
-        add_p(plci,SIN,"\x02\x00\x00");
-        plci->internal_command = LISTEN_SIG_ASSIGN_PEND;     /* do indicate_req if OK  */
-        sig_req(plci,ASSIGN,DSIG_ID);
-        send_req(plci);
-      }
-    }
-  }
+       word i, j;
+       PLCI *plci;
+       byte activnotifiedcalls = 0;
+
+       dbug(1, dprintf("listen_check(%d,%d)", a->listen_active, a->max_listen));
+       if (!remove_started && !a->adapter_disabled)
+       {
+               for (i = 0; i < a->max_plci; i++)
+               {
+                       plci = &(a->plci[i]);
+                       if (plci->notifiedcall) activnotifiedcalls++;
+               }
+               dbug(1, dprintf("listen_check(%d)", activnotifiedcalls));
+
+               for (i = a->listen_active; i < ((word)(a->max_listen + activnotifiedcalls)); i++) {
+                       if ((j = get_plci(a))) {
+                               a->listen_active++;
+                               plci = &a->plci[j - 1];
+                               plci->State = LISTENING;
+
+                               add_p(plci, OAD, "\x01\xfd");
+
+                               add_p(plci, KEY, "\x04\x43\x41\x32\x30");
+
+                               add_p(plci, CAI, "\x01\xc0");
+                               add_p(plci, UID, "\x06\x43\x61\x70\x69\x32\x30");
+                               add_p(plci, LLI, "\x01\xc4");                  /* support Dummy CR FAC + MWI + SpoofNotify */
+                               add_p(plci, SHIFT | 6, NULL);
+                               add_p(plci, SIN, "\x02\x00\x00");
+                               plci->internal_command = LISTEN_SIG_ASSIGN_PEND;     /* do indicate_req if OK  */
+                               sig_req(plci, ASSIGN, DSIG_ID);
+                               send_req(plci);
+                       }
+               }
+       }
 }
 
 /*------------------------------------------------------------------*/
@@ -8928,83 +8928,83 @@ static void listen_check(DIVA_CAPI_ADAPTER *a)
 
 static void IndParse(PLCI *plci, word *parms_id, byte **parms, byte multiIEsize)
 {
-  word ploc;            /* points to current location within packet */
-  byte w;
-  byte wlen;
-  byte codeset,lock;
-  byte   * in;
-  word i;
-  word code;
-  word mIEindex = 0;
-  ploc = 0;
-  codeset = 0;
-  lock = 0;
-
-  in = plci->Sig.RBuffer->P;
-  for(i=0; i<parms_id[0]; i++)   /* multiIE parms_id contains just the 1st */
-  {                            /* element but parms array is larger      */
-    parms[i] = (byte   *)"";
-  }
-  for(i=0; i<multiIEsize; i++)
-  {
-    parms[i] = (byte   *)"";
-  }
-
-  while(ploc<plci->Sig.RBuffer->length-1) {
-
-        /* read information element id and length                   */
-    w = in[ploc];
-
-    if(w & 0x80) {
+       word ploc;            /* points to current location within packet */
+       byte w;
+       byte wlen;
+       byte codeset, lock;
+       byte *in;
+       word i;
+       word code;
+       word mIEindex = 0;
+       ploc = 0;
+       codeset = 0;
+       lock = 0;
+
+       in = plci->Sig.RBuffer->P;
+       for (i = 0; i < parms_id[0]; i++)   /* multiIE parms_id contains just the 1st */
+       {                            /* element but parms array is larger      */
+               parms[i] = (byte *)"";
+       }
+       for (i = 0; i < multiIEsize; i++)
+       {
+               parms[i] = (byte *)"";
+       }
+
+       while (ploc < plci->Sig.RBuffer->length - 1) {
+
+               /* read information element id and length                   */
+               w = in[ploc];
+
+               if (w & 0x80) {
 /*    w &=0xf0; removed, cannot detect congestion levels */
 /*    upper 4 bit masked with w==SHIFT now               */
-      wlen = 0;
-    }
-    else {
-      wlen = (byte)(in[ploc+1]+1);
-    }
-        /* check if length valid (not exceeding end of packet)      */
-    if((ploc+wlen) > 270) return ;
-    if(lock & 0x80) lock &=0x7f;
-    else codeset = lock;
-
-    if((w&0xf0)==SHIFT) {
-      codeset = in[ploc];
-      if(!(codeset & 0x08)) lock = (byte)(codeset & 7);
-      codeset &=7;
-      lock |=0x80;
-    }
-    else {
-      if(w==ESC && wlen>=3) code = in[ploc+2] |0x800;
-      else code = w;
-      code |= (codeset<<8);
-
-      for(i=1; i<parms_id[0]+1 && parms_id[i]!=code; i++);
-
-      if(i<parms_id[0]+1) {
-        if(!multiIEsize) { /* with multiIEs use next field index,          */
-          mIEindex = i-1;    /* with normal IEs use same index like parms_id */
-        }
-
-        parms[mIEindex] = &in[ploc+1];
-        dbug(1,dprintf("mIE[%d]=0x%x",*parms[mIEindex],in[ploc]));
-        if(parms_id[i]==OAD
-        || parms_id[i]==CONN_NR
-        || parms_id[i]==CAD) {
-          if(in[ploc+2] &0x80) {
-            in[ploc+0] = (byte)(in[ploc+1]+1);
-            in[ploc+1] = (byte)(in[ploc+2] &0x7f);
-            in[ploc+2] = 0x80;
-            parms[mIEindex] = &in[ploc];
-          }
-        }
-        mIEindex++;       /* effects multiIEs only */
-      }
-    }
-
-    ploc +=(wlen+1);
-  }
-  return ;
+                       wlen = 0;
+               }
+               else {
+                       wlen = (byte)(in[ploc + 1] + 1);
+               }
+               /* check if length valid (not exceeding end of packet)      */
+               if ((ploc + wlen) > 270) return;
+               if (lock & 0x80) lock &= 0x7f;
+               else codeset = lock;
+
+               if ((w & 0xf0) == SHIFT) {
+                       codeset = in[ploc];
+                       if (!(codeset & 0x08)) lock = (byte)(codeset & 7);
+                       codeset &= 7;
+                       lock |= 0x80;
+               }
+               else {
+                       if (w == ESC && wlen >= 3) code = in[ploc + 2] | 0x800;
+                       else code = w;
+                       code |= (codeset << 8);
+
+                       for (i = 1; i < parms_id[0] + 1 && parms_id[i] != code; i++);
+
+                       if (i < parms_id[0] + 1) {
+                               if (!multiIEsize) { /* with multiIEs use next field index,          */
+                                       mIEindex = i - 1;    /* with normal IEs use same index like parms_id */
+                               }
+
+                               parms[mIEindex] = &in[ploc + 1];
+                               dbug(1, dprintf("mIE[%d]=0x%x", *parms[mIEindex], in[ploc]));
+                               if (parms_id[i] == OAD
+                                   || parms_id[i] == CONN_NR
+                                   || parms_id[i] == CAD) {
+                                       if (in[ploc + 2] & 0x80) {
+                                               in[ploc + 0] = (byte)(in[ploc + 1] + 1);
+                                               in[ploc + 1] = (byte)(in[ploc + 2] & 0x7f);
+                                               in[ploc + 2] = 0x80;
+                                               parms[mIEindex] = &in[ploc];
+                                       }
+                               }
+                               mIEindex++;       /* effects multiIEs only */
+                       }
+               }
+
+               ploc += (wlen + 1);
+       }
+       return;
 }
 
 /*------------------------------------------------------------------*/
@@ -9013,75 +9013,75 @@ static void IndParse(PLCI *plci, word *parms_id, byte **parms, byte multiIEsize)
 
 static byte ie_compare(byte *ie1, byte *ie2)
 {
-  word i;
-  if(!ie1 || ! ie2) return false;
-  if(!ie1[0]) return false;
-  for(i=0;i<(word)(ie1[0]+1);i++) if(ie1[i]!=ie2[i]) return false;
-  return true;
+       word i;
+       if (!ie1 || !ie2) return false;
+       if (!ie1[0]) return false;
+       for (i = 0; i < (word)(ie1[0] + 1); i++) if (ie1[i] != ie2[i]) return false;
+       return true;
 }
 
 static word find_cip(DIVA_CAPI_ADAPTER *a, byte *bc, byte *hlc)
 {
-  word i;
-  word j;
+       word i;
+       word j;
 
-  for(i=9;i && !ie_compare(bc,cip_bc[i][a->u_law]);i--);
+       for (i = 9; i && !ie_compare(bc, cip_bc[i][a->u_law]); i--);
 
-  for(j=16;j<29 &&
-           (!ie_compare(bc,cip_bc[j][a->u_law]) || !ie_compare(hlc,cip_hlc[j])); j++);
-  if(j==29) return i;
-  return j;
+       for (j = 16; j < 29 &&
+                    (!ie_compare(bc, cip_bc[j][a->u_law]) || !ie_compare(hlc, cip_hlc[j])); j++);
+       if (j == 29) return i;
+       return j;
 }
 
 
-static byte AddInfo(byte   **add_i,
-                    byte   **fty_i,
-                    byte   *esc_chi,
-                    byte *facility)
+static byte AddInfo(byte **add_i,
+                   byte **fty_i,
+                   byte *esc_chi,
+                   byte *facility)
 {
-  byte i;
-  byte j;
-  byte k;
-  byte flen;
-  byte len=0;
-   /* facility is a nested structure */
-   /* FTY can be more than once      */
+       byte i;
+       byte j;
+       byte k;
+       byte flen;
+       byte len = 0;
+       /* facility is a nested structure */
+       /* FTY can be more than once      */
 
        if (esc_chi[0] && !(esc_chi[esc_chi[0]] & 0x7f))
-  {
-    add_i[0] = (byte   *)"\x02\x02\x00"; /* use neither b nor d channel */
-  }
-
-  else
-  {
-    add_i[0] = (byte   *)"";
-  }
-  if(!fty_i[0][0])
-  {
-    add_i[3] = (byte   *)"";
-  }
-  else
-  {    /* facility array found  */
-    for(i=0,j=1;i<MAX_MULTI_IE && fty_i[i][0];i++)
-    {
-      dbug(1,dprintf("AddIFac[%d]",fty_i[i][0]));
-      len += fty_i[i][0];
-      len += 2;
-      flen=fty_i[i][0];
-      facility[j++]=0x1c; /* copy fac IE */
-      for(k=0;k<=flen;k++,j++)
-      {
-        facility[j]=fty_i[i][k];
-/*      dbug(1,dprintf("%x ",facility[j])); */
-      }
-    }
-    facility[0] = len;
-    add_i[3] = facility;
-  }
-/*  dbug(1,dprintf("FacArrLen=%d ",len)); */
-  len = add_i[0][0]+add_i[1][0]+add_i[2][0]+add_i[3][0];
-  len += 4;                          /* calculate length of all */
-  return(len);
+       {
+               add_i[0] = (byte *)"\x02\x02\x00"; /* use neither b nor d channel */
+       }
+
+       else
+       {
+               add_i[0] = (byte *)"";
+       }
+       if (!fty_i[0][0])
+       {
+               add_i[3] = (byte *)"";
+       }
+       else
+       {    /* facility array found  */
+               for (i = 0, j = 1; i < MAX_MULTI_IE && fty_i[i][0]; i++)
+               {
+                       dbug(1, dprintf("AddIFac[%d]", fty_i[i][0]));
+                       len += fty_i[i][0];
+                       len += 2;
+                       flen = fty_i[i][0];
+                       facility[j++] = 0x1c; /* copy fac IE */
+                       for (k = 0; k <= flen; k++, j++)
+                       {
+                               facility[j] = fty_i[i][k];
+/*      dbug(1, dprintf("%x ",facility[j])); */
+                       }
+               }
+               facility[0] = len;
+               add_i[3] = facility;
+       }
+/*  dbug(1, dprintf("FacArrLen=%d ",len)); */
+       len = add_i[0][0] + add_i[1][0] + add_i[2][0] + add_i[3][0];
+       len += 4;                          /* calculate length of all */
+       return (len);
 }
 
 /*------------------------------------------------------------------*/
@@ -9090,219 +9090,219 @@ static byte AddInfo(byte   **add_i,
 
 static void SetVoiceChannel(PLCI *plci, byte *chi, DIVA_CAPI_ADAPTER *a)
 {
-  byte voice_chi[] = "\x02\x18\x01";
-  byte channel;
-
-  channel = chi[chi[0]]&0x3;
-  dbug(1,dprintf("ExtDevON(Ch=0x%x)",channel));
-  voice_chi[2] = (channel) ? channel : 1;
-  add_p(plci,FTY,"\x02\x01\x07");             /* B On, default on 1 */
-  add_p(plci,ESC,voice_chi);                  /* Channel */
-  sig_req(plci,TEL_CTRL,0);
-  send_req(plci);
-  if(a->AdvSignalPLCI)
-  {
-    adv_voice_write_coefs (a->AdvSignalPLCI, ADV_VOICE_WRITE_ACTIVATION);
-  }
+       byte voice_chi[] = "\x02\x18\x01";
+       byte channel;
+
+       channel = chi[chi[0]] & 0x3;
+       dbug(1, dprintf("ExtDevON(Ch=0x%x)", channel));
+       voice_chi[2] = (channel) ? channel : 1;
+       add_p(plci, FTY, "\x02\x01\x07");             /* B On, default on 1 */
+       add_p(plci, ESC, voice_chi);                  /* Channel */
+       sig_req(plci, TEL_CTRL, 0);
+       send_req(plci);
+       if (a->AdvSignalPLCI)
+       {
+               adv_voice_write_coefs(a->AdvSignalPLCI, ADV_VOICE_WRITE_ACTIVATION);
+       }
 }
 
 static void VoiceChannelOff(PLCI *plci)
 {
-  dbug(1,dprintf("ExtDevOFF"));
-  add_p(plci,FTY,"\x02\x01\x08");             /* B Off */
-  sig_req(plci,TEL_CTRL,0);
-  send_req(plci);
-  if(plci->adapter->AdvSignalPLCI)
-  {
-    adv_voice_clear_config (plci->adapter->AdvSignalPLCI);
-  }
+       dbug(1, dprintf("ExtDevOFF"));
+       add_p(plci, FTY, "\x02\x01\x08");             /* B Off */
+       sig_req(plci, TEL_CTRL, 0);
+       send_req(plci);
+       if (plci->adapter->AdvSignalPLCI)
+       {
+               adv_voice_clear_config(plci->adapter->AdvSignalPLCI);
+       }
 }
 
 
 static word AdvCodecSupport(DIVA_CAPI_ADAPTER *a, PLCI *plci, APPL *appl,
                            byte hook_listen)
 {
-  word j;
-  PLCI   *splci;
-
-  /* check if hardware supports handset with hook states (adv.codec) */
-  /* or if just a on board codec is supported                        */
-  /* the advanced codec plci is just for internal use                */
-
-  /* diva Pro with on-board codec:                                   */
-  if(a->profile.Global_Options & HANDSET)
-  {
-    /* new call, but hook states are already signalled */
-    if(a->AdvCodecFLAG)
-    {
-      if(a->AdvSignalAppl!=appl || a->AdvSignalPLCI)
-      {
-        dbug(1,dprintf("AdvSigPlci=0x%x",a->AdvSignalPLCI));
-        return 0x2001; /* codec in use by another application */
-      }
-      if(plci!=NULL)
-      {
-        a->AdvSignalPLCI = plci;
-        plci->tel=ADV_VOICE;
-      }
-      return 0;                      /* adv codec still used */
-    }
-    if((j=get_plci(a)))
-    {
-      splci = &a->plci[j-1];
-      splci->tel = CODEC_PERMANENT;
-      /* hook_listen indicates if a facility_req with handset/hook support */
-      /* was sent. Otherwise if just a call on an external device was made */
-      /* the codec will be used but the hook info will be discarded (just  */
-      /* the external controller is in use                                 */
-      if(hook_listen) splci->State = ADVANCED_VOICE_SIG;
-      else
-      {
-        splci->State = ADVANCED_VOICE_NOSIG;
-        if(plci)
-        {
-          plci->spoofed_msg = SPOOFING_REQUIRED;
-        }
-                                               /* indicate D-ch connect if  */
-      }                                        /* codec is connected OK     */
-      if(plci!=NULL)
-      {
-        a->AdvSignalPLCI = plci;
-        plci->tel=ADV_VOICE;
-      }
-      a->AdvSignalAppl = appl;
-      a->AdvCodecFLAG = true;
-      a->AdvCodecPLCI = splci;
-      add_p(splci,CAI,"\x01\x15");
-      add_p(splci,LLI,"\x01\x00");
-      add_p(splci,ESC,"\x02\x18\x00");
-      add_p(splci,UID,"\x06\x43\x61\x70\x69\x32\x30");
-      splci->internal_command = PERM_COD_ASSIGN;
-      dbug(1,dprintf("Codec Assign"));
-      sig_req(splci,ASSIGN,DSIG_ID);
-      send_req(splci);
-    }
-    else
-    {
-      return 0x2001; /* wrong state, no more plcis */
-    }
-  }
-  else if(a->profile.Global_Options & ON_BOARD_CODEC)
-  {
-    if(hook_listen) return 0x300B;               /* Facility not supported */
-                                                 /* no hook with SCOM      */
-    if(plci!=NULL) plci->tel = CODEC;
-    dbug(1,dprintf("S/SCOM codec"));
-    /* first time we use the scom-s codec we must shut down the internal   */
-    /* handset application of the card. This can be done by an assign with */
-    /* a cai with the 0x80 bit set. Assign return code is 'out of resource'*/
-    if(!a->scom_appl_disable){
-      if((j=get_plci(a))) {
-        splci = &a->plci[j-1];
-        add_p(splci,CAI,"\x01\x80");
-        add_p(splci,UID,"\x06\x43\x61\x70\x69\x32\x30");
-        sig_req(splci,ASSIGN,0xC0);  /* 0xc0 is the TEL_ID */
-        send_req(splci);
-        a->scom_appl_disable = true;
-      }
-      else{
-        return 0x2001; /* wrong state, no more plcis */
-      }
-    }
-  }
-  else return 0x300B;               /* Facility not supported */
-
-  return 0;
+       word j;
+       PLCI *splci;
+
+       /* check if hardware supports handset with hook states (adv.codec) */
+       /* or if just a on board codec is supported                        */
+       /* the advanced codec plci is just for internal use                */
+
+       /* diva Pro with on-board codec:                                   */
+       if (a->profile.Global_Options & HANDSET)
+       {
+               /* new call, but hook states are already signalled */
+               if (a->AdvCodecFLAG)
+               {
+                       if (a->AdvSignalAppl != appl || a->AdvSignalPLCI)
+                       {
+                               dbug(1, dprintf("AdvSigPlci=0x%x", a->AdvSignalPLCI));
+                               return 0x2001; /* codec in use by another application */
+                       }
+                       if (plci != NULL)
+                       {
+                               a->AdvSignalPLCI = plci;
+                               plci->tel = ADV_VOICE;
+                       }
+                       return 0;                      /* adv codec still used */
+               }
+               if ((j = get_plci(a)))
+               {
+                       splci = &a->plci[j - 1];
+                       splci->tel = CODEC_PERMANENT;
+                       /* hook_listen indicates if a facility_req with handset/hook support */
+                       /* was sent. Otherwise if just a call on an external device was made */
+                       /* the codec will be used but the hook info will be discarded (just  */
+                       /* the external controller is in use                                 */
+                       if (hook_listen) splci->State = ADVANCED_VOICE_SIG;
+                       else
+                       {
+                               splci->State = ADVANCED_VOICE_NOSIG;
+                               if (plci)
+                               {
+                                       plci->spoofed_msg = SPOOFING_REQUIRED;
+                               }
+                               /* indicate D-ch connect if  */
+                       }                                        /* codec is connected OK     */
+                       if (plci != NULL)
+                       {
+                               a->AdvSignalPLCI = plci;
+                               plci->tel = ADV_VOICE;
+                       }
+                       a->AdvSignalAppl = appl;
+                       a->AdvCodecFLAG = true;
+                       a->AdvCodecPLCI = splci;
+                       add_p(splci, CAI, "\x01\x15");
+                       add_p(splci, LLI, "\x01\x00");
+                       add_p(splci, ESC, "\x02\x18\x00");
+                       add_p(splci, UID, "\x06\x43\x61\x70\x69\x32\x30");
+                       splci->internal_command = PERM_COD_ASSIGN;
+                       dbug(1, dprintf("Codec Assign"));
+                       sig_req(splci, ASSIGN, DSIG_ID);
+                       send_req(splci);
+               }
+               else
+               {
+                       return 0x2001; /* wrong state, no more plcis */
+               }
+       }
+       else if (a->profile.Global_Options & ON_BOARD_CODEC)
+       {
+               if (hook_listen) return 0x300B;               /* Facility not supported */
+               /* no hook with SCOM      */
+               if (plci != NULL) plci->tel = CODEC;
+               dbug(1, dprintf("S/SCOM codec"));
+               /* first time we use the scom-s codec we must shut down the internal   */
+               /* handset application of the card. This can be done by an assign with */
+               /* a cai with the 0x80 bit set. Assign return code is 'out of resource'*/
+               if (!a->scom_appl_disable) {
+                       if ((j = get_plci(a))) {
+                               splci = &a->plci[j - 1];
+                               add_p(splci, CAI, "\x01\x80");
+                               add_p(splci, UID, "\x06\x43\x61\x70\x69\x32\x30");
+                               sig_req(splci, ASSIGN, 0xC0);  /* 0xc0 is the TEL_ID */
+                               send_req(splci);
+                               a->scom_appl_disable = true;
+                       }
+                       else{
+                               return 0x2001; /* wrong state, no more plcis */
+                       }
+               }
+       }
+       else return 0x300B;               /* Facility not supported */
+
+       return 0;
 }
 
 
 static void CodecIdCheck(DIVA_CAPI_ADAPTER *a, PLCI *plci)
 {
 
-  dbug(1,dprintf("CodecIdCheck"));
+       dbug(1, dprintf("CodecIdCheck"));
 
-  if(a->AdvSignalPLCI == plci)
-  {
-    dbug(1,dprintf("PLCI owns codec"));
-    VoiceChannelOff(a->AdvCodecPLCI);
-    if(a->AdvCodecPLCI->State == ADVANCED_VOICE_NOSIG)
-    {
-      dbug(1,dprintf("remove temp codec PLCI"));
-      plci_remove(a->AdvCodecPLCI);
-      a->AdvCodecFLAG  = 0;
-      a->AdvCodecPLCI  = NULL;
-      a->AdvSignalAppl = NULL;
-    }
-    a->AdvSignalPLCI = NULL;
-  }
+       if (a->AdvSignalPLCI == plci)
+       {
+               dbug(1, dprintf("PLCI owns codec"));
+               VoiceChannelOff(a->AdvCodecPLCI);
+               if (a->AdvCodecPLCI->State == ADVANCED_VOICE_NOSIG)
+               {
+                       dbug(1, dprintf("remove temp codec PLCI"));
+                       plci_remove(a->AdvCodecPLCI);
+                       a->AdvCodecFLAG  = 0;
+                       a->AdvCodecPLCI  = NULL;
+                       a->AdvSignalAppl = NULL;
+               }
+               a->AdvSignalPLCI = NULL;
+       }
 }
 
 /* -------------------------------------------------------------------
-    Ask for physical address of card on PCI bus
+   Ask for physical address of card on PCI bus
    ------------------------------------------------------------------- */
-static void diva_ask_for_xdi_sdram_bar (DIVA_CAPI_ADAPTER  * a,
-                                        IDI_SYNC_REQ  * preq) {
-  a->sdram_bar = 0;
-  if (diva_xdi_extended_features & DIVA_CAPI_XDI_PROVIDES_SDRAM_BAR) {
-    ENTITY   * e = (ENTITY   *)preq;
+static void diva_ask_for_xdi_sdram_bar(DIVA_CAPI_ADAPTER *a,
+                                      IDI_SYNC_REQ *preq) {
+       a->sdram_bar = 0;
+       if (diva_xdi_extended_features & DIVA_CAPI_XDI_PROVIDES_SDRAM_BAR) {
+               ENTITY *e = (ENTITY *)preq;
 
-    e->user[0] = a->Id - 1;
-    preq->xdi_sdram_bar.info.bar    = 0;
-    preq->xdi_sdram_bar.Req         = 0;
-    preq->xdi_sdram_bar.Rc           = IDI_SYNC_REQ_XDI_GET_ADAPTER_SDRAM_BAR;
+               e->user[0] = a->Id - 1;
+               preq->xdi_sdram_bar.info.bar    = 0;
+               preq->xdi_sdram_bar.Req         = 0;
+               preq->xdi_sdram_bar.Rc           = IDI_SYNC_REQ_XDI_GET_ADAPTER_SDRAM_BAR;
 
-    (*(a->request))(e);
+               (*(a->request))(e);
 
-    a->sdram_bar = preq->xdi_sdram_bar.info.bar;
-    dbug(3,dprintf("A(%d) SDRAM BAR = %08x", a->Id, a->sdram_bar));
-  }
+               a->sdram_bar = preq->xdi_sdram_bar.info.bar;
+               dbug(3, dprintf("A(%d) SDRAM BAR = %08x", a->Id, a->sdram_bar));
+       }
 }
 
 /* -------------------------------------------------------------------
-     Ask XDI about extended features
+   Ask XDI about extended features
    ------------------------------------------------------------------- */
-static void diva_get_extended_adapter_features (DIVA_CAPI_ADAPTER  * a) {
-  IDI_SYNC_REQ   * preq;
-    char buffer[              ((sizeof(preq->xdi_extended_features)+4) > sizeof(ENTITY)) ?                     (sizeof(preq->xdi_extended_features)+4) : sizeof(ENTITY)];
-
-    char features[4];
-  preq = (IDI_SYNC_REQ   *)&buffer[0];
-
-  if (!diva_xdi_extended_features) {
-    ENTITY   * e = (ENTITY   *)preq;
-    diva_xdi_extended_features |= 0x80000000;
-
-    e->user[0] = a->Id - 1;
-    preq->xdi_extended_features.Req = 0;
-    preq->xdi_extended_features.Rc  = IDI_SYNC_REQ_XDI_GET_EXTENDED_FEATURES;
-    preq->xdi_extended_features.info.buffer_length_in_bytes = sizeof(features);
-    preq->xdi_extended_features.info.features = &features[0];
-
-    (*(a->request))(e);
-
-    if (features[0] & DIVA_XDI_EXTENDED_FEATURES_VALID) {
-      /*
-         Check features located in the byte '0'
-         */
-      if (features[0] & DIVA_XDI_EXTENDED_FEATURE_CMA) {
-        diva_xdi_extended_features |= DIVA_CAPI_USE_CMA;
-      }
-      if (features[0] & DIVA_XDI_EXTENDED_FEATURE_RX_DMA) {
-        diva_xdi_extended_features |= DIVA_CAPI_XDI_PROVIDES_RX_DMA;
-        dbug(1,dprintf("XDI provides RxDMA"));
-      }
-      if (features[0] & DIVA_XDI_EXTENDED_FEATURE_SDRAM_BAR) {
-        diva_xdi_extended_features |= DIVA_CAPI_XDI_PROVIDES_SDRAM_BAR;
-      }
-      if (features[0] & DIVA_XDI_EXTENDED_FEATURE_NO_CANCEL_RC) {
-        diva_xdi_extended_features |= DIVA_CAPI_XDI_PROVIDES_NO_CANCEL;
-        dbug(3,dprintf("XDI provides NO_CANCEL_RC feature"));
-      }
-
-    }
-  }
-
-  diva_ask_for_xdi_sdram_bar (a, preq);
+static void diva_get_extended_adapter_features(DIVA_CAPI_ADAPTER *a) {
+       IDI_SYNC_REQ *preq;
+       char buffer[((sizeof(preq->xdi_extended_features) + 4) > sizeof(ENTITY)) ? (sizeof(preq->xdi_extended_features) + 4) : sizeof(ENTITY)];
+
+       char features[4];
+       preq = (IDI_SYNC_REQ *)&buffer[0];
+
+       if (!diva_xdi_extended_features) {
+               ENTITY *e = (ENTITY *)preq;
+               diva_xdi_extended_features |= 0x80000000;
+
+               e->user[0] = a->Id - 1;
+               preq->xdi_extended_features.Req = 0;
+               preq->xdi_extended_features.Rc  = IDI_SYNC_REQ_XDI_GET_EXTENDED_FEATURES;
+               preq->xdi_extended_features.info.buffer_length_in_bytes = sizeof(features);
+               preq->xdi_extended_features.info.features = &features[0];
+
+               (*(a->request))(e);
+
+               if (features[0] & DIVA_XDI_EXTENDED_FEATURES_VALID) {
+                       /*
+                         Check features located in the byte '0'
+                       */
+                       if (features[0] & DIVA_XDI_EXTENDED_FEATURE_CMA) {
+                               diva_xdi_extended_features |= DIVA_CAPI_USE_CMA;
+                       }
+                       if (features[0] & DIVA_XDI_EXTENDED_FEATURE_RX_DMA) {
+                               diva_xdi_extended_features |= DIVA_CAPI_XDI_PROVIDES_RX_DMA;
+                               dbug(1, dprintf("XDI provides RxDMA"));
+                       }
+                       if (features[0] & DIVA_XDI_EXTENDED_FEATURE_SDRAM_BAR) {
+                               diva_xdi_extended_features |= DIVA_CAPI_XDI_PROVIDES_SDRAM_BAR;
+                       }
+                       if (features[0] & DIVA_XDI_EXTENDED_FEATURE_NO_CANCEL_RC) {
+                               diva_xdi_extended_features |= DIVA_CAPI_XDI_PROVIDES_NO_CANCEL;
+                               dbug(3, dprintf("XDI provides NO_CANCEL_RC feature"));
+                       }
+
+               }
+       }
+
+       diva_ask_for_xdi_sdram_bar(a, preq);
 }
 
 /*------------------------------------------------------------------*/
@@ -9310,188 +9310,188 @@ static void diva_get_extended_adapter_features (DIVA_CAPI_ADAPTER  * a) {
 /*------------------------------------------------------------------*/
 /* called from OS specific part after init time to get the Law              */
 /* a-law (Euro) and u-law (us,japan) use different BCs in the Setup message */
-void AutomaticLaw(DIVA_CAPI_ADAPTER   *a)
-{
-  word j;
-  PLCI   *splci;
-
-  if(a->automatic_law) {
-    return;
-  }
-  if((j=get_plci(a))) {
-    diva_get_extended_adapter_features (a);
-    splci = &a->plci[j-1];
-    a->automatic_lawPLCI = splci;
-    a->automatic_law = 1;
-    add_p(splci,CAI,"\x01\x80");
-    add_p(splci,UID,"\x06\x43\x61\x70\x69\x32\x30");
-    splci->internal_command = USELAW_REQ;
-    splci->command = 0;
-    splci->number = 0;
-    sig_req(splci,ASSIGN,DSIG_ID);
-    send_req(splci);
-  }
+void AutomaticLaw(DIVA_CAPI_ADAPTER *a)
+{
+       word j;
+       PLCI *splci;
+
+       if (a->automatic_law) {
+               return;
+       }
+       if ((j = get_plci(a))) {
+               diva_get_extended_adapter_features(a);
+               splci = &a->plci[j - 1];
+               a->automatic_lawPLCI = splci;
+               a->automatic_law = 1;
+               add_p(splci, CAI, "\x01\x80");
+               add_p(splci, UID, "\x06\x43\x61\x70\x69\x32\x30");
+               splci->internal_command = USELAW_REQ;
+               splci->command = 0;
+               splci->number = 0;
+               sig_req(splci, ASSIGN, DSIG_ID);
+               send_req(splci);
+       }
 }
 
 /* called from OS specific part if an application sends an Capi20Release */
 word CapiRelease(word Id)
 {
-  word i, j, appls_found;
-  PLCI   *plci;
-  APPL   *this;
-  DIVA_CAPI_ADAPTER   *a;
-
-  if (!Id)
-  {
-    dbug(0,dprintf("A: CapiRelease(Id==0)"));
-    return (_WRONG_APPL_ID);
-  }
-
-  this = &application[Id-1];               /* get application pointer */
-
-  for(i=0,appls_found=0; i<max_appl; i++)
-  {
-    if(application[i].Id)       /* an application has been found        */
-    {
-      appls_found++;
-    }
-  }
-
-  for(i=0; i<max_adapter; i++)             /* scan all adapters...    */
-  {
-    a = &adapter[i];
-    if (a->request)
-    {
-      a->Info_Mask[Id-1] = 0;
-      a->CIP_Mask[Id-1] = 0;
-      a->Notification_Mask[Id-1] = 0;
-      a->codec_listen[Id-1] = NULL;
-      a->requested_options_table[Id-1] = 0;
-      for(j=0; j<a->max_plci; j++)           /* and all PLCIs connected */
-      {                                      /* with this application   */
-        plci = &a->plci[j];
-        if(plci->Id)                         /* if plci owns no application */
-        {                                    /* it may be not jet connected */
-          if(plci->State==INC_CON_PENDING
-          || plci->State==INC_CON_ALERT)
-          {
-            if(test_c_ind_mask_bit (plci, (word)(Id-1)))
-            {
-              clear_c_ind_mask_bit (plci, (word)(Id-1));
-              if(c_ind_mask_empty (plci))
-              {
-                sig_req(plci,HANGUP,0);
-                send_req(plci);
-                plci->State = OUTG_DIS_PENDING;
-              }
-            }
-          }
-          if(test_c_ind_mask_bit (plci, (word)(Id-1)))
-          {
-            clear_c_ind_mask_bit (plci, (word)(Id-1));
-            if(c_ind_mask_empty (plci))
-            {
-              if(!plci->appl)
-              {
-                plci_remove(plci);
-                plci->State = IDLE;
-              }
-            }
-          }
-          if(plci->appl==this)
-          {
-            plci->appl = NULL;
-            plci_remove(plci);
-            plci->State = IDLE;
-          }
-        }
-      }
-      listen_check(a);
-
-      if(a->flag_dynamic_l1_down)
-      {
-        if(appls_found==1)            /* last application does a capi release */
-        {
-          if((j=get_plci(a)))
-          {
-            plci = &a->plci[j-1];
-            plci->command = 0;
-            add_p(plci,OAD,"\x01\xfd");
-            add_p(plci,CAI,"\x01\x80");
-            add_p(plci,UID,"\x06\x43\x61\x70\x69\x32\x30");
-            add_p(plci,SHIFT|6,NULL);
-            add_p(plci,SIN,"\x02\x00\x00");
-            plci->internal_command = REM_L1_SIG_ASSIGN_PEND;
-            sig_req(plci,ASSIGN,DSIG_ID);
-            add_p(plci,FTY,"\x02\xff\x06"); /* l1 down */
-            sig_req(plci,SIG_CTRL,0);
-            send_req(plci);
-          }
-        }
-      }
-      if(a->AdvSignalAppl==this)
-      {
-        this->NullCREnable = false;
-        if (a->AdvCodecPLCI)
-        {
-          plci_remove(a->AdvCodecPLCI);
-          a->AdvCodecPLCI->tel = 0;
-          a->AdvCodecPLCI->adv_nl = 0;
-        }
-        a->AdvSignalAppl = NULL;
-        a->AdvSignalPLCI = NULL;
-        a->AdvCodecFLAG = 0;
-        a->AdvCodecPLCI = NULL;
-      }
-    }
-  }
-
-  this->Id = 0;
-
-  return GOOD;
-}
-
-static word plci_remove_check(PLCI   *plci)
-{
-  if(!plci) return true;
-  if(!plci->NL.Id && c_ind_mask_empty (plci))
-  {
-    if(plci->Sig.Id == 0xff)
-      plci->Sig.Id = 0;
-    if(!plci->Sig.Id)
-    {
-      dbug(1,dprintf("plci_remove_complete(%x)",plci->Id));
-      dbug(1,dprintf("tel=0x%x,Sig=0x%x",plci->tel,plci->Sig.Id));
-      if (plci->Id)
-      {
-        CodecIdCheck(plci->adapter, plci);
-        clear_b1_config (plci);
-        ncci_remove (plci, 0, false);
-        plci_free_msg_in_queue (plci);
-        channel_flow_control_remove (plci);
-        plci->Id = 0;
-        plci->State = IDLE;
-        plci->channels = 0;
-        plci->appl = NULL;
-        plci->notifiedcall = 0;
-      }
-      listen_check(plci->adapter);
-      return true;
-    }
-  }
-  return false;
+       word i, j, appls_found;
+       PLCI *plci;
+       APPL   *this;
+       DIVA_CAPI_ADAPTER *a;
+
+       if (!Id)
+       {
+               dbug(0, dprintf("A: CapiRelease(Id==0)"));
+               return (_WRONG_APPL_ID);
+       }
+
+       this = &application[Id - 1];               /* get application pointer */
+
+       for (i = 0, appls_found = 0; i < max_appl; i++)
+       {
+               if (application[i].Id)       /* an application has been found        */
+               {
+                       appls_found++;
+               }
+       }
+
+       for (i = 0; i < max_adapter; i++)             /* scan all adapters...    */
+       {
+               a = &adapter[i];
+               if (a->request)
+               {
+                       a->Info_Mask[Id - 1] = 0;
+                       a->CIP_Mask[Id - 1] = 0;
+                       a->Notification_Mask[Id - 1] = 0;
+                       a->codec_listen[Id - 1] = NULL;
+                       a->requested_options_table[Id - 1] = 0;
+                       for (j = 0; j < a->max_plci; j++)           /* and all PLCIs connected */
+                       {                                      /* with this application   */
+                               plci = &a->plci[j];
+                               if (plci->Id)                         /* if plci owns no application */
+                               {                                    /* it may be not jet connected */
+                                       if (plci->State == INC_CON_PENDING
+                                           || plci->State == INC_CON_ALERT)
+                                       {
+                                               if (test_c_ind_mask_bit(plci, (word)(Id - 1)))
+                                               {
+                                                       clear_c_ind_mask_bit(plci, (word)(Id - 1));
+                                                       if (c_ind_mask_empty(plci))
+                                                       {
+                                                               sig_req(plci, HANGUP, 0);
+                                                               send_req(plci);
+                                                               plci->State = OUTG_DIS_PENDING;
+                                                       }
+                                               }
+                                       }
+                                       if (test_c_ind_mask_bit(plci, (word)(Id - 1)))
+                                       {
+                                               clear_c_ind_mask_bit(plci, (word)(Id - 1));
+                                               if (c_ind_mask_empty(plci))
+                                               {
+                                                       if (!plci->appl)
+                                                       {
+                                                               plci_remove(plci);
+                                                               plci->State = IDLE;
+                                                       }
+                                               }
+                                       }
+                                       if (plci->appl == this)
+                                       {
+                                               plci->appl = NULL;
+                                               plci_remove(plci);
+                                               plci->State = IDLE;
+                                       }
+                               }
+                       }
+                       listen_check(a);
+
+                       if (a->flag_dynamic_l1_down)
+                       {
+                               if (appls_found == 1)            /* last application does a capi release */
+                               {
+                                       if ((j = get_plci(a)))
+                                       {
+                                               plci = &a->plci[j - 1];
+                                               plci->command = 0;
+                                               add_p(plci, OAD, "\x01\xfd");
+                                               add_p(plci, CAI, "\x01\x80");
+                                               add_p(plci, UID, "\x06\x43\x61\x70\x69\x32\x30");
+                                               add_p(plci, SHIFT | 6, NULL);
+                                               add_p(plci, SIN, "\x02\x00\x00");
+                                               plci->internal_command = REM_L1_SIG_ASSIGN_PEND;
+                                               sig_req(plci, ASSIGN, DSIG_ID);
+                                               add_p(plci, FTY, "\x02\xff\x06"); /* l1 down */
+                                               sig_req(plci, SIG_CTRL, 0);
+                                               send_req(plci);
+                                       }
+                               }
+                       }
+                       if (a->AdvSignalAppl == this)
+                       {
+                               this->NullCREnable = false;
+                               if (a->AdvCodecPLCI)
+                               {
+                                       plci_remove(a->AdvCodecPLCI);
+                                       a->AdvCodecPLCI->tel = 0;
+                                       a->AdvCodecPLCI->adv_nl = 0;
+                               }
+                               a->AdvSignalAppl = NULL;
+                               a->AdvSignalPLCI = NULL;
+                               a->AdvCodecFLAG = 0;
+                               a->AdvCodecPLCI = NULL;
+                       }
+               }
+       }
+
+       this->Id = 0;
+
+       return GOOD;
+}
+
+static word plci_remove_check(PLCI *plci)
+{
+       if (!plci) return true;
+       if (!plci->NL.Id && c_ind_mask_empty(plci))
+       {
+               if (plci->Sig.Id == 0xff)
+                       plci->Sig.Id = 0;
+               if (!plci->Sig.Id)
+               {
+                       dbug(1, dprintf("plci_remove_complete(%x)", plci->Id));
+                       dbug(1, dprintf("tel=0x%x,Sig=0x%x", plci->tel, plci->Sig.Id));
+                       if (plci->Id)
+                       {
+                               CodecIdCheck(plci->adapter, plci);
+                               clear_b1_config(plci);
+                               ncci_remove(plci, 0, false);
+                               plci_free_msg_in_queue(plci);
+                               channel_flow_control_remove(plci);
+                               plci->Id = 0;
+                               plci->State = IDLE;
+                               plci->channels = 0;
+                               plci->appl = NULL;
+                               plci->notifiedcall = 0;
+                       }
+                       listen_check(plci->adapter);
+                       return true;
+               }
+       }
+       return false;
 }
 
 
 /*------------------------------------------------------------------*/
 
-static byte plci_nl_busy (PLCI   *plci)
+static byte plci_nl_busy(PLCI *plci)
 {
-  /* only applicable for non-multiplexed protocols */
-  return (plci->nl_req
-    || (plci->ncci_ring_list
-     && plci->adapter->ncci_ch[plci->ncci_ring_list]
-     && (plci->adapter->ch_flow_control[plci->adapter->ncci_ch[plci->ncci_ring_list]] & N_OK_FC_PENDING)));
+       /* only applicable for non-multiplexed protocols */
+       return (plci->nl_req
+               || (plci->ncci_ring_list
+                   && plci->adapter->ncci_ch[plci->ncci_ring_list]
+                   && (plci->adapter->ch_flow_control[plci->adapter->ncci_ch[plci->ncci_ring_list]] & N_OK_FC_PENDING)));
 }
 
 
@@ -9502,681 +9502,681 @@ static byte plci_nl_busy (PLCI   *plci)
 
 static struct
 {
-  byte send_mask;
-  byte listen_mask;
-  byte character;
-  byte code;
+       byte send_mask;
+       byte listen_mask;
+       byte character;
+       byte code;
 } dtmf_digit_map[] =
 {
-  { 0x01, 0x01, 0x23, DTMF_DIGIT_TONE_CODE_HASHMARK },
-  { 0x01, 0x01, 0x2a, DTMF_DIGIT_TONE_CODE_STAR },
-  { 0x01, 0x01, 0x30, DTMF_DIGIT_TONE_CODE_0 },
-  { 0x01, 0x01, 0x31, DTMF_DIGIT_TONE_CODE_1 },
-  { 0x01, 0x01, 0x32, DTMF_DIGIT_TONE_CODE_2 },
-  { 0x01, 0x01, 0x33, DTMF_DIGIT_TONE_CODE_3 },
-  { 0x01, 0x01, 0x34, DTMF_DIGIT_TONE_CODE_4 },
-  { 0x01, 0x01, 0x35, DTMF_DIGIT_TONE_CODE_5 },
-  { 0x01, 0x01, 0x36, DTMF_DIGIT_TONE_CODE_6 },
-  { 0x01, 0x01, 0x37, DTMF_DIGIT_TONE_CODE_7 },
-  { 0x01, 0x01, 0x38, DTMF_DIGIT_TONE_CODE_8 },
-  { 0x01, 0x01, 0x39, DTMF_DIGIT_TONE_CODE_9 },
-  { 0x01, 0x01, 0x41, DTMF_DIGIT_TONE_CODE_A },
-  { 0x01, 0x01, 0x42, DTMF_DIGIT_TONE_CODE_B },
-  { 0x01, 0x01, 0x43, DTMF_DIGIT_TONE_CODE_C },
-  { 0x01, 0x01, 0x44, DTMF_DIGIT_TONE_CODE_D },
-  { 0x01, 0x00, 0x61, DTMF_DIGIT_TONE_CODE_A },
-  { 0x01, 0x00, 0x62, DTMF_DIGIT_TONE_CODE_B },
-  { 0x01, 0x00, 0x63, DTMF_DIGIT_TONE_CODE_C },
-  { 0x01, 0x00, 0x64, DTMF_DIGIT_TONE_CODE_D },
-
-  { 0x04, 0x04, 0x80, DTMF_SIGNAL_NO_TONE },
-  { 0x00, 0x04, 0x81, DTMF_SIGNAL_UNIDENTIFIED_TONE },
-  { 0x04, 0x04, 0x82, DTMF_SIGNAL_DIAL_TONE },
-  { 0x04, 0x04, 0x83, DTMF_SIGNAL_PABX_INTERNAL_DIAL_TONE },
-  { 0x04, 0x04, 0x84, DTMF_SIGNAL_SPECIAL_DIAL_TONE },
-  { 0x04, 0x04, 0x85, DTMF_SIGNAL_SECOND_DIAL_TONE },
-  { 0x04, 0x04, 0x86, DTMF_SIGNAL_RINGING_TONE },
-  { 0x04, 0x04, 0x87, DTMF_SIGNAL_SPECIAL_RINGING_TONE },
-  { 0x04, 0x04, 0x88, DTMF_SIGNAL_BUSY_TONE },
-  { 0x04, 0x04, 0x89, DTMF_SIGNAL_CONGESTION_TONE },
-  { 0x04, 0x04, 0x8a, DTMF_SIGNAL_SPECIAL_INFORMATION_TONE },
-  { 0x04, 0x04, 0x8b, DTMF_SIGNAL_COMFORT_TONE },
-  { 0x04, 0x04, 0x8c, DTMF_SIGNAL_HOLD_TONE },
-  { 0x04, 0x04, 0x8d, DTMF_SIGNAL_RECORD_TONE },
-  { 0x04, 0x04, 0x8e, DTMF_SIGNAL_CALLER_WAITING_TONE },
-  { 0x04, 0x04, 0x8f, DTMF_SIGNAL_CALL_WAITING_TONE },
-  { 0x04, 0x04, 0x90, DTMF_SIGNAL_PAY_TONE },
-  { 0x04, 0x04, 0x91, DTMF_SIGNAL_POSITIVE_INDICATION_TONE },
-  { 0x04, 0x04, 0x92, DTMF_SIGNAL_NEGATIVE_INDICATION_TONE },
-  { 0x04, 0x04, 0x93, DTMF_SIGNAL_WARNING_TONE },
-  { 0x04, 0x04, 0x94, DTMF_SIGNAL_INTRUSION_TONE },
-  { 0x04, 0x04, 0x95, DTMF_SIGNAL_CALLING_CARD_SERVICE_TONE },
-  { 0x04, 0x04, 0x96, DTMF_SIGNAL_PAYPHONE_RECOGNITION_TONE },
-  { 0x04, 0x04, 0x97, DTMF_SIGNAL_CPE_ALERTING_SIGNAL },
-  { 0x04, 0x04, 0x98, DTMF_SIGNAL_OFF_HOOK_WARNING_TONE },
-  { 0x04, 0x04, 0xbf, DTMF_SIGNAL_INTERCEPT_TONE },
-  { 0x04, 0x04, 0xc0, DTMF_SIGNAL_MODEM_CALLING_TONE },
-  { 0x04, 0x04, 0xc1, DTMF_SIGNAL_FAX_CALLING_TONE },
-  { 0x04, 0x04, 0xc2, DTMF_SIGNAL_ANSWER_TONE },
-  { 0x04, 0x04, 0xc3, DTMF_SIGNAL_REVERSED_ANSWER_TONE },
-  { 0x04, 0x04, 0xc4, DTMF_SIGNAL_ANSAM_TONE },
-  { 0x04, 0x04, 0xc5, DTMF_SIGNAL_REVERSED_ANSAM_TONE },
-  { 0x04, 0x04, 0xc6, DTMF_SIGNAL_BELL103_ANSWER_TONE },
-  { 0x04, 0x04, 0xc7, DTMF_SIGNAL_FAX_FLAGS },
-  { 0x04, 0x04, 0xc8, DTMF_SIGNAL_G2_FAX_GROUP_ID },
-  { 0x00, 0x04, 0xc9, DTMF_SIGNAL_HUMAN_SPEECH },
-  { 0x04, 0x04, 0xca, DTMF_SIGNAL_ANSWERING_MACHINE_390 },
-  { 0x02, 0x02, 0xf1, DTMF_MF_DIGIT_TONE_CODE_1 },
-  { 0x02, 0x02, 0xf2, DTMF_MF_DIGIT_TONE_CODE_2 },
-  { 0x02, 0x02, 0xf3, DTMF_MF_DIGIT_TONE_CODE_3 },
-  { 0x02, 0x02, 0xf4, DTMF_MF_DIGIT_TONE_CODE_4 },
-  { 0x02, 0x02, 0xf5, DTMF_MF_DIGIT_TONE_CODE_5 },
-  { 0x02, 0x02, 0xf6, DTMF_MF_DIGIT_TONE_CODE_6 },
-  { 0x02, 0x02, 0xf7, DTMF_MF_DIGIT_TONE_CODE_7 },
-  { 0x02, 0x02, 0xf8, DTMF_MF_DIGIT_TONE_CODE_8 },
-  { 0x02, 0x02, 0xf9, DTMF_MF_DIGIT_TONE_CODE_9 },
-  { 0x02, 0x02, 0xfa, DTMF_MF_DIGIT_TONE_CODE_0 },
-  { 0x02, 0x02, 0xfb, DTMF_MF_DIGIT_TONE_CODE_K1 },
-  { 0x02, 0x02, 0xfc, DTMF_MF_DIGIT_TONE_CODE_K2 },
-  { 0x02, 0x02, 0xfd, DTMF_MF_DIGIT_TONE_CODE_KP },
-  { 0x02, 0x02, 0xfe, DTMF_MF_DIGIT_TONE_CODE_S1 },
-  { 0x02, 0x02, 0xff, DTMF_MF_DIGIT_TONE_CODE_ST },
+       { 0x01, 0x01, 0x23, DTMF_DIGIT_TONE_CODE_HASHMARK },
+       { 0x01, 0x01, 0x2a, DTMF_DIGIT_TONE_CODE_STAR },
+       { 0x01, 0x01, 0x30, DTMF_DIGIT_TONE_CODE_0 },
+       { 0x01, 0x01, 0x31, DTMF_DIGIT_TONE_CODE_1 },
+       { 0x01, 0x01, 0x32, DTMF_DIGIT_TONE_CODE_2 },
+       { 0x01, 0x01, 0x33, DTMF_DIGIT_TONE_CODE_3 },
+       { 0x01, 0x01, 0x34, DTMF_DIGIT_TONE_CODE_4 },
+       { 0x01, 0x01, 0x35, DTMF_DIGIT_TONE_CODE_5 },
+       { 0x01, 0x01, 0x36, DTMF_DIGIT_TONE_CODE_6 },
+       { 0x01, 0x01, 0x37, DTMF_DIGIT_TONE_CODE_7 },
+       { 0x01, 0x01, 0x38, DTMF_DIGIT_TONE_CODE_8 },
+       { 0x01, 0x01, 0x39, DTMF_DIGIT_TONE_CODE_9 },
+       { 0x01, 0x01, 0x41, DTMF_DIGIT_TONE_CODE_A },
+       { 0x01, 0x01, 0x42, DTMF_DIGIT_TONE_CODE_B },
+       { 0x01, 0x01, 0x43, DTMF_DIGIT_TONE_CODE_C },
+       { 0x01, 0x01, 0x44, DTMF_DIGIT_TONE_CODE_D },
+       { 0x01, 0x00, 0x61, DTMF_DIGIT_TONE_CODE_A },
+       { 0x01, 0x00, 0x62, DTMF_DIGIT_TONE_CODE_B },
+       { 0x01, 0x00, 0x63, DTMF_DIGIT_TONE_CODE_C },
+       { 0x01, 0x00, 0x64, DTMF_DIGIT_TONE_CODE_D },
+
+       { 0x04, 0x04, 0x80, DTMF_SIGNAL_NO_TONE },
+       { 0x00, 0x04, 0x81, DTMF_SIGNAL_UNIDENTIFIED_TONE },
+       { 0x04, 0x04, 0x82, DTMF_SIGNAL_DIAL_TONE },
+       { 0x04, 0x04, 0x83, DTMF_SIGNAL_PABX_INTERNAL_DIAL_TONE },
+       { 0x04, 0x04, 0x84, DTMF_SIGNAL_SPECIAL_DIAL_TONE },
+       { 0x04, 0x04, 0x85, DTMF_SIGNAL_SECOND_DIAL_TONE },
+       { 0x04, 0x04, 0x86, DTMF_SIGNAL_RINGING_TONE },
+       { 0x04, 0x04, 0x87, DTMF_SIGNAL_SPECIAL_RINGING_TONE },
+       { 0x04, 0x04, 0x88, DTMF_SIGNAL_BUSY_TONE },
+       { 0x04, 0x04, 0x89, DTMF_SIGNAL_CONGESTION_TONE },
+       { 0x04, 0x04, 0x8a, DTMF_SIGNAL_SPECIAL_INFORMATION_TONE },
+       { 0x04, 0x04, 0x8b, DTMF_SIGNAL_COMFORT_TONE },
+       { 0x04, 0x04, 0x8c, DTMF_SIGNAL_HOLD_TONE },
+       { 0x04, 0x04, 0x8d, DTMF_SIGNAL_RECORD_TONE },
+       { 0x04, 0x04, 0x8e, DTMF_SIGNAL_CALLER_WAITING_TONE },
+       { 0x04, 0x04, 0x8f, DTMF_SIGNAL_CALL_WAITING_TONE },
+       { 0x04, 0x04, 0x90, DTMF_SIGNAL_PAY_TONE },
+       { 0x04, 0x04, 0x91, DTMF_SIGNAL_POSITIVE_INDICATION_TONE },
+       { 0x04, 0x04, 0x92, DTMF_SIGNAL_NEGATIVE_INDICATION_TONE },
+       { 0x04, 0x04, 0x93, DTMF_SIGNAL_WARNING_TONE },
+       { 0x04, 0x04, 0x94, DTMF_SIGNAL_INTRUSION_TONE },
+       { 0x04, 0x04, 0x95, DTMF_SIGNAL_CALLING_CARD_SERVICE_TONE },
+       { 0x04, 0x04, 0x96, DTMF_SIGNAL_PAYPHONE_RECOGNITION_TONE },
+       { 0x04, 0x04, 0x97, DTMF_SIGNAL_CPE_ALERTING_SIGNAL },
+       { 0x04, 0x04, 0x98, DTMF_SIGNAL_OFF_HOOK_WARNING_TONE },
+       { 0x04, 0x04, 0xbf, DTMF_SIGNAL_INTERCEPT_TONE },
+       { 0x04, 0x04, 0xc0, DTMF_SIGNAL_MODEM_CALLING_TONE },
+       { 0x04, 0x04, 0xc1, DTMF_SIGNAL_FAX_CALLING_TONE },
+       { 0x04, 0x04, 0xc2, DTMF_SIGNAL_ANSWER_TONE },
+       { 0x04, 0x04, 0xc3, DTMF_SIGNAL_REVERSED_ANSWER_TONE },
+       { 0x04, 0x04, 0xc4, DTMF_SIGNAL_ANSAM_TONE },
+       { 0x04, 0x04, 0xc5, DTMF_SIGNAL_REVERSED_ANSAM_TONE },
+       { 0x04, 0x04, 0xc6, DTMF_SIGNAL_BELL103_ANSWER_TONE },
+       { 0x04, 0x04, 0xc7, DTMF_SIGNAL_FAX_FLAGS },
+       { 0x04, 0x04, 0xc8, DTMF_SIGNAL_G2_FAX_GROUP_ID },
+       { 0x00, 0x04, 0xc9, DTMF_SIGNAL_HUMAN_SPEECH },
+       { 0x04, 0x04, 0xca, DTMF_SIGNAL_ANSWERING_MACHINE_390 },
+       { 0x02, 0x02, 0xf1, DTMF_MF_DIGIT_TONE_CODE_1 },
+       { 0x02, 0x02, 0xf2, DTMF_MF_DIGIT_TONE_CODE_2 },
+       { 0x02, 0x02, 0xf3, DTMF_MF_DIGIT_TONE_CODE_3 },
+       { 0x02, 0x02, 0xf4, DTMF_MF_DIGIT_TONE_CODE_4 },
+       { 0x02, 0x02, 0xf5, DTMF_MF_DIGIT_TONE_CODE_5 },
+       { 0x02, 0x02, 0xf6, DTMF_MF_DIGIT_TONE_CODE_6 },
+       { 0x02, 0x02, 0xf7, DTMF_MF_DIGIT_TONE_CODE_7 },
+       { 0x02, 0x02, 0xf8, DTMF_MF_DIGIT_TONE_CODE_8 },
+       { 0x02, 0x02, 0xf9, DTMF_MF_DIGIT_TONE_CODE_9 },
+       { 0x02, 0x02, 0xfa, DTMF_MF_DIGIT_TONE_CODE_0 },
+       { 0x02, 0x02, 0xfb, DTMF_MF_DIGIT_TONE_CODE_K1 },
+       { 0x02, 0x02, 0xfc, DTMF_MF_DIGIT_TONE_CODE_K2 },
+       { 0x02, 0x02, 0xfd, DTMF_MF_DIGIT_TONE_CODE_KP },
+       { 0x02, 0x02, 0xfe, DTMF_MF_DIGIT_TONE_CODE_S1 },
+       { 0x02, 0x02, 0xff, DTMF_MF_DIGIT_TONE_CODE_ST },
 
 };
 
 #define DTMF_DIGIT_MAP_ENTRIES ARRAY_SIZE(dtmf_digit_map)
 
 
-static void dtmf_enable_receiver (PLCI   *plci, byte enable_mask)
+static void dtmf_enable_receiver(PLCI *plci, byte enable_mask)
 {
-  word min_digit_duration, min_gap_duration;
+       word min_digit_duration, min_gap_duration;
 
-  dbug (1, dprintf ("[%06lx] %s,%d: dtmf_enable_receiver %02x",
-    (dword)((plci->Id << 8) | UnMapController (plci->adapter->Id)),
-    (char   *)(FILE_), __LINE__, enable_mask));
+       dbug(1, dprintf("[%06lx] %s,%d: dtmf_enable_receiver %02x",
+                       (dword)((plci->Id << 8) | UnMapController(plci->adapter->Id)),
+                       (char *)(FILE_), __LINE__, enable_mask));
 
-  if (enable_mask != 0)
-  {
-    min_digit_duration = (plci->dtmf_rec_pulse_ms == 0) ? 40 : plci->dtmf_rec_pulse_ms;
-    min_gap_duration = (plci->dtmf_rec_pause_ms == 0) ? 40 : plci->dtmf_rec_pause_ms;
-    plci->internal_req_buffer[0] = DTMF_UDATA_REQUEST_ENABLE_RECEIVER;
-    PUT_WORD (&plci->internal_req_buffer[1], min_digit_duration);
-    PUT_WORD (&plci->internal_req_buffer[3], min_gap_duration);
-    plci->NData[0].PLength = 5;
+       if (enable_mask != 0)
+       {
+               min_digit_duration = (plci->dtmf_rec_pulse_ms == 0) ? 40 : plci->dtmf_rec_pulse_ms;
+               min_gap_duration = (plci->dtmf_rec_pause_ms == 0) ? 40 : plci->dtmf_rec_pause_ms;
+               plci->internal_req_buffer[0] = DTMF_UDATA_REQUEST_ENABLE_RECEIVER;
+               PUT_WORD(&plci->internal_req_buffer[1], min_digit_duration);
+               PUT_WORD(&plci->internal_req_buffer[3], min_gap_duration);
+               plci->NData[0].PLength = 5;
 
-    PUT_WORD (&plci->internal_req_buffer[5], INTERNAL_IND_BUFFER_SIZE);
-    plci->NData[0].PLength += 2;
-    capidtmf_recv_enable (&(plci->capidtmf_state), min_digit_duration, min_gap_duration);
+               PUT_WORD(&plci->internal_req_buffer[5], INTERNAL_IND_BUFFER_SIZE);
+               plci->NData[0].PLength += 2;
+               capidtmf_recv_enable(&(plci->capidtmf_state), min_digit_duration, min_gap_duration);
 
-  }
-  else
-  {
-    plci->internal_req_buffer[0] = DTMF_UDATA_REQUEST_DISABLE_RECEIVER;
-    plci->NData[0].PLength = 1;
+       }
+       else
+       {
+               plci->internal_req_buffer[0] = DTMF_UDATA_REQUEST_DISABLE_RECEIVER;
+               plci->NData[0].PLength = 1;
 
-    capidtmf_recv_disable (&(plci->capidtmf_state));
+               capidtmf_recv_disable(&(plci->capidtmf_state));
 
-  }
-  plci->NData[0].P = plci->internal_req_buffer;
-  plci->NL.X = plci->NData;
-  plci->NL.ReqCh = 0;
-  plci->NL.Req = plci->nl_req = (byte) N_UDATA;
-  plci->adapter->request (&plci->NL);
+       }
+       plci->NData[0].P = plci->internal_req_buffer;
+       plci->NL.X = plci->NData;
+       plci->NL.ReqCh = 0;
+       plci->NL.Req = plci->nl_req = (byte) N_UDATA;
+       plci->adapter->request(&plci->NL);
 }
 
 
-static void dtmf_send_digits (PLCI   *plci, byte   *digit_buffer, word digit_count)
+static void dtmf_send_digits(PLCI *plci, byte *digit_buffer, word digit_count)
 {
-  word w, i;
+       word w, i;
 
-  dbug (1, dprintf ("[%06lx] %s,%d: dtmf_send_digits %d",
-    (dword)((plci->Id << 8) | UnMapController (plci->adapter->Id)),
-    (char   *)(FILE_), __LINE__, digit_count));
+       dbug(1, dprintf("[%06lx] %s,%d: dtmf_send_digits %d",
+                       (dword)((plci->Id << 8) | UnMapController(plci->adapter->Id)),
+                       (char *)(FILE_), __LINE__, digit_count));
 
-  plci->internal_req_buffer[0] = DTMF_UDATA_REQUEST_SEND_DIGITS;
-  w = (plci->dtmf_send_pulse_ms == 0) ? 40 : plci->dtmf_send_pulse_ms;
-  PUT_WORD (&plci->internal_req_buffer[1], w);
-  w = (plci->dtmf_send_pause_ms == 0) ? 40 : plci->dtmf_send_pause_ms;
-  PUT_WORD (&plci->internal_req_buffer[3], w);
-  for (i = 0; i < digit_count; i++)
-  {
-    w = 0;
-    while ((w < DTMF_DIGIT_MAP_ENTRIES)
-      && (digit_buffer[i] != dtmf_digit_map[w].character))
-    {
-      w++;
-    }
-    plci->internal_req_buffer[5+i] = (w < DTMF_DIGIT_MAP_ENTRIES) ?
-      dtmf_digit_map[w].code : DTMF_DIGIT_TONE_CODE_STAR;
-  }
-  plci->NData[0].PLength = 5 + digit_count;
-  plci->NData[0].P = plci->internal_req_buffer;
-  plci->NL.X = plci->NData;
-  plci->NL.ReqCh = 0;
-  plci->NL.Req = plci->nl_req = (byte) N_UDATA;
-  plci->adapter->request (&plci->NL);
+       plci->internal_req_buffer[0] = DTMF_UDATA_REQUEST_SEND_DIGITS;
+       w = (plci->dtmf_send_pulse_ms == 0) ? 40 : plci->dtmf_send_pulse_ms;
+       PUT_WORD(&plci->internal_req_buffer[1], w);
+       w = (plci->dtmf_send_pause_ms == 0) ? 40 : plci->dtmf_send_pause_ms;
+       PUT_WORD(&plci->internal_req_buffer[3], w);
+       for (i = 0; i < digit_count; i++)
+       {
+               w = 0;
+               while ((w < DTMF_DIGIT_MAP_ENTRIES)
+                      && (digit_buffer[i] != dtmf_digit_map[w].character))
+               {
+                       w++;
+               }
+               plci->internal_req_buffer[5 + i] = (w < DTMF_DIGIT_MAP_ENTRIES) ?
+                       dtmf_digit_map[w].code : DTMF_DIGIT_TONE_CODE_STAR;
+       }
+       plci->NData[0].PLength = 5 + digit_count;
+       plci->NData[0].P = plci->internal_req_buffer;
+       plci->NL.X = plci->NData;
+       plci->NL.ReqCh = 0;
+       plci->NL.Req = plci->nl_req = (byte) N_UDATA;
+       plci->adapter->request(&plci->NL);
 }
 
 
-static void dtmf_rec_clear_config (PLCI   *plci)
+static void dtmf_rec_clear_config(PLCI *plci)
 {
 
-  dbug (1, dprintf ("[%06lx] %s,%d: dtmf_rec_clear_config",
-    (dword)((plci->Id << 8) | UnMapController (plci->adapter->Id)),
-    (char   *)(FILE_), __LINE__));
-
-  plci->dtmf_rec_active = 0;
-  plci->dtmf_rec_pulse_ms = 0;
-  plci->dtmf_rec_pause_ms = 0;
-
-  capidtmf_init (&(plci->capidtmf_state), plci->adapter->u_law);
+       dbug(1, dprintf("[%06lx] %s,%d: dtmf_rec_clear_config",
+                       (dword)((plci->Id << 8) | UnMapController(plci->adapter->Id)),
+                       (char *)(FILE_), __LINE__));
 
-}
-
-
-static void dtmf_send_clear_config (PLCI   *plci)
-{
+       plci->dtmf_rec_active = 0;
+       plci->dtmf_rec_pulse_ms = 0;
+       plci->dtmf_rec_pause_ms = 0;
 
-  dbug (1, dprintf ("[%06lx] %s,%d: dtmf_send_clear_config",
-    (dword)((plci->Id << 8) | UnMapController (plci->adapter->Id)),
-    (char   *)(FILE_), __LINE__));
+       capidtmf_init(&(plci->capidtmf_state), plci->adapter->u_law);
 
-  plci->dtmf_send_requests = 0;
-  plci->dtmf_send_pulse_ms = 0;
-  plci->dtmf_send_pause_ms = 0;
 }
 
 
-static void dtmf_prepare_switch (dword Id, PLCI   *plci)
+static void dtmf_send_clear_config(PLCI *plci)
 {
 
-  dbug (1, dprintf ("[%06lx] %s,%d: dtmf_prepare_switch",
-    UnMapId (Id), (char   *)(FILE_), __LINE__));
+       dbug(1, dprintf("[%06lx] %s,%d: dtmf_send_clear_config",
+                       (dword)((plci->Id << 8) | UnMapController(plci->adapter->Id)),
+                       (char *)(FILE_), __LINE__));
 
-  while (plci->dtmf_send_requests != 0)
-    dtmf_confirmation (Id, plci);
+       plci->dtmf_send_requests = 0;
+       plci->dtmf_send_pulse_ms = 0;
+       plci->dtmf_send_pause_ms = 0;
 }
 
 
-static word dtmf_save_config (dword Id, PLCI   *plci, byte Rc)
+static void dtmf_prepare_switch(dword Id, PLCI *plci)
 {
 
-  dbug (1, dprintf ("[%06lx] %s,%d: dtmf_save_config %02x %d",
-    UnMapId (Id), (char   *)(FILE_), __LINE__, Rc, plci->adjust_b_state));
+       dbug(1, dprintf("[%06lx] %s,%d: dtmf_prepare_switch",
+                       UnMapId(Id), (char *)(FILE_), __LINE__));
 
-  return (GOOD);
+       while (plci->dtmf_send_requests != 0)
+               dtmf_confirmation(Id, plci);
 }
 
 
-static word dtmf_restore_config (dword Id, PLCI   *plci, byte Rc)
+static word dtmf_save_config(dword Id, PLCI *plci, byte Rc)
 {
-  word Info;
 
-  dbug (1, dprintf ("[%06lx] %s,%d: dtmf_restore_config %02x %d",
-    UnMapId (Id), (char   *)(FILE_), __LINE__, Rc, plci->adjust_b_state));
+       dbug(1, dprintf("[%06lx] %s,%d: dtmf_save_config %02x %d",
+                       UnMapId(Id), (char *)(FILE_), __LINE__, Rc, plci->adjust_b_state));
 
-  Info = GOOD;
-  if (plci->B1_facilities & B1_FACILITY_DTMFR)
-  {
-    switch (plci->adjust_b_state)
-    {
-    case ADJUST_B_RESTORE_DTMF_1:
-      plci->internal_command = plci->adjust_b_command;
-      if (plci_nl_busy (plci))
-      {
-        plci->adjust_b_state = ADJUST_B_RESTORE_DTMF_1;
-        break;
-      }
-      dtmf_enable_receiver (plci, plci->dtmf_rec_active);
-      plci->adjust_b_state = ADJUST_B_RESTORE_DTMF_2;
-      break;
-    case ADJUST_B_RESTORE_DTMF_2:
-      if ((Rc != OK) && (Rc != OK_FC))
-      {
-        dbug (1, dprintf ("[%06lx] %s,%d: Reenable DTMF receiver failed %02x",
-          UnMapId (Id), (char   *)(FILE_), __LINE__, Rc));
-        Info = _WRONG_STATE;
-        break;
-      }
-      break;
-    }
-  }
-  return (Info);
+       return (GOOD);
 }
 
 
-static void dtmf_command (dword Id, PLCI   *plci, byte Rc)
+static word dtmf_restore_config(dword Id, PLCI *plci, byte Rc)
 {
-  word internal_command, Info;
-  byte mask;
-    byte result[4];
+       word Info;
 
-  dbug (1, dprintf ("[%06lx] %s,%d: dtmf_command %02x %04x %04x %d %d %d %d",
-    UnMapId (Id), (char   *)(FILE_), __LINE__, Rc, plci->internal_command,
-    plci->dtmf_cmd, plci->dtmf_rec_pulse_ms, plci->dtmf_rec_pause_ms,
-    plci->dtmf_send_pulse_ms, plci->dtmf_send_pause_ms));
-
-  Info = GOOD;
-  result[0] = 2;
-  PUT_WORD (&result[1], DTMF_SUCCESS);
-  internal_command = plci->internal_command;
-  plci->internal_command = 0;
-  mask = 0x01;
-  switch (plci->dtmf_cmd)
-  {
+       dbug(1, dprintf("[%06lx] %s,%d: dtmf_restore_config %02x %d",
+                       UnMapId(Id), (char *)(FILE_), __LINE__, Rc, plci->adjust_b_state));
 
-  case DTMF_LISTEN_TONE_START:
-    mask <<= 1;
-  case DTMF_LISTEN_MF_START:
-    mask <<= 1;
-
-  case DTMF_LISTEN_START:
-    switch (internal_command)
-    {
-    default:
-      adjust_b1_resource (Id, plci, NULL, (word)(plci->B1_facilities |
-        B1_FACILITY_DTMFR), DTMF_COMMAND_1);
-    case DTMF_COMMAND_1:
-      if (adjust_b_process (Id, plci, Rc) != GOOD)
-      {
-        dbug (1, dprintf ("[%06lx] %s,%d: Load DTMF failed",
-          UnMapId (Id), (char   *)(FILE_), __LINE__));
-        Info = _FACILITY_NOT_SUPPORTED;
-        break;
-      }
-      if (plci->internal_command)
-        return;
-    case DTMF_COMMAND_2:
-      if (plci_nl_busy (plci))
-      {
-        plci->internal_command = DTMF_COMMAND_2;
-        return;
-      }
-      plci->internal_command = DTMF_COMMAND_3;
-      dtmf_enable_receiver (plci, (byte)(plci->dtmf_rec_active | mask));
-      return;
-    case DTMF_COMMAND_3:
-      if ((Rc != OK) && (Rc != OK_FC))
-      {
-        dbug (1, dprintf ("[%06lx] %s,%d: Enable DTMF receiver failed %02x",
-          UnMapId (Id), (char   *)(FILE_), __LINE__, Rc));
-        Info = _FACILITY_NOT_SUPPORTED;
-        break;
-      }
-
-      plci->tone_last_indication_code = DTMF_SIGNAL_NO_TONE;
-
-      plci->dtmf_rec_active |= mask;
-      break;
-    }
-    break;
-
-
-  case DTMF_LISTEN_TONE_STOP:
-    mask <<= 1;
-  case DTMF_LISTEN_MF_STOP:
-    mask <<= 1;
-
-  case DTMF_LISTEN_STOP:
-    switch (internal_command)
-    {
-    default:
-      plci->dtmf_rec_active &= ~mask;
-      if (plci->dtmf_rec_active)
-        break;
-/*
-    case DTMF_COMMAND_1:
-      if (plci->dtmf_rec_active)
-      {
-        if (plci_nl_busy (plci))
-        {
-          plci->internal_command = DTMF_COMMAND_1;
-          return;
-        }
-        plci->dtmf_rec_active &= ~mask;
-        plci->internal_command = DTMF_COMMAND_2;
-        dtmf_enable_receiver (plci, false);
-        return;
-      }
-      Rc = OK;
-    case DTMF_COMMAND_2:
-      if ((Rc != OK) && (Rc != OK_FC))
-      {
-        dbug (1, dprintf ("[%06lx] %s,%d: Disable DTMF receiver failed %02x",
-          UnMapId (Id), (char far *)(FILE_), __LINE__, Rc));
-        Info = _FACILITY_NOT_SUPPORTED;
-        break;
-      }
-*/
-      adjust_b1_resource (Id, plci, NULL, (word)(plci->B1_facilities &
-        ~(B1_FACILITY_DTMFX | B1_FACILITY_DTMFR)), DTMF_COMMAND_3);
-    case DTMF_COMMAND_3:
-      if (adjust_b_process (Id, plci, Rc) != GOOD)
-      {
-        dbug (1, dprintf ("[%06lx] %s,%d: Unload DTMF failed",
-          UnMapId (Id), (char   *)(FILE_), __LINE__));
-        Info = _FACILITY_NOT_SUPPORTED;
-        break;
-      }
-      if (plci->internal_command)
-        return;
-      break;
-    }
-    break;
-
-
-  case DTMF_SEND_TONE:
-    mask <<= 1;
-  case DTMF_SEND_MF:
-    mask <<= 1;
-
-  case DTMF_DIGITS_SEND:
-    switch (internal_command)
-    {
-    default:
-      adjust_b1_resource (Id, plci, NULL, (word)(plci->B1_facilities |
-        ((plci->dtmf_parameter_length != 0) ? B1_FACILITY_DTMFX | B1_FACILITY_DTMFR : B1_FACILITY_DTMFX)),
-        DTMF_COMMAND_1);
-    case DTMF_COMMAND_1:
-      if (adjust_b_process (Id, plci, Rc) != GOOD)
-      {
-        dbug (1, dprintf ("[%06lx] %s,%d: Load DTMF failed",
-          UnMapId (Id), (char   *)(FILE_), __LINE__));
-        Info = _FACILITY_NOT_SUPPORTED;
-        break;
-      }
-      if (plci->internal_command)
-        return;
-    case DTMF_COMMAND_2:
-      if (plci_nl_busy (plci))
-      {
-        plci->internal_command = DTMF_COMMAND_2;
-        return;
-      }
-      plci->dtmf_msg_number_queue[(plci->dtmf_send_requests)++] = plci->number;
-      plci->internal_command = DTMF_COMMAND_3;
-      dtmf_send_digits (plci, &plci->saved_msg.parms[3].info[1], plci->saved_msg.parms[3].length);
-      return;
-    case DTMF_COMMAND_3:
-      if ((Rc != OK) && (Rc != OK_FC))
-      {
-        dbug (1, dprintf ("[%06lx] %s,%d: Send DTMF digits failed %02x",
-          UnMapId (Id), (char   *)(FILE_), __LINE__, Rc));
-        if (plci->dtmf_send_requests != 0)
-          (plci->dtmf_send_requests)--;
-        Info = _FACILITY_NOT_SUPPORTED;
-        break;
-      }
-      return;
-    }
-    break;
-  }
-  sendf (plci->appl, _FACILITY_R | CONFIRM, Id & 0xffffL, plci->number,
-    "wws", Info, SELECTOR_DTMF, result);
+       Info = GOOD;
+       if (plci->B1_facilities & B1_FACILITY_DTMFR)
+       {
+               switch (plci->adjust_b_state)
+               {
+               case ADJUST_B_RESTORE_DTMF_1:
+                       plci->internal_command = plci->adjust_b_command;
+                       if (plci_nl_busy(plci))
+                       {
+                               plci->adjust_b_state = ADJUST_B_RESTORE_DTMF_1;
+                               break;
+                       }
+                       dtmf_enable_receiver(plci, plci->dtmf_rec_active);
+                       plci->adjust_b_state = ADJUST_B_RESTORE_DTMF_2;
+                       break;
+               case ADJUST_B_RESTORE_DTMF_2:
+                       if ((Rc != OK) && (Rc != OK_FC))
+                       {
+                               dbug(1, dprintf("[%06lx] %s,%d: Reenable DTMF receiver failed %02x",
+                                               UnMapId(Id), (char *)(FILE_), __LINE__, Rc));
+                               Info = _WRONG_STATE;
+                               break;
+                       }
+                       break;
+               }
+       }
+       return (Info);
 }
 
 
-static byte dtmf_request (dword Id, word Number, DIVA_CAPI_ADAPTER   *a, PLCI   *plci, APPL   *appl, API_PARSE *msg)
+static void dtmf_command(dword Id, PLCI *plci, byte Rc)
 {
-  word Info;
-  word i, j;
-  byte mask;
-    API_PARSE dtmf_parms[5];
-    byte result[40];
+       word internal_command, Info;
+       byte mask;
+       byte result[4];
 
-  dbug (1, dprintf ("[%06lx] %s,%d: dtmf_request",
-    UnMapId (Id), (char   *)(FILE_), __LINE__));
+       dbug(1, dprintf("[%06lx] %s,%d: dtmf_command %02x %04x %04x %d %d %d %d",
+                       UnMapId(Id), (char *)(FILE_), __LINE__, Rc, plci->internal_command,
+                       plci->dtmf_cmd, plci->dtmf_rec_pulse_ms, plci->dtmf_rec_pause_ms,
+                       plci->dtmf_send_pulse_ms, plci->dtmf_send_pause_ms));
 
-  Info = GOOD;
-  result[0] = 2;
-  PUT_WORD (&result[1], DTMF_SUCCESS);
-  if (!(a->profile.Global_Options & GL_DTMF_SUPPORTED))
-  {
-    dbug (1, dprintf ("[%06lx] %s,%d: Facility not supported",
-      UnMapId (Id), (char   *)(FILE_), __LINE__));
-    Info = _FACILITY_NOT_SUPPORTED;
-  }
-  else if (api_parse (&msg[1].info[1], msg[1].length, "w", dtmf_parms))
-  {
-    dbug (1, dprintf ("[%06lx] %s,%d: Wrong message format",
-      UnMapId (Id), (char   *)(FILE_), __LINE__));
-    Info = _WRONG_MESSAGE_FORMAT;
-  }
+       Info = GOOD;
+       result[0] = 2;
+       PUT_WORD(&result[1], DTMF_SUCCESS);
+       internal_command = plci->internal_command;
+       plci->internal_command = 0;
+       mask = 0x01;
+       switch (plci->dtmf_cmd)
+       {
 
-  else if ((GET_WORD (dtmf_parms[0].info) == DTMF_GET_SUPPORTED_DETECT_CODES)
-    || (GET_WORD (dtmf_parms[0].info) == DTMF_GET_SUPPORTED_SEND_CODES))
-  {
-    if (!((a->requested_options_table[appl->Id-1])
-        & (1L << PRIVATE_DTMF_TONE)))
-    {
-      dbug (1, dprintf ("[%06lx] %s,%d: DTMF unknown request %04x",
-        UnMapId (Id), (char   *)(FILE_), __LINE__, GET_WORD (dtmf_parms[0].info)));
-      PUT_WORD (&result[1], DTMF_UNKNOWN_REQUEST);
-    }
-    else
-    {
-      for (i = 0; i < 32; i++)
-        result[4 + i] = 0;
-      if (GET_WORD (dtmf_parms[0].info) == DTMF_GET_SUPPORTED_DETECT_CODES)
-      {
-        for (i = 0; i < DTMF_DIGIT_MAP_ENTRIES; i++)
-        {
-          if (dtmf_digit_map[i].listen_mask != 0)
-            result[4 + (dtmf_digit_map[i].character >> 3)] |= (1 << (dtmf_digit_map[i].character & 0x7));
-        }
-      }
-      else
-      {
-        for (i = 0; i < DTMF_DIGIT_MAP_ENTRIES; i++)
-        {
-          if (dtmf_digit_map[i].send_mask != 0)
-            result[4 + (dtmf_digit_map[i].character >> 3)] |= (1 << (dtmf_digit_map[i].character & 0x7));
-        }
-      }
-      result[0] = 3 + 32;
-      result[3] = 32;
-    }
-  }
+       case DTMF_LISTEN_TONE_START:
+               mask <<= 1;
+       case DTMF_LISTEN_MF_START:
+               mask <<= 1;
 
-  else if (plci == NULL)
-  {
-    dbug (1, dprintf ("[%06lx] %s,%d: Wrong PLCI",
-      UnMapId (Id), (char   *)(FILE_), __LINE__));
-    Info = _WRONG_IDENTIFIER;
-  }
-  else
+       case DTMF_LISTEN_START:
+               switch (internal_command)
+               {
+               default:
+                       adjust_b1_resource(Id, plci, NULL, (word)(plci->B1_facilities |
+                                                                 B1_FACILITY_DTMFR), DTMF_COMMAND_1);
+               case DTMF_COMMAND_1:
+                       if (adjust_b_process(Id, plci, Rc) != GOOD)
+                       {
+                               dbug(1, dprintf("[%06lx] %s,%d: Load DTMF failed",
+                                               UnMapId(Id), (char *)(FILE_), __LINE__));
+                               Info = _FACILITY_NOT_SUPPORTED;
+                               break;
+                       }
+                       if (plci->internal_command)
+                               return;
+               case DTMF_COMMAND_2:
+                       if (plci_nl_busy(plci))
+                       {
+                               plci->internal_command = DTMF_COMMAND_2;
+                               return;
+                       }
+                       plci->internal_command = DTMF_COMMAND_3;
+                       dtmf_enable_receiver(plci, (byte)(plci->dtmf_rec_active | mask));
+                       return;
+               case DTMF_COMMAND_3:
+                       if ((Rc != OK) && (Rc != OK_FC))
+                       {
+                               dbug(1, dprintf("[%06lx] %s,%d: Enable DTMF receiver failed %02x",
+                                               UnMapId(Id), (char *)(FILE_), __LINE__, Rc));
+                               Info = _FACILITY_NOT_SUPPORTED;
+                               break;
+                       }
+
+                       plci->tone_last_indication_code = DTMF_SIGNAL_NO_TONE;
+
+                       plci->dtmf_rec_active |= mask;
+                       break;
+               }
+               break;
+
+
+       case DTMF_LISTEN_TONE_STOP:
+               mask <<= 1;
+       case DTMF_LISTEN_MF_STOP:
+               mask <<= 1;
+
+       case DTMF_LISTEN_STOP:
+               switch (internal_command)
+               {
+               default:
+                       plci->dtmf_rec_active &= ~mask;
+                       if (plci->dtmf_rec_active)
+                               break;
+/*
+  case DTMF_COMMAND_1:
+  if (plci->dtmf_rec_active)
   {
-    if (!plci->State
-     || !plci->NL.Id || plci->nl_remove_id)
-    {
-      dbug (1, dprintf ("[%06lx] %s,%d: Wrong state",
-        UnMapId (Id), (char   *)(FILE_), __LINE__));
-      Info = _WRONG_STATE;
-    }
-    else
-    {
-      plci->command = 0;
-      plci->dtmf_cmd = GET_WORD (dtmf_parms[0].info);
-      mask = 0x01;
-      switch (plci->dtmf_cmd)
-      {
-
-      case DTMF_LISTEN_TONE_START:
-      case DTMF_LISTEN_TONE_STOP:
-        mask <<= 1;
-      case DTMF_LISTEN_MF_START:
-      case DTMF_LISTEN_MF_STOP:
-        mask <<= 1;
-        if (!((plci->requested_options_conn | plci->requested_options | plci->adapter->requested_options_table[appl->Id-1])
-          & (1L << PRIVATE_DTMF_TONE)))
-        {
-          dbug (1, dprintf ("[%06lx] %s,%d: DTMF unknown request %04x",
-            UnMapId (Id), (char   *)(FILE_), __LINE__, GET_WORD (dtmf_parms[0].info)));
-          PUT_WORD (&result[1], DTMF_UNKNOWN_REQUEST);
-          break;
-        }
-
-      case DTMF_LISTEN_START:
-      case DTMF_LISTEN_STOP:
-        if (!(a->manufacturer_features & MANUFACTURER_FEATURE_HARDDTMF)
-         && !(a->manufacturer_features & MANUFACTURER_FEATURE_SOFTDTMF_RECEIVE))
-        {
-          dbug (1, dprintf ("[%06lx] %s,%d: Facility not supported",
-            UnMapId (Id), (char   *)(FILE_), __LINE__));
-          Info = _FACILITY_NOT_SUPPORTED;
-          break;
-        }
-        if (mask & DTMF_LISTEN_ACTIVE_FLAG)
-        {
-          if (api_parse (&msg[1].info[1], msg[1].length, "wwws", dtmf_parms))
-          {
-            plci->dtmf_rec_pulse_ms = 0;
-            plci->dtmf_rec_pause_ms = 0;
-          }
-          else
-          {
-            plci->dtmf_rec_pulse_ms = GET_WORD (dtmf_parms[1].info);
-            plci->dtmf_rec_pause_ms = GET_WORD (dtmf_parms[2].info);
-          }
-        }
-        start_internal_command (Id, plci, dtmf_command);
-        return (false);
-
-
-      case DTMF_SEND_TONE:
-        mask <<= 1;
-      case DTMF_SEND_MF:
-        mask <<= 1;
-        if (!((plci->requested_options_conn | plci->requested_options | plci->adapter->requested_options_table[appl->Id-1])
-          & (1L << PRIVATE_DTMF_TONE)))
-        {
-          dbug (1, dprintf ("[%06lx] %s,%d: DTMF unknown request %04x",
-            UnMapId (Id), (char   *)(FILE_), __LINE__, GET_WORD (dtmf_parms[0].info)));
-          PUT_WORD (&result[1], DTMF_UNKNOWN_REQUEST);
-          break;
-        }
-
-      case DTMF_DIGITS_SEND:
-        if (api_parse (&msg[1].info[1], msg[1].length, "wwws", dtmf_parms))
-        {
-          dbug (1, dprintf ("[%06lx] %s,%d: Wrong message format",
-            UnMapId (Id), (char   *)(FILE_), __LINE__));
-          Info = _WRONG_MESSAGE_FORMAT;
-          break;
-        }
-        if (mask & DTMF_LISTEN_ACTIVE_FLAG)
-        {
-          plci->dtmf_send_pulse_ms = GET_WORD (dtmf_parms[1].info);
-          plci->dtmf_send_pause_ms = GET_WORD (dtmf_parms[2].info);
-        }
-        i = 0;
-        j = 0;
-        while ((i < dtmf_parms[3].length) && (j < DTMF_DIGIT_MAP_ENTRIES))
-        {
-          j = 0;
-          while ((j < DTMF_DIGIT_MAP_ENTRIES)
-            && ((dtmf_parms[3].info[i+1] != dtmf_digit_map[j].character)
-             || ((dtmf_digit_map[j].send_mask & mask) == 0)))
-          {
-            j++;
-          }
-          i++;
-        }
-        if (j == DTMF_DIGIT_MAP_ENTRIES)
-        {
-          dbug (1, dprintf ("[%06lx] %s,%d: Incorrect DTMF digit %02x",
-            UnMapId (Id), (char   *)(FILE_), __LINE__, dtmf_parms[3].info[i]));
-          PUT_WORD (&result[1], DTMF_INCORRECT_DIGIT);
-          break;
-        }
-        if (plci->dtmf_send_requests >= ARRAY_SIZE(plci->dtmf_msg_number_queue))
-        {
-          dbug (1, dprintf ("[%06lx] %s,%d: DTMF request overrun",
-            UnMapId (Id), (char   *)(FILE_), __LINE__));
-          Info = _WRONG_STATE;
-          break;
-        }
-        api_save_msg (dtmf_parms, "wwws", &plci->saved_msg);
-        start_internal_command (Id, plci, dtmf_command);
-        return (false);
-
-      default:
-        dbug (1, dprintf ("[%06lx] %s,%d: DTMF unknown request %04x",
-          UnMapId (Id), (char   *)(FILE_), __LINE__, plci->dtmf_cmd));
-        PUT_WORD (&result[1], DTMF_UNKNOWN_REQUEST);
-      }
-    }
-  }
-  sendf (appl, _FACILITY_R | CONFIRM, Id & 0xffffL, Number,
-    "wws", Info, SELECTOR_DTMF, result);
-  return (false);
-}
-
-
-static void dtmf_confirmation (dword Id, PLCI   *plci)
-{
-  word i;
-    byte result[4];
-
-  dbug (1, dprintf ("[%06lx] %s,%d: dtmf_confirmation",
-    UnMapId (Id), (char   *)(FILE_), __LINE__));
-
-  result[0] = 2;
-  PUT_WORD (&result[1], DTMF_SUCCESS);
-  if (plci->dtmf_send_requests != 0)
+  if (plci_nl_busy (plci))
   {
-    sendf (plci->appl, _FACILITY_R | CONFIRM, Id & 0xffffL, plci->dtmf_msg_number_queue[0],
-      "wws", GOOD, SELECTOR_DTMF, result);
-    (plci->dtmf_send_requests)--;
-    for (i = 0; i < plci->dtmf_send_requests; i++)
-      plci->dtmf_msg_number_queue[i] = plci->dtmf_msg_number_queue[i+1];      
+  plci->internal_command = DTMF_COMMAND_1;
+  return;
   }
-}
-
-
-static void dtmf_indication (dword Id, PLCI   *plci, byte   *msg, word length)
-{
-  word i, j, n;
-
-  dbug (1, dprintf ("[%06lx] %s,%d: dtmf_indication",
-    UnMapId (Id), (char   *)(FILE_), __LINE__));
-
-  n = 0;
-  for (i = 1; i < length; i++)
-  {
-    j = 0;
-    while ((j < DTMF_DIGIT_MAP_ENTRIES)
-      && ((msg[i] != dtmf_digit_map[j].code)
-       || ((dtmf_digit_map[j].listen_mask & plci->dtmf_rec_active) == 0)))
-    {
-      j++;
-    }
-    if (j < DTMF_DIGIT_MAP_ENTRIES)
-    {
-
-      if ((dtmf_digit_map[j].listen_mask & DTMF_TONE_LISTEN_ACTIVE_FLAG)
-       && (plci->tone_last_indication_code == DTMF_SIGNAL_NO_TONE)
-       && (dtmf_digit_map[j].character != DTMF_SIGNAL_UNIDENTIFIED_TONE))
-      {
-        if (n + 1 == i)
-        {
-          for (i = length; i > n + 1; i--)
-            msg[i] = msg[i - 1];
-          length++;
-          i++;
-        }
-        msg[++n] = DTMF_SIGNAL_UNIDENTIFIED_TONE;
-      }
-      plci->tone_last_indication_code = dtmf_digit_map[j].character;
-
-      msg[++n] = dtmf_digit_map[j].character;
-    }
+  plci->dtmf_rec_active &= ~mask;
+  plci->internal_command = DTMF_COMMAND_2;
+  dtmf_enable_receiver (plci, false);
+  return;
   }
-  if (n != 0)
+  Rc = OK;
+  case DTMF_COMMAND_2:
+  if ((Rc != OK) && (Rc != OK_FC))
   {
-    msg[0] = (byte) n;
-    sendf (plci->appl, _FACILITY_I, Id & 0xffffL, 0, "wS", SELECTOR_DTMF, msg);
+  dbug (1, dprintf("[%06lx] %s,%d: Disable DTMF receiver failed %02x",
+  UnMapId (Id), (char far *)(FILE_), __LINE__, Rc));
+  Info = _FACILITY_NOT_SUPPORTED;
+  break;
   }
+*/
+                       adjust_b1_resource(Id, plci, NULL, (word)(plci->B1_facilities &
+                                                                 ~(B1_FACILITY_DTMFX | B1_FACILITY_DTMFR)), DTMF_COMMAND_3);
+               case DTMF_COMMAND_3:
+                       if (adjust_b_process(Id, plci, Rc) != GOOD)
+                       {
+                               dbug(1, dprintf("[%06lx] %s,%d: Unload DTMF failed",
+                                               UnMapId(Id), (char *)(FILE_), __LINE__));
+                               Info = _FACILITY_NOT_SUPPORTED;
+                               break;
+                       }
+                       if (plci->internal_command)
+                               return;
+                       break;
+               }
+               break;
+
+
+       case DTMF_SEND_TONE:
+               mask <<= 1;
+       case DTMF_SEND_MF:
+               mask <<= 1;
+
+       case DTMF_DIGITS_SEND:
+               switch (internal_command)
+               {
+               default:
+                       adjust_b1_resource(Id, plci, NULL, (word)(plci->B1_facilities |
+                                                                 ((plci->dtmf_parameter_length != 0) ? B1_FACILITY_DTMFX | B1_FACILITY_DTMFR : B1_FACILITY_DTMFX)),
+                                          DTMF_COMMAND_1);
+               case DTMF_COMMAND_1:
+                       if (adjust_b_process(Id, plci, Rc) != GOOD)
+                       {
+                               dbug(1, dprintf("[%06lx] %s,%d: Load DTMF failed",
+                                               UnMapId(Id), (char *)(FILE_), __LINE__));
+                               Info = _FACILITY_NOT_SUPPORTED;
+                               break;
+                       }
+                       if (plci->internal_command)
+                               return;
+               case DTMF_COMMAND_2:
+                       if (plci_nl_busy(plci))
+                       {
+                               plci->internal_command = DTMF_COMMAND_2;
+                               return;
+                       }
+                       plci->dtmf_msg_number_queue[(plci->dtmf_send_requests)++] = plci->number;
+                       plci->internal_command = DTMF_COMMAND_3;
+                       dtmf_send_digits(plci, &plci->saved_msg.parms[3].info[1], plci->saved_msg.parms[3].length);
+                       return;
+               case DTMF_COMMAND_3:
+                       if ((Rc != OK) && (Rc != OK_FC))
+                       {
+                               dbug(1, dprintf("[%06lx] %s,%d: Send DTMF digits failed %02x",
+                                               UnMapId(Id), (char *)(FILE_), __LINE__, Rc));
+                               if (plci->dtmf_send_requests != 0)
+                                       (plci->dtmf_send_requests)--;
+                               Info = _FACILITY_NOT_SUPPORTED;
+                               break;
+                       }
+                       return;
+               }
+               break;
+       }
+       sendf(plci->appl, _FACILITY_R | CONFIRM, Id & 0xffffL, plci->number,
+             "wws", Info, SELECTOR_DTMF, result);
+}
+
+
+static byte dtmf_request(dword Id, word Number, DIVA_CAPI_ADAPTER *a, PLCI *plci, APPL   *appl, API_PARSE *msg)
+{
+       word Info;
+       word i, j;
+       byte mask;
+       API_PARSE dtmf_parms[5];
+       byte result[40];
+
+       dbug(1, dprintf("[%06lx] %s,%d: dtmf_request",
+                       UnMapId(Id), (char *)(FILE_), __LINE__));
+
+       Info = GOOD;
+       result[0] = 2;
+       PUT_WORD(&result[1], DTMF_SUCCESS);
+       if (!(a->profile.Global_Options & GL_DTMF_SUPPORTED))
+       {
+               dbug(1, dprintf("[%06lx] %s,%d: Facility not supported",
+                               UnMapId(Id), (char *)(FILE_), __LINE__));
+               Info = _FACILITY_NOT_SUPPORTED;
+       }
+       else if (api_parse(&msg[1].info[1], msg[1].length, "w", dtmf_parms))
+       {
+               dbug(1, dprintf("[%06lx] %s,%d: Wrong message format",
+                               UnMapId(Id), (char *)(FILE_), __LINE__));
+               Info = _WRONG_MESSAGE_FORMAT;
+       }
+
+       else if ((GET_WORD(dtmf_parms[0].info) == DTMF_GET_SUPPORTED_DETECT_CODES)
+                || (GET_WORD(dtmf_parms[0].info) == DTMF_GET_SUPPORTED_SEND_CODES))
+       {
+               if (!((a->requested_options_table[appl->Id - 1])
+                     & (1L << PRIVATE_DTMF_TONE)))
+               {
+                       dbug(1, dprintf("[%06lx] %s,%d: DTMF unknown request %04x",
+                                       UnMapId(Id), (char *)(FILE_), __LINE__, GET_WORD(dtmf_parms[0].info)));
+                       PUT_WORD(&result[1], DTMF_UNKNOWN_REQUEST);
+               }
+               else
+               {
+                       for (i = 0; i < 32; i++)
+                               result[4 + i] = 0;
+                       if (GET_WORD(dtmf_parms[0].info) == DTMF_GET_SUPPORTED_DETECT_CODES)
+                       {
+                               for (i = 0; i < DTMF_DIGIT_MAP_ENTRIES; i++)
+                               {
+                                       if (dtmf_digit_map[i].listen_mask != 0)
+                                               result[4 + (dtmf_digit_map[i].character >> 3)] |= (1 << (dtmf_digit_map[i].character & 0x7));
+                               }
+                       }
+                       else
+                       {
+                               for (i = 0; i < DTMF_DIGIT_MAP_ENTRIES; i++)
+                               {
+                                       if (dtmf_digit_map[i].send_mask != 0)
+                                               result[4 + (dtmf_digit_map[i].character >> 3)] |= (1 << (dtmf_digit_map[i].character & 0x7));
+                               }
+                       }
+                       result[0] = 3 + 32;
+                       result[3] = 32;
+               }
+       }
+
+       else if (plci == NULL)
+       {
+               dbug(1, dprintf("[%06lx] %s,%d: Wrong PLCI",
+                               UnMapId(Id), (char *)(FILE_), __LINE__));
+               Info = _WRONG_IDENTIFIER;
+       }
+       else
+       {
+               if (!plci->State
+                   || !plci->NL.Id || plci->nl_remove_id)
+               {
+                       dbug(1, dprintf("[%06lx] %s,%d: Wrong state",
+                                       UnMapId(Id), (char *)(FILE_), __LINE__));
+                       Info = _WRONG_STATE;
+               }
+               else
+               {
+                       plci->command = 0;
+                       plci->dtmf_cmd = GET_WORD(dtmf_parms[0].info);
+                       mask = 0x01;
+                       switch (plci->dtmf_cmd)
+                       {
+
+                       case DTMF_LISTEN_TONE_START:
+                       case DTMF_LISTEN_TONE_STOP:
+                               mask <<= 1;
+                       case DTMF_LISTEN_MF_START:
+                       case DTMF_LISTEN_MF_STOP:
+                               mask <<= 1;
+                               if (!((plci->requested_options_conn | plci->requested_options | plci->adapter->requested_options_table[appl->Id - 1])
+                                     & (1L << PRIVATE_DTMF_TONE)))
+                               {
+                                       dbug(1, dprintf("[%06lx] %s,%d: DTMF unknown request %04x",
+                                                       UnMapId(Id), (char *)(FILE_), __LINE__, GET_WORD(dtmf_parms[0].info)));
+                                       PUT_WORD(&result[1], DTMF_UNKNOWN_REQUEST);
+                                       break;
+                               }
+
+                       case DTMF_LISTEN_START:
+                       case DTMF_LISTEN_STOP:
+                               if (!(a->manufacturer_features & MANUFACTURER_FEATURE_HARDDTMF)
+                                   && !(a->manufacturer_features & MANUFACTURER_FEATURE_SOFTDTMF_RECEIVE))
+                               {
+                                       dbug(1, dprintf("[%06lx] %s,%d: Facility not supported",
+                                                       UnMapId(Id), (char *)(FILE_), __LINE__));
+                                       Info = _FACILITY_NOT_SUPPORTED;
+                                       break;
+                               }
+                               if (mask & DTMF_LISTEN_ACTIVE_FLAG)
+                               {
+                                       if (api_parse(&msg[1].info[1], msg[1].length, "wwws", dtmf_parms))
+                                       {
+                                               plci->dtmf_rec_pulse_ms = 0;
+                                               plci->dtmf_rec_pause_ms = 0;
+                                       }
+                                       else
+                                       {
+                                               plci->dtmf_rec_pulse_ms = GET_WORD(dtmf_parms[1].info);
+                                               plci->dtmf_rec_pause_ms = GET_WORD(dtmf_parms[2].info);
+                                       }
+                               }
+                               start_internal_command(Id, plci, dtmf_command);
+                               return (false);
+
+
+                       case DTMF_SEND_TONE:
+                               mask <<= 1;
+                       case DTMF_SEND_MF:
+                               mask <<= 1;
+                               if (!((plci->requested_options_conn | plci->requested_options | plci->adapter->requested_options_table[appl->Id - 1])
+                                     & (1L << PRIVATE_DTMF_TONE)))
+                               {
+                                       dbug(1, dprintf("[%06lx] %s,%d: DTMF unknown request %04x",
+                                                       UnMapId(Id), (char *)(FILE_), __LINE__, GET_WORD(dtmf_parms[0].info)));
+                                       PUT_WORD(&result[1], DTMF_UNKNOWN_REQUEST);
+                                       break;
+                               }
+
+                       case DTMF_DIGITS_SEND:
+                               if (api_parse(&msg[1].info[1], msg[1].length, "wwws", dtmf_parms))
+                               {
+                                       dbug(1, dprintf("[%06lx] %s,%d: Wrong message format",
+                                                       UnMapId(Id), (char *)(FILE_), __LINE__));
+                                       Info = _WRONG_MESSAGE_FORMAT;
+                                       break;
+                               }
+                               if (mask & DTMF_LISTEN_ACTIVE_FLAG)
+                               {
+                                       plci->dtmf_send_pulse_ms = GET_WORD(dtmf_parms[1].info);
+                                       plci->dtmf_send_pause_ms = GET_WORD(dtmf_parms[2].info);
+                               }
+                               i = 0;
+                               j = 0;
+                               while ((i < dtmf_parms[3].length) && (j < DTMF_DIGIT_MAP_ENTRIES))
+                               {
+                                       j = 0;
+                                       while ((j < DTMF_DIGIT_MAP_ENTRIES)
+                                              && ((dtmf_parms[3].info[i + 1] != dtmf_digit_map[j].character)
+                                                  || ((dtmf_digit_map[j].send_mask & mask) == 0)))
+                                       {
+                                               j++;
+                                       }
+                                       i++;
+                               }
+                               if (j == DTMF_DIGIT_MAP_ENTRIES)
+                               {
+                                       dbug(1, dprintf("[%06lx] %s,%d: Incorrect DTMF digit %02x",
+                                                       UnMapId(Id), (char *)(FILE_), __LINE__, dtmf_parms[3].info[i]));
+                                       PUT_WORD(&result[1], DTMF_INCORRECT_DIGIT);
+                                       break;
+                               }
+                               if (plci->dtmf_send_requests >= ARRAY_SIZE(plci->dtmf_msg_number_queue))
+                               {
+                                       dbug(1, dprintf("[%06lx] %s,%d: DTMF request overrun",
+                                                       UnMapId(Id), (char *)(FILE_), __LINE__));
+                                       Info = _WRONG_STATE;
+                                       break;
+                               }
+                               api_save_msg(dtmf_parms, "wwws", &plci->saved_msg);
+                               start_internal_command(Id, plci, dtmf_command);
+                               return (false);
+
+                       default:
+                               dbug(1, dprintf("[%06lx] %s,%d: DTMF unknown request %04x",
+                                               UnMapId(Id), (char *)(FILE_), __LINE__, plci->dtmf_cmd));
+                               PUT_WORD(&result[1], DTMF_UNKNOWN_REQUEST);
+                       }
+               }
+       }
+       sendf(appl, _FACILITY_R | CONFIRM, Id & 0xffffL, Number,
+             "wws", Info, SELECTOR_DTMF, result);
+       return (false);
+}
+
+
+static void dtmf_confirmation(dword Id, PLCI *plci)
+{
+       word i;
+       byte result[4];
+
+       dbug(1, dprintf("[%06lx] %s,%d: dtmf_confirmation",
+                       UnMapId(Id), (char *)(FILE_), __LINE__));
+
+       result[0] = 2;
+       PUT_WORD(&result[1], DTMF_SUCCESS);
+       if (plci->dtmf_send_requests != 0)
+       {
+               sendf(plci->appl, _FACILITY_R | CONFIRM, Id & 0xffffL, plci->dtmf_msg_number_queue[0],
+                     "wws", GOOD, SELECTOR_DTMF, result);
+               (plci->dtmf_send_requests)--;
+               for (i = 0; i < plci->dtmf_send_requests; i++)
+                       plci->dtmf_msg_number_queue[i] = plci->dtmf_msg_number_queue[i + 1];
+       }
+}
+
+
+static void dtmf_indication(dword Id, PLCI *plci, byte *msg, word length)
+{
+       word i, j, n;
+
+       dbug(1, dprintf("[%06lx] %s,%d: dtmf_indication",
+                       UnMapId(Id), (char *)(FILE_), __LINE__));
+
+       n = 0;
+       for (i = 1; i < length; i++)
+       {
+               j = 0;
+               while ((j < DTMF_DIGIT_MAP_ENTRIES)
+                      && ((msg[i] != dtmf_digit_map[j].code)
+                          || ((dtmf_digit_map[j].listen_mask & plci->dtmf_rec_active) == 0)))
+               {
+                       j++;
+               }
+               if (j < DTMF_DIGIT_MAP_ENTRIES)
+               {
+
+                       if ((dtmf_digit_map[j].listen_mask & DTMF_TONE_LISTEN_ACTIVE_FLAG)
+                           && (plci->tone_last_indication_code == DTMF_SIGNAL_NO_TONE)
+                           && (dtmf_digit_map[j].character != DTMF_SIGNAL_UNIDENTIFIED_TONE))
+                       {
+                               if (n + 1 == i)
+                               {
+                                       for (i = length; i > n + 1; i--)
+                                               msg[i] = msg[i - 1];
+                                       length++;
+                                       i++;
+                               }
+                               msg[++n] = DTMF_SIGNAL_UNIDENTIFIED_TONE;
+                       }
+                       plci->tone_last_indication_code = dtmf_digit_map[j].character;
+
+                       msg[++n] = dtmf_digit_map[j].character;
+               }
+       }
+       if (n != 0)
+       {
+               msg[0] = (byte) n;
+               sendf(plci->appl, _FACILITY_I, Id & 0xffffL, 0, "wS", SELECTOR_DTMF, msg);
+       }
 }
 
 
@@ -10184,90 +10184,90 @@ static void dtmf_indication (dword Id, PLCI   *plci, byte   *msg, word length)
 /* DTMF parameters                                                  */
 /*------------------------------------------------------------------*/
 
-static void dtmf_parameter_write (PLCI   *plci)
+static void dtmf_parameter_write(PLCI *plci)
 {
-  word i;
-    byte parameter_buffer[DTMF_PARAMETER_BUFFER_SIZE + 2];
+       word i;
+       byte parameter_buffer[DTMF_PARAMETER_BUFFER_SIZE + 2];
 
-  dbug (1, dprintf ("[%06lx] %s,%d: dtmf_parameter_write",
-    (dword)((plci->Id << 8) | UnMapController (plci->adapter->Id)),
-    (char   *)(FILE_), __LINE__));
+       dbug(1, dprintf("[%06lx] %s,%d: dtmf_parameter_write",
+                       (dword)((plci->Id << 8) | UnMapController(plci->adapter->Id)),
+                       (char *)(FILE_), __LINE__));
 
-  parameter_buffer[0] = plci->dtmf_parameter_length + 1;
-  parameter_buffer[1] = DSP_CTRL_SET_DTMF_PARAMETERS;
-  for (i = 0; i < plci->dtmf_parameter_length; i++)
-    parameter_buffer[2+i] = plci->dtmf_parameter_buffer[i];
-  add_p (plci, FTY, parameter_buffer);
-  sig_req (plci, TEL_CTRL, 0);
-  send_req (plci);
+       parameter_buffer[0] = plci->dtmf_parameter_length + 1;
+       parameter_buffer[1] = DSP_CTRL_SET_DTMF_PARAMETERS;
+       for (i = 0; i < plci->dtmf_parameter_length; i++)
+               parameter_buffer[2 + i] = plci->dtmf_parameter_buffer[i];
+       add_p(plci, FTY, parameter_buffer);
+       sig_req(plci, TEL_CTRL, 0);
+       send_req(plci);
 }
 
 
-static void dtmf_parameter_clear_config (PLCI   *plci)
+static void dtmf_parameter_clear_config(PLCI *plci)
 {
 
-  dbug (1, dprintf ("[%06lx] %s,%d: dtmf_parameter_clear_config",
-    (dword)((plci->Id << 8) | UnMapController (plci->adapter->Id)),
-    (char   *)(FILE_), __LINE__));
+       dbug(1, dprintf("[%06lx] %s,%d: dtmf_parameter_clear_config",
+                       (dword)((plci->Id << 8) | UnMapController(plci->adapter->Id)),
+                       (char *)(FILE_), __LINE__));
 
-  plci->dtmf_parameter_length = 0;
+       plci->dtmf_parameter_length = 0;
 }
 
 
-static void dtmf_parameter_prepare_switch (dword Id, PLCI   *plci)
+static void dtmf_parameter_prepare_switch(dword Id, PLCI *plci)
 {
 
-  dbug (1, dprintf ("[%06lx] %s,%d: dtmf_parameter_prepare_switch",
-    UnMapId (Id), (char   *)(FILE_), __LINE__));
+       dbug(1, dprintf("[%06lx] %s,%d: dtmf_parameter_prepare_switch",
+                       UnMapId(Id), (char *)(FILE_), __LINE__));
 
 }
 
 
-static word dtmf_parameter_save_config (dword Id, PLCI   *plci, byte Rc)
+static word dtmf_parameter_save_config(dword Id, PLCI *plci, byte Rc)
 {
 
-  dbug (1, dprintf ("[%06lx] %s,%d: dtmf_parameter_save_config %02x %d",
-    UnMapId (Id), (char   *)(FILE_), __LINE__, Rc, plci->adjust_b_state));
+       dbug(1, dprintf("[%06lx] %s,%d: dtmf_parameter_save_config %02x %d",
+                       UnMapId(Id), (char *)(FILE_), __LINE__, Rc, plci->adjust_b_state));
 
-  return (GOOD);
+       return (GOOD);
 }
 
 
-static word dtmf_parameter_restore_config (dword Id, PLCI   *plci, byte Rc)
+static word dtmf_parameter_restore_config(dword Id, PLCI *plci, byte Rc)
 {
-  word Info;
+       word Info;
 
-  dbug (1, dprintf ("[%06lx] %s,%d: dtmf_parameter_restore_config %02x %d",
-    UnMapId (Id), (char   *)(FILE_), __LINE__, Rc, plci->adjust_b_state));
+       dbug(1, dprintf("[%06lx] %s,%d: dtmf_parameter_restore_config %02x %d",
+                       UnMapId(Id), (char *)(FILE_), __LINE__, Rc, plci->adjust_b_state));
 
-  Info = GOOD;
-  if ((plci->B1_facilities & B1_FACILITY_DTMFR)
-   && (plci->dtmf_parameter_length != 0))
-  {
-    switch (plci->adjust_b_state)
-    {
-    case ADJUST_B_RESTORE_DTMF_PARAMETER_1:
-      plci->internal_command = plci->adjust_b_command;
-      if (plci->sig_req)
-      {
-        plci->adjust_b_state = ADJUST_B_RESTORE_DTMF_PARAMETER_1;
-        break;
-      }
-      dtmf_parameter_write (plci);
-      plci->adjust_b_state = ADJUST_B_RESTORE_DTMF_PARAMETER_2;
-      break;
-    case ADJUST_B_RESTORE_DTMF_PARAMETER_2:
-      if ((Rc != OK) && (Rc != OK_FC))
-      {
-        dbug (1, dprintf ("[%06lx] %s,%d: Restore DTMF parameters failed %02x",
-          UnMapId (Id), (char   *)(FILE_), __LINE__, Rc));
-        Info = _WRONG_STATE;
-        break;
-      }
-      break;
-    }
-  }
-  return (Info);
+       Info = GOOD;
+       if ((plci->B1_facilities & B1_FACILITY_DTMFR)
+           && (plci->dtmf_parameter_length != 0))
+       {
+               switch (plci->adjust_b_state)
+               {
+               case ADJUST_B_RESTORE_DTMF_PARAMETER_1:
+                       plci->internal_command = plci->adjust_b_command;
+                       if (plci->sig_req)
+                       {
+                               plci->adjust_b_state = ADJUST_B_RESTORE_DTMF_PARAMETER_1;
+                               break;
+                       }
+                       dtmf_parameter_write(plci);
+                       plci->adjust_b_state = ADJUST_B_RESTORE_DTMF_PARAMETER_2;
+                       break;
+               case ADJUST_B_RESTORE_DTMF_PARAMETER_2:
+                       if ((Rc != OK) && (Rc != OK_FC))
+                       {
+                               dbug(1, dprintf("[%06lx] %s,%d: Restore DTMF parameters failed %02x",
+                                               UnMapId(Id), (char *)(FILE_), __LINE__, Rc));
+                               Info = _WRONG_STATE;
+                               break;
+                       }
+                       break;
+               }
+       }
+       return (Info);
 }
 
 
@@ -10290,3059 +10290,3059 @@ word li_total_channels;
 /* if channels is provided we accept more than one channel.         */
 /*------------------------------------------------------------------*/
 
-static byte chi_to_channel (byte   *chi, dword *pchannelmap)
-{
-  int p;
-  int i;
-  dword map;
-  byte excl;
-  byte ofs;
-  byte ch;
-
-  if (pchannelmap) *pchannelmap = 0;
-  if(!chi[0]) return 0xff;
-  excl = 0;
-
-  if(chi[1] & 0x20) {
-    if(chi[0]==1 && chi[1]==0xac) return 0xfd; /* exclusive d-channel */
-    for(i=1; i<chi[0] && !(chi[i] &0x80); i++);
-    if(i==chi[0] || !(chi[i] &0x80)) return 0xfe;
-    if((chi[1] |0xc8)!=0xe9) return 0xfe;
-    if(chi[1] &0x08) excl = 0x40;
-
-        /* int. id present */
-    if(chi[1] &0x40) {
-      p=i+1;
-      for(i=p; i<chi[0] && !(chi[i] &0x80); i++);
-      if(i==chi[0] || !(chi[i] &0x80)) return 0xfe;
-    }
-
-        /* coding standard, Number/Map, Channel Type */
-    p=i+1;
-    for(i=p; i<chi[0] && !(chi[i] &0x80); i++);
-    if(i==chi[0] || !(chi[i] &0x80)) return 0xfe;
-    if((chi[p]|0xd0)!=0xd3) return 0xfe;
-
-        /* Number/Map */
-    if(chi[p] &0x10) {
-
-        /* map */
-      if((chi[0]-p)==4) ofs = 0;
-      else if((chi[0]-p)==3) ofs = 1;
-      else return 0xfe;
-      ch = 0;
-      map = 0;
-      for(i=0; i<4 && p<chi[0]; i++) {
-        p++;
-        ch += 8;
-        map <<= 8;
-        if(chi[p]) {
-          for (ch=0; !(chi[p] & (1 << ch)); ch++);
-          map |= chi[p];
-        }
-      }
-      ch += ofs;
-      map <<= ofs;
-    }
-    else {
-
-        /* number */
-      p=i+1;
-      ch = chi[p] &0x3f;
-      if(pchannelmap) {
-        if((byte)(chi[0]-p)>30) return 0xfe;
-        map = 0;
-        for(i=p; i<=chi[0]; i++) {
-          if ((chi[i] &0x7f) > 31) return 0xfe;
-          map |= (1L << (chi[i] &0x7f));
-        }
-      }
-      else {
-        if(p!=chi[0]) return 0xfe;
-        if (ch > 31) return 0xfe;
-        map = (1L << ch);
-      }
-      if(chi[p] &0x40) return 0xfe;
-    }
-    if (pchannelmap) *pchannelmap = map;
-    else if (map != ((dword)(1L << ch))) return 0xfe;
-    return (byte)(excl | ch);
-  }
-  else {  /* not PRI */
-    for(i=1; i<chi[0] && !(chi[i] &0x80); i++);
-    if(i!=chi[0] || !(chi[i] &0x80)) return 0xfe;
-    if(chi[1] &0x08) excl = 0x40;
-
-    switch(chi[1] |0x98) {
-    case 0x98: return 0;
-    case 0x99:
-      if (pchannelmap) *pchannelmap = 2;
-      return excl |1;
-    case 0x9a:
-      if (pchannelmap) *pchannelmap = 4;
-      return excl |2;
-    case 0x9b: return 0xff;
-    case 0x9c: return 0xfd; /* d-ch */
-    default: return 0xfe;
-    }
-  }
+static byte chi_to_channel(byte *chi, dword *pchannelmap)
+{
+       int p;
+       int i;
+       dword map;
+       byte excl;
+       byte ofs;
+       byte ch;
+
+       if (pchannelmap) *pchannelmap = 0;
+       if (!chi[0]) return 0xff;
+       excl = 0;
+
+       if (chi[1] & 0x20) {
+               if (chi[0] == 1 && chi[1] == 0xac) return 0xfd; /* exclusive d-channel */
+               for (i = 1; i < chi[0] && !(chi[i] & 0x80); i++);
+               if (i == chi[0] || !(chi[i] & 0x80)) return 0xfe;
+               if ((chi[1] | 0xc8) != 0xe9) return 0xfe;
+               if (chi[1] & 0x08) excl = 0x40;
+
+               /* int. id present */
+               if (chi[1] & 0x40) {
+                       p = i + 1;
+                       for (i = p; i < chi[0] && !(chi[i] & 0x80); i++);
+                       if (i == chi[0] || !(chi[i] & 0x80)) return 0xfe;
+               }
+
+               /* coding standard, Number/Map, Channel Type */
+               p = i + 1;
+               for (i = p; i < chi[0] && !(chi[i] & 0x80); i++);
+               if (i == chi[0] || !(chi[i] & 0x80)) return 0xfe;
+               if ((chi[p] | 0xd0) != 0xd3) return 0xfe;
+
+               /* Number/Map */
+               if (chi[p] & 0x10) {
+
+                       /* map */
+                       if ((chi[0] - p) == 4) ofs = 0;
+                       else if ((chi[0] - p) == 3) ofs = 1;
+                       else return 0xfe;
+                       ch = 0;
+                       map = 0;
+                       for (i = 0; i < 4 && p < chi[0]; i++) {
+                               p++;
+                               ch += 8;
+                               map <<= 8;
+                               if (chi[p]) {
+                                       for (ch = 0; !(chi[p] & (1 << ch)); ch++);
+                                       map |= chi[p];
+                               }
+                       }
+                       ch += ofs;
+                       map <<= ofs;
+               }
+               else {
+
+                       /* number */
+                       p = i + 1;
+                       ch = chi[p] & 0x3f;
+                       if (pchannelmap) {
+                               if ((byte)(chi[0] - p) > 30) return 0xfe;
+                               map = 0;
+                               for (i = p; i <= chi[0]; i++) {
+                                       if ((chi[i] & 0x7f) > 31) return 0xfe;
+                                       map |= (1L << (chi[i] & 0x7f));
+                               }
+                       }
+                       else {
+                               if (p != chi[0]) return 0xfe;
+                               if (ch > 31) return 0xfe;
+                               map = (1L << ch);
+                       }
+                       if (chi[p] & 0x40) return 0xfe;
+               }
+               if (pchannelmap) *pchannelmap = map;
+               else if (map != ((dword)(1L << ch))) return 0xfe;
+               return (byte)(excl | ch);
+       }
+       else {  /* not PRI */
+               for (i = 1; i < chi[0] && !(chi[i] & 0x80); i++);
+               if (i != chi[0] || !(chi[i] & 0x80)) return 0xfe;
+               if (chi[1] & 0x08) excl = 0x40;
+
+               switch (chi[1] | 0x98) {
+               case 0x98: return 0;
+               case 0x99:
+                       if (pchannelmap) *pchannelmap = 2;
+                       return excl | 1;
+               case 0x9a:
+                       if (pchannelmap) *pchannelmap = 4;
+                       return excl | 2;
+               case 0x9b: return 0xff;
+               case 0x9c: return 0xfd; /* d-ch */
+               default: return 0xfe;
+               }
+       }
+}
+
+
+static void mixer_set_bchannel_id_esc(PLCI *plci, byte bchannel_id)
+{
+       DIVA_CAPI_ADAPTER *a;
+       PLCI *splci;
+       byte old_id;
+
+       a = plci->adapter;
+       old_id = plci->li_bchannel_id;
+       if (a->li_pri)
+       {
+               if ((old_id != 0) && (li_config_table[a->li_base + (old_id - 1)].plci == plci))
+                       li_config_table[a->li_base + (old_id - 1)].plci = NULL;
+               plci->li_bchannel_id = (bchannel_id & 0x1f) + 1;
+               if (li_config_table[a->li_base + (plci->li_bchannel_id - 1)].plci == NULL)
+                       li_config_table[a->li_base + (plci->li_bchannel_id - 1)].plci = plci;
+       }
+       else
+       {
+               if (((bchannel_id & 0x03) == 1) || ((bchannel_id & 0x03) == 2))
+               {
+                       if ((old_id != 0) && (li_config_table[a->li_base + (old_id - 1)].plci == plci))
+                               li_config_table[a->li_base + (old_id - 1)].plci = NULL;
+                       plci->li_bchannel_id = bchannel_id & 0x03;
+                       if ((a->AdvSignalPLCI != NULL) && (a->AdvSignalPLCI != plci) && (a->AdvSignalPLCI->tel == ADV_VOICE))
+                       {
+                               splci = a->AdvSignalPLCI;
+                               if (li_config_table[a->li_base + (2 - plci->li_bchannel_id)].plci == NULL)
+                               {
+                                       if ((splci->li_bchannel_id != 0)
+                                           && (li_config_table[a->li_base + (splci->li_bchannel_id - 1)].plci == splci))
+                                       {
+                                               li_config_table[a->li_base + (splci->li_bchannel_id - 1)].plci = NULL;
+                                       }
+                                       splci->li_bchannel_id = 3 - plci->li_bchannel_id;
+                                       li_config_table[a->li_base + (2 - plci->li_bchannel_id)].plci = splci;
+                                       dbug(1, dprintf("[%06lx] %s,%d: adv_voice_set_bchannel_id_esc %d",
+                                                       (dword)((splci->Id << 8) | UnMapController(splci->adapter->Id)),
+                                                       (char *)(FILE_), __LINE__, splci->li_bchannel_id));
+                               }
+                       }
+                       if (li_config_table[a->li_base + (plci->li_bchannel_id - 1)].plci == NULL)
+                               li_config_table[a->li_base + (plci->li_bchannel_id - 1)].plci = plci;
+               }
+       }
+       if ((old_id == 0) && (plci->li_bchannel_id != 0)
+           && (li_config_table[a->li_base + (plci->li_bchannel_id - 1)].plci == plci))
+       {
+               mixer_clear_config(plci);
+       }
+       dbug(1, dprintf("[%06lx] %s,%d: mixer_set_bchannel_id_esc %d %d",
+                       (dword)((plci->Id << 8) | UnMapController(plci->adapter->Id)),
+                       (char *)(FILE_), __LINE__, bchannel_id, plci->li_bchannel_id));
+}
+
+
+static void mixer_set_bchannel_id(PLCI *plci, byte *chi)
+{
+       DIVA_CAPI_ADAPTER *a;
+       PLCI *splci;
+       byte ch, old_id;
+
+       a = plci->adapter;
+       old_id = plci->li_bchannel_id;
+       ch = chi_to_channel(chi, NULL);
+       if (!(ch & 0x80))
+       {
+               if (a->li_pri)
+               {
+                       if ((old_id != 0) && (li_config_table[a->li_base + (old_id - 1)].plci == plci))
+                               li_config_table[a->li_base + (old_id - 1)].plci = NULL;
+                       plci->li_bchannel_id = (ch & 0x1f) + 1;
+                       if (li_config_table[a->li_base + (plci->li_bchannel_id - 1)].plci == NULL)
+                               li_config_table[a->li_base + (plci->li_bchannel_id - 1)].plci = plci;
+               }
+               else
+               {
+                       if (((ch & 0x1f) == 1) || ((ch & 0x1f) == 2))
+                       {
+                               if ((old_id != 0) && (li_config_table[a->li_base + (old_id - 1)].plci == plci))
+                                       li_config_table[a->li_base + (old_id - 1)].plci = NULL;
+                               plci->li_bchannel_id = ch & 0x1f;
+                               if ((a->AdvSignalPLCI != NULL) && (a->AdvSignalPLCI != plci) && (a->AdvSignalPLCI->tel == ADV_VOICE))
+                               {
+                                       splci = a->AdvSignalPLCI;
+                                       if (li_config_table[a->li_base + (2 - plci->li_bchannel_id)].plci == NULL)
+                                       {
+                                               if ((splci->li_bchannel_id != 0)
+                                                   && (li_config_table[a->li_base + (splci->li_bchannel_id - 1)].plci == splci))
+                                               {
+                                                       li_config_table[a->li_base + (splci->li_bchannel_id - 1)].plci = NULL;
+                                               }
+                                               splci->li_bchannel_id = 3 - plci->li_bchannel_id;
+                                               li_config_table[a->li_base + (2 - plci->li_bchannel_id)].plci = splci;
+                                               dbug(1, dprintf("[%06lx] %s,%d: adv_voice_set_bchannel_id %d",
+                                                               (dword)((splci->Id << 8) | UnMapController(splci->adapter->Id)),
+                                                               (char *)(FILE_), __LINE__, splci->li_bchannel_id));
+                                       }
+                               }
+                               if (li_config_table[a->li_base + (plci->li_bchannel_id - 1)].plci == NULL)
+                                       li_config_table[a->li_base + (plci->li_bchannel_id - 1)].plci = plci;
+                       }
+               }
+       }
+       if ((old_id == 0) && (plci->li_bchannel_id != 0)
+           && (li_config_table[a->li_base + (plci->li_bchannel_id - 1)].plci == plci))
+       {
+               mixer_clear_config(plci);
+       }
+       dbug(1, dprintf("[%06lx] %s,%d: mixer_set_bchannel_id %02x %d",
+                       (dword)((plci->Id << 8) | UnMapController(plci->adapter->Id)),
+                       (char *)(FILE_), __LINE__, ch, plci->li_bchannel_id));
 }
 
 
-static void mixer_set_bchannel_id_esc (PLCI   *plci, byte bchannel_id)
-{
-  DIVA_CAPI_ADAPTER   *a;
-  PLCI   *splci;
-  byte old_id;
+#define MIXER_MAX_DUMP_CHANNELS 34
 
-  a = plci->adapter;
-  old_id = plci->li_bchannel_id;
-  if (a->li_pri)
-  {
-    if ((old_id != 0) && (li_config_table[a->li_base + (old_id - 1)].plci == plci))
-      li_config_table[a->li_base + (old_id - 1)].plci = NULL;
-    plci->li_bchannel_id = (bchannel_id & 0x1f) + 1;
-    if (li_config_table[a->li_base + (plci->li_bchannel_id - 1)].plci == NULL)
-      li_config_table[a->li_base + (plci->li_bchannel_id - 1)].plci = plci;
-  }
-  else
-  {
-    if (((bchannel_id & 0x03) == 1) || ((bchannel_id & 0x03) == 2))
-    {
-      if ((old_id != 0) && (li_config_table[a->li_base + (old_id - 1)].plci == plci))
-        li_config_table[a->li_base + (old_id - 1)].plci = NULL;
-      plci->li_bchannel_id = bchannel_id & 0x03;
-      if ((a->AdvSignalPLCI != NULL) && (a->AdvSignalPLCI != plci) && (a->AdvSignalPLCI->tel == ADV_VOICE))
-      {
-        splci = a->AdvSignalPLCI;
-        if (li_config_table[a->li_base + (2 - plci->li_bchannel_id)].plci == NULL)
-        {
-          if ((splci->li_bchannel_id != 0)
-           && (li_config_table[a->li_base + (splci->li_bchannel_id - 1)].plci == splci))
-          {
-            li_config_table[a->li_base + (splci->li_bchannel_id - 1)].plci = NULL;
-          }
-          splci->li_bchannel_id = 3 - plci->li_bchannel_id;
-          li_config_table[a->li_base + (2 - plci->li_bchannel_id)].plci = splci;
-          dbug (1, dprintf ("[%06lx] %s,%d: adv_voice_set_bchannel_id_esc %d",
-            (dword)((splci->Id << 8) | UnMapController (splci->adapter->Id)),
-            (char   *)(FILE_), __LINE__, splci->li_bchannel_id));
-        }
-      }
-      if (li_config_table[a->li_base + (plci->li_bchannel_id - 1)].plci == NULL)
-        li_config_table[a->li_base + (plci->li_bchannel_id - 1)].plci = plci;
-    }
-  }
-  if ((old_id == 0) && (plci->li_bchannel_id != 0)
-   && (li_config_table[a->li_base + (plci->li_bchannel_id - 1)].plci == plci))
-  {
-    mixer_clear_config (plci);
-  }
-  dbug (1, dprintf ("[%06lx] %s,%d: mixer_set_bchannel_id_esc %d %d",
-    (dword)((plci->Id << 8) | UnMapController (plci->adapter->Id)),
-    (char   *)(FILE_), __LINE__, bchannel_id, plci->li_bchannel_id));
+static void mixer_calculate_coefs(DIVA_CAPI_ADAPTER *a)
+{
+       static char hex_digit_table[0x10] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
+       word n, i, j;
+       char *p;
+       char hex_line[2 * MIXER_MAX_DUMP_CHANNELS + MIXER_MAX_DUMP_CHANNELS / 8 + 4];
+
+       dbug(1, dprintf("[%06lx] %s,%d: mixer_calculate_coefs",
+                       (dword)(UnMapController(a->Id)), (char *)(FILE_), __LINE__));
+
+       for (i = 0; i < li_total_channels; i++)
+       {
+               li_config_table[i].channel &= LI_CHANNEL_ADDRESSES_SET;
+               if (li_config_table[i].chflags != 0)
+                       li_config_table[i].channel |= LI_CHANNEL_INVOLVED;
+               else
+               {
+                       for (j = 0; j < li_total_channels; j++)
+                       {
+                               if (((li_config_table[i].flag_table[j]) != 0)
+                                   || ((li_config_table[j].flag_table[i]) != 0))
+                               {
+                                       li_config_table[i].channel |= LI_CHANNEL_INVOLVED;
+                               }
+                               if (((li_config_table[i].flag_table[j] & LI_FLAG_CONFERENCE) != 0)
+                                   || ((li_config_table[j].flag_table[i] & LI_FLAG_CONFERENCE) != 0))
+                               {
+                                       li_config_table[i].channel |= LI_CHANNEL_CONFERENCE;
+                               }
+                       }
+               }
+       }
+       for (i = 0; i < li_total_channels; i++)
+       {
+               for (j = 0; j < li_total_channels; j++)
+               {
+                       li_config_table[i].coef_table[j] &= ~(LI_COEF_CH_CH | LI_COEF_CH_PC | LI_COEF_PC_CH | LI_COEF_PC_PC);
+                       if (li_config_table[i].flag_table[j] & LI_FLAG_CONFERENCE)
+                               li_config_table[i].coef_table[j] |= LI_COEF_CH_CH;
+               }
+       }
+       for (n = 0; n < li_total_channels; n++)
+       {
+               if (li_config_table[n].channel & LI_CHANNEL_CONFERENCE)
+               {
+                       for (i = 0; i < li_total_channels; i++)
+                       {
+                               if (li_config_table[i].channel & LI_CHANNEL_CONFERENCE)
+                               {
+                                       for (j = 0; j < li_total_channels; j++)
+                                       {
+                                               li_config_table[i].coef_table[j] |=
+                                                       li_config_table[i].coef_table[n] & li_config_table[n].coef_table[j];
+                                       }
+                               }
+                       }
+               }
+       }
+       for (i = 0; i < li_total_channels; i++)
+       {
+               if (li_config_table[i].channel & LI_CHANNEL_INVOLVED)
+               {
+                       li_config_table[i].coef_table[i] &= ~LI_COEF_CH_CH;
+                       for (j = 0; j < li_total_channels; j++)
+                       {
+                               if (li_config_table[i].coef_table[j] & LI_COEF_CH_CH)
+                                       li_config_table[i].flag_table[j] |= LI_FLAG_CONFERENCE;
+                       }
+                       if (li_config_table[i].flag_table[i] & LI_FLAG_CONFERENCE)
+                               li_config_table[i].coef_table[i] |= LI_COEF_CH_CH;
+               }
+       }
+       for (i = 0; i < li_total_channels; i++)
+       {
+               if (li_config_table[i].channel & LI_CHANNEL_INVOLVED)
+               {
+                       for (j = 0; j < li_total_channels; j++)
+                       {
+                               if (li_config_table[i].flag_table[j] & LI_FLAG_INTERCONNECT)
+                                       li_config_table[i].coef_table[j] |= LI_COEF_CH_CH;
+                               if (li_config_table[i].flag_table[j] & LI_FLAG_MONITOR)
+                                       li_config_table[i].coef_table[j] |= LI_COEF_CH_PC;
+                               if (li_config_table[i].flag_table[j] & LI_FLAG_MIX)
+                                       li_config_table[i].coef_table[j] |= LI_COEF_PC_CH;
+                               if (li_config_table[i].flag_table[j] & LI_FLAG_PCCONNECT)
+                                       li_config_table[i].coef_table[j] |= LI_COEF_PC_PC;
+                       }
+                       if (li_config_table[i].chflags & LI_CHFLAG_MONITOR)
+                       {
+                               for (j = 0; j < li_total_channels; j++)
+                               {
+                                       if (li_config_table[i].flag_table[j] & LI_FLAG_INTERCONNECT)
+                                       {
+                                               li_config_table[i].coef_table[j] |= LI_COEF_CH_PC;
+                                               if (li_config_table[j].chflags & LI_CHFLAG_MIX)
+                                                       li_config_table[i].coef_table[j] |= LI_COEF_PC_CH | LI_COEF_PC_PC;
+                                       }
+                               }
+                       }
+                       if (li_config_table[i].chflags & LI_CHFLAG_MIX)
+                       {
+                               for (j = 0; j < li_total_channels; j++)
+                               {
+                                       if (li_config_table[j].flag_table[i] & LI_FLAG_INTERCONNECT)
+                                               li_config_table[j].coef_table[i] |= LI_COEF_PC_CH;
+                               }
+                       }
+                       if (li_config_table[i].chflags & LI_CHFLAG_LOOP)
+                       {
+                               for (j = 0; j < li_total_channels; j++)
+                               {
+                                       if (li_config_table[i].flag_table[j] & LI_FLAG_INTERCONNECT)
+                                       {
+                                               for (n = 0; n < li_total_channels; n++)
+                                               {
+                                                       if (li_config_table[n].flag_table[i] & LI_FLAG_INTERCONNECT)
+                                                       {
+                                                               li_config_table[n].coef_table[j] |= LI_COEF_CH_CH;
+                                                               if (li_config_table[j].chflags & LI_CHFLAG_MIX)
+                                                               {
+                                                                       li_config_table[n].coef_table[j] |= LI_COEF_PC_CH;
+                                                                       if (li_config_table[n].chflags & LI_CHFLAG_MONITOR)
+                                                                               li_config_table[n].coef_table[j] |= LI_COEF_CH_PC | LI_COEF_PC_PC;
+                                                               }
+                                                               else if (li_config_table[n].chflags & LI_CHFLAG_MONITOR)
+                                                                       li_config_table[n].coef_table[j] |= LI_COEF_CH_PC;
+                                                       }
+                                               }
+                                       }
+                               }
+                       }
+               }
+       }
+       for (i = 0; i < li_total_channels; i++)
+       {
+               if (li_config_table[i].channel & LI_CHANNEL_INVOLVED)
+               {
+                       if (li_config_table[i].chflags & (LI_CHFLAG_MONITOR | LI_CHFLAG_MIX | LI_CHFLAG_LOOP))
+                               li_config_table[i].channel |= LI_CHANNEL_ACTIVE;
+                       if (li_config_table[i].chflags & LI_CHFLAG_MONITOR)
+                               li_config_table[i].channel |= LI_CHANNEL_RX_DATA;
+                       if (li_config_table[i].chflags & LI_CHFLAG_MIX)
+                               li_config_table[i].channel |= LI_CHANNEL_TX_DATA;
+                       for (j = 0; j < li_total_channels; j++)
+                       {
+                               if ((li_config_table[i].flag_table[j] &
+                                    (LI_FLAG_INTERCONNECT | LI_FLAG_PCCONNECT | LI_FLAG_CONFERENCE | LI_FLAG_MONITOR))
+                                   || (li_config_table[j].flag_table[i] &
+                                       (LI_FLAG_INTERCONNECT | LI_FLAG_PCCONNECT | LI_FLAG_CONFERENCE | LI_FLAG_ANNOUNCEMENT | LI_FLAG_MIX)))
+                               {
+                                       li_config_table[i].channel |= LI_CHANNEL_ACTIVE;
+                               }
+                               if (li_config_table[i].flag_table[j] & (LI_FLAG_PCCONNECT | LI_FLAG_MONITOR))
+                                       li_config_table[i].channel |= LI_CHANNEL_RX_DATA;
+                               if (li_config_table[j].flag_table[i] & (LI_FLAG_PCCONNECT | LI_FLAG_ANNOUNCEMENT | LI_FLAG_MIX))
+                                       li_config_table[i].channel |= LI_CHANNEL_TX_DATA;
+                       }
+                       if (!(li_config_table[i].channel & LI_CHANNEL_ACTIVE))
+                       {
+                               li_config_table[i].coef_table[i] |= LI_COEF_PC_CH | LI_COEF_CH_PC;
+                               li_config_table[i].channel |= LI_CHANNEL_TX_DATA | LI_CHANNEL_RX_DATA;
+                       }
+               }
+       }
+       for (i = 0; i < li_total_channels; i++)
+       {
+               if (li_config_table[i].channel & LI_CHANNEL_INVOLVED)
+               {
+                       j = 0;
+                       while ((j < li_total_channels) && !(li_config_table[i].flag_table[j] & LI_FLAG_ANNOUNCEMENT))
+                               j++;
+                       if (j < li_total_channels)
+                       {
+                               for (j = 0; j < li_total_channels; j++)
+                               {
+                                       li_config_table[i].coef_table[j] &= ~(LI_COEF_CH_CH | LI_COEF_PC_CH);
+                                       if (li_config_table[i].flag_table[j] & LI_FLAG_ANNOUNCEMENT)
+                                               li_config_table[i].coef_table[j] |= LI_COEF_PC_CH;
+                               }
+                       }
+               }
+       }
+       n = li_total_channels;
+       if (n > MIXER_MAX_DUMP_CHANNELS)
+               n = MIXER_MAX_DUMP_CHANNELS;
+       p = hex_line;
+       for (j = 0; j < n; j++)
+       {
+               if ((j & 0x7) == 0)
+                       *(p++) = ' ';
+               *(p++) = hex_digit_table[li_config_table[j].curchnl >> 4];
+               *(p++) = hex_digit_table[li_config_table[j].curchnl & 0xf];
+       }
+       *p = '\0';
+       dbug(1, dprintf("[%06lx] CURRENT %s",
+                       (dword)(UnMapController(a->Id)), (char *)hex_line));
+       p = hex_line;
+       for (j = 0; j < n; j++)
+       {
+               if ((j & 0x7) == 0)
+                       *(p++) = ' ';
+               *(p++) = hex_digit_table[li_config_table[j].channel >> 4];
+               *(p++) = hex_digit_table[li_config_table[j].channel & 0xf];
+       }
+       *p = '\0';
+       dbug(1, dprintf("[%06lx] CHANNEL %s",
+                       (dword)(UnMapController(a->Id)), (char *)hex_line));
+       p = hex_line;
+       for (j = 0; j < n; j++)
+       {
+               if ((j & 0x7) == 0)
+                       *(p++) = ' ';
+               *(p++) = hex_digit_table[li_config_table[j].chflags >> 4];
+               *(p++) = hex_digit_table[li_config_table[j].chflags & 0xf];
+       }
+       *p = '\0';
+       dbug(1, dprintf("[%06lx] CHFLAG  %s",
+                       (dword)(UnMapController(a->Id)), (char *)hex_line));
+       for (i = 0; i < n; i++)
+       {
+               p = hex_line;
+               for (j = 0; j < n; j++)
+               {
+                       if ((j & 0x7) == 0)
+                               *(p++) = ' ';
+                       *(p++) = hex_digit_table[li_config_table[i].flag_table[j] >> 4];
+                       *(p++) = hex_digit_table[li_config_table[i].flag_table[j] & 0xf];
+               }
+               *p = '\0';
+               dbug(1, dprintf("[%06lx] FLAG[%02x]%s",
+                               (dword)(UnMapController(a->Id)), i, (char *)hex_line));
+       }
+       for (i = 0; i < n; i++)
+       {
+               p = hex_line;
+               for (j = 0; j < n; j++)
+               {
+                       if ((j & 0x7) == 0)
+                               *(p++) = ' ';
+                       *(p++) = hex_digit_table[li_config_table[i].coef_table[j] >> 4];
+                       *(p++) = hex_digit_table[li_config_table[i].coef_table[j] & 0xf];
+               }
+               *p = '\0';
+               dbug(1, dprintf("[%06lx] COEF[%02x]%s",
+                               (dword)(UnMapController(a->Id)), i, (char *)hex_line));
+       }
 }
 
 
-static void mixer_set_bchannel_id (PLCI   *plci, byte   *chi)
+static struct
 {
-  DIVA_CAPI_ADAPTER   *a;
-  PLCI   *splci;
-  byte ch, old_id;
-
-  a = plci->adapter;
-  old_id = plci->li_bchannel_id;
-  ch = chi_to_channel (chi, NULL);
-  if (!(ch & 0x80))
-  {
-    if (a->li_pri)
-    {
-      if ((old_id != 0) && (li_config_table[a->li_base + (old_id - 1)].plci == plci))
-        li_config_table[a->li_base + (old_id - 1)].plci = NULL;
-      plci->li_bchannel_id = (ch & 0x1f) + 1;
-      if (li_config_table[a->li_base + (plci->li_bchannel_id - 1)].plci == NULL)
-        li_config_table[a->li_base + (plci->li_bchannel_id - 1)].plci = plci;
-    }
-    else
-    {
-      if (((ch & 0x1f) == 1) || ((ch & 0x1f) == 2))
-      {
-        if ((old_id != 0) && (li_config_table[a->li_base + (old_id - 1)].plci == plci))
-          li_config_table[a->li_base + (old_id - 1)].plci = NULL;
-        plci->li_bchannel_id = ch & 0x1f;
-        if ((a->AdvSignalPLCI != NULL) && (a->AdvSignalPLCI != plci) && (a->AdvSignalPLCI->tel == ADV_VOICE))
-        {
-          splci = a->AdvSignalPLCI;
-          if (li_config_table[a->li_base + (2 - plci->li_bchannel_id)].plci == NULL)
-          {
-            if ((splci->li_bchannel_id != 0)
-             && (li_config_table[a->li_base + (splci->li_bchannel_id - 1)].plci == splci))
-            {
-              li_config_table[a->li_base + (splci->li_bchannel_id - 1)].plci = NULL;
-            }
-            splci->li_bchannel_id = 3 - plci->li_bchannel_id;
-            li_config_table[a->li_base + (2 - plci->li_bchannel_id)].plci = splci;
-            dbug (1, dprintf ("[%06lx] %s,%d: adv_voice_set_bchannel_id %d",
-              (dword)((splci->Id << 8) | UnMapController (splci->adapter->Id)),
-              (char   *)(FILE_), __LINE__, splci->li_bchannel_id));
-          }
-        }
-        if (li_config_table[a->li_base + (plci->li_bchannel_id - 1)].plci == NULL)
-          li_config_table[a->li_base + (plci->li_bchannel_id - 1)].plci = plci;
-      }
-    }
-  }
-  if ((old_id == 0) && (plci->li_bchannel_id != 0)
-   && (li_config_table[a->li_base + (plci->li_bchannel_id - 1)].plci == plci))
-  {
-    mixer_clear_config (plci);
-  }
-  dbug (1, dprintf ("[%06lx] %s,%d: mixer_set_bchannel_id %02x %d",
-    (dword)((plci->Id << 8) | UnMapController (plci->adapter->Id)),
-    (char   *)(FILE_), __LINE__, ch, plci->li_bchannel_id));
-}
-
+       byte mask;
+       byte line_flags;
+} mixer_write_prog_pri[] =
+{
+       { LI_COEF_CH_CH, 0 },
+       { LI_COEF_CH_PC, MIXER_COEF_LINE_TO_PC_FLAG },
+       { LI_COEF_PC_CH, MIXER_COEF_LINE_FROM_PC_FLAG },
+       { LI_COEF_PC_PC, MIXER_COEF_LINE_TO_PC_FLAG | MIXER_COEF_LINE_FROM_PC_FLAG }
+};
 
-#define MIXER_MAX_DUMP_CHANNELS 34
+static struct
+{
+       byte from_ch;
+       byte to_ch;
+       byte mask;
+       byte xconnect_override;
+} mixer_write_prog_bri[] =
+{
+       { 0, 0, LI_COEF_CH_CH, 0x01 },  /* B      to B      */
+       { 1, 0, LI_COEF_CH_CH, 0x01 },  /* Alt B  to B      */
+       { 0, 0, LI_COEF_PC_CH, 0x80 },  /* PC     to B      */
+       { 1, 0, LI_COEF_PC_CH, 0x01 },  /* Alt PC to B      */
+       { 2, 0, LI_COEF_CH_CH, 0x00 },  /* IC     to B      */
+       { 3, 0, LI_COEF_CH_CH, 0x00 },  /* Alt IC to B      */
+       { 0, 0, LI_COEF_CH_PC, 0x80 },  /* B      to PC     */
+       { 1, 0, LI_COEF_CH_PC, 0x01 },  /* Alt B  to PC     */
+       { 0, 0, LI_COEF_PC_PC, 0x01 },  /* PC     to PC     */
+       { 1, 0, LI_COEF_PC_PC, 0x01 },  /* Alt PC to PC     */
+       { 2, 0, LI_COEF_CH_PC, 0x00 },  /* IC     to PC     */
+       { 3, 0, LI_COEF_CH_PC, 0x00 },  /* Alt IC to PC     */
+       { 0, 2, LI_COEF_CH_CH, 0x00 },  /* B      to IC     */
+       { 1, 2, LI_COEF_CH_CH, 0x00 },  /* Alt B  to IC     */
+       { 0, 2, LI_COEF_PC_CH, 0x00 },  /* PC     to IC     */
+       { 1, 2, LI_COEF_PC_CH, 0x00 },  /* Alt PC to IC     */
+       { 2, 2, LI_COEF_CH_CH, 0x00 },  /* IC     to IC     */
+       { 3, 2, LI_COEF_CH_CH, 0x00 },  /* Alt IC to IC     */
+       { 1, 1, LI_COEF_CH_CH, 0x01 },  /* Alt B  to Alt B  */
+       { 0, 1, LI_COEF_CH_CH, 0x01 },  /* B      to Alt B  */
+       { 1, 1, LI_COEF_PC_CH, 0x80 },  /* Alt PC to Alt B  */
+       { 0, 1, LI_COEF_PC_CH, 0x01 },  /* PC     to Alt B  */
+       { 3, 1, LI_COEF_CH_CH, 0x00 },  /* Alt IC to Alt B  */
+       { 2, 1, LI_COEF_CH_CH, 0x00 },  /* IC     to Alt B  */
+       { 1, 1, LI_COEF_CH_PC, 0x80 },  /* Alt B  to Alt PC */
+       { 0, 1, LI_COEF_CH_PC, 0x01 },  /* B      to Alt PC */
+       { 1, 1, LI_COEF_PC_PC, 0x01 },  /* Alt PC to Alt PC */
+       { 0, 1, LI_COEF_PC_PC, 0x01 },  /* PC     to Alt PC */
+       { 3, 1, LI_COEF_CH_PC, 0x00 },  /* Alt IC to Alt PC */
+       { 2, 1, LI_COEF_CH_PC, 0x00 },  /* IC     to Alt PC */
+       { 1, 3, LI_COEF_CH_CH, 0x00 },  /* Alt B  to Alt IC */
+       { 0, 3, LI_COEF_CH_CH, 0x00 },  /* B      to Alt IC */
+       { 1, 3, LI_COEF_PC_CH, 0x00 },  /* Alt PC to Alt IC */
+       { 0, 3, LI_COEF_PC_CH, 0x00 },  /* PC     to Alt IC */
+       { 3, 3, LI_COEF_CH_CH, 0x00 },  /* Alt IC to Alt IC */
+       { 2, 3, LI_COEF_CH_CH, 0x00 }   /* IC     to Alt IC */
+};
 
-static void mixer_calculate_coefs (DIVA_CAPI_ADAPTER   *a)
+static byte mixer_swapped_index_bri[] =
 {
-static char hex_digit_table[0x10] = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};
-  word n, i, j;
-  char *p;
-    char hex_line[2 * MIXER_MAX_DUMP_CHANNELS + MIXER_MAX_DUMP_CHANNELS / 8 + 4];
-
-  dbug (1, dprintf ("[%06lx] %s,%d: mixer_calculate_coefs",
-    (dword)(UnMapController (a->Id)), (char   *)(FILE_), __LINE__));
-
-  for (i = 0; i < li_total_channels; i++)
-  {
-    li_config_table[i].channel &= LI_CHANNEL_ADDRESSES_SET;
-    if (li_config_table[i].chflags != 0)
-      li_config_table[i].channel |= LI_CHANNEL_INVOLVED;
-    else
-    {
-      for (j = 0; j < li_total_channels; j++)
-      {
-        if (((li_config_table[i].flag_table[j]) != 0)
-         || ((li_config_table[j].flag_table[i]) != 0))
-        {
-          li_config_table[i].channel |= LI_CHANNEL_INVOLVED;
-        }
-        if (((li_config_table[i].flag_table[j] & LI_FLAG_CONFERENCE) != 0)
-         || ((li_config_table[j].flag_table[i] & LI_FLAG_CONFERENCE) != 0))
-        {
-          li_config_table[i].channel |= LI_CHANNEL_CONFERENCE;
-        }
-      }
-    }
-  }
-  for (i = 0; i < li_total_channels; i++)
-  {
-    for (j = 0; j < li_total_channels; j++)
-    {
-      li_config_table[i].coef_table[j] &= ~(LI_COEF_CH_CH | LI_COEF_CH_PC | LI_COEF_PC_CH | LI_COEF_PC_PC);
-      if (li_config_table[i].flag_table[j] & LI_FLAG_CONFERENCE)
-        li_config_table[i].coef_table[j] |= LI_COEF_CH_CH;
-    }
-  }
-  for (n = 0; n < li_total_channels; n++)
-  {
-    if (li_config_table[n].channel & LI_CHANNEL_CONFERENCE)
-    {
-      for (i = 0; i < li_total_channels; i++)
-      {
-        if (li_config_table[i].channel & LI_CHANNEL_CONFERENCE)
-        {
-          for (j = 0; j < li_total_channels; j++)
-          {
-            li_config_table[i].coef_table[j] |=
-              li_config_table[i].coef_table[n] & li_config_table[n].coef_table[j];
-          }
-        }
-      }
-    }
-  }
-  for (i = 0; i < li_total_channels; i++)
-  {
-    if (li_config_table[i].channel & LI_CHANNEL_INVOLVED)
-    {
-      li_config_table[i].coef_table[i] &= ~LI_COEF_CH_CH;
-      for (j = 0; j < li_total_channels; j++)
-      {
-        if (li_config_table[i].coef_table[j] & LI_COEF_CH_CH)
-          li_config_table[i].flag_table[j] |= LI_FLAG_CONFERENCE;
-      }
-      if (li_config_table[i].flag_table[i] & LI_FLAG_CONFERENCE)
-        li_config_table[i].coef_table[i] |= LI_COEF_CH_CH;
-    }
-  }
-  for (i = 0; i < li_total_channels; i++)
-  {
-    if (li_config_table[i].channel & LI_CHANNEL_INVOLVED)
-    {
-      for (j = 0; j < li_total_channels; j++)
-      {
-        if (li_config_table[i].flag_table[j] & LI_FLAG_INTERCONNECT)
-          li_config_table[i].coef_table[j] |= LI_COEF_CH_CH;
-        if (li_config_table[i].flag_table[j] & LI_FLAG_MONITOR)
-          li_config_table[i].coef_table[j] |= LI_COEF_CH_PC;
-        if (li_config_table[i].flag_table[j] & LI_FLAG_MIX)
-          li_config_table[i].coef_table[j] |= LI_COEF_PC_CH;
-        if (li_config_table[i].flag_table[j] & LI_FLAG_PCCONNECT)
-          li_config_table[i].coef_table[j] |= LI_COEF_PC_PC;
-      }
-      if (li_config_table[i].chflags & LI_CHFLAG_MONITOR)
-      {
-        for (j = 0; j < li_total_channels; j++)
-        {
-          if (li_config_table[i].flag_table[j] & LI_FLAG_INTERCONNECT)
-          {
-            li_config_table[i].coef_table[j] |= LI_COEF_CH_PC;
-            if (li_config_table[j].chflags & LI_CHFLAG_MIX)
-              li_config_table[i].coef_table[j] |= LI_COEF_PC_CH | LI_COEF_PC_PC;
-          }
-        }
-      }
-      if (li_config_table[i].chflags & LI_CHFLAG_MIX)
-      {
-        for (j = 0; j < li_total_channels; j++)
-        {
-          if (li_config_table[j].flag_table[i] & LI_FLAG_INTERCONNECT)
-            li_config_table[j].coef_table[i] |= LI_COEF_PC_CH;
-        }
-      }
-      if (li_config_table[i].chflags & LI_CHFLAG_LOOP)
-      {
-        for (j = 0; j < li_total_channels; j++)
-        {
-          if (li_config_table[i].flag_table[j] & LI_FLAG_INTERCONNECT)
-          {
-            for (n = 0; n < li_total_channels; n++)
-            {
-              if (li_config_table[n].flag_table[i] & LI_FLAG_INTERCONNECT)
-              {
-                li_config_table[n].coef_table[j] |= LI_COEF_CH_CH;
-                if (li_config_table[j].chflags & LI_CHFLAG_MIX)
-                {
-                  li_config_table[n].coef_table[j] |= LI_COEF_PC_CH;
-                  if (li_config_table[n].chflags & LI_CHFLAG_MONITOR)
-                    li_config_table[n].coef_table[j] |= LI_COEF_CH_PC | LI_COEF_PC_PC;
-                }
-                else if (li_config_table[n].chflags & LI_CHFLAG_MONITOR)
-                  li_config_table[n].coef_table[j] |= LI_COEF_CH_PC;
-              }
-            }
-          }
-        }
-      }
-    }
-  }
-  for (i = 0; i < li_total_channels; i++)
-  {
-    if (li_config_table[i].channel & LI_CHANNEL_INVOLVED)
-    {
-      if (li_config_table[i].chflags & (LI_CHFLAG_MONITOR | LI_CHFLAG_MIX | LI_CHFLAG_LOOP))
-        li_config_table[i].channel |= LI_CHANNEL_ACTIVE;
-      if (li_config_table[i].chflags & LI_CHFLAG_MONITOR)
-        li_config_table[i].channel |= LI_CHANNEL_RX_DATA;
-      if (li_config_table[i].chflags & LI_CHFLAG_MIX)
-        li_config_table[i].channel |= LI_CHANNEL_TX_DATA;
-      for (j = 0; j < li_total_channels; j++)
-      {
-        if ((li_config_table[i].flag_table[j] &
-          (LI_FLAG_INTERCONNECT | LI_FLAG_PCCONNECT | LI_FLAG_CONFERENCE | LI_FLAG_MONITOR))
-         || (li_config_table[j].flag_table[i] &
-          (LI_FLAG_INTERCONNECT | LI_FLAG_PCCONNECT | LI_FLAG_CONFERENCE | LI_FLAG_ANNOUNCEMENT | LI_FLAG_MIX)))
-        {
-          li_config_table[i].channel |= LI_CHANNEL_ACTIVE;
-        }
-        if (li_config_table[i].flag_table[j] & (LI_FLAG_PCCONNECT | LI_FLAG_MONITOR))
-          li_config_table[i].channel |= LI_CHANNEL_RX_DATA;
-        if (li_config_table[j].flag_table[i] & (LI_FLAG_PCCONNECT | LI_FLAG_ANNOUNCEMENT | LI_FLAG_MIX))
-          li_config_table[i].channel |= LI_CHANNEL_TX_DATA;
-      }
-      if (!(li_config_table[i].channel & LI_CHANNEL_ACTIVE))
-      {
-        li_config_table[i].coef_table[i] |= LI_COEF_PC_CH | LI_COEF_CH_PC;
-        li_config_table[i].channel |= LI_CHANNEL_TX_DATA | LI_CHANNEL_RX_DATA;
-      }
-    }
-  }
-  for (i = 0; i < li_total_channels; i++)
-  {
-    if (li_config_table[i].channel & LI_CHANNEL_INVOLVED)
-    {
-      j = 0;
-      while ((j < li_total_channels) && !(li_config_table[i].flag_table[j] & LI_FLAG_ANNOUNCEMENT))
-        j++;
-      if (j < li_total_channels)
-      {
-        for (j = 0; j < li_total_channels; j++)
-        {
-          li_config_table[i].coef_table[j] &= ~(LI_COEF_CH_CH | LI_COEF_PC_CH);
-          if (li_config_table[i].flag_table[j] & LI_FLAG_ANNOUNCEMENT)
-            li_config_table[i].coef_table[j] |= LI_COEF_PC_CH;
-        }
-      }
-    }
-  }
-  n = li_total_channels;
-  if (n > MIXER_MAX_DUMP_CHANNELS)
-    n = MIXER_MAX_DUMP_CHANNELS;
-  p = hex_line;
-  for (j = 0; j < n; j++)
-  {
-    if ((j & 0x7) == 0)
-      *(p++) = ' ';
-    *(p++) = hex_digit_table[li_config_table[j].curchnl >> 4];
-    *(p++) = hex_digit_table[li_config_table[j].curchnl & 0xf];
-  }
-  *p = '\0';
-  dbug (1, dprintf ("[%06lx] CURRENT %s",
-    (dword)(UnMapController (a->Id)), (char   *) hex_line));
-  p = hex_line;
-  for (j = 0; j < n; j++)
-  {
-    if ((j & 0x7) == 0)
-      *(p++) = ' ';
-    *(p++) = hex_digit_table[li_config_table[j].channel >> 4];
-    *(p++) = hex_digit_table[li_config_table[j].channel & 0xf];
-  }
-  *p = '\0';
-  dbug (1, dprintf ("[%06lx] CHANNEL %s",
-    (dword)(UnMapController (a->Id)), (char   *) hex_line));
-  p = hex_line;
-  for (j = 0; j < n; j++)
-  {
-    if ((j & 0x7) == 0)
-      *(p++) = ' ';
-    *(p++) = hex_digit_table[li_config_table[j].chflags >> 4];
-    *(p++) = hex_digit_table[li_config_table[j].chflags & 0xf];
-  }
-  *p = '\0';
-  dbug (1, dprintf ("[%06lx] CHFLAG  %s",
-    (dword)(UnMapController (a->Id)), (char   *) hex_line));
-  for (i = 0; i < n; i++)
-  {
-    p = hex_line;
-    for (j = 0; j < n; j++)
-    {
-      if ((j & 0x7) == 0)
-        *(p++) = ' ';
-      *(p++) = hex_digit_table[li_config_table[i].flag_table[j] >> 4];
-      *(p++) = hex_digit_table[li_config_table[i].flag_table[j] & 0xf];
-    }
-    *p = '\0';
-    dbug (1, dprintf ("[%06lx] FLAG[%02x]%s",
-      (dword)(UnMapController (a->Id)), i, (char   *) hex_line));
-  }
-  for (i = 0; i < n; i++)
-  {
-    p = hex_line;
-    for (j = 0; j < n; j++)
-    {
-      if ((j & 0x7) == 0)
-        *(p++) = ' ';
-      *(p++) = hex_digit_table[li_config_table[i].coef_table[j] >> 4];
-      *(p++) = hex_digit_table[li_config_table[i].coef_table[j] & 0xf];
-    }
-    *p = '\0';
-    dbug (1, dprintf ("[%06lx] COEF[%02x]%s",
-      (dword)(UnMapController (a->Id)), i, (char   *) hex_line));
-  }
-}
-
-
-static struct
-{
-  byte mask;
-  byte line_flags;
-} mixer_write_prog_pri[] =
-{
-  { LI_COEF_CH_CH, 0 },
-  { LI_COEF_CH_PC, MIXER_COEF_LINE_TO_PC_FLAG },
-  { LI_COEF_PC_CH, MIXER_COEF_LINE_FROM_PC_FLAG },
-  { LI_COEF_PC_PC, MIXER_COEF_LINE_TO_PC_FLAG | MIXER_COEF_LINE_FROM_PC_FLAG }
-};
+       18,  /* B      to B      */
+       19,  /* Alt B  to B      */
+       20,  /* PC     to B      */
+       21,  /* Alt PC to B      */
+       22,  /* IC     to B      */
+       23,  /* Alt IC to B      */
+       24,  /* B      to PC     */
+       25,  /* Alt B  to PC     */
+       26,  /* PC     to PC     */
+       27,  /* Alt PC to PC     */
+       28,  /* IC     to PC     */
+       29,  /* Alt IC to PC     */
+       30,  /* B      to IC     */
+       31,  /* Alt B  to IC     */
+       32,  /* PC     to IC     */
+       33,  /* Alt PC to IC     */
+       34,  /* IC     to IC     */
+       35,  /* Alt IC to IC     */
+       0,   /* Alt B  to Alt B  */
+       1,   /* B      to Alt B  */
+       2,   /* Alt PC to Alt B  */
+       3,   /* PC     to Alt B  */
+       4,   /* Alt IC to Alt B  */
+       5,   /* IC     to Alt B  */
+       6,   /* Alt B  to Alt PC */
+       7,   /* B      to Alt PC */
+       8,   /* Alt PC to Alt PC */
+       9,   /* PC     to Alt PC */
+       10,  /* Alt IC to Alt PC */
+       11,  /* IC     to Alt PC */
+       12,  /* Alt B  to Alt IC */
+       13,  /* B      to Alt IC */
+       14,  /* Alt PC to Alt IC */
+       15,  /* PC     to Alt IC */
+       16,  /* Alt IC to Alt IC */
+       17   /* IC     to Alt IC */
+};
 
 static struct
 {
-  byte from_ch;
-  byte to_ch;
-  byte mask;
-  byte xconnect_override;
-} mixer_write_prog_bri[] =
-{
-  { 0, 0, LI_COEF_CH_CH, 0x01 },  /* B      to B      */
-  { 1, 0, LI_COEF_CH_CH, 0x01 },  /* Alt B  to B      */
-  { 0, 0, LI_COEF_PC_CH, 0x80 },  /* PC     to B      */
-  { 1, 0, LI_COEF_PC_CH, 0x01 },  /* Alt PC to B      */
-  { 2, 0, LI_COEF_CH_CH, 0x00 },  /* IC     to B      */
-  { 3, 0, LI_COEF_CH_CH, 0x00 },  /* Alt IC to B      */
-  { 0, 0, LI_COEF_CH_PC, 0x80 },  /* B      to PC     */
-  { 1, 0, LI_COEF_CH_PC, 0x01 },  /* Alt B  to PC     */
-  { 0, 0, LI_COEF_PC_PC, 0x01 },  /* PC     to PC     */
-  { 1, 0, LI_COEF_PC_PC, 0x01 },  /* Alt PC to PC     */
-  { 2, 0, LI_COEF_CH_PC, 0x00 },  /* IC     to PC     */
-  { 3, 0, LI_COEF_CH_PC, 0x00 },  /* Alt IC to PC     */
-  { 0, 2, LI_COEF_CH_CH, 0x00 },  /* B      to IC     */
-  { 1, 2, LI_COEF_CH_CH, 0x00 },  /* Alt B  to IC     */
-  { 0, 2, LI_COEF_PC_CH, 0x00 },  /* PC     to IC     */
-  { 1, 2, LI_COEF_PC_CH, 0x00 },  /* Alt PC to IC     */
-  { 2, 2, LI_COEF_CH_CH, 0x00 },  /* IC     to IC     */
-  { 3, 2, LI_COEF_CH_CH, 0x00 },  /* Alt IC to IC     */
-  { 1, 1, LI_COEF_CH_CH, 0x01 },  /* Alt B  to Alt B  */
-  { 0, 1, LI_COEF_CH_CH, 0x01 },  /* B      to Alt B  */
-  { 1, 1, LI_COEF_PC_CH, 0x80 },  /* Alt PC to Alt B  */
-  { 0, 1, LI_COEF_PC_CH, 0x01 },  /* PC     to Alt B  */
-  { 3, 1, LI_COEF_CH_CH, 0x00 },  /* Alt IC to Alt B  */
-  { 2, 1, LI_COEF_CH_CH, 0x00 },  /* IC     to Alt B  */
-  { 1, 1, LI_COEF_CH_PC, 0x80 },  /* Alt B  to Alt PC */
-  { 0, 1, LI_COEF_CH_PC, 0x01 },  /* B      to Alt PC */
-  { 1, 1, LI_COEF_PC_PC, 0x01 },  /* Alt PC to Alt PC */
-  { 0, 1, LI_COEF_PC_PC, 0x01 },  /* PC     to Alt PC */
-  { 3, 1, LI_COEF_CH_PC, 0x00 },  /* Alt IC to Alt PC */
-  { 2, 1, LI_COEF_CH_PC, 0x00 },  /* IC     to Alt PC */
-  { 1, 3, LI_COEF_CH_CH, 0x00 },  /* Alt B  to Alt IC */
-  { 0, 3, LI_COEF_CH_CH, 0x00 },  /* B      to Alt IC */
-  { 1, 3, LI_COEF_PC_CH, 0x00 },  /* Alt PC to Alt IC */
-  { 0, 3, LI_COEF_PC_CH, 0x00 },  /* PC     to Alt IC */
-  { 3, 3, LI_COEF_CH_CH, 0x00 },  /* Alt IC to Alt IC */
-  { 2, 3, LI_COEF_CH_CH, 0x00 }   /* IC     to Alt IC */
-};
-
-static byte mixer_swapped_index_bri[] =
-{
-  18,  /* B      to B      */
-  19,  /* Alt B  to B      */
-  20,  /* PC     to B      */
-  21,  /* Alt PC to B      */
-  22,  /* IC     to B      */
-  23,  /* Alt IC to B      */
-  24,  /* B      to PC     */
-  25,  /* Alt B  to PC     */
-  26,  /* PC     to PC     */
-  27,  /* Alt PC to PC     */
-  28,  /* IC     to PC     */
-  29,  /* Alt IC to PC     */
-  30,  /* B      to IC     */
-  31,  /* Alt B  to IC     */
-  32,  /* PC     to IC     */
-  33,  /* Alt PC to IC     */
-  34,  /* IC     to IC     */
-  35,  /* Alt IC to IC     */
-  0,   /* Alt B  to Alt B  */
-  1,   /* B      to Alt B  */
-  2,   /* Alt PC to Alt B  */
-  3,   /* PC     to Alt B  */
-  4,   /* Alt IC to Alt B  */
-  5,   /* IC     to Alt B  */
-  6,   /* Alt B  to Alt PC */
-  7,   /* B      to Alt PC */
-  8,   /* Alt PC to Alt PC */
-  9,   /* PC     to Alt PC */
-  10,  /* Alt IC to Alt PC */
-  11,  /* IC     to Alt PC */
-  12,  /* Alt B  to Alt IC */
-  13,  /* B      to Alt IC */
-  14,  /* Alt PC to Alt IC */
-  15,  /* PC     to Alt IC */
-  16,  /* Alt IC to Alt IC */
-  17   /* IC     to Alt IC */
-};
-
-static struct
-{
-  byte mask;
-  byte from_pc;
-  byte to_pc;
-} xconnect_write_prog[] =
-{
-  { LI_COEF_CH_CH, false, false },
-  { LI_COEF_CH_PC, false, true },
-  { LI_COEF_PC_CH, true, false },
-  { LI_COEF_PC_PC, true, true }
-};
-
-
-static void xconnect_query_addresses (PLCI   *plci)
-{
-  DIVA_CAPI_ADAPTER   *a;
-  word w, ch;
-  byte   *p;
-
-  dbug (1, dprintf ("[%06lx] %s,%d: xconnect_query_addresses",
-    (dword)((plci->Id << 8) | UnMapController (plci->adapter->Id)),
-    (char   *)(FILE_), __LINE__));
-
-  a = plci->adapter;
-  if (a->li_pri && ((plci->li_bchannel_id == 0)
-   || (li_config_table[a->li_base + (plci->li_bchannel_id - 1)].plci != plci)))
-  {
-    dbug (1, dprintf ("[%06x] %s,%d: Channel id wiped out",
-      (dword)((plci->Id << 8) | UnMapController (plci->adapter->Id)),
-      (char   *)(FILE_), __LINE__));
-    return;
-  }
-  p = plci->internal_req_buffer;
-  ch = (a->li_pri) ? plci->li_bchannel_id - 1 : 0;
-  *(p++) = UDATA_REQUEST_XCONNECT_FROM;
-  w = ch;
-  *(p++) = (byte) w;
-  *(p++) = (byte)(w >> 8);
-  w = ch | XCONNECT_CHANNEL_PORT_PC;
-  *(p++) = (byte) w;
-  *(p++) = (byte)(w >> 8);
-  plci->NData[0].P = plci->internal_req_buffer;
-  plci->NData[0].PLength = p - plci->internal_req_buffer;
-  plci->NL.X = plci->NData;
-  plci->NL.ReqCh = 0;
-  plci->NL.Req = plci->nl_req = (byte) N_UDATA;
-  plci->adapter->request (&plci->NL);
-}
-
-
-static void xconnect_write_coefs (PLCI   *plci, word internal_command)
-{
-
-  dbug (1, dprintf ("[%06lx] %s,%d: xconnect_write_coefs %04x",
-    (dword)((plci->Id << 8) | UnMapController (plci->adapter->Id)),
-    (char   *)(FILE_), __LINE__, internal_command));
-
-  plci->li_write_command = internal_command;
-  plci->li_write_channel = 0;
-}
-
-
-static byte xconnect_write_coefs_process (dword Id, PLCI   *plci, byte Rc)
-{
-  DIVA_CAPI_ADAPTER   *a;
-  word w, n, i, j, r, s, to_ch;
-  dword d;
-  byte   *p;
-  struct xconnect_transfer_address_s   *transfer_address;
-  byte ch_map[MIXER_CHANNELS_BRI];
-
-  dbug (1, dprintf ("[%06x] %s,%d: xconnect_write_coefs_process %02x %d",
-    UnMapId (Id), (char   *)(FILE_), __LINE__, Rc, plci->li_write_channel));
-
-  a = plci->adapter;
-  if ((plci->li_bchannel_id == 0)
-   || (li_config_table[a->li_base + (plci->li_bchannel_id - 1)].plci != plci))
-  {
-    dbug (1, dprintf ("[%06x] %s,%d: Channel id wiped out",
-      UnMapId (Id), (char   *)(FILE_), __LINE__));
-    return (true);
-  }
-  i = a->li_base + (plci->li_bchannel_id - 1);
-  j = plci->li_write_channel;
-  p = plci->internal_req_buffer;
-  if (j != 0)
-  {
-    if ((Rc != OK) && (Rc != OK_FC))
-    {
-      dbug (1, dprintf ("[%06lx] %s,%d: LI write coefs failed %02x",
-        UnMapId (Id), (char   *)(FILE_), __LINE__, Rc));
-      return (false);
-    }
-  }
-  if (li_config_table[i].adapter->manufacturer_features & MANUFACTURER_FEATURE_XCONNECT)
-  {
-    r = 0;
-    s = 0;
-    if (j < li_total_channels)
-    {
-      if (li_config_table[i].channel & LI_CHANNEL_ADDRESSES_SET)
-      {
-        s = ((li_config_table[i].send_b.card_address.low | li_config_table[i].send_b.card_address.high) ?
-            (LI_COEF_CH_CH | LI_COEF_CH_PC | LI_COEF_PC_CH | LI_COEF_PC_PC) : (LI_COEF_CH_PC | LI_COEF_PC_PC)) &
-          ((li_config_table[i].send_pc.card_address.low | li_config_table[i].send_pc.card_address.high) ?
-            (LI_COEF_CH_CH | LI_COEF_CH_PC | LI_COEF_PC_CH | LI_COEF_PC_PC) : (LI_COEF_CH_CH | LI_COEF_PC_CH));
-      }
-      r = ((li_config_table[i].coef_table[j] & 0xf) ^ (li_config_table[i].coef_table[j] >> 4));
-      while ((j < li_total_channels)
-        && ((r == 0)
-         || (!(li_config_table[j].channel & LI_CHANNEL_ADDRESSES_SET))
-         || (!li_config_table[j].adapter->li_pri
-          && (j >= li_config_table[j].adapter->li_base + MIXER_BCHANNELS_BRI))
-         || (((li_config_table[j].send_b.card_address.low != li_config_table[i].send_b.card_address.low)
-           || (li_config_table[j].send_b.card_address.high != li_config_table[i].send_b.card_address.high))
-          && (!(a->manufacturer_features & MANUFACTURER_FEATURE_DMACONNECT)
-           || !(li_config_table[j].adapter->manufacturer_features & MANUFACTURER_FEATURE_DMACONNECT)))
-         || ((li_config_table[j].adapter->li_base != a->li_base)
-          && !(r & s &
-            ((li_config_table[j].send_b.card_address.low | li_config_table[j].send_b.card_address.high) ?
-              (LI_COEF_CH_CH | LI_COEF_CH_PC | LI_COEF_PC_CH | LI_COEF_PC_PC) : (LI_COEF_PC_CH | LI_COEF_PC_PC)) &
-            ((li_config_table[j].send_pc.card_address.low | li_config_table[j].send_pc.card_address.high) ?
-              (LI_COEF_CH_CH | LI_COEF_CH_PC | LI_COEF_PC_CH | LI_COEF_PC_PC) : (LI_COEF_CH_CH | LI_COEF_CH_PC))))))
-      {
-        j++;
-        if (j < li_total_channels)
-          r = ((li_config_table[i].coef_table[j] & 0xf) ^ (li_config_table[i].coef_table[j] >> 4));
-      }
-    }
-    if (j < li_total_channels)
-    {
-      plci->internal_command = plci->li_write_command;
-      if (plci_nl_busy (plci))
-        return (true);
-      to_ch = (a->li_pri) ? plci->li_bchannel_id - 1 : 0;
-      *(p++) = UDATA_REQUEST_XCONNECT_TO;
-      do
-      {
-        if (li_config_table[j].adapter->li_base != a->li_base)
-        {
-          r &= s &
-            ((li_config_table[j].send_b.card_address.low | li_config_table[j].send_b.card_address.high) ?
-              (LI_COEF_CH_CH | LI_COEF_CH_PC | LI_COEF_PC_CH | LI_COEF_PC_PC) : (LI_COEF_PC_CH | LI_COEF_PC_PC)) &
-            ((li_config_table[j].send_pc.card_address.low | li_config_table[j].send_pc.card_address.high) ?
-              (LI_COEF_CH_CH | LI_COEF_CH_PC | LI_COEF_PC_CH | LI_COEF_PC_PC) : (LI_COEF_CH_CH | LI_COEF_CH_PC));
-        }
-        n = 0;
-        do
-        {
-          if (r & xconnect_write_prog[n].mask)
-          {
-            if (xconnect_write_prog[n].from_pc)
-              transfer_address = &(li_config_table[j].send_pc);
-            else
-              transfer_address = &(li_config_table[j].send_b);
-            d = transfer_address->card_address.low;
-            *(p++) = (byte) d;
-            *(p++) = (byte)(d >> 8);
-            *(p++) = (byte)(d >> 16);
-            *(p++) = (byte)(d >> 24);
-            d = transfer_address->card_address.high;
-            *(p++) = (byte) d;
-            *(p++) = (byte)(d >> 8);
-            *(p++) = (byte)(d >> 16);
-            *(p++) = (byte)(d >> 24);
-            d = transfer_address->offset;
-            *(p++) = (byte) d;
-            *(p++) = (byte)(d >> 8);
-            *(p++) = (byte)(d >> 16);
-            *(p++) = (byte)(d >> 24);
-            w = xconnect_write_prog[n].to_pc ? to_ch | XCONNECT_CHANNEL_PORT_PC : to_ch;
-            *(p++) = (byte) w;
-            *(p++) = (byte)(w >> 8);
-            w = ((li_config_table[i].coef_table[j] & xconnect_write_prog[n].mask) == 0) ? 0x01 :
-              (li_config_table[i].adapter->u_law ?
-                 (li_config_table[j].adapter->u_law ? 0x80 : 0x86) :
-                 (li_config_table[j].adapter->u_law ? 0x7a : 0x80));
-            *(p++) = (byte) w;
-            *(p++) = (byte) 0;
-            li_config_table[i].coef_table[j] ^= xconnect_write_prog[n].mask << 4;
-          }
-          n++;
-        } while ((n < ARRAY_SIZE(xconnect_write_prog))
-          && ((p - plci->internal_req_buffer) + 16 < INTERNAL_REQ_BUFFER_SIZE));
-        if (n == ARRAY_SIZE(xconnect_write_prog))
-        {
-          do
-          {
-            j++;
-            if (j < li_total_channels)
-              r = ((li_config_table[i].coef_table[j] & 0xf) ^ (li_config_table[i].coef_table[j] >> 4));
-          } while ((j < li_total_channels)
-            && ((r == 0)
-             || (!(li_config_table[j].channel & LI_CHANNEL_ADDRESSES_SET))
-             || (!li_config_table[j].adapter->li_pri
-              && (j >= li_config_table[j].adapter->li_base + MIXER_BCHANNELS_BRI))
-             || (((li_config_table[j].send_b.card_address.low != li_config_table[i].send_b.card_address.low)
-               || (li_config_table[j].send_b.card_address.high != li_config_table[i].send_b.card_address.high))
-              && (!(a->manufacturer_features & MANUFACTURER_FEATURE_DMACONNECT)
-               || !(li_config_table[j].adapter->manufacturer_features & MANUFACTURER_FEATURE_DMACONNECT)))
-             || ((li_config_table[j].adapter->li_base != a->li_base)
-              && !(r & s &
-                ((li_config_table[j].send_b.card_address.low | li_config_table[j].send_b.card_address.high) ?
-                  (LI_COEF_CH_CH | LI_COEF_CH_PC | LI_COEF_PC_CH | LI_COEF_PC_PC) : (LI_COEF_PC_CH | LI_COEF_PC_PC)) &
-                ((li_config_table[j].send_pc.card_address.low | li_config_table[j].send_pc.card_address.high) ?
-                  (LI_COEF_CH_CH | LI_COEF_CH_PC | LI_COEF_PC_CH | LI_COEF_PC_PC) : (LI_COEF_CH_CH | LI_COEF_CH_PC))))));
-        }
-      } while ((j < li_total_channels)
-        && ((p - plci->internal_req_buffer) + 16 < INTERNAL_REQ_BUFFER_SIZE));
-    }
-    else if (j == li_total_channels)
-    {
-      plci->internal_command = plci->li_write_command;
-      if (plci_nl_busy (plci))
-        return (true);
-      if (a->li_pri)
-      {
-        *(p++) = UDATA_REQUEST_SET_MIXER_COEFS_PRI_SYNC;
-        w = 0;
-        if (li_config_table[i].channel & LI_CHANNEL_TX_DATA)
-          w |= MIXER_FEATURE_ENABLE_TX_DATA;
-        if (li_config_table[i].channel & LI_CHANNEL_RX_DATA)
-          w |= MIXER_FEATURE_ENABLE_RX_DATA;
-        *(p++) = (byte) w;
-        *(p++) = (byte)(w >> 8);
-      }
-      else
-      {
-        *(p++) = UDATA_REQUEST_SET_MIXER_COEFS_BRI;
-        w = 0;
-        if ((plci->tel == ADV_VOICE) && (plci == a->AdvSignalPLCI)
-         && (ADV_VOICE_NEW_COEF_BASE + sizeof(word) <= a->adv_voice_coef_length))
-        {
-          w = GET_WORD (a->adv_voice_coef_buffer + ADV_VOICE_NEW_COEF_BASE);
-        }
-        if (li_config_table[i].channel & LI_CHANNEL_TX_DATA)
-          w |= MIXER_FEATURE_ENABLE_TX_DATA;
-        if (li_config_table[i].channel & LI_CHANNEL_RX_DATA)
-          w |= MIXER_FEATURE_ENABLE_RX_DATA;
-        *(p++) = (byte) w;
-        *(p++) = (byte)(w >> 8);
-        for (j = 0; j < sizeof(ch_map); j += 2)
-        {
-          if (plci->li_bchannel_id == 2)
-          {
-            ch_map[j] = (byte)(j+1);
-            ch_map[j+1] = (byte) j;
-          }
-          else
-          {
-            ch_map[j] = (byte) j;
-            ch_map[j+1] = (byte)(j+1);
-          }
-        }
-        for (n = 0; n < ARRAY_SIZE(mixer_write_prog_bri); n++)
-        {
-          i = a->li_base + ch_map[mixer_write_prog_bri[n].to_ch];
-          j = a->li_base + ch_map[mixer_write_prog_bri[n].from_ch];
-          if (li_config_table[i].channel & li_config_table[j].channel & LI_CHANNEL_INVOLVED)
-          {
-            *p = (mixer_write_prog_bri[n].xconnect_override != 0) ?
-              mixer_write_prog_bri[n].xconnect_override :
-              ((li_config_table[i].coef_table[j] & mixer_write_prog_bri[n].mask) ? 0x80 : 0x01);
-            if ((i >= a->li_base + MIXER_BCHANNELS_BRI) || (j >= a->li_base + MIXER_BCHANNELS_BRI))
-            {
-              w = ((li_config_table[i].coef_table[j] & 0xf) ^ (li_config_table[i].coef_table[j] >> 4));
-              li_config_table[i].coef_table[j] ^= (w & mixer_write_prog_bri[n].mask) << 4;
-            }
-          }
-          else
-          {
-            *p = 0x00;
-            if ((a->AdvSignalPLCI != NULL) && (a->AdvSignalPLCI->tel == ADV_VOICE))
-            {
-              w = (plci == a->AdvSignalPLCI) ? n : mixer_swapped_index_bri[n];
-              if (ADV_VOICE_NEW_COEF_BASE + sizeof(word) + w < a->adv_voice_coef_length)
-                *p = a->adv_voice_coef_buffer[ADV_VOICE_NEW_COEF_BASE + sizeof(word) + w];
-            }
-          }
-          p++;
-        }
-      }
-      j = li_total_channels + 1;
-    }
-  }
-  else
-  {
-    if (j <= li_total_channels)
-    {
-      plci->internal_command = plci->li_write_command;
-      if (plci_nl_busy (plci))
-        return (true);
-      if (j < a->li_base)
-        j = a->li_base;
-      if (a->li_pri)
-      {
-        *(p++) = UDATA_REQUEST_SET_MIXER_COEFS_PRI_SYNC;
-        w = 0;
-        if (li_config_table[i].channel & LI_CHANNEL_TX_DATA)
-          w |= MIXER_FEATURE_ENABLE_TX_DATA;
-        if (li_config_table[i].channel & LI_CHANNEL_RX_DATA)
-          w |= MIXER_FEATURE_ENABLE_RX_DATA;
-        *(p++) = (byte) w;
-        *(p++) = (byte)(w >> 8);
-        for (n = 0; n < ARRAY_SIZE(mixer_write_prog_pri); n++)
-        {
-          *(p++) = (byte)((plci->li_bchannel_id - 1) | mixer_write_prog_pri[n].line_flags);
-          for (j = a->li_base; j < a->li_base + MIXER_CHANNELS_PRI; j++)
-          {
-            w = ((li_config_table[i].coef_table[j] & 0xf) ^ (li_config_table[i].coef_table[j] >> 4));
-            if (w & mixer_write_prog_pri[n].mask)
-            {
-              *(p++) = (li_config_table[i].coef_table[j] & mixer_write_prog_pri[n].mask) ? 0x80 : 0x01;
-              li_config_table[i].coef_table[j] ^= mixer_write_prog_pri[n].mask << 4;
-            }
-            else
-              *(p++) = 0x00;
-          }
-          *(p++) = (byte)((plci->li_bchannel_id - 1) | MIXER_COEF_LINE_ROW_FLAG | mixer_write_prog_pri[n].line_flags);
-          for (j = a->li_base; j < a->li_base + MIXER_CHANNELS_PRI; j++)
-          {
-            w = ((li_config_table[j].coef_table[i] & 0xf) ^ (li_config_table[j].coef_table[i] >> 4));
-            if (w & mixer_write_prog_pri[n].mask)
-            {
-              *(p++) = (li_config_table[j].coef_table[i] & mixer_write_prog_pri[n].mask) ? 0x80 : 0x01;
-              li_config_table[j].coef_table[i] ^= mixer_write_prog_pri[n].mask << 4;
-            }
-            else
-              *(p++) = 0x00;
-          }
-        }
-      }
-      else
-      {
-        *(p++) = UDATA_REQUEST_SET_MIXER_COEFS_BRI;
-        w = 0;
-        if ((plci->tel == ADV_VOICE) && (plci == a->AdvSignalPLCI)
-         && (ADV_VOICE_NEW_COEF_BASE + sizeof(word) <= a->adv_voice_coef_length))
-        {
-          w = GET_WORD (a->adv_voice_coef_buffer + ADV_VOICE_NEW_COEF_BASE);
-        }
-        if (li_config_table[i].channel & LI_CHANNEL_TX_DATA)
-          w |= MIXER_FEATURE_ENABLE_TX_DATA;
-        if (li_config_table[i].channel & LI_CHANNEL_RX_DATA)
-          w |= MIXER_FEATURE_ENABLE_RX_DATA;
-        *(p++) = (byte) w;
-        *(p++) = (byte)(w >> 8);
-        for (j = 0; j < sizeof(ch_map); j += 2)
-        {
-          if (plci->li_bchannel_id == 2)
-          {
-            ch_map[j] = (byte)(j+1);
-            ch_map[j+1] = (byte) j;
-          }
-          else
-          {
-            ch_map[j] = (byte) j;
-            ch_map[j+1] = (byte)(j+1);
-          }
-        }
-        for (n = 0; n < ARRAY_SIZE(mixer_write_prog_bri); n++)
-        {
-          i = a->li_base + ch_map[mixer_write_prog_bri[n].to_ch];
-          j = a->li_base + ch_map[mixer_write_prog_bri[n].from_ch];
-          if (li_config_table[i].channel & li_config_table[j].channel & LI_CHANNEL_INVOLVED)
-          {
-            *p = ((li_config_table[i].coef_table[j] & mixer_write_prog_bri[n].mask) ? 0x80 : 0x01);
-            w = ((li_config_table[i].coef_table[j] & 0xf) ^ (li_config_table[i].coef_table[j] >> 4));
-            li_config_table[i].coef_table[j] ^= (w & mixer_write_prog_bri[n].mask) << 4;
-          }
-          else
-          {
-            *p = 0x00;
-            if ((a->AdvSignalPLCI != NULL) && (a->AdvSignalPLCI->tel == ADV_VOICE))
-            {
-              w = (plci == a->AdvSignalPLCI) ? n : mixer_swapped_index_bri[n];
-              if (ADV_VOICE_NEW_COEF_BASE + sizeof(word) + w < a->adv_voice_coef_length)
-                *p = a->adv_voice_coef_buffer[ADV_VOICE_NEW_COEF_BASE + sizeof(word) + w];
-            }
-          }
-          p++;
-        }
-      }
-      j = li_total_channels + 1;
-    }
-  }
-  plci->li_write_channel = j;
-  if (p != plci->internal_req_buffer)
-  {
-    plci->NData[0].P = plci->internal_req_buffer;
-    plci->NData[0].PLength = p - plci->internal_req_buffer;
-    plci->NL.X = plci->NData;
-    plci->NL.ReqCh = 0;
-    plci->NL.Req = plci->nl_req = (byte) N_UDATA;
-    plci->adapter->request (&plci->NL);
-  }
-  return (true);
-}
-
-
-static void mixer_notify_update (PLCI   *plci, byte others)
-{
-  DIVA_CAPI_ADAPTER   *a;
-  word i, w;
-  PLCI   *notify_plci;
-    byte msg[sizeof(CAPI_MSG_HEADER) + 6];
-
-  dbug (1, dprintf ("[%06lx] %s,%d: mixer_notify_update %d",
-    (dword)((plci->Id << 8) | UnMapController (plci->adapter->Id)),
-    (char   *)(FILE_), __LINE__, others));
-
-  a = plci->adapter;
-  if (a->profile.Global_Options & GL_LINE_INTERCONNECT_SUPPORTED)
-  {
-    if (others)
-      plci->li_notify_update = true;
-    i = 0;
-    do
-    {
-      notify_plci = NULL;
-      if (others)
-      {
-        while ((i < li_total_channels) && (li_config_table[i].plci == NULL))
-          i++;
-        if (i < li_total_channels)
-          notify_plci = li_config_table[i++].plci;
-      }
-      else
-      {
-        if ((plci->li_bchannel_id != 0)
-         && (li_config_table[a->li_base + (plci->li_bchannel_id - 1)].plci == plci))
-        {
-          notify_plci = plci;
-        }
-      }
-      if ((notify_plci != NULL)
-       && !notify_plci->li_notify_update
-       && (notify_plci->appl != NULL)
-       && (notify_plci->State)
-       && notify_plci->NL.Id && !notify_plci->nl_remove_id)
-      {
-        notify_plci->li_notify_update = true;
-        ((CAPI_MSG *) msg)->header.length = 18;
-        ((CAPI_MSG *) msg)->header.appl_id = notify_plci->appl->Id;
-        ((CAPI_MSG *) msg)->header.command = _FACILITY_R;
-        ((CAPI_MSG *) msg)->header.number = 0;
-        ((CAPI_MSG *) msg)->header.controller = notify_plci->adapter->Id;
-        ((CAPI_MSG *) msg)->header.plci = notify_plci->Id;
-        ((CAPI_MSG *) msg)->header.ncci = 0;
-        ((CAPI_MSG *) msg)->info.facility_req.Selector = SELECTOR_LINE_INTERCONNECT;
-        ((CAPI_MSG *) msg)->info.facility_req.structs[0] = 3;
-        PUT_WORD (&(((CAPI_MSG *) msg)->info.facility_req.structs[1]), LI_REQ_SILENT_UPDATE);
-        ((CAPI_MSG *) msg)->info.facility_req.structs[3] = 0;
-        w = api_put (notify_plci->appl, (CAPI_MSG *) msg);
-        if (w != _QUEUE_FULL)
-        {
-          if (w != 0)
-          {
-            dbug (1, dprintf ("[%06lx] %s,%d: Interconnect notify failed %06x %d",
-              (dword)((plci->Id << 8) | UnMapController (plci->adapter->Id)),
-              (char   *)(FILE_), __LINE__,
-              (dword)((notify_plci->Id << 8) | UnMapController (notify_plci->adapter->Id)), w));
-          }
-          notify_plci->li_notify_update = false;
-        }
-      }
-    } while (others && (notify_plci != NULL));
-    if (others)
-      plci->li_notify_update = false;
-  }
-}
-
-
-static void mixer_clear_config (PLCI   *plci)
-{
-  DIVA_CAPI_ADAPTER   *a;
-  word i, j;
-
-  dbug (1, dprintf ("[%06lx] %s,%d: mixer_clear_config",
-    (dword)((plci->Id << 8) | UnMapController (plci->adapter->Id)),
-    (char   *)(FILE_), __LINE__));
-
-  plci->li_notify_update = false;
-  plci->li_plci_b_write_pos = 0;
-  plci->li_plci_b_read_pos = 0;
-  plci->li_plci_b_req_pos = 0;
-  a = plci->adapter;
-  if ((plci->li_bchannel_id != 0)
-   && (li_config_table[a->li_base + (plci->li_bchannel_id - 1)].plci == plci))
-  {
-    i = a->li_base + (plci->li_bchannel_id - 1);
-    li_config_table[i].curchnl = 0;
-    li_config_table[i].channel = 0;
-    li_config_table[i].chflags = 0;
-    for (j = 0; j < li_total_channels; j++)
-    {
-      li_config_table[j].flag_table[i] = 0;
-      li_config_table[i].flag_table[j] = 0;
-      li_config_table[i].coef_table[j] = 0;
-      li_config_table[j].coef_table[i] = 0;
-    }
-    if (!a->li_pri)
-    {
-      li_config_table[i].coef_table[i] |= LI_COEF_CH_PC_SET | LI_COEF_PC_CH_SET;
-      if ((plci->tel == ADV_VOICE) && (plci == a->AdvSignalPLCI))
-      {
-        i = a->li_base + MIXER_IC_CHANNEL_BASE + (plci->li_bchannel_id - 1);
-        li_config_table[i].curchnl = 0;
-        li_config_table[i].channel = 0;
-        li_config_table[i].chflags = 0;
-        for (j = 0; j < li_total_channels; j++)
-        {
-          li_config_table[i].flag_table[j] = 0;
-          li_config_table[j].flag_table[i] = 0;
-          li_config_table[i].coef_table[j] = 0;
-          li_config_table[j].coef_table[i] = 0;
-        }
-        if (a->manufacturer_features & MANUFACTURER_FEATURE_SLAVE_CODEC)
-        {
-          i = a->li_base + MIXER_IC_CHANNEL_BASE + (2 - plci->li_bchannel_id);
-          li_config_table[i].curchnl = 0;
-          li_config_table[i].channel = 0;
-          li_config_table[i].chflags = 0;
-          for (j = 0; j < li_total_channels; j++)
-          {
-            li_config_table[i].flag_table[j] = 0;
-            li_config_table[j].flag_table[i] = 0;
-            li_config_table[i].coef_table[j] = 0;
-            li_config_table[j].coef_table[i] = 0;
-          }
-        }
-      }
-    }
-  }
-}
-
-
-static void mixer_prepare_switch (dword Id, PLCI   *plci)
-{
-
-  dbug (1, dprintf ("[%06lx] %s,%d: mixer_prepare_switch",
-    UnMapId (Id), (char   *)(FILE_), __LINE__));
-
-  do
-  {
-    mixer_indication_coefs_set (Id, plci);
-  } while (plci->li_plci_b_read_pos != plci->li_plci_b_req_pos);
-}
-
-
-static word mixer_save_config (dword Id, PLCI   *plci, byte Rc)
-{
-  DIVA_CAPI_ADAPTER   *a;
-  word i, j;
-
-  dbug (1, dprintf ("[%06lx] %s,%d: mixer_save_config %02x %d",
-    UnMapId (Id), (char   *)(FILE_), __LINE__, Rc, plci->adjust_b_state));
-
-  a = plci->adapter;
-  if ((plci->li_bchannel_id != 0)
-   && (li_config_table[a->li_base + (plci->li_bchannel_id - 1)].plci == plci))
-  {
-    i = a->li_base + (plci->li_bchannel_id - 1);
-    for (j = 0; j < li_total_channels; j++)
-    {
-      li_config_table[i].coef_table[j] &= 0xf;
-      li_config_table[j].coef_table[i] &= 0xf;
-    }
-    if (!a->li_pri)
-      li_config_table[i].coef_table[i] |= LI_COEF_CH_PC_SET | LI_COEF_PC_CH_SET;
-  }
-  return (GOOD);
-}
-
-
-static word mixer_restore_config (dword Id, PLCI   *plci, byte Rc)
-{
-  DIVA_CAPI_ADAPTER   *a;
-  word Info;
-
-  dbug (1, dprintf ("[%06lx] %s,%d: mixer_restore_config %02x %d",
-    UnMapId (Id), (char   *)(FILE_), __LINE__, Rc, plci->adjust_b_state));
-
-  Info = GOOD;
-  a = plci->adapter;
-  if ((plci->B1_facilities & B1_FACILITY_MIXER)
-   && (plci->li_bchannel_id != 0)
-   && (li_config_table[a->li_base + (plci->li_bchannel_id - 1)].plci == plci))
-  {
-    switch (plci->adjust_b_state)
-    {
-    case ADJUST_B_RESTORE_MIXER_1:
-      if (a->manufacturer_features & MANUFACTURER_FEATURE_XCONNECT)
-      {
-        plci->internal_command = plci->adjust_b_command;
-        if (plci_nl_busy (plci))
-        {
-          plci->adjust_b_state = ADJUST_B_RESTORE_MIXER_1;
-          break;
-        }
-        xconnect_query_addresses (plci);
-        plci->adjust_b_state = ADJUST_B_RESTORE_MIXER_2;
-        break;
-      }
-      plci->adjust_b_state = ADJUST_B_RESTORE_MIXER_5;
-      Rc = OK;
-    case ADJUST_B_RESTORE_MIXER_2:
-    case ADJUST_B_RESTORE_MIXER_3:
-    case ADJUST_B_RESTORE_MIXER_4:
-      if ((Rc != OK) && (Rc != OK_FC) && (Rc != 0))
-      {
-        dbug (1, dprintf ("[%06lx] %s,%d: Adjust B query addresses failed %02x",
-          UnMapId (Id), (char   *)(FILE_), __LINE__, Rc));
-        Info = _WRONG_STATE;
-        break;
-      }
-      if (Rc == OK)
-      {
-        if (plci->adjust_b_state == ADJUST_B_RESTORE_MIXER_2)
-          plci->adjust_b_state = ADJUST_B_RESTORE_MIXER_3;
-        else if (plci->adjust_b_state == ADJUST_B_RESTORE_MIXER_4)
-          plci->adjust_b_state = ADJUST_B_RESTORE_MIXER_5;
-      }
-      else if (Rc == 0)
-      {
-        if (plci->adjust_b_state == ADJUST_B_RESTORE_MIXER_2)
-          plci->adjust_b_state = ADJUST_B_RESTORE_MIXER_4;
-        else if (plci->adjust_b_state == ADJUST_B_RESTORE_MIXER_3)
-          plci->adjust_b_state = ADJUST_B_RESTORE_MIXER_5;
-      }
-      if (plci->adjust_b_state != ADJUST_B_RESTORE_MIXER_5)
-      {
-        plci->internal_command = plci->adjust_b_command;
-        break;
-      }
-    case ADJUST_B_RESTORE_MIXER_5:
-      xconnect_write_coefs (plci, plci->adjust_b_command);
-      plci->adjust_b_state = ADJUST_B_RESTORE_MIXER_6;
-      Rc = OK;
-    case ADJUST_B_RESTORE_MIXER_6:
-      if (!xconnect_write_coefs_process (Id, plci, Rc))
-      {
-        dbug (1, dprintf ("[%06lx] %s,%d: Write mixer coefs failed",
-          UnMapId (Id), (char   *)(FILE_), __LINE__));
-        Info = _FACILITY_NOT_SUPPORTED;
-        break;
-      }
-      if (plci->internal_command)
-        break;
-      plci->adjust_b_state = ADJUST_B_RESTORE_MIXER_7;
-    case ADJUST_B_RESTORE_MIXER_7:
-      break;
-    }
-  }
-  return (Info);
-}
-
-
-static void mixer_command (dword Id, PLCI   *plci, byte Rc)
-{
-  DIVA_CAPI_ADAPTER   *a;
-  word i, internal_command;
-
-  dbug (1, dprintf ("[%06lx] %s,%d: mixer_command %02x %04x %04x",
-    UnMapId (Id), (char   *)(FILE_), __LINE__, Rc, plci->internal_command,
-    plci->li_cmd));
-
-  a = plci->adapter;
-  internal_command = plci->internal_command;
-  plci->internal_command = 0;
-  switch (plci->li_cmd)
-  {
-  case LI_REQ_CONNECT:
-  case LI_REQ_DISCONNECT:
-  case LI_REQ_SILENT_UPDATE:
-    switch (internal_command)
-    {
-    default:
-      if (plci->li_channel_bits & LI_CHANNEL_INVOLVED)
-      {
-        adjust_b1_resource (Id, plci, NULL, (word)(plci->B1_facilities |
-          B1_FACILITY_MIXER), MIXER_COMMAND_1);
-      }
-    case MIXER_COMMAND_1:
-      if (plci->li_channel_bits & LI_CHANNEL_INVOLVED)
-      {
-        if (adjust_b_process (Id, plci, Rc) != GOOD)
-        {
-          dbug (1, dprintf ("[%06lx] %s,%d: Load mixer failed",
-            UnMapId (Id), (char   *)(FILE_), __LINE__));
-          break;
-        }
-        if (plci->internal_command)
-          return;
-      }
-      plci->li_plci_b_req_pos = plci->li_plci_b_write_pos;
-      if ((plci->li_channel_bits & LI_CHANNEL_INVOLVED)
-       || ((get_b1_facilities (plci, plci->B1_resource) & B1_FACILITY_MIXER)
-        && (add_b1_facilities (plci, plci->B1_resource, (word)(plci->B1_facilities &
-         ~B1_FACILITY_MIXER)) == plci->B1_resource)))
-      {
-        xconnect_write_coefs (plci, MIXER_COMMAND_2);
-      }
-      else
-      {
-        do
-        {
-          mixer_indication_coefs_set (Id, plci);
-        } while (plci->li_plci_b_read_pos != plci->li_plci_b_req_pos);
-      }
-    case MIXER_COMMAND_2:
-      if ((plci->li_channel_bits & LI_CHANNEL_INVOLVED)
-       || ((get_b1_facilities (plci, plci->B1_resource) & B1_FACILITY_MIXER)
-        && (add_b1_facilities (plci, plci->B1_resource, (word)(plci->B1_facilities &
-         ~B1_FACILITY_MIXER)) == plci->B1_resource)))
-      {
-        if (!xconnect_write_coefs_process (Id, plci, Rc))
-        {
-          dbug (1, dprintf ("[%06lx] %s,%d: Write mixer coefs failed",
-            UnMapId (Id), (char   *)(FILE_), __LINE__));
-          if (plci->li_plci_b_write_pos != plci->li_plci_b_req_pos)
-          {
-            do
-            {
-              plci->li_plci_b_write_pos = (plci->li_plci_b_write_pos == 0) ?
-                LI_PLCI_B_QUEUE_ENTRIES-1 : plci->li_plci_b_write_pos - 1;
-              i = (plci->li_plci_b_write_pos == 0) ?
-                LI_PLCI_B_QUEUE_ENTRIES-1 : plci->li_plci_b_write_pos - 1;
-            } while ((plci->li_plci_b_write_pos != plci->li_plci_b_req_pos)
-              && !(plci->li_plci_b_queue[i] & LI_PLCI_B_LAST_FLAG));
-          }
-          break;
-        }
-        if (plci->internal_command)
-          return;
-      }
-      if (!(plci->li_channel_bits & LI_CHANNEL_INVOLVED))
-      {
-        adjust_b1_resource (Id, plci, NULL, (word)(plci->B1_facilities &
-          ~B1_FACILITY_MIXER), MIXER_COMMAND_3);
-      }
-    case MIXER_COMMAND_3:
-      if (!(plci->li_channel_bits & LI_CHANNEL_INVOLVED))
-      {
-        if (adjust_b_process (Id, plci, Rc) != GOOD)
-        {
-          dbug (1, dprintf ("[%06lx] %s,%d: Unload mixer failed",
-            UnMapId (Id), (char   *)(FILE_), __LINE__));
-          break;
-        }
-        if (plci->internal_command)
-          return;
-      }
-      break;
-    }
-    break;
-  }
-  if ((plci->li_bchannel_id == 0)
-   || (li_config_table[a->li_base + (plci->li_bchannel_id - 1)].plci != plci))
-  {
-    dbug (1, dprintf ("[%06x] %s,%d: Channel id wiped out %d",
-      UnMapId (Id), (char   *)(FILE_), __LINE__, (int)(plci->li_bchannel_id)));
-  }
-  else
-  {
-    i = a->li_base + (plci->li_bchannel_id - 1);
-    li_config_table[i].curchnl = plci->li_channel_bits;
-    if (!a->li_pri && (plci->tel == ADV_VOICE) && (plci == a->AdvSignalPLCI))
-    {
-      i = a->li_base + MIXER_IC_CHANNEL_BASE + (plci->li_bchannel_id - 1);
-      li_config_table[i].curchnl = plci->li_channel_bits;
-      if (a->manufacturer_features & MANUFACTURER_FEATURE_SLAVE_CODEC)
-      {
-        i = a->li_base + MIXER_IC_CHANNEL_BASE + (2 - plci->li_bchannel_id);
-        li_config_table[i].curchnl = plci->li_channel_bits;
-      }
-    }
-  }
-}
-
-
-static void li_update_connect (dword Id, DIVA_CAPI_ADAPTER   *a, PLCI   *plci,
-  dword plci_b_id, byte connect, dword li_flags)
-{
-  word i, ch_a, ch_a_v, ch_a_s, ch_b, ch_b_v, ch_b_s;
-  PLCI   *plci_b;
-  DIVA_CAPI_ADAPTER   *a_b;
-
-  a_b = &(adapter[MapController ((byte)(plci_b_id & 0x7f)) - 1]);
-  plci_b = &(a_b->plci[((plci_b_id >> 8) & 0xff) - 1]);
-  ch_a = a->li_base + (plci->li_bchannel_id - 1);
-  if (!a->li_pri && (plci->tel == ADV_VOICE)
-   && (plci == a->AdvSignalPLCI) && (Id & EXT_CONTROLLER))
-  {
-    ch_a_v = ch_a + MIXER_IC_CHANNEL_BASE;
-    ch_a_s = (a->manufacturer_features & MANUFACTURER_FEATURE_SLAVE_CODEC) ?
-      a->li_base + MIXER_IC_CHANNEL_BASE + (2 - plci->li_bchannel_id) : ch_a_v;
-  }
-  else
-  {
-    ch_a_v = ch_a;
-    ch_a_s = ch_a;
-  }
-  ch_b = a_b->li_base + (plci_b->li_bchannel_id - 1);
-  if (!a_b->li_pri && (plci_b->tel == ADV_VOICE)
-   && (plci_b == a_b->AdvSignalPLCI) && (plci_b_id & EXT_CONTROLLER))
-  {
-    ch_b_v = ch_b + MIXER_IC_CHANNEL_BASE;
-    ch_b_s = (a_b->manufacturer_features & MANUFACTURER_FEATURE_SLAVE_CODEC) ?
-      a_b->li_base + MIXER_IC_CHANNEL_BASE + (2 - plci_b->li_bchannel_id) : ch_b_v;
-  }
-  else
-  {
-    ch_b_v = ch_b;
-    ch_b_s = ch_b;
-  }
-  if (connect)
-  {
-    li_config_table[ch_a].flag_table[ch_a_v] &= ~LI_FLAG_MONITOR;
-    li_config_table[ch_a].flag_table[ch_a_s] &= ~LI_FLAG_MONITOR;
-    li_config_table[ch_a_v].flag_table[ch_a] &= ~(LI_FLAG_ANNOUNCEMENT | LI_FLAG_MIX);
-    li_config_table[ch_a_s].flag_table[ch_a] &= ~(LI_FLAG_ANNOUNCEMENT | LI_FLAG_MIX);
-  }
-  li_config_table[ch_a].flag_table[ch_b_v] &= ~LI_FLAG_MONITOR;
-  li_config_table[ch_a].flag_table[ch_b_s] &= ~LI_FLAG_MONITOR;
-  li_config_table[ch_b_v].flag_table[ch_a] &= ~(LI_FLAG_ANNOUNCEMENT | LI_FLAG_MIX);
-  li_config_table[ch_b_s].flag_table[ch_a] &= ~(LI_FLAG_ANNOUNCEMENT | LI_FLAG_MIX);
-  if (ch_a_v == ch_b_v)
-  {
-    li_config_table[ch_a_v].flag_table[ch_b_v] &= ~LI_FLAG_CONFERENCE;
-    li_config_table[ch_a_s].flag_table[ch_b_s] &= ~LI_FLAG_CONFERENCE;
-  }
-  else
-  {
-    if (li_config_table[ch_a_v].flag_table[ch_b_v] & LI_FLAG_CONFERENCE)
-    {
-      for (i = 0; i < li_total_channels; i++)
-      {
-        if (i != ch_a_v)
-          li_config_table[ch_a_v].flag_table[i] &= ~LI_FLAG_CONFERENCE;
-      }
-    }
-    if (li_config_table[ch_a_s].flag_table[ch_b_v] & LI_FLAG_CONFERENCE)
-    {
-      for (i = 0; i < li_total_channels; i++)
-      {
-        if (i != ch_a_s)
-          li_config_table[ch_a_s].flag_table[i] &= ~LI_FLAG_CONFERENCE;
-      }
-    }
-    if (li_config_table[ch_b_v].flag_table[ch_a_v] & LI_FLAG_CONFERENCE)
-    {
-      for (i = 0; i < li_total_channels; i++)
-      {
-        if (i != ch_a_v)
-          li_config_table[i].flag_table[ch_a_v] &= ~LI_FLAG_CONFERENCE;
-      }
-    }
-    if (li_config_table[ch_b_v].flag_table[ch_a_s] & LI_FLAG_CONFERENCE)
-    {
-      for (i = 0; i < li_total_channels; i++)
-      {
-        if (i != ch_a_s)
-          li_config_table[i].flag_table[ch_a_s] &= ~LI_FLAG_CONFERENCE;
-      }
-    }
-  }
-  if (li_flags & LI_FLAG_CONFERENCE_A_B)
-  {
-    li_config_table[ch_b_v].flag_table[ch_a_v] |= LI_FLAG_CONFERENCE;
-    li_config_table[ch_b_s].flag_table[ch_a_v] |= LI_FLAG_CONFERENCE;
-    li_config_table[ch_b_v].flag_table[ch_a_s] |= LI_FLAG_CONFERENCE;
-    li_config_table[ch_b_s].flag_table[ch_a_s] |= LI_FLAG_CONFERENCE;
-  }
-  if (li_flags & LI_FLAG_CONFERENCE_B_A)
-  {
-    li_config_table[ch_a_v].flag_table[ch_b_v] |= LI_FLAG_CONFERENCE;
-    li_config_table[ch_a_v].flag_table[ch_b_s] |= LI_FLAG_CONFERENCE;
-    li_config_table[ch_a_s].flag_table[ch_b_v] |= LI_FLAG_CONFERENCE;
-    li_config_table[ch_a_s].flag_table[ch_b_s] |= LI_FLAG_CONFERENCE;
-  }
-  if (li_flags & LI_FLAG_MONITOR_A)
-  {
-    li_config_table[ch_a].flag_table[ch_a_v] |= LI_FLAG_MONITOR;
-    li_config_table[ch_a].flag_table[ch_a_s] |= LI_FLAG_MONITOR;
-  }
-  if (li_flags & LI_FLAG_MONITOR_B)
-  {
-    li_config_table[ch_a].flag_table[ch_b_v] |= LI_FLAG_MONITOR;
-    li_config_table[ch_a].flag_table[ch_b_s] |= LI_FLAG_MONITOR;
-  }
-  if (li_flags & LI_FLAG_ANNOUNCEMENT_A)
-  {
-    li_config_table[ch_a_v].flag_table[ch_a] |= LI_FLAG_ANNOUNCEMENT;
-    li_config_table[ch_a_s].flag_table[ch_a] |= LI_FLAG_ANNOUNCEMENT;
-  }
-  if (li_flags & LI_FLAG_ANNOUNCEMENT_B)
-  {
-    li_config_table[ch_b_v].flag_table[ch_a] |= LI_FLAG_ANNOUNCEMENT;
-    li_config_table[ch_b_s].flag_table[ch_a] |= LI_FLAG_ANNOUNCEMENT;
-  }
-  if (li_flags & LI_FLAG_MIX_A)
-  {
-    li_config_table[ch_a_v].flag_table[ch_a] |= LI_FLAG_MIX;
-    li_config_table[ch_a_s].flag_table[ch_a] |= LI_FLAG_MIX;
-  }
-  if (li_flags & LI_FLAG_MIX_B)
-  {
-    li_config_table[ch_b_v].flag_table[ch_a] |= LI_FLAG_MIX;
-    li_config_table[ch_b_s].flag_table[ch_a] |= LI_FLAG_MIX;
-  }
-  if (ch_a_v != ch_a_s)
-  {
-    li_config_table[ch_a_v].flag_table[ch_a_s] |= LI_FLAG_CONFERENCE;
-    li_config_table[ch_a_s].flag_table[ch_a_v] |= LI_FLAG_CONFERENCE;
-  }
-  if (ch_b_v != ch_b_s)
-  {
-    li_config_table[ch_b_v].flag_table[ch_b_s] |= LI_FLAG_CONFERENCE;
-    li_config_table[ch_b_s].flag_table[ch_b_v] |= LI_FLAG_CONFERENCE;
-  }
-}
-
-
-static void li2_update_connect (dword Id, DIVA_CAPI_ADAPTER   *a, PLCI   *plci,
-  dword plci_b_id, byte connect, dword li_flags)
-{
-  word ch_a, ch_a_v, ch_a_s, ch_b, ch_b_v, ch_b_s;
-  PLCI   *plci_b;
-  DIVA_CAPI_ADAPTER   *a_b;
-
-  a_b = &(adapter[MapController ((byte)(plci_b_id & 0x7f)) - 1]);
-  plci_b = &(a_b->plci[((plci_b_id >> 8) & 0xff) - 1]);
-  ch_a = a->li_base + (plci->li_bchannel_id - 1);
-  if (!a->li_pri && (plci->tel == ADV_VOICE)
-   && (plci == a->AdvSignalPLCI) && (Id & EXT_CONTROLLER))
-  {
-    ch_a_v = ch_a + MIXER_IC_CHANNEL_BASE;
-    ch_a_s = (a->manufacturer_features & MANUFACTURER_FEATURE_SLAVE_CODEC) ?
-      a->li_base + MIXER_IC_CHANNEL_BASE + (2 - plci->li_bchannel_id) : ch_a_v;
-  }
-  else
-  {
-    ch_a_v = ch_a;
-    ch_a_s = ch_a;
-  }
-  ch_b = a_b->li_base + (plci_b->li_bchannel_id - 1);
-  if (!a_b->li_pri && (plci_b->tel == ADV_VOICE)
-   && (plci_b == a_b->AdvSignalPLCI) && (plci_b_id & EXT_CONTROLLER))
-  {
-    ch_b_v = ch_b + MIXER_IC_CHANNEL_BASE;
-    ch_b_s = (a_b->manufacturer_features & MANUFACTURER_FEATURE_SLAVE_CODEC) ?
-      a_b->li_base + MIXER_IC_CHANNEL_BASE + (2 - plci_b->li_bchannel_id) : ch_b_v;
-  }
-  else
-  {
-    ch_b_v = ch_b;
-    ch_b_s = ch_b;
-  }
-  if (connect)
-  {
-    li_config_table[ch_b].flag_table[ch_b_v] &= ~LI_FLAG_MONITOR;
-    li_config_table[ch_b].flag_table[ch_b_s] &= ~LI_FLAG_MONITOR;
-    li_config_table[ch_b_v].flag_table[ch_b] &= ~LI_FLAG_MIX;
-    li_config_table[ch_b_s].flag_table[ch_b] &= ~LI_FLAG_MIX;
-    li_config_table[ch_b].flag_table[ch_b] &= ~LI_FLAG_PCCONNECT;
-    li_config_table[ch_b].chflags &= ~(LI_CHFLAG_MONITOR | LI_CHFLAG_MIX | LI_CHFLAG_LOOP);
-  }
-  li_config_table[ch_b_v].flag_table[ch_a_v] &= ~(LI_FLAG_INTERCONNECT | LI_FLAG_CONFERENCE);
-  li_config_table[ch_b_s].flag_table[ch_a_v] &= ~(LI_FLAG_INTERCONNECT | LI_FLAG_CONFERENCE);
-  li_config_table[ch_b_v].flag_table[ch_a_s] &= ~(LI_FLAG_INTERCONNECT | LI_FLAG_CONFERENCE);
-  li_config_table[ch_b_s].flag_table[ch_a_s] &= ~(LI_FLAG_INTERCONNECT | LI_FLAG_CONFERENCE);
-  li_config_table[ch_a_v].flag_table[ch_b_v] &= ~(LI_FLAG_INTERCONNECT | LI_FLAG_CONFERENCE);
-  li_config_table[ch_a_v].flag_table[ch_b_s] &= ~(LI_FLAG_INTERCONNECT | LI_FLAG_CONFERENCE);
-  li_config_table[ch_a_s].flag_table[ch_b_v] &= ~(LI_FLAG_INTERCONNECT | LI_FLAG_CONFERENCE);
-  li_config_table[ch_a_s].flag_table[ch_b_s] &= ~(LI_FLAG_INTERCONNECT | LI_FLAG_CONFERENCE);
-  if (li_flags & LI2_FLAG_INTERCONNECT_A_B)
-  {
-    li_config_table[ch_b_v].flag_table[ch_a_v] |= LI_FLAG_INTERCONNECT;
-    li_config_table[ch_b_s].flag_table[ch_a_v] |= LI_FLAG_INTERCONNECT;
-    li_config_table[ch_b_v].flag_table[ch_a_s] |= LI_FLAG_INTERCONNECT;
-    li_config_table[ch_b_s].flag_table[ch_a_s] |= LI_FLAG_INTERCONNECT;
-  }
-  if (li_flags & LI2_FLAG_INTERCONNECT_B_A)
-  {
-    li_config_table[ch_a_v].flag_table[ch_b_v] |= LI_FLAG_INTERCONNECT;
-    li_config_table[ch_a_v].flag_table[ch_b_s] |= LI_FLAG_INTERCONNECT;
-    li_config_table[ch_a_s].flag_table[ch_b_v] |= LI_FLAG_INTERCONNECT;
-    li_config_table[ch_a_s].flag_table[ch_b_s] |= LI_FLAG_INTERCONNECT;
-  }
-  if (li_flags & LI2_FLAG_MONITOR_B)
-  {
-    li_config_table[ch_b].flag_table[ch_b_v] |= LI_FLAG_MONITOR;
-    li_config_table[ch_b].flag_table[ch_b_s] |= LI_FLAG_MONITOR;
-  }
-  if (li_flags & LI2_FLAG_MIX_B)
-  {
-    li_config_table[ch_b_v].flag_table[ch_b] |= LI_FLAG_MIX;
-    li_config_table[ch_b_s].flag_table[ch_b] |= LI_FLAG_MIX;
-  }
-  if (li_flags & LI2_FLAG_MONITOR_X)
-    li_config_table[ch_b].chflags |= LI_CHFLAG_MONITOR;
-  if (li_flags & LI2_FLAG_MIX_X)
-    li_config_table[ch_b].chflags |= LI_CHFLAG_MIX;
-  if (li_flags & LI2_FLAG_LOOP_B)
-  {
-    li_config_table[ch_b_v].flag_table[ch_b_v] |= LI_FLAG_INTERCONNECT;
-    li_config_table[ch_b_s].flag_table[ch_b_v] |= LI_FLAG_INTERCONNECT;
-    li_config_table[ch_b_v].flag_table[ch_b_s] |= LI_FLAG_INTERCONNECT;
-    li_config_table[ch_b_s].flag_table[ch_b_s] |= LI_FLAG_INTERCONNECT;
-  }
-  if (li_flags & LI2_FLAG_LOOP_PC)
-    li_config_table[ch_b].flag_table[ch_b] |= LI_FLAG_PCCONNECT;
-  if (li_flags & LI2_FLAG_LOOP_X)
-    li_config_table[ch_b].chflags |= LI_CHFLAG_LOOP;
-  if (li_flags & LI2_FLAG_PCCONNECT_A_B)
-    li_config_table[ch_b_s].flag_table[ch_a_s] |= LI_FLAG_PCCONNECT;
-  if (li_flags & LI2_FLAG_PCCONNECT_B_A)
-    li_config_table[ch_a_s].flag_table[ch_b_s] |= LI_FLAG_PCCONNECT;
-  if (ch_a_v != ch_a_s)
-  {
-    li_config_table[ch_a_v].flag_table[ch_a_s] |= LI_FLAG_CONFERENCE;
-    li_config_table[ch_a_s].flag_table[ch_a_v] |= LI_FLAG_CONFERENCE;
-  }
-  if (ch_b_v != ch_b_s)
-  {
-    li_config_table[ch_b_v].flag_table[ch_b_s] |= LI_FLAG_CONFERENCE;
-    li_config_table[ch_b_s].flag_table[ch_b_v] |= LI_FLAG_CONFERENCE;
-  }
-}
-
-
-static word li_check_main_plci (dword Id, PLCI   *plci)
-{
-  if (plci == NULL)
-  {
-    dbug (1, dprintf ("[%06lx] %s,%d: Wrong PLCI",
-      UnMapId (Id), (char   *)(FILE_), __LINE__));
-    return (_WRONG_IDENTIFIER);
-  }
-  if (!plci->State
-   || !plci->NL.Id || plci->nl_remove_id
-   || (plci->li_bchannel_id == 0))
-  {
-    dbug (1, dprintf ("[%06lx] %s,%d: Wrong state",
-      UnMapId (Id), (char   *)(FILE_), __LINE__));
-    return (_WRONG_STATE);
-  }
-  li_config_table[plci->adapter->li_base + (plci->li_bchannel_id - 1)].plci = plci;
-  return (GOOD);
-}
-
-
-static PLCI   *li_check_plci_b (dword Id, PLCI   *plci,
-  dword plci_b_id, word plci_b_write_pos, byte   *p_result)
-{
-  byte ctlr_b;
-  PLCI   *plci_b;
-
-  if (((plci->li_plci_b_read_pos > plci_b_write_pos) ? plci->li_plci_b_read_pos :
-    LI_PLCI_B_QUEUE_ENTRIES + plci->li_plci_b_read_pos) - plci_b_write_pos - 1 < 2)
-  {
-    dbug (1, dprintf ("[%06lx] %s,%d: LI request overrun",
-      UnMapId (Id), (char   *)(FILE_), __LINE__));
-    PUT_WORD (p_result, _REQUEST_NOT_ALLOWED_IN_THIS_STATE);
-    return (NULL);
-  }
-  ctlr_b = 0;
-  if ((plci_b_id & 0x7f) != 0)
-  {
-    ctlr_b = MapController ((byte)(plci_b_id & 0x7f));
-    if ((ctlr_b > max_adapter) || ((ctlr_b != 0) && (adapter[ctlr_b - 1].request == NULL)))
-      ctlr_b = 0;
-  }
-  if ((ctlr_b == 0)
-   || (((plci_b_id >> 8) & 0xff) == 0)
-   || (((plci_b_id >> 8) & 0xff) > adapter[ctlr_b - 1].max_plci))
-  {
-    dbug (1, dprintf ("[%06lx] %s,%d: LI invalid second PLCI %08lx",
-      UnMapId (Id), (char   *)(FILE_), __LINE__, plci_b_id));
-    PUT_WORD (p_result, _WRONG_IDENTIFIER);
-    return (NULL);
-  }
-  plci_b = &(adapter[ctlr_b - 1].plci[((plci_b_id >> 8) & 0xff) - 1]);
-  if (!plci_b->State
-   || !plci_b->NL.Id || plci_b->nl_remove_id
-   || (plci_b->li_bchannel_id == 0))
-  {
-    dbug (1, dprintf ("[%06lx] %s,%d: LI peer in wrong state %08lx",
-      UnMapId (Id), (char   *)(FILE_), __LINE__, plci_b_id));
-    PUT_WORD (p_result, _REQUEST_NOT_ALLOWED_IN_THIS_STATE);
-    return (NULL);
-  }
-  li_config_table[plci_b->adapter->li_base + (plci_b->li_bchannel_id - 1)].plci = plci_b;
-  if (((byte)(plci_b_id & ~EXT_CONTROLLER)) !=
-    ((byte)(UnMapController (plci->adapter->Id) & ~EXT_CONTROLLER))
-   && (!(plci->adapter->manufacturer_features & MANUFACTURER_FEATURE_XCONNECT)
-    || !(plci_b->adapter->manufacturer_features & MANUFACTURER_FEATURE_XCONNECT)))
-  {
-    dbug (1, dprintf ("[%06lx] %s,%d: LI not on same ctrl %08lx",
-      UnMapId (Id), (char   *)(FILE_), __LINE__, plci_b_id));
-    PUT_WORD (p_result, _WRONG_IDENTIFIER);
-    return (NULL);
-  }
-  if (!(get_b1_facilities (plci_b, add_b1_facilities (plci_b, plci_b->B1_resource,
-    (word)(plci_b->B1_facilities | B1_FACILITY_MIXER))) & B1_FACILITY_MIXER))
-  {
-    dbug (1, dprintf ("[%06lx] %s,%d: Interconnect peer cannot mix %d",
-      UnMapId (Id), (char   *)(FILE_), __LINE__, plci_b->B1_resource));
-    PUT_WORD (p_result, _REQUEST_NOT_ALLOWED_IN_THIS_STATE);
-    return (NULL);
-  }
-  return (plci_b);
-}
-
-
-static PLCI   *li2_check_plci_b (dword Id, PLCI   *plci,
-  dword plci_b_id, word plci_b_write_pos, byte   *p_result)
-{
-  byte ctlr_b;
-  PLCI   *plci_b;
-
-  if (((plci->li_plci_b_read_pos > plci_b_write_pos) ? plci->li_plci_b_read_pos :
-    LI_PLCI_B_QUEUE_ENTRIES + plci->li_plci_b_read_pos) - plci_b_write_pos - 1 < 2)
-  {
-    dbug (1, dprintf ("[%06lx] %s,%d: LI request overrun",
-      UnMapId (Id), (char   *)(FILE_), __LINE__));
-    PUT_WORD (p_result, _WRONG_STATE);
-    return (NULL);
-  }
-  ctlr_b = 0;
-  if ((plci_b_id & 0x7f) != 0)
-  {
-    ctlr_b = MapController ((byte)(plci_b_id & 0x7f));
-    if ((ctlr_b > max_adapter) || ((ctlr_b != 0) && (adapter[ctlr_b - 1].request == NULL)))
-      ctlr_b = 0;
-  }
-  if ((ctlr_b == 0)
-   || (((plci_b_id >> 8) & 0xff) == 0)
-   || (((plci_b_id >> 8) & 0xff) > adapter[ctlr_b - 1].max_plci))
-  {
-    dbug (1, dprintf ("[%06lx] %s,%d: LI invalid second PLCI %08lx",
-      UnMapId (Id), (char   *)(FILE_), __LINE__, plci_b_id));
-    PUT_WORD (p_result, _WRONG_IDENTIFIER);
-    return (NULL);
-  }
-  plci_b = &(adapter[ctlr_b - 1].plci[((plci_b_id >> 8) & 0xff) - 1]);
-  if (!plci_b->State
-   || !plci_b->NL.Id || plci_b->nl_remove_id
-   || (plci_b->li_bchannel_id == 0)
-   || (li_config_table[plci_b->adapter->li_base + (plci_b->li_bchannel_id - 1)].plci != plci_b))
-  {
-    dbug (1, dprintf ("[%06lx] %s,%d: LI peer in wrong state %08lx",
-      UnMapId (Id), (char   *)(FILE_), __LINE__, plci_b_id));
-    PUT_WORD (p_result, _WRONG_STATE);
-    return (NULL);
-  }
-  if (((byte)(plci_b_id & ~EXT_CONTROLLER)) !=
-    ((byte)(UnMapController (plci->adapter->Id) & ~EXT_CONTROLLER))
-   && (!(plci->adapter->manufacturer_features & MANUFACTURER_FEATURE_XCONNECT)
-    || !(plci_b->adapter->manufacturer_features & MANUFACTURER_FEATURE_XCONNECT)))
-  {
-    dbug (1, dprintf ("[%06lx] %s,%d: LI not on same ctrl %08lx",
-      UnMapId (Id), (char   *)(FILE_), __LINE__, plci_b_id));
-    PUT_WORD (p_result, _WRONG_IDENTIFIER);
-    return (NULL);
-  }
-  if (!(get_b1_facilities (plci_b, add_b1_facilities (plci_b, plci_b->B1_resource,
-    (word)(plci_b->B1_facilities | B1_FACILITY_MIXER))) & B1_FACILITY_MIXER))
-  {
-    dbug (1, dprintf ("[%06lx] %s,%d: Interconnect peer cannot mix %d",
-      UnMapId (Id), (char   *)(FILE_), __LINE__, plci_b->B1_resource));
-    PUT_WORD (p_result, _WRONG_STATE);
-    return (NULL);
-  }
-  return (plci_b);
-}
-
-
-static byte mixer_request (dword Id, word Number, DIVA_CAPI_ADAPTER   *a, PLCI   *plci, APPL   *appl, API_PARSE *msg)
-{
-  word Info;
-  word i;
-  dword d, li_flags, plci_b_id;
-  PLCI   *plci_b;
-    API_PARSE li_parms[3];
-    API_PARSE li_req_parms[3];
-    API_PARSE li_participant_struct[2];
-    API_PARSE li_participant_parms[3];
-  word participant_parms_pos;
-  byte result_buffer[32];
-  byte   *result;
-  word result_pos;
-  word plci_b_write_pos;
-
-  dbug (1, dprintf ("[%06lx] %s,%d: mixer_request",
-    UnMapId (Id), (char   *)(FILE_), __LINE__));
-
-  Info = GOOD;
-  result = result_buffer;
-  result_buffer[0] = 0;
-  if (!(a->profile.Global_Options & GL_LINE_INTERCONNECT_SUPPORTED))
-  {
-    dbug (1, dprintf ("[%06lx] %s,%d: Facility not supported",
-      UnMapId (Id), (char   *)(FILE_), __LINE__));
-    Info = _FACILITY_NOT_SUPPORTED;
-  }
-  else if (api_parse (&msg[1].info[1], msg[1].length, "ws", li_parms))
-  {
-    dbug (1, dprintf ("[%06lx] %s,%d: Wrong message format",
-      UnMapId (Id), (char   *)(FILE_), __LINE__));
-    Info = _WRONG_MESSAGE_FORMAT;
-  }
-  else
-  {
-    result_buffer[0] = 3;
-    PUT_WORD (&result_buffer[1], GET_WORD (li_parms[0].info));
-    result_buffer[3] = 0;
-    switch (GET_WORD (li_parms[0].info))
-    {
-    case LI_GET_SUPPORTED_SERVICES:
-      if (appl->appl_flags & APPL_FLAG_OLD_LI_SPEC)
-      {
-        result_buffer[0] = 17;
-        result_buffer[3] = 14;
-        PUT_WORD (&result_buffer[4], GOOD);
-        d = 0;
-        if (a->manufacturer_features & MANUFACTURER_FEATURE_MIXER_CH_CH)
-          d |= LI_CONFERENCING_SUPPORTED;
-        if (a->manufacturer_features & MANUFACTURER_FEATURE_MIXER_CH_PC)
-          d |= LI_MONITORING_SUPPORTED;
-        if (a->manufacturer_features & MANUFACTURER_FEATURE_MIXER_PC_CH)
-          d |= LI_ANNOUNCEMENTS_SUPPORTED | LI_MIXING_SUPPORTED;
-        if (a->manufacturer_features & MANUFACTURER_FEATURE_XCONNECT)
-          d |= LI_CROSS_CONTROLLER_SUPPORTED;
-        PUT_DWORD (&result_buffer[6], d);
-        if (a->manufacturer_features & MANUFACTURER_FEATURE_XCONNECT)
-        {
-          d = 0;
-          for (i = 0; i < li_total_channels; i++)
-          {
-            if ((li_config_table[i].adapter->manufacturer_features & MANUFACTURER_FEATURE_XCONNECT)
-             && (li_config_table[i].adapter->li_pri
-              || (i < li_config_table[i].adapter->li_base + MIXER_BCHANNELS_BRI)))
-            {
-              d++;
-            }
-          }
-        }
-        else
-        {
-          d = a->li_pri ? a->li_channels : MIXER_BCHANNELS_BRI;
-        }
-        PUT_DWORD (&result_buffer[10], d / 2);
-        PUT_DWORD (&result_buffer[14], d);
-      }
-      else
-      {
-        result_buffer[0] = 25;
-        result_buffer[3] = 22;
-        PUT_WORD (&result_buffer[4], GOOD);
-        d = LI2_ASYMMETRIC_SUPPORTED | LI2_B_LOOPING_SUPPORTED | LI2_X_LOOPING_SUPPORTED;
-        if (a->manufacturer_features & MANUFACTURER_FEATURE_MIXER_CH_PC)
-          d |= LI2_MONITORING_SUPPORTED | LI2_REMOTE_MONITORING_SUPPORTED;
-        if (a->manufacturer_features & MANUFACTURER_FEATURE_MIXER_PC_CH)
-          d |= LI2_MIXING_SUPPORTED | LI2_REMOTE_MIXING_SUPPORTED;
-        if (a->manufacturer_features & MANUFACTURER_FEATURE_MIXER_PC_PC)
-          d |= LI2_PC_LOOPING_SUPPORTED;
-        if (a->manufacturer_features & MANUFACTURER_FEATURE_XCONNECT)
-          d |= LI2_CROSS_CONTROLLER_SUPPORTED;
-        PUT_DWORD (&result_buffer[6], d);
-        d = a->li_pri ? a->li_channels : MIXER_BCHANNELS_BRI;
-        PUT_DWORD (&result_buffer[10], d / 2);
-        PUT_DWORD (&result_buffer[14], d - 1);
-        if (a->manufacturer_features & MANUFACTURER_FEATURE_XCONNECT)
-        {
-          d = 0;
-          for (i = 0; i < li_total_channels; i++)
-          {
-            if ((li_config_table[i].adapter->manufacturer_features & MANUFACTURER_FEATURE_XCONNECT)
-             && (li_config_table[i].adapter->li_pri
-              || (i < li_config_table[i].adapter->li_base + MIXER_BCHANNELS_BRI)))
-            {
-              d++;
-            }
-          }
-        }
-        PUT_DWORD (&result_buffer[18], d / 2);
-        PUT_DWORD (&result_buffer[22], d - 1);
-      }
-      break;
-
-    case LI_REQ_CONNECT:
-      if (li_parms[1].length == 8)
-      {
-        appl->appl_flags |= APPL_FLAG_OLD_LI_SPEC;
-        if (api_parse (&li_parms[1].info[1], li_parms[1].length, "dd", li_req_parms))
-        {
-          dbug (1, dprintf ("[%06lx] %s,%d: Wrong message format",
-            UnMapId (Id), (char   *)(FILE_), __LINE__));
-          Info = _WRONG_MESSAGE_FORMAT;
-          break;
-        }
-        plci_b_id = GET_DWORD (li_req_parms[0].info) & 0xffff;
-        li_flags = GET_DWORD (li_req_parms[1].info);
-        Info = li_check_main_plci (Id, plci);
-        result_buffer[0] = 9;
-        result_buffer[3] = 6;
-        PUT_DWORD (&result_buffer[4], plci_b_id);
-        PUT_WORD (&result_buffer[8], GOOD);
-        if (Info != GOOD)
-          break;
-        result = plci->saved_msg.info;
-        for (i = 0; i <= result_buffer[0]; i++)
-          result[i] = result_buffer[i];
-        plci_b_write_pos = plci->li_plci_b_write_pos;
-        plci_b = li_check_plci_b (Id, plci, plci_b_id, plci_b_write_pos, &result[8]);
-        if (plci_b == NULL)
-          break;
-        li_update_connect (Id, a, plci, plci_b_id, true, li_flags);
-        plci->li_plci_b_queue[plci_b_write_pos] = plci_b_id | LI_PLCI_B_LAST_FLAG;
-        plci_b_write_pos = (plci_b_write_pos == LI_PLCI_B_QUEUE_ENTRIES-1) ? 0 : plci_b_write_pos + 1;
-        plci->li_plci_b_write_pos = plci_b_write_pos;
-      }
-      else
-      {
-        appl->appl_flags &= ~APPL_FLAG_OLD_LI_SPEC;
-        if (api_parse (&li_parms[1].info[1], li_parms[1].length, "ds", li_req_parms))
-        {
-          dbug (1, dprintf ("[%06lx] %s,%d: Wrong message format",
-            UnMapId (Id), (char   *)(FILE_), __LINE__));
-          Info = _WRONG_MESSAGE_FORMAT;
-          break;
-        }
-        li_flags = GET_DWORD (li_req_parms[0].info) & ~(LI2_FLAG_INTERCONNECT_A_B | LI2_FLAG_INTERCONNECT_B_A);
-        Info = li_check_main_plci (Id, plci);
-        result_buffer[0] = 7;
-        result_buffer[3] = 4;
-        PUT_WORD (&result_buffer[4], Info);
-        result_buffer[6] = 0;
-        if (Info != GOOD)
-          break;
-        result = plci->saved_msg.info;
-        for (i = 0; i <= result_buffer[0]; i++)
-          result[i] = result_buffer[i];
-        plci_b_write_pos = plci->li_plci_b_write_pos;
-        participant_parms_pos = 0;
-        result_pos = 7;
-        li2_update_connect (Id, a, plci, UnMapId (Id), true, li_flags);
-        while (participant_parms_pos < li_req_parms[1].length)
-        {
-          result[result_pos] = 6;
-          result_pos += 7;
-          PUT_DWORD (&result[result_pos - 6], 0);
-          PUT_WORD (&result[result_pos - 2], GOOD);
-          if (api_parse (&li_req_parms[1].info[1 + participant_parms_pos],
-            (word)(li_parms[1].length - participant_parms_pos), "s", li_participant_struct))
-          {
-            dbug (1, dprintf ("[%06lx] %s,%d: Wrong message format",
-              UnMapId (Id), (char   *)(FILE_), __LINE__));
-            PUT_WORD (&result[result_pos - 2], _WRONG_MESSAGE_FORMAT);
-            break;
-          }
-          if (api_parse (&li_participant_struct[0].info[1],
-            li_participant_struct[0].length, "dd", li_participant_parms))
-          {
-            dbug (1, dprintf ("[%06lx] %s,%d: Wrong message format",
-              UnMapId (Id), (char   *)(FILE_), __LINE__));
-            PUT_WORD (&result[result_pos - 2], _WRONG_MESSAGE_FORMAT);
-            break;
-          }
-          plci_b_id = GET_DWORD (li_participant_parms[0].info) & 0xffff;
-          li_flags = GET_DWORD (li_participant_parms[1].info);
-          PUT_DWORD (&result[result_pos - 6], plci_b_id);
-          if (sizeof(result) - result_pos < 7)
-          {
-            dbug (1, dprintf ("[%06lx] %s,%d: LI result overrun",
-              UnMapId (Id), (char   *)(FILE_), __LINE__));
-            PUT_WORD (&result[result_pos - 2], _WRONG_STATE);
-            break;
-          }
-          plci_b = li2_check_plci_b (Id, plci, plci_b_id, plci_b_write_pos, &result[result_pos - 2]);
-          if (plci_b != NULL)
-          {
-            li2_update_connect (Id, a, plci, plci_b_id, true, li_flags);
-            plci->li_plci_b_queue[plci_b_write_pos] = plci_b_id |
-              ((li_flags & (LI2_FLAG_INTERCONNECT_A_B | LI2_FLAG_INTERCONNECT_B_A |
-              LI2_FLAG_PCCONNECT_A_B | LI2_FLAG_PCCONNECT_B_A)) ? 0 : LI_PLCI_B_DISC_FLAG);
-            plci_b_write_pos = (plci_b_write_pos == LI_PLCI_B_QUEUE_ENTRIES-1) ? 0 : plci_b_write_pos + 1;
-          }
-          participant_parms_pos = (word)((&li_participant_struct[0].info[1 + li_participant_struct[0].length]) -
-            (&li_req_parms[1].info[1]));
-        }
-        result[0] = (byte)(result_pos - 1);
-        result[3] = (byte)(result_pos - 4);
-        result[6] = (byte)(result_pos - 7);
-        i = (plci_b_write_pos == 0) ? LI_PLCI_B_QUEUE_ENTRIES-1 : plci_b_write_pos - 1;
-        if ((plci_b_write_pos == plci->li_plci_b_read_pos)
-         || (plci->li_plci_b_queue[i] & LI_PLCI_B_LAST_FLAG))
-        {
-          plci->li_plci_b_queue[plci_b_write_pos] = LI_PLCI_B_SKIP_FLAG | LI_PLCI_B_LAST_FLAG;
-          plci_b_write_pos = (plci_b_write_pos == LI_PLCI_B_QUEUE_ENTRIES-1) ? 0 : plci_b_write_pos + 1;
-        }
-        else
-          plci->li_plci_b_queue[i] |= LI_PLCI_B_LAST_FLAG;
-        plci->li_plci_b_write_pos = plci_b_write_pos;
-      }
-      mixer_calculate_coefs (a);
-      plci->li_channel_bits = li_config_table[a->li_base + (plci->li_bchannel_id - 1)].channel;
-      mixer_notify_update (plci, true);
-      sendf (appl, _FACILITY_R | CONFIRM, Id & 0xffffL, Number,
-        "wwS", Info, SELECTOR_LINE_INTERCONNECT, result);
-      plci->command = 0;
-      plci->li_cmd = GET_WORD (li_parms[0].info);
-      start_internal_command (Id, plci, mixer_command);
-      return (false);
-
-    case LI_REQ_DISCONNECT:
-      if (li_parms[1].length == 4)
-      {
-        appl->appl_flags |= APPL_FLAG_OLD_LI_SPEC;
-        if (api_parse (&li_parms[1].info[1], li_parms[1].length, "d", li_req_parms))
-        {
-          dbug (1, dprintf ("[%06lx] %s,%d: Wrong message format",
-            UnMapId (Id), (char   *)(FILE_), __LINE__));
-          Info = _WRONG_MESSAGE_FORMAT;
-          break;
-        }
-        plci_b_id = GET_DWORD (li_req_parms[0].info) & 0xffff;
-        Info = li_check_main_plci (Id, plci);
-        result_buffer[0] = 9;
-        result_buffer[3] = 6;
-        PUT_DWORD (&result_buffer[4], GET_DWORD (li_req_parms[0].info));
-        PUT_WORD (&result_buffer[8], GOOD);
-        if (Info != GOOD)
-          break;
-        result = plci->saved_msg.info;
-        for (i = 0; i <= result_buffer[0]; i++)
-          result[i] = result_buffer[i];
-        plci_b_write_pos = plci->li_plci_b_write_pos;
-        plci_b = li_check_plci_b (Id, plci, plci_b_id, plci_b_write_pos, &result[8]);
-        if (plci_b == NULL)
-          break;
-        li_update_connect (Id, a, plci, plci_b_id, false, 0);
-        plci->li_plci_b_queue[plci_b_write_pos] = plci_b_id | LI_PLCI_B_DISC_FLAG | LI_PLCI_B_LAST_FLAG;
-        plci_b_write_pos = (plci_b_write_pos == LI_PLCI_B_QUEUE_ENTRIES-1) ? 0 : plci_b_write_pos + 1;
-        plci->li_plci_b_write_pos = plci_b_write_pos;
-      }
-      else
-      {
-        appl->appl_flags &= ~APPL_FLAG_OLD_LI_SPEC;
-        if (api_parse (&li_parms[1].info[1], li_parms[1].length, "s", li_req_parms))
-        {
-          dbug (1, dprintf ("[%06lx] %s,%d: Wrong message format",
-            UnMapId (Id), (char   *)(FILE_), __LINE__));
-          Info = _WRONG_MESSAGE_FORMAT;
-          break;
-        }
-        Info = li_check_main_plci (Id, plci);
-        result_buffer[0] = 7;
-        result_buffer[3] = 4;
-        PUT_WORD (&result_buffer[4], Info);
-        result_buffer[6] = 0;
-        if (Info != GOOD)
-          break;
-        result = plci->saved_msg.info;
-        for (i = 0; i <= result_buffer[0]; i++)
-          result[i] = result_buffer[i];
-        plci_b_write_pos = plci->li_plci_b_write_pos;
-        participant_parms_pos = 0;
-        result_pos = 7;
-        while (participant_parms_pos < li_req_parms[0].length)
-        {
-          result[result_pos] = 6;
-          result_pos += 7;
-          PUT_DWORD (&result[result_pos - 6], 0);
-          PUT_WORD (&result[result_pos - 2], GOOD);
-          if (api_parse (&li_req_parms[0].info[1 + participant_parms_pos],
-            (word)(li_parms[1].length - participant_parms_pos), "s", li_participant_struct))
-          {
-            dbug (1, dprintf ("[%06lx] %s,%d: Wrong message format",
-              UnMapId (Id), (char   *)(FILE_), __LINE__));
-            PUT_WORD (&result[result_pos - 2], _WRONG_MESSAGE_FORMAT);
-            break;
-          }
-          if (api_parse (&li_participant_struct[0].info[1],
-            li_participant_struct[0].length, "d", li_participant_parms))
-          {
-            dbug (1, dprintf ("[%06lx] %s,%d: Wrong message format",
-              UnMapId (Id), (char   *)(FILE_), __LINE__));
-            PUT_WORD (&result[result_pos - 2], _WRONG_MESSAGE_FORMAT);
-            break;
-          }
-          plci_b_id = GET_DWORD (li_participant_parms[0].info) & 0xffff;
-          PUT_DWORD (&result[result_pos - 6], plci_b_id);
-          if (sizeof(result) - result_pos < 7)
-          {
-            dbug (1, dprintf ("[%06lx] %s,%d: LI result overrun",
-              UnMapId (Id), (char   *)(FILE_), __LINE__));
-            PUT_WORD (&result[result_pos - 2], _WRONG_STATE);
-            break;
-          }
-          plci_b = li2_check_plci_b (Id, plci, plci_b_id, plci_b_write_pos, &result[result_pos - 2]);
-          if (plci_b != NULL)
-          {
-            li2_update_connect (Id, a, plci, plci_b_id, false, 0);
-            plci->li_plci_b_queue[plci_b_write_pos] = plci_b_id | LI_PLCI_B_DISC_FLAG;
-            plci_b_write_pos = (plci_b_write_pos == LI_PLCI_B_QUEUE_ENTRIES-1) ? 0 : plci_b_write_pos + 1;
-          }
-          participant_parms_pos = (word)((&li_participant_struct[0].info[1 + li_participant_struct[0].length]) -
-            (&li_req_parms[0].info[1]));
-        }
-        result[0] = (byte)(result_pos - 1);
-        result[3] = (byte)(result_pos - 4);
-        result[6] = (byte)(result_pos - 7);
-        i = (plci_b_write_pos == 0) ? LI_PLCI_B_QUEUE_ENTRIES-1 : plci_b_write_pos - 1;
-        if ((plci_b_write_pos == plci->li_plci_b_read_pos)
-         || (plci->li_plci_b_queue[i] & LI_PLCI_B_LAST_FLAG))
-        {
-          plci->li_plci_b_queue[plci_b_write_pos] = LI_PLCI_B_SKIP_FLAG | LI_PLCI_B_LAST_FLAG;
-          plci_b_write_pos = (plci_b_write_pos == LI_PLCI_B_QUEUE_ENTRIES-1) ? 0 : plci_b_write_pos + 1;
-        }
-        else
-          plci->li_plci_b_queue[i] |= LI_PLCI_B_LAST_FLAG;
-        plci->li_plci_b_write_pos = plci_b_write_pos;
-      }
-      mixer_calculate_coefs (a);
-      plci->li_channel_bits = li_config_table[a->li_base + (plci->li_bchannel_id - 1)].channel;
-      mixer_notify_update (plci, true);
-      sendf (appl, _FACILITY_R | CONFIRM, Id & 0xffffL, Number,
-        "wwS", Info, SELECTOR_LINE_INTERCONNECT, result);
-      plci->command = 0;
-      plci->li_cmd = GET_WORD (li_parms[0].info);
-      start_internal_command (Id, plci, mixer_command);
-      return (false);
-
-    case LI_REQ_SILENT_UPDATE:
-      if (!plci || !plci->State
-       || !plci->NL.Id || plci->nl_remove_id
-       || (plci->li_bchannel_id == 0)
-       || (li_config_table[plci->adapter->li_base + (plci->li_bchannel_id - 1)].plci != plci))
-      {
-        dbug (1, dprintf ("[%06lx] %s,%d: Wrong state",
-          UnMapId (Id), (char   *)(FILE_), __LINE__));
-        return (false);
-      }
-      plci_b_write_pos = plci->li_plci_b_write_pos;
-      if (((plci->li_plci_b_read_pos > plci_b_write_pos) ? plci->li_plci_b_read_pos :
-        LI_PLCI_B_QUEUE_ENTRIES + plci->li_plci_b_read_pos) - plci_b_write_pos - 1 < 2)
-      {
-        dbug (1, dprintf ("[%06lx] %s,%d: LI request overrun",
-          UnMapId (Id), (char   *)(FILE_), __LINE__));
-        return (false);
-      }
-      i = (plci_b_write_pos == 0) ? LI_PLCI_B_QUEUE_ENTRIES-1 : plci_b_write_pos - 1;
-      if ((plci_b_write_pos == plci->li_plci_b_read_pos)
-       || (plci->li_plci_b_queue[i] & LI_PLCI_B_LAST_FLAG))
-      {
-        plci->li_plci_b_queue[plci_b_write_pos] = LI_PLCI_B_SKIP_FLAG | LI_PLCI_B_LAST_FLAG;
-        plci_b_write_pos = (plci_b_write_pos == LI_PLCI_B_QUEUE_ENTRIES-1) ? 0 : plci_b_write_pos + 1;
-      }
-      else
-        plci->li_plci_b_queue[i] |= LI_PLCI_B_LAST_FLAG;
-      plci->li_plci_b_write_pos = plci_b_write_pos;
-      plci->li_channel_bits = li_config_table[a->li_base + (plci->li_bchannel_id - 1)].channel;
-      plci->command = 0;
-      plci->li_cmd = GET_WORD (li_parms[0].info);
-      start_internal_command (Id, plci, mixer_command);
-      return (false);
-
-    default:
-      dbug (1, dprintf ("[%06lx] %s,%d: LI unknown request %04x",
-        UnMapId (Id), (char   *)(FILE_), __LINE__, GET_WORD (li_parms[0].info)));
-      Info = _FACILITY_NOT_SUPPORTED;
-    }
-  }
-  sendf (appl, _FACILITY_R | CONFIRM, Id & 0xffffL, Number,
-    "wwS", Info, SELECTOR_LINE_INTERCONNECT, result);
-  return (false);
-}
-
-
-static void mixer_indication_coefs_set (dword Id, PLCI   *plci)
-{
-  dword d;
-    byte result[12];
-
-  dbug (1, dprintf ("[%06lx] %s,%d: mixer_indication_coefs_set",
-    UnMapId (Id), (char   *)(FILE_), __LINE__));
-
-  if (plci->li_plci_b_read_pos != plci->li_plci_b_req_pos)
-  {
-    do
-    {
-      d = plci->li_plci_b_queue[plci->li_plci_b_read_pos];
-      if (!(d & LI_PLCI_B_SKIP_FLAG))
-      {
-        if (plci->appl->appl_flags & APPL_FLAG_OLD_LI_SPEC)
-        {
-          if (d & LI_PLCI_B_DISC_FLAG)
-          {
-            result[0] = 5;
-            PUT_WORD (&result[1], LI_IND_DISCONNECT);
-            result[3] = 2;
-            PUT_WORD (&result[4], _LI_USER_INITIATED);
-          }
-          else
-          {
-            result[0] = 7;
-            PUT_WORD (&result[1], LI_IND_CONNECT_ACTIVE);
-            result[3] = 4;
-            PUT_DWORD (&result[4], d & ~LI_PLCI_B_FLAG_MASK);
-          }
-        }
-        else
-        {
-          if (d & LI_PLCI_B_DISC_FLAG)
-          {
-            result[0] = 9;
-            PUT_WORD (&result[1], LI_IND_DISCONNECT);
-            result[3] = 6;
-            PUT_DWORD (&result[4], d & ~LI_PLCI_B_FLAG_MASK);
-            PUT_WORD (&result[8], _LI_USER_INITIATED);
-          }
-          else
-          {
-            result[0] = 7;
-            PUT_WORD (&result[1], LI_IND_CONNECT_ACTIVE);
-            result[3] = 4;
-            PUT_DWORD (&result[4], d & ~LI_PLCI_B_FLAG_MASK);
-          }
-        }
-        sendf (plci->appl, _FACILITY_I, Id & 0xffffL, 0,
-          "ws", SELECTOR_LINE_INTERCONNECT, result);
-      }
-      plci->li_plci_b_read_pos = (plci->li_plci_b_read_pos == LI_PLCI_B_QUEUE_ENTRIES-1) ?
-        0 : plci->li_plci_b_read_pos + 1;
-    } while (!(d & LI_PLCI_B_LAST_FLAG) && (plci->li_plci_b_read_pos != plci->li_plci_b_req_pos));
-  }
-}
-
-
-static void mixer_indication_xconnect_from (dword Id, PLCI   *plci, byte   *msg, word length)
-{
-  word i, j, ch;
-  struct xconnect_transfer_address_s s,   *p;
-  DIVA_CAPI_ADAPTER   *a;
-
-  dbug (1, dprintf ("[%06lx] %s,%d: mixer_indication_xconnect_from %d",
-    UnMapId (Id), (char   *)(FILE_), __LINE__, (int) length));
-
-  a = plci->adapter;
-  i = 1;
-  for (i = 1; i < length; i += 16)
-  {
-    s.card_address.low = msg[i] | (msg[i+1] << 8) | (((dword)(msg[i+2])) << 16) | (((dword)(msg[i+3])) << 24);
-    s.card_address.high = msg[i+4] | (msg[i+5] << 8) | (((dword)(msg[i+6])) << 16) | (((dword)(msg[i+7])) << 24);
-    s.offset = msg[i+8] | (msg[i+9] << 8) | (((dword)(msg[i+10])) << 16) | (((dword)(msg[i+11])) << 24);
-    ch = msg[i+12] | (msg[i+13] << 8);
-    j = ch & XCONNECT_CHANNEL_NUMBER_MASK;
-    if (!a->li_pri && (plci->li_bchannel_id == 2))
-      j = 1 - j;
-    j += a->li_base;
-    if (ch & XCONNECT_CHANNEL_PORT_PC)
-      p = &(li_config_table[j].send_pc);
-    else
-      p = &(li_config_table[j].send_b);
-    p->card_address.low = s.card_address.low;
-    p->card_address.high = s.card_address.high;
-    p->offset = s.offset;
-    li_config_table[j].channel |= LI_CHANNEL_ADDRESSES_SET;
-  }
-  if (plci->internal_command_queue[0]
-   && ((plci->adjust_b_state == ADJUST_B_RESTORE_MIXER_2)
-    || (plci->adjust_b_state == ADJUST_B_RESTORE_MIXER_3)
-    || (plci->adjust_b_state == ADJUST_B_RESTORE_MIXER_4)))
-  {
-    (*(plci->internal_command_queue[0]))(Id, plci, 0);
-    if (!plci->internal_command)
-      next_internal_command (Id, plci);
-  }
-  mixer_notify_update (plci, true);
-}
-
-
-static void mixer_indication_xconnect_to (dword Id, PLCI   *plci, byte   *msg, word length)
-{
-
-  dbug (1, dprintf ("[%06lx] %s,%d: mixer_indication_xconnect_to %d",
-    UnMapId (Id), (char   *)(FILE_), __LINE__, (int) length));
-
-}
-
-
-static byte mixer_notify_source_removed (PLCI   *plci, dword plci_b_id)
-{
-  word plci_b_write_pos;
-
-  plci_b_write_pos = plci->li_plci_b_write_pos;
-  if (((plci->li_plci_b_read_pos > plci_b_write_pos) ? plci->li_plci_b_read_pos :
-    LI_PLCI_B_QUEUE_ENTRIES + plci->li_plci_b_read_pos) - plci_b_write_pos - 1 < 1)
-  {
-    dbug (1, dprintf ("[%06lx] %s,%d: LI request overrun",
-      (dword)((plci->Id << 8) | UnMapController (plci->adapter->Id)),
-      (char   *)(FILE_), __LINE__));
-    return (false);
-  }
-  plci->li_plci_b_queue[plci_b_write_pos] = plci_b_id | LI_PLCI_B_DISC_FLAG;
-  plci_b_write_pos = (plci_b_write_pos == LI_PLCI_B_QUEUE_ENTRIES-1) ? 0 : plci_b_write_pos + 1;
-  plci->li_plci_b_write_pos = plci_b_write_pos;
-  return (true);
-}
-
-
-static void mixer_remove (PLCI   *plci)
-{
-  DIVA_CAPI_ADAPTER   *a;
-  PLCI   *notify_plci;
-  dword plci_b_id;
-  word i, j;
-
-  dbug (1, dprintf ("[%06lx] %s,%d: mixer_remove",
-    (dword)((plci->Id << 8) | UnMapController (plci->adapter->Id)),
-    (char   *)(FILE_), __LINE__));
-
-  a = plci->adapter;
-  plci_b_id = (plci->Id << 8) | UnMapController (plci->adapter->Id);
-  if (a->profile.Global_Options & GL_LINE_INTERCONNECT_SUPPORTED)
-  {
-    if ((plci->li_bchannel_id != 0)
-     && (li_config_table[a->li_base + (plci->li_bchannel_id - 1)].plci == plci))
-    {
-      i = a->li_base + (plci->li_bchannel_id - 1);
-      if ((li_config_table[i].curchnl | li_config_table[i].channel) & LI_CHANNEL_INVOLVED)
-      {
-        for (j = 0; j < li_total_channels; j++)
-        {
-          if ((li_config_table[i].flag_table[j] & LI_FLAG_INTERCONNECT)
-           || (li_config_table[j].flag_table[i] & LI_FLAG_INTERCONNECT))
-          {
-            notify_plci = li_config_table[j].plci;
-            if ((notify_plci != NULL)
-             && (notify_plci != plci)
-             && (notify_plci->appl != NULL)
-             && !(notify_plci->appl->appl_flags & APPL_FLAG_OLD_LI_SPEC)
-             && (notify_plci->State)
-             && notify_plci->NL.Id && !notify_plci->nl_remove_id)
-            {
-              mixer_notify_source_removed (notify_plci, plci_b_id);
-            }
-          }
-        }
-        mixer_clear_config (plci);
-        mixer_calculate_coefs (a);
-        mixer_notify_update (plci, true);
-      }
-      li_config_table[i].plci = NULL;
-      plci->li_bchannel_id = 0;
-    }
-  }
-}
-
-
-/*------------------------------------------------------------------*/
-/* Echo canceller facilities                                        */
-/*------------------------------------------------------------------*/
-
-
-static void ec_write_parameters (PLCI   *plci)
-{
-  word w;
-    byte parameter_buffer[6];
-
-  dbug (1, dprintf ("[%06lx] %s,%d: ec_write_parameters",
-    (dword)((plci->Id << 8) | UnMapController (plci->adapter->Id)),
-    (char   *)(FILE_), __LINE__));
-
-  parameter_buffer[0] = 5;
-  parameter_buffer[1] = DSP_CTRL_SET_LEC_PARAMETERS;
-  PUT_WORD (&parameter_buffer[2], plci->ec_idi_options);
-  plci->ec_idi_options &= ~LEC_RESET_COEFFICIENTS;
-  w = (plci->ec_tail_length == 0) ? 128 : plci->ec_tail_length;
-  PUT_WORD (&parameter_buffer[4], w);
-  add_p (plci, FTY, parameter_buffer);
-  sig_req (plci, TEL_CTRL, 0);
-  send_req (plci);
-}
-
-
-static void ec_clear_config (PLCI   *plci)
-{
-
-  dbug (1, dprintf ("[%06lx] %s,%d: ec_clear_config",
-    (dword)((plci->Id << 8) | UnMapController (plci->adapter->Id)),
-    (char   *)(FILE_), __LINE__));
-
-  plci->ec_idi_options = LEC_ENABLE_ECHO_CANCELLER |
-    LEC_MANUAL_DISABLE | LEC_ENABLE_NONLINEAR_PROCESSING;
-  plci->ec_tail_length = 0;
-}
-
-
-static void ec_prepare_switch (dword Id, PLCI   *plci)
-{
-
-  dbug (1, dprintf ("[%06lx] %s,%d: ec_prepare_switch",
-    UnMapId (Id), (char   *)(FILE_), __LINE__));
-
-}
-
-
-static word ec_save_config (dword Id, PLCI   *plci, byte Rc)
-{
-
-  dbug (1, dprintf ("[%06lx] %s,%d: ec_save_config %02x %d",
-    UnMapId (Id), (char   *)(FILE_), __LINE__, Rc, plci->adjust_b_state));
-
-  return (GOOD);
-}
-
-
-static word ec_restore_config (dword Id, PLCI   *plci, byte Rc)
-{
-  word Info;
-
-  dbug (1, dprintf ("[%06lx] %s,%d: ec_restore_config %02x %d",
-    UnMapId (Id), (char   *)(FILE_), __LINE__, Rc, plci->adjust_b_state));
-
-  Info = GOOD;
-  if (plci->B1_facilities & B1_FACILITY_EC)
-  {
-    switch (plci->adjust_b_state)
-    {
-    case ADJUST_B_RESTORE_EC_1:
-      plci->internal_command = plci->adjust_b_command;
-      if (plci->sig_req)
-      {
-        plci->adjust_b_state = ADJUST_B_RESTORE_EC_1;
-        break;
-      }
-      ec_write_parameters (plci);
-      plci->adjust_b_state = ADJUST_B_RESTORE_EC_2;
-      break;
-    case ADJUST_B_RESTORE_EC_2:
-      if ((Rc != OK) && (Rc != OK_FC))
-      {
-        dbug (1, dprintf ("[%06lx] %s,%d: Restore EC failed %02x",
-          UnMapId (Id), (char   *)(FILE_), __LINE__, Rc));
-        Info = _WRONG_STATE;
-        break;
-      }
-      break;
-    }
-  }
-  return (Info);
-}
-
-
-static void ec_command (dword Id, PLCI   *plci, byte Rc)
-{
-  word internal_command, Info;
-    byte result[8];
-
-  dbug (1, dprintf ("[%06lx] %s,%d: ec_command %02x %04x %04x %04x %d",
-    UnMapId (Id), (char   *)(FILE_), __LINE__, Rc, plci->internal_command,
-    plci->ec_cmd, plci->ec_idi_options, plci->ec_tail_length));
-
-  Info = GOOD;
-  if (plci->appl->appl_flags & APPL_FLAG_PRIV_EC_SPEC)
-  {
-    result[0] = 2;
-    PUT_WORD (&result[1], EC_SUCCESS);
-  }
-  else
-  {
-    result[0] = 5;
-    PUT_WORD (&result[1], plci->ec_cmd);
-    result[3] = 2;
-    PUT_WORD (&result[4], GOOD);
-  }
-  internal_command = plci->internal_command;
-  plci->internal_command = 0;
-  switch (plci->ec_cmd)
-  {
-  case EC_ENABLE_OPERATION:
-  case EC_FREEZE_COEFFICIENTS:
-  case EC_RESUME_COEFFICIENT_UPDATE:
-  case EC_RESET_COEFFICIENTS:
-    switch (internal_command)
-    {
-    default:
-      adjust_b1_resource (Id, plci, NULL, (word)(plci->B1_facilities |
-        B1_FACILITY_EC), EC_COMMAND_1);
-    case EC_COMMAND_1:
-      if (adjust_b_process (Id, plci, Rc) != GOOD)
-      {
-        dbug (1, dprintf ("[%06lx] %s,%d: Load EC failed",
-          UnMapId (Id), (char   *)(FILE_), __LINE__));
-        Info = _FACILITY_NOT_SUPPORTED;
-        break;
-      }
-      if (plci->internal_command)
-        return;
-    case EC_COMMAND_2:
-      if (plci->sig_req)
-      {
-        plci->internal_command = EC_COMMAND_2;
-        return;
-      }
-      plci->internal_command = EC_COMMAND_3;
-      ec_write_parameters (plci);
-      return;
-    case EC_COMMAND_3:
-      if ((Rc != OK) && (Rc != OK_FC))
-      {
-        dbug (1, dprintf ("[%06lx] %s,%d: Enable EC failed %02x",
-          UnMapId (Id), (char   *)(FILE_), __LINE__, Rc));
-        Info = _FACILITY_NOT_SUPPORTED;
-        break;
-      }
-      break;
-    }
-    break;
-
-  case EC_DISABLE_OPERATION:
-    switch (internal_command)
-    {
-    default:
-    case EC_COMMAND_1:
-      if (plci->B1_facilities & B1_FACILITY_EC)
-      {
-        if (plci->sig_req)
-        {
-          plci->internal_command = EC_COMMAND_1;
-          return;
-        }
-        plci->internal_command = EC_COMMAND_2;
-        ec_write_parameters (plci);
-        return;
-      }
-      Rc = OK;
-    case EC_COMMAND_2:
-      if ((Rc != OK) && (Rc != OK_FC))
-      {
-        dbug (1, dprintf ("[%06lx] %s,%d: Disable EC failed %02x",
-          UnMapId (Id), (char   *)(FILE_), __LINE__, Rc));
-        Info = _FACILITY_NOT_SUPPORTED;
-        break;
-      }
-      adjust_b1_resource (Id, plci, NULL, (word)(plci->B1_facilities &
-        ~B1_FACILITY_EC), EC_COMMAND_3);
-    case EC_COMMAND_3:
-      if (adjust_b_process (Id, plci, Rc) != GOOD)
-      {
-        dbug (1, dprintf ("[%06lx] %s,%d: Unload EC failed",
-          UnMapId (Id), (char   *)(FILE_), __LINE__));
-        Info = _FACILITY_NOT_SUPPORTED;
-        break;
-      }
-      if (plci->internal_command)
-        return;
-      break;
-    }
-    break;
-  }
-  sendf (plci->appl, _FACILITY_R | CONFIRM, Id & 0xffffL, plci->number,
-    "wws", Info, (plci->appl->appl_flags & APPL_FLAG_PRIV_EC_SPEC) ?
-    PRIV_SELECTOR_ECHO_CANCELLER : SELECTOR_ECHO_CANCELLER, result);
-}
-
-
-static byte ec_request (dword Id, word Number, DIVA_CAPI_ADAPTER   *a, PLCI   *plci, APPL   *appl, API_PARSE *msg)
-{
-  word Info;
-  word opt;
-    API_PARSE ec_parms[3];
-    byte result[16];
-
-  dbug (1, dprintf ("[%06lx] %s,%d: ec_request",
-    UnMapId (Id), (char   *)(FILE_), __LINE__));
-
-  Info = GOOD;
-  result[0] = 0;
-  if (!(a->man_profile.private_options & (1L << PRIVATE_ECHO_CANCELLER)))
-  {
-    dbug (1, dprintf ("[%06lx] %s,%d: Facility not supported",
-      UnMapId (Id), (char   *)(FILE_), __LINE__));
-    Info = _FACILITY_NOT_SUPPORTED;
-  }
-  else
-  {
-    if (appl->appl_flags & APPL_FLAG_PRIV_EC_SPEC)
-    {
-      if (api_parse (&msg[1].info[1], msg[1].length, "w", ec_parms))
-      {
-        dbug (1, dprintf ("[%06lx] %s,%d: Wrong message format",
-          UnMapId (Id), (char   *)(FILE_), __LINE__));
-        Info = _WRONG_MESSAGE_FORMAT;
-      }
-      else
-      {
-        if (plci == NULL)
-        {
-          dbug (1, dprintf ("[%06lx] %s,%d: Wrong PLCI",
-            UnMapId (Id), (char   *)(FILE_), __LINE__));
-          Info = _WRONG_IDENTIFIER;
-        }
-        else if (!plci->State || !plci->NL.Id || plci->nl_remove_id)
-        {
-          dbug (1, dprintf ("[%06lx] %s,%d: Wrong state",
-            UnMapId (Id), (char   *)(FILE_), __LINE__));
-          Info = _WRONG_STATE;
-        }
-        else
-        {
-          plci->command = 0;
-          plci->ec_cmd = GET_WORD (ec_parms[0].info);
-          plci->ec_idi_options &= ~(LEC_MANUAL_DISABLE | LEC_RESET_COEFFICIENTS);
-          result[0] = 2;
-          PUT_WORD (&result[1], EC_SUCCESS);
-          if (msg[1].length >= 4)
-          {
-            opt = GET_WORD (&ec_parms[0].info[2]);
-            plci->ec_idi_options &= ~(LEC_ENABLE_NONLINEAR_PROCESSING |
-              LEC_ENABLE_2100HZ_DETECTOR | LEC_REQUIRE_2100HZ_REVERSALS);
-            if (!(opt & EC_DISABLE_NON_LINEAR_PROCESSING))
-              plci->ec_idi_options |= LEC_ENABLE_NONLINEAR_PROCESSING;
-            if (opt & EC_DETECT_DISABLE_TONE)
-              plci->ec_idi_options |= LEC_ENABLE_2100HZ_DETECTOR;
-            if (!(opt & EC_DO_NOT_REQUIRE_REVERSALS))
-              plci->ec_idi_options |= LEC_REQUIRE_2100HZ_REVERSALS;
-            if (msg[1].length >= 6)
-            {
-              plci->ec_tail_length = GET_WORD (&ec_parms[0].info[4]);
-            }
-          }
-          switch (plci->ec_cmd)
-          {
-          case EC_ENABLE_OPERATION:
-            plci->ec_idi_options &= ~LEC_FREEZE_COEFFICIENTS;
-            start_internal_command (Id, plci, ec_command);
-            return (false);
-
-          case EC_DISABLE_OPERATION:
-            plci->ec_idi_options = LEC_ENABLE_ECHO_CANCELLER |
-              LEC_MANUAL_DISABLE | LEC_ENABLE_NONLINEAR_PROCESSING |
-              LEC_RESET_COEFFICIENTS;
-            start_internal_command (Id, plci, ec_command);
-            return (false);
-
-          case EC_FREEZE_COEFFICIENTS:
-            plci->ec_idi_options |= LEC_FREEZE_COEFFICIENTS;
-            start_internal_command (Id, plci, ec_command);
-            return (false);
-
-          case EC_RESUME_COEFFICIENT_UPDATE:
-            plci->ec_idi_options &= ~LEC_FREEZE_COEFFICIENTS;
-            start_internal_command (Id, plci, ec_command);
-            return (false);
-
-          case EC_RESET_COEFFICIENTS:
-            plci->ec_idi_options |= LEC_RESET_COEFFICIENTS;
-            start_internal_command (Id, plci, ec_command);
-            return (false);
-
-          default:
-            dbug (1, dprintf ("[%06lx] %s,%d: EC unknown request %04x",
-              UnMapId (Id), (char   *)(FILE_), __LINE__, plci->ec_cmd));
-            PUT_WORD (&result[1], EC_UNSUPPORTED_OPERATION);
-          }
-        }
-      }
-    }
-    else
-    {
-      if (api_parse (&msg[1].info[1], msg[1].length, "ws", ec_parms))
-      {
-        dbug (1, dprintf ("[%06lx] %s,%d: Wrong message format",
-          UnMapId (Id), (char   *)(FILE_), __LINE__));
-        Info = _WRONG_MESSAGE_FORMAT;
-      }
-      else
-      {
-        if (GET_WORD (ec_parms[0].info) == EC_GET_SUPPORTED_SERVICES)
-        {
-          result[0] = 11;
-          PUT_WORD (&result[1], EC_GET_SUPPORTED_SERVICES);
-          result[3] = 8;
-          PUT_WORD (&result[4], GOOD);
-          PUT_WORD (&result[6], 0x0007);
-          PUT_WORD (&result[8], LEC_MAX_SUPPORTED_TAIL_LENGTH);
-          PUT_WORD (&result[10], 0);
-        }
-        else if (plci == NULL)
-        {
-          dbug (1, dprintf ("[%06lx] %s,%d: Wrong PLCI",
-            UnMapId (Id), (char   *)(FILE_), __LINE__));
-          Info = _WRONG_IDENTIFIER;
-        }
-        else if (!plci->State || !plci->NL.Id || plci->nl_remove_id)
-        {
-          dbug (1, dprintf ("[%06lx] %s,%d: Wrong state",
-            UnMapId (Id), (char   *)(FILE_), __LINE__));
-          Info = _WRONG_STATE;
-        }
-        else
-        {
-          plci->command = 0;
-          plci->ec_cmd = GET_WORD (ec_parms[0].info);
-          plci->ec_idi_options &= ~(LEC_MANUAL_DISABLE | LEC_RESET_COEFFICIENTS);
-          result[0] = 5;
-          PUT_WORD (&result[1], plci->ec_cmd);
-          result[3] = 2;
-          PUT_WORD (&result[4], GOOD);
-          plci->ec_idi_options &= ~(LEC_ENABLE_NONLINEAR_PROCESSING |
-            LEC_ENABLE_2100HZ_DETECTOR | LEC_REQUIRE_2100HZ_REVERSALS);
-          plci->ec_tail_length = 0;
-          if (ec_parms[1].length >= 2)
-          {
-            opt = GET_WORD (&ec_parms[1].info[1]);
-            if (opt & EC_ENABLE_NON_LINEAR_PROCESSING)
-              plci->ec_idi_options |= LEC_ENABLE_NONLINEAR_PROCESSING;
-            if (opt & EC_DETECT_DISABLE_TONE)
-              plci->ec_idi_options |= LEC_ENABLE_2100HZ_DETECTOR;
-            if (!(opt & EC_DO_NOT_REQUIRE_REVERSALS))
-              plci->ec_idi_options |= LEC_REQUIRE_2100HZ_REVERSALS;
-            if (ec_parms[1].length >= 4)
-            {
-              plci->ec_tail_length = GET_WORD (&ec_parms[1].info[3]);
-            }
-          }
-          switch (plci->ec_cmd)
-          {
-          case EC_ENABLE_OPERATION:
-            plci->ec_idi_options &= ~LEC_FREEZE_COEFFICIENTS;
-            start_internal_command (Id, plci, ec_command);
-            return (false);
-
-          case EC_DISABLE_OPERATION:
-            plci->ec_idi_options = LEC_ENABLE_ECHO_CANCELLER |
-              LEC_MANUAL_DISABLE | LEC_ENABLE_NONLINEAR_PROCESSING |
-              LEC_RESET_COEFFICIENTS;
-            start_internal_command (Id, plci, ec_command);
-            return (false);
-
-          default:
-            dbug (1, dprintf ("[%06lx] %s,%d: EC unknown request %04x",
-              UnMapId (Id), (char   *)(FILE_), __LINE__, plci->ec_cmd));
-            PUT_WORD (&result[4], _FACILITY_SPECIFIC_FUNCTION_NOT_SUPP);
-          }
-        }
-      }
-    }
-  }
-  sendf (appl, _FACILITY_R | CONFIRM, Id & 0xffffL, Number,
-    "wws", Info, (appl->appl_flags & APPL_FLAG_PRIV_EC_SPEC) ?
-    PRIV_SELECTOR_ECHO_CANCELLER : SELECTOR_ECHO_CANCELLER, result);
-  return (false);
-}
-
-
-static void ec_indication (dword Id, PLCI   *plci, byte   *msg, word length)
-{
-    byte result[8];
-
-  dbug (1, dprintf ("[%06lx] %s,%d: ec_indication",
-    UnMapId (Id), (char   *)(FILE_), __LINE__));
-
-  if (!(plci->ec_idi_options & LEC_MANUAL_DISABLE))
-  {
-    if (plci->appl->appl_flags & APPL_FLAG_PRIV_EC_SPEC)
-    {
-      result[0] = 2;
-      PUT_WORD (&result[1], 0);
-      switch (msg[1])
-      {
-      case LEC_DISABLE_TYPE_CONTIGNUOUS_2100HZ:
-        PUT_WORD (&result[1], EC_BYPASS_DUE_TO_CONTINUOUS_2100HZ);
-        break;
-      case LEC_DISABLE_TYPE_REVERSED_2100HZ:
-        PUT_WORD (&result[1], EC_BYPASS_DUE_TO_REVERSED_2100HZ);
-        break;
-      case LEC_DISABLE_RELEASED:
-        PUT_WORD (&result[1], EC_BYPASS_RELEASED);
-        break;
-      }
-    }
-    else
-    {
-      result[0] = 5;
-      PUT_WORD (&result[1], EC_BYPASS_INDICATION);
-      result[3] = 2;
-      PUT_WORD (&result[4], 0);
-      switch (msg[1])
-      {
-      case LEC_DISABLE_TYPE_CONTIGNUOUS_2100HZ:
-        PUT_WORD (&result[4], EC_BYPASS_DUE_TO_CONTINUOUS_2100HZ);
-        break;
-      case LEC_DISABLE_TYPE_REVERSED_2100HZ:
-        PUT_WORD (&result[4], EC_BYPASS_DUE_TO_REVERSED_2100HZ);
-        break;
-      case LEC_DISABLE_RELEASED:
-        PUT_WORD (&result[4], EC_BYPASS_RELEASED);
-        break;
-      }
-    }
-    sendf (plci->appl, _FACILITY_I, Id & 0xffffL, 0, "ws", (plci->appl->appl_flags & APPL_FLAG_PRIV_EC_SPEC) ?
-      PRIV_SELECTOR_ECHO_CANCELLER : SELECTOR_ECHO_CANCELLER, result);
-  }
-}
-
-
-
-/*------------------------------------------------------------------*/
-/* Advanced voice                                                   */
-/*------------------------------------------------------------------*/
-
-static void adv_voice_write_coefs (PLCI   *plci, word write_command)
+       byte mask;
+       byte from_pc;
+       byte to_pc;
+} xconnect_write_prog[] =
 {
-  DIVA_CAPI_ADAPTER   *a;
-  word i;
-  byte *p;
-
-  word w, n, j, k;
-  byte ch_map[MIXER_CHANNELS_BRI];
-
-    byte coef_buffer[ADV_VOICE_COEF_BUFFER_SIZE + 2];
-
-  dbug (1, dprintf ("[%06lx] %s,%d: adv_voice_write_coefs %d",
-    (dword)((plci->Id << 8) | UnMapController (plci->adapter->Id)),
-    (char   *)(FILE_), __LINE__, write_command));
-
-  a = plci->adapter;
-  p = coef_buffer + 1;
-  *(p++) = DSP_CTRL_OLD_SET_MIXER_COEFFICIENTS;
-  i = 0;
-  while (i + sizeof(word) <= a->adv_voice_coef_length)
-  {
-    PUT_WORD (p, GET_WORD (a->adv_voice_coef_buffer + i));
-    p += 2;
-    i += 2;
-  }
-  while (i < ADV_VOICE_OLD_COEF_COUNT * sizeof(word))
-  {
-    PUT_WORD (p, 0x8000);
-    p += 2;
-    i += 2;
-  }
+       { LI_COEF_CH_CH, false, false },
+       { LI_COEF_CH_PC, false, true },
+       { LI_COEF_PC_CH, true, false },
+       { LI_COEF_PC_PC, true, true }
+};
 
-  if (!a->li_pri && (plci->li_bchannel_id == 0))
-  {
-    if ((li_config_table[a->li_base].plci == NULL) && (li_config_table[a->li_base + 1].plci != NULL))
-    {
-      plci->li_bchannel_id = 1;
-      li_config_table[a->li_base].plci = plci;
-      dbug (1, dprintf ("[%06lx] %s,%d: adv_voice_set_bchannel_id %d",
-        (dword)((plci->Id << 8) | UnMapController (plci->adapter->Id)),
-        (char   *)(FILE_), __LINE__, plci->li_bchannel_id));
-    }
-    else if ((li_config_table[a->li_base].plci != NULL) && (li_config_table[a->li_base + 1].plci == NULL))
-    {
-      plci->li_bchannel_id = 2;
-      li_config_table[a->li_base + 1].plci = plci;
-      dbug (1, dprintf ("[%06lx] %s,%d: adv_voice_set_bchannel_id %d",
-        (dword)((plci->Id << 8) | UnMapController (plci->adapter->Id)),
-        (char   *)(FILE_), __LINE__, plci->li_bchannel_id));
-    }
-  }
-  if (!a->li_pri && (plci->li_bchannel_id != 0)
-   && (li_config_table[a->li_base + (plci->li_bchannel_id - 1)].plci == plci))
-  {
-    i = a->li_base + (plci->li_bchannel_id - 1);
-    switch (write_command)
-    {
-    case ADV_VOICE_WRITE_ACTIVATION:
-      j = a->li_base + MIXER_IC_CHANNEL_BASE + (plci->li_bchannel_id - 1);
-      k = a->li_base + MIXER_IC_CHANNEL_BASE + (2 - plci->li_bchannel_id);
-      if (!(plci->B1_facilities & B1_FACILITY_MIXER))
-      {
-        li_config_table[j].flag_table[i] |= LI_FLAG_CONFERENCE | LI_FLAG_MIX;
-        li_config_table[i].flag_table[j] |= LI_FLAG_CONFERENCE | LI_FLAG_MONITOR;
-      }
-      if (a->manufacturer_features & MANUFACTURER_FEATURE_SLAVE_CODEC)
-      {
-        li_config_table[k].flag_table[i] |= LI_FLAG_CONFERENCE | LI_FLAG_MIX;
-        li_config_table[i].flag_table[k] |= LI_FLAG_CONFERENCE | LI_FLAG_MONITOR;
-        li_config_table[k].flag_table[j] |= LI_FLAG_CONFERENCE;
-        li_config_table[j].flag_table[k] |= LI_FLAG_CONFERENCE;
-      }
-      mixer_calculate_coefs (a);
-      li_config_table[i].curchnl = li_config_table[i].channel;
-      li_config_table[j].curchnl = li_config_table[j].channel;
-      if (a->manufacturer_features & MANUFACTURER_FEATURE_SLAVE_CODEC)
-        li_config_table[k].curchnl = li_config_table[k].channel;
-      break;
-
-    case ADV_VOICE_WRITE_DEACTIVATION:
-      for (j = 0; j < li_total_channels; j++)
-      {
-        li_config_table[i].flag_table[j] = 0;
-        li_config_table[j].flag_table[i] = 0;
-      }
-      k = a->li_base + MIXER_IC_CHANNEL_BASE + (plci->li_bchannel_id - 1);
-      for (j = 0; j < li_total_channels; j++)
-      {
-        li_config_table[k].flag_table[j] = 0;
-        li_config_table[j].flag_table[k] = 0;
-      }
-      if (a->manufacturer_features & MANUFACTURER_FEATURE_SLAVE_CODEC)
-      {
-        k = a->li_base + MIXER_IC_CHANNEL_BASE + (2 - plci->li_bchannel_id);
-        for (j = 0; j < li_total_channels; j++)
-        {
-          li_config_table[k].flag_table[j] = 0;
-          li_config_table[j].flag_table[k] = 0;
-        }
-      }
-      mixer_calculate_coefs (a);
-      break;
-    }
-    if (plci->B1_facilities & B1_FACILITY_MIXER)
-    {
-      w = 0;
-      if (ADV_VOICE_NEW_COEF_BASE + sizeof(word) <= a->adv_voice_coef_length)
-        w = GET_WORD (a->adv_voice_coef_buffer + ADV_VOICE_NEW_COEF_BASE);
-      if (li_config_table[i].channel & LI_CHANNEL_TX_DATA)
-        w |= MIXER_FEATURE_ENABLE_TX_DATA;
-      if (li_config_table[i].channel & LI_CHANNEL_RX_DATA)
-        w |= MIXER_FEATURE_ENABLE_RX_DATA;
-      *(p++) = (byte) w;
-      *(p++) = (byte)(w >> 8);
-      for (j = 0; j < sizeof(ch_map); j += 2)
-      {
-        ch_map[j] = (byte)(j + (plci->li_bchannel_id - 1));
-        ch_map[j+1] = (byte)(j + (2 - plci->li_bchannel_id));
-      }
-      for (n = 0; n < ARRAY_SIZE(mixer_write_prog_bri); n++)
-      {
-        i = a->li_base + ch_map[mixer_write_prog_bri[n].to_ch];
-        j = a->li_base + ch_map[mixer_write_prog_bri[n].from_ch];
-        if (li_config_table[i].channel & li_config_table[j].channel & LI_CHANNEL_INVOLVED)
-        {
-          *(p++) = ((li_config_table[i].coef_table[j] & mixer_write_prog_bri[n].mask) ? 0x80 : 0x01);
-          w = ((li_config_table[i].coef_table[j] & 0xf) ^ (li_config_table[i].coef_table[j] >> 4));
-          li_config_table[i].coef_table[j] ^= (w & mixer_write_prog_bri[n].mask) << 4;
-        }
-        else
-        {
-          *(p++) = (ADV_VOICE_NEW_COEF_BASE + sizeof(word) + n < a->adv_voice_coef_length) ?
-            a->adv_voice_coef_buffer[ADV_VOICE_NEW_COEF_BASE + sizeof(word) + n] : 0x00;
-        }
-      }
-    }
-    else
-    {
-      for (i = ADV_VOICE_NEW_COEF_BASE; i < a->adv_voice_coef_length; i++)
-        *(p++) = a->adv_voice_coef_buffer[i];
-    }
-  }
-  else
 
-  {
-    for (i = ADV_VOICE_NEW_COEF_BASE; i < a->adv_voice_coef_length; i++)
-      *(p++) = a->adv_voice_coef_buffer[i];
-  }
-  coef_buffer[0] = (p - coef_buffer) - 1;
-  add_p (plci, FTY, coef_buffer);
-  sig_req (plci, TEL_CTRL, 0);
-  send_req (plci);
+static void xconnect_query_addresses(PLCI *plci)
+{
+       DIVA_CAPI_ADAPTER *a;
+       word w, ch;
+       byte *p;
+
+       dbug(1, dprintf("[%06lx] %s,%d: xconnect_query_addresses",
+                       (dword)((plci->Id << 8) | UnMapController(plci->adapter->Id)),
+                       (char *)(FILE_), __LINE__));
+
+       a = plci->adapter;
+       if (a->li_pri && ((plci->li_bchannel_id == 0)
+                         || (li_config_table[a->li_base + (plci->li_bchannel_id - 1)].plci != plci)))
+       {
+               dbug(1, dprintf("[%06x] %s,%d: Channel id wiped out",
+                               (dword)((plci->Id << 8) | UnMapController(plci->adapter->Id)),
+                               (char *)(FILE_), __LINE__));
+               return;
+       }
+       p = plci->internal_req_buffer;
+       ch = (a->li_pri) ? plci->li_bchannel_id - 1 : 0;
+       *(p++) = UDATA_REQUEST_XCONNECT_FROM;
+       w = ch;
+       *(p++) = (byte) w;
+       *(p++) = (byte)(w >> 8);
+       w = ch | XCONNECT_CHANNEL_PORT_PC;
+       *(p++) = (byte) w;
+       *(p++) = (byte)(w >> 8);
+       plci->NData[0].P = plci->internal_req_buffer;
+       plci->NData[0].PLength = p - plci->internal_req_buffer;
+       plci->NL.X = plci->NData;
+       plci->NL.ReqCh = 0;
+       plci->NL.Req = plci->nl_req = (byte) N_UDATA;
+       plci->adapter->request(&plci->NL);
+}
+
+
+static void xconnect_write_coefs(PLCI *plci, word internal_command)
+{
+
+       dbug(1, dprintf("[%06lx] %s,%d: xconnect_write_coefs %04x",
+                       (dword)((plci->Id << 8) | UnMapController(plci->adapter->Id)),
+                       (char *)(FILE_), __LINE__, internal_command));
+
+       plci->li_write_command = internal_command;
+       plci->li_write_channel = 0;
+}
+
+
+static byte xconnect_write_coefs_process(dword Id, PLCI *plci, byte Rc)
+{
+       DIVA_CAPI_ADAPTER *a;
+       word w, n, i, j, r, s, to_ch;
+       dword d;
+       byte *p;
+       struct xconnect_transfer_address_s   *transfer_address;
+       byte ch_map[MIXER_CHANNELS_BRI];
+
+       dbug(1, dprintf("[%06x] %s,%d: xconnect_write_coefs_process %02x %d",
+                       UnMapId(Id), (char *)(FILE_), __LINE__, Rc, plci->li_write_channel));
+
+       a = plci->adapter;
+       if ((plci->li_bchannel_id == 0)
+           || (li_config_table[a->li_base + (plci->li_bchannel_id - 1)].plci != plci))
+       {
+               dbug(1, dprintf("[%06x] %s,%d: Channel id wiped out",
+                               UnMapId(Id), (char *)(FILE_), __LINE__));
+               return (true);
+       }
+       i = a->li_base + (plci->li_bchannel_id - 1);
+       j = plci->li_write_channel;
+       p = plci->internal_req_buffer;
+       if (j != 0)
+       {
+               if ((Rc != OK) && (Rc != OK_FC))
+               {
+                       dbug(1, dprintf("[%06lx] %s,%d: LI write coefs failed %02x",
+                                       UnMapId(Id), (char *)(FILE_), __LINE__, Rc));
+                       return (false);
+               }
+       }
+       if (li_config_table[i].adapter->manufacturer_features & MANUFACTURER_FEATURE_XCONNECT)
+       {
+               r = 0;
+               s = 0;
+               if (j < li_total_channels)
+               {
+                       if (li_config_table[i].channel & LI_CHANNEL_ADDRESSES_SET)
+                       {
+                               s = ((li_config_table[i].send_b.card_address.low | li_config_table[i].send_b.card_address.high) ?
+                                    (LI_COEF_CH_CH | LI_COEF_CH_PC | LI_COEF_PC_CH | LI_COEF_PC_PC) : (LI_COEF_CH_PC | LI_COEF_PC_PC)) &
+                                       ((li_config_table[i].send_pc.card_address.low | li_config_table[i].send_pc.card_address.high) ?
+                                        (LI_COEF_CH_CH | LI_COEF_CH_PC | LI_COEF_PC_CH | LI_COEF_PC_PC) : (LI_COEF_CH_CH | LI_COEF_PC_CH));
+                       }
+                       r = ((li_config_table[i].coef_table[j] & 0xf) ^ (li_config_table[i].coef_table[j] >> 4));
+                       while ((j < li_total_channels)
+                              && ((r == 0)
+                                  || (!(li_config_table[j].channel & LI_CHANNEL_ADDRESSES_SET))
+                                  || (!li_config_table[j].adapter->li_pri
+                                      && (j >= li_config_table[j].adapter->li_base + MIXER_BCHANNELS_BRI))
+                                  || (((li_config_table[j].send_b.card_address.low != li_config_table[i].send_b.card_address.low)
+                                       || (li_config_table[j].send_b.card_address.high != li_config_table[i].send_b.card_address.high))
+                                      && (!(a->manufacturer_features & MANUFACTURER_FEATURE_DMACONNECT)
+                                          || !(li_config_table[j].adapter->manufacturer_features & MANUFACTURER_FEATURE_DMACONNECT)))
+                                  || ((li_config_table[j].adapter->li_base != a->li_base)
+                                      && !(r & s &
+                                           ((li_config_table[j].send_b.card_address.low | li_config_table[j].send_b.card_address.high) ?
+                                            (LI_COEF_CH_CH | LI_COEF_CH_PC | LI_COEF_PC_CH | LI_COEF_PC_PC) : (LI_COEF_PC_CH | LI_COEF_PC_PC)) &
+                                           ((li_config_table[j].send_pc.card_address.low | li_config_table[j].send_pc.card_address.high) ?
+                                            (LI_COEF_CH_CH | LI_COEF_CH_PC | LI_COEF_PC_CH | LI_COEF_PC_PC) : (LI_COEF_CH_CH | LI_COEF_CH_PC))))))
+                       {
+                               j++;
+                               if (j < li_total_channels)
+                                       r = ((li_config_table[i].coef_table[j] & 0xf) ^ (li_config_table[i].coef_table[j] >> 4));
+                       }
+               }
+               if (j < li_total_channels)
+               {
+                       plci->internal_command = plci->li_write_command;
+                       if (plci_nl_busy(plci))
+                               return (true);
+                       to_ch = (a->li_pri) ? plci->li_bchannel_id - 1 : 0;
+                       *(p++) = UDATA_REQUEST_XCONNECT_TO;
+                       do
+                       {
+                               if (li_config_table[j].adapter->li_base != a->li_base)
+                               {
+                                       r &= s &
+                                               ((li_config_table[j].send_b.card_address.low | li_config_table[j].send_b.card_address.high) ?
+                                                (LI_COEF_CH_CH | LI_COEF_CH_PC | LI_COEF_PC_CH | LI_COEF_PC_PC) : (LI_COEF_PC_CH | LI_COEF_PC_PC)) &
+                                               ((li_config_table[j].send_pc.card_address.low | li_config_table[j].send_pc.card_address.high) ?
+                                                (LI_COEF_CH_CH | LI_COEF_CH_PC | LI_COEF_PC_CH | LI_COEF_PC_PC) : (LI_COEF_CH_CH | LI_COEF_CH_PC));
+                               }
+                               n = 0;
+                               do
+                               {
+                                       if (r & xconnect_write_prog[n].mask)
+                                       {
+                                               if (xconnect_write_prog[n].from_pc)
+                                                       transfer_address = &(li_config_table[j].send_pc);
+                                               else
+                                                       transfer_address = &(li_config_table[j].send_b);
+                                               d = transfer_address->card_address.low;
+                                               *(p++) = (byte) d;
+                                               *(p++) = (byte)(d >> 8);
+                                               *(p++) = (byte)(d >> 16);
+                                               *(p++) = (byte)(d >> 24);
+                                               d = transfer_address->card_address.high;
+                                               *(p++) = (byte) d;
+                                               *(p++) = (byte)(d >> 8);
+                                               *(p++) = (byte)(d >> 16);
+                                               *(p++) = (byte)(d >> 24);
+                                               d = transfer_address->offset;
+                                               *(p++) = (byte) d;
+                                               *(p++) = (byte)(d >> 8);
+                                               *(p++) = (byte)(d >> 16);
+                                               *(p++) = (byte)(d >> 24);
+                                               w = xconnect_write_prog[n].to_pc ? to_ch | XCONNECT_CHANNEL_PORT_PC : to_ch;
+                                               *(p++) = (byte) w;
+                                               *(p++) = (byte)(w >> 8);
+                                               w = ((li_config_table[i].coef_table[j] & xconnect_write_prog[n].mask) == 0) ? 0x01 :
+                                                       (li_config_table[i].adapter->u_law ?
+                                                        (li_config_table[j].adapter->u_law ? 0x80 : 0x86) :
+                                                        (li_config_table[j].adapter->u_law ? 0x7a : 0x80));
+                                               *(p++) = (byte) w;
+                                               *(p++) = (byte) 0;
+                                               li_config_table[i].coef_table[j] ^= xconnect_write_prog[n].mask << 4;
+                                       }
+                                       n++;
+                               } while ((n < ARRAY_SIZE(xconnect_write_prog))
+                                        && ((p - plci->internal_req_buffer) + 16 < INTERNAL_REQ_BUFFER_SIZE));
+                               if (n == ARRAY_SIZE(xconnect_write_prog))
+                               {
+                                       do
+                                       {
+                                               j++;
+                                               if (j < li_total_channels)
+                                                       r = ((li_config_table[i].coef_table[j] & 0xf) ^ (li_config_table[i].coef_table[j] >> 4));
+                                       } while ((j < li_total_channels)
+                                                && ((r == 0)
+                                                    || (!(li_config_table[j].channel & LI_CHANNEL_ADDRESSES_SET))
+                                                    || (!li_config_table[j].adapter->li_pri
+                                                        && (j >= li_config_table[j].adapter->li_base + MIXER_BCHANNELS_BRI))
+                                                    || (((li_config_table[j].send_b.card_address.low != li_config_table[i].send_b.card_address.low)
+                                                         || (li_config_table[j].send_b.card_address.high != li_config_table[i].send_b.card_address.high))
+                                                        && (!(a->manufacturer_features & MANUFACTURER_FEATURE_DMACONNECT)
+                                                            || !(li_config_table[j].adapter->manufacturer_features & MANUFACTURER_FEATURE_DMACONNECT)))
+                                                    || ((li_config_table[j].adapter->li_base != a->li_base)
+                                                        && !(r & s &
+                                                             ((li_config_table[j].send_b.card_address.low | li_config_table[j].send_b.card_address.high) ?
+                                                              (LI_COEF_CH_CH | LI_COEF_CH_PC | LI_COEF_PC_CH | LI_COEF_PC_PC) : (LI_COEF_PC_CH | LI_COEF_PC_PC)) &
+                                                             ((li_config_table[j].send_pc.card_address.low | li_config_table[j].send_pc.card_address.high) ?
+                                                              (LI_COEF_CH_CH | LI_COEF_CH_PC | LI_COEF_PC_CH | LI_COEF_PC_PC) : (LI_COEF_CH_CH | LI_COEF_CH_PC))))));
+                               }
+                       } while ((j < li_total_channels)
+                                && ((p - plci->internal_req_buffer) + 16 < INTERNAL_REQ_BUFFER_SIZE));
+               }
+               else if (j == li_total_channels)
+               {
+                       plci->internal_command = plci->li_write_command;
+                       if (plci_nl_busy(plci))
+                               return (true);
+                       if (a->li_pri)
+                       {
+                               *(p++) = UDATA_REQUEST_SET_MIXER_COEFS_PRI_SYNC;
+                               w = 0;
+                               if (li_config_table[i].channel & LI_CHANNEL_TX_DATA)
+                                       w |= MIXER_FEATURE_ENABLE_TX_DATA;
+                               if (li_config_table[i].channel & LI_CHANNEL_RX_DATA)
+                                       w |= MIXER_FEATURE_ENABLE_RX_DATA;
+                               *(p++) = (byte) w;
+                               *(p++) = (byte)(w >> 8);
+                       }
+                       else
+                       {
+                               *(p++) = UDATA_REQUEST_SET_MIXER_COEFS_BRI;
+                               w = 0;
+                               if ((plci->tel == ADV_VOICE) && (plci == a->AdvSignalPLCI)
+                                   && (ADV_VOICE_NEW_COEF_BASE + sizeof(word) <= a->adv_voice_coef_length))
+                               {
+                                       w = GET_WORD(a->adv_voice_coef_buffer + ADV_VOICE_NEW_COEF_BASE);
+                               }
+                               if (li_config_table[i].channel & LI_CHANNEL_TX_DATA)
+                                       w |= MIXER_FEATURE_ENABLE_TX_DATA;
+                               if (li_config_table[i].channel & LI_CHANNEL_RX_DATA)
+                                       w |= MIXER_FEATURE_ENABLE_RX_DATA;
+                               *(p++) = (byte) w;
+                               *(p++) = (byte)(w >> 8);
+                               for (j = 0; j < sizeof(ch_map); j += 2)
+                               {
+                                       if (plci->li_bchannel_id == 2)
+                                       {
+                                               ch_map[j] = (byte)(j + 1);
+                                               ch_map[j + 1] = (byte) j;
+                                       }
+                                       else
+                                       {
+                                               ch_map[j] = (byte) j;
+                                               ch_map[j + 1] = (byte)(j + 1);
+                                       }
+                               }
+                               for (n = 0; n < ARRAY_SIZE(mixer_write_prog_bri); n++)
+                               {
+                                       i = a->li_base + ch_map[mixer_write_prog_bri[n].to_ch];
+                                       j = a->li_base + ch_map[mixer_write_prog_bri[n].from_ch];
+                                       if (li_config_table[i].channel & li_config_table[j].channel & LI_CHANNEL_INVOLVED)
+                                       {
+                                               *p = (mixer_write_prog_bri[n].xconnect_override != 0) ?
+                                                       mixer_write_prog_bri[n].xconnect_override :
+                                                       ((li_config_table[i].coef_table[j] & mixer_write_prog_bri[n].mask) ? 0x80 : 0x01);
+                                               if ((i >= a->li_base + MIXER_BCHANNELS_BRI) || (j >= a->li_base + MIXER_BCHANNELS_BRI))
+                                               {
+                                                       w = ((li_config_table[i].coef_table[j] & 0xf) ^ (li_config_table[i].coef_table[j] >> 4));
+                                                       li_config_table[i].coef_table[j] ^= (w & mixer_write_prog_bri[n].mask) << 4;
+                                               }
+                                       }
+                                       else
+                                       {
+                                               *p = 0x00;
+                                               if ((a->AdvSignalPLCI != NULL) && (a->AdvSignalPLCI->tel == ADV_VOICE))
+                                               {
+                                                       w = (plci == a->AdvSignalPLCI) ? n : mixer_swapped_index_bri[n];
+                                                       if (ADV_VOICE_NEW_COEF_BASE + sizeof(word) + w < a->adv_voice_coef_length)
+                                                               *p = a->adv_voice_coef_buffer[ADV_VOICE_NEW_COEF_BASE + sizeof(word) + w];
+                                               }
+                                       }
+                                       p++;
+                               }
+                       }
+                       j = li_total_channels + 1;
+               }
+       }
+       else
+       {
+               if (j <= li_total_channels)
+               {
+                       plci->internal_command = plci->li_write_command;
+                       if (plci_nl_busy(plci))
+                               return (true);
+                       if (j < a->li_base)
+                               j = a->li_base;
+                       if (a->li_pri)
+                       {
+                               *(p++) = UDATA_REQUEST_SET_MIXER_COEFS_PRI_SYNC;
+                               w = 0;
+                               if (li_config_table[i].channel & LI_CHANNEL_TX_DATA)
+                                       w |= MIXER_FEATURE_ENABLE_TX_DATA;
+                               if (li_config_table[i].channel & LI_CHANNEL_RX_DATA)
+                                       w |= MIXER_FEATURE_ENABLE_RX_DATA;
+                               *(p++) = (byte) w;
+                               *(p++) = (byte)(w >> 8);
+                               for (n = 0; n < ARRAY_SIZE(mixer_write_prog_pri); n++)
+                               {
+                                       *(p++) = (byte)((plci->li_bchannel_id - 1) | mixer_write_prog_pri[n].line_flags);
+                                       for (j = a->li_base; j < a->li_base + MIXER_CHANNELS_PRI; j++)
+                                       {
+                                               w = ((li_config_table[i].coef_table[j] & 0xf) ^ (li_config_table[i].coef_table[j] >> 4));
+                                               if (w & mixer_write_prog_pri[n].mask)
+                                               {
+                                                       *(p++) = (li_config_table[i].coef_table[j] & mixer_write_prog_pri[n].mask) ? 0x80 : 0x01;
+                                                       li_config_table[i].coef_table[j] ^= mixer_write_prog_pri[n].mask << 4;
+                                               }
+                                               else
+                                                       *(p++) = 0x00;
+                                       }
+                                       *(p++) = (byte)((plci->li_bchannel_id - 1) | MIXER_COEF_LINE_ROW_FLAG | mixer_write_prog_pri[n].line_flags);
+                                       for (j = a->li_base; j < a->li_base + MIXER_CHANNELS_PRI; j++)
+                                       {
+                                               w = ((li_config_table[j].coef_table[i] & 0xf) ^ (li_config_table[j].coef_table[i] >> 4));
+                                               if (w & mixer_write_prog_pri[n].mask)
+                                               {
+                                                       *(p++) = (li_config_table[j].coef_table[i] & mixer_write_prog_pri[n].mask) ? 0x80 : 0x01;
+                                                       li_config_table[j].coef_table[i] ^= mixer_write_prog_pri[n].mask << 4;
+                                               }
+                                               else
+                                                       *(p++) = 0x00;
+                                       }
+                               }
+                       }
+                       else
+                       {
+                               *(p++) = UDATA_REQUEST_SET_MIXER_COEFS_BRI;
+                               w = 0;
+                               if ((plci->tel == ADV_VOICE) && (plci == a->AdvSignalPLCI)
+                                   && (ADV_VOICE_NEW_COEF_BASE + sizeof(word) <= a->adv_voice_coef_length))
+                               {
+                                       w = GET_WORD(a->adv_voice_coef_buffer + ADV_VOICE_NEW_COEF_BASE);
+                               }
+                               if (li_config_table[i].channel & LI_CHANNEL_TX_DATA)
+                                       w |= MIXER_FEATURE_ENABLE_TX_DATA;
+                               if (li_config_table[i].channel & LI_CHANNEL_RX_DATA)
+                                       w |= MIXER_FEATURE_ENABLE_RX_DATA;
+                               *(p++) = (byte) w;
+                               *(p++) = (byte)(w >> 8);
+                               for (j = 0; j < sizeof(ch_map); j += 2)
+                               {
+                                       if (plci->li_bchannel_id == 2)
+                                       {
+                                               ch_map[j] = (byte)(j + 1);
+                                               ch_map[j + 1] = (byte) j;
+                                       }
+                                       else
+                                       {
+                                               ch_map[j] = (byte) j;
+                                               ch_map[j + 1] = (byte)(j + 1);
+                                       }
+                               }
+                               for (n = 0; n < ARRAY_SIZE(mixer_write_prog_bri); n++)
+                               {
+                                       i = a->li_base + ch_map[mixer_write_prog_bri[n].to_ch];
+                                       j = a->li_base + ch_map[mixer_write_prog_bri[n].from_ch];
+                                       if (li_config_table[i].channel & li_config_table[j].channel & LI_CHANNEL_INVOLVED)
+                                       {
+                                               *p = ((li_config_table[i].coef_table[j] & mixer_write_prog_bri[n].mask) ? 0x80 : 0x01);
+                                               w = ((li_config_table[i].coef_table[j] & 0xf) ^ (li_config_table[i].coef_table[j] >> 4));
+                                               li_config_table[i].coef_table[j] ^= (w & mixer_write_prog_bri[n].mask) << 4;
+                                       }
+                                       else
+                                       {
+                                               *p = 0x00;
+                                               if ((a->AdvSignalPLCI != NULL) && (a->AdvSignalPLCI->tel == ADV_VOICE))
+                                               {
+                                                       w = (plci == a->AdvSignalPLCI) ? n : mixer_swapped_index_bri[n];
+                                                       if (ADV_VOICE_NEW_COEF_BASE + sizeof(word) + w < a->adv_voice_coef_length)
+                                                               *p = a->adv_voice_coef_buffer[ADV_VOICE_NEW_COEF_BASE + sizeof(word) + w];
+                                               }
+                                       }
+                                       p++;
+                               }
+                       }
+                       j = li_total_channels + 1;
+               }
+       }
+       plci->li_write_channel = j;
+       if (p != plci->internal_req_buffer)
+       {
+               plci->NData[0].P = plci->internal_req_buffer;
+               plci->NData[0].PLength = p - plci->internal_req_buffer;
+               plci->NL.X = plci->NData;
+               plci->NL.ReqCh = 0;
+               plci->NL.Req = plci->nl_req = (byte) N_UDATA;
+               plci->adapter->request(&plci->NL);
+       }
+       return (true);
+}
+
+
+static void mixer_notify_update(PLCI *plci, byte others)
+{
+       DIVA_CAPI_ADAPTER *a;
+       word i, w;
+       PLCI *notify_plci;
+       byte msg[sizeof(CAPI_MSG_HEADER) + 6];
+
+       dbug(1, dprintf("[%06lx] %s,%d: mixer_notify_update %d",
+                       (dword)((plci->Id << 8) | UnMapController(plci->adapter->Id)),
+                       (char *)(FILE_), __LINE__, others));
+
+       a = plci->adapter;
+       if (a->profile.Global_Options & GL_LINE_INTERCONNECT_SUPPORTED)
+       {
+               if (others)
+                       plci->li_notify_update = true;
+               i = 0;
+               do
+               {
+                       notify_plci = NULL;
+                       if (others)
+                       {
+                               while ((i < li_total_channels) && (li_config_table[i].plci == NULL))
+                                       i++;
+                               if (i < li_total_channels)
+                                       notify_plci = li_config_table[i++].plci;
+                       }
+                       else
+                       {
+                               if ((plci->li_bchannel_id != 0)
+                                   && (li_config_table[a->li_base + (plci->li_bchannel_id - 1)].plci == plci))
+                               {
+                                       notify_plci = plci;
+                               }
+                       }
+                       if ((notify_plci != NULL)
+                           && !notify_plci->li_notify_update
+                           && (notify_plci->appl != NULL)
+                           && (notify_plci->State)
+                           && notify_plci->NL.Id && !notify_plci->nl_remove_id)
+                       {
+                               notify_plci->li_notify_update = true;
+                               ((CAPI_MSG *) msg)->header.length = 18;
+                               ((CAPI_MSG *) msg)->header.appl_id = notify_plci->appl->Id;
+                               ((CAPI_MSG *) msg)->header.command = _FACILITY_R;
+                               ((CAPI_MSG *) msg)->header.number = 0;
+                               ((CAPI_MSG *) msg)->header.controller = notify_plci->adapter->Id;
+                               ((CAPI_MSG *) msg)->header.plci = notify_plci->Id;
+                               ((CAPI_MSG *) msg)->header.ncci = 0;
+                               ((CAPI_MSG *) msg)->info.facility_req.Selector = SELECTOR_LINE_INTERCONNECT;
+                               ((CAPI_MSG *) msg)->info.facility_req.structs[0] = 3;
+                               PUT_WORD(&(((CAPI_MSG *) msg)->info.facility_req.structs[1]), LI_REQ_SILENT_UPDATE);
+                               ((CAPI_MSG *) msg)->info.facility_req.structs[3] = 0;
+                               w = api_put(notify_plci->appl, (CAPI_MSG *) msg);
+                               if (w != _QUEUE_FULL)
+                               {
+                                       if (w != 0)
+                                       {
+                                               dbug(1, dprintf("[%06lx] %s,%d: Interconnect notify failed %06x %d",
+                                                               (dword)((plci->Id << 8) | UnMapController(plci->adapter->Id)),
+                                                               (char *)(FILE_), __LINE__,
+                                                               (dword)((notify_plci->Id << 8) | UnMapController(notify_plci->adapter->Id)), w));
+                                       }
+                                       notify_plci->li_notify_update = false;
+                               }
+                       }
+               } while (others && (notify_plci != NULL));
+               if (others)
+                       plci->li_notify_update = false;
+       }
+}
+
+
+static void mixer_clear_config(PLCI *plci)
+{
+       DIVA_CAPI_ADAPTER *a;
+       word i, j;
+
+       dbug(1, dprintf("[%06lx] %s,%d: mixer_clear_config",
+                       (dword)((plci->Id << 8) | UnMapController(plci->adapter->Id)),
+                       (char *)(FILE_), __LINE__));
+
+       plci->li_notify_update = false;
+       plci->li_plci_b_write_pos = 0;
+       plci->li_plci_b_read_pos = 0;
+       plci->li_plci_b_req_pos = 0;
+       a = plci->adapter;
+       if ((plci->li_bchannel_id != 0)
+           && (li_config_table[a->li_base + (plci->li_bchannel_id - 1)].plci == plci))
+       {
+               i = a->li_base + (plci->li_bchannel_id - 1);
+               li_config_table[i].curchnl = 0;
+               li_config_table[i].channel = 0;
+               li_config_table[i].chflags = 0;
+               for (j = 0; j < li_total_channels; j++)
+               {
+                       li_config_table[j].flag_table[i] = 0;
+                       li_config_table[i].flag_table[j] = 0;
+                       li_config_table[i].coef_table[j] = 0;
+                       li_config_table[j].coef_table[i] = 0;
+               }
+               if (!a->li_pri)
+               {
+                       li_config_table[i].coef_table[i] |= LI_COEF_CH_PC_SET | LI_COEF_PC_CH_SET;
+                       if ((plci->tel == ADV_VOICE) && (plci == a->AdvSignalPLCI))
+                       {
+                               i = a->li_base + MIXER_IC_CHANNEL_BASE + (plci->li_bchannel_id - 1);
+                               li_config_table[i].curchnl = 0;
+                               li_config_table[i].channel = 0;
+                               li_config_table[i].chflags = 0;
+                               for (j = 0; j < li_total_channels; j++)
+                               {
+                                       li_config_table[i].flag_table[j] = 0;
+                                       li_config_table[j].flag_table[i] = 0;
+                                       li_config_table[i].coef_table[j] = 0;
+                                       li_config_table[j].coef_table[i] = 0;
+                               }
+                               if (a->manufacturer_features & MANUFACTURER_FEATURE_SLAVE_CODEC)
+                               {
+                                       i = a->li_base + MIXER_IC_CHANNEL_BASE + (2 - plci->li_bchannel_id);
+                                       li_config_table[i].curchnl = 0;
+                                       li_config_table[i].channel = 0;
+                                       li_config_table[i].chflags = 0;
+                                       for (j = 0; j < li_total_channels; j++)
+                                       {
+                                               li_config_table[i].flag_table[j] = 0;
+                                               li_config_table[j].flag_table[i] = 0;
+                                               li_config_table[i].coef_table[j] = 0;
+                                               li_config_table[j].coef_table[i] = 0;
+                                       }
+                               }
+                       }
+               }
+       }
+}
+
+
+static void mixer_prepare_switch(dword Id, PLCI *plci)
+{
+
+       dbug(1, dprintf("[%06lx] %s,%d: mixer_prepare_switch",
+                       UnMapId(Id), (char *)(FILE_), __LINE__));
+
+       do
+       {
+               mixer_indication_coefs_set(Id, plci);
+       } while (plci->li_plci_b_read_pos != plci->li_plci_b_req_pos);
+}
+
+
+static word mixer_save_config(dword Id, PLCI *plci, byte Rc)
+{
+       DIVA_CAPI_ADAPTER *a;
+       word i, j;
+
+       dbug(1, dprintf("[%06lx] %s,%d: mixer_save_config %02x %d",
+                       UnMapId(Id), (char *)(FILE_), __LINE__, Rc, plci->adjust_b_state));
+
+       a = plci->adapter;
+       if ((plci->li_bchannel_id != 0)
+           && (li_config_table[a->li_base + (plci->li_bchannel_id - 1)].plci == plci))
+       {
+               i = a->li_base + (plci->li_bchannel_id - 1);
+               for (j = 0; j < li_total_channels; j++)
+               {
+                       li_config_table[i].coef_table[j] &= 0xf;
+                       li_config_table[j].coef_table[i] &= 0xf;
+               }
+               if (!a->li_pri)
+                       li_config_table[i].coef_table[i] |= LI_COEF_CH_PC_SET | LI_COEF_PC_CH_SET;
+       }
+       return (GOOD);
+}
+
+
+static word mixer_restore_config(dword Id, PLCI *plci, byte Rc)
+{
+       DIVA_CAPI_ADAPTER *a;
+       word Info;
+
+       dbug(1, dprintf("[%06lx] %s,%d: mixer_restore_config %02x %d",
+                       UnMapId(Id), (char *)(FILE_), __LINE__, Rc, plci->adjust_b_state));
+
+       Info = GOOD;
+       a = plci->adapter;
+       if ((plci->B1_facilities & B1_FACILITY_MIXER)
+           && (plci->li_bchannel_id != 0)
+           && (li_config_table[a->li_base + (plci->li_bchannel_id - 1)].plci == plci))
+       {
+               switch (plci->adjust_b_state)
+               {
+               case ADJUST_B_RESTORE_MIXER_1:
+                       if (a->manufacturer_features & MANUFACTURER_FEATURE_XCONNECT)
+                       {
+                               plci->internal_command = plci->adjust_b_command;
+                               if (plci_nl_busy(plci))
+                               {
+                                       plci->adjust_b_state = ADJUST_B_RESTORE_MIXER_1;
+                                       break;
+                               }
+                               xconnect_query_addresses(plci);
+                               plci->adjust_b_state = ADJUST_B_RESTORE_MIXER_2;
+                               break;
+                       }
+                       plci->adjust_b_state = ADJUST_B_RESTORE_MIXER_5;
+                       Rc = OK;
+               case ADJUST_B_RESTORE_MIXER_2:
+               case ADJUST_B_RESTORE_MIXER_3:
+               case ADJUST_B_RESTORE_MIXER_4:
+                       if ((Rc != OK) && (Rc != OK_FC) && (Rc != 0))
+                       {
+                               dbug(1, dprintf("[%06lx] %s,%d: Adjust B query addresses failed %02x",
+                                               UnMapId(Id), (char *)(FILE_), __LINE__, Rc));
+                               Info = _WRONG_STATE;
+                               break;
+                       }
+                       if (Rc == OK)
+                       {
+                               if (plci->adjust_b_state == ADJUST_B_RESTORE_MIXER_2)
+                                       plci->adjust_b_state = ADJUST_B_RESTORE_MIXER_3;
+                               else if (plci->adjust_b_state == ADJUST_B_RESTORE_MIXER_4)
+                                       plci->adjust_b_state = ADJUST_B_RESTORE_MIXER_5;
+                       }
+                       else if (Rc == 0)
+                       {
+                               if (plci->adjust_b_state == ADJUST_B_RESTORE_MIXER_2)
+                                       plci->adjust_b_state = ADJUST_B_RESTORE_MIXER_4;
+                               else if (plci->adjust_b_state == ADJUST_B_RESTORE_MIXER_3)
+                                       plci->adjust_b_state = ADJUST_B_RESTORE_MIXER_5;
+                       }
+                       if (plci->adjust_b_state != ADJUST_B_RESTORE_MIXER_5)
+                       {
+                               plci->internal_command = plci->adjust_b_command;
+                               break;
+                       }
+               case ADJUST_B_RESTORE_MIXER_5:
+                       xconnect_write_coefs(plci, plci->adjust_b_command);
+                       plci->adjust_b_state = ADJUST_B_RESTORE_MIXER_6;
+                       Rc = OK;
+               case ADJUST_B_RESTORE_MIXER_6:
+                       if (!xconnect_write_coefs_process(Id, plci, Rc))
+                       {
+                               dbug(1, dprintf("[%06lx] %s,%d: Write mixer coefs failed",
+                                               UnMapId(Id), (char *)(FILE_), __LINE__));
+                               Info = _FACILITY_NOT_SUPPORTED;
+                               break;
+                       }
+                       if (plci->internal_command)
+                               break;
+                       plci->adjust_b_state = ADJUST_B_RESTORE_MIXER_7;
+               case ADJUST_B_RESTORE_MIXER_7:
+                       break;
+               }
+       }
+       return (Info);
+}
+
+
+static void mixer_command(dword Id, PLCI *plci, byte Rc)
+{
+       DIVA_CAPI_ADAPTER *a;
+       word i, internal_command;
+
+       dbug(1, dprintf("[%06lx] %s,%d: mixer_command %02x %04x %04x",
+                       UnMapId(Id), (char *)(FILE_), __LINE__, Rc, plci->internal_command,
+                       plci->li_cmd));
+
+       a = plci->adapter;
+       internal_command = plci->internal_command;
+       plci->internal_command = 0;
+       switch (plci->li_cmd)
+       {
+       case LI_REQ_CONNECT:
+       case LI_REQ_DISCONNECT:
+       case LI_REQ_SILENT_UPDATE:
+               switch (internal_command)
+               {
+               default:
+                       if (plci->li_channel_bits & LI_CHANNEL_INVOLVED)
+                       {
+                               adjust_b1_resource(Id, plci, NULL, (word)(plci->B1_facilities |
+                                                                         B1_FACILITY_MIXER), MIXER_COMMAND_1);
+                       }
+               case MIXER_COMMAND_1:
+                       if (plci->li_channel_bits & LI_CHANNEL_INVOLVED)
+                       {
+                               if (adjust_b_process(Id, plci, Rc) != GOOD)
+                               {
+                                       dbug(1, dprintf("[%06lx] %s,%d: Load mixer failed",
+                                                       UnMapId(Id), (char *)(FILE_), __LINE__));
+                                       break;
+                               }
+                               if (plci->internal_command)
+                                       return;
+                       }
+                       plci->li_plci_b_req_pos = plci->li_plci_b_write_pos;
+                       if ((plci->li_channel_bits & LI_CHANNEL_INVOLVED)
+                           || ((get_b1_facilities(plci, plci->B1_resource) & B1_FACILITY_MIXER)
+                               && (add_b1_facilities(plci, plci->B1_resource, (word)(plci->B1_facilities &
+                                                                                     ~B1_FACILITY_MIXER)) == plci->B1_resource)))
+                       {
+                               xconnect_write_coefs(plci, MIXER_COMMAND_2);
+                       }
+                       else
+                       {
+                               do
+                               {
+                                       mixer_indication_coefs_set(Id, plci);
+                               } while (plci->li_plci_b_read_pos != plci->li_plci_b_req_pos);
+                       }
+               case MIXER_COMMAND_2:
+                       if ((plci->li_channel_bits & LI_CHANNEL_INVOLVED)
+                           || ((get_b1_facilities(plci, plci->B1_resource) & B1_FACILITY_MIXER)
+                               && (add_b1_facilities(plci, plci->B1_resource, (word)(plci->B1_facilities &
+                                                                                     ~B1_FACILITY_MIXER)) == plci->B1_resource)))
+                       {
+                               if (!xconnect_write_coefs_process(Id, plci, Rc))
+                               {
+                                       dbug(1, dprintf("[%06lx] %s,%d: Write mixer coefs failed",
+                                                       UnMapId(Id), (char *)(FILE_), __LINE__));
+                                       if (plci->li_plci_b_write_pos != plci->li_plci_b_req_pos)
+                                       {
+                                               do
+                                               {
+                                                       plci->li_plci_b_write_pos = (plci->li_plci_b_write_pos == 0) ?
+                                                               LI_PLCI_B_QUEUE_ENTRIES - 1 : plci->li_plci_b_write_pos - 1;
+                                                       i = (plci->li_plci_b_write_pos == 0) ?
+                                                               LI_PLCI_B_QUEUE_ENTRIES - 1 : plci->li_plci_b_write_pos - 1;
+                                               } while ((plci->li_plci_b_write_pos != plci->li_plci_b_req_pos)
+                                                        && !(plci->li_plci_b_queue[i] & LI_PLCI_B_LAST_FLAG));
+                                       }
+                                       break;
+                               }
+                               if (plci->internal_command)
+                                       return;
+                       }
+                       if (!(plci->li_channel_bits & LI_CHANNEL_INVOLVED))
+                       {
+                               adjust_b1_resource(Id, plci, NULL, (word)(plci->B1_facilities &
+                                                                         ~B1_FACILITY_MIXER), MIXER_COMMAND_3);
+                       }
+               case MIXER_COMMAND_3:
+                       if (!(plci->li_channel_bits & LI_CHANNEL_INVOLVED))
+                       {
+                               if (adjust_b_process(Id, plci, Rc) != GOOD)
+                               {
+                                       dbug(1, dprintf("[%06lx] %s,%d: Unload mixer failed",
+                                                       UnMapId(Id), (char *)(FILE_), __LINE__));
+                                       break;
+                               }
+                               if (plci->internal_command)
+                                       return;
+                       }
+                       break;
+               }
+               break;
+       }
+       if ((plci->li_bchannel_id == 0)
+           || (li_config_table[a->li_base + (plci->li_bchannel_id - 1)].plci != plci))
+       {
+               dbug(1, dprintf("[%06x] %s,%d: Channel id wiped out %d",
+                               UnMapId(Id), (char *)(FILE_), __LINE__, (int)(plci->li_bchannel_id)));
+       }
+       else
+       {
+               i = a->li_base + (plci->li_bchannel_id - 1);
+               li_config_table[i].curchnl = plci->li_channel_bits;
+               if (!a->li_pri && (plci->tel == ADV_VOICE) && (plci == a->AdvSignalPLCI))
+               {
+                       i = a->li_base + MIXER_IC_CHANNEL_BASE + (plci->li_bchannel_id - 1);
+                       li_config_table[i].curchnl = plci->li_channel_bits;
+                       if (a->manufacturer_features & MANUFACTURER_FEATURE_SLAVE_CODEC)
+                       {
+                               i = a->li_base + MIXER_IC_CHANNEL_BASE + (2 - plci->li_bchannel_id);
+                               li_config_table[i].curchnl = plci->li_channel_bits;
+                       }
+               }
+       }
+}
+
+
+static void li_update_connect(dword Id, DIVA_CAPI_ADAPTER *a, PLCI *plci,
+                             dword plci_b_id, byte connect, dword li_flags)
+{
+       word i, ch_a, ch_a_v, ch_a_s, ch_b, ch_b_v, ch_b_s;
+       PLCI *plci_b;
+       DIVA_CAPI_ADAPTER *a_b;
+
+       a_b = &(adapter[MapController((byte)(plci_b_id & 0x7f)) - 1]);
+       plci_b = &(a_b->plci[((plci_b_id >> 8) & 0xff) - 1]);
+       ch_a = a->li_base + (plci->li_bchannel_id - 1);
+       if (!a->li_pri && (plci->tel == ADV_VOICE)
+           && (plci == a->AdvSignalPLCI) && (Id & EXT_CONTROLLER))
+       {
+               ch_a_v = ch_a + MIXER_IC_CHANNEL_BASE;
+               ch_a_s = (a->manufacturer_features & MANUFACTURER_FEATURE_SLAVE_CODEC) ?
+                       a->li_base + MIXER_IC_CHANNEL_BASE + (2 - plci->li_bchannel_id) : ch_a_v;
+       }
+       else
+       {
+               ch_a_v = ch_a;
+               ch_a_s = ch_a;
+       }
+       ch_b = a_b->li_base + (plci_b->li_bchannel_id - 1);
+       if (!a_b->li_pri && (plci_b->tel == ADV_VOICE)
+           && (plci_b == a_b->AdvSignalPLCI) && (plci_b_id & EXT_CONTROLLER))
+       {
+               ch_b_v = ch_b + MIXER_IC_CHANNEL_BASE;
+               ch_b_s = (a_b->manufacturer_features & MANUFACTURER_FEATURE_SLAVE_CODEC) ?
+                       a_b->li_base + MIXER_IC_CHANNEL_BASE + (2 - plci_b->li_bchannel_id) : ch_b_v;
+       }
+       else
+       {
+               ch_b_v = ch_b;
+               ch_b_s = ch_b;
+       }
+       if (connect)
+       {
+               li_config_table[ch_a].flag_table[ch_a_v] &= ~LI_FLAG_MONITOR;
+               li_config_table[ch_a].flag_table[ch_a_s] &= ~LI_FLAG_MONITOR;
+               li_config_table[ch_a_v].flag_table[ch_a] &= ~(LI_FLAG_ANNOUNCEMENT | LI_FLAG_MIX);
+               li_config_table[ch_a_s].flag_table[ch_a] &= ~(LI_FLAG_ANNOUNCEMENT | LI_FLAG_MIX);
+       }
+       li_config_table[ch_a].flag_table[ch_b_v] &= ~LI_FLAG_MONITOR;
+       li_config_table[ch_a].flag_table[ch_b_s] &= ~LI_FLAG_MONITOR;
+       li_config_table[ch_b_v].flag_table[ch_a] &= ~(LI_FLAG_ANNOUNCEMENT | LI_FLAG_MIX);
+       li_config_table[ch_b_s].flag_table[ch_a] &= ~(LI_FLAG_ANNOUNCEMENT | LI_FLAG_MIX);
+       if (ch_a_v == ch_b_v)
+       {
+               li_config_table[ch_a_v].flag_table[ch_b_v] &= ~LI_FLAG_CONFERENCE;
+               li_config_table[ch_a_s].flag_table[ch_b_s] &= ~LI_FLAG_CONFERENCE;
+       }
+       else
+       {
+               if (li_config_table[ch_a_v].flag_table[ch_b_v] & LI_FLAG_CONFERENCE)
+               {
+                       for (i = 0; i < li_total_channels; i++)
+                       {
+                               if (i != ch_a_v)
+                                       li_config_table[ch_a_v].flag_table[i] &= ~LI_FLAG_CONFERENCE;
+                       }
+               }
+               if (li_config_table[ch_a_s].flag_table[ch_b_v] & LI_FLAG_CONFERENCE)
+               {
+                       for (i = 0; i < li_total_channels; i++)
+                       {
+                               if (i != ch_a_s)
+                                       li_config_table[ch_a_s].flag_table[i] &= ~LI_FLAG_CONFERENCE;
+                       }
+               }
+               if (li_config_table[ch_b_v].flag_table[ch_a_v] & LI_FLAG_CONFERENCE)
+               {
+                       for (i = 0; i < li_total_channels; i++)
+                       {
+                               if (i != ch_a_v)
+                                       li_config_table[i].flag_table[ch_a_v] &= ~LI_FLAG_CONFERENCE;
+                       }
+               }
+               if (li_config_table[ch_b_v].flag_table[ch_a_s] & LI_FLAG_CONFERENCE)
+               {
+                       for (i = 0; i < li_total_channels; i++)
+                       {
+                               if (i != ch_a_s)
+                                       li_config_table[i].flag_table[ch_a_s] &= ~LI_FLAG_CONFERENCE;
+                       }
+               }
+       }
+       if (li_flags & LI_FLAG_CONFERENCE_A_B)
+       {
+               li_config_table[ch_b_v].flag_table[ch_a_v] |= LI_FLAG_CONFERENCE;
+               li_config_table[ch_b_s].flag_table[ch_a_v] |= LI_FLAG_CONFERENCE;
+               li_config_table[ch_b_v].flag_table[ch_a_s] |= LI_FLAG_CONFERENCE;
+               li_config_table[ch_b_s].flag_table[ch_a_s] |= LI_FLAG_CONFERENCE;
+       }
+       if (li_flags & LI_FLAG_CONFERENCE_B_A)
+       {
+               li_config_table[ch_a_v].flag_table[ch_b_v] |= LI_FLAG_CONFERENCE;
+               li_config_table[ch_a_v].flag_table[ch_b_s] |= LI_FLAG_CONFERENCE;
+               li_config_table[ch_a_s].flag_table[ch_b_v] |= LI_FLAG_CONFERENCE;
+               li_config_table[ch_a_s].flag_table[ch_b_s] |= LI_FLAG_CONFERENCE;
+       }
+       if (li_flags & LI_FLAG_MONITOR_A)
+       {
+               li_config_table[ch_a].flag_table[ch_a_v] |= LI_FLAG_MONITOR;
+               li_config_table[ch_a].flag_table[ch_a_s] |= LI_FLAG_MONITOR;
+       }
+       if (li_flags & LI_FLAG_MONITOR_B)
+       {
+               li_config_table[ch_a].flag_table[ch_b_v] |= LI_FLAG_MONITOR;
+               li_config_table[ch_a].flag_table[ch_b_s] |= LI_FLAG_MONITOR;
+       }
+       if (li_flags & LI_FLAG_ANNOUNCEMENT_A)
+       {
+               li_config_table[ch_a_v].flag_table[ch_a] |= LI_FLAG_ANNOUNCEMENT;
+               li_config_table[ch_a_s].flag_table[ch_a] |= LI_FLAG_ANNOUNCEMENT;
+       }
+       if (li_flags & LI_FLAG_ANNOUNCEMENT_B)
+       {
+               li_config_table[ch_b_v].flag_table[ch_a] |= LI_FLAG_ANNOUNCEMENT;
+               li_config_table[ch_b_s].flag_table[ch_a] |= LI_FLAG_ANNOUNCEMENT;
+       }
+       if (li_flags & LI_FLAG_MIX_A)
+       {
+               li_config_table[ch_a_v].flag_table[ch_a] |= LI_FLAG_MIX;
+               li_config_table[ch_a_s].flag_table[ch_a] |= LI_FLAG_MIX;
+       }
+       if (li_flags & LI_FLAG_MIX_B)
+       {
+               li_config_table[ch_b_v].flag_table[ch_a] |= LI_FLAG_MIX;
+               li_config_table[ch_b_s].flag_table[ch_a] |= LI_FLAG_MIX;
+       }
+       if (ch_a_v != ch_a_s)
+       {
+               li_config_table[ch_a_v].flag_table[ch_a_s] |= LI_FLAG_CONFERENCE;
+               li_config_table[ch_a_s].flag_table[ch_a_v] |= LI_FLAG_CONFERENCE;
+       }
+       if (ch_b_v != ch_b_s)
+       {
+               li_config_table[ch_b_v].flag_table[ch_b_s] |= LI_FLAG_CONFERENCE;
+               li_config_table[ch_b_s].flag_table[ch_b_v] |= LI_FLAG_CONFERENCE;
+       }
+}
+
+
+static void li2_update_connect(dword Id, DIVA_CAPI_ADAPTER *a, PLCI *plci,
+                              dword plci_b_id, byte connect, dword li_flags)
+{
+       word ch_a, ch_a_v, ch_a_s, ch_b, ch_b_v, ch_b_s;
+       PLCI *plci_b;
+       DIVA_CAPI_ADAPTER *a_b;
+
+       a_b = &(adapter[MapController((byte)(plci_b_id & 0x7f)) - 1]);
+       plci_b = &(a_b->plci[((plci_b_id >> 8) & 0xff) - 1]);
+       ch_a = a->li_base + (plci->li_bchannel_id - 1);
+       if (!a->li_pri && (plci->tel == ADV_VOICE)
+           && (plci == a->AdvSignalPLCI) && (Id & EXT_CONTROLLER))
+       {
+               ch_a_v = ch_a + MIXER_IC_CHANNEL_BASE;
+               ch_a_s = (a->manufacturer_features & MANUFACTURER_FEATURE_SLAVE_CODEC) ?
+                       a->li_base + MIXER_IC_CHANNEL_BASE + (2 - plci->li_bchannel_id) : ch_a_v;
+       }
+       else
+       {
+               ch_a_v = ch_a;
+               ch_a_s = ch_a;
+       }
+       ch_b = a_b->li_base + (plci_b->li_bchannel_id - 1);
+       if (!a_b->li_pri && (plci_b->tel == ADV_VOICE)
+           && (plci_b == a_b->AdvSignalPLCI) && (plci_b_id & EXT_CONTROLLER))
+       {
+               ch_b_v = ch_b + MIXER_IC_CHANNEL_BASE;
+               ch_b_s = (a_b->manufacturer_features & MANUFACTURER_FEATURE_SLAVE_CODEC) ?
+                       a_b->li_base + MIXER_IC_CHANNEL_BASE + (2 - plci_b->li_bchannel_id) : ch_b_v;
+       }
+       else
+       {
+               ch_b_v = ch_b;
+               ch_b_s = ch_b;
+       }
+       if (connect)
+       {
+               li_config_table[ch_b].flag_table[ch_b_v] &= ~LI_FLAG_MONITOR;
+               li_config_table[ch_b].flag_table[ch_b_s] &= ~LI_FLAG_MONITOR;
+               li_config_table[ch_b_v].flag_table[ch_b] &= ~LI_FLAG_MIX;
+               li_config_table[ch_b_s].flag_table[ch_b] &= ~LI_FLAG_MIX;
+               li_config_table[ch_b].flag_table[ch_b] &= ~LI_FLAG_PCCONNECT;
+               li_config_table[ch_b].chflags &= ~(LI_CHFLAG_MONITOR | LI_CHFLAG_MIX | LI_CHFLAG_LOOP);
+       }
+       li_config_table[ch_b_v].flag_table[ch_a_v] &= ~(LI_FLAG_INTERCONNECT | LI_FLAG_CONFERENCE);
+       li_config_table[ch_b_s].flag_table[ch_a_v] &= ~(LI_FLAG_INTERCONNECT | LI_FLAG_CONFERENCE);
+       li_config_table[ch_b_v].flag_table[ch_a_s] &= ~(LI_FLAG_INTERCONNECT | LI_FLAG_CONFERENCE);
+       li_config_table[ch_b_s].flag_table[ch_a_s] &= ~(LI_FLAG_INTERCONNECT | LI_FLAG_CONFERENCE);
+       li_config_table[ch_a_v].flag_table[ch_b_v] &= ~(LI_FLAG_INTERCONNECT | LI_FLAG_CONFERENCE);
+       li_config_table[ch_a_v].flag_table[ch_b_s] &= ~(LI_FLAG_INTERCONNECT | LI_FLAG_CONFERENCE);
+       li_config_table[ch_a_s].flag_table[ch_b_v] &= ~(LI_FLAG_INTERCONNECT | LI_FLAG_CONFERENCE);
+       li_config_table[ch_a_s].flag_table[ch_b_s] &= ~(LI_FLAG_INTERCONNECT | LI_FLAG_CONFERENCE);
+       if (li_flags & LI2_FLAG_INTERCONNECT_A_B)
+       {
+               li_config_table[ch_b_v].flag_table[ch_a_v] |= LI_FLAG_INTERCONNECT;
+               li_config_table[ch_b_s].flag_table[ch_a_v] |= LI_FLAG_INTERCONNECT;
+               li_config_table[ch_b_v].flag_table[ch_a_s] |= LI_FLAG_INTERCONNECT;
+               li_config_table[ch_b_s].flag_table[ch_a_s] |= LI_FLAG_INTERCONNECT;
+       }
+       if (li_flags & LI2_FLAG_INTERCONNECT_B_A)
+       {
+               li_config_table[ch_a_v].flag_table[ch_b_v] |= LI_FLAG_INTERCONNECT;
+               li_config_table[ch_a_v].flag_table[ch_b_s] |= LI_FLAG_INTERCONNECT;
+               li_config_table[ch_a_s].flag_table[ch_b_v] |= LI_FLAG_INTERCONNECT;
+               li_config_table[ch_a_s].flag_table[ch_b_s] |= LI_FLAG_INTERCONNECT;
+       }
+       if (li_flags & LI2_FLAG_MONITOR_B)
+       {
+               li_config_table[ch_b].flag_table[ch_b_v] |= LI_FLAG_MONITOR;
+               li_config_table[ch_b].flag_table[ch_b_s] |= LI_FLAG_MONITOR;
+       }
+       if (li_flags & LI2_FLAG_MIX_B)
+       {
+               li_config_table[ch_b_v].flag_table[ch_b] |= LI_FLAG_MIX;
+               li_config_table[ch_b_s].flag_table[ch_b] |= LI_FLAG_MIX;
+       }
+       if (li_flags & LI2_FLAG_MONITOR_X)
+               li_config_table[ch_b].chflags |= LI_CHFLAG_MONITOR;
+       if (li_flags & LI2_FLAG_MIX_X)
+               li_config_table[ch_b].chflags |= LI_CHFLAG_MIX;
+       if (li_flags & LI2_FLAG_LOOP_B)
+       {
+               li_config_table[ch_b_v].flag_table[ch_b_v] |= LI_FLAG_INTERCONNECT;
+               li_config_table[ch_b_s].flag_table[ch_b_v] |= LI_FLAG_INTERCONNECT;
+               li_config_table[ch_b_v].flag_table[ch_b_s] |= LI_FLAG_INTERCONNECT;
+               li_config_table[ch_b_s].flag_table[ch_b_s] |= LI_FLAG_INTERCONNECT;
+       }
+       if (li_flags & LI2_FLAG_LOOP_PC)
+               li_config_table[ch_b].flag_table[ch_b] |= LI_FLAG_PCCONNECT;
+       if (li_flags & LI2_FLAG_LOOP_X)
+               li_config_table[ch_b].chflags |= LI_CHFLAG_LOOP;
+       if (li_flags & LI2_FLAG_PCCONNECT_A_B)
+               li_config_table[ch_b_s].flag_table[ch_a_s] |= LI_FLAG_PCCONNECT;
+       if (li_flags & LI2_FLAG_PCCONNECT_B_A)
+               li_config_table[ch_a_s].flag_table[ch_b_s] |= LI_FLAG_PCCONNECT;
+       if (ch_a_v != ch_a_s)
+       {
+               li_config_table[ch_a_v].flag_table[ch_a_s] |= LI_FLAG_CONFERENCE;
+               li_config_table[ch_a_s].flag_table[ch_a_v] |= LI_FLAG_CONFERENCE;
+       }
+       if (ch_b_v != ch_b_s)
+       {
+               li_config_table[ch_b_v].flag_table[ch_b_s] |= LI_FLAG_CONFERENCE;
+               li_config_table[ch_b_s].flag_table[ch_b_v] |= LI_FLAG_CONFERENCE;
+       }
+}
+
+
+static word li_check_main_plci(dword Id, PLCI *plci)
+{
+       if (plci == NULL)
+       {
+               dbug(1, dprintf("[%06lx] %s,%d: Wrong PLCI",
+                               UnMapId(Id), (char *)(FILE_), __LINE__));
+               return (_WRONG_IDENTIFIER);
+       }
+       if (!plci->State
+           || !plci->NL.Id || plci->nl_remove_id
+           || (plci->li_bchannel_id == 0))
+       {
+               dbug(1, dprintf("[%06lx] %s,%d: Wrong state",
+                               UnMapId(Id), (char *)(FILE_), __LINE__));
+               return (_WRONG_STATE);
+       }
+       li_config_table[plci->adapter->li_base + (plci->li_bchannel_id - 1)].plci = plci;
+       return (GOOD);
+}
+
+
+static PLCI *li_check_plci_b(dword Id, PLCI *plci,
+                            dword plci_b_id, word plci_b_write_pos, byte *p_result)
+{
+       byte ctlr_b;
+       PLCI *plci_b;
+
+       if (((plci->li_plci_b_read_pos > plci_b_write_pos) ? plci->li_plci_b_read_pos :
+            LI_PLCI_B_QUEUE_ENTRIES + plci->li_plci_b_read_pos) - plci_b_write_pos - 1 < 2)
+       {
+               dbug(1, dprintf("[%06lx] %s,%d: LI request overrun",
+                               UnMapId(Id), (char *)(FILE_), __LINE__));
+               PUT_WORD(p_result, _REQUEST_NOT_ALLOWED_IN_THIS_STATE);
+               return (NULL);
+       }
+       ctlr_b = 0;
+       if ((plci_b_id & 0x7f) != 0)
+       {
+               ctlr_b = MapController((byte)(plci_b_id & 0x7f));
+               if ((ctlr_b > max_adapter) || ((ctlr_b != 0) && (adapter[ctlr_b - 1].request == NULL)))
+                       ctlr_b = 0;
+       }
+       if ((ctlr_b == 0)
+           || (((plci_b_id >> 8) & 0xff) == 0)
+           || (((plci_b_id >> 8) & 0xff) > adapter[ctlr_b - 1].max_plci))
+       {
+               dbug(1, dprintf("[%06lx] %s,%d: LI invalid second PLCI %08lx",
+                               UnMapId(Id), (char *)(FILE_), __LINE__, plci_b_id));
+               PUT_WORD(p_result, _WRONG_IDENTIFIER);
+               return (NULL);
+       }
+       plci_b = &(adapter[ctlr_b - 1].plci[((plci_b_id >> 8) & 0xff) - 1]);
+       if (!plci_b->State
+           || !plci_b->NL.Id || plci_b->nl_remove_id
+           || (plci_b->li_bchannel_id == 0))
+       {
+               dbug(1, dprintf("[%06lx] %s,%d: LI peer in wrong state %08lx",
+                               UnMapId(Id), (char *)(FILE_), __LINE__, plci_b_id));
+               PUT_WORD(p_result, _REQUEST_NOT_ALLOWED_IN_THIS_STATE);
+               return (NULL);
+       }
+       li_config_table[plci_b->adapter->li_base + (plci_b->li_bchannel_id - 1)].plci = plci_b;
+       if (((byte)(plci_b_id & ~EXT_CONTROLLER)) !=
+           ((byte)(UnMapController(plci->adapter->Id) & ~EXT_CONTROLLER))
+           && (!(plci->adapter->manufacturer_features & MANUFACTURER_FEATURE_XCONNECT)
+               || !(plci_b->adapter->manufacturer_features & MANUFACTURER_FEATURE_XCONNECT)))
+       {
+               dbug(1, dprintf("[%06lx] %s,%d: LI not on same ctrl %08lx",
+                               UnMapId(Id), (char *)(FILE_), __LINE__, plci_b_id));
+               PUT_WORD(p_result, _WRONG_IDENTIFIER);
+               return (NULL);
+       }
+       if (!(get_b1_facilities(plci_b, add_b1_facilities(plci_b, plci_b->B1_resource,
+                                                         (word)(plci_b->B1_facilities | B1_FACILITY_MIXER))) & B1_FACILITY_MIXER))
+       {
+               dbug(1, dprintf("[%06lx] %s,%d: Interconnect peer cannot mix %d",
+                               UnMapId(Id), (char *)(FILE_), __LINE__, plci_b->B1_resource));
+               PUT_WORD(p_result, _REQUEST_NOT_ALLOWED_IN_THIS_STATE);
+               return (NULL);
+       }
+       return (plci_b);
+}
+
+
+static PLCI *li2_check_plci_b(dword Id, PLCI *plci,
+                             dword plci_b_id, word plci_b_write_pos, byte *p_result)
+{
+       byte ctlr_b;
+       PLCI *plci_b;
+
+       if (((plci->li_plci_b_read_pos > plci_b_write_pos) ? plci->li_plci_b_read_pos :
+            LI_PLCI_B_QUEUE_ENTRIES + plci->li_plci_b_read_pos) - plci_b_write_pos - 1 < 2)
+       {
+               dbug(1, dprintf("[%06lx] %s,%d: LI request overrun",
+                               UnMapId(Id), (char *)(FILE_), __LINE__));
+               PUT_WORD(p_result, _WRONG_STATE);
+               return (NULL);
+       }
+       ctlr_b = 0;
+       if ((plci_b_id & 0x7f) != 0)
+       {
+               ctlr_b = MapController((byte)(plci_b_id & 0x7f));
+               if ((ctlr_b > max_adapter) || ((ctlr_b != 0) && (adapter[ctlr_b - 1].request == NULL)))
+                       ctlr_b = 0;
+       }
+       if ((ctlr_b == 0)
+           || (((plci_b_id >> 8) & 0xff) == 0)
+           || (((plci_b_id >> 8) & 0xff) > adapter[ctlr_b - 1].max_plci))
+       {
+               dbug(1, dprintf("[%06lx] %s,%d: LI invalid second PLCI %08lx",
+                               UnMapId(Id), (char *)(FILE_), __LINE__, plci_b_id));
+               PUT_WORD(p_result, _WRONG_IDENTIFIER);
+               return (NULL);
+       }
+       plci_b = &(adapter[ctlr_b - 1].plci[((plci_b_id >> 8) & 0xff) - 1]);
+       if (!plci_b->State
+           || !plci_b->NL.Id || plci_b->nl_remove_id
+           || (plci_b->li_bchannel_id == 0)
+           || (li_config_table[plci_b->adapter->li_base + (plci_b->li_bchannel_id - 1)].plci != plci_b))
+       {
+               dbug(1, dprintf("[%06lx] %s,%d: LI peer in wrong state %08lx",
+                               UnMapId(Id), (char *)(FILE_), __LINE__, plci_b_id));
+               PUT_WORD(p_result, _WRONG_STATE);
+               return (NULL);
+       }
+       if (((byte)(plci_b_id & ~EXT_CONTROLLER)) !=
+           ((byte)(UnMapController(plci->adapter->Id) & ~EXT_CONTROLLER))
+           && (!(plci->adapter->manufacturer_features & MANUFACTURER_FEATURE_XCONNECT)
+               || !(plci_b->adapter->manufacturer_features & MANUFACTURER_FEATURE_XCONNECT)))
+       {
+               dbug(1, dprintf("[%06lx] %s,%d: LI not on same ctrl %08lx",
+                               UnMapId(Id), (char *)(FILE_), __LINE__, plci_b_id));
+               PUT_WORD(p_result, _WRONG_IDENTIFIER);
+               return (NULL);
+       }
+       if (!(get_b1_facilities(plci_b, add_b1_facilities(plci_b, plci_b->B1_resource,
+                                                         (word)(plci_b->B1_facilities | B1_FACILITY_MIXER))) & B1_FACILITY_MIXER))
+       {
+               dbug(1, dprintf("[%06lx] %s,%d: Interconnect peer cannot mix %d",
+                               UnMapId(Id), (char *)(FILE_), __LINE__, plci_b->B1_resource));
+               PUT_WORD(p_result, _WRONG_STATE);
+               return (NULL);
+       }
+       return (plci_b);
+}
+
+
+static byte mixer_request(dword Id, word Number, DIVA_CAPI_ADAPTER *a, PLCI *plci, APPL   *appl, API_PARSE *msg)
+{
+       word Info;
+       word i;
+       dword d, li_flags, plci_b_id;
+       PLCI *plci_b;
+       API_PARSE li_parms[3];
+       API_PARSE li_req_parms[3];
+       API_PARSE li_participant_struct[2];
+       API_PARSE li_participant_parms[3];
+       word participant_parms_pos;
+       byte result_buffer[32];
+       byte *result;
+       word result_pos;
+       word plci_b_write_pos;
+
+       dbug(1, dprintf("[%06lx] %s,%d: mixer_request",
+                       UnMapId(Id), (char *)(FILE_), __LINE__));
+
+       Info = GOOD;
+       result = result_buffer;
+       result_buffer[0] = 0;
+       if (!(a->profile.Global_Options & GL_LINE_INTERCONNECT_SUPPORTED))
+       {
+               dbug(1, dprintf("[%06lx] %s,%d: Facility not supported",
+                               UnMapId(Id), (char *)(FILE_), __LINE__));
+               Info = _FACILITY_NOT_SUPPORTED;
+       }
+       else if (api_parse(&msg[1].info[1], msg[1].length, "ws", li_parms))
+       {
+               dbug(1, dprintf("[%06lx] %s,%d: Wrong message format",
+                               UnMapId(Id), (char *)(FILE_), __LINE__));
+               Info = _WRONG_MESSAGE_FORMAT;
+       }
+       else
+       {
+               result_buffer[0] = 3;
+               PUT_WORD(&result_buffer[1], GET_WORD(li_parms[0].info));
+               result_buffer[3] = 0;
+               switch (GET_WORD(li_parms[0].info))
+               {
+               case LI_GET_SUPPORTED_SERVICES:
+                       if (appl->appl_flags & APPL_FLAG_OLD_LI_SPEC)
+                       {
+                               result_buffer[0] = 17;
+                               result_buffer[3] = 14;
+                               PUT_WORD(&result_buffer[4], GOOD);
+                               d = 0;
+                               if (a->manufacturer_features & MANUFACTURER_FEATURE_MIXER_CH_CH)
+                                       d |= LI_CONFERENCING_SUPPORTED;
+                               if (a->manufacturer_features & MANUFACTURER_FEATURE_MIXER_CH_PC)
+                                       d |= LI_MONITORING_SUPPORTED;
+                               if (a->manufacturer_features & MANUFACTURER_FEATURE_MIXER_PC_CH)
+                                       d |= LI_ANNOUNCEMENTS_SUPPORTED | LI_MIXING_SUPPORTED;
+                               if (a->manufacturer_features & MANUFACTURER_FEATURE_XCONNECT)
+                                       d |= LI_CROSS_CONTROLLER_SUPPORTED;
+                               PUT_DWORD(&result_buffer[6], d);
+                               if (a->manufacturer_features & MANUFACTURER_FEATURE_XCONNECT)
+                               {
+                                       d = 0;
+                                       for (i = 0; i < li_total_channels; i++)
+                                       {
+                                               if ((li_config_table[i].adapter->manufacturer_features & MANUFACTURER_FEATURE_XCONNECT)
+                                                   && (li_config_table[i].adapter->li_pri
+                                                       || (i < li_config_table[i].adapter->li_base + MIXER_BCHANNELS_BRI)))
+                                               {
+                                                       d++;
+                                               }
+                                       }
+                               }
+                               else
+                               {
+                                       d = a->li_pri ? a->li_channels : MIXER_BCHANNELS_BRI;
+                               }
+                               PUT_DWORD(&result_buffer[10], d / 2);
+                               PUT_DWORD(&result_buffer[14], d);
+                       }
+                       else
+                       {
+                               result_buffer[0] = 25;
+                               result_buffer[3] = 22;
+                               PUT_WORD(&result_buffer[4], GOOD);
+                               d = LI2_ASYMMETRIC_SUPPORTED | LI2_B_LOOPING_SUPPORTED | LI2_X_LOOPING_SUPPORTED;
+                               if (a->manufacturer_features & MANUFACTURER_FEATURE_MIXER_CH_PC)
+                                       d |= LI2_MONITORING_SUPPORTED | LI2_REMOTE_MONITORING_SUPPORTED;
+                               if (a->manufacturer_features & MANUFACTURER_FEATURE_MIXER_PC_CH)
+                                       d |= LI2_MIXING_SUPPORTED | LI2_REMOTE_MIXING_SUPPORTED;
+                               if (a->manufacturer_features & MANUFACTURER_FEATURE_MIXER_PC_PC)
+                                       d |= LI2_PC_LOOPING_SUPPORTED;
+                               if (a->manufacturer_features & MANUFACTURER_FEATURE_XCONNECT)
+                                       d |= LI2_CROSS_CONTROLLER_SUPPORTED;
+                               PUT_DWORD(&result_buffer[6], d);
+                               d = a->li_pri ? a->li_channels : MIXER_BCHANNELS_BRI;
+                               PUT_DWORD(&result_buffer[10], d / 2);
+                               PUT_DWORD(&result_buffer[14], d - 1);
+                               if (a->manufacturer_features & MANUFACTURER_FEATURE_XCONNECT)
+                               {
+                                       d = 0;
+                                       for (i = 0; i < li_total_channels; i++)
+                                       {
+                                               if ((li_config_table[i].adapter->manufacturer_features & MANUFACTURER_FEATURE_XCONNECT)
+                                                   && (li_config_table[i].adapter->li_pri
+                                                       || (i < li_config_table[i].adapter->li_base + MIXER_BCHANNELS_BRI)))
+                                               {
+                                                       d++;
+                                               }
+                                       }
+                               }
+                               PUT_DWORD(&result_buffer[18], d / 2);
+                               PUT_DWORD(&result_buffer[22], d - 1);
+                       }
+                       break;
+
+               case LI_REQ_CONNECT:
+                       if (li_parms[1].length == 8)
+                       {
+                               appl->appl_flags |= APPL_FLAG_OLD_LI_SPEC;
+                               if (api_parse(&li_parms[1].info[1], li_parms[1].length, "dd", li_req_parms))
+                               {
+                                       dbug(1, dprintf("[%06lx] %s,%d: Wrong message format",
+                                                       UnMapId(Id), (char *)(FILE_), __LINE__));
+                                       Info = _WRONG_MESSAGE_FORMAT;
+                                       break;
+                               }
+                               plci_b_id = GET_DWORD(li_req_parms[0].info) & 0xffff;
+                               li_flags = GET_DWORD(li_req_parms[1].info);
+                               Info = li_check_main_plci(Id, plci);
+                               result_buffer[0] = 9;
+                               result_buffer[3] = 6;
+                               PUT_DWORD(&result_buffer[4], plci_b_id);
+                               PUT_WORD(&result_buffer[8], GOOD);
+                               if (Info != GOOD)
+                                       break;
+                               result = plci->saved_msg.info;
+                               for (i = 0; i <= result_buffer[0]; i++)
+                                       result[i] = result_buffer[i];
+                               plci_b_write_pos = plci->li_plci_b_write_pos;
+                               plci_b = li_check_plci_b(Id, plci, plci_b_id, plci_b_write_pos, &result[8]);
+                               if (plci_b == NULL)
+                                       break;
+                               li_update_connect(Id, a, plci, plci_b_id, true, li_flags);
+                               plci->li_plci_b_queue[plci_b_write_pos] = plci_b_id | LI_PLCI_B_LAST_FLAG;
+                               plci_b_write_pos = (plci_b_write_pos == LI_PLCI_B_QUEUE_ENTRIES - 1) ? 0 : plci_b_write_pos + 1;
+                               plci->li_plci_b_write_pos = plci_b_write_pos;
+                       }
+                       else
+                       {
+                               appl->appl_flags &= ~APPL_FLAG_OLD_LI_SPEC;
+                               if (api_parse(&li_parms[1].info[1], li_parms[1].length, "ds", li_req_parms))
+                               {
+                                       dbug(1, dprintf("[%06lx] %s,%d: Wrong message format",
+                                                       UnMapId(Id), (char *)(FILE_), __LINE__));
+                                       Info = _WRONG_MESSAGE_FORMAT;
+                                       break;
+                               }
+                               li_flags = GET_DWORD(li_req_parms[0].info) & ~(LI2_FLAG_INTERCONNECT_A_B | LI2_FLAG_INTERCONNECT_B_A);
+                               Info = li_check_main_plci(Id, plci);
+                               result_buffer[0] = 7;
+                               result_buffer[3] = 4;
+                               PUT_WORD(&result_buffer[4], Info);
+                               result_buffer[6] = 0;
+                               if (Info != GOOD)
+                                       break;
+                               result = plci->saved_msg.info;
+                               for (i = 0; i <= result_buffer[0]; i++)
+                                       result[i] = result_buffer[i];
+                               plci_b_write_pos = plci->li_plci_b_write_pos;
+                               participant_parms_pos = 0;
+                               result_pos = 7;
+                               li2_update_connect(Id, a, plci, UnMapId(Id), true, li_flags);
+                               while (participant_parms_pos < li_req_parms[1].length)
+                               {
+                                       result[result_pos] = 6;
+                                       result_pos += 7;
+                                       PUT_DWORD(&result[result_pos - 6], 0);
+                                       PUT_WORD(&result[result_pos - 2], GOOD);
+                                       if (api_parse(&li_req_parms[1].info[1 + participant_parms_pos],
+                                                     (word)(li_parms[1].length - participant_parms_pos), "s", li_participant_struct))
+                                       {
+                                               dbug(1, dprintf("[%06lx] %s,%d: Wrong message format",
+                                                               UnMapId(Id), (char *)(FILE_), __LINE__));
+                                               PUT_WORD(&result[result_pos - 2], _WRONG_MESSAGE_FORMAT);
+                                               break;
+                                       }
+                                       if (api_parse(&li_participant_struct[0].info[1],
+                                                     li_participant_struct[0].length, "dd", li_participant_parms))
+                                       {
+                                               dbug(1, dprintf("[%06lx] %s,%d: Wrong message format",
+                                                               UnMapId(Id), (char *)(FILE_), __LINE__));
+                                               PUT_WORD(&result[result_pos - 2], _WRONG_MESSAGE_FORMAT);
+                                               break;
+                                       }
+                                       plci_b_id = GET_DWORD(li_participant_parms[0].info) & 0xffff;
+                                       li_flags = GET_DWORD(li_participant_parms[1].info);
+                                       PUT_DWORD(&result[result_pos - 6], plci_b_id);
+                                       if (sizeof(result) - result_pos < 7)
+                                       {
+                                               dbug(1, dprintf("[%06lx] %s,%d: LI result overrun",
+                                                               UnMapId(Id), (char *)(FILE_), __LINE__));
+                                               PUT_WORD(&result[result_pos - 2], _WRONG_STATE);
+                                               break;
+                                       }
+                                       plci_b = li2_check_plci_b(Id, plci, plci_b_id, plci_b_write_pos, &result[result_pos - 2]);
+                                       if (plci_b != NULL)
+                                       {
+                                               li2_update_connect(Id, a, plci, plci_b_id, true, li_flags);
+                                               plci->li_plci_b_queue[plci_b_write_pos] = plci_b_id |
+                                                       ((li_flags & (LI2_FLAG_INTERCONNECT_A_B | LI2_FLAG_INTERCONNECT_B_A |
+                                                                     LI2_FLAG_PCCONNECT_A_B | LI2_FLAG_PCCONNECT_B_A)) ? 0 : LI_PLCI_B_DISC_FLAG);
+                                               plci_b_write_pos = (plci_b_write_pos == LI_PLCI_B_QUEUE_ENTRIES - 1) ? 0 : plci_b_write_pos + 1;
+                                       }
+                                       participant_parms_pos = (word)((&li_participant_struct[0].info[1 + li_participant_struct[0].length]) -
+                                                                      (&li_req_parms[1].info[1]));
+                               }
+                               result[0] = (byte)(result_pos - 1);
+                               result[3] = (byte)(result_pos - 4);
+                               result[6] = (byte)(result_pos - 7);
+                               i = (plci_b_write_pos == 0) ? LI_PLCI_B_QUEUE_ENTRIES - 1 : plci_b_write_pos - 1;
+                               if ((plci_b_write_pos == plci->li_plci_b_read_pos)
+                                   || (plci->li_plci_b_queue[i] & LI_PLCI_B_LAST_FLAG))
+                               {
+                                       plci->li_plci_b_queue[plci_b_write_pos] = LI_PLCI_B_SKIP_FLAG | LI_PLCI_B_LAST_FLAG;
+                                       plci_b_write_pos = (plci_b_write_pos == LI_PLCI_B_QUEUE_ENTRIES - 1) ? 0 : plci_b_write_pos + 1;
+                               }
+                               else
+                                       plci->li_plci_b_queue[i] |= LI_PLCI_B_LAST_FLAG;
+                               plci->li_plci_b_write_pos = plci_b_write_pos;
+                       }
+                       mixer_calculate_coefs(a);
+                       plci->li_channel_bits = li_config_table[a->li_base + (plci->li_bchannel_id - 1)].channel;
+                       mixer_notify_update(plci, true);
+                       sendf(appl, _FACILITY_R | CONFIRM, Id & 0xffffL, Number,
+                             "wwS", Info, SELECTOR_LINE_INTERCONNECT, result);
+                       plci->command = 0;
+                       plci->li_cmd = GET_WORD(li_parms[0].info);
+                       start_internal_command(Id, plci, mixer_command);
+                       return (false);
+
+               case LI_REQ_DISCONNECT:
+                       if (li_parms[1].length == 4)
+                       {
+                               appl->appl_flags |= APPL_FLAG_OLD_LI_SPEC;
+                               if (api_parse(&li_parms[1].info[1], li_parms[1].length, "d", li_req_parms))
+                               {
+                                       dbug(1, dprintf("[%06lx] %s,%d: Wrong message format",
+                                                       UnMapId(Id), (char *)(FILE_), __LINE__));
+                                       Info = _WRONG_MESSAGE_FORMAT;
+                                       break;
+                               }
+                               plci_b_id = GET_DWORD(li_req_parms[0].info) & 0xffff;
+                               Info = li_check_main_plci(Id, plci);
+                               result_buffer[0] = 9;
+                               result_buffer[3] = 6;
+                               PUT_DWORD(&result_buffer[4], GET_DWORD(li_req_parms[0].info));
+                               PUT_WORD(&result_buffer[8], GOOD);
+                               if (Info != GOOD)
+                                       break;
+                               result = plci->saved_msg.info;
+                               for (i = 0; i <= result_buffer[0]; i++)
+                                       result[i] = result_buffer[i];
+                               plci_b_write_pos = plci->li_plci_b_write_pos;
+                               plci_b = li_check_plci_b(Id, plci, plci_b_id, plci_b_write_pos, &result[8]);
+                               if (plci_b == NULL)
+                                       break;
+                               li_update_connect(Id, a, plci, plci_b_id, false, 0);
+                               plci->li_plci_b_queue[plci_b_write_pos] = plci_b_id | LI_PLCI_B_DISC_FLAG | LI_PLCI_B_LAST_FLAG;
+                               plci_b_write_pos = (plci_b_write_pos == LI_PLCI_B_QUEUE_ENTRIES - 1) ? 0 : plci_b_write_pos + 1;
+                               plci->li_plci_b_write_pos = plci_b_write_pos;
+                       }
+                       else
+                       {
+                               appl->appl_flags &= ~APPL_FLAG_OLD_LI_SPEC;
+                               if (api_parse(&li_parms[1].info[1], li_parms[1].length, "s", li_req_parms))
+                               {
+                                       dbug(1, dprintf("[%06lx] %s,%d: Wrong message format",
+                                                       UnMapId(Id), (char *)(FILE_), __LINE__));
+                                       Info = _WRONG_MESSAGE_FORMAT;
+                                       break;
+                               }
+                               Info = li_check_main_plci(Id, plci);
+                               result_buffer[0] = 7;
+                               result_buffer[3] = 4;
+                               PUT_WORD(&result_buffer[4], Info);
+                               result_buffer[6] = 0;
+                               if (Info != GOOD)
+                                       break;
+                               result = plci->saved_msg.info;
+                               for (i = 0; i <= result_buffer[0]; i++)
+                                       result[i] = result_buffer[i];
+                               plci_b_write_pos = plci->li_plci_b_write_pos;
+                               participant_parms_pos = 0;
+                               result_pos = 7;
+                               while (participant_parms_pos < li_req_parms[0].length)
+                               {
+                                       result[result_pos] = 6;
+                                       result_pos += 7;
+                                       PUT_DWORD(&result[result_pos - 6], 0);
+                                       PUT_WORD(&result[result_pos - 2], GOOD);
+                                       if (api_parse(&li_req_parms[0].info[1 + participant_parms_pos],
+                                                     (word)(li_parms[1].length - participant_parms_pos), "s", li_participant_struct))
+                                       {
+                                               dbug(1, dprintf("[%06lx] %s,%d: Wrong message format",
+                                                               UnMapId(Id), (char *)(FILE_), __LINE__));
+                                               PUT_WORD(&result[result_pos - 2], _WRONG_MESSAGE_FORMAT);
+                                               break;
+                                       }
+                                       if (api_parse(&li_participant_struct[0].info[1],
+                                                     li_participant_struct[0].length, "d", li_participant_parms))
+                                       {
+                                               dbug(1, dprintf("[%06lx] %s,%d: Wrong message format",
+                                                               UnMapId(Id), (char *)(FILE_), __LINE__));
+                                               PUT_WORD(&result[result_pos - 2], _WRONG_MESSAGE_FORMAT);
+                                               break;
+                                       }
+                                       plci_b_id = GET_DWORD(li_participant_parms[0].info) & 0xffff;
+                                       PUT_DWORD(&result[result_pos - 6], plci_b_id);
+                                       if (sizeof(result) - result_pos < 7)
+                                       {
+                                               dbug(1, dprintf("[%06lx] %s,%d: LI result overrun",
+                                                               UnMapId(Id), (char *)(FILE_), __LINE__));
+                                               PUT_WORD(&result[result_pos - 2], _WRONG_STATE);
+                                               break;
+                                       }
+                                       plci_b = li2_check_plci_b(Id, plci, plci_b_id, plci_b_write_pos, &result[result_pos - 2]);
+                                       if (plci_b != NULL)
+                                       {
+                                               li2_update_connect(Id, a, plci, plci_b_id, false, 0);
+                                               plci->li_plci_b_queue[plci_b_write_pos] = plci_b_id | LI_PLCI_B_DISC_FLAG;
+                                               plci_b_write_pos = (plci_b_write_pos == LI_PLCI_B_QUEUE_ENTRIES - 1) ? 0 : plci_b_write_pos + 1;
+                                       }
+                                       participant_parms_pos = (word)((&li_participant_struct[0].info[1 + li_participant_struct[0].length]) -
+                                                                      (&li_req_parms[0].info[1]));
+                               }
+                               result[0] = (byte)(result_pos - 1);
+                               result[3] = (byte)(result_pos - 4);
+                               result[6] = (byte)(result_pos - 7);
+                               i = (plci_b_write_pos == 0) ? LI_PLCI_B_QUEUE_ENTRIES - 1 : plci_b_write_pos - 1;
+                               if ((plci_b_write_pos == plci->li_plci_b_read_pos)
+                                   || (plci->li_plci_b_queue[i] & LI_PLCI_B_LAST_FLAG))
+                               {
+                                       plci->li_plci_b_queue[plci_b_write_pos] = LI_PLCI_B_SKIP_FLAG | LI_PLCI_B_LAST_FLAG;
+                                       plci_b_write_pos = (plci_b_write_pos == LI_PLCI_B_QUEUE_ENTRIES - 1) ? 0 : plci_b_write_pos + 1;
+                               }
+                               else
+                                       plci->li_plci_b_queue[i] |= LI_PLCI_B_LAST_FLAG;
+                               plci->li_plci_b_write_pos = plci_b_write_pos;
+                       }
+                       mixer_calculate_coefs(a);
+                       plci->li_channel_bits = li_config_table[a->li_base + (plci->li_bchannel_id - 1)].channel;
+                       mixer_notify_update(plci, true);
+                       sendf(appl, _FACILITY_R | CONFIRM, Id & 0xffffL, Number,
+                             "wwS", Info, SELECTOR_LINE_INTERCONNECT, result);
+                       plci->command = 0;
+                       plci->li_cmd = GET_WORD(li_parms[0].info);
+                       start_internal_command(Id, plci, mixer_command);
+                       return (false);
+
+               case LI_REQ_SILENT_UPDATE:
+                       if (!plci || !plci->State
+                           || !plci->NL.Id || plci->nl_remove_id
+                           || (plci->li_bchannel_id == 0)
+                           || (li_config_table[plci->adapter->li_base + (plci->li_bchannel_id - 1)].plci != plci))
+                       {
+                               dbug(1, dprintf("[%06lx] %s,%d: Wrong state",
+                                               UnMapId(Id), (char *)(FILE_), __LINE__));
+                               return (false);
+                       }
+                       plci_b_write_pos = plci->li_plci_b_write_pos;
+                       if (((plci->li_plci_b_read_pos > plci_b_write_pos) ? plci->li_plci_b_read_pos :
+                            LI_PLCI_B_QUEUE_ENTRIES + plci->li_plci_b_read_pos) - plci_b_write_pos - 1 < 2)
+                       {
+                               dbug(1, dprintf("[%06lx] %s,%d: LI request overrun",
+                                               UnMapId(Id), (char *)(FILE_), __LINE__));
+                               return (false);
+                       }
+                       i = (plci_b_write_pos == 0) ? LI_PLCI_B_QUEUE_ENTRIES - 1 : plci_b_write_pos - 1;
+                       if ((plci_b_write_pos == plci->li_plci_b_read_pos)
+                           || (plci->li_plci_b_queue[i] & LI_PLCI_B_LAST_FLAG))
+                       {
+                               plci->li_plci_b_queue[plci_b_write_pos] = LI_PLCI_B_SKIP_FLAG | LI_PLCI_B_LAST_FLAG;
+                               plci_b_write_pos = (plci_b_write_pos == LI_PLCI_B_QUEUE_ENTRIES - 1) ? 0 : plci_b_write_pos + 1;
+                       }
+                       else
+                               plci->li_plci_b_queue[i] |= LI_PLCI_B_LAST_FLAG;
+                       plci->li_plci_b_write_pos = plci_b_write_pos;
+                       plci->li_channel_bits = li_config_table[a->li_base + (plci->li_bchannel_id - 1)].channel;
+                       plci->command = 0;
+                       plci->li_cmd = GET_WORD(li_parms[0].info);
+                       start_internal_command(Id, plci, mixer_command);
+                       return (false);
+
+               default:
+                       dbug(1, dprintf("[%06lx] %s,%d: LI unknown request %04x",
+                                       UnMapId(Id), (char *)(FILE_), __LINE__, GET_WORD(li_parms[0].info)));
+                       Info = _FACILITY_NOT_SUPPORTED;
+               }
+       }
+       sendf(appl, _FACILITY_R | CONFIRM, Id & 0xffffL, Number,
+             "wwS", Info, SELECTOR_LINE_INTERCONNECT, result);
+       return (false);
+}
+
+
+static void mixer_indication_coefs_set(dword Id, PLCI *plci)
+{
+       dword d;
+       byte result[12];
+
+       dbug(1, dprintf("[%06lx] %s,%d: mixer_indication_coefs_set",
+                       UnMapId(Id), (char *)(FILE_), __LINE__));
+
+       if (plci->li_plci_b_read_pos != plci->li_plci_b_req_pos)
+       {
+               do
+               {
+                       d = plci->li_plci_b_queue[plci->li_plci_b_read_pos];
+                       if (!(d & LI_PLCI_B_SKIP_FLAG))
+                       {
+                               if (plci->appl->appl_flags & APPL_FLAG_OLD_LI_SPEC)
+                               {
+                                       if (d & LI_PLCI_B_DISC_FLAG)
+                                       {
+                                               result[0] = 5;
+                                               PUT_WORD(&result[1], LI_IND_DISCONNECT);
+                                               result[3] = 2;
+                                               PUT_WORD(&result[4], _LI_USER_INITIATED);
+                                       }
+                                       else
+                                       {
+                                               result[0] = 7;
+                                               PUT_WORD(&result[1], LI_IND_CONNECT_ACTIVE);
+                                               result[3] = 4;
+                                               PUT_DWORD(&result[4], d & ~LI_PLCI_B_FLAG_MASK);
+                                       }
+                               }
+                               else
+                               {
+                                       if (d & LI_PLCI_B_DISC_FLAG)
+                                       {
+                                               result[0] = 9;
+                                               PUT_WORD(&result[1], LI_IND_DISCONNECT);
+                                               result[3] = 6;
+                                               PUT_DWORD(&result[4], d & ~LI_PLCI_B_FLAG_MASK);
+                                               PUT_WORD(&result[8], _LI_USER_INITIATED);
+                                       }
+                                       else
+                                       {
+                                               result[0] = 7;
+                                               PUT_WORD(&result[1], LI_IND_CONNECT_ACTIVE);
+                                               result[3] = 4;
+                                               PUT_DWORD(&result[4], d & ~LI_PLCI_B_FLAG_MASK);
+                                       }
+                               }
+                               sendf(plci->appl, _FACILITY_I, Id & 0xffffL, 0,
+                                     "ws", SELECTOR_LINE_INTERCONNECT, result);
+                       }
+                       plci->li_plci_b_read_pos = (plci->li_plci_b_read_pos == LI_PLCI_B_QUEUE_ENTRIES - 1) ?
+                               0 : plci->li_plci_b_read_pos + 1;
+               } while (!(d & LI_PLCI_B_LAST_FLAG) && (plci->li_plci_b_read_pos != plci->li_plci_b_req_pos));
+       }
+}
+
+
+static void mixer_indication_xconnect_from(dword Id, PLCI *plci, byte *msg, word length)
+{
+       word i, j, ch;
+       struct xconnect_transfer_address_s s,   *p;
+       DIVA_CAPI_ADAPTER *a;
+
+       dbug(1, dprintf("[%06lx] %s,%d: mixer_indication_xconnect_from %d",
+                       UnMapId(Id), (char *)(FILE_), __LINE__, (int)length));
+
+       a = plci->adapter;
+       i = 1;
+       for (i = 1; i < length; i += 16)
+       {
+               s.card_address.low = msg[i] | (msg[i + 1] << 8) | (((dword)(msg[i + 2])) << 16) | (((dword)(msg[i + 3])) << 24);
+               s.card_address.high = msg[i + 4] | (msg[i + 5] << 8) | (((dword)(msg[i + 6])) << 16) | (((dword)(msg[i + 7])) << 24);
+               s.offset = msg[i + 8] | (msg[i + 9] << 8) | (((dword)(msg[i + 10])) << 16) | (((dword)(msg[i + 11])) << 24);
+               ch = msg[i + 12] | (msg[i + 13] << 8);
+               j = ch & XCONNECT_CHANNEL_NUMBER_MASK;
+               if (!a->li_pri && (plci->li_bchannel_id == 2))
+                       j = 1 - j;
+               j += a->li_base;
+               if (ch & XCONNECT_CHANNEL_PORT_PC)
+                       p = &(li_config_table[j].send_pc);
+               else
+                       p = &(li_config_table[j].send_b);
+               p->card_address.low = s.card_address.low;
+               p->card_address.high = s.card_address.high;
+               p->offset = s.offset;
+               li_config_table[j].channel |= LI_CHANNEL_ADDRESSES_SET;
+       }
+       if (plci->internal_command_queue[0]
+           && ((plci->adjust_b_state == ADJUST_B_RESTORE_MIXER_2)
+               || (plci->adjust_b_state == ADJUST_B_RESTORE_MIXER_3)
+               || (plci->adjust_b_state == ADJUST_B_RESTORE_MIXER_4)))
+       {
+               (*(plci->internal_command_queue[0]))(Id, plci, 0);
+               if (!plci->internal_command)
+                       next_internal_command(Id, plci);
+       }
+       mixer_notify_update(plci, true);
+}
+
+
+static void mixer_indication_xconnect_to(dword Id, PLCI *plci, byte *msg, word length)
+{
+
+       dbug(1, dprintf("[%06lx] %s,%d: mixer_indication_xconnect_to %d",
+                       UnMapId(Id), (char *)(FILE_), __LINE__, (int) length));
+
+}
+
+
+static byte mixer_notify_source_removed(PLCI *plci, dword plci_b_id)
+{
+       word plci_b_write_pos;
+
+       plci_b_write_pos = plci->li_plci_b_write_pos;
+       if (((plci->li_plci_b_read_pos > plci_b_write_pos) ? plci->li_plci_b_read_pos :
+            LI_PLCI_B_QUEUE_ENTRIES + plci->li_plci_b_read_pos) - plci_b_write_pos - 1 < 1)
+       {
+               dbug(1, dprintf("[%06lx] %s,%d: LI request overrun",
+                               (dword)((plci->Id << 8) | UnMapController(plci->adapter->Id)),
+                               (char *)(FILE_), __LINE__));
+               return (false);
+       }
+       plci->li_plci_b_queue[plci_b_write_pos] = plci_b_id | LI_PLCI_B_DISC_FLAG;
+       plci_b_write_pos = (plci_b_write_pos == LI_PLCI_B_QUEUE_ENTRIES - 1) ? 0 : plci_b_write_pos + 1;
+       plci->li_plci_b_write_pos = plci_b_write_pos;
+       return (true);
+}
+
+
+static void mixer_remove(PLCI *plci)
+{
+       DIVA_CAPI_ADAPTER *a;
+       PLCI *notify_plci;
+       dword plci_b_id;
+       word i, j;
+
+       dbug(1, dprintf("[%06lx] %s,%d: mixer_remove",
+                       (dword)((plci->Id << 8) | UnMapController(plci->adapter->Id)),
+                       (char *)(FILE_), __LINE__));
+
+       a = plci->adapter;
+       plci_b_id = (plci->Id << 8) | UnMapController(plci->adapter->Id);
+       if (a->profile.Global_Options & GL_LINE_INTERCONNECT_SUPPORTED)
+       {
+               if ((plci->li_bchannel_id != 0)
+                   && (li_config_table[a->li_base + (plci->li_bchannel_id - 1)].plci == plci))
+               {
+                       i = a->li_base + (plci->li_bchannel_id - 1);
+                       if ((li_config_table[i].curchnl | li_config_table[i].channel) & LI_CHANNEL_INVOLVED)
+                       {
+                               for (j = 0; j < li_total_channels; j++)
+                               {
+                                       if ((li_config_table[i].flag_table[j] & LI_FLAG_INTERCONNECT)
+                                           || (li_config_table[j].flag_table[i] & LI_FLAG_INTERCONNECT))
+                                       {
+                                               notify_plci = li_config_table[j].plci;
+                                               if ((notify_plci != NULL)
+                                                   && (notify_plci != plci)
+                                                   && (notify_plci->appl != NULL)
+                                                   && !(notify_plci->appl->appl_flags & APPL_FLAG_OLD_LI_SPEC)
+                                                   && (notify_plci->State)
+                                                   && notify_plci->NL.Id && !notify_plci->nl_remove_id)
+                                               {
+                                                       mixer_notify_source_removed(notify_plci, plci_b_id);
+                                               }
+                                       }
+                               }
+                               mixer_clear_config(plci);
+                               mixer_calculate_coefs(a);
+                               mixer_notify_update(plci, true);
+                       }
+                       li_config_table[i].plci = NULL;
+                       plci->li_bchannel_id = 0;
+               }
+       }
 }
 
 
-static void adv_voice_clear_config (PLCI   *plci)
-{
-  DIVA_CAPI_ADAPTER   *a;
-
-  word i, j;
+/*------------------------------------------------------------------*/
+/* Echo canceller facilities                                        */
+/*------------------------------------------------------------------*/
 
 
-  dbug (1, dprintf ("[%06lx] %s,%d: adv_voice_clear_config",
-    (dword)((plci->Id << 8) | UnMapController (plci->adapter->Id)),
-    (char   *)(FILE_), __LINE__));
+static void ec_write_parameters(PLCI *plci)
+{
+       word w;
+       byte parameter_buffer[6];
 
-  a = plci->adapter;
-  if ((plci->tel == ADV_VOICE) && (plci == a->AdvSignalPLCI))
-  {
-    a->adv_voice_coef_length = 0;
-
-    if (!a->li_pri && (plci->li_bchannel_id != 0)
-     && (li_config_table[a->li_base + (plci->li_bchannel_id - 1)].plci == plci))
-    {
-      i = a->li_base + (plci->li_bchannel_id - 1);
-      li_config_table[i].curchnl = 0;
-      li_config_table[i].channel = 0;
-      li_config_table[i].chflags = 0;
-      for (j = 0; j < li_total_channels; j++)
-      {
-        li_config_table[i].flag_table[j] = 0;
-        li_config_table[j].flag_table[i] = 0;
-        li_config_table[i].coef_table[j] = 0;
-        li_config_table[j].coef_table[i] = 0;
-      }
-      li_config_table[i].coef_table[i] |= LI_COEF_CH_PC_SET | LI_COEF_PC_CH_SET;
-      i = a->li_base + MIXER_IC_CHANNEL_BASE + (plci->li_bchannel_id - 1);
-      li_config_table[i].curchnl = 0;
-      li_config_table[i].channel = 0;
-      li_config_table[i].chflags = 0;
-      for (j = 0; j < li_total_channels; j++)
-      {
-        li_config_table[i].flag_table[j] = 0;
-        li_config_table[j].flag_table[i] = 0;
-        li_config_table[i].coef_table[j] = 0;
-        li_config_table[j].coef_table[i] = 0;
-      }
-      if (a->manufacturer_features & MANUFACTURER_FEATURE_SLAVE_CODEC)
-      {
-        i = a->li_base + MIXER_IC_CHANNEL_BASE + (2 - plci->li_bchannel_id);
-        li_config_table[i].curchnl = 0;
-        li_config_table[i].channel = 0;
-        li_config_table[i].chflags = 0;
-        for (j = 0; j < li_total_channels; j++)
-        {
-          li_config_table[i].flag_table[j] = 0;
-          li_config_table[j].flag_table[i] = 0;
-          li_config_table[i].coef_table[j] = 0;
-          li_config_table[j].coef_table[i] = 0;
-        }
-      }
-    }
+       dbug(1, dprintf("[%06lx] %s,%d: ec_write_parameters",
+                       (dword)((plci->Id << 8) | UnMapController(plci->adapter->Id)),
+                       (char *)(FILE_), __LINE__));
 
-  }
+       parameter_buffer[0] = 5;
+       parameter_buffer[1] = DSP_CTRL_SET_LEC_PARAMETERS;
+       PUT_WORD(&parameter_buffer[2], plci->ec_idi_options);
+       plci->ec_idi_options &= ~LEC_RESET_COEFFICIENTS;
+       w = (plci->ec_tail_length == 0) ? 128 : plci->ec_tail_length;
+       PUT_WORD(&parameter_buffer[4], w);
+       add_p(plci, FTY, parameter_buffer);
+       sig_req(plci, TEL_CTRL, 0);
+       send_req(plci);
 }
 
 
-static void adv_voice_prepare_switch (dword Id, PLCI   *plci)
+static void ec_clear_config(PLCI *plci)
 {
 
-  dbug (1, dprintf ("[%06lx] %s,%d: adv_voice_prepare_switch",
-    UnMapId (Id), (char   *)(FILE_), __LINE__));
+       dbug(1, dprintf("[%06lx] %s,%d: ec_clear_config",
+                       (dword)((plci->Id << 8) | UnMapController(plci->adapter->Id)),
+                       (char *)(FILE_), __LINE__));
 
+       plci->ec_idi_options = LEC_ENABLE_ECHO_CANCELLER |
+               LEC_MANUAL_DISABLE | LEC_ENABLE_NONLINEAR_PROCESSING;
+       plci->ec_tail_length = 0;
 }
 
 
-static word adv_voice_save_config (dword Id, PLCI   *plci, byte Rc)
+static void ec_prepare_switch(dword Id, PLCI *plci)
 {
 
-  dbug (1, dprintf ("[%06lx] %s,%d: adv_voice_save_config %02x %d",
-    UnMapId (Id), (char   *)(FILE_), __LINE__, Rc, plci->adjust_b_state));
+       dbug(1, dprintf("[%06lx] %s,%d: ec_prepare_switch",
+                       UnMapId(Id), (char *)(FILE_), __LINE__));
 
-  return (GOOD);
 }
 
 
-static word adv_voice_restore_config (dword Id, PLCI   *plci, byte Rc)
-{
-  DIVA_CAPI_ADAPTER   *a;
-  word Info;
+static word ec_save_config(dword Id, PLCI *plci, byte Rc)
+{
+
+       dbug(1, dprintf("[%06lx] %s,%d: ec_save_config %02x %d",
+                       UnMapId(Id), (char *)(FILE_), __LINE__, Rc, plci->adjust_b_state));
+
+       return (GOOD);
+}
+
+
+static word ec_restore_config(dword Id, PLCI *plci, byte Rc)
+{
+       word Info;
+
+       dbug(1, dprintf("[%06lx] %s,%d: ec_restore_config %02x %d",
+                       UnMapId(Id), (char *)(FILE_), __LINE__, Rc, plci->adjust_b_state));
+
+       Info = GOOD;
+       if (plci->B1_facilities & B1_FACILITY_EC)
+       {
+               switch (plci->adjust_b_state)
+               {
+               case ADJUST_B_RESTORE_EC_1:
+                       plci->internal_command = plci->adjust_b_command;
+                       if (plci->sig_req)
+                       {
+                               plci->adjust_b_state = ADJUST_B_RESTORE_EC_1;
+                               break;
+                       }
+                       ec_write_parameters(plci);
+                       plci->adjust_b_state = ADJUST_B_RESTORE_EC_2;
+                       break;
+               case ADJUST_B_RESTORE_EC_2:
+                       if ((Rc != OK) && (Rc != OK_FC))
+                       {
+                               dbug(1, dprintf("[%06lx] %s,%d: Restore EC failed %02x",
+                                               UnMapId(Id), (char *)(FILE_), __LINE__, Rc));
+                               Info = _WRONG_STATE;
+                               break;
+                       }
+                       break;
+               }
+       }
+       return (Info);
+}
+
+
+static void ec_command(dword Id, PLCI *plci, byte Rc)
+{
+       word internal_command, Info;
+       byte result[8];
+
+       dbug(1, dprintf("[%06lx] %s,%d: ec_command %02x %04x %04x %04x %d",
+                       UnMapId(Id), (char *)(FILE_), __LINE__, Rc, plci->internal_command,
+                       plci->ec_cmd, plci->ec_idi_options, plci->ec_tail_length));
+
+       Info = GOOD;
+       if (plci->appl->appl_flags & APPL_FLAG_PRIV_EC_SPEC)
+       {
+               result[0] = 2;
+               PUT_WORD(&result[1], EC_SUCCESS);
+       }
+       else
+       {
+               result[0] = 5;
+               PUT_WORD(&result[1], plci->ec_cmd);
+               result[3] = 2;
+               PUT_WORD(&result[4], GOOD);
+       }
+       internal_command = plci->internal_command;
+       plci->internal_command = 0;
+       switch (plci->ec_cmd)
+       {
+       case EC_ENABLE_OPERATION:
+       case EC_FREEZE_COEFFICIENTS:
+       case EC_RESUME_COEFFICIENT_UPDATE:
+       case EC_RESET_COEFFICIENTS:
+               switch (internal_command)
+               {
+               default:
+                       adjust_b1_resource(Id, plci, NULL, (word)(plci->B1_facilities |
+                                                                 B1_FACILITY_EC), EC_COMMAND_1);
+               case EC_COMMAND_1:
+                       if (adjust_b_process(Id, plci, Rc) != GOOD)
+                       {
+                               dbug(1, dprintf("[%06lx] %s,%d: Load EC failed",
+                                               UnMapId(Id), (char *)(FILE_), __LINE__));
+                               Info = _FACILITY_NOT_SUPPORTED;
+                               break;
+                       }
+                       if (plci->internal_command)
+                               return;
+               case EC_COMMAND_2:
+                       if (plci->sig_req)
+                       {
+                               plci->internal_command = EC_COMMAND_2;
+                               return;
+                       }
+                       plci->internal_command = EC_COMMAND_3;
+                       ec_write_parameters(plci);
+                       return;
+               case EC_COMMAND_3:
+                       if ((Rc != OK) && (Rc != OK_FC))
+                       {
+                               dbug(1, dprintf("[%06lx] %s,%d: Enable EC failed %02x",
+                                               UnMapId(Id), (char *)(FILE_), __LINE__, Rc));
+                               Info = _FACILITY_NOT_SUPPORTED;
+                               break;
+                       }
+                       break;
+               }
+               break;
+
+       case EC_DISABLE_OPERATION:
+               switch (internal_command)
+               {
+               default:
+               case EC_COMMAND_1:
+                       if (plci->B1_facilities & B1_FACILITY_EC)
+                       {
+                               if (plci->sig_req)
+                               {
+                                       plci->internal_command = EC_COMMAND_1;
+                                       return;
+                               }
+                               plci->internal_command = EC_COMMAND_2;
+                               ec_write_parameters(plci);
+                               return;
+                       }
+                       Rc = OK;
+               case EC_COMMAND_2:
+                       if ((Rc != OK) && (Rc != OK_FC))
+                       {
+                               dbug(1, dprintf("[%06lx] %s,%d: Disable EC failed %02x",
+                                               UnMapId(Id), (char *)(FILE_), __LINE__, Rc));
+                               Info = _FACILITY_NOT_SUPPORTED;
+                               break;
+                       }
+                       adjust_b1_resource(Id, plci, NULL, (word)(plci->B1_facilities &
+                                                                 ~B1_FACILITY_EC), EC_COMMAND_3);
+               case EC_COMMAND_3:
+                       if (adjust_b_process(Id, plci, Rc) != GOOD)
+                       {
+                               dbug(1, dprintf("[%06lx] %s,%d: Unload EC failed",
+                                               UnMapId(Id), (char *)(FILE_), __LINE__));
+                               Info = _FACILITY_NOT_SUPPORTED;
+                               break;
+                       }
+                       if (plci->internal_command)
+                               return;
+                       break;
+               }
+               break;
+       }
+       sendf(plci->appl, _FACILITY_R | CONFIRM, Id & 0xffffL, plci->number,
+             "wws", Info, (plci->appl->appl_flags & APPL_FLAG_PRIV_EC_SPEC) ?
+             PRIV_SELECTOR_ECHO_CANCELLER : SELECTOR_ECHO_CANCELLER, result);
+}
+
+
+static byte ec_request(dword Id, word Number, DIVA_CAPI_ADAPTER *a, PLCI *plci, APPL   *appl, API_PARSE *msg)
+{
+       word Info;
+       word opt;
+       API_PARSE ec_parms[3];
+       byte result[16];
+
+       dbug(1, dprintf("[%06lx] %s,%d: ec_request",
+                       UnMapId(Id), (char *)(FILE_), __LINE__));
+
+       Info = GOOD;
+       result[0] = 0;
+       if (!(a->man_profile.private_options & (1L << PRIVATE_ECHO_CANCELLER)))
+       {
+               dbug(1, dprintf("[%06lx] %s,%d: Facility not supported",
+                               UnMapId(Id), (char *)(FILE_), __LINE__));
+               Info = _FACILITY_NOT_SUPPORTED;
+       }
+       else
+       {
+               if (appl->appl_flags & APPL_FLAG_PRIV_EC_SPEC)
+               {
+                       if (api_parse(&msg[1].info[1], msg[1].length, "w", ec_parms))
+                       {
+                               dbug(1, dprintf("[%06lx] %s,%d: Wrong message format",
+                                               UnMapId(Id), (char *)(FILE_), __LINE__));
+                               Info = _WRONG_MESSAGE_FORMAT;
+                       }
+                       else
+                       {
+                               if (plci == NULL)
+                               {
+                                       dbug(1, dprintf("[%06lx] %s,%d: Wrong PLCI",
+                                                       UnMapId(Id), (char *)(FILE_), __LINE__));
+                                       Info = _WRONG_IDENTIFIER;
+                               }
+                               else if (!plci->State || !plci->NL.Id || plci->nl_remove_id)
+                               {
+                                       dbug(1, dprintf("[%06lx] %s,%d: Wrong state",
+                                                       UnMapId(Id), (char *)(FILE_), __LINE__));
+                                       Info = _WRONG_STATE;
+                               }
+                               else
+                               {
+                                       plci->command = 0;
+                                       plci->ec_cmd = GET_WORD(ec_parms[0].info);
+                                       plci->ec_idi_options &= ~(LEC_MANUAL_DISABLE | LEC_RESET_COEFFICIENTS);
+                                       result[0] = 2;
+                                       PUT_WORD(&result[1], EC_SUCCESS);
+                                       if (msg[1].length >= 4)
+                                       {
+                                               opt = GET_WORD(&ec_parms[0].info[2]);
+                                               plci->ec_idi_options &= ~(LEC_ENABLE_NONLINEAR_PROCESSING |
+                                                                         LEC_ENABLE_2100HZ_DETECTOR | LEC_REQUIRE_2100HZ_REVERSALS);
+                                               if (!(opt & EC_DISABLE_NON_LINEAR_PROCESSING))
+                                                       plci->ec_idi_options |= LEC_ENABLE_NONLINEAR_PROCESSING;
+                                               if (opt & EC_DETECT_DISABLE_TONE)
+                                                       plci->ec_idi_options |= LEC_ENABLE_2100HZ_DETECTOR;
+                                               if (!(opt & EC_DO_NOT_REQUIRE_REVERSALS))
+                                                       plci->ec_idi_options |= LEC_REQUIRE_2100HZ_REVERSALS;
+                                               if (msg[1].length >= 6)
+                                               {
+                                                       plci->ec_tail_length = GET_WORD(&ec_parms[0].info[4]);
+                                               }
+                                       }
+                                       switch (plci->ec_cmd)
+                                       {
+                                       case EC_ENABLE_OPERATION:
+                                               plci->ec_idi_options &= ~LEC_FREEZE_COEFFICIENTS;
+                                               start_internal_command(Id, plci, ec_command);
+                                               return (false);
+
+                                       case EC_DISABLE_OPERATION:
+                                               plci->ec_idi_options = LEC_ENABLE_ECHO_CANCELLER |
+                                                       LEC_MANUAL_DISABLE | LEC_ENABLE_NONLINEAR_PROCESSING |
+                                                       LEC_RESET_COEFFICIENTS;
+                                               start_internal_command(Id, plci, ec_command);
+                                               return (false);
+
+                                       case EC_FREEZE_COEFFICIENTS:
+                                               plci->ec_idi_options |= LEC_FREEZE_COEFFICIENTS;
+                                               start_internal_command(Id, plci, ec_command);
+                                               return (false);
+
+                                       case EC_RESUME_COEFFICIENT_UPDATE:
+                                               plci->ec_idi_options &= ~LEC_FREEZE_COEFFICIENTS;
+                                               start_internal_command(Id, plci, ec_command);
+                                               return (false);
+
+                                       case EC_RESET_COEFFICIENTS:
+                                               plci->ec_idi_options |= LEC_RESET_COEFFICIENTS;
+                                               start_internal_command(Id, plci, ec_command);
+                                               return (false);
+
+                                       default:
+                                               dbug(1, dprintf("[%06lx] %s,%d: EC unknown request %04x",
+                                                               UnMapId(Id), (char *)(FILE_), __LINE__, plci->ec_cmd));
+                                               PUT_WORD(&result[1], EC_UNSUPPORTED_OPERATION);
+                                       }
+                               }
+                       }
+               }
+               else
+               {
+                       if (api_parse(&msg[1].info[1], msg[1].length, "ws", ec_parms))
+                       {
+                               dbug(1, dprintf("[%06lx] %s,%d: Wrong message format",
+                                               UnMapId(Id), (char *)(FILE_), __LINE__));
+                               Info = _WRONG_MESSAGE_FORMAT;
+                       }
+                       else
+                       {
+                               if (GET_WORD(ec_parms[0].info) == EC_GET_SUPPORTED_SERVICES)
+                               {
+                                       result[0] = 11;
+                                       PUT_WORD(&result[1], EC_GET_SUPPORTED_SERVICES);
+                                       result[3] = 8;
+                                       PUT_WORD(&result[4], GOOD);
+                                       PUT_WORD(&result[6], 0x0007);
+                                       PUT_WORD(&result[8], LEC_MAX_SUPPORTED_TAIL_LENGTH);
+                                       PUT_WORD(&result[10], 0);
+                               }
+                               else if (plci == NULL)
+                               {
+                                       dbug(1, dprintf("[%06lx] %s,%d: Wrong PLCI",
+                                                       UnMapId(Id), (char *)(FILE_), __LINE__));
+                                       Info = _WRONG_IDENTIFIER;
+                               }
+                               else if (!plci->State || !plci->NL.Id || plci->nl_remove_id)
+                               {
+                                       dbug(1, dprintf("[%06lx] %s,%d: Wrong state",
+                                                       UnMapId(Id), (char *)(FILE_), __LINE__));
+                                       Info = _WRONG_STATE;
+                               }
+                               else
+                               {
+                                       plci->command = 0;
+                                       plci->ec_cmd = GET_WORD(ec_parms[0].info);
+                                       plci->ec_idi_options &= ~(LEC_MANUAL_DISABLE | LEC_RESET_COEFFICIENTS);
+                                       result[0] = 5;
+                                       PUT_WORD(&result[1], plci->ec_cmd);
+                                       result[3] = 2;
+                                       PUT_WORD(&result[4], GOOD);
+                                       plci->ec_idi_options &= ~(LEC_ENABLE_NONLINEAR_PROCESSING |
+                                                                 LEC_ENABLE_2100HZ_DETECTOR | LEC_REQUIRE_2100HZ_REVERSALS);
+                                       plci->ec_tail_length = 0;
+                                       if (ec_parms[1].length >= 2)
+                                       {
+                                               opt = GET_WORD(&ec_parms[1].info[1]);
+                                               if (opt & EC_ENABLE_NON_LINEAR_PROCESSING)
+                                                       plci->ec_idi_options |= LEC_ENABLE_NONLINEAR_PROCESSING;
+                                               if (opt & EC_DETECT_DISABLE_TONE)
+                                                       plci->ec_idi_options |= LEC_ENABLE_2100HZ_DETECTOR;
+                                               if (!(opt & EC_DO_NOT_REQUIRE_REVERSALS))
+                                                       plci->ec_idi_options |= LEC_REQUIRE_2100HZ_REVERSALS;
+                                               if (ec_parms[1].length >= 4)
+                                               {
+                                                       plci->ec_tail_length = GET_WORD(&ec_parms[1].info[3]);
+                                               }
+                                       }
+                                       switch (plci->ec_cmd)
+                                       {
+                                       case EC_ENABLE_OPERATION:
+                                               plci->ec_idi_options &= ~LEC_FREEZE_COEFFICIENTS;
+                                               start_internal_command(Id, plci, ec_command);
+                                               return (false);
+
+                                       case EC_DISABLE_OPERATION:
+                                               plci->ec_idi_options = LEC_ENABLE_ECHO_CANCELLER |
+                                                       LEC_MANUAL_DISABLE | LEC_ENABLE_NONLINEAR_PROCESSING |
+                                                       LEC_RESET_COEFFICIENTS;
+                                               start_internal_command(Id, plci, ec_command);
+                                               return (false);
+
+                                       default:
+                                               dbug(1, dprintf("[%06lx] %s,%d: EC unknown request %04x",
+                                                               UnMapId(Id), (char *)(FILE_), __LINE__, plci->ec_cmd));
+                                               PUT_WORD(&result[4], _FACILITY_SPECIFIC_FUNCTION_NOT_SUPP);
+                                       }
+                               }
+                       }
+               }
+       }
+       sendf(appl, _FACILITY_R | CONFIRM, Id & 0xffffL, Number,
+             "wws", Info, (appl->appl_flags & APPL_FLAG_PRIV_EC_SPEC) ?
+             PRIV_SELECTOR_ECHO_CANCELLER : SELECTOR_ECHO_CANCELLER, result);
+       return (false);
+}
+
+
+static void ec_indication(dword Id, PLCI *plci, byte *msg, word length)
+{
+       byte result[8];
+
+       dbug(1, dprintf("[%06lx] %s,%d: ec_indication",
+                       UnMapId(Id), (char *)(FILE_), __LINE__));
+
+       if (!(plci->ec_idi_options & LEC_MANUAL_DISABLE))
+       {
+               if (plci->appl->appl_flags & APPL_FLAG_PRIV_EC_SPEC)
+               {
+                       result[0] = 2;
+                       PUT_WORD(&result[1], 0);
+                       switch (msg[1])
+                       {
+                       case LEC_DISABLE_TYPE_CONTIGNUOUS_2100HZ:
+                               PUT_WORD(&result[1], EC_BYPASS_DUE_TO_CONTINUOUS_2100HZ);
+                               break;
+                       case LEC_DISABLE_TYPE_REVERSED_2100HZ:
+                               PUT_WORD(&result[1], EC_BYPASS_DUE_TO_REVERSED_2100HZ);
+                               break;
+                       case LEC_DISABLE_RELEASED:
+                               PUT_WORD(&result[1], EC_BYPASS_RELEASED);
+                               break;
+                       }
+               }
+               else
+               {
+                       result[0] = 5;
+                       PUT_WORD(&result[1], EC_BYPASS_INDICATION);
+                       result[3] = 2;
+                       PUT_WORD(&result[4], 0);
+                       switch (msg[1])
+                       {
+                       case LEC_DISABLE_TYPE_CONTIGNUOUS_2100HZ:
+                               PUT_WORD(&result[4], EC_BYPASS_DUE_TO_CONTINUOUS_2100HZ);
+                               break;
+                       case LEC_DISABLE_TYPE_REVERSED_2100HZ:
+                               PUT_WORD(&result[4], EC_BYPASS_DUE_TO_REVERSED_2100HZ);
+                               break;
+                       case LEC_DISABLE_RELEASED:
+                               PUT_WORD(&result[4], EC_BYPASS_RELEASED);
+                               break;
+                       }
+               }
+               sendf(plci->appl, _FACILITY_I, Id & 0xffffL, 0, "ws", (plci->appl->appl_flags & APPL_FLAG_PRIV_EC_SPEC) ?
+                     PRIV_SELECTOR_ECHO_CANCELLER : SELECTOR_ECHO_CANCELLER, result);
+       }
+}
+
+
+
+/*------------------------------------------------------------------*/
+/* Advanced voice                                                   */
+/*------------------------------------------------------------------*/
 
-  dbug (1, dprintf ("[%06lx] %s,%d: adv_voice_restore_config %02x %d",
-    UnMapId (Id), (char   *)(FILE_), __LINE__, Rc, plci->adjust_b_state));
+static void adv_voice_write_coefs(PLCI *plci, word write_command)
+{
+       DIVA_CAPI_ADAPTER *a;
+       word i;
+       byte *p;
+
+       word w, n, j, k;
+       byte ch_map[MIXER_CHANNELS_BRI];
+
+       byte coef_buffer[ADV_VOICE_COEF_BUFFER_SIZE + 2];
+
+       dbug(1, dprintf("[%06lx] %s,%d: adv_voice_write_coefs %d",
+                       (dword)((plci->Id << 8) | UnMapController(plci->adapter->Id)),
+                       (char *)(FILE_), __LINE__, write_command));
+
+       a = plci->adapter;
+       p = coef_buffer + 1;
+       *(p++) = DSP_CTRL_OLD_SET_MIXER_COEFFICIENTS;
+       i = 0;
+       while (i + sizeof(word) <= a->adv_voice_coef_length)
+       {
+               PUT_WORD(p, GET_WORD(a->adv_voice_coef_buffer + i));
+               p += 2;
+               i += 2;
+       }
+       while (i < ADV_VOICE_OLD_COEF_COUNT * sizeof(word))
+       {
+               PUT_WORD(p, 0x8000);
+               p += 2;
+               i += 2;
+       }
+
+       if (!a->li_pri && (plci->li_bchannel_id == 0))
+       {
+               if ((li_config_table[a->li_base].plci == NULL) && (li_config_table[a->li_base + 1].plci != NULL))
+               {
+                       plci->li_bchannel_id = 1;
+                       li_config_table[a->li_base].plci = plci;
+                       dbug(1, dprintf("[%06lx] %s,%d: adv_voice_set_bchannel_id %d",
+                                       (dword)((plci->Id << 8) | UnMapController(plci->adapter->Id)),
+                                       (char *)(FILE_), __LINE__, plci->li_bchannel_id));
+               }
+               else if ((li_config_table[a->li_base].plci != NULL) && (li_config_table[a->li_base + 1].plci == NULL))
+               {
+                       plci->li_bchannel_id = 2;
+                       li_config_table[a->li_base + 1].plci = plci;
+                       dbug(1, dprintf("[%06lx] %s,%d: adv_voice_set_bchannel_id %d",
+                                       (dword)((plci->Id << 8) | UnMapController(plci->adapter->Id)),
+                                       (char *)(FILE_), __LINE__, plci->li_bchannel_id));
+               }
+       }
+       if (!a->li_pri && (plci->li_bchannel_id != 0)
+           && (li_config_table[a->li_base + (plci->li_bchannel_id - 1)].plci == plci))
+       {
+               i = a->li_base + (plci->li_bchannel_id - 1);
+               switch (write_command)
+               {
+               case ADV_VOICE_WRITE_ACTIVATION:
+                       j = a->li_base + MIXER_IC_CHANNEL_BASE + (plci->li_bchannel_id - 1);
+                       k = a->li_base + MIXER_IC_CHANNEL_BASE + (2 - plci->li_bchannel_id);
+                       if (!(plci->B1_facilities & B1_FACILITY_MIXER))
+                       {
+                               li_config_table[j].flag_table[i] |= LI_FLAG_CONFERENCE | LI_FLAG_MIX;
+                               li_config_table[i].flag_table[j] |= LI_FLAG_CONFERENCE | LI_FLAG_MONITOR;
+                       }
+                       if (a->manufacturer_features & MANUFACTURER_FEATURE_SLAVE_CODEC)
+                       {
+                               li_config_table[k].flag_table[i] |= LI_FLAG_CONFERENCE | LI_FLAG_MIX;
+                               li_config_table[i].flag_table[k] |= LI_FLAG_CONFERENCE | LI_FLAG_MONITOR;
+                               li_config_table[k].flag_table[j] |= LI_FLAG_CONFERENCE;
+                               li_config_table[j].flag_table[k] |= LI_FLAG_CONFERENCE;
+                       }
+                       mixer_calculate_coefs(a);
+                       li_config_table[i].curchnl = li_config_table[i].channel;
+                       li_config_table[j].curchnl = li_config_table[j].channel;
+                       if (a->manufacturer_features & MANUFACTURER_FEATURE_SLAVE_CODEC)
+                               li_config_table[k].curchnl = li_config_table[k].channel;
+                       break;
+
+               case ADV_VOICE_WRITE_DEACTIVATION:
+                       for (j = 0; j < li_total_channels; j++)
+                       {
+                               li_config_table[i].flag_table[j] = 0;
+                               li_config_table[j].flag_table[i] = 0;
+                       }
+                       k = a->li_base + MIXER_IC_CHANNEL_BASE + (plci->li_bchannel_id - 1);
+                       for (j = 0; j < li_total_channels; j++)
+                       {
+                               li_config_table[k].flag_table[j] = 0;
+                               li_config_table[j].flag_table[k] = 0;
+                       }
+                       if (a->manufacturer_features & MANUFACTURER_FEATURE_SLAVE_CODEC)
+                       {
+                               k = a->li_base + MIXER_IC_CHANNEL_BASE + (2 - plci->li_bchannel_id);
+                               for (j = 0; j < li_total_channels; j++)
+                               {
+                                       li_config_table[k].flag_table[j] = 0;
+                                       li_config_table[j].flag_table[k] = 0;
+                               }
+                       }
+                       mixer_calculate_coefs(a);
+                       break;
+               }
+               if (plci->B1_facilities & B1_FACILITY_MIXER)
+               {
+                       w = 0;
+                       if (ADV_VOICE_NEW_COEF_BASE + sizeof(word) <= a->adv_voice_coef_length)
+                               w = GET_WORD(a->adv_voice_coef_buffer + ADV_VOICE_NEW_COEF_BASE);
+                       if (li_config_table[i].channel & LI_CHANNEL_TX_DATA)
+                               w |= MIXER_FEATURE_ENABLE_TX_DATA;
+                       if (li_config_table[i].channel & LI_CHANNEL_RX_DATA)
+                               w |= MIXER_FEATURE_ENABLE_RX_DATA;
+                       *(p++) = (byte) w;
+                       *(p++) = (byte)(w >> 8);
+                       for (j = 0; j < sizeof(ch_map); j += 2)
+                       {
+                               ch_map[j] = (byte)(j + (plci->li_bchannel_id - 1));
+                               ch_map[j + 1] = (byte)(j + (2 - plci->li_bchannel_id));
+                       }
+                       for (n = 0; n < ARRAY_SIZE(mixer_write_prog_bri); n++)
+                       {
+                               i = a->li_base + ch_map[mixer_write_prog_bri[n].to_ch];
+                               j = a->li_base + ch_map[mixer_write_prog_bri[n].from_ch];
+                               if (li_config_table[i].channel & li_config_table[j].channel & LI_CHANNEL_INVOLVED)
+                               {
+                                       *(p++) = ((li_config_table[i].coef_table[j] & mixer_write_prog_bri[n].mask) ? 0x80 : 0x01);
+                                       w = ((li_config_table[i].coef_table[j] & 0xf) ^ (li_config_table[i].coef_table[j] >> 4));
+                                       li_config_table[i].coef_table[j] ^= (w & mixer_write_prog_bri[n].mask) << 4;
+                               }
+                               else
+                               {
+                                       *(p++) = (ADV_VOICE_NEW_COEF_BASE + sizeof(word) + n < a->adv_voice_coef_length) ?
+                                               a->adv_voice_coef_buffer[ADV_VOICE_NEW_COEF_BASE + sizeof(word) + n] : 0x00;
+                               }
+                       }
+               }
+               else
+               {
+                       for (i = ADV_VOICE_NEW_COEF_BASE; i < a->adv_voice_coef_length; i++)
+                               *(p++) = a->adv_voice_coef_buffer[i];
+               }
+       }
+       else
+
+       {
+               for (i = ADV_VOICE_NEW_COEF_BASE; i < a->adv_voice_coef_length; i++)
+                       *(p++) = a->adv_voice_coef_buffer[i];
+       }
+       coef_buffer[0] = (p - coef_buffer) - 1;
+       add_p(plci, FTY, coef_buffer);
+       sig_req(plci, TEL_CTRL, 0);
+       send_req(plci);
+}
+
+
+static void adv_voice_clear_config(PLCI *plci)
+{
+       DIVA_CAPI_ADAPTER *a;
+
+       word i, j;
+
+
+       dbug(1, dprintf("[%06lx] %s,%d: adv_voice_clear_config",
+                       (dword)((plci->Id << 8) | UnMapController(plci->adapter->Id)),
+                       (char *)(FILE_), __LINE__));
+
+       a = plci->adapter;
+       if ((plci->tel == ADV_VOICE) && (plci == a->AdvSignalPLCI))
+       {
+               a->adv_voice_coef_length = 0;
+
+               if (!a->li_pri && (plci->li_bchannel_id != 0)
+                   && (li_config_table[a->li_base + (plci->li_bchannel_id - 1)].plci == plci))
+               {
+                       i = a->li_base + (plci->li_bchannel_id - 1);
+                       li_config_table[i].curchnl = 0;
+                       li_config_table[i].channel = 0;
+                       li_config_table[i].chflags = 0;
+                       for (j = 0; j < li_total_channels; j++)
+                       {
+                               li_config_table[i].flag_table[j] = 0;
+                               li_config_table[j].flag_table[i] = 0;
+                               li_config_table[i].coef_table[j] = 0;
+                               li_config_table[j].coef_table[i] = 0;
+                       }
+                       li_config_table[i].coef_table[i] |= LI_COEF_CH_PC_SET | LI_COEF_PC_CH_SET;
+                       i = a->li_base + MIXER_IC_CHANNEL_BASE + (plci->li_bchannel_id - 1);
+                       li_config_table[i].curchnl = 0;
+                       li_config_table[i].channel = 0;
+                       li_config_table[i].chflags = 0;
+                       for (j = 0; j < li_total_channels; j++)
+                       {
+                               li_config_table[i].flag_table[j] = 0;
+                               li_config_table[j].flag_table[i] = 0;
+                               li_config_table[i].coef_table[j] = 0;
+                               li_config_table[j].coef_table[i] = 0;
+                       }
+                       if (a->manufacturer_features & MANUFACTURER_FEATURE_SLAVE_CODEC)
+                       {
+                               i = a->li_base + MIXER_IC_CHANNEL_BASE + (2 - plci->li_bchannel_id);
+                               li_config_table[i].curchnl = 0;
+                               li_config_table[i].channel = 0;
+                               li_config_table[i].chflags = 0;
+                               for (j = 0; j < li_total_channels; j++)
+                               {
+                                       li_config_table[i].flag_table[j] = 0;
+                                       li_config_table[j].flag_table[i] = 0;
+                                       li_config_table[i].coef_table[j] = 0;
+                                       li_config_table[j].coef_table[i] = 0;
+                               }
+                       }
+               }
+
+       }
+}
+
+
+static void adv_voice_prepare_switch(dword Id, PLCI *plci)
+{
+
+       dbug(1, dprintf("[%06lx] %s,%d: adv_voice_prepare_switch",
+                       UnMapId(Id), (char *)(FILE_), __LINE__));
+
+}
+
+
+static word adv_voice_save_config(dword Id, PLCI *plci, byte Rc)
+{
+
+       dbug(1, dprintf("[%06lx] %s,%d: adv_voice_save_config %02x %d",
+                       UnMapId(Id), (char *)(FILE_), __LINE__, Rc, plci->adjust_b_state));
+
+       return (GOOD);
+}
+
+
+static word adv_voice_restore_config(dword Id, PLCI *plci, byte Rc)
+{
+       DIVA_CAPI_ADAPTER *a;
+       word Info;
 
-  Info = GOOD;
-  a = plci->adapter;
-  if ((plci->B1_facilities & B1_FACILITY_VOICE)
-   && (plci->tel == ADV_VOICE) && (plci == a->AdvSignalPLCI))
-  {
-    switch (plci->adjust_b_state)
-    {
-    case ADJUST_B_RESTORE_VOICE_1:
-      plci->internal_command = plci->adjust_b_command;
-      if (plci->sig_req)
-      {
-        plci->adjust_b_state = ADJUST_B_RESTORE_VOICE_1;
-        break;
-      }
-      adv_voice_write_coefs (plci, ADV_VOICE_WRITE_UPDATE);
-      plci->adjust_b_state = ADJUST_B_RESTORE_VOICE_2;
-      break;
-    case ADJUST_B_RESTORE_VOICE_2:
-      if ((Rc != OK) && (Rc != OK_FC))
-      {
-        dbug (1, dprintf ("[%06lx] %s,%d: Restore voice config failed %02x",
-          UnMapId (Id), (char   *)(FILE_), __LINE__, Rc));
-        Info = _WRONG_STATE;
-        break;
-      }
-      break;
-    }
-  }
-  return (Info);
+       dbug(1, dprintf("[%06lx] %s,%d: adv_voice_restore_config %02x %d",
+                       UnMapId(Id), (char *)(FILE_), __LINE__, Rc, plci->adjust_b_state));
+
+       Info = GOOD;
+       a = plci->adapter;
+       if ((plci->B1_facilities & B1_FACILITY_VOICE)
+           && (plci->tel == ADV_VOICE) && (plci == a->AdvSignalPLCI))
+       {
+               switch (plci->adjust_b_state)
+               {
+               case ADJUST_B_RESTORE_VOICE_1:
+                       plci->internal_command = plci->adjust_b_command;
+                       if (plci->sig_req)
+                       {
+                               plci->adjust_b_state = ADJUST_B_RESTORE_VOICE_1;
+                               break;
+                       }
+                       adv_voice_write_coefs(plci, ADV_VOICE_WRITE_UPDATE);
+                       plci->adjust_b_state = ADJUST_B_RESTORE_VOICE_2;
+                       break;
+               case ADJUST_B_RESTORE_VOICE_2:
+                       if ((Rc != OK) && (Rc != OK_FC))
+                       {
+                               dbug(1, dprintf("[%06lx] %s,%d: Restore voice config failed %02x",
+                                               UnMapId(Id), (char *)(FILE_), __LINE__, Rc));
+                               Info = _WRONG_STATE;
+                               break;
+                       }
+                       break;
+               }
+       }
+       return (Info);
 }
 
 
@@ -13354,1373 +13354,1373 @@ static word adv_voice_restore_config (dword Id, PLCI   *plci, byte Rc)
 
 static byte b1_facilities_table[] =
 {
-  0x00,  /* 0  No bchannel resources      */
-  0x00,  /* 1  Codec (automatic law)      */
-  0x00,  /* 2  Codec (A-law)              */
-  0x00,  /* 3  Codec (y-law)              */
-  0x00,  /* 4  HDLC for X.21              */
-  0x00,  /* 5  HDLC                       */
-  0x00,  /* 6  External Device 0          */
-  0x00,  /* 7  External Device 1          */
-  0x00,  /* 8  HDLC 56k                   */
-  0x00,  /* 9  Transparent                */
-  0x00,  /* 10 Loopback to network        */
-  0x00,  /* 11 Test pattern to net        */
-  0x00,  /* 12 Rate adaptation sync       */
-  0x00,  /* 13 Rate adaptation async      */
-  0x00,  /* 14 R-Interface                */
-  0x00,  /* 15 HDLC 128k leased line      */
-  0x00,  /* 16 FAX                        */
-  0x00,  /* 17 Modem async                */
-  0x00,  /* 18 Modem sync HDLC            */
-  0x00,  /* 19 V.110 async HDLC           */
-  0x12,  /* 20 Adv voice (Trans,mixer)    */
-  0x00,  /* 21 Codec connected to IC      */
-  0x0c,  /* 22 Trans,DTMF                 */
-  0x1e,  /* 23 Trans,DTMF+mixer           */
-  0x1f,  /* 24 Trans,DTMF+mixer+local     */
-  0x13,  /* 25 Trans,mixer+local          */
-  0x12,  /* 26 HDLC,mixer                 */
-  0x12,  /* 27 HDLC 56k,mixer             */
-  0x2c,  /* 28 Trans,LEC+DTMF             */
-  0x3e,  /* 29 Trans,LEC+DTMF+mixer       */
-  0x3f,  /* 30 Trans,LEC+DTMF+mixer+local */
-  0x2c,  /* 31 RTP,LEC+DTMF               */
-  0x3e,  /* 32 RTP,LEC+DTMF+mixer         */
-  0x3f,  /* 33 RTP,LEC+DTMF+mixer+local   */
-  0x00,  /* 34 Signaling task             */
-  0x00,  /* 35 PIAFS                      */
-  0x0c,  /* 36 Trans,DTMF+TONE            */
-  0x1e,  /* 37 Trans,DTMF+TONE+mixer      */
-  0x1f   /* 38 Trans,DTMF+TONE+mixer+local*/
+       0x00,  /* 0  No bchannel resources      */
+       0x00,  /* 1  Codec (automatic law)      */
+       0x00,  /* 2  Codec (A-law)              */
+       0x00,  /* 3  Codec (y-law)              */
+       0x00,  /* 4  HDLC for X.21              */
+       0x00,  /* 5  HDLC                       */
+       0x00,  /* 6  External Device 0          */
+       0x00,  /* 7  External Device 1          */
+       0x00,  /* 8  HDLC 56k                   */
+       0x00,  /* 9  Transparent                */
+       0x00,  /* 10 Loopback to network        */
+       0x00,  /* 11 Test pattern to net        */
+       0x00,  /* 12 Rate adaptation sync       */
+       0x00,  /* 13 Rate adaptation async      */
+       0x00,  /* 14 R-Interface                */
+       0x00,  /* 15 HDLC 128k leased line      */
+       0x00,  /* 16 FAX                        */
+       0x00,  /* 17 Modem async                */
+       0x00,  /* 18 Modem sync HDLC            */
+       0x00,  /* 19 V.110 async HDLC           */
+       0x12,  /* 20 Adv voice (Trans,mixer)    */
+       0x00,  /* 21 Codec connected to IC      */
+       0x0c,  /* 22 Trans,DTMF                 */
+       0x1e,  /* 23 Trans,DTMF+mixer           */
+       0x1f,  /* 24 Trans,DTMF+mixer+local     */
+       0x13,  /* 25 Trans,mixer+local          */
+       0x12,  /* 26 HDLC,mixer                 */
+       0x12,  /* 27 HDLC 56k,mixer             */
+       0x2c,  /* 28 Trans,LEC+DTMF             */
+       0x3e,  /* 29 Trans,LEC+DTMF+mixer       */
+       0x3f,  /* 30 Trans,LEC+DTMF+mixer+local */
+       0x2c,  /* 31 RTP,LEC+DTMF               */
+       0x3e,  /* 32 RTP,LEC+DTMF+mixer         */
+       0x3f,  /* 33 RTP,LEC+DTMF+mixer+local   */
+       0x00,  /* 34 Signaling task             */
+       0x00,  /* 35 PIAFS                      */
+       0x0c,  /* 36 Trans,DTMF+TONE            */
+       0x1e,  /* 37 Trans,DTMF+TONE+mixer      */
+       0x1f   /* 38 Trans,DTMF+TONE+mixer+local*/
 };
 
 
-static word get_b1_facilities (PLCI   * plci, byte b1_resource)
+static word get_b1_facilities(PLCI *plci, byte b1_resource)
 {
-  word b1_facilities;
+       word b1_facilities;
 
-  b1_facilities = b1_facilities_table[b1_resource];
-  if ((b1_resource == 9) || (b1_resource == 20) || (b1_resource == 25))
-  {
+       b1_facilities = b1_facilities_table[b1_resource];
+       if ((b1_resource == 9) || (b1_resource == 20) || (b1_resource == 25))
+       {
 
-    if (!(((plci->requested_options_conn | plci->requested_options) & (1L << PRIVATE_DTMF_TONE))
-       || (plci->appl && (plci->adapter->requested_options_table[plci->appl->Id-1] & (1L << PRIVATE_DTMF_TONE)))))
+               if (!(((plci->requested_options_conn | plci->requested_options) & (1L << PRIVATE_DTMF_TONE))
+                     || (plci->appl && (plci->adapter->requested_options_table[plci->appl->Id - 1] & (1L << PRIVATE_DTMF_TONE)))))
 
-    {
-      if (plci->adapter->manufacturer_features & MANUFACTURER_FEATURE_SOFTDTMF_SEND)
-        b1_facilities |= B1_FACILITY_DTMFX;
-      if (plci->adapter->manufacturer_features & MANUFACTURER_FEATURE_SOFTDTMF_RECEIVE)
-        b1_facilities |= B1_FACILITY_DTMFR;
-    }
-  }
-  if ((b1_resource == 17) || (b1_resource == 18))
-  {
-    if (plci->adapter->manufacturer_features & (MANUFACTURER_FEATURE_V18 | MANUFACTURER_FEATURE_VOWN))
-      b1_facilities |= B1_FACILITY_DTMFX | B1_FACILITY_DTMFR;
-  }
+               {
+                       if (plci->adapter->manufacturer_features & MANUFACTURER_FEATURE_SOFTDTMF_SEND)
+                               b1_facilities |= B1_FACILITY_DTMFX;
+                       if (plci->adapter->manufacturer_features & MANUFACTURER_FEATURE_SOFTDTMF_RECEIVE)
+                               b1_facilities |= B1_FACILITY_DTMFR;
+               }
+       }
+       if ((b1_resource == 17) || (b1_resource == 18))
+       {
+               if (plci->adapter->manufacturer_features & (MANUFACTURER_FEATURE_V18 | MANUFACTURER_FEATURE_VOWN))
+                       b1_facilities |= B1_FACILITY_DTMFX | B1_FACILITY_DTMFR;
+       }
 /*
-  dbug (1, dprintf ("[%06lx] %s,%d: get_b1_facilities %d %04x",
-    (dword)((plci->Id << 8) | UnMapController (plci->adapter->Id)),
-    (char far *)(FILE_), __LINE__, b1_resource, b1_facilites));
+  dbug (1, dprintf("[%06lx] %s,%d: get_b1_facilities %d %04x",
+  (dword)((plci->Id << 8) | UnMapController(plci->adapter->Id)),
+  (char far *)(FILE_), __LINE__, b1_resource, b1_facilites));
 */
-  return (b1_facilities);
-}
-
-
-static byte add_b1_facilities (PLCI   * plci, byte b1_resource, word b1_facilities)
-{
-  byte b;
-
-  switch (b1_resource)
-  {
-  case 5:
-  case 26:
-    if (b1_facilities & (B1_FACILITY_MIXER | B1_FACILITY_VOICE))
-      b = 26;
-    else
-      b = 5;
-    break;
-
-  case 8:
-  case 27:
-    if (b1_facilities & (B1_FACILITY_MIXER | B1_FACILITY_VOICE))
-      b = 27;
-    else
-      b = 8;
-    break;
-
-  case 9:
-  case 20:
-  case 22:
-  case 23:
-  case 24:
-  case 25:
-  case 28:
-  case 29:
-  case 30:
-  case 36:
-  case 37:
-  case 38:
-    if (b1_facilities & B1_FACILITY_EC)
-    {
-      if (b1_facilities & B1_FACILITY_LOCAL)
-        b = 30;
-      else if (b1_facilities & (B1_FACILITY_MIXER | B1_FACILITY_VOICE))
-        b = 29;
-      else
-        b = 28;
-    }
-
-    else if ((b1_facilities & (B1_FACILITY_DTMFX | B1_FACILITY_DTMFR | B1_FACILITY_MIXER))
-      && (((plci->requested_options_conn | plci->requested_options) & (1L << PRIVATE_DTMF_TONE))
-       || (plci->appl && (plci->adapter->requested_options_table[plci->appl->Id-1] & (1L << PRIVATE_DTMF_TONE)))))
-    {
-      if (b1_facilities & B1_FACILITY_LOCAL)
-        b = 38;
-      else if (b1_facilities & (B1_FACILITY_MIXER | B1_FACILITY_VOICE))
-        b = 37;
-      else
-        b = 36;
-    }
-
-    else if (((plci->adapter->manufacturer_features & MANUFACTURER_FEATURE_HARDDTMF)
-      && !(plci->adapter->manufacturer_features & MANUFACTURER_FEATURE_SOFTDTMF_RECEIVE))
-     || ((b1_facilities & B1_FACILITY_DTMFR)
-      && ((b1_facilities & B1_FACILITY_MIXER)
-       || !(plci->adapter->manufacturer_features & MANUFACTURER_FEATURE_SOFTDTMF_RECEIVE)))
-     || ((b1_facilities & B1_FACILITY_DTMFX)
-      && ((b1_facilities & B1_FACILITY_MIXER)
-       || !(plci->adapter->manufacturer_features & MANUFACTURER_FEATURE_SOFTDTMF_SEND))))
-    {
-      if (b1_facilities & B1_FACILITY_LOCAL)
-        b = 24;
-      else if (b1_facilities & (B1_FACILITY_MIXER | B1_FACILITY_VOICE))
-        b = 23;
-      else
-        b = 22;
-    }
-    else
-    {
-      if (b1_facilities & B1_FACILITY_LOCAL)
-        b = 25;
-      else if (b1_facilities & (B1_FACILITY_MIXER | B1_FACILITY_VOICE))
-        b = 20;
-      else
-        b = 9;
-    }
-    break;
-
-  case 31:
-  case 32:
-  case 33:
-    if (b1_facilities & B1_FACILITY_LOCAL)
-      b = 33;
-    else if (b1_facilities & (B1_FACILITY_MIXER | B1_FACILITY_VOICE))
-      b = 32;
-    else
-      b = 31;
-    break;
-
-  default:
-    b = b1_resource;
-  }
-  dbug (1, dprintf ("[%06lx] %s,%d: add_b1_facilities %d %04x %d %04x",
-    (dword)((plci->Id << 8) | UnMapController (plci->adapter->Id)),
-    (char   *)(FILE_), __LINE__,
-    b1_resource, b1_facilities, b, get_b1_facilities (plci, b)));
-  return (b);
-}
-
-
-static void adjust_b1_facilities (PLCI   *plci, byte new_b1_resource, word new_b1_facilities)
-{
-  word removed_facilities;
-
-  dbug (1, dprintf ("[%06lx] %s,%d: adjust_b1_facilities %d %04x %04x",
-    (dword)((plci->Id << 8) | UnMapController (plci->adapter->Id)),
-    (char   *)(FILE_), __LINE__, new_b1_resource, new_b1_facilities,
-    new_b1_facilities & get_b1_facilities (plci, new_b1_resource)));
-
-  new_b1_facilities &= get_b1_facilities (plci, new_b1_resource);
-  removed_facilities = plci->B1_facilities & ~new_b1_facilities;
-
-  if (removed_facilities & B1_FACILITY_EC)
-    ec_clear_config (plci);
-
-
-  if (removed_facilities & B1_FACILITY_DTMFR)
-  {
-    dtmf_rec_clear_config (plci);
-    dtmf_parameter_clear_config (plci);
-  }
-  if (removed_facilities & B1_FACILITY_DTMFX)
-    dtmf_send_clear_config (plci);
-
-
-  if (removed_facilities & B1_FACILITY_MIXER)
-    mixer_clear_config (plci);
-
-  if (removed_facilities & B1_FACILITY_VOICE)
-    adv_voice_clear_config (plci);
-  plci->B1_facilities = new_b1_facilities;
-}
-
-
-static void adjust_b_clear (PLCI   *plci)
-{
-
-  dbug (1, dprintf ("[%06lx] %s,%d: adjust_b_clear",
-    (dword)((plci->Id << 8) | UnMapController (plci->adapter->Id)),
-    (char   *)(FILE_), __LINE__));
-
-  plci->adjust_b_restore = false;
-}
-
-
-static word adjust_b_process (dword Id, PLCI   *plci, byte Rc)
-{
-  word Info;
-  byte b1_resource;
-  NCCI   * ncci_ptr;
-    API_PARSE bp[2];
-
-  dbug (1, dprintf ("[%06lx] %s,%d: adjust_b_process %02x %d",
-    UnMapId (Id), (char   *)(FILE_), __LINE__, Rc, plci->adjust_b_state));
-
-  Info = GOOD;
-  switch (plci->adjust_b_state)
-  {
-  case ADJUST_B_START:
-    if ((plci->adjust_b_parms_msg == NULL)
-     && (plci->adjust_b_mode & ADJUST_B_MODE_SWITCH_L1)
-     && ((plci->adjust_b_mode & ~(ADJUST_B_MODE_SAVE | ADJUST_B_MODE_SWITCH_L1 |
-      ADJUST_B_MODE_NO_RESOURCE | ADJUST_B_MODE_RESTORE)) == 0))
-    {
-      b1_resource = (plci->adjust_b_mode == ADJUST_B_MODE_NO_RESOURCE) ?
-        0 : add_b1_facilities (plci, plci->B1_resource, plci->adjust_b_facilities);
-      if (b1_resource == plci->B1_resource)
-      {
-        adjust_b1_facilities (plci, b1_resource, plci->adjust_b_facilities);
-        break;
-      }
-      if (plci->adjust_b_facilities & ~get_b1_facilities (plci, b1_resource))
-      {
-        dbug (1, dprintf ("[%06lx] %s,%d: Adjust B nonsupported facilities %d %d %04x",
-          UnMapId (Id), (char   *)(FILE_), __LINE__,
-          plci->B1_resource, b1_resource, plci->adjust_b_facilities));
-        Info = _WRONG_STATE;
-        break;
-      }
-    }
-    if (plci->adjust_b_mode & ADJUST_B_MODE_SAVE)
-    {
-
-      mixer_prepare_switch (Id, plci);
-
-
-      dtmf_prepare_switch (Id, plci);
-      dtmf_parameter_prepare_switch (Id, plci);
-
-
-      ec_prepare_switch (Id, plci);
-
-      adv_voice_prepare_switch (Id, plci);
-    }
-    plci->adjust_b_state = ADJUST_B_SAVE_MIXER_1;
-    Rc = OK;
-  case ADJUST_B_SAVE_MIXER_1:
-    if (plci->adjust_b_mode & ADJUST_B_MODE_SAVE)
-    {
-
-      Info = mixer_save_config (Id, plci, Rc);
-      if ((Info != GOOD) || plci->internal_command)
-        break;
-
-    }
-    plci->adjust_b_state = ADJUST_B_SAVE_DTMF_1;
-    Rc = OK;
-  case ADJUST_B_SAVE_DTMF_1:
-    if (plci->adjust_b_mode & ADJUST_B_MODE_SAVE)
-    {
-
-      Info = dtmf_save_config (Id, plci, Rc);
-      if ((Info != GOOD) || plci->internal_command)
-        break;
-
-    }
-    plci->adjust_b_state = ADJUST_B_REMOVE_L23_1;
-  case ADJUST_B_REMOVE_L23_1:
-    if ((plci->adjust_b_mode & ADJUST_B_MODE_REMOVE_L23)
-     && plci->NL.Id && !plci->nl_remove_id)
-    {
-      plci->internal_command = plci->adjust_b_command;
-      if (plci->adjust_b_ncci != 0)
-      {
-        ncci_ptr = &(plci->adapter->ncci[plci->adjust_b_ncci]);
-        while (ncci_ptr->data_pending)
-        {
-          plci->data_sent_ptr = ncci_ptr->DBuffer[ncci_ptr->data_out].P;
-          data_rc (plci, plci->adapter->ncci_ch[plci->adjust_b_ncci]);
-        }
-        while (ncci_ptr->data_ack_pending)
-          data_ack (plci, plci->adapter->ncci_ch[plci->adjust_b_ncci]);
-      }
-      nl_req_ncci (plci, REMOVE,
-        (byte)((plci->adjust_b_mode & ADJUST_B_MODE_CONNECT) ? plci->adjust_b_ncci : 0));
-      send_req (plci);
-      plci->adjust_b_state = ADJUST_B_REMOVE_L23_2;
-      break;
-    }
-    plci->adjust_b_state = ADJUST_B_REMOVE_L23_2;
-    Rc = OK;
-  case ADJUST_B_REMOVE_L23_2:
-    if ((Rc != OK) && (Rc != OK_FC))
-    {
-      dbug (1, dprintf ("[%06lx] %s,%d: Adjust B remove failed %02x",
-        UnMapId (Id), (char   *)(FILE_), __LINE__, Rc));
-      Info = _WRONG_STATE;
-      break;
-    }
-    if (plci->adjust_b_mode & ADJUST_B_MODE_REMOVE_L23)
-    {
-      if (plci_nl_busy (plci))
-      {
-        plci->internal_command = plci->adjust_b_command;
-        break;
-      }
-    }
-    plci->adjust_b_state = ADJUST_B_SAVE_EC_1;
-    Rc = OK;
-  case ADJUST_B_SAVE_EC_1:
-    if (plci->adjust_b_mode & ADJUST_B_MODE_SAVE)
-    {
-
-      Info = ec_save_config (Id, plci, Rc);
-      if ((Info != GOOD) || plci->internal_command)
-        break;
-
-    }
-    plci->adjust_b_state = ADJUST_B_SAVE_DTMF_PARAMETER_1;
-    Rc = OK;
-  case ADJUST_B_SAVE_DTMF_PARAMETER_1:
-    if (plci->adjust_b_mode & ADJUST_B_MODE_SAVE)
-    {
-
-      Info = dtmf_parameter_save_config (Id, plci, Rc);
-      if ((Info != GOOD) || plci->internal_command)
-        break;
-
-    }
-    plci->adjust_b_state = ADJUST_B_SAVE_VOICE_1;
-    Rc = OK;
-  case ADJUST_B_SAVE_VOICE_1:
-    if (plci->adjust_b_mode & ADJUST_B_MODE_SAVE)
-    {
-      Info = adv_voice_save_config (Id, plci, Rc);
-      if ((Info != GOOD) || plci->internal_command)
-        break;
-    }
-    plci->adjust_b_state = ADJUST_B_SWITCH_L1_1;
-  case ADJUST_B_SWITCH_L1_1:
-    if (plci->adjust_b_mode & ADJUST_B_MODE_SWITCH_L1)
-    {
-      if (plci->sig_req)
-      {
-        plci->internal_command = plci->adjust_b_command;
-        break;
-      }
-      if (plci->adjust_b_parms_msg != NULL)
-        api_load_msg (plci->adjust_b_parms_msg, bp);
-      else
-        api_load_msg (&plci->B_protocol, bp);
-      Info = add_b1 (plci, bp,
-        (word)((plci->adjust_b_mode & ADJUST_B_MODE_NO_RESOURCE) ? 2 : 0),
-        plci->adjust_b_facilities);
-      if (Info != GOOD)
-      {
-        dbug (1, dprintf ("[%06lx] %s,%d: Adjust B invalid L1 parameters %d %04x",
-          UnMapId (Id), (char   *)(FILE_), __LINE__,
-          plci->B1_resource, plci->adjust_b_facilities));
-        break;
-      }
-      plci->internal_command = plci->adjust_b_command;
-      sig_req (plci, RESOURCES, 0);
-      send_req (plci);
-      plci->adjust_b_state = ADJUST_B_SWITCH_L1_2;
-      break;
-    }
-    plci->adjust_b_state = ADJUST_B_SWITCH_L1_2;
-    Rc = OK;
-  case ADJUST_B_SWITCH_L1_2:
-    if ((Rc != OK) && (Rc != OK_FC))
-    {
-      dbug (1, dprintf ("[%06lx] %s,%d: Adjust B switch failed %02x %d %04x",
-        UnMapId (Id), (char   *)(FILE_), __LINE__,
-        Rc, plci->B1_resource, plci->adjust_b_facilities));
-      Info = _WRONG_STATE;
-      break;
-    }
-    plci->adjust_b_state = ADJUST_B_RESTORE_VOICE_1;
-    Rc = OK;
-  case ADJUST_B_RESTORE_VOICE_1:
-  case ADJUST_B_RESTORE_VOICE_2:
-    if (plci->adjust_b_mode & ADJUST_B_MODE_RESTORE)
-    {
-      Info = adv_voice_restore_config (Id, plci, Rc);
-      if ((Info != GOOD) || plci->internal_command)
-        break;
-    }
-    plci->adjust_b_state = ADJUST_B_RESTORE_DTMF_PARAMETER_1;
-    Rc = OK;
-  case ADJUST_B_RESTORE_DTMF_PARAMETER_1:
-  case ADJUST_B_RESTORE_DTMF_PARAMETER_2:
-    if (plci->adjust_b_mode & ADJUST_B_MODE_RESTORE)
-    {
-
-      Info = dtmf_parameter_restore_config (Id, plci, Rc);
-      if ((Info != GOOD) || plci->internal_command)
-        break;
-
-    }
-    plci->adjust_b_state = ADJUST_B_RESTORE_EC_1;
-    Rc = OK;
-  case ADJUST_B_RESTORE_EC_1:
-  case ADJUST_B_RESTORE_EC_2:
-    if (plci->adjust_b_mode & ADJUST_B_MODE_RESTORE)
-    {
-
-      Info = ec_restore_config (Id, plci, Rc);
-      if ((Info != GOOD) || plci->internal_command)
-        break;
-
-    }
-    plci->adjust_b_state = ADJUST_B_ASSIGN_L23_1;
-  case ADJUST_B_ASSIGN_L23_1:
-    if (plci->adjust_b_mode & ADJUST_B_MODE_ASSIGN_L23)
-    {
-      if (plci_nl_busy (plci))
-      {
-        plci->internal_command = plci->adjust_b_command;
-        break;
-      }
-      if (plci->adjust_b_mode & ADJUST_B_MODE_CONNECT)
-        plci->call_dir |= CALL_DIR_FORCE_OUTG_NL;
-      if (plci->adjust_b_parms_msg != NULL)
-        api_load_msg (plci->adjust_b_parms_msg, bp);
-      else
-        api_load_msg (&plci->B_protocol, bp);
-      Info = add_b23 (plci, bp);
-      if (Info != GOOD)
-      {
-        dbug (1, dprintf ("[%06lx] %s,%d: Adjust B invalid L23 parameters %04x",
-          UnMapId (Id), (char   *)(FILE_), __LINE__, Info));
-        break;
-      }
-      plci->internal_command = plci->adjust_b_command;
-      nl_req_ncci (plci, ASSIGN, 0);
-      send_req (plci);
-      plci->adjust_b_state = ADJUST_B_ASSIGN_L23_2;
-      break;
-    }
-    plci->adjust_b_state = ADJUST_B_ASSIGN_L23_2;
-    Rc = ASSIGN_OK;
-  case ADJUST_B_ASSIGN_L23_2:
-    if ((Rc != OK) && (Rc != OK_FC) && (Rc != ASSIGN_OK))
-    {
-      dbug (1, dprintf ("[%06lx] %s,%d: Adjust B assign failed %02x",
-        UnMapId (Id), (char   *)(FILE_), __LINE__, Rc));
-      Info = _WRONG_STATE;
-      break;
-    }
-    if (plci->adjust_b_mode & ADJUST_B_MODE_ASSIGN_L23)
-    {
-      if (Rc != ASSIGN_OK)
-      {
-        plci->internal_command = plci->adjust_b_command;
-        break;
-      }
-    }
-    if (plci->adjust_b_mode & ADJUST_B_MODE_USER_CONNECT)
-    {
-      plci->adjust_b_restore = true;
-      break;
-    }
-    plci->adjust_b_state = ADJUST_B_CONNECT_1;
-  case ADJUST_B_CONNECT_1:
-    if (plci->adjust_b_mode & ADJUST_B_MODE_CONNECT)
-    {
-      plci->internal_command = plci->adjust_b_command;
-      if (plci_nl_busy (plci))
-        break;
-      nl_req_ncci (plci, N_CONNECT, 0);
-      send_req (plci);
-      plci->adjust_b_state = ADJUST_B_CONNECT_2;
-      break;
-    }
-    plci->adjust_b_state = ADJUST_B_RESTORE_DTMF_1;
-    Rc = OK;
-  case ADJUST_B_CONNECT_2:
-  case ADJUST_B_CONNECT_3:
-  case ADJUST_B_CONNECT_4:
-    if ((Rc != OK) && (Rc != OK_FC) && (Rc != 0))
-    {
-      dbug (1, dprintf ("[%06lx] %s,%d: Adjust B connect failed %02x",
-        UnMapId (Id), (char   *)(FILE_), __LINE__, Rc));
-      Info = _WRONG_STATE;
-      break;
-    }
-    if (Rc == OK)
-    {
-      if (plci->adjust_b_mode & ADJUST_B_MODE_CONNECT)
-      {
-        get_ncci (plci, (byte)(Id >> 16), plci->adjust_b_ncci);
-        Id = (Id & 0xffff) | (((dword)(plci->adjust_b_ncci)) << 16);
-      }
-      if (plci->adjust_b_state == ADJUST_B_CONNECT_2)
-        plci->adjust_b_state = ADJUST_B_CONNECT_3;
-      else if (plci->adjust_b_state == ADJUST_B_CONNECT_4)
-        plci->adjust_b_state = ADJUST_B_RESTORE_DTMF_1;
-    }
-    else if (Rc == 0)
-    {
-      if (plci->adjust_b_state == ADJUST_B_CONNECT_2)
-        plci->adjust_b_state = ADJUST_B_CONNECT_4;
-      else if (plci->adjust_b_state == ADJUST_B_CONNECT_3)
-        plci->adjust_b_state = ADJUST_B_RESTORE_DTMF_1;
-    }
-    if (plci->adjust_b_state != ADJUST_B_RESTORE_DTMF_1)
-    {
-      plci->internal_command = plci->adjust_b_command;
-      break;
-    }
-    Rc = OK;
-  case ADJUST_B_RESTORE_DTMF_1:
-  case ADJUST_B_RESTORE_DTMF_2:
-    if (plci->adjust_b_mode & ADJUST_B_MODE_RESTORE)
-    {
-
-      Info = dtmf_restore_config (Id, plci, Rc);
-      if ((Info != GOOD) || plci->internal_command)
-        break;
-
-    }
-    plci->adjust_b_state = ADJUST_B_RESTORE_MIXER_1;
-    Rc = OK;
-  case ADJUST_B_RESTORE_MIXER_1:
-  case ADJUST_B_RESTORE_MIXER_2:
-  case ADJUST_B_RESTORE_MIXER_3:
-  case ADJUST_B_RESTORE_MIXER_4:
-  case ADJUST_B_RESTORE_MIXER_5:
-  case ADJUST_B_RESTORE_MIXER_6:
-  case ADJUST_B_RESTORE_MIXER_7:
-    if (plci->adjust_b_mode & ADJUST_B_MODE_RESTORE)
-    {
-
-      Info = mixer_restore_config (Id, plci, Rc);
-      if ((Info != GOOD) || plci->internal_command)
-        break;
-
-    }
-    plci->adjust_b_state = ADJUST_B_END;
-  case ADJUST_B_END:
-    break;
-  }
-  return (Info);
-}
-
-
-static void adjust_b1_resource (dword Id, PLCI   *plci, API_SAVE   *bp_msg, word b1_facilities, word internal_command)
-{
-
-  dbug (1, dprintf ("[%06lx] %s,%d: adjust_b1_resource %d %04x",
-    UnMapId (Id), (char   *)(FILE_), __LINE__,
-    plci->B1_resource, b1_facilities));
-
-  plci->adjust_b_parms_msg = bp_msg;
-  plci->adjust_b_facilities = b1_facilities;
-  plci->adjust_b_command = internal_command;
-  plci->adjust_b_ncci = (word)(Id >> 16);
-  if ((bp_msg == NULL) && (plci->B1_resource == 0))
-    plci->adjust_b_mode = ADJUST_B_MODE_SAVE | ADJUST_B_MODE_NO_RESOURCE | ADJUST_B_MODE_SWITCH_L1;
-  else
-    plci->adjust_b_mode = ADJUST_B_MODE_SAVE | ADJUST_B_MODE_SWITCH_L1 | ADJUST_B_MODE_RESTORE;
-  plci->adjust_b_state = ADJUST_B_START;
-  dbug (1, dprintf ("[%06lx] %s,%d: Adjust B1 resource %d %04x...",
-    UnMapId (Id), (char   *)(FILE_), __LINE__,
-    plci->B1_resource, b1_facilities));
-}
-
-
-static void adjust_b_restore (dword Id, PLCI   *plci, byte Rc)
-{
-  word internal_command;
-
-  dbug (1, dprintf ("[%06lx] %s,%d: adjust_b_restore %02x %04x",
-    UnMapId (Id), (char   *)(FILE_), __LINE__, Rc, plci->internal_command));
-
-  internal_command = plci->internal_command;
-  plci->internal_command = 0;
-  switch (internal_command)
-  {
-  default:
-    plci->command = 0;
-    if (plci->req_in != 0)
-    {
-      plci->internal_command = ADJUST_B_RESTORE_1;
-      break;
-    }
-    Rc = OK;
-  case ADJUST_B_RESTORE_1:
-    if ((Rc != OK) && (Rc != OK_FC))
-    {
-      dbug (1, dprintf ("[%06lx] %s,%d: Adjust B enqueued failed %02x",
-        UnMapId (Id), (char   *)(FILE_), __LINE__, Rc));
-    }
-    plci->adjust_b_parms_msg = NULL;
-    plci->adjust_b_facilities = plci->B1_facilities;
-    plci->adjust_b_command = ADJUST_B_RESTORE_2;
-    plci->adjust_b_ncci = (word)(Id >> 16);
-    plci->adjust_b_mode = ADJUST_B_MODE_RESTORE;
-    plci->adjust_b_state = ADJUST_B_START;
-    dbug (1, dprintf ("[%06lx] %s,%d: Adjust B restore...",
-      UnMapId (Id), (char   *)(FILE_), __LINE__));
-  case ADJUST_B_RESTORE_2:
-    if (adjust_b_process (Id, plci, Rc) != GOOD)
-    {
-      dbug (1, dprintf ("[%06lx] %s,%d: Adjust B restore failed",
-        UnMapId (Id), (char   *)(FILE_), __LINE__));
-    }
-    if (plci->internal_command)
-      break;
-    break;
-  }
-}
-
-
-static void reset_b3_command (dword Id, PLCI   *plci, byte Rc)
-{
-  word Info;
-  word internal_command;
-
-  dbug (1, dprintf ("[%06lx] %s,%d: reset_b3_command %02x %04x",
-    UnMapId (Id), (char   *)(FILE_), __LINE__, Rc, plci->internal_command));
-
-  Info = GOOD;
-  internal_command = plci->internal_command;
-  plci->internal_command = 0;
-  switch (internal_command)
-  {
-  default:
-    plci->command = 0;
-    plci->adjust_b_parms_msg = NULL;
-    plci->adjust_b_facilities = plci->B1_facilities;
-    plci->adjust_b_command = RESET_B3_COMMAND_1;
-    plci->adjust_b_ncci = (word)(Id >> 16);
-    plci->adjust_b_mode = ADJUST_B_MODE_REMOVE_L23 | ADJUST_B_MODE_ASSIGN_L23 | ADJUST_B_MODE_CONNECT;
-    plci->adjust_b_state = ADJUST_B_START;
-    dbug (1, dprintf ("[%06lx] %s,%d: Reset B3...",
-      UnMapId (Id), (char   *)(FILE_), __LINE__));
-  case RESET_B3_COMMAND_1:
-    Info = adjust_b_process (Id, plci, Rc);
-    if (Info != GOOD)
-    {
-      dbug (1, dprintf ("[%06lx] %s,%d: Reset failed",
-        UnMapId (Id), (char   *)(FILE_), __LINE__));
-      break;
-    }
-    if (plci->internal_command)
-      return;
-    break;
-  }
+       return (b1_facilities);
+}
+
+
+static byte add_b1_facilities(PLCI *plci, byte b1_resource, word b1_facilities)
+{
+       byte b;
+
+       switch (b1_resource)
+       {
+       case 5:
+       case 26:
+               if (b1_facilities & (B1_FACILITY_MIXER | B1_FACILITY_VOICE))
+                       b = 26;
+               else
+                       b = 5;
+               break;
+
+       case 8:
+       case 27:
+               if (b1_facilities & (B1_FACILITY_MIXER | B1_FACILITY_VOICE))
+                       b = 27;
+               else
+                       b = 8;
+               break;
+
+       case 9:
+       case 20:
+       case 22:
+       case 23:
+       case 24:
+       case 25:
+       case 28:
+       case 29:
+       case 30:
+       case 36:
+       case 37:
+       case 38:
+               if (b1_facilities & B1_FACILITY_EC)
+               {
+                       if (b1_facilities & B1_FACILITY_LOCAL)
+                               b = 30;
+                       else if (b1_facilities & (B1_FACILITY_MIXER | B1_FACILITY_VOICE))
+                               b = 29;
+                       else
+                               b = 28;
+               }
+
+               else if ((b1_facilities & (B1_FACILITY_DTMFX | B1_FACILITY_DTMFR | B1_FACILITY_MIXER))
+                        && (((plci->requested_options_conn | plci->requested_options) & (1L << PRIVATE_DTMF_TONE))
+                            || (plci->appl && (plci->adapter->requested_options_table[plci->appl->Id - 1] & (1L << PRIVATE_DTMF_TONE)))))
+               {
+                       if (b1_facilities & B1_FACILITY_LOCAL)
+                               b = 38;
+                       else if (b1_facilities & (B1_FACILITY_MIXER | B1_FACILITY_VOICE))
+                               b = 37;
+                       else
+                               b = 36;
+               }
+
+               else if (((plci->adapter->manufacturer_features & MANUFACTURER_FEATURE_HARDDTMF)
+                         && !(plci->adapter->manufacturer_features & MANUFACTURER_FEATURE_SOFTDTMF_RECEIVE))
+                        || ((b1_facilities & B1_FACILITY_DTMFR)
+                            && ((b1_facilities & B1_FACILITY_MIXER)
+                                || !(plci->adapter->manufacturer_features & MANUFACTURER_FEATURE_SOFTDTMF_RECEIVE)))
+                        || ((b1_facilities & B1_FACILITY_DTMFX)
+                            && ((b1_facilities & B1_FACILITY_MIXER)
+                                || !(plci->adapter->manufacturer_features & MANUFACTURER_FEATURE_SOFTDTMF_SEND))))
+               {
+                       if (b1_facilities & B1_FACILITY_LOCAL)
+                               b = 24;
+                       else if (b1_facilities & (B1_FACILITY_MIXER | B1_FACILITY_VOICE))
+                               b = 23;
+                       else
+                               b = 22;
+               }
+               else
+               {
+                       if (b1_facilities & B1_FACILITY_LOCAL)
+                               b = 25;
+                       else if (b1_facilities & (B1_FACILITY_MIXER | B1_FACILITY_VOICE))
+                               b = 20;
+                       else
+                               b = 9;
+               }
+               break;
+
+       case 31:
+       case 32:
+       case 33:
+               if (b1_facilities & B1_FACILITY_LOCAL)
+                       b = 33;
+               else if (b1_facilities & (B1_FACILITY_MIXER | B1_FACILITY_VOICE))
+                       b = 32;
+               else
+                       b = 31;
+               break;
+
+       default:
+               b = b1_resource;
+       }
+       dbug(1, dprintf("[%06lx] %s,%d: add_b1_facilities %d %04x %d %04x",
+                       (dword)((plci->Id << 8) | UnMapController(plci->adapter->Id)),
+                       (char *)(FILE_), __LINE__,
+                       b1_resource, b1_facilities, b, get_b1_facilities(plci, b)));
+       return (b);
+}
+
+
+static void adjust_b1_facilities(PLCI *plci, byte new_b1_resource, word new_b1_facilities)
+{
+       word removed_facilities;
+
+       dbug(1, dprintf("[%06lx] %s,%d: adjust_b1_facilities %d %04x %04x",
+                       (dword)((plci->Id << 8) | UnMapController(plci->adapter->Id)),
+                       (char *)(FILE_), __LINE__, new_b1_resource, new_b1_facilities,
+                       new_b1_facilities & get_b1_facilities(plci, new_b1_resource)));
+
+       new_b1_facilities &= get_b1_facilities(plci, new_b1_resource);
+       removed_facilities = plci->B1_facilities & ~new_b1_facilities;
+
+       if (removed_facilities & B1_FACILITY_EC)
+               ec_clear_config(plci);
+
+
+       if (removed_facilities & B1_FACILITY_DTMFR)
+       {
+               dtmf_rec_clear_config(plci);
+               dtmf_parameter_clear_config(plci);
+       }
+       if (removed_facilities & B1_FACILITY_DTMFX)
+               dtmf_send_clear_config(plci);
+
+
+       if (removed_facilities & B1_FACILITY_MIXER)
+               mixer_clear_config(plci);
+
+       if (removed_facilities & B1_FACILITY_VOICE)
+               adv_voice_clear_config(plci);
+       plci->B1_facilities = new_b1_facilities;
+}
+
+
+static void adjust_b_clear(PLCI *plci)
+{
+
+       dbug(1, dprintf("[%06lx] %s,%d: adjust_b_clear",
+                       (dword)((plci->Id << 8) | UnMapController(plci->adapter->Id)),
+                       (char *)(FILE_), __LINE__));
+
+       plci->adjust_b_restore = false;
+}
+
+
+static word adjust_b_process(dword Id, PLCI *plci, byte Rc)
+{
+       word Info;
+       byte b1_resource;
+       NCCI *ncci_ptr;
+       API_PARSE bp[2];
+
+       dbug(1, dprintf("[%06lx] %s,%d: adjust_b_process %02x %d",
+                       UnMapId(Id), (char *)(FILE_), __LINE__, Rc, plci->adjust_b_state));
+
+       Info = GOOD;
+       switch (plci->adjust_b_state)
+       {
+       case ADJUST_B_START:
+               if ((plci->adjust_b_parms_msg == NULL)
+                   && (plci->adjust_b_mode & ADJUST_B_MODE_SWITCH_L1)
+                   && ((plci->adjust_b_mode & ~(ADJUST_B_MODE_SAVE | ADJUST_B_MODE_SWITCH_L1 |
+                                                ADJUST_B_MODE_NO_RESOURCE | ADJUST_B_MODE_RESTORE)) == 0))
+               {
+                       b1_resource = (plci->adjust_b_mode == ADJUST_B_MODE_NO_RESOURCE) ?
+                               0 : add_b1_facilities(plci, plci->B1_resource, plci->adjust_b_facilities);
+                       if (b1_resource == plci->B1_resource)
+                       {
+                               adjust_b1_facilities(plci, b1_resource, plci->adjust_b_facilities);
+                               break;
+                       }
+                       if (plci->adjust_b_facilities & ~get_b1_facilities(plci, b1_resource))
+                       {
+                               dbug(1, dprintf("[%06lx] %s,%d: Adjust B nonsupported facilities %d %d %04x",
+                                               UnMapId(Id), (char *)(FILE_), __LINE__,
+                                               plci->B1_resource, b1_resource, plci->adjust_b_facilities));
+                               Info = _WRONG_STATE;
+                               break;
+                       }
+               }
+               if (plci->adjust_b_mode & ADJUST_B_MODE_SAVE)
+               {
+
+                       mixer_prepare_switch(Id, plci);
+
+
+                       dtmf_prepare_switch(Id, plci);
+                       dtmf_parameter_prepare_switch(Id, plci);
+
+
+                       ec_prepare_switch(Id, plci);
+
+                       adv_voice_prepare_switch(Id, plci);
+               }
+               plci->adjust_b_state = ADJUST_B_SAVE_MIXER_1;
+               Rc = OK;
+       case ADJUST_B_SAVE_MIXER_1:
+               if (plci->adjust_b_mode & ADJUST_B_MODE_SAVE)
+               {
+
+                       Info = mixer_save_config(Id, plci, Rc);
+                       if ((Info != GOOD) || plci->internal_command)
+                               break;
+
+               }
+               plci->adjust_b_state = ADJUST_B_SAVE_DTMF_1;
+               Rc = OK;
+       case ADJUST_B_SAVE_DTMF_1:
+               if (plci->adjust_b_mode & ADJUST_B_MODE_SAVE)
+               {
+
+                       Info = dtmf_save_config(Id, plci, Rc);
+                       if ((Info != GOOD) || plci->internal_command)
+                               break;
+
+               }
+               plci->adjust_b_state = ADJUST_B_REMOVE_L23_1;
+       case ADJUST_B_REMOVE_L23_1:
+               if ((plci->adjust_b_mode & ADJUST_B_MODE_REMOVE_L23)
+                   && plci->NL.Id && !plci->nl_remove_id)
+               {
+                       plci->internal_command = plci->adjust_b_command;
+                       if (plci->adjust_b_ncci != 0)
+                       {
+                               ncci_ptr = &(plci->adapter->ncci[plci->adjust_b_ncci]);
+                               while (ncci_ptr->data_pending)
+                               {
+                                       plci->data_sent_ptr = ncci_ptr->DBuffer[ncci_ptr->data_out].P;
+                                       data_rc(plci, plci->adapter->ncci_ch[plci->adjust_b_ncci]);
+                               }
+                               while (ncci_ptr->data_ack_pending)
+                                       data_ack(plci, plci->adapter->ncci_ch[plci->adjust_b_ncci]);
+                       }
+                       nl_req_ncci(plci, REMOVE,
+                                   (byte)((plci->adjust_b_mode & ADJUST_B_MODE_CONNECT) ? plci->adjust_b_ncci : 0));
+                       send_req(plci);
+                       plci->adjust_b_state = ADJUST_B_REMOVE_L23_2;
+                       break;
+               }
+               plci->adjust_b_state = ADJUST_B_REMOVE_L23_2;
+               Rc = OK;
+       case ADJUST_B_REMOVE_L23_2:
+               if ((Rc != OK) && (Rc != OK_FC))
+               {
+                       dbug(1, dprintf("[%06lx] %s,%d: Adjust B remove failed %02x",
+                                       UnMapId(Id), (char *)(FILE_), __LINE__, Rc));
+                       Info = _WRONG_STATE;
+                       break;
+               }
+               if (plci->adjust_b_mode & ADJUST_B_MODE_REMOVE_L23)
+               {
+                       if (plci_nl_busy(plci))
+                       {
+                               plci->internal_command = plci->adjust_b_command;
+                               break;
+                       }
+               }
+               plci->adjust_b_state = ADJUST_B_SAVE_EC_1;
+               Rc = OK;
+       case ADJUST_B_SAVE_EC_1:
+               if (plci->adjust_b_mode & ADJUST_B_MODE_SAVE)
+               {
+
+                       Info = ec_save_config(Id, plci, Rc);
+                       if ((Info != GOOD) || plci->internal_command)
+                               break;
+
+               }
+               plci->adjust_b_state = ADJUST_B_SAVE_DTMF_PARAMETER_1;
+               Rc = OK;
+       case ADJUST_B_SAVE_DTMF_PARAMETER_1:
+               if (plci->adjust_b_mode & ADJUST_B_MODE_SAVE)
+               {
+
+                       Info = dtmf_parameter_save_config(Id, plci, Rc);
+                       if ((Info != GOOD) || plci->internal_command)
+                               break;
+
+               }
+               plci->adjust_b_state = ADJUST_B_SAVE_VOICE_1;
+               Rc = OK;
+       case ADJUST_B_SAVE_VOICE_1:
+               if (plci->adjust_b_mode & ADJUST_B_MODE_SAVE)
+               {
+                       Info = adv_voice_save_config(Id, plci, Rc);
+                       if ((Info != GOOD) || plci->internal_command)
+                               break;
+               }
+               plci->adjust_b_state = ADJUST_B_SWITCH_L1_1;
+       case ADJUST_B_SWITCH_L1_1:
+               if (plci->adjust_b_mode & ADJUST_B_MODE_SWITCH_L1)
+               {
+                       if (plci->sig_req)
+                       {
+                               plci->internal_command = plci->adjust_b_command;
+                               break;
+                       }
+                       if (plci->adjust_b_parms_msg != NULL)
+                               api_load_msg(plci->adjust_b_parms_msg, bp);
+                       else
+                               api_load_msg(&plci->B_protocol, bp);
+                       Info = add_b1(plci, bp,
+                                     (word)((plci->adjust_b_mode & ADJUST_B_MODE_NO_RESOURCE) ? 2 : 0),
+                                     plci->adjust_b_facilities);
+                       if (Info != GOOD)
+                       {
+                               dbug(1, dprintf("[%06lx] %s,%d: Adjust B invalid L1 parameters %d %04x",
+                                               UnMapId(Id), (char *)(FILE_), __LINE__,
+                                               plci->B1_resource, plci->adjust_b_facilities));
+                               break;
+                       }
+                       plci->internal_command = plci->adjust_b_command;
+                       sig_req(plci, RESOURCES, 0);
+                       send_req(plci);
+                       plci->adjust_b_state = ADJUST_B_SWITCH_L1_2;
+                       break;
+               }
+               plci->adjust_b_state = ADJUST_B_SWITCH_L1_2;
+               Rc = OK;
+       case ADJUST_B_SWITCH_L1_2:
+               if ((Rc != OK) && (Rc != OK_FC))
+               {
+                       dbug(1, dprintf("[%06lx] %s,%d: Adjust B switch failed %02x %d %04x",
+                                       UnMapId(Id), (char *)(FILE_), __LINE__,
+                                       Rc, plci->B1_resource, plci->adjust_b_facilities));
+                       Info = _WRONG_STATE;
+                       break;
+               }
+               plci->adjust_b_state = ADJUST_B_RESTORE_VOICE_1;
+               Rc = OK;
+       case ADJUST_B_RESTORE_VOICE_1:
+       case ADJUST_B_RESTORE_VOICE_2:
+               if (plci->adjust_b_mode & ADJUST_B_MODE_RESTORE)
+               {
+                       Info = adv_voice_restore_config(Id, plci, Rc);
+                       if ((Info != GOOD) || plci->internal_command)
+                               break;
+               }
+               plci->adjust_b_state = ADJUST_B_RESTORE_DTMF_PARAMETER_1;
+               Rc = OK;
+       case ADJUST_B_RESTORE_DTMF_PARAMETER_1:
+       case ADJUST_B_RESTORE_DTMF_PARAMETER_2:
+               if (plci->adjust_b_mode & ADJUST_B_MODE_RESTORE)
+               {
+
+                       Info = dtmf_parameter_restore_config(Id, plci, Rc);
+                       if ((Info != GOOD) || plci->internal_command)
+                               break;
+
+               }
+               plci->adjust_b_state = ADJUST_B_RESTORE_EC_1;
+               Rc = OK;
+       case ADJUST_B_RESTORE_EC_1:
+       case ADJUST_B_RESTORE_EC_2:
+               if (plci->adjust_b_mode & ADJUST_B_MODE_RESTORE)
+               {
+
+                       Info = ec_restore_config(Id, plci, Rc);
+                       if ((Info != GOOD) || plci->internal_command)
+                               break;
+
+               }
+               plci->adjust_b_state = ADJUST_B_ASSIGN_L23_1;
+       case ADJUST_B_ASSIGN_L23_1:
+               if (plci->adjust_b_mode & ADJUST_B_MODE_ASSIGN_L23)
+               {
+                       if (plci_nl_busy(plci))
+                       {
+                               plci->internal_command = plci->adjust_b_command;
+                               break;
+                       }
+                       if (plci->adjust_b_mode & ADJUST_B_MODE_CONNECT)
+                               plci->call_dir |= CALL_DIR_FORCE_OUTG_NL;
+                       if (plci->adjust_b_parms_msg != NULL)
+                               api_load_msg(plci->adjust_b_parms_msg, bp);
+                       else
+                               api_load_msg(&plci->B_protocol, bp);
+                       Info = add_b23(plci, bp);
+                       if (Info != GOOD)
+                       {
+                               dbug(1, dprintf("[%06lx] %s,%d: Adjust B invalid L23 parameters %04x",
+                                               UnMapId(Id), (char *)(FILE_), __LINE__, Info));
+                               break;
+                       }
+                       plci->internal_command = plci->adjust_b_command;
+                       nl_req_ncci(plci, ASSIGN, 0);
+                       send_req(plci);
+                       plci->adjust_b_state = ADJUST_B_ASSIGN_L23_2;
+                       break;
+               }
+               plci->adjust_b_state = ADJUST_B_ASSIGN_L23_2;
+               Rc = ASSIGN_OK;
+       case ADJUST_B_ASSIGN_L23_2:
+               if ((Rc != OK) && (Rc != OK_FC) && (Rc != ASSIGN_OK))
+               {
+                       dbug(1, dprintf("[%06lx] %s,%d: Adjust B assign failed %02x",
+                                       UnMapId(Id), (char *)(FILE_), __LINE__, Rc));
+                       Info = _WRONG_STATE;
+                       break;
+               }
+               if (plci->adjust_b_mode & ADJUST_B_MODE_ASSIGN_L23)
+               {
+                       if (Rc != ASSIGN_OK)
+                       {
+                               plci->internal_command = plci->adjust_b_command;
+                               break;
+                       }
+               }
+               if (plci->adjust_b_mode & ADJUST_B_MODE_USER_CONNECT)
+               {
+                       plci->adjust_b_restore = true;
+                       break;
+               }
+               plci->adjust_b_state = ADJUST_B_CONNECT_1;
+       case ADJUST_B_CONNECT_1:
+               if (plci->adjust_b_mode & ADJUST_B_MODE_CONNECT)
+               {
+                       plci->internal_command = plci->adjust_b_command;
+                       if (plci_nl_busy(plci))
+                               break;
+                       nl_req_ncci(plci, N_CONNECT, 0);
+                       send_req(plci);
+                       plci->adjust_b_state = ADJUST_B_CONNECT_2;
+                       break;
+               }
+               plci->adjust_b_state = ADJUST_B_RESTORE_DTMF_1;
+               Rc = OK;
+       case ADJUST_B_CONNECT_2:
+       case ADJUST_B_CONNECT_3:
+       case ADJUST_B_CONNECT_4:
+               if ((Rc != OK) && (Rc != OK_FC) && (Rc != 0))
+               {
+                       dbug(1, dprintf("[%06lx] %s,%d: Adjust B connect failed %02x",
+                                       UnMapId(Id), (char *)(FILE_), __LINE__, Rc));
+                       Info = _WRONG_STATE;
+                       break;
+               }
+               if (Rc == OK)
+               {
+                       if (plci->adjust_b_mode & ADJUST_B_MODE_CONNECT)
+                       {
+                               get_ncci(plci, (byte)(Id >> 16), plci->adjust_b_ncci);
+                               Id = (Id & 0xffff) | (((dword)(plci->adjust_b_ncci)) << 16);
+                       }
+                       if (plci->adjust_b_state == ADJUST_B_CONNECT_2)
+                               plci->adjust_b_state = ADJUST_B_CONNECT_3;
+                       else if (plci->adjust_b_state == ADJUST_B_CONNECT_4)
+                               plci->adjust_b_state = ADJUST_B_RESTORE_DTMF_1;
+               }
+               else if (Rc == 0)
+               {
+                       if (plci->adjust_b_state == ADJUST_B_CONNECT_2)
+                               plci->adjust_b_state = ADJUST_B_CONNECT_4;
+                       else if (plci->adjust_b_state == ADJUST_B_CONNECT_3)
+                               plci->adjust_b_state = ADJUST_B_RESTORE_DTMF_1;
+               }
+               if (plci->adjust_b_state != ADJUST_B_RESTORE_DTMF_1)
+               {
+                       plci->internal_command = plci->adjust_b_command;
+                       break;
+               }
+               Rc = OK;
+       case ADJUST_B_RESTORE_DTMF_1:
+       case ADJUST_B_RESTORE_DTMF_2:
+               if (plci->adjust_b_mode & ADJUST_B_MODE_RESTORE)
+               {
+
+                       Info = dtmf_restore_config(Id, plci, Rc);
+                       if ((Info != GOOD) || plci->internal_command)
+                               break;
+
+               }
+               plci->adjust_b_state = ADJUST_B_RESTORE_MIXER_1;
+               Rc = OK;
+       case ADJUST_B_RESTORE_MIXER_1:
+       case ADJUST_B_RESTORE_MIXER_2:
+       case ADJUST_B_RESTORE_MIXER_3:
+       case ADJUST_B_RESTORE_MIXER_4:
+       case ADJUST_B_RESTORE_MIXER_5:
+       case ADJUST_B_RESTORE_MIXER_6:
+       case ADJUST_B_RESTORE_MIXER_7:
+               if (plci->adjust_b_mode & ADJUST_B_MODE_RESTORE)
+               {
+
+                       Info = mixer_restore_config(Id, plci, Rc);
+                       if ((Info != GOOD) || plci->internal_command)
+                               break;
+
+               }
+               plci->adjust_b_state = ADJUST_B_END;
+       case ADJUST_B_END:
+               break;
+       }
+       return (Info);
+}
+
+
+static void adjust_b1_resource(dword Id, PLCI *plci, API_SAVE   *bp_msg, word b1_facilities, word internal_command)
+{
+
+       dbug(1, dprintf("[%06lx] %s,%d: adjust_b1_resource %d %04x",
+                       UnMapId(Id), (char *)(FILE_), __LINE__,
+                       plci->B1_resource, b1_facilities));
+
+       plci->adjust_b_parms_msg = bp_msg;
+       plci->adjust_b_facilities = b1_facilities;
+       plci->adjust_b_command = internal_command;
+       plci->adjust_b_ncci = (word)(Id >> 16);
+       if ((bp_msg == NULL) && (plci->B1_resource == 0))
+               plci->adjust_b_mode = ADJUST_B_MODE_SAVE | ADJUST_B_MODE_NO_RESOURCE | ADJUST_B_MODE_SWITCH_L1;
+       else
+               plci->adjust_b_mode = ADJUST_B_MODE_SAVE | ADJUST_B_MODE_SWITCH_L1 | ADJUST_B_MODE_RESTORE;
+       plci->adjust_b_state = ADJUST_B_START;
+       dbug(1, dprintf("[%06lx] %s,%d: Adjust B1 resource %d %04x...",
+                       UnMapId(Id), (char *)(FILE_), __LINE__,
+                       plci->B1_resource, b1_facilities));
+}
+
+
+static void adjust_b_restore(dword Id, PLCI *plci, byte Rc)
+{
+       word internal_command;
+
+       dbug(1, dprintf("[%06lx] %s,%d: adjust_b_restore %02x %04x",
+                       UnMapId(Id), (char *)(FILE_), __LINE__, Rc, plci->internal_command));
+
+       internal_command = plci->internal_command;
+       plci->internal_command = 0;
+       switch (internal_command)
+       {
+       default:
+               plci->command = 0;
+               if (plci->req_in != 0)
+               {
+                       plci->internal_command = ADJUST_B_RESTORE_1;
+                       break;
+               }
+               Rc = OK;
+       case ADJUST_B_RESTORE_1:
+               if ((Rc != OK) && (Rc != OK_FC))
+               {
+                       dbug(1, dprintf("[%06lx] %s,%d: Adjust B enqueued failed %02x",
+                                       UnMapId(Id), (char *)(FILE_), __LINE__, Rc));
+               }
+               plci->adjust_b_parms_msg = NULL;
+               plci->adjust_b_facilities = plci->B1_facilities;
+               plci->adjust_b_command = ADJUST_B_RESTORE_2;
+               plci->adjust_b_ncci = (word)(Id >> 16);
+               plci->adjust_b_mode = ADJUST_B_MODE_RESTORE;
+               plci->adjust_b_state = ADJUST_B_START;
+               dbug(1, dprintf("[%06lx] %s,%d: Adjust B restore...",
+                               UnMapId(Id), (char *)(FILE_), __LINE__));
+       case ADJUST_B_RESTORE_2:
+               if (adjust_b_process(Id, plci, Rc) != GOOD)
+               {
+                       dbug(1, dprintf("[%06lx] %s,%d: Adjust B restore failed",
+                                       UnMapId(Id), (char *)(FILE_), __LINE__));
+               }
+               if (plci->internal_command)
+                       break;
+               break;
+       }
+}
+
+
+static void reset_b3_command(dword Id, PLCI *plci, byte Rc)
+{
+       word Info;
+       word internal_command;
+
+       dbug(1, dprintf("[%06lx] %s,%d: reset_b3_command %02x %04x",
+                       UnMapId(Id), (char *)(FILE_), __LINE__, Rc, plci->internal_command));
+
+       Info = GOOD;
+       internal_command = plci->internal_command;
+       plci->internal_command = 0;
+       switch (internal_command)
+       {
+       default:
+               plci->command = 0;
+               plci->adjust_b_parms_msg = NULL;
+               plci->adjust_b_facilities = plci->B1_facilities;
+               plci->adjust_b_command = RESET_B3_COMMAND_1;
+               plci->adjust_b_ncci = (word)(Id >> 16);
+               plci->adjust_b_mode = ADJUST_B_MODE_REMOVE_L23 | ADJUST_B_MODE_ASSIGN_L23 | ADJUST_B_MODE_CONNECT;
+               plci->adjust_b_state = ADJUST_B_START;
+               dbug(1, dprintf("[%06lx] %s,%d: Reset B3...",
+                               UnMapId(Id), (char *)(FILE_), __LINE__));
+       case RESET_B3_COMMAND_1:
+               Info = adjust_b_process(Id, plci, Rc);
+               if (Info != GOOD)
+               {
+                       dbug(1, dprintf("[%06lx] %s,%d: Reset failed",
+                                       UnMapId(Id), (char *)(FILE_), __LINE__));
+                       break;
+               }
+               if (plci->internal_command)
+                       return;
+               break;
+       }
 /*  sendf (plci->appl, _RESET_B3_R | CONFIRM, Id, plci->number, "w", Info);*/
-  sendf(plci->appl,_RESET_B3_I,Id,0,"s","");
-}
-
-
-static void select_b_command (dword Id, PLCI   *plci, byte Rc)
-{
-  word Info;
-  word internal_command;
-  byte esc_chi[3];
-
-  dbug (1, dprintf ("[%06lx] %s,%d: select_b_command %02x %04x",
-    UnMapId (Id), (char   *)(FILE_), __LINE__, Rc, plci->internal_command));
-
-  Info = GOOD;
-  internal_command = plci->internal_command;
-  plci->internal_command = 0;
-  switch (internal_command)
-  {
-  default:
-    plci->command = 0;
-    plci->adjust_b_parms_msg = &plci->saved_msg;
-    if ((plci->tel == ADV_VOICE) && (plci == plci->adapter->AdvSignalPLCI))
-      plci->adjust_b_facilities = plci->B1_facilities | B1_FACILITY_VOICE;
-    else
-      plci->adjust_b_facilities = plci->B1_facilities & ~B1_FACILITY_VOICE;
-    plci->adjust_b_command = SELECT_B_COMMAND_1;
-    plci->adjust_b_ncci = (word)(Id >> 16);
-    if (plci->saved_msg.parms[0].length == 0)
-    {
-      plci->adjust_b_mode = ADJUST_B_MODE_SAVE | ADJUST_B_MODE_REMOVE_L23 | ADJUST_B_MODE_SWITCH_L1 |
-        ADJUST_B_MODE_NO_RESOURCE;
-    }
-    else
-    {
-      plci->adjust_b_mode = ADJUST_B_MODE_SAVE | ADJUST_B_MODE_REMOVE_L23 | ADJUST_B_MODE_SWITCH_L1 |
-        ADJUST_B_MODE_ASSIGN_L23 | ADJUST_B_MODE_USER_CONNECT | ADJUST_B_MODE_RESTORE;
-    }
-    plci->adjust_b_state = ADJUST_B_START;
-    dbug (1, dprintf ("[%06lx] %s,%d: Select B protocol...",
-      UnMapId (Id), (char   *)(FILE_), __LINE__));
-  case SELECT_B_COMMAND_1:
-    Info = adjust_b_process (Id, plci, Rc);
-    if (Info != GOOD)
-    {
-      dbug (1, dprintf ("[%06lx] %s,%d: Select B protocol failed",
-        UnMapId (Id), (char   *)(FILE_), __LINE__));
-      break;
-    }
-    if (plci->internal_command)
-      return;
-    if (plci->tel == ADV_VOICE)
-    {
-      esc_chi[0] = 0x02;
-      esc_chi[1] = 0x18;
-      esc_chi[2] = plci->b_channel;
-      SetVoiceChannel (plci->adapter->AdvCodecPLCI, esc_chi, plci->adapter);
-    }
-    break;
-  }
-  sendf (plci->appl, _SELECT_B_REQ | CONFIRM, Id, plci->number, "w", Info);
-}
-
-
-static void fax_connect_ack_command (dword Id, PLCI   *plci, byte Rc)
-{
-  word internal_command;
-
-  dbug (1, dprintf ("[%06lx] %s,%d: fax_connect_ack_command %02x %04x",
-    UnMapId (Id), (char   *)(FILE_), __LINE__, Rc, plci->internal_command));
-
-  internal_command = plci->internal_command;
-  plci->internal_command = 0;
-  switch (internal_command)
-  {
-  default:
-    plci->command = 0;
-  case FAX_CONNECT_ACK_COMMAND_1:
-    if (plci_nl_busy (plci))
-    {
-      plci->internal_command = FAX_CONNECT_ACK_COMMAND_1;
-      return;
-    }
-    plci->internal_command = FAX_CONNECT_ACK_COMMAND_2;
-    plci->NData[0].P = plci->fax_connect_info_buffer;
-    plci->NData[0].PLength = plci->fax_connect_info_length;
-    plci->NL.X = plci->NData;
-    plci->NL.ReqCh = 0;
-    plci->NL.Req = plci->nl_req = (byte) N_CONNECT_ACK;
-    plci->adapter->request (&plci->NL);
-    return;
-  case FAX_CONNECT_ACK_COMMAND_2:
-    if ((Rc != OK) && (Rc != OK_FC))
-    {
-      dbug (1, dprintf ("[%06lx] %s,%d: FAX issue CONNECT ACK failed %02x",
-        UnMapId (Id), (char   *)(FILE_), __LINE__, Rc));
-      break;
-    }
-  }
-  if ((plci->ncpi_state & NCPI_VALID_CONNECT_B3_ACT)
-   && !(plci->ncpi_state & NCPI_CONNECT_B3_ACT_SENT))
-  {
-    if (plci->B3_prot == 4)
-      sendf(plci->appl,_CONNECT_B3_ACTIVE_I,Id,0,"s","");
-    else
-      sendf(plci->appl,_CONNECT_B3_ACTIVE_I,Id,0,"S",plci->ncpi_buffer);
-    plci->ncpi_state |= NCPI_CONNECT_B3_ACT_SENT;
-  }
-}
-
-
-static void fax_edata_ack_command (dword Id, PLCI   *plci, byte Rc)
-{
-  word internal_command;
-
-  dbug (1, dprintf ("[%06lx] %s,%d: fax_edata_ack_command %02x %04x",
-    UnMapId (Id), (char   *)(FILE_), __LINE__, Rc, plci->internal_command));
-
-  internal_command = plci->internal_command;
-  plci->internal_command = 0;
-  switch (internal_command)
-  {
-  default:
-    plci->command = 0;
-  case FAX_EDATA_ACK_COMMAND_1:
-    if (plci_nl_busy (plci))
-    {
-      plci->internal_command = FAX_EDATA_ACK_COMMAND_1;
-      return;
-    }
-    plci->internal_command = FAX_EDATA_ACK_COMMAND_2;
-    plci->NData[0].P = plci->fax_connect_info_buffer;
-    plci->NData[0].PLength = plci->fax_edata_ack_length;
-    plci->NL.X = plci->NData;
-    plci->NL.ReqCh = 0;
-    plci->NL.Req = plci->nl_req = (byte) N_EDATA;
-    plci->adapter->request (&plci->NL);
-    return;
-  case FAX_EDATA_ACK_COMMAND_2:
-    if ((Rc != OK) && (Rc != OK_FC))
-    {
-      dbug (1, dprintf ("[%06lx] %s,%d: FAX issue EDATA ACK failed %02x",
-        UnMapId (Id), (char   *)(FILE_), __LINE__, Rc));
-      break;
-    }
-  }
-}
-
-
-static void fax_connect_info_command (dword Id, PLCI   *plci, byte Rc)
-{
-  word Info;
-  word internal_command;
-
-  dbug (1, dprintf ("[%06lx] %s,%d: fax_connect_info_command %02x %04x",
-    UnMapId (Id), (char   *)(FILE_), __LINE__, Rc, plci->internal_command));
-
-  Info = GOOD;
-  internal_command = plci->internal_command;
-  plci->internal_command = 0;
-  switch (internal_command)
-  {
-  default:
-    plci->command = 0;
-  case FAX_CONNECT_INFO_COMMAND_1:
-    if (plci_nl_busy (plci))
-    {
-      plci->internal_command = FAX_CONNECT_INFO_COMMAND_1;
-      return;
-    }
-    plci->internal_command = FAX_CONNECT_INFO_COMMAND_2;
-    plci->NData[0].P = plci->fax_connect_info_buffer;
-    plci->NData[0].PLength = plci->fax_connect_info_length;
-    plci->NL.X = plci->NData;
-    plci->NL.ReqCh = 0;
-    plci->NL.Req = plci->nl_req = (byte) N_EDATA;
-    plci->adapter->request (&plci->NL);
-    return;
-  case FAX_CONNECT_INFO_COMMAND_2:
-    if ((Rc != OK) && (Rc != OK_FC))
-    {
-      dbug (1, dprintf ("[%06lx] %s,%d: FAX setting connect info failed %02x",
-        UnMapId (Id), (char   *)(FILE_), __LINE__, Rc));
-      Info = _WRONG_STATE;
-      break;
-    }
-    if (plci_nl_busy (plci))
-    {
-      plci->internal_command = FAX_CONNECT_INFO_COMMAND_2;
-      return;
-    }
-    plci->command = _CONNECT_B3_R;
-    nl_req_ncci (plci, N_CONNECT, 0);
-    send_req (plci);
-    return;
-  }
-  sendf (plci->appl, _CONNECT_B3_R | CONFIRM, Id, plci->number, "w", Info);
+       sendf(plci->appl, _RESET_B3_I, Id, 0, "s", "");
+}
+
+
+static void select_b_command(dword Id, PLCI *plci, byte Rc)
+{
+       word Info;
+       word internal_command;
+       byte esc_chi[3];
+
+       dbug(1, dprintf("[%06lx] %s,%d: select_b_command %02x %04x",
+                       UnMapId(Id), (char *)(FILE_), __LINE__, Rc, plci->internal_command));
+
+       Info = GOOD;
+       internal_command = plci->internal_command;
+       plci->internal_command = 0;
+       switch (internal_command)
+       {
+       default:
+               plci->command = 0;
+               plci->adjust_b_parms_msg = &plci->saved_msg;
+               if ((plci->tel == ADV_VOICE) && (plci == plci->adapter->AdvSignalPLCI))
+                       plci->adjust_b_facilities = plci->B1_facilities | B1_FACILITY_VOICE;
+               else
+                       plci->adjust_b_facilities = plci->B1_facilities & ~B1_FACILITY_VOICE;
+               plci->adjust_b_command = SELECT_B_COMMAND_1;
+               plci->adjust_b_ncci = (word)(Id >> 16);
+               if (plci->saved_msg.parms[0].length == 0)
+               {
+                       plci->adjust_b_mode = ADJUST_B_MODE_SAVE | ADJUST_B_MODE_REMOVE_L23 | ADJUST_B_MODE_SWITCH_L1 |
+                               ADJUST_B_MODE_NO_RESOURCE;
+               }
+               else
+               {
+                       plci->adjust_b_mode = ADJUST_B_MODE_SAVE | ADJUST_B_MODE_REMOVE_L23 | ADJUST_B_MODE_SWITCH_L1 |
+                               ADJUST_B_MODE_ASSIGN_L23 | ADJUST_B_MODE_USER_CONNECT | ADJUST_B_MODE_RESTORE;
+               }
+               plci->adjust_b_state = ADJUST_B_START;
+               dbug(1, dprintf("[%06lx] %s,%d: Select B protocol...",
+                               UnMapId(Id), (char *)(FILE_), __LINE__));
+       case SELECT_B_COMMAND_1:
+               Info = adjust_b_process(Id, plci, Rc);
+               if (Info != GOOD)
+               {
+                       dbug(1, dprintf("[%06lx] %s,%d: Select B protocol failed",
+                                       UnMapId(Id), (char *)(FILE_), __LINE__));
+                       break;
+               }
+               if (plci->internal_command)
+                       return;
+               if (plci->tel == ADV_VOICE)
+               {
+                       esc_chi[0] = 0x02;
+                       esc_chi[1] = 0x18;
+                       esc_chi[2] = plci->b_channel;
+                       SetVoiceChannel(plci->adapter->AdvCodecPLCI, esc_chi, plci->adapter);
+               }
+               break;
+       }
+       sendf(plci->appl, _SELECT_B_REQ | CONFIRM, Id, plci->number, "w", Info);
+}
+
+
+static void fax_connect_ack_command(dword Id, PLCI *plci, byte Rc)
+{
+       word internal_command;
+
+       dbug(1, dprintf("[%06lx] %s,%d: fax_connect_ack_command %02x %04x",
+                       UnMapId(Id), (char *)(FILE_), __LINE__, Rc, plci->internal_command));
+
+       internal_command = plci->internal_command;
+       plci->internal_command = 0;
+       switch (internal_command)
+       {
+       default:
+               plci->command = 0;
+       case FAX_CONNECT_ACK_COMMAND_1:
+               if (plci_nl_busy(plci))
+               {
+                       plci->internal_command = FAX_CONNECT_ACK_COMMAND_1;
+                       return;
+               }
+               plci->internal_command = FAX_CONNECT_ACK_COMMAND_2;
+               plci->NData[0].P = plci->fax_connect_info_buffer;
+               plci->NData[0].PLength = plci->fax_connect_info_length;
+               plci->NL.X = plci->NData;
+               plci->NL.ReqCh = 0;
+               plci->NL.Req = plci->nl_req = (byte) N_CONNECT_ACK;
+               plci->adapter->request(&plci->NL);
+               return;
+       case FAX_CONNECT_ACK_COMMAND_2:
+               if ((Rc != OK) && (Rc != OK_FC))
+               {
+                       dbug(1, dprintf("[%06lx] %s,%d: FAX issue CONNECT ACK failed %02x",
+                                       UnMapId(Id), (char *)(FILE_), __LINE__, Rc));
+                       break;
+               }
+       }
+       if ((plci->ncpi_state & NCPI_VALID_CONNECT_B3_ACT)
+           && !(plci->ncpi_state & NCPI_CONNECT_B3_ACT_SENT))
+       {
+               if (plci->B3_prot == 4)
+                       sendf(plci->appl, _CONNECT_B3_ACTIVE_I, Id, 0, "s", "");
+               else
+                       sendf(plci->appl, _CONNECT_B3_ACTIVE_I, Id, 0, "S", plci->ncpi_buffer);
+               plci->ncpi_state |= NCPI_CONNECT_B3_ACT_SENT;
+       }
+}
+
+
+static void fax_edata_ack_command(dword Id, PLCI *plci, byte Rc)
+{
+       word internal_command;
+
+       dbug(1, dprintf("[%06lx] %s,%d: fax_edata_ack_command %02x %04x",
+                       UnMapId(Id), (char *)(FILE_), __LINE__, Rc, plci->internal_command));
+
+       internal_command = plci->internal_command;
+       plci->internal_command = 0;
+       switch (internal_command)
+       {
+       default:
+               plci->command = 0;
+       case FAX_EDATA_ACK_COMMAND_1:
+               if (plci_nl_busy(plci))
+               {
+                       plci->internal_command = FAX_EDATA_ACK_COMMAND_1;
+                       return;
+               }
+               plci->internal_command = FAX_EDATA_ACK_COMMAND_2;
+               plci->NData[0].P = plci->fax_connect_info_buffer;
+               plci->NData[0].PLength = plci->fax_edata_ack_length;
+               plci->NL.X = plci->NData;
+               plci->NL.ReqCh = 0;
+               plci->NL.Req = plci->nl_req = (byte) N_EDATA;
+               plci->adapter->request(&plci->NL);
+               return;
+       case FAX_EDATA_ACK_COMMAND_2:
+               if ((Rc != OK) && (Rc != OK_FC))
+               {
+                       dbug(1, dprintf("[%06lx] %s,%d: FAX issue EDATA ACK failed %02x",
+                                       UnMapId(Id), (char *)(FILE_), __LINE__, Rc));
+                       break;
+               }
+       }
+}
+
+
+static void fax_connect_info_command(dword Id, PLCI *plci, byte Rc)
+{
+       word Info;
+       word internal_command;
+
+       dbug(1, dprintf("[%06lx] %s,%d: fax_connect_info_command %02x %04x",
+                       UnMapId(Id), (char *)(FILE_), __LINE__, Rc, plci->internal_command));
+
+       Info = GOOD;
+       internal_command = plci->internal_command;
+       plci->internal_command = 0;
+       switch (internal_command)
+       {
+       default:
+               plci->command = 0;
+       case FAX_CONNECT_INFO_COMMAND_1:
+               if (plci_nl_busy(plci))
+               {
+                       plci->internal_command = FAX_CONNECT_INFO_COMMAND_1;
+                       return;
+               }
+               plci->internal_command = FAX_CONNECT_INFO_COMMAND_2;
+               plci->NData[0].P = plci->fax_connect_info_buffer;
+               plci->NData[0].PLength = plci->fax_connect_info_length;
+               plci->NL.X = plci->NData;
+               plci->NL.ReqCh = 0;
+               plci->NL.Req = plci->nl_req = (byte) N_EDATA;
+               plci->adapter->request(&plci->NL);
+               return;
+       case FAX_CONNECT_INFO_COMMAND_2:
+               if ((Rc != OK) && (Rc != OK_FC))
+               {
+                       dbug(1, dprintf("[%06lx] %s,%d: FAX setting connect info failed %02x",
+                                       UnMapId(Id), (char *)(FILE_), __LINE__, Rc));
+                       Info = _WRONG_STATE;
+                       break;
+               }
+               if (plci_nl_busy(plci))
+               {
+                       plci->internal_command = FAX_CONNECT_INFO_COMMAND_2;
+                       return;
+               }
+               plci->command = _CONNECT_B3_R;
+               nl_req_ncci(plci, N_CONNECT, 0);
+               send_req(plci);
+               return;
+       }
+       sendf(plci->appl, _CONNECT_B3_R | CONFIRM, Id, plci->number, "w", Info);
+}
+
+
+static void fax_adjust_b23_command(dword Id, PLCI *plci, byte Rc)
+{
+       word Info;
+       word internal_command;
+
+       dbug(1, dprintf("[%06lx] %s,%d: fax_adjust_b23_command %02x %04x",
+                       UnMapId(Id), (char *)(FILE_), __LINE__, Rc, plci->internal_command));
+
+       Info = GOOD;
+       internal_command = plci->internal_command;
+       plci->internal_command = 0;
+       switch (internal_command)
+       {
+       default:
+               plci->command = 0;
+               plci->adjust_b_parms_msg = NULL;
+               plci->adjust_b_facilities = plci->B1_facilities;
+               plci->adjust_b_command = FAX_ADJUST_B23_COMMAND_1;
+               plci->adjust_b_ncci = (word)(Id >> 16);
+               plci->adjust_b_mode = ADJUST_B_MODE_REMOVE_L23 | ADJUST_B_MODE_ASSIGN_L23;
+               plci->adjust_b_state = ADJUST_B_START;
+               dbug(1, dprintf("[%06lx] %s,%d: FAX adjust B23...",
+                               UnMapId(Id), (char *)(FILE_), __LINE__));
+       case FAX_ADJUST_B23_COMMAND_1:
+               Info = adjust_b_process(Id, plci, Rc);
+               if (Info != GOOD)
+               {
+                       dbug(1, dprintf("[%06lx] %s,%d: FAX adjust failed",
+                                       UnMapId(Id), (char *)(FILE_), __LINE__));
+                       break;
+               }
+               if (plci->internal_command)
+                       return;
+       case FAX_ADJUST_B23_COMMAND_2:
+               if (plci_nl_busy(plci))
+               {
+                       plci->internal_command = FAX_ADJUST_B23_COMMAND_2;
+                       return;
+               }
+               plci->command = _CONNECT_B3_R;
+               nl_req_ncci(plci, N_CONNECT, 0);
+               send_req(plci);
+               return;
+       }
+       sendf(plci->appl, _CONNECT_B3_R | CONFIRM, Id, plci->number, "w", Info);
+}
+
+
+static void fax_disconnect_command(dword Id, PLCI *plci, byte Rc)
+{
+       word internal_command;
+
+       dbug(1, dprintf("[%06lx] %s,%d: fax_disconnect_command %02x %04x",
+                       UnMapId(Id), (char *)(FILE_), __LINE__, Rc, plci->internal_command));
+
+       internal_command = plci->internal_command;
+       plci->internal_command = 0;
+       switch (internal_command)
+       {
+       default:
+               plci->command = 0;
+               plci->internal_command = FAX_DISCONNECT_COMMAND_1;
+               return;
+       case FAX_DISCONNECT_COMMAND_1:
+       case FAX_DISCONNECT_COMMAND_2:
+       case FAX_DISCONNECT_COMMAND_3:
+               if ((Rc != OK) && (Rc != OK_FC) && (Rc != 0))
+               {
+                       dbug(1, dprintf("[%06lx] %s,%d: FAX disconnect EDATA failed %02x",
+                                       UnMapId(Id), (char *)(FILE_), __LINE__, Rc));
+                       break;
+               }
+               if (Rc == OK)
+               {
+                       if ((internal_command == FAX_DISCONNECT_COMMAND_1)
+                           || (internal_command == FAX_DISCONNECT_COMMAND_2))
+                       {
+                               plci->internal_command = FAX_DISCONNECT_COMMAND_2;
+                       }
+               }
+               else if (Rc == 0)
+               {
+                       if (internal_command == FAX_DISCONNECT_COMMAND_1)
+                               plci->internal_command = FAX_DISCONNECT_COMMAND_3;
+               }
+               return;
+       }
+}
+
+
+
+static void rtp_connect_b3_req_command(dword Id, PLCI *plci, byte Rc)
+{
+       word Info;
+       word internal_command;
+
+       dbug(1, dprintf("[%06lx] %s,%d: rtp_connect_b3_req_command %02x %04x",
+                       UnMapId(Id), (char *)(FILE_), __LINE__, Rc, plci->internal_command));
+
+       Info = GOOD;
+       internal_command = plci->internal_command;
+       plci->internal_command = 0;
+       switch (internal_command)
+       {
+       default:
+               plci->command = 0;
+       case RTP_CONNECT_B3_REQ_COMMAND_1:
+               if (plci_nl_busy(plci))
+               {
+                       plci->internal_command = RTP_CONNECT_B3_REQ_COMMAND_1;
+                       return;
+               }
+               plci->internal_command = RTP_CONNECT_B3_REQ_COMMAND_2;
+               nl_req_ncci(plci, N_CONNECT, 0);
+               send_req(plci);
+               return;
+       case RTP_CONNECT_B3_REQ_COMMAND_2:
+               if ((Rc != OK) && (Rc != OK_FC))
+               {
+                       dbug(1, dprintf("[%06lx] %s,%d: RTP setting connect info failed %02x",
+                                       UnMapId(Id), (char *)(FILE_), __LINE__, Rc));
+                       Info = _WRONG_STATE;
+                       break;
+               }
+               if (plci_nl_busy(plci))
+               {
+                       plci->internal_command = RTP_CONNECT_B3_REQ_COMMAND_2;
+                       return;
+               }
+               plci->internal_command = RTP_CONNECT_B3_REQ_COMMAND_3;
+               plci->NData[0].PLength = plci->internal_req_buffer[0];
+               plci->NData[0].P = plci->internal_req_buffer + 1;
+               plci->NL.X = plci->NData;
+               plci->NL.ReqCh = 0;
+               plci->NL.Req = plci->nl_req = (byte) N_UDATA;
+               plci->adapter->request(&plci->NL);
+               break;
+       case RTP_CONNECT_B3_REQ_COMMAND_3:
+               return;
+       }
+       sendf(plci->appl, _CONNECT_B3_R | CONFIRM, Id, plci->number, "w", Info);
+}
+
+
+static void rtp_connect_b3_res_command(dword Id, PLCI *plci, byte Rc)
+{
+       word internal_command;
+
+       dbug(1, dprintf("[%06lx] %s,%d: rtp_connect_b3_res_command %02x %04x",
+                       UnMapId(Id), (char *)(FILE_), __LINE__, Rc, plci->internal_command));
+
+       internal_command = plci->internal_command;
+       plci->internal_command = 0;
+       switch (internal_command)
+       {
+       default:
+               plci->command = 0;
+       case RTP_CONNECT_B3_RES_COMMAND_1:
+               if (plci_nl_busy(plci))
+               {
+                       plci->internal_command = RTP_CONNECT_B3_RES_COMMAND_1;
+                       return;
+               }
+               plci->internal_command = RTP_CONNECT_B3_RES_COMMAND_2;
+               nl_req_ncci(plci, N_CONNECT_ACK, (byte)(Id >> 16));
+               send_req(plci);
+               return;
+       case RTP_CONNECT_B3_RES_COMMAND_2:
+               if ((Rc != OK) && (Rc != OK_FC))
+               {
+                       dbug(1, dprintf("[%06lx] %s,%d: RTP setting connect resp info failed %02x",
+                                       UnMapId(Id), (char *)(FILE_), __LINE__, Rc));
+                       break;
+               }
+               if (plci_nl_busy(plci))
+               {
+                       plci->internal_command = RTP_CONNECT_B3_RES_COMMAND_2;
+                       return;
+               }
+               sendf(plci->appl, _CONNECT_B3_ACTIVE_I, Id, 0, "s", "");
+               plci->internal_command = RTP_CONNECT_B3_RES_COMMAND_3;
+               plci->NData[0].PLength = plci->internal_req_buffer[0];
+               plci->NData[0].P = plci->internal_req_buffer + 1;
+               plci->NL.X = plci->NData;
+               plci->NL.ReqCh = 0;
+               plci->NL.Req = plci->nl_req = (byte) N_UDATA;
+               plci->adapter->request(&plci->NL);
+               return;
+       case RTP_CONNECT_B3_RES_COMMAND_3:
+               return;
+       }
+}
+
+
+
+static void hold_save_command(dword Id, PLCI *plci, byte Rc)
+{
+       byte SS_Ind[] = "\x05\x02\x00\x02\x00\x00"; /* Hold_Ind struct*/
+       word Info;
+       word internal_command;
+
+       dbug(1, dprintf("[%06lx] %s,%d: hold_save_command %02x %04x",
+                       UnMapId(Id), (char *)(FILE_), __LINE__, Rc, plci->internal_command));
+
+       Info = GOOD;
+       internal_command = plci->internal_command;
+       plci->internal_command = 0;
+       switch (internal_command)
+       {
+       default:
+               if (!plci->NL.Id)
+                       break;
+               plci->command = 0;
+               plci->adjust_b_parms_msg = NULL;
+               plci->adjust_b_facilities = plci->B1_facilities;
+               plci->adjust_b_command = HOLD_SAVE_COMMAND_1;
+               plci->adjust_b_ncci = (word)(Id >> 16);
+               plci->adjust_b_mode = ADJUST_B_MODE_SAVE | ADJUST_B_MODE_REMOVE_L23;
+               plci->adjust_b_state = ADJUST_B_START;
+               dbug(1, dprintf("[%06lx] %s,%d: HOLD save...",
+                               UnMapId(Id), (char *)(FILE_), __LINE__));
+       case HOLD_SAVE_COMMAND_1:
+               Info = adjust_b_process(Id, plci, Rc);
+               if (Info != GOOD)
+               {
+                       dbug(1, dprintf("[%06lx] %s,%d: HOLD save failed",
+                                       UnMapId(Id), (char *)(FILE_), __LINE__));
+                       break;
+               }
+               if (plci->internal_command)
+                       return;
+       }
+       sendf(plci->appl, _FACILITY_I, Id & 0xffffL, 0, "ws", 3, SS_Ind);
+}
+
+
+static void retrieve_restore_command(dword Id, PLCI *plci, byte Rc)
+{
+       byte SS_Ind[] = "\x05\x03\x00\x02\x00\x00"; /* Retrieve_Ind struct*/
+       word Info;
+       word internal_command;
+
+       dbug(1, dprintf("[%06lx] %s,%d: retrieve_restore_command %02x %04x",
+                       UnMapId(Id), (char *)(FILE_), __LINE__, Rc, plci->internal_command));
+
+       Info = GOOD;
+       internal_command = plci->internal_command;
+       plci->internal_command = 0;
+       switch (internal_command)
+       {
+       default:
+               plci->command = 0;
+               plci->adjust_b_parms_msg = NULL;
+               plci->adjust_b_facilities = plci->B1_facilities;
+               plci->adjust_b_command = RETRIEVE_RESTORE_COMMAND_1;
+               plci->adjust_b_ncci = (word)(Id >> 16);
+               plci->adjust_b_mode = ADJUST_B_MODE_ASSIGN_L23 | ADJUST_B_MODE_USER_CONNECT | ADJUST_B_MODE_RESTORE;
+               plci->adjust_b_state = ADJUST_B_START;
+               dbug(1, dprintf("[%06lx] %s,%d: RETRIEVE restore...",
+                               UnMapId(Id), (char *)(FILE_), __LINE__));
+       case RETRIEVE_RESTORE_COMMAND_1:
+               Info = adjust_b_process(Id, plci, Rc);
+               if (Info != GOOD)
+               {
+                       dbug(1, dprintf("[%06lx] %s,%d: RETRIEVE restore failed",
+                                       UnMapId(Id), (char *)(FILE_), __LINE__));
+                       break;
+               }
+               if (plci->internal_command)
+                       return;
+       }
+       sendf(plci->appl, _FACILITY_I, Id & 0xffffL, 0, "ws", 3, SS_Ind);
 }
 
 
-static void fax_adjust_b23_command (dword Id, PLCI   *plci, byte Rc)
+static void init_b1_config(PLCI *plci)
 {
-  word Info;
-  word internal_command;
 
-  dbug (1, dprintf ("[%06lx] %s,%d: fax_adjust_b23_command %02x %04x",
-    UnMapId (Id), (char   *)(FILE_), __LINE__, Rc, plci->internal_command));
+       dbug(1, dprintf("[%06lx] %s,%d: init_b1_config",
+                       (dword)((plci->Id << 8) | UnMapController(plci->adapter->Id)),
+                       (char *)(FILE_), __LINE__));
 
-  Info = GOOD;
-  internal_command = plci->internal_command;
-  plci->internal_command = 0;
-  switch (internal_command)
-  {
-  default:
-    plci->command = 0;
-    plci->adjust_b_parms_msg = NULL;
-    plci->adjust_b_facilities = plci->B1_facilities;
-    plci->adjust_b_command = FAX_ADJUST_B23_COMMAND_1;
-    plci->adjust_b_ncci = (word)(Id >> 16);
-    plci->adjust_b_mode = ADJUST_B_MODE_REMOVE_L23 | ADJUST_B_MODE_ASSIGN_L23;
-    plci->adjust_b_state = ADJUST_B_START;
-    dbug (1, dprintf ("[%06lx] %s,%d: FAX adjust B23...",
-      UnMapId (Id), (char   *)(FILE_), __LINE__));
-  case FAX_ADJUST_B23_COMMAND_1:
-    Info = adjust_b_process (Id, plci, Rc);
-    if (Info != GOOD)
-    {
-      dbug (1, dprintf ("[%06lx] %s,%d: FAX adjust failed",
-        UnMapId (Id), (char   *)(FILE_), __LINE__));
-      break;
-    }
-    if (plci->internal_command)
-      return;
-  case FAX_ADJUST_B23_COMMAND_2:
-    if (plci_nl_busy (plci))
-    {
-      plci->internal_command = FAX_ADJUST_B23_COMMAND_2;
-      return;
-    }
-    plci->command = _CONNECT_B3_R;
-    nl_req_ncci (plci, N_CONNECT, 0);
-    send_req (plci);
-    return;
-  }
-  sendf (plci->appl, _CONNECT_B3_R | CONFIRM, Id, plci->number, "w", Info);
-}
-
-
-static void fax_disconnect_command (dword Id, PLCI   *plci, byte Rc)
-{
-  word internal_command;
-
-  dbug (1, dprintf ("[%06lx] %s,%d: fax_disconnect_command %02x %04x",
-    UnMapId (Id), (char   *)(FILE_), __LINE__, Rc, plci->internal_command));
-
-  internal_command = plci->internal_command;
-  plci->internal_command = 0;
-  switch (internal_command)
-  {
-  default:
-    plci->command = 0;
-    plci->internal_command = FAX_DISCONNECT_COMMAND_1;
-    return;
-  case FAX_DISCONNECT_COMMAND_1:
-  case FAX_DISCONNECT_COMMAND_2:
-  case FAX_DISCONNECT_COMMAND_3:
-    if ((Rc != OK) && (Rc != OK_FC) && (Rc != 0))
-    {
-      dbug (1, dprintf ("[%06lx] %s,%d: FAX disconnect EDATA failed %02x",
-        UnMapId (Id), (char   *)(FILE_), __LINE__, Rc));
-      break;
-    }
-    if (Rc == OK)
-    {
-      if ((internal_command == FAX_DISCONNECT_COMMAND_1)
-       || (internal_command == FAX_DISCONNECT_COMMAND_2))
-      {
-        plci->internal_command = FAX_DISCONNECT_COMMAND_2;
-      }
-    }
-    else if (Rc == 0)
-    {
-      if (internal_command == FAX_DISCONNECT_COMMAND_1)
-        plci->internal_command = FAX_DISCONNECT_COMMAND_3;
-    }
-    return;
-  }
-}
-
-
-
-static void rtp_connect_b3_req_command (dword Id, PLCI   *plci, byte Rc)
-{
-  word Info;
-  word internal_command;
-
-  dbug (1, dprintf ("[%06lx] %s,%d: rtp_connect_b3_req_command %02x %04x",
-    UnMapId (Id), (char   *)(FILE_), __LINE__, Rc, plci->internal_command));
-
-  Info = GOOD;
-  internal_command = plci->internal_command;
-  plci->internal_command = 0;
-  switch (internal_command)
-  {
-  default:
-    plci->command = 0;
-  case RTP_CONNECT_B3_REQ_COMMAND_1:
-    if (plci_nl_busy (plci))
-    {
-      plci->internal_command = RTP_CONNECT_B3_REQ_COMMAND_1;
-      return;
-    }
-    plci->internal_command = RTP_CONNECT_B3_REQ_COMMAND_2;
-    nl_req_ncci (plci, N_CONNECT, 0);
-    send_req (plci);
-    return;
-  case RTP_CONNECT_B3_REQ_COMMAND_2:
-    if ((Rc != OK) && (Rc != OK_FC))
-    {
-      dbug (1, dprintf ("[%06lx] %s,%d: RTP setting connect info failed %02x",
-        UnMapId (Id), (char   *)(FILE_), __LINE__, Rc));
-      Info = _WRONG_STATE;
-      break;
-    }
-    if (plci_nl_busy (plci))
-    {
-      plci->internal_command = RTP_CONNECT_B3_REQ_COMMAND_2;
-      return;
-    }
-    plci->internal_command = RTP_CONNECT_B3_REQ_COMMAND_3;
-    plci->NData[0].PLength = plci->internal_req_buffer[0];
-    plci->NData[0].P = plci->internal_req_buffer + 1;
-    plci->NL.X = plci->NData;
-    plci->NL.ReqCh = 0;
-    plci->NL.Req = plci->nl_req = (byte) N_UDATA;
-    plci->adapter->request (&plci->NL);
-    break;
-  case RTP_CONNECT_B3_REQ_COMMAND_3:
-    return;
-  }
-  sendf (plci->appl, _CONNECT_B3_R | CONFIRM, Id, plci->number, "w", Info);
-}
-
-
-static void rtp_connect_b3_res_command (dword Id, PLCI   *plci, byte Rc)
-{
-  word internal_command;
-
-  dbug (1, dprintf ("[%06lx] %s,%d: rtp_connect_b3_res_command %02x %04x",
-    UnMapId (Id), (char   *)(FILE_), __LINE__, Rc, plci->internal_command));
-
-  internal_command = plci->internal_command;
-  plci->internal_command = 0;
-  switch (internal_command)
-  {
-  default:
-    plci->command = 0;
-  case RTP_CONNECT_B3_RES_COMMAND_1:
-    if (plci_nl_busy (plci))
-    {
-      plci->internal_command = RTP_CONNECT_B3_RES_COMMAND_1;
-      return;
-    }
-    plci->internal_command = RTP_CONNECT_B3_RES_COMMAND_2;
-    nl_req_ncci (plci, N_CONNECT_ACK, (byte)(Id >> 16));
-    send_req (plci);
-    return;
-  case RTP_CONNECT_B3_RES_COMMAND_2:
-    if ((Rc != OK) && (Rc != OK_FC))
-    {
-      dbug (1, dprintf ("[%06lx] %s,%d: RTP setting connect resp info failed %02x",
-        UnMapId (Id), (char   *)(FILE_), __LINE__, Rc));
-      break;
-    }
-    if (plci_nl_busy (plci))
-    {
-      plci->internal_command = RTP_CONNECT_B3_RES_COMMAND_2;
-      return;
-    }
-    sendf (plci->appl, _CONNECT_B3_ACTIVE_I, Id, 0, "s", "");
-    plci->internal_command = RTP_CONNECT_B3_RES_COMMAND_3;
-    plci->NData[0].PLength = plci->internal_req_buffer[0];
-    plci->NData[0].P = plci->internal_req_buffer + 1;
-    plci->NL.X = plci->NData;
-    plci->NL.ReqCh = 0;
-    plci->NL.Req = plci->nl_req = (byte) N_UDATA;
-    plci->adapter->request (&plci->NL);
-    return;
-  case RTP_CONNECT_B3_RES_COMMAND_3:
-    return;
-  }
-}
-
-
-
-static void hold_save_command (dword Id, PLCI   *plci, byte Rc)
-{
-    byte SS_Ind[] = "\x05\x02\x00\x02\x00\x00"; /* Hold_Ind struct*/
-  word Info;
-  word internal_command;
+       plci->B1_resource = 0;
+       plci->B1_facilities = 0;
 
-  dbug (1, dprintf ("[%06lx] %s,%d: hold_save_command %02x %04x",
-    UnMapId (Id), (char   *)(FILE_), __LINE__, Rc, plci->internal_command));
+       plci->li_bchannel_id = 0;
+       mixer_clear_config(plci);
 
-  Info = GOOD;
-  internal_command = plci->internal_command;
-  plci->internal_command = 0;
-  switch (internal_command)
-  {
-  default:
-    if (!plci->NL.Id)
-      break;
-    plci->command = 0;
-    plci->adjust_b_parms_msg = NULL;
-    plci->adjust_b_facilities = plci->B1_facilities;
-    plci->adjust_b_command = HOLD_SAVE_COMMAND_1;
-    plci->adjust_b_ncci = (word)(Id >> 16);
-    plci->adjust_b_mode = ADJUST_B_MODE_SAVE | ADJUST_B_MODE_REMOVE_L23;
-    plci->adjust_b_state = ADJUST_B_START;
-    dbug (1, dprintf ("[%06lx] %s,%d: HOLD save...",
-      UnMapId (Id), (char   *)(FILE_), __LINE__));
-  case HOLD_SAVE_COMMAND_1:
-    Info = adjust_b_process (Id, plci, Rc);
-    if (Info != GOOD)
-    {
-      dbug (1, dprintf ("[%06lx] %s,%d: HOLD save failed",
-        UnMapId (Id), (char   *)(FILE_), __LINE__));
-      break;
-    }
-    if (plci->internal_command)
-      return;
-  }
-  sendf (plci->appl, _FACILITY_I, Id & 0xffffL, 0, "ws", 3, SS_Ind);
-}
-
-
-static void retrieve_restore_command (dword Id, PLCI   *plci, byte Rc)
-{
-    byte SS_Ind[] = "\x05\x03\x00\x02\x00\x00"; /* Retrieve_Ind struct*/
-  word Info;
-  word internal_command;
-
-  dbug (1, dprintf ("[%06lx] %s,%d: retrieve_restore_command %02x %04x",
-    UnMapId (Id), (char   *)(FILE_), __LINE__, Rc, plci->internal_command));
-
-  Info = GOOD;
-  internal_command = plci->internal_command;
-  plci->internal_command = 0;
-  switch (internal_command)
-  {
-  default:
-    plci->command = 0;
-    plci->adjust_b_parms_msg = NULL;
-    plci->adjust_b_facilities = plci->B1_facilities;
-    plci->adjust_b_command = RETRIEVE_RESTORE_COMMAND_1;
-    plci->adjust_b_ncci = (word)(Id >> 16);
-    plci->adjust_b_mode = ADJUST_B_MODE_ASSIGN_L23 | ADJUST_B_MODE_USER_CONNECT | ADJUST_B_MODE_RESTORE;
-    plci->adjust_b_state = ADJUST_B_START;
-    dbug (1, dprintf ("[%06lx] %s,%d: RETRIEVE restore...",
-      UnMapId (Id), (char   *)(FILE_), __LINE__));
-  case RETRIEVE_RESTORE_COMMAND_1:
-    Info = adjust_b_process (Id, plci, Rc);
-    if (Info != GOOD)
-    {
-      dbug (1, dprintf ("[%06lx] %s,%d: RETRIEVE restore failed",
-        UnMapId (Id), (char   *)(FILE_), __LINE__));
-      break;
-    }
-    if (plci->internal_command)
-      return;
-  }
-  sendf (plci->appl, _FACILITY_I, Id & 0xffffL, 0, "ws", 3, SS_Ind);
-}
-
-
-static void init_b1_config (PLCI   *plci)
-{
-
-  dbug (1, dprintf ("[%06lx] %s,%d: init_b1_config",
-    (dword)((plci->Id << 8) | UnMapController (plci->adapter->Id)),
-    (char   *)(FILE_), __LINE__));
-
-  plci->B1_resource = 0;
-  plci->B1_facilities = 0;
 
-  plci->li_bchannel_id = 0;
-  mixer_clear_config (plci);
+       ec_clear_config(plci);
 
 
-  ec_clear_config (plci);
+       dtmf_rec_clear_config(plci);
+       dtmf_send_clear_config(plci);
+       dtmf_parameter_clear_config(plci);
 
-
-  dtmf_rec_clear_config (plci);
-  dtmf_send_clear_config (plci);
-  dtmf_parameter_clear_config (plci);
-
-  adv_voice_clear_config (plci);
-  adjust_b_clear (plci);
+       adv_voice_clear_config(plci);
+       adjust_b_clear(plci);
 }
 
 
-static void clear_b1_config (PLCI   *plci)
+static void clear_b1_config(PLCI *plci)
 {
 
-  dbug (1, dprintf ("[%06lx] %s,%d: clear_b1_config",
-    (dword)((plci->Id << 8) | UnMapController (plci->adapter->Id)),
-    (char   *)(FILE_), __LINE__));
+       dbug(1, dprintf("[%06lx] %s,%d: clear_b1_config",
+                       (dword)((plci->Id << 8) | UnMapController(plci->adapter->Id)),
+                       (char *)(FILE_), __LINE__));
 
-  adv_voice_clear_config (plci);
-  adjust_b_clear (plci);
+       adv_voice_clear_config(plci);
+       adjust_b_clear(plci);
 
-  ec_clear_config (plci);
+       ec_clear_config(plci);
 
 
-  dtmf_rec_clear_config (plci);
-  dtmf_send_clear_config (plci);
-  dtmf_parameter_clear_config (plci);
+       dtmf_rec_clear_config(plci);
+       dtmf_send_clear_config(plci);
+       dtmf_parameter_clear_config(plci);
 
 
-  if ((plci->li_bchannel_id != 0)
-   && (li_config_table[plci->adapter->li_base + (plci->li_bchannel_id - 1)].plci == plci))
-  {
-    mixer_clear_config (plci);
-    li_config_table[plci->adapter->li_base + (plci->li_bchannel_id - 1)].plci = NULL;
-    plci->li_bchannel_id = 0;
-  }
+       if ((plci->li_bchannel_id != 0)
+           && (li_config_table[plci->adapter->li_base + (plci->li_bchannel_id - 1)].plci == plci))
+       {
+               mixer_clear_config(plci);
+               li_config_table[plci->adapter->li_base + (plci->li_bchannel_id - 1)].plci = NULL;
+               plci->li_bchannel_id = 0;
+       }
 
-  plci->B1_resource = 0;
-  plci->B1_facilities = 0;
+       plci->B1_resource = 0;
+       plci->B1_facilities = 0;
 }
 
 
 /* -----------------------------------------------------------------
-                XON protocol local helpers
+   XON protocol local helpers
    ----------------------------------------------------------------- */
-static void channel_flow_control_remove (PLCI   * plci) {
-  DIVA_CAPI_ADAPTER   * a = plci->adapter;
-  word i;
-  for(i=1;i<MAX_NL_CHANNEL+1;i++) {
-    if (a->ch_flow_plci[i] == plci->Id) {
-      a->ch_flow_plci[i] = 0;
-      a->ch_flow_control[i] = 0;
-    }
-  }
-}
-
-static void channel_x_on (PLCI   * plci, byte ch) {
-  DIVA_CAPI_ADAPTER   * a = plci->adapter;
-  if (a->ch_flow_control[ch] & N_XON_SENT) {
-    a->ch_flow_control[ch] &= ~N_XON_SENT;
-  }
-}
-
-static void channel_x_off (PLCI   * plci, byte ch, byte flag) {
-  DIVA_CAPI_ADAPTER   * a = plci->adapter;
-  if ((a->ch_flow_control[ch] & N_RX_FLOW_CONTROL_MASK) == 0) {
-    a->ch_flow_control[ch] |= (N_CH_XOFF | flag);
-    a->ch_flow_plci[ch] = plci->Id;
-    a->ch_flow_control_pending++;
-  }
-}
-
-static void channel_request_xon (PLCI   * plci, byte ch) {
-  DIVA_CAPI_ADAPTER   * a = plci->adapter;
-
-  if (a->ch_flow_control[ch] & N_CH_XOFF) {
-    a->ch_flow_control[ch] |= N_XON_REQ;
-    a->ch_flow_control[ch] &= ~N_CH_XOFF;
-    a->ch_flow_control[ch] &= ~N_XON_CONNECT_IND;
-  }
-}
-
-static void channel_xmit_extended_xon (PLCI   * plci) {
-  DIVA_CAPI_ADAPTER   * a;
-  int max_ch = ARRAY_SIZE(a->ch_flow_control);
-  int i, one_requested = 0;
-
-  if ((!plci) || (!plci->Id) || ((a = plci->adapter) == NULL)) {
-    return;
-  }
-
-  for (i = 0; i < max_ch; i++) {
-    if ((a->ch_flow_control[i] & N_CH_XOFF) &&
-        (a->ch_flow_control[i] & N_XON_CONNECT_IND) &&
-        (plci->Id == a->ch_flow_plci[i])) {
-      channel_request_xon (plci, (byte)i);
-      one_requested = 1;
-    }
-  }
-
-  if (one_requested) {
-    channel_xmit_xon (plci);
-  }
+static void channel_flow_control_remove(PLCI *plci) {
+       DIVA_CAPI_ADAPTER *a = plci->adapter;
+       word i;
+       for (i = 1; i < MAX_NL_CHANNEL + 1; i++) {
+               if (a->ch_flow_plci[i] == plci->Id) {
+                       a->ch_flow_plci[i] = 0;
+                       a->ch_flow_control[i] = 0;
+               }
+       }
+}
+
+static void channel_x_on(PLCI *plci, byte ch) {
+       DIVA_CAPI_ADAPTER *a = plci->adapter;
+       if (a->ch_flow_control[ch] & N_XON_SENT) {
+               a->ch_flow_control[ch] &= ~N_XON_SENT;
+       }
+}
+
+static void channel_x_off(PLCI *plci, byte ch, byte flag) {
+       DIVA_CAPI_ADAPTER *a = plci->adapter;
+       if ((a->ch_flow_control[ch] & N_RX_FLOW_CONTROL_MASK) == 0) {
+               a->ch_flow_control[ch] |= (N_CH_XOFF | flag);
+               a->ch_flow_plci[ch] = plci->Id;
+               a->ch_flow_control_pending++;
+       }
+}
+
+static void channel_request_xon(PLCI *plci, byte ch) {
+       DIVA_CAPI_ADAPTER *a = plci->adapter;
+
+       if (a->ch_flow_control[ch] & N_CH_XOFF) {
+               a->ch_flow_control[ch] |= N_XON_REQ;
+               a->ch_flow_control[ch] &= ~N_CH_XOFF;
+               a->ch_flow_control[ch] &= ~N_XON_CONNECT_IND;
+       }
+}
+
+static void channel_xmit_extended_xon(PLCI *plci) {
+       DIVA_CAPI_ADAPTER *a;
+       int max_ch = ARRAY_SIZE(a->ch_flow_control);
+       int i, one_requested = 0;
+
+       if ((!plci) || (!plci->Id) || ((a = plci->adapter) == NULL)) {
+               return;
+       }
+
+       for (i = 0; i < max_ch; i++) {
+               if ((a->ch_flow_control[i] & N_CH_XOFF) &&
+                   (a->ch_flow_control[i] & N_XON_CONNECT_IND) &&
+                   (plci->Id == a->ch_flow_plci[i])) {
+                       channel_request_xon(plci, (byte)i);
+                       one_requested = 1;
+               }
+       }
+
+       if (one_requested) {
+               channel_xmit_xon(plci);
+       }
 }
 
 /*
   Try to xmit next X_ON
-  */
-static int find_channel_with_pending_x_on (DIVA_CAPI_ADAPTER   * a, PLCI   * plci) {
-  int max_ch = ARRAY_SIZE(a->ch_flow_control);
-  int i;
-
-  if (!(plci->adapter->manufacturer_features & MANUFACTURER_FEATURE_XONOFF_FLOW_CONTROL)) {
-    return (0);
-  }
-
-  if (a->last_flow_control_ch >= max_ch) {
-    a->last_flow_control_ch = 1;
-  }
-  for (i=a->last_flow_control_ch; i < max_ch; i++) {
-    if ((a->ch_flow_control[i] & N_XON_REQ) &&
-        (plci->Id == a->ch_flow_plci[i])) {
-      a->last_flow_control_ch = i+1;
-      return (i);
-    }
-  }
-
-  for (i = 1; i < a->last_flow_control_ch; i++) {
-    if ((a->ch_flow_control[i] & N_XON_REQ) &&
-        (plci->Id == a->ch_flow_plci[i])) {
-      a->last_flow_control_ch = i+1;
-      return (i);
-    }
-  }
-
-  return (0);
-}
-
-static void channel_xmit_xon (PLCI   * plci) {
-  DIVA_CAPI_ADAPTER   * a = plci->adapter;
-  byte ch;
-
-  if (plci->nl_req || !plci->NL.Id || plci->nl_remove_id) {
-    return;
-  }
-  if ((ch = (byte)find_channel_with_pending_x_on (a, plci)) == 0) {
-    return;
-  }
-  a->ch_flow_control[ch] &= ~N_XON_REQ;
-  a->ch_flow_control[ch] |= N_XON_SENT;
-
-  plci->NL.Req = plci->nl_req = (byte)N_XON;
-  plci->NL.ReqCh         = ch;
-  plci->NL.X             = plci->NData;
-  plci->NL.XNum          = 1;
-  plci->NData[0].P       = &plci->RBuffer[0];
-  plci->NData[0].PLength = 0;
-
-  plci->adapter->request(&plci->NL);
-}
-
-static int channel_can_xon (PLCI   * plci, byte ch) {
-  APPL   * APPLptr;
-  DIVA_CAPI_ADAPTER   * a;
-  word NCCIcode;
-  dword count;
-  word Num;
-  word i;
-
-  APPLptr = plci->appl;
-  a = plci->adapter;
-
-  if (!APPLptr)
-    return (0);
-
-  NCCIcode = a->ch_ncci[ch] | (((word) a->Id) << 8);
-
-                /* count all buffers within the Application pool    */
-                /* belonging to the same NCCI. XON if a first is    */
-                /* used.                                            */
-  count = 0;
-  Num = 0xffff;
-  for(i=0; i<APPLptr->MaxBuffer; i++) {
-    if(NCCIcode==APPLptr->DataNCCI[i]) count++;
-    if(!APPLptr->DataNCCI[i] && Num==0xffff) Num = i;
-  }
-  if ((count > 2) || (Num == 0xffff)) {
-    return (0);
-  }
-  return (1);
+*/
+static int find_channel_with_pending_x_on(DIVA_CAPI_ADAPTER *a, PLCI *plci) {
+       int max_ch = ARRAY_SIZE(a->ch_flow_control);
+       int i;
+
+       if (!(plci->adapter->manufacturer_features & MANUFACTURER_FEATURE_XONOFF_FLOW_CONTROL)) {
+               return (0);
+       }
+
+       if (a->last_flow_control_ch >= max_ch) {
+               a->last_flow_control_ch = 1;
+       }
+       for (i = a->last_flow_control_ch; i < max_ch; i++) {
+               if ((a->ch_flow_control[i] & N_XON_REQ) &&
+                   (plci->Id == a->ch_flow_plci[i])) {
+                       a->last_flow_control_ch = i + 1;
+                       return (i);
+               }
+       }
+
+       for (i = 1; i < a->last_flow_control_ch; i++) {
+               if ((a->ch_flow_control[i] & N_XON_REQ) &&
+                   (plci->Id == a->ch_flow_plci[i])) {
+                       a->last_flow_control_ch = i + 1;
+                       return (i);
+               }
+       }
+
+       return (0);
+}
+
+static void channel_xmit_xon(PLCI *plci) {
+       DIVA_CAPI_ADAPTER *a = plci->adapter;
+       byte ch;
+
+       if (plci->nl_req || !plci->NL.Id || plci->nl_remove_id) {
+               return;
+       }
+       if ((ch = (byte)find_channel_with_pending_x_on(a, plci)) == 0) {
+               return;
+       }
+       a->ch_flow_control[ch] &= ~N_XON_REQ;
+       a->ch_flow_control[ch] |= N_XON_SENT;
+
+       plci->NL.Req = plci->nl_req = (byte)N_XON;
+       plci->NL.ReqCh         = ch;
+       plci->NL.X             = plci->NData;
+       plci->NL.XNum          = 1;
+       plci->NData[0].P       = &plci->RBuffer[0];
+       plci->NData[0].PLength = 0;
+
+       plci->adapter->request(&plci->NL);
+}
+
+static int channel_can_xon(PLCI *plci, byte ch) {
+       APPL *APPLptr;
+       DIVA_CAPI_ADAPTER *a;
+       word NCCIcode;
+       dword count;
+       word Num;
+       word i;
+
+       APPLptr = plci->appl;
+       a = plci->adapter;
+
+       if (!APPLptr)
+               return (0);
+
+       NCCIcode = a->ch_ncci[ch] | (((word) a->Id) << 8);
+
+       /* count all buffers within the Application pool    */
+       /* belonging to the same NCCI. XON if a first is    */
+       /* used.                                            */
+       count = 0;
+       Num = 0xffff;
+       for (i = 0; i < APPLptr->MaxBuffer; i++) {
+               if (NCCIcode == APPLptr->DataNCCI[i]) count++;
+               if (!APPLptr->DataNCCI[i] && Num == 0xffff) Num = i;
+       }
+       if ((count > 2) || (Num == 0xffff)) {
+               return (0);
+       }
+       return (1);
 }
 
 
 /*------------------------------------------------------------------*/
 
-static word CPN_filter_ok(byte   *cpn,DIVA_CAPI_ADAPTER   * a,word offset)
+static word CPN_filter_ok(byte *cpn, DIVA_CAPI_ADAPTER *a, word offset)
 {
-  return 1;
+       return 1;
 }
 
 
@@ -14733,116 +14733,116 @@ static word CPN_filter_ok(byte   *cpn,DIVA_CAPI_ADAPTER   * a,word offset)
 /* function must be enabled by setting "a->group_optimization_enabled" from the   */
 /* OS specific part (per adapter).                                                */
 /**********************************************************************************/
-static void group_optimization(DIVA_CAPI_ADAPTER   * a, PLCI   * plci)
-{
-  word i,j,k,busy,group_found;
-  dword info_mask_group[MAX_CIP_TYPES];
-  dword cip_mask_group[MAX_CIP_TYPES];
-  word appl_number_group_type[MAX_APPL];
-  PLCI   *auxplci;
-
-  set_group_ind_mask (plci); /* all APPLs within this inc. call are allowed to dial in */
-
-  if(!a->group_optimization_enabled)
-  {
-    dbug(1,dprintf("No group optimization"));
-    return;
-  }
-
-  dbug(1,dprintf("Group optimization = 0x%x...", a->group_optimization_enabled));
-
-  for(i=0;i<MAX_CIP_TYPES;i++)
-  {
-    info_mask_group[i] = 0;
-    cip_mask_group [i] = 0;
-  }
-  for(i=0;i<MAX_APPL;i++)
-  {
-    appl_number_group_type[i] = 0;
-  }
-  for(i=0; i<max_appl; i++) /* check if any multi instance capable application is present */
-  {  /* group_optimization set to 1 means not to optimize multi-instance capable applications (default) */
-    if(application[i].Id && (application[i].MaxNCCI) > 1 && (a->CIP_Mask[i])  && (a->group_optimization_enabled ==1) )
-    {
-      dbug(1,dprintf("Multi-Instance capable, no optimization required"));
-      return; /* allow good application unfiltered access */
-    }
-  }
-  for(i=0; i<max_appl; i++) /* Build CIP Groups */
-  {
-    if(application[i].Id && a->CIP_Mask[i] )
-    {
-      for(k=0,busy=false; k<a->max_plci; k++)
-      {
-        if(a->plci[k].Id) 
-        {
-          auxplci = &a->plci[k];
-          if(auxplci->appl == &application[i]) /* application has a busy PLCI */
-          {
-            busy = true;
-            dbug(1,dprintf("Appl 0x%x is busy",i+1));
-          }
-          else if(test_c_ind_mask_bit (auxplci, i)) /* application has an incoming call pending */
-          {
-            busy = true;
-            dbug(1,dprintf("Appl 0x%x has inc. call pending",i+1));
-          }
-        }
-      }
-
-      for(j=0,group_found=0; j<=(MAX_CIP_TYPES) && !busy &&!group_found; j++)     /* build groups with free applications only */
-      {
-        if(j==MAX_CIP_TYPES)       /* all groups are in use but group still not found */
-        {                           /* the MAX_CIP_TYPES group enables all calls because of field overflow */
-          appl_number_group_type[i] = MAX_CIP_TYPES;
-          group_found=true;
-          dbug(1,dprintf("Field overflow appl 0x%x",i+1));
-        }
-        else if( (info_mask_group[j]==a->CIP_Mask[i]) && (cip_mask_group[j]==a->Info_Mask[i]) )  
-        {                                      /* is group already present ?                  */
-          appl_number_group_type[i] = j|0x80;  /* store the group number for each application */
-          group_found=true;
-          dbug(1,dprintf("Group 0x%x found with appl 0x%x, CIP=0x%lx",appl_number_group_type[i],i+1,info_mask_group[j]));
-        }
-        else if(!info_mask_group[j])
-        {                                      /* establish a new group                       */
-          appl_number_group_type[i] = j|0x80;  /* store the group number for each application */
-          info_mask_group[j] = a->CIP_Mask[i]; /* store the new CIP mask for the new group    */
-          cip_mask_group[j] = a->Info_Mask[i]; /* store the new Info_Mask for this new group  */
-          group_found=true;
-          dbug(1,dprintf("New Group 0x%x established with appl 0x%x, CIP=0x%lx",appl_number_group_type[i],i+1,info_mask_group[j]));
-        }
-      }
-    }
-  }
-        
-  for(i=0; i<max_appl; i++) /* Build group_optimization_mask_table */
-  {
-    if(appl_number_group_type[i]) /* application is free, has listens and is member of a group */
-    {
-      if(appl_number_group_type[i] == MAX_CIP_TYPES)
-      {
-        dbug(1,dprintf("OverflowGroup 0x%x, valid appl = 0x%x, call enabled",appl_number_group_type[i],i+1));
-      }
-      else
-      {
-        dbug(1,dprintf("Group 0x%x, valid appl = 0x%x",appl_number_group_type[i],i+1));
-        for(j=i+1; j<max_appl; j++)   /* search other group members and mark them as busy        */
-        {
-          if(appl_number_group_type[i] == appl_number_group_type[j]) 
-          {
-            dbug(1,dprintf("Appl 0x%x is member of group 0x%x, no call",j+1,appl_number_group_type[j]));
-            clear_group_ind_mask_bit (plci, j);           /* disable call on other group members */
-            appl_number_group_type[j] = 0;       /* remove disabled group member from group list */
-          }
-        }
-      }
-    }
-    else                                                 /* application should not get a call */
-    {
-      clear_group_ind_mask_bit (plci, i);
-    }
-  }
+static void group_optimization(DIVA_CAPI_ADAPTER *a, PLCI *plci)
+{
+       word i, j, k, busy, group_found;
+       dword info_mask_group[MAX_CIP_TYPES];
+       dword cip_mask_group[MAX_CIP_TYPES];
+       word appl_number_group_type[MAX_APPL];
+       PLCI *auxplci;
+
+       set_group_ind_mask(plci); /* all APPLs within this inc. call are allowed to dial in */
+
+       if (!a->group_optimization_enabled)
+       {
+               dbug(1, dprintf("No group optimization"));
+               return;
+       }
+
+       dbug(1, dprintf("Group optimization = 0x%x...", a->group_optimization_enabled));
+
+       for (i = 0; i < MAX_CIP_TYPES; i++)
+       {
+               info_mask_group[i] = 0;
+               cip_mask_group[i] = 0;
+       }
+       for (i = 0; i < MAX_APPL; i++)
+       {
+               appl_number_group_type[i] = 0;
+       }
+       for (i = 0; i < max_appl; i++) /* check if any multi instance capable application is present */
+       {  /* group_optimization set to 1 means not to optimize multi-instance capable applications (default) */
+               if (application[i].Id && (application[i].MaxNCCI) > 1 && (a->CIP_Mask[i]) && (a->group_optimization_enabled == 1))
+               {
+                       dbug(1, dprintf("Multi-Instance capable, no optimization required"));
+                       return; /* allow good application unfiltered access */
+               }
+       }
+       for (i = 0; i < max_appl; i++) /* Build CIP Groups */
+       {
+               if (application[i].Id && a->CIP_Mask[i])
+               {
+                       for (k = 0, busy = false; k < a->max_plci; k++)
+                       {
+                               if (a->plci[k].Id)
+                               {
+                                       auxplci = &a->plci[k];
+                                       if (auxplci->appl == &application[i]) /* application has a busy PLCI */
+                                       {
+                                               busy = true;
+                                               dbug(1, dprintf("Appl 0x%x is busy", i + 1));
+                                       }
+                                       else if (test_c_ind_mask_bit(auxplci, i)) /* application has an incoming call pending */
+                                       {
+                                               busy = true;
+                                               dbug(1, dprintf("Appl 0x%x has inc. call pending", i + 1));
+                                       }
+                               }
+                       }
+
+                       for (j = 0, group_found = 0; j <= (MAX_CIP_TYPES) && !busy && !group_found; j++)     /* build groups with free applications only */
+                       {
+                               if (j == MAX_CIP_TYPES)       /* all groups are in use but group still not found */
+                               {                           /* the MAX_CIP_TYPES group enables all calls because of field overflow */
+                                       appl_number_group_type[i] = MAX_CIP_TYPES;
+                                       group_found = true;
+                                       dbug(1, dprintf("Field overflow appl 0x%x", i + 1));
+                               }
+                               else if ((info_mask_group[j] == a->CIP_Mask[i]) && (cip_mask_group[j] == a->Info_Mask[i]))
+                               {                                      /* is group already present ?                  */
+                                       appl_number_group_type[i] = j | 0x80;  /* store the group number for each application */
+                                       group_found = true;
+                                       dbug(1, dprintf("Group 0x%x found with appl 0x%x, CIP=0x%lx", appl_number_group_type[i], i + 1, info_mask_group[j]));
+                               }
+                               else if (!info_mask_group[j])
+                               {                                      /* establish a new group                       */
+                                       appl_number_group_type[i] = j | 0x80;  /* store the group number for each application */
+                                       info_mask_group[j] = a->CIP_Mask[i]; /* store the new CIP mask for the new group    */
+                                       cip_mask_group[j] = a->Info_Mask[i]; /* store the new Info_Mask for this new group  */
+                                       group_found = true;
+                                       dbug(1, dprintf("New Group 0x%x established with appl 0x%x, CIP=0x%lx", appl_number_group_type[i], i + 1, info_mask_group[j]));
+                               }
+                       }
+               }
+       }
+
+       for (i = 0; i < max_appl; i++) /* Build group_optimization_mask_table */
+       {
+               if (appl_number_group_type[i]) /* application is free, has listens and is member of a group */
+               {
+                       if (appl_number_group_type[i] == MAX_CIP_TYPES)
+                       {
+                               dbug(1, dprintf("OverflowGroup 0x%x, valid appl = 0x%x, call enabled", appl_number_group_type[i], i + 1));
+                       }
+                       else
+                       {
+                               dbug(1, dprintf("Group 0x%x, valid appl = 0x%x", appl_number_group_type[i], i + 1));
+                               for (j = i + 1; j < max_appl; j++)   /* search other group members and mark them as busy        */
+                               {
+                                       if (appl_number_group_type[i] == appl_number_group_type[j])
+                                       {
+                                               dbug(1, dprintf("Appl 0x%x is member of group 0x%x, no call", j + 1, appl_number_group_type[j]));
+                                               clear_group_ind_mask_bit(plci, j);           /* disable call on other group members */
+                                               appl_number_group_type[j] = 0;       /* remove disabled group member from group list */
+                                       }
+                               }
+                       }
+               }
+               else                                                 /* application should not get a call */
+               {
+                       clear_group_ind_mask_bit(plci, i);
+               }
+       }
 
 }
 
@@ -14851,201 +14851,201 @@ static void group_optimization(DIVA_CAPI_ADAPTER   * a, PLCI   * plci)
 /* OS notifies the driver about a application Capi_Register */
 word CapiRegister(word id)
 {
-  word i,j,appls_found;
-
-  PLCI   *plci;
-  DIVA_CAPI_ADAPTER   *a;
-
-  for(i=0,appls_found=0; i<max_appl; i++)
-  {
-    if( application[i].Id && (application[i].Id!=id) )
-    {
-      appls_found++;                       /* an application has been found */
-    }
-  }
-
-  if(appls_found) return true;
-  for(i=0; i<max_adapter; i++)                   /* scan all adapters...    */
-  {
-    a = &adapter[i];
-    if(a->request)
-    {
-      if(a->flag_dynamic_l1_down)  /* remove adapter from L1 tristate (Huntgroup) */
-      {
-        if(!appls_found)           /* first application does a capi register   */
-        {
-          if((j=get_plci(a)))                    /* activate L1 of all adapters */
-          {
-            plci = &a->plci[j-1];
-            plci->command = 0;
-            add_p(plci,OAD,"\x01\xfd");
-            add_p(plci,CAI,"\x01\x80");
-            add_p(plci,UID,"\x06\x43\x61\x70\x69\x32\x30");
-            add_p(plci,SHIFT|6,NULL);
-            add_p(plci,SIN,"\x02\x00\x00");
-            plci->internal_command = START_L1_SIG_ASSIGN_PEND;
-            sig_req(plci,ASSIGN,DSIG_ID);
-            add_p(plci,FTY,"\x02\xff\x07"); /* l1 start */
-            sig_req(plci,SIG_CTRL,0);
-            send_req(plci);
-          }
-        }
-      }
-    }
-  }
-  return false;
+       word i, j, appls_found;
+
+       PLCI *plci;
+       DIVA_CAPI_ADAPTER *a;
+
+       for (i = 0, appls_found = 0; i < max_appl; i++)
+       {
+               if (application[i].Id && (application[i].Id != id))
+               {
+                       appls_found++;                       /* an application has been found */
+               }
+       }
+
+       if (appls_found) return true;
+       for (i = 0; i < max_adapter; i++)                   /* scan all adapters...    */
+       {
+               a = &adapter[i];
+               if (a->request)
+               {
+                       if (a->flag_dynamic_l1_down)  /* remove adapter from L1 tristate (Huntgroup) */
+                       {
+                               if (!appls_found)           /* first application does a capi register   */
+                               {
+                                       if ((j = get_plci(a)))                    /* activate L1 of all adapters */
+                                       {
+                                               plci = &a->plci[j - 1];
+                                               plci->command = 0;
+                                               add_p(plci, OAD, "\x01\xfd");
+                                               add_p(plci, CAI, "\x01\x80");
+                                               add_p(plci, UID, "\x06\x43\x61\x70\x69\x32\x30");
+                                               add_p(plci, SHIFT | 6, NULL);
+                                               add_p(plci, SIN, "\x02\x00\x00");
+                                               plci->internal_command = START_L1_SIG_ASSIGN_PEND;
+                                               sig_req(plci, ASSIGN, DSIG_ID);
+                                               add_p(plci, FTY, "\x02\xff\x07"); /* l1 start */
+                                               sig_req(plci, SIG_CTRL, 0);
+                                               send_req(plci);
+                                       }
+                               }
+                       }
+               }
+       }
+       return false;
 }
 
 /*------------------------------------------------------------------*/
 
 /* Functions for virtual Switching e.g. Transfer by join, Conference */
 
-static void VSwitchReqInd(PLCI   *plci, dword Id, byte   **parms)
-{
- word i;
- /* Format of vswitch_t:
- 0 byte length
- 1 byte VSWITCHIE
- 2 byte VSWITCH_REQ/VSWITCH_IND
- 3 byte reserved
- 4 word VSwitchcommand
- 6 word returnerror
- 8... Params
- */
- if(!plci ||
-  !plci->appl ||
-  !plci->State ||
-  plci->Sig.Ind==NCR_FACILITY
-  )
-  return;
- for(i=0;i<MAX_MULTI_IE;i++)
- {
-        if(!parms[i][0]) continue;
-  if(parms[i][0]<7)
-  {
-   parms[i][0]=0; /* kill it */
-   continue;
-  }
-  dbug(1,dprintf("VSwitchReqInd(%d)",parms[i][4]));
-  switch(parms[i][4])
-  {
-  case VSJOIN:
-   if(!plci->relatedPTYPLCI ||
-    (plci->ptyState!=S_ECT && plci->relatedPTYPLCI->ptyState!=S_ECT))
-   { /* Error */
-    break;
-   }
-   /* remember all necessary informations */
-   if(parms[i][0]!=11 || parms[i][8]!=3) /* Length Test */
-   {
-    break;
-   }
-   if(parms[i][2]==VSWITCH_IND && parms[i][9]==1)
-   {   /* first indication after ECT-Request on Consultation Call */
-    plci->vswitchstate=parms[i][9];
-    parms[i][9]=2; /* State */
-    /* now ask first Call to join */
-   }
-   else if(parms[i][2]==VSWITCH_REQ && parms[i][9]==3)
-   { /* Answer of VSWITCH_REQ from first Call */
-    plci->vswitchstate=parms[i][9];
-    /* tell consultation call to join
-    and the protocol capabilities of the first call */
-   }
-   else
-   { /* Error */
-    break;
-   }    
-   plci->vsprot=parms[i][10]; /* protocol */
-   plci->vsprotdialect=parms[i][11]; /* protocoldialect */
-   /* send join request to related PLCI */
-   parms[i][1]=VSWITCHIE;
-   parms[i][2]=VSWITCH_REQ;
-   
-   plci->relatedPTYPLCI->command = 0;
-   plci->relatedPTYPLCI->internal_command = VSWITCH_REQ_PEND;
-   add_p(plci->relatedPTYPLCI,ESC,&parms[i][0]);
-   sig_req(plci->relatedPTYPLCI,VSWITCH_REQ,0);
-   send_req(plci->relatedPTYPLCI);
-   break;
-  case VSTRANSPORT:
-  default:
-   if(plci->relatedPTYPLCI &&
-    plci->vswitchstate==3 &&
-    plci->relatedPTYPLCI->vswitchstate==3)
-   {
-    add_p(plci->relatedPTYPLCI,ESC,&parms[i][0]);
-    sig_req(plci->relatedPTYPLCI,VSWITCH_REQ,0);
-    send_req(plci->relatedPTYPLCI);
-   }
-   break;
-  }  
-  parms[i][0]=0; /* kill it */
- }
+static void VSwitchReqInd(PLCI *plci, dword Id, byte **parms)
+{
+       word i;
+       /* Format of vswitch_t:
+          0 byte length
+          1 byte VSWITCHIE
+          2 byte VSWITCH_REQ/VSWITCH_IND
+          3 byte reserved
+          4 word VSwitchcommand
+          6 word returnerror
+          8... Params
+       */
+       if (!plci ||
+           !plci->appl ||
+           !plci->State ||
+           plci->Sig.Ind == NCR_FACILITY
+               )
+               return;
+
+       for (i = 0; i < MAX_MULTI_IE; i++)
+       {
+               if (!parms[i][0]) continue;
+               if (parms[i][0] < 7)
+               {
+                       parms[i][0] = 0; /* kill it */
+                       continue;
+               }
+               dbug(1, dprintf("VSwitchReqInd(%d)", parms[i][4]));
+               switch (parms[i][4])
+               {
+               case VSJOIN:
+                       if (!plci->relatedPTYPLCI ||
+                           (plci->ptyState != S_ECT && plci->relatedPTYPLCI->ptyState != S_ECT))
+                       { /* Error */
+                               break;
+                       }
+                       /* remember all necessary informations */
+                       if (parms[i][0] != 11 || parms[i][8] != 3) /* Length Test */
+                       {
+                               break;
+                       }
+                       if (parms[i][2] == VSWITCH_IND && parms[i][9] == 1)
+                       {   /* first indication after ECT-Request on Consultation Call */
+                               plci->vswitchstate = parms[i][9];
+                               parms[i][9] = 2; /* State */
+                               /* now ask first Call to join */
+                       }
+                       else if (parms[i][2] == VSWITCH_REQ && parms[i][9] == 3)
+                       { /* Answer of VSWITCH_REQ from first Call */
+                               plci->vswitchstate = parms[i][9];
+                               /* tell consultation call to join
+                                  and the protocol capabilities of the first call */
+                       }
+                       else
+                       { /* Error */
+                               break;
+                       }
+                       plci->vsprot = parms[i][10]; /* protocol */
+                       plci->vsprotdialect = parms[i][11]; /* protocoldialect */
+                       /* send join request to related PLCI */
+                       parms[i][1] = VSWITCHIE;
+                       parms[i][2] = VSWITCH_REQ;
+
+                       plci->relatedPTYPLCI->command = 0;
+                       plci->relatedPTYPLCI->internal_command = VSWITCH_REQ_PEND;
+                       add_p(plci->relatedPTYPLCI, ESC, &parms[i][0]);
+                       sig_req(plci->relatedPTYPLCI, VSWITCH_REQ, 0);
+                       send_req(plci->relatedPTYPLCI);
+                       break;
+               case VSTRANSPORT:
+               default:
+                       if (plci->relatedPTYPLCI &&
+                           plci->vswitchstate == 3 &&
+                           plci->relatedPTYPLCI->vswitchstate == 3)
+                       {
+                               add_p(plci->relatedPTYPLCI, ESC, &parms[i][0]);
+                               sig_req(plci->relatedPTYPLCI, VSWITCH_REQ, 0);
+                               send_req(plci->relatedPTYPLCI);
+                       }
+                       break;
+               }
+               parms[i][0] = 0; /* kill it */
+       }
 }
 
 
 /*------------------------------------------------------------------*/
 
-static int diva_get_dma_descriptor (PLCI   *plci, dword   *dma_magic) {
-  ENTITY e;
-  IDI_SYNC_REQ* pReq = (IDI_SYNC_REQ*)&e;
-
-  if (!(diva_xdi_extended_features & DIVA_CAPI_XDI_PROVIDES_RX_DMA)) {
-    return (-1);
-  }
-
-  pReq->xdi_dma_descriptor_operation.Req = 0;
-  pReq->xdi_dma_descriptor_operation.Rc = IDI_SYNC_REQ_DMA_DESCRIPTOR_OPERATION;
-
-  pReq->xdi_dma_descriptor_operation.info.operation =     IDI_SYNC_REQ_DMA_DESCRIPTOR_ALLOC;
-  pReq->xdi_dma_descriptor_operation.info.descriptor_number  = -1;
-  pReq->xdi_dma_descriptor_operation.info.descriptor_address = NULL;
-  pReq->xdi_dma_descriptor_operation.info.descriptor_magic   = 0;
-
-  e.user[0] = plci->adapter->Id - 1;
-  plci->adapter->request((ENTITY*)pReq);
-
-  if (!pReq->xdi_dma_descriptor_operation.info.operation &&
-      (pReq->xdi_dma_descriptor_operation.info.descriptor_number >= 0) &&
-      pReq->xdi_dma_descriptor_operation.info.descriptor_magic) {
-    *dma_magic = pReq->xdi_dma_descriptor_operation.info.descriptor_magic;
-    dbug(3,dprintf("dma_alloc, a:%d (%d-%08x)",
-         plci->adapter->Id,
-         pReq->xdi_dma_descriptor_operation.info.descriptor_number,
-         *dma_magic));
-    return (pReq->xdi_dma_descriptor_operation.info.descriptor_number);
-  } else {
-    dbug(1,dprintf("dma_alloc failed"));
-    return (-1);
-  }
-}
-
-static void diva_free_dma_descriptor (PLCI   *plci, int nr) {
-  ENTITY e;
-  IDI_SYNC_REQ* pReq = (IDI_SYNC_REQ*)&e;
-
-  if (nr < 0) {
-    return;
-  }
-
-  pReq->xdi_dma_descriptor_operation.Req = 0;
-  pReq->xdi_dma_descriptor_operation.Rc = IDI_SYNC_REQ_DMA_DESCRIPTOR_OPERATION;
-
-  pReq->xdi_dma_descriptor_operation.info.operation =                                                IDI_SYNC_REQ_DMA_DESCRIPTOR_FREE;
-  pReq->xdi_dma_descriptor_operation.info.descriptor_number  = nr;
-  pReq->xdi_dma_descriptor_operation.info.descriptor_address = NULL;
-  pReq->xdi_dma_descriptor_operation.info.descriptor_magic   = 0;
-
-  e.user[0] = plci->adapter->Id - 1;
-  plci->adapter->request((ENTITY*)pReq);
-
-  if (!pReq->xdi_dma_descriptor_operation.info.operation) {
-    dbug(1,dprintf("dma_free(%d)", nr));
-  } else {
-    dbug(1,dprintf("dma_free failed (%d)", nr));
-  }
+static int diva_get_dma_descriptor(PLCI *plci, dword   *dma_magic) {
+       ENTITY e;
+       IDI_SYNC_REQ *pReq = (IDI_SYNC_REQ *)&e;
+
+       if (!(diva_xdi_extended_features & DIVA_CAPI_XDI_PROVIDES_RX_DMA)) {
+               return (-1);
+       }
+
+       pReq->xdi_dma_descriptor_operation.Req = 0;
+       pReq->xdi_dma_descriptor_operation.Rc = IDI_SYNC_REQ_DMA_DESCRIPTOR_OPERATION;
+
+       pReq->xdi_dma_descriptor_operation.info.operation = IDI_SYNC_REQ_DMA_DESCRIPTOR_ALLOC;
+       pReq->xdi_dma_descriptor_operation.info.descriptor_number  = -1;
+       pReq->xdi_dma_descriptor_operation.info.descriptor_address = NULL;
+       pReq->xdi_dma_descriptor_operation.info.descriptor_magic   = 0;
+
+       e.user[0] = plci->adapter->Id - 1;
+       plci->adapter->request((ENTITY *)pReq);
+
+       if (!pReq->xdi_dma_descriptor_operation.info.operation &&
+           (pReq->xdi_dma_descriptor_operation.info.descriptor_number >= 0) &&
+           pReq->xdi_dma_descriptor_operation.info.descriptor_magic) {
+               *dma_magic = pReq->xdi_dma_descriptor_operation.info.descriptor_magic;
+               dbug(3, dprintf("dma_alloc, a:%d (%d-%08x)",
+                               plci->adapter->Id,
+                               pReq->xdi_dma_descriptor_operation.info.descriptor_number,
+                               *dma_magic));
+               return (pReq->xdi_dma_descriptor_operation.info.descriptor_number);
+       } else {
+               dbug(1, dprintf("dma_alloc failed"));
+               return (-1);
+       }
+}
+
+static void diva_free_dma_descriptor(PLCI *plci, int nr) {
+       ENTITY e;
+       IDI_SYNC_REQ *pReq = (IDI_SYNC_REQ *)&e;
+
+       if (nr < 0) {
+               return;
+       }
+
+       pReq->xdi_dma_descriptor_operation.Req = 0;
+       pReq->xdi_dma_descriptor_operation.Rc = IDI_SYNC_REQ_DMA_DESCRIPTOR_OPERATION;
+
+       pReq->xdi_dma_descriptor_operation.info.operation = IDI_SYNC_REQ_DMA_DESCRIPTOR_FREE;
+       pReq->xdi_dma_descriptor_operation.info.descriptor_number  = nr;
+       pReq->xdi_dma_descriptor_operation.info.descriptor_address = NULL;
+       pReq->xdi_dma_descriptor_operation.info.descriptor_magic   = 0;
+
+       e.user[0] = plci->adapter->Id - 1;
+       plci->adapter->request((ENTITY *)pReq);
+
+       if (!pReq->xdi_dma_descriptor_operation.info.operation) {
+               dbug(1, dprintf("dma_free(%d)", nr));
+       } else {
+               dbug(1, dprintf("dma_free failed (%d)", nr));
+       }
 }
 
 /*------------------------------------------------------------------*/
index a861dac..83e9ed8 100644 (file)
@@ -1,26 +1,26 @@
 
 /*
  *
-  Copyright (c) Eicon Networks, 2002.
+ Copyright (c) Eicon Networks, 2002.
  *
-  This source file is supplied for the use with
-  Eicon Networks range of DIVA Server Adapters.
+ This source file is supplied for the use with
+ Eicon Networks range of DIVA Server Adapters.
  *
-  Eicon File Revision :    2.1
+ Eicon File Revision :    2.1
  *
-  This program is free software; you can redistribute it and/or modify
-  it under the terms of the GNU General Public License as published by
-  the Free Software Foundation; either version 2, or (at your option)
-  any later version.
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
  *
-  This program is distributed in the hope that it will be useful,
-  but WITHOUT ANY WARRANTY OF ANY KIND WHATSOEVER INCLUDING ANY
-  implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-  See the GNU General Public License for more details.
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY OF ANY KIND WHATSOEVER INCLUDING ANY
+ implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ See the GNU General Public License for more details.
  *
-  You should have received a copy of the GNU General Public License
-  along with this program; if not, write to the Free Software
-  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  *
  */
 /*----------------------------------------------------------------------------
 /* CPU exception context structure in MP shared ram after trap */
 typedef struct mp_xcptcontext_s MP_XCPTC;
 struct mp_xcptcontext_s {
-    dword       sr;
-    dword       cr;
-    dword       epc;
-    dword       vaddr;
-    dword       regs[32];
-    dword       mdlo;
-    dword       mdhi;
-    dword       reseverd;
-    dword       xclass;
+       dword       sr;
+       dword       cr;
+       dword       epc;
+       dword       vaddr;
+       dword       regs[32];
+       dword       mdlo;
+       dword       mdhi;
+       dword       reseverd;
+       dword       xclass;
 };
 /* boot interface structure for PRI */
 struct mp_load {
-  dword     volatile cmd;
-  dword     volatile addr;
-  dword     volatile len;
-  dword     volatile err;
-  dword     volatile live;
-  dword     volatile res1[0x1b];
-  dword     volatile TrapId;    /* has value 0x999999XX on a CPU trap */
-  dword     volatile res2[0x03];
-  MP_XCPTC  volatile xcpt;      /* contains register dump */
-  dword     volatile rest[((0x1020>>2)-6) - 0x1b - 1 - 0x03 - (sizeof(MP_XCPTC)>>2)];
-  dword     volatile signature;
-  dword data[60000]; /* real interface description */
+       dword     volatile cmd;
+       dword     volatile addr;
+       dword     volatile len;
+       dword     volatile err;
+       dword     volatile live;
+       dword     volatile res1[0x1b];
+       dword     volatile TrapId;    /* has value 0x999999XX on a CPU trap */
+       dword     volatile res2[0x03];
+       MP_XCPTC  volatile xcpt;      /* contains register dump */
+       dword     volatile rest[((0x1020 >> 2) - 6) - 0x1b - 1 - 0x03 - (sizeof(MP_XCPTC) >> 2)];
+       dword     volatile signature;
+       dword data[60000]; /* real interface description */
 };
 /*----------------------------------------------------------------------------*/
 /* SERVER 4BRI (Quattro PCI)                                                  */
@@ -150,11 +150,11 @@ struct mp_load {
 #define CS_BASEREG    0x0018
 #define BOOT_BASEREG  0x001c
 #define GTREGS_BASEREG 0x0024   /*GTRegsBase reg-contain the base addr where*/
-                                /*the GT64010 internal regs where mapped    */
+                               /*the GT64010 internal regs where mapped    */
 /*
  *  GT64010 internal registers
  */
-        /* DRAM device coding  */
+/* DRAM device coding  */
 #define LOW_RAS0_DREG 0x0400    /*Ras0 low decode address*/
 #define HI_RAS0_DREG  0x0404    /*Ras0 high decode address*/
 #define LOW_RAS1_DREG 0x0408    /*Ras1 low decode address*/
@@ -163,7 +163,7 @@ struct mp_load {
 #define HI_RAS2_DREG  0x0414    /*Ras2 high decode address*/
 #define LOW_RAS3_DREG 0x0418    /*Ras3 low decode address*/
 #define HI_RAS3_DREG  0x041c    /*Ras3 high decode address*/
-        /* I/O CS device coding  */
+/* I/O CS device coding  */
 #define LOW_CS0_DREG  0x0420 /* CS0* low decode register */
 #define HI_CS0_DREG   0x0424 /* CS0* high decode register */
 #define LOW_CS1_DREG  0x0428 /* CS1* low decode register */
@@ -172,20 +172,20 @@ struct mp_load {
 #define HI_CS2_DREG   0x0434 /* CS2* high decode register */
 #define LOW_CS3_DREG  0x0438 /* CS3* low decode register */
 #define HI_CS3_DREG   0x043c /* CS3* high decode register */
-        /* Boot PROM device coding */
+/* Boot PROM device coding */
 #define LOW_BOOTCS_DREG 0x0440 /* Boot CS low decode register */
 #define HI_BOOTCS_DREG 0x0444 /* Boot CS High decode register */
-        /* DRAM group coding (for CPU)  */
+/* DRAM group coding (for CPU)  */
 #define LO_RAS10_GREG 0x0008    /*Ras1..0 group low decode address*/
 #define HI_RAS10_GREG 0x0010    /*Ras1..0 group high decode address*/
 #define LO_RAS32_GREG 0x0018    /*Ras3..2 group low decode address  */
 #define HI_RAS32_GREG 0x0020    /*Ras3..2 group high decode address  */
-        /* I/O CS group coding for (CPU)  */
+/* I/O CS group coding for (CPU)  */
 #define LO_CS20_GREG  0x0028 /* CS2..0 group low decode register */
 #define HI_CS20_GREG  0x0030 /* CS2..0 group high decode register */
 #define LO_CS3B_GREG  0x0038 /* CS3 & PROM group low decode register */
 #define HI_CS3B_GREG  0x0040 /* CS3 & PROM group high decode register */
-        /* Galileo specific PCI config. */
+/* Galileo specific PCI config. */
 #define PCI_TIMEOUT_RET 0x0c04 /* Time Out and retry register */
 #define RAS10_BANKSIZE 0x0c08 /* RAS 1..0 group PCI bank size */
 #define RAS32_BANKSIZE 0x0c0c /* RAS 3..2 group PCI bank size */
index a564b75..d607260 100644 (file)
@@ -27,7 +27,7 @@ static dword notify_handle;
 static DESCRIPTOR DAdapter;
 static DESCRIPTOR MAdapter;
 static DESCRIPTOR MaintDescriptor =
-    { IDI_DIMAINT, 0, 0, (IDI_CALL) diva_maint_prtComp };
+{ IDI_DIMAINT, 0, 0, (IDI_CALL) diva_maint_prtComp };
 
 extern int diva_os_copy_to_user(void *os_handle, void __user *dst,
                                const void *src, int length);
@@ -44,7 +44,7 @@ static void no_printf(unsigned char *x, ...)
 /*
  *  DIDD callback function
  */
-static void *didd_callback(void *context, DESCRIPTOR * adapter,
+static void *didd_callback(void *context, DESCRIPTOR *adapter,
                           int removal)
 {
        if (adapter->type == IDI_DADAPTER) {
@@ -87,20 +87,20 @@ static int DIVA_INIT_FUNCTION connect_didd(void)
                        memcpy(&DAdapter, &DIDD_Table[x], sizeof(DAdapter));
                        req.didd_notify.e.Req = 0;
                        req.didd_notify.e.Rc =
-                           IDI_SYNC_REQ_DIDD_REGISTER_ADAPTER_NOTIFY;
+                               IDI_SYNC_REQ_DIDD_REGISTER_ADAPTER_NOTIFY;
                        req.didd_notify.info.callback = (void *)didd_callback;
                        req.didd_notify.info.context = NULL;
-                       DAdapter.request((ENTITY *) & req);
+                       DAdapter.request((ENTITY *)&req);
                        if (req.didd_notify.e.Rc != 0xff)
                                return (0);
                        notify_handle = req.didd_notify.info.handle;
                        /* Register MAINT (me) */
                        req.didd_add_adapter.e.Req = 0;
                        req.didd_add_adapter.e.Rc =
-                           IDI_SYNC_REQ_DIDD_ADD_ADAPTER;
+                               IDI_SYNC_REQ_DIDD_ADD_ADAPTER;
                        req.didd_add_adapter.info.descriptor =
-                           (void *) &MaintDescriptor;
-                       DAdapter.request((ENTITY *) & req);
+                               (void *) &MaintDescriptor;
+                       DAdapter.request((ENTITY *)&req);
                        if (req.didd_add_adapter.e.Rc != 0xff)
                                return (0);
                } else if ((DIDD_Table[x].type > 0)
@@ -121,13 +121,13 @@ static void DIVA_EXIT_FUNCTION disconnect_didd(void)
        req.didd_notify.e.Req = 0;
        req.didd_notify.e.Rc = IDI_SYNC_REQ_DIDD_REMOVE_ADAPTER_NOTIFY;
        req.didd_notify.info.handle = notify_handle;
-       DAdapter.request((ENTITY *) & req);
+       DAdapter.request((ENTITY *)&req);
 
        req.didd_remove_adapter.e.Req = 0;
        req.didd_remove_adapter.e.Rc = IDI_SYNC_REQ_DIDD_REMOVE_ADAPTER;
        req.didd_remove_adapter.info.p_request =
-           (IDI_CALL) MaintDescriptor.request;
-       DAdapter.request((ENTITY *) & req);
+               (IDI_CALL) MaintDescriptor.request;
+       DAdapter.request((ENTITY *)&req);
 }
 
 /*
@@ -147,9 +147,9 @@ int maint_read_write(void __user *buf, int count)
                return (-EFAULT);
        }
 
-       cmd = *(dword *) & data[0];     /* command */
-       id = *(dword *) & data[4];      /* driver id */
-       mask = *(dword *) & data[8];    /* mask or size */
+       cmd = *(dword *)&data[0];       /* command */
+       id = *(dword *)&data[4];        /* driver id */
+       mask = *(dword *)&data[8];      /* mask or size */
 
        switch (cmd) {
        case DITRACE_CMD_GET_DRIVER_INFO:
@@ -178,19 +178,19 @@ int maint_read_write(void __user *buf, int count)
                }
                break;
 
-    /*
-       Filter commands will ignore the ID due to fact that filtering affects
-       the B- channel and Audio Tap trace levels only. Also MAINT driver will
-       select the right trace ID by itself
-       */
+               /*
+                 Filter commands will ignore the ID due to fact that filtering affects
+                 the B- channel and Audio Tap trace levels only. Also MAINT driver will
+                 select the right trace ID by itself
+               */
        case DITRACE_WRITE_SELECTIVE_TRACE_FILTER:
                if (!mask) {
-                       ret = diva_set_trace_filter (1, "*");
+                       ret = diva_set_trace_filter(1, "*");
                } else if (mask < sizeof(data)) {
-                       if (diva_os_copy_from_user(NULL, data, (char __user *)buf+12, mask)) {
+                       if (diva_os_copy_from_user(NULL, data, (char __user *)buf + 12, mask)) {
                                ret = -EFAULT;
                        } else {
-                               ret = diva_set_trace_filter ((int)mask, data);
+                               ret = diva_set_trace_filter((int)mask, data);
                        }
                } else {
                        ret = -EINVAL;
@@ -198,8 +198,8 @@ int maint_read_write(void __user *buf, int count)
                break;
 
        case DITRACE_READ_SELECTIVE_TRACE_FILTER:
-               if ((ret = diva_get_trace_filter (sizeof(data), data)) > 0) {
-                       if (diva_os_copy_to_user (NULL, buf, data, ret))
+               if ((ret = diva_get_trace_filter(sizeof(data), data)) > 0) {
+                       if (diva_os_copy_to_user(NULL, buf, data, ret))
                                ret = -EFAULT;
                } else {
                        ret = -ENODEV;
@@ -207,88 +207,88 @@ int maint_read_write(void __user *buf, int count)
                break;
 
        case DITRACE_READ_TRACE_ENTRY:{
-                       diva_os_spin_lock_magic_t old_irql;
-                       word size;
-                       diva_dbg_entry_head_t *pmsg;
-                       byte *pbuf;
+               diva_os_spin_lock_magic_t old_irql;
+               word size;
+               diva_dbg_entry_head_t *pmsg;
+               byte *pbuf;
 
-                       if (!(pbuf = diva_os_malloc(0, mask))) {
-                               return (-ENOMEM);
-                       }
+               if (!(pbuf = diva_os_malloc(0, mask))) {
+                       return (-ENOMEM);
+               }
 
-                       for(;;) {
-                               if (!(pmsg =
-                                   diva_maint_get_message(&size, &old_irql))) {
-                                       break;
-                               }
-                               if (size > mask) {
-                                       diva_maint_ack_message(0, &old_irql);
-                                       ret = -EINVAL;
-                                       break;
-                               }
-                               ret = size;
-                               memcpy(pbuf, pmsg, size);
-                               diva_maint_ack_message(1, &old_irql);
-                               if ((count < size) ||
-                                    diva_os_copy_to_user (NULL, buf, (void *) pbuf, size))
-                                                       ret = -EFAULT;
+               for (;;) {
+                       if (!(pmsg =
+                             diva_maint_get_message(&size, &old_irql))) {
+                               break;
+                       }
+                       if (size > mask) {
+                               diva_maint_ack_message(0, &old_irql);
+                               ret = -EINVAL;
                                break;
                        }
-                       diva_os_free(0, pbuf);
+                       ret = size;
+                       memcpy(pbuf, pmsg, size);
+                       diva_maint_ack_message(1, &old_irql);
+                       if ((count < size) ||
+                           diva_os_copy_to_user(NULL, buf, (void *) pbuf, size))
+                               ret = -EFAULT;
+                       break;
                }
+               diva_os_free(0, pbuf);
+       }
                break;
 
        case DITRACE_READ_TRACE_ENTRYS:{
-                       diva_os_spin_lock_magic_t old_irql;
-                       word size;
-                       diva_dbg_entry_head_t *pmsg;
-                       byte *pbuf = NULL;
-                       int written = 0;
+               diva_os_spin_lock_magic_t old_irql;
+               word size;
+               diva_dbg_entry_head_t *pmsg;
+               byte *pbuf = NULL;
+               int written = 0;
 
-                       if (mask < 4096) {
-                               ret = -EINVAL;
+               if (mask < 4096) {
+                       ret = -EINVAL;
+                       break;
+               }
+               if (!(pbuf = diva_os_malloc(0, mask))) {
+                       return (-ENOMEM);
+               }
+
+               for (;;) {
+                       if (!(pmsg =
+                             diva_maint_get_message(&size, &old_irql))) {
                                break;
                        }
-                       if (!(pbuf = diva_os_malloc(0, mask))) {
-                               return (-ENOMEM);
-                       }
-
-                       for (;;) {
-                               if (!(pmsg =
-                                    diva_maint_get_message(&size, &old_irql))) {
-                                       break;
-                               }
-                               if ((size + 8) > mask) {
-                                       diva_maint_ack_message(0, &old_irql);
-                                       break;
-                               }
-                               /*
-                                  Write entry length
-                                */
-                               pbuf[written++] = (byte) size;
-                               pbuf[written++] = (byte) (size >> 8);
-                               pbuf[written++] = 0;
-                               pbuf[written++] = 0;
-                               /*
-                                  Write message
-                                */
-                               memcpy(&pbuf[written], pmsg, size);
-                               diva_maint_ack_message(1, &old_irql);
-                               written += size;
-                               mask -= (size + 4);
+                       if ((size + 8) > mask) {
+                               diva_maint_ack_message(0, &old_irql);
+                               break;
                        }
+                       /*
+                         Write entry length
+                       */
+                       pbuf[written++] = (byte) size;
+                       pbuf[written++] = (byte) (size >> 8);
                        pbuf[written++] = 0;
                        pbuf[written++] = 0;
-                       pbuf[written++] = 0;
-                       pbuf[written++] = 0;
+                       /*
+                         Write message
+                       */
+                       memcpy(&pbuf[written], pmsg, size);
+                       diva_maint_ack_message(1, &old_irql);
+                       written += size;
+                       mask -= (size + 4);
+               }
+               pbuf[written++] = 0;
+               pbuf[written++] = 0;
+               pbuf[written++] = 0;
+               pbuf[written++] = 0;
 
-                       if ((count < written) || diva_os_copy_to_user(NULL, buf, (void *) pbuf, written)) {
-                               ret = -EFAULT;
-                       } else {
-                               ret = written;
-                       }
-                       diva_os_free(0, pbuf);
+               if ((count < written) || diva_os_copy_to_user(NULL, buf, (void *) pbuf, written)) {
+                       ret = -EFAULT;
+               } else {
+                       ret = written;
                }
+               diva_os_free(0, pbuf);
+       }
                break;
 
        default:
@@ -316,7 +316,7 @@ int DIVA_INIT_FUNCTION mntfunc_init(int *buffer_length, void **buffer,
        } else {
                while ((*buffer_length >= (64 * 1024))
                       &&
-                      (!(*buffer = diva_os_malloc (0, *buffer_length)))) {
+                      (!(*buffer = diva_os_malloc(0, *buffer_length)))) {
                        *buffer_length -= 1024;
                }
 
@@ -328,7 +328,7 @@ int DIVA_INIT_FUNCTION mntfunc_init(int *buffer_length, void **buffer,
 
        if (diva_maint_init(*buffer, *buffer_length, (diva_dbg_mem == 0))) {
                if (!diva_dbg_mem) {
-                       diva_os_free (0, *buffer);
+                       diva_os_free(0, *buffer);
                }
                DBG_ERR(("init: maint init failed"));
                return (0);
@@ -338,7 +338,7 @@ int DIVA_INIT_FUNCTION mntfunc_init(int *buffer_length, void **buffer,
                DBG_ERR(("init: failed to connect to DIDD."));
                diva_maint_finit();
                if (!diva_dbg_mem) {
-                       diva_os_free (0, *buffer);
+                       diva_os_free(0, *buffer);
                }
                return (0);
        }
@@ -362,7 +362,7 @@ void DIVA_EXIT_FUNCTION mntfunc_finit(void)
        disconnect_didd();
 
        if ((buffer = diva_maint_finit())) {
-               diva_os_free (0, buffer);
+               diva_os_free(0, buffer);
        }
 
        memset(&MAdapter, 0, sizeof(MAdapter));
index cb7616c..1891246 100644 (file)
@@ -27,12 +27,12 @@ static dword diva_xdiLoadFileLength = 0;
 extern void prepare_qBri_functions(PISDN_ADAPTER IoAdapter);
 extern void prepare_qBri2_functions(PISDN_ADAPTER IoAdapter);
 extern void diva_xdi_display_adapter_features(int card);
-extern void diva_add_slave_adapter(diva_os_xdi_adapter_t * a);
+extern void diva_add_slave_adapter(diva_os_xdi_adapter_t *a);
 
 extern int qBri_FPGA_download(PISDN_ADAPTER IoAdapter);
 extern void start_qBri_hardware(PISDN_ADAPTER IoAdapter);
 
-extern int diva_card_read_xlog(diva_os_xdi_adapter_t * a);
+extern int diva_card_read_xlog(diva_os_xdi_adapter_t *a);
 
 /*
 **  LOCALS
@@ -57,23 +57,23 @@ static unsigned long _4bri_v2_bri_bar_length[4] = {
 };
 
 
-static int diva_4bri_cleanup_adapter(diva_os_xdi_adapter_t * a);
-static int _4bri_get_serial_number(diva_os_xdi_adapter_t * a);
+static int diva_4bri_cleanup_adapter(diva_os_xdi_adapter_t *a);
+static int _4bri_get_serial_number(diva_os_xdi_adapter_t *a);
 static int diva_4bri_cmd_card_proc(struct _diva_os_xdi_adapter *a,
-                                  diva_xdi_um_cfg_cmd_t * cmd,
+                                  diva_xdi_um_cfg_cmd_t *cmd,
                                   int length);
-static int diva_4bri_cleanup_slave_adapters(diva_os_xdi_adapter_t * a);
-static int diva_4bri_write_fpga_image(diva_os_xdi_adapter_t * a,
-                                     byte * data, dword length);
+static int diva_4bri_cleanup_slave_adapters(diva_os_xdi_adapter_t *a);
+static int diva_4bri_write_fpga_image(diva_os_xdi_adapter_t *a,
+                                     byte *data, dword length);
 static int diva_4bri_reset_adapter(PISDN_ADAPTER IoAdapter);
 static int diva_4bri_write_sdram_block(PISDN_ADAPTER IoAdapter,
                                       dword address,
-                                      const byte * data,
+                                      const byte *data,
                                       dword length, dword limit);
 static int diva_4bri_start_adapter(PISDN_ADAPTER IoAdapter,
                                   dword start_address, dword features);
 static int check_qBri_interrupt(PISDN_ADAPTER IoAdapter);
-static int diva_4bri_stop_adapter(diva_os_xdi_adapter_t * a);
+static int diva_4bri_stop_adapter(diva_os_xdi_adapter_t *a);
 
 static int _4bri_is_rev_2_card(int card_ordinal)
 {
@@ -112,8 +112,8 @@ static void diva_4bri_set_addresses(diva_os_xdi_adapter_t *a)
        a->resources.pci.mem_type_id[MEM_TYPE_PROM] = 0;
 
        /*
-          Set up hardware related pointers
-        */
+         Set up hardware related pointers
+       */
        a->xdi_adapter.Address = a->resources.pci.addr[2];      /* BAR2 SDRAM  */
        a->xdi_adapter.Address += c_offset;
 
@@ -121,15 +121,15 @@ static void diva_4bri_set_addresses(diva_os_xdi_adapter_t *a)
 
        a->xdi_adapter.ram = a->resources.pci.addr[2];  /* BAR2 SDRAM  */
        a->xdi_adapter.ram += c_offset + (offset - MQ_SHARED_RAM_SIZE);
-       
+
        a->xdi_adapter.reset = a->resources.pci.addr[0];        /* BAR0 CONFIG */
        /*
-          ctlReg contains the register address for the MIPS CPU reset control
-        */
+         ctlReg contains the register address for the MIPS CPU reset control
+       */
        a->xdi_adapter.ctlReg = a->resources.pci.addr[3];       /* BAR3 CNTRL  */
        /*
-          prom contains the register address for FPGA and EEPROM programming
-        */
+         prom contains the register address for FPGA and EEPROM programming
+       */
        a->xdi_adapter.prom = &a->xdi_adapter.reset[0x6E];
 }
 
@@ -141,7 +141,7 @@ static void diva_4bri_set_addresses(diva_os_xdi_adapter_t *a)
 **
 **  Called by master adapter, that will initialize and add slave adapters
 */
-int diva_4bri_init_card(diva_os_xdi_adapter_t * a)
+int diva_4bri_init_card(diva_os_xdi_adapter_t *a)
 {
        int bar, i;
        byte __iomem *p;
@@ -168,48 +168,48 @@ int diva_4bri_init_card(diva_os_xdi_adapter_t * a)
        DBG_TRC(("SDRAM_LENGTH=%08x, tasks=%d, factor=%d",
                 bar_length[2], tasks, factor))
 
-       /*
-          Get Serial Number
-          The serial number of 4BRI is accessible in accordance with PCI spec
-          via command register located in configuration space, also we do not
-          have to map any BAR before we can access it
-        */
-       if (!_4bri_get_serial_number(a)) {
-               DBG_ERR(("A: 4BRI can't get Serial Number"))
-               diva_4bri_cleanup_adapter(a);
-               return (-1);
-       }
+               /*
+                 Get Serial Number
+                 The serial number of 4BRI is accessible in accordance with PCI spec
+                 via command register located in configuration space, also we do not
+                 have to map any BAR before we can access it
+               */
+               if (!_4bri_get_serial_number(a)) {
+                       DBG_ERR(("A: 4BRI can't get Serial Number"))
+                               diva_4bri_cleanup_adapter(a);
+                       return (-1);
+               }
 
        /*
-          Set properties
-        */
+         Set properties
+       */
        a->xdi_adapter.Properties = CardProperties[a->CardOrdinal];
        DBG_LOG(("Load %s, SN:%ld, bus:%02x, func:%02x",
                 a->xdi_adapter.Properties.Name,
                 a->xdi_adapter.serialNo,
                 a->resources.pci.bus, a->resources.pci.func))
 
-       /*
-          First initialization step: get and check hardware resoures.
-          Do not map resources and do not access card at this step
-        */
-       for (bar = 0; bar < 4; bar++) {
-               a->resources.pci.bar[bar] =
-                   divasa_get_pci_bar(a->resources.pci.bus,
-                                      a->resources.pci.func, bar,
-                                      a->resources.pci.hdev);
-               if (!a->resources.pci.bar[bar]
-                   || (a->resources.pci.bar[bar] == 0xFFFFFFF0)) {
-                       DBG_ERR(
-                               ("A: invalid bar[%d]=%08x", bar,
-                                a->resources.pci.bar[bar]))
-                       return (-1);
+               /*
+                 First initialization step: get and check hardware resoures.
+                 Do not map resources and do not access card at this step
+               */
+               for (bar = 0; bar < 4; bar++) {
+                       a->resources.pci.bar[bar] =
+                               divasa_get_pci_bar(a->resources.pci.bus,
+                                                  a->resources.pci.func, bar,
+                                                  a->resources.pci.hdev);
+                       if (!a->resources.pci.bar[bar]
+                           || (a->resources.pci.bar[bar] == 0xFFFFFFF0)) {
+                               DBG_ERR(
+                                       ("A: invalid bar[%d]=%08x", bar,
+                                        a->resources.pci.bar[bar]))
+                                       return (-1);
+                       }
                }
-       }
        a->resources.pci.irq =
-           (byte) divasa_get_pci_irq(a->resources.pci.bus,
-                                     a->resources.pci.func,
-                                     a->resources.pci.hdev);
+               (byte) divasa_get_pci_irq(a->resources.pci.bus,
+                                         a->resources.pci.func,
+                                         a->resources.pci.hdev);
        if (!a->resources.pci.irq) {
                DBG_ERR(("A: invalid irq"));
                return (-1);
@@ -218,30 +218,30 @@ int diva_4bri_init_card(diva_os_xdi_adapter_t * a)
        a->xdi_adapter.sdram_bar = a->resources.pci.bar[2];
 
        /*
-          Map all MEMORY BAR's
-        */
+         Map all MEMORY BAR's
+       */
        for (bar = 0; bar < 4; bar++) {
                if (bar != 1) { /* ignore I/O */
                        a->resources.pci.addr[bar] =
-                           divasa_remap_pci_bar(a, bar, a->resources.pci.bar[bar],
-                                                bar_length[bar]);
+                               divasa_remap_pci_bar(a, bar, a->resources.pci.bar[bar],
+                                                    bar_length[bar]);
                        if (!a->resources.pci.addr[bar]) {
                                DBG_ERR(("A: 4BRI: can't map bar[%d]", bar))
-                               diva_4bri_cleanup_adapter(a);
+                                       diva_4bri_cleanup_adapter(a);
                                return (-1);
                        }
                }
        }
 
        /*
-          Register I/O port
-        */
+         Register I/O port
+       */
        sprintf(&a->port_name[0], "DIVA 4BRI %ld", (long) a->xdi_adapter.serialNo);
 
        if (diva_os_register_io_port(a, 1, a->resources.pci.bar[1],
                                     bar_length[1], &a->port_name[0], 1)) {
                DBG_ERR(("A: 4BRI: can't register bar[1]"))
-               diva_4bri_cleanup_adapter(a);
+                       diva_4bri_cleanup_adapter(a);
                return (-1);
        }
 
@@ -249,23 +249,23 @@ int diva_4bri_init_card(diva_os_xdi_adapter_t * a)
                (void *) (unsigned long) a->resources.pci.bar[1];
 
        /*
-          Set cleanup pointer for base adapter only, so slave adapter
-          will be unable to get cleanup
-        */
+         Set cleanup pointer for base adapter only, so slave adapter
+         will be unable to get cleanup
+       */
        a->interface.cleanup_adapter_proc = diva_4bri_cleanup_adapter;
 
        /*
-          Create slave adapters
-        */
+         Create slave adapters
+       */
        if (tasks > 1) {
                if (!(a->slave_adapters[0] =
-                    (diva_os_xdi_adapter_t *) diva_os_malloc(0, sizeof(*a))))
+                     (diva_os_xdi_adapter_t *) diva_os_malloc(0, sizeof(*a))))
                {
                        diva_4bri_cleanup_adapter(a);
                        return (-1);
                }
                if (!(a->slave_adapters[1] =
-                    (diva_os_xdi_adapter_t *) diva_os_malloc(0, sizeof(*a))))
+                     (diva_os_xdi_adapter_t *) diva_os_malloc(0, sizeof(*a))))
                {
                        diva_os_free(0, a->slave_adapters[0]);
                        a->slave_adapters[0] = NULL;
@@ -273,7 +273,7 @@ int diva_4bri_init_card(diva_os_xdi_adapter_t * a)
                        return (-1);
                }
                if (!(a->slave_adapters[2] =
-                    (diva_os_xdi_adapter_t *) diva_os_malloc(0, sizeof(*a))))
+                     (diva_os_xdi_adapter_t *) diva_os_malloc(0, sizeof(*a))))
                {
                        diva_os_free(0, a->slave_adapters[0]);
                        diva_os_free(0, a->slave_adapters[1]);
@@ -293,10 +293,10 @@ int diva_4bri_init_card(diva_os_xdi_adapter_t * a)
        adapter_list[3] = a->slave_adapters[2];
 
        /*
-          Allocate slave list
-        */
+         Allocate slave list
+       */
        quadro_list =
-           (PADAPTER_LIST_ENTRY) diva_os_malloc(0, sizeof(*quadro_list));
+               (PADAPTER_LIST_ENTRY) diva_os_malloc(0, sizeof(*quadro_list));
        if (!(a->slave_list = quadro_list)) {
                for (i = 0; i < (tasks - 1); i++) {
                        diva_os_free(0, a->slave_adapters[i]);
@@ -308,14 +308,14 @@ int diva_4bri_init_card(diva_os_xdi_adapter_t * a)
        memset(quadro_list, 0x00, sizeof(*quadro_list));
 
        /*
-          Set interfaces
-        */
+         Set interfaces
+       */
        a->xdi_adapter.QuadroList = quadro_list;
        for (i = 0; i < tasks; i++) {
                adapter_list[i]->xdi_adapter.ControllerNumber = i;
                adapter_list[i]->xdi_adapter.tasks = tasks;
                quadro_list->QuadroAdapter[i] =
-                   &adapter_list[i]->xdi_adapter;
+                       &adapter_list[i]->xdi_adapter;
        }
 
        for (i = 0; i < tasks; i++) {
@@ -324,21 +324,21 @@ int diva_4bri_init_card(diva_os_xdi_adapter_t * a)
                diva_current->dsp_mask = 0x00000003;
 
                diva_current->xdi_adapter.a.io =
-                   &diva_current->xdi_adapter;
+                       &diva_current->xdi_adapter;
                diva_current->xdi_adapter.DIRequest = request;
                diva_current->interface.cmd_proc = diva_4bri_cmd_card_proc;
                diva_current->xdi_adapter.Properties =
-                   CardProperties[a->CardOrdinal];
+                       CardProperties[a->CardOrdinal];
                diva_current->CardOrdinal = a->CardOrdinal;
 
                diva_current->xdi_adapter.Channels =
-                   CardProperties[a->CardOrdinal].Channels;
+                       CardProperties[a->CardOrdinal].Channels;
                diva_current->xdi_adapter.e_max =
-                   CardProperties[a->CardOrdinal].E_info;
+                       CardProperties[a->CardOrdinal].E_info;
                diva_current->xdi_adapter.e_tbl =
-                   diva_os_malloc(0,
-                                  diva_current->xdi_adapter.e_max *
-                                  sizeof(E_INFO));
+                       diva_os_malloc(0,
+                                      diva_current->xdi_adapter.e_max *
+                                      sizeof(E_INFO));
 
                if (!diva_current->xdi_adapter.e_tbl) {
                        diva_4bri_cleanup_slave_adapters(a);
@@ -370,8 +370,8 @@ int diva_4bri_init_card(diva_os_xdi_adapter_t * a)
 
                strcpy(diva_current->xdi_adapter.req_soft_isr. dpc_thread_name, "kdivas4brid");
 
-               if (diva_os_initialize_soft_isr (&diva_current->xdi_adapter.req_soft_isr, DIDpcRoutine,
-                    &diva_current->xdi_adapter)) {
+               if (diva_os_initialize_soft_isr(&diva_current->xdi_adapter.req_soft_isr, DIDpcRoutine,
+                                               &diva_current->xdi_adapter)) {
                        diva_4bri_cleanup_slave_adapters(a);
                        diva_4bri_cleanup_adapter(a);
                        for (i = 1; i < (tasks - 1); i++) {
@@ -381,10 +381,10 @@ int diva_4bri_init_card(diva_os_xdi_adapter_t * a)
                }
 
                /*
-                  Do not initialize second DPC - only one thread will be created
-                */
+                 Do not initialize second DPC - only one thread will be created
+               */
                diva_current->xdi_adapter.isr_soft_isr.object =
-                   diva_current->xdi_adapter.req_soft_isr.object;
+                       diva_current->xdi_adapter.req_soft_isr.object;
        }
 
        if (v2) {
@@ -397,12 +397,12 @@ int diva_4bri_init_card(diva_os_xdi_adapter_t * a)
                diva_current = adapter_list[i];
                if (i)
                        memcpy(&diva_current->resources, &a->resources, sizeof(divas_card_resources_t));
-               diva_current->resources.pci.qoffset = (a->xdi_adapter.MemorySize >> factor); 
+               diva_current->resources.pci.qoffset = (a->xdi_adapter.MemorySize >> factor);
        }
 
        /*
-          Set up hardware related pointers
-        */
+         Set up hardware related pointers
+       */
        a->xdi_adapter.cfg = (void *) (unsigned long) a->resources.pci.bar[0];  /* BAR0 CONFIG */
        a->xdi_adapter.port = (void *) (unsigned long) a->resources.pci.bar[1]; /* BAR1        */
        a->xdi_adapter.ctlReg = (void *) (unsigned long) a->resources.pci.bar[3];       /* BAR3 CNTRL  */
@@ -415,21 +415,21 @@ int diva_4bri_init_card(diva_os_xdi_adapter_t * a)
                Slave->sdram_bar = a->xdi_adapter.sdram_bar;
                if (i) {
                        Slave->serialNo = ((dword) (Slave->ControllerNumber << 24)) |
-                                       a->xdi_adapter.serialNo;
+                               a->xdi_adapter.serialNo;
                        Slave->cardType = a->xdi_adapter.cardType;
                }
        }
 
        /*
-          reset contains the base address for the PLX 9054 register set
-        */
+         reset contains the base address for the PLX 9054 register set
+       */
        p = DIVA_OS_MEM_ATTACH_RESET(&a->xdi_adapter);
        WRITE_BYTE(&p[PLX9054_INTCSR], 0x00);   /* disable PCI interrupts */
        DIVA_OS_MEM_DETACH_RESET(&a->xdi_adapter, p);
 
        /*
-          Set IRQ handler
-        */
+         Set IRQ handler
+       */
        a->xdi_adapter.irq_info.irq_nr = a->resources.pci.irq;
        sprintf(a->xdi_adapter.irq_info.irq_name, "DIVA 4BRI %ld",
                (long) a->xdi_adapter.serialNo);
@@ -447,8 +447,8 @@ int diva_4bri_init_card(diva_os_xdi_adapter_t * a)
        a->xdi_adapter.irq_info.registered = 1;
 
        /*
-          Add three slave adapters
-        */
+         Add three slave adapters
+       */
        if (tasks > 1) {
                diva_add_slave_adapter(adapter_list[1]);
                diva_add_slave_adapter(adapter_list[2]);
@@ -466,33 +466,33 @@ int diva_4bri_init_card(diva_os_xdi_adapter_t * a)
 **  this is guaranteed by design: cleanup callback is set
 **  by master adapter only
 */
-static int diva_4bri_cleanup_adapter(diva_os_xdi_adapter_t * a)
+static int diva_4bri_cleanup_adapter(diva_os_xdi_adapter_t *a)
 {
        int bar;
 
        /*
-          Stop adapter if running
-        */
+         Stop adapter if running
+       */
        if (a->xdi_adapter.Initialized) {
                diva_4bri_stop_adapter(a);
        }
 
        /*
-          Remove IRQ handler
-        */
+         Remove IRQ handler
+       */
        if (a->xdi_adapter.irq_info.registered) {
                diva_os_remove_irq(a, a->xdi_adapter.irq_info.irq_nr);
        }
        a->xdi_adapter.irq_info.registered = 0;
 
        /*
-          Free DPC's and spin locks on all adapters
-        */
+         Free DPC's and spin locks on all adapters
+       */
        diva_4bri_cleanup_slave_adapters(a);
 
        /*
-          Unmap all BARS
-        */
+         Unmap all BARS
+       */
        for (bar = 0; bar < 4; bar++) {
                if (bar != 1) {
                        if (a->resources.pci.bar[bar]
@@ -505,8 +505,8 @@ static int diva_4bri_cleanup_adapter(diva_os_xdi_adapter_t * a)
        }
 
        /*
-          Unregister I/O
-        */
+         Unregister I/O
+       */
        if (a->resources.pci.bar[1] && a->resources.pci.addr[1]) {
                diva_os_register_io_port(a, 0, a->resources.pci.bar[1],
                                         _4bri_is_rev_2_card(a->
@@ -526,7 +526,7 @@ static int diva_4bri_cleanup_adapter(diva_os_xdi_adapter_t * a)
        return (0);
 }
 
-static int _4bri_get_serial_number(diva_os_xdi_adapter_t * a)
+static int _4bri_get_serial_number(diva_os_xdi_adapter_t *a)
 {
        dword data[64];
        dword serNo;
@@ -551,13 +551,13 @@ static int _4bri_get_serial_number(diva_os_xdi_adapter_t * a)
                }
                if (j >= 5) {
                        DBG_ERR(("EEPROM[%d] read failed (0x%x)", i * 4, addr))
-                       return (0);
+                               return (0);
                }
                PCIread(Bus, Slot, 0x50, &data[i], sizeof(data[i]), hdev);
        }
        DBG_BLK(((char *) &data[0], sizeof(data)))
 
-       serNo = data[32];
+               serNo = data[32];
        if (serNo == 0 || serNo == 0xffffffff)
                serNo = data[63];
 
@@ -572,13 +572,13 @@ static int _4bri_get_serial_number(diva_os_xdi_adapter_t * a)
 
        DBG_REG(("Serial No.          : %ld", a->xdi_adapter.serialNo))
 
-       return (serNo);
+               return (serNo);
 }
 
 /*
 **  Release resources of slave adapters
 */
-static int diva_4bri_cleanup_slave_adapters(diva_os_xdi_adapter_t * a)
+static int diva_4bri_cleanup_slave_adapters(diva_os_xdi_adapter_t *a)
 {
        diva_os_xdi_adapter_t *adapter_list[4];
        diva_os_xdi_adapter_t *diva_current;
@@ -625,24 +625,24 @@ static int diva_4bri_cleanup_slave_adapters(diva_os_xdi_adapter_t * a)
 
 static int
 diva_4bri_cmd_card_proc(struct _diva_os_xdi_adapter *a,
-                       diva_xdi_um_cfg_cmd_t * cmd, int length)
+                       diva_xdi_um_cfg_cmd_t *cmd, int length)
 {
        int ret = -1;
 
        if (cmd->adapter != a->controller) {
                DBG_ERR(("A: 4bri_cmd, invalid controller=%d != %d",
                         cmd->adapter, a->controller))
-               return (-1);
+                       return (-1);
        }
 
        switch (cmd->command) {
        case DIVA_XDI_UM_CMD_GET_CARD_ORDINAL:
                a->xdi_mbox.data_length = sizeof(dword);
                a->xdi_mbox.data =
-                   diva_os_malloc(0, a->xdi_mbox.data_length);
+                       diva_os_malloc(0, a->xdi_mbox.data_length);
                if (a->xdi_mbox.data) {
                        *(dword *) a->xdi_mbox.data =
-                           (dword) a->CardOrdinal;
+                               (dword) a->CardOrdinal;
                        a->xdi_mbox.status = DIVA_XDI_MBOX_BUSY;
                        ret = 0;
                }
@@ -651,10 +651,10 @@ diva_4bri_cmd_card_proc(struct _diva_os_xdi_adapter *a,
        case DIVA_XDI_UM_CMD_GET_SERIAL_NR:
                a->xdi_mbox.data_length = sizeof(dword);
                a->xdi_mbox.data =
-                   diva_os_malloc(0, a->xdi_mbox.data_length);
+                       diva_os_malloc(0, a->xdi_mbox.data_length);
                if (a->xdi_mbox.data) {
                        *(dword *) a->xdi_mbox.data =
-                           (dword) a->xdi_adapter.serialNo;
+                               (dword) a->xdi_adapter.serialNo;
                        a->xdi_mbox.status = DIVA_XDI_MBOX_BUSY;
                        ret = 0;
                }
@@ -663,11 +663,11 @@ diva_4bri_cmd_card_proc(struct _diva_os_xdi_adapter *a,
        case DIVA_XDI_UM_CMD_GET_PCI_HW_CONFIG:
                if (!a->xdi_adapter.ControllerNumber) {
                        /*
-                          Only master adapter can access hardware config
-                        */
+                         Only master adapter can access hardware config
+                       */
                        a->xdi_mbox.data_length = sizeof(dword) * 9;
                        a->xdi_mbox.data =
-                           diva_os_malloc(0, a->xdi_mbox.data_length);
+                               diva_os_malloc(0, a->xdi_mbox.data_length);
                        if (a->xdi_mbox.data) {
                                int i;
                                dword *data = (dword *) a->xdi_mbox.data;
@@ -686,7 +686,7 @@ diva_4bri_cmd_card_proc(struct _diva_os_xdi_adapter *a,
                if (!a->xdi_adapter.ControllerNumber) {
                        a->xdi_mbox.data_length = sizeof(dword);
                        a->xdi_mbox.data =
-                           diva_os_malloc(0, a->xdi_mbox.data_length);
+                               diva_os_malloc(0, a->xdi_mbox.data_length);
                        if (a->xdi_mbox.data) {
                                dword *data = (dword *) a->xdi_mbox.data;
                                if (!a->xdi_adapter.ram
@@ -709,11 +709,11 @@ diva_4bri_cmd_card_proc(struct _diva_os_xdi_adapter *a,
        case DIVA_XDI_UM_CMD_WRITE_FPGA:
                if (!a->xdi_adapter.ControllerNumber) {
                        ret =
-                           diva_4bri_write_fpga_image(a,
-                                                      (byte *) & cmd[1],
-                                                      cmd->command_data.
-                                                      write_fpga.
-                                                      image_length);
+                               diva_4bri_write_fpga_image(a,
+                                                          (byte *)&cmd[1],
+                                                          cmd->command_data.
+                                                          write_fpga.
+                                                          image_length);
                }
                break;
 
@@ -754,12 +754,12 @@ diva_4bri_cmd_card_proc(struct _diva_os_xdi_adapter *a,
        case DIVA_XDI_UM_CMD_SET_PROTOCOL_FEATURES:
                if (!a->xdi_adapter.ControllerNumber) {
                        a->xdi_adapter.features =
-                           cmd->command_data.features.features;
+                               cmd->command_data.features.features;
                        a->xdi_adapter.a.protocol_capabilities =
-                           a->xdi_adapter.features;
+                               a->xdi_adapter.features;
                        DBG_TRC(("Set raw protocol features (%08x)",
                                 a->xdi_adapter.features))
-                       ret = 0;
+                               ret = 0;
                }
                break;
 
@@ -777,16 +777,16 @@ diva_4bri_cmd_card_proc(struct _diva_os_xdi_adapter *a,
                if (!a->xdi_adapter.ControllerNumber
                    && a->xdi_adapter.Address) {
                        if (
-                           (a->xdi_mbox.data_length =
-                            cmd->command_data.read_sdram.length)) {
+                               (a->xdi_mbox.data_length =
+                                cmd->command_data.read_sdram.length)) {
                                if (
-                                   (a->xdi_mbox.data_length +
-                                    cmd->command_data.read_sdram.offset) <
-                                   a->xdi_adapter.MemorySize) {
+                                       (a->xdi_mbox.data_length +
+                                        cmd->command_data.read_sdram.offset) <
+                                       a->xdi_adapter.MemorySize) {
                                        a->xdi_mbox.data =
-                                           diva_os_malloc(0,
-                                                          a->xdi_mbox.
-                                                          data_length);
+                                               diva_os_malloc(0,
+                                                              a->xdi_mbox.
+                                                              data_length);
                                        if (a->xdi_mbox.data) {
                                                byte __iomem *p = DIVA_OS_MEM_ATTACH_ADDRESS(&a->xdi_adapter);
                                                byte __iomem *src = p;
@@ -810,7 +810,7 @@ diva_4bri_cmd_card_proc(struct _diva_os_xdi_adapter *a,
        default:
                DBG_ERR(("A: A(%d) invalid cmd=%d", a->controller,
                         cmd->command))
-       }
+                       }
 
        return (ret);
 }
@@ -838,7 +838,7 @@ void diva_os_set_qBri2_functions(PISDN_ADAPTER IoAdapter)
 }
 
 static int
-diva_4bri_write_fpga_image(diva_os_xdi_adapter_t * a, byte * data,
+diva_4bri_write_fpga_image(diva_os_xdi_adapter_t *a, byte *data,
                           dword length)
 {
        int ret;
@@ -865,12 +865,12 @@ static int diva_4bri_reset_adapter(PISDN_ADAPTER IoAdapter)
        if (IoAdapter->Initialized) {
                DBG_ERR(("A: A(%d) can't reset 4BRI adapter - please stop first",
                         IoAdapter->ANum))
-               return (-1);
+                       return (-1);
        }
 
        /*
-          Forget all entities on all adapters
-        */
+         Forget all entities on all adapters
+       */
        for (i = 0; ((i < IoAdapter->tasks) && IoAdapter->QuadroList); i++) {
                Slave = IoAdapter->QuadroList->QuadroAdapter[i];
                Slave->e_count = 0;
@@ -908,7 +908,7 @@ static int diva_4bri_reset_adapter(PISDN_ADAPTER IoAdapter)
 static int
 diva_4bri_write_sdram_block(PISDN_ADAPTER IoAdapter,
                            dword address,
-                           const byte * data, dword length, dword limit)
+                           const byte *data, dword length, dword limit)
 {
        byte __iomem *p = DIVA_OS_MEM_ATTACH_ADDRESS(IoAdapter);
        byte __iomem *mem = p;
@@ -917,7 +917,7 @@ diva_4bri_write_sdram_block(PISDN_ADAPTER IoAdapter,
                DIVA_OS_MEM_DETACH_ADDRESS(IoAdapter, p);
                DBG_ERR(("A: A(%d) write 4BRI address=0x%08lx",
                         IoAdapter->ANum, address + length))
-               return (-1);
+                       return (-1);
        }
        mem += address;
 
@@ -939,14 +939,14 @@ diva_4bri_start_adapter(PISDN_ADAPTER IoAdapter,
        byte __iomem *p;
 
        /*
-          start adapter
-        */
+         start adapter
+       */
        start_qBri_hardware(IoAdapter);
 
        p = DIVA_OS_MEM_ATTACH_RAM(IoAdapter);
        /*
-          wait for signature in shared memory (max. 3 seconds)
-        */
+         wait for signature in shared memory (max. 3 seconds)
+       */
        signature = (volatile word __iomem *) (&p[0x1E]);
 
        for (i = 0; i < 300; ++i) {
@@ -954,23 +954,23 @@ diva_4bri_start_adapter(PISDN_ADAPTER IoAdapter,
                if (READ_WORD(&signature[0]) == 0x4447) {
                        DBG_TRC(("Protocol startup time %d.%02d seconds",
                                 (i / 100), (i % 100)))
-                       started = 1;
+                               started = 1;
                        break;
                }
        }
 
        for (i = 1; i < IoAdapter->tasks; i++) {
                IoAdapter->QuadroList->QuadroAdapter[i]->features =
-                   IoAdapter->features;
+                       IoAdapter->features;
                IoAdapter->QuadroList->QuadroAdapter[i]->a.
-                   protocol_capabilities = IoAdapter->features;
+                       protocol_capabilities = IoAdapter->features;
        }
 
        if (!started) {
                DBG_FTL(("%s: Adapter selftest failed, signature=%04x",
                         IoAdapter->Properties.Name,
                         READ_WORD(&signature[0])))
-               DIVA_OS_MEM_DETACH_RAM(IoAdapter, p);
+                       DIVA_OS_MEM_DETACH_RAM(IoAdapter, p);
                (*(IoAdapter->trapFnc)) (IoAdapter);
                IoAdapter->stop(IoAdapter);
                return (-1);
@@ -985,9 +985,9 @@ diva_4bri_start_adapter(PISDN_ADAPTER IoAdapter,
        if (check_qBri_interrupt(IoAdapter)) {
                DBG_ERR(("A: A(%d) interrupt test failed",
                         IoAdapter->ANum))
-               for (i = 0; i < IoAdapter->tasks; i++) {
-                       IoAdapter->QuadroList->QuadroAdapter[i]->Initialized = 0;
-               }
+                       for (i = 0; i < IoAdapter->tasks; i++) {
+                               IoAdapter->QuadroList->QuadroAdapter[i]->Initialized = 0;
+                       }
                IoAdapter->stop(IoAdapter);
                return (-1);
        }
@@ -999,7 +999,7 @@ diva_4bri_start_adapter(PISDN_ADAPTER IoAdapter,
                DBG_LOG(("A(%d) %s adapter successfully started",
                         IoAdapter->QuadroList->QuadroAdapter[i]->ANum,
                         (IoAdapter->tasks == 1) ? "BRI 2.0" : "4BRI"))
-               diva_xdi_didd_register_adapter(IoAdapter->QuadroList->QuadroAdapter[i]->ANum);
+                       diva_xdi_didd_register_adapter(IoAdapter->QuadroList->QuadroAdapter[i]->ANum);
                IoAdapter->QuadroList->QuadroAdapter[i]->Properties.Features = (word) features;
        }
 
@@ -1022,8 +1022,8 @@ static int check_qBri_interrupt(PISDN_ADAPTER IoAdapter)
        WRITE_BYTE(&p[PLX9054_INTCSR], PLX9054_INT_ENABLE);
        DIVA_OS_MEM_DETACH_RESET(IoAdapter, p);
        /*
-          interrupt test
-        */
+         interrupt test
+       */
        a->ReadyInt = 1;
        a->ram_out(a, &PR_RAM->ReadyInt, 1);
 
@@ -1034,14 +1034,14 @@ static int check_qBri_interrupt(PISDN_ADAPTER IoAdapter)
        dword volatile __iomem *qBriIrq;
        byte __iomem *p;
        /*
-          Reset on-board interrupt register
-        */
+         Reset on-board interrupt register
+       */
        IoAdapter->IrqCount = 0;
        p = DIVA_OS_MEM_ATTACH_CTLREG(IoAdapter);
        qBriIrq = (dword volatile __iomem *) (&p[_4bri_is_rev_2_card
-                                      (IoAdapter->
-                                       cardType) ? (MQ2_BREG_IRQ_TEST)
-                                      : (MQ_BREG_IRQ_TEST)]);
+                                                (IoAdapter->
+                                                 cardType) ? (MQ2_BREG_IRQ_TEST)
+                                                : (MQ_BREG_IRQ_TEST)]);
 
        WRITE_DWORD(qBriIrq, MQ_IRQ_REQ_OFF);
        DIVA_OS_MEM_DETACH_CTLREG(IoAdapter, p);
@@ -1056,13 +1056,13 @@ static int check_qBri_interrupt(PISDN_ADAPTER IoAdapter)
 #endif                         /* SUPPORT_INTERRUPT_TEST_ON_4BRI */
 }
 
-static void diva_4bri_clear_interrupts(diva_os_xdi_adapter_t * a)
+static void diva_4bri_clear_interrupts(diva_os_xdi_adapter_t *a)
 {
        PISDN_ADAPTER IoAdapter = &a->xdi_adapter;
 
        /*
-          clear any pending interrupt
-        */
+         clear any pending interrupt
+       */
        IoAdapter->disIrq(IoAdapter);
 
        IoAdapter->tst_irq(&IoAdapter->a);
@@ -1070,13 +1070,13 @@ static void diva_4bri_clear_interrupts(diva_os_xdi_adapter_t * a)
        IoAdapter->tst_irq(&IoAdapter->a);
 
        /*
-          kill pending dpcs
-        */
+         kill pending dpcs
+       */
        diva_os_cancel_soft_isr(&IoAdapter->req_soft_isr);
        diva_os_cancel_soft_isr(&IoAdapter->isr_soft_isr);
 }
 
-static int diva_4bri_stop_adapter(diva_os_xdi_adapter_t * a)
+static int diva_4bri_stop_adapter(diva_os_xdi_adapter_t *a)
 {
        PISDN_ADAPTER IoAdapter = &a->xdi_adapter;
        int i;
@@ -1088,7 +1088,7 @@ static int diva_4bri_stop_adapter(diva_os_xdi_adapter_t * a)
        if (!IoAdapter->Initialized) {
                DBG_ERR(("A: A(%d) can't stop PRI adapter - not running",
                         IoAdapter->ANum))
-               return (-1);    /* nothing to stop */
+                       return (-1);    /* nothing to stop */
        }
 
        for (i = 0; i < IoAdapter->tasks; i++) {
@@ -1096,8 +1096,8 @@ static int diva_4bri_stop_adapter(diva_os_xdi_adapter_t * a)
        }
 
        /*
-          Disconnect Adapters from DIDD
-        */
+         Disconnect Adapters from DIDD
+       */
        for (i = 0; i < IoAdapter->tasks; i++) {
                diva_xdi_didd_remove_adapter(IoAdapter->QuadroList->QuadroAdapter[i]->ANum);
        }
@@ -1105,8 +1105,8 @@ static int diva_4bri_stop_adapter(diva_os_xdi_adapter_t * a)
        i = 100;
 
        /*
-          Stop interrupts
-        */
+         Stop interrupts
+       */
        a->clear_interrupts_proc = diva_4bri_clear_interrupts;
        IoAdapter->a.ReadyInt = 1;
        IoAdapter->a.ram_inc(&IoAdapter->a, &PR_RAM->ReadyInt);
@@ -1119,12 +1119,12 @@ static int diva_4bri_stop_adapter(diva_os_xdi_adapter_t * a)
                a->clear_interrupts_proc = NULL;
                DBG_ERR(("A: A(%d) no final interrupt from 4BRI adapter",
                         IoAdapter->ANum))
-       }
+                       }
        IoAdapter->a.ReadyInt = 0;
 
        /*
-          Stop and reset adapter
-        */
+         Stop and reset adapter
+       */
        IoAdapter->stop(IoAdapter);
 
        return (0);
index 665f0af..7225327 100644 (file)
@@ -3,6 +3,6 @@
 #ifndef __DIVA_OS_4_BRI_H__
 #define __DIVA_OS_4_BRI_H__
 
-int diva_4bri_init_card(diva_os_xdi_adapter_t * a);
+int diva_4bri_init_card(diva_os_xdi_adapter_t *a);
 
 #endif
index 08f0199..20f2653 100644 (file)
@@ -23,7 +23,7 @@
 */
 extern void prepare_maestra_functions(PISDN_ADAPTER IoAdapter);
 extern void diva_xdi_display_adapter_features(int card);
-extern int diva_card_read_xlog(diva_os_xdi_adapter_t * a);
+extern int diva_card_read_xlog(diva_os_xdi_adapter_t *a);
 
 /*
 **  LOCALS
@@ -33,20 +33,20 @@ static int bri_bar_length[3] = {
        0x80,
        0x20
 };
-static int diva_bri_cleanup_adapter(diva_os_xdi_adapter_t * a);
-static dword diva_bri_get_serial_number(diva_os_xdi_adapter_t * a);
+static int diva_bri_cleanup_adapter(diva_os_xdi_adapter_t *a);
+static dword diva_bri_get_serial_number(diva_os_xdi_adapter_t *a);
 static int diva_bri_cmd_card_proc(struct _diva_os_xdi_adapter *a,
-                                 diva_xdi_um_cfg_cmd_t * cmd, int length);
-static int diva_bri_reregister_io(diva_os_xdi_adapter_t * a);
+                                 diva_xdi_um_cfg_cmd_t *cmd, int length);
+static int diva_bri_reregister_io(diva_os_xdi_adapter_t *a);
 static int diva_bri_reset_adapter(PISDN_ADAPTER IoAdapter);
 static int diva_bri_write_sdram_block(PISDN_ADAPTER IoAdapter,
                                      dword address,
-                                     const byte * data, dword length);
+                                     const byte *data, dword length);
 static int diva_bri_start_adapter(PISDN_ADAPTER IoAdapter,
                                  dword start_address, dword features);
-static int diva_bri_stop_adapter(diva_os_xdi_adapter_t * a);
+static int diva_bri_stop_adapter(diva_os_xdi_adapter_t *a);
 
-static void diva_bri_set_addresses(diva_os_xdi_adapter_t * a)
+static void diva_bri_set_addresses(diva_os_xdi_adapter_t *a)
 {
        a->resources.pci.mem_type_id[MEM_TYPE_RAM] = 0;
        a->resources.pci.mem_type_id[MEM_TYPE_CFG] = 1;
@@ -54,7 +54,7 @@ static void diva_bri_set_addresses(diva_os_xdi_adapter_t * a)
        a->resources.pci.mem_type_id[MEM_TYPE_RESET] = 1;
        a->resources.pci.mem_type_id[MEM_TYPE_PORT] = 2;
        a->resources.pci.mem_type_id[MEM_TYPE_CTLREG] = 2;
-       
+
        a->xdi_adapter.ram = a->resources.pci.addr[0];
        a->xdi_adapter.cfg = a->resources.pci.addr[1];
        a->xdi_adapter.Address = a->resources.pci.addr[2];
@@ -72,7 +72,7 @@ static void diva_bri_set_addresses(diva_os_xdi_adapter_t * a)
 **  BAR1 - I/O Addr  - 0x80
 **  BAR2 - I/O Addr  - 0x20
 */
-int diva_bri_init_card(diva_os_xdi_adapter_t * a)
+int diva_bri_init_card(diva_os_xdi_adapter_t *a)
 {
        int bar;
        dword bar2 = 0, bar2_length = 0xffffffff;
@@ -82,75 +82,75 @@ int diva_bri_init_card(diva_os_xdi_adapter_t * a)
        byte __iomem *p;
 
        /*
-          Set properties
-        */
+         Set properties
+       */
        a->xdi_adapter.Properties = CardProperties[a->CardOrdinal];
        DBG_LOG(("Load %s", a->xdi_adapter.Properties.Name))
 
-           /*
-              Get resources
-            */
-           for (bar = 0; bar < 3; bar++) {
-               a->resources.pci.bar[bar] =
-                   divasa_get_pci_bar(a->resources.pci.bus,
-                                      a->resources.pci.func, bar,
-                                      a->resources.pci.hdev);
-               if (!a->resources.pci.bar[bar]) {
-                       DBG_ERR(("A: can't get BAR[%d]", bar))
-                       return (-1);
+               /*
+                 Get resources
+               */
+               for (bar = 0; bar < 3; bar++) {
+                       a->resources.pci.bar[bar] =
+                               divasa_get_pci_bar(a->resources.pci.bus,
+                                                  a->resources.pci.func, bar,
+                                                  a->resources.pci.hdev);
+                       if (!a->resources.pci.bar[bar]) {
+                               DBG_ERR(("A: can't get BAR[%d]", bar))
+                                       return (-1);
+                       }
                }
-       }
 
        a->resources.pci.irq =
-           (byte) divasa_get_pci_irq(a->resources.pci.bus,
-                                     a->resources.pci.func,
-                                     a->resources.pci.hdev);
+               (byte) divasa_get_pci_irq(a->resources.pci.bus,
+                                         a->resources.pci.func,
+                                         a->resources.pci.hdev);
        if (!a->resources.pci.irq) {
                DBG_ERR(("A: invalid irq"));
                return (-1);
        }
 
        /*
-          Get length of I/O bar 2 - it is different by older
-          EEPROM version
-        */
+         Get length of I/O bar 2 - it is different by older
+         EEPROM version
+       */
        Bus = a->resources.pci.bus;
        Slot = a->resources.pci.func;
        hdev = a->resources.pci.hdev;
 
        /*
-          Get plain original values of the BAR2 CDM registers
-        */
+         Get plain original values of the BAR2 CDM registers
+       */
        PCIread(Bus, Slot, 0x18, &bar2, sizeof(bar2), hdev);
        PCIread(Bus, Slot, 0x04, &cmd_org, sizeof(cmd_org), hdev);
        /*
-          Disable device and get BAR2 length
-        */
+         Disable device and get BAR2 length
+       */
        PCIwrite(Bus, Slot, 0x04, &cmd, sizeof(cmd), hdev);
        PCIwrite(Bus, Slot, 0x18, &bar2_length, sizeof(bar2_length), hdev);
        PCIread(Bus, Slot, 0x18, &bar2_length, sizeof(bar2_length), hdev);
        /*
-          Restore BAR2 and CMD registers
-        */
+         Restore BAR2 and CMD registers
+       */
        PCIwrite(Bus, Slot, 0x18, &bar2, sizeof(bar2), hdev);
        PCIwrite(Bus, Slot, 0x04, &cmd_org, sizeof(cmd_org), hdev);
 
        /*
-          Calculate BAR2 length
-        */
+         Calculate BAR2 length
+       */
        bar2_length = (~(bar2_length & ~7)) + 1;
        DBG_LOG(("BAR[2] length=%lx", bar2_length))
 
-           /*
-              Map and register resources
-            */
-           if (!(a->resources.pci.addr[0] =
-                divasa_remap_pci_bar(a, 0, a->resources.pci.bar[0],
-                                     bri_bar_length[0]))) {
-               DBG_ERR(("A: BRI, can't map BAR[0]"))
-               diva_bri_cleanup_adapter(a);
-               return (-1);
-       }
+               /*
+                 Map and register resources
+               */
+               if (!(a->resources.pci.addr[0] =
+                     divasa_remap_pci_bar(a, 0, a->resources.pci.bar[0],
+                                          bri_bar_length[0]))) {
+                       DBG_ERR(("A: BRI, can't map BAR[0]"))
+                               diva_bri_cleanup_adapter(a);
+                       return (-1);
+               }
 
        sprintf(&a->port_name[0], "BRI %02x:%02x",
                a->resources.pci.bus, a->resources.pci.func);
@@ -158,7 +158,7 @@ int diva_bri_init_card(diva_os_xdi_adapter_t * a)
        if (diva_os_register_io_port(a, 1, a->resources.pci.bar[1],
                                     bri_bar_length[1], &a->port_name[0], 1)) {
                DBG_ERR(("A: BRI, can't register BAR[1]"))
-               diva_bri_cleanup_adapter(a);
+                       diva_bri_cleanup_adapter(a);
                return (-1);
        }
        a->resources.pci.addr[1] = (void *) (unsigned long) a->resources.pci.bar[1];
@@ -167,33 +167,33 @@ int diva_bri_init_card(diva_os_xdi_adapter_t * a)
        if (diva_os_register_io_port(a, 1, a->resources.pci.bar[2],
                                     bar2_length, &a->port_name[0], 2)) {
                DBG_ERR(("A: BRI, can't register BAR[2]"))
-               diva_bri_cleanup_adapter(a);
+                       diva_bri_cleanup_adapter(a);
                return (-1);
        }
        a->resources.pci.addr[2] = (void *) (unsigned long) a->resources.pci.bar[2];
        a->resources.pci.length[2] = bar2_length;
 
        /*
-          Set all memory areas
-        */
+         Set all memory areas
+       */
        diva_bri_set_addresses(a);
 
        /*
-          Get Serial Number
-        */
+         Get Serial Number
+       */
        a->xdi_adapter.serialNo = diva_bri_get_serial_number(a);
 
        /*
-          Register I/O ports with correct name now
-        */
+         Register I/O ports with correct name now
+       */
        if (diva_bri_reregister_io(a)) {
                diva_bri_cleanup_adapter(a);
                return (-1);
        }
 
        /*
-          Initialize OS dependent objects
-        */
+         Initialize OS dependent objects
+       */
        if (diva_os_initialize_spin_lock
            (&a->xdi_adapter.isr_spin_lock, "isr")) {
                diva_bri_cleanup_adapter(a);
@@ -213,13 +213,13 @@ int diva_bri_init_card(diva_os_xdi_adapter_t * a)
                return (-1);
        }
        /*
-          Do not initialize second DPC - only one thread will be created
-        */
+         Do not initialize second DPC - only one thread will be created
+       */
        a->xdi_adapter.isr_soft_isr.object = a->xdi_adapter.req_soft_isr.object;
 
        /*
-          Create entity table
-        */
+         Create entity table
+       */
        a->xdi_adapter.Channels = CardProperties[a->CardOrdinal].Channels;
        a->xdi_adapter.e_max = CardProperties[a->CardOrdinal].E_info;
        a->xdi_adapter.e_tbl = diva_os_malloc(0, a->xdi_adapter.e_max * sizeof(E_INFO));
@@ -230,8 +230,8 @@ int diva_bri_init_card(diva_os_xdi_adapter_t * a)
        memset(a->xdi_adapter.e_tbl, 0x00, a->xdi_adapter.e_max * sizeof(E_INFO));
 
        /*
-          Set up interface
-        */
+         Set up interface
+       */
        a->xdi_adapter.a.io = &a->xdi_adapter;
        a->xdi_adapter.DIRequest = request;
        a->interface.cleanup_adapter_proc = diva_bri_cleanup_adapter;
@@ -246,8 +246,8 @@ int diva_bri_init_card(diva_os_xdi_adapter_t * a)
        a->dsp_mask = 0x00000003;
 
        /*
-          Set IRQ handler
-        */
+         Set IRQ handler
+       */
        a->xdi_adapter.irq_info.irq_nr = a->resources.pci.irq;
        sprintf(a->xdi_adapter.irq_info.irq_name, "DIVA BRI %ld",
                (long) a->xdi_adapter.serialNo);
@@ -265,7 +265,7 @@ int diva_bri_init_card(diva_os_xdi_adapter_t * a)
 }
 
 
-static int diva_bri_cleanup_adapter(diva_os_xdi_adapter_t * a)
+static int diva_bri_cleanup_adapter(diva_os_xdi_adapter_t *a)
 {
        int i;
 
@@ -274,8 +274,8 @@ static int diva_bri_cleanup_adapter(diva_os_xdi_adapter_t * a)
        }
 
        /*
-          Remove ISR Handler
-        */
+         Remove ISR Handler
+       */
        if (a->xdi_adapter.irq_info.registered) {
                diva_os_remove_irq(a, a->xdi_adapter.irq_info.irq_nr);
        }
@@ -300,8 +300,8 @@ static int diva_bri_cleanup_adapter(diva_os_xdi_adapter_t * a)
        }
 
        /*
-          Free OS objects
-        */
+         Free OS objects
+       */
        diva_os_cancel_soft_isr(&a->xdi_adapter.req_soft_isr);
        diva_os_cancel_soft_isr(&a->xdi_adapter.isr_soft_isr);
 
@@ -312,8 +312,8 @@ static int diva_bri_cleanup_adapter(diva_os_xdi_adapter_t * a)
        diva_os_destroy_spin_lock(&a->xdi_adapter.data_spin_lock, "rm");
 
        /*
-          Free memory
-        */
+         Free memory
+       */
        if (a->xdi_adapter.e_tbl) {
                diva_os_free(0, a->xdi_adapter.e_tbl);
                a->xdi_adapter.e_tbl = NULL;
@@ -329,7 +329,7 @@ void diva_os_prepare_maestra_functions(PISDN_ADAPTER IoAdapter)
 /*
 **  Get serial number
 */
-static dword diva_bri_get_serial_number(diva_os_xdi_adapter_t * a)
+static dword diva_bri_get_serial_number(diva_os_xdi_adapter_t *a)
 {
        dword serNo = 0;
        byte __iomem *confIO;
@@ -345,7 +345,7 @@ static dword diva_bri_get_serial_number(diva_os_xdi_adapter_t * a)
        if ((serNo == 0) || (serNo == 0xFFFFFFFF)) {
                DBG_FTL(("W: BRI use BAR[0] to get card serial number"))
 
-               confMem = (word __iomem *)DIVA_OS_MEM_ATTACH_RAM(&a->xdi_adapter);
+                       confMem = (word __iomem *)DIVA_OS_MEM_ATTACH_RAM(&a->xdi_adapter);
                serHi = (word) (READ_WORD(&confMem[0x11]) & 0x0FFF);
                serLo = (word) (READ_WORD(&confMem[0x13]) & 0x0FFF);
                serNo = (((dword) serHi) << 16) | ((dword) serLo);
@@ -354,14 +354,14 @@ static dword diva_bri_get_serial_number(diva_os_xdi_adapter_t * a)
 
        DBG_LOG(("Serial Number=%ld", serNo))
 
-       return (serNo);
+               return (serNo);
 }
 
 /*
 **  Unregister I/O and register it with new name,
 **  based on Serial Number
 */
-static int diva_bri_reregister_io(diva_os_xdi_adapter_t * a)
+static int diva_bri_reregister_io(diva_os_xdi_adapter_t *a)
 {
        int i;
 
@@ -380,10 +380,10 @@ static int diva_bri_reregister_io(diva_os_xdi_adapter_t * a)
                                             a->resources.pci.length[i],
                                             &a->port_name[0], i)) {
                        DBG_ERR(("A: failed to reregister BAR[%d]", i))
-                       return (-1);
+                               return (-1);
                }
                a->resources.pci.addr[i] =
-                   (void *) (unsigned long) a->resources.pci.bar[i];
+                       (void *) (unsigned long) a->resources.pci.bar[i];
        }
 
        return (0);
@@ -394,24 +394,24 @@ static int diva_bri_reregister_io(diva_os_xdi_adapter_t * a)
 */
 static int
 diva_bri_cmd_card_proc(struct _diva_os_xdi_adapter *a,
-                      diva_xdi_um_cfg_cmd_t * cmd, int length)
+                      diva_xdi_um_cfg_cmd_t *cmd, int length)
 {
        int ret = -1;
 
        if (cmd->adapter != a->controller) {
                DBG_ERR(("A: pri_cmd, invalid controller=%d != %d",
                         cmd->adapter, a->controller))
-               return (-1);
+                       return (-1);
        }
 
        switch (cmd->command) {
        case DIVA_XDI_UM_CMD_GET_CARD_ORDINAL:
                a->xdi_mbox.data_length = sizeof(dword);
                a->xdi_mbox.data =
-                   diva_os_malloc(0, a->xdi_mbox.data_length);
+                       diva_os_malloc(0, a->xdi_mbox.data_length);
                if (a->xdi_mbox.data) {
                        *(dword *) a->xdi_mbox.data =
-                           (dword) a->CardOrdinal;
+                               (dword) a->CardOrdinal;
                        a->xdi_mbox.status = DIVA_XDI_MBOX_BUSY;
                        ret = 0;
                }
@@ -420,10 +420,10 @@ diva_bri_cmd_card_proc(struct _diva_os_xdi_adapter *a,
        case DIVA_XDI_UM_CMD_GET_SERIAL_NR:
                a->xdi_mbox.data_length = sizeof(dword);
                a->xdi_mbox.data =
-                   diva_os_malloc(0, a->xdi_mbox.data_length);
+                       diva_os_malloc(0, a->xdi_mbox.data_length);
                if (a->xdi_mbox.data) {
                        *(dword *) a->xdi_mbox.data =
-                           (dword) a->xdi_adapter.serialNo;
+                               (dword) a->xdi_adapter.serialNo;
                        a->xdi_mbox.status = DIVA_XDI_MBOX_BUSY;
                        ret = 0;
                }
@@ -432,7 +432,7 @@ diva_bri_cmd_card_proc(struct _diva_os_xdi_adapter *a,
        case DIVA_XDI_UM_CMD_GET_PCI_HW_CONFIG:
                a->xdi_mbox.data_length = sizeof(dword) * 9;
                a->xdi_mbox.data =
-                   diva_os_malloc(0, a->xdi_mbox.data_length);
+                       diva_os_malloc(0, a->xdi_mbox.data_length);
                if (a->xdi_mbox.data) {
                        int i;
                        dword *data = (dword *) a->xdi_mbox.data;
@@ -449,7 +449,7 @@ diva_bri_cmd_card_proc(struct _diva_os_xdi_adapter *a,
        case DIVA_XDI_UM_CMD_GET_CARD_STATE:
                a->xdi_mbox.data_length = sizeof(dword);
                a->xdi_mbox.data =
-                   diva_os_malloc(0, a->xdi_mbox.data_length);
+                       diva_os_malloc(0, a->xdi_mbox.data_length);
                if (a->xdi_mbox.data) {
                        dword *data = (dword *) a->xdi_mbox.data;
                        if (!a->xdi_adapter.port) {
@@ -474,7 +474,7 @@ diva_bri_cmd_card_proc(struct _diva_os_xdi_adapter *a,
                ret = diva_bri_write_sdram_block(&a->xdi_adapter,
                                                 cmd->command_data.
                                                 write_sdram.offset,
-                                                (byte *) & cmd[1],
+                                                (byte *)&cmd[1],
                                                 cmd->command_data.
                                                 write_sdram.length);
                break;
@@ -489,9 +489,9 @@ diva_bri_cmd_card_proc(struct _diva_os_xdi_adapter *a,
 
        case DIVA_XDI_UM_CMD_SET_PROTOCOL_FEATURES:
                a->xdi_adapter.features =
-                   cmd->command_data.features.features;
+                       cmd->command_data.features.features;
                a->xdi_adapter.a.protocol_capabilities =
-                   a->xdi_adapter.features;
+                       a->xdi_adapter.features;
                DBG_TRC(
                        ("Set raw protocol features (%08x)",
                         a->xdi_adapter.features)) ret = 0;
@@ -530,18 +530,18 @@ static int diva_bri_reset_adapter(PISDN_ADAPTER IoAdapter)
        diva_os_wait(100);
        Port = DIVA_OS_MEM_ATTACH_PORT(IoAdapter);
        addrHi = Port +
-           ((IoAdapter->Properties.Bus == BUS_PCI) ? M_PCI_ADDRH : ADDRH);
+               ((IoAdapter->Properties.Bus == BUS_PCI) ? M_PCI_ADDRH : ADDRH);
        addrLo = Port + ADDR;
        ioaddr = Port + DATA;
        /*
-          recover
-        */
+         recover
+       */
        outpp(addrHi, (byte) 0);
        outppw(addrLo, (word) 0);
        outppw(ioaddr, (word) 0);
        /*
-          clear shared memory
-        */
+         clear shared memory
+       */
        outpp(addrHi,
              (byte) (
                      (IoAdapter->MemoryBase + IoAdapter->MemorySize -
@@ -551,8 +551,8 @@ static int diva_bri_reset_adapter(PISDN_ADAPTER IoAdapter)
        diva_os_wait(100);
 
        /*
-          clear signature
-        */
+         clear signature
+       */
        outpp(addrHi,
              (byte) (
                      (IoAdapter->MemoryBase + IoAdapter->MemorySize -
@@ -568,8 +568,8 @@ static int diva_bri_reset_adapter(PISDN_ADAPTER IoAdapter)
        DIVA_OS_MEM_DETACH_PORT(IoAdapter, Port);
 
        /*
-          Forget all outstanding entities
-        */
+         Forget all outstanding entities
+       */
        IoAdapter->e_count = 0;
        if (IoAdapter->e_tbl) {
                memset(IoAdapter->e_tbl, 0x00,
@@ -602,7 +602,7 @@ static int diva_bri_reset_adapter(PISDN_ADAPTER IoAdapter)
 
 static int
 diva_bri_write_sdram_block(PISDN_ADAPTER IoAdapter,
-                          dword address, const byte * data, dword length)
+                          dword address, const byte *data, dword length)
 {
        byte __iomem *addrHi, *addrLo, *ioaddr;
        byte __iomem *Port;
@@ -613,7 +613,7 @@ diva_bri_write_sdram_block(PISDN_ADAPTER IoAdapter,
 
        Port = DIVA_OS_MEM_ATTACH_PORT(IoAdapter);
        addrHi = Port +
-           ((IoAdapter->Properties.Bus == BUS_PCI) ? M_PCI_ADDRH : ADDRH);
+               ((IoAdapter->Properties.Bus == BUS_PCI) ? M_PCI_ADDRH : ADDRH);
        addrLo = Port + ADDR;
        ioaddr = Port + DATA;
 
@@ -651,9 +651,9 @@ diva_bri_start_adapter(PISDN_ADAPTER IoAdapter,
        sprintf(IoAdapter->Name, "A(%d)", (int) IoAdapter->ANum);
        DBG_LOG(("A(%d) start BRI", IoAdapter->ANum))
 
-       Port = DIVA_OS_MEM_ATTACH_PORT(IoAdapter);
+               Port = DIVA_OS_MEM_ATTACH_PORT(IoAdapter);
        addrHi = Port +
-           ((IoAdapter->Properties.Bus == BUS_PCI) ? M_PCI_ADDRH : ADDRH);
+               ((IoAdapter->Properties.Bus == BUS_PCI) ? M_PCI_ADDRH : ADDRH);
        addrLo = Port + ADDR;
        ioaddr = Port + DATA;
 
@@ -666,20 +666,20 @@ diva_bri_start_adapter(PISDN_ADAPTER IoAdapter,
        DIVA_OS_MEM_DETACH_PORT(IoAdapter, Port);
 
        /*
-          start the protocol code
-        */
+         start the protocol code
+       */
        Port = DIVA_OS_MEM_ATTACH_CTLREG(IoAdapter);
        outpp(Port, 0x08);
        DIVA_OS_MEM_DETACH_CTLREG(IoAdapter, Port);
 
        Port = DIVA_OS_MEM_ATTACH_PORT(IoAdapter);
        addrHi = Port +
-           ((IoAdapter->Properties.Bus == BUS_PCI) ? M_PCI_ADDRH : ADDRH);
+               ((IoAdapter->Properties.Bus == BUS_PCI) ? M_PCI_ADDRH : ADDRH);
        addrLo = Port + ADDR;
        ioaddr = Port + DATA;
        /*
-          wait for signature (max. 3 seconds)
-        */
+         wait for signature (max. 3 seconds)
+       */
        for (i = 0; i < 300; ++i) {
                diva_os_wait(10);
                outpp(addrHi,
@@ -693,7 +693,7 @@ diva_bri_start_adapter(PISDN_ADAPTER IoAdapter,
                        DBG_LOG(
                                ("Protocol startup time %d.%02d seconds",
                                 (i / 100), (i % 100)))
-                       started = 1;
+                               started = 1;
                        break;
                }
        }
@@ -703,15 +703,15 @@ diva_bri_start_adapter(PISDN_ADAPTER IoAdapter,
                DBG_FTL(("A: A(%d) %s: Adapter selftest failed 0x%04X",
                         IoAdapter->ANum, IoAdapter->Properties.Name,
                         test))
-               (*(IoAdapter->trapFnc)) (IoAdapter);
+                       (*(IoAdapter->trapFnc)) (IoAdapter);
                return (-1);
        }
 
        IoAdapter->Initialized = 1;
 
        /*
-          Check Interrupt
-        */
+         Check Interrupt
+       */
        IoAdapter->IrqCount = 0;
        a->ReadyInt = 1;
 
@@ -729,7 +729,7 @@ diva_bri_start_adapter(PISDN_ADAPTER IoAdapter,
                DBG_ERR(
                        ("A: A(%d) interrupt test failed",
                         IoAdapter->ANum))
-               IoAdapter->Initialized = 0;
+                       IoAdapter->Initialized = 0;
                IoAdapter->stop(IoAdapter);
                return (-1);
        }
@@ -737,21 +737,21 @@ diva_bri_start_adapter(PISDN_ADAPTER IoAdapter,
        IoAdapter->Properties.Features = (word) features;
        diva_xdi_display_adapter_features(IoAdapter->ANum);
        DBG_LOG(("A(%d) BRI adapter successfully started", IoAdapter->ANum))
-           /*
-              Register with DIDD
-            */
-       diva_xdi_didd_register_adapter(IoAdapter->ANum);
+               /*
+                 Register with DIDD
+               */
+               diva_xdi_didd_register_adapter(IoAdapter->ANum);
 
        return (0);
 }
 
-static void diva_bri_clear_interrupts(diva_os_xdi_adapter_t * a)
+static void diva_bri_clear_interrupts(diva_os_xdi_adapter_t *a)
 {
        PISDN_ADAPTER IoAdapter = &a->xdi_adapter;
 
        /*
-          clear any pending interrupt
-        */
+         clear any pending interrupt
+       */
        IoAdapter->disIrq(IoAdapter);
 
        IoAdapter->tst_irq(&IoAdapter->a);
@@ -759,8 +759,8 @@ static void diva_bri_clear_interrupts(diva_os_xdi_adapter_t * a)
        IoAdapter->tst_irq(&IoAdapter->a);
 
        /*
-          kill pending dpcs
-        */
+         kill pending dpcs
+       */
        diva_os_cancel_soft_isr(&IoAdapter->req_soft_isr);
        diva_os_cancel_soft_isr(&IoAdapter->isr_soft_isr);
 }
@@ -768,7 +768,7 @@ static void diva_bri_clear_interrupts(diva_os_xdi_adapter_t * a)
 /*
 **  Stop card
 */
-static int diva_bri_stop_adapter(diva_os_xdi_adapter_t * a)
+static int diva_bri_stop_adapter(diva_os_xdi_adapter_t *a)
 {
        PISDN_ADAPTER IoAdapter = &a->xdi_adapter;
        int i = 100;
@@ -779,18 +779,18 @@ static int diva_bri_stop_adapter(diva_os_xdi_adapter_t * a)
        if (!IoAdapter->Initialized) {
                DBG_ERR(("A: A(%d) can't stop BRI adapter - not running",
                         IoAdapter->ANum))
-               return (-1);    /* nothing to stop */
+                       return (-1);    /* nothing to stop */
        }
        IoAdapter->Initialized = 0;
 
        /*
-          Disconnect Adapter from DIDD
-        */
+         Disconnect Adapter from DIDD
+       */
        diva_xdi_didd_remove_adapter(IoAdapter->ANum);
 
        /*
-          Stop interrupts
-        */
+         Stop interrupts
+       */
        a->clear_interrupts_proc = diva_bri_clear_interrupts;
        IoAdapter->a.ReadyInt = 1;
        IoAdapter->a.ram_inc(&IoAdapter->a, &PR_RAM->ReadyInt);
@@ -802,12 +802,12 @@ static int diva_bri_stop_adapter(diva_os_xdi_adapter_t * a)
                a->clear_interrupts_proc = NULL;
                DBG_ERR(("A: A(%d) no final interrupt from BRI adapter",
                         IoAdapter->ANum))
-       }
+                       }
        IoAdapter->a.ReadyInt = 0;
 
        /*
-          Stop and reset adapter
-        */
+         Stop and reset adapter
+       */
        IoAdapter->stop(IoAdapter);
 
        return (0);
index a54f0ce..02e7456 100644 (file)
@@ -3,6 +3,6 @@
 #ifndef __DIVA_OS_BRI_REV_1_H__
 #define __DIVA_OS_BRI_REV_1_H__
 
-int diva_bri_init_card(diva_os_xdi_adapter_t * a);
+int diva_bri_init_card(diva_os_xdi_adapter_t *a);
 
 #endif
index 726f915..e72394b 100644 (file)
@@ -1,16 +1,16 @@
 /* $Id: os_capi.h,v 1.7 2003/04/12 21:40:49 schindler Exp $
  *
  * ISDN interface module for Eicon active cards DIVA.
- * CAPI Interface OS include files 
- * 
- * Copyright 2000-2003 by Armin Schindler (mac@melware.de) 
+ * CAPI Interface OS include files
+ *
+ * Copyright 2000-2003 by Armin Schindler (mac@melware.de)
  * Copyright 2000-2003 Cytronics & Melware (info@melware.de)
- * 
+ *
  * This software may be used and distributed according to the terms
  * of the GNU General Public License, incorporated herein by reference.
  */
 
-#ifndef __OS_CAPI_H__ 
+#ifndef __OS_CAPI_H__
 #define __OS_CAPI_H__
 
 #include <linux/capi.h>
index 5d65405..da4957a 100644 (file)
    OS Dependent part of XDI driver for DIVA PRI Adapter
 
    DSP detection/validation by Anthony Booth (Eicon Networks, www.eicon.com)
--------------------------------------------------------------------------- */
+   -------------------------------------------------------------------------- */
 
 #define DIVA_PRI_NO_PCI_BIOS_WORKAROUND 1
 
-extern int diva_card_read_xlog(diva_os_xdi_adapter_t * a);
+extern int diva_card_read_xlog(diva_os_xdi_adapter_t *a);
 
 /*
 **  IMPORTS
@@ -37,12 +37,12 @@ extern void prepare_pri_functions(PISDN_ADAPTER IoAdapter);
 extern void prepare_pri2_functions(PISDN_ADAPTER IoAdapter);
 extern void diva_xdi_display_adapter_features(int card);
 
-static int diva_pri_cleanup_adapter(diva_os_xdi_adapter_t * a);
+static int diva_pri_cleanup_adapter(diva_os_xdi_adapter_t *a);
 static int diva_pri_cmd_card_proc(struct _diva_os_xdi_adapter *a,
-                                 diva_xdi_um_cfg_cmd_t * cmd, int length);
-static int pri_get_serial_number(diva_os_xdi_adapter_t * a);
-static int diva_pri_stop_adapter(diva_os_xdi_adapter_t * a);
-static dword diva_pri_detect_dsps(diva_os_xdi_adapter_t * a);
+                                 diva_xdi_um_cfg_cmd_t *cmd, int length);
+static int pri_get_serial_number(diva_os_xdi_adapter_t *a);
+static int diva_pri_stop_adapter(diva_os_xdi_adapter_t *a);
+static dword diva_pri_detect_dsps(diva_os_xdi_adapter_t *a);
 
 /*
 **  Check card revision
@@ -57,7 +57,7 @@ static int pri_is_rev_2_card(int card_ordinal)
        return (0);
 }
 
-static void diva_pri_set_addresses(diva_os_xdi_adapter_t * a)
+static void diva_pri_set_addresses(diva_os_xdi_adapter_t *a)
 {
        a->resources.pci.mem_type_id[MEM_TYPE_ADDRESS] = 0;
        a->resources.pci.mem_type_id[MEM_TYPE_CONTROL] = 2;
@@ -66,7 +66,7 @@ static void diva_pri_set_addresses(diva_os_xdi_adapter_t * a)
        a->resources.pci.mem_type_id[MEM_TYPE_RESET] = 2;
        a->resources.pci.mem_type_id[MEM_TYPE_CFG] = 4;
        a->resources.pci.mem_type_id[MEM_TYPE_PROM] = 3;
-       
+
        a->xdi_adapter.Address = a->resources.pci.addr[0];
        a->xdi_adapter.Control = a->resources.pci.addr[2];
        a->xdi_adapter.Config = a->resources.pci.addr[4];
@@ -92,7 +92,7 @@ static void diva_pri_set_addresses(diva_os_xdi_adapter_t * a)
 **  BAR3 - FLASH (REG),                0x8000
 **  BAR4 - CONFIG (CFG),       0x1000
 */
-int diva_pri_init_card(diva_os_xdi_adapter_t * a)
+int diva_pri_init_card(diva_os_xdi_adapter_t *a)
 {
        int bar = 0;
        int pri_rev_2;
@@ -110,59 +110,59 @@ int diva_pri_init_card(diva_os_xdi_adapter_t * a)
                bar_length[0] = MP2_MEMORY_SIZE;
        }
        /*
-          Set properties
-        */
+         Set properties
+       */
        a->xdi_adapter.Properties = CardProperties[a->CardOrdinal];
        DBG_LOG(("Load %s", a->xdi_adapter.Properties.Name))
 
-       /*
-          First initialization step: get and check hardware resoures.
-          Do not map resources and do not acecess card at this step
-        */
-       for (bar = 0; bar < 5; bar++) {
-               a->resources.pci.bar[bar] =
-                   divasa_get_pci_bar(a->resources.pci.bus,
-                                      a->resources.pci.func, bar,
-                                      a->resources.pci.hdev);
-               if (!a->resources.pci.bar[bar]
-                   || (a->resources.pci.bar[bar] == 0xFFFFFFF0)) {
-                       DBG_ERR(("A: invalid bar[%d]=%08x", bar,
-                                a->resources.pci.bar[bar]))
-                       return (-1);
+               /*
+                 First initialization step: get and check hardware resoures.
+                 Do not map resources and do not acecess card at this step
+               */
+               for (bar = 0; bar < 5; bar++) {
+                       a->resources.pci.bar[bar] =
+                               divasa_get_pci_bar(a->resources.pci.bus,
+                                                  a->resources.pci.func, bar,
+                                                  a->resources.pci.hdev);
+                       if (!a->resources.pci.bar[bar]
+                           || (a->resources.pci.bar[bar] == 0xFFFFFFF0)) {
+                               DBG_ERR(("A: invalid bar[%d]=%08x", bar,
+                                        a->resources.pci.bar[bar]))
+                                       return (-1);
+                       }
                }
-       }
        a->resources.pci.irq =
-           (byte) divasa_get_pci_irq(a->resources.pci.bus,
-                                     a->resources.pci.func,
-                                     a->resources.pci.hdev);
+               (byte) divasa_get_pci_irq(a->resources.pci.bus,
+                                         a->resources.pci.func,
+                                         a->resources.pci.hdev);
        if (!a->resources.pci.irq) {
                DBG_ERR(("A: invalid irq"));
                return (-1);
        }
 
        /*
-          Map all BAR's
-        */
+         Map all BAR's
+       */
        for (bar = 0; bar < 5; bar++) {
                a->resources.pci.addr[bar] =
-                   divasa_remap_pci_bar(a, bar, a->resources.pci.bar[bar],
-                                        bar_length[bar]);
+                       divasa_remap_pci_bar(a, bar, a->resources.pci.bar[bar],
+                                            bar_length[bar]);
                if (!a->resources.pci.addr[bar]) {
                        DBG_ERR(("A: A(%d), can't map bar[%d]",
                                 a->controller, bar))
-                       diva_pri_cleanup_adapter(a);
+                               diva_pri_cleanup_adapter(a);
                        return (-1);
                }
        }
 
        /*
-          Set all memory areas
-        */
+         Set all memory areas
+       */
        diva_pri_set_addresses(a);
 
        /*
-          Get Serial Number of this adapter
-        */
+         Get Serial Number of this adapter
+       */
        if (pri_get_serial_number(a)) {
                dword serNo;
                serNo = a->resources.pci.bar[1] & 0xffff0000;
@@ -171,12 +171,12 @@ int diva_pri_init_card(diva_os_xdi_adapter_t * a)
                a->xdi_adapter.serialNo = serNo & ~0xFF000000;
                DBG_ERR(("A: A(%d) can't get Serial Number, generated serNo=%ld",
                         a->controller, a->xdi_adapter.serialNo))
-       }
+                       }
 
 
        /*
-          Initialize os objects
-        */
+         Initialize os objects
+       */
        if (diva_os_initialize_spin_lock(&a->xdi_adapter.isr_spin_lock, "isr")) {
                diva_pri_cleanup_adapter(a);
                return (-1);
@@ -196,20 +196,20 @@ int diva_pri_init_card(diva_os_xdi_adapter_t * a)
        }
 
        /*
-          Do not initialize second DPC - only one thread will be created
-        */
+         Do not initialize second DPC - only one thread will be created
+       */
        a->xdi_adapter.isr_soft_isr.object =
-           a->xdi_adapter.req_soft_isr.object;
+               a->xdi_adapter.req_soft_isr.object;
 
        /*
-          Next step of card initialization:
-          set up all interface pointers
-        */
+         Next step of card initialization:
+         set up all interface pointers
+       */
        a->xdi_adapter.Channels = CardProperties[a->CardOrdinal].Channels;
        a->xdi_adapter.e_max = CardProperties[a->CardOrdinal].E_info;
 
        a->xdi_adapter.e_tbl =
-           diva_os_malloc(0, a->xdi_adapter.e_max * sizeof(E_INFO));
+               diva_os_malloc(0, a->xdi_adapter.e_max * sizeof(E_INFO));
        if (!a->xdi_adapter.e_tbl) {
                diva_pri_cleanup_adapter(a);
                return (-1);
@@ -230,16 +230,16 @@ int diva_pri_init_card(diva_os_xdi_adapter_t * a)
        a->dsp_mask = diva_pri_detect_dsps(a);
 
        /*
-          Allocate DMA map
-        */
+         Allocate DMA map
+       */
        if (pri_rev_2) {
                diva_init_dma_map(a->resources.pci.hdev,
                                  (struct _diva_dma_map_entry **) &a->xdi_adapter.dma_map, 32);
        }
 
        /*
-          Set IRQ handler
-        */
+         Set IRQ handler
+       */
        a->xdi_adapter.irq_info.irq_nr = a->resources.pci.irq;
        sprintf(a->xdi_adapter.irq_info.irq_name,
                "DIVA PRI %ld", (long) a->xdi_adapter.serialNo);
@@ -257,28 +257,28 @@ int diva_pri_init_card(diva_os_xdi_adapter_t * a)
        return (0);
 }
 
-static int diva_pri_cleanup_adapter(diva_os_xdi_adapter_t * a)
+static int diva_pri_cleanup_adapter(diva_os_xdi_adapter_t *a)
 {
        int bar = 0;
 
        /*
-          Stop Adapter if adapter is running
-        */
+         Stop Adapter if adapter is running
+       */
        if (a->xdi_adapter.Initialized) {
                diva_pri_stop_adapter(a);
        }
 
        /*
-          Remove ISR Handler
-        */
+         Remove ISR Handler
+       */
        if (a->xdi_adapter.irq_info.registered) {
                diva_os_remove_irq(a, a->xdi_adapter.irq_info.irq_nr);
        }
        a->xdi_adapter.irq_info.registered = 0;
 
        /*
-          Step 1: unmap all BAR's, if any was mapped
-        */
+         Step 1: unmap all BAR's, if any was mapped
+       */
        for (bar = 0; bar < 5; bar++) {
                if (a->resources.pci.bar[bar]
                    && a->resources.pci.addr[bar]) {
@@ -289,8 +289,8 @@ static int diva_pri_cleanup_adapter(diva_os_xdi_adapter_t * a)
        }
 
        /*
-          Free OS objects
-        */
+         Free OS objects
+       */
        diva_os_cancel_soft_isr(&a->xdi_adapter.isr_soft_isr);
        diva_os_cancel_soft_isr(&a->xdi_adapter.req_soft_isr);
 
@@ -301,8 +301,8 @@ static int diva_pri_cleanup_adapter(diva_os_xdi_adapter_t * a)
        diva_os_destroy_spin_lock(&a->xdi_adapter.data_spin_lock, "rm");
 
        /*
-          Free memory accupied by XDI adapter
-        */
+         Free memory accupied by XDI adapter
+       */
        if (a->xdi_adapter.e_tbl) {
                diva_os_free(0, a->xdi_adapter.e_tbl);
                a->xdi_adapter.e_tbl = NULL;
@@ -312,8 +312,8 @@ static int diva_pri_cleanup_adapter(diva_os_xdi_adapter_t * a)
 
 
        /*
-          Free adapter DMA map
-        */
+         Free adapter DMA map
+       */
        diva_free_dma_map(a->resources.pci.hdev,
                          (struct _diva_dma_map_entry *) a->xdi_adapter.
                          dma_map);
@@ -321,8 +321,8 @@ static int diva_pri_cleanup_adapter(diva_os_xdi_adapter_t * a)
 
 
        /*
-          Detach this adapter from debug driver
-        */
+         Detach this adapter from debug driver
+       */
 
        return (0);
 }
@@ -341,7 +341,7 @@ static int diva_pri_reset_adapter(PISDN_ADAPTER IoAdapter)
        if (IoAdapter->Initialized) {
                DBG_ERR(("A: A(%d) can't reset PRI adapter - please stop first",
                         IoAdapter->ANum))
-               return (-1);
+                       return (-1);
        }
 
        boot = (struct mp_load __iomem *) DIVA_OS_MEM_ATTACH_ADDRESS(IoAdapter);
@@ -360,20 +360,20 @@ static int diva_pri_reset_adapter(PISDN_ADAPTER IoAdapter)
                DIVA_OS_MEM_DETACH_ADDRESS(IoAdapter, boot);
                DBG_ERR(("A: A(%d) CPU on PRI %ld is not alive!",
                         IoAdapter->ANum, IoAdapter->serialNo))
-               return (-1);
+                       return (-1);
        }
        if (READ_DWORD(&boot->err)) {
                DBG_ERR(("A: A(%d) PRI %ld Board Selftest failed, error=%08lx",
                         IoAdapter->ANum, IoAdapter->serialNo,
                         READ_DWORD(&boot->err)))
-               DIVA_OS_MEM_DETACH_ADDRESS(IoAdapter, boot);
+                       DIVA_OS_MEM_DETACH_ADDRESS(IoAdapter, boot);
                return (-1);
        }
        DIVA_OS_MEM_DETACH_ADDRESS(IoAdapter, boot);
 
        /*
-          Forget all outstanding entities
-        */
+         Forget all outstanding entities
+       */
        IoAdapter->e_count = 0;
        if (IoAdapter->e_tbl) {
                memset(IoAdapter->e_tbl, 0x00,
@@ -407,7 +407,7 @@ static int diva_pri_reset_adapter(PISDN_ADAPTER IoAdapter)
 static int
 diva_pri_write_sdram_block(PISDN_ADAPTER IoAdapter,
                           dword address,
-                          const byte * data, dword length, dword limit)
+                          const byte *data, dword length, dword limit)
 {
        byte __iomem *p = DIVA_OS_MEM_ATTACH_ADDRESS(IoAdapter);
        byte __iomem *mem = p;
@@ -416,7 +416,7 @@ diva_pri_write_sdram_block(PISDN_ADAPTER IoAdapter,
                DIVA_OS_MEM_DETACH_ADDRESS(IoAdapter, p);
                DBG_ERR(("A: A(%d) write PRI address=0x%08lx",
                         IoAdapter->ANum, address + length))
-               return (-1);
+                       return (-1);
        }
        mem += address;
 
@@ -443,20 +443,20 @@ diva_pri_start_adapter(PISDN_ADAPTER IoAdapter,
                DIVA_OS_MEM_DETACH_ADDRESS(IoAdapter, boot);
                DBG_ERR(("A: A(%d) pri_start_adapter, adapter already running",
                         IoAdapter->ANum))
-               return (-1);
+                       return (-1);
        }
        if (!boot) {
                DIVA_OS_MEM_DETACH_ADDRESS(IoAdapter, boot);
                DBG_ERR(("A: PRI %ld can't start, adapter not mapped",
                         IoAdapter->serialNo))
-               return (-1);
+                       return (-1);
        }
 
        sprintf(IoAdapter->Name, "A(%d)", (int) IoAdapter->ANum);
        DBG_LOG(("A(%d) start PRI at 0x%08lx", IoAdapter->ANum,
                 start_address))
 
-       WRITE_DWORD(&boot->addr, start_address);
+               WRITE_DWORD(&boot->addr, start_address);
        WRITE_DWORD(&boot->cmd, 3);
 
        for (i = 0; i < 300; ++i) {
@@ -464,7 +464,7 @@ diva_pri_start_adapter(PISDN_ADAPTER IoAdapter,
                if ((READ_DWORD(&boot->signature) >> 16) == 0x4447) {
                        DBG_LOG(("A(%d) Protocol startup time %d.%02d seconds",
                                 IoAdapter->ANum, (i / 100), (i % 100)))
-                       started = 1;
+                               started = 1;
                        break;
                }
        }
@@ -478,7 +478,7 @@ diva_pri_start_adapter(PISDN_ADAPTER IoAdapter,
                DBG_ERR(("A(%d) Adapter start failed 0x%08lx, TrapId=%08lx, debug=%08lx",
                         IoAdapter->ANum, READ_DWORD(&boot->signature),
                         TrapId, debug))
-               DIVA_OS_MEM_DETACH_ADDRESS(IoAdapter, boot);
+                       DIVA_OS_MEM_DETACH_ADDRESS(IoAdapter, boot);
                if (IoAdapter->trapFnc) {
                        (*(IoAdapter->trapFnc)) (IoAdapter);
                }
@@ -490,11 +490,11 @@ diva_pri_start_adapter(PISDN_ADAPTER IoAdapter,
        IoAdapter->Initialized = true;
 
        /*
-          Check Interrupt
-        */
+         Check Interrupt
+       */
        IoAdapter->IrqCount = 0;
        p = DIVA_OS_MEM_ATTACH_CFG(IoAdapter);
-       WRITE_DWORD(p, (dword) ~ 0x03E00000);
+       WRITE_DWORD(p, (dword)~0x03E00000);
        DIVA_OS_MEM_DETACH_CFG(IoAdapter, p);
        a->ReadyInt = 1;
        a->ram_out(a, &PR_RAM->ReadyInt, 1);
@@ -504,7 +504,7 @@ diva_pri_start_adapter(PISDN_ADAPTER IoAdapter,
        if (!IoAdapter->IrqCount) {
                DBG_ERR(("A: A(%d) interrupt test failed",
                         IoAdapter->ANum))
-               IoAdapter->Initialized = false;
+                       IoAdapter->Initialized = false;
                IoAdapter->stop(IoAdapter);
                return (-1);
        }
@@ -514,21 +514,21 @@ diva_pri_start_adapter(PISDN_ADAPTER IoAdapter,
        diva_xdi_display_adapter_features(IoAdapter->ANum);
 
        DBG_LOG(("A(%d) PRI adapter successfully started", IoAdapter->ANum))
-       /*
-          Register with DIDD
-        */
-       diva_xdi_didd_register_adapter(IoAdapter->ANum);
+               /*
+                 Register with DIDD
+               */
+               diva_xdi_didd_register_adapter(IoAdapter->ANum);
 
        return (0);
 }
 
-static void diva_pri_clear_interrupts(diva_os_xdi_adapter_t * a)
+static void diva_pri_clear_interrupts(diva_os_xdi_adapter_t *a)
 {
        PISDN_ADAPTER IoAdapter = &a->xdi_adapter;
 
        /*
-          clear any pending interrupt
-        */
+         clear any pending interrupt
+       */
        IoAdapter->disIrq(IoAdapter);
 
        IoAdapter->tst_irq(&IoAdapter->a);
@@ -536,8 +536,8 @@ static void diva_pri_clear_interrupts(diva_os_xdi_adapter_t * a)
        IoAdapter->tst_irq(&IoAdapter->a);
 
        /*
-          kill pending dpcs
-        */
+         kill pending dpcs
+       */
        diva_os_cancel_soft_isr(&IoAdapter->req_soft_isr);
        diva_os_cancel_soft_isr(&IoAdapter->isr_soft_isr);
 }
@@ -546,7 +546,7 @@ static void diva_pri_clear_interrupts(diva_os_xdi_adapter_t * a)
 **  Stop Adapter, but do not unmap/unregister - adapter
 **  will be restarted later
 */
-static int diva_pri_stop_adapter(diva_os_xdi_adapter_t * a)
+static int diva_pri_stop_adapter(diva_os_xdi_adapter_t *a)
 {
        PISDN_ADAPTER IoAdapter = &a->xdi_adapter;
        int i = 100;
@@ -557,18 +557,18 @@ static int diva_pri_stop_adapter(diva_os_xdi_adapter_t * a)
        if (!IoAdapter->Initialized) {
                DBG_ERR(("A: A(%d) can't stop PRI adapter - not running",
                         IoAdapter->ANum))
-               return (-1);    /* nothing to stop */
+                       return (-1);    /* nothing to stop */
        }
        IoAdapter->Initialized = 0;
 
        /*
-          Disconnect Adapter from DIDD
-        */
+         Disconnect Adapter from DIDD
+       */
        diva_xdi_didd_remove_adapter(IoAdapter->ANum);
 
        /*
-          Stop interrupts
-        */
+         Stop interrupts
+       */
        a->clear_interrupts_proc = diva_pri_clear_interrupts;
        IoAdapter->a.ReadyInt = 1;
        IoAdapter->a.ram_inc(&IoAdapter->a, &PR_RAM->ReadyInt);
@@ -581,12 +581,12 @@ static int diva_pri_stop_adapter(diva_os_xdi_adapter_t * a)
                a->clear_interrupts_proc = NULL;
                DBG_ERR(("A: A(%d) no final interrupt from PRI adapter",
                         IoAdapter->ANum))
-       }
+                       }
        IoAdapter->a.ReadyInt = 0;
 
        /*
-          Stop and reset adapter
-        */
+         Stop and reset adapter
+       */
        IoAdapter->stop(IoAdapter);
 
        return (0);
@@ -600,24 +600,24 @@ static int diva_pri_stop_adapter(diva_os_xdi_adapter_t * a)
 */
 static int
 diva_pri_cmd_card_proc(struct _diva_os_xdi_adapter *a,
-                      diva_xdi_um_cfg_cmd_t * cmd, int length)
+                      diva_xdi_um_cfg_cmd_t *cmd, int length)
 {
        int ret = -1;
 
        if (cmd->adapter != a->controller) {
                DBG_ERR(("A: pri_cmd, invalid controller=%d != %d",
                         cmd->adapter, a->controller))
-               return (-1);
+                       return (-1);
        }
 
        switch (cmd->command) {
        case DIVA_XDI_UM_CMD_GET_CARD_ORDINAL:
                a->xdi_mbox.data_length = sizeof(dword);
                a->xdi_mbox.data =
-                   diva_os_malloc(0, a->xdi_mbox.data_length);
+                       diva_os_malloc(0, a->xdi_mbox.data_length);
                if (a->xdi_mbox.data) {
                        *(dword *) a->xdi_mbox.data =
-                           (dword) a->CardOrdinal;
+                               (dword) a->CardOrdinal;
                        a->xdi_mbox.status = DIVA_XDI_MBOX_BUSY;
                        ret = 0;
                }
@@ -626,10 +626,10 @@ diva_pri_cmd_card_proc(struct _diva_os_xdi_adapter *a,
        case DIVA_XDI_UM_CMD_GET_SERIAL_NR:
                a->xdi_mbox.data_length = sizeof(dword);
                a->xdi_mbox.data =
-                   diva_os_malloc(0, a->xdi_mbox.data_length);
+                       diva_os_malloc(0, a->xdi_mbox.data_length);
                if (a->xdi_mbox.data) {
                        *(dword *) a->xdi_mbox.data =
-                           (dword) a->xdi_adapter.serialNo;
+                               (dword) a->xdi_adapter.serialNo;
                        a->xdi_mbox.status = DIVA_XDI_MBOX_BUSY;
                        ret = 0;
                }
@@ -638,7 +638,7 @@ diva_pri_cmd_card_proc(struct _diva_os_xdi_adapter *a,
        case DIVA_XDI_UM_CMD_GET_PCI_HW_CONFIG:
                a->xdi_mbox.data_length = sizeof(dword) * 9;
                a->xdi_mbox.data =
-                   diva_os_malloc(0, a->xdi_mbox.data_length);
+                       diva_os_malloc(0, a->xdi_mbox.data_length);
                if (a->xdi_mbox.data) {
                        int i;
                        dword *data = (dword *) a->xdi_mbox.data;
@@ -660,7 +660,7 @@ diva_pri_cmd_card_proc(struct _diva_os_xdi_adapter *a,
                ret = diva_pri_write_sdram_block(&a->xdi_adapter,
                                                 cmd->command_data.
                                                 write_sdram.offset,
-                                                (byte *) & cmd[1],
+                                                (byte *)&cmd[1],
                                                 cmd->command_data.
                                                 write_sdram.length,
                                                 pri_is_rev_2_card(a->
@@ -683,22 +683,22 @@ diva_pri_cmd_card_proc(struct _diva_os_xdi_adapter *a,
 
        case DIVA_XDI_UM_CMD_SET_PROTOCOL_FEATURES:
                a->xdi_adapter.features =
-                   cmd->command_data.features.features;
+                       cmd->command_data.features.features;
                a->xdi_adapter.a.protocol_capabilities =
-                   a->xdi_adapter.features;
+                       a->xdi_adapter.features;
                DBG_TRC(("Set raw protocol features (%08x)",
                         a->xdi_adapter.features))
-               ret = 0;
+                       ret = 0;
                break;
 
        case DIVA_XDI_UM_CMD_GET_CARD_STATE:
                a->xdi_mbox.data_length = sizeof(dword);
                a->xdi_mbox.data =
-                   diva_os_malloc(0, a->xdi_mbox.data_length);
+                       diva_os_malloc(0, a->xdi_mbox.data_length);
                if (a->xdi_mbox.data) {
                        dword *data = (dword *) a->xdi_mbox.data;
                        if (!a->xdi_adapter.ram ||
-                               !a->xdi_adapter.reset ||
+                           !a->xdi_adapter.reset ||
                            !a->xdi_adapter.cfg) {
                                *data = 3;
                        } else if (a->xdi_adapter.trapped) {
@@ -720,16 +720,16 @@ diva_pri_cmd_card_proc(struct _diva_os_xdi_adapter *a,
        case DIVA_XDI_UM_CMD_READ_SDRAM:
                if (a->xdi_adapter.Address) {
                        if (
-                           (a->xdi_mbox.data_length =
-                            cmd->command_data.read_sdram.length)) {
+                               (a->xdi_mbox.data_length =
+                                cmd->command_data.read_sdram.length)) {
                                if (
-                                   (a->xdi_mbox.data_length +
-                                    cmd->command_data.read_sdram.offset) <
-                                   a->xdi_adapter.MemorySize) {
+                                       (a->xdi_mbox.data_length +
+                                        cmd->command_data.read_sdram.offset) <
+                                       a->xdi_adapter.MemorySize) {
                                        a->xdi_mbox.data =
-                                           diva_os_malloc(0,
-                                                          a->xdi_mbox.
-                                                          data_length);
+                                               diva_os_malloc(0,
+                                                              a->xdi_mbox.
+                                                              data_length);
                                        if (a->xdi_mbox.data) {
                                                byte __iomem *p = DIVA_OS_MEM_ATTACH_ADDRESS(&a->xdi_adapter);
                                                byte __iomem *src = p;
@@ -753,7 +753,7 @@ diva_pri_cmd_card_proc(struct _diva_os_xdi_adapter *a,
        default:
                DBG_ERR(("A: A(%d) invalid cmd=%d", a->controller,
                         cmd->command))
-       }
+                       }
 
        return (ret);
 }
@@ -761,7 +761,7 @@ diva_pri_cmd_card_proc(struct _diva_os_xdi_adapter *a,
 /*
 **  Get Serial Number
 */
-static int pri_get_serial_number(diva_os_xdi_adapter_t * a)
+static int pri_get_serial_number(diva_os_xdi_adapter_t *a)
 {
        byte data[64];
        int i;
@@ -773,28 +773,28 @@ static int pri_get_serial_number(diva_os_xdi_adapter_t * a)
 /*
  *  First set some GT6401x config registers before accessing the BOOT-ROM
  */
-       config = DIVA_OS_MEM_ATTACH_CONFIG(&a->xdi_adapter);
+       config = DIVA_OS_MEM_ATTACH_CONFIG(&a->xdi_adapter);
        c = READ_BYTE(&config[0xc3c]);
        if (!(c & 0x08)) {
                WRITE_BYTE(&config[0xc3c], c);  /* Base Address enable register */
        }
        WRITE_BYTE(&config[LOW_BOOTCS_DREG], 0x00);
        WRITE_BYTE(&config[HI_BOOTCS_DREG], 0xFF);
-       DIVA_OS_MEM_DETACH_CONFIG(&a->xdi_adapter, config);
+       DIVA_OS_MEM_DETACH_CONFIG(&a->xdi_adapter, config);
 /*
  *  Read only the last 64 bytes of manufacturing data
  */
        memset(data, '\0', len);
-       flash = DIVA_OS_MEM_ATTACH_PROM(&a->xdi_adapter);
+       flash = DIVA_OS_MEM_ATTACH_PROM(&a->xdi_adapter);
        for (i = 0; i < len; i++) {
                data[i] = READ_BYTE(&flash[0x8000 - len + i]);
        }
-       DIVA_OS_MEM_DETACH_PROM(&a->xdi_adapter, flash);
+       DIVA_OS_MEM_DETACH_PROM(&a->xdi_adapter, flash);
 
-       config = DIVA_OS_MEM_ATTACH_CONFIG(&a->xdi_adapter);
+       config = DIVA_OS_MEM_ATTACH_CONFIG(&a->xdi_adapter);
        WRITE_BYTE(&config[LOW_BOOTCS_DREG], 0xFC);     /* Disable FLASH EPROM access */
        WRITE_BYTE(&config[HI_BOOTCS_DREG], 0xFF);
-       DIVA_OS_MEM_DETACH_CONFIG(&a->xdi_adapter, config);
+       DIVA_OS_MEM_DETACH_CONFIG(&a->xdi_adapter, config);
 
        if (memcmp(&data[48], "DIVAserverPR", 12)) {
 #if !defined(DIVA_PRI_NO_PCI_BIOS_WORKAROUND)  /* { */
@@ -808,11 +808,11 @@ static int pri_get_serial_number(diva_os_xdi_adapter_t * a)
                addr1 = a->resources.pci.bar[1];        /* unused */
 
                DBG_ERR(("A: apply Compaq BIOS workaround"))
-               DBG_LOG(("%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x",
-                            data[0], data[1], data[2], data[3],
-                            data[4], data[5], data[6], data[7]))
+                       DBG_LOG(("%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x",
+                                data[0], data[1], data[2], data[3],
+                                data[4], data[5], data[6], data[7]))
 
-               Bus = a->resources.pci.bus;
+                       Bus = a->resources.pci.bus;
                Slot = a->resources.pci.func;
                hdev = a->resources.pci.hdev;
                PCIread(Bus, Slot, 0x04, &cmd_org, sizeof(cmd_org), hdev);
@@ -832,69 +832,69 @@ static int pri_get_serial_number(diva_os_xdi_adapter_t * a)
                a->resources.pci.bar[4] = addr1;
 
                /*
-                  Try to read Flash again
-                */
+                 Try to read Flash again
+               */
                len = sizeof(data);
 
-               config = DIVA_OS_MEM_ATTACH_CONFIG(&a->xdi_adapter);
+               config = DIVA_OS_MEM_ATTACH_CONFIG(&a->xdi_adapter);
                if (!(config[0xc3c] & 0x08)) {
                        config[0xc3c] |= 0x08;  /* Base Address enable register */
                }
                config[LOW_BOOTCS_DREG] = 0x00;
                config[HI_BOOTCS_DREG] = 0xFF;
-               DIVA_OS_MEM_DETACH_CONFIG(&a->xdi_adapter, config);
+               DIVA_OS_MEM_DETACH_CONFIG(&a->xdi_adapter, config);
 
                memset(data, '\0', len);
-               flash = DIVA_OS_MEM_ATTACH_PROM(&a->xdi_adapter);
+               flash = DIVA_OS_MEM_ATTACH_PROM(&a->xdi_adapter);
                for (i = 0; i < len; i++) {
                        data[i] = flash[0x8000 - len + i];
                }
-               DIVA_OS_MEM_ATTACH_PROM(&a->xdi_adapter, flash);
-               config = DIVA_OS_MEM_ATTACH_CONFIG(&a->xdi_adapter);
+               DIVA_OS_MEM_ATTACH_PROM(&a->xdi_adapter, flash);
+               config = DIVA_OS_MEM_ATTACH_CONFIG(&a->xdi_adapter);
                config[LOW_BOOTCS_DREG] = 0xFC;
                config[HI_BOOTCS_DREG] = 0xFF;
-               DIVA_OS_MEM_DETACH_CONFIG(&a->xdi_adapter, config);
+               DIVA_OS_MEM_DETACH_CONFIG(&a->xdi_adapter, config);
 
                if (memcmp(&data[48], "DIVAserverPR", 12)) {
                        DBG_ERR(("A: failed to read serial number"))
-                       DBG_LOG(("%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x",
-                                    data[0], data[1], data[2], data[3],
-                                    data[4], data[5], data[6], data[7]))
-                       return (-1);
+                               DBG_LOG(("%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x",
+                                        data[0], data[1], data[2], data[3],
+                                        data[4], data[5], data[6], data[7]))
+                               return (-1);
                }
 #else                          /* } { */
                DBG_ERR(("A: failed to read DIVA signature word"))
-               DBG_LOG(("%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x",
-                            data[0], data[1], data[2], data[3],
-                            data[4], data[5], data[6], data[7]))
-               DBG_LOG(("%02x:%02x:%02x:%02x", data[47], data[46],
-                            data[45], data[44]))
+                       DBG_LOG(("%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x",
+                                data[0], data[1], data[2], data[3],
+                                data[4], data[5], data[6], data[7]))
+                       DBG_LOG(("%02x:%02x:%02x:%02x", data[47], data[46],
+                                data[45], data[44]))
 #endif                         /* } */
-       }
+                       }
 
        a->xdi_adapter.serialNo =
-           (data[47] << 24) | (data[46] << 16) | (data[45] << 8) |
-           data[44];
+               (data[47] << 24) | (data[46] << 16) | (data[45] << 8) |
+               data[44];
        if (!a->xdi_adapter.serialNo
            || (a->xdi_adapter.serialNo == 0xffffffff)) {
                a->xdi_adapter.serialNo = 0;
                DBG_ERR(("A: failed to read serial number"))
-               return (-1);
+                       return (-1);
        }
 
        DBG_LOG(("Serial No.          : %ld", a->xdi_adapter.serialNo))
-       DBG_TRC(("Board Revision      : %d.%02d", (int) data[41],
-                    (int) data[40]))
-       DBG_TRC(("PLD revision        : %d.%02d", (int) data[33],
-                    (int) data[32]))
-       DBG_TRC(("Boot loader version : %d.%02d", (int) data[37],
-                    (int) data[36]))
+               DBG_TRC(("Board Revision      : %d.%02d", (int) data[41],
+                        (int) data[40]))
+               DBG_TRC(("PLD revision        : %d.%02d", (int) data[33],
+                        (int) data[32]))
+               DBG_TRC(("Boot loader version : %d.%02d", (int) data[37],
+                        (int) data[36]))
 
-       DBG_TRC(("Manufacturing Date  : %d/%02d/%02d  (yyyy/mm/dd)",
-                    (int) ((data[28] > 90) ? 1900 : 2000) +
-                    (int) data[28], (int) data[29], (int) data[30]))
+               DBG_TRC(("Manufacturing Date  : %d/%02d/%02d  (yyyy/mm/dd)",
+                        (int) ((data[28] > 90) ? 1900 : 2000) +
+                        (int) data[28], (int) data[29], (int) data[30]))
 
-       return (0);
+               return (0);
 }
 
 void diva_os_prepare_pri2_functions(PISDN_ADAPTER IoAdapter)
@@ -909,7 +909,7 @@ void diva_os_prepare_pri_functions(PISDN_ADAPTER IoAdapter)
 **  Checks presence of DSP on board
 */
 static int
-dsp_check_presence(volatile byte __iomem * addr, volatile byte __iomem * data, int dsp)
+dsp_check_presence(volatile byte __iomem *addr, volatile byte __iomem *data, int dsp)
 {
        word pattern;
 
@@ -922,7 +922,7 @@ dsp_check_presence(volatile byte __iomem * addr, volatile byte __iomem * data, i
        if (pattern != DSP_SIGNATURE_PROBE_WORD) {
                DBG_TRC(("W: DSP[%d] %04x(is) != %04x(should)",
                         dsp, pattern, DSP_SIGNATURE_PROBE_WORD))
-               return (-1);
+                       return (-1);
        }
 
        WRITE_WORD(addr, 0x4000);
@@ -931,15 +931,15 @@ dsp_check_presence(volatile byte __iomem * addr, volatile byte __iomem * data, i
        WRITE_WORD(addr, 0x4000);
        pattern = READ_WORD(data);
 
-       if (pattern != (word) ~ DSP_SIGNATURE_PROBE_WORD) {
+       if (pattern != (word)~DSP_SIGNATURE_PROBE_WORD) {
                DBG_ERR(("A: DSP[%d] %04x(is) != %04x(should)",
-                        dsp, pattern, (word) ~ DSP_SIGNATURE_PROBE_WORD))
-               return (-2);
+                        dsp, pattern, (word)~DSP_SIGNATURE_PROBE_WORD))
+                       return (-2);
        }
 
        DBG_TRC(("DSP[%d] present", dsp))
 
-       return (0);
+               return (0);
 }
 
 
@@ -952,7 +952,7 @@ dsp_check_presence(volatile byte __iomem * addr, volatile byte __iomem * data, i
 **  ...
 **  Bit 29 - DSP30
 */
-static dword diva_pri_detect_dsps(diva_os_xdi_adapter_t * a)
+static dword diva_pri_detect_dsps(diva_os_xdi_adapter_t *a)
 {
        byte __iomem *base;
        byte __iomem *p;
@@ -1008,8 +1008,8 @@ static dword diva_pri_detect_dsps(diva_os_xdi_adapter_t * a)
        diva_os_wait(5);
 
        /*
-          Verify modules
-        */
+         Verify modules
+       */
        for (dsp_row = 0; dsp_row < 4; dsp_row++) {
                row_state = ((ret >> (dsp_row * 7)) & 0x7F);
                if (row_state && (row_state != 0x7F)) {
@@ -1018,35 +1018,35 @@ static dword diva_pri_detect_dsps(diva_os_xdi_adapter_t * a)
                                        DBG_ERR(("A: MODULE[%d]-DSP[%d] failed",
                                                 dsp_row + 1,
                                                 dsp_index + 1))
-                               }
+                                               }
                        }
                }
        }
 
        if (!(ret & 0x10000000)) {
                DBG_ERR(("A: ON BOARD-DSP[1] failed"))
-       }
+                       }
        if (!(ret & 0x20000000)) {
                DBG_ERR(("A: ON BOARD-DSP[2] failed"))
-       }
+                       }
 
        /*
-          Print module population now
-        */
-       DBG_LOG(("+-----------------------+"))
-       DBG_LOG(("| DSP MODULE POPULATION |"))
-       DBG_LOG(("+-----------------------+"))
-       DBG_LOG(("|  1  |  2  |  3  |  4  |"))
-       DBG_LOG(("+-----------------------+"))
-       DBG_LOG(("|  %s  |  %s  |  %s  |  %s  |",
-                ((ret >> (0 * 7)) & 0x7F) ? "Y" : "N",
-                ((ret >> (1 * 7)) & 0x7F) ? "Y" : "N",
-                ((ret >> (2 * 7)) & 0x7F) ? "Y" : "N",
-                ((ret >> (3 * 7)) & 0x7F) ? "Y" : "N"))
+         Print module population now
+       */
        DBG_LOG(("+-----------------------+"))
-
-       DBG_LOG(("DSP's(present-absent):%08x-%08x", ret,
-                ~ret & 0x3fffffff))
-
-       return (ret);
+               DBG_LOG(("| DSP MODULE POPULATION |"))
+               DBG_LOG(("+-----------------------+"))
+               DBG_LOG(("|  1  |  2  |  3  |  4  |"))
+               DBG_LOG(("+-----------------------+"))
+               DBG_LOG(("|  %s  |  %s  |  %s  |  %s  |",
+                        ((ret >> (0 * 7)) & 0x7F) ? "Y" : "N",
+                        ((ret >> (1 * 7)) & 0x7F) ? "Y" : "N",
+                        ((ret >> (2 * 7)) & 0x7F) ? "Y" : "N",
+                        ((ret >> (3 * 7)) & 0x7F) ? "Y" : "N"))
+               DBG_LOG(("+-----------------------+"))
+
+               DBG_LOG(("DSP's(present-absent):%08x-%08x", ret,
+                        ~ret & 0x3fffffff))
+
+               return (ret);
 }
index a7c42f9..537c74d 100644 (file)
@@ -3,6 +3,6 @@
 #ifndef __DIVA_OS_PRI_REV_1_H__
 #define __DIVA_OS_PRI_REV_1_H__
 
-int diva_pri_init_card(diva_os_xdi_adapter_t * a);
+int diva_pri_init_card(diva_os_xdi_adapter_t *a);
 
 #endif
index bf6b018..889dc98 100644 (file)
@@ -1,26 +1,26 @@
 
 /*
  *
-  Copyright (c) Eicon Networks, 2002.
+ Copyright (c) Eicon Networks, 2002.
  *
-  This source file is supplied for the use with
-  Eicon Networks range of DIVA Server Adapters.
+ This source file is supplied for the use with
+ Eicon Networks range of DIVA Server Adapters.
  *
-  Eicon File Revision :    2.1
+ Eicon File Revision :    2.1
  *
-  This program is free software; you can redistribute it and/or modify
-  it under the terms of the GNU General Public License as published by
-  the Free Software Foundation; either version 2, or (at your option)
-  any later version.
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
  *
-  This program is distributed in the hope that it will be useful,
-  but WITHOUT ANY WARRANTY OF ANY KIND WHATSOEVER INCLUDING ANY
-  implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-  See the GNU General Public License for more details.
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY OF ANY KIND WHATSOEVER INCLUDING ANY
+ implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ See the GNU General Public License for more details.
  *
-  You should have received a copy of the GNU General Public License
-  along with this program; if not, write to the Free Software
-  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  *
  */
 #ifndef PC_H_INCLUDED  /* { */
 /* buffer definition                                                */
 /*------------------------------------------------------------------*/
 typedef struct {
-  word length;          /* length of data/parameter field           */
-  byte P[270];          /* data/parameter field                     */
+       word length;          /* length of data/parameter field           */
+       byte P[270];          /* data/parameter field                     */
 } PBUFFER;
 /*------------------------------------------------------------------*/
 /* dual port ram structure                                          */
 /*------------------------------------------------------------------*/
 struct dual
 {
-  byte Req;             /* request register                         */
-  byte ReqId;           /* request task/entity identification       */
-  byte Rc;              /* return code register                     */
-  byte RcId;            /* return code task/entity identification   */
-  byte Ind;             /* Indication register                      */
-  byte IndId;           /* Indication task/entity identification    */
-  byte IMask;           /* Interrupt Mask Flag                      */
-  byte RNR;             /* Receiver Not Ready (set by PC)           */
-  byte XLock;           /* XBuffer locked Flag                      */
-  byte Int;             /* ISDN-S interrupt                         */
-  byte ReqCh;           /* Channel field for layer-3 Requests       */
-  byte RcCh;            /* Channel field for layer-3 Returncodes    */
-  byte IndCh;           /* Channel field for layer-3 Indications    */
-  byte MInd;            /* more data indication field               */
-  word MLength;         /* more data total packet length            */
-  byte ReadyInt;        /* request field for ready interrupt        */
-  byte SWReg;           /* Software register for special purposes   */
-  byte Reserved[11];    /* reserved space                           */
-  byte InterfaceType;   /* interface type 1=16K interface           */
-  word Signature;       /* ISDN-S adapter Signature (GD)            */
-  PBUFFER XBuffer;      /* Transmit Buffer                          */
-  PBUFFER RBuffer;      /* Receive Buffer                           */
+       byte Req;             /* request register                         */
+       byte ReqId;           /* request task/entity identification       */
+       byte Rc;              /* return code register                     */
+       byte RcId;            /* return code task/entity identification   */
+       byte Ind;             /* Indication register                      */
+       byte IndId;           /* Indication task/entity identification    */
+       byte IMask;           /* Interrupt Mask Flag                      */
+       byte RNR;             /* Receiver Not Ready (set by PC)           */
+       byte XLock;           /* XBuffer locked Flag                      */
+       byte Int;             /* ISDN-S interrupt                         */
+       byte ReqCh;           /* Channel field for layer-3 Requests       */
+       byte RcCh;            /* Channel field for layer-3 Returncodes    */
+       byte IndCh;           /* Channel field for layer-3 Indications    */
+       byte MInd;            /* more data indication field               */
+       word MLength;         /* more data total packet length            */
+       byte ReadyInt;        /* request field for ready interrupt        */
+       byte SWReg;           /* Software register for special purposes   */
+       byte Reserved[11];    /* reserved space                           */
+       byte InterfaceType;   /* interface type 1=16K interface           */
+       word Signature;       /* ISDN-S adapter Signature (GD)            */
+       PBUFFER XBuffer;      /* Transmit Buffer                          */
+       PBUFFER RBuffer;      /* Receive Buffer                           */
 };
 /*------------------------------------------------------------------*/
 /* SWReg Values (0 means no command)                                */
 /*------------------------------------------------------------------*/
 #define SWREG_DIE_WITH_LEDON  0x01
-#define SWREG_HALT_CPU        0x02 /* Push CPU into a while(1) loop */
+#define SWREG_HALT_CPU        0x02 /* Push CPU into a while (1) loop */
 /*------------------------------------------------------------------*/
 /* Id Fields Coding                                                 */
 /*------------------------------------------------------------------*/
@@ -273,7 +273,7 @@ struct dual
 #define MORE 0xa0               /* more data                        */
 #define SDNCMPL 0xa1            /* sending complete                 */
 #define CL 0xb0                 /* congestion level                 */
-        /* codeset 0                                                */
+/* codeset 0                                                */
 #define SMSG 0x00               /* segmented message                */
 #define BC  0x04                /* Bearer Capability                */
 #define CAU 0x08                /* cause                            */
@@ -307,7 +307,7 @@ struct dual
 #define NLC 0x21                /* network layer configuration      */
 #define REDIRECT_IE     0x22    /* redirection request/indication data */
 #define REDIRECT_NET_IE 0x23    /* redirection network override data   */
-        /* codeset 6                                                */
+/* codeset 6                                                */
 #define SIN 0x01                /* service indicator                */
 #define CIF 0x02                /* charging information             */
 #define DATE 0x03               /* date                             */
@@ -387,13 +387,13 @@ struct dual
 #define SMASK_CCNR                 0x00000200
 #define SMASK_CONF                 0x00000400
 /* ----------------------------------------------
-    Types of transfers used to transfer the
-    information in the 'struct RC->Reserved2[8]'
-    The information is transferred as 2 dwords
-    (2 4Byte unsigned values)
-    First of them is the transfer type.
-    2^32-1 possible messages are possible in this way.
-    The context of the second one had no meaning
+   Types of transfers used to transfer the
+   information in the 'struct RC->Reserved2[8]'
+   The information is transferred as 2 dwords
+   (2 4Byte unsigned values)
+   First of them is the transfer type.
+   2^32-1 possible messages are possible in this way.
+   The context of the second one had no meaning
    ---------------------------------------------- */
 #define DIVA_RC_TYPE_NONE              0x00000000
 #define DIVA_RC_TYPE_REMOVE_COMPLETE   0x00000008
@@ -402,14 +402,14 @@ struct dual
 #define DIVA_RC_TYPE_OK_FC             0x0000000b
 #define DIVA_RC_TYPE_RX_DMA            0x0000000c
 /* ------------------------------------------------------
-      IO Control codes for IN BAND SIGNALING
+   IO Control codes for IN BAND SIGNALING
    ------------------------------------------------------ */
 #define CTRL_L1_SET_SIG_ID        5
 #define CTRL_L1_SET_DAD           6
 #define CTRL_L1_RESOURCES         7
 /* ------------------------------------------------------ */
 /* ------------------------------------------------------
-      Layer 2 types
+   Layer 2 types
    ------------------------------------------------------ */
 #define X75T            1       /* x.75 for ttx                     */
 #define TRF             2       /* transparent with hdlc framing    */
@@ -439,31 +439,31 @@ struct dual
 #define PIAFS_UDATA_ABILITY_DCDON 0x01
 #define PIAFS_UDATA_ABILITY_DDI   0x80
 /*
-DLC of PIAFS :
-Byte | 8 7 6 5 4 3 2 1
------+--------------------------------------------------------
-   0 | 0 0 1 0 0 0 0 0  Data Link Configuration
-   1 | X X X X X X X X  Length of IE (at least 15 Bytes)
-   2 | 0 0 0 0 0 0 0 0  max. information field, LOW  byte (not used, fix 73 Bytes)
-   3 | 0 0 0 0 0 0 0 0  max. information field, HIGH byte (not used, fix 73 Bytes)
-   4 | 0 0 0 0 0 0 0 0  address A (not used)
-   5 | 0 0 0 0 0 0 0 0  address B (not used)
-   6 | 0 0 0 0 0 0 0 0  Mode (not used, fix 128)
-   7 | 0 0 0 0 0 0 0 0  Window Size (not used, fix 127)
-   8 | X X X X X X X X  XID Length, Low Byte (at least 7 Bytes)
-   9 | X X X X X X X X  XID Length, High Byte
+  DLC of PIAFS :
+  Byte | 8 7 6 5 4 3 2 1
+  -----+--------------------------------------------------------
+  0 | 0 0 1 0 0 0 0 0  Data Link Configuration
+  1 | X X X X X X X X  Length of IE (at least 15 Bytes)
+  2 | 0 0 0 0 0 0 0 0  max. information field, LOW  byte (not used, fix 73 Bytes)
+  3 | 0 0 0 0 0 0 0 0  max. information field, HIGH byte (not used, fix 73 Bytes)
+  4 | 0 0 0 0 0 0 0 0  address A (not used)
+  5 | 0 0 0 0 0 0 0 0  address B (not used)
+  6 | 0 0 0 0 0 0 0 0  Mode (not used, fix 128)
+  7 | 0 0 0 0 0 0 0 0  Window Size (not used, fix 127)
+  8 | X X X X X X X X  XID Length, Low Byte (at least 7 Bytes)
+  9 | X X X X X X X X  XID Length, High Byte
   10 | 0 0 0 0 0 C V S  PIAFS Protocol Speed configuration -> Note(1)
-     |                  S = 0 -> Protocol Speed is 32K
-     |                  S = 1 -> Protocol Speed is 64K
-     |                  V = 0 -> Protocol Speed is fixed
-     |                  V = 1 -> Protocol Speed is variable
-     |                  C = 0 -> speed setting according to standard
-     |                  C = 1 -> speed setting for chinese implementation
+  |                  S = 0 -> Protocol Speed is 32K
+  |                  S = 1 -> Protocol Speed is 64K
+  |                  V = 0 -> Protocol Speed is fixed
+  |                  V = 1 -> Protocol Speed is variable
+  |                  C = 0 -> speed setting according to standard
+  |                  C = 1 -> speed setting for chinese implementation
   11 | 0 0 0 0 0 0 R T  P0 - V42bis Compression enable/disable, Low Byte
-     |                  T = 0 -> Transmit Direction enable
-     |                  T = 1 -> Transmit Direction disable
-     |                  R = 0 -> Receive  Direction enable
-     |                  R = 1 -> Receive  Direction disable
+  |                  T = 0 -> Transmit Direction enable
+  |                  T = 1 -> Transmit Direction disable
+  |                  R = 0 -> Receive  Direction enable
+  |                  R = 1 -> Receive  Direction disable
   13 | 0 0 0 0 0 0 0 0  P0 - V42bis Compression enable/disable, High Byte
   14 | X X X X X X X X  P1 - V42bis Dictionary Size, Low Byte
   15 | X X X X X X X X  P1 - V42bis Dictionary Size, High Byte
@@ -472,61 +472,61 @@ Byte | 8 7 6 5 4 3 2 1
   18 | X X X X X X X X  PIAFS extension length
   19 | 1 0 0 0 0 0 0 0  PIAFS extension Id (0x80) - UDATA abilities
   20 | U 0 0 0 0 0 0 D  UDATA abilities -> Note (2)
-     |                  up to now the following Bits are defined:
-     |                  D - signal DCD ON
-     |                  U - use extensive UDATA control communication
-     |                      for DDI test application
-+ Note (1): ----------+------+-----------------------------------------+
-| PIAFS Protocol      | Bit  |                                         |
-| Speed configuration |    S | Bit 1 - Protocol Speed                  |
-|                     |      |         0 - 32K                         |
-|                     |      |         1 - 64K (default)               |
-|                     |    V | Bit 2 - Variable Protocol Speed         |
-|                     |      |         0 - Speed is fix                |
-|                     |      |         1 - Speed is variable (default) |
-|                     |      |             OVERWRITES 32k Bit 1        |
-|                     |    C | Bit 3   0 - Speed Settings according to |
-|                     |      |             PIAFS specification         |
-|                     |      |         1 - Speed setting for chinese   |
-|                     |      |             PIAFS implementation        |
-|                     |      | Explanation for chinese speed settings: |
-|                     |      |         if Bit 3 is set the following   |
-|                     |      |         rules apply:                    |
-|                     |      |         Bit1=0 Bit2=0: 32k fix          |
-|                     |      |         Bit1=1 Bit2=0: 64k fix          |
-|                     |      |         Bit1=0 Bit2=1: PIAFS is trying  |
-|                     |      |             to negotiate 32k is that is |
-|                     |      |             not possible it tries to    |
-|                     |      |             negotiate 64k               |
-|                     |      |         Bit1=1 Bit2=1: PIAFS is trying  |
-|                     |      |             to negotiate 64k is that is |
-|                     |      |             not possible it tries to    |
-|                     |      |             negotiate 32k               |
-+ Note (2): ----------+------+-----------------------------------------+
-| PIAFS               | Bit  | this byte defines the usage of UDATA    |
-| Implementation      |      | control communication                   |
-| UDATA usage         |    D | Bit 1 - DCD-ON signalling               |
-|                     |      |         0 - no DCD-ON is signalled      |
-|                     |      |             (default)                   |
-|                     |      |         1 - DCD-ON will be signalled    |
-|                     |    U | Bit 8 - DDI test application UDATA      |
-|                     |      |         control communication           |
-|                     |      |         0 - no UDATA control            |
-|                     |      |             communication (default)     |
-|                     |      |             sets as well the DCD-ON     |
-|                     |      |             signalling                  |
-|                     |      |         1 - UDATA control communication |
-|                     |      |             ATTENTION: Do not use these |
-|                     |      |                        setting if you   |
-|                     |      |                        are not really   |
-|                     |      |                        that you need it |
-|                     |      |                        and you know     |
-|                     |      |                        exactly what you |
-|                     |      |                        are doing.       |
-|                     |      |                        You can easily   |
-|                     |      |                        disable any      |
-|                     |      |                        data transfer.   |
-+---------------------+------+-----------------------------------------+
+  |                  up to now the following Bits are defined:
+  |                  D - signal DCD ON
+  |                  U - use extensive UDATA control communication
+  |                      for DDI test application
+  + Note (1): ----------+------+-----------------------------------------+
+  | PIAFS Protocol      | Bit  |                                         |
+  | Speed configuration |    S | Bit 1 - Protocol Speed                  |
+  |                     |      |         0 - 32K                         |
+  |                     |      |         1 - 64K (default)               |
+  |                     |    V | Bit 2 - Variable Protocol Speed         |
+  |                     |      |         0 - Speed is fix                |
+  |                     |      |         1 - Speed is variable (default) |
+  |                     |      |             OVERWRITES 32k Bit 1        |
+  |                     |    C | Bit 3   0 - Speed Settings according to |
+  |                     |      |             PIAFS specification         |
+  |                     |      |         1 - Speed setting for chinese   |
+  |                     |      |             PIAFS implementation        |
+  |                     |      | Explanation for chinese speed settings: |
+  |                     |      |         if Bit 3 is set the following   |
+  |                     |      |         rules apply:                    |
+  |                     |      |         Bit1=0 Bit2=0: 32k fix          |
+  |                     |      |         Bit1=1 Bit2=0: 64k fix          |
+  |                     |      |         Bit1=0 Bit2=1: PIAFS is trying  |
+  |                     |      |             to negotiate 32k is that is |
+  |                     |      |             not possible it tries to    |
+  |                     |      |             negotiate 64k               |
+  |                     |      |         Bit1=1 Bit2=1: PIAFS is trying  |
+  |                     |      |             to negotiate 64k is that is |
+  |                     |      |             not possible it tries to    |
+  |                     |      |             negotiate 32k               |
+  + Note (2): ----------+------+-----------------------------------------+
+  | PIAFS               | Bit  | this byte defines the usage of UDATA    |
+  | Implementation      |      | control communication                   |
+  | UDATA usage         |    D | Bit 1 - DCD-ON signalling               |
+  |                     |      |         0 - no DCD-ON is signalled      |
+  |                     |      |             (default)                   |
+  |                     |      |         1 - DCD-ON will be signalled    |
+  |                     |    U | Bit 8 - DDI test application UDATA      |
+  |                     |      |         control communication           |
+  |                     |      |         0 - no UDATA control            |
+  |                     |      |             communication (default)     |
+  |                     |      |             sets as well the DCD-ON     |
+  |                     |      |             signalling                  |
+  |                     |      |         1 - UDATA control communication |
+  |                     |      |             ATTENTION: Do not use these |
+  |                     |      |                        setting if you   |
+  |                     |      |                        are not really   |
+  |                     |      |                        that you need it |
+  |                     |      |                        and you know     |
+  |                     |      |                        exactly what you |
+  |                     |      |                        are doing.       |
+  |                     |      |                        You can easily   |
+  |                     |      |                        disable any      |
+  |                     |      |                        data transfer.   |
+  +---------------------+------+-----------------------------------------+
 */
 /* ------------------------------------------------------
    LISTENER DLC DEFINITIONS
@@ -712,11 +712,11 @@ Byte | 8 7 6 5 4 3 2 1
 /*#define RESERVED85                0x85*/
 #define ADVICE_OF_CHARGE          0x86
 /*1111 0001
-to
-1111 1111
-F1H - Reserved for network operator use
-to
-FFH*/
+  to
+  1111 1111
+  F1H - Reserved for network operator use
+  to
+  FFH*/
 /* Parameter Types */
 #define DATE_AND_TIME                                           1
 #define CLI_PARAMETER_TYPE                                      2
index a616fc9..d1d0086 100644 (file)
@@ -1,26 +1,26 @@
 
 /*
  *
-  Copyright (c) Eicon Networks, 2002.
+ Copyright (c) Eicon Networks, 2002.
  *
-  This source file is supplied for the use with
-  Eicon Networks range of DIVA Server Adapters.
+ This source file is supplied for the use with
+ Eicon Networks range of DIVA Server Adapters.
  *
-  Eicon File Revision :    2.1
+ Eicon File Revision :    2.1
  *
-  This program is free software; you can redistribute it and/or modify
-  it under the terms of the GNU General Public License as published by
-  the Free Software Foundation; either version 2, or (at your option)
-  any later version.
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
  *
-  This program is distributed in the hope that it will be useful,
-  but WITHOUT ANY WARRANTY OF ANY KIND WHATSOEVER INCLUDING ANY
-  implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-  See the GNU General Public License for more details.
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY OF ANY KIND WHATSOEVER INCLUDING ANY
+ implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ See the GNU General Public License for more details.
  *
-  You should have received a copy of the GNU General Public License
-  along with this program; if not, write to the Free Software
-  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  *
  */
 #ifndef PC_INIT_H_
   0x0060          length (8)
   0x0061          RBS Answer Delay
   0x0062          RBS Config Bit 3, 4:
-                             0  0 -> Wink Start
-                             1  0 -> Loop Start
-                             0  1 -> Ground Start
-                             1  1 -> reserved
-                             Bit 5, 6:
-                             0  0 -> Pulse Dial -> Rotary
-                             1  0 -> DTMF
-                             0  1 -> MF
-                             1  1 -> reserved
+  0  0 -> Wink Start
+  1  0 -> Loop Start
+  0  1 -> Ground Start
+  1  1 -> reserved
+  Bit 5, 6:
+  0  0 -> Pulse Dial -> Rotary
+  1  0 -> DTMF
+  0  1 -> MF
+  1  1 -> reserved
   0x0063          RBS RX Digit Timeout
   0x0064          RBS Bearer Capability
   0x0065-0x0069   RBS Debug Mask
index 352ab8d..496f018 100644 (file)
@@ -1,31 +1,31 @@
 
 /*
  *
-  Copyright (c) Eicon Networks, 2002.
+ Copyright (c) Eicon Networks, 2002.
  *
-  This source file is supplied for the use with
-  Eicon Networks range of DIVA Server Adapters.
+ This source file is supplied for the use with
+ Eicon Networks range of DIVA Server Adapters.
  *
-  Eicon File Revision :    2.1
+ Eicon File Revision :    2.1
  *
-  This program is free software; you can redistribute it and/or modify
-  it under the terms of the GNU General Public License as published by
-  the Free Software Foundation; either version 2, or (at your option)
-  any later version.
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
  *
-  This program is distributed in the hope that it will be useful,
-  but WITHOUT ANY WARRANTY OF ANY KIND WHATSOEVER INCLUDING ANY
-  implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-  See the GNU General Public License for more details.
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY OF ANY KIND WHATSOEVER INCLUDING ANY
+ implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ See the GNU General Public License for more details.
  *
-  You should have received a copy of the GNU General Public License
-  along with this program; if not, write to the Free Software
-  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  *
  */
 #ifdef PLATFORM_GT_32BIT
 /* #define POINTER_32BIT byte * __ptr32 */
-#define POINTER_32BIT dword 
+#define POINTER_32BIT dword
 #else
 #define POINTER_32BIT byte *
 #endif
 #define NO_EVENT 1
 struct DSigStruc
 {
-  byte Id;
-  byte u;
-  byte listen;
-  byte active;
-  byte sin[3];
-  byte bc[6];
-  byte llc[6];
-  byte hlc[6];
-  byte oad[20];
+       byte Id;
+       byte u;
+       byte listen;
+       byte active;
+       byte sin[3];
+       byte bc[6];
+       byte llc[6];
+       byte hlc[6];
+       byte oad[20];
 };
 struct BL1Struc {
-  dword cx_b1;
-  dword cx_b2;
-  dword cr_b1;
-  dword cr_b2;
-  dword px_b1;
-  dword px_b2;
-  dword pr_b1;
-  dword pr_b2;
-  word er_b1;
-  word er_b2;
+       dword cx_b1;
+       dword cx_b2;
+       dword cr_b1;
+       dword cr_b2;
+       dword px_b1;
+       dword px_b2;
+       dword pr_b1;
+       dword pr_b2;
+       word er_b1;
+       word er_b2;
 };
 struct L2Struc {
-  dword XTotal;
-  dword RTotal;
-  word XError;
-  word RError;
+       dword XTotal;
+       dword RTotal;
+       word XError;
+       word RError;
 };
 struct OSStruc {
-  dword free_n;
+       dword free_n;
 };
 typedef union
 {
-  struct DSigStruc DSigStats;
-  struct BL1Struc BL1Stats;
-  struct L2Struc L2Stats;
-  struct OSStruc OSStats;
-  byte   b[BUFFER_SZ];
-  word   w[BUFFER_SZ>>1];
-  word   l[BUFFER_SZ>>2]; /* word is wrong, do not use! Use 'd' instead. */
-  dword  d[BUFFER_SZ>>2];
+       struct DSigStruc DSigStats;
+       struct BL1Struc BL1Stats;
+       struct L2Struc L2Stats;
+       struct OSStruc OSStats;
+       byte   b[BUFFER_SZ];
+       word   w[BUFFER_SZ >> 1];
+       word   l[BUFFER_SZ >> 2]; /* word is wrong, do not use! Use 'd' instead. */
+       dword  d[BUFFER_SZ >> 2];
 } BUFFER;
 typedef union
 {
-  struct DSigStruc DSigStats;
-  struct BL1Struc BL1Stats;
-  struct L2Struc L2Stats;
-  struct OSStruc OSStats;
-  byte   b[MIPS_BUFFER_SZ];
-  word   w[MIPS_BUFFER_SZ>>1];
-  word   l[BUFFER_SZ>>2]; /* word is wrong, do not use! Use 'd' instead. */
-  dword  d[MIPS_BUFFER_SZ>>2];
+       struct DSigStruc DSigStats;
+       struct BL1Struc BL1Stats;
+       struct L2Struc L2Stats;
+       struct OSStruc OSStats;
+       byte   b[MIPS_BUFFER_SZ];
+       word   w[MIPS_BUFFER_SZ >> 1];
+       word   l[BUFFER_SZ >> 2]; /* word is wrong, do not use! Use 'd' instead. */
+       dword  d[MIPS_BUFFER_SZ >> 2];
 } MIPS_BUFFER;
 #if !defined(MIPS_SCOM)
 struct pc_maint
 {
-  byte req;
-  byte rc;
-  POINTER_32BIT mem;
-  short length;
-  word port;
-  byte fill[6];
-  BUFFER data;
+       byte req;
+       byte rc;
+       POINTER_32BIT mem;
+       short length;
+       word port;
+       byte fill[6];
+       BUFFER data;
 };
 #else
 struct pc_maint
 {
-  byte req;
-  byte rc;
-  byte reserved[2];     /* R3000 alignment ... */
-  POINTER_32BIT mem;
-  short length;
-  word port;
-  byte fill[4];         /* data at offset 16   */
-  BUFFER data;
+       byte req;
+       byte rc;
+       byte reserved[2];     /* R3000 alignment ... */
+       POINTER_32BIT mem;
+       short length;
+       word port;
+       byte fill[4];         /* data at offset 16   */
+       BUFFER data;
 };
 #endif
 struct mi_pc_maint
 {
-  byte req;
-  byte rc;
-  byte reserved[2];     /* R3000 alignment ... */
-  POINTER_32BIT mem;
-  short length;
-  word port;
-  byte fill[4];         /* data at offset 16   */
-  MIPS_BUFFER data;
+       byte req;
+       byte rc;
+       byte reserved[2];     /* R3000 alignment ... */
+       POINTER_32BIT mem;
+       short length;
+       word port;
+       byte fill[4];         /* data at offset 16   */
+       MIPS_BUFFER data;
 };
index 722f85f..cf3fb14 100644 (file)
@@ -1,26 +1,26 @@
 
 /*
  *
-  Copyright (c) Eicon Networks, 2002.
+ Copyright (c) Eicon Networks, 2002.
  *
-  This source file is supplied for the use with
-  Eicon Networks range of DIVA Server Adapters.
+ This source file is supplied for the use with
+ Eicon Networks range of DIVA Server Adapters.
  *
-  Eicon File Revision :    2.1
+ Eicon File Revision :    2.1
  *
-  This program is free software; you can redistribute it and/or modify
-  it under the terms of the GNU General Public License as published by
-  the Free Software Foundation; either version 2, or (at your option)
-  any later version.
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
  *
-  This program is distributed in the hope that it will be useful,
-  but WITHOUT ANY WARRANTY OF ANY KIND WHATSOEVER INCLUDING ANY
-  implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-  See the GNU General Public License for more details.
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY OF ANY KIND WHATSOEVER INCLUDING ANY
+ implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ See the GNU General Public License for more details.
  *
-  You should have received a copy of the GNU General Public License
-  along with this program; if not, write to the Free Software
-  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  *
  */
 #ifndef __DIVA_XDI_OS_DEPENDENT_PACK_MAIN_ON_BYTE_INC__
 
 
 /*
-       Only one purpose of this compiler dependent file to pack
-       structures, described in pc_maint.h so that no padding
-       will be included.
+  Only one purpose of this compiler dependent file to pack
+  structures, described in pc_maint.h so that no padding
+  will be included.
 
-       With microsoft compile it is done by "pshpack1.h" and
-       after is restored by "poppack.h"
-       */
+  With microsoft compile it is done by "pshpack1.h" and
+  after is restored by "poppack.h"
+*/
 
 
 #include "pc_maint.h"
 
 
 #endif
-
index 15d4942..7331c3b 100644 (file)
@@ -1,10 +1,10 @@
 /* $Id: platform.h,v 1.37.4.6 2005/01/31 12:22:20 armin Exp $
  *
  * platform.h
- * 
+ *
  *
  * Copyright 2000-2003  by Armin Schindler (mac@melware.de)
- * Copyright 2000  Eicon Networks 
+ * Copyright 2000  Eicon Networks
  *
  * This software may be used and distributed according to the terms
  * of the GNU General Public License, incorporated herein by reference.
 #define DIVA_OS_MEM_ATTACH_CONFIG(a)   ((a)->Config)
 #define DIVA_OS_MEM_ATTACH_CONTROL(a)  ((a)->Control)
 
-#define DIVA_OS_MEM_DETACH_RAM(a, x)   do { } while(0)
-#define DIVA_OS_MEM_DETACH_PORT(a, x)  do { } while(0)
-#define DIVA_OS_MEM_DETACH_PROM(a, x)  do { } while(0)
-#define DIVA_OS_MEM_DETACH_CTLREG(a, x)        do { } while(0)
-#define DIVA_OS_MEM_DETACH_RESET(a, x) do { } while(0)
-#define DIVA_OS_MEM_DETACH_CFG(a, x)   do { } while(0)
-#define DIVA_OS_MEM_DETACH_ADDRESS(a, x)       do { } while(0)
-#define DIVA_OS_MEM_DETACH_CONFIG(a, x)        do { } while(0)
-#define DIVA_OS_MEM_DETACH_CONTROL(a, x)       do { } while(0)
+#define DIVA_OS_MEM_DETACH_RAM(a, x)   do { } while (0)
+#define DIVA_OS_MEM_DETACH_PORT(a, x)  do { } while (0)
+#define DIVA_OS_MEM_DETACH_PROM(a, x)  do { } while (0)
+#define DIVA_OS_MEM_DETACH_CTLREG(a, x)        do { } while (0)
+#define DIVA_OS_MEM_DETACH_RESET(a, x) do { } while (0)
+#define DIVA_OS_MEM_DETACH_CFG(a, x)   do { } while (0)
+#define DIVA_OS_MEM_DETACH_ADDRESS(a, x)       do { } while (0)
+#define DIVA_OS_MEM_DETACH_CONFIG(a, x)        do { } while (0)
+#define DIVA_OS_MEM_DETACH_CONTROL(a, x)       do { } while (0)
 
 #define DIVA_INVALID_FILE_HANDLE  ((dword)(-1))
 
-#define DIVAS_CONTAINING_RECORD(address, type, field) \
-        ((type *)((char*)(address) - (char*)(&((type *)0)->field)))
+#define DIVAS_CONTAINING_RECORD(address, type, field)                  \
+       ((type *)((char *)(address) - (char *)(&((type *)0)->field)))
 
-extern int sprintf(char *, const char*, ...);
+extern int sprintf(char *, const char *, ...);
 
-typedef void* LIST_ENTRY;
+typedef void *LIST_ENTRY;
 
-typedef char    DEVICE_NAME[64];
-typedef struct _ISDN_ADAPTER   ISDN_ADAPTER;
-typedef struct _ISDN_ADAPTER* PISDN_ADAPTER;
+typedef char DEVICE_NAME[64];
+typedef struct _ISDN_ADAPTER ISDN_ADAPTER;
+typedef struct _ISDN_ADAPTER *PISDN_ADAPTER;
 
-typedef void (* DIVA_DI_PRINTF) (unsigned char *, ...);
+typedef void (*DIVA_DI_PRINTF)(unsigned char *, ...);
 #include "debuglib.h"
 
 #define dtrc(p) DBG_PRV0(p)
-#define dbug(a,p) DBG_PRV1(p)
+#define dbug(a, p) DBG_PRV1(p)
 
 
-typedef struct e_info_s E_INFO ;
+typedef struct e_info_s E_INFO;
 
 typedef char diva_os_dependent_devica_name_t[64];
-typedef void* PDEVICE_OBJECT;
+typedef void *PDEVICE_OBJECT;
 
 struct _diva_os_soft_isr;
 struct _diva_os_timer;
@@ -156,13 +156,13 @@ void diva_log_info(unsigned char *, ...);
 /*
 **  XDI DIDD Interface
 */
-void diva_xdi_didd_register_adapter (int card);
-void diva_xdi_didd_remove_adapter (int card);
+void diva_xdi_didd_register_adapter(int card);
+void diva_xdi_didd_remove_adapter(int card);
 
 /*
 ** memory allocation
 */
-static __inline__ void* diva_os_malloc (unsigned long flags, unsigned long size)
+static __inline__ void *diva_os_malloc(unsigned long flags, unsigned long size)
 {
        void *ret = NULL;
 
@@ -171,7 +171,7 @@ static __inline__ void* diva_os_malloc (unsigned long flags, unsigned long size)
        }
        return (ret);
 }
-static __inline__ void  diva_os_free   (unsigned long flags, void* ptr)
+static __inline__ void diva_os_free(unsigned long flags, void *ptr)
 {
        vfree(ptr);
 }
@@ -200,34 +200,34 @@ static __inline__ void diva_os_wait(dword mSec)
 /*
 **  PCI Configuration space access
 */
-void PCIwrite (byte bus, byte func, int offset, void* data, int length, void* pci_dev_handle);
-void PCIread (byte bus, byte func, int offset, void* data, int length, void* pci_dev_handle);
+void PCIwrite(byte bus, byte func, int offset, void *data, int length, void *pci_dev_handle);
+void PCIread(byte bus, byte func, int offset, void *data, int length, void *pci_dev_handle);
 
 /*
 **  I/O Port utilities
 */
-int diva_os_register_io_port (void *adapter, int register, unsigned long port,
-                               unsigned long length, const char* name, int id);
+int diva_os_register_io_port(void *adapter, int register, unsigned long port,
+                            unsigned long length, const char *name, int id);
 /*
 **  I/O port access abstraction
 */
-byte inpp (void __iomem *);
-word inppw (void __iomem *);
-void inppw_buffer (void __iomem *, void*, int);
-void outppw (void __iomem *, word);
-void outppw_buffer (void __iomem * , void*, int);
-void outpp (void __iomem *, word);
+byte inpp(void __iomem *);
+word inppw(void __iomem *);
+void inppw_buffer(void __iomem *, void *, int);
+void outppw(void __iomem *, word);
+void outppw_buffer(void __iomem * , void*, int);
+void outpp(void __iomem *, word);
 
 /*
-**  IRQ 
+**  IRQ
 */
 typedef struct _diva_os_adapter_irq_info {
-        byte irq_nr;
-        int  registered;
-        char irq_name[24];
+       byte irq_nr;
+       int  registered;
+       char irq_name[24];
 } diva_os_adapter_irq_info_t;
-int diva_os_register_irq (void* context, byte irq, const char* name);
-void diva_os_remove_irq (void* context, byte irq);
+int diva_os_register_irq(void *context, byte irq, const char *name);
+void diva_os_remove_irq(void *context, byte irq);
 
 #define diva_os_in_irq() in_irq()
 
@@ -236,58 +236,58 @@ void diva_os_remove_irq (void* context, byte irq);
 */
 typedef long diva_os_spin_lock_magic_t;
 typedef spinlock_t diva_os_spin_lock_t;
-static __inline__ int diva_os_initialize_spin_lock (spinlock_t *lock, void * unused) { \
-  spin_lock_init (lock); return(0); }
-static __inline__ void diva_os_enter_spin_lock (diva_os_spin_lock_t* a, \
-                              diva_os_spin_lock_magic_t* old_irql, \
-                              void* dbg) { spin_lock_bh(a); }
-static __inline__ void diva_os_leave_spin_lock (diva_os_spin_lock_t* a, \
-                              diva_os_spin_lock_magic_t* old_irql, \
-                              void* dbg) { spin_unlock_bh(a); }
+static __inline__ int diva_os_initialize_spin_lock(spinlock_t *lock, void *unused) { \
+       spin_lock_init(lock); return (0); }
+static __inline__ void diva_os_enter_spin_lock(diva_os_spin_lock_t *a, \
+                                              diva_os_spin_lock_magic_t *old_irql, \
+                                              void *dbg) { spin_lock_bh(a); }
+static __inline__ void diva_os_leave_spin_lock(diva_os_spin_lock_t *a, \
+                                              diva_os_spin_lock_magic_t *old_irql, \
+                                              void *dbg) { spin_unlock_bh(a); }
 
-#define diva_os_destroy_spin_lock(a,b) do { } while(0)
+#define diva_os_destroy_spin_lock(a, b) do { } while (0)
 
 /*
 **  Deffered processing framework
 */
-typedef int (*diva_os_isr_callback_t)(struct _ISDN_ADAPTER*);
-typedef void (*diva_os_soft_isr_callback_t)(struct _diva_os_soft_isr* psoft_isr, void* context);
+typedef int (*diva_os_isr_callback_t)(struct _ISDN_ADAPTER *);
+typedef void (*diva_os_soft_isr_callback_t)(struct _diva_os_soft_isr *psoft_isr, void *context);
 
 typedef struct _diva_os_soft_isr {
-  void* object;
-  diva_os_soft_isr_callback_t callback;
-  void* callback_context;
-  char dpc_thread_name[24];
+       void *object;
+       diva_os_soft_isr_callback_t callback;
+       void *callback_context;
+       char dpc_thread_name[24];
 } diva_os_soft_isr_t;
 
-int diva_os_initialize_soft_isr (diva_os_soft_isr_t* psoft_isr, diva_os_soft_isr_callback_t callback, void*   callback_context);
-int diva_os_schedule_soft_isr (diva_os_soft_isr_t* psoft_isr);
-int diva_os_cancel_soft_isr (diva_os_soft_isr_t* psoft_isr);
-void diva_os_remove_soft_isr (diva_os_soft_isr_t* psoft_isr);
+int diva_os_initialize_soft_isr(diva_os_soft_isr_t *psoft_isr, diva_os_soft_isr_callback_t callback, void *callback_context);
+int diva_os_schedule_soft_isr(diva_os_soft_isr_t *psoft_isr);
+int diva_os_cancel_soft_isr(diva_os_soft_isr_t *psoft_isr);
+void diva_os_remove_soft_isr(diva_os_soft_isr_t *psoft_isr);
 
 /*
   Get time service
-  */
-void diva_os_get_time (dword* sec, dword* usec);
+*/
+void diva_os_get_time(dword *sec, dword *usec);
 
 /*
 **  atomic operation, fake because we use threads
 */
 typedef int diva_os_atomic_t;
 static diva_os_atomic_t __inline__
-diva_os_atomic_increment(diva_os_atomic_t* pv)
+diva_os_atomic_increment(diva_os_atomic_t *pv)
 {
-  *pv += 1;
-  return (*pv);
+       *pv += 1;
+       return (*pv);
 }
 static diva_os_atomic_t __inline__
-diva_os_atomic_decrement(diva_os_atomic_t* pv)
+diva_os_atomic_decrement(diva_os_atomic_t *pv)
 {
-  *pv -= 1;
-  return (*pv);
+       *pv -= 1;
+       return (*pv);
 }
 
-/* 
+/*
 **  CAPI SECTION
 */
 #define NO_CORNETN
@@ -319,9 +319,9 @@ diva_os_atomic_decrement(diva_os_atomic_t* pv)
 #define READ_WORD(addr)   readw(addr)
 #define READ_DWORD(addr)  readl(addr)
 
-#define WRITE_BYTE(addr,v)  writeb(v,addr)
-#define WRITE_WORD(addr,v)  writew(v,addr)
-#define WRITE_DWORD(addr,v) writel(v,addr)
+#define WRITE_BYTE(addr, v)  writeb(v, addr)
+#define WRITE_WORD(addr, v)  writew(v, addr)
+#define WRITE_DWORD(addr, v) writel(v, addr)
 
 static inline __u16 GET_WORD(void *addr)
 {
@@ -344,10 +344,10 @@ static inline void PUT_DWORD(void *addr, __u32 v)
 ** 32/64 bit macors
 */
 #ifdef BITS_PER_LONG
- #if BITS_PER_LONG > 32 
-  #define PLATFORM_GT_32BIT
-  #define ULongToPtr(x) (void *)(unsigned long)(x)
- #endif
+#if BITS_PER_LONG > 32
+#define PLATFORM_GT_32BIT
+#define ULongToPtr(x) (void *)(unsigned long)(x)
+#endif
 #endif
 
 /*
@@ -362,7 +362,7 @@ static inline void PUT_DWORD(void *addr, __u32 v)
 */
 #define diva_os_dump_file_t char
 #define diva_os_board_trace_t char
-#define diva_os_dump_file(__x__) do { } while(0)
+#define diva_os_dump_file(__x__) do { } while (0)
 
 /*
 ** size of internal arrays
index bf49a5a..a08d6d5 100644 (file)
@@ -1,76 +1,76 @@
 
 /*
  *
-  Copyright (c) Eicon Networks, 2002.
+ Copyright (c) Eicon Networks, 2002.
  *
-  This source file is supplied for the use with
-  Eicon Networks range of DIVA Server Adapters.
+ This source file is supplied for the use with
+ Eicon Networks range of DIVA Server Adapters.
  *
-  Eicon File Revision :    2.1
+ Eicon File Revision :    2.1
  *
-  This program is free software; you can redistribute it and/or modify
-  it under the terms of the GNU General Public License as published by
-  the Free Software Foundation; either version 2, or (at your option)
-  any later version.
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
  *
-  This program is distributed in the hope that it will be useful,
-  but WITHOUT ANY WARRANTY OF ANY KIND WHATSOEVER INCLUDING ANY
-  implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-  See the GNU General Public License for more details.
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY OF ANY KIND WHATSOEVER INCLUDING ANY
+ implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ See the GNU General Public License for more details.
  *
-  You should have received a copy of the GNU General Public License
-  along with this program; if not, write to the Free Software
-  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  *
  */
 struct pr_ram {
-  word NextReq;         /* pointer to next Req Buffer               */
-  word NextRc;          /* pointer to next Rc Buffer                */
-  word NextInd;         /* pointer to next Ind Buffer               */
-  byte ReqInput;        /* number of Req Buffers sent               */
-  byte ReqOutput;       /* number of Req Buffers returned           */
-  byte ReqReserved;     /* number of Req Buffers reserved           */
-  byte Int;             /* ISDN-P interrupt                         */
-  byte XLock;           /* Lock field for arbitration               */
-  byte RcOutput;        /* number of Rc buffers received            */
-  byte IndOutput;       /* number of Ind buffers received           */
-  byte IMask;           /* Interrupt Mask Flag                      */
-  byte Reserved1[2];    /* reserved field, do not use               */
-  byte ReadyInt;        /* request field for ready interrupt        */
-  byte Reserved2[12];   /* reserved field, do not use               */
-  byte InterfaceType;   /* interface type 1=16K interface           */
-  word Signature;       /* ISDN-P initialized indication            */
-  byte B[1];            /* buffer space for Req,Ind and Rc          */
+       word NextReq;         /* pointer to next Req Buffer               */
+       word NextRc;          /* pointer to next Rc Buffer                */
+       word NextInd;         /* pointer to next Ind Buffer               */
+       byte ReqInput;        /* number of Req Buffers sent               */
+       byte ReqOutput;       /* number of Req Buffers returned           */
+       byte ReqReserved;     /* number of Req Buffers reserved           */
+       byte Int;             /* ISDN-P interrupt                         */
+       byte XLock;           /* Lock field for arbitration               */
+       byte RcOutput;        /* number of Rc buffers received            */
+       byte IndOutput;       /* number of Ind buffers received           */
+       byte IMask;           /* Interrupt Mask Flag                      */
+       byte Reserved1[2];    /* reserved field, do not use               */
+       byte ReadyInt;        /* request field for ready interrupt        */
+       byte Reserved2[12];   /* reserved field, do not use               */
+       byte InterfaceType;   /* interface type 1=16K interface           */
+       word Signature;       /* ISDN-P initialized indication            */
+       byte B[1];            /* buffer space for Req,Ind and Rc          */
 };
 typedef struct {
-  word next;
-  byte Req;
-  byte ReqId;
-  byte ReqCh;
-  byte Reserved1;
-  word Reference;
-  byte Reserved[8];
-  PBUFFER XBuffer;
+       word next;
+       byte Req;
+       byte ReqId;
+       byte ReqCh;
+       byte Reserved1;
+       word Reference;
+       byte Reserved[8];
+       PBUFFER XBuffer;
 } REQ;
 typedef struct {
-  word next;
-  byte Rc;
-  byte RcId;
-  byte RcCh;
-  byte Reserved1;
-  word Reference;
-  byte Reserved2[8];
+       word next;
+       byte Rc;
+       byte RcId;
+       byte RcCh;
+       byte Reserved1;
+       word Reference;
+       byte Reserved2[8];
 } RC;
 typedef struct {
-  word next;
-  byte Ind;
-  byte IndId;
-  byte IndCh;
-  byte MInd;
-  word MLength;
-  word Reference;
-  byte RNR;
-  byte Reserved;
-  dword Ack;
-  PBUFFER RBuffer;
+       word next;
+       byte Ind;
+       byte IndId;
+       byte IndCh;
+       byte MInd;
+       word MLength;
+       word Reference;
+       byte RNR;
+       byte Reserved;
+       dword Ack;
+       PBUFFER RBuffer;
 } IND;
index 25c5d7f..ec12165 100644 (file)
@@ -1,26 +1,26 @@
 
 /*
  *
-  Copyright (c) Eicon Networks, 2002.
+ Copyright (c) Eicon Networks, 2002.
  *
-  This source file is supplied for the use with
-  Eicon Networks range of DIVA Server Adapters.
+ This source file is supplied for the use with
+ Eicon Networks range of DIVA Server Adapters.
  *
-  Eicon File Revision :    2.1
+ Eicon File Revision :    2.1
  *
-  This program is free software; you can redistribute it and/or modify
-  it under the terms of the GNU General Public License as published by
-  the Free Software Foundation; either version 2, or (at your option)
-  any later version.
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
  *
-  This program is distributed in the hope that it will be useful,
-  but WITHOUT ANY WARRANTY OF ANY KIND WHATSOEVER INCLUDING ANY
-  implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-  See the GNU General Public License for more details.
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY OF ANY KIND WHATSOEVER INCLUDING ANY
+ implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ See the GNU General Public License for more details.
  *
-  You should have received a copy of the GNU General Public License
-  along with this program; if not, write to the Free Software
-  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  *
  */
 #include "platform.h"
 #define        MAX_XLOG_SIZE   (64 * 1024)
 
 /* --------------------------------------------------------------------------
-               Recovery XLOG from QBRI Card
-        -------------------------------------------------------------------------- */
-static void qBri_cpu_trapped (PISDN_ADAPTER IoAdapter) {
-       byte  __iomem *base ;
-       word *Xlog ;
-       dword   regs[4], TrapID, offset, size ;
-       Xdesc   xlogDesc ;
+   Recovery XLOG from QBRI Card
+   -------------------------------------------------------------------------- */
+static void qBri_cpu_trapped(PISDN_ADAPTER IoAdapter) {
+       byte  __iomem *base;
+       word *Xlog;
+       dword   regs[4], TrapID, offset, size;
+       Xdesc   xlogDesc;
        int factor = (IoAdapter->tasks == 1) ? 1 : 2;
 
 /*
@@ -56,211 +56,211 @@ static void qBri_cpu_trapped (PISDN_ADAPTER IoAdapter) {
  */
 
        base = DIVA_OS_MEM_ATTACH_CONTROL(IoAdapter);
-       offset = IoAdapter->ControllerNumber * (IoAdapter->MemorySize >> factor) ;
+       offset = IoAdapter->ControllerNumber * (IoAdapter->MemorySize >> factor);
 
-       TrapID = READ_DWORD(&base[0x80]) ;
+       TrapID = READ_DWORD(&base[0x80]);
 
-       if ( (TrapID == 0x99999999) || (TrapID == 0x99999901) )
+       if ((TrapID == 0x99999999) || (TrapID == 0x99999901))
        {
-               dump_trap_frame (IoAdapter, &base[0x90]) ;
-               IoAdapter->trapped = 1 ;
+               dump_trap_frame(IoAdapter, &base[0x90]);
+               IoAdapter->trapped = 1;
        }
 
        regs[0] = READ_DWORD((base + offset) + 0x70);
        regs[1] = READ_DWORD((base + offset) + 0x74);
        regs[2] = READ_DWORD((base + offset) + 0x78);
        regs[3] = READ_DWORD((base + offset) + 0x7c);
-       regs[0] &= IoAdapter->MemorySize - 1 ;
+       regs[0] &= IoAdapter->MemorySize - 1;
 
-       if ( (regs[0] >= offset)
-         && (regs[0] < offset + (IoAdapter->MemorySize >> factor) - 1) )
+       if ((regs[0] >= offset)
+           && (regs[0] < offset + (IoAdapter->MemorySize >> factor) - 1))
        {
-               if ( !(Xlog = (word *)diva_os_malloc (0, MAX_XLOG_SIZE)) ) {
+               if (!(Xlog = (word *)diva_os_malloc(0, MAX_XLOG_SIZE))) {
                        DIVA_OS_MEM_DETACH_CONTROL(IoAdapter, base);
-                       return ;
+                       return;
                }
 
-               size = offset + (IoAdapter->MemorySize >> factor) - regs[0] ;
-               if ( size > MAX_XLOG_SIZE )
-                       size = MAX_XLOG_SIZE ;
-               memcpy_fromio (Xlog, &base[regs[0]], size) ;
-               xlogDesc.buf = Xlog ;
-               xlogDesc.cnt = READ_WORD(&base[regs[1] & (IoAdapter->MemorySize - 1)]) ;
-               xlogDesc.out = READ_WORD(&base[regs[2] & (IoAdapter->MemorySize - 1)]) ;
-               dump_xlog_buffer (IoAdapter, &xlogDesc) ;
-               diva_os_free (0, Xlog) ;
-               IoAdapter->trapped = 2 ;
+               size = offset + (IoAdapter->MemorySize >> factor) - regs[0];
+               if (size > MAX_XLOG_SIZE)
+                       size = MAX_XLOG_SIZE;
+               memcpy_fromio(Xlog, &base[regs[0]], size);
+               xlogDesc.buf = Xlog;
+               xlogDesc.cnt = READ_WORD(&base[regs[1] & (IoAdapter->MemorySize - 1)]);
+               xlogDesc.out = READ_WORD(&base[regs[2] & (IoAdapter->MemorySize - 1)]);
+               dump_xlog_buffer(IoAdapter, &xlogDesc);
+               diva_os_free(0, Xlog);
+               IoAdapter->trapped = 2;
        }
        DIVA_OS_MEM_DETACH_CONTROL(IoAdapter, base);
 }
 
 /* --------------------------------------------------------------------------
-               Reset QBRI Hardware
-        -------------------------------------------------------------------------- */
-static void reset_qBri_hardware (PISDN_ADAPTER IoAdapter) {
-       word volatile __iomem *qBriReset ;
-       byte  volatile __iomem *qBriCntrl ;
-       byte  volatile __iomem *p ;
+   Reset QBRI Hardware
+   -------------------------------------------------------------------------- */
+static void reset_qBri_hardware(PISDN_ADAPTER IoAdapter) {
+       word volatile __iomem *qBriReset;
+       byte  volatile __iomem *qBriCntrl;
+       byte  volatile __iomem *p;
 
        qBriReset = (word volatile __iomem *)DIVA_OS_MEM_ATTACH_PROM(IoAdapter);
-       WRITE_WORD(qBriReset, READ_WORD(qBriReset) | PLX9054_SOFT_RESET) ;
-       diva_os_wait (1) ;
-       WRITE_WORD(qBriReset, READ_WORD(qBriReset) & ~PLX9054_SOFT_RESET) ;
-       diva_os_wait (1);
-       WRITE_WORD(qBriReset, READ_WORD(qBriReset) | PLX9054_RELOAD_EEPROM) ;
-       diva_os_wait (1) ;
-       WRITE_WORD(qBriReset, READ_WORD(qBriReset) & ~PLX9054_RELOAD_EEPROM) ;
-       diva_os_wait (1);
+       WRITE_WORD(qBriReset, READ_WORD(qBriReset) | PLX9054_SOFT_RESET);
+       diva_os_wait(1);
+       WRITE_WORD(qBriReset, READ_WORD(qBriReset) & ~PLX9054_SOFT_RESET);
+       diva_os_wait(1);
+       WRITE_WORD(qBriReset, READ_WORD(qBriReset) | PLX9054_RELOAD_EEPROM);
+       diva_os_wait(1);
+       WRITE_WORD(qBriReset, READ_WORD(qBriReset) & ~PLX9054_RELOAD_EEPROM);
+       diva_os_wait(1);
        DIVA_OS_MEM_DETACH_PROM(IoAdapter, qBriReset);
 
        qBriCntrl = DIVA_OS_MEM_ATTACH_CTLREG(IoAdapter);
        p = &qBriCntrl[DIVA_4BRI_REVISION(IoAdapter) ? (MQ2_BREG_RISC) : (MQ_BREG_RISC)];
-       WRITE_DWORD(p, 0) ;
+       WRITE_DWORD(p, 0);
        DIVA_OS_MEM_DETACH_CTLREG(IoAdapter, qBriCntrl);
 
        DBG_TRC(("resetted board @ reset addr 0x%08lx", qBriReset))
-       DBG_TRC(("resetted board @ cntrl addr 0x%08lx", p))
-}
+               DBG_TRC(("resetted board @ cntrl addr 0x%08lx", p))
+               }
 
 /* --------------------------------------------------------------------------
-               Start Card CPU
-        -------------------------------------------------------------------------- */
-void start_qBri_hardware (PISDN_ADAPTER IoAdapter) {
-       byte volatile __iomem *qBriReset ;
-       byte volatile __iomem *p ;
+   Start Card CPU
+   -------------------------------------------------------------------------- */
+void start_qBri_hardware(PISDN_ADAPTER IoAdapter) {
+       byte volatile __iomem *qBriReset;
+       byte volatile __iomem *p;
 
        p = DIVA_OS_MEM_ATTACH_CTLREG(IoAdapter);
        qBriReset = &p[(DIVA_4BRI_REVISION(IoAdapter)) ? (MQ2_BREG_RISC) : (MQ_BREG_RISC)];
-       WRITE_DWORD(qBriReset, MQ_RISC_COLD_RESET_MASK) ;
-       diva_os_wait (2) ;
-       WRITE_DWORD(qBriReset, MQ_RISC_WARM_RESET_MASK | MQ_RISC_COLD_RESET_MASK) ;
-       diva_os_wait (10) ;
+       WRITE_DWORD(qBriReset, MQ_RISC_COLD_RESET_MASK);
+       diva_os_wait(2);
+       WRITE_DWORD(qBriReset, MQ_RISC_WARM_RESET_MASK | MQ_RISC_COLD_RESET_MASK);
+       diva_os_wait(10);
        DIVA_OS_MEM_DETACH_CTLREG(IoAdapter, p);
 
        DBG_TRC(("started processor @ addr 0x%08lx", qBriReset))
-}
+               }
 
 /* --------------------------------------------------------------------------
-               Stop Card CPU
-        -------------------------------------------------------------------------- */
-static void stop_qBri_hardware (PISDN_ADAPTER IoAdapter) {
-       byte volatile __iomem *p ;
-       dword volatile __iomem *qBriReset ;
-       dword volatile __iomem *qBriIrq ;
-       dword volatile __iomem *qBriIsacDspReset ;
+   Stop Card CPU
+   -------------------------------------------------------------------------- */
+static void stop_qBri_hardware(PISDN_ADAPTER IoAdapter) {
+       byte volatile __iomem *p;
+       dword volatile __iomem *qBriReset;
+       dword volatile __iomem *qBriIrq;
+       dword volatile __iomem *qBriIsacDspReset;
        int rev2 = DIVA_4BRI_REVISION(IoAdapter);
        int reset_offset = rev2 ? (MQ2_BREG_RISC)      : (MQ_BREG_RISC);
        int irq_offset   = rev2 ? (MQ2_BREG_IRQ_TEST)  : (MQ_BREG_IRQ_TEST);
        int hw_offset    = rev2 ? (MQ2_ISAC_DSP_RESET) : (MQ_ISAC_DSP_RESET);
 
-       if ( IoAdapter->ControllerNumber > 0 )
-               return ;
+       if (IoAdapter->ControllerNumber > 0)
+               return;
        p = DIVA_OS_MEM_ATTACH_CTLREG(IoAdapter);
        qBriReset = (dword volatile __iomem *)&p[reset_offset];
        qBriIsacDspReset = (dword volatile __iomem *)&p[hw_offset];
 /*
  *     clear interrupt line (reset Local Interrupt Test Register)
  */
-       WRITE_DWORD(qBriReset, 0) ;
-       WRITE_DWORD(qBriIsacDspReset, 0) ;
+       WRITE_DWORD(qBriReset, 0);
+       WRITE_DWORD(qBriIsacDspReset, 0);
        DIVA_OS_MEM_DETACH_CTLREG(IoAdapter, p);
-       
+
        p = DIVA_OS_MEM_ATTACH_RESET(IoAdapter);
        WRITE_BYTE(&p[PLX9054_INTCSR], 0x00);   /* disable PCI interrupts */
        DIVA_OS_MEM_DETACH_RESET(IoAdapter, p);
-       
+
        p = DIVA_OS_MEM_ATTACH_CTLREG(IoAdapter);
        qBriIrq   = (dword volatile __iomem *)&p[irq_offset];
-       WRITE_DWORD(qBriIrq, MQ_IRQ_REQ_OFF) ;
+       WRITE_DWORD(qBriIrq, MQ_IRQ_REQ_OFF);
        DIVA_OS_MEM_DETACH_CTLREG(IoAdapter, p);
 
        DBG_TRC(("stopped processor @ addr 0x%08lx", qBriReset))
 
-}
+               }
 
 /* --------------------------------------------------------------------------
-               FPGA download
-        -------------------------------------------------------------------------- */
+   FPGA download
+   -------------------------------------------------------------------------- */
 #define FPGA_NAME_OFFSET         0x10
 
-static byte * qBri_check_FPGAsrc (PISDN_ADAPTER IoAdapter, char *FileName,
-                                  dword *Length, dword *code) {
-       byte *File ;
-       char  *fpgaFile, *fpgaType, *fpgaDate, *fpgaTime ;
-       dword  fpgaFlen,  fpgaTlen,  fpgaDlen, cnt, year, i ;
+static byte *qBri_check_FPGAsrc(PISDN_ADAPTER IoAdapter, char *FileName,
+                               dword *Length, dword *code) {
+       byte *File;
+       char *fpgaFile, *fpgaType, *fpgaDate, *fpgaTime;
+       dword fpgaFlen, fpgaTlen, fpgaDlen, cnt, year, i;
 
-       if (!(File = (byte *)xdiLoadFile (FileName, Length, 0))) {
-               return (NULL) ;
+       if (!(File = (byte *)xdiLoadFile(FileName, Length, 0))) {
+               return (NULL);
        }
 /*
  *      scan file until FF and put id string into buffer
  */
-       for ( i = 0 ; File[i] != 0xff ; )
+       for (i = 0; File[i] != 0xff;)
        {
-               if ( ++i >= *Length )
+               if (++i >= *Length)
                {
                        DBG_FTL(("FPGA download: start of data header not found"))
-                       xdiFreeFile (File) ;
-                       return (NULL) ;
+                               xdiFreeFile(File);
+                       return (NULL);
                }
        }
-       *code = i++ ;
+       *code = i++;
 
-       if ( (File[i] & 0xF0) != 0x20 )
+       if ((File[i] & 0xF0) != 0x20)
        {
                DBG_FTL(("FPGA download: data header corrupted"))
-               xdiFreeFile (File) ;
-               return (NULL) ;
+                       xdiFreeFile(File);
+               return (NULL);
        }
-       fpgaFlen = (dword)  File[FPGA_NAME_OFFSET - 1] ;
-       if ( fpgaFlen == 0 )
-               fpgaFlen = 12 ;
-       fpgaFile = (char *)&File[FPGA_NAME_OFFSET] ;
-       fpgaTlen = (dword)  fpgaFile[fpgaFlen + 2] ;
-       if ( fpgaTlen == 0 )
-               fpgaTlen = 10 ;
-       fpgaType = (char *)&fpgaFile[fpgaFlen + 3] ;
-       fpgaDlen = (dword)  fpgaType[fpgaTlen + 2] ;
-       if ( fpgaDlen == 0 )
-               fpgaDlen = 11 ;
-       fpgaDate = (char *)&fpgaType[fpgaTlen + 3] ;
-       fpgaTime = (char *)&fpgaDate[fpgaDlen + 3] ;
-       cnt = (dword)(((File[  i  ] & 0x0F) << 20) + (File[i + 1] << 12)
-                    + (File[i + 2]         <<  4) + (File[i + 3] >>  4)) ;
-
-       if ( (dword)(i + (cnt / 8)) > *Length )
+       fpgaFlen = (dword)File[FPGA_NAME_OFFSET - 1];
+       if (fpgaFlen == 0)
+               fpgaFlen = 12;
+       fpgaFile = (char *)&File[FPGA_NAME_OFFSET];
+       fpgaTlen = (dword)fpgaFile[fpgaFlen + 2];
+       if (fpgaTlen == 0)
+               fpgaTlen = 10;
+       fpgaType = (char *)&fpgaFile[fpgaFlen + 3];
+       fpgaDlen = (dword)  fpgaType[fpgaTlen + 2];
+       if (fpgaDlen == 0)
+               fpgaDlen = 11;
+       fpgaDate = (char *)&fpgaType[fpgaTlen + 3];
+       fpgaTime = (char *)&fpgaDate[fpgaDlen + 3];
+       cnt = (dword)(((File[i] & 0x0F) << 20) + (File[i + 1] << 12)
+                     + (File[i + 2] << 4) + (File[i + 3] >> 4));
+
+       if ((dword)(i + (cnt / 8)) > *Length)
        {
                DBG_FTL(("FPGA download: '%s' file too small (%ld < %ld)",
-                        FileName, *Length, code + ((cnt + 7) / 8) ))
-               xdiFreeFile (File) ;
-               return (NULL) ;
+                        FileName, *Length, code + ((cnt + 7) / 8)))
+                       xdiFreeFile(File);
+               return (NULL);
        }
-       i = 0 ;
+       i = 0;
        do
        {
-               while ( (fpgaDate[i] != '\0')
-                    && ((fpgaDate[i] < '0') || (fpgaDate[i] > '9')) )
+               while ((fpgaDate[i] != '\0')
+                      && ((fpgaDate[i] < '0') || (fpgaDate[i] > '9')))
                {
                        i++;
                }
-               year = 0 ;
-               while ( (fpgaDate[i] >= '0') && (fpgaDate[i] <= '9') )
-                       year = year * 10 + (fpgaDate[i++] - '0') ;
-       } while ( (year < 2000) && (fpgaDate[i] != '\0') );
+               year = 0;
+               while ((fpgaDate[i] >= '0') && (fpgaDate[i] <= '9'))
+                       year = year * 10 + (fpgaDate[i++] - '0');
+       } while ((year < 2000) && (fpgaDate[i] != '\0'));
 
        switch (IoAdapter->cardType) {
-               case CARDTYPE_DIVASRV_B_2F_PCI:
-                       break;
+       case CARDTYPE_DIVASRV_B_2F_PCI:
+               break;
 
-               default:
-           if ( year >= 2001 ) {
-                               IoAdapter->fpga_features |= PCINIT_FPGA_PLX_ACCESS_SUPPORTED ;
-                       }
+       default:
+               if (year >= 2001) {
+                       IoAdapter->fpga_features |= PCINIT_FPGA_PLX_ACCESS_SUPPORTED;
+               }
        }
 
        DBG_LOG(("FPGA[%s] file %s (%s %s) len %d",
-                fpgaType, fpgaFile, fpgaDate, fpgaTime, cnt))
-       return (File) ;
+                fpgaType, fpgaFile, fpgaDate, fpgaTime, cnt))
+               return (File);
 }
 
 /******************************************************************************/
@@ -272,114 +272,114 @@ static byte * qBri_check_FPGAsrc (PISDN_ADAPTER IoAdapter, char *FileName,
 #define FPGA_DOUT   0x0400
 #define FPGA_DIN    FPGA_DOUT   /* bidirectional I/O */
 
-int qBri_FPGA_download (PISDN_ADAPTER IoAdapter) {
-       int            bit ;
-       byte           *File ;
-       dword          code, FileLength ;
+int qBri_FPGA_download(PISDN_ADAPTER IoAdapter) {
+       int            bit;
+       byte           *File;
+       dword          code, FileLength;
        word volatile __iomem *addr = (word volatile __iomem *)DIVA_OS_MEM_ATTACH_PROM(IoAdapter);
-       word           val, baseval = FPGA_CS | FPGA_PROG ;
+       word           val, baseval = FPGA_CS | FPGA_PROG;
 
 
 
        if (DIVA_4BRI_REVISION(IoAdapter))
        {
-               char* name;
+               char *name;
 
                switch (IoAdapter->cardType) {
-                       case CARDTYPE_DIVASRV_B_2F_PCI:
-                               name = "dsbri2f.bit";
-                               break;
+               case CARDTYPE_DIVASRV_B_2F_PCI:
+                       name = "dsbri2f.bit";
+                       break;
 
-                       case CARDTYPE_DIVASRV_B_2M_V2_PCI:
-                       case CARDTYPE_DIVASRV_VOICE_B_2M_V2_PCI:
-                               name = "dsbri2m.bit";
-                               break;
+               case CARDTYPE_DIVASRV_B_2M_V2_PCI:
+               case CARDTYPE_DIVASRV_VOICE_B_2M_V2_PCI:
+                       name = "dsbri2m.bit";
+                       break;
 
-                       default:
-                               name = "ds4bri2.bit";
+               default:
+                       name = "ds4bri2.bit";
                }
 
-               File = qBri_check_FPGAsrc (IoAdapter, name,
-                                               &FileLength, &code);
+               File = qBri_check_FPGAsrc(IoAdapter, name,
+                                         &FileLength, &code);
        }
        else
        {
-               File = qBri_check_FPGAsrc (IoAdapter, "ds4bri.bit",
-                                          &FileLength, &code) ;
+               File = qBri_check_FPGAsrc(IoAdapter, "ds4bri.bit",
+                                         &FileLength, &code);
        }
-       if ( !File ) {
+       if (!File) {
                DIVA_OS_MEM_DETACH_PROM(IoAdapter, addr);
-               return (0) ;
+               return (0);
        }
 /*
  *     prepare download, pulse PROGRAM pin down.
  */
-       WRITE_WORD(addr, baseval & ~FPGA_PROG) ; /* PROGRAM low pulse */
-       WRITE_WORD(addr, baseval) ;              /* release */
-       diva_os_wait (50) ;  /* wait until FPGA finished internal memory clear */
+       WRITE_WORD(addr, baseval & ~FPGA_PROG); /* PROGRAM low pulse */
+       WRITE_WORD(addr, baseval);              /* release */
+       diva_os_wait(50);  /* wait until FPGA finished internal memory clear */
 /*
  *     check done pin, must be low
  */
-       if ( READ_WORD(addr) & FPGA_BUSY )
+       if (READ_WORD(addr) & FPGA_BUSY)
        {
                DBG_FTL(("FPGA download: acknowledge for FPGA memory clear missing"))
-               xdiFreeFile (File) ;
+                       xdiFreeFile(File);
                DIVA_OS_MEM_DETACH_PROM(IoAdapter, addr);
-               return (0) ;
+               return (0);
        }
 /*
  *     put data onto the FPGA
  */
-       while ( code < FileLength )
+       while (code < FileLength)
        {
-               val = ((word)File[code++]) << 3 ;
+               val = ((word)File[code++]) << 3;
 
-               for ( bit = 8 ; bit-- > 0 ; val <<= 1 ) /* put byte onto FPGA */
+               for (bit = 8; bit-- > 0; val <<= 1) /* put byte onto FPGA */
                {
-                       baseval &= ~FPGA_DOUT ;             /* clr  data bit */
-                       baseval |= (val & FPGA_DOUT) ;      /* copy data bit */
-                       WRITE_WORD(addr, baseval) ;
-                       WRITE_WORD(addr, baseval | FPGA_CCLK) ;     /* set CCLK hi */
-                       WRITE_WORD(addr, baseval | FPGA_CCLK) ;     /* set CCLK hi */
-                       WRITE_WORD(addr, baseval) ;                 /* set CCLK lo */
+                       baseval &= ~FPGA_DOUT;             /* clr  data bit */
+                       baseval |= (val & FPGA_DOUT);      /* copy data bit */
+                       WRITE_WORD(addr, baseval);
+                       WRITE_WORD(addr, baseval | FPGA_CCLK);     /* set CCLK hi */
+                       WRITE_WORD(addr, baseval | FPGA_CCLK);     /* set CCLK hi */
+                       WRITE_WORD(addr, baseval);                 /* set CCLK lo */
                }
        }
-       xdiFreeFile (File) ;
-       diva_os_wait (100) ;
-       val = READ_WORD(addr) ;
+       xdiFreeFile(File);
+       diva_os_wait(100);
+       val = READ_WORD(addr);
 
        DIVA_OS_MEM_DETACH_PROM(IoAdapter, addr);
 
-       if ( !(val & FPGA_BUSY) )
+       if (!(val & FPGA_BUSY))
        {
                DBG_FTL(("FPGA download: chip remains in busy state (0x%04x)", val))
-               return (0) ;
+                       return (0);
        }
 
-       return (1) ;
+       return (1);
 }
 
-static int load_qBri_hardware (PISDN_ADAPTER IoAdapter) {
+static int load_qBri_hardware(PISDN_ADAPTER IoAdapter) {
        return (0);
 }
 
 /* --------------------------------------------------------------------------
-               Card ISR
-        -------------------------------------------------------------------------- */
-static int qBri_ISR (struct _ISDN_ADAPTER* IoAdapter) {
-       dword volatile     __iomem *qBriIrq ;
+   Card ISR
+   -------------------------------------------------------------------------- */
+static int qBri_ISR(struct _ISDN_ADAPTER *IoAdapter) {
+       dword volatile     __iomem *qBriIrq;
 
-       PADAPTER_LIST_ENTRY QuadroList = IoAdapter->QuadroList ;
+       PADAPTER_LIST_ENTRY QuadroList = IoAdapter->QuadroList;
 
-       word                    i ;
-       int                     serviced = 0 ;
+       word                    i;
+       int                     serviced = 0;
        byte __iomem *p;
 
        p = DIVA_OS_MEM_ATTACH_RESET(IoAdapter);
 
-       if ( !(READ_BYTE(&p[PLX9054_INTCSR]) & 0x80) ) {
+       if (!(READ_BYTE(&p[PLX9054_INTCSR]) & 0x80)) {
                DIVA_OS_MEM_DETACH_RESET(IoAdapter, p);
-               return (0) ;
+               return (0);
        }
        DIVA_OS_MEM_DETACH_RESET(IoAdapter, p);
 
@@ -388,34 +388,34 @@ static int qBri_ISR (struct _ISDN_ADAPTER* IoAdapter) {
  */
        p = DIVA_OS_MEM_ATTACH_CTLREG(IoAdapter);
        qBriIrq = (dword volatile __iomem *)(&p[DIVA_4BRI_REVISION(IoAdapter) ? (MQ2_BREG_IRQ_TEST)  : (MQ_BREG_IRQ_TEST)]);
-       WRITE_DWORD(qBriIrq, MQ_IRQ_REQ_OFF) ;
+       WRITE_DWORD(qBriIrq, MQ_IRQ_REQ_OFF);
        DIVA_OS_MEM_DETACH_CTLREG(IoAdapter, p);
 
-       for ( i = 0 ; i < IoAdapter->tasks; ++i )
+       for (i = 0; i < IoAdapter->tasks; ++i)
        {
-               IoAdapter = QuadroList->QuadroAdapter[i] ;
+               IoAdapter = QuadroList->QuadroAdapter[i];
 
-               if ( IoAdapter && IoAdapter->Initialized
-                 && IoAdapter->tst_irq (&IoAdapter->a) )
+               if (IoAdapter && IoAdapter->Initialized
+                   && IoAdapter->tst_irq(&IoAdapter->a))
                {
-                       IoAdapter->IrqCount++ ;
-                       serviced = 1 ;
-                       diva_os_schedule_soft_isr (&IoAdapter->isr_soft_isr);
+                       IoAdapter->IrqCount++;
+                       serviced = 1;
+                       diva_os_schedule_soft_isr(&IoAdapter->isr_soft_isr);
                }
        }
 
-       return (serviced) ;
+       return (serviced);
 }
 
 /* --------------------------------------------------------------------------
-               Does disable the interrupt on the card
-        -------------------------------------------------------------------------- */
-static void disable_qBri_interrupt (PISDN_ADAPTER IoAdapter) {
-       dword volatile __iomem *qBriIrq ;
+   Does disable the interrupt on the card
+   -------------------------------------------------------------------------- */
+static void disable_qBri_interrupt(PISDN_ADAPTER IoAdapter) {
+       dword volatile __iomem *qBriIrq;
        byte __iomem *p;
 
-       if ( IoAdapter->ControllerNumber > 0 )
-               return ;
+       if (IoAdapter->ControllerNumber > 0)
+               return;
 /*
  *     clear interrupt line (reset Local Interrupt Test Register)
  */
@@ -425,84 +425,84 @@ static void disable_qBri_interrupt (PISDN_ADAPTER IoAdapter) {
 
        p = DIVA_OS_MEM_ATTACH_CTLREG(IoAdapter);
        qBriIrq = (dword volatile __iomem *)(&p[DIVA_4BRI_REVISION(IoAdapter) ? (MQ2_BREG_IRQ_TEST)  : (MQ_BREG_IRQ_TEST)]);
-       WRITE_DWORD(qBriIrq, MQ_IRQ_REQ_OFF) ;
+       WRITE_DWORD(qBriIrq, MQ_IRQ_REQ_OFF);
        DIVA_OS_MEM_DETACH_CTLREG(IoAdapter, p);
 }
 
 /* --------------------------------------------------------------------------
-               Install Adapter Entry Points
-        -------------------------------------------------------------------------- */
-static void set_common_qBri_functions (PISDN_ADAPTER IoAdapter) {
+   Install Adapter Entry Points
+   -------------------------------------------------------------------------- */
+static void set_common_qBri_functions(PISDN_ADAPTER IoAdapter) {
        ADAPTER *a;
 
-       a = &IoAdapter->a ;
+       a = &IoAdapter->a;
 
-       a->ram_in           = mem_in ;
-       a->ram_inw          = mem_inw ;
-       a->ram_in_buffer    = mem_in_buffer ;
-       a->ram_look_ahead   = mem_look_ahead ;
-       a->ram_out          = mem_out ;
-       a->ram_outw         = mem_outw ;
-       a->ram_out_buffer   = mem_out_buffer ;
-       a->ram_inc          = mem_inc ;
+       a->ram_in           = mem_in;
+       a->ram_inw          = mem_inw;
+       a->ram_in_buffer    = mem_in_buffer;
+       a->ram_look_ahead   = mem_look_ahead;
+       a->ram_out          = mem_out;
+       a->ram_outw         = mem_outw;
+       a->ram_out_buffer   = mem_out_buffer;
+       a->ram_inc          = mem_inc;
 
-       IoAdapter->out      = pr_out ;
-       IoAdapter->dpc      = pr_dpc ;
-       IoAdapter->tst_irq  = scom_test_int ;
-       IoAdapter->clr_irq  = scom_clear_int ;
-       IoAdapter->pcm      = (struct pc_maint *)MIPS_MAINT_OFFS ;
+       IoAdapter->out = pr_out;
+       IoAdapter->dpc = pr_dpc;
+       IoAdapter->tst_irq = scom_test_int;
+       IoAdapter->clr_irq  = scom_clear_int;
+       IoAdapter->pcm  = (struct pc_maint *)MIPS_MAINT_OFFS;
 
-       IoAdapter->load     = load_qBri_hardware ;
+       IoAdapter->load = load_qBri_hardware;
 
-       IoAdapter->disIrq   = disable_qBri_interrupt ;
-       IoAdapter->rstFnc   = reset_qBri_hardware ;
-       IoAdapter->stop     = stop_qBri_hardware ;
-       IoAdapter->trapFnc  = qBri_cpu_trapped ;
+       IoAdapter->disIrq = disable_qBri_interrupt;
+       IoAdapter->rstFnc = reset_qBri_hardware;
+       IoAdapter->stop = stop_qBri_hardware;
+       IoAdapter->trapFnc = qBri_cpu_trapped;
 
        IoAdapter->diva_isr_handler = qBri_ISR;
 
-       IoAdapter->a.io       = (void*)IoAdapter ;
+       IoAdapter->a.io = (void *)IoAdapter;
 }
 
-static void set_qBri_functions (PISDN_ADAPTER IoAdapter) {
+static void set_qBri_functions(PISDN_ADAPTER IoAdapter) {
        if (!IoAdapter->tasks) {
                IoAdapter->tasks = MQ_INSTANCE_COUNT;
        }
-       IoAdapter->MemorySize = MQ_MEMORY_SIZE ;
-       set_common_qBri_functions (IoAdapter) ;
-       diva_os_set_qBri_functions (IoAdapter) ;
+       IoAdapter->MemorySize = MQ_MEMORY_SIZE;
+       set_common_qBri_functions(IoAdapter);
+       diva_os_set_qBri_functions(IoAdapter);
 }
 
-static void set_qBri2_functions (PISDN_ADAPTER IoAdapter) {
+static void set_qBri2_functions(PISDN_ADAPTER IoAdapter) {
        if (!IoAdapter->tasks) {
                IoAdapter->tasks = MQ_INSTANCE_COUNT;
        }
        IoAdapter->MemorySize = (IoAdapter->tasks == 1) ? BRI2_MEMORY_SIZE : MQ2_MEMORY_SIZE;
-       set_common_qBri_functions (IoAdapter) ;
-       diva_os_set_qBri2_functions (IoAdapter) ;
+       set_common_qBri_functions(IoAdapter);
+       diva_os_set_qBri2_functions(IoAdapter);
 }
 
 /******************************************************************************/
 
-void prepare_qBri_functions (PISDN_ADAPTER IoAdapter) {
+void prepare_qBri_functions(PISDN_ADAPTER IoAdapter) {
 
-       set_qBri_functions (IoAdapter->QuadroList->QuadroAdapter[0]) ;
-       set_qBri_functions (IoAdapter->QuadroList->QuadroAdapter[1]) ;
-       set_qBri_functions (IoAdapter->QuadroList->QuadroAdapter[2]) ;
-       set_qBri_functions (IoAdapter->QuadroList->QuadroAdapter[3]) ;
+       set_qBri_functions(IoAdapter->QuadroList->QuadroAdapter[0]);
+       set_qBri_functions(IoAdapter->QuadroList->QuadroAdapter[1]);
+       set_qBri_functions(IoAdapter->QuadroList->QuadroAdapter[2]);
+       set_qBri_functions(IoAdapter->QuadroList->QuadroAdapter[3]);
 
 }
 
-void prepare_qBri2_functions (PISDN_ADAPTER IoAdapter) {
+void prepare_qBri2_functions(PISDN_ADAPTER IoAdapter) {
        if (!IoAdapter->tasks) {
                IoAdapter->tasks = MQ_INSTANCE_COUNT;
        }
 
-       set_qBri2_functions (IoAdapter->QuadroList->QuadroAdapter[0]) ;
+       set_qBri2_functions(IoAdapter->QuadroList->QuadroAdapter[0]);
        if (IoAdapter->tasks > 1) {
-               set_qBri2_functions (IoAdapter->QuadroList->QuadroAdapter[1]) ;
-               set_qBri2_functions (IoAdapter->QuadroList->QuadroAdapter[2]) ;
-               set_qBri2_functions (IoAdapter->QuadroList->QuadroAdapter[3]) ;
+               set_qBri2_functions(IoAdapter->QuadroList->QuadroAdapter[1]);
+               set_qBri2_functions(IoAdapter->QuadroList->QuadroAdapter[2]);
+               set_qBri2_functions(IoAdapter->QuadroList->QuadroAdapter[3]);
        }
 
 }
index 5c87552..6a5bb74 100644 (file)
@@ -1,26 +1,26 @@
 
 /*
  *
-  Copyright (c) Eicon Networks, 2002.
+ Copyright (c) Eicon Networks, 2002.
  *
-  This source file is supplied for the use with
-  Eicon Networks range of DIVA Server Adapters.
+ This source file is supplied for the use with
+ Eicon Networks range of DIVA Server Adapters.
  *
-  Eicon File Revision :    2.1
+ Eicon File Revision :    2.1
  *
-  This program is free software; you can redistribute it and/or modify
-  it under the terms of the GNU General Public License as published by
-  the Free Software Foundation; either version 2, or (at your option)
-  any later version.
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
  *
-  This program is distributed in the hope that it will be useful,
-  but WITHOUT ANY WARRANTY OF ANY KIND WHATSOEVER INCLUDING ANY
-  implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-  See the GNU General Public License for more details.
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY OF ANY KIND WHATSOEVER INCLUDING ANY
+ implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ See the GNU General Public License for more details.
  *
-  You should have received a copy of the GNU General Public License
-  along with this program; if not, write to the Free Software
-  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  *
  */
 #include "platform.h"
 /*****************************************************************************/
 #define MAX_XLOG_SIZE (64 * 1024)
 /* --------------------------------------------------------------------------
-  Investigate card state, recovery trace buffer
-  -------------------------------------------------------------------------- */
-static void bri_cpu_trapped (PISDN_ADAPTER IoAdapter) {
- byte  __iomem *addrHi, *addrLo, *ioaddr ;
- word *Xlog ;
- dword   regs[4], i, size ;
- Xdesc   xlogDesc ;
- byte __iomem *Port;
+   Investigate card state, recovery trace buffer
+   -------------------------------------------------------------------------- */
+static void bri_cpu_trapped(PISDN_ADAPTER IoAdapter) {
+       byte  __iomem *addrHi, *addrLo, *ioaddr;
+       word *Xlog;
+       dword   regs[4], i, size;
+       Xdesc   xlogDesc;
+       byte __iomem *Port;
 /*
  * first read pointers and trap frame
  */
- if ( !(Xlog = (word *)diva_os_malloc (0, MAX_XLOG_SIZE)) )
-  return ;
- Port = DIVA_OS_MEM_ATTACH_PORT(IoAdapter);
- addrHi =   Port + ((IoAdapter->Properties.Bus == BUS_PCI) ? M_PCI_ADDRH : ADDRH) ;
- addrLo = Port + ADDR ;
- ioaddr = Port + DATA ;
- outpp (addrHi,  0) ;
- outppw (addrLo, 0) ;
- for ( i = 0 ; i < 0x100 ; Xlog[i++] = inppw(ioaddr) ) ;
+       if (!(Xlog = (word *)diva_os_malloc(0, MAX_XLOG_SIZE)))
+               return;
+       Port = DIVA_OS_MEM_ATTACH_PORT(IoAdapter);
+       addrHi = Port + ((IoAdapter->Properties.Bus == BUS_PCI) ? M_PCI_ADDRH : ADDRH);
+       addrLo = Port + ADDR;
+       ioaddr = Port + DATA;
+       outpp(addrHi,  0);
+       outppw(addrLo, 0);
+       for (i = 0; i < 0x100; Xlog[i++] = inppw(ioaddr));
 /*
  * check for trapped MIPS 3xxx CPU, dump only exception frame
  */
- if ( GET_DWORD(&Xlog[0x80 / sizeof(Xlog[0])]) == 0x99999999 )
- {
-  dump_trap_frame (IoAdapter, &((byte *)Xlog)[0x90]) ;
-  IoAdapter->trapped = 1 ;
- }
- regs[0] = GET_DWORD(&((byte *)Xlog)[0x70]);
- regs[1] = GET_DWORD(&((byte *)Xlog)[0x74]);
- regs[2] = GET_DWORD(&((byte *)Xlog)[0x78]);
- regs[3] = GET_DWORD(&((byte *)Xlog)[0x7c]);
- outpp (addrHi, (regs[1] >> 16) & 0x7F) ;
- outppw (addrLo, regs[1] & 0xFFFF) ;
- xlogDesc.cnt = inppw(ioaddr) ;
- outpp (addrHi, (regs[2] >> 16) & 0x7F) ;
- outppw (addrLo, regs[2] & 0xFFFF) ;
- xlogDesc.out = inppw(ioaddr) ;
- xlogDesc.buf = Xlog ;
- regs[0] &= IoAdapter->MemorySize - 1 ;
- if ( (regs[0] < IoAdapter->MemorySize - 1) )
- {
-  size = IoAdapter->MemorySize - regs[0] ;
-  if ( size > MAX_XLOG_SIZE )
-   size = MAX_XLOG_SIZE ;
-  for ( i = 0 ; i < (size / sizeof(*Xlog)) ; regs[0] += 2 )
-  {
-   outpp (addrHi, (regs[0] >> 16) & 0x7F) ;
-   outppw (addrLo, regs[0] & 0xFFFF) ;
-   Xlog[i++] = inppw(ioaddr) ;
-  }
-  dump_xlog_buffer (IoAdapter, &xlogDesc) ;
-  diva_os_free (0, Xlog) ;
-  IoAdapter->trapped = 2 ;
- }
- outpp  (addrHi, (byte)((BRI_UNCACHED_ADDR (IoAdapter->MemoryBase + IoAdapter->MemorySize -
-                                            BRI_SHARED_RAM_SIZE)) >> 16)) ;
- outppw (addrLo, 0x00) ;
- DIVA_OS_MEM_DETACH_PORT(IoAdapter, Port);
+       if (GET_DWORD(&Xlog[0x80 / sizeof(Xlog[0])]) == 0x99999999)
+       {
+               dump_trap_frame(IoAdapter, &((byte *)Xlog)[0x90]);
+               IoAdapter->trapped = 1;
+       }
+       regs[0] = GET_DWORD(&((byte *)Xlog)[0x70]);
+       regs[1] = GET_DWORD(&((byte *)Xlog)[0x74]);
+       regs[2] = GET_DWORD(&((byte *)Xlog)[0x78]);
+       regs[3] = GET_DWORD(&((byte *)Xlog)[0x7c]);
+       outpp(addrHi, (regs[1] >> 16) & 0x7F);
+       outppw(addrLo, regs[1] & 0xFFFF);
+       xlogDesc.cnt = inppw(ioaddr);
+       outpp(addrHi, (regs[2] >> 16) & 0x7F);
+       outppw(addrLo, regs[2] & 0xFFFF);
+       xlogDesc.out = inppw(ioaddr);
+       xlogDesc.buf = Xlog;
+       regs[0] &= IoAdapter->MemorySize - 1;
+       if ((regs[0] < IoAdapter->MemorySize - 1))
+       {
+               size = IoAdapter->MemorySize - regs[0];
+               if (size > MAX_XLOG_SIZE)
+                       size = MAX_XLOG_SIZE;
+               for (i = 0; i < (size / sizeof(*Xlog)); regs[0] += 2)
+               {
+                       outpp(addrHi, (regs[0] >> 16) & 0x7F);
+                       outppw(addrLo, regs[0] & 0xFFFF);
+                       Xlog[i++] = inppw(ioaddr);
+               }
+               dump_xlog_buffer(IoAdapter, &xlogDesc);
+               diva_os_free(0, Xlog);
+               IoAdapter->trapped = 2;
+       }
+       outpp(addrHi, (byte)((BRI_UNCACHED_ADDR(IoAdapter->MemoryBase + IoAdapter->MemorySize -
+                                               BRI_SHARED_RAM_SIZE)) >> 16));
+       outppw(addrLo, 0x00);
+       DIVA_OS_MEM_DETACH_PORT(IoAdapter, Port);
 }
 /* ---------------------------------------------------------------------
    Reset hardware
-  --------------------------------------------------------------------- */
-static void reset_bri_hardware (PISDN_ADAPTER IoAdapter) {
- byte __iomem *p = DIVA_OS_MEM_ATTACH_CTLREG(IoAdapter);
- outpp (p, 0x00) ;
- DIVA_OS_MEM_DETACH_CTLREG(IoAdapter, p);
+   --------------------------------------------------------------------- */
+static void reset_bri_hardware(PISDN_ADAPTER IoAdapter) {
+       byte __iomem *p = DIVA_OS_MEM_ATTACH_CTLREG(IoAdapter);
+       outpp(p, 0x00);
+       DIVA_OS_MEM_DETACH_CTLREG(IoAdapter, p);
 }
 /* ---------------------------------------------------------------------
    Halt system
-  --------------------------------------------------------------------- */
-static void stop_bri_hardware (PISDN_ADAPTER IoAdapter) {
- byte __iomem *p = DIVA_OS_MEM_ATTACH_RESET(IoAdapter);
- if (p) {
-  outpp (p, 0x00) ; /* disable interrupts ! */
- }
- DIVA_OS_MEM_DETACH_RESET(IoAdapter, p);
- p = DIVA_OS_MEM_ATTACH_CTLREG(IoAdapter);
- outpp (p, 0x00) ;    /* clear int, halt cpu */
- DIVA_OS_MEM_DETACH_CTLREG(IoAdapter, p);
+   --------------------------------------------------------------------- */
+static void stop_bri_hardware(PISDN_ADAPTER IoAdapter) {
+       byte __iomem *p = DIVA_OS_MEM_ATTACH_RESET(IoAdapter);
+       if (p) {
+               outpp(p, 0x00); /* disable interrupts ! */
+       }
+       DIVA_OS_MEM_DETACH_RESET(IoAdapter, p);
+       p = DIVA_OS_MEM_ATTACH_CTLREG(IoAdapter);
+       outpp(p, 0x00);    /* clear int, halt cpu */
+       DIVA_OS_MEM_DETACH_CTLREG(IoAdapter, p);
 }
-static int load_bri_hardware (PISDN_ADAPTER IoAdapter) {
- return (0);
+static int load_bri_hardware(PISDN_ADAPTER IoAdapter) {
+       return (0);
 }
 /******************************************************************************/
-static int bri_ISR (struct _ISDN_ADAPTER* IoAdapter) {
- byte __iomem *p;
+static int bri_ISR(struct _ISDN_ADAPTER *IoAdapter) {
+       byte __iomem *p;
 
- p = DIVA_OS_MEM_ATTACH_CTLREG(IoAdapter);
- if ( !(inpp (p) & 0x01) ) {
-  DIVA_OS_MEM_DETACH_CTLREG(IoAdapter, p);
-  return (0) ;
- }
- /*
-  clear interrupt line
-  */
- outpp (p, 0x08) ;
- DIVA_OS_MEM_DETACH_CTLREG(IoAdapter, p);
- IoAdapter->IrqCount++ ;
- if ( IoAdapter->Initialized ) {
-  diva_os_schedule_soft_isr (&IoAdapter->isr_soft_isr);
- }
- return (1) ;
+       p = DIVA_OS_MEM_ATTACH_CTLREG(IoAdapter);
+       if (!(inpp(p) & 0x01)) {
+               DIVA_OS_MEM_DETACH_CTLREG(IoAdapter, p);
+               return (0);
+       }
+       /*
+         clear interrupt line
+       */
+       outpp(p, 0x08);
+       DIVA_OS_MEM_DETACH_CTLREG(IoAdapter, p);
+       IoAdapter->IrqCount++;
+       if (IoAdapter->Initialized) {
+               diva_os_schedule_soft_isr(&IoAdapter->isr_soft_isr);
+       }
+       return (1);
 }
 /* --------------------------------------------------------------------------
-  Disable IRQ in the card hardware
-  -------------------------------------------------------------------------- */
-static void disable_bri_interrupt (PISDN_ADAPTER IoAdapter) {
- byte __iomem *p;
- p = DIVA_OS_MEM_ATTACH_RESET(IoAdapter);
- if ( p )
- {
-  outpp (p, 0x00) ; /* disable interrupts ! */
- }
- DIVA_OS_MEM_DETACH_RESET(IoAdapter, p);
- p = DIVA_OS_MEM_ATTACH_CTLREG(IoAdapter);
- outpp (p, 0x00) ; /* clear int, halt cpu */
- DIVA_OS_MEM_DETACH_CTLREG(IoAdapter, p);
+   Disable IRQ in the card hardware
+   -------------------------------------------------------------------------- */
+static void disable_bri_interrupt(PISDN_ADAPTER IoAdapter) {
+       byte __iomem *p;
+       p = DIVA_OS_MEM_ATTACH_RESET(IoAdapter);
+       if (p)
+       {
+               outpp(p, 0x00); /* disable interrupts ! */
+       }
+       DIVA_OS_MEM_DETACH_RESET(IoAdapter, p);
+       p = DIVA_OS_MEM_ATTACH_CTLREG(IoAdapter);
+       outpp(p, 0x00); /* clear int, halt cpu */
+       DIVA_OS_MEM_DETACH_CTLREG(IoAdapter, p);
 }
 /* -------------------------------------------------------------------------
-  Fill card entry points
-  ------------------------------------------------------------------------- */
-void prepare_maestra_functions (PISDN_ADAPTER IoAdapter) {
- ADAPTER *a = &IoAdapter->a ;
- a->ram_in             = io_in ;
- a->ram_inw            = io_inw ;
- a->ram_in_buffer      = io_in_buffer ;
- a->ram_look_ahead     = io_look_ahead ;
- a->ram_out            = io_out ;
- a->ram_outw           = io_outw ;
- a->ram_out_buffer     = io_out_buffer ;
- a->ram_inc            = io_inc ;
- IoAdapter->MemoryBase = BRI_MEMORY_BASE ;
- IoAdapter->MemorySize = BRI_MEMORY_SIZE ;
- IoAdapter->out        = pr_out ;
- IoAdapter->dpc        = pr_dpc ;
- IoAdapter->tst_irq    = scom_test_int ;
- IoAdapter->clr_irq    = scom_clear_int ;
- IoAdapter->pcm        = (struct pc_maint *)MIPS_MAINT_OFFS ;
- IoAdapter->load       = load_bri_hardware ;
- IoAdapter->disIrq     = disable_bri_interrupt ;
- IoAdapter->rstFnc     = reset_bri_hardware ;
- IoAdapter->stop       = stop_bri_hardware ;
- IoAdapter->trapFnc    = bri_cpu_trapped ;
- IoAdapter->diva_isr_handler = bri_ISR;
- /*
-  Prepare OS dependent functions
-  */
- diva_os_prepare_maestra_functions (IoAdapter);
+   Fill card entry points
+   ------------------------------------------------------------------------- */
+void prepare_maestra_functions(PISDN_ADAPTER IoAdapter) {
+       ADAPTER *a = &IoAdapter->a;
+       a->ram_in             = io_in;
+       a->ram_inw            = io_inw;
+       a->ram_in_buffer      = io_in_buffer;
+       a->ram_look_ahead     = io_look_ahead;
+       a->ram_out            = io_out;
+       a->ram_outw           = io_outw;
+       a->ram_out_buffer     = io_out_buffer;
+       a->ram_inc            = io_inc;
+       IoAdapter->MemoryBase = BRI_MEMORY_BASE;
+       IoAdapter->MemorySize = BRI_MEMORY_SIZE;
+       IoAdapter->out        = pr_out;
+       IoAdapter->dpc        = pr_dpc;
+       IoAdapter->tst_irq    = scom_test_int;
+       IoAdapter->clr_irq    = scom_clear_int;
+       IoAdapter->pcm        = (struct pc_maint *)MIPS_MAINT_OFFS;
+       IoAdapter->load       = load_bri_hardware;
+       IoAdapter->disIrq     = disable_bri_interrupt;
+       IoAdapter->rstFnc     = reset_bri_hardware;
+       IoAdapter->stop       = stop_bri_hardware;
+       IoAdapter->trapFnc    = bri_cpu_trapped;
+       IoAdapter->diva_isr_handler = bri_ISR;
+       /*
+         Prepare OS dependent functions
+       */
+       diva_os_prepare_maestra_functions(IoAdapter);
 }
 /* -------------------------------------------------------------------------- */
index 18f2878..ddd0e0e 100644 (file)
@@ -1,26 +1,26 @@
 
 /*
  *
-  Copyright (c) Eicon Networks, 2002.
+ Copyright (c) Eicon Networks, 2002.
  *
-  This source file is supplied for the use with
-  Eicon Networks range of DIVA Server Adapters.
+ This source file is supplied for the use with
+ Eicon Networks range of DIVA Server Adapters.
  *
-  Eicon File Revision :    2.1
+ Eicon File Revision :    2.1
  *
-  This program is free software; you can redistribute it and/or modify
-  it under the terms of the GNU General Public License as published by
-  the Free Software Foundation; either version 2, or (at your option)
-  any later version.
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
  *
-  This program is distributed in the hope that it will be useful,
-  but WITHOUT ANY WARRANTY OF ANY KIND WHATSOEVER INCLUDING ANY
-  implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-  See the GNU General Public License for more details.
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY OF ANY KIND WHATSOEVER INCLUDING ANY
+ implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ See the GNU General Public License for more details.
  *
-  You should have received a copy of the GNU General Public License
-  along with this program; if not, write to the Free Software
-  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  *
  */
 #include "platform.h"
 /*****************************************************************************/
 #define MAX_XLOG_SIZE  (64 * 1024)
 /* -------------------------------------------------------------------------
-  Does return offset between ADAPTER->ram and real begin of memory
-  ------------------------------------------------------------------------- */
-static dword pri_ram_offset (ADAPTER* a) {
- return ((dword)MP_SHARED_RAM_OFFSET);
+   Does return offset between ADAPTER->ram and real begin of memory
+   ------------------------------------------------------------------------- */
+static dword pri_ram_offset(ADAPTER *a) {
+       return ((dword)MP_SHARED_RAM_OFFSET);
 }
 /* -------------------------------------------------------------------------
-  Recovery XLOG buffer from the card
-  ------------------------------------------------------------------------- */
-static void pri_cpu_trapped (PISDN_ADAPTER IoAdapter) {
- byte  __iomem *base ;
- word *Xlog ;
- dword   regs[4], TrapID, size ;
- Xdesc   xlogDesc ;
+   Recovery XLOG buffer from the card
+   ------------------------------------------------------------------------- */
+static void pri_cpu_trapped(PISDN_ADAPTER IoAdapter) {
+       byte  __iomem *base;
+       word *Xlog;
+       dword   regs[4], TrapID, size;
+       Xdesc   xlogDesc;
 /*
  * check for trapped MIPS 46xx CPU, dump exception frame
  */
- base   = DIVA_OS_MEM_ATTACH_ADDRESS(IoAdapter);
- TrapID = READ_DWORD(&base[0x80]) ;
- if ( (TrapID == 0x99999999) || (TrapID == 0x99999901) )
- {
-  dump_trap_frame (IoAdapter, &base[0x90]) ;
-  IoAdapter->trapped = 1 ;
- }
- regs[0] = READ_DWORD(&base[MP_PROTOCOL_OFFSET + 0x70]);
- regs[1] = READ_DWORD(&base[MP_PROTOCOL_OFFSET + 0x74]);
- regs[2] = READ_DWORD(&base[MP_PROTOCOL_OFFSET + 0x78]);
- regs[3] = READ_DWORD(&base[MP_PROTOCOL_OFFSET + 0x7c]);
- regs[0] &= IoAdapter->MemorySize - 1 ;
- if ( (regs[0] < IoAdapter->MemorySize - 1) )
- {
-  if ( !(Xlog = (word *)diva_os_malloc (0, MAX_XLOG_SIZE)) ) {
-   DIVA_OS_MEM_DETACH_ADDRESS(IoAdapter, base);
-   return ;
-  }
-  size = IoAdapter->MemorySize - regs[0] ;
-  if ( size > MAX_XLOG_SIZE )
-   size = MAX_XLOG_SIZE ;
-  memcpy_fromio(Xlog, &base[regs[0]], size) ;
-  xlogDesc.buf = Xlog ;
-  xlogDesc.cnt = READ_WORD(&base[regs[1] & (IoAdapter->MemorySize - 1)]) ;
-  xlogDesc.out = READ_WORD(&base[regs[2] & (IoAdapter->MemorySize - 1)]) ;
-  dump_xlog_buffer (IoAdapter, &xlogDesc) ;
-  diva_os_free (0, Xlog) ;
-  IoAdapter->trapped = 2 ;
- }
- DIVA_OS_MEM_DETACH_ADDRESS(IoAdapter, base);
+       base   = DIVA_OS_MEM_ATTACH_ADDRESS(IoAdapter);
+       TrapID = READ_DWORD(&base[0x80]);
+       if ((TrapID == 0x99999999) || (TrapID == 0x99999901))
+       {
+               dump_trap_frame(IoAdapter, &base[0x90]);
+               IoAdapter->trapped = 1;
+       }
+       regs[0] = READ_DWORD(&base[MP_PROTOCOL_OFFSET + 0x70]);
+       regs[1] = READ_DWORD(&base[MP_PROTOCOL_OFFSET + 0x74]);
+       regs[2] = READ_DWORD(&base[MP_PROTOCOL_OFFSET + 0x78]);
+       regs[3] = READ_DWORD(&base[MP_PROTOCOL_OFFSET + 0x7c]);
+       regs[0] &= IoAdapter->MemorySize - 1;
+       if ((regs[0] < IoAdapter->MemorySize - 1))
+       {
+               if (!(Xlog = (word *)diva_os_malloc(0, MAX_XLOG_SIZE))) {
+                       DIVA_OS_MEM_DETACH_ADDRESS(IoAdapter, base);
+                       return;
+               }
+               size = IoAdapter->MemorySize - regs[0];
+               if (size > MAX_XLOG_SIZE)
+                       size = MAX_XLOG_SIZE;
+               memcpy_fromio(Xlog, &base[regs[0]], size);
+               xlogDesc.buf = Xlog;
+               xlogDesc.cnt = READ_WORD(&base[regs[1] & (IoAdapter->MemorySize - 1)]);
+               xlogDesc.out = READ_WORD(&base[regs[2] & (IoAdapter->MemorySize - 1)]);
+               dump_xlog_buffer(IoAdapter, &xlogDesc);
+               diva_os_free(0, Xlog);
+               IoAdapter->trapped = 2;
+       }
+       DIVA_OS_MEM_DETACH_ADDRESS(IoAdapter, base);
 }
 /* -------------------------------------------------------------------------
-  Hardware reset of PRI card
-  ------------------------------------------------------------------------- */
-static void reset_pri_hardware (PISDN_ADAPTER IoAdapter) {
- byte __iomem *p = DIVA_OS_MEM_ATTACH_RESET(IoAdapter);
- WRITE_BYTE(p, _MP_RISC_RESET | _MP_LED1 | _MP_LED2);
- diva_os_wait (50) ;
- WRITE_BYTE(p, 0x00);
- diva_os_wait (50) ;
- DIVA_OS_MEM_DETACH_RESET(IoAdapter, p);
+   Hardware reset of PRI card
+   ------------------------------------------------------------------------- */
+static void reset_pri_hardware(PISDN_ADAPTER IoAdapter) {
+       byte __iomem *p = DIVA_OS_MEM_ATTACH_RESET(IoAdapter);
+       WRITE_BYTE(p, _MP_RISC_RESET | _MP_LED1 | _MP_LED2);
+       diva_os_wait(50);
+       WRITE_BYTE(p, 0x00);
+       diva_os_wait(50);
+       DIVA_OS_MEM_DETACH_RESET(IoAdapter, p);
 }
 /* -------------------------------------------------------------------------
-  Stop Card Hardware
-  ------------------------------------------------------------------------- */
-static void stop_pri_hardware (PISDN_ADAPTER IoAdapter) {
- dword i;
- byte __iomem *p;
- dword volatile __iomem *cfgReg = (void __iomem *)DIVA_OS_MEM_ATTACH_CFG(IoAdapter);
- WRITE_DWORD(&cfgReg[3], 0);
- WRITE_DWORD(&cfgReg[1], 0);
- DIVA_OS_MEM_DETACH_CFG(IoAdapter, cfgReg);
- IoAdapter->a.ram_out (&IoAdapter->a, &RAM->SWReg, SWREG_HALT_CPU) ;
- i = 0 ;
- while ( (i < 100) && (IoAdapter->a.ram_in (&IoAdapter->a, &RAM->SWReg) != 0) )
- {
-  diva_os_wait (1) ;
-  i++ ;
- }
- DBG_TRC(("%s: PRI stopped (%d)", IoAdapter->Name, i))
- cfgReg = (void __iomem *)DIVA_OS_MEM_ATTACH_CFG(IoAdapter);
- WRITE_DWORD(&cfgReg[0],((dword)(~0x03E00000)));
- DIVA_OS_MEM_DETACH_CFG(IoAdapter, cfgReg);
- diva_os_wait (1) ;
- p = DIVA_OS_MEM_ATTACH_RESET(IoAdapter);
- WRITE_BYTE(p, _MP_RISC_RESET | _MP_LED1 | _MP_LED2);
- DIVA_OS_MEM_DETACH_RESET(IoAdapter, p);
+   Stop Card Hardware
+   ------------------------------------------------------------------------- */
+static void stop_pri_hardware(PISDN_ADAPTER IoAdapter) {
+       dword i;
+       byte __iomem *p;
+       dword volatile __iomem *cfgReg = (void __iomem *)DIVA_OS_MEM_ATTACH_CFG(IoAdapter);
+       WRITE_DWORD(&cfgReg[3], 0);
+       WRITE_DWORD(&cfgReg[1], 0);
+       DIVA_OS_MEM_DETACH_CFG(IoAdapter, cfgReg);
+       IoAdapter->a.ram_out(&IoAdapter->a, &RAM->SWReg, SWREG_HALT_CPU);
+       i = 0;
+       while ((i < 100) && (IoAdapter->a.ram_in(&IoAdapter->a, &RAM->SWReg) != 0))
+       {
+               diva_os_wait(1);
+               i++;
+       }
+       DBG_TRC(("%s: PRI stopped (%d)", IoAdapter->Name, i))
+               cfgReg = (void __iomem *)DIVA_OS_MEM_ATTACH_CFG(IoAdapter);
+       WRITE_DWORD(&cfgReg[0], ((dword)(~0x03E00000)));
+       DIVA_OS_MEM_DETACH_CFG(IoAdapter, cfgReg);
+       diva_os_wait(1);
+       p = DIVA_OS_MEM_ATTACH_RESET(IoAdapter);
+       WRITE_BYTE(p, _MP_RISC_RESET | _MP_LED1 | _MP_LED2);
+       DIVA_OS_MEM_DETACH_RESET(IoAdapter, p);
 }
-static int load_pri_hardware (PISDN_ADAPTER IoAdapter) {
- return (0);
+static int load_pri_hardware(PISDN_ADAPTER IoAdapter) {
+       return (0);
 }
 /* --------------------------------------------------------------------------
-  PRI Adapter interrupt Service Routine
+   PRI Adapter interrupt Service Routine
    -------------------------------------------------------------------------- */
-static int pri_ISR (struct _ISDN_ADAPTER* IoAdapter) {
- byte __iomem *cfg = DIVA_OS_MEM_ATTACH_CFG(IoAdapter);
- if ( !(READ_DWORD(cfg) & 0x80000000) ) {
-  DIVA_OS_MEM_DETACH_CFG(IoAdapter, cfg);
-  return (0) ;
- }
- /*
-  clear interrupt line
-  */
- WRITE_DWORD(cfg, (dword)~0x03E00000) ;
- DIVA_OS_MEM_DETACH_CFG(IoAdapter, cfg);
- IoAdapter->IrqCount++ ;
- if ( IoAdapter->Initialized )
- {
-  diva_os_schedule_soft_isr (&IoAdapter->isr_soft_isr);
- }
- return (1) ;
+static int pri_ISR(struct _ISDN_ADAPTER *IoAdapter) {
+       byte __iomem *cfg = DIVA_OS_MEM_ATTACH_CFG(IoAdapter);
+       if (!(READ_DWORD(cfg) & 0x80000000)) {
+               DIVA_OS_MEM_DETACH_CFG(IoAdapter, cfg);
+               return (0);
+       }
+       /*
+         clear interrupt line
+       */
+       WRITE_DWORD(cfg, (dword)~0x03E00000);
+       DIVA_OS_MEM_DETACH_CFG(IoAdapter, cfg);
+       IoAdapter->IrqCount++;
+       if (IoAdapter->Initialized)
+       {
+               diva_os_schedule_soft_isr(&IoAdapter->isr_soft_isr);
+       }
+       return (1);
 }
 /* -------------------------------------------------------------------------
-  Disable interrupt in the card hardware
-  ------------------------------------------------------------------------- */
-static void disable_pri_interrupt (PISDN_ADAPTER IoAdapter) {
- dword volatile __iomem *cfgReg = (dword volatile __iomem *)DIVA_OS_MEM_ATTACH_CFG(IoAdapter) ;
- WRITE_DWORD(&cfgReg[3], 0);
- WRITE_DWORD(&cfgReg[1], 0);
- WRITE_DWORD(&cfgReg[0], (dword)(~0x03E00000)) ;
- DIVA_OS_MEM_DETACH_CFG(IoAdapter, cfgReg);
+   Disable interrupt in the card hardware
+   ------------------------------------------------------------------------- */
+static void disable_pri_interrupt(PISDN_ADAPTER IoAdapter) {
+       dword volatile __iomem *cfgReg = (dword volatile __iomem *)DIVA_OS_MEM_ATTACH_CFG(IoAdapter);
+       WRITE_DWORD(&cfgReg[3], 0);
+       WRITE_DWORD(&cfgReg[1], 0);
+       WRITE_DWORD(&cfgReg[0], (dword)(~0x03E00000));
+       DIVA_OS_MEM_DETACH_CFG(IoAdapter, cfgReg);
 }
 /* -------------------------------------------------------------------------
-  Install entry points for PRI Adapter
-  ------------------------------------------------------------------------- */
-static void prepare_common_pri_functions (PISDN_ADAPTER IoAdapter) {
- ADAPTER *a = &IoAdapter->a ;
- a->ram_in           = mem_in ;
- a->ram_inw          = mem_inw ;
- a->ram_in_buffer    = mem_in_buffer ;
- a->ram_look_ahead   = mem_look_ahead ;
- a->ram_out          = mem_out ;
- a->ram_outw         = mem_outw ;
- a->ram_out_buffer   = mem_out_buffer ;
- a->ram_inc          = mem_inc ;
- a->ram_offset       = pri_ram_offset ;
- a->ram_out_dw    = mem_out_dw;
- a->ram_in_dw    = mem_in_dw;
-  a->istream_wakeup   = pr_stream;
- IoAdapter->out      = pr_out ;
- IoAdapter->dpc      = pr_dpc ;
- IoAdapter->tst_irq  = scom_test_int ;
- IoAdapter->clr_irq  = scom_clear_int ;
- IoAdapter->pcm      = (struct pc_maint *)(MIPS_MAINT_OFFS
-                                        - MP_SHARED_RAM_OFFSET) ;
- IoAdapter->load     = load_pri_hardware ;
- IoAdapter->disIrq   = disable_pri_interrupt ;
- IoAdapter->rstFnc   = reset_pri_hardware ;
- IoAdapter->stop     = stop_pri_hardware ;
- IoAdapter->trapFnc  = pri_cpu_trapped ;
- IoAdapter->diva_isr_handler = pri_ISR;
+   Install entry points for PRI Adapter
+   ------------------------------------------------------------------------- */
+static void prepare_common_pri_functions(PISDN_ADAPTER IoAdapter) {
+       ADAPTER *a = &IoAdapter->a;
+       a->ram_in           = mem_in;
+       a->ram_inw          = mem_inw;
+       a->ram_in_buffer    = mem_in_buffer;
+       a->ram_look_ahead   = mem_look_ahead;
+       a->ram_out          = mem_out;
+       a->ram_outw         = mem_outw;
+       a->ram_out_buffer   = mem_out_buffer;
+       a->ram_inc          = mem_inc;
+       a->ram_offset       = pri_ram_offset;
+       a->ram_out_dw    = mem_out_dw;
+       a->ram_in_dw    = mem_in_dw;
+       a->istream_wakeup   = pr_stream;
+       IoAdapter->out      = pr_out;
+       IoAdapter->dpc      = pr_dpc;
+       IoAdapter->tst_irq  = scom_test_int;
+       IoAdapter->clr_irq  = scom_clear_int;
+       IoAdapter->pcm      = (struct pc_maint *)(MIPS_MAINT_OFFS
+                                                 - MP_SHARED_RAM_OFFSET);
+       IoAdapter->load     = load_pri_hardware;
+       IoAdapter->disIrq   = disable_pri_interrupt;
+       IoAdapter->rstFnc   = reset_pri_hardware;
+       IoAdapter->stop     = stop_pri_hardware;
+       IoAdapter->trapFnc  = pri_cpu_trapped;
+       IoAdapter->diva_isr_handler = pri_ISR;
 }
 /* -------------------------------------------------------------------------
-  Install entry points for PRI Adapter
-  ------------------------------------------------------------------------- */
-void prepare_pri_functions (PISDN_ADAPTER IoAdapter) {
- IoAdapter->MemorySize = MP_MEMORY_SIZE ;
- prepare_common_pri_functions (IoAdapter) ;
- diva_os_prepare_pri_functions (IoAdapter);
+   Install entry points for PRI Adapter
+   ------------------------------------------------------------------------- */
+void prepare_pri_functions(PISDN_ADAPTER IoAdapter) {
+       IoAdapter->MemorySize = MP_MEMORY_SIZE;
+       prepare_common_pri_functions(IoAdapter);
+       diva_os_prepare_pri_functions(IoAdapter);
 }
 /* -------------------------------------------------------------------------
-  Install entry points for PRI Rev.2 Adapter
-  ------------------------------------------------------------------------- */
-void prepare_pri2_functions (PISDN_ADAPTER IoAdapter) {
- IoAdapter->MemorySize = MP2_MEMORY_SIZE ;
- prepare_common_pri_functions (IoAdapter) ;
- diva_os_prepare_pri2_functions (IoAdapter);
+   Install entry points for PRI Rev.2 Adapter
+   ------------------------------------------------------------------------- */
+void prepare_pri2_functions(PISDN_ADAPTER IoAdapter) {
+       IoAdapter->MemorySize = MP2_MEMORY_SIZE;
+       prepare_common_pri_functions(IoAdapter);
+       diva_os_prepare_pri2_functions(IoAdapter);
 }
 /* ------------------------------------------------------------------------- */
index 8f61c69..5e20f8d 100644 (file)
@@ -1,48 +1,48 @@
 
 /*
  *
-  Copyright (c) Eicon Networks, 2002.
+ Copyright (c) Eicon Networks, 2002.
  *
-  This source file is supplied for the use with
-  Eicon Networks range of DIVA Server Adapters.
+ This source file is supplied for the use with
+ Eicon Networks range of DIVA Server Adapters.
  *
-  Eicon File Revision :    2.1
+ Eicon File Revision :    2.1
  *
-  This program is free software; you can redistribute it and/or modify
-  it under the terms of the GNU General Public License as published by
-  the Free Software Foundation; either version 2, or (at your option)
-  any later version.
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
  *
-  This program is distributed in the hope that it will be useful,
-  but WITHOUT ANY WARRANTY OF ANY KIND WHATSOEVER INCLUDING ANY
-  implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-  See the GNU General Public License for more details.
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY OF ANY KIND WHATSOEVER INCLUDING ANY
+ implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ See the GNU General Public License for more details.
  *
-  You should have received a copy of the GNU General Public License
-  along with this program; if not, write to the Free Software
-  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  *
  */
 #ifndef __DIVA_SOFT_DSP_TASK_ENTRY_H__
 #define __DIVA_SOFT_DSP_TASK_ENTRY_H__
 /*
- The soft DSP image is described by binary header contained on begin of this
- image:
-OFFSET FROM IMAGE START |  VARIABLE
-------------------------------------------------------------------------
- DIVA_MIPS_TASK_IMAGE_LINK_OFFS   |  link to the next image
+  The soft DSP image is described by binary header contained on begin of this
+  image:
+  OFFSET FROM IMAGE START |  VARIABLE
+  ------------------------------------------------------------------------
+  DIVA_MIPS_TASK_IMAGE_LINK_OFFS   |  link to the next image
   ----------------------------------------------------------------------
- DIVA_MIPS_TASK_IMAGE_GP_OFFS    |  image gp register value, void*
+  DIVA_MIPS_TASK_IMAGE_GP_OFFS    |  image gp register value, void*
   ----------------------------------------------------------------------
- DIVA_MIPS_TASK_IMAGE_ENTRY_OFFS   |  diva_mips_sdp_task_entry_t*
+  DIVA_MIPS_TASK_IMAGE_ENTRY_OFFS   |  diva_mips_sdp_task_entry_t*
   ----------------------------------------------------------------------
- DIVA_MIPS_TASK_IMAGE_LOAD_ADDR_OFFS |  image image start address (void*)
+  DIVA_MIPS_TASK_IMAGE_LOAD_ADDR_OFFS |  image image start address (void*)
   ----------------------------------------------------------------------
- DIVA_MIPS_TASK_IMAGE_END_ADDR_OFFS |  image image end address   (void*)
+  DIVA_MIPS_TASK_IMAGE_END_ADDR_OFFS |  image image end address   (void*)
   ----------------------------------------------------------------------
- DIVA_MIPS_TASK_IMAGE_ID_STRING_OFFS |  image id string char[...];
+  DIVA_MIPS_TASK_IMAGE_ID_STRING_OFFS |  image id string char[...];
   ----------------------------------------------------------------------
- */
+*/
 #define DIVA_MIPS_TASK_IMAGE_LINK_OFFS   0x6C
 #define DIVA_MIPS_TASK_IMAGE_GP_OFFS    0x70
 #define DIVA_MIPS_TASK_IMAGE_ENTRY_OFFS   0x74
@@ -50,63 +50,63 @@ OFFSET FROM IMAGE START |  VARIABLE
 #define DIVA_MIPS_TASK_IMAGE_END_ADDR_OFFS 0x7c
 #define DIVA_MIPS_TASK_IMAGE_ID_STRING_OFFS 0x80
 /*
- This function is called in order to set GP register of this task
- This function should be always called before any function of the
- task is called
- */
-typedef void (*diva_task_set_prog_gp_proc_t)(void* new_gp);
+  This function is called in order to set GP register of this task
+  This function should be always called before any function of the
+  task is called
+*/
+typedef void (*diva_task_set_prog_gp_proc_t)(void *new_gp);
 /*
- This function is called to clear .bss at task initialization step
- */
-typedef void  (*diva_task_sys_reset_proc_t)(void);
+  This function is called to clear .bss at task initialization step
+*/
+typedef void (*diva_task_sys_reset_proc_t)(void);
 /*
- This function is called in order to provide GP of master call to
- task, that will be used by calls from the task to the master
- */
-typedef void (*diva_task_set_main_gp_proc_t)(void* main_gp);
+  This function is called in order to provide GP of master call to
+  task, that will be used by calls from the task to the master
+*/
+typedef void (*diva_task_set_main_gp_proc_t)(void *main_gp);
 /*
- This function is called to provide address of 'dprintf' function
- to the task
- */
+  This function is called to provide address of 'dprintf' function
+  to the task
+*/
 typedef word (*diva_prt_proc_t)(char *, ...);
 typedef void (*diva_task_set_prt_proc_t)(diva_prt_proc_t fn);
 /*
- This function is called to set task PID
- */
+  This function is called to set task PID
+*/
 typedef void (*diva_task_set_pid_proc_t)(dword id);
 /*
- This function is called for run-time task init
- */
+  This function is called for run-time task init
+*/
 typedef int (*diva_task_run_time_init_proc_t)(void*, dword);
 /*
- This function is called from system scheduler or from timer
- */
+  This function is called from system scheduler or from timer
+*/
 typedef void (*diva_task_callback_proc_t)(void);
 /*
- This callback is used by task to get current time im mS
-  */
+  This callback is used by task to get current time im mS
+*/
 typedef dword (*diva_task_get_tick_count_proc_t)(void);
 typedef void (*diva_task_set_get_time_proc_t)(\
-                diva_task_get_tick_count_proc_t fn);
+       diva_task_get_tick_count_proc_t fn);
 typedef struct _diva_mips_sdp_task_entry {
- diva_task_set_prog_gp_proc_t  set_gp_proc;
- diva_task_sys_reset_proc_t   sys_reset_proc;
- diva_task_set_main_gp_proc_t  set_main_gp_proc;
- diva_task_set_prt_proc_t    set_dprintf_proc;
- diva_task_set_pid_proc_t    set_pid_proc;
- diva_task_run_time_init_proc_t run_time_init_proc;
- diva_task_callback_proc_t    task_callback_proc;
- diva_task_callback_proc_t    timer_callback_proc;
- diva_task_set_get_time_proc_t  set_get_time_proc;
- void*              last_entry_proc;
+       diva_task_set_prog_gp_proc_t  set_gp_proc;
+       diva_task_sys_reset_proc_t   sys_reset_proc;
+       diva_task_set_main_gp_proc_t  set_main_gp_proc;
+       diva_task_set_prt_proc_t    set_dprintf_proc;
+       diva_task_set_pid_proc_t    set_pid_proc;
+       diva_task_run_time_init_proc_t run_time_init_proc;
+       diva_task_callback_proc_t    task_callback_proc;
+       diva_task_callback_proc_t    timer_callback_proc;
+       diva_task_set_get_time_proc_t  set_get_time_proc;
+       void *last_entry_proc;
 } diva_mips_sdp_task_entry_t;
 /*
- 'last_entry_proc' should be set to zero and is used for future extensuios
- */
+  'last_entry_proc' should be set to zero and is used for future extensuios
+*/
 typedef struct _diva_mips_sw_task {
-  diva_mips_sdp_task_entry_t  sdp_entry;
-  void*                       sdp_gp_reg;
-  void*                       own_gp_reg;
+       diva_mips_sdp_task_entry_t  sdp_entry;
+       void *sdp_gp_reg;
+       void *own_gp_reg;
 } diva_mips_sw_task_t;
 #if !defined(DIVA_BRI2F_SDP_1_NAME)
 #define DIVA_BRI2F_SDP_1_NAME "sdp0.2q0"
index ac0bdd1..7cab5c3 100644 (file)
 #define DIVAS_MAX_XDI_ADAPTERS 64
 
 /* --------------------------------------------------------------------------
-               IMPORTS
+   IMPORTS
    -------------------------------------------------------------------------- */
 extern void diva_os_wakeup_read(void *os_context);
 extern void diva_os_wakeup_close(void *os_context);
 /* --------------------------------------------------------------------------
-               LOCALS
+   LOCALS
    -------------------------------------------------------------------------- */
 static LIST_HEAD(adapter_q);
 static diva_os_spin_lock_t adapter_lock;
 
 static diva_um_idi_adapter_t *diva_um_idi_find_adapter(dword nr);
-static void cleanup_adapter(diva_um_idi_adapter_t * a);
-static void cleanup_entity(divas_um_idi_entity_t * e);
-static int diva_user_mode_idi_adapter_features(diva_um_idi_adapter_t * a,
+static void cleanup_adapter(diva_um_idi_adapter_t *a);
+static void cleanup_entity(divas_um_idi_entity_t *e);
+static int diva_user_mode_idi_adapter_features(diva_um_idi_adapter_t *a,
                                               diva_um_idi_adapter_features_t
-                                              * features);
-static int process_idi_request(divas_um_idi_entity_t * e,
-                              const diva_um_idi_req_hdr_t * req);
-static int process_idi_rc(divas_um_idi_entity_t * e, byte rc);
-static int process_idi_ind(divas_um_idi_entity_t * e, byte ind);
-static int write_return_code(divas_um_idi_entity_t * e, byte rc);
+                                              *features);
+static int process_idi_request(divas_um_idi_entity_t *e,
+                              const diva_um_idi_req_hdr_t *req);
+static int process_idi_rc(divas_um_idi_entity_t *e, byte rc);
+static int process_idi_ind(divas_um_idi_entity_t *e, byte ind);
+static int write_return_code(divas_um_idi_entity_t *e, byte rc);
 
 /* --------------------------------------------------------------------------
-               MAIN
+   MAIN
    -------------------------------------------------------------------------- */
 int diva_user_mode_idi_init(void)
 {
@@ -46,10 +46,10 @@ int diva_user_mode_idi_init(void)
 }
 
 /* --------------------------------------------------------------------------
-               Copy adapter features to user supplied buffer
+   Copy adapter features to user supplied buffer
    -------------------------------------------------------------------------- */
 static int
-diva_user_mode_idi_adapter_features(diva_um_idi_adapter_t * a,
+diva_user_mode_idi_adapter_features(diva_um_idi_adapter_t *a,
                                    diva_um_idi_adapter_features_t *
                                    features)
 {
@@ -63,14 +63,14 @@ diva_user_mode_idi_adapter_features(diva_um_idi_adapter_t * a,
 
                sync_req.GetName.Req = 0;
                sync_req.GetName.Rc = IDI_SYNC_REQ_GET_NAME;
-               (*(a->d.request)) ((ENTITY *) & sync_req);
+               (*(a->d.request)) ((ENTITY *)&sync_req);
                strlcpy(features->name, sync_req.GetName.name,
                        sizeof(features->name));
 
                sync_req.GetSerial.Req = 0;
                sync_req.GetSerial.Rc = IDI_SYNC_REQ_GET_SERIAL;
                sync_req.GetSerial.serial = 0;
-               (*(a->d.request)) ((ENTITY *) & sync_req);
+               (*(a->d.request))((ENTITY *)&sync_req);
                features->serial_number = sync_req.GetSerial.serial;
        }
 
@@ -78,7 +78,7 @@ diva_user_mode_idi_adapter_features(diva_um_idi_adapter_t * a,
 }
 
 /* --------------------------------------------------------------------------
-               REMOVE ADAPTER
+   REMOVE ADAPTER
    -------------------------------------------------------------------------- */
 void diva_user_mode_idi_remove_adapter(int adapter_nr)
 {
@@ -98,7 +98,7 @@ void diva_user_mode_idi_remove_adapter(int adapter_nr)
 }
 
 /* --------------------------------------------------------------------------
-               CALLED ON DRIVER EXIT (UNLOAD)
+   CALLED ON DRIVER EXIT (UNLOAD)
    -------------------------------------------------------------------------- */
 void diva_user_mode_idi_finit(void)
 {
@@ -116,15 +116,15 @@ void diva_user_mode_idi_finit(void)
 }
 
 /* -------------------------------------------------------------------------
-               CREATE AND INIT IDI ADAPTER
-        ------------------------------------------------------------------------- */
-int diva_user_mode_idi_create_adapter(const DESCRIPTOR * d, int adapter_nr)
+   CREATE AND INIT IDI ADAPTER
+   ------------------------------------------------------------------------- */
+int diva_user_mode_idi_create_adapter(const DESCRIPTOR *d, int adapter_nr)
 {
        diva_os_spin_lock_magic_t old_irql;
        diva_um_idi_adapter_t *a =
-           (diva_um_idi_adapter_t *) diva_os_malloc(0,
-                                                    sizeof
-                                                    (diva_um_idi_adapter_t));
+               (diva_um_idi_adapter_t *) diva_os_malloc(0,
+                                                        sizeof
+                                                        (diva_um_idi_adapter_t));
 
        if (!a) {
                return (-1);
@@ -145,7 +145,7 @@ int diva_user_mode_idi_create_adapter(const DESCRIPTOR * d, int adapter_nr)
 }
 
 /* ------------------------------------------------------------------------
-                       Find adapter by Adapter number
+   Find adapter by Adapter number
    ------------------------------------------------------------------------ */
 static diva_um_idi_adapter_t *diva_um_idi_find_adapter(dword nr)
 {
@@ -159,14 +159,14 @@ static diva_um_idi_adapter_t *diva_um_idi_find_adapter(dword nr)
                        break;
                a = NULL;
        }
-       return(a);
+       return (a);
 }
 
 /* ------------------------------------------------------------------------
-               Cleanup this adapter and cleanup/delete all entities assigned
-               to this adapter
+   Cleanup this adapter and cleanup/delete all entities assigned
+   to this adapter
    ------------------------------------------------------------------------ */
-static void cleanup_adapter(diva_um_idi_adapter_t * a)
+static void cleanup_adapter(diva_um_idi_adapter_t *a)
 {
        struct list_head *tmp, *safe;
        divas_um_idi_entity_t *e;
@@ -184,9 +184,9 @@ static void cleanup_adapter(diva_um_idi_adapter_t * a)
 }
 
 /* ------------------------------------------------------------------------
-               Cleanup, but NOT delete this entity
+   Cleanup, but NOT delete this entity
    ------------------------------------------------------------------------ */
-static void cleanup_entity(divas_um_idi_entity_t * e)
+static void cleanup_entity(divas_um_idi_entity_t *e)
 {
        e->os_ref = NULL;
        e->status = 0;
@@ -203,7 +203,7 @@ static void cleanup_entity(divas_um_idi_entity_t * e)
 
 
 /* ------------------------------------------------------------------------
-               Create ENTITY, link it to the adapter and remove pointer to entity
+   Create ENTITY, link it to the adapter and remove pointer to entity
    ------------------------------------------------------------------------ */
 void *divas_um_idi_create_entity(dword adapter_nr, void *file)
 {
@@ -236,12 +236,12 @@ void *divas_um_idi_create_entity(dword adapter_nr, void *file)
 
                diva_os_enter_spin_lock(&adapter_lock, &old_irql, "create_entity");
                /*
-                  Look for Adapter requested
-                */
+                 Look for Adapter requested
+               */
                if (!(a = diva_um_idi_find_adapter(adapter_nr))) {
                        /*
-                          No adapter was found, or this adapter was removed
-                        */
+                         No adapter was found, or this adapter was removed
+                       */
                        diva_os_leave_spin_lock(&adapter_lock, &old_irql, "create_entity");
 
                        DBG_LOG(("A: no adapter(%ld)", adapter_nr));
@@ -267,7 +267,7 @@ void *divas_um_idi_create_entity(dword adapter_nr, void *file)
 }
 
 /* ------------------------------------------------------------------------
-               Unlink entity and free memory 
+   Unlink entity and free memory
    ------------------------------------------------------------------------ */
 int divas_um_idi_delete_entity(int adapter_nr, void *entity)
 {
@@ -296,8 +296,8 @@ int divas_um_idi_delete_entity(int adapter_nr, void *entity)
 }
 
 /* --------------------------------------------------------------------------
-               Called by application to read data from IDI
-        -------------------------------------------------------------------------- */
+   Called by application to read data from IDI
+   -------------------------------------------------------------------------- */
 int diva_um_idi_read(void *entity,
                     void *os_handle,
                     void *dst,
@@ -319,20 +319,20 @@ int diva_um_idi_read(void *entity,
            (a->status & DIVA_UM_IDI_ADAPTER_REMOVED)) {
                diva_os_leave_spin_lock(&adapter_lock, &old_irql, "read");
                DBG_ERR(("E(%08x) read failed - adapter removed", e))
-               return (-1);
+                       return (-1);
        }
 
        DBG_TRC(("A(%d) E(%08x) read(%d)", a->adapter_nr, e, max_length));
 
        /*
-          Try to read return code first
-        */
+         Try to read return code first
+       */
        data = diva_data_q_get_segment4read(&e->rc);
        q = &e->rc;
 
        /*
-          No return codes available, read indications now
-        */
+         No return codes available, read indications now
+       */
        if (!data) {
                if (!(e->status & DIVA_UM_IDI_RC_PENDING)) {
                        DBG_TRC(("A(%d) E(%08x) read data", a->adapter_nr, e));
@@ -348,8 +348,8 @@ int diva_um_idi_read(void *entity,
                if ((length = diva_data_q_get_segment_length(q)) >
                    max_length) {
                        /*
-                          Not enough space to read message
-                        */
+                         Not enough space to read message
+                       */
                        DBG_ERR(("A: A(%d) E(%08x) read small buffer",
                                 a->adapter_nr, e, ret));
                        diva_os_leave_spin_lock(&adapter_lock, &old_irql,
@@ -357,14 +357,14 @@ int diva_um_idi_read(void *entity,
                        return (-2);
                }
                /*
-                  Copy it to user, this function does access ONLY locked an verified
-                  memory, also we can access it witch spin lock held
-                */
+                 Copy it to user, this function does access ONLY locked an verified
+                 memory, also we can access it witch spin lock held
+               */
 
                if ((ret = (*cp_fn) (os_handle, dst, data, length)) >= 0) {
                        /*
-                          Acknowledge only if read was successful
-                        */
+                         Acknowledge only if read was successful
+                       */
                        diva_data_q_ack_segment4read(q);
                }
        }
@@ -399,7 +399,7 @@ int diva_um_idi_write(void *entity,
            (a->status & DIVA_UM_IDI_ADAPTER_REMOVED)) {
                diva_os_leave_spin_lock(&adapter_lock, &old_irql, "write");
                DBG_ERR(("E(%08x) write failed - adapter removed", e))
-               return (-1);
+                       return (-1);
        }
 
        DBG_TRC(("A(%d) E(%08x) write(%d)", a->adapter_nr, e, length));
@@ -416,9 +416,9 @@ int diva_um_idi_write(void *entity,
        }
 
        /*
-          Copy function does access only locked verified memory,
-          also it can be called with spin lock held
-        */
+         Copy function does access only locked verified memory,
+         also it can be called with spin lock held
+       */
        if ((ret = (*cp_fn) (os_handle, e->buffer, src, length)) < 0) {
                DBG_TRC(("A: A(%d) E(%08x) write error=%d", a->adapter_nr,
                         e, ret));
@@ -426,32 +426,32 @@ int diva_um_idi_write(void *entity,
                return (ret);
        }
 
-       req = (diva_um_idi_req_hdr_t *) & e->buffer[0];
+       req = (diva_um_idi_req_hdr_t *)&e->buffer[0];
 
        switch (req->type) {
        case DIVA_UM_IDI_GET_FEATURES:{
-                       DBG_LOG(("A(%d) get_features", a->adapter_nr));
-                       if (!(data =
-                            diva_data_q_get_segment4write(&e->data))) {
-                               DBG_ERR(("A(%d) get_features, no free buffer",
-                                        a->adapter_nr));
-                               diva_os_leave_spin_lock(&adapter_lock,
-                                                       &old_irql,
-                                                       "write");
-                               return (0);
-                       }
-                       diva_user_mode_idi_adapter_features(a, &(((diva_um_idi_ind_hdr_t
-                                                               *) data)->hdr.features));
-                       ((diva_um_idi_ind_hdr_t *) data)->type =
-                           DIVA_UM_IDI_IND_FEATURES;
-                       ((diva_um_idi_ind_hdr_t *) data)->data_length = 0;
-                       diva_data_q_ack_segment4write(&e->data,
-                                                     sizeof(diva_um_idi_ind_hdr_t));
+               DBG_LOG(("A(%d) get_features", a->adapter_nr));
+               if (!(data =
+                     diva_data_q_get_segment4write(&e->data))) {
+                       DBG_ERR(("A(%d) get_features, no free buffer",
+                                a->adapter_nr));
+                       diva_os_leave_spin_lock(&adapter_lock,
+                                               &old_irql,
+                                               "write");
+                       return (0);
+               }
+               diva_user_mode_idi_adapter_features(a, &(((diva_um_idi_ind_hdr_t
+                                                          *) data)->hdr.features));
+               ((diva_um_idi_ind_hdr_t *) data)->type =
+                       DIVA_UM_IDI_IND_FEATURES;
+               ((diva_um_idi_ind_hdr_t *) data)->data_length = 0;
+               diva_data_q_ack_segment4write(&e->data,
+                                             sizeof(diva_um_idi_ind_hdr_t));
 
-                       diva_os_leave_spin_lock(&adapter_lock, &old_irql, "write");
+               diva_os_leave_spin_lock(&adapter_lock, &old_irql, "write");
 
-                       diva_os_wakeup_read(e->os_context);
-               }
+               diva_os_wakeup_read(e->os_context);
+       }
                break;
 
        case DIVA_UM_IDI_REQ:
@@ -486,9 +486,9 @@ int diva_um_idi_write(void *entity,
 }
 
 /* --------------------------------------------------------------------------
-                       CALLBACK FROM XDI
-        -------------------------------------------------------------------------- */
-static void diva_um_idi_xdi_callback(ENTITY * entity)
+   CALLBACK FROM XDI
+   -------------------------------------------------------------------------- */
+static void diva_um_idi_xdi_callback(ENTITY *entity)
 {
        divas_um_idi_entity_t *e = DIVAS_CONTAINING_RECORD(entity,
                                                           divas_um_idi_entity_t,
@@ -529,8 +529,8 @@ static void diva_um_idi_xdi_callback(ENTITY * entity)
        }
 }
 
-static int process_idi_request(divas_um_idi_entity_t * e,
-                              const diva_um_idi_req_hdr_t * req)
+static int process_idi_request(divas_um_idi_entity_t *e,
+                              const diva_um_idi_req_hdr_t *req)
 {
        int assign = 0;
        byte Req = (byte) req->Req;
@@ -579,7 +579,7 @@ static int process_idi_request(divas_um_idi_entity_t * e,
        e->e.Req = Req;
        e->e.ReqCh = (byte) req->ReqCh;
        e->e.X->PLength = (word) req->data_length;
-       e->e.X->P = (byte *) & req[1];  /* Our buffer is safe */
+       e->e.X->P = (byte *)&req[1];    /* Our buffer is safe */
 
        DBG_TRC(("A(%d) E(%08x) request(%02x-%02x-%02x (%d))",
                 e->adapter->adapter_nr, e, e->e.Id, e->e.Req,
@@ -595,9 +595,9 @@ static int process_idi_request(divas_um_idi_entity_t * e,
        if (assign) {
                if (e->e.Rc == OUT_OF_RESOURCES) {
                        /*
-                          XDI has no entities more, call was not forwarded to the card,
-                          no callback will be scheduled
-                        */
+                         XDI has no entities more, call was not forwarded to the card,
+                         no callback will be scheduled
+                       */
                        DBG_ERR(("A: A(%d) E(%08x) XDI out of entities",
                                 e->adapter->adapter_nr, e));
 
@@ -621,7 +621,7 @@ static int process_idi_request(divas_um_idi_entity_t * e,
        return (0);
 }
 
-static int process_idi_rc(divas_um_idi_entity_t * e, byte rc)
+static int process_idi_rc(divas_um_idi_entity_t *e, byte rc)
 {
        DBG_TRC(("A(%d) E(%08x) rc(%02x-%02x-%02x)",
                 e->adapter->adapter_nr, e, e->e.Id, rc, e->e.RcCh));
@@ -674,20 +674,20 @@ static int process_idi_rc(divas_um_idi_entity_t * e, byte rc)
        return (1);
 }
 
-static int process_idi_ind(divas_um_idi_entity_t * e, byte ind)
+static int process_idi_ind(divas_um_idi_entity_t *e, byte ind)
 {
        int do_wakeup = 0;
 
        if (e->e.complete != 0x02) {
                diva_um_idi_ind_hdr_t *pind =
-                   (diva_um_idi_ind_hdr_t *)
-                   diva_data_q_get_segment4write(&e->data);
+                       (diva_um_idi_ind_hdr_t *)
+                       diva_data_q_get_segment4write(&e->data);
                if (pind) {
                        e->e.RNum = 1;
-                       e->e.R->P = (byte *) & pind[1];
+                       e->e.R->P = (byte *)&pind[1];
                        e->e.R->PLength =
-                           (word) (diva_data_q_get_max_length(&e->data) -
-                                   sizeof(*pind));
+                               (word) (diva_data_q_get_max_length(&e->data) -
+                                       sizeof(*pind));
                        DBG_TRC(("A(%d) E(%08x) ind_1(%02x-%02x-%02x)-[%d-%d]",
                                 e->adapter->adapter_nr, e, e->e.Id, ind,
                                 e->e.IndCh, e->e.RLength,
@@ -703,7 +703,7 @@ static int process_idi_ind(divas_um_idi_entity_t * e, byte ind)
                }
        } else {
                diva_um_idi_ind_hdr_t *pind =
-                   (diva_um_idi_ind_hdr_t *) (e->e.R->P);
+                       (diva_um_idi_ind_hdr_t *) (e->e.R->P);
 
                DBG_TRC(("A(%d) E(%08x) ind(%02x-%02x-%02x)-[%d]",
                         e->adapter->adapter_nr, e, e->e.Id, ind,
@@ -728,14 +728,14 @@ static int process_idi_ind(divas_um_idi_entity_t * e, byte ind)
 }
 
 /* --------------------------------------------------------------------------
-               Write return code to the return code queue of entity
-        -------------------------------------------------------------------------- */
-static int write_return_code(divas_um_idi_entity_t * e, byte rc)
+   Write return code to the return code queue of entity
+   -------------------------------------------------------------------------- */
+static int write_return_code(divas_um_idi_entity_t *e, byte rc)
 {
        diva_um_idi_ind_hdr_t *prc;
 
        if (!(prc =
-            (diva_um_idi_ind_hdr_t *) diva_data_q_get_segment4write(&e->rc)))
+             (diva_um_idi_ind_hdr_t *) diva_data_q_get_segment4write(&e->rc)))
        {
                DBG_ERR(("A: A(%d) E(%08x) rc(%02x) lost",
                         e->adapter->adapter_nr, e, rc));
@@ -753,9 +753,9 @@ static int write_return_code(divas_um_idi_entity_t * e, byte rc)
 }
 
 /* --------------------------------------------------------------------------
-               Return amount of entries that can be bead from this entity or
-               -1 if adapter was removed
-        -------------------------------------------------------------------------- */
+   Return amount of entries that can be bead from this entity or
+   -1 if adapter was removed
+   -------------------------------------------------------------------------- */
 int diva_user_mode_idi_ind_ready(void *entity, void *os_handle)
 {
        divas_um_idi_entity_t *e;
@@ -771,16 +771,16 @@ int diva_user_mode_idi_ind_ready(void *entity, void *os_handle)
 
        if ((!a) || (a->status & DIVA_UM_IDI_ADAPTER_REMOVED)) {
                /*
-                  Adapter was unloaded
-                */
+                 Adapter was unloaded
+               */
                diva_os_leave_spin_lock(&adapter_lock, &old_irql, "ind_ready");
                return (-1);    /* adapter was removed */
        }
        if (e->status & DIVA_UM_IDI_REMOVED) {
                /*
-                  entity was removed as result of adapter removal
-                  user should assign this entity again
-                */
+                 entity was removed as result of adapter removal
+                 user should assign this entity again
+               */
                diva_os_leave_spin_lock(&adapter_lock, &old_irql, "ind_ready");
                return (-1);
        }
@@ -827,7 +827,7 @@ int divas_um_idi_entity_assigned(void *entity)
        DBG_TRC(("Id:%02x, rc_count:%d, status:%08x", e->e.Id, e->rc_count,
                 e->status))
 
-       diva_os_leave_spin_lock(&adapter_lock, &old_irql, "assigned?");
+               diva_os_leave_spin_lock(&adapter_lock, &old_irql, "assigned?");
 
        return (ret);
 }
@@ -850,23 +850,23 @@ int divas_um_idi_entity_start_remove(void *entity)
 
        if (e->rc_count) {
                /*
-                  Entity BUSY
-                */
+                 Entity BUSY
+               */
                diva_os_leave_spin_lock(&adapter_lock, &old_irql, "start_remove");
                return (1);
        }
 
        if (!e->e.Id) {
                /*
-                  Remove request was already pending, and arrived now
-                */
+                 Remove request was already pending, and arrived now
+               */
                diva_os_leave_spin_lock(&adapter_lock, &old_irql, "start_remove");
                return (0);     /* REMOVE was pending */
        }
 
        /*
-          Now send remove request
-        */
+         Now send remove request
+       */
        e->e.Req = REMOVE;
        e->e.ReqCh = 0;
 
index 141072f..ffb88f7 100644 (file)
@@ -6,7 +6,7 @@
 
 /*
   interface between UM IDI core and OS dependent part
-  */
+*/
 int diva_user_mode_idi_init(void);
 void diva_user_mode_idi_finit(void);
 void *divas_um_idi_create_entity(dword adapter_nr, void *file);
index a3bd163..d303e65 100644 (file)
@@ -24,12 +24,12 @@ typedef union _divas_card_resources {
 } divas_card_resources_t;
 
 struct _diva_os_xdi_adapter;
-typedef int (*diva_init_card_proc_t) (struct _diva_os_xdi_adapter * a);
-typedef int (*diva_cmd_card_proc_t) (struct _diva_os_xdi_adapter * a,
-                                    diva_xdi_um_cfg_cmd_t * data,
-                                    int length);
-typedef void (*diva_xdi_clear_interrupts_proc_t) (struct
-                                                 _diva_os_xdi_adapter *);
+typedef int (*diva_init_card_proc_t)(struct _diva_os_xdi_adapter *a);
+typedef int (*diva_cmd_card_proc_t)(struct _diva_os_xdi_adapter *a,
+                                   diva_xdi_um_cfg_cmd_t *data,
+                                   int length);
+typedef void (*diva_xdi_clear_interrupts_proc_t)(struct
+                                                _diva_os_xdi_adapter *);
 
 #define DIVA_XDI_MBOX_BUSY                     1
 #define DIVA_XDI_MBOX_WAIT_XLOG        2
index 3ade28f..58368f7 100644 (file)
@@ -80,7 +80,7 @@
 
 /*
   Set untranslated protocol code features
-  */
+*/
 #define DIVA_XDI_UM_CMD_SET_PROTOCOL_FEATURES  11
 
 typedef struct _diva_xdi_um_cfg_cmd_data_set_features {
index cf34941..b3479e5 100644 (file)
@@ -1,26 +1,26 @@
 
 /*
  *
-  Copyright (c) Eicon Networks, 2002.
+ Copyright (c) Eicon Networks, 2002.
  *
-  This source file is supplied for the use with
-  Eicon Networks range of DIVA Server Adapters.
+ This source file is supplied for the use with
+ Eicon Networks range of DIVA Server Adapters.
  *
-  Eicon File Revision :    2.1
+ Eicon File Revision :    2.1
  *
-  This program is free software; you can redistribute it and/or modify
-  it under the terms of the GNU General Public License as published by
-  the Free Software Foundation; either version 2, or (at your option)
-  any later version.
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
  *
-  This program is distributed in the hope that it will be useful,
-  but WITHOUT ANY WARRANTY OF ANY KIND WHATSOEVER INCLUDING ANY
-  implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-  See the GNU General Public License for more details.
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY OF ANY KIND WHATSOEVER INCLUDING ANY
+ implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ See the GNU General Public License for more details.
  *
-  You should have received a copy of the GNU General Public License
-  along with this program; if not, write to the Free Software
-  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  *
  */
-static char diva_xdi_common_code_build[] = "102-52"; 
+static char diva_xdi_common_code_build[] = "102-52";
index 861b651..05ed4d0 100644 (file)
@@ -257,10 +257,10 @@ static struct bchannel *
 Sel_BCS(struct fritzcard *fc, u32 channel)
 {
        if (test_bit(FLG_ACTIVE, &fc->bch[0].Flags) &&
-               (fc->bch[0].nr & channel))
+           (fc->bch[0].nr & channel))
                return &fc->bch[0];
        else if (test_bit(FLG_ACTIVE, &fc->bch[1].Flags) &&
-               (fc->bch[1].nr & channel))
+                (fc->bch[1].nr & channel))
                return &fc->bch[1];
        else
                return NULL;
@@ -277,7 +277,7 @@ __write_ctrl_pci(struct fritzcard *fc, struct hdlc_hw *hdlc, u32 channel) {
 static inline void
 __write_ctrl_pciv2(struct fritzcard *fc, struct hdlc_hw *hdlc, u32 channel) {
        outl(hdlc->ctrl.ctrl, fc->addr + (channel == 2 ? AVM_HDLC_STATUS_2 :
-               AVM_HDLC_STATUS_1));
+                                         AVM_HDLC_STATUS_1));
 }
 
 void
@@ -287,7 +287,7 @@ write_ctrl(struct bchannel *bch, int which) {
 
        hdlc = &fc->hdlc[(bch->nr - 1) & 1];
        pr_debug("%s: hdlc %c wr%x ctrl %x\n", fc->name, '@' + bch->nr,
-               which, hdlc->ctrl.ctrl);
+                which, hdlc->ctrl.ctrl);
        switch (fc->type) {
        case AVM_FRITZ_PCIV2:
                __write_ctrl_pciv2(fc, hdlc, bch->nr);
@@ -310,7 +310,7 @@ static inline u32
 __read_status_pciv2(u_long addr, u32 channel)
 {
        return inl(addr + (channel == 2 ? AVM_HDLC_STATUS_2 :
-               AVM_HDLC_STATUS_1));
+                          AVM_HDLC_STATUS_1));
 }
 
 
@@ -349,7 +349,7 @@ modehdlc(struct bchannel *bch, int protocol)
 
        hdlc = &fc->hdlc[(bch->nr - 1) & 1];
        pr_debug("%s: hdlc %c protocol %x-->%x ch %d\n", fc->name,
-               '@' + bch->nr, bch->state, protocol, bch->nr);
+                '@' + bch->nr, bch->state, protocol, bch->nr);
        hdlc->ctrl.ctrl = 0;
        switch (protocol) {
        case -1: /* used for init */
@@ -411,14 +411,14 @@ hdlc_empty_fifo(struct bchannel *bch, int count)
        }
        if ((bch->rx_skb->len + count) > bch->maxlen) {
                pr_debug("%s: overrun %d\n", fc->name,
-                       bch->rx_skb->len + count);
+                        bch->rx_skb->len + count);
                return;
        }
        p = skb_put(bch->rx_skb, count);
        ptr = (u32 *)p;
        if (AVM_FRITZ_PCIV2 == fc->type)
                addr = fc->addr + (bch->nr == 2 ?
-                       AVM_HDLC_FIFO_2 : AVM_HDLC_FIFO_1);
+                                  AVM_HDLC_FIFO_2 : AVM_HDLC_FIFO_1);
        else {
                addr = fc->addr + CHIP_WINDOW;
                outl(bch->nr == 2 ? AVM_HDLC_2 : AVM_HDLC_1, fc->addr);
@@ -431,7 +431,7 @@ hdlc_empty_fifo(struct bchannel *bch, int count)
        }
        if (debug & DEBUG_HW_BFIFO) {
                snprintf(fc->log, LOG_SIZE, "B%1d-recv %s %d ",
-                       bch->nr, fc->name, count);
+                        bch->nr, fc->name, count);
                print_hex_dump_bytes(fc->log, DUMP_PREFIX_OFFSET, p, count);
        }
 }
@@ -460,14 +460,14 @@ hdlc_fill_fifo(struct bchannel *bch)
                        hdlc->ctrl.sr.cmd |= HDLC_CMD_XME;
        }
        pr_debug("%s: %s %d/%d/%d", fc->name, __func__, count,
-               bch->tx_idx, bch->tx_skb->len);
+                bch->tx_idx, bch->tx_skb->len);
        ptr = (u32 *)p;
        bch->tx_idx += count;
        hdlc->ctrl.sr.xml = ((count == HDLC_FIFO_SIZE) ? 0 : count);
        if (AVM_FRITZ_PCIV2 == fc->type) {
                __write_ctrl_pciv2(fc, hdlc, bch->nr);
                addr = fc->addr + (bch->nr == 2 ?
-                       AVM_HDLC_FIFO_2 : AVM_HDLC_FIFO_1);
+                                  AVM_HDLC_FIFO_2 : AVM_HDLC_FIFO_1);
        } else {
                __write_ctrl_pci(fc, hdlc, bch->nr);
                addr = fc->addr + CHIP_WINDOW;
@@ -480,7 +480,7 @@ hdlc_fill_fifo(struct bchannel *bch)
        }
        if (debug & DEBUG_HW_BFIFO) {
                snprintf(fc->log, LOG_SIZE, "B%1d-send %s %d ",
-                       bch->nr, fc->name, count);
+                        bch->nr, fc->name, count);
                print_hex_dump_bytes(fc->log, DUMP_PREFIX_OFFSET, p, count);
        }
 }
@@ -528,14 +528,14 @@ HDLC_irq(struct bchannel *bch, u32 stat)
                        if (!bch->rx_skb)
                                goto handle_tx;
                        if ((stat & HDLC_STAT_RME) || test_bit(FLG_TRANSPARENT,
-                           &bch->Flags)) {
+                                                              &bch->Flags)) {
                                if (((stat & HDLC_STAT_CRCVFRRAB) ==
-                                   HDLC_STAT_CRCVFR) ||
+                                    HDLC_STAT_CRCVFR) ||
                                    test_bit(FLG_TRANSPARENT, &bch->Flags)) {
                                        recv_Bchannel(bch, 0);
                                } else {
                                        pr_debug("%s: got invalid frame\n",
-                                               fc->name);
+                                                fc->name);
                                        skb_trim(bch->rx_skb, 0);
                                }
                        }
@@ -549,11 +549,11 @@ handle_tx:
                 */
                if (bch->tx_skb)
                        pr_debug("%s: ch%d XDU len(%d) idx(%d) Flags(%lx)\n",
-                               fc->name, bch->nr, bch->tx_skb->len,
-                               bch->tx_idx, bch->Flags);
+                                fc->name, bch->nr, bch->tx_skb->len,
+                                bch->tx_idx, bch->Flags);
                else
                        pr_debug("%s: ch%d XDU no tx_skb Flags(%lx)\n",
-                               fc->name, bch->nr, bch->Flags);
+                                fc->name, bch->nr, bch->Flags);
                if (bch->tx_skb && bch->tx_skb->len) {
                        if (!test_bit(FLG_TRANSPARENT, &bch->Flags))
                                bch->tx_idx = 0;
@@ -685,7 +685,7 @@ avm_l2l1B(struct mISDNchannel *ch, struct sk_buff *skb)
                spin_unlock_irqrestore(&fc->lock, flags);
                if (!ret)
                        _queue_data(ch, PH_ACTIVATE_IND, MISDN_ID_ANY, 0,
-                               NULL, GFP_KERNEL);
+                                   NULL, GFP_KERNEL);
                break;
        case PH_DEACTIVATE_REQ:
                spin_lock_irqsave(&fc->lock, flags);
@@ -693,7 +693,7 @@ avm_l2l1B(struct mISDNchannel *ch, struct sk_buff *skb)
                modehdlc(bch, ISDN_P_NONE);
                spin_unlock_irqrestore(&fc->lock, flags);
                _queue_data(ch, PH_DEACTIVATE_IND, MISDN_ID_ANY, 0,
-                       NULL, GFP_KERNEL);
+                           NULL, GFP_KERNEL);
                ret = 0;
                break;
        }
@@ -749,7 +749,7 @@ reset_avm(struct fritzcard *fc)
        mdelay(1);
        if (debug & DEBUG_HW)
                pr_notice("%s: S0/S1 %x/%x\n", fc->name,
-                       inb(fc->addr + 2), inb(fc->addr + 3));
+                         inb(fc->addr + 2), inb(fc->addr + 3));
 }
 
 static int
@@ -761,10 +761,10 @@ init_card(struct fritzcard *fc)
        reset_avm(fc); /* disable IRQ */
        if (fc->type == AVM_FRITZ_PCIV2)
                ret = request_irq(fc->irq, avm_fritzv2_interrupt,
-                       IRQF_SHARED, fc->name, fc);
+                                 IRQF_SHARED, fc->name, fc);
        else
                ret = request_irq(fc->irq, avm_fritz_interrupt,
-                       IRQF_SHARED, fc->name, fc);
+                                 IRQF_SHARED, fc->name, fc);
        if (ret) {
                pr_info("%s: couldn't get interrupt %d\n",
                        fc->name, fc->irq);
@@ -795,7 +795,7 @@ init_card(struct fritzcard *fc)
                msleep_interruptible(10);
                if (debug & DEBUG_HW)
                        pr_notice("%s: IRQ %d count %d\n", fc->name,
-                               fc->irq, fc->irqcnt);
+                                 fc->irq, fc->irqcnt);
                if (!fc->irqcnt) {
                        pr_info("%s: IRQ(%d) getting no IRQs during init %d\n",
                                fc->name, fc->irq, 3 - cnt);
@@ -817,7 +817,7 @@ channel_bctrl(struct bchannel *bch, struct mISDN_ctrl_req *cq)
        case MISDN_CTRL_GETOP:
                cq->op = 0;
                break;
-       /* Nothing implemented yet */
+               /* Nothing implemented yet */
        case MISDN_CTRL_FILL_EMPTY:
        default:
                pr_info("%s: %s unknown Op %x\n", fc->name, __func__, cq->op);
@@ -931,7 +931,7 @@ avm_dctrl(struct mISDNchannel *ch, u32 cmd, void *arg)
                break;
        case CLOSE_CHANNEL:
                pr_debug("%s: dev(%d) close from %p\n", fc->name, dch->dev.id,
-                       __builtin_return_address(0));
+                        __builtin_return_address(0));
                module_put(THIS_MODULE);
                break;
        case CONTROL_CHANNEL:
@@ -939,7 +939,7 @@ avm_dctrl(struct mISDNchannel *ch, u32 cmd, void *arg)
                break;
        default:
                pr_debug("%s: %s unknown command %x\n",
-                       fc->name, __func__, cmd);
+                        fc->name, __func__, cmd);
                return -EINVAL;
        }
        return err;
@@ -963,7 +963,7 @@ setup_fritz(struct fritzcard *fc)
                if (debug & DEBUG_HW) {
                        pr_notice("%s: PCI stat %#x\n", fc->name, val);
                        pr_notice("%s: PCI Class %X Rev %d\n", fc->name,
-                               val & 0xff, (val >> 8) & 0xff);
+                                 val & 0xff, (val >> 8) & 0xff);
                        pr_notice("%s: HDLC version %x\n", fc->name, ver & 0xf);
                }
                ASSIGN_FUNC(V1, ISAC, fc->isac);
@@ -975,7 +975,7 @@ setup_fritz(struct fritzcard *fc)
                if (debug & DEBUG_HW) {
                        pr_notice("%s: PCI V2 stat %#x\n", fc->name, val);
                        pr_notice("%s: PCI V2 Class %X Rev %d\n", fc->name,
-                               val & 0xff, (val>>8) & 0xff);
+                                 val & 0xff, (val >> 8) & 0xff);
                        pr_notice("%s: HDLC version %x\n", fc->name, ver & 0xf);
                }
                ASSIGN_FUNC(V2, ISAC, fc->isac);
@@ -987,8 +987,8 @@ setup_fritz(struct fritzcard *fc)
                return -ENODEV;
        }
        pr_notice("%s: %s config irq:%d base:0x%X\n", fc->name,
-               (fc->type == AVM_FRITZ_PCI) ? "AVM Fritz!CARD PCI" :
-               "AVM Fritz!CARD PCIv2", fc->irq, fc->addr);
+                 (fc->type == AVM_FRITZ_PCI) ? "AVM Fritz!CARD PCI" :
+                 "AVM Fritz!CARD PCIv2", fc->irq, fc->addr);
        return 0;
 }
 
@@ -1035,7 +1035,7 @@ setup_instance(struct fritzcard *card)
        mISDNisac_init(&card->isac, card);
 
        card->isac.dch.dev.Bprotocols = (1 << (ISDN_P_B_RAW & ISDN_P_B_MASK)) |
-           (1 << (ISDN_P_B_HDLC & ISDN_P_B_MASK));
+               (1 << (ISDN_P_B_HDLC & ISDN_P_B_MASK));
        card->isac.dch.dev.D.ctrl = avm_dctrl;
        for (i = 0; i < 2; i++) {
                card->bch[i].nr = i + 1;
@@ -1051,7 +1051,7 @@ setup_instance(struct fritzcard *card)
        if (err)
                goto error;
        err = mISDN_register_device(&card->isac.dch.dev, &card->pdev->dev,
-               card->name);
+                                   card->name);
        if (err)
                goto error_reg;
        err = init_card(card);
@@ -1097,7 +1097,7 @@ fritzpci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
        }
 
        pr_notice("mISDN: found adapter %s at %s\n",
-              (char *) ent->driver_data, pci_name(pdev));
+                 (char *) ent->driver_data, pci_name(pdev));
 
        card->addr = pci_resource_start(pdev, 1);
        card->irq = pdev->irq;
index 0c77386..b0588ac 100644 (file)
  */
 
 /*
-#define MAX_FRAME_SIZE 2048
+  #define MAX_FRAME_SIZE       2048
 */
 
 struct hfc_chan {
        struct dchannel *dch;   /* link if channel is a D-channel */
        struct bchannel *bch;   /* link if channel is a B-channel */
-       int             port;   /* the interface port this */
+       int             port;   /* the interface port this */
                                /* channel is associated with */
        int             nt_timer; /* -1 if off, 0 if elapsed, >0 if running */
        int             los, ais, slip_tx, slip_rx, rdi; /* current alarms */
@@ -89,7 +89,7 @@ struct hfcm_hw {
 #define        HFC_CFG_REPORT_RDI      8 /* the card should report remote alarm */
 #define        HFC_CFG_DTMF            9 /* enable DTMF-detection */
 #define        HFC_CFG_CRC4            10 /* disable CRC-4 Multiframe mode, */
-                                       /* use double frame instead. */
+/* use double frame instead. */
 
 #define HFC_TYPE_E1            1 /* controller is HFC-E1 */
 #define HFC_TYPE_4S            4 /* controller is HFC-4S */
@@ -109,9 +109,9 @@ struct hfcm_hw {
 #define        HFC_CHIP_E1CLOCK_GET    10 /* always get clock from E1 interface */
 #define        HFC_CHIP_E1CLOCK_PUT    11 /* always put clock from E1 interface */
 #define        HFC_CHIP_WATCHDOG       12 /* whether we should send signals */
-                                       /* to the watchdog */
+/* to the watchdog */
 #define        HFC_CHIP_B410P          13 /* whether we have a b410p with echocan in */
-                                       /* hw */
+/* hw */
 #define        HFC_CHIP_PLXSD          14 /* whether we have a Speech-Design PLX */
 #define        HFC_CHIP_EMBSD          15 /* whether we have a SD Embedded board */
 
@@ -148,26 +148,26 @@ struct hfc_multi {
        int             io_mode; /* selects mode */
 #ifdef HFC_REGISTER_DEBUG
        void            (*HFC_outb)(struct hfc_multi *hc, u_char reg,
-                               u_char val, const char *function, int line);
+                                   u_char val, const char *function, int line);
        void            (*HFC_outb_nodebug)(struct hfc_multi *hc, u_char reg,
-                               u_char val, const char *function, int line);
+                                           u_char val, const char *function, int line);
        u_char          (*HFC_inb)(struct hfc_multi *hc, u_char reg,
-                               const char *function, int line);
+                                  const char *function, int line);
        u_char          (*HFC_inb_nodebug)(struct hfc_multi *hc, u_char reg,
-                               const char *function, int line);
+                                          const char *function, int line);
        u_short         (*HFC_inw)(struct hfc_multi *hc, u_char reg,
-                               const char *function, int line);
+                                  const char *function, int line);
        u_short         (*HFC_inw_nodebug)(struct hfc_multi *hc, u_char reg,
-                               const char *function, int line);
+                                          const char *function, int line);
        void            (*HFC_wait)(struct hfc_multi *hc,
-                               const char *function, int line);
+                                   const char *function, int line);
        void            (*HFC_wait_nodebug)(struct hfc_multi *hc,
-                               const char *function, int line);
+                                           const char *function, int line);
 #else
        void            (*HFC_outb)(struct hfc_multi *hc, u_char reg,
-                               u_char val);
+                                   u_char val);
        void            (*HFC_outb_nodebug)(struct hfc_multi *hc, u_char reg,
-                               u_char val);
+                                           u_char val);
        u_char          (*HFC_inb)(struct hfc_multi *hc, u_char reg);
        u_char          (*HFC_inb_nodebug)(struct hfc_multi *hc, u_char reg);
        u_short         (*HFC_inw)(struct hfc_multi *hc, u_char reg);
@@ -176,9 +176,9 @@ struct hfc_multi {
        void            (*HFC_wait_nodebug)(struct hfc_multi *hc);
 #endif
        void            (*read_fifo)(struct hfc_multi *hc, u_char *data,
-                               int len);
+                                    int len);
        void            (*write_fifo)(struct hfc_multi *hc, u_char *data,
-                               int len);
+                                     int len);
        u_long          pci_origmembase, plx_origmembase;
        void __iomem    *pci_membase; /* PCI memory */
        void __iomem    *plx_membase; /* PLX memory */
@@ -211,10 +211,10 @@ struct hfc_multi {
                                        /* an optical Interface */
        int             dslot;  /* channel # of d-channel (E1) default 16 */
 
-       u_long          wdcount;        /* every 500 ms we need to */
+       u_long          wdcount;        /* every 500 ms we need to */
                                        /* send the watchdog a signal */
        u_char          wdbyte; /* watchdog toggle byte */
-       u_int           activity[8];    /* if there is any action on this */
+       u_int           activity[8];    /* if there is any action on this */
                                        /* port (will be cleared after */
                                        /* showing led-states) */
        int             e1_state; /* keep track of last state */
@@ -268,7 +268,7 @@ struct hfc_multi {
 #define PLX_DSP_RES_N          PLX_GPIO8
 /* GPIO4..8 Enable & Set to OUT, SLAVE_EN_N = 1 */
 #define PLX_GPIOC_INIT         (PLX_GPIO4_DIR | PLX_GPIO5_DIR | PLX_GPIO6_DIR \
-                       | PLX_GPIO7_DIR | PLX_GPIO8_DIR | PLX_SLAVE_EN_N)
+                                | PLX_GPIO7_DIR | PLX_GPIO8_DIR | PLX_SLAVE_EN_N)
 
 /* PLX Interrupt Control/STATUS */
 #define PLX_INTCSR_LINTI1_ENABLE 0x01
@@ -290,7 +290,7 @@ struct hfc_multi {
 /* write only registers */
 #define R_CIRM                 0x00
 #define R_CTRL                 0x01
-#define R_BRG_PCM_CFG          0x02
+#define R_BRG_PCM_CFG          0x02
 #define R_RAM_ADDR0            0x08
 #define R_RAM_ADDR1            0x09
 #define R_RAM_ADDR2            0x0A
@@ -687,8 +687,8 @@ struct hfc_multi {
 #define V_NEG_CLK              0x08
 #define V_HCLK                 0x10
 /*
-#define V_JATT_AUTO_DEL                0x20
-#define V_JATT_AUTO            0x40
+  #define V_JATT_AUTO_DEL              0x20
+  #define V_JATT_AUTO          0x40
 */
 #define V_JATT_OFF             0x80
 /* R_STATE */
@@ -1230,4 +1230,3 @@ struct hfc_register_names {
        {"R_IRQ_FIFO_BL7",      0xCF},
 };
 #endif /* HFC_REGISTER_DEBUG */
-
index 45ddced..0eafe9f 100644 (file)
@@ -16,9 +16,9 @@
 static void
 #ifdef HFC_REGISTER_DEBUG
 HFC_outb_embsd(struct hfc_multi *hc, u_char reg, u_char val,
-               const char *function, int line)
+              const char *function, int line)
 #else
-HFC_outb_embsd(struct hfc_multi *hc, u_char reg, u_char val)
+       HFC_outb_embsd(struct hfc_multi *hc, u_char reg, u_char val)
 #endif
 {
        hc->immap->im_ioport.iop_padat |= PA_XHFC_A0;
@@ -30,7 +30,7 @@ static u_char
 #ifdef HFC_REGISTER_DEBUG
 HFC_inb_embsd(struct hfc_multi *hc, u_char reg, const char *function, int line)
 #else
-HFC_inb_embsd(struct hfc_multi *hc, u_char reg)
+       HFC_inb_embsd(struct hfc_multi *hc, u_char reg)
 #endif
 {
        hc->immap->im_ioport.iop_padat |= PA_XHFC_A0;
@@ -42,7 +42,7 @@ static u_short
 #ifdef HFC_REGISTER_DEBUG
 HFC_inw_embsd(struct hfc_multi *hc, u_char reg, const char *function, int line)
 #else
-HFC_inw_embsd(struct hfc_multi *hc, u_char reg)
+       HFC_inw_embsd(struct hfc_multi *hc, u_char reg)
 #endif
 {
        hc->immap->im_ioport.iop_padat |= PA_XHFC_A0;
@@ -54,7 +54,7 @@ static void
 #ifdef HFC_REGISTER_DEBUG
 HFC_wait_embsd(struct hfc_multi *hc, const char *function, int line)
 #else
-HFC_wait_embsd(struct hfc_multi *hc)
+       HFC_wait_embsd(struct hfc_multi *hc)
 #endif
 {
        hc->immap->im_ioport.iop_padat |= PA_XHFC_A0;
@@ -96,8 +96,8 @@ static int
 setup_embedded(struct hfc_multi *hc, struct hm_map *m)
 {
        printk(KERN_INFO
-           "HFC-multi: card manufacturer: '%s' card name: '%s' clock: %s\n",
-           m->vendor_name, m->card_name, m->clock2 ? "double" : "normal");
+              "HFC-multi: card manufacturer: '%s' card name: '%s' clock: %s\n",
+              m->vendor_name, m->card_name, m->clock2 ? "double" : "normal");
 
        hc->pci_dev = NULL;
        if (m->clock2)
@@ -129,20 +129,20 @@ setup_embedded(struct hfc_multi *hc, struct hm_map *m)
                hc->write_fifo = write_fifo_embsd;
                hc->xhfc_origmembase = XHFC_MEMBASE + XHFC_OFFSET * hc->id;
                hc->xhfc_membase = (u_char *)ioremap(hc->xhfc_origmembase,
-                               XHFC_MEMSIZE);
+                                                    XHFC_MEMSIZE);
                if (!hc->xhfc_membase) {
                        printk(KERN_WARNING
-                           "HFC-multi: failed to remap xhfc address space. "
-                           "(internal error)\n");
+                              "HFC-multi: failed to remap xhfc address space. "
+                              "(internal error)\n");
                        return -EIO;
                }
                hc->xhfc_memaddr = (u_long *)(hc->xhfc_membase + 4);
                hc->xhfc_memdata = (u_long *)(hc->xhfc_membase);
                printk(KERN_INFO
-                   "HFC-multi: xhfc_membase:%#lx xhfc_origmembase:%#lx "
-                   "xhfc_memaddr:%#lx xhfc_memdata:%#lx\n",
-                   (u_long)hc->xhfc_membase, hc->xhfc_origmembase,
-                   (u_long)hc->xhfc_memaddr, (u_long)hc->xhfc_memdata);
+                      "HFC-multi: xhfc_membase:%#lx xhfc_origmembase:%#lx "
+                      "xhfc_memaddr:%#lx xhfc_memdata:%#lx\n",
+                      (u_long)hc->xhfc_membase, hc->xhfc_origmembase,
+                      (u_long)hc->xhfc_memaddr, (u_long)hc->xhfc_memdata);
                break;
        default:
                printk(KERN_WARNING "HFC-multi: Invalid IO mode.\n");
index 3132ddc..411cd10 100644 (file)
@@ -58,7 +58,7 @@
 /* GCI/IOM bus configuration registers */
 #define HFCPCI_MST_EMOD                0xB4
 #define HFCPCI_MST_MODE                0xB8
-#define HFCPCI_CONNECT                 0xBC
+#define HFCPCI_CONNECT         0xBC
 
 
 /* Interrupt and status registers */
@@ -189,18 +189,18 @@ struct zt {
 
 struct dfifo {
        u_char data[D_FIFO_SIZE]; /* FIFO data space */
-       u_char fill1[0x20A0-D_FIFO_SIZE]; /* reserved, do not use */
+       u_char fill1[0x20A0 - D_FIFO_SIZE]; /* reserved, do not use */
        u_char f1, f2; /* f pointers */
-       u_char fill2[0x20C0-0x20A2]; /* reserved, do not use */
+       u_char fill2[0x20C0 - 0x20A2]; /* reserved, do not use */
        /* mask index with D_FREG_MASK for access */
-       struct zt za[MAX_D_FRAMES+1];
-       u_char fill3[0x4000-0x2100]; /* align 16K */
+       struct zt za[MAX_D_FRAMES + 1];
+       u_char fill3[0x4000 - 0x2100]; /* align 16K */
 };
 
 struct bzfifo {
-       struct zt       za[MAX_B_FRAMES+1]; /* only range 0x0..0x1F allowed */
+       struct zt       za[MAX_B_FRAMES + 1]; /* only range 0x0..0x1F allowed */
        u_char          f1, f2; /* f pointers */
-       u_char          fill[0x2100-0x2082]; /* alignment */
+       u_char          fill[0x2100 - 0x2082]; /* alignment */
 };
 
 
@@ -224,5 +224,5 @@ union fifo_area {
        u_char fill[32768];
 };
 
-#define Write_hfc(a, b, c) (writeb(c, (a->hw.pci_io)+b))
-#define Read_hfc(a, b) (readb((a->hw.pci_io)+b))
+#define Write_hfc(a, b, c) (writeb(c, (a->hw.pci_io) + b))
+#define Read_hfc(a, b) (readb((a->hw.pci_io) + b))
index a440d7f..0332231 100644 (file)
  *
  * hwid:
  *     NOTE: only one hwid value must be given once
- *     Enable special embedded devices with XHFC controllers.
+ *     Enable special embedded devices with XHFC controllers.
  */
 
 /*
 #include <linux/mISDNdsp.h>
 
 /*
-#define IRQCOUNT_DEBUG
-#define IRQ_DEBUG
+  #define IRQCOUNT_DEBUG
+  #define IRQ_DEBUG
 */
 
 #include "hfc_multi.h"
@@ -237,21 +237,21 @@ module_param_array(port, uint, NULL, S_IRUGO | S_IWUSR);
 module_param(hwid, uint, S_IRUGO | S_IWUSR); /* The hardware ID */
 
 #ifdef HFC_REGISTER_DEBUG
-#define HFC_outb(hc, reg, val) \
+#define HFC_outb(hc, reg, val)                                 \
        (hc->HFC_outb(hc, reg, val, __func__, __LINE__))
-#define HFC_outb_nodebug(hc, reg, val) \
+#define HFC_outb_nodebug(hc, reg, val)                                 \
        (hc->HFC_outb_nodebug(hc, reg, val, __func__, __LINE__))
-#define HFC_inb(hc, reg) \
+#define HFC_inb(hc, reg)                               \
        (hc->HFC_inb(hc, reg, __func__, __LINE__))
-#define HFC_inb_nodebug(hc, reg) \
+#define HFC_inb_nodebug(hc, reg)                               \
        (hc->HFC_inb_nodebug(hc, reg, __func__, __LINE__))
-#define HFC_inw(hc, reg) \
+#define HFC_inw(hc, reg)                               \
        (hc->HFC_inw(hc, reg, __func__, __LINE__))
-#define HFC_inw_nodebug(hc, reg) \
+#define HFC_inw_nodebug(hc, reg)                               \
        (hc->HFC_inw_nodebug(hc, reg, __func__, __LINE__))
-#define HFC_wait(hc) \
+#define HFC_wait(hc)                           \
        (hc->HFC_wait(hc, __func__, __LINE__))
-#define HFC_wait_nodebug(hc) \
+#define HFC_wait_nodebug(hc)                           \
        (hc->HFC_wait_nodebug(hc, __func__, __LINE__))
 #else
 #define HFC_outb(hc, reg, val)         (hc->HFC_outb(hc, reg, val))
@@ -274,7 +274,7 @@ static void
 HFC_outb_pcimem(struct hfc_multi *hc, u_char reg, u_char val,
                const char *function, int line)
 #else
-HFC_outb_pcimem(struct hfc_multi *hc, u_char reg, u_char val)
+       HFC_outb_pcimem(struct hfc_multi *hc, u_char reg, u_char val)
 #endif
 {
        writeb(val, hc->pci_membase + reg);
@@ -283,7 +283,7 @@ static u_char
 #ifdef HFC_REGISTER_DEBUG
 HFC_inb_pcimem(struct hfc_multi *hc, u_char reg, const char *function, int line)
 #else
-HFC_inb_pcimem(struct hfc_multi *hc, u_char reg)
+       HFC_inb_pcimem(struct hfc_multi *hc, u_char reg)
 #endif
 {
        return readb(hc->pci_membase + reg);
@@ -292,7 +292,7 @@ static u_short
 #ifdef HFC_REGISTER_DEBUG
 HFC_inw_pcimem(struct hfc_multi *hc, u_char reg, const char *function, int line)
 #else
-HFC_inw_pcimem(struct hfc_multi *hc, u_char reg)
+       HFC_inw_pcimem(struct hfc_multi *hc, u_char reg)
 #endif
 {
        return readw(hc->pci_membase + reg);
@@ -301,7 +301,7 @@ static void
 #ifdef HFC_REGISTER_DEBUG
 HFC_wait_pcimem(struct hfc_multi *hc, const char *function, int line)
 #else
-HFC_wait_pcimem(struct hfc_multi *hc)
+       HFC_wait_pcimem(struct hfc_multi *hc)
 #endif
 {
        while (readb(hc->pci_membase + R_STATUS) & V_BUSY)
@@ -312,9 +312,9 @@ HFC_wait_pcimem(struct hfc_multi *hc)
 static void
 #ifdef HFC_REGISTER_DEBUG
 HFC_outb_regio(struct hfc_multi *hc, u_char reg, u_char val,
-       const char *function, int line)
+              const char *function, int line)
 #else
-HFC_outb_regio(struct hfc_multi *hc, u_char reg, u_char val)
+       HFC_outb_regio(struct hfc_multi *hc, u_char reg, u_char val)
 #endif
 {
        outb(reg, hc->pci_iobase + 4);
@@ -324,7 +324,7 @@ static u_char
 #ifdef HFC_REGISTER_DEBUG
 HFC_inb_regio(struct hfc_multi *hc, u_char reg, const char *function, int line)
 #else
-HFC_inb_regio(struct hfc_multi *hc, u_char reg)
+       HFC_inb_regio(struct hfc_multi *hc, u_char reg)
 #endif
 {
        outb(reg, hc->pci_iobase + 4);
@@ -334,7 +334,7 @@ static u_short
 #ifdef HFC_REGISTER_DEBUG
 HFC_inw_regio(struct hfc_multi *hc, u_char reg, const char *function, int line)
 #else
-HFC_inw_regio(struct hfc_multi *hc, u_char reg)
+       HFC_inw_regio(struct hfc_multi *hc, u_char reg)
 #endif
 {
        outb(reg, hc->pci_iobase + 4);
@@ -344,7 +344,7 @@ static void
 #ifdef HFC_REGISTER_DEBUG
 HFC_wait_regio(struct hfc_multi *hc, const char *function, int line)
 #else
-HFC_wait_regio(struct hfc_multi *hc)
+       HFC_wait_regio(struct hfc_multi *hc)
 #endif
 {
        outb(R_STATUS, hc->pci_iobase + 4);
@@ -355,7 +355,7 @@ HFC_wait_regio(struct hfc_multi *hc)
 #ifdef HFC_REGISTER_DEBUG
 static void
 HFC_outb_debug(struct hfc_multi *hc, u_char reg, u_char val,
-               const char *function, int line)
+              const char *function, int line)
 {
        char regname[256] = "", bits[9] = "xxxxxxxx";
        int i;
@@ -377,8 +377,8 @@ HFC_outb_debug(struct hfc_multi *hc, u_char reg, u_char val,
        bits[1] = '0' + (!!(val & 64));
        bits[0] = '0' + (!!(val & 128));
        printk(KERN_DEBUG
-           "HFC_outb(chip %d, %02x=%s, 0x%02x=%s); in %s() line %d\n",
-           hc->id, reg, regname, val, bits, function, line);
+              "HFC_outb(chip %d, %02x=%s, 0x%02x=%s); in %s() line %d\n",
+              hc->id, reg, regname, val, bits, function, line);
        HFC_outb_nodebug(hc, reg, val);
 }
 static u_char
@@ -407,8 +407,8 @@ HFC_inb_debug(struct hfc_multi *hc, u_char reg, const char *function, int line)
        bits[1] = '0' + (!!(val & 64));
        bits[0] = '0' + (!!(val & 128));
        printk(KERN_DEBUG
-           "HFC_inb(chip %d, %02x=%s) = 0x%02x=%s; in %s() line %d\n",
-           hc->id, reg, regname, val, bits, function, line);
+              "HFC_inb(chip %d, %02x=%s) = 0x%02x=%s; in %s() line %d\n",
+              hc->id, reg, regname, val, bits, function, line);
        return val;
 }
 static u_short
@@ -429,15 +429,15 @@ HFC_inw_debug(struct hfc_multi *hc, u_char reg, const char *function, int line)
                strcpy(regname, "register");
 
        printk(KERN_DEBUG
-           "HFC_inw(chip %d, %02x=%s) = 0x%04x; in %s() line %d\n",
-           hc->id, reg, regname, val, function, line);
+              "HFC_inw(chip %d, %02x=%s) = 0x%04x; in %s() line %d\n",
+              hc->id, reg, regname, val, function, line);
        return val;
 }
 static void
 HFC_wait_debug(struct hfc_multi *hc, const char *function, int line)
 {
        printk(KERN_DEBUG "HFC_wait(chip %d); in %s() line %d\n",
-           hc->id, function, line);
+              hc->id, function, line);
        HFC_wait_nodebug(hc);
 }
 #endif
@@ -446,13 +446,13 @@ HFC_wait_debug(struct hfc_multi *hc, const char *function, int line)
 static void
 write_fifo_regio(struct hfc_multi *hc, u_char *data, int len)
 {
-       outb(A_FIFO_DATA0, (hc->pci_iobase)+4);
-       while (len>>2) {
+       outb(A_FIFO_DATA0, (hc->pci_iobase) + 4);
+       while (len >> 2) {
                outl(cpu_to_le32(*(u32 *)data), hc->pci_iobase);
                data += 4;
                len -= 4;
        }
-       while (len>>1) {
+       while (len >> 1) {
                outw(cpu_to_le16(*(u16 *)data), hc->pci_iobase);
                data += 2;
                len -= 2;
@@ -467,15 +467,15 @@ write_fifo_regio(struct hfc_multi *hc, u_char *data, int len)
 static void
 write_fifo_pcimem(struct hfc_multi *hc, u_char *data, int len)
 {
-       while (len>>2) {
+       while (len >> 2) {
                writel(cpu_to_le32(*(u32 *)data),
-                       hc->pci_membase + A_FIFO_DATA0);
+                      hc->pci_membase + A_FIFO_DATA0);
                data += 4;
                len -= 4;
        }
-       while (len>>1) {
+       while (len >> 1) {
                writew(cpu_to_le16(*(u16 *)data),
-                       hc->pci_membase + A_FIFO_DATA0);
+                      hc->pci_membase + A_FIFO_DATA0);
                data += 2;
                len -= 2;
        }
@@ -490,13 +490,13 @@ write_fifo_pcimem(struct hfc_multi *hc, u_char *data, int len)
 static void
 read_fifo_regio(struct hfc_multi *hc, u_char *data, int len)
 {
-       outb(A_FIFO_DATA0, (hc->pci_iobase)+4);
-       while (len>>2) {
+       outb(A_FIFO_DATA0, (hc->pci_iobase) + 4);
+       while (len >> 2) {
                *(u32 *)data = le32_to_cpu(inl(hc->pci_iobase));
                data += 4;
                len -= 4;
        }
-       while (len>>1) {
+       while (len >> 1) {
                *(u16 *)data = le16_to_cpu(inw(hc->pci_iobase));
                data += 2;
                len -= 2;
@@ -512,13 +512,13 @@ read_fifo_regio(struct hfc_multi *hc, u_char *data, int len)
 static void
 read_fifo_pcimem(struct hfc_multi *hc, u_char *data, int len)
 {
-       while (len>>2) {
+       while (len >> 2) {
                *(u32 *)data =
                        le32_to_cpu(readl(hc->pci_membase + A_FIFO_DATA0));
                data += 4;
                len -= 4;
        }
-       while (len>>1) {
+       while (len >> 1) {
                *(u16 *)data =
                        le16_to_cpu(readw(hc->pci_membase + A_FIFO_DATA0));
                data += 2;
@@ -607,7 +607,7 @@ writepcibridge(struct hfc_multi *hc, unsigned char address, unsigned char data)
        outw(cipv, hc->pci_iobase + 4);
        /* define a 32 bit dword with 4 identical bytes for write sequence */
        datav = data | ((__u32) data << 8) | ((__u32) data << 16) |
-           ((__u32) data << 24);
+               ((__u32) data << 24);
 
        /*
         * write this 32 bit dword to the bridge data port
@@ -699,7 +699,7 @@ vpm_in(struct hfc_multi *c, int which, unsigned short addr)
 
 inline void
 vpm_out(struct hfc_multi *c, int which, unsigned short addr,
-    unsigned char data)
+       unsigned char data)
 {
        vpm_write_address(c, addr);
 
@@ -717,11 +717,11 @@ vpm_out(struct hfc_multi *c, int which, unsigned short addr,
        disablepcibridge(c);
 
        {
-       unsigned char regin;
-       regin = vpm_in(c, which, addr);
-       if (regin != data)
-               printk(KERN_DEBUG "Wrote 0x%x to register 0x%x but got back "
-                       "0x%x\n", data, addr, regin);
+               unsigned char regin;
+               regin = vpm_in(c, which, addr);
+               if (regin != data)
+                       printk(KERN_DEBUG "Wrote 0x%x to register 0x%x but got back "
+                              "0x%x\n", data, addr, regin);
        }
 
 }
@@ -853,16 +853,16 @@ vpm_echocan_on(struct hfc_multi *hc, int ch, int taps)
 
 #ifdef TXADJ
        skb = _alloc_mISDN_skb(PH_CONTROL_IND, HFC_VOL_CHANGE_TX,
-               sizeof(int), &txadj, GFP_ATOMIC);
+                              sizeof(int), &txadj, GFP_ATOMIC);
        if (skb)
                recv_Bchannel_skb(bch, skb);
 #endif
 
-       timeslot = ((ch/4)*8) + ((ch%4)*4) + 1;
+       timeslot = ((ch / 4) * 8) + ((ch % 4) * 4) + 1;
        unit = ch % 4;
 
        printk(KERN_NOTICE "vpm_echocan_on called taps [%d] on timeslot %d\n",
-           taps, timeslot);
+              taps, timeslot);
 
        vpm_out(hc, unit, timeslot, 0x7e);
 }
@@ -886,16 +886,16 @@ vpm_echocan_off(struct hfc_multi *hc, int ch)
 
 #ifdef TXADJ
        skb = _alloc_mISDN_skb(PH_CONTROL_IND, HFC_VOL_CHANGE_TX,
-               sizeof(int), &txadj, GFP_ATOMIC);
+                              sizeof(int), &txadj, GFP_ATOMIC);
        if (skb)
                recv_Bchannel_skb(bch, skb);
 #endif
 
-       timeslot = ((ch/4)*8) + ((ch%4)*4) + 1;
+       timeslot = ((ch / 4) * 8) + ((ch % 4) * 4) + 1;
        unit = ch % 4;
 
        printk(KERN_NOTICE "vpm_echocan_off called on timeslot %d\n",
-           timeslot);
+              timeslot);
        /* FILLME */
        vpm_out(hc, unit, timeslot, 0x01);
 }
@@ -920,7 +920,7 @@ hfcmulti_resync(struct hfc_multi *locked, struct hfc_multi *newmaster, int rm)
 
        if (debug & DEBUG_HFCMULTI_PLXSD)
                printk(KERN_DEBUG "%s: RESYNC(syncmaster=0x%p)\n",
-                       __func__, syncmaster);
+                      __func__, syncmaster);
 
        /* select new master */
        if (newmaster) {
@@ -949,7 +949,7 @@ hfcmulti_resync(struct hfc_multi *locked, struct hfc_multi *newmaster, int rm)
                                if (hc->ctype == HFC_TYPE_E1) {
                                        if (debug & DEBUG_HFCMULTI_PLXSD)
                                                printk(KERN_DEBUG
-                                                       "Schedule SYNC_I\n");
+                                                      "Schedule SYNC_I\n");
                                        hc->e1_resync |= 1; /* get SYNC_I */
                                }
                        }
@@ -960,7 +960,7 @@ hfcmulti_resync(struct hfc_multi *locked, struct hfc_multi *newmaster, int rm)
                hc = newmaster;
                if (debug & DEBUG_HFCMULTI_PLXSD)
                        printk(KERN_DEBUG "id=%d (0x%p) = syncronized with "
-                               "interface.\n", hc->id, hc);
+                              "interface.\n", hc->id, hc);
                /* Enable new sync master */
                plx_acc_32 = hc->plx_membase + PLX_GPIOC;
                pv = readl(plx_acc_32);
@@ -968,7 +968,7 @@ hfcmulti_resync(struct hfc_multi *locked, struct hfc_multi *newmaster, int rm)
                writel(pv, plx_acc_32);
                /* switch to jatt PLL, if not disabled by RX_SYNC */
                if (hc->ctype == HFC_TYPE_E1
-                               && !test_bit(HFC_CHIP_RX_SYNC, &hc->chip)) {
+                   && !test_bit(HFC_CHIP_RX_SYNC, &hc->chip)) {
                        if (debug & DEBUG_HFCMULTI_PLXSD)
                                printk(KERN_DEBUG "Schedule jatt PLL\n");
                        hc->e1_resync |= 2; /* switch to jatt */
@@ -978,20 +978,20 @@ hfcmulti_resync(struct hfc_multi *locked, struct hfc_multi *newmaster, int rm)
                        hc = pcmmaster;
                        if (debug & DEBUG_HFCMULTI_PLXSD)
                                printk(KERN_DEBUG
-                                       "id=%d (0x%p) = PCM master syncronized "
-                                       "with QUARTZ\n", hc->id, hc);
+                                      "id=%d (0x%p) = PCM master syncronized "
+                                      "with QUARTZ\n", hc->id, hc);
                        if (hc->ctype == HFC_TYPE_E1) {
                                /* Use the crystal clock for the PCM
                                   master card */
                                if (debug & DEBUG_HFCMULTI_PLXSD)
                                        printk(KERN_DEBUG
-                                           "Schedule QUARTZ for HFC-E1\n");
+                                              "Schedule QUARTZ for HFC-E1\n");
                                hc->e1_resync |= 4; /* switch quartz */
                        } else {
                                if (debug & DEBUG_HFCMULTI_PLXSD)
                                        printk(KERN_DEBUG
-                                           "QUARTZ is automatically "
-                                           "enabled by HFC-%dS\n", hc->ctype);
+                                              "QUARTZ is automatically "
+                                              "enabled by HFC-%dS\n", hc->ctype);
                        }
                        plx_acc_32 = hc->plx_membase + PLX_GPIOC;
                        pv = readl(plx_acc_32);
@@ -1000,7 +1000,7 @@ hfcmulti_resync(struct hfc_multi *locked, struct hfc_multi *newmaster, int rm)
                } else
                        if (!rm)
                                printk(KERN_ERR "%s no pcm master, this MUST "
-                                       "not happen!\n", __func__);
+                                      "not happen!\n", __func__);
        }
        syncmaster = newmaster;
 
@@ -1016,16 +1016,16 @@ plxsd_checksync(struct hfc_multi *hc, int rm)
                if (syncmaster == NULL) {
                        if (debug & DEBUG_HFCMULTI_PLXSD)
                                printk(KERN_DEBUG "%s: GOT sync on card %d"
-                                       " (id=%d)\n", __func__, hc->id + 1,
-                                       hc->id);
+                                      " (id=%d)\n", __func__, hc->id + 1,
+                                      hc->id);
                        hfcmulti_resync(hc, hc, rm);
                }
        } else {
                if (syncmaster == hc) {
                        if (debug & DEBUG_HFCMULTI_PLXSD)
                                printk(KERN_DEBUG "%s: LOST sync on card %d"
-                                       " (id=%d)\n", __func__, hc->id + 1,
-                                       hc->id);
+                                      " (id=%d)\n", __func__, hc->id + 1,
+                                      hc->id);
                        hfcmulti_resync(hc, NULL, rm);
                }
        }
@@ -1057,7 +1057,7 @@ release_io_hfcmulti(struct hfc_multi *hc)
        if (test_bit(HFC_CHIP_PLXSD, &hc->chip) && hc->plx_membase) {
                if (debug & DEBUG_HFCMULTI_PLXSD)
                        printk(KERN_DEBUG "%s: release PLXSD card %d\n",
-                           __func__, hc->id + 1);
+                              __func__, hc->id + 1);
                spin_lock_irqsave(&plx_lock, plx_flags);
                plx_acc_32 = hc->plx_membase + PLX_GPIOC;
                writel(PLX_GPIOC_INIT, plx_acc_32);
@@ -1073,7 +1073,7 @@ release_io_hfcmulti(struct hfc_multi *hc)
                writel(pv, plx_acc_32);
                if (debug & DEBUG_HFCMULTI_INIT)
                        printk(KERN_DEBUG "%s: PCM off: PLX_GPIO=%x\n",
-                               __func__, pv);
+                              __func__, pv);
                spin_unlock_irqrestore(&plx_lock, plx_flags);
        }
 
@@ -1131,22 +1131,22 @@ init_chip(struct hfc_multi *hc)
        }
        rev = HFC_inb(hc, R_CHIP_RV);
        printk(KERN_INFO
-           "HFC_multi: detected HFC with chip ID=0x%lx revision=%ld%s\n",
-           val, rev, (rev == 0 && (hc->ctype != HFC_TYPE_XHFC)) ?
-               " (old FIFO handling)" : "");
+              "HFC_multi: detected HFC with chip ID=0x%lx revision=%ld%s\n",
+              val, rev, (rev == 0 && (hc->ctype != HFC_TYPE_XHFC)) ?
+              " (old FIFO handling)" : "");
        if (hc->ctype != HFC_TYPE_XHFC && rev == 0) {
                test_and_set_bit(HFC_CHIP_REVISION0, &hc->chip);
                printk(KERN_WARNING
-                   "HFC_multi: NOTE: Your chip is revision 0, "
-                   "ask Cologne Chip for update. Newer chips "
-                   "have a better FIFO handling. Old chips "
-                   "still work but may have slightly lower "
-                   "HDLC transmit performance.\n");
+                      "HFC_multi: NOTE: Your chip is revision 0, "
+                      "ask Cologne Chip for update. Newer chips "
+                      "have a better FIFO handling. Old chips "
+                      "still work but may have slightly lower "
+                      "HDLC transmit performance.\n");
        }
        if (rev > 1) {
                printk(KERN_WARNING "HFC_multi: WARNING: This driver doesn't "
-                   "consider chip revision = %ld. The chip / "
-                   "bridge may not work.\n", rev);
+                      "consider chip revision = %ld. The chip / "
+                      "bridge may not work.\n", rev);
        }
 
        /* set s-ram size */
@@ -1157,7 +1157,7 @@ init_chip(struct hfc_multi *hc)
        if (test_bit(HFC_CHIP_EXRAM_128, &hc->chip)) {
                if (debug & DEBUG_HFCMULTI_INIT)
                        printk(KERN_DEBUG "%s: changing to 128K extenal RAM\n",
-                           __func__);
+                              __func__);
                hc->hw.r_ctrl |= V_EXT_RAM;
                hc->hw.r_ram_sz = 1;
                hc->Flen = 0x20;
@@ -1168,7 +1168,7 @@ init_chip(struct hfc_multi *hc)
        if (test_bit(HFC_CHIP_EXRAM_512, &hc->chip)) {
                if (debug & DEBUG_HFCMULTI_INIT)
                        printk(KERN_DEBUG "%s: changing to 512K extenal RAM\n",
-                           __func__);
+                              __func__);
                hc->hw.r_ctrl |= V_EXT_RAM;
                hc->hw.r_ram_sz = 2;
                hc->Flen = 0x20;
@@ -1190,7 +1190,7 @@ init_chip(struct hfc_multi *hc)
        if (test_bit(HFC_CHIP_PLXSD, &hc->chip)) {
                if (debug & DEBUG_HFCMULTI_PLXSD)
                        printk(KERN_DEBUG "%s: initializing PLXSD card %d\n",
-                           __func__, hc->id + 1);
+                              __func__, hc->id + 1);
                spin_lock_irqsave(&plx_lock, plx_flags);
                plx_acc_32 = hc->plx_membase + PLX_GPIOC;
                writel(PLX_GPIOC_INIT, plx_acc_32);
@@ -1207,7 +1207,7 @@ init_chip(struct hfc_multi *hc)
                spin_unlock_irqrestore(&plx_lock, plx_flags);
                if (debug & DEBUG_HFCMULTI_INIT)
                        printk(KERN_DEBUG "%s: slave/term: PLX_GPIO=%x\n",
-                               __func__, pv);
+                              __func__, pv);
                /*
                 * If we are the 3rd PLXSD card or higher, we must turn
                 * termination of last PLXSD card off.
@@ -1225,8 +1225,8 @@ init_chip(struct hfc_multi *hc)
                if (plx_count >= 3) {
                        if (debug & DEBUG_HFCMULTI_PLXSD)
                                printk(KERN_DEBUG "%s: card %d is between, so "
-                                       "we disable termination\n",
-                                   __func__, plx_last_hc->id + 1);
+                                      "we disable termination\n",
+                                      __func__, plx_last_hc->id + 1);
                        spin_lock_irqsave(&plx_lock, plx_flags);
                        plx_acc_32 = plx_last_hc->plx_membase + PLX_GPIOC;
                        pv = readl(plx_acc_32);
@@ -1235,8 +1235,8 @@ init_chip(struct hfc_multi *hc)
                        spin_unlock_irqrestore(&plx_lock, plx_flags);
                        if (debug & DEBUG_HFCMULTI_INIT)
                                printk(KERN_DEBUG
-                                   "%s: term off: PLX_GPIO=%x\n",
-                                   __func__, pv);
+                                      "%s: term off: PLX_GPIO=%x\n",
+                                      __func__, pv);
                }
                spin_unlock_irqrestore(&HFClock, hfc_flags);
                hc->hw.r_pcm_md0 = V_F0_LEN; /* shift clock for DSP */
@@ -1253,24 +1253,24 @@ init_chip(struct hfc_multi *hc)
        if (test_bit(HFC_CHIP_PCM_SLAVE, &hc->chip)) {
                if (debug & DEBUG_HFCMULTI_INIT)
                        printk(KERN_DEBUG "%s: setting PCM into slave mode\n",
-                           __func__);
+                              __func__);
        } else
-       if (test_bit(HFC_CHIP_PCM_MASTER, &hc->chip) && !plxsd_master) {
-               if (debug & DEBUG_HFCMULTI_INIT)
-                       printk(KERN_DEBUG "%s: setting PCM into master mode\n",
-                           __func__);
-               hc->hw.r_pcm_md0 |= V_PCM_MD;
-       } else {
-               if (debug & DEBUG_HFCMULTI_INIT)
-                       printk(KERN_DEBUG "%s: performing PCM auto detect\n",
-                           __func__);
-       }
+               if (test_bit(HFC_CHIP_PCM_MASTER, &hc->chip) && !plxsd_master) {
+                       if (debug & DEBUG_HFCMULTI_INIT)
+                               printk(KERN_DEBUG "%s: setting PCM into master mode\n",
+                                      __func__);
+                       hc->hw.r_pcm_md0 |= V_PCM_MD;
+               } else {
+                       if (debug & DEBUG_HFCMULTI_INIT)
+                               printk(KERN_DEBUG "%s: performing PCM auto detect\n",
+                                      __func__);
+               }
 
        /* soft reset */
        HFC_outb(hc, R_CTRL, hc->hw.r_ctrl);
        if (hc->ctype == HFC_TYPE_XHFC)
                HFC_outb(hc, 0x0C /* R_FIFO_THRES */,
-                               0x11 /* 16 Bytes TX/RX */);
+                        0x11 /* 16 Bytes TX/RX */);
        else
                HFC_outb(hc, R_RAM_SZ, hc->hw.r_ram_sz);
        HFC_outb(hc, R_FIFO_MD, 0);
@@ -1298,13 +1298,13 @@ init_chip(struct hfc_multi *hc)
                        pv |= PLX_SYNC_O_EN;
                        if (debug & DEBUG_HFCMULTI_INIT)
                                printk(KERN_DEBUG "%s: master: PLX_GPIO=%x\n",
-                                       __func__, pv);
+                                      __func__, pv);
                } else {
                        pv &= ~(PLX_MASTER_EN | PLX_SLAVE_EN_N);
                        pv &= ~PLX_SYNC_O_EN;
                        if (debug & DEBUG_HFCMULTI_INIT)
                                printk(KERN_DEBUG "%s: slave: PLX_GPIO=%x\n",
-                                       __func__, pv);
+                                      __func__, pv);
                }
                writel(pv, plx_acc_32);
                spin_unlock_irqrestore(&plx_lock, plx_flags);
@@ -1338,7 +1338,7 @@ init_chip(struct hfc_multi *hc)
        if (test_bit(HFC_CHIP_CLOCK2, &hc->chip)) {
                if (debug & DEBUG_HFCMULTI_INIT)
                        printk(KERN_DEBUG
-                           "%s: setting double clock\n", __func__);
+                              "%s: setting double clock\n", __func__);
                HFC_outb(hc, R_BRG_PCM_CFG, V_PCM_CLK);
        }
 
@@ -1360,48 +1360,48 @@ init_chip(struct hfc_multi *hc)
        val += HFC_inb(hc, R_F0_CNTH) << 8;
        if (debug & DEBUG_HFCMULTI_INIT)
                printk(KERN_DEBUG
-                   "HFC_multi F0_CNT %ld after reset\n", val);
+                      "HFC_multi F0_CNT %ld after reset\n", val);
        spin_unlock_irqrestore(&hc->lock, flags);
        set_current_state(TASK_UNINTERRUPTIBLE);
-       schedule_timeout((HZ/100)?:1); /* Timeout minimum 10ms */
+       schedule_timeout((HZ / 100) ? : 1); /* Timeout minimum 10ms */
        spin_lock_irqsave(&hc->lock, flags);
        val2 = HFC_inb(hc, R_F0_CNTL);
        val2 += HFC_inb(hc, R_F0_CNTH) << 8;
        if (debug & DEBUG_HFCMULTI_INIT)
                printk(KERN_DEBUG
-                       "HFC_multi F0_CNT %ld after 10 ms (1st try)\n",
-                   val2);
-       if (val2 >= val+8) { /* 1 ms */
+                      "HFC_multi F0_CNT %ld after 10 ms (1st try)\n",
+                      val2);
+       if (val2 >= val + 8) { /* 1 ms */
                /* it counts, so we keep the pcm mode */
                if (test_bit(HFC_CHIP_PCM_MASTER, &hc->chip))
                        printk(KERN_INFO "controller is PCM bus MASTER\n");
                else
-               if (test_bit(HFC_CHIP_PCM_SLAVE, &hc->chip))
-                       printk(KERN_INFO "controller is PCM bus SLAVE\n");
-               else {
-                       test_and_set_bit(HFC_CHIP_PCM_SLAVE, &hc->chip);
-                       printk(KERN_INFO "controller is PCM bus SLAVE "
-                               "(auto detected)\n");
-               }
+                       if (test_bit(HFC_CHIP_PCM_SLAVE, &hc->chip))
+                               printk(KERN_INFO "controller is PCM bus SLAVE\n");
+                       else {
+                               test_and_set_bit(HFC_CHIP_PCM_SLAVE, &hc->chip);
+                               printk(KERN_INFO "controller is PCM bus SLAVE "
+                                      "(auto detected)\n");
+                       }
        } else {
                /* does not count */
                if (test_bit(HFC_CHIP_PCM_MASTER, &hc->chip)) {
-controller_fail:
+               controller_fail:
                        printk(KERN_ERR "HFC_multi ERROR, getting no 125us "
-                           "pulse. Seems that controller fails.\n");
+                              "pulse. Seems that controller fails.\n");
                        err = -EIO;
                        goto out;
                }
                if (test_bit(HFC_CHIP_PCM_SLAVE, &hc->chip)) {
                        printk(KERN_INFO "controller is PCM bus SLAVE "
-                               "(ignoring missing PCM clock)\n");
+                              "(ignoring missing PCM clock)\n");
                } else {
                        /* only one pcm master */
                        if (test_bit(HFC_CHIP_PLXSD, &hc->chip)
-                               && plxsd_master) {
+                           && plxsd_master) {
                                printk(KERN_ERR "HFC_multi ERROR, no clock "
-                                   "on another Speech Design card found. "
-                                   "Please be sure to connect PCM cable.\n");
+                                      "on another Speech Design card found. "
+                                      "Please be sure to connect PCM cable.\n");
                                err = -EIO;
                                goto out;
                        }
@@ -1416,24 +1416,24 @@ controller_fail:
                                spin_unlock_irqrestore(&plx_lock, plx_flags);
                                if (debug & DEBUG_HFCMULTI_INIT)
                                        printk(KERN_DEBUG "%s: master: "
-                                           "PLX_GPIO=%x\n", __func__, pv);
+                                              "PLX_GPIO=%x\n", __func__, pv);
                        }
                        hc->hw.r_pcm_md0 |= V_PCM_MD;
                        HFC_outb(hc, R_PCM_MD0, hc->hw.r_pcm_md0 | 0x00);
                        spin_unlock_irqrestore(&hc->lock, flags);
                        set_current_state(TASK_UNINTERRUPTIBLE);
-                       schedule_timeout((HZ/100)?:1); /* Timeout min. 10ms */
+                       schedule_timeout((HZ / 100) ?: 1); /* Timeout min. 10ms */
                        spin_lock_irqsave(&hc->lock, flags);
                        val2 = HFC_inb(hc, R_F0_CNTL);
                        val2 += HFC_inb(hc, R_F0_CNTH) << 8;
                        if (debug & DEBUG_HFCMULTI_INIT)
                                printk(KERN_DEBUG "HFC_multi F0_CNT %ld after "
-                                       "10 ms (2nd try)\n", val2);
-                       if (val2 >= val+8) { /* 1 ms */
+                                      "10 ms (2nd try)\n", val2);
+                       if (val2 >= val + 8) { /* 1 ms */
                                test_and_set_bit(HFC_CHIP_PCM_MASTER,
-                                       &hc->chip);
+                                                &hc->chip);
                                printk(KERN_INFO "controller is PCM bus MASTER "
-                                       "(auto detected)\n");
+                                      "(auto detected)\n");
                        } else
                                goto controller_fail;
                }
@@ -1451,21 +1451,21 @@ controller_fail:
                spin_unlock_irqrestore(&plx_lock, plx_flags);
                if (debug & DEBUG_HFCMULTI_INIT)
                        printk(KERN_DEBUG "%s: reset off: PLX_GPIO=%x\n",
-                               __func__, pv);
+                              __func__, pv);
        }
 
        /* pcm id */
        if (hc->pcm)
                printk(KERN_INFO "controller has given PCM BUS ID %d\n",
-                       hc->pcm);
+                      hc->pcm);
        else {
                if (test_bit(HFC_CHIP_PCM_MASTER, &hc->chip)
-                || test_bit(HFC_CHIP_PLXSD, &hc->chip)) {
+                   || test_bit(HFC_CHIP_PLXSD, &hc->chip)) {
                        PCM_cnt++; /* SD has proprietary bridging */
                }
                hc->pcm = PCM_cnt;
                printk(KERN_INFO "controller has PCM BUS ID %d "
-                       "(auto selected)\n", hc->pcm);
+                      "(auto selected)\n", hc->pcm);
        }
 
        /* set up timer */
@@ -1480,7 +1480,7 @@ controller_fail:
        if (test_bit(HFC_CHIP_DTMF, &hc->chip)) {
                if (debug & DEBUG_HFCMULTI_INIT)
                        printk(KERN_DEBUG "%s: enabling DTMF detection "
-                           "for all B-channel\n", __func__);
+                              "for all B-channel\n", __func__);
                hc->hw.r_dtmf = V_DTMF_EN | V_DTMF_STOP;
                if (test_bit(HFC_CHIP_ULAW, &hc->chip))
                        hc->hw.r_dtmf |= V_ULAW_SEL;
@@ -1527,8 +1527,8 @@ controller_fail:
        if (hc->masterclk >= 0) {
                if (debug & DEBUG_HFCMULTI_INIT)
                        printk(KERN_DEBUG "%s: setting ST master clock "
-                           "to port %d (0..%d)\n",
-                           __func__, hc->masterclk, hc->ports-1);
+                              "to port %d (0..%d)\n",
+                              __func__, hc->masterclk, hc->ports - 1);
                hc->hw.r_st_sync |= (hc->masterclk | V_AUTO_SYNC);
                HFC_outb(hc, R_ST_SYNC, hc->hw.r_st_sync);
        }
@@ -1539,7 +1539,7 @@ controller_fail:
        HFC_outb(hc, R_IRQMSK_MISC, hc->hw.r_irqmsk_misc);
        if (debug & DEBUG_HFCMULTI_INIT)
                printk(KERN_DEBUG "r_irqmsk_misc.2: 0x%x\n",
-                   hc->hw.r_irqmsk_misc);
+                      hc->hw.r_irqmsk_misc);
 
        /* RAM access test */
        HFC_outb(hc, R_RAM_ADDR0, 0);
@@ -1547,7 +1547,7 @@ controller_fail:
        HFC_outb(hc, R_RAM_ADDR2, 0);
        for (i = 0; i < 256; i++) {
                HFC_outb_nodebug(hc, R_RAM_ADDR0, i);
-               HFC_outb_nodebug(hc, R_RAM_DATA, ((i*3)&0xff));
+               HFC_outb_nodebug(hc, R_RAM_DATA, ((i * 3) & 0xff));
        }
        for (i = 0; i < 256; i++) {
                HFC_outb_nodebug(hc, R_RAM_ADDR0, i);
@@ -1555,8 +1555,8 @@ controller_fail:
                rval = HFC_inb_nodebug(hc, R_INT_DATA);
                if (rval != ((i * 3) & 0xff)) {
                        printk(KERN_DEBUG
-                           "addr:%x val:%x should:%x\n", i, rval,
-                           (i * 3) & 0xff);
+                              "addr:%x val:%x should:%x\n", i, rval,
+                              (i * 3) & 0xff);
                        err++;
                }
        }
@@ -1585,9 +1585,9 @@ hfcmulti_watchdog(struct hfc_multi *hc)
        if (hc->wdcount > 10) {
                hc->wdcount = 0;
                hc->wdbyte = hc->wdbyte == V_GPIO_OUT2 ?
-                   V_GPIO_OUT3 : V_GPIO_OUT2;
+                       V_GPIO_OUT3 : V_GPIO_OUT2;
 
-       /* printk("Sending Watchdog Kill %x\n",hc->wdbyte); */
+               /* printk("Sending Watchdog Kill %x\n",hc->wdbyte); */
                HFC_outb(hc, R_GPIO_EN0, V_GPIO_EN2 | V_GPIO_EN3);
                HFC_outb(hc, R_GPIO_OUT0, hc->wdbyte);
        }
@@ -1623,10 +1623,10 @@ hfcmulti_leds(struct hfc_multi *hc)
                 */
                if (hc->chan[hc->dslot].sync != 2) { /* no frame sync */
                        if (hc->chan[hc->dslot].dch->dev.D.protocol
-                               != ISDN_P_NT_E1) {
+                           != ISDN_P_NT_E1) {
                                led[0] = 1;
                                led[1] = 1;
-                       } else if (hc->ledcount>>11) {
+                       } else if (hc->ledcount >> 11) {
                                led[0] = 1;
                                led[1] = 1;
                        } else {
@@ -1643,7 +1643,7 @@ hfcmulti_leds(struct hfc_multi *hc)
                        led[3] = 1;
                }
                leds = (led[0] | (led[1]<<2) | (led[2]<<1) | (led[3]<<3))^0xF;
-                       /* leds are inverted */
+               /* leds are inverted */
                if (leds != (int)hc->ledstate) {
                        HFC_outb_nodebug(hc, R_GPIO_OUT1, leds);
                        hc->ledstate = leds;
@@ -1674,7 +1674,7 @@ hfcmulti_leds(struct hfc_multi *hc)
                                                /* TE mode: led red */
                                                led[i] = 2;
                                        else
-                                               if (hc->ledcount>>11)
+                                               if (hc->ledcount >> 11)
                                                        /* led red */
                                                        led[i] = 2;
                                                else
@@ -1700,9 +1700,9 @@ hfcmulti_leds(struct hfc_multi *hc)
                        }
                } else {
                        leds = ((led[3] > 0) << 0) | ((led[1] > 0) << 1) |
-                           ((led[0] > 0) << 2) | ((led[2] > 0) << 3) |
-                           ((led[3] & 1) << 4) | ((led[1] & 1) << 5) |
-                           ((led[0] & 1) << 6) | ((led[2] & 1) << 7);
+                               ((led[0] > 0) << 2) | ((led[2] > 0) << 3) |
+                               ((led[3] & 1) << 4) | ((led[1] & 1) << 5) |
+                               ((led[0] & 1) << 6) | ((led[2] & 1) << 7);
                        if (leds != (int)hc->ledstate) {
                                HFC_outb_nodebug(hc, R_GPIO_EN1, leds & 0x0F);
                                HFC_outb_nodebug(hc, R_GPIO_OUT1, leds >> 4);
@@ -1746,13 +1746,13 @@ hfcmulti_leds(struct hfc_multi *hc)
                }
 
 
-               leds = (led[0] > 0) | ((led[1] > 0)<<1) | ((led[0]&1)<<2)
-                       | ((led[1]&1)<<3);
+               leds = (led[0] > 0) | ((led[1] > 0) << 1) | ((led[0]&1) << 2)
+                       | ((led[1]&1) << 3);
                if (leds != (int)hc->ledstate) {
                        HFC_outb_nodebug(hc, R_GPIO_EN1,
-                           ((led[0] > 0) << 2) | ((led[1] > 0) << 3));
+                                        ((led[0] > 0) << 2) | ((led[1] > 0) << 3));
                        HFC_outb_nodebug(hc, R_GPIO_OUT1,
-                           ((led[0] & 1) << 2) | ((led[1] & 1) << 3));
+                                        ((led[0] & 1) << 2) | ((led[1] & 1) << 3));
                        hc->ledstate = leds;
                }
                break;
@@ -1784,7 +1784,7 @@ hfcmulti_leds(struct hfc_multi *hc)
                leddw = lled << 24 | lled << 16 | lled << 8 | lled;
                if (leddw != hc->ledstate) {
                        /* HFC_outb(hc, R_BRG_PCM_CFG, 1);
-                       HFC_outb(c, R_BRG_PCM_CFG, (0x0 << 6) | 0x3); */
+                          HFC_outb(c, R_BRG_PCM_CFG, (0x0 << 6) | 0x3); */
                        /* was _io before */
                        HFC_outb_nodebug(hc, R_BRG_PCM_CFG, 1 | V_PCM_CLK);
                        outw(0x4000, hc->pci_iobase + 4);
@@ -1826,16 +1826,16 @@ hfcmulti_dtmf(struct hfc_multi *hc)
                        continue;
                if (debug & DEBUG_HFCMULTI_DTMF)
                        printk(KERN_DEBUG "%s: dtmf channel %d:",
-                               __func__, ch);
+                              __func__, ch);
                coeff = &(hc->chan[ch].coeff[hc->chan[ch].coeff_count * 16]);
                dtmf = 1;
                for (co = 0; co < 8; co++) {
                        /* read W(n-1) coefficient */
-                       addr = hc->DTMFbase + ((co<<7) | (ch<<2));
+                       addr = hc->DTMFbase + ((co << 7) | (ch << 2));
                        HFC_outb_nodebug(hc, R_RAM_ADDR0, addr);
-                       HFC_outb_nodebug(hc, R_RAM_ADDR1, addr>>8);
-                       HFC_outb_nodebug(hc, R_RAM_ADDR2, (addr>>16)
-                               | V_ADDR_INC);
+                       HFC_outb_nodebug(hc, R_RAM_ADDR1, addr >> 8);
+                       HFC_outb_nodebug(hc, R_RAM_ADDR2, (addr >> 16)
+                                        | V_ADDR_INC);
                        w_float = HFC_inb_nodebug(hc, R_RAM_DATA);
                        w_float |= (HFC_inb_nodebug(hc, R_RAM_DATA) << 8);
                        if (debug & DEBUG_HFCMULTI_DTMF)
@@ -1845,14 +1845,14 @@ hfcmulti_dtmf(struct hfc_multi *hc)
                        mantissa = w_float & 0x0fff;
                        if (w_float & 0x8000)
                                mantissa |= 0xfffff000;
-                       exponent = (w_float>>12) & 0x7;
+                       exponent = (w_float >> 12) & 0x7;
                        if (exponent) {
                                mantissa ^= 0x1000;
-                               mantissa <<= (exponent-1);
+                               mantissa <<= (exponent - 1);
                        }
 
                        /* store coefficient */
-                       coeff[co<<1] = mantissa;
+                       coeff[co << 1] = mantissa;
 
                        /* read W(n) coefficient */
                        w_float = HFC_inb_nodebug(hc, R_RAM_DATA);
@@ -1864,27 +1864,27 @@ hfcmulti_dtmf(struct hfc_multi *hc)
                        mantissa = w_float & 0x0fff;
                        if (w_float & 0x8000)
                                mantissa |= 0xfffff000;
-                       exponent = (w_float>>12) & 0x7;
+                       exponent = (w_float >> 12) & 0x7;
                        if (exponent) {
                                mantissa ^= 0x1000;
-                               mantissa <<= (exponent-1);
+                               mantissa <<= (exponent - 1);
                        }
 
                        /* store coefficient */
-                       coeff[(co<<1)|1] = mantissa;
+                       coeff[(co << 1) | 1] = mantissa;
                }
                if (debug & DEBUG_HFCMULTI_DTMF)
                        printk(" DTMF ready %08x %08x %08x %08x "
-                           "%08x %08x %08x %08x\n",
-                           coeff[0], coeff[1], coeff[2], coeff[3],
-                           coeff[4], coeff[5], coeff[6], coeff[7]);
+                              "%08x %08x %08x %08x\n",
+                              coeff[0], coeff[1], coeff[2], coeff[3],
+                              coeff[4], coeff[5], coeff[6], coeff[7]);
                hc->chan[ch].coeff_count++;
                if (hc->chan[ch].coeff_count == 8) {
                        hc->chan[ch].coeff_count = 0;
                        skb = mI_alloc_skb(512, GFP_ATOMIC);
                        if (!skb) {
                                printk(KERN_DEBUG "%s: No memory for skb\n",
-                                   __func__);
+                                      __func__);
                                continue;
                        }
                        hh = mISDN_HEAD_P(skb);
@@ -1966,8 +1966,8 @@ next_frame:
                while (f2 != (temp = HFC_inb_nodebug(hc, A_F2))) {
                        if (debug & DEBUG_HFCMULTI_FIFO)
                                printk(KERN_DEBUG
-                                   "%s(card %d): reread f2 because %d!=%d\n",
-                                   __func__, hc->id + 1, temp, f2);
+                                      "%s(card %d): reread f2 because %d!=%d\n",
+                                      __func__, hc->id + 1, temp, f2);
                        f2 = temp; /* repeat until F2 is equal */
                }
                Fspace = f2 - f1 - 1;
@@ -1999,7 +1999,7 @@ next_frame:
        while (z2 != (temp = (HFC_inw_nodebug(hc, A_Z2) - hc->Zmin))) {
                if (debug & DEBUG_HFCMULTI_FIFO)
                        printk(KERN_DEBUG "%s(card %d): reread z2 because "
-                               "%d!=%d\n", __func__, hc->id + 1, temp, z2);
+                              "%d!=%d\n", __func__, hc->id + 1, temp, z2);
                z2 = temp; /* repeat unti Z2 is equal */
        }
        hc->chan[ch].Zfill = z1 - z2;
@@ -2023,28 +2023,28 @@ next_frame:
                            *txpending && slot_tx >= 0) {
                                if (debug & DEBUG_HFCMULTI_MODE)
                                        printk(KERN_DEBUG
-                                           "%s: reconnecting PCM due to no "
-                                           "more FIFO data: channel %d "
-                                           "slot_tx %d\n",
-                                           __func__, ch, slot_tx);
+                                              "%s: reconnecting PCM due to no "
+                                              "more FIFO data: channel %d "
+                                              "slot_tx %d\n",
+                                              __func__, ch, slot_tx);
                                /* connect slot */
                                if (hc->ctype == HFC_TYPE_XHFC)
                                        HFC_outb(hc, A_CON_HDLC, 0xc0
-                                           | 0x07 << 2 | V_HDLC_TRP | V_IFF);
-                                               /* Enable FIFO, no interrupt */
+                                                | 0x07 << 2 | V_HDLC_TRP | V_IFF);
+                               /* Enable FIFO, no interrupt */
                                else
                                        HFC_outb(hc, A_CON_HDLC, 0xc0 | 0x00 |
-                                           V_HDLC_TRP | V_IFF);
-                               HFC_outb_nodebug(hc, R_FIFO, ch<<1 | 1);
+                                                V_HDLC_TRP | V_IFF);
+                               HFC_outb_nodebug(hc, R_FIFO, ch << 1 | 1);
                                HFC_wait_nodebug(hc);
                                if (hc->ctype == HFC_TYPE_XHFC)
                                        HFC_outb(hc, A_CON_HDLC, 0xc0
-                                           | 0x07 << 2 | V_HDLC_TRP | V_IFF);
-                                               /* Enable FIFO, no interrupt */
+                                                | 0x07 << 2 | V_HDLC_TRP | V_IFF);
+                               /* Enable FIFO, no interrupt */
                                else
                                        HFC_outb(hc, A_CON_HDLC, 0xc0 | 0x00 |
-                                           V_HDLC_TRP | V_IFF);
-                               HFC_outb_nodebug(hc, R_FIFO, ch<<1);
+                                                V_HDLC_TRP | V_IFF);
+                               HFC_outb_nodebug(hc, R_FIFO, ch << 1);
                                HFC_wait_nodebug(hc);
                        }
                        *txpending = 0;
@@ -2054,10 +2054,10 @@ next_frame:
 
        /* "fill fifo if empty" feature */
        if (bch && test_bit(FLG_FILLEMPTY, &bch->Flags)
-               && !test_bit(FLG_HDLC, &bch->Flags) && z2 == z1) {
+           && !test_bit(FLG_HDLC, &bch->Flags) && z2 == z1) {
                if (debug & DEBUG_HFCMULTI_FILL)
                        printk(KERN_DEBUG "%s: buffer empty, so we have "
-                               "underrun\n", __func__);
+                              "underrun\n", __func__);
                /* fill buffer, to prevent future underrun */
                hc->write_fifo(hc, hc->silence_data, poll >> 1);
                Zspace -= (poll >> 1);
@@ -2065,29 +2065,29 @@ next_frame:
 
        /* if audio data and connected slot */
        if (bch && (!test_bit(FLG_HDLC, &bch->Flags)) && (!*txpending)
-               && slot_tx >= 0) {
+           && slot_tx >= 0) {
                if (debug & DEBUG_HFCMULTI_MODE)
                        printk(KERN_DEBUG "%s: disconnecting PCM due to "
-                           "FIFO data: channel %d slot_tx %d\n",
-                           __func__, ch, slot_tx);
+                              "FIFO data: channel %d slot_tx %d\n",
+                              __func__, ch, slot_tx);
                /* disconnect slot */
                if (hc->ctype == HFC_TYPE_XHFC)
                        HFC_outb(hc, A_CON_HDLC, 0x80
-                           | 0x07 << 2 | V_HDLC_TRP | V_IFF);
-                               /* Enable FIFO, no interrupt */
+                                | 0x07 << 2 | V_HDLC_TRP | V_IFF);
+               /* Enable FIFO, no interrupt */
                else
                        HFC_outb(hc, A_CON_HDLC, 0x80 | 0x00 |
-                           V_HDLC_TRP | V_IFF);
-               HFC_outb_nodebug(hc, R_FIFO, ch<<1 | 1);
+                                V_HDLC_TRP | V_IFF);
+               HFC_outb_nodebug(hc, R_FIFO, ch << 1 | 1);
                HFC_wait_nodebug(hc);
                if (hc->ctype == HFC_TYPE_XHFC)
                        HFC_outb(hc, A_CON_HDLC, 0x80
-                           | 0x07 << 2 | V_HDLC_TRP | V_IFF);
-                               /* Enable FIFO, no interrupt */
+                                | 0x07 << 2 | V_HDLC_TRP | V_IFF);
+               /* Enable FIFO, no interrupt */
                else
                        HFC_outb(hc, A_CON_HDLC, 0x80 | 0x00 |
-                           V_HDLC_TRP | V_IFF);
-               HFC_outb_nodebug(hc, R_FIFO, ch<<1);
+                                V_HDLC_TRP | V_IFF);
+               HFC_outb_nodebug(hc, R_FIFO, ch << 1);
                HFC_wait_nodebug(hc);
        }
        *txpending = 1;
@@ -2107,9 +2107,9 @@ next_frame:
                ii = Zspace + i;
        if (debug & DEBUG_HFCMULTI_FIFO)
                printk(KERN_DEBUG "%s(card %d): fifo(%d) has %d bytes space "
-                   "left (z1=%04x, z2=%04x) sending %d of %d bytes %s\n",
-                       __func__, hc->id + 1, ch, Zspace, z1, z2, ii-i, len-i,
-                       temp ? "HDLC" : "TRANS");
+                      "left (z1=%04x, z2=%04x) sending %d of %d bytes %s\n",
+                      __func__, hc->id + 1, ch, Zspace, z1, z2, ii-i, len-i,
+                      temp ? "HDLC" : "TRANS");
 
        /* Have to prep the audio data */
        hc->write_fifo(hc, d, ii - i);
@@ -2189,9 +2189,9 @@ next_frame:
            (hc->chan[ch].protocol == ISDN_P_B_RAW) &&
            (hc->chan[ch].slot_rx < 0) &&
            (hc->chan[ch].slot_tx < 0))
-               HFC_outb_nodebug(hc, R_FIFO, 0x20 | (ch<<1) | 1);
+               HFC_outb_nodebug(hc, R_FIFO, 0x20 | (ch << 1) | 1);
        else
-               HFC_outb_nodebug(hc, R_FIFO, (ch<<1)|1);
+               HFC_outb_nodebug(hc, R_FIFO, (ch << 1) | 1);
        HFC_wait_nodebug(hc);
 
        /* ignore if rx is off BUT change fifo (above) to start pending TX */
@@ -2203,8 +2203,8 @@ next_frame:
                while (f1 != (temp = HFC_inb_nodebug(hc, A_F1))) {
                        if (debug & DEBUG_HFCMULTI_FIFO)
                                printk(KERN_DEBUG
-                                   "%s(card %d): reread f1 because %d!=%d\n",
-                                   __func__, hc->id + 1, temp, f1);
+                                      "%s(card %d): reread f1 because %d!=%d\n",
+                                      __func__, hc->id + 1, temp, f1);
                        f1 = temp; /* repeat until F1 is equal */
                }
                f2 = HFC_inb_nodebug(hc, A_F2);
@@ -2213,7 +2213,7 @@ next_frame:
        while (z1 != (temp = (HFC_inw_nodebug(hc, A_Z1) - hc->Zmin))) {
                if (debug & DEBUG_HFCMULTI_FIFO)
                        printk(KERN_DEBUG "%s(card %d): reread z2 because "
-                               "%d!=%d\n", __func__, hc->id + 1, temp, z2);
+                              "%d!=%d\n", __func__, hc->id + 1, temp, z2);
                z1 = temp; /* repeat until Z1 is equal */
        }
        z2 = HFC_inw_nodebug(hc, A_Z2) - hc->Zmin;
@@ -2231,7 +2231,7 @@ next_frame:
                *sp = mI_alloc_skb(maxlen + 3, GFP_ATOMIC);
                if (*sp == NULL) {
                        printk(KERN_DEBUG "%s: No mem for rx_skb\n",
-                           __func__);
+                              __func__);
                        return;
                }
        }
@@ -2242,16 +2242,16 @@ next_frame:
        if (dch || test_bit(FLG_HDLC, &bch->Flags)) {
                if (debug & DEBUG_HFCMULTI_FIFO)
                        printk(KERN_DEBUG "%s(card %d): fifo(%d) reading %d "
-                           "bytes (z1=%04x, z2=%04x) HDLC %s (f1=%d, f2=%d) "
-                           "got=%d (again %d)\n", __func__, hc->id + 1, ch,
-                           Zsize, z1, z2, (f1 == f2) ? "fragment" : "COMPLETE",
-                           f1, f2, Zsize + (*sp)->len, again);
+                              "bytes (z1=%04x, z2=%04x) HDLC %s (f1=%d, f2=%d) "
+                              "got=%d (again %d)\n", __func__, hc->id + 1, ch,
+                              Zsize, z1, z2, (f1 == f2) ? "fragment" : "COMPLETE",
+                              f1, f2, Zsize + (*sp)->len, again);
                /* HDLC */
                if ((Zsize + (*sp)->len) > (maxlen + 3)) {
                        if (debug & DEBUG_HFCMULTI_FIFO)
                                printk(KERN_DEBUG
-                                   "%s(card %d): hdlc-frame too large.\n",
-                                   __func__, hc->id + 1);
+                                      "%s(card %d): hdlc-frame too large.\n",
+                                      __func__, hc->id + 1);
                        skb_trim(*sp, 0);
                        HFC_outb_nodebug(hc, R_INC_RES_FIFO, V_RES_F);
                        HFC_wait_nodebug(hc);
@@ -2268,8 +2268,8 @@ next_frame:
                        if ((*sp)->len < 4) {
                                if (debug & DEBUG_HFCMULTI_FIFO)
                                        printk(KERN_DEBUG
-                                           "%s(card %d): Frame below minimum "
-                                           "size\n", __func__, hc->id + 1);
+                                              "%s(card %d): Frame below minimum "
+                                              "size\n", __func__, hc->id + 1);
                                skb_trim(*sp, 0);
                                goto next_frame;
                        }
@@ -2277,7 +2277,7 @@ next_frame:
                        if ((*sp)->data[(*sp)->len - 1]) {
                                if (debug & DEBUG_HFCMULTI_CRC)
                                        printk(KERN_DEBUG
-                                           "%s: CRC-error\n", __func__);
+                                              "%s: CRC-error\n", __func__);
                                skb_trim(*sp, 0);
                                goto next_frame;
                        }
@@ -2287,11 +2287,11 @@ next_frame:
                                *sp = mI_alloc_skb(skb->len, GFP_ATOMIC);
                                if (*sp) {
                                        memcpy(skb_put(*sp, skb->len),
-                                           skb->data, skb->len);
+                                              skb->data, skb->len);
                                        skb_trim(skb, 0);
                                } else {
                                        printk(KERN_DEBUG "%s: No mem\n",
-                                           __func__);
+                                              __func__);
                                        *sp = skb;
                                        skb = NULL;
                                }
@@ -2300,7 +2300,7 @@ next_frame:
                        }
                        if (debug & DEBUG_HFCMULTI_FIFO) {
                                printk(KERN_DEBUG "%s(card %d):",
-                                       __func__, hc->id + 1);
+                                      __func__, hc->id + 1);
                                temp = 0;
                                while (temp < (*sp)->len)
                                        printk(" %02x", (*sp)->data[temp++]);
@@ -2325,7 +2325,7 @@ next_frame:
                        *sp = mI_alloc_skb(skb->len, GFP_ATOMIC);
                        if (*sp) {
                                memcpy(skb_put(*sp, skb->len),
-                                   skb->data, skb->len);
+                                      skb->data, skb->len);
                                skb_trim(skb, 0);
                        } else {
                                printk(KERN_DEBUG "%s: No mem\n", __func__);
@@ -2337,9 +2337,9 @@ next_frame:
                }
                if (debug & DEBUG_HFCMULTI_FIFO)
                        printk(KERN_DEBUG
-                           "%s(card %d): fifo(%d) reading %d bytes "
-                           "(z1=%04x, z2=%04x) TRANS\n",
-                               __func__, hc->id + 1, ch, Zsize, z1, z2);
+                              "%s(card %d): fifo(%d) reading %d bytes "
+                              "(z1=%04x, z2=%04x) TRANS\n",
+                              __func__, hc->id + 1, ch, Zsize, z1, z2);
                /* only bch is transparent */
                recv_Bchannel(bch, hc->chan[ch].Zfill);
                *sp = skb;
@@ -2362,7 +2362,7 @@ signal_state_up(struct dchannel *dch, int info, char *msg)
        id = TEI_SAPI | (GROUP_TEI << 8); /* manager address */
 
        skb = _alloc_mISDN_skb(MPH_INFORMATION_IND, id, sizeof(data), &data,
-               GFP_ATOMIC);
+                              GFP_ATOMIC);
        if (!skb)
                return;
        recv_Dchannel_skb(dch, skb);
@@ -2395,10 +2395,10 @@ handle_timer_irq(struct hfc_multi *hc)
                if (hc->e1_resync & 4) {
                        if (debug & DEBUG_HFCMULTI_PLXSD)
                                printk(KERN_DEBUG
-                                   "Enable QUARTZ for HFC-E1\n");
+                                      "Enable QUARTZ for HFC-E1\n");
                        /* set jatt to quartz */
                        HFC_outb(hc, R_SYNC_CTRL, V_EXT_CLK_SYNC
-                               | V_JATT_OFF);
+                                | V_JATT_OFF);
                        /* switch to JATT, in case it is not already */
                        HFC_outb(hc, R_SYNC_OUT, 0);
                }
@@ -2417,14 +2417,14 @@ handle_timer_irq(struct hfc_multi *hc)
                                        dch = hc->chan[ch].dch;
                                        if (!(--hc->chan[ch].nt_timer)) {
                                                schedule_event(dch,
-                                                   FLG_PHCHANGE);
+                                                              FLG_PHCHANGE);
                                                if (debug &
                                                    DEBUG_HFCMULTI_STATE)
                                                        printk(KERN_DEBUG
-                                                           "%s: nt_timer at "
-                                                           "state %x\n",
-                                                           __func__,
-                                                           dch->state);
+                                                              "%s: nt_timer at "
+                                                              "state %x\n",
+                                                              __func__,
+                                                              dch->state);
                                        }
                                }
                        }
@@ -2436,10 +2436,10 @@ handle_timer_irq(struct hfc_multi *hc)
                        temp = HFC_inb_nodebug(hc, R_SYNC_STA) & V_SIG_LOS;
                        if (!temp && hc->chan[hc->dslot].los)
                                signal_state_up(dch, L1_SIGNAL_LOS_ON,
-                                   "LOS detected");
+                                               "LOS detected");
                        if (temp && !hc->chan[hc->dslot].los)
                                signal_state_up(dch, L1_SIGNAL_LOS_OFF,
-                                   "LOS gone");
+                                               "LOS gone");
                        hc->chan[hc->dslot].los = temp;
                }
                if (test_bit(HFC_CFG_REPORT_AIS, &hc->chan[hc->dslot].cfg)) {
@@ -2447,10 +2447,10 @@ handle_timer_irq(struct hfc_multi *hc)
                        temp = HFC_inb_nodebug(hc, R_SYNC_STA) & V_AIS;
                        if (!temp && hc->chan[hc->dslot].ais)
                                signal_state_up(dch, L1_SIGNAL_AIS_ON,
-                                   "AIS detected");
+                                               "AIS detected");
                        if (temp && !hc->chan[hc->dslot].ais)
                                signal_state_up(dch, L1_SIGNAL_AIS_OFF,
-                                   "AIS gone");
+                                               "AIS gone");
                        hc->chan[hc->dslot].ais = temp;
                }
                if (test_bit(HFC_CFG_REPORT_SLIP, &hc->chan[hc->dslot].cfg)) {
@@ -2458,12 +2458,12 @@ handle_timer_irq(struct hfc_multi *hc)
                        temp = HFC_inb_nodebug(hc, R_SLIP) & V_FOSLIP_RX;
                        if (!temp && hc->chan[hc->dslot].slip_rx)
                                signal_state_up(dch, L1_SIGNAL_SLIP_RX,
-                                   " bit SLIP detected RX");
+                                               " bit SLIP detected RX");
                        hc->chan[hc->dslot].slip_rx = temp;
                        temp = HFC_inb_nodebug(hc, R_SLIP) & V_FOSLIP_TX;
                        if (!temp && hc->chan[hc->dslot].slip_tx)
                                signal_state_up(dch, L1_SIGNAL_SLIP_TX,
-                                   " bit SLIP detected TX");
+                                               " bit SLIP detected TX");
                        hc->chan[hc->dslot].slip_tx = temp;
                }
                if (test_bit(HFC_CFG_REPORT_RDI, &hc->chan[hc->dslot].cfg)) {
@@ -2471,10 +2471,10 @@ handle_timer_irq(struct hfc_multi *hc)
                        temp = HFC_inb_nodebug(hc, R_RX_SL0_0) & V_A;
                        if (!temp && hc->chan[hc->dslot].rdi)
                                signal_state_up(dch, L1_SIGNAL_RDI_ON,
-                                   "RDI detected");
+                                               "RDI detected");
                        if (temp && !hc->chan[hc->dslot].rdi)
                                signal_state_up(dch, L1_SIGNAL_RDI_OFF,
-                                   "RDI gone");
+                                               "RDI gone");
                        hc->chan[hc->dslot].rdi = temp;
                }
                temp = HFC_inb_nodebug(hc, R_JATT_DIR);
@@ -2483,13 +2483,13 @@ handle_timer_irq(struct hfc_multi *hc)
                        if ((temp & 0x60) == 0x60) {
                                if (debug & DEBUG_HFCMULTI_SYNC)
                                        printk(KERN_DEBUG
-                                           "%s: (id=%d) E1 now "
-                                           "in clock sync\n",
-                                           __func__, hc->id);
+                                              "%s: (id=%d) E1 now "
+                                              "in clock sync\n",
+                                              __func__, hc->id);
                                HFC_outb(hc, R_RX_OFF,
-                                   hc->chan[hc->dslot].jitter | V_RX_INIT);
+                                        hc->chan[hc->dslot].jitter | V_RX_INIT);
                                HFC_outb(hc, R_TX_OFF,
-                                   hc->chan[hc->dslot].jitter | V_RX_INIT);
+                                        hc->chan[hc->dslot].jitter | V_RX_INIT);
                                hc->chan[hc->dslot].sync = 1;
                                goto check_framesync;
                        }
@@ -2498,20 +2498,20 @@ handle_timer_irq(struct hfc_multi *hc)
                        if ((temp & 0x60) != 0x60) {
                                if (debug & DEBUG_HFCMULTI_SYNC)
                                        printk(KERN_DEBUG
-                                           "%s: (id=%d) E1 "
-                                           "lost clock sync\n",
-                                           __func__, hc->id);
+                                              "%s: (id=%d) E1 "
+                                              "lost clock sync\n",
+                                              __func__, hc->id);
                                hc->chan[hc->dslot].sync = 0;
                                break;
                        }
-check_framesync:
+               check_framesync:
                        temp = HFC_inb_nodebug(hc, R_SYNC_STA);
                        if (temp == 0x27) {
                                if (debug & DEBUG_HFCMULTI_SYNC)
                                        printk(KERN_DEBUG
-                                           "%s: (id=%d) E1 "
-                                           "now in frame sync\n",
-                                           __func__, hc->id);
+                                              "%s: (id=%d) E1 "
+                                              "now in frame sync\n",
+                                              __func__, hc->id);
                                hc->chan[hc->dslot].sync = 2;
                        }
                        break;
@@ -2519,9 +2519,9 @@ check_framesync:
                        if ((temp & 0x60) != 0x60) {
                                if (debug & DEBUG_HFCMULTI_SYNC)
                                        printk(KERN_DEBUG
-                                           "%s: (id=%d) E1 lost "
-                                           "clock & frame sync\n",
-                                           __func__, hc->id);
+                                              "%s: (id=%d) E1 lost "
+                                              "clock & frame sync\n",
+                                              __func__, hc->id);
                                hc->chan[hc->dslot].sync = 0;
                                break;
                        }
@@ -2529,9 +2529,9 @@ check_framesync:
                        if (temp != 0x27) {
                                if (debug & DEBUG_HFCMULTI_SYNC)
                                        printk(KERN_DEBUG
-                                           "%s: (id=%d) E1 "
-                                           "lost frame sync\n",
-                                           __func__, hc->id);
+                                              "%s: (id=%d) E1 "
+                                              "lost frame sync\n",
+                                              __func__, hc->id);
                                hc->chan[hc->dslot].sync = 1;
                        }
                        break;
@@ -2559,30 +2559,30 @@ ph_state_irq(struct hfc_multi *hc, u_char r_irq_statech)
                        dch = hc->chan[ch].dch;
                        if (r_irq_statech & 1) {
                                HFC_outb_nodebug(hc, R_ST_SEL,
-                                       hc->chan[ch].port);
+                                                hc->chan[ch].port);
                                /* undocumented: delay after R_ST_SEL */
                                udelay(1);
                                /* undocumented: status changes during read */
                                st_status = HFC_inb_nodebug(hc, A_ST_RD_STATE);
                                while (st_status != (temp =
-                                       HFC_inb_nodebug(hc, A_ST_RD_STATE))) {
+                                                    HFC_inb_nodebug(hc, A_ST_RD_STATE))) {
                                        if (debug & DEBUG_HFCMULTI_STATE)
                                                printk(KERN_DEBUG "%s: reread "
-                                                   "STATE because %d!=%d\n",
-                                                   __func__, temp,
-                                                   st_status);
+                                                      "STATE because %d!=%d\n",
+                                                      __func__, temp,
+                                                      st_status);
                                        st_status = temp; /* repeat */
                                }
 
                                /* Speech Design TE-sync indication */
                                if (test_bit(HFC_CHIP_PLXSD, &hc->chip) &&
-                                       dch->dev.D.protocol == ISDN_P_TE_S0) {
+                                   dch->dev.D.protocol == ISDN_P_TE_S0) {
                                        if (st_status & V_FR_SYNC_ST)
                                                hc->syncronized |=
-                                                   (1 << hc->chan[ch].port);
+                                                       (1 << hc->chan[ch].port);
                                        else
                                                hc->syncronized &=
-                                                  ~(1 << hc->chan[ch].port);
+                                                       ~(1 << hc->chan[ch].port);
                                }
                                dch->state = st_status & 0x0f;
                                if (dch->dev.D.protocol == ISDN_P_NT_S0)
@@ -2591,19 +2591,19 @@ ph_state_irq(struct hfc_multi *hc, u_char r_irq_statech)
                                        active = 7;
                                if (dch->state == active) {
                                        HFC_outb_nodebug(hc, R_FIFO,
-                                               (ch << 1) | 1);
+                                                        (ch << 1) | 1);
                                        HFC_wait_nodebug(hc);
                                        HFC_outb_nodebug(hc,
-                                               R_INC_RES_FIFO, V_RES_F);
+                                                        R_INC_RES_FIFO, V_RES_F);
                                        HFC_wait_nodebug(hc);
                                        dch->tx_idx = 0;
                                }
                                schedule_event(dch, FLG_PHCHANGE);
                                if (debug & DEBUG_HFCMULTI_STATE)
                                        printk(KERN_DEBUG
-                                           "%s: S/T newstate %x port %d\n",
-                                           __func__, dch->state,
-                                           hc->chan[ch].port);
+                                              "%s: S/T newstate %x port %d\n",
+                                              __func__, dch->state,
+                                              hc->chan[ch].port);
                        }
                        r_irq_statech >>= 1;
                }
@@ -2665,7 +2665,7 @@ hfcmulti_interrupt(int intno, void *dev_id)
 {
 #ifdef IRQCOUNT_DEBUG
        static int iq1 = 0, iq2 = 0, iq3 = 0, iq4 = 0,
-           iq5 = 0, iq6 = 0, iqcnt = 0;
+               iq5 = 0, iq6 = 0, iqcnt = 0;
 #endif
        struct hfc_multi        *hc = dev_id;
        struct dchannel         *dch;
@@ -2686,7 +2686,7 @@ hfcmulti_interrupt(int intno, void *dev_id)
 #ifdef IRQ_DEBUG
        if (irqsem)
                printk(KERN_ERR "irq for card %d during irq from "
-               "card %d, this is no bug.\n", hc->id + 1, irqsem);
+                      "card %d, this is no bug.\n", hc->id + 1, irqsem);
        irqsem = hc->id + 1;
 #endif
 #ifdef CONFIG_MISDN_HFCMULTI_8xx
@@ -2719,14 +2719,14 @@ hfcmulti_interrupt(int intno, void *dev_id)
                iq6++;
        if (iqcnt++ > 5000) {
                printk(KERN_ERR "iq1:%x iq2:%x iq3:%x iq4:%x iq5:%x iq6:%x\n",
-                   iq1, iq2, iq3, iq4, iq5, iq6);
+                      iq1, iq2, iq3, iq4, iq5, iq6);
                iqcnt = 0;
        }
 #endif
 
        if (!r_irq_statech &&
            !(status & (V_DTMF_STA | V_LOST_STA | V_EXT_IRQSTA |
-           V_MISC_IRQSTA | V_FR_IRQSTA))) {
+                       V_MISC_IRQSTA | V_FR_IRQSTA))) {
                /* irq is not for us */
                goto irq_notforus;
        }
@@ -2751,7 +2751,7 @@ hfcmulti_interrupt(int intno, void *dev_id)
                                dch = hc->chan[hc->dslot].dch;
                                e1_syncsta = HFC_inb_nodebug(hc, R_SYNC_STA);
                                if (test_bit(HFC_CHIP_PLXSD, &hc->chip)
-                                && hc->e1_getclock) {
+                                   && hc->e1_getclock) {
                                        if (e1_syncsta & V_FR_SYNC_E1)
                                                hc->syncronized = 1;
                                        else
@@ -2760,12 +2760,12 @@ hfcmulti_interrupt(int intno, void *dev_id)
                                /* undocumented: status changes during read */
                                dch->state = HFC_inb_nodebug(hc, R_E1_RD_STA);
                                while (dch->state != (temp =
-                                       HFC_inb_nodebug(hc, R_E1_RD_STA))) {
+                                                     HFC_inb_nodebug(hc, R_E1_RD_STA))) {
                                        if (debug & DEBUG_HFCMULTI_STATE)
                                                printk(KERN_DEBUG "%s: reread "
-                                                   "STATE because %d!=%d\n",
-                                                   __func__, temp,
-                                                   dch->state);
+                                                      "STATE because %d!=%d\n",
+                                                      __func__, temp,
+                                                      dch->state);
                                        dch->state = temp; /* repeat */
                                }
                                dch->state = HFC_inb_nodebug(hc, R_E1_RD_STA)
@@ -2773,8 +2773,8 @@ hfcmulti_interrupt(int intno, void *dev_id)
                                schedule_event(dch, FLG_PHCHANGE);
                                if (debug & DEBUG_HFCMULTI_STATE)
                                        printk(KERN_DEBUG
-                                           "%s: E1 (id=%d) newstate %x\n",
-                                           __func__, hc->id, dch->state);
+                                              "%s: E1 (id=%d) newstate %x\n",
+                                              __func__, hc->id, dch->state);
                                if (test_bit(HFC_CHIP_PLXSD, &hc->chip))
                                        plxsd_checksync(hc, 0);
                        }
@@ -2792,7 +2792,7 @@ hfcmulti_interrupt(int intno, void *dev_id)
                        static int irq_proc_cnt;
                        if (!irq_proc_cnt++)
                                printk(KERN_DEBUG "%s: got V_IRQ_PROC -"
-                                   " this should not happen\n", __func__);
+                                      " this should not happen\n", __func__);
                }
 
        }
@@ -2841,7 +2841,7 @@ hfcmulti_dbusy_timer(struct hfc_multi *hc)
  */
 static int
 mode_hfcmulti(struct hfc_multi *hc, int ch, int protocol, int slot_tx,
-    int bank_tx, int slot_rx, int bank_rx)
+             int bank_tx, int slot_rx, int bank_rx)
 {
        int flow_tx = 0, flow_rx = 0, routing = 0;
        int oslot_tx, oslot_rx;
@@ -2855,28 +2855,28 @@ mode_hfcmulti(struct hfc_multi *hc, int ch, int protocol, int slot_tx,
 
        if (debug & DEBUG_HFCMULTI_MODE)
                printk(KERN_DEBUG
-                   "%s: card %d channel %d protocol %x slot old=%d new=%d "
-                   "bank new=%d (TX) slot old=%d new=%d bank new=%d (RX)\n",
-                   __func__, hc->id, ch, protocol, oslot_tx, slot_tx,
-                   bank_tx, oslot_rx, slot_rx, bank_rx);
+                      "%s: card %d channel %d protocol %x slot old=%d new=%d "
+                      "bank new=%d (TX) slot old=%d new=%d bank new=%d (RX)\n",
+                      __func__, hc->id, ch, protocol, oslot_tx, slot_tx,
+                      bank_tx, oslot_rx, slot_rx, bank_rx);
 
        if (oslot_tx >= 0 && slot_tx != oslot_tx) {
                /* remove from slot */
                if (debug & DEBUG_HFCMULTI_MODE)
                        printk(KERN_DEBUG "%s: remove from slot %d (TX)\n",
-                           __func__, oslot_tx);
-               if (hc->slot_owner[oslot_tx<<1] == ch) {
+                              __func__, oslot_tx);
+               if (hc->slot_owner[oslot_tx << 1] == ch) {
                        HFC_outb(hc, R_SLOT, oslot_tx << 1);
                        HFC_outb(hc, A_SL_CFG, 0);
                        if (hc->ctype != HFC_TYPE_XHFC)
                                HFC_outb(hc, A_CONF, 0);
-                       hc->slot_owner[oslot_tx<<1] = -1;
+                       hc->slot_owner[oslot_tx << 1] = -1;
                } else {
                        if (debug & DEBUG_HFCMULTI_MODE)
                                printk(KERN_DEBUG
-                                   "%s: we are not owner of this tx slot "
-                                   "anymore, channel %d is.\n",
-                                   __func__, hc->slot_owner[oslot_tx<<1]);
+                                      "%s: we are not owner of this tx slot "
+                                      "anymore, channel %d is.\n",
+                                      __func__, hc->slot_owner[oslot_tx << 1]);
                }
        }
 
@@ -2884,8 +2884,8 @@ mode_hfcmulti(struct hfc_multi *hc, int ch, int protocol, int slot_tx,
                /* remove from slot */
                if (debug & DEBUG_HFCMULTI_MODE)
                        printk(KERN_DEBUG
-                           "%s: remove from slot %d (RX)\n",
-                           __func__, oslot_rx);
+                              "%s: remove from slot %d (RX)\n",
+                              __func__, oslot_rx);
                if (hc->slot_owner[(oslot_rx << 1) | 1] == ch) {
                        HFC_outb(hc, R_SLOT, (oslot_rx << 1) | V_SL_DIR);
                        HFC_outb(hc, A_SL_CFG, 0);
@@ -2893,10 +2893,10 @@ mode_hfcmulti(struct hfc_multi *hc, int ch, int protocol, int slot_tx,
                } else {
                        if (debug & DEBUG_HFCMULTI_MODE)
                                printk(KERN_DEBUG
-                                   "%s: we are not owner of this rx slot "
-                                   "anymore, channel %d is.\n",
-                                   __func__,
-                                   hc->slot_owner[(oslot_rx << 1) | 1]);
+                                      "%s: we are not owner of this rx slot "
+                                      "anymore, channel %d is.\n",
+                                      __func__,
+                                      hc->slot_owner[(oslot_rx << 1) | 1]);
                }
        }
 
@@ -2917,14 +2917,14 @@ mode_hfcmulti(struct hfc_multi *hc, int ch, int protocol, int slot_tx,
                        routing = 0x40; /* loop */
                if (debug & DEBUG_HFCMULTI_MODE)
                        printk(KERN_DEBUG "%s: put channel %d to slot %d bank"
-                           " %d flow %02x routing %02x conf %d (TX)\n",
-                           __func__, ch, slot_tx, bank_tx,
-                           flow_tx, routing, conf);
+                              " %d flow %02x routing %02x conf %d (TX)\n",
+                              __func__, ch, slot_tx, bank_tx,
+                              flow_tx, routing, conf);
                HFC_outb(hc, R_SLOT, slot_tx << 1);
-               HFC_outb(hc, A_SL_CFG, (ch<<1) | routing);
+               HFC_outb(hc, A_SL_CFG, (ch << 1) | routing);
                if (hc->ctype != HFC_TYPE_XHFC)
                        HFC_outb(hc, A_CONF,
-                               (conf < 0) ? 0 : (conf | V_CONF_SL));
+                                (conf < 0) ? 0 : (conf | V_CONF_SL));
                hc->slot_owner[slot_tx << 1] = ch;
                hc->chan[ch].slot_tx = slot_tx;
                hc->chan[ch].bank_tx = bank_tx;
@@ -2946,12 +2946,12 @@ mode_hfcmulti(struct hfc_multi *hc, int ch, int protocol, int slot_tx,
                        routing = 0x40; /* loop */
                if (debug & DEBUG_HFCMULTI_MODE)
                        printk(KERN_DEBUG "%s: put channel %d to slot %d bank"
-                           " %d flow %02x routing %02x conf %d (RX)\n",
-                           __func__, ch, slot_rx, bank_rx,
-                           flow_rx, routing, conf);
-               HFC_outb(hc, R_SLOT, (slot_rx<<1) | V_SL_DIR);
-               HFC_outb(hc, A_SL_CFG, (ch<<1) | V_CH_DIR | routing);
-               hc->slot_owner[(slot_rx<<1)|1] = ch;
+                              " %d flow %02x routing %02x conf %d (RX)\n",
+                              __func__, ch, slot_rx, bank_rx,
+                              flow_rx, routing, conf);
+               HFC_outb(hc, R_SLOT, (slot_rx << 1) | V_SL_DIR);
+               HFC_outb(hc, A_SL_CFG, (ch << 1) | V_CH_DIR | routing);
+               hc->slot_owner[(slot_rx << 1) | 1] = ch;
                hc->chan[ch].slot_rx = slot_rx;
                hc->chan[ch].bank_rx = bank_rx;
        }
@@ -2967,7 +2967,7 @@ mode_hfcmulti(struct hfc_multi *hc, int ch, int protocol, int slot_tx,
                HFC_outb(hc, R_INC_RES_FIFO, V_RES_F);
                HFC_wait(hc);
                /* disable RX fifo */
-               HFC_outb(hc, R_FIFO, (ch<<1)|1);
+               HFC_outb(hc, R_FIFO, (ch << 1) | 1);
                HFC_wait(hc);
                HFC_outb(hc, A_CON_HDLC, flow_rx | 0x00);
                HFC_outb(hc, A_SUBCH_CFG, 0);
@@ -2976,17 +2976,17 @@ mode_hfcmulti(struct hfc_multi *hc, int ch, int protocol, int slot_tx,
                HFC_wait(hc);
                if (hc->chan[ch].bch && hc->ctype != HFC_TYPE_E1) {
                        hc->hw.a_st_ctrl0[hc->chan[ch].port] &=
-                           ((ch & 0x3) == 0) ? ~V_B1_EN : ~V_B2_EN;
+                               ((ch & 0x3) == 0) ? ~V_B1_EN : ~V_B2_EN;
                        HFC_outb(hc, R_ST_SEL, hc->chan[ch].port);
                        /* undocumented: delay after R_ST_SEL */
                        udelay(1);
                        HFC_outb(hc, A_ST_CTRL0,
-                           hc->hw.a_st_ctrl0[hc->chan[ch].port]);
+                                hc->hw.a_st_ctrl0[hc->chan[ch].port]);
                }
                if (hc->chan[ch].bch) {
                        test_and_clear_bit(FLG_HDLC, &hc->chan[ch].bch->Flags);
                        test_and_clear_bit(FLG_TRANSPARENT,
-                           &hc->chan[ch].bch->Flags);
+                                          &hc->chan[ch].bch->Flags);
                }
                break;
        case (ISDN_P_B_RAW): /* B-channel */
@@ -2996,20 +2996,20 @@ mode_hfcmulti(struct hfc_multi *hc, int ch, int protocol, int slot_tx,
                    (hc->chan[ch].slot_tx < 0)) {
 
                        printk(KERN_DEBUG
-                           "Setting B-channel %d to echo cancelable "
-                           "state on PCM slot %d\n", ch,
-                           ((ch / 4) * 8) + ((ch % 4) * 4) + 1);
+                              "Setting B-channel %d to echo cancelable "
+                              "state on PCM slot %d\n", ch,
+                              ((ch / 4) * 8) + ((ch % 4) * 4) + 1);
                        printk(KERN_DEBUG
-                           "Enabling pass through for channel\n");
+                              "Enabling pass through for channel\n");
                        vpm_out(hc, ch, ((ch / 4) * 8) +
-                           ((ch % 4) * 4) + 1, 0x01);
+                               ((ch % 4) * 4) + 1, 0x01);
                        /* rx path */
                        /* S/T -> PCM */
                        HFC_outb(hc, R_FIFO, (ch << 1));
                        HFC_wait(hc);
                        HFC_outb(hc, A_CON_HDLC, 0xc0 | V_HDLC_TRP | V_IFF);
                        HFC_outb(hc, R_SLOT, (((ch / 4) * 8) +
-                           ((ch % 4) * 4) + 1) << 1);
+                                             ((ch % 4) * 4) + 1) << 1);
                        HFC_outb(hc, A_SL_CFG, 0x80 | (ch << 1));
 
                        /* PCM -> FIFO */
@@ -3021,7 +3021,7 @@ mode_hfcmulti(struct hfc_multi *hc, int ch, int protocol, int slot_tx,
                        HFC_outb(hc, R_INC_RES_FIFO, V_RES_F);
                        HFC_wait(hc);
                        HFC_outb(hc, R_SLOT, ((((ch / 4) * 8) +
-                           ((ch % 4) * 4) + 1) << 1) | 1);
+                                              ((ch % 4) * 4) + 1) << 1) | 1);
                        HFC_outb(hc, A_SL_CFG, 0x80 | 0x20 | (ch << 1) | 1);
 
                        /* tx path */
@@ -3030,7 +3030,7 @@ mode_hfcmulti(struct hfc_multi *hc, int ch, int protocol, int slot_tx,
                        HFC_wait(hc);
                        HFC_outb(hc, A_CON_HDLC, 0xc0 | V_HDLC_TRP | V_IFF);
                        HFC_outb(hc, R_SLOT, ((((ch / 4) * 8) +
-                           ((ch % 4) * 4)) << 1) | 1);
+                                              ((ch % 4) * 4)) << 1) | 1);
                        HFC_outb(hc, A_SL_CFG, 0x80 | 0x40 | (ch << 1) | 1);
 
                        /* FIFO -> PCM */
@@ -3044,7 +3044,7 @@ mode_hfcmulti(struct hfc_multi *hc, int ch, int protocol, int slot_tx,
                        /* tx silence */
                        HFC_outb_nodebug(hc, A_FIFO_DATA0_NOINC, hc->silence);
                        HFC_outb(hc, R_SLOT, (((ch / 4) * 8) +
-                           ((ch % 4) * 4)) << 1);
+                                             ((ch % 4) * 4)) << 1);
                        HFC_outb(hc, A_SL_CFG, 0x80 | 0x20 | (ch << 1));
                } else {
                        /* enable TX fifo */
@@ -3052,11 +3052,11 @@ mode_hfcmulti(struct hfc_multi *hc, int ch, int protocol, int slot_tx,
                        HFC_wait(hc);
                        if (hc->ctype == HFC_TYPE_XHFC)
                                HFC_outb(hc, A_CON_HDLC, flow_tx | 0x07 << 2 |
-                                       V_HDLC_TRP | V_IFF);
-                                       /* Enable FIFO, no interrupt */
+                                        V_HDLC_TRP | V_IFF);
+                       /* Enable FIFO, no interrupt */
                        else
                                HFC_outb(hc, A_CON_HDLC, flow_tx | 0x00 |
-                                       V_HDLC_TRP | V_IFF);
+                                        V_HDLC_TRP | V_IFF);
                        HFC_outb(hc, A_SUBCH_CFG, 0);
                        HFC_outb(hc, A_IRQ_MSK, 0);
                        HFC_outb(hc, R_INC_RES_FIFO, V_RES_F);
@@ -3064,15 +3064,15 @@ mode_hfcmulti(struct hfc_multi *hc, int ch, int protocol, int slot_tx,
                        /* tx silence */
                        HFC_outb_nodebug(hc, A_FIFO_DATA0_NOINC, hc->silence);
                        /* enable RX fifo */
-                       HFC_outb(hc, R_FIFO, (ch<<1)|1);
+                       HFC_outb(hc, R_FIFO, (ch << 1) | 1);
                        HFC_wait(hc);
                        if (hc->ctype == HFC_TYPE_XHFC)
                                HFC_outb(hc, A_CON_HDLC, flow_rx | 0x07 << 2 |
-                                       V_HDLC_TRP);
-                                       /* Enable FIFO, no interrupt*/
+                                        V_HDLC_TRP);
+                       /* Enable FIFO, no interrupt*/
                        else
                                HFC_outb(hc, A_CON_HDLC, flow_rx | 0x00 |
-                                               V_HDLC_TRP);
+                                        V_HDLC_TRP);
                        HFC_outb(hc, A_SUBCH_CFG, 0);
                        HFC_outb(hc, A_IRQ_MSK, 0);
                        HFC_outb(hc, R_INC_RES_FIFO, V_RES_F);
@@ -3080,16 +3080,16 @@ mode_hfcmulti(struct hfc_multi *hc, int ch, int protocol, int slot_tx,
                }
                if (hc->ctype != HFC_TYPE_E1) {
                        hc->hw.a_st_ctrl0[hc->chan[ch].port] |=
-                           ((ch & 0x3) == 0) ? V_B1_EN : V_B2_EN;
+                               ((ch & 0x3) == 0) ? V_B1_EN : V_B2_EN;
                        HFC_outb(hc, R_ST_SEL, hc->chan[ch].port);
                        /* undocumented: delay after R_ST_SEL */
                        udelay(1);
                        HFC_outb(hc, A_ST_CTRL0,
-                           hc->hw.a_st_ctrl0[hc->chan[ch].port]);
+                                hc->hw.a_st_ctrl0[hc->chan[ch].port]);
                }
                if (hc->chan[ch].bch)
                        test_and_set_bit(FLG_TRANSPARENT,
-                           &hc->chan[ch].bch->Flags);
+                                        &hc->chan[ch].bch->Flags);
                break;
        case (ISDN_P_B_HDLC): /* B-channel */
        case (ISDN_P_TE_S0): /* D-channel */
@@ -3097,7 +3097,7 @@ mode_hfcmulti(struct hfc_multi *hc, int ch, int protocol, int slot_tx,
        case (ISDN_P_TE_E1):
        case (ISDN_P_NT_E1):
                /* enable TX fifo */
-               HFC_outb(hc, R_FIFO, ch<<1);
+               HFC_outb(hc, R_FIFO, ch << 1);
                HFC_wait(hc);
                if (hc->ctype == HFC_TYPE_E1 || hc->chan[ch].bch) {
                        /* E1 or B-channel */
@@ -3112,7 +3112,7 @@ mode_hfcmulti(struct hfc_multi *hc, int ch, int protocol, int slot_tx,
                HFC_outb(hc, R_INC_RES_FIFO, V_RES_F);
                HFC_wait(hc);
                /* enable RX fifo */
-               HFC_outb(hc, R_FIFO, (ch<<1)|1);
+               HFC_outb(hc, R_FIFO, (ch << 1) | 1);
                HFC_wait(hc);
                HFC_outb(hc, A_CON_HDLC, flow_rx | 0x04);
                if (hc->ctype == HFC_TYPE_E1 || hc->chan[ch].bch)
@@ -3126,18 +3126,18 @@ mode_hfcmulti(struct hfc_multi *hc, int ch, int protocol, int slot_tx,
                        test_and_set_bit(FLG_HDLC, &hc->chan[ch].bch->Flags);
                        if (hc->ctype != HFC_TYPE_E1) {
                                hc->hw.a_st_ctrl0[hc->chan[ch].port] |=
-                                 ((ch&0x3) == 0) ? V_B1_EN : V_B2_EN;
+                                       ((ch & 0x3) == 0) ? V_B1_EN : V_B2_EN;
                                HFC_outb(hc, R_ST_SEL, hc->chan[ch].port);
                                /* undocumented: delay after R_ST_SEL */
                                udelay(1);
                                HFC_outb(hc, A_ST_CTRL0,
-                                 hc->hw.a_st_ctrl0[hc->chan[ch].port]);
+                                        hc->hw.a_st_ctrl0[hc->chan[ch].port]);
                        }
                }
                break;
        default:
                printk(KERN_DEBUG "%s: protocol not known %x\n",
-                   __func__, protocol);
+                      __func__, protocol);
                hc->chan[ch].protocol = ISDN_P_NONE;
                return -ENOPROTOOPT;
        }
@@ -3152,7 +3152,7 @@ mode_hfcmulti(struct hfc_multi *hc, int ch, int protocol, int slot_tx,
 
 static void
 hfcmulti_pcm(struct hfc_multi *hc, int ch, int slot_tx, int bank_tx,
-    int slot_rx, int bank_rx)
+            int slot_rx, int bank_rx)
 {
        if (slot_tx < 0 || slot_rx < 0 || bank_tx < 0 || bank_rx < 0) {
                /* disable PCM */
@@ -3162,7 +3162,7 @@ hfcmulti_pcm(struct hfc_multi *hc, int ch, int slot_tx, int bank_tx,
 
        /* enable pcm */
        mode_hfcmulti(hc, ch, hc->chan[ch].protocol, slot_tx, bank_tx,
-               slot_rx, bank_rx);
+                     slot_rx, bank_rx);
 }
 
 /*
@@ -3177,8 +3177,8 @@ hfcmulti_conf(struct hfc_multi *hc, int ch, int num)
        else
                hc->chan[ch].conf = -1;
        mode_hfcmulti(hc, ch, hc->chan[ch].protocol, hc->chan[ch].slot_tx,
-           hc->chan[ch].bank_tx, hc->chan[ch].slot_rx,
-           hc->chan[ch].bank_rx);
+                     hc->chan[ch].bank_tx, hc->chan[ch].slot_rx,
+                     hc->chan[ch].bank_rx);
 }
 
 
@@ -3207,8 +3207,8 @@ hfcm_l1callback(struct dchannel *dch, u_int cmd)
                if (hc->ctype == HFC_TYPE_E1) {
                        if (debug & DEBUG_HFCMULTI_MSG)
                                printk(KERN_DEBUG
-                                   "%s: HW_RESET_REQ no BRI\n",
-                                   __func__);
+                                      "%s: HW_RESET_REQ no BRI\n",
+                                      __func__);
                } else {
                        HFC_outb(hc, R_ST_SEL, hc->chan[dch->slot].port);
                        /* undocumented: delay after R_ST_SEL */
@@ -3216,8 +3216,8 @@ hfcm_l1callback(struct dchannel *dch, u_int cmd)
                        HFC_outb(hc, A_ST_WR_STATE, V_ST_LD_STA | 3); /* F3 */
                        udelay(6); /* wait at least 5,21us */
                        HFC_outb(hc, A_ST_WR_STATE, 3);
-                       HFC_outb(hc, A_ST_WR_STATE, 3 | (V_ST_ACT*3));
-                               /* activate */
+                       HFC_outb(hc, A_ST_WR_STATE, 3 | (V_ST_ACT * 3));
+                       /* activate */
                }
                spin_unlock_irqrestore(&hc->lock, flags);
                l1_event(dch->l1, HW_POWERUP_IND);
@@ -3228,17 +3228,17 @@ hfcm_l1callback(struct dchannel *dch, u_int cmd)
                if (hc->ctype == HFC_TYPE_E1) {
                        if (debug & DEBUG_HFCMULTI_MSG)
                                printk(KERN_DEBUG
-                                   "%s: HW_DEACT_REQ no BRI\n",
-                                   __func__);
+                                      "%s: HW_DEACT_REQ no BRI\n",
+                                      __func__);
                } else {
                        HFC_outb(hc, R_ST_SEL, hc->chan[dch->slot].port);
                        /* undocumented: delay after R_ST_SEL */
                        udelay(1);
-                       HFC_outb(hc, A_ST_WR_STATE, V_ST_ACT*2);
-                               /* deactivate */
+                       HFC_outb(hc, A_ST_WR_STATE, V_ST_ACT * 2);
+                       /* deactivate */
                        if (test_bit(HFC_CHIP_PLXSD, &hc->chip)) {
                                hc->syncronized &=
-                                  ~(1 << hc->chan[dch->slot].port);
+                                       ~(1 << hc->chan[dch->slot].port);
                                plxsd_checksync(hc, 0);
                        }
                }
@@ -3262,8 +3262,8 @@ hfcm_l1callback(struct dchannel *dch, u_int cmd)
                if (hc->ctype == HFC_TYPE_E1) {
                        if (debug & DEBUG_HFCMULTI_MSG)
                                printk(KERN_DEBUG
-                                   "%s: HW_POWERUP_REQ no BRI\n",
-                                   __func__);
+                                      "%s: HW_POWERUP_REQ no BRI\n",
+                                      __func__);
                } else {
                        HFC_outb(hc, R_ST_SEL, hc->chan[dch->slot].port);
                        /* undocumented: delay after R_ST_SEL */
@@ -3277,17 +3277,17 @@ hfcm_l1callback(struct dchannel *dch, u_int cmd)
        case PH_ACTIVATE_IND:
                test_and_set_bit(FLG_ACTIVE, &dch->Flags);
                _queue_data(&dch->dev.D, cmd, MISDN_ID_ANY, 0, NULL,
-                       GFP_ATOMIC);
+                           GFP_ATOMIC);
                break;
        case PH_DEACTIVATE_IND:
                test_and_clear_bit(FLG_ACTIVE, &dch->Flags);
                _queue_data(&dch->dev.D, cmd, MISDN_ID_ANY, 0, NULL,
-                       GFP_ATOMIC);
+                           GFP_ATOMIC);
                break;
        default:
                if (dch->debug & DEBUG_HW)
                        printk(KERN_DEBUG "%s: unknown command %x\n",
-                           __func__, cmd);
+                              __func__, cmd);
                return -1;
        }
        return 0;
@@ -3332,27 +3332,27 @@ handle_dmsg(struct mISDNchannel *ch, struct sk_buff *skb)
                        ret = 0;
                        if (debug & DEBUG_HFCMULTI_MSG)
                                printk(KERN_DEBUG
-                                   "%s: PH_ACTIVATE port %d (0..%d)\n",
-                                   __func__, hc->chan[dch->slot].port,
-                                   hc->ports-1);
+                                      "%s: PH_ACTIVATE port %d (0..%d)\n",
+                                      __func__, hc->chan[dch->slot].port,
+                                      hc->ports - 1);
                        /* start activation */
                        if (hc->ctype == HFC_TYPE_E1) {
                                ph_state_change(dch);
                                if (debug & DEBUG_HFCMULTI_STATE)
                                        printk(KERN_DEBUG
-                                           "%s: E1 report state %x \n",
-                                           __func__, dch->state);
+                                              "%s: E1 report state %x \n",
+                                              __func__, dch->state);
                        } else {
                                HFC_outb(hc, R_ST_SEL,
-                                   hc->chan[dch->slot].port);
+                                        hc->chan[dch->slot].port);
                                /* undocumented: delay after R_ST_SEL */
                                udelay(1);
                                HFC_outb(hc, A_ST_WR_STATE, V_ST_LD_STA | 1);
-                                   /* G1 */
+                               /* G1 */
                                udelay(6); /* wait at least 5,21us */
                                HFC_outb(hc, A_ST_WR_STATE, 1);
                                HFC_outb(hc, A_ST_WR_STATE, 1 |
-                                   (V_ST_ACT*3)); /* activate */
+                                        (V_ST_ACT * 3)); /* activate */
                                dch->state = 1;
                        }
                        spin_unlock_irqrestore(&hc->lock, flags);
@@ -3365,22 +3365,22 @@ handle_dmsg(struct mISDNchannel *ch, struct sk_buff *skb)
                        spin_lock_irqsave(&hc->lock, flags);
                        if (debug & DEBUG_HFCMULTI_MSG)
                                printk(KERN_DEBUG
-                                   "%s: PH_DEACTIVATE port %d (0..%d)\n",
-                                   __func__, hc->chan[dch->slot].port,
-                                   hc->ports-1);
+                                      "%s: PH_DEACTIVATE port %d (0..%d)\n",
+                                      __func__, hc->chan[dch->slot].port,
+                                      hc->ports - 1);
                        /* start deactivation */
                        if (hc->ctype == HFC_TYPE_E1) {
                                if (debug & DEBUG_HFCMULTI_MSG)
                                        printk(KERN_DEBUG
-                                           "%s: PH_DEACTIVATE no BRI\n",
-                                           __func__);
+                                              "%s: PH_DEACTIVATE no BRI\n",
+                                              __func__);
                        } else {
                                HFC_outb(hc, R_ST_SEL,
-                                   hc->chan[dch->slot].port);
+                                        hc->chan[dch->slot].port);
                                /* undocumented: delay after R_ST_SEL */
                                udelay(1);
                                HFC_outb(hc, A_ST_WR_STATE, V_ST_ACT * 2);
-                                   /* deactivate */
+                               /* deactivate */
                                dch->state = 1;
                        }
                        skb_queue_purge(&dch->squeue);
@@ -3460,28 +3460,28 @@ handle_bmsg(struct mISDNchannel *ch, struct sk_buff *skb)
        case PH_ACTIVATE_REQ:
                if (debug & DEBUG_HFCMULTI_MSG)
                        printk(KERN_DEBUG "%s: PH_ACTIVATE ch %d (0..32)\n",
-                               __func__, bch->slot);
+                              __func__, bch->slot);
                spin_lock_irqsave(&hc->lock, flags);
                /* activate B-channel if not already activated */
                if (!test_and_set_bit(FLG_ACTIVE, &bch->Flags)) {
                        hc->chan[bch->slot].txpending = 0;
                        ret = mode_hfcmulti(hc, bch->slot,
-                               ch->protocol,
-                               hc->chan[bch->slot].slot_tx,
-                               hc->chan[bch->slot].bank_tx,
-                               hc->chan[bch->slot].slot_rx,
-                               hc->chan[bch->slot].bank_rx);
+                                           ch->protocol,
+                                           hc->chan[bch->slot].slot_tx,
+                                           hc->chan[bch->slot].bank_tx,
+                                           hc->chan[bch->slot].slot_rx,
+                                           hc->chan[bch->slot].bank_rx);
                        if (!ret) {
                                if (ch->protocol == ISDN_P_B_RAW && !hc->dtmf
-                                       && test_bit(HFC_CHIP_DTMF, &hc->chip)) {
+                                   && test_bit(HFC_CHIP_DTMF, &hc->chip)) {
                                        /* start decoder */
                                        hc->dtmf = 1;
                                        if (debug & DEBUG_HFCMULTI_DTMF)
                                                printk(KERN_DEBUG
-                                                   "%s: start dtmf decoder\n",
-                                                       __func__);
+                                                      "%s: start dtmf decoder\n",
+                                                      __func__);
                                        HFC_outb(hc, R_DTMF, hc->hw.r_dtmf |
-                                           V_RST_DTMF);
+                                                V_RST_DTMF);
                                }
                        }
                } else
@@ -3489,7 +3489,7 @@ handle_bmsg(struct mISDNchannel *ch, struct sk_buff *skb)
                spin_unlock_irqrestore(&hc->lock, flags);
                if (!ret)
                        _queue_data(ch, PH_ACTIVATE_IND, MISDN_ID_ANY, 0, NULL,
-                               GFP_KERNEL);
+                                   GFP_KERNEL);
                break;
        case PH_CONTROL_REQ:
                spin_lock_irqsave(&hc->lock, flags);
@@ -3497,20 +3497,20 @@ handle_bmsg(struct mISDNchannel *ch, struct sk_buff *skb)
                case HFC_SPL_LOOP_ON: /* set sample loop */
                        if (debug & DEBUG_HFCMULTI_MSG)
                                printk(KERN_DEBUG
-                                   "%s: HFC_SPL_LOOP_ON (len = %d)\n",
-                                   __func__, skb->len);
+                                      "%s: HFC_SPL_LOOP_ON (len = %d)\n",
+                                      __func__, skb->len);
                        ret = 0;
                        break;
                case HFC_SPL_LOOP_OFF: /* set silence */
                        if (debug & DEBUG_HFCMULTI_MSG)
                                printk(KERN_DEBUG "%s: HFC_SPL_LOOP_OFF\n",
-                                   __func__);
+                                      __func__);
                        ret = 0;
                        break;
                default:
                        printk(KERN_ERR
-                            "%s: unknown PH_CONTROL_REQ info %x\n",
-                            __func__, hh->id);
+                              "%s: unknown PH_CONTROL_REQ info %x\n",
+                              __func__, hh->id);
                        ret = -EINVAL;
                }
                spin_unlock_irqrestore(&hc->lock, flags);
@@ -3518,7 +3518,7 @@ handle_bmsg(struct mISDNchannel *ch, struct sk_buff *skb)
        case PH_DEACTIVATE_REQ:
                deactivate_bchannel(bch); /* locked there */
                _queue_data(ch, PH_DEACTIVATE_IND, MISDN_ID_ANY, 0, NULL,
-                       GFP_KERNEL);
+                           GFP_KERNEL);
                ret = 0;
                break;
        }
@@ -3559,18 +3559,18 @@ channel_bctrl(struct bchannel *bch, struct mISDN_ctrl_req *cq)
                }
                if (debug & DEBUG_HFCMULTI_MSG)
                        printk(KERN_DEBUG "%s: RX_OFF request (nr=%d off=%d)\n",
-                           __func__, bch->nr, hc->chan[bch->slot].rx_off);
+                              __func__, bch->nr, hc->chan[bch->slot].rx_off);
                break;
        case MISDN_CTRL_FILL_EMPTY: /* fill fifo, if empty */
                test_and_set_bit(FLG_FILLEMPTY, &bch->Flags);
                if (debug & DEBUG_HFCMULTI_MSG)
                        printk(KERN_DEBUG "%s: FILL_EMPTY request (nr=%d "
-                               "off=%d)\n", __func__, bch->nr, !!cq->p1);
+                              "off=%d)\n", __func__, bch->nr, !!cq->p1);
                break;
        case MISDN_CTRL_HW_FEATURES: /* fill features structure */
                if (debug & DEBUG_HFCMULTI_MSG)
                        printk(KERN_DEBUG "%s: HW_FEATURE request\n",
-                           __func__);
+                              __func__);
                /* create confirm */
                features->hfc_id = hc->id;
                if (test_bit(HFC_CHIP_DTMF, &hc->chip))
@@ -3593,40 +3593,40 @@ channel_bctrl(struct bchannel *bch, struct mISDN_ctrl_req *cq)
                bank_rx = cq->p2 >> 8;
                if (debug & DEBUG_HFCMULTI_MSG)
                        printk(KERN_DEBUG
-                           "%s: HFC_PCM_CONN slot %d bank %d (TX) "
-                           "slot %d bank %d (RX)\n",
-                           __func__, slot_tx, bank_tx,
-                           slot_rx, bank_rx);
+                              "%s: HFC_PCM_CONN slot %d bank %d (TX) "
+                              "slot %d bank %d (RX)\n",
+                              __func__, slot_tx, bank_tx,
+                              slot_rx, bank_rx);
                if (slot_tx < hc->slots && bank_tx <= 2 &&
                    slot_rx < hc->slots && bank_rx <= 2)
                        hfcmulti_pcm(hc, bch->slot,
-                           slot_tx, bank_tx, slot_rx, bank_rx);
+                                    slot_tx, bank_tx, slot_rx, bank_rx);
                else {
                        printk(KERN_WARNING
-                           "%s: HFC_PCM_CONN slot %d bank %d (TX) "
-                           "slot %d bank %d (RX) out of range\n",
-                           __func__, slot_tx, bank_tx,
-                           slot_rx, bank_rx);
+                              "%s: HFC_PCM_CONN slot %d bank %d (TX) "
+                              "slot %d bank %d (RX) out of range\n",
+                              __func__, slot_tx, bank_tx,
+                              slot_rx, bank_rx);
                        ret = -EINVAL;
                }
                break;
        case MISDN_CTRL_HFC_PCM_DISC: /* release interface from pcm timeslot */
                if (debug & DEBUG_HFCMULTI_MSG)
                        printk(KERN_DEBUG "%s: HFC_PCM_DISC\n",
-                           __func__);
+                              __func__);
                hfcmulti_pcm(hc, bch->slot, -1, 0, -1, 0);
                break;
        case MISDN_CTRL_HFC_CONF_JOIN: /* join conference (0..7) */
                num = cq->p1 & 0xff;
                if (debug & DEBUG_HFCMULTI_MSG)
                        printk(KERN_DEBUG "%s: HFC_CONF_JOIN conf %d\n",
-                           __func__, num);
+                              __func__, num);
                if (num <= 7)
                        hfcmulti_conf(hc, bch->slot, num);
                else {
                        printk(KERN_WARNING
-                           "%s: HW_CONF_JOIN conf %d out of range\n",
-                           __func__, num);
+                              "%s: HW_CONF_JOIN conf %d out of range\n",
+                              __func__, num);
                        ret = -EINVAL;
                }
                break;
@@ -3647,7 +3647,7 @@ channel_bctrl(struct bchannel *bch, struct mISDN_ctrl_req *cq)
        case MISDN_CTRL_HFC_ECHOCAN_OFF:
                if (debug & DEBUG_HFCMULTI_MSG)
                        printk(KERN_DEBUG "%s: HFC_ECHOCAN_OFF\n",
-                               __func__);
+                              __func__);
                if (test_bit(HFC_CHIP_B410P, &hc->chip))
                        vpm_echocan_off(hc, bch->slot);
                else
@@ -3655,7 +3655,7 @@ channel_bctrl(struct bchannel *bch, struct mISDN_ctrl_req *cq)
                break;
        default:
                printk(KERN_WARNING "%s: unknown Op %x\n",
-                   __func__, cq->op);
+                      __func__, cq->op);
                ret = -EINVAL;
                break;
        }
@@ -3672,7 +3672,7 @@ hfcm_bctrl(struct mISDNchannel *ch, u_int cmd, void *arg)
 
        if (bch->debug & DEBUG_HW)
                printk(KERN_DEBUG "%s: cmd:%x %p\n",
-                   __func__, cmd, arg);
+                      __func__, cmd, arg);
        switch (cmd) {
        case CLOSE_CHANNEL:
                test_and_clear_bit(FLG_OPEN, &bch->Flags);
@@ -3690,7 +3690,7 @@ hfcm_bctrl(struct mISDNchannel *ch, u_int cmd, void *arg)
                break;
        default:
                printk(KERN_WARNING "%s: unknown prim(%x)\n",
-                       __func__, cmd);
+                      __func__, cmd);
        }
        return err;
 }
@@ -3717,13 +3717,13 @@ ph_state_change(struct dchannel *dch)
                if (dch->dev.D.protocol == ISDN_P_TE_E1) {
                        if (debug & DEBUG_HFCMULTI_STATE)
                                printk(KERN_DEBUG
-                                   "%s: E1 TE (id=%d) newstate %x\n",
-                                   __func__, hc->id, dch->state);
+                                      "%s: E1 TE (id=%d) newstate %x\n",
+                                      __func__, hc->id, dch->state);
                } else {
                        if (debug & DEBUG_HFCMULTI_STATE)
                                printk(KERN_DEBUG
-                                   "%s: E1 NT (id=%d) newstate %x\n",
-                                   __func__, hc->id, dch->state);
+                                      "%s: E1 NT (id=%d) newstate %x\n",
+                                      __func__, hc->id, dch->state);
                }
                switch (dch->state) {
                case (1):
@@ -3731,16 +3731,16 @@ ph_state_change(struct dchannel *dch)
                                for (i = 1; i <= 31; i++) {
                                        /* reset fifos on e1 activation */
                                        HFC_outb_nodebug(hc, R_FIFO,
-                                               (i << 1) | 1);
+                                                        (i << 1) | 1);
                                        HFC_wait_nodebug(hc);
                                        HFC_outb_nodebug(hc, R_INC_RES_FIFO,
-                                               V_RES_F);
+                                                        V_RES_F);
                                        HFC_wait_nodebug(hc);
                                }
                        }
                        test_and_set_bit(FLG_ACTIVE, &dch->Flags);
                        _queue_data(&dch->dev.D, PH_ACTIVATE_IND,
-                           MISDN_ID_ANY, 0, NULL, GFP_ATOMIC);
+                                   MISDN_ID_ANY, 0, NULL, GFP_ATOMIC);
                        break;
 
                default:
@@ -3748,15 +3748,15 @@ ph_state_change(struct dchannel *dch)
                                return;
                        test_and_clear_bit(FLG_ACTIVE, &dch->Flags);
                        _queue_data(&dch->dev.D, PH_DEACTIVATE_IND,
-                           MISDN_ID_ANY, 0, NULL, GFP_ATOMIC);
+                                   MISDN_ID_ANY, 0, NULL, GFP_ATOMIC);
                }
                hc->e1_state = dch->state;
        } else {
                if (dch->dev.D.protocol == ISDN_P_TE_S0) {
                        if (debug & DEBUG_HFCMULTI_STATE)
                                printk(KERN_DEBUG
-                                   "%s: S/T TE newstate %x\n",
-                                   __func__, dch->state);
+                                      "%s: S/T TE newstate %x\n",
+                                      __func__, dch->state);
                        switch (dch->state) {
                        case (0):
                                l1_event(dch->l1, HW_RESET_IND);
@@ -3778,38 +3778,38 @@ ph_state_change(struct dchannel *dch)
                } else {
                        if (debug & DEBUG_HFCMULTI_STATE)
                                printk(KERN_DEBUG "%s: S/T NT newstate %x\n",
-                                   __func__, dch->state);
+                                      __func__, dch->state);
                        switch (dch->state) {
                        case (2):
                                if (hc->chan[ch].nt_timer == 0) {
                                        hc->chan[ch].nt_timer = -1;
                                        HFC_outb(hc, R_ST_SEL,
-                                           hc->chan[ch].port);
+                                                hc->chan[ch].port);
                                        /* undocumented: delay after R_ST_SEL */
                                        udelay(1);
                                        HFC_outb(hc, A_ST_WR_STATE, 4 |
-                                           V_ST_LD_STA); /* G4 */
+                                                V_ST_LD_STA); /* G4 */
                                        udelay(6); /* wait at least 5,21us */
                                        HFC_outb(hc, A_ST_WR_STATE, 4);
                                        dch->state = 4;
                                } else {
                                        /* one extra count for the next event */
                                        hc->chan[ch].nt_timer =
-                                           nt_t1_count[poll_timer] + 1;
+                                               nt_t1_count[poll_timer] + 1;
                                        HFC_outb(hc, R_ST_SEL,
-                                           hc->chan[ch].port);
+                                                hc->chan[ch].port);
                                        /* undocumented: delay after R_ST_SEL */
                                        udelay(1);
                                        /* allow G2 -> G3 transition */
                                        HFC_outb(hc, A_ST_WR_STATE, 2 |
-                                           V_SET_G2_G3);
+                                                V_SET_G2_G3);
                                }
                                break;
                        case (1):
                                hc->chan[ch].nt_timer = -1;
                                test_and_clear_bit(FLG_ACTIVE, &dch->Flags);
                                _queue_data(&dch->dev.D, PH_DEACTIVATE_IND,
-                                   MISDN_ID_ANY, 0, NULL, GFP_ATOMIC);
+                                           MISDN_ID_ANY, 0, NULL, GFP_ATOMIC);
                                break;
                        case (4):
                                hc->chan[ch].nt_timer = -1;
@@ -3818,7 +3818,7 @@ ph_state_change(struct dchannel *dch)
                                hc->chan[ch].nt_timer = -1;
                                test_and_set_bit(FLG_ACTIVE, &dch->Flags);
                                _queue_data(&dch->dev.D, PH_ACTIVATE_IND,
-                                   MISDN_ID_ANY, 0, NULL, GFP_ATOMIC);
+                                           MISDN_ID_ANY, 0, NULL, GFP_ATOMIC);
                                break;
                        }
                }
@@ -3845,7 +3845,7 @@ hfcmulti_initmode(struct dchannel *dch)
                hc->chan[hc->dslot].conf = -1;
                if (hc->dslot) {
                        mode_hfcmulti(hc, hc->dslot, dch->dev.D.protocol,
-                               -1, 0, -1, 0);
+                                     -1, 0, -1, 0);
                        dch->timer.function = (void *) hfcmulti_dbusy_timer;
                        dch->timer.data = (long) dch;
                        init_timer(&dch->timer);
@@ -3887,13 +3887,13 @@ hfcmulti_initmode(struct dchannel *dch)
                if (dch->dev.D.protocol == ISDN_P_NT_E1) {
                        if (debug & DEBUG_HFCMULTI_INIT)
                                printk(KERN_DEBUG "%s: E1 port is NT-mode\n",
-                                   __func__);
+                                      __func__);
                        r_e1_wr_sta = 0; /* G0 */
                        hc->e1_getclock = 0;
                } else {
                        if (debug & DEBUG_HFCMULTI_INIT)
                                printk(KERN_DEBUG "%s: E1 port is TE-mode\n",
-                                   __func__);
+                                      __func__);
                        r_e1_wr_sta = 0; /* F0 */
                        hc->e1_getclock = 1;
                }
@@ -3909,26 +3909,26 @@ hfcmulti_initmode(struct dchannel *dch)
                        /* SLAVE (clock master) */
                        if (debug & DEBUG_HFCMULTI_INIT)
                                printk(KERN_DEBUG
-                                   "%s: E1 port is clock master "
-                                   "(clock from PCM)\n", __func__);
+                                      "%s: E1 port is clock master "
+                                      "(clock from PCM)\n", __func__);
                        HFC_outb(hc, R_SYNC_CTRL, V_EXT_CLK_SYNC | V_PCM_SYNC);
                } else {
                        if (hc->e1_getclock) {
                                /* MASTER (clock slave) */
                                if (debug & DEBUG_HFCMULTI_INIT)
                                        printk(KERN_DEBUG
-                                           "%s: E1 port is clock slave "
-                                           "(clock to PCM)\n", __func__);
+                                              "%s: E1 port is clock slave "
+                                              "(clock to PCM)\n", __func__);
                                HFC_outb(hc, R_SYNC_CTRL, V_SYNC_OFFS);
                        } else {
                                /* MASTER (clock master) */
                                if (debug & DEBUG_HFCMULTI_INIT)
                                        printk(KERN_DEBUG "%s: E1 port is "
-                                           "clock master "
-                                           "(clock from QUARTZ)\n",
-                                           __func__);
+                                              "clock master "
+                                              "(clock from QUARTZ)\n",
+                                              __func__);
                                HFC_outb(hc, R_SYNC_CTRL, V_EXT_CLK_SYNC |
-                                   V_PCM_SYNC | V_JATT_OFF);
+                                        V_PCM_SYNC | V_JATT_OFF);
                                HFC_outb(hc, R_SYNC_OUT, 0);
                        }
                }
@@ -3970,8 +3970,8 @@ hfcmulti_initmode(struct dchannel *dch)
                if (dch->dev.D.protocol == ISDN_P_NT_S0) {
                        if (debug & DEBUG_HFCMULTI_INIT)
                                printk(KERN_DEBUG
-                                   "%s: ST port %d is NT-mode\n",
-                                   __func__, pt);
+                                      "%s: ST port %d is NT-mode\n",
+                                      __func__, pt);
                        /* clock delay */
                        HFC_outb(hc, A_ST_CLK_DLY, clockdelay_nt);
                        a_st_wr_state = 1; /* G1 */
@@ -3979,8 +3979,8 @@ hfcmulti_initmode(struct dchannel *dch)
                } else {
                        if (debug & DEBUG_HFCMULTI_INIT)
                                printk(KERN_DEBUG
-                                   "%s: ST port %d is TE-mode\n",
-                                   __func__, pt);
+                                      "%s: ST port %d is TE-mode\n",
+                                      __func__, pt);
                        /* clock delay */
                        HFC_outb(hc, A_ST_CLK_DLY, clockdelay_te);
                        a_st_wr_state = 2; /* F2 */
@@ -3991,7 +3991,7 @@ hfcmulti_initmode(struct dchannel *dch)
                if (hc->ctype == HFC_TYPE_XHFC) {
                        hc->hw.a_st_ctrl0[pt] |= 0x40 /* V_ST_PU_CTRL */;
                        HFC_outb(hc, 0x35 /* A_ST_CTRL3 */,
-                               0x7c << 1 /* V_ST_PULSE */);
+                                0x7c << 1 /* V_ST_PULSE */);
                }
                /* line setup */
                HFC_outb(hc, A_ST_CTRL0,  hc->hw.a_st_ctrl0[pt]);
@@ -4013,7 +4013,7 @@ hfcmulti_initmode(struct dchannel *dch)
                /* unset sync on port */
                if (test_bit(HFC_CHIP_PLXSD, &hc->chip)) {
                        hc->syncronized &=
-                          ~(1 << hc->chan[dch->slot].port);
+                               ~(1 << hc->chan[dch->slot].port);
                        plxsd_checksync(hc, 0);
                }
        }
@@ -4024,21 +4024,21 @@ hfcmulti_initmode(struct dchannel *dch)
 
 static int
 open_dchannel(struct hfc_multi *hc, struct dchannel *dch,
-    struct channel_req *rq)
+             struct channel_req *rq)
 {
        int     err = 0;
        u_long  flags;
 
        if (debug & DEBUG_HW_OPEN)
                printk(KERN_DEBUG "%s: dev(%d) open from %p\n", __func__,
-                   dch->dev.id, __builtin_return_address(0));
+                      dch->dev.id, __builtin_return_address(0));
        if (rq->protocol == ISDN_P_NONE)
                return -EINVAL;
        if ((dch->dev.D.protocol != ISDN_P_NONE) &&
            (dch->dev.D.protocol != rq->protocol)) {
                if (debug & DEBUG_HFCMULTI_MODE)
                        printk(KERN_DEBUG "%s: change protocol %x to %x\n",
-                           __func__, dch->dev.D.protocol, rq->protocol);
+                              __func__, dch->dev.D.protocol, rq->protocol);
        }
        if ((dch->dev.D.protocol == ISDN_P_TE_S0) &&
            (rq->protocol != ISDN_P_TE_S0))
@@ -4060,7 +4060,7 @@ open_dchannel(struct hfc_multi *hc, struct dchannel *dch,
            ((rq->protocol == ISDN_P_NT_E1) && (dch->state == 1)) ||
            ((rq->protocol == ISDN_P_TE_E1) && (dch->state == 1))) {
                _queue_data(&dch->dev.D, PH_ACTIVATE_IND, MISDN_ID_ANY,
-                   0, NULL, GFP_KERNEL);
+                           0, NULL, GFP_KERNEL);
        }
        rq->ch = &dch->dev.D;
        if (!try_module_get(THIS_MODULE))
@@ -4070,7 +4070,7 @@ open_dchannel(struct hfc_multi *hc, struct dchannel *dch,
 
 static int
 open_bchannel(struct hfc_multi *hc, struct dchannel *dch,
-    struct channel_req *rq)
+             struct channel_req *rq)
 {
        struct bchannel *bch;
        int             ch;
@@ -4086,7 +4086,7 @@ open_bchannel(struct hfc_multi *hc, struct dchannel *dch,
        bch = hc->chan[ch].bch;
        if (!bch) {
                printk(KERN_ERR "%s:internal error ch %d has no bch\n",
-                   __func__, ch);
+                      __func__, ch);
                return -EINVAL;
        }
        if (test_and_set_bit(FLG_OPEN, &bch->Flags))
@@ -4119,8 +4119,8 @@ channel_dctrl(struct dchannel *dch, struct mISDN_ctrl_req *cq)
                wd_mode = !!(cq->p1 >> 4);
                if (debug & DEBUG_HFCMULTI_MSG)
                        printk(KERN_DEBUG "%s: MISDN_CTRL_HFC_WD_INIT mode %s"
-                           ", counter 0x%x\n", __func__,
-                           wd_mode ? "AUTO" : "MANUAL", wd_cnt);
+                              ", counter 0x%x\n", __func__,
+                              wd_mode ? "AUTO" : "MANUAL", wd_cnt);
                /* set the watchdog timer */
                HFC_outb(hc, R_TI_WD, poll_timer | (wd_cnt << 4));
                hc->hw.r_bert_wd_md = (wd_mode ? V_AUTO_WD_RES : 0);
@@ -4139,12 +4139,12 @@ channel_dctrl(struct dchannel *dch, struct mISDN_ctrl_req *cq)
        case MISDN_CTRL_HFC_WD_RESET: /* reset the watchdog counter */
                if (debug & DEBUG_HFCMULTI_MSG)
                        printk(KERN_DEBUG "%s: MISDN_CTRL_HFC_WD_RESET\n",
-                           __func__);
+                              __func__);
                HFC_outb(hc, R_BERT_WD_MD, hc->hw.r_bert_wd_md | V_WD_RES);
                break;
        default:
                printk(KERN_WARNING "%s: unknown Op %x\n",
-                   __func__, cq->op);
+                      __func__, cq->op);
                ret = -EINVAL;
                break;
        }
@@ -4163,7 +4163,7 @@ hfcm_dctrl(struct mISDNchannel *ch, u_int cmd, void *arg)
 
        if (dch->debug & DEBUG_HW)
                printk(KERN_DEBUG "%s: cmd:%x %p\n",
-                   __func__, cmd, arg);
+                      __func__, cmd, arg);
        switch (cmd) {
        case OPEN_CHANNEL:
                rq = arg;
@@ -4193,8 +4193,8 @@ hfcm_dctrl(struct mISDNchannel *ch, u_int cmd, void *arg)
        case CLOSE_CHANNEL:
                if (debug & DEBUG_HW_OPEN)
                        printk(KERN_DEBUG "%s: dev(%d) close from %p\n",
-                           __func__, dch->dev.id,
-                           __builtin_return_address(0));
+                              __func__, dch->dev.id,
+                              __builtin_return_address(0));
                module_put(THIS_MODULE);
                break;
        case CONTROL_CHANNEL:
@@ -4205,7 +4205,7 @@ hfcm_dctrl(struct mISDNchannel *ch, u_int cmd, void *arg)
        default:
                if (dch->debug & DEBUG_HW)
                        printk(KERN_DEBUG "%s: unknown command %x\n",
-                           __func__, cmd);
+                              __func__, cmd);
                err = -EINVAL;
        }
        return err;
@@ -4246,9 +4246,9 @@ init_card(struct hfc_multi *hc)
        spin_unlock_irqrestore(&hc->lock, flags);
 
        if (request_irq(hc->irq, hfcmulti_interrupt, IRQF_SHARED,
-           "HFC-multi", hc)) {
+                       "HFC-multi", hc)) {
                printk(KERN_WARNING "mISDN: Could not get interrupt %d.\n",
-                   hc->irq);
+                      hc->irq);
                hc->irq = 0;
                return -EIO;
        }
@@ -4257,13 +4257,13 @@ init_card(struct hfc_multi *hc)
                spin_lock_irqsave(&plx_lock, plx_flags);
                plx_acc = hc->plx_membase + PLX_INTCSR;
                writew((PLX_INTCSR_PCIINT_ENABLE | PLX_INTCSR_LINTI1_ENABLE),
-                       plx_acc); /* enable PCI & LINT1 irq */
+                      plx_acc); /* enable PCI & LINT1 irq */
                spin_unlock_irqrestore(&plx_lock, plx_flags);
        }
 
        if (debug & DEBUG_HFCMULTI_INIT)
                printk(KERN_DEBUG "%s: IRQ %d count %d\n",
-                   __func__, hc->irq, hc->irqcnt);
+                      __func__, hc->irq, hc->irqcnt);
        err = init_chip(hc);
        if (err)
                goto error;
@@ -4277,14 +4277,14 @@ init_card(struct hfc_multi *hc)
        spin_unlock_irqrestore(&hc->lock, flags);
        /* printk(KERN_DEBUG "no master irq set!!!\n"); */
        set_current_state(TASK_UNINTERRUPTIBLE);
-       schedule_timeout((100*HZ)/1000); /* Timeout 100ms */
+       schedule_timeout((100 * HZ) / 1000); /* Timeout 100ms */
        /* turn IRQ off until chip is completely initialized */
        spin_lock_irqsave(&hc->lock, flags);
        disable_hwirq(hc);
        spin_unlock_irqrestore(&hc->lock, flags);
        if (debug & DEBUG_HFCMULTI_INIT)
                printk(KERN_DEBUG "%s: IRQ %d count %d\n",
-                   __func__, hc->irq, hc->irqcnt);
+                      __func__, hc->irq, hc->irqcnt);
        if (hc->irqcnt) {
                if (debug & DEBUG_HFCMULTI_INIT)
                        printk(KERN_DEBUG "%s: done\n", __func__);
@@ -4297,7 +4297,7 @@ init_card(struct hfc_multi *hc)
        }
 
        printk(KERN_ERR "HFC PCI: IRQ(%d) getting no interrupts during init.\n",
-               hc->irq);
+              hc->irq);
 
        err = -EIO;
 
@@ -4327,13 +4327,13 @@ error:
 
 static int
 setup_pci(struct hfc_multi *hc, struct pci_dev *pdev,
-               const struct pci_device_id *ent)
+         const struct pci_device_id *ent)
 {
        struct hm_map   *m = (struct hm_map *)ent->driver_data;
 
        printk(KERN_INFO
-           "HFC-multi: card manufacturer: '%s' card name: '%s' clock: %s\n",
-           m->vendor_name, m->card_name, m->clock2 ? "double" : "normal");
+              "HFC-multi: card manufacturer: '%s' card name: '%s' clock: %s\n",
+              m->vendor_name, m->card_name, m->clock2 ? "double" : "normal");
 
        hc->pci_dev = pdev;
        if (m->clock2)
@@ -4380,7 +4380,7 @@ setup_pci(struct hfc_multi *hc, struct pci_dev *pdev,
 
                if (!hc->plx_origmembase) {
                        printk(KERN_WARNING
-                         "HFC-multi: No IO-Memory for PCI PLX bridge found\n");
+                              "HFC-multi: No IO-Memory for PCI PLX bridge found\n");
                        pci_disable_device(hc->pci_dev);
                        return -EIO;
                }
@@ -4388,20 +4388,20 @@ setup_pci(struct hfc_multi *hc, struct pci_dev *pdev,
                hc->plx_membase = ioremap(hc->plx_origmembase, 0x80);
                if (!hc->plx_membase) {
                        printk(KERN_WARNING
-                           "HFC-multi: failed to remap plx address space. "
-                           "(internal error)\n");
+                              "HFC-multi: failed to remap plx address space. "
+                              "(internal error)\n");
                        pci_disable_device(hc->pci_dev);
                        return -EIO;
                }
                printk(KERN_INFO
-                   "HFC-multi: plx_membase:%#lx plx_origmembase:%#lx\n",
-                   (u_long)hc->plx_membase, hc->plx_origmembase);
+                      "HFC-multi: plx_membase:%#lx plx_origmembase:%#lx\n",
+                      (u_long)hc->plx_membase, hc->plx_origmembase);
 
                hc->pci_origmembase =  hc->pci_dev->resource[2].start;
-                   /* MEMBASE 1 is PLX PCI Bridge */
+               /* MEMBASE 1 is PLX PCI Bridge */
                if (!hc->pci_origmembase) {
                        printk(KERN_WARNING
-                           "HFC-multi: No IO-Memory for PCI card found\n");
+                              "HFC-multi: No IO-Memory for PCI card found\n");
                        pci_disable_device(hc->pci_dev);
                        return -EIO;
                }
@@ -4409,16 +4409,16 @@ setup_pci(struct hfc_multi *hc, struct pci_dev *pdev,
                hc->pci_membase = ioremap(hc->pci_origmembase, 0x400);
                if (!hc->pci_membase) {
                        printk(KERN_WARNING "HFC-multi: failed to remap io "
-                           "address space. (internal error)\n");
+                              "address space. (internal error)\n");
                        pci_disable_device(hc->pci_dev);
                        return -EIO;
                }
 
                printk(KERN_INFO
-                   "card %d: defined at MEMBASE %#lx (%#lx) IRQ %d HZ %d "
-                   "leds-type %d\n",
-                   hc->id, (u_long)hc->pci_membase, hc->pci_origmembase,
-                   hc->pci_dev->irq, HZ, hc->leds);
+                      "card %d: defined at MEMBASE %#lx (%#lx) IRQ %d HZ %d "
+                      "leds-type %d\n",
+                      hc->id, (u_long)hc->pci_membase, hc->pci_origmembase,
+                      hc->pci_dev->irq, HZ, hc->leds);
                pci_write_config_word(hc->pci_dev, PCI_COMMAND, PCI_ENA_MEMIO);
                break;
        case HFC_IO_MODE_PCIMEM:
@@ -4431,7 +4431,7 @@ setup_pci(struct hfc_multi *hc, struct pci_dev *pdev,
                hc->pci_origmembase = hc->pci_dev->resource[1].start;
                if (!hc->pci_origmembase) {
                        printk(KERN_WARNING
-                           "HFC-multi: No IO-Memory for PCI card found\n");
+                              "HFC-multi: No IO-Memory for PCI card found\n");
                        pci_disable_device(hc->pci_dev);
                        return -EIO;
                }
@@ -4439,14 +4439,14 @@ setup_pci(struct hfc_multi *hc, struct pci_dev *pdev,
                hc->pci_membase = ioremap(hc->pci_origmembase, 256);
                if (!hc->pci_membase) {
                        printk(KERN_WARNING
-                           "HFC-multi: failed to remap io address space. "
-                           "(internal error)\n");
+                              "HFC-multi: failed to remap io address space. "
+                              "(internal error)\n");
                        pci_disable_device(hc->pci_dev);
                        return -EIO;
                }
                printk(KERN_INFO "card %d: defined at MEMBASE %#lx (%#lx) IRQ "
-                   "%d HZ %d leds-type %d\n", hc->id, (u_long)hc->pci_membase,
-                   hc->pci_origmembase, hc->pci_dev->irq, HZ, hc->leds);
+                      "%d HZ %d leds-type %d\n", hc->id, (u_long)hc->pci_membase,
+                      hc->pci_origmembase, hc->pci_dev->irq, HZ, hc->leds);
                pci_write_config_word(hc->pci_dev, PCI_COMMAND, PCI_ENA_MEMIO);
                break;
        case HFC_IO_MODE_REGIO:
@@ -4459,23 +4459,23 @@ setup_pci(struct hfc_multi *hc, struct pci_dev *pdev,
                hc->pci_iobase = (u_int) hc->pci_dev->resource[0].start;
                if (!hc->pci_iobase) {
                        printk(KERN_WARNING
-                               "HFC-multi: No IO for PCI card found\n");
+                              "HFC-multi: No IO for PCI card found\n");
                        pci_disable_device(hc->pci_dev);
                        return -EIO;
                }
 
                if (!request_region(hc->pci_iobase, 8, "hfcmulti")) {
                        printk(KERN_WARNING "HFC-multi: failed to request "
-                           "address space at 0x%08lx (internal error)\n",
-                           hc->pci_iobase);
+                              "address space at 0x%08lx (internal error)\n",
+                              hc->pci_iobase);
                        pci_disable_device(hc->pci_dev);
                        return -EIO;
                }
 
                printk(KERN_INFO
-                   "%s %s: defined at IOBASE %#x IRQ %d HZ %d leds-type %d\n",
-                   m->vendor_name, m->card_name, (u_int) hc->pci_iobase,
-                   hc->pci_dev->irq, HZ, hc->leds);
+                      "%s %s: defined at IOBASE %#x IRQ %d HZ %d leds-type %d\n",
+                      m->vendor_name, m->card_name, (u_int) hc->pci_iobase,
+                      hc->pci_dev->irq, HZ, hc->leds);
                pci_write_config_word(hc->pci_dev, PCI_COMMAND, PCI_ENA_REGIO);
                break;
        default:
@@ -4508,17 +4508,17 @@ release_port(struct hfc_multi *hc, struct dchannel *dch)
 
        if (debug & DEBUG_HFCMULTI_INIT)
                printk(KERN_DEBUG "%s: entered for port %d\n",
-                       __func__, pt + 1);
+                      __func__, pt + 1);
 
        if (pt >= hc->ports) {
                printk(KERN_WARNING "%s: ERROR port out of range (%d).\n",
-                    __func__, pt + 1);
+                      __func__, pt + 1);
                return;
        }
 
        if (debug & DEBUG_HFCMULTI_INIT)
                printk(KERN_DEBUG "%s: releasing port=%d\n",
-                   __func__, pt + 1);
+                      __func__, pt + 1);
 
        if (dch->dev.D.protocol == ISDN_P_TE_S0)
                l1_event(dch->l1, CLOSE_CHANNEL);
@@ -4548,8 +4548,8 @@ release_port(struct hfc_multi *hc, struct dchannel *dch)
                        if (hc->chan[i].bch) {
                                if (debug & DEBUG_HFCMULTI_INIT)
                                        printk(KERN_DEBUG
-                                           "%s: free port %d channel %d\n",
-                                           __func__, hc->chan[i].port+1, i);
+                                              "%s: free port %d channel %d\n",
+                                              __func__, hc->chan[i].port + 1, i);
                                pb = hc->chan[i].bch;
                                hc->chan[i].bch = NULL;
                                spin_unlock_irqrestore(&hc->lock, flags);
@@ -4563,16 +4563,16 @@ release_port(struct hfc_multi *hc, struct dchannel *dch)
                /* remove sync */
                if (test_bit(HFC_CHIP_PLXSD, &hc->chip)) {
                        hc->syncronized &=
-                          ~(1 << hc->chan[ci].port);
+                               ~(1 << hc->chan[ci].port);
                        plxsd_checksync(hc, 1);
                }
                /* free channels */
                if (hc->chan[ci - 2].bch) {
                        if (debug & DEBUG_HFCMULTI_INIT)
                                printk(KERN_DEBUG
-                                   "%s: free port %d channel %d\n",
-                                   __func__, hc->chan[ci - 2].port+1,
-                                   ci - 2);
+                                      "%s: free port %d channel %d\n",
+                                      __func__, hc->chan[ci - 2].port + 1,
+                                      ci - 2);
                        pb = hc->chan[ci - 2].bch;
                        hc->chan[ci - 2].bch = NULL;
                        spin_unlock_irqrestore(&hc->lock, flags);
@@ -4584,9 +4584,9 @@ release_port(struct hfc_multi *hc, struct dchannel *dch)
                if (hc->chan[ci - 1].bch) {
                        if (debug & DEBUG_HFCMULTI_INIT)
                                printk(KERN_DEBUG
-                                   "%s: free port %d channel %d\n",
-                                   __func__, hc->chan[ci - 1].port+1,
-                                   ci - 1);
+                                      "%s: free port %d channel %d\n",
+                                      __func__, hc->chan[ci - 1].port + 1,
+                                      ci - 1);
                        pb = hc->chan[ci - 1].bch;
                        hc->chan[ci - 1].bch = NULL;
                        spin_unlock_irqrestore(&hc->lock, flags);
@@ -4616,7 +4616,7 @@ release_card(struct hfc_multi *hc)
 
        if (debug & DEBUG_HFCMULTI_INIT)
                printk(KERN_DEBUG "%s: release card (%d) entered\n",
-                   __func__, hc->id);
+                      __func__, hc->id);
 
        /* unregister clock source */
        if (hc->iclock)
@@ -4635,7 +4635,7 @@ release_card(struct hfc_multi *hc)
        /* disable D-channels & B-channels */
        if (debug & DEBUG_HFCMULTI_INIT)
                printk(KERN_DEBUG "%s: disable all channels (d and b)\n",
-                   __func__);
+                      __func__);
        for (ch = 0; ch <= 31; ch++) {
                if (hc->chan[ch].dch)
                        release_port(hc, hc->chan[ch].dch);
@@ -4645,7 +4645,7 @@ release_card(struct hfc_multi *hc)
        if (hc->irq) {
                if (debug & DEBUG_HFCMULTI_INIT)
                        printk(KERN_DEBUG "%s: free irq %d\n",
-                           __func__, hc->irq);
+                              __func__, hc->irq);
                free_irq(hc->irq, hc);
                hc->irq = 0;
 
@@ -4654,7 +4654,7 @@ release_card(struct hfc_multi *hc)
 
        if (debug & DEBUG_HFCMULTI_INIT)
                printk(KERN_DEBUG "%s: remove instance from list\n",
-                    __func__);
+                      __func__);
        list_del(&hc->list);
 
        if (debug & DEBUG_HFCMULTI_INIT)
@@ -4664,7 +4664,7 @@ release_card(struct hfc_multi *hc)
        kfree(hc);
        if (debug & DEBUG_HFCMULTI_INIT)
                printk(KERN_DEBUG "%s: card successfully removed\n",
-                   __func__);
+                      __func__);
 }
 
 static int
@@ -4683,7 +4683,7 @@ init_e1_port(struct hfc_multi *hc, struct hm_map *m)
        dch->hw = hc;
        dch->dev.Dprotocols = (1 << ISDN_P_TE_E1) | (1 << ISDN_P_NT_E1);
        dch->dev.Bprotocols = (1 << (ISDN_P_B_RAW & ISDN_P_B_MASK)) |
-           (1 << (ISDN_P_B_HDLC & ISDN_P_B_MASK));
+               (1 << (ISDN_P_B_HDLC & ISDN_P_B_MASK));
        dch->dev.D.send = handle_dmsg;
        dch->dev.D.ctrl = hfcm_dctrl;
        dch->dev.nrbchan = (hc->dslot) ? 30 : 31;
@@ -4697,14 +4697,14 @@ init_e1_port(struct hfc_multi *hc, struct hm_map *m)
                bch = kzalloc(sizeof(struct bchannel), GFP_KERNEL);
                if (!bch) {
                        printk(KERN_ERR "%s: no memory for bchannel\n",
-                           __func__);
+                              __func__);
                        ret = -ENOMEM;
                        goto free_chan;
                }
                hc->chan[ch].coeff = kzalloc(512, GFP_KERNEL);
                if (!hc->chan[ch].coeff) {
                        printk(KERN_ERR "%s: no memory for coeffs\n",
-                           __func__);
+                              __func__);
                        ret = -ENOMEM;
                        kfree(bch);
                        goto free_chan;
@@ -4726,93 +4726,93 @@ init_e1_port(struct hfc_multi *hc, struct hm_map *m)
        if (port[Port_cnt] & 0x001) {
                if (!m->opticalsupport)  {
                        printk(KERN_INFO
-                           "This board has no optical "
-                           "support\n");
+                              "This board has no optical "
+                              "support\n");
                } else {
                        if (debug & DEBUG_HFCMULTI_INIT)
                                printk(KERN_DEBUG
-                                   "%s: PORT set optical "
-                                   "interfacs: card(%d) "
-                                   "port(%d)\n",
-                                   __func__,
-                                   HFC_cnt + 1, 1);
+                                      "%s: PORT set optical "
+                                      "interfacs: card(%d) "
+                                      "port(%d)\n",
+                                      __func__,
+                                      HFC_cnt + 1, 1);
                        test_and_set_bit(HFC_CFG_OPTICAL,
-                           &hc->chan[hc->dslot].cfg);
+                                        &hc->chan[hc->dslot].cfg);
                }
        }
        /* set LOS report */
        if (port[Port_cnt] & 0x004) {
                if (debug & DEBUG_HFCMULTI_INIT)
                        printk(KERN_DEBUG "%s: PORT set "
-                           "LOS report: card(%d) port(%d)\n",
-                           __func__, HFC_cnt + 1, 1);
+                              "LOS report: card(%d) port(%d)\n",
+                              __func__, HFC_cnt + 1, 1);
                test_and_set_bit(HFC_CFG_REPORT_LOS,
-                   &hc->chan[hc->dslot].cfg);
+                                &hc->chan[hc->dslot].cfg);
        }
        /* set AIS report */
        if (port[Port_cnt] & 0x008) {
                if (debug & DEBUG_HFCMULTI_INIT)
                        printk(KERN_DEBUG "%s: PORT set "
-                           "AIS report: card(%d) port(%d)\n",
-                           __func__, HFC_cnt + 1, 1);
+                              "AIS report: card(%d) port(%d)\n",
+                              __func__, HFC_cnt + 1, 1);
                test_and_set_bit(HFC_CFG_REPORT_AIS,
-                   &hc->chan[hc->dslot].cfg);
+                                &hc->chan[hc->dslot].cfg);
        }
        /* set SLIP report */
        if (port[Port_cnt] & 0x010) {
                if (debug & DEBUG_HFCMULTI_INIT)
                        printk(KERN_DEBUG
-                           "%s: PORT set SLIP report: "
-                           "card(%d) port(%d)\n",
-                           __func__, HFC_cnt + 1, 1);
+                              "%s: PORT set SLIP report: "
+                              "card(%d) port(%d)\n",
+                              __func__, HFC_cnt + 1, 1);
                test_and_set_bit(HFC_CFG_REPORT_SLIP,
-                   &hc->chan[hc->dslot].cfg);
+                                &hc->chan[hc->dslot].cfg);
        }
        /* set RDI report */
        if (port[Port_cnt] & 0x020) {
                if (debug & DEBUG_HFCMULTI_INIT)
                        printk(KERN_DEBUG
-                           "%s: PORT set RDI report: "
-                           "card(%d) port(%d)\n",
-                           __func__, HFC_cnt + 1, 1);
+                              "%s: PORT set RDI report: "
+                              "card(%d) port(%d)\n",
+                              __func__, HFC_cnt + 1, 1);
                test_and_set_bit(HFC_CFG_REPORT_RDI,
-                   &hc->chan[hc->dslot].cfg);
+                                &hc->chan[hc->dslot].cfg);
        }
        /* set CRC-4 Mode */
        if (!(port[Port_cnt] & 0x100)) {
                if (debug & DEBUG_HFCMULTI_INIT)
                        printk(KERN_DEBUG "%s: PORT turn on CRC4 report:"
-                               " card(%d) port(%d)\n",
-                               __func__, HFC_cnt + 1, 1);
+                              " card(%d) port(%d)\n",
+                              __func__, HFC_cnt + 1, 1);
                test_and_set_bit(HFC_CFG_CRC4,
-                   &hc->chan[hc->dslot].cfg);
+                                &hc->chan[hc->dslot].cfg);
        } else {
                if (debug & DEBUG_HFCMULTI_INIT)
                        printk(KERN_DEBUG "%s: PORT turn off CRC4"
-                               " report: card(%d) port(%d)\n",
-                               __func__, HFC_cnt + 1, 1);
+                              " report: card(%d) port(%d)\n",
+                              __func__, HFC_cnt + 1, 1);
        }
        /* set forced clock */
        if (port[Port_cnt] & 0x0200) {
                if (debug & DEBUG_HFCMULTI_INIT)
                        printk(KERN_DEBUG "%s: PORT force getting clock from "
-                               "E1: card(%d) port(%d)\n",
-                               __func__, HFC_cnt + 1, 1);
+                              "E1: card(%d) port(%d)\n",
+                              __func__, HFC_cnt + 1, 1);
                test_and_set_bit(HFC_CHIP_E1CLOCK_GET, &hc->chip);
        } else
-       if (port[Port_cnt] & 0x0400) {
-               if (debug & DEBUG_HFCMULTI_INIT)
-                       printk(KERN_DEBUG "%s: PORT force putting clock to "
-                               "E1: card(%d) port(%d)\n",
-                               __func__, HFC_cnt + 1, 1);
-               test_and_set_bit(HFC_CHIP_E1CLOCK_PUT, &hc->chip);
-       }
+               if (port[Port_cnt] & 0x0400) {
+                       if (debug & DEBUG_HFCMULTI_INIT)
+                               printk(KERN_DEBUG "%s: PORT force putting clock to "
+                                      "E1: card(%d) port(%d)\n",
+                                      __func__, HFC_cnt + 1, 1);
+                       test_and_set_bit(HFC_CHIP_E1CLOCK_PUT, &hc->chip);
+               }
        /* set JATT PLL */
        if (port[Port_cnt] & 0x0800) {
                if (debug & DEBUG_HFCMULTI_INIT)
                        printk(KERN_DEBUG "%s: PORT disable JATT PLL on "
-                               "E1: card(%d) port(%d)\n",
-                               __func__, HFC_cnt + 1, 1);
+                              "E1: card(%d) port(%d)\n",
+                              __func__, HFC_cnt + 1, 1);
                test_and_set_bit(HFC_CHIP_RX_SYNC, &hc->chip);
        }
        /* set elastic jitter buffer */
@@ -4820,10 +4820,10 @@ init_e1_port(struct hfc_multi *hc, struct hm_map *m)
                hc->chan[hc->dslot].jitter = (port[Port_cnt]>>12) & 0x3;
                if (debug & DEBUG_HFCMULTI_INIT)
                        printk(KERN_DEBUG
-                           "%s: PORT set elastic "
-                           "buffer to %d: card(%d) port(%d)\n",
-                           __func__, hc->chan[hc->dslot].jitter,
-                           HFC_cnt + 1, 1);
+                              "%s: PORT set elastic "
+                              "buffer to %d: card(%d) port(%d)\n",
+                              __func__, hc->chan[hc->dslot].jitter,
+                              HFC_cnt + 1, 1);
        } else
                hc->chan[hc->dslot].jitter = 2; /* default */
        snprintf(name, MISDN_MAX_IDLEN - 1, "hfc-e1.%d", HFC_cnt + 1);
@@ -4853,7 +4853,7 @@ init_multi_port(struct hfc_multi *hc, int pt)
        dch->hw = hc;
        dch->dev.Dprotocols = (1 << ISDN_P_TE_S0) | (1 << ISDN_P_NT_S0);
        dch->dev.Bprotocols = (1 << (ISDN_P_B_RAW & ISDN_P_B_MASK)) |
-           (1 << (ISDN_P_B_HDLC & ISDN_P_B_MASK));
+               (1 << (ISDN_P_B_HDLC & ISDN_P_B_MASK));
        dch->dev.D.send = handle_dmsg;
        dch->dev.D.ctrl = hfcm_dctrl;
        dch->dev.nrbchan = 2;
@@ -4866,14 +4866,14 @@ init_multi_port(struct hfc_multi *hc, int pt)
                bch = kzalloc(sizeof(struct bchannel), GFP_KERNEL);
                if (!bch) {
                        printk(KERN_ERR "%s: no memory for bchannel\n",
-                           __func__);
+                              __func__);
                        ret = -ENOMEM;
                        goto free_chan;
                }
                hc->chan[i + ch].coeff = kzalloc(512, GFP_KERNEL);
                if (!hc->chan[i + ch].coeff) {
                        printk(KERN_ERR "%s: no memory for coeffs\n",
-                           __func__);
+                              __func__);
                        ret = -ENOMEM;
                        kfree(bch);
                        goto free_chan;
@@ -4895,22 +4895,22 @@ init_multi_port(struct hfc_multi *hc, int pt)
        if (port[Port_cnt] & 0x001) {
                if (debug & DEBUG_HFCMULTI_INIT)
                        printk(KERN_DEBUG
-                           "%s: PROTOCOL set master clock: "
-                           "card(%d) port(%d)\n",
-                           __func__, HFC_cnt + 1, pt + 1);
+                              "%s: PROTOCOL set master clock: "
+                              "card(%d) port(%d)\n",
+                              __func__, HFC_cnt + 1, pt + 1);
                if (dch->dev.D.protocol != ISDN_P_TE_S0) {
                        printk(KERN_ERR "Error: Master clock "
-                           "for port(%d) of card(%d) is only"
-                           " possible with TE-mode\n",
-                           pt + 1, HFC_cnt + 1);
+                              "for port(%d) of card(%d) is only"
+                              " possible with TE-mode\n",
+                              pt + 1, HFC_cnt + 1);
                        ret = -EINVAL;
                        goto free_chan;
                }
                if (hc->masterclk >= 0) {
                        printk(KERN_ERR "Error: Master clock "
-                           "for port(%d) of card(%d) already "
-                           "defined for port(%d)\n",
-                           pt + 1, HFC_cnt + 1, hc->masterclk+1);
+                              "for port(%d) of card(%d) already "
+                              "defined for port(%d)\n",
+                              pt + 1, HFC_cnt + 1, hc->masterclk + 1);
                        ret = -EINVAL;
                        goto free_chan;
                }
@@ -4920,29 +4920,29 @@ init_multi_port(struct hfc_multi *hc, int pt)
        if (port[Port_cnt] & 0x002) {
                if (debug & DEBUG_HFCMULTI_INIT)
                        printk(KERN_DEBUG
-                           "%s: PROTOCOL set non capacitive "
-                           "transmitter: card(%d) port(%d)\n",
-                           __func__, HFC_cnt + 1, pt + 1);
+                              "%s: PROTOCOL set non capacitive "
+                              "transmitter: card(%d) port(%d)\n",
+                              __func__, HFC_cnt + 1, pt + 1);
                test_and_set_bit(HFC_CFG_NONCAP_TX,
-                   &hc->chan[i + 2].cfg);
+                                &hc->chan[i + 2].cfg);
        }
        /* disable E-channel */
        if (port[Port_cnt] & 0x004) {
                if (debug & DEBUG_HFCMULTI_INIT)
                        printk(KERN_DEBUG
-                           "%s: PROTOCOL disable E-channel: "
-                           "card(%d) port(%d)\n",
-                           __func__, HFC_cnt + 1, pt + 1);
+                              "%s: PROTOCOL disable E-channel: "
+                              "card(%d) port(%d)\n",
+                              __func__, HFC_cnt + 1, pt + 1);
                test_and_set_bit(HFC_CFG_DIS_ECHANNEL,
-                   &hc->chan[i + 2].cfg);
+                                &hc->chan[i + 2].cfg);
        }
        if (hc->ctype == HFC_TYPE_XHFC) {
                snprintf(name, MISDN_MAX_IDLEN - 1, "xhfc.%d-%d",
-                       HFC_cnt + 1, pt + 1);
+                        HFC_cnt + 1, pt + 1);
                ret = mISDN_register_device(&dch->dev, NULL, name);
        } else {
                snprintf(name, MISDN_MAX_IDLEN - 1, "hfc-%ds.%d-%d",
-                       hc->ctype, HFC_cnt + 1, pt + 1);
+                        hc->ctype, HFC_cnt + 1, pt + 1);
                ret = mISDN_register_device(&dch->dev, &hc->pci_dev->dev, name);
        }
        if (ret)
@@ -4956,7 +4956,7 @@ free_chan:
 
 static int
 hfcmulti_init(struct hm_map *m, struct pci_dev *pdev,
-    const struct pci_device_id *ent)
+             const struct pci_device_id *ent)
 {
        int             ret_err = 0;
        int             pt;
@@ -4967,22 +4967,22 @@ hfcmulti_init(struct hm_map *m, struct pci_dev *pdev,
 
        if (HFC_cnt >= MAX_CARDS) {
                printk(KERN_ERR "too many cards (max=%d).\n",
-                       MAX_CARDS);
+                      MAX_CARDS);
                return -EINVAL;
        }
        if ((type[HFC_cnt] & 0xff) && (type[HFC_cnt] & 0xff) != m->type) {
                printk(KERN_WARNING "HFC-MULTI: Card '%s:%s' type %d found but "
-                   "type[%d] %d was supplied as module parameter\n",
-                   m->vendor_name, m->card_name, m->type, HFC_cnt,
-                   type[HFC_cnt] & 0xff);
+                      "type[%d] %d was supplied as module parameter\n",
+                      m->vendor_name, m->card_name, m->type, HFC_cnt,
+                      type[HFC_cnt] & 0xff);
                printk(KERN_WARNING "HFC-MULTI: Load module without parameters "
-                       "first, to see cards and their types.");
+                      "first, to see cards and their types.");
                return -EINVAL;
        }
        if (debug & DEBUG_HFCMULTI_INIT)
                printk(KERN_DEBUG "%s: Registering %s:%s chip type %d (0x%x)\n",
-                   __func__, m->vendor_name, m->card_name, m->type,
-                   type[HFC_cnt]);
+                      __func__, m->vendor_name, m->card_name, m->type,
+                      type[HFC_cnt]);
 
        /* allocate card+fifo structure */
        hc = kzalloc(sizeof(struct hfc_multi), GFP_KERNEL);
@@ -5000,13 +5000,13 @@ hfcmulti_init(struct hm_map *m, struct pci_dev *pdev,
        if (dslot[HFC_cnt] < 0 && hc->ctype == HFC_TYPE_E1) {
                hc->dslot = 0;
                printk(KERN_INFO "HFC-E1 card has disabled D-channel, but "
-                       "31 B-channels\n");
+                      "31 B-channels\n");
        }
        if (dslot[HFC_cnt] > 0 && dslot[HFC_cnt] < 32
            && hc->ctype == HFC_TYPE_E1) {
                hc->dslot = dslot[HFC_cnt];
                printk(KERN_INFO "HFC-E1 card has alternating D-channel on "
-                       "time slot %d\n", dslot[HFC_cnt]);
+                      "time slot %d\n", dslot[HFC_cnt]);
        } else
                hc->dslot = 16;
 
@@ -5019,7 +5019,7 @@ hfcmulti_init(struct hm_map *m, struct pci_dev *pdev,
                hc->silence = 0x2a; /* alaw silence */
        if ((poll >> 1) > sizeof(hc->silence_data)) {
                printk(KERN_ERR "HFCMULTI error: silence_data too small, "
-                       "please fix\n");
+                      "please fix\n");
                return -EINVAL;
        }
        for (i = 0; i < (poll >> 1); i++)
@@ -5086,7 +5086,7 @@ hfcmulti_init(struct hm_map *m, struct pci_dev *pdev,
        for (pt = 0; pt < hc->ports; pt++) {
                if (Port_cnt >= MAX_PORTS) {
                        printk(KERN_ERR "too many ports (max=%d).\n",
-                               MAX_PORTS);
+                              MAX_PORTS);
                        ret_err = -EINVAL;
                        goto free_card;
                }
@@ -5096,9 +5096,9 @@ hfcmulti_init(struct hm_map *m, struct pci_dev *pdev,
                        ret_err = init_multi_port(hc, pt);
                if (debug & DEBUG_HFCMULTI_INIT)
                        printk(KERN_DEBUG
-                           "%s: Registering D-channel, card(%d) port(%d)"
-                           "result %d\n",
-                           __func__, HFC_cnt + 1, pt, ret_err);
+                              "%s: Registering D-channel, card(%d) port(%d)"
+                              "result %d\n",
+                              __func__, HFC_cnt + 1, pt, ret_err);
 
                if (ret_err) {
                        while (pt) { /* release already registered ports */
@@ -5129,7 +5129,7 @@ hfcmulti_init(struct hm_map *m, struct pci_dev *pdev,
                        pmj = ~pmj & 0xf;
 
                printk(KERN_INFO "%s: %s DIPs(0x%x) jumpers(0x%x)\n",
-                       m->vendor_name, m->card_name, dips, pmj);
+                      m->vendor_name, m->card_name, dips, pmj);
                break;
        case DIP_8S:
                /*
@@ -5151,16 +5151,16 @@ hfcmulti_init(struct hm_map *m, struct pci_dev *pdev,
                /* disable PCI auxbridge function */
                HFC_outb(hc, R_BRG_PCM_CFG, V_PCM_CLK);
                printk(KERN_INFO "%s: %s DIPs(0x%x)\n",
-                   m->vendor_name, m->card_name, dips);
+                      m->vendor_name, m->card_name, dips);
                break;
        case DIP_E1:
                /*
                 * get DIP Setting for beroNet E1 cards
                 * DIP Setting: collect GPI 4/5/6/7 (R_GPI_IN0)
                 */
-               dips = (~HFC_inb(hc, R_GPI_IN0) & 0xF0)>>4;
+               dips = (~HFC_inb(hc, R_GPI_IN0) & 0xF0) >> 4;
                printk(KERN_INFO "%s: %s DIPs(0x%x)\n",
-                   m->vendor_name, m->card_name, dips);
+                      m->vendor_name, m->card_name, dips);
                break;
        }
 
@@ -5203,9 +5203,9 @@ static void __devexit hfc_remove_pci(struct pci_dev *pdev)
 
        if (debug)
                printk(KERN_INFO "removing hfc_multi card vendor:%x "
-                   "device:%x subvendor:%x subdevice:%x\n",
-                   pdev->vendor, pdev->device,
-                   pdev->subsystem_vendor, pdev->subsystem_device);
+                      "device:%x subvendor:%x subdevice:%x\n",
+                      pdev->vendor, pdev->device,
+                      pdev->subsystem_vendor, pdev->subsystem_device);
 
        if (card) {
                spin_lock_irqsave(&HFClock, flags);
@@ -5214,7 +5214,7 @@ static void __devexit hfc_remove_pci(struct pci_dev *pdev)
        }  else {
                if (debug)
                        printk(KERN_DEBUG "%s: drvdata already removed\n",
-                           __func__);
+                              __func__);
        }
 }
 
@@ -5225,50 +5225,50 @@ static void __devexit hfc_remove_pci(struct pci_dev *pdev)
 #define VENDOR_PRIM    "PrimuX"
 
 static const struct hm_map hfcm_map[] = {
-/*0*/  {VENDOR_BN, "HFC-1S Card (mini PCI)", 4, 1, 1, 3, 0, DIP_4S, 0, 0},
-/*1*/  {VENDOR_BN, "HFC-2S Card", 4, 2, 1, 3, 0, DIP_4S, 0, 0},
-/*2*/  {VENDOR_BN, "HFC-2S Card (mini PCI)", 4, 2, 1, 3, 0, DIP_4S, 0, 0},
-/*3*/  {VENDOR_BN, "HFC-4S Card", 4, 4, 1, 2, 0, DIP_4S, 0, 0},
-/*4*/  {VENDOR_BN, "HFC-4S Card (mini PCI)", 4, 4, 1, 2, 0, 0, 0, 0},
-/*5*/  {VENDOR_CCD, "HFC-4S Eval (old)", 4, 4, 0, 0, 0, 0, 0, 0},
-/*6*/  {VENDOR_CCD, "HFC-4S IOB4ST", 4, 4, 1, 2, 0, DIP_4S, 0, 0},
-/*7*/  {VENDOR_CCD, "HFC-4S", 4, 4, 1, 2, 0, 0, 0, 0},
-/*8*/  {VENDOR_DIG, "HFC-4S Card", 4, 4, 0, 2, 0, 0, HFC_IO_MODE_REGIO, 0},
-/*9*/  {VENDOR_CCD, "HFC-4S Swyx 4xS0 SX2 QuadBri", 4, 4, 1, 2, 0, 0, 0, 0},
-/*10*/ {VENDOR_JH, "HFC-4S (junghanns 2.0)", 4, 4, 1, 2, 0, 0, 0, 0},
-/*11*/ {VENDOR_PRIM, "HFC-2S Primux Card", 4, 2, 0, 0, 0, 0, 0, 0},
-
-/*12*/ {VENDOR_BN, "HFC-8S Card", 8, 8, 1, 0, 0, 0, 0, 0},
-/*13*/ {VENDOR_BN, "HFC-8S Card (+)", 8, 8, 1, 8, 0, DIP_8S,
-               HFC_IO_MODE_REGIO, 0},
-/*14*/ {VENDOR_CCD, "HFC-8S Eval (old)", 8, 8, 0, 0, 0, 0, 0, 0},
-/*15*/ {VENDOR_CCD, "HFC-8S IOB4ST Recording", 8, 8, 1, 0, 0, 0, 0, 0},
-
-/*16*/ {VENDOR_CCD, "HFC-8S IOB8ST", 8, 8, 1, 0, 0, 0, 0, 0},
-/*17*/ {VENDOR_CCD, "HFC-8S", 8, 8, 1, 0, 0, 0, 0, 0},
-/*18*/ {VENDOR_CCD, "HFC-8S", 8, 8, 1, 0, 0, 0, 0, 0},
-
-/*19*/ {VENDOR_BN, "HFC-E1 Card", 1, 1, 0, 1, 0, DIP_E1, 0, 0},
-/*20*/ {VENDOR_BN, "HFC-E1 Card (mini PCI)", 1, 1, 0, 1, 0, 0, 0, 0},
-/*21*/ {VENDOR_BN, "HFC-E1+ Card (Dual)", 1, 1, 0, 1, 0, DIP_E1, 0, 0},
-/*22*/ {VENDOR_BN, "HFC-E1 Card (Dual)", 1, 1, 0, 1, 0, DIP_E1, 0, 0},
-
-/*23*/ {VENDOR_CCD, "HFC-E1 Eval (old)", 1, 1, 0, 0, 0, 0, 0, 0},
-/*24*/ {VENDOR_CCD, "HFC-E1 IOB1E1", 1, 1, 0, 1, 0, 0, 0, 0},
-/*25*/ {VENDOR_CCD, "HFC-E1", 1, 1, 0, 1, 0, 0, 0, 0},
-
-/*26*/ {VENDOR_CCD, "HFC-4S Speech Design", 4, 4, 0, 0, 0, 0,
-               HFC_IO_MODE_PLXSD, 0},
-/*27*/ {VENDOR_CCD, "HFC-E1 Speech Design", 1, 1, 0, 0, 0, 0,
-               HFC_IO_MODE_PLXSD, 0},
-/*28*/ {VENDOR_CCD, "HFC-4S OpenVox", 4, 4, 1, 0, 0, 0, 0, 0},
-/*29*/ {VENDOR_CCD, "HFC-2S OpenVox", 4, 2, 1, 0, 0, 0, 0, 0},
-/*30*/ {VENDOR_CCD, "HFC-8S OpenVox", 8, 8, 1, 0, 0, 0, 0, 0},
-/*31*/ {VENDOR_CCD, "XHFC-4S Speech Design", 5, 4, 0, 0, 0, 0,
-               HFC_IO_MODE_EMBSD, XHFC_IRQ},
-/*32*/ {VENDOR_JH, "HFC-8S (junghanns)", 8, 8, 1, 0, 0, 0, 0, 0},
-/*33*/ {VENDOR_BN, "HFC-2S Beronet Card PCIe", 4, 2, 1, 3, 0, DIP_4S, 0, 0},
-/*34*/ {VENDOR_BN, "HFC-4S Beronet Card PCIe", 4, 4, 1, 2, 0, DIP_4S, 0, 0},
+       /*0*/   {VENDOR_BN, "HFC-1S Card (mini PCI)", 4, 1, 1, 3, 0, DIP_4S, 0, 0},
+       /*1*/   {VENDOR_BN, "HFC-2S Card", 4, 2, 1, 3, 0, DIP_4S, 0, 0},
+       /*2*/   {VENDOR_BN, "HFC-2S Card (mini PCI)", 4, 2, 1, 3, 0, DIP_4S, 0, 0},
+       /*3*/   {VENDOR_BN, "HFC-4S Card", 4, 4, 1, 2, 0, DIP_4S, 0, 0},
+       /*4*/   {VENDOR_BN, "HFC-4S Card (mini PCI)", 4, 4, 1, 2, 0, 0, 0, 0},
+       /*5*/   {VENDOR_CCD, "HFC-4S Eval (old)", 4, 4, 0, 0, 0, 0, 0, 0},
+       /*6*/   {VENDOR_CCD, "HFC-4S IOB4ST", 4, 4, 1, 2, 0, DIP_4S, 0, 0},
+       /*7*/   {VENDOR_CCD, "HFC-4S", 4, 4, 1, 2, 0, 0, 0, 0},
+       /*8*/   {VENDOR_DIG, "HFC-4S Card", 4, 4, 0, 2, 0, 0, HFC_IO_MODE_REGIO, 0},
+       /*9*/   {VENDOR_CCD, "HFC-4S Swyx 4xS0 SX2 QuadBri", 4, 4, 1, 2, 0, 0, 0, 0},
+       /*10*/  {VENDOR_JH, "HFC-4S (junghanns 2.0)", 4, 4, 1, 2, 0, 0, 0, 0},
+       /*11*/  {VENDOR_PRIM, "HFC-2S Primux Card", 4, 2, 0, 0, 0, 0, 0, 0},
+
+       /*12*/  {VENDOR_BN, "HFC-8S Card", 8, 8, 1, 0, 0, 0, 0, 0},
+       /*13*/  {VENDOR_BN, "HFC-8S Card (+)", 8, 8, 1, 8, 0, DIP_8S,
+                HFC_IO_MODE_REGIO, 0},
+       /*14*/  {VENDOR_CCD, "HFC-8S Eval (old)", 8, 8, 0, 0, 0, 0, 0, 0},
+       /*15*/  {VENDOR_CCD, "HFC-8S IOB4ST Recording", 8, 8, 1, 0, 0, 0, 0, 0},
+
+       /*16*/  {VENDOR_CCD, "HFC-8S IOB8ST", 8, 8, 1, 0, 0, 0, 0, 0},
+       /*17*/  {VENDOR_CCD, "HFC-8S", 8, 8, 1, 0, 0, 0, 0, 0},
+       /*18*/  {VENDOR_CCD, "HFC-8S", 8, 8, 1, 0, 0, 0, 0, 0},
+
+       /*19*/  {VENDOR_BN, "HFC-E1 Card", 1, 1, 0, 1, 0, DIP_E1, 0, 0},
+       /*20*/  {VENDOR_BN, "HFC-E1 Card (mini PCI)", 1, 1, 0, 1, 0, 0, 0, 0},
+       /*21*/  {VENDOR_BN, "HFC-E1+ Card (Dual)", 1, 1, 0, 1, 0, DIP_E1, 0, 0},
+       /*22*/  {VENDOR_BN, "HFC-E1 Card (Dual)", 1, 1, 0, 1, 0, DIP_E1, 0, 0},
+
+       /*23*/  {VENDOR_CCD, "HFC-E1 Eval (old)", 1, 1, 0, 0, 0, 0, 0, 0},
+       /*24*/  {VENDOR_CCD, "HFC-E1 IOB1E1", 1, 1, 0, 1, 0, 0, 0, 0},
+       /*25*/  {VENDOR_CCD, "HFC-E1", 1, 1, 0, 1, 0, 0, 0, 0},
+
+       /*26*/  {VENDOR_CCD, "HFC-4S Speech Design", 4, 4, 0, 0, 0, 0,
+                HFC_IO_MODE_PLXSD, 0},
+       /*27*/  {VENDOR_CCD, "HFC-E1 Speech Design", 1, 1, 0, 0, 0, 0,
+                HFC_IO_MODE_PLXSD, 0},
+       /*28*/  {VENDOR_CCD, "HFC-4S OpenVox", 4, 4, 1, 0, 0, 0, 0, 0},
+       /*29*/  {VENDOR_CCD, "HFC-2S OpenVox", 4, 2, 1, 0, 0, 0, 0, 0},
+       /*30*/  {VENDOR_CCD, "HFC-8S OpenVox", 8, 8, 1, 0, 0, 0, 0, 0},
+       /*31*/  {VENDOR_CCD, "XHFC-4S Speech Design", 5, 4, 0, 0, 0, 0,
+                HFC_IO_MODE_EMBSD, XHFC_IRQ},
+       /*32*/  {VENDOR_JH, "HFC-8S (junghanns)", 8, 8, 1, 0, 0, 0, 0, 0},
+       /*33*/  {VENDOR_BN, "HFC-2S Beronet Card PCIe", 4, 2, 1, 3, 0, DIP_4S, 0, 0},
+       /*34*/  {VENDOR_BN, "HFC-4S Beronet Card PCIe", 4, 4, 1, 2, 0, DIP_4S, 0, 0},
 };
 
 #undef H
@@ -5277,83 +5277,83 @@ static struct pci_device_id hfmultipci_ids[] __devinitdata = {
 
        /* Cards with HFC-4S Chip */
        { PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_HFC4S, PCI_VENDOR_ID_CCD,
-               PCI_SUBDEVICE_ID_CCD_BN1SM, 0, 0, H(0)}, /* BN1S mini PCI */
+         PCI_SUBDEVICE_ID_CCD_BN1SM, 0, 0, H(0)}, /* BN1S mini PCI */
        { PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_HFC4S, PCI_VENDOR_ID_CCD,
-               PCI_SUBDEVICE_ID_CCD_BN2S, 0, 0, H(1)}, /* BN2S */
+         PCI_SUBDEVICE_ID_CCD_BN2S, 0, 0, H(1)}, /* BN2S */
        { PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_HFC4S, PCI_VENDOR_ID_CCD,
-               PCI_SUBDEVICE_ID_CCD_BN2SM, 0, 0, H(2)}, /* BN2S mini PCI */
+         PCI_SUBDEVICE_ID_CCD_BN2SM, 0, 0, H(2)}, /* BN2S mini PCI */
        { PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_HFC4S, PCI_VENDOR_ID_CCD,
-               PCI_SUBDEVICE_ID_CCD_BN4S, 0, 0, H(3)}, /* BN4S */
+         PCI_SUBDEVICE_ID_CCD_BN4S, 0, 0, H(3)}, /* BN4S */
        { PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_HFC4S, PCI_VENDOR_ID_CCD,
-               PCI_SUBDEVICE_ID_CCD_BN4SM, 0, 0, H(4)}, /* BN4S mini PCI */
+         PCI_SUBDEVICE_ID_CCD_BN4SM, 0, 0, H(4)}, /* BN4S mini PCI */
        { PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_HFC4S, PCI_VENDOR_ID_CCD,
-               PCI_DEVICE_ID_CCD_HFC4S, 0, 0, H(5)}, /* Old Eval */
+         PCI_DEVICE_ID_CCD_HFC4S, 0, 0, H(5)}, /* Old Eval */
        { PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_HFC4S, PCI_VENDOR_ID_CCD,
-               PCI_SUBDEVICE_ID_CCD_IOB4ST, 0, 0, H(6)}, /* IOB4ST */
+         PCI_SUBDEVICE_ID_CCD_IOB4ST, 0, 0, H(6)}, /* IOB4ST */
        { PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_HFC4S, PCI_VENDOR_ID_CCD,
-               PCI_SUBDEVICE_ID_CCD_HFC4S, 0, 0, H(7)}, /* 4S */
+         PCI_SUBDEVICE_ID_CCD_HFC4S, 0, 0, H(7)}, /* 4S */
        { PCI_VENDOR_ID_DIGIUM, PCI_DEVICE_ID_DIGIUM_HFC4S,
-               PCI_VENDOR_ID_DIGIUM, PCI_DEVICE_ID_DIGIUM_HFC4S, 0, 0, H(8)},
+         PCI_VENDOR_ID_DIGIUM, PCI_DEVICE_ID_DIGIUM_HFC4S, 0, 0, H(8)},
        { PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_HFC4S, PCI_VENDOR_ID_CCD,
-               PCI_SUBDEVICE_ID_CCD_SWYX4S, 0, 0, H(9)}, /* 4S Swyx */
+         PCI_SUBDEVICE_ID_CCD_SWYX4S, 0, 0, H(9)}, /* 4S Swyx */
        { PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_HFC4S, PCI_VENDOR_ID_CCD,
-               PCI_SUBDEVICE_ID_CCD_JH4S20, 0, 0, H(10)},
+         PCI_SUBDEVICE_ID_CCD_JH4S20, 0, 0, H(10)},
        { PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_HFC4S, PCI_VENDOR_ID_CCD,
-               PCI_SUBDEVICE_ID_CCD_PMX2S, 0, 0, H(11)}, /* Primux */
+         PCI_SUBDEVICE_ID_CCD_PMX2S, 0, 0, H(11)}, /* Primux */
        { PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_HFC4S, PCI_VENDOR_ID_CCD,
-               PCI_SUBDEVICE_ID_CCD_OV4S, 0, 0, H(28)}, /* OpenVox 4 */
+         PCI_SUBDEVICE_ID_CCD_OV4S, 0, 0, H(28)}, /* OpenVox 4 */
        { PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_HFC4S, PCI_VENDOR_ID_CCD,
-               PCI_SUBDEVICE_ID_CCD_OV2S, 0, 0, H(29)}, /* OpenVox 2 */
+         PCI_SUBDEVICE_ID_CCD_OV2S, 0, 0, H(29)}, /* OpenVox 2 */
        { PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_HFC4S, PCI_VENDOR_ID_CCD,
-               0xb761, 0, 0, H(33)}, /* BN2S PCIe */
+         0xb761, 0, 0, H(33)}, /* BN2S PCIe */
        { PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_HFC4S, PCI_VENDOR_ID_CCD,
-               0xb762, 0, 0, H(34)}, /* BN4S PCIe */
+         0xb762, 0, 0, H(34)}, /* BN4S PCIe */
 
        /* Cards with HFC-8S Chip */
        { PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_HFC8S, PCI_VENDOR_ID_CCD,
-       PCI_SUBDEVICE_ID_CCD_BN8S, 0, 0, H(12)}, /* BN8S */
+         PCI_SUBDEVICE_ID_CCD_BN8S, 0, 0, H(12)}, /* BN8S */
        { PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_HFC8S, PCI_VENDOR_ID_CCD,
-       PCI_SUBDEVICE_ID_CCD_BN8SP, 0, 0, H(13)}, /* BN8S+ */
+         PCI_SUBDEVICE_ID_CCD_BN8SP, 0, 0, H(13)}, /* BN8S+ */
        { PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_HFC8S, PCI_VENDOR_ID_CCD,
-       PCI_DEVICE_ID_CCD_HFC8S, 0, 0, H(14)}, /* old Eval */
+         PCI_DEVICE_ID_CCD_HFC8S, 0, 0, H(14)}, /* old Eval */
        { PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_HFC8S, PCI_VENDOR_ID_CCD,
-       PCI_SUBDEVICE_ID_CCD_IOB8STR, 0, 0, H(15)}, /* IOB8ST Recording */
+         PCI_SUBDEVICE_ID_CCD_IOB8STR, 0, 0, H(15)}, /* IOB8ST Recording */
        { PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_HFC8S, PCI_VENDOR_ID_CCD,
-               PCI_SUBDEVICE_ID_CCD_IOB8ST, 0, 0, H(16)}, /* IOB8ST  */
+         PCI_SUBDEVICE_ID_CCD_IOB8ST, 0, 0, H(16)}, /* IOB8ST  */
        { PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_HFC8S, PCI_VENDOR_ID_CCD,
-               PCI_SUBDEVICE_ID_CCD_IOB8ST_1, 0, 0, H(17)}, /* IOB8ST  */
+         PCI_SUBDEVICE_ID_CCD_IOB8ST_1, 0, 0, H(17)}, /* IOB8ST  */
        { PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_HFC8S, PCI_VENDOR_ID_CCD,
-               PCI_SUBDEVICE_ID_CCD_HFC8S, 0, 0, H(18)}, /* 8S */
+         PCI_SUBDEVICE_ID_CCD_HFC8S, 0, 0, H(18)}, /* 8S */
        { PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_HFC8S, PCI_VENDOR_ID_CCD,
-               PCI_SUBDEVICE_ID_CCD_OV8S, 0, 0, H(30)}, /* OpenVox 8 */
+         PCI_SUBDEVICE_ID_CCD_OV8S, 0, 0, H(30)}, /* OpenVox 8 */
        { PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_HFC8S, PCI_VENDOR_ID_CCD,
-               PCI_SUBDEVICE_ID_CCD_JH8S, 0, 0, H(32)}, /* Junganns 8S  */
+         PCI_SUBDEVICE_ID_CCD_JH8S, 0, 0, H(32)}, /* Junganns 8S  */
 
 
        /* Cards with HFC-E1 Chip */
        { PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_HFCE1, PCI_VENDOR_ID_CCD,
-               PCI_SUBDEVICE_ID_CCD_BNE1, 0, 0, H(19)}, /* BNE1 */
+         PCI_SUBDEVICE_ID_CCD_BNE1, 0, 0, H(19)}, /* BNE1 */
        { PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_HFCE1, PCI_VENDOR_ID_CCD,
-               PCI_SUBDEVICE_ID_CCD_BNE1M, 0, 0, H(20)}, /* BNE1 mini PCI */
+         PCI_SUBDEVICE_ID_CCD_BNE1M, 0, 0, H(20)}, /* BNE1 mini PCI */
        { PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_HFCE1, PCI_VENDOR_ID_CCD,
-               PCI_SUBDEVICE_ID_CCD_BNE1DP, 0, 0, H(21)}, /* BNE1 + (Dual) */
+         PCI_SUBDEVICE_ID_CCD_BNE1DP, 0, 0, H(21)}, /* BNE1 + (Dual) */
        { PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_HFCE1, PCI_VENDOR_ID_CCD,
-               PCI_SUBDEVICE_ID_CCD_BNE1D, 0, 0, H(22)}, /* BNE1 (Dual) */
+         PCI_SUBDEVICE_ID_CCD_BNE1D, 0, 0, H(22)}, /* BNE1 (Dual) */
 
        { PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_HFCE1, PCI_VENDOR_ID_CCD,
-               PCI_DEVICE_ID_CCD_HFCE1, 0, 0, H(23)}, /* Old Eval */
+         PCI_DEVICE_ID_CCD_HFCE1, 0, 0, H(23)}, /* Old Eval */
        { PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_HFCE1, PCI_VENDOR_ID_CCD,
-               PCI_SUBDEVICE_ID_CCD_IOB1E1, 0, 0, H(24)}, /* IOB1E1 */
+         PCI_SUBDEVICE_ID_CCD_IOB1E1, 0, 0, H(24)}, /* IOB1E1 */
        { PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_HFCE1, PCI_VENDOR_ID_CCD,
-               PCI_SUBDEVICE_ID_CCD_HFCE1, 0, 0, H(25)}, /* E1 */
+         PCI_SUBDEVICE_ID_CCD_HFCE1, 0, 0, H(25)}, /* E1 */
 
        { PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_9030, PCI_VENDOR_ID_CCD,
-               PCI_SUBDEVICE_ID_CCD_SPD4S, 0, 0, H(26)}, /* PLX PCI Bridge */
+         PCI_SUBDEVICE_ID_CCD_SPD4S, 0, 0, H(26)}, /* PLX PCI Bridge */
        { PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_9030, PCI_VENDOR_ID_CCD,
-               PCI_SUBDEVICE_ID_CCD_SPDE1, 0, 0, H(27)}, /* PLX PCI Bridge */
+         PCI_SUBDEVICE_ID_CCD_SPDE1, 0, 0, H(27)}, /* PLX PCI Bridge */
 
        { PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_HFCE1, PCI_VENDOR_ID_CCD,
-               PCI_SUBDEVICE_ID_CCD_JHSE1, 0, 0, H(25)}, /* Junghanns E1 */
+         PCI_SUBDEVICE_ID_CCD_JHSE1, 0, 0, H(25)}, /* Junghanns E1 */
 
        { PCI_VDEVICE(CCD, PCI_DEVICE_ID_CCD_HFC4S), 0 },
        { PCI_VDEVICE(CCD, PCI_DEVICE_ID_CCD_HFC8S), 0 },
@@ -5371,16 +5371,16 @@ hfcmulti_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
        int             ret;
 
        if (m == NULL && ent->vendor == PCI_VENDOR_ID_CCD && (
-           ent->device == PCI_DEVICE_ID_CCD_HFC4S ||
-           ent->device == PCI_DEVICE_ID_CCD_HFC8S ||
-           ent->device == PCI_DEVICE_ID_CCD_HFCE1)) {
+                   ent->device == PCI_DEVICE_ID_CCD_HFC4S ||
+                   ent->device == PCI_DEVICE_ID_CCD_HFC8S ||
+                   ent->device == PCI_DEVICE_ID_CCD_HFCE1)) {
                printk(KERN_ERR
-                   "Unknown HFC multiport controller (vendor:%04x device:%04x "
-                   "subvendor:%04x subdevice:%04x)\n", pdev->vendor,
-                   pdev->device, pdev->subsystem_vendor,
-                   pdev->subsystem_device);
+                      "Unknown HFC multiport controller (vendor:%04x device:%04x "
+                      "subvendor:%04x subdevice:%04x)\n", pdev->vendor,
+                      pdev->device, pdev->subsystem_vendor,
+                      pdev->subsystem_device);
                printk(KERN_ERR
-                   "Please contact the driver maintainer for support.\n");
+                      "Please contact the driver maintainer for support.\n");
                return -ENODEV;
        }
        ret = hfcmulti_init(m, pdev, ent);
@@ -5453,7 +5453,7 @@ HFCmulti_init(void)
                break;
        default:
                printk(KERN_ERR
-                   "%s: Wrong poll value (%d).\n", __func__, poll);
+                      "%s: Wrong poll value (%d).\n", __func__, poll);
                err = -EINVAL;
                return err;
 
@@ -5485,7 +5485,7 @@ HFCmulti_init(void)
                err = hfcmulti_init(&m, NULL, NULL);
                if (err) {
                        printk(KERN_ERR "error registering embedded driver: "
-                               "%x\n", err);
+                              "%x\n", err);
                        return err;
                }
                HFC_cnt++;
index 3261de1..d055ae7 100644 (file)
@@ -109,11 +109,11 @@ struct hfcPCI_hw {
        unsigned char           bswapped;
        unsigned char           protocol;
        int                     nt_timer;
-       unsigned char __iomem   *pci_io; /* start of PCI IO memory */
+       unsigned char __iomem   *pci_io; /* start of PCI IO memory */
        dma_addr_t              dmahandle;
        void                    *fifos; /* FIFO memory */
        int                     last_bfifo_cnt[2];
-           /* marker saving last b-fifo frame count */
+       /* marker saving last b-fifo frame count */
        struct timer_list       timer;
 };
 
@@ -216,7 +216,7 @@ reset_hfcpci(struct hfc_pci *hc)
        disable_hwirq(hc);
        /* enable memory ports + busmaster */
        pci_write_config_word(hc->pdev, PCI_COMMAND,
-           PCI_ENA_MEMIO + PCI_ENA_MASTER);
+                             PCI_ENA_MEMIO + PCI_ENA_MASTER);
        val = Read_hfc(hc, HFCPCI_STATUS);
        printk(KERN_DEBUG "HFC-PCI status(%x) before reset\n", val);
        hc->hw.cirm = HFCPCI_RESET;     /* Reset On */
@@ -255,7 +255,7 @@ reset_hfcpci(struct hfc_pci *hc)
        Write_hfc(hc, HFCPCI_CTMT, hc->hw.ctmt);
 
        hc->hw.int_m1 = HFCPCI_INTS_DTRANS | HFCPCI_INTS_DREC |
-           HFCPCI_INTS_L1STATE | HFCPCI_INTS_TIMER;
+               HFCPCI_INTS_L1STATE | HFCPCI_INTS_TIMER;
        Write_hfc(hc, HFCPCI_INT_M1, hc->hw.int_m1);
 
        /* Clear already pending ints */
@@ -319,10 +319,10 @@ static struct bchannel *
 Sel_BCS(struct hfc_pci *hc, int channel)
 {
        if (test_bit(FLG_ACTIVE, &hc->bch[0].Flags) &&
-               (hc->bch[0].nr & channel))
+           (hc->bch[0].nr & channel))
                return &hc->bch[0];
        else if (test_bit(FLG_ACTIVE, &hc->bch[1].Flags) &&
-               (hc->bch[1].nr & channel))
+                (hc->bch[1].nr & channel))
                return &hc->bch[1];
        else
                return NULL;
@@ -352,7 +352,7 @@ hfcpci_clear_fifo_rx(struct hfc_pci *hc, int fifo)
        bzr->f2 = bzr->f1;      /* init F pointers to remain constant */
        bzr->za[MAX_B_FRAMES].z1 = cpu_to_le16(B_FIFO_SIZE + B_SUB_VAL - 1);
        bzr->za[MAX_B_FRAMES].z2 = cpu_to_le16(
-           le16_to_cpu(bzr->za[MAX_B_FRAMES].z1));
+               le16_to_cpu(bzr->za[MAX_B_FRAMES].z1));
        if (fifo_state)
                hc->hw.fifo_en |= fifo_state;
        Write_hfc(hc, HFCPCI_FIFO_EN, hc->hw.fifo_en);
@@ -378,11 +378,11 @@ static void hfcpci_clear_fifo_tx(struct hfc_pci *hc, int fifo)
        Write_hfc(hc, HFCPCI_FIFO_EN, hc->hw.fifo_en);
        if (hc->bch[fifo].debug & DEBUG_HW_BCHANNEL)
                printk(KERN_DEBUG "hfcpci_clear_fifo_tx%d f1(%x) f2(%x) "
-                   "z1(%x) z2(%x) state(%x)\n",
-                   fifo, bzt->f1, bzt->f2,
-                   le16_to_cpu(bzt->za[MAX_B_FRAMES].z1),
-                   le16_to_cpu(bzt->za[MAX_B_FRAMES].z2),
-                   fifo_state);
+                      "z1(%x) z2(%x) state(%x)\n",
+                      fifo, bzt->f1, bzt->f2,
+                      le16_to_cpu(bzt->za[MAX_B_FRAMES].z1),
+                      le16_to_cpu(bzt->za[MAX_B_FRAMES].z2),
+                      fifo_state);
        bzt->f2 = MAX_B_FRAMES;
        bzt->f1 = bzt->f2;      /* init F pointers to remain constant */
        bzt->za[MAX_B_FRAMES].z1 = cpu_to_le16(B_FIFO_SIZE + B_SUB_VAL - 1);
@@ -392,10 +392,10 @@ static void hfcpci_clear_fifo_tx(struct hfc_pci *hc, int fifo)
        Write_hfc(hc, HFCPCI_FIFO_EN, hc->hw.fifo_en);
        if (hc->bch[fifo].debug & DEBUG_HW_BCHANNEL)
                printk(KERN_DEBUG
-                   "hfcpci_clear_fifo_tx%d f1(%x) f2(%x) z1(%x) z2(%x)\n",
-                   fifo, bzt->f1, bzt->f2,
-                   le16_to_cpu(bzt->za[MAX_B_FRAMES].z1),
-                   le16_to_cpu(bzt->za[MAX_B_FRAMES].z2));
+                      "hfcpci_clear_fifo_tx%d f1(%x) f2(%x) z1(%x) z2(%x)\n",
+                      fifo, bzt->f1, bzt->f2,
+                      le16_to_cpu(bzt->za[MAX_B_FRAMES].z1),
+                      le16_to_cpu(bzt->za[MAX_B_FRAMES].z2));
 }
 
 /*
@@ -403,7 +403,7 @@ static void hfcpci_clear_fifo_tx(struct hfc_pci *hc, int fifo)
  */
 static void
 hfcpci_empty_bfifo(struct bchannel *bch, struct bzfifo *bz,
-    u_char *bdata, int count)
+                  u_char *bdata, int count)
 {
        u_char          *ptr, *ptr1, new_f2;
        int             maxlen, new_z2;
@@ -420,7 +420,7 @@ hfcpci_empty_bfifo(struct bchannel *bch, struct bzfifo *bz,
            (*(bdata + (le16_to_cpu(zp->z1) - B_SUB_VAL)))) {
                if (bch->debug & DEBUG_HW)
                        printk(KERN_DEBUG "hfcpci_empty_fifo: incoming packet "
-                           "invalid length %d or crc\n", count);
+                              "invalid length %d or crc\n", count);
 #ifdef ERROR_STATISTIC
                bch->err_inv++;
 #endif
@@ -439,10 +439,10 @@ hfcpci_empty_bfifo(struct bchannel *bch, struct bzfifo *bz,
                        maxlen = count;         /* complete transfer */
                else
                        maxlen = B_FIFO_SIZE + B_SUB_VAL -
-                           le16_to_cpu(zp->z2);        /* maximum */
+                               le16_to_cpu(zp->z2);    /* maximum */
 
                ptr1 = bdata + (le16_to_cpu(zp->z2) - B_SUB_VAL);
-                   /* start of data */
+               /* start of data */
                memcpy(ptr, ptr1, maxlen);      /* copy data */
                count -= maxlen;
 
@@ -480,33 +480,33 @@ receive_dmsg(struct hfc_pci *hc)
                rcnt++;
                if (dch->debug & DEBUG_HW_DCHANNEL)
                        printk(KERN_DEBUG
-                           "hfcpci recd f1(%d) f2(%d) z1(%x) z2(%x) cnt(%d)\n",
-                               df->f1, df->f2,
-                               le16_to_cpu(zp->z1),
-                               le16_to_cpu(zp->z2),
-                               rcnt);
+                              "hfcpci recd f1(%d) f2(%d) z1(%x) z2(%x) cnt(%d)\n",
+                              df->f1, df->f2,
+                              le16_to_cpu(zp->z1),
+                              le16_to_cpu(zp->z2),
+                              rcnt);
 
                if ((rcnt > MAX_DFRAME_LEN + 3) || (rcnt < 4) ||
                    (df->data[le16_to_cpu(zp->z1)])) {
                        if (dch->debug & DEBUG_HW)
                                printk(KERN_DEBUG
-                                   "empty_fifo hfcpci paket inv. len "
-                                   "%d or crc %d\n",
-                                   rcnt,
-                                   df->data[le16_to_cpu(zp->z1)]);
+                                      "empty_fifo hfcpci paket inv. len "
+                                      "%d or crc %d\n",
+                                      rcnt,
+                                      df->data[le16_to_cpu(zp->z1)]);
 #ifdef ERROR_STATISTIC
                        cs->err_rx++;
 #endif
                        df->f2 = ((df->f2 + 1) & MAX_D_FRAMES) |
-                           (MAX_D_FRAMES + 1); /* next buffer */
+                               (MAX_D_FRAMES + 1);     /* next buffer */
                        df->za[df->f2 & D_FREG_MASK].z2 =
-                           cpu_to_le16((le16_to_cpu(zp->z2) + rcnt) &
-                           (D_FIFO_SIZE - 1));
+                               cpu_to_le16((le16_to_cpu(zp->z2) + rcnt) &
+                                           (D_FIFO_SIZE - 1));
                } else {
                        dch->rx_skb = mI_alloc_skb(rcnt - 3, GFP_ATOMIC);
                        if (!dch->rx_skb) {
                                printk(KERN_WARNING
-                                   "HFC-PCI: D receive out of memory\n");
+                                      "HFC-PCI: D receive out of memory\n");
                                break;
                        }
                        total = rcnt;
@@ -517,10 +517,10 @@ receive_dmsg(struct hfc_pci *hc)
                                maxlen = rcnt;  /* complete transfer */
                        else
                                maxlen = D_FIFO_SIZE - le16_to_cpu(zp->z2);
-                                   /* maximum */
+                       /* maximum */
 
                        ptr1 = df->data + le16_to_cpu(zp->z2);
-                           /* start of data */
+                       /* start of data */
                        memcpy(ptr, ptr1, maxlen);      /* copy data */
                        rcnt -= maxlen;
 
@@ -530,9 +530,9 @@ receive_dmsg(struct hfc_pci *hc)
                                memcpy(ptr, ptr1, rcnt);        /* rest */
                        }
                        df->f2 = ((df->f2 + 1) & MAX_D_FRAMES) |
-                           (MAX_D_FRAMES + 1); /* next buffer */
+                               (MAX_D_FRAMES + 1);     /* next buffer */
                        df->za[df->f2 & D_FREG_MASK].z2 = cpu_to_le16((
-                           le16_to_cpu(zp->z2) + total) & (D_FIFO_SIZE - 1));
+                                                                             le16_to_cpu(zp->z2) + total) & (D_FIFO_SIZE - 1));
                        recv_Dchannel(dch);
                }
        }
@@ -544,9 +544,9 @@ receive_dmsg(struct hfc_pci *hc)
  */
 static void
 hfcpci_empty_fifo_trans(struct bchannel *bch, struct bzfifo *rxbz,
-       struct bzfifo *txbz, u_char *bdata)
+                       struct bzfifo *txbz, u_char *bdata)
 {
-        __le16 *z1r, *z2r, *z1t, *z2t;
+       __le16  *z1r, *z2r, *z1t, *z2t;
        int     new_z2, fcnt_rx, fcnt_tx, maxlen;
        u_char  *ptr, *ptr1;
 
@@ -573,9 +573,9 @@ hfcpci_empty_fifo_trans(struct bchannel *bch, struct bzfifo *rxbz,
        fcnt_tx = le16_to_cpu(*z2t) - le16_to_cpu(*z1t);
        if (fcnt_tx <= 0)
                fcnt_tx += B_FIFO_SIZE;
-                   /* fcnt_tx contains available bytes in tx-fifo */
+       /* fcnt_tx contains available bytes in tx-fifo */
        fcnt_tx = B_FIFO_SIZE - fcnt_tx;
-                   /* remaining bytes to send (bytes in tx-fifo) */
+       /* remaining bytes to send (bytes in tx-fifo) */
 
        bch->rx_skb = mI_alloc_skb(fcnt_rx, GFP_ATOMIC);
        if (bch->rx_skb) {
@@ -584,10 +584,10 @@ hfcpci_empty_fifo_trans(struct bchannel *bch, struct bzfifo *rxbz,
                        maxlen = fcnt_rx;       /* complete transfer */
                else
                        maxlen = B_FIFO_SIZE + B_SUB_VAL - le16_to_cpu(*z2r);
-                           /* maximum */
+               /* maximum */
 
                ptr1 = bdata + (le16_to_cpu(*z2r) - B_SUB_VAL);
-                   /* start of data */
+               /* start of data */
                memcpy(ptr, ptr1, maxlen);      /* copy data */
                fcnt_rx -= maxlen;
 
@@ -632,7 +632,7 @@ Begin:
        if (rxbz->f1 != rxbz->f2) {
                if (bch->debug & DEBUG_HW_BCHANNEL)
                        printk(KERN_DEBUG "hfcpci rec ch(%x) f1(%d) f2(%d)\n",
-                           bch->nr, rxbz->f1, rxbz->f2);
+                              bch->nr, rxbz->f1, rxbz->f2);
                zp = &rxbz->za[rxbz->f2];
 
                rcnt = le16_to_cpu(zp->z1) - le16_to_cpu(zp->z2);
@@ -641,9 +641,9 @@ Begin:
                rcnt++;
                if (bch->debug & DEBUG_HW_BCHANNEL)
                        printk(KERN_DEBUG
-                           "hfcpci rec ch(%x) z1(%x) z2(%x) cnt(%d)\n",
-                           bch->nr, le16_to_cpu(zp->z1),
-                           le16_to_cpu(zp->z2), rcnt);
+                              "hfcpci rec ch(%x) z1(%x) z2(%x) cnt(%d)\n",
+                              bch->nr, le16_to_cpu(zp->z1),
+                              le16_to_cpu(zp->z2), rcnt);
                hfcpci_empty_bfifo(bch, rxbz, bdata, rcnt);
                rcnt = rxbz->f1 - rxbz->f2;
                if (rcnt < 0)
@@ -691,15 +691,15 @@ hfcpci_fill_dfifo(struct hfc_pci *hc)
 
        if (dch->debug & DEBUG_HW_DFIFO)
                printk(KERN_DEBUG "%s:f1(%d) f2(%d) z1(f1)(%x)\n", __func__,
-                   df->f1, df->f2,
-                   le16_to_cpu(df->za[df->f1 & D_FREG_MASK].z1));
+                      df->f1, df->f2,
+                      le16_to_cpu(df->za[df->f1 & D_FREG_MASK].z1));
        fcnt = df->f1 - df->f2; /* frame count actually buffered */
        if (fcnt < 0)
                fcnt += (MAX_D_FRAMES + 1);     /* if wrap around */
        if (fcnt > (MAX_D_FRAMES - 1)) {
                if (dch->debug & DEBUG_HW_DCHANNEL)
                        printk(KERN_DEBUG
-                           "hfcpci_fill_Dfifo more as 14 frames\n");
+                              "hfcpci_fill_Dfifo more as 14 frames\n");
 #ifdef ERROR_STATISTIC
                cs->err_tx++;
 #endif
@@ -707,25 +707,25 @@ hfcpci_fill_dfifo(struct hfc_pci *hc)
        }
        /* now determine free bytes in FIFO buffer */
        maxlen = le16_to_cpu(df->za[df->f2 & D_FREG_MASK].z2) -
-           le16_to_cpu(df->za[df->f1 & D_FREG_MASK].z1) - 1;
+               le16_to_cpu(df->za[df->f1 & D_FREG_MASK].z1) - 1;
        if (maxlen <= 0)
                maxlen += D_FIFO_SIZE;  /* count now contains available bytes */
 
        if (dch->debug & DEBUG_HW_DCHANNEL)
                printk(KERN_DEBUG "hfcpci_fill_Dfifo count(%d/%d)\n",
-                       count, maxlen);
+                      count, maxlen);
        if (count > maxlen) {
                if (dch->debug & DEBUG_HW_DCHANNEL)
                        printk(KERN_DEBUG "hfcpci_fill_Dfifo no fifo mem\n");
                return;
        }
        new_z1 = (le16_to_cpu(df->za[df->f1 & D_FREG_MASK].z1) + count) &
-           (D_FIFO_SIZE - 1);
+               (D_FIFO_SIZE - 1);
        new_f1 = ((df->f1 + 1) & D_FREG_MASK) | (D_FREG_MASK + 1);
        src = dch->tx_skb->data + dch->tx_idx;  /* source pointer */
        dst = df->data + le16_to_cpu(df->za[df->f1 & D_FREG_MASK].z1);
        maxlen = D_FIFO_SIZE - le16_to_cpu(df->za[df->f1 & D_FREG_MASK].z1);
-           /* end fifo */
+       /* end fifo */
        if (maxlen > count)
                maxlen = count; /* limit size */
        memcpy(dst, src, maxlen);       /* first copy */
@@ -737,9 +737,9 @@ hfcpci_fill_dfifo(struct hfc_pci *hc)
                memcpy(dst, src, count);
        }
        df->za[new_f1 & D_FREG_MASK].z1 = cpu_to_le16(new_z1);
-           /* for next buffer */
+       /* for next buffer */
        df->za[df->f1 & D_FREG_MASK].z1 = cpu_to_le16(new_z1);
-           /* new pos actual buffer */
+       /* new pos actual buffer */
        df->f1 = new_f1;        /* next frame */
        dch->tx_idx = dch->tx_skb->len;
 }
@@ -750,7 +750,7 @@ hfcpci_fill_dfifo(struct hfc_pci *hc)
 static void
 hfcpci_fill_fifo(struct bchannel *bch)
 {
-       struct hfc_pci  *hc = bch->hw;
+       struct hfc_pci  *hc = bch->hw;
        int             maxlen, fcnt;
        int             count, new_z1;
        struct bzfifo   *bz;
@@ -776,35 +776,35 @@ hfcpci_fill_fifo(struct bchannel *bch)
                z2t = z1t + 1;
                if (bch->debug & DEBUG_HW_BCHANNEL)
                        printk(KERN_DEBUG "hfcpci_fill_fifo_trans ch(%x) "
-                           "cnt(%d) z1(%x) z2(%x)\n", bch->nr, count,
-                           le16_to_cpu(*z1t), le16_to_cpu(*z2t));
+                              "cnt(%d) z1(%x) z2(%x)\n", bch->nr, count,
+                              le16_to_cpu(*z1t), le16_to_cpu(*z2t));
                fcnt = le16_to_cpu(*z2t) - le16_to_cpu(*z1t);
                if (fcnt <= 0)
                        fcnt += B_FIFO_SIZE;
-                           /* fcnt contains available bytes in fifo */
+               /* fcnt contains available bytes in fifo */
                fcnt = B_FIFO_SIZE - fcnt;
-                   /* remaining bytes to send (bytes in fifo) */
+               /* remaining bytes to send (bytes in fifo) */
 
                /* "fill fifo if empty" feature */
                if (test_bit(FLG_FILLEMPTY, &bch->Flags) && !fcnt) {
                        /* printk(KERN_DEBUG "%s: buffer empty, so we have "
-                               "underrun\n", __func__); */
+                          "underrun\n", __func__); */
                        /* fill buffer, to prevent future underrun */
                        count = HFCPCI_FILLEMPTY;
                        new_z1 = le16_to_cpu(*z1t) + count;
-                          /* new buffer Position */
+                       /* new buffer Position */
                        if (new_z1 >= (B_FIFO_SIZE + B_SUB_VAL))
                                new_z1 -= B_FIFO_SIZE;  /* buffer wrap */
                        dst = bdata + (le16_to_cpu(*z1t) - B_SUB_VAL);
                        maxlen = (B_FIFO_SIZE + B_SUB_VAL) - le16_to_cpu(*z1t);
-                           /* end of fifo */
+                       /* end of fifo */
                        if (bch->debug & DEBUG_HW_BFIFO)
                                printk(KERN_DEBUG "hfcpci_FFt fillempty "
-                                   "fcnt(%d) maxl(%d) nz1(%x) dst(%p)\n",
-                                   fcnt, maxlen, new_z1, dst);
+                                      "fcnt(%d) maxl(%d) nz1(%x) dst(%p)\n",
+                                      fcnt, maxlen, new_z1, dst);
                        fcnt += count;
                        if (maxlen > count)
-                               maxlen = count;         /* limit size */
+                               maxlen = count;         /* limit size */
                        memset(dst, 0x2a, maxlen);      /* first copy */
                        count -= maxlen;                /* remaining bytes */
                        if (count) {
@@ -814,7 +814,7 @@ hfcpci_fill_fifo(struct bchannel *bch)
                        *z1t = cpu_to_le16(new_z1);     /* now send data */
                }
 
-next_t_frame:
+       next_t_frame:
                count = bch->tx_skb->len - bch->tx_idx;
                /* maximum fill shall be poll*2 */
                if (count > (poll << 1) - fcnt)
@@ -823,18 +823,18 @@ next_t_frame:
                        return;
                /* data is suitable for fifo */
                new_z1 = le16_to_cpu(*z1t) + count;
-                   /* new buffer Position */
+               /* new buffer Position */
                if (new_z1 >= (B_FIFO_SIZE + B_SUB_VAL))
                        new_z1 -= B_FIFO_SIZE;  /* buffer wrap */
                src = bch->tx_skb->data + bch->tx_idx;
-                   /* source pointer */
+               /* source pointer */
                dst = bdata + (le16_to_cpu(*z1t) - B_SUB_VAL);
                maxlen = (B_FIFO_SIZE + B_SUB_VAL) - le16_to_cpu(*z1t);
-                   /* end of fifo */
+               /* end of fifo */
                if (bch->debug & DEBUG_HW_BFIFO)
                        printk(KERN_DEBUG "hfcpci_FFt fcnt(%d) "
-                           "maxl(%d) nz1(%x) dst(%p)\n",
-                           fcnt, maxlen, new_z1, dst);
+                              "maxl(%d) nz1(%x) dst(%p)\n",
+                              fcnt, maxlen, new_z1, dst);
                fcnt += count;
                bch->tx_idx += count;
                if (maxlen > count)
@@ -859,27 +859,27 @@ next_t_frame:
        }
        if (bch->debug & DEBUG_HW_BCHANNEL)
                printk(KERN_DEBUG
-                   "%s: ch(%x) f1(%d) f2(%d) z1(f1)(%x)\n",
-                   __func__, bch->nr, bz->f1, bz->f2,
-                   bz->za[bz->f1].z1);
+                      "%s: ch(%x) f1(%d) f2(%d) z1(f1)(%x)\n",
+                      __func__, bch->nr, bz->f1, bz->f2,
+                      bz->za[bz->f1].z1);
        fcnt = bz->f1 - bz->f2; /* frame count actually buffered */
        if (fcnt < 0)
                fcnt += (MAX_B_FRAMES + 1);     /* if wrap around */
        if (fcnt > (MAX_B_FRAMES - 1)) {
                if (bch->debug & DEBUG_HW_BCHANNEL)
                        printk(KERN_DEBUG
-                           "hfcpci_fill_Bfifo more as 14 frames\n");
+                              "hfcpci_fill_Bfifo more as 14 frames\n");
                return;
        }
        /* now determine free bytes in FIFO buffer */
        maxlen = le16_to_cpu(bz->za[bz->f2].z2) -
-           le16_to_cpu(bz->za[bz->f1].z1) - 1;
+               le16_to_cpu(bz->za[bz->f1].z1) - 1;
        if (maxlen <= 0)
                maxlen += B_FIFO_SIZE;  /* count now contains available bytes */
 
        if (bch->debug & DEBUG_HW_BCHANNEL)
                printk(KERN_DEBUG "hfcpci_fill_fifo ch(%x) count(%d/%d)\n",
-                       bch->nr, count, maxlen);
+                      bch->nr, count, maxlen);
 
        if (maxlen < count) {
                if (bch->debug & DEBUG_HW_BCHANNEL)
@@ -887,7 +887,7 @@ next_t_frame:
                return;
        }
        new_z1 = le16_to_cpu(bz->za[bz->f1].z1) + count;
-           /* new buffer Position */
+       /* new buffer Position */
        if (new_z1 >= (B_FIFO_SIZE + B_SUB_VAL))
                new_z1 -= B_FIFO_SIZE;  /* buffer wrap */
 
@@ -895,7 +895,7 @@ next_t_frame:
        src = bch->tx_skb->data + bch->tx_idx;  /* source pointer */
        dst = bdata + (le16_to_cpu(bz->za[bz->f1].z1) - B_SUB_VAL);
        maxlen = (B_FIFO_SIZE + B_SUB_VAL) - le16_to_cpu(bz->za[bz->f1].z1);
-           /* end fifo */
+       /* end fifo */
        if (maxlen > count)
                maxlen = count; /* limit size */
        memcpy(dst, src, maxlen);       /* first copy */
@@ -923,7 +923,7 @@ ph_state_te(struct dchannel *dch)
 {
        if (dch->debug)
                printk(KERN_DEBUG "%s: TE newstate %x\n",
-                       __func__, dch->state);
+                      __func__, dch->state);
        switch (dch->state) {
        case 0:
                l1_event(dch->l1, HW_RESET_IND);
@@ -961,7 +961,7 @@ handle_nt_timer3(struct dchannel *dch) {
                hc->hw.mst_m |= HFCPCI_MASTER;
        Write_hfc(hc, HFCPCI_MST_MODE, hc->hw.mst_m);
        _queue_data(&dch->dev.D, PH_ACTIVATE_IND,
-           MISDN_ID_ANY, 0, NULL, GFP_ATOMIC);
+                   MISDN_ID_ANY, 0, NULL, GFP_ATOMIC);
 }
 
 static void
@@ -971,7 +971,7 @@ ph_state_nt(struct dchannel *dch)
 
        if (dch->debug)
                printk(KERN_DEBUG "%s: NT newstate %x\n",
-                       __func__, dch->state);
+                      __func__, dch->state);
        switch (dch->state) {
        case 2:
                if (hc->hw.nt_timer < 0) {
@@ -993,7 +993,7 @@ ph_state_nt(struct dchannel *dch)
                        hc->hw.ctmt &= ~HFCPCI_AUTO_TIMER;
                        hc->hw.ctmt |= HFCPCI_TIM3_125;
                        Write_hfc(hc, HFCPCI_CTMT, hc->hw.ctmt |
-                               HFCPCI_CLTIMER);
+                                 HFCPCI_CLTIMER);
                        test_and_clear_bit(FLG_HFC_TIMER_T3, &dch->Flags);
                        test_and_set_bit(FLG_HFC_TIMER_T1, &dch->Flags);
                        /* allow G2 -> G3 transition */
@@ -1013,7 +1013,7 @@ ph_state_nt(struct dchannel *dch)
                Write_hfc(hc, HFCPCI_MST_MODE, hc->hw.mst_m);
                test_and_clear_bit(FLG_L2_ACTIVATED, &dch->Flags);
                _queue_data(&dch->dev.D, PH_DEACTIVATE_IND,
-                   MISDN_ID_ANY, 0, NULL, GFP_ATOMIC);
+                           MISDN_ID_ANY, 0, NULL, GFP_ATOMIC);
                break;
        case 4:
                hc->hw.nt_timer = 0;
@@ -1025,7 +1025,7 @@ ph_state_nt(struct dchannel *dch)
        case 3:
                if (!test_and_set_bit(FLG_HFC_TIMER_T3, &dch->Flags)) {
                        if (!test_and_clear_bit(FLG_L2_ACTIVATED,
-                           &dch->Flags)) {
+                                               &dch->Flags)) {
                                handle_nt_timer3(dch);
                                break;
                        }
@@ -1036,7 +1036,7 @@ ph_state_nt(struct dchannel *dch)
                        hc->hw.ctmt &= ~HFCPCI_AUTO_TIMER;
                        hc->hw.ctmt |= HFCPCI_TIM3_125;
                        Write_hfc(hc, HFCPCI_CTMT, hc->hw.ctmt |
-                               HFCPCI_CLTIMER);
+                                 HFCPCI_CLTIMER);
                }
                break;
        }
@@ -1081,7 +1081,7 @@ hfc_l1callback(struct dchannel *dch, u_int cmd)
                        hc->hw.mst_m |= HFCPCI_MASTER;
                Write_hfc(hc, HFCPCI_MST_MODE, hc->hw.mst_m);
                Write_hfc(hc, HFCPCI_STATES, HFCPCI_ACTIVATE |
-                  HFCPCI_DO_ACTION);
+                         HFCPCI_DO_ACTION);
                l1_event(dch->l1, HW_POWERUP_IND);
                break;
        case HW_DEACT_REQ:
@@ -1107,17 +1107,17 @@ hfc_l1callback(struct dchannel *dch, u_int cmd)
        case PH_ACTIVATE_IND:
                test_and_set_bit(FLG_ACTIVE, &dch->Flags);
                _queue_data(&dch->dev.D, cmd, MISDN_ID_ANY, 0, NULL,
-                       GFP_ATOMIC);
+                           GFP_ATOMIC);
                break;
        case PH_DEACTIVATE_IND:
                test_and_clear_bit(FLG_ACTIVE, &dch->Flags);
                _queue_data(&dch->dev.D, cmd, MISDN_ID_ANY, 0, NULL,
-                       GFP_ATOMIC);
+                           GFP_ATOMIC);
                break;
        default:
                if (dch->debug & DEBUG_HW)
                        printk(KERN_DEBUG "%s: unknown command %x\n",
-                           __func__, cmd);
+                              __func__, cmd);
                return -1;
        }
        return 0;
@@ -1170,7 +1170,7 @@ hfcpci_int(int intno, void *dev_id)
                val = Read_hfc(hc, HFCPCI_INT_S1);
                if (hc->dch.debug & DEBUG_HW_DCHANNEL)
                        printk(KERN_DEBUG
-                           "HFC-PCI: stat(%02x) s1(%02x)\n", stat, val);
+                              "HFC-PCI: stat(%02x) s1(%02x)\n", stat, val);
        } else {
                /* shared */
                spin_unlock(&hc->lock);
@@ -1185,7 +1185,7 @@ hfcpci_int(int intno, void *dev_id)
                exval = Read_hfc(hc, HFCPCI_STATES) & 0xf;
                if (hc->dch.debug & DEBUG_HW_DCHANNEL)
                        printk(KERN_DEBUG "ph_state chg %d->%d\n",
-                               hc->dch.state, exval);
+                              hc->dch.state, exval);
                hc->dch.state = exval;
                schedule_event(&hc->dch, FLG_PHCHANGE);
                val &= ~0x40;
@@ -1198,7 +1198,7 @@ hfcpci_int(int intno, void *dev_id)
                val &= ~0x80;
                Write_hfc(hc, HFCPCI_CTMT, hc->hw.ctmt | HFCPCI_CLTIMER);
        }
-       if (val & 0x08) {       /* B1 rx */
+       if (val & 0x08) {       /* B1 rx */
                bch = Sel_BCS(hc, hc->hw.bswapped ? 2 : 1);
                if (bch)
                        main_rec_hfcpci(bch);
@@ -1257,22 +1257,22 @@ mode_hfcpci(struct bchannel *bch, int bc, int protocol)
 
        if (bch->debug & DEBUG_HW_BCHANNEL)
                printk(KERN_DEBUG
-                   "HFCPCI bchannel protocol %x-->%x ch %x-->%x\n",
-                   bch->state, protocol, bch->nr, bc);
+                      "HFCPCI bchannel protocol %x-->%x ch %x-->%x\n",
+                      bch->state, protocol, bch->nr, bc);
 
        fifo2 = bc;
-       pcm_mode = (bc>>24) & 0xff;
+       pcm_mode = (bc >> 24) & 0xff;
        if (pcm_mode) { /* PCM SLOT USE */
                if (!test_bit(HFC_CFG_PCM, &hc->cfg))
                        printk(KERN_WARNING
-                           "%s: pcm channel id without HFC_CFG_PCM\n",
-                           __func__);
-               rx_slot = (bc>>8) & 0xff;
-               tx_slot = (bc>>16) & 0xff;
+                              "%s: pcm channel id without HFC_CFG_PCM\n",
+                              __func__);
+               rx_slot = (bc >> 8) & 0xff;
+               tx_slot = (bc >> 16) & 0xff;
                bc = bc & 0xff;
        } else if (test_bit(HFC_CFG_PCM, &hc->cfg) && (protocol > ISDN_P_NONE))
                printk(KERN_WARNING "%s: no pcm channel id but HFC_CFG_PCM\n",
-                   __func__);
+                      __func__);
        if (hc->chanlimit > 1) {
                hc->hw.bswapped = 0;    /* B1 and B2 normal mode */
                hc->hw.sctrl_e &= ~0x80;
@@ -1308,11 +1308,11 @@ mode_hfcpci(struct bchannel *bch, int bc, int protocol)
                if (fifo2 & 2) {
                        hc->hw.fifo_en &= ~HFCPCI_FIFOEN_B2;
                        hc->hw.int_m1 &= ~(HFCPCI_INTS_B2TRANS +
-                               HFCPCI_INTS_B2REC);
+                                          HFCPCI_INTS_B2REC);
                } else {
                        hc->hw.fifo_en &= ~HFCPCI_FIFOEN_B1;
                        hc->hw.int_m1 &= ~(HFCPCI_INTS_B1TRANS +
-                               HFCPCI_INTS_B1REC);
+                                          HFCPCI_INTS_B1REC);
                }
 #ifdef REVERSE_BITORDER
                if (bch->nr & 2)
@@ -1347,14 +1347,14 @@ mode_hfcpci(struct bchannel *bch, int bc, int protocol)
                        hc->hw.fifo_en |= HFCPCI_FIFOEN_B2;
                        if (!tics)
                                hc->hw.int_m1 |= (HFCPCI_INTS_B2TRANS +
-                                   HFCPCI_INTS_B2REC);
+                                                 HFCPCI_INTS_B2REC);
                        hc->hw.ctmt |= 2;
                        hc->hw.conn &= ~0x18;
                } else {
                        hc->hw.fifo_en |= HFCPCI_FIFOEN_B1;
                        if (!tics)
                                hc->hw.int_m1 |= (HFCPCI_INTS_B1TRANS +
-                                   HFCPCI_INTS_B1REC);
+                                                 HFCPCI_INTS_B1REC);
                        hc->hw.ctmt |= 1;
                        hc->hw.conn &= ~0x03;
                }
@@ -1376,14 +1376,14 @@ mode_hfcpci(struct bchannel *bch, int bc, int protocol)
                        hc->hw.last_bfifo_cnt[1] = 0;
                        hc->hw.fifo_en |= HFCPCI_FIFOEN_B2;
                        hc->hw.int_m1 |= (HFCPCI_INTS_B2TRANS +
-                           HFCPCI_INTS_B2REC);
+                                         HFCPCI_INTS_B2REC);
                        hc->hw.ctmt &= ~2;
                        hc->hw.conn &= ~0x18;
                } else {
                        hc->hw.last_bfifo_cnt[0] = 0;
                        hc->hw.fifo_en |= HFCPCI_FIFOEN_B1;
                        hc->hw.int_m1 |= (HFCPCI_INTS_B1TRANS +
-                           HFCPCI_INTS_B1REC);
+                                         HFCPCI_INTS_B1REC);
                        hc->hw.ctmt &= ~1;
                        hc->hw.conn &= ~0x03;
                }
@@ -1395,7 +1395,7 @@ mode_hfcpci(struct bchannel *bch, int bc, int protocol)
        }
        if (test_bit(HFC_CFG_PCM, &hc->cfg)) {
                if ((protocol == ISDN_P_NONE) ||
-                       (protocol == -1)) {     /* init case */
+                   (protocol == -1)) { /* init case */
                        rx_slot = 0;
                        tx_slot = 0;
                } else {
@@ -1411,18 +1411,18 @@ mode_hfcpci(struct bchannel *bch, int bc, int protocol)
                        hc->hw.conn &= 0xc7;
                        hc->hw.conn |= 0x08;
                        printk(KERN_DEBUG "%s: Write_hfc: B2_SSL 0x%x\n",
-                               __func__, tx_slot);
+                              __func__, tx_slot);
                        printk(KERN_DEBUG "%s: Write_hfc: B2_RSL 0x%x\n",
-                               __func__, rx_slot);
+                              __func__, rx_slot);
                        Write_hfc(hc, HFCPCI_B2_SSL, tx_slot);
                        Write_hfc(hc, HFCPCI_B2_RSL, rx_slot);
                } else {
                        hc->hw.conn &= 0xf8;
                        hc->hw.conn |= 0x01;
                        printk(KERN_DEBUG "%s: Write_hfc: B1_SSL 0x%x\n",
-                               __func__, tx_slot);
+                              __func__, tx_slot);
                        printk(KERN_DEBUG "%s: Write_hfc: B1_RSL 0x%x\n",
-                               __func__, rx_slot);
+                              __func__, rx_slot);
                        Write_hfc(hc, HFCPCI_B1_SSL, tx_slot);
                        Write_hfc(hc, HFCPCI_B1_RSL, rx_slot);
                }
@@ -1447,12 +1447,12 @@ set_hfcpci_rxtest(struct bchannel *bch, int protocol, int chan)
 
        if (bch->debug & DEBUG_HW_BCHANNEL)
                printk(KERN_DEBUG
-                   "HFCPCI bchannel test rx protocol %x-->%x ch %x-->%x\n",
-                   bch->state, protocol, bch->nr, chan);
+                      "HFCPCI bchannel test rx protocol %x-->%x ch %x-->%x\n",
+                      bch->state, protocol, bch->nr, chan);
        if (bch->nr != chan) {
                printk(KERN_DEBUG
-                   "HFCPCI rxtest wrong channel parameter %x/%x\n",
-                   bch->nr, chan);
+                      "HFCPCI rxtest wrong channel parameter %x/%x\n",
+                      bch->nr, chan);
                return -EINVAL;
        }
        switch (protocol) {
@@ -1543,7 +1543,7 @@ channel_bctrl(struct bchannel *bch, struct mISDN_ctrl_req *cq)
                test_and_set_bit(FLG_FILLEMPTY, &bch->Flags);
                if (debug & DEBUG_HW_OPEN)
                        printk(KERN_DEBUG "%s: FILL_EMPTY request (nr=%d "
-                               "off=%d)\n", __func__, bch->nr, !!cq->p1);
+                              "off=%d)\n", __func__, bch->nr, !!cq->p1);
                break;
        default:
                printk(KERN_WARNING "%s: unknown Op %x\n", __func__, cq->op);
@@ -1593,7 +1593,7 @@ hfc_bctrl(struct mISDNchannel *ch, u_int cmd, void *arg)
                break;
        default:
                printk(KERN_WARNING "%s: unknown prim(%x)\n",
-                       __func__, cmd);
+                      __func__, cmd);
        }
        return ret;
 }
@@ -1635,12 +1635,12 @@ hfcpci_l2l1D(struct mISDNchannel *ch, struct sk_buff *skb)
                        if (test_bit(FLG_ACTIVE, &dch->Flags)) {
                                spin_unlock_irqrestore(&hc->lock, flags);
                                _queue_data(&dch->dev.D, PH_ACTIVATE_IND,
-                                   MISDN_ID_ANY, 0, NULL, GFP_ATOMIC);
+                                           MISDN_ID_ANY, 0, NULL, GFP_ATOMIC);
                                break;
                        }
                        test_and_set_bit(FLG_L2_ACTIVATED, &dch->Flags);
                        Write_hfc(hc, HFCPCI_STATES, HFCPCI_ACTIVATE |
-                           HFCPCI_DO_ACTION | 1);
+                                 HFCPCI_DO_ACTION | 1);
                } else
                        ret = l1_event(dch->l1, hh->prim);
                spin_unlock_irqrestore(&hc->lock, flags);
@@ -1718,12 +1718,12 @@ hfcpci_l2l1B(struct mISDNchannel *ch, struct sk_buff *skb)
                spin_unlock_irqrestore(&hc->lock, flags);
                if (!ret)
                        _queue_data(ch, PH_ACTIVATE_IND, MISDN_ID_ANY, 0,
-                               NULL, GFP_KERNEL);
+                                   NULL, GFP_KERNEL);
                break;
        case PH_DEACTIVATE_REQ:
                deactivate_bchannel(bch);
                _queue_data(ch, PH_DEACTIVATE_IND, MISDN_ID_ANY, 0,
-                       NULL, GFP_KERNEL);
+                           NULL, GFP_KERNEL);
                ret = 0;
                break;
        }
@@ -1763,7 +1763,7 @@ init_card(struct hfc_pci *hc)
        spin_unlock_irqrestore(&hc->lock, flags);
        if (request_irq(hc->irq, hfcpci_int, IRQF_SHARED, "HFC PCI", hc)) {
                printk(KERN_WARNING
-                   "mISDN: couldn't get interrupt %d\n", hc->irq);
+                      "mISDN: couldn't get interrupt %d\n", hc->irq);
                return -EIO;
        }
        spin_lock_irqsave(&hc->lock, flags);
@@ -1779,9 +1779,9 @@ init_card(struct hfc_pci *hc)
                spin_unlock_irqrestore(&hc->lock, flags);
                /* Timeout 80ms */
                current->state = TASK_UNINTERRUPTIBLE;
-               schedule_timeout((80*HZ)/1000);
+               schedule_timeout((80 * HZ) / 1000);
                printk(KERN_INFO "HFC PCI: IRQ %d count %d\n",
-                       hc->irq, hc->irqcnt);
+                      hc->irq, hc->irqcnt);
                /* now switch timer interrupt off */
                spin_lock_irqsave(&hc->lock, flags);
                hc->hw.int_m1 &= ~HFCPCI_INTS_TIMER;
@@ -1790,8 +1790,8 @@ init_card(struct hfc_pci *hc)
                Write_hfc(hc, HFCPCI_MST_MODE, hc->hw.mst_m);
                if (!hc->irqcnt) {
                        printk(KERN_WARNING
-                           "HFC PCI: IRQ(%d) getting no interrupts "
-                           "during init %d\n", hc->irq, 4 - cnt);
+                              "HFC PCI: IRQ(%d) getting no interrupts "
+                              "during init %d\n", hc->irq, 4 - cnt);
                        if (cnt == 1)
                                break;
                        else {
@@ -1819,7 +1819,7 @@ channel_ctrl(struct hfc_pci *hc, struct mISDN_ctrl_req *cq)
        switch (cq->op) {
        case MISDN_CTRL_GETOP:
                cq->op = MISDN_CTRL_LOOP | MISDN_CTRL_CONNECT |
-                   MISDN_CTRL_DISCONNECT;
+                       MISDN_CTRL_DISCONNECT;
                break;
        case MISDN_CTRL_LOOP:
                /* channel 0 disabled loop */
@@ -1833,7 +1833,7 @@ channel_ctrl(struct hfc_pci *hc, struct mISDN_ctrl_req *cq)
                        else
                                slot = 0x80;
                        printk(KERN_DEBUG "%s: Write_hfc: B1_SSL/RSL 0x%x\n",
-                           __func__, slot);
+                              __func__, slot);
                        Write_hfc(hc, HFCPCI_B1_SSL, slot);
                        Write_hfc(hc, HFCPCI_B1_RSL, slot);
                        hc->hw.conn = (hc->hw.conn & ~7) | 6;
@@ -1845,7 +1845,7 @@ channel_ctrl(struct hfc_pci *hc, struct mISDN_ctrl_req *cq)
                        else
                                slot = 0x81;
                        printk(KERN_DEBUG "%s: Write_hfc: B2_SSL/RSL 0x%x\n",
-                           __func__, slot);
+                              __func__, slot);
                        Write_hfc(hc, HFCPCI_B2_SSL, slot);
                        Write_hfc(hc, HFCPCI_B2_RSL, slot);
                        hc->hw.conn = (hc->hw.conn & ~0x38) | 0x30;
@@ -1875,7 +1875,7 @@ channel_ctrl(struct hfc_pci *hc, struct mISDN_ctrl_req *cq)
                else
                        slot = 0x80;
                printk(KERN_DEBUG "%s: Write_hfc: B1_SSL/RSL 0x%x\n",
-                   __func__, slot);
+                      __func__, slot);
                Write_hfc(hc, HFCPCI_B1_SSL, slot);
                Write_hfc(hc, HFCPCI_B2_RSL, slot);
                if (test_bit(HFC_CFG_SW_DD_DU, &hc->cfg))
@@ -1883,7 +1883,7 @@ channel_ctrl(struct hfc_pci *hc, struct mISDN_ctrl_req *cq)
                else
                        slot = 0x81;
                printk(KERN_DEBUG "%s: Write_hfc: B2_SSL/RSL 0x%x\n",
-                   __func__, slot);
+                      __func__, slot);
                Write_hfc(hc, HFCPCI_B2_SSL, slot);
                Write_hfc(hc, HFCPCI_B1_RSL, slot);
                hc->hw.conn = (hc->hw.conn & ~0x3f) | 0x36;
@@ -1898,7 +1898,7 @@ channel_ctrl(struct hfc_pci *hc, struct mISDN_ctrl_req *cq)
                break;
        default:
                printk(KERN_WARNING "%s: unknown Op %x\n",
-                   __func__, cq->op);
+                      __func__, cq->op);
                ret = -EINVAL;
                break;
        }
@@ -1907,13 +1907,13 @@ channel_ctrl(struct hfc_pci *hc, struct mISDN_ctrl_req *cq)
 
 static int
 open_dchannel(struct hfc_pci *hc, struct mISDNchannel *ch,
-    struct channel_req *rq)
+             struct channel_req *rq)
 {
        int err = 0;
 
        if (debug & DEBUG_HW_OPEN)
                printk(KERN_DEBUG "%s: dev(%d) open from %p\n", __func__,
-                   hc->dch.dev.id, __builtin_return_address(0));
+                      hc->dch.dev.id, __builtin_return_address(0));
        if (rq->protocol == ISDN_P_NONE)
                return -EINVAL;
        if (rq->adr.channel == 1) {
@@ -1949,7 +1949,7 @@ open_dchannel(struct hfc_pci *hc, struct mISDNchannel *ch,
        if (((ch->protocol == ISDN_P_NT_S0) && (hc->dch.state == 3)) ||
            ((ch->protocol == ISDN_P_TE_S0) && (hc->dch.state == 7))) {
                _queue_data(ch, PH_ACTIVATE_IND, MISDN_ID_ANY,
-                   0, NULL, GFP_KERNEL);
+                           0, NULL, GFP_KERNEL);
        }
        rq->ch = ch;
        if (!try_module_get(THIS_MODULE))
@@ -1991,7 +1991,7 @@ hfc_dctrl(struct mISDNchannel *ch, u_int cmd, void *arg)
 
        if (dch->debug & DEBUG_HW)
                printk(KERN_DEBUG "%s: cmd:%x %p\n",
-                   __func__, cmd, arg);
+                      __func__, cmd, arg);
        switch (cmd) {
        case OPEN_CHANNEL:
                rq = arg;
@@ -2004,8 +2004,8 @@ hfc_dctrl(struct mISDNchannel *ch, u_int cmd, void *arg)
        case CLOSE_CHANNEL:
                if (debug & DEBUG_HW_OPEN)
                        printk(KERN_DEBUG "%s: dev(%d) close from %p\n",
-                           __func__, hc->dch.dev.id,
-                           __builtin_return_address(0));
+                              __func__, hc->dch.dev.id,
+                              __builtin_return_address(0));
                module_put(THIS_MODULE);
                break;
        case CONTROL_CHANNEL:
@@ -2014,7 +2014,7 @@ hfc_dctrl(struct mISDNchannel *ch, u_int cmd, void *arg)
        default:
                if (dch->debug & DEBUG_HW)
                        printk(KERN_DEBUG "%s: unknown command %x\n",
-                           __func__, cmd);
+                              __func__, cmd);
                return -EINVAL;
        }
        return err;
@@ -2047,16 +2047,16 @@ setup_hw(struct hfc_pci *hc)
        /* We silently assume the address is okay if nonzero */
        if (!buffer) {
                printk(KERN_WARNING
-                   "HFC-PCI: Error allocating memory for FIFO!\n");
+                      "HFC-PCI: Error allocating memory for FIFO!\n");
                return 1;
        }
        hc->hw.fifos = buffer;
        pci_write_config_dword(hc->pdev, 0x80, hc->hw.dmahandle);
        hc->hw.pci_io = ioremap((ulong) hc->hw.pci_io, 256);
        printk(KERN_INFO
-               "HFC-PCI: defined at mem %#lx fifo %#lx(%#lx) IRQ %d HZ %d\n",
-               (u_long) hc->hw.pci_io, (u_long) hc->hw.fifos,
-               (u_long) hc->hw.dmahandle, hc->irq, HZ);
+              "HFC-PCI: defined at mem %#lx fifo %#lx(%#lx) IRQ %d HZ %d\n",
+              (u_long) hc->hw.pci_io, (u_long) hc->hw.fifos,
+              (u_long) hc->hw.dmahandle, hc->irq, HZ);
        /* enable memory mapped ports, disable busmaster */
        pci_write_config_word(hc->pdev, PCI_COMMAND, PCI_ENA_MEMIO);
        hc->hw.int_m2 = 0;
@@ -2113,7 +2113,7 @@ setup_card(struct hfc_pci *card)
        card->dch.hw = card;
        card->dch.dev.Dprotocols = (1 << ISDN_P_TE_S0) | (1 << ISDN_P_NT_S0);
        card->dch.dev.Bprotocols = (1 << (ISDN_P_B_RAW & ISDN_P_B_MASK)) |
-           (1 << (ISDN_P_B_HDLC & ISDN_P_B_MASK));
+               (1 << (ISDN_P_B_HDLC & ISDN_P_B_MASK));
        card->dch.dev.D.send = hfcpci_l2l1D;
        card->dch.dev.D.ctrl = hfc_dctrl;
        card->dch.dev.nrbchan = 2;
@@ -2174,13 +2174,13 @@ static const struct _hfc_map hfc_map[] =
        {HFC_ANIGMA_MC145575, 0, "Motorola MC145575"},
        {HFC_ZOLTRIX_2BD0, 0, "Zoltrix 2BD0"},
        {HFC_DIGI_DF_M_IOM2_E, 0,
-           "Digi International DataFire Micro V IOM2 (Europe)"},
+        "Digi International DataFire Micro V IOM2 (Europe)"},
        {HFC_DIGI_DF_M_E, 0,
-           "Digi International DataFire Micro V (Europe)"},
+        "Digi International DataFire Micro V (Europe)"},
        {HFC_DIGI_DF_M_IOM2_A, 0,
-           "Digi International DataFire Micro V IOM2 (North America)"},
+        "Digi International DataFire Micro V IOM2 (North America)"},
        {HFC_DIGI_DF_M_A, 0,
-           "Digi International DataFire Micro V (North America)"},
+        "Digi International DataFire Micro V (North America)"},
        {HFC_SITECOM_DC105V2, 0, "Sitecom Connectivity DC-105 ISDN TA"},
        {},
 };
@@ -2188,51 +2188,51 @@ static const struct _hfc_map hfc_map[] =
 static struct pci_device_id hfc_ids[] =
 {
        { PCI_VDEVICE(CCD, PCI_DEVICE_ID_CCD_2BD0),
-               (unsigned long) &hfc_map[0] },
+         (unsigned long) &hfc_map[0] },
        { PCI_VDEVICE(CCD, PCI_DEVICE_ID_CCD_B000),
-               (unsigned long) &hfc_map[1] },
+         (unsigned long) &hfc_map[1] },
        { PCI_VDEVICE(CCD, PCI_DEVICE_ID_CCD_B006),
-               (unsigned long) &hfc_map[2] },
+         (unsigned long) &hfc_map[2] },
        { PCI_VDEVICE(CCD, PCI_DEVICE_ID_CCD_B007),
-               (unsigned long) &hfc_map[3] },
+         (unsigned long) &hfc_map[3] },
        { PCI_VDEVICE(CCD, PCI_DEVICE_ID_CCD_B008),
-               (unsigned long) &hfc_map[4] },
+         (unsigned long) &hfc_map[4] },
        { PCI_VDEVICE(CCD, PCI_DEVICE_ID_CCD_B009),
-               (unsigned long) &hfc_map[5] },
+         (unsigned long) &hfc_map[5] },
        { PCI_VDEVICE(CCD, PCI_DEVICE_ID_CCD_B00A),
-               (unsigned long) &hfc_map[6] },
+         (unsigned long) &hfc_map[6] },
        { PCI_VDEVICE(CCD, PCI_DEVICE_ID_CCD_B00B),
-               (unsigned long) &hfc_map[7] },
+         (unsigned long) &hfc_map[7] },
        { PCI_VDEVICE(CCD, PCI_DEVICE_ID_CCD_B00C),
-               (unsigned long) &hfc_map[8] },
+         (unsigned long) &hfc_map[8] },
        { PCI_VDEVICE(CCD, PCI_DEVICE_ID_CCD_B100),
-               (unsigned long) &hfc_map[9] },
+         (unsigned long) &hfc_map[9] },
        { PCI_VDEVICE(CCD, PCI_DEVICE_ID_CCD_B700),
-               (unsigned long) &hfc_map[10] },
+         (unsigned long) &hfc_map[10] },
        { PCI_VDEVICE(CCD, PCI_DEVICE_ID_CCD_B701),
-               (unsigned long) &hfc_map[11] },
+         (unsigned long) &hfc_map[11] },
        { PCI_VDEVICE(ABOCOM, PCI_DEVICE_ID_ABOCOM_2BD1),
-               (unsigned long) &hfc_map[12] },
+         (unsigned long) &hfc_map[12] },
        { PCI_VDEVICE(ASUSTEK, PCI_DEVICE_ID_ASUSTEK_0675),
-               (unsigned long) &hfc_map[13] },
+         (unsigned long) &hfc_map[13] },
        { PCI_VDEVICE(BERKOM, PCI_DEVICE_ID_BERKOM_T_CONCEPT),
-               (unsigned long) &hfc_map[14] },
+         (unsigned long) &hfc_map[14] },
        { PCI_VDEVICE(BERKOM, PCI_DEVICE_ID_BERKOM_A1T),
-               (unsigned long) &hfc_map[15] },
+         (unsigned long) &hfc_map[15] },
        { PCI_VDEVICE(ANIGMA, PCI_DEVICE_ID_ANIGMA_MC145575),
-               (unsigned long) &hfc_map[16] },
+         (unsigned long) &hfc_map[16] },
        { PCI_VDEVICE(ZOLTRIX, PCI_DEVICE_ID_ZOLTRIX_2BD0),
-               (unsigned long) &hfc_map[17] },
+         (unsigned long) &hfc_map[17] },
        { PCI_VDEVICE(DIGI, PCI_DEVICE_ID_DIGI_DF_M_IOM2_E),
-               (unsigned long) &hfc_map[18] },
+         (unsigned long) &hfc_map[18] },
        { PCI_VDEVICE(DIGI, PCI_DEVICE_ID_DIGI_DF_M_E),
-               (unsigned long) &hfc_map[19] },
+         (unsigned long) &hfc_map[19] },
        { PCI_VDEVICE(DIGI, PCI_DEVICE_ID_DIGI_DF_M_IOM2_A),
-               (unsigned long) &hfc_map[20] },
+         (unsigned long) &hfc_map[20] },
        { PCI_VDEVICE(DIGI, PCI_DEVICE_ID_DIGI_DF_M_A),
-               (unsigned long) &hfc_map[21] },
+         (unsigned long) &hfc_map[21] },
        { PCI_VDEVICE(SITECOM, PCI_DEVICE_ID_SITECOM_DC105V2),
-               (unsigned long) &hfc_map[22] },
+         (unsigned long) &hfc_map[22] },
        {},
 };
 
@@ -2277,7 +2277,7 @@ hfc_remove_pci(struct pci_dev *pdev)
        else
                if (debug)
                        printk(KERN_DEBUG "%s: drvdata already removed\n",
-                           __func__);
+                              __func__);
 }
 
 
@@ -2317,7 +2317,7 @@ static void
 hfcpci_softirq(void *arg)
 {
        (void) driver_for_each_device(&hfc_driver.driver, NULL, arg,
-                                       _hfcpci_softirq);
+                                     _hfcpci_softirq);
 
        /* if next event would be in the past ... */
        if ((s32)(hfc_jiffies + tics - jiffies) <= 0)
@@ -2343,14 +2343,14 @@ HFC_init(void)
                poll = (tics * 8000) / HZ;
                if (poll > 256 || poll < 8) {
                        printk(KERN_ERR "%s: Wrong poll value %d not in range "
-                               "of 8..256.\n", __func__, poll);
+                              "of 8..256.\n", __func__, poll);
                        err = -EINVAL;
                        return err;
                }
        }
        if (poll != HFCPCI_BTRANS_THRESHOLD) {
                printk(KERN_INFO "%s: Using alternative poll value of %d\n",
-                       __func__, poll);
+                      __func__, poll);
                hfc_tl.function = (void *)hfcpci_softirq;
                hfc_tl.data = 0;
                init_timer(&hfc_tl);
index 0e1f4d5..6023387 100644 (file)
@@ -27,6 +27,7 @@
  *   poll=<n>, default 128
  *     n : burst size of PH_DATA_IND at transparent rx data
  *
+ * Revision: 0.3.3 (socket), 2008-11-05
  */
 
 #include <linux/module.h>
@@ -36,8 +37,6 @@
 #include <linux/slab.h>
 #include "hfcsusb.h"
 
-static const char *hfcsusb_rev = "Revision: 0.3.3 (socket), 2008-11-05";
-
 static unsigned int debug;
 static int poll = DEFAULT_TRANSP_BURST_SZ;
 
@@ -76,9 +75,9 @@ ctrl_start_transfer(struct hfcsusb *hw)
                hw->ctrl_urb->transfer_buffer = NULL;
                hw->ctrl_urb->transfer_buffer_length = 0;
                hw->ctrl_write.wIndex =
-                   cpu_to_le16(hw->ctrl_buff[hw->ctrl_out_idx].hfcs_reg);
+                       cpu_to_le16(hw->ctrl_buff[hw->ctrl_out_idx].hfcs_reg);
                hw->ctrl_write.wValue =
-                   cpu_to_le16(hw->ctrl_buff[hw->ctrl_out_idx].reg_val);
+                       cpu_to_le16(hw->ctrl_buff[hw->ctrl_out_idx].reg_val);
 
                usb_submit_urb(hw->ctrl_urb, GFP_ATOMIC);
        }
@@ -94,7 +93,7 @@ static int write_reg(struct hfcsusb *hw, __u8 reg, __u8 val)
 
        if (debug & DBG_HFC_CALL_TRACE)
                printk(KERN_DEBUG "%s: %s reg(0x%02x) val(0x%02x)\n",
-                       hw->name, __func__, reg, val);
+                      hw->name, __func__, reg, val);
 
        spin_lock(&hw->ctrl_lock);
        if (hw->ctrl_cnt >= HFC_CTRL_BUFSIZE) {
@@ -197,8 +196,8 @@ handle_led(struct hfcsusb *hw, int event)
        if (hw->led_state != tmpled) {
                if (debug & DBG_HFC_CALL_TRACE)
                        printk(KERN_DEBUG "%s: %s reg(0x%02x) val(x%02x)\n",
-                           hw->name, __func__,
-                           HFCUSB_P_DATA, hw->led_state);
+                              hw->name, __func__,
+                              HFCUSB_P_DATA, hw->led_state);
 
                write_reg(hw, HFCUSB_P_DATA, hw->led_state);
        }
@@ -226,7 +225,7 @@ hfcusb_l2l1B(struct mISDNchannel *ch, struct sk_buff *skb)
                spin_unlock_irqrestore(&hw->lock, flags);
                if (debug & DBG_HFC_CALL_TRACE)
                        printk(KERN_DEBUG "%s: %s PH_DATA_REQ ret(%i)\n",
-                               hw->name, __func__, ret);
+                              hw->name, __func__, ret);
                if (ret > 0) {
                        /*
                         * other l1 drivers don't send early confirms on
@@ -245,12 +244,12 @@ hfcusb_l2l1B(struct mISDNchannel *ch, struct sk_buff *skb)
                        ret = 0;
                if (!ret)
                        _queue_data(ch, PH_ACTIVATE_IND, MISDN_ID_ANY,
-                               0, NULL, GFP_KERNEL);
+                                   0, NULL, GFP_KERNEL);
                break;
        case PH_DEACTIVATE_REQ:
                deactivate_bchannel(bch);
                _queue_data(ch, PH_DEACTIVATE_IND, MISDN_ID_ANY,
-                       0, NULL, GFP_KERNEL);
+                           0, NULL, GFP_KERNEL);
                ret = 0;
                break;
        }
@@ -271,7 +270,7 @@ hfcsusb_ph_info(struct hfcsusb *hw)
        int i;
 
        phi = kzalloc(sizeof(struct ph_info) +
-               dch->dev.nrbchan * sizeof(struct ph_info_ch), GFP_ATOMIC);
+                     dch->dev.nrbchan * sizeof(struct ph_info_ch), GFP_ATOMIC);
        phi->dch.ch.protocol = hw->protocol;
        phi->dch.ch.Flags = dch->Flags;
        phi->dch.state = dch->state;
@@ -281,8 +280,8 @@ hfcsusb_ph_info(struct hfcsusb *hw)
                phi->bch[i].Flags = hw->bch[i].Flags;
        }
        _queue_data(&dch->dev.D, MPH_INFORMATION_IND, MISDN_ID_ANY,
-               sizeof(struct ph_info_dch) + dch->dev.nrbchan *
-               sizeof(struct ph_info_ch), phi, GFP_ATOMIC);
+                   sizeof(struct ph_info_dch) + dch->dev.nrbchan *
+                   sizeof(struct ph_info_ch), phi, GFP_ATOMIC);
        kfree(phi);
 }
 
@@ -303,7 +302,7 @@ hfcusb_l2l1D(struct mISDNchannel *ch, struct sk_buff *skb)
        case PH_DATA_REQ:
                if (debug & DBG_HFC_CALL_TRACE)
                        printk(KERN_DEBUG "%s: %s: PH_DATA_REQ\n",
-                               hw->name, __func__);
+                              hw->name, __func__);
 
                spin_lock_irqsave(&hw->lock, flags);
                ret = dchannel_senddata(dch, skb);
@@ -317,20 +316,20 @@ hfcusb_l2l1D(struct mISDNchannel *ch, struct sk_buff *skb)
        case PH_ACTIVATE_REQ:
                if (debug & DBG_HFC_CALL_TRACE)
                        printk(KERN_DEBUG "%s: %s: PH_ACTIVATE_REQ %s\n",
-                               hw->name, __func__,
-                               (hw->protocol == ISDN_P_NT_S0) ? "NT" : "TE");
+                              hw->name, __func__,
+                              (hw->protocol == ISDN_P_NT_S0) ? "NT" : "TE");
 
                if (hw->protocol == ISDN_P_NT_S0) {
                        ret = 0;
                        if (test_bit(FLG_ACTIVE, &dch->Flags)) {
                                _queue_data(&dch->dev.D,
-                                       PH_ACTIVATE_IND, MISDN_ID_ANY, 0,
-                                       NULL, GFP_ATOMIC);
+                                           PH_ACTIVATE_IND, MISDN_ID_ANY, 0,
+                                           NULL, GFP_ATOMIC);
                        } else {
                                hfcsusb_ph_command(hw,
-                                       HFC_L1_ACTIVATE_NT);
+                                                  HFC_L1_ACTIVATE_NT);
                                test_and_set_bit(FLG_L2_ACTIVATED,
-                                       &dch->Flags);
+                                                &dch->Flags);
                        }
                } else {
                        hfcsusb_ph_command(hw, HFC_L1_ACTIVATE_TE);
@@ -341,7 +340,7 @@ hfcusb_l2l1D(struct mISDNchannel *ch, struct sk_buff *skb)
        case PH_DEACTIVATE_REQ:
                if (debug & DBG_HFC_CALL_TRACE)
                        printk(KERN_DEBUG "%s: %s: PH_DEACTIVATE_REQ\n",
-                               hw->name, __func__);
+                              hw->name, __func__);
                test_and_clear_bit(FLG_L2_ACTIVATED, &dch->Flags);
 
                if (hw->protocol == ISDN_P_NT_S0) {
@@ -386,7 +385,7 @@ hfc_l1callback(struct dchannel *dch, u_int cmd)
 
        if (debug & DBG_HFC_CALL_TRACE)
                printk(KERN_DEBUG "%s: %s cmd 0x%x\n",
-                       hw->name, __func__, cmd);
+                      hw->name, __func__, cmd);
 
        switch (cmd) {
        case INFO3_P8:
@@ -411,17 +410,17 @@ hfc_l1callback(struct dchannel *dch, u_int cmd)
        case PH_ACTIVATE_IND:
                test_and_set_bit(FLG_ACTIVE, &dch->Flags);
                _queue_data(&dch->dev.D, cmd, MISDN_ID_ANY, 0, NULL,
-                       GFP_ATOMIC);
+                           GFP_ATOMIC);
                break;
        case PH_DEACTIVATE_IND:
                test_and_clear_bit(FLG_ACTIVE, &dch->Flags);
                _queue_data(&dch->dev.D, cmd, MISDN_ID_ANY, 0, NULL,
-                       GFP_ATOMIC);
+                           GFP_ATOMIC);
                break;
        default:
                if (dch->debug & DEBUG_HW)
                        printk(KERN_DEBUG "%s: %s: unknown cmd %x\n",
-                       hw->name, __func__, cmd);
+                              hw->name, __func__, cmd);
                return -1;
        }
        hfcsusb_ph_info(hw);
@@ -430,14 +429,14 @@ hfc_l1callback(struct dchannel *dch, u_int cmd)
 
 static int
 open_dchannel(struct hfcsusb *hw, struct mISDNchannel *ch,
-    struct channel_req *rq)
+             struct channel_req *rq)
 {
        int err = 0;
 
        if (debug & DEBUG_HW_OPEN)
                printk(KERN_DEBUG "%s: %s: dev(%d) open addr(%i) from %p\n",
-                   hw->name, __func__, hw->dch.dev.id, rq->adr.channel,
-                   __builtin_return_address(0));
+                      hw->name, __func__, hw->dch.dev.id, rq->adr.channel,
+                      __builtin_return_address(0));
        if (rq->protocol == ISDN_P_NONE)
                return -EINVAL;
 
@@ -451,7 +450,7 @@ open_dchannel(struct hfcsusb *hw, struct mISDNchannel *ch,
                        hfcsusb_start_endpoint(hw, HFC_CHAN_E);
                        set_bit(FLG_ACTIVE, &hw->ech.Flags);
                        _queue_data(&hw->ech.dev.D, PH_ACTIVATE_IND,
-                                    MISDN_ID_ANY, 0, NULL, GFP_ATOMIC);
+                                   MISDN_ID_ANY, 0, NULL, GFP_ATOMIC);
                } else
                        return -EINVAL;
        }
@@ -474,11 +473,11 @@ open_dchannel(struct hfcsusb *hw, struct mISDNchannel *ch,
        if (((ch->protocol == ISDN_P_NT_S0) && (hw->dch.state == 3)) ||
            ((ch->protocol == ISDN_P_TE_S0) && (hw->dch.state == 7)))
                _queue_data(ch, PH_ACTIVATE_IND, MISDN_ID_ANY,
-                   0, NULL, GFP_KERNEL);
+                           0, NULL, GFP_KERNEL);
        rq->ch = ch;
        if (!try_module_get(THIS_MODULE))
                printk(KERN_WARNING "%s: %s: cannot get module\n",
-                   hw->name, __func__);
+                      hw->name, __func__);
        return 0;
 }
 
@@ -494,7 +493,7 @@ open_bchannel(struct hfcsusb *hw, struct channel_req *rq)
 
        if (debug & DBG_HFC_CALL_TRACE)
                printk(KERN_DEBUG "%s: %s B%i\n",
-                       hw->name, __func__, rq->adr.channel);
+                      hw->name, __func__, rq->adr.channel);
 
        bch = &hw->bch[rq->adr.channel - 1];
        if (test_and_set_bit(FLG_OPEN, &bch->Flags))
@@ -511,7 +510,7 @@ open_bchannel(struct hfcsusb *hw, struct channel_req *rq)
 
        if (!try_module_get(THIS_MODULE))
                printk(KERN_WARNING "%s: %s:cannot get module\n",
-                   hw->name, __func__);
+                      hw->name, __func__);
        return 0;
 }
 
@@ -522,16 +521,16 @@ channel_ctrl(struct hfcsusb *hw, struct mISDN_ctrl_req *cq)
 
        if (debug & DBG_HFC_CALL_TRACE)
                printk(KERN_DEBUG "%s: %s op(0x%x) channel(0x%x)\n",
-                   hw->name, __func__, (cq->op), (cq->channel));
+                      hw->name, __func__, (cq->op), (cq->channel));
 
        switch (cq->op) {
        case MISDN_CTRL_GETOP:
                cq->op = MISDN_CTRL_LOOP | MISDN_CTRL_CONNECT |
-                        MISDN_CTRL_DISCONNECT;
+                       MISDN_CTRL_DISCONNECT;
                break;
        default:
                printk(KERN_WARNING "%s: %s: unknown Op %x\n",
-                       hw->name, __func__, cq->op);
+                      hw->name, __func__, cq->op);
                ret = -EINVAL;
                break;
        }
@@ -552,7 +551,7 @@ hfc_dctrl(struct mISDNchannel *ch, u_int cmd, void *arg)
 
        if (dch->debug & DEBUG_HW)
                printk(KERN_DEBUG "%s: %s: cmd:%x %p\n",
-                   hw->name, __func__, cmd, arg);
+                      hw->name, __func__, cmd, arg);
        switch (cmd) {
        case OPEN_CHANNEL:
                rq = arg;
@@ -568,9 +567,9 @@ hfc_dctrl(struct mISDNchannel *ch, u_int cmd, void *arg)
                hw->open--;
                if (debug & DEBUG_HW_OPEN)
                        printk(KERN_DEBUG
-                               "%s: %s: dev(%d) close from %p (open %d)\n",
-                               hw->name, __func__, hw->dch.dev.id,
-                               __builtin_return_address(0), hw->open);
+                              "%s: %s: dev(%d) close from %p (open %d)\n",
+                              hw->name, __func__, hw->dch.dev.id,
+                              __builtin_return_address(0), hw->open);
                if (!hw->open) {
                        hfcsusb_stop_endpoint(hw, HFC_CHAN_D);
                        if (hw->fifos[HFCUSB_PCM_RX].pipe)
@@ -585,7 +584,7 @@ hfc_dctrl(struct mISDNchannel *ch, u_int cmd, void *arg)
        default:
                if (dch->debug & DEBUG_HW)
                        printk(KERN_DEBUG "%s: %s: unknown command %x\n",
-                               hw->name, __func__, cmd);
+                              hw->name, __func__, cmd);
                return -EINVAL;
        }
        return err;
@@ -602,10 +601,10 @@ ph_state_te(struct dchannel *dch)
        if (debug & DEBUG_HW) {
                if (dch->state <= HFC_MAX_TE_LAYER1_STATE)
                        printk(KERN_DEBUG "%s: %s: %s\n", hw->name, __func__,
-                           HFC_TE_LAYER1_STATES[dch->state]);
+                              HFC_TE_LAYER1_STATES[dch->state]);
                else
                        printk(KERN_DEBUG "%s: %s: TE F%d\n",
-                           hw->name, __func__, dch->state);
+                              hw->name, __func__, dch->state);
        }
 
        switch (dch->state) {
@@ -643,12 +642,12 @@ ph_state_nt(struct dchannel *dch)
        if (debug & DEBUG_HW) {
                if (dch->state <= HFC_MAX_NT_LAYER1_STATE)
                        printk(KERN_DEBUG "%s: %s: %s\n",
-                           hw->name, __func__,
-                           HFC_NT_LAYER1_STATES[dch->state]);
+                              hw->name, __func__,
+                              HFC_NT_LAYER1_STATES[dch->state]);
 
                else
                        printk(KERN_INFO DRIVER_NAME "%s: %s: NT G%d\n",
-                           hw->name, __func__, dch->state);
+                              hw->name, __func__, dch->state);
        }
 
        switch (dch->state) {
@@ -677,7 +676,7 @@ ph_state_nt(struct dchannel *dch)
                hw->timers &= ~NT_ACTIVATION_TIMER;
                test_and_set_bit(FLG_ACTIVE, &dch->Flags);
                _queue_data(&dch->dev.D, PH_ACTIVATE_IND,
-                       MISDN_ID_ANY, 0, NULL, GFP_ATOMIC);
+                           MISDN_ID_ANY, 0, NULL, GFP_ATOMIC);
                handle_led(hw, LED_S0_ON);
                break;
        case (4):
@@ -712,8 +711,8 @@ hfcsusb_setup_bch(struct bchannel *bch, int protocol)
 
        if (debug & DEBUG_HW)
                printk(KERN_DEBUG "%s: %s: protocol %x-->%x B%d\n",
-                   hw->name, __func__, bch->state, protocol,
-                   bch->nr);
+                      hw->name, __func__, bch->state, protocol,
+                      bch->nr);
 
        /* setup val for CON_HDLC */
        conhdlc = 0;
@@ -743,7 +742,7 @@ hfcsusb_setup_bch(struct bchannel *bch, int protocol)
        default:
                if (debug & DEBUG_HW)
                        printk(KERN_DEBUG "%s: %s: prot not known %x\n",
-                               hw->name, __func__, protocol);
+                              hw->name, __func__, protocol);
                return -ENOPROTOOPT;
        }
 
@@ -772,7 +771,7 @@ hfcsusb_setup_bch(struct bchannel *bch, int protocol)
                        handle_led(hw, (bch->nr == 1) ? LED_B1_ON : LED_B2_ON);
                else
                        handle_led(hw, (bch->nr == 1) ? LED_B1_OFF :
-                               LED_B2_OFF);
+                                  LED_B2_OFF);
        }
        hfcsusb_ph_info(hw);
        return 0;
@@ -783,7 +782,7 @@ hfcsusb_ph_command(struct hfcsusb *hw, u_char command)
 {
        if (debug & DEBUG_HW)
                printk(KERN_DEBUG "%s: %s: %x\n",
-                  hw->name, __func__, command);
+                      hw->name, __func__, command);
 
        switch (command) {
        case HFC_L1_ACTIVATE_TE:
@@ -801,15 +800,15 @@ hfcsusb_ph_command(struct hfcsusb *hw, u_char command)
        case HFC_L1_ACTIVATE_NT:
                if (hw->dch.state == 3)
                        _queue_data(&hw->dch.dev.D, PH_ACTIVATE_IND,
-                               MISDN_ID_ANY, 0, NULL, GFP_ATOMIC);
+                                   MISDN_ID_ANY, 0, NULL, GFP_ATOMIC);
                else
                        write_reg(hw, HFCUSB_STATES, HFCUSB_ACTIVATE |
-                               HFCUSB_DO_ACTION | HFCUSB_NT_G2_G3);
+                                 HFCUSB_DO_ACTION | HFCUSB_NT_G2_G3);
                break;
 
        case HFC_L1_DEACTIVATE_NT:
                write_reg(hw, HFCUSB_STATES,
-                       HFCUSB_DO_ACTION);
+                         HFCUSB_DO_ACTION);
                break;
        }
 }
@@ -830,7 +829,7 @@ channel_bctrl(struct bchannel *bch, struct mISDN_ctrl_req *cq)
                test_and_set_bit(FLG_FILLEMPTY, &bch->Flags);
                if (debug & DEBUG_HW_OPEN)
                        printk(KERN_DEBUG "%s: FILL_EMPTY request (nr=%d "
-                               "off=%d)\n", __func__, bch->nr, !!cq->p1);
+                              "off=%d)\n", __func__, bch->nr, !!cq->p1);
                break;
        default:
                printk(KERN_WARNING "%s: unknown Op %x\n", __func__, cq->op);
@@ -843,7 +842,7 @@ channel_bctrl(struct bchannel *bch, struct mISDN_ctrl_req *cq)
 /* collect data from incoming interrupt or isochron USB data */
 static void
 hfcsusb_rx_frame(struct usb_fifo *fifo, __u8 *data, unsigned int len,
-       int finish)
+                int finish)
 {
        struct hfcsusb  *hw = fifo->hw;
        struct sk_buff  *rx_skb = NULL;
@@ -854,9 +853,9 @@ hfcsusb_rx_frame(struct usb_fifo *fifo, __u8 *data, unsigned int len,
 
        if (debug & DBG_HFC_CALL_TRACE)
                printk(KERN_DEBUG "%s: %s: fifo(%i) len(%i) "
-                   "dch(%p) bch(%p) ech(%p)\n",
-                   hw->name, __func__, fifon, len,
-                   fifo->dch, fifo->bch, fifo->ech);
+                      "dch(%p) bch(%p) ech(%p)\n",
+                      hw->name, __func__, fifon, len,
+                      fifo->dch, fifo->bch, fifo->ech);
 
        if (!len)
                return;
@@ -896,7 +895,7 @@ hfcsusb_rx_frame(struct usb_fifo *fifo, __u8 *data, unsigned int len,
                        skb_trim(rx_skb, 0);
                } else {
                        printk(KERN_DEBUG "%s: %s: No mem for rx_skb\n",
-                           hw->name, __func__);
+                              hw->name, __func__);
                        spin_unlock(&hw->lock);
                        return;
                }
@@ -906,8 +905,8 @@ hfcsusb_rx_frame(struct usb_fifo *fifo, __u8 *data, unsigned int len,
                /* D/E-Channel SKB range check */
                if ((rx_skb->len + len) >= MAX_DFRAME_LEN_L1) {
                        printk(KERN_DEBUG "%s: %s: sbk mem exceeded "
-                           "for fifo(%d) HFCUSB_D_RX\n",
-                           hw->name, __func__, fifon);
+                              "for fifo(%d) HFCUSB_D_RX\n",
+                              hw->name, __func__, fifon);
                        skb_trim(rx_skb, 0);
                        spin_unlock(&hw->lock);
                        return;
@@ -916,8 +915,8 @@ hfcsusb_rx_frame(struct usb_fifo *fifo, __u8 *data, unsigned int len,
                /* B-Channel SKB range check */
                if ((rx_skb->len + len) >= (MAX_BCH_SIZE + 3)) {
                        printk(KERN_DEBUG "%s: %s: sbk mem exceeded "
-                           "for fifo(%d) HFCUSB_B_RX\n",
-                           hw->name, __func__, fifon);
+                              "for fifo(%d) HFCUSB_B_RX\n",
+                              hw->name, __func__, fifon);
                        skb_trim(rx_skb, 0);
                        spin_unlock(&hw->lock);
                        return;
@@ -930,16 +929,16 @@ hfcsusb_rx_frame(struct usb_fifo *fifo, __u8 *data, unsigned int len,
                /* we have a complete hdlc packet */
                if (finish) {
                        if ((rx_skb->len > 3) &&
-                          (!(rx_skb->data[rx_skb->len - 1]))) {
+                           (!(rx_skb->data[rx_skb->len - 1]))) {
                                if (debug & DBG_HFC_FIFO_VERBOSE) {
                                        printk(KERN_DEBUG "%s: %s: fifon(%i)"
-                                           " new RX len(%i): ",
-                                           hw->name, __func__, fifon,
-                                           rx_skb->len);
+                                              " new RX len(%i): ",
+                                              hw->name, __func__, fifon,
+                                              rx_skb->len);
                                        i = 0;
                                        while (i < rx_skb->len)
                                                printk("%02x ",
-                                                   rx_skb->data[i++]);
+                                                      rx_skb->data[i++]);
                                        printk("\n");
                                }
 
@@ -952,17 +951,17 @@ hfcsusb_rx_frame(struct usb_fifo *fifo, __u8 *data, unsigned int len,
                                        recv_Bchannel(fifo->bch, MISDN_ID_ANY);
                                if (fifo->ech)
                                        recv_Echannel(fifo->ech,
-                                                    &hw->dch);
+                                                     &hw->dch);
                        } else {
                                if (debug & DBG_HFC_FIFO_VERBOSE) {
                                        printk(KERN_DEBUG
-                                           "%s: CRC or minlen ERROR fifon(%i) "
-                                           "RX len(%i): ",
-                                           hw->name, fifon, rx_skb->len);
+                                              "%s: CRC or minlen ERROR fifon(%i) "
+                                              "RX len(%i): ",
+                                              hw->name, fifon, rx_skb->len);
                                        i = 0;
                                        while (i < rx_skb->len)
                                                printk("%02x ",
-                                                   rx_skb->data[i++]);
+                                                      rx_skb->data[i++]);
                                        printk("\n");
                                }
                                skb_trim(rx_skb, 0);
@@ -984,7 +983,7 @@ fill_isoc_urb(struct urb *urb, struct usb_device *dev, unsigned int pipe,
        int k;
 
        usb_fill_bulk_urb(urb, dev, pipe, buf, packet_size * num_packets,
-           complete, context);
+                         complete, context);
 
        urb->number_of_packets = num_packets;
        urb->transfer_flags = URB_ISO_ASAP;
@@ -1006,7 +1005,7 @@ rx_iso_complete(struct urb *urb)
        struct usb_fifo *fifo = context_iso_urb->owner_fifo;
        struct hfcsusb *hw = fifo->hw;
        int k, len, errcode, offset, num_isoc_packets, fifon, maxlen,
-           status, iso_status, i;
+               status, iso_status, i;
        __u8 *buf;
        static __u8 eof[8];
        __u8 s0_state;
@@ -1030,8 +1029,8 @@ rx_iso_complete(struct urb *urb)
        if (status == -EXDEV) {
                if (debug & DEBUG_HW)
                        printk(KERN_DEBUG "%s: %s: with -EXDEV "
-                           "urb->status %d, fifonum %d\n",
-                           hw->name, __func__,  status, fifon);
+                              "urb->status %d, fifonum %d\n",
+                              hw->name, __func__,  status, fifon);
 
                /* clear status, so go on with ISO transfers */
                status = 0;
@@ -1050,18 +1049,18 @@ rx_iso_complete(struct urb *urb)
 
                        if (iso_status && (debug & DBG_HFC_FIFO_VERBOSE)) {
                                printk(KERN_DEBUG "%s: %s: "
-                                   "ISO packet %i, status: %i\n",
-                                   hw->name, __func__, k, iso_status);
+                                      "ISO packet %i, status: %i\n",
+                                      hw->name, __func__, k, iso_status);
                        }
 
                        /* USB data log for every D ISO in */
                        if ((fifon == HFCUSB_D_RX) &&
                            (debug & DBG_HFC_USB_VERBOSE)) {
                                printk(KERN_DEBUG
-                                   "%s: %s: %d (%d/%d) len(%d) ",
-                                   hw->name, __func__, urb->start_frame,
-                                   k, num_isoc_packets-1,
-                                   len);
+                                      "%s: %s: %d (%d/%d) len(%d) ",
+                                      hw->name, __func__, urb->start_frame,
+                                      k, num_isoc_packets - 1,
+                                      len);
                                for (i = 0; i < len; i++)
                                        printk("%x ", buf[i]);
                                printk("\n");
@@ -1082,12 +1081,12 @@ rx_iso_complete(struct urb *urb)
                                        eof[fifon] = buf[0] & 1;
                                        if (len > 2)
                                                hfcsusb_rx_frame(fifo, buf + 2,
-                                                       len - 2, (len < maxlen)
-                                                       ? eof[fifon] : 0);
+                                                                len - 2, (len < maxlen)
+                                                                ? eof[fifon] : 0);
                                } else
                                        hfcsusb_rx_frame(fifo, buf, len,
-                                               (len < maxlen) ?
-                                               eof[fifon] : 0);
+                                                        (len < maxlen) ?
+                                                        eof[fifon] : 0);
                                fifo->last_urblen = len;
                        }
                }
@@ -1107,14 +1106,14 @@ rx_iso_complete(struct urb *urb)
                if (errcode < 0) {
                        if (debug & DEBUG_HW)
                                printk(KERN_DEBUG "%s: %s: error submitting "
-                                   "ISO URB: %d\n",
-                                   hw->name, __func__, errcode);
+                                      "ISO URB: %d\n",
+                                      hw->name, __func__, errcode);
                }
        } else {
                if (status && (debug & DBG_HFC_URB_INFO))
                        printk(KERN_DEBUG "%s: %s: rx_iso_complete : "
-                           "urb->status %d, fifonum %d\n",
-                           hw->name, __func__, status, fifon);
+                              "urb->status %d, fifonum %d\n",
+                              hw->name, __func__, status, fifon);
        }
 }
 
@@ -1141,8 +1140,8 @@ rx_int_complete(struct urb *urb)
        if ((!fifo->active) || (urb->status)) {
                if (debug & DBG_HFC_URB_ERROR)
                        printk(KERN_DEBUG
-                           "%s: %s: RX-Fifo %i is going down (%i)\n",
-                           hw->name, __func__, fifon, urb->status);
+                              "%s: %s: RX-Fifo %i is going down (%i)\n",
+                              hw->name, __func__, fifon, urb->status);
 
                fifo->urb->interval = 0; /* cancel automatic rescheduling */
                return;
@@ -1154,7 +1153,7 @@ rx_int_complete(struct urb *urb)
        /* USB data log for every D INT in */
        if ((fifon == HFCUSB_D_RX) && (debug & DBG_HFC_USB_VERBOSE)) {
                printk(KERN_DEBUG "%s: %s: D RX INT len(%d) ",
-                   hw->name, __func__, len);
+                      hw->name, __func__, len);
                for (i = 0; i < len; i++)
                        printk("%02x ", buf[i]);
                printk("\n");
@@ -1174,8 +1173,8 @@ rx_int_complete(struct urb *urb)
                /* if we have more than the 2 status bytes -> collect data */
                if (len > 2)
                        hfcsusb_rx_frame(fifo, buf + 2,
-                          urb->actual_length - 2,
-                          (len < maxlen) ? eof[fifon] : 0);
+                                        urb->actual_length - 2,
+                                        (len < maxlen) ? eof[fifon] : 0);
        } else {
                hfcsusb_rx_frame(fifo, buf, urb->actual_length,
                                 (len < maxlen) ? eof[fifon] : 0);
@@ -1186,7 +1185,7 @@ rx_int_complete(struct urb *urb)
        if (status) {
                if (debug & DEBUG_HW)
                        printk(KERN_DEBUG "%s: %s: error resubmitting USB\n",
-                           hw->name, __func__);
+                              hw->name, __func__);
        }
 }
 
@@ -1199,7 +1198,7 @@ tx_iso_complete(struct urb *urb)
        struct hfcsusb *hw = fifo->hw;
        struct sk_buff *tx_skb;
        int k, tx_offset, num_isoc_packets, sink, remain, current_len,
-           errcode, hdlc, i;
+               errcode, hdlc, i;
        int *tx_idx;
        int frame_complete, fifon, status;
        __u8 threshbit;
@@ -1222,7 +1221,7 @@ tx_iso_complete(struct urb *urb)
                hdlc = test_bit(FLG_HDLC, &fifo->bch->Flags);
        } else {
                printk(KERN_DEBUG "%s: %s: neither BCH nor DCH\n",
-                   hw->name, __func__);
+                      hw->name, __func__);
                spin_unlock(&hw->lock);
                return;
        }
@@ -1239,8 +1238,8 @@ tx_iso_complete(struct urb *urb)
        if (status == -EXDEV) {
                if (debug & DBG_HFC_URB_ERROR)
                        printk(KERN_DEBUG "%s: %s: "
-                           "-EXDEV (%i) fifon (%d)\n",
-                           hw->name, __func__, status, fifon);
+                              "-EXDEV (%i) fifon (%d)\n",
+                              hw->name, __func__, status, fifon);
 
                /* clear status, so go on with ISO transfers */
                status = 0;
@@ -1270,8 +1269,8 @@ tx_iso_complete(struct urb *urb)
                                errcode = urb->iso_frame_desc[k].status;
                                if (errcode) {
                                        printk(KERN_DEBUG "%s: %s: "
-                                           "ISO packet %i, status: %i\n",
-                                            hw->name, __func__, k, errcode);
+                                              "ISO packet %i, status: %i\n",
+                                              hw->name, __func__, k, errcode);
                                }
                        }
 
@@ -1299,7 +1298,7 @@ tx_iso_complete(struct urb *urb)
                                        if (hdlc) {
                                                /* signal frame completion */
                                                context_iso_urb->
-                                                   buffer[tx_offset] = 1;
+                                                       buffer[tx_offset] = 1;
                                                /* add 2 byte flags and 16bit
                                                 * CRC at end of ISDN frame */
                                                fifo->bit_line += 32;
@@ -1319,21 +1318,21 @@ tx_iso_complete(struct urb *urb)
                                if ((fifon == HFCUSB_D_RX) &&
                                    (debug & DBG_HFC_USB_VERBOSE)) {
                                        printk(KERN_DEBUG
-                                           "%s: %s (%d/%d) offs(%d) len(%d) ",
-                                           hw->name, __func__,
-                                           k, num_isoc_packets-1,
-                                           urb->iso_frame_desc[k].offset,
-                                           urb->iso_frame_desc[k].length);
+                                              "%s: %s (%d/%d) offs(%d) len(%d) ",
+                                              hw->name, __func__,
+                                              k, num_isoc_packets - 1,
+                                              urb->iso_frame_desc[k].offset,
+                                              urb->iso_frame_desc[k].length);
 
                                        for (i = urb->iso_frame_desc[k].offset;
                                             i < (urb->iso_frame_desc[k].offset
-                                            + urb->iso_frame_desc[k].length);
+                                                 + urb->iso_frame_desc[k].length);
                                             i++)
                                                printk("%x ",
-                                                   context_iso_urb->buffer[i]);
+                                                      context_iso_urb->buffer[i]);
 
                                        printk(" skb->len(%i) tx-idx(%d)\n",
-                                           tx_skb->len, *tx_idx);
+                                              tx_skb->len, *tx_idx);
                                }
 
                                tx_offset += (current_len + 1);
@@ -1351,13 +1350,13 @@ tx_iso_complete(struct urb *urb)
 
                                if (debug & DBG_HFC_FIFO_VERBOSE) {
                                        printk(KERN_DEBUG  "%s: %s: "
-                                           "fifon(%i) new TX len(%i): ",
-                                           hw->name, __func__,
-                                           fifon, tx_skb->len);
+                                              "fifon(%i) new TX len(%i): ",
+                                              hw->name, __func__,
+                                              fifon, tx_skb->len);
                                        i = 0;
                                        while (i < tx_skb->len)
                                                printk("%02x ",
-                                                   tx_skb->data[i++]);
+                                                      tx_skb->data[i++]);
                                        printk("\n");
                                }
 
@@ -1366,9 +1365,9 @@ tx_iso_complete(struct urb *urb)
                                if (fifo->dch && get_next_dframe(fifo->dch))
                                        tx_skb = fifo->dch->tx_skb;
                                else if (fifo->bch &&
-                                   get_next_bframe(fifo->bch)) {
+                                        get_next_bframe(fifo->bch)) {
                                        if (test_bit(FLG_TRANSPARENT,
-                                           &fifo->bch->Flags))
+                                                    &fifo->bch->Flags))
                                                confirm_Bsend(fifo->bch);
                                        tx_skb = fifo->bch->tx_skb;
                                }
@@ -1378,8 +1377,8 @@ tx_iso_complete(struct urb *urb)
                if (errcode < 0) {
                        if (debug & DEBUG_HW)
                                printk(KERN_DEBUG
-                                   "%s: %s: error submitting ISO URB: %d \n",
-                                   hw->name, __func__, errcode);
+                                      "%s: %s: error submitting ISO URB: %d \n",
+                                      hw->name, __func__, errcode);
                }
 
                /*
@@ -1396,9 +1395,9 @@ tx_iso_complete(struct urb *urb)
        } else {
                if (status && (debug & DBG_HFC_URB_ERROR))
                        printk(KERN_DEBUG  "%s: %s: urb->status %s (%i)"
-                           "fifonum=%d\n",
-                           hw->name, __func__,
-                           symbolic(urb_errlist, status), status, fifon);
+                              "fifonum=%d\n",
+                              hw->name, __func__,
+                              symbolic(urb_errlist, status), status, fifon);
        }
        spin_unlock(&hw->lock);
 }
@@ -1416,17 +1415,17 @@ start_isoc_chain(struct usb_fifo *fifo, int num_packets_per_urb,
 
        if (debug)
                printk(KERN_DEBUG "%s: %s: fifo %i\n",
-                   hw->name, __func__, fifo->fifonum);
+                      hw->name, __func__, fifo->fifonum);
 
        /* allocate Memory for Iso out Urbs */
        for (i = 0; i < 2; i++) {
                if (!(fifo->iso[i].urb)) {
                        fifo->iso[i].urb =
-                           usb_alloc_urb(num_packets_per_urb, GFP_KERNEL);
+                               usb_alloc_urb(num_packets_per_urb, GFP_KERNEL);
                        if (!(fifo->iso[i].urb)) {
                                printk(KERN_DEBUG
-                                   "%s: %s: alloc urb for fifo %i failed",
-                                   hw->name, __func__, fifo->fifonum);
+                                      "%s: %s: alloc urb for fifo %i failed",
+                                      hw->name, __func__, fifo->fifonum);
                        }
                        fifo->iso[i].owner_fifo = (struct usb_fifo *) fifo;
                        fifo->iso[i].indx = i;
@@ -1436,27 +1435,27 @@ start_isoc_chain(struct usb_fifo *fifo, int num_packets_per_urb,
                            (fifo->usb_packet_maxlen *
                             num_packets_per_urb)) {
                                fill_isoc_urb(fifo->iso[i].urb,
-                                   fifo->hw->dev, fifo->pipe,
-                                   fifo->iso[i].buffer,
-                                   num_packets_per_urb,
-                                   fifo->usb_packet_maxlen,
-                                   fifo->intervall, complete,
-                                   &fifo->iso[i]);
+                                             fifo->hw->dev, fifo->pipe,
+                                             fifo->iso[i].buffer,
+                                             num_packets_per_urb,
+                                             fifo->usb_packet_maxlen,
+                                             fifo->intervall, complete,
+                                             &fifo->iso[i]);
                                memset(fifo->iso[i].buffer, 0,
                                       sizeof(fifo->iso[i].buffer));
 
                                for (k = 0; k < num_packets_per_urb; k++) {
                                        fifo->iso[i].urb->
-                                           iso_frame_desc[k].offset =
-                                           k * packet_size;
+                                               iso_frame_desc[k].offset =
+                                               k * packet_size;
                                        fifo->iso[i].urb->
-                                           iso_frame_desc[k].length =
-                                           packet_size;
+                                               iso_frame_desc[k].length =
+                                               packet_size;
                                }
                        } else {
                                printk(KERN_DEBUG
-                                   "%s: %s: ISO Buffer size to small!\n",
-                                   hw->name, __func__);
+                                      "%s: %s: ISO Buffer size to small!\n",
+                                      hw->name, __func__);
                        }
                }
                fifo->bit_line = BITLINE_INF;
@@ -1466,8 +1465,8 @@ start_isoc_chain(struct usb_fifo *fifo, int num_packets_per_urb,
                fifo->stop_gracefull = 0;
                if (errcode < 0) {
                        printk(KERN_DEBUG "%s: %s: %s URB nr:%d\n",
-                           hw->name, __func__,
-                           symbolic(urb_errlist, errcode), i);
+                              hw->name, __func__,
+                              symbolic(urb_errlist, errcode), i);
                }
        }
        return fifo->active;
@@ -1492,10 +1491,10 @@ stop_iso_gracefull(struct usb_fifo *fifo)
        for (i = 0; i < 2; i++) {
                timeout = 3;
                while (fifo->stop_gracefull && timeout--)
-                       schedule_timeout_interruptible((HZ/1000)*16);
+                       schedule_timeout_interruptible((HZ / 1000) * 16);
                if (debug && fifo->stop_gracefull)
                        printk(KERN_DEBUG "%s: ERROR %s for fifo %i.%i\n",
-                               hw->name, __func__, fifo->fifonum, i);
+                              hw->name, __func__, fifo->fifonum, i);
        }
 }
 
@@ -1515,7 +1514,7 @@ stop_int_gracefull(struct usb_fifo *fifo)
 
        timeout = 3;
        while (fifo->stop_gracefull && timeout--)
-               schedule_timeout_interruptible((HZ/1000)*3);
+               schedule_timeout_interruptible((HZ / 1000) * 3);
        if (debug && fifo->stop_gracefull)
                printk(KERN_DEBUG "%s: ERROR %s for fifo %i\n",
                       hw->name, __func__, fifo->fifonum);
@@ -1530,7 +1529,7 @@ start_int_fifo(struct usb_fifo *fifo)
 
        if (debug)
                printk(KERN_DEBUG "%s: %s: INT IN fifo:%d\n",
-                   hw->name, __func__, fifo->fifonum);
+                      hw->name, __func__, fifo->fifonum);
 
        if (!fifo->urb) {
                fifo->urb = usb_alloc_urb(0, GFP_KERNEL);
@@ -1538,14 +1537,14 @@ start_int_fifo(struct usb_fifo *fifo)
                        return;
        }
        usb_fill_int_urb(fifo->urb, fifo->hw->dev, fifo->pipe,
-           fifo->buffer, fifo->usb_packet_maxlen,
-           (usb_complete_t)rx_int_complete, fifo, fifo->intervall);
+                        fifo->buffer, fifo->usb_packet_maxlen,
+                        (usb_complete_t)rx_int_complete, fifo, fifo->intervall);
        fifo->active = 1;
        fifo->stop_gracefull = 0;
        errcode = usb_submit_urb(fifo->urb, GFP_KERNEL);
        if (errcode) {
                printk(KERN_DEBUG "%s: %s: submit URB: status:%i\n",
-                   hw->name, __func__, errcode);
+                      hw->name, __func__, errcode);
                fifo->active = 0;
        }
 }
@@ -1555,7 +1554,7 @@ setPortMode(struct hfcsusb *hw)
 {
        if (debug & DEBUG_HW)
                printk(KERN_DEBUG "%s: %s %s\n", hw->name, __func__,
-                  (hw->protocol == ISDN_P_TE_S0) ? "TE" : "NT");
+                      (hw->protocol == ISDN_P_TE_S0) ? "TE" : "NT");
 
        if (hw->protocol == ISDN_P_TE_S0) {
                write_reg(hw, HFCUSB_SCTRL, 0x40);
@@ -1589,7 +1588,7 @@ reset_hfcsusb(struct hfcsusb *hw)
 
        /* set USB_SIZE to match the wMaxPacketSize for INT or BULK transfers */
        write_reg(hw, HFCUSB_USB_SIZE, (hw->packet_size / 8) |
-           ((hw->packet_size / 8) << 4));
+                 ((hw->packet_size / 8) << 4));
 
        /* set USB_SIZE_I to match the the wMaxPacketSize for ISO transfers */
        write_reg(hw, HFCUSB_USB_SIZE_I, hw->iso_packet_size);
@@ -1600,13 +1599,13 @@ reset_hfcsusb(struct hfcsusb *hw)
 
        /* init the fifos */
        write_reg(hw, HFCUSB_F_THRES,
-           (HFCUSB_TX_THRESHOLD / 8) | ((HFCUSB_RX_THRESHOLD / 8) << 4));
+                 (HFCUSB_TX_THRESHOLD / 8) | ((HFCUSB_RX_THRESHOLD / 8) << 4));
 
        fifo = hw->fifos;
        for (i = 0; i < HFCUSB_NUM_FIFOS; i++) {
                write_reg(hw, HFCUSB_FIFO, i);  /* select the desired fifo */
                fifo[i].max_size =
-                   (i <= HFCUSB_B2_RX) ? MAX_BCH_SIZE : MAX_DFRAME_LEN;
+                       (i <= HFCUSB_B2_RX) ? MAX_BCH_SIZE : MAX_DFRAME_LEN;
                fifo[i].last_urblen = 0;
 
                /* set 2 bit for D- & E-channel */
@@ -1615,7 +1614,7 @@ reset_hfcsusb(struct hfcsusb *hw)
                /* enable all fifos */
                if (i == HFCUSB_D_TX)
                        write_reg(hw, HFCUSB_CON_HDLC,
-                           (hw->protocol == ISDN_P_NT_S0) ? 0x08 : 0x09);
+                                 (hw->protocol == ISDN_P_NT_S0) ? 0x08 : 0x09);
                else
                        write_reg(hw, HFCUSB_CON_HDLC, 0x08);
                write_reg(hw, HFCUSB_INC_RES_F, 2); /* reset the fifo */
@@ -1641,34 +1640,34 @@ hfcsusb_start_endpoint(struct hfcsusb *hw, int channel)
 
        /* start rx endpoints using USB INT IN method */
        if (hw->cfg_used == CNF_3INT3ISO || hw->cfg_used == CNF_4INT3ISO)
-               start_int_fifo(hw->fifos + channel*2 + 1);
+               start_int_fifo(hw->fifos + channel * 2 + 1);
 
        /* start rx endpoints using USB ISO IN method */
        if (hw->cfg_used == CNF_3ISO3ISO || hw->cfg_used == CNF_4ISO3ISO) {
                switch (channel) {
                case HFC_CHAN_D:
                        start_isoc_chain(hw->fifos + HFCUSB_D_RX,
-                               ISOC_PACKETS_D,
-                               (usb_complete_t)rx_iso_complete,
-                               16);
+                                        ISOC_PACKETS_D,
+                                        (usb_complete_t)rx_iso_complete,
+                                        16);
                        break;
                case HFC_CHAN_E:
                        start_isoc_chain(hw->fifos + HFCUSB_PCM_RX,
-                               ISOC_PACKETS_D,
-                               (usb_complete_t)rx_iso_complete,
-                               16);
+                                        ISOC_PACKETS_D,
+                                        (usb_complete_t)rx_iso_complete,
+                                        16);
                        break;
                case HFC_CHAN_B1:
                        start_isoc_chain(hw->fifos + HFCUSB_B1_RX,
-                               ISOC_PACKETS_B,
-                               (usb_complete_t)rx_iso_complete,
-                               16);
+                                        ISOC_PACKETS_B,
+                                        (usb_complete_t)rx_iso_complete,
+                                        16);
                        break;
                case HFC_CHAN_B2:
                        start_isoc_chain(hw->fifos + HFCUSB_B2_RX,
-                               ISOC_PACKETS_B,
-                               (usb_complete_t)rx_iso_complete,
-                               16);
+                                        ISOC_PACKETS_B,
+                                        (usb_complete_t)rx_iso_complete,
+                                        16);
                        break;
                }
        }
@@ -1677,18 +1676,18 @@ hfcsusb_start_endpoint(struct hfcsusb *hw, int channel)
        switch (channel) {
        case HFC_CHAN_D:
                start_isoc_chain(hw->fifos + HFCUSB_D_TX,
-                       ISOC_PACKETS_B,
-                       (usb_complete_t)tx_iso_complete, 1);
+                                ISOC_PACKETS_B,
+                                (usb_complete_t)tx_iso_complete, 1);
                break;
        case HFC_CHAN_B1:
                start_isoc_chain(hw->fifos + HFCUSB_B1_TX,
-                       ISOC_PACKETS_D,
-                       (usb_complete_t)tx_iso_complete, 1);
+                                ISOC_PACKETS_D,
+                                (usb_complete_t)tx_iso_complete, 1);
                break;
        case HFC_CHAN_B2:
                start_isoc_chain(hw->fifos + HFCUSB_B2_TX,
-                       ISOC_PACKETS_B,
-                       (usb_complete_t)tx_iso_complete, 1);
+                                ISOC_PACKETS_B,
+                                (usb_complete_t)tx_iso_complete, 1);
                break;
        }
 }
@@ -1709,15 +1708,15 @@ hfcsusb_stop_endpoint(struct hfcsusb *hw, int channel)
 
        /* rx endpoints using USB INT IN method */
        if (hw->cfg_used == CNF_3INT3ISO || hw->cfg_used == CNF_4INT3ISO)
-               stop_int_gracefull(hw->fifos + channel*2 + 1);
+               stop_int_gracefull(hw->fifos + channel * 2 + 1);
 
        /* rx endpoints using USB ISO IN method */
        if (hw->cfg_used == CNF_3ISO3ISO || hw->cfg_used == CNF_4ISO3ISO)
-               stop_iso_gracefull(hw->fifos + channel*2 + 1);
+               stop_iso_gracefull(hw->fifos + channel * 2 + 1);
 
        /* tx endpoints using USB ISO OUT method */
        if (channel != HFC_CHAN_E)
-               stop_iso_gracefull(hw->fifos + channel*2);
+               stop_iso_gracefull(hw->fifos + channel * 2);
 }
 
 
@@ -1733,12 +1732,12 @@ setup_hfcsusb(struct hfcsusb *hw)
        /* check the chip id */
        if (read_reg_atomic(hw, HFCUSB_CHIP_ID, &b) != 1) {
                printk(KERN_DEBUG "%s: %s: cannot read chip id\n",
-                   hw->name, __func__);
+                      hw->name, __func__);
                return 1;
        }
        if (b != HFCUSB_CHIPID) {
                printk(KERN_DEBUG "%s: %s: Invalid chip id 0x%02x\n",
-                   hw->name, __func__, b);
+                      hw->name, __func__, b);
                return 1;
        }
 
@@ -1755,8 +1754,8 @@ setup_hfcsusb(struct hfcsusb *hw)
        hw->ctrl_write.bRequest = 0;
        hw->ctrl_write.wLength = 0;
        usb_fill_control_urb(hw->ctrl_urb, hw->dev, hw->ctrl_out_pipe,
-           (u_char *)&hw->ctrl_write, NULL, 0,
-           (usb_complete_t)ctrl_complete, hw);
+                            (u_char *)&hw->ctrl_write, NULL, 0,
+                            (usb_complete_t)ctrl_complete, hw);
 
        reset_hfcsusb(hw);
        return 0;
@@ -1807,7 +1806,7 @@ deactivate_bchannel(struct bchannel *bch)
 
        if (bch->debug & DEBUG_HW)
                printk(KERN_DEBUG "%s: %s: bch->nr(%i)\n",
-                   hw->name, __func__, bch->nr);
+                      hw->name, __func__, bch->nr);
 
        spin_lock_irqsave(&hw->lock, flags);
        mISDN_clear_bchannel(bch);
@@ -1849,7 +1848,7 @@ hfc_bctrl(struct mISDNchannel *ch, u_int cmd, void *arg)
                break;
        default:
                printk(KERN_WARNING "%s: unknown prim(%x)\n",
-                       __func__, cmd);
+                      __func__, cmd);
        }
        return ret;
 }
@@ -1878,7 +1877,7 @@ setup_instance(struct hfcsusb *hw, struct device *parent)
                mISDN_initdchannel(&hw->ech, MAX_DFRAME_LEN_L1, NULL);
 
        hw->dch.dev.Bprotocols = (1 << (ISDN_P_B_RAW & ISDN_P_B_MASK)) |
-           (1 << (ISDN_P_B_HDLC & ISDN_P_B_MASK));
+               (1 << (ISDN_P_B_HDLC & ISDN_P_B_MASK));
        hw->dch.dev.nrbchan = 2;
        for (i = 0; i < 2; i++) {
                hw->bch[i].nr = i + 1;
@@ -1906,9 +1905,9 @@ setup_instance(struct hfcsusb *hw, struct device *parent)
                goto out;
 
        snprintf(hw->name, MISDN_MAX_IDLEN - 1, "%s.%d", DRIVER_NAME,
-           hfcsusb_cnt + 1);
+                hfcsusb_cnt + 1);
        printk(KERN_INFO "%s: registered as '%s'\n",
-           DRIVER_NAME, hw->name);
+              DRIVER_NAME, hw->name);
 
        err = mISDN_register_device(&hw->dch.dev, parent, hw->name);
        if (err)
@@ -1938,30 +1937,30 @@ hfcsusb_probe(struct usb_interface *intf, const struct usb_device_id *id)
        struct usb_host_endpoint        *ep;
        struct hfcsusb_vdata            *driver_info;
        int ifnum = iface->desc.bInterfaceNumber, i, idx, alt_idx,
-           probe_alt_setting, vend_idx, cfg_used, *vcf, attr, cfg_found,
-           ep_addr, cmptbl[16], small_match, iso_packet_size, packet_size,
-           alt_used = 0;
+               probe_alt_setting, vend_idx, cfg_used, *vcf, attr, cfg_found,
+               ep_addr, cmptbl[16], small_match, iso_packet_size, packet_size,
+               alt_used = 0;
 
        vend_idx = 0xffff;
        for (i = 0; hfcsusb_idtab[i].idVendor; i++) {
                if ((le16_to_cpu(dev->descriptor.idVendor)
-                      == hfcsusb_idtab[i].idVendor) &&
+                    == hfcsusb_idtab[i].idVendor) &&
                    (le16_to_cpu(dev->descriptor.idProduct)
-                      == hfcsusb_idtab[i].idProduct)) {
+                    == hfcsusb_idtab[i].idProduct)) {
                        vend_idx = i;
                        continue;
                }
        }
 
        printk(KERN_DEBUG
-           "%s: interface(%d) actalt(%d) minor(%d) vend_idx(%d)\n",
-           __func__, ifnum, iface->desc.bAlternateSetting,
-           intf->minor, vend_idx);
+              "%s: interface(%d) actalt(%d) minor(%d) vend_idx(%d)\n",
+              __func__, ifnum, iface->desc.bAlternateSetting,
+              intf->minor, vend_idx);
 
        if (vend_idx == 0xffff) {
                printk(KERN_WARNING
-                   "%s: no valid vendor found in USB descriptor\n",
-                   __func__);
+                      "%s: no valid vendor found in USB descriptor\n",
+                      __func__);
                return -EIO;
        }
        /* if vendor and product ID is OK, start probing alternate settings */
@@ -1997,17 +1996,17 @@ hfcsusb_probe(struct usb_interface *intf, const struct usb_device_id *id)
                                        if (cmptbl[idx] == EP_NUL)
                                                cfg_found = 0;
                                        if (attr == USB_ENDPOINT_XFER_INT
-                                               && cmptbl[idx] == EP_INT)
+                                           && cmptbl[idx] == EP_INT)
                                                cmptbl[idx] = EP_NUL;
                                        if (attr == USB_ENDPOINT_XFER_BULK
-                                               && cmptbl[idx] == EP_BLK)
+                                           && cmptbl[idx] == EP_BLK)
                                                cmptbl[idx] = EP_NUL;
                                        if (attr == USB_ENDPOINT_XFER_ISOC
-                                               && cmptbl[idx] == EP_ISO)
+                                           && cmptbl[idx] == EP_ISO)
                                                cmptbl[idx] = EP_NUL;
 
                                        if (attr == USB_ENDPOINT_XFER_INT &&
-                                               ep->desc.bInterval < vcf[17]) {
+                                           ep->desc.bInterval < vcf[17]) {
                                                cfg_found = 0;
                                        }
                                }
@@ -2061,27 +2060,27 @@ hfcsusb_probe(struct usb_interface *intf, const struct usb_device_id *id)
                switch (ep->desc.bmAttributes) {
                case USB_ENDPOINT_XFER_INT:
                        f->pipe = usb_rcvintpipe(dev,
-                               ep->desc.bEndpointAddress);
+                                                ep->desc.bEndpointAddress);
                        f->usb_transfer_mode = USB_INT;
                        packet_size = le16_to_cpu(ep->desc.wMaxPacketSize);
                        break;
                case USB_ENDPOINT_XFER_BULK:
                        if (ep_addr & 0x80)
                                f->pipe = usb_rcvbulkpipe(dev,
-                                       ep->desc.bEndpointAddress);
+                                                         ep->desc.bEndpointAddress);
                        else
                                f->pipe = usb_sndbulkpipe(dev,
-                                       ep->desc.bEndpointAddress);
+                                                         ep->desc.bEndpointAddress);
                        f->usb_transfer_mode = USB_BULK;
                        packet_size = le16_to_cpu(ep->desc.wMaxPacketSize);
                        break;
                case USB_ENDPOINT_XFER_ISOC:
                        if (ep_addr & 0x80)
                                f->pipe = usb_rcvisocpipe(dev,
-                                       ep->desc.bEndpointAddress);
+                                                         ep->desc.bEndpointAddress);
                        else
                                f->pipe = usb_sndisocpipe(dev,
-                                       ep->desc.bEndpointAddress);
+                                                         ep->desc.bEndpointAddress);
                        f->usb_transfer_mode = USB_ISOC;
                        iso_packet_size = le16_to_cpu(ep->desc.wMaxPacketSize);
                        break;
@@ -2093,7 +2092,7 @@ hfcsusb_probe(struct usb_interface *intf, const struct usb_device_id *id)
                        f->fifonum = idx & 7;
                        f->hw = hw;
                        f->usb_packet_maxlen =
-                           le16_to_cpu(ep->desc.wMaxPacketSize);
+                               le16_to_cpu(ep->desc.wMaxPacketSize);
                        f->intervall = ep->desc.bInterval;
                }
                ep++;
@@ -2115,8 +2114,8 @@ hfcsusb_probe(struct usb_interface *intf, const struct usb_device_id *id)
        driver_info =
                (struct hfcsusb_vdata *)hfcsusb_idtab[vend_idx].driver_info;
        printk(KERN_DEBUG "%s: %s: detected \"%s\" (%s, if=%d alt=%d)\n",
-           hw->name, __func__, driver_info->vend_name,
-           conf_str[small_match], ifnum, alt_used);
+              hw->name, __func__, driver_info->vend_name,
+              conf_str[small_match], ifnum, alt_used);
 
        if (setup_instance(hw, dev->dev.parent))
                return -EIO;
index 369196a..cb1231b 100644 (file)
 #define NT_ACTIVATION_TIMER    0x01    /* enables NT mode activation Timer */
 #define NT_T1_COUNT            10
 
-#define MAX_BCH_SIZE           2048    /* allowed B-channel packet size */
+#define MAX_BCH_SIZE           2048    /* allowed B-channel packet size */
 
-#define HFCUSB_RX_THRESHOLD    64      /* threshold for fifo report bit rx */
-#define HFCUSB_TX_THRESHOLD    96      /* threshold for fifo report bit tx */
+#define HFCUSB_RX_THRESHOLD    64      /* threshold for fifo report bit rx */
+#define HFCUSB_TX_THRESHOLD    96      /* threshold for fifo report bit tx */
 
 #define HFCUSB_CHIP_ID         0x16    /* Chip ID register index */
 #define HFCUSB_CIRM            0x00    /* cirm register index */
@@ -90,8 +90,8 @@
 
 /* defines how much ISO packets are handled in one URB */
 static int iso_packets[8] =
-    { ISOC_PACKETS_B, ISOC_PACKETS_B, ISOC_PACKETS_B, ISOC_PACKETS_B,
-       ISOC_PACKETS_D, ISOC_PACKETS_D, ISOC_PACKETS_D, ISOC_PACKETS_D
+{ ISOC_PACKETS_B, ISOC_PACKETS_B, ISOC_PACKETS_B, ISOC_PACKETS_B,
+  ISOC_PACKETS_D, ISOC_PACKETS_D, ISOC_PACKETS_D, ISOC_PACKETS_D
 };
 
 
@@ -100,15 +100,15 @@ static int iso_packets[8] =
 #define SINK_MIN       48
 #define SINK_DMIN      12
 #define SINK_DMAX      18
-#define BITLINE_INF    (-96*8)
+#define BITLINE_INF    (-96 * 8)
 
 /* HFC-S USB register access by Control-URSs */
-#define write_reg_atomic(a, b, c) \
+#define write_reg_atomic(a, b, c)                                      \
        usb_control_msg((a)->dev, (a)->ctrl_out_pipe, 0, 0x40, (c), (b), \
-               0, 0, HFC_CTRL_TIMEOUT)
-#define read_reg_atomic(a, b, c) \
+                       0, 0, HFC_CTRL_TIMEOUT)
+#define read_reg_atomic(a, b, c)                                       \
        usb_control_msg((a)->dev, (a)->ctrl_in_pipe, 1, 0xC0, 0, (b), (c), \
-               1, HFC_CTRL_TIMEOUT)
+                       1, HFC_CTRL_TIMEOUT)
 #define HFC_CTRL_BUFSIZE 64
 
 struct ctrl_buf {
@@ -222,7 +222,7 @@ static char *conf_str[] = {
 #define LED_B2_DATA    10
 
 #define LED_NORMAL     0       /* LEDs are normal */
-#define LED_INVERTED   1       /* LEDs are inverted */
+#define LED_INVERTED   1       /* LEDs are inverted */
 
 /* time in ms to perform a Flashing LED when B-Channel has traffic */
 #define LED_TIME      250
@@ -258,7 +258,7 @@ struct usb_fifo {
 
        __u8 usb_transfer_mode; /* switched between ISO and INT */
        struct iso_urb  iso[2]; /* two urbs to have one always
-                                        one pending */
+                                  one pending */
 
        struct dchannel *dch;   /* link to hfcsusb_t->dch */
        struct bchannel *bch;   /* link to hfcsusb_t->bch */
@@ -339,76 +339,76 @@ static const char *HFC_NT_LAYER1_STATES[HFC_MAX_NT_LAYER1_STATE + 1] = {
 /* supported devices */
 static struct usb_device_id hfcsusb_idtab[] = {
        {
-        USB_DEVICE(0x0959, 0x2bd0),
-        .driver_info = (unsigned long) &((struct hfcsusb_vdata)
-                         {LED_OFF, {4, 0, 2, 1},
-                          "ISDN USB TA (Cologne Chip HFC-S USB based)"}),
+               USB_DEVICE(0x0959, 0x2bd0),
+               .driver_info = (unsigned long) &((struct hfcsusb_vdata)
+                       {LED_OFF, {4, 0, 2, 1},
+                                       "ISDN USB TA (Cologne Chip HFC-S USB based)"}),
        },
        {
-        USB_DEVICE(0x0675, 0x1688),
-        .driver_info = (unsigned long) &((struct hfcsusb_vdata)
-                         {LED_SCHEME1, {1, 2, 0, 0},
-                          "DrayTek miniVigor 128 USB ISDN TA"}),
+               USB_DEVICE(0x0675, 0x1688),
+               .driver_info = (unsigned long) &((struct hfcsusb_vdata)
+                       {LED_SCHEME1, {1, 2, 0, 0},
+                                       "DrayTek miniVigor 128 USB ISDN TA"}),
        },
        {
-        USB_DEVICE(0x07b0, 0x0007),
-        .driver_info = (unsigned long) &((struct hfcsusb_vdata)
-                         {LED_SCHEME1, {0x80, -64, -32, -16},
-                          "Billion tiny USB ISDN TA 128"}),
+               USB_DEVICE(0x07b0, 0x0007),
+               .driver_info = (unsigned long) &((struct hfcsusb_vdata)
+                       {LED_SCHEME1, {0x80, -64, -32, -16},
+                                       "Billion tiny USB ISDN TA 128"}),
        },
        {
-        USB_DEVICE(0x0742, 0x2008),
-        .driver_info = (unsigned long) &((struct hfcsusb_vdata)
-                         {LED_SCHEME1, {4, 0, 2, 1},
-                          "Stollmann USB TA"}),
+               USB_DEVICE(0x0742, 0x2008),
+               .driver_info = (unsigned long) &((struct hfcsusb_vdata)
+                       {LED_SCHEME1, {4, 0, 2, 1},
+                                       "Stollmann USB TA"}),
        },
        {
-        USB_DEVICE(0x0742, 0x2009),
-        .driver_info = (unsigned long) &((struct hfcsusb_vdata)
-                         {LED_SCHEME1, {4, 0, 2, 1},
-                          "Aceex USB ISDN TA"}),
+               USB_DEVICE(0x0742, 0x2009),
+               .driver_info = (unsigned long) &((struct hfcsusb_vdata)
+                       {LED_SCHEME1, {4, 0, 2, 1},
+                                       "Aceex USB ISDN TA"}),
        },
        {
-        USB_DEVICE(0x0742, 0x200A),
-        .driver_info = (unsigned long) &((struct hfcsusb_vdata)
-                         {LED_SCHEME1, {4, 0, 2, 1},
-                          "OEM USB ISDN TA"}),
+               USB_DEVICE(0x0742, 0x200A),
+               .driver_info = (unsigned long) &((struct hfcsusb_vdata)
+                       {LED_SCHEME1, {4, 0, 2, 1},
+                                       "OEM USB ISDN TA"}),
        },
        {
-        USB_DEVICE(0x08e3, 0x0301),
-        .driver_info = (unsigned long) &((struct hfcsusb_vdata)
-                         {LED_SCHEME1, {2, 0, 1, 4},
-                          "Olitec USB RNIS"}),
+               USB_DEVICE(0x08e3, 0x0301),
+               .driver_info = (unsigned long) &((struct hfcsusb_vdata)
+                       {LED_SCHEME1, {2, 0, 1, 4},
+                                       "Olitec USB RNIS"}),
        },
        {
-        USB_DEVICE(0x07fa, 0x0846),
-        .driver_info = (unsigned long) &((struct hfcsusb_vdata)
-                         {LED_SCHEME1, {0x80, -64, -32, -16},
-                          "Bewan Modem RNIS USB"}),
+               USB_DEVICE(0x07fa, 0x0846),
+               .driver_info = (unsigned long) &((struct hfcsusb_vdata)
+                       {LED_SCHEME1, {0x80, -64, -32, -16},
+                                       "Bewan Modem RNIS USB"}),
        },
        {
-        USB_DEVICE(0x07fa, 0x0847),
-        .driver_info = (unsigned long) &((struct hfcsusb_vdata)
-                         {LED_SCHEME1, {0x80, -64, -32, -16},
-                          "Djinn Numeris USB"}),
+               USB_DEVICE(0x07fa, 0x0847),
+               .driver_info = (unsigned long) &((struct hfcsusb_vdata)
+                       {LED_SCHEME1, {0x80, -64, -32, -16},
+                                       "Djinn Numeris USB"}),
        },
        {
-        USB_DEVICE(0x07b0, 0x0006),
-        .driver_info = (unsigned long) &((struct hfcsusb_vdata)
-                         {LED_SCHEME1, {0x80, -64, -32, -16},
-                          "Twister ISDN TA"}),
+               USB_DEVICE(0x07b0, 0x0006),
+               .driver_info = (unsigned long) &((struct hfcsusb_vdata)
+                       {LED_SCHEME1, {0x80, -64, -32, -16},
+                                       "Twister ISDN TA"}),
        },
        {
-        USB_DEVICE(0x071d, 0x1005),
-        .driver_info = (unsigned long) &((struct hfcsusb_vdata)
-                         {LED_SCHEME1, {0x02, 0, 0x01, 0x04},
-                          "Eicon DIVA USB 4.0"}),
+               USB_DEVICE(0x071d, 0x1005),
+               .driver_info = (unsigned long) &((struct hfcsusb_vdata)
+                       {LED_SCHEME1, {0x02, 0, 0x01, 0x04},
+                                       "Eicon DIVA USB 4.0"}),
        },
        {
-        USB_DEVICE(0x0586, 0x0102),
-        .driver_info = (unsigned long) &((struct hfcsusb_vdata)
-                         {LED_SCHEME1, {0x88, -64, -32, -16},
-                          "ZyXEL OMNI.NET USB II"}),
+               USB_DEVICE(0x0586, 0x0102),
+               .driver_info = (unsigned long) &((struct hfcsusb_vdata)
+                       {LED_SCHEME1, {0x88, -64, -32, -16},
+                                       "ZyXEL OMNI.NET USB II"}),
        },
        { }
 };
index b438981..c3e7bb1 100644 (file)
 #define _IOHELPER_H
 
 typedef        u8      (read_reg_func)(void *hwp, u8 offset);
-typedef        void    (write_reg_func)(void *hwp, u8 offset, u8 value);
-typedef        void    (fifo_func)(void *hwp, u8 offset, u8 *datap, int size);
+                              typedef  void    (write_reg_func)(void *hwp, u8 offset, u8 value);
+                              typedef  void    (fifo_func)(void *hwp, u8 offset, u8 *datap, int size);
 
-struct _ioport {
-       u32     port;
-       u32     ale;
-};
+                              struct _ioport {
+                                      u32      port;
+                                      u32      ale;
+                              };
 
-#define IOFUNC_IO(name, hws, ap) \
-       static u8 Read##name##_IO(void *p, u8 off) {\
-               struct hws *hw = p;\
-               return inb(hw->ap.port + off);\
-       } \
-       static void Write##name##_IO(void *p, u8 off, u8 val) {\
-               struct hws *hw = p;\
-               outb(val, hw->ap.port + off);\
-       } \
-       static void ReadFiFo##name##_IO(void *p, u8 off, u8 *dp, int size) {\
-               struct hws *hw = p;\
-               insb(hw->ap.port + off, dp, size);\
-       } \
-       static void WriteFiFo##name##_IO(void *p, u8 off, u8 *dp, int size) {\
-               struct hws *hw = p;\
-               outsb(hw->ap.port + off, dp, size);\
+#define IOFUNC_IO(name, hws, ap)                                       \
+       static u8 Read##name##_IO(void *p, u8 off) {                    \
+               struct hws *hw = p;                                     \
+               return inb(hw->ap.port + off);                          \
+       }                                                               \
+       static void Write##name##_IO(void *p, u8 off, u8 val) {         \
+               struct hws *hw = p;                                     \
+               outb(val, hw->ap.port + off);                           \
+       }                                                               \
+       static void ReadFiFo##name##_IO(void *p, u8 off, u8 *dp, int size) { \
+               struct hws *hw = p;                                     \
+               insb(hw->ap.port + off, dp, size);                      \
+       }                                                               \
+       static void WriteFiFo##name##_IO(void *p, u8 off, u8 *dp, int size) { \
+               struct hws *hw = p;                                     \
+               outsb(hw->ap.port + off, dp, size);                     \
        }
 
-#define IOFUNC_IND(name, hws, ap) \
-       static u8 Read##name##_IND(void *p, u8 off) {\
-               struct hws *hw = p;\
-               outb(off, hw->ap.ale);\
-               return inb(hw->ap.port);\
-       } \
-       static void Write##name##_IND(void *p, u8 off, u8 val) {\
-               struct hws *hw = p;\
-               outb(off, hw->ap.ale);\
-               outb(val, hw->ap.port);\
-       } \
-       static void ReadFiFo##name##_IND(void *p, u8 off, u8 *dp, int size) {\
-               struct hws *hw = p;\
-               outb(off, hw->ap.ale);\
-               insb(hw->ap.port, dp, size);\
-       } \
-       static void WriteFiFo##name##_IND(void *p, u8 off, u8 *dp, int size) {\
-               struct hws *hw = p;\
-               outb(off, hw->ap.ale);\
-               outsb(hw->ap.port, dp, size);\
+#define IOFUNC_IND(name, hws, ap)                                      \
+       static u8 Read##name##_IND(void *p, u8 off) {                   \
+               struct hws *hw = p;                                     \
+               outb(off, hw->ap.ale);                                  \
+               return inb(hw->ap.port);                                \
+       }                                                               \
+       static void Write##name##_IND(void *p, u8 off, u8 val) {        \
+               struct hws *hw = p;                                     \
+               outb(off, hw->ap.ale);                                  \
+               outb(val, hw->ap.port);                                 \
+       }                                                               \
+       static void ReadFiFo##name##_IND(void *p, u8 off, u8 *dp, int size) { \
+               struct hws *hw = p;                                     \
+               outb(off, hw->ap.ale);                                  \
+               insb(hw->ap.port, dp, size);                            \
+       }                                                               \
+       static void WriteFiFo##name##_IND(void *p, u8 off, u8 *dp, int size) { \
+               struct hws *hw = p;                                     \
+               outb(off, hw->ap.ale);                                  \
+               outsb(hw->ap.port, dp, size);                           \
        }
 
-#define IOFUNC_MEMIO(name, hws, typ, adr) \
-       static u8 Read##name##_MIO(void *p, u8 off) {\
-               struct hws *hw = p;\
-               return readb(((typ *)hw->adr) + off);\
-       } \
-       static void Write##name##_MIO(void *p, u8 off, u8 val) {\
-               struct hws *hw = p;\
-               writeb(val, ((typ *)hw->adr) + off);\
-       } \
-       static void ReadFiFo##name##_MIO(void *p, u8 off, u8 *dp, int size) {\
-               struct hws *hw = p;\
-               while (size--)\
-                       *dp++ = readb(((typ *)hw->adr) + off);\
-       } \
-       static void WriteFiFo##name##_MIO(void *p, u8 off, u8 *dp, int size) {\
-               struct hws *hw = p;\
-               while (size--)\
-                       writeb(*dp++, ((typ *)hw->adr) + off);\
+#define IOFUNC_MEMIO(name, hws, typ, adr)                              \
+       static u8 Read##name##_MIO(void *p, u8 off) {                   \
+               struct hws *hw = p;                                     \
+               return readb(((typ *)hw->adr) + off);                   \
+       }                                                               \
+       static void Write##name##_MIO(void *p, u8 off, u8 val) {        \
+               struct hws *hw = p;                                     \
+               writeb(val, ((typ *)hw->adr) + off);                    \
+       }                                                               \
+       static void ReadFiFo##name##_MIO(void *p, u8 off, u8 *dp, int size) { \
+               struct hws *hw = p;                                     \
+               while (size--)                                          \
+                       *dp++ = readb(((typ *)hw->adr) + off);          \
+       }                                                               \
+       static void WriteFiFo##name##_MIO(void *p, u8 off, u8 *dp, int size) { \
+               struct hws *hw = p;                                     \
+               while (size--)                                          \
+                       writeb(*dp++, ((typ *)hw->adr) + off);          \
        }
 
-#define ASSIGN_FUNC(typ, name, dest)   do {\
-       dest.read_reg = &Read##name##_##typ;\
-       dest.write_reg = &Write##name##_##typ;\
-       dest.read_fifo = &ReadFiFo##name##_##typ;\
-       dest.write_fifo = &WriteFiFo##name##_##typ;\
+#define ASSIGN_FUNC(typ, name, dest)   do {                    \
+               dest.read_reg = &Read##name##_##typ;            \
+               dest.write_reg = &Write##name##_##typ;          \
+               dest.read_fifo = &ReadFiFo##name##_##typ;       \
+               dest.write_fifo = &WriteFiFo##name##_##typ;     \
        } while (0)
-#define ASSIGN_FUNC_IPAC(typ, target)  do {\
-       ASSIGN_FUNC(typ, ISAC, target.isac);\
-       ASSIGN_FUNC(typ, IPAC, target);\
+#define ASSIGN_FUNC_IPAC(typ, target)  do {            \
+               ASSIGN_FUNC(typ, ISAC, target.isac);    \
+               ASSIGN_FUNC(typ, IPAC, target);         \
        } while (0)
 
 #endif
index 9962bdf..cadfc49 100644 (file)
@@ -97,7 +97,7 @@ struct isar_hw {
 #define ISAR_HIS_SDATA         0x20
 #define ISAR_HIS_DPS1          0x40
 #define ISAR_HIS_DPS2          0x80
-#define SET_DPS(x)             ((x<<6) & 0xc0)
+#define SET_DPS(x)             ((x << 6) & 0xc0)
 
 #define ISAR_IIS_MSCMSD                0x3f
 #define ISAR_IIS_VNR           0x15
index 6218775..631eb3f 100644 (file)
@@ -431,11 +431,11 @@ enable_hwirq(struct inf_hw *hw)
                break;
        case INF_GAZEL_R685:
                outb(GAZEL_ISAC_EN + GAZEL_HSCX_EN + GAZEL_PCI_EN,
-                       (u32)hw->cfg.start + GAZEL_INCSR);
+                    (u32)hw->cfg.start + GAZEL_INCSR);
                break;
        case INF_GAZEL_R753:
                outb(GAZEL_IPAC_EN + GAZEL_PCI_EN,
-                       (u32)hw->cfg.start + GAZEL_INCSR);
+                    (u32)hw->cfg.start + GAZEL_INCSR);
                break;
        default:
                break;
@@ -511,21 +511,21 @@ reset_inf(struct inf_hw *hw)
                /* Workaround PCI9060 */
                outb(9, (u32)hw->cfg.start + 0x69);
                outb(DIVA_RESET_BIT | DIVA_LED_A,
-                       (u32)hw->cfg.start + DIVA_PCI_CTRL);
+                    (u32)hw->cfg.start + DIVA_PCI_CTRL);
                break;
        case INF_DIVA201:
                writel(PITA_PARA_SOFTRESET | PITA_PARA_MPX_MODE,
-                       hw->cfg.p + PITA_MISC_REG);
+                      hw->cfg.p + PITA_MISC_REG);
                mdelay(1);
                writel(PITA_PARA_MPX_MODE, hw->cfg.p + PITA_MISC_REG);
                mdelay(10);
                break;
        case INF_DIVA202:
                writel(PITA_PARA_SOFTRESET | PITA_PARA_MPX_MODE,
-                       hw->cfg.p + PITA_MISC_REG);
+                      hw->cfg.p + PITA_MISC_REG);
                mdelay(1);
                writel(PITA_PARA_MPX_MODE | PITA_SER_SOFTRESET,
-                       hw->cfg.p + PITA_MISC_REG);
+                      hw->cfg.p + PITA_MISC_REG);
                mdelay(10);
                break;
        case INF_SPEEDWIN:
@@ -630,7 +630,7 @@ init_irq(struct inf_hw *hw)
                msleep_interruptible(10);
                if (debug & DEBUG_HW)
                        pr_notice("%s: IRQ %d count %d\n", hw->name,
-                               hw->irq, hw->irqcnt);
+                                 hw->irq, hw->irqcnt);
                if (!hw->irqcnt) {
                        pr_info("%s: IRQ(%d) got no requests during init %d\n",
                                hw->name, hw->irq, 3 - cnt);
@@ -672,11 +672,11 @@ setup_io(struct inf_hw *hw)
                hw->cfg.size = pci_resource_len(hw->pdev, hw->ci->cfg_bar);
                if (hw->ci->cfg_mode == AM_MEMIO) {
                        if (!request_mem_region(hw->cfg.start, hw->cfg.size,
-                           hw->name))
+                                               hw->name))
                                err = -EBUSY;
                } else {
                        if (!request_region(hw->cfg.start, hw->cfg.size,
-                           hw->name))
+                                           hw->name))
                                err = -EBUSY;
                }
                if (err) {
@@ -690,8 +690,8 @@ setup_io(struct inf_hw *hw)
                hw->cfg.mode = hw->ci->cfg_mode;
                if (debug & DEBUG_HW)
                        pr_notice("%s: IO cfg %lx (%lu bytes) mode%d\n",
-                               hw->name, (ulong)hw->cfg.start,
-                               (ulong)hw->cfg.size, hw->ci->cfg_mode);
+                                 hw->name, (ulong)hw->cfg.start,
+                                 (ulong)hw->cfg.size, hw->ci->cfg_mode);
 
        }
        if (hw->ci->addr_mode) {
@@ -699,11 +699,11 @@ setup_io(struct inf_hw *hw)
                hw->addr.size = pci_resource_len(hw->pdev, hw->ci->addr_bar);
                if (hw->ci->addr_mode == AM_MEMIO) {
                        if (!request_mem_region(hw->addr.start, hw->addr.size,
-                           hw->name))
+                                               hw->name))
                                err = -EBUSY;
                } else {
                        if (!request_region(hw->addr.start, hw->addr.size,
-                           hw->name))
+                                           hw->name))
                                err = -EBUSY;
                }
                if (err) {
@@ -717,8 +717,8 @@ setup_io(struct inf_hw *hw)
                hw->addr.mode = hw->ci->addr_mode;
                if (debug & DEBUG_HW)
                        pr_notice("%s: IO addr %lx (%lu bytes) mode%d\n",
-                               hw->name, (ulong)hw->addr.start,
-                               (ulong)hw->addr.size, hw->ci->addr_mode);
+                                 hw->name, (ulong)hw->addr.start,
+                                 (ulong)hw->addr.size, hw->ci->addr_mode);
 
        }
 
@@ -903,7 +903,7 @@ setup_instance(struct inf_hw *card)
        ulong flags;
 
        snprintf(card->name, MISDN_MAX_IDLEN - 1, "%s.%d", card->ci->name,
-               inf_cnt + 1);
+                inf_cnt + 1);
        write_lock_irqsave(&card_lock, flags);
        list_add_tail(&card->list, &Cards);
        write_unlock_irqrestore(&card_lock, flags);
@@ -928,7 +928,7 @@ setup_instance(struct inf_hw *card)
                goto error_setup;
 
        err = mISDN_register_device(&card->ipac.isac.dch.dev,
-               &card->pdev->dev, card->name);
+                                   &card->pdev->dev, card->name);
        if (err)
                goto error;
 
@@ -1099,7 +1099,7 @@ inf_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
                return -EINVAL;
        } else
                pr_notice("mISDN: found adapter %s at %s\n",
-                       card->ci->full, pci_name(pdev));
+                         card->ci->full, pci_name(pdev));
 
        card->irq = pdev->irq;
        pci_set_drvdata(pdev, card);
index d2ffb1d..b47e9be 100644 (file)
@@ -129,7 +129,7 @@ isac_empty_fifo(struct isac_hw *isac, int count)
        }
        if ((isac->dch.rx_skb->len + count) >= isac->dch.maxlen) {
                pr_debug("%s: %s overrun %d\n", isac->name, __func__,
-                           isac->dch.rx_skb->len + count);
+                        isac->dch.rx_skb->len + count);
                WriteISAC(isac, ISAC_CMDR, 0x80);
                return;
        }
@@ -140,7 +140,7 @@ isac_empty_fifo(struct isac_hw *isac, int count)
                char    pfx[MISDN_MAX_IDLEN + 16];
 
                snprintf(pfx, MISDN_MAX_IDLEN + 15, "D-recv %s %d ",
-                       isac->name, count);
+                        isac->name, count);
                print_hex_dump_bytes(pfx, DUMP_PREFIX_OFFSET, ptr, count);
        }
 }
@@ -178,7 +178,7 @@ isac_fill_fifo(struct isac_hw *isac)
                char    pfx[MISDN_MAX_IDLEN + 16];
 
                snprintf(pfx, MISDN_MAX_IDLEN + 15, "D-send %s %d ",
-                       isac->name, count);
+                        isac->name, count);
                print_hex_dump_bytes(pfx, DUMP_PREFIX_OFFSET, ptr, count);
        }
 }
@@ -283,7 +283,7 @@ isac_mos_irq(struct isac_hw *isac)
                }
                isac->mon_rx[isac->mon_rxp++] = ReadISAC(isac, ISAC_MOR0);
                pr_debug("%s: ISAC MOR0 %02x\n", isac->name,
-                       isac->mon_rx[isac->mon_rxp - 1]);
+                        isac->mon_rx[isac->mon_rxp - 1]);
                if (isac->mon_rxp == 1) {
                        isac->mocr |= 0x04;
                        WriteISAC(isac, ISAC_MOCR, isac->mocr);
@@ -313,7 +313,7 @@ afterMONR0:
                }
                isac->mon_rx[isac->mon_rxp++] = ReadISAC(isac, ISAC_MOR1);
                pr_debug("%s: ISAC MOR1 %02x\n", isac->name,
-                       isac->mon_rx[isac->mon_rxp - 1]);
+                        isac->mon_rx[isac->mon_rxp - 1]);
                isac->mocr |= 0x40;
                WriteISAC(isac, ISAC_MOCR, isac->mocr);
        }
@@ -325,7 +325,7 @@ afterMONR1:
                WriteISAC(isac, ISAC_MOCR, isac->mocr);
                if (isac->monitor) {
                        ret = isac->monitor(isac->dch.hw, MONITOR_RX_0,
-                               isac->mon_rx, isac->mon_rxp);
+                                           isac->mon_rx, isac->mon_rxp);
                        if (ret)
                                kfree(isac->mon_rx);
                } else {
@@ -343,7 +343,7 @@ afterMONR1:
                WriteISAC(isac, ISAC_MOCR, isac->mocr);
                if (isac->monitor) {
                        ret = isac->monitor(isac->dch.hw, MONITOR_RX_1,
-                               isac->mon_rx, isac->mon_rxp);
+                                           isac->mon_rx, isac->mon_rxp);
                        if (ret)
                                kfree(isac->mon_rx);
                } else {
@@ -356,7 +356,7 @@ afterMONR1:
        }
        if (val & 0x02) {
                if ((!isac->mon_tx) || (isac->mon_txc &&
-                       (isac->mon_txp >= isac->mon_txc) && !(val & 0x08))) {
+                                       (isac->mon_txp >= isac->mon_txc) && !(val & 0x08))) {
                        isac->mocr &= 0xf0;
                        WriteISAC(isac, ISAC_MOCR, isac->mocr);
                        isac->mocr |= 0x0a;
@@ -364,7 +364,7 @@ afterMONR1:
                        if (isac->mon_txc && (isac->mon_txp >= isac->mon_txc)) {
                                if (isac->monitor)
                                        ret = isac->monitor(isac->dch.hw,
-                                               MONITOR_TX_0, NULL, 0);
+                                                           MONITOR_TX_0, NULL, 0);
                        }
                        kfree(isac->mon_tx);
                        isac->mon_tx = NULL;
@@ -375,7 +375,7 @@ afterMONR1:
                if (isac->mon_txc && (isac->mon_txp >= isac->mon_txc)) {
                        if (isac->monitor)
                                ret = isac->monitor(isac->dch.hw,
-                                       MONITOR_TX_0, NULL, 0);
+                                                   MONITOR_TX_0, NULL, 0);
                        kfree(isac->mon_tx);
                        isac->mon_tx = NULL;
                        isac->mon_txc = 0;
@@ -384,12 +384,12 @@ afterMONR1:
                }
                WriteISAC(isac, ISAC_MOX0, isac->mon_tx[isac->mon_txp++]);
                pr_debug("%s: ISAC %02x -> MOX0\n", isac->name,
-                       isac->mon_tx[isac->mon_txp - 1]);
+                        isac->mon_tx[isac->mon_txp - 1]);
        }
 AfterMOX0:
        if (val & 0x20) {
                if ((!isac->mon_tx) || (isac->mon_txc &&
-                       (isac->mon_txp >= isac->mon_txc) && !(val & 0x80))) {
+                                       (isac->mon_txp >= isac->mon_txc) && !(val & 0x80))) {
                        isac->mocr &= 0x0f;
                        WriteISAC(isac, ISAC_MOCR, isac->mocr);
                        isac->mocr |= 0xa0;
@@ -397,7 +397,7 @@ AfterMOX0:
                        if (isac->mon_txc && (isac->mon_txp >= isac->mon_txc)) {
                                if (isac->monitor)
                                        ret = isac->monitor(isac->dch.hw,
-                                               MONITOR_TX_1, NULL, 0);
+                                                           MONITOR_TX_1, NULL, 0);
                        }
                        kfree(isac->mon_tx);
                        isac->mon_tx = NULL;
@@ -408,7 +408,7 @@ AfterMOX0:
                if (isac->mon_txc && (isac->mon_txp >= isac->mon_txc)) {
                        if (isac->monitor)
                                ret = isac->monitor(isac->dch.hw,
-                                       MONITOR_TX_1, NULL, 0);
+                                                   MONITOR_TX_1, NULL, 0);
                        kfree(isac->mon_tx);
                        isac->mon_tx = NULL;
                        isac->mon_txc = 0;
@@ -417,7 +417,7 @@ AfterMOX0:
                }
                WriteISAC(isac, ISAC_MOX1, isac->mon_tx[isac->mon_txp++]);
                pr_debug("%s: ISAC %02x -> MOX1\n", isac->name,
-                       isac->mon_tx[isac->mon_txp - 1]);
+                        isac->mon_tx[isac->mon_txp - 1]);
        }
 AfterMOX1:
        val = 0; /* dummy to avoid warning */
@@ -432,7 +432,7 @@ isac_cisq_irq(struct isac_hw *isac) {
        pr_debug("%s: ISAC CIR0 %02X\n", isac->name, val);
        if (val & 2) {
                pr_debug("%s: ph_state change %x->%x\n", isac->name,
-                       isac->state, (val >> 2) & 0xf);
+                        isac->state, (val >> 2) & 0xf);
                isac->state = (val >> 2) & 0xf;
                isac_ph_state_change(isac);
        }
@@ -451,7 +451,7 @@ isacsx_cic_irq(struct isac_hw *isac)
        pr_debug("%s: ISACX CIR0 %02X\n", isac->name, val);
        if (val & ISACX_CIR0_CIC0) {
                pr_debug("%s: ph_state change %x->%x\n", isac->name,
-                       isac->state, val >> 4);
+                        isac->state, val >> 4);
                isac->state = val >> 4;
                isac_ph_state_change(isac);
        }
@@ -488,7 +488,7 @@ isacsx_rme_irq(struct isac_hw *isac)
                if (isac->dch.rx_skb) {
                        skb_trim(isac->dch.rx_skb, isac->dch.rx_skb->len - 1);
                        pr_debug("%s: dchannel received %d\n", isac->name,
-                               isac->dch.rx_skb->len);
+                                isac->dch.rx_skb->len);
                        recv_Dchannel(&isac->dch);
                }
        }
@@ -628,7 +628,7 @@ isac_ctrl(struct isac_hw *isac, u32 cmd, u_long para)
                break;
        default:
                pr_debug("%s: %s unknown command %x %lx\n", isac->name,
-                       __func__, cmd, para);
+                        __func__, cmd, para);
                return -1;
        }
        return 0;
@@ -685,16 +685,16 @@ isac_l1cmd(struct dchannel *dch, u32 cmd)
        case PH_ACTIVATE_IND:
                test_and_set_bit(FLG_ACTIVE, &dch->Flags);
                _queue_data(&dch->dev.D, cmd, MISDN_ID_ANY, 0, NULL,
-                       GFP_ATOMIC);
+                           GFP_ATOMIC);
                break;
        case PH_DEACTIVATE_IND:
                test_and_clear_bit(FLG_ACTIVE, &dch->Flags);
                _queue_data(&dch->dev.D, cmd, MISDN_ID_ANY, 0, NULL,
-                       GFP_ATOMIC);
+                           GFP_ATOMIC);
                break;
        default:
                pr_debug("%s: %s unknown command %x\n", isac->name,
-                       __func__, cmd);
+                        __func__, cmd);
                return -1;
        }
        return 0;
@@ -731,7 +731,7 @@ dbusy_timer_handler(struct isac_hw *isac)
                rbch = ReadISAC(isac, ISAC_RBCH);
                star = ReadISAC(isac, ISAC_STAR);
                pr_debug("%s: D-Channel Busy RBCH %02x STAR %02x\n",
-                       isac->name, rbch, star);
+                        isac->name, rbch, star);
                if (rbch & ISAC_RBCH_XAC) /* D-Channel Busy */
                        test_and_set_bit(FLG_L1_BUSY, &isac->dch.Flags);
                else {
@@ -753,7 +753,7 @@ static int
 open_dchannel(struct isac_hw *isac, struct channel_req *rq)
 {
        pr_debug("%s: %s dev(%d) open from %p\n", isac->name, __func__,
-               isac->dch.dev.id, __builtin_return_address(1));
+                isac->dch.dev.id, __builtin_return_address(1));
        if (rq->protocol != ISDN_P_TE_S0)
                return -EINVAL;
        if (rq->adr.channel == 1)
@@ -763,7 +763,7 @@ open_dchannel(struct isac_hw *isac, struct channel_req *rq)
        rq->ch->protocol = rq->protocol;
        if (isac->dch.state == 7)
                _queue_data(rq->ch, PH_ACTIVATE_IND, MISDN_ID_ANY,
-                   0, NULL, GFP_KERNEL);
+                           0, NULL, GFP_KERNEL);
        return 0;
 }
 
@@ -807,7 +807,7 @@ isac_init(struct isac_hw *isac)
                val = ReadISAC(isac, ISACX_ID);
                if (isac->dch.debug & DEBUG_HW)
                        pr_notice("%s: ISACX Design ID %x\n",
-                               isac->name, val & 0x3f);
+                                 isac->name, val & 0x3f);
                val = ReadISAC(isac, ISACX_CIR0);
                pr_debug("%s: ISACX CIR0 %02X\n", isac->name, val);
                isac->state = val >> 4;
@@ -832,7 +832,7 @@ isac_init(struct isac_hw *isac)
                val = ReadISAC(isac, ISAC_RBCH);
                if (isac->dch.debug & DEBUG_HW)
                        pr_notice("%s: ISAC version (%x): %s\n", isac->name,
-                               val, ISACVer[(val >> 5) & 3]);
+                                 val, ISACVer[(val >> 5) & 3]);
                isac->type |= ((val >> 5) & 3);
                if (!isac->adf2)
                        isac->adf2 = 0x80;
@@ -889,7 +889,7 @@ waitforCEC(struct hscx_hw *hx)
        }
        if (to < 50)
                pr_debug("%s: B%1d CEC %d us\n", hx->ip->name, hx->bch.nr,
-                       50 - to);
+                        50 - to);
        if (!to)
                pr_info("%s: B%1d CEC timeout\n", hx->ip->name, hx->bch.nr);
 }
@@ -909,7 +909,7 @@ waitforXFW(struct hscx_hw *hx)
        }
        if (to < 50)
                pr_debug("%s: B%1d XFW %d us\n", hx->ip->name, hx->bch.nr,
-                       50 - to);
+                        50 - to);
        if (!to)
                pr_info("%s: B%1d XFW timeout\n", hx->ip->name, hx->bch.nr);
 }
@@ -942,7 +942,7 @@ hscx_empty_fifo(struct hscx_hw *hscx, u8 count)
        }
        if ((hscx->bch.rx_skb->len + count) > hscx->bch.maxlen) {
                pr_debug("%s: overrun %d\n", hscx->ip->name,
-                       hscx->bch.rx_skb->len + count);
+                        hscx->bch.rx_skb->len + count);
                skb_trim(hscx->bch.rx_skb, 0);
                hscx_cmdr(hscx, 0x80); /* RMC */
                return;
@@ -951,16 +951,16 @@ hscx_empty_fifo(struct hscx_hw *hscx, u8 count)
 
        if (hscx->ip->type & IPAC_TYPE_IPACX)
                hscx->ip->read_fifo(hscx->ip->hw,
-                       hscx->off + IPACX_RFIFOB, p, count);
+                                   hscx->off + IPACX_RFIFOB, p, count);
        else
                hscx->ip->read_fifo(hscx->ip->hw,
-                       hscx->off, p, count);
+                                   hscx->off, p, count);
 
        hscx_cmdr(hscx, 0x80); /* RMC */
 
        if (hscx->bch.debug & DEBUG_HW_BFIFO) {
                snprintf(hscx->log, 64, "B%1d-recv %s %d ",
-                       hscx->bch.nr, hscx->ip->name, count);
+                        hscx->bch.nr, hscx->ip->name, count);
                print_hex_dump_bytes(hscx->log, DUMP_PREFIX_OFFSET, p, count);
        }
 }
@@ -984,22 +984,22 @@ hscx_fill_fifo(struct hscx_hw *hscx)
                more = 1;
        }
        pr_debug("%s: B%1d %d/%d/%d\n", hscx->ip->name, hscx->bch.nr, count,
-               hscx->bch.tx_idx, hscx->bch.tx_skb->len);
+                hscx->bch.tx_idx, hscx->bch.tx_skb->len);
        hscx->bch.tx_idx += count;
 
        if (hscx->ip->type & IPAC_TYPE_IPACX)
                hscx->ip->write_fifo(hscx->ip->hw,
-                       hscx->off + IPACX_XFIFOB, p, count);
+                                    hscx->off + IPACX_XFIFOB, p, count);
        else {
                waitforXFW(hscx);
                hscx->ip->write_fifo(hscx->ip->hw,
-                       hscx->off, p, count);
+                                    hscx->off, p, count);
        }
        hscx_cmdr(hscx, more ? 0x08 : 0x0a);
 
        if (hscx->bch.debug & DEBUG_HW_BFIFO) {
                snprintf(hscx->log, 64, "B%1d-send %s %d ",
-                       hscx->bch.nr, hscx->ip->name, count);
+                        hscx->bch.nr, hscx->ip->name, count);
                print_hex_dump_bytes(hscx->log, DUMP_PREFIX_OFFSET, p, count);
        }
 }
@@ -1037,18 +1037,18 @@ ipac_rme(struct hscx_hw *hx)
                if (!(rstab & 0x80)) {
                        if (hx->bch.debug & DEBUG_HW_BCHANNEL)
                                pr_notice("%s: B%1d invalid frame\n",
-                                       hx->ip->name, hx->bch.nr);
+                                         hx->ip->name, hx->bch.nr);
                }
                if (rstab & 0x40) {
                        if (hx->bch.debug & DEBUG_HW_BCHANNEL)
                                pr_notice("%s: B%1d RDO proto=%x\n",
-                                       hx->ip->name, hx->bch.nr,
-                                       hx->bch.state);
+                                         hx->ip->name, hx->bch.nr,
+                                         hx->bch.state);
                }
                if (!(rstab & 0x20)) {
                        if (hx->bch.debug & DEBUG_HW_BCHANNEL)
                                pr_notice("%s: B%1d CRC error\n",
-                                       hx->ip->name, hx->bch.nr);
+                                         hx->ip->name, hx->bch.nr);
                }
                hscx_cmdr(hx, 0x80); /* Do RMC */
                return;
@@ -1065,7 +1065,7 @@ ipac_rme(struct hscx_hw *hx)
                return;
        if (hx->bch.rx_skb->len < 2) {
                pr_debug("%s: B%1d frame to short %d\n",
-                       hx->ip->name, hx->bch.nr, hx->bch.rx_skb->len);
+                        hx->ip->name, hx->bch.nr, hx->bch.rx_skb->len);
                skb_trim(hx->bch.rx_skb, 0);
        } else {
                skb_trim(hx->bch.rx_skb, hx->bch.rx_skb->len - 1);
@@ -1086,7 +1086,7 @@ ipac_irq(struct hscx_hw *hx, u8 ista)
                if (m & ista) {
                        exirb = ReadHSCX(hx, IPAC_EXIRB);
                        pr_debug("%s: B%1d EXIRB %02x\n", hx->ip->name,
-                               hx->bch.nr, exirb);
+                                hx->bch.nr, exirb);
                }
        } else if (hx->bch.nr & 2) { /* HSCX B */
                if (ista & (HSCX__EXA | HSCX__ICA))
@@ -1094,7 +1094,7 @@ ipac_irq(struct hscx_hw *hx, u8 ista)
                if (ista & HSCX__EXB) {
                        exirb = ReadHSCX(hx, IPAC_EXIRB);
                        pr_debug("%s: B%1d EXIRB %02x\n", hx->ip->name,
-                               hx->bch.nr, exirb);
+                                hx->bch.nr, exirb);
                }
                istab = ista & 0xF8;
        } else { /* HSCX A */
@@ -1102,7 +1102,7 @@ ipac_irq(struct hscx_hw *hx, u8 ista)
                if (ista & HSCX__EXA) {
                        exirb = ReadHSCX(hx, IPAC_EXIRB);
                        pr_debug("%s: B%1d EXIRB %02x\n", hx->ip->name,
-                               hx->bch.nr, exirb);
+                                hx->bch.nr, exirb);
                }
                istab = istab & 0xF8;
        }
@@ -1141,7 +1141,7 @@ ipac_irq(struct hscx_hw *hx, u8 ista)
                        return;
                }
                pr_debug("%s: B%1d XDU error at len %d\n", hx->ip->name,
-                       hx->bch.nr, hx->bch.tx_idx);
+                        hx->bch.nr, hx->bch.tx_idx);
                hx->bch.tx_idx = 0;
                hscx_cmdr(hx, 0x01);    /* XRES */
        }
@@ -1204,10 +1204,10 @@ mISDNipac_irq(struct ipac_hw *ipac, int maxloop)
                return IRQ_NONE;
        if (cnt < maxloop)
                pr_debug("%s: %d irqloops cpu%d\n", ipac->name,
-                       maxloop - cnt, smp_processor_id());
+                        maxloop - cnt, smp_processor_id());
        if (maxloop && !cnt)
                pr_notice("%s: %d IRQ LOOP cpu%d\n", ipac->name,
-                       maxloop, smp_processor_id());
+                         maxloop, smp_processor_id());
        return IRQ_HANDLED;
 }
 EXPORT_SYMBOL(mISDNipac_irq);
@@ -1216,7 +1216,7 @@ static int
 hscx_mode(struct hscx_hw *hscx, u32 bprotocol)
 {
        pr_debug("%s: HSCX %c protocol %x-->%x ch %d\n", hscx->ip->name,
-               '@' + hscx->bch.nr, hscx->bch.state, bprotocol, hscx->bch.nr);
+                '@' + hscx->bch.nr, hscx->bch.state, bprotocol, hscx->bch.nr);
        if (hscx->ip->type & IPAC_TYPE_IPACX) {
                if (hscx->bch.nr & 1) { /* B1 and ICA */
                        WriteIPAC(hscx->ip, ISACX_BCHA_TSDP_BC1, 0x80);
@@ -1364,7 +1364,7 @@ hscx_l2l1(struct mISDNchannel *ch, struct sk_buff *skb)
                spin_unlock_irqrestore(hx->ip->hwlock, flags);
                if (!ret)
                        _queue_data(ch, PH_ACTIVATE_IND, MISDN_ID_ANY, 0,
-                               NULL, GFP_KERNEL);
+                                   NULL, GFP_KERNEL);
                break;
        case PH_DEACTIVATE_REQ:
                spin_lock_irqsave(hx->ip->hwlock, flags);
@@ -1372,7 +1372,7 @@ hscx_l2l1(struct mISDNchannel *ch, struct sk_buff *skb)
                hscx_mode(hx, ISDN_P_NONE);
                spin_unlock_irqrestore(hx->ip->hwlock, flags);
                _queue_data(ch, PH_DEACTIVATE_IND, MISDN_ID_ANY, 0,
-                       NULL, GFP_KERNEL);
+                           NULL, GFP_KERNEL);
                ret = 0;
                break;
        default:
@@ -1394,7 +1394,7 @@ channel_bctrl(struct bchannel *bch, struct mISDN_ctrl_req *cq)
        case MISDN_CTRL_GETOP:
                cq->op = 0;
                break;
-       /* Nothing implemented yet */
+               /* Nothing implemented yet */
        case MISDN_CTRL_FILL_EMPTY:
        default:
                pr_info("%s: unknown Op %x\n", __func__, cq->op);
@@ -1467,7 +1467,7 @@ hscx_init(struct hscx_hw *hx)
                pr_debug("%s: HSCX VSTR %02x\n", hx->ip->name, val);
                if (hx->bch.debug & DEBUG_HW)
                        pr_notice("%s: HSCX version %s\n", hx->ip->name,
-                               HSCXVer[val & 0x0f]);
+                                 HSCXVer[val & 0x0f]);
        } else
                WriteHSCX(hx, IPAC_CCR1, 0x82);
        WriteHSCX(hx, IPAC_CCR2, 0x30);
@@ -1491,7 +1491,7 @@ ipac_init(struct ipac_hw *ipac)
                val = ReadIPAC(ipac, IPAC_CONF);
                /* conf is default 0, but can be overwritten by card setup */
                pr_debug("%s: IPAC CONF %02x/%02x\n", ipac->name,
-                       val, ipac->conf);
+                        val, ipac->conf);
                WriteIPAC(ipac, IPAC_CONF, ipac->conf);
                val = ReadIPAC(ipac, IPAC_ID);
                if (ipac->hscx[0].bch.debug & DEBUG_HW)
@@ -1569,7 +1569,7 @@ ipac_dctrl(struct mISDNchannel *ch, u32 cmd, void *arg)
                break;
        case CLOSE_CHANNEL:
                pr_debug("%s: dev(%d) close from %p\n", ipac->name,
-                       dch->dev.id, __builtin_return_address(0));
+                        dch->dev.id, __builtin_return_address(0));
                module_put(ipac->owner);
                break;
        case CONTROL_CHANNEL:
@@ -1620,7 +1620,7 @@ mISDNipac_init(struct ipac_hw *ipac, void *hw)
                ipac->hscx[i].bch.nr = i + 1;
                set_channelmap(i + 1, ipac->isac.dch.dev.channelmap);
                list_add(&ipac->hscx[i].bch.ch.list,
-                       &ipac->isac.dch.dev.bchannels);
+                        &ipac->isac.dch.dev.bchannels);
                mISDN_initbchannel(&ipac->hscx[i].bch, MAX_DATA_MEM);
                ipac->hscx[i].bch.ch.nr = i + 1;
                ipac->hscx[i].bch.ch.send = &hscx_l2l1;
index 7034af2..10446ab 100644 (file)
@@ -42,7 +42,7 @@ MODULE_VERSION(ISAR_REV);
 
 static const u8 faxmodulation_s[] = "3,24,48,72,73,74,96,97,98,121,122,145,146";
 static const u8 faxmodulation[] = {3, 24, 48, 72, 73, 74, 96, 97, 98, 121,
-                                       122, 145, 146};
+                                  122, 145, 146};
 #define FAXMODCNT 13
 
 static void isar_setup(struct isar_hw *);
@@ -84,9 +84,9 @@ send_mbox(struct isar_hw *isar, u8 his, u8 creg, u8 len, u8 *msg)
 
                        while (l < (int)len) {
                                hex_dump_to_buffer(msg + l, len - l, 32, 1,
-                                       isar->log, 256, 1);
+                                                  isar->log, 256, 1);
                                pr_debug("%s: %s %02x: %s\n", isar->name,
-                                       __func__, l, isar->log);
+                                        __func__, l, isar->log);
                                l += 32;
                        }
                }
@@ -113,9 +113,9 @@ rcv_mbox(struct isar_hw *isar, u8 *msg)
 
                        while (l < (int)isar->clsb) {
                                hex_dump_to_buffer(msg + l, isar->clsb - l, 32,
-                                       1, isar->log, 256, 1);
+                                                  1, isar->log, 256, 1);
                                pr_debug("%s: %s %02x: %s\n", isar->name,
-                                       __func__, l, isar->log);
+                                        __func__, l, isar->log);
                                l += 32;
                        }
                }
@@ -130,7 +130,7 @@ get_irq_infos(struct isar_hw *isar)
        isar->cmsb = isar->read_reg(isar->hw, ISAR_CTRL_H);
        isar->clsb = isar->read_reg(isar->hw, ISAR_CTRL_L);
        pr_debug("%s: rcv_mbox(%02x,%02x,%d)\n", isar->name,
-               isar->iis, isar->cmsb, isar->clsb);
+                isar->iis, isar->cmsb, isar->clsb);
 }
 
 /*
@@ -154,7 +154,7 @@ poll_mbox(struct isar_hw *isar, int maxdelay)
                rcv_mbox(isar, NULL);
        }
        pr_debug("%s: pulled %d bytes after %d us\n",
-               isar->name, isar->clsb, maxdelay - t);
+                isar->name, isar->clsb, maxdelay - t);
        return t;
 }
 
@@ -200,13 +200,13 @@ load_firmware(struct isar_hw *isar, const u8 *buf, int size)
 
        if (1 != isar->version) {
                pr_err("%s: ISAR wrong version %d firmware download aborted\n",
-                       isar->name, isar->version);
+                      isar->name, isar->version);
                return -EINVAL;
        }
        if (!(saved_debug & DEBUG_HW_FIRMWARE_FIFO))
                isar->ch[0].bch.debug &= ~DEBUG_HW_BFIFO;
        pr_debug("%s: load firmware %d words (%d bytes)\n",
-               isar->name, size/2, size);
+                isar->name, size / 2, size);
        cnt = 0;
        size /= 2;
        /* disable ISAR IRQ */
@@ -219,7 +219,7 @@ load_firmware(struct isar_hw *isar, const u8 *buf, int size)
                blk_head.d_key = le16_to_cpu(*sp++);
                cnt += 3;
                pr_debug("ISAR firmware block (%#x,%d,%#x)\n",
-                       blk_head.sadr, blk_head.len, blk_head.d_key & 0xff);
+                        blk_head.sadr, blk_head.len, blk_head.d_key & 0xff);
                left = blk_head.len;
                if (cnt + left > size) {
                        pr_info("%s: firmware error have %d need %d words\n",
@@ -229,7 +229,7 @@ load_firmware(struct isar_hw *isar, const u8 *buf, int size)
                }
                spin_lock_irqsave(isar->hwlock, flags);
                if (!send_mbox(isar, ISAR_HIS_DKEY, blk_head.d_key & 0xff,
-                   0, NULL)) {
+                              0, NULL)) {
                        pr_info("ISAR send_mbox dkey failed\n");
                        ret = -ETIME;
                        goto reterror;
@@ -260,7 +260,7 @@ load_firmware(struct isar_hw *isar, const u8 *buf, int size)
                        cnt += noc;
                        *mp++ = noc;
                        pr_debug("%s: load %3d words at %04x\n", isar->name,
-                               noc, blk_head.sadr);
+                                noc, blk_head.sadr);
                        blk_head.sadr += noc;
                        while (noc) {
                                val = le16_to_cpu(*sp++);
@@ -289,7 +289,7 @@ load_firmware(struct isar_hw *isar, const u8 *buf, int size)
                        }
                }
                pr_debug("%s: ISAR firmware block %d words loaded\n",
-                       isar->name, blk_head.len);
+                        isar->name, blk_head.len);
        }
        isar->ch[0].bch.debug = saved_debug;
        /* 10ms delay */
@@ -333,7 +333,7 @@ load_firmware(struct isar_hw *isar, const u8 *buf, int size)
                goto reterrflg;
        } else
                pr_debug("%s: ISAR general status event %x\n",
-                       isar->name, isar->bstat);
+                        isar->name, isar->bstat);
        /* 10ms delay */
        cnt = 10;
        while (cnt--)
@@ -387,7 +387,7 @@ load_firmware(struct isar_hw *isar, const u8 *buf, int size)
        } else {
                if ((isar->cmsb == ISAR_CTRL_SWVER) && (isar->clsb == 1)) {
                        pr_notice("%s: ISAR software version %#x\n",
-                               isar->name, isar->buf[0]);
+                                 isar->name, isar->buf[0]);
                } else {
                        pr_info("%s: ISAR wrong swver response (%x,%x)"
                                " cnt(%d)\n", isar->name, isar->cmsb,
@@ -431,7 +431,7 @@ isar_rcv_frame(struct isar_ch *ch)
        switch (ch->bch.state) {
        case ISDN_P_NONE:
                pr_debug("%s: ISAR protocol 0 spurious IIS_RDATA %x/%x/%x\n",
-                       ch->is->name, ch->is->iis, ch->is->cmsb, ch->is->clsb);
+                        ch->is->name, ch->is->iis, ch->is->cmsb, ch->is->clsb);
                ch->is->write_reg(ch->is->hw, ISAR_IIA, 0);
                break;
        case ISDN_P_B_RAW:
@@ -439,7 +439,7 @@ isar_rcv_frame(struct isar_ch *ch)
        case ISDN_P_B_MODEM_ASYNC:
                if (!ch->bch.rx_skb) {
                        ch->bch.rx_skb = mI_alloc_skb(ch->bch.maxlen,
-                                               GFP_ATOMIC);
+                                                     GFP_ATOMIC);
                        if (unlikely(!ch->bch.rx_skb)) {
                                pr_info("%s: B receive out of memory\n",
                                        ch->is->name);
@@ -453,7 +453,7 @@ isar_rcv_frame(struct isar_ch *ch)
        case ISDN_P_B_HDLC:
                if (!ch->bch.rx_skb) {
                        ch->bch.rx_skb = mI_alloc_skb(ch->bch.maxlen,
-                                               GFP_ATOMIC);
+                                                     GFP_ATOMIC);
                        if (unlikely(!ch->bch.rx_skb)) {
                                pr_info("%s: B receive out of memory\n",
                                        ch->is->name);
@@ -464,14 +464,14 @@ isar_rcv_frame(struct isar_ch *ch)
                if ((ch->bch.rx_skb->len + ch->is->clsb) >
                    (ch->bch.maxlen + 2)) {
                        pr_debug("%s: incoming packet too large\n",
-                               ch->is->name);
+                                ch->is->name);
                        ch->is->write_reg(ch->is->hw, ISAR_IIA, 0);
                        skb_trim(ch->bch.rx_skb, 0);
                        break;
                }
                if (ch->is->cmsb & HDLC_ERROR) {
                        pr_debug("%s: ISAR frame error %x len %d\n",
-                               ch->is->name, ch->is->cmsb, ch->is->clsb);
+                                ch->is->name, ch->is->cmsb, ch->is->clsb);
 #ifdef ERROR_STATISTIC
                        if (ch->is->cmsb & HDLC_ERR_RER)
                                ch->bch.err_inv++;
@@ -489,7 +489,7 @@ isar_rcv_frame(struct isar_ch *ch)
                if (ch->is->cmsb & HDLC_FED) {
                        if (ch->bch.rx_skb->len < 3) { /* last 2 are the FCS */
                                pr_debug("%s: ISAR frame to short %d\n",
-                                       ch->is->name, ch->bch.rx_skb->len);
+                                        ch->is->name, ch->bch.rx_skb->len);
                                skb_trim(ch->bch.rx_skb, 0);
                                break;
                        }
@@ -500,7 +500,7 @@ isar_rcv_frame(struct isar_ch *ch)
        case ISDN_P_B_T30_FAX:
                if (ch->state != STFAX_ACTIV) {
                        pr_debug("%s: isar_rcv_frame: not ACTIV\n",
-                               ch->is->name);
+                                ch->is->name);
                        ch->is->write_reg(ch->is->hw, ISAR_IIA, 0);
                        if (ch->bch.rx_skb)
                                skb_trim(ch->bch.rx_skb, 0);
@@ -508,7 +508,7 @@ isar_rcv_frame(struct isar_ch *ch)
                }
                if (!ch->bch.rx_skb) {
                        ch->bch.rx_skb = mI_alloc_skb(ch->bch.maxlen,
-                                               GFP_ATOMIC);
+                                                     GFP_ATOMIC);
                        if (unlikely(!ch->bch.rx_skb)) {
                                pr_info("%s: B receive out of memory\n",
                                        __func__);
@@ -519,14 +519,14 @@ isar_rcv_frame(struct isar_ch *ch)
                if (ch->cmd == PCTRL_CMD_FRM) {
                        rcv_mbox(ch->is, skb_put(ch->bch.rx_skb, ch->is->clsb));
                        pr_debug("%s: isar_rcv_frame: %d\n",
-                               ch->is->name, ch->bch.rx_skb->len);
+                                ch->is->name, ch->bch.rx_skb->len);
                        if (ch->is->cmsb & SART_NMD) { /* ABORT */
                                pr_debug("%s: isar_rcv_frame: no more data\n",
-                                       ch->is->name);
+                                        ch->is->name);
                                ch->is->write_reg(ch->is->hw, ISAR_IIA, 0);
                                send_mbox(ch->is, SET_DPS(ch->dpath) |
-                                       ISAR_HIS_PUMPCTRL, PCTRL_CMD_ESC,
-                                       0, NULL);
+                                         ISAR_HIS_PUMPCTRL, PCTRL_CMD_ESC,
+                                         0, NULL);
                                ch->state = STFAX_ESCAPE;
                                /* set_skb_flag(skb, DF_NOMOREDATA); */
                        }
@@ -537,7 +537,7 @@ isar_rcv_frame(struct isar_ch *ch)
                }
                if (ch->cmd != PCTRL_CMD_FRH) {
                        pr_debug("%s: isar_rcv_frame: unknown fax mode %x\n",
-                               ch->is->name, ch->cmd);
+                                ch->is->name, ch->cmd);
                        ch->is->write_reg(ch->is->hw, ISAR_IIA, 0);
                        if (ch->bch.rx_skb)
                                skb_trim(ch->bch.rx_skb, 0);
@@ -574,12 +574,12 @@ isar_rcv_frame(struct isar_ch *ch)
                }
                if (ch->is->cmsb & SART_NMD) { /* ABORT */
                        pr_debug("%s: isar_rcv_frame: no more data\n",
-                               ch->is->name);
+                                ch->is->name);
                        ch->is->write_reg(ch->is->hw, ISAR_IIA, 0);
                        if (ch->bch.rx_skb)
                                skb_trim(ch->bch.rx_skb, 0);
                        send_mbox(ch->is, SET_DPS(ch->dpath) |
-                               ISAR_HIS_PUMPCTRL, PCTRL_CMD_ESC, 0, NULL);
+                                 ISAR_HIS_PUMPCTRL, PCTRL_CMD_ESC, 0, NULL);
                        ch->state = STFAX_ESCAPE;
                        deliver_status(ch, HW_MOD_NOCARR);
                }
@@ -599,14 +599,14 @@ isar_fill_fifo(struct isar_ch *ch)
        u8 *ptr;
 
        pr_debug("%s: ch%d  tx_skb %p tx_idx %d\n",
-               ch->is->name, ch->bch.nr, ch->bch.tx_skb, ch->bch.tx_idx);
+                ch->is->name, ch->bch.nr, ch->bch.tx_skb, ch->bch.tx_idx);
        if (!ch->bch.tx_skb)
                return;
        count = ch->bch.tx_skb->len - ch->bch.tx_idx;
        if (count <= 0)
                return;
        if (!(ch->is->bstat &
-               (ch->dpath == 1 ? BSTAT_RDM1 : BSTAT_RDM2)))
+             (ch->dpath == 1 ? BSTAT_RDM1 : BSTAT_RDM2)))
                return;
        if (count > ch->mml) {
                msb = 0;
@@ -618,17 +618,17 @@ isar_fill_fifo(struct isar_ch *ch)
        if (!ch->bch.tx_idx) {
                pr_debug("%s: frame start\n", ch->is->name);
                if ((ch->bch.state == ISDN_P_B_T30_FAX) &&
-                       (ch->cmd == PCTRL_CMD_FTH)) {
+                   (ch->cmd == PCTRL_CMD_FTH)) {
                        if (count > 1) {
                                if ((ptr[0] == 0xff) && (ptr[1] == 0x13)) {
                                        /* last frame */
                                        test_and_set_bit(FLG_LASTDATA,
-                                               &ch->bch.Flags);
+                                                        &ch->bch.Flags);
                                        pr_debug("%s: set LASTDATA\n",
-                                               ch->is->name);
+                                                ch->is->name);
                                        if (msb == HDLC_FED)
                                                test_and_set_bit(FLG_DLEETX,
-                                                       &ch->bch.Flags);
+                                                                &ch->bch.Flags);
                                }
                        }
                }
@@ -643,21 +643,21 @@ isar_fill_fifo(struct isar_ch *ch)
        case ISDN_P_B_L2DTMF:
        case ISDN_P_B_MODEM_ASYNC:
                send_mbox(ch->is, SET_DPS(ch->dpath) | ISAR_HIS_SDATA,
-                       0, count, ptr);
+                         0, count, ptr);
                break;
        case ISDN_P_B_HDLC:
                send_mbox(ch->is, SET_DPS(ch->dpath) | ISAR_HIS_SDATA,
-                       msb, count, ptr);
+                         msb, count, ptr);
                break;
        case ISDN_P_B_T30_FAX:
                if (ch->state != STFAX_ACTIV)
                        pr_debug("%s: not ACTIV\n", ch->is->name);
                else if (ch->cmd == PCTRL_CMD_FTH)
                        send_mbox(ch->is, SET_DPS(ch->dpath) | ISAR_HIS_SDATA,
-                               msb, count, ptr);
+                                 msb, count, ptr);
                else if (ch->cmd == PCTRL_CMD_FTM)
                        send_mbox(ch->is, SET_DPS(ch->dpath) | ISAR_HIS_SDATA,
-                               0, count, ptr);
+                                 0, count, ptr);
                else
                        pr_debug("%s: not FTH/FTM\n", ch->is->name);
                break;
@@ -687,8 +687,8 @@ static void
 send_next(struct isar_ch *ch)
 {
        pr_debug("%s: %s ch%d tx_skb %p tx_idx %d\n",
-               ch->is->name, __func__, ch->bch.nr,
-               ch->bch.tx_skb, ch->bch.tx_idx);
+                ch->is->name, __func__, ch->bch.nr,
+                ch->bch.tx_skb, ch->bch.tx_idx);
        if (ch->bch.state == ISDN_P_B_T30_FAX) {
                if (ch->cmd == PCTRL_CMD_FTH) {
                        if (test_bit(FLG_LASTDATA, &ch->bch.Flags)) {
@@ -713,12 +713,12 @@ send_next(struct isar_ch *ch)
        else {
                if (test_and_clear_bit(FLG_DLEETX, &ch->bch.Flags)) {
                        if (test_and_clear_bit(FLG_LASTDATA,
-                           &ch->bch.Flags)) {
+                                              &ch->bch.Flags)) {
                                if (test_and_clear_bit(FLG_NMD_DATA,
-                                   &ch->bch.Flags)) {
+                                                      &ch->bch.Flags)) {
                                        u8 zd = 0;
                                        send_mbox(ch->is, SET_DPS(ch->dpath) |
-                                               ISAR_HIS_SDATA, 0x01, 1, &zd);
+                                                 ISAR_HIS_SDATA, 0x01, 1, &zd);
                                }
                                test_and_set_bit(FLG_LL_OK, &ch->bch.Flags);
                        } else {
@@ -738,7 +738,7 @@ check_send(struct isar_hw *isar, u8 rdm)
                ch = sel_bch_isar(isar, 1);
                if (ch && test_bit(FLG_ACTIVE, &ch->bch.Flags)) {
                        if (ch->bch.tx_skb && (ch->bch.tx_skb->len >
-                           ch->bch.tx_idx))
+                                              ch->bch.tx_idx))
                                isar_fill_fifo(ch);
                        else
                                send_next(ch);
@@ -748,7 +748,7 @@ check_send(struct isar_hw *isar, u8 rdm)
                ch = sel_bch_isar(isar, 2);
                if (ch && test_bit(FLG_ACTIVE, &ch->bch.Flags)) {
                        if (ch->bch.tx_skb && (ch->bch.tx_skb->len >
-                           ch->bch.tx_idx))
+                                              ch->bch.tx_idx))
                                isar_fill_fifo(ch);
                        else
                                send_next(ch);
@@ -757,10 +757,10 @@ check_send(struct isar_hw *isar, u8 rdm)
 }
 
 const char *dmril[] = {"NO SPEED", "1200/75", "NODEF2", "75/1200", "NODEF4",
-                       "300", "600", "1200", "2400", "4800", "7200",
-                       "9600nt", "9600t", "12000", "14400", "WRONG"};
+                      "300", "600", "1200", "2400", "4800", "7200",
+                      "9600nt", "9600t", "12000", "14400", "WRONG"};
 const char *dmrim[] = {"NO MOD", "NO DEF", "V32/V32b", "V22", "V21",
-                       "Bell103", "V23", "Bell202", "V17", "V29", "V27ter"};
+                      "Bell103", "V23", "Bell202", "V17", "V29", "V27ter"};
 
 static void
 isar_pump_status_rsp(struct isar_ch *ch) {
@@ -892,10 +892,10 @@ isar_pump_statev_fax(struct isar_ch *ch, u8 devt) {
                        pr_debug("%s: pump stev LINE_TX_H\n", ch->is->name);
                        ch->state = STFAX_CONT;
                        send_mbox(ch->is, dps | ISAR_HIS_PUMPCTRL,
-                               PCTRL_CMD_CONT, 0, NULL);
+                                 PCTRL_CMD_CONT, 0, NULL);
                } else {
                        pr_debug("%s: pump stev LINE_TX_H wrong st %x\n",
-                               ch->is->name, ch->state);
+                                ch->is->name, ch->state);
                }
                break;
        case PSEV_LINE_RX_H:
@@ -903,10 +903,10 @@ isar_pump_statev_fax(struct isar_ch *ch, u8 devt) {
                        pr_debug("%s: pump stev LINE_RX_H\n", ch->is->name);
                        ch->state = STFAX_CONT;
                        send_mbox(ch->is, dps | ISAR_HIS_PUMPCTRL,
-                               PCTRL_CMD_CONT, 0, NULL);
+                                 PCTRL_CMD_CONT, 0, NULL);
                } else {
                        pr_debug("%s: pump stev LINE_RX_H wrong st %x\n",
-                               ch->is->name, ch->state);
+                                ch->is->name, ch->state);
                }
                break;
        case PSEV_LINE_TX_B:
@@ -914,10 +914,10 @@ isar_pump_statev_fax(struct isar_ch *ch, u8 devt) {
                        pr_debug("%s: pump stev LINE_TX_B\n", ch->is->name);
                        ch->state = STFAX_CONT;
                        send_mbox(ch->is, dps | ISAR_HIS_PUMPCTRL,
-                               PCTRL_CMD_CONT, 0, NULL);
+                                 PCTRL_CMD_CONT, 0, NULL);
                } else {
                        pr_debug("%s: pump stev LINE_TX_B wrong st %x\n",
-                               ch->is->name, ch->state);
+                                ch->is->name, ch->state);
                }
                break;
        case PSEV_LINE_RX_B:
@@ -925,10 +925,10 @@ isar_pump_statev_fax(struct isar_ch *ch, u8 devt) {
                        pr_debug("%s: pump stev LINE_RX_B\n", ch->is->name);
                        ch->state = STFAX_CONT;
                        send_mbox(ch->is, dps | ISAR_HIS_PUMPCTRL,
-                               PCTRL_CMD_CONT, 0, NULL);
+                                 PCTRL_CMD_CONT, 0, NULL);
                } else {
                        pr_debug("%s: pump stev LINE_RX_B wrong st %x\n",
-                               ch->is->name, ch->state);
+                                ch->is->name, ch->state);
                }
                break;
        case PSEV_RSP_CONN:
@@ -941,19 +941,19 @@ isar_pump_statev_fax(struct isar_ch *ch, u8 devt) {
                                int delay = (ch->mod == 3) ? 1000 : 200;
                                /* 1s (200 ms) Flags before data */
                                if (test_and_set_bit(FLG_FTI_RUN,
-                                   &ch->bch.Flags))
+                                                    &ch->bch.Flags))
                                        del_timer(&ch->ftimer);
                                ch->ftimer.expires =
-                                       jiffies + ((delay * HZ)/1000);
+                                       jiffies + ((delay * HZ) / 1000);
                                test_and_set_bit(FLG_LL_CONN,
-                                       &ch->bch.Flags);
+                                                &ch->bch.Flags);
                                add_timer(&ch->ftimer);
                        } else {
                                deliver_status(ch, HW_MOD_CONNECT);
                        }
                } else {
                        pr_debug("%s: pump stev RSP_CONN wrong st %x\n",
-                               ch->is->name, ch->state);
+                                ch->is->name, ch->state);
                }
                break;
        case PSEV_FLAGS_DET:
@@ -961,7 +961,7 @@ isar_pump_statev_fax(struct isar_ch *ch, u8 devt) {
                break;
        case PSEV_RSP_DISC:
                pr_debug("%s: pump stev RSP_DISC state(%d)\n",
-                       ch->is->name, ch->state);
+                        ch->is->name, ch->state);
                if (ch->state == STFAX_ESCAPE) {
                        p1 = 5;
                        switch (ch->newcmd) {
@@ -972,7 +972,7 @@ isar_pump_statev_fax(struct isar_ch *ch, u8 devt) {
                                p1 = 2;
                        case PCTRL_CMD_FTH:
                                send_mbox(ch->is, dps | ISAR_HIS_PUMPCTRL,
-                                       PCTRL_CMD_SILON, 1, &p1);
+                                         PCTRL_CMD_SILON, 1, &p1);
                                ch->state = STFAX_SILDET;
                                break;
                        case PCTRL_CMD_FRH:
@@ -983,13 +983,13 @@ isar_pump_statev_fax(struct isar_ch *ch, u8 devt) {
                                ch->cmd = ch->newcmd;
                                ch->newcmd = 0;
                                send_mbox(ch->is, dps | ISAR_HIS_PUMPCTRL,
-                                       ch->cmd, 1, &p1);
+                                         ch->cmd, 1, &p1);
                                ch->state = STFAX_LINE;
                                ch->try_mod = 3;
                                break;
                        default:
                                pr_debug("%s: RSP_DISC unknown newcmd %x\n",
-                                       ch->is->name, ch->newcmd);
+                                        ch->is->name, ch->newcmd);
                                break;
                        }
                } else if (ch->state == STFAX_ACTIV) {
@@ -1015,7 +1015,7 @@ isar_pump_statev_fax(struct isar_ch *ch, u8 devt) {
                        ch->cmd = ch->newcmd;
                        ch->newcmd = 0;
                        send_mbox(ch->is, dps | ISAR_HIS_PUMPCTRL,
-                               ch->cmd, 1, &p1);
+                                 ch->cmd, 1, &p1);
                        ch->state = STFAX_LINE;
                        ch->try_mod = 3;
                }
@@ -1026,17 +1026,17 @@ isar_pump_statev_fax(struct isar_ch *ch, u8 devt) {
        case PSEV_RSP_FCERR:
                if (ch->state == STFAX_LINE) {
                        pr_debug("%s: pump stev RSP_FCERR try %d\n",
-                               ch->is->name, ch->try_mod);
+                                ch->is->name, ch->try_mod);
                        if (ch->try_mod--) {
                                send_mbox(ch->is, dps | ISAR_HIS_PUMPCTRL,
-                                       ch->cmd, 1, &ch->mod);
+                                         ch->cmd, 1, &ch->mod);
                                break;
                        }
                }
                pr_debug("%s: pump stev RSP_FCERR\n", ch->is->name);
                ch->state = STFAX_ESCAPE;
                send_mbox(ch->is, dps | ISAR_HIS_PUMPCTRL, PCTRL_CMD_ESC,
-                       0, NULL);
+                         0, NULL);
                deliver_status(ch, HW_MOD_FCERROR);
                break;
        default:
@@ -1057,8 +1057,8 @@ mISDNisar_irq(struct isar_hw *isar)
                        isar_rcv_frame(ch);
                else {
                        pr_debug("%s: ISAR spurious IIS_RDATA %x/%x/%x\n",
-                               isar->name, isar->iis, isar->cmsb,
-                               isar->clsb);
+                                isar->name, isar->iis, isar->cmsb,
+                                isar->clsb);
                        isar->write_reg(isar->hw, ISAR_IIA, 0);
                }
                break;
@@ -1078,7 +1078,7 @@ mISDNisar_irq(struct isar_hw *isar)
                }
 #endif
                pr_debug("%s: Buffer STEV dpath%d msb(%x)\n",
-                       isar->name, isar->iis>>6, isar->cmsb);
+                        isar->name, isar->iis >> 6, isar->cmsb);
                isar->write_reg(isar->hw, ISAR_IIA, 0);
                break;
        case ISAR_IIS_PSTEV:
@@ -1100,16 +1100,16 @@ mISDNisar_irq(struct isar_hw *isar)
                                        tt += 7;
                                tt |= DTMF_TONE_VAL;
                                _queue_data(&ch->bch.ch, PH_CONTROL_IND,
-                                       MISDN_ID_ANY, sizeof(tt), &tt,
-                                       GFP_ATOMIC);
+                                           MISDN_ID_ANY, sizeof(tt), &tt,
+                                           GFP_ATOMIC);
                        } else
                                pr_debug("%s: ISAR IIS_PSTEV pm %d sta %x\n",
-                                       isar->name, ch->bch.state,
-                                       isar->cmsb);
+                                        isar->name, ch->bch.state,
+                                        isar->cmsb);
                } else {
                        pr_debug("%s: ISAR spurious IIS_PSTEV %x/%x/%x\n",
-                               isar->name, isar->iis, isar->cmsb,
-                               isar->clsb);
+                                isar->name, isar->iis, isar->cmsb,
+                                isar->clsb);
                        isar->write_reg(isar->hw, ISAR_IIA, 0);
                }
                break;
@@ -1120,8 +1120,8 @@ mISDNisar_irq(struct isar_hw *isar)
                        isar_pump_status_rsp(ch);
                } else {
                        pr_debug("%s: ISAR spurious IIS_PSTRSP %x/%x/%x\n",
-                               isar->name, isar->iis, isar->cmsb,
-                               isar->clsb);
+                                isar->name, isar->iis, isar->cmsb,
+                                isar->clsb);
                        isar->write_reg(isar->hw, ISAR_IIA, 0);
                }
                break;
@@ -1137,7 +1137,7 @@ mISDNisar_irq(struct isar_hw *isar)
        default:
                rcv_mbox(isar, NULL);
                pr_debug("%s: unhandled msg iis(%x) ctrl(%x/%x)\n",
-                       isar->name, isar->iis, isar->cmsb, isar->clsb);
+                        isar->name, isar->iis, isar->cmsb, isar->clsb);
                break;
        }
 }
@@ -1169,11 +1169,11 @@ setup_pump(struct isar_ch *ch) {
                if (test_bit(FLG_DTMFSEND, &ch->bch.Flags)) {
                        param[0] = 5; /* TOA 5 db */
                        send_mbox(ch->is, dps | ISAR_HIS_PUMPCFG,
-                               PMOD_DTMF_TRANS, 1, param);
+                                 PMOD_DTMF_TRANS, 1, param);
                } else {
                        param[0] = 40; /* REL -46 dbm */
                        send_mbox(ch->is, dps | ISAR_HIS_PUMPCFG,
-                               PMOD_DTMF, 1, param);
+                                 PMOD_DTMF, 1, param);
                }
        case ISDN_P_B_MODEM_ASYNC:
                ctrl = PMOD_DATAMODEM;
@@ -1220,17 +1220,17 @@ setup_sart(struct isar_ch *ch) {
        switch (ch->bch.state) {
        case ISDN_P_NONE:
                send_mbox(ch->is, dps | ISAR_HIS_SARTCFG, SMODE_DISABLE,
-                       0, NULL);
+                         0, NULL);
                break;
        case ISDN_P_B_RAW:
        case ISDN_P_B_L2DTMF:
                send_mbox(ch->is, dps | ISAR_HIS_SARTCFG, SMODE_BINARY,
-                       2, param);
+                         2, param);
                break;
        case ISDN_P_B_HDLC:
        case ISDN_P_B_T30_FAX:
                send_mbox(ch->is, dps | ISAR_HIS_SARTCFG, SMODE_HDLC,
-                       1, param);
+                         1, param);
                break;
        case ISDN_P_B_MODEM_ASYNC:
                ctrl = SMODE_V14 | SCTRL_HDMC_BOTH;
@@ -1297,7 +1297,7 @@ modeisar(struct isar_ch *ch, u32 bprotocol)
                        if (!test_and_set_bit(ISAR_DP2_USE, &ch->is->Flags))
                                ch->dpath = 2;
                        else if (!test_and_set_bit(ISAR_DP1_USE,
-                           &ch->is->Flags))
+                                                  &ch->is->Flags))
                                ch->dpath = 1;
                        else {
                                pr_info("modeisar both pathes in use\n");
@@ -1307,7 +1307,7 @@ modeisar(struct isar_ch *ch, u32 bprotocol)
                                test_and_set_bit(FLG_HDLC, &ch->bch.Flags);
                        else
                                test_and_set_bit(FLG_TRANSPARENT,
-                                       &ch->bch.Flags);
+                                                &ch->bch.Flags);
                        break;
                case ISDN_P_B_MODEM_ASYNC:
                case ISDN_P_B_T30_FAX:
@@ -1328,7 +1328,7 @@ modeisar(struct isar_ch *ch, u32 bprotocol)
                }
        }
        pr_debug("%s: ISAR ch%d dp%d protocol %x->%x\n", ch->is->name,
-               ch->bch.nr, ch->dpath, ch->bch.state, bprotocol);
+                ch->bch.nr, ch->dpath, ch->bch.state, bprotocol);
        ch->bch.state = bprotocol;
        setup_pump(ch);
        setup_iom2(ch);
@@ -1353,7 +1353,7 @@ isar_pump_cmd(struct isar_ch *ch, u32 cmd, u8 para)
        u8 ctrl = 0, nom = 0, p1 = 0;
 
        pr_debug("%s: isar_pump_cmd %x/%x state(%x)\n",
-               ch->is->name, cmd, para, ch->bch.state);
+                ch->is->name, cmd, para, ch->bch.state);
        switch (cmd) {
        case HW_MOD_FTM:
                if (ch->state == STFAX_READY) {
@@ -1367,7 +1367,7 @@ isar_pump_cmd(struct isar_ch *ch, u32 cmd, u8 para)
                        ch->newcmd = 0;
                        ch->try_mod = 3;
                } else if ((ch->state == STFAX_ACTIV) &&
-                   (ch->cmd == PCTRL_CMD_FTM) && (ch->mod == para))
+                          (ch->cmd == PCTRL_CMD_FTM) && (ch->mod == para))
                        deliver_status(ch, HW_MOD_CONNECT);
                else {
                        ch->newmod = para;
@@ -1389,8 +1389,8 @@ isar_pump_cmd(struct isar_ch *ch, u32 cmd, u8 para)
                        ch->newcmd = 0;
                        ch->try_mod = 3;
                } else if ((ch->state == STFAX_ACTIV) &&
-                   (ch->cmd == PCTRL_CMD_FTH) && (ch->mod == para))
-                               deliver_status(ch, HW_MOD_CONNECT);
+                          (ch->cmd == PCTRL_CMD_FTH) && (ch->mod == para))
+                       deliver_status(ch, HW_MOD_CONNECT);
                else {
                        ch->newmod = para;
                        ch->newcmd = PCTRL_CMD_FTH;
@@ -1411,7 +1411,7 @@ isar_pump_cmd(struct isar_ch *ch, u32 cmd, u8 para)
                        ch->newcmd = 0;
                        ch->try_mod = 3;
                } else if ((ch->state == STFAX_ACTIV) &&
-                   (ch->cmd == PCTRL_CMD_FRM) && (ch->mod == para))
+                          (ch->cmd == PCTRL_CMD_FRM) && (ch->mod == para))
                        deliver_status(ch, HW_MOD_CONNECT);
                else {
                        ch->newmod = para;
@@ -1433,7 +1433,7 @@ isar_pump_cmd(struct isar_ch *ch, u32 cmd, u8 para)
                        ch->newcmd = 0;
                        ch->try_mod = 3;
                } else if ((ch->state == STFAX_ACTIV) &&
-                   (ch->cmd == PCTRL_CMD_FRH) && (ch->mod == para))
+                          (ch->cmd == PCTRL_CMD_FRH) && (ch->mod == para))
                        deliver_status(ch, HW_MOD_CONNECT);
                else {
                        ch->newmod = para;
@@ -1464,7 +1464,7 @@ isar_setup(struct isar_hw *isar)
        for (i = 0; i < 2; i++) {
                /* Buffer Config */
                send_mbox(isar, (i ? ISAR_HIS_DPS2 : ISAR_HIS_DPS1) |
-                       ISAR_HIS_P12CFG, 4, 1, &msg);
+                         ISAR_HIS_P12CFG, 4, 1, &msg);
                isar->ch[i].mml = msg;
                isar->ch[i].bch.state = 0;
                isar->ch[i].dpath = i + 1;
@@ -1505,7 +1505,7 @@ isar_l2l1(struct mISDNchannel *ch, struct sk_buff *skb)
                spin_unlock_irqrestore(ich->is->hwlock, flags);
                if (!ret)
                        _queue_data(ch, PH_ACTIVATE_IND, MISDN_ID_ANY, 0,
-                               NULL, GFP_KERNEL);
+                                   NULL, GFP_KERNEL);
                break;
        case PH_DEACTIVATE_REQ:
                spin_lock_irqsave(ich->is->hwlock, flags);
@@ -1513,15 +1513,15 @@ isar_l2l1(struct mISDNchannel *ch, struct sk_buff *skb)
                modeisar(ich, ISDN_P_NONE);
                spin_unlock_irqrestore(ich->is->hwlock, flags);
                _queue_data(ch, PH_DEACTIVATE_IND, MISDN_ID_ANY, 0,
-                       NULL, GFP_KERNEL);
+                           NULL, GFP_KERNEL);
                ret = 0;
                break;
        case PH_CONTROL_REQ:
                val = (u32 *)skb->data;
                pr_debug("%s: PH_CONTROL | REQUEST %x/%x\n", ich->is->name,
-                       hh->id, *val);
+                        hh->id, *val);
                if ((hh->id == 0) && ((*val & ~DTMF_TONE_MASK) ==
-                   DTMF_TONE_VAL)) {
+                                     DTMF_TONE_VAL)) {
                        if (bch->state == ISDN_P_B_L2DTMF) {
                                char tt = *val & DTMF_TONE_MASK;
 
@@ -1541,7 +1541,7 @@ isar_l2l1(struct mISDNchannel *ch, struct sk_buff *skb)
                                return -EINVAL;
                        }
                } else if ((hh->id == HW_MOD_FRM) || (hh->id == HW_MOD_FRH) ||
-                   (hh->id == HW_MOD_FTM) || (hh->id == HW_MOD_FTH)) {
+                          (hh->id == HW_MOD_FTM) || (hh->id == HW_MOD_FTH)) {
                        for (id = 0; id < FAXMODCNT; id++)
                                if (faxmodulation[id] == *val)
                                        break;
@@ -1581,7 +1581,7 @@ channel_bctrl(struct bchannel *bch, struct mISDN_ctrl_req *cq)
        case MISDN_CTRL_GETOP:
                cq->op = 0;
                break;
-       /* Nothing implemented yet */
+               /* Nothing implemented yet */
        case MISDN_CTRL_FILL_EMPTY:
        default:
                pr_info("%s: unknown Op %x\n", __func__, cq->op);
@@ -1647,7 +1647,7 @@ init_isar(struct isar_hw *isar)
                isar->version = ISARVersion(isar);
                if (isar->ch[0].bch.debug & DEBUG_HW)
                        pr_notice("%s: Testing version %d (%d time)\n",
-                               isar->name, isar->version, 3 - cnt);
+                                 isar->name, isar->version, 3 - cnt);
                if (isar->version == 1)
                        break;
                isar->ctrl(isar->hw, HW_RESET_REQ, 0);
index 5ef9f11..dd6de9f 100644 (file)
@@ -191,7 +191,7 @@ fill_mem(struct tiger_ch *bc, u32 idx, u32 cnt, u32 fill)
        u32 mask = 0xff, val;
 
        pr_debug("%s: B%1d fill %02x len %d idx %d/%d\n", card->name,
-               bc->bch.nr, fill, cnt, idx, card->send.idx);
+                bc->bch.nr, fill, cnt, idx, card->send.idx);
        if (bc->bch.nr & 2) {
                fill  <<= 8;
                mask <<= 8;
@@ -213,7 +213,7 @@ mode_tiger(struct tiger_ch *bc, u32 protocol)
        struct tiger_hw *card = bc->bch.hw;
 
        pr_debug("%s: B%1d protocol %x-->%x\n", card->name,
-               bc->bch.nr, bc->bch.state, protocol);
+                bc->bch.nr, bc->bch.state, protocol);
        switch (protocol) {
        case ISDN_P_NONE:
                if (bc->bch.state == ISDN_P_NONE)
@@ -237,7 +237,7 @@ mode_tiger(struct tiger_ch *bc, u32 protocol)
                test_and_set_bit(FLG_TRANSPARENT, &bc->bch.Flags);
                bc->bch.state = protocol;
                bc->idx = 0;
-               bc->free = card->send.size/2;
+               bc->free = card->send.size / 2;
                bc->rxstate = 0;
                bc->txstate = TX_INIT | TX_IDLE;
                bc->lastrx = -1;
@@ -251,7 +251,7 @@ mode_tiger(struct tiger_ch *bc, u32 protocol)
                test_and_set_bit(FLG_HDLC, &bc->bch.Flags);
                bc->bch.state = protocol;
                bc->idx = 0;
-               bc->free = card->send.size/2;
+               bc->free = card->send.size / 2;
                bc->rxstate = 0;
                bc->txstate = TX_INIT | TX_IDLE;
                isdnhdlc_rcv_init(&bc->hrecv, 0);
@@ -273,12 +273,12 @@ mode_tiger(struct tiger_ch *bc, u32 protocol)
        card->send.idx = (card->send.dmacur - card->send.dmastart) >> 2;
        card->recv.idx = (card->recv.dmacur - card->recv.dmastart) >> 2;
        pr_debug("%s: %s ctrl %x irq  %02x/%02x idx %d/%d\n",
-               card->name, __func__,
-               inb(card->base + NJ_DMACTRL),
-               inb(card->base + NJ_IRQMASK0),
-               inb(card->base + NJ_IRQSTAT0),
-               card->send.idx,
-               card->recv.idx);
+                card->name, __func__,
+                inb(card->base + NJ_DMACTRL),
+                inb(card->base + NJ_IRQMASK0),
+                inb(card->base + NJ_IRQSTAT0),
+                card->send.idx,
+                card->recv.idx);
        return 0;
 }
 
@@ -311,7 +311,7 @@ inittiger(struct tiger_hw *card)
        int i;
 
        card->dma_p = pci_alloc_consistent(card->pdev, NJ_DMA_SIZE,
-                       &card->dma);
+                                          &card->dma);
        if (!card->dma_p) {
                pr_info("%s: No DMA memory\n", card->name);
                return -ENOMEM;
@@ -344,9 +344,9 @@ inittiger(struct tiger_hw *card)
 
        if (debug & DEBUG_HW)
                pr_notice("%s: send buffer phy %#x - %#x - %#x  virt %p"
-                       " size %zu u32\n", card->name,
-                       card->send.dmastart, card->send.dmairq,
-                       card->send.dmaend, card->send.start, card->send.size);
+                         " size %zu u32\n", card->name,
+                         card->send.dmastart, card->send.dmairq,
+                         card->send.dmaend, card->send.start, card->send.size);
 
        outl(card->send.dmastart, card->base + NJ_DMA_READ_START);
        outl(card->send.dmairq, card->base + NJ_DMA_READ_IRQ);
@@ -362,9 +362,9 @@ inittiger(struct tiger_hw *card)
 
        if (debug & DEBUG_HW)
                pr_notice("%s: recv buffer phy %#x - %#x - %#x  virt %p"
-                       " size %zu u32\n", card->name,
-                       card->recv.dmastart, card->recv.dmairq,
-                       card->recv.dmaend, card->recv.start, card->recv.size);
+                         " size %zu u32\n", card->name,
+                         card->recv.dmastart, card->recv.dmairq,
+                         card->recv.dmaend, card->recv.start, card->recv.size);
 
        outl(card->recv.dmastart, card->base + NJ_DMA_WRITE_START);
        outl(card->recv.dmairq, card->base + NJ_DMA_WRITE_IRQ);
@@ -398,7 +398,7 @@ read_dma(struct tiger_ch *bc, u32 idx, int cnt)
        if (test_bit(FLG_TRANSPARENT, &bc->bch.Flags)) {
                if ((bc->bch.rx_skb->len + cnt) > bc->bch.maxlen) {
                        pr_debug("%s: B%1d overrun %d\n", card->name,
-                               bc->bch.nr, bc->bch.rx_skb->len + cnt);
+                                bc->bch.nr, bc->bch.rx_skb->len + cnt);
                        skb_trim(bc->bch.rx_skb, 0);
                        return;
                }
@@ -418,8 +418,8 @@ read_dma(struct tiger_ch *bc, u32 idx, int cnt)
 next_frame:
        if (test_bit(FLG_HDLC, &bc->bch.Flags)) {
                stat = isdnhdlc_decode(&bc->hrecv, pn, cnt, &i,
-                       bc->bch.rx_skb->data, bc->bch.maxlen);
-               if (stat > 0) /* valid frame received */ 
+                                      bc->bch.rx_skb->data, bc->bch.maxlen);
+               if (stat > 0) /* valid frame received */
                        p = skb_put(bc->bch.rx_skb, stat);
                else if (stat == -HDLC_CRC_ERROR)
                        pr_info("%s: B%1d receive frame CRC error\n",
@@ -431,14 +431,14 @@ next_frame:
                        pr_info("%s: B%1d receive frame too long (> %d)\n",
                                card->name, bc->bch.nr, bc->bch.maxlen);
        } else
-               stat = cnt;     
+               stat = cnt;
 
        if (stat > 0) {
                if (debug & DEBUG_HW_BFIFO) {
                        snprintf(card->log, LOG_SIZE, "B%1d-recv %s %d ",
-                               bc->bch.nr, card->name, stat);
+                                bc->bch.nr, card->name, stat);
                        print_hex_dump_bytes(card->log, DUMP_PREFIX_OFFSET,
-                               p, stat);
+                                            p, stat);
                }
                recv_Bchannel(&bc->bch, 0);
        }
@@ -447,7 +447,7 @@ next_frame:
                cnt -= i;
                if (!bc->bch.rx_skb) {
                        bc->bch.rx_skb = mI_alloc_skb(bc->bch.maxlen,
-                               GFP_ATOMIC);
+                                                     GFP_ATOMIC);
                        if (!bc->bch.rx_skb) {
                                pr_info("%s: B%1d receive out of memory\n",
                                        card->name, bc->bch.nr);
@@ -498,7 +498,7 @@ resync(struct tiger_ch *bc, struct tiger_hw *card)
                bc->idx = card->recv.size - 1;
        bc->txstate = TX_RUN;
        pr_debug("%s: %s B%1d free %d idx %d/%d\n", card->name,
-               __func__, bc->bch.nr, bc->free, bc->idx, card->send.idx);
+                __func__, bc->bch.nr, bc->free, bc->idx, card->send.idx);
 }
 
 static int bc_next_frame(struct tiger_ch *);
@@ -514,14 +514,14 @@ fill_hdlc_flag(struct tiger_ch *bc)
        if (bc->free == 0)
                return;
        pr_debug("%s: %s B%1d %d state %x idx %d/%d\n", card->name,
-               __func__, bc->bch.nr, bc->free, bc->txstate,
-               bc->idx, card->send.idx);
+                __func__, bc->bch.nr, bc->free, bc->txstate,
+                bc->idx, card->send.idx);
        if (bc->txstate & (TX_IDLE | TX_INIT | TX_UNDERRUN))
                resync(bc, card);
        count = isdnhdlc_encode(&bc->hsend, NULL, 0, &i,
-                       bc->hsbuf, bc->free);
+                               bc->hsbuf, bc->free);
        pr_debug("%s: B%1d hdlc encoded %d flags\n", card->name,
-                       bc->bch.nr, count);
+                bc->bch.nr, count);
        bc->free -= count;
        p = bc->hsbuf;
        m = (bc->bch.nr & 1) ? 0xffffff00 : 0xffff00ff;
@@ -535,7 +535,7 @@ fill_hdlc_flag(struct tiger_ch *bc)
        }
        if (debug & DEBUG_HW_BFIFO) {
                snprintf(card->log, LOG_SIZE, "B%1d-send %s %d ",
-                       bc->bch.nr, card->name, count);
+                        bc->bch.nr, card->name, count);
                print_hex_dump_bytes(card->log, DUMP_PREFIX_OFFSET, p, count);
        }
 }
@@ -554,16 +554,16 @@ fill_dma(struct tiger_ch *bc)
        if (count <= 0)
                return;
        pr_debug("%s: %s B%1d %d/%d/%d/%d state %x idx %d/%d\n", card->name,
-               __func__, bc->bch.nr, count, bc->free, bc->bch.tx_idx,
-               bc->bch.tx_skb->len, bc->txstate, bc->idx, card->send.idx);
+                __func__, bc->bch.nr, count, bc->free, bc->bch.tx_idx,
+                bc->bch.tx_skb->len, bc->txstate, bc->idx, card->send.idx);
        if (bc->txstate & (TX_IDLE | TX_INIT | TX_UNDERRUN))
                resync(bc, card);
        p = bc->bch.tx_skb->data + bc->bch.tx_idx;
        if (test_bit(FLG_HDLC, &bc->bch.Flags)) {
                count = isdnhdlc_encode(&bc->hsend, p, count, &i,
-                       bc->hsbuf, bc->free);
+                                       bc->hsbuf, bc->free);
                pr_debug("%s: B%1d hdlc encoded %d in %d\n", card->name,
-                       bc->bch.nr, i, count);
+                        bc->bch.nr, i, count);
                bc->bch.tx_idx += i;
                bc->free -= count;
                p = bc->hsbuf;
@@ -584,7 +584,7 @@ fill_dma(struct tiger_ch *bc)
        }
        if (debug & DEBUG_HW_BFIFO) {
                snprintf(card->log, LOG_SIZE, "B%1d-send %s %d ",
-                       bc->bch.nr, card->name, count);
+                        bc->bch.nr, card->name, count);
                print_hex_dump_bytes(card->log, DUMP_PREFIX_OFFSET, p, count);
        }
        if (bc->free)
@@ -633,7 +633,7 @@ send_tiger_bc(struct tiger_hw *card, struct tiger_ch *bc)
                        return;
                }
                pr_debug("%s: B%1d TX no data free %d idx %d/%d\n", card->name,
-                       bc->bch.nr, bc->free, bc->idx, card->send.idx);
+                        bc->bch.nr, bc->free, bc->idx, card->send.idx);
                if (!(bc->txstate & (TX_IDLE | TX_INIT))) {
                        fill_mem(bc, bc->idx, bc->free, 0xff);
                        if (bc->free == card->send.size)
@@ -706,8 +706,8 @@ nj_irq(int intno, void *dev_id)
                s0val |= 0x01;  /* the 1st read area is free */
 
        pr_debug("%s: DMA Status %02x/%02x/%02x %d/%d\n", card->name,
-               s1val, s0val, card->last_is0,
-               card->recv.idx, card->send.idx);
+                s1val, s0val, card->last_is0,
+                card->recv.idx, card->send.idx);
        /* test if we have a DMA interrupt */
        if (s0val != card->last_is0) {
                if ((s0val & NJ_IRQM0_RD_MASK) !=
@@ -758,7 +758,7 @@ nj_l2l1B(struct mISDNchannel *ch, struct sk_buff *skb)
                spin_unlock_irqrestore(&card->lock, flags);
                if (!ret)
                        _queue_data(ch, PH_ACTIVATE_IND, MISDN_ID_ANY, 0,
-                               NULL, GFP_KERNEL);
+                                   NULL, GFP_KERNEL);
                break;
        case PH_DEACTIVATE_REQ:
                spin_lock_irqsave(&card->lock, flags);
@@ -766,7 +766,7 @@ nj_l2l1B(struct mISDNchannel *ch, struct sk_buff *skb)
                mode_tiger(bc, ISDN_P_NONE);
                spin_unlock_irqrestore(&card->lock, flags);
                _queue_data(ch, PH_DEACTIVATE_IND, MISDN_ID_ANY, 0,
-                       NULL, GFP_KERNEL);
+                           NULL, GFP_KERNEL);
                ret = 0;
                break;
        }
@@ -785,7 +785,7 @@ channel_bctrl(struct tiger_ch *bc, struct mISDN_ctrl_req *cq)
        case MISDN_CTRL_GETOP:
                cq->op = 0;
                break;
-       /* Nothing implemented yet */
+               /* Nothing implemented yet */
        case MISDN_CTRL_FILL_EMPTY:
        default:
                pr_info("%s: %s unknown Op %x\n", card->name, __func__, cq->op);
@@ -900,7 +900,7 @@ nj_dctrl(struct mISDNchannel *ch, u32 cmd, void *arg)
                break;
        case CLOSE_CHANNEL:
                pr_debug("%s: dev(%d) close from %p\n", card->name, dch->dev.id,
-                       __builtin_return_address(0));
+                        __builtin_return_address(0));
                module_put(THIS_MODULE);
                break;
        case CONTROL_CHANNEL:
@@ -908,7 +908,7 @@ nj_dctrl(struct mISDNchannel *ch, u32 cmd, void *arg)
                break;
        default:
                pr_debug("%s: %s unknown command %x\n",
-                       card->name, __func__, cmd);
+                        card->name, __func__, cmd);
                return -EINVAL;
        }
        return err;
@@ -968,7 +968,7 @@ nj_release(struct tiger_hw *card)
                free_irq(card->irq, card);
        if (card->isac.dch.dev.dev.class)
                mISDN_unregister_device(&card->isac.dch.dev);
-       
+
        for (i = 0; i < 2; i++) {
                mISDN_freebchannel(&card->bc[i].bch);
                kfree(card->bc[i].hsbuf);
@@ -976,7 +976,7 @@ nj_release(struct tiger_hw *card)
        }
        if (card->dma_p)
                pci_free_consistent(card->pdev, NJ_DMA_SIZE,
-                       card->dma_p, card->dma);
+                                   card->dma_p, card->dma);
        write_lock_irqsave(&card_lock, flags);
        list_del(&card->list);
        write_unlock_irqrestore(&card_lock, flags);
@@ -1033,14 +1033,14 @@ setup_instance(struct tiger_hw *card)
                card->bc[i].bch.ch.ctrl = nj_bctrl;
                card->bc[i].bch.ch.nr = i + 1;
                list_add(&card->bc[i].bch.ch.list,
-                       &card->isac.dch.dev.bchannels);
+                        &card->isac.dch.dev.bchannels);
                card->bc[i].bch.hw = card;
        }
        err = nj_setup(card);
        if (err)
                goto error;
        err = mISDN_register_device(&card->isac.dch.dev, &card->pdev->dev,
-               card->name);
+                                   card->name);
        if (err)
                goto error;
        err = nj_init_card(card);
@@ -1074,7 +1074,7 @@ nj_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
        }
 
        if (pdev->subsystem_vendor == 0xb100 &&
-           pdev->subsystem_device == 0x0003 ) {
+           pdev->subsystem_device == 0x0003) {
                pr_notice("Netjet: Digium TDM400P not handled yet\n");
                return -ENODEV;
        }
@@ -1094,7 +1094,7 @@ nj_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
        }
 
        printk(KERN_INFO "nj_probe(mISDN): found adapter at %s\n",
-               pci_name(pdev));
+              pci_name(pdev));
 
        pci_set_master(pdev);
 
index d061ff9..ddd41ef 100644 (file)
@@ -55,4 +55,3 @@
 /* 2 * 64 byte is a compromise between IRQ count and latency */
 #define NJ_DMA_RXSIZE          128  /* 2 * 64 */
 #define NJ_DMA_TXSIZE          128  /* 2 * 64 */
-
index 4d0d41e..0468993 100644 (file)
@@ -147,10 +147,10 @@ Start_ISAR:
                goto Start_ISAR;
        if (cnt < irqloops)
                pr_debug("%s: %d irqloops cpu%d\n", sf->name,
-                       irqloops - cnt, smp_processor_id());
+                        irqloops - cnt, smp_processor_id());
        if (irqloops && !cnt)
                pr_notice("%s: %d IRQ LOOP cpu%d\n", sf->name,
-                       irqloops, smp_processor_id());
+                         irqloops, smp_processor_id());
        spin_unlock(&sf->lock);
        return IRQ_HANDLED;
 }
@@ -266,7 +266,7 @@ sfax_dctrl(struct mISDNchannel *ch, u32 cmd, void *arg)
                break;
        case CLOSE_CHANNEL:
                pr_debug("%s: dev(%d) close from %p\n", sf->name,
-                       dch->dev.id, __builtin_return_address(0));
+                        dch->dev.id, __builtin_return_address(0));
                module_put(THIS_MODULE);
                break;
        case CONTROL_CHANNEL:
@@ -306,10 +306,10 @@ init_card(struct sfax_hw *sf)
                msleep_interruptible(10);
                if (debug & DEBUG_HW)
                        pr_notice("%s: IRQ %d count %d\n", sf->name,
-                               sf->irq, sf->irqcnt);
+                                 sf->irq, sf->irqcnt);
                if (!sf->irqcnt) {
                        pr_info("%s: IRQ(%d) got no requests during init %d\n",
-                              sf->name, sf->irq, 3 - cnt);
+                               sf->name, sf->irq, 3 - cnt);
                } else
                        return 0;
        }
@@ -325,7 +325,7 @@ setup_speedfax(struct sfax_hw *sf)
 
        if (!request_region(sf->cfg, 256, sf->name)) {
                pr_info("mISDN: %s config port %x-%x already in use\n",
-                      sf->name, sf->cfg, sf->cfg + 255);
+                       sf->name, sf->cfg, sf->cfg + 255);
                return -EIO;
        }
        outb(0xff, sf->cfg);
@@ -396,7 +396,7 @@ setup_instance(struct sfax_hw *card)
        }
        if (debug & DEBUG_HW)
                pr_notice("%s: got firmware %zu bytes\n",
-                       card->name, firmware->size);
+                         card->name, firmware->size);
 
        mISDNisac_init(&card->isac, card);
 
@@ -406,7 +406,7 @@ setup_instance(struct sfax_hw *card)
        for (i = 0; i < 2; i++) {
                set_channelmap(i + 1, card->isac.dch.dev.channelmap);
                list_add(&card->isar.ch[i].bch.ch.list,
-                       &card->isac.dch.dev.bchannels);
+                        &card->isac.dch.dev.bchannels);
        }
 
        err = setup_speedfax(card);
@@ -416,7 +416,7 @@ setup_instance(struct sfax_hw *card)
        if (err)
                goto error;
        err = mISDN_register_device(&card->isac.dch.dev,
-               &card->pdev->dev, card->name);
+                                   &card->pdev->dev, card->name);
        if (err)
                goto error;
        err = init_card(card);
@@ -466,7 +466,7 @@ sfaxpci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
        }
 
        pr_notice("mISDN: Speedfax found adapter %s at %s\n",
-               (char *)ent->driver_data, pci_name(pdev));
+                 (char *)ent->driver_data, pci_name(pdev));
 
        card->cfg = pci_resource_start(pdev, 0);
        card->irq = pdev->irq;
@@ -514,7 +514,7 @@ Speedfax_init(void)
        int err;
 
        pr_notice("Sedlbauer Speedfax+ Driver Rev. %s\n",
-               SPEEDFAX_REV);
+                 SPEEDFAX_REV);
        err = pci_register_driver(&sfaxpci_driver);
        return err;
 }
index e10e028..7f1e7ba 100644 (file)
@@ -171,7 +171,7 @@ W6692Version(struct w6692_hw *card)
 
        val = ReadW6692(card, W_D_RBCH);
        pr_notice("%s: Winbond W6692 version: %s\n", card->name,
-               W6692Ver[(val >> 6) & 3]);
+                 W6692Ver[(val >> 6) & 3]);
 }
 
 static void
@@ -248,7 +248,7 @@ W6692_ph_bh(struct dchannel *dch)
                break;
        default:
                pr_debug("%s: TE unknown state %02x dch state %02x\n",
-                       card->name, card->state, dch->state);
+                        card->name, card->state, dch->state);
                break;
        }
        pr_debug("%s: TE newstate %02x\n", card->name, dch->state);
@@ -271,7 +271,7 @@ W6692_empty_Dfifo(struct w6692_hw *card, int count)
        }
        if ((dch->rx_skb->len + count) >= dch->maxlen) {
                pr_debug("%s: empty_Dfifo overrun %d\n", card->name,
-                       dch->rx_skb->len + count);
+                        dch->rx_skb->len + count);
                WriteW6692(card, W_D_CMDR, W_D_CMDR_RACK);
                return;
        }
@@ -280,7 +280,7 @@ W6692_empty_Dfifo(struct w6692_hw *card, int count)
        WriteW6692(card, W_D_CMDR, W_D_CMDR_RACK);
        if (debug & DEBUG_HW_DFIFO) {
                snprintf(card->log, 63, "D-recv %s %d ",
-                       card->name, count);
+                        card->name, count);
                print_hex_dump_bytes(card->log, DUMP_PREFIX_OFFSET, ptr, count);
        }
 }
@@ -312,11 +312,11 @@ W6692_fill_Dfifo(struct w6692_hw *card)
                del_timer(&dch->timer);
        }
        init_timer(&dch->timer);
-       dch->timer.expires = jiffies + ((DBUSY_TIMER_VALUE * HZ)/1000);
+       dch->timer.expires = jiffies + ((DBUSY_TIMER_VALUE * HZ) / 1000);
        add_timer(&dch->timer);
        if (debug & DEBUG_HW_DFIFO) {
                snprintf(card->log, 63, "D-send %s %d ",
-                       card->name, count);
+                        card->name, count);
                print_hex_dump_bytes(card->log, DUMP_PREFIX_OFFSET, ptr, count);
        }
 }
@@ -426,7 +426,7 @@ handle_statusD(struct w6692_hw *card)
        if (exval & W_D_EXI_MOC) {      /* MOC - not supported */
                v1 = ReadW6692(card, W_MOSR);
                pr_debug("%s: spurious MOC interrupt MOSR %02x\n",
-                       card->name, v1);
+                        card->name, v1);
        }
        if (exval & W_D_EXI_ISC) {      /* ISC - Level1 change */
                cir = ReadW6692(card, W_CIR);
@@ -434,7 +434,7 @@ handle_statusD(struct w6692_hw *card)
                if (cir & W_CIR_ICC) {
                        v1 = cir & W_CIR_COD_MASK;
                        pr_debug("%s: ph_state_change %x -> %x\n", card->name,
-                               dch->state, v1);
+                                dch->state, v1);
                        card->state = v1;
                        if (card->fmask & led) {
                                switch (v1) {
@@ -479,13 +479,13 @@ W6692_empty_Bfifo(struct w6692_ch *wch, int count)
                if (unlikely(!wch->bch.rx_skb)) {
                        pr_info("%s: B receive out of memory\n", card->name);
                        WriteW6692B(wch, W_B_CMDR, W_B_CMDR_RACK |
-                               W_B_CMDR_RACT);
+                                   W_B_CMDR_RACT);
                        return;
                }
        }
        if (wch->bch.rx_skb->len + count > wch->bch.maxlen) {
                pr_debug("%s: empty_Bfifo incoming packet too large\n",
-                       card->name);
+                        card->name);
                WriteW6692B(wch, W_B_CMDR, W_B_CMDR_RACK | W_B_CMDR_RACT);
                skb_trim(wch->bch.rx_skb, 0);
                return;
@@ -495,7 +495,7 @@ W6692_empty_Bfifo(struct w6692_ch *wch, int count)
        WriteW6692B(wch, W_B_CMDR, W_B_CMDR_RACK | W_B_CMDR_RACT);
        if (debug & DEBUG_HW_DFIFO) {
                snprintf(card->log, 63, "B%1d-recv %s %d ",
-                       wch->bch.nr, card->name, count);
+                        wch->bch.nr, card->name, count);
                print_hex_dump_bytes(card->log, DUMP_PREFIX_OFFSET, ptr, count);
        }
 }
@@ -520,13 +520,13 @@ W6692_fill_Bfifo(struct w6692_ch *wch)
                cmd |= W_B_CMDR_XME;
 
        pr_debug("%s: fill Bfifo%d/%d\n", card->name,
-                       count, wch->bch.tx_idx);
+                count, wch->bch.tx_idx);
        wch->bch.tx_idx += count;
        outsb(wch->addr + W_B_XFIFO, ptr, count);
        WriteW6692B(wch, W_B_CMDR, cmd);
        if (debug & DEBUG_HW_DFIFO) {
                snprintf(card->log, 63, "B%1d-send %s %d ",
-                       wch->bch.nr, card->name, count);
+                        wch->bch.nr, card->name, count);
                print_hex_dump_bytes(card->log, DUMP_PREFIX_OFFSET, ptr, count);
        }
 }
@@ -586,7 +586,7 @@ disable_pots(struct w6692_ch *wch)
        wch->b_mode &= ~(W_B_MODE_EPCM | W_B_MODE_BSW0);
        WriteW6692B(wch, W_B_MODE, wch->b_mode);
        WriteW6692B(wch, W_B_CMDR, W_B_CMDR_RRST | W_B_CMDR_RACT |
-               W_B_CMDR_XRST);
+                   W_B_CMDR_XRST);
        return 0;
 }
 
@@ -597,7 +597,7 @@ w6692_mode(struct w6692_ch *wch, u32 pr)
 
        card = wch->bch.hw;
        pr_debug("%s: B%d protocol %x-->%x\n", card->name,
-               wch->bch.nr, wch->bch.state, pr);
+                wch->bch.nr, wch->bch.state, pr);
        switch (pr) {
        case ISDN_P_NONE:
                if ((card->fmask & pots) && (wch->b_mode & W_B_MODE_EPCM))
@@ -614,7 +614,7 @@ w6692_mode(struct w6692_ch *wch, u32 pr)
                WriteW6692B(wch, W_B_MODE, wch->b_mode);
                WriteW6692B(wch, W_B_EXIM, 0);
                WriteW6692B(wch, W_B_CMDR, W_B_CMDR_RRST | W_B_CMDR_RACT |
-                       W_B_CMDR_XRST);
+                           W_B_CMDR_XRST);
                test_and_set_bit(FLG_TRANSPARENT, &wch->bch.Flags);
                break;
        case ISDN_P_B_HDLC:
@@ -624,7 +624,7 @@ w6692_mode(struct w6692_ch *wch, u32 pr)
                WriteW6692B(wch, W_B_ADM2, 0xff);
                WriteW6692B(wch, W_B_EXIM, 0);
                WriteW6692B(wch, W_B_CMDR, W_B_CMDR_RRST | W_B_CMDR_RACT |
-                       W_B_CMDR_XRST);
+                           W_B_CMDR_XRST);
                test_and_set_bit(FLG_HDLC, &wch->bch.Flags);
                break;
        default:
@@ -667,7 +667,7 @@ W6692B_interrupt(struct w6692_hw *card, int ch)
                        if ((star & W_B_STAR_RDOV) &&
                            test_bit(FLG_ACTIVE, &wch->bch.Flags)) {
                                pr_debug("%s: B%d RDOV proto=%x\n", card->name,
-                                       wch->bch.nr, wch->bch.state);
+                                        wch->bch.nr, wch->bch.state);
 #ifdef ERROR_STATISTIC
                                wch->bch.err_rdo++;
 #endif
@@ -675,21 +675,21 @@ W6692B_interrupt(struct w6692_hw *card, int ch)
                        if (test_bit(FLG_HDLC, &wch->bch.Flags)) {
                                if (star & W_B_STAR_CRCE) {
                                        pr_debug("%s: B%d CRC error\n",
-                                               card->name, wch->bch.nr);
+                                                card->name, wch->bch.nr);
 #ifdef ERROR_STATISTIC
                                        wch->bch.err_crc++;
 #endif
                                }
                                if (star & W_B_STAR_RMB) {
                                        pr_debug("%s: B%d message abort\n",
-                                               card->name, wch->bch.nr);
+                                                card->name, wch->bch.nr);
 #ifdef ERROR_STATISTIC
                                        wch->bch.err_inv++;
 #endif
                                }
                        }
                        WriteW6692B(wch, W_B_CMDR, W_B_CMDR_RACK |
-                               W_B_CMDR_RRST | W_B_CMDR_RACT);
+                                   W_B_CMDR_RRST | W_B_CMDR_RACT);
                        if (wch->bch.rx_skb)
                                skb_trim(wch->bch.rx_skb, 0);
                } else {
@@ -706,12 +706,12 @@ W6692B_interrupt(struct w6692_hw *card, int ch)
                        star = ReadW6692B(wch, W_B_STAR);
                if (star & W_B_STAR_RDOV) {
                        pr_debug("%s: B%d RDOV proto=%x\n", card->name,
-                               wch->bch.nr, wch->bch.state);
+                                wch->bch.nr, wch->bch.state);
 #ifdef ERROR_STATISTIC
                        wch->bch.err_rdo++;
 #endif
                        WriteW6692B(wch, W_B_CMDR, W_B_CMDR_RACK |
-                               W_B_CMDR_RRST | W_B_CMDR_RACT);
+                                   W_B_CMDR_RRST | W_B_CMDR_RACT);
                } else {
                        W6692_empty_Bfifo(wch, W_B_FIFO_THRESH);
                        if (test_bit(FLG_TRANSPARENT, &wch->bch.Flags) &&
@@ -723,28 +723,28 @@ W6692B_interrupt(struct w6692_hw *card, int ch)
                /* only if it is not handled yet */
                if (!(star & W_B_STAR_RDOV)) {
                        pr_debug("%s: B%d RDOV IRQ proto=%x\n", card->name,
-                               wch->bch.nr, wch->bch.state);
+                                wch->bch.nr, wch->bch.state);
 #ifdef ERROR_STATISTIC
                        wch->bch.err_rdo++;
 #endif
                        WriteW6692B(wch, W_B_CMDR, W_B_CMDR_RACK |
-                               W_B_CMDR_RRST | W_B_CMDR_RACT);
+                                   W_B_CMDR_RRST | W_B_CMDR_RACT);
                }
        }
        if (stat & W_B_EXI_XFR) {
                if (!(stat & (W_B_EXI_RME | W_B_EXI_RMR))) {
                        star = ReadW6692B(wch, W_B_STAR);
                        pr_debug("%s: B%d star %02x\n", card->name,
-                               wch->bch.nr, star);
+                                wch->bch.nr, star);
                }
                if (star & W_B_STAR_XDOW) {
                        pr_debug("%s: B%d XDOW proto=%x\n", card->name,
-                               wch->bch.nr, wch->bch.state);
+                                wch->bch.nr, wch->bch.state);
 #ifdef ERROR_STATISTIC
                        wch->bch.err_xdu++;
 #endif
                        WriteW6692B(wch, W_B_CMDR, W_B_CMDR_XRST |
-                               W_B_CMDR_RACT);
+                                   W_B_CMDR_RACT);
                        /* resend */
                        if (wch->bch.tx_skb) {
                                if (!test_bit(FLG_TRANSPARENT, &wch->bch.Flags))
@@ -757,7 +757,7 @@ W6692B_interrupt(struct w6692_hw *card, int ch)
        }
        if (stat & W_B_EXI_XDUN) {
                pr_debug("%s: B%d XDUN proto=%x\n", card->name,
-                       wch->bch.nr, wch->bch.state);
+                        wch->bch.nr, wch->bch.state);
 #ifdef ERROR_STATISTIC
                wch->bch.err_xdu++;
 #endif
@@ -818,7 +818,7 @@ dbusy_timer_handler(struct dchannel *dch)
                rbch = ReadW6692(card, W_D_RBCH);
                star = ReadW6692(card, W_D_STAR);
                pr_debug("%s: D-Channel Busy RBCH %02x STAR %02x\n",
-                       card->name, rbch, star);
+                        card->name, rbch, star);
                if (star & W_D_STAR_XBZ)        /* D-Channel Busy */
                        test_and_set_bit(FLG_L1_BUSY, &dch->Flags);
                else {
@@ -888,7 +888,7 @@ void initW6692(struct w6692_hw *card)
                        val = ReadW6692(card, W_XADDR);
                        if (debug & DEBUG_HW)
                                pr_notice("%s: W_XADDR=%02x\n",
-                                       card->name, val);
+                                         card->name, val);
                }
        }
 }
@@ -924,7 +924,7 @@ init_card(struct w6692_hw *card)
                msleep_interruptible(10);
                if (debug & DEBUG_HW)
                        pr_notice("%s: IRQ %d count %d\n", card->name,
-                               card->irq, card->irqcnt);
+                                 card->irq, card->irqcnt);
                if (!card->irqcnt) {
                        pr_info("%s: IRQ(%d) getting no IRQs during init %d\n",
                                card->name, card->irq, 3 - cnt);
@@ -970,7 +970,7 @@ w6692_l2l1B(struct mISDNchannel *ch, struct sk_buff *skb)
                spin_unlock_irqrestore(&card->lock, flags);
                if (!ret)
                        _queue_data(ch, PH_ACTIVATE_IND, MISDN_ID_ANY, 0,
-                               NULL, GFP_KERNEL);
+                                   NULL, GFP_KERNEL);
                break;
        case PH_DEACTIVATE_REQ:
                spin_lock_irqsave(&card->lock, flags);
@@ -978,7 +978,7 @@ w6692_l2l1B(struct mISDNchannel *ch, struct sk_buff *skb)
                w6692_mode(bc, ISDN_P_NONE);
                spin_unlock_irqrestore(&card->lock, flags);
                _queue_data(ch, PH_DEACTIVATE_IND, MISDN_ID_ANY, 0,
-                       NULL, GFP_KERNEL);
+                           NULL, GFP_KERNEL);
                ret = 0;
                break;
        default:
@@ -1000,7 +1000,7 @@ channel_bctrl(struct bchannel *bch, struct mISDN_ctrl_req *cq)
        case MISDN_CTRL_GETOP:
                cq->op = 0;
                break;
-       /* Nothing implemented yet */
+               /* Nothing implemented yet */
        case MISDN_CTRL_FILL_EMPTY:
        default:
                pr_info("%s: unknown Op %x\n", __func__, cq->op);
@@ -1168,16 +1168,16 @@ w6692_l1callback(struct dchannel *dch, u32 cmd)
        case PH_ACTIVATE_IND:
                test_and_set_bit(FLG_ACTIVE, &dch->Flags);
                _queue_data(&dch->dev.D, cmd, MISDN_ID_ANY, 0, NULL,
-                       GFP_ATOMIC);
+                           GFP_ATOMIC);
                break;
        case PH_DEACTIVATE_IND:
                test_and_clear_bit(FLG_ACTIVE, &dch->Flags);
                _queue_data(&dch->dev.D, cmd, MISDN_ID_ANY, 0, NULL,
-                       GFP_ATOMIC);
+                           GFP_ATOMIC);
                break;
        default:
                pr_debug("%s: %s unknown command %x\n", card->name,
-                       __func__, cmd);
+                        __func__, cmd);
                return -1;
        }
        return 0;
@@ -1187,7 +1187,7 @@ static int
 open_dchannel(struct w6692_hw *card, struct channel_req *rq)
 {
        pr_debug("%s: %s dev(%d) open from %p\n", card->name, __func__,
-               card->dch.dev.id, __builtin_return_address(1));
+                card->dch.dev.id, __builtin_return_address(1));
        if (rq->protocol != ISDN_P_TE_S0)
                return -EINVAL;
        if (rq->adr.channel == 1)
@@ -1197,7 +1197,7 @@ open_dchannel(struct w6692_hw *card, struct channel_req *rq)
        rq->ch->protocol = rq->protocol;
        if (card->dch.state == 7)
                _queue_data(rq->ch, PH_ACTIVATE_IND, MISDN_ID_ANY,
-                   0, NULL, GFP_KERNEL);
+                           0, NULL, GFP_KERNEL);
        return 0;
 }
 
@@ -1225,7 +1225,7 @@ w6692_dctrl(struct mISDNchannel *ch, u32 cmd, void *arg)
                break;
        case CLOSE_CHANNEL:
                pr_debug("%s: dev(%d) close from %p\n", card->name,
-                       dch->dev.id, __builtin_return_address(0));
+                        dch->dev.id, __builtin_return_address(0));
                module_put(THIS_MODULE);
                break;
        case CONTROL_CHANNEL:
@@ -1245,7 +1245,7 @@ setup_w6692(struct w6692_hw *card)
 
        if (!request_region(card->addr, 256, card->name)) {
                pr_info("%s: config port %x-%x already in use\n", card->name,
-                      card->addr, card->addr + 255);
+                       card->addr, card->addr + 255);
                return -EIO;
        }
        W6692Version(card);
@@ -1333,7 +1333,7 @@ setup_instance(struct w6692_hw *card)
        if (err)
                goto error_setup;
        err = mISDN_register_device(&card->dch.dev, &card->pdev->dev,
-               card->name);
+                                   card->name);
        if (err)
                goto error_reg;
        err = init_card(card);
index 5d72783..89342f7 100644 (file)
@@ -101,26 +101,26 @@ static WORD initAMD[] = {
 static void /* macro wWordAMD */
 WriteWordAmd7930(struct IsdnCardState *cs, BYTE reg, WORD val)
 {
-        wByteAMD(cs, 0x00, reg);
-        wByteAMD(cs, 0x01, LOBYTE(val));
-        wByteAMD(cs, 0x01, HIBYTE(val));
+       wByteAMD(cs, 0x00, reg);
+       wByteAMD(cs, 0x01, LOBYTE(val));
+       wByteAMD(cs, 0x01, HIBYTE(val));
 }
 
 static WORD /* macro rWordAMD */
 ReadWordAmd7930(struct IsdnCardState *cs, BYTE reg)
 {
-        WORD res;
-        /* direct access register */
-        if(reg < 8) {
-               res = rByteAMD(cs, reg);
-                res += 256*rByteAMD(cs, reg);
-        }
-        /* indirect access register */
-        else {
-                wByteAMD(cs, 0x00, reg);
-               res = rByteAMD(cs, 0x01);
-                res += 256*rByteAMD(cs, 0x01);
-        }
+       WORD res;
+       /* direct access register */
+       if (reg < 8) {
+               res = rByteAMD(cs, reg);
+               res += 256 * rByteAMD(cs, reg);
+       }
+       /* indirect access register */
+       else {
+               wByteAMD(cs, 0x00, reg);
+               res = rByteAMD(cs, 0x01);
+               res += 256 * rByteAMD(cs, 0x01);
+       }
        return (res);
 }
 
@@ -131,23 +131,23 @@ Amd7930_ph_command(struct IsdnCardState *cs, u_char command, char *s)
        if (cs->debug & L1_DEB_ISAC)
                debugl1(cs, "AMD7930: %s: ph_command 0x%02X", s, command);
 
-        cs->dc.amd7930.lmr1 = command;
-        wByteAMD(cs, 0xA3, command);
+       cs->dc.amd7930.lmr1 = command;
+       wByteAMD(cs, 0xA3, command);
 }
 
 
 
 static BYTE i430States[] = {
 // to   reset  F3    F4    F5    F6    F7    F8    AR     from
-        0x01, 0x02, 0x00, 0x00, 0x00, 0x07, 0x05, 0x00,   // init
-        0x01, 0x02, 0x00, 0x00, 0x00, 0x07, 0x05, 0x00,   // reset
-        0x01, 0x02, 0x00, 0x00, 0x00, 0x09, 0x05, 0x04,   // F3
-        0x01, 0x02, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00,   // F4
-        0x01, 0x02, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00,   // F5
-        0x01, 0x03, 0x00, 0x00, 0x00, 0x06, 0x05, 0x00,   // F6
-        0x11, 0x13, 0x00, 0x00, 0x1B, 0x00, 0x15, 0x00,   // F7
-        0x01, 0x03, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00,   // F8
-        0x01, 0x03, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0A};  // AR
+       0x01, 0x02, 0x00, 0x00, 0x00, 0x07, 0x05, 0x00,   // init
+       0x01, 0x02, 0x00, 0x00, 0x00, 0x07, 0x05, 0x00,   // reset
+       0x01, 0x02, 0x00, 0x00, 0x00, 0x09, 0x05, 0x04,   // F3
+       0x01, 0x02, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00,   // F4
+       0x01, 0x02, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00,   // F5
+       0x01, 0x03, 0x00, 0x00, 0x00, 0x06, 0x05, 0x00,   // F6
+       0x11, 0x13, 0x00, 0x00, 0x1B, 0x00, 0x15, 0x00,   // F7
+       0x01, 0x03, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00,   // F8
+       0x01, 0x03, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0A};  // AR
 
 
 /*                    Row     init    -   reset  F3    F4    F5    F6    F7    F8    AR */
@@ -158,9 +158,9 @@ static BYTE stateHelper[] = { 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x
 
 static void
 Amd7930_get_state(struct IsdnCardState *cs) {
-        BYTE lsr = rByteAMD(cs, 0xA1);
-        cs->dc.amd7930.ph_state = (lsr & 0x7) + 2;
-        Amd7930_new_ph(cs);
+       BYTE lsr = rByteAMD(cs, 0xA1);
+       cs->dc.amd7930.ph_state = (lsr & 0x7) + 2;
+       Amd7930_new_ph(cs);
 }
 
 
@@ -168,65 +168,65 @@ Amd7930_get_state(struct IsdnCardState *cs) {
 static void
 Amd7930_new_ph(struct IsdnCardState *cs)
 {
-        u_char index = stateHelper[cs->dc.amd7930.old_state]*8 + stateHelper[cs->dc.amd7930.ph_state]-1;
-        u_char message = i430States[index];
+       u_char index = stateHelper[cs->dc.amd7930.old_state] * 8 + stateHelper[cs->dc.amd7930.ph_state] - 1;
+       u_char message = i430States[index];
 
-        if (cs->debug & L1_DEB_ISAC)
+       if (cs->debug & L1_DEB_ISAC)
                debugl1(cs, "AMD7930: new_ph %d, old_ph %d, message %d, index %d",
-                        cs->dc.amd7930.ph_state, cs->dc.amd7930.old_state, message & 0x0f, index);
+                       cs->dc.amd7930.ph_state, cs->dc.amd7930.old_state, message & 0x0f, index);
 
-        cs->dc.amd7930.old_state = cs->dc.amd7930.ph_state;
+       cs->dc.amd7930.old_state = cs->dc.amd7930.ph_state;
 
-        /* abort transmit if nessesary */
-        if ((message & 0xf0) && (cs->tx_skb)) {
-                wByteAMD(cs, 0x21, 0xC2);
-                wByteAMD(cs, 0x21, 0x02);
-        }
+       /* abort transmit if nessesary */
+       if ((message & 0xf0) && (cs->tx_skb)) {
+               wByteAMD(cs, 0x21, 0xC2);
+               wByteAMD(cs, 0x21, 0x02);
+       }
 
        switch (message & 0x0f) {
 
-                case (1):
-                        l1_msg(cs, HW_RESET | INDICATION, NULL);
-                        Amd7930_get_state(cs);
-                        break;
-                case (2): /* init, Card starts in F3 */
-                        l1_msg(cs, HW_DEACTIVATE | CONFIRM, NULL);
-                        break;
-                case (3):
-                        l1_msg(cs, HW_DEACTIVATE | INDICATION, NULL);
-                        break;
-                case (4):
-                        l1_msg(cs, HW_POWERUP | CONFIRM, NULL);
-                        Amd7930_ph_command(cs, 0x50, "HW_ENABLE REQUEST");
-                        break;
-                case (5):
-                       l1_msg(cs, HW_RSYNC | INDICATION, NULL);
-                        break;
-                case (6):
-                       l1_msg(cs, HW_INFO4_P8 | INDICATION, NULL);
-                        break;
-                case (7): /* init, Card starts in F7 */
-                       l1_msg(cs, HW_RSYNC | INDICATION, NULL);
-                       l1_msg(cs, HW_INFO4_P8 | INDICATION, NULL);
-                        break;
-                case (8):
-                        l1_msg(cs, HW_POWERUP | CONFIRM, NULL);
-                        /* fall through */
-                case (9):
-                        Amd7930_ph_command(cs, 0x40, "HW_ENABLE REQ cleared if set");
-                       l1_msg(cs, HW_RSYNC | INDICATION, NULL);
-                       l1_msg(cs, HW_INFO2 | INDICATION, NULL);
-                       l1_msg(cs, HW_INFO4_P8 | INDICATION, NULL);
-                        break;
-                case (10):
-                        Amd7930_ph_command(cs, 0x40, "T3 expired, HW_ENABLE REQ cleared");
-                        cs->dc.amd7930.old_state = 3;
-                        break;
-                case (11):
-                       l1_msg(cs, HW_INFO2 | INDICATION, NULL);
-                        break;
-               default:
-                       break;
+       case (1):
+               l1_msg(cs, HW_RESET | INDICATION, NULL);
+               Amd7930_get_state(cs);
+               break;
+       case (2): /* init, Card starts in F3 */
+               l1_msg(cs, HW_DEACTIVATE | CONFIRM, NULL);
+               break;
+       case (3):
+               l1_msg(cs, HW_DEACTIVATE | INDICATION, NULL);
+               break;
+       case (4):
+               l1_msg(cs, HW_POWERUP | CONFIRM, NULL);
+               Amd7930_ph_command(cs, 0x50, "HW_ENABLE REQUEST");
+               break;
+       case (5):
+               l1_msg(cs, HW_RSYNC | INDICATION, NULL);
+               break;
+       case (6):
+               l1_msg(cs, HW_INFO4_P8 | INDICATION, NULL);
+               break;
+       case (7): /* init, Card starts in F7 */
+               l1_msg(cs, HW_RSYNC | INDICATION, NULL);
+               l1_msg(cs, HW_INFO4_P8 | INDICATION, NULL);
+               break;
+       case (8):
+               l1_msg(cs, HW_POWERUP | CONFIRM, NULL);
+               /* fall through */
+       case (9):
+               Amd7930_ph_command(cs, 0x40, "HW_ENABLE REQ cleared if set");
+               l1_msg(cs, HW_RSYNC | INDICATION, NULL);
+               l1_msg(cs, HW_INFO2 | INDICATION, NULL);
+               l1_msg(cs, HW_INFO4_P8 | INDICATION, NULL);
+               break;
+       case (10):
+               Amd7930_ph_command(cs, 0x40, "T3 expired, HW_ENABLE REQ cleared");
+               cs->dc.amd7930.old_state = 3;
+               break;
+       case (11):
+               l1_msg(cs, HW_INFO2 | INDICATION, NULL);
+               break;
+       default:
+               break;
        }
 }
 
@@ -237,10 +237,10 @@ Amd7930_bh(struct work_struct *work)
 {
        struct IsdnCardState *cs =
                container_of(work, struct IsdnCardState, tqueue);
-        struct PStack *stptr;
+       struct PStack *stptr;
 
        if (test_and_clear_bit(D_CLEARBUSY, &cs->event)) {
-                if (cs->debug)
+               if (cs->debug)
                        debugl1(cs, "Amd7930: bh, D-Channel Busy cleared");
                stptr = cs->stlist;
                while (stptr != NULL) {
@@ -249,29 +249,29 @@ Amd7930_bh(struct work_struct *work)
                }
        }
        if (test_and_clear_bit(D_L1STATECHANGE, &cs->event)) {
-               if (cs->debug & L1_DEB_ISAC)
-                       debugl1(cs, "AMD7930: bh, D_L1STATECHANGE");
-                Amd7930_new_ph(cs);
-        }
-
-        if (test_and_clear_bit(D_RCVBUFREADY, &cs->event)) {
-               if (cs->debug & L1_DEB_ISAC)
-                       debugl1(cs, "AMD7930: bh, D_RCVBUFREADY");
-                DChannel_proc_rcv(cs);
-        }
-
-        if (test_and_clear_bit(D_XMTBUFREADY, &cs->event)) {
-               if (cs->debug & L1_DEB_ISAC)
-                       debugl1(cs, "AMD7930: bh, D_XMTBUFREADY");
-                DChannel_proc_xmt(cs);
-        }
+               if (cs->debug & L1_DEB_ISAC)
+                       debugl1(cs, "AMD7930: bh, D_L1STATECHANGE");
+               Amd7930_new_ph(cs);
+       }
+
+       if (test_and_clear_bit(D_RCVBUFREADY, &cs->event)) {
+               if (cs->debug & L1_DEB_ISAC)
+                       debugl1(cs, "AMD7930: bh, D_RCVBUFREADY");
+               DChannel_proc_rcv(cs);
+       }
+
+       if (test_and_clear_bit(D_XMTBUFREADY, &cs->event)) {
+               if (cs->debug & L1_DEB_ISAC)
+                       debugl1(cs, "AMD7930: bh, D_XMTBUFREADY");
+               DChannel_proc_xmt(cs);
+       }
 }
 
 static void
 Amd7930_empty_Dfifo(struct IsdnCardState *cs, int flag)
 {
 
-        BYTE stat, der;
+       BYTE stat, der;
        BYTE *ptr;
        struct sk_buff *skb;
 
@@ -288,54 +288,54 @@ Amd7930_empty_Dfifo(struct IsdnCardState *cs, int flag)
        /* read D-Channel-Fifo*/
        stat = rByteAMD(cs, 0x07); // DSR2
 
-               /* while Data in Fifo ... */
-               while ( (stat & 2) && ((ptr-cs->rcvbuf) < MAX_DFRAME_LEN_L1) ) {
-                       *ptr = rByteAMD(cs, 0x04); // DCRB
-                       ptr++;
-                       stat = rByteAMD(cs, 0x07); // DSR2
-                       cs->rcvidx = ptr - cs->rcvbuf;
-
-                        /* Paket ready? */
-                       if (stat & 1) {
-
-                                der = rWordAMD(cs, 0x03);
-
-                                /* no errors, packet ok */
-                                if(!der && !flag) {
-                                       rWordAMD(cs, 0x89); // clear DRCR
-
-                                        if ((cs->rcvidx) > 0) {
-                                                if (!(skb = alloc_skb(cs->rcvidx, GFP_ATOMIC)))
-                                                       printk(KERN_WARNING "HiSax: Amd7930: empty_Dfifo, D receive out of memory!\n");
-                                               else {
-                                                        /* Debugging */
-                                                        if (cs->debug & L1_DEB_ISAC_FIFO) {
-                                                               char *t = cs->dlog;
-
-                                                               t += sprintf(t, "Amd7930: empty_Dfifo cnt: %d |", cs->rcvidx);
-                                                               QuickHex(t, cs->rcvbuf, cs->rcvidx);
-                                                               debugl1(cs, cs->dlog);
-                                                       }
-                                                        /* moves received data in sk-buffer */
-                                                       memcpy(skb_put(skb, cs->rcvidx), cs->rcvbuf, cs->rcvidx);
-                                                       skb_queue_tail(&cs->rq, skb);
+       /* while Data in Fifo ... */
+       while ((stat & 2) && ((ptr-cs->rcvbuf) < MAX_DFRAME_LEN_L1)) {
+               *ptr = rByteAMD(cs, 0x04); // DCRB
+               ptr++;
+               stat = rByteAMD(cs, 0x07); // DSR2
+               cs->rcvidx = ptr - cs->rcvbuf;
+
+               /* Paket ready? */
+               if (stat & 1) {
+
+                       der = rWordAMD(cs, 0x03);
+
+                       /* no errors, packet ok */
+                       if (!der && !flag) {
+                               rWordAMD(cs, 0x89); // clear DRCR
+
+                               if ((cs->rcvidx) > 0) {
+                                       if (!(skb = alloc_skb(cs->rcvidx, GFP_ATOMIC)))
+                                               printk(KERN_WARNING "HiSax: Amd7930: empty_Dfifo, D receive out of memory!\n");
+                                       else {
+                                               /* Debugging */
+                                               if (cs->debug & L1_DEB_ISAC_FIFO) {
+                                                       char *t = cs->dlog;
+
+                                                       t += sprintf(t, "Amd7930: empty_Dfifo cnt: %d |", cs->rcvidx);
+                                                       QuickHex(t, cs->rcvbuf, cs->rcvidx);
+                                                       debugl1(cs, cs->dlog);
                                                }
+                                               /* moves received data in sk-buffer */
+                                               memcpy(skb_put(skb, cs->rcvidx), cs->rcvbuf, cs->rcvidx);
+                                               skb_queue_tail(&cs->rq, skb);
                                        }
-
                                }
-                                /* throw damaged packets away, reset receive-buffer, indicate RX */
-                               ptr = cs->rcvbuf;
-                               cs->rcvidx = 0;
-                               schedule_event(cs, D_RCVBUFREADY);
+
                        }
-                }
-               /* Packet to long, overflow */
-               if(cs->rcvidx >= MAX_DFRAME_LEN_L1) {
-                       if (cs->debug & L1_DEB_WARN)
-                               debugl1(cs, "AMD7930: empty_Dfifo L2-Framelength overrun");
+                       /* throw damaged packets away, reset receive-buffer, indicate RX */
+                       ptr = cs->rcvbuf;
                        cs->rcvidx = 0;
-                       return;
+                       schedule_event(cs, D_RCVBUFREADY);
                }
+       }
+       /* Packet to long, overflow */
+       if (cs->rcvidx >= MAX_DFRAME_LEN_L1) {
+               if (cs->debug & L1_DEB_WARN)
+                       debugl1(cs, "AMD7930: empty_Dfifo L2-Framelength overrun");
+               cs->rcvidx = 0;
+               return;
+       }
        /* AMD interrupts on */
        AmdIrqOn(cs);
 }
@@ -345,9 +345,9 @@ static void
 Amd7930_fill_Dfifo(struct IsdnCardState *cs)
 {
 
-        WORD dtcrr, dtcrw, len, count;
-        BYTE txstat, dmr3;
-        BYTE *ptr, *deb_ptr;
+       WORD dtcrr, dtcrw, len, count;
+       BYTE txstat, dmr3;
+       BYTE *ptr, *deb_ptr;
 
        if ((cs->debug & L1_DEB_ISAC) && !(cs->debug & L1_DEB_ISAC_FIFO))
                debugl1(cs, "Amd7930: fill_Dfifo");
@@ -355,43 +355,43 @@ Amd7930_fill_Dfifo(struct IsdnCardState *cs)
        if ((!cs->tx_skb) || (cs->tx_skb->len <= 0))
                return;
 
-        dtcrw = 0;
-        if(!cs->dc.amd7930.tx_xmtlen)
-                /* new Frame */
-                len = dtcrw = cs->tx_skb->len;
-        /* continue frame */
-        else len = cs->dc.amd7930.tx_xmtlen;
+       dtcrw = 0;
+       if (!cs->dc.amd7930.tx_xmtlen)
+               /* new Frame */
+               len = dtcrw = cs->tx_skb->len;
+       /* continue frame */
+       else len = cs->dc.amd7930.tx_xmtlen;
 
 
        /* AMD interrupts off */
        AmdIrqOff(cs);
 
-        deb_ptr = ptr = cs->tx_skb->data;
-
-        /* while free place in tx-fifo available and data in sk-buffer */
-        txstat = 0x10;
-        while((txstat & 0x10) && (cs->tx_cnt < len)) {
-                wByteAMD(cs, 0x04, *ptr);
-                ptr++;
-                cs->tx_cnt++;
-                txstat= rByteAMD(cs, 0x07);
-        }
-        count = ptr - cs->tx_skb->data;
+       deb_ptr = ptr = cs->tx_skb->data;
+
+       /* while free place in tx-fifo available and data in sk-buffer */
+       txstat = 0x10;
+       while ((txstat & 0x10) && (cs->tx_cnt < len)) {
+               wByteAMD(cs, 0x04, *ptr);
+               ptr++;
+               cs->tx_cnt++;
+               txstat = rByteAMD(cs, 0x07);
+       }
+       count = ptr - cs->tx_skb->data;
        skb_pull(cs->tx_skb, count);
 
 
-        dtcrr = rWordAMD(cs, 0x85); // DTCR
-        dmr3  = rByteAMD(cs, 0x8E);
+       dtcrr = rWordAMD(cs, 0x85); // DTCR
+       dmr3  = rByteAMD(cs, 0x8E);
 
        if (cs->debug & L1_DEB_ISAC) {
                debugl1(cs, "Amd7930: fill_Dfifo, DMR3: 0x%02X, DTCR read: 0x%04X write: 0x%02X 0x%02X", dmr3, dtcrr, LOBYTE(dtcrw), HIBYTE(dtcrw));
-        }
+       }
 
-        /* writeing of dtcrw starts transmit */
-        if(!cs->dc.amd7930.tx_xmtlen) {
-                wWordAMD(cs, 0x85, dtcrw);
-                cs->dc.amd7930.tx_xmtlen = dtcrw;
-        }
+       /* writeing of dtcrw starts transmit */
+       if (!cs->dc.amd7930.tx_xmtlen) {
+               wWordAMD(cs, 0x85, dtcrw);
+               cs->dc.amd7930.tx_xmtlen = dtcrw;
+       }
 
        if (test_and_set_bit(FLG_DBUSY_TIMER, &cs->HW_Flags)) {
                debugl1(cs, "Amd7930: fill_Dfifo dbusytimer running");
@@ -409,260 +409,260 @@ Amd7930_fill_Dfifo(struct IsdnCardState *cs)
                debugl1(cs, cs->dlog);
        }
        /* AMD interrupts on */
-        AmdIrqOn(cs);
+       AmdIrqOn(cs);
 }
 
 
 void Amd7930_interrupt(struct IsdnCardState *cs, BYTE irflags)
 {
        BYTE dsr1, dsr2, lsr;
-        WORD der;
+       WORD der;
 
- while (irflags)
- {
+       while (irflags)
+       {
 
-        dsr1 = rByteAMD(cs, 0x02);
-        der  = rWordAMD(cs, 0x03);
-        dsr2 = rByteAMD(cs, 0x07);
-        lsr  = rByteAMD(cs, 0xA1);
+               dsr1 = rByteAMD(cs, 0x02);
+               der  = rWordAMD(cs, 0x03);
+               dsr2 = rByteAMD(cs, 0x07);
+               lsr  = rByteAMD(cs, 0xA1);
 
-       if (cs->debug & L1_DEB_ISAC)
-               debugl1(cs, "Amd7930: interrupt: flags: 0x%02X, DSR1: 0x%02X, DSR2: 0x%02X, LSR: 0x%02X, DER=0x%04X", irflags, dsr1, dsr2, lsr, der);
+               if (cs->debug & L1_DEB_ISAC)
+                       debugl1(cs, "Amd7930: interrupt: flags: 0x%02X, DSR1: 0x%02X, DSR2: 0x%02X, LSR: 0x%02X, DER=0x%04X", irflags, dsr1, dsr2, lsr, der);
 
-        /* D error -> read DER and DSR2 bit 2 */
-       if (der || (dsr2 & 4)) {
+               /* D error -> read DER and DSR2 bit 2 */
+               if (der || (dsr2 & 4)) {
 
-                if (cs->debug & L1_DEB_WARN)
-                       debugl1(cs, "Amd7930: interrupt: D error DER=0x%04X", der);
+                       if (cs->debug & L1_DEB_WARN)
+                               debugl1(cs, "Amd7930: interrupt: D error DER=0x%04X", der);
+
+                       /* RX, TX abort if collision detected */
+                       if (der & 2) {
+                               wByteAMD(cs, 0x21, 0xC2);
+                               wByteAMD(cs, 0x21, 0x02);
+                               if (test_and_clear_bit(FLG_DBUSY_TIMER, &cs->HW_Flags))
+                                       del_timer(&cs->dbusytimer);
+                               if (test_and_clear_bit(FLG_L1_DBUSY, &cs->HW_Flags))
+                                       schedule_event(cs, D_CLEARBUSY);
+                               /* restart frame */
+                               if (cs->tx_skb) {
+                                       skb_push(cs->tx_skb, cs->tx_cnt);
+                                       cs->tx_cnt = 0;
+                                       cs->dc.amd7930.tx_xmtlen = 0;
+                                       Amd7930_fill_Dfifo(cs);
+                               } else {
+                                       printk(KERN_WARNING "HiSax: Amd7930 D-Collision, no skb\n");
+                                       debugl1(cs, "Amd7930: interrupt: D-Collision, no skb");
+                               }
+                       }
+                       /* remove damaged data from fifo */
+                       Amd7930_empty_Dfifo(cs, 1);
 
-                /* RX, TX abort if collision detected */
-                if (der & 2) {
-                        wByteAMD(cs, 0x21, 0xC2);
-                        wByteAMD(cs, 0x21, 0x02);
                        if (test_and_clear_bit(FLG_DBUSY_TIMER, &cs->HW_Flags))
                                del_timer(&cs->dbusytimer);
                        if (test_and_clear_bit(FLG_L1_DBUSY, &cs->HW_Flags))
                                schedule_event(cs, D_CLEARBUSY);
-                        /* restart frame */
-                        if (cs->tx_skb) {
+                       /* restart TX-Frame */
+                       if (cs->tx_skb) {
                                skb_push(cs->tx_skb, cs->tx_cnt);
                                cs->tx_cnt = 0;
-                                cs->dc.amd7930.tx_xmtlen = 0;
+                               cs->dc.amd7930.tx_xmtlen = 0;
                                Amd7930_fill_Dfifo(cs);
-                       } else {
-                               printk(KERN_WARNING "HiSax: Amd7930 D-Collision, no skb\n");
-                               debugl1(cs, "Amd7930: interrupt: D-Collision, no skb");
                        }
-                }
-                /* remove damaged data from fifo */
-               Amd7930_empty_Dfifo(cs, 1);
-
-               if (test_and_clear_bit(FLG_DBUSY_TIMER, &cs->HW_Flags))
-                       del_timer(&cs->dbusytimer);
-               if (test_and_clear_bit(FLG_L1_DBUSY, &cs->HW_Flags))
-                       schedule_event(cs, D_CLEARBUSY);
-                /* restart TX-Frame */
-                if (cs->tx_skb) {
-                       skb_push(cs->tx_skb, cs->tx_cnt);
-                       cs->tx_cnt = 0;
-                        cs->dc.amd7930.tx_xmtlen = 0;
-                       Amd7930_fill_Dfifo(cs);
                }
-       }
 
-        /* D TX FIFO empty -> fill */
-       if (irflags & 1) {
-               if (cs->debug & L1_DEB_ISAC)
-                       debugl1(cs, "Amd7930: interrupt: clear Timer and fill D-TX-FIFO if data");
+               /* D TX FIFO empty -> fill */
+               if (irflags & 1) {
+                       if (cs->debug & L1_DEB_ISAC)
+                               debugl1(cs, "Amd7930: interrupt: clear Timer and fill D-TX-FIFO if data");
 
-               /* AMD interrupts off */
-                AmdIrqOff(cs);
+                       /* AMD interrupts off */
+                       AmdIrqOff(cs);
 
-                if (test_and_clear_bit(FLG_DBUSY_TIMER, &cs->HW_Flags))
-                       del_timer(&cs->dbusytimer);
-               if (test_and_clear_bit(FLG_L1_DBUSY, &cs->HW_Flags))
-                       schedule_event(cs, D_CLEARBUSY);
-               if (cs->tx_skb) {
-                       if (cs->tx_skb->len)
-                               Amd7930_fill_Dfifo(cs);
+                       if (test_and_clear_bit(FLG_DBUSY_TIMER, &cs->HW_Flags))
+                               del_timer(&cs->dbusytimer);
+                       if (test_and_clear_bit(FLG_L1_DBUSY, &cs->HW_Flags))
+                               schedule_event(cs, D_CLEARBUSY);
+                       if (cs->tx_skb) {
+                               if (cs->tx_skb->len)
+                                       Amd7930_fill_Dfifo(cs);
+                       }
+                       /* AMD interrupts on */
+                       AmdIrqOn(cs);
                }
-               /* AMD interrupts on */
-                AmdIrqOn(cs);
-       }
 
 
-        /* D RX FIFO full or tiny packet in Fifo -> empty */
-       if ((irflags & 2) || (dsr1 & 2)) {
-                if (cs->debug & L1_DEB_ISAC)
-                       debugl1(cs, "Amd7930: interrupt: empty D-FIFO");
-                Amd7930_empty_Dfifo(cs, 0);
-       }
+               /* D RX FIFO full or tiny packet in Fifo -> empty */
+               if ((irflags & 2) || (dsr1 & 2)) {
+                       if (cs->debug & L1_DEB_ISAC)
+                               debugl1(cs, "Amd7930: interrupt: empty D-FIFO");
+                       Amd7930_empty_Dfifo(cs, 0);
+               }
 
 
-        /* D-Frame transmit complete */
-       if (dsr1 & 64) {
-               if (cs->debug & L1_DEB_ISAC) {
-                       debugl1(cs, "Amd7930: interrupt: transmit packet ready");
-               }
-               /* AMD interrupts off */
-                AmdIrqOff(cs);
+               /* D-Frame transmit complete */
+               if (dsr1 & 64) {
+                       if (cs->debug & L1_DEB_ISAC) {
+                               debugl1(cs, "Amd7930: interrupt: transmit packet ready");
+                       }
+                       /* AMD interrupts off */
+                       AmdIrqOff(cs);
 
-                if (test_and_clear_bit(FLG_DBUSY_TIMER, &cs->HW_Flags))
-                       del_timer(&cs->dbusytimer);
-               if (test_and_clear_bit(FLG_L1_DBUSY, &cs->HW_Flags))
-                       schedule_event(cs, D_CLEARBUSY);
+                       if (test_and_clear_bit(FLG_DBUSY_TIMER, &cs->HW_Flags))
+                               del_timer(&cs->dbusytimer);
+                       if (test_and_clear_bit(FLG_L1_DBUSY, &cs->HW_Flags))
+                               schedule_event(cs, D_CLEARBUSY);
 
-                if (cs->tx_skb) {
-                       if (cs->debug & L1_DEB_ISAC)
-                               debugl1(cs, "Amd7930: interrupt: TX-Packet ready, freeing skb");
-                        dev_kfree_skb_irq(cs->tx_skb);
-                       cs->tx_cnt = 0;
-                        cs->dc.amd7930.tx_xmtlen=0;
-                       cs->tx_skb = NULL;
-                }
-                if ((cs->tx_skb = skb_dequeue(&cs->sq))) {
-                       if (cs->debug & L1_DEB_ISAC)
-                               debugl1(cs, "Amd7930: interrupt: TX-Packet ready, next packet dequeued");
-                       cs->tx_cnt = 0;
-                        cs->dc.amd7930.tx_xmtlen=0;
-                       Amd7930_fill_Dfifo(cs);
+                       if (cs->tx_skb) {
+                               if (cs->debug & L1_DEB_ISAC)
+                                       debugl1(cs, "Amd7930: interrupt: TX-Packet ready, freeing skb");
+                               dev_kfree_skb_irq(cs->tx_skb);
+                               cs->tx_cnt = 0;
+                               cs->dc.amd7930.tx_xmtlen = 0;
+                               cs->tx_skb = NULL;
+                       }
+                       if ((cs->tx_skb = skb_dequeue(&cs->sq))) {
+                               if (cs->debug & L1_DEB_ISAC)
+                                       debugl1(cs, "Amd7930: interrupt: TX-Packet ready, next packet dequeued");
+                               cs->tx_cnt = 0;
+                               cs->dc.amd7930.tx_xmtlen = 0;
+                               Amd7930_fill_Dfifo(cs);
+                       }
+                       else
+                               schedule_event(cs, D_XMTBUFREADY);
+                       /* AMD interrupts on */
+                       AmdIrqOn(cs);
                }
-                else
-                       schedule_event(cs, D_XMTBUFREADY);
-               /* AMD interrupts on */
-                AmdIrqOn(cs);
-        }
 
-       /* LIU status interrupt -> read LSR, check statechanges */
-       if (lsr & 0x38) {
-                /* AMD interrupts off */
-                AmdIrqOff(cs);
+               /* LIU status interrupt -> read LSR, check statechanges */
+               if (lsr & 0x38) {
+                       /* AMD interrupts off */
+                       AmdIrqOff(cs);
 
-               if (cs->debug & L1_DEB_ISAC)
-                       debugl1(cs, "Amd: interrupt: LSR=0x%02X, LIU is in state %d", lsr, ((lsr & 0x7) +2));
+                       if (cs->debug & L1_DEB_ISAC)
+                               debugl1(cs, "Amd: interrupt: LSR=0x%02X, LIU is in state %d", lsr, ((lsr & 0x7) + 2));
 
-               cs->dc.amd7930.ph_state = (lsr & 0x7) + 2;
+                       cs->dc.amd7930.ph_state = (lsr & 0x7) + 2;
 
-               schedule_event(cs, D_L1STATECHANGE);
-               /* AMD interrupts on */
-                AmdIrqOn(cs);
-       }
+                       schedule_event(cs, D_L1STATECHANGE);
+                       /* AMD interrupts on */
+                       AmdIrqOn(cs);
+               }
 
-        /* reads Interrupt-Register again. If there is a new interrupt-flag: restart handler */
-        irflags = rByteAMD(cs, 0x00);
- }
+               /* reads Interrupt-Register again. If there is a new interrupt-flag: restart handler */
+               irflags = rByteAMD(cs, 0x00);
+       }
 
 }
 
 static void
 Amd7930_l1hw(struct PStack *st, int pr, void *arg)
 {
-        struct IsdnCardState *cs = (struct IsdnCardState *) st->l1.hardware;
+       struct IsdnCardState *cs = (struct IsdnCardState *) st->l1.hardware;
        struct sk_buff *skb = arg;
        u_long flags;
 
-        if (cs->debug & L1_DEB_ISAC)
+       if (cs->debug & L1_DEB_ISAC)
                debugl1(cs, "Amd7930: l1hw called, pr: 0x%04X", pr);
 
        switch (pr) {
-               case (PH_DATA | REQUEST):
-                        if (cs->debug & DEB_DLOG_HEX)
-                               LogFrame(cs, skb->data, skb->len);
-                       if (cs->debug & DEB_DLOG_VERBOSE)
-                               dlogframe(cs, skb, 0);
-                       spin_lock_irqsave(&cs->lock, flags);
-                       if (cs->tx_skb) {
-                               skb_queue_tail(&cs->sq, skb);
-#ifdef L2FRAME_DEBUG           /* psa */
-                               if (cs->debug & L1_DEB_LAPD)
-                                       Logl2Frame(cs, skb, "Amd7930: l1hw: PH_DATA Queued", 0);
-#endif
-                       } else {
-                               cs->tx_skb = skb;
-                               cs->tx_cnt = 0;
-                                cs->dc.amd7930.tx_xmtlen=0;
+       case (PH_DATA | REQUEST):
+               if (cs->debug & DEB_DLOG_HEX)
+                       LogFrame(cs, skb->data, skb->len);
+               if (cs->debug & DEB_DLOG_VERBOSE)
+                       dlogframe(cs, skb, 0);
+               spin_lock_irqsave(&cs->lock, flags);
+               if (cs->tx_skb) {
+                       skb_queue_tail(&cs->sq, skb);
 #ifdef L2FRAME_DEBUG           /* psa */
-                               if (cs->debug & L1_DEB_LAPD)
-                                       Logl2Frame(cs, skb, "Amd7930: l1hw: PH_DATA", 0);
+                       if (cs->debug & L1_DEB_LAPD)
+                               Logl2Frame(cs, skb, "Amd7930: l1hw: PH_DATA Queued", 0);
 #endif
-                               Amd7930_fill_Dfifo(cs);
-                       }
-                       spin_unlock_irqrestore(&cs->lock, flags);
-                       break;
-               case (PH_PULL | INDICATION):
-                       spin_lock_irqsave(&cs->lock, flags);
-                       if (cs->tx_skb) {
-                               if (cs->debug & L1_DEB_WARN)
-                                       debugl1(cs, "Amd7930: l1hw: l2l1 tx_skb exist this shouldn't happen");
-                               skb_queue_tail(&cs->sq, skb);
-                               spin_unlock_irqrestore(&cs->lock, flags);
-                               break;
-                       }
-                       if (cs->debug & DEB_DLOG_HEX)
-                               LogFrame(cs, skb->data, skb->len);
-                       if (cs->debug & DEB_DLOG_VERBOSE)
-                               dlogframe(cs, skb, 0);
+               } else {
                        cs->tx_skb = skb;
                        cs->tx_cnt = 0;
-                        cs->dc.amd7930.tx_xmtlen=0;
+                       cs->dc.amd7930.tx_xmtlen = 0;
 #ifdef L2FRAME_DEBUG           /* psa */
                        if (cs->debug & L1_DEB_LAPD)
-                               Logl2Frame(cs, skb, "Amd7930: l1hw: PH_DATA_PULLED", 0);
+                               Logl2Frame(cs, skb, "Amd7930: l1hw: PH_DATA", 0);
 #endif
                        Amd7930_fill_Dfifo(cs);
+               }
+               spin_unlock_irqrestore(&cs->lock, flags);
+               break;
+       case (PH_PULL | INDICATION):
+               spin_lock_irqsave(&cs->lock, flags);
+               if (cs->tx_skb) {
+                       if (cs->debug & L1_DEB_WARN)
+                               debugl1(cs, "Amd7930: l1hw: l2l1 tx_skb exist this shouldn't happen");
+                       skb_queue_tail(&cs->sq, skb);
                        spin_unlock_irqrestore(&cs->lock, flags);
                        break;
-               case (PH_PULL | REQUEST):
+               }
+               if (cs->debug & DEB_DLOG_HEX)
+                       LogFrame(cs, skb->data, skb->len);
+               if (cs->debug & DEB_DLOG_VERBOSE)
+                       dlogframe(cs, skb, 0);
+               cs->tx_skb = skb;
+               cs->tx_cnt = 0;
+               cs->dc.amd7930.tx_xmtlen = 0;
 #ifdef L2FRAME_DEBUG           /* psa */
-                       if (cs->debug & L1_DEB_LAPD)
-                               debugl1(cs, "Amd7930: l1hw: -> PH_REQUEST_PULL, skb: %s", (cs->tx_skb)? "yes":"no");
+               if (cs->debug & L1_DEB_LAPD)
+                       Logl2Frame(cs, skb, "Amd7930: l1hw: PH_DATA_PULLED", 0);
 #endif
-                       if (!cs->tx_skb) {
-                               test_and_clear_bit(FLG_L1_PULL_REQ, &st->l1.Flags);
-                               st->l1.l1l2(st, PH_PULL | CONFIRM, NULL);
-                       } else
-                               test_and_set_bit(FLG_L1_PULL_REQ, &st->l1.Flags);
-                       break;
-               case (HW_RESET | REQUEST):
-                       spin_lock_irqsave(&cs->lock, flags);
-                       if ((cs->dc.amd7930.ph_state == 8)) {
-                               /* b-channels off, PH-AR cleared
-                                * change to F3 */
-                               Amd7930_ph_command(cs, 0x20, "HW_RESET REQEST"); //LMR1 bit 5
-                               spin_unlock_irqrestore(&cs->lock, flags);
-                       } else {
-                               Amd7930_ph_command(cs, 0x40, "HW_RESET REQUEST");
-                               cs->dc.amd7930.ph_state = 2;
-                               spin_unlock_irqrestore(&cs->lock, flags);
-                               Amd7930_new_ph(cs);
-                       }
-                       break;
-               case (HW_ENABLE | REQUEST):
-                        cs->dc.amd7930.ph_state = 9;
-                        Amd7930_new_ph(cs);
-                       break;
-               case (HW_INFO3 | REQUEST):
-                       // automatic
-                       break;
-               case (HW_TESTLOOP | REQUEST):
-                       /* not implemented yet */
-                       break;
-               case (HW_DEACTIVATE | RESPONSE):
-                        skb_queue_purge(&cs->rq);
-                       skb_queue_purge(&cs->sq);
-                       if (cs->tx_skb) {
-                               dev_kfree_skb(cs->tx_skb);
-                               cs->tx_skb = NULL;
-                       }
-                       if (test_and_clear_bit(FLG_DBUSY_TIMER, &cs->HW_Flags))
-                               del_timer(&cs->dbusytimer);
-                       if (test_and_clear_bit(FLG_L1_DBUSY, &cs->HW_Flags))
-                               schedule_event(cs, D_CLEARBUSY);
-                       break;
-               default:
-                       if (cs->debug & L1_DEB_WARN)
-                               debugl1(cs, "Amd7930: l1hw: unknown %04x", pr);
-                       break;
+               Amd7930_fill_Dfifo(cs);
+               spin_unlock_irqrestore(&cs->lock, flags);
+               break;
+       case (PH_PULL | REQUEST):
+#ifdef L2FRAME_DEBUG           /* psa */
+               if (cs->debug & L1_DEB_LAPD)
+                       debugl1(cs, "Amd7930: l1hw: -> PH_REQUEST_PULL, skb: %s", (cs->tx_skb) ? "yes" : "no");
+#endif
+               if (!cs->tx_skb) {
+                       test_and_clear_bit(FLG_L1_PULL_REQ, &st->l1.Flags);
+                       st->l1.l1l2(st, PH_PULL | CONFIRM, NULL);
+               } else
+                       test_and_set_bit(FLG_L1_PULL_REQ, &st->l1.Flags);
+               break;
+       case (HW_RESET | REQUEST):
+               spin_lock_irqsave(&cs->lock, flags);
+               if ((cs->dc.amd7930.ph_state == 8)) {
+                       /* b-channels off, PH-AR cleared
+                        * change to F3 */
+                       Amd7930_ph_command(cs, 0x20, "HW_RESET REQEST"); //LMR1 bit 5
+                       spin_unlock_irqrestore(&cs->lock, flags);
+               } else {
+                       Amd7930_ph_command(cs, 0x40, "HW_RESET REQUEST");
+                       cs->dc.amd7930.ph_state = 2;
+                       spin_unlock_irqrestore(&cs->lock, flags);
+                       Amd7930_new_ph(cs);
+               }
+               break;
+       case (HW_ENABLE | REQUEST):
+               cs->dc.amd7930.ph_state = 9;
+               Amd7930_new_ph(cs);
+               break;
+       case (HW_INFO3 | REQUEST):
+               // automatic
+               break;
+       case (HW_TESTLOOP | REQUEST):
+               /* not implemented yet */
+               break;
+       case (HW_DEACTIVATE | RESPONSE):
+               skb_queue_purge(&cs->rq);
+               skb_queue_purge(&cs->sq);
+               if (cs->tx_skb) {
+                       dev_kfree_skb(cs->tx_skb);
+                       cs->tx_skb = NULL;
+               }
+               if (test_and_clear_bit(FLG_DBUSY_TIMER, &cs->HW_Flags))
+                       del_timer(&cs->dbusytimer);
+               if (test_and_clear_bit(FLG_L1_DBUSY, &cs->HW_Flags))
+                       schedule_event(cs, D_CLEARBUSY);
+               break;
+       default:
+               if (cs->debug & L1_DEB_WARN)
+                       debugl1(cs, "Amd7930: l1hw: unknown %04x", pr);
+               break;
        }
 }
 
@@ -670,16 +670,16 @@ static void
 setstack_Amd7930(struct PStack *st, struct IsdnCardState *cs)
 {
 
-        if (cs->debug & L1_DEB_ISAC)
+       if (cs->debug & L1_DEB_ISAC)
                debugl1(cs, "Amd7930: setstack called");
 
-        st->l1.l1hw = Amd7930_l1hw;
+       st->l1.l1hw = Amd7930_l1hw;
 }
 
 
 static void
 DC_Close_Amd7930(struct IsdnCardState *cs) {
-        if (cs->debug & L1_DEB_ISAC)
+       if (cs->debug & L1_DEB_ISAC)
                debugl1(cs, "Amd7930: DC_Close called");
 }
 
@@ -689,23 +689,23 @@ dbusy_timer_handler(struct IsdnCardState *cs)
 {
        u_long flags;
        struct PStack *stptr;
-        WORD dtcr, der;
-        BYTE dsr1, dsr2;
+       WORD dtcr, der;
+       BYTE dsr1, dsr2;
 
 
-        if (cs->debug & L1_DEB_ISAC)
+       if (cs->debug & L1_DEB_ISAC)
                debugl1(cs, "Amd7930: dbusy_timer expired!");
 
        if (test_bit(FLG_DBUSY_TIMER, &cs->HW_Flags)) {
                spin_lock_irqsave(&cs->lock, flags);
-                /* D Transmit Byte Count Register:
-                 * Counts down packet's number of Bytes, 0 if packet ready */
-                dtcr = rWordAMD(cs, 0x85);
-                dsr1 = rByteAMD(cs, 0x02);
-                dsr2 = rByteAMD(cs, 0x07);
-                der  = rWordAMD(cs, 0x03);
-
-               if (cs->debug & L1_DEB_ISAC)
+               /* D Transmit Byte Count Register:
+                * Counts down packet's number of Bytes, 0 if packet ready */
+               dtcr = rWordAMD(cs, 0x85);
+               dsr1 = rByteAMD(cs, 0x02);
+               dsr2 = rByteAMD(cs, 0x07);
+               der  = rWordAMD(cs, 0x03);
+
+               if (cs->debug & L1_DEB_ISAC)
                        debugl1(cs, "Amd7930: dbusy_timer_handler: DSR1=0x%02X, DSR2=0x%02X, DER=0x%04X, cs->tx_skb->len=%u, tx_stat=%u, dtcr=%u, cs->tx_cnt=%u", dsr1, dsr2, der, cs->tx_skb->len, cs->dc.amd7930.tx_xmtlen, dtcr, cs->tx_cnt);
 
                if ((cs->dc.amd7930.tx_xmtlen - dtcr) < cs->tx_cnt) {   /* D-Channel Busy */
@@ -724,7 +724,7 @@ dbusy_timer_handler(struct IsdnCardState *cs)
                                dev_kfree_skb_any(cs->tx_skb);
                                cs->tx_cnt = 0;
                                cs->tx_skb = NULL;
-                                cs->dc.amd7930.tx_xmtlen = 0;
+                               cs->dc.amd7930.tx_xmtlen = 0;
                        } else {
                                printk(KERN_WARNING "HiSax: Amd7930: D-Channel Busy no skb\n");
                                debugl1(cs, "Amd7930: D-Channel Busy no skb");
@@ -736,7 +736,7 @@ dbusy_timer_handler(struct IsdnCardState *cs)
                        spin_unlock_irqrestore(&cs->lock, flags);
                        cs->irq_func(cs->irq, cs);
 
-                        if (cs->debug & L1_DEB_ISAC)
+                       if (cs->debug & L1_DEB_ISAC)
                                debugl1(cs, "Amd7930: dbusy_timer_handler: Transmitter reset");
                }
        }
@@ -746,16 +746,16 @@ dbusy_timer_handler(struct IsdnCardState *cs)
 
 void Amd7930_init(struct IsdnCardState *cs)
 {
-    WORD *ptr;
-    BYTE cmd, cnt;
+       WORD *ptr;
+       BYTE cmd, cnt;
 
-        if (cs->debug & L1_DEB_ISAC)
+       if (cs->debug & L1_DEB_ISAC)
                debugl1(cs, "Amd7930: initamd called");
 
-        cs->dc.amd7930.tx_xmtlen = 0;
-        cs->dc.amd7930.old_state = 0;
-        cs->dc.amd7930.lmr1 = 0x40;
-        cs->dc.amd7930.ph_command = Amd7930_ph_command;
+       cs->dc.amd7930.tx_xmtlen = 0;
+       cs->dc.amd7930.old_state = 0;
+       cs->dc.amd7930.lmr1 = 0x40;
+       cs->dc.amd7930.ph_command = Amd7930_ph_command;
        cs->setstack_d = setstack_Amd7930;
        cs->DC_Close = DC_Close_Amd7930;
 
@@ -763,19 +763,19 @@ void Amd7930_init(struct IsdnCardState *cs)
        for (ptr = initAMD; *ptr != 0xFFFF; ) {
                cmd = LOBYTE(*ptr);
 
-                /* read */
-                if (*ptr++ >= 0x100) {
+               /* read */
+               if (*ptr++ >= 0x100) {
                        if (cmd < 8)
-                                /* reset register */
-                                rByteAMD(cs, cmd);
+                               /* reset register */
+                               rByteAMD(cs, cmd);
                        else {
                                wByteAMD(cs, 0x00, cmd);
                                for (cnt = *ptr++; cnt > 0; cnt--)
                                        rByteAMD(cs, 0x01);
                        }
                }
-                /* write */
-                else if (cmd < 8)
+               /* write */
+               else if (cmd < 8)
                        wByteAMD(cs, cmd, LOBYTE(*ptr++));
 
                else {
@@ -789,7 +789,7 @@ void Amd7930_init(struct IsdnCardState *cs)
 void __devinit
 setup_Amd7930(struct IsdnCardState *cs)
 {
-        INIT_WORK(&cs->tqueue, Amd7930_bh);
+       INIT_WORK(&cs->tqueue, Amd7930_bh);
        cs->dbusytimer.function = (void *) dbusy_timer_handler;
        cs->dbusytimer.data = (long) cs;
        init_timer(&cs->dbusytimer);
index 21cbbe1..29ec2df 100644 (file)
@@ -9,7 +9,7 @@
  * of the GNU General Public License, incorporated herein by reference.
  *
  */
+
 #include <linux/sched.h>
 #include "hisax.h"
 #include "isdnl1.h"
@@ -22,9 +22,9 @@ static void
 add_arcofi_timer(struct IsdnCardState *cs) {
        if (test_and_set_bit(FLG_ARCOFI_TIMER, &cs->HW_Flags)) {
                del_timer(&cs->dc.isac.arcofitimer);
-       }       
+       }
        init_timer(&cs->dc.isac.arcofitimer);
-       cs->dc.isac.arcofitimer.expires = jiffies + ((ARCOFI_TIMER_VALUE * HZ)/1000);
+       cs->dc.isac.arcofitimer.expires = jiffies + ((ARCOFI_TIMER_VALUE * HZ) / 1000);
        add_timer(&cs->dc.isac.arcofitimer);
 }
 
@@ -34,11 +34,11 @@ send_arcofi(struct IsdnCardState *cs) {
        cs->dc.isac.mon_txp = 0;
        cs->dc.isac.mon_txc = cs->dc.isac.arcofi_list->len;
        memcpy(cs->dc.isac.mon_tx, cs->dc.isac.arcofi_list->msg, cs->dc.isac.mon_txc);
-       switch(cs->dc.isac.arcofi_bc) {
-               case 0: break;
-               case 1: cs->dc.isac.mon_tx[1] |= 0x40;
-                       break;
-               default: break;
+       switch (cs->dc.isac.arcofi_bc) {
+       case 0: break;
+       case 1: cs->dc.isac.mon_tx[1] |= 0x40;
+               break;
+       default: break;
        }
        cs->dc.isac.mocr &= 0x0f;
        cs->dc.isac.mocr |= 0xa0;
@@ -58,42 +58,25 @@ arcofi_fsm(struct IsdnCardState *cs, int event, void *data) {
                cs->dc.isac.arcofi_state = ARCOFI_NOP;
                test_and_set_bit(FLG_ARCOFI_ERROR, &cs->HW_Flags);
                wake_up(&cs->dc.isac.arcofi_wait);
-               return(1);
+               return (1);
        }
        switch (cs->dc.isac.arcofi_state) {
-               case ARCOFI_NOP:
-                       if (event == ARCOFI_START) {
-                               cs->dc.isac.arcofi_list = data;
-                               cs->dc.isac.arcofi_state = ARCOFI_TRANSMIT;
-                               send_arcofi(cs);
-                       }
-                       break;
-               case ARCOFI_TRANSMIT:
-                       if (event == ARCOFI_TX_END) {
-                               if (cs->dc.isac.arcofi_list->receive) {
-                                       add_arcofi_timer(cs);
-                                       cs->dc.isac.arcofi_state = ARCOFI_RECEIVE;
-                               } else {
-                                       if (cs->dc.isac.arcofi_list->next) {
-                                               cs->dc.isac.arcofi_list =
-                                                       cs->dc.isac.arcofi_list->next;
-                                               send_arcofi(cs);
-                                       } else {
-                                               if (test_and_clear_bit(FLG_ARCOFI_TIMER, &cs->HW_Flags)) {
-                                                       del_timer(&cs->dc.isac.arcofitimer);
-                                               }
-                                               cs->dc.isac.arcofi_state = ARCOFI_NOP;
-                                               wake_up(&cs->dc.isac.arcofi_wait);
-                                       }
-                               }
-                       }
-                       break;
-               case ARCOFI_RECEIVE:
-                       if (event == ARCOFI_RX_END) {
+       case ARCOFI_NOP:
+               if (event == ARCOFI_START) {
+                       cs->dc.isac.arcofi_list = data;
+                       cs->dc.isac.arcofi_state = ARCOFI_TRANSMIT;
+                       send_arcofi(cs);
+               }
+               break;
+       case ARCOFI_TRANSMIT:
+               if (event == ARCOFI_TX_END) {
+                       if (cs->dc.isac.arcofi_list->receive) {
+                               add_arcofi_timer(cs);
+                               cs->dc.isac.arcofi_state = ARCOFI_RECEIVE;
+                       } else {
                                if (cs->dc.isac.arcofi_list->next) {
                                        cs->dc.isac.arcofi_list =
                                                cs->dc.isac.arcofi_list->next;
-                                       cs->dc.isac.arcofi_state = ARCOFI_TRANSMIT;
                                        send_arcofi(cs);
                                } else {
                                        if (test_and_clear_bit(FLG_ARCOFI_TIMER, &cs->HW_Flags)) {
@@ -103,12 +86,29 @@ arcofi_fsm(struct IsdnCardState *cs, int event, void *data) {
                                        wake_up(&cs->dc.isac.arcofi_wait);
                                }
                        }
-                       break;
-               default:
-                       debugl1(cs, "Arcofi unknown state %x", cs->dc.isac.arcofi_state);
-                       return(2);
+               }
+               break;
+       case ARCOFI_RECEIVE:
+               if (event == ARCOFI_RX_END) {
+                       if (cs->dc.isac.arcofi_list->next) {
+                               cs->dc.isac.arcofi_list =
+                                       cs->dc.isac.arcofi_list->next;
+                               cs->dc.isac.arcofi_state = ARCOFI_TRANSMIT;
+                               send_arcofi(cs);
+                       } else {
+                               if (test_and_clear_bit(FLG_ARCOFI_TIMER, &cs->HW_Flags)) {
+                                       del_timer(&cs->dc.isac.arcofitimer);
+                               }
+                               cs->dc.isac.arcofi_state = ARCOFI_NOP;
+                               wake_up(&cs->dc.isac.arcofi_wait);
+                       }
+               }
+               break;
+       default:
+               debugl1(cs, "Arcofi unknown state %x", cs->dc.isac.arcofi_state);
+               return (2);
        }
-       return(0);
+       return (0);
 }
 
 static void
index 00c44d3..b9c7752 100644 (file)
@@ -9,7 +9,7 @@
  * of the GNU General Public License, incorporated herein by reference.
  *
  */
+
 #define ARCOFI_USE     1
 
 /* states */
index 1f879b5..2b74a40 100644 (file)
@@ -22,7 +22,7 @@
 
 static const char *Asuscom_revision = "$Revision: 1.14.2.4 $";
 
-#define byteout(addr,val) outb(val,addr)
+#define byteout(addr, val) outb(val, addr)
 #define bytein(addr) inb(addr)
 
 #define ASUS_ISAC      0
@@ -51,7 +51,7 @@ readreg(unsigned int ale, unsigned int adr, u_char off)
 }
 
 static inline void
-readfifo(unsigned int ale, unsigned int adr, u_char off, u_char * data, int size)
+readfifo(unsigned int ale, unsigned int adr, u_char off, u_char *data, int size)
 {
        byteout(ale, off);
        insb(adr, data, size);
@@ -66,7 +66,7 @@ writereg(unsigned int ale, unsigned int adr, u_char off, u_char data)
 }
 
 static inline void
-writefifo(unsigned int ale, unsigned int adr, u_char off, u_char * data, int size)
+writefifo(unsigned int ale, unsigned int adr, u_char off, u_char *data, int size)
 {
        byteout(ale, off);
        outsb(adr, data, size);
@@ -87,13 +87,13 @@ WriteISAC(struct IsdnCardState *cs, u_char offset, u_char value)
 }
 
 static void
-ReadISACfifo(struct IsdnCardState *cs, u_char * data, int size)
+ReadISACfifo(struct IsdnCardState *cs, u_char *data, int size)
 {
        readfifo(cs->hw.asus.adr, cs->hw.asus.isac, 0, data, size);
 }
 
 static void
-WriteISACfifo(struct IsdnCardState *cs, u_char * data, int size)
+WriteISACfifo(struct IsdnCardState *cs, u_char *data, int size)
 {
        writefifo(cs->hw.asus.adr, cs->hw.asus.isac, 0, data, size);
 }
@@ -101,23 +101,23 @@ WriteISACfifo(struct IsdnCardState *cs, u_char * data, int size)
 static u_char
 ReadISAC_IPAC(struct IsdnCardState *cs, u_char offset)
 {
-       return (readreg(cs->hw.asus.adr, cs->hw.asus.isac, offset|0x80));
+       return (readreg(cs->hw.asus.adr, cs->hw.asus.isac, offset | 0x80));
 }
 
 static void
 WriteISAC_IPAC(struct IsdnCardState *cs, u_char offset, u_char value)
 {
-       writereg(cs->hw.asus.adr, cs->hw.asus.isac, offset|0x80, value);
+       writereg(cs->hw.asus.adr, cs->hw.asus.isac, offset | 0x80, value);
 }
 
 static void
-ReadISACfifo_IPAC(struct IsdnCardState *cs, u_char * data, int size)
+ReadISACfifo_IPAC(struct IsdnCardState *cs, u_char *data, int size)
 {
        readfifo(cs->hw.asus.adr, cs->hw.asus.isac, 0x80, data, size);
 }
 
 static void
-WriteISACfifo_IPAC(struct IsdnCardState *cs, u_char * data, int size)
+WriteISACfifo_IPAC(struct IsdnCardState *cs, u_char *data, int size)
 {
        writefifo(cs->hw.asus.adr, cs->hw.asus.isac, 0x80, data, size);
 }
@@ -140,16 +140,16 @@ WriteHSCX(struct IsdnCardState *cs, int hscx, u_char offset, u_char value)
  * fast interrupt HSCX stuff goes here
  */
 
-#define READHSCX(cs, nr, reg) readreg(cs->hw.asus.adr, \
-               cs->hw.asus.hscx, reg + (nr ? 0x40 : 0))
-#define WRITEHSCX(cs, nr, reg, data) writereg(cs->hw.asus.adr, \
-               cs->hw.asus.hscx, reg + (nr ? 0x40 : 0), data)
+#define READHSCX(cs, nr, reg) readreg(cs->hw.asus.adr,                 \
+                                     cs->hw.asus.hscx, reg + (nr ? 0x40 : 0))
+#define WRITEHSCX(cs, nr, reg, data) writereg(cs->hw.asus.adr,         \
+                                             cs->hw.asus.hscx, reg + (nr ? 0x40 : 0), data)
 
-#define READHSCXFIFO(cs, nr, ptr, cnt) readfifo(cs->hw.asus.adr, \
-               cs->hw.asus.hscx, (nr ? 0x40 : 0), ptr, cnt)
+#define READHSCXFIFO(cs, nr, ptr, cnt) readfifo(cs->hw.asus.adr,       \
+                                               cs->hw.asus.hscx, (nr ? 0x40 : 0), ptr, cnt)
 
-#define WRITEHSCXFIFO(cs, nr, ptr, cnt) writefifo(cs->hw.asus.adr, \
-               cs->hw.asus.hscx, (nr ? 0x40 : 0), ptr, cnt)
+#define WRITEHSCXFIFO(cs, nr, ptr, cnt) writefifo(cs->hw.asus.adr,     \
+                                                 cs->hw.asus.hscx, (nr ? 0x40 : 0), ptr, cnt)
 
 #include "hscx_irq.c"
 
@@ -162,11 +162,11 @@ asuscom_interrupt(int intno, void *dev_id)
 
        spin_lock_irqsave(&cs->lock, flags);
        val = readreg(cs->hw.asus.adr, cs->hw.asus.hscx, HSCX_ISTA + 0x40);
-      Start_HSCX:
+Start_HSCX:
        if (val)
                hscx_int_main(cs, val);
        val = readreg(cs->hw.asus.adr, cs->hw.asus.isac, ISAC_ISTA);
-      Start_ISAC:
+Start_ISAC:
        if (val)
                isac_interrupt(cs, val);
        val = readreg(cs->hw.asus.adr, cs->hw.asus.hscx, HSCX_ISTA + 0x40);
@@ -274,39 +274,39 @@ Asus_card_msg(struct IsdnCardState *cs, int mt, void *arg)
        u_long flags;
 
        switch (mt) {
-               case CARD_RESET:
-                       spin_lock_irqsave(&cs->lock, flags);
-                       reset_asuscom(cs);
-                       spin_unlock_irqrestore(&cs->lock, flags);
-                       return(0);
-               case CARD_RELEASE:
-                       release_io_asuscom(cs);
-                       return(0);
-               case CARD_INIT:
-                       spin_lock_irqsave(&cs->lock, flags);
-                       cs->debug |= L1_DEB_IPAC;
-                       inithscxisac(cs, 3);
-                       spin_unlock_irqrestore(&cs->lock, flags);
-                       return(0);
-               case CARD_TEST:
-                       return(0);
+       case CARD_RESET:
+               spin_lock_irqsave(&cs->lock, flags);
+               reset_asuscom(cs);
+               spin_unlock_irqrestore(&cs->lock, flags);
+               return (0);
+       case CARD_RELEASE:
+               release_io_asuscom(cs);
+               return (0);
+       case CARD_INIT:
+               spin_lock_irqsave(&cs->lock, flags);
+               cs->debug |= L1_DEB_IPAC;
+               inithscxisac(cs, 3);
+               spin_unlock_irqrestore(&cs->lock, flags);
+               return (0);
+       case CARD_TEST:
+               return (0);
        }
-       return(0);
+       return (0);
 }
 
 #ifdef __ISAPNP__
 static struct isapnp_device_id asus_ids[] __devinitdata = {
        { ISAPNP_VENDOR('A', 'S', 'U'), ISAPNP_FUNCTION(0x1688),
-         ISAPNP_VENDOR('A', 'S', 'U'), ISAPNP_FUNCTION(0x1688), 
+         ISAPNP_VENDOR('A', 'S', 'U'), ISAPNP_FUNCTION(0x1688),
          (unsigned long) "Asus1688 PnP" },
        { ISAPNP_VENDOR('A', 'S', 'U'), ISAPNP_FUNCTION(0x1690),
-         ISAPNP_VENDOR('A', 'S', 'U'), ISAPNP_FUNCTION(0x1690), 
+         ISAPNP_VENDOR('A', 'S', 'U'), ISAPNP_FUNCTION(0x1690),
          (unsigned long) "Asus1690 PnP" },
        { ISAPNP_VENDOR('S', 'I', 'E'), ISAPNP_FUNCTION(0x0020),
-         ISAPNP_VENDOR('S', 'I', 'E'), ISAPNP_FUNCTION(0x0020), 
+         ISAPNP_VENDOR('S', 'I', 'E'), ISAPNP_FUNCTION(0x0020),
          (unsigned long) "Isurf2 PnP" },
        { ISAPNP_VENDOR('E', 'L', 'F'), ISAPNP_FUNCTION(0x0000),
-         ISAPNP_VENDOR('E', 'L', 'F'), ISAPNP_FUNCTION(0x0000), 
+         ISAPNP_VENDOR('E', 'L', 'F'), ISAPNP_FUNCTION(0x0000),
          (unsigned long) "Iscas TE320" },
        { 0, }
 };
@@ -330,30 +330,30 @@ setup_asuscom(struct IsdnCard *card)
 #ifdef __ISAPNP__
        if (!card->para[1] && isapnp_present()) {
                struct pnp_dev *pnp_d;
-               while(ipid->card_vendor) {
+               while (ipid->card_vendor) {
                        if ((pnp_c = pnp_find_card(ipid->card_vendor,
-                               ipid->card_device, pnp_c))) {
+                                                  ipid->card_device, pnp_c))) {
                                pnp_d = NULL;
                                if ((pnp_d = pnp_find_dev(pnp_c,
-                                       ipid->vendor, ipid->function, pnp_d))) {
+                                                         ipid->vendor, ipid->function, pnp_d))) {
                                        int err;
 
                                        printk(KERN_INFO "HiSax: %s detected\n",
-                                               (char *)ipid->driver_data);
+                                              (char *)ipid->driver_data);
                                        pnp_disable_dev(pnp_d);
                                        err = pnp_activate_dev(pnp_d);
-                                       if (err<0) {
+                                       if (err < 0) {
                                                printk(KERN_WARNING "%s: pnp_activate_dev ret(%d)\n",
-                                                       __func__, err);
-                                               return(0);
+                                                      __func__, err);
+                                               return (0);
                                        }
                                        card->para[1] = pnp_port_start(pnp_d, 0);
                                        card->para[0] = pnp_irq(pnp_d, 0);
                                        if (!card->para[0] || !card->para[1]) {
                                                printk(KERN_ERR "AsusPnP:some resources are missing %ld/%lx\n",
-                                                       card->para[0], card->para[1]);
+                                                      card->para[0], card->para[1]);
                                                pnp_disable_dev(pnp_d);
-                                               return(0);
+                                               return (0);
                                        }
                                        break;
                                } else {
@@ -362,10 +362,10 @@ setup_asuscom(struct IsdnCard *card)
                        }
                        ipid++;
                        pnp_c = NULL;
-               } 
+               }
                if (!ipid->card_vendor) {
                        printk(KERN_INFO "AsusPnP: no ISAPnP card found\n");
-                       return(0);
+                       return (0);
                }
        }
 #endif
@@ -380,14 +380,14 @@ setup_asuscom(struct IsdnCard *card)
                return (0);
        }
        printk(KERN_INFO "ISDNLink: defined at 0x%x IRQ %d\n",
-               cs->hw.asus.cfg_reg, cs->irq);
+              cs->hw.asus.cfg_reg, cs->irq);
        setup_isac(cs);
        cs->BC_Read_Reg = &ReadHSCX;
        cs->BC_Write_Reg = &WriteHSCX;
        cs->BC_Send_Data = &hscx_fill_fifo;
        cs->cardmsg = &Asus_card_msg;
-       val = readreg(cs->hw.asus.cfg_reg + ASUS_IPAC_ALE, 
-               cs->hw.asus.cfg_reg + ASUS_IPAC_DATA, IPAC_ID);
+       val = readreg(cs->hw.asus.cfg_reg + ASUS_IPAC_ALE,
+                     cs->hw.asus.cfg_reg + ASUS_IPAC_DATA, IPAC_ID);
        if ((val == 1) || (val == 2)) {
                cs->subtyp = ASUS_IPAC;
                cs->hw.asus.adr  = cs->hw.asus.cfg_reg + ASUS_IPAC_ALE;
@@ -415,7 +415,7 @@ setup_asuscom(struct IsdnCard *card)
                ISACVersion(cs, "ISDNLink:");
                if (HscxVersion(cs, "ISDNLink:")) {
                        printk(KERN_WARNING
-                       "ISDNLink: wrong HSCX versions check IO address\n");
+                              "ISDNLink: wrong HSCX versions check IO address\n");
                        release_io_asuscom(cs);
                        return (0);
                }
index eb6b432..402d489 100644 (file)
@@ -22,7 +22,7 @@ static const char *avm_revision = "$Revision: 2.15.2.4 $";
 #define         AVM_A1_STAT_HSCX       0x02
 #define         AVM_A1_STAT_TIMER      0x04
 
-#define byteout(addr,val) outb(val,addr)
+#define byteout(addr, val) outb(val, addr)
 #define bytein(addr) inb(addr)
 
 static inline u_char
@@ -39,13 +39,13 @@ writereg(unsigned int adr, u_char off, u_char data)
 
 
 static inline void
-read_fifo(unsigned int adr, u_char * data, int size)
+read_fifo(unsigned int adr, u_char *data, int size)
 {
        insb(adr, data, size);
 }
 
 static void
-write_fifo(unsigned int adr, u_char * data, int size)
+write_fifo(unsigned int adr, u_char *data, int size)
 {
        outsb(adr, data, size);
 }
@@ -65,13 +65,13 @@ WriteISAC(struct IsdnCardState *cs, u_char offset, u_char value)
 }
 
 static void
-ReadISACfifo(struct IsdnCardState *cs, u_char * data, int size)
+ReadISACfifo(struct IsdnCardState *cs, u_char *data, int size)
 {
        read_fifo(cs->hw.avm.isacfifo, data, size);
 }
 
 static void
-WriteISACfifo(struct IsdnCardState *cs, u_char * data, int size)
+WriteISACfifo(struct IsdnCardState *cs, u_char *data, int size)
 {
        write_fifo(cs->hw.avm.isacfifo, data, size);
 }
@@ -158,23 +158,23 @@ AVM_card_msg(struct IsdnCardState *cs, int mt, void *arg)
        u_long flags;
 
        switch (mt) {
-               case CARD_RESET:
-                       return(0);
-               case CARD_RELEASE:
-                       release_ioregs(cs, 0x3f);
-                       return(0);
-               case CARD_INIT:
-                       spin_lock_irqsave(&cs->lock, flags);
-                       inithscxisac(cs, 1);
-                       byteout(cs->hw.avm.cfg_reg, 0x16);
-                       byteout(cs->hw.avm.cfg_reg, 0x1E);
-                       inithscxisac(cs, 2);
-                       spin_unlock_irqrestore(&cs->lock, flags);
-                       return(0);
-               case CARD_TEST:
-                       return(0);
+       case CARD_RESET:
+               return (0);
+       case CARD_RELEASE:
+               release_ioregs(cs, 0x3f);
+               return (0);
+       case CARD_INIT:
+               spin_lock_irqsave(&cs->lock, flags);
+               inithscxisac(cs, 1);
+               byteout(cs->hw.avm.cfg_reg, 0x16);
+               byteout(cs->hw.avm.cfg_reg, 0x1E);
+               inithscxisac(cs, 2);
+               spin_unlock_irqrestore(&cs->lock, flags);
+               return (0);
+       case CARD_TEST:
+               return (0);
        }
-       return(0);
+       return (0);
 }
 
 int __devinit
index 3039c6d..3934719 100644 (file)
@@ -39,7 +39,7 @@
 #define         ASL0_R_ISAC            0x20 /* active low */
 #define         ASL0_R_HSCX            0x40 /* active low */
 #define         ASL0_R_TESTBIT         0x80
-#define  ASL0_R_IRQPENDING     (ASL0_R_ISAC|ASL0_R_HSCX|ASL0_R_TIMER)
+#define  ASL0_R_IRQPENDING     (ASL0_R_ISAC | ASL0_R_HSCX | ASL0_R_TIMER)
 
 /* write bits ASL0 */
 #define         ASL0_W_RESET           0x01
@@ -52,8 +52,8 @@
 #define         ASL1_W_LED0            0x10
 #define         ASL1_W_LED1            0x20
 #define         ASL1_W_ENABLE_S0       0xC0
-#define byteout(addr,val) outb(val,addr)
+
+#define byteout(addr, val) outb(val, addr)
 #define bytein(addr) inb(addr)
 
 static const char *avm_revision = "$Revision: 2.9.2.5 $";
@@ -61,34 +61,34 @@ static const char *avm_revision = "$Revision: 2.9.2.5 $";
 static inline u_char
 ReadISAC(struct IsdnCardState *cs, u_char offset)
 {
-        u_char ret;
+       u_char ret;
 
-        offset -= 0x20;
-        byteout(cs->hw.avm.cfg_reg+ADDRREG_OFFSET,ISAC_REG_OFFSET+offset);
-       ret = bytein(cs->hw.avm.cfg_reg+DATAREG_OFFSET);
+       offset -= 0x20;
+       byteout(cs->hw.avm.cfg_reg + ADDRREG_OFFSET, ISAC_REG_OFFSET + offset);
+       ret = bytein(cs->hw.avm.cfg_reg + DATAREG_OFFSET);
        return ret;
 }
 
 static inline void
 WriteISAC(struct IsdnCardState *cs, u_char offset, u_char value)
 {
-        offset -= 0x20;
-        byteout(cs->hw.avm.cfg_reg+ADDRREG_OFFSET,ISAC_REG_OFFSET+offset);
-       byteout(cs->hw.avm.cfg_reg+DATAREG_OFFSET, value);
+       offset -= 0x20;
+       byteout(cs->hw.avm.cfg_reg + ADDRREG_OFFSET, ISAC_REG_OFFSET + offset);
+       byteout(cs->hw.avm.cfg_reg + DATAREG_OFFSET, value);
 }
 
 static inline void
-ReadISACfifo(struct IsdnCardState *cs, u_char * data, int size)
+ReadISACfifo(struct IsdnCardState *cs, u_char *data, int size)
 {
-       byteout(cs->hw.avm.cfg_reg+ADDRREG_OFFSET,ISAC_FIFO_OFFSET);
-       insb(cs->hw.avm.cfg_reg+DATAREG_OFFSET, data, size);
+       byteout(cs->hw.avm.cfg_reg + ADDRREG_OFFSET, ISAC_FIFO_OFFSET);
+       insb(cs->hw.avm.cfg_reg + DATAREG_OFFSET, data, size);
 }
 
 static inline void
-WriteISACfifo(struct IsdnCardState *cs, u_char * data, int size)
+WriteISACfifo(struct IsdnCardState *cs, u_char *data, int size)
 {
-       byteout(cs->hw.avm.cfg_reg+ADDRREG_OFFSET,ISAC_FIFO_OFFSET);
-       outsb(cs->hw.avm.cfg_reg+DATAREG_OFFSET, data, size);
+       byteout(cs->hw.avm.cfg_reg + ADDRREG_OFFSET, ISAC_FIFO_OFFSET);
+       outsb(cs->hw.avm.cfg_reg + DATAREG_OFFSET, data, size);
 }
 
 static inline u_char
@@ -96,36 +96,36 @@ ReadHSCX(struct IsdnCardState *cs, int hscx, u_char offset)
 {
        u_char ret;
 
-        offset -= 0x20;
-       byteout(cs->hw.avm.cfg_reg+ADDRREG_OFFSET,
-                       HSCX_REG_OFFSET+hscx*HSCX_CH_DIFF+offset);
-       ret = bytein(cs->hw.avm.cfg_reg+DATAREG_OFFSET);
+       offset -= 0x20;
+       byteout(cs->hw.avm.cfg_reg + ADDRREG_OFFSET,
+               HSCX_REG_OFFSET + hscx * HSCX_CH_DIFF + offset);
+       ret = bytein(cs->hw.avm.cfg_reg + DATAREG_OFFSET);
        return ret;
 }
 
 static inline void
 WriteHSCX(struct IsdnCardState *cs, int hscx, u_char offset, u_char value)
 {
-        offset -= 0x20;
-       byteout(cs->hw.avm.cfg_reg+ADDRREG_OFFSET,
-                       HSCX_REG_OFFSET+hscx*HSCX_CH_DIFF+offset);
-       byteout(cs->hw.avm.cfg_reg+DATAREG_OFFSET, value);
+       offset -= 0x20;
+       byteout(cs->hw.avm.cfg_reg + ADDRREG_OFFSET,
+               HSCX_REG_OFFSET + hscx * HSCX_CH_DIFF + offset);
+       byteout(cs->hw.avm.cfg_reg + DATAREG_OFFSET, value);
 }
 
 static inline void
-ReadHSCXfifo(struct IsdnCardState *cs, int hscx, u_char * data, int size)
+ReadHSCXfifo(struct IsdnCardState *cs, int hscx, u_char *data, int size)
 {
-       byteout(cs->hw.avm.cfg_reg+ADDRREG_OFFSET,
-                       HSCX_FIFO_OFFSET+hscx*HSCX_CH_DIFF);
-       insb(cs->hw.avm.cfg_reg+DATAREG_OFFSET, data, size);
+       byteout(cs->hw.avm.cfg_reg + ADDRREG_OFFSET,
+               HSCX_FIFO_OFFSET + hscx * HSCX_CH_DIFF);
+       insb(cs->hw.avm.cfg_reg + DATAREG_OFFSET, data, size);
 }
 
 static inline void
-WriteHSCXfifo(struct IsdnCardState *cs, int hscx, u_char * data, int size)
+WriteHSCXfifo(struct IsdnCardState *cs, int hscx, u_char *data, int size)
 {
-       byteout(cs->hw.avm.cfg_reg+ADDRREG_OFFSET,
-                       HSCX_FIFO_OFFSET+hscx*HSCX_CH_DIFF);
-       outsb(cs->hw.avm.cfg_reg+DATAREG_OFFSET, data, size);
+       byteout(cs->hw.avm.cfg_reg + ADDRREG_OFFSET,
+               HSCX_FIFO_OFFSET + hscx * HSCX_CH_DIFF);
+       outsb(cs->hw.avm.cfg_reg + DATAREG_OFFSET, data, size);
 }
 
 /*
@@ -134,7 +134,7 @@ WriteHSCXfifo(struct IsdnCardState *cs, int hscx, u_char * data, int size)
 
 #define READHSCX(cs, nr, reg) ReadHSCX(cs, nr, reg)
 #define WRITEHSCX(cs, nr, reg, data) WriteHSCX(cs, nr, reg, data)
-#define READHSCXFIFO(cs, nr, ptr, cnt) ReadHSCXfifo(cs, nr, ptr, cnt) 
+#define READHSCXFIFO(cs, nr, ptr, cnt) ReadHSCXfifo(cs, nr, ptr, cnt)
 #define WRITEHSCXFIFO(cs, nr, ptr, cnt) WriteHSCXfifo(cs, nr, ptr, cnt)
 
 #include "hscx_irq.c"
@@ -147,11 +147,11 @@ avm_a1p_interrupt(int intno, void *dev_id)
        u_long flags;
 
        spin_lock_irqsave(&cs->lock, flags);
-       while ((sval = (~bytein(cs->hw.avm.cfg_reg+ASL0_OFFSET) & ASL0_R_IRQPENDING))) {
+       while ((sval = (~bytein(cs->hw.avm.cfg_reg + ASL0_OFFSET) & ASL0_R_IRQPENDING))) {
                if (cs->debug & L1_DEB_INTSTAT)
                        debugl1(cs, "avm IntStatus %x", sval);
                if (sval & ASL0_R_HSCX) {
-                        val = ReadHSCX(cs, 1, HSCX_ISTA);
+                       val = ReadHSCX(cs, 1, HSCX_ISTA);
                        if (val)
                                hscx_int_main(cs, val);
                }
@@ -177,38 +177,38 @@ AVM_card_msg(struct IsdnCardState *cs, int mt, void *arg)
        u_long flags;
 
        switch (mt) {
-               case CARD_RESET:
-                       spin_lock_irqsave(&cs->lock, flags);
-                       byteout(cs->hw.avm.cfg_reg+ASL0_OFFSET,0x00);
-                       HZDELAY(HZ / 5 + 1);
-                       byteout(cs->hw.avm.cfg_reg+ASL0_OFFSET,ASL0_W_RESET);
-                       HZDELAY(HZ / 5 + 1);
-                       byteout(cs->hw.avm.cfg_reg+ASL0_OFFSET,0x00);
-                       spin_unlock_irqrestore(&cs->lock, flags);
-                       return 0;
-
-               case CARD_RELEASE:
-                       /* free_irq is done in HiSax_closecard(). */
-                       /* free_irq(cs->irq, cs); */
-                       return 0;
-
-               case CARD_INIT:
-                       spin_lock_irqsave(&cs->lock, flags);
-                       byteout(cs->hw.avm.cfg_reg+ASL0_OFFSET,ASL0_W_TDISABLE|ASL0_W_TRESET|ASL0_W_IRQENABLE);
-                       clear_pending_isac_ints(cs);
-                       clear_pending_hscx_ints(cs);
-                       inithscxisac(cs, 1);
-                       inithscxisac(cs, 2);
-                       spin_unlock_irqrestore(&cs->lock, flags);
-                       return 0;
-
-               case CARD_TEST:
-                       /* we really don't need it for the PCMCIA Version */
-                       return 0;
-
-               default:
-                       /* all card drivers ignore others, so we do the same */
-                       return 0;
+       case CARD_RESET:
+               spin_lock_irqsave(&cs->lock, flags);
+               byteout(cs->hw.avm.cfg_reg + ASL0_OFFSET, 0x00);
+               HZDELAY(HZ / 5 + 1);
+               byteout(cs->hw.avm.cfg_reg + ASL0_OFFSET, ASL0_W_RESET);
+               HZDELAY(HZ / 5 + 1);
+               byteout(cs->hw.avm.cfg_reg + ASL0_OFFSET, 0x00);
+               spin_unlock_irqrestore(&cs->lock, flags);
+               return 0;
+
+       case CARD_RELEASE:
+               /* free_irq is done in HiSax_closecard(). */
+               /* free_irq(cs->irq, cs); */
+               return 0;
+
+       case CARD_INIT:
+               spin_lock_irqsave(&cs->lock, flags);
+               byteout(cs->hw.avm.cfg_reg + ASL0_OFFSET, ASL0_W_TDISABLE | ASL0_W_TRESET | ASL0_W_IRQENABLE);
+               clear_pending_isac_ints(cs);
+               clear_pending_hscx_ints(cs);
+               inithscxisac(cs, 1);
+               inithscxisac(cs, 2);
+               spin_unlock_irqrestore(&cs->lock, flags);
+               return 0;
+
+       case CARD_TEST:
+               /* we really don't need it for the PCMCIA Version */
+               return 0;
+
+       default:
+               /* all card drivers ignore others, so we do the same */
+               return 0;
        }
        return 0;
 }
@@ -222,7 +222,7 @@ int __devinit setup_avm_a1_pcmcia(struct IsdnCard *card)
 
        strcpy(tmp, avm_revision);
        printk(KERN_INFO "HiSax: AVM A1 PCMCIA driver Rev. %s\n",
-                                                HiSax_getrev(tmp));
+              HiSax_getrev(tmp));
        if (cs->typ != ISDN_CTYPE_A1_PCMCIA)
                return (0);
 
@@ -230,20 +230,20 @@ int __devinit setup_avm_a1_pcmcia(struct IsdnCard *card)
        cs->irq = card->para[0];
 
 
-       byteout(cs->hw.avm.cfg_reg+ASL1_OFFSET, ASL1_W_ENABLE_S0);
-       byteout(cs->hw.avm.cfg_reg+ASL0_OFFSET,0x00);
+       byteout(cs->hw.avm.cfg_reg + ASL1_OFFSET, ASL1_W_ENABLE_S0);
+       byteout(cs->hw.avm.cfg_reg + ASL0_OFFSET, 0x00);
        HZDELAY(HZ / 5 + 1);
-       byteout(cs->hw.avm.cfg_reg+ASL0_OFFSET,ASL0_W_RESET);
+       byteout(cs->hw.avm.cfg_reg + ASL0_OFFSET, ASL0_W_RESET);
        HZDELAY(HZ / 5 + 1);
-       byteout(cs->hw.avm.cfg_reg+ASL0_OFFSET,0x00);
+       byteout(cs->hw.avm.cfg_reg + ASL0_OFFSET, 0x00);
 
-       byteout(cs->hw.avm.cfg_reg+ASL0_OFFSET, ASL0_W_TDISABLE|ASL0_W_TRESET);
+       byteout(cs->hw.avm.cfg_reg + ASL0_OFFSET, ASL0_W_TDISABLE | ASL0_W_TRESET);
 
-       model = bytein(cs->hw.avm.cfg_reg+MODREG_OFFSET);
-       vers = bytein(cs->hw.avm.cfg_reg+VERREG_OFFSET);
+       model = bytein(cs->hw.avm.cfg_reg + MODREG_OFFSET);
+       vers = bytein(cs->hw.avm.cfg_reg + VERREG_OFFSET);
 
        printk(KERN_INFO "AVM A1 PCMCIA: io 0x%x irq %d model %d version %d\n",
-                               cs->hw.avm.cfg_reg, cs->irq, model, vers);
+              cs->hw.avm.cfg_reg, cs->irq, model, vers);
 
        setup_isac(cs);
        cs->readisac = &ReadISAC;
index 0e66af1..979492d 100644 (file)
@@ -95,14 +95,14 @@ WriteISAC(struct IsdnCardState *cs, u_char offset, u_char value)
 }
 
 static void
-ReadISACfifo(struct IsdnCardState *cs, u_char * data, int size)
+ReadISACfifo(struct IsdnCardState *cs, u_char *data, int size)
 {
        outb(AVM_ISAC_FIFO, cs->hw.avm.cfg_reg + 4);
        insb(cs->hw.avm.isac, data, size);
 }
 
 static void
-WriteISACfifo(struct IsdnCardState *cs, u_char * data, int size)
+WriteISACfifo(struct IsdnCardState *cs, u_char *data, int size)
 {
        outb(AVM_ISAC_FIFO, cs->hw.avm.cfg_reg + 4);
        outsb(cs->hw.avm.isac, data, size);
@@ -151,7 +151,7 @@ WriteHDLCPnP(struct IsdnCardState *cs, int chan, u_char offset, u_char value)
 static u_char
 ReadHDLC_s(struct IsdnCardState *cs, int chan, u_char offset)
 {
-       return(0xff & ReadHDLCPCI(cs, chan, offset));
+       return (0xff & ReadHDLCPCI(cs, chan, offset));
 }
 
 static void
@@ -164,11 +164,11 @@ static inline
 struct BCState *Sel_BCS(struct IsdnCardState *cs, int channel)
 {
        if (cs->bcs[0].mode && (cs->bcs[0].channel == channel))
-               return(&cs->bcs[0]);
+               return (&cs->bcs[0]);
        else if (cs->bcs[1].mode && (cs->bcs[1].channel == channel))
-               return(&cs->bcs[1]);
+               return (&cs->bcs[1]);
        else
-               return(NULL);
+               return (NULL);
 }
 
 static void
@@ -182,13 +182,13 @@ write_ctrl(struct BCState *bcs, int which) {
        } else {
                if (which & 4)
                        WriteHDLCPnP(bcs->cs, bcs->channel, HDLC_STATUS + 2,
-                               bcs->hw.hdlc.ctrl.sr.mode);
+                                    bcs->hw.hdlc.ctrl.sr.mode);
                if (which & 2)
                        WriteHDLCPnP(bcs->cs, bcs->channel, HDLC_STATUS + 1,
-                               bcs->hw.hdlc.ctrl.sr.xml);
+                                    bcs->hw.hdlc.ctrl.sr.xml);
                if (which & 1)
                        WriteHDLCPnP(bcs->cs, bcs->channel, HDLC_STATUS,
-                               bcs->hw.hdlc.ctrl.sr.cmd);
+                                    bcs->hw.hdlc.ctrl.sr.cmd);
        }
 }
 
@@ -203,41 +203,41 @@ modehdlc(struct BCState *bcs, int mode, int bc)
                        'A' + hdlc, bcs->mode, mode, hdlc, bc);
        bcs->hw.hdlc.ctrl.ctrl = 0;
        switch (mode) {
-               case (-1): /* used for init */
-                       bcs->mode = 1;
-                       bcs->channel = bc;
-                       bc = 0;
-               case (L1_MODE_NULL):
-                       if (bcs->mode == L1_MODE_NULL)
-                               return;
-                       bcs->hw.hdlc.ctrl.sr.cmd  = HDLC_CMD_XRS | HDLC_CMD_RRS;
-                       bcs->hw.hdlc.ctrl.sr.mode = HDLC_MODE_TRANS;
-                       write_ctrl(bcs, 5);
-                       bcs->mode = L1_MODE_NULL;
-                       bcs->channel = bc;
-                       break;
-               case (L1_MODE_TRANS):
-                       bcs->mode = mode;
-                       bcs->channel = bc;
-                       bcs->hw.hdlc.ctrl.sr.cmd  = HDLC_CMD_XRS | HDLC_CMD_RRS;
-                       bcs->hw.hdlc.ctrl.sr.mode = HDLC_MODE_TRANS;
-                       write_ctrl(bcs, 5);
-                       bcs->hw.hdlc.ctrl.sr.cmd = HDLC_CMD_XRS;
-                       write_ctrl(bcs, 1);
-                       bcs->hw.hdlc.ctrl.sr.cmd = 0;
-                       schedule_event(bcs, B_XMTBUFREADY);
-                       break;
-               case (L1_MODE_HDLC):
-                       bcs->mode = mode;
-                       bcs->channel = bc;
-                       bcs->hw.hdlc.ctrl.sr.cmd  = HDLC_CMD_XRS | HDLC_CMD_RRS;
-                       bcs->hw.hdlc.ctrl.sr.mode = HDLC_MODE_ITF_FLG;
-                       write_ctrl(bcs, 5);
-                       bcs->hw.hdlc.ctrl.sr.cmd = HDLC_CMD_XRS;
-                       write_ctrl(bcs, 1);
-                       bcs->hw.hdlc.ctrl.sr.cmd = 0;
-                       schedule_event(bcs, B_XMTBUFREADY);
-                       break;
+       case (-1): /* used for init */
+               bcs->mode = 1;
+               bcs->channel = bc;
+               bc = 0;
+       case (L1_MODE_NULL):
+               if (bcs->mode == L1_MODE_NULL)
+                       return;
+               bcs->hw.hdlc.ctrl.sr.cmd  = HDLC_CMD_XRS | HDLC_CMD_RRS;
+               bcs->hw.hdlc.ctrl.sr.mode = HDLC_MODE_TRANS;
+               write_ctrl(bcs, 5);
+               bcs->mode = L1_MODE_NULL;
+               bcs->channel = bc;
+               break;
+       case (L1_MODE_TRANS):
+               bcs->mode = mode;
+               bcs->channel = bc;
+               bcs->hw.hdlc.ctrl.sr.cmd  = HDLC_CMD_XRS | HDLC_CMD_RRS;
+               bcs->hw.hdlc.ctrl.sr.mode = HDLC_MODE_TRANS;
+               write_ctrl(bcs, 5);
+               bcs->hw.hdlc.ctrl.sr.cmd = HDLC_CMD_XRS;
+               write_ctrl(bcs, 1);
+               bcs->hw.hdlc.ctrl.sr.cmd = 0;
+               schedule_event(bcs, B_XMTBUFREADY);
+               break;
+       case (L1_MODE_HDLC):
+               bcs->mode = mode;
+               bcs->channel = bc;
+               bcs->hw.hdlc.ctrl.sr.cmd  = HDLC_CMD_XRS | HDLC_CMD_RRS;
+               bcs->hw.hdlc.ctrl.sr.mode = HDLC_MODE_ITF_FLG;
+               write_ctrl(bcs, 5);
+               bcs->hw.hdlc.ctrl.sr.cmd = HDLC_CMD_XRS;
+               write_ctrl(bcs, 1);
+               bcs->hw.hdlc.ctrl.sr.cmd = 0;
+               schedule_event(bcs, B_XMTBUFREADY);
+               break;
        }
 }
 
@@ -247,7 +247,7 @@ hdlc_empty_fifo(struct BCState *bcs, int count)
        register u_int *ptr;
        u_char *p;
        u_char idx = bcs->channel ? AVM_HDLC_2 : AVM_HDLC_1;
-       int cnt=0;
+       int cnt = 0;
        struct IsdnCardState *cs = bcs->cs;
 
        if ((cs->debug & L1_DEB_HSCX) && !(cs->debug & L1_DEB_HSCX_FIFO))
@@ -264,7 +264,7 @@ hdlc_empty_fifo(struct BCState *bcs, int count)
                outl(idx, cs->hw.avm.cfg_reg + 4);
                while (cnt < count) {
 #ifdef __powerpc__
-                       *ptr++ = in_be32((unsigned *)(cs->hw.avm.isac +_IO_BASE));
+                       *ptr++ = in_be32((unsigned *)(cs->hw.avm.isac + _IO_BASE));
 #else
                        *ptr++ = inl(cs->hw.avm.isac);
 #endif /* __powerpc__ */
@@ -293,7 +293,7 @@ static inline void
 hdlc_fill_fifo(struct BCState *bcs)
 {
        struct IsdnCardState *cs = bcs->cs;
-       int count, cnt =0;
+       int count, cnt = 0;
        int fifo_size = 32;
        u_char *p;
        u_int *ptr;
@@ -323,16 +323,16 @@ hdlc_fill_fifo(struct BCState *bcs)
        bcs->hw.hdlc.ctrl.sr.xml = ((count == fifo_size) ? 0 : count);
        write_ctrl(bcs, 3);  /* sets the correct index too */
        if (cs->subtyp == AVM_FRITZ_PCI) {
-               while (cnt<count) {
+               while (cnt < count) {
 #ifdef __powerpc__
-                       out_be32((unsigned *)(cs->hw.avm.isac +_IO_BASE), *ptr++);
+                       out_be32((unsigned *)(cs->hw.avm.isac + _IO_BASE), *ptr++);
 #else
                        outl(*ptr++, cs->hw.avm.isac);
 #endif /* __powerpc__ */
                        cnt += 4;
                }
        } else {
-               while (cnt<count) {
+               while (cnt < count) {
                        outb(*p++, cs->hw.avm.isac);
                        cnt++;
                }
@@ -369,17 +369,17 @@ HDLC_irq(struct BCState *bcs, u_int stat) {
                        write_ctrl(bcs, 1);
                        bcs->hw.hdlc.rcvidx = 0;
                } else {
-                       if (!(len = (stat & HDLC_STAT_RML_MASK)>>8))
+                       if (!(len = (stat & HDLC_STAT_RML_MASK) >> 8))
                                len = 32;
                        hdlc_empty_fifo(bcs, len);
                        if ((stat & HDLC_STAT_RME) || (bcs->mode == L1_MODE_TRANS)) {
-                               if (((stat & HDLC_STAT_CRCVFRRAB)==HDLC_STAT_CRCVFR) ||
-                                       (bcs->mode == L1_MODE_TRANS)) {
+                               if (((stat & HDLC_STAT_CRCVFRRAB) == HDLC_STAT_CRCVFR) ||
+                                   (bcs->mode == L1_MODE_TRANS)) {
                                        if (!(skb = dev_alloc_skb(bcs->hw.hdlc.rcvidx)))
                                                printk(KERN_WARNING "HDLC: receive out of memory\n");
                                        else {
                                                memcpy(skb_put(skb, bcs->hw.hdlc.rcvidx),
-                                                       bcs->hw.hdlc.rcvbuf, bcs->hw.hdlc.rcvidx);
+                                                      bcs->hw.hdlc.rcvbuf, bcs->hw.hdlc.rcvidx);
                                                skb_queue_tail(&bcs->rqueue, skb);
                                        }
                                        bcs->hw.hdlc.rcvidx = 0;
@@ -418,9 +418,9 @@ HDLC_irq(struct BCState *bcs, u_int stat) {
                                hdlc_fill_fifo(bcs);
                                return;
                        } else {
-                               if (test_bit(FLG_LLI_L1WAKEUP,&bcs->st->lli.flag) &&
-                                       (PACKET_NOACK != bcs->tx_skb->pkt_type)) {
-                                       u_long  flags;
+                               if (test_bit(FLG_LLI_L1WAKEUP, &bcs->st->lli.flag) &&
+                                   (PACKET_NOACK != bcs->tx_skb->pkt_type)) {
+                                       u_long flags;
                                        spin_lock_irqsave(&bcs->aclock, flags);
                                        bcs->ackcnt += bcs->hw.hdlc.count;
                                        spin_unlock_irqrestore(&bcs->aclock, flags);
@@ -453,7 +453,7 @@ HDLC_irq_main(struct IsdnCardState *cs)
        } else {
                stat = ReadHDLCPnP(cs, 0, HDLC_STATUS);
                if (stat & HDLC_INT_RPR)
-                       stat |= (ReadHDLCPnP(cs, 0, HDLC_STATUS+1))<<8;
+                       stat |= (ReadHDLCPnP(cs, 0, HDLC_STATUS + 1)) << 8;
        }
        if (stat & HDLC_INT_MASK) {
                if (!(bcs = Sel_BCS(cs, 0))) {
@@ -467,7 +467,7 @@ HDLC_irq_main(struct IsdnCardState *cs)
        } else {
                stat = ReadHDLCPnP(cs, 1, HDLC_STATUS);
                if (stat & HDLC_INT_RPR)
-                       stat |= (ReadHDLCPnP(cs, 1, HDLC_STATUS+1))<<8;
+                       stat |= (ReadHDLCPnP(cs, 1, HDLC_STATUS + 1)) << 8;
        }
        if (stat & HDLC_INT_MASK) {
                if (!(bcs = Sel_BCS(cs, 1))) {
@@ -486,55 +486,55 @@ hdlc_l2l1(struct PStack *st, int pr, void *arg)
        u_long flags;
 
        switch (pr) {
-               case (PH_DATA | REQUEST):
-                       spin_lock_irqsave(&bcs->cs->lock, flags);
-                       if (bcs->tx_skb) {
-                               skb_queue_tail(&bcs->squeue, skb);
-                       } else {
-                               bcs->tx_skb = skb;
-                               test_and_set_bit(BC_FLG_BUSY, &bcs->Flag);
-                               bcs->hw.hdlc.count = 0;
-                               bcs->cs->BC_Send_Data(bcs);
-                       }
-                       spin_unlock_irqrestore(&bcs->cs->lock, flags);
-                       break;
-               case (PH_PULL | INDICATION):
-                       spin_lock_irqsave(&bcs->cs->lock, flags);
-                       if (bcs->tx_skb) {
-                               printk(KERN_WARNING "hdlc_l2l1: this shouldn't happen\n");
-                       } else {
-                               test_and_set_bit(BC_FLG_BUSY, &bcs->Flag);
-                               bcs->tx_skb = skb;
-                               bcs->hw.hdlc.count = 0;
-                               bcs->cs->BC_Send_Data(bcs);
-                       }
-                       spin_unlock_irqrestore(&bcs->cs->lock, flags);
-                       break;
-               case (PH_PULL | REQUEST):
-                       if (!bcs->tx_skb) {
-                               test_and_clear_bit(FLG_L1_PULL_REQ, &st->l1.Flags);
-                               st->l1.l1l2(st, PH_PULL | CONFIRM, NULL);
-                       } else
-                               test_and_set_bit(FLG_L1_PULL_REQ, &st->l1.Flags);
-                       break;
-               case (PH_ACTIVATE | REQUEST):
-                       spin_lock_irqsave(&bcs->cs->lock, flags);
-                       test_and_set_bit(BC_FLG_ACTIV, &bcs->Flag);
-                       modehdlc(bcs, st->l1.mode, st->l1.bc);
-                       spin_unlock_irqrestore(&bcs->cs->lock, flags);
-                       l1_msg_b(st, pr, arg);
-                       break;
-               case (PH_DEACTIVATE | REQUEST):
-                       l1_msg_b(st, pr, arg);
-                       break;
-               case (PH_DEACTIVATE | CONFIRM):
-                       spin_lock_irqsave(&bcs->cs->lock, flags);
-                       test_and_clear_bit(BC_FLG_ACTIV, &bcs->Flag);
-                       test_and_clear_bit(BC_FLG_BUSY, &bcs->Flag);
-                       modehdlc(bcs, 0, st->l1.bc);
-                       spin_unlock_irqrestore(&bcs->cs->lock, flags);
-                       st->l1.l1l2(st, PH_DEACTIVATE | CONFIRM, NULL);
-                       break;
+       case (PH_DATA | REQUEST):
+               spin_lock_irqsave(&bcs->cs->lock, flags);
+               if (bcs->tx_skb) {
+                       skb_queue_tail(&bcs->squeue, skb);
+               } else {
+                       bcs->tx_skb = skb;
+                       test_and_set_bit(BC_FLG_BUSY, &bcs->Flag);
+                       bcs->hw.hdlc.count = 0;
+                       bcs->cs->BC_Send_Data(bcs);
+               }
+               spin_unlock_irqrestore(&bcs->cs->lock, flags);
+               break;
+       case (PH_PULL | INDICATION):
+               spin_lock_irqsave(&bcs->cs->lock, flags);
+               if (bcs->tx_skb) {
+                       printk(KERN_WARNING "hdlc_l2l1: this shouldn't happen\n");
+               } else {
+                       test_and_set_bit(BC_FLG_BUSY, &bcs->Flag);
+                       bcs->tx_skb = skb;
+                       bcs->hw.hdlc.count = 0;
+                       bcs->cs->BC_Send_Data(bcs);
+               }
+               spin_unlock_irqrestore(&bcs->cs->lock, flags);
+               break;
+       case (PH_PULL | REQUEST):
+               if (!bcs->tx_skb) {
+                       test_and_clear_bit(FLG_L1_PULL_REQ, &st->l1.Flags);
+                       st->l1.l1l2(st, PH_PULL | CONFIRM, NULL);
+               } else
+                       test_and_set_bit(FLG_L1_PULL_REQ, &st->l1.Flags);
+               break;
+       case (PH_ACTIVATE | REQUEST):
+               spin_lock_irqsave(&bcs->cs->lock, flags);
+               test_and_set_bit(BC_FLG_ACTIV, &bcs->Flag);
+               modehdlc(bcs, st->l1.mode, st->l1.bc);
+               spin_unlock_irqrestore(&bcs->cs->lock, flags);
+               l1_msg_b(st, pr, arg);
+               break;
+       case (PH_DEACTIVATE | REQUEST):
+               l1_msg_b(st, pr, arg);
+               break;
+       case (PH_DEACTIVATE | CONFIRM):
+               spin_lock_irqsave(&bcs->cs->lock, flags);
+               test_and_clear_bit(BC_FLG_ACTIV, &bcs->Flag);
+               test_and_clear_bit(BC_FLG_BUSY, &bcs->Flag);
+               modehdlc(bcs, 0, st->l1.bc);
+               spin_unlock_irqrestore(&bcs->cs->lock, flags);
+               st->l1.l1l2(st, PH_DEACTIVATE | CONFIRM, NULL);
+               break;
        }
 }
 
@@ -568,7 +568,7 @@ open_hdlcstate(struct IsdnCardState *cs, struct BCState *bcs)
                }
                if (!(bcs->blog = kmalloc(MAX_BLOG_SPACE, GFP_ATOMIC))) {
                        printk(KERN_WARNING
-                               "HiSax: No memory for bcs->blog\n");
+                              "HiSax: No memory for bcs->blog\n");
                        test_and_clear_bit(BC_FLG_INIT, &bcs->Flag);
                        kfree(bcs->hw.hdlc.rcvbuf);
                        bcs->hw.hdlc.rcvbuf = NULL;
@@ -688,34 +688,34 @@ AVM_card_msg(struct IsdnCardState *cs, int mt, void *arg)
        u_long flags;
 
        switch (mt) {
-               case CARD_RESET:
-                       spin_lock_irqsave(&cs->lock, flags);
-                       reset_avmpcipnp(cs);
-                       spin_unlock_irqrestore(&cs->lock, flags);
-                       return(0);
-               case CARD_RELEASE:
-                       outb(0, cs->hw.avm.cfg_reg + 2);
-                       release_region(cs->hw.avm.cfg_reg, 32);
-                       return(0);
-               case CARD_INIT:
-                       spin_lock_irqsave(&cs->lock, flags);
-                       reset_avmpcipnp(cs);
-                       clear_pending_isac_ints(cs);
-                       initisac(cs);
-                       inithdlc(cs);
-                       outb(AVM_STATUS0_DIS_TIMER | AVM_STATUS0_RES_TIMER,
-                               cs->hw.avm.cfg_reg + 2);
-                       WriteISAC(cs, ISAC_MASK, 0);
-                       outb(AVM_STATUS0_DIS_TIMER | AVM_STATUS0_RES_TIMER |
-                               AVM_STATUS0_ENA_IRQ, cs->hw.avm.cfg_reg + 2);
-                       /* RESET Receiver and Transmitter */
-                       WriteISAC(cs, ISAC_CMDR, 0x41);
-                       spin_unlock_irqrestore(&cs->lock, flags);
-                       return(0);
-               case CARD_TEST:
-                       return(0);
+       case CARD_RESET:
+               spin_lock_irqsave(&cs->lock, flags);
+               reset_avmpcipnp(cs);
+               spin_unlock_irqrestore(&cs->lock, flags);
+               return (0);
+       case CARD_RELEASE:
+               outb(0, cs->hw.avm.cfg_reg + 2);
+               release_region(cs->hw.avm.cfg_reg, 32);
+               return (0);
+       case CARD_INIT:
+               spin_lock_irqsave(&cs->lock, flags);
+               reset_avmpcipnp(cs);
+               clear_pending_isac_ints(cs);
+               initisac(cs);
+               inithdlc(cs);
+               outb(AVM_STATUS0_DIS_TIMER | AVM_STATUS0_RES_TIMER,
+                    cs->hw.avm.cfg_reg + 2);
+               WriteISAC(cs, ISAC_MASK, 0);
+               outb(AVM_STATUS0_DIS_TIMER | AVM_STATUS0_RES_TIMER |
+                    AVM_STATUS0_ENA_IRQ, cs->hw.avm.cfg_reg + 2);
+               /* RESET Receiver and Transmitter */
+               WriteISAC(cs, ISAC_CMDR, 0x41);
+               spin_unlock_irqrestore(&cs->lock, flags);
+               return (0);
+       case CARD_TEST:
+               return (0);
        }
-       return(0);
+       return (0);
 }
 
 static int __devinit avm_setup_rest(struct IsdnCardState *cs)
@@ -724,7 +724,7 @@ static int __devinit avm_setup_rest(struct IsdnCardState *cs)
 
        cs->hw.avm.isac = cs->hw.avm.cfg_reg + 0x10;
        if (!request_region(cs->hw.avm.cfg_reg, 32,
-               (cs->subtyp == AVM_FRITZ_PCI) ? "avm PCI" : "avm PnP")) {
+                           (cs->subtyp == AVM_FRITZ_PCI) ? "avm PCI" : "avm PnP")) {
                printk(KERN_WARNING
                       "HiSax: Fritz!PCI/PNP config port %x-%x already in use\n",
                       cs->hw.avm.cfg_reg,
@@ -732,28 +732,28 @@ static int __devinit avm_setup_rest(struct IsdnCardState *cs)
                return (0);
        }
        switch (cs->subtyp) {
-         case AVM_FRITZ_PCI:
+       case AVM_FRITZ_PCI:
                val = inl(cs->hw.avm.cfg_reg);
                printk(KERN_INFO "AVM PCI: stat %#x\n", val);
                printk(KERN_INFO "AVM PCI: Class %X Rev %d\n",
-                       val & 0xff, (val>>8) & 0xff);
+                      val & 0xff, (val >> 8) & 0xff);
                cs->BC_Read_Reg = &ReadHDLC_s;
                cs->BC_Write_Reg = &WriteHDLC_s;
                break;
-         case AVM_FRITZ_PNP:
+       case AVM_FRITZ_PNP:
                val = inb(cs->hw.avm.cfg_reg);
                ver = inb(cs->hw.avm.cfg_reg + 1);
                printk(KERN_INFO "AVM PnP: Class %X Rev %d\n", val, ver);
                cs->BC_Read_Reg = &ReadHDLCPnP;
                cs->BC_Write_Reg = &WriteHDLCPnP;
                break;
-         default:
-               printk(KERN_WARNING "AVM unknown subtype %d\n", cs->subtyp);
-               return(0);
+       default:
+               printk(KERN_WARNING "AVM unknown subtype %d\n", cs->subtyp);
+               return (0);
        }
        printk(KERN_INFO "HiSax: %s config irq:%d base:0x%X\n",
-               (cs->subtyp == AVM_FRITZ_PCI) ? "AVM Fritz!PCI" : "AVM Fritz!PnP",
-               cs->irq, cs->hw.avm.cfg_reg);
+              (cs->subtyp == AVM_FRITZ_PCI) ? "AVM Fritz!PCI" : "AVM Fritz!PnP",
+              cs->irq, cs->hw.avm.cfg_reg);
 
        setup_isac(cs);
        cs->readisac = &ReadISAC;
@@ -772,7 +772,7 @@ static int __devinit avm_setup_rest(struct IsdnCardState *cs)
 
 static int __devinit avm_pnp_setup(struct IsdnCardState *cs)
 {
-       return(1);      /* no-op: success */
+       return (1);     /* no-op: success */
 }
 
 #else
@@ -784,33 +784,33 @@ static int __devinit avm_pnp_setup(struct IsdnCardState *cs)
        struct pnp_dev *pnp_avm_d = NULL;
 
        if (!isapnp_present())
-               return(1);      /* no-op: success */
+               return (1);     /* no-op: success */
 
        if ((pnp_avm_c = pnp_find_card(
-               ISAPNP_VENDOR('A', 'V', 'M'),
-               ISAPNP_FUNCTION(0x0900), pnp_avm_c))) {
+                    ISAPNP_VENDOR('A', 'V', 'M'),
+                    ISAPNP_FUNCTION(0x0900), pnp_avm_c))) {
                if ((pnp_avm_d = pnp_find_dev(pnp_avm_c,
-                       ISAPNP_VENDOR('A', 'V', 'M'),
-                       ISAPNP_FUNCTION(0x0900), pnp_avm_d))) {
+                                             ISAPNP_VENDOR('A', 'V', 'M'),
+                                             ISAPNP_FUNCTION(0x0900), pnp_avm_d))) {
                        int err;
 
                        pnp_disable_dev(pnp_avm_d);
                        err = pnp_activate_dev(pnp_avm_d);
-                       if (err<0) {
+                       if (err < 0) {
                                printk(KERN_WARNING "%s: pnp_activate_dev ret(%d)\n",
-                                       __func__, err);
-                               return(0);
+                                      __func__, err);
+                               return (0);
                        }
                        cs->hw.avm.cfg_reg =
                                pnp_port_start(pnp_avm_d, 0);
                        cs->irq = pnp_irq(pnp_avm_d, 0);
                        if (!cs->irq) {
                                printk(KERN_ERR "FritzPnP:No IRQ\n");
-                               return(0);
+                               return (0);
                        }
                        if (!cs->hw.avm.cfg_reg) {
                                printk(KERN_ERR "FritzPnP:No IO address\n");
-                               return(0);
+                               return (0);
                        }
                        cs->subtyp = AVM_FRITZ_PNP;
 
@@ -827,7 +827,7 @@ static int __devinit avm_pnp_setup(struct IsdnCardState *cs)
 
 static int __devinit avm_pci_setup(struct IsdnCardState *cs)
 {
-       return(1);      /* no-op: success */
+       return (1);     /* no-op: success */
 }
 
 #else
@@ -837,27 +837,27 @@ static struct pci_dev *dev_avm __devinitdata = NULL;
 static int __devinit avm_pci_setup(struct IsdnCardState *cs)
 {
        if ((dev_avm = hisax_find_pci_device(PCI_VENDOR_ID_AVM,
-               PCI_DEVICE_ID_AVM_A1, dev_avm))) {
+                                            PCI_DEVICE_ID_AVM_A1, dev_avm))) {
 
                if (pci_enable_device(dev_avm))
-                       return(0);
+                       return (0);
 
                cs->irq = dev_avm->irq;
                if (!cs->irq) {
                        printk(KERN_ERR "FritzPCI: No IRQ for PCI card found\n");
-                       return(0);
+                       return (0);
                }
 
                cs->hw.avm.cfg_reg = pci_resource_start(dev_avm, 1);
                if (!cs->hw.avm.cfg_reg) {
                        printk(KERN_ERR "FritzPCI: No IO-Adr for PCI card found\n");
-                       return(0);
+                       return (0);
                }
 
                cs->subtyp = AVM_FRITZ_PCI;
        } else {
                printk(KERN_WARNING "FritzPCI: No PCI card found\n");
-               return(0);
+               return (0);
        }
 
        cs->irq_flags |= IRQF_SHARED;
index 8f0ad2a..33e3c94 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Author       Carsten Paeth
  * Copyright    1998-2001 by Carsten Paeth <calle@calle.in-berlin.de>
- * 
+ *
  * This software may be used and distributed according to the terms
  * of the GNU General Public License, incorporated herein by reference.
  *
@@ -39,20 +39,20 @@ module_param(isdnprot, int, 0);
 
 /*====================================================================*/
 
-static int avma1cs_config(struct pcmcia_device *link) __devinit ;
+static int avma1cs_config(struct pcmcia_device *link) __devinit;
 static void avma1cs_release(struct pcmcia_device *link);
-static void avma1cs_detach(struct pcmcia_device *p_dev) __devexit ;
+static void avma1cs_detach(struct pcmcia_device *p_dev) __devexit;
 
 static int __devinit avma1cs_probe(struct pcmcia_device *p_dev)
 {
-    dev_dbg(&p_dev->dev, "avma1cs_attach()\n");
+       dev_dbg(&p_dev->dev, "avma1cs_attach()\n");
 
-    /* General socket configuration */
-    p_dev->config_flags |= CONF_ENABLE_IRQ | CONF_AUTO_SET_IO;
-    p_dev->config_index = 1;
-    p_dev->config_regs = PRESENT_OPTION;
+       /* General socket configuration */
+       p_dev->config_flags |= CONF_ENABLE_IRQ | CONF_AUTO_SET_IO;
+       p_dev->config_index = 1;
+       p_dev->config_regs = PRESENT_OPTION;
 
-    return avma1cs_config(p_dev);
+       return avma1cs_config(p_dev);
 } /* avma1cs_attach */
 
 static void __devexit avma1cs_detach(struct pcmcia_device *link)
@@ -75,63 +75,63 @@ static int avma1cs_configcheck(struct pcmcia_device *p_dev, void *priv_data)
 
 static int __devinit avma1cs_config(struct pcmcia_device *link)
 {
-    int i = -1;
-    char devname[128];
-    IsdnCard_t icard;
-    int busy = 0;
-
-    dev_dbg(&link->dev, "avma1cs_config(0x%p)\n", link);
-
-    devname[0] = 0;
-    if (link->prod_id[1])
-           strlcpy(devname, link->prod_id[1], sizeof(devname));
-
-    if (pcmcia_loop_config(link, avma1cs_configcheck, NULL))
-           return -ENODEV;
-
-    do {
-       /*
-        * allocate an interrupt line
-        */
-       if (!link->irq) {
-           /* undo */
-           pcmcia_disable_device(link);
-           break;
-       }
-
-       /*
-        * configure the PCMCIA socket
-        */
-       i = pcmcia_enable_device(link);
+       int i = -1;
+       char devname[128];
+       IsdnCard_t      icard;
+       int busy = 0;
+
+       dev_dbg(&link->dev, "avma1cs_config(0x%p)\n", link);
+
+       devname[0] = 0;
+       if (link->prod_id[1])
+               strlcpy(devname, link->prod_id[1], sizeof(devname));
+
+       if (pcmcia_loop_config(link, avma1cs_configcheck, NULL))
+               return -ENODEV;
+
+       do {
+               /*
+                * allocate an interrupt line
+                */
+               if (!link->irq) {
+                       /* undo */
+                       pcmcia_disable_device(link);
+                       break;
+               }
+
+               /*
+                * configure the PCMCIA socket
+                */
+               i = pcmcia_enable_device(link);
+               if (i != 0) {
+                       pcmcia_disable_device(link);
+                       break;
+               }
+
+       } while (0);
+
+       /* If any step failed, release any partially configured state */
        if (i != 0) {
-           pcmcia_disable_device(link);
-           break;
+               avma1cs_release(link);
+               return -ENODEV;
        }
 
-    } while (0);
-
-    /* If any step failed, release any partially configured state */
-    if (i != 0) {
-       avma1cs_release(link);
-       return -ENODEV;
-    }
-
-    icard.para[0] = link->irq;
-    icard.para[1] = link->resource[0]->start;
-    icard.protocol = isdnprot;
-    icard.typ = ISDN_CTYPE_A1_PCMCIA;
-    
-    i = hisax_init_pcmcia(link, &busy, &icard);
-    if (i < 0) {
-       printk(KERN_ERR "avma1_cs: failed to initialize AVM A1 "
-                       "PCMCIA %d at i/o %#x\n", i,
-                       (unsigned int) link->resource[0]->start);
-       avma1cs_release(link);
-       return -ENODEV;
-    }
-    link->priv = (void *) (unsigned long) i;
+       icard.para[0] = link->irq;
+       icard.para[1] = link->resource[0]->start;
+       icard.protocol = isdnprot;
+       icard.typ = ISDN_CTYPE_A1_PCMCIA;
+
+       i = hisax_init_pcmcia(link, &busy, &icard);
+       if (i < 0) {
+               printk(KERN_ERR "avma1_cs: failed to initialize AVM A1 "
+                      "PCMCIA %d at i/o %#x\n", i,
+                      (unsigned int) link->resource[0]->start);
+               avma1cs_release(link);
+               return -ENODEV;
+       }
+       link->priv = (void *) (unsigned long) i;
 
-    return 0;
+       return 0;
 } /* avma1cs_config */
 
 static void avma1cs_release(struct pcmcia_device *link)
index 9f2009c..f6bf9c6 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Author       Roland Klabunde
  * Copyright    by Roland Klabunde   <R.Klabunde@Berkom.de>
- * 
+ *
  * This software may be used and distributed according to the terms
  * of the GNU General Public License, incorporated herein by reference.
  *
@@ -39,7 +39,7 @@ readreg(unsigned int ale, unsigned long adr, u_char off)
 
 
 static inline void
-readfifo(unsigned int ale, unsigned long adr, u_char off, u_char * data, int size)
+readfifo(unsigned int ale, unsigned long adr, u_char off, u_char *data, int size)
 {
        int i;
        for (i = 0; i < size; i++)
@@ -59,7 +59,7 @@ writereg(unsigned int ale, unsigned long adr, u_char off, u_char data)
 
 
 static inline void
-writefifo(unsigned int ale, unsigned long adr, u_char off, u_char * data, int size)
+writefifo(unsigned int ale, unsigned long adr, u_char off, u_char *data, int size)
 {
        int i;
 
@@ -83,13 +83,13 @@ WriteISAC(struct IsdnCardState *cs, u_char offset, u_char value)
 }
 
 static void
-ReadISACfifo(struct IsdnCardState *cs, u_char * data, int size)
+ReadISACfifo(struct IsdnCardState *cs, u_char *data, int size)
 {
        readfifo(cs->hw.ax.isac_ale, cs->hw.ax.isac_adr, 0, data, size);
 }
 
 static void
-WriteISACfifo(struct IsdnCardState *cs, u_char * data, int size)
+WriteISACfifo(struct IsdnCardState *cs, u_char *data, int size)
 {
        writefifo(cs->hw.ax.isac_ale, cs->hw.ax.isac_adr, 0, data, size);
 }
@@ -110,15 +110,15 @@ WriteJADE(struct IsdnCardState *cs, int jade, u_char offset, u_char value)
  * fast interrupt JADE stuff goes here
  */
 
-#define READJADE(cs, nr, reg) readreg(cs->hw.ax.jade_ale,\
-               cs->hw.ax.jade_adr, reg + (nr == -1 ? 0 : (nr ? 0xC0 : 0x80)))
-#define WRITEJADE(cs, nr, reg, data) writereg(cs->hw.ax.jade_ale,\
-               cs->hw.ax.jade_adr, reg + (nr == -1 ? 0 : (nr ? 0xC0 : 0x80)), data)
+#define READJADE(cs, nr, reg) readreg(cs->hw.ax.jade_ale,              \
+                                     cs->hw.ax.jade_adr, reg + (nr == -1 ? 0 : (nr ? 0xC0 : 0x80)))
+#define WRITEJADE(cs, nr, reg, data) writereg(cs->hw.ax.jade_ale,      \
+                                             cs->hw.ax.jade_adr, reg + (nr == -1 ? 0 : (nr ? 0xC0 : 0x80)), data)
 
-#define READJADEFIFO(cs, nr, ptr, cnt) readfifo(cs->hw.ax.jade_ale,\
-               cs->hw.ax.jade_adr, (nr == -1 ? 0 : (nr ? 0xC0 : 0x80)), ptr, cnt)
-#define WRITEJADEFIFO(cs, nr, ptr, cnt) writefifo( cs->hw.ax.jade_ale,\
-               cs->hw.ax.jade_adr, (nr == -1 ? 0 : (nr ? 0xC0 : 0x80)), ptr, cnt)
+#define READJADEFIFO(cs, nr, ptr, cnt) readfifo(cs->hw.ax.jade_ale,    \
+                                               cs->hw.ax.jade_adr, (nr == -1 ? 0 : (nr ? 0xC0 : 0x80)), ptr, cnt)
+#define WRITEJADEFIFO(cs, nr, ptr, cnt) writefifo(cs->hw.ax.jade_ale,  \
+                                                 cs->hw.ax.jade_adr, (nr == -1 ? 0 : (nr ? 0xC0 : 0x80)), ptr, cnt)
 
 #include "jade_irq.c"
 
@@ -201,11 +201,11 @@ reset_bkm(struct IsdnCardState *cs)
                pI20_Regs->i20SysControl = sysRESET | sysCFG;
                /* Issue ISDN reset     */
                pI20_Regs->i20GuestControl = guestWAIT_CFG |
-                   g_A4T_JADE_RES |
-                   g_A4T_ISAR_RES |
-                   g_A4T_ISAC_RES |
-                   g_A4T_JADE_BOOTR |
-                   g_A4T_ISAR_BOOTR;
+                       g_A4T_JADE_RES |
+                       g_A4T_ISAR_RES |
+                       g_A4T_ISAC_RES |
+                       g_A4T_JADE_BOOTR |
+                       g_A4T_ISAR_BOOTR;
                mdelay(10);
 
                /* Remove RESET state from ISDN */
@@ -222,33 +222,33 @@ BKM_card_msg(struct IsdnCardState *cs, int mt, void *arg)
        u_long flags;
 
        switch (mt) {
-               case CARD_RESET:
-                       /* Disable ints */
-                       spin_lock_irqsave(&cs->lock, flags);
-                       enable_bkm_int(cs, 0);
-                       reset_bkm(cs);
-                       spin_unlock_irqrestore(&cs->lock, flags);
-                       return (0);
-               case CARD_RELEASE:
-                       /* Sanity */
-                       spin_lock_irqsave(&cs->lock, flags);
-                       enable_bkm_int(cs, 0);
-                       reset_bkm(cs);
-                       spin_unlock_irqrestore(&cs->lock, flags);
-                       release_io_bkm(cs);
-                       return (0);
-               case CARD_INIT:
-                       spin_lock_irqsave(&cs->lock, flags);
-                       clear_pending_isac_ints(cs);
-                       clear_pending_jade_ints(cs);
-                       initisac(cs);
-                       initjade(cs);
-                       /* Enable ints */
-                       enable_bkm_int(cs, 1);
-                       spin_unlock_irqrestore(&cs->lock, flags);
-                       return (0);
-               case CARD_TEST:
-                       return (0);
+       case CARD_RESET:
+               /* Disable ints */
+               spin_lock_irqsave(&cs->lock, flags);
+               enable_bkm_int(cs, 0);
+               reset_bkm(cs);
+               spin_unlock_irqrestore(&cs->lock, flags);
+               return (0);
+       case CARD_RELEASE:
+               /* Sanity */
+               spin_lock_irqsave(&cs->lock, flags);
+               enable_bkm_int(cs, 0);
+               reset_bkm(cs);
+               spin_unlock_irqrestore(&cs->lock, flags);
+               release_io_bkm(cs);
+               return (0);
+       case CARD_INIT:
+               spin_lock_irqsave(&cs->lock, flags);
+               clear_pending_isac_ints(cs);
+               clear_pending_jade_ints(cs);
+               initisac(cs);
+               initjade(cs);
+               /* Enable ints */
+               enable_bkm_int(cs, 1);
+               spin_unlock_irqrestore(&cs->lock, flags);
+               return (0);
+       case CARD_TEST:
+               return (0);
        }
        return (0);
 }
@@ -341,7 +341,7 @@ setup_bkm_a4t(struct IsdnCard *card)
                return (0);
 
        while ((dev_a4t = hisax_find_pci_device(PCI_VENDOR_ID_ZORAN,
-               PCI_DEVICE_ID_ZORAN_36120, dev_a4t))) {
+                                               PCI_DEVICE_ID_ZORAN_36120, dev_a4t))) {
                ret = a4t_pci_probe(dev_a4t, cs, &found, &pci_memaddr);
                if (!ret)
                        return (0);
index e775706..c9c98f0 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Author       Roland Klabunde
  * Copyright    by Roland Klabunde   <R.Klabunde@Berkom.de>
- * 
+ *
  * This software may be used and distributed according to the terms
  * of the GNU General Public License, incorporated herein by reference.
  *
@@ -34,7 +34,7 @@ static const char *sct_quadro_subtypes[] =
 };
 
 
-#define wordout(addr,val) outw(val,addr)
+#define wordout(addr, val) outw(val, addr)
 #define wordin(addr) inw(addr)
 
 static inline u_char
@@ -47,7 +47,7 @@ readreg(unsigned int ale, unsigned int adr, u_char off)
 }
 
 static inline void
-readfifo(unsigned int ale, unsigned int adr, u_char off, u_char * data, int size)
+readfifo(unsigned int ale, unsigned int adr, u_char off, u_char *data, int size)
 {
        int i;
        wordout(ale, off);
@@ -64,7 +64,7 @@ writereg(unsigned int ale, unsigned int adr, u_char off, u_char data)
 }
 
 static inline void
-writefifo(unsigned int ale, unsigned int adr, u_char off, u_char * data, int size)
+writefifo(unsigned int ale, unsigned int adr, u_char off, u_char *data, int size)
 {
        int i;
        wordout(ale, off);
@@ -87,13 +87,13 @@ WriteISAC(struct IsdnCardState *cs, u_char offset, u_char value)
 }
 
 static void
-ReadISACfifo(struct IsdnCardState *cs, u_char * data, int size)
+ReadISACfifo(struct IsdnCardState *cs, u_char *data, int size)
 {
        readfifo(cs->hw.ax.base, cs->hw.ax.data_adr, 0x80, data, size);
 }
 
 static void
-WriteISACfifo(struct IsdnCardState *cs, u_char * data, int size)
+WriteISACfifo(struct IsdnCardState *cs, u_char *data, int size)
 {
        writefifo(cs->hw.ax.base, cs->hw.ax.data_adr, 0x80, data, size);
 }
@@ -117,21 +117,21 @@ set_ipac_active(struct IsdnCardState *cs, u_int active)
 {
        /* set irq mask */
        writereg(cs->hw.ax.base, cs->hw.ax.data_adr, IPAC_MASK,
-               active ? 0xc0 : 0xff);
+                active ? 0xc0 : 0xff);
 }
 
 /*
  * fast interrupt HSCX stuff goes here
  */
 
-#define READHSCX(cs, nr, reg) readreg(cs->hw.ax.base, \
-       cs->hw.ax.data_adr, reg + (nr ? 0x40 : 0))
-#define WRITEHSCX(cs, nr, reg, data) writereg(cs->hw.ax.base, \
-       cs->hw.ax.data_adr, reg + (nr ? 0x40 : 0), data)
-#define READHSCXFIFO(cs, nr, ptr, cnt) readfifo(cs->hw.ax.base, \
-       cs->hw.ax.data_adr, (nr ? 0x40 : 0), ptr, cnt)
-#define WRITEHSCXFIFO(cs, nr, ptr, cnt) writefifo(cs->hw.ax.base, \
-       cs->hw.ax.data_adr, (nr ? 0x40 : 0), ptr, cnt)
+#define READHSCX(cs, nr, reg) readreg(cs->hw.ax.base,                  \
+                                     cs->hw.ax.data_adr, reg + (nr ? 0x40 : 0))
+#define WRITEHSCX(cs, nr, reg, data) writereg(cs->hw.ax.base,          \
+                                             cs->hw.ax.data_adr, reg + (nr ? 0x40 : 0), data)
+#define READHSCXFIFO(cs, nr, ptr, cnt) readfifo(cs->hw.ax.base,                \
+                                               cs->hw.ax.data_adr, (nr ? 0x40 : 0), ptr, cnt)
+#define WRITEHSCXFIFO(cs, nr, ptr, cnt) writefifo(cs->hw.ax.base,      \
+                                                 cs->hw.ax.data_adr, (nr ? 0x40 : 0), ptr, cnt)
 
 #include "hscx_irq.c"
 
@@ -148,7 +148,7 @@ bkm_interrupt_ipac(int intno, void *dev_id)
                spin_unlock_irqrestore(&cs->lock, flags);
                return IRQ_NONE;
        }
-      Start_IPAC:
+Start_IPAC:
        if (cs->debug & L1_DEB_IPAC)
                debugl1(cs, "IPAC ISTA %02X", ista);
        if (ista & 0x0f) {
@@ -224,33 +224,33 @@ BKM_card_msg(struct IsdnCardState *cs, int mt, void *arg)
        u_long flags;
 
        switch (mt) {
-               case CARD_RESET:
-                       spin_lock_irqsave(&cs->lock, flags);
-                       /* Disable ints */
-                       set_ipac_active(cs, 0);
-                       enable_bkm_int(cs, 0);
-                       reset_bkm(cs);
-                       spin_unlock_irqrestore(&cs->lock, flags);
-                       return (0);
-               case CARD_RELEASE:
-                       /* Sanity */
-                       spin_lock_irqsave(&cs->lock, flags);
-                       set_ipac_active(cs, 0);
-                       enable_bkm_int(cs, 0);
-                       spin_unlock_irqrestore(&cs->lock, flags);
-                       release_io_sct_quadro(cs);
-                       return (0);
-               case CARD_INIT:
-                       spin_lock_irqsave(&cs->lock, flags);
-                       cs->debug |= L1_DEB_IPAC;
-                       set_ipac_active(cs, 1);
-                       inithscxisac(cs, 3);
-                       /* Enable ints */
-                       enable_bkm_int(cs, 1);
-                       spin_unlock_irqrestore(&cs->lock, flags);
-                       return (0);
-               case CARD_TEST:
-                       return (0);
+       case CARD_RESET:
+               spin_lock_irqsave(&cs->lock, flags);
+               /* Disable ints */
+               set_ipac_active(cs, 0);
+               enable_bkm_int(cs, 0);
+               reset_bkm(cs);
+               spin_unlock_irqrestore(&cs->lock, flags);
+               return (0);
+       case CARD_RELEASE:
+               /* Sanity */
+               spin_lock_irqsave(&cs->lock, flags);
+               set_ipac_active(cs, 0);
+               enable_bkm_int(cs, 0);
+               spin_unlock_irqrestore(&cs->lock, flags);
+               release_io_sct_quadro(cs);
+               return (0);
+       case CARD_INIT:
+               spin_lock_irqsave(&cs->lock, flags);
+               cs->debug |= L1_DEB_IPAC;
+               set_ipac_active(cs, 1);
+               inithscxisac(cs, 3);
+               /* Enable ints */
+               enable_bkm_int(cs, 1);
+               spin_unlock_irqrestore(&cs->lock, flags);
+               return (0);
+       case CARD_TEST:
+               return (0);
        }
        return (0);
 }
@@ -260,11 +260,11 @@ sct_alloc_io(u_int adr, u_int len)
 {
        if (!request_region(adr, len, "scitel")) {
                printk(KERN_WARNING
-                       "HiSax: Scitel port %#x-%#x already in use\n",
-                       adr, adr + len);
+                      "HiSax: Scitel port %#x-%#x already in use\n",
+                      adr, adr + len);
                return (1);
        }
-       return(0);
+       return (0);
 }
 
 static struct pci_dev *dev_a8 __devinitdata = NULL;
@@ -298,18 +298,18 @@ setup_sct_quadro(struct IsdnCard *card)
                return (0);
        }
        if ((cs->subtyp != SCT_1) && ((sub_sys_id != PCI_DEVICE_ID_BERKOM_SCITEL_QUADRO) ||
-               (sub_vendor_id != PCI_VENDOR_ID_BERKOM)))
+                                     (sub_vendor_id != PCI_VENDOR_ID_BERKOM)))
                return (0);
        if (cs->subtyp == SCT_1) {
                while ((dev_a8 = hisax_find_pci_device(PCI_VENDOR_ID_PLX,
-                       PCI_DEVICE_ID_PLX_9050, dev_a8))) {
-                       
+                                                      PCI_DEVICE_ID_PLX_9050, dev_a8))) {
+
                        sub_vendor_id = dev_a8->subsystem_vendor;
                        sub_sys_id = dev_a8->subsystem_device;
                        if ((sub_sys_id == PCI_DEVICE_ID_BERKOM_SCITEL_QUADRO) &&
-                               (sub_vendor_id == PCI_VENDOR_ID_BERKOM)) {
+                           (sub_vendor_id == PCI_VENDOR_ID_BERKOM)) {
                                if (pci_enable_device(dev_a8))
-                                       return(0);
+                                       return (0);
                                pci_ioaddr1 = pci_resource_start(dev_a8, 1);
                                pci_irq = dev_a8->irq;
                                pci_bus = dev_a8->bus->number;
@@ -320,23 +320,23 @@ setup_sct_quadro(struct IsdnCard *card)
                }
                if (!found) {
                        printk(KERN_WARNING "HiSax: Scitel Quadro (%s): "
-                               "Card not found\n",
-                               sct_quadro_subtypes[cs->subtyp]);
+                              "Card not found\n",
+                              sct_quadro_subtypes[cs->subtyp]);
                        return (0);
                }
 #ifdef ATTEMPT_PCI_REMAPPING
 /* HACK: PLX revision 1 bug: PLX address bit 7 must not be set */
                if ((pci_ioaddr1 & 0x80) && (dev_a8->revision == 1)) {
                        printk(KERN_WARNING "HiSax: Scitel Quadro (%s): "
-                               "PLX rev 1, remapping required!\n",
-                               sct_quadro_subtypes[cs->subtyp]);
+                              "PLX rev 1, remapping required!\n",
+                              sct_quadro_subtypes[cs->subtyp]);
                        /* Restart PCI negotiation */
-                       pci_write_config_dword(dev_a8, PCI_BASE_ADDRESS_1, (u_int) - 1);
+                       pci_write_config_dword(dev_a8, PCI_BASE_ADDRESS_1, (u_int)-1);
                        /* Move up by 0x80 byte */
                        pci_ioaddr1 += 0x80;
                        pci_ioaddr1 &= PCI_BASE_ADDRESS_IO_MASK;
                        pci_write_config_dword(dev_a8, PCI_BASE_ADDRESS_1, pci_ioaddr1);
-                       dev_a8->resource[ 1].start = pci_ioaddr1;
+                       dev_a8->resource[1].start = pci_ioaddr1;
                }
 #endif /* End HACK */
        }
@@ -371,39 +371,39 @@ setup_sct_quadro(struct IsdnCard *card)
        /* pci_ioaddr5 is for the first subdevice only */
        cs->hw.ax.plx_adr = pci_ioaddr1;
        /* Enter all ipac_base addresses */
-       switch(cs->subtyp) {
-               case 1:
-                       cs->hw.ax.base = pci_ioaddr5 + 0x00;
-                       if (sct_alloc_io(pci_ioaddr1, 128))
-                               return(0);
-                       if (sct_alloc_io(pci_ioaddr5, 64))
-                               return(0);
-                       /* disable all IPAC */
-                       writereg(pci_ioaddr5, pci_ioaddr5 + 4,
-                               IPAC_MASK, 0xFF);
-                       writereg(pci_ioaddr4 + 0x08, pci_ioaddr4 + 0x0c,
-                               IPAC_MASK, 0xFF);
-                       writereg(pci_ioaddr3 + 0x10, pci_ioaddr3 + 0x14,
-                               IPAC_MASK, 0xFF);
-                       writereg(pci_ioaddr2 + 0x20, pci_ioaddr2 + 0x24,
-                               IPAC_MASK, 0xFF);
-                       break;
-               case 2:
-                       cs->hw.ax.base = pci_ioaddr4 + 0x08;
-                       if (sct_alloc_io(pci_ioaddr4, 64))
-                               return(0);
-                       break;
-               case 3:
-                       cs->hw.ax.base = pci_ioaddr3 + 0x10;
-                       if (sct_alloc_io(pci_ioaddr3, 64))
-                               return(0);
-                       break;
-               case 4:
-                       cs->hw.ax.base = pci_ioaddr2 + 0x20;
-                       if (sct_alloc_io(pci_ioaddr2, 64))
-                               return(0);
-                       break;
-       }       
+       switch (cs->subtyp) {
+       case 1:
+               cs->hw.ax.base = pci_ioaddr5 + 0x00;
+               if (sct_alloc_io(pci_ioaddr1, 128))
+                       return (0);
+               if (sct_alloc_io(pci_ioaddr5, 64))
+                       return (0);
+               /* disable all IPAC */
+               writereg(pci_ioaddr5, pci_ioaddr5 + 4,
+                        IPAC_MASK, 0xFF);
+               writereg(pci_ioaddr4 + 0x08, pci_ioaddr4 + 0x0c,
+                        IPAC_MASK, 0xFF);
+               writereg(pci_ioaddr3 + 0x10, pci_ioaddr3 + 0x14,
+                        IPAC_MASK, 0xFF);
+               writereg(pci_ioaddr2 + 0x20, pci_ioaddr2 + 0x24,
+                        IPAC_MASK, 0xFF);
+               break;
+       case 2:
+               cs->hw.ax.base = pci_ioaddr4 + 0x08;
+               if (sct_alloc_io(pci_ioaddr4, 64))
+                       return (0);
+               break;
+       case 3:
+               cs->hw.ax.base = pci_ioaddr3 + 0x10;
+               if (sct_alloc_io(pci_ioaddr3, 64))
+                       return (0);
+               break;
+       case 4:
+               cs->hw.ax.base = pci_ioaddr2 + 0x20;
+               if (sct_alloc_io(pci_ioaddr2, 64))
+                       return (0);
+               break;
+       }
        /* For isac and hscx data path */
        cs->hw.ax.data_adr = cs->hw.ax.base + 4;
 
@@ -429,7 +429,7 @@ setup_sct_quadro(struct IsdnCard *card)
        cs->irq_func = &bkm_interrupt_ipac;
 
        printk(KERN_INFO "HiSax: Scitel Quadro (%s): IPAC Version %d\n",
-               sct_quadro_subtypes[cs->subtyp],
-               readreg(cs->hw.ax.base, cs->hw.ax.data_adr, IPAC_ID));
+              sct_quadro_subtypes[cs->subtyp],
+              readreg(cs->hw.ax.base, cs->hw.ax.data_adr, IPAC_ID));
        return (1);
 }
index 029e0a2..27ff8a8 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Author       Roland Klabunde
  * Copyright    by Roland Klabunde   <R.Klabunde@Berkom.de>
- * 
+ *
  * This software may be used and distributed according to the terms
  * of the GNU General Public License, incorporated herein by reference.
  *
 
 /* Application specific registers I20 (Siemens SZB6120H) */
 typedef        struct {
-               /* Video front end horizontal configuration register */
+       /* Video front end horizontal configuration register */
        volatile u_int  i20VFEHorzCfg;  /* Offset 00 */
-               /* Video front end vertical configuration register */
-       volatile u_int  i20VFEVertCfg;  /* Offset 04 */ 
-               /* Video front end scaler and pixel format register */
-       volatile u_int  i20VFEScaler;   /* Offset 08 */ 
-               /* Video display top register */
-       volatile u_int  i20VDispTop;    /* Offset 0C */ 
-               /* Video display bottom register */
-       volatile u_int  i20VDispBottom; /* Offset 10 */ 
-               /* Video stride, status and frame grab register */
-       volatile u_int  i20VidFrameGrab;/* Offset 14 */ 
-               /* Video display configuration register */
-       volatile u_int  i20VDispCfg;    /* Offset 18 */ 
-               /* Video masking map top */
-       volatile u_int  i20VMaskTop;    /* Offset 1C */ 
-               /* Video masking map bottom */
-       volatile u_int  i20VMaskBottom; /* Offset 20 */ 
-               /* Overlay control register */
-       volatile u_int  i20OvlyControl; /* Offset 24 */ 
-               /* System, PCI and general purpose pins control register */
-       volatile u_int  i20SysControl;  /* Offset 28 */ 
+       /* Video front end vertical configuration register */
+       volatile u_int  i20VFEVertCfg;  /* Offset 04 */
+       /* Video front end scaler and pixel format register */
+       volatile u_int  i20VFEScaler;   /* Offset 08 */
+       /* Video display top register */
+       volatile u_int  i20VDispTop;    /* Offset 0C */
+       /* Video display bottom register */
+       volatile u_int  i20VDispBottom; /* Offset 10 */
+       /* Video stride, status and frame grab register */
+       volatile u_int  i20VidFrameGrab;/* Offset 14 */
+       /* Video display configuration register */
+       volatile u_int  i20VDispCfg;    /* Offset 18 */
+       /* Video masking map top */
+       volatile u_int  i20VMaskTop;    /* Offset 1C */
+       /* Video masking map bottom */
+       volatile u_int  i20VMaskBottom; /* Offset 20 */
+       /* Overlay control register */
+       volatile u_int  i20OvlyControl; /* Offset 24 */
+       /* System, PCI and general purpose pins control register */
+       volatile u_int  i20SysControl;  /* Offset 28 */
 #define        sysRESET                0x01000000      /* bit 24:Softreset (Low)               */
-                       /* GPIO 4...0: Output fixed for our cfg! */
+       /* GPIO 4...0: Output fixed for our cfg! */
 #define        sysCFG                  0x000000E0      /* GPIO 7,6,5: Input */
        /* General purpose pins and guest bus control register */
-       volatile u_int  i20GuestControl;/* Offset 2C */ 
+       volatile u_int  i20GuestControl;/* Offset 2C */
 #define        guestWAIT_CFG   0x00005555      /* 4 PCI waits for all */
 #define        guestISDN_INT_E 0x01000000      /* ISDN Int en (low) */
-#define        guestVID_INT_E  0x02000000      /* Video interrupt en (low) */
+#define        guestVID_INT_E  0x02000000      /* Video interrupt en (low) */
 #define        guestADI1_INT_R 0x04000000      /* ADI #1 int req (low) */
 #define        guestADI2_INT_R 0x08000000      /* ADI #2 int req (low) */
 #define        guestISDN_RES   0x10000000      /* ISDN reset bit (high) */
@@ -78,18 +78,18 @@ typedef     struct {
 #define        g_A4T_ISAR_INT_S 0x40000000     /* ISAR interrupt pnd (Low) */
 #define        g_A4T_ISAC_INT_S 0x80000000     /* ISAC interrupt pnd (Low) */
 
-       volatile u_int  i20CodeSource;  /* Offset 30 */ 
-       volatile u_int  i20CodeXferCtrl;/* Offset 34 */ 
-       volatile u_int  i20CodeMemPtr;  /* Offset 38 */ 
+       volatile u_int  i20CodeSource;  /* Offset 30 */
+       volatile u_int  i20CodeXferCtrl;/* Offset 34 */
+       volatile u_int  i20CodeMemPtr;  /* Offset 38 */
 
-       volatile u_int  i20IntStatus;   /* Offset 3C */ 
-       volatile u_int  i20IntCtrl;     /* Offset 40 */ 
+       volatile u_int  i20IntStatus;   /* Offset 3C */
+       volatile u_int  i20IntCtrl;     /* Offset 40 */
 #define        intISDN         0x40000000      /* GIRQ1En (ISAC/ADI) (High) */
 #define        intVID          0x20000000      /* GIRQ0En (VSYNC)    (High) */
 #define        intCOD          0x10000000      /* CodRepIrqEn        (High) */
-#define        intPCI          0x01000000      /* PCI IntA enable    (High) */
+#define        intPCI          0x01000000      /* PCI IntA enable    (High) */
 
-       volatile u_int  i20I2CCtrl;     /* Offset 44                                    */      
+       volatile u_int  i20I2CCtrl;     /* Offset 44                                    */
 } I20_REGISTER_FILE, *PI20_REGISTER_FILE;
 
 /*
@@ -98,7 +98,7 @@ typedef       struct {
  */
 #define        PO_OFFSET       0x00000200      /* Postoffice offset from base */
 
-#define        GCS_0           0x00000000      /* Guest bus chip selects */
+#define        GCS_0           0x00000000      /* Guest bus chip selects */
 #define        GCS_1           0x00100000
 #define        GCS_2           0x00200000
 #define        GCS_3           0x00300000
@@ -108,12 +108,12 @@ typedef   struct {
 
 #define        PO_PEND         0x02000000
 
-#define POSTOFFICE(postoffice) *(volatile unsigned int*)(postoffice)
+#define POSTOFFICE(postoffice) *(volatile unsigned int *)(postoffice)
 
-/* Wait unlimited (don't worry)                                                                                */ 
-#define        __WAITI20__(postoffice)                                                                         \
-do {                                                                                                                           \
-       while ((POSTOFFICE(postoffice) & PO_PEND)) ;                                    \
-} while (0)
+/* Wait unlimited (don't worry)                                                                                */
+#define        __WAITI20__(postoffice)                                 \
+       do {                                                    \
+               while ((POSTOFFICE(postoffice) & PO_PEND)) ;    \
+       } while (0)
 
 #endif /* __BKM_AX_H__ */
index c4897e1..a47637b 100644 (file)
@@ -2,7 +2,7 @@
  *
  * Author       Karsten Keil
  * Copyright    by Karsten Keil      <keil@isdn4linux.de>
- * 
+ *
  * This software may be used and distributed according to the terms
  * of the GNU General Public License, incorporated herein by reference.
  *
@@ -66,7 +66,7 @@ hisax_findcard(int driverid)
 }
 
 static __printf(3, 4) void
-link_debug(struct Channel *chanp, int direction, char *fmt, ...)
+       link_debug(struct Channel *chanp, int direction, char *fmt, ...)
 {
        va_list args;
        char tmp[16];
@@ -91,9 +91,9 @@ enum {
        ST_WAIT_DCOMMAND,       /*  9 call clear. (receiver), awaiting DCHANNEL message */
        ST_WAIT_DRELEASE,       /* 10 DISCONNECT sent, awaiting RELEASE */
        ST_WAIT_D_REL_CNF,      /* 11 RELEASE sent, awaiting RELEASE confirm */
-       ST_IN_PROCEED_SEND,     /* 12 incoming call, proceeding send */ 
+       ST_IN_PROCEED_SEND,     /* 12 incoming call, proceeding send */
 };
-  
+
 
 #define STATE_COUNT (ST_IN_PROCEED_SEND + 1)
 
@@ -119,7 +119,7 @@ enum {
        EV_SETUP_CNF,           /*  1 */
        EV_ACCEPTB,             /*  2 */
        EV_DISCONNECT_IND,      /*  3 */
-       EV_RELEASE,             /*  4 */
+       EV_RELEASE,             /*  4 */
        EV_LEASED,              /*  5 */
        EV_LEASED_REL,          /*  6 */
        EV_SETUP_IND,           /*  7 */
@@ -136,8 +136,8 @@ enum {
        EV_SETUP_ERR,           /* 18 */
        EV_CONNECT_ERR,         /* 19 */
        EV_PROCEED,             /* 20 */
-       EV_ALERT,               /* 21 */ 
-       EV_REDIR,               /* 22 */ 
+       EV_ALERT,               /* 21 */
+       EV_REDIR,               /* 22 */
 };
 
 #define EVENT_COUNT (EV_REDIR + 1)
@@ -232,8 +232,8 @@ lli_leased_in(struct FsmInst *fi, int event, void *arg)
        ic.parm.setup.si2 = 0;
        ic.parm.setup.plan = 0;
        ic.parm.setup.screen = 0;
-       sprintf(ic.parm.setup.eazmsn,"%d", chanp->chan + 1);
-       sprintf(ic.parm.setup.phone,"LEASED%d", chanp->cs->myid);
+       sprintf(ic.parm.setup.eazmsn, "%d", chanp->chan + 1);
+       sprintf(ic.parm.setup.phone, "LEASED%d", chanp->cs->myid);
        ret = chanp->cs->iif.statcallb(&ic);
        if (chanp->debug & 1)
                link_debug(chanp, 1, "statcallb ret=%d", ret);
@@ -356,33 +356,33 @@ lli_deliver_call(struct FsmInst *fi, int event, void *arg)
                        link_debug(chanp, 1, "statcallb ret=%d", ret);
 
                switch (ret) {
-                       case 1: /* OK, someone likes this call */
-                               FsmDelTimer(&chanp->drel_timer, 61);
-                               FsmChangeState(fi, ST_IN_ALERT_SENT);
-                               chanp->d_st->lli.l4l3(chanp->d_st, CC_ALERTING | REQUEST, chanp->proc);
-                               break;
-                       case 5: /* direct redirect */
-                       case 4: /* Proceeding desired */
-                               FsmDelTimer(&chanp->drel_timer, 61);
-                               FsmChangeState(fi, ST_IN_PROCEED_SEND);
-                               chanp->d_st->lli.l4l3(chanp->d_st, CC_PROCEED_SEND | REQUEST, chanp->proc);
-                               if (ret == 5) {
-                                       memcpy(&chanp->setup, &ic.parm.setup, sizeof(setup_parm));
-                                       chanp->d_st->lli.l4l3(chanp->d_st, CC_REDIR | REQUEST, chanp->proc);
-                               }
-                               break;
-                       case 2: /* Rejecting Call */
-                               break;
-                       case 3: /* incomplete number */
-                               FsmDelTimer(&chanp->drel_timer, 61);
-                               chanp->d_st->lli.l4l3(chanp->d_st, CC_MORE_INFO | REQUEST, chanp->proc);
-                               break;
-                       case 0: /* OK, nobody likes this call */
-                       default:        /* statcallb problems */
-                               chanp->d_st->lli.l4l3(chanp->d_st, CC_IGNORE | REQUEST, chanp->proc);
-                               chanp->cs->cardmsg(chanp->cs, MDL_INFO_REL, (void *) (long)chanp->chan);
-                               FsmChangeState(fi, ST_NULL);
-                               break;
+               case 1: /* OK, someone likes this call */
+                       FsmDelTimer(&chanp->drel_timer, 61);
+                       FsmChangeState(fi, ST_IN_ALERT_SENT);
+                       chanp->d_st->lli.l4l3(chanp->d_st, CC_ALERTING | REQUEST, chanp->proc);
+                       break;
+               case 5: /* direct redirect */
+               case 4: /* Proceeding desired */
+                       FsmDelTimer(&chanp->drel_timer, 61);
+                       FsmChangeState(fi, ST_IN_PROCEED_SEND);
+                       chanp->d_st->lli.l4l3(chanp->d_st, CC_PROCEED_SEND | REQUEST, chanp->proc);
+                       if (ret == 5) {
+                               memcpy(&chanp->setup, &ic.parm.setup, sizeof(setup_parm));
+                               chanp->d_st->lli.l4l3(chanp->d_st, CC_REDIR | REQUEST, chanp->proc);
+                       }
+                       break;
+               case 2: /* Rejecting Call */
+                       break;
+               case 3: /* incomplete number */
+                       FsmDelTimer(&chanp->drel_timer, 61);
+                       chanp->d_st->lli.l4l3(chanp->d_st, CC_MORE_INFO | REQUEST, chanp->proc);
+                       break;
+               case 0: /* OK, nobody likes this call */
+               default:        /* statcallb problems */
+                       chanp->d_st->lli.l4l3(chanp->d_st, CC_IGNORE | REQUEST, chanp->proc);
+                       chanp->cs->cardmsg(chanp->cs, MDL_INFO_REL, (void *) (long)chanp->chan);
+                       FsmChangeState(fi, ST_NULL);
+                       break;
                }
        } else {
                chanp->d_st->lli.l4l3(chanp->d_st, CC_IGNORE | REQUEST, chanp->proc);
@@ -487,7 +487,7 @@ lli_disconnect_req(struct FsmInst *fi, int event, void *arg)
                if (chanp->proc)
                        chanp->proc->para.cause = 0x10; /* Normal Call Clearing */
                chanp->d_st->lli.l4l3(chanp->d_st, CC_DISCONNECT | REQUEST,
-                       chanp->proc);
+                                     chanp->proc);
        }
 }
 
@@ -503,7 +503,7 @@ lli_disconnect_reject(struct FsmInst *fi, int event, void *arg)
                if (chanp->proc)
                        chanp->proc->para.cause = 0x15; /* Call Rejected */
                chanp->d_st->lli.l4l3(chanp->d_st, CC_DISCONNECT | REQUEST,
-                       chanp->proc);
+                                     chanp->proc);
        }
 }
 
@@ -579,7 +579,7 @@ static void
 lli_bhup_disc(struct FsmInst *fi, int event, void *arg)
 {
        struct Channel *chanp = fi->userdata;
+
        if (chanp->debug & 1)
                link_debug(chanp, 0, "STAT_BHUP");
        HL_LL(chanp, ISDN_STAT_BHUP);
@@ -639,7 +639,7 @@ lli_abort(struct FsmInst *fi, int event, void *arg)
        chanp->b_st->lli.l4l3(chanp->b_st, DL_RELEASE | REQUEST, NULL);
        lli_bhup_dhup(fi, event, arg);
 }
+
 static void
 lli_release_req(struct FsmInst *fi, int event, void *arg)
 {
@@ -650,7 +650,7 @@ lli_release_req(struct FsmInst *fi, int event, void *arg)
        } else {
                FsmChangeState(fi, ST_WAIT_D_REL_CNF);
                chanp->d_st->lli.l4l3(chanp->d_st, CC_RELEASE | REQUEST,
-                       chanp->proc);
+                                     chanp->proc);
        }
 }
 
@@ -667,7 +667,7 @@ static void
 lli_bhup_release_req(struct FsmInst *fi, int event, void *arg)
 {
        struct Channel *chanp = fi->userdata;
+
        if (chanp->debug & 1)
                link_debug(chanp, 0, "STAT_BHUP");
        HL_LL(chanp, ISDN_STAT_BHUP);
@@ -698,7 +698,7 @@ lli_dchan_not_ready(struct FsmInst *fi, int event, void *arg)
 
        if (chanp->debug & 1)
                link_debug(chanp, 0, "STAT_DHUP");
-       HL_LL(chanp, ISDN_STAT_DHUP); 
+       HL_LL(chanp, ISDN_STAT_DHUP);
 }
 
 static void
@@ -709,7 +709,7 @@ lli_no_setup_rsp(struct FsmInst *fi, int event, void *arg)
        if (chanp->debug & 1)
                link_debug(chanp, 0, "STAT_DHUP");
        HL_LL(chanp, ISDN_STAT_DHUP);
-       lli_close(fi); 
+       lli_close(fi);
 }
 
 static void
@@ -768,69 +768,69 @@ lli_failure_a(struct FsmInst *fi, int event, void *arg)
 /* *INDENT-OFF* */
 static struct FsmNode fnlist[] __initdata =
 {
-        {ST_NULL,               EV_DIAL,                lli_prep_dialout},
-        {ST_NULL,               EV_RESUME,              lli_resume},
-        {ST_NULL,               EV_SETUP_IND,           lli_deliver_call},
-        {ST_NULL,               EV_LEASED,              lli_leased_in},
-        {ST_OUT_DIAL,           EV_SETUP_CNF,           lli_init_bchan_out},
-        {ST_OUT_DIAL,           EV_HANGUP,              lli_disconnect_req},
-        {ST_OUT_DIAL,           EV_DISCONNECT_IND,      lli_release_req},
-        {ST_OUT_DIAL,           EV_RELEASE,             lli_dhup_close},
-        {ST_OUT_DIAL,           EV_NOSETUP_RSP,         lli_no_setup_rsp},
-        {ST_OUT_DIAL,           EV_SETUP_ERR,           lli_error},
-        {ST_IN_WAIT_LL,         EV_LEASED_REL,          lli_failure_l},
-        {ST_IN_WAIT_LL,         EV_ACCEPTD,             lli_setup_rsp},
-        {ST_IN_WAIT_LL,         EV_HANGUP,              lli_reject_req},
-        {ST_IN_WAIT_LL,         EV_DISCONNECT_IND,      lli_release_req},
-        {ST_IN_WAIT_LL,         EV_RELEASE,             lli_dhup_close},
-        {ST_IN_WAIT_LL,         EV_SETUP_IND,           lli_deliver_call},
-        {ST_IN_WAIT_LL,         EV_SETUP_ERR,           lli_error},
-        {ST_IN_ALERT_SENT,      EV_SETUP_CMPL_IND,      lli_init_bchan_in},
-        {ST_IN_ALERT_SENT,      EV_ACCEPTD,             lli_send_dconnect},
-        {ST_IN_ALERT_SENT,      EV_HANGUP,              lli_disconnect_reject},
-        {ST_IN_ALERT_SENT,      EV_DISCONNECT_IND,      lli_release_req},
-        {ST_IN_ALERT_SENT,      EV_RELEASE,             lli_dhup_close},
+       {ST_NULL,               EV_DIAL,                lli_prep_dialout},
+       {ST_NULL,               EV_RESUME,              lli_resume},
+       {ST_NULL,               EV_SETUP_IND,           lli_deliver_call},
+       {ST_NULL,               EV_LEASED,              lli_leased_in},
+       {ST_OUT_DIAL,           EV_SETUP_CNF,           lli_init_bchan_out},
+       {ST_OUT_DIAL,           EV_HANGUP,              lli_disconnect_req},
+       {ST_OUT_DIAL,           EV_DISCONNECT_IND,      lli_release_req},
+       {ST_OUT_DIAL,           EV_RELEASE,             lli_dhup_close},
+       {ST_OUT_DIAL,           EV_NOSETUP_RSP,         lli_no_setup_rsp},
+       {ST_OUT_DIAL,           EV_SETUP_ERR,           lli_error},
+       {ST_IN_WAIT_LL,         EV_LEASED_REL,          lli_failure_l},
+       {ST_IN_WAIT_LL,         EV_ACCEPTD,             lli_setup_rsp},
+       {ST_IN_WAIT_LL,         EV_HANGUP,              lli_reject_req},
+       {ST_IN_WAIT_LL,         EV_DISCONNECT_IND,      lli_release_req},
+       {ST_IN_WAIT_LL,         EV_RELEASE,             lli_dhup_close},
+       {ST_IN_WAIT_LL,         EV_SETUP_IND,           lli_deliver_call},
+       {ST_IN_WAIT_LL,         EV_SETUP_ERR,           lli_error},
+       {ST_IN_ALERT_SENT,      EV_SETUP_CMPL_IND,      lli_init_bchan_in},
+       {ST_IN_ALERT_SENT,      EV_ACCEPTD,             lli_send_dconnect},
+       {ST_IN_ALERT_SENT,      EV_HANGUP,              lli_disconnect_reject},
+       {ST_IN_ALERT_SENT,      EV_DISCONNECT_IND,      lli_release_req},
+       {ST_IN_ALERT_SENT,      EV_RELEASE,             lli_dhup_close},
        {ST_IN_ALERT_SENT,      EV_REDIR,               lli_send_redir},
        {ST_IN_PROCEED_SEND,    EV_REDIR,               lli_send_redir},
        {ST_IN_PROCEED_SEND,    EV_ALERT,               lli_send_alert},
        {ST_IN_PROCEED_SEND,    EV_ACCEPTD,             lli_send_dconnect},
        {ST_IN_PROCEED_SEND,    EV_HANGUP,              lli_disconnect_reject},
        {ST_IN_PROCEED_SEND,    EV_DISCONNECT_IND,      lli_dhup_close},
-        {ST_IN_ALERT_SENT,      EV_RELEASE,             lli_dhup_close},
-        {ST_IN_WAIT_CONN_ACK,   EV_SETUP_CMPL_IND,      lli_init_bchan_in},
-        {ST_IN_WAIT_CONN_ACK,   EV_HANGUP,              lli_disconnect_req},
-        {ST_IN_WAIT_CONN_ACK,   EV_DISCONNECT_IND,      lli_release_req},
-        {ST_IN_WAIT_CONN_ACK,   EV_RELEASE,             lli_dhup_close},
-        {ST_IN_WAIT_CONN_ACK,   EV_CONNECT_ERR,         lli_error},
-        {ST_WAIT_BCONN,         EV_BC_EST,              lli_go_active},
-        {ST_WAIT_BCONN,         EV_BC_REL,              lli_rel_b_disc},
-        {ST_WAIT_BCONN,         EV_HANGUP,              lli_rel_b_disc},
-        {ST_WAIT_BCONN,         EV_DISCONNECT_IND,      lli_rel_b_release_req},
-        {ST_WAIT_BCONN,         EV_RELEASE,             lli_rel_b_dhup},
-        {ST_WAIT_BCONN,         EV_LEASED_REL,          lli_rel_b_fail},
-        {ST_WAIT_BCONN,         EV_CINF,                lli_charge_info},
-        {ST_ACTIVE,             EV_CINF,                lli_charge_info},
-        {ST_ACTIVE,             EV_BC_REL,              lli_bhup_rel_b},
-        {ST_ACTIVE,             EV_SUSPEND,             lli_suspend},
-        {ST_ACTIVE,             EV_HANGUP,              lli_disconn_bchan},
-        {ST_ACTIVE,             EV_DISCONNECT_IND,      lli_release_bchan},
-        {ST_ACTIVE,             EV_RELEASE,             lli_abort},
-        {ST_ACTIVE,             EV_LEASED_REL,          lli_failure_a},
-        {ST_WAIT_BRELEASE,      EV_BC_REL,              lli_bhup_disc},
-        {ST_WAIT_BRELEASE,      EV_DISCONNECT_IND,      lli_bhup_release_req},
-        {ST_WAIT_BRELEASE,      EV_RELEASE,             lli_bhup_dhup},
-        {ST_WAIT_BRELEASE,      EV_LEASED_REL,          lli_bhup_fail},
-        {ST_WAIT_BREL_DISC,     EV_BC_REL,              lli_bhup_release_req},
-        {ST_WAIT_BREL_DISC,     EV_RELEASE,             lli_bhup_dhup},
-        {ST_WAIT_DCOMMAND,      EV_HANGUP,              lli_start_disc},
-        {ST_WAIT_DCOMMAND,      EV_DISCONNECT_IND,      lli_release_req},
-        {ST_WAIT_DCOMMAND,      EV_RELEASE,             lli_dhup_close},
-        {ST_WAIT_DCOMMAND,      EV_LEASED_REL,          lli_failure_l},
-        {ST_WAIT_DRELEASE,      EV_RELEASE,             lli_dhup_close},
-        {ST_WAIT_DRELEASE,      EV_DIAL,                lli_dchan_not_ready},
-  /* ETS 300-104 16.1 */
-        {ST_WAIT_D_REL_CNF,     EV_RELEASE,             lli_dhup_close},
-        {ST_WAIT_D_REL_CNF,     EV_DIAL,                lli_dchan_not_ready},
+       {ST_IN_ALERT_SENT,      EV_RELEASE,             lli_dhup_close},
+       {ST_IN_WAIT_CONN_ACK,   EV_SETUP_CMPL_IND,      lli_init_bchan_in},
+       {ST_IN_WAIT_CONN_ACK,   EV_HANGUP,              lli_disconnect_req},
+       {ST_IN_WAIT_CONN_ACK,   EV_DISCONNECT_IND,      lli_release_req},
+       {ST_IN_WAIT_CONN_ACK,   EV_RELEASE,             lli_dhup_close},
+       {ST_IN_WAIT_CONN_ACK,   EV_CONNECT_ERR,         lli_error},
+       {ST_WAIT_BCONN,         EV_BC_EST,              lli_go_active},
+       {ST_WAIT_BCONN,         EV_BC_REL,              lli_rel_b_disc},
+       {ST_WAIT_BCONN,         EV_HANGUP,              lli_rel_b_disc},
+       {ST_WAIT_BCONN,         EV_DISCONNECT_IND,      lli_rel_b_release_req},
+       {ST_WAIT_BCONN,         EV_RELEASE,             lli_rel_b_dhup},
+       {ST_WAIT_BCONN,         EV_LEASED_REL,          lli_rel_b_fail},
+       {ST_WAIT_BCONN,         EV_CINF,                lli_charge_info},
+       {ST_ACTIVE,             EV_CINF,                lli_charge_info},
+       {ST_ACTIVE,             EV_BC_REL,              lli_bhup_rel_b},
+       {ST_ACTIVE,             EV_SUSPEND,             lli_suspend},
+       {ST_ACTIVE,             EV_HANGUP,              lli_disconn_bchan},
+       {ST_ACTIVE,             EV_DISCONNECT_IND,      lli_release_bchan},
+       {ST_ACTIVE,             EV_RELEASE,             lli_abort},
+       {ST_ACTIVE,             EV_LEASED_REL,          lli_failure_a},
+       {ST_WAIT_BRELEASE,      EV_BC_REL,              lli_bhup_disc},
+       {ST_WAIT_BRELEASE,      EV_DISCONNECT_IND,      lli_bhup_release_req},
+       {ST_WAIT_BRELEASE,      EV_RELEASE,             lli_bhup_dhup},
+       {ST_WAIT_BRELEASE,      EV_LEASED_REL,          lli_bhup_fail},
+       {ST_WAIT_BREL_DISC,     EV_BC_REL,              lli_bhup_release_req},
+       {ST_WAIT_BREL_DISC,     EV_RELEASE,             lli_bhup_dhup},
+       {ST_WAIT_DCOMMAND,      EV_HANGUP,              lli_start_disc},
+       {ST_WAIT_DCOMMAND,      EV_DISCONNECT_IND,      lli_release_req},
+       {ST_WAIT_DCOMMAND,      EV_RELEASE,             lli_dhup_close},
+       {ST_WAIT_DCOMMAND,      EV_LEASED_REL,          lli_failure_l},
+       {ST_WAIT_DRELEASE,      EV_RELEASE,             lli_dhup_close},
+       {ST_WAIT_DRELEASE,      EV_DIAL,                lli_dchan_not_ready},
+       /* ETS 300-104 16.1 */
+       {ST_WAIT_D_REL_CNF,     EV_RELEASE,             lli_dhup_close},
+       {ST_WAIT_D_REL_CNF,     EV_DIAL,                lli_dchan_not_ready},
 };
 /* *INDENT-ON* */
 
@@ -855,21 +855,21 @@ release_b_st(struct Channel *chanp)
 {
        struct PStack *st = chanp->b_st;
 
-       if(test_and_clear_bit(FLG_START_B, &chanp->Flags)) {
+       if (test_and_clear_bit(FLG_START_B, &chanp->Flags)) {
                chanp->bcs->BC_Close(chanp->bcs);
                switch (chanp->l2_active_protocol) {
-                       case (ISDN_PROTO_L2_X75I):
-                               releasestack_isdnl2(st);
-                               break;
-                       case (ISDN_PROTO_L2_HDLC):
-                       case (ISDN_PROTO_L2_HDLC_56K):
-                       case (ISDN_PROTO_L2_TRANS):
-                       case (ISDN_PROTO_L2_MODEM):
-                       case (ISDN_PROTO_L2_FAX):
-                               releasestack_transl2(st);
-                               break;
+               case (ISDN_PROTO_L2_X75I):
+                       releasestack_isdnl2(st);
+                       break;
+               case (ISDN_PROTO_L2_HDLC):
+               case (ISDN_PROTO_L2_HDLC_56K):
+               case (ISDN_PROTO_L2_TRANS):
+               case (ISDN_PROTO_L2_MODEM):
+               case (ISDN_PROTO_L2_FAX):
+                       releasestack_transl2(st);
+                       break;
                }
-       } 
+       }
 }
 
 static struct Channel
@@ -880,9 +880,9 @@ static struct Channel
        int i;
 
        if (test_bit(FLG_TWO_DCHAN, &cs->HW_Flags))
-               i=1;
+               i = 1;
        else
-               i=0;
+               i = 0;
 
        if (!bch) {
                i = 2; /* virtual channel */
@@ -912,10 +912,10 @@ static struct Channel
 
 static void stat_redir_result(struct IsdnCardState *cs, int chan, ulong result)
 {      isdn_ctrl ic;
-  
+
        ic.driver = cs->myid;
        ic.command = ISDN_STAT_REDIR;
-       ic.arg = chan; 
+       ic.arg = chan;
        ic.parm.num[0] = result;
        cs->iif.statcallb(&ic);
 } /* stat_redir_result */
@@ -927,7 +927,7 @@ dchan_l3l4(struct PStack *st, int pr, void *arg)
        struct IsdnCardState *cs = st->l1.hardware;
        struct Channel *chanp;
 
-       if(!pc)
+       if (!pc)
                return;
 
        if (pr == (CC_SETUP | INDICATION)) {
@@ -945,63 +945,63 @@ dchan_l3l4(struct PStack *st, int pr, void *arg)
                return;
 
        switch (pr) {
-               case (CC_MORE_INFO | INDICATION):
-                       FsmEvent(&chanp->fi, EV_SETUP_IND, NULL);
-                       break;
-               case (CC_DISCONNECT | INDICATION):
-                       FsmEvent(&chanp->fi, EV_DISCONNECT_IND, NULL);
-                       break;
-               case (CC_RELEASE | CONFIRM):
-                       FsmEvent(&chanp->fi, EV_RELEASE, NULL);
-                       break;
-               case (CC_SUSPEND | CONFIRM):
-                       FsmEvent(&chanp->fi, EV_RELEASE, NULL);
-                       break;
-               case (CC_RESUME | CONFIRM):
-                       FsmEvent(&chanp->fi, EV_SETUP_CNF, NULL);
-                       break;
-               case (CC_RESUME_ERR):
-                       FsmEvent(&chanp->fi, EV_RELEASE, NULL);
-                       break;
-               case (CC_RELEASE | INDICATION):
-                       FsmEvent(&chanp->fi, EV_RELEASE, NULL);
-                       break;
-               case (CC_SETUP_COMPL | INDICATION):
-                       FsmEvent(&chanp->fi, EV_SETUP_CMPL_IND, NULL);
-                       break;
-               case (CC_SETUP | CONFIRM):
-                       FsmEvent(&chanp->fi, EV_SETUP_CNF, NULL);
-                       break;
-               case (CC_CHARGE | INDICATION):
-                       FsmEvent(&chanp->fi, EV_CINF, NULL);
-                       break;
-               case (CC_NOSETUP_RSP):
-                       FsmEvent(&chanp->fi, EV_NOSETUP_RSP, NULL);
-                       break;
-               case (CC_SETUP_ERR):
-                       FsmEvent(&chanp->fi, EV_SETUP_ERR, NULL);
-                       break;
-               case (CC_CONNECT_ERR):
-                       FsmEvent(&chanp->fi, EV_CONNECT_ERR, NULL);
-                       break;
-               case (CC_RELEASE_ERR):
-                       FsmEvent(&chanp->fi, EV_RELEASE, NULL);
-                       break;
-               case (CC_PROCEED_SEND | INDICATION):
-               case (CC_PROCEEDING | INDICATION):
-               case (CC_ALERTING | INDICATION):
-               case (CC_PROGRESS | INDICATION):
-               case (CC_NOTIFY | INDICATION):
-                       break;
-               case (CC_REDIR | INDICATION):
-                       stat_redir_result(cs, chanp->chan, pc->redir_result); 
-                       break;
-                       default:
-                       if (chanp->debug & 0x800) {
-                               HiSax_putstatus(chanp->cs, "Ch",
+       case (CC_MORE_INFO | INDICATION):
+               FsmEvent(&chanp->fi, EV_SETUP_IND, NULL);
+               break;
+       case (CC_DISCONNECT | INDICATION):
+               FsmEvent(&chanp->fi, EV_DISCONNECT_IND, NULL);
+               break;
+       case (CC_RELEASE | CONFIRM):
+               FsmEvent(&chanp->fi, EV_RELEASE, NULL);
+               break;
+       case (CC_SUSPEND | CONFIRM):
+               FsmEvent(&chanp->fi, EV_RELEASE, NULL);
+               break;
+       case (CC_RESUME | CONFIRM):
+               FsmEvent(&chanp->fi, EV_SETUP_CNF, NULL);
+               break;
+       case (CC_RESUME_ERR):
+               FsmEvent(&chanp->fi, EV_RELEASE, NULL);
+               break;
+       case (CC_RELEASE | INDICATION):
+               FsmEvent(&chanp->fi, EV_RELEASE, NULL);
+               break;
+       case (CC_SETUP_COMPL | INDICATION):
+               FsmEvent(&chanp->fi, EV_SETUP_CMPL_IND, NULL);
+               break;
+       case (CC_SETUP | CONFIRM):
+               FsmEvent(&chanp->fi, EV_SETUP_CNF, NULL);
+               break;
+       case (CC_CHARGE | INDICATION):
+               FsmEvent(&chanp->fi, EV_CINF, NULL);
+               break;
+       case (CC_NOSETUP_RSP):
+               FsmEvent(&chanp->fi, EV_NOSETUP_RSP, NULL);
+               break;
+       case (CC_SETUP_ERR):
+               FsmEvent(&chanp->fi, EV_SETUP_ERR, NULL);
+               break;
+       case (CC_CONNECT_ERR):
+               FsmEvent(&chanp->fi, EV_CONNECT_ERR, NULL);
+               break;
+       case (CC_RELEASE_ERR):
+               FsmEvent(&chanp->fi, EV_RELEASE, NULL);
+               break;
+       case (CC_PROCEED_SEND | INDICATION):
+       case (CC_PROCEEDING | INDICATION):
+       case (CC_ALERTING | INDICATION):
+       case (CC_PROGRESS | INDICATION):
+       case (CC_NOTIFY | INDICATION):
+               break;
+       case (CC_REDIR | INDICATION):
+               stat_redir_result(cs, chanp->chan, pc->redir_result);
+               break;
+       default:
+               if (chanp->debug & 0x800) {
+                       HiSax_putstatus(chanp->cs, "Ch",
                                        "%d L3->L4 unknown primitiv %#x",
                                        chanp->chan, pr);
-                       }
+               }
        }
 }
 
@@ -1069,7 +1069,7 @@ init_d_st(struct Channel *chanp)
 }
 
 static __printf(2, 3) void
-callc_debug(struct FsmInst *fi, char *fmt, ...)
+       callc_debug(struct FsmInst *fi, char *fmt, ...)
 {
        va_list args;
        struct Channel *chanp = fi->userdata;
@@ -1129,8 +1129,8 @@ CallcNewChan(struct IsdnCardState *csta) {
                return err;
        printk(KERN_INFO "HiSax: 2 channels added\n");
 
-       for (i = 0; i < MAX_WAITING_CALLS; i++) { 
-               err = init_chan(i+2,csta);
+       for (i = 0; i < MAX_WAITING_CALLS; i++) {
+               err = init_chan(i + 2, csta);
                if (err)
                        return err;
        }
@@ -1138,7 +1138,7 @@ CallcNewChan(struct IsdnCardState *csta) {
        if (test_bit(FLG_PTP, &csta->channel->d_st->l2.flag)) {
                printk(KERN_INFO "LAYER2 WATCHING ESTABLISH\n");
                csta->channel->d_st->lli.l4l3(csta->channel->d_st,
-                       DL_ESTABLISH | REQUEST, NULL);
+                                             DL_ESTABLISH | REQUEST, NULL);
        }
        return (0);
 }
@@ -1187,28 +1187,28 @@ lldata_handler(struct PStack *st, int pr, void *arg)
        struct sk_buff *skb = arg;
 
        switch (pr) {
-               case (DL_DATA  | INDICATION):
-                       if (chanp->data_open) {
-                               if (chanp->debug & 0x800)
-                                       link_debug(chanp, 0, "lldata: %d", skb->len);
-                               chanp->cs->iif.rcvcallb_skb(chanp->cs->myid, chanp->chan, skb);
-                       } else {
-                               link_debug(chanp, 0, "lldata: channel not open");
-                               dev_kfree_skb(skb);
-                       }
-                       break;
-               case (DL_ESTABLISH | INDICATION):
-               case (DL_ESTABLISH | CONFIRM):
-                       FsmEvent(&chanp->fi, EV_BC_EST, NULL);
-                       break;
-               case (DL_RELEASE | INDICATION):
-               case (DL_RELEASE | CONFIRM):
-                       FsmEvent(&chanp->fi, EV_BC_REL, NULL);
-                       break;
-               default:
-                       printk(KERN_WARNING "lldata_handler unknown primitive %#x\n",
-                               pr);
-                       break;
+       case (DL_DATA  | INDICATION):
+               if (chanp->data_open) {
+                       if (chanp->debug & 0x800)
+                               link_debug(chanp, 0, "lldata: %d", skb->len);
+                       chanp->cs->iif.rcvcallb_skb(chanp->cs->myid, chanp->chan, skb);
+               } else {
+                       link_debug(chanp, 0, "lldata: channel not open");
+                       dev_kfree_skb(skb);
+               }
+               break;
+       case (DL_ESTABLISH | INDICATION):
+       case (DL_ESTABLISH | CONFIRM):
+               FsmEvent(&chanp->fi, EV_BC_EST, NULL);
+               break;
+       case (DL_RELEASE | INDICATION):
+       case (DL_RELEASE | CONFIRM):
+               FsmEvent(&chanp->fi, EV_BC_REL, NULL);
+               break;
+       default:
+               printk(KERN_WARNING "lldata_handler unknown primitive %#x\n",
+                      pr);
+               break;
        }
 }
 
@@ -1219,28 +1219,28 @@ lltrans_handler(struct PStack *st, int pr, void *arg)
        struct sk_buff *skb = arg;
 
        switch (pr) {
-               case (PH_DATA | INDICATION):
-                       if (chanp->data_open) {
-                               if (chanp->debug & 0x800)
-                                       link_debug(chanp, 0, "lltrans: %d", skb->len);
-                               chanp->cs->iif.rcvcallb_skb(chanp->cs->myid, chanp->chan, skb);
-                       } else {
-                               link_debug(chanp, 0, "lltrans: channel not open");
-                               dev_kfree_skb(skb);
-                       }
-                       break;
-               case (PH_ACTIVATE | INDICATION):
-               case (PH_ACTIVATE | CONFIRM):
-                       FsmEvent(&chanp->fi, EV_BC_EST, NULL);
-                       break;
-               case (PH_DEACTIVATE | INDICATION):
-               case (PH_DEACTIVATE | CONFIRM):
-                       FsmEvent(&chanp->fi, EV_BC_REL, NULL);
-                       break;
-               default:
-                       printk(KERN_WARNING "lltrans_handler unknown primitive %#x\n",
-                               pr);
-                       break;
+       case (PH_DATA | INDICATION):
+               if (chanp->data_open) {
+                       if (chanp->debug & 0x800)
+                               link_debug(chanp, 0, "lltrans: %d", skb->len);
+                       chanp->cs->iif.rcvcallb_skb(chanp->cs->myid, chanp->chan, skb);
+               } else {
+                       link_debug(chanp, 0, "lltrans: channel not open");
+                       dev_kfree_skb(skb);
+               }
+               break;
+       case (PH_ACTIVATE | INDICATION):
+       case (PH_ACTIVATE | CONFIRM):
+               FsmEvent(&chanp->fi, EV_BC_EST, NULL);
+               break;
+       case (PH_DEACTIVATE | INDICATION):
+       case (PH_DEACTIVATE | CONFIRM):
+               FsmEvent(&chanp->fi, EV_BC_REL, NULL);
+               break;
+       default:
+               printk(KERN_WARNING "lltrans_handler unknown primitive %#x\n",
+                      pr);
+               break;
        }
 }
 
@@ -1272,22 +1272,22 @@ init_b_st(struct Channel *chanp, int incoming)
        else
                st->l1.bc = chanp->proc->para.bchannel - 1;
        switch (chanp->l2_active_protocol) {
-               case (ISDN_PROTO_L2_X75I):
-               case (ISDN_PROTO_L2_HDLC):
-                       st->l1.mode = L1_MODE_HDLC;
-                       break;
-               case (ISDN_PROTO_L2_HDLC_56K):
-                       st->l1.mode = L1_MODE_HDLC_56K;
-                       break;
-               case (ISDN_PROTO_L2_TRANS):
-                       st->l1.mode = L1_MODE_TRANS;
-                       break;
-               case (ISDN_PROTO_L2_MODEM):
-                       st->l1.mode = L1_MODE_V32;
-                       break;
-               case (ISDN_PROTO_L2_FAX):
-                       st->l1.mode = L1_MODE_FAX;
-                       break;
+       case (ISDN_PROTO_L2_X75I):
+       case (ISDN_PROTO_L2_HDLC):
+               st->l1.mode = L1_MODE_HDLC;
+               break;
+       case (ISDN_PROTO_L2_HDLC_56K):
+               st->l1.mode = L1_MODE_HDLC_56K;
+               break;
+       case (ISDN_PROTO_L2_TRANS):
+               st->l1.mode = L1_MODE_TRANS;
+               break;
+       case (ISDN_PROTO_L2_MODEM):
+               st->l1.mode = L1_MODE_V32;
+               break;
+       case (ISDN_PROTO_L2_FAX):
+               st->l1.mode = L1_MODE_FAX;
+               break;
        }
        chanp->bcs->conmsg = NULL;
        if (chanp->bcs->BC_SetStack(st, chanp->bcs))
@@ -1303,29 +1303,29 @@ init_b_st(struct Channel *chanp, int incoming)
        st->l2.T203 = 5000;     /* 5000 milliseconds */
        st->l3.debug = 0;
        switch (chanp->l2_active_protocol) {
-               case (ISDN_PROTO_L2_X75I):
-                       sprintf(tmp, "Ch%d X.75", chanp->chan);
-                       setstack_isdnl2(st, tmp);
-                       setstack_l3bc(st, chanp);
-                       st->l2.l2l3 = lldata_handler;
-                       st->lli.userdata = chanp;
-                       test_and_clear_bit(FLG_LLI_L1WAKEUP, &st->lli.flag);
-                       test_and_set_bit(FLG_LLI_L2WAKEUP, &st->lli.flag);
-                       st->l2.l2m.debug = chanp->debug & 16;
-                       st->l2.debug = chanp->debug & 64;
-                       break;
-               case (ISDN_PROTO_L2_HDLC):
-               case (ISDN_PROTO_L2_HDLC_56K):
-               case (ISDN_PROTO_L2_TRANS):
-               case (ISDN_PROTO_L2_MODEM):
-               case (ISDN_PROTO_L2_FAX):
-                       st->l1.l1l2 = lltrans_handler;
-                       st->lli.userdata = chanp;
-                       test_and_set_bit(FLG_LLI_L1WAKEUP, &st->lli.flag);
-                       test_and_clear_bit(FLG_LLI_L2WAKEUP, &st->lli.flag);
-                       setstack_transl2(st);
-                       setstack_l3bc(st, chanp);
-                       break;
+       case (ISDN_PROTO_L2_X75I):
+               sprintf(tmp, "Ch%d X.75", chanp->chan);
+               setstack_isdnl2(st, tmp);
+               setstack_l3bc(st, chanp);
+               st->l2.l2l3 = lldata_handler;
+               st->lli.userdata = chanp;
+               test_and_clear_bit(FLG_LLI_L1WAKEUP, &st->lli.flag);
+               test_and_set_bit(FLG_LLI_L2WAKEUP, &st->lli.flag);
+               st->l2.l2m.debug = chanp->debug & 16;
+               st->l2.debug = chanp->debug & 64;
+               break;
+       case (ISDN_PROTO_L2_HDLC):
+       case (ISDN_PROTO_L2_HDLC_56K):
+       case (ISDN_PROTO_L2_TRANS):
+       case (ISDN_PROTO_L2_MODEM):
+       case (ISDN_PROTO_L2_FAX):
+               st->l1.l1l2 = lltrans_handler;
+               st->lli.userdata = chanp;
+               test_and_set_bit(FLG_LLI_L1WAKEUP, &st->lli.flag);
+               test_and_clear_bit(FLG_LLI_L2WAKEUP, &st->lli.flag);
+               setstack_transl2(st);
+               setstack_l3bc(st, chanp);
+               break;
        }
        test_and_set_bit(FLG_START_B, &chanp->Flags);
        return (0);
@@ -1338,19 +1338,19 @@ leased_l4l3(struct PStack *st, int pr, void *arg)
        struct sk_buff *skb = arg;
 
        switch (pr) {
-               case (DL_DATA | REQUEST):
-                       link_debug(chanp, 0, "leased line d-channel DATA");
-                       dev_kfree_skb(skb);
-                       break;
-               case (DL_ESTABLISH | REQUEST):
-                       st->l2.l2l1(st, PH_ACTIVATE | REQUEST, NULL);
-                       break;
-               case (DL_RELEASE | REQUEST):
-                       break;
-               default:
-                       printk(KERN_WARNING "transd_l4l3 unknown primitive %#x\n",
-                               pr);
-                       break;
+       case (DL_DATA | REQUEST):
+               link_debug(chanp, 0, "leased line d-channel DATA");
+               dev_kfree_skb(skb);
+               break;
+       case (DL_ESTABLISH | REQUEST):
+               st->l2.l2l1(st, PH_ACTIVATE | REQUEST, NULL);
+               break;
+       case (DL_RELEASE | REQUEST):
+               break;
+       default:
+               printk(KERN_WARNING "transd_l4l3 unknown primitive %#x\n",
+                      pr);
+               break;
        }
 }
 
@@ -1359,32 +1359,32 @@ leased_l1l2(struct PStack *st, int pr, void *arg)
 {
        struct Channel *chanp = (struct Channel *) st->lli.userdata;
        struct sk_buff *skb = arg;
-       int i,event = EV_LEASED_REL;
+       int i, event = EV_LEASED_REL;
 
        switch (pr) {
-               case (PH_DATA | INDICATION):
-                       link_debug(chanp, 0, "leased line d-channel DATA");
-                       dev_kfree_skb(skb);
-                       break;
-               case (PH_ACTIVATE | INDICATION):
-               case (PH_ACTIVATE | CONFIRM):
-                       event = EV_LEASED;
-               case (PH_DEACTIVATE | INDICATION):
-               case (PH_DEACTIVATE | CONFIRM):
-                       if (test_bit(FLG_TWO_DCHAN, &chanp->cs->HW_Flags))
-                               i = 1;
-                       else
-                               i = 0;
-                       while (i < 2) {
-                               FsmEvent(&chanp->fi, event, NULL);
-                               chanp++;
-                               i++;
-                       }
-                       break;
-               default:
-                       printk(KERN_WARNING
-                               "transd_l1l2 unknown primitive %#x\n", pr);
-                       break;
+       case (PH_DATA | INDICATION):
+               link_debug(chanp, 0, "leased line d-channel DATA");
+               dev_kfree_skb(skb);
+               break;
+       case (PH_ACTIVATE | INDICATION):
+       case (PH_ACTIVATE | CONFIRM):
+               event = EV_LEASED;
+       case (PH_DEACTIVATE | INDICATION):
+       case (PH_DEACTIVATE | CONFIRM):
+               if (test_bit(FLG_TWO_DCHAN, &chanp->cs->HW_Flags))
+                       i = 1;
+               else
+                       i = 0;
+               while (i < 2) {
+                       FsmEvent(&chanp->fi, event, NULL);
+                       chanp++;
+                       i++;
+               }
+               break;
+       default:
+               printk(KERN_WARNING
+                      "transd_l1l2 unknown primitive %#x\n", pr);
+               break;
        }
 }
 
@@ -1394,7 +1394,7 @@ distr_debug(struct IsdnCardState *csta, int debugflags)
        int i;
        struct Channel *chanp = csta->channel;
 
-       for (i = 0; i < (2 + MAX_WAITING_CALLS) ; i++) {
+       for (i = 0; i < (2 + MAX_WAITING_CALLS); i++) {
                chanp[i].debug = debugflags;
                chanp[i].fi.debug = debugflags & 2;
                chanp[i].d_st->l2.l2m.debug = debugflags & 8;
@@ -1421,9 +1421,9 @@ capi_debug(struct Channel *chanp, capi_msg *cm)
 {
        char *t = tmpbuf;
 
-       t += QuickHex(t, (u_char *)cm, (cm->Length>50)? 50: cm->Length);
+       t += QuickHex(t, (u_char *)cm, (cm->Length > 50) ? 50 : cm->Length);
        t--;
-       *t= 0;
+       *t = 0;
        HiSax_putstatus(chanp->cs, "Ch", "%d CAPIMSG %s", chanp->chan, tmpbuf);
 }
 
@@ -1431,31 +1431,31 @@ static void
 lli_got_fac_req(struct Channel *chanp, capi_msg *cm) {
        if ((cm->para[0] != 3) || (cm->para[1] != 0))
                return;
-       if (cm->para[2]<3)
+       if (cm->para[2] < 3)
                return;
        if (cm->para[4] != 0)
                return;
-       switch(cm->para[3]) {
-               case 4: /* Suspend */
-                       strncpy(chanp->setup.phone, &cm->para[5], cm->para[5] +1);
-                       FsmEvent(&chanp->fi, EV_SUSPEND, cm);
-                       break;
-               case 5: /* Resume */
-                       strncpy(chanp->setup.phone, &cm->para[5], cm->para[5] +1);
-                       if (chanp->fi.state == ST_NULL) {
-                               FsmEvent(&chanp->fi, EV_RESUME, cm);
-                       } else {
-                               FsmDelTimer(&chanp->dial_timer, 72);
-                               FsmAddTimer(&chanp->dial_timer, 80, EV_RESUME, cm, 73);
-                       }
-                       break;
+       switch (cm->para[3]) {
+       case 4: /* Suspend */
+               strncpy(chanp->setup.phone, &cm->para[5], cm->para[5] + 1);
+               FsmEvent(&chanp->fi, EV_SUSPEND, cm);
+               break;
+       case 5: /* Resume */
+               strncpy(chanp->setup.phone, &cm->para[5], cm->para[5] + 1);
+               if (chanp->fi.state == ST_NULL) {
+                       FsmEvent(&chanp->fi, EV_RESUME, cm);
+               } else {
+                       FsmDelTimer(&chanp->dial_timer, 72);
+                       FsmAddTimer(&chanp->dial_timer, 80, EV_RESUME, cm, 73);
+               }
+               break;
        }
 }
 
 static void
 lli_got_manufacturer(struct Channel *chanp, struct IsdnCardState *cs, capi_msg *cm) {
        if ((cs->typ == ISDN_CTYPE_ELSA) || (cs->typ == ISDN_CTYPE_ELSA_PNP) ||
-               (cs->typ == ISDN_CTYPE_ELSA_PCI)) {
+           (cs->typ == ISDN_CTYPE_ELSA_PCI)) {
                if (cs->hw.elsa.MFlag) {
                        cs->cardmsg(cs, CARD_AUX_IND, cm->para);
                }
@@ -1466,14 +1466,14 @@ lli_got_manufacturer(struct Channel *chanp, struct IsdnCardState *cs, capi_msg *
 /***************************************************************/
 /* Limit the available number of channels for the current card */
 /***************************************************************/
-static int 
+static int
 set_channel_limit(struct IsdnCardState *cs, int chanmax)
 {
        isdn_ctrl ic;
        int i, ii;
 
        if ((chanmax < 0) || (chanmax > 2))
-               return(-EINVAL);
+               return (-EINVAL);
        cs->chanlimit = 0;
        for (ii = 0; ii < 2; ii++) {
                ic.driver = cs->myid;
@@ -1483,16 +1483,16 @@ set_channel_limit(struct IsdnCardState *cs, int chanmax)
                        ic.parm.num[0] = 0; /* disabled */
                else
                        ic.parm.num[0] = 1; /* enabled */
-               i = cs->iif.statcallb(&ic); 
-               if (i) return(-EINVAL);
-               if (ii < chanmax) 
+               i = cs->iif.statcallb(&ic);
+               if (i) return (-EINVAL);
+               if (ii < chanmax)
                        cs->chanlimit++;
        }
-       return(0);
+       return (0);
 } /* set_channel_limit */
 
 int
-HiSax_command(isdn_ctrl * ic)
+HiSax_command(isdn_ctrl *ic)
 {
        struct IsdnCardState *csta = hisax_findcard(ic->driver);
        struct PStack *st;
@@ -1502,236 +1502,236 @@ HiSax_command(isdn_ctrl * ic)
 
        if (!csta) {
                printk(KERN_ERR
-               "HiSax: if_command %d called with invalid driverId %d!\n",
-                       ic->command, ic->driver);
+                      "HiSax: if_command %d called with invalid driverId %d!\n",
+                      ic->command, ic->driver);
                return -ENODEV;
        }
        switch (ic->command) {
-               case (ISDN_CMD_SETEAZ):
-                       chanp = csta->channel + ic->arg;
+       case (ISDN_CMD_SETEAZ):
+               chanp = csta->channel + ic->arg;
+               break;
+       case (ISDN_CMD_SETL2):
+               chanp = csta->channel + (ic->arg & 0xff);
+               if (chanp->debug & 1)
+                       link_debug(chanp, 1, "SETL2 card %d %ld",
+                                  csta->cardnr + 1, ic->arg >> 8);
+               chanp->l2_protocol = ic->arg >> 8;
+               break;
+       case (ISDN_CMD_SETL3):
+               chanp = csta->channel + (ic->arg & 0xff);
+               if (chanp->debug & 1)
+                       link_debug(chanp, 1, "SETL3 card %d %ld",
+                                  csta->cardnr + 1, ic->arg >> 8);
+               chanp->l3_protocol = ic->arg >> 8;
+               break;
+       case (ISDN_CMD_DIAL):
+               chanp = csta->channel + (ic->arg & 0xff);
+               if (chanp->debug & 1)
+                       link_debug(chanp, 1, "DIAL %s -> %s (%d,%d)",
+                                  ic->parm.setup.eazmsn, ic->parm.setup.phone,
+                                  ic->parm.setup.si1, ic->parm.setup.si2);
+               memcpy(&chanp->setup, &ic->parm.setup, sizeof(setup_parm));
+               if (!strcmp(chanp->setup.eazmsn, "0"))
+                       chanp->setup.eazmsn[0] = '\0';
+               /* this solution is dirty and may be change, if
+                * we make a callreference based callmanager */
+               if (chanp->fi.state == ST_NULL) {
+                       FsmEvent(&chanp->fi, EV_DIAL, NULL);
+               } else {
+                       FsmDelTimer(&chanp->dial_timer, 70);
+                       FsmAddTimer(&chanp->dial_timer, 50, EV_DIAL, NULL, 71);
+               }
+               break;
+       case (ISDN_CMD_ACCEPTB):
+               chanp = csta->channel + ic->arg;
+               if (chanp->debug & 1)
+                       link_debug(chanp, 1, "ACCEPTB");
+               FsmEvent(&chanp->fi, EV_ACCEPTB, NULL);
+               break;
+       case (ISDN_CMD_ACCEPTD):
+               chanp = csta->channel + ic->arg;
+               memcpy(&chanp->setup, &ic->parm.setup, sizeof(setup_parm));
+               if (chanp->debug & 1)
+                       link_debug(chanp, 1, "ACCEPTD");
+               FsmEvent(&chanp->fi, EV_ACCEPTD, NULL);
+               break;
+       case (ISDN_CMD_HANGUP):
+               chanp = csta->channel + ic->arg;
+               if (chanp->debug & 1)
+                       link_debug(chanp, 1, "HANGUP");
+               FsmEvent(&chanp->fi, EV_HANGUP, NULL);
+               break;
+       case (CAPI_PUT_MESSAGE):
+               chanp = csta->channel + ic->arg;
+               if (chanp->debug & 1)
+                       capi_debug(chanp, &ic->parm.cmsg);
+               if (ic->parm.cmsg.Length < 8)
                        break;
-               case (ISDN_CMD_SETL2):
-                       chanp = csta->channel + (ic->arg & 0xff);
-                       if (chanp->debug & 1)
-                               link_debug(chanp, 1, "SETL2 card %d %ld",
-                                       csta->cardnr + 1, ic->arg >> 8);
-                       chanp->l2_protocol = ic->arg >> 8;
+               switch (ic->parm.cmsg.Command) {
+               case CAPI_FACILITY:
+                       if (ic->parm.cmsg.Subcommand == CAPI_REQ)
+                               lli_got_fac_req(chanp, &ic->parm.cmsg);
                        break;
-               case (ISDN_CMD_SETL3):
-                       chanp = csta->channel + (ic->arg & 0xff);
-                       if (chanp->debug & 1)
-                               link_debug(chanp, 1, "SETL3 card %d %ld",
-                                       csta->cardnr + 1, ic->arg >> 8);
-                       chanp->l3_protocol = ic->arg >> 8;
+               case CAPI_MANUFACTURER:
+                       if (ic->parm.cmsg.Subcommand == CAPI_REQ)
+                               lli_got_manufacturer(chanp, csta, &ic->parm.cmsg);
                        break;
-               case (ISDN_CMD_DIAL):
-                       chanp = csta->channel + (ic->arg & 0xff);
-                       if (chanp->debug & 1)
-                               link_debug(chanp, 1, "DIAL %s -> %s (%d,%d)",
-                                       ic->parm.setup.eazmsn, ic->parm.setup.phone,
-                                       ic->parm.setup.si1, ic->parm.setup.si2);
-                       memcpy(&chanp->setup, &ic->parm.setup, sizeof(setup_parm));
-                       if (!strcmp(chanp->setup.eazmsn, "0"))
-                               chanp->setup.eazmsn[0] = '\0';
-                       /* this solution is dirty and may be change, if
-                        * we make a callreference based callmanager */
-                       if (chanp->fi.state == ST_NULL) {
-                               FsmEvent(&chanp->fi, EV_DIAL, NULL);
-                       } else {
-                               FsmDelTimer(&chanp->dial_timer, 70);
-                               FsmAddTimer(&chanp->dial_timer, 50, EV_DIAL, NULL, 71);
-                       }
+               default:
                        break;
-               case (ISDN_CMD_ACCEPTB):
-                       chanp = csta->channel + ic->arg;
-                       if (chanp->debug & 1)
-                               link_debug(chanp, 1, "ACCEPTB");
-                       FsmEvent(&chanp->fi, EV_ACCEPTB, NULL);
+               }
+               break;
+       case (ISDN_CMD_IOCTL):
+               switch (ic->arg) {
+               case (0):
+                       num = *(unsigned int *) ic->parm.num;
+                       HiSax_reportcard(csta->cardnr, num);
                        break;
-               case (ISDN_CMD_ACCEPTD):
-                       chanp = csta->channel + ic->arg;
-                       memcpy(&chanp->setup, &ic->parm.setup, sizeof(setup_parm));
-                       if (chanp->debug & 1)
-                               link_debug(chanp, 1, "ACCEPTD");
-                       FsmEvent(&chanp->fi, EV_ACCEPTD, NULL);
+               case (1):
+                       num = *(unsigned int *) ic->parm.num;
+                       distr_debug(csta, num);
+                       printk(KERN_DEBUG "HiSax: debugging flags card %d set to %x\n",
+                              csta->cardnr + 1, num);
+                       HiSax_putstatus(csta, "debugging flags ",
+                                       "card %d set to %x", csta->cardnr + 1, num);
                        break;
-               case (ISDN_CMD_HANGUP):
-                       chanp = csta->channel + ic->arg;
-                       if (chanp->debug & 1)
-                               link_debug(chanp, 1, "HANGUP");
-                       FsmEvent(&chanp->fi, EV_HANGUP, NULL);
+               case (2):
+                       num = *(unsigned int *) ic->parm.num;
+                       csta->channel[0].b_st->l1.delay = num;
+                       csta->channel[1].b_st->l1.delay = num;
+                       HiSax_putstatus(csta, "delay ", "card %d set to %d ms",
+                                       csta->cardnr + 1, num);
+                       printk(KERN_DEBUG "HiSax: delay card %d set to %d ms\n",
+                              csta->cardnr + 1, num);
                        break;
-               case (CAPI_PUT_MESSAGE):
-                       chanp = csta->channel + ic->arg;
-                       if (chanp->debug & 1)
-                               capi_debug(chanp, &ic->parm.cmsg);
-                       if (ic->parm.cmsg.Length < 8)
-                               break;
-                       switch(ic->parm.cmsg.Command) {
-                               case CAPI_FACILITY:
-                                       if (ic->parm.cmsg.Subcommand == CAPI_REQ)
-                                               lli_got_fac_req(chanp, &ic->parm.cmsg);
-                                       break;
-                               case CAPI_MANUFACTURER:
-                                       if (ic->parm.cmsg.Subcommand == CAPI_REQ)
-                                               lli_got_manufacturer(chanp, csta, &ic->parm.cmsg);
-                                       break;
-                               default:
-                                       break;
+               case (5):       /* set card in leased mode */
+                       num = *(unsigned int *) ic->parm.num;
+                       if ((num < 1) || (num > 2)) {
+                               HiSax_putstatus(csta, "Set LEASED ",
+                                               "wrong channel %d", num);
+                               printk(KERN_WARNING "HiSax: Set LEASED wrong channel %d\n",
+                                      num);
+                       } else {
+                               num--;
+                               chanp = csta->channel + num;
+                               chanp->leased = 1;
+                               HiSax_putstatus(csta, "Card",
+                                               "%d channel %d set leased mode\n",
+                                               csta->cardnr + 1, num + 1);
+                               chanp->d_st->l1.l1l2 = leased_l1l2;
+                               chanp->d_st->lli.l4l3 = leased_l4l3;
+                               chanp->d_st->lli.l4l3(chanp->d_st,
+                                                     DL_ESTABLISH | REQUEST, NULL);
                        }
                        break;
-               case (ISDN_CMD_IOCTL):
-                       switch (ic->arg) {
-                               case (0):
-                                       num = *(unsigned int *) ic->parm.num;
-                                       HiSax_reportcard(csta->cardnr, num);
-                                       break;
-                               case (1):
-                                       num = *(unsigned int *) ic->parm.num;
-                                       distr_debug(csta, num);
-                                       printk(KERN_DEBUG "HiSax: debugging flags card %d set to %x\n",
-                                               csta->cardnr + 1, num);
-                                       HiSax_putstatus(csta, "debugging flags ",
-                                               "card %d set to %x", csta->cardnr + 1, num);
-                                       break;
-                               case (2):
-                                       num = *(unsigned int *) ic->parm.num;
-                                       csta->channel[0].b_st->l1.delay = num;
-                                       csta->channel[1].b_st->l1.delay = num;
-                                       HiSax_putstatus(csta, "delay ", "card %d set to %d ms",
-                                               csta->cardnr + 1, num);
-                                       printk(KERN_DEBUG "HiSax: delay card %d set to %d ms\n",
-                                               csta->cardnr + 1, num);
-                                       break;
-                               case (5):       /* set card in leased mode */
-                                       num = *(unsigned int *) ic->parm.num;
-                                       if ((num <1) || (num > 2)) {
-                                               HiSax_putstatus(csta, "Set LEASED ",
-                                                       "wrong channel %d", num);
-                                               printk(KERN_WARNING "HiSax: Set LEASED wrong channel %d\n",
-                                                       num);
-                                       } else {
-                                               num--;
-                                               chanp = csta->channel +num;
-                                               chanp->leased = 1;
-                                               HiSax_putstatus(csta, "Card",
-                                                       "%d channel %d set leased mode\n",
-                                                       csta->cardnr + 1, num + 1);
-                                               chanp->d_st->l1.l1l2 = leased_l1l2;
-                                               chanp->d_st->lli.l4l3 = leased_l4l3;
-                                               chanp->d_st->lli.l4l3(chanp->d_st,
-                                                       DL_ESTABLISH | REQUEST, NULL);
-                                       }
-                                       break;
-                               case (6):       /* set B-channel test loop */
-                                       num = *(unsigned int *) ic->parm.num;
-                                       if (csta->stlist)
-                                               csta->stlist->l2.l2l1(csta->stlist,
-                                                       PH_TESTLOOP | REQUEST, (void *) (long)num);
-                                       break;
-                               case (7):       /* set card in PTP mode */
-                                       num = *(unsigned int *) ic->parm.num;
-                                       if (test_bit(FLG_TWO_DCHAN, &csta->HW_Flags)) {
-                                               printk(KERN_ERR "HiSax PTP mode only with one TEI possible\n");
-                                       } else if (num) {
-                                               test_and_set_bit(FLG_PTP, &csta->channel[0].d_st->l2.flag);
-                                               test_and_set_bit(FLG_FIXED_TEI, &csta->channel[0].d_st->l2.flag);
-                                               csta->channel[0].d_st->l2.tei = 0;
-                                               HiSax_putstatus(csta, "set card ", "in PTP mode");
-                                               printk(KERN_DEBUG "HiSax: set card in PTP mode\n");
-                                               printk(KERN_INFO "LAYER2 WATCHING ESTABLISH\n");
-                                               csta->channel[0].d_st->lli.l4l3(csta->channel[0].d_st,
-                                                       DL_ESTABLISH | REQUEST, NULL);
-                                       } else {
-                                               test_and_clear_bit(FLG_PTP, &csta->channel[0].d_st->l2.flag);
-                                               test_and_clear_bit(FLG_FIXED_TEI, &csta->channel[0].d_st->l2.flag);
-                                               HiSax_putstatus(csta, "set card ", "in PTMP mode");
-                                               printk(KERN_DEBUG "HiSax: set card in PTMP mode\n");
-                                       }
-                                       break;
-                               case (8):       /* set card in FIXED TEI mode */
-                                       num = *(unsigned int *) ic->parm.num;
-                                       chanp = csta->channel + (num & 1);
-                                       num = num >>1;
-                                       if (num == 127) {
-                                               test_and_clear_bit(FLG_FIXED_TEI, &chanp->d_st->l2.flag);
-                                               chanp->d_st->l2.tei = -1;
-                                               HiSax_putstatus(csta, "set card ", "in VAR TEI mode");
-                                               printk(KERN_DEBUG "HiSax: set card in VAR TEI mode\n");
-                                       } else {
-                                               test_and_set_bit(FLG_FIXED_TEI, &chanp->d_st->l2.flag);
-                                               chanp->d_st->l2.tei = num;
-                                               HiSax_putstatus(csta, "set card ", "in FIXED TEI (%d) mode", num);
-                                               printk(KERN_DEBUG "HiSax: set card in FIXED TEI (%d) mode\n",
-                                                       num);
-                                       }
-                                       chanp->d_st->lli.l4l3(chanp->d_st,
-                                               DL_ESTABLISH | REQUEST, NULL);
-                                       break;
-                               case (11):
-                                       num = csta->debug & DEB_DLOG_HEX;
-                                       csta->debug = *(unsigned int *) ic->parm.num;
-                                       csta->debug |= num;
-                                       HiSax_putstatus(cards[0].cs, "l1 debugging ",
-                                               "flags card %d set to %x",
-                                               csta->cardnr + 1, csta->debug);
-                                       printk(KERN_DEBUG "HiSax: l1 debugging flags card %d set to %x\n",
-                                               csta->cardnr + 1, csta->debug);
-                                       break;
-                               case (13):
-                                       csta->channel[0].d_st->l3.debug = *(unsigned int *) ic->parm.num;
-                                       csta->channel[1].d_st->l3.debug = *(unsigned int *) ic->parm.num;
-                                       HiSax_putstatus(cards[0].cs, "l3 debugging ",
-                                               "flags card %d set to %x\n", csta->cardnr + 1,
-                                               *(unsigned int *) ic->parm.num);
-                                       printk(KERN_DEBUG "HiSax: l3 debugging flags card %d set to %x\n",
-                                               csta->cardnr + 1, *(unsigned int *) ic->parm.num);
-                                       break;
-                               case (10):
-                                       i = *(unsigned int *) ic->parm.num;
-                                       return(set_channel_limit(csta, i));
-                               default:
-                                       if (csta->auxcmd)
-                                               return(csta->auxcmd(csta, ic));
-                                       printk(KERN_DEBUG "HiSax: invalid ioclt %d\n",
-                                               (int) ic->arg);
-                                       return (-EINVAL);
-                       }
+               case (6):       /* set B-channel test loop */
+                       num = *(unsigned int *) ic->parm.num;
+                       if (csta->stlist)
+                               csta->stlist->l2.l2l1(csta->stlist,
+                                                     PH_TESTLOOP | REQUEST, (void *) (long)num);
                        break;
-               
-               case (ISDN_CMD_PROCEED):
-                       chanp = csta->channel + ic->arg;
-                       if (chanp->debug & 1)
-                               link_debug(chanp, 1, "PROCEED");
-                       FsmEvent(&chanp->fi, EV_PROCEED, NULL);
+               case (7):       /* set card in PTP mode */
+                       num = *(unsigned int *) ic->parm.num;
+                       if (test_bit(FLG_TWO_DCHAN, &csta->HW_Flags)) {
+                               printk(KERN_ERR "HiSax PTP mode only with one TEI possible\n");
+                       } else if (num) {
+                               test_and_set_bit(FLG_PTP, &csta->channel[0].d_st->l2.flag);
+                               test_and_set_bit(FLG_FIXED_TEI, &csta->channel[0].d_st->l2.flag);
+                               csta->channel[0].d_st->l2.tei = 0;
+                               HiSax_putstatus(csta, "set card ", "in PTP mode");
+                               printk(KERN_DEBUG "HiSax: set card in PTP mode\n");
+                               printk(KERN_INFO "LAYER2 WATCHING ESTABLISH\n");
+                               csta->channel[0].d_st->lli.l4l3(csta->channel[0].d_st,
+                                                               DL_ESTABLISH | REQUEST, NULL);
+                       } else {
+                               test_and_clear_bit(FLG_PTP, &csta->channel[0].d_st->l2.flag);
+                               test_and_clear_bit(FLG_FIXED_TEI, &csta->channel[0].d_st->l2.flag);
+                               HiSax_putstatus(csta, "set card ", "in PTMP mode");
+                               printk(KERN_DEBUG "HiSax: set card in PTMP mode\n");
+                       }
                        break;
-
-               case (ISDN_CMD_ALERT):
-                       chanp = csta->channel + ic->arg;
-                       if (chanp->debug & 1)
-                               link_debug(chanp, 1, "ALERT");
-                       FsmEvent(&chanp->fi, EV_ALERT, NULL);
+               case (8):       /* set card in FIXED TEI mode */
+                       num = *(unsigned int *)ic->parm.num;
+                       chanp = csta->channel + (num & 1);
+                       num = num >> 1;
+                       if (num == 127) {
+                               test_and_clear_bit(FLG_FIXED_TEI, &chanp->d_st->l2.flag);
+                               chanp->d_st->l2.tei = -1;
+                               HiSax_putstatus(csta, "set card ", "in VAR TEI mode");
+                               printk(KERN_DEBUG "HiSax: set card in VAR TEI mode\n");
+                       } else {
+                               test_and_set_bit(FLG_FIXED_TEI, &chanp->d_st->l2.flag);
+                               chanp->d_st->l2.tei = num;
+                               HiSax_putstatus(csta, "set card ", "in FIXED TEI (%d) mode", num);
+                               printk(KERN_DEBUG "HiSax: set card in FIXED TEI (%d) mode\n",
+                                      num);
+                       }
+                       chanp->d_st->lli.l4l3(chanp->d_st,
+                                             DL_ESTABLISH | REQUEST, NULL);
                        break;
-
-               case (ISDN_CMD_REDIR):
-                       chanp = csta->channel + ic->arg;
-                       if (chanp->debug & 1)
-                               link_debug(chanp, 1, "REDIR");
-                       memcpy(&chanp->setup, &ic->parm.setup, sizeof(setup_parm));
-                       FsmEvent(&chanp->fi, EV_REDIR, NULL);
+               case (11):
+                       num = csta->debug & DEB_DLOG_HEX;
+                       csta->debug = *(unsigned int *) ic->parm.num;
+                       csta->debug |= num;
+                       HiSax_putstatus(cards[0].cs, "l1 debugging ",
+                                       "flags card %d set to %x",
+                                       csta->cardnr + 1, csta->debug);
+                       printk(KERN_DEBUG "HiSax: l1 debugging flags card %d set to %x\n",
+                              csta->cardnr + 1, csta->debug);
                        break;
-
-               /* protocol specific io commands */
-               case (ISDN_CMD_PROT_IO):
-                       for (st = csta->stlist; st; st = st->next)
-                               if (st->protocol == (ic->arg & 0xFF))
-                                       return(st->lli.l4l3_proto(st, ic));
-                       return(-EINVAL);
+               case (13):
+                       csta->channel[0].d_st->l3.debug = *(unsigned int *) ic->parm.num;
+                       csta->channel[1].d_st->l3.debug = *(unsigned int *) ic->parm.num;
+                       HiSax_putstatus(cards[0].cs, "l3 debugging ",
+                                       "flags card %d set to %x\n", csta->cardnr + 1,
+                                       *(unsigned int *) ic->parm.num);
+                       printk(KERN_DEBUG "HiSax: l3 debugging flags card %d set to %x\n",
+                              csta->cardnr + 1, *(unsigned int *) ic->parm.num);
                        break;
+               case (10):
+                       i = *(unsigned int *) ic->parm.num;
+                       return (set_channel_limit(csta, i));
                default:
                        if (csta->auxcmd)
-                               return(csta->auxcmd(csta, ic));
-                       return(-EINVAL);
+                               return (csta->auxcmd(csta, ic));
+                       printk(KERN_DEBUG "HiSax: invalid ioctl %d\n",
+                              (int) ic->arg);
+                       return (-EINVAL);
+               }
+               break;
+
+       case (ISDN_CMD_PROCEED):
+               chanp = csta->channel + ic->arg;
+               if (chanp->debug & 1)
+                       link_debug(chanp, 1, "PROCEED");
+               FsmEvent(&chanp->fi, EV_PROCEED, NULL);
+               break;
+
+       case (ISDN_CMD_ALERT):
+               chanp = csta->channel + ic->arg;
+               if (chanp->debug & 1)
+                       link_debug(chanp, 1, "ALERT");
+               FsmEvent(&chanp->fi, EV_ALERT, NULL);
+               break;
+
+       case (ISDN_CMD_REDIR):
+               chanp = csta->channel + ic->arg;
+               if (chanp->debug & 1)
+                       link_debug(chanp, 1, "REDIR");
+               memcpy(&chanp->setup, &ic->parm.setup, sizeof(setup_parm));
+               FsmEvent(&chanp->fi, EV_REDIR, NULL);
+               break;
+
+               /* protocol specific io commands */
+       case (ISDN_CMD_PROT_IO):
+               for (st = csta->stlist; st; st = st->next)
+                       if (st->protocol == (ic->arg & 0xFF))
+                               return (st->lli.l4l3_proto(st, ic));
+               return (-EINVAL);
+               break;
+       default:
+               if (csta->auxcmd)
+                       return (csta->auxcmd(csta, ic));
+               return (-EINVAL);
        }
        return (0);
 }
@@ -1747,7 +1747,7 @@ HiSax_writebuf_skb(int id, int chan, int ack, struct sk_buff *skb)
 
        if (!csta) {
                printk(KERN_ERR
-                       "HiSax: if_sendbuf called with invalid driverId!\n");
+                      "HiSax: if_sendbuf called with invalid driverId!\n");
                return -ENODEV;
        }
        chanp = csta->channel + chan;
@@ -1759,7 +1759,7 @@ HiSax_writebuf_skb(int id, int chan, int ack, struct sk_buff *skb)
        if (len > MAX_DATA_SIZE) {
                link_debug(chanp, 1, "writebuf: packet too large (%d bytes)", len);
                printk(KERN_WARNING "HiSax_writebuf: packet too large (%d bytes) !\n",
-                       len);
+                      len);
                return -EINVAL;
        }
        if (len) {
@@ -1771,7 +1771,7 @@ HiSax_writebuf_skb(int id, int chan, int ack, struct sk_buff *skb)
                                link_debug(chanp, 1, "writebuf: no buffers for %d bytes", len);
                        return 0;
                } else if (chanp->debug & 0x800)
-                       link_debug(chanp, 1, "writebuf %d/%d/%d", len, chanp->bcs->tx_cnt,MAX_DATA_MEM);
+                       link_debug(chanp, 1, "writebuf %d/%d/%d", len, chanp->bcs->tx_cnt, MAX_DATA_MEM);
                nskb = skb_clone(skb, GFP_ATOMIC);
                if (nskb) {
                        nskb->truesize = nskb->len;
index c110f86..b5edc0e 100644 (file)
@@ -3,7 +3,7 @@
  * Author       Karsten Keil
  * Copyright    by Karsten Keil      <keil@isdn4linux.de>
  *              by Kai Germaschewski <kai.germaschewski@gmx.de>
- * 
+ *
  * This software may be used and distributed according to the terms
  * of the GNU General Public License, incorporated herein by reference.
  *
@@ -61,8 +61,8 @@
  *   24 Dr Neuhaus Niccy PnP/PCI card p0=irq p1=IO0 p2=IO1 (PnP only)
  *   25 Teles S0Box             p0=irq p1=iobase (from isapnp setup)
  *   26 AVM A1 PCMCIA (Fritz)   p0=irq p1=iobase
- *   27 AVM PnP/PCI            p0=irq p1=iobase (PCI no parameter)
- *   28 Sedlbauer Speed Fax+   p0=irq p1=iobase (from isapnp setup)
+ *   27 AVM PnP/PCI            p0=irq p1=iobase (PCI no parameter)
+ *   28 Sedlbauer Speed Fax+   p0=irq p1=iobase (from isapnp setup)
  *   29 Siemens I-Surf          p0=irq p1=iobase p2=memory (from isapnp setup)
  *   30 ACER P10                p0=irq p1=iobase (from isapnp setup)
  *   31 HST Saphir              p0=irq  p1=iobase
@@ -88,200 +88,200 @@ const char *CardType[] = {
        "Teles PCMCIA", "ITK ix1-micro Rev.2", "Elsa PCMCIA",
        "Eicon.Diehl Diva", "ISDNLink", "TeleInt", "Teles 16.3c",
        "Sedlbauer Speed Card", "USR Sportster", "ith mic Linux",
-       "Elsa PCI", "Compaq ISA", "NETjet-S", "Teles PCI", 
+       "Elsa PCI", "Compaq ISA", "NETjet-S", "Teles PCI",
        "Sedlbauer Speed Star (PCMCIA)", "AMD 7930", "NICCY", "S0Box",
        "AVM A1 (PCMCIA)", "AVM Fritz PnP/PCI", "Sedlbauer Speed Fax +",
        "Siemens I-Surf", "Acer P10", "HST Saphir", "Telekom A4T",
        "Scitel Quadro", "Gazel", "HFC 2BDS0 PCI", "Winbond 6692",
        "HFC 2BDS0 SX", "NETspider-U", "HFC-2BDS0-SP PCMCIA",
-       "Hotplug", "Formula-n enter:now PCI a/b", 
+       "Hotplug", "Formula-n enter:now PCI a/b",
 };
 
 #ifdef CONFIG_HISAX_ELSA
 #define DEFAULT_CARD ISDN_CTYPE_ELSA
-#define DEFAULT_CFG {0,0,0,0}
+#define DEFAULT_CFG {0, 0, 0, 0}
 #endif
 
 #ifdef CONFIG_HISAX_AVM_A1
 #undef DEFAULT_CARD
 #undef DEFAULT_CFG
 #define DEFAULT_CARD ISDN_CTYPE_A1
-#define DEFAULT_CFG {10,0x340,0,0}
+#define DEFAULT_CFG {10, 0x340, 0, 0}
 #endif
 
 #ifdef CONFIG_HISAX_AVM_A1_PCMCIA
 #undef DEFAULT_CARD
 #undef DEFAULT_CFG
 #define DEFAULT_CARD ISDN_CTYPE_A1_PCMCIA
-#define DEFAULT_CFG {11,0x170,0,0}
+#define DEFAULT_CFG {11, 0x170, 0, 0}
 #endif
 
 #ifdef CONFIG_HISAX_FRITZPCI
 #undef DEFAULT_CARD
 #undef DEFAULT_CFG
 #define DEFAULT_CARD ISDN_CTYPE_FRITZPCI
-#define DEFAULT_CFG {0,0,0,0}
+#define DEFAULT_CFG {0, 0, 0, 0}
 #endif
 
 #ifdef CONFIG_HISAX_16_3
 #undef DEFAULT_CARD
 #undef DEFAULT_CFG
 #define DEFAULT_CARD ISDN_CTYPE_16_3
-#define DEFAULT_CFG {15,0x180,0,0}
+#define DEFAULT_CFG {15, 0x180, 0, 0}
 #endif
 
 #ifdef CONFIG_HISAX_S0BOX
 #undef DEFAULT_CARD
 #undef DEFAULT_CFG
 #define DEFAULT_CARD ISDN_CTYPE_S0BOX
-#define DEFAULT_CFG {7,0x378,0,0}
+#define DEFAULT_CFG {7, 0x378, 0, 0}
 #endif
 
 #ifdef CONFIG_HISAX_16_0
 #undef DEFAULT_CARD
 #undef DEFAULT_CFG
 #define DEFAULT_CARD ISDN_CTYPE_16_0
-#define DEFAULT_CFG {15,0xd0000,0xd80,0}
+#define DEFAULT_CFG {15, 0xd0000, 0xd80, 0}
 #endif
 
 #ifdef CONFIG_HISAX_TELESPCI
 #undef DEFAULT_CARD
 #undef DEFAULT_CFG
 #define DEFAULT_CARD ISDN_CTYPE_TELESPCI
-#define DEFAULT_CFG {0,0,0,0}
+#define DEFAULT_CFG {0, 0, 0, 0}
 #endif
 
 #ifdef CONFIG_HISAX_IX1MICROR2
 #undef DEFAULT_CARD
 #undef DEFAULT_CFG
 #define DEFAULT_CARD ISDN_CTYPE_IX1MICROR2
-#define DEFAULT_CFG {5,0x390,0,0}
+#define DEFAULT_CFG {5, 0x390, 0, 0}
 #endif
 
 #ifdef CONFIG_HISAX_DIEHLDIVA
 #undef DEFAULT_CARD
 #undef DEFAULT_CFG
 #define DEFAULT_CARD ISDN_CTYPE_DIEHLDIVA
-#define DEFAULT_CFG {0,0x0,0,0}
+#define DEFAULT_CFG {0, 0x0, 0, 0}
 #endif
 
 #ifdef CONFIG_HISAX_ASUSCOM
 #undef DEFAULT_CARD
 #undef DEFAULT_CFG
 #define DEFAULT_CARD ISDN_CTYPE_ASUSCOM
-#define DEFAULT_CFG {5,0x200,0,0}
+#define DEFAULT_CFG {5, 0x200, 0, 0}
 #endif
 
 #ifdef CONFIG_HISAX_TELEINT
 #undef DEFAULT_CARD
 #undef DEFAULT_CFG
 #define DEFAULT_CARD ISDN_CTYPE_TELEINT
-#define DEFAULT_CFG {5,0x300,0,0}
+#define DEFAULT_CFG {5, 0x300, 0, 0}
 #endif
 
 #ifdef CONFIG_HISAX_SEDLBAUER
 #undef DEFAULT_CARD
 #undef DEFAULT_CFG
 #define DEFAULT_CARD ISDN_CTYPE_SEDLBAUER
-#define DEFAULT_CFG {11,0x270,0,0}
+#define DEFAULT_CFG {11, 0x270, 0, 0}
 #endif
 
 #ifdef CONFIG_HISAX_SPORTSTER
 #undef DEFAULT_CARD
 #undef DEFAULT_CFG
 #define DEFAULT_CARD ISDN_CTYPE_SPORTSTER
-#define DEFAULT_CFG {7,0x268,0,0}
+#define DEFAULT_CFG {7, 0x268, 0, 0}
 #endif
 
 #ifdef CONFIG_HISAX_MIC
 #undef DEFAULT_CARD
 #undef DEFAULT_CFG
 #define DEFAULT_CARD ISDN_CTYPE_MIC
-#define DEFAULT_CFG {12,0x3e0,0,0}
+#define DEFAULT_CFG {12, 0x3e0, 0, 0}
 #endif
 
 #ifdef CONFIG_HISAX_NETJET
 #undef DEFAULT_CARD
 #undef DEFAULT_CFG
 #define DEFAULT_CARD ISDN_CTYPE_NETJET_S
-#define DEFAULT_CFG {0,0,0,0}
+#define DEFAULT_CFG {0, 0, 0, 0}
 #endif
 
 #ifdef CONFIG_HISAX_HFCS
 #undef DEFAULT_CARD
 #undef DEFAULT_CFG
 #define DEFAULT_CARD ISDN_CTYPE_TELES3C
-#define DEFAULT_CFG {5,0x500,0,0}
+#define DEFAULT_CFG {5, 0x500, 0, 0}
 #endif
 
 #ifdef CONFIG_HISAX_HFC_PCI
 #undef DEFAULT_CARD
 #undef DEFAULT_CFG
 #define DEFAULT_CARD ISDN_CTYPE_HFC_PCI
-#define DEFAULT_CFG {0,0,0,0}
+#define DEFAULT_CFG {0, 0, 0, 0}
 #endif
 
 #ifdef CONFIG_HISAX_HFC_SX
 #undef DEFAULT_CARD
 #undef DEFAULT_CFG
 #define DEFAULT_CARD ISDN_CTYPE_HFC_SX
-#define DEFAULT_CFG {5,0x2E0,0,0}
+#define DEFAULT_CFG {5, 0x2E0, 0, 0}
 #endif
 
 #ifdef CONFIG_HISAX_NICCY
 #undef DEFAULT_CARD
 #undef DEFAULT_CFG
 #define DEFAULT_CARD ISDN_CTYPE_NICCY
-#define DEFAULT_CFG {0,0x0,0,0}
+#define DEFAULT_CFG {0, 0x0, 0, 0}
 #endif
 
 #ifdef CONFIG_HISAX_ISURF
 #undef DEFAULT_CARD
 #undef DEFAULT_CFG
 #define DEFAULT_CARD ISDN_CTYPE_ISURF
-#define DEFAULT_CFG {5,0x100,0xc8000,0}
+#define DEFAULT_CFG {5, 0x100, 0xc8000, 0}
 #endif
 
 #ifdef CONFIG_HISAX_HSTSAPHIR
 #undef DEFAULT_CARD
 #undef DEFAULT_CFG
 #define DEFAULT_CARD ISDN_CTYPE_HSTSAPHIR
-#define DEFAULT_CFG {5,0x250,0,0}
+#define DEFAULT_CFG {5, 0x250, 0, 0}
 #endif
 
 #ifdef CONFIG_HISAX_BKM_A4T
 #undef DEFAULT_CARD
 #undef DEFAULT_CFG
 #define DEFAULT_CARD ISDN_CTYPE_BKM_A4T
-#define DEFAULT_CFG {0,0x0,0,0}
+#define DEFAULT_CFG {0, 0x0, 0, 0}
 #endif
 
 #ifdef CONFIG_HISAX_SCT_QUADRO
 #undef DEFAULT_CARD
 #undef DEFAULT_CFG
 #define DEFAULT_CARD ISDN_CTYPE_SCT_QUADRO
-#define DEFAULT_CFG {1,0x0,0,0}
+#define DEFAULT_CFG {1, 0x0, 0, 0}
 #endif
 
 #ifdef CONFIG_HISAX_GAZEL
 #undef DEFAULT_CARD
 #undef DEFAULT_CFG
 #define DEFAULT_CARD ISDN_CTYPE_GAZEL
-#define DEFAULT_CFG {15,0x180,0,0}
+#define DEFAULT_CFG {15, 0x180, 0, 0}
 #endif
 
 #ifdef CONFIG_HISAX_W6692
 #undef DEFAULT_CARD
 #undef DEFAULT_CFG
 #define DEFAULT_CARD ISDN_CTYPE_W6692
-#define DEFAULT_CFG {0,0,0,0}
+#define DEFAULT_CFG {0, 0, 0, 0}
 #endif
 
 #ifdef CONFIG_HISAX_NETJET_U
 #undef DEFAULT_CARD
 #undef DEFAULT_CFG
 #define DEFAULT_CARD ISDN_CTYPE_NETJET_U
-#define DEFAULT_CFG {0,0,0,0}
+#define DEFAULT_CFG {0, 0, 0, 0}
 #endif
 
 #ifdef CONFIG_HISAX_1TR6
@@ -306,21 +306,21 @@ const char *CardType[] = {
 #endif
 #ifndef DEFAULT_CARD
 #define DEFAULT_CARD 0
-#define DEFAULT_CFG {0,0,0,0}
+#define DEFAULT_CFG {0, 0, 0, 0}
 #endif
 
-#define FIRST_CARD { \
-       DEFAULT_CARD, \
-       DEFAULT_PROTO, \
-       DEFAULT_CFG, \
-       NULL, \
-}
+#define FIRST_CARD {                           \
+               DEFAULT_CARD,                   \
+                       DEFAULT_PROTO,          \
+                       DEFAULT_CFG,            \
+                       NULL,                   \
+                       }
 
 struct IsdnCard cards[HISAX_MAX_CARDS] = {
        FIRST_CARD,
 };
 
-#define HISAX_IDSIZE (HISAX_MAX_CARDS*8)
+#define HISAX_IDSIZE (HISAX_MAX_CARDS * 8)
 static char HiSaxID[HISAX_IDSIZE] = { 0, };
 
 static char *HiSax_id = HiSaxID;
@@ -400,7 +400,7 @@ static void __init HiSaxVersion(void)
 }
 
 #ifndef MODULE
-#define MAX_ARG        (HISAX_MAX_CARDS*5)
+#define MAX_ARG        (HISAX_MAX_CARDS * 5)
 static int __init HiSax_setup(char *line)
 {
        int i, j, argc;
@@ -441,7 +441,7 @@ static int __init HiSax_setup(char *line)
                }
                i++;
        }
-       if (str && *str) {
+       if (str && *str) {
                if (strlen(str) < HISAX_IDSIZE)
                        strcpy(HiSaxID, str);
                else
@@ -813,11 +813,11 @@ static irqreturn_t card_irq(int intno, void *dev_id)
 
 static int init_card(struct IsdnCardState *cs)
 {
-       int     irq_cnt, cnt = 3, ret;
+       int     irq_cnt, cnt = 3, ret;
 
        if (!cs->irq) {
                ret = cs->cardmsg(cs, CARD_INIT, NULL);
-               return(ret);
+               return (ret);
        }
        irq_cnt = cs->irq_cnt = 0;
        printk(KERN_INFO "%s: IRQ %d count %d\n", CardType[cs->typ],
@@ -1142,12 +1142,12 @@ static int hisax_cs_setup(int cardnr, struct IsdnCard *card,
        /* init_card only handles interrupts which are not */
        /* used here for the loadable driver */
        switch (card->typ) {
-               case ISDN_CTYPE_DYNAMIC:
-                       ret = 0;
-                       break;
-               default:
-                       ret = init_card(cs);
-                       break;
+       case ISDN_CTYPE_DYNAMIC:
+               ret = 0;
+               break;
+       default:
+               ret = init_card(cs);
+               break;
        }
        if (ret) {
                closecard(cardnr);
@@ -1203,10 +1203,10 @@ static int __ref checkcard(int cardnr, char *id, int *busy_flag,
        ret = hisax_cs_setup(cardnr, card, cs);
        goto out;
 
- outf_cs:
+outf_cs:
        kfree(cs);
        card->cs = NULL;
- out:
+out:
        return ret;
 }
 
@@ -1256,8 +1256,8 @@ static int __init HiSax_inithardware(int *busy_flag)
                        /* make sure we don't oops the module */
                        if (cards[i].typ > 0 && cards[i].typ <= ISDN_CTYPE_COUNT) {
                                printk(KERN_WARNING
-                                       "HiSax: Card %s not installed !\n",
-                                       CardType[cards[i].typ]);
+                                      "HiSax: Card %s not installed !\n",
+                                      CardType[cards[i].typ]);
                        }
                        HiSax_shiftcards(i);
                        nrcards--;
@@ -1521,15 +1521,15 @@ static int __init HiSax_init(void)
                return -ENODEV;
        return 0;
 
- out_tei:
+out_tei:
        TeiFree();
- out_isdnl2:
+out_isdnl2:
        Isdnl2Free();
- out_isdnl3:
+out_isdnl3:
        Isdnl3Free();
- out_callc:
+out_callc:
        CallcFree();
- out:
+out:
        return retval;
 }
 
@@ -1614,7 +1614,7 @@ int hisax_register(struct hisax_d_if *hisax_d_if, struct hisax_b_if *b_if[],
        sprintf(id, "%s%d", name, i);
        nrcards++;
        retval = checkcard(i, id, NULL, hisax_d_if->owner,
-                               hisax_setup_card_dynamic);
+                          hisax_setup_card_dynamic);
        if (retval == 0) { // yuck
                cards[i].typ = 0;
                nrcards--;
@@ -1637,7 +1637,7 @@ int hisax_register(struct hisax_d_if *hisax_d_if, struct hisax_b_if *b_if[],
        hisax_d_if->ifc.l1l2 = hisax_d_l1l2;
        skb_queue_head_init(&hisax_d_if->erq);
        clear_bit(0, &hisax_d_if->ph_state);
-       
+
        return 0;
 }
 
@@ -1674,7 +1674,7 @@ static void hisax_bh(struct work_struct *work)
                        pr = PH_DEACTIVATE | INDICATION;
                for (st = cs->stlist; st; st = st->next)
                        st->l1.l1l2(st, pr, NULL);
-               
+
        }
 }
 
@@ -1764,7 +1764,7 @@ static void hisax_b_l1l2(struct hisax_if *ifc, int pr, void *arg)
                break;
        case PH_DATA | CONFIRM:
                bcs->tx_cnt -= (long)arg;
-               if (test_bit(FLG_LLI_L1WAKEUP,&bcs->st->lli.flag)) {
+               if (test_bit(FLG_LLI_L1WAKEUP, &bcs->st->lli.flag)) {
                        u_long  flags;
                        spin_lock_irqsave(&bcs->aclock, flags);
                        bcs->ackcnt += (long)arg;
index 780da9b..62a2945 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Author       Karsten Keil
  * Copyright    by Karsten Keil      <keil@isdn4linux.de>
- * 
+ *
  * This software may be used and distributed according to the terms
  * of the GNU General Public License, incorporated herein by reference.
  *
@@ -27,7 +27,7 @@
 
 static const char *Diva_revision = "$Revision: 1.33.2.6 $";
 
-#define byteout(addr,val) outb(val,addr)
+#define byteout(addr, val) outb(val, addr)
 #define bytein(addr) inb(addr)
 
 #define DIVA_HSCX_DATA         0
@@ -89,7 +89,7 @@ readreg(unsigned int ale, unsigned int adr, u_char off)
 }
 
 static inline void
-readfifo(unsigned int ale, unsigned int adr, u_char off, u_char * data, int size)
+readfifo(unsigned int ale, unsigned int adr, u_char off, u_char *data, int size)
 {
        byteout(ale, off);
        insb(adr, data, size);
@@ -113,15 +113,15 @@ writefifo(unsigned int ale, unsigned int adr, u_char off, u_char *data, int size
 static inline u_char
 memreadreg(unsigned long adr, u_char off)
 {
-       return(*((unsigned char *)
-               (((unsigned int *)adr) + off)));
+       return (*((unsigned char *)
+                (((unsigned int *)adr) + off)));
 }
 
 static inline void
 memwritereg(unsigned long adr, u_char off, u_char data)
 {
        register u_char *p;
-       
+
        p = (unsigned char *)(((unsigned int *)adr) + off);
        *p = data;
 }
@@ -131,7 +131,7 @@ memwritereg(unsigned long adr, u_char off, u_char data)
 static u_char
 ReadISAC(struct IsdnCardState *cs, u_char offset)
 {
-       return(readreg(cs->hw.diva.isac_adr, cs->hw.diva.isac, offset));
+       return (readreg(cs->hw.diva.isac_adr, cs->hw.diva.isac, offset));
 }
 
 static void
@@ -155,23 +155,23 @@ WriteISACfifo(struct IsdnCardState *cs, u_char *data, int size)
 static u_char
 ReadISAC_IPAC(struct IsdnCardState *cs, u_char offset)
 {
-       return (readreg(cs->hw.diva.isac_adr, cs->hw.diva.isac, offset+0x80));
+       return (readreg(cs->hw.diva.isac_adr, cs->hw.diva.isac, offset + 0x80));
 }
 
 static void
 WriteISAC_IPAC(struct IsdnCardState *cs, u_char offset, u_char value)
 {
-       writereg(cs->hw.diva.isac_adr, cs->hw.diva.isac, offset|0x80, value);
+       writereg(cs->hw.diva.isac_adr, cs->hw.diva.isac, offset | 0x80, value);
 }
 
 static void
-ReadISACfifo_IPAC(struct IsdnCardState *cs, u_char * data, int size)
+ReadISACfifo_IPAC(struct IsdnCardState *cs, u_char *data, int size)
 {
        readfifo(cs->hw.diva.isac_adr, cs->hw.diva.isac, 0x80, data, size);
 }
 
 static void
-WriteISACfifo_IPAC(struct IsdnCardState *cs, u_char * data, int size)
+WriteISACfifo_IPAC(struct IsdnCardState *cs, u_char *data, int size)
 {
        writefifo(cs->hw.diva.isac_adr, cs->hw.diva.isac, 0x80, data, size);
 }
@@ -179,47 +179,47 @@ WriteISACfifo_IPAC(struct IsdnCardState *cs, u_char * data, int size)
 static u_char
 ReadHSCX(struct IsdnCardState *cs, int hscx, u_char offset)
 {
-       return(readreg(cs->hw.diva.hscx_adr,
-               cs->hw.diva.hscx, offset + (hscx ? 0x40 : 0)));
+       return (readreg(cs->hw.diva.hscx_adr,
+                      cs->hw.diva.hscx, offset + (hscx ? 0x40 : 0)));
 }
 
 static void
 WriteHSCX(struct IsdnCardState *cs, int hscx, u_char offset, u_char value)
 {
        writereg(cs->hw.diva.hscx_adr,
-               cs->hw.diva.hscx, offset + (hscx ? 0x40 : 0), value);
+                cs->hw.diva.hscx, offset + (hscx ? 0x40 : 0), value);
 }
 
 static u_char
 MemReadISAC_IPAC(struct IsdnCardState *cs, u_char offset)
 {
-       return (memreadreg(cs->hw.diva.cfg_reg, offset+0x80));
+       return (memreadreg(cs->hw.diva.cfg_reg, offset + 0x80));
 }
 
 static void
 MemWriteISAC_IPAC(struct IsdnCardState *cs, u_char offset, u_char value)
 {
-       memwritereg(cs->hw.diva.cfg_reg, offset|0x80, value);
+       memwritereg(cs->hw.diva.cfg_reg, offset | 0x80, value);
 }
 
 static void
-MemReadISACfifo_IPAC(struct IsdnCardState *cs, u_char * data, int size)
+MemReadISACfifo_IPAC(struct IsdnCardState *cs, u_char *data, int size)
 {
-       while(size--)
+       while (size--)
                *data++ = memreadreg(cs->hw.diva.cfg_reg, 0x80);
 }
 
 static void
-MemWriteISACfifo_IPAC(struct IsdnCardState *cs, u_char * data, int size)
+MemWriteISACfifo_IPAC(struct IsdnCardState *cs, u_char *data, int size)
 {
-       while(size--)
+       while (size--)
                memwritereg(cs->hw.diva.cfg_reg, 0x80, *data++);
 }
 
 static u_char
 MemReadHSCX(struct IsdnCardState *cs, int hscx, u_char offset)
 {
-       return(memreadreg(cs->hw.diva.cfg_reg, offset + (hscx ? 0x40 : 0)));
+       return (memreadreg(cs->hw.diva.cfg_reg, offset + (hscx ? 0x40 : 0)));
 }
 
 static void
@@ -242,47 +242,47 @@ MemWriteISAC_IPACX(struct IsdnCardState *cs, u_char offset, u_char value)
 }
 
 static void
-MemReadISACfifo_IPACX(struct IsdnCardState *cs, u_char * data, int size)
+MemReadISACfifo_IPACX(struct IsdnCardState *cs, u_char *data, int size)
 {
-       while(size--)
+       while (size--)
                *data++ = memreadreg(cs->hw.diva.cfg_reg, 0);
 }
 
 static void
-MemWriteISACfifo_IPACX(struct IsdnCardState *cs, u_char * data, int size)
+MemWriteISACfifo_IPACX(struct IsdnCardState *cs, u_char *data, int size)
 {
-       while(size--)
+       while (size--)
                memwritereg(cs->hw.diva.cfg_reg, 0, *data++);
 }
 
 static u_char
 MemReadHSCX_IPACX(struct IsdnCardState *cs, int hscx, u_char offset)
 {
-       return(memreadreg(cs->hw.diva.cfg_reg, offset + 
-                    (hscx ? IPACX_OFF_B2 : IPACX_OFF_B1)));
+       return (memreadreg(cs->hw.diva.cfg_reg, offset +
+                         (hscx ? IPACX_OFF_B2 : IPACX_OFF_B1)));
 }
 
 static void
 MemWriteHSCX_IPACX(struct IsdnCardState *cs, int hscx, u_char offset, u_char value)
 {
-       memwritereg(cs->hw.diva.cfg_reg, offset + 
-              (hscx ? IPACX_OFF_B2 : IPACX_OFF_B1), value);
+       memwritereg(cs->hw.diva.cfg_reg, offset +
+                   (hscx ? IPACX_OFF_B2 : IPACX_OFF_B1), value);
 }
 
 /*
  * fast interrupt HSCX stuff goes here
  */
 
-#define READHSCX(cs, nr, reg) readreg(cs->hw.diva.hscx_adr, \
-               cs->hw.diva.hscx, reg + (nr ? 0x40 : 0))
-#define WRITEHSCX(cs, nr, reg, data) writereg(cs->hw.diva.hscx_adr, \
-                cs->hw.diva.hscx, reg + (nr ? 0x40 : 0), data)
+#define READHSCX(cs, nr, reg) readreg(cs->hw.diva.hscx_adr,            \
+                                     cs->hw.diva.hscx, reg + (nr ? 0x40 : 0))
+#define WRITEHSCX(cs, nr, reg, data) writereg(cs->hw.diva.hscx_adr,    \
+                                             cs->hw.diva.hscx, reg + (nr ? 0x40 : 0), data)
 
-#define READHSCXFIFO(cs, nr, ptr, cnt) readfifo(cs->hw.diva.hscx_adr, \
-               cs->hw.diva.hscx, (nr ? 0x40 : 0), ptr, cnt)
+#define READHSCXFIFO(cs, nr, ptr, cnt) readfifo(cs->hw.diva.hscx_adr,  \
+                                               cs->hw.diva.hscx, (nr ? 0x40 : 0), ptr, cnt)
 
 #define WRITEHSCXFIFO(cs, nr, ptr, cnt) writefifo(cs->hw.diva.hscx_adr, \
-               cs->hw.diva.hscx, (nr ? 0x40 : 0), ptr, cnt)
+                                                 cs->hw.diva.hscx, (nr ? 0x40 : 0), ptr, cnt)
 
 #include "hscx_irq.c"
 
@@ -292,7 +292,7 @@ diva_interrupt(int intno, void *dev_id)
        struct IsdnCardState *cs = dev_id;
        u_char val, sval;
        u_long flags;
-       int cnt=5;
+       int cnt = 5;
 
        spin_lock_irqsave(&cs->lock, flags);
        while (((sval = bytein(cs->hw.diva.ctrl)) & DIVA_IRQ_REQ) && cnt) {
@@ -320,9 +320,9 @@ static irqreturn_t
 diva_irq_ipac_isa(int intno, void *dev_id)
 {
        struct IsdnCardState *cs = dev_id;
-       u_char ista,val;
+       u_char ista, val;
        u_long flags;
-       int icnt=5;
+       int icnt = 5;
 
        spin_lock_irqsave(&cs->lock, flags);
        ista = readreg(cs->hw.diva.isac_adr, cs->hw.diva.isac, IPAC_ISTA);
@@ -436,8 +436,8 @@ Memhscx_fill_fifo(struct BCState *bcs)
 {
        struct IsdnCardState *cs = bcs->cs;
        int more, count, cnt;
-       int fifo_size = test_bit(HW_IPAC, &cs->HW_Flags)? 64: 32;
-       u_char *ptr,*p;
+       int fifo_size = test_bit(HW_IPAC, &cs->HW_Flags) ? 64 : 32;
+       u_char *ptr, *p;
 
        if ((cs->debug & L1_DEB_HSCX) && !(cs->debug & L1_DEB_HSCX_FIFO))
                debugl1(cs, "hscx_fill_fifo");
@@ -459,9 +459,9 @@ Memhscx_fill_fifo(struct BCState *bcs)
        skb_pull(bcs->tx_skb, count);
        bcs->tx_cnt -= count;
        bcs->hw.hscx.count += count;
-       while(cnt--)
+       while (cnt--)
                memwritereg(cs->hw.diva.cfg_reg, bcs->hw.hscx.hscx ? 0x40 : 0,
-                       *p++);
+                           *p++);
        MemWriteHSCXCMDR(cs, bcs->hw.hscx.hscx, more ? 0x8 : 0xa);
        if (cs->debug & L1_DEB_HSCX_FIFO) {
                char *t = bcs->blog;
@@ -479,7 +479,7 @@ Memhscx_interrupt(struct IsdnCardState *cs, u_char val, u_char hscx)
        u_char r;
        struct BCState *bcs = cs->bcs + hscx;
        struct sk_buff *skb;
-       int fifo_size = test_bit(HW_IPAC, &cs->HW_Flags)? 64: 32;
+       int fifo_size = test_bit(HW_IPAC, &cs->HW_Flags) ? 64 : 32;
        int count;
 
        if (!test_bit(BC_FLG_INIT, &bcs->Flag))
@@ -501,7 +501,7 @@ Memhscx_interrupt(struct IsdnCardState *cs, u_char val, u_char hscx)
                        MemWriteHSCXCMDR(cs, hscx, 0x80);
                } else {
                        count = MemReadHSCX(cs, hscx, HSCX_RBCL) & (
-                               test_bit(HW_IPAC, &cs->HW_Flags)? 0x3f: 0x1f);
+                               test_bit(HW_IPAC, &cs->HW_Flags) ? 0x3f : 0x1f);
                        if (count == 0)
                                count = fifo_size;
                        Memhscx_empty_fifo(bcs, count);
@@ -539,8 +539,8 @@ Memhscx_interrupt(struct IsdnCardState *cs, u_char val, u_char hscx)
                                Memhscx_fill_fifo(bcs);
                                return;
                        } else {
-                               if (test_bit(FLG_LLI_L1WAKEUP,&bcs->st->lli.flag) &&
-                                       (PACKET_NOACK != bcs->tx_skb->pkt_type)) {
+                               if (test_bit(FLG_LLI_L1WAKEUP, &bcs->st->lli.flag) &&
+                                   (PACKET_NOACK != bcs->tx_skb->pkt_type)) {
                                        u_long  flags;
                                        spin_lock_irqsave(&bcs->aclock, flags);
                                        bcs->ackcnt += bcs->hw.hscx.count;
@@ -548,7 +548,7 @@ Memhscx_interrupt(struct IsdnCardState *cs, u_char val, u_char hscx)
                                        schedule_event(bcs, B_ACKPENDING);
                                }
                                dev_kfree_skb_irq(bcs->tx_skb);
-                               bcs->hw.hscx.count = 0; 
+                               bcs->hw.hscx.count = 0;
                                bcs->tx_skb = NULL;
                        }
                }
@@ -578,7 +578,7 @@ Memhscx_int_main(struct IsdnCardState *cs, u_char val)
                                Memhscx_fill_fifo(bcs);
                        else {
                                /* Here we lost an TX interrupt, so
-                                  * restart transmitting the whole frame.
+                                * restart transmitting the whole frame.
                                 */
                                if (bcs->tx_skb) {
                                        skb_push(bcs->tx_skb, bcs->hw.hscx.count);
@@ -605,7 +605,7 @@ Memhscx_int_main(struct IsdnCardState *cs, u_char val)
                                Memhscx_fill_fifo(bcs);
                        else {
                                /* Here we lost an TX interrupt, so
-                                  * restart transmitting the whole frame.
+                                * restart transmitting the whole frame.
                                 */
                                if (bcs->tx_skb) {
                                        skb_push(bcs->tx_skb, bcs->hw.hscx.count);
@@ -631,8 +631,8 @@ static irqreturn_t
 diva_irq_ipac_pci(int intno, void *dev_id)
 {
        struct IsdnCardState *cs = dev_id;
-       u_char ista,val;
-       int icnt=5;
+       u_char ista, val;
+       int icnt = 5;
        u_char *cfg;
        u_long flags;
 
@@ -693,11 +693,11 @@ diva_irq_ipacx_pci(int intno, void *dev_id)
        spin_lock_irqsave(&cs->lock, flags);
        cfg = (u_char *) cs->hw.diva.pci_cfg;
        val = *cfg;
-       if (!(val &PITA_INT0_STATUS)) {
+       if (!(val & PITA_INT0_STATUS)) {
                spin_unlock_irqrestore(&cs->lock, flags);
                return IRQ_NONE; // other shared IRQ
        }
-       interrupt_ipacx(cs);      // handler for chip
+       interrupt_ipacx(cs);      // handler for chip
        *cfg = PITA_INT0_STATUS;  // Reset PLX interrupt
        spin_unlock_irqrestore(&cs->lock, flags);
        return IRQ_HANDLED;
@@ -708,11 +708,11 @@ release_io_diva(struct IsdnCardState *cs)
 {
        int bytecnt;
 
-       if ((cs->subtyp == DIVA_IPAC_PCI) || 
-           (cs->subtyp == DIVA_IPACX_PCI)   ) {
+       if ((cs->subtyp == DIVA_IPAC_PCI) ||
+           (cs->subtyp == DIVA_IPACX_PCI)) {
                u_int *cfg = (unsigned int *)cs->hw.diva.pci_cfg;
 
-               *cfg = 0; /* disable INT0/1 */ 
+               *cfg = 0; /* disable INT0/1 */
                *cfg = 2; /* reset pending INT0 */
                if (cs->hw.diva.cfg_reg)
                        iounmap((void *)cs->hw.diva.cfg_reg);
@@ -761,7 +761,7 @@ reset_diva(struct IsdnCardState *cs)
                writereg(cs->hw.diva.isac_adr, cs->hw.diva.isac, IPAC_MASK, 0xc0);
        } else if (cs->subtyp == DIVA_IPAC_PCI) {
                unsigned int *ireg = (unsigned int *)(cs->hw.diva.pci_cfg +
-                                       PITA_MISC_REG);
+                                                     PITA_MISC_REG);
                *ireg = PITA_PARA_SOFTRESET | PITA_PARA_MPX_MODE;
                mdelay(10);
                *ireg = PITA_PARA_MPX_MODE;
@@ -769,7 +769,7 @@ reset_diva(struct IsdnCardState *cs)
                memwritereg(cs->hw.diva.cfg_reg, IPAC_MASK, 0xc0);
        } else if (cs->subtyp == DIVA_IPACX_PCI) {
                unsigned int *ireg = (unsigned int *)(cs->hw.diva.pci_cfg +
-                                       PITA_MISC_REG);
+                                                     PITA_MISC_REG);
                *ireg = PITA_PARA_SOFTRESET | PITA_PARA_MPX_MODE;
                mdelay(10);
                *ireg = PITA_PARA_MPX_MODE | PITA_SER_SOFTRESET;
@@ -802,7 +802,7 @@ diva_led_handler(struct IsdnCardState *cs)
 
        if ((cs->subtyp == DIVA_IPAC_ISA) ||
            (cs->subtyp == DIVA_IPAC_PCI) ||
-           (cs->subtyp == DIVA_IPACX_PCI)   )
+           (cs->subtyp == DIVA_IPACX_PCI))
                return;
        del_timer(&cs->hw.diva.tl);
        if (cs->hw.diva.status & DIVA_ASSIGN)
@@ -822,7 +822,7 @@ diva_led_handler(struct IsdnCardState *cs)
                blink = 500;
        } else
                cs->hw.diva.ctrl_reg &= ~((DIVA_ISA == cs->subtyp) ?
-                       DIVA_ISA_LED_B : DIVA_PCI_LED_B);
+                                         DIVA_ISA_LED_B : DIVA_PCI_LED_B);
 
        byteout(cs->hw.diva.ctrl, cs->hw.diva.ctrl_reg);
        if (blink) {
@@ -839,69 +839,69 @@ Diva_card_msg(struct IsdnCardState *cs, int mt, void *arg)
        u_long flags;
 
        switch (mt) {
-               case CARD_RESET:
-                       spin_lock_irqsave(&cs->lock, flags);
-                       reset_diva(cs);
-                       spin_unlock_irqrestore(&cs->lock, flags);
-                       return(0);
-               case CARD_RELEASE:
-                       release_io_diva(cs);
-                       return(0);
-               case CARD_INIT:
-                       spin_lock_irqsave(&cs->lock, flags);
-                       reset_diva(cs);
-                       if (cs->subtyp == DIVA_IPACX_PCI) {
-                               ireg = (unsigned int *)cs->hw.diva.pci_cfg;
-                               *ireg = PITA_INT0_ENABLE;
-                               init_ipacx(cs, 3); // init chip and enable interrupts
-                               spin_unlock_irqrestore(&cs->lock, flags);
-                               return (0);
-                       }
-                       if (cs->subtyp == DIVA_IPAC_PCI) {
-                               ireg = (unsigned int *)cs->hw.diva.pci_cfg;
-                               *ireg = PITA_INT0_ENABLE;
-                       }
-                       inithscxisac(cs, 3);
+       case CARD_RESET:
+               spin_lock_irqsave(&cs->lock, flags);
+               reset_diva(cs);
+               spin_unlock_irqrestore(&cs->lock, flags);
+               return (0);
+       case CARD_RELEASE:
+               release_io_diva(cs);
+               return (0);
+       case CARD_INIT:
+               spin_lock_irqsave(&cs->lock, flags);
+               reset_diva(cs);
+               if (cs->subtyp == DIVA_IPACX_PCI) {
+                       ireg = (unsigned int *)cs->hw.diva.pci_cfg;
+                       *ireg = PITA_INT0_ENABLE;
+                       init_ipacx(cs, 3); // init chip and enable interrupts
                        spin_unlock_irqrestore(&cs->lock, flags);
-                       return(0);
-               case CARD_TEST:
-                       return(0);
-               case (MDL_REMOVE | REQUEST):
-                       cs->hw.diva.status = 0;
-                       break;
-               case (MDL_ASSIGN | REQUEST):
-                       cs->hw.diva.status |= DIVA_ASSIGN;
-                       break;
-               case MDL_INFO_SETUP:
-                       if ((long)arg)
-                               cs->hw.diva.status |=  0x0200;
-                       else
-                               cs->hw.diva.status |=  0x0100;
-                       break;
-               case MDL_INFO_CONN:
-                       if ((long)arg)
-                               cs->hw.diva.status |=  0x2000;
-                       else
-                               cs->hw.diva.status |=  0x1000;
-                       break;
-               case MDL_INFO_REL:
-                       if ((long)arg) {
-                               cs->hw.diva.status &=  ~0x2000;
-                               cs->hw.diva.status &=  ~0x0200;
-                       } else {
-                               cs->hw.diva.status &=  ~0x1000;
-                               cs->hw.diva.status &=  ~0x0100;
-                       }
-                       break;
+                       return (0);
+               }
+               if (cs->subtyp == DIVA_IPAC_PCI) {
+                       ireg = (unsigned int *)cs->hw.diva.pci_cfg;
+                       *ireg = PITA_INT0_ENABLE;
+               }
+               inithscxisac(cs, 3);
+               spin_unlock_irqrestore(&cs->lock, flags);
+               return (0);
+       case CARD_TEST:
+               return (0);
+       case (MDL_REMOVE | REQUEST):
+               cs->hw.diva.status = 0;
+               break;
+       case (MDL_ASSIGN | REQUEST):
+               cs->hw.diva.status |= DIVA_ASSIGN;
+               break;
+       case MDL_INFO_SETUP:
+               if ((long)arg)
+                       cs->hw.diva.status |=  0x0200;
+               else
+                       cs->hw.diva.status |=  0x0100;
+               break;
+       case MDL_INFO_CONN:
+               if ((long)arg)
+                       cs->hw.diva.status |=  0x2000;
+               else
+                       cs->hw.diva.status |=  0x1000;
+               break;
+       case MDL_INFO_REL:
+               if ((long)arg) {
+                       cs->hw.diva.status &=  ~0x2000;
+                       cs->hw.diva.status &=  ~0x0200;
+               } else {
+                       cs->hw.diva.status &=  ~0x1000;
+                       cs->hw.diva.status &=  ~0x0100;
+               }
+               break;
        }
-       if ((cs->subtyp != DIVA_IPAC_ISA) && 
+       if ((cs->subtyp != DIVA_IPAC_ISA) &&
            (cs->subtyp != DIVA_IPAC_PCI) &&
            (cs->subtyp != DIVA_IPACX_PCI)) {
-               spin_lock_irqsave(&cs->lock, flags);
+               spin_lock_irqsave(&cs->lock, flags);
                diva_led_handler(cs);
                spin_unlock_irqrestore(&cs->lock, flags);
        }
-       return(0);
+       return (0);
 }
 
 static int __devinit setup_diva_common(struct IsdnCardState *cs)
@@ -915,21 +915,21 @@ static int __devinit setup_diva_common(struct IsdnCardState *cs)
                bytecnt = 32;
 
        printk(KERN_INFO
-               "Diva: %s card configured at %#lx IRQ %d\n",
-               (cs->subtyp == DIVA_PCI) ? "PCI" :
-               (cs->subtyp == DIVA_ISA) ? "ISA" : 
-               (cs->subtyp == DIVA_IPAC_ISA) ? "IPAC ISA" :
-               (cs->subtyp == DIVA_IPAC_PCI) ? "IPAC PCI" : "IPACX PCI",
-               cs->hw.diva.cfg_reg, cs->irq);
-       if ((cs->subtyp == DIVA_IPAC_PCI)  || 
-           (cs->subtyp == DIVA_IPACX_PCI) || 
-           (cs->subtyp == DIVA_PCI)         )
+              "Diva: %s card configured at %#lx IRQ %d\n",
+              (cs->subtyp == DIVA_PCI) ? "PCI" :
+              (cs->subtyp == DIVA_ISA) ? "ISA" :
+              (cs->subtyp == DIVA_IPAC_ISA) ? "IPAC ISA" :
+              (cs->subtyp == DIVA_IPAC_PCI) ? "IPAC PCI" : "IPACX PCI",
+              cs->hw.diva.cfg_reg, cs->irq);
+       if ((cs->subtyp == DIVA_IPAC_PCI)  ||
+           (cs->subtyp == DIVA_IPACX_PCI) ||
+           (cs->subtyp == DIVA_PCI))
                printk(KERN_INFO "Diva: %s space at %#lx\n",
-                       (cs->subtyp == DIVA_PCI) ? "PCI" :
-                       (cs->subtyp == DIVA_IPAC_PCI) ? "IPAC PCI" : "IPACX PCI",
-                       cs->hw.diva.pci_cfg);
+                      (cs->subtyp == DIVA_PCI) ? "PCI" :
+                      (cs->subtyp == DIVA_IPAC_PCI) ? "IPAC PCI" : "IPACX PCI",
+                      cs->hw.diva.pci_cfg);
        if ((cs->subtyp != DIVA_IPAC_PCI) &&
-           (cs->subtyp != DIVA_IPACX_PCI)   ) {
+           (cs->subtyp != DIVA_IPACX_PCI)) {
                if (!request_region(cs->hw.diva.cfg_reg, bytecnt, "diva isdn")) {
                        printk(KERN_WARNING
                               "HiSax: %s config port %lx-%lx already in use\n",
@@ -973,8 +973,8 @@ static int __devinit setup_diva_common(struct IsdnCardState *cs)
                cs->BC_Write_Reg = &MemWriteHSCX_IPACX;
                cs->BC_Send_Data = NULL; // function located in ipacx module
                cs->irq_func = &diva_irq_ipacx_pci;
-               printk(KERN_INFO "Diva: IPACX Design Id: %x\n", 
-                       MemReadISAC_IPACX(cs, IPACX_ID) &0x3F);
+               printk(KERN_INFO "Diva: IPACX Design Id: %x\n",
+                      MemReadISAC_IPACX(cs, IPACX_ID) & 0x3F);
        } else { /* DIVA 2.0 */
                cs->hw.diva.tl.function = (void *) diva_led_handler;
                cs->hw.diva.tl.data = (long) cs;
@@ -987,7 +987,7 @@ static int __devinit setup_diva_common(struct IsdnCardState *cs)
                ISACVersion(cs, "Diva:");
                if (HscxVersion(cs, "Diva:")) {
                        printk(KERN_WARNING
-                      "Diva: wrong HSCX versions check IO address\n");
+                              "Diva: wrong HSCX versions check IO address\n");
                        release_io_diva(cs);
                        return (0);
                }
@@ -1008,9 +1008,9 @@ static int __devinit setup_diva_isa(struct IsdnCard *card)
        cs->hw.diva.ctrl_reg = 0;
        cs->hw.diva.cfg_reg = card->para[1];
        val = readreg(cs->hw.diva.cfg_reg + DIVA_IPAC_ADR,
-               cs->hw.diva.cfg_reg + DIVA_IPAC_DATA, IPAC_ID);
+                     cs->hw.diva.cfg_reg + DIVA_IPAC_DATA, IPAC_ID);
        printk(KERN_INFO "Diva: IPAC version %x\n", val);
-       if ((val == 1) || (val==2)) {
+       if ((val == 1) || (val == 2)) {
                cs->subtyp = DIVA_IPAC_ISA;
                cs->hw.diva.ctrl = 0;
                cs->hw.diva.isac = card->para[1] + DIVA_IPAC_DATA;
@@ -1043,22 +1043,22 @@ static int __devinit setup_diva_isa(struct IsdnCard *card)
 #ifdef __ISAPNP__
 static struct isapnp_device_id diva_ids[] __devinitdata = {
        { ISAPNP_VENDOR('G', 'D', 'I'), ISAPNP_FUNCTION(0x51),
-         ISAPNP_VENDOR('G', 'D', 'I'), ISAPNP_FUNCTION(0x51), 
+         ISAPNP_VENDOR('G', 'D', 'I'), ISAPNP_FUNCTION(0x51),
          (unsigned long) "Diva picola" },
        { ISAPNP_VENDOR('G', 'D', 'I'), ISAPNP_FUNCTION(0x51),
-         ISAPNP_VENDOR('E', 'I', 'C'), ISAPNP_FUNCTION(0x51), 
+         ISAPNP_VENDOR('E', 'I', 'C'), ISAPNP_FUNCTION(0x51),
          (unsigned long) "Diva picola" },
        { ISAPNP_VENDOR('G', 'D', 'I'), ISAPNP_FUNCTION(0x71),
-         ISAPNP_VENDOR('G', 'D', 'I'), ISAPNP_FUNCTION(0x71), 
+         ISAPNP_VENDOR('G', 'D', 'I'), ISAPNP_FUNCTION(0x71),
          (unsigned long) "Diva 2.0" },
        { ISAPNP_VENDOR('G', 'D', 'I'), ISAPNP_FUNCTION(0x71),
-         ISAPNP_VENDOR('E', 'I', 'C'), ISAPNP_FUNCTION(0x71), 
+         ISAPNP_VENDOR('E', 'I', 'C'), ISAPNP_FUNCTION(0x71),
          (unsigned long) "Diva 2.0" },
        { ISAPNP_VENDOR('G', 'D', 'I'), ISAPNP_FUNCTION(0xA1),
-         ISAPNP_VENDOR('G', 'D', 'I'), ISAPNP_FUNCTION(0xA1), 
+         ISAPNP_VENDOR('G', 'D', 'I'), ISAPNP_FUNCTION(0xA1),
          (unsigned long) "Diva 2.01" },
        { ISAPNP_VENDOR('G', 'D', 'I'), ISAPNP_FUNCTION(0xA1),
-         ISAPNP_VENDOR('E', 'I', 'C'), ISAPNP_FUNCTION(0xA1), 
+         ISAPNP_VENDOR('E', 'I', 'C'), ISAPNP_FUNCTION(0xA1),
          (unsigned long) "Diva 2.01" },
        { 0, }
 };
@@ -1074,30 +1074,30 @@ static int __devinit setup_diva_isapnp(struct IsdnCard *card)
        if (!isapnp_present())
                return (-1);    /* card not found; continue search */
 
-       while(ipid->card_vendor) {
+       while (ipid->card_vendor) {
                if ((pnp_c = pnp_find_card(ipid->card_vendor,
-                       ipid->card_device, pnp_c))) {
+                                          ipid->card_device, pnp_c))) {
                        pnp_d = NULL;
                        if ((pnp_d = pnp_find_dev(pnp_c,
-                               ipid->vendor, ipid->function, pnp_d))) {
+                                                 ipid->vendor, ipid->function, pnp_d))) {
                                int err;
 
                                printk(KERN_INFO "HiSax: %s detected\n",
-                                       (char *)ipid->driver_data);
+                                      (char *)ipid->driver_data);
                                pnp_disable_dev(pnp_d);
                                err = pnp_activate_dev(pnp_d);
-                               if (err<0) {
+                               if (err < 0) {
                                        printk(KERN_WARNING "%s: pnp_activate_dev ret(%d)\n",
-                                               __func__, err);
-                                       return(0);
+                                              __func__, err);
+                                       return (0);
                                }
                                card->para[1] = pnp_port_start(pnp_d, 0);
                                card->para[0] = pnp_irq(pnp_d, 0);
                                if (!card->para[0] || !card->para[1]) {
                                        printk(KERN_ERR "Diva PnP:some resources are missing %ld/%lx\n",
-                                               card->para[0], card->para[1]);
-                                       pnp_disable_dev(pnp_d); 
-                                       return(0);
+                                              card->para[0], card->para[1]);
+                                       pnp_disable_dev(pnp_d);
+                                       return (0);
                                }
                                cs->hw.diva.cfg_reg  = card->para[1];
                                cs->irq = card->para[0];
@@ -1129,12 +1129,12 @@ static int __devinit setup_diva_isapnp(struct IsdnCard *card)
                                return (1);             /* card found */
                        } else {
                                printk(KERN_ERR "Diva PnP: PnP error card found, no device\n");
-                               return(0);
+                               return (0);
                        }
                }
                ipid++;
-               pnp_c=NULL;
-       } 
+               pnp_c = NULL;
+       }
 
        return (-1);    /* card not found; continue search */
 }
@@ -1160,23 +1160,23 @@ static int __devinit setup_diva_pci(struct IsdnCard *card)
 
        cs->subtyp = 0;
        if ((dev_diva = hisax_find_pci_device(PCI_VENDOR_ID_EICON,
-               PCI_DEVICE_ID_EICON_DIVA20, dev_diva))) {
+                                             PCI_DEVICE_ID_EICON_DIVA20, dev_diva))) {
                if (pci_enable_device(dev_diva))
-                       return(0);
+                       return (0);
                cs->subtyp = DIVA_PCI;
                cs->irq = dev_diva->irq;
                cs->hw.diva.cfg_reg = pci_resource_start(dev_diva, 2);
        } else if ((dev_diva_u = hisax_find_pci_device(PCI_VENDOR_ID_EICON,
-               PCI_DEVICE_ID_EICON_DIVA20_U, dev_diva_u))) {
+                                                      PCI_DEVICE_ID_EICON_DIVA20_U, dev_diva_u))) {
                if (pci_enable_device(dev_diva_u))
-                       return(0);
+                       return (0);
                cs->subtyp = DIVA_PCI;
                cs->irq = dev_diva_u->irq;
                cs->hw.diva.cfg_reg = pci_resource_start(dev_diva_u, 2);
        } else if ((dev_diva201 = hisax_find_pci_device(PCI_VENDOR_ID_EICON,
-               PCI_DEVICE_ID_EICON_DIVA201, dev_diva201))) {
+                                                       PCI_DEVICE_ID_EICON_DIVA201, dev_diva201))) {
                if (pci_enable_device(dev_diva201))
-                       return(0);
+                       return (0);
                cs->subtyp = DIVA_IPAC_PCI;
                cs->irq = dev_diva201->irq;
                cs->hw.diva.pci_cfg =
@@ -1184,9 +1184,9 @@ static int __devinit setup_diva_pci(struct IsdnCard *card)
                cs->hw.diva.cfg_reg =
                        (ulong) ioremap(pci_resource_start(dev_diva201, 1), 4096);
        } else if ((dev_diva202 = hisax_find_pci_device(PCI_VENDOR_ID_EICON,
-               PCI_DEVICE_ID_EICON_DIVA202, dev_diva202))) {
+                                                       PCI_DEVICE_ID_EICON_DIVA202, dev_diva202))) {
                if (pci_enable_device(dev_diva202))
-                       return(0);
+                       return (0);
                cs->subtyp = DIVA_IPACX_PCI;
                cs->irq = dev_diva202->irq;
                cs->hw.diva.pci_cfg =
@@ -1200,18 +1200,18 @@ static int __devinit setup_diva_pci(struct IsdnCard *card)
        if (!cs->irq) {
                printk(KERN_WARNING "Diva: No IRQ for PCI card found\n");
                iounmap_diva(cs);
-               return(0);
+               return (0);
        }
 
        if (!cs->hw.diva.cfg_reg) {
                printk(KERN_WARNING "Diva: No IO-Adr for PCI card found\n");
                iounmap_diva(cs);
-               return(0);
+               return (0);
        }
        cs->irq_flags |= IRQF_SHARED;
 
        if ((cs->subtyp == DIVA_IPAC_PCI) ||
-           (cs->subtyp == DIVA_IPACX_PCI)   ) {
+           (cs->subtyp == DIVA_IPACX_PCI)) {
                cs->hw.diva.ctrl = 0;
                cs->hw.diva.isac = 0;
                cs->hw.diva.hscx = 0;
@@ -1248,7 +1248,7 @@ setup_diva(struct IsdnCard *card)
        strcpy(tmp, Diva_revision);
        printk(KERN_INFO "HiSax: Eicon.Diehl Diva driver Rev. %s\n", HiSax_getrev(tmp));
        if (cs->typ != ISDN_CTYPE_DIEHLDIVA)
-               return(0);
+               return (0);
        cs->hw.diva.status = 0;
 
        rc = setup_diva_isa(card);
@@ -1276,7 +1276,7 @@ setup_diva(struct IsdnCard *card)
 ready:
        if (!have_card) {
                printk(KERN_WARNING "Diva: No ISA, ISAPNP or PCI card found\n");
-               return(0);
+               return (0);
        }
 
        return setup_diva_common(card->cs);
index 5d9d338..64ba26a 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Author       Karsten Keil
  * Copyright    by Karsten Keil      <keil@isdn4linux.de>
- * 
+ *
  * This software may be used and distributed according to the terms
  * of the GNU General Public License, incorporated herein by reference.
  *
 static const char *Elsa_revision = "$Revision: 2.32.2.4 $";
 static const char *Elsa_Types[] =
 {"None", "PC", "PCC-8", "PCC-16", "PCF", "PCF-Pro",
- "PCMCIA", "QS 1000", "QS 3000", "Microlink PCI", "QS 3000 PCI", 
+ "PCMCIA", "QS 1000", "QS 3000", "Microlink PCI", "QS 3000 PCI",
  "PCMCIA-IPAC" };
 
 static const char *ITACVer[] =
 {"?0?", "?1?", "?2?", "?3?", "?4?", "V2.2",
  "B1", "A1"};
 
-#define byteout(addr,val) outb(val,addr)
+#define byteout(addr, val) outb(val, addr)
 #define bytein(addr) inb(addr)
 
 #define ELSA_ISAC      0
@@ -113,25 +113,25 @@ static const char *ITACVer[] =
 
 #if ARCOFI_USE
 static struct arcofi_msg ARCOFI_XOP_F =
-       {NULL,0,2,{0xa1,0x3f,0,0,0,0,0,0,0,0}}; /* Normal OP */
+{NULL,0,2,{0xa1,0x3f,0,0,0,0,0,0,0,0}}; /* Normal OP */
 static struct arcofi_msg ARCOFI_XOP_1 =
-       {&ARCOFI_XOP_F,0,2,{0xa1,0x31,0,0,0,0,0,0,0,0}}; /* PWR UP */
-static struct arcofi_msg ARCOFI_SOP_F = 
-       {&ARCOFI_XOP_1,0,10,{0xa1,0x1f,0x00,0x50,0x10,0x00,0x00,0x80,0x02,0x12}};
+{&ARCOFI_XOP_F,0,2,{0xa1,0x31,0,0,0,0,0,0,0,0}}; /* PWR UP */
+static struct arcofi_msg ARCOFI_SOP_F =
+{&ARCOFI_XOP_1,0,10,{0xa1,0x1f,0x00,0x50,0x10,0x00,0x00,0x80,0x02,0x12}};
 static struct arcofi_msg ARCOFI_COP_9 =
-       {&ARCOFI_SOP_F,0,10,{0xa1,0x29,0x80,0xcb,0xe9,0x88,0x00,0xc8,0xd8,0x80}}; /* RX */
+{&ARCOFI_SOP_F,0,10,{0xa1,0x29,0x80,0xcb,0xe9,0x88,0x00,0xc8,0xd8,0x80}}; /* RX */
 static struct arcofi_msg ARCOFI_COP_8 =
-       {&ARCOFI_COP_9,0,10,{0xa1,0x28,0x49,0x31,0x8,0x13,0x6e,0x88,0x2a,0x61}}; /* TX */
+{&ARCOFI_COP_9,0,10,{0xa1,0x28,0x49,0x31,0x8,0x13,0x6e,0x88,0x2a,0x61}}; /* TX */
 static struct arcofi_msg ARCOFI_COP_7 =
-       {&ARCOFI_COP_8,0,4,{0xa1,0x27,0x80,0x80,0,0,0,0,0,0}}; /* GZ */
+{&ARCOFI_COP_8,0,4,{0xa1,0x27,0x80,0x80,0,0,0,0,0,0}}; /* GZ */
 static struct arcofi_msg ARCOFI_COP_6 =
-       {&ARCOFI_COP_7,0,6,{0xa1,0x26,0,0,0x82,0x7c,0,0,0,0}}; /* GRL GRH */
+{&ARCOFI_COP_7,0,6,{0xa1,0x26,0,0,0x82,0x7c,0,0,0,0}}; /* GRL GRH */
 static struct arcofi_msg ARCOFI_COP_5 =
-       {&ARCOFI_COP_6,0,4,{0xa1,0x25,0xbb,0x4a,0,0,0,0,0,0}}; /* GTX */
+{&ARCOFI_COP_6,0,4,{0xa1,0x25,0xbb,0x4a,0,0,0,0,0,0}}; /* GTX */
 static struct arcofi_msg ARCOFI_VERSION =
-       {NULL,1,2,{0xa0,0,0,0,0,0,0,0,0,0}};
+{NULL,1,2,{0xa0,0,0,0,0,0,0,0,0,0}};
 static struct arcofi_msg ARCOFI_XOP_0 =
-       {NULL,0,2,{0xa1,0x30,0,0,0,0,0,0,0,0}}; /* PWR Down */
+{NULL,0,2,{0xa1,0x30,0,0,0,0,0,0,0,0}}; /* PWR Down */
 
 static void set_arcofi(struct IsdnCardState *cs, int bc);
 
@@ -149,7 +149,7 @@ readreg(unsigned int ale, unsigned int adr, u_char off)
 }
 
 static inline void
-readfifo(unsigned int ale, unsigned int adr, u_char off, u_char * data, int size)
+readfifo(unsigned int ale, unsigned int adr, u_char off, u_char *data, int size)
 {
        byteout(ale, off);
        insb(adr, data, size);
@@ -164,7 +164,7 @@ writereg(unsigned int ale, unsigned int adr, u_char off, u_char data)
 }
 
 static inline void
-writefifo(unsigned int ale, unsigned int adr, u_char off, u_char * data, int size)
+writefifo(unsigned int ale, unsigned int adr, u_char off, u_char *data, int size)
 {
        byteout(ale, off);
        outsb(adr, data, size);
@@ -185,13 +185,13 @@ WriteISAC(struct IsdnCardState *cs, u_char offset, u_char value)
 }
 
 static void
-ReadISACfifo(struct IsdnCardState *cs, u_char * data, int size)
+ReadISACfifo(struct IsdnCardState *cs, u_char *data, int size)
 {
        readfifo(cs->hw.elsa.ale, cs->hw.elsa.isac, 0, data, size);
 }
 
 static void
-WriteISACfifo(struct IsdnCardState *cs, u_char * data, int size)
+WriteISACfifo(struct IsdnCardState *cs, u_char *data, int size)
 {
        writefifo(cs->hw.elsa.ale, cs->hw.elsa.isac, 0, data, size);
 }
@@ -199,23 +199,23 @@ WriteISACfifo(struct IsdnCardState *cs, u_char * data, int size)
 static u_char
 ReadISAC_IPAC(struct IsdnCardState *cs, u_char offset)
 {
-       return (readreg(cs->hw.elsa.ale, cs->hw.elsa.isac, offset+0x80));
+       return (readreg(cs->hw.elsa.ale, cs->hw.elsa.isac, offset + 0x80));
 }
 
 static void
 WriteISAC_IPAC(struct IsdnCardState *cs, u_char offset, u_char value)
 {
-       writereg(cs->hw.elsa.ale, cs->hw.elsa.isac, offset|0x80, value);
+       writereg(cs->hw.elsa.ale, cs->hw.elsa.isac, offset | 0x80, value);
 }
 
 static void
-ReadISACfifo_IPAC(struct IsdnCardState *cs, u_char * data, int size)
+ReadISACfifo_IPAC(struct IsdnCardState *cs, u_char *data, int size)
 {
        readfifo(cs->hw.elsa.ale, cs->hw.elsa.isac, 0x80, data, size);
 }
 
 static void
-WriteISACfifo_IPAC(struct IsdnCardState *cs, u_char * data, int size)
+WriteISACfifo_IPAC(struct IsdnCardState *cs, u_char *data, int size)
 {
        writefifo(cs->hw.elsa.ale, cs->hw.elsa.isac, 0x80, data, size);
 }
@@ -267,16 +267,16 @@ TimerRun(struct IsdnCardState *cs)
  * fast interrupt HSCX stuff goes here
  */
 
-#define READHSCX(cs, nr, reg) readreg(cs->hw.elsa.ale, \
-               cs->hw.elsa.hscx, reg + (nr ? 0x40 : 0))
-#define WRITEHSCX(cs, nr, reg, data) writereg(cs->hw.elsa.ale, \
-               cs->hw.elsa.hscx, reg + (nr ? 0x40 : 0), data)
+#define READHSCX(cs, nr, reg) readreg(cs->hw.elsa.ale,                 \
+                                     cs->hw.elsa.hscx, reg + (nr ? 0x40 : 0))
+#define WRITEHSCX(cs, nr, reg, data) writereg(cs->hw.elsa.ale,         \
+                                             cs->hw.elsa.hscx, reg + (nr ? 0x40 : 0), data)
 
-#define READHSCXFIFO(cs, nr, ptr, cnt) readfifo(cs->hw.elsa.ale, \
-               cs->hw.elsa.hscx, (nr ? 0x40 : 0), ptr, cnt)
+#define READHSCXFIFO(cs, nr, ptr, cnt) readfifo(cs->hw.elsa.ale,       \
+                                               cs->hw.elsa.hscx, (nr ? 0x40 : 0), ptr, cnt)
 
-#define WRITEHSCXFIFO(cs, nr, ptr, cnt) writefifo(cs->hw.elsa.ale, \
-               cs->hw.elsa.hscx, (nr ? 0x40 : 0), ptr, cnt)
+#define WRITEHSCXFIFO(cs, nr, ptr, cnt) writefifo(cs->hw.elsa.ale,     \
+                                                 cs->hw.elsa.hscx, (nr ? 0x40 : 0), ptr, cnt)
 
 #include "hscx_irq.c"
 
@@ -286,11 +286,11 @@ elsa_interrupt(int intno, void *dev_id)
        struct IsdnCardState *cs = dev_id;
        u_long flags;
        u_char val;
-       int icnt=5;
+       int icnt = 5;
 
        if ((cs->typ == ISDN_CTYPE_ELSA_PCMCIA) && (*cs->busy_flag == 1)) {
-       /* The card tends to generate interrupts while being removed
-          causing us to just crash the kernel. bad. */
+               /* The card tends to generate interrupts while being removed
+                  causing us to just crash the kernel. bad. */
                printk(KERN_WARNING "Elsa: card not available!\n");
                return IRQ_NONE;
        }
@@ -299,18 +299,18 @@ elsa_interrupt(int intno, void *dev_id)
        if (cs->hw.elsa.MFlag) {
                val = serial_inp(cs, UART_IIR);
                if (!(val & UART_IIR_NO_INT)) {
-                       debugl1(cs,"IIR %02x", val);
+                       debugl1(cs, "IIR %02x", val);
                        rs_interrupt_elsa(cs);
                }
        }
 #endif
        val = readreg(cs->hw.elsa.ale, cs->hw.elsa.hscx, HSCX_ISTA + 0x40);
-      Start_HSCX:
+Start_HSCX:
        if (val) {
                hscx_int_main(cs, val);
        }
        val = readreg(cs->hw.elsa.ale, cs->hw.elsa.isac, ISAC_ISTA);
-      Start_ISAC:
+Start_ISAC:
        if (val) {
                isac_interrupt(cs, val);
        }
@@ -364,8 +364,8 @@ elsa_interrupt_ipac(int intno, void *dev_id)
 {
        struct IsdnCardState *cs = dev_id;
        u_long flags;
-       u_char ista,val;
-       int icnt=5;
+       u_char ista, val;
+       int icnt = 5;
 
        spin_lock_irqsave(&cs->lock, flags);
        if (cs->subtyp == ELSA_QS1000PCI || cs->subtyp == ELSA_QS3000PCI) {
@@ -379,7 +379,7 @@ elsa_interrupt_ipac(int intno, void *dev_id)
        if (cs->hw.elsa.MFlag) {
                val = serial_inp(cs, UART_IIR);
                if (!(val & UART_IIR_NO_INT)) {
-                       debugl1(cs,"IIR %02x", val);
+                       debugl1(cs, "IIR %02x", val);
                        rs_interrupt_elsa(cs);
                }
        }
@@ -444,13 +444,13 @@ release_io_elsa(struct IsdnCardState *cs)
                writereg(cs->hw.elsa.ale, cs->hw.elsa.isac, IPAC_ATX, 0xff);
                release_region(cs->hw.elsa.cfg, 0x80);
        }
-       if (cs->subtyp == ELSA_PCMCIA_IPAC) {
+       if (cs->subtyp == ELSA_PCMCIA_IPAC) {
                writereg(cs->hw.elsa.ale, cs->hw.elsa.isac, IPAC_ATX, 0xff);
-       }
+       }
        if ((cs->subtyp == ELSA_PCFPRO) ||
-               (cs->subtyp == ELSA_QS3000) ||
-               (cs->subtyp == ELSA_PCF) ||
-               (cs->subtyp == ELSA_QS3000PCI)) {
+           (cs->subtyp == ELSA_QS3000) ||
+           (cs->subtyp == ELSA_PCF) ||
+           (cs->subtyp == ELSA_QS3000PCI)) {
                bytecnt = 16;
 #if ARCOFI_USE
                release_modem(cs);
@@ -521,84 +521,84 @@ check_arcofi(struct IsdnCardState *cs)
        u_char *p;
 
        if (!cs->dc.isac.mon_tx)
-               if (!(cs->dc.isac.mon_tx=kmalloc(MAX_MON_FRAME, GFP_ATOMIC))) {
+               if (!(cs->dc.isac.mon_tx = kmalloc(MAX_MON_FRAME, GFP_ATOMIC))) {
                        if (cs->debug & L1_DEB_WARN)
                                debugl1(cs, "ISAC MON TX out of buffers!");
-                       return(0);
+                       return (0);
                }
        cs->dc.isac.arcofi_bc = 0;
        arcofi_fsm(cs, ARCOFI_START, &ARCOFI_VERSION);
        interruptible_sleep_on(&cs->dc.isac.arcofi_wait);
        if (!test_and_clear_bit(FLG_ARCOFI_ERROR, &cs->HW_Flags)) {
-                       debugl1(cs, "Arcofi response received %d bytes", cs->dc.isac.mon_rxp);
-                       p = cs->dc.isac.mon_rx;
-                       t = tmp;
-                       t += sprintf(tmp, "Arcofi data");
-                       QuickHex(t, p, cs->dc.isac.mon_rxp);
-                       debugl1(cs, tmp);
-                       if ((cs->dc.isac.mon_rxp == 2) && (cs->dc.isac.mon_rx[0] == 0xa0)) {
-                               switch(cs->dc.isac.mon_rx[1]) {
-                                       case 0x80:
-                                               debugl1(cs, "Arcofi 2160 detected");
-                                               arcofi_present = 1;
-                                               break;
-                                       case 0x82:
-                                               debugl1(cs, "Arcofi 2165 detected");
-                                               arcofi_present = 2;
-                                               break;
-                                       case 0x84:
-                                               debugl1(cs, "Arcofi 2163 detected");
-                                               arcofi_present = 3;
-                                               break;
-                                       default:
-                                               debugl1(cs, "unknown Arcofi response");
-                                               break;
-                               }
-                       } else
-                               debugl1(cs, "undefined Monitor response");
-                       cs->dc.isac.mon_rxp = 0;
+               debugl1(cs, "Arcofi response received %d bytes", cs->dc.isac.mon_rxp);
+               p = cs->dc.isac.mon_rx;
+               t = tmp;
+               t += sprintf(tmp, "Arcofi data");
+               QuickHex(t, p, cs->dc.isac.mon_rxp);
+               debugl1(cs, tmp);
+               if ((cs->dc.isac.mon_rxp == 2) && (cs->dc.isac.mon_rx[0] == 0xa0)) {
+                       switch (cs->dc.isac.mon_rx[1]) {
+                       case 0x80:
+                               debugl1(cs, "Arcofi 2160 detected");
+                               arcofi_present = 1;
+                               break;
+                       case 0x82:
+                               debugl1(cs, "Arcofi 2165 detected");
+                               arcofi_present = 2;
+                               break;
+                       case 0x84:
+                               debugl1(cs, "Arcofi 2163 detected");
+                               arcofi_present = 3;
+                               break;
+                       default:
+                               debugl1(cs, "unknown Arcofi response");
+                               break;
+                       }
+               } else
+                       debugl1(cs, "undefined Monitor response");
+               cs->dc.isac.mon_rxp = 0;
        } else if (cs->dc.isac.mon_tx) {
                debugl1(cs, "Arcofi not detected");
        }
        if (arcofi_present) {
-               if (cs->subtyp==ELSA_QS1000) {
+               if (cs->subtyp == ELSA_QS1000) {
                        cs->subtyp = ELSA_QS3000;
                        printk(KERN_INFO
-                               "Elsa: %s detected modem at 0x%lx\n",
-                               Elsa_Types[cs->subtyp],
-                               cs->hw.elsa.base+8);
+                              "Elsa: %s detected modem at 0x%lx\n",
+                              Elsa_Types[cs->subtyp],
+                              cs->hw.elsa.base + 8);
                        release_region(cs->hw.elsa.base, 8);
                        if (!request_region(cs->hw.elsa.base, 16, "elsa isdn modem")) {
                                printk(KERN_WARNING
-                                       "HiSax: %s config port %lx-%lx already in use\n",
-                                       Elsa_Types[cs->subtyp],
-                                       cs->hw.elsa.base + 8,
-                                       cs->hw.elsa.base + 16);
+                                      "HiSax: %s config port %lx-%lx already in use\n",
+                                      Elsa_Types[cs->subtyp],
+                                      cs->hw.elsa.base + 8,
+                                      cs->hw.elsa.base + 16);
                        }
-               } else if (cs->subtyp==ELSA_PCC16) {
+               } else if (cs->subtyp == ELSA_PCC16) {
                        cs->subtyp = ELSA_PCF;
                        printk(KERN_INFO
-                               "Elsa: %s detected modem at 0x%lx\n",
-                               Elsa_Types[cs->subtyp],
-                               cs->hw.elsa.base+8);
+                              "Elsa: %s detected modem at 0x%lx\n",
+                              Elsa_Types[cs->subtyp],
+                              cs->hw.elsa.base + 8);
                        release_region(cs->hw.elsa.base, 8);
                        if (!request_region(cs->hw.elsa.base, 16, "elsa isdn modem")) {
                                printk(KERN_WARNING
-                                       "HiSax: %s config port %lx-%lx already in use\n",
-                                       Elsa_Types[cs->subtyp],
-                                       cs->hw.elsa.base + 8,
-                                       cs->hw.elsa.base + 16);
+                                      "HiSax: %s config port %lx-%lx already in use\n",
+                                      Elsa_Types[cs->subtyp],
+                                      cs->hw.elsa.base + 8,
+                                      cs->hw.elsa.base + 16);
                        }
                } else
                        printk(KERN_INFO
-                               "Elsa: %s detected modem at 0x%lx\n",
-                               Elsa_Types[cs->subtyp],
-                               cs->hw.elsa.base+8);
+                              "Elsa: %s detected modem at 0x%lx\n",
+                              Elsa_Types[cs->subtyp],
+                              cs->hw.elsa.base + 8);
                arcofi_fsm(cs, ARCOFI_START, &ARCOFI_XOP_0);
                interruptible_sleep_on(&cs->dc.isac.arcofi_wait);
-               return(1);
+               return (1);
        }
-       return(0);
+       return (0);
 }
 #endif /* ARCOFI_USE */
 
@@ -627,7 +627,7 @@ elsa_led_handler(struct IsdnCardState *cs)
                cs->hw.elsa.ctrl_reg &= ~ELSA_LINE_LED;
 
        if ((cs->subtyp == ELSA_QS1000PCI) ||
-               (cs->subtyp == ELSA_QS3000PCI)) {
+           (cs->subtyp == ELSA_QS3000PCI)) {
                u_char led = 0xff;
                if (cs->hw.elsa.ctrl_reg & ELSA_LINE_LED)
                        led ^= ELSA_IPAC_LINE_LED;
@@ -650,111 +650,111 @@ Elsa_card_msg(struct IsdnCardState *cs, int mt, void *arg)
        u_long flags;
 
        switch (mt) {
-               case CARD_RESET:
+       case CARD_RESET:
+               spin_lock_irqsave(&cs->lock, flags);
+               reset_elsa(cs);
+               spin_unlock_irqrestore(&cs->lock, flags);
+               return (0);
+       case CARD_RELEASE:
+               release_io_elsa(cs);
+               return (0);
+       case CARD_INIT:
+               spin_lock_irqsave(&cs->lock, flags);
+               cs->debug |= L1_DEB_IPAC;
+               reset_elsa(cs);
+               inithscxisac(cs, 1);
+               if ((cs->subtyp == ELSA_QS1000) ||
+                   (cs->subtyp == ELSA_QS3000))
+               {
+                       byteout(cs->hw.elsa.timer, 0);
+               }
+               if (cs->hw.elsa.trig)
+                       byteout(cs->hw.elsa.trig, 0xff);
+               inithscxisac(cs, 2);
+               spin_unlock_irqrestore(&cs->lock, flags);
+               return (0);
+       case CARD_TEST:
+               if ((cs->subtyp == ELSA_PCMCIA) ||
+                   (cs->subtyp == ELSA_PCMCIA_IPAC) ||
+                   (cs->subtyp == ELSA_QS1000PCI)) {
+                       return (0);
+               } else if (cs->subtyp == ELSA_QS3000PCI) {
+                       ret = 0;
+               } else {
                        spin_lock_irqsave(&cs->lock, flags);
-                       reset_elsa(cs);
+                       cs->hw.elsa.counter = 0;
+                       cs->hw.elsa.ctrl_reg |= ELSA_ENA_TIMER_INT;
+                       cs->hw.elsa.status |= ELIRQF_TIMER_AKTIV;
+                       byteout(cs->hw.elsa.ctrl, cs->hw.elsa.ctrl_reg);
+                       byteout(cs->hw.elsa.timer, 0);
                        spin_unlock_irqrestore(&cs->lock, flags);
-                       return(0);
-               case CARD_RELEASE:
-                       release_io_elsa(cs);
-                       return(0);
-               case CARD_INIT:
+                       msleep(110);
                        spin_lock_irqsave(&cs->lock, flags);
-                       cs->debug |= L1_DEB_IPAC;
-                       reset_elsa(cs);
-                       inithscxisac(cs, 1);
-                       if ((cs->subtyp == ELSA_QS1000) ||
-                           (cs->subtyp == ELSA_QS3000))
-                       {
-                               byteout(cs->hw.elsa.timer, 0);
-                       }
-                       if (cs->hw.elsa.trig)
-                               byteout(cs->hw.elsa.trig, 0xff);
-                       inithscxisac(cs, 2);
+                       cs->hw.elsa.ctrl_reg &= ~ELSA_ENA_TIMER_INT;
+                       byteout(cs->hw.elsa.ctrl, cs->hw.elsa.ctrl_reg);
+                       cs->hw.elsa.status &= ~ELIRQF_TIMER_AKTIV;
                        spin_unlock_irqrestore(&cs->lock, flags);
-                       return(0);
-               case CARD_TEST:
-                       if ((cs->subtyp == ELSA_PCMCIA) ||
-                               (cs->subtyp == ELSA_PCMCIA_IPAC) ||
-                               (cs->subtyp == ELSA_QS1000PCI)) {
-                               return(0);
-                       } else if (cs->subtyp == ELSA_QS3000PCI) {
+                       printk(KERN_INFO "Elsa: %d timer tics in 110 msek\n",
+                              cs->hw.elsa.counter);
+                       if ((cs->hw.elsa.counter > 10) &&
+                           (cs->hw.elsa.counter < 16)) {
+                               printk(KERN_INFO "Elsa: timer and irq OK\n");
                                ret = 0;
                        } else {
-                               spin_lock_irqsave(&cs->lock, flags);
-                               cs->hw.elsa.counter = 0;
-                               cs->hw.elsa.ctrl_reg |= ELSA_ENA_TIMER_INT;
-                               cs->hw.elsa.status |= ELIRQF_TIMER_AKTIV;
-                               byteout(cs->hw.elsa.ctrl, cs->hw.elsa.ctrl_reg);
-                               byteout(cs->hw.elsa.timer, 0);
-                               spin_unlock_irqrestore(&cs->lock, flags);
-                               msleep(110);
-                               spin_lock_irqsave(&cs->lock, flags);
-                               cs->hw.elsa.ctrl_reg &= ~ELSA_ENA_TIMER_INT;
-                               byteout(cs->hw.elsa.ctrl, cs->hw.elsa.ctrl_reg);
-                               cs->hw.elsa.status &= ~ELIRQF_TIMER_AKTIV;
-                               spin_unlock_irqrestore(&cs->lock, flags);
-                               printk(KERN_INFO "Elsa: %d timer tics in 110 msek\n",
-                                      cs->hw.elsa.counter);
-                               if ((cs->hw.elsa.counter > 10) &&
-                                       (cs->hw.elsa.counter < 16)) {
-                                       printk(KERN_INFO "Elsa: timer and irq OK\n");
-                                       ret = 0;
-                               } else {
-                                       printk(KERN_WARNING
-                                              "Elsa: timer tic problem (%d/12) maybe an IRQ(%d) conflict\n",
-                                              cs->hw.elsa.counter, cs->irq);
-                                       ret = 1;
-                               }
+                               printk(KERN_WARNING
+                                      "Elsa: timer tic problem (%d/12) maybe an IRQ(%d) conflict\n",
+                                      cs->hw.elsa.counter, cs->irq);
+                               ret = 1;
                        }
+               }
 #if ARCOFI_USE
-                       if (check_arcofi(cs)) {
-                               init_modem(cs);
-                       }
+               if (check_arcofi(cs)) {
+                       init_modem(cs);
+               }
 #endif
-                       elsa_led_handler(cs);
-                       return(ret);
-               case (MDL_REMOVE | REQUEST):
-                       cs->hw.elsa.status &= 0;
-                       break;
-               case (MDL_ASSIGN | REQUEST):
-                       cs->hw.elsa.status |= ELSA_ASSIGN;
-                       break;
-               case MDL_INFO_SETUP:
-                       if ((long) arg)
-                               cs->hw.elsa.status |= 0x0200;
-                       else
-                               cs->hw.elsa.status |= 0x0100;
-                       break;
-               case MDL_INFO_CONN:
-                       if ((long) arg)
-                               cs->hw.elsa.status |= 0x2000;
-                       else
-                               cs->hw.elsa.status |= 0x1000;
-                       break;
-               case MDL_INFO_REL:
-                       if ((long) arg) {
-                               cs->hw.elsa.status &= ~0x2000;
-                               cs->hw.elsa.status &= ~0x0200;
-                       } else {
-                               cs->hw.elsa.status &= ~0x1000;
-                               cs->hw.elsa.status &= ~0x0100;
-                       }
-                       break;
+               elsa_led_handler(cs);
+               return (ret);
+       case (MDL_REMOVE | REQUEST):
+               cs->hw.elsa.status &= 0;
+               break;
+       case (MDL_ASSIGN | REQUEST):
+               cs->hw.elsa.status |= ELSA_ASSIGN;
+               break;
+       case MDL_INFO_SETUP:
+               if ((long) arg)
+                       cs->hw.elsa.status |= 0x0200;
+               else
+                       cs->hw.elsa.status |= 0x0100;
+               break;
+       case MDL_INFO_CONN:
+               if ((long) arg)
+                       cs->hw.elsa.status |= 0x2000;
+               else
+                       cs->hw.elsa.status |= 0x1000;
+               break;
+       case MDL_INFO_REL:
+               if ((long) arg) {
+                       cs->hw.elsa.status &= ~0x2000;
+                       cs->hw.elsa.status &= ~0x0200;
+               } else {
+                       cs->hw.elsa.status &= ~0x1000;
+                       cs->hw.elsa.status &= ~0x0100;
+               }
+               break;
 #if ARCOFI_USE
-               case CARD_AUX_IND:
-                       if (cs->hw.elsa.MFlag) {
-                               int len;
-                               u_char *msg;
-
-                               if (!arg)
-                                       return(0);
-                               msg = arg;
-                               len = *msg;
-                               msg++;
-                               modem_write_cmd(cs, msg, len);
-                       }
-                       break;
+       case CARD_AUX_IND:
+               if (cs->hw.elsa.MFlag) {
+                       int len;
+                       u_char *msg;
+
+                       if (!arg)
+                               return (0);
+                       msg = arg;
+                       len = *msg;
+                       msg++;
+                       modem_write_cmd(cs, msg, len);
+               }
+               break;
 #endif
        }
        if (cs->typ == ISDN_CTYPE_ELSA) {
@@ -765,14 +765,14 @@ Elsa_card_msg(struct IsdnCardState *cs, int mt, void *arg)
                        cs->hw.elsa.status &= ~ELSA_BAD_PWR;
        }
        elsa_led_handler(cs);
-       return(ret);
+       return (ret);
 }
 
 static unsigned char
 probe_elsa_adr(unsigned int adr, int typ)
 {
        int i, in1, in2, p16_1 = 0, p16_2 = 0, p8_1 = 0, p8_2 = 0, pc_1 = 0,
-        pc_2 = 0, pfp_1 = 0, pfp_2 = 0;
+               pc_2 = 0, pfp_1 = 0, pfp_2 = 0;
 
        /* In case of the elsa pcmcia card, this region is in use,
           reserved for us by the card manager. So we do not check it
@@ -822,7 +822,7 @@ probe_elsa(struct IsdnCardState *cs)
 {
        int i;
        unsigned int CARD_portlist[] =
-       {0x160, 0x170, 0x260, 0x360, 0};
+               {0x160, 0x170, 0x260, 0x360, 0};
 
        for (i = 0; CARD_portlist[i]; i++) {
                if ((cs->subtyp = probe_elsa_adr(CARD_portlist[i], cs->typ)))
@@ -867,15 +867,15 @@ setup_elsa_isa(struct IsdnCard *card)
        val = bytein(cs->hw.elsa.cfg);
        if (cs->subtyp == ELSA_PC) {
                const u_char CARD_IrqTab[8] =
-               {7, 3, 5, 9, 0, 0, 0, 0};
+                       {7, 3, 5, 9, 0, 0, 0, 0};
                cs->irq = CARD_IrqTab[(val & ELSA_IRQ_IDX_PC) >> 2];
        } else if (cs->subtyp == ELSA_PCC8) {
                const u_char CARD_IrqTab[8] =
-               {7, 3, 5, 9, 0, 0, 0, 0};
+                       {7, 3, 5, 9, 0, 0, 0, 0};
                cs->irq = CARD_IrqTab[(val & ELSA_IRQ_IDX_PCC8) >> 4];
        } else {
                const u_char CARD_IrqTab[8] =
-               {15, 10, 15, 3, 11, 5, 11, 9};
+                       {15, 10, 15, 3, 11, 5, 11, 9};
                cs->irq = CARD_IrqTab[(val & ELSA_IRQ_IDX) >> 3];
        }
        val = bytein(cs->hw.elsa.ale) & ELSA_HW_RELEASE;
@@ -894,7 +894,7 @@ setup_elsa_isa(struct IsdnCard *card)
        val = bytein(cs->hw.elsa.ale) & ELSA_S0_POWER_BAD;
        if (val) {
                printk(KERN_WARNING
-                  "Elsa: Microlink S0 bus power bad\n");
+                      "Elsa: Microlink S0 bus power bad\n");
                cs->hw.elsa.status |= ELSA_BAD_PWR;
        }
 
@@ -904,10 +904,10 @@ setup_elsa_isa(struct IsdnCard *card)
 #ifdef __ISAPNP__
 static struct isapnp_device_id elsa_ids[] __devinitdata = {
        { ISAPNP_VENDOR('E', 'L', 'S'), ISAPNP_FUNCTION(0x0133),
-         ISAPNP_VENDOR('E', 'L', 'S'), ISAPNP_FUNCTION(0x0133), 
+         ISAPNP_VENDOR('E', 'L', 'S'), ISAPNP_FUNCTION(0x0133),
          (unsigned long) "Elsa QS1000" },
        { ISAPNP_VENDOR('E', 'L', 'S'), ISAPNP_FUNCTION(0x0134),
-         ISAPNP_VENDOR('E', 'L', 'S'), ISAPNP_FUNCTION(0x0134), 
+         ISAPNP_VENDOR('E', 'L', 'S'), ISAPNP_FUNCTION(0x0134),
          (unsigned long) "Elsa QS3000" },
        { 0, }
 };
@@ -924,31 +924,31 @@ setup_elsa_isapnp(struct IsdnCard *card)
 #ifdef __ISAPNP__
        if (!card->para[1] && isapnp_present()) {
                struct pnp_dev *pnp_d;
-               while(ipid->card_vendor) {
+               while (ipid->card_vendor) {
                        if ((pnp_c = pnp_find_card(ipid->card_vendor,
-                               ipid->card_device, pnp_c))) {
+                                                  ipid->card_device, pnp_c))) {
                                pnp_d = NULL;
                                if ((pnp_d = pnp_find_dev(pnp_c,
-                                       ipid->vendor, ipid->function, pnp_d))) {
+                                                         ipid->vendor, ipid->function, pnp_d))) {
                                        int err;
 
                                        printk(KERN_INFO "HiSax: %s detected\n",
-                                               (char *)ipid->driver_data);
+                                              (char *)ipid->driver_data);
                                        pnp_disable_dev(pnp_d);
                                        err = pnp_activate_dev(pnp_d);
-                                       if (err<0) {
+                                       if (err < 0) {
                                                printk(KERN_WARNING "%s: pnp_activate_dev ret(%d)\n",
-                                                       __func__, err);
-                                               return(0);
+                                                      __func__, err);
+                                               return (0);
                                        }
                                        card->para[1] = pnp_port_start(pnp_d, 0);
                                        card->para[0] = pnp_irq(pnp_d, 0);
 
                                        if (!card->para[0] || !card->para[1]) {
                                                printk(KERN_ERR "Elsa PnP:some resources are missing %ld/%lx\n",
-                                                       card->para[0], card->para[1]);
+                                                      card->para[0], card->para[1]);
                                                pnp_disable_dev(pnp_d);
-                                               return(0);
+                                               return (0);
                                        }
                                        if (ipid->function == ISAPNP_FUNCTION(0x133))
                                                cs->subtyp = ELSA_QS1000;
@@ -957,20 +957,20 @@ setup_elsa_isapnp(struct IsdnCard *card)
                                        break;
                                } else {
                                        printk(KERN_ERR "Elsa PnP: PnP error card found, no device\n");
-                                       return(0);
+                                       return (0);
                                }
                        }
                        ipid++;
-                       pnp_c=NULL;
-               } 
+                       pnp_c = NULL;
+               }
                if (!ipid->card_vendor) {
                        printk(KERN_INFO "Elsa PnP: no ISAPnP card found\n");
-                       return(0);
+                       return (0);
                }
        }
 #endif /* __ISAPNP__ */
 
-       if (card->para[1] && card->para[0]) { 
+       if (card->para[1] && card->para[0]) {
                cs->hw.elsa.base = card->para[1];
                cs->irq = card->para[0];
                if (!cs->subtyp)
@@ -1027,8 +1027,8 @@ setup_elsa_pcmcia(struct IsdnCard *card)
 }
 
 #ifdef CONFIG_PCI
-static         struct pci_dev *dev_qs1000 __devinitdata = NULL;
-static         struct pci_dev *dev_qs3000 __devinitdata = NULL;
+static struct pci_dev *dev_qs1000 __devinitdata = NULL;
+static struct pci_dev *dev_qs3000 __devinitdata = NULL;
 
 static int __devinit
 setup_elsa_pci(struct IsdnCard *card)
@@ -1037,33 +1037,33 @@ setup_elsa_pci(struct IsdnCard *card)
 
        cs->subtyp = 0;
        if ((dev_qs1000 = hisax_find_pci_device(PCI_VENDOR_ID_ELSA,
-               PCI_DEVICE_ID_ELSA_MICROLINK, dev_qs1000))) {
+                                               PCI_DEVICE_ID_ELSA_MICROLINK, dev_qs1000))) {
                if (pci_enable_device(dev_qs1000))
-                       return(0);
+                       return (0);
                cs->subtyp = ELSA_QS1000PCI;
                cs->irq = dev_qs1000->irq;
                cs->hw.elsa.cfg = pci_resource_start(dev_qs1000, 1);
                cs->hw.elsa.base = pci_resource_start(dev_qs1000, 3);
        } else if ((dev_qs3000 = hisax_find_pci_device(PCI_VENDOR_ID_ELSA,
-               PCI_DEVICE_ID_ELSA_QS3000, dev_qs3000))) {
+                                                      PCI_DEVICE_ID_ELSA_QS3000, dev_qs3000))) {
                if (pci_enable_device(dev_qs3000))
-                       return(0);
+                       return (0);
                cs->subtyp = ELSA_QS3000PCI;
                cs->irq = dev_qs3000->irq;
                cs->hw.elsa.cfg = pci_resource_start(dev_qs3000, 1);
                cs->hw.elsa.base = pci_resource_start(dev_qs3000, 3);
        } else {
                printk(KERN_WARNING "Elsa: No PCI card found\n");
-               return(0);
+               return (0);
        }
        if (!cs->irq) {
                printk(KERN_WARNING "Elsa: No IRQ for PCI card found\n");
-               return(0);
+               return (0);
        }
 
        if (!(cs->hw.elsa.base && cs->hw.elsa.cfg)) {
                printk(KERN_WARNING "Elsa: No IO-Adr for PCI card found\n");
-               return(0);
+               return (0);
        }
        if ((cs->hw.elsa.cfg & 0xff) || (cs->hw.elsa.base & 0xf)) {
                printk(KERN_WARNING "Elsa: You may have a wrong PCI bios\n");
@@ -1071,8 +1071,8 @@ setup_elsa_pci(struct IsdnCard *card)
                printk(KERN_WARNING "Elsa: Documentation/isdn/README.HiSax\n");
        }
        cs->hw.elsa.ale  = cs->hw.elsa.base;
-       cs->hw.elsa.isac = cs->hw.elsa.base +1;
-       cs->hw.elsa.hscx = cs->hw.elsa.base +1; 
+       cs->hw.elsa.isac = cs->hw.elsa.base + 1;
+       cs->hw.elsa.hscx = cs->hw.elsa.base + 1;
        test_and_set_bit(HW_IPAC, &cs->HW_Flags);
        cs->hw.elsa.timer = 0;
        cs->hw.elsa.trig  = 0;
@@ -1104,27 +1104,27 @@ setup_elsa_common(struct IsdnCard *card)
        int bytecnt;
 
        switch (cs->subtyp) {
-               case ELSA_PC:
-               case ELSA_PCC8:
-               case ELSA_PCC16:
-               case ELSA_QS1000:
-               case ELSA_PCMCIA:
-               case ELSA_PCMCIA_IPAC:
-                       bytecnt = 8;
-                       break;
-               case ELSA_PCFPRO:
-               case ELSA_PCF:
-               case ELSA_QS3000:
-               case ELSA_QS3000PCI:
-                       bytecnt = 16;
-                       break;
-               case ELSA_QS1000PCI:
-                       bytecnt = 2;
-                       break;
-               default:
-                       printk(KERN_WARNING
-                              "Unknown ELSA subtype %d\n", cs->subtyp);
-                       return (0);
+       case ELSA_PC:
+       case ELSA_PCC8:
+       case ELSA_PCC16:
+       case ELSA_QS1000:
+       case ELSA_PCMCIA:
+       case ELSA_PCMCIA_IPAC:
+               bytecnt = 8;
+               break;
+       case ELSA_PCFPRO:
+       case ELSA_PCF:
+       case ELSA_QS3000:
+       case ELSA_QS3000PCI:
+               bytecnt = 16;
+               break;
+       case ELSA_QS1000PCI:
+               bytecnt = 2;
+               break;
+       default:
+               printk(KERN_WARNING
+                      "Unknown ELSA subtype %d\n", cs->subtyp);
+               return (0);
        }
        /* In case of the elsa pcmcia card, this region is in use,
           reserved for us by the card manager. So we do not check it
@@ -1140,8 +1140,8 @@ setup_elsa_common(struct IsdnCard *card)
                if (!request_region(cs->hw.elsa.cfg, 0x80, "elsa isdn pci")) {
                        printk(KERN_WARNING
                               "HiSax: ELSA pci port %x-%x already in use\n",
-                               cs->hw.elsa.cfg,
-                               cs->hw.elsa.cfg + 0x80);
+                              cs->hw.elsa.cfg,
+                              cs->hw.elsa.cfg + 0x80);
                        release_region(cs->hw.elsa.base, bytecnt);
                        return (0);
                }
@@ -1166,7 +1166,7 @@ setup_elsa_common(struct IsdnCard *card)
                                return (0);
                        }
                }
-               HZDELAY((HZ/100) + 1);  /* wait >=10 ms */
+               HZDELAY((HZ / 100) + 1);        /* wait >=10 ms */
                if (TimerRun(cs)) {
                        printk(KERN_WARNING "Elsa: timer do not run down\n");
                        release_io_elsa(cs);
@@ -1195,7 +1195,7 @@ setup_elsa_common(struct IsdnCard *card)
                ISACVersion(cs, "Elsa:");
                if (HscxVersion(cs, "Elsa:")) {
                        printk(KERN_WARNING
-                               "Elsa: wrong HSCX versions check IO address\n");
+                              "Elsa: wrong HSCX versions check IO address\n");
                        release_io_elsa(cs);
                        return (0);
                }
@@ -1244,7 +1244,7 @@ setup_elsa(struct IsdnCard *card)
                if (!rc)
                        return (0);
 
-       } else 
+       } else
                return (0);
 
        return setup_elsa_common(card);
index f0b6c0e..fe254e7 100644 (file)
@@ -1,39 +1,39 @@
 /*======================================================================
 
-    An elsa_cs PCMCIA client driver
+  An elsa_cs PCMCIA client driver
 
-    This driver is for the Elsa PCM ISDN Cards, i.e. the MicroLink
+  This driver is for the Elsa PCM ISDN Cards, i.e. the MicroLink
 
 
-    The contents of this file are subject to the Mozilla Public
-    License Version 1.1 (the "License"); you may not use this file
-    except in compliance with the License. You may obtain a copy of
-    the License at http://www.mozilla.org/MPL/
+  The contents of this file are subject to the Mozilla Public
+  License Version 1.1 (the "License"); you may not use this file
+  except in compliance with the License. You may obtain a copy of
+  the License at http://www.mozilla.org/MPL/
 
-    Software distributed under the License is distributed on an "AS
-    IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
-    implied. See the License for the specific language governing
-    rights and limitations under the License.
+  Software distributed under the License is distributed on an "AS
+  IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+  implied. See the License for the specific language governing
+  rights and limitations under the License.
 
-    The initial developer of the original code is David A. Hinds
-    <dahinds@users.sourceforge.net>.  Portions created by David A. Hinds
-    are Copyright (C) 1999 David A. Hinds.  All Rights Reserved.
+  The initial developer of the original code is David A. Hinds
+  <dahinds@users.sourceforge.net>.  Portions created by David A. Hinds
+  are Copyright (C) 1999 David A. Hinds.  All Rights Reserved.
 
-    Modifications from dummy_cs.c are Copyright (C) 1999-2001 Klaus
-    Lichtenwalder <Lichtenwalder@ACM.org>. All Rights Reserved.
+  Modifications from dummy_cs.c are Copyright (C) 1999-2001 Klaus
+  Lichtenwalder <Lichtenwalder@ACM.org>. All Rights Reserved.
 
-    Alternatively, the contents of this file may be used under the
-    terms of the GNU General Public License version 2 (the "GPL"), in
-    which case the provisions of the GPL are applicable instead of the
-    above.  If you wish to allow the use of your version of this file
-    only under the terms of the GPL and not to allow others to use
-    your version of this file under the MPL, indicate your decision
-    by deleting the provisions above and replace them with the notice
-    and other provisions required by the GPL.  If you do not delete
-    the provisions above, a recipient may use your version of this
-    file under either the MPL or the GPL.
+  Alternatively, the contents of this file may be used under the
+  terms of the GNU General Public License version 2 (the "GPL"), in
+  which case the provisions of the GPL are applicable instead of the
+  above.  If you wish to allow the use of your version of this file
+  only under the terms of the GPL and not to allow others to use
+  your version of this file under the MPL, indicate your decision
+  by deleting the provisions above and replace them with the notice
+  and other provisions required by the GPL.  If you do not delete
+  the provisions above, a recipient may use your version of this
+  file under either the MPL or the GPL.
 
-======================================================================*/
+  ======================================================================*/
 
 #include <linux/module.h>
 #include <linux/kernel.h>
@@ -63,32 +63,32 @@ MODULE_LICENSE("Dual MPL/GPL");
 static int protocol = 2;        /* EURO-ISDN Default */
 module_param(protocol, int, 0);
 
-static int elsa_cs_config(struct pcmcia_device *link) __devinit ;
+static int elsa_cs_config(struct pcmcia_device *link) __devinit;
 static void elsa_cs_release(struct pcmcia_device *link);
 static void elsa_cs_detach(struct pcmcia_device *p_dev) __devexit;
 
 typedef struct local_info_t {
        struct pcmcia_device    *p_dev;
-    int                 busy;
-    int                        cardnr;
+       int                 busy;
+       int                     cardnr;
 } local_info_t;
 
 static int __devinit elsa_cs_probe(struct pcmcia_device *link)
 {
-    local_info_t *local;
+       local_info_t *local;
 
-    dev_dbg(&link->dev, "elsa_cs_attach()\n");
+       dev_dbg(&link->dev, "elsa_cs_attach()\n");
 
-    /* Allocate space for private device-specific data */
-    local = kzalloc(sizeof(local_info_t), GFP_KERNEL);
-    if (!local) return -ENOMEM;
+       /* Allocate space for private device-specific data */
+       local = kzalloc(sizeof(local_info_t), GFP_KERNEL);
+       if (!local) return -ENOMEM;
 
-    local->p_dev = link;
-    link->priv = local;
+       local->p_dev = link;
+       link->priv = local;
 
-    local->cardnr = -1;
+       local->cardnr = -1;
 
-    return elsa_cs_config(link);
+       return elsa_cs_config(link);
 } /* elsa_cs_attach */
 
 static void __devexit elsa_cs_detach(struct pcmcia_device *link)
@@ -129,64 +129,64 @@ static int elsa_cs_configcheck(struct pcmcia_device *p_dev, void *priv_data)
 
 static int __devinit elsa_cs_config(struct pcmcia_device *link)
 {
-    int i;
-    IsdnCard_t icard;
-
-    dev_dbg(&link->dev, "elsa_config(0x%p)\n", link);
-
-    link->config_flags |= CONF_ENABLE_IRQ | CONF_AUTO_SET_IO;
-
-    i = pcmcia_loop_config(link, elsa_cs_configcheck, NULL);
-    if (i != 0)
-       goto failed;
-
-    if (!link->irq)
-       goto failed;
-
-    i = pcmcia_enable_device(link);
-    if (i != 0)
-       goto failed;
-
-    icard.para[0] = link->irq;
-    icard.para[1] = link->resource[0]->start;
-    icard.protocol = protocol;
-    icard.typ = ISDN_CTYPE_ELSA_PCMCIA;
-    
-    i = hisax_init_pcmcia(link, &(((local_info_t*)link->priv)->busy), &icard);
-    if (i < 0) {
-       printk(KERN_ERR "elsa_cs: failed to initialize Elsa "
-               "PCMCIA %d with %pR\n", i, link->resource[0]);
-       elsa_cs_release(link);
-    } else
-       ((local_info_t*)link->priv)->cardnr = i;
-
-    return 0;
+       int i;
+       IsdnCard_t icard;
+
+       dev_dbg(&link->dev, "elsa_config(0x%p)\n", link);
+
+       link->config_flags |= CONF_ENABLE_IRQ | CONF_AUTO_SET_IO;
+
+       i = pcmcia_loop_config(link, elsa_cs_configcheck, NULL);
+       if (i != 0)
+               goto failed;
+
+       if (!link->irq)
+               goto failed;
+
+       i = pcmcia_enable_device(link);
+       if (i != 0)
+               goto failed;
+
+       icard.para[0] = link->irq;
+       icard.para[1] = link->resource[0]->start;
+       icard.protocol = protocol;
+       icard.typ = ISDN_CTYPE_ELSA_PCMCIA;
+
+       i = hisax_init_pcmcia(link, &(((local_info_t *)link->priv)->busy), &icard);
+       if (i < 0) {
+               printk(KERN_ERR "elsa_cs: failed to initialize Elsa "
+                      "PCMCIA %d with %pR\n", i, link->resource[0]);
+               elsa_cs_release(link);
+       } else
+               ((local_info_t *)link->priv)->cardnr = i;
+
+       return 0;
 failed:
-    elsa_cs_release(link);
-    return -ENODEV;
+       elsa_cs_release(link);
+       return -ENODEV;
 } /* elsa_cs_config */
 
 static void elsa_cs_release(struct pcmcia_device *link)
 {
-    local_info_t *local = link->priv;
+       local_info_t *local = link->priv;
 
-    dev_dbg(&link->dev, "elsa_cs_release(0x%p)\n", link);
+       dev_dbg(&link->dev, "elsa_cs_release(0x%p)\n", link);
 
-    if (local) {
-       if (local->cardnr >= 0) {
-           /* no unregister function with hisax */
-           HiSax_closecard(local->cardnr);
+       if (local) {
+               if (local->cardnr >= 0) {
+                       /* no unregister function with hisax */
+                       HiSax_closecard(local->cardnr);
+               }
        }
-    }
 
-    pcmcia_disable_device(link);
+       pcmcia_disable_device(link);
 } /* elsa_cs_release */
 
 static int elsa_suspend(struct pcmcia_device *link)
 {
        local_info_t *dev = link->priv;
 
-        dev->busy = 1;
+       dev->busy = 1;
 
        return 0;
 }
@@ -195,7 +195,7 @@ static int elsa_resume(struct pcmcia_device *link)
 {
        local_info_t *dev = link->priv;
 
-        dev->busy = 0;
+       dev->busy = 0;
 
        return 0;
 }
index 3fa9f61..d4c98d3 100644 (file)
@@ -12,9 +12,9 @@
 #include <linux/slab.h>
 
 #define MAX_MODEM_BUF  256
-#define WAKEUP_CHARS   (MAX_MODEM_BUF/2)
+#define WAKEUP_CHARS   (MAX_MODEM_BUF / 2)
 #define RS_ISR_PASS_LIMIT 256
-#define BASE_BAUD ( 1843200 / 16 )
+#define BASE_BAUD (1843200 / 16)
 
 //#define SERIAL_DEBUG_OPEN 1
 //#define SERIAL_DEBUG_INTR 1
@@ -27,8 +27,8 @@
 
 #ifdef SERIAL_DEBUG_REG
 static u_char deb[32];
-const char *ModemIn[] = {"RBR","IER","IIR","LCR","MCR","LSR","MSR","SCR"};
-const char *ModemOut[] = {"THR","IER","FCR","LCR","MCR","LSR","MSR","SCR"};
+const char *ModemIn[] = {"RBR", "IER", "IIR", "LCR", "MCR", "LSR", "MSR", "SCR"};
+const char *ModemOut[] = {"THR", "IER", "FCR", "LCR", "MCR", "LSR", "MSR", "SCR"};
 #endif
 
 static char *MInit_1 = "AT&F&C1E0&D2\r\0";
@@ -49,8 +49,8 @@ static inline unsigned int serial_in(struct IsdnCardState *cs, int offset)
 {
 #ifdef SERIAL_DEBUG_REG
        u_int val = inb(cs->hw.elsa.base + 8 + offset);
-       debugl1(cs,"in   %s %02x",ModemIn[offset], val);
-       return(val);
+       debugl1(cs, "in   %s %02x", ModemIn[offset], val);
+       return (val);
 #else
        return inb(cs->hw.elsa.base + 8 + offset);
 #endif
@@ -61,12 +61,12 @@ static inline unsigned int serial_inp(struct IsdnCardState *cs, int offset)
 #ifdef SERIAL_DEBUG_REG
 #ifdef ELSA_SERIAL_NOPAUSE_IO
        u_int val = inb(cs->hw.elsa.base + 8 + offset);
-       debugl1(cs,"inp  %s %02x",ModemIn[offset], val);
+       debugl1(cs, "inp  %s %02x", ModemIn[offset], val);
 #else
        u_int val = inb_p(cs->hw.elsa.base + 8 + offset);
-       debugl1(cs,"inP  %s %02x",ModemIn[offset], val);
+       debugl1(cs, "inP  %s %02x", ModemIn[offset], val);
 #endif
-       return(val);
+       return (val);
 #else
 #ifdef ELSA_SERIAL_NOPAUSE_IO
        return inb(cs->hw.elsa.base + 8 + offset);
@@ -79,7 +79,7 @@ static inline unsigned int serial_inp(struct IsdnCardState *cs, int offset)
 static inline void serial_out(struct IsdnCardState *cs, int offset, int value)
 {
 #ifdef SERIAL_DEBUG_REG
-       debugl1(cs,"out  %s %02x",ModemOut[offset], value);
+       debugl1(cs, "out  %s %02x", ModemOut[offset], value);
 #endif
        outb(value, cs->hw.elsa.base + 8 + offset);
 }
@@ -89,15 +89,15 @@ static inline void serial_outp(struct IsdnCardState *cs, int offset,
 {
 #ifdef SERIAL_DEBUG_REG
 #ifdef ELSA_SERIAL_NOPAUSE_IO
-       debugl1(cs,"outp %s %02x",ModemOut[offset], value);
+       debugl1(cs, "outp %s %02x", ModemOut[offset], value);
 #else
-       debugl1(cs,"outP %s %02x",ModemOut[offset], value);
+       debugl1(cs, "outP %s %02x", ModemOut[offset], value);
 #endif
 #endif
 #ifdef ELSA_SERIAL_NOPAUSE_IO
        outb(value, cs->hw.elsa.base + 8 + offset);
 #else
-       outb_p(value, cs->hw.elsa.base + 8 + offset);
+       outb_p(value, cs->hw.elsa.base + 8 + offset);
 #endif
 }
 
@@ -131,7 +131,7 @@ static void change_speed(struct IsdnCardState *cs, int baud)
        cs->hw.elsa.IER |= UART_IER_MSI;
        serial_outp(cs, UART_IER, cs->hw.elsa.IER);
 
-       debugl1(cs,"modem quot=0x%x", quot);
+       debugl1(cs, "modem quot=0x%x", quot);
        serial_outp(cs, UART_LCR, cval | UART_LCR_DLAB);/* set DLAB */
        serial_outp(cs, UART_DLL, quot & 0xff);         /* LS of divisor */
        serial_outp(cs, UART_DLM, quot >> 8);           /* MS of divisor */
@@ -141,7 +141,7 @@ static void change_speed(struct IsdnCardState *cs, int baud)
 
 static int mstartup(struct IsdnCardState *cs)
 {
-       int     retval=0;
+       int retval = 0;
 
        /*
         * Clear the FIFO buffers and disable them
@@ -158,7 +158,7 @@ static int mstartup(struct IsdnCardState *cs)
                retval = -ENODEV;
                goto errout;
        }
-       
+
        /*
         * Clear the interrupt registers.
         */
@@ -167,20 +167,20 @@ static int mstartup(struct IsdnCardState *cs)
        (void) serial_inp(cs, UART_MSR);
 
        /*
-        * Now, initialize the UART 
+        * Now, initialize the UART
         */
        serial_outp(cs, UART_LCR, UART_LCR_WLEN8);      /* reset DLAB */
 
        cs->hw.elsa.MCR = 0;
        cs->hw.elsa.MCR = UART_MCR_DTR | UART_MCR_RTS | UART_MCR_OUT2;
        serial_outp(cs, UART_MCR, cs->hw.elsa.MCR);
-       
+
        /*
         * Finally, enable interrupts
         */
        cs->hw.elsa.IER = UART_IER_MSI | UART_IER_RLSI | UART_IER_RDI;
        serial_outp(cs, UART_IER, cs->hw.elsa.IER);     /* enable interrupts */
-       
+
        /*
         * And clear the interrupt registers again for luck.
         */
@@ -190,7 +190,7 @@ static int mstartup(struct IsdnCardState *cs)
        (void)serial_inp(cs, UART_MSR);
 
        cs->hw.elsa.transcnt = cs->hw.elsa.transp = 0;
-       cs->hw.elsa.rcvcnt = cs->hw.elsa.rcvp =0;
+       cs->hw.elsa.rcvcnt = cs->hw.elsa.rcvp = 0;
 
        /*
         * and set the speed of the serial port
@@ -211,7 +211,7 @@ static void mshutdown(struct IsdnCardState *cs)
 #ifdef SERIAL_DEBUG_OPEN
        printk(KERN_DEBUG"Shutting down serial ....");
 #endif
-       
+
        /*
         * clear delta_msr_wait queue to avoid mem leaks: we may free the irq
         * here so the queue might never be waken up
@@ -220,17 +220,17 @@ static void mshutdown(struct IsdnCardState *cs)
        cs->hw.elsa.IER = 0;
        serial_outp(cs, UART_IER, 0x00);        /* disable all intrs */
        cs->hw.elsa.MCR &= ~UART_MCR_OUT2;
-       
+
        /* disable break condition */
        serial_outp(cs, UART_LCR, serial_inp(cs, UART_LCR) & ~UART_LCR_SBC);
-       
-       cs->hw.elsa.MCR &= ~(UART_MCR_DTR|UART_MCR_RTS);
+
+       cs->hw.elsa.MCR &= ~(UART_MCR_DTR | UART_MCR_RTS);
        serial_outp(cs, UART_MCR, cs->hw.elsa.MCR);
 
-       /* disable FIFO's */    
+       /* disable FIFO's */
        serial_outp(cs, UART_FCR, (UART_FCR_CLEAR_RCVR | UART_FCR_CLEAR_XMIT));
        serial_inp(cs, UART_RX);    /* read data port to reset things */
-       
+
 #ifdef SERIAL_DEBUG_OPEN
        printk(" done\n");
 #endif
@@ -238,10 +238,10 @@ static void mshutdown(struct IsdnCardState *cs)
 
 static inline int
 write_modem(struct BCState *bcs) {
-       int ret=0;
+       int ret = 0;
        struct IsdnCardState *cs = bcs->cs;
        int count, len, fp;
-       
+
        if (!bcs->tx_skb)
                return 0;
        if (bcs->tx_skb->len <= 0)
@@ -250,7 +250,7 @@ write_modem(struct BCState *bcs) {
        if (len > MAX_MODEM_BUF - cs->hw.elsa.transcnt)
                len = MAX_MODEM_BUF - cs->hw.elsa.transcnt;
        fp = cs->hw.elsa.transcnt + cs->hw.elsa.transp;
-       fp &= (MAX_MODEM_BUF -1);
+       fp &= (MAX_MODEM_BUF - 1);
        count = len;
        if (count > MAX_MODEM_BUF - fp) {
                count = MAX_MODEM_BUF - fp;
@@ -267,25 +267,25 @@ write_modem(struct BCState *bcs) {
        skb_pull(bcs->tx_skb, count);
        cs->hw.elsa.transcnt += count;
        ret += count;
-       
-       if (cs->hw.elsa.transcnt && 
+
+       if (cs->hw.elsa.transcnt &&
            !(cs->hw.elsa.IER & UART_IER_THRI)) {
-                       cs->hw.elsa.IER |= UART_IER_THRI;
+               cs->hw.elsa.IER |= UART_IER_THRI;
                serial_outp(cs, UART_IER, cs->hw.elsa.IER);
        }
-       return(ret);
+       return (ret);
 }
 
 static inline void
 modem_fill(struct BCState *bcs) {
-               
+
        if (bcs->tx_skb) {
                if (bcs->tx_skb->len) {
                        write_modem(bcs);
                        return;
                } else {
-                       if (test_bit(FLG_LLI_L1WAKEUP,&bcs->st->lli.flag) &&
-                               (PACKET_NOACK != bcs->tx_skb->pkt_type)) {
+                       if (test_bit(FLG_LLI_L1WAKEUP, &bcs->st->lli.flag) &&
+                           (PACKET_NOACK != bcs->tx_skb->pkt_type)) {
                                u_long  flags;
                                spin_lock_irqsave(&bcs->aclock, flags);
                                bcs->ackcnt += bcs->hw.hscx.count;
@@ -322,7 +322,7 @@ static inline void receive_chars(struct IsdnCardState *cs,
 #endif
                if (*status & (UART_LSR_BI | UART_LSR_PE |
                               UART_LSR_FE | UART_LSR_OE)) {
-                                       
+
 #ifdef SERIAL_DEBUG_INTR
                        printk("handling exept....");
 #endif
@@ -333,9 +333,9 @@ static inline void receive_chars(struct IsdnCardState *cs,
                if (!(skb = dev_alloc_skb(cs->hw.elsa.rcvcnt)))
                        printk(KERN_WARNING "ElsaSER: receive out of memory\n");
                else {
-                       memcpy(skb_put(skb, cs->hw.elsa.rcvcnt), cs->hw.elsa.rcvbuf, 
-                               cs->hw.elsa.rcvcnt);
-                       skb_queue_tail(& cs->hw.elsa.bcs->rqueue, skb);
+                       memcpy(skb_put(skb, cs->hw.elsa.rcvcnt), cs->hw.elsa.rcvbuf,
+                              cs->hw.elsa.rcvcnt);
+                       skb_queue_tail(&cs->hw.elsa.bcs->rqueue, skb);
                }
                schedule_event(cs->hw.elsa.bcs, B_RCVBUFREADY);
        } else {
@@ -352,10 +352,10 @@ static inline void receive_chars(struct IsdnCardState *cs,
 static inline void transmit_chars(struct IsdnCardState *cs, int *intr_done)
 {
        int count;
-       
-       debugl1(cs, "transmit_chars: p(%x) cnt(%x)", cs->hw.elsa.transp, 
+
+       debugl1(cs, "transmit_chars: p(%x) cnt(%x)", cs->hw.elsa.transp,
                cs->hw.elsa.transcnt);
-       
+
        if (cs->hw.elsa.transcnt <= 0) {
                cs->hw.elsa.IER &= ~UART_IER_THRI;
                serial_out(cs, UART_IER, cs->hw.elsa.IER);
@@ -365,11 +365,11 @@ static inline void transmit_chars(struct IsdnCardState *cs, int *intr_done)
        do {
                serial_outp(cs, UART_TX, cs->hw.elsa.transbuf[cs->hw.elsa.transp++]);
                if (cs->hw.elsa.transp >= MAX_MODEM_BUF)
-                       cs->hw.elsa.transp=0;
+                       cs->hw.elsa.transp = 0;
                if (--cs->hw.elsa.transcnt <= 0)
                        break;
        } while (--count > 0);
-       if ((cs->hw.elsa.transcnt < WAKEUP_CHARS) && (cs->hw.elsa.MFlag==2))
+       if ((cs->hw.elsa.transcnt < WAKEUP_CHARS) && (cs->hw.elsa.MFlag == 2))
                modem_fill(cs->hw.elsa.bcs);
 
 #ifdef SERIAL_DEBUG_INTR
@@ -388,14 +388,14 @@ static void rs_interrupt_elsa(struct IsdnCardState *cs)
 {
        int status, iir, msr;
        int pass_counter = 0;
-       
+
 #ifdef SERIAL_DEBUG_INTR
        printk(KERN_DEBUG "rs_interrupt_single(%d)...", cs->irq);
 #endif
 
        do {
                status = serial_inp(cs, UART_LSR);
-               debugl1(cs,"rs LSR %02x", status);
+               debugl1(cs, "rs LSR %02x", status);
 #ifdef SERIAL_DEBUG_INTR
                printk("status = %x...", status);
 #endif
@@ -408,10 +408,10 @@ static void rs_interrupt_elsa(struct IsdnCardState *cs)
                        break;
                }
                iir = serial_inp(cs, UART_IIR);
-               debugl1(cs,"rs IIR %02x", iir);
+               debugl1(cs, "rs IIR %02x", iir);
                if ((iir & 0xf) == 0) {
                        msr = serial_inp(cs, UART_MSR);
-                       debugl1(cs,"rs MSR %02x", msr);
+                       debugl1(cs, "rs MSR %02x", msr);
                }
        } while (!(iir & UART_IIR_NO_INT));
 #ifdef SERIAL_DEBUG_INTR
@@ -447,14 +447,14 @@ static void
 modem_write_cmd(struct IsdnCardState *cs, u_char *buf, int len) {
        int count, fp;
        u_char *msg = buf;
-       
+
        if (!len)
                return;
        if (len > (MAX_MODEM_BUF - cs->hw.elsa.transcnt)) {
                return;
        }
        fp = cs->hw.elsa.transcnt + cs->hw.elsa.transp;
-       fp &= (MAX_MODEM_BUF -1);
+       fp &= (MAX_MODEM_BUF - 1);
        count = len;
        if (count > MAX_MODEM_BUF - fp) {
                count = MAX_MODEM_BUF - fp;
@@ -466,7 +466,7 @@ modem_write_cmd(struct IsdnCardState *cs, u_char *buf, int len) {
        }
        memcpy(cs->hw.elsa.transbuf + fp, msg, count);
        cs->hw.elsa.transcnt += count;
-       if (cs->hw.elsa.transcnt && 
+       if (cs->hw.elsa.transcnt &&
            !(cs->hw.elsa.IER & UART_IER_THRI)) {
                cs->hw.elsa.IER |= UART_IER_THRI;
                serial_outp(cs, UART_IER, cs->hw.elsa.IER);
@@ -480,43 +480,43 @@ modem_set_init(struct IsdnCardState *cs) {
 #define RCV_DELAY 20
        modem_write_cmd(cs, MInit_1, strlen(MInit_1));
        timeout = 1000;
-       while(timeout-- && cs->hw.elsa.transcnt)
+       while (timeout-- && cs->hw.elsa.transcnt)
                udelay(1000);
        debugl1(cs, "msi tout=%d", timeout);
        mdelay(RCV_DELAY);
        modem_write_cmd(cs, MInit_2, strlen(MInit_2));
        timeout = 1000;
-       while(timeout-- && cs->hw.elsa.transcnt)
+       while (timeout-- && cs->hw.elsa.transcnt)
                udelay(1000);
        debugl1(cs, "msi tout=%d", timeout);
        mdelay(RCV_DELAY);
        modem_write_cmd(cs, MInit_3, strlen(MInit_3));
        timeout = 1000;
-       while(timeout-- && cs->hw.elsa.transcnt)
+       while (timeout-- && cs->hw.elsa.transcnt)
                udelay(1000);
        debugl1(cs, "msi tout=%d", timeout);
        mdelay(RCV_DELAY);
        modem_write_cmd(cs, MInit_4, strlen(MInit_4));
        timeout = 1000;
-       while(timeout-- && cs->hw.elsa.transcnt)
+       while (timeout-- && cs->hw.elsa.transcnt)
                udelay(1000);
        debugl1(cs, "msi tout=%d", timeout);
        mdelay(RCV_DELAY);
        modem_write_cmd(cs, MInit_5, strlen(MInit_5));
        timeout = 1000;
-       while(timeout-- && cs->hw.elsa.transcnt)
+       while (timeout-- && cs->hw.elsa.transcnt)
                udelay(1000);
        debugl1(cs, "msi tout=%d", timeout);
        mdelay(RCV_DELAY);
        modem_write_cmd(cs, MInit_6, strlen(MInit_6));
        timeout = 1000;
-       while(timeout-- && cs->hw.elsa.transcnt)
+       while (timeout-- && cs->hw.elsa.transcnt)
                udelay(1000);
        debugl1(cs, "msi tout=%d", timeout);
        mdelay(RCV_DELAY);
        modem_write_cmd(cs, MInit_7, strlen(MInit_7));
        timeout = 1000;
-       while(timeout-- && cs->hw.elsa.transcnt)
+       while (timeout-- && cs->hw.elsa.transcnt)
                udelay(1000);
        debugl1(cs, "msi tout=%d", timeout);
        mdelay(RCV_DELAY);
@@ -529,7 +529,7 @@ modem_set_dial(struct IsdnCardState *cs, int outgoing) {
 
        modem_write_cmd(cs, MInit_speed28800, strlen(MInit_speed28800));
        timeout = 1000;
-       while(timeout-- && cs->hw.elsa.transcnt)
+       while (timeout-- && cs->hw.elsa.transcnt)
                udelay(1000);
        debugl1(cs, "msi tout=%d", timeout);
        mdelay(RCV_DELAY);
@@ -538,7 +538,7 @@ modem_set_dial(struct IsdnCardState *cs, int outgoing) {
        else
                modem_write_cmd(cs, MInit_dialin, strlen(MInit_dialin));
        timeout = 1000;
-       while(timeout-- && cs->hw.elsa.transcnt)
+       while (timeout-- && cs->hw.elsa.transcnt)
                udelay(1000);
        debugl1(cs, "msi tout=%d", timeout);
        mdelay(RCV_DELAY);
@@ -568,15 +568,15 @@ modem_l2l1(struct PStack *st, int pr, void *arg)
                set_arcofi(bcs->cs, st->l1.bc);
                mstartup(bcs->cs);
                modem_set_dial(bcs->cs, test_bit(FLG_ORIG, &st->l2.flag));
-               bcs->cs->hw.elsa.MFlag=2;
+               bcs->cs->hw.elsa.MFlag = 2;
        } else if (pr == (PH_DEACTIVATE | REQUEST)) {
                test_and_clear_bit(BC_FLG_ACTIV, &bcs->Flag);
                bcs->cs->dc.isac.arcofi_bc = st->l1.bc;
                arcofi_fsm(bcs->cs, ARCOFI_START, &ARCOFI_XOP_0);
                interruptible_sleep_on(&bcs->cs->dc.isac.arcofi_wait);
-               bcs->cs->hw.elsa.MFlag=1;
+               bcs->cs->hw.elsa.MFlag = 1;
        } else {
-               printk(KERN_WARNING"ElsaSer: unknown pr %x\n", pr);
+               printk(KERN_WARNING "ElsaSer: unknown pr %x\n", pr);
        }
 }
 
@@ -586,27 +586,27 @@ setstack_elsa(struct PStack *st, struct BCState *bcs)
 
        bcs->channel = st->l1.bc;
        switch (st->l1.mode) {
-               case L1_MODE_HDLC:
-               case L1_MODE_TRANS:
-                       if (open_hscxstate(st->l1.hardware, bcs))
-                               return (-1);
-                       st->l2.l2l1 = hscx_l2l1;
-                       break;
-               case L1_MODE_MODEM:
-                       bcs->mode = L1_MODE_MODEM;
-                       if (!test_and_set_bit(BC_FLG_INIT, &bcs->Flag)) {
-                               bcs->hw.hscx.rcvbuf = bcs->cs->hw.elsa.rcvbuf;
-                               skb_queue_head_init(&bcs->rqueue);
-                               skb_queue_head_init(&bcs->squeue);
-                       }
-                       bcs->tx_skb = NULL;
-                       test_and_clear_bit(BC_FLG_BUSY, &bcs->Flag);
-                       bcs->event = 0;
-                       bcs->hw.hscx.rcvidx = 0;
-                       bcs->tx_cnt = 0;
-                       bcs->cs->hw.elsa.bcs = bcs;
-                       st->l2.l2l1 = modem_l2l1;
-                       break;
+       case L1_MODE_HDLC:
+       case L1_MODE_TRANS:
+               if (open_hscxstate(st->l1.hardware, bcs))
+                       return (-1);
+               st->l2.l2l1 = hscx_l2l1;
+               break;
+       case L1_MODE_MODEM:
+               bcs->mode = L1_MODE_MODEM;
+               if (!test_and_set_bit(BC_FLG_INIT, &bcs->Flag)) {
+                       bcs->hw.hscx.rcvbuf = bcs->cs->hw.elsa.rcvbuf;
+                       skb_queue_head_init(&bcs->rqueue);
+                       skb_queue_head_init(&bcs->squeue);
+               }
+               bcs->tx_skb = NULL;
+               test_and_clear_bit(BC_FLG_BUSY, &bcs->Flag);
+               bcs->event = 0;
+               bcs->hw.hscx.rcvidx = 0;
+               bcs->tx_cnt = 0;
+               bcs->cs->hw.elsa.bcs = bcs;
+               st->l2.l2l1 = modem_l2l1;
+               break;
        }
        st->l1.bcs = bcs;
        setstack_manager(st);
@@ -623,15 +623,15 @@ init_modem(struct IsdnCardState *cs) {
        cs->bcs[0].BC_Close = close_elsastate;
        cs->bcs[1].BC_Close = close_elsastate;
        if (!(cs->hw.elsa.rcvbuf = kmalloc(MAX_MODEM_BUF,
-               GFP_ATOMIC))) {
+                                          GFP_ATOMIC))) {
                printk(KERN_WARNING
-                       "Elsa: No modem mem hw.elsa.rcvbuf\n");
+                      "Elsa: No modem mem hw.elsa.rcvbuf\n");
                return;
        }
        if (!(cs->hw.elsa.transbuf = kmalloc(MAX_MODEM_BUF,
-               GFP_ATOMIC))) {
+                                            GFP_ATOMIC))) {
                printk(KERN_WARNING
-                       "Elsa: No modem mem hw.elsa.transbuf\n");
+                      "Elsa: No modem mem hw.elsa.transbuf\n");
                kfree(cs->hw.elsa.rcvbuf);
                cs->hw.elsa.rcvbuf = NULL;
                return;
index f55d29d..b1e38b5 100644 (file)
@@ -97,13 +97,13 @@ static unsigned char
 ReadByteAmd7930(struct IsdnCardState *cs, unsigned char offset)
 {
        /* direct register */
-       if(offset < 8)
-               return (inb(cs->hw.njet.isac + 4*offset));
+       if (offset < 8)
+               return (inb(cs->hw.njet.isac + 4 * offset));
 
        /* indirect register */
        else {
-               outb(offset, cs->hw.njet.isac + 4*AMD_CR);
-               return(inb(cs->hw.njet.isac + 4*AMD_DR));
+               outb(offset, cs->hw.njet.isac + 4 * AMD_CR);
+               return (inb(cs->hw.njet.isac + 4 * AMD_DR));
        }
 }
 
@@ -112,29 +112,29 @@ static void
 WriteByteAmd7930(struct IsdnCardState *cs, unsigned char offset, unsigned char value)
 {
        /* direct register */
-       if(offset < 8)
-               outb(value, cs->hw.njet.isac + 4*offset);
+       if (offset < 8)
+               outb(value, cs->hw.njet.isac + 4 * offset);
 
        /* indirect register */
        else {
-               outb(offset, cs->hw.njet.isac + 4*AMD_CR);
-               outb(value, cs->hw.njet.isac + 4*AMD_DR);
+               outb(offset, cs->hw.njet.isac + 4 * AMD_CR);
+               outb(value, cs->hw.njet.isac + 4 * AMD_DR);
        }
 }
 
 
 static void
 enpci_setIrqMask(struct IsdnCardState *cs, unsigned char val) {
-        if (!val)
-               outb(0x00, cs->hw.njet.base+NETJET_IRQMASK1);
-        else
-               outb(TJ_AMD_IRQ, cs->hw.njet.base+NETJET_IRQMASK1);
+       if (!val)
+               outb(0x00, cs->hw.njet.base + NETJET_IRQMASK1);
+       else
+               outb(TJ_AMD_IRQ, cs->hw.njet.base + NETJET_IRQMASK1);
 }
 
 
 static unsigned char dummyrr(struct IsdnCardState *cs, int chan, unsigned char off)
 {
-        return(5);
+       return (5);
 }
 
 static void dummywr(struct IsdnCardState *cs, int chan, unsigned char off, unsigned char value)
@@ -173,70 +173,70 @@ static int
 enpci_card_msg(struct IsdnCardState *cs, int mt, void *arg)
 {
        u_long flags;
-        unsigned char *chan;
+       unsigned char *chan;
 
        if (cs->debug & L1_DEB_ISAC)
                debugl1(cs, "enter:now PCI: card_msg: 0x%04X", mt);
 
-        switch (mt) {
-               case CARD_RESET:
-                       spin_lock_irqsave(&cs->lock, flags);
-                       reset_enpci(cs);
-                        Amd7930_init(cs);
-                        spin_unlock_irqrestore(&cs->lock, flags);
-                       break;
-               case CARD_RELEASE:
-                       release_io_netjet(cs);
-                       break;
-               case CARD_INIT:
-                       reset_enpci(cs);
-                       inittiger(cs);
-                       /* irq must be on here */
-                       Amd7930_init(cs);
-                       break;
-               case CARD_TEST:
-                       break;
-                case MDL_ASSIGN:
-                        /* TEI assigned, LED1 on */
-                        cs->hw.njet.auxd = TJ_AMD_IRQ << 1;
-                        outb(cs->hw.njet.auxd, cs->hw.njet.base + NETJET_AUXDATA);
-                        break;
-                case MDL_REMOVE:
-                        /* TEI removed, LEDs off */
-                       cs->hw.njet.auxd = 0;
-                        outb(0x00, cs->hw.njet.base + NETJET_AUXDATA);
-                        break;
-                case MDL_BC_ASSIGN:
-                        /* activate B-channel */
-                        chan = (unsigned char *)arg;
-
-                        if (cs->debug & L1_DEB_ISAC)
-                               debugl1(cs, "enter:now PCI: assign phys. BC %d in AMD LMR1", *chan);
-
-                        cs->dc.amd7930.ph_command(cs, (cs->dc.amd7930.lmr1 | (*chan + 1)), "MDL_BC_ASSIGN");
-                        /* at least one b-channel in use, LED 2 on */
-                        cs->hw.njet.auxd |= TJ_AMD_IRQ << 2;
-                        outb(cs->hw.njet.auxd, cs->hw.njet.base + NETJET_AUXDATA);
-                        break;
-                case MDL_BC_RELEASE:
-                        /* deactivate B-channel */
-                        chan = (unsigned char *)arg;
-
-                        if (cs->debug & L1_DEB_ISAC)
-                               debugl1(cs, "enter:now PCI: release phys. BC %d in Amd LMR1", *chan);
-
-                        cs->dc.amd7930.ph_command(cs, (cs->dc.amd7930.lmr1 & ~(*chan + 1)), "MDL_BC_RELEASE");
-                        /* no b-channel active -> LED2 off */
-                        if (!(cs->dc.amd7930.lmr1 & 3)) {
-                                cs->hw.njet.auxd &= ~(TJ_AMD_IRQ << 2);
-                                outb(cs->hw.njet.auxd, cs->hw.njet.base + NETJET_AUXDATA);
-                        }
-                        break;
-                default:
-                        break;
+       switch (mt) {
+       case CARD_RESET:
+               spin_lock_irqsave(&cs->lock, flags);
+               reset_enpci(cs);
+               Amd7930_init(cs);
+               spin_unlock_irqrestore(&cs->lock, flags);
+               break;
+       case CARD_RELEASE:
+               release_io_netjet(cs);
+               break;
+       case CARD_INIT:
+               reset_enpci(cs);
+               inittiger(cs);
+               /* irq must be on here */
+               Amd7930_init(cs);
+               break;
+       case CARD_TEST:
+               break;
+       case MDL_ASSIGN:
+               /* TEI assigned, LED1 on */
+               cs->hw.njet.auxd = TJ_AMD_IRQ << 1;
+               outb(cs->hw.njet.auxd, cs->hw.njet.base + NETJET_AUXDATA);
+               break;
+       case MDL_REMOVE:
+               /* TEI removed, LEDs off */
+               cs->hw.njet.auxd = 0;
+               outb(0x00, cs->hw.njet.base + NETJET_AUXDATA);
+               break;
+       case MDL_BC_ASSIGN:
+               /* activate B-channel */
+               chan = (unsigned char *)arg;
+
+               if (cs->debug & L1_DEB_ISAC)
+                       debugl1(cs, "enter:now PCI: assign phys. BC %d in AMD LMR1", *chan);
+
+               cs->dc.amd7930.ph_command(cs, (cs->dc.amd7930.lmr1 | (*chan + 1)), "MDL_BC_ASSIGN");
+               /* at least one b-channel in use, LED 2 on */
+               cs->hw.njet.auxd |= TJ_AMD_IRQ << 2;
+               outb(cs->hw.njet.auxd, cs->hw.njet.base + NETJET_AUXDATA);
+               break;
+       case MDL_BC_RELEASE:
+               /* deactivate B-channel */
+               chan = (unsigned char *)arg;
+
+               if (cs->debug & L1_DEB_ISAC)
+                       debugl1(cs, "enter:now PCI: release phys. BC %d in Amd LMR1", *chan);
+
+               cs->dc.amd7930.ph_command(cs, (cs->dc.amd7930.lmr1 & ~(*chan + 1)), "MDL_BC_RELEASE");
+               /* no b-channel active -> LED2 off */
+               if (!(cs->dc.amd7930.lmr1 & 3)) {
+                       cs->hw.njet.auxd &= ~(TJ_AMD_IRQ << 2);
+                       outb(cs->hw.njet.auxd, cs->hw.njet.base + NETJET_AUXDATA);
+               }
+               break;
+       default:
+               break;
 
        }
-       return(0);
+       return (0);
 }
 
 static irqreturn_t
@@ -249,32 +249,32 @@ enpci_interrupt(int intno, void *dev_id)
        spin_lock_irqsave(&cs->lock, flags);
        s1val = inb(cs->hw.njet.base + NETJET_IRQSTAT1);
 
-        /* AMD threw an interrupt */
+       /* AMD threw an interrupt */
        if (!(s1val & TJ_AMD_IRQ)) {
-                /* read and clear interrupt-register */
+               /* read and clear interrupt-register */
                ir = ReadByteAmd7930(cs, 0x00);
                Amd7930_interrupt(cs, ir);
                s1val = 1;
        } else
                s1val = 0;
        s0val = inb(cs->hw.njet.base + NETJET_IRQSTAT0);
-       if ((s0val | s1val)==0) { // shared IRQ
+       if ((s0val | s1val) == 0) { // shared IRQ
                spin_unlock_irqrestore(&cs->lock, flags);
                return IRQ_NONE;
-       } 
+       }
        if (s0val)
                outb(s0val, cs->hw.njet.base + NETJET_IRQSTAT0);
 
        /* DMA-Interrupt: B-channel-stuff */
        /* set bits in sval to indicate which page is free */
        if (inl(cs->hw.njet.base + NETJET_DMA_WRITE_ADR) <
-               inl(cs->hw.njet.base + NETJET_DMA_WRITE_IRQ))
+           inl(cs->hw.njet.base + NETJET_DMA_WRITE_IRQ))
                /* the 2nd write page is free */
                s0val = 0x08;
        else    /* the 1st write page is free */
                s0val = 0x04;
        if (inl(cs->hw.njet.base + NETJET_DMA_READ_ADR) <
-               inl(cs->hw.njet.base + NETJET_DMA_READ_IRQ))
+           inl(cs->hw.njet.base + NETJET_DMA_READ_IRQ))
                /* the 2nd read page is free */
                s0val = s0val | 0x02;
        else    /* the 1st read page is free */
@@ -287,11 +287,11 @@ enpci_interrupt(int intno, void *dev_id)
                }
                cs->hw.njet.irqstat0 = s0val;
                if ((cs->hw.njet.irqstat0 & NETJET_IRQM0_READ) !=
-                       (cs->hw.njet.last_is0 & NETJET_IRQM0_READ))
+                   (cs->hw.njet.last_is0 & NETJET_IRQM0_READ))
                        /* we have a read dma int */
                        read_tiger(cs);
                if ((cs->hw.njet.irqstat0 & NETJET_IRQM0_WRITE) !=
-                       (cs->hw.njet.last_is0 & NETJET_IRQM0_WRITE))
+                   (cs->hw.njet.last_is0 & NETJET_IRQM0_WRITE))
                        /* we have a write dma int */
                        write_tiger(cs);
                test_and_clear_bit(FLG_LOCK_ATOMIC, &cs->HW_Flags);
@@ -304,26 +304,26 @@ static int __devinit en_pci_probe(struct pci_dev *dev_netjet,
                                  struct IsdnCardState *cs)
 {
        if (pci_enable_device(dev_netjet))
-               return(0);
+               return (0);
        cs->irq = dev_netjet->irq;
        if (!cs->irq) {
                printk(KERN_WARNING "enter:now PCI: No IRQ for PCI card found\n");
-               return(0);
+               return (0);
        }
        cs->hw.njet.base = pci_resource_start(dev_netjet, 0);
        if (!cs->hw.njet.base) {
                printk(KERN_WARNING "enter:now PCI: No IO-Adr for PCI card found\n");
-               return(0);
+               return (0);
        }
        /* checks Sub-Vendor ID because system crashes with Traverse-Card */
        if ((dev_netjet->subsystem_vendor != 0x55) ||
            (dev_netjet->subsystem_device != 0x02)) {
                printk(KERN_WARNING "enter:now: You tried to load this driver with an incompatible TigerJet-card\n");
                printk(KERN_WARNING "Use type=20 for Traverse NetJet PCI Card.\n");
-               return(0);
+               return (0);
        }
 
-       return(1);
+       return (1);
 }
 
 static void __devinit en_cs_init(struct IsdnCard *card,
@@ -356,8 +356,8 @@ static int __devinit en_cs_init_rest(struct IsdnCard *card,
        const int bytecnt = 256;
 
        printk(KERN_INFO
-               "enter:now PCI: PCI card configured at 0x%lx IRQ %d\n",
-               cs->hw.njet.base, cs->irq);
+              "enter:now PCI: PCI card configured at 0x%lx IRQ %d\n",
+              cs->hw.njet.base, cs->irq);
        if (!request_region(cs->hw.njet.base, bytecnt, "Fn_ISDN")) {
                printk(KERN_WARNING
                       "HiSax: enter:now config port %lx-%lx already in use\n",
@@ -368,13 +368,13 @@ static int __devinit en_cs_init_rest(struct IsdnCard *card,
 
        setup_Amd7930(cs);
        cs->hw.njet.last_is0 = 0;
-        /* macro rByteAMD */
-        cs->readisac = &ReadByteAmd7930;
-        /* macro wByteAMD */
-        cs->writeisac = &WriteByteAmd7930;
-        cs->dc.amd7930.setIrqMask = &enpci_setIrqMask;
+       /* macro rByteAMD */
+       cs->readisac = &ReadByteAmd7930;
+       /* macro wByteAMD */
+       cs->writeisac = &WriteByteAmd7930;
+       cs->dc.amd7930.setIrqMask = &enpci_setIrqMask;
 
-        cs->BC_Read_Reg  = &dummyrr;
+       cs->BC_Read_Reg  = &dummyrr;
        cs->BC_Write_Reg = &dummywr;
        cs->BC_Send_Data = &netjet_fill_dma;
        cs->cardmsg = &enpci_card_msg;
@@ -398,27 +398,27 @@ setup_enternow_pci(struct IsdnCard *card)
 #error "not running on big endian machines now"
 #endif
 
-        strcpy(tmp, enternow_pci_rev);
+       strcpy(tmp, enternow_pci_rev);
        printk(KERN_INFO "HiSax: Formula-n Europe AG enter:now ISDN PCI driver Rev. %s\n", HiSax_getrev(tmp));
        if (cs->typ != ISDN_CTYPE_ENTERNOW)
-               return(0);
+               return (0);
        test_and_clear_bit(FLG_LOCK_ATOMIC, &cs->HW_Flags);
 
-       for ( ;; )
+       for (;;)
        {
                if ((dev_netjet = hisax_find_pci_device(PCI_VENDOR_ID_TIGERJET,
-                       PCI_DEVICE_ID_TIGERJET_300,  dev_netjet))) {
+                                                       PCI_DEVICE_ID_TIGERJET_300,  dev_netjet))) {
                        ret = en_pci_probe(dev_netjet, cs);
                        if (!ret)
-                               return(0);
+                               return (0);
                } else {
-                        printk(KERN_WARNING "enter:now PCI: No PCI card found\n");
-                       return(0);
+                       printk(KERN_WARNING "enter:now PCI: No PCI card found\n");
+                       return (0);
                }
 
                en_cs_init(card, cs);
                break;
        }
 
-        return en_cs_init_rest(card, cs);
+       return en_cs_init_rest(card, cs);
 }
index 732ea63..1bb2910 100644 (file)
@@ -5,7 +5,7 @@
  * Author       Karsten Keil
  * Copyright    by Karsten Keil      <keil@isdn4linux.de>
  *              by Kai Germaschewski <kai.germaschewski@gmx.de>
- * 
+ *
  * This software may be used and distributed according to the terms
  * of the GNU General Public License, incorporated herein by reference.
  *
@@ -27,18 +27,18 @@ FsmNew(struct Fsm *fsm, struct FsmNode *fnlist, int fncount)
        int i;
 
        fsm->jumpmatrix = (FSMFNPTR *)
-               kzalloc(sizeof (FSMFNPTR) * fsm->state_count * fsm->event_count, GFP_KERNEL);
+               kzalloc(sizeof(FSMFNPTR) * fsm->state_count * fsm->event_count, GFP_KERNEL);
        if (!fsm->jumpmatrix)
                return -ENOMEM;
 
-       for (i = 0; i < fncount; i++) 
-               if ((fnlist[i].state>=fsm->state_count) || (fnlist[i].event>=fsm->event_count)) {
+       for (i = 0; i < fncount; i++)
+               if ((fnlist[i].state >= fsm->state_count) || (fnlist[i].event >= fsm->event_count)) {
                        printk(KERN_ERR "FsmNew Error line %d st(%ld/%ld) ev(%ld/%ld)\n",
-                               i,(long)fnlist[i].state,(long)fsm->state_count,
-                               (long)fnlist[i].event,(long)fsm->event_count);
-               } else          
+                              i, (long)fnlist[i].state, (long)fsm->state_count,
+                              (long)fnlist[i].event, (long)fsm->event_count);
+               } else
                        fsm->jumpmatrix[fsm->state_count * fnlist[i].event +
-                               fnlist[i].state] = (FSMFNPTR) fnlist[i].routine;
+                                       fnlist[i].state] = (FSMFNPTR)fnlist[i].routine;
        return 0;
 }
 
@@ -53,24 +53,24 @@ FsmEvent(struct FsmInst *fi, int event, void *arg)
 {
        FSMFNPTR r;
 
-       if ((fi->state>=fi->fsm->state_count) || (event >= fi->fsm->event_count)) {
+       if ((fi->state >= fi->fsm->state_count) || (event >= fi->fsm->event_count)) {
                printk(KERN_ERR "FsmEvent Error st(%ld/%ld) ev(%d/%ld)\n",
-                       (long)fi->state,(long)fi->fsm->state_count,event,(long)fi->fsm->event_count);
-               return(1);
+                      (long)fi->state, (long)fi->fsm->state_count, event, (long)fi->fsm->event_count);
+               return (1);
        }
        r = fi->fsm->jumpmatrix[fi->fsm->state_count * event + fi->state];
        if (r) {
                if (fi->debug)
                        fi->printdebug(fi, "State %s Event %s",
-                               fi->fsm->strState[fi->state],
-                               fi->fsm->strEvent[event]);
+                                      fi->fsm->strState[fi->state],
+                                      fi->fsm->strEvent[event]);
                r(fi, event, arg);
                return (0);
        } else {
                if (fi->debug)
                        fi->printdebug(fi, "State %s Event %s no routine",
-                               fi->fsm->strState[fi->state],
-                               fi->fsm->strEvent[event]);
+                                      fi->fsm->strState[fi->state],
+                                      fi->fsm->strEvent[event]);
                return (!0);
        }
 }
@@ -81,7 +81,7 @@ FsmChangeState(struct FsmInst *fi, int newstate)
        fi->state = newstate;
        if (fi->debug)
                fi->printdebug(fi, "ChangeState %s",
-                       fi->fsm->strState[newstate]);
+                              fi->fsm->strState[newstate]);
 }
 
 static void
@@ -125,7 +125,7 @@ FsmAddTimer(struct FsmTimer *ft,
 #if FSM_TIMER_DEBUG
        if (ft->fi->debug)
                ft->fi->printdebug(ft->fi, "FsmAddTimer %lx %d %d",
-                       (long) ft, millisec, where);
+                                  (long) ft, millisec, where);
 #endif
 
        if (timer_pending(&ft->tl)) {
@@ -143,13 +143,13 @@ FsmAddTimer(struct FsmTimer *ft,
 
 void
 FsmRestartTimer(struct FsmTimer *ft,
-           int millisec, int event, void *arg, int where)
+               int millisec, int event, void *arg, int where)
 {
 
 #if FSM_TIMER_DEBUG
        if (ft->fi->debug)
                ft->fi->printdebug(ft->fi, "FsmRestartTimer %lx %d %d",
-                       (long) ft, millisec, where);
+                                  (long) ft, millisec, where);
 #endif
 
        if (timer_pending(&ft->tl))
index f02f7da..8c73856 100644 (file)
@@ -5,7 +5,7 @@
  * Author       Karsten Keil
  * Copyright    by Karsten Keil      <keil@isdn4linux.de>
  *              by Kai Germaschewski <kai.germaschewski@gmx.de>
- * 
+ *
  * This software may be used and distributed according to the terms
  * of the GNU General Public License, incorporated herein by reference.
  *
@@ -18,7 +18,7 @@
 
 struct FsmInst;
 
-typedef void (* FSMFNPTR)(struct FsmInst *, int, void *);
+typedef void (*FSMFNPTR)(struct FsmInst *, int, void *);
 
 struct Fsm {
        FSMFNPTR *jumpmatrix;
index 353982f..4fef775 100644 (file)
@@ -5,7 +5,7 @@
  * Author       BeWan Systems
  *              based on source code from Karsten Keil
  * Copyright    by BeWan Systems
- * 
+ *
  * This software may be used and distributed according to the terms
  * of the GNU General Public License, incorporated herein by reference.
  *
@@ -38,7 +38,7 @@ static const char *gazel_revision = "$Revision: 2.19.2.4 $";
 #define INT_IPAC_EN  0x3       /* enable IT ipac */
 
 
-#define byteout(addr,val) outb(val,addr)
+#define byteout(addr, val) outb(val, addr)
 #define bytein(addr) inb(addr)
 
 static inline u_char
@@ -55,13 +55,13 @@ writereg(unsigned int adr, u_short off, u_char data)
 
 
 static inline void
-read_fifo(unsigned int adr, u_char * data, int size)
+read_fifo(unsigned int adr, u_char *data, int size)
 {
        insb(adr, data, size);
 }
 
 static void
-write_fifo(unsigned int adr, u_char * data, int size)
+write_fifo(unsigned int adr, u_char *data, int size)
 {
        outsb(adr, data, size);
 }
@@ -85,14 +85,14 @@ writereg_ipac(unsigned int adr, u_short off, u_char data)
 
 
 static inline void
-read_fifo_ipac(unsigned int adr, u_short off, u_char * data, int size)
+read_fifo_ipac(unsigned int adr, u_short off, u_char *data, int size)
 {
        byteout(adr, off);
        insb(adr + 4, data, size);
 }
 
 static void
-write_fifo_ipac(unsigned int adr, u_short off, u_char * data, int size)
+write_fifo_ipac(unsigned int adr, u_short off, u_char *data, int size)
 {
        byteout(adr, off);
        outsb(adr + 4, data, size);
@@ -106,13 +106,13 @@ ReadISAC(struct IsdnCardState *cs, u_char offset)
        u_short off2 = offset;
 
        switch (cs->subtyp) {
-               case R647:
-                       off2 = ((off2 << 8 & 0xf000) | (off2 & 0xf));
-               case R685:
-                       return (readreg(cs->hw.gazel.isac, off2));
-               case R753:
-               case R742:
-                       return (readreg_ipac(cs->hw.gazel.ipac, 0x80 + off2));
+       case R647:
+               off2 = ((off2 << 8 & 0xf000) | (off2 & 0xf));
+       case R685:
+               return (readreg(cs->hw.gazel.isac, off2));
+       case R753:
+       case R742:
+               return (readreg_ipac(cs->hw.gazel.ipac, 0x80 + off2));
        }
        return 0;
 }
@@ -123,75 +123,75 @@ WriteISAC(struct IsdnCardState *cs, u_char offset, u_char value)
        u_short off2 = offset;
 
        switch (cs->subtyp) {
-               case R647:
-                       off2 = ((off2 << 8 & 0xf000) | (off2 & 0xf));
-               case R685:
-                       writereg(cs->hw.gazel.isac, off2, value);
-                       break;
-               case R753:
-               case R742:
-                       writereg_ipac(cs->hw.gazel.ipac, 0x80 + off2, value);
-                       break;
+       case R647:
+               off2 = ((off2 << 8 & 0xf000) | (off2 & 0xf));
+       case R685:
+               writereg(cs->hw.gazel.isac, off2, value);
+               break;
+       case R753:
+       case R742:
+               writereg_ipac(cs->hw.gazel.ipac, 0x80 + off2, value);
+               break;
        }
 }
 
 static void
-ReadISACfifo(struct IsdnCardState *cs, u_char * data, int size)
+ReadISACfifo(struct IsdnCardState *cs, u_char *data, int size)
 {
        switch (cs->subtyp) {
-               case R647:
-               case R685:
-                       read_fifo(cs->hw.gazel.isacfifo, data, size);
-                       break;
-               case R753:
-               case R742:
-                       read_fifo_ipac(cs->hw.gazel.ipac, 0x80, data, size);
-                       break;
+       case R647:
+       case R685:
+               read_fifo(cs->hw.gazel.isacfifo, data, size);
+               break;
+       case R753:
+       case R742:
+               read_fifo_ipac(cs->hw.gazel.ipac, 0x80, data, size);
+               break;
        }
 }
 
 static void
-WriteISACfifo(struct IsdnCardState *cs, u_char * data, int size)
+WriteISACfifo(struct IsdnCardState *cs, u_char *data, int size)
 {
        switch (cs->subtyp) {
-               case R647:
-               case R685:
-                       write_fifo(cs->hw.gazel.isacfifo, data, size);
-                       break;
-               case R753:
-               case R742:
-                       write_fifo_ipac(cs->hw.gazel.ipac, 0x80, data, size);
-                       break;
+       case R647:
+       case R685:
+               write_fifo(cs->hw.gazel.isacfifo, data, size);
+               break;
+       case R753:
+       case R742:
+               write_fifo_ipac(cs->hw.gazel.ipac, 0x80, data, size);
+               break;
        }
 }
 
 static void
-ReadHSCXfifo(struct IsdnCardState *cs, int hscx, u_char * data, int size)
+ReadHSCXfifo(struct IsdnCardState *cs, int hscx, u_char *data, int size)
 {
        switch (cs->subtyp) {
-               case R647:
-               case R685:
-                       read_fifo(cs->hw.gazel.hscxfifo[hscx], data, size);
-                       break;
-               case R753:
-               case R742:
-                       read_fifo_ipac(cs->hw.gazel.ipac, hscx * 0x40, data, size);
-                       break;
+       case R647:
+       case R685:
+               read_fifo(cs->hw.gazel.hscxfifo[hscx], data, size);
+               break;
+       case R753:
+       case R742:
+               read_fifo_ipac(cs->hw.gazel.ipac, hscx * 0x40, data, size);
+               break;
        }
 }
 
 static void
-WriteHSCXfifo(struct IsdnCardState *cs, int hscx, u_char * data, int size)
+WriteHSCXfifo(struct IsdnCardState *cs, int hscx, u_char *data, int size)
 {
        switch (cs->subtyp) {
-               case R647:
-               case R685:
-                       write_fifo(cs->hw.gazel.hscxfifo[hscx], data, size);
-                       break;
-               case R753:
-               case R742:
-                       write_fifo_ipac(cs->hw.gazel.ipac, hscx * 0x40, data, size);
-                       break;
+       case R647:
+       case R685:
+               write_fifo(cs->hw.gazel.hscxfifo[hscx], data, size);
+               break;
+       case R753:
+       case R742:
+               write_fifo_ipac(cs->hw.gazel.ipac, hscx * 0x40, data, size);
+               break;
        }
 }
 
@@ -201,13 +201,13 @@ ReadHSCX(struct IsdnCardState *cs, int hscx, u_char offset)
        u_short off2 = offset;
 
        switch (cs->subtyp) {
-               case R647:
-                       off2 = ((off2 << 8 & 0xf000) | (off2 & 0xf));
-               case R685:
-                       return (readreg(cs->hw.gazel.hscx[hscx], off2));
-               case R753:
-               case R742:
-                       return (readreg_ipac(cs->hw.gazel.ipac, hscx * 0x40 + off2));
+       case R647:
+               off2 = ((off2 << 8 & 0xf000) | (off2 & 0xf));
+       case R685:
+               return (readreg(cs->hw.gazel.hscx[hscx], off2));
+       case R753:
+       case R742:
+               return (readreg_ipac(cs->hw.gazel.ipac, hscx * 0x40 + off2));
        }
        return 0;
 }
@@ -218,15 +218,15 @@ WriteHSCX(struct IsdnCardState *cs, int hscx, u_char offset, u_char value)
        u_short off2 = offset;
 
        switch (cs->subtyp) {
-               case R647:
-                       off2 = ((off2 << 8 & 0xf000) | (off2 & 0xf));
-               case R685:
-                       writereg(cs->hw.gazel.hscx[hscx], off2, value);
-                       break;
-               case R753:
-               case R742:
-                       writereg_ipac(cs->hw.gazel.ipac, hscx * 0x40 + off2, value);
-                       break;
+       case R647:
+               off2 = ((off2 << 8 & 0xf000) | (off2 & 0xf));
+       case R685:
+               writereg(cs->hw.gazel.hscx[hscx], off2, value);
+               break;
+       case R753:
+       case R742:
+               writereg_ipac(cs->hw.gazel.ipac, hscx * 0x40 + off2, value);
+               break;
        }
 }
 
@@ -279,7 +279,7 @@ gazel_interrupt_ipac(int intno, void *dev_id)
        u_char ista, val;
        int count = 0;
        u_long flags;
-       
+
        spin_lock_irqsave(&cs->lock, flags);
        ista = ReadISAC(cs, IPAC_ISTA - 0x80);
        do {
@@ -322,25 +322,25 @@ release_io_gazel(struct IsdnCardState *cs)
        unsigned int i;
 
        switch (cs->subtyp) {
-               case R647:
-                       for (i = 0x0000; i < 0xC000; i += 0x1000)
-                               release_region(i + cs->hw.gazel.hscx[0], 16);
-                       release_region(0xC000 + cs->hw.gazel.hscx[0], 1);
-                       break;
-
-               case R685:
-                       release_region(cs->hw.gazel.hscx[0], 0x100);
-                       release_region(cs->hw.gazel.cfg_reg, 0x80);
-                       break;
-
-               case R753:
-                       release_region(cs->hw.gazel.ipac, 0x8);
-                       release_region(cs->hw.gazel.cfg_reg, 0x80);
-                       break;
-
-               case R742:
-                       release_region(cs->hw.gazel.ipac, 8);
-                       break;
+       case R647:
+               for (i = 0x0000; i < 0xC000; i += 0x1000)
+                       release_region(i + cs->hw.gazel.hscx[0], 16);
+               release_region(0xC000 + cs->hw.gazel.hscx[0], 1);
+               break;
+
+       case R685:
+               release_region(cs->hw.gazel.hscx[0], 0x100);
+               release_region(cs->hw.gazel.cfg_reg, 0x80);
+               break;
+
+       case R753:
+               release_region(cs->hw.gazel.ipac, 0x8);
+               release_region(cs->hw.gazel.cfg_reg, 0x80);
+               break;
+
+       case R742:
+               release_region(cs->hw.gazel.ipac, 8);
+               break;
        }
 }
 
@@ -350,49 +350,49 @@ reset_gazel(struct IsdnCardState *cs)
        unsigned long plxcntrl, addr = cs->hw.gazel.cfg_reg;
 
        switch (cs->subtyp) {
-               case R647:
-                       writereg(addr, 0, 0);
-                       HZDELAY(10);
-                       writereg(addr, 0, 1);
-                       HZDELAY(2);
-                       break;
-               case R685:
-                       plxcntrl = inl(addr + PLX_CNTRL);
-                       plxcntrl |= (RESET_9050 + RESET_GAZEL);
-                       outl(plxcntrl, addr + PLX_CNTRL);
-                       plxcntrl &= ~(RESET_9050 + RESET_GAZEL);
-                       HZDELAY(4);
-                       outl(plxcntrl, addr + PLX_CNTRL);
-                       HZDELAY(10);
-                       outb(INT_ISAC_EN + INT_HSCX_EN + INT_PCI_EN, addr + PLX_INCSR);
-                       break;
-               case R753:
-                       plxcntrl = inl(addr + PLX_CNTRL);
-                       plxcntrl |= (RESET_9050 + RESET_GAZEL);
-                       outl(plxcntrl, addr + PLX_CNTRL);
-                       plxcntrl &= ~(RESET_9050 + RESET_GAZEL);
-                       WriteISAC(cs, IPAC_POTA2 - 0x80, 0x20);
-                       HZDELAY(4);
-                       outl(plxcntrl, addr + PLX_CNTRL);
-                       HZDELAY(10);
-                       WriteISAC(cs, IPAC_POTA2 - 0x80, 0x00);
-                       WriteISAC(cs, IPAC_ACFG - 0x80, 0xff);
-                       WriteISAC(cs, IPAC_AOE - 0x80, 0x0);
-                       WriteISAC(cs, IPAC_MASK - 0x80, 0xff);
-                       WriteISAC(cs, IPAC_CONF - 0x80, 0x1);
-                       outb(INT_IPAC_EN + INT_PCI_EN, addr + PLX_INCSR);
-                       WriteISAC(cs, IPAC_MASK - 0x80, 0xc0);
-                       break;
-               case R742:
-                       WriteISAC(cs, IPAC_POTA2 - 0x80, 0x20);
-                       HZDELAY(4);
-                       WriteISAC(cs, IPAC_POTA2 - 0x80, 0x00);
-                       WriteISAC(cs, IPAC_ACFG - 0x80, 0xff);
-                       WriteISAC(cs, IPAC_AOE - 0x80, 0x0);
-                       WriteISAC(cs, IPAC_MASK - 0x80, 0xff);
-                       WriteISAC(cs, IPAC_CONF - 0x80, 0x1);
-                       WriteISAC(cs, IPAC_MASK - 0x80, 0xc0);
-                       break;
+       case R647:
+               writereg(addr, 0, 0);
+               HZDELAY(10);
+               writereg(addr, 0, 1);
+               HZDELAY(2);
+               break;
+       case R685:
+               plxcntrl = inl(addr + PLX_CNTRL);
+               plxcntrl |= (RESET_9050 + RESET_GAZEL);
+               outl(plxcntrl, addr + PLX_CNTRL);
+               plxcntrl &= ~(RESET_9050 + RESET_GAZEL);
+               HZDELAY(4);
+               outl(plxcntrl, addr + PLX_CNTRL);
+               HZDELAY(10);
+               outb(INT_ISAC_EN + INT_HSCX_EN + INT_PCI_EN, addr + PLX_INCSR);
+               break;
+       case R753:
+               plxcntrl = inl(addr + PLX_CNTRL);
+               plxcntrl |= (RESET_9050 + RESET_GAZEL);
+               outl(plxcntrl, addr + PLX_CNTRL);
+               plxcntrl &= ~(RESET_9050 + RESET_GAZEL);
+               WriteISAC(cs, IPAC_POTA2 - 0x80, 0x20);
+               HZDELAY(4);
+               outl(plxcntrl, addr + PLX_CNTRL);
+               HZDELAY(10);
+               WriteISAC(cs, IPAC_POTA2 - 0x80, 0x00);
+               WriteISAC(cs, IPAC_ACFG - 0x80, 0xff);
+               WriteISAC(cs, IPAC_AOE - 0x80, 0x0);
+               WriteISAC(cs, IPAC_MASK - 0x80, 0xff);
+               WriteISAC(cs, IPAC_CONF - 0x80, 0x1);
+               outb(INT_IPAC_EN + INT_PCI_EN, addr + PLX_INCSR);
+               WriteISAC(cs, IPAC_MASK - 0x80, 0xc0);
+               break;
+       case R742:
+               WriteISAC(cs, IPAC_POTA2 - 0x80, 0x20);
+               HZDELAY(4);
+               WriteISAC(cs, IPAC_POTA2 - 0x80, 0x00);
+               WriteISAC(cs, IPAC_ACFG - 0x80, 0xff);
+               WriteISAC(cs, IPAC_AOE - 0x80, 0x0);
+               WriteISAC(cs, IPAC_MASK - 0x80, 0xff);
+               WriteISAC(cs, IPAC_CONF - 0x80, 0x1);
+               WriteISAC(cs, IPAC_MASK - 0x80, 0xc0);
+               break;
        }
        return (0);
 }
@@ -403,28 +403,28 @@ Gazel_card_msg(struct IsdnCardState *cs, int mt, void *arg)
        u_long flags;
 
        switch (mt) {
-               case CARD_RESET:
-                       spin_lock_irqsave(&cs->lock, flags);
-                       reset_gazel(cs);
-                       spin_unlock_irqrestore(&cs->lock, flags);
-                       return (0);
-               case CARD_RELEASE:
-                       release_io_gazel(cs);
-                       return (0);
-               case CARD_INIT:
-                       spin_lock_irqsave(&cs->lock, flags);
-                       inithscxisac(cs, 1);
-                       if ((cs->subtyp==R647)||(cs->subtyp==R685)) {
-                               int i;
-                               for (i=0;i<(2+MAX_WAITING_CALLS);i++) {
-                                       cs->bcs[i].hw.hscx.tsaxr0 = 0x1f;
-                                       cs->bcs[i].hw.hscx.tsaxr1 = 0x23;
-                               }
+       case CARD_RESET:
+               spin_lock_irqsave(&cs->lock, flags);
+               reset_gazel(cs);
+               spin_unlock_irqrestore(&cs->lock, flags);
+               return (0);
+       case CARD_RELEASE:
+               release_io_gazel(cs);
+               return (0);
+       case CARD_INIT:
+               spin_lock_irqsave(&cs->lock, flags);
+               inithscxisac(cs, 1);
+               if ((cs->subtyp == R647) || (cs->subtyp == R685)) {
+                       int i;
+                       for (i = 0; i < (2 + MAX_WAITING_CALLS); i++) {
+                               cs->bcs[i].hw.hscx.tsaxr0 = 0x1f;
+                               cs->bcs[i].hw.hscx.tsaxr1 = 0x23;
                        }
-                       spin_unlock_irqrestore(&cs->lock, flags);
-                       return (0);
-               case CARD_TEST:
-                       return (0);
+               }
+               spin_unlock_irqrestore(&cs->lock, flags);
+               return (0);
+       case CARD_TEST:
+               return (0);
        }
        return (0);
 }
@@ -435,49 +435,49 @@ reserve_regions(struct IsdnCard *card, struct IsdnCardState *cs)
        unsigned int i, j, base = 0, adr = 0, len = 0;
 
        switch (cs->subtyp) {
-               case R647:
-                       base = cs->hw.gazel.hscx[0];
-                       if (!request_region(adr = (0xC000 + base), len = 1, "gazel"))
-                               goto error;
-                       for (i = 0x0000; i < 0xC000; i += 0x1000) {
-                               if (!request_region(adr = (i + base), len = 16, "gazel"))
-                                       goto error;
-                       }
-                       if (i != 0xC000) {
-                               for (j = 0; j < i; j+= 0x1000)
-                                       release_region(j + base, 16);
-                               release_region(0xC000 + base, 1);
+       case R647:
+               base = cs->hw.gazel.hscx[0];
+               if (!request_region(adr = (0xC000 + base), len = 1, "gazel"))
+                       goto error;
+               for (i = 0x0000; i < 0xC000; i += 0x1000) {
+                       if (!request_region(adr = (i + base), len = 16, "gazel"))
                                goto error;
-                       }
-                       break;
+               }
+               if (i != 0xC000) {
+                       for (j = 0; j < i; j += 0x1000)
+                               release_region(j + base, 16);
+                       release_region(0xC000 + base, 1);
+                       goto error;
+               }
+               break;
 
-               case R685:
-                       if (!request_region(adr = cs->hw.gazel.hscx[0], len = 0x100, "gazel"))
-                               goto error;
-                       if (!request_region(adr = cs->hw.gazel.cfg_reg, len = 0x80, "gazel")) {
-                               release_region(cs->hw.gazel.hscx[0],0x100);
-                               goto error;
-                       }
-                       break;
+       case R685:
+               if (!request_region(adr = cs->hw.gazel.hscx[0], len = 0x100, "gazel"))
+                       goto error;
+               if (!request_region(adr = cs->hw.gazel.cfg_reg, len = 0x80, "gazel")) {
+                       release_region(cs->hw.gazel.hscx[0], 0x100);
+                       goto error;
+               }
+               break;
 
-               case R753:
-                       if (!request_region(adr = cs->hw.gazel.ipac, len = 0x8, "gazel"))
-                               goto error;
-                       if (!request_region(adr = cs->hw.gazel.cfg_reg, len = 0x80, "gazel")) {
-                               release_region(cs->hw.gazel.ipac, 8);
-                               goto error;
-                       }
-                       break;
+       case R753:
+               if (!request_region(adr = cs->hw.gazel.ipac, len = 0x8, "gazel"))
+                       goto error;
+               if (!request_region(adr = cs->hw.gazel.cfg_reg, len = 0x80, "gazel")) {
+                       release_region(cs->hw.gazel.ipac, 8);
+                       goto error;
+               }
+               break;
 
-               case R742:
-                       if (!request_region(adr = cs->hw.gazel.ipac, len = 0x8, "gazel"))
-                               goto error;
-                       break;
+       case R742:
+               if (!request_region(adr = cs->hw.gazel.ipac, len = 0x8, "gazel"))
+                       goto error;
+               break;
        }
 
        return 0;
 
-      error:
+error:
        printk(KERN_WARNING "Gazel: io ports 0x%x-0x%x already in use\n",
               adr, adr + len);
        return 1;
@@ -508,24 +508,24 @@ setup_gazelisa(struct IsdnCard *card, struct IsdnCardState *cs)
        cs->hw.gazel.hscxfifo[1] = cs->hw.gazel.hscx[1];
 
        switch (cs->subtyp) {
-               case R647:
-                       printk(KERN_INFO "Gazel: Card ISA R647/R648 found\n");
-                       cs->dc.isac.adf2 = 0x87;
-                       printk(KERN_INFO
-                               "Gazel: config irq:%d isac:0x%X  cfg:0x%X\n",
-                               cs->irq, cs->hw.gazel.isac, cs->hw.gazel.cfg_reg);
-                       printk(KERN_INFO
-                               "Gazel: hscx A:0x%X  hscx B:0x%X\n",
-                               cs->hw.gazel.hscx[0], cs->hw.gazel.hscx[1]);
-
-                       break;
-               case R742:
-                       printk(KERN_INFO "Gazel: Card ISA R742 found\n");
-                       test_and_set_bit(HW_IPAC, &cs->HW_Flags);
-                       printk(KERN_INFO
-                              "Gazel: config irq:%d ipac:0x%X\n",
-                              cs->irq, cs->hw.gazel.ipac);
-                       break;
+       case R647:
+               printk(KERN_INFO "Gazel: Card ISA R647/R648 found\n");
+               cs->dc.isac.adf2 = 0x87;
+               printk(KERN_INFO
+                      "Gazel: config irq:%d isac:0x%X  cfg:0x%X\n",
+                      cs->irq, cs->hw.gazel.isac, cs->hw.gazel.cfg_reg);
+               printk(KERN_INFO
+                      "Gazel: hscx A:0x%X  hscx B:0x%X\n",
+                      cs->hw.gazel.hscx[0], cs->hw.gazel.hscx[1]);
+
+               break;
+       case R742:
+               printk(KERN_INFO "Gazel: Card ISA R742 found\n");
+               test_and_set_bit(HW_IPAC, &cs->HW_Flags);
+               printk(KERN_INFO
+                      "Gazel: config irq:%d ipac:0x%X\n",
+                      cs->irq, cs->hw.gazel.ipac);
+               break;
        }
 
        return (0);
@@ -547,7 +547,7 @@ setup_gazelpci(struct IsdnCardState *cs)
        seekcard = PCI_DEVICE_ID_PLX_R685;
        for (nbseek = 0; nbseek < 4; nbseek++) {
                if ((dev_tel = hisax_find_pci_device(PCI_VENDOR_ID_PLX,
-                                       seekcard, dev_tel))) {
+                                                    seekcard, dev_tel))) {
                        if (pci_enable_device(dev_tel))
                                return 1;
                        pci_irq = dev_tel->irq;
@@ -559,15 +559,15 @@ setup_gazelpci(struct IsdnCardState *cs)
                        break;
                else {
                        switch (seekcard) {
-                               case PCI_DEVICE_ID_PLX_R685:
-                                       seekcard = PCI_DEVICE_ID_PLX_R753;
-                                       break;
-                               case PCI_DEVICE_ID_PLX_R753:
-                                       seekcard = PCI_DEVICE_ID_PLX_DJINN_ITOO;
-                                       break;
-                               case PCI_DEVICE_ID_PLX_DJINN_ITOO:
-                                       seekcard = PCI_DEVICE_ID_PLX_OLITEC;
-                                       break;
+                       case PCI_DEVICE_ID_PLX_R685:
+                               seekcard = PCI_DEVICE_ID_PLX_R753;
+                               break;
+                       case PCI_DEVICE_ID_PLX_R753:
+                               seekcard = PCI_DEVICE_ID_PLX_DJINN_ITOO;
+                               break;
+                       case PCI_DEVICE_ID_PLX_DJINN_ITOO:
+                               seekcard = PCI_DEVICE_ID_PLX_OLITEC;
+                               break;
                        }
                }
        }
@@ -595,27 +595,27 @@ setup_gazelpci(struct IsdnCardState *cs)
        cs->irq_flags |= IRQF_SHARED;
 
        switch (seekcard) {
-               case PCI_DEVICE_ID_PLX_R685:
-                       printk(KERN_INFO "Gazel: Card PCI R685 found\n");
-                       cs->subtyp = R685;
-                       cs->dc.isac.adf2 = 0x87;
-                       printk(KERN_INFO
-                           "Gazel: config irq:%d isac:0x%X  cfg:0x%X\n",
-                       cs->irq, cs->hw.gazel.isac, cs->hw.gazel.cfg_reg);
-                       printk(KERN_INFO
-                              "Gazel: hscx A:0x%X  hscx B:0x%X\n",
-                            cs->hw.gazel.hscx[0], cs->hw.gazel.hscx[1]);
-                       break;
-               case PCI_DEVICE_ID_PLX_R753:
-               case PCI_DEVICE_ID_PLX_DJINN_ITOO:
-               case PCI_DEVICE_ID_PLX_OLITEC:
-                       printk(KERN_INFO "Gazel: Card PCI R753 found\n");
-                       cs->subtyp = R753;
-                       test_and_set_bit(HW_IPAC, &cs->HW_Flags);
-                       printk(KERN_INFO
-                           "Gazel: config irq:%d ipac:0x%X  cfg:0x%X\n",
-                       cs->irq, cs->hw.gazel.ipac, cs->hw.gazel.cfg_reg);
-                       break;
+       case PCI_DEVICE_ID_PLX_R685:
+               printk(KERN_INFO "Gazel: Card PCI R685 found\n");
+               cs->subtyp = R685;
+               cs->dc.isac.adf2 = 0x87;
+               printk(KERN_INFO
+                      "Gazel: config irq:%d isac:0x%X  cfg:0x%X\n",
+                      cs->irq, cs->hw.gazel.isac, cs->hw.gazel.cfg_reg);
+               printk(KERN_INFO
+                      "Gazel: hscx A:0x%X  hscx B:0x%X\n",
+                      cs->hw.gazel.hscx[0], cs->hw.gazel.hscx[1]);
+               break;
+       case PCI_DEVICE_ID_PLX_R753:
+       case PCI_DEVICE_ID_PLX_DJINN_ITOO:
+       case PCI_DEVICE_ID_PLX_OLITEC:
+               printk(KERN_INFO "Gazel: Card PCI R753 found\n");
+               cs->subtyp = R753;
+               test_and_set_bit(HW_IPAC, &cs->HW_Flags);
+               printk(KERN_INFO
+                      "Gazel: config irq:%d ipac:0x%X  cfg:0x%X\n",
+                      cs->irq, cs->hw.gazel.ipac, cs->hw.gazel.cfg_reg);
+               break;
        }
 
        return (0);
@@ -667,23 +667,23 @@ setup_gazel(struct IsdnCard *card)
        cs->cardmsg = &Gazel_card_msg;
 
        switch (cs->subtyp) {
-               case R647:
-               case R685:
-                       cs->irq_func = &gazel_interrupt;
-                       ISACVersion(cs, "Gazel:");
-                       if (HscxVersion(cs, "Gazel:")) {
-                               printk(KERN_WARNING
-                                      "Gazel: wrong HSCX versions check IO address\n");
-                               release_io_gazel(cs);
-                               return (0);
-                       }
-                       break;
-               case R742:
-               case R753:
-                       cs->irq_func = &gazel_interrupt_ipac;
-                       val = ReadISAC(cs, IPAC_ID - 0x80);
-                       printk(KERN_INFO "Gazel: IPAC version %x\n", val);
-                       break;
+       case R647:
+       case R685:
+               cs->irq_func = &gazel_interrupt;
+               ISACVersion(cs, "Gazel:");
+               if (HscxVersion(cs, "Gazel:")) {
+                       printk(KERN_WARNING
+                              "Gazel: wrong HSCX versions check IO address\n");
+                       release_io_gazel(cs);
+                       return (0);
+               }
+               break;
+       case R742:
+       case R753:
+               cs->irq_func = &gazel_interrupt_ipac;
+               val = ReadISAC(cs, IPAC_ID - 0x80);
+               printk(KERN_INFO "Gazel: IPAC version %x\n", val);
+               break;
        }
 
        return (1);
index 384d511..dea04de 100644 (file)
@@ -93,32 +93,32 @@ static struct pci_device_id hfc4s8s_ids[] = {
         .subdevice = 0x08b4,
         .driver_data =
         (unsigned long) &((hfc4s8s_param) {CHIP_ID_4S, CLOCKMODE_0, 4,
-                                           "HFC-4S Evaluation Board"}),
-        },
+                                "HFC-4S Evaluation Board"}),
+       },
        {.vendor = PCI_VENDOR_ID_CCD,
         .device = PCI_DEVICE_ID_8S,
         .subvendor = 0x1397,
         .subdevice = 0x16b8,
         .driver_data =
         (unsigned long) &((hfc4s8s_param) {CHIP_ID_8S, CLOCKMODE_0, 8,
-                                           "HFC-8S Evaluation Board"}),
-        },
+                                "HFC-8S Evaluation Board"}),
+       },
        {.vendor = PCI_VENDOR_ID_CCD,
         .device = PCI_DEVICE_ID_4S,
         .subvendor = 0x1397,
         .subdevice = 0xb520,
         .driver_data =
         (unsigned long) &((hfc4s8s_param) {CHIP_ID_4S, CLOCKMODE_1, 4,
-                                           "IOB4ST"}),
-        },
+                                "IOB4ST"}),
+       },
        {.vendor = PCI_VENDOR_ID_CCD,
         .device = PCI_DEVICE_ID_8S,
         .subvendor = 0x1397,
         .subdevice = 0xb522,
         .driver_data =
         (unsigned long) &((hfc4s8s_param) {CHIP_ID_8S, CLOCKMODE_1, 8,
-                                           "IOB8ST"}),
-        },
+                                "IOB8ST"}),
+       },
        {}
 };
 
@@ -203,14 +203,14 @@ typedef struct _hfc4s8s_hw {
 #ifdef HISAX_HFC4S8S_PCIMEM    /* inline functions memory mapped */
 
 /* memory write and dummy IO read to avoid PCI byte merge problems */
-#define Write_hfc8(a,b,c) {(*((volatile u_char *)(a->membase+b)) = c); inb(a->iobase+4);}
+#define Write_hfc8(a, b, c) {(*((volatile u_char *)(a->membase + b)) = c); inb(a->iobase + 4);}
 /* memory write without dummy IO access for fifo data access */
-#define fWrite_hfc8(a,b,c) (*((volatile u_char *)(a->membase+b)) = c)
-#define Read_hfc8(a,b) (*((volatile u_char *)(a->membase+b)))
-#define Write_hfc16(a,b,c) (*((volatile unsigned short *)(a->membase+b)) = c)
-#define Read_hfc16(a,b) (*((volatile unsigned short *)(a->membase+b)))
-#define Write_hfc32(a,b,c) (*((volatile unsigned long *)(a->membase+b)) = c)
-#define Read_hfc32(a,b) (*((volatile unsigned long *)(a->membase+b)))
+#define fWrite_hfc8(a, b, c) (*((volatile u_char *)(a->membase + b)) = c)
+#define Read_hfc8(a, b) (*((volatile u_char *)(a->membase + b)))
+#define Write_hfc16(a, b, c) (*((volatile unsigned short *)(a->membase + b)) = c)
+#define Read_hfc16(a, b) (*((volatile unsigned short *)(a->membase + b)))
+#define Write_hfc32(a, b, c) (*((volatile unsigned long *)(a->membase + b)) = c)
+#define Read_hfc32(a, b) (*((volatile unsigned long *)(a->membase + b)))
 #define wait_busy(a) {while ((Read_hfc8(a, R_STATUS) & M_BUSY));}
 #define PCI_ENA_MEMIO  0x03
 
@@ -218,87 +218,87 @@ typedef struct _hfc4s8s_hw {
 
 /* inline functions io mapped */
 static inline void
-SetRegAddr(hfc4s8s_hw * a, u_char b)
+SetRegAddr(hfc4s8s_hw *a, u_char b)
 {
        outb(b, (a->iobase) + 4);
 }
 
 static inline u_char
-GetRegAddr(hfc4s8s_hw * a)
+GetRegAddr(hfc4s8s_hw *a)
 {
        return (inb((volatile u_int) (a->iobase + 4)));
 }
 
 
 static inline void
-Write_hfc8(hfc4s8s_hw * a, u_char b, u_char c)
+Write_hfc8(hfc4s8s_hw *a, u_char b, u_char c)
 {
        SetRegAddr(a, b);
        outb(c, a->iobase);
 }
 
 static inline void
-fWrite_hfc8(hfc4s8s_hw * a, u_char c)
+fWrite_hfc8(hfc4s8s_hw *a, u_char c)
 {
        outb(c, a->iobase);
 }
 
 static inline void
-Write_hfc16(hfc4s8s_hw * a, u_char b, u_short c)
+Write_hfc16(hfc4s8s_hw *a, u_char b, u_short c)
 {
        SetRegAddr(a, b);
        outw(c, a->iobase);
 }
 
 static inline void
-Write_hfc32(hfc4s8s_hw * a, u_char b, u_long c)
+Write_hfc32(hfc4s8s_hw *a, u_char b, u_long c)
 {
        SetRegAddr(a, b);
        outl(c, a->iobase);
 }
 
 static inline void
-fWrite_hfc32(hfc4s8s_hw * a, u_long c)
+fWrite_hfc32(hfc4s8s_hw *a, u_long c)
 {
        outl(c, a->iobase);
 }
 
 static inline u_char
-Read_hfc8(hfc4s8s_hw * a, u_char b)
+Read_hfc8(hfc4s8s_hw *a, u_char b)
 {
        SetRegAddr(a, b);
        return (inb((volatile u_int) a->iobase));
 }
 
 static inline u_char
-fRead_hfc8(hfc4s8s_hw * a)
+fRead_hfc8(hfc4s8s_hw *a)
 {
        return (inb((volatile u_int) a->iobase));
 }
 
 
 static inline u_short
-Read_hfc16(hfc4s8s_hw * a, u_char b)
+Read_hfc16(hfc4s8s_hw *a, u_char b)
 {
        SetRegAddr(a, b);
        return (inw((volatile u_int) a->iobase));
 }
 
 static inline u_long
-Read_hfc32(hfc4s8s_hw * a, u_char b)
+Read_hfc32(hfc4s8s_hw *a, u_char b)
 {
        SetRegAddr(a, b);
        return (inl((volatile u_int) a->iobase));
 }
 
 static inline u_long
-fRead_hfc32(hfc4s8s_hw * a)
+fRead_hfc32(hfc4s8s_hw *a)
 {
        return (inl((volatile u_int) a->iobase));
 }
 
 static inline void
-wait_busy(hfc4s8s_hw * a)
+wait_busy(hfc4s8s_hw *a)
 {
        SetRegAddr(a, R_STATUS);
        while (inb((volatile u_int) a->iobase) & M_BUSY);
@@ -313,7 +313,7 @@ wait_busy(hfc4s8s_hw * a)
 /* may be updated by the chip during read             */
 /******************************************************/
 static u_char
-Read_hfc8_stable(hfc4s8s_hw * hw, int reg)
+Read_hfc8_stable(hfc4s8s_hw *hw, int reg)
 {
        u_char ref8;
        u_char in8;
@@ -325,7 +325,7 @@ Read_hfc8_stable(hfc4s8s_hw * hw, int reg)
 }
 
 static int
-Read_hfc16_stable(hfc4s8s_hw * hw, int reg)
+Read_hfc16_stable(hfc4s8s_hw *hw, int reg)
 {
        int ref16;
        int in16;
@@ -349,67 +349,67 @@ dch_l2l1(struct hisax_d_if *iface, int pr, void *arg)
 
        switch (pr) {
 
-               case (PH_DATA | REQUEST):
-                       if (!l1->enabled) {
-                               dev_kfree_skb(skb);
-                               break;
-                       }
-                       spin_lock_irqsave(&l1->lock, flags);
-                       skb_queue_tail(&l1->d_tx_queue, skb);
-                       if ((skb_queue_len(&l1->d_tx_queue) == 1) &&
-                           (l1->tx_cnt <= 0)) {
-                               l1->hw->mr.r_irq_fifo_blx[l1->st_num] |=
-                                   0x10;
-                               spin_unlock_irqrestore(&l1->lock, flags);
-                               schedule_work(&l1->hw->tqueue);
-                       } else
-                               spin_unlock_irqrestore(&l1->lock, flags);
+       case (PH_DATA | REQUEST):
+               if (!l1->enabled) {
+                       dev_kfree_skb(skb);
                        break;
+               }
+               spin_lock_irqsave(&l1->lock, flags);
+               skb_queue_tail(&l1->d_tx_queue, skb);
+               if ((skb_queue_len(&l1->d_tx_queue) == 1) &&
+                   (l1->tx_cnt <= 0)) {
+                       l1->hw->mr.r_irq_fifo_blx[l1->st_num] |=
+                               0x10;
+                       spin_unlock_irqrestore(&l1->lock, flags);
+                       schedule_work(&l1->hw->tqueue);
+               } else
+                       spin_unlock_irqrestore(&l1->lock, flags);
+               break;
 
-               case (PH_ACTIVATE | REQUEST):
-                       if (!l1->enabled)
-                               break;
-                       if (!l1->nt_mode) {
-                               if (l1->l1_state < 6) {
-                                       spin_lock_irqsave(&l1->lock,
-                                                         flags);
-
-                                       Write_hfc8(l1->hw, R_ST_SEL,
-                                                  l1->st_num);
-                                       Write_hfc8(l1->hw, A_ST_WR_STA,
-                                                  0x60);
-                                       mod_timer(&l1->l1_timer,
-                                                 jiffies + L1_TIMER_T3);
-                                       spin_unlock_irqrestore(&l1->lock,
-                                                              flags);
-                               } else if (l1->l1_state == 7)
-                                       l1->d_if.ifc.l1l2(&l1->d_if.ifc,
-                                                         PH_ACTIVATE |
-                                                         INDICATION,
-                                                         NULL);
-                       } else {
-                               if (l1->l1_state != 3) {
-                                       spin_lock_irqsave(&l1->lock,
-                                                         flags);
-                                       Write_hfc8(l1->hw, R_ST_SEL,
-                                                  l1->st_num);
-                                       Write_hfc8(l1->hw, A_ST_WR_STA,
-                                                  0x60);
-                                       spin_unlock_irqrestore(&l1->lock,
-                                                              flags);
-                               } else if (l1->l1_state == 3)
-                                       l1->d_if.ifc.l1l2(&l1->d_if.ifc,
-                                                         PH_ACTIVATE |
-                                                         INDICATION,
-                                                         NULL);
-                       }
+       case (PH_ACTIVATE | REQUEST):
+               if (!l1->enabled)
                        break;
+               if (!l1->nt_mode) {
+                       if (l1->l1_state < 6) {
+                               spin_lock_irqsave(&l1->lock,
+                                                 flags);
+
+                               Write_hfc8(l1->hw, R_ST_SEL,
+                                          l1->st_num);
+                               Write_hfc8(l1->hw, A_ST_WR_STA,
+                                          0x60);
+                               mod_timer(&l1->l1_timer,
+                                         jiffies + L1_TIMER_T3);
+                               spin_unlock_irqrestore(&l1->lock,
+                                                      flags);
+                       } else if (l1->l1_state == 7)
+                               l1->d_if.ifc.l1l2(&l1->d_if.ifc,
+                                                 PH_ACTIVATE |
+                                                 INDICATION,
+                                                 NULL);
+               } else {
+                       if (l1->l1_state != 3) {
+                               spin_lock_irqsave(&l1->lock,
+                                                 flags);
+                               Write_hfc8(l1->hw, R_ST_SEL,
+                                          l1->st_num);
+                               Write_hfc8(l1->hw, A_ST_WR_STA,
+                                          0x60);
+                               spin_unlock_irqrestore(&l1->lock,
+                                                      flags);
+                       } else if (l1->l1_state == 3)
+                               l1->d_if.ifc.l1l2(&l1->d_if.ifc,
+                                                 PH_ACTIVATE |
+                                                 INDICATION,
+                                                 NULL);
+               }
+               break;
 
-               default:
-                       printk(KERN_INFO
-                              "HFC-4S/8S: Unknown D-chan cmd 0x%x received, ignored\n",
-                              pr);
-                       break;
+       default:
+               printk(KERN_INFO
+                      "HFC-4S/8S: Unknown D-chan cmd 0x%x received, ignored\n",
+                      pr);
+               break;
        }
        if (!l1->enabled)
                l1->d_if.ifc.l1l2(&l1->d_if.ifc,
@@ -430,199 +430,199 @@ bch_l2l1(struct hisax_if *ifc, int pr, void *arg)
 
        switch (pr) {
 
-               case (PH_DATA | REQUEST):
-                       if (!l1->enabled || (bch->mode == L1_MODE_NULL)) {
-                               dev_kfree_skb(skb);
-                               break;
-                       }
-                       spin_lock_irqsave(&l1->lock, flags);
-                       skb_queue_tail(&bch->tx_queue, skb);
-                       if (!bch->tx_skb && (bch->tx_cnt <= 0)) {
-                               l1->hw->mr.r_irq_fifo_blx[l1->st_num] |=
-                                   ((bch->bchan == 1) ? 1 : 4);
-                               spin_unlock_irqrestore(&l1->lock, flags);
-                               schedule_work(&l1->hw->tqueue);
-                       } else
-                               spin_unlock_irqrestore(&l1->lock, flags);
+       case (PH_DATA | REQUEST):
+               if (!l1->enabled || (bch->mode == L1_MODE_NULL)) {
+                       dev_kfree_skb(skb);
                        break;
+               }
+               spin_lock_irqsave(&l1->lock, flags);
+               skb_queue_tail(&bch->tx_queue, skb);
+               if (!bch->tx_skb && (bch->tx_cnt <= 0)) {
+                       l1->hw->mr.r_irq_fifo_blx[l1->st_num] |=
+                               ((bch->bchan == 1) ? 1 : 4);
+                       spin_unlock_irqrestore(&l1->lock, flags);
+                       schedule_work(&l1->hw->tqueue);
+               } else
+                       spin_unlock_irqrestore(&l1->lock, flags);
+               break;
 
-               case (PH_ACTIVATE | REQUEST):
-               case (PH_DEACTIVATE | REQUEST):
-                       if (!l1->enabled)
-                               break;
-                       if (pr == (PH_DEACTIVATE | REQUEST))
-                               mode = L1_MODE_NULL;
-
-                       switch (mode) {
-                               case L1_MODE_HDLC:
-                                       spin_lock_irqsave(&l1->lock,
-                                                         flags);
-                                       l1->hw->mr.timer_usg_cnt++;
-                                       l1->hw->mr.
-                                           fifo_slow_timer_service[l1->
-                                                                   st_num]
-                                           |=
-                                           ((bch->bchan ==
-                                             1) ? 0x2 : 0x8);
-                                       Write_hfc8(l1->hw, R_FIFO,
-                                                  (l1->st_num * 8 +
-                                                   ((bch->bchan ==
-                                                     1) ? 0 : 2)));
-                                       wait_busy(l1->hw);
-                                       Write_hfc8(l1->hw, A_CON_HDLC, 0xc);    /* HDLC mode, flag fill, connect ST */
-                                       Write_hfc8(l1->hw, A_SUBCH_CFG, 0);     /* 8 bits */
-                                       Write_hfc8(l1->hw, A_IRQ_MSK, 1);       /* enable TX interrupts for hdlc */
-                                       Write_hfc8(l1->hw, A_INC_RES_FIFO, 2);  /* reset fifo */
-                                       wait_busy(l1->hw);
-
-                                       Write_hfc8(l1->hw, R_FIFO,
-                                                  (l1->st_num * 8 +
-                                                   ((bch->bchan ==
-                                                     1) ? 1 : 3)));
-                                       wait_busy(l1->hw);
-                                       Write_hfc8(l1->hw, A_CON_HDLC, 0xc);    /* HDLC mode, flag fill, connect ST */
-                                       Write_hfc8(l1->hw, A_SUBCH_CFG, 0);     /* 8 bits */
-                                       Write_hfc8(l1->hw, A_IRQ_MSK, 1);       /* enable RX interrupts for hdlc */
-                                       Write_hfc8(l1->hw, A_INC_RES_FIFO, 2);  /* reset fifo */
-
-                                       Write_hfc8(l1->hw, R_ST_SEL,
-                                                  l1->st_num);
-                                       l1->hw->mr.r_ctrl0 |=
-                                           (bch->bchan & 3);
-                                       Write_hfc8(l1->hw, A_ST_CTRL0,
-                                                  l1->hw->mr.r_ctrl0);
-                                       bch->mode = L1_MODE_HDLC;
-                                       spin_unlock_irqrestore(&l1->lock,
-                                                              flags);
-
-                                       bch->b_if.ifc.l1l2(&bch->b_if.ifc,
-                                                          PH_ACTIVATE |
-                                                          INDICATION,
-                                                          NULL);
-                                       break;
-
-                               case L1_MODE_TRANS:
-                                       spin_lock_irqsave(&l1->lock,
-                                                         flags);
-                                       l1->hw->mr.
-                                           fifo_rx_trans_enables[l1->
-                                                                 st_num]
-                                           |=
-                                           ((bch->bchan ==
-                                             1) ? 0x2 : 0x8);
-                                       l1->hw->mr.timer_usg_cnt++;
-                                       Write_hfc8(l1->hw, R_FIFO,
-                                                  (l1->st_num * 8 +
-                                                   ((bch->bchan ==
-                                                     1) ? 0 : 2)));
-                                       wait_busy(l1->hw);
-                                       Write_hfc8(l1->hw, A_CON_HDLC, 0xf);    /* Transparent mode, 1 fill, connect ST */
-                                       Write_hfc8(l1->hw, A_SUBCH_CFG, 0);     /* 8 bits */
-                                       Write_hfc8(l1->hw, A_IRQ_MSK, 0);       /* disable TX interrupts */
-                                       Write_hfc8(l1->hw, A_INC_RES_FIFO, 2);  /* reset fifo */
-                                       wait_busy(l1->hw);
-
-                                       Write_hfc8(l1->hw, R_FIFO,
-                                                  (l1->st_num * 8 +
-                                                   ((bch->bchan ==
-                                                     1) ? 1 : 3)));
-                                       wait_busy(l1->hw);
-                                       Write_hfc8(l1->hw, A_CON_HDLC, 0xf);    /* Transparent mode, 1 fill, connect ST */
-                                       Write_hfc8(l1->hw, A_SUBCH_CFG, 0);     /* 8 bits */
-                                       Write_hfc8(l1->hw, A_IRQ_MSK, 0);       /* disable RX interrupts */
-                                       Write_hfc8(l1->hw, A_INC_RES_FIFO, 2);  /* reset fifo */
-
-                                       Write_hfc8(l1->hw, R_ST_SEL,
-                                                  l1->st_num);
-                                       l1->hw->mr.r_ctrl0 |=
-                                           (bch->bchan & 3);
-                                       Write_hfc8(l1->hw, A_ST_CTRL0,
-                                                  l1->hw->mr.r_ctrl0);
-                                       bch->mode = L1_MODE_TRANS;
-                                       spin_unlock_irqrestore(&l1->lock,
-                                                              flags);
-
-                                       bch->b_if.ifc.l1l2(&bch->b_if.ifc,
-                                                          PH_ACTIVATE |
-                                                          INDICATION,
-                                                          NULL);
-                                       break;
-
-                               default:
-                                       if (bch->mode == L1_MODE_NULL)
-                                               break;
-                                       spin_lock_irqsave(&l1->lock,
-                                                         flags);
-                                       l1->hw->mr.
-                                           fifo_slow_timer_service[l1->
-                                                                   st_num]
-                                           &=
-                                           ~((bch->bchan ==
-                                              1) ? 0x3 : 0xc);
-                                       l1->hw->mr.
-                                           fifo_rx_trans_enables[l1->
-                                                                 st_num]
-                                           &=
-                                           ~((bch->bchan ==
-                                              1) ? 0x3 : 0xc);
-                                       l1->hw->mr.timer_usg_cnt--;
-                                       Write_hfc8(l1->hw, R_FIFO,
-                                                  (l1->st_num * 8 +
-                                                   ((bch->bchan ==
-                                                     1) ? 0 : 2)));
-                                       wait_busy(l1->hw);
-                                       Write_hfc8(l1->hw, A_IRQ_MSK, 0);       /* disable TX interrupts */
-                                       wait_busy(l1->hw);
-                                       Write_hfc8(l1->hw, R_FIFO,
-                                                  (l1->st_num * 8 +
-                                                   ((bch->bchan ==
-                                                     1) ? 1 : 3)));
-                                       wait_busy(l1->hw);
-                                       Write_hfc8(l1->hw, A_IRQ_MSK, 0);       /* disable RX interrupts */
-                                       Write_hfc8(l1->hw, R_ST_SEL,
-                                                  l1->st_num);
-                                       l1->hw->mr.r_ctrl0 &=
-                                           ~(bch->bchan & 3);
-                                       Write_hfc8(l1->hw, A_ST_CTRL0,
-                                                  l1->hw->mr.r_ctrl0);
-                                       spin_unlock_irqrestore(&l1->lock,
-                                                              flags);
-
-                                       bch->mode = L1_MODE_NULL;
-                                       bch->b_if.ifc.l1l2(&bch->b_if.ifc,
-                                                          PH_DEACTIVATE |
-                                                          INDICATION,
-                                                          NULL);
-                                       if (bch->tx_skb) {
-                                               dev_kfree_skb(bch->tx_skb);
-                                               bch->tx_skb = NULL;
-                                       }
-                                       if (bch->rx_skb) {
-                                               dev_kfree_skb(bch->rx_skb);
-                                               bch->rx_skb = NULL;
-                                       }
-                                       skb_queue_purge(&bch->tx_queue);
-                                       bch->tx_cnt = 0;
-                                       bch->rx_ptr = NULL;
-                                       break;
-                       }
+       case (PH_ACTIVATE | REQUEST):
+       case (PH_DEACTIVATE | REQUEST):
+               if (!l1->enabled)
+                       break;
+               if (pr == (PH_DEACTIVATE | REQUEST))
+                       mode = L1_MODE_NULL;
+
+               switch (mode) {
+               case L1_MODE_HDLC:
+                       spin_lock_irqsave(&l1->lock,
+                                         flags);
+                       l1->hw->mr.timer_usg_cnt++;
+                       l1->hw->mr.
+                               fifo_slow_timer_service[l1->
+                                                       st_num]
+                               |=
+                               ((bch->bchan ==
+                                 1) ? 0x2 : 0x8);
+                       Write_hfc8(l1->hw, R_FIFO,
+                                  (l1->st_num * 8 +
+                                   ((bch->bchan ==
+                                     1) ? 0 : 2)));
+                       wait_busy(l1->hw);
+                       Write_hfc8(l1->hw, A_CON_HDLC, 0xc);    /* HDLC mode, flag fill, connect ST */
+                       Write_hfc8(l1->hw, A_SUBCH_CFG, 0);     /* 8 bits */
+                       Write_hfc8(l1->hw, A_IRQ_MSK, 1);       /* enable TX interrupts for hdlc */
+                       Write_hfc8(l1->hw, A_INC_RES_FIFO, 2);  /* reset fifo */
+                       wait_busy(l1->hw);
 
-                       /* timer is only used when at least one b channel */
-                       /* is set up to transparent mode */
-                       if (l1->hw->mr.timer_usg_cnt) {
-                               Write_hfc8(l1->hw, R_IRQMSK_MISC,
-                                          M_TI_IRQMSK);
-                       } else {
-                               Write_hfc8(l1->hw, R_IRQMSK_MISC, 0);
-                       }
+                       Write_hfc8(l1->hw, R_FIFO,
+                                  (l1->st_num * 8 +
+                                   ((bch->bchan ==
+                                     1) ? 1 : 3)));
+                       wait_busy(l1->hw);
+                       Write_hfc8(l1->hw, A_CON_HDLC, 0xc);    /* HDLC mode, flag fill, connect ST */
+                       Write_hfc8(l1->hw, A_SUBCH_CFG, 0);     /* 8 bits */
+                       Write_hfc8(l1->hw, A_IRQ_MSK, 1);       /* enable RX interrupts for hdlc */
+                       Write_hfc8(l1->hw, A_INC_RES_FIFO, 2);  /* reset fifo */
+
+                       Write_hfc8(l1->hw, R_ST_SEL,
+                                  l1->st_num);
+                       l1->hw->mr.r_ctrl0 |=
+                               (bch->bchan & 3);
+                       Write_hfc8(l1->hw, A_ST_CTRL0,
+                                  l1->hw->mr.r_ctrl0);
+                       bch->mode = L1_MODE_HDLC;
+                       spin_unlock_irqrestore(&l1->lock,
+                                              flags);
+
+                       bch->b_if.ifc.l1l2(&bch->b_if.ifc,
+                                          PH_ACTIVATE |
+                                          INDICATION,
+                                          NULL);
+                       break;
 
+               case L1_MODE_TRANS:
+                       spin_lock_irqsave(&l1->lock,
+                                         flags);
+                       l1->hw->mr.
+                               fifo_rx_trans_enables[l1->
+                                                     st_num]
+                               |=
+                               ((bch->bchan ==
+                                 1) ? 0x2 : 0x8);
+                       l1->hw->mr.timer_usg_cnt++;
+                       Write_hfc8(l1->hw, R_FIFO,
+                                  (l1->st_num * 8 +
+                                   ((bch->bchan ==
+                                     1) ? 0 : 2)));
+                       wait_busy(l1->hw);
+                       Write_hfc8(l1->hw, A_CON_HDLC, 0xf);    /* Transparent mode, 1 fill, connect ST */
+                       Write_hfc8(l1->hw, A_SUBCH_CFG, 0);     /* 8 bits */
+                       Write_hfc8(l1->hw, A_IRQ_MSK, 0);       /* disable TX interrupts */
+                       Write_hfc8(l1->hw, A_INC_RES_FIFO, 2);  /* reset fifo */
+                       wait_busy(l1->hw);
+
+                       Write_hfc8(l1->hw, R_FIFO,
+                                  (l1->st_num * 8 +
+                                   ((bch->bchan ==
+                                     1) ? 1 : 3)));
+                       wait_busy(l1->hw);
+                       Write_hfc8(l1->hw, A_CON_HDLC, 0xf);    /* Transparent mode, 1 fill, connect ST */
+                       Write_hfc8(l1->hw, A_SUBCH_CFG, 0);     /* 8 bits */
+                       Write_hfc8(l1->hw, A_IRQ_MSK, 0);       /* disable RX interrupts */
+                       Write_hfc8(l1->hw, A_INC_RES_FIFO, 2);  /* reset fifo */
+
+                       Write_hfc8(l1->hw, R_ST_SEL,
+                                  l1->st_num);
+                       l1->hw->mr.r_ctrl0 |=
+                               (bch->bchan & 3);
+                       Write_hfc8(l1->hw, A_ST_CTRL0,
+                                  l1->hw->mr.r_ctrl0);
+                       bch->mode = L1_MODE_TRANS;
+                       spin_unlock_irqrestore(&l1->lock,
+                                              flags);
+
+                       bch->b_if.ifc.l1l2(&bch->b_if.ifc,
+                                          PH_ACTIVATE |
+                                          INDICATION,
+                                          NULL);
                        break;
 
                default:
-                       printk(KERN_INFO
-                              "HFC-4S/8S: Unknown B-chan cmd 0x%x received, ignored\n",
-                              pr);
+                       if (bch->mode == L1_MODE_NULL)
+                               break;
+                       spin_lock_irqsave(&l1->lock,
+                                         flags);
+                       l1->hw->mr.
+                               fifo_slow_timer_service[l1->
+                                                       st_num]
+                               &=
+                               ~((bch->bchan ==
+                                  1) ? 0x3 : 0xc);
+                       l1->hw->mr.
+                               fifo_rx_trans_enables[l1->
+                                                     st_num]
+                               &=
+                               ~((bch->bchan ==
+                                  1) ? 0x3 : 0xc);
+                       l1->hw->mr.timer_usg_cnt--;
+                       Write_hfc8(l1->hw, R_FIFO,
+                                  (l1->st_num * 8 +
+                                   ((bch->bchan ==
+                                     1) ? 0 : 2)));
+                       wait_busy(l1->hw);
+                       Write_hfc8(l1->hw, A_IRQ_MSK, 0);       /* disable TX interrupts */
+                       wait_busy(l1->hw);
+                       Write_hfc8(l1->hw, R_FIFO,
+                                  (l1->st_num * 8 +
+                                   ((bch->bchan ==
+                                     1) ? 1 : 3)));
+                       wait_busy(l1->hw);
+                       Write_hfc8(l1->hw, A_IRQ_MSK, 0);       /* disable RX interrupts */
+                       Write_hfc8(l1->hw, R_ST_SEL,
+                                  l1->st_num);
+                       l1->hw->mr.r_ctrl0 &=
+                               ~(bch->bchan & 3);
+                       Write_hfc8(l1->hw, A_ST_CTRL0,
+                                  l1->hw->mr.r_ctrl0);
+                       spin_unlock_irqrestore(&l1->lock,
+                                              flags);
+
+                       bch->mode = L1_MODE_NULL;
+                       bch->b_if.ifc.l1l2(&bch->b_if.ifc,
+                                          PH_DEACTIVATE |
+                                          INDICATION,
+                                          NULL);
+                       if (bch->tx_skb) {
+                               dev_kfree_skb(bch->tx_skb);
+                               bch->tx_skb = NULL;
+                       }
+                       if (bch->rx_skb) {
+                               dev_kfree_skb(bch->rx_skb);
+                               bch->rx_skb = NULL;
+                       }
+                       skb_queue_purge(&bch->tx_queue);
+                       bch->tx_cnt = 0;
+                       bch->rx_ptr = NULL;
                        break;
+               }
+
+               /* timer is only used when at least one b channel */
+               /* is set up to transparent mode */
+               if (l1->hw->mr.timer_usg_cnt) {
+                       Write_hfc8(l1->hw, R_IRQMSK_MISC,
+                                  M_TI_IRQMSK);
+               } else {
+                       Write_hfc8(l1->hw, R_IRQMSK_MISC, 0);
+               }
+
+               break;
+
+       default:
+               printk(KERN_INFO
+                      "HFC-4S/8S: Unknown B-chan cmd 0x%x received, ignored\n",
+                      pr);
+               break;
        }
        if (!l1->enabled)
                bch->b_if.ifc.l1l2(&bch->b_if.ifc,
@@ -742,7 +742,7 @@ rx_d_frame(struct hfc4s8s_l1 *l1p, int ech)
 #ifdef HISAX_HFC4S8S_PCIMEM
                                        Read_hfc8(l1p->hw, A_FIFO_DATA0);
 #else
-                                       fRead_hfc8(l1p->hw);
+                               fRead_hfc8(l1p->hw);
 #endif
 
                                Write_hfc8(l1p->hw, A_INC_RES_FIFO, 1);
@@ -760,7 +760,7 @@ rx_d_frame(struct hfc4s8s_l1 *l1p, int ech)
                while (z1 >= 4) {
 #ifdef HISAX_HFC4S8S_PCIMEM
                        *((unsigned long *) cp) =
-                           Read_hfc32(l1p->hw, A_FIFO_DATA0);
+                               Read_hfc32(l1p->hw, A_FIFO_DATA0);
 #else
                        *((unsigned long *) cp) = fRead_hfc32(l1p->hw);
 #endif
@@ -772,7 +772,7 @@ rx_d_frame(struct hfc4s8s_l1 *l1p, int ech)
 #ifdef HISAX_HFC4S8S_PCIMEM
                        *cp++ = Read_hfc8(l1p->hw, A_FIFO_DATA0);
 #else
-                       *cp++ = fRead_hfc8(l1p->hw);
+               *cp++ = fRead_hfc8(l1p->hw);
 #endif
 
                Write_hfc8(l1p->hw, A_INC_RES_FIFO, 1); /* increment f counter */
@@ -866,10 +866,10 @@ rx_b_frame(struct hfc4s8s_btype *bch)
                while (z1 >= 4) {
 #ifdef HISAX_HFC4S8S_PCIMEM
                        *((unsigned long *) bch->rx_ptr) =
-                           Read_hfc32(l1->hw, A_FIFO_DATA0);
+                               Read_hfc32(l1->hw, A_FIFO_DATA0);
 #else
                        *((unsigned long *) bch->rx_ptr) =
-                           fRead_hfc32(l1->hw);
+                               fRead_hfc32(l1->hw);
 #endif
                        bch->rx_ptr += 4;
                        z1 -= 4;
@@ -879,7 +879,7 @@ rx_b_frame(struct hfc4s8s_btype *bch)
 #ifdef HISAX_HFC4S8S_PCIMEM
                        *(bch->rx_ptr++) = Read_hfc8(l1->hw, A_FIFO_DATA0);
 #else
-                       *(bch->rx_ptr++) = fRead_hfc8(l1->hw);
+               *(bch->rx_ptr++) = fRead_hfc8(l1->hw);
 #endif
 
                if (hdlc_complete) {
@@ -996,7 +996,7 @@ tx_b_frame(struct hfc4s8s_btype *bch)
                if (bch->mode == L1_MODE_HDLC) {
                        hdlc_num = Read_hfc8(l1->hw, A_F1) & MAX_F_CNT;
                        hdlc_num -=
-                           (Read_hfc8_stable(l1->hw, A_F2) & MAX_F_CNT);
+                               (Read_hfc8_stable(l1->hw, A_F2) & MAX_F_CNT);
                        if (hdlc_num < 0)
                                hdlc_num += 16;
                        if (hdlc_num >= 15)
@@ -1008,7 +1008,7 @@ tx_b_frame(struct hfc4s8s_btype *bch)
                        if (!(skb = skb_dequeue(&bch->tx_queue))) {
                                l1->hw->mr.fifo_slow_timer_service[l1->
                                                                   st_num]
-                                   &= ~((bch->bchan == 1) ? 1 : 4);
+                                       &= ~((bch->bchan == 1) ? 1 : 4);
                                break;  /* list empty */
                        }
                        bch->tx_skb = skb;
@@ -1017,10 +1017,10 @@ tx_b_frame(struct hfc4s8s_btype *bch)
 
                if (!hdlc_num)
                        l1->hw->mr.fifo_slow_timer_service[l1->st_num] |=
-                           ((bch->bchan == 1) ? 1 : 4);
+                               ((bch->bchan == 1) ? 1 : 4);
                else
                        l1->hw->mr.fifo_slow_timer_service[l1->st_num] &=
-                           ~((bch->bchan == 1) ? 1 : 4);
+                               ~((bch->bchan == 1) ? 1 : 4);
 
                max = Read_hfc16_stable(l1->hw, A_Z2);
                max -= Read_hfc16(l1->hw, A_Z1);
@@ -1055,7 +1055,7 @@ tx_b_frame(struct hfc4s8s_btype *bch)
 #ifdef HISAX_HFC4S8S_PCIMEM
                        fWrite_hfc8(l1->hw, A_FIFO_DATA0, *cp++);
 #else
-                       fWrite_hfc8(l1->hw, *cp++);
+               fWrite_hfc8(l1->hw, *cp++);
 #endif
 
                if (bch->tx_cnt >= skb->len) {
@@ -1106,8 +1106,8 @@ hfc4s8s_bh(struct work_struct *work)
                                        Write_hfc8(l1p->hw, R_ST_SEL,
                                                   l1p->st_num);
                                        l1p->l1_state =
-                                           Read_hfc8(l1p->hw,
-                                                     A_ST_RD_STA) & 0xf;
+                                               Read_hfc8(l1p->hw,
+                                                         A_ST_RD_STA) & 0xf;
 
                                        if ((oldstate == 3)
                                            && (l1p->l1_state != 3))
@@ -1123,12 +1123,12 @@ hfc4s8s_bh(struct work_struct *work)
                                                del_timer(&l1p->l1_timer);
                                                if (l1p->l1_state == 3) {
                                                        l1p->d_if.ifc.
-                                                           l1l2(&l1p->
-                                                                d_if.ifc,
-                                                                PH_ACTIVATE
-                                                                |
-                                                                INDICATION,
-                                                                NULL);
+                                                               l1l2(&l1p->
+                                                                    d_if.ifc,
+                                                                    PH_ACTIVATE
+                                                                    |
+                                                                    INDICATION,
+                                                                    NULL);
                                                }
                                        } else {
                                                /* allow transition */
@@ -1148,8 +1148,8 @@ hfc4s8s_bh(struct work_struct *work)
                                        Write_hfc8(l1p->hw, R_ST_SEL,
                                                   l1p->st_num);
                                        l1p->l1_state =
-                                           Read_hfc8(l1p->hw,
-                                                     A_ST_RD_STA) & 0xf;
+                                               Read_hfc8(l1p->hw,
+                                                         A_ST_RD_STA) & 0xf;
 
                                        if (((l1p->l1_state == 3) &&
                                             ((oldstate == 7) ||
@@ -1165,26 +1165,26 @@ hfc4s8s_bh(struct work_struct *work)
                                                        del_timer(&l1p->
                                                                  l1_timer);
                                                        l1p->d_if.ifc.
-                                                           l1l2(&l1p->
-                                                                d_if.ifc,
-                                                                PH_ACTIVATE
-                                                                |
-                                                                INDICATION,
-                                                                NULL);
+                                                               l1l2(&l1p->
+                                                                    d_if.ifc,
+                                                                    PH_ACTIVATE
+                                                                    |
+                                                                    INDICATION,
+                                                                    NULL);
                                                        tx_d_frame(l1p);
                                                }
                                                if (l1p->l1_state == 3) {
                                                        if (oldstate != 3)
                                                                l1p->d_if.
-                                                                   ifc.
-                                                                   l1l2
-                                                                   (&l1p->
-                                                                    d_if.
-                                                                    ifc,
-                                                                    PH_DEACTIVATE
-                                                                    |
-                                                                    INDICATION,
-                                                                    NULL);
+                                                                       ifc.
+                                                                       l1l2
+                                                                       (&l1p->
+                                                                        d_if.
+                                                                        ifc,
+                                                                        PH_DEACTIVATE
+                                                                        |
+                                                                        INDICATION,
+                                                                        NULL);
                                                }
                                        }
                                        printk(KERN_INFO
@@ -1209,8 +1209,8 @@ hfc4s8s_bh(struct work_struct *work)
                        *fifo_stat |= hw->mr.fifo_rx_trans_enables[idx];
                        if (hw->fifo_sched_cnt <= 0) {
                                *fifo_stat |=
-                                   hw->mr.fifo_slow_timer_service[l1p->
-                                                                  st_num];
+                                       hw->mr.fifo_slow_timer_service[l1p->
+                                                                      st_num];
                        }
                }
                /* ignore fifo 6 (TX E fifo) */
@@ -1288,10 +1288,10 @@ hfc4s8s_interrupt(int intno, void *dev_id)
 
        /* Layer 1 State change */
        hw->mr.r_irq_statech |=
-           (Read_hfc8(hw, R_SCI) & hw->mr.r_irqmsk_statchg);
+               (Read_hfc8(hw, R_SCI) & hw->mr.r_irqmsk_statchg);
        if (!
            (b = (Read_hfc8(hw, R_STATUS) & (M_MISC_IRQSTA | M_FR_IRQSTA)))
-&& !hw->mr.r_irq_statech) {
+           && !hw->mr.r_irq_statech) {
 #ifndef        HISAX_HFC4S8S_PCIMEM
                SetRegAddr(hw, old_ioreg);
 #endif
@@ -1332,7 +1332,7 @@ hfc4s8s_interrupt(int intno, void *dev_id)
 /* reset the complete chip, don't release the chips irq but disable it */
 /***********************************************************************/
 static void
-chipreset(hfc4s8s_hw * hw)
+chipreset(hfc4s8s_hw *hw)
 {
        u_long flags;
 
@@ -1361,7 +1361,7 @@ chipreset(hfc4s8s_hw * hw)
 /* disable/enable hardware in nt or te mode */
 /********************************************/
 static void
-hfc_hardware_enable(hfc4s8s_hw * hw, int enable, int nt_mode)
+hfc_hardware_enable(hfc4s8s_hw *hw, int enable, int nt_mode)
 {
        u_long flags;
        char if_name[40];
@@ -1468,7 +1468,7 @@ hfc_hardware_enable(hfc4s8s_hw * hw, int enable, int nt_mode)
 /* disable memory mapped ports / io ports */
 /******************************************/
 static void
-release_pci_ports(hfc4s8s_hw * hw)
+release_pci_ports(hfc4s8s_hw *hw)
 {
        pci_write_config_word(hw->pdev, PCI_COMMAND, 0);
 #ifdef HISAX_HFC4S8S_PCIMEM
@@ -1484,7 +1484,7 @@ release_pci_ports(hfc4s8s_hw * hw)
 /* enable memory mapped ports / io ports */
 /*****************************************/
 static void
-enable_pci_ports(hfc4s8s_hw * hw)
+enable_pci_ports(hfc4s8s_hw *hw)
 {
 #ifdef HISAX_HFC4S8S_PCIMEM
        pci_write_config_word(hw->pdev, PCI_COMMAND, PCI_ENA_MEMIO);
@@ -1498,7 +1498,7 @@ enable_pci_ports(hfc4s8s_hw * hw)
 /* return 0 on success.              */
 /*************************************/
 static int __devinit
-setup_instance(hfc4s8s_hw * hw)
+setup_instance(hfc4s8s_hw *hw)
 {
        int err = -EIO;
        int i;
@@ -1575,7 +1575,7 @@ setup_instance(hfc4s8s_hw * hw)
 
        return (0);
 
-      out:
+out:
        hw->irq = 0;
        release_pci_ports(hw);
        kfree(hw);
@@ -1632,7 +1632,7 @@ hfc4s8s_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
                card_cnt++;
        return (err);
 
-      out:
+out:
        kfree(hw);
        return (err);
 }
@@ -1660,10 +1660,10 @@ hfc4s8s_remove(struct pci_dev *pdev)
 }
 
 static struct pci_driver hfc4s8s_driver = {
-      .name    = "hfc4s8s_l1",
-      .probe   = hfc4s8s_probe,
-      .remove  = __devexit_p(hfc4s8s_remove),
-      .id_table        = hfc4s8s_ids,
+       .name   = "hfc4s8s_l1",
+       .probe  = hfc4s8s_probe,
+       .remove = __devexit_p(hfc4s8s_remove),
+       .id_table       = hfc4s8s_ids,
 };
 
 /**********************/
@@ -1697,7 +1697,7 @@ hfc4s8s_module_init(void)
 #endif
 
        return 0;
-      out:
+out:
        return (err);
 }                              /* hfc4s8s_init_hw */
 
index 9d5d2a5..6a8f891 100644 (file)
 
 
 /*
-*  include Genero generated HFC-4S/8S header file hfc48scu.h
-*  for complete register description. This will define _HFC48SCU_H_
-*  to prevent redefinitions
-*/
+ *  include Genero generated HFC-4S/8S header file hfc48scu.h
+ *  for complete register description. This will define _HFC48SCU_H_
+ *  to prevent redefinitions
+ */
 
 // #include "hfc48scu.h"
 
index a16459a..a756e5c 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Author       Karsten Keil
  * Copyright    by Karsten Keil      <keil@isdn4linux.de>
- * 
+ *
  * This software may be used and distributed according to the terms
  * of the GNU General Public License, incorporated herein by reference.
  *
 #include "isdnl1.h"
 #include <linux/interrupt.h>
 /*
-#define KDEBUG_DEF
-#include "kdebug.h"
+  #define KDEBUG_DEF
+  #include "kdebug.h"
 */
 
-#define byteout(addr,val) outb(val,addr)
+#define byteout(addr, val) outb(val, addr)
 #define bytein(addr) inb(addr)
 
 static void
-dummyf(struct IsdnCardState *cs, u_char * data, int size)
+dummyf(struct IsdnCardState *cs, u_char *data, int size)
 {
        printk(KERN_WARNING "HiSax: hfcd dummy fifo called\n");
 }
@@ -37,7 +37,7 @@ ReadReg(struct IsdnCardState *cs, int data, u_char reg)
        register u_char ret;
 
        if (data) {
-               if (cs->hw.hfcD.cip != reg) { 
+               if (cs->hw.hfcD.cip != reg) {
                        cs->hw.hfcD.cip = reg;
                        byteout(cs->hw.hfcD.addr | 1, reg);
                }
@@ -54,7 +54,7 @@ ReadReg(struct IsdnCardState *cs, int data, u_char reg)
 static inline void
 WriteReg(struct IsdnCardState *cs, int data, u_char reg, u_char value)
 {
-       if (cs->hw.hfcD.cip != reg) { 
+       if (cs->hw.hfcD.cip != reg) {
                cs->hw.hfcD.cip = reg;
                byteout(cs->hw.hfcD.addr | 1, reg);
        }
@@ -71,7 +71,7 @@ WriteReg(struct IsdnCardState *cs, int data, u_char reg, u_char value)
 static u_char
 readreghfcd(struct IsdnCardState *cs, u_char offset)
 {
-       return(ReadReg(cs, HFCD_DATA, offset));
+       return (ReadReg(cs, HFCD_DATA, offset));
 }
 
 static void
@@ -103,7 +103,7 @@ WaitNoBusy(struct IsdnCardState *cs)
                udelay(1);
                to--;
        }
-       if (!to) 
+       if (!to)
                printk(KERN_WARNING "HiSax: WaitNoBusy timeout\n");
        return (to);
 }
@@ -114,29 +114,29 @@ SelFiFo(struct IsdnCardState *cs, u_char FiFo)
        u_char cip;
 
        if (cs->hw.hfcD.fifo == FiFo)
-               return(1);
-       switch(FiFo) {
-               case 0: cip = HFCB_FIFO | HFCB_Z1 | HFCB_SEND | HFCB_B1;
-                       break;
-               case 1: cip = HFCB_FIFO | HFCB_Z1 | HFCB_REC | HFCB_B1;
-                       break;
-               case 2: cip = HFCB_FIFO | HFCB_Z1 | HFCB_SEND | HFCB_B2;
-                       break;
-               case 3: cip = HFCB_FIFO | HFCB_Z1 | HFCB_REC | HFCB_B2;
-                       break;
-               case 4: cip = HFCD_FIFO | HFCD_Z1 | HFCD_SEND;
-                       break;
-               case 5: cip = HFCD_FIFO | HFCD_Z1 | HFCD_REC;
-                       break;
-               default:
-                       debugl1(cs, "SelFiFo Error");
-                       return(0);
+               return (1);
+       switch (FiFo) {
+       case 0: cip = HFCB_FIFO | HFCB_Z1 | HFCB_SEND | HFCB_B1;
+               break;
+       case 1: cip = HFCB_FIFO | HFCB_Z1 | HFCB_REC | HFCB_B1;
+               break;
+       case 2: cip = HFCB_FIFO | HFCB_Z1 | HFCB_SEND | HFCB_B2;
+               break;
+       case 3: cip = HFCB_FIFO | HFCB_Z1 | HFCB_REC | HFCB_B2;
+               break;
+       case 4: cip = HFCD_FIFO | HFCD_Z1 | HFCD_SEND;
+               break;
+       case 5: cip = HFCD_FIFO | HFCD_Z1 | HFCD_REC;
+               break;
+       default:
+               debugl1(cs, "SelFiFo Error");
+               return (0);
        }
        cs->hw.hfcD.fifo = FiFo;
        WaitNoBusy(cs);
        cs->BC_Write_Reg(cs, HFCD_DATA, cip, 0);
        WaitForBusy(cs);
-       return(2);
+       return (2);
 }
 
 static int
@@ -188,7 +188,7 @@ static struct sk_buff
        int idx;
        int chksum;
        u_char stat, cip;
-       
+
        if ((cs->debug & L1_DEB_HSCX) && !(cs->debug & L1_DEB_HSCX_FIFO))
                debugl1(cs, "hfc_empty_fifo");
        idx = 0;
@@ -252,7 +252,7 @@ static struct sk_buff
        WaitForBusy(cs);
        WaitNoBusy(cs);
        stat = ReadReg(cs, HFCD_DATA, HFCB_FIFO | HFCB_F2_INC |
-               HFCB_REC | HFCB_CHANNEL(bcs->channel));
+                      HFCB_REC | HFCB_CHANNEL(bcs->channel));
        WaitForBusy(cs);
        return (skb);
 }
@@ -269,7 +269,7 @@ hfc_fill_fifo(struct BCState *bcs)
                return;
        if (bcs->tx_skb->len <= 0)
                return;
-       SelFiFo(cs, HFCB_SEND | HFCB_CHANNEL(bcs->channel)); 
+       SelFiFo(cs, HFCB_SEND | HFCB_CHANNEL(bcs->channel));
        cip = HFCB_FIFO | HFCB_F1 | HFCB_SEND | HFCB_CHANNEL(bcs->channel);
        WaitNoBusy(cs);
        bcs->hw.hfc.f1 = ReadReg(cs, HFCD_DATA, cip);
@@ -278,7 +278,7 @@ hfc_fill_fifo(struct BCState *bcs)
        WaitNoBusy(cs);
        bcs->hw.hfc.f2 = ReadReg(cs, HFCD_DATA, cip);
        bcs->hw.hfc.send[bcs->hw.hfc.f1] = ReadZReg(cs, HFCB_FIFO | HFCB_Z1 | HFCB_SEND | HFCB_CHANNEL(bcs->channel));
-       if (cs->debug & L1_DEB_HSCX)
+       if (cs->debug & L1_DEB_HSCX)
                debugl1(cs, "hfc_fill_fifo %d f1(%d) f2(%d) z1(%x)",
                        bcs->channel, bcs->hw.hfc.f1, bcs->hw.hfc.f2,
                        bcs->hw.hfc.send[bcs->hw.hfc.f1]);
@@ -316,8 +316,8 @@ hfc_fill_fifo(struct BCState *bcs)
                printk(KERN_WARNING "HFC S FIFO channel %d BUSY Error\n", bcs->channel);
        } else {
                bcs->tx_cnt -= bcs->tx_skb->len;
-               if (test_bit(FLG_LLI_L1WAKEUP,&bcs->st->lli.flag) &&
-                       (PACKET_NOACK != bcs->tx_skb->pkt_type)) {
+               if (test_bit(FLG_LLI_L1WAKEUP, &bcs->st->lli.flag) &&
+                   (PACKET_NOACK != bcs->tx_skb->pkt_type)) {
                        u_long  flags;
                        spin_lock_irqsave(&bcs->aclock, flags);
                        bcs->ackcnt += bcs->tx_skb->len;
@@ -339,12 +339,12 @@ static void
 hfc_send_data(struct BCState *bcs)
 {
        struct IsdnCardState *cs = bcs->cs;
-       
+
        if (!test_and_set_bit(FLG_LOCK_ATOMIC, &cs->HW_Flags)) {
                hfc_fill_fifo(bcs);
                test_and_clear_bit(FLG_LOCK_ATOMIC, &cs->HW_Flags);
        } else
-               debugl1(cs,"send_data %d blocked", bcs->channel);
+               debugl1(cs, "send_data %d blocked", bcs->channel);
 }
 
 static void
@@ -356,10 +356,10 @@ main_rec_2bds0(struct BCState *bcs)
        int receive, count = 5;
        struct sk_buff *skb;
 
-    Begin:
+Begin:
        count--;
        if (test_and_set_bit(FLG_LOCK_ATOMIC, &cs->HW_Flags)) {
-               debugl1(cs,"rec_data %d blocked", bcs->channel);
+               debugl1(cs, "rec_data %d blocked", bcs->channel);
                return;
        }
        SelFiFo(cs, HFCB_REC | HFCB_CHANNEL(bcs->channel));
@@ -386,10 +386,10 @@ main_rec_2bds0(struct BCState *bcs)
                        skb_queue_tail(&bcs->rqueue, skb);
                        schedule_event(bcs, B_RCVBUFREADY);
                }
-               rcnt = f1 -f2;
-               if (rcnt<0)
+               rcnt = f1 - f2;
+               if (rcnt < 0)
                        rcnt += 32;
-               if (rcnt>1)
+               if (rcnt > 1)
                        receive = 1;
                else
                        receive = 0;
@@ -397,7 +397,7 @@ main_rec_2bds0(struct BCState *bcs)
                receive = 0;
        test_and_clear_bit(FLG_LOCK_ATOMIC, &cs->HW_Flags);
        if (count && receive)
-               goto Begin;     
+               goto Begin;
        return;
 }
 
@@ -412,37 +412,37 @@ mode_2bs0(struct BCState *bcs, int mode, int bc)
        bcs->mode = mode;
        bcs->channel = bc;
        switch (mode) {
-               case (L1_MODE_NULL):
-                       if (bc) {
-                               cs->hw.hfcD.conn |= 0x18;
-                               cs->hw.hfcD.sctrl &= ~SCTRL_B2_ENA;
-                       } else {
-                               cs->hw.hfcD.conn |= 0x3;
-                               cs->hw.hfcD.sctrl &= ~SCTRL_B1_ENA;
-                       }
-                       break;
-               case (L1_MODE_TRANS):
-                       if (bc) {
-                               cs->hw.hfcD.ctmt |= 2;
-                               cs->hw.hfcD.conn &= ~0x18;
-                               cs->hw.hfcD.sctrl |= SCTRL_B2_ENA;
-                       } else {
-                               cs->hw.hfcD.ctmt |= 1;
-                               cs->hw.hfcD.conn &= ~0x3;
-                               cs->hw.hfcD.sctrl |= SCTRL_B1_ENA;
-                       }
-                       break;
-               case (L1_MODE_HDLC):
-                       if (bc) {
-                               cs->hw.hfcD.ctmt &= ~2;
-                               cs->hw.hfcD.conn &= ~0x18;
-                               cs->hw.hfcD.sctrl |= SCTRL_B2_ENA;
-                       } else {
-                               cs->hw.hfcD.ctmt &= ~1;
-                               cs->hw.hfcD.conn &= ~0x3;
-                               cs->hw.hfcD.sctrl |= SCTRL_B1_ENA;
-                       }
-                       break;
+       case (L1_MODE_NULL):
+               if (bc) {
+                       cs->hw.hfcD.conn |= 0x18;
+                       cs->hw.hfcD.sctrl &= ~SCTRL_B2_ENA;
+               } else {
+                       cs->hw.hfcD.conn |= 0x3;
+                       cs->hw.hfcD.sctrl &= ~SCTRL_B1_ENA;
+               }
+               break;
+       case (L1_MODE_TRANS):
+               if (bc) {
+                       cs->hw.hfcD.ctmt |= 2;
+                       cs->hw.hfcD.conn &= ~0x18;
+                       cs->hw.hfcD.sctrl |= SCTRL_B2_ENA;
+               } else {
+                       cs->hw.hfcD.ctmt |= 1;
+                       cs->hw.hfcD.conn &= ~0x3;
+                       cs->hw.hfcD.sctrl |= SCTRL_B1_ENA;
+               }
+               break;
+       case (L1_MODE_HDLC):
+               if (bc) {
+                       cs->hw.hfcD.ctmt &= ~2;
+                       cs->hw.hfcD.conn &= ~0x18;
+                       cs->hw.hfcD.sctrl |= SCTRL_B2_ENA;
+               } else {
+                       cs->hw.hfcD.ctmt &= ~1;
+                       cs->hw.hfcD.conn &= ~0x3;
+                       cs->hw.hfcD.sctrl |= SCTRL_B1_ENA;
+               }
+               break;
        }
        WriteReg(cs, HFCD_DATA, HFCD_SCTRL, cs->hw.hfcD.sctrl);
        WriteReg(cs, HFCD_DATA, HFCD_CTMT, cs->hw.hfcD.ctmt);
@@ -457,53 +457,53 @@ hfc_l2l1(struct PStack *st, int pr, void *arg)
        u_long flags;
 
        switch (pr) {
-               case (PH_DATA | REQUEST):
-                       spin_lock_irqsave(&bcs->cs->lock, flags);
-                       if (bcs->tx_skb) {
-                               skb_queue_tail(&bcs->squeue, skb);
-                       } else {
-                               bcs->tx_skb = skb;
+       case (PH_DATA | REQUEST):
+               spin_lock_irqsave(&bcs->cs->lock, flags);
+               if (bcs->tx_skb) {
+                       skb_queue_tail(&bcs->squeue, skb);
+               } else {
+                       bcs->tx_skb = skb;
 //                             test_and_set_bit(BC_FLG_BUSY, &bcs->Flag);
-                               bcs->cs->BC_Send_Data(bcs);
-                       }
-                       spin_unlock_irqrestore(&bcs->cs->lock, flags);
-                       break;
-               case (PH_PULL | INDICATION):
-                       spin_lock_irqsave(&bcs->cs->lock, flags);
-                       if (bcs->tx_skb) {
-                               printk(KERN_WARNING "hfc_l2l1: this shouldn't happen\n");
-                       } else {
+                       bcs->cs->BC_Send_Data(bcs);
+               }
+               spin_unlock_irqrestore(&bcs->cs->lock, flags);
+               break;
+       case (PH_PULL | INDICATION):
+               spin_lock_irqsave(&bcs->cs->lock, flags);
+               if (bcs->tx_skb) {
+                       printk(KERN_WARNING "hfc_l2l1: this shouldn't happen\n");
+               } else {
 //                             test_and_set_bit(BC_FLG_BUSY, &bcs->Flag);
-                               bcs->tx_skb = skb;
-                               bcs->cs->BC_Send_Data(bcs);
-                       }
-                       spin_unlock_irqrestore(&bcs->cs->lock, flags);
-                       break;
-               case (PH_PULL | REQUEST):
-                       if (!bcs->tx_skb) {
-                               test_and_clear_bit(FLG_L1_PULL_REQ, &st->l1.Flags);
-                               st->l1.l1l2(st, PH_PULL | CONFIRM, NULL);
-                       } else
-                               test_and_set_bit(FLG_L1_PULL_REQ, &st->l1.Flags);
-                       break;
-               case (PH_ACTIVATE | REQUEST):
-                       spin_lock_irqsave(&bcs->cs->lock, flags);
-                       test_and_set_bit(BC_FLG_ACTIV, &bcs->Flag);
-                       mode_2bs0(bcs, st->l1.mode, st->l1.bc);
-                       spin_unlock_irqrestore(&bcs->cs->lock, flags);
-                       l1_msg_b(st, pr, arg);
-                       break;
-               case (PH_DEACTIVATE | REQUEST):
-                       l1_msg_b(st, pr, arg);
-                       break;
-               case (PH_DEACTIVATE | CONFIRM):
-                       spin_lock_irqsave(&bcs->cs->lock, flags);
-                       test_and_clear_bit(BC_FLG_ACTIV, &bcs->Flag);
-                       test_and_clear_bit(BC_FLG_BUSY, &bcs->Flag);
-                       mode_2bs0(bcs, 0, st->l1.bc);
-                       spin_unlock_irqrestore(&bcs->cs->lock, flags);
-                       st->l1.l1l2(st, PH_DEACTIVATE | CONFIRM, NULL);
-                       break;
+                       bcs->tx_skb = skb;
+                       bcs->cs->BC_Send_Data(bcs);
+               }
+               spin_unlock_irqrestore(&bcs->cs->lock, flags);
+               break;
+       case (PH_PULL | REQUEST):
+               if (!bcs->tx_skb) {
+                       test_and_clear_bit(FLG_L1_PULL_REQ, &st->l1.Flags);
+                       st->l1.l1l2(st, PH_PULL | CONFIRM, NULL);
+               } else
+                       test_and_set_bit(FLG_L1_PULL_REQ, &st->l1.Flags);
+               break;
+       case (PH_ACTIVATE | REQUEST):
+               spin_lock_irqsave(&bcs->cs->lock, flags);
+               test_and_set_bit(BC_FLG_ACTIV, &bcs->Flag);
+               mode_2bs0(bcs, st->l1.mode, st->l1.bc);
+               spin_unlock_irqrestore(&bcs->cs->lock, flags);
+               l1_msg_b(st, pr, arg);
+               break;
+       case (PH_DEACTIVATE | REQUEST):
+               l1_msg_b(st, pr, arg);
+               break;
+       case (PH_DEACTIVATE | CONFIRM):
+               spin_lock_irqsave(&bcs->cs->lock, flags);
+               test_and_clear_bit(BC_FLG_ACTIV, &bcs->Flag);
+               test_and_clear_bit(BC_FLG_BUSY, &bcs->Flag);
+               mode_2bs0(bcs, 0, st->l1.bc);
+               spin_unlock_irqrestore(&bcs->cs->lock, flags);
+               st->l1.l1l2(st, PH_DEACTIVATE | CONFIRM, NULL);
+               break;
        }
 }
 
@@ -558,23 +558,23 @@ hfcd_bh(struct work_struct *work)
 
        if (test_and_clear_bit(D_L1STATECHANGE, &cs->event)) {
                switch (cs->dc.hfcd.ph_state) {
-                       case (0):
-                               l1_msg(cs, HW_RESET | INDICATION, NULL);
-                               break;
-                       case (3):
-                               l1_msg(cs, HW_DEACTIVATE | INDICATION, NULL);
-                               break;
-                       case (8):
-                               l1_msg(cs, HW_RSYNC | INDICATION, NULL);
-                               break;
-                       case (6):
-                               l1_msg(cs, HW_INFO2 | INDICATION, NULL);
-                               break;
-                       case (7):
-                               l1_msg(cs, HW_INFO4_P8 | INDICATION, NULL);
-                               break;
-                       default:
-                               break;
+               case (0):
+                       l1_msg(cs, HW_RESET | INDICATION, NULL);
+                       break;
+               case (3):
+                       l1_msg(cs, HW_DEACTIVATE | INDICATION, NULL);
+                       break;
+               case (8):
+                       l1_msg(cs, HW_RSYNC | INDICATION, NULL);
+                       break;
+               case (6):
+                       l1_msg(cs, HW_INFO2 | INDICATION, NULL);
+                       break;
+               case (7):
+                       l1_msg(cs, HW_INFO4_P8 | INDICATION, NULL);
+                       break;
+               default:
+                       break;
                }
        }
        if (test_and_clear_bit(D_RCVBUFREADY, &cs->event))
@@ -591,12 +591,12 @@ int receive_dmsg(struct IsdnCardState *cs)
        int rcnt, z1, z2;
        u_char stat, cip, f1, f2;
        int chksum;
-       int count=5;
+       int count = 5;
        u_char *ptr;
 
        if (test_and_set_bit(FLG_LOCK_ATOMIC, &cs->HW_Flags)) {
                debugl1(cs, "rec_dmsg blocked");
-               return(1);
+               return (1);
        }
        SelFiFo(cs, 4 | HFCD_REC);
        cip = HFCD_FIFO | HFCD_F1 | HFCD_REC;
@@ -682,8 +682,8 @@ int receive_dmsg(struct IsdnCardState *cs)
                f2 = cs->readisac(cs, cip) & 0xf;
        }
        test_and_clear_bit(FLG_LOCK_ATOMIC, &cs->HW_Flags);
-       return(1);
-} 
+       return (1);
+}
 
 static void
 hfc_fill_dfifo(struct IsdnCardState *cs)
@@ -750,23 +750,23 @@ hfc_fill_dfifo(struct IsdnCardState *cs)
        return;
 }
 
-static 
+static
 struct BCState *Sel_BCS(struct IsdnCardState *cs, int channel)
 {
        if (cs->bcs[0].mode && (cs->bcs[0].channel == channel))
-               return(&cs->bcs[0]);
+               return (&cs->bcs[0]);
        else if (cs->bcs[1].mode && (cs->bcs[1].channel == channel))
-               return(&cs->bcs[1]);
+               return (&cs->bcs[1]);
        else
-               return(NULL);
+               return (NULL);
 }
 
 void
 hfc2bds0_interrupt(struct IsdnCardState *cs, u_char val)
 {
-               u_char exval;
-               struct BCState *bcs;
-       int count=15;
+       u_char exval;
+       struct BCState *bcs;
+       int count = 15;
 
        if (cs->debug & L1_DEB_ISAC)
                debugl1(cs, "HFCD irq %x %s", val,
@@ -789,25 +789,25 @@ hfc2bds0_interrupt(struct IsdnCardState *cs, u_char val)
                }
                if (cs->hw.hfcD.int_s1 & 0x18) {
                        exval = val;
-                       val =  cs->hw.hfcD.int_s1;
+                       val = cs->hw.hfcD.int_s1;
                        cs->hw.hfcD.int_s1 = exval;
-               }       
+               }
                if (val & 0x08) {
-                       if (!(bcs=Sel_BCS(cs, 0))) {
+                       if (!(bcs = Sel_BCS(cs, 0))) {
                                if (cs->debug)
                                        debugl1(cs, "hfcd spurious 0x08 IRQ");
-                       } else 
+                       } else
                                main_rec_2bds0(bcs);
                }
                if (val & 0x10) {
-                       if (!(bcs=Sel_BCS(cs, 1))) {
+                       if (!(bcs = Sel_BCS(cs, 1))) {
                                if (cs->debug)
                                        debugl1(cs, "hfcd spurious 0x10 IRQ");
-                       } else 
+                       } else
                                main_rec_2bds0(bcs);
                }
                if (val & 0x01) {
-                       if (!(bcs=Sel_BCS(cs, 0))) {
+                       if (!(bcs = Sel_BCS(cs, 0))) {
                                if (cs->debug)
                                        debugl1(cs, "hfcd spurious 0x01 IRQ");
                        } else {
@@ -816,14 +816,14 @@ hfc2bds0_interrupt(struct IsdnCardState *cs, u_char val)
                                                hfc_fill_fifo(bcs);
                                                test_and_clear_bit(FLG_LOCK_ATOMIC, &cs->HW_Flags);
                                        } else
-                                               debugl1(cs,"fill_data %d blocked", bcs->channel);
+                                               debugl1(cs, "fill_data %d blocked", bcs->channel);
                                } else {
                                        if ((bcs->tx_skb = skb_dequeue(&bcs->squeue))) {
                                                if (!test_and_set_bit(FLG_LOCK_ATOMIC, &cs->HW_Flags)) {
                                                        hfc_fill_fifo(bcs);
                                                        test_and_clear_bit(FLG_LOCK_ATOMIC, &cs->HW_Flags);
                                                } else
-                                                       debugl1(cs,"fill_data %d blocked", bcs->channel);
+                                                       debugl1(cs, "fill_data %d blocked", bcs->channel);
                                        } else {
                                                schedule_event(bcs, B_XMTBUFREADY);
                                        }
@@ -831,7 +831,7 @@ hfc2bds0_interrupt(struct IsdnCardState *cs, u_char val)
                        }
                }
                if (val & 0x02) {
-                       if (!(bcs=Sel_BCS(cs, 1))) {
+                       if (!(bcs = Sel_BCS(cs, 1))) {
                                if (cs->debug)
                                        debugl1(cs, "hfcd spurious 0x02 IRQ");
                        } else {
@@ -840,14 +840,14 @@ hfc2bds0_interrupt(struct IsdnCardState *cs, u_char val)
                                                hfc_fill_fifo(bcs);
                                                test_and_clear_bit(FLG_LOCK_ATOMIC, &cs->HW_Flags);
                                        } else
-                                               debugl1(cs,"fill_data %d blocked", bcs->channel);
+                                               debugl1(cs, "fill_data %d blocked", bcs->channel);
                                } else {
                                        if ((bcs->tx_skb = skb_dequeue(&bcs->squeue))) {
                                                if (!test_and_set_bit(FLG_LOCK_ATOMIC, &cs->HW_Flags)) {
                                                        hfc_fill_fifo(bcs);
                                                        test_and_clear_bit(FLG_LOCK_ATOMIC, &cs->HW_Flags);
                                                } else
-                                                       debugl1(cs,"fill_data %d blocked", bcs->channel);
+                                                       debugl1(cs, "fill_data %d blocked", bcs->channel);
                                        } else {
                                                schedule_event(bcs, B_XMTBUFREADY);
                                        }
@@ -888,7 +888,7 @@ hfc2bds0_interrupt(struct IsdnCardState *cs, u_char val)
                        } else
                                schedule_event(cs, D_XMTBUFREADY);
                }
-      afterXPR:
+       afterXPR:
                if (cs->hw.hfcD.int_s1 && count--) {
                        val = cs->hw.hfcD.int_s1;
                        cs->hw.hfcD.int_s1 = 0;
@@ -905,105 +905,105 @@ HFCD_l1hw(struct PStack *st, int pr, void *arg)
        struct IsdnCardState *cs = (struct IsdnCardState *) st->l1.hardware;
        struct sk_buff *skb = arg;
        u_long flags;
-       
+
        switch (pr) {
-               case (PH_DATA | REQUEST):
-                       if (cs->debug & DEB_DLOG_HEX)
-                               LogFrame(cs, skb->data, skb->len);
-                       if (cs->debug & DEB_DLOG_VERBOSE)
-                               dlogframe(cs, skb, 0);
-                       spin_lock_irqsave(&cs->lock, flags);
-                       if (cs->tx_skb) {
-                               skb_queue_tail(&cs->sq, skb);
+       case (PH_DATA | REQUEST):
+               if (cs->debug & DEB_DLOG_HEX)
+                       LogFrame(cs, skb->data, skb->len);
+               if (cs->debug & DEB_DLOG_VERBOSE)
+                       dlogframe(cs, skb, 0);
+               spin_lock_irqsave(&cs->lock, flags);
+               if (cs->tx_skb) {
+                       skb_queue_tail(&cs->sq, skb);
 #ifdef L2FRAME_DEBUG           /* psa */
-                               if (cs->debug & L1_DEB_LAPD)
-                                       Logl2Frame(cs, skb, "PH_DATA Queued", 0);
-#endif
-                       } else {
-                               cs->tx_skb = skb;
-                               cs->tx_cnt = 0;
-#ifdef L2FRAME_DEBUG           /* psa */
-                               if (cs->debug & L1_DEB_LAPD)
-                                       Logl2Frame(cs, skb, "PH_DATA", 0);
+                       if (cs->debug & L1_DEB_LAPD)
+                               Logl2Frame(cs, skb, "PH_DATA Queued", 0);
 #endif
-                               if (!test_and_set_bit(FLG_LOCK_ATOMIC, &cs->HW_Flags)) {
-                                       hfc_fill_dfifo(cs);
-                                       test_and_clear_bit(FLG_LOCK_ATOMIC, &cs->HW_Flags);
-                               } else
-                                       debugl1(cs, "hfc_fill_dfifo blocked");
-
-                       }
-                       spin_unlock_irqrestore(&cs->lock, flags);
-                       break;
-               case (PH_PULL | INDICATION):
-                       spin_lock_irqsave(&cs->lock, flags);
-                       if (cs->tx_skb) {
-                               if (cs->debug & L1_DEB_WARN)
-                                       debugl1(cs, " l2l1 tx_skb exist this shouldn't happen");
-                               skb_queue_tail(&cs->sq, skb);
-                               spin_unlock_irqrestore(&cs->lock, flags);
-                               break;
-                       }
-                       if (cs->debug & DEB_DLOG_HEX)
-                               LogFrame(cs, skb->data, skb->len);
-                       if (cs->debug & DEB_DLOG_VERBOSE)
-                               dlogframe(cs, skb, 0);
+               } else {
                        cs->tx_skb = skb;
                        cs->tx_cnt = 0;
 #ifdef L2FRAME_DEBUG           /* psa */
                        if (cs->debug & L1_DEB_LAPD)
-                               Logl2Frame(cs, skb, "PH_DATA_PULLED", 0);
+                               Logl2Frame(cs, skb, "PH_DATA", 0);
 #endif
                        if (!test_and_set_bit(FLG_LOCK_ATOMIC, &cs->HW_Flags)) {
                                hfc_fill_dfifo(cs);
                                test_and_clear_bit(FLG_LOCK_ATOMIC, &cs->HW_Flags);
                        } else
                                debugl1(cs, "hfc_fill_dfifo blocked");
+
+               }
+               spin_unlock_irqrestore(&cs->lock, flags);
+               break;
+       case (PH_PULL | INDICATION):
+               spin_lock_irqsave(&cs->lock, flags);
+               if (cs->tx_skb) {
+                       if (cs->debug & L1_DEB_WARN)
+                               debugl1(cs, " l2l1 tx_skb exist this shouldn't happen");
+                       skb_queue_tail(&cs->sq, skb);
                        spin_unlock_irqrestore(&cs->lock, flags);
                        break;
-               case (PH_PULL | REQUEST):
+               }
+               if (cs->debug & DEB_DLOG_HEX)
+                       LogFrame(cs, skb->data, skb->len);
+               if (cs->debug & DEB_DLOG_VERBOSE)
+                       dlogframe(cs, skb, 0);
+               cs->tx_skb = skb;
+               cs->tx_cnt = 0;
 #ifdef L2FRAME_DEBUG           /* psa */
-                       if (cs->debug & L1_DEB_LAPD)
-                               debugl1(cs, "-> PH_REQUEST_PULL");
+               if (cs->debug & L1_DEB_LAPD)
+                       Logl2Frame(cs, skb, "PH_DATA_PULLED", 0);
 #endif
-                       if (!cs->tx_skb) {
-                               test_and_clear_bit(FLG_L1_PULL_REQ, &st->l1.Flags);
-                               st->l1.l1l2(st, PH_PULL | CONFIRM, NULL);
-                       } else
-                               test_and_set_bit(FLG_L1_PULL_REQ, &st->l1.Flags);
-                       break;
-               case (HW_RESET | REQUEST):
-                       spin_lock_irqsave(&cs->lock, flags);
-                       cs->writeisac(cs, HFCD_STATES, HFCD_LOAD_STATE | 3); /* HFC ST 3 */
-                       udelay(6);
-                       cs->writeisac(cs, HFCD_STATES, 3); /* HFC ST 2 */
-                       cs->hw.hfcD.mst_m |= HFCD_MASTER;
-                       cs->writeisac(cs, HFCD_MST_MODE, cs->hw.hfcD.mst_m);
-                       cs->writeisac(cs, HFCD_STATES, HFCD_ACTIVATE | HFCD_DO_ACTION);
-                       spin_unlock_irqrestore(&cs->lock, flags);
-                       l1_msg(cs, HW_POWERUP | CONFIRM, NULL);
-                       break;
-               case (HW_ENABLE | REQUEST):
-                       spin_lock_irqsave(&cs->lock, flags);
-                       cs->writeisac(cs, HFCD_STATES, HFCD_ACTIVATE | HFCD_DO_ACTION);
-                       spin_unlock_irqrestore(&cs->lock, flags);
-                       break;
-               case (HW_DEACTIVATE | REQUEST):
-                       spin_lock_irqsave(&cs->lock, flags);
-                       cs->hw.hfcD.mst_m &= ~HFCD_MASTER;
-                       cs->writeisac(cs, HFCD_MST_MODE, cs->hw.hfcD.mst_m);
-                       spin_unlock_irqrestore(&cs->lock, flags);
-                       break;
-               case (HW_INFO3 | REQUEST):
-                       spin_lock_irqsave(&cs->lock, flags);
-                       cs->hw.hfcD.mst_m |= HFCD_MASTER;
-                       cs->writeisac(cs, HFCD_MST_MODE, cs->hw.hfcD.mst_m);
-                       spin_unlock_irqrestore(&cs->lock, flags);
-                       break;
-               default:
-                       if (cs->debug & L1_DEB_WARN)
-                               debugl1(cs, "hfcd_l1hw unknown pr %4x", pr);
-                       break;
+               if (!test_and_set_bit(FLG_LOCK_ATOMIC, &cs->HW_Flags)) {
+                       hfc_fill_dfifo(cs);
+                       test_and_clear_bit(FLG_LOCK_ATOMIC, &cs->HW_Flags);
+               } else
+                       debugl1(cs, "hfc_fill_dfifo blocked");
+               spin_unlock_irqrestore(&cs->lock, flags);
+               break;
+       case (PH_PULL | REQUEST):
+#ifdef L2FRAME_DEBUG           /* psa */
+               if (cs->debug & L1_DEB_LAPD)
+                       debugl1(cs, "-> PH_REQUEST_PULL");
+#endif
+               if (!cs->tx_skb) {
+                       test_and_clear_bit(FLG_L1_PULL_REQ, &st->l1.Flags);
+                       st->l1.l1l2(st, PH_PULL | CONFIRM, NULL);
+               } else
+                       test_and_set_bit(FLG_L1_PULL_REQ, &st->l1.Flags);
+               break;
+       case (HW_RESET | REQUEST):
+               spin_lock_irqsave(&cs->lock, flags);
+               cs->writeisac(cs, HFCD_STATES, HFCD_LOAD_STATE | 3); /* HFC ST 3 */
+               udelay(6);
+               cs->writeisac(cs, HFCD_STATES, 3); /* HFC ST 2 */
+               cs->hw.hfcD.mst_m |= HFCD_MASTER;
+               cs->writeisac(cs, HFCD_MST_MODE, cs->hw.hfcD.mst_m);
+               cs->writeisac(cs, HFCD_STATES, HFCD_ACTIVATE | HFCD_DO_ACTION);
+               spin_unlock_irqrestore(&cs->lock, flags);
+               l1_msg(cs, HW_POWERUP | CONFIRM, NULL);
+               break;
+       case (HW_ENABLE | REQUEST):
+               spin_lock_irqsave(&cs->lock, flags);
+               cs->writeisac(cs, HFCD_STATES, HFCD_ACTIVATE | HFCD_DO_ACTION);
+               spin_unlock_irqrestore(&cs->lock, flags);
+               break;
+       case (HW_DEACTIVATE | REQUEST):
+               spin_lock_irqsave(&cs->lock, flags);
+               cs->hw.hfcD.mst_m &= ~HFCD_MASTER;
+               cs->writeisac(cs, HFCD_MST_MODE, cs->hw.hfcD.mst_m);
+               spin_unlock_irqrestore(&cs->lock, flags);
+               break;
+       case (HW_INFO3 | REQUEST):
+               spin_lock_irqsave(&cs->lock, flags);
+               cs->hw.hfcD.mst_m |= HFCD_MASTER;
+               cs->writeisac(cs, HFCD_MST_MODE, cs->hw.hfcD.mst_m);
+               spin_unlock_irqrestore(&cs->lock, flags);
+               break;
+       default:
+               if (cs->debug & L1_DEB_WARN)
+                       debugl1(cs, "hfcd_l1hw unknown pr %4x", pr);
+               break;
        }
 }
 
@@ -1027,11 +1027,11 @@ static unsigned int
        if (!(send = kmalloc(cnt * sizeof(unsigned int), GFP_ATOMIC))) {
                printk(KERN_WARNING
                       "HiSax: No memory for hfcd.send\n");
-               return(NULL);
+               return (NULL);
        }
        for (i = 0; i < cnt; i++)
                send[i] = 0x1fff;
-       return(send);
+       return (send);
 }
 
 void
index 30f1924..8c7582a 100644 (file)
@@ -4,26 +4,26 @@
  *
  * Author       Karsten Keil
  * Copyright    by Karsten Keil      <keil@isdn4linux.de>
- * 
+ *
  * This software may be used and distributed according to the terms
  * of the GNU General Public License, incorporated herein by reference.
  *
  */
 
-#define HFCD_CIRM      0x18
+#define HFCD_CIRM      0x18
 #define HFCD_CTMT      0x19
-#define HFCD_INT_M1    0x1A
-#define HFCD_INT_M2    0x1B
-#define HFCD_INT_S1    0x1E
-#define HFCD_STAT      0x1C
-#define HFCD_STAT_DISB  0x1D
-#define HFCD_STATES    0x30
-#define HFCD_SCTRL     0x31
-#define HFCD_TEST      0x32
-#define HFCD_SQ        0x34
-#define HFCD_CLKDEL    0x37
+#define HFCD_INT_M1    0x1A
+#define HFCD_INT_M2    0x1B
+#define HFCD_INT_S1    0x1E
+#define HFCD_STAT      0x1C
+#define HFCD_STAT_DISB 0x1D
+#define HFCD_STATES    0x30
+#define HFCD_SCTRL     0x31
+#define HFCD_TEST      0x32
+#define HFCD_SQ                0x34
+#define HFCD_CLKDEL    0x37
 #define HFCD_MST_MODE  0x2E
-#define HFCD_CONN      0x2F
+#define HFCD_CONN      0x2F
 
 #define HFCD_FIFO      0x80
 #define HFCD_Z1                0x10
@@ -79,7 +79,7 @@
 #define HFCD_TRANSB1 0x01
 
 /* CIRM (Write) */
-#define HFCD_RESET     0x08
+#define HFCD_RESET     0x08
 #define HFCD_MEM8K     0x10
 #define HFCD_INTA      0x01
 #define HFCD_INTB      0x02
index 626f85d..838531b 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Author       Karsten Keil
  * Copyright    by Karsten Keil      <keil@isdn4linux.de>
- * 
+ *
  * This software may be used and distributed according to the terms
  * of the GNU General Public License, incorporated herein by reference.
  *
@@ -181,9 +181,9 @@ hfc_empty_fifo(struct BCState *bcs, int count)
                return (NULL);
        }
        if (bcs->mode == L1_MODE_TRANS)
-         count -= 1;
+               count -= 1;
        else
-         count -= 3;
+               count -= 3;
        if (!(skb = dev_alloc_skb(count)))
                printk(KERN_WARNING "HFC: receive out of memory\n");
        else {
@@ -199,35 +199,35 @@ hfc_empty_fifo(struct BCState *bcs, int count)
                        printk(KERN_WARNING "HFC FIFO channel %d BUSY Error\n", bcs->channel);
                        dev_kfree_skb_any(skb);
                        if (bcs->mode != L1_MODE_TRANS) {
-                         WaitNoBusy(cs);
-                         stat = cs->BC_Read_Reg(cs, HFC_DATA, HFC_CIP | HFC_F2_INC | HFC_REC |
-                                                HFC_CHANNEL(bcs->channel));
-                         WaitForBusy(cs);
+                               WaitNoBusy(cs);
+                               stat = cs->BC_Read_Reg(cs, HFC_DATA, HFC_CIP | HFC_F2_INC | HFC_REC |
+                                                      HFC_CHANNEL(bcs->channel));
+                               WaitForBusy(cs);
                        }
                        return (NULL);
                }
                if (bcs->mode != L1_MODE_TRANS) {
-                 WaitNoBusy(cs);
-                 chksum = (cs->BC_Read_Reg(cs, HFC_DATA, cip) << 8);
-                 WaitNoBusy(cs);
-                 chksum += cs->BC_Read_Reg(cs, HFC_DATA, cip);
-                 WaitNoBusy(cs);
-                 stat = cs->BC_Read_Reg(cs, HFC_DATA, cip);
-                 if (cs->debug & L1_DEB_HSCX)
-                   debugl1(cs, "hfc_empty_fifo %d chksum %x stat %x",
-                           bcs->channel, chksum, stat);
-                 if (stat) {
-                   debugl1(cs, "FIFO CRC error");
-                   dev_kfree_skb_any(skb);
-                   skb = NULL;
+                       WaitNoBusy(cs);
+                       chksum = (cs->BC_Read_Reg(cs, HFC_DATA, cip) << 8);
+                       WaitNoBusy(cs);
+                       chksum += cs->BC_Read_Reg(cs, HFC_DATA, cip);
+                       WaitNoBusy(cs);
+                       stat = cs->BC_Read_Reg(cs, HFC_DATA, cip);
+                       if (cs->debug & L1_DEB_HSCX)
+                               debugl1(cs, "hfc_empty_fifo %d chksum %x stat %x",
+                                       bcs->channel, chksum, stat);
+                       if (stat) {
+                               debugl1(cs, "FIFO CRC error");
+                               dev_kfree_skb_any(skb);
+                               skb = NULL;
 #ifdef ERROR_STATISTIC
-                   bcs->err_crc++;
+                               bcs->err_crc++;
 #endif
-                 }
-                 WaitNoBusy(cs);
-                 stat = cs->BC_Read_Reg(cs, HFC_DATA, HFC_CIP | HFC_F2_INC | HFC_REC |
-                                        HFC_CHANNEL(bcs->channel));
-                 WaitForBusy(cs);
+                       }
+                       WaitNoBusy(cs);
+                       stat = cs->BC_Read_Reg(cs, HFC_DATA, HFC_CIP | HFC_F2_INC | HFC_REC |
+                                              HFC_CHANNEL(bcs->channel));
+                       WaitForBusy(cs);
                }
        }
        return (skb);
@@ -249,37 +249,37 @@ hfc_fill_fifo(struct BCState *bcs)
 
        cip = HFC_CIP | HFC_F1 | HFC_SEND | HFC_CHANNEL(bcs->channel);
        if ((cip & 0xc3) != (cs->hw.hfc.cip & 0xc3)) {
-         cs->BC_Write_Reg(cs, HFC_STATUS, cip, cip);
-         WaitForBusy(cs);
+               cs->BC_Write_Reg(cs, HFC_STATUS, cip, cip);
+               WaitForBusy(cs);
        }
        WaitNoBusy(cs);
        if (bcs->mode != L1_MODE_TRANS) {
-         bcs->hw.hfc.f1 = cs->BC_Read_Reg(cs, HFC_DATA, cip);
-         cip = HFC_CIP | HFC_F2 | HFC_SEND | HFC_CHANNEL(bcs->channel);
-         WaitNoBusy(cs);
-         bcs->hw.hfc.f2 = cs->BC_Read_Reg(cs, HFC_DATA, cip);
-         bcs->hw.hfc.send[bcs->hw.hfc.f1] = ReadZReg(bcs, HFC_Z1 | HFC_SEND | HFC_CHANNEL(bcs->channel));
-         if (cs->debug & L1_DEB_HSCX)
-           debugl1(cs, "hfc_fill_fifo %d f1(%d) f2(%d) z1(%x)",
-                   bcs->channel, bcs->hw.hfc.f1, bcs->hw.hfc.f2,
-                   bcs->hw.hfc.send[bcs->hw.hfc.f1]);
-         fcnt = bcs->hw.hfc.f1 - bcs->hw.hfc.f2;
-         if (fcnt < 0)
-           fcnt += 32;
-         if (fcnt > 30) {
-           if (cs->debug & L1_DEB_HSCX)
-             debugl1(cs, "hfc_fill_fifo more as 30 frames");
-           return;
-         }
-         count = GetFreeFifoBytes(bcs);
-       } 
+               bcs->hw.hfc.f1 = cs->BC_Read_Reg(cs, HFC_DATA, cip);
+               cip = HFC_CIP | HFC_F2 | HFC_SEND | HFC_CHANNEL(bcs->channel);
+               WaitNoBusy(cs);
+               bcs->hw.hfc.f2 = cs->BC_Read_Reg(cs, HFC_DATA, cip);
+               bcs->hw.hfc.send[bcs->hw.hfc.f1] = ReadZReg(bcs, HFC_Z1 | HFC_SEND | HFC_CHANNEL(bcs->channel));
+               if (cs->debug & L1_DEB_HSCX)
+                       debugl1(cs, "hfc_fill_fifo %d f1(%d) f2(%d) z1(%x)",
+                               bcs->channel, bcs->hw.hfc.f1, bcs->hw.hfc.f2,
+                               bcs->hw.hfc.send[bcs->hw.hfc.f1]);
+               fcnt = bcs->hw.hfc.f1 - bcs->hw.hfc.f2;
+               if (fcnt < 0)
+                       fcnt += 32;
+               if (fcnt > 30) {
+                       if (cs->debug & L1_DEB_HSCX)
+                               debugl1(cs, "hfc_fill_fifo more as 30 frames");
+                       return;
+               }
+               count = GetFreeFifoBytes(bcs);
+       }
        else {
-         WaitForBusy(cs);
-         z1 = ReadZReg(bcs, HFC_Z1 | HFC_REC | HFC_CHANNEL(bcs->channel));
-         z2 = ReadZReg(bcs, HFC_Z2 | HFC_REC | HFC_CHANNEL(bcs->channel));
-         count = z1 - z2;
-         if (count < 0)
-           count += cs->hw.hfc.fifosize; 
+               WaitForBusy(cs);
+               z1 = ReadZReg(bcs, HFC_Z1 | HFC_REC | HFC_CHANNEL(bcs->channel));
+               z2 = ReadZReg(bcs, HFC_Z2 | HFC_REC | HFC_CHANNEL(bcs->channel));
+               count = z1 - z2;
+               if (count < 0)
+                       count += cs->hw.hfc.fifosize;
        } /* L1_MODE_TRANS */
        if (cs->debug & L1_DEB_HSCX)
                debugl1(cs, "hfc_fill_fifo %d count(%u/%d)",
@@ -305,12 +305,12 @@ hfc_fill_fifo(struct BCState *bcs)
                dev_kfree_skb_any(bcs->tx_skb);
                bcs->tx_skb = NULL;
                if (bcs->mode != L1_MODE_TRANS) {
-                 WaitForBusy(cs);
-                 WaitNoBusy(cs);
-                 cs->BC_Read_Reg(cs, HFC_DATA, HFC_CIP | HFC_F1_INC | HFC_SEND | HFC_CHANNEL(bcs->channel));
+                       WaitForBusy(cs);
+                       WaitNoBusy(cs);
+                       cs->BC_Read_Reg(cs, HFC_DATA, HFC_CIP | HFC_F1_INC | HFC_SEND | HFC_CHANNEL(bcs->channel));
                }
-               if (test_bit(FLG_LLI_L1WAKEUP,&bcs->st->lli.flag) &&
-                       (count >= 0)) {
+               if (test_bit(FLG_LLI_L1WAKEUP, &bcs->st->lli.flag) &&
+                   (count >= 0)) {
                        u_long  flags;
                        spin_lock_irqsave(&bcs->aclock, flags);
                        bcs->ackcnt += count;
@@ -331,7 +331,7 @@ main_irq_hfc(struct BCState *bcs)
        int receive, transmit, count = 5;
        struct sk_buff *skb;
 
-      Begin:
+Begin:
        count--;
        cip = HFC_CIP | HFC_F1 | HFC_REC | HFC_CHANNEL(bcs->channel);
        if ((cip & 0xc3) != (cs->hw.hfc.cip & 0xc3)) {
@@ -349,7 +349,7 @@ main_irq_hfc(struct BCState *bcs)
                        if (cs->debug & L1_DEB_HSCX)
                                debugl1(cs, "hfc rec %d f1(%d) f2(%d)",
                                        bcs->channel, f1, f2);
-                       receive = 1; 
+                       receive = 1;
                }
        }
        if (receive || (bcs->mode == L1_MODE_TRANS)) {
@@ -407,41 +407,41 @@ mode_hfc(struct BCState *bcs, int mode, int bc)
        bcs->channel = bc;
 
        switch (mode) {
-               case (L1_MODE_NULL):
-                       if (bc) {
-                               cs->hw.hfc.ctmt &= ~1;
-                               cs->hw.hfc.isac_spcr &= ~0x03;
-                       }
-                       else {
-                               cs->hw.hfc.ctmt &= ~2;
-                               cs->hw.hfc.isac_spcr &= ~0x0c;
-                       }
-                       break;
-               case (L1_MODE_TRANS):
-                       cs->hw.hfc.ctmt &= ~(1 << bc); /* set HDLC mode */ 
-                       cs->BC_Write_Reg(cs, HFC_STATUS, cs->hw.hfc.ctmt, cs->hw.hfc.ctmt);
-                       hfc_clear_fifo(bcs); /* complete fifo clear */ 
-                       if (bc) {
-                               cs->hw.hfc.ctmt |= 1;
-                               cs->hw.hfc.isac_spcr &= ~0x03;
-                               cs->hw.hfc.isac_spcr |= 0x02;
-                       } else {
-                               cs->hw.hfc.ctmt |= 2;
-                               cs->hw.hfc.isac_spcr &= ~0x0c;
-                               cs->hw.hfc.isac_spcr |= 0x08;
-                       }
-                       break;
-               case (L1_MODE_HDLC):
-                       if (bc) {
-                               cs->hw.hfc.ctmt &= ~1;
-                               cs->hw.hfc.isac_spcr &= ~0x03;
-                               cs->hw.hfc.isac_spcr |= 0x02;
-                       } else {
-                               cs->hw.hfc.ctmt &= ~2;
-                               cs->hw.hfc.isac_spcr &= ~0x0c;
-                               cs->hw.hfc.isac_spcr |= 0x08;
-                       }
-                       break;
+       case (L1_MODE_NULL):
+               if (bc) {
+                       cs->hw.hfc.ctmt &= ~1;
+                       cs->hw.hfc.isac_spcr &= ~0x03;
+               }
+               else {
+                       cs->hw.hfc.ctmt &= ~2;
+                       cs->hw.hfc.isac_spcr &= ~0x0c;
+               }
+               break;
+       case (L1_MODE_TRANS):
+               cs->hw.hfc.ctmt &= ~(1 << bc); /* set HDLC mode */
+               cs->BC_Write_Reg(cs, HFC_STATUS, cs->hw.hfc.ctmt, cs->hw.hfc.ctmt);
+               hfc_clear_fifo(bcs); /* complete fifo clear */
+               if (bc) {
+                       cs->hw.hfc.ctmt |= 1;
+                       cs->hw.hfc.isac_spcr &= ~0x03;
+                       cs->hw.hfc.isac_spcr |= 0x02;
+               } else {
+                       cs->hw.hfc.ctmt |= 2;
+                       cs->hw.hfc.isac_spcr &= ~0x0c;
+                       cs->hw.hfc.isac_spcr |= 0x08;
+               }
+               break;
+       case (L1_MODE_HDLC):
+               if (bc) {
+                       cs->hw.hfc.ctmt &= ~1;
+                       cs->hw.hfc.isac_spcr &= ~0x03;
+                       cs->hw.hfc.isac_spcr |= 0x02;
+               } else {
+                       cs->hw.hfc.ctmt &= ~2;
+                       cs->hw.hfc.isac_spcr &= ~0x0c;
+                       cs->hw.hfc.isac_spcr |= 0x08;
+               }
+               break;
        }
        cs->BC_Write_Reg(cs, HFC_STATUS, cs->hw.hfc.ctmt, cs->hw.hfc.ctmt);
        cs->writeisac(cs, ISAC_SPCR, cs->hw.hfc.isac_spcr);
@@ -457,53 +457,53 @@ hfc_l2l1(struct PStack *st, int pr, void *arg)
        u_long          flags;
 
        switch (pr) {
-               case (PH_DATA | REQUEST):
-                       spin_lock_irqsave(&bcs->cs->lock, flags);
-                       if (bcs->tx_skb) {
-                               skb_queue_tail(&bcs->squeue, skb);
-                       } else {
-                               bcs->tx_skb = skb;
-                               test_and_set_bit(BC_FLG_BUSY, &bcs->Flag);
-                               bcs->cs->BC_Send_Data(bcs);
-                       }
-                       spin_unlock_irqrestore(&bcs->cs->lock, flags);
-                       break;
-               case (PH_PULL | INDICATION):
-                       spin_lock_irqsave(&bcs->cs->lock, flags);
-                       if (bcs->tx_skb) {
-                               printk(KERN_WARNING "hfc_l2l1: this shouldn't happen\n");
-                       } else {
-                               test_and_set_bit(BC_FLG_BUSY, &bcs->Flag);
-                               bcs->tx_skb = skb;
-                               bcs->cs->BC_Send_Data(bcs);
-                       }
-                       spin_unlock_irqrestore(&bcs->cs->lock, flags);
-                       break;
-               case (PH_PULL | REQUEST):
-                       if (!bcs->tx_skb) {
-                               test_and_clear_bit(FLG_L1_PULL_REQ, &st->l1.Flags);
-                               st->l1.l1l2(st, PH_PULL | CONFIRM, NULL);
-                       } else
-                               test_and_set_bit(FLG_L1_PULL_REQ, &st->l1.Flags);
-                       break;
-               case (PH_ACTIVATE | REQUEST):
-                       spin_lock_irqsave(&bcs->cs->lock, flags);
-                       test_and_set_bit(BC_FLG_ACTIV, &bcs->Flag);
-                       mode_hfc(bcs, st->l1.mode, st->l1.bc);
-                       spin_unlock_irqrestore(&bcs->cs->lock, flags);
-                       l1_msg_b(st, pr, arg);
-                       break;
-               case (PH_DEACTIVATE | REQUEST):
-                       l1_msg_b(st, pr, arg);
-                       break;
-               case (PH_DEACTIVATE | CONFIRM):
-                       spin_lock_irqsave(&bcs->cs->lock, flags);
-                       test_and_clear_bit(BC_FLG_ACTIV, &bcs->Flag);
-                       test_and_clear_bit(BC_FLG_BUSY, &bcs->Flag);
-                       mode_hfc(bcs, 0, st->l1.bc);
-                       spin_unlock_irqrestore(&bcs->cs->lock, flags);
-                       st->l1.l1l2(st, PH_DEACTIVATE | CONFIRM, NULL);
-                       break;
+       case (PH_DATA | REQUEST):
+               spin_lock_irqsave(&bcs->cs->lock, flags);
+               if (bcs->tx_skb) {
+                       skb_queue_tail(&bcs->squeue, skb);
+               } else {
+                       bcs->tx_skb = skb;
+                       test_and_set_bit(BC_FLG_BUSY, &bcs->Flag);
+                       bcs->cs->BC_Send_Data(bcs);
+               }
+               spin_unlock_irqrestore(&bcs->cs->lock, flags);
+               break;
+       case (PH_PULL | INDICATION):
+               spin_lock_irqsave(&bcs->cs->lock, flags);
+               if (bcs->tx_skb) {
+                       printk(KERN_WARNING "hfc_l2l1: this shouldn't happen\n");
+               } else {
+                       test_and_set_bit(BC_FLG_BUSY, &bcs->Flag);
+                       bcs->tx_skb = skb;
+                       bcs->cs->BC_Send_Data(bcs);
+               }
+               spin_unlock_irqrestore(&bcs->cs->lock, flags);
+               break;
+       case (PH_PULL | REQUEST):
+               if (!bcs->tx_skb) {
+                       test_and_clear_bit(FLG_L1_PULL_REQ, &st->l1.Flags);
+                       st->l1.l1l2(st, PH_PULL | CONFIRM, NULL);
+               } else
+                       test_and_set_bit(FLG_L1_PULL_REQ, &st->l1.Flags);
+               break;
+       case (PH_ACTIVATE | REQUEST):
+               spin_lock_irqsave(&bcs->cs->lock, flags);
+               test_and_set_bit(BC_FLG_ACTIV, &bcs->Flag);
+               mode_hfc(bcs, st->l1.mode, st->l1.bc);
+               spin_unlock_irqrestore(&bcs->cs->lock, flags);
+               l1_msg_b(st, pr, arg);
+               break;
+       case (PH_DEACTIVATE | REQUEST):
+               l1_msg_b(st, pr, arg);
+               break;
+       case (PH_DEACTIVATE | CONFIRM):
+               spin_lock_irqsave(&bcs->cs->lock, flags);
+               test_and_clear_bit(BC_FLG_ACTIV, &bcs->Flag);
+               test_and_clear_bit(BC_FLG_BUSY, &bcs->Flag);
+               mode_hfc(bcs, 0, st->l1.bc);
+               spin_unlock_irqrestore(&bcs->cs->lock, flags);
+               st->l1.l1l2(st, PH_DEACTIVATE | CONFIRM, NULL);
+               break;
        }
 }
 
index 1a50d4a..1510096 100644 (file)
@@ -4,14 +4,14 @@
  *
  * Author       Karsten Keil
  * Copyright    by Karsten Keil      <keil@isdn4linux.de>
- * 
+ *
  * This software may be used and distributed according to the terms
  * of the GNU General Public License, incorporated herein by reference.
  *
  */
 
 #define HFC_CTMT       0xe0
-#define HFC_CIRM       0xc0
+#define HFC_CIRM       0xc0
 #define HFC_CIP                0x80
 #define HFC_Z1         0x00
 #define HFC_Z2         0x08
@@ -46,7 +46,7 @@
 #define HFC_TRANSB1 0x01
 
 /* CIRM (Write) */
-#define HFC_RESET      0x08
+#define HFC_RESET      0x08
 #define HFC_MEM8K      0x10
 #define HFC_INTA       0x01
 #define HFC_INTB       0x02
index 0cb0546..334fa90 100644 (file)
@@ -57,10 +57,10 @@ static const PCI_ENTRY id_list[] =
        {PCI_VENDOR_ID_BERKOM, PCI_DEVICE_ID_BERKOM_A1T, "German telekom", "A1T"},
        {PCI_VENDOR_ID_ANIGMA, PCI_DEVICE_ID_ANIGMA_MC145575, "Motorola MC145575", "MC145575"},
        {PCI_VENDOR_ID_ZOLTRIX, PCI_DEVICE_ID_ZOLTRIX_2BD0, "Zoltrix", "2BD0"},
-       {PCI_VENDOR_ID_DIGI, PCI_DEVICE_ID_DIGI_DF_M_IOM2_E,"Digi International", "Digi DataFire Micro V IOM2 (Europe)"},
-       {PCI_VENDOR_ID_DIGI, PCI_DEVICE_ID_DIGI_DF_M_E,"Digi International", "Digi DataFire Micro V (Europe)"},
-       {PCI_VENDOR_ID_DIGI, PCI_DEVICE_ID_DIGI_DF_M_IOM2_A,"Digi International", "Digi DataFire Micro V IOM2 (North America)"},
-       {PCI_VENDOR_ID_DIGI, PCI_DEVICE_ID_DIGI_DF_M_A,"Digi International", "Digi DataFire Micro V (North America)"},
+       {PCI_VENDOR_ID_DIGI, PCI_DEVICE_ID_DIGI_DF_M_IOM2_E, "Digi International", "Digi DataFire Micro V IOM2 (Europe)"},
+       {PCI_VENDOR_ID_DIGI, PCI_DEVICE_ID_DIGI_DF_M_E, "Digi International", "Digi DataFire Micro V (Europe)"},
+       {PCI_VENDOR_ID_DIGI, PCI_DEVICE_ID_DIGI_DF_M_IOM2_A, "Digi International", "Digi DataFire Micro V IOM2 (North America)"},
+       {PCI_VENDOR_ID_DIGI, PCI_DEVICE_ID_DIGI_DF_M_A, "Digi International", "Digi DataFire Micro V (North America)"},
        {PCI_VENDOR_ID_SITECOM, PCI_DEVICE_ID_SITECOM_DC105V2, "Sitecom Europe", "DC-105 ISDN PCI"},
        {0, 0, NULL, NULL},
 };
@@ -73,7 +73,7 @@ static void
 release_io_hfcpci(struct IsdnCardState *cs)
 {
        printk(KERN_INFO "HiSax: release hfcpci at %p\n",
-               cs->hw.hfcpci.pci_io);
+              cs->hw.hfcpci.pci_io);
        cs->hw.hfcpci.int_m2 = 0;                                       /* interrupt output off ! */
        Write_hfc(cs, HFCPCI_INT_M2, cs->hw.hfcpci.int_m2);
        Write_hfc(cs, HFCPCI_CIRM, HFCPCI_RESET);                       /* Reset On */
@@ -84,7 +84,7 @@ release_io_hfcpci(struct IsdnCardState *cs)
        pci_write_config_word(cs->hw.hfcpci.dev, PCI_COMMAND, 0);       /* disable memory mapped ports + busmaster */
        del_timer(&cs->hw.hfcpci.timer);
        pci_free_consistent(cs->hw.hfcpci.dev, 0x8000,
-               cs->hw.hfcpci.fifos, cs->hw.hfcpci.dma);
+                           cs->hw.hfcpci.fifos, cs->hw.hfcpci.dma);
        cs->hw.hfcpci.fifos = NULL;
        iounmap((void *)cs->hw.hfcpci.pci_io);
 }
@@ -124,7 +124,7 @@ reset_hfcpci(struct IsdnCardState *cs)
        Write_hfc(cs, HFCPCI_CTMT, cs->hw.hfcpci.ctmt);
 
        cs->hw.hfcpci.int_m1 = HFCPCI_INTS_DTRANS | HFCPCI_INTS_DREC |
-           HFCPCI_INTS_L1STATE | HFCPCI_INTS_TIMER;
+               HFCPCI_INTS_L1STATE | HFCPCI_INTS_TIMER;
        Write_hfc(cs, HFCPCI_INT_M1, cs->hw.hfcpci.int_m1);
 
        /* Clear already pending ints */
@@ -170,8 +170,8 @@ hfcpci_Timer(struct IsdnCardState *cs)
        cs->hw.hfcpci.timer.expires = jiffies + 75;
        /* WD RESET */
 /*      WriteReg(cs, HFCD_DATA, HFCD_CTMT, cs->hw.hfcpci.ctmt | 0x80);
-   add_timer(&cs->hw.hfcpci.timer);
- */
+       add_timer(&cs->hw.hfcpci.timer);
+*/
 }
 
 
@@ -215,17 +215,17 @@ Sel_BCS(struct IsdnCardState *cs, int channel)
 /***************************************/
 static void hfcpci_clear_fifo_rx(struct IsdnCardState *cs, int fifo)
 {       u_char fifo_state;
-        bzfifo_type *bzr;
+       bzfifo_type *bzr;
 
        if (fifo) {
-               bzr = &((fifo_area *) (cs->hw.hfcpci.fifos))->b_chans.rxbz_b2;
+               bzr = &((fifo_area *) (cs->hw.hfcpci.fifos))->b_chans.rxbz_b2;
                fifo_state = cs->hw.hfcpci.fifo_en & HFCPCI_FIFOEN_B2RX;
        } else {
-               bzr = &((fifo_area *) (cs->hw.hfcpci.fifos))->b_chans.rxbz_b1;
+               bzr = &((fifo_area *) (cs->hw.hfcpci.fifos))->b_chans.rxbz_b1;
                fifo_state = cs->hw.hfcpci.fifo_en & HFCPCI_FIFOEN_B1RX;
        }
        if (fifo_state)
-               cs->hw.hfcpci.fifo_en ^= fifo_state;
+               cs->hw.hfcpci.fifo_en ^= fifo_state;
        Write_hfc(cs, HFCPCI_FIFO_EN, cs->hw.hfcpci.fifo_en);
        cs->hw.hfcpci.last_bfifo_cnt[fifo] = 0;
        bzr->za[MAX_B_FRAMES].z1 = B_FIFO_SIZE + B_SUB_VAL - 1;
@@ -233,7 +233,7 @@ static void hfcpci_clear_fifo_rx(struct IsdnCardState *cs, int fifo)
        bzr->f1 = MAX_B_FRAMES;
        bzr->f2 = bzr->f1;      /* init F pointers to remain constant */
        if (fifo_state)
-               cs->hw.hfcpci.fifo_en |= fifo_state;
+               cs->hw.hfcpci.fifo_en |= fifo_state;
        Write_hfc(cs, HFCPCI_FIFO_EN, cs->hw.hfcpci.fifo_en);
 }
 
@@ -242,24 +242,24 @@ static void hfcpci_clear_fifo_rx(struct IsdnCardState *cs, int fifo)
 /***************************************/
 static void hfcpci_clear_fifo_tx(struct IsdnCardState *cs, int fifo)
 {       u_char fifo_state;
-        bzfifo_type *bzt;
+       bzfifo_type *bzt;
 
        if (fifo) {
-               bzt = &((fifo_area *) (cs->hw.hfcpci.fifos))->b_chans.txbz_b2;
+               bzt = &((fifo_area *) (cs->hw.hfcpci.fifos))->b_chans.txbz_b2;
                fifo_state = cs->hw.hfcpci.fifo_en & HFCPCI_FIFOEN_B2TX;
        } else {
-               bzt = &((fifo_area *) (cs->hw.hfcpci.fifos))->b_chans.txbz_b1;
+               bzt = &((fifo_area *) (cs->hw.hfcpci.fifos))->b_chans.txbz_b1;
                fifo_state = cs->hw.hfcpci.fifo_en & HFCPCI_FIFOEN_B1TX;
        }
        if (fifo_state)
-               cs->hw.hfcpci.fifo_en ^= fifo_state;
+               cs->hw.hfcpci.fifo_en ^= fifo_state;
        Write_hfc(cs, HFCPCI_FIFO_EN, cs->hw.hfcpci.fifo_en);
        bzt->za[MAX_B_FRAMES].z1 = B_FIFO_SIZE + B_SUB_VAL - 1;
        bzt->za[MAX_B_FRAMES].z2 = bzt->za[MAX_B_FRAMES].z1;
        bzt->f1 = MAX_B_FRAMES;
        bzt->f2 = bzt->f1;      /* init F pointers to remain constant */
        if (fifo_state)
-               cs->hw.hfcpci.fifo_en |= fifo_state;
+               cs->hw.hfcpci.fifo_en |= fifo_state;
        Write_hfc(cs, HFCPCI_FIFO_EN, cs->hw.hfcpci.fifo_en);
 }
 
@@ -268,7 +268,7 @@ static void hfcpci_clear_fifo_tx(struct IsdnCardState *cs, int fifo)
 /*********************************************/
 static struct sk_buff
 *
-hfcpci_empty_fifo(struct BCState *bcs, bzfifo_type * bz, u_char * bdata, int count)
+hfcpci_empty_fifo(struct BCState *bcs, bzfifo_type *bz, u_char *bdata, int count)
 {
        u_char *ptr, *ptr1, new_f2;
        struct sk_buff *skb;
@@ -395,7 +395,7 @@ receive_dmsg(struct IsdnCardState *cs)
 /* check for transparent receive data and read max one threshold size if avail */
 /*******************************************************************************/
 static int
-hfcpci_empty_fifo_trans(struct BCState *bcs, bzfifo_type * bz, u_char * bdata)
+hfcpci_empty_fifo_trans(struct BCState *bcs, bzfifo_type *bz, u_char *bdata)
 {
        unsigned short *z1r, *z2r;
        int new_z2, fcnt, maxlen;
@@ -467,7 +467,7 @@ main_rec_hfcpci(struct BCState *bcs)
                bdata = ((fifo_area *) (cs->hw.hfcpci.fifos))->b_chans.rxdat_b1;
                real_fifo = 0;
        }
-      Begin:
+Begin:
        count--;
        if (test_and_set_bit(FLG_LOCK_ATOMIC, &cs->HW_Flags)) {
                debugl1(cs, "rec_data %d blocked", bcs->channel);
@@ -494,7 +494,7 @@ main_rec_hfcpci(struct BCState *bcs)
                if (rcnt < 0)
                        rcnt += MAX_B_FRAMES + 1;
                if (cs->hw.hfcpci.last_bfifo_cnt[real_fifo] > rcnt + 1) {
-                       rcnt = 0;
+                       rcnt = 0;
                        hfcpci_clear_fifo_rx(cs, real_fifo);
                }
                cs->hw.hfcpci.last_bfifo_cnt[real_fifo] = rcnt;
@@ -647,8 +647,8 @@ hfcpci_fill_fifo(struct BCState *bcs)
                                debugl1(cs, "hfcpci_fill_fifo_trans %d frame length %d discarded",
                                        bcs->channel, bcs->tx_skb->len);
 
-                       if (test_bit(FLG_LLI_L1WAKEUP,&bcs->st->lli.flag) &&
-                               (PACKET_NOACK != bcs->tx_skb->pkt_type)) {
+                       if (test_bit(FLG_LLI_L1WAKEUP, &bcs->st->lli.flag) &&
+                           (PACKET_NOACK != bcs->tx_skb->pkt_type)) {
                                u_long  flags;
                                spin_lock_irqsave(&bcs->aclock, flags);
                                bcs->ackcnt += bcs->tx_skb->len;
@@ -710,8 +710,8 @@ hfcpci_fill_fifo(struct BCState *bcs)
                memcpy(dst, src, count);
        }
        bcs->tx_cnt -= bcs->tx_skb->len;
-       if (test_bit(FLG_LLI_L1WAKEUP,&bcs->st->lli.flag) &&
-               (PACKET_NOACK != bcs->tx_skb->pkt_type)) {
+       if (test_bit(FLG_LLI_L1WAKEUP, &bcs->st->lli.flag) &&
+           (PACKET_NOACK != bcs->tx_skb->pkt_type)) {
                u_long  flags;
                spin_lock_irqsave(&bcs->aclock, flags);
                bcs->ackcnt += bcs->tx_skb->len;
@@ -736,27 +736,27 @@ dch_nt_l2l1(struct PStack *st, int pr, void *arg)
        struct IsdnCardState *cs = (struct IsdnCardState *) st->l1.hardware;
 
        switch (pr) {
-               case (PH_DATA | REQUEST):
-               case (PH_PULL | REQUEST):
-               case (PH_PULL | INDICATION):
-                       st->l1.l1hw(st, pr, arg);
-                       break;
-               case (PH_ACTIVATE | REQUEST):
-                       st->l1.l1l2(st, PH_ACTIVATE | CONFIRM, NULL);
-                       break;
-               case (PH_TESTLOOP | REQUEST):
-                       if (1 & (long) arg)
-                               debugl1(cs, "PH_TEST_LOOP B1");
-                       if (2 & (long) arg)
-                               debugl1(cs, "PH_TEST_LOOP B2");
-                       if (!(3 & (long) arg))
-                               debugl1(cs, "PH_TEST_LOOP DISABLED");
-                       st->l1.l1hw(st, HW_TESTLOOP | REQUEST, arg);
-                       break;
-               default:
-                       if (cs->debug)
-                               debugl1(cs, "dch_nt_l2l1 msg %04X unhandled", pr);
-                       break;
+       case (PH_DATA | REQUEST):
+       case (PH_PULL | REQUEST):
+       case (PH_PULL | INDICATION):
+               st->l1.l1hw(st, pr, arg);
+               break;
+       case (PH_ACTIVATE | REQUEST):
+               st->l1.l1l2(st, PH_ACTIVATE | CONFIRM, NULL);
+               break;
+       case (PH_TESTLOOP | REQUEST):
+               if (1 & (long) arg)
+                       debugl1(cs, "PH_TEST_LOOP B1");
+               if (2 & (long) arg)
+                       debugl1(cs, "PH_TEST_LOOP B2");
+               if (!(3 & (long) arg))
+                       debugl1(cs, "PH_TEST_LOOP DISABLED");
+               st->l1.l1hw(st, HW_TESTLOOP | REQUEST, arg);
+               break;
+       default:
+               if (cs->debug)
+                       debugl1(cs, "dch_nt_l2l1 msg %04X unhandled", pr);
+               break;
        }
 }
 
@@ -766,14 +766,14 @@ dch_nt_l2l1(struct PStack *st, int pr, void *arg)
 /* set/reset echo mode */
 /***********************/
 static int
-hfcpci_auxcmd(struct IsdnCardState *cs, isdn_ctrl * ic)
+hfcpci_auxcmd(struct IsdnCardState *cs, isdn_ctrl *ic)
 {
        u_long  flags;
        int     i = *(unsigned int *) ic->parm.num;
 
        if ((ic->arg == 98) &&
            (!(cs->hw.hfcpci.int_m1 & (HFCPCI_INTS_B2TRANS + HFCPCI_INTS_B2REC + HFCPCI_INTS_B1TRANS + HFCPCI_INTS_B1REC)))) {
-               spin_lock_irqsave(&cs->lock, flags);
+               spin_lock_irqsave(&cs->lock, flags);
                Write_hfc(cs, HFCPCI_CLKDEL, CLKDEL_NT); /* ST-Bit delay for NT-Mode */
                Write_hfc(cs, HFCPCI_STATES, HFCPCI_LOAD_STATE | 0);    /* HFC ST G0 */
                udelay(10);
@@ -839,7 +839,7 @@ receive_emsg(struct IsdnCardState *cs)
 
        bz = &((fifo_area *) (cs->hw.hfcpci.fifos))->b_chans.rxbz_b2;
        bdata = ((fifo_area *) (cs->hw.hfcpci.fifos))->b_chans.rxdat_b2;
-      Begin:
+Begin:
        count--;
        if (test_and_set_bit(FLG_LOCK_ATOMIC, &cs->HW_Flags)) {
                debugl1(cs, "echo_rec_data blocked");
@@ -1078,7 +1078,7 @@ hfcpci_interrupt(int intno, void *dev_id)
                        } else
                                sched_event_D_pci(cs, D_XMTBUFREADY);
                }
-             afterXPR:
+       afterXPR:
                if (cs->hw.hfcpci.int_s1 && count--) {
                        val = cs->hw.hfcpci.int_s1;
                        cs->hw.hfcpci.int_s1 = 0;
@@ -1110,130 +1110,130 @@ HFCPCI_l1hw(struct PStack *st, int pr, void *arg)
        struct sk_buff *skb = arg;
 
        switch (pr) {
-               case (PH_DATA | REQUEST):
-                       if (cs->debug & DEB_DLOG_HEX)
-                               LogFrame(cs, skb->data, skb->len);
-                       if (cs->debug & DEB_DLOG_VERBOSE)
-                               dlogframe(cs, skb, 0);
-                       spin_lock_irqsave(&cs->lock, flags);
-                       if (cs->tx_skb) {
-                               skb_queue_tail(&cs->sq, skb);
-#ifdef L2FRAME_DEBUG           /* psa */
-                               if (cs->debug & L1_DEB_LAPD)
-                                       Logl2Frame(cs, skb, "PH_DATA Queued", 0);
-#endif
-                       } else {
-                               cs->tx_skb = skb;
-                               cs->tx_cnt = 0;
+       case (PH_DATA | REQUEST):
+               if (cs->debug & DEB_DLOG_HEX)
+                       LogFrame(cs, skb->data, skb->len);
+               if (cs->debug & DEB_DLOG_VERBOSE)
+                       dlogframe(cs, skb, 0);
+               spin_lock_irqsave(&cs->lock, flags);
+               if (cs->tx_skb) {
+                       skb_queue_tail(&cs->sq, skb);
 #ifdef L2FRAME_DEBUG           /* psa */
-                               if (cs->debug & L1_DEB_LAPD)
-                                       Logl2Frame(cs, skb, "PH_DATA", 0);
+                       if (cs->debug & L1_DEB_LAPD)
+                               Logl2Frame(cs, skb, "PH_DATA Queued", 0);
 #endif
-                               if (!test_and_set_bit(FLG_LOCK_ATOMIC, &cs->HW_Flags)) {
-                                       hfcpci_fill_dfifo(cs);
-                                       test_and_clear_bit(FLG_LOCK_ATOMIC, &cs->HW_Flags);
-                               } else
-                                       debugl1(cs, "hfcpci_fill_dfifo blocked");
-
-                       }
-                       spin_unlock_irqrestore(&cs->lock, flags);
-                       break;
-               case (PH_PULL | INDICATION):
-                       spin_lock_irqsave(&cs->lock, flags);
-                       if (cs->tx_skb) {
-                               if (cs->debug & L1_DEB_WARN)
-                                       debugl1(cs, " l2l1 tx_skb exist this shouldn't happen");
-                               skb_queue_tail(&cs->sq, skb);
-                               spin_unlock_irqrestore(&cs->lock, flags);
-                               break;
-                       }
-                       if (cs->debug & DEB_DLOG_HEX)
-                               LogFrame(cs, skb->data, skb->len);
-                       if (cs->debug & DEB_DLOG_VERBOSE)
-                               dlogframe(cs, skb, 0);
+               } else {
                        cs->tx_skb = skb;
                        cs->tx_cnt = 0;
 #ifdef L2FRAME_DEBUG           /* psa */
                        if (cs->debug & L1_DEB_LAPD)
-                               Logl2Frame(cs, skb, "PH_DATA_PULLED", 0);
+                               Logl2Frame(cs, skb, "PH_DATA", 0);
 #endif
                        if (!test_and_set_bit(FLG_LOCK_ATOMIC, &cs->HW_Flags)) {
                                hfcpci_fill_dfifo(cs);
                                test_and_clear_bit(FLG_LOCK_ATOMIC, &cs->HW_Flags);
                        } else
                                debugl1(cs, "hfcpci_fill_dfifo blocked");
+
+               }
+               spin_unlock_irqrestore(&cs->lock, flags);
+               break;
+       case (PH_PULL | INDICATION):
+               spin_lock_irqsave(&cs->lock, flags);
+               if (cs->tx_skb) {
+                       if (cs->debug & L1_DEB_WARN)
+                               debugl1(cs, " l2l1 tx_skb exist this shouldn't happen");
+                       skb_queue_tail(&cs->sq, skb);
                        spin_unlock_irqrestore(&cs->lock, flags);
                        break;
-               case (PH_PULL | REQUEST):
+               }
+               if (cs->debug & DEB_DLOG_HEX)
+                       LogFrame(cs, skb->data, skb->len);
+               if (cs->debug & DEB_DLOG_VERBOSE)
+                       dlogframe(cs, skb, 0);
+               cs->tx_skb = skb;
+               cs->tx_cnt = 0;
 #ifdef L2FRAME_DEBUG           /* psa */
-                       if (cs->debug & L1_DEB_LAPD)
-                               debugl1(cs, "-> PH_REQUEST_PULL");
+               if (cs->debug & L1_DEB_LAPD)
+                       Logl2Frame(cs, skb, "PH_DATA_PULLED", 0);
 #endif
-                       if (!cs->tx_skb) {
-                               test_and_clear_bit(FLG_L1_PULL_REQ, &st->l1.Flags);
-                               st->l1.l1l2(st, PH_PULL | CONFIRM, NULL);
-                       } else
-                               test_and_set_bit(FLG_L1_PULL_REQ, &st->l1.Flags);
-                       break;
-               case (HW_RESET | REQUEST):
-                       spin_lock_irqsave(&cs->lock, flags);
-                       Write_hfc(cs, HFCPCI_STATES, HFCPCI_LOAD_STATE | 3);    /* HFC ST 3 */
-                       udelay(6);
-                       Write_hfc(cs, HFCPCI_STATES, 3);        /* HFC ST 2 */
-                       cs->hw.hfcpci.mst_m |= HFCPCI_MASTER;
-                       Write_hfc(cs, HFCPCI_MST_MODE, cs->hw.hfcpci.mst_m);
-                       Write_hfc(cs, HFCPCI_STATES, HFCPCI_ACTIVATE | HFCPCI_DO_ACTION);
-                       spin_unlock_irqrestore(&cs->lock, flags);
-                       l1_msg(cs, HW_POWERUP | CONFIRM, NULL);
-                       break;
-               case (HW_ENABLE | REQUEST):
-                       spin_lock_irqsave(&cs->lock, flags);
-                       Write_hfc(cs, HFCPCI_STATES, HFCPCI_DO_ACTION);
-                       spin_unlock_irqrestore(&cs->lock, flags);
-                       break;
-               case (HW_DEACTIVATE | REQUEST):
-                       spin_lock_irqsave(&cs->lock, flags);
-                       cs->hw.hfcpci.mst_m &= ~HFCPCI_MASTER;
-                       Write_hfc(cs, HFCPCI_MST_MODE, cs->hw.hfcpci.mst_m);
-                       spin_unlock_irqrestore(&cs->lock, flags);
-                       break;
-               case (HW_INFO3 | REQUEST):
-                       spin_lock_irqsave(&cs->lock, flags);
-                       cs->hw.hfcpci.mst_m |= HFCPCI_MASTER;
-                       Write_hfc(cs, HFCPCI_MST_MODE, cs->hw.hfcpci.mst_m);
-                       spin_unlock_irqrestore(&cs->lock, flags);
+               if (!test_and_set_bit(FLG_LOCK_ATOMIC, &cs->HW_Flags)) {
+                       hfcpci_fill_dfifo(cs);
+                       test_and_clear_bit(FLG_LOCK_ATOMIC, &cs->HW_Flags);
+               } else
+                       debugl1(cs, "hfcpci_fill_dfifo blocked");
+               spin_unlock_irqrestore(&cs->lock, flags);
+               break;
+       case (PH_PULL | REQUEST):
+#ifdef L2FRAME_DEBUG           /* psa */
+               if (cs->debug & L1_DEB_LAPD)
+                       debugl1(cs, "-> PH_REQUEST_PULL");
+#endif
+               if (!cs->tx_skb) {
+                       test_and_clear_bit(FLG_L1_PULL_REQ, &st->l1.Flags);
+                       st->l1.l1l2(st, PH_PULL | CONFIRM, NULL);
+               } else
+                       test_and_set_bit(FLG_L1_PULL_REQ, &st->l1.Flags);
+               break;
+       case (HW_RESET | REQUEST):
+               spin_lock_irqsave(&cs->lock, flags);
+               Write_hfc(cs, HFCPCI_STATES, HFCPCI_LOAD_STATE | 3);    /* HFC ST 3 */
+               udelay(6);
+               Write_hfc(cs, HFCPCI_STATES, 3);        /* HFC ST 2 */
+               cs->hw.hfcpci.mst_m |= HFCPCI_MASTER;
+               Write_hfc(cs, HFCPCI_MST_MODE, cs->hw.hfcpci.mst_m);
+               Write_hfc(cs, HFCPCI_STATES, HFCPCI_ACTIVATE | HFCPCI_DO_ACTION);
+               spin_unlock_irqrestore(&cs->lock, flags);
+               l1_msg(cs, HW_POWERUP | CONFIRM, NULL);
+               break;
+       case (HW_ENABLE | REQUEST):
+               spin_lock_irqsave(&cs->lock, flags);
+               Write_hfc(cs, HFCPCI_STATES, HFCPCI_DO_ACTION);
+               spin_unlock_irqrestore(&cs->lock, flags);
+               break;
+       case (HW_DEACTIVATE | REQUEST):
+               spin_lock_irqsave(&cs->lock, flags);
+               cs->hw.hfcpci.mst_m &= ~HFCPCI_MASTER;
+               Write_hfc(cs, HFCPCI_MST_MODE, cs->hw.hfcpci.mst_m);
+               spin_unlock_irqrestore(&cs->lock, flags);
+               break;
+       case (HW_INFO3 | REQUEST):
+               spin_lock_irqsave(&cs->lock, flags);
+               cs->hw.hfcpci.mst_m |= HFCPCI_MASTER;
+               Write_hfc(cs, HFCPCI_MST_MODE, cs->hw.hfcpci.mst_m);
+               spin_unlock_irqrestore(&cs->lock, flags);
+               break;
+       case (HW_TESTLOOP | REQUEST):
+               spin_lock_irqsave(&cs->lock, flags);
+               switch ((long) arg) {
+               case (1):
+                       Write_hfc(cs, HFCPCI_B1_SSL, 0x80);     /* tx slot */
+                       Write_hfc(cs, HFCPCI_B1_RSL, 0x80);     /* rx slot */
+                       cs->hw.hfcpci.conn = (cs->hw.hfcpci.conn & ~7) | 1;
+                       Write_hfc(cs, HFCPCI_CONNECT, cs->hw.hfcpci.conn);
                        break;
-               case (HW_TESTLOOP | REQUEST):
-                       spin_lock_irqsave(&cs->lock, flags);
-                       switch ((long) arg) {
-                               case (1):
-                                       Write_hfc(cs, HFCPCI_B1_SSL, 0x80);     /* tx slot */
-                                       Write_hfc(cs, HFCPCI_B1_RSL, 0x80);     /* rx slot */
-                                       cs->hw.hfcpci.conn = (cs->hw.hfcpci.conn & ~7) | 1;
-                                       Write_hfc(cs, HFCPCI_CONNECT, cs->hw.hfcpci.conn);
-                                       break;
-
-                               case (2):
-                                       Write_hfc(cs, HFCPCI_B2_SSL, 0x81);     /* tx slot */
-                                       Write_hfc(cs, HFCPCI_B2_RSL, 0x81);     /* rx slot */
-                                       cs->hw.hfcpci.conn = (cs->hw.hfcpci.conn & ~0x38) | 0x08;
-                                       Write_hfc(cs, HFCPCI_CONNECT, cs->hw.hfcpci.conn);
-                                       break;
-
-                               default:
-                                       spin_unlock_irqrestore(&cs->lock, flags);
-                                       if (cs->debug & L1_DEB_WARN)
-                                               debugl1(cs, "hfcpci_l1hw loop invalid %4lx", (long) arg);
-                                       return;
-                       }
-                       cs->hw.hfcpci.trm |= 0x80;      /* enable IOM-loop */
-                       Write_hfc(cs, HFCPCI_TRM, cs->hw.hfcpci.trm);
-                       spin_unlock_irqrestore(&cs->lock, flags);
+
+               case (2):
+                       Write_hfc(cs, HFCPCI_B2_SSL, 0x81);     /* tx slot */
+                       Write_hfc(cs, HFCPCI_B2_RSL, 0x81);     /* rx slot */
+                       cs->hw.hfcpci.conn = (cs->hw.hfcpci.conn & ~0x38) | 0x08;
+                       Write_hfc(cs, HFCPCI_CONNECT, cs->hw.hfcpci.conn);
                        break;
+
                default:
+                       spin_unlock_irqrestore(&cs->lock, flags);
                        if (cs->debug & L1_DEB_WARN)
-                               debugl1(cs, "hfcpci_l1hw unknown pr %4x", pr);
-                       break;
+                               debugl1(cs, "hfcpci_l1hw loop invalid %4lx", (long) arg);
+                       return;
+               }
+               cs->hw.hfcpci.trm |= 0x80;      /* enable IOM-loop */
+               Write_hfc(cs, HFCPCI_TRM, cs->hw.hfcpci.trm);
+               spin_unlock_irqrestore(&cs->lock, flags);
+               break;
+       default:
+               if (cs->debug & L1_DEB_WARN)
+                       debugl1(cs, "hfcpci_l1hw unknown pr %4x", pr);
+               break;
        }
 }
 
@@ -1295,83 +1295,83 @@ mode_hfcpci(struct BCState *bcs, int mode, int bc)
                }
        }
        switch (mode) {
-               case (L1_MODE_NULL):
-                       if (bc) {
-                               cs->hw.hfcpci.sctrl &= ~SCTRL_B2_ENA;
-                               cs->hw.hfcpci.sctrl_r &= ~SCTRL_B2_ENA;
-                       } else {
-                               cs->hw.hfcpci.sctrl &= ~SCTRL_B1_ENA;
-                               cs->hw.hfcpci.sctrl_r &= ~SCTRL_B1_ENA;
-                       }
-                       if (fifo2) {
-                               cs->hw.hfcpci.fifo_en &= ~HFCPCI_FIFOEN_B2;
-                               cs->hw.hfcpci.int_m1 &= ~(HFCPCI_INTS_B2TRANS + HFCPCI_INTS_B2REC);
-                       } else {
-                               cs->hw.hfcpci.fifo_en &= ~HFCPCI_FIFOEN_B1;
-                               cs->hw.hfcpci.int_m1 &= ~(HFCPCI_INTS_B1TRANS + HFCPCI_INTS_B1REC);
-                       }
-                       break;
-               case (L1_MODE_TRANS):
-                       hfcpci_clear_fifo_rx(cs, fifo2);
-                       hfcpci_clear_fifo_tx(cs, fifo2);
-                       if (bc) {
-                               cs->hw.hfcpci.sctrl |= SCTRL_B2_ENA;
-                               cs->hw.hfcpci.sctrl_r |= SCTRL_B2_ENA;
-                       } else {
-                               cs->hw.hfcpci.sctrl |= SCTRL_B1_ENA;
-                               cs->hw.hfcpci.sctrl_r |= SCTRL_B1_ENA;
-                       }
-                       if (fifo2) {
-                               cs->hw.hfcpci.fifo_en |= HFCPCI_FIFOEN_B2;
-                               cs->hw.hfcpci.int_m1 |= (HFCPCI_INTS_B2TRANS + HFCPCI_INTS_B2REC);
-                               cs->hw.hfcpci.ctmt |= 2;
-                               cs->hw.hfcpci.conn &= ~0x18;
-                       } else {
-                               cs->hw.hfcpci.fifo_en |= HFCPCI_FIFOEN_B1;
-                               cs->hw.hfcpci.int_m1 |= (HFCPCI_INTS_B1TRANS + HFCPCI_INTS_B1REC);
-                               cs->hw.hfcpci.ctmt |= 1;
-                               cs->hw.hfcpci.conn &= ~0x03;
-                       }
-                       break;
-               case (L1_MODE_HDLC):
-                       hfcpci_clear_fifo_rx(cs, fifo2);
-                       hfcpci_clear_fifo_tx(cs, fifo2);
-                       if (bc) {
-                               cs->hw.hfcpci.sctrl |= SCTRL_B2_ENA;
-                               cs->hw.hfcpci.sctrl_r |= SCTRL_B2_ENA;
-                       } else {
-                               cs->hw.hfcpci.sctrl |= SCTRL_B1_ENA;
-                               cs->hw.hfcpci.sctrl_r |= SCTRL_B1_ENA;
-                       }
-                       if (fifo2) {
-                               cs->hw.hfcpci.last_bfifo_cnt[1] = 0;
-                               cs->hw.hfcpci.fifo_en |= HFCPCI_FIFOEN_B2;
-                               cs->hw.hfcpci.int_m1 |= (HFCPCI_INTS_B2TRANS + HFCPCI_INTS_B2REC);
-                               cs->hw.hfcpci.ctmt &= ~2;
-                               cs->hw.hfcpci.conn &= ~0x18;
-                       } else {
-                               cs->hw.hfcpci.last_bfifo_cnt[0] = 0;
-                               cs->hw.hfcpci.fifo_en |= HFCPCI_FIFOEN_B1;
-                               cs->hw.hfcpci.int_m1 |= (HFCPCI_INTS_B1TRANS + HFCPCI_INTS_B1REC);
-                               cs->hw.hfcpci.ctmt &= ~1;
-                               cs->hw.hfcpci.conn &= ~0x03;
-                       }
-                       break;
-               case (L1_MODE_EXTRN):
-                       if (bc) {
-                               cs->hw.hfcpci.conn |= 0x10;
-                               cs->hw.hfcpci.sctrl |= SCTRL_B2_ENA;
-                               cs->hw.hfcpci.sctrl_r |= SCTRL_B2_ENA;
-                               cs->hw.hfcpci.fifo_en &= ~HFCPCI_FIFOEN_B2;
-                               cs->hw.hfcpci.int_m1 &= ~(HFCPCI_INTS_B2TRANS + HFCPCI_INTS_B2REC);
-                       } else {
-                               cs->hw.hfcpci.conn |= 0x02;
-                               cs->hw.hfcpci.sctrl |= SCTRL_B1_ENA;
-                               cs->hw.hfcpci.sctrl_r |= SCTRL_B1_ENA;
-                               cs->hw.hfcpci.fifo_en &= ~HFCPCI_FIFOEN_B1;
-                               cs->hw.hfcpci.int_m1 &= ~(HFCPCI_INTS_B1TRANS + HFCPCI_INTS_B1REC);
-                       }
-                       break;
+       case (L1_MODE_NULL):
+               if (bc) {
+                       cs->hw.hfcpci.sctrl &= ~SCTRL_B2_ENA;
+                       cs->hw.hfcpci.sctrl_r &= ~SCTRL_B2_ENA;
+               } else {
+                       cs->hw.hfcpci.sctrl &= ~SCTRL_B1_ENA;
+                       cs->hw.hfcpci.sctrl_r &= ~SCTRL_B1_ENA;
+               }
+               if (fifo2) {
+                       cs->hw.hfcpci.fifo_en &= ~HFCPCI_FIFOEN_B2;
+                       cs->hw.hfcpci.int_m1 &= ~(HFCPCI_INTS_B2TRANS + HFCPCI_INTS_B2REC);
+               } else {
+                       cs->hw.hfcpci.fifo_en &= ~HFCPCI_FIFOEN_B1;
+                       cs->hw.hfcpci.int_m1 &= ~(HFCPCI_INTS_B1TRANS + HFCPCI_INTS_B1REC);
+               }
+               break;
+       case (L1_MODE_TRANS):
+               hfcpci_clear_fifo_rx(cs, fifo2);
+               hfcpci_clear_fifo_tx(cs, fifo2);
+               if (bc) {
+                       cs->hw.hfcpci.sctrl |= SCTRL_B2_ENA;
+                       cs->hw.hfcpci.sctrl_r |= SCTRL_B2_ENA;
+               } else {
+                       cs->hw.hfcpci.sctrl |= SCTRL_B1_ENA;
+                       cs->hw.hfcpci.sctrl_r |= SCTRL_B1_ENA;
+               }
+               if (fifo2) {
+                       cs->hw.hfcpci.fifo_en |= HFCPCI_FIFOEN_B2;
+                       cs->hw.hfcpci.int_m1 |= (HFCPCI_INTS_B2TRANS + HFCPCI_INTS_B2REC);
+                       cs->hw.hfcpci.ctmt |= 2;
+                       cs->hw.hfcpci.conn &= ~0x18;
+               } else {
+                       cs->hw.hfcpci.fifo_en |= HFCPCI_FIFOEN_B1;
+                       cs->hw.hfcpci.int_m1 |= (HFCPCI_INTS_B1TRANS + HFCPCI_INTS_B1REC);
+                       cs->hw.hfcpci.ctmt |= 1;
+                       cs->hw.hfcpci.conn &= ~0x03;
+               }
+               break;
+       case (L1_MODE_HDLC):
+               hfcpci_clear_fifo_rx(cs, fifo2);
+               hfcpci_clear_fifo_tx(cs, fifo2);
+               if (bc) {
+                       cs->hw.hfcpci.sctrl |= SCTRL_B2_ENA;
+                       cs->hw.hfcpci.sctrl_r |= SCTRL_B2_ENA;
+               } else {
+                       cs->hw.hfcpci.sctrl |= SCTRL_B1_ENA;
+                       cs->hw.hfcpci.sctrl_r |= SCTRL_B1_ENA;
+               }
+               if (fifo2) {
+                       cs->hw.hfcpci.last_bfifo_cnt[1] = 0;
+                       cs->hw.hfcpci.fifo_en |= HFCPCI_FIFOEN_B2;
+                       cs->hw.hfcpci.int_m1 |= (HFCPCI_INTS_B2TRANS + HFCPCI_INTS_B2REC);
+                       cs->hw.hfcpci.ctmt &= ~2;
+                       cs->hw.hfcpci.conn &= ~0x18;
+               } else {
+                       cs->hw.hfcpci.last_bfifo_cnt[0] = 0;
+                       cs->hw.hfcpci.fifo_en |= HFCPCI_FIFOEN_B1;
+                       cs->hw.hfcpci.int_m1 |= (HFCPCI_INTS_B1TRANS + HFCPCI_INTS_B1REC);
+                       cs->hw.hfcpci.ctmt &= ~1;
+                       cs->hw.hfcpci.conn &= ~0x03;
+               }
+               break;
+       case (L1_MODE_EXTRN):
+               if (bc) {
+                       cs->hw.hfcpci.conn |= 0x10;
+                       cs->hw.hfcpci.sctrl |= SCTRL_B2_ENA;
+                       cs->hw.hfcpci.sctrl_r |= SCTRL_B2_ENA;
+                       cs->hw.hfcpci.fifo_en &= ~HFCPCI_FIFOEN_B2;
+                       cs->hw.hfcpci.int_m1 &= ~(HFCPCI_INTS_B2TRANS + HFCPCI_INTS_B2REC);
+               } else {
+                       cs->hw.hfcpci.conn |= 0x02;
+                       cs->hw.hfcpci.sctrl |= SCTRL_B1_ENA;
+                       cs->hw.hfcpci.sctrl_r |= SCTRL_B1_ENA;
+                       cs->hw.hfcpci.fifo_en &= ~HFCPCI_FIFOEN_B1;
+                       cs->hw.hfcpci.int_m1 &= ~(HFCPCI_INTS_B1TRANS + HFCPCI_INTS_B1REC);
+               }
+               break;
        }
        Write_hfc(cs, HFCPCI_SCTRL_E, cs->hw.hfcpci.sctrl_e);
        Write_hfc(cs, HFCPCI_INT_M1, cs->hw.hfcpci.int_m1);
@@ -1393,54 +1393,54 @@ hfcpci_l2l1(struct PStack *st, int pr, void *arg)
        struct sk_buff  *skb = arg;
 
        switch (pr) {
-               case (PH_DATA | REQUEST):
-                       spin_lock_irqsave(&bcs->cs->lock, flags);
-                       if (bcs->tx_skb) {
-                               skb_queue_tail(&bcs->squeue, skb);
-                       } else {
-                               bcs->tx_skb = skb;
-//                             test_and_set_bit(BC_FLG_BUSY, &bcs->Flag);
-                               bcs->cs->BC_Send_Data(bcs);
-                       }
-                       spin_unlock_irqrestore(&bcs->cs->lock, flags);
-                       break;
-               case (PH_PULL | INDICATION):
-                       spin_lock_irqsave(&bcs->cs->lock, flags);
-                       if (bcs->tx_skb) {
-                               spin_unlock_irqrestore(&bcs->cs->lock, flags);
-                               printk(KERN_WARNING "hfc_l2l1: this shouldn't happen\n");
-                               break;
-                       }
-//                     test_and_set_bit(BC_FLG_BUSY, &bcs->Flag);
+       case (PH_DATA | REQUEST):
+               spin_lock_irqsave(&bcs->cs->lock, flags);
+               if (bcs->tx_skb) {
+                       skb_queue_tail(&bcs->squeue, skb);
+               } else {
                        bcs->tx_skb = skb;
+//                             test_and_set_bit(BC_FLG_BUSY, &bcs->Flag);
                        bcs->cs->BC_Send_Data(bcs);
+               }
+               spin_unlock_irqrestore(&bcs->cs->lock, flags);
+               break;
+       case (PH_PULL | INDICATION):
+               spin_lock_irqsave(&bcs->cs->lock, flags);
+               if (bcs->tx_skb) {
                        spin_unlock_irqrestore(&bcs->cs->lock, flags);
+                       printk(KERN_WARNING "hfc_l2l1: this shouldn't happen\n");
                        break;
-               case (PH_PULL | REQUEST):
-                       if (!bcs->tx_skb) {
-                               test_and_clear_bit(FLG_L1_PULL_REQ, &st->l1.Flags);
-                               st->l1.l1l2(st, PH_PULL | CONFIRM, NULL);
-                       } else
-                               test_and_set_bit(FLG_L1_PULL_REQ, &st->l1.Flags);
-                       break;
-               case (PH_ACTIVATE | REQUEST):
-                       spin_lock_irqsave(&bcs->cs->lock, flags);
-                       test_and_set_bit(BC_FLG_ACTIV, &bcs->Flag);
-                       mode_hfcpci(bcs, st->l1.mode, st->l1.bc);
-                       spin_unlock_irqrestore(&bcs->cs->lock, flags);
-                       l1_msg_b(st, pr, arg);
-                       break;
-               case (PH_DEACTIVATE | REQUEST):
-                       l1_msg_b(st, pr, arg);
-                       break;
-               case (PH_DEACTIVATE | CONFIRM):
-                       spin_lock_irqsave(&bcs->cs->lock, flags);
-                       test_and_clear_bit(BC_FLG_ACTIV, &bcs->Flag);
-                       test_and_clear_bit(BC_FLG_BUSY, &bcs->Flag);
-                       mode_hfcpci(bcs, 0, st->l1.bc);
-                       spin_unlock_irqrestore(&bcs->cs->lock, flags);
-                       st->l1.l1l2(st, PH_DEACTIVATE | CONFIRM, NULL);
-                       break;
+               }
+//                     test_and_set_bit(BC_FLG_BUSY, &bcs->Flag);
+               bcs->tx_skb = skb;
+               bcs->cs->BC_Send_Data(bcs);
+               spin_unlock_irqrestore(&bcs->cs->lock, flags);
+               break;
+       case (PH_PULL | REQUEST):
+               if (!bcs->tx_skb) {
+                       test_and_clear_bit(FLG_L1_PULL_REQ, &st->l1.Flags);
+                       st->l1.l1l2(st, PH_PULL | CONFIRM, NULL);
+               } else
+                       test_and_set_bit(FLG_L1_PULL_REQ, &st->l1.Flags);
+               break;
+       case (PH_ACTIVATE | REQUEST):
+               spin_lock_irqsave(&bcs->cs->lock, flags);
+               test_and_set_bit(BC_FLG_ACTIV, &bcs->Flag);
+               mode_hfcpci(bcs, st->l1.mode, st->l1.bc);
+               spin_unlock_irqrestore(&bcs->cs->lock, flags);
+               l1_msg_b(st, pr, arg);
+               break;
+       case (PH_DEACTIVATE | REQUEST):
+               l1_msg_b(st, pr, arg);
+               break;
+       case (PH_DEACTIVATE | CONFIRM):
+               spin_lock_irqsave(&bcs->cs->lock, flags);
+               test_and_clear_bit(BC_FLG_ACTIV, &bcs->Flag);
+               test_and_clear_bit(BC_FLG_BUSY, &bcs->Flag);
+               mode_hfcpci(bcs, 0, st->l1.bc);
+               spin_unlock_irqrestore(&bcs->cs->lock, flags);
+               st->l1.l1l2(st, PH_DEACTIVATE | CONFIRM, NULL);
+               break;
        }
 }
 
@@ -1510,57 +1510,57 @@ hfcpci_bh(struct work_struct *work)
        if (test_and_clear_bit(D_L1STATECHANGE, &cs->event)) {
                if (!cs->hw.hfcpci.nt_mode)
                        switch (cs->dc.hfcpci.ph_state) {
-                               case (0):
-                                       l1_msg(cs, HW_RESET | INDICATION, NULL);
-                                       break;
-                               case (3):
-                                       l1_msg(cs, HW_DEACTIVATE | INDICATION, NULL);
-                                       break;
-                               case (8):
-                                       l1_msg(cs, HW_RSYNC | INDICATION, NULL);
-                                       break;
-                               case (6):
-                                       l1_msg(cs, HW_INFO2 | INDICATION, NULL);
-                                       break;
-                               case (7):
-                                       l1_msg(cs, HW_INFO4_P8 | INDICATION, NULL);
-                                       break;
-                               default:
-                                       break;
-               } else {
+                       case (0):
+                               l1_msg(cs, HW_RESET | INDICATION, NULL);
+                               break;
+                       case (3):
+                               l1_msg(cs, HW_DEACTIVATE | INDICATION, NULL);
+                               break;
+                       case (8):
+                               l1_msg(cs, HW_RSYNC | INDICATION, NULL);
+                               break;
+                       case (6):
+                               l1_msg(cs, HW_INFO2 | INDICATION, NULL);
+                               break;
+                       case (7):
+                               l1_msg(cs, HW_INFO4_P8 | INDICATION, NULL);
+                               break;
+                       default:
+                               break;
+                       } else {
                        spin_lock_irqsave(&cs->lock, flags);
                        switch (cs->dc.hfcpci.ph_state) {
-                               case (2):
-                                       if (cs->hw.hfcpci.nt_timer < 0) {
-                                               cs->hw.hfcpci.nt_timer = 0;
-                                               cs->hw.hfcpci.int_m1 &= ~HFCPCI_INTS_TIMER;
-                                               Write_hfc(cs, HFCPCI_INT_M1, cs->hw.hfcpci.int_m1);
-                                               /* Clear already pending ints */
-                                               if (Read_hfc(cs, HFCPCI_INT_S1));
-                                               Write_hfc(cs, HFCPCI_STATES, 4 | HFCPCI_LOAD_STATE);
-                                               udelay(10);
-                                               Write_hfc(cs, HFCPCI_STATES, 4);
-                                               cs->dc.hfcpci.ph_state = 4;
-                                       } else {
-                                               cs->hw.hfcpci.int_m1 |= HFCPCI_INTS_TIMER;
-                                               Write_hfc(cs, HFCPCI_INT_M1, cs->hw.hfcpci.int_m1);
-                                               cs->hw.hfcpci.ctmt &= ~HFCPCI_AUTO_TIMER;
-                                               cs->hw.hfcpci.ctmt |= HFCPCI_TIM3_125;
-                                               Write_hfc(cs, HFCPCI_CTMT, cs->hw.hfcpci.ctmt | HFCPCI_CLTIMER);
-                                               Write_hfc(cs, HFCPCI_CTMT, cs->hw.hfcpci.ctmt | HFCPCI_CLTIMER);
-                                               cs->hw.hfcpci.nt_timer = NT_T1_COUNT;
-                                               Write_hfc(cs, HFCPCI_STATES, 2 | HFCPCI_NT_G2_G3);      /* allow G2 -> G3 transition */
-                                       }
-                                       break;
-                               case (1):
-                               case (3):
-                               case (4):
+                       case (2):
+                               if (cs->hw.hfcpci.nt_timer < 0) {
                                        cs->hw.hfcpci.nt_timer = 0;
                                        cs->hw.hfcpci.int_m1 &= ~HFCPCI_INTS_TIMER;
                                        Write_hfc(cs, HFCPCI_INT_M1, cs->hw.hfcpci.int_m1);
-                                       break;
-                               default:
-                                       break;
+                                       /* Clear already pending ints */
+                                       if (Read_hfc(cs, HFCPCI_INT_S1));
+                                       Write_hfc(cs, HFCPCI_STATES, 4 | HFCPCI_LOAD_STATE);
+                                       udelay(10);
+                                       Write_hfc(cs, HFCPCI_STATES, 4);
+                                       cs->dc.hfcpci.ph_state = 4;
+                               } else {
+                                       cs->hw.hfcpci.int_m1 |= HFCPCI_INTS_TIMER;
+                                       Write_hfc(cs, HFCPCI_INT_M1, cs->hw.hfcpci.int_m1);
+                                       cs->hw.hfcpci.ctmt &= ~HFCPCI_AUTO_TIMER;
+                                       cs->hw.hfcpci.ctmt |= HFCPCI_TIM3_125;
+                                       Write_hfc(cs, HFCPCI_CTMT, cs->hw.hfcpci.ctmt | HFCPCI_CLTIMER);
+                                       Write_hfc(cs, HFCPCI_CTMT, cs->hw.hfcpci.ctmt | HFCPCI_CLTIMER);
+                                       cs->hw.hfcpci.nt_timer = NT_T1_COUNT;
+                                       Write_hfc(cs, HFCPCI_STATES, 2 | HFCPCI_NT_G2_G3);      /* allow G2 -> G3 transition */
+                               }
+                               break;
+                       case (1):
+                       case (3):
+                       case (4):
+                               cs->hw.hfcpci.nt_timer = 0;
+                               cs->hw.hfcpci.int_m1 &= ~HFCPCI_INTS_TIMER;
+                               Write_hfc(cs, HFCPCI_INT_M1, cs->hw.hfcpci.int_m1);
+                               break;
+                       default:
+                               break;
                        }
                        spin_unlock_irqrestore(&cs->lock, flags);
                }
@@ -1602,30 +1602,30 @@ hfcpci_card_msg(struct IsdnCardState *cs, int mt, void *arg)
        if (cs->debug & L1_DEB_ISAC)
                debugl1(cs, "HFCPCI: card_msg %x", mt);
        switch (mt) {
-               case CARD_RESET:
-                       spin_lock_irqsave(&cs->lock, flags);
-                       reset_hfcpci(cs);
-                       spin_unlock_irqrestore(&cs->lock, flags);
-                       return (0);
-               case CARD_RELEASE:
-                       release_io_hfcpci(cs);
-                       return (0);
-               case CARD_INIT:
-                       spin_lock_irqsave(&cs->lock, flags);
-                       inithfcpci(cs);
-                       reset_hfcpci(cs);
-                       spin_unlock_irqrestore(&cs->lock, flags);
-                       msleep(80);                             /* Timeout 80ms */
-                       /* now switch timer interrupt off */
-                       spin_lock_irqsave(&cs->lock, flags);
-                       cs->hw.hfcpci.int_m1 &= ~HFCPCI_INTS_TIMER;
-                       Write_hfc(cs, HFCPCI_INT_M1, cs->hw.hfcpci.int_m1);
-                       /* reinit mode reg */
-                       Write_hfc(cs, HFCPCI_MST_MODE, cs->hw.hfcpci.mst_m);
-                       spin_unlock_irqrestore(&cs->lock, flags);
-                       return (0);
-               case CARD_TEST:
-                       return (0);
+       case CARD_RESET:
+               spin_lock_irqsave(&cs->lock, flags);
+               reset_hfcpci(cs);
+               spin_unlock_irqrestore(&cs->lock, flags);
+               return (0);
+       case CARD_RELEASE:
+               release_io_hfcpci(cs);
+               return (0);
+       case CARD_INIT:
+               spin_lock_irqsave(&cs->lock, flags);
+               inithfcpci(cs);
+               reset_hfcpci(cs);
+               spin_unlock_irqrestore(&cs->lock, flags);
+               msleep(80);                             /* Timeout 80ms */
+               /* now switch timer interrupt off */
+               spin_lock_irqsave(&cs->lock, flags);
+               cs->hw.hfcpci.int_m1 &= ~HFCPCI_INTS_TIMER;
+               Write_hfc(cs, HFCPCI_INT_M1, cs->hw.hfcpci.int_m1);
+               /* reinit mode reg */
+               Write_hfc(cs, HFCPCI_MST_MODE, cs->hw.hfcpci.mst_m);
+               spin_unlock_irqrestore(&cs->lock, flags);
+               return (0);
+       case CARD_TEST:
+               return (0);
        }
        return (0);
 }
@@ -1654,13 +1654,13 @@ setup_hfcpci(struct IsdnCard *card)
        cs->dc.hfcpci.ph_state = 0;
        cs->hw.hfcpci.fifo = 255;
        if (cs->typ != ISDN_CTYPE_HFC_PCI)
-               return(0);
+               return (0);
 
        i = 0;
        while (id_list[i].vendor_id) {
                tmp_hfcpci = hisax_find_pci_device(id_list[i].vendor_id,
-                                            id_list[i].device_id,
-                                            dev_hfcpci);
+                                                  id_list[i].device_id,
+                                                  dev_hfcpci);
                i++;
                if (tmp_hfcpci) {
                        dma_addr_t      dma_mask = DMA_BIT_MASK(32) & ~0x7fffUL;
@@ -1668,16 +1668,16 @@ setup_hfcpci(struct IsdnCard *card)
                                continue;
                        if (pci_set_dma_mask(tmp_hfcpci, dma_mask)) {
                                printk(KERN_WARNING
-                                       "HiSax hfc_pci: No suitable DMA available.\n");
+                                      "HiSax hfc_pci: No suitable DMA available.\n");
                                continue;
                        }
                        if (pci_set_consistent_dma_mask(tmp_hfcpci, dma_mask)) {
                                printk(KERN_WARNING
-                                       "HiSax hfc_pci: No suitable consistent DMA available.\n");
+                                      "HiSax hfc_pci: No suitable consistent DMA available.\n");
                                continue;
                        }
                        pci_set_master(tmp_hfcpci);
-                       if ((card->para[0]) && (card->para[0] != (tmp_hfcpci->resource[ 0].start & PCI_BASE_ADDRESS_IO_MASK)))
+                       if ((card->para[0]) && (card->para[0] != (tmp_hfcpci->resource[0].start & PCI_BASE_ADDRESS_IO_MASK)))
                                continue;
                        else
                                break;
@@ -1707,17 +1707,17 @@ setup_hfcpci(struct IsdnCard *card)
 
        /* Allocate memory for FIFOS */
        cs->hw.hfcpci.fifos = pci_alloc_consistent(cs->hw.hfcpci.dev,
-                                       0x8000, &cs->hw.hfcpci.dma);
+                                                  0x8000, &cs->hw.hfcpci.dma);
        if (!cs->hw.hfcpci.fifos) {
                printk(KERN_WARNING "HFC-PCI: Error allocating FIFO memory!\n");
                return 0;
        }
        if (cs->hw.hfcpci.dma & 0x7fff) {
                printk(KERN_WARNING
-                   "HFC-PCI: Error DMA memory not on 32K boundary (%lx)\n",
-                   (u_long)cs->hw.hfcpci.dma);
+                      "HFC-PCI: Error DMA memory not on 32K boundary (%lx)\n",
+                      (u_long)cs->hw.hfcpci.dma);
                pci_free_consistent(cs->hw.hfcpci.dev, 0x8000,
-                       cs->hw.hfcpci.fifos, cs->hw.hfcpci.dma);
+                                   cs->hw.hfcpci.fifos, cs->hw.hfcpci.dma);
                return 0;
        }
        pci_write_config_dword(cs->hw.hfcpci.dev, 0x80, (u32)cs->hw.hfcpci.dma);
index 9ef2981..4e58700 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Author       Werner Cornelius
  * Copyright    by Werner Cornelius  <werner@isdn4linux.de>
- * 
+ *
  * This software may be used and distributed according to the terms
  * of the GNU General Public License, incorporated herein by reference.
  *
@@ -55,7 +55,7 @@
 
 #define HFCPCI_MST_EMOD  0xB4
 #define HFCPCI_MST_MODE         0xB8
-#define HFCPCI_CONNECT          0xBC
+#define HFCPCI_CONNECT  0xBC
 
 
 /* Interrupt and status registers */
 #define HFCPCI_TRM       0x48
 #define HFCPCI_B_MODE    0x4C
 #define HFCPCI_CHIP_ID   0x58
-#define HFCPCI_CIRM     0x60
+#define HFCPCI_CIRM     0x60
 #define HFCPCI_CTMT     0x64
-#define HFCPCI_INT_M1           0x68
-#define HFCPCI_INT_M2           0x6C
-#define HFCPCI_INT_S1           0x78
-#define HFCPCI_INT_S2           0x7C
-#define HFCPCI_STATUS           0x70
+#define HFCPCI_INT_M1   0x68
+#define HFCPCI_INT_M2   0x6C
+#define HFCPCI_INT_S1   0x78
+#define HFCPCI_INT_S2   0x7C
+#define HFCPCI_STATUS   0x70
 
 /* S/T section registers */
 
-#define HFCPCI_STATES           0xC0
-#define HFCPCI_SCTRL    0xC4
+#define HFCPCI_STATES   0xC0
+#define HFCPCI_SCTRL    0xC4
 #define HFCPCI_SCTRL_E   0xC8
 #define HFCPCI_SCTRL_R   0xCC
-#define HFCPCI_SQ       0xD0
-#define HFCPCI_CLKDEL           0xDC
+#define HFCPCI_SQ       0xD0
+#define HFCPCI_CLKDEL   0xDC
 #define HFCPCI_B1_REC    0xF0
 #define HFCPCI_B1_SEND   0xF0
 #define HFCPCI_B2_REC    0xF4
@@ -91,7 +91,7 @@
 
 /* bits in status register (READ) */
 #define HFCPCI_PCI_PROC   0x02
-#define HFCPCI_NBUSY     0x04 
+#define HFCPCI_NBUSY     0x04
 #define HFCPCI_TIMER_ELAP 0x10
 #define HFCPCI_STATINT   0x20
 #define HFCPCI_FRAMEINT          0x40
 
 /* bits in CIRM (Write) */
 #define HFCPCI_AUX_MSK    0x07
-#define HFCPCI_RESET     0x08
+#define HFCPCI_RESET     0x08
 #define HFCPCI_B1_REV     0x40
 #define HFCPCI_B2_REV     0x80
 
 #define D_FREG_MASK  0xF
 
 typedef struct {
-    unsigned short z1;  /* Z1 pointer 16 Bit */
-    unsigned short z2;  /* Z2 pointer 16 Bit */
-  } z_type;
+       unsigned short z1;  /* Z1 pointer 16 Bit */
+       unsigned short z2;  /* Z2 pointer 16 Bit */
+} z_type;
 
 typedef struct {
-    u_char data[D_FIFO_SIZE]; /* FIFO data space */
-    u_char fill1[0x20A0-D_FIFO_SIZE]; /* reserved, do not use */
-    u_char f1,f2; /* f pointers */
-    u_char fill2[0x20C0-0x20A2]; /* reserved, do not use */
-    z_type za[MAX_D_FRAMES+1]; /* mask index with D_FREG_MASK for access */
-    u_char fill3[0x4000-0x2100]; /* align 16K */  
-  } dfifo_type;
+       u_char data[D_FIFO_SIZE]; /* FIFO data space */
+       u_char fill1[0x20A0 - D_FIFO_SIZE]; /* reserved, do not use */
+       u_char f1, f2; /* f pointers */
+       u_char fill2[0x20C0 - 0x20A2]; /* reserved, do not use */
+       z_type za[MAX_D_FRAMES + 1]; /* mask index with D_FREG_MASK for access */
+       u_char fill3[0x4000 - 0x2100]; /* align 16K */
+} dfifo_type;
 
 typedef struct {
-    z_type za[MAX_B_FRAMES+1]; /* only range 0x0..0x1F allowed */ 
-    u_char f1,f2; /* f pointers */
-    u_char fill[0x2100-0x2082]; /* alignment */
-  } bzfifo_type;
+       z_type za[MAX_B_FRAMES + 1]; /* only range 0x0..0x1F allowed */
+       u_char f1, f2; /* f pointers */
+       u_char fill[0x2100 - 0x2082]; /* alignment */
+} bzfifo_type;
 
 
 typedef union {
-    struct { 
-      dfifo_type d_tx; /* D-send channel */
-      dfifo_type d_rx; /* D-receive channel */
-    } d_chan; 
-    struct {
-      u_char fill1[0x200];
-      u_char txdat_b1[B_FIFO_SIZE];
-      bzfifo_type txbz_b1;
+       struct {
+               dfifo_type d_tx; /* D-send channel */
+               dfifo_type d_rx; /* D-receive channel */
+       } d_chan;
+       struct {
+               u_char fill1[0x200];
+               u_char txdat_b1[B_FIFO_SIZE];
+               bzfifo_type txbz_b1;
 
-      bzfifo_type txbz_b2;
-      u_char txdat_b2[B_FIFO_SIZE];
+               bzfifo_type txbz_b2;
+               u_char txdat_b2[B_FIFO_SIZE];
 
-      u_char fill2[D_FIFO_SIZE];
+               u_char fill2[D_FIFO_SIZE];
 
-      u_char rxdat_b1[B_FIFO_SIZE];
-      bzfifo_type rxbz_b1;
+               u_char rxdat_b1[B_FIFO_SIZE];
+               bzfifo_type rxbz_b1;
 
-      bzfifo_type rxbz_b2;
-      u_char rxdat_b2[B_FIFO_SIZE];
-    } b_chans;  
-    u_char fill[32768]; 
-  } fifo_area;
+               bzfifo_type rxbz_b2;
+               u_char rxdat_b2[B_FIFO_SIZE];
+       } b_chans;
+       u_char fill[32768];
+} fifo_area;
 
 
-#define Write_hfc(a,b,c) (*(((u_char *)a->hw.hfcpci.pci_io)+b) = c) 
-#define Read_hfc(a,b) (*(((u_char *)a->hw.hfcpci.pci_io)+b))
+#define Write_hfc(a, b, c) (*(((u_char *)a->hw.hfcpci.pci_io) + b) = c)
+#define Read_hfc(a, b) (*(((u_char *)a->hw.hfcpci.pci_io) + b))
 
 extern void main_irq_hcpci(struct BCState *bcs);
 extern void releasehfcpci(struct IsdnCardState *cs);
index 156d7c6..4db846b 100644 (file)
@@ -5,7 +5,7 @@
  * Author       Werner Cornelius
  *              based on existing driver for CCD HFC PCI cards
  * Copyright    by Werner Cornelius  <werner@isdn4linux.de>
- * 
+ *
  * This software may be used and distributed according to the terms
  * of the GNU General Public License, incorporated herein by reference.
  *
@@ -43,16 +43,16 @@ static const char *hfcsx_revision = "$Revision: 1.12.2.5 $";
 #undef CCD_DEMO_BOARD
 #ifdef CCD_DEMO_BOARD
 static u_char ccd_sp_irqtab[16] = {
-  0,0,0,0,0,2,1,0,0,0,3,4,5,0,0,6
+       0, 0, 0, 0, 0, 2, 1, 0, 0, 0, 3, 4, 5, 0, 0, 6
 };
 #else /* Teles 16.3c */
 static u_char ccd_sp_irqtab[16] = {
-  0,0,0,7,0,1,0,0,0,2,3,4,5,0,0,6
+       0, 0, 0, 7, 0, 1, 0, 0, 0, 2, 3, 4, 5, 0, 0, 6
 };
 #endif
 #define NT_T1_COUNT 20         /* number of 3.125ms interrupts for G2 timeout */
 
-#define byteout(addr,val) outb(val,addr)
+#define byteout(addr, val) outb(val, addr)
 #define bytein(addr) inb(addr)
 
 /******************************/
@@ -61,19 +61,19 @@ static u_char ccd_sp_irqtab[16] = {
 static inline void
 Write_hfc(struct IsdnCardState *cs, u_char regnum, u_char val)
 {
-        byteout(cs->hw.hfcsx.base+1, regnum);
+       byteout(cs->hw.hfcsx.base + 1, regnum);
        byteout(cs->hw.hfcsx.base, val);
-} 
+}
 
 static inline u_char
 Read_hfc(struct IsdnCardState *cs, u_char regnum)
 {
-        u_char ret; 
+       u_char ret;
 
-        byteout(cs->hw.hfcsx.base+1, regnum);
+       byteout(cs->hw.hfcsx.base + 1, regnum);
        ret = bytein(cs->hw.hfcsx.base);
-       return(ret);
-} 
+       return (ret);
+}
 
 
 /**************************************************/
@@ -82,15 +82,15 @@ Read_hfc(struct IsdnCardState *cs, u_char regnum)
 static void
 fifo_select(struct IsdnCardState *cs, u_char fifo)
 {
-        if (fifo == cs->hw.hfcsx.last_fifo) 
-         return; /* still valid */
+       if (fifo == cs->hw.hfcsx.last_fifo)
+               return; /* still valid */
 
-        byteout(cs->hw.hfcsx.base+1, HFCSX_FIF_SEL);
+       byteout(cs->hw.hfcsx.base + 1, HFCSX_FIF_SEL);
        byteout(cs->hw.hfcsx.base, fifo);
-       while (bytein(cs->hw.hfcsx.base+1) & 1); /* wait for busy */
+       while (bytein(cs->hw.hfcsx.base + 1) & 1); /* wait for busy */
        udelay(4);
        byteout(cs->hw.hfcsx.base, fifo);
-       while (bytein(cs->hw.hfcsx.base+1) & 1); /* wait for busy */
+       while (bytein(cs->hw.hfcsx.base + 1) & 1); /* wait for busy */
 }
 
 /******************************************/
@@ -101,11 +101,11 @@ static void
 reset_fifo(struct IsdnCardState *cs, u_char fifo)
 {
        fifo_select(cs, fifo); /* first select the fifo */
-       byteout(cs->hw.hfcsx.base+1, HFCSX_CIRM);
+       byteout(cs->hw.hfcsx.base + 1, HFCSX_CIRM);
        byteout(cs->hw.hfcsx.base, cs->hw.hfcsx.cirm | 0x80); /* reset cmd */
        udelay(1);
-       while (bytein(cs->hw.hfcsx.base+1) & 1); /* wait for busy */
-} 
+       while (bytein(cs->hw.hfcsx.base + 1) & 1); /* wait for busy */
+}
 
 
 /*************************************************************/
@@ -116,56 +116,56 @@ reset_fifo(struct IsdnCardState *cs, u_char fifo)
 static int
 write_fifo(struct IsdnCardState *cs, struct sk_buff *skb, u_char fifo, int trans_max)
 {
-       unsigned short *msp;
-        int fifo_size, count, z1, z2;
+       unsigned short *msp;
+       int fifo_size, count, z1, z2;
        u_char f_msk, f1, f2, *src;
 
-       if (skb->len <= 0) return(0);
-        if (fifo & 1) return(0); /* no write fifo */
+       if (skb->len <= 0) return (0);
+       if (fifo & 1) return (0); /* no write fifo */
 
        fifo_select(cs, fifo);
        if (fifo & 4) {
-         fifo_size = D_FIFO_SIZE; /* D-channel */
-         f_msk = MAX_D_FRAMES;
-         if (trans_max) return(0); /* only HDLC */
+               fifo_size = D_FIFO_SIZE; /* D-channel */
+               f_msk = MAX_D_FRAMES;
+               if (trans_max) return (0); /* only HDLC */
        }
        else {
-         fifo_size = cs->hw.hfcsx.b_fifo_size; /* B-channel */
-         f_msk = MAX_B_FRAMES;
+               fifo_size = cs->hw.hfcsx.b_fifo_size; /* B-channel */
+               f_msk = MAX_B_FRAMES;
        }
 
-        z1 = Read_hfc(cs, HFCSX_FIF_Z1H);
+       z1 = Read_hfc(cs, HFCSX_FIF_Z1H);
        z1 = ((z1 << 8) | Read_hfc(cs, HFCSX_FIF_Z1L));
 
        /* Check for transparent mode */
        if (trans_max) {
-         z2 = Read_hfc(cs, HFCSX_FIF_Z2H);
-         z2 = ((z2 << 8) | Read_hfc(cs, HFCSX_FIF_Z2L));
-         count = z2 - z1;
-         if (count <= 0)
-           count += fifo_size; /* free bytes */
-         if (count < skb->len+1) return(0); /* no room */
-         count = fifo_size - count; /* bytes still not send */
-         if (count > 2 * trans_max) return(0); /* delay to long */
-         count = skb->len;
-         src = skb->data;
-         while (count--)
-           Write_hfc(cs, HFCSX_FIF_DWR, *src++);
-         return(1); /* success */
+               z2 = Read_hfc(cs, HFCSX_FIF_Z2H);
+               z2 = ((z2 << 8) | Read_hfc(cs, HFCSX_FIF_Z2L));
+               count = z2 - z1;
+               if (count <= 0)
+                       count += fifo_size; /* free bytes */
+               if (count < skb->len + 1) return (0); /* no room */
+               count = fifo_size - count; /* bytes still not send */
+               if (count > 2 * trans_max) return (0); /* delay to long */
+               count = skb->len;
+               src = skb->data;
+               while (count--)
+                       Write_hfc(cs, HFCSX_FIF_DWR, *src++);
+               return (1); /* success */
        }
 
-        msp = ((struct hfcsx_extra *)(cs->hw.hfcsx.extra))->marker;
-       msp += (((fifo >> 1) & 3) * (MAX_B_FRAMES+1));
+       msp = ((struct hfcsx_extra *)(cs->hw.hfcsx.extra))->marker;
+       msp += (((fifo >> 1) & 3) * (MAX_B_FRAMES + 1));
        f1 = Read_hfc(cs, HFCSX_FIF_F1) & f_msk;
        f2 = Read_hfc(cs, HFCSX_FIF_F2) & f_msk;
 
        count = f1 - f2; /* frame count actually buffered */
        if (count < 0)
                count += (f_msk + 1);   /* if wrap around */
-       if (count > f_msk-1) {
-         if (cs->debug & L1_DEB_ISAC_FIFO)
-           debugl1(cs, "hfcsx_write_fifo %d more as %d frames",fifo,f_msk-1);
-         return(0);
+       if (count > f_msk - 1) {
+               if (cs->debug & L1_DEB_ISAC_FIFO)
+                       debugl1(cs, "hfcsx_write_fifo %d more as %d frames", fifo, f_msk - 1);
+               return (0);
        }
 
        *(msp + f1) = z1; /* remember marker */
@@ -176,134 +176,134 @@ write_fifo(struct IsdnCardState *cs, struct sk_buff *skb, u_char fifo, int trans
        /* now determine free bytes in FIFO buffer */
        count = *(msp + f2) - z1;
        if (count <= 0)
-         count += fifo_size;   /* count now contains available bytes */
+               count += fifo_size;     /* count now contains available bytes */
 
        if (cs->debug & L1_DEB_ISAC_FIFO)
-         debugl1(cs, "hfcsx_write_fifo %d count(%u/%d)",
-                 fifo, skb->len, count);
+               debugl1(cs, "hfcsx_write_fifo %d count(%u/%d)",
+                       fifo, skb->len, count);
        if (count < skb->len) {
-         if (cs->debug & L1_DEB_ISAC_FIFO)
-           debugl1(cs, "hfcsx_write_fifo %d no fifo mem", fifo);
-         return(0);
+               if (cs->debug & L1_DEB_ISAC_FIFO)
+                       debugl1(cs, "hfcsx_write_fifo %d no fifo mem", fifo);
+               return (0);
        }
-       
+
        count = skb->len; /* get frame len */
        src = skb->data;        /* source pointer */
        while (count--)
-         Write_hfc(cs, HFCSX_FIF_DWR, *src++);
-       
+               Write_hfc(cs, HFCSX_FIF_DWR, *src++);
+
        Read_hfc(cs, HFCSX_FIF_INCF1); /* increment F1 */
        udelay(1);
-       while (bytein(cs->hw.hfcsx.base+1) & 1); /* wait for busy */
-       return(1);
-} 
+       while (bytein(cs->hw.hfcsx.base + 1) & 1); /* wait for busy */
+       return (1);
+}
 
 /***************************************************************/
 /* read_fifo reads data to an skb from the desired fifo        */
 /* if no data is available or an error occurs NULL is returned */
 /* the skb is not released in any way.                         */
 /***************************************************************/
-static struct sk_buff * 
+static struct sk_buff *
 read_fifo(struct IsdnCardState *cs, u_char fifo, int trans_max)
 {       int fifo_size, count, z1, z2;
        u_char f_msk, f1, f2, *dst;
        struct sk_buff *skb;
 
-        if (!(fifo & 1)) return(NULL); /* no read fifo */
+       if (!(fifo & 1)) return (NULL); /* no read fifo */
        fifo_select(cs, fifo);
        if (fifo & 4) {
-         fifo_size = D_FIFO_SIZE; /* D-channel */
-         f_msk = MAX_D_FRAMES;
-         if (trans_max) return(NULL); /* only hdlc */
+               fifo_size = D_FIFO_SIZE; /* D-channel */
+               f_msk = MAX_D_FRAMES;
+               if (trans_max) return (NULL); /* only hdlc */
        }
        else {
-         fifo_size = cs->hw.hfcsx.b_fifo_size; /* B-channel */
-         f_msk = MAX_B_FRAMES;
+               fifo_size = cs->hw.hfcsx.b_fifo_size; /* B-channel */
+               f_msk = MAX_B_FRAMES;
        }
 
        /* transparent mode */
        if (trans_max) {
-         z1 = Read_hfc(cs, HFCSX_FIF_Z1H);
-         z1 = ((z1 << 8) | Read_hfc(cs, HFCSX_FIF_Z1L));
-         z2 = Read_hfc(cs, HFCSX_FIF_Z2H);
-         z2 = ((z2 << 8) | Read_hfc(cs, HFCSX_FIF_Z2L));
-         /* now determine bytes in actual FIFO buffer */
-         count = z1 - z2;
-         if (count <= 0)
-           count += fifo_size; /* count now contains buffered bytes */
-         count++;
-         if (count > trans_max) 
-           count = trans_max; /* limit length */
-         skb = dev_alloc_skb(count);
-         if (skb) {
-           dst = skb_put(skb, count);
-           while (count--)
-               *dst++ = Read_hfc(cs, HFCSX_FIF_DRD);
-           return skb;
-         } else
-               return NULL; /* no memory */
+               z1 = Read_hfc(cs, HFCSX_FIF_Z1H);
+               z1 = ((z1 << 8) | Read_hfc(cs, HFCSX_FIF_Z1L));
+               z2 = Read_hfc(cs, HFCSX_FIF_Z2H);
+               z2 = ((z2 << 8) | Read_hfc(cs, HFCSX_FIF_Z2L));
+               /* now determine bytes in actual FIFO buffer */
+               count = z1 - z2;
+               if (count <= 0)
+                       count += fifo_size;     /* count now contains buffered bytes */
+               count++;
+               if (count > trans_max)
+                       count = trans_max; /* limit length */
+               skb = dev_alloc_skb(count);
+               if (skb) {
+                       dst = skb_put(skb, count);
+                       while (count--)
+                               *dst++ = Read_hfc(cs, HFCSX_FIF_DRD);
+                       return skb;
+               } else
+                       return NULL; /* no memory */
        }
 
        do {
-         f1 = Read_hfc(cs, HFCSX_FIF_F1) & f_msk;
-         f2 = Read_hfc(cs, HFCSX_FIF_F2) & f_msk;
-
-         if (f1 == f2) return(NULL); /* no frame available */
-
-         z1 = Read_hfc(cs, HFCSX_FIF_Z1H);
-         z1 = ((z1 << 8) | Read_hfc(cs, HFCSX_FIF_Z1L));
-         z2 = Read_hfc(cs, HFCSX_FIF_Z2H);
-         z2 = ((z2 << 8) | Read_hfc(cs, HFCSX_FIF_Z2L));
-
-         if (cs->debug & L1_DEB_ISAC_FIFO)
-           debugl1(cs, "hfcsx_read_fifo %d f1(%x) f2(%x) z1(f2)(%x) z2(f2)(%x)",
-                       fifo, f1, f2, z1, z2);
-         /* now determine bytes in actual FIFO buffer */
-         count = z1 - z2;
-         if (count <= 0)
-           count += fifo_size; /* count now contains buffered bytes */
-         count++;
-
-         if (cs->debug & L1_DEB_ISAC_FIFO)
-           debugl1(cs, "hfcsx_read_fifo %d count %u)",
-                   fifo, count);
-
-         if ((count > fifo_size) || (count < 4)) {
-           if (cs->debug & L1_DEB_WARN)
-             debugl1(cs, "hfcsx_read_fifo %d paket inv. len %d ", fifo , count);
-           while (count) {
-             count--; /* empty fifo */
-             Read_hfc(cs, HFCSX_FIF_DRD);
-           }
-           skb = NULL;
-         } else 
-           if ((skb = dev_alloc_skb(count - 3))) {
-             count -= 3;
-             dst = skb_put(skb, count);
-
-             while (count--) 
-               *dst++ = Read_hfc(cs, HFCSX_FIF_DRD);
-                   
-             Read_hfc(cs, HFCSX_FIF_DRD); /* CRC 1 */
-             Read_hfc(cs, HFCSX_FIF_DRD); /* CRC 2 */
-             if (Read_hfc(cs, HFCSX_FIF_DRD)) {
-               dev_kfree_skb_irq(skb);
+               f1 = Read_hfc(cs, HFCSX_FIF_F1) & f_msk;
+               f2 = Read_hfc(cs, HFCSX_FIF_F2) & f_msk;
+
+               if (f1 == f2) return (NULL); /* no frame available */
+
+               z1 = Read_hfc(cs, HFCSX_FIF_Z1H);
+               z1 = ((z1 << 8) | Read_hfc(cs, HFCSX_FIF_Z1L));
+               z2 = Read_hfc(cs, HFCSX_FIF_Z2H);
+               z2 = ((z2 << 8) | Read_hfc(cs, HFCSX_FIF_Z2L));
+
                if (cs->debug & L1_DEB_ISAC_FIFO)
-                 debugl1(cs, "hfcsx_read_fifo %d crc error", fifo);
-               skb = NULL;
-             }
-           } else {
-             printk(KERN_WARNING "HFC-SX: receive out of memory\n");
-             return(NULL);
-           }
-
-         Read_hfc(cs, HFCSX_FIF_INCF2); /* increment F2 */
-         udelay(1);
-         while (bytein(cs->hw.hfcsx.base+1) & 1); /* wait for busy */
-         udelay(1);
+                       debugl1(cs, "hfcsx_read_fifo %d f1(%x) f2(%x) z1(f2)(%x) z2(f2)(%x)",
+                               fifo, f1, f2, z1, z2);
+               /* now determine bytes in actual FIFO buffer */
+               count = z1 - z2;
+               if (count <= 0)
+                       count += fifo_size;     /* count now contains buffered bytes */
+               count++;
+
+               if (cs->debug & L1_DEB_ISAC_FIFO)
+                       debugl1(cs, "hfcsx_read_fifo %d count %u)",
+                               fifo, count);
+
+               if ((count > fifo_size) || (count < 4)) {
+                       if (cs->debug & L1_DEB_WARN)
+                               debugl1(cs, "hfcsx_read_fifo %d paket inv. len %d ", fifo , count);
+                       while (count) {
+                               count--; /* empty fifo */
+                               Read_hfc(cs, HFCSX_FIF_DRD);
+                       }
+                       skb = NULL;
+               } else
+                       if ((skb = dev_alloc_skb(count - 3))) {
+                               count -= 3;
+                               dst = skb_put(skb, count);
+
+                               while (count--)
+                                       *dst++ = Read_hfc(cs, HFCSX_FIF_DRD);
+
+                               Read_hfc(cs, HFCSX_FIF_DRD); /* CRC 1 */
+                               Read_hfc(cs, HFCSX_FIF_DRD); /* CRC 2 */
+                               if (Read_hfc(cs, HFCSX_FIF_DRD)) {
+                                       dev_kfree_skb_irq(skb);
+                                       if (cs->debug & L1_DEB_ISAC_FIFO)
+                                               debugl1(cs, "hfcsx_read_fifo %d crc error", fifo);
+                                       skb = NULL;
+                               }
+                       } else {
+                               printk(KERN_WARNING "HFC-SX: receive out of memory\n");
+                               return (NULL);
+                       }
+
+               Read_hfc(cs, HFCSX_FIF_INCF2); /* increment F2 */
+               udelay(1);
+               while (bytein(cs->hw.hfcsx.base + 1) & 1); /* wait for busy */
+               udelay(1);
        } while (!skb); /* retry in case of crc error */
-       return(skb);
-} 
+       return (skb);
+}
 
 /******************************************/
 /* free hardware resources used by driver */
@@ -328,17 +328,17 @@ release_io_hfcsx(struct IsdnCardState *cs)
 /**********************************************************/
 static int set_fifo_size(struct IsdnCardState *cs)
 {
-        
-        if (cs->hw.hfcsx.b_fifo_size) return(1); /* already determined */
+
+       if (cs->hw.hfcsx.b_fifo_size) return (1); /* already determined */
 
        if ((cs->hw.hfcsx.chip >> 4) == 9) {
-         cs->hw.hfcsx.b_fifo_size = B_FIFO_SIZE_32K;
-         return(1);
+               cs->hw.hfcsx.b_fifo_size = B_FIFO_SIZE_32K;
+               return (1);
        }
 
-         cs->hw.hfcsx.b_fifo_size = B_FIFO_SIZE_8K;
-         cs->hw.hfcsx.cirm |= 0x10; /* only 8K of ram */
-         return(0);
+       cs->hw.hfcsx.b_fifo_size = B_FIFO_SIZE_8K;
+       cs->hw.hfcsx.cirm |= 0x10; /* only 8K of ram */
+       return (0);
 
 }
 
@@ -354,15 +354,15 @@ reset_hfcsx(struct IsdnCardState *cs)
 
        printk(KERN_INFO "HFC_SX: resetting card\n");
        while (1) {
-         Write_hfc(cs, HFCSX_CIRM, HFCSX_RESET | cs->hw.hfcsx.cirm ); /* Reset */
-         mdelay(30);
-         Write_hfc(cs, HFCSX_CIRM, cs->hw.hfcsx.cirm); /* Reset Off */
-         mdelay(20);
-         if (Read_hfc(cs, HFCSX_STATUS) & 2)
-           printk(KERN_WARNING "HFC-SX init bit busy\n");
-         cs->hw.hfcsx.last_fifo = 0xff; /* invalidate */
-         if (!set_fifo_size(cs)) continue;
-         break;
+               Write_hfc(cs, HFCSX_CIRM, HFCSX_RESET | cs->hw.hfcsx.cirm); /* Reset */
+               mdelay(30);
+               Write_hfc(cs, HFCSX_CIRM, cs->hw.hfcsx.cirm); /* Reset Off */
+               mdelay(20);
+               if (Read_hfc(cs, HFCSX_STATUS) & 2)
+                       printk(KERN_WARNING "HFC-SX init bit busy\n");
+               cs->hw.hfcsx.last_fifo = 0xff; /* invalidate */
+               if (!set_fifo_size(cs)) continue;
+               break;
        }
 
        cs->hw.hfcsx.trm = 0 + HFCSX_BTRANS_THRESMASK;  /* no echo connect , threshold */
@@ -376,8 +376,8 @@ reset_hfcsx(struct IsdnCardState *cs)
        cs->hw.hfcsx.ctmt = HFCSX_TIM3_125 | HFCSX_AUTO_TIMER;
        Write_hfc(cs, HFCSX_CTMT, cs->hw.hfcsx.ctmt);
 
-       cs->hw.hfcsx.int_m1 = HFCSX_INTS_DTRANS | HFCSX_INTS_DREC | 
-           HFCSX_INTS_L1STATE | HFCSX_INTS_TIMER;
+       cs->hw.hfcsx.int_m1 = HFCSX_INTS_DTRANS | HFCSX_INTS_DREC |
+               HFCSX_INTS_L1STATE | HFCSX_INTS_TIMER;
        Write_hfc(cs, HFCSX_INT_M1, cs->hw.hfcsx.int_m1);
 
        /* Clear already pending ints */
@@ -423,8 +423,8 @@ hfcsx_Timer(struct IsdnCardState *cs)
        cs->hw.hfcsx.timer.expires = jiffies + 75;
        /* WD RESET */
 /*      WriteReg(cs, HFCD_DATA, HFCD_CTMT, cs->hw.hfcsx.ctmt | 0x80);
-   add_timer(&cs->hw.hfcsx.timer);
- */
+       add_timer(&cs->hw.hfcsx.timer);
+*/
 }
 
 /************************************************/
@@ -458,11 +458,11 @@ receive_dmsg(struct IsdnCardState *cs)
        }
 
        do {
-         skb = read_fifo(cs, HFCSX_SEL_D_RX, 0);
-         if (skb) {
-           skb_queue_tail(&cs->rq, skb);
-           schedule_event(cs, D_RCVBUFREADY);
-         }
+               skb = read_fifo(cs, HFCSX_SEL_D_RX, 0);
+               if (skb) {
+                       skb_queue_tail(&cs->rq, skb);
+                       schedule_event(cs, D_RCVBUFREADY);
+               }
        } while (--count && skb);
 
        test_and_clear_bit(FLG_LOCK_ATOMIC, &cs->HW_Flags);
@@ -479,20 +479,20 @@ main_rec_hfcsx(struct BCState *bcs)
        int count = 5;
        struct sk_buff *skb;
 
-      Begin:
+Begin:
        count--;
        if (test_and_set_bit(FLG_LOCK_ATOMIC, &cs->HW_Flags)) {
                debugl1(cs, "rec_data %d blocked", bcs->channel);
                return;
        }
-       skb = read_fifo(cs, ((bcs->channel) && (!cs->hw.hfcsx.bswapped)) ? 
+       skb = read_fifo(cs, ((bcs->channel) && (!cs->hw.hfcsx.bswapped)) ?
                        HFCSX_SEL_B2_RX : HFCSX_SEL_B1_RX,
-                       (bcs->mode == L1_MODE_TRANS) ? 
+                       (bcs->mode == L1_MODE_TRANS) ?
                        HFCSX_BTRANS_THRESHOLD : 0);
 
        if (skb) {
-         skb_queue_tail(&bcs->rqueue, skb);
-         schedule_event(bcs, B_RCVBUFREADY);
+               skb_queue_tail(&bcs->rqueue, skb);
+               schedule_event(bcs, B_RCVBUFREADY);
        }
 
        test_and_clear_bit(FLG_LOCK_ATOMIC, &cs->HW_Flags);
@@ -513,8 +513,8 @@ hfcsx_fill_dfifo(struct IsdnCardState *cs)
                return;
 
        if (write_fifo(cs, cs->tx_skb, HFCSX_SEL_D_TX, 0)) {
-         dev_kfree_skb_any(cs->tx_skb);
-         cs->tx_skb = NULL;
+               dev_kfree_skb_any(cs->tx_skb);
+               cs->tx_skb = NULL;
        }
        return;
 }
@@ -532,24 +532,24 @@ hfcsx_fill_fifo(struct BCState *bcs)
        if (bcs->tx_skb->len <= 0)
                return;
 
-       if (write_fifo(cs, bcs->tx_skb, 
-                      ((bcs->channel) && (!cs->hw.hfcsx.bswapped)) ? 
+       if (write_fifo(cs, bcs->tx_skb,
+                      ((bcs->channel) && (!cs->hw.hfcsx.bswapped)) ?
                       HFCSX_SEL_B2_TX : HFCSX_SEL_B1_TX,
-                      (bcs->mode == L1_MODE_TRANS) ? 
+                      (bcs->mode == L1_MODE_TRANS) ?
                       HFCSX_BTRANS_THRESHOLD : 0)) {
 
-         bcs->tx_cnt -= bcs->tx_skb->len;
-         if (test_bit(FLG_LLI_L1WAKEUP,&bcs->st->lli.flag) &&
-               (PACKET_NOACK != bcs->tx_skb->pkt_type)) {
-               u_long  flags;
-               spin_lock_irqsave(&bcs->aclock, flags);
-               bcs->ackcnt += bcs->tx_skb->len;
-               spin_unlock_irqrestore(&bcs->aclock, flags);
-               schedule_event(bcs, B_ACKPENDING);
-         }
-         dev_kfree_skb_any(bcs->tx_skb);
-         bcs->tx_skb = NULL;
-         test_and_clear_bit(BC_FLG_BUSY, &bcs->Flag);
+               bcs->tx_cnt -= bcs->tx_skb->len;
+               if (test_bit(FLG_LLI_L1WAKEUP, &bcs->st->lli.flag) &&
+                   (PACKET_NOACK != bcs->tx_skb->pkt_type)) {
+                       u_long  flags;
+                       spin_lock_irqsave(&bcs->aclock, flags);
+                       bcs->ackcnt += bcs->tx_skb->len;
+                       spin_unlock_irqrestore(&bcs->aclock, flags);
+                       schedule_event(bcs, B_ACKPENDING);
+               }
+               dev_kfree_skb_any(bcs->tx_skb);
+               bcs->tx_skb = NULL;
+               test_and_clear_bit(BC_FLG_BUSY, &bcs->Flag);
        }
 }
 
@@ -562,27 +562,27 @@ dch_nt_l2l1(struct PStack *st, int pr, void *arg)
        struct IsdnCardState *cs = (struct IsdnCardState *) st->l1.hardware;
 
        switch (pr) {
-               case (PH_DATA | REQUEST):
-               case (PH_PULL | REQUEST):
-               case (PH_PULL | INDICATION):
-                       st->l1.l1hw(st, pr, arg);
-                       break;
-               case (PH_ACTIVATE | REQUEST):
-                       st->l1.l1l2(st, PH_ACTIVATE | CONFIRM, NULL);
-                       break;
-               case (PH_TESTLOOP | REQUEST):
-                       if (1 & (long) arg)
-                               debugl1(cs, "PH_TEST_LOOP B1");
-                       if (2 & (long) arg)
-                               debugl1(cs, "PH_TEST_LOOP B2");
-                       if (!(3 & (long) arg))
-                               debugl1(cs, "PH_TEST_LOOP DISABLED");
-                       st->l1.l1hw(st, HW_TESTLOOP | REQUEST, arg);
-                       break;
-               default:
-                       if (cs->debug)
-                               debugl1(cs, "dch_nt_l2l1 msg %04X unhandled", pr);
-                       break;
+       case (PH_DATA | REQUEST):
+       case (PH_PULL | REQUEST):
+       case (PH_PULL | INDICATION):
+               st->l1.l1hw(st, pr, arg);
+               break;
+       case (PH_ACTIVATE | REQUEST):
+               st->l1.l1l2(st, PH_ACTIVATE | CONFIRM, NULL);
+               break;
+       case (PH_TESTLOOP | REQUEST):
+               if (1 & (long) arg)
+                       debugl1(cs, "PH_TEST_LOOP B1");
+               if (2 & (long) arg)
+                       debugl1(cs, "PH_TEST_LOOP B2");
+               if (!(3 & (long) arg))
+                       debugl1(cs, "PH_TEST_LOOP DISABLED");
+               st->l1.l1hw(st, HW_TESTLOOP | REQUEST, arg);
+               break;
+       default:
+               if (cs->debug)
+                       debugl1(cs, "dch_nt_l2l1 msg %04X unhandled", pr);
+               break;
        }
 }
 
@@ -592,14 +592,14 @@ dch_nt_l2l1(struct PStack *st, int pr, void *arg)
 /* set/reset echo mode */
 /***********************/
 static int
-hfcsx_auxcmd(struct IsdnCardState *cs, isdn_ctrl * ic)
+hfcsx_auxcmd(struct IsdnCardState *cs, isdn_ctrl *ic)
 {
        unsigned long flags;
        int i = *(unsigned int *) ic->parm.num;
 
        if ((ic->arg == 98) &&
            (!(cs->hw.hfcsx.int_m1 & (HFCSX_INTS_B2TRANS + HFCSX_INTS_B2REC + HFCSX_INTS_B1TRANS + HFCSX_INTS_B1REC)))) {
-               spin_lock_irqsave(&cs->lock, flags);
+               spin_lock_irqsave(&cs->lock, flags);
                Write_hfc(cs, HFCSX_STATES, HFCSX_LOAD_STATE | 0);      /* HFC ST G0 */
                udelay(10);
                cs->hw.hfcsx.sctrl |= SCTRL_MODE_NT;
@@ -660,26 +660,26 @@ receive_emsg(struct IsdnCardState *cs)
                return;
        }
        do {
-         skb = read_fifo(cs, HFCSX_SEL_B2_RX, 0);
-         if (skb) {
-           if (cs->debug & DEB_DLOG_HEX) {
-             ptr = cs->dlog;
-             if ((skb->len) < MAX_DLOG_SPACE / 3 - 10) {
-               *ptr++ = 'E';
-               *ptr++ = 'C';
-               *ptr++ = 'H';
-               *ptr++ = 'O';
-               *ptr++ = ':';
-               ptr += QuickHex(ptr, skb->data, skb->len);
-               ptr--;
-               *ptr++ = '\n';
-               *ptr = 0;
-               HiSax_putstatus(cs, NULL, cs->dlog);
-             } else
-               HiSax_putstatus(cs, "LogEcho: ", "warning Frame too big (%d)", skb->len);
-           }
-           dev_kfree_skb_any(skb);
-         }
+               skb = read_fifo(cs, HFCSX_SEL_B2_RX, 0);
+               if (skb) {
+                       if (cs->debug & DEB_DLOG_HEX) {
+                               ptr = cs->dlog;
+                               if ((skb->len) < MAX_DLOG_SPACE / 3 - 10) {
+                                       *ptr++ = 'E';
+                                       *ptr++ = 'C';
+                                       *ptr++ = 'H';
+                                       *ptr++ = 'O';
+                                       *ptr++ = ':';
+                                       ptr += QuickHex(ptr, skb->data, skb->len);
+                                       ptr--;
+                                       *ptr++ = '\n';
+                                       *ptr = 0;
+                                       HiSax_putstatus(cs, NULL, cs->dlog);
+                               } else
+                                       HiSax_putstatus(cs, "LogEcho: ", "warning Frame too big (%d)", skb->len);
+                       }
+                       dev_kfree_skb_any(skb);
+               }
        } while (--count && skb);
 
        test_and_clear_bit(FLG_LOCK_ATOMIC, &cs->HW_Flags);
@@ -843,7 +843,7 @@ hfcsx_interrupt(int intno, void *dev_id)
                        } else
                                schedule_event(cs, D_XMTBUFREADY);
                }
-             afterXPR:
+       afterXPR:
                if (cs->hw.hfcsx.int_s1 && count--) {
                        val = cs->hw.hfcsx.int_s1;
                        cs->hw.hfcsx.int_s1 = 0;
@@ -875,128 +875,128 @@ HFCSX_l1hw(struct PStack *st, int pr, void *arg)
        u_long flags;
 
        switch (pr) {
-               case (PH_DATA | REQUEST):
-                       if (cs->debug & DEB_DLOG_HEX)
-                               LogFrame(cs, skb->data, skb->len);
-                       if (cs->debug & DEB_DLOG_VERBOSE)
-                               dlogframe(cs, skb, 0);
-                       spin_lock_irqsave(&cs->lock, flags);
-                       if (cs->tx_skb) {
-                               skb_queue_tail(&cs->sq, skb);
-#ifdef L2FRAME_DEBUG           /* psa */
-                               if (cs->debug & L1_DEB_LAPD)
-                                       Logl2Frame(cs, skb, "PH_DATA Queued", 0);
-#endif
-                       } else {
-                               cs->tx_skb = skb;
-                               cs->tx_cnt = 0;
+       case (PH_DATA | REQUEST):
+               if (cs->debug & DEB_DLOG_HEX)
+                       LogFrame(cs, skb->data, skb->len);
+               if (cs->debug & DEB_DLOG_VERBOSE)
+                       dlogframe(cs, skb, 0);
+               spin_lock_irqsave(&cs->lock, flags);
+               if (cs->tx_skb) {
+                       skb_queue_tail(&cs->sq, skb);
 #ifdef L2FRAME_DEBUG           /* psa */
-                               if (cs->debug & L1_DEB_LAPD)
-                                       Logl2Frame(cs, skb, "PH_DATA", 0);
+                       if (cs->debug & L1_DEB_LAPD)
+                               Logl2Frame(cs, skb, "PH_DATA Queued", 0);
 #endif
-                               if (!test_and_set_bit(FLG_LOCK_ATOMIC, &cs->HW_Flags)) {
-                                       hfcsx_fill_dfifo(cs); 
-                                       test_and_clear_bit(FLG_LOCK_ATOMIC, &cs->HW_Flags);
-                               } else
-                                       debugl1(cs, "hfcsx_fill_dfifo blocked");
-
-                       }
-                       spin_unlock_irqrestore(&cs->lock, flags);
-                       break;
-               case (PH_PULL | INDICATION):
-                       spin_lock_irqsave(&cs->lock, flags);
-                       if (cs->tx_skb) {
-                               if (cs->debug & L1_DEB_WARN)
-                                       debugl1(cs, " l2l1 tx_skb exist this shouldn't happen");
-                               skb_queue_tail(&cs->sq, skb);
-                               spin_unlock_irqrestore(&cs->lock, flags);
-                               break;
-                       }
-                       if (cs->debug & DEB_DLOG_HEX)
-                               LogFrame(cs, skb->data, skb->len);
-                       if (cs->debug & DEB_DLOG_VERBOSE)
-                               dlogframe(cs, skb, 0);
+               } else {
                        cs->tx_skb = skb;
                        cs->tx_cnt = 0;
 #ifdef L2FRAME_DEBUG           /* psa */
                        if (cs->debug & L1_DEB_LAPD)
-                               Logl2Frame(cs, skb, "PH_DATA_PULLED", 0);
+                               Logl2Frame(cs, skb, "PH_DATA", 0);
 #endif
                        if (!test_and_set_bit(FLG_LOCK_ATOMIC, &cs->HW_Flags)) {
-                               hfcsx_fill_dfifo(cs); 
+                               hfcsx_fill_dfifo(cs);
                                test_and_clear_bit(FLG_LOCK_ATOMIC, &cs->HW_Flags);
                        } else
                                debugl1(cs, "hfcsx_fill_dfifo blocked");
+
+               }
+               spin_unlock_irqrestore(&cs->lock, flags);
+               break;
+       case (PH_PULL | INDICATION):
+               spin_lock_irqsave(&cs->lock, flags);
+               if (cs->tx_skb) {
+                       if (cs->debug & L1_DEB_WARN)
+                               debugl1(cs, " l2l1 tx_skb exist this shouldn't happen");
+                       skb_queue_tail(&cs->sq, skb);
                        spin_unlock_irqrestore(&cs->lock, flags);
                        break;
-               case (PH_PULL | REQUEST):
+               }
+               if (cs->debug & DEB_DLOG_HEX)
+                       LogFrame(cs, skb->data, skb->len);
+               if (cs->debug & DEB_DLOG_VERBOSE)
+                       dlogframe(cs, skb, 0);
+               cs->tx_skb = skb;
+               cs->tx_cnt = 0;
 #ifdef L2FRAME_DEBUG           /* psa */
-                       if (cs->debug & L1_DEB_LAPD)
-                               debugl1(cs, "-> PH_REQUEST_PULL");
+               if (cs->debug & L1_DEB_LAPD)
+                       Logl2Frame(cs, skb, "PH_DATA_PULLED", 0);
 #endif
-                       if (!cs->tx_skb) {
-                               test_and_clear_bit(FLG_L1_PULL_REQ, &st->l1.Flags);
-                               st->l1.l1l2(st, PH_PULL | CONFIRM, NULL);
-                       } else
-                               test_and_set_bit(FLG_L1_PULL_REQ, &st->l1.Flags);
-                       break;
-               case (HW_RESET | REQUEST):
-                       spin_lock_irqsave(&cs->lock, flags);
-                       Write_hfc(cs, HFCSX_STATES, HFCSX_LOAD_STATE | 3);      /* HFC ST 3 */
-                       udelay(6);
-                       Write_hfc(cs, HFCSX_STATES, 3); /* HFC ST 2 */
-                       cs->hw.hfcsx.mst_m |= HFCSX_MASTER;
-                       Write_hfc(cs, HFCSX_MST_MODE, cs->hw.hfcsx.mst_m);
-                       Write_hfc(cs, HFCSX_STATES, HFCSX_ACTIVATE | HFCSX_DO_ACTION);
-                       spin_unlock_irqrestore(&cs->lock, flags);
-                       l1_msg(cs, HW_POWERUP | CONFIRM, NULL);
-                       break;
-               case (HW_ENABLE | REQUEST):
-                       spin_lock_irqsave(&cs->lock, flags);
-                       Write_hfc(cs, HFCSX_STATES, HFCSX_ACTIVATE | HFCSX_DO_ACTION);
-                       spin_unlock_irqrestore(&cs->lock, flags);
-                       break;
-               case (HW_DEACTIVATE | REQUEST):
-                       spin_lock_irqsave(&cs->lock, flags);
-                       cs->hw.hfcsx.mst_m &= ~HFCSX_MASTER;
-                       Write_hfc(cs, HFCSX_MST_MODE, cs->hw.hfcsx.mst_m);
-                       spin_unlock_irqrestore(&cs->lock, flags);
-                       break;
-               case (HW_INFO3 | REQUEST):
-                       spin_lock_irqsave(&cs->lock, flags);
-                       cs->hw.hfcsx.mst_m |= HFCSX_MASTER;
-                       Write_hfc(cs, HFCSX_MST_MODE, cs->hw.hfcsx.mst_m);
-                       spin_unlock_irqrestore(&cs->lock, flags);
+               if (!test_and_set_bit(FLG_LOCK_ATOMIC, &cs->HW_Flags)) {
+                       hfcsx_fill_dfifo(cs);
+                       test_and_clear_bit(FLG_LOCK_ATOMIC, &cs->HW_Flags);
+               } else
+                       debugl1(cs, "hfcsx_fill_dfifo blocked");
+               spin_unlock_irqrestore(&cs->lock, flags);
+               break;
+       case (PH_PULL | REQUEST):
+#ifdef L2FRAME_DEBUG           /* psa */
+               if (cs->debug & L1_DEB_LAPD)
+                       debugl1(cs, "-> PH_REQUEST_PULL");
+#endif
+               if (!cs->tx_skb) {
+                       test_and_clear_bit(FLG_L1_PULL_REQ, &st->l1.Flags);
+                       st->l1.l1l2(st, PH_PULL | CONFIRM, NULL);
+               } else
+                       test_and_set_bit(FLG_L1_PULL_REQ, &st->l1.Flags);
+               break;
+       case (HW_RESET | REQUEST):
+               spin_lock_irqsave(&cs->lock, flags);
+               Write_hfc(cs, HFCSX_STATES, HFCSX_LOAD_STATE | 3);      /* HFC ST 3 */
+               udelay(6);
+               Write_hfc(cs, HFCSX_STATES, 3); /* HFC ST 2 */
+               cs->hw.hfcsx.mst_m |= HFCSX_MASTER;
+               Write_hfc(cs, HFCSX_MST_MODE, cs->hw.hfcsx.mst_m);
+               Write_hfc(cs, HFCSX_STATES, HFCSX_ACTIVATE | HFCSX_DO_ACTION);
+               spin_unlock_irqrestore(&cs->lock, flags);
+               l1_msg(cs, HW_POWERUP | CONFIRM, NULL);
+               break;
+       case (HW_ENABLE | REQUEST):
+               spin_lock_irqsave(&cs->lock, flags);
+               Write_hfc(cs, HFCSX_STATES, HFCSX_ACTIVATE | HFCSX_DO_ACTION);
+               spin_unlock_irqrestore(&cs->lock, flags);
+               break;
+       case (HW_DEACTIVATE | REQUEST):
+               spin_lock_irqsave(&cs->lock, flags);
+               cs->hw.hfcsx.mst_m &= ~HFCSX_MASTER;
+               Write_hfc(cs, HFCSX_MST_MODE, cs->hw.hfcsx.mst_m);
+               spin_unlock_irqrestore(&cs->lock, flags);
+               break;
+       case (HW_INFO3 | REQUEST):
+               spin_lock_irqsave(&cs->lock, flags);
+               cs->hw.hfcsx.mst_m |= HFCSX_MASTER;
+               Write_hfc(cs, HFCSX_MST_MODE, cs->hw.hfcsx.mst_m);
+               spin_unlock_irqrestore(&cs->lock, flags);
+               break;
+       case (HW_TESTLOOP | REQUEST):
+               spin_lock_irqsave(&cs->lock, flags);
+               switch ((long) arg) {
+               case (1):
+                       Write_hfc(cs, HFCSX_B1_SSL, 0x80);      /* tx slot */
+                       Write_hfc(cs, HFCSX_B1_RSL, 0x80);      /* rx slot */
+                       cs->hw.hfcsx.conn = (cs->hw.hfcsx.conn & ~7) | 1;
+                       Write_hfc(cs, HFCSX_CONNECT, cs->hw.hfcsx.conn);
                        break;
-               case (HW_TESTLOOP | REQUEST):
-                       spin_lock_irqsave(&cs->lock, flags);
-                       switch ((long) arg) {
-                               case (1):
-                                       Write_hfc(cs, HFCSX_B1_SSL, 0x80);      /* tx slot */
-                                       Write_hfc(cs, HFCSX_B1_RSL, 0x80);      /* rx slot */
-                                       cs->hw.hfcsx.conn = (cs->hw.hfcsx.conn & ~7) | 1;
-                                       Write_hfc(cs, HFCSX_CONNECT, cs->hw.hfcsx.conn);
-                                       break;
-                               case (2):
-                                       Write_hfc(cs, HFCSX_B2_SSL, 0x81);      /* tx slot */
-                                       Write_hfc(cs, HFCSX_B2_RSL, 0x81);      /* rx slot */
-                                       cs->hw.hfcsx.conn = (cs->hw.hfcsx.conn & ~0x38) | 0x08;
-                                       Write_hfc(cs, HFCSX_CONNECT, cs->hw.hfcsx.conn);
-                                       break;
-                               default:
-                                       spin_unlock_irqrestore(&cs->lock, flags);
-                                       if (cs->debug & L1_DEB_WARN)
-                                               debugl1(cs, "hfcsx_l1hw loop invalid %4lx", (unsigned long)arg);
-                                       return;
-                       }
-                       cs->hw.hfcsx.trm |= 0x80;       /* enable IOM-loop */
-                       Write_hfc(cs, HFCSX_TRM, cs->hw.hfcsx.trm);
-                       spin_unlock_irqrestore(&cs->lock, flags);
+               case (2):
+                       Write_hfc(cs, HFCSX_B2_SSL, 0x81);      /* tx slot */
+                       Write_hfc(cs, HFCSX_B2_RSL, 0x81);      /* rx slot */
+                       cs->hw.hfcsx.conn = (cs->hw.hfcsx.conn & ~0x38) | 0x08;
+                       Write_hfc(cs, HFCSX_CONNECT, cs->hw.hfcsx.conn);
                        break;
                default:
+                       spin_unlock_irqrestore(&cs->lock, flags);
                        if (cs->debug & L1_DEB_WARN)
-                               debugl1(cs, "hfcsx_l1hw unknown pr %4x", pr);
-                       break;
+                               debugl1(cs, "hfcsx_l1hw loop invalid %4lx", (unsigned long)arg);
+                       return;
+               }
+               cs->hw.hfcsx.trm |= 0x80;       /* enable IOM-loop */
+               Write_hfc(cs, HFCSX_TRM, cs->hw.hfcsx.trm);
+               spin_unlock_irqrestore(&cs->lock, flags);
+               break;
+       default:
+               if (cs->debug & L1_DEB_WARN)
+                       debugl1(cs, "hfcsx_l1hw unknown pr %4x", pr);
+               break;
        }
 }
 
@@ -1018,7 +1018,7 @@ hfcsx_send_data(struct BCState *bcs)
        struct IsdnCardState *cs = bcs->cs;
 
        if (!test_and_set_bit(FLG_LOCK_ATOMIC, &cs->HW_Flags)) {
-         hfcsx_fill_fifo(bcs);
+               hfcsx_fill_fifo(bcs);
                test_and_clear_bit(FLG_LOCK_ATOMIC, &cs->HW_Flags);
        } else
                debugl1(cs, "send_data %d blocked", bcs->channel);
@@ -1058,69 +1058,69 @@ mode_hfcsx(struct BCState *bcs, int mode, int bc)
                }
        }
        switch (mode) {
-               case (L1_MODE_NULL):
-                       if (bc) {
-                               cs->hw.hfcsx.sctrl &= ~SCTRL_B2_ENA;
-                               cs->hw.hfcsx.sctrl_r &= ~SCTRL_B2_ENA;
-                       } else {
-                               cs->hw.hfcsx.sctrl &= ~SCTRL_B1_ENA;
-                               cs->hw.hfcsx.sctrl_r &= ~SCTRL_B1_ENA;
-                       }
-                       if (fifo2) {
-                               cs->hw.hfcsx.int_m1 &= ~(HFCSX_INTS_B2TRANS + HFCSX_INTS_B2REC);
-                       } else {
-                               cs->hw.hfcsx.int_m1 &= ~(HFCSX_INTS_B1TRANS + HFCSX_INTS_B1REC);
-                       }
-                       break;
-               case (L1_MODE_TRANS):
-                       if (bc) {
-                               cs->hw.hfcsx.sctrl |= SCTRL_B2_ENA;
-                               cs->hw.hfcsx.sctrl_r |= SCTRL_B2_ENA;
-                       } else {
-                               cs->hw.hfcsx.sctrl |= SCTRL_B1_ENA;
-                               cs->hw.hfcsx.sctrl_r |= SCTRL_B1_ENA;
-                       }
-                       if (fifo2) {
-                               cs->hw.hfcsx.int_m1 |= (HFCSX_INTS_B2TRANS + HFCSX_INTS_B2REC);
-                               cs->hw.hfcsx.ctmt |= 2;
-                               cs->hw.hfcsx.conn &= ~0x18;
-                       } else {
-                               cs->hw.hfcsx.int_m1 |= (HFCSX_INTS_B1TRANS + HFCSX_INTS_B1REC);
-                               cs->hw.hfcsx.ctmt |= 1;
-                               cs->hw.hfcsx.conn &= ~0x03;
-                       }
-                       break;
-               case (L1_MODE_HDLC):
-                       if (bc) {
-                               cs->hw.hfcsx.sctrl |= SCTRL_B2_ENA;
-                               cs->hw.hfcsx.sctrl_r |= SCTRL_B2_ENA;
-                       } else {
-                               cs->hw.hfcsx.sctrl |= SCTRL_B1_ENA;
-                               cs->hw.hfcsx.sctrl_r |= SCTRL_B1_ENA;
-                       }
-                       if (fifo2) {
-                               cs->hw.hfcsx.int_m1 |= (HFCSX_INTS_B2TRANS + HFCSX_INTS_B2REC);
-                               cs->hw.hfcsx.ctmt &= ~2;
-                               cs->hw.hfcsx.conn &= ~0x18;
-                       } else {
-                               cs->hw.hfcsx.int_m1 |= (HFCSX_INTS_B1TRANS + HFCSX_INTS_B1REC);
-                               cs->hw.hfcsx.ctmt &= ~1;
-                               cs->hw.hfcsx.conn &= ~0x03;
-                       }
-                       break;
-               case (L1_MODE_EXTRN):
-                       if (bc) {
-                               cs->hw.hfcsx.conn |= 0x10;
-                               cs->hw.hfcsx.sctrl |= SCTRL_B2_ENA;
-                               cs->hw.hfcsx.sctrl_r |= SCTRL_B2_ENA;
-                               cs->hw.hfcsx.int_m1 &= ~(HFCSX_INTS_B2TRANS + HFCSX_INTS_B2REC);
-                       } else {
-                               cs->hw.hfcsx.conn |= 0x02;
-                               cs->hw.hfcsx.sctrl |= SCTRL_B1_ENA;
-                               cs->hw.hfcsx.sctrl_r |= SCTRL_B1_ENA;
-                               cs->hw.hfcsx.int_m1 &= ~(HFCSX_INTS_B1TRANS + HFCSX_INTS_B1REC);
-                       }
-                       break;
+       case (L1_MODE_NULL):
+               if (bc) {
+                       cs->hw.hfcsx.sctrl &= ~SCTRL_B2_ENA;
+                       cs->hw.hfcsx.sctrl_r &= ~SCTRL_B2_ENA;
+               } else {
+                       cs->hw.hfcsx.sctrl &= ~SCTRL_B1_ENA;
+                       cs->hw.hfcsx.sctrl_r &= ~SCTRL_B1_ENA;
+               }
+               if (fifo2) {
+                       cs->hw.hfcsx.int_m1 &= ~(HFCSX_INTS_B2TRANS + HFCSX_INTS_B2REC);
+               } else {
+                       cs->hw.hfcsx.int_m1 &= ~(HFCSX_INTS_B1TRANS + HFCSX_INTS_B1REC);
+               }
+               break;
+       case (L1_MODE_TRANS):
+               if (bc) {
+                       cs->hw.hfcsx.sctrl |= SCTRL_B2_ENA;
+                       cs->hw.hfcsx.sctrl_r |= SCTRL_B2_ENA;
+               } else {
+                       cs->hw.hfcsx.sctrl |= SCTRL_B1_ENA;
+                       cs->hw.hfcsx.sctrl_r |= SCTRL_B1_ENA;
+               }
+               if (fifo2) {
+                       cs->hw.hfcsx.int_m1 |= (HFCSX_INTS_B2TRANS + HFCSX_INTS_B2REC);
+                       cs->hw.hfcsx.ctmt |= 2;
+                       cs->hw.hfcsx.conn &= ~0x18;
+               } else {
+                       cs->hw.hfcsx.int_m1 |= (HFCSX_INTS_B1TRANS + HFCSX_INTS_B1REC);
+                       cs->hw.hfcsx.ctmt |= 1;
+                       cs->hw.hfcsx.conn &= ~0x03;
+               }
+               break;
+       case (L1_MODE_HDLC):
+               if (bc) {
+                       cs->hw.hfcsx.sctrl |= SCTRL_B2_ENA;
+                       cs->hw.hfcsx.sctrl_r |= SCTRL_B2_ENA;
+               } else {
+                       cs->hw.hfcsx.sctrl |= SCTRL_B1_ENA;
+                       cs->hw.hfcsx.sctrl_r |= SCTRL_B1_ENA;
+               }
+               if (fifo2) {
+                       cs->hw.hfcsx.int_m1 |= (HFCSX_INTS_B2TRANS + HFCSX_INTS_B2REC);
+                       cs->hw.hfcsx.ctmt &= ~2;
+                       cs->hw.hfcsx.conn &= ~0x18;
+               } else {
+                       cs->hw.hfcsx.int_m1 |= (HFCSX_INTS_B1TRANS + HFCSX_INTS_B1REC);
+                       cs->hw.hfcsx.ctmt &= ~1;
+                       cs->hw.hfcsx.conn &= ~0x03;
+               }
+               break;
+       case (L1_MODE_EXTRN):
+               if (bc) {
+                       cs->hw.hfcsx.conn |= 0x10;
+                       cs->hw.hfcsx.sctrl |= SCTRL_B2_ENA;
+                       cs->hw.hfcsx.sctrl_r |= SCTRL_B2_ENA;
+                       cs->hw.hfcsx.int_m1 &= ~(HFCSX_INTS_B2TRANS + HFCSX_INTS_B2REC);
+               } else {
+                       cs->hw.hfcsx.conn |= 0x02;
+                       cs->hw.hfcsx.sctrl |= SCTRL_B1_ENA;
+                       cs->hw.hfcsx.sctrl_r |= SCTRL_B1_ENA;
+                       cs->hw.hfcsx.int_m1 &= ~(HFCSX_INTS_B1TRANS + HFCSX_INTS_B1REC);
+               }
+               break;
        }
        Write_hfc(cs, HFCSX_SCTRL_E, cs->hw.hfcsx.sctrl_e);
        Write_hfc(cs, HFCSX_INT_M1, cs->hw.hfcsx.int_m1);
@@ -1129,8 +1129,8 @@ mode_hfcsx(struct BCState *bcs, int mode, int bc)
        Write_hfc(cs, HFCSX_CTMT, cs->hw.hfcsx.ctmt);
        Write_hfc(cs, HFCSX_CONNECT, cs->hw.hfcsx.conn);
        if (mode != L1_MODE_EXTRN) {
-         reset_fifo(cs, fifo2 ? HFCSX_SEL_B2_RX : HFCSX_SEL_B1_RX);
-         reset_fifo(cs, fifo2 ? HFCSX_SEL_B2_TX : HFCSX_SEL_B1_TX);
+               reset_fifo(cs, fifo2 ? HFCSX_SEL_B2_RX : HFCSX_SEL_B1_RX);
+               reset_fifo(cs, fifo2 ? HFCSX_SEL_B2_TX : HFCSX_SEL_B1_TX);
        }
 }
 
@@ -1145,53 +1145,53 @@ hfcsx_l2l1(struct PStack *st, int pr, void *arg)
        u_long flags;
 
        switch (pr) {
-               case (PH_DATA | REQUEST):
-                       spin_lock_irqsave(&bcs->cs->lock, flags);
-                       if (bcs->tx_skb) {
-                               skb_queue_tail(&bcs->squeue, skb);
-                       } else {
-                               bcs->tx_skb = skb;
+       case (PH_DATA | REQUEST):
+               spin_lock_irqsave(&bcs->cs->lock, flags);
+               if (bcs->tx_skb) {
+                       skb_queue_tail(&bcs->squeue, skb);
+               } else {
+                       bcs->tx_skb = skb;
 //                              test_and_set_bit(BC_FLG_BUSY, &bcs->Flag);
-                               bcs->cs->BC_Send_Data(bcs);
-                       }
-                       spin_unlock_irqrestore(&bcs->cs->lock, flags);
-                       break;
-               case (PH_PULL | INDICATION):
-                       spin_lock_irqsave(&bcs->cs->lock, flags);
-                       if (bcs->tx_skb) {
-                               printk(KERN_WARNING "hfc_l2l1: this shouldn't happen\n");
-                       } else {
+                       bcs->cs->BC_Send_Data(bcs);
+               }
+               spin_unlock_irqrestore(&bcs->cs->lock, flags);
+               break;
+       case (PH_PULL | INDICATION):
+               spin_lock_irqsave(&bcs->cs->lock, flags);
+               if (bcs->tx_skb) {
+                       printk(KERN_WARNING "hfc_l2l1: this shouldn't happen\n");
+               } else {
 //                             test_and_set_bit(BC_FLG_BUSY, &bcs->Flag);
-                               bcs->tx_skb = skb;
-                               bcs->cs->BC_Send_Data(bcs);
-                       }
-                       spin_unlock_irqrestore(&bcs->cs->lock, flags);
-                       break;
-               case (PH_PULL | REQUEST):
-                       if (!bcs->tx_skb) {
-                               test_and_clear_bit(FLG_L1_PULL_REQ, &st->l1.Flags);
-                               st->l1.l1l2(st, PH_PULL | CONFIRM, NULL);
-                       } else
-                               test_and_set_bit(FLG_L1_PULL_REQ, &st->l1.Flags);
-                       break;
-               case (PH_ACTIVATE | REQUEST):
-                       spin_lock_irqsave(&bcs->cs->lock, flags);
-                       test_and_set_bit(BC_FLG_ACTIV, &bcs->Flag);
-                       mode_hfcsx(bcs, st->l1.mode, st->l1.bc);
-                       spin_unlock_irqrestore(&bcs->cs->lock, flags);
-                       l1_msg_b(st, pr, arg);
-                       break;
-               case (PH_DEACTIVATE | REQUEST):
-                       l1_msg_b(st, pr, arg);
-                       break;
-               case (PH_DEACTIVATE | CONFIRM):
-                       spin_lock_irqsave(&bcs->cs->lock, flags);
-                       test_and_clear_bit(BC_FLG_ACTIV, &bcs->Flag);
-                       test_and_clear_bit(BC_FLG_BUSY, &bcs->Flag);
-                       mode_hfcsx(bcs, 0, st->l1.bc);
-                       spin_unlock_irqrestore(&bcs->cs->lock, flags);
-                       st->l1.l1l2(st, PH_DEACTIVATE | CONFIRM, NULL);
-                       break;
+                       bcs->tx_skb = skb;
+                       bcs->cs->BC_Send_Data(bcs);
+               }
+               spin_unlock_irqrestore(&bcs->cs->lock, flags);
+               break;
+       case (PH_PULL | REQUEST):
+               if (!bcs->tx_skb) {
+                       test_and_clear_bit(FLG_L1_PULL_REQ, &st->l1.Flags);
+                       st->l1.l1l2(st, PH_PULL | CONFIRM, NULL);
+               } else
+                       test_and_set_bit(FLG_L1_PULL_REQ, &st->l1.Flags);
+               break;
+       case (PH_ACTIVATE | REQUEST):
+               spin_lock_irqsave(&bcs->cs->lock, flags);
+               test_and_set_bit(BC_FLG_ACTIV, &bcs->Flag);
+               mode_hfcsx(bcs, st->l1.mode, st->l1.bc);
+               spin_unlock_irqrestore(&bcs->cs->lock, flags);
+               l1_msg_b(st, pr, arg);
+               break;
+       case (PH_DEACTIVATE | REQUEST):
+               l1_msg_b(st, pr, arg);
+               break;
+       case (PH_DEACTIVATE | CONFIRM):
+               spin_lock_irqsave(&bcs->cs->lock, flags);
+               test_and_clear_bit(BC_FLG_ACTIV, &bcs->Flag);
+               test_and_clear_bit(BC_FLG_BUSY, &bcs->Flag);
+               mode_hfcsx(bcs, 0, st->l1.bc);
+               spin_unlock_irqrestore(&bcs->cs->lock, flags);
+               st->l1.l1l2(st, PH_DEACTIVATE | CONFIRM, NULL);
+               break;
        }
 }
 
@@ -1260,61 +1260,61 @@ hfcsx_bh(struct work_struct *work)
        if (test_and_clear_bit(D_L1STATECHANGE, &cs->event)) {
                if (!cs->hw.hfcsx.nt_mode)
                        switch (cs->dc.hfcsx.ph_state) {
-                               case (0):
-                                       l1_msg(cs, HW_RESET | INDICATION, NULL);
-                                       break;
-                               case (3):
-                                       l1_msg(cs, HW_DEACTIVATE | INDICATION, NULL);
-                                       break;
-                               case (8):
-                                       l1_msg(cs, HW_RSYNC | INDICATION, NULL);
-                                       break;
-                               case (6):
-                                       l1_msg(cs, HW_INFO2 | INDICATION, NULL);
-                                       break;
-                               case (7):
-                                       l1_msg(cs, HW_INFO4_P8 | INDICATION, NULL);
-                                       break;
-                               default:
-                                       break;
-               } else {
+                       case (0):
+                               l1_msg(cs, HW_RESET | INDICATION, NULL);
+                               break;
+                       case (3):
+                               l1_msg(cs, HW_DEACTIVATE | INDICATION, NULL);
+                               break;
+                       case (8):
+                               l1_msg(cs, HW_RSYNC | INDICATION, NULL);
+                               break;
+                       case (6):
+                               l1_msg(cs, HW_INFO2 | INDICATION, NULL);
+                               break;
+                       case (7):
+                               l1_msg(cs, HW_INFO4_P8 | INDICATION, NULL);
+                               break;
+                       default:
+                               break;
+                       } else {
                        switch (cs->dc.hfcsx.ph_state) {
-                               case (2):
-                                       spin_lock_irqsave(&cs->lock, flags);
-                                       if (cs->hw.hfcsx.nt_timer < 0) {
-                                               cs->hw.hfcsx.nt_timer = 0;
-                                               cs->hw.hfcsx.int_m1 &= ~HFCSX_INTS_TIMER;
-                                               Write_hfc(cs, HFCSX_INT_M1, cs->hw.hfcsx.int_m1);
-                                               /* Clear already pending ints */
-                                               if (Read_hfc(cs, HFCSX_INT_S1));
-
-                                               Write_hfc(cs, HFCSX_STATES, 4 | HFCSX_LOAD_STATE);
-                                               udelay(10);
-                                               Write_hfc(cs, HFCSX_STATES, 4);
-                                               cs->dc.hfcsx.ph_state = 4;
-                                       } else {
-                                               cs->hw.hfcsx.int_m1 |= HFCSX_INTS_TIMER;
-                                               Write_hfc(cs, HFCSX_INT_M1, cs->hw.hfcsx.int_m1);
-                                               cs->hw.hfcsx.ctmt &= ~HFCSX_AUTO_TIMER;
-                                               cs->hw.hfcsx.ctmt |= HFCSX_TIM3_125;
-                                               Write_hfc(cs, HFCSX_CTMT, cs->hw.hfcsx.ctmt | HFCSX_CLTIMER);
-                                               Write_hfc(cs, HFCSX_CTMT, cs->hw.hfcsx.ctmt | HFCSX_CLTIMER);
-                                               cs->hw.hfcsx.nt_timer = NT_T1_COUNT;
-                                               Write_hfc(cs, HFCSX_STATES, 2 | HFCSX_NT_G2_G3);        /* allow G2 -> G3 transition */
-                                       }
-                                       spin_unlock_irqrestore(&cs->lock, flags);
-                                       break;
-                               case (1):
-                               case (3):
-                               case (4):
-                                       spin_lock_irqsave(&cs->lock, flags);
+                       case (2):
+                               spin_lock_irqsave(&cs->lock, flags);
+                               if (cs->hw.hfcsx.nt_timer < 0) {
                                        cs->hw.hfcsx.nt_timer = 0;
                                        cs->hw.hfcsx.int_m1 &= ~HFCSX_INTS_TIMER;
                                        Write_hfc(cs, HFCSX_INT_M1, cs->hw.hfcsx.int_m1);
-                                       spin_unlock_irqrestore(&cs->lock, flags);
-                                       break;
-                               default:
-                                       break;
+                                       /* Clear already pending ints */
+                                       if (Read_hfc(cs, HFCSX_INT_S1));
+
+                                       Write_hfc(cs, HFCSX_STATES, 4 | HFCSX_LOAD_STATE);
+                                       udelay(10);
+                                       Write_hfc(cs, HFCSX_STATES, 4);
+                                       cs->dc.hfcsx.ph_state = 4;
+                               } else {
+                                       cs->hw.hfcsx.int_m1 |= HFCSX_INTS_TIMER;
+                                       Write_hfc(cs, HFCSX_INT_M1, cs->hw.hfcsx.int_m1);
+                                       cs->hw.hfcsx.ctmt &= ~HFCSX_AUTO_TIMER;
+                                       cs->hw.hfcsx.ctmt |= HFCSX_TIM3_125;
+                                       Write_hfc(cs, HFCSX_CTMT, cs->hw.hfcsx.ctmt | HFCSX_CLTIMER);
+                                       Write_hfc(cs, HFCSX_CTMT, cs->hw.hfcsx.ctmt | HFCSX_CLTIMER);
+                                       cs->hw.hfcsx.nt_timer = NT_T1_COUNT;
+                                       Write_hfc(cs, HFCSX_STATES, 2 | HFCSX_NT_G2_G3);        /* allow G2 -> G3 transition */
+                               }
+                               spin_unlock_irqrestore(&cs->lock, flags);
+                               break;
+                       case (1):
+                       case (3):
+                       case (4):
+                               spin_lock_irqsave(&cs->lock, flags);
+                               cs->hw.hfcsx.nt_timer = 0;
+                               cs->hw.hfcsx.int_m1 &= ~HFCSX_INTS_TIMER;
+                               Write_hfc(cs, HFCSX_INT_M1, cs->hw.hfcsx.int_m1);
+                               spin_unlock_irqrestore(&cs->lock, flags);
+                               break;
+                       default:
+                               break;
                        }
                }
        }
@@ -1353,29 +1353,29 @@ hfcsx_card_msg(struct IsdnCardState *cs, int mt, void *arg)
        if (cs->debug & L1_DEB_ISAC)
                debugl1(cs, "HFCSX: card_msg %x", mt);
        switch (mt) {
-               case CARD_RESET:
-                       spin_lock_irqsave(&cs->lock, flags);
-                       reset_hfcsx(cs);
-                       spin_unlock_irqrestore(&cs->lock, flags);
-                       return (0);
-               case CARD_RELEASE:
-                       release_io_hfcsx(cs);
-                       return (0);
-               case CARD_INIT:
-                       spin_lock_irqsave(&cs->lock, flags);
-                       inithfcsx(cs);
-                       spin_unlock_irqrestore(&cs->lock, flags);
-                       msleep(80);                             /* Timeout 80ms */
-                       /* now switch timer interrupt off */
-                       spin_lock_irqsave(&cs->lock, flags);
-                       cs->hw.hfcsx.int_m1 &= ~HFCSX_INTS_TIMER;
-                       Write_hfc(cs, HFCSX_INT_M1, cs->hw.hfcsx.int_m1);
-                       /* reinit mode reg */
-                       Write_hfc(cs, HFCSX_MST_MODE, cs->hw.hfcsx.mst_m);
-                       spin_unlock_irqrestore(&cs->lock, flags);
-                       return (0);
-               case CARD_TEST:
-                       return (0);
+       case CARD_RESET:
+               spin_lock_irqsave(&cs->lock, flags);
+               reset_hfcsx(cs);
+               spin_unlock_irqrestore(&cs->lock, flags);
+               return (0);
+       case CARD_RELEASE:
+               release_io_hfcsx(cs);
+               return (0);
+       case CARD_INIT:
+               spin_lock_irqsave(&cs->lock, flags);
+               inithfcsx(cs);
+               spin_unlock_irqrestore(&cs->lock, flags);
+               msleep(80);                             /* Timeout 80ms */
+               /* now switch timer interrupt off */
+               spin_lock_irqsave(&cs->lock, flags);
+               cs->hw.hfcsx.int_m1 &= ~HFCSX_INTS_TIMER;
+               Write_hfc(cs, HFCSX_INT_M1, cs->hw.hfcsx.int_m1);
+               /* reinit mode reg */
+               Write_hfc(cs, HFCSX_MST_MODE, cs->hw.hfcsx.mst_m);
+               spin_unlock_irqrestore(&cs->lock, flags);
+               return (0);
+       case CARD_TEST:
+               return (0);
        }
        return (0);
 }
@@ -1383,7 +1383,7 @@ hfcsx_card_msg(struct IsdnCardState *cs, int mt, void *arg)
 #ifdef __ISAPNP__
 static struct isapnp_device_id hfc_ids[] __devinitdata = {
        { ISAPNP_VENDOR('T', 'A', 'G'), ISAPNP_FUNCTION(0x2620),
-         ISAPNP_VENDOR('T', 'A', 'G'), ISAPNP_FUNCTION(0x2620), 
+         ISAPNP_VENDOR('T', 'A', 'G'), ISAPNP_FUNCTION(0x2620),
          (unsigned long) "Teles 16.3c2" },
        { 0, }
 };
@@ -1403,30 +1403,30 @@ setup_hfcsx(struct IsdnCard *card)
 #ifdef __ISAPNP__
        if (!card->para[1] && isapnp_present()) {
                struct pnp_dev *pnp_d;
-               while(ipid->card_vendor) {
+               while (ipid->card_vendor) {
                        if ((pnp_c = pnp_find_card(ipid->card_vendor,
-                               ipid->card_device, pnp_c))) {
+                                                  ipid->card_device, pnp_c))) {
                                pnp_d = NULL;
                                if ((pnp_d = pnp_find_dev(pnp_c,
-                                       ipid->vendor, ipid->function, pnp_d))) {
+                                                         ipid->vendor, ipid->function, pnp_d))) {
                                        int err;
 
                                        printk(KERN_INFO "HiSax: %s detected\n",
-                                               (char *)ipid->driver_data);
+                                              (char *)ipid->driver_data);
                                        pnp_disable_dev(pnp_d);
                                        err = pnp_activate_dev(pnp_d);
-                                       if (err<0) {
+                                       if (err < 0) {
                                                printk(KERN_WARNING "%s: pnp_activate_dev ret(%d)\n",
-                                                       __func__, err);
-                                               return(0);
+                                                      __func__, err);
+                                               return (0);
                                        }
                                        card->para[1] = pnp_port_start(pnp_d, 0);
                                        card->para[0] = pnp_irq(pnp_d, 0);
                                        if (!card->para[0] || !card->para[1]) {
                                                printk(KERN_ERR "HFC PnP:some resources are missing %ld/%lx\n",
-                                                       card->para[0], card->para[1]);
+                                                      card->para[0], card->para[1]);
                                                pnp_disable_dev(pnp_d);
-                                               return(0);
+                                               return (0);
                                        }
                                        break;
                                } else {
@@ -1435,10 +1435,10 @@ setup_hfcsx(struct IsdnCard *card)
                        }
                        ipid++;
                        pnp_c = NULL;
-               } 
+               }
                if (!ipid->card_vendor) {
                        printk(KERN_INFO "HFC PnP: no ISAPnP card found\n");
-                       return(0);
+                       return (0);
                }
        }
 #endif
@@ -1447,47 +1447,47 @@ setup_hfcsx(struct IsdnCard *card)
        cs->hw.hfcsx.int_s1 = 0;
        cs->dc.hfcsx.ph_state = 0;
        cs->hw.hfcsx.fifo = 255;
-       if ((cs->typ == ISDN_CTYPE_HFC_SX) || 
+       if ((cs->typ == ISDN_CTYPE_HFC_SX) ||
            (cs->typ == ISDN_CTYPE_HFC_SP_PCMCIA)) {
-               if ((!cs->hw.hfcsx.base) || !request_region(cs->hw.hfcsx.base, 2, "HFCSX isdn")) {
-                 printk(KERN_WARNING
-                        "HiSax: HFC-SX io-base %#lx already in use\n",
-                         cs->hw.hfcsx.base);
-                 return(0);
+               if ((!cs->hw.hfcsx.base) || !request_region(cs->hw.hfcsx.base, 2, "HFCSX isdn")) {
+                       printk(KERN_WARNING
+                              "HiSax: HFC-SX io-base %#lx already in use\n",
+                              cs->hw.hfcsx.base);
+                       return (0);
                }
                byteout(cs->hw.hfcsx.base, cs->hw.hfcsx.base & 0xFF);
                byteout(cs->hw.hfcsx.base + 1,
                        ((cs->hw.hfcsx.base >> 8) & 3) | 0x54);
                udelay(10);
-               cs->hw.hfcsx.chip = Read_hfc(cs,HFCSX_CHIP_ID);
-                switch (cs->hw.hfcsx.chip >> 4) {
-                 case 1: 
-                   tmp[0] ='+';
-                   break;
-                 case 9: 
-                   tmp[0] ='P';
-                   break;
-                 default:
-                   printk(KERN_WARNING
-                          "HFC-SX: invalid chip id 0x%x\n",
-                          cs->hw.hfcsx.chip >> 4);
-                   release_region(cs->hw.hfcsx.base, 2);
-                   return(0);
-               }  
+               cs->hw.hfcsx.chip = Read_hfc(cs, HFCSX_CHIP_ID);
+               switch (cs->hw.hfcsx.chip >> 4) {
+               case 1:
+                       tmp[0] = '+';
+                       break;
+               case 9:
+                       tmp[0] = 'P';
+                       break;
+               default:
+                       printk(KERN_WARNING
+                              "HFC-SX: invalid chip id 0x%x\n",
+                              cs->hw.hfcsx.chip >> 4);
+                       release_region(cs->hw.hfcsx.base, 2);
+                       return (0);
+               }
                if (!ccd_sp_irqtab[cs->irq & 0xF]) {
-                 printk(KERN_WARNING 
-                        "HFC_SX: invalid irq %d specified\n",cs->irq & 0xF);
-                 release_region(cs->hw.hfcsx.base, 2);
-                 return(0);
-               }  
+                       printk(KERN_WARNING
+                              "HFC_SX: invalid irq %d specified\n", cs->irq & 0xF);
+                       release_region(cs->hw.hfcsx.base, 2);
+                       return (0);
+               }
                if (!(cs->hw.hfcsx.extra = (void *)
                      kmalloc(sizeof(struct hfcsx_extra), GFP_ATOMIC))) {
-                 release_region(cs->hw.hfcsx.base, 2);
-                 printk(KERN_WARNING "HFC-SX: unable to allocate memory\n");
-                 return(0);
+                       release_region(cs->hw.hfcsx.base, 2);
+                       printk(KERN_WARNING "HFC-SX: unable to allocate memory\n");
+                       return (0);
                }
                printk(KERN_INFO "HFC-S%c chip detected at base 0x%x IRQ %d HZ %d\n",
-                       tmp[0], (u_int) cs->hw.hfcsx.base, cs->irq, HZ);
+                      tmp[0], (u_int) cs->hw.hfcsx.base, cs->irq, HZ);
                cs->hw.hfcsx.int_m2 = 0;        /* disable alle interrupts */
                cs->hw.hfcsx.int_m1 = 0;
                Write_hfc(cs, HFCSX_INT_M1, cs->hw.hfcsx.int_m1);
index 6792f13..eee85db 100644 (file)
@@ -5,7 +5,7 @@
  * Author       Werner Cornelius
  *              based on existing driver for CCD HFC PCI cards
  * Copyright    by Werner Cornelius  <werner@isdn4linux.de>
- * 
+ *
  * This software may be used and distributed according to the terms
  * of the GNU General Public License, incorporated herein by reference.
  *
@@ -48,7 +48,7 @@
 
 #define HFCSX_MST_EMOD  0x2D
 #define HFCSX_MST_MODE 0x2E
-#define HFCSX_CONNECT  0x2F
+#define HFCSX_CONNECT  0x2F
 
 
 /* Interrupt and status registers */
 #define HFCSX_TRM       0x12
 #define HFCSX_B_MODE    0x13
 #define HFCSX_CHIP_ID   0x16
-#define HFCSX_CIRM     0x18
+#define HFCSX_CIRM     0x18
 #define HFCSX_CTMT     0x19
-#define HFCSX_INT_M1   0x1A
-#define HFCSX_INT_M2   0x1B
-#define HFCSX_INT_S1   0x1E
-#define HFCSX_INT_S2   0x1F
-#define HFCSX_STATUS   0x1C
+#define HFCSX_INT_M1   0x1A
+#define HFCSX_INT_M2   0x1B
+#define HFCSX_INT_S1   0x1E
+#define HFCSX_INT_S2   0x1F
+#define HFCSX_STATUS   0x1C
 
 /* S/T section registers */
 
-#define HFCSX_STATES   0x30
-#define HFCSX_SCTRL    0x31
+#define HFCSX_STATES   0x30
+#define HFCSX_SCTRL    0x31
 #define HFCSX_SCTRL_E   0x32
 #define HFCSX_SCTRL_R   0x33
-#define HFCSX_SQ       0x34
-#define HFCSX_CLKDEL   0x37
+#define HFCSX_SQ       0x34
+#define HFCSX_CLKDEL   0x37
 #define HFCSX_B1_REC    0x3C
 #define HFCSX_B1_SEND   0x3C
 #define HFCSX_B2_REC    0x3D
@@ -97,7 +97,7 @@
 
 /* bits in status register (READ) */
 #define HFCSX_SX_PROC    0x02
-#define HFCSX_NBUSY     0x04 
+#define HFCSX_NBUSY     0x04
 #define HFCSX_TIMER_ELAP 0x10
 #define HFCSX_STATINT   0x20
 #define HFCSX_FRAMEINT  0x40
 /* bits in CIRM (Write) */
 #define HFCSX_IRQ_SELMSK 0x07
 #define HFCSX_IRQ_SELDIS 0x00
-#define HFCSX_RESET     0x08
+#define HFCSX_RESET     0x08
 #define HFCSX_FIFO_RESET 0x80
 
 
 /* structure holding additional dynamic data -> send marker */
 /************************************************************/
 struct hfcsx_extra {
-  unsigned short marker[2*(MAX_B_FRAMES+1) + (MAX_D_FRAMES+1)];
+       unsigned short marker[2 * (MAX_B_FRAMES + 1) + (MAX_D_FRAMES + 1)];
 };
 
 extern void main_irq_hfcsx(struct BCState *bcs);
index f407de0..62c65bd 100644 (file)
@@ -27,7 +27,7 @@
  *
  * See Version Histroy at the bottom of this file
  *
-*/
+ */
 
 #include <linux/types.h>
 #include <linux/stddef.h>
 #include "hfc_usb.h"
 
 static const char *hfcusb_revision =
-    "$Revision: 2.3.2.24 $ $Date: 2007/10/14 08:40:29 $ ";
+       "$Revision: 2.3.2.24 $ $Date: 2007/10/14 08:40:29 $ ";
 
 /* Hisax debug support
-*  debug flags defined in hfc_usb.h as HFCUSB_DBG_[*]
-*/
+ *  debug flags defined in hfc_usb.h as HFCUSB_DBG_[*]
+ */
 #define __debug_variable hfc_debug
 #include "hisax_debug.h"
 static u_int debug;
@@ -67,70 +67,70 @@ typedef struct {
 /* VID/PID device list */
 static struct usb_device_id hfcusb_idtab[] = {
        {
-        USB_DEVICE(0x0959, 0x2bd0),
-        .driver_info = (unsigned long) &((hfcsusb_vdata)
-                         {LED_OFF, {4, 0, 2, 1},
-                          "ISDN USB TA (Cologne Chip HFC-S USB based)"}),
+               USB_DEVICE(0x0959, 0x2bd0),
+               .driver_info = (unsigned long) &((hfcsusb_vdata)
+                       {LED_OFF, {4, 0, 2, 1},
+                                       "ISDN USB TA (Cologne Chip HFC-S USB based)"}),
        },
        {
-        USB_DEVICE(0x0675, 0x1688),
-        .driver_info = (unsigned long) &((hfcsusb_vdata)
-                         {LED_SCHEME1, {1, 2, 0, 0},
-                          "DrayTek miniVigor 128 USB ISDN TA"}),
+               USB_DEVICE(0x0675, 0x1688),
+               .driver_info = (unsigned long) &((hfcsusb_vdata)
+                       {LED_SCHEME1, {1, 2, 0, 0},
+                                       "DrayTek miniVigor 128 USB ISDN TA"}),
        },
        {
-        USB_DEVICE(0x07b0, 0x0007),
-        .driver_info = (unsigned long) &((hfcsusb_vdata)
-                         {LED_SCHEME1, {0x80, -64, -32, -16},
-                          "Billion tiny USB ISDN TA 128"}),
+               USB_DEVICE(0x07b0, 0x0007),
+               .driver_info = (unsigned long) &((hfcsusb_vdata)
+                       {LED_SCHEME1, {0x80, -64, -32, -16},
+                                       "Billion tiny USB ISDN TA 128"}),
        },
        {
-        USB_DEVICE(0x0742, 0x2008),
-        .driver_info = (unsigned long) &((hfcsusb_vdata)
-                         {LED_SCHEME1, {4, 0, 2, 1},
-                          "Stollmann USB TA"}),
+               USB_DEVICE(0x0742, 0x2008),
+               .driver_info = (unsigned long) &((hfcsusb_vdata)
+                       {LED_SCHEME1, {4, 0, 2, 1},
+                                       "Stollmann USB TA"}),
        },
        {
-        USB_DEVICE(0x0742, 0x2009),
-        .driver_info = (unsigned long) &((hfcsusb_vdata)
-                         {LED_SCHEME1, {4, 0, 2, 1},
-                          "Aceex USB ISDN TA"}),
+               USB_DEVICE(0x0742, 0x2009),
+               .driver_info = (unsigned long) &((hfcsusb_vdata)
+                       {LED_SCHEME1, {4, 0, 2, 1},
+                                       "Aceex USB ISDN TA"}),
        },
        {
-        USB_DEVICE(0x0742, 0x200A),
-        .driver_info = (unsigned long) &((hfcsusb_vdata)
-                         {LED_SCHEME1, {4, 0, 2, 1},
-                          "OEM USB ISDN TA"}),
+               USB_DEVICE(0x0742, 0x200A),
+               .driver_info = (unsigned long) &((hfcsusb_vdata)
+                       {LED_SCHEME1, {4, 0, 2, 1},
+                                       "OEM USB ISDN TA"}),
        },
        {
-        USB_DEVICE(0x08e3, 0x0301),
-        .driver_info = (unsigned long) &((hfcsusb_vdata)
-                         {LED_SCHEME1, {2, 0, 1, 4},
-                          "Olitec USB RNIS"}),
+               USB_DEVICE(0x08e3, 0x0301),
+               .driver_info = (unsigned long) &((hfcsusb_vdata)
+                       {LED_SCHEME1, {2, 0, 1, 4},
+                                       "Olitec USB RNIS"}),
        },
        {
-        USB_DEVICE(0x07fa, 0x0846),
-        .driver_info = (unsigned long) &((hfcsusb_vdata)
-                         {LED_SCHEME1, {0x80, -64, -32, -16},
-                          "Bewan Modem RNIS USB"}),
+               USB_DEVICE(0x07fa, 0x0846),
+               .driver_info = (unsigned long) &((hfcsusb_vdata)
+                       {LED_SCHEME1, {0x80, -64, -32, -16},
+                                       "Bewan Modem RNIS USB"}),
        },
        {
-        USB_DEVICE(0x07fa, 0x0847),
-        .driver_info = (unsigned long) &((hfcsusb_vdata)
-                         {LED_SCHEME1, {0x80, -64, -32, -16},
-                          "Djinn Numeris USB"}),
+               USB_DEVICE(0x07fa, 0x0847),
+               .driver_info = (unsigned long) &((hfcsusb_vdata)
+                       {LED_SCHEME1, {0x80, -64, -32, -16},
+                                       "Djinn Numeris USB"}),
        },
        {
-        USB_DEVICE(0x07b0, 0x0006),
-        .driver_info = (unsigned long) &((hfcsusb_vdata)
-                         {LED_SCHEME1, {0x80, -64, -32, -16},
-                          "Twister ISDN TA"}),
+               USB_DEVICE(0x07b0, 0x0006),
+               .driver_info = (unsigned long) &((hfcsusb_vdata)
+                       {LED_SCHEME1, {0x80, -64, -32, -16},
+                                       "Twister ISDN TA"}),
        },
        {
-        USB_DEVICE(0x071d, 0x1005),
-        .driver_info = (unsigned long) &((hfcsusb_vdata)
-                         {LED_SCHEME1, {0x02, 0, 0x01, 0x04},
-                          "Eicon DIVA USB 4.0"}),
+               USB_DEVICE(0x071d, 0x1005),
+               .driver_info = (unsigned long) &((hfcsusb_vdata)
+                       {LED_SCHEME1, {0x02, 0, 0x01, 0x04},
+                                       "Eicon DIVA USB 4.0"}),
        },
        { }
 };
@@ -177,7 +177,7 @@ typedef struct hfcusb_data {
        int alt_used;           /* used alternate config */
        int ctrl_paksize;       /* control pipe packet size */
        int ctrl_in_pipe,       /* handles for control pipe */
-           ctrl_out_pipe;
+               ctrl_out_pipe;
        int cfg_used;           /* configuration index used */
        int vend_idx;           /* vendor found */
        int b_mode[2];          /* B-channel mode */
@@ -206,7 +206,7 @@ typedef struct hfcusb_data {
 } hfcusb_data;
 
 
-static void collect_rx_frame(usb_fifo * fifo, __u8 * data, int len,
+static void collect_rx_frame(usb_fifo *fifo, __u8 *data, int len,
                             int finish);
 
 static inline const char *
@@ -220,24 +220,24 @@ symbolic(struct hfcusb_symbolic_list list[], const int num)
 }
 
 static void
-ctrl_start_transfer(hfcusb_data * hfc)
+ctrl_start_transfer(hfcusb_data *hfc)
 {
        if (hfc->ctrl_cnt) {
                hfc->ctrl_urb->pipe = hfc->ctrl_out_pipe;
-               hfc->ctrl_urb->setup_packet = (u_char *) & hfc->ctrl_write;
+               hfc->ctrl_urb->setup_packet = (u_char *)&hfc->ctrl_write;
                hfc->ctrl_urb->transfer_buffer = NULL;
                hfc->ctrl_urb->transfer_buffer_length = 0;
                hfc->ctrl_write.wIndex =
-                   cpu_to_le16(hfc->ctrl_buff[hfc->ctrl_out_idx].hfc_reg);
+                       cpu_to_le16(hfc->ctrl_buff[hfc->ctrl_out_idx].hfc_reg);
                hfc->ctrl_write.wValue =
-                   cpu_to_le16(hfc->ctrl_buff[hfc->ctrl_out_idx].reg_val);
+                       cpu_to_le16(hfc->ctrl_buff[hfc->ctrl_out_idx].reg_val);
 
                usb_submit_urb(hfc->ctrl_urb, GFP_ATOMIC);      /* start transfer */
        }
 }                              /* ctrl_start_transfer */
 
 static int
-queue_control_request(hfcusb_data * hfc, __u8 reg, __u8 val, int action)
+queue_control_request(hfcusb_data *hfc, __u8 reg, __u8 val, int action)
 {
        ctrl_buft *buf;
 
@@ -271,7 +271,7 @@ ctrl_complete(struct urb *urb)
 
 /* write led data to auxport & invert if necessary */
 static void
-write_led(hfcusb_data * hfc, __u8 led_state)
+write_led(hfcusb_data *hfc, __u8 led_state)
 {
        if (led_state != hfc->old_led_state) {
                hfc->old_led_state = led_state;
@@ -280,7 +280,7 @@ write_led(hfcusb_data * hfc, __u8 led_state)
 }
 
 static void
-set_led_bit(hfcusb_data * hfc, signed short led_bits, int on)
+set_led_bit(hfcusb_data *hfc, signed short led_bits, int on)
 {
        if (on) {
                if (led_bits < 0)
@@ -297,53 +297,53 @@ set_led_bit(hfcusb_data * hfc, signed short led_bits, int on)
 
 /* handle LED requests */
 static void
-handle_led(hfcusb_data * hfc, int event)
+handle_led(hfcusb_data *hfc, int event)
 {
        hfcsusb_vdata *driver_info =
-           (hfcsusb_vdata *) hfcusb_idtab[hfc->vend_idx].driver_info;
+               (hfcsusb_vdata *) hfcusb_idtab[hfc->vend_idx].driver_info;
 
        /* if no scheme -> no LED action */
        if (driver_info->led_scheme == LED_OFF)
                return;
 
        switch (event) {
-               case LED_POWER_ON:
-                       set_led_bit(hfc, driver_info->led_bits[0], 1);
-                       set_led_bit(hfc, driver_info->led_bits[1], 0);
-                       set_led_bit(hfc, driver_info->led_bits[2], 0);
-                       set_led_bit(hfc, driver_info->led_bits[3], 0);
-                       break;
-               case LED_POWER_OFF:
-                       set_led_bit(hfc, driver_info->led_bits[0], 0);
-                       set_led_bit(hfc, driver_info->led_bits[1], 0);
-                       set_led_bit(hfc, driver_info->led_bits[2], 0);
-                       set_led_bit(hfc, driver_info->led_bits[3], 0);
-                       break;
-               case LED_S0_ON:
-                       set_led_bit(hfc, driver_info->led_bits[1], 1);
-                       break;
-               case LED_S0_OFF:
-                       set_led_bit(hfc, driver_info->led_bits[1], 0);
-                       break;
-               case LED_B1_ON:
-                       set_led_bit(hfc, driver_info->led_bits[2], 1);
-                       break;
-               case LED_B1_OFF:
-                       set_led_bit(hfc, driver_info->led_bits[2], 0);
-                       break;
-               case LED_B2_ON:
-                       set_led_bit(hfc, driver_info->led_bits[3], 1);
-                       break;
-               case LED_B2_OFF:
-                       set_led_bit(hfc, driver_info->led_bits[3], 0);
-                       break;
+       case LED_POWER_ON:
+               set_led_bit(hfc, driver_info->led_bits[0], 1);
+               set_led_bit(hfc, driver_info->led_bits[1], 0);
+               set_led_bit(hfc, driver_info->led_bits[2], 0);
+               set_led_bit(hfc, driver_info->led_bits[3], 0);
+               break;
+       case LED_POWER_OFF:
+               set_led_bit(hfc, driver_info->led_bits[0], 0);
+               set_led_bit(hfc, driver_info->led_bits[1], 0);
+               set_led_bit(hfc, driver_info->led_bits[2], 0);
+               set_led_bit(hfc, driver_info->led_bits[3], 0);
+               break;
+       case LED_S0_ON:
+               set_led_bit(hfc, driver_info->led_bits[1], 1);
+               break;
+       case LED_S0_OFF:
+               set_led_bit(hfc, driver_info->led_bits[1], 0);
+               break;
+       case LED_B1_ON:
+               set_led_bit(hfc, driver_info->led_bits[2], 1);
+               break;
+       case LED_B1_OFF:
+               set_led_bit(hfc, driver_info->led_bits[2], 0);
+               break;
+       case LED_B2_ON:
+               set_led_bit(hfc, driver_info->led_bits[3], 1);
+               break;
+       case LED_B2_OFF:
+               set_led_bit(hfc, driver_info->led_bits[3], 0);
+               break;
        }
        write_led(hfc, hfc->led_state);
 }
 
 /* ISDN l1 timer T3 expires */
 static void
-l1_timer_expire_t3(hfcusb_data * hfc)
+l1_timer_expire_t3(hfcusb_data *hfc)
 {
        hfc->d_if.ifc.l1l2(&hfc->d_if.ifc, PH_DEACTIVATE | INDICATION,
                           NULL);
@@ -360,7 +360,7 @@ l1_timer_expire_t3(hfcusb_data * hfc)
 
 /* ISDN l1 timer T4 expires */
 static void
-l1_timer_expire_t4(hfcusb_data * hfc)
+l1_timer_expire_t4(hfcusb_data *hfc)
 {
        hfc->d_if.ifc.l1l2(&hfc->d_if.ifc, PH_DEACTIVATE | INDICATION,
                           NULL);
@@ -374,7 +374,7 @@ l1_timer_expire_t4(hfcusb_data * hfc)
 
 /* S0 state changed */
 static void
-s0_state_handler(hfcusb_data * hfc, __u8 state)
+s0_state_handler(hfcusb_data *hfc, __u8 state)
 {
        __u8 old_state;
 
@@ -402,12 +402,12 @@ s0_state_handler(hfcusb_data * hfc, __u8 state)
                DBG(HFCUSB_DBG_STATES, "HFC-S USB: PH_ACTIVATE | INDICATION sent");
                hfc->l1_activated = 1;
                handle_led(hfc, LED_S0_ON);
-       } else if (state <= 3 /* && activated */ ) {
+       } else if (state <= 3 /* && activated */) {
                if (old_state == 7 || old_state == 8) {
                        DBG(HFCUSB_DBG_STATES, "HFC-S USB: T4 activated");
                        if (!timer_pending(&hfc->t4_timer)) {
                                hfc->t4_timer.expires =
-                                   jiffies + (HFC_TIMER_T4 * HZ) / 1000;
+                                       jiffies + (HFC_TIMER_T4 * HZ) / 1000;
                                add_timer(&hfc->t4_timer);
                        }
                } else {
@@ -451,7 +451,7 @@ fill_isoc_urb(struct urb *urb, struct usb_device *dev, unsigned int pipe,
  * gaps in the transfer chain
  */
 static int
-start_isoc_chain(usb_fifo * fifo, int num_packets_per_urb,
+start_isoc_chain(usb_fifo *fifo, int num_packets_per_urb,
                 usb_complete_t complete, int packet_size)
 {
        int i, k, errcode;
@@ -463,7 +463,7 @@ start_isoc_chain(usb_fifo * fifo, int num_packets_per_urb,
        for (i = 0; i < 2; i++) {
                if (!(fifo->iso[i].purb)) {
                        fifo->iso[i].purb =
-                           usb_alloc_urb(num_packets_per_urb, GFP_KERNEL);
+                               usb_alloc_urb(num_packets_per_urb, GFP_KERNEL);
                        if (!(fifo->iso[i].purb)) {
                                printk(KERN_INFO
                                       "alloc urb for fifo %i failed!!!",
@@ -487,11 +487,11 @@ start_isoc_chain(usb_fifo * fifo, int num_packets_per_urb,
                                /* defining packet delimeters in fifo->buffer */
                                for (k = 0; k < num_packets_per_urb; k++) {
                                        fifo->iso[i].purb->
-                                           iso_frame_desc[k].offset =
-                                           k * packet_size;
+                                               iso_frame_desc[k].offset =
+                                               k * packet_size;
                                        fifo->iso[i].purb->
-                                           iso_frame_desc[k].length =
-                                           packet_size;
+                                               iso_frame_desc[k].length =
+                                               packet_size;
                                }
                        } else {
                                printk(KERN_INFO
@@ -511,7 +511,7 @@ start_isoc_chain(usb_fifo * fifo, int num_packets_per_urb,
 
 /* stops running iso chain and frees their pending urbs */
 static void
-stop_isoc_chain(usb_fifo * fifo)
+stop_isoc_chain(usb_fifo *fifo)
 {
        int i;
 
@@ -534,8 +534,8 @@ stop_isoc_chain(usb_fifo * fifo)
 
 /* defines how much ISO packets are handled in one URB */
 static int iso_packets[8] =
-    { ISOC_PACKETS_B, ISOC_PACKETS_B, ISOC_PACKETS_B, ISOC_PACKETS_B,
-       ISOC_PACKETS_D, ISOC_PACKETS_D, ISOC_PACKETS_D, ISOC_PACKETS_D
+{ ISOC_PACKETS_B, ISOC_PACKETS_B, ISOC_PACKETS_B, ISOC_PACKETS_B,
+  ISOC_PACKETS_D, ISOC_PACKETS_D, ISOC_PACKETS_D, ISOC_PACKETS_D
 };
 
 static void
@@ -545,7 +545,7 @@ tx_iso_complete(struct urb *urb)
        usb_fifo *fifo = context_iso_urb->owner_fifo;
        hfcusb_data *hfc = fifo->hfc;
        int k, tx_offset, num_isoc_packets, sink, len, current_len,
-           errcode;
+               errcode;
        int frame_complete, transp_mode, fifon, status;
        __u8 threshbit;
 
@@ -565,8 +565,8 @@ tx_iso_complete(struct urb *urb)
                        errcode = urb->iso_frame_desc[k].status;
                        if (errcode)
                                DBG(HFCUSB_DBG_VERBOSE_USB, "HFC-S USB: tx_iso_complete "
-                                      "packet %i, status: %i\n",
-                                      k, errcode);
+                                   "packet %i, status: %i\n",
+                                   k, errcode);
                }
 
                // clear status, so go on with ISO transfers
@@ -607,8 +607,8 @@ tx_iso_complete(struct urb *urb)
                                if (current_len > 14)
                                        current_len = 14;
                                current_len =
-                                   (len <=
-                                    current_len) ? len : current_len;
+                                       (len <=
+                                        current_len) ? len : current_len;
                                /* how much bit do we put on the line? */
                                fifo->bit_line += current_len * 8;
 
@@ -617,7 +617,7 @@ tx_iso_complete(struct urb *urb)
                                        if (!transp_mode) {
                                                /* here frame completion */
                                                context_iso_urb->
-                                                   buffer[tx_offset] = 1;
+                                                       buffer[tx_offset] = 1;
                                                /* add 2 byte flags and 16bit CRC at end of ISDN frame */
                                                fifo->bit_line += 32;
                                        }
@@ -632,12 +632,12 @@ tx_iso_complete(struct urb *urb)
                                /* define packet delimeters within the URB buffer */
                                urb->iso_frame_desc[k].offset = tx_offset;
                                urb->iso_frame_desc[k].length =
-                                   current_len + 1;
+                                       current_len + 1;
 
                                tx_offset += (current_len + 1);
                        } else {
                                urb->iso_frame_desc[k].offset =
-                                   tx_offset++;
+                                       tx_offset++;
 
                                urb->iso_frame_desc[k].length = 1;
                                fifo->bit_line -= sink; /* we lower data margin every msec */
@@ -683,7 +683,7 @@ rx_iso_complete(struct urb *urb)
        usb_fifo *fifo = context_iso_urb->owner_fifo;
        hfcusb_data *hfc = fifo->hfc;
        int k, len, errcode, offset, num_isoc_packets, fifon, maxlen,
-           status;
+               status;
        unsigned int iso_status;
        __u8 *buf;
        static __u8 eof[8];
@@ -723,10 +723,10 @@ rx_iso_complete(struct urb *urb)
 
                        if (fifon == HFCUSB_D_RX) {
                                DBG(HFCUSB_DBG_VERBOSE_USB,
-                                      "HFC-S USB: ISO-D-RX lst_urblen:%2d "
-                                      "act_urblen:%2d max-urblen:%2d EOF:0x%0x",
-                                      fifo->last_urblen, len, maxlen,
-                                      eof[5]);
+                                   "HFC-S USB: ISO-D-RX lst_urblen:%2d "
+                                   "act_urblen:%2d max-urblen:%2d EOF:0x%0x",
+                                   fifo->last_urblen, len, maxlen,
+                                   eof[5]);
 
                                DBG_PACKET(HFCUSB_DBG_VERBOSE_USB, buf, len);
                        }
@@ -778,7 +778,7 @@ rx_iso_complete(struct urb *urb)
 
 /* collect rx data from INT- and ISO-URBs  */
 static void
-collect_rx_frame(usb_fifo * fifo, __u8 * data, int len, int finish)
+collect_rx_frame(usb_fifo *fifo, __u8 *data, int len, int finish)
 {
        hfcusb_data *hfc = fifo->hfc;
        int transp_mode, fifon;
@@ -802,8 +802,8 @@ collect_rx_frame(usb_fifo * fifo, __u8 * data, int len, int finish)
                        memcpy(skb_put(fifo->skbuff, len), data, len);
                } else {
                        DBG(HFCUSB_DBG_FIFO_ERR,
-                              "HCF-USB: got frame exceeded fifo->max_size(%d) fifo(%d)",
-                              fifo->max_size, fifon);
+                           "HCF-USB: got frame exceeded fifo->max_size(%d) fifo(%d)",
+                           fifo->max_size, fifon);
                        DBG_SKB(HFCUSB_DBG_VERBOSE_USB, fifo->skbuff);
                        skb_trim(fifo->skbuff, 0);
                }
@@ -817,7 +817,7 @@ collect_rx_frame(usb_fifo * fifo, __u8 * data, int len, int finish)
        /* we have a complete hdlc packet */
        if (finish) {
                if (fifo->skbuff->len > 3 &&
-                               !fifo->skbuff->data[fifo->skbuff->len - 1]) {
+                   !fifo->skbuff->data[fifo->skbuff->len - 1]) {
 
                        if (fifon == HFCUSB_D_RX) {
                                DBG(HFCUSB_DBG_DCHANNEL,
@@ -876,10 +876,10 @@ rx_int_complete(struct urb *urb)
 
        if (fifon == HFCUSB_D_RX) {
                DBG(HFCUSB_DBG_VERBOSE_USB,
-                      "HFC-S USB: INT-D-RX lst_urblen:%2d "
-                      "act_urblen:%2d max-urblen:%2d EOF:0x%0x",
-                      fifo->last_urblen, len, maxlen,
-                      eof[5]);
+                   "HFC-S USB: INT-D-RX lst_urblen:%2d "
+                   "act_urblen:%2d max-urblen:%2d EOF:0x%0x",
+                   fifo->last_urblen, len, maxlen,
+                   eof[5]);
                DBG_PACKET(HFCUSB_DBG_VERBOSE_USB, buf, len);
        }
 
@@ -909,7 +909,7 @@ rx_int_complete(struct urb *urb)
 
 /* start initial INT-URB for certain fifo */
 static void
-start_int_fifo(usb_fifo * fifo)
+start_int_fifo(usb_fifo *fifo)
 {
        int errcode;
 
@@ -936,7 +936,7 @@ start_int_fifo(usb_fifo * fifo)
 }
 
 static void
-setup_bchannel(hfcusb_data * hfc, int channel, int mode)
+setup_bchannel(hfcusb_data *hfc, int channel, int mode)
 {
        __u8 val, idx_table[2] = { 0, 2 };
 
@@ -999,100 +999,100 @@ hfc_usb_l2l1(struct hisax_if *my_hisax_if, int pr, void *arg)
        hfcusb_data *hfc = fifo->hfc;
 
        switch (pr) {
-               case PH_ACTIVATE | REQUEST:
-                       if (fifo->fifonum == HFCUSB_D_TX) {
+       case PH_ACTIVATE | REQUEST:
+               if (fifo->fifonum == HFCUSB_D_TX) {
+                       DBG(HFCUSB_DBG_STATES,
+                           "HFC_USB: hfc_usb_d_l2l1 D-chan: PH_ACTIVATE | REQUEST");
+
+                       if (hfc->l1_state != 3
+                           && hfc->l1_state != 7) {
+                               hfc->d_if.ifc.l1l2(&hfc->d_if.ifc,
+                                                  PH_DEACTIVATE |
+                                                  INDICATION,
+                                                  NULL);
                                DBG(HFCUSB_DBG_STATES,
-                                   "HFC_USB: hfc_usb_d_l2l1 D-chan: PH_ACTIVATE | REQUEST");
-
-                               if (hfc->l1_state != 3
-                                   && hfc->l1_state != 7) {
-                                       hfc->d_if.ifc.l1l2(&hfc->d_if.ifc,
-                                                          PH_DEACTIVATE |
+                                   "HFC-S USB: PH_DEACTIVATE | INDICATION sent (not state 3 or 7)");
+                       } else {
+                               if (hfc->l1_state == 7) {       /* l1 already active */
+                                       hfc->d_if.ifc.l1l2(&hfc->
+                                                          d_if.
+                                                          ifc,
+                                                          PH_ACTIVATE
+                                                          |
                                                           INDICATION,
                                                           NULL);
                                        DBG(HFCUSB_DBG_STATES,
-                                           "HFC-S USB: PH_DEACTIVATE | INDICATION sent (not state 3 or 7)");
+                                           "HFC-S USB: PH_ACTIVATE | INDICATION sent again ;)");
                                } else {
-                                       if (hfc->l1_state == 7) {       /* l1 already active */
-                                               hfc->d_if.ifc.l1l2(&hfc->
-                                                                  d_if.
-                                                                  ifc,
-                                                                  PH_ACTIVATE
-                                                                  |
-                                                                  INDICATION,
-                                                                  NULL);
-                                               DBG(HFCUSB_DBG_STATES,
-                                                   "HFC-S USB: PH_ACTIVATE | INDICATION sent again ;)");
-                                       } else {
-                                               /* force sending sending INFO1 */
-                                               queue_control_request(hfc,
-                                                                     HFCUSB_STATES,
-                                                                     0x14,
-                                                                     1);
-                                               mdelay(1);
-                                               /* start l1 activation */
-                                               queue_control_request(hfc,
-                                                                     HFCUSB_STATES,
-                                                                     0x04,
-                                                                     1);
-                                               if (!timer_pending
-                                                   (&hfc->t3_timer)) {
-                                                       hfc->t3_timer.
-                                                           expires =
-                                                           jiffies +
-                                                           (HFC_TIMER_T3 *
-                                                            HZ) / 1000;
-                                                       add_timer(&hfc->
-                                                                 t3_timer);
-                                               }
+                                       /* force sending sending INFO1 */
+                                       queue_control_request(hfc,
+                                                             HFCUSB_STATES,
+                                                             0x14,
+                                                             1);
+                                       mdelay(1);
+                                       /* start l1 activation */
+                                       queue_control_request(hfc,
+                                                             HFCUSB_STATES,
+                                                             0x04,
+                                                             1);
+                                       if (!timer_pending
+                                           (&hfc->t3_timer)) {
+                                               hfc->t3_timer.
+                                                       expires =
+                                                       jiffies +
+                                                       (HFC_TIMER_T3 *
+                                                        HZ) / 1000;
+                                               add_timer(&hfc->
+                                                         t3_timer);
                                        }
                                }
-                       } else {
-                               DBG(HFCUSB_DBG_STATES,
-                                   "HFC_USB: hfc_usb_d_l2l1 B-chan: PH_ACTIVATE | REQUEST");
-                               setup_bchannel(hfc,
-                                           (fifo->fifonum ==
-                                            HFCUSB_B1_TX) ? 0 : 1,
-                                           (long) arg);
-                               fifo->hif->l1l2(fifo->hif,
-                                               PH_ACTIVATE | INDICATION,
-                                               NULL);
-                       }
-                       break;
-               case PH_DEACTIVATE | REQUEST:
-                       if (fifo->fifonum == HFCUSB_D_TX) {
-                               DBG(HFCUSB_DBG_STATES,
-                                   "HFC_USB: hfc_usb_d_l2l1 D-chan: PH_DEACTIVATE | REQUEST");
-                       } else {
-                               DBG(HFCUSB_DBG_STATES,
-                                   "HFC_USB: hfc_usb_d_l2l1 Bx-chan: PH_DEACTIVATE | REQUEST");
-                               setup_bchannel(hfc,
-                                           (fifo->fifonum ==
-                                            HFCUSB_B1_TX) ? 0 : 1,
-                                           (int) L1_MODE_NULL);
-                               fifo->hif->l1l2(fifo->hif,
-                                               PH_DEACTIVATE | INDICATION,
-                                               NULL);
-                       }
-                       break;
-               case PH_DATA | REQUEST:
-                       if (fifo->skbuff && fifo->delete_flg) {
-                               dev_kfree_skb_any(fifo->skbuff);
-                               fifo->skbuff = NULL;
-                               fifo->delete_flg = 0;
                        }
-                       fifo->skbuff = arg;     /* we have a new buffer */
-                       break;
-               default:
+               } else {
+                       DBG(HFCUSB_DBG_STATES,
+                           "HFC_USB: hfc_usb_d_l2l1 B-chan: PH_ACTIVATE | REQUEST");
+                       setup_bchannel(hfc,
+                                      (fifo->fifonum ==
+                                       HFCUSB_B1_TX) ? 0 : 1,
+                                      (long) arg);
+                       fifo->hif->l1l2(fifo->hif,
+                                       PH_ACTIVATE | INDICATION,
+                                       NULL);
+               }
+               break;
+       case PH_DEACTIVATE | REQUEST:
+               if (fifo->fifonum == HFCUSB_D_TX) {
+                       DBG(HFCUSB_DBG_STATES,
+                           "HFC_USB: hfc_usb_d_l2l1 D-chan: PH_DEACTIVATE | REQUEST");
+               } else {
                        DBG(HFCUSB_DBG_STATES,
-                              "HFC_USB: hfc_usb_d_l2l1: unknown state : %#x", pr);
-                       break;
+                           "HFC_USB: hfc_usb_d_l2l1 Bx-chan: PH_DEACTIVATE | REQUEST");
+                       setup_bchannel(hfc,
+                                      (fifo->fifonum ==
+                                       HFCUSB_B1_TX) ? 0 : 1,
+                                      (int) L1_MODE_NULL);
+                       fifo->hif->l1l2(fifo->hif,
+                                       PH_DEACTIVATE | INDICATION,
+                                       NULL);
+               }
+               break;
+       case PH_DATA | REQUEST:
+               if (fifo->skbuff && fifo->delete_flg) {
+                       dev_kfree_skb_any(fifo->skbuff);
+                       fifo->skbuff = NULL;
+                       fifo->delete_flg = 0;
+               }
+               fifo->skbuff = arg;     /* we have a new buffer */
+               break;
+       default:
+               DBG(HFCUSB_DBG_STATES,
+                   "HFC_USB: hfc_usb_d_l2l1: unknown state : %#x", pr);
+               break;
        }
 }
 
 /* initial init HFC-S USB chip registers, HiSax interface, USB URBs */
 static int
-hfc_usb_init(hfcusb_data * hfc)
+hfc_usb_init(hfcusb_data *hfc)
 {
        usb_fifo *fifo;
        int i;
@@ -1138,7 +1138,7 @@ hfc_usb_init(hfcusb_data * hfc)
                write_usb(hfc, HFCUSB_FIFO, i); /* select the desired fifo */
                fifo[i].skbuff = NULL;  /* init buffer pointer */
                fifo[i].max_size =
-                   (i <= HFCUSB_B2_RX) ? MAX_BCH_SIZE : MAX_DFRAME_LEN;
+                       (i <= HFCUSB_B2_RX) ? MAX_BCH_SIZE : MAX_DFRAME_LEN;
                fifo[i].last_urblen = 0;
                /* set 2 bit for D- & E-channel */
                write_usb(hfc, HFCUSB_HDLC_PAR,
@@ -1185,7 +1185,7 @@ hfc_usb_init(hfcusb_data * hfc)
        usb_fill_control_urb(hfc->ctrl_urb,
                             hfc->dev,
                             hfc->ctrl_out_pipe,
-                            (u_char *) & hfc->ctrl_write,
+                            (u_char *)&hfc->ctrl_write,
                             NULL, 0, ctrl_complete, hfc);
        /* Init All Fifos */
        for (i = 0; i < HFCUSB_NUM_FIFOS; i++) {
@@ -1264,9 +1264,9 @@ hfc_usb_probe(struct usb_interface *intf, const struct usb_device_id *id)
        struct usb_host_endpoint *ep;
        int ifnum = iface->desc.bInterfaceNumber;
        int i, idx, alt_idx, probe_alt_setting, vend_idx, cfg_used, *vcf,
-           attr, cfg_found, cidx, ep_addr;
+               attr, cfg_found, cidx, ep_addr;
        int cmptbl[16], small_match, iso_packet_size, packet_size,
-           alt_used = 0;
+               alt_used = 0;
        hfcsusb_vdata *driver_info;
 
        vend_idx = 0xffff;
@@ -1309,7 +1309,7 @@ hfc_usb_probe(struct usb_interface *intf, const struct usb_device_id *id)
                                for (i = 0; i < iface->desc.bNumEndpoints;
                                     i++) {
                                        ep_addr =
-                                           ep->desc.bEndpointAddress;
+                                               ep->desc.bEndpointAddress;
                                        /* get endpoint base */
                                        idx = ((ep_addr & 0x7f) - 1) * 2;
                                        if (ep_addr & 0x80)
@@ -1345,7 +1345,7 @@ hfc_usb_probe(struct usb_interface *intf, const struct usb_device_id *id)
                                        if (cfg_used < small_match) {
                                                small_match = cfg_used;
                                                alt_used =
-                                                   probe_alt_setting;
+                                                       probe_alt_setting;
                                                iface_used = iface;
                                        }
                                }
@@ -1376,95 +1376,95 @@ hfc_usb_probe(struct usb_interface *intf, const struct usb_device_id *id)
                                if (vcf[idx] != EP_NOP
                                    && vcf[idx] != EP_NUL) {
                                        switch (attr) {
-                                               case USB_ENDPOINT_XFER_INT:
-                                                       context->
-                                                           fifos[cidx].
-                                                           pipe =
-                                                           usb_rcvintpipe
-                                                           (dev,
-                                                            ep->desc.
-                                                            bEndpointAddress);
+                                       case USB_ENDPOINT_XFER_INT:
+                                               context->
+                                                       fifos[cidx].
+                                                       pipe =
+                                                       usb_rcvintpipe
+                                                       (dev,
+                                                        ep->desc.
+                                                        bEndpointAddress);
+                                               context->
+                                                       fifos[cidx].
+                                                       usb_transfer_mode
+                                                       = USB_INT;
+                                               packet_size =
+                                                       le16_to_cpu(ep->desc.wMaxPacketSize);
+                                               break;
+                                       case USB_ENDPOINT_XFER_BULK:
+                                               if (ep_addr & 0x80)
                                                        context->
-                                                           fifos[cidx].
-                                                           usb_transfer_mode
-                                                           = USB_INT;
-                                                       packet_size =
-                                                           le16_to_cpu(ep->desc.wMaxPacketSize);
-                                                       break;
-                                               case USB_ENDPOINT_XFER_BULK:
-                                                       if (ep_addr & 0x80)
-                                                               context->
-                                                                   fifos
-                                                                   [cidx].
-                                                                   pipe =
-                                                                   usb_rcvbulkpipe
-                                                                   (dev,
-                                                                    ep->
-                                                                    desc.
-                                                                    bEndpointAddress);
-                                                       else
-                                                               context->
-                                                                   fifos
-                                                                   [cidx].
-                                                                   pipe =
-                                                                   usb_sndbulkpipe
-                                                                   (dev,
-                                                                    ep->
-                                                                    desc.
-                                                                    bEndpointAddress);
+                                                               fifos
+                                                               [cidx].
+                                                               pipe =
+                                                               usb_rcvbulkpipe
+                                                               (dev,
+                                                                ep->
+                                                                desc.
+                                                                bEndpointAddress);
+                                               else
                                                        context->
-                                                           fifos[cidx].
-                                                           usb_transfer_mode
-                                                           = USB_BULK;
-                                                       packet_size =
-                                                           le16_to_cpu(ep->desc.wMaxPacketSize);
-                                                       break;
-                                               case USB_ENDPOINT_XFER_ISOC:
-                                                       if (ep_addr & 0x80)
-                                                               context->
-                                                                   fifos
-                                                                   [cidx].
-                                                                   pipe =
-                                                                   usb_rcvisocpipe
-                                                                   (dev,
-                                                                    ep->
-                                                                    desc.
-                                                                    bEndpointAddress);
-                                                       else
-                                                               context->
-                                                                   fifos
-                                                                   [cidx].
-                                                                   pipe =
-                                                                   usb_sndisocpipe
-                                                                   (dev,
-                                                                    ep->
-                                                                    desc.
-                                                                    bEndpointAddress);
+                                                               fifos
+                                                               [cidx].
+                                                               pipe =
+                                                               usb_sndbulkpipe
+                                                               (dev,
+                                                                ep->
+                                                                desc.
+                                                                bEndpointAddress);
+                                               context->
+                                                       fifos[cidx].
+                                                       usb_transfer_mode
+                                                       = USB_BULK;
+                                               packet_size =
+                                                       le16_to_cpu(ep->desc.wMaxPacketSize);
+                                               break;
+                                       case USB_ENDPOINT_XFER_ISOC:
+                                               if (ep_addr & 0x80)
                                                        context->
-                                                           fifos[cidx].
-                                                           usb_transfer_mode
-                                                           = USB_ISOC;
-                                                       iso_packet_size =
-                                                           le16_to_cpu(ep->desc.wMaxPacketSize);
-                                                       break;
-                                               default:
+                                                               fifos
+                                                               [cidx].
+                                                               pipe =
+                                                               usb_rcvisocpipe
+                                                               (dev,
+                                                                ep->
+                                                                desc.
+                                                                bEndpointAddress);
+                                               else
                                                        context->
-                                                           fifos[cidx].
-                                                           pipe = 0;
+                                                               fifos
+                                                               [cidx].
+                                                               pipe =
+                                                               usb_sndisocpipe
+                                                               (dev,
+                                                                ep->
+                                                                desc.
+                                                                bEndpointAddress);
+                                               context->
+                                                       fifos[cidx].
+                                                       usb_transfer_mode
+                                                       = USB_ISOC;
+                                               iso_packet_size =
+                                                       le16_to_cpu(ep->desc.wMaxPacketSize);
+                                               break;
+                                       default:
+                                               context->
+                                                       fifos[cidx].
+                                                       pipe = 0;
                                        }       /* switch attribute */
 
                                        if (context->fifos[cidx].pipe) {
                                                context->fifos[cidx].
-                                                   fifonum = cidx;
+                                                       fifonum = cidx;
                                                context->fifos[cidx].hfc =
-                                                   context;
+                                                       context;
                                                context->fifos[cidx].usb_packet_maxlen =
-                                                   le16_to_cpu(ep->desc.wMaxPacketSize);
+                                                       le16_to_cpu(ep->desc.wMaxPacketSize);
                                                context->fifos[cidx].
-                                                   intervall =
-                                                   ep->desc.bInterval;
+                                                       intervall =
+                                                       ep->desc.bInterval;
                                                context->fifos[cidx].
-                                                   skbuff = NULL;
+                                                       skbuff = NULL;
                                        }
                                }
                                ep++;
@@ -1480,14 +1480,14 @@ hfc_usb_probe(struct usb_interface *intf, const struct usb_device_id *id)
 
                        /* create the control pipes needed for register access */
                        context->ctrl_in_pipe =
-                           usb_rcvctrlpipe(context->dev, 0);
+                               usb_rcvctrlpipe(context->dev, 0);
                        context->ctrl_out_pipe =
-                           usb_sndctrlpipe(context->dev, 0);
+                               usb_sndctrlpipe(context->dev, 0);
                        context->ctrl_urb = usb_alloc_urb(0, GFP_KERNEL);
 
                        driver_info =
-                           (hfcsusb_vdata *) hfcusb_idtab[vend_idx].
-                           driver_info;
+                               (hfcsusb_vdata *) hfcusb_idtab[vend_idx].
+                               driver_info;
                        printk(KERN_INFO "HFC-S USB: detected \"%s\"\n",
                               driver_info->vend_name);
 
index 2f581c0..f987bf8 100644 (file)
 #define SINK_MIN       48
 #define SINK_DMIN      12
 #define SINK_DMAX      18
-#define BITLINE_INF    (-64*8)
+#define BITLINE_INF    (-64 * 8)
 
 /* HFC-S USB register access by Control-URSs */
-#define write_usb(a,b,c)usb_control_msg((a)->dev,(a)->ctrl_out_pipe,0,0x40,(c),(b),NULL,0,HFC_CTRL_TIMEOUT)
-#define read_usb(a,b,c) usb_control_msg((a)->dev,(a)->ctrl_in_pipe,1,0xC0,0,(b),(c),1,HFC_CTRL_TIMEOUT)
+#define write_usb(a, b, c) usb_control_msg((a)->dev, (a)->ctrl_out_pipe, 0, 0x40, (c), (b), NULL, 0, HFC_CTRL_TIMEOUT)
+#define read_usb(a, b, c) usb_control_msg((a)->dev, (a)->ctrl_in_pipe, 1, 0xC0, 0, (b), (c), 1, HFC_CTRL_TIMEOUT)
 #define HFC_CTRL_BUFSIZE 32
 
 /* entry and size of output/input control buffer */
@@ -200,8 +200,8 @@ typedef struct {
 #define LED_B2_OFF     9
 #define LED_B2_DATA    10
 
-#define LED_NORMAL     0       // LEDs are normal
-#define LED_INVERTED   1       // LEDs are inverted
+#define LED_NORMAL     0       // LEDs are normal
+#define LED_INVERTED   1       // LEDs are inverted
 
 
 #endif // __HFC_USB_H__
index 20d7688..a5f048b 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Author       Karsten Keil
  * Copyright    by Karsten Keil      <keil@isdn4linux.de>
- * 
+ *
  * This software may be used and distributed according to the terms
  * of the GNU General Public License, incorporated herein by reference.
  *
@@ -26,8 +26,8 @@ hfcs_interrupt(int intno, void *dev_id)
        u_long flags;
 
        spin_lock_irqsave(&cs->lock, flags);
-       if ((HFCD_ANYINT | HFCD_BUSY_NBUSY) & 
-               (stat = cs->BC_Read_Reg(cs, HFCD_DATA, HFCD_STAT))) {
+       if ((HFCD_ANYINT | HFCD_BUSY_NBUSY) &
+           (stat = cs->BC_Read_Reg(cs, HFCD_DATA, HFCD_STAT))) {
                val = cs->BC_Read_Reg(cs, HFCD_DATA, HFCD_INT_S1);
                if (cs->debug & L1_DEB_ISAC)
                        debugl1(cs, "HFCS: stat(%02x) s1(%02x)", stat, val);
@@ -106,57 +106,57 @@ hfcs_card_msg(struct IsdnCardState *cs, int mt, void *arg)
        if (cs->debug & L1_DEB_ISAC)
                debugl1(cs, "HFCS: card_msg %x", mt);
        switch (mt) {
-               case CARD_RESET:
-                       spin_lock_irqsave(&cs->lock, flags);
-                       reset_hfcs(cs);
-                       spin_unlock_irqrestore(&cs->lock, flags);
-                       return(0);
-               case CARD_RELEASE:
-                       release_io_hfcs(cs);
-                       return(0);
-               case CARD_INIT:
-                       delay = (75*HZ)/100 +1;
-                       mod_timer(&cs->hw.hfcD.timer, jiffies + delay);
-                       spin_lock_irqsave(&cs->lock, flags);
-                       reset_hfcs(cs);
-                       init2bds0(cs);
-                       spin_unlock_irqrestore(&cs->lock, flags);
-                       delay = (80*HZ)/1000 +1;
-                       msleep(80);
-                       spin_lock_irqsave(&cs->lock, flags);
-                       cs->hw.hfcD.ctmt |= HFCD_TIM800;
-                       cs->BC_Write_Reg(cs, HFCD_DATA, HFCD_CTMT, cs->hw.hfcD.ctmt); 
-                       cs->BC_Write_Reg(cs, HFCD_DATA, HFCD_MST_MODE, cs->hw.hfcD.mst_m);
-                       spin_unlock_irqrestore(&cs->lock, flags);
-                       return(0);
-               case CARD_TEST:
-                       return(0);
+       case CARD_RESET:
+               spin_lock_irqsave(&cs->lock, flags);
+               reset_hfcs(cs);
+               spin_unlock_irqrestore(&cs->lock, flags);
+               return (0);
+       case CARD_RELEASE:
+               release_io_hfcs(cs);
+               return (0);
+       case CARD_INIT:
+               delay = (75 * HZ) / 100 + 1;
+               mod_timer(&cs->hw.hfcD.timer, jiffies + delay);
+               spin_lock_irqsave(&cs->lock, flags);
+               reset_hfcs(cs);
+               init2bds0(cs);
+               spin_unlock_irqrestore(&cs->lock, flags);
+               delay = (80 * HZ) / 1000 + 1;
+               msleep(80);
+               spin_lock_irqsave(&cs->lock, flags);
+               cs->hw.hfcD.ctmt |= HFCD_TIM800;
+               cs->BC_Write_Reg(cs, HFCD_DATA, HFCD_CTMT, cs->hw.hfcD.ctmt);
+               cs->BC_Write_Reg(cs, HFCD_DATA, HFCD_MST_MODE, cs->hw.hfcD.mst_m);
+               spin_unlock_irqrestore(&cs->lock, flags);
+               return (0);
+       case CARD_TEST:
+               return (0);
        }
-       return(0);
+       return (0);
 }
 
 #ifdef __ISAPNP__
 static struct isapnp_device_id hfc_ids[] __devinitdata = {
        { ISAPNP_VENDOR('A', 'N', 'X'), ISAPNP_FUNCTION(0x1114),
-         ISAPNP_VENDOR('A', 'N', 'X'), ISAPNP_FUNCTION(0x1114), 
+         ISAPNP_VENDOR('A', 'N', 'X'), ISAPNP_FUNCTION(0x1114),
          (unsigned long) "Acer P10" },
        { ISAPNP_VENDOR('B', 'I', 'L'), ISAPNP_FUNCTION(0x0002),
-         ISAPNP_VENDOR('B', 'I', 'L'), ISAPNP_FUNCTION(0x0002), 
+         ISAPNP_VENDOR('B', 'I', 'L'), ISAPNP_FUNCTION(0x0002),
          (unsigned long) "Billion 2" },
        { ISAPNP_VENDOR('B', 'I', 'L'), ISAPNP_FUNCTION(0x0001),
-         ISAPNP_VENDOR('B', 'I', 'L'), ISAPNP_FUNCTION(0x0001), 
+         ISAPNP_VENDOR('B', 'I', 'L'), ISAPNP_FUNCTION(0x0001),
          (unsigned long) "Billion 1" },
        { ISAPNP_VENDOR('T', 'A', 'G'), ISAPNP_FUNCTION(0x7410),
-         ISAPNP_VENDOR('T', 'A', 'G'), ISAPNP_FUNCTION(0x7410), 
+         ISAPNP_VENDOR('T', 'A', 'G'), ISAPNP_FUNCTION(0x7410),
          (unsigned long) "IStar PnP" },
        { ISAPNP_VENDOR('T', 'A', 'G'), ISAPNP_FUNCTION(0x2610),
-         ISAPNP_VENDOR('T', 'A', 'G'), ISAPNP_FUNCTION(0x2610), 
+         ISAPNP_VENDOR('T', 'A', 'G'), ISAPNP_FUNCTION(0x2610),
          (unsigned long) "Teles 16.3c" },
        { ISAPNP_VENDOR('S', 'F', 'M'), ISAPNP_FUNCTION(0x0001),
-         ISAPNP_VENDOR('S', 'F', 'M'), ISAPNP_FUNCTION(0x0001), 
+         ISAPNP_VENDOR('S', 'F', 'M'), ISAPNP_FUNCTION(0x0001),
          (unsigned long) "Tornado Tipa C" },
        { ISAPNP_VENDOR('K', 'Y', 'E'), ISAPNP_FUNCTION(0x0001),
-         ISAPNP_VENDOR('K', 'Y', 'E'), ISAPNP_FUNCTION(0x0001), 
+         ISAPNP_VENDOR('K', 'Y', 'E'), ISAPNP_FUNCTION(0x0001),
          (unsigned long) "Genius Speed Surfer" },
        { 0, }
 };
@@ -177,30 +177,30 @@ setup_hfcs(struct IsdnCard *card)
 #ifdef __ISAPNP__
        if (!card->para[1] && isapnp_present()) {
                struct pnp_dev *pnp_d;
-               while(ipid->card_vendor) {
+               while (ipid->card_vendor) {
                        if ((pnp_c = pnp_find_card(ipid->card_vendor,
-                               ipid->card_device, pnp_c))) {
+                                                  ipid->card_device, pnp_c))) {
                                pnp_d = NULL;
                                if ((pnp_d = pnp_find_dev(pnp_c,
-                                       ipid->vendor, ipid->function, pnp_d))) {
+                                                         ipid->vendor, ipid->function, pnp_d))) {
                                        int err;
 
                                        printk(KERN_INFO "HiSax: %s detected\n",
-                                               (char *)ipid->driver_data);
+                                              (char *)ipid->driver_data);
                                        pnp_disable_dev(pnp_d);
                                        err = pnp_activate_dev(pnp_d);
-                                       if (err<0) {
+                                       if (err < 0) {
                                                printk(KERN_WARNING "%s: pnp_activate_dev ret(%d)\n",
-                                                       __func__, err);
-                                               return(0);
+                                                      __func__, err);
+                                               return (0);
                                        }
                                        card->para[1] = pnp_port_start(pnp_d, 0);
                                        card->para[0] = pnp_irq(pnp_d, 0);
                                        if (!card->para[0] || !card->para[1]) {
                                                printk(KERN_ERR "HFC PnP:some resources are missing %ld/%lx\n",
-                                                       card->para[0], card->para[1]);
+                                                      card->para[0], card->para[1]);
                                                pnp_disable_dev(pnp_d);
-                                               return(0);
+                                               return (0);
                                        }
                                        break;
                                } else {
@@ -209,10 +209,10 @@ setup_hfcs(struct IsdnCard *card)
                        }
                        ipid++;
                        pnp_c = NULL;
-               } 
+               }
                if (!ipid->card_vendor) {
                        printk(KERN_INFO "HFC PnP: no ISAPnP card found\n");
-                       return(0);
+                       return (0);
                }
        }
 #endif
@@ -229,7 +229,7 @@ setup_hfcs(struct IsdnCard *card)
        if (cs->typ == ISDN_CTYPE_TELES3C) {
                cs->hw.hfcD.bfifosize = 1024 + 512;
        } else if (cs->typ == ISDN_CTYPE_ACERP10) {
-               cs->hw.hfcD.bfifosize = 7*1024 + 512;
+               cs->hw.hfcD.bfifosize = 7 * 1024 + 512;
        } else
                return (0);
        if (!request_region(cs->hw.hfcD.addr, 2, "HFCS isdn")) {
index aff45a1..6ead631 100644 (file)
@@ -133,15 +133,15 @@ extern const char *tei_revision;
 
 /* include l3dss1 & ni1 specific process structures, but no other defines */
 #ifdef CONFIG_HISAX_EURO
-  #define l3dss1_process
-  #include "l3dss1.h" 
-  #undef  l3dss1_process
+#define l3dss1_process
+#include "l3dss1.h"
+#undef  l3dss1_process
 #endif /* CONFIG_HISAX_EURO */
 
 #ifdef CONFIG_HISAX_NI1
-  #define l3ni1_process
-  #include "l3ni1.h" 
-  #undef  l3ni1_process
+#define l3ni1_process
+#include "l3ni1.h"
+#undef  l3ni1_process
 #endif /* CONFIG_HISAX_NI1 */
 
 #define MAX_DFRAME_LEN 260
@@ -149,7 +149,7 @@ extern const char *tei_revision;
 #define HSCX_BUFMAX    4096
 #define MAX_DATA_SIZE  (HSCX_BUFMAX - 4)
 #define MAX_DATA_MEM   (HSCX_BUFMAX + 64)
-#define RAW_BUFMAX     (((HSCX_BUFMAX*6)/5) + 5)
+#define RAW_BUFMAX     (((HSCX_BUFMAX * 6) / 5) + 5)
 #define MAX_HEADER_LEN 4
 #define MAX_WINDOW     8
 #define MAX_MON_FRAME  32
@@ -165,7 +165,7 @@ extern const char *tei_revision;
 
 struct FsmInst;
 
-typedef void (* FSMFNPTR)(struct FsmInst *, int, void *);
+typedef void (*FSMFNPTR)(struct FsmInst *, int, void *);
 
 struct Fsm {
        FSMFNPTR *jumpmatrix;
@@ -272,10 +272,10 @@ struct Layer2 {
 
 struct Layer3 {
        void (*l3l4) (struct PStack *, int, void *);
-        void (*l3ml3) (struct PStack *, int, void *);
+       void (*l3ml3) (struct PStack *, int, void *);
        void (*l3l2) (struct PStack *, int, void *);
        struct FsmInst l3m;
-        struct FsmTimer l3m_timer;
+       struct FsmTimer l3m_timer;
        struct sk_buff_head squeue;
        struct l3_process *proc;
        struct l3_process *global;
@@ -286,7 +286,7 @@ struct Layer3 {
 
 struct LLInterface {
        void (*l4l3) (struct PStack *, int, void *);
-        int  (*l4l3_proto) (struct PStack *, isdn_ctrl *);
+       int  (*l4l3_proto) (struct PStack *, isdn_ctrl *);
        void *userdata;
        u_long flag;
 };
@@ -325,16 +325,16 @@ struct PStack {
        struct Management ma;
        int protocol;           /* EDSS1, 1TR6 or NI1 */
 
-        /* protocol specific data fields */
-        union
-        { u_char uuuu; /* only as dummy */
+       /* protocol specific data fields */
+       union
+       { u_char uuuu; /* only as dummy */
 #ifdef CONFIG_HISAX_EURO
-           dss1_stk_priv dss1; /* private dss1 data */
-#endif /* CONFIG_HISAX_EURO */              
+               dss1_stk_priv dss1; /* private dss1 data */
+#endif /* CONFIG_HISAX_EURO */
 #ifdef CONFIG_HISAX_NI1
-           ni1_stk_priv ni1; /* private ni1 data */
-#endif /* CONFIG_HISAX_NI1 */             
-        } prot;
+               ni1_stk_priv ni1; /* private ni1 data */
+#endif /* CONFIG_HISAX_NI1 */
+       } prot;
 };
 
 struct l3_process {
@@ -347,18 +347,18 @@ struct l3_process {
        struct Channel *chan;
        struct PStack *st;
        struct l3_process *next;
-        ulong redir_result;
-
-        /* protocol specific data fields */
-        union 
-        { u_char uuuu; /* only when euro not defined, avoiding empty union */
-#ifdef CONFIG_HISAX_EURO 
-           dss1_proc_priv dss1; /* private dss1 data */
-#endif /* CONFIG_HISAX_EURO */            
+       ulong redir_result;
+
+       /* protocol specific data fields */
+       union
+       { u_char uuuu; /* only when euro not defined, avoiding empty union */
+#ifdef CONFIG_HISAX_EURO
+               dss1_proc_priv dss1; /* private dss1 data */
+#endif /* CONFIG_HISAX_EURO */
 #ifdef CONFIG_HISAX_NI1
-           ni1_proc_priv ni1; /* private ni1 data */
-#endif /* CONFIG_HISAX_NI1 */             
-        } prot;
+               ni1_proc_priv ni1; /* private ni1 data */
+#endif /* CONFIG_HISAX_NI1 */
+       } prot;
 };
 
 struct hscx_hw {
@@ -642,7 +642,7 @@ struct hfc_hw {
        unsigned char cip;
        u_char isac_spcr;
        struct timer_list timer;
-};     
+};
 
 struct sedl_hw {
        unsigned int cfg_reg;
@@ -693,25 +693,25 @@ struct hfcPCI_hw {
        unsigned char int_m2;
        unsigned char int_s1;
        unsigned char sctrl;
-        unsigned char sctrl_r;
-        unsigned char sctrl_e;
-        unsigned char trm;
+       unsigned char sctrl_r;
+       unsigned char sctrl_e;
+       unsigned char trm;
        unsigned char stat;
        unsigned char fifo;
-        unsigned char fifo_en;
-        unsigned char bswapped;
-        unsigned char nt_mode;
-        int nt_timer;
-        struct pci_dev *dev;
-        unsigned char *pci_io; /* start of PCI IO memory */
+       unsigned char fifo_en;
+       unsigned char bswapped;
+       unsigned char nt_mode;
+       int nt_timer;
+       struct pci_dev *dev;
+       unsigned char *pci_io; /* start of PCI IO memory */
        dma_addr_t dma; /* dma handle for Fifos */
-        void *fifos; /* FIFO memory */ 
-        int last_bfifo_cnt[2]; /* marker saving last b-fifo frame count */
+       void *fifos; /* FIFO memory */
+       int last_bfifo_cnt[2]; /* marker saving last b-fifo frame count */
        struct timer_list timer;
 };
 
 struct hfcSX_hw {
-        unsigned long base;
+       unsigned long base;
        unsigned char cirm;
        unsigned char ctmt;
        unsigned char conn;
@@ -720,18 +720,18 @@ struct hfcSX_hw {
        unsigned char int_m2;
        unsigned char int_s1;
        unsigned char sctrl;
-        unsigned char sctrl_r;
-        unsigned char sctrl_e;
-        unsigned char trm;
+       unsigned char sctrl_r;
+       unsigned char sctrl_e;
+       unsigned char trm;
        unsigned char stat;
        unsigned char fifo;
-        unsigned char bswapped;
-        unsigned char nt_mode;
-        unsigned char chip;
-        int b_fifo_size;
-        unsigned char last_fifo;
-        void *extra;
-        int nt_timer;
+       unsigned char bswapped;
+       unsigned char nt_mode;
+       unsigned char chip;
+       int b_fifo_size;
+       unsigned char last_fifo;
+       void *extra;
+       int nt_timer;
        struct timer_list timer;
 };
 
@@ -784,13 +784,13 @@ struct bkm_hw {
        /* Scitel Quadro stuff */
        unsigned long plx_adr;
        unsigned long data_adr;
-};     
+};
 
 struct gazel_hw {
        struct pci_dev *dev;
        unsigned int cfg_reg;
        unsigned int pciaddr[2];
-        signed   int ipac;
+       signed   int ipac;
        signed   int isac;
        signed   int hscx[2];
        signed   int isacfifo;
@@ -877,8 +877,8 @@ struct icc_chip {
 #define HW_ARCOFI              3
 #define FLG_TWO_DCHAN          4
 #define FLG_L1_DBUSY           5
-#define FLG_DBUSY_TIMER        6
-#define FLG_LOCK_ATOMIC        7
+#define FLG_DBUSY_TIMER                6
+#define FLG_LOCK_ATOMIC                7
 #define FLG_ARCOFI_TIMER       8
 #define FLG_ARCOFI_ERROR       9
 #define FLG_HW_L1_UINT         10
@@ -892,8 +892,8 @@ struct IsdnCardState {
        u_long          irq_flags;
        u_long          HW_Flags;
        int             *busy_flag;
-        int            chanlimit; /* limited number of B-chans to use */
-        int            logecho; /* log echo if supported by card */
+       int             chanlimit; /* limited number of B-chans to use */
+       int             logecho; /* log echo if supported by card */
        union {
                struct elsa_hw elsa;
                struct teles0_hw teles0;
@@ -937,8 +937,8 @@ struct IsdnCardState {
        void            (*DC_Close) (struct IsdnCardState *);
        irq_handler_t   irq_func;
        int             (*auxcmd) (struct IsdnCardState *, isdn_ctrl *);
-       struct Channel  channel[2+MAX_WAITING_CALLS];
-       struct BCState  bcs[2+MAX_WAITING_CALLS];
+       struct Channel  channel[2 + MAX_WAITING_CALLS];
+       struct BCState  bcs[2 + MAX_WAITING_CALLS];
        struct PStack   *stlist;
        struct sk_buff_head rq, sq; /* D-channel queues */
        int             cardnr;
@@ -969,7 +969,7 @@ struct IsdnCardState {
 };
 
 
-#define  schedule_event(s, ev) do {test_and_set_bit(ev, &s->event);schedule_work(&s->tqueue); } while(0)
+#define schedule_event(s, ev)  do { test_and_set_bit(ev, &s->event); schedule_work(&s->tqueue); } while (0)
 
 #define  MON0_RX       1
 #define  MON1_RX       2
@@ -1053,7 +1053,7 @@ struct IsdnCardState {
 #define CARD_IX1MICROR2 0
 #endif
 
-#ifdef  CONFIG_HISAX_DIEHLDIVA
+#ifdef CONFIG_HISAX_DIEHLDIVA
 #define CARD_DIEHLDIVA 1
 #ifndef ISDN_CHIP_ISAC
 #define ISDN_CHIP_ISAC 1
@@ -1062,7 +1062,7 @@ struct IsdnCardState {
 #define CARD_DIEHLDIVA 0
 #endif
 
-#ifdef  CONFIG_HISAX_ASUSCOM
+#ifdef CONFIG_HISAX_ASUSCOM
 #define CARD_ASUSCOM 1
 #ifndef ISDN_CHIP_ISAC
 #define ISDN_CHIP_ISAC 1
@@ -1071,7 +1071,7 @@ struct IsdnCardState {
 #define CARD_ASUSCOM 0
 #endif
 
-#ifdef  CONFIG_HISAX_TELEINT
+#ifdef CONFIG_HISAX_TELEINT
 #define CARD_TELEINT 1
 #ifndef ISDN_CHIP_ISAC
 #define ISDN_CHIP_ISAC 1
@@ -1080,7 +1080,7 @@ struct IsdnCardState {
 #define CARD_TELEINT 0
 #endif
 
-#ifdef  CONFIG_HISAX_SEDLBAUER
+#ifdef CONFIG_HISAX_SEDLBAUER
 #define CARD_SEDLBAUER 1
 #ifndef ISDN_CHIP_ISAC
 #define ISDN_CHIP_ISAC 1
@@ -1089,7 +1089,7 @@ struct IsdnCardState {
 #define CARD_SEDLBAUER 0
 #endif
 
-#ifdef  CONFIG_HISAX_SPORTSTER
+#ifdef CONFIG_HISAX_SPORTSTER
 #define CARD_SPORTSTER 1
 #ifndef ISDN_CHIP_ISAC
 #define ISDN_CHIP_ISAC 1
@@ -1098,7 +1098,7 @@ struct IsdnCardState {
 #define CARD_SPORTSTER 0
 #endif
 
-#ifdef  CONFIG_HISAX_MIC
+#ifdef CONFIG_HISAX_MIC
 #define CARD_MIC 1
 #ifndef ISDN_CHIP_ISAC
 #define ISDN_CHIP_ISAC 1
@@ -1107,7 +1107,7 @@ struct IsdnCardState {
 #define CARD_MIC 0
 #endif
 
-#ifdef  CONFIG_HISAX_NETJET
+#ifdef CONFIG_HISAX_NETJET
 #define CARD_NETJET_S 1
 #ifndef ISDN_CHIP_ISAC
 #define ISDN_CHIP_ISAC 1
@@ -1206,7 +1206,7 @@ struct IsdnCardState {
 #define        CARD_W6692      0
 #endif
 
-#ifdef  CONFIG_HISAX_NETJET_U
+#ifdef CONFIG_HISAX_NETJET_U
 #define CARD_NETJET_U 1
 #ifndef ISDN_CHIP_ICC
 #define ISDN_CHIP_ICC 1
@@ -1269,8 +1269,8 @@ void setstack_l3dc(struct PStack *st, struct Channel *chanp);
 void setstack_l3bc(struct PStack *st, struct Channel *chanp);
 void releasestack_isdnl3(struct PStack *st);
 
-u_char *findie(u_char * p, int size, u_char ie, int wanted_set);
-int getcallref(u_char * p);
+u_char *findie(u_char *p, int size, u_char ie, int wanted_set);
+int getcallref(u_char *p);
 int newcallref(void);
 
 int FsmNew(struct Fsm *fsm, struct FsmNode *fnlist, int fncount);
@@ -1279,36 +1279,36 @@ int FsmEvent(struct FsmInst *fi, int event, void *arg);
 void FsmChangeState(struct FsmInst *fi, int newstate);
 void FsmInitTimer(struct FsmInst *fi, struct FsmTimer *ft);
 int FsmAddTimer(struct FsmTimer *ft, int millisec, int event,
-       void *arg, int where);
+               void *arg, int where);
 void FsmRestartTimer(struct FsmTimer *ft, int millisec, int event,
-       void *arg, int where);
+                    void *arg, int where);
 void FsmDelTimer(struct FsmTimer *ft, int where);
 int jiftime(char *s, long mark);
 
-int HiSax_command(isdn_ctrl * ic);
+int HiSax_command(isdn_ctrl *ic);
 int HiSax_writebuf_skb(int id, int chan, int ack, struct sk_buff *skb);
 __printf(3, 4)
 void HiSax_putstatus(struct IsdnCardState *cs, char *head, char *fmt, ...);
 __printf(3, 0)
 void VHiSax_putstatus(struct IsdnCardState *cs, char *head, char *fmt, va_list args);
 void HiSax_reportcard(int cardnr, int sel);
-int QuickHex(char *txt, u_char * p, int cnt);
-void LogFrame(struct IsdnCardState *cs, u_char * p, int size);
+int QuickHex(char *txt, u_char *p, int cnt);
+void LogFrame(struct IsdnCardState *cs, u_char *p, int size);
 void dlogframe(struct IsdnCardState *cs, struct sk_buff *skb, int dir);
-void iecpy(u_char * dest, u_char * iestart, int ieoffset);
+void iecpy(u_char *dest, u_char *iestart, int ieoffset);
 #endif /* __KERNEL__ */
 
 /*
  * Busywait delay for `jiffs' jiffies
  */
-#define HZDELAY(jiffs) do {                                    \
-               int tout = jiffs;                               \
-                                                               \
-               while (tout--) {                                \
-                       int loops = USEC_PER_SEC / HZ;          \
-                       while (loops--)                         \
-                               udelay(1);                      \
-               }                                               \
+#define HZDELAY(jiffs) do {                            \
+               int tout = jiffs;                       \
+                                                       \
+               while (tout--) {                        \
+                       int loops = USEC_PER_SEC / HZ;  \
+                       while (loops--)                 \
+                               udelay(1);              \
+               }                                       \
        } while (0)
 
 int ll_run(struct IsdnCardState *cs, int addfeatures);
index 17a2fea..487dcfe 100644 (file)
@@ -54,9 +54,9 @@ typedef struct IsdnCardState  IsdnCardState_t;
 typedef struct IsdnCard                IsdnCard_t;
 
 struct IsdnCard {
-       int             typ;
-       int             protocol;       /* EDSS1, 1TR6 or NI1 */
-       unsigned long   para[4];
+       int typ;
+       int protocol;   /* EDSS1, 1TR6 or NI1 */
+       unsigned long para[4];
        IsdnCardState_t *cs;
 };
 
index 5ed3b1c..7b3093d 100644 (file)
@@ -4,12 +4,12 @@
  * Author       Frode Isaksen
  * Copyright    2001 by Frode Isaksen      <fisaksen@bewan.com>
  *              2001 by Kai Germaschewski  <kai.germaschewski@gmx.de>
- * 
+ *
  * This software may be used and distributed according to the terms
  * of the GNU General Public License, incorporated herein by reference.
  *
  * How to use:
- * 
+ *
  * Before including this file, you need to
  *   #define __debug_variable my_debug
  * where my_debug is a variable in your code which
 
 #ifdef CONFIG_HISAX_DEBUG
 
-#define DBG(level, format, arg...) do { \
-if (level & __debug_variable) \
-printk(KERN_DEBUG "%s: " format "\n" , __func__ , ## arg); \
-} while (0)
+#define DBG(level, format, arg...) do {                                        \
+               if (level & __debug_variable)                           \
+                       printk(KERN_DEBUG "%s: " format "\n" , __func__ , ## arg); \
+       } while (0)
 
-#define DBG_PACKET(level,data,count) \
-  if (level & __debug_variable) dump_packet(__func__,data,count)
+#define DBG_PACKET(level, data, count)                                 \
+       if (level & __debug_variable) dump_packet(__func__, data, count)
 
-#define DBG_SKB(level,skb) \
-  if ((level & __debug_variable) && skb) dump_packet(__func__,skb->data,skb->len)
+#define DBG_SKB(level, skb)                                            \
+       if ((level & __debug_variable) && skb) dump_packet(__func__, skb->data, skb->len)
 
 
 static void __attribute__((unused))
-dump_packet(const char *name,const u_char *data,int pkt_len)
+dump_packet(const char *name, const u_char *data, int pkt_len)
 {
 #define DUMP_HDR_SIZE 20
 #define DUMP_TLR_SIZE 8
        if (pkt_len) {
-               int i,len1,len2;
+               int i, len1, len2;
 
-               printk(KERN_DEBUG "%s: length=%d,data=",name,pkt_len);
+               printk(KERN_DEBUG "%s: length=%d,data=", name, pkt_len);
 
-               if (pkt_len >  DUMP_HDR_SIZE+ DUMP_TLR_SIZE) {
+               if (pkt_len > DUMP_HDR_SIZE + DUMP_TLR_SIZE) {
                        len1 = DUMP_HDR_SIZE;
                        len2 = DUMP_TLR_SIZE;
                } else {
                        len1 = pkt_len > DUMP_HDR_SIZE ? DUMP_HDR_SIZE : pkt_len;
-                       len2 = 0;                       
+                       len2 = 0;
                }
                for (i = 0; i < len1; ++i) {
-                       printk ("%.2x", data[i]);
+                       printk("%.2x", data[i]);
                }
                if (len2) {
-                       printk ("..");
+                       printk("..");
                        for (i = pkt_len-DUMP_TLR_SIZE; i < pkt_len; ++i) {
-                               printk ("%.2x", data[i]);
+                               printk("%.2x", data[i]);
                        }
                }
-               printk ("\n");
+               printk("\n");
        }
 #undef DUMP_HDR_SIZE
 #undef DUMP_TLR_SIZE
@@ -72,8 +72,8 @@ dump_packet(const char *name,const u_char *data,int pkt_len)
 #else
 
 #define DBG(level, format, arg...) do {} while (0)
-#define DBG_PACKET(level,data,count) do {} while (0)
-#define DBG_SKB(level,skb) do {} while (0)
+#define DBG_PACKET(level, data, count) do {} while (0)
+#define DBG_SKB(level, skb) do {} while (0)
 
 #endif
 
index 478ebab..e4f47fe 100644 (file)
@@ -4,7 +4,7 @@
  * Author       Kai Germaschewski
  * Copyright    2001 by Kai Germaschewski  <kai.germaschewski@gmx.de>
  *              2001 by Karsten Keil       <keil@isdn4linux.de>
- * 
+ *
  * based upon Karsten Keil's original avm_pci.c driver
  *
  * This software may be used and distributed according to the terms
@@ -71,7 +71,7 @@ MODULE_DEVICE_TABLE(pci, fcpci_ids);
 
 #ifdef CONFIG_PNP
 static struct pnp_device_id fcpnp_ids[] __devinitdata = {
-       { 
+       {
                .id             = "AVM0900",
                .driver_data    = (unsigned long) "Fritz!Card PnP",
        },
@@ -153,7 +153,7 @@ MODULE_LICENSE("GPL");
 static unsigned char fcpci_read_isac(struct isac *isac, unsigned char offset)
 {
        struct fritz_adapter *adapter = isac->priv;
-       unsigned char idx = (offset > 0x2f) ? 
+       unsigned char idx = (offset > 0x2f) ?
                AVM_IDX_ISAC_REG_HIGH : AVM_IDX_ISAC_REG_LOW;
        unsigned char val;
        unsigned long flags;
@@ -161,7 +161,7 @@ static unsigned char fcpci_read_isac(struct isac *isac, unsigned char offset)
        spin_lock_irqsave(&adapter->hw_lock, flags);
        outb(idx, adapter->io + AVM_INDEX);
        val = inb(adapter->io + AVM_DATA + (offset & 0xf));
-       spin_unlock_irqrestore(&adapter->hw_lock, flags);
+       spin_unlock_irqrestore(&adapter->hw_lock, flags);
        DBG(0x1000, " port %#x, value %#x",
            offset, val);
        return val;
@@ -171,7 +171,7 @@ static void fcpci_write_isac(struct isac *isac, unsigned char offset,
                             unsigned char value)
 {
        struct fritz_adapter *adapter = isac->priv;
-       unsigned char idx = (offset > 0x2f) ? 
+       unsigned char idx = (offset > 0x2f) ?
                AVM_IDX_ISAC_REG_HIGH : AVM_IDX_ISAC_REG_LOW;
        unsigned long flags;
 
@@ -180,10 +180,10 @@ static void fcpci_write_isac(struct isac *isac, unsigned char offset,
        spin_lock_irqsave(&adapter->hw_lock, flags);
        outb(idx, adapter->io + AVM_INDEX);
        outb(value, adapter->io + AVM_DATA + (offset & 0xf));
-       spin_unlock_irqrestore(&adapter->hw_lock, flags);
+       spin_unlock_irqrestore(&adapter->hw_lock, flags);
 }
 
-static void fcpci_read_isac_fifo(struct isac *isac, unsigned char * data, 
+static void fcpci_read_isac_fifo(struct isac *isac, unsigned char *data,
                                 int size)
 {
        struct fritz_adapter *adapter = isac->priv;
@@ -192,10 +192,10 @@ static void fcpci_read_isac_fifo(struct isac *isac, unsigned char * data,
        spin_lock_irqsave(&adapter->hw_lock, flags);
        outb(AVM_IDX_ISAC_FIFO, adapter->io + AVM_INDEX);
        insb(adapter->io + AVM_DATA, data, size);
-       spin_unlock_irqrestore(&adapter->hw_lock, flags);
+       spin_unlock_irqrestore(&adapter->hw_lock, flags);
 }
 
-static void fcpci_write_isac_fifo(struct isac *isac, unsigned char * data, 
+static void fcpci_write_isac_fifo(struct isac *isac, unsigned char *data,
                                  int size)
 {
        struct fritz_adapter *adapter = isac->priv;
@@ -204,7 +204,7 @@ static void fcpci_write_isac_fifo(struct isac *isac, unsigned char * data,
        spin_lock_irqsave(&adapter->hw_lock, flags);
        outb(AVM_IDX_ISAC_FIFO, adapter->io + AVM_INDEX);
        outsb(adapter->io + AVM_DATA, data, size);
-       spin_unlock_irqrestore(&adapter->hw_lock, flags);
+       spin_unlock_irqrestore(&adapter->hw_lock, flags);
 }
 
 static u32 fcpci_read_hdlc_status(struct fritz_adapter *adapter, int nr)
@@ -254,14 +254,14 @@ static unsigned char fcpci2_read_isac(struct isac *isac, unsigned char offset)
        spin_lock_irqsave(&adapter->hw_lock, flags);
        outl(offset, adapter->io + AVM_ISACSX_INDEX);
        val = inl(adapter->io + AVM_ISACSX_DATA);
-       spin_unlock_irqrestore(&adapter->hw_lock, flags);
+       spin_unlock_irqrestore(&adapter->hw_lock, flags);
        DBG(0x1000, " port %#x, value %#x",
            offset, val);
 
        return val;
 }
 
-static void fcpci2_write_isac(struct isac *isac, unsigned char offset, 
+static void fcpci2_write_isac(struct isac *isac, unsigned char offset,
                              unsigned char value)
 {
        struct fritz_adapter *adapter = isac->priv;
@@ -272,10 +272,10 @@ static void fcpci2_write_isac(struct isac *isac, unsigned char offset,
        spin_lock_irqsave(&adapter->hw_lock, flags);
        outl(offset, adapter->io + AVM_ISACSX_INDEX);
        outl(value, adapter->io + AVM_ISACSX_DATA);
-       spin_unlock_irqrestore(&adapter->hw_lock, flags);
+       spin_unlock_irqrestore(&adapter->hw_lock, flags);
 }
 
-static void fcpci2_read_isac_fifo(struct isac *isac, unsigned char * data, 
+static void fcpci2_read_isac_fifo(struct isac *isac, unsigned char *data,
                                  int size)
 {
        struct fritz_adapter *adapter = isac->priv;
@@ -286,10 +286,10 @@ static void fcpci2_read_isac_fifo(struct isac *isac, unsigned char * data,
        outl(0, adapter->io + AVM_ISACSX_INDEX);
        for (i = 0; i < size; i++)
                data[i] = inl(adapter->io + AVM_ISACSX_DATA);
-       spin_unlock_irqrestore(&adapter->hw_lock, flags);
+       spin_unlock_irqrestore(&adapter->hw_lock, flags);
 }
 
-static void fcpci2_write_isac_fifo(struct isac *isac, unsigned char * data, 
+static void fcpci2_write_isac_fifo(struct isac *isac, unsigned char *data,
                                   int size)
 {
        struct fritz_adapter *adapter = isac->priv;
@@ -300,7 +300,7 @@ static void fcpci2_write_isac_fifo(struct isac *isac, unsigned char * data,
        outl(0, adapter->io + AVM_ISACSX_INDEX);
        for (i = 0; i < size; i++)
                outl(data[i], adapter->io + AVM_ISACSX_DATA);
-       spin_unlock_irqrestore(&adapter->hw_lock, flags);
+       spin_unlock_irqrestore(&adapter->hw_lock, flags);
 }
 
 static u32 fcpci2_read_hdlc_status(struct fritz_adapter *adapter, int nr)
@@ -349,10 +349,10 @@ static void __fcpnp_write_ctrl(struct fritz_bcs *bcs, int which)
 
        outb(idx, adapter->io + AVM_INDEX);
        if (which & 4)
-               outb(bcs->ctrl.sr.mode, 
+               outb(bcs->ctrl.sr.mode,
                     adapter->io + AVM_DATA + HDLC_STATUS + 2);
        if (which & 2)
-               outb(bcs->ctrl.sr.xml, 
+               outb(bcs->ctrl.sr.xml,
                     adapter->io + AVM_DATA + HDLC_STATUS + 1);
        if (which & 1)
                outb(bcs->ctrl.sr.cmd,
@@ -416,7 +416,7 @@ static void hdlc_fill_fifo(struct fritz_bcs *bcs)
                break;
        case AVM_FRITZ_PCIV2:
                fcpci2_write_ctrl(bcs, 3);
-               outsl(adapter->io + 
+               outsl(adapter->io +
                      (bcs->channel ? AVM_HDLC_FIFO_2 : AVM_HDLC_FIFO_1),
                      p, (count + 3) / 4);
                break;
@@ -447,12 +447,12 @@ static inline void hdlc_empty_fifo(struct fritz_bcs *bcs, int count)
        case AVM_FRITZ_PCI:
                spin_lock(&adapter->hw_lock);
                outl(idx, adapter->io + AVM_INDEX);
-               insl(adapter->io + AVM_DATA + HDLC_FIFO, 
+               insl(adapter->io + AVM_DATA + HDLC_FIFO,
                     p, (count + 3) / 4);
                spin_unlock(&adapter->hw_lock);
                break;
        case AVM_FRITZ_PCIV2:
-               insl(adapter->io + 
+               insl(adapter->io +
                     (bcs->channel ? AVM_HDLC_FIFO_2 : AVM_HDLC_FIFO_1),
                     p, (count + 3) / 4);
                break;
@@ -489,7 +489,7 @@ static inline void hdlc_rpr_irq(struct fritz_bcs *bcs, u32 stat)
        hdlc_empty_fifo(bcs, len);
 
        if ((stat & HDLC_STAT_RME) || (bcs->mode == L1_MODE_TRANS)) {
-               if (((stat & HDLC_STAT_CRCVFRRAB)== HDLC_STAT_CRCVFR) ||
+               if (((stat & HDLC_STAT_CRCVFRRAB) == HDLC_STAT_CRCVFR) ||
                    (bcs->mode == L1_MODE_TRANS)) {
                        skb = dev_alloc_skb(bcs->rcvidx);
                        if (!skb) {
@@ -512,7 +512,7 @@ static inline void hdlc_rpr_irq(struct fritz_bcs *bcs, u32 stat)
 static inline void hdlc_xdu_irq(struct fritz_bcs *bcs)
 {
        struct fritz_adapter *adapter = bcs->adapter;
-       
+
 
        /* Here we lost an TX interrupt, so
         * restart transmitting the whole frame.
@@ -587,7 +587,7 @@ static inline void hdlc_irq(struct fritz_adapter *adapter)
 static void modehdlc(struct fritz_bcs *bcs, int mode)
 {
        struct fritz_adapter *adapter = bcs->adapter;
-       
+
        DBG(0x40, "hdlc %c mode %d --> %d",
            'A' + bcs->channel, bcs->mode, mode);
 
@@ -638,12 +638,12 @@ static void fritz_b_l2l1(struct hisax_if *ifc, int pr, void *arg)
                break;
        case PH_ACTIVATE | REQUEST:
                mode = (long) arg;
-               DBG(4,"B%d,PH_ACTIVATE_REQUEST %d", bcs->channel + 1, mode);
+               DBG(4, "B%d,PH_ACTIVATE_REQUEST %d", bcs->channel + 1, mode);
                modehdlc(bcs, mode);
                B_L1L2(bcs, PH_ACTIVATE | INDICATION, NULL);
                break;
        case PH_DEACTIVATE | REQUEST:
-               DBG(4,"B%d,PH_DEACTIVATE_REQUEST", bcs->channel + 1);
+               DBG(4, "B%d,PH_DEACTIVATE_REQUEST", bcs->channel + 1);
                modehdlc(bcs, L1_MODE_NULL);
                B_L1L2(bcs, PH_DEACTIVATE | INDICATION, NULL);
                break;
@@ -702,10 +702,10 @@ static inline void fcpci2_init(struct fritz_adapter *adapter)
 
 static inline void fcpci_init(struct fritz_adapter *adapter)
 {
-       outb(AVM_STATUS0_DIS_TIMER | AVM_STATUS0_RES_TIMER | 
+       outb(AVM_STATUS0_DIS_TIMER | AVM_STATUS0_RES_TIMER |
             AVM_STATUS0_ENA_IRQ, adapter->io + AVM_STATUS0);
 
-       outb(AVM_STATUS1_ENA_IOM | adapter->irq, 
+       outb(AVM_STATUS1_ENA_IOM | adapter->irq,
             adapter->io + AVM_STATUS1);
        mdelay(10);
 }
@@ -717,7 +717,7 @@ static int __devinit fcpcipnp_setup(struct fritz_adapter *adapter)
        u32 val = 0;
        int retval;
 
-       DBG(1,"");
+       DBG(1, "");
 
        isac_init(&adapter->isac); // FIXME is this okay now
 
@@ -737,7 +737,7 @@ static int __devinit fcpcipnp_setup(struct fritz_adapter *adapter)
        }
 
        DBG(1, "stat %#x Class %X Rev %d",
-           val, val & 0xff, (val>>8) & 0xff);
+           val, val & 0xff, (val >> 8) & 0xff);
 
        spin_lock_init(&adapter->hw_lock);
        adapter->isac.priv = adapter;
@@ -819,15 +819,15 @@ static int __devinit fcpcipnp_setup(struct fritz_adapter *adapter)
 
        return 0;
 
- err_region:
+err_region:
        release_region(adapter->io, 32);
- err:
+err:
        return retval;
 }
 
 static void __devexit fcpcipnp_release(struct fritz_adapter *adapter)
 {
-       DBG(1,"");
+       DBG(1, "");
 
        outb(0, adapter->io + AVM_STATUS0);
        free_irq(adapter->irq, adapter);
@@ -836,7 +836,7 @@ static void __devexit fcpcipnp_release(struct fritz_adapter *adapter)
 
 // ----------------------------------------------------------------------
 
-static struct fritz_adapter * __devinit 
+static struct fritz_adapter * __devinit
 new_adapter(void)
 {
        struct fritz_adapter *adapter;
@@ -850,7 +850,7 @@ new_adapter(void)
        adapter->isac.hisax_d_if.owner = THIS_MODULE;
        adapter->isac.hisax_d_if.ifc.priv = &adapter->isac;
        adapter->isac.hisax_d_if.ifc.l2l1 = isac_d_l2l1;
-       
+
        for (i = 0; i < 2; i++) {
                adapter->bcs[i].adapter = adapter;
                adapter->bcs[i].channel = i;
@@ -862,7 +862,7 @@ new_adapter(void)
                b_if[i] = &adapter->bcs[i].b_if;
 
        if (hisax_register(&adapter->isac.hisax_d_if, b_if, "fcpcipnp",
-                       protocol) != 0) {
+                          protocol) != 0) {
                kfree(adapter);
                adapter = NULL;
        }
@@ -889,7 +889,7 @@ static int __devinit fcpci_probe(struct pci_dev *pdev,
 
        pci_set_drvdata(pdev, adapter);
 
-       if (pdev->device == PCI_DEVICE_ID_AVM_A1_V2) 
+       if (pdev->device == PCI_DEVICE_ID_AVM_A1_V2)
                adapter->type = AVM_FRITZ_PCIV2;
        else
                adapter->type = AVM_FRITZ_PCI;
@@ -909,10 +909,10 @@ static int __devinit fcpci_probe(struct pci_dev *pdev,
                goto err_free;
 
        return 0;
-       
- err_free:
+
+err_free:
        delete_adapter(adapter);
- err:
+err:
        return retval;
 }
 
@@ -923,7 +923,7 @@ static int __devinit fcpnp_probe(struct pnp_dev *pdev, const struct pnp_device_i
        int retval;
 
        if (!pdev)
-               return(-ENODEV);
+               return (-ENODEV);
 
        retval = -ENOMEM;
        adapter = new_adapter();
@@ -938,7 +938,7 @@ static int __devinit fcpnp_probe(struct pnp_dev *pdev, const struct pnp_device_i
        retval = pnp_activate_dev(pdev);
        if (retval < 0) {
                printk(KERN_WARNING "%s: pnp_activate_dev(%s) ret(%d)\n", __func__,
-                       (char *)dev_id->driver_data, retval);
+                      (char *)dev_id->driver_data, retval);
                goto err_free;
        }
        adapter->io = pnp_port_start(pdev, 0);
@@ -952,10 +952,10 @@ static int __devinit fcpnp_probe(struct pnp_dev *pdev, const struct pnp_device_i
                goto err_free;
 
        return 0;
-       
- err_free:
+
+err_free:
        delete_adapter(adapter);
- err:
+err:
        return retval;
 }
 
index 21fbced..aedef97 100644 (file)
@@ -38,7 +38,7 @@ struct fritz_bcs {
        int rcvidx;
        int fifo_size;
        u_char rcvbuf[HSCX_BUFMAX]; /* B-Channel receive Buffer */
-       
+
        int tx_cnt;                 /* B-Channel transmit counter */
        struct sk_buff *tx_skb;     /* B-Channel transmit Buffer */
 };
@@ -55,4 +55,3 @@ struct fritz_adapter {
        u32  (*read_hdlc_status) (struct fritz_adapter *adapter, int nr);
        void (*write_ctrl) (struct fritz_bcs *bcs, int which);
 };
-
index aa7c940..7098d6b 100644 (file)
@@ -1,10 +1,10 @@
 /*
- * Interface between low level (hardware) drivers and 
+ * Interface between low level (hardware) drivers and
  * HiSax protocol stack
  *
  * Author       Kai Germaschewski
  * Copyright    2001 by Kai Germaschewski  <kai.germaschewski@gmx.de>
- * 
+ *
  * This software may be used and distributed according to the terms
  * of the GNU General Public License, incorporated herein by reference.
  *
index a8447fa..5154c25 100644 (file)
@@ -1,11 +1,11 @@
 /*
- * Driver for ISAC-S and ISAC-SX 
+ * Driver for ISAC-S and ISAC-SX
  * ISDN Subscriber Access Controller for Terminals
  *
  * Author       Kai Germaschewski
  * Copyright    2001 by Kai Germaschewski  <kai.germaschewski@gmx.de>
  *              2001 by Karsten Keil       <keil@isdn4linux.de>
- * 
+ *
  * based upon Karsten Keil's original isac.c driver
  *
  * This software may be used and distributed according to the terms
@@ -36,10 +36,10 @@ static int debug = 1;
 module_param(debug, int, 0);
 
 static char *ISACVer[] = {
-  "2086/2186 V1.1", 
-  "2085 B1", 
-  "2085 B2",
-  "2085 V2.3"
+       "2086/2186 V1.1",
+       "2085 B1",
+       "2085 B2",
+       "2085 V2.3"
 };
 #endif
 
@@ -178,7 +178,7 @@ enum {
        ST_L1_F8,
 };
 
-#define L1_STATE_COUNT (ST_L1_F8+1)
+#define L1_STATE_COUNT (ST_L1_F8 + 1)
 
 static char *strL1State[] =
 {
@@ -382,7 +382,7 @@ static struct FsmNode L1FnList[] __initdata =
        {ST_L1_F3_PDOWN,      EV_PH_AI8,            l1_go_f7_act_ind},
        {ST_L1_F3_PDOWN,      EV_PH_ACTIVATE_REQ,   l1_ar8},
        {ST_L1_F3_PDOWN,      EV_TIMER3,            l1_timer3},
-       
+
        {ST_L1_F3_PEND_DEACT, EV_PH_RES,            l1_di},
        {ST_L1_F3_PEND_DEACT, EV_PH_EI,             l1_di},
        {ST_L1_F3_PEND_DEACT, EV_PH_DC,             l1_go_f3pdown},
@@ -432,7 +432,7 @@ static void l1m_debug(struct FsmInst *fi, char *fmt, ...)
 {
        va_list args;
        char buf[256];
-       
+
        va_start(args, fmt);
        vsnprintf(buf, sizeof(buf), fmt, args);
        DBG(DBG_L1M, "%s", buf);
@@ -522,7 +522,7 @@ static inline void isac_cisq_interrupt(struct isac *isac)
        }
        if (val & ISAC_CIR0_CIC1) {
                val = isac->read_isac(isac, ISAC_CIR1);
-               DBG(DBG_WARN, "ISAC CIR1 %#x", val );
+               DBG(DBG_WARN, "ISAC CIR1 %#x", val);
        }
 }
 
@@ -531,10 +531,10 @@ static inline void isac_rme_interrupt(struct isac *isac)
        unsigned char val;
        int count;
        struct sk_buff *skb;
-       
+
        val = isac->read_isac(isac, ISAC_RSTA);
-       if ((val & (ISAC_RSTA_RDO | ISAC_RSTA_CRC | ISAC_RSTA_RAB) )
-            != ISAC_RSTA_CRC) {
+       if ((val & (ISAC_RSTA_RDO | ISAC_RSTA_CRC | ISAC_RSTA_RAB))
+           != ISAC_RSTA_CRC) {
                DBG(DBG_WARN, "RSTA %#x, dropped", val);
                isac->write_isac(isac, ISAC_CMDR, ISAC_CMDR_RMC);
                goto out;
@@ -560,7 +560,7 @@ static inline void isac_rme_interrupt(struct isac *isac)
        memcpy(skb_put(skb, count), isac->rcvbuf, count);
        DBG_SKB(DBG_RPACKET, skb);
        D_L1L2(isac, PH_DATA | INDICATION, skb);
- out:
+out:
        isac->rcvidx = 0;
 }
 
@@ -659,10 +659,10 @@ static inline void isacsx_rme_interrupt(struct isac *isac)
        unsigned char val;
 
        val = isac->read_isac(isac, ISACSX_RSTAD);
-       if ((val & (ISACSX_RSTAD_VFR | 
-                   ISACSX_RSTAD_RDO | 
-                   ISACSX_RSTAD_CRC | 
-                   ISACSX_RSTAD_RAB)) 
+       if ((val & (ISACSX_RSTAD_VFR |
+                   ISACSX_RSTAD_RDO |
+                   ISACSX_RSTAD_CRC |
+                   ISACSX_RSTAD_RAB))
            != (ISACSX_RSTAD_VFR | ISACSX_RSTAD_CRC)) {
                DBG(DBG_WARN, "RSTAD %#x, dropped", val);
                isac->write_isac(isac, ISACSX_CMDRD, ISACSX_CMDRD_RMC);
@@ -690,7 +690,7 @@ static inline void isacsx_rme_interrupt(struct isac *isac)
        memcpy(skb_put(skb, count), isac->rcvbuf, count);
        DBG_SKB(DBG_RPACKET, skb);
        D_L1L2(isac, PH_DATA | INDICATION, skb);
- out:
+out:
        isac->rcvidx = 0;
 }
 
@@ -778,8 +778,8 @@ void isac_setup(struct isac *isac)
 
        ph_command(isac, ISAC_CMD_RES);
 
-       isac->write_isac(isac, ISAC_MASK, 0xff);
-       isac->mocr = 0xaa;
+       isac->write_isac(isac, ISAC_MASK, 0xff);
+       isac->mocr = 0xaa;
        if (test_bit(ISAC_IOM1, &isac->flags)) {
                /* IOM 1 Mode */
                isac->write_isac(isac, ISAC_ADF2, 0x0);
@@ -832,7 +832,7 @@ void isacsx_setup(struct isac *isac)
        // all HDLC IRQ unmasked
        isac->write_isac(isac, ISACSX_MASKD,    0x03);
        // unmask ICD, CID IRQs
-       isac->write_isac(isac, ISACSX_MASK,            
+       isac->write_isac(isac, ISACSX_MASK,
                         ~(ISACSX_ISTA_ICD | ISACSX_ISTA_CIC));
 }
 
index 904b910..3e305fe 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Author       Karsten Keil
  * Copyright    by Karsten Keil      <keil@isdn4linux.de>
- * 
+ *
  * This software may be used and distributed according to the terms
  * of the GNU General Public License, incorporated herein by reference.
  *
@@ -54,7 +54,7 @@ modehscx(struct BCState *bcs, int mode, int bc)
        cs->BC_Write_Reg(cs, hscx, HSCX_XBCH, 0x0);
        cs->BC_Write_Reg(cs, hscx, HSCX_RLCR, 0x0);
        cs->BC_Write_Reg(cs, hscx, HSCX_CCR1,
-               test_bit(HW_IPAC, &cs->HW_Flags) ? 0x82 : 0x85);
+                        test_bit(HW_IPAC, &cs->HW_Flags) ? 0x82 : 0x85);
        cs->BC_Write_Reg(cs, hscx, HSCX_CCR2, 0x30);
        cs->BC_Write_Reg(cs, hscx, HSCX_XCCR, 7);
        cs->BC_Write_Reg(cs, hscx, HSCX_RCCR, 7);
@@ -65,27 +65,27 @@ modehscx(struct BCState *bcs, int mode, int bc)
 
        if (bc == 0) {
                cs->BC_Write_Reg(cs, hscx, HSCX_TSAX,
-                             test_bit(HW_IOM1, &cs->HW_Flags) ? 0x7 : bcs->hw.hscx.tsaxr0);
+                                test_bit(HW_IOM1, &cs->HW_Flags) ? 0x7 : bcs->hw.hscx.tsaxr0);
                cs->BC_Write_Reg(cs, hscx, HSCX_TSAR,
-                             test_bit(HW_IOM1, &cs->HW_Flags) ? 0x7 : bcs->hw.hscx.tsaxr0);
+                                test_bit(HW_IOM1, &cs->HW_Flags) ? 0x7 : bcs->hw.hscx.tsaxr0);
        } else {
                cs->BC_Write_Reg(cs, hscx, HSCX_TSAX, bcs->hw.hscx.tsaxr1);
                cs->BC_Write_Reg(cs, hscx, HSCX_TSAR, bcs->hw.hscx.tsaxr1);
        }
        switch (mode) {
-               case (L1_MODE_NULL):
-                       cs->BC_Write_Reg(cs, hscx, HSCX_TSAX, 0x1f);
-                       cs->BC_Write_Reg(cs, hscx, HSCX_TSAR, 0x1f);
-                       cs->BC_Write_Reg(cs, hscx, HSCX_MODE, 0x84);
-                       break;
-               case (L1_MODE_TRANS):
-                       cs->BC_Write_Reg(cs, hscx, HSCX_MODE, 0xe4);
-                       break;
-               case (L1_MODE_HDLC):
-                       cs->BC_Write_Reg(cs, hscx, HSCX_CCR1,
-                               test_bit(HW_IPAC, &cs->HW_Flags) ? 0x8a : 0x8d);
-                       cs->BC_Write_Reg(cs, hscx, HSCX_MODE, 0x8c);
-                       break;
+       case (L1_MODE_NULL):
+               cs->BC_Write_Reg(cs, hscx, HSCX_TSAX, 0x1f);
+               cs->BC_Write_Reg(cs, hscx, HSCX_TSAR, 0x1f);
+               cs->BC_Write_Reg(cs, hscx, HSCX_MODE, 0x84);
+               break;
+       case (L1_MODE_TRANS):
+               cs->BC_Write_Reg(cs, hscx, HSCX_MODE, 0xe4);
+               break;
+       case (L1_MODE_HDLC):
+               cs->BC_Write_Reg(cs, hscx, HSCX_CCR1,
+                                test_bit(HW_IPAC, &cs->HW_Flags) ? 0x8a : 0x8d);
+               cs->BC_Write_Reg(cs, hscx, HSCX_MODE, 0x8c);
+               break;
        }
        if (mode)
                cs->BC_Write_Reg(cs, hscx, HSCX_CMDR, 0x41);
@@ -100,55 +100,55 @@ hscx_l2l1(struct PStack *st, int pr, void *arg)
        struct sk_buff *skb = arg;
 
        switch (pr) {
-               case (PH_DATA | REQUEST):
-                       spin_lock_irqsave(&bcs->cs->lock, flags);
-                       if (bcs->tx_skb) {
-                               skb_queue_tail(&bcs->squeue, skb);
-                       } else {
-                               bcs->tx_skb = skb;
-                               test_and_set_bit(BC_FLG_BUSY, &bcs->Flag);
-                               bcs->hw.hscx.count = 0;
-                               bcs->cs->BC_Send_Data(bcs);
-                       }
-                       spin_unlock_irqrestore(&bcs->cs->lock, flags);
-                       break;
-               case (PH_PULL | INDICATION):
-                       spin_lock_irqsave(&bcs->cs->lock, flags);
-                       if (bcs->tx_skb) {
-                               printk(KERN_WARNING "hscx_l2l1: this shouldn't happen\n");
-                       } else {
-                               test_and_set_bit(BC_FLG_BUSY, &bcs->Flag);
-                               bcs->tx_skb = skb;
-                               bcs->hw.hscx.count = 0;
-                               bcs->cs->BC_Send_Data(bcs);
-                       }
-                       spin_unlock_irqrestore(&bcs->cs->lock, flags);
-                       break;
-               case (PH_PULL | REQUEST):
-                       if (!bcs->tx_skb) {
-                               test_and_clear_bit(FLG_L1_PULL_REQ, &st->l1.Flags);
-                               st->l1.l1l2(st, PH_PULL | CONFIRM, NULL);
-                       } else
-                               test_and_set_bit(FLG_L1_PULL_REQ, &st->l1.Flags);
-                       break;
-               case (PH_ACTIVATE | REQUEST):
-                       spin_lock_irqsave(&bcs->cs->lock, flags);
-                       test_and_set_bit(BC_FLG_ACTIV, &bcs->Flag);
-                       modehscx(bcs, st->l1.mode, st->l1.bc);
-                       spin_unlock_irqrestore(&bcs->cs->lock, flags);
-                       l1_msg_b(st, pr, arg);
-                       break;
-               case (PH_DEACTIVATE | REQUEST):
-                       l1_msg_b(st, pr, arg);
-                       break;
-               case (PH_DEACTIVATE | CONFIRM):
-                       spin_lock_irqsave(&bcs->cs->lock, flags);
-                       test_and_clear_bit(BC_FLG_ACTIV, &bcs->Flag);
-                       test_and_clear_bit(BC_FLG_BUSY, &bcs->Flag);
-                       modehscx(bcs, 0, st->l1.bc);
-                       spin_unlock_irqrestore(&bcs->cs->lock, flags);
-                       st->l1.l1l2(st, PH_DEACTIVATE | CONFIRM, NULL);
-                       break;
+       case (PH_DATA | REQUEST):
+               spin_lock_irqsave(&bcs->cs->lock, flags);
+               if (bcs->tx_skb) {
+                       skb_queue_tail(&bcs->squeue, skb);
+               } else {
+                       bcs->tx_skb = skb;
+                       test_and_set_bit(BC_FLG_BUSY, &bcs->Flag);
+                       bcs->hw.hscx.count = 0;
+                       bcs->cs->BC_Send_Data(bcs);
+               }
+               spin_unlock_irqrestore(&bcs->cs->lock, flags);
+               break;
+       case (PH_PULL | INDICATION):
+               spin_lock_irqsave(&bcs->cs->lock, flags);
+               if (bcs->tx_skb) {
+                       printk(KERN_WARNING "hscx_l2l1: this shouldn't happen\n");
+               } else {
+                       test_and_set_bit(BC_FLG_BUSY, &bcs->Flag);
+                       bcs->tx_skb = skb;
+                       bcs->hw.hscx.count = 0;
+                       bcs->cs->BC_Send_Data(bcs);
+               }
+               spin_unlock_irqrestore(&bcs->cs->lock, flags);
+               break;
+       case (PH_PULL | REQUEST):
+               if (!bcs->tx_skb) {
+                       test_and_clear_bit(FLG_L1_PULL_REQ, &st->l1.Flags);
+                       st->l1.l1l2(st, PH_PULL | CONFIRM, NULL);
+               } else
+                       test_and_set_bit(FLG_L1_PULL_REQ, &st->l1.Flags);
+               break;
+       case (PH_ACTIVATE | REQUEST):
+               spin_lock_irqsave(&bcs->cs->lock, flags);
+               test_and_set_bit(BC_FLG_ACTIV, &bcs->Flag);
+               modehscx(bcs, st->l1.mode, st->l1.bc);
+               spin_unlock_irqrestore(&bcs->cs->lock, flags);
+               l1_msg_b(st, pr, arg);
+               break;
+       case (PH_DEACTIVATE | REQUEST):
+               l1_msg_b(st, pr, arg);
+               break;
+       case (PH_DEACTIVATE | CONFIRM):
+               spin_lock_irqsave(&bcs->cs->lock, flags);
+               test_and_clear_bit(BC_FLG_ACTIV, &bcs->Flag);
+               test_and_clear_bit(BC_FLG_BUSY, &bcs->Flag);
+               modehscx(bcs, 0, st->l1.bc);
+               spin_unlock_irqrestore(&bcs->cs->lock, flags);
+               st->l1.l1l2(st, PH_DEACTIVATE | CONFIRM, NULL);
+               break;
        }
 }
 
@@ -177,13 +177,13 @@ open_hscxstate(struct IsdnCardState *cs, struct BCState *bcs)
        if (!test_and_set_bit(BC_FLG_INIT, &bcs->Flag)) {
                if (!(bcs->hw.hscx.rcvbuf = kmalloc(HSCX_BUFMAX, GFP_ATOMIC))) {
                        printk(KERN_WARNING
-                               "HiSax: No memory for hscx.rcvbuf\n");
+                              "HiSax: No memory for hscx.rcvbuf\n");
                        test_and_clear_bit(BC_FLG_INIT, &bcs->Flag);
                        return (1);
                }
                if (!(bcs->blog = kmalloc(MAX_BLOG_SPACE, GFP_ATOMIC))) {
                        printk(KERN_WARNING
-                               "HiSax: No memory for bcs->blog\n");
+                              "HiSax: No memory for bcs->blog\n");
                        test_and_clear_bit(BC_FLG_INIT, &bcs->Flag);
                        kfree(bcs->hw.hscx.rcvbuf);
                        bcs->hw.hscx.rcvbuf = NULL;
index 268bfd3..1148b4b 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Author       Karsten Keil
  * Copyright    by Karsten Keil      <keil@isdn4linux.de>
- * 
+ *
  * This software may be used and distributed according to the terms
  * of the GNU General Public License, incorporated herein by reference.
  *
index 2387d76..f398d48 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Author       Karsten Keil
  * Copyright    by Karsten Keil      <keil@isdn4linux.de>
- * 
+ *
  * This software may be used and distributed according to the terms
  * of the GNU General Public License, incorporated herein by reference.
  *
@@ -84,7 +84,7 @@ hscx_fill_fifo(struct BCState *bcs)
 {
        struct IsdnCardState *cs = bcs->cs;
        int more, count;
-       int fifo_size = test_bit(HW_IPAC, &cs->HW_Flags)? 64: 32;
+       int fifo_size = test_bit(HW_IPAC, &cs->HW_Flags) ? 64 : 32;
        u_char *ptr;
 
        if ((cs->debug & L1_DEB_HSCX) && !(cs->debug & L1_DEB_HSCX_FIFO))
@@ -125,7 +125,7 @@ hscx_interrupt(struct IsdnCardState *cs, u_char val, u_char hscx)
        u_char r;
        struct BCState *bcs = cs->bcs + hscx;
        struct sk_buff *skb;
-       int fifo_size = test_bit(HW_IPAC, &cs->HW_Flags)? 64: 32;
+       int fifo_size = test_bit(HW_IPAC, &cs->HW_Flags) ? 64 : 32;
        int count;
 
        if (!test_bit(BC_FLG_INIT, &bcs->Flag))
@@ -159,7 +159,7 @@ hscx_interrupt(struct IsdnCardState *cs, u_char val, u_char hscx)
                        WriteHSCXCMDR(cs, hscx, 0x80);
                } else {
                        count = READHSCX(cs, hscx, HSCX_RBCL) & (
-                               test_bit(HW_IPAC, &cs->HW_Flags)? 0x3f: 0x1f);
+                               test_bit(HW_IPAC, &cs->HW_Flags) ? 0x3f : 0x1f);
                        if (count == 0)
                                count = fifo_size;
                        hscx_empty_fifo(bcs, count);
@@ -197,8 +197,8 @@ hscx_interrupt(struct IsdnCardState *cs, u_char val, u_char hscx)
                                hscx_fill_fifo(bcs);
                                return;
                        } else {
-                               if (test_bit(FLG_LLI_L1WAKEUP,&bcs->st->lli.flag) &&
-                                       (PACKET_NOACK != bcs->tx_skb->pkt_type)) {
+                               if (test_bit(FLG_LLI_L1WAKEUP, &bcs->st->lli.flag) &&
+                                   (PACKET_NOACK != bcs->tx_skb->pkt_type)) {
                                        u_long  flags;
                                        spin_lock_irqsave(&bcs->aclock, flags);
                                        bcs->ackcnt += bcs->hw.hscx.count;
@@ -206,7 +206,7 @@ hscx_interrupt(struct IsdnCardState *cs, u_char val, u_char hscx)
                                        schedule_event(bcs, B_ACKPENDING);
                                }
                                dev_kfree_skb_irq(bcs->tx_skb);
-                               bcs->hw.hscx.count = 0; 
+                               bcs->hw.hscx.count = 0;
                                bcs->tx_skb = NULL;
                        }
                }
@@ -239,7 +239,7 @@ hscx_int_main(struct IsdnCardState *cs, u_char val)
                                bcs->err_tx++;
 #endif
                                /* Here we lost an TX interrupt, so
-                                  * restart transmitting the whole frame.
+                                * restart transmitting the whole frame.
                                 */
                                if (bcs->tx_skb) {
                                        skb_push(bcs->tx_skb, bcs->hw.hscx.count);
@@ -266,7 +266,7 @@ hscx_int_main(struct IsdnCardState *cs, u_char val)
                                hscx_fill_fifo(bcs);
                        else {
                                /* Here we lost an TX interrupt, so
-                                  * restart transmitting the whole frame.
+                                * restart transmitting the whole frame.
                                 */
 #ifdef ERROR_STATISTIC
                                bcs->err_tx++;
index 6305726..7be762b 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Author       Matt Henderson & Guy Ellis
  * Copyright    by Traverse Technologies Pty Ltd, www.travers.com.au
- * 
+ *
  * This software may be used and distributed according to the terms
  * of the GNU General Public License, incorporated herein by reference.
  *
@@ -50,30 +50,30 @@ static void
 icc_new_ph(struct IsdnCardState *cs)
 {
        switch (cs->dc.icc.ph_state) {
-               case (ICC_IND_EI1):
-                       ph_command(cs, ICC_CMD_DI);
-                       l1_msg(cs, HW_RESET | INDICATION, NULL);
-                       break;
-               case (ICC_IND_DC):
-                       l1_msg(cs, HW_DEACTIVATE | CONFIRM, NULL);
-                       break;
-               case (ICC_IND_DR):
-                       l1_msg(cs, HW_DEACTIVATE | INDICATION, NULL);
-                       break;
-               case (ICC_IND_PU):
-                       l1_msg(cs, HW_POWERUP | CONFIRM, NULL);
-                       break;
-               case (ICC_IND_FJ):
-                       l1_msg(cs, HW_RSYNC | INDICATION, NULL);
-                       break;
-               case (ICC_IND_AR):
-                       l1_msg(cs, HW_INFO2 | INDICATION, NULL);
-                       break;
-               case (ICC_IND_AI):
-                       l1_msg(cs, HW_INFO4 | INDICATION, NULL);
-                       break;
-               default:
-                       break;
+       case (ICC_IND_EI1):
+               ph_command(cs, ICC_CMD_DI);
+               l1_msg(cs, HW_RESET | INDICATION, NULL);
+               break;
+       case (ICC_IND_DC):
+               l1_msg(cs, HW_DEACTIVATE | CONFIRM, NULL);
+               break;
+       case (ICC_IND_DR):
+               l1_msg(cs, HW_DEACTIVATE | INDICATION, NULL);
+               break;
+       case (ICC_IND_PU):
+               l1_msg(cs, HW_POWERUP | CONFIRM, NULL);
+               break;
+       case (ICC_IND_FJ):
+               l1_msg(cs, HW_RSYNC | INDICATION, NULL);
+               break;
+       case (ICC_IND_AR):
+               l1_msg(cs, HW_INFO2 | INDICATION, NULL);
+               break;
+       case (ICC_IND_AI):
+               l1_msg(cs, HW_INFO4 | INDICATION, NULL);
+               break;
+       default:
+               break;
        }
 }
 
@@ -83,7 +83,7 @@ icc_bh(struct work_struct *work)
        struct IsdnCardState *cs =
                container_of(work, struct IsdnCardState, tqueue);
        struct PStack *stptr;
-       
+
        if (test_and_clear_bit(D_CLEARBUSY, &cs->event)) {
                if (cs->debug)
                        debugl1(cs, "D-Channel Busy cleared");
@@ -94,7 +94,7 @@ icc_bh(struct work_struct *work)
                }
        }
        if (test_and_clear_bit(D_L1STATECHANGE, &cs->event))
-               icc_new_ph(cs);         
+               icc_new_ph(cs);
        if (test_and_clear_bit(D_RCVBUFREADY, &cs->event))
                DChannel_proc_rcv(cs);
        if (test_and_clear_bit(D_XMTBUFREADY, &cs->event))
@@ -254,11 +254,11 @@ icc_interrupt(struct IsdnCardState *cs, u_char val)
                } else
                        schedule_event(cs, D_XMTBUFREADY);
        }
-      afterXPR:
+afterXPR:
        if (val & 0x04) {       /* CISQ */
                exval = cs->readisac(cs, ICC_CIR0);
                if (cs->debug & L1_DEB_ISAC)
-                       debugl1(cs, "ICC CIR0 %02X", exval );
+                       debugl1(cs, "ICC CIR0 %02X", exval);
                if (exval & 2) {
                        cs->dc.icc.ph_state = (exval >> 2) & 0xf;
                        if (cs->debug & L1_DEB_ISAC)
@@ -268,7 +268,7 @@ icc_interrupt(struct IsdnCardState *cs, u_char val)
                if (exval & 1) {
                        exval = cs->readisac(cs, ICC_CIR1);
                        if (cs->debug & L1_DEB_ISAC)
-                               debugl1(cs, "ICC CIR1 %02X", exval );
+                               debugl1(cs, "ICC CIR1 %02X", exval);
                }
        }
        if (val & 0x02) {       /* SIN */
@@ -331,13 +331,13 @@ icc_interrupt(struct IsdnCardState *cs, u_char val)
                                }
                                cs->dc.icc.mon_rx[cs->dc.icc.mon_rxp++] = cs->readisac(cs, ICC_MOR0);
                                if (cs->debug & L1_DEB_MONITOR)
-                                       debugl1(cs, "ICC MOR0 %02x", cs->dc.icc.mon_rx[cs->dc.icc.mon_rxp -1]);
+                                       debugl1(cs, "ICC MOR0 %02x", cs->dc.icc.mon_rx[cs->dc.icc.mon_rxp - 1]);
                                if (cs->dc.icc.mon_rxp == 1) {
                                        cs->dc.icc.mocr |= 0x04;
                                        cs->writeisac(cs, ICC_MOCR, cs->dc.icc.mocr);
                                }
                        }
-                     afterMONR0:
+               afterMONR0:
                        if (v1 & 0x80) {
                                if (!cs->dc.icc.mon_rx) {
                                        if (!(cs->dc.icc.mon_rx = kmalloc(MAX_MON_FRAME, GFP_ATOMIC))) {
@@ -361,11 +361,11 @@ icc_interrupt(struct IsdnCardState *cs, u_char val)
                                }
                                cs->dc.icc.mon_rx[cs->dc.icc.mon_rxp++] = cs->readisac(cs, ICC_MOR1);
                                if (cs->debug & L1_DEB_MONITOR)
-                                       debugl1(cs, "ICC MOR1 %02x", cs->dc.icc.mon_rx[cs->dc.icc.mon_rxp -1]);
+                                       debugl1(cs, "ICC MOR1 %02x", cs->dc.icc.mon_rx[cs->dc.icc.mon_rxp - 1]);
                                cs->dc.icc.mocr |= 0x40;
                                cs->writeisac(cs, ICC_MOCR, cs->dc.icc.mocr);
                        }
-                     afterMONR1:
+               afterMONR1:
                        if (v1 & 0x04) {
                                cs->dc.icc.mocr &= 0xf0;
                                cs->writeisac(cs, ICC_MOCR, cs->dc.icc.mocr);
@@ -381,15 +381,15 @@ icc_interrupt(struct IsdnCardState *cs, u_char val)
                                schedule_event(cs, D_RX_MON1);
                        }
                        if (v1 & 0x02) {
-                               if ((!cs->dc.icc.mon_tx) || (cs->dc.icc.mon_txc && 
-                                       (cs->dc.icc.mon_txp >= cs->dc.icc.mon_txc) && 
-                                       !(v1 & 0x08))) {
+                               if ((!cs->dc.icc.mon_tx) || (cs->dc.icc.mon_txc &&
+                                                            (cs->dc.icc.mon_txp >= cs->dc.icc.mon_txc) &&
+                                                            !(v1 & 0x08))) {
                                        cs->dc.icc.mocr &= 0xf0;
                                        cs->writeisac(cs, ICC_MOCR, cs->dc.icc.mocr);
                                        cs->dc.icc.mocr |= 0x0a;
                                        cs->writeisac(cs, ICC_MOCR, cs->dc.icc.mocr);
                                        if (cs->dc.icc.mon_txc &&
-                                               (cs->dc.icc.mon_txp >= cs->dc.icc.mon_txc))
+                                           (cs->dc.icc.mon_txp >= cs->dc.icc.mon_txc))
                                                schedule_event(cs, D_TX_MON0);
                                        goto AfterMOX0;
                                }
@@ -398,21 +398,21 @@ icc_interrupt(struct IsdnCardState *cs, u_char val)
                                        goto AfterMOX0;
                                }
                                cs->writeisac(cs, ICC_MOX0,
-                                       cs->dc.icc.mon_tx[cs->dc.icc.mon_txp++]);
+                                             cs->dc.icc.mon_tx[cs->dc.icc.mon_txp++]);
                                if (cs->debug & L1_DEB_MONITOR)
-                                       debugl1(cs, "ICC %02x -> MOX0", cs->dc.icc.mon_tx[cs->dc.icc.mon_txp -1]);
+                                       debugl1(cs, "ICC %02x -> MOX0", cs->dc.icc.mon_tx[cs->dc.icc.mon_txp - 1]);
                        }
-                     AfterMOX0:
+               AfterMOX0:
                        if (v1 & 0x20) {
-                               if ((!cs->dc.icc.mon_tx) || (cs->dc.icc.mon_txc && 
-                                       (cs->dc.icc.mon_txp >= cs->dc.icc.mon_txc) && 
-                                       !(v1 & 0x80))) {
+                               if ((!cs->dc.icc.mon_tx) || (cs->dc.icc.mon_txc &&
+                                                            (cs->dc.icc.mon_txp >= cs->dc.icc.mon_txc) &&
+                                                            !(v1 & 0x80))) {
                                        cs->dc.icc.mocr &= 0x0f;
                                        cs->writeisac(cs, ICC_MOCR, cs->dc.icc.mocr);
                                        cs->dc.icc.mocr |= 0xa0;
                                        cs->writeisac(cs, ICC_MOCR, cs->dc.icc.mocr);
                                        if (cs->dc.icc.mon_txc &&
-                                               (cs->dc.icc.mon_txp >= cs->dc.icc.mon_txc))
+                                           (cs->dc.icc.mon_txp >= cs->dc.icc.mon_txc))
                                                schedule_event(cs, D_TX_MON1);
                                        goto AfterMOX1;
                                }
@@ -421,11 +421,11 @@ icc_interrupt(struct IsdnCardState *cs, u_char val)
                                        goto AfterMOX1;
                                }
                                cs->writeisac(cs, ICC_MOX1,
-                                       cs->dc.icc.mon_tx[cs->dc.icc.mon_txp++]);
+                                             cs->dc.icc.mon_tx[cs->dc.icc.mon_txp++]);
                                if (cs->debug & L1_DEB_MONITOR)
-                                       debugl1(cs, "ICC %02x -> MOX1", cs->dc.icc.mon_tx[cs->dc.icc.mon_txp -1]);
+                                       debugl1(cs, "ICC %02x -> MOX1", cs->dc.icc.mon_tx[cs->dc.icc.mon_txp - 1]);
                        }
-                     AfterMOX1:
+               AfterMOX1:
 #endif
                }
        }
@@ -440,128 +440,128 @@ ICC_l1hw(struct PStack *st, int pr, void *arg)
        int  val;
 
        switch (pr) {
-               case (PH_DATA |REQUEST):
-                       if (cs->debug & DEB_DLOG_HEX)
-                               LogFrame(cs, skb->data, skb->len);
-                       if (cs->debug & DEB_DLOG_VERBOSE)
-                               dlogframe(cs, skb, 0);
-                       spin_lock_irqsave(&cs->lock, flags);
-                       if (cs->tx_skb) {
-                               skb_queue_tail(&cs->sq, skb);
-#ifdef L2FRAME_DEBUG           /* psa */
-                               if (cs->debug & L1_DEB_LAPD)
-                                       Logl2Frame(cs, skb, "PH_DATA Queued", 0);
-#endif
-                       } else {
-                               cs->tx_skb = skb;
-                               cs->tx_cnt = 0;
+       case (PH_DATA | REQUEST):
+               if (cs->debug & DEB_DLOG_HEX)
+                       LogFrame(cs, skb->data, skb->len);
+               if (cs->debug & DEB_DLOG_VERBOSE)
+                       dlogframe(cs, skb, 0);
+               spin_lock_irqsave(&cs->lock, flags);
+               if (cs->tx_skb) {
+                       skb_queue_tail(&cs->sq, skb);
 #ifdef L2FRAME_DEBUG           /* psa */
-                               if (cs->debug & L1_DEB_LAPD)
-                                       Logl2Frame(cs, skb, "PH_DATA", 0);
+                       if (cs->debug & L1_DEB_LAPD)
+                               Logl2Frame(cs, skb, "PH_DATA Queued", 0);
 #endif
-                               icc_fill_fifo(cs);
-                       }
-                       spin_unlock_irqrestore(&cs->lock, flags);
-                       break;
-               case (PH_PULL |INDICATION):
-                       spin_lock_irqsave(&cs->lock, flags);
-                       if (cs->tx_skb) {
-                               if (cs->debug & L1_DEB_WARN)
-                                       debugl1(cs, " l2l1 tx_skb exist this shouldn't happen");
-                               skb_queue_tail(&cs->sq, skb);
-                               spin_unlock_irqrestore(&cs->lock, flags);
-                               break;
-                       }
-                       if (cs->debug & DEB_DLOG_HEX)
-                               LogFrame(cs, skb->data, skb->len);
-                       if (cs->debug & DEB_DLOG_VERBOSE)
-                               dlogframe(cs, skb, 0);
+               } else {
                        cs->tx_skb = skb;
                        cs->tx_cnt = 0;
 #ifdef L2FRAME_DEBUG           /* psa */
                        if (cs->debug & L1_DEB_LAPD)
-                               Logl2Frame(cs, skb, "PH_DATA_PULLED", 0);
+                               Logl2Frame(cs, skb, "PH_DATA", 0);
 #endif
                        icc_fill_fifo(cs);
+               }
+               spin_unlock_irqrestore(&cs->lock, flags);
+               break;
+       case (PH_PULL | INDICATION):
+               spin_lock_irqsave(&cs->lock, flags);
+               if (cs->tx_skb) {
+                       if (cs->debug & L1_DEB_WARN)
+                               debugl1(cs, " l2l1 tx_skb exist this shouldn't happen");
+                       skb_queue_tail(&cs->sq, skb);
                        spin_unlock_irqrestore(&cs->lock, flags);
                        break;
-               case (PH_PULL | REQUEST):
+               }
+               if (cs->debug & DEB_DLOG_HEX)
+                       LogFrame(cs, skb->data, skb->len);
+               if (cs->debug & DEB_DLOG_VERBOSE)
+                       dlogframe(cs, skb, 0);
+               cs->tx_skb = skb;
+               cs->tx_cnt = 0;
 #ifdef L2FRAME_DEBUG           /* psa */
-                       if (cs->debug & L1_DEB_LAPD)
-                               debugl1(cs, "-> PH_REQUEST_PULL");
+               if (cs->debug & L1_DEB_LAPD)
+                       Logl2Frame(cs, skb, "PH_DATA_PULLED", 0);
 #endif
-                       if (!cs->tx_skb) {
-                               test_and_clear_bit(FLG_L1_PULL_REQ, &st->l1.Flags);
-                               st->l1.l1l2(st, PH_PULL | CONFIRM, NULL);
-                       } else
-                               test_and_set_bit(FLG_L1_PULL_REQ, &st->l1.Flags);
-                       break;
-               case (HW_RESET | REQUEST):
-                       spin_lock_irqsave(&cs->lock, flags);
-                       if ((cs->dc.icc.ph_state == ICC_IND_EI1) ||
-                               (cs->dc.icc.ph_state == ICC_IND_DR))
-                               ph_command(cs, ICC_CMD_DI);
-                       else
-                               ph_command(cs, ICC_CMD_RES);
-                       spin_unlock_irqrestore(&cs->lock, flags);
-                       break;
-               case (HW_ENABLE | REQUEST):
-                       spin_lock_irqsave(&cs->lock, flags);
+               icc_fill_fifo(cs);
+               spin_unlock_irqrestore(&cs->lock, flags);
+               break;
+       case (PH_PULL | REQUEST):
+#ifdef L2FRAME_DEBUG           /* psa */
+               if (cs->debug & L1_DEB_LAPD)
+                       debugl1(cs, "-> PH_REQUEST_PULL");
+#endif
+               if (!cs->tx_skb) {
+                       test_and_clear_bit(FLG_L1_PULL_REQ, &st->l1.Flags);
+                       st->l1.l1l2(st, PH_PULL | CONFIRM, NULL);
+               } else
+                       test_and_set_bit(FLG_L1_PULL_REQ, &st->l1.Flags);
+               break;
+       case (HW_RESET | REQUEST):
+               spin_lock_irqsave(&cs->lock, flags);
+               if ((cs->dc.icc.ph_state == ICC_IND_EI1) ||
+                   (cs->dc.icc.ph_state == ICC_IND_DR))
                        ph_command(cs, ICC_CMD_DI);
-                       spin_unlock_irqrestore(&cs->lock, flags);
-                       break;
-               case (HW_INFO1 | REQUEST):
-                       spin_lock_irqsave(&cs->lock, flags);
-                       ph_command(cs, ICC_CMD_AR);
-                       spin_unlock_irqrestore(&cs->lock, flags);
-                       break;
-               case (HW_INFO3 | REQUEST):
-                       spin_lock_irqsave(&cs->lock, flags);
-                       ph_command(cs, ICC_CMD_AI);
-                       spin_unlock_irqrestore(&cs->lock, flags);
-                       break;
-               case (HW_TESTLOOP | REQUEST):
-                       spin_lock_irqsave(&cs->lock, flags);
-                       val = 0;
-                       if (1 & (long) arg)
-                               val |= 0x0c;
-                       if (2 & (long) arg)
-                               val |= 0x3;
-                       if (test_bit(HW_IOM1, &cs->HW_Flags)) {
-                               /* IOM 1 Mode */
-                               if (!val) {
-                                       cs->writeisac(cs, ICC_SPCR, 0xa);
-                                       cs->writeisac(cs, ICC_ADF1, 0x2);
-                               } else {
-                                       cs->writeisac(cs, ICC_SPCR, val);
-                                       cs->writeisac(cs, ICC_ADF1, 0xa);
-                               }
+               else
+                       ph_command(cs, ICC_CMD_RES);
+               spin_unlock_irqrestore(&cs->lock, flags);
+               break;
+       case (HW_ENABLE | REQUEST):
+               spin_lock_irqsave(&cs->lock, flags);
+               ph_command(cs, ICC_CMD_DI);
+               spin_unlock_irqrestore(&cs->lock, flags);
+               break;
+       case (HW_INFO1 | REQUEST):
+               spin_lock_irqsave(&cs->lock, flags);
+               ph_command(cs, ICC_CMD_AR);
+               spin_unlock_irqrestore(&cs->lock, flags);
+               break;
+       case (HW_INFO3 | REQUEST):
+               spin_lock_irqsave(&cs->lock, flags);
+               ph_command(cs, ICC_CMD_AI);
+               spin_unlock_irqrestore(&cs->lock, flags);
+               break;
+       case (HW_TESTLOOP | REQUEST):
+               spin_lock_irqsave(&cs->lock, flags);
+               val = 0;
+               if (1 & (long) arg)
+                       val |= 0x0c;
+               if (2 & (long) arg)
+                       val |= 0x3;
+               if (test_bit(HW_IOM1, &cs->HW_Flags)) {
+                       /* IOM 1 Mode */
+                       if (!val) {
+                               cs->writeisac(cs, ICC_SPCR, 0xa);
+                               cs->writeisac(cs, ICC_ADF1, 0x2);
                        } else {
-                               /* IOM 2 Mode */
                                cs->writeisac(cs, ICC_SPCR, val);
-                               if (val)
-                                       cs->writeisac(cs, ICC_ADF1, 0x8);
-                               else
-                                       cs->writeisac(cs, ICC_ADF1, 0x0);
-                       }
-                       spin_unlock_irqrestore(&cs->lock, flags);
-                       break;
-               case (HW_DEACTIVATE | RESPONSE):
-                       skb_queue_purge(&cs->rq);
-                       skb_queue_purge(&cs->sq);
-                       if (cs->tx_skb) {
-                               dev_kfree_skb_any(cs->tx_skb);
-                               cs->tx_skb = NULL;
+                               cs->writeisac(cs, ICC_ADF1, 0xa);
                        }
-                       if (test_and_clear_bit(FLG_DBUSY_TIMER, &cs->HW_Flags))
-                               del_timer(&cs->dbusytimer);
-                       if (test_and_clear_bit(FLG_L1_DBUSY, &cs->HW_Flags))
-                               schedule_event(cs, D_CLEARBUSY);
-                       break;
-               default:
-                       if (cs->debug & L1_DEB_WARN)
-                               debugl1(cs, "icc_l1hw unknown %04x", pr);
-                       break;
+               } else {
+                       /* IOM 2 Mode */
+                       cs->writeisac(cs, ICC_SPCR, val);
+                       if (val)
+                               cs->writeisac(cs, ICC_ADF1, 0x8);
+                       else
+                               cs->writeisac(cs, ICC_ADF1, 0x0);
+               }
+               spin_unlock_irqrestore(&cs->lock, flags);
+               break;
+       case (HW_DEACTIVATE | RESPONSE):
+               skb_queue_purge(&cs->rq);
+               skb_queue_purge(&cs->sq);
+               if (cs->tx_skb) {
+                       dev_kfree_skb_any(cs->tx_skb);
+                       cs->tx_skb = NULL;
+               }
+               if (test_and_clear_bit(FLG_DBUSY_TIMER, &cs->HW_Flags))
+                       del_timer(&cs->dbusytimer);
+               if (test_and_clear_bit(FLG_L1_DBUSY, &cs->HW_Flags))
+                       schedule_event(cs, D_CLEARBUSY);
+               break;
+       default:
+               if (cs->debug & L1_DEB_WARN)
+                       debugl1(cs, "icc_l1hw unknown %04x", pr);
+               break;
        }
 }
 
@@ -588,7 +588,7 @@ dbusy_timer_handler(struct IsdnCardState *cs)
        if (test_bit(FLG_DBUSY_TIMER, &cs->HW_Flags)) {
                rbch = cs->readisac(cs, ICC_RBCH);
                star = cs->readisac(cs, ICC_STAR);
-               if (cs->debug) 
+               if (cs->debug)
                        debugl1(cs, "D-Channel Busy RBCH %02x STAR %02x",
                                rbch, star);
                if (rbch & ICC_RBCH_XAC) { /* D-Channel Busy */
@@ -622,8 +622,8 @@ initicc(struct IsdnCardState *cs)
        cs->DC_Close = DC_Close_icc;
        cs->dc.icc.mon_tx = NULL;
        cs->dc.icc.mon_rx = NULL;
-       cs->writeisac(cs, ICC_MASK, 0xff);
-       cs->dc.icc.mocr = 0xaa;
+       cs->writeisac(cs, ICC_MASK, 0xff);
+       cs->dc.icc.mocr = 0xaa;
        if (test_bit(HW_IOM1, &cs->HW_Flags)) {
                /* IOM 1 Mode */
                cs->writeisac(cs, ICC_ADF2, 0x0);
index e7f5939..f367df5 100644 (file)
@@ -4,12 +4,12 @@
  *
  * Author       Matt Henderson & Guy Ellis
  * Copyright    by Traverse Technologies Pty Ltd, www.travers.com.au
- * 
+ *
  * This software may be used and distributed according to the terms
  * of the GNU General Public License, incorporated herein by reference.
  *
- * 1999.7.14 Initial implementation of routines for Siemens ISDN 
- * Communication Controller PEB 2070 based on the ISAC routines 
+ * 1999.7.14 Initial implementation of routines for Siemens ISDN
+ * Communication Controller PEB 2070 based on the ISAC routines
  * written by Karsten Keil.
  */
 
index f92a04a..4f937f0 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Author       Karsten Keil
  * Copyright    by Karsten Keil      <keil@isdn4linux.de>
- * 
+ *
  * This software may be used and distributed according to the terms
  * of the GNU General Public License, incorporated herein by reference.
  *
index 6908404..74feb5c 100644 (file)
@@ -1,10 +1,10 @@
-/* 
+/*
  *
  * IPACX specific routines
  *
  * Author       Joerg Petersohn
  * Derived from hisax_isac.c, isac.c, hscx.c and others
- * 
+ *
  * This software may be used and distributed according to the terms
  * of the GNU General Public License, incorporated herein by reference.
  *
@@ -24,7 +24,7 @@
 #define D_FIFO_SIZE       32
 
 
-// ipacx interrupt mask values    
+// ipacx interrupt mask values
 #define _MASK_IMASK     0x2E  // global mask
 #define _MASKB_IMASK    0x0B
 #define _MASKD_IMASK    0x03  // all on
@@ -55,33 +55,33 @@ static void clear_pending_ints(struct IsdnCardState *cs);
 //----------------------------------------------------------
 // Issue Layer 1 command to chip
 //----------------------------------------------------------
-static void 
+static void
 ph_command(struct IsdnCardState *cs, unsigned int command)
 {
-       if (cs->debug &L1_DEB_ISAC)
+       if (cs->debug & L1_DEB_ISAC)
                debugl1(cs, "ph_command (%#x) in (%#x)", command,
                        cs->dc.isac.ph_state);
-//###################################  
+//###################################
 //     printk(KERN_INFO "ph_command (%#x)\n", command);
-//###################################  
+//###################################
        cs->writeisac(cs, IPACX_CIX0, (command << 4) | 0x0E);
 }
 
 //----------------------------------------------------------
 // Transceiver interrupt handler
 //----------------------------------------------------------
-static inline void 
+static inline void
 cic_int(struct IsdnCardState *cs)
 {
        u_char event;
 
        event = cs->readisac(cs, IPACX_CIR0) >> 4;
-       if (cs->debug &L1_DEB_ISAC) debugl1(cs, "cic_int(event=%#x)", event);
-//#########################################  
+       if (cs->debug & L1_DEB_ISAC) debugl1(cs, "cic_int(event=%#x)", event);
+//#########################################
 //     printk(KERN_INFO "cic_int(%x)\n", event);
-//#########################################  
-  cs->dc.isac.ph_state = event;
-  schedule_event(cs, D_L1STATECHANGE);
+//#########################################
+       cs->dc.isac.ph_state = event;
+       schedule_event(cs, D_L1STATECHANGE);
 }
 
 //==========================================================
@@ -99,99 +99,99 @@ dch_l2l1(struct PStack *st, int pr, void *arg)
        u_char cda1_cr;
 
        switch (pr) {
-               case (PH_DATA |REQUEST):
-                       if (cs->debug &DEB_DLOG_HEX)     LogFrame(cs, skb->data, skb->len);
-                       if (cs->debug &DEB_DLOG_VERBOSE) dlogframe(cs, skb, 0);
-                       if (cs->tx_skb) {
-                               skb_queue_tail(&cs->sq, skb);
-#ifdef L2FRAME_DEBUG
-                               if (cs->debug &L1_DEB_LAPD) Logl2Frame(cs, skb, "PH_DATA Queued", 0);
-#endif
-                       } else {
-                               cs->tx_skb = skb;
-                               cs->tx_cnt = 0;
+       case (PH_DATA | REQUEST):
+               if (cs->debug & DEB_DLOG_HEX) LogFrame(cs, skb->data, skb->len);
+               if (cs->debug & DEB_DLOG_VERBOSE) dlogframe(cs, skb, 0);
+               if (cs->tx_skb) {
+                       skb_queue_tail(&cs->sq, skb);
 #ifdef L2FRAME_DEBUG
-                               if (cs->debug &L1_DEB_LAPD) Logl2Frame(cs, skb, "PH_DATA", 0);
+                       if (cs->debug & L1_DEB_LAPD) Logl2Frame(cs, skb, "PH_DATA Queued", 0);
 #endif
-                               dch_fill_fifo(cs);
-                       }
-                       break;
-      
-               case (PH_PULL |INDICATION):
-                       if (cs->tx_skb) {
-                               if (cs->debug & L1_DEB_WARN)
-                                       debugl1(cs, " l2l1 tx_skb exist this shouldn't happen");
-                               skb_queue_tail(&cs->sq, skb);
-                               break;
-                       }
-                       if (cs->debug & DEB_DLOG_HEX)     LogFrame(cs, skb->data, skb->len);
-                       if (cs->debug & DEB_DLOG_VERBOSE) dlogframe(cs, skb, 0);
+               } else {
                        cs->tx_skb = skb;
                        cs->tx_cnt = 0;
 #ifdef L2FRAME_DEBUG
-                       if (cs->debug & L1_DEB_LAPD) Logl2Frame(cs, skb, "PH_DATA_PULLED", 0);
+                       if (cs->debug & L1_DEB_LAPD) Logl2Frame(cs, skb, "PH_DATA", 0);
 #endif
                        dch_fill_fifo(cs);
+               }
+               break;
+
+       case (PH_PULL | INDICATION):
+               if (cs->tx_skb) {
+                       if (cs->debug & L1_DEB_WARN)
+                               debugl1(cs, " l2l1 tx_skb exist this shouldn't happen");
+                       skb_queue_tail(&cs->sq, skb);
                        break;
-      
-               case (PH_PULL | REQUEST):
+               }
+               if (cs->debug & DEB_DLOG_HEX)     LogFrame(cs, skb->data, skb->len);
+               if (cs->debug & DEB_DLOG_VERBOSE) dlogframe(cs, skb, 0);
+               cs->tx_skb = skb;
+               cs->tx_cnt = 0;
 #ifdef L2FRAME_DEBUG
-                       if (cs->debug & L1_DEB_LAPD) debugl1(cs, "-> PH_REQUEST_PULL");
+               if (cs->debug & L1_DEB_LAPD) Logl2Frame(cs, skb, "PH_DATA_PULLED", 0);
 #endif
-                       if (!cs->tx_skb) {
-                               clear_bit(FLG_L1_PULL_REQ, &st->l1.Flags);
-                               st->l1.l1l2(st, PH_PULL | CONFIRM, NULL);
-                       } else
-                               set_bit(FLG_L1_PULL_REQ, &st->l1.Flags);
-                       break;
-
-               case (HW_RESET | REQUEST):
-               case (HW_ENABLE | REQUEST):
-                       if ((cs->dc.isac.ph_state == IPACX_IND_RES) ||
-                               (cs->dc.isac.ph_state == IPACX_IND_DR) ||
-                               (cs->dc.isac.ph_state == IPACX_IND_DC))
-                               ph_command(cs, IPACX_CMD_TIM);
-                       else
-                               ph_command(cs, IPACX_CMD_RES);
-                       break;
-
-               case (HW_INFO3 | REQUEST):
-                       ph_command(cs, IPACX_CMD_AR8);
-                       break;
-
-               case (HW_TESTLOOP | REQUEST):
-      cs->writeisac(cs, IPACX_CDA_TSDP10, 0x80); // Timeslot 0 is B1
-      cs->writeisac(cs, IPACX_CDA_TSDP11, 0x81); // Timeslot 0 is B1
-      cda1_cr = cs->readisac(cs, IPACX_CDA1_CR);
-      (void) cs->readisac(cs, IPACX_CDA2_CR);
-                       if ((long)arg &1) { // loop B1
-        cs->writeisac(cs, IPACX_CDA1_CR, cda1_cr |0x0a); 
-      }
-      else {  // B1 off
-        cs->writeisac(cs, IPACX_CDA1_CR, cda1_cr &~0x0a); 
-      }
-                       if ((long)arg &2) { // loop B2
-        cs->writeisac(cs, IPACX_CDA1_CR, cda1_cr |0x14); 
-      }
-      else {  // B2 off
-        cs->writeisac(cs, IPACX_CDA1_CR, cda1_cr &~0x14); 
-      }
-                       break;
+               dch_fill_fifo(cs);
+               break;
 
-               case (HW_DEACTIVATE | RESPONSE):
-                       skb_queue_purge(&cs->rq);
-                       skb_queue_purge(&cs->sq);
-                       if (cs->tx_skb) {
-                               dev_kfree_skb_any(cs->tx_skb);
-                               cs->tx_skb = NULL;
-                       }
-                       if (test_and_clear_bit(FLG_DBUSY_TIMER, &cs->HW_Flags))
-                               del_timer(&cs->dbusytimer);
-                       break;
+       case (PH_PULL | REQUEST):
+#ifdef L2FRAME_DEBUG
+               if (cs->debug & L1_DEB_LAPD) debugl1(cs, "-> PH_REQUEST_PULL");
+#endif
+               if (!cs->tx_skb) {
+                       clear_bit(FLG_L1_PULL_REQ, &st->l1.Flags);
+                       st->l1.l1l2(st, PH_PULL | CONFIRM, NULL);
+               } else
+                       set_bit(FLG_L1_PULL_REQ, &st->l1.Flags);
+               break;
+
+       case (HW_RESET | REQUEST):
+       case (HW_ENABLE | REQUEST):
+               if ((cs->dc.isac.ph_state == IPACX_IND_RES) ||
+                   (cs->dc.isac.ph_state == IPACX_IND_DR) ||
+                   (cs->dc.isac.ph_state == IPACX_IND_DC))
+                       ph_command(cs, IPACX_CMD_TIM);
+               else
+                       ph_command(cs, IPACX_CMD_RES);
+               break;
+
+       case (HW_INFO3 | REQUEST):
+               ph_command(cs, IPACX_CMD_AR8);
+               break;
+
+       case (HW_TESTLOOP | REQUEST):
+               cs->writeisac(cs, IPACX_CDA_TSDP10, 0x80); // Timeslot 0 is B1
+               cs->writeisac(cs, IPACX_CDA_TSDP11, 0x81); // Timeslot 0 is B1
+               cda1_cr = cs->readisac(cs, IPACX_CDA1_CR);
+               (void) cs->readisac(cs, IPACX_CDA2_CR);
+               if ((long)arg & 1) { // loop B1
+                       cs->writeisac(cs, IPACX_CDA1_CR, cda1_cr | 0x0a);
+               }
+               else {  // B1 off
+                       cs->writeisac(cs, IPACX_CDA1_CR, cda1_cr & ~0x0a);
+               }
+               if ((long)arg & 2) { // loop B2
+                       cs->writeisac(cs, IPACX_CDA1_CR, cda1_cr | 0x14);
+               }
+               else {  // B2 off
+                       cs->writeisac(cs, IPACX_CDA1_CR, cda1_cr & ~0x14);
+               }
+               break;
+
+       case (HW_DEACTIVATE | RESPONSE):
+               skb_queue_purge(&cs->rq);
+               skb_queue_purge(&cs->sq);
+               if (cs->tx_skb) {
+                       dev_kfree_skb_any(cs->tx_skb);
+                       cs->tx_skb = NULL;
+               }
+               if (test_and_clear_bit(FLG_DBUSY_TIMER, &cs->HW_Flags))
+                       del_timer(&cs->dbusytimer);
+               break;
 
-               default:
-                       if (cs->debug &L1_DEB_WARN) debugl1(cs, "dch_l2l1 unknown %04x", pr);
-                       break;
+       default:
+               if (cs->debug & L1_DEB_WARN) debugl1(cs, "dch_l2l1 unknown %04x", pr);
+               break;
        }
 }
 
@@ -206,11 +206,11 @@ dbusy_timer_handler(struct IsdnCardState *cs)
        if (test_bit(FLG_DBUSY_TIMER, &cs->HW_Flags)) {
                rbchd = cs->readisac(cs, IPACX_RBCHD);
                stard = cs->readisac(cs, IPACX_STARD);
-               if (cs->debug) 
-      debugl1(cs, "D-Channel Busy RBCHD %02x STARD %02x", rbchd, stard);
-               if (!(stard &0x40)) { // D-Channel Busy
+               if (cs->debug)
+                       debugl1(cs, "D-Channel Busy RBCHD %02x STARD %02x", rbchd, stard);
+               if (!(stard & 0x40)) { // D-Channel Busy
                        set_bit(FLG_L1_DBUSY, &cs->HW_Flags);
-      for (st = cs->stlist; st; st = st->next) {
+                       for (st = cs->stlist; st; st = st->next) {
                                st->l1.l1l2(st, PH_PAUSE | INDICATION, NULL); // flow control on
                        }
                } else {
@@ -232,30 +232,30 @@ dbusy_timer_handler(struct IsdnCardState *cs)
 //----------------------------------------------------------
 // Fill buffer from receive FIFO
 //----------------------------------------------------------
-static void 
+static void
 dch_empty_fifo(struct IsdnCardState *cs, int count)
 {
        u_char *ptr;
 
-       if ((cs->debug &L1_DEB_ISAC) && !(cs->debug &L1_DEB_ISAC_FIFO))
+       if ((cs->debug & L1_DEB_ISAC) && !(cs->debug & L1_DEB_ISAC_FIFO))
                debugl1(cs, "dch_empty_fifo()");
 
-  // message too large, remove
+       // message too large, remove
        if ((cs->rcvidx + count) >= MAX_DFRAME_LEN_L1) {
-               if (cs->debug &L1_DEB_WARN)
+               if (cs->debug & L1_DEB_WARN)
                        debugl1(cs, "dch_empty_fifo() incoming message too large");
-         cs->writeisac(cs, IPACX_CMDRD, 0x80); // RMC
+               cs->writeisac(cs, IPACX_CMDRD, 0x80); // RMC
                cs->rcvidx = 0;
                return;
        }
-  
+
        ptr = cs->rcvbuf + cs->rcvidx;
        cs->rcvidx += count;
-  
+
        cs->readisacfifo(cs, ptr, count);
        cs->writeisac(cs, IPACX_CMDRD, 0x80); // RMC
-  
-       if (cs->debug &L1_DEB_ISAC_FIFO) {
+
+       if (cs->debug & L1_DEB_ISAC_FIFO) {
                char *t = cs->dlog;
 
                t += sprintf(t, "dch_empty_fifo() cnt %d", count);
@@ -267,15 +267,15 @@ dch_empty_fifo(struct IsdnCardState *cs, int count)
 //----------------------------------------------------------
 // Fill transmit FIFO
 //----------------------------------------------------------
-static void 
+static void
 dch_fill_fifo(struct IsdnCardState *cs)
 {
        int count;
        u_char cmd, *ptr;
 
-       if ((cs->debug &L1_DEB_ISAC) && !(cs->debug &L1_DEB_ISAC_FIFO))
+       if ((cs->debug & L1_DEB_ISAC) && !(cs->debug & L1_DEB_ISAC_FIFO))
                debugl1(cs, "dch_fill_fifo()");
-    
+
        if (!cs->tx_skb) return;
        count = cs->tx_skb->len;
        if (count <= 0) return;
@@ -286,14 +286,14 @@ dch_fill_fifo(struct IsdnCardState *cs)
        } else {
                cmd   = 0x0A; // XTF | XME
        }
-  
+
        ptr = cs->tx_skb->data;
        skb_pull(cs->tx_skb, count);
        cs->tx_cnt += count;
        cs->writeisacfifo(cs, ptr, count);
        cs->writeisac(cs, IPACX_CMDRD, cmd);
-  
-  // set timeout for transmission contol
+
+       // set timeout for transmission contol
        if (test_and_set_bit(FLG_DBUSY_TIMER, &cs->HW_Flags)) {
                debugl1(cs, "dch_fill_fifo dbusytimer running");
                del_timer(&cs->dbusytimer);
@@ -301,8 +301,8 @@ dch_fill_fifo(struct IsdnCardState *cs)
        init_timer(&cs->dbusytimer);
        cs->dbusytimer.expires = jiffies + ((DBUSY_TIMER_VALUE * HZ)/1000);
        add_timer(&cs->dbusytimer);
-  
-       if (cs->debug &L1_DEB_ISAC_FIFO) {
+
+       if (cs->debug & L1_DEB_ISAC_FIFO) {
                char *t = cs->dlog;
 
                t += sprintf(t, "dch_fill_fifo() cnt %d", count);
@@ -314,7 +314,7 @@ dch_fill_fifo(struct IsdnCardState *cs)
 //----------------------------------------------------------
 // D channel interrupt handler
 //----------------------------------------------------------
-static inline void 
+static inline void
 dch_int(struct IsdnCardState *cs)
 {
        struct sk_buff *skb;
@@ -322,31 +322,31 @@ dch_int(struct IsdnCardState *cs)
        int count;
 
        istad = cs->readisac(cs, IPACX_ISTAD);
-//##############################################  
+//##############################################
 //     printk(KERN_WARNING "dch_int(istad=%02x)\n", istad);
-//##############################################  
-  
-       if (istad &0x80) {  // RME
-         rstad = cs->readisac(cs, IPACX_RSTAD);
-               if ((rstad &0xf0) != 0xa0) { // !(VFR && !RDO && CRC && !RAB)
-                       if (!(rstad &0x80))
-                               if (cs->debug &L1_DEB_WARN) 
-          debugl1(cs, "dch_int(): invalid frame");
-                       if ((rstad &0x40))
-                               if (cs->debug &L1_DEB_WARN) 
-          debugl1(cs, "dch_int(): RDO");
-                       if (!(rstad &0x20))
-                               if (cs->debug &L1_DEB_WARN) 
-          debugl1(cs, "dch_int(): CRC error");
-           cs->writeisac(cs, IPACX_CMDRD, 0x80);  // RMC
+//##############################################
+
+       if (istad & 0x80) {  // RME
+               rstad = cs->readisac(cs, IPACX_RSTAD);
+               if ((rstad & 0xf0) != 0xa0) { // !(VFR && !RDO && CRC && !RAB)
+                       if (!(rstad & 0x80))
+                               if (cs->debug & L1_DEB_WARN)
+                                       debugl1(cs, "dch_int(): invalid frame");
+                       if ((rstad & 0x40))
+                               if (cs->debug & L1_DEB_WARN)
+                                       debugl1(cs, "dch_int(): RDO");
+                       if (!(rstad & 0x20))
+                               if (cs->debug & L1_DEB_WARN)
+                                       debugl1(cs, "dch_int(): CRC error");
+                       cs->writeisac(cs, IPACX_CMDRD, 0x80);  // RMC
                } else {  // received frame ok
                        count = cs->readisac(cs, IPACX_RBCLD);
-      if (count) count--; // RSTAB is last byte
-                       count &= D_FIFO_SIZE-1;
+                       if (count) count--; // RSTAB is last byte
+                       count &= D_FIFO_SIZE - 1;
                        if (count == 0) count = D_FIFO_SIZE;
                        dch_empty_fifo(cs, count);
                        if ((count = cs->rcvidx) > 0) {
-             cs->rcvidx = 0;
+                               cs->rcvidx = 0;
                                if (!(skb = dev_alloc_skb(count)))
                                        printk(KERN_WARNING "HiSax dch_int(): receive out of memory\n");
                                else {
@@ -354,57 +354,57 @@ dch_int(struct IsdnCardState *cs)
                                        skb_queue_tail(&cs->rq, skb);
                                }
                        }
-    }
-         cs->rcvidx = 0;
+               }
+               cs->rcvidx = 0;
                schedule_event(cs, D_RCVBUFREADY);
        }
 
-       if (istad &0x40) {  // RPF
+       if (istad & 0x40) {  // RPF
                dch_empty_fifo(cs, D_FIFO_SIZE);
        }
 
-       if (istad &0x20) {  // RFO
-               if (cs->debug &L1_DEB_WARN) debugl1(cs, "dch_int(): RFO");
-         cs->writeisac(cs, IPACX_CMDRD, 0x40); //RRES
+       if (istad & 0x20) {  // RFO
+               if (cs->debug & L1_DEB_WARN) debugl1(cs, "dch_int(): RFO");
+               cs->writeisac(cs, IPACX_CMDRD, 0x40); //RRES
        }
-  
-  if (istad &0x10) {  // XPR
+
+       if (istad & 0x10) {  // XPR
                if (test_and_clear_bit(FLG_DBUSY_TIMER, &cs->HW_Flags))
                        del_timer(&cs->dbusytimer);
                if (test_and_clear_bit(FLG_L1_DBUSY, &cs->HW_Flags))
                        schedule_event(cs, D_CLEARBUSY);
-    if (cs->tx_skb) {
-      if (cs->tx_skb->len) {
-        dch_fill_fifo(cs);
-        goto afterXPR;
-      }
-      else {
-        dev_kfree_skb_irq(cs->tx_skb);
-        cs->tx_skb = NULL;
-        cs->tx_cnt = 0;
-      }
-    }
-    if ((cs->tx_skb = skb_dequeue(&cs->sq))) {
-      cs->tx_cnt = 0;
-      dch_fill_fifo(cs);
-    } 
-    else {
-      schedule_event(cs, D_XMTBUFREADY);
-    }  
-  }  
-  afterXPR:
-
-       if (istad &0x0C) {  // XDU or XMR
-               if (cs->debug &L1_DEB_WARN) debugl1(cs, "dch_int(): XDU");
-         if (cs->tx_skb) {
-           skb_push(cs->tx_skb, cs->tx_cnt); // retransmit
-           cs->tx_cnt = 0;
+               if (cs->tx_skb) {
+                       if (cs->tx_skb->len) {
+                               dch_fill_fifo(cs);
+                               goto afterXPR;
+                       }
+                       else {
+                               dev_kfree_skb_irq(cs->tx_skb);
+                               cs->tx_skb = NULL;
+                               cs->tx_cnt = 0;
+                       }
+               }
+               if ((cs->tx_skb = skb_dequeue(&cs->sq))) {
+                       cs->tx_cnt = 0;
+                       dch_fill_fifo(cs);
+               }
+               else {
+                       schedule_event(cs, D_XMTBUFREADY);
+               }
+       }
+afterXPR:
+
+       if (istad & 0x0C) {  // XDU or XMR
+               if (cs->debug & L1_DEB_WARN) debugl1(cs, "dch_int(): XDU");
+               if (cs->tx_skb) {
+                       skb_push(cs->tx_skb, cs->tx_cnt); // retransmit
+                       cs->tx_cnt = 0;
                        dch_fill_fifo(cs);
                } else {
                        printk(KERN_WARNING "HiSax: ISAC XDU no skb\n");
                        debugl1(cs, "ISAC XDU no skb");
                }
-  }
+       }
 }
 
 //----------------------------------------------------------
@@ -423,15 +423,15 @@ dch_init(struct IsdnCardState *cs)
        printk(KERN_INFO "HiSax: IPACX ISDN driver v0.1.0\n");
 
        cs->setstack_d      = dch_setstack;
-  
+
        cs->dbusytimer.function = (void *) dbusy_timer_handler;
        cs->dbusytimer.data = (long) cs;
        init_timer(&cs->dbusytimer);
 
-  cs->writeisac(cs, IPACX_TR_CONF0, 0x00);  // clear LDD
-  cs->writeisac(cs, IPACX_TR_CONF2, 0x00);  // enable transmitter
-  cs->writeisac(cs, IPACX_MODED,    0xC9);  // transparent mode 0, RAC, stop/go
-  cs->writeisac(cs, IPACX_MON_CR,   0x00);  // disable monitor channel
+       cs->writeisac(cs, IPACX_TR_CONF0, 0x00);  // clear LDD
+       cs->writeisac(cs, IPACX_TR_CONF2, 0x00);  // enable transmitter
+       cs->writeisac(cs, IPACX_MODED,    0xC9);  // transparent mode 0, RAC, stop/go
+       cs->writeisac(cs, IPACX_MON_CR,   0x00);  // disable monitor channel
 }
 
 
@@ -450,55 +450,55 @@ bch_l2l1(struct PStack *st, int pr, void *arg)
        u_long flags;
 
        switch (pr) {
-               case (PH_DATA | REQUEST):
-                       spin_lock_irqsave(&bcs->cs->lock, flags);
-                       if (bcs->tx_skb) {
-                               skb_queue_tail(&bcs->squeue, skb);
-                       } else {
-                               bcs->tx_skb = skb;
-                               set_bit(BC_FLG_BUSY, &bcs->Flag);
-                               bcs->hw.hscx.count = 0;
-                               bch_fill_fifo(bcs);
-                       }
-                       spin_unlock_irqrestore(&bcs->cs->lock, flags);
-                       break;
-               case (PH_PULL | INDICATION):
-                       spin_lock_irqsave(&bcs->cs->lock, flags);
-                       if (bcs->tx_skb) {
-                               printk(KERN_WARNING "HiSax bch_l2l1(): this shouldn't happen\n");
-                       } else {
-                               set_bit(BC_FLG_BUSY, &bcs->Flag);
-                               bcs->tx_skb = skb;
-                               bcs->hw.hscx.count = 0;
-                               bch_fill_fifo(bcs);
-                       }
-                       spin_unlock_irqrestore(&bcs->cs->lock, flags);
-                       break;
-               case (PH_PULL | REQUEST):
-                       if (!bcs->tx_skb) {
-                               clear_bit(FLG_L1_PULL_REQ, &st->l1.Flags);
-                               st->l1.l1l2(st, PH_PULL | CONFIRM, NULL);
-                       } else
-                               set_bit(FLG_L1_PULL_REQ, &st->l1.Flags);
-                       break;
-               case (PH_ACTIVATE | REQUEST):
-                       spin_lock_irqsave(&bcs->cs->lock, flags);
-                       set_bit(BC_FLG_ACTIV, &bcs->Flag);
-                       bch_mode(bcs, st->l1.mode, st->l1.bc);
-                       spin_unlock_irqrestore(&bcs->cs->lock, flags);
-                       l1_msg_b(st, pr, arg);
-                       break;
-               case (PH_DEACTIVATE | REQUEST):
-                       l1_msg_b(st, pr, arg);
-                       break;
-               case (PH_DEACTIVATE | CONFIRM):
-                       spin_lock_irqsave(&bcs->cs->lock, flags);
-                       clear_bit(BC_FLG_ACTIV, &bcs->Flag);
-                       clear_bit(BC_FLG_BUSY, &bcs->Flag);
-                       bch_mode(bcs, 0, st->l1.bc);
-                       spin_unlock_irqrestore(&bcs->cs->lock, flags);
-                       st->l1.l1l2(st, PH_DEACTIVATE | CONFIRM, NULL);
-                       break;
+       case (PH_DATA | REQUEST):
+               spin_lock_irqsave(&bcs->cs->lock, flags);
+               if (bcs->tx_skb) {
+                       skb_queue_tail(&bcs->squeue, skb);
+               } else {
+                       bcs->tx_skb = skb;
+                       set_bit(BC_FLG_BUSY, &bcs->Flag);
+                       bcs->hw.hscx.count = 0;
+                       bch_fill_fifo(bcs);
+               }
+               spin_unlock_irqrestore(&bcs->cs->lock, flags);
+               break;
+       case (PH_PULL | INDICATION):
+               spin_lock_irqsave(&bcs->cs->lock, flags);
+               if (bcs->tx_skb) {
+                       printk(KERN_WARNING "HiSax bch_l2l1(): this shouldn't happen\n");
+               } else {
+                       set_bit(BC_FLG_BUSY, &bcs->Flag);
+                       bcs->tx_skb = skb;
+                       bcs->hw.hscx.count = 0;
+                       bch_fill_fifo(bcs);
+               }
+               spin_unlock_irqrestore(&bcs->cs->lock, flags);
+               break;
+       case (PH_PULL | REQUEST):
+               if (!bcs->tx_skb) {
+                       clear_bit(FLG_L1_PULL_REQ, &st->l1.Flags);
+                       st->l1.l1l2(st, PH_PULL | CONFIRM, NULL);
+               } else
+                       set_bit(FLG_L1_PULL_REQ, &st->l1.Flags);
+               break;
+       case (PH_ACTIVATE | REQUEST):
+               spin_lock_irqsave(&bcs->cs->lock, flags);
+               set_bit(BC_FLG_ACTIV, &bcs->Flag);
+               bch_mode(bcs, st->l1.mode, st->l1.bc);
+               spin_unlock_irqrestore(&bcs->cs->lock, flags);
+               l1_msg_b(st, pr, arg);
+               break;
+       case (PH_DEACTIVATE | REQUEST):
+               l1_msg_b(st, pr, arg);
+               break;
+       case (PH_DEACTIVATE | CONFIRM):
+               spin_lock_irqsave(&bcs->cs->lock, flags);
+               clear_bit(BC_FLG_ACTIV, &bcs->Flag);
+               clear_bit(BC_FLG_BUSY, &bcs->Flag);
+               bch_mode(bcs, 0, st->l1.bc);
+               spin_unlock_irqrestore(&bcs->cs->lock, flags);
+               st->l1.l1l2(st, PH_DEACTIVATE | CONFIRM, NULL);
+               break;
        }
 }
 
@@ -513,28 +513,28 @@ bch_empty_fifo(struct BCState *bcs, int count)
        int cnt;
 
        cs = bcs->cs;
-  hscx = bcs->hw.hscx.hscx;
-       if ((cs->debug &L1_DEB_HSCX) && !(cs->debug &L1_DEB_HSCX_FIFO))
+       hscx = bcs->hw.hscx.hscx;
+       if ((cs->debug & L1_DEB_HSCX) && !(cs->debug & L1_DEB_HSCX_FIFO))
                debugl1(cs, "bch_empty_fifo()");
 
-  // message too large, remove
+       // message too large, remove
        if (bcs->hw.hscx.rcvidx + count > HSCX_BUFMAX) {
-               if (cs->debug &L1_DEB_WARN)
+               if (cs->debug & L1_DEB_WARN)
                        debugl1(cs, "bch_empty_fifo() incoming packet too large");
-         cs->BC_Write_Reg(cs, hscx, IPACX_CMDRB, 0x80);  // RMC
+               cs->BC_Write_Reg(cs, hscx, IPACX_CMDRB, 0x80);  // RMC
                bcs->hw.hscx.rcvidx = 0;
                return;
        }
-  
+
        ptr = bcs->hw.hscx.rcvbuf + bcs->hw.hscx.rcvidx;
        cnt = count;
-       while (cnt--) *ptr++ = cs->BC_Read_Reg(cs, hscx, IPACX_RFIFOB); 
+       while (cnt--) *ptr++ = cs->BC_Read_Reg(cs, hscx, IPACX_RFIFOB);
        cs->BC_Write_Reg(cs, hscx, IPACX_CMDRB, 0x80);  // RMC
-  
+
        ptr = bcs->hw.hscx.rcvbuf + bcs->hw.hscx.rcvidx;
        bcs->hw.hscx.rcvidx += count;
-  
-       if (cs->debug &L1_DEB_HSCX_FIFO) {
+
+       if (cs->debug & L1_DEB_HSCX_FIFO) {
                char *t = bcs->blog;
 
                t += sprintf(t, "bch_empty_fifo() B-%d cnt %d", hscx, count);
@@ -554,7 +554,7 @@ bch_fill_fifo(struct BCState *bcs)
        u_char *ptr, *p, hscx;
 
        cs = bcs->cs;
-       if ((cs->debug &L1_DEB_HSCX) && !(cs->debug &L1_DEB_HSCX_FIFO))
+       if ((cs->debug & L1_DEB_HSCX) && !(cs->debug & L1_DEB_HSCX_FIFO))
                debugl1(cs, "bch_fill_fifo()");
 
        if (!bcs->tx_skb)           return;
@@ -567,17 +567,17 @@ bch_fill_fifo(struct BCState *bcs)
                count = B_FIFO_SIZE;
        } else {
                count = bcs->tx_skb->len;
-       }  
+       }
        cnt = count;
-    
+
        p = ptr = bcs->tx_skb->data;
        skb_pull(bcs->tx_skb, count);
        bcs->tx_cnt -= count;
        bcs->hw.hscx.count += count;
-       while (cnt--) cs->BC_Write_Reg(cs, hscx, IPACX_XFIFOB, *p++); 
+       while (cnt--) cs->BC_Write_Reg(cs, hscx, IPACX_XFIFOB, *p++);
        cs->BC_Write_Reg(cs, hscx, IPACX_CMDRB, (more ? 0x08 : 0x0a));
-  
-       if (cs->debug &L1_DEB_HSCX_FIFO) {
+
+       if (cs->debug & L1_DEB_HSCX_FIFO) {
                char *t = bcs->blog;
 
                t += sprintf(t, "chb_fill_fifo() B-%d cnt %d", hscx, count);
@@ -600,31 +600,31 @@ bch_int(struct IsdnCardState *cs, u_char hscx)
 
        bcs = cs->bcs + hscx;
        istab = cs->BC_Read_Reg(cs, hscx, IPACX_ISTAB);
-//##############################################  
+//##############################################
 //     printk(KERN_WARNING "bch_int(istab=%02x)\n", istab);
-//##############################################  
+//##############################################
        if (!test_bit(BC_FLG_INIT, &bcs->Flag)) return;
 
-       if (istab &0x80) {      // RME
+       if (istab & 0x80) {     // RME
                rstab = cs->BC_Read_Reg(cs, hscx, IPACX_RSTAB);
-               if ((rstab &0xf0) != 0xa0) { // !(VFR && !RDO && CRC && !RAB)
-                       if (!(rstab &0x80))
-                               if (cs->debug &L1_DEB_WARN) 
-          debugl1(cs, "bch_int() B-%d: invalid frame", hscx);
-                       if ((rstab &0x40) && (bcs->mode != L1_MODE_NULL))
-                               if (cs->debug &L1_DEB_WARN) 
-          debugl1(cs, "bch_int() B-%d: RDO mode=%d", hscx, bcs->mode);
-                       if (!(rstab &0x20))
-                               if (cs->debug &L1_DEB_WARN) 
-          debugl1(cs, "bch_int() B-%d: CRC error", hscx);
-           cs->BC_Write_Reg(cs, hscx, IPACX_CMDRB, 0x80);  // RMC
-               } 
-    else {  // received frame ok
-                       count = cs->BC_Read_Reg(cs, hscx, IPACX_RBCLB) &(B_FIFO_SIZE-1);
+               if ((rstab & 0xf0) != 0xa0) { // !(VFR && !RDO && CRC && !RAB)
+                       if (!(rstab & 0x80))
+                               if (cs->debug & L1_DEB_WARN)
+                                       debugl1(cs, "bch_int() B-%d: invalid frame", hscx);
+                       if ((rstab & 0x40) && (bcs->mode != L1_MODE_NULL))
+                               if (cs->debug & L1_DEB_WARN)
+                                       debugl1(cs, "bch_int() B-%d: RDO mode=%d", hscx, bcs->mode);
+                       if (!(rstab & 0x20))
+                               if (cs->debug & L1_DEB_WARN)
+                                       debugl1(cs, "bch_int() B-%d: CRC error", hscx);
+                       cs->BC_Write_Reg(cs, hscx, IPACX_CMDRB, 0x80);  // RMC
+               }
+               else {  // received frame ok
+                       count = cs->BC_Read_Reg(cs, hscx, IPACX_RBCLB) & (B_FIFO_SIZE - 1);
                        if (count == 0) count = B_FIFO_SIZE;
                        bch_empty_fifo(bcs, count);
                        if ((count = bcs->hw.hscx.rcvidx - 1) > 0) {
-                               if (cs->debug &L1_DEB_HSCX_FIFO)
+                               if (cs->debug & L1_DEB_HSCX_FIFO)
                                        debugl1(cs, "bch_int Frame %d", count);
                                if (!(skb = dev_alloc_skb(count)))
                                        printk(KERN_WARNING "HiSax bch_int(): receive frame out of memory\n");
@@ -637,8 +637,8 @@ bch_int(struct IsdnCardState *cs, u_char hscx)
                bcs->hw.hscx.rcvidx = 0;
                schedule_event(bcs, B_RCVBUFREADY);
        }
-  
-       if (istab &0x40) {      // RPF
+
+       if (istab & 0x40) {     // RPF
                bch_empty_fifo(bcs, B_FIFO_SIZE);
 
                if (bcs->mode == L1_MODE_TRANS) { // queue every chunk
@@ -653,21 +653,21 @@ bch_int(struct IsdnCardState *cs, u_char hscx)
                        schedule_event(bcs, B_RCVBUFREADY);
                }
        }
-  
-       if (istab &0x20) {      // RFO
-               if (cs->debug &L1_DEB_WARN) 
+
+       if (istab & 0x20) {     // RFO
+               if (cs->debug & L1_DEB_WARN)
                        debugl1(cs, "bch_int() B-%d: RFO error", hscx);
                cs->BC_Write_Reg(cs, hscx, IPACX_CMDRB, 0x40);  // RRES
        }
 
-       if (istab &0x10) {      // XPR
+       if (istab & 0x10) {     // XPR
                if (bcs->tx_skb) {
                        if (bcs->tx_skb->len) {
                                bch_fill_fifo(bcs);
                                goto afterXPR;
                        } else {
-                               if (test_bit(FLG_LLI_L1WAKEUP,&bcs->st->lli.flag) &&
-                                       (PACKET_NOACK != bcs->tx_skb->pkt_type)) {
+                               if (test_bit(FLG_LLI_L1WAKEUP, &bcs->st->lli.flag) &&
+                                   (PACKET_NOACK != bcs->tx_skb->pkt_type)) {
                                        u_long  flags;
                                        spin_lock_irqsave(&bcs->aclock, flags);
                                        bcs->ackcnt += bcs->hw.hscx.count;
@@ -678,7 +678,7 @@ bch_int(struct IsdnCardState *cs, u_char hscx)
                        dev_kfree_skb_irq(bcs->tx_skb);
                        bcs->hw.hscx.count = 0;
                        bcs->tx_skb = NULL;
-               }
+               }
                if ((bcs->tx_skb = skb_dequeue(&bcs->squeue))) {
                        bcs->hw.hscx.count = 0;
                        set_bit(BC_FLG_BUSY, &bcs->Flag);
@@ -688,22 +688,22 @@ bch_int(struct IsdnCardState *cs, u_char hscx)
                        schedule_event(bcs, B_XMTBUFREADY);
                }
        }
-  afterXPR:
+afterXPR:
 
-       if (istab &0x04) {      // XDU
-    if (bcs->mode == L1_MODE_TRANS) {
+       if (istab & 0x04) {     // XDU
+               if (bcs->mode == L1_MODE_TRANS) {
                        bch_fill_fifo(bcs);
-    }  
-    else {
-      if (bcs->tx_skb) {  // restart transmitting the whole frame
-        skb_push(bcs->tx_skb, bcs->hw.hscx.count);
-        bcs->tx_cnt += bcs->hw.hscx.count;
-        bcs->hw.hscx.count = 0;
-      }
-           cs->BC_Write_Reg(cs, hscx, IPACX_CMDRB, 0x01);  // XRES
-      if (cs->debug &L1_DEB_WARN)
-        debugl1(cs, "bch_int() B-%d XDU error", hscx);
-    }
+               }
+               else {
+                       if (bcs->tx_skb) {  // restart transmitting the whole frame
+                               skb_push(bcs->tx_skb, bcs->hw.hscx.count);
+                               bcs->tx_cnt += bcs->hw.hscx.count;
+                               bcs->hw.hscx.count = 0;
+                       }
+                       cs->BC_Write_Reg(cs, hscx, IPACX_CMDRB, 0x01);  // XRES
+                       if (cs->debug & L1_DEB_WARN)
+                               debugl1(cs, "bch_int() B-%d XDU error", hscx);
+               }
        }
 }
 
@@ -715,43 +715,43 @@ bch_mode(struct BCState *bcs, int mode, int bc)
        struct IsdnCardState *cs = bcs->cs;
        int hscx = bcs->hw.hscx.hscx;
 
-        bc = bc ? 1 : 0;  // in case bc is greater than 1
+       bc = bc ? 1 : 0;  // in case bc is greater than 1
        if (cs->debug & L1_DEB_HSCX)
                debugl1(cs, "mode_bch() switch B-%d mode %d chan %d", hscx, mode, bc);
        bcs->mode = mode;
        bcs->channel = bc;
-  
-  // map controller to according timeslot
-  if (!hscx)
-  {
-    cs->writeisac(cs, IPACX_BCHA_TSDP_BC1, 0x80 | bc);
-    cs->writeisac(cs, IPACX_BCHA_CR,       0x88); 
-  }
-  else
-  {
-    cs->writeisac(cs, IPACX_BCHB_TSDP_BC1, 0x80 | bc);
-    cs->writeisac(cs, IPACX_BCHB_CR,       0x88); 
-  }
+
+       // map controller to according timeslot
+       if (!hscx)
+       {
+               cs->writeisac(cs, IPACX_BCHA_TSDP_BC1, 0x80 | bc);
+               cs->writeisac(cs, IPACX_BCHA_CR,       0x88);
+       }
+       else
+       {
+               cs->writeisac(cs, IPACX_BCHB_TSDP_BC1, 0x80 | bc);
+               cs->writeisac(cs, IPACX_BCHB_CR,       0x88);
+       }
 
        switch (mode) {
-               case (L1_MODE_NULL):
-                   cs->BC_Write_Reg(cs, hscx, IPACX_MODEB, 0xC0);  // rec off
-                   cs->BC_Write_Reg(cs, hscx, IPACX_EXMB,  0x30);  // std adj.
-                   cs->BC_Write_Reg(cs, hscx, IPACX_MASKB, 0xFF);  // ints off
-                   cs->BC_Write_Reg(cs, hscx, IPACX_CMDRB, 0x41);  // validate adjustments
-                   break;
-               case (L1_MODE_TRANS):
-                   cs->BC_Write_Reg(cs, hscx, IPACX_MODEB, 0x88);  // ext transp mode
-                   cs->BC_Write_Reg(cs, hscx, IPACX_EXMB,  0x00);  // xxx00000
-                   cs->BC_Write_Reg(cs, hscx, IPACX_CMDRB, 0x41);  // validate adjustments
-                   cs->BC_Write_Reg(cs, hscx, IPACX_MASKB, _MASKB_IMASK);
-                   break;
-               case (L1_MODE_HDLC):
-                   cs->BC_Write_Reg(cs, hscx, IPACX_MODEB, 0xC8);  // transp mode 0
-                   cs->BC_Write_Reg(cs, hscx, IPACX_EXMB,  0x01);  // idle=hdlc flags crc enabled
-                   cs->BC_Write_Reg(cs, hscx, IPACX_CMDRB, 0x41);  // validate adjustments
-                   cs->BC_Write_Reg(cs, hscx, IPACX_MASKB, _MASKB_IMASK);
-                   break;
+       case (L1_MODE_NULL):
+               cs->BC_Write_Reg(cs, hscx, IPACX_MODEB, 0xC0);  // rec off
+               cs->BC_Write_Reg(cs, hscx, IPACX_EXMB,  0x30);  // std adj.
+               cs->BC_Write_Reg(cs, hscx, IPACX_MASKB, 0xFF);  // ints off
+               cs->BC_Write_Reg(cs, hscx, IPACX_CMDRB, 0x41);  // validate adjustments
+               break;
+       case (L1_MODE_TRANS):
+               cs->BC_Write_Reg(cs, hscx, IPACX_MODEB, 0x88);  // ext transp mode
+               cs->BC_Write_Reg(cs, hscx, IPACX_EXMB,  0x00);  // xxx00000
+               cs->BC_Write_Reg(cs, hscx, IPACX_CMDRB, 0x41);  // validate adjustments
+               cs->BC_Write_Reg(cs, hscx, IPACX_MASKB, _MASKB_IMASK);
+               break;
+       case (L1_MODE_HDLC):
+               cs->BC_Write_Reg(cs, hscx, IPACX_MODEB, 0xC8);  // transp mode 0
+               cs->BC_Write_Reg(cs, hscx, IPACX_EXMB,  0x01);  // idle=hdlc flags crc enabled
+               cs->BC_Write_Reg(cs, hscx, IPACX_CMDRB, 0x41);  // validate adjustments
+               cs->BC_Write_Reg(cs, hscx, IPACX_MASKB, _MASKB_IMASK);
+               break;
        }
 }
 
@@ -784,13 +784,13 @@ bch_open_state(struct IsdnCardState *cs, struct BCState *bcs)
        if (!test_and_set_bit(BC_FLG_INIT, &bcs->Flag)) {
                if (!(bcs->hw.hscx.rcvbuf = kmalloc(HSCX_BUFMAX, GFP_ATOMIC))) {
                        printk(KERN_WARNING
-                               "HiSax open_bchstate(): No memory for hscx.rcvbuf\n");
+                              "HiSax open_bchstate(): No memory for hscx.rcvbuf\n");
                        clear_bit(BC_FLG_INIT, &bcs->Flag);
                        return (1);
                }
                if (!(bcs->blog = kmalloc(MAX_BLOG_SPACE, GFP_ATOMIC))) {
                        printk(KERN_WARNING
-                               "HiSax open_bchstate: No memory for bcs->blog\n");
+                              "HiSax open_bchstate: No memory for bcs->blog\n");
                        clear_bit(BC_FLG_INIT, &bcs->Flag);
                        kfree(bcs->hw.hscx.rcvbuf);
                        bcs->hw.hscx.rcvbuf = NULL;
@@ -842,21 +842,21 @@ bch_init(struct IsdnCardState *cs, int hscx)
 //----------------------------------------------------------
 // Main interrupt handler
 //----------------------------------------------------------
-void 
+void
 interrupt_ipacx(struct IsdnCardState *cs)
 {
        u_char ista;
-  
+
        while ((ista = cs->readisac(cs, IPACX_ISTA))) {
-//#################################################  
+//#################################################
 //             printk(KERN_WARNING "interrupt_ipacx(ista=%02x)\n", ista);
-//#################################################  
-    if (ista &0x80) bch_int(cs, 0); // B channel interrupts
-    if (ista &0x40) bch_int(cs, 1);
-    
-    if (ista &0x01) dch_int(cs);    // D channel
-    if (ista &0x10) cic_int(cs);    // Layer 1 state
-  }  
+//#################################################
+               if (ista & 0x80) bch_int(cs, 0); // B channel interrupts
+               if (ista & 0x40) bch_int(cs, 1);
+
+               if (ista & 0x01) dch_int(cs);    // D channel
+               if (ista & 0x10) cic_int(cs);    // Layer 1 state
+       }
 }
 
 //----------------------------------------------------------
@@ -867,17 +867,17 @@ clear_pending_ints(struct IsdnCardState *cs)
 {
        int ista;
 
-  // all interrupts off
-  cs->writeisac(cs, IPACX_MASK, 0xff);
+       // all interrupts off
+       cs->writeisac(cs, IPACX_MASK, 0xff);
        cs->writeisac(cs, IPACX_MASKD, 0xff);
        cs->BC_Write_Reg(cs, 0, IPACX_MASKB, 0xff);
        cs->BC_Write_Reg(cs, 1, IPACX_MASKB, 0xff);
-  
-  ista = cs->readisac(cs, IPACX_ISTA); 
-  if (ista &0x80) cs->BC_Read_Reg(cs, 0, IPACX_ISTAB);
-  if (ista &0x40) cs->BC_Read_Reg(cs, 1, IPACX_ISTAB);
-  if (ista &0x10) cs->readisac(cs, IPACX_CIR0);
-  if (ista &0x01) cs->readisac(cs, IPACX_ISTAD); 
+
+       ista = cs->readisac(cs, IPACX_ISTA);
+       if (ista & 0x80) cs->BC_Read_Reg(cs, 0, IPACX_ISTAB);
+       if (ista & 0x40) cs->BC_Read_Reg(cs, 1, IPACX_ISTAB);
+       if (ista & 0x10) cs->readisac(cs, IPACX_CIR0);
+       if (ista & 0x01) cs->readisac(cs, IPACX_ISTAD);
 }
 
 //----------------------------------------------------------
@@ -887,23 +887,23 @@ clear_pending_ints(struct IsdnCardState *cs)
 void
 init_ipacx(struct IsdnCardState *cs, int part)
 {
-       if (part &1) {  // initialise chip
-//##################################################  
+       if (part & 1) {  // initialise chip
+//##################################################
 //     printk(KERN_INFO "init_ipacx(%x)\n", part);
-//##################################################  
+//##################################################
                clear_pending_ints(cs);
                bch_init(cs, 0);
                bch_init(cs, 1);
                dch_init(cs);
        }
-       if (part &2) {  // reenable all interrupts and start chip
+       if (part & 2) {  // reenable all interrupts and start chip
                cs->BC_Write_Reg(cs, 0, IPACX_MASKB, _MASKB_IMASK);
                cs->BC_Write_Reg(cs, 1, IPACX_MASKB, _MASKB_IMASK);
                cs->writeisac(cs, IPACX_MASKD, _MASKD_IMASK);
                cs->writeisac(cs, IPACX_MASK, _MASK_IMASK); // global mask register
 
                // reset HDLC Transmitters/receivers
-               cs->writeisac(cs, IPACX_CMDRD, 0x41); 
+               cs->writeisac(cs, IPACX_CMDRD, 0x41);
                cs->BC_Write_Reg(cs, 0, IPACX_CMDRB, 0x41);
                cs->BC_Write_Reg(cs, 1, IPACX_CMDRB, 0x41);
                ph_command(cs, IPACX_CMD_RES);
@@ -911,4 +911,3 @@ init_ipacx(struct IsdnCardState *cs, int part)
 }
 
 //----------------- end of file -----------------------
-
index 2b66728..bcd70a3 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Author       Karsten Keil
  * Copyright    by Karsten Keil      <keil@isdn4linux.de>
- * 
+ *
  * This software may be used and distributed according to the terms
  * of the GNU General Public License, incorporated herein by reference.
  *
@@ -49,34 +49,34 @@ static void
 isac_new_ph(struct IsdnCardState *cs)
 {
        switch (cs->dc.isac.ph_state) {
-               case (ISAC_IND_RS):
-               case (ISAC_IND_EI):
-                       ph_command(cs, ISAC_CMD_DUI);
-                       l1_msg(cs, HW_RESET | INDICATION, NULL);
-                       break;
-               case (ISAC_IND_DID):
-                       l1_msg(cs, HW_DEACTIVATE | CONFIRM, NULL);
-                       break;
-               case (ISAC_IND_DR):
-                       l1_msg(cs, HW_DEACTIVATE | INDICATION, NULL);
-                       break;
-               case (ISAC_IND_PU):
-                       l1_msg(cs, HW_POWERUP | CONFIRM, NULL);
-                       break;
-               case (ISAC_IND_RSY):
-                       l1_msg(cs, HW_RSYNC | INDICATION, NULL);
-                       break;
-               case (ISAC_IND_ARD):
-                       l1_msg(cs, HW_INFO2 | INDICATION, NULL);
-                       break;
-               case (ISAC_IND_AI8):
-                       l1_msg(cs, HW_INFO4_P8 | INDICATION, NULL);
-                       break;
-               case (ISAC_IND_AI10):
-                       l1_msg(cs, HW_INFO4_P10 | INDICATION, NULL);
-                       break;
-               default:
-                       break;
+       case (ISAC_IND_RS):
+       case (ISAC_IND_EI):
+               ph_command(cs, ISAC_CMD_DUI);
+               l1_msg(cs, HW_RESET | INDICATION, NULL);
+               break;
+       case (ISAC_IND_DID):
+               l1_msg(cs, HW_DEACTIVATE | CONFIRM, NULL);
+               break;
+       case (ISAC_IND_DR):
+               l1_msg(cs, HW_DEACTIVATE | INDICATION, NULL);
+               break;
+       case (ISAC_IND_PU):
+               l1_msg(cs, HW_POWERUP | CONFIRM, NULL);
+               break;
+       case (ISAC_IND_RSY):
+               l1_msg(cs, HW_RSYNC | INDICATION, NULL);
+               break;
+       case (ISAC_IND_ARD):
+               l1_msg(cs, HW_INFO2 | INDICATION, NULL);
+               break;
+       case (ISAC_IND_AI8):
+               l1_msg(cs, HW_INFO4_P8 | INDICATION, NULL);
+               break;
+       case (ISAC_IND_AI10):
+               l1_msg(cs, HW_INFO4_P10 | INDICATION, NULL);
+               break;
+       default:
+               break;
        }
 }
 
@@ -86,7 +86,7 @@ isac_bh(struct work_struct *work)
        struct IsdnCardState *cs =
                container_of(work, struct IsdnCardState, tqueue);
        struct PStack *stptr;
-       
+
        if (test_and_clear_bit(D_CLEARBUSY, &cs->event)) {
                if (cs->debug)
                        debugl1(cs, "D-Channel Busy cleared");
@@ -97,7 +97,7 @@ isac_bh(struct work_struct *work)
                }
        }
        if (test_and_clear_bit(D_L1STATECHANGE, &cs->event))
-               isac_new_ph(cs);                
+               isac_new_ph(cs);
        if (test_and_clear_bit(D_RCVBUFREADY, &cs->event))
                DChannel_proc_rcv(cs);
        if (test_and_clear_bit(D_XMTBUFREADY, &cs->event))
@@ -257,11 +257,11 @@ isac_interrupt(struct IsdnCardState *cs, u_char val)
                } else
                        schedule_event(cs, D_XMTBUFREADY);
        }
-      afterXPR:
+afterXPR:
        if (val & 0x04) {       /* CISQ */
                exval = cs->readisac(cs, ISAC_CIR0);
                if (cs->debug & L1_DEB_ISAC)
-                       debugl1(cs, "ISAC CIR0 %02X", exval );
+                       debugl1(cs, "ISAC CIR0 %02X", exval);
                if (exval & 2) {
                        cs->dc.isac.ph_state = (exval >> 2) & 0xf;
                        if (cs->debug & L1_DEB_ISAC)
@@ -271,7 +271,7 @@ isac_interrupt(struct IsdnCardState *cs, u_char val)
                if (exval & 1) {
                        exval = cs->readisac(cs, ISAC_CIR1);
                        if (cs->debug & L1_DEB_ISAC)
-                               debugl1(cs, "ISAC CIR1 %02X", exval );
+                               debugl1(cs, "ISAC CIR1 %02X", exval);
                }
        }
        if (val & 0x02) {       /* SIN */
@@ -334,13 +334,13 @@ isac_interrupt(struct IsdnCardState *cs, u_char val)
                                }
                                cs->dc.isac.mon_rx[cs->dc.isac.mon_rxp++] = cs->readisac(cs, ISAC_MOR0);
                                if (cs->debug & L1_DEB_MONITOR)
-                                       debugl1(cs, "ISAC MOR0 %02x", cs->dc.isac.mon_rx[cs->dc.isac.mon_rxp -1]);
+                                       debugl1(cs, "ISAC MOR0 %02x", cs->dc.isac.mon_rx[cs->dc.isac.mon_rxp - 1]);
                                if (cs->dc.isac.mon_rxp == 1) {
                                        cs->dc.isac.mocr |= 0x04;
                                        cs->writeisac(cs, ISAC_MOCR, cs->dc.isac.mocr);
                                }
                        }
-                     afterMONR0:
+               afterMONR0:
                        if (v1 & 0x80) {
                                if (!cs->dc.isac.mon_rx) {
                                        if (!(cs->dc.isac.mon_rx = kmalloc(MAX_MON_FRAME, GFP_ATOMIC))) {
@@ -364,11 +364,11 @@ isac_interrupt(struct IsdnCardState *cs, u_char val)
                                }
                                cs->dc.isac.mon_rx[cs->dc.isac.mon_rxp++] = cs->readisac(cs, ISAC_MOR1);
                                if (cs->debug & L1_DEB_MONITOR)
-                                       debugl1(cs, "ISAC MOR1 %02x", cs->dc.isac.mon_rx[cs->dc.isac.mon_rxp -1]);
+                                       debugl1(cs, "ISAC MOR1 %02x", cs->dc.isac.mon_rx[cs->dc.isac.mon_rxp - 1]);
                                cs->dc.isac.mocr |= 0x40;
                                cs->writeisac(cs, ISAC_MOCR, cs->dc.isac.mocr);
                        }
-                     afterMONR1:
+               afterMONR1:
                        if (v1 & 0x04) {
                                cs->dc.isac.mocr &= 0xf0;
                                cs->writeisac(cs, ISAC_MOCR, cs->dc.isac.mocr);
@@ -384,15 +384,15 @@ isac_interrupt(struct IsdnCardState *cs, u_char val)
                                schedule_event(cs, D_RX_MON1);
                        }
                        if (v1 & 0x02) {
-                               if ((!cs->dc.isac.mon_tx) || (cs->dc.isac.mon_txc && 
-                                       (cs->dc.isac.mon_txp >= cs->dc.isac.mon_txc) && 
-                                       !(v1 & 0x08))) {
+                               if ((!cs->dc.isac.mon_tx) || (cs->dc.isac.mon_txc &&
+                                                             (cs->dc.isac.mon_txp >= cs->dc.isac.mon_txc) &&
+                                                             !(v1 & 0x08))) {
                                        cs->dc.isac.mocr &= 0xf0;
                                        cs->writeisac(cs, ISAC_MOCR, cs->dc.isac.mocr);
                                        cs->dc.isac.mocr |= 0x0a;
                                        cs->writeisac(cs, ISAC_MOCR, cs->dc.isac.mocr);
                                        if (cs->dc.isac.mon_txc &&
-                                               (cs->dc.isac.mon_txp >= cs->dc.isac.mon_txc))
+                                           (cs->dc.isac.mon_txp >= cs->dc.isac.mon_txc))
                                                schedule_event(cs, D_TX_MON0);
                                        goto AfterMOX0;
                                }
@@ -401,21 +401,21 @@ isac_interrupt(struct IsdnCardState *cs, u_char val)
                                        goto AfterMOX0;
                                }
                                cs->writeisac(cs, ISAC_MOX0,
-                                       cs->dc.isac.mon_tx[cs->dc.isac.mon_txp++]);
+                                             cs->dc.isac.mon_tx[cs->dc.isac.mon_txp++]);
                                if (cs->debug & L1_DEB_MONITOR)
-                                       debugl1(cs, "ISAC %02x -> MOX0", cs->dc.isac.mon_tx[cs->dc.isac.mon_txp -1]);
+                                       debugl1(cs, "ISAC %02x -> MOX0", cs->dc.isac.mon_tx[cs->dc.isac.mon_txp - 1]);
                        }
-                     AfterMOX0:
+               AfterMOX0:
                        if (v1 & 0x20) {
-                               if ((!cs->dc.isac.mon_tx) || (cs->dc.isac.mon_txc && 
-                                       (cs->dc.isac.mon_txp >= cs->dc.isac.mon_txc) && 
-                                       !(v1 & 0x80))) {
+                               if ((!cs->dc.isac.mon_tx) || (cs->dc.isac.mon_txc &&
+                                                             (cs->dc.isac.mon_txp >= cs->dc.isac.mon_txc) &&
+                                                             !(v1 & 0x80))) {
                                        cs->dc.isac.mocr &= 0x0f;
                                        cs->writeisac(cs, ISAC_MOCR, cs->dc.isac.mocr);
                                        cs->dc.isac.mocr |= 0xa0;
                                        cs->writeisac(cs, ISAC_MOCR, cs->dc.isac.mocr);
                                        if (cs->dc.isac.mon_txc &&
-                                               (cs->dc.isac.mon_txp >= cs->dc.isac.mon_txc))
+                                           (cs->dc.isac.mon_txp >= cs->dc.isac.mon_txc))
                                                schedule_event(cs, D_TX_MON1);
                                        goto AfterMOX1;
                                }
@@ -424,11 +424,11 @@ isac_interrupt(struct IsdnCardState *cs, u_char val)
                                        goto AfterMOX1;
                                }
                                cs->writeisac(cs, ISAC_MOX1,
-                                       cs->dc.isac.mon_tx[cs->dc.isac.mon_txp++]);
+                                             cs->dc.isac.mon_tx[cs->dc.isac.mon_txp++]);
                                if (cs->debug & L1_DEB_MONITOR)
-                                       debugl1(cs, "ISAC %02x -> MOX1", cs->dc.isac.mon_tx[cs->dc.isac.mon_txp -1]);
+                                       debugl1(cs, "ISAC %02x -> MOX1", cs->dc.isac.mon_tx[cs->dc.isac.mon_txp - 1]);
                        }
-                     AfterMOX1:;
+               AfterMOX1:;
 #endif
                }
        }
@@ -443,123 +443,123 @@ ISAC_l1hw(struct PStack *st, int pr, void *arg)
        int  val;
 
        switch (pr) {
-               case (PH_DATA |REQUEST):
-                       if (cs->debug & DEB_DLOG_HEX)
-                               LogFrame(cs, skb->data, skb->len);
-                       if (cs->debug & DEB_DLOG_VERBOSE)
-                               dlogframe(cs, skb, 0);
-                       spin_lock_irqsave(&cs->lock, flags);
-                       if (cs->tx_skb) {
-                               skb_queue_tail(&cs->sq, skb);
+       case (PH_DATA | REQUEST):
+               if (cs->debug & DEB_DLOG_HEX)
+                       LogFrame(cs, skb->data, skb->len);
+               if (cs->debug & DEB_DLOG_VERBOSE)
+                       dlogframe(cs, skb, 0);
+               spin_lock_irqsave(&cs->lock, flags);
+               if (cs->tx_skb) {
+                       skb_queue_tail(&cs->sq, skb);
 #ifdef L2FRAME_DEBUG           /* psa */
-                               if (cs->debug & L1_DEB_LAPD)
-                                       Logl2Frame(cs, skb, "PH_DATA Queued", 0);
+                       if (cs->debug & L1_DEB_LAPD)
+                               Logl2Frame(cs, skb, "PH_DATA Queued", 0);
 #endif
-                       } else {
-                               cs->tx_skb = skb;
-                               cs->tx_cnt = 0;
+               } else {
+                       cs->tx_skb = skb;
+                       cs->tx_cnt = 0;
 #ifdef L2FRAME_DEBUG           /* psa */
-                               if (cs->debug & L1_DEB_LAPD)
-                                       Logl2Frame(cs, skb, "PH_DATA", 0);
+                       if (cs->debug & L1_DEB_LAPD)
+                               Logl2Frame(cs, skb, "PH_DATA", 0);
 #endif
-                               isac_fill_fifo(cs);
-                       }
-                       spin_unlock_irqrestore(&cs->lock, flags);
-                       break;
-               case (PH_PULL |INDICATION):
-                       spin_lock_irqsave(&cs->lock, flags);
-                       if (cs->tx_skb) {
-                               if (cs->debug & L1_DEB_WARN)
-                                       debugl1(cs, " l2l1 tx_skb exist this shouldn't happen");
-                               skb_queue_tail(&cs->sq, skb);
-                       } else {
-                               if (cs->debug & DEB_DLOG_HEX)
-                                       LogFrame(cs, skb->data, skb->len);
-                               if (cs->debug & DEB_DLOG_VERBOSE)
-                                       dlogframe(cs, skb, 0);
-                               cs->tx_skb = skb;
-                               cs->tx_cnt = 0;
+                       isac_fill_fifo(cs);
+               }
+               spin_unlock_irqrestore(&cs->lock, flags);
+               break;
+       case (PH_PULL | INDICATION):
+               spin_lock_irqsave(&cs->lock, flags);
+               if (cs->tx_skb) {
+                       if (cs->debug & L1_DEB_WARN)
+                               debugl1(cs, " l2l1 tx_skb exist this shouldn't happen");
+                       skb_queue_tail(&cs->sq, skb);
+               } else {
+                       if (cs->debug & DEB_DLOG_HEX)
+                               LogFrame(cs, skb->data, skb->len);
+                       if (cs->debug & DEB_DLOG_VERBOSE)
+                               dlogframe(cs, skb, 0);
+                       cs->tx_skb = skb;
+                       cs->tx_cnt = 0;
 #ifdef L2FRAME_DEBUG           /* psa */
-                               if (cs->debug & L1_DEB_LAPD)
-                                       Logl2Frame(cs, skb, "PH_DATA_PULLED", 0);
+                       if (cs->debug & L1_DEB_LAPD)
+                               Logl2Frame(cs, skb, "PH_DATA_PULLED", 0);
 #endif
-                               isac_fill_fifo(cs);
-                       }
-                       spin_unlock_irqrestore(&cs->lock, flags);
-                       break;
-               case (PH_PULL | REQUEST):
+                       isac_fill_fifo(cs);
+               }
+               spin_unlock_irqrestore(&cs->lock, flags);
+               break;
+       case (PH_PULL | REQUEST):
 #ifdef L2FRAME_DEBUG           /* psa */
-                       if (cs->debug & L1_DEB_LAPD)
-                               debugl1(cs, "-> PH_REQUEST_PULL");
+               if (cs->debug & L1_DEB_LAPD)
+                       debugl1(cs, "-> PH_REQUEST_PULL");
 #endif
-                       if (!cs->tx_skb) {
-                               test_and_clear_bit(FLG_L1_PULL_REQ, &st->l1.Flags);
-                               st->l1.l1l2(st, PH_PULL | CONFIRM, NULL);
-                       } else
-                               test_and_set_bit(FLG_L1_PULL_REQ, &st->l1.Flags);
-                       break;
-               case (HW_RESET | REQUEST):
-                       spin_lock_irqsave(&cs->lock, flags);
-                       if ((cs->dc.isac.ph_state == ISAC_IND_EI) ||
-                               (cs->dc.isac.ph_state == ISAC_IND_DR) ||
-                               (cs->dc.isac.ph_state == ISAC_IND_RS))
-                               ph_command(cs, ISAC_CMD_TIM);
-                       else
-                               ph_command(cs, ISAC_CMD_RS);
-                       spin_unlock_irqrestore(&cs->lock, flags);
-                       break;
-               case (HW_ENABLE | REQUEST):
-                       spin_lock_irqsave(&cs->lock, flags);
+               if (!cs->tx_skb) {
+                       test_and_clear_bit(FLG_L1_PULL_REQ, &st->l1.Flags);
+                       st->l1.l1l2(st, PH_PULL | CONFIRM, NULL);
+               } else
+                       test_and_set_bit(FLG_L1_PULL_REQ, &st->l1.Flags);
+               break;
+       case (HW_RESET | REQUEST):
+               spin_lock_irqsave(&cs->lock, flags);
+               if ((cs->dc.isac.ph_state == ISAC_IND_EI) ||
+                   (cs->dc.isac.ph_state == ISAC_IND_DR) ||
+                   (cs->dc.isac.ph_state == ISAC_IND_RS))
                        ph_command(cs, ISAC_CMD_TIM);
-                       spin_unlock_irqrestore(&cs->lock, flags);
-                       break;
-               case (HW_INFO3 | REQUEST):
-                       spin_lock_irqsave(&cs->lock, flags);
-                       ph_command(cs, ISAC_CMD_AR8);
-                       spin_unlock_irqrestore(&cs->lock, flags);
-                       break;
-               case (HW_TESTLOOP | REQUEST):
-                       spin_lock_irqsave(&cs->lock, flags);
-                       val = 0;
-                       if (1 & (long) arg)
-                               val |= 0x0c;
-                       if (2 & (long) arg)
-                               val |= 0x3;
-                       if (test_bit(HW_IOM1, &cs->HW_Flags)) {
-                               /* IOM 1 Mode */
-                               if (!val) {
-                                       cs->writeisac(cs, ISAC_SPCR, 0xa);
-                                       cs->writeisac(cs, ISAC_ADF1, 0x2);
-                               } else {
-                                       cs->writeisac(cs, ISAC_SPCR, val);
-                                       cs->writeisac(cs, ISAC_ADF1, 0xa);
-                               }
+               else
+                       ph_command(cs, ISAC_CMD_RS);
+               spin_unlock_irqrestore(&cs->lock, flags);
+               break;
+       case (HW_ENABLE | REQUEST):
+               spin_lock_irqsave(&cs->lock, flags);
+               ph_command(cs, ISAC_CMD_TIM);
+               spin_unlock_irqrestore(&cs->lock, flags);
+               break;
+       case (HW_INFO3 | REQUEST):
+               spin_lock_irqsave(&cs->lock, flags);
+               ph_command(cs, ISAC_CMD_AR8);
+               spin_unlock_irqrestore(&cs->lock, flags);
+               break;
+       case (HW_TESTLOOP | REQUEST):
+               spin_lock_irqsave(&cs->lock, flags);
+               val = 0;
+               if (1 & (long) arg)
+                       val |= 0x0c;
+               if (2 & (long) arg)
+                       val |= 0x3;
+               if (test_bit(HW_IOM1, &cs->HW_Flags)) {
+                       /* IOM 1 Mode */
+                       if (!val) {
+                               cs->writeisac(cs, ISAC_SPCR, 0xa);
+                               cs->writeisac(cs, ISAC_ADF1, 0x2);
                        } else {
-                               /* IOM 2 Mode */
                                cs->writeisac(cs, ISAC_SPCR, val);
-                               if (val)
-                                       cs->writeisac(cs, ISAC_ADF1, 0x8);
-                               else
-                                       cs->writeisac(cs, ISAC_ADF1, 0x0);
+                               cs->writeisac(cs, ISAC_ADF1, 0xa);
                        }
-                       spin_unlock_irqrestore(&cs->lock, flags);
-                       break;
-               case (HW_DEACTIVATE | RESPONSE):
-                       skb_queue_purge(&cs->rq);
-                       skb_queue_purge(&cs->sq);
-                       if (cs->tx_skb) {
-                               dev_kfree_skb_any(cs->tx_skb);
-                               cs->tx_skb = NULL;
-                       }
-                       if (test_and_clear_bit(FLG_DBUSY_TIMER, &cs->HW_Flags))
-                               del_timer(&cs->dbusytimer);
-                       if (test_and_clear_bit(FLG_L1_DBUSY, &cs->HW_Flags))
-                               schedule_event(cs, D_CLEARBUSY);
-                       break;
-               default:
-                       if (cs->debug & L1_DEB_WARN)
-                               debugl1(cs, "isac_l1hw unknown %04x", pr);
-                       break;
+               } else {
+                       /* IOM 2 Mode */
+                       cs->writeisac(cs, ISAC_SPCR, val);
+                       if (val)
+                               cs->writeisac(cs, ISAC_ADF1, 0x8);
+                       else
+                               cs->writeisac(cs, ISAC_ADF1, 0x0);
+               }
+               spin_unlock_irqrestore(&cs->lock, flags);
+               break;
+       case (HW_DEACTIVATE | RESPONSE):
+               skb_queue_purge(&cs->rq);
+               skb_queue_purge(&cs->sq);
+               if (cs->tx_skb) {
+                       dev_kfree_skb_any(cs->tx_skb);
+                       cs->tx_skb = NULL;
+               }
+               if (test_and_clear_bit(FLG_DBUSY_TIMER, &cs->HW_Flags))
+                       del_timer(&cs->dbusytimer);
+               if (test_and_clear_bit(FLG_L1_DBUSY, &cs->HW_Flags))
+                       schedule_event(cs, D_CLEARBUSY);
+               break;
+       default:
+               if (cs->debug & L1_DEB_WARN)
+                       debugl1(cs, "isac_l1hw unknown %04x", pr);
+               break;
        }
 }
 
@@ -587,7 +587,7 @@ dbusy_timer_handler(struct IsdnCardState *cs)
        if (test_bit(FLG_DBUSY_TIMER, &cs->HW_Flags)) {
                rbch = cs->readisac(cs, ISAC_RBCH);
                star = cs->readisac(cs, ISAC_STAR);
-               if (cs->debug) 
+               if (cs->debug)
                        debugl1(cs, "D-Channel Busy RBCH %02x STAR %02x",
                                rbch, star);
                if (rbch & ISAC_RBCH_XAC) { /* D-Channel Busy */
@@ -620,8 +620,8 @@ void initisac(struct IsdnCardState *cs)
        cs->DC_Close = DC_Close_isac;
        cs->dc.isac.mon_tx = NULL;
        cs->dc.isac.mon_rx = NULL;
-       cs->writeisac(cs, ISAC_MASK, 0xff);
-       cs->dc.isac.mocr = 0xaa;
+       cs->writeisac(cs, ISAC_MASK, 0xff);
+       cs->dc.isac.mocr = 0xaa;
        if (test_bit(HW_IOM1, &cs->HW_Flags)) {
                /* IOM 1 Mode */
                cs->writeisac(cs, ISAC_ADF2, 0x0);
index 8f8331e..04f16b9 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Author       Karsten Keil
  * Copyright    by Karsten Keil      <keil@isdn4linux.de>
- * 
+ *
  * This software may be used and distributed according to the terms
  * of the GNU General Public License, incorporated herein by reference.
  *
index d4cce33..ff5e139 100644 (file)
 #define ETX    0x03
 
 #define FAXMODCNT      13
-static const   u_char  faxmodulation[] = {3,24,48,72,73,74,96,97,98,121,122,145,146};
-static u_int   modmask = 0x1fff;
-static int     frm_extra_delay = 2;
-static int     para_TOA = 6;
-static const   u_char  *FC1_CMD[] = {"FAE", "FTS", "FRS", "FTM", "FRM", "FTH", "FRH", "CTRL" };
+static const u_char faxmodulation[] = {3, 24, 48, 72, 73, 74, 96, 97, 98, 121, 122, 145, 146};
+static u_int modmask = 0x1fff;
+static int frm_extra_delay = 2;
+static int para_TOA = 6;
+static const u_char *FC1_CMD[] = {"FAE", "FTS", "FRS", "FTM", "FRM", "FTH", "FRH", "CTRL"};
 
 static void isar_setup(struct IsdnCardState *cs);
 static void isar_pump_cmd(struct BCState *bcs, u_char cmd, u_char para);
@@ -42,7 +42,7 @@ waitforHIA(struct IsdnCardState *cs, int timeout)
        }
        if (!timeout)
                printk(KERN_WARNING "HiSax: ISAR waitforHIA timeout\n");
-       return(timeout);
+       return (timeout);
 }
 
 
@@ -51,9 +51,9 @@ sendmsg(struct IsdnCardState *cs, u_char his, u_char creg, u_char len,
        u_char *msg)
 {
        int i;
-       
+
        if (!waitforHIA(cs, 4000))
-               return(0);
+               return (0);
 #if DUMP_MBOXFRAME
        if (cs->debug & L1_DEB_HSCX)
                debugl1(cs, "sendmsg(%02x,%02x,%d)", his, creg, len);
@@ -63,17 +63,17 @@ sendmsg(struct IsdnCardState *cs, u_char his, u_char creg, u_char len,
        cs->BC_Write_Reg(cs, 0, ISAR_WADR, 0);
        if (msg && len) {
                cs->BC_Write_Reg(cs, 1, ISAR_MBOX, msg[0]);
-               for (i=1; i<len; i++)
+               for (i = 1; i < len; i++)
                        cs->BC_Write_Reg(cs, 2, ISAR_MBOX, msg[i]);
-#if DUMP_MBOXFRAME>1
+#if DUMP_MBOXFRAME > 1
                if (cs->debug & L1_DEB_HSCX_FIFO) {
                        char tmp[256], *t;
-                       
+
                        i = len;
-                       while (i>0) {
+                       while (i > 0) {
                                t = tmp;
                                t += sprintf(t, "sendmbox cnt %d", len);
-                               QuickHex(t, &msg[len-i], (i>64) ? 64:i);
+                               QuickHex(t, &msg[len-i], (i > 64) ? 64 : i);
                                debugl1(cs, tmp);
                                i -= 64;
                        }
@@ -82,7 +82,7 @@ sendmsg(struct IsdnCardState *cs, u_char his, u_char creg, u_char len,
        }
        cs->BC_Write_Reg(cs, 1, ISAR_HIS, his);
        waitforHIA(cs, 10000);
-       return(1);
+       return (1);
 }
 
 /* Call only with IRQ disabled !!! */
@@ -94,17 +94,17 @@ rcv_mbox(struct IsdnCardState *cs, struct isar_reg *ireg, u_char *msg)
        cs->BC_Write_Reg(cs, 1, ISAR_RADR, 0);
        if (msg && ireg->clsb) {
                msg[0] = cs->BC_Read_Reg(cs, 1, ISAR_MBOX);
-               for (i=1; i < ireg->clsb; i++)
-                        msg[i] = cs->BC_Read_Reg(cs, 2, ISAR_MBOX);
-#if DUMP_MBOXFRAME>1
+               for (i = 1; i < ireg->clsb; i++)
+                       msg[i] = cs->BC_Read_Reg(cs, 2, ISAR_MBOX);
+#if DUMP_MBOXFRAME > 1
                if (cs->debug & L1_DEB_HSCX_FIFO) {
                        char tmp[256], *t;
-                       
+
                        i = ireg->clsb;
-                       while (i>0) {
+                       while (i > 0) {
                                t = tmp;
                                t += sprintf(t, "rcv_mbox cnt %d", ireg->clsb);
-                               QuickHex(t, &msg[ireg->clsb-i], (i>64) ? 64:i);
+                               QuickHex(t, &msg[ireg->clsb - i], (i > 64) ? 64 : i);
                                debugl1(cs, tmp);
                                i -= 64;
                        }
@@ -130,23 +130,23 @@ get_irq_infos(struct IsdnCardState *cs, struct isar_reg *ireg)
 
 static int
 waitrecmsg(struct IsdnCardState *cs, u_char *len,
-       u_char *msg, int maxdelay)
+          u_char *msg, int maxdelay)
 {
        int timeout = 0;
        struct isar_reg *ir = cs->bcs[0].hw.isar.reg;
-       
-       
-       while((!(cs->BC_Read_Reg(cs, 0, ISAR_IRQBIT) & ISAR_IRQSTA)) &&
-               (timeout++ < maxdelay))
+
+
+       while ((!(cs->BC_Read_Reg(cs, 0, ISAR_IRQBIT) & ISAR_IRQSTA)) &&
+             (timeout++ < maxdelay))
                udelay(1);
        if (timeout > maxdelay) {
                printk(KERN_WARNING"isar recmsg IRQSTA timeout\n");
-               return(0);
+               return (0);
        }
        get_irq_infos(cs, ir);
        rcv_mbox(cs, ir, msg);
        *len = ir->clsb;
-       return(1);
+       return (1);
 }
 
 int
@@ -167,11 +167,11 @@ ISARVersion(struct IsdnCardState *cs, char *s)
        cs->debug &= ~(L1_DEB_HSCX | L1_DEB_HSCX_FIFO);
        if (!sendmsg(cs, ISAR_HIS_VNR, 0, 3, msg)) {
                spin_unlock_irqrestore(&cs->lock, flags);
-               return(-1);
+               return (-1);
        }
        if (!waitrecmsg(cs, &len, tmp, 100000)) {
                spin_unlock_irqrestore(&cs->lock, flags);
-               return(-2);
+               return (-2);
        }
        cs->debug = debug;
        if (cs->bcs[0].hw.isar.reg->iis == ISAR_IIS_VNR) {
@@ -183,7 +183,7 @@ ISARVersion(struct IsdnCardState *cs, char *s)
        } else
                ver = -4;
        spin_unlock_irqrestore(&cs->lock, flags);
-       return(ver);
+       return (ver);
 }
 
 static int
@@ -196,25 +196,25 @@ isar_load_firmware(struct IsdnCardState *cs, u_char __user *buf)
        u_char *msg, *tmpmsg, *mp, tmp[64];
        u_long flags;
        struct isar_reg *ireg = cs->bcs[0].hw.isar.reg;
-       
+
        struct {u_short sadr;
                u_short len;
                u_short d_key;
        } blk_head;
-               
+
 #define        BLK_HEAD_SIZE 6
        if (1 != (ret = ISARVersion(cs, "Testing"))) {
                printk(KERN_ERR"isar_load_firmware wrong isar version %d\n", ret);
-               return(1);
+               return (1);
        }
        debug = cs->debug;
-#if DBG_LOADFIRM<2
+#if DBG_LOADFIRM < 2
        cs->debug &= ~(L1_DEB_HSCX | L1_DEB_HSCX_FIFO);
 #endif
-       
+
        cfu_ret = copy_from_user(&size, p, sizeof(int));
        if (cfu_ret) {
-               printk(KERN_ERR"isar_load_firmware copy_from_user ret %d\n", cfu_ret);
+               printk(KERN_ERR "isar_load_firmware copy_from_user ret %d\n", cfu_ret);
                return -EFAULT;
        }
        p += sizeof(int);
@@ -241,40 +241,40 @@ isar_load_firmware(struct IsdnCardState *cs, u_char __user *buf)
                        goto reterror;
                }
 #ifdef __BIG_ENDIAN
-               sadr = (blk_head.sadr & 0xff)*256 + blk_head.sadr/256;
+               sadr = (blk_head.sadr & 0xff) * 256 + blk_head.sadr / 256;
                blk_head.sadr = sadr;
-               sadr = (blk_head.len & 0xff)*256 + blk_head.len/256;
+               sadr = (blk_head.len & 0xff) * 256 + blk_head.len / 256;
                blk_head.len = sadr;
-               sadr = (blk_head.d_key & 0xff)*256 + blk_head.d_key/256;
+               sadr = (blk_head.d_key & 0xff) * 256 + blk_head.d_key / 256;
                blk_head.d_key = sadr;
 #endif /* __BIG_ENDIAN */
                cnt += BLK_HEAD_SIZE;
                p += BLK_HEAD_SIZE;
                printk(KERN_DEBUG"isar firmware block (%#x,%5d,%#x)\n",
-                       blk_head.sadr, blk_head.len, blk_head.d_key & 0xff);
+                      blk_head.sadr, blk_head.len, blk_head.d_key & 0xff);
                sadr = blk_head.sadr;
                left = blk_head.len;
                spin_lock_irqsave(&cs->lock, flags);
                if (!sendmsg(cs, ISAR_HIS_DKEY, blk_head.d_key & 0xff, 0, NULL)) {
                        printk(KERN_ERR"isar sendmsg dkey failed\n");
-                       ret = 1;goto reterr_unlock;
+                       ret = 1; goto reterr_unlock;
                }
                if (!waitrecmsg(cs, &len, tmp, 100000)) {
                        printk(KERN_ERR"isar waitrecmsg dkey failed\n");
-                       ret = 1;goto reterr_unlock;
+                       ret = 1; goto reterr_unlock;
                }
                if ((ireg->iis != ISAR_IIS_DKEY) || ireg->cmsb || len) {
                        printk(KERN_ERR"isar wrong dkey response (%x,%x,%x)\n",
-                               ireg->iis, ireg->cmsb, len);
-                       ret = 1;goto reterr_unlock;
+                              ireg->iis, ireg->cmsb, len);
+                       ret = 1; goto reterr_unlock;
                }
                spin_unlock_irqrestore(&cs->lock, flags);
-               while (left>0) {
+               while (left > 0) {
                        if (left > 126)
                                noc = 126;
                        else
                                noc = left;
-                       nom = 2*noc;
+                       nom = 2 * noc;
                        mp  = msg;
                        *mp++ = sadr / 256;
                        *mp++ = sadr % 256;
@@ -290,10 +290,10 @@ isar_load_firmware(struct IsdnCardState *cs, u_char __user *buf)
                        sp = (u_short *)tmpmsg;
 #if DBG_LOADFIRM
                        printk(KERN_DEBUG"isar: load %3d words at %04x left %d\n",
-                                noc, sadr, left);
+                              noc, sadr, left);
 #endif
                        sadr += noc;
-                       while(noc) {
+                       while (noc) {
 #ifdef __BIG_ENDIAN
                                *mp++ = *sp % 256;
                                *mp++ = *sp / 256;
@@ -307,21 +307,21 @@ isar_load_firmware(struct IsdnCardState *cs, u_char __user *buf)
                        spin_lock_irqsave(&cs->lock, flags);
                        if (!sendmsg(cs, ISAR_HIS_FIRM, 0, nom, msg)) {
                                printk(KERN_ERR"isar sendmsg prog failed\n");
-                               ret = 1;goto reterr_unlock;
+                               ret = 1; goto reterr_unlock;
                        }
                        if (!waitrecmsg(cs, &len, tmp, 100000)) {
                                printk(KERN_ERR"isar waitrecmsg prog failed\n");
-                               ret = 1;goto reterr_unlock;
+                               ret = 1; goto reterr_unlock;
                        }
                        if ((ireg->iis != ISAR_IIS_FIRM) || ireg->cmsb || len) {
                                printk(KERN_ERR"isar wrong prog response (%x,%x,%x)\n",
-                                       ireg->iis, ireg->cmsb, len);
-                               ret = 1;goto reterr_unlock;
+                                      ireg->iis, ireg->cmsb, len);
+                               ret = 1; goto reterr_unlock;
                        }
                        spin_unlock_irqrestore(&cs->lock, flags);
                }
                printk(KERN_DEBUG"isar firmware block %5d words loaded\n",
-                       blk_head.len);
+                      blk_head.len);
        }
        /* 10ms delay */
        cnt = 10;
@@ -333,16 +333,16 @@ isar_load_firmware(struct IsdnCardState *cs, u_char __user *buf)
        spin_lock_irqsave(&cs->lock, flags);
        if (!sendmsg(cs, ISAR_HIS_STDSP, 0, 2, msg)) {
                printk(KERN_ERR"isar sendmsg start dsp failed\n");
-               ret = 1;goto reterr_unlock;
+               ret = 1; goto reterr_unlock;
        }
        if (!waitrecmsg(cs, &len, tmp, 100000)) {
                printk(KERN_ERR"isar waitrecmsg start dsp failed\n");
-               ret = 1;goto reterr_unlock;
+               ret = 1; goto reterr_unlock;
        }
        if ((ireg->iis != ISAR_IIS_STDSP) || ireg->cmsb || len) {
                printk(KERN_ERR"isar wrong start dsp response (%x,%x,%x)\n",
-                       ireg->iis, ireg->cmsb, len);
-               ret = 1;goto reterr_unlock;
+                      ireg->iis, ireg->cmsb, len);
+               ret = 1; goto reterr_unlock;
        } else
                printk(KERN_DEBUG"isar start dsp success\n");
        /* NORMAL mode entered */
@@ -356,10 +356,10 @@ isar_load_firmware(struct IsdnCardState *cs, u_char __user *buf)
        }
        if (!cnt) {
                printk(KERN_ERR"isar no general status event received\n");
-               ret = 1;goto reterror;
+               ret = 1; goto reterror;
        } else {
                printk(KERN_DEBUG"isar general status event %x\n",
-                       ireg->bstat);
+                      ireg->bstat);
        }
        /* 10ms delay */
        cnt = 10;
@@ -369,7 +369,7 @@ isar_load_firmware(struct IsdnCardState *cs, u_char __user *buf)
        ireg->iis = 0;
        if (!sendmsg(cs, ISAR_HIS_DIAG, ISAR_CTRL_STST, 0, NULL)) {
                printk(KERN_ERR"isar sendmsg self tst failed\n");
-               ret = 1;goto reterr_unlock;
+               ret = 1; goto reterr_unlock;
        }
        cnt = 10000; /* max 100 ms */
        spin_unlock_irqrestore(&cs->lock, flags);
@@ -380,21 +380,21 @@ isar_load_firmware(struct IsdnCardState *cs, u_char __user *buf)
        udelay(1000);
        if (!cnt) {
                printk(KERN_ERR"isar no self tst response\n");
-               ret = 1;goto reterror;
+               ret = 1; goto reterror;
        }
        if ((ireg->cmsb == ISAR_CTRL_STST) && (ireg->clsb == 1)
-               && (ireg->par[0] == 0)) {
+           && (ireg->par[0] == 0)) {
                printk(KERN_DEBUG"isar selftest OK\n");
        } else {
                printk(KERN_DEBUG"isar selftest not OK %x/%x/%x\n",
-                       ireg->cmsb, ireg->clsb, ireg->par[0]);
-               ret = 1;goto reterror;
+                      ireg->cmsb, ireg->clsb, ireg->par[0]);
+               ret = 1; goto reterror;
        }
        spin_lock_irqsave(&cs->lock, flags);
        ireg->iis = 0;
        if (!sendmsg(cs, ISAR_HIS_DIAG, ISAR_CTRL_SWVER, 0, NULL)) {
                printk(KERN_ERR"isar RQST SVN failed\n");
-               ret = 1;goto reterr_unlock;
+               ret = 1; goto reterr_unlock;
        }
        spin_unlock_irqrestore(&cs->lock, flags);
        cnt = 30000; /* max 300 ms */
@@ -405,15 +405,15 @@ isar_load_firmware(struct IsdnCardState *cs, u_char __user *buf)
        udelay(1000);
        if (!cnt) {
                printk(KERN_ERR"isar no SVN response\n");
-               ret = 1;goto reterror;
+               ret = 1; goto reterror;
        } else {
                if ((ireg->cmsb == ISAR_CTRL_SWVER) && (ireg->clsb == 1))
                        printk(KERN_DEBUG"isar software version %#x\n",
-                               ireg->par[0]);
+                              ireg->par[0]);
                else {
                        printk(KERN_ERR"isar wrong swver response (%x,%x) cnt(%d)\n",
-                               ireg->cmsb, ireg->clsb, cnt);
-                       ret = 1;goto reterror;
+                              ireg->cmsb, ireg->clsb, cnt);
+                       ret = 1; goto reterror;
                }
        }
        spin_lock_irqsave(&cs->lock, flags);
@@ -430,7 +430,7 @@ reterror:
                cs->BC_Write_Reg(cs, 0, ISAR_IRQBIT, 0);
        kfree(msg);
        kfree(tmpmsg);
-       return(ret);
+       return (ret);
 }
 
 #define B_LL_NOCARRIER 8
@@ -454,9 +454,9 @@ isar_bh(struct work_struct *work)
 static void
 send_DLE_ETX(struct BCState *bcs)
 {
-       u_char dleetx[2] = {DLE,ETX};
+       u_char dleetx[2] = {DLE, ETX};
        struct sk_buff *skb;
-       
+
        if ((skb = dev_alloc_skb(2))) {
                memcpy(skb_put(skb, 2), dleetx, 2);
                skb_queue_tail(&bcs->rqueue, skb);
@@ -486,14 +486,14 @@ insert_dle(unsigned char *dest, unsigned char *src, int count) {
                        *dest++ = DLE;
        }
 }
+
 static void
 isar_rcv_frame(struct IsdnCardState *cs, struct BCState *bcs)
 {
        u_char *ptr;
        struct sk_buff *skb;
        struct isar_reg *ireg = bcs->hw.isar.reg;
-       
+
        if (!ireg->clsb) {
                debugl1(cs, "isar zero len frame");
                cs->BC_Write_Reg(cs, 1, ISAR_IIA, 0);
@@ -504,7 +504,7 @@ isar_rcv_frame(struct IsdnCardState *cs, struct BCState *bcs)
                debugl1(cs, "isar mode 0 spurious IIS_RDATA %x/%x/%x",
                        ireg->iis, ireg->cmsb, ireg->clsb);
                printk(KERN_WARNING"isar mode 0 spurious IIS_RDATA %x/%x/%x\n",
-                       ireg->iis, ireg->cmsb, ireg->clsb);
+                      ireg->iis, ireg->cmsb, ireg->clsb);
                cs->BC_Write_Reg(cs, 1, ISAR_IIA, 0);
                break;
        case L1_MODE_TRANS:
@@ -547,11 +547,11 @@ isar_rcv_frame(struct IsdnCardState *cs, struct BCState *bcs)
                                        if (cs->debug & L1_DEB_WARN)
                                                debugl1(cs, "isar frame to short %d",
                                                        bcs->hw.isar.rcvidx);
-                               } else if (!(skb = dev_alloc_skb(bcs->hw.isar.rcvidx-2))) {
+                               } else if (!(skb = dev_alloc_skb(bcs->hw.isar.rcvidx - 2))) {
                                        printk(KERN_WARNING "ISAR: receive out of memory\n");
                                } else {
-                                       memcpy(skb_put(skb, bcs->hw.isar.rcvidx-2),
-                                               bcs->hw.isar.rcvbuf, bcs->hw.isar.rcvidx-2);
+                                       memcpy(skb_put(skb, bcs->hw.isar.rcvidx - 2),
+                                              bcs->hw.isar.rcvbuf, bcs->hw.isar.rcvidx - 2);
                                        skb_queue_tail(&bcs->rqueue, skb);
                                        schedule_event(bcs, B_RCVBUFREADY);
                                }
@@ -576,7 +576,7 @@ isar_rcv_frame(struct IsdnCardState *cs, struct BCState *bcs)
                                        ireg->clsb, bcs->hw.isar.rcvidx);
                        if ((skb = dev_alloc_skb(bcs->hw.isar.rcvidx))) {
                                insert_dle((u_char *)skb_put(skb, bcs->hw.isar.rcvidx),
-                                       bcs->hw.isar.rcvbuf, ireg->clsb);
+                                          bcs->hw.isar.rcvbuf, ireg->clsb);
                                skb_queue_tail(&bcs->rqueue, skb);
                                schedule_event(bcs, B_RCVBUFREADY);
                                if (ireg->cmsb & SART_NMD) { /* ABORT */
@@ -630,13 +630,13 @@ isar_rcv_frame(struct IsdnCardState *cs, struct BCState *bcs)
                                                debugl1(cs, "isar frame to short %d",
                                                        bcs->hw.isar.rcvidx);
                                        printk(KERN_WARNING "ISAR: frame to short %d\n",
-                                               bcs->hw.isar.rcvidx);
+                                              bcs->hw.isar.rcvidx);
                                } else if (!(skb = dev_alloc_skb(len))) {
                                        printk(KERN_WARNING "ISAR: receive out of memory\n");
                                } else {
                                        insert_dle((u_char *)skb_put(skb, len),
-                                               bcs->hw.isar.rcvbuf,
-                                               bcs->hw.isar.rcvidx);
+                                                  bcs->hw.isar.rcvbuf,
+                                                  bcs->hw.isar.rcvidx);
                                        skb_queue_tail(&bcs->rqueue, skb);
                                        schedule_event(bcs, B_RCVBUFREADY);
                                        send_DLE_ETX(bcs);
@@ -680,8 +680,8 @@ isar_fill_fifo(struct BCState *bcs)
                return;
        if (bcs->tx_skb->len <= 0)
                return;
-       if (!(bcs->hw.isar.reg->bstat & 
-               (bcs->hw.isar.dpath == 1 ? BSTAT_RDM1 : BSTAT_RDM2)))
+       if (!(bcs->hw.isar.reg->bstat &
+             (bcs->hw.isar.dpath == 1 ? BSTAT_RDM1 : BSTAT_RDM2)))
                return;
        if (bcs->tx_skb->len > bcs->hw.isar.mml) {
                msb = 0;
@@ -694,51 +694,51 @@ isar_fill_fifo(struct BCState *bcs)
        if (!bcs->hw.isar.txcnt) {
                msb |= HDLC_FST;
                if ((bcs->mode == L1_MODE_FAX) &&
-                       (bcs->hw.isar.cmd == PCTRL_CMD_FTH)) {
+                   (bcs->hw.isar.cmd == PCTRL_CMD_FTH)) {
                        if (bcs->tx_skb->len > 1) {
-                               if ((ptr[0]== 0xff) && (ptr[1] == 0x13))
+                               if ((ptr[0] == 0xff) && (ptr[1] == 0x13))
                                        /* last frame */
                                        test_and_set_bit(BC_FLG_LASTDATA,
-                                               &bcs->Flag);
-                       }  
+                                                        &bcs->Flag);
+                       }
                }
        }
        skb_pull(bcs->tx_skb, count);
        bcs->tx_cnt -= count;
        bcs->hw.isar.txcnt += count;
        switch (bcs->mode) {
-               case L1_MODE_NULL:
-                       printk(KERN_ERR"isar_fill_fifo wrong mode 0\n");
-                       break;
-               case L1_MODE_TRANS:
-               case L1_MODE_V32:
-                       sendmsg(cs, SET_DPS(bcs->hw.isar.dpath) | ISAR_HIS_SDATA,
-                               0, count, ptr);
-                       break;
-               case L1_MODE_HDLC:
+       case L1_MODE_NULL:
+               printk(KERN_ERR"isar_fill_fifo wrong mode 0\n");
+               break;
+       case L1_MODE_TRANS:
+       case L1_MODE_V32:
+               sendmsg(cs, SET_DPS(bcs->hw.isar.dpath) | ISAR_HIS_SDATA,
+                       0, count, ptr);
+               break;
+       case L1_MODE_HDLC:
+               sendmsg(cs, SET_DPS(bcs->hw.isar.dpath) | ISAR_HIS_SDATA,
+                       msb, count, ptr);
+               break;
+       case L1_MODE_FAX:
+               if (bcs->hw.isar.state != STFAX_ACTIV) {
+                       if (cs->debug & L1_DEB_WARN)
+                               debugl1(cs, "isar_fill_fifo: not ACTIV");
+               } else if (bcs->hw.isar.cmd == PCTRL_CMD_FTH) {
                        sendmsg(cs, SET_DPS(bcs->hw.isar.dpath) | ISAR_HIS_SDATA,
                                msb, count, ptr);
-                       break;
-               case L1_MODE_FAX:
-                       if (bcs->hw.isar.state != STFAX_ACTIV) {
-                               if (cs->debug & L1_DEB_WARN)
-                                       debugl1(cs, "isar_fill_fifo: not ACTIV");
-                       } else if (bcs->hw.isar.cmd == PCTRL_CMD_FTH) { 
-                               sendmsg(cs, SET_DPS(bcs->hw.isar.dpath) | ISAR_HIS_SDATA,
-                                       msb, count, ptr);
-                       } else if (bcs->hw.isar.cmd == PCTRL_CMD_FTM) {
-                               sendmsg(cs, SET_DPS(bcs->hw.isar.dpath) | ISAR_HIS_SDATA,
-                                       0, count, ptr);
-                       } else {
-                               if (cs->debug & L1_DEB_WARN)
-                                       debugl1(cs, "isar_fill_fifo: not FTH/FTM");
-                       }
-                       break;
-               default:
-                       if (cs->debug)
-                               debugl1(cs, "isar_fill_fifo mode(%x) error", bcs->mode);
-                       printk(KERN_ERR"isar_fill_fifo mode(%x) error\n", bcs->mode);
-                       break;
+               } else if (bcs->hw.isar.cmd == PCTRL_CMD_FTM) {
+                       sendmsg(cs, SET_DPS(bcs->hw.isar.dpath) | ISAR_HIS_SDATA,
+                               0, count, ptr);
+               } else {
+                       if (cs->debug & L1_DEB_WARN)
+                               debugl1(cs, "isar_fill_fifo: not FTH/FTM");
+               }
+               break;
+       default:
+               if (cs->debug)
+                       debugl1(cs, "isar_fill_fifo mode(%x) error", bcs->mode);
+               printk(KERN_ERR"isar_fill_fifo mode(%x) error\n", bcs->mode);
+               break;
        }
 }
 
@@ -746,12 +746,12 @@ static inline
 struct BCState *sel_bcs_isar(struct IsdnCardState *cs, u_char dpath)
 {
        if ((!dpath) || (dpath == 3))
-               return(NULL);
+               return (NULL);
        if (cs->bcs[0].hw.isar.dpath == dpath)
-               return(&cs->bcs[0]);
+               return (&cs->bcs[0]);
        if (cs->bcs[1].hw.isar.dpath == dpath)
-               return(&cs->bcs[1]);
-       return(NULL);
+               return (&cs->bcs[1]);
+       return (NULL);
 }
 
 static void
@@ -762,8 +762,8 @@ send_frames(struct BCState *bcs)
                        isar_fill_fifo(bcs);
                        return;
                } else {
-                       if (test_bit(FLG_LLI_L1WAKEUP,&bcs->st->lli.flag) &&
-                               (PACKET_NOACK != bcs->tx_skb->pkt_type)) {
+                       if (test_bit(FLG_LLI_L1WAKEUP, &bcs->st->lli.flag) &&
+                           (PACKET_NOACK != bcs->tx_skb->pkt_type)) {
                                u_long  flags;
                                spin_lock_irqsave(&bcs->aclock, flags);
                                bcs->ackcnt += bcs->hw.isar.txcnt;
@@ -783,7 +783,7 @@ send_frames(struct BCState *bcs)
                                }
                        }
                        dev_kfree_skb_any(bcs->tx_skb);
-                       bcs->hw.isar.txcnt = 0; 
+                       bcs->hw.isar.txcnt = 0;
                        bcs->tx_skb = NULL;
                }
        }
@@ -813,7 +813,7 @@ static inline void
 check_send(struct IsdnCardState *cs, u_char rdm)
 {
        struct BCState *bcs;
-       
+
        if (rdm & BSTAT_RDM1) {
                if ((bcs = sel_bcs_isar(cs, 1))) {
                        if (bcs->mode) {
@@ -828,16 +828,16 @@ check_send(struct IsdnCardState *cs, u_char rdm)
                        }
                }
        }
-       
+
 }
 
 static const char *dmril[] = {"NO SPEED", "1200/75", "NODEF2", "75/1200",
-                               "NODEF4", "300", "600", "1200", "2400",
-                               "4800", "7200", "9600nt", "9600t", "12000",
-                               "14400", "WRONG"};
+                             "NODEF4", "300", "600", "1200", "2400",
+                             "4800", "7200", "9600nt", "9600t", "12000",
+                             "14400", "WRONG"};
 static const char *dmrim[] = {"NO MOD", "NO DEF", "V32/V32b", "V22", "V21",
-                               "Bell103", "V23", "Bell202", "V17", "V29",
-                               "V27ter"};
+                             "Bell103", "V23", "Bell202", "V17", "V29",
+                             "V27ter"};
 
 static void
 isar_pump_status_rsp(struct BCState *bcs, struct isar_reg *ireg) {
@@ -846,48 +846,48 @@ isar_pump_status_rsp(struct BCState *bcs, struct isar_reg *ireg) {
        u_char rim;
 
        if (!test_and_clear_bit(ISAR_RATE_REQ, &bcs->hw.isar.reg->Flags))
-               return; 
+               return;
        if (ril > 14) {
                if (cs->debug & L1_DEB_WARN)
-                       debugl1(cs, "wrong pstrsp ril=%d",ril);
+                       debugl1(cs, "wrong pstrsp ril=%d", ril);
                ril = 15;
        }
-       switch(ireg->par[1]) {
-               case 0:
-                       rim = 0;
-                       break;
-               case 0x20:
-                       rim = 2;
-                       break;
-               case 0x40:
-                       rim = 3;
-                       break;
-               case 0x41:
-                       rim = 4;
-                       break;
-               case 0x51:
-                       rim = 5;
-                       break;
-               case 0x61:
-                       rim = 6;
-                       break;
-               case 0x71:
-                       rim = 7;
-                       break;
-               case 0x82:
-                       rim = 8;
-                       break;
-               case 0x92:
-                       rim = 9;
-                       break;
-               case 0xa2:
-                       rim = 10;
-                       break;
-               default:
-                       rim = 1;
-                       break;
+       switch (ireg->par[1]) {
+       case 0:
+               rim = 0;
+               break;
+       case 0x20:
+               rim = 2;
+               break;
+       case 0x40:
+               rim = 3;
+               break;
+       case 0x41:
+               rim = 4;
+               break;
+       case 0x51:
+               rim = 5;
+               break;
+       case 0x61:
+               rim = 6;
+               break;
+       case 0x71:
+               rim = 7;
+               break;
+       case 0x82:
+               rim = 8;
+               break;
+       case 0x92:
+               rim = 9;
+               break;
+       case 0xa2:
+               rim = 10;
+               break;
+       default:
+               rim = 1;
+               break;
        }
-       sprintf(bcs->hw.isar.conmsg,"%s %s", dmril[ril], dmrim[rim]);
+       sprintf(bcs->hw.isar.conmsg, "%s %s", dmril[ril], dmrim[rim]);
        bcs->conmsg = bcs->hw.isar.conmsg;
        if (cs->debug & L1_DEB_HSCX)
                debugl1(cs, "pump strsp %s", bcs->conmsg);
@@ -898,77 +898,77 @@ isar_pump_statev_modem(struct BCState *bcs, u_char devt) {
        struct IsdnCardState *cs = bcs->cs;
        u_char dps = SET_DPS(bcs->hw.isar.dpath);
 
-       switch(devt) {
-               case PSEV_10MS_TIMER:
-                       if (cs->debug & L1_DEB_HSCX)
-                               debugl1(cs, "pump stev TIMER");
-                       break;
-               case PSEV_CON_ON:
-                       if (cs->debug & L1_DEB_HSCX)
-                               debugl1(cs, "pump stev CONNECT");
-                       l1_msg_b(bcs->st, PH_ACTIVATE | REQUEST, NULL);
-                       break;
-               case PSEV_CON_OFF:
-                       if (cs->debug & L1_DEB_HSCX)
-                               debugl1(cs, "pump stev NO CONNECT");
-                       sendmsg(cs, dps | ISAR_HIS_PSTREQ, 0, 0, NULL);
-                       l1_msg_b(bcs->st, PH_DEACTIVATE | REQUEST, NULL);
-                       break;
-               case PSEV_V24_OFF:
-                       if (cs->debug & L1_DEB_HSCX)
-                               debugl1(cs, "pump stev V24 OFF");
-                       break;
-               case PSEV_CTS_ON:
-                       if (cs->debug & L1_DEB_HSCX)
-                               debugl1(cs, "pump stev CTS ON");
-                       break;
-               case PSEV_CTS_OFF:
-                       if (cs->debug & L1_DEB_HSCX)
-                               debugl1(cs, "pump stev CTS OFF");
-                       break;
-               case PSEV_DCD_ON:
-                       if (cs->debug & L1_DEB_HSCX)
-                               debugl1(cs, "pump stev CARRIER ON");
-                       test_and_set_bit(ISAR_RATE_REQ, &bcs->hw.isar.reg->Flags); 
-                       sendmsg(cs, dps | ISAR_HIS_PSTREQ, 0, 0, NULL);
-                       break;
-               case PSEV_DCD_OFF:
-                       if (cs->debug & L1_DEB_HSCX)
-                               debugl1(cs, "pump stev CARRIER OFF");
-                       break;
-               case PSEV_DSR_ON:
-                       if (cs->debug & L1_DEB_HSCX)
-                               debugl1(cs, "pump stev DSR ON");
-                       break;
-               case PSEV_DSR_OFF:
-                       if (cs->debug & L1_DEB_HSCX)
-                               debugl1(cs, "pump stev DSR_OFF");
-                       break;
-               case PSEV_REM_RET:
-                       if (cs->debug & L1_DEB_HSCX)
-                               debugl1(cs, "pump stev REMOTE RETRAIN");
-                       break;
-               case PSEV_REM_REN:
-                       if (cs->debug & L1_DEB_HSCX)
-                               debugl1(cs, "pump stev REMOTE RENEGOTIATE");
-                       break;
-               case PSEV_GSTN_CLR:
-                       if (cs->debug & L1_DEB_HSCX)
-                               debugl1(cs, "pump stev GSTN CLEAR");
-                       break;
-               default:
-                       if (cs->debug & L1_DEB_HSCX)
-                               debugl1(cs, "unknown pump stev %x", devt);
-                       break;
+       switch (devt) {
+       case PSEV_10MS_TIMER:
+               if (cs->debug & L1_DEB_HSCX)
+                       debugl1(cs, "pump stev TIMER");
+               break;
+       case PSEV_CON_ON:
+               if (cs->debug & L1_DEB_HSCX)
+                       debugl1(cs, "pump stev CONNECT");
+               l1_msg_b(bcs->st, PH_ACTIVATE | REQUEST, NULL);
+               break;
+       case PSEV_CON_OFF:
+               if (cs->debug & L1_DEB_HSCX)
+                       debugl1(cs, "pump stev NO CONNECT");
+               sendmsg(cs, dps | ISAR_HIS_PSTREQ, 0, 0, NULL);
+               l1_msg_b(bcs->st, PH_DEACTIVATE | REQUEST, NULL);
+               break;
+       case PSEV_V24_OFF:
+               if (cs->debug & L1_DEB_HSCX)
+                       debugl1(cs, "pump stev V24 OFF");
+               break;
+       case PSEV_CTS_ON:
+               if (cs->debug & L1_DEB_HSCX)
+                       debugl1(cs, "pump stev CTS ON");
+               break;
+       case PSEV_CTS_OFF:
+               if (cs->debug & L1_DEB_HSCX)
+                       debugl1(cs, "pump stev CTS OFF");
+               break;
+       case PSEV_DCD_ON:
+               if (cs->debug & L1_DEB_HSCX)
+                       debugl1(cs, "pump stev CARRIER ON");
+               test_and_set_bit(ISAR_RATE_REQ, &bcs->hw.isar.reg->Flags);
+               sendmsg(cs, dps | ISAR_HIS_PSTREQ, 0, 0, NULL);
+               break;
+       case PSEV_DCD_OFF:
+               if (cs->debug & L1_DEB_HSCX)
+                       debugl1(cs, "pump stev CARRIER OFF");
+               break;
+       case PSEV_DSR_ON:
+               if (cs->debug & L1_DEB_HSCX)
+                       debugl1(cs, "pump stev DSR ON");
+               break;
+       case PSEV_DSR_OFF:
+               if (cs->debug & L1_DEB_HSCX)
+                       debugl1(cs, "pump stev DSR_OFF");
+               break;
+       case PSEV_REM_RET:
+               if (cs->debug & L1_DEB_HSCX)
+                       debugl1(cs, "pump stev REMOTE RETRAIN");
+               break;
+       case PSEV_REM_REN:
+               if (cs->debug & L1_DEB_HSCX)
+                       debugl1(cs, "pump stev REMOTE RENEGOTIATE");
+               break;
+       case PSEV_GSTN_CLR:
+               if (cs->debug & L1_DEB_HSCX)
+                       debugl1(cs, "pump stev GSTN CLEAR");
+               break;
+       default:
+               if (cs->debug & L1_DEB_HSCX)
+                       debugl1(cs, "unknown pump stev %x", devt);
+               break;
        }
 }
 
 static void
 ll_deliver_faxstat(struct BCState *bcs, u_char status)
 {
-        isdn_ctrl ic;
+       isdn_ctrl ic;
        struct Channel *chanp = (struct Channel *) bcs->st->lli.userdata;
+
        if (bcs->cs->debug & L1_DEB_HSCX)
                debugl1(bcs->cs, "HL->LL FAXIND %x", status);
        ic.driver = bcs->cs->myid;
@@ -984,153 +984,120 @@ isar_pump_statev_fax(struct BCState *bcs, u_char devt) {
        u_char dps = SET_DPS(bcs->hw.isar.dpath);
        u_char p1;
 
-       switch(devt) {
-               case PSEV_10MS_TIMER:
+       switch (devt) {
+       case PSEV_10MS_TIMER:
+               if (cs->debug & L1_DEB_HSCX)
+                       debugl1(cs, "pump stev TIMER");
+               break;
+       case PSEV_RSP_READY:
+               if (cs->debug & L1_DEB_HSCX)
+                       debugl1(cs, "pump stev RSP_READY");
+               bcs->hw.isar.state = STFAX_READY;
+               l1_msg_b(bcs->st, PH_ACTIVATE | REQUEST, NULL);
+               if (test_bit(BC_FLG_ORIG, &bcs->Flag)) {
+                       isar_pump_cmd(bcs, ISDN_FAX_CLASS1_FRH, 3);
+               } else {
+                       isar_pump_cmd(bcs, ISDN_FAX_CLASS1_FTH, 3);
+               }
+               break;
+       case PSEV_LINE_TX_H:
+               if (bcs->hw.isar.state == STFAX_LINE) {
                        if (cs->debug & L1_DEB_HSCX)
-                               debugl1(cs, "pump stev TIMER");
-                       break;
-               case PSEV_RSP_READY:
+                               debugl1(cs, "pump stev LINE_TX_H");
+                       bcs->hw.isar.state = STFAX_CONT;
+                       sendmsg(cs, dps | ISAR_HIS_PUMPCTRL, PCTRL_CMD_CONT, 0, NULL);
+               } else {
+                       if (cs->debug & L1_DEB_WARN)
+                               debugl1(cs, "pump stev LINE_TX_H wrong st %x",
+                                       bcs->hw.isar.state);
+               }
+               break;
+       case PSEV_LINE_RX_H:
+               if (bcs->hw.isar.state == STFAX_LINE) {
                        if (cs->debug & L1_DEB_HSCX)
-                               debugl1(cs, "pump stev RSP_READY");
-                       bcs->hw.isar.state = STFAX_READY;
-                       l1_msg_b(bcs->st, PH_ACTIVATE | REQUEST, NULL);
-                       if (test_bit(BC_FLG_ORIG, &bcs->Flag)) {
-                               isar_pump_cmd(bcs, ISDN_FAX_CLASS1_FRH, 3);
-                       } else {
-                               isar_pump_cmd(bcs, ISDN_FAX_CLASS1_FTH, 3);
-                       }
-                       break;
-               case PSEV_LINE_TX_H:
-                       if (bcs->hw.isar.state == STFAX_LINE) {
-                               if (cs->debug & L1_DEB_HSCX)
-                                       debugl1(cs, "pump stev LINE_TX_H");
-                               bcs->hw.isar.state = STFAX_CONT;
-                               sendmsg(cs, dps | ISAR_HIS_PUMPCTRL, PCTRL_CMD_CONT, 0, NULL);
-                       } else {
-                               if (cs->debug & L1_DEB_WARN)
-                                       debugl1(cs, "pump stev LINE_TX_H wrong st %x",
-                                               bcs->hw.isar.state);
-                       }
-                       break;
-               case PSEV_LINE_RX_H:
-                       if (bcs->hw.isar.state == STFAX_LINE) {
-                               if (cs->debug & L1_DEB_HSCX)
-                                       debugl1(cs, "pump stev LINE_RX_H");
-                               bcs->hw.isar.state = STFAX_CONT;
-                               sendmsg(cs, dps | ISAR_HIS_PUMPCTRL, PCTRL_CMD_CONT, 0, NULL);
-                       } else {
-                               if (cs->debug & L1_DEB_WARN)
-                                       debugl1(cs, "pump stev LINE_RX_H wrong st %x",
-                                               bcs->hw.isar.state);
-                       }
-                       break;
-               case PSEV_LINE_TX_B:
-                       if (bcs->hw.isar.state == STFAX_LINE) {
-                               if (cs->debug & L1_DEB_HSCX)
-                                       debugl1(cs, "pump stev LINE_TX_B");
-                               bcs->hw.isar.state = STFAX_CONT;
-                               sendmsg(cs, dps | ISAR_HIS_PUMPCTRL, PCTRL_CMD_CONT, 0, NULL);
-                       } else {
-                               if (cs->debug & L1_DEB_WARN)
-                                       debugl1(cs, "pump stev LINE_TX_B wrong st %x",
-                                               bcs->hw.isar.state);
-                       }
-                       break;
-               case PSEV_LINE_RX_B:
-                       if (bcs->hw.isar.state == STFAX_LINE) {
-                               if (cs->debug & L1_DEB_HSCX)
-                                       debugl1(cs, "pump stev LINE_RX_B");
-                               bcs->hw.isar.state = STFAX_CONT;
-                               sendmsg(cs, dps | ISAR_HIS_PUMPCTRL, PCTRL_CMD_CONT, 0, NULL);
-                       } else {
-                               if (cs->debug & L1_DEB_WARN)
-                                       debugl1(cs, "pump stev LINE_RX_B wrong st %x",
-                                               bcs->hw.isar.state);
-                       }
-                       break;
-               case PSEV_RSP_CONN:
-                       if (bcs->hw.isar.state == STFAX_CONT) {
-                               if (cs->debug & L1_DEB_HSCX)
-                                       debugl1(cs, "pump stev RSP_CONN");
-                               bcs->hw.isar.state = STFAX_ACTIV;
-                               test_and_set_bit(ISAR_RATE_REQ, &bcs->hw.isar.reg->Flags);
-                               sendmsg(cs, dps | ISAR_HIS_PSTREQ, 0, 0, NULL);
-                               if (bcs->hw.isar.cmd == PCTRL_CMD_FTH) {
-                                       /* 1s Flags before data */
-                                       if (test_and_set_bit(BC_FLG_FTI_RUN, &bcs->Flag))
-                                               del_timer(&bcs->hw.isar.ftimer);
-                                       /* 1000 ms */
-                                       bcs->hw.isar.ftimer.expires =
-                                               jiffies + ((1000 * HZ)/1000);
-                                       test_and_set_bit(BC_FLG_LL_CONN,
-                                               &bcs->Flag);
-                                       add_timer(&bcs->hw.isar.ftimer);
-                               } else {
-                                       schedule_event(bcs, B_LL_CONNECT);
-                               }
-                       } else {
-                               if (cs->debug & L1_DEB_WARN)
-                                       debugl1(cs, "pump stev RSP_CONN wrong st %x",
-                                               bcs->hw.isar.state);
-                       }
-                       break;
-               case PSEV_FLAGS_DET:
+                               debugl1(cs, "pump stev LINE_RX_H");
+                       bcs->hw.isar.state = STFAX_CONT;
+                       sendmsg(cs, dps | ISAR_HIS_PUMPCTRL, PCTRL_CMD_CONT, 0, NULL);
+               } else {
+                       if (cs->debug & L1_DEB_WARN)
+                               debugl1(cs, "pump stev LINE_RX_H wrong st %x",
+                                       bcs->hw.isar.state);
+               }
+               break;
+       case PSEV_LINE_TX_B:
+               if (bcs->hw.isar.state == STFAX_LINE) {
                        if (cs->debug & L1_DEB_HSCX)
-                               debugl1(cs, "pump stev FLAGS_DET");
-                       break;
-               case PSEV_RSP_DISC:
+                               debugl1(cs, "pump stev LINE_TX_B");
+                       bcs->hw.isar.state = STFAX_CONT;
+                       sendmsg(cs, dps | ISAR_HIS_PUMPCTRL, PCTRL_CMD_CONT, 0, NULL);
+               } else {
+                       if (cs->debug & L1_DEB_WARN)
+                               debugl1(cs, "pump stev LINE_TX_B wrong st %x",
+                                       bcs->hw.isar.state);
+               }
+               break;
+       case PSEV_LINE_RX_B:
+               if (bcs->hw.isar.state == STFAX_LINE) {
                        if (cs->debug & L1_DEB_HSCX)
-                               debugl1(cs, "pump stev RSP_DISC");
-                       if (bcs->hw.isar.state == STFAX_ESCAPE) {
-                               p1 = 5;
-                               switch(bcs->hw.isar.newcmd) {
-                                       case 0:
-                                               bcs->hw.isar.state = STFAX_READY;
-                                               break;
-                                       case PCTRL_CMD_FTM:
-                                               p1 = 2;
-                                       case PCTRL_CMD_FTH:
-                                               sendmsg(cs, dps | ISAR_HIS_PUMPCTRL,
-                                                       PCTRL_CMD_SILON, 1, &p1);
-                                               bcs->hw.isar.state = STFAX_SILDET;
-                                               break;
-                                       case PCTRL_CMD_FRM:
-                                               if (frm_extra_delay)
-                                                       mdelay(frm_extra_delay);
-                                       case PCTRL_CMD_FRH:
-                                               p1 = bcs->hw.isar.mod = bcs->hw.isar.newmod;
-                                               bcs->hw.isar.newmod = 0;
-                                               bcs->hw.isar.cmd = bcs->hw.isar.newcmd;
-                                               bcs->hw.isar.newcmd = 0;
-                                               sendmsg(cs, dps | ISAR_HIS_PUMPCTRL,
-                                                       bcs->hw.isar.cmd, 1, &p1);
-                                               bcs->hw.isar.state = STFAX_LINE;
-                                               bcs->hw.isar.try_mod = 3;
-                                               break;
-                                       default:
-                                               if (cs->debug & L1_DEB_HSCX)
-                                                       debugl1(cs, "RSP_DISC unknown newcmd %x", bcs->hw.isar.newcmd);
-                                               break;
-                               }
-                       } else if (bcs->hw.isar.state == STFAX_ACTIV) {
-                               if (test_and_clear_bit(BC_FLG_LL_OK, &bcs->Flag)) {
-                                       schedule_event(bcs, B_LL_OK);
-                               } else if (bcs->hw.isar.cmd == PCTRL_CMD_FRM) {
-                                       send_DLE_ETX(bcs);
-                                       schedule_event(bcs, B_LL_NOCARRIER);
-                               } else {
-                                       ll_deliver_faxstat(bcs, ISDN_FAX_CLASS1_FCERROR);
-                               }
-                               bcs->hw.isar.state = STFAX_READY;
+                               debugl1(cs, "pump stev LINE_RX_B");
+                       bcs->hw.isar.state = STFAX_CONT;
+                       sendmsg(cs, dps | ISAR_HIS_PUMPCTRL, PCTRL_CMD_CONT, 0, NULL);
+               } else {
+                       if (cs->debug & L1_DEB_WARN)
+                               debugl1(cs, "pump stev LINE_RX_B wrong st %x",
+                                       bcs->hw.isar.state);
+               }
+               break;
+       case PSEV_RSP_CONN:
+               if (bcs->hw.isar.state == STFAX_CONT) {
+                       if (cs->debug & L1_DEB_HSCX)
+                               debugl1(cs, "pump stev RSP_CONN");
+                       bcs->hw.isar.state = STFAX_ACTIV;
+                       test_and_set_bit(ISAR_RATE_REQ, &bcs->hw.isar.reg->Flags);
+                       sendmsg(cs, dps | ISAR_HIS_PSTREQ, 0, 0, NULL);
+                       if (bcs->hw.isar.cmd == PCTRL_CMD_FTH) {
+                               /* 1s Flags before data */
+                               if (test_and_set_bit(BC_FLG_FTI_RUN, &bcs->Flag))
+                                       del_timer(&bcs->hw.isar.ftimer);
+                               /* 1000 ms */
+                               bcs->hw.isar.ftimer.expires =
+                                       jiffies + ((1000 * HZ) / 1000);
+                               test_and_set_bit(BC_FLG_LL_CONN,
+                                                &bcs->Flag);
+                               add_timer(&bcs->hw.isar.ftimer);
                        } else {
-                               bcs->hw.isar.state = STFAX_READY;
-                               ll_deliver_faxstat(bcs, ISDN_FAX_CLASS1_FCERROR);
+                               schedule_event(bcs, B_LL_CONNECT);
                        }
-                       break;
-               case PSEV_RSP_SILDET:
-                       if (cs->debug & L1_DEB_HSCX)
-                               debugl1(cs, "pump stev RSP_SILDET");
-                       if (bcs->hw.isar.state == STFAX_SILDET) {
+               } else {
+                       if (cs->debug & L1_DEB_WARN)
+                               debugl1(cs, "pump stev RSP_CONN wrong st %x",
+                                       bcs->hw.isar.state);
+               }
+               break;
+       case PSEV_FLAGS_DET:
+               if (cs->debug & L1_DEB_HSCX)
+                       debugl1(cs, "pump stev FLAGS_DET");
+               break;
+       case PSEV_RSP_DISC:
+               if (cs->debug & L1_DEB_HSCX)
+                       debugl1(cs, "pump stev RSP_DISC");
+               if (bcs->hw.isar.state == STFAX_ESCAPE) {
+                       p1 = 5;
+                       switch (bcs->hw.isar.newcmd) {
+                       case 0:
+                               bcs->hw.isar.state = STFAX_READY;
+                               break;
+                       case PCTRL_CMD_FTM:
+                               p1 = 2;
+                       case PCTRL_CMD_FTH:
+                               sendmsg(cs, dps | ISAR_HIS_PUMPCTRL,
+                                       PCTRL_CMD_SILON, 1, &p1);
+                               bcs->hw.isar.state = STFAX_SILDET;
+                               break;
+                       case PCTRL_CMD_FRM:
+                               if (frm_extra_delay)
+                                       mdelay(frm_extra_delay);
+                       case PCTRL_CMD_FRH:
                                p1 = bcs->hw.isar.mod = bcs->hw.isar.newmod;
                                bcs->hw.isar.newmod = 0;
                                bcs->hw.isar.cmd = bcs->hw.isar.newcmd;
@@ -1139,32 +1106,65 @@ isar_pump_statev_fax(struct BCState *bcs, u_char devt) {
                                        bcs->hw.isar.cmd, 1, &p1);
                                bcs->hw.isar.state = STFAX_LINE;
                                bcs->hw.isar.try_mod = 3;
-                       }
-                       break;
-               case PSEV_RSP_SILOFF:
-                       if (cs->debug & L1_DEB_HSCX)
-                               debugl1(cs, "pump stev RSP_SILOFF");
-                       break;
-               case PSEV_RSP_FCERR:
-                       if (bcs->hw.isar.state == STFAX_LINE) {
+                               break;
+                       default:
                                if (cs->debug & L1_DEB_HSCX)
-                                       debugl1(cs, "pump stev RSP_FCERR try %d",
-                                               bcs->hw.isar.try_mod);
-                               if (bcs->hw.isar.try_mod--) {
-                                       sendmsg(cs, dps | ISAR_HIS_PUMPCTRL,
-                                               bcs->hw.isar.cmd, 1,
-                                               &bcs->hw.isar.mod);
-                                       break;
-                               }
+                                       debugl1(cs, "RSP_DISC unknown newcmd %x", bcs->hw.isar.newcmd);
+                               break;
                        }
-                       if (cs->debug & L1_DEB_HSCX)
-                               debugl1(cs, "pump stev RSP_FCERR");
-                       bcs->hw.isar.state = STFAX_ESCAPE;
-                       sendmsg(cs, dps | ISAR_HIS_PUMPCTRL, PCTRL_CMD_ESC, 0, NULL);
+               } else if (bcs->hw.isar.state == STFAX_ACTIV) {
+                       if (test_and_clear_bit(BC_FLG_LL_OK, &bcs->Flag)) {
+                               schedule_event(bcs, B_LL_OK);
+                       } else if (bcs->hw.isar.cmd == PCTRL_CMD_FRM) {
+                               send_DLE_ETX(bcs);
+                               schedule_event(bcs, B_LL_NOCARRIER);
+                       } else {
+                               ll_deliver_faxstat(bcs, ISDN_FAX_CLASS1_FCERROR);
+                       }
+                       bcs->hw.isar.state = STFAX_READY;
+               } else {
+                       bcs->hw.isar.state = STFAX_READY;
                        ll_deliver_faxstat(bcs, ISDN_FAX_CLASS1_FCERROR);
-                       break;
-               default:
-                       break;
+               }
+               break;
+       case PSEV_RSP_SILDET:
+               if (cs->debug & L1_DEB_HSCX)
+                       debugl1(cs, "pump stev RSP_SILDET");
+               if (bcs->hw.isar.state == STFAX_SILDET) {
+                       p1 = bcs->hw.isar.mod = bcs->hw.isar.newmod;
+                       bcs->hw.isar.newmod = 0;
+                       bcs->hw.isar.cmd = bcs->hw.isar.newcmd;
+                       bcs->hw.isar.newcmd = 0;
+                       sendmsg(cs, dps | ISAR_HIS_PUMPCTRL,
+                               bcs->hw.isar.cmd, 1, &p1);
+                       bcs->hw.isar.state = STFAX_LINE;
+                       bcs->hw.isar.try_mod = 3;
+               }
+               break;
+       case PSEV_RSP_SILOFF:
+               if (cs->debug & L1_DEB_HSCX)
+                       debugl1(cs, "pump stev RSP_SILOFF");
+               break;
+       case PSEV_RSP_FCERR:
+               if (bcs->hw.isar.state == STFAX_LINE) {
+                       if (cs->debug & L1_DEB_HSCX)
+                               debugl1(cs, "pump stev RSP_FCERR try %d",
+                                       bcs->hw.isar.try_mod);
+                       if (bcs->hw.isar.try_mod--) {
+                               sendmsg(cs, dps | ISAR_HIS_PUMPCTRL,
+                                       bcs->hw.isar.cmd, 1,
+                                       &bcs->hw.isar.mod);
+                               break;
+                       }
+               }
+               if (cs->debug & L1_DEB_HSCX)
+                       debugl1(cs, "pump stev RSP_FCERR");
+               bcs->hw.isar.state = STFAX_ESCAPE;
+               sendmsg(cs, dps | ISAR_HIS_PUMPCTRL, PCTRL_CMD_ESC, 0, NULL);
+               ll_deliver_faxstat(bcs, ISDN_FAX_CLASS1_FCERROR);
+               break;
+       default:
+               break;
        }
 }
 
@@ -1178,91 +1178,91 @@ isar_int_main(struct IsdnCardState *cs)
 
        get_irq_infos(cs, ireg);
        switch (ireg->iis & ISAR_IIS_MSCMSD) {
-               case ISAR_IIS_RDATA:
-                       if ((bcs = sel_bcs_isar(cs, ireg->iis >> 6))) {
-                               isar_rcv_frame(cs, bcs);
-                       } else {
-                               debugl1(cs, "isar spurious IIS_RDATA %x/%x/%x",
-                                       ireg->iis, ireg->cmsb, ireg->clsb);
-                               cs->BC_Write_Reg(cs, 1, ISAR_IIA, 0);
-                       }
-                       break;
-               case ISAR_IIS_GSTEV:
+       case ISAR_IIS_RDATA:
+               if ((bcs = sel_bcs_isar(cs, ireg->iis >> 6))) {
+                       isar_rcv_frame(cs, bcs);
+               } else {
+                       debugl1(cs, "isar spurious IIS_RDATA %x/%x/%x",
+                               ireg->iis, ireg->cmsb, ireg->clsb);
                        cs->BC_Write_Reg(cs, 1, ISAR_IIA, 0);
-                       ireg->bstat |= ireg->cmsb;
-                       check_send(cs, ireg->cmsb);
-                       break;
-               case ISAR_IIS_BSTEV:
+               }
+               break;
+       case ISAR_IIS_GSTEV:
+               cs->BC_Write_Reg(cs, 1, ISAR_IIA, 0);
+               ireg->bstat |= ireg->cmsb;
+               check_send(cs, ireg->cmsb);
+               break;
+       case ISAR_IIS_BSTEV:
 #ifdef ERROR_STATISTIC
-                       if ((bcs = sel_bcs_isar(cs, ireg->iis >> 6))) {
-                               if (ireg->cmsb == BSTEV_TBO)
-                                       bcs->err_tx++;
-                               if (ireg->cmsb == BSTEV_RBO)
-                                       bcs->err_rdo++;
-                       }
+               if ((bcs = sel_bcs_isar(cs, ireg->iis >> 6))) {
+                       if (ireg->cmsb == BSTEV_TBO)
+                               bcs->err_tx++;
+                       if (ireg->cmsb == BSTEV_RBO)
+                               bcs->err_rdo++;
+               }
 #endif
-                       if (cs->debug & L1_DEB_WARN)
-                               debugl1(cs, "Buffer STEV dpath%d msb(%x)",
-                                       ireg->iis>>6, ireg->cmsb);
-                       cs->BC_Write_Reg(cs, 1, ISAR_IIA, 0);
-                       break;
-               case ISAR_IIS_PSTEV:
-                       if ((bcs = sel_bcs_isar(cs, ireg->iis >> 6))) {
-                               rcv_mbox(cs, ireg, (u_char *)ireg->par);
-                               if (bcs->mode == L1_MODE_V32) {
-                                       isar_pump_statev_modem(bcs, ireg->cmsb);
-                               } else if (bcs->mode == L1_MODE_FAX) {
-                                       isar_pump_statev_fax(bcs, ireg->cmsb);
-                               } else if (ireg->cmsb == PSEV_10MS_TIMER) {
-                                       if (cs->debug & L1_DEB_HSCX)
-                                               debugl1(cs, "pump stev TIMER");
-                               } else {
-                                       if (cs->debug & L1_DEB_WARN)
-                                               debugl1(cs, "isar IIS_PSTEV pmode %d stat %x",
-                                                       bcs->mode, ireg->cmsb);
-                               }
-                       } else {
-                               debugl1(cs, "isar spurious IIS_PSTEV %x/%x/%x",
-                                       ireg->iis, ireg->cmsb, ireg->clsb);
-                               cs->BC_Write_Reg(cs, 1, ISAR_IIA, 0);
-                       }
-                       break;
-               case ISAR_IIS_PSTRSP:
-                       if ((bcs = sel_bcs_isar(cs, ireg->iis >> 6))) {
-                               rcv_mbox(cs, ireg, (u_char *)ireg->par);
-                               isar_pump_status_rsp(bcs, ireg);
+               if (cs->debug & L1_DEB_WARN)
+                       debugl1(cs, "Buffer STEV dpath%d msb(%x)",
+                               ireg->iis >> 6, ireg->cmsb);
+               cs->BC_Write_Reg(cs, 1, ISAR_IIA, 0);
+               break;
+       case ISAR_IIS_PSTEV:
+               if ((bcs = sel_bcs_isar(cs, ireg->iis >> 6))) {
+                       rcv_mbox(cs, ireg, (u_char *)ireg->par);
+                       if (bcs->mode == L1_MODE_V32) {
+                               isar_pump_statev_modem(bcs, ireg->cmsb);
+                       } else if (bcs->mode == L1_MODE_FAX) {
+                               isar_pump_statev_fax(bcs, ireg->cmsb);
+                       } else if (ireg->cmsb == PSEV_10MS_TIMER) {
+                               if (cs->debug & L1_DEB_HSCX)
+                                       debugl1(cs, "pump stev TIMER");
                        } else {
-                               debugl1(cs, "isar spurious IIS_PSTRSP %x/%x/%x",
-                                       ireg->iis, ireg->cmsb, ireg->clsb);
-                               cs->BC_Write_Reg(cs, 1, ISAR_IIA, 0);
+                               if (cs->debug & L1_DEB_WARN)
+                                       debugl1(cs, "isar IIS_PSTEV pmode %d stat %x",
+                                               bcs->mode, ireg->cmsb);
                        }
-                       break;
-               case ISAR_IIS_DIAG:
-               case ISAR_IIS_BSTRSP:
-               case ISAR_IIS_IOM2RSP:
+               } else {
+                       debugl1(cs, "isar spurious IIS_PSTEV %x/%x/%x",
+                               ireg->iis, ireg->cmsb, ireg->clsb);
+                       cs->BC_Write_Reg(cs, 1, ISAR_IIA, 0);
+               }
+               break;
+       case ISAR_IIS_PSTRSP:
+               if ((bcs = sel_bcs_isar(cs, ireg->iis >> 6))) {
                        rcv_mbox(cs, ireg, (u_char *)ireg->par);
-                       if ((cs->debug & (L1_DEB_HSCX | L1_DEB_HSCX_FIFO))
-                               == L1_DEB_HSCX) {
-                               u_char *tp=debbuf;
-
-                               tp += sprintf(debbuf, "msg iis(%x) msb(%x)",
-                                       ireg->iis, ireg->cmsb);
-                               QuickHex(tp, (u_char *)ireg->par, ireg->clsb);
-                               debugl1(cs, debbuf);
-                       }
-                       break;
-               case ISAR_IIS_INVMSG:
-                       rcv_mbox(cs, ireg, debbuf);
-                       if (cs->debug & L1_DEB_WARN)
-                               debugl1(cs, "invalid msg his:%x",
-                                       ireg->cmsb);
-                       break;
-               default:
-                       rcv_mbox(cs, ireg, debbuf);
-                       if (cs->debug & L1_DEB_WARN)
-                               debugl1(cs, "unhandled msg iis(%x) ctrl(%x/%x)",
-                                       ireg->iis, ireg->cmsb, ireg->clsb);
-                       break;
+                       isar_pump_status_rsp(bcs, ireg);
+               } else {
+                       debugl1(cs, "isar spurious IIS_PSTRSP %x/%x/%x",
+                               ireg->iis, ireg->cmsb, ireg->clsb);
+                       cs->BC_Write_Reg(cs, 1, ISAR_IIA, 0);
+               }
+               break;
+       case ISAR_IIS_DIAG:
+       case ISAR_IIS_BSTRSP:
+       case ISAR_IIS_IOM2RSP:
+               rcv_mbox(cs, ireg, (u_char *)ireg->par);
+               if ((cs->debug & (L1_DEB_HSCX | L1_DEB_HSCX_FIFO))
+                   == L1_DEB_HSCX) {
+                       u_char *tp = debbuf;
+
+                       tp += sprintf(debbuf, "msg iis(%x) msb(%x)",
+                                     ireg->iis, ireg->cmsb);
+                       QuickHex(tp, (u_char *)ireg->par, ireg->clsb);
+                       debugl1(cs, debbuf);
+               }
+               break;
+       case ISAR_IIS_INVMSG:
+               rcv_mbox(cs, ireg, debbuf);
+               if (cs->debug & L1_DEB_WARN)
+                       debugl1(cs, "invalid msg his:%x",
+                               ireg->cmsb);
+               break;
+       default:
+               rcv_mbox(cs, ireg, debbuf);
+               if (cs->debug & L1_DEB_WARN)
+                       debugl1(cs, "unhandled msg iis(%x) ctrl(%x/%x)",
+                               ireg->iis, ireg->cmsb, ireg->clsb);
+               break;
        }
 }
 
@@ -1287,42 +1287,42 @@ setup_pump(struct BCState *bcs) {
        u_char ctrl, param[6];
 
        switch (bcs->mode) {
-               case L1_MODE_NULL:
-               case L1_MODE_TRANS:
-               case L1_MODE_HDLC:
-                       sendmsg(cs, dps | ISAR_HIS_PUMPCFG, PMOD_BYPASS, 0, NULL);
-                       break;
-               case L1_MODE_V32:
-                       ctrl = PMOD_DATAMODEM;
-                       if (test_bit(BC_FLG_ORIG, &bcs->Flag)) {
-                               ctrl |= PCTRL_ORIG;
-                               param[5] = PV32P6_CTN;
-                       } else {
-                               param[5] = PV32P6_ATN;
-                       }
-                       param[0] = para_TOA; /* 6 db */
-                       param[1] = PV32P2_V23R | PV32P2_V22A | PV32P2_V22B |
-                                  PV32P2_V22C | PV32P2_V21 | PV32P2_BEL; 
-                       param[2] = PV32P3_AMOD | PV32P3_V32B | PV32P3_V23B;
-                       param[3] = PV32P4_UT144;
-                       param[4] = PV32P5_UT144;
-                       sendmsg(cs, dps | ISAR_HIS_PUMPCFG, ctrl, 6, param);
-                       break;
-               case L1_MODE_FAX:
-                       ctrl = PMOD_FAX;
-                       if (test_bit(BC_FLG_ORIG, &bcs->Flag)) {
-                               ctrl |= PCTRL_ORIG;
-                               param[1] = PFAXP2_CTN;
-                       } else {
-                               param[1] = PFAXP2_ATN;
-                       }
-                       param[0] = para_TOA; /* 6 db */
-                       sendmsg(cs, dps | ISAR_HIS_PUMPCFG, ctrl, 2, param);
-                       bcs->hw.isar.state = STFAX_NULL;
-                       bcs->hw.isar.newcmd = 0;
-                       bcs->hw.isar.newmod = 0;
-                       test_and_set_bit(BC_FLG_FTI_RUN, &bcs->Flag);
-                       break;
+       case L1_MODE_NULL:
+       case L1_MODE_TRANS:
+       case L1_MODE_HDLC:
+               sendmsg(cs, dps | ISAR_HIS_PUMPCFG, PMOD_BYPASS, 0, NULL);
+               break;
+       case L1_MODE_V32:
+               ctrl = PMOD_DATAMODEM;
+               if (test_bit(BC_FLG_ORIG, &bcs->Flag)) {
+                       ctrl |= PCTRL_ORIG;
+                       param[5] = PV32P6_CTN;
+               } else {
+                       param[5] = PV32P6_ATN;
+               }
+               param[0] = para_TOA; /* 6 db */
+               param[1] = PV32P2_V23R | PV32P2_V22A | PV32P2_V22B |
+                       PV32P2_V22C | PV32P2_V21 | PV32P2_BEL;
+               param[2] = PV32P3_AMOD | PV32P3_V32B | PV32P3_V23B;
+               param[3] = PV32P4_UT144;
+               param[4] = PV32P5_UT144;
+               sendmsg(cs, dps | ISAR_HIS_PUMPCFG, ctrl, 6, param);
+               break;
+       case L1_MODE_FAX:
+               ctrl = PMOD_FAX;
+               if (test_bit(BC_FLG_ORIG, &bcs->Flag)) {
+                       ctrl |= PCTRL_ORIG;
+                       param[1] = PFAXP2_CTN;
+               } else {
+                       param[1] = PFAXP2_ATN;
+               }
+               param[0] = para_TOA; /* 6 db */
+               sendmsg(cs, dps | ISAR_HIS_PUMPCFG, ctrl, 2, param);
+               bcs->hw.isar.state = STFAX_NULL;
+               bcs->hw.isar.newcmd = 0;
+               bcs->hw.isar.newmod = 0;
+               test_and_set_bit(BC_FLG_FTI_RUN, &bcs->Flag);
+               break;
        }
        udelay(1000);
        sendmsg(cs, dps | ISAR_HIS_PSTREQ, 0, 0, NULL);
@@ -1334,31 +1334,31 @@ setup_sart(struct BCState *bcs) {
        struct IsdnCardState *cs = bcs->cs;
        u_char dps = SET_DPS(bcs->hw.isar.dpath);
        u_char ctrl, param[2];
-       
+
        switch (bcs->mode) {
-               case L1_MODE_NULL:
-                       sendmsg(cs, dps | ISAR_HIS_SARTCFG, SMODE_DISABLE, 0,
-                               NULL);
-                       break;
-               case L1_MODE_TRANS:
-                       sendmsg(cs, dps | ISAR_HIS_SARTCFG, SMODE_BINARY, 2,
-                               "\0\0");
-                       break;
-               case L1_MODE_HDLC:
-                       param[0] = 0;
-                       sendmsg(cs, dps | ISAR_HIS_SARTCFG, SMODE_HDLC, 1,
-                               param);
-                       break;
-               case L1_MODE_V32:
-                       ctrl = SMODE_V14 | SCTRL_HDMC_BOTH;
-                       param[0] = S_P1_CHS_8;
-                       param[1] = S_P2_BFT_DEF;
-                       sendmsg(cs, dps | ISAR_HIS_SARTCFG, ctrl, 2,
-                               param);
-                       break;
-               case L1_MODE_FAX:
-                       /* SART must not configured with FAX */
-                       break;
+       case L1_MODE_NULL:
+               sendmsg(cs, dps | ISAR_HIS_SARTCFG, SMODE_DISABLE, 0,
+                       NULL);
+               break;
+       case L1_MODE_TRANS:
+               sendmsg(cs, dps | ISAR_HIS_SARTCFG, SMODE_BINARY, 2,
+                       "\0\0");
+               break;
+       case L1_MODE_HDLC:
+               param[0] = 0;
+               sendmsg(cs, dps | ISAR_HIS_SARTCFG, SMODE_HDLC, 1,
+                       param);
+               break;
+       case L1_MODE_V32:
+               ctrl = SMODE_V14 | SCTRL_HDMC_BOTH;
+               param[0] = S_P1_CHS_8;
+               param[1] = S_P2_BFT_DEF;
+               sendmsg(cs, dps | ISAR_HIS_SARTCFG, ctrl, 2,
+                       param);
+               break;
+       case L1_MODE_FAX:
+               /* SART must not configured with FAX */
+               break;
        }
        udelay(1000);
        sendmsg(cs, dps | ISAR_HIS_BSTREQ, 0, 0, NULL);
@@ -1369,23 +1369,23 @@ static void
 setup_iom2(struct BCState *bcs) {
        struct IsdnCardState *cs = bcs->cs;
        u_char dps = SET_DPS(bcs->hw.isar.dpath);
-       u_char cmsb = IOM_CTRL_ENA, msg[5] = {IOM_P1_TXD,0,0,0,0};
-       
+       u_char cmsb = IOM_CTRL_ENA, msg[5] = {IOM_P1_TXD, 0, 0, 0, 0};
+
        if (bcs->channel)
                msg[1] = msg[3] = 1;
        switch (bcs->mode) {
-               case L1_MODE_NULL:
-                       cmsb = 0;
-                       /* dummy slot */
-                       msg[1] = msg[3] = bcs->hw.isar.dpath + 2;
-                       break;
-               case L1_MODE_TRANS:
-               case L1_MODE_HDLC:
-                       break;
-               case L1_MODE_V32:
-               case L1_MODE_FAX:
-                       cmsb |= IOM_CTRL_ALAW | IOM_CTRL_RCV;
-                       break;
+       case L1_MODE_NULL:
+               cmsb = 0;
+               /* dummy slot */
+               msg[1] = msg[3] = bcs->hw.isar.dpath + 2;
+               break;
+       case L1_MODE_TRANS:
+       case L1_MODE_HDLC:
+               break;
+       case L1_MODE_V32:
+       case L1_MODE_FAX:
+               cmsb |= IOM_CTRL_ALAW | IOM_CTRL_RCV;
+               break;
        }
        sendmsg(cs, dps | ISAR_HIS_IOM2CFG, cmsb, 5, msg);
        udelay(1000);
@@ -1399,40 +1399,40 @@ modeisar(struct BCState *bcs, int mode, int bc)
        struct IsdnCardState *cs = bcs->cs;
 
        /* Here we are selecting the best datapath for requested mode */
-       if(bcs->mode == L1_MODE_NULL) { /* New Setup */
+       if (bcs->mode == L1_MODE_NULL) { /* New Setup */
                bcs->channel = bc;
                switch (mode) {
-                       case L1_MODE_NULL: /* init */
-                               if (!bcs->hw.isar.dpath)
-                                       /* no init for dpath 0 */
-                                       return(0);
-                               break;
-                       case L1_MODE_TRANS:
-                       case L1_MODE_HDLC:
-                               /* best is datapath 2 */
-                               if (!test_and_set_bit(ISAR_DP2_USE, 
-                                       &bcs->hw.isar.reg->Flags))
-                                       bcs->hw.isar.dpath = 2;
-                               else if (!test_and_set_bit(ISAR_DP1_USE,
-                                       &bcs->hw.isar.reg->Flags))
-                                       bcs->hw.isar.dpath = 1;
-                               else {
-                                       printk(KERN_WARNING"isar modeisar both pathes in use\n");
-                                       return(1);
-                               }
-                               break;
-                       case L1_MODE_V32:
-                       case L1_MODE_FAX:
-                               /* only datapath 1 */
-                               if (!test_and_set_bit(ISAR_DP1_USE, 
-                                       &bcs->hw.isar.reg->Flags))
-                                       bcs->hw.isar.dpath = 1;
-                               else {
-                                       printk(KERN_WARNING"isar modeisar analog functions only with DP1\n");
-                                       debugl1(cs, "isar modeisar analog functions only with DP1");
-                                       return(1);
-                               }
-                               break;
+               case L1_MODE_NULL: /* init */
+                       if (!bcs->hw.isar.dpath)
+                               /* no init for dpath 0 */
+                               return (0);
+                       break;
+               case L1_MODE_TRANS:
+               case L1_MODE_HDLC:
+                       /* best is datapath 2 */
+                       if (!test_and_set_bit(ISAR_DP2_USE,
+                                             &bcs->hw.isar.reg->Flags))
+                               bcs->hw.isar.dpath = 2;
+                       else if (!test_and_set_bit(ISAR_DP1_USE,
+                                                  &bcs->hw.isar.reg->Flags))
+                               bcs->hw.isar.dpath = 1;
+                       else {
+                               printk(KERN_WARNING"isar modeisar both pathes in use\n");
+                               return (1);
+                       }
+                       break;
+               case L1_MODE_V32:
+               case L1_MODE_FAX:
+                       /* only datapath 1 */
+                       if (!test_and_set_bit(ISAR_DP1_USE,
+                                             &bcs->hw.isar.reg->Flags))
+                               bcs->hw.isar.dpath = 1;
+                       else {
+                               printk(KERN_WARNING"isar modeisar analog functions only with DP1\n");
+                               debugl1(cs, "isar modeisar analog functions only with DP1");
+                               return (1);
+                       }
+                       break;
                }
        }
        if (cs->debug & L1_DEB_HSCX)
@@ -1450,118 +1450,118 @@ modeisar(struct BCState *bcs, int mode, int bc)
                        test_and_clear_bit(ISAR_DP2_USE, &bcs->hw.isar.reg->Flags);
                bcs->hw.isar.dpath = 0;
        }
-       return(0);
+       return (0);
 }
 
 static void
-isar_pump_cmd(struct BCState *bcs, u_char cmd, u_char para) 
+isar_pump_cmd(struct BCState *bcs, u_char cmd, u_char para)
 {
        struct IsdnCardState *cs = bcs->cs;
        u_char dps = SET_DPS(bcs->hw.isar.dpath);
        u_char ctrl = 0, nom = 0, p1 = 0;
 
-       switch(cmd) {
-               case ISDN_FAX_CLASS1_FTM:
-                       test_and_clear_bit(BC_FLG_FRH_WAIT, &bcs->Flag);
-                       if (bcs->hw.isar.state == STFAX_READY) {
-                               p1 = para;
-                               ctrl = PCTRL_CMD_FTM;
-                               nom = 1;
-                               bcs->hw.isar.state = STFAX_LINE;
-                               bcs->hw.isar.cmd = ctrl;
-                               bcs->hw.isar.mod = para;
-                               bcs->hw.isar.newmod = 0;
-                               bcs->hw.isar.newcmd = 0;
-                               bcs->hw.isar.try_mod = 3; 
-                       } else if ((bcs->hw.isar.state == STFAX_ACTIV) &&
-                               (bcs->hw.isar.cmd == PCTRL_CMD_FTM) &&
-                               (bcs->hw.isar.mod == para)) {
-                               ll_deliver_faxstat(bcs, ISDN_FAX_CLASS1_CONNECT);
-                       } else {
-                               bcs->hw.isar.newmod = para;
-                               bcs->hw.isar.newcmd = PCTRL_CMD_FTM;
-                               nom = 0;
-                               ctrl = PCTRL_CMD_ESC;
-                               bcs->hw.isar.state = STFAX_ESCAPE; 
-                       }
-                       break;
-               case ISDN_FAX_CLASS1_FTH:
-                       test_and_clear_bit(BC_FLG_FRH_WAIT, &bcs->Flag);
-                       if (bcs->hw.isar.state == STFAX_READY) {
-                               p1 = para;
-                               ctrl = PCTRL_CMD_FTH;
-                               nom = 1;
-                               bcs->hw.isar.state = STFAX_LINE;
-                               bcs->hw.isar.cmd = ctrl;
-                               bcs->hw.isar.mod = para;
-                               bcs->hw.isar.newmod = 0;
-                               bcs->hw.isar.newcmd = 0;
-                               bcs->hw.isar.try_mod = 3; 
-                       } else if ((bcs->hw.isar.state == STFAX_ACTIV) &&
-                               (bcs->hw.isar.cmd == PCTRL_CMD_FTH) &&
-                               (bcs->hw.isar.mod == para)) {
-                               ll_deliver_faxstat(bcs, ISDN_FAX_CLASS1_CONNECT);
-                       } else {
-                               bcs->hw.isar.newmod = para;
-                               bcs->hw.isar.newcmd = PCTRL_CMD_FTH;
-                               nom = 0;
-                               ctrl = PCTRL_CMD_ESC;
-                               bcs->hw.isar.state = STFAX_ESCAPE; 
-                       }
-                       break;
-               case ISDN_FAX_CLASS1_FRM:
-                       test_and_clear_bit(BC_FLG_FRH_WAIT, &bcs->Flag);
-                       if (bcs->hw.isar.state == STFAX_READY) {
-                               p1 = para;
-                               ctrl = PCTRL_CMD_FRM;
-                               nom = 1;
-                               bcs->hw.isar.state = STFAX_LINE;
-                               bcs->hw.isar.cmd = ctrl;
-                               bcs->hw.isar.mod = para;
-                               bcs->hw.isar.newmod = 0;
-                               bcs->hw.isar.newcmd = 0;
-                               bcs->hw.isar.try_mod = 3; 
-                       } else if ((bcs->hw.isar.state == STFAX_ACTIV) &&
-                               (bcs->hw.isar.cmd == PCTRL_CMD_FRM) &&
-                               (bcs->hw.isar.mod == para)) {
-                               ll_deliver_faxstat(bcs, ISDN_FAX_CLASS1_CONNECT);
-                       } else {
-                               bcs->hw.isar.newmod = para;
-                               bcs->hw.isar.newcmd = PCTRL_CMD_FRM;
-                               nom = 0;
-                               ctrl = PCTRL_CMD_ESC;
-                               bcs->hw.isar.state = STFAX_ESCAPE; 
-                       }
-                       break;
-               case ISDN_FAX_CLASS1_FRH:
-                       test_and_set_bit(BC_FLG_FRH_WAIT, &bcs->Flag);
-                       if (bcs->hw.isar.state == STFAX_READY) {
-                               p1 = para;
-                               ctrl = PCTRL_CMD_FRH;
-                               nom = 1;
-                               bcs->hw.isar.state = STFAX_LINE;
-                               bcs->hw.isar.cmd = ctrl;
-                               bcs->hw.isar.mod = para;
-                               bcs->hw.isar.newmod = 0;
-                               bcs->hw.isar.newcmd = 0;
-                               bcs->hw.isar.try_mod = 3; 
-                       } else if ((bcs->hw.isar.state == STFAX_ACTIV) &&
-                               (bcs->hw.isar.cmd == PCTRL_CMD_FRH) &&
-                               (bcs->hw.isar.mod == para)) {
-                               ll_deliver_faxstat(bcs, ISDN_FAX_CLASS1_CONNECT);
-                       } else {
-                               bcs->hw.isar.newmod = para;
-                               bcs->hw.isar.newcmd = PCTRL_CMD_FRH;
-                               nom = 0;
-                               ctrl = PCTRL_CMD_ESC;
-                               bcs->hw.isar.state = STFAX_ESCAPE; 
-                       }
-                       break;
-               case ISDN_FAXPUMP_HALT:
-                       bcs->hw.isar.state = STFAX_NULL;
+       switch (cmd) {
+       case ISDN_FAX_CLASS1_FTM:
+               test_and_clear_bit(BC_FLG_FRH_WAIT, &bcs->Flag);
+               if (bcs->hw.isar.state == STFAX_READY) {
+                       p1 = para;
+                       ctrl = PCTRL_CMD_FTM;
+                       nom = 1;
+                       bcs->hw.isar.state = STFAX_LINE;
+                       bcs->hw.isar.cmd = ctrl;
+                       bcs->hw.isar.mod = para;
+                       bcs->hw.isar.newmod = 0;
+                       bcs->hw.isar.newcmd = 0;
+                       bcs->hw.isar.try_mod = 3;
+               } else if ((bcs->hw.isar.state == STFAX_ACTIV) &&
+                          (bcs->hw.isar.cmd == PCTRL_CMD_FTM) &&
+                          (bcs->hw.isar.mod == para)) {
+                       ll_deliver_faxstat(bcs, ISDN_FAX_CLASS1_CONNECT);
+               } else {
+                       bcs->hw.isar.newmod = para;
+                       bcs->hw.isar.newcmd = PCTRL_CMD_FTM;
                        nom = 0;
-                       ctrl = PCTRL_CMD_HALT;
-                       break;
+                       ctrl = PCTRL_CMD_ESC;
+                       bcs->hw.isar.state = STFAX_ESCAPE;
+               }
+               break;
+       case ISDN_FAX_CLASS1_FTH:
+               test_and_clear_bit(BC_FLG_FRH_WAIT, &bcs->Flag);
+               if (bcs->hw.isar.state == STFAX_READY) {
+                       p1 = para;
+                       ctrl = PCTRL_CMD_FTH;
+                       nom = 1;
+                       bcs->hw.isar.state = STFAX_LINE;
+                       bcs->hw.isar.cmd = ctrl;
+                       bcs->hw.isar.mod = para;
+                       bcs->hw.isar.newmod = 0;
+                       bcs->hw.isar.newcmd = 0;
+                       bcs->hw.isar.try_mod = 3;
+               } else if ((bcs->hw.isar.state == STFAX_ACTIV) &&
+                          (bcs->hw.isar.cmd == PCTRL_CMD_FTH) &&
+                          (bcs->hw.isar.mod == para)) {
+                       ll_deliver_faxstat(bcs, ISDN_FAX_CLASS1_CONNECT);
+               } else {
+                       bcs->hw.isar.newmod = para;
+                       bcs->hw.isar.newcmd = PCTRL_CMD_FTH;
+                       nom = 0;
+                       ctrl = PCTRL_CMD_ESC;
+                       bcs->hw.isar.state = STFAX_ESCAPE;
+               }
+               break;
+       case ISDN_FAX_CLASS1_FRM:
+               test_and_clear_bit(BC_FLG_FRH_WAIT, &bcs->Flag);
+               if (bcs->hw.isar.state == STFAX_READY) {
+                       p1 = para;
+                       ctrl = PCTRL_CMD_FRM;
+                       nom = 1;
+                       bcs->hw.isar.state = STFAX_LINE;
+                       bcs->hw.isar.cmd = ctrl;
+                       bcs->hw.isar.mod = para;
+                       bcs->hw.isar.newmod = 0;
+                       bcs->hw.isar.newcmd = 0;
+                       bcs->hw.isar.try_mod = 3;
+               } else if ((bcs->hw.isar.state == STFAX_ACTIV) &&
+                          (bcs->hw.isar.cmd == PCTRL_CMD_FRM) &&
+                          (bcs->hw.isar.mod == para)) {
+                       ll_deliver_faxstat(bcs, ISDN_FAX_CLASS1_CONNECT);
+               } else {
+                       bcs->hw.isar.newmod = para;
+                       bcs->hw.isar.newcmd = PCTRL_CMD_FRM;
+                       nom = 0;
+                       ctrl = PCTRL_CMD_ESC;
+                       bcs->hw.isar.state = STFAX_ESCAPE;
+               }
+               break;
+       case ISDN_FAX_CLASS1_FRH:
+               test_and_set_bit(BC_FLG_FRH_WAIT, &bcs->Flag);
+               if (bcs->hw.isar.state == STFAX_READY) {
+                       p1 = para;
+                       ctrl = PCTRL_CMD_FRH;
+                       nom = 1;
+                       bcs->hw.isar.state = STFAX_LINE;
+                       bcs->hw.isar.cmd = ctrl;
+                       bcs->hw.isar.mod = para;
+                       bcs->hw.isar.newmod = 0;
+                       bcs->hw.isar.newcmd = 0;
+                       bcs->hw.isar.try_mod = 3;
+               } else if ((bcs->hw.isar.state == STFAX_ACTIV) &&
+                          (bcs->hw.isar.cmd == PCTRL_CMD_FRH) &&
+                          (bcs->hw.isar.mod == para)) {
+                       ll_deliver_faxstat(bcs, ISDN_FAX_CLASS1_CONNECT);
+               } else {
+                       bcs->hw.isar.newmod = para;
+                       bcs->hw.isar.newcmd = PCTRL_CMD_FRH;
+                       nom = 0;
+                       ctrl = PCTRL_CMD_ESC;
+                       bcs->hw.isar.state = STFAX_ESCAPE;
+               }
+               break;
+       case ISDN_FAXPUMP_HALT:
+               bcs->hw.isar.state = STFAX_NULL;
+               nom = 0;
+               ctrl = PCTRL_CMD_HALT;
+               break;
        }
        if (ctrl)
                sendmsg(cs, dps | ISAR_HIS_PUMPCTRL, ctrl, nom, &p1);
@@ -1572,10 +1572,10 @@ isar_setup(struct IsdnCardState *cs)
 {
        u_char msg;
        int i;
-       
+
        /* Dpath 1, 2 */
        msg = 61;
-       for (i=0; i<2; i++) {
+       for (i = 0; i < 2; i++) {
                /* Buffer Config */
                sendmsg(cs, (i ? ISAR_HIS_DPS2 : ISAR_HIS_DPS1) |
                        ISAR_HIS_P12CFG, 4, 1, &msg);
@@ -1596,93 +1596,93 @@ isar_l2l1(struct PStack *st, int pr, void *arg)
        u_long flags;
 
        switch (pr) {
-               case (PH_DATA | REQUEST):
-                       spin_lock_irqsave(&bcs->cs->lock, flags);
-                       if (bcs->tx_skb) {
-                               skb_queue_tail(&bcs->squeue, skb);
-                       } else {
-                               bcs->tx_skb = skb;
-                               test_and_set_bit(BC_FLG_BUSY, &bcs->Flag);
-                               if (bcs->cs->debug & L1_DEB_HSCX)
-                                       debugl1(bcs->cs, "DRQ set BC_FLG_BUSY");
-                               bcs->hw.isar.txcnt = 0;
-                               bcs->cs->BC_Send_Data(bcs);
-                       }
+       case (PH_DATA | REQUEST):
+               spin_lock_irqsave(&bcs->cs->lock, flags);
+               if (bcs->tx_skb) {
+                       skb_queue_tail(&bcs->squeue, skb);
+               } else {
+                       bcs->tx_skb = skb;
+                       test_and_set_bit(BC_FLG_BUSY, &bcs->Flag);
+                       if (bcs->cs->debug & L1_DEB_HSCX)
+                               debugl1(bcs->cs, "DRQ set BC_FLG_BUSY");
+                       bcs->hw.isar.txcnt = 0;
+                       bcs->cs->BC_Send_Data(bcs);
+               }
+               spin_unlock_irqrestore(&bcs->cs->lock, flags);
+               break;
+       case (PH_PULL | INDICATION):
+               spin_lock_irqsave(&bcs->cs->lock, flags);
+               if (bcs->tx_skb) {
+                       printk(KERN_WARNING "isar_l2l1: this shouldn't happen\n");
+               } else {
+                       test_and_set_bit(BC_FLG_BUSY, &bcs->Flag);
+                       if (bcs->cs->debug & L1_DEB_HSCX)
+                               debugl1(bcs->cs, "PUI set BC_FLG_BUSY");
+                       bcs->tx_skb = skb;
+                       bcs->hw.isar.txcnt = 0;
+                       bcs->cs->BC_Send_Data(bcs);
+               }
+               spin_unlock_irqrestore(&bcs->cs->lock, flags);
+               break;
+       case (PH_PULL | REQUEST):
+               if (!bcs->tx_skb) {
+                       test_and_clear_bit(FLG_L1_PULL_REQ, &st->l1.Flags);
+                       st->l1.l1l2(st, PH_PULL | CONFIRM, NULL);
+               } else
+                       test_and_set_bit(FLG_L1_PULL_REQ, &st->l1.Flags);
+               break;
+       case (PH_ACTIVATE | REQUEST):
+               spin_lock_irqsave(&bcs->cs->lock, flags);
+               test_and_set_bit(BC_FLG_ACTIV, &bcs->Flag);
+               bcs->hw.isar.conmsg[0] = 0;
+               if (test_bit(FLG_ORIG, &st->l2.flag))
+                       test_and_set_bit(BC_FLG_ORIG, &bcs->Flag);
+               else
+                       test_and_clear_bit(BC_FLG_ORIG, &bcs->Flag);
+               switch (st->l1.mode) {
+               case L1_MODE_TRANS:
+               case L1_MODE_HDLC:
+                       ret = modeisar(bcs, st->l1.mode, st->l1.bc);
                        spin_unlock_irqrestore(&bcs->cs->lock, flags);
+                       if (ret)
+                               l1_msg_b(st, PH_DEACTIVATE | REQUEST, arg);
+                       else
+                               l1_msg_b(st, PH_ACTIVATE | REQUEST, arg);
                        break;
-               case (PH_PULL | INDICATION):
-                       spin_lock_irqsave(&bcs->cs->lock, flags);
-                       if (bcs->tx_skb) {
-                               printk(KERN_WARNING "isar_l2l1: this shouldn't happen\n");
-                       } else {
-                               test_and_set_bit(BC_FLG_BUSY, &bcs->Flag);
-                               if (bcs->cs->debug & L1_DEB_HSCX)
-                                       debugl1(bcs->cs, "PUI set BC_FLG_BUSY");
-                               bcs->tx_skb = skb;
-                               bcs->hw.isar.txcnt = 0;
-                               bcs->cs->BC_Send_Data(bcs);
-                       }
+               case L1_MODE_V32:
+               case L1_MODE_FAX:
+                       ret = modeisar(bcs, st->l1.mode, st->l1.bc);
                        spin_unlock_irqrestore(&bcs->cs->lock, flags);
+                       if (ret)
+                               l1_msg_b(st, PH_DEACTIVATE | REQUEST, arg);
                        break;
-               case (PH_PULL | REQUEST):
-                       if (!bcs->tx_skb) {
-                               test_and_clear_bit(FLG_L1_PULL_REQ, &st->l1.Flags);
-                               st->l1.l1l2(st, PH_PULL | CONFIRM, NULL);
-                       } else
-                               test_and_set_bit(FLG_L1_PULL_REQ, &st->l1.Flags);
-                       break;
-               case (PH_ACTIVATE | REQUEST):
-                       spin_lock_irqsave(&bcs->cs->lock, flags);
-                       test_and_set_bit(BC_FLG_ACTIV, &bcs->Flag);
-                       bcs->hw.isar.conmsg[0] = 0;
-                       if (test_bit(FLG_ORIG, &st->l2.flag))
-                               test_and_set_bit(BC_FLG_ORIG, &bcs->Flag);
-                       else
-                               test_and_clear_bit(BC_FLG_ORIG, &bcs->Flag);
-                       switch(st->l1.mode) {
-                               case L1_MODE_TRANS:
-                               case L1_MODE_HDLC:
-                                       ret = modeisar(bcs, st->l1.mode, st->l1.bc);
-                                       spin_unlock_irqrestore(&bcs->cs->lock, flags);
-                                       if (ret)
-                                               l1_msg_b(st, PH_DEACTIVATE | REQUEST, arg);
-                                       else
-                                               l1_msg_b(st, PH_ACTIVATE | REQUEST, arg);
-                                       break;
-                               case L1_MODE_V32:
-                               case L1_MODE_FAX:
-                                       ret = modeisar(bcs, st->l1.mode, st->l1.bc);
-                                       spin_unlock_irqrestore(&bcs->cs->lock, flags);
-                                       if (ret)
-                                               l1_msg_b(st, PH_DEACTIVATE | REQUEST, arg);
-                                       break;
-                               default:
-                                       spin_unlock_irqrestore(&bcs->cs->lock, flags);
-                                       break;
-                       }
+               default:
+                       spin_unlock_irqrestore(&bcs->cs->lock, flags);
                        break;
-               case (PH_DEACTIVATE | REQUEST):
-                       l1_msg_b(st, pr, arg);
+               }
+               break;
+       case (PH_DEACTIVATE | REQUEST):
+               l1_msg_b(st, pr, arg);
+               break;
+       case (PH_DEACTIVATE | CONFIRM):
+               spin_lock_irqsave(&bcs->cs->lock, flags);
+               switch (st->l1.mode) {
+               case L1_MODE_TRANS:
+               case L1_MODE_HDLC:
+               case L1_MODE_V32:
                        break;
-               case (PH_DEACTIVATE | CONFIRM):
-                       spin_lock_irqsave(&bcs->cs->lock, flags);
-                       switch(st->l1.mode) {
-                               case L1_MODE_TRANS:
-                               case L1_MODE_HDLC:
-                               case L1_MODE_V32:
-                                       break;
-                               case L1_MODE_FAX:
-                                       isar_pump_cmd(bcs, ISDN_FAXPUMP_HALT, 0);
-                                       break;
-                       }
-                       test_and_clear_bit(BC_FLG_ACTIV, &bcs->Flag);
-                       test_and_clear_bit(BC_FLG_BUSY, &bcs->Flag);
-                       if (bcs->cs->debug & L1_DEB_HSCX)
-                               debugl1(bcs->cs, "PDAC clear BC_FLG_BUSY");
-                       modeisar(bcs, 0, st->l1.bc);
-                       spin_unlock_irqrestore(&bcs->cs->lock, flags);
-                       st->l1.l1l2(st, PH_DEACTIVATE | CONFIRM, NULL);
+               case L1_MODE_FAX:
+                       isar_pump_cmd(bcs, ISDN_FAXPUMP_HALT, 0);
                        break;
+               }
+               test_and_clear_bit(BC_FLG_ACTIV, &bcs->Flag);
+               test_and_clear_bit(BC_FLG_BUSY, &bcs->Flag);
+               if (bcs->cs->debug & L1_DEB_HSCX)
+                       debugl1(bcs->cs, "PDAC clear BC_FLG_BUSY");
+               modeisar(bcs, 0, st->l1.bc);
+               spin_unlock_irqrestore(&bcs->cs->lock, flags);
+               st->l1.l1l2(st, PH_DEACTIVATE | CONFIRM, NULL);
+               break;
        }
 }
 
@@ -1751,149 +1751,149 @@ isar_auxcmd(struct IsdnCardState *cs, isdn_ctrl *ic) {
        if (cs->debug & L1_DEB_HSCX)
                debugl1(cs, "isar_auxcmd cmd/ch %x/%ld", ic->command, ic->arg);
        switch (ic->command) {
-               case (ISDN_CMD_FAXCMD):
-                       bcs = cs->channel[ic->arg].bcs;
-                       if (cs->debug & L1_DEB_HSCX)
-                               debugl1(cs, "isar_auxcmd cmd/subcmd %d/%d",
-                                       ic->parm.aux.cmd, ic->parm.aux.subcmd);
-                       switch(ic->parm.aux.cmd) {
-                               case ISDN_FAX_CLASS1_CTRL:
-                                       if (ic->parm.aux.subcmd == ETX)
-                                               test_and_set_bit(BC_FLG_DLEETX,
-                                                       &bcs->Flag);
-                                       break;
-                               case ISDN_FAX_CLASS1_FTS:
-                                       if (ic->parm.aux.subcmd == AT_QUERY) {
+       case (ISDN_CMD_FAXCMD):
+               bcs = cs->channel[ic->arg].bcs;
+               if (cs->debug & L1_DEB_HSCX)
+                       debugl1(cs, "isar_auxcmd cmd/subcmd %d/%d",
+                               ic->parm.aux.cmd, ic->parm.aux.subcmd);
+               switch (ic->parm.aux.cmd) {
+               case ISDN_FAX_CLASS1_CTRL:
+                       if (ic->parm.aux.subcmd == ETX)
+                               test_and_set_bit(BC_FLG_DLEETX,
+                                                &bcs->Flag);
+                       break;
+               case ISDN_FAX_CLASS1_FTS:
+                       if (ic->parm.aux.subcmd == AT_QUERY) {
+                               ic->command = ISDN_STAT_FAXIND;
+                               ic->parm.aux.cmd = ISDN_FAX_CLASS1_OK;
+                               cs->iif.statcallb(ic);
+                               return (0);
+                       } else if (ic->parm.aux.subcmd == AT_EQ_QUERY) {
+                               strcpy(ic->parm.aux.para, "0-255");
+                               ic->command = ISDN_STAT_FAXIND;
+                               ic->parm.aux.cmd = ISDN_FAX_CLASS1_QUERY;
+                               cs->iif.statcallb(ic);
+                               return (0);
+                       } else if (ic->parm.aux.subcmd == AT_EQ_VALUE) {
+                               if (cs->debug & L1_DEB_HSCX)
+                                       debugl1(cs, "isar_auxcmd %s=%d",
+                                               FC1_CMD[ic->parm.aux.cmd], ic->parm.aux.para[0]);
+                               if (bcs->hw.isar.state == STFAX_READY) {
+                                       if (!ic->parm.aux.para[0]) {
                                                ic->command = ISDN_STAT_FAXIND;
                                                ic->parm.aux.cmd = ISDN_FAX_CLASS1_OK;
                                                cs->iif.statcallb(ic);
-                                               return(0);
-                                       } else if (ic->parm.aux.subcmd == AT_EQ_QUERY) {
-                                               strcpy(ic->parm.aux.para, "0-255");
-                                               ic->command = ISDN_STAT_FAXIND;
-                                               ic->parm.aux.cmd = ISDN_FAX_CLASS1_QUERY;
-                                               cs->iif.statcallb(ic);
-                                               return(0);
-                                       } else if (ic->parm.aux.subcmd == AT_EQ_VALUE) {
-                                               if (cs->debug & L1_DEB_HSCX)
-                                                       debugl1(cs, "isar_auxcmd %s=%d",
-                                                               FC1_CMD[ic->parm.aux.cmd], ic->parm.aux.para[0]);
-                                               if (bcs->hw.isar.state == STFAX_READY) {
-                                                       if (! ic->parm.aux.para[0]) {
-                                                               ic->command = ISDN_STAT_FAXIND;
-                                                               ic->parm.aux.cmd = ISDN_FAX_CLASS1_OK;
-                                                               cs->iif.statcallb(ic);
-                                                               return(0);
-                                                       }
-                                                       if (! test_and_set_bit(BC_FLG_FTI_RUN, &bcs->Flag)) {
-                                                               /* n*10 ms */
-                                                               bcs->hw.isar.ftimer.expires =
-                                                                       jiffies + ((ic->parm.aux.para[0] * 10 * HZ)/1000);
-                                                               test_and_set_bit(BC_FLG_FTI_FTS, &bcs->Flag);
-                                                               add_timer(&bcs->hw.isar.ftimer);
-                                                               return(0);
-                                                       } else {
-                                                               if (cs->debug)
-                                                                       debugl1(cs, "isar FTS=%d and FTI busy",
-                                                                               ic->parm.aux.para[0]);
-                                                       }
-                                               } else {
-                                                       if (cs->debug)
-                                                               debugl1(cs, "isar FTS=%d and isar.state not ready(%x)",
-                                                                       ic->parm.aux.para[0],bcs->hw.isar.state);
-                                               }
-                                               ic->command = ISDN_STAT_FAXIND;
-                                               ic->parm.aux.cmd = ISDN_FAX_CLASS1_ERROR;
-                                               cs->iif.statcallb(ic);
+                                               return (0);
                                        }
-                                       break;
-                               case ISDN_FAX_CLASS1_FRM:
-                               case ISDN_FAX_CLASS1_FRH:
-                               case ISDN_FAX_CLASS1_FTM:
-                               case ISDN_FAX_CLASS1_FTH:
-                                       if (ic->parm.aux.subcmd == AT_QUERY) {
-                                               sprintf(ic->parm.aux.para,
-                                                       "%d", bcs->hw.isar.mod);
-                                               ic->command = ISDN_STAT_FAXIND;
-                                               ic->parm.aux.cmd = ISDN_FAX_CLASS1_QUERY;
-                                               cs->iif.statcallb(ic);
-                                               return(0);
-                                       } else if (ic->parm.aux.subcmd == AT_EQ_QUERY) {
-                                               char *p = ic->parm.aux.para;
-                                               for(i=0;i<FAXMODCNT;i++)
-                                                       if ((1<<i) & modmask)
-                                                               p += sprintf(p, "%d,", faxmodulation[i]);
-                                               p--;
-                                               *p=0;
-                                               ic->command = ISDN_STAT_FAXIND;
-                                               ic->parm.aux.cmd = ISDN_FAX_CLASS1_QUERY;
-                                               cs->iif.statcallb(ic);
-                                               return(0);
-                                       } else if (ic->parm.aux.subcmd == AT_EQ_VALUE) {
-                                               if (cs->debug & L1_DEB_HSCX)
-                                                       debugl1(cs, "isar_auxcmd %s=%d",
-                                                               FC1_CMD[ic->parm.aux.cmd], ic->parm.aux.para[0]);
-                                               for(i=0;i<FAXMODCNT;i++)
-                                                       if (faxmodulation[i]==ic->parm.aux.para[0])
-                                                               break;
-                                               if ((i < FAXMODCNT) && ((1<<i) & modmask) && 
-                                                       test_bit(BC_FLG_INIT, &bcs->Flag)) {
-                                                       isar_pump_cmd(bcs,
-                                                               ic->parm.aux.cmd,
+                                       if (!test_and_set_bit(BC_FLG_FTI_RUN, &bcs->Flag)) {
+                                               /* n*10 ms */
+                                               bcs->hw.isar.ftimer.expires =
+                                                       jiffies + ((ic->parm.aux.para[0] * 10 * HZ) / 1000);
+                                               test_and_set_bit(BC_FLG_FTI_FTS, &bcs->Flag);
+                                               add_timer(&bcs->hw.isar.ftimer);
+                                               return (0);
+                                       } else {
+                                               if (cs->debug)
+                                                       debugl1(cs, "isar FTS=%d and FTI busy",
                                                                ic->parm.aux.para[0]);
-                                                       return(0);
-                                               }
                                        }
-                                       /* wrong modulation or not activ */
-                                       /* fall through */
-                               default:
-                                       ic->command = ISDN_STAT_FAXIND;
-                                       ic->parm.aux.cmd = ISDN_FAX_CLASS1_ERROR;
-                                       cs->iif.statcallb(ic);
+                               } else {
+                                       if (cs->debug)
+                                               debugl1(cs, "isar FTS=%d and isar.state not ready(%x)",
+                                                       ic->parm.aux.para[0], bcs->hw.isar.state);
+                               }
+                               ic->command = ISDN_STAT_FAXIND;
+                               ic->parm.aux.cmd = ISDN_FAX_CLASS1_ERROR;
+                               cs->iif.statcallb(ic);
                        }
                        break;
-               case (ISDN_CMD_IOCTL):
-                       switch (ic->arg) {
-                               case 9: /* load firmware */
-                                       features = ISDN_FEATURE_L2_MODEM |
-                                               ISDN_FEATURE_L2_FAX |
-                                               ISDN_FEATURE_L3_FCLASS1;
-                                       memcpy(&adr, ic->parm.num, sizeof(ulong));
-                                       if (isar_load_firmware(cs, (u_char __user *)adr))
-                                               return(1);
-                                       else 
-                                               ll_run(cs, features);
-                                       break;
-                               case 20:
-                                       features = *(unsigned int *) ic->parm.num;
-                                       printk(KERN_DEBUG "HiSax: max modulation old(%04x) new(%04x)\n",
-                                               modmask, features);
-                                       modmask = features;
-                                       break;
-                               case 21:
-                                       features = *(unsigned int *) ic->parm.num;
-                                       printk(KERN_DEBUG "HiSax: FRM extra delay old(%d) new(%d) ms\n",
-                                               frm_extra_delay, features);
-                                       if (features >= 0)
-                                               frm_extra_delay = features;
-                                       break;
-                               case 22:
-                                       features = *(unsigned int *) ic->parm.num;
-                                       printk(KERN_DEBUG "HiSax: TOA old(%d) new(%d) db\n",
-                                               para_TOA, features);
-                                       if (features >= 0 && features < 32)
-                                               para_TOA = features;
-                                       break;
-                               default:
-                                       printk(KERN_DEBUG "HiSax: invalid ioctl %d\n",
-                                              (int) ic->arg);
-                                       return(-EINVAL);
+               case ISDN_FAX_CLASS1_FRM:
+               case ISDN_FAX_CLASS1_FRH:
+               case ISDN_FAX_CLASS1_FTM:
+               case ISDN_FAX_CLASS1_FTH:
+                       if (ic->parm.aux.subcmd == AT_QUERY) {
+                               sprintf(ic->parm.aux.para,
+                                       "%d", bcs->hw.isar.mod);
+                               ic->command = ISDN_STAT_FAXIND;
+                               ic->parm.aux.cmd = ISDN_FAX_CLASS1_QUERY;
+                               cs->iif.statcallb(ic);
+                               return (0);
+                       } else if (ic->parm.aux.subcmd == AT_EQ_QUERY) {
+                               char *p = ic->parm.aux.para;
+                               for (i = 0; i < FAXMODCNT; i++)
+                                       if ((1 << i) & modmask)
+                                               p += sprintf(p, "%d,", faxmodulation[i]);
+                               p--;
+                               *p = 0;
+                               ic->command = ISDN_STAT_FAXIND;
+                               ic->parm.aux.cmd = ISDN_FAX_CLASS1_QUERY;
+                               cs->iif.statcallb(ic);
+                               return (0);
+                       } else if (ic->parm.aux.subcmd == AT_EQ_VALUE) {
+                               if (cs->debug & L1_DEB_HSCX)
+                                       debugl1(cs, "isar_auxcmd %s=%d",
+                                               FC1_CMD[ic->parm.aux.cmd], ic->parm.aux.para[0]);
+                               for (i = 0; i < FAXMODCNT; i++)
+                                       if (faxmodulation[i] == ic->parm.aux.para[0])
+                                               break;
+                               if ((i < FAXMODCNT) && ((1 << i) & modmask) &&
+                                   test_bit(BC_FLG_INIT, &bcs->Flag)) {
+                                       isar_pump_cmd(bcs,
+                                                     ic->parm.aux.cmd,
+                                                     ic->parm.aux.para[0]);
+                                       return (0);
+                               }
                        }
+                       /* wrong modulation or not activ */
+                       /* fall through */
+               default:
+                       ic->command = ISDN_STAT_FAXIND;
+                       ic->parm.aux.cmd = ISDN_FAX_CLASS1_ERROR;
+                       cs->iif.statcallb(ic);
+               }
+               break;
+       case (ISDN_CMD_IOCTL):
+               switch (ic->arg) {
+               case 9: /* load firmware */
+                       features = ISDN_FEATURE_L2_MODEM |
+                               ISDN_FEATURE_L2_FAX |
+                               ISDN_FEATURE_L3_FCLASS1;
+                       memcpy(&adr, ic->parm.num, sizeof(ulong));
+                       if (isar_load_firmware(cs, (u_char __user *)adr))
+                               return (1);
+                       else
+                               ll_run(cs, features);
+                       break;
+               case 20:
+                       features = *(unsigned int *) ic->parm.num;
+                       printk(KERN_DEBUG "HiSax: max modulation old(%04x) new(%04x)\n",
+                              modmask, features);
+                       modmask = features;
+                       break;
+               case 21:
+                       features = *(unsigned int *) ic->parm.num;
+                       printk(KERN_DEBUG "HiSax: FRM extra delay old(%d) new(%d) ms\n",
+                              frm_extra_delay, features);
+                       if (features >= 0)
+                               frm_extra_delay = features;
+                       break;
+               case 22:
+                       features = *(unsigned int *) ic->parm.num;
+                       printk(KERN_DEBUG "HiSax: TOA old(%d) new(%d) db\n",
+                              para_TOA, features);
+                       if (features >= 0 && features < 32)
+                               para_TOA = features;
                        break;
                default:
-                       return(-EINVAL);
+                       printk(KERN_DEBUG "HiSax: invalid ioctl %d\n",
+                              (int) ic->arg);
+                       return (-EINVAL);
+               }
+               break;
+       default:
+               return (-EINVAL);
        }
-       return(0);
+       return (0);
 }
 
 void initisar(struct IsdnCardState *cs)
index bf76765..0f4d101 100644 (file)
@@ -4,12 +4,12 @@
  *
  * Author       Karsten Keil
  * Copyright    by Karsten Keil      <keil@isdn4linux.de>
- * 
+ *
  * This software may be used and distributed according to the terms
  * of the GNU General Public License, incorporated herein by reference.
  *
  */
+
 #define ISAR_IRQMSK    0x04
 #define ISAR_IRQSTA    0x04
 #define ISAR_IRQBIT    0x75
@@ -21,7 +21,7 @@
 #define ISAR_HIA       0x50
 #define ISAR_MBOX      0x4c
 #define ISAR_WADR      0x4a
-#define ISAR_RADR      0x48 
+#define ISAR_RADR      0x48
 
 #define ISAR_HIS_VNR           0x14
 #define ISAR_HIS_DKEY          0x02
@@ -32,9 +32,9 @@
 #define ISAR_HIS_TIMERIRQ      0x25
 #define ISAR_HIS_P0CFG         0x3c
 #define ISAR_HIS_P12CFG                0x24
-#define ISAR_HIS_SARTCFG       0x25    
-#define ISAR_HIS_PUMPCFG       0x26    
-#define ISAR_HIS_PUMPCTRL      0x2a    
+#define ISAR_HIS_SARTCFG       0x25
+#define ISAR_HIS_PUMPCFG       0x26
+#define ISAR_HIS_PUMPCTRL      0x2a
 #define ISAR_HIS_IOM2CFG       0x27
 #define ISAR_HIS_IOM2REQ       0x07
 #define ISAR_HIS_IOM2CTRL      0x2b
@@ -43,7 +43,7 @@
 #define ISAR_HIS_SDATA         0x20
 #define ISAR_HIS_DPS1          0x40
 #define ISAR_HIS_DPS2          0x80
-#define SET_DPS(x)             ((x<<6) & 0xc0)
+#define SET_DPS(x)             ((x << 6) & 0xc0)
 
 #define ISAR_CMD_TIMERIRQ_OFF  0x20
 #define ISAR_CMD_TIMERIRQ_ON   0x21
index d5eeacf..8000957 100644 (file)
@@ -5,7 +5,7 @@
  * Author       Karsten Keil
  *              based on the teles driver from Jan den Ouden
  * Copyright    by Karsten Keil      <keil@isdn4linux.de>
- * 
+ *
  * This software may be used and distributed according to the terms
  * of the GNU General Public License, incorporated herein by reference.
  *
@@ -40,7 +40,7 @@ enum {
        ST_L1_F8,
 };
 
-#define L1S_STATE_COUNT (ST_L1_F8+1)
+#define L1S_STATE_COUNT (ST_L1_F8 + 1)
 
 static char *strL1SState[] =
 {
@@ -65,7 +65,7 @@ enum {
        ST_L1_TRANS,
 };
 
-#define L1U_STATE_COUNT (ST_L1_TRANS+1)
+#define L1U_STATE_COUNT (ST_L1_TRANS + 1)
 
 static char *strL1UState[] =
 {
@@ -83,7 +83,7 @@ enum {
        ST_L1_ACTIV,
 };
 
-#define L1B_STATE_COUNT (ST_L1_ACTIV+1)
+#define L1B_STATE_COUNT (ST_L1_ACTIV + 1)
 
 static char *strL1BState[] =
 {
@@ -100,7 +100,7 @@ enum {
        EV_DEACT_CNF,
        EV_DEACT_IND,
        EV_POWER_UP,
-       EV_RSYNC_IND, 
+       EV_RSYNC_IND,
        EV_INFO2_IND,
        EV_INFO4_IND,
        EV_TIMER_DEACT,
@@ -118,7 +118,7 @@ static char *strL1Event[] =
        "EV_DEACT_CNF",
        "EV_DEACT_IND",
        "EV_POWER_UP",
-       "EV_RSYNC_IND", 
+       "EV_RSYNC_IND",
        "EV_INFO2_IND",
        "EV_INFO4_IND",
        "EV_TIMER_DEACT",
@@ -131,7 +131,7 @@ debugl1(struct IsdnCardState *cs, char *fmt, ...)
 {
        va_list args;
        char tmp[8];
-       
+
        va_start(args, fmt);
        sprintf(tmp, "Card%d ", cs->cardnr + 1);
        VHiSax_putstatus(cs, tmp, fmt, args);
@@ -145,7 +145,7 @@ l1m_debug(struct FsmInst *fi, char *fmt, ...)
        struct PStack *st = fi->userdata;
        struct IsdnCardState *cs = st->l1.hardware;
        char tmp[8];
-       
+
        va_start(args, fmt);
        sprintf(tmp, "Card%d ", cs->cardnr + 1);
        VHiSax_putstatus(cs, tmp, fmt, args);
@@ -209,19 +209,19 @@ DChannel_proc_rcv(struct IsdnCardState *cs)
 
        if (stptr)
                if (test_bit(FLG_L1_ACTTIMER, &stptr->l1.Flags))
-                       FsmEvent(&stptr->l1.l1m, EV_TIMER_ACT, NULL);   
+                       FsmEvent(&stptr->l1.l1m, EV_TIMER_ACT, NULL);
        while ((skb = skb_dequeue(&cs->rq))) {
 #ifdef L2FRAME_DEBUG           /* psa */
                if (cs->debug & L1_DEB_LAPD)
                        Logl2Frame(cs, skb, "PH_DATA", 1);
 #endif
                stptr = cs->stlist;
-               if (skb->len<3) {
-                       debugl1(cs, "D-channel frame too short(%d)",skb->len);
+               if (skb->len < 3) {
+                       debugl1(cs, "D-channel frame too short(%d)", skb->len);
                        dev_kfree_skb(skb);
                        return;
                }
-               if ((skb->data[0] & 1) || !(skb->data[1] &1)) {
+               if ((skb->data[0] & 1) || !(skb->data[1] & 1)) {
                        debugl1(cs, "D-channel frame wrong EA0/EA1");
                        dev_kfree_skb(skb);
                        return;
@@ -378,60 +378,60 @@ static char *
 l2cmd(u_char cmd)
 {
        switch (cmd & ~0x10) {
-               case 1:
-                       return "RR";
-               case 5:
-                       return "RNR";
-               case 9:
-                       return "REJ";
-               case 0x6f:
-                       return "SABME";
-               case 0x0f:
-                       return "DM";
-               case 3:
-                       return "UI";
-               case 0x43:
-                       return "DISC";
-               case 0x63:
-                       return "UA";
-               case 0x87:
-                       return "FRMR";
-               case 0xaf:
-                       return "XID";
-               default:
-                       if (!(cmd & 1))
-                               return "I";
-                       else
-                               return "invalid command";
+       case 1:
+               return "RR";
+       case 5:
+               return "RNR";
+       case 9:
+               return "REJ";
+       case 0x6f:
+               return "SABME";
+       case 0x0f:
+               return "DM";
+       case 3:
+               return "UI";
+       case 0x43:
+               return "DISC";
+       case 0x63:
+               return "UA";
+       case 0x87:
+               return "FRMR";
+       case 0xaf:
+               return "XID";
+       default:
+               if (!(cmd & 1))
+                       return "I";
+               else
+                       return "invalid command";
        }
 }
 
 static char tmpdeb[32];
 
 static char *
-l2frames(u_char * ptr)
+l2frames(u_char *ptr)
 {
        switch (ptr[2] & ~0x10) {
-               case 1:
-               case 5:
-               case 9:
-                       sprintf(tmpdeb, "%s[%d](nr %d)", l2cmd(ptr[2]), ptr[3] & 1, ptr[3] >> 1);
-                       break;
-               case 0x6f:
-               case 0x0f:
-               case 3:
-               case 0x43:
-               case 0x63:
-               case 0x87:
-               case 0xaf:
-                       sprintf(tmpdeb, "%s[%d]", l2cmd(ptr[2]), (ptr[2] & 0x10) >> 4);
+       case 1:
+       case 5:
+       case 9:
+               sprintf(tmpdeb, "%s[%d](nr %d)", l2cmd(ptr[2]), ptr[3] & 1, ptr[3] >> 1);
+               break;
+       case 0x6f:
+       case 0x0f:
+       case 3:
+       case 0x43:
+       case 0x63:
+       case 0x87:
+       case 0xaf:
+               sprintf(tmpdeb, "%s[%d]", l2cmd(ptr[2]), (ptr[2] & 0x10) >> 4);
+               break;
+       default:
+               if (!(ptr[2] & 1)) {
+                       sprintf(tmpdeb, "I[%d](ns %d, nr %d)", ptr[3] & 1, ptr[2] >> 1, ptr[3] >> 1);
                        break;
-               default:
-                       if (!(ptr[2] & 1)) {
-                               sprintf(tmpdeb, "I[%d](ns %d, nr %d)", ptr[3] & 1, ptr[2] >> 1, ptr[3] >> 1);
-                               break;
-                       } else
-                               return "invalid command";
+               } else
+                       return "invalid command";
        }
 
 
@@ -547,24 +547,24 @@ l1_timer3(struct FsmInst *fi, int event, void *arg)
 {
        struct PStack *st = fi->userdata;
 
-       test_and_clear_bit(FLG_L1_T3RUN, &st->l1.Flags);        
+       test_and_clear_bit(FLG_L1_T3RUN, &st->l1.Flags);
        if (test_and_clear_bit(FLG_L1_ACTIVATING, &st->l1.Flags))
                L1deactivated(st->l1.hardware);
 
 #ifdef HISAX_UINTERFACE
        if (!test_bit(FLG_L1_UINT, &st->l1.Flags))
 #endif
-       if (st->l1.l1m.state != ST_L1_F6) {
-               FsmChangeState(fi, ST_L1_F3);
-               st->l1.l1hw(st, HW_ENABLE | REQUEST, NULL);
-       }
+               if (st->l1.l1m.state != ST_L1_F6) {
+                       FsmChangeState(fi, ST_L1_F3);
+                       st->l1.l1hw(st, HW_ENABLE | REQUEST, NULL);
+               }
 }
 
 static void
 l1_timer_act(struct FsmInst *fi, int event, void *arg)
 {
        struct PStack *st = fi->userdata;
-       
+
        test_and_clear_bit(FLG_L1_ACTTIMER, &st->l1.Flags);
        test_and_set_bit(FLG_L1_ACTIVATED, &st->l1.Flags);
        L1activated(st->l1.hardware);
@@ -574,7 +574,7 @@ static void
 l1_timer_deact(struct FsmInst *fi, int event, void *arg)
 {
        struct PStack *st = fi->userdata;
-       
+
        test_and_clear_bit(FLG_L1_DEACTTIMER, &st->l1.Flags);
        test_and_clear_bit(FLG_L1_ACTIVATED, &st->l1.Flags);
        L1deactivated(st->l1.hardware);
@@ -585,7 +585,7 @@ static void
 l1_activate_s(struct FsmInst *fi, int event, void *arg)
 {
        struct PStack *st = fi->userdata;
-                
+
        st->l1.l1hw(st, HW_RESET | REQUEST, NULL);
 }
 
@@ -679,7 +679,7 @@ static void
 l1_activate_u(struct FsmInst *fi, int event, void *arg)
 {
        struct PStack *st = fi->userdata;
-                
+
        st->l1.l1hw(st, HW_INFO1 | REQUEST, NULL);
 }
 
@@ -751,7 +751,7 @@ static struct FsmNode L1BFnList[] __initdata =
        {ST_L1_WAIT_DEACT, EV_TIMER_DEACT, l1b_timer_deact},
 };
 
-int __init 
+int __init
 Isdnl1New(void)
 {
        int retval;
@@ -803,35 +803,35 @@ dch_l2l1(struct PStack *st, int pr, void *arg)
        struct IsdnCardState *cs = (struct IsdnCardState *) st->l1.hardware;
 
        switch (pr) {
-               case (PH_DATA | REQUEST):
-               case (PH_PULL | REQUEST):
-               case (PH_PULL |INDICATION):
-                       st->l1.l1hw(st, pr, arg);
-                       break;
-               case (PH_ACTIVATE | REQUEST):
-                       if (cs->debug)
-                               debugl1(cs, "PH_ACTIVATE_REQ %s",
-                                       st->l1.l1m.fsm->strState[st->l1.l1m.state]);
-                       if (test_bit(FLG_L1_ACTIVATED, &st->l1.Flags))
-                               st->l1.l1l2(st, PH_ACTIVATE | CONFIRM, NULL);
-                       else {
-                               test_and_set_bit(FLG_L1_ACTIVATING, &st->l1.Flags);
-                               FsmEvent(&st->l1.l1m, EV_PH_ACTIVATE, arg);
-                       }
-                       break;
-               case (PH_TESTLOOP | REQUEST):
-                       if (1 & (long) arg)
-                               debugl1(cs, "PH_TEST_LOOP B1");
-                       if (2 & (long) arg)
-                               debugl1(cs, "PH_TEST_LOOP B2");
-                       if (!(3 & (long) arg))
-                               debugl1(cs, "PH_TEST_LOOP DISABLED");
-                       st->l1.l1hw(st, HW_TESTLOOP | REQUEST, arg);
-                       break;
-               default:
-                       if (cs->debug)
-                               debugl1(cs, "dch_l2l1 msg %04X unhandled", pr);
-                       break;
+       case (PH_DATA | REQUEST):
+       case (PH_PULL | REQUEST):
+       case (PH_PULL | INDICATION):
+               st->l1.l1hw(st, pr, arg);
+               break;
+       case (PH_ACTIVATE | REQUEST):
+               if (cs->debug)
+                       debugl1(cs, "PH_ACTIVATE_REQ %s",
+                               st->l1.l1m.fsm->strState[st->l1.l1m.state]);
+               if (test_bit(FLG_L1_ACTIVATED, &st->l1.Flags))
+                       st->l1.l1l2(st, PH_ACTIVATE | CONFIRM, NULL);
+               else {
+                       test_and_set_bit(FLG_L1_ACTIVATING, &st->l1.Flags);
+                       FsmEvent(&st->l1.l1m, EV_PH_ACTIVATE, arg);
+               }
+               break;
+       case (PH_TESTLOOP | REQUEST):
+               if (1 & (long) arg)
+                       debugl1(cs, "PH_TEST_LOOP B1");
+               if (2 & (long) arg)
+                       debugl1(cs, "PH_TEST_LOOP B2");
+               if (!(3 & (long) arg))
+                       debugl1(cs, "PH_TEST_LOOP DISABLED");
+               st->l1.l1hw(st, HW_TESTLOOP | REQUEST, arg);
+               break;
+       default:
+               if (cs->debug)
+                       debugl1(cs, "dch_l2l1 msg %04X unhandled", pr);
+               break;
        }
 }
 
@@ -840,35 +840,35 @@ l1_msg(struct IsdnCardState *cs, int pr, void *arg) {
        struct PStack *st;
 
        st = cs->stlist;
-       
+
        while (st) {
-               switch(pr) {
-                       case (HW_RESET | INDICATION):
-                               FsmEvent(&st->l1.l1m, EV_RESET_IND, arg);
-                               break;
-                       case (HW_DEACTIVATE | CONFIRM):
-                               FsmEvent(&st->l1.l1m, EV_DEACT_CNF, arg);
-                               break;
-                       case (HW_DEACTIVATE | INDICATION):
-                               FsmEvent(&st->l1.l1m, EV_DEACT_IND, arg);
-                               break;
-                       case (HW_POWERUP | CONFIRM):
-                               FsmEvent(&st->l1.l1m, EV_POWER_UP, arg);
-                               break;
-                       case (HW_RSYNC | INDICATION):
-                               FsmEvent(&st->l1.l1m, EV_RSYNC_IND, arg);
-                               break;
-                       case (HW_INFO2 | INDICATION):
-                               FsmEvent(&st->l1.l1m, EV_INFO2_IND, arg);
-                               break;
-                       case (HW_INFO4_P8 | INDICATION):
-                       case (HW_INFO4_P10 | INDICATION):
-                               FsmEvent(&st->l1.l1m, EV_INFO4_IND, arg);
-                               break;
-                       default:
-                               if (cs->debug)
-                                       debugl1(cs, "l1msg %04X unhandled", pr);
-                               break;
+               switch (pr) {
+               case (HW_RESET | INDICATION):
+                       FsmEvent(&st->l1.l1m, EV_RESET_IND, arg);
+                       break;
+               case (HW_DEACTIVATE | CONFIRM):
+                       FsmEvent(&st->l1.l1m, EV_DEACT_CNF, arg);
+                       break;
+               case (HW_DEACTIVATE | INDICATION):
+                       FsmEvent(&st->l1.l1m, EV_DEACT_IND, arg);
+                       break;
+               case (HW_POWERUP | CONFIRM):
+                       FsmEvent(&st->l1.l1m, EV_POWER_UP, arg);
+                       break;
+               case (HW_RSYNC | INDICATION):
+                       FsmEvent(&st->l1.l1m, EV_RSYNC_IND, arg);
+                       break;
+               case (HW_INFO2 | INDICATION):
+                       FsmEvent(&st->l1.l1m, EV_INFO2_IND, arg);
+                       break;
+               case (HW_INFO4_P8 | INDICATION):
+               case (HW_INFO4_P10 | INDICATION):
+                       FsmEvent(&st->l1.l1m, EV_INFO4_IND, arg);
+                       break;
+               default:
+                       if (cs->debug)
+                               debugl1(cs, "l1msg %04X unhandled", pr);
+                       break;
                }
                st = st->next;
        }
@@ -876,13 +876,13 @@ l1_msg(struct IsdnCardState *cs, int pr, void *arg) {
 
 void
 l1_msg_b(struct PStack *st, int pr, void *arg) {
-       switch(pr) {
-               case (PH_ACTIVATE | REQUEST):
-                       FsmEvent(&st->l1.l1m, EV_PH_ACTIVATE, NULL);
-                       break;
-               case (PH_DEACTIVATE | REQUEST):
-                       FsmEvent(&st->l1.l1m, EV_PH_DEACTIVATE, NULL);
-                       break;
+       switch (pr) {
+       case (PH_ACTIVATE | REQUEST):
+               FsmEvent(&st->l1.l1m, EV_PH_ACTIVATE, NULL);
+               break;
+       case (PH_DEACTIVATE | REQUEST):
+               FsmEvent(&st->l1.l1m, EV_PH_DEACTIVATE, NULL);
+               break;
        }
 }
 
index cfff0c4..18accb0 100644 (file)
@@ -3,7 +3,7 @@
  * Author       Karsten Keil
  *              based on the teles driver from Jan den Ouden
  * Copyright    by Karsten Keil      <keil@isdn4linux.de>
- * 
+ *
  * This software may be used and distributed according to the terms
  * of the GNU General Public License, incorporated herein by reference.
  *
@@ -37,7 +37,7 @@ enum {
        ST_L2_8,
 };
 
-#define L2_STATE_COUNT (ST_L2_8+1)
+#define L2_STATE_COUNT (ST_L2_8 + 1)
 
 static char *strL2State[] =
 {
@@ -76,7 +76,7 @@ enum {
        EV_L2_FRAME_ERROR,
 };
 
-#define L2_EVENT_COUNT (EV_L2_FRAME_ERROR+1)
+#define L2_EVENT_COUNT (EV_L2_FRAME_ERROR + 1)
 
 static char *strL2Event[] =
 {
@@ -155,7 +155,7 @@ ReleaseWin(struct Layer2 *l2)
 {
        int cnt;
 
-       if((cnt = freewin1(l2)))
+       if ((cnt = freewin1(l2)))
                printk(KERN_WARNING "isdl2 freed %d skbuffs in release\n", cnt);
 }
 
@@ -164,7 +164,7 @@ cansend(struct PStack *st)
 {
        unsigned int p1;
 
-       if(test_bit(FLG_MOD128, &st->l2.flag))
+       if (test_bit(FLG_MOD128, &st->l2.flag))
                p1 = (st->l2.vs - st->l2.va) % 128;
        else
                p1 = (st->l2.vs - st->l2.va) % 8;
@@ -194,7 +194,7 @@ l2addrsize(struct Layer2 *l2)
 }
 
 static int
-sethdraddr(struct Layer2 *l2, u_char * header, int rsp)
+sethdraddr(struct Layer2 *l2, u_char *header, int rsp)
 {
        u_char *ptr = header;
        int crbit = rsp;
@@ -226,41 +226,41 @@ enqueue_super(struct PStack *st,
 #define enqueue_ui(a, b) enqueue_super(a, b)
 
 static inline int
-IsUI(u_char * data)
+IsUI(u_char *data)
 {
        return ((data[0] & 0xef) == UI);
 }
 
 static inline int
-IsUA(u_char * data)
+IsUA(u_char *data)
 {
        return ((data[0] & 0xef) == UA);
 }
 
 static inline int
-IsDM(u_char * data)
+IsDM(u_char *data)
 {
        return ((data[0] & 0xef) == DM);
 }
 
 static inline int
-IsDISC(u_char * data)
+IsDISC(u_char *data)
 {
        return ((data[0] & 0xef) == DISC);
 }
 
 static inline int
-IsSFrame(u_char * data, struct PStack *st)
+IsSFrame(u_char *data, struct PStack *st)
 {
        register u_char d = *data;
-       
+
        if (!test_bit(FLG_MOD128, &st->l2.flag))
                d &= 0xf;
-       return(((d & 0xf3) == 1) && ((d & 0x0c) != 0x0c));
+       return (((d & 0xf3) == 1) && ((d & 0x0c) != 0x0c));
 }
 
 static inline int
-IsSABME(u_char * data, struct PStack *st)
+IsSABME(u_char *data, struct PStack *st)
 {
        u_char d = data[0] & ~0x10;
 
@@ -268,19 +268,19 @@ IsSABME(u_char * data, struct PStack *st)
 }
 
 static inline int
-IsREJ(u_char * data, struct PStack *st)
+IsREJ(u_char *data, struct PStack *st)
 {
        return (test_bit(FLG_MOD128, &st->l2.flag) ? data[0] == REJ : (data[0] & 0xf) == REJ);
 }
 
 static inline int
-IsFRMR(u_char * data)
+IsFRMR(u_char *data)
 {
        return ((data[0] & 0xef) == FRMR);
 }
 
 static inline int
-IsRNR(u_char * data, struct PStack *st)
+IsRNR(u_char *data, struct PStack *st)
 {
        return (test_bit(FLG_MOD128, &st->l2.flag) ? data[0] == RNR : (data[0] & 0xf) == RNR);
 }
@@ -368,14 +368,14 @@ FRMR_error(struct PStack *st, struct sk_buff *skb)
                        return 'N';
                else
                        l2m_debug(&st->l2.l2m, "FRMR information %2x %2x %2x %2x %2x",
-                               datap[0], datap[1], datap[2],
-                               datap[3], datap[4]);
+                                 datap[0], datap[1], datap[2],
+                                 datap[3], datap[4]);
        } else {
                if (skb->len < headers + 3)
                        return 'N';
                else
                        l2m_debug(&st->l2.l2m, "FRMR information %2x %2x %2x",
-                               datap[0], datap[1], datap[2]);
+                                 datap[0], datap[1], datap[2]);
        }
 
        return 0;
@@ -384,9 +384,9 @@ FRMR_error(struct PStack *st, struct sk_buff *skb)
 static unsigned int
 legalnr(struct PStack *st, unsigned int nr)
 {
-        struct Layer2 *l2 = &st->l2;
+       struct Layer2 *l2 = &st->l2;
 
-       if(test_bit(FLG_MOD128, &l2->flag))
+       if (test_bit(FLG_MOD128, &l2->flag))
                return ((nr - l2->va) % 128) <= ((l2->vs - l2->va) % 128);
        else
                return ((nr - l2->va) % 8) <= ((l2->vs - l2->va) % 8);
@@ -402,7 +402,7 @@ setva(struct PStack *st, unsigned int nr)
        spin_lock_irqsave(&l2->lock, flags);
        while (l2->va != nr) {
                (l2->va)++;
-               if(test_bit(FLG_MOD128, &l2->flag))
+               if (test_bit(FLG_MOD128, &l2->flag))
                        l2->va %= 128;
                else
                        l2->va %= 8;
@@ -413,7 +413,7 @@ setva(struct PStack *st, unsigned int nr)
                l2->windowar[l2->sow] = NULL;
                l2->sow = (l2->sow + 1) % l2->window;
                spin_unlock_irqrestore(&l2->lock, flags);
-               if (test_bit(FLG_LLI_L2WAKEUP, &st->lli.flag) && (len >=0))
+               if (test_bit(FLG_LLI_L2WAKEUP, &st->lli.flag) && (len >= 0))
                        lli_writewakeup(st, len);
                spin_lock_irqsave(&l2->lock, flags);
        }
@@ -438,7 +438,7 @@ send_uframe(struct PStack *st, u_char cmd, u_char cr)
 }
 
 static inline u_char
-get_PollFlag(struct PStack * st, struct sk_buff * skb)
+get_PollFlag(struct PStack *st, struct sk_buff *skb)
 {
        return (skb->data[l2addrsize(&(st->l2))] & 0x10);
 }
@@ -470,29 +470,29 @@ restart_t200(struct PStack *st, int i)
 static inline void
 stop_t200(struct PStack *st, int i)
 {
-       if(test_and_clear_bit(FLG_T200_RUN, &st->l2.flag))
+       if (test_and_clear_bit(FLG_T200_RUN, &st->l2.flag))
                FsmDelTimer(&st->l2.t200, i);
 }
 
 static inline void
 st5_dl_release_l2l3(struct PStack *st)
 {
-               int pr;
+       int pr;
 
-               if(test_and_clear_bit(FLG_PEND_REL, &st->l2.flag))
-                       pr = DL_RELEASE | CONFIRM;
-               else
-                       pr = DL_RELEASE | INDICATION;
+       if (test_and_clear_bit(FLG_PEND_REL, &st->l2.flag))
+               pr = DL_RELEASE | CONFIRM;
+       else
+               pr = DL_RELEASE | INDICATION;
 
-               st->l2.l2l3(st, pr, NULL);
+       st->l2.l2l3(st, pr, NULL);
 }
 
 static inline void
 lapb_dl_release_l2l3(struct PStack *st, int f)
 {
-               if (test_bit(FLG_LAPB, &st->l2.flag))
-                       st->l2.l2l1(st, PH_DEACTIVATE | REQUEST, NULL);
-               st->l2.l2l3(st, DL_RELEASE | f, NULL);
+       if (test_bit(FLG_LAPB, &st->l2.flag))
+               st->l2.l2l1(st, PH_DEACTIVATE | REQUEST, NULL);
+       st->l2.l2l3(st, DL_RELEASE | f, NULL);
 }
 
 static void
@@ -557,7 +557,7 @@ l2_st8_mdl_error_dm(struct FsmInst *fi, int event, void *arg)
 static void
 l2_go_st3(struct FsmInst *fi, int event, void *arg)
 {
-       FsmChangeState(fi, ST_L2_3); 
+       FsmChangeState(fi, ST_L2_3);
 }
 
 static void
@@ -565,7 +565,7 @@ l2_mdl_assign(struct FsmInst *fi, int event, void *arg)
 {
        struct PStack *st = fi->userdata;
 
-       FsmChangeState(fi, ST_L2_3); 
+       FsmChangeState(fi, ST_L2_3);
        st->l2.l2tei(st, MDL_ASSIGN | INDICATION, NULL);
 }
 
@@ -755,7 +755,7 @@ l2_restart_multi(struct FsmInst *fi, int event, void *arg)
        if (est)
                st->l2.l2l3(st, DL_ESTABLISH | INDICATION, NULL);
 
-       if ((ST_L2_7==state) || (ST_L2_8 == state))
+       if ((ST_L2_7 == state) || (ST_L2_8 == state))
                if (!skb_queue_empty(&st->l2.i_queue) && cansend(st))
                        st->l2.l2l1(st, PH_PULL | REQUEST, NULL);
 }
@@ -782,7 +782,7 @@ l2_connected(struct FsmInst *fi, int event, void *arg)
 {
        struct PStack *st = fi->userdata;
        struct sk_buff *skb = arg;
-       int pr=-1;
+       int pr = -1;
 
        if (!get_PollFlag(st, skb)) {
                l2_mdl_error_ua(fi, event, arg);
@@ -853,7 +853,7 @@ l2_st5_dm_release(struct FsmInst *fi, int event, void *arg)
 
        if (get_PollFlagFree(st, skb)) {
                stop_t200(st, 7);
-               if (!test_bit(FLG_L3_INIT, &st->l2.flag))
+               if (!test_bit(FLG_L3_INIT, &st->l2.flag))
                        skb_queue_purge(&st->l2.i_queue);
                if (test_bit(FLG_LAPB, &st->l2.flag))
                        st->l2.l2l1(st, PH_DEACTIVATE | REQUEST, NULL);
@@ -941,7 +941,7 @@ invoke_retransmission(struct PStack *st, unsigned int nr)
        if (l2->vs != nr) {
                while (l2->vs != nr) {
                        (l2->vs)--;
-                       if(test_bit(FLG_MOD128, &l2->flag)) {
+                       if (test_bit(FLG_MOD128, &l2->flag)) {
                                l2->vs %= 128;
                                p1 = (l2->vs - l2->va) % 128;
                        } else {
@@ -1013,7 +1013,7 @@ l2_st7_got_super(struct FsmInst *fi, int event, void *arg)
                                        EV_L2_T203, NULL, 7);
                } else if ((l2->va != nr) || (typ == RNR)) {
                        setva(st, nr);
-                       if(typ != RR) FsmDelTimer(&st->l2.t203, 9);
+                       if (typ != RR) FsmDelTimer(&st->l2.t203, 9);
                        restart_t200(st, 12);
                }
                if (!skb_queue_empty(&st->l2.i_queue) && (typ == RR))
@@ -1080,10 +1080,10 @@ l2_got_iframe(struct FsmInst *fi, int event, void *arg)
        }
        if (test_bit(FLG_OWN_BUSY, &l2->flag)) {
                dev_kfree_skb(skb);
-               if(PollFlag) enquiry_response(st);
+               if (PollFlag) enquiry_response(st);
        } else if (l2->vr == ns) {
                (l2->vr)++;
-               if(test_bit(FLG_MOD128, &l2->flag))
+               if (test_bit(FLG_MOD128, &l2->flag))
                        l2->vr %= 128;
                else
                        l2->vr %= 8;
@@ -1150,7 +1150,7 @@ l2_st5_tout_200(struct FsmInst *fi, int event, void *arg)
        struct PStack *st = fi->userdata;
 
        if (test_bit(FLG_LAPD, &st->l2.flag) &&
-               test_bit(FLG_DCHAN_BUSY, &st->l2.flag)) {
+           test_bit(FLG_DCHAN_BUSY, &st->l2.flag)) {
                FsmAddTimer(&st->l2.t200, st->l2.T200, EV_L2_T200, NULL, 9);
        } else if (st->l2.rc == st->l2.N200) {
                FsmChangeState(fi, ST_L2_4);
@@ -1174,7 +1174,7 @@ l2_st6_tout_200(struct FsmInst *fi, int event, void *arg)
        struct PStack *st = fi->userdata;
 
        if (test_bit(FLG_LAPD, &st->l2.flag) &&
-               test_bit(FLG_DCHAN_BUSY, &st->l2.flag)) {
+           test_bit(FLG_DCHAN_BUSY, &st->l2.flag)) {
                FsmAddTimer(&st->l2.t200, st->l2.T200, EV_L2_T200, NULL, 9);
        } else if (st->l2.rc == st->l2.N200) {
                FsmChangeState(fi, ST_L2_4);
@@ -1195,7 +1195,7 @@ l2_st7_tout_200(struct FsmInst *fi, int event, void *arg)
        struct PStack *st = fi->userdata;
 
        if (test_bit(FLG_LAPD, &st->l2.flag) &&
-               test_bit(FLG_DCHAN_BUSY, &st->l2.flag)) {
+           test_bit(FLG_DCHAN_BUSY, &st->l2.flag)) {
                FsmAddTimer(&st->l2.t200, st->l2.T200, EV_L2_T200, NULL, 9);
                return;
        }
@@ -1213,7 +1213,7 @@ l2_st8_tout_200(struct FsmInst *fi, int event, void *arg)
        struct PStack *st = fi->userdata;
 
        if (test_bit(FLG_LAPD, &st->l2.flag) &&
-               test_bit(FLG_DCHAN_BUSY, &st->l2.flag)) {
+           test_bit(FLG_DCHAN_BUSY, &st->l2.flag)) {
                FsmAddTimer(&st->l2.t200, st->l2.T200, EV_L2_T200, NULL, 9);
                return;
        }
@@ -1234,7 +1234,7 @@ l2_st7_tout_203(struct FsmInst *fi, int event, void *arg)
        struct PStack *st = fi->userdata;
 
        if (test_bit(FLG_LAPD, &st->l2.flag) &&
-               test_bit(FLG_DCHAN_BUSY, &st->l2.flag)) {
+           test_bit(FLG_DCHAN_BUSY, &st->l2.flag)) {
                FsmAddTimer(&st->l2.t203, st->l2.T203, EV_L2_T203, NULL, 9);
                return;
        }
@@ -1272,7 +1272,7 @@ l2_pull_iqueue(struct FsmInst *fi, int event, void *arg)
                }
        }
        spin_lock_irqsave(&l2->lock, flags);
-       if(test_bit(FLG_MOD128, &l2->flag))
+       if (test_bit(FLG_MOD128, &l2->flag))
                p1 = (l2->vs - l2->va) % 128;
        else
                p1 = (l2->vs - l2->va) % 8;
@@ -1445,7 +1445,7 @@ static void
 l2_st14_persistent_da(struct FsmInst *fi, int event, void *arg)
 {
        struct PStack *st = fi->userdata;
-       
+
        skb_queue_purge(&st->l2.i_queue);
        skb_queue_purge(&st->l2.ui_queue);
        if (test_and_clear_bit(FLG_ESTAB_PEND, &st->l2.flag))
@@ -1495,7 +1495,7 @@ l2_set_own_busy(struct FsmInst *fi, int event, void *arg)
 {
        struct PStack *st = fi->userdata;
 
-       if(!test_and_set_bit(FLG_OWN_BUSY, &st->l2.flag)) {
+       if (!test_and_set_bit(FLG_OWN_BUSY, &st->l2.flag)) {
                enquiry_cr(st, RNR, RSP, 0);
                test_and_clear_bit(FLG_ACK_PEND, &st->l2.flag);
        }
@@ -1506,7 +1506,7 @@ l2_clear_own_busy(struct FsmInst *fi, int event, void *arg)
 {
        struct PStack *st = fi->userdata;
 
-       if(!test_and_clear_bit(FLG_OWN_BUSY, &st->l2.flag)) {
+       if (!test_and_clear_bit(FLG_OWN_BUSY, &st->l2.flag)) {
                enquiry_cr(st, RR, RSP, 0);
                test_and_clear_bit(FLG_ACK_PEND, &st->l2.flag);
        }
@@ -1631,76 +1631,76 @@ isdnl2_l1l2(struct PStack *st, int pr, void *arg)
        int c = 0;
 
        switch (pr) {
-               case (PH_DATA | INDICATION):
-                       datap = skb->data;
-                       len = l2addrsize(&st->l2);
-                       if (skb->len > len)
-                               datap += len;
-                       else {
-                               FsmEvent(&st->l2.l2m, EV_L2_FRAME_ERROR, (void *) 'N');
-                               dev_kfree_skb(skb);
-                               return;
-                       }
-                       if (!(*datap & 1)) {    /* I-Frame */
-                               if(!(c = iframe_error(st, skb)))
-                                       ret = FsmEvent(&st->l2.l2m, EV_L2_I, skb);
-                       } else if (IsSFrame(datap, st)) {       /* S-Frame */
-                               if(!(c = super_error(st, skb)))
-                                       ret = FsmEvent(&st->l2.l2m, EV_L2_SUPER, skb);
-                       } else if (IsUI(datap)) {
-                               if(!(c = UI_error(st, skb)))
-                                       ret = FsmEvent(&st->l2.l2m, EV_L2_UI, skb);
-                       } else if (IsSABME(datap, st)) {
-                               if(!(c = unnum_error(st, skb, CMD)))
-                                       ret = FsmEvent(&st->l2.l2m, EV_L2_SABME, skb);
-                       } else if (IsUA(datap)) {
-                               if(!(c = unnum_error(st, skb, RSP)))
-                                       ret = FsmEvent(&st->l2.l2m, EV_L2_UA, skb);
-                       } else if (IsDISC(datap)) {
-                               if(!(c = unnum_error(st, skb, CMD)))
-                                       ret = FsmEvent(&st->l2.l2m, EV_L2_DISC, skb);
-                       } else if (IsDM(datap)) {
-                               if(!(c = unnum_error(st, skb, RSP)))
-                                       ret = FsmEvent(&st->l2.l2m, EV_L2_DM, skb);
-                       } else if (IsFRMR(datap)) {
-                               if(!(c = FRMR_error(st,skb)))
-                                       ret = FsmEvent(&st->l2.l2m, EV_L2_FRMR, skb);
-                       } else {
-                               FsmEvent(&st->l2.l2m, EV_L2_FRAME_ERROR, (void *) 'L');
-                               dev_kfree_skb(skb);
-                               ret = 0;
-                       }
-                       if(c) {
-                               dev_kfree_skb(skb);
-                               FsmEvent(&st->l2.l2m, EV_L2_FRAME_ERROR, (void *)(long)c);
-                               ret = 0;
-                       }
-                       if (ret)
-                               dev_kfree_skb(skb);
-                       break;
-               case (PH_PULL | CONFIRM):
-                       FsmEvent(&st->l2.l2m, EV_L2_ACK_PULL, arg);
-                       break;
-               case (PH_PAUSE | INDICATION):
-                       test_and_set_bit(FLG_DCHAN_BUSY, &st->l2.flag);
-                       break;
-               case (PH_PAUSE | CONFIRM):
-                       test_and_clear_bit(FLG_DCHAN_BUSY, &st->l2.flag);
-                       break;
-               case (PH_ACTIVATE | CONFIRM):
-               case (PH_ACTIVATE | INDICATION):
-                       test_and_set_bit(FLG_L1_ACTIV, &st->l2.flag);
-                       if (test_and_clear_bit(FLG_ESTAB_PEND, &st->l2.flag))
-                               FsmEvent(&st->l2.l2m, EV_L2_DL_ESTABLISH_REQ, arg);
-                       break;
-               case (PH_DEACTIVATE | INDICATION):
-               case (PH_DEACTIVATE | CONFIRM):
-                       test_and_clear_bit(FLG_L1_ACTIV, &st->l2.flag);
-                       FsmEvent(&st->l2.l2m, EV_L1_DEACTIVATE, arg);
-                       break;
-               default:
-                       l2m_debug(&st->l2.l2m, "l2 unknown pr %04x", pr);
-                       break;
+       case (PH_DATA | INDICATION):
+               datap = skb->data;
+               len = l2addrsize(&st->l2);
+               if (skb->len > len)
+                       datap += len;
+               else {
+                       FsmEvent(&st->l2.l2m, EV_L2_FRAME_ERROR, (void *) 'N');
+                       dev_kfree_skb(skb);
+                       return;
+               }
+               if (!(*datap & 1)) {    /* I-Frame */
+                       if (!(c = iframe_error(st, skb)))
+                               ret = FsmEvent(&st->l2.l2m, EV_L2_I, skb);
+               } else if (IsSFrame(datap, st)) {       /* S-Frame */
+                       if (!(c = super_error(st, skb)))
+                               ret = FsmEvent(&st->l2.l2m, EV_L2_SUPER, skb);
+               } else if (IsUI(datap)) {
+                       if (!(c = UI_error(st, skb)))
+                               ret = FsmEvent(&st->l2.l2m, EV_L2_UI, skb);
+               } else if (IsSABME(datap, st)) {
+                       if (!(c = unnum_error(st, skb, CMD)))
+                               ret = FsmEvent(&st->l2.l2m, EV_L2_SABME, skb);
+               } else if (IsUA(datap)) {
+                       if (!(c = unnum_error(st, skb, RSP)))
+                               ret = FsmEvent(&st->l2.l2m, EV_L2_UA, skb);
+               } else if (IsDISC(datap)) {
+                       if (!(c = unnum_error(st, skb, CMD)))
+                               ret = FsmEvent(&st->l2.l2m, EV_L2_DISC, skb);
+               } else if (IsDM(datap)) {
+                       if (!(c = unnum_error(st, skb, RSP)))
+                               ret = FsmEvent(&st->l2.l2m, EV_L2_DM, skb);
+               } else if (IsFRMR(datap)) {
+                       if (!(c = FRMR_error(st, skb)))
+                               ret = FsmEvent(&st->l2.l2m, EV_L2_FRMR, skb);
+               } else {
+                       FsmEvent(&st->l2.l2m, EV_L2_FRAME_ERROR, (void *) 'L');
+                       dev_kfree_skb(skb);
+                       ret = 0;
+               }
+               if (c) {
+                       dev_kfree_skb(skb);
+                       FsmEvent(&st->l2.l2m, EV_L2_FRAME_ERROR, (void *)(long)c);
+                       ret = 0;
+               }
+               if (ret)
+                       dev_kfree_skb(skb);
+               break;
+       case (PH_PULL | CONFIRM):
+               FsmEvent(&st->l2.l2m, EV_L2_ACK_PULL, arg);
+               break;
+       case (PH_PAUSE | INDICATION):
+               test_and_set_bit(FLG_DCHAN_BUSY, &st->l2.flag);
+               break;
+       case (PH_PAUSE | CONFIRM):
+               test_and_clear_bit(FLG_DCHAN_BUSY, &st->l2.flag);
+               break;
+       case (PH_ACTIVATE | CONFIRM):
+       case (PH_ACTIVATE | INDICATION):
+               test_and_set_bit(FLG_L1_ACTIV, &st->l2.flag);
+               if (test_and_clear_bit(FLG_ESTAB_PEND, &st->l2.flag))
+                       FsmEvent(&st->l2.l2m, EV_L2_DL_ESTABLISH_REQ, arg);
+               break;
+       case (PH_DEACTIVATE | INDICATION):
+       case (PH_DEACTIVATE | CONFIRM):
+               test_and_clear_bit(FLG_L1_ACTIV, &st->l2.flag);
+               FsmEvent(&st->l2.l2m, EV_L1_DEACTIVATE, arg);
+               break;
+       default:
+               l2m_debug(&st->l2.l2m, "l2 unknown pr %04x", pr);
+               break;
        }
 }
 
@@ -1708,45 +1708,45 @@ static void
 isdnl2_l3l2(struct PStack *st, int pr, void *arg)
 {
        switch (pr) {
-               case (DL_DATA | REQUEST):
-                       if (FsmEvent(&st->l2.l2m, EV_L2_DL_DATA, arg)) {
-                               dev_kfree_skb((struct sk_buff *) arg);
-                       }
-                       break;
-               case (DL_UNIT_DATA | REQUEST):
-                       if (FsmEvent(&st->l2.l2m, EV_L2_DL_UNIT_DATA, arg)) {
-                               dev_kfree_skb((struct sk_buff *) arg);
-                       }
-                       break;
-               case (DL_ESTABLISH | REQUEST):
-                       if (test_bit(FLG_L1_ACTIV, &st->l2.flag)) {
-                               if (test_bit(FLG_LAPD, &st->l2.flag) ||
-                                       test_bit(FLG_ORIG, &st->l2.flag)) {
-                                       FsmEvent(&st->l2.l2m, EV_L2_DL_ESTABLISH_REQ, arg);
-                               }
-                       } else {
-                               if (test_bit(FLG_LAPD, &st->l2.flag) ||
-                                       test_bit(FLG_ORIG, &st->l2.flag)) {
-                                       test_and_set_bit(FLG_ESTAB_PEND, &st->l2.flag);
-                               }
-                               st->l2.l2l1(st, PH_ACTIVATE, NULL);
+       case (DL_DATA | REQUEST):
+               if (FsmEvent(&st->l2.l2m, EV_L2_DL_DATA, arg)) {
+                       dev_kfree_skb((struct sk_buff *) arg);
+               }
+               break;
+       case (DL_UNIT_DATA | REQUEST):
+               if (FsmEvent(&st->l2.l2m, EV_L2_DL_UNIT_DATA, arg)) {
+                       dev_kfree_skb((struct sk_buff *) arg);
+               }
+               break;
+       case (DL_ESTABLISH | REQUEST):
+               if (test_bit(FLG_L1_ACTIV, &st->l2.flag)) {
+                       if (test_bit(FLG_LAPD, &st->l2.flag) ||
+                           test_bit(FLG_ORIG, &st->l2.flag)) {
+                               FsmEvent(&st->l2.l2m, EV_L2_DL_ESTABLISH_REQ, arg);
                        }
-                       break;
-               case (DL_RELEASE | REQUEST):
-                       if (test_bit(FLG_LAPB, &st->l2.flag)) {
-                               st->l2.l2l1(st, PH_DEACTIVATE, NULL);
+               } else {
+                       if (test_bit(FLG_LAPD, &st->l2.flag) ||
+                           test_bit(FLG_ORIG, &st->l2.flag)) {
+                               test_and_set_bit(FLG_ESTAB_PEND, &st->l2.flag);
                        }
-                       FsmEvent(&st->l2.l2m, EV_L2_DL_RELEASE_REQ, arg);
-                       break;
-               case (MDL_ASSIGN | REQUEST):
-                       FsmEvent(&st->l2.l2m, EV_L2_MDL_ASSIGN, arg);
-                       break;
-               case (MDL_REMOVE | REQUEST):
-                       FsmEvent(&st->l2.l2m, EV_L2_MDL_REMOVE, arg);
-                       break;
-               case (MDL_ERROR | RESPONSE):
-                       FsmEvent(&st->l2.l2m, EV_L2_MDL_ERROR, arg);
-                       break;
+                       st->l2.l2l1(st, PH_ACTIVATE, NULL);
+               }
+               break;
+       case (DL_RELEASE | REQUEST):
+               if (test_bit(FLG_LAPB, &st->l2.flag)) {
+                       st->l2.l2l1(st, PH_DEACTIVATE, NULL);
+               }
+               FsmEvent(&st->l2.l2m, EV_L2_DL_RELEASE_REQ, arg);
+               break;
+       case (MDL_ASSIGN | REQUEST):
+               FsmEvent(&st->l2.l2m, EV_L2_MDL_ASSIGN, arg);
+               break;
+       case (MDL_REMOVE | REQUEST):
+               FsmEvent(&st->l2.l2m, EV_L2_MDL_REMOVE, arg);
+               break;
+       case (MDL_ERROR | RESPONSE):
+               FsmEvent(&st->l2.l2m, EV_L2_MDL_ERROR, arg);
+               break;
        }
 }
 
@@ -1787,7 +1787,7 @@ setstack_isdnl2(struct PStack *st, char *debug_id)
        if (test_bit(FLG_LAPB, &st->l2.flag))
                st->l2.l2m.state = ST_L2_4;
        else
-       st->l2.l2m.state = ST_L2_1;
+               st->l2.l2m.state = ST_L2_1;
        st->l2.l2m.debug = 0;
        st->l2.l2m.userdata = st;
        st->l2.l2m.userint = 0;
@@ -1802,16 +1802,16 @@ static void
 transl2_l3l2(struct PStack *st, int pr, void *arg)
 {
        switch (pr) {
-               case (DL_DATA | REQUEST):
-               case (DL_UNIT_DATA | REQUEST):
-                       st->l2.l2l1(st, PH_DATA | REQUEST, arg);
-                       break;
-               case (DL_ESTABLISH | REQUEST):
-                       st->l2.l2l1(st, PH_ACTIVATE | REQUEST, NULL);
-                       break;
-               case (DL_RELEASE | REQUEST):
-                       st->l2.l2l1(st, PH_DEACTIVATE | REQUEST, NULL);
-                       break;
+       case (DL_DATA | REQUEST):
+       case (DL_UNIT_DATA | REQUEST):
+               st->l2.l2l1(st, PH_DATA | REQUEST, arg);
+               break;
+       case (DL_ESTABLISH | REQUEST):
+               st->l2.l2l1(st, PH_ACTIVATE | REQUEST, NULL);
+               break;
+       case (DL_RELEASE | REQUEST):
+               st->l2.l2l1(st, PH_DEACTIVATE | REQUEST, NULL);
+               break;
        }
 }
 
index 0cdab1b..7e447fb 100644 (file)
@@ -23,4 +23,3 @@
 #define RSP    1
 
 #define LC_FLUSH_WAIT 1
-
index 1c24e44..45b0384 100644 (file)
@@ -3,7 +3,7 @@
  * Author       Karsten Keil
  *              based on the teles driver from Jan den Ouden
  * Copyright    by Karsten Keil      <keil@isdn4linux.de>
- * 
+ *
  * This software may be used and distributed according to the terms
  * of the GNU General Public License, incorporated herein by reference.
  *
@@ -27,12 +27,12 @@ static struct Fsm l3fsm;
 enum {
        ST_L3_LC_REL,
        ST_L3_LC_ESTAB_WAIT,
-       ST_L3_LC_REL_DELAY, 
+       ST_L3_LC_REL_DELAY,
        ST_L3_LC_REL_WAIT,
        ST_L3_LC_ESTAB,
 };
 
-#define L3_STATE_COUNT (ST_L3_LC_ESTAB+1)
+#define L3_STATE_COUNT (ST_L3_LC_ESTAB + 1)
 
 static char *strL3State[] =
 {
@@ -53,7 +53,7 @@ enum {
        EV_TIMEOUT,
 };
 
-#define L3_EVENT_COUNT (EV_TIMEOUT+1)
+#define L3_EVENT_COUNT (EV_TIMEOUT + 1)
 
 static char *strL3Event[] =
 {
@@ -67,7 +67,7 @@ static char *strL3Event[] =
 };
 
 static __printf(2, 3) void
-l3m_debug(struct FsmInst *fi, char *fmt, ...)
+       l3m_debug(struct FsmInst *fi, char *fmt, ...)
 {
        va_list args;
        struct PStack *st = fi->userdata;
@@ -78,7 +78,7 @@ l3m_debug(struct FsmInst *fi, char *fmt, ...)
 }
 
 u_char *
-findie(u_char * p, int size, u_char ie, int wanted_set)
+findie(u_char *p, int size, u_char ie, int wanted_set)
 {
        int l, codeset, maincodeset;
        u_char *pend = p + size;
@@ -102,14 +102,14 @@ findie(u_char * p, int size, u_char ie, int wanted_set)
                else {
                        if (codeset == wanted_set) {
                                if (*p == ie)
-                                  { /* improved length check (Werner Cornelius) */
-                                    if ((pend - p) < 2) 
-                                      return(NULL); 
-                                    if (*(p+1) > (pend - (p+2))) 
-                                      return(NULL); 
-                                    return (p);
-                                  }           
-                                  
+                               { /* improved length check (Werner Cornelius) */
+                                       if ((pend - p) < 2)
+                                               return (NULL);
+                                       if (*(p + 1) > (pend - (p + 2)))
+                                               return (NULL);
+                                       return (p);
+                               }
+
                                if (*p > ie)
                                        return (NULL);
                        }
@@ -123,16 +123,16 @@ findie(u_char * p, int size, u_char ie, int wanted_set)
 }
 
 int
-getcallref(u_char * p)
+getcallref(u_char *p)
 {
        int l, cr = 0;
 
        p++;                    /* prot discr */
        if (*p & 0xfe)          /* wrong callref BRI only 1 octet*/
-               return(-2);
+               return (-2);
        l = 0xf & *p++;         /* callref length */
        if (!l)                 /* dummy CallRef */
-               return(-1);
+               return (-1);
        cr = *p++;
        return (cr);
 }
@@ -153,7 +153,7 @@ void
 newl3state(struct l3_process *pc, int state)
 {
        if (pc->debug & L3_DEB_STATE)
-               l3_debug(pc->st, "newstate cr %d %d --> %d", 
+               l3_debug(pc->st, "newstate cr %d %d --> %d",
                         pc->callref & 0x7F,
                         pc->state, state);
        pc->state = state;
@@ -228,8 +228,8 @@ no_l3_proto(struct PStack *st, int pr, void *arg)
 static int
 no_l3_proto_spec(struct PStack *st, isdn_ctrl *ic)
 {
-       printk(KERN_WARNING "HiSax: no specific protocol handler for proto %lu\n",ic->arg & 0xFF);
-       return(-1);
+       printk(KERN_WARNING "HiSax: no specific protocol handler for proto %lu\n", ic->arg & 0xFF);
+       return (-1);
 }
 
 struct l3_process
@@ -287,7 +287,7 @@ release_l3_process(struct l3_process *p)
                        if (pp)
                                pp->next = np->next;
                        else if (!(p->st->l3.proc = np->next) &&
-                               !test_bit(FLG_PTP, &p->st->l2.flag)) {
+                                !test_bit(FLG_PTP, &p->st->l2.flag)) {
                                if (p->debug)
                                        l3_debug(p->st, "release_l3_process: last process");
                                if (skb_queue_empty(&p->st->l3.squeue)) {
@@ -301,7 +301,7 @@ release_l3_process(struct l3_process *p)
                                        if (p->debug)
                                                l3_debug(p->st, "release_l3_process: not release link");
                                }
-                       } 
+                       }
                        kfree(p);
                        return;
                }
@@ -340,42 +340,42 @@ setstack_l3dc(struct PStack *st, struct Channel *chanp)
        st->l3.l3m.userdata = st;
        st->l3.l3m.userint = 0;
        st->l3.l3m.printdebug = l3m_debug;
-        FsmInitTimer(&st->l3.l3m, &st->l3.l3m_timer);
+       FsmInitTimer(&st->l3.l3m, &st->l3.l3m_timer);
        strcpy(st->l3.debug_id, "L3DC ");
        st->lli.l4l3_proto = no_l3_proto_spec;
 
-#ifdef CONFIG_HISAX_EURO
+#ifdef CONFIG_HISAX_EURO
        if (st->protocol == ISDN_PTYPE_EURO) {
                setstack_dss1(st);
        } else
 #endif
-#ifdef  CONFIG_HISAX_NI1
-       if (st->protocol == ISDN_PTYPE_NI1) {
-               setstack_ni1(st);
-       } else
+#ifdef CONFIG_HISAX_NI1
+               if (st->protocol == ISDN_PTYPE_NI1) {
+                       setstack_ni1(st);
+               } else
 #endif
-#ifdef CONFIG_HISAX_1TR6
-       if (st->protocol == ISDN_PTYPE_1TR6) {
-               setstack_1tr6(st);
-       } else
+#ifdef CONFIG_HISAX_1TR6
+                       if (st->protocol == ISDN_PTYPE_1TR6) {
+                               setstack_1tr6(st);
+                       } else
 #endif
-       if (st->protocol == ISDN_PTYPE_LEASED) {
-               st->lli.l4l3 = no_l3_proto;
-               st->l2.l2l3 = no_l3_proto;
-                st->l3.l3ml3 = no_l3_proto;
-               printk(KERN_INFO "HiSax: Leased line mode\n");
-       } else {
-               st->lli.l4l3 = no_l3_proto;
-               st->l2.l2l3 = no_l3_proto;
-                st->l3.l3ml3 = no_l3_proto;
-               sprintf(tmp, "protocol %s not supported",
-                       (st->protocol == ISDN_PTYPE_1TR6) ? "1tr6" :
-                       (st->protocol == ISDN_PTYPE_EURO) ? "euro" :
-                       (st->protocol == ISDN_PTYPE_NI1) ? "ni1" :
-                       "unknown");
-               printk(KERN_WARNING "HiSax: %s\n", tmp);
-               st->protocol = -1;
-       }
+                               if (st->protocol == ISDN_PTYPE_LEASED) {
+                                       st->lli.l4l3 = no_l3_proto;
+                                       st->l2.l2l3 = no_l3_proto;
+                                       st->l3.l3ml3 = no_l3_proto;
+                                       printk(KERN_INFO "HiSax: Leased line mode\n");
+                               } else {
+                                       st->lli.l4l3 = no_l3_proto;
+                                       st->l2.l2l3 = no_l3_proto;
+                                       st->l3.l3ml3 = no_l3_proto;
+                                       sprintf(tmp, "protocol %s not supported",
+                                               (st->protocol == ISDN_PTYPE_1TR6) ? "1tr6" :
+                                               (st->protocol == ISDN_PTYPE_EURO) ? "euro" :
+                                               (st->protocol == ISDN_PTYPE_NI1) ? "ni1" :
+                                               "unknown");
+                                       printk(KERN_WARNING "HiSax: %s\n", tmp);
+                                       st->protocol = -1;
+                               }
 }
 
 static void
@@ -469,22 +469,22 @@ lc_connected(struct FsmInst *fi, int event, void *arg)
 static void
 lc_start_delay(struct FsmInst *fi, int event, void *arg)
 {
-       struct PStack *st = fi->userdata;
+       struct PStack *st = fi->userdata;
 
-       FsmChangeState(fi, ST_L3_LC_REL_DELAY);
-       FsmAddTimer(&st->l3.l3m_timer, DREL_TIMER_VALUE, EV_TIMEOUT, NULL, 50);
+       FsmChangeState(fi, ST_L3_LC_REL_DELAY);
+       FsmAddTimer(&st->l3.l3m_timer, DREL_TIMER_VALUE, EV_TIMEOUT, NULL, 50);
 }
 
 static void
 lc_start_delay_check(struct FsmInst *fi, int event, void *arg)
 /* 20/09/00 - GE timer not user for NI-1 as layer 2 should stay up */
 {
-       struct PStack *st = fi->userdata;
+       struct PStack *st = fi->userdata;
 
-       FsmChangeState(fi, ST_L3_LC_REL_DELAY);
-       /* 19/09/00 - GE timer not user for NI-1 */
-       if (st->protocol != ISDN_PTYPE_NI1) 
-                       FsmAddTimer(&st->l3.l3m_timer, DREL_TIMER_VALUE, EV_TIMEOUT, NULL, 50);
+       FsmChangeState(fi, ST_L3_LC_REL_DELAY);
+       /* 19/09/00 - GE timer not user for NI-1 */
+       if (st->protocol != ISDN_PTYPE_NI1)
+               FsmAddTimer(&st->l3.l3m_timer, DREL_TIMER_VALUE, EV_TIMEOUT, NULL, 50);
 }
 
 static void
@@ -536,9 +536,9 @@ static struct FsmNode L3FnList[] __initdata =
        {ST_L3_LC_ESTAB_WAIT,   EV_RELEASE_IND,         lc_release_ind},
        {ST_L3_LC_ESTAB,        EV_RELEASE_IND,         lc_release_ind},
        {ST_L3_LC_ESTAB,        EV_RELEASE_REQ,         lc_start_delay_check},
-        {ST_L3_LC_REL_DELAY,    EV_RELEASE_IND,         lc_release_ind},
-        {ST_L3_LC_REL_DELAY,    EV_ESTABLISH_REQ,       lc_connected},
-        {ST_L3_LC_REL_DELAY,    EV_TIMEOUT,             lc_release_req},
+       {ST_L3_LC_REL_DELAY,    EV_RELEASE_IND,         lc_release_ind},
+       {ST_L3_LC_REL_DELAY,    EV_ESTABLISH_REQ,       lc_connected},
+       {ST_L3_LC_REL_DELAY,    EV_TIMEOUT,             lc_release_req},
        {ST_L3_LC_REL_WAIT,     EV_RELEASE_CNF,         lc_release_cnf},
        {ST_L3_LC_REL_WAIT,     EV_ESTABLISH_REQ,       lc_activate},
 };
@@ -548,34 +548,34 @@ void
 l3_msg(struct PStack *st, int pr, void *arg)
 {
        switch (pr) {
-               case (DL_DATA | REQUEST):
-                       if (st->l3.l3m.state == ST_L3_LC_ESTAB) {
-                               st->l3.l3l2(st, pr, arg);
-                       } else {
-                               struct sk_buff *skb = arg;
-
-                               skb_queue_tail(&st->l3.squeue, skb);
-                               FsmEvent(&st->l3.l3m, EV_ESTABLISH_REQ, NULL); 
-                       }
-                       break;
-               case (DL_ESTABLISH | REQUEST):
+       case (DL_DATA | REQUEST):
+               if (st->l3.l3m.state == ST_L3_LC_ESTAB) {
+                       st->l3.l3l2(st, pr, arg);
+               } else {
+                       struct sk_buff *skb = arg;
+
+                       skb_queue_tail(&st->l3.squeue, skb);
                        FsmEvent(&st->l3.l3m, EV_ESTABLISH_REQ, NULL);
-                       break;
-               case (DL_ESTABLISH | CONFIRM):
-                       FsmEvent(&st->l3.l3m, EV_ESTABLISH_CNF, NULL);
-                       break;
-               case (DL_ESTABLISH | INDICATION):
-                       FsmEvent(&st->l3.l3m, EV_ESTABLISH_IND, NULL);
-                       break;
-               case (DL_RELEASE | INDICATION):
-                       FsmEvent(&st->l3.l3m, EV_RELEASE_IND, NULL);
-                       break;
-               case (DL_RELEASE | CONFIRM):
-                       FsmEvent(&st->l3.l3m, EV_RELEASE_CNF, NULL);
-                       break;
-               case (DL_RELEASE | REQUEST):
-                       FsmEvent(&st->l3.l3m, EV_RELEASE_REQ, NULL);
-                       break;
+               }
+               break;
+       case (DL_ESTABLISH | REQUEST):
+               FsmEvent(&st->l3.l3m, EV_ESTABLISH_REQ, NULL);
+               break;
+       case (DL_ESTABLISH | CONFIRM):
+               FsmEvent(&st->l3.l3m, EV_ESTABLISH_CNF, NULL);
+               break;
+       case (DL_ESTABLISH | INDICATION):
+               FsmEvent(&st->l3.l3m, EV_ESTABLISH_IND, NULL);
+               break;
+       case (DL_RELEASE | INDICATION):
+               FsmEvent(&st->l3.l3m, EV_RELEASE_IND, NULL);
+               break;
+       case (DL_RELEASE | CONFIRM):
+               FsmEvent(&st->l3.l3m, EV_RELEASE_CNF, NULL);
+               break;
+       case (DL_RELEASE | REQUEST):
+               FsmEvent(&st->l3.l3m, EV_RELEASE_REQ, NULL);
+               break;
        }
 }
 
index 749498f..0edc99d 100644 (file)
@@ -5,7 +5,7 @@
  *
  */
 
-#define SBIT(state) (1<<state)
+#define SBIT(state) (1 << state)
 #define ALL_STATES  0x03ffffff
 
 #define PROTO_DIS_EURO 0x08
@@ -40,4 +40,3 @@ void l3_msg(struct PStack *st, int pr, void *arg);
 void setstack_dss1(struct PStack *st);
 void setstack_ni1(struct PStack *st);
 void setstack_1tr6(struct PStack *st);
-
index ca41617..ea27172 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Author       Karsten Keil
  * Copyright    by Karsten Keil      <keil@isdn4linux.de>
- * 
+ *
  * This software may be used and distributed according to the terms
  * of the GNU General Public License, incorporated herein by reference.
  *
@@ -19,7 +19,7 @@
 
 static const char *ISurf_revision = "$Revision: 1.12.2.4 $";
 
-#define byteout(addr,val) outb(val,addr)
+#define byteout(addr, val) outb(val, addr)
 #define bytein(addr) inb(addr)
 
 #define ISURF_ISAR_RESET       1
@@ -46,7 +46,7 @@ WriteISAC(struct IsdnCardState *cs, u_char offset, u_char value)
 }
 
 static void
-ReadISACfifo(struct IsdnCardState *cs, u_char * data, int size)
+ReadISACfifo(struct IsdnCardState *cs, u_char *data, int size)
 {
        register int i;
        for (i = 0; i < size; i++)
@@ -54,11 +54,11 @@ ReadISACfifo(struct IsdnCardState *cs, u_char * data, int size)
 }
 
 static void
-WriteISACfifo(struct IsdnCardState *cs, u_char * data, int size)
+WriteISACfifo(struct IsdnCardState *cs, u_char *data, int size)
 {
        register int i;
-       for (i = 0; i < size; i++){
-               writeb(data[i], cs->hw.isurf.isac);mb();
+       for (i = 0; i < size; i++) {
+               writeb(data[i], cs->hw.isurf.isac); mb();
        }
 }
 
@@ -67,17 +67,17 @@ WriteISACfifo(struct IsdnCardState *cs, u_char * data, int size)
  * mode = 1 access with IRQ off
  * mode = 2 access with IRQ off and using last offset
  */
-  
+
 static u_char
 ReadISAR(struct IsdnCardState *cs, int mode, u_char offset)
-{      
-       return(readb(cs->hw.isurf.isar + offset));
+{
+       return (readb(cs->hw.isurf.isar + offset));
 }
 
 static void
 WriteISAR(struct IsdnCardState *cs, int mode, u_char offset, u_char value)
 {
-       writeb(value, cs->hw.isurf.isar + offset);mb();
+       writeb(value, cs->hw.isurf.isar + offset); mb();
 }
 
 static irqreturn_t
@@ -90,11 +90,11 @@ isurf_interrupt(int intno, void *dev_id)
 
        spin_lock_irqsave(&cs->lock, flags);
        val = readb(cs->hw.isurf.isar + ISAR_IRQBIT);
-      Start_ISAR:
+Start_ISAR:
        if (val & ISAR_IRQSTA)
                isar_int_main(cs);
        val = readb(cs->hw.isurf.isac + ISAC_ISTA);
-      Start_ISAC:
+Start_ISAC:
        if (val)
                isac_interrupt(cs, val);
        val = readb(cs->hw.isurf.isar + ISAR_IRQBIT);
@@ -113,8 +113,8 @@ isurf_interrupt(int intno, void *dev_id)
                printk(KERN_WARNING "ISurf IRQ LOOP\n");
 
        writeb(0, cs->hw.isurf.isar + ISAR_IRQBIT); mb();
-       writeb(0xFF, cs->hw.isurf.isac + ISAC_MASK);mb();
-       writeb(0, cs->hw.isurf.isac + ISAC_MASK);mb();
+       writeb(0xFF, cs->hw.isurf.isac + ISAC_MASK); mb();
+       writeb(0, cs->hw.isurf.isac + ISAC_MASK); mb();
        writeb(ISAR_IRQMSK, cs->hw.isurf.isar + ISAR_IRQBIT); mb();
        spin_unlock_irqrestore(&cs->lock, flags);
        return IRQ_HANDLED;
@@ -145,31 +145,31 @@ ISurf_card_msg(struct IsdnCardState *cs, int mt, void *arg)
        u_long flags;
 
        switch (mt) {
-               case CARD_RESET:
-                       spin_lock_irqsave(&cs->lock, flags);
-                       reset_isurf(cs, ISURF_RESET);
-                       spin_unlock_irqrestore(&cs->lock, flags);
-                       return(0);
-               case CARD_RELEASE:
-                       release_io_isurf(cs);
-                       return(0);
-               case CARD_INIT:
-                       spin_lock_irqsave(&cs->lock, flags);
-                       reset_isurf(cs, ISURF_RESET);
-                       clear_pending_isac_ints(cs);
-                       writeb(0, cs->hw.isurf.isar+ISAR_IRQBIT);mb();
-                       initisac(cs);
-                       initisar(cs);
-                       /* Reenable ISAC IRQ */
-                       cs->writeisac(cs, ISAC_MASK, 0);
-                       /* RESET Receiver and Transmitter */
-                       cs->writeisac(cs, ISAC_CMDR, 0x41);
-                       spin_unlock_irqrestore(&cs->lock, flags);
-                       return(0);
-               case CARD_TEST:
-                       return(0);
+       case CARD_RESET:
+               spin_lock_irqsave(&cs->lock, flags);
+               reset_isurf(cs, ISURF_RESET);
+               spin_unlock_irqrestore(&cs->lock, flags);
+               return (0);
+       case CARD_RELEASE:
+               release_io_isurf(cs);
+               return (0);
+       case CARD_INIT:
+               spin_lock_irqsave(&cs->lock, flags);
+               reset_isurf(cs, ISURF_RESET);
+               clear_pending_isac_ints(cs);
+               writeb(0, cs->hw.isurf.isar + ISAR_IRQBIT); mb();
+               initisac(cs);
+               initisar(cs);
+               /* Reenable ISAC IRQ */
+               cs->writeisac(cs, ISAC_MASK, 0);
+               /* RESET Receiver and Transmitter */
+               cs->writeisac(cs, ISAC_CMDR, 0x41);
+               spin_unlock_irqrestore(&cs->lock, flags);
+               return (0);
+       case CARD_TEST:
+               return (0);
        }
-       return(0);
+       return (0);
 }
 
 static int
@@ -182,15 +182,15 @@ isurf_auxcmd(struct IsdnCardState *cs, isdn_ctrl *ic) {
                spin_lock_irqsave(&cs->lock, flags);
                if (!ret) {
                        reset_isurf(cs, ISURF_ISAR_EA | ISURF_ISAC_RESET |
-                               ISURF_ARCOFI_RESET);
+                                   ISURF_ARCOFI_RESET);
                        initisac(cs);
                        cs->writeisac(cs, ISAC_MASK, 0);
                        cs->writeisac(cs, ISAC_CMDR, 0x41);
                }
                spin_unlock_irqrestore(&cs->lock, flags);
-               return(ret);
+               return (ret);
        }
-       return(isar_auxcmd(cs, ic));
+       return (isar_auxcmd(cs, ic));
 }
 
 #ifdef __ISAPNP__
@@ -206,9 +206,9 @@ setup_isurf(struct IsdnCard *card)
 
        strcpy(tmp, ISurf_revision);
        printk(KERN_INFO "HiSax: ISurf driver Rev. %s\n", HiSax_getrev(tmp));
-       
-       if (cs->typ != ISDN_CTYPE_ISURF)
-               return(0);
+
+       if (cs->typ != ISDN_CTYPE_ISURF)
+               return (0);
        if (card->para[1] && card->para[2]) {
                cs->hw.isurf.reset = card->para[1];
                cs->hw.isurf.phymem = card->para[2];
@@ -221,11 +221,11 @@ setup_isurf(struct IsdnCard *card)
 
                        cs->subtyp = 0;
                        if ((pnp_c = pnp_find_card(
-                               ISAPNP_VENDOR('S', 'I', 'E'),
-                               ISAPNP_FUNCTION(0x0010), pnp_c))) {
+                                    ISAPNP_VENDOR('S', 'I', 'E'),
+                                    ISAPNP_FUNCTION(0x0010), pnp_c))) {
                                if (!(pnp_d = pnp_find_dev(pnp_c,
-                                       ISAPNP_VENDOR('S', 'I', 'E'),
-                                       ISAPNP_FUNCTION(0x0010), pnp_d))) {
+                                                          ISAPNP_VENDOR('S', 'I', 'E'),
+                                                          ISAPNP_FUNCTION(0x0010), pnp_d))) {
                                        printk(KERN_ERR "ISurfPnP: PnP error card found, no device\n");
                                        return (0);
                                }
@@ -236,17 +236,17 @@ setup_isurf(struct IsdnCard *card)
                                cs->irq = pnp_irq(pnp_d, 0);
                                if (!cs->irq || !cs->hw.isurf.reset || !cs->hw.isurf.phymem) {
                                        printk(KERN_ERR "ISurfPnP:some resources are missing %d/%x/%lx\n",
-                                               cs->irq, cs->hw.isurf.reset, cs->hw.isurf.phymem);
+                                              cs->irq, cs->hw.isurf.reset, cs->hw.isurf.phymem);
                                        pnp_disable_dev(pnp_d);
-                                       return(0);
+                                       return (0);
                                }
                        } else {
                                printk(KERN_INFO "ISurfPnP: no ISAPnP card found\n");
-                               return(0);
+                               return (0);
                        }
                } else {
                        printk(KERN_INFO "ISurfPnP: no ISAPnP bus found\n");
-                       return(0);
+                       return (0);
                }
 #else
                printk(KERN_WARNING "HiSax: Siemens I-Surf port/mem not set\n");
@@ -255,15 +255,15 @@ setup_isurf(struct IsdnCard *card)
        }
        if (!request_region(cs->hw.isurf.reset, 1, "isurf isdn")) {
                printk(KERN_WARNING
-                       "HiSax: Siemens I-Surf config port %x already in use\n",
-                       cs->hw.isurf.reset);
-                       return (0);
+                      "HiSax: Siemens I-Surf config port %x already in use\n",
+                      cs->hw.isurf.reset);
+               return (0);
        }
        if (!request_region(cs->hw.isurf.phymem, ISURF_IOMEM_SIZE, "isurf iomem")) {
                printk(KERN_WARNING "HiSax: Siemens I-Surf memory region "
-                       "%lx-%lx already in use\n",
-                       cs->hw.isurf.phymem,
-                       cs->hw.isurf.phymem + ISURF_IOMEM_SIZE);
+                      "%lx-%lx already in use\n",
+                      cs->hw.isurf.phymem,
+                      cs->hw.isurf.phymem + ISURF_IOMEM_SIZE);
                release_region(cs->hw.isurf.reset, 1);
                return (0);
        }
@@ -293,7 +293,7 @@ setup_isurf(struct IsdnCard *card)
        ver = ISARVersion(cs, "ISurf:");
        if (ver < 0) {
                printk(KERN_WARNING
-                       "ISurf: wrong ISAR version (ret = %d)\n", ver);
+                      "ISurf: wrong ISAR version (ret = %d)\n", ver);
                release_io_isurf(cs);
                return (0);
        }
index a92bf0d..5f299f8 100644 (file)
@@ -7,7 +7,7 @@
  * Copyright    by Klaus-Peter Nischke, ITK AG
  *                                   <klaus@nischke.do.eunet.de>
  *              by Karsten Keil      <keil@isdn4linux.de>
- * 
+ *
  * This software may be used and distributed according to the terms
  * of the GNU General Public License, incorporated herein by reference.
  *
@@ -26,7 +26,7 @@
 
 static const char *ix1_revision = "$Revision: 2.12.2.4 $";
 
-#define byteout(addr,val) outb(val,addr)
+#define byteout(addr, val) outb(val, addr)
 #define bytein(addr) inb(addr)
 
 #define SPECIAL_PORT_OFFSET 3
@@ -49,7 +49,7 @@ readreg(unsigned int ale, unsigned int adr, u_char off)
 }
 
 static inline void
-readfifo(unsigned int ale, unsigned int adr, u_char off, u_char * data, int size)
+readfifo(unsigned int ale, unsigned int adr, u_char off, u_char *data, int size)
 {
        byteout(ale, off);
        insb(adr, data, size);
@@ -64,7 +64,7 @@ writereg(unsigned int ale, unsigned int adr, u_char off, u_char data)
 }
 
 static inline void
-writefifo(unsigned int ale, unsigned int adr, u_char off, u_char * data, int size)
+writefifo(unsigned int ale, unsigned int adr, u_char off, u_char *data, int size)
 {
        byteout(ale, off);
        outsb(adr, data, size);
@@ -85,13 +85,13 @@ WriteISAC(struct IsdnCardState *cs, u_char offset, u_char value)
 }
 
 static void
-ReadISACfifo(struct IsdnCardState *cs, u_char * data, int size)
+ReadISACfifo(struct IsdnCardState *cs, u_char *data, int size)
 {
        readfifo(cs->hw.ix1.isac_ale, cs->hw.ix1.isac, 0, data, size);
 }
 
 static void
-WriteISACfifo(struct IsdnCardState *cs, u_char * data, int size)
+WriteISACfifo(struct IsdnCardState *cs, u_char *data, int size)
 {
        writefifo(cs->hw.ix1.isac_ale, cs->hw.ix1.isac, 0, data, size);
 }
@@ -110,16 +110,16 @@ WriteHSCX(struct IsdnCardState *cs, int hscx, u_char offset, u_char value)
                 cs->hw.ix1.hscx, offset + (hscx ? 0x40 : 0), value);
 }
 
-#define READHSCX(cs, nr, reg) readreg(cs->hw.ix1.hscx_ale, \
-               cs->hw.ix1.hscx, reg + (nr ? 0x40 : 0))
-#define WRITEHSCX(cs, nr, reg, data) writereg(cs->hw.ix1.hscx_ale, \
-               cs->hw.ix1.hscx, reg + (nr ? 0x40 : 0), data)
+#define READHSCX(cs, nr, reg) readreg(cs->hw.ix1.hscx_ale,             \
+                                     cs->hw.ix1.hscx, reg + (nr ? 0x40 : 0))
+#define WRITEHSCX(cs, nr, reg, data) writereg(cs->hw.ix1.hscx_ale,     \
+                                             cs->hw.ix1.hscx, reg + (nr ? 0x40 : 0), data)
 
-#define READHSCXFIFO(cs, nr, ptr, cnt) readfifo(cs->hw.ix1.hscx_ale, \
-               cs->hw.ix1.hscx, (nr ? 0x40 : 0), ptr, cnt)
+#define READHSCXFIFO(cs, nr, ptr, cnt) readfifo(cs->hw.ix1.hscx_ale,   \
+                                               cs->hw.ix1.hscx, (nr ? 0x40 : 0), ptr, cnt)
 
-#define WRITEHSCXFIFO(cs, nr, ptr, cnt) writefifo(cs->hw.ix1.hscx_ale, \
-               cs->hw.ix1.hscx, (nr ? 0x40 : 0), ptr, cnt)
+#define WRITEHSCXFIFO(cs, nr, ptr, cnt) writefifo(cs->hw.ix1.hscx_ale, \
+                                                 cs->hw.ix1.hscx, (nr ? 0x40 : 0), ptr, cnt)
 
 #include "hscx_irq.c"
 
@@ -132,11 +132,11 @@ ix1micro_interrupt(int intno, void *dev_id)
 
        spin_lock_irqsave(&cs->lock, flags);
        val = readreg(cs->hw.ix1.hscx_ale, cs->hw.ix1.hscx, HSCX_ISTA + 0x40);
-      Start_HSCX:
+Start_HSCX:
        if (val)
                hscx_int_main(cs, val);
        val = readreg(cs->hw.ix1.isac_ale, cs->hw.ix1.isac, ISAC_ISTA);
-      Start_ISAC:
+Start_ISAC:
        if (val)
                isac_interrupt(cs, val);
        val = readreg(cs->hw.ix1.hscx_ale, cs->hw.ix1.hscx, HSCX_ISTA + 0x40);
@@ -188,33 +188,33 @@ ix1_card_msg(struct IsdnCardState *cs, int mt, void *arg)
        u_long flags;
 
        switch (mt) {
-               case CARD_RESET:
-                       spin_lock_irqsave(&cs->lock, flags);
-                       ix1_reset(cs);
-                       spin_unlock_irqrestore(&cs->lock, flags);
-                       return(0);
-               case CARD_RELEASE:
-                       release_io_ix1micro(cs);
-                       return(0);
-               case CARD_INIT:
-                       spin_lock_irqsave(&cs->lock, flags);
-                       ix1_reset(cs);
-                       inithscxisac(cs, 3);
-                       spin_unlock_irqrestore(&cs->lock, flags);
-                       return(0);
-               case CARD_TEST:
-                       return(0);
+       case CARD_RESET:
+               spin_lock_irqsave(&cs->lock, flags);
+               ix1_reset(cs);
+               spin_unlock_irqrestore(&cs->lock, flags);
+               return (0);
+       case CARD_RELEASE:
+               release_io_ix1micro(cs);
+               return (0);
+       case CARD_INIT:
+               spin_lock_irqsave(&cs->lock, flags);
+               ix1_reset(cs);
+               inithscxisac(cs, 3);
+               spin_unlock_irqrestore(&cs->lock, flags);
+               return (0);
+       case CARD_TEST:
+               return (0);
        }
-       return(0);
+       return (0);
 }
 
 #ifdef __ISAPNP__
 static struct isapnp_device_id itk_ids[] __devinitdata = {
        { ISAPNP_VENDOR('I', 'T', 'K'), ISAPNP_FUNCTION(0x25),
-         ISAPNP_VENDOR('I', 'T', 'K'), ISAPNP_FUNCTION(0x25), 
+         ISAPNP_VENDOR('I', 'T', 'K'), ISAPNP_FUNCTION(0x25),
          (unsigned long) "ITK micro 2" },
        { ISAPNP_VENDOR('I', 'T', 'K'), ISAPNP_FUNCTION(0x29),
-         ISAPNP_VENDOR('I', 'T', 'K'), ISAPNP_FUNCTION(0x29), 
+         ISAPNP_VENDOR('I', 'T', 'K'), ISAPNP_FUNCTION(0x29),
          (unsigned long) "ITK micro 2." },
        { 0, }
 };
@@ -238,30 +238,30 @@ setup_ix1micro(struct IsdnCard *card)
 #ifdef __ISAPNP__
        if (!card->para[1] && isapnp_present()) {
                struct pnp_dev *pnp_d;
-               while(ipid->card_vendor) {
+               while (ipid->card_vendor) {
                        if ((pnp_c = pnp_find_card(ipid->card_vendor,
-                               ipid->card_device, pnp_c))) {
+                                                  ipid->card_device, pnp_c))) {
                                pnp_d = NULL;
                                if ((pnp_d = pnp_find_dev(pnp_c,
-                                       ipid->vendor, ipid->function, pnp_d))) {
+                                                         ipid->vendor, ipid->function, pnp_d))) {
                                        int err;
 
                                        printk(KERN_INFO "HiSax: %s detected\n",
-                                               (char *)ipid->driver_data);
+                                              (char *)ipid->driver_data);
                                        pnp_disable_dev(pnp_d);
                                        err = pnp_activate_dev(pnp_d);
-                                       if (err<0) {
+                                       if (err < 0) {
                                                printk(KERN_WARNING "%s: pnp_activate_dev ret(%d)\n",
-                                                       __func__, err);
-                                               return(0);
+                                                      __func__, err);
+                                               return (0);
                                        }
                                        card->para[1] = pnp_port_start(pnp_d, 0);
                                        card->para[0] = pnp_irq(pnp_d, 0);
                                        if (!card->para[0] || !card->para[1]) {
                                                printk(KERN_ERR "ITK PnP:some resources are missing %ld/%lx\n",
-                                                       card->para[0], card->para[1]);
+                                                      card->para[0], card->para[1]);
                                                pnp_disable_dev(pnp_d);
-                                               return(0);
+                                               return (0);
                                        }
                                        break;
                                } else {
@@ -270,10 +270,10 @@ setup_ix1micro(struct IsdnCard *card)
                        }
                        ipid++;
                        pnp_c = NULL;
-               } 
+               }
                if (!ipid->card_vendor) {
                        printk(KERN_INFO "ITK PnP: no ISAPnP card found\n");
-                       return(0);
+                       return (0);
                }
        }
 #endif
@@ -287,15 +287,15 @@ setup_ix1micro(struct IsdnCard *card)
        if (cs->hw.ix1.cfg_reg) {
                if (!request_region(cs->hw.ix1.cfg_reg, 4, "ix1micro cfg")) {
                        printk(KERN_WARNING
-                         "HiSax: ITK ix1-micro Rev.2 config port "
-                         "%x-%x already in use\n",
+                              "HiSax: ITK ix1-micro Rev.2 config port "
+                              "%x-%x already in use\n",
                               cs->hw.ix1.cfg_reg,
                               cs->hw.ix1.cfg_reg + 4);
                        return (0);
                }
        }
        printk(KERN_INFO "HiSax: ITK ix1-micro Rev.2 config irq:%d io:0x%X\n",
-               cs->irq, cs->hw.ix1.cfg_reg);
+              cs->irq, cs->hw.ix1.cfg_reg);
        setup_isac(cs);
        cs->readisac = &ReadISAC;
        cs->writeisac = &WriteISAC;
@@ -309,7 +309,7 @@ setup_ix1micro(struct IsdnCard *card)
        ISACVersion(cs, "ix1-Micro:");
        if (HscxVersion(cs, "ix1-Micro:")) {
                printk(KERN_WARNING
-                   "ix1-Micro: wrong HSCX versions check IO address\n");
+                      "ix1-Micro: wrong HSCX versions check IO address\n");
                release_io_ix1micro(cs);
                return (0);
        }
index a06cea0..f946c58 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Author       Roland Klabunde
  * Copyright    by Roland Klabunde   <R.Klabunde@Berkom.de>
- * 
+ *
  * This software may be used and distributed according to the terms
  * of the GNU General Public License, incorporated herein by reference.
  *
 int
 JadeVersion(struct IsdnCardState *cs, char *s)
 {
-    int ver;
-    int to = 50;
-    cs->BC_Write_Reg(cs, -1, 0x50, 0x19);
-    while (to) {
-       udelay(1);
+       int ver;
+       int to = 50;
+       cs->BC_Write_Reg(cs, -1, 0x50, 0x19);
+       while (to) {
+               udelay(1);
+               ver = cs->BC_Read_Reg(cs, -1, 0x60);
+               to--;
+               if (ver)
+                       break;
+               if (!to) {
+                       printk(KERN_INFO "%s JADE version not obtainable\n", s);
+                       return (0);
+               }
+       }
+       /* Wait for the JADE */
+       udelay(10);
+       /* Read version */
        ver = cs->BC_Read_Reg(cs, -1, 0x60);
-       to--;
-       if (ver)
-           break;
-       if (!to) {
-           printk(KERN_INFO "%s JADE version not obtainable\n", s);
-           return (0);
-        }
-    }
-    /* Wait for the JADE */
-    udelay(10);
-    /* Read version */
-    ver = cs->BC_Read_Reg(cs, -1, 0x60);
-    printk(KERN_INFO "%s JADE version: %d\n", s, ver);
-    return (1);
+       printk(KERN_INFO "%s JADE version: %d\n", s, ver);
+       return (1);
 }
 
 /* Write to indirect accessible jade register set */
 static void
 jade_write_indirect(struct IsdnCardState *cs, u_char reg, u_char value)
 {
-    int to = 50;
-    u_char ret;
+       int to = 50;
+       u_char ret;
 
-    /* Write the data */
-    cs->BC_Write_Reg(cs, -1, COMM_JADE+1, value);
-    /* Say JADE we wanna write indirect reg 'reg' */
-    cs->BC_Write_Reg(cs, -1, COMM_JADE, reg);
-    to = 50;
-    /* Wait for RDY goes high */
-    while (to) {
-       udelay(1);
-       ret = cs->BC_Read_Reg(cs, -1, COMM_JADE);
-       to--;
-       if (ret & 1)
-           /* Got acknowledge */
-           break;
-       if (!to) {
-           printk(KERN_INFO "Can not see ready bit from JADE DSP (reg=0x%X, value=0x%X)\n", reg, value);
-           return;
+       /* Write the data */
+       cs->BC_Write_Reg(cs, -1, COMM_JADE + 1, value);
+       /* Say JADE we wanna write indirect reg 'reg' */
+       cs->BC_Write_Reg(cs, -1, COMM_JADE, reg);
+       to = 50;
+       /* Wait for RDY goes high */
+       while (to) {
+               udelay(1);
+               ret = cs->BC_Read_Reg(cs, -1, COMM_JADE);
+               to--;
+               if (ret & 1)
+                       /* Got acknowledge */
+                       break;
+               if (!to) {
+                       printk(KERN_INFO "Can not see ready bit from JADE DSP (reg=0x%X, value=0x%X)\n", reg, value);
+                       return;
+               }
        }
-    }
 }
 
 
@@ -77,67 +77,67 @@ jade_write_indirect(struct IsdnCardState *cs, u_char reg, u_char value)
 static void
 modejade(struct BCState *bcs, int mode, int bc)
 {
-    struct IsdnCardState *cs = bcs->cs;
-    int jade = bcs->hw.hscx.hscx;
+       struct IsdnCardState *cs = bcs->cs;
+       int jade = bcs->hw.hscx.hscx;
 
-    if (cs->debug & L1_DEB_HSCX) {
-       char tmp[40];
-       sprintf(tmp, "jade %c mode %d ichan %d",
-               'A' + jade, mode, bc);
-       debugl1(cs, tmp);
-    }
-    bcs->mode = mode;
-    bcs->channel = bc;
-       
-    cs->BC_Write_Reg(cs, jade, jade_HDLC_MODE, (mode == L1_MODE_TRANS ? jadeMODE_TMO:0x00));
-    cs->BC_Write_Reg(cs, jade, jade_HDLC_CCR0, (jadeCCR0_PU|jadeCCR0_ITF));
-    cs->BC_Write_Reg(cs, jade, jade_HDLC_CCR1, 0x00);
+       if (cs->debug & L1_DEB_HSCX) {
+               char tmp[40];
+               sprintf(tmp, "jade %c mode %d ichan %d",
+                       'A' + jade, mode, bc);
+               debugl1(cs, tmp);
+       }
+       bcs->mode = mode;
+       bcs->channel = bc;
 
-    jade_write_indirect(cs, jade_HDLC1SERRXPATH, 0x08);
-    jade_write_indirect(cs, jade_HDLC2SERRXPATH, 0x08);
-    jade_write_indirect(cs, jade_HDLC1SERTXPATH, 0x00);
-    jade_write_indirect(cs, jade_HDLC2SERTXPATH, 0x00);
+       cs->BC_Write_Reg(cs, jade, jade_HDLC_MODE, (mode == L1_MODE_TRANS ? jadeMODE_TMO : 0x00));
+       cs->BC_Write_Reg(cs, jade, jade_HDLC_CCR0, (jadeCCR0_PU | jadeCCR0_ITF));
+       cs->BC_Write_Reg(cs, jade, jade_HDLC_CCR1, 0x00);
 
-    cs->BC_Write_Reg(cs, jade, jade_HDLC_XCCR, 0x07);
-    cs->BC_Write_Reg(cs, jade, jade_HDLC_RCCR, 0x07);
+       jade_write_indirect(cs, jade_HDLC1SERRXPATH, 0x08);
+       jade_write_indirect(cs, jade_HDLC2SERRXPATH, 0x08);
+       jade_write_indirect(cs, jade_HDLC1SERTXPATH, 0x00);
+       jade_write_indirect(cs, jade_HDLC2SERTXPATH, 0x00);
 
-    if (bc == 0) {
-       cs->BC_Write_Reg(cs, jade, jade_HDLC_TSAX, 0x00);
-       cs->BC_Write_Reg(cs, jade, jade_HDLC_TSAR, 0x00);
-    } else {
-       cs->BC_Write_Reg(cs, jade, jade_HDLC_TSAX, 0x04);
-       cs->BC_Write_Reg(cs, jade, jade_HDLC_TSAR, 0x04);
-    }
-    switch (mode) {
+       cs->BC_Write_Reg(cs, jade, jade_HDLC_XCCR, 0x07);
+       cs->BC_Write_Reg(cs, jade, jade_HDLC_RCCR, 0x07);
+
+       if (bc == 0) {
+               cs->BC_Write_Reg(cs, jade, jade_HDLC_TSAX, 0x00);
+               cs->BC_Write_Reg(cs, jade, jade_HDLC_TSAR, 0x00);
+       } else {
+               cs->BC_Write_Reg(cs, jade, jade_HDLC_TSAX, 0x04);
+               cs->BC_Write_Reg(cs, jade, jade_HDLC_TSAR, 0x04);
+       }
+       switch (mode) {
        case (L1_MODE_NULL):
                cs->BC_Write_Reg(cs, jade, jade_HDLC_MODE, jadeMODE_TMO);
                break;
        case (L1_MODE_TRANS):
-               cs->BC_Write_Reg(cs, jade, jade_HDLC_MODE, (jadeMODE_TMO|jadeMODE_RAC|jadeMODE_XAC));
+               cs->BC_Write_Reg(cs, jade, jade_HDLC_MODE, (jadeMODE_TMO | jadeMODE_RAC | jadeMODE_XAC));
                break;
        case (L1_MODE_HDLC):
-               cs->BC_Write_Reg(cs, jade, jade_HDLC_MODE, (jadeMODE_RAC|jadeMODE_XAC));
+               cs->BC_Write_Reg(cs, jade, jade_HDLC_MODE, (jadeMODE_RAC | jadeMODE_XAC));
                break;
-    }
-    if (mode) {
-       cs->BC_Write_Reg(cs, jade, jade_HDLC_RCMD, (jadeRCMD_RRES|jadeRCMD_RMC));
-       cs->BC_Write_Reg(cs, jade, jade_HDLC_XCMD, jadeXCMD_XRES);
-       /* Unmask ints */
-       cs->BC_Write_Reg(cs, jade, jade_HDLC_IMR, 0xF8);
-    }
-    else
-       /* Mask ints */
-       cs->BC_Write_Reg(cs, jade, jade_HDLC_IMR, 0x00);
+       }
+       if (mode) {
+               cs->BC_Write_Reg(cs, jade, jade_HDLC_RCMD, (jadeRCMD_RRES | jadeRCMD_RMC));
+               cs->BC_Write_Reg(cs, jade, jade_HDLC_XCMD, jadeXCMD_XRES);
+               /* Unmask ints */
+               cs->BC_Write_Reg(cs, jade, jade_HDLC_IMR, 0xF8);
+       }
+       else
+               /* Mask ints */
+               cs->BC_Write_Reg(cs, jade, jade_HDLC_IMR, 0x00);
 }
 
 static void
 jade_l2l1(struct PStack *st, int pr, void *arg)
 {
-    struct BCState *bcs = st->l1.bcs;
-    struct sk_buff *skb = arg;
-    u_long flags;
+       struct BCState *bcs = st->l1.bcs;
+       struct sk_buff *skb = arg;
+       u_long flags;
 
-    switch (pr) {
+       switch (pr) {
        case (PH_DATA | REQUEST):
                spin_lock_irqsave(&bcs->cs->lock, flags);
                if (bcs->tx_skb) {
@@ -164,10 +164,10 @@ jade_l2l1(struct PStack *st, int pr, void *arg)
                break;
        case (PH_PULL | REQUEST):
                if (!bcs->tx_skb) {
-                   test_and_clear_bit(FLG_L1_PULL_REQ, &st->l1.Flags);
-                   st->l1.l1l2(st, PH_PULL | CONFIRM, NULL);
+                       test_and_clear_bit(FLG_L1_PULL_REQ, &st->l1.Flags);
+                       st->l1.l1l2(st, PH_PULL | CONFIRM, NULL);
                } else
-                   test_and_set_bit(FLG_L1_PULL_REQ, &st->l1.Flags);
+                       test_and_set_bit(FLG_L1_PULL_REQ, &st->l1.Flags);
                break;
        case (PH_ACTIVATE | REQUEST):
                spin_lock_irqsave(&bcs->cs->lock, flags);
@@ -187,26 +187,26 @@ jade_l2l1(struct PStack *st, int pr, void *arg)
                spin_unlock_irqrestore(&bcs->cs->lock, flags);
                st->l1.l1l2(st, PH_DEACTIVATE | CONFIRM, NULL);
                break;
-    }
+       }
 }
 
 static void
 close_jadestate(struct BCState *bcs)
 {
-    modejade(bcs, 0, bcs->channel);
-    if (test_and_clear_bit(BC_FLG_INIT, &bcs->Flag)) {
-       kfree(bcs->hw.hscx.rcvbuf);
-       bcs->hw.hscx.rcvbuf = NULL;
-       kfree(bcs->blog);
-       bcs->blog = NULL;
-       skb_queue_purge(&bcs->rqueue);
-       skb_queue_purge(&bcs->squeue);
-       if (bcs->tx_skb) {
-               dev_kfree_skb_any(bcs->tx_skb);
-               bcs->tx_skb = NULL;
-               test_and_clear_bit(BC_FLG_BUSY, &bcs->Flag);
+       modejade(bcs, 0, bcs->channel);
+       if (test_and_clear_bit(BC_FLG_INIT, &bcs->Flag)) {
+               kfree(bcs->hw.hscx.rcvbuf);
+               bcs->hw.hscx.rcvbuf = NULL;
+               kfree(bcs->blog);
+               bcs->blog = NULL;
+               skb_queue_purge(&bcs->rqueue);
+               skb_queue_purge(&bcs->squeue);
+               if (bcs->tx_skb) {
+                       dev_kfree_skb_any(bcs->tx_skb);
+                       bcs->tx_skb = NULL;
+                       test_and_clear_bit(BC_FLG_BUSY, &bcs->Flag);
+               }
        }
-    }
 }
 
 static int
@@ -221,7 +221,7 @@ open_jadestate(struct IsdnCardState *cs, struct BCState *bcs)
                }
                if (!(bcs->blog = kmalloc(MAX_BLOG_SPACE, GFP_ATOMIC))) {
                        printk(KERN_WARNING
-                               "HiSax: No memory for bcs->blog\n");
+                              "HiSax: No memory for bcs->blog\n");
                        test_and_clear_bit(BC_FLG_INIT, &bcs->Flag);
                        kfree(bcs->hw.hscx.rcvbuf);
                        bcs->hw.hscx.rcvbuf = NULL;
@@ -303,12 +303,11 @@ initjade(struct IsdnCardState *cs)
        cs->BC_Write_Reg(cs, 0, jade_HDLC_IMR,  0x00);
        cs->BC_Write_Reg(cs, 1, jade_HDLC_IMR,  0x00);
        /* Setup host access to hdlc controller */
-       jade_write_indirect(cs, jade_HDLCCNTRACCESS, (jadeINDIRECT_HAH1|jadeINDIRECT_HAH2));
+       jade_write_indirect(cs, jade_HDLCCNTRACCESS, (jadeINDIRECT_HAH1 | jadeINDIRECT_HAH2));
        /* Unmask HDLC int (don't forget DSP int later on)*/
-       cs->BC_Write_Reg(cs, -1,jade_INT, (jadeINT_HDLC1|jadeINT_HDLC2));
+       cs->BC_Write_Reg(cs, -1, jade_INT, (jadeINT_HDLC1 | jadeINT_HDLC2));
 
-       /* once again TRANSPARENT */    
+       /* once again TRANSPARENT */
        modejade(cs->bcs, 0, 0);
        modejade(cs->bcs + 1, 0, 0);
 }
-
index 29055e1..4b98096 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Author       Roland Klabunde
  * Copyright    by Roland Klabunde   <R.Klabunde@Berkom.de>
- * 
+ *
  * This software may be used and distributed according to the terms
  * of the GNU General Public License, incorporated herein by reference.
  *
 
 /* Special registers for access to indirect accessible JADE regs */
 #define        DIRECT_IO_JADE  0x0000  /* Jade direct io access area */
-#define        COMM_JADE       0x0040  /* Jade communication area */           
+#define        COMM_JADE       0x0040  /* Jade communication area */
 
 /********************************************************************/
-/* JADE-HDLC registers                                                                                     */
+/* JADE-HDLC registers                                                                             */
 /********************************************************************/
-#define jade_HDLC_RFIFO                                        0x00                               /* R */
-#define jade_HDLC_XFIFO                                        0x00                               /* W */
-
-#define        jade_HDLC_STAR                                  0x20                               /* R */
-       #define jadeSTAR_XDOV                           0x80
-       #define jadeSTAR_XFW                            0x40 /* Does not work*/
-       #define jadeSTAR_XCEC                           0x20
-       #define jadeSTAR_RCEC                           0x10
-       #define jadeSTAR_BSY                            0x08
-       #define jadeSTAR_RNA                            0x04
-       #define jadeSTAR_STR                            0x02
-       #define jadeSTAR_STX                            0x01
-
-#define        jade_HDLC_XCMD                                  0x20                               /* W */
-       #define jadeXCMD_XF                             0x80
-       #define jadeXCMD_XME                            0x40
-       #define jadeXCMD_XRES                           0x20
-       #define jadeXCMD_STX                            0x01
-
-#define        jade_HDLC_RSTA                                  0x21                               /* R */
-    #define    jadeRSTA_VFR                            0x80
-    #define    jadeRSTA_RDO                            0x40
-    #define    jadeRSTA_CRC                            0x20
-    #define    jadeRSTA_RAB                            0x10
-    #define    jadeRSTA_MASK                           0xF0
+#define jade_HDLC_RFIFO                                        0x00                               /* R */
+#define jade_HDLC_XFIFO                                        0x00                               /* W */
+
+#define        jade_HDLC_STAR                                  0x20                               /* R */
+#define        jadeSTAR_XDOV                           0x80
+#define        jadeSTAR_XFW                            0x40 /* Does not work*/
+#define        jadeSTAR_XCEC                           0x20
+#define        jadeSTAR_RCEC                           0x10
+#define        jadeSTAR_BSY                            0x08
+#define        jadeSTAR_RNA                            0x04
+#define        jadeSTAR_STR                            0x02
+#define        jadeSTAR_STX                            0x01
+
+#define        jade_HDLC_XCMD                                  0x20                               /* W */
+#define        jadeXCMD_XF                             0x80
+#define        jadeXCMD_XME                            0x40
+#define        jadeXCMD_XRES                           0x20
+#define        jadeXCMD_STX                            0x01
+
+#define        jade_HDLC_RSTA                                  0x21                               /* R */
+#define        jadeRSTA_VFR                            0x80
+#define        jadeRSTA_RDO                            0x40
+#define        jadeRSTA_CRC                            0x20
+#define        jadeRSTA_RAB                            0x10
+#define        jadeRSTA_MASK                           0xF0
 
 #define        jade_HDLC_MODE                                  0x22                               /* RW*/
-    #define    jadeMODE_TMO                            0x80
-    #define    jadeMODE_RAC                            0x40
-    #define    jadeMODE_XAC                            0x20
-    #define    jadeMODE_TLP                            0x10
-    #define    jadeMODE_ERFS                           0x02
-    #define    jadeMODE_ETFS                           0x01
+#define        jadeMODE_TMO                            0x80
+#define        jadeMODE_RAC                            0x40
+#define        jadeMODE_XAC                            0x20
+#define        jadeMODE_TLP                            0x10
+#define        jadeMODE_ERFS                           0x02
+#define        jadeMODE_ETFS                           0x01
 
 #define        jade_HDLC_RBCH                                  0x24                               /* R */
 
-#define        jade_HDLC_RBCL                                  0x25                               /* R */
-#define        jade_HDLC_RCMD                                  0x25                               /* W */
-       #define jadeRCMD_RMC                            0x80
-       #define jadeRCMD_RRES                           0x40
-       #define jadeRCMD_RMD                            0x20
-       #define jadeRCMD_STR                            0x02
+#define        jade_HDLC_RBCL                                  0x25                               /* R */
+#define        jade_HDLC_RCMD                                  0x25                               /* W */
+#define        jadeRCMD_RMC                            0x80
+#define        jadeRCMD_RRES                           0x40
+#define        jadeRCMD_RMD                            0x20
+#define        jadeRCMD_STR                            0x02
 
 #define        jade_HDLC_CCR0                                  0x26                               /* RW*/
-       #define jadeCCR0_PU                             0x80
-       #define jadeCCR0_ITF                            0x40
-       #define jadeCCR0_C32                            0x20
-       #define jadeCCR0_CRL                            0x10
-       #define jadeCCR0_RCRC                           0x08
-       #define jadeCCR0_XCRC                           0x04
-       #define jadeCCR0_RMSB                           0x02
-       #define jadeCCR0_XMSB                           0x01
+#define        jadeCCR0_PU                             0x80
+#define        jadeCCR0_ITF                            0x40
+#define        jadeCCR0_C32                            0x20
+#define        jadeCCR0_CRL                            0x10
+#define        jadeCCR0_RCRC                           0x08
+#define        jadeCCR0_XCRC                           0x04
+#define        jadeCCR0_RMSB                           0x02
+#define        jadeCCR0_XMSB                           0x01
 
 #define        jade_HDLC_CCR1                                  0x27                               /* RW*/
-    #define    jadeCCR1_RCS0                           0x80
-    #define    jadeCCR1_RCONT                          0x40
-    #define    jadeCCR1_RFDIS                          0x20
-    #define    jadeCCR1_XCS0                           0x10
-    #define    jadeCCR1_XCONT                          0x08
-    #define    jadeCCR1_XFDIS                          0x04
+#define        jadeCCR1_RCS0                           0x80
+#define        jadeCCR1_RCONT                          0x40
+#define        jadeCCR1_RFDIS                          0x20
+#define        jadeCCR1_XCS0                           0x10
+#define        jadeCCR1_XCONT                          0x08
+#define        jadeCCR1_XFDIS                          0x04
 
 #define        jade_HDLC_TSAR                                  0x28                               /* RW*/
 #define        jade_HDLC_TSAX                                  0x29                               /* RW*/
 #define        jade_HDLC_RCCR                                  0x2A                               /* RW*/
 #define        jade_HDLC_XCCR                                  0x2B                               /* RW*/
 
-#define        jade_HDLC_ISR                                   0x2C                               /* R */
-#define        jade_HDLC_IMR                                   0x2C                               /* W */
-       #define jadeISR_RME                                     0x80
-       #define jadeISR_RPF                                     0x40
-       #define jadeISR_RFO                                     0x20
-       #define jadeISR_XPR                                     0x10
-       #define jadeISR_XDU                                     0x08
-       #define jadeISR_ALLS                            0x04
-
-#define jade_INT                               0x75
-    #define jadeINT_HDLC1                      0x02
-    #define jadeINT_HDLC2                      0x01
-    #define jadeINT_DSP                                0x04
-#define jade_INTR                              0x70
+#define        jade_HDLC_ISR                                   0x2C                               /* R */
+#define        jade_HDLC_IMR                                   0x2C                               /* W */
+#define        jadeISR_RME                                     0x80
+#define        jadeISR_RPF                                     0x40
+#define        jadeISR_RFO                                     0x20
+#define        jadeISR_XPR                                     0x10
+#define        jadeISR_XDU                                     0x08
+#define        jadeISR_ALLS                            0x04
+
+#define jade_INT                               0x75
+#define jadeINT_HDLC1                          0x02
+#define jadeINT_HDLC2                          0x01
+#define jadeINT_DSP                            0x04
+#define jade_INTR                              0x70
 
 /********************************************************************/
-/* Indirect accessible JADE registers of common interest                       */
+/* Indirect accessible JADE registers of common interest                       */
 /********************************************************************/
 #define        jade_CHIPVERSIONNR                              0x00 /* Does not work*/
 
-#define        jade_HDLCCNTRACCESS                             0x10            
-       #define jadeINDIRECT_HAH1                       0x02
-       #define jadeINDIRECT_HAH2                       0x01
+#define        jade_HDLCCNTRACCESS                             0x10
+#define        jadeINDIRECT_HAH1                       0x02
+#define        jadeINDIRECT_HAH2                       0x01
 
 #define        jade_HDLC1SERRXPATH                             0x1D
 #define        jade_HDLC1SERTXPATH                             0x1E
 #define        jade_HDLC2SERRXPATH                             0x1F
 #define        jade_HDLC2SERTXPATH                             0x20
-       #define jadeINDIRECT_SLIN1                      0x10
-       #define jadeINDIRECT_SLIN0                      0x08
-       #define jadeINDIRECT_LMOD1                      0x04
-       #define jadeINDIRECT_LMOD0                      0x02
-       #define jadeINDIRECT_HHR                        0x01
-       #define jadeINDIRECT_HHX                        0x01
+#define        jadeINDIRECT_SLIN1                      0x10
+#define        jadeINDIRECT_SLIN0                      0x08
+#define        jadeINDIRECT_LMOD1                      0x04
+#define        jadeINDIRECT_LMOD0                      0x02
+#define        jadeINDIRECT_HHR                        0x01
+#define        jadeINDIRECT_HHX                        0x01
 
 #define        jade_RXAUDIOCH1CFG                              0x11
 #define        jade_RXAUDIOCH2CFG                              0x14
index 1f201af..f521fc8 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Author       Roland Klabunde
  * Copyright    by Roland Klabunde   <R.Klabunde@Berkom.de>
- * 
+ *
  * This software may be used and distributed according to the terms
  * of the GNU General Public License, incorporated herein by reference.
  *
 static inline void
 waitforCEC(struct IsdnCardState *cs, int jade, int reg)
 {
-       int to = 50;
-       int mask = (reg == jade_HDLC_XCMD ? jadeSTAR_XCEC : jadeSTAR_RCEC);
-       while ((READJADE(cs, jade, jade_HDLC_STAR) & mask) && to) {
-               udelay(1);
-               to--;
-       }
-       if (!to)
-               printk(KERN_WARNING "HiSax: waitforCEC (jade) timeout\n");
+       int to = 50;
+       int mask = (reg == jade_HDLC_XCMD ? jadeSTAR_XCEC : jadeSTAR_RCEC);
+       while ((READJADE(cs, jade, jade_HDLC_STAR) & mask) && to) {
+               udelay(1);
+               to--;
+       }
+       if (!to)
+               printk(KERN_WARNING "HiSax: waitforCEC (jade) timeout\n");
 }
 
 
 static inline void
 waitforXFW(struct IsdnCardState *cs, int jade)
 {
-       /* Does not work on older jade versions, don't care */
+       /* Does not work on older jade versions, don't care */
 }
 
 static inline void
@@ -98,7 +98,7 @@ jade_fill_fifo(struct BCState *bcs)
        bcs->tx_cnt -= count;
        bcs->hw.hscx.count += count;
        WRITEJADEFIFO(cs, bcs->hw.hscx.hscx, ptr, count);
-       WriteJADECMDR(cs, bcs->hw.hscx.hscx, jade_HDLC_XCMD, more ? jadeXCMD_XF : (jadeXCMD_XF|jadeXCMD_XME));
+       WriteJADECMDR(cs, bcs->hw.hscx.hscx, jade_HDLC_XCMD, more ? jadeXCMD_XF : (jadeXCMD_XF | jadeXCMD_XME));
        if (cs->debug & L1_DEB_HSCX_FIFO) {
                char *t = bcs->blog;
 
@@ -119,7 +119,7 @@ jade_interrupt(struct IsdnCardState *cs, u_char val, u_char jade)
        int fifo_size = 32;
        int count;
        int i_jade = (int) jade; /* To satisfy the compiler */
-       
+
        if (!test_bit(BC_FLG_INIT, &bcs->Flag))
                return;
 
@@ -128,13 +128,13 @@ jade_interrupt(struct IsdnCardState *cs, u_char val, u_char jade)
                if ((r & 0xf0) != 0xa0) {
                        if (!(r & 0x80))
                                if (cs->debug & L1_DEB_WARN)
-                                       debugl1(cs, "JADE %s invalid frame", (jade ? "B":"A"));
+                                       debugl1(cs, "JADE %s invalid frame", (jade ? "B" : "A"));
                        if ((r & 0x40) && bcs->mode)
                                if (cs->debug & L1_DEB_WARN)
-                                       debugl1(cs, "JADE %c RDO mode=%d", 'A'+jade, bcs->mode);
+                                       debugl1(cs, "JADE %c RDO mode=%d", 'A' + jade, bcs->mode);
                        if (!(r & 0x20))
                                if (cs->debug & L1_DEB_WARN)
-                                       debugl1(cs, "JADE %c CRC error", 'A'+jade);
+                                       debugl1(cs, "JADE %c CRC error", 'A' + jade);
                        WriteJADECMDR(cs, jade, jade_HDLC_RCMD, jadeRCMD_RMC);
                } else {
                        count = READJADE(cs, i_jade, jade_HDLC_RBCL) & 0x1F;
@@ -145,7 +145,7 @@ jade_interrupt(struct IsdnCardState *cs, u_char val, u_char jade)
                                if (cs->debug & L1_DEB_HSCX_FIFO)
                                        debugl1(cs, "HX Frame %d", count);
                                if (!(skb = dev_alloc_skb(count)))
-                                       printk(KERN_WARNING "JADE %s receive out of memory\n", (jade ? "B":"A"));
+                                       printk(KERN_WARNING "JADE %s receive out of memory\n", (jade ? "B" : "A"));
                                else {
                                        memcpy(skb_put(skb, count), bcs->hw.hscx.rcvbuf, count);
                                        skb_queue_tail(&bcs->rqueue, skb);
@@ -175,8 +175,8 @@ jade_interrupt(struct IsdnCardState *cs, u_char val, u_char jade)
                                jade_fill_fifo(bcs);
                                return;
                        } else {
-                               if (test_bit(FLG_LLI_L1WAKEUP,&bcs->st->lli.flag) &&
-                                       (PACKET_NOACK != bcs->tx_skb->pkt_type)) {
+                               if (test_bit(FLG_LLI_L1WAKEUP, &bcs->st->lli.flag) &&
+                                   (PACKET_NOACK != bcs->tx_skb->pkt_type)) {
                                        u_long  flags;
                                        spin_lock_irqsave(&bcs->aclock, flags);
                                        bcs->ackcnt += bcs->hw.hscx.count;
@@ -204,7 +204,7 @@ jade_int_main(struct IsdnCardState *cs, u_char val, int jade)
 {
        struct BCState *bcs;
        bcs = cs->bcs + jade;
-       
+
        if (val & jadeISR_RFO) {
                /* handled with RDO */
                val &= ~jadeISR_RFO;
@@ -216,21 +216,21 @@ jade_int_main(struct IsdnCardState *cs, u_char val, int jade)
                        jade_fill_fifo(bcs);
                else {
                        /* Here we lost an TX interrupt, so
-                          * restart transmitting the whole frame.
+                        * restart transmitting the whole frame.
                         */
                        if (bcs->tx_skb) {
-                               skb_push(bcs->tx_skb, bcs->hw.hscx.count);
+                               skb_push(bcs->tx_skb, bcs->hw.hscx.count);
                                bcs->tx_cnt += bcs->hw.hscx.count;
                                bcs->hw.hscx.count = 0;
                        }
                        WriteJADECMDR(cs, bcs->hw.hscx.hscx, jade_HDLC_XCMD, jadeXCMD_XRES);
                        if (cs->debug & L1_DEB_WARN)
-                               debugl1(cs, "JADE %c EXIR %x Lost TX", 'A'+jade, val);
+                               debugl1(cs, "JADE %c EXIR %x Lost TX", 'A' + jade, val);
                }
        }
-       if (val & (jadeISR_RME|jadeISR_RPF|jadeISR_XPR)) {
+       if (val & (jadeISR_RME | jadeISR_RPF | jadeISR_XPR)) {
                if (cs->debug & L1_DEB_HSCX)
-                       debugl1(cs, "JADE %c interrupt %x", 'A'+jade, val);
+                       debugl1(cs, "JADE %c interrupt %x", 'A' + jade, val);
                jade_interrupt(cs, val, jade);
        }
 }
index ee4dae1..4c1bca5 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Author       Karsten Keil
  * Copyright    by Karsten Keil      <keil@isdn4linux.de>
- * 
+ *
  * This software may be used and distributed according to the terms
  * of the GNU General Public License, incorporated herein by reference.
  *
 extern char *HiSax_getrev(const char *revision);
 static const char *l3_1tr6_revision = "$Revision: 2.15.2.3 $";
 
-#define MsgHead(ptr, cref, mty, dis) \
-       *ptr++ = dis; \
-       *ptr++ = 0x1; \
-       *ptr++ = cref ^ 0x80; \
+#define MsgHead(ptr, cref, mty, dis)           \
+       *ptr++ = dis;                           \
+       *ptr++ = 0x1;                           \
+       *ptr++ = cref ^ 0x80;                   \
        *ptr++ = mty
 
 static void
@@ -83,23 +83,23 @@ l3_1tr6_setup_req(struct l3_process *pc, u_char pr, void *arg)
        pc->para.spv = 0;
        if (!isdigit(*teln)) {
                switch (0x5f & *teln) {
-                       case 'S':
-                               pc->para.spv = 1;
-                               break;
-                       case 'C':
-                               channel = 0x08;
-                       case 'P':
-                               channel |= 0x80;
-                               teln++;
-                               if (*teln == '1')
-                                       channel |= 0x01;
-                               else
-                                       channel |= 0x02;
-                               break;
-                       default:
-                               if (pc->st->l3.debug & L3_DEB_WARN)
-                                       l3_debug(pc->st, "Wrong MSN Code");
-                               break;
+               case 'S':
+                       pc->para.spv = 1;
+                       break;
+               case 'C':
+                       channel = 0x08;
+               case 'P':
+                       channel |= 0x80;
+                       teln++;
+                       if (*teln == '1')
+                               channel |= 0x01;
+                       else
+                               channel |= 0x02;
+                       break;
+               default:
+                       if (pc->st->l3.debug & L3_DEB_WARN)
+                               l3_debug(pc->st, "Wrong MSN Code");
+                       break;
                }
                teln++;
        }
@@ -176,7 +176,7 @@ l3_1tr6_setup(struct l3_process *pc, u_char pr, void *arg)
                        return;
                }
                if ((pc->para.bchannel = p[2] & 0x3))
-                               bcfound++;
+                       bcfound++;
        } else {
                l3_1tr6_error(pc, "missing setup chanID", skb);
                return;
@@ -525,15 +525,15 @@ l3_1tr6_disconnect_req(struct l3_process *pc, u_char pr, void *arg)
                cause = pc->para.cause;
        /* Map DSS1 causes */
        switch (cause & 0x7f) {
-               case 0x10:
-                       clen = 0;
-                       break;
-                case 0x11:
-                        cause = CAUSE_UserBusy;
-                        break;
-               case 0x15:
-                       cause = CAUSE_CallRejected;
-                       break;
+       case 0x10:
+               clen = 0;
+               break;
+       case 0x11:
+               cause = CAUSE_UserBusy;
+               break;
+       case 0x15:
+               cause = CAUSE_CallRejected;
+               break;
        }
        StopAllL3Timer(pc);
        MsgHead(p, pc->callref, MT_N1_DISC, PROTO_DIS_N1);
@@ -588,12 +588,12 @@ l3_1tr6_t305(struct l3_process *pc, u_char pr, void *arg)
                cause = pc->para.cause;
        /* Map DSS1 causes */
        switch (cause & 0x7f) {
-               case 0x10:
-                       clen = 0;
-                       break;
-               case 0x15:
-                       cause = CAUSE_CallRejected;
-                       break;
+       case 0x10:
+               clen = 0;
+               break;
+       case 0x15:
+               cause = CAUSE_CallRejected;
+               break;
        }
        MsgHead(p, pc->callref, MT_N1_REL, PROTO_DIS_N1);
        *p++ = WE0_cause;
@@ -647,19 +647,19 @@ l3_1tr6_t308_2(struct l3_process *pc, u_char pr, void *arg)
 static void
 l3_1tr6_dl_reset(struct l3_process *pc, u_char pr, void *arg)
 {
-        pc->para.cause = CAUSE_LocalProcErr;
-        l3_1tr6_disconnect_req(pc, pr, NULL);
-        pc->st->l3.l3l4(pc->st, CC_SETUP_ERR, pc);
+       pc->para.cause = CAUSE_LocalProcErr;
+       l3_1tr6_disconnect_req(pc, pr, NULL);
+       pc->st->l3.l3l4(pc->st, CC_SETUP_ERR, pc);
 }
 
 static void
 l3_1tr6_dl_release(struct l3_process *pc, u_char pr, void *arg)
 {
-        newl3state(pc, 0);
-        pc->para.cause = 0x1b;          /* Destination out of order */
-        pc->para.loc = 0;
-        pc->st->l3.l3l4(pc->st, CC_RELEASE | INDICATION, pc);
-        release_l3_process(pc);
+       newl3state(pc, 0);
+       pc->para.cause = 0x1b;          /* Destination out of order */
+       pc->para.loc = 0;
+       pc->st->l3.l3l4(pc->st, CC_RELEASE | INDICATION, pc);
+       release_l3_process(pc);
 }
 
 /* *INDENT-OFF* */
@@ -667,9 +667,9 @@ static struct stateentry downstl[] =
 {
        {SBIT(0),
         CC_SETUP | REQUEST, l3_1tr6_setup_req},
-       {SBIT(1) | SBIT(2) | SBIT(3) | SBIT(4) | SBIT(6) | SBIT(7) | SBIT(8) |
-        SBIT(10),
-        CC_DISCONNECT | REQUEST, l3_1tr6_disconnect_req},
+       {SBIT(1) | SBIT(2) | SBIT(3) | SBIT(4) | SBIT(6) | SBIT(7) | SBIT(8) |
+        SBIT(10),
+        CC_DISCONNECT | REQUEST, l3_1tr6_disconnect_req},
        {SBIT(12),
         CC_RELEASE | REQUEST, l3_1tr6_release_req},
        {SBIT(6),
@@ -732,12 +732,12 @@ static struct stateentry datastln1[] =
 
 static struct stateentry manstatelist[] =
 {
-        {SBIT(2),
-         DL_ESTABLISH | INDICATION, l3_1tr6_dl_reset},
-        {ALL_STATES,
-         DL_RELEASE | INDICATION, l3_1tr6_dl_release},
+       {SBIT(2),
+        DL_ESTABLISH | INDICATION, l3_1tr6_dl_reset},
+       {ALL_STATES,
+        DL_RELEASE | INDICATION, l3_1tr6_dl_release},
 };
+
 /* *INDENT-ON* */
 
 static void
@@ -749,16 +749,16 @@ up1tr6(struct PStack *st, int pr, void *arg)
        char tmp[80];
 
        switch (pr) {
-               case (DL_DATA | INDICATION):
-               case (DL_UNIT_DATA | INDICATION):
-                       break;
-               case (DL_ESTABLISH | CONFIRM):
-               case (DL_ESTABLISH | INDICATION):
-               case (DL_RELEASE | INDICATION):
-               case (DL_RELEASE | CONFIRM):
-                       l3_msg(st, pr, arg);
-                       return;
-                       break;
+       case (DL_DATA | INDICATION):
+       case (DL_UNIT_DATA | INDICATION):
+               break;
+       case (DL_ESTABLISH | CONFIRM):
+       case (DL_ESTABLISH | INDICATION):
+       case (DL_RELEASE | INDICATION):
+       case (DL_RELEASE | CONFIRM):
+               l3_msg(st, pr, arg);
+               return;
+               break;
        }
        if (skb->len < 4) {
                if (st->l3.debug & L3_DEB_PROTERR) {
@@ -792,12 +792,12 @@ up1tr6(struct PStack *st, int pr, void *arg)
                dev_kfree_skb(skb);
                if (st->l3.debug & L3_DEB_STATE) {
                        sprintf(tmp, "up1tr6%s N0 mt %x unhandled",
-                            (pr == (DL_DATA | INDICATION)) ? " " : "(broadcast) ", mt);
+                               (pr == (DL_DATA | INDICATION)) ? " " : "(broadcast) ", mt);
                        l3_debug(st, tmp);
                }
        } else if (skb->data[0] == PROTO_DIS_N1) {
                if (!(proc = getl3proc(st, cr))) {
-                       if (mt == MT_N1_SETUP) { 
+                       if (mt == MT_N1_SETUP) {
                                if (cr < 128) {
                                        if (!(proc = new_l3_process(st, cr))) {
                                                if (st->l3.debug & L3_DEB_PROTERR) {
@@ -812,10 +812,10 @@ up1tr6(struct PStack *st, int pr, void *arg)
                                        return;
                                }
                        } else if ((mt == MT_N1_REL) || (mt == MT_N1_REL_ACK) ||
-                               (mt == MT_N1_CANC_ACK) || (mt == MT_N1_CANC_REJ) ||
-                               (mt == MT_N1_REG_ACK) || (mt == MT_N1_REG_REJ) ||
-                               (mt == MT_N1_SUSP_ACK) || (mt == MT_N1_RES_REJ) ||
-                               (mt == MT_N1_INFO)) {
+                                  (mt == MT_N1_CANC_ACK) || (mt == MT_N1_CANC_REJ) ||
+                                  (mt == MT_N1_REG_ACK) || (mt == MT_N1_REG_REJ) ||
+                                  (mt == MT_N1_SUSP_ACK) || (mt == MT_N1_RES_REJ) ||
+                                  (mt == MT_N1_INFO)) {
                                dev_kfree_skb(skb);
                                return;
                        } else {
@@ -838,7 +838,7 @@ up1tr6(struct PStack *st, int pr, void *arg)
                        dev_kfree_skb(skb);
                        if (st->l3.debug & L3_DEB_STATE) {
                                sprintf(tmp, "up1tr6%sstate %d mt %x unhandled",
-                                 (pr == (DL_DATA | INDICATION)) ? " " : "(broadcast) ",
+                                       (pr == (DL_DATA | INDICATION)) ? " " : "(broadcast) ",
                                        proc->state, mt);
                                l3_debug(st, tmp);
                        }
@@ -846,7 +846,7 @@ up1tr6(struct PStack *st, int pr, void *arg)
                } else {
                        if (st->l3.debug & L3_DEB_STATE) {
                                sprintf(tmp, "up1tr6%sstate %d mt %x",
-                                 (pr == (DL_DATA | INDICATION)) ? " " : "(broadcast) ",
+                                       (pr == (DL_DATA | INDICATION)) ? " " : "(broadcast) ",
                                        proc->state, mt);
                                l3_debug(st, tmp);
                        }
@@ -863,7 +863,7 @@ down1tr6(struct PStack *st, int pr, void *arg)
        struct Channel *chan;
        char tmp[80];
 
-       if ((DL_ESTABLISH | REQUEST)== pr) {
+       if ((DL_ESTABLISH | REQUEST) == pr) {
                l3_msg(st, pr, NULL);
                return;
        } else if ((CC_SETUP | REQUEST) == pr) {
@@ -905,31 +905,31 @@ down1tr6(struct PStack *st, int pr, void *arg)
 static void
 man1tr6(struct PStack *st, int pr, void *arg)
 {
-        int i;
-        struct l3_process *proc = arg;
-        if (!proc) {
-                printk(KERN_ERR "HiSax man1tr6 without proc pr=%04x\n", pr);
-                return;
-        }
-        for (i = 0; i < ARRAY_SIZE(manstatelist); i++)
-                if ((pr == manstatelist[i].primitive) &&
-                    ((1 << proc->state) & manstatelist[i].state))
-                        break;
-        if (i == ARRAY_SIZE(manstatelist)) {
-                if (st->l3.debug & L3_DEB_STATE) {
-                        l3_debug(st, "cr %d man1tr6 state %d prim %d unhandled",
-                                proc->callref & 0x7f, proc->state, pr);
-                }
-        } else {
-                if (st->l3.debug & L3_DEB_STATE) {
-                        l3_debug(st, "cr %d man1tr6 state %d prim %d",
-                                proc->callref & 0x7f, proc->state, pr);
-                }
-                manstatelist[i].rout(proc, pr, arg);
-        }
-}
+       int i;
+       struct l3_process *proc = arg;
+
+       if (!proc) {
+               printk(KERN_ERR "HiSax man1tr6 without proc pr=%04x\n", pr);
+               return;
+       }
+       for (i = 0; i < ARRAY_SIZE(manstatelist); i++)
+               if ((pr == manstatelist[i].primitive) &&
+                   ((1 << proc->state) & manstatelist[i].state))
+                       break;
+       if (i == ARRAY_SIZE(manstatelist)) {
+               if (st->l3.debug & L3_DEB_STATE) {
+                       l3_debug(st, "cr %d man1tr6 state %d prim %d unhandled",
+                                proc->callref & 0x7f, proc->state, pr);
+               }
+       } else {
+               if (st->l3.debug & L3_DEB_STATE) {
+                       l3_debug(st, "cr %d man1tr6 state %d prim %d",
+                                proc->callref & 0x7f, proc->state, pr);
+               }
+               manstatelist[i].rout(proc, pr, arg);
+       }
+}
+
 void
 setstack_1tr6(struct PStack *st)
 {
index 6a8acf6..cda7006 100644 (file)
@@ -7,7 +7,7 @@
  * Author       Karsten Keil
  *              based on the teles driver from Jan den Ouden
  * Copyright    by Karsten Keil      <keil@isdn4linux.de>
- * 
+ *
  * This software may be used and distributed according to the terms
  * of the GNU General Public License, incorporated herein by reference.
  *
@@ -30,14 +30,14 @@ static const char *dss1_revision = "$Revision: 2.32.2.3 $";
 
 #define EXT_BEARER_CAPS 1
 
-#define        MsgHead(ptr, cref, mty) \
-       *ptr++ = 0x8; \
-       if (cref == -1) { \
-               *ptr++ = 0x0; \
-       } else { \
-               *ptr++ = 0x1; \
-               *ptr++ = cref^0x80; \
-       } \
+#define        MsgHead(ptr, cref, mty)                 \
+       *ptr++ = 0x8;                           \
+       if (cref == -1) {                       \
+               *ptr++ = 0x0;                   \
+       } else {                                \
+               *ptr++ = 0x1;                   \
+               *ptr++ = cref^0x80;             \
+       }                                       \
        *ptr++ = mty
 
 
@@ -49,22 +49,22 @@ static unsigned char new_invoke_id(struct PStack *p)
 {
        unsigned char retval;
        int i;
-  
+
        i = 32; /* maximum search depth */
 
        retval = p->prot.dss1.last_invoke_id + 1; /* try new id */
        while ((i) && (p->prot.dss1.invoke_used[retval >> 3] == 0xFF)) {
                p->prot.dss1.last_invoke_id = (retval & 0xF8) + 8;
                i--;
-       }  
+       }
        if (i) {
                while (p->prot.dss1.invoke_used[retval >> 3] & (1 << (retval & 7)))
-               retval++; 
+                       retval++;
        } else
                retval = 0;
        p->prot.dss1.last_invoke_id = retval;
        p->prot.dss1.invoke_used[retval >> 3] |= (1 << (retval & 7));
-       return(retval);  
+       return (retval);
 } /* new_invoke_id */
 
 /*************************/
@@ -73,10 +73,10 @@ static unsigned char new_invoke_id(struct PStack *p)
 static void free_invoke_id(struct PStack *p, unsigned char id)
 {
 
-  if (!id) return; /* 0 = invalid value */
+       if (!id) return; /* 0 = invalid value */
 
-  p->prot.dss1.invoke_used[id >> 3] &= ~(1 << (id & 7));
-} /* free_invoke_id */  
+       p->prot.dss1.invoke_used[id >> 3] &= ~(1 << (id & 7));
+} /* free_invoke_id */
 
 
 /**********************************************************/
@@ -86,26 +86,26 @@ static struct l3_process
 *dss1_new_l3_process(struct PStack *st, int cr)
 {  struct l3_process *proc;
 
-   if (!(proc = new_l3_process(st, cr))) 
-     return(NULL);
+       if (!(proc = new_l3_process(st, cr)))
+               return (NULL);
 
-   proc->prot.dss1.invoke_id = 0;
-   proc->prot.dss1.remote_operation = 0;
-   proc->prot.dss1.uus1_data[0] = '\0';
-   
-   return(proc);
+       proc->prot.dss1.invoke_id = 0;
+       proc->prot.dss1.remote_operation = 0;
+       proc->prot.dss1.uus1_data[0] = '\0';
+
+       return (proc);
 } /* dss1_new_l3_process */
 
 /************************************************/
 /* free a l3 process and all dss1 specific data */
-/************************************************/ 
+/************************************************/
 static void
 dss1_release_l3_process(struct l3_process *p)
 {
-   free_invoke_id(p->st,p->prot.dss1.invoke_id);
-   release_l3_process(p);
+       free_invoke_id(p->st, p->prot.dss1.invoke_id);
+       release_l3_process(p);
 } /* dss1_release_l3_process */
+
 /********************************************************/
 /* search a process with invoke id id and dummy callref */
 /********************************************************/
@@ -113,120 +113,120 @@ static struct l3_process *
 l3dss1_search_dummy_proc(struct PStack *st, int id)
 { struct l3_process *pc = st->l3.proc; /* start of processes */
 
-  if (!id) return(NULL);
+       if (!id) return (NULL);
 
-  while (pc)
-   { if ((pc->callref == -1) && (pc->prot.dss1.invoke_id == id))
-       return(pc);
-     pc = pc->next;
-   } 
-  return(NULL);
+       while (pc)
+       { if ((pc->callref == -1) && (pc->prot.dss1.invoke_id == id))
+                       return (pc);
+               pc = pc->next;
+       }
+       return (NULL);
 } /* l3dss1_search_dummy_proc */
 
 /*******************************************************************/
 /* called when a facility message with a dummy callref is received */
 /* and a return result is delivered. id specifies the invoke id.   */
-/*******************************************************************/ 
-static void 
+/*******************************************************************/
+static void
 l3dss1_dummy_return_result(struct PStack *st, int id, u_char *p, u_char nlen)
 { isdn_ctrl ic;
-  struct IsdnCardState *cs;
-  struct l3_process *pc = NULL; 
-
-  if ((pc = l3dss1_search_dummy_proc(st, id)))
-   { L3DelTimer(&pc->timer); /* remove timer */
-
-     cs = pc->st->l1.hardware;
-     ic.driver = cs->myid;
-     ic.command = ISDN_STAT_PROT;
-     ic.arg = DSS1_STAT_INVOKE_RES;
-     ic.parm.dss1_io.hl_id = pc->prot.dss1.invoke_id;
-     ic.parm.dss1_io.ll_id = pc->prot.dss1.ll_id;
-     ic.parm.dss1_io.proc = pc->prot.dss1.proc;
-     ic.parm.dss1_io.timeout= 0;
-     ic.parm.dss1_io.datalen = nlen;
-     ic.parm.dss1_io.data = p;
-     free_invoke_id(pc->st, pc->prot.dss1.invoke_id);
-     pc->prot.dss1.invoke_id = 0; /* reset id */
-
-     cs->iif.statcallb(&ic);
-     dss1_release_l3_process(pc); 
-   }
-  else
-   l3_debug(st, "dummy return result id=0x%x result len=%d",id,nlen);
+       struct IsdnCardState *cs;
+       struct l3_process *pc = NULL;
+
+       if ((pc = l3dss1_search_dummy_proc(st, id)))
+       { L3DelTimer(&pc->timer); /* remove timer */
+
+               cs = pc->st->l1.hardware;
+               ic.driver = cs->myid;
+               ic.command = ISDN_STAT_PROT;
+               ic.arg = DSS1_STAT_INVOKE_RES;
+               ic.parm.dss1_io.hl_id = pc->prot.dss1.invoke_id;
+               ic.parm.dss1_io.ll_id = pc->prot.dss1.ll_id;
+               ic.parm.dss1_io.proc = pc->prot.dss1.proc;
+               ic.parm.dss1_io.timeout = 0;
+               ic.parm.dss1_io.datalen = nlen;
+               ic.parm.dss1_io.data = p;
+               free_invoke_id(pc->st, pc->prot.dss1.invoke_id);
+               pc->prot.dss1.invoke_id = 0; /* reset id */
+
+               cs->iif.statcallb(&ic);
+               dss1_release_l3_process(pc);
+       }
+       else
+               l3_debug(st, "dummy return result id=0x%x result len=%d", id, nlen);
 } /* l3dss1_dummy_return_result */
 
 /*******************************************************************/
 /* called when a facility message with a dummy callref is received */
 /* and a return error is delivered. id specifies the invoke id.    */
-/*******************************************************************/ 
-static void 
+/*******************************************************************/
+static void
 l3dss1_dummy_error_return(struct PStack *st, int id, ulong error)
 { isdn_ctrl ic;
-  struct IsdnCardState *cs;
-  struct l3_process *pc = NULL; 
-
-  if ((pc = l3dss1_search_dummy_proc(st, id)))
-   { L3DelTimer(&pc->timer); /* remove timer */
-
-     cs = pc->st->l1.hardware;
-     ic.driver = cs->myid;
-     ic.command = ISDN_STAT_PROT;
-     ic.arg = DSS1_STAT_INVOKE_ERR;
-     ic.parm.dss1_io.hl_id = pc->prot.dss1.invoke_id;
-     ic.parm.dss1_io.ll_id = pc->prot.dss1.ll_id;
-     ic.parm.dss1_io.proc = pc->prot.dss1.proc;
-     ic.parm.dss1_io.timeout= error;
-     ic.parm.dss1_io.datalen = 0;
-     ic.parm.dss1_io.data = NULL;
-     free_invoke_id(pc->st, pc->prot.dss1.invoke_id);
-     pc->prot.dss1.invoke_id = 0; /* reset id */
-
-     cs->iif.statcallb(&ic);
-     dss1_release_l3_process(pc); 
-   }
-  else
-   l3_debug(st, "dummy return error id=0x%x error=0x%lx",id,error);
+       struct IsdnCardState *cs;
+       struct l3_process *pc = NULL;
+
+       if ((pc = l3dss1_search_dummy_proc(st, id)))
+       { L3DelTimer(&pc->timer); /* remove timer */
+
+               cs = pc->st->l1.hardware;
+               ic.driver = cs->myid;
+               ic.command = ISDN_STAT_PROT;
+               ic.arg = DSS1_STAT_INVOKE_ERR;
+               ic.parm.dss1_io.hl_id = pc->prot.dss1.invoke_id;
+               ic.parm.dss1_io.ll_id = pc->prot.dss1.ll_id;
+               ic.parm.dss1_io.proc = pc->prot.dss1.proc;
+               ic.parm.dss1_io.timeout = error;
+               ic.parm.dss1_io.datalen = 0;
+               ic.parm.dss1_io.data = NULL;
+               free_invoke_id(pc->st, pc->prot.dss1.invoke_id);
+               pc->prot.dss1.invoke_id = 0; /* reset id */
+
+               cs->iif.statcallb(&ic);
+               dss1_release_l3_process(pc);
+       }
+       else
+               l3_debug(st, "dummy return error id=0x%x error=0x%lx", id, error);
 } /* l3dss1_error_return */
 
 /*******************************************************************/
 /* called when a facility message with a dummy callref is received */
 /* and a invoke is delivered. id specifies the invoke id.          */
-/*******************************************************************/ 
-static void 
-l3dss1_dummy_invoke(struct PStack *st, int cr, int id, 
-                    int ident, u_char *p, u_char nlen)
+/*******************************************************************/
+static void
+l3dss1_dummy_invoke(struct PStack *st, int cr, int id,
+                   int ident, u_char *p, u_char nlen)
 { isdn_ctrl ic;
-  struct IsdnCardState *cs;
-  
-  l3_debug(st, "dummy invoke %s id=0x%x ident=0x%x datalen=%d",
-               (cr == -1) ? "local" : "broadcast",id,ident,nlen);
-  if (cr >= -1) return; /* ignore local data */
-
-  cs = st->l1.hardware;
-  ic.driver = cs->myid;
-  ic.command = ISDN_STAT_PROT;
-  ic.arg = DSS1_STAT_INVOKE_BRD;
-  ic.parm.dss1_io.hl_id = id;
-  ic.parm.dss1_io.ll_id = 0;
-  ic.parm.dss1_io.proc = ident;
-  ic.parm.dss1_io.timeout= 0;
-  ic.parm.dss1_io.datalen = nlen;
-  ic.parm.dss1_io.data = p;
-
-  cs->iif.statcallb(&ic);
+       struct IsdnCardState *cs;
+
+       l3_debug(st, "dummy invoke %s id=0x%x ident=0x%x datalen=%d",
+                (cr == -1) ? "local" : "broadcast", id, ident, nlen);
+       if (cr >= -1) return; /* ignore local data */
+
+       cs = st->l1.hardware;
+       ic.driver = cs->myid;
+       ic.command = ISDN_STAT_PROT;
+       ic.arg = DSS1_STAT_INVOKE_BRD;
+       ic.parm.dss1_io.hl_id = id;
+       ic.parm.dss1_io.ll_id = 0;
+       ic.parm.dss1_io.proc = ident;
+       ic.parm.dss1_io.timeout = 0;
+       ic.parm.dss1_io.datalen = nlen;
+       ic.parm.dss1_io.data = p;
+
+       cs->iif.statcallb(&ic);
 } /* l3dss1_dummy_invoke */
 
 static void
 l3dss1_parse_facility(struct PStack *st, struct l3_process *pc,
-                      int cr, u_char * p)
+                     int cr, u_char *p)
 {
        int qd_len = 0;
        unsigned char nlen = 0, ilen, cp_tag;
        int ident, id;
        ulong err_ret;
 
-       if (pc) 
+       if (pc)
                st = pc->st; /* valid Stack */
        else
                if ((!st) || (cr >= 0)) return; /* neither pc nor st specified */
@@ -255,243 +255,243 @@ l3dss1_parse_facility(struct PStack *st, struct l3_process *pc,
                l3_debug(st, "class and form != 0xA0");
                return;
        }
-       
-        cp_tag = *p & 0x1F; /* remember tag value */
 
-        p++;
+       cp_tag = *p & 0x1F; /* remember tag value */
+
+       p++;
        qd_len--;
-       if (qd_len < 1) 
-          { l3_debug(st, "qd_len < 1");
-           return;
-         }
-       if (*p & 0x80) 
-          { /* length format indefinite or limited */
-           nlen = *p++ & 0x7F; /* number of len bytes or indefinite */
-            if ((qd_len-- < ((!nlen) ? 3 : (1 + nlen))) ||
-                (nlen > 1))   
-            { l3_debug(st, "length format error or not implemented");
-              return;
-             }
-            if (nlen == 1)
-            { nlen = *p++; /* complete length */
-               qd_len--;
-             } 
-            else
-            { qd_len -= 2; /* trailing null bytes */
-               if ((*(p+qd_len)) || (*(p+qd_len+1)))
-               { l3_debug(st,"length format indefinite error");
-                  return;
-                }
-               nlen = qd_len;
-             }
-         }
-        else
-         { nlen = *p++;
-           qd_len--;
-          } 
-       if (qd_len < nlen) 
-          { l3_debug(st, "qd_len < nlen");
-           return;
-         }
+       if (qd_len < 1)
+       { l3_debug(st, "qd_len < 1");
+               return;
+       }
+       if (*p & 0x80)
+       { /* length format indefinite or limited */
+               nlen = *p++ & 0x7F; /* number of len bytes or indefinite */
+               if ((qd_len-- < ((!nlen) ? 3 : (1 + nlen))) ||
+                   (nlen > 1))
+               { l3_debug(st, "length format error or not implemented");
+                       return;
+               }
+               if (nlen == 1)
+               { nlen = *p++; /* complete length */
+                       qd_len--;
+               }
+               else
+               { qd_len -= 2; /* trailing null bytes */
+                       if ((*(p + qd_len)) || (*(p + qd_len + 1)))
+                       { l3_debug(st, "length format indefinite error");
+                               return;
+                       }
+                       nlen = qd_len;
+               }
+       }
+       else
+       { nlen = *p++;
+               qd_len--;
+       }
+       if (qd_len < nlen)
+       { l3_debug(st, "qd_len < nlen");
+               return;
+       }
        qd_len -= nlen;
 
-       if (nlen < 2) 
-          { l3_debug(st, "nlen < 2");
-           return;
-         }
-        if (*p != 0x02) 
-          {  /* invoke identifier tag */
-            l3_debug(st, "invoke identifier tag !=0x02");
-            return;
-         }
+       if (nlen < 2)
+       { l3_debug(st, "nlen < 2");
+               return;
+       }
+       if (*p != 0x02)
+       {  /* invoke identifier tag */
+               l3_debug(st, "invoke identifier tag !=0x02");
+               return;
+       }
        p++;
        nlen--;
-       if (*p & 0x80) 
-          { /* length format */
-           l3_debug(st, "invoke id length format 2");
-           return;
-         }
+       if (*p & 0x80)
+       { /* length format */
+               l3_debug(st, "invoke id length format 2");
+               return;
+       }
        ilen = *p++;
        nlen--;
-       if (ilen > nlen || ilen == 0) 
-          { l3_debug(st, "ilen > nlen || ilen == 0");
-           return;
-         }
+       if (ilen > nlen || ilen == 0)
+       { l3_debug(st, "ilen > nlen || ilen == 0");
+               return;
+       }
        nlen -= ilen;
        id = 0;
-       while (ilen > 0) 
-          { id = (id << 8) | (*p++ & 0xFF);    /* invoke identifier */
-           ilen--;
-         }
+       while (ilen > 0)
+       { id = (id << 8) | (*p++ & 0xFF);       /* invoke identifier */
+               ilen--;
+       }
 
        switch (cp_tag) {       /* component tag */
-               case 1: /* invoke */
-                               if (nlen < 2) {
-                                       l3_debug(st, "nlen < 2 22");
-                                       return;
-                               }
-                               if (*p != 0x02) {       /* operation value */
-                                       l3_debug(st, "operation value !=0x02");
-                                       return;
-                               }
-                               p++;
-                               nlen--;
-                               ilen = *p++;
-                               nlen--;
-                               if (ilen > nlen || ilen == 0) {
-                                       l3_debug(st, "ilen > nlen || ilen == 0 22");
-                                       return;
-                               }
-                               nlen -= ilen;
-                               ident = 0;
-                               while (ilen > 0) {
-                                       ident = (ident << 8) | (*p++ & 0xFF);
-                                       ilen--;
-                               }
+       case 1: /* invoke */
+               if (nlen < 2) {
+                       l3_debug(st, "nlen < 2 22");
+                       return;
+               }
+               if (*p != 0x02) {       /* operation value */
+                       l3_debug(st, "operation value !=0x02");
+                       return;
+               }
+               p++;
+               nlen--;
+               ilen = *p++;
+               nlen--;
+               if (ilen > nlen || ilen == 0) {
+                       l3_debug(st, "ilen > nlen || ilen == 0 22");
+                       return;
+               }
+               nlen -= ilen;
+               ident = 0;
+               while (ilen > 0) {
+                       ident = (ident << 8) | (*p++ & 0xFF);
+                       ilen--;
+               }
 
-                                if (!pc) 
-                                { l3dss1_dummy_invoke(st, cr, id, ident, p, nlen);
-                                   return;
-                                 } 
+               if (!pc)
+               { l3dss1_dummy_invoke(st, cr, id, ident, p, nlen);
+                       return;
+               }
 #ifdef CONFIG_DE_AOC
-                       {
-
-#define FOO1(s,a,b) \
-           while(nlen > 1) {           \
-                   int ilen = p[1];    \
-                   if(nlen < ilen+2) { \
-                           l3_debug(st, "FOO1  nlen < ilen+2"); \
-                           return;             \
-                   }                   \
-                   nlen -= ilen+2;             \
-                   if((*p & 0xFF) == (a)) {    \
-                           int nlen = ilen;    \
-                           p += 2;             \
-                           b;          \
-                   } else {            \
-                           p += ilen+2;        \
-                   }                   \
-           }
-
-                               switch (ident) {
-                                       case 0x22:      /* during */
-                                               FOO1("1A", 0x30, FOO1("1C", 0xA1, FOO1("1D", 0x30, FOO1("1E", 0x02, ( {
-                                                              ident = 0;
-                                                       nlen = (nlen)?nlen:0; /* Make gcc happy */
-                                                       while (ilen > 0) {
-                                                                                                                    ident = (ident << 8) | *p++;
-                                                                 ilen--;
-                                                                       }
-                                                                                                                    if (ident > pc->para.chargeinfo) {
-                                                                                                                    pc->para.chargeinfo = ident;
-                                                                                                                    st->l3.l3l4(st, CC_CHARGE | INDICATION, pc);
-                                                                       }
-                                                                                                                    if (st->l3.debug & L3_DEB_CHARGE) {
-                                                                                                                    if (*(p + 2) == 0) {
-                                                                                                                    l3_debug(st, "charging info during %d", pc->para.chargeinfo);
-                                                                       }
-                                                                  else {
-                                                                                                                    l3_debug(st, "charging info final %d", pc->para.chargeinfo);
-                                                                       }
-                                                                       }
-                                                                       }
-                                                                   )))))
-                                                       break;
-                                       case 0x24:      /* final */
-                                               FOO1("2A", 0x30, FOO1("2B", 0x30, FOO1("2C", 0xA1, FOO1("2D", 0x30, FOO1("2E", 0x02, ( {
-                                                              ident = 0;
-                                                       nlen = (nlen)?nlen:0; /* Make gcc happy */
-                                                       while (ilen > 0) {
-                                                                                                                                     ident = (ident << 8) | *p++;
-                                                                 ilen--;
-                                                                       }
-                                                                                                                                     if (ident > pc->para.chargeinfo) {
-                                                                                                                                     pc->para.chargeinfo = ident;
-                                                                                                                                     st->l3.l3l4(st, CC_CHARGE | INDICATION, pc);
-                                                                       }
-                                                                                                                                     if (st->l3.debug & L3_DEB_CHARGE) {
-                                                                                                                                     l3_debug(st, "charging info final %d", pc->para.chargeinfo);
-                                                                       }
+               {
+
+#define FOO1(s, a, b)                                                  \
+                       while (nlen > 1) {                              \
+                               int ilen = p[1];                        \
+                               if (nlen < ilen + 2) {                  \
+                                       l3_debug(st, "FOO1  nlen < ilen+2"); \
+                                       return;                         \
+                               }                                       \
+                               nlen -= ilen + 2;                       \
+                               if ((*p & 0xFF) == (a)) {               \
+                                       int nlen = ilen;                \
+                                       p += 2;                         \
+                                       b;                              \
+                               } else {                                \
+                                       p += ilen + 2;                  \
+                               }                                       \
+                       }
+
+                       switch (ident) {
+                       case 0x22:      /* during */
+                               FOO1("1A", 0x30, FOO1("1C", 0xA1, FOO1("1D", 0x30, FOO1("1E", 0x02, ( {
+                                                                               ident = 0;
+                                                                               nlen = (nlen) ? nlen : 0; /* Make gcc happy */
+                                                                               while (ilen > 0) {
+                                                                                       ident = (ident << 8) | *p++;
+                                                                                       ilen--;
+                                                                               }
+                                                                               if (ident > pc->para.chargeinfo) {
+                                                                                       pc->para.chargeinfo = ident;
+                                                                                       st->l3.l3l4(st, CC_CHARGE | INDICATION, pc);
+                                                                               }
+                                                                               if (st->l3.debug & L3_DEB_CHARGE) {
+                                                                                       if (*(p + 2) == 0) {
+                                                                                               l3_debug(st, "charging info during %d", pc->para.chargeinfo);
+                                                                                       }
+                                                                                       else {
+                                                                                               l3_debug(st, "charging info final %d", pc->para.chargeinfo);
+                                                                                       }
+                                                                               }
                                                                        }
-                                                                  ))))))
-                                                       break;
-                                       default:
-                                                       l3_debug(st, "invoke break invalid ident %02x",ident);
-                                               break;
-                               }
+                                                                       )))))
+                                       break;
+                       case 0x24:      /* final */
+                               FOO1("2A", 0x30, FOO1("2B", 0x30, FOO1("2C", 0xA1, FOO1("2D", 0x30, FOO1("2E", 0x02, ( {
+                                                                                       ident = 0;
+                                                                                       nlen = (nlen) ? nlen : 0; /* Make gcc happy */
+                                                                                       while (ilen > 0) {
+                                                                                               ident = (ident << 8) | *p++;
+                                                                                               ilen--;
+                                                                                       }
+                                                                                       if (ident > pc->para.chargeinfo) {
+                                                                                               pc->para.chargeinfo = ident;
+                                                                                               st->l3.l3l4(st, CC_CHARGE | INDICATION, pc);
+                                                                                       }
+                                                                                       if (st->l3.debug & L3_DEB_CHARGE) {
+                                                                                               l3_debug(st, "charging info final %d", pc->para.chargeinfo);
+                                                                                       }
+                                                                               }
+                                                                               ))))))
+                                       break;
+                       default:
+                               l3_debug(st, "invoke break invalid ident %02x", ident);
+                               break;
+                       }
 #undef FOO1
 
-                       }
+               }
 #else  /* not CONFIG_DE_AOC */
-                        l3_debug(st, "invoke break");
+               l3_debug(st, "invoke break");
 #endif /* not CONFIG_DE_AOC */
-                       break;
-               case 2: /* return result */
-                        /* if no process available handle separately */ 
-                        if (!pc)
-                        { if (cr == -1) 
-                             l3dss1_dummy_return_result(st, id, p, nlen);
-                           return; 
-                         }   
-                        if ((pc->prot.dss1.invoke_id) && (pc->prot.dss1.invoke_id == id))
-                          { /* Diversion successful */
-                            free_invoke_id(st,pc->prot.dss1.invoke_id);
-                            pc->prot.dss1.remote_result = 0; /* success */     
-                            pc->prot.dss1.invoke_id = 0;
-                            pc->redir_result = pc->prot.dss1.remote_result; 
-                            st->l3.l3l4(st, CC_REDIR | INDICATION, pc);                                  } /* Diversion successful */
-                        else
-                          l3_debug(st,"return error unknown identifier");
-                       break;
-               case 3: /* return error */
-                            err_ret = 0;
-                           if (nlen < 2) 
-                              { l3_debug(st, "return error nlen < 2");
-                               return;
-                             }
-                            if (*p != 0x02) 
-                              { /* result tag */
-                               l3_debug(st, "invoke error tag !=0x02");
-                               return;
-                             }
-                           p++;
-                           nlen--;
-                           if (*p > 4) 
-                              { /* length format */
-                               l3_debug(st, "invoke return errlen > 4 ");
-                               return;
-                             }
-                           ilen = *p++;
-                           nlen--;
-                           if (ilen > nlen || ilen == 0) 
-                              { l3_debug(st, "error return ilen > nlen || ilen == 0");
-                               return;
-                              }
-                           nlen -= ilen;
-                           while (ilen > 0) 
-                             { err_ret = (err_ret << 8) | (*p++ & 0xFF);       /* error value */
-                              ilen--;
-                            }
-                        /* if no process available handle separately */ 
-                        if (!pc)
-                        { if (cr == -1)
-                             l3dss1_dummy_error_return(st, id, err_ret);
-                           return; 
-                         }   
-                        if ((pc->prot.dss1.invoke_id) && (pc->prot.dss1.invoke_id == id))
-                          { /* Deflection error */
-                            free_invoke_id(st,pc->prot.dss1.invoke_id);
-                            pc->prot.dss1.remote_result = err_ret; /* result */
-                            pc->prot.dss1.invoke_id = 0; 
-                            pc->redir_result = pc->prot.dss1.remote_result; 
-                            st->l3.l3l4(st, CC_REDIR | INDICATION, pc);  
-                          } /* Deflection error */
-                        else
-                          l3_debug(st,"return result unknown identifier");
-                       break;
-               default:
-                       l3_debug(st, "facility default break tag=0x%02x",cp_tag);
-                       break;
+               break;
+       case 2: /* return result */
+               /* if no process available handle separately */
+               if (!pc)
+               { if (cr == -1)
+                               l3dss1_dummy_return_result(st, id, p, nlen);
+                       return;
+               }
+               if ((pc->prot.dss1.invoke_id) && (pc->prot.dss1.invoke_id == id))
+               { /* Diversion successful */
+                       free_invoke_id(st, pc->prot.dss1.invoke_id);
+                       pc->prot.dss1.remote_result = 0; /* success */
+                       pc->prot.dss1.invoke_id = 0;
+                       pc->redir_result = pc->prot.dss1.remote_result;
+                       st->l3.l3l4(st, CC_REDIR | INDICATION, pc);                                  } /* Diversion successful */
+               else
+                       l3_debug(st, "return error unknown identifier");
+               break;
+       case 3: /* return error */
+               err_ret = 0;
+               if (nlen < 2)
+               { l3_debug(st, "return error nlen < 2");
+                       return;
+               }
+               if (*p != 0x02)
+               { /* result tag */
+                       l3_debug(st, "invoke error tag !=0x02");
+                       return;
+               }
+               p++;
+               nlen--;
+               if (*p > 4)
+               { /* length format */
+                       l3_debug(st, "invoke return errlen > 4 ");
+                       return;
+               }
+               ilen = *p++;
+               nlen--;
+               if (ilen > nlen || ilen == 0)
+               { l3_debug(st, "error return ilen > nlen || ilen == 0");
+                       return;
+               }
+               nlen -= ilen;
+               while (ilen > 0)
+               { err_ret = (err_ret << 8) | (*p++ & 0xFF);     /* error value */
+                       ilen--;
+               }
+               /* if no process available handle separately */
+               if (!pc)
+               { if (cr == -1)
+                               l3dss1_dummy_error_return(st, id, err_ret);
+                       return;
+               }
+               if ((pc->prot.dss1.invoke_id) && (pc->prot.dss1.invoke_id == id))
+               { /* Deflection error */
+                       free_invoke_id(st, pc->prot.dss1.invoke_id);
+                       pc->prot.dss1.remote_result = err_ret; /* result */
+                       pc->prot.dss1.invoke_id = 0;
+                       pc->redir_result = pc->prot.dss1.remote_result;
+                       st->l3.l3l4(st, CC_REDIR | INDICATION, pc);
+               } /* Deflection error */
+               else
+                       l3_debug(st, "return result unknown identifier");
+               break;
+       default:
+               l3_debug(st, "facility default break tag=0x%02x", cp_tag);
+               break;
        }
 }
 
@@ -568,21 +568,21 @@ l3dss1_msg_without_setup(struct l3_process *pc, u_char pr, void *arg)
        struct sk_buff *skb;
 
        switch (pc->para.cause) {
-               case 81:        /* invalid callreference */
-               case 88:        /* incomp destination */
-               case 96:        /* mandory IE missing */
-               case 100:       /* invalid IE contents */
-               case 101:       /* incompatible Callstate */
-                       MsgHead(p, pc->callref, MT_RELEASE_COMPLETE);
-                       *p++ = IE_CAUSE;
-                       *p++ = 0x2;
-                       *p++ = 0x80;
-                       *p++ = pc->para.cause | 0x80;
-                       break;
-               default:
-                       printk(KERN_ERR "HiSax l3dss1_msg_without_setup wrong cause %d\n",
-                               pc->para.cause);
-                       return;
+       case 81:        /* invalid callreference */
+       case 88:        /* incomp destination */
+       case 96:        /* mandory IE missing */
+       case 100:       /* invalid IE contents */
+       case 101:       /* incompatible Callstate */
+               MsgHead(p, pc->callref, MT_RELEASE_COMPLETE);
+               *p++ = IE_CAUSE;
+               *p++ = 0x2;
+               *p++ = 0x80;
+               *p++ = pc->para.cause | 0x80;
+               break;
+       default:
+               printk(KERN_ERR "HiSax l3dss1_msg_without_setup wrong cause %d\n",
+                      pc->para.cause);
+               return;
        }
        l = p - tmp;
        if (!(skb = l3_alloc_skb(l)))
@@ -593,42 +593,42 @@ l3dss1_msg_without_setup(struct l3_process *pc, u_char pr, void *arg)
 }
 
 static int ie_ALERTING[] = {IE_BEARER, IE_CHANNEL_ID | IE_MANDATORY_1,
-               IE_FACILITY, IE_PROGRESS, IE_DISPLAY, IE_SIGNAL, IE_HLC,
-               IE_USER_USER, -1};
+                           IE_FACILITY, IE_PROGRESS, IE_DISPLAY, IE_SIGNAL, IE_HLC,
+                           IE_USER_USER, -1};
 static int ie_CALL_PROCEEDING[] = {IE_BEARER, IE_CHANNEL_ID | IE_MANDATORY_1,
-               IE_FACILITY, IE_PROGRESS, IE_DISPLAY, IE_HLC, -1};
-static int ie_CONNECT[] = {IE_BEARER, IE_CHANNEL_ID | IE_MANDATORY_1, 
-               IE_FACILITY, IE_PROGRESS, IE_DISPLAY, IE_DATE, IE_SIGNAL,
-               IE_CONNECT_PN, IE_CONNECT_SUB, IE_LLC, IE_HLC, IE_USER_USER, -1};
+                                  IE_FACILITY, IE_PROGRESS, IE_DISPLAY, IE_HLC, -1};
+static int ie_CONNECT[] = {IE_BEARER, IE_CHANNEL_ID | IE_MANDATORY_1,
+                          IE_FACILITY, IE_PROGRESS, IE_DISPLAY, IE_DATE, IE_SIGNAL,
+                          IE_CONNECT_PN, IE_CONNECT_SUB, IE_LLC, IE_HLC, IE_USER_USER, -1};
 static int ie_CONNECT_ACKNOWLEDGE[] = {IE_CHANNEL_ID, IE_DISPLAY, IE_SIGNAL, -1};
 static int ie_DISCONNECT[] = {IE_CAUSE | IE_MANDATORY, IE_FACILITY,
-               IE_PROGRESS, IE_DISPLAY, IE_SIGNAL, IE_USER_USER, -1};
+                             IE_PROGRESS, IE_DISPLAY, IE_SIGNAL, IE_USER_USER, -1};
 static int ie_INFORMATION[] = {IE_COMPLETE, IE_DISPLAY, IE_KEYPAD, IE_SIGNAL,
-               IE_CALLED_PN, -1};
+                              IE_CALLED_PN, -1};
 static int ie_NOTIFY[] = {IE_BEARER, IE_NOTIFY | IE_MANDATORY, IE_DISPLAY, -1};
 static int ie_PROGRESS[] = {IE_BEARER, IE_CAUSE, IE_FACILITY, IE_PROGRESS |
-               IE_MANDATORY, IE_DISPLAY, IE_HLC, IE_USER_USER, -1};
+                           IE_MANDATORY, IE_DISPLAY, IE_HLC, IE_USER_USER, -1};
 static int ie_RELEASE[] = {IE_CAUSE | IE_MANDATORY_1, IE_FACILITY, IE_DISPLAY,
-               IE_SIGNAL, IE_USER_USER, -1};
-/* a RELEASE_COMPLETE with errors don't require special actions 
-static int ie_RELEASE_COMPLETE[] = {IE_CAUSE | IE_MANDATORY_1, IE_DISPLAY, IE_SIGNAL, IE_USER_USER, -1};
+                          IE_SIGNAL, IE_USER_USER, -1};
+/* a RELEASE_COMPLETE with errors don't require special actions
+   static int ie_RELEASE_COMPLETE[] = {IE_CAUSE | IE_MANDATORY_1, IE_DISPLAY, IE_SIGNAL, IE_USER_USER, -1};
 */
-static int ie_RESUME_ACKNOWLEDGE[] = {IE_CHANNEL_ID| IE_MANDATORY, IE_FACILITY,
-               IE_DISPLAY, -1};
+static int ie_RESUME_ACKNOWLEDGE[] = {IE_CHANNEL_ID | IE_MANDATORY, IE_FACILITY,
+                                     IE_DISPLAY, -1};
 static int ie_RESUME_REJECT[] = {IE_CAUSE | IE_MANDATORY, IE_DISPLAY, -1};
 static int ie_SETUP[] = {IE_COMPLETE, IE_BEARER  | IE_MANDATORY,
-               IE_CHANNEL_ID| IE_MANDATORY, IE_FACILITY, IE_PROGRESS,
-               IE_NET_FAC, IE_DISPLAY, IE_KEYPAD, IE_SIGNAL, IE_CALLING_PN,
-               IE_CALLING_SUB, IE_CALLED_PN, IE_CALLED_SUB, IE_REDIR_NR,
-               IE_LLC, IE_HLC, IE_USER_USER, -1};
+                        IE_CHANNEL_ID | IE_MANDATORY, IE_FACILITY, IE_PROGRESS,
+                        IE_NET_FAC, IE_DISPLAY, IE_KEYPAD, IE_SIGNAL, IE_CALLING_PN,
+                        IE_CALLING_SUB, IE_CALLED_PN, IE_CALLED_SUB, IE_REDIR_NR,
+                        IE_LLC, IE_HLC, IE_USER_USER, -1};
 static int ie_SETUP_ACKNOWLEDGE[] = {IE_CHANNEL_ID | IE_MANDATORY, IE_FACILITY,
-               IE_PROGRESS, IE_DISPLAY, IE_SIGNAL, -1};
+                                    IE_PROGRESS, IE_DISPLAY, IE_SIGNAL, -1};
 static int ie_STATUS[] = {IE_CAUSE | IE_MANDATORY, IE_CALL_STATE |
-               IE_MANDATORY, IE_DISPLAY, -1};
+                         IE_MANDATORY, IE_DISPLAY, -1};
 static int ie_STATUS_ENQUIRY[] = {IE_DISPLAY, -1};
 static int ie_SUSPEND_ACKNOWLEDGE[] = {IE_DISPLAY, IE_FACILITY, -1};
 static int ie_SUSPEND_REJECT[] = {IE_CAUSE | IE_MANDATORY, IE_DISPLAY, -1};
-/* not used 
+/* not used
  * static int ie_CONGESTION_CONTROL[] = {IE_CONGESTION | IE_MANDATORY,
  *             IE_CAUSE | IE_MANDATORY, IE_DISPLAY, -1};
  * static int ie_USER_INFORMATION[] = {IE_MORE_DATA, IE_USER_USER | IE_MANDATORY, -1};
@@ -636,8 +636,8 @@ static int ie_SUSPEND_REJECT[] = {IE_CAUSE | IE_MANDATORY, IE_DISPLAY, -1};
  *             IE_MANDATORY, -1};
  */
 static int ie_FACILITY[] = {IE_FACILITY | IE_MANDATORY, IE_DISPLAY, -1};
-static int comp_required[] = {1,2,3,5,6,7,9,10,11,14,15,-1};
-static int l3_valid_states[] = {0,1,2,3,4,6,7,8,9,10,11,12,15,17,19,25,-1};
+static int comp_required[] = {1, 2, 3, 5, 6, 7, 9, 10, 11, 14, 15, -1};
+static int l3_valid_states[] = {0, 1, 2, 3, 4, 6, 7, 8, 9, 10, 11, 12, 15, 17, 19, 25, -1};
 
 struct ie_len {
        int ie;
@@ -678,7 +678,7 @@ struct ie_len max_ie_len[] = {
        {IE_LLC, 18},
        {IE_HLC, 5},
        {IE_USER_USER, 131},
-       {-1,0},
+       {-1, 0},
 };
 
 static int
@@ -686,10 +686,10 @@ getmax_ie_len(u_char ie) {
        int i = 0;
        while (max_ie_len[i].ie != -1) {
                if (max_ie_len[i].ie == ie)
-                       return(max_ie_len[i].len);
+                       return (max_ie_len[i].len);
                i++;
        }
-       return(255);
+       return (255);
 }
 
 static int
@@ -699,14 +699,14 @@ ie_in_set(struct l3_process *pc, u_char ie, int *checklist) {
        while (*checklist != -1) {
                if ((*checklist & 0xff) == ie) {
                        if (ie & 0x80)
-                               return(-ret);
+                               return (-ret);
                        else
-                               return(ret);
+                               return (ret);
                }
                ret++;
                checklist++;
        }
-       return(0);
+       return (0);
 }
 
 static int
@@ -720,7 +720,7 @@ check_infoelements(struct l3_process *pc, struct sk_buff *skb, int *checklist)
        u_char codeset = 0;
        u_char old_codeset = 0;
        u_char codelock = 1;
-       
+
        p = skb->data;
        /* skip cr */
        p++;
@@ -738,7 +738,7 @@ check_infoelements(struct l3_process *pc, struct sk_buff *skb, int *checklist)
                                codelock = 1;
                        if (pc->debug & L3_DEB_CHECK)
                                l3_debug(pc->st, "check IE shift%scodeset %d->%d",
-                                       codelock ? " locking ": " ", old_codeset, codeset);
+                                        codelock ? " locking " : " ", old_codeset, codeset);
                        p++;
                        continue;
                }
@@ -770,7 +770,7 @@ check_infoelements(struct l3_process *pc, struct sk_buff *skb, int *checklist)
                if (!codelock) {
                        if (pc->debug & L3_DEB_CHECK)
                                l3_debug(pc->st, "check IE shift back codeset %d->%d",
-                                       codeset, old_codeset);
+                                        codeset, old_codeset);
                        codeset = old_codeset;
                        codelock = 1;
                }
@@ -778,17 +778,17 @@ check_infoelements(struct l3_process *pc, struct sk_buff *skb, int *checklist)
        if (err_compr | err_ureg | err_len | err_seq) {
                if (pc->debug & L3_DEB_CHECK)
                        l3_debug(pc->st, "check IE MT(%x) %d/%d/%d/%d",
-                               mt, err_compr, err_ureg, err_len, err_seq);
+                                mt, err_compr, err_ureg, err_len, err_seq);
                if (err_compr)
-                       return(ERR_IE_COMPREHENSION);
+                       return (ERR_IE_COMPREHENSION);
                if (err_ureg)
-                       return(ERR_IE_UNRECOGNIZED);
+                       return (ERR_IE_UNRECOGNIZED);
                if (err_len)
-                       return(ERR_IE_LENGTH);
+                       return (ERR_IE_LENGTH);
                if (err_seq)
-                       return(ERR_IE_SEQUENCE);
-       } 
-       return(0);
+                       return (ERR_IE_SEQUENCE);
+       }
+       return (0);
 }
 
 /* verify if a message type exists and contain no IE error */
@@ -796,42 +796,42 @@ static int
 l3dss1_check_messagetype_validity(struct l3_process *pc, int mt, void *arg)
 {
        switch (mt) {
-               case MT_ALERTING:
-               case MT_CALL_PROCEEDING:
-               case MT_CONNECT:
-               case MT_CONNECT_ACKNOWLEDGE:
-               case MT_DISCONNECT:
-               case MT_INFORMATION:
-               case MT_FACILITY:
-               case MT_NOTIFY:
-               case MT_PROGRESS:
-               case MT_RELEASE:
-               case MT_RELEASE_COMPLETE:
-               case MT_SETUP:
-               case MT_SETUP_ACKNOWLEDGE:
-               case MT_RESUME_ACKNOWLEDGE:
-               case MT_RESUME_REJECT:
-               case MT_SUSPEND_ACKNOWLEDGE:
-               case MT_SUSPEND_REJECT:
-               case MT_USER_INFORMATION:
-               case MT_RESTART:
-               case MT_RESTART_ACKNOWLEDGE:
-               case MT_CONGESTION_CONTROL:
-               case MT_STATUS:
-               case MT_STATUS_ENQUIRY:
-                       if (pc->debug & L3_DEB_CHECK)
-                               l3_debug(pc->st, "l3dss1_check_messagetype_validity mt(%x) OK", mt);
-                       break;
-               case MT_RESUME: /* RESUME only in user->net */
-               case MT_SUSPEND: /* SUSPEND only in user->net */
-               default:
-                       if (pc->debug & (L3_DEB_CHECK | L3_DEB_WARN))
-                               l3_debug(pc->st, "l3dss1_check_messagetype_validity mt(%x) fail", mt);
-                       pc->para.cause = 97;
-                       l3dss1_status_send(pc, 0, NULL);
-                       return(1);
+       case MT_ALERTING:
+       case MT_CALL_PROCEEDING:
+       case MT_CONNECT:
+       case MT_CONNECT_ACKNOWLEDGE:
+       case MT_DISCONNECT:
+       case MT_INFORMATION:
+       case MT_FACILITY:
+       case MT_NOTIFY:
+       case MT_PROGRESS:
+       case MT_RELEASE:
+       case MT_RELEASE_COMPLETE:
+       case MT_SETUP:
+       case MT_SETUP_ACKNOWLEDGE:
+       case MT_RESUME_ACKNOWLEDGE:
+       case MT_RESUME_REJECT:
+       case MT_SUSPEND_ACKNOWLEDGE:
+       case MT_SUSPEND_REJECT:
+       case MT_USER_INFORMATION:
+       case MT_RESTART:
+       case MT_RESTART_ACKNOWLEDGE:
+       case MT_CONGESTION_CONTROL:
+       case MT_STATUS:
+       case MT_STATUS_ENQUIRY:
+               if (pc->debug & L3_DEB_CHECK)
+                       l3_debug(pc->st, "l3dss1_check_messagetype_validity mt(%x) OK", mt);
+               break;
+       case MT_RESUME: /* RESUME only in user->net */
+       case MT_SUSPEND: /* SUSPEND only in user->net */
+       default:
+               if (pc->debug & (L3_DEB_CHECK | L3_DEB_WARN))
+                       l3_debug(pc->st, "l3dss1_check_messagetype_validity mt(%x) fail", mt);
+               pc->para.cause = 97;
+               l3dss1_status_send(pc, 0, NULL);
+               return (1);
        }
-       return(0);
+       return (0);
 }
 
 static void
@@ -839,24 +839,24 @@ l3dss1_std_ie_err(struct l3_process *pc, int ret) {
 
        if (pc->debug & L3_DEB_CHECK)
                l3_debug(pc->st, "check_infoelements ret %d", ret);
-       switch(ret) {
-               case 0: 
-                       break;
-               case ERR_IE_COMPREHENSION:
-                       pc->para.cause = 96;
-                       l3dss1_status_send(pc, 0, NULL);
-                       break;
-               case ERR_IE_UNRECOGNIZED:
-                       pc->para.cause = 99;
-                       l3dss1_status_send(pc, 0, NULL);
-                       break;
-               case ERR_IE_LENGTH:
-                       pc->para.cause = 100;
-                       l3dss1_status_send(pc, 0, NULL);
-                       break;
-               case ERR_IE_SEQUENCE:
-               default:
-                       break;
+       switch (ret) {
+       case 0:
+               break;
+       case ERR_IE_COMPREHENSION:
+               pc->para.cause = 96;
+               l3dss1_status_send(pc, 0, NULL);
+               break;
+       case ERR_IE_UNRECOGNIZED:
+               pc->para.cause = 99;
+               l3dss1_status_send(pc, 0, NULL);
+               break;
+       case ERR_IE_LENGTH:
+               pc->para.cause = 100;
+               l3dss1_status_send(pc, 0, NULL);
+               break;
+       case ERR_IE_SEQUENCE:
+       default:
+               break;
        }
 }
 
@@ -878,14 +878,14 @@ l3dss1_get_channel_id(struct l3_process *pc, struct sk_buff *skb) {
                                l3_debug(pc->st, "wrong chid %x", *p);
                        return (-3);
                }
-               return(*p & 0x3);
+               return (*p & 0x3);
        } else
-               return(-1);
+               return (-1);
 }
 
 static int
 l3dss1_get_cause(struct l3_process *pc, struct sk_buff *skb) {
-       u_char l, i=0;
+       u_char l, i = 0;
        u_char *p;
 
        p = skb->data;
@@ -894,13 +894,13 @@ l3dss1_get_cause(struct l3_process *pc, struct sk_buff *skb) {
        if ((p = findie(p, skb->len, IE_CAUSE, 0))) {
                p++;
                l = *p++;
-               if (l>30)
-                       return(1);
+               if (l > 30)
+                       return (1);
                if (l) {
                        pc->para.loc = *p++;
                        l--;
                } else {
-                       return(2);
+                       return (2);
                }
                if (l && !(pc->para.loc & 0x80)) {
                        l--;
@@ -910,36 +910,36 @@ l3dss1_get_cause(struct l3_process *pc, struct sk_buff *skb) {
                        pc->para.cause = *p++;
                        l--;
                        if (!(pc->para.cause & 0x80))
-                               return(3);
+                               return (3);
                } else
-                       return(4);
-               while (l && (i<6)) {
+                       return (4);
+               while (l && (i < 6)) {
                        pc->para.diag[i++] = *p++;
                        l--;
                }
        } else
-               return(-1);
-       return(0);
+               return (-1);
+       return (0);
 }
 
 static void
 l3dss1_msg_with_uus(struct l3_process *pc, u_char cmd)
 {
        struct sk_buff *skb;
-       u_char tmp[16+40];
+       u_char tmp[16 + 40];
        u_char *p = tmp;
        int l;
 
        MsgHead(p, pc->callref, cmd);
 
-        if (pc->prot.dss1.uus1_data[0])
-        { *p++ = IE_USER_USER; /* UUS info element */
-           *p++ = strlen(pc->prot.dss1.uus1_data) + 1;
-           *p++ = 0x04; /* IA5 chars */
-           strcpy(p,pc->prot.dss1.uus1_data);
-           p += strlen(pc->prot.dss1.uus1_data);
-           pc->prot.dss1.uus1_data[0] = '\0';   
-         } 
+       if (pc->prot.dss1.uus1_data[0])
+       { *p++ = IE_USER_USER; /* UUS info element */
+               *p++ = strlen(pc->prot.dss1.uus1_data) + 1;
+               *p++ = 0x04; /* IA5 chars */
+               strcpy(p, pc->prot.dss1.uus1_data);
+               p += strlen(pc->prot.dss1.uus1_data);
+               pc->prot.dss1.uus1_data[0] = '\0';
+       }
 
        l = p - tmp;
        if (!(skb = l3_alloc_skb(l)))
@@ -953,7 +953,7 @@ l3dss1_release_req(struct l3_process *pc, u_char pr, void *arg)
 {
        StopAllL3Timer(pc);
        newl3state(pc, 19);
-       if (!pc->prot.dss1.uus1_data[0]) 
+       if (!pc->prot.dss1.uus1_data[0])
                l3dss1_message(pc, MT_RELEASE);
        else
                l3dss1_msg_with_uus(pc, MT_RELEASE);
@@ -966,9 +966,9 @@ l3dss1_release_cmpl(struct l3_process *pc, u_char pr, void *arg)
        struct sk_buff *skb = arg;
        int ret;
 
-       if ((ret = l3dss1_get_cause(pc, skb))>0) {
+       if ((ret = l3dss1_get_cause(pc, skb)) > 0) {
                if (pc->debug & L3_DEB_WARN)
-                       l3_debug(pc->st, "RELCMPL get_cause ret(%d)",ret);
+                       l3_debug(pc->st, "RELCMPL get_cause ret(%d)", ret);
        } else if (ret < 0)
                pc->para.cause = NO_CAUSE;
        StopAllL3Timer(pc);
@@ -980,7 +980,7 @@ l3dss1_release_cmpl(struct l3_process *pc, u_char pr, void *arg)
 #ifdef EXT_BEARER_CAPS
 
 static u_char *
-EncodeASyncParams(u_char * p, u_char si2)
+EncodeASyncParams(u_char *p, u_char si2)
 {                              // 7c 06 88  90 21 42 00 bb
 
        p[0] = 0;
@@ -1008,38 +1008,38 @@ EncodeASyncParams(u_char * p, u_char si2)
                p[2] += 3;
 
        switch (si2 & 0x07) {
-               case 0:
-                       p[0] = 66;      // 1200 bit/s
+       case 0:
+               p[0] = 66;      // 1200 bit/s
 
-                       break;
-               case 1:
-                       p[0] = 88;      // 1200/75 bit/s
+               break;
+       case 1:
+               p[0] = 88;      // 1200/75 bit/s
 
-                       break;
-               case 2:
-                       p[0] = 87;      // 75/1200 bit/s
+               break;
+       case 2:
+               p[0] = 87;      // 75/1200 bit/s
 
-                       break;
-               case 3:
-                       p[0] = 67;      // 2400 bit/s
+               break;
+       case 3:
+               p[0] = 67;      // 2400 bit/s
 
-                       break;
-               case 4:
-                       p[0] = 69;      // 4800 bit/s
+               break;
+       case 4:
+               p[0] = 69;      // 4800 bit/s
 
-                       break;
-               case 5:
-                       p[0] = 72;      // 9600 bit/s
+               break;
+       case 5:
+               p[0] = 72;      // 9600 bit/s
 
-                       break;
-               case 6:
-                       p[0] = 73;      // 14400 bit/s
+               break;
+       case 6:
+               p[0] = 73;      // 14400 bit/s
 
-                       break;
-               case 7:
-                       p[0] = 75;      // 19200 bit/s
+               break;
+       case 7:
+               p[0] = 75;      // 19200 bit/s
 
-                       break;
+               break;
        }
        return p + 3;
 }
@@ -1049,84 +1049,84 @@ EncodeSyncParams(u_char si2, u_char ai)
 {
 
        switch (si2) {
-               case 0:
-                       return ai + 2;  // 1200 bit/s
+       case 0:
+               return ai + 2;  // 1200 bit/s
 
-               case 1:
-                       return ai + 24;         // 1200/75 bit/s
+       case 1:
+               return ai + 24;         // 1200/75 bit/s
 
-               case 2:
-                       return ai + 23;         // 75/1200 bit/s
+       case 2:
+               return ai + 23;         // 75/1200 bit/s
 
-               case 3:
-                       return ai + 3;  // 2400 bit/s
+       case 3:
+               return ai + 3;  // 2400 bit/s
 
-               case 4:
-                       return ai + 5;  // 4800 bit/s
+       case 4:
+               return ai + 5;  // 4800 bit/s
 
-               case 5:
-                       return ai + 8;  // 9600 bit/s
+       case 5:
+               return ai + 8;  // 9600 bit/s
 
-               case 6:
-                       return ai + 9;  // 14400 bit/s
+       case 6:
+               return ai + 9;  // 14400 bit/s
 
-               case 7:
-                       return ai + 11;         // 19200 bit/s
+       case 7:
+               return ai + 11;         // 19200 bit/s
 
-               case 8:
-                       return ai + 14;         // 48000 bit/s
+       case 8:
+               return ai + 14;         // 48000 bit/s
 
-               case 9:
-                       return ai + 15;         // 56000 bit/s
+       case 9:
+               return ai + 15;         // 56000 bit/s
 
-               case 15:
-                       return ai + 40;         // negotiate bit/s
+       case 15:
+               return ai + 40;         // negotiate bit/s
 
-               default:
-                       break;
+       default:
+               break;
        }
        return ai;
 }
 
 
 static u_char
-DecodeASyncParams(u_char si2, u_char * p)
+DecodeASyncParams(u_char si2, u_char *p)
 {
        u_char info;
 
        switch (p[5]) {
-               case 66:        // 1200 bit/s
+       case 66:        // 1200 bit/s
 
-                       break;  // si2 don't change
+               break;  // si2 don't change
 
-               case 88:        // 1200/75 bit/s
+       case 88:        // 1200/75 bit/s
 
-                       si2 += 1;
-                       break;
-               case 87:        // 75/1200 bit/s
+               si2 += 1;
+               break;
+       case 87:        // 75/1200 bit/s
 
-                       si2 += 2;
-                       break;
-               case 67:        // 2400 bit/s
+               si2 += 2;
+               break;
+       case 67:        // 2400 bit/s
 
-                       si2 += 3;
-                       break;
-               case 69:        // 4800 bit/s
+               si2 += 3;
+               break;
+       case 69:        // 4800 bit/s
 
-                       si2 += 4;
-                       break;
-               case 72:        // 9600 bit/s
+               si2 += 4;
+               break;
+       case 72:        // 9600 bit/s
 
-                       si2 += 5;
-                       break;
-               case 73:        // 14400 bit/s
+               si2 += 5;
+               break;
+       case 73:        // 14400 bit/s
 
-                       si2 += 6;
-                       break;
-               case 75:        // 19200 bit/s
+               si2 += 6;
+               break;
+       case 75:        // 19200 bit/s
 
-                       si2 += 7;
-                       break;
+               si2 += 7;
+               break;
        }
 
        info = p[7] & 0x7f;
@@ -1151,39 +1151,39 @@ DecodeSyncParams(u_char si2, u_char info)
 {
        info &= 0x7f;
        switch (info) {
-               case 40:        // bit/s negotiation failed  ai := 165 not 175!
+       case 40:        // bit/s negotiation failed  ai := 165 not 175!
 
-                       return si2 + 15;
-               case 15:        // 56000 bit/s failed, ai := 0 not 169 !
+               return si2 + 15;
+       case 15:        // 56000 bit/s failed, ai := 0 not 169 !
 
-                       return si2 + 9;
-               case 14:        // 48000 bit/s
+               return si2 + 9;
+       case 14:        // 48000 bit/s
 
-                       return si2 + 8;
-               case 11:        // 19200 bit/s
+               return si2 + 8;
+       case 11:        // 19200 bit/s
 
-                       return si2 + 7;
-               case 9: // 14400 bit/s
+               return si2 + 7;
+       case 9: // 14400 bit/s
 
-                       return si2 + 6;
-               case 8: // 9600  bit/s
+               return si2 + 6;
+       case 8: // 9600  bit/s
 
-                       return si2 + 5;
-               case 5: // 4800  bit/s
+               return si2 + 5;
+       case 5: // 4800  bit/s
 
-                       return si2 + 4;
-               case 3: // 2400  bit/s
+               return si2 + 4;
+       case 3: // 2400  bit/s
 
-                       return si2 + 3;
-               case 23:        // 75/1200 bit/s
+               return si2 + 3;
+       case 23:        // 75/1200 bit/s
 
-                       return si2 + 2;
-               case 24:        // 1200/75 bit/s
+               return si2 + 2;
+       case 24:        // 1200/75 bit/s
 
-                       return si2 + 1;
-               default:        // 1200 bit/s
+               return si2 + 1;
+       default:        // 1200 bit/s
 
-                       return si2;
+               return si2;
        }
 }
 
@@ -1194,20 +1194,20 @@ DecodeSI2(struct sk_buff *skb)
 
        if ((p = findie(skb->data, skb->len, 0x7c, 0))) {
                switch (p[4] & 0x0f) {
-                       case 0x01:
-                               if (p[1] == 0x04)       // sync. Bitratenadaption
+               case 0x01:
+                       if (p[1] == 0x04)       // sync. Bitratenadaption
 
-                                       return DecodeSyncParams(160, p[5]);     // V.110/X.30
+                               return DecodeSyncParams(160, p[5]);     // V.110/X.30
 
-                               else if (p[1] == 0x06)  // async. Bitratenadaption
+                       else if (p[1] == 0x06)  // async. Bitratenadaption
 
-                                       return DecodeASyncParams(192, p);       // V.110/X.30
+                               return DecodeASyncParams(192, p);       // V.110/X.30
 
-                               break;
-                       case 0x08:      // if (p[5] == 0x02) // sync. Bitratenadaption
-                               if (p[1] > 3) 
-                                       return DecodeSyncParams(176, p[5]);     // V.120
-                               break;
+                       break;
+               case 0x08:      // if (p[5] == 0x02) // sync. Bitratenadaption
+                       if (p[1] > 3)
+                               return DecodeSyncParams(176, p[5]);     // V.120
+                       break;
                }
        }
        return 0;
@@ -1225,7 +1225,7 @@ l3dss1_setup_req(struct l3_process *pc, u_char pr,
        u_char *p = tmp;
        u_char channel = 0;
 
-        u_char send_keypad;
+       u_char send_keypad;
        u_char screen = 0x80;
        u_char *teln;
        u_char *msn;
@@ -1237,7 +1237,7 @@ l3dss1_setup_req(struct l3_process *pc, u_char pr,
 
        teln = pc->para.setup.phone;
 #ifndef CONFIG_HISAX_NO_KEYPAD
-        send_keypad = (strchr(teln,'*') || strchr(teln,'#')) ? 1 : 0; 
+       send_keypad = (strchr(teln, '*') || strchr(teln, '#')) ? 1 : 0;
 #else
        send_keypad = 0;
 #endif
@@ -1272,7 +1272,7 @@ l3dss1_setup_req(struct l3_process *pc, u_char pr,
                while (*teln)
                        *p++ = (*teln++) & 0x7F;
        }
-         
+
        /*
         * What about info2? Mapping to High-Layer-Compatibility?
         */
@@ -1280,27 +1280,27 @@ l3dss1_setup_req(struct l3_process *pc, u_char pr,
                /* parse number for special things */
                if (!isdigit(*teln)) {
                        switch (0x5f & *teln) {
-                               case 'C':
-                                       channel = 0x08;
-                               case 'P':
-                                       channel |= 0x80;
-                                       teln++;
-                                       if (*teln == '1')
-                                               channel |= 0x01;
-                                       else
-                                               channel |= 0x02;
-                                       break;
-                               case 'R':
-                                       screen = 0xA0;
-                                       break;
-                               case 'D':
-                                       screen = 0x80;
-                                       break;
-                               
-                               default:
-                                       if (pc->debug & L3_DEB_WARN)
-                                               l3_debug(pc->st, "Wrong MSN Code");
-                                       break;
+                       case 'C':
+                               channel = 0x08;
+                       case 'P':
+                               channel |= 0x80;
+                               teln++;
+                               if (*teln == '1')
+                                       channel |= 0x01;
+                               else
+                                       channel |= 0x02;
+                               break;
+                       case 'R':
+                               screen = 0xA0;
+                               break;
+                       case 'D':
+                               screen = 0x80;
+                               break;
+
+                       default:
+                               if (pc->debug & L3_DEB_WARN)
+                                       l3_debug(pc->st, "Wrong MSN Code");
+                               break;
                        }
                        teln++;
                }
@@ -1350,15 +1350,15 @@ l3dss1_setup_req(struct l3_process *pc, u_char pr,
                } else
                        sp++;
        }
-       
-        if (!send_keypad) {      
+
+       if (!send_keypad) {
                *p++ = IE_CALLED_PN;
                *p++ = strlen(teln) + 1;
                /* Classify as AnyPref. */
                *p++ = 0x81;            /* Ext = '1'B, Type = '000'B, Plan = '0001'B. */
                while (*teln)
                        *p++ = *teln++ & 0x7f;
-               
+
                if (sub) {
                        *sub++ = '.';
                        *p++ = IE_CALLED_SUB;
@@ -1368,7 +1368,7 @@ l3dss1_setup_req(struct l3_process *pc, u_char pr,
                        while (*sub)
                                *p++ = *sub++ & 0x7f;
                }
-        }
+       }
 #ifdef EXT_BEARER_CAPS
        if ((pc->para.setup.si2 >= 160) && (pc->para.setup.si2 <= 175)) {       // sync. Bitratenadaption, V.110/X.30
 
@@ -1397,7 +1397,7 @@ l3dss1_setup_req(struct l3_process *pc, u_char pr,
                p = EncodeASyncParams(p, pc->para.setup.si2 - 192);
 #ifndef CONFIG_HISAX_NO_LLC
        } else {
-         switch (pc->para.setup.si1) {
+               switch (pc->para.setup.si1) {
                case 1:                 /* Telephony                                */
                        *p++ = IE_LLC;
                        *p++ = 0x3;     /* Length                                   */
@@ -1413,7 +1413,7 @@ l3dss1_setup_req(struct l3_process *pc, u_char pr,
                        *p++ = 0x88;    /* Coding Std. CCITT, unrestr. dig. Inform. */
                        *p++ = 0x90;    /* Circuit-Mode 64kbps                      */
                        break;
-         }
+               }
 #endif
        }
 #endif
@@ -1521,7 +1521,7 @@ l3dss1_disconnect(struct l3_process *pc, u_char pr, void *arg)
                        cause = 96;
                else if (ret > 0)
                        cause = 100;
-       } 
+       }
        if ((p = findie(skb->data, skb->len, IE_FACILITY, 0)))
                l3dss1_parse_facility(pc->st, pc, pc->callref, p);
        ret = check_infoelements(pc, skb, ie_DISCONNECT);
@@ -1533,10 +1533,10 @@ l3dss1_disconnect(struct l3_process *pc, u_char pr, void *arg)
        newl3state(pc, 12);
        if (cause)
                newl3state(pc, 19);
-               if (11 != ret)
+       if (11 != ret)
                pc->st->l3.l3l4(pc->st, CC_DISCONNECT | INDICATION, pc);
-               else if (!cause)
-                  l3dss1_release_req(pc, pr, NULL);
+       else if (!cause)
+               l3dss1_release_req(pc, pr, NULL);
        if (cause) {
                l3dss1_message_cause(pc, MT_RELEASE, cause);
                L3AddTimer(&pc->timer, T308, CC_T308_1);
@@ -1602,56 +1602,56 @@ l3dss1_setup(struct l3_process *pc, u_char pr, void *arg)
                else {
                        pc->para.setup.si2 = 0;
                        switch (p[2] & 0x7f) {
-                               case 0x00: /* Speech */
-                               case 0x10: /* 3.1 Khz audio */
-                                       pc->para.setup.si1 = 1;
-                                       break;
-                               case 0x08: /* Unrestricted digital information */
-                                       pc->para.setup.si1 = 7;
+                       case 0x00: /* Speech */
+                       case 0x10: /* 3.1 Khz audio */
+                               pc->para.setup.si1 = 1;
+                               break;
+                       case 0x08: /* Unrestricted digital information */
+                               pc->para.setup.si1 = 7;
 /* JIM, 05.11.97 I wanna set service indicator 2 */
 #ifdef EXT_BEARER_CAPS
-                                       pc->para.setup.si2 = DecodeSI2(skb);
+                               pc->para.setup.si2 = DecodeSI2(skb);
 #endif
-                                       break;
-                               case 0x09: /* Restricted digital information */
-                                       pc->para.setup.si1 = 2;
-                                       break;
-                               case 0x11:
-                                       /* Unrestr. digital information  with 
-                                        * tones/announcements ( or 7 kHz audio
-                                        */
-                                       pc->para.setup.si1 = 3;
-                                       break;
-                               case 0x18: /* Video */
-                                       pc->para.setup.si1 = 4;
-                                       break;
-                               default:
-                                       err = 2;
-                                       break;
+                               break;
+                       case 0x09: /* Restricted digital information */
+                               pc->para.setup.si1 = 2;
+                               break;
+                       case 0x11:
+                               /* Unrestr. digital information  with
+                                * tones/announcements ( or 7 kHz audio
+                                */
+                               pc->para.setup.si1 = 3;
+                               break;
+                       case 0x18: /* Video */
+                               pc->para.setup.si1 = 4;
+                               break;
+                       default:
+                               err = 2;
+                               break;
                        }
                        switch (p[3] & 0x7f) {
-                               case 0x40: /* packed mode */
-                                       pc->para.setup.si1 = 8;
-                                       break;
-                               case 0x10: /* 64 kbit */
-                               case 0x11: /* 2*64 kbit */
-                               case 0x13: /* 384 kbit */
-                               case 0x15: /* 1536 kbit */
-                               case 0x17: /* 1920 kbit */
-                                       pc->para.moderate = p[3] & 0x7f;
-                                       break;
-                               default:
-                                       err = 3;
-                                       break;
+                       case 0x40: /* packed mode */
+                               pc->para.setup.si1 = 8;
+                               break;
+                       case 0x10: /* 64 kbit */
+                       case 0x11: /* 2*64 kbit */
+                       case 0x13: /* 384 kbit */
+                       case 0x15: /* 1536 kbit */
+                       case 0x17: /* 1920 kbit */
+                               pc->para.moderate = p[3] & 0x7f;
+                               break;
+                       default:
+                               err = 3;
+                               break;
                        }
                }
                if (pc->debug & L3_DEB_SI)
                        l3_debug(pc->st, "SI=%d, AI=%d",
-                               pc->para.setup.si1, pc->para.setup.si2);
+                                pc->para.setup.si1, pc->para.setup.si2);
                if (err) {
                        if (pc->debug & L3_DEB_WARN)
                                l3_debug(pc->st, "setup with wrong bearer(l=%d:%x,%x)",
-                                       p[1], p[2], p[3]);
+                                        p[1], p[2], p[3]);
                        pc->para.cause = 100;
                        l3dss1_msg_without_setup(pc, pr, NULL);
                        return;
@@ -1672,17 +1672,17 @@ l3dss1_setup(struct l3_process *pc, u_char pr, void *arg)
                        if ((3 == id) && (0x10 == pc->para.moderate)) {
                                if (pc->debug & L3_DEB_WARN)
                                        l3_debug(pc->st, "setup with wrong chid %x",
-                                               id);
+                                                id);
                                pc->para.cause = 100;
                                l3dss1_msg_without_setup(pc, pr, NULL);
                                return;
                        }
                        bcfound++;
-               } else 
-                   { if (pc->debug & L3_DEB_WARN)
-                        l3_debug(pc->st, "setup without bchannel, call waiting");
-                     bcfound++;
-                   } 
+               } else
+               { if (pc->debug & L3_DEB_WARN)
+                               l3_debug(pc->st, "setup without bchannel, call waiting");
+                       bcfound++;
+               }
        } else {
                if (pc->debug & L3_DEB_WARN)
                        l3_debug(pc->st, "setup with wrong chid ret %d", id);
@@ -1757,7 +1757,7 @@ static void
 l3dss1_disconnect_req(struct l3_process *pc, u_char pr, void *arg)
 {
        struct sk_buff *skb;
-       u_char tmp[16+40];
+       u_char tmp[16 + 40];
        u_char *p = tmp;
        int l;
        u_char cause = 16;
@@ -1774,14 +1774,14 @@ l3dss1_disconnect_req(struct l3_process *pc, u_char pr, void *arg)
        *p++ = 0x80;
        *p++ = cause | 0x80;
 
-        if (pc->prot.dss1.uus1_data[0])
-        { *p++ = IE_USER_USER; /* UUS info element */
-           *p++ = strlen(pc->prot.dss1.uus1_data) + 1;
-           *p++ = 0x04; /* IA5 chars */
-           strcpy(p,pc->prot.dss1.uus1_data);
-           p += strlen(pc->prot.dss1.uus1_data);
-           pc->prot.dss1.uus1_data[0] = '\0';   
-         } 
+       if (pc->prot.dss1.uus1_data[0])
+       { *p++ = IE_USER_USER; /* UUS info element */
+               *p++ = strlen(pc->prot.dss1.uus1_data) + 1;
+               *p++ = 0x04; /* IA5 chars */
+               strcpy(p, pc->prot.dss1.uus1_data);
+               p += strlen(pc->prot.dss1.uus1_data);
+               pc->prot.dss1.uus1_data[0] = '\0';
+       }
 
        l = p - tmp;
        if (!(skb = l3_alloc_skb(l)))
@@ -1796,12 +1796,12 @@ static void
 l3dss1_setup_rsp(struct l3_process *pc, u_char pr,
                 void *arg)
 {
-        if (!pc->para.bchannel) 
-        { if (pc->debug & L3_DEB_WARN)
-              l3_debug(pc->st, "D-chan connect for waiting call");
-           l3dss1_disconnect_req(pc, pr, arg);
-           return;
-         }
+       if (!pc->para.bchannel)
+       { if (pc->debug & L3_DEB_WARN)
+                       l3_debug(pc->st, "D-chan connect for waiting call");
+               l3dss1_disconnect_req(pc, pr, arg);
+               return;
+       }
        newl3state(pc, 8);
        l3dss1_message(pc, MT_CONNECT);
        L3DelTimer(&pc->timer);
@@ -1860,26 +1860,26 @@ l3dss1_release(struct l3_process *pc, u_char pr, void *arg)
 {
        struct sk_buff *skb = arg;
        u_char *p;
-       int ret, cause=0;
+       int ret, cause = 0;
 
        StopAllL3Timer(pc);
-       if ((ret = l3dss1_get_cause(pc, skb))>0) {
+       if ((ret = l3dss1_get_cause(pc, skb)) > 0) {
                if (pc->debug & L3_DEB_WARN)
                        l3_debug(pc->st, "REL get_cause ret(%d)", ret);
-       } else if (ret<0)
+       } else if (ret < 0)
                pc->para.cause = NO_CAUSE;
        if ((p = findie(skb->data, skb->len, IE_FACILITY, 0))) {
                l3dss1_parse_facility(pc->st, pc, pc->callref, p);
        }
-       if ((ret<0) && (pc->state != 11))
+       if ((ret < 0) && (pc->state != 11))
                cause = 96;
-       else if (ret>0)
+       else if (ret > 0)
                cause = 100;
        ret = check_infoelements(pc, skb, ie_RELEASE);
        if (ERR_IE_COMPREHENSION == ret)
                cause = 96;
        else if ((ERR_IE_UNRECOGNIZED == ret) && (!cause))
-               cause = 99;  
+               cause = 99;
        if (cause)
                l3dss1_message_cause(pc, MT_RELEASE_COMPLETE, cause);
        else
@@ -1894,10 +1894,10 @@ l3dss1_alert_req(struct l3_process *pc, u_char pr,
                 void *arg)
 {
        newl3state(pc, 7);
-       if (!pc->prot.dss1.uus1_data[0]) 
+       if (!pc->prot.dss1.uus1_data[0])
                l3dss1_message(pc, MT_ALERTING);
        else
-               l3dss1_msg_with_uus(pc, MT_ALERTING); 
+               l3dss1_msg_with_uus(pc, MT_ALERTING);
 }
 
 static void
@@ -1906,12 +1906,12 @@ l3dss1_proceed_req(struct l3_process *pc, u_char pr,
 {
        newl3state(pc, 9);
        l3dss1_message(pc, MT_CALL_PROCEEDING);
-       pc->st->l3.l3l4(pc->st, CC_PROCEED_SEND | INDICATION, pc); 
+       pc->st->l3.l3l4(pc->st, CC_PROCEED_SEND | INDICATION, pc);
 }
 
 static void
 l3dss1_setup_ack_req(struct l3_process *pc, u_char pr,
-                  void *arg)
+                    void *arg)
 {
        newl3state(pc, 25);
        L3DelTimer(&pc->timer);
@@ -1925,22 +1925,22 @@ l3dss1_setup_ack_req(struct l3_process *pc, u_char pr,
 static void
 l3dss1_deliver_display(struct l3_process *pc, int pr, u_char *infp)
 {       u_char len;
-        isdn_ctrl ic; 
+       isdn_ctrl ic;
        struct IsdnCardState *cs;
-        char *p; 
+       char *p;
 
-        if (*infp++ != IE_DISPLAY) return;
-        if ((len = *infp++) > 80) return; /* total length <= 82 */
+       if (*infp++ != IE_DISPLAY) return;
+       if ((len = *infp++) > 80) return; /* total length <= 82 */
        if (!pc->chan) return;
 
-       p = ic.parm.display; 
-        while (len--)
-         *p++ = *infp++;
+       p = ic.parm.display;
+       while (len--)
+               *p++ = *infp++;
        *p = '\0';
        ic.command = ISDN_STAT_DISPLAY;
        cs = pc->st->l1.hardware;
        ic.driver = cs->myid;
-       ic.arg = pc->chan->chan; 
+       ic.arg = pc->chan->chan;
        cs->iif.statcallb(&ic);
 } /* l3dss1_deliver_display */
 
@@ -1958,37 +1958,37 @@ l3dss1_progress(struct l3_process *pc, u_char pr, void *arg)
                        pc->para.cause = 100;
                } else if (!(p[2] & 0x70)) {
                        switch (p[2]) {
-                               case 0x80:
+                       case 0x80:
+                       case 0x81:
+                       case 0x82:
+                       case 0x84:
+                       case 0x85:
+                       case 0x87:
+                       case 0x8a:
+                               switch (p[3]) {
                                case 0x81:
                                case 0x82:
+                               case 0x83:
                                case 0x84:
-                               case 0x85:
-                               case 0x87:
-                               case 0x8a:
-                                       switch (p[3]) {
-                                               case 0x81:
-                                               case 0x82:
-                                               case 0x83:
-                                               case 0x84:
-                                               case 0x88:
-                                                       break;
-                                               default:
-                                                       err = 2;
-                                                       pc->para.cause = 100;
-                                                       break;
-                                       }
+                               case 0x88:
                                        break;
                                default:
-                                       err = 3;
+                                       err = 2;
                                        pc->para.cause = 100;
                                        break;
+                               }
+                               break;
+                       default:
+                               err = 3;
+                               pc->para.cause = 100;
+                               break;
                        }
                }
        } else {
                pc->para.cause = 96;
                err = 4;
        }
-       if (err) {      
+       if (err) {
                if (pc->debug & L3_DEB_WARN)
                        l3_debug(pc->st, "progress error %d", err);
                l3dss1_status_send(pc, pr, NULL);
@@ -2015,21 +2015,21 @@ l3dss1_notify(struct l3_process *pc, u_char pr, void *arg)
                        pc->para.cause = 100;
                } else {
                        switch (p[2]) {
-                               case 0x80:
-                               case 0x81:
-                               case 0x82:
-                                       break;
-                               default:
-                                       pc->para.cause = 100;
-                                       err = 2;
-                                       break;
+                       case 0x80:
+                       case 0x81:
+                       case 0x82:
+                               break;
+                       default:
+                               pc->para.cause = 100;
+                               err = 2;
+                               break;
                        }
                }
        } else {
                pc->para.cause = 96;
                err = 3;
        }
-       if (err) {      
+       if (err) {
                if (pc->debug & L3_DEB_WARN)
                        l3_debug(pc->st, "notify error %d", err);
                l3dss1_status_send(pc, pr, NULL);
@@ -2052,7 +2052,7 @@ l3dss1_status_enq(struct l3_process *pc, u_char pr, void *arg)
        ret = check_infoelements(pc, skb, ie_STATUS_ENQUIRY);
        l3dss1_std_ie_err(pc, ret);
        pc->para.cause = 30; /* response to STATUS_ENQUIRY */
-        l3dss1_status_send(pc, pr, NULL);
+       l3dss1_status_send(pc, pr, NULL);
 }
 
 static void
@@ -2086,68 +2086,68 @@ static void l3dss1_redir_req(struct l3_process *pc, u_char pr, void *arg)
        struct sk_buff *skb;
        u_char tmp[128];
        u_char *p = tmp;
-        u_char *subp;
-        u_char len_phone = 0;
-        u_char len_sub = 0;
-       int l; 
-
-
-        strcpy(pc->prot.dss1.uus1_data,pc->chan->setup.eazmsn); /* copy uus element if available */
-        if (!pc->chan->setup.phone[0])
-          { pc->para.cause = -1;
-            l3dss1_disconnect_req(pc,pr,arg); /* disconnect immediately */
-            return;
-          } /* only uus */
-        if (pc->prot.dss1.invoke_id) 
-          free_invoke_id(pc->st,pc->prot.dss1.invoke_id);
-        if (!(pc->prot.dss1.invoke_id = new_invoke_id(pc->st))) 
-          return;
-
-        MsgHead(p, pc->callref, MT_FACILITY);
-
-        for (subp = pc->chan->setup.phone; (*subp) && (*subp != '.'); subp++) len_phone++; /* len of phone number */
-        if (*subp++ == '.') len_sub = strlen(subp) + 2; /* length including info subaddress element */ 
+       u_char *subp;
+       u_char len_phone = 0;
+       u_char len_sub = 0;
+       int l;
+
+
+       strcpy(pc->prot.dss1.uus1_data, pc->chan->setup.eazmsn); /* copy uus element if available */
+       if (!pc->chan->setup.phone[0])
+       { pc->para.cause = -1;
+               l3dss1_disconnect_req(pc, pr, arg); /* disconnect immediately */
+               return;
+       } /* only uus */
+
+       if (pc->prot.dss1.invoke_id)
+               free_invoke_id(pc->st, pc->prot.dss1.invoke_id);
+
+       if (!(pc->prot.dss1.invoke_id = new_invoke_id(pc->st)))
+               return;
+
+       MsgHead(p, pc->callref, MT_FACILITY);
+
+       for (subp = pc->chan->setup.phone; (*subp) && (*subp != '.'); subp++) len_phone++; /* len of phone number */
+       if (*subp++ == '.') len_sub = strlen(subp) + 2; /* length including info subaddress element */
 
        *p++ = 0x1c;   /* Facility info element */
-        *p++ = len_phone + len_sub + 2 + 2 + 8 + 3 + 3; /* length of element */
-        *p++ = 0x91;  /* remote operations protocol */
-        *p++ = 0xa1;  /* invoke component */
-         
-        *p++ = len_phone + len_sub + 2 + 2 + 8 + 3; /* length of data */
-        *p++ = 0x02;  /* invoke id tag, integer */
+       *p++ = len_phone + len_sub + 2 + 2 + 8 + 3 + 3; /* length of element */
+       *p++ = 0x91;  /* remote operations protocol */
+       *p++ = 0xa1;  /* invoke component */
+
+       *p++ = len_phone + len_sub + 2 + 2 + 8 + 3; /* length of data */
+       *p++ = 0x02;  /* invoke id tag, integer */
        *p++ = 0x01;  /* length */
-        *p++ = pc->prot.dss1.invoke_id;  /* invoke id */ 
-        *p++ = 0x02;  /* operation value tag, integer */
+       *p++ = pc->prot.dss1.invoke_id;  /* invoke id */
+       *p++ = 0x02;  /* operation value tag, integer */
        *p++ = 0x01;  /* length */
-        *p++ = 0x0D;  /* Call Deflect */
-         
-        *p++ = 0x30;  /* sequence phone number */
-        *p++ = len_phone + 2 + 2 + 3 + len_sub; /* length */
-         
-        *p++ = 0x30;  /* Deflected to UserNumber */
-        *p++ = len_phone+2+len_sub; /* length */
-        *p++ = 0x80; /* NumberDigits */
+       *p++ = 0x0D;  /* Call Deflect */
+
+       *p++ = 0x30;  /* sequence phone number */
+       *p++ = len_phone + 2 + 2 + 3 + len_sub; /* length */
+
+       *p++ = 0x30;  /* Deflected to UserNumber */
+       *p++ = len_phone + 2 + len_sub; /* length */
+       *p++ = 0x80; /* NumberDigits */
        *p++ = len_phone; /* length */
-        for (l = 0; l < len_phone; l++)
-        *p++ = pc->chan->setup.phone[l];
+       for (l = 0; l < len_phone; l++)
+               *p++ = pc->chan->setup.phone[l];
 
-        if (len_sub)
-         { *p++ = 0x04; /* called party subaddress */
-            *p++ = len_sub - 2;
-            while (*subp) *p++ = *subp++;
-          }
+       if (len_sub)
+       { *p++ = 0x04; /* called party subaddress */
+               *p++ = len_sub - 2;
+               while (*subp) *p++ = *subp++;
+       }
 
-        *p++ = 0x01; /* screening identifier */
-        *p++ = 0x01;
-        *p++ = pc->chan->setup.screen;
+       *p++ = 0x01; /* screening identifier */
+       *p++ = 0x01;
+       *p++ = pc->chan->setup.screen;
 
        l = p - tmp;
        if (!(skb = l3_alloc_skb(l))) return;
        memcpy(skb_put(skb, l), tmp, l);
 
-        l3_msg(pc->st, DL_DATA | REQUEST, skb);
+       l3_msg(pc->st, DL_DATA | REQUEST, skb);
 } /* l3dss1_redir_req */
 
 /********************************************/
@@ -2155,8 +2155,8 @@ static void l3dss1_redir_req(struct l3_process *pc, u_char pr, void *arg)
 /********************************************/
 static void l3dss1_redir_req_early(struct l3_process *pc, u_char pr, void *arg)
 {
-  l3dss1_proceed_req(pc,pr,arg);
-  l3dss1_redir_req(pc,pr,arg);
+       l3dss1_proceed_req(pc, pr, arg);
+       l3dss1_redir_req(pc, pr, arg);
 } /* l3dss1_redir_req_early */
 
 /***********************************************/
@@ -2166,108 +2166,108 @@ static void l3dss1_redir_req_early(struct l3_process *pc, u_char pr, void *arg)
 /***********************************************/
 static int l3dss1_cmd_global(struct PStack *st, isdn_ctrl *ic)
 { u_char id;
-  u_char temp[265];
-  u_char *p = temp;
-  int i, l, proc_len; 
-  struct sk_buff *skb;
-  struct l3_process *pc = NULL;
-
-  switch (ic->arg)
-   { case DSS1_CMD_INVOKE:
-       if (ic->parm.dss1_io.datalen < 0) return(-2); /* invalid parameter */ 
-
-       for (proc_len = 1, i = ic->parm.dss1_io.proc >> 8; i; i++) 
-         i = i >> 8; /* add one byte */    
-       l = ic->parm.dss1_io.datalen + proc_len + 8; /* length excluding ie header */
-       if (l > 255) 
-         return(-2); /* too long */
-
-       if (!(id = new_invoke_id(st))) 
-         return(0); /* first get a invoke id -> return if no available */
-       
-       i = -1; 
-       MsgHead(p, i, MT_FACILITY); /* build message head */
-       *p++ = 0x1C; /* Facility IE */
-       *p++ = l; /* length of ie */
-       *p++ = 0x91; /* remote operations */
-       *p++ = 0xA1; /* invoke */
-       *p++ = l - 3; /* length of invoke */
-       *p++ = 0x02; /* invoke id tag */
-       *p++ = 0x01; /* length is 1 */
-       *p++ = id; /* invoke id */
-       *p++ = 0x02; /* operation */
-       *p++ = proc_len; /* length of operation */
-       
-       for (i = proc_len; i; i--)
-         *p++ = (ic->parm.dss1_io.proc >> (i-1)) & 0xFF;
-       memcpy(p, ic->parm.dss1_io.data, ic->parm.dss1_io.datalen); /* copy data */
-       l = (p - temp) + ic->parm.dss1_io.datalen; /* total length */         
-
-       if (ic->parm.dss1_io.timeout > 0)
-        if (!(pc = dss1_new_l3_process(st, -1)))
-          { free_invoke_id(st, id);
-            return(-2);
-          } 
-       pc->prot.dss1.ll_id = ic->parm.dss1_io.ll_id; /* remember id */ 
-       pc->prot.dss1.proc = ic->parm.dss1_io.proc; /* and procedure */
-
-       if (!(skb = l3_alloc_skb(l))) 
-         { free_invoke_id(st, id);
-           if (pc) dss1_release_l3_process(pc);
-           return(-2);
-         }
-       memcpy(skb_put(skb, l), temp, l);
-       
-       if (pc)
-        { pc->prot.dss1.invoke_id = id; /* remember id */
-          L3AddTimer(&pc->timer, ic->parm.dss1_io.timeout, CC_TDSS1_IO | REQUEST);
-        }
-       
-       l3_msg(st, DL_DATA | REQUEST, skb);
-       ic->parm.dss1_io.hl_id = id; /* return id */
-       return(0);
-
-     case DSS1_CMD_INVOKE_ABORT:
-       if ((pc = l3dss1_search_dummy_proc(st, ic->parm.dss1_io.hl_id)))
-       { L3DelTimer(&pc->timer); /* remove timer */
-          dss1_release_l3_process(pc);
-          return(0); 
-        } 
-       else
-       { l3_debug(st, "l3dss1_cmd_global abort unknown id");
-          return(-2);
-        } 
-       break;
-    
-     default: 
-       l3_debug(st, "l3dss1_cmd_global unknown cmd 0x%lx", ic->arg);
-       return(-1);  
-   } /* switch ic-> arg */
-  return(-1);
+       u_char temp[265];
+       u_char *p = temp;
+       int i, l, proc_len;
+       struct sk_buff *skb;
+       struct l3_process *pc = NULL;
+
+       switch (ic->arg)
+       { case DSS1_CMD_INVOKE:
+                       if (ic->parm.dss1_io.datalen < 0) return (-2); /* invalid parameter */
+
+                       for (proc_len = 1, i = ic->parm.dss1_io.proc >> 8; i; i++)
+                               i = i >> 8; /* add one byte */
+                       l = ic->parm.dss1_io.datalen + proc_len + 8; /* length excluding ie header */
+                       if (l > 255)
+                               return (-2); /* too long */
+
+                       if (!(id = new_invoke_id(st)))
+                               return (0); /* first get a invoke id -> return if no available */
+
+                       i = -1;
+                       MsgHead(p, i, MT_FACILITY); /* build message head */
+                       *p++ = 0x1C; /* Facility IE */
+                       *p++ = l; /* length of ie */
+                       *p++ = 0x91; /* remote operations */
+                       *p++ = 0xA1; /* invoke */
+                       *p++ = l - 3; /* length of invoke */
+                       *p++ = 0x02; /* invoke id tag */
+                       *p++ = 0x01; /* length is 1 */
+                       *p++ = id; /* invoke id */
+                       *p++ = 0x02; /* operation */
+                       *p++ = proc_len; /* length of operation */
+
+                       for (i = proc_len; i; i--)
+                               *p++ = (ic->parm.dss1_io.proc >> (i - 1)) & 0xFF;
+                       memcpy(p, ic->parm.dss1_io.data, ic->parm.dss1_io.datalen); /* copy data */
+                       l = (p - temp) + ic->parm.dss1_io.datalen; /* total length */
+
+                       if (ic->parm.dss1_io.timeout > 0)
+                               if (!(pc = dss1_new_l3_process(st, -1)))
+                               { free_invoke_id(st, id);
+                                       return (-2);
+                               }
+                       pc->prot.dss1.ll_id = ic->parm.dss1_io.ll_id; /* remember id */
+                       pc->prot.dss1.proc = ic->parm.dss1_io.proc; /* and procedure */
+
+                       if (!(skb = l3_alloc_skb(l)))
+                       { free_invoke_id(st, id);
+                               if (pc) dss1_release_l3_process(pc);
+                               return (-2);
+                       }
+                       memcpy(skb_put(skb, l), temp, l);
+
+                       if (pc)
+                       { pc->prot.dss1.invoke_id = id; /* remember id */
+                               L3AddTimer(&pc->timer, ic->parm.dss1_io.timeout, CC_TDSS1_IO | REQUEST);
+                       }
+
+                       l3_msg(st, DL_DATA | REQUEST, skb);
+                       ic->parm.dss1_io.hl_id = id; /* return id */
+                       return (0);
+
+       case DSS1_CMD_INVOKE_ABORT:
+               if ((pc = l3dss1_search_dummy_proc(st, ic->parm.dss1_io.hl_id)))
+               { L3DelTimer(&pc->timer); /* remove timer */
+                       dss1_release_l3_process(pc);
+                       return (0);
+               }
+               else
+               { l3_debug(st, "l3dss1_cmd_global abort unknown id");
+                       return (-2);
+               }
+               break;
+
+       default:
+               l3_debug(st, "l3dss1_cmd_global unknown cmd 0x%lx", ic->arg);
+               return (-1);
+       } /* switch ic-> arg */
+       return (-1);
 } /* l3dss1_cmd_global */
 
-static void 
+static void
 l3dss1_io_timer(struct l3_process *pc)
 { isdn_ctrl ic;
-  struct IsdnCardState *cs = pc->st->l1.hardware;
+       struct IsdnCardState *cs = pc->st->l1.hardware;
 
-  L3DelTimer(&pc->timer); /* remove timer */
+       L3DelTimer(&pc->timer); /* remove timer */
 
-  ic.driver = cs->myid;
-  ic.command = ISDN_STAT_PROT;
-  ic.arg = DSS1_STAT_INVOKE_ERR;
-  ic.parm.dss1_io.hl_id = pc->prot.dss1.invoke_id;
-  ic.parm.dss1_io.ll_id = pc->prot.dss1.ll_id;
-  ic.parm.dss1_io.proc = pc->prot.dss1.proc;
-  ic.parm.dss1_io.timeout= -1;
-  ic.parm.dss1_io.datalen = 0;
-  ic.parm.dss1_io.data = NULL;
-  free_invoke_id(pc->st, pc->prot.dss1.invoke_id);
-  pc->prot.dss1.invoke_id = 0; /* reset id */
+       ic.driver = cs->myid;
+       ic.command = ISDN_STAT_PROT;
+       ic.arg = DSS1_STAT_INVOKE_ERR;
+       ic.parm.dss1_io.hl_id = pc->prot.dss1.invoke_id;
+       ic.parm.dss1_io.ll_id = pc->prot.dss1.ll_id;
+       ic.parm.dss1_io.proc = pc->prot.dss1.proc;
+       ic.parm.dss1_io.timeout = -1;
+       ic.parm.dss1_io.datalen = 0;
+       ic.parm.dss1_io.data = NULL;
+       free_invoke_id(pc->st, pc->prot.dss1.invoke_id);
+       pc->prot.dss1.invoke_id = 0; /* reset id */
 
-  cs->iif.statcallb(&ic);
+       cs->iif.statcallb(&ic);
 
-  dss1_release_l3_process(pc); 
+       dss1_release_l3_process(pc);
 } /* l3dss1_io_timer */
 
 static void
@@ -2437,12 +2437,12 @@ l3dss1_status(struct l3_process *pc, u_char pr, void *arg)
 {
        u_char *p;
        struct sk_buff *skb = arg;
-       int ret; 
+       int ret;
        u_char cause = 0, callState = 0;
-       
+
        if ((ret = l3dss1_get_cause(pc, skb))) {
                if (pc->debug & L3_DEB_WARN)
-                       l3_debug(pc->st, "STATUS get_cause ret(%d)",ret);
+                       l3_debug(pc->st, "STATUS get_cause ret(%d)", ret);
                if (ret < 0)
                        cause = 96;
                else if (ret > 0)
@@ -2467,9 +2467,9 @@ l3dss1_status(struct l3_process *pc, u_char pr, void *arg)
        }
        if (cause) {
                u_char tmp;
-               
+
                if (pc->debug & L3_DEB_WARN)
-                       l3_debug(pc->st, "STATUS error(%d/%d)",ret,cause);
+                       l3_debug(pc->st, "STATUS error(%d/%d)", ret, cause);
                tmp = pc->para.cause;
                pc->para.cause = cause;
                l3dss1_status_send(pc, 0, NULL);
@@ -2495,10 +2495,10 @@ l3dss1_facility(struct l3_process *pc, u_char pr, void *arg)
 {
        struct sk_buff *skb = arg;
        int ret;
-       
+
        ret = check_infoelements(pc, skb, ie_FACILITY);
        l3dss1_std_ie_err(pc, ret);
-         {
+       {
                u_char *p;
                if ((p = findie(skb->data, skb->len, IE_FACILITY, 0)))
                        l3dss1_parse_facility(pc->st, pc, pc->callref, p);
@@ -2547,7 +2547,7 @@ l3dss1_suspend_ack(struct l3_process *pc, u_char pr, void *arg)
        /* We don't handle suspend_ack for IE errors now */
        if ((ret = check_infoelements(pc, skb, ie_SUSPEND_ACKNOWLEDGE)))
                if (pc->debug & L3_DEB_WARN)
-                       l3_debug(pc->st, "SUSPACK check ie(%d)",ret);
+                       l3_debug(pc->st, "SUSPACK check ie(%d)", ret);
        dss1_release_l3_process(pc);
 }
 
@@ -2559,8 +2559,8 @@ l3dss1_suspend_rej(struct l3_process *pc, u_char pr, void *arg)
 
        if ((ret = l3dss1_get_cause(pc, skb))) {
                if (pc->debug & L3_DEB_WARN)
-                       l3_debug(pc->st, "SUSP_REJ get_cause ret(%d)",ret);
-               if (ret < 0) 
+                       l3_debug(pc->st, "SUSP_REJ get_cause ret(%d)", ret);
+               if (ret < 0)
                        pc->para.cause = 96;
                else
                        pc->para.cause = 100;
@@ -2651,8 +2651,8 @@ l3dss1_resume_rej(struct l3_process *pc, u_char pr, void *arg)
 
        if ((ret = l3dss1_get_cause(pc, skb))) {
                if (pc->debug & L3_DEB_WARN)
-                       l3_debug(pc->st, "RES_REJ get_cause ret(%d)",ret);
-               if (ret < 0) 
+                       l3_debug(pc->st, "RES_REJ get_cause ret(%d)", ret);
+               if (ret < 0)
                        pc->para.cause = 96;
                else
                        pc->para.cause = 100;
@@ -2729,36 +2729,36 @@ l3dss1_global_restart(struct l3_process *pc, u_char pr, void *arg)
 static void
 l3dss1_dl_reset(struct l3_process *pc, u_char pr, void *arg)
 {
-        pc->para.cause = 0x29;          /* Temporary failure */
-        pc->para.loc = 0;
-        l3dss1_disconnect_req(pc, pr, NULL);
-        pc->st->l3.l3l4(pc->st, CC_SETUP_ERR, pc);
+       pc->para.cause = 0x29;          /* Temporary failure */
+       pc->para.loc = 0;
+       l3dss1_disconnect_req(pc, pr, NULL);
+       pc->st->l3.l3l4(pc->st, CC_SETUP_ERR, pc);
 }
 
 static void
 l3dss1_dl_release(struct l3_process *pc, u_char pr, void *arg)
 {
-        newl3state(pc, 0);
-        pc->para.cause = 0x1b;          /* Destination out of order */
-        pc->para.loc = 0;
-        pc->st->l3.l3l4(pc->st, CC_RELEASE | INDICATION, pc);
-        release_l3_process(pc);
+       newl3state(pc, 0);
+       pc->para.cause = 0x1b;          /* Destination out of order */
+       pc->para.loc = 0;
+       pc->st->l3.l3l4(pc->st, CC_RELEASE | INDICATION, pc);
+       release_l3_process(pc);
 }
 
 static void
 l3dss1_dl_reestablish(struct l3_process *pc, u_char pr, void *arg)
 {
-        L3DelTimer(&pc->timer);
-        L3AddTimer(&pc->timer, T309, CC_T309);
-        l3_msg(pc->st, DL_ESTABLISH | REQUEST, NULL);
+       L3DelTimer(&pc->timer);
+       L3AddTimer(&pc->timer, T309, CC_T309);
+       l3_msg(pc->st, DL_ESTABLISH | REQUEST, NULL);
 }
+
 static void
 l3dss1_dl_reest_status(struct l3_process *pc, u_char pr, void *arg)
 {
        L3DelTimer(&pc->timer);
-       pc->para.cause = 0x1F; /* normal, unspecified */
+
+       pc->para.cause = 0x1F; /* normal, unspecified */
        l3dss1_status_send(pc, 0, NULL);
 }
 
@@ -2791,12 +2791,12 @@ static struct stateentry downstatelist[] =
         CC_SETUP | RESPONSE, l3dss1_setup_rsp},
        {SBIT(10),
         CC_SUSPEND | REQUEST, l3dss1_suspend_req},
-        {SBIT(7) | SBIT(9) | SBIT(25),
-         CC_REDIR | REQUEST, l3dss1_redir_req},
-        {SBIT(6),
-         CC_REDIR | REQUEST, l3dss1_redir_req_early},
-        {SBIT(9) | SBIT(25),
-         CC_DISCONNECT | REQUEST, l3dss1_disconnect_req},
+       {SBIT(7) | SBIT(9) | SBIT(25),
+        CC_REDIR | REQUEST, l3dss1_redir_req},
+       {SBIT(6),
+        CC_REDIR | REQUEST, l3dss1_redir_req_early},
+       {SBIT(9) | SBIT(25),
+        CC_DISCONNECT | REQUEST, l3dss1_disconnect_req},
        {SBIT(25),
         CC_T302, l3dss1_t302},
        {SBIT(1),
@@ -2880,20 +2880,20 @@ static struct stateentry globalmes_list[] =
        {SBIT(0),
         MT_RESTART, l3dss1_global_restart},
 /*     {SBIT(1),
-        MT_RESTART_ACKNOWLEDGE, l3dss1_restart_ack},
+       MT_RESTART_ACKNOWLEDGE, l3dss1_restart_ack},
 */
 };
 
 static struct stateentry manstatelist[] =
 {
-        {SBIT(2),
-         DL_ESTABLISH | INDICATION, l3dss1_dl_reset},
-        {SBIT(10),
-         DL_ESTABLISH | CONFIRM, l3dss1_dl_reest_status},
-        {SBIT(10),
-         DL_RELEASE | INDICATION, l3dss1_dl_reestablish},
-        {ALL_STATES,
-         DL_RELEASE | INDICATION, l3dss1_dl_release},
+       {SBIT(2),
+        DL_ESTABLISH | INDICATION, l3dss1_dl_reset},
+       {SBIT(10),
+        DL_ESTABLISH | CONFIRM, l3dss1_dl_reest_status},
+       {SBIT(10),
+        DL_RELEASE | INDICATION, l3dss1_dl_reestablish},
+       {ALL_STATES,
+        DL_RELEASE | INDICATION, l3dss1_dl_release},
 };
 
 /* *INDENT-ON* */
@@ -2916,13 +2916,13 @@ global_handler(struct PStack *st, int mt, struct sk_buff *skb)
        if (i == ARRAY_SIZE(globalmes_list)) {
                if (st->l3.debug & L3_DEB_STATE) {
                        l3_debug(st, "dss1 global state %d mt %x unhandled",
-                               proc->state, mt);
+                                proc->state, mt);
                }
                MsgHead(p, proc->callref, MT_STATUS);
                *p++ = IE_CAUSE;
                *p++ = 0x2;
                *p++ = 0x80;
-               *p++ = 81 |0x80;        /* invalid cr */
+               *p++ = 81 | 0x80;       /* invalid cr */
                *p++ = 0x14;            /* CallState */
                *p++ = 0x1;
                *p++ = proc->state & 0x3f;
@@ -2934,7 +2934,7 @@ global_handler(struct PStack *st, int mt, struct sk_buff *skb)
        } else {
                if (st->l3.debug & L3_DEB_STATE) {
                        l3_debug(st, "dss1 global %d mt %x",
-                               proc->state, mt);
+                                proc->state, mt);
                }
                globalmes_list[i].rout(proc, mt, skb);
        }
@@ -2950,19 +2950,19 @@ dss1up(struct PStack *st, int pr, void *arg)
        struct l3_process *proc;
 
        switch (pr) {
-               case (DL_DATA | INDICATION):
-               case (DL_UNIT_DATA | INDICATION):
-                       break;
-               case (DL_ESTABLISH | CONFIRM):
-               case (DL_ESTABLISH | INDICATION):
-               case (DL_RELEASE | INDICATION):
-               case (DL_RELEASE | CONFIRM):
-                       l3_msg(st, pr, arg);
-                       return;
-                       break;
-                default:
-                        printk(KERN_ERR "HiSax dss1up unknown pr=%04x\n", pr);
-                        return;
+       case (DL_DATA | INDICATION):
+       case (DL_UNIT_DATA | INDICATION):
+               break;
+       case (DL_ESTABLISH | CONFIRM):
+       case (DL_ESTABLISH | INDICATION):
+       case (DL_RELEASE | INDICATION):
+       case (DL_RELEASE | CONFIRM):
+               l3_msg(st, pr, arg);
+               return;
+               break;
+       default:
+               printk(KERN_ERR "HiSax dss1up unknown pr=%04x\n", pr);
+               return;
        }
        if (skb->len < 3) {
                l3_debug(st, "dss1up frame too short(%d)", skb->len);
@@ -2996,17 +2996,17 @@ dss1up(struct PStack *st, int pr, void *arg)
        } else if (cr == -1) {  /* Dummy Callref */
                if (mt == MT_FACILITY)
                        if ((p = findie(skb->data, skb->len, IE_FACILITY, 0))) {
-                               l3dss1_parse_facility(st, NULL, 
-                                       (pr == (DL_DATA | INDICATION)) ? -1 : -2, p); 
+                               l3dss1_parse_facility(st, NULL,
+                                                     (pr == (DL_DATA | INDICATION)) ? -1 : -2, p);
                                dev_kfree_skb(skb);
-                               return;  
+                               return;
                        }
                if (st->l3.debug & L3_DEB_WARN)
                        l3_debug(st, "dss1up dummy Callref (no facility msg or ie)");
                dev_kfree_skb(skb);
                return;
-       } else if ((((skb->data[1] & 0x0f) == 1) && (0==(cr & 0x7f))) ||
-               (((skb->data[1] & 0x0f) == 2) && (0==(cr & 0x7fff)))) { /* Global CallRef */
+       } else if ((((skb->data[1] & 0x0f) == 1) && (0 == (cr & 0x7f))) ||
+                  (((skb->data[1] & 0x0f) == 2) && (0 == (cr & 0x7fff)))) {    /* Global CallRef */
                if (st->l3.debug & L3_DEB_STATE)
                        l3_debug(st, "dss1up Global CallRef");
                global_handler(st, mt, skb);
@@ -3084,8 +3084,8 @@ dss1up(struct PStack *st, int pr, void *arg)
                dev_kfree_skb(skb);
                return;
        }
-       if ((p = findie(skb->data, skb->len, IE_DISPLAY, 0)) != NULL) 
-         l3dss1_deliver_display(proc, pr, p); /* Display IE included */
+       if ((p = findie(skb->data, skb->len, IE_DISPLAY, 0)) != NULL)
+               l3dss1_deliver_display(proc, pr, p); /* Display IE included */
        for (i = 0; i < ARRAY_SIZE(datastatelist); i++)
                if ((mt == datastatelist[i].primitive) &&
                    ((1 << proc->state) & datastatelist[i].state))
@@ -3093,8 +3093,8 @@ dss1up(struct PStack *st, int pr, void *arg)
        if (i == ARRAY_SIZE(datastatelist)) {
                if (st->l3.debug & L3_DEB_STATE) {
                        l3_debug(st, "dss1up%sstate %d mt %#x unhandled",
-                               (pr == (DL_DATA | INDICATION)) ? " " : "(broadcast) ",
-                               proc->state, mt);
+                                (pr == (DL_DATA | INDICATION)) ? " " : "(broadcast) ",
+                                proc->state, mt);
                }
                if ((MT_RELEASE_COMPLETE != mt) && (MT_RELEASE != mt)) {
                        proc->para.cause = 101;
@@ -3103,8 +3103,8 @@ dss1up(struct PStack *st, int pr, void *arg)
        } else {
                if (st->l3.debug & L3_DEB_STATE) {
                        l3_debug(st, "dss1up%sstate %d mt %x",
-                               (pr == (DL_DATA | INDICATION)) ? " " : "(broadcast) ",
-                               proc->state, mt);
+                                (pr == (DL_DATA | INDICATION)) ? " " : "(broadcast) ",
+                                proc->state, mt);
                }
                datastatelist[i].rout(proc, pr, skb);
        }
@@ -3140,10 +3140,10 @@ dss1down(struct PStack *st, int pr, void *arg)
                return;
        }
 
-       if ( pr == (CC_TDSS1_IO | REQUEST)) {
-               l3dss1_io_timer(proc); /* timer expires */ 
+       if (pr == (CC_TDSS1_IO | REQUEST)) {
+               l3dss1_io_timer(proc); /* timer expires */
                return;
-       }  
+       }
 
        for (i = 0; i < ARRAY_SIZE(downstatelist); i++)
                if ((pr == downstatelist[i].primitive) &&
@@ -3152,12 +3152,12 @@ dss1down(struct PStack *st, int pr, void *arg)
        if (i == ARRAY_SIZE(downstatelist)) {
                if (st->l3.debug & L3_DEB_STATE) {
                        l3_debug(st, "dss1down state %d prim %#x unhandled",
-                               proc->state, pr);
+                                proc->state, pr);
                }
        } else {
                if (st->l3.debug & L3_DEB_STATE) {
                        l3_debug(st, "dss1down state %d prim %#x",
-                               proc->state, pr);
+                                proc->state, pr);
                }
                downstatelist[i].rout(proc, pr, arg);
        }
@@ -3166,31 +3166,31 @@ dss1down(struct PStack *st, int pr, void *arg)
 static void
 dss1man(struct PStack *st, int pr, void *arg)
 {
-        int i;
-        struct l3_process *proc = arg;
-        if (!proc) {
-                printk(KERN_ERR "HiSax dss1man without proc pr=%04x\n", pr);
-                return;
-        }
-        for (i = 0; i < ARRAY_SIZE(manstatelist); i++)
-                if ((pr == manstatelist[i].primitive) &&
-                    ((1 << proc->state) & manstatelist[i].state))
-                        break;
-        if (i == ARRAY_SIZE(manstatelist)) {
-                if (st->l3.debug & L3_DEB_STATE) {
-                        l3_debug(st, "cr %d dss1man state %d prim %#x unhandled",
-                                proc->callref & 0x7f, proc->state, pr);
-                }
-        } else {
-                if (st->l3.debug & L3_DEB_STATE) {
-                        l3_debug(st, "cr %d dss1man state %d prim %#x",
-                                proc->callref & 0x7f, proc->state, pr);
-                }
-                manstatelist[i].rout(proc, pr, arg);
-        }
-}
+       int i;
+       struct l3_process *proc = arg;
+
+       if (!proc) {
+               printk(KERN_ERR "HiSax dss1man without proc pr=%04x\n", pr);
+               return;
+       }
+       for (i = 0; i < ARRAY_SIZE(manstatelist); i++)
+               if ((pr == manstatelist[i].primitive) &&
+                   ((1 << proc->state) & manstatelist[i].state))
+                       break;
+       if (i == ARRAY_SIZE(manstatelist)) {
+               if (st->l3.debug & L3_DEB_STATE) {
+                       l3_debug(st, "cr %d dss1man state %d prim %#x unhandled",
+                                proc->callref & 0x7f, proc->state, pr);
+               }
+       } else {
+               if (st->l3.debug & L3_DEB_STATE) {
+                       l3_debug(st, "cr %d dss1man state %d prim %#x",
+                                proc->callref & 0x7f, proc->state, pr);
+               }
+               manstatelist[i].rout(proc, pr, arg);
+       }
+}
+
 void
 setstack_dss1(struct PStack *st)
 {
@@ -3205,8 +3205,8 @@ setstack_dss1(struct PStack *st)
        st->prot.dss1.last_invoke_id = 0;
        st->prot.dss1.invoke_used[0] = 1; /* Bit 0 must always be set to 1 */
        i = 1;
-       while (i < 32) 
-               st->prot.dss1.invoke_used[i++] = 0;   
+       while (i < 32)
+               st->prot.dss1.invoke_used[i++] = 0;
 
        if (!(st->l3.global = kmalloc(sizeof(struct l3_process), GFP_ATOMIC))) {
                printk(KERN_ERR "HiSax can't get memory for dss1 global CR\n");
@@ -3217,7 +3217,7 @@ setstack_dss1(struct PStack *st)
                st->l3.global->debug = L3_DEB_WARN;
                st->l3.global->st = st;
                st->l3.global->N303 = 1;
-               st->l3.global->prot.dss1.invoke_id = 0; 
+               st->l3.global->prot.dss1.invoke_id = 0;
 
                L3InitTimer(st->l3.global, &st->l3.global->timer);
        }
index 6da47f0..a7807e8 100644 (file)
 
 /* l3dss1 specific data in l3 process */
 typedef struct
-  { unsigned char invoke_id; /* used invoke id in remote ops, 0 = not active */
-    ulong ll_id; /* remebered ll id */
-    u8 remote_operation; /* handled remote operation, 0 = not active */ 
-    int proc; /* rememered procedure */  
-    ulong remote_result; /* result of remote operation for statcallb */
-    char uus1_data[35]; /* data send during alerting or disconnect */
-  } dss1_proc_priv;
+{ unsigned char invoke_id; /* used invoke id in remote ops, 0 = not active */
+       ulong ll_id; /* remebered ll id */
+       u8 remote_operation; /* handled remote operation, 0 = not active */
+       int proc; /* rememered procedure */
+       ulong remote_result; /* result of remote operation for statcallb */
+       char uus1_data[35]; /* data send during alerting or disconnect */
+} dss1_proc_priv;
 
 /* l3dss1 specific data in protocol stack */
 typedef struct
-  { unsigned char last_invoke_id; /* last used value for invoking */
-    unsigned char invoke_used[32]; /* 256 bits for 256 values */
-  } dss1_stk_priv;        
+{ unsigned char last_invoke_id; /* last used value for invoking */
+       unsigned char invoke_used[32]; /* 256 bits for 256 values */
+} dss1_stk_priv;
 
 #endif /* only l3dss1_process */
index 092dcbb..0df6691 100644 (file)
@@ -4,14 +4,14 @@
  *
  * Author       Matt Henderson & Guy Ellis
  * Copyright    by Traverse Technologies Pty Ltd, www.travers.com.au
- * 
+ *
  * This software may be used and distributed according to the terms
  * of the GNU General Public License, incorporated herein by reference.
  *
- * 2000.6.6 Initial implementation of routines for US NI1 
- * Layer 3 protocol based on the EURO/DSS1 D-channel protocol 
- * driver written by Karsten Keil et al.  
- * NI-1 Hall of Fame - Thanks to.... 
+ * 2000.6.6 Initial implementation of routines for US NI1
+ * Layer 3 protocol based on the EURO/DSS1 D-channel protocol
+ * driver written by Karsten Keil et al.
+ * NI-1 Hall of Fame - Thanks to....
  * Ragnar Paulson - for some handy code fragments
  * Will Scales - beta tester extraordinaire
  * Brett Whittacre - beta tester and remote devel system in Vegas
@@ -29,14 +29,14 @@ static const char *ni1_revision = "$Revision: 2.8.2.3 $";
 
 #define EXT_BEARER_CAPS 1
 
-#define        MsgHead(ptr, cref, mty) \
-       *ptr++ = 0x8; \
-       if (cref == -1) { \
-               *ptr++ = 0x0; \
-       } else { \
-               *ptr++ = 0x1; \
-               *ptr++ = cref^0x80; \
-       } \
+#define        MsgHead(ptr, cref, mty)                 \
+       *ptr++ = 0x8;                           \
+       if (cref == -1) {                       \
+               *ptr++ = 0x0;                   \
+       } else {                                \
+               *ptr++ = 0x1;                   \
+               *ptr++ = cref^0x80;             \
+       }                                       \
        *ptr++ = mty
 
 
@@ -48,22 +48,22 @@ static unsigned char new_invoke_id(struct PStack *p)
 {
        unsigned char retval;
        int i;
-  
+
        i = 32; /* maximum search depth */
 
        retval = p->prot.ni1.last_invoke_id + 1; /* try new id */
        while ((i) && (p->prot.ni1.invoke_used[retval >> 3] == 0xFF)) {
                p->prot.ni1.last_invoke_id = (retval & 0xF8) + 8;
                i--;
-       }  
+       }
        if (i) {
                while (p->prot.ni1.invoke_used[retval >> 3] & (1 << (retval & 7)))
-               retval++; 
+                       retval++;
        } else
                retval = 0;
        p->prot.ni1.last_invoke_id = retval;
        p->prot.ni1.invoke_used[retval >> 3] |= (1 << (retval & 7));
-       return(retval);  
+       return (retval);
 } /* new_invoke_id */
 
 /*************************/
@@ -72,10 +72,10 @@ static unsigned char new_invoke_id(struct PStack *p)
 static void free_invoke_id(struct PStack *p, unsigned char id)
 {
 
-  if (!id) return; /* 0 = invalid value */
+       if (!id) return; /* 0 = invalid value */
 
-  p->prot.ni1.invoke_used[id >> 3] &= ~(1 << (id & 7));
-} /* free_invoke_id */  
+       p->prot.ni1.invoke_used[id >> 3] &= ~(1 << (id & 7));
+} /* free_invoke_id */
 
 
 /**********************************************************/
@@ -85,26 +85,26 @@ static struct l3_process
 *ni1_new_l3_process(struct PStack *st, int cr)
 {  struct l3_process *proc;
 
-   if (!(proc = new_l3_process(st, cr))) 
-     return(NULL);
+       if (!(proc = new_l3_process(st, cr)))
+               return (NULL);
 
-   proc->prot.ni1.invoke_id = 0;
-   proc->prot.ni1.remote_operation = 0;
-   proc->prot.ni1.uus1_data[0] = '\0';
-   
-   return(proc);
+       proc->prot.ni1.invoke_id = 0;
+       proc->prot.ni1.remote_operation = 0;
+       proc->prot.ni1.uus1_data[0] = '\0';
+
+       return (proc);
 } /* ni1_new_l3_process */
 
 /************************************************/
 /* free a l3 process and all ni1 specific data */
-/************************************************/ 
+/************************************************/
 static void
 ni1_release_l3_process(struct l3_process *p)
 {
-   free_invoke_id(p->st,p->prot.ni1.invoke_id);
-   release_l3_process(p);
+       free_invoke_id(p->st, p->prot.ni1.invoke_id);
+       release_l3_process(p);
 } /* ni1_release_l3_process */
+
 /********************************************************/
 /* search a process with invoke id id and dummy callref */
 /********************************************************/
@@ -112,120 +112,120 @@ static struct l3_process *
 l3ni1_search_dummy_proc(struct PStack *st, int id)
 { struct l3_process *pc = st->l3.proc; /* start of processes */
 
-  if (!id) return(NULL);
+       if (!id) return (NULL);
 
-  while (pc)
-   { if ((pc->callref == -1) && (pc->prot.ni1.invoke_id == id))
-       return(pc);
-     pc = pc->next;
-   } 
-  return(NULL);
+       while (pc)
+       { if ((pc->callref == -1) && (pc->prot.ni1.invoke_id == id))
+                       return (pc);
+               pc = pc->next;
+       }
+       return (NULL);
 } /* l3ni1_search_dummy_proc */
 
 /*******************************************************************/
 /* called when a facility message with a dummy callref is received */
 /* and a return result is delivered. id specifies the invoke id.   */
-/*******************************************************************/ 
-static void 
+/*******************************************************************/
+static void
 l3ni1_dummy_return_result(struct PStack *st, int id, u_char *p, u_char nlen)
 { isdn_ctrl ic;
-  struct IsdnCardState *cs;
-  struct l3_process *pc = NULL; 
-
-  if ((pc = l3ni1_search_dummy_proc(st, id)))
-   { L3DelTimer(&pc->timer); /* remove timer */
-
-     cs = pc->st->l1.hardware;
-     ic.driver = cs->myid;
-     ic.command = ISDN_STAT_PROT;
-     ic.arg = NI1_STAT_INVOKE_RES;
-     ic.parm.ni1_io.hl_id = pc->prot.ni1.invoke_id;
-     ic.parm.ni1_io.ll_id = pc->prot.ni1.ll_id;
-     ic.parm.ni1_io.proc = pc->prot.ni1.proc;
-     ic.parm.ni1_io.timeout= 0;
-     ic.parm.ni1_io.datalen = nlen;
-     ic.parm.ni1_io.data = p;
-     free_invoke_id(pc->st, pc->prot.ni1.invoke_id);
-     pc->prot.ni1.invoke_id = 0; /* reset id */
-
-     cs->iif.statcallb(&ic);
-     ni1_release_l3_process(pc); 
-   }
-  else
-   l3_debug(st, "dummy return result id=0x%x result len=%d",id,nlen);
+       struct IsdnCardState *cs;
+       struct l3_process *pc = NULL;
+
+       if ((pc = l3ni1_search_dummy_proc(st, id)))
+       { L3DelTimer(&pc->timer); /* remove timer */
+
+               cs = pc->st->l1.hardware;
+               ic.driver = cs->myid;
+               ic.command = ISDN_STAT_PROT;
+               ic.arg = NI1_STAT_INVOKE_RES;
+               ic.parm.ni1_io.hl_id = pc->prot.ni1.invoke_id;
+               ic.parm.ni1_io.ll_id = pc->prot.ni1.ll_id;
+               ic.parm.ni1_io.proc = pc->prot.ni1.proc;
+               ic.parm.ni1_io.timeout = 0;
+               ic.parm.ni1_io.datalen = nlen;
+               ic.parm.ni1_io.data = p;
+               free_invoke_id(pc->st, pc->prot.ni1.invoke_id);
+               pc->prot.ni1.invoke_id = 0; /* reset id */
+
+               cs->iif.statcallb(&ic);
+               ni1_release_l3_process(pc);
+       }
+       else
+               l3_debug(st, "dummy return result id=0x%x result len=%d", id, nlen);
 } /* l3ni1_dummy_return_result */
 
 /*******************************************************************/
 /* called when a facility message with a dummy callref is received */
 /* and a return error is delivered. id specifies the invoke id.    */
-/*******************************************************************/ 
-static void 
+/*******************************************************************/
+static void
 l3ni1_dummy_error_return(struct PStack *st, int id, ulong error)
 { isdn_ctrl ic;
-  struct IsdnCardState *cs;
-  struct l3_process *pc = NULL; 
-
-  if ((pc = l3ni1_search_dummy_proc(st, id)))
-   { L3DelTimer(&pc->timer); /* remove timer */
-
-     cs = pc->st->l1.hardware;
-     ic.driver = cs->myid;
-     ic.command = ISDN_STAT_PROT;
-     ic.arg = NI1_STAT_INVOKE_ERR;
-     ic.parm.ni1_io.hl_id = pc->prot.ni1.invoke_id;
-     ic.parm.ni1_io.ll_id = pc->prot.ni1.ll_id;
-     ic.parm.ni1_io.proc = pc->prot.ni1.proc;
-     ic.parm.ni1_io.timeout= error;
-     ic.parm.ni1_io.datalen = 0;
-     ic.parm.ni1_io.data = NULL;
-     free_invoke_id(pc->st, pc->prot.ni1.invoke_id);
-     pc->prot.ni1.invoke_id = 0; /* reset id */
-
-     cs->iif.statcallb(&ic);
-     ni1_release_l3_process(pc); 
-   }
-  else
-   l3_debug(st, "dummy return error id=0x%x error=0x%lx",id,error);
+       struct IsdnCardState *cs;
+       struct l3_process *pc = NULL;
+
+       if ((pc = l3ni1_search_dummy_proc(st, id)))
+       { L3DelTimer(&pc->timer); /* remove timer */
+
+               cs = pc->st->l1.hardware;
+               ic.driver = cs->myid;
+               ic.command = ISDN_STAT_PROT;
+               ic.arg = NI1_STAT_INVOKE_ERR;
+               ic.parm.ni1_io.hl_id = pc->prot.ni1.invoke_id;
+               ic.parm.ni1_io.ll_id = pc->prot.ni1.ll_id;
+               ic.parm.ni1_io.proc = pc->prot.ni1.proc;
+               ic.parm.ni1_io.timeout = error;
+               ic.parm.ni1_io.datalen = 0;
+               ic.parm.ni1_io.data = NULL;
+               free_invoke_id(pc->st, pc->prot.ni1.invoke_id);
+               pc->prot.ni1.invoke_id = 0; /* reset id */
+
+               cs->iif.statcallb(&ic);
+               ni1_release_l3_process(pc);
+       }
+       else
+               l3_debug(st, "dummy return error id=0x%x error=0x%lx", id, error);
 } /* l3ni1_error_return */
 
 /*******************************************************************/
 /* called when a facility message with a dummy callref is received */
 /* and a invoke is delivered. id specifies the invoke id.          */
-/*******************************************************************/ 
-static void 
-l3ni1_dummy_invoke(struct PStack *st, int cr, int id, 
-                    int ident, u_char *p, u_char nlen)
+/*******************************************************************/
+static void
+l3ni1_dummy_invoke(struct PStack *st, int cr, int id,
+                  int ident, u_char *p, u_char nlen)
 { isdn_ctrl ic;
-  struct IsdnCardState *cs;
-
-  l3_debug(st, "dummy invoke %s id=0x%x ident=0x%x datalen=%d",
-               (cr == -1) ? "local" : "broadcast",id,ident,nlen);
-  if (cr >= -1) return; /* ignore local data */
-
-  cs = st->l1.hardware;
-  ic.driver = cs->myid;
-  ic.command = ISDN_STAT_PROT;
-  ic.arg = NI1_STAT_INVOKE_BRD;
-  ic.parm.ni1_io.hl_id = id;
-  ic.parm.ni1_io.ll_id = 0;
-  ic.parm.ni1_io.proc = ident;
-  ic.parm.ni1_io.timeout= 0;
-  ic.parm.ni1_io.datalen = nlen;
-  ic.parm.ni1_io.data = p;
-
-  cs->iif.statcallb(&ic);
+       struct IsdnCardState *cs;
+
+       l3_debug(st, "dummy invoke %s id=0x%x ident=0x%x datalen=%d",
+                (cr == -1) ? "local" : "broadcast", id, ident, nlen);
+       if (cr >= -1) return; /* ignore local data */
+
+       cs = st->l1.hardware;
+       ic.driver = cs->myid;
+       ic.command = ISDN_STAT_PROT;
+       ic.arg = NI1_STAT_INVOKE_BRD;
+       ic.parm.ni1_io.hl_id = id;
+       ic.parm.ni1_io.ll_id = 0;
+       ic.parm.ni1_io.proc = ident;
+       ic.parm.ni1_io.timeout = 0;
+       ic.parm.ni1_io.datalen = nlen;
+       ic.parm.ni1_io.data = p;
+
+       cs->iif.statcallb(&ic);
 } /* l3ni1_dummy_invoke */
 
 static void
 l3ni1_parse_facility(struct PStack *st, struct l3_process *pc,
-                      int cr, u_char * p)
+                    int cr, u_char *p)
 {
        int qd_len = 0;
        unsigned char nlen = 0, ilen, cp_tag;
        int ident, id;
        ulong err_ret;
 
-       if (pc) 
+       if (pc)
                st = pc->st; /* valid Stack */
        else
                if ((!st) || (cr >= 0)) return; /* neither pc nor st specified */
@@ -254,173 +254,173 @@ l3ni1_parse_facility(struct PStack *st, struct l3_process *pc,
                l3_debug(st, "class and form != 0xA0");
                return;
        }
-       
-        cp_tag = *p & 0x1F; /* remember tag value */
 
-        p++;
+       cp_tag = *p & 0x1F; /* remember tag value */
+
+       p++;
        qd_len--;
-       if (qd_len < 1) 
-          { l3_debug(st, "qd_len < 1");
-           return;
-         }
-       if (*p & 0x80) 
-          { /* length format indefinite or limited */
-           nlen = *p++ & 0x7F; /* number of len bytes or indefinite */
-            if ((qd_len-- < ((!nlen) ? 3 : (1 + nlen))) ||
-                (nlen > 1))   
-            { l3_debug(st, "length format error or not implemented");
-              return;
-             }
-            if (nlen == 1)
-            { nlen = *p++; /* complete length */
-               qd_len--;
-             } 
-            else
-            { qd_len -= 2; /* trailing null bytes */
-               if ((*(p+qd_len)) || (*(p+qd_len+1)))
-               { l3_debug(st,"length format indefinite error");
-                  return;
-                }
-               nlen = qd_len;
-             }
-         }
-        else
-         { nlen = *p++;
-           qd_len--;
-          } 
-       if (qd_len < nlen) 
-          { l3_debug(st, "qd_len < nlen");
-           return;
-         }
+       if (qd_len < 1)
+       { l3_debug(st, "qd_len < 1");
+               return;
+       }
+       if (*p & 0x80)
+       { /* length format indefinite or limited */
+               nlen = *p++ & 0x7F; /* number of len bytes or indefinite */
+               if ((qd_len-- < ((!nlen) ? 3 : (1 + nlen))) ||
+                   (nlen > 1))
+               { l3_debug(st, "length format error or not implemented");
+                       return;
+               }
+               if (nlen == 1)
+               { nlen = *p++; /* complete length */
+                       qd_len--;
+               }
+               else
+               { qd_len -= 2; /* trailing null bytes */
+                       if ((*(p + qd_len)) || (*(p + qd_len + 1)))
+                       { l3_debug(st, "length format indefinite error");
+                               return;
+                       }
+                       nlen = qd_len;
+               }
+       }
+       else
+       { nlen = *p++;
+               qd_len--;
+       }
+       if (qd_len < nlen)
+       { l3_debug(st, "qd_len < nlen");
+               return;
+       }
        qd_len -= nlen;
 
-       if (nlen < 2) 
-          { l3_debug(st, "nlen < 2");
-           return;
-         }
-        if (*p != 0x02) 
-          {  /* invoke identifier tag */
-            l3_debug(st, "invoke identifier tag !=0x02");
-            return;
-         }
+       if (nlen < 2)
+       { l3_debug(st, "nlen < 2");
+               return;
+       }
+       if (*p != 0x02)
+       {  /* invoke identifier tag */
+               l3_debug(st, "invoke identifier tag !=0x02");
+               return;
+       }
        p++;
        nlen--;
-       if (*p & 0x80) 
-          { /* length format */
-           l3_debug(st, "invoke id length format 2");
-           return;
-         }
+       if (*p & 0x80)
+       { /* length format */
+               l3_debug(st, "invoke id length format 2");
+               return;
+       }
        ilen = *p++;
        nlen--;
-       if (ilen > nlen || ilen == 0) 
-          { l3_debug(st, "ilen > nlen || ilen == 0");
-           return;
-         }
+       if (ilen > nlen || ilen == 0)
+       { l3_debug(st, "ilen > nlen || ilen == 0");
+               return;
+       }
        nlen -= ilen;
        id = 0;
-       while (ilen > 0) 
-          { id = (id << 8) | (*p++ & 0xFF);    /* invoke identifier */
-           ilen--;
-         }
+       while (ilen > 0)
+       { id = (id << 8) | (*p++ & 0xFF);       /* invoke identifier */
+               ilen--;
+       }
 
        switch (cp_tag) {       /* component tag */
-               case 1: /* invoke */
-                               if (nlen < 2) {
-                                       l3_debug(st, "nlen < 2 22");
-                                       return;
-                               }
-                               if (*p != 0x02) {       /* operation value */
-                                       l3_debug(st, "operation value !=0x02");
-                                       return;
-                               }
-                               p++;
-                               nlen--;
-                               ilen = *p++;
-                               nlen--;
-                               if (ilen > nlen || ilen == 0) {
-                                       l3_debug(st, "ilen > nlen || ilen == 0 22");
-                                       return;
-                               }
-                               nlen -= ilen;
-                               ident = 0;
-                               while (ilen > 0) {
-                                       ident = (ident << 8) | (*p++ & 0xFF);
-                                       ilen--;
-                               }
+       case 1: /* invoke */
+               if (nlen < 2) {
+                       l3_debug(st, "nlen < 2 22");
+                       return;
+               }
+               if (*p != 0x02) {       /* operation value */
+                       l3_debug(st, "operation value !=0x02");
+                       return;
+               }
+               p++;
+               nlen--;
+               ilen = *p++;
+               nlen--;
+               if (ilen > nlen || ilen == 0) {
+                       l3_debug(st, "ilen > nlen || ilen == 0 22");
+                       return;
+               }
+               nlen -= ilen;
+               ident = 0;
+               while (ilen > 0) {
+                       ident = (ident << 8) | (*p++ & 0xFF);
+                       ilen--;
+               }
 
-                               if (!pc) 
-                               {
-                                       l3ni1_dummy_invoke(st, cr, id, ident, p, nlen);
-                                       return;
-                               } 
-                               l3_debug(st, "invoke break");
-                               break;
-               case 2: /* return result */
-                        /* if no process available handle separately */ 
-                        if (!pc)
-                        { if (cr == -1) 
-                             l3ni1_dummy_return_result(st, id, p, nlen);
-                           return; 
-                         }   
-                        if ((pc->prot.ni1.invoke_id) && (pc->prot.ni1.invoke_id == id))
-                          { /* Diversion successful */
-                            free_invoke_id(st,pc->prot.ni1.invoke_id);
-                            pc->prot.ni1.remote_result = 0; /* success */     
-                            pc->prot.ni1.invoke_id = 0;
-                            pc->redir_result = pc->prot.ni1.remote_result; 
-                            st->l3.l3l4(st, CC_REDIR | INDICATION, pc);                                  } /* Diversion successful */
-                        else
-                          l3_debug(st,"return error unknown identifier");
-                       break;
-               case 3: /* return error */
-                            err_ret = 0;
-                           if (nlen < 2) 
-                              { l3_debug(st, "return error nlen < 2");
-                               return;
-                             }
-                            if (*p != 0x02) 
-                              { /* result tag */
-                               l3_debug(st, "invoke error tag !=0x02");
-                               return;
-                             }
-                           p++;
-                           nlen--;
-                           if (*p > 4) 
-                              { /* length format */
-                               l3_debug(st, "invoke return errlen > 4 ");
-                               return;
-                             }
-                           ilen = *p++;
-                           nlen--;
-                           if (ilen > nlen || ilen == 0) 
-                              { l3_debug(st, "error return ilen > nlen || ilen == 0");
-                               return;
-                              }
-                           nlen -= ilen;
-                           while (ilen > 0) 
-                             { err_ret = (err_ret << 8) | (*p++ & 0xFF);       /* error value */
-                              ilen--;
-                            }
-                        /* if no process available handle separately */ 
-                        if (!pc)
-                        { if (cr == -1)
-                             l3ni1_dummy_error_return(st, id, err_ret);
-                           return; 
-                         }   
-                        if ((pc->prot.ni1.invoke_id) && (pc->prot.ni1.invoke_id == id))
-                          { /* Deflection error */
-                            free_invoke_id(st,pc->prot.ni1.invoke_id);
-                            pc->prot.ni1.remote_result = err_ret; /* result */
-                            pc->prot.ni1.invoke_id = 0; 
-                            pc->redir_result = pc->prot.ni1.remote_result; 
-                            st->l3.l3l4(st, CC_REDIR | INDICATION, pc);  
-                          } /* Deflection error */
-                        else
-                          l3_debug(st,"return result unknown identifier");
-                       break;
-               default:
-                       l3_debug(st, "facility default break tag=0x%02x",cp_tag);
-                       break;
+               if (!pc)
+               {
+                       l3ni1_dummy_invoke(st, cr, id, ident, p, nlen);
+                       return;
+               }
+               l3_debug(st, "invoke break");
+               break;
+       case 2: /* return result */
+               /* if no process available handle separately */
+               if (!pc)
+               { if (cr == -1)
+                               l3ni1_dummy_return_result(st, id, p, nlen);
+                       return;
+               }
+               if ((pc->prot.ni1.invoke_id) && (pc->prot.ni1.invoke_id == id))
+               { /* Diversion successful */
+                       free_invoke_id(st, pc->prot.ni1.invoke_id);
+                       pc->prot.ni1.remote_result = 0; /* success */
+                       pc->prot.ni1.invoke_id = 0;
+                       pc->redir_result = pc->prot.ni1.remote_result;
+                       st->l3.l3l4(st, CC_REDIR | INDICATION, pc); } /* Diversion successful */
+               else
+                       l3_debug(st, "return error unknown identifier");
+               break;
+       case 3: /* return error */
+               err_ret = 0;
+               if (nlen < 2)
+               { l3_debug(st, "return error nlen < 2");
+                       return;
+               }
+               if (*p != 0x02)
+               { /* result tag */
+                       l3_debug(st, "invoke error tag !=0x02");
+                       return;
+               }
+               p++;
+               nlen--;
+               if (*p > 4)
+               { /* length format */
+                       l3_debug(st, "invoke return errlen > 4 ");
+                       return;
+               }
+               ilen = *p++;
+               nlen--;
+               if (ilen > nlen || ilen == 0)
+               { l3_debug(st, "error return ilen > nlen || ilen == 0");
+                       return;
+               }
+               nlen -= ilen;
+               while (ilen > 0)
+               { err_ret = (err_ret << 8) | (*p++ & 0xFF);     /* error value */
+                       ilen--;
+               }
+               /* if no process available handle separately */
+               if (!pc)
+               { if (cr == -1)
+                               l3ni1_dummy_error_return(st, id, err_ret);
+                       return;
+               }
+               if ((pc->prot.ni1.invoke_id) && (pc->prot.ni1.invoke_id == id))
+               { /* Deflection error */
+                       free_invoke_id(st, pc->prot.ni1.invoke_id);
+                       pc->prot.ni1.remote_result = err_ret; /* result */
+                       pc->prot.ni1.invoke_id = 0;
+                       pc->redir_result = pc->prot.ni1.remote_result;
+                       st->l3.l3l4(st, CC_REDIR | INDICATION, pc);
+               } /* Deflection error */
+               else
+                       l3_debug(st, "return result unknown identifier");
+               break;
+       default:
+               l3_debug(st, "facility default break tag=0x%02x", cp_tag);
+               break;
        }
 }
 
@@ -518,21 +518,21 @@ l3ni1_msg_without_setup(struct l3_process *pc, u_char pr, void *arg)
        struct sk_buff *skb;
 
        switch (pc->para.cause) {
-               case 81:        /* invalid callreference */
-               case 88:        /* incomp destination */
-               case 96:        /* mandory IE missing */
-               case 100:       /* invalid IE contents */
-               case 101:       /* incompatible Callstate */
-                       MsgHead(p, pc->callref, MT_RELEASE_COMPLETE);
-                       *p++ = IE_CAUSE;
-                       *p++ = 0x2;
-                       *p++ = 0x80;
-                       *p++ = pc->para.cause | 0x80;
-                       break;
-               default:
-                       printk(KERN_ERR "HiSax l3ni1_msg_without_setup wrong cause %d\n",
-                               pc->para.cause);
-                       return;
+       case 81:        /* invalid callreference */
+       case 88:        /* incomp destination */
+       case 96:        /* mandory IE missing */
+       case 100:       /* invalid IE contents */
+       case 101:       /* incompatible Callstate */
+               MsgHead(p, pc->callref, MT_RELEASE_COMPLETE);
+               *p++ = IE_CAUSE;
+               *p++ = 0x2;
+               *p++ = 0x80;
+               *p++ = pc->para.cause | 0x80;
+               break;
+       default:
+               printk(KERN_ERR "HiSax l3ni1_msg_without_setup wrong cause %d\n",
+                      pc->para.cause);
+               return;
        }
        l = p - tmp;
        if (!(skb = l3_alloc_skb(l)))
@@ -543,42 +543,42 @@ l3ni1_msg_without_setup(struct l3_process *pc, u_char pr, void *arg)
 }
 
 static int ie_ALERTING[] = {IE_BEARER, IE_CHANNEL_ID | IE_MANDATORY_1,
-               IE_FACILITY, IE_PROGRESS, IE_DISPLAY, IE_SIGNAL, IE_HLC,
-               IE_USER_USER, -1};
+                           IE_FACILITY, IE_PROGRESS, IE_DISPLAY, IE_SIGNAL, IE_HLC,
+                           IE_USER_USER, -1};
 static int ie_CALL_PROCEEDING[] = {IE_BEARER, IE_CHANNEL_ID | IE_MANDATORY_1,
-               IE_FACILITY, IE_PROGRESS, IE_DISPLAY, IE_HLC, -1};
-static int ie_CONNECT[] = {IE_BEARER, IE_CHANNEL_ID | IE_MANDATORY_1, 
-               IE_FACILITY, IE_PROGRESS, IE_DISPLAY, IE_DATE, IE_SIGNAL,
-               IE_CONNECT_PN, IE_CONNECT_SUB, IE_LLC, IE_HLC, IE_USER_USER, -1};
+                                  IE_FACILITY, IE_PROGRESS, IE_DISPLAY, IE_HLC, -1};
+static int ie_CONNECT[] = {IE_BEARER, IE_CHANNEL_ID | IE_MANDATORY_1,
+                          IE_FACILITY, IE_PROGRESS, IE_DISPLAY, IE_DATE, IE_SIGNAL,
+                          IE_CONNECT_PN, IE_CONNECT_SUB, IE_LLC, IE_HLC, IE_USER_USER, -1};
 static int ie_CONNECT_ACKNOWLEDGE[] = {IE_CHANNEL_ID, IE_DISPLAY, IE_SIGNAL, -1};
 static int ie_DISCONNECT[] = {IE_CAUSE | IE_MANDATORY, IE_FACILITY,
-               IE_PROGRESS, IE_DISPLAY, IE_SIGNAL, IE_USER_USER, -1};
+                             IE_PROGRESS, IE_DISPLAY, IE_SIGNAL, IE_USER_USER, -1};
 static int ie_INFORMATION[] = {IE_COMPLETE, IE_DISPLAY, IE_KEYPAD, IE_SIGNAL,
-               IE_CALLED_PN, -1};
+                              IE_CALLED_PN, -1};
 static int ie_NOTIFY[] = {IE_BEARER, IE_NOTIFY | IE_MANDATORY, IE_DISPLAY, -1};
 static int ie_PROGRESS[] = {IE_BEARER, IE_CAUSE, IE_FACILITY, IE_PROGRESS |
-               IE_MANDATORY, IE_DISPLAY, IE_HLC, IE_USER_USER, -1};
+                           IE_MANDATORY, IE_DISPLAY, IE_HLC, IE_USER_USER, -1};
 static int ie_RELEASE[] = {IE_CAUSE | IE_MANDATORY_1, IE_FACILITY, IE_DISPLAY,
-               IE_SIGNAL, IE_USER_USER, -1};
-/* a RELEASE_COMPLETE with errors don't require special actions 
-static int ie_RELEASE_COMPLETE[] = {IE_CAUSE | IE_MANDATORY_1, IE_DISPLAY, IE_SIGNAL, IE_USER_USER, -1};
+                          IE_SIGNAL, IE_USER_USER, -1};
+/* a RELEASE_COMPLETE with errors don't require special actions
+   static int ie_RELEASE_COMPLETE[] = {IE_CAUSE | IE_MANDATORY_1, IE_DISPLAY, IE_SIGNAL, IE_USER_USER, -1};
 */
-static int ie_RESUME_ACKNOWLEDGE[] = {IE_CHANNEL_ID| IE_MANDATORY, IE_FACILITY,
-               IE_DISPLAY, -1};
+static int ie_RESUME_ACKNOWLEDGE[] = {IE_CHANNEL_ID | IE_MANDATORY, IE_FACILITY,
+                                     IE_DISPLAY, -1};
 static int ie_RESUME_REJECT[] = {IE_CAUSE | IE_MANDATORY, IE_DISPLAY, -1};
 static int ie_SETUP[] = {IE_COMPLETE, IE_BEARER  | IE_MANDATORY,
-               IE_CHANNEL_ID| IE_MANDATORY, IE_FACILITY, IE_PROGRESS,
-               IE_NET_FAC, IE_DISPLAY, IE_KEYPAD, IE_SIGNAL, IE_CALLING_PN,
-               IE_CALLING_SUB, IE_CALLED_PN, IE_CALLED_SUB, IE_REDIR_NR,
-               IE_LLC, IE_HLC, IE_USER_USER, -1};
+                        IE_CHANNEL_ID | IE_MANDATORY, IE_FACILITY, IE_PROGRESS,
+                        IE_NET_FAC, IE_DISPLAY, IE_KEYPAD, IE_SIGNAL, IE_CALLING_PN,
+                        IE_CALLING_SUB, IE_CALLED_PN, IE_CALLED_SUB, IE_REDIR_NR,
+                        IE_LLC, IE_HLC, IE_USER_USER, -1};
 static int ie_SETUP_ACKNOWLEDGE[] = {IE_CHANNEL_ID | IE_MANDATORY, IE_FACILITY,
-               IE_PROGRESS, IE_DISPLAY, IE_SIGNAL, -1};
+                                    IE_PROGRESS, IE_DISPLAY, IE_SIGNAL, -1};
 static int ie_STATUS[] = {IE_CAUSE | IE_MANDATORY, IE_CALL_STATE |
-               IE_MANDATORY, IE_DISPLAY, -1};
+                         IE_MANDATORY, IE_DISPLAY, -1};
 static int ie_STATUS_ENQUIRY[] = {IE_DISPLAY, -1};
 static int ie_SUSPEND_ACKNOWLEDGE[] = {IE_DISPLAY, IE_FACILITY, -1};
 static int ie_SUSPEND_REJECT[] = {IE_CAUSE | IE_MANDATORY, IE_DISPLAY, -1};
-/* not used 
+/* not used
  * static int ie_CONGESTION_CONTROL[] = {IE_CONGESTION | IE_MANDATORY,
  *             IE_CAUSE | IE_MANDATORY, IE_DISPLAY, -1};
  * static int ie_USER_INFORMATION[] = {IE_MORE_DATA, IE_USER_USER | IE_MANDATORY, -1};
@@ -586,8 +586,8 @@ static int ie_SUSPEND_REJECT[] = {IE_CAUSE | IE_MANDATORY, IE_DISPLAY, -1};
  *             IE_MANDATORY, -1};
  */
 static int ie_FACILITY[] = {IE_FACILITY | IE_MANDATORY, IE_DISPLAY, -1};
-static int comp_required[] = {1,2,3,5,6,7,9,10,11,14,15,-1};
-static int l3_valid_states[] = {0,1,2,3,4,6,7,8,9,10,11,12,15,17,19,25,-1};
+static int comp_required[] = {1, 2, 3, 5, 6, 7, 9, 10, 11, 14, 15, -1};
+static int l3_valid_states[] = {0, 1, 2, 3, 4, 6, 7, 8, 9, 10, 11, 12, 15, 17, 19, 25, -1};
 
 struct ie_len {
        int ie;
@@ -628,7 +628,7 @@ struct ie_len max_ie_len[] = {
        {IE_LLC, 18},
        {IE_HLC, 5},
        {IE_USER_USER, 131},
-       {-1,0},
+       {-1, 0},
 };
 
 static int
@@ -636,10 +636,10 @@ getmax_ie_len(u_char ie) {
        int i = 0;
        while (max_ie_len[i].ie != -1) {
                if (max_ie_len[i].ie == ie)
-                       return(max_ie_len[i].len);
+                       return (max_ie_len[i].len);
                i++;
        }
-       return(255);
+       return (255);
 }
 
 static int
@@ -649,14 +649,14 @@ ie_in_set(struct l3_process *pc, u_char ie, int *checklist) {
        while (*checklist != -1) {
                if ((*checklist & 0xff) == ie) {
                        if (ie & 0x80)
-                               return(-ret);
+                               return (-ret);
                        else
-                               return(ret);
+                               return (ret);
                }
                ret++;
                checklist++;
        }
-       return(0);
+       return (0);
 }
 
 static int
@@ -670,7 +670,7 @@ check_infoelements(struct l3_process *pc, struct sk_buff *skb, int *checklist)
        u_char codeset = 0;
        u_char old_codeset = 0;
        u_char codelock = 1;
-       
+
        p = skb->data;
        /* skip cr */
        p++;
@@ -688,7 +688,7 @@ check_infoelements(struct l3_process *pc, struct sk_buff *skb, int *checklist)
                                codelock = 1;
                        if (pc->debug & L3_DEB_CHECK)
                                l3_debug(pc->st, "check IE shift%scodeset %d->%d",
-                                       codelock ? " locking ": " ", old_codeset, codeset);
+                                        codelock ? " locking " : " ", old_codeset, codeset);
                        p++;
                        continue;
                }
@@ -720,7 +720,7 @@ check_infoelements(struct l3_process *pc, struct sk_buff *skb, int *checklist)
                if (!codelock) {
                        if (pc->debug & L3_DEB_CHECK)
                                l3_debug(pc->st, "check IE shift back codeset %d->%d",
-                                       codeset, old_codeset);
+                                        codeset, old_codeset);
                        codeset = old_codeset;
                        codelock = 1;
                }
@@ -728,17 +728,17 @@ check_infoelements(struct l3_process *pc, struct sk_buff *skb, int *checklist)
        if (err_compr | err_ureg | err_len | err_seq) {
                if (pc->debug & L3_DEB_CHECK)
                        l3_debug(pc->st, "check IE MT(%x) %d/%d/%d/%d",
-                               mt, err_compr, err_ureg, err_len, err_seq);
+                                mt, err_compr, err_ureg, err_len, err_seq);
                if (err_compr)
-                       return(ERR_IE_COMPREHENSION);
+                       return (ERR_IE_COMPREHENSION);
                if (err_ureg)
-                       return(ERR_IE_UNRECOGNIZED);
+                       return (ERR_IE_UNRECOGNIZED);
                if (err_len)
-                       return(ERR_IE_LENGTH);
+                       return (ERR_IE_LENGTH);
                if (err_seq)
-                       return(ERR_IE_SEQUENCE);
-       } 
-       return(0);
+                       return (ERR_IE_SEQUENCE);
+       }
+       return (0);
 }
 
 /* verify if a message type exists and contain no IE error */
@@ -746,42 +746,42 @@ static int
 l3ni1_check_messagetype_validity(struct l3_process *pc, int mt, void *arg)
 {
        switch (mt) {
-               case MT_ALERTING:
-               case MT_CALL_PROCEEDING:
-               case MT_CONNECT:
-               case MT_CONNECT_ACKNOWLEDGE:
-               case MT_DISCONNECT:
-               case MT_INFORMATION:
-               case MT_FACILITY:
-               case MT_NOTIFY:
-               case MT_PROGRESS:
-               case MT_RELEASE:
-               case MT_RELEASE_COMPLETE:
-               case MT_SETUP:
-               case MT_SETUP_ACKNOWLEDGE:
-               case MT_RESUME_ACKNOWLEDGE:
-               case MT_RESUME_REJECT:
-               case MT_SUSPEND_ACKNOWLEDGE:
-               case MT_SUSPEND_REJECT:
-               case MT_USER_INFORMATION:
-               case MT_RESTART:
-               case MT_RESTART_ACKNOWLEDGE:
-               case MT_CONGESTION_CONTROL:
-               case MT_STATUS:
-               case MT_STATUS_ENQUIRY:
-                       if (pc->debug & L3_DEB_CHECK)
-                               l3_debug(pc->st, "l3ni1_check_messagetype_validity mt(%x) OK", mt);
-                       break;
-               case MT_RESUME: /* RESUME only in user->net */
-               case MT_SUSPEND: /* SUSPEND only in user->net */
-               default:
-                       if (pc->debug & (L3_DEB_CHECK | L3_DEB_WARN))
-                               l3_debug(pc->st, "l3ni1_check_messagetype_validity mt(%x) fail", mt);
-                       pc->para.cause = 97;
-                       l3ni1_status_send(pc, 0, NULL);
-                       return(1);
+       case MT_ALERTING:
+       case MT_CALL_PROCEEDING:
+       case MT_CONNECT:
+       case MT_CONNECT_ACKNOWLEDGE:
+       case MT_DISCONNECT:
+       case MT_INFORMATION:
+       case MT_FACILITY:
+       case MT_NOTIFY:
+       case MT_PROGRESS:
+       case MT_RELEASE:
+       case MT_RELEASE_COMPLETE:
+       case MT_SETUP:
+       case MT_SETUP_ACKNOWLEDGE:
+       case MT_RESUME_ACKNOWLEDGE:
+       case MT_RESUME_REJECT:
+       case MT_SUSPEND_ACKNOWLEDGE:
+       case MT_SUSPEND_REJECT:
+       case MT_USER_INFORMATION:
+       case MT_RESTART:
+       case MT_RESTART_ACKNOWLEDGE:
+       case MT_CONGESTION_CONTROL:
+       case MT_STATUS:
+       case MT_STATUS_ENQUIRY:
+               if (pc->debug & L3_DEB_CHECK)
+                       l3_debug(pc->st, "l3ni1_check_messagetype_validity mt(%x) OK", mt);
+               break;
+       case MT_RESUME: /* RESUME only in user->net */
+       case MT_SUSPEND: /* SUSPEND only in user->net */
+       default:
+               if (pc->debug & (L3_DEB_CHECK | L3_DEB_WARN))
+                       l3_debug(pc->st, "l3ni1_check_messagetype_validity mt(%x) fail", mt);
+               pc->para.cause = 97;
+               l3ni1_status_send(pc, 0, NULL);
+               return (1);
        }
-       return(0);
+       return (0);
 }
 
 static void
@@ -789,24 +789,24 @@ l3ni1_std_ie_err(struct l3_process *pc, int ret) {
 
        if (pc->debug & L3_DEB_CHECK)
                l3_debug(pc->st, "check_infoelements ret %d", ret);
-       switch(ret) {
-               case 0: 
-                       break;
-               case ERR_IE_COMPREHENSION:
-                       pc->para.cause = 96;
-                       l3ni1_status_send(pc, 0, NULL);
-                       break;
-               case ERR_IE_UNRECOGNIZED:
-                       pc->para.cause = 99;
-                       l3ni1_status_send(pc, 0, NULL);
-                       break;
-               case ERR_IE_LENGTH:
-                       pc->para.cause = 100;
-                       l3ni1_status_send(pc, 0, NULL);
-                       break;
-               case ERR_IE_SEQUENCE:
-               default:
-                       break;
+       switch (ret) {
+       case 0:
+               break;
+       case ERR_IE_COMPREHENSION:
+               pc->para.cause = 96;
+               l3ni1_status_send(pc, 0, NULL);
+               break;
+       case ERR_IE_UNRECOGNIZED:
+               pc->para.cause = 99;
+               l3ni1_status_send(pc, 0, NULL);
+               break;
+       case ERR_IE_LENGTH:
+               pc->para.cause = 100;
+               l3ni1_status_send(pc, 0, NULL);
+               break;
+       case ERR_IE_SEQUENCE:
+       default:
+               break;
        }
 }
 
@@ -828,14 +828,14 @@ l3ni1_get_channel_id(struct l3_process *pc, struct sk_buff *skb) {
                                l3_debug(pc->st, "wrong chid %x", *p);
                        return (-3);
                }
-               return(*p & 0x3);
+               return (*p & 0x3);
        } else
-               return(-1);
+               return (-1);
 }
 
 static int
 l3ni1_get_cause(struct l3_process *pc, struct sk_buff *skb) {
-       u_char l, i=0;
+       u_char l, i = 0;
        u_char *p;
 
        p = skb->data;
@@ -844,13 +844,13 @@ l3ni1_get_cause(struct l3_process *pc, struct sk_buff *skb) {
        if ((p = findie(p, skb->len, IE_CAUSE, 0))) {
                p++;
                l = *p++;
-               if (l>30)
-                       return(1);
+               if (l > 30)
+                       return (1);
                if (l) {
                        pc->para.loc = *p++;
                        l--;
                } else {
-                       return(2);
+                       return (2);
                }
                if (l && !(pc->para.loc & 0x80)) {
                        l--;
@@ -860,36 +860,36 @@ l3ni1_get_cause(struct l3_process *pc, struct sk_buff *skb) {
                        pc->para.cause = *p++;
                        l--;
                        if (!(pc->para.cause & 0x80))
-                               return(3);
+                               return (3);
                } else
-                       return(4);
-               while (l && (i<6)) {
+                       return (4);
+               while (l && (i < 6)) {
                        pc->para.diag[i++] = *p++;
                        l--;
                }
        } else
-               return(-1);
-       return(0);
+               return (-1);
+       return (0);
 }
 
 static void
 l3ni1_msg_with_uus(struct l3_process *pc, u_char cmd)
 {
        struct sk_buff *skb;
-       u_char tmp[16+40];
+       u_char tmp[16 + 40];
        u_char *p = tmp;
        int l;
 
        MsgHead(p, pc->callref, cmd);
 
-        if (pc->prot.ni1.uus1_data[0])
-        { *p++ = IE_USER_USER; /* UUS info element */
-           *p++ = strlen(pc->prot.ni1.uus1_data) + 1;
-           *p++ = 0x04; /* IA5 chars */
-           strcpy(p,pc->prot.ni1.uus1_data);
-           p += strlen(pc->prot.ni1.uus1_data);
-           pc->prot.ni1.uus1_data[0] = '\0';   
-         } 
+       if (pc->prot.ni1.uus1_data[0])
+       { *p++ = IE_USER_USER; /* UUS info element */
+               *p++ = strlen(pc->prot.ni1.uus1_data) + 1;
+               *p++ = 0x04; /* IA5 chars */
+               strcpy(p, pc->prot.ni1.uus1_data);
+               p += strlen(pc->prot.ni1.uus1_data);
+               pc->prot.ni1.uus1_data[0] = '\0';
+       }
 
        l = p - tmp;
        if (!(skb = l3_alloc_skb(l)))
@@ -903,7 +903,7 @@ l3ni1_release_req(struct l3_process *pc, u_char pr, void *arg)
 {
        StopAllL3Timer(pc);
        newl3state(pc, 19);
-       if (!pc->prot.ni1.uus1_data[0]) 
+       if (!pc->prot.ni1.uus1_data[0])
                l3ni1_message(pc, MT_RELEASE);
        else
                l3ni1_msg_with_uus(pc, MT_RELEASE);
@@ -916,9 +916,9 @@ l3ni1_release_cmpl(struct l3_process *pc, u_char pr, void *arg)
        struct sk_buff *skb = arg;
        int ret;
 
-       if ((ret = l3ni1_get_cause(pc, skb))>0) {
+       if ((ret = l3ni1_get_cause(pc, skb)) > 0) {
                if (pc->debug & L3_DEB_WARN)
-                       l3_debug(pc->st, "RELCMPL get_cause ret(%d)",ret);
+                       l3_debug(pc->st, "RELCMPL get_cause ret(%d)", ret);
        } else if (ret < 0)
                pc->para.cause = NO_CAUSE;
        StopAllL3Timer(pc);
@@ -930,7 +930,7 @@ l3ni1_release_cmpl(struct l3_process *pc, u_char pr, void *arg)
 #if EXT_BEARER_CAPS
 
 static u_char *
-EncodeASyncParams(u_char * p, u_char si2)
+EncodeASyncParams(u_char *p, u_char si2)
 {                              // 7c 06 88  90 21 42 00 bb
 
        p[0] = 0;
@@ -958,38 +958,38 @@ EncodeASyncParams(u_char * p, u_char si2)
                p[2] += 3;
 
        switch (si2 & 0x07) {
-               case 0:
-                       p[0] = 66;      // 1200 bit/s
+       case 0:
+               p[0] = 66;      // 1200 bit/s
 
-                       break;
-               case 1:
-                       p[0] = 88;      // 1200/75 bit/s
+               break;
+       case 1:
+               p[0] = 88;      // 1200/75 bit/s
 
-                       break;
-               case 2:
-                       p[0] = 87;      // 75/1200 bit/s
+               break;
+       case 2:
+               p[0] = 87;      // 75/1200 bit/s
 
-                       break;
-               case 3:
-                       p[0] = 67;      // 2400 bit/s
+               break;
+       case 3:
+               p[0] = 67;      // 2400 bit/s
 
-                       break;
-               case 4:
-                       p[0] = 69;      // 4800 bit/s
+               break;
+       case 4:
+               p[0] = 69;      // 4800 bit/s
 
-                       break;
-               case 5:
-                       p[0] = 72;      // 9600 bit/s
+               break;
+       case 5:
+               p[0] = 72;      // 9600 bit/s
 
-                       break;
-               case 6:
-                       p[0] = 73;      // 14400 bit/s
+               break;
+       case 6:
+               p[0] = 73;      // 14400 bit/s
 
-                       break;
-               case 7:
-                       p[0] = 75;      // 19200 bit/s
+               break;
+       case 7:
+               p[0] = 75;      // 19200 bit/s
 
-                       break;
+               break;
        }
        return p + 3;
 }
@@ -999,84 +999,84 @@ EncodeSyncParams(u_char si2, u_char ai)
 {
 
        switch (si2) {
-               case 0:
-                       return ai + 2;  // 1200 bit/s
+       case 0:
+               return ai + 2;  // 1200 bit/s
 
-               case 1:
-                       return ai + 24;         // 1200/75 bit/s
+       case 1:
+               return ai + 24;         // 1200/75 bit/s
 
-               case 2:
-                       return ai + 23;         // 75/1200 bit/s
+       case 2:
+               return ai + 23;         // 75/1200 bit/s
 
-               case 3:
-                       return ai + 3;  // 2400 bit/s
+       case 3:
+               return ai + 3;  // 2400 bit/s
 
-               case 4:
-                       return ai + 5;  // 4800 bit/s
+       case 4:
+               return ai + 5;  // 4800 bit/s
 
-               case 5:
-                       return ai + 8;  // 9600 bit/s
+       case 5:
+               return ai + 8;  // 9600 bit/s
 
-               case 6:
-                       return ai + 9;  // 14400 bit/s
+       case 6:
+               return ai + 9;  // 14400 bit/s
 
-               case 7:
-                       return ai + 11;         // 19200 bit/s
+       case 7:
+               return ai + 11;         // 19200 bit/s
 
-               case 8:
-                       return ai + 14;         // 48000 bit/s
+       case 8:
+               return ai + 14;         // 48000 bit/s
 
-               case 9:
-                       return ai + 15;         // 56000 bit/s
+       case 9:
+               return ai + 15;         // 56000 bit/s
 
-               case 15:
-                       return ai + 40;         // negotiate bit/s
+       case 15:
+               return ai + 40;         // negotiate bit/s
 
-               default:
-                       break;
+       default:
+               break;
        }
        return ai;
 }
 
 
 static u_char
-DecodeASyncParams(u_char si2, u_char * p)
+DecodeASyncParams(u_char si2, u_char *p)
 {
        u_char info;
 
        switch (p[5]) {
-               case 66:        // 1200 bit/s
+       case 66:        // 1200 bit/s
 
-                       break;  // si2 don't change
+               break;  // si2 don't change
 
-               case 88:        // 1200/75 bit/s
+       case 88:        // 1200/75 bit/s
 
-                       si2 += 1;
-                       break;
-               case 87:        // 75/1200 bit/s
+               si2 += 1;
+               break;
+       case 87:        // 75/1200 bit/s
 
-                       si2 += 2;
-                       break;
-               case 67:        // 2400 bit/s
+               si2 += 2;
+               break;
+       case 67:        // 2400 bit/s
 
-                       si2 += 3;
-                       break;
-               case 69:        // 4800 bit/s
+               si2 += 3;
+               break;
+       case 69:        // 4800 bit/s
 
-                       si2 += 4;
-                       break;
-               case 72:        // 9600 bit/s
+               si2 += 4;
+               break;
+       case 72:        // 9600 bit/s
 
-                       si2 += 5;
-                       break;
-               case 73:        // 14400 bit/s
+               si2 += 5;
+               break;
+       case 73:        // 14400 bit/s
 
-                       si2 += 6;
-                       break;
-               case 75:        // 19200 bit/s
+               si2 += 6;
+               break;
+       case 75:        // 19200 bit/s
 
-                       si2 += 7;
-                       break;
+               si2 += 7;
+               break;
        }
 
        info = p[7] & 0x7f;
@@ -1101,39 +1101,39 @@ DecodeSyncParams(u_char si2, u_char info)
 {
        info &= 0x7f;
        switch (info) {
-               case 40:        // bit/s negotiation failed  ai := 165 not 175!
+       case 40:        // bit/s negotiation failed  ai := 165 not 175!
 
-                       return si2 + 15;
-               case 15:        // 56000 bit/s failed, ai := 0 not 169 !
+               return si2 + 15;
+       case 15:        // 56000 bit/s failed, ai := 0 not 169 !
 
-                       return si2 + 9;
-               case 14:        // 48000 bit/s
+               return si2 + 9;
+       case 14:        // 48000 bit/s
 
-                       return si2 + 8;
-               case 11:        // 19200 bit/s
+               return si2 + 8;
+       case 11:        // 19200 bit/s
 
-                       return si2 + 7;
-               case 9: // 14400 bit/s
+               return si2 + 7;
+       case 9: // 14400 bit/s
 
-                       return si2 + 6;
-               case 8: // 9600  bit/s
+               return si2 + 6;
+       case 8: // 9600  bit/s
 
-                       return si2 + 5;
-               case 5: // 4800  bit/s
+               return si2 + 5;
+       case 5: // 4800  bit/s
 
-                       return si2 + 4;
-               case 3: // 2400  bit/s
+               return si2 + 4;
+       case 3: // 2400  bit/s
 
-                       return si2 + 3;
-               case 23:        // 75/1200 bit/s
+               return si2 + 3;
+       case 23:        // 75/1200 bit/s
 
-                       return si2 + 2;
-               case 24:        // 1200/75 bit/s
+               return si2 + 2;
+       case 24:        // 1200/75 bit/s
 
-                       return si2 + 1;
-               default:        // 1200 bit/s
+               return si2 + 1;
+       default:        // 1200 bit/s
 
-                       return si2;
+               return si2;
        }
 }
 
@@ -1144,20 +1144,20 @@ DecodeSI2(struct sk_buff *skb)
 
        if ((p = findie(skb->data, skb->len, 0x7c, 0))) {
                switch (p[4] & 0x0f) {
-                       case 0x01:
-                               if (p[1] == 0x04)       // sync. Bitratenadaption
+               case 0x01:
+                       if (p[1] == 0x04)       // sync. Bitratenadaption
 
-                                       return DecodeSyncParams(160, p[5]);     // V.110/X.30
+                               return DecodeSyncParams(160, p[5]);     // V.110/X.30
 
-                               else if (p[1] == 0x06)  // async. Bitratenadaption
+                       else if (p[1] == 0x06)  // async. Bitratenadaption
 
-                                       return DecodeASyncParams(192, p);       // V.110/X.30
+                               return DecodeASyncParams(192, p);       // V.110/X.30
 
-                               break;
-                       case 0x08:      // if (p[5] == 0x02) // sync. Bitratenadaption
-                               if (p[1] > 3) 
-                                       return DecodeSyncParams(176, p[5]);     // V.120
-                               break;
+                       break;
+               case 0x08:      // if (p[5] == 0x02) // sync. Bitratenadaption
+                       if (p[1] > 3)
+                               return DecodeSyncParams(176, p[5]);     // V.120
+                       break;
                }
        }
        return 0;
@@ -1168,7 +1168,7 @@ DecodeSI2(struct sk_buff *skb)
 
 static void
 l3ni1_setup_req(struct l3_process *pc, u_char pr,
-                void *arg)
+               void *arg)
 {
        struct sk_buff *skb;
        u_char tmp[128];
@@ -1191,7 +1191,7 @@ l3ni1_setup_req(struct l3_process *pc, u_char pr,
        case 1:                   /* Telephony                                */
                *p++ = IE_BEARER;
                *p++ = 0x3;       /* Length                                   */
-               *p++ = 0x90;      /* 3.1khz Audio                             */
+               *p++ = 0x90;      /* 3.1khz Audio                             */
                *p++ = 0x90;      /* Circuit-Mode 64kbps                      */
                *p++ = 0xa2;      /* u-Law Audio                              */
                break;
@@ -1214,7 +1214,7 @@ l3ni1_setup_req(struct l3_process *pc, u_char pr,
                } else
                        sp++;
        }
-       
+
        *p++ = IE_KEYPAD;
        *p++ = strlen(teln);
        while (*teln)
@@ -1222,7 +1222,7 @@ l3ni1_setup_req(struct l3_process *pc, u_char pr,
 
        if (sub)
                *sub++ = '.';
-       
+
 #if EXT_BEARER_CAPS
        if ((pc->para.setup.si2 >= 160) && (pc->para.setup.si2 <= 175)) {       // sync. Bitratenadaption, V.110/X.30
 
@@ -1250,7 +1250,7 @@ l3ni1_setup_req(struct l3_process *pc, u_char pr,
                *p++ = 0x21;
                p = EncodeASyncParams(p, pc->para.setup.si2 - 192);
        } else {
-         switch (pc->para.setup.si1) {
+               switch (pc->para.setup.si1) {
                case 1:                 /* Telephony                                */
                        *p++ = IE_LLC;
                        *p++ = 0x3;     /* Length                                   */
@@ -1266,14 +1266,14 @@ l3ni1_setup_req(struct l3_process *pc, u_char pr,
                        *p++ = 0x88;    /* Coding Std. CCITT, unrestr. dig. Inform. */
                        *p++ = 0x90;    /* Circuit-Mode 64kbps                      */
                        break;
-         }
+               }
        }
 #endif
        l = p - tmp;
        if (!(skb = l3_alloc_skb(l)))
-{
+       {
                return;
-}
+       }
        memcpy(skb_put(skb, l), tmp, l);
        L3DelTimer(&pc->timer);
        L3AddTimer(&pc->timer, T303, CC_T303);
@@ -1375,7 +1375,7 @@ l3ni1_disconnect(struct l3_process *pc, u_char pr, void *arg)
                        cause = 96;
                else if (ret > 0)
                        cause = 100;
-       } 
+       }
        if ((p = findie(skb->data, skb->len, IE_FACILITY, 0)))
                l3ni1_parse_facility(pc->st, pc, pc->callref, p);
        ret = check_infoelements(pc, skb, ie_DISCONNECT);
@@ -1387,10 +1387,10 @@ l3ni1_disconnect(struct l3_process *pc, u_char pr, void *arg)
        newl3state(pc, 12);
        if (cause)
                newl3state(pc, 19);
-               if (11 != ret)
+       if (11 != ret)
                pc->st->l3.l3l4(pc->st, CC_DISCONNECT | INDICATION, pc);
-               else if (!cause)
-                  l3ni1_release_req(pc, pr, NULL);
+       else if (!cause)
+               l3ni1_release_req(pc, pr, NULL);
        if (cause) {
                l3ni1_message_cause(pc, MT_RELEASE, cause);
                L3AddTimer(&pc->timer, T308, CC_T308_1);
@@ -1456,56 +1456,56 @@ l3ni1_setup(struct l3_process *pc, u_char pr, void *arg)
                else {
                        pc->para.setup.si2 = 0;
                        switch (p[2] & 0x7f) {
-                               case 0x00: /* Speech */
-                               case 0x10: /* 3.1 Khz audio */
-                                       pc->para.setup.si1 = 1;
-                                       break;
-                               case 0x08: /* Unrestricted digital information */
-                                       pc->para.setup.si1 = 7;
+                       case 0x00: /* Speech */
+                       case 0x10: /* 3.1 Khz audio */
+                               pc->para.setup.si1 = 1;
+                               break;
+                       case 0x08: /* Unrestricted digital information */
+                               pc->para.setup.si1 = 7;
 /* JIM, 05.11.97 I wanna set service indicator 2 */
 #if EXT_BEARER_CAPS
-                                       pc->para.setup.si2 = DecodeSI2(skb);
+                               pc->para.setup.si2 = DecodeSI2(skb);
 #endif
-                                       break;
-                               case 0x09: /* Restricted digital information */
-                                       pc->para.setup.si1 = 2;
-                                       break;
-                               case 0x11:
-                                       /* Unrestr. digital information  with 
-                                        * tones/announcements ( or 7 kHz audio
-                                        */
-                                       pc->para.setup.si1 = 3;
-                                       break;
-                               case 0x18: /* Video */
-                                       pc->para.setup.si1 = 4;
-                                       break;
-                               default:
-                                       err = 2;
-                                       break;
+                               break;
+                       case 0x09: /* Restricted digital information */
+                               pc->para.setup.si1 = 2;
+                               break;
+                       case 0x11:
+                               /* Unrestr. digital information  with
+                                * tones/announcements ( or 7 kHz audio
+                                */
+                               pc->para.setup.si1 = 3;
+                               break;
+                       case 0x18: /* Video */
+                               pc->para.setup.si1 = 4;
+                               break;
+                       default:
+                               err = 2;
+                               break;
                        }
                        switch (p[3] & 0x7f) {
-                               case 0x40: /* packed mode */
-                                       pc->para.setup.si1 = 8;
-                                       break;
-                               case 0x10: /* 64 kbit */
-                               case 0x11: /* 2*64 kbit */
-                               case 0x13: /* 384 kbit */
-                               case 0x15: /* 1536 kbit */
-                               case 0x17: /* 1920 kbit */
-                                       pc->para.moderate = p[3] & 0x7f;
-                                       break;
-                               default:
-                                       err = 3;
-                                       break;
+                       case 0x40: /* packed mode */
+                               pc->para.setup.si1 = 8;
+                               break;
+                       case 0x10: /* 64 kbit */
+                       case 0x11: /* 2*64 kbit */
+                       case 0x13: /* 384 kbit */
+                       case 0x15: /* 1536 kbit */
+                       case 0x17: /* 1920 kbit */
+                               pc->para.moderate = p[3] & 0x7f;
+                               break;
+                       default:
+                               err = 3;
+                               break;
                        }
                }
                if (pc->debug & L3_DEB_SI)
                        l3_debug(pc->st, "SI=%d, AI=%d",
-                               pc->para.setup.si1, pc->para.setup.si2);
+                                pc->para.setup.si1, pc->para.setup.si2);
                if (err) {
                        if (pc->debug & L3_DEB_WARN)
                                l3_debug(pc->st, "setup with wrong bearer(l=%d:%x,%x)",
-                                       p[1], p[2], p[3]);
+                                        p[1], p[2], p[3]);
                        pc->para.cause = 100;
                        l3ni1_msg_without_setup(pc, pr, NULL);
                        return;
@@ -1526,17 +1526,17 @@ l3ni1_setup(struct l3_process *pc, u_char pr, void *arg)
                        if ((3 == id) && (0x10 == pc->para.moderate)) {
                                if (pc->debug & L3_DEB_WARN)
                                        l3_debug(pc->st, "setup with wrong chid %x",
-                                               id);
+                                                id);
                                pc->para.cause = 100;
                                l3ni1_msg_without_setup(pc, pr, NULL);
                                return;
                        }
                        bcfound++;
-               } else 
-                   { if (pc->debug & L3_DEB_WARN)
-                        l3_debug(pc->st, "setup without bchannel, call waiting");
-                     bcfound++;
-                   } 
+               } else
+               { if (pc->debug & L3_DEB_WARN)
+                               l3_debug(pc->st, "setup without bchannel, call waiting");
+                       bcfound++;
+               }
        } else {
                if (pc->debug & L3_DEB_WARN)
                        l3_debug(pc->st, "setup with wrong chid ret %d", id);
@@ -1611,7 +1611,7 @@ static void
 l3ni1_disconnect_req(struct l3_process *pc, u_char pr, void *arg)
 {
        struct sk_buff *skb;
-       u_char tmp[16+40];
+       u_char tmp[16 + 40];
        u_char *p = tmp;
        int l;
        u_char cause = 16;
@@ -1628,14 +1628,14 @@ l3ni1_disconnect_req(struct l3_process *pc, u_char pr, void *arg)
        *p++ = 0x80;
        *p++ = cause | 0x80;
 
-        if (pc->prot.ni1.uus1_data[0])
-        { *p++ = IE_USER_USER; /* UUS info element */
-           *p++ = strlen(pc->prot.ni1.uus1_data) + 1;
-           *p++ = 0x04; /* IA5 chars */
-           strcpy(p,pc->prot.ni1.uus1_data);
-           p += strlen(pc->prot.ni1.uus1_data);
-           pc->prot.ni1.uus1_data[0] = '\0';   
-         } 
+       if (pc->prot.ni1.uus1_data[0])
+       { *p++ = IE_USER_USER; /* UUS info element */
+               *p++ = strlen(pc->prot.ni1.uus1_data) + 1;
+               *p++ = 0x04; /* IA5 chars */
+               strcpy(p, pc->prot.ni1.uus1_data);
+               p += strlen(pc->prot.ni1.uus1_data);
+               pc->prot.ni1.uus1_data[0] = '\0';
+       }
 
        l = p - tmp;
        if (!(skb = l3_alloc_skb(l)))
@@ -1648,18 +1648,18 @@ l3ni1_disconnect_req(struct l3_process *pc, u_char pr, void *arg)
 
 static void
 l3ni1_setup_rsp(struct l3_process *pc, u_char pr,
-                void *arg)
-{
-        if (!pc->para.bchannel) 
-        { if (pc->debug & L3_DEB_WARN)
-              l3_debug(pc->st, "D-chan connect for waiting call");
-           l3ni1_disconnect_req(pc, pr, arg);
-           return;
-         }
+               void *arg)
+{
+       if (!pc->para.bchannel)
+       { if (pc->debug & L3_DEB_WARN)
+                       l3_debug(pc->st, "D-chan connect for waiting call");
+               l3ni1_disconnect_req(pc, pr, arg);
+               return;
+       }
        newl3state(pc, 8);
        if (pc->debug & L3_DEB_WARN)
                l3_debug(pc->st, "D-chan connect for waiting call");
-       l3ni1_message_plus_chid(pc, MT_CONNECT); /* GE 05/09/00 */ 
+       l3ni1_message_plus_chid(pc, MT_CONNECT); /* GE 05/09/00 */
        L3DelTimer(&pc->timer);
        L3AddTimer(&pc->timer, T313, CC_T313);
 }
@@ -1716,26 +1716,26 @@ l3ni1_release(struct l3_process *pc, u_char pr, void *arg)
 {
        struct sk_buff *skb = arg;
        u_char *p;
-       int ret, cause=0;
+       int ret, cause = 0;
 
        StopAllL3Timer(pc);
-       if ((ret = l3ni1_get_cause(pc, skb))>0) {
+       if ((ret = l3ni1_get_cause(pc, skb)) > 0) {
                if (pc->debug & L3_DEB_WARN)
                        l3_debug(pc->st, "REL get_cause ret(%d)", ret);
-       } else if (ret<0)
+       } else if (ret < 0)
                pc->para.cause = NO_CAUSE;
        if ((p = findie(skb->data, skb->len, IE_FACILITY, 0))) {
                l3ni1_parse_facility(pc->st, pc, pc->callref, p);
        }
-       if ((ret<0) && (pc->state != 11))
+       if ((ret < 0) && (pc->state != 11))
                cause = 96;
-       else if (ret>0)
+       else if (ret > 0)
                cause = 100;
        ret = check_infoelements(pc, skb, ie_RELEASE);
        if (ERR_IE_COMPREHENSION == ret)
                cause = 96;
        else if ((ERR_IE_UNRECOGNIZED == ret) && (!cause))
-               cause = 99;  
+               cause = 99;
        if (cause)
                l3ni1_message_cause(pc, MT_RELEASE_COMPLETE, cause);
        else
@@ -1747,27 +1747,27 @@ l3ni1_release(struct l3_process *pc, u_char pr, void *arg)
 
 static void
 l3ni1_alert_req(struct l3_process *pc, u_char pr,
-                void *arg)
+               void *arg)
 {
        newl3state(pc, 7);
-       if (!pc->prot.ni1.uus1_data[0]) 
+       if (!pc->prot.ni1.uus1_data[0])
                l3ni1_message(pc, MT_ALERTING);
        else
-               l3ni1_msg_with_uus(pc, MT_ALERTING); 
+               l3ni1_msg_with_uus(pc, MT_ALERTING);
 }
 
 static void
 l3ni1_proceed_req(struct l3_process *pc, u_char pr,
-                  void *arg)
+                 void *arg)
 {
        newl3state(pc, 9);
        l3ni1_message(pc, MT_CALL_PROCEEDING);
-       pc->st->l3.l3l4(pc->st, CC_PROCEED_SEND | INDICATION, pc); 
+       pc->st->l3.l3l4(pc->st, CC_PROCEED_SEND | INDICATION, pc);
 }
 
 static void
 l3ni1_setup_ack_req(struct l3_process *pc, u_char pr,
-                  void *arg)
+                   void *arg)
 {
        newl3state(pc, 25);
        L3DelTimer(&pc->timer);
@@ -1781,22 +1781,22 @@ l3ni1_setup_ack_req(struct l3_process *pc, u_char pr,
 static void
 l3ni1_deliver_display(struct l3_process *pc, int pr, u_char *infp)
 {       u_char len;
-        isdn_ctrl ic; 
+       isdn_ctrl ic;
        struct IsdnCardState *cs;
-        char *p; 
+       char *p;
 
-        if (*infp++ != IE_DISPLAY) return;
-        if ((len = *infp++) > 80) return; /* total length <= 82 */
+       if (*infp++ != IE_DISPLAY) return;
+       if ((len = *infp++) > 80) return; /* total length <= 82 */
        if (!pc->chan) return;
 
-       p = ic.parm.display; 
-        while (len--)
-         *p++ = *infp++;
+       p = ic.parm.display;
+       while (len--)
+               *p++ = *infp++;
        *p = '\0';
        ic.command = ISDN_STAT_DISPLAY;
        cs = pc->st->l1.hardware;
        ic.driver = cs->myid;
-       ic.arg = pc->chan->chan; 
+       ic.arg = pc->chan->chan;
        cs->iif.statcallb(&ic);
 } /* l3ni1_deliver_display */
 
@@ -1814,37 +1814,37 @@ l3ni1_progress(struct l3_process *pc, u_char pr, void *arg)
                        pc->para.cause = 100;
                } else if (!(p[2] & 0x70)) {
                        switch (p[2]) {
-                               case 0x80:
+                       case 0x80:
+                       case 0x81:
+                       case 0x82:
+                       case 0x84:
+                       case 0x85:
+                       case 0x87:
+                       case 0x8a:
+                               switch (p[3]) {
                                case 0x81:
                                case 0x82:
+                               case 0x83:
                                case 0x84:
-                               case 0x85:
-                               case 0x87:
-                               case 0x8a:
-                                       switch (p[3]) {
-                                               case 0x81:
-                                               case 0x82:
-                                               case 0x83:
-                                               case 0x84:
-                                               case 0x88:
-                                                       break;
-                                               default:
-                                                       err = 2;
-                                                       pc->para.cause = 100;
-                                                       break;
-                                       }
+                               case 0x88:
                                        break;
                                default:
-                                       err = 3;
+                                       err = 2;
                                        pc->para.cause = 100;
                                        break;
+                               }
+                               break;
+                       default:
+                               err = 3;
+                               pc->para.cause = 100;
+                               break;
                        }
                }
        } else {
                pc->para.cause = 96;
                err = 4;
        }
-       if (err) {      
+       if (err) {
                if (pc->debug & L3_DEB_WARN)
                        l3_debug(pc->st, "progress error %d", err);
                l3ni1_status_send(pc, pr, NULL);
@@ -1871,21 +1871,21 @@ l3ni1_notify(struct l3_process *pc, u_char pr, void *arg)
                        pc->para.cause = 100;
                } else {
                        switch (p[2]) {
-                               case 0x80:
-                               case 0x81:
-                               case 0x82:
-                                       break;
-                               default:
-                                       pc->para.cause = 100;
-                                       err = 2;
-                                       break;
+                       case 0x80:
+                       case 0x81:
+                       case 0x82:
+                               break;
+                       default:
+                               pc->para.cause = 100;
+                               err = 2;
+                               break;
                        }
                }
        } else {
                pc->para.cause = 96;
                err = 3;
        }
-       if (err) {      
+       if (err) {
                if (pc->debug & L3_DEB_WARN)
                        l3_debug(pc->st, "notify error %d", err);
                l3ni1_status_send(pc, pr, NULL);
@@ -1908,7 +1908,7 @@ l3ni1_status_enq(struct l3_process *pc, u_char pr, void *arg)
        ret = check_infoelements(pc, skb, ie_STATUS_ENQUIRY);
        l3ni1_std_ie_err(pc, ret);
        pc->para.cause = 30; /* response to STATUS_ENQUIRY */
-        l3ni1_status_send(pc, pr, NULL);
+       l3ni1_status_send(pc, pr, NULL);
 }
 
 static void
@@ -1942,68 +1942,68 @@ static void l3ni1_redir_req(struct l3_process *pc, u_char pr, void *arg)
        struct sk_buff *skb;
        u_char tmp[128];
        u_char *p = tmp;
-        u_char *subp;
-        u_char len_phone = 0;
-        u_char len_sub = 0;
-       int l; 
-
-
-        strcpy(pc->prot.ni1.uus1_data,pc->chan->setup.eazmsn); /* copy uus element if available */
-        if (!pc->chan->setup.phone[0])
-          { pc->para.cause = -1;
-            l3ni1_disconnect_req(pc,pr,arg); /* disconnect immediately */
-            return;
-          } /* only uus */
-        if (pc->prot.ni1.invoke_id) 
-          free_invoke_id(pc->st,pc->prot.ni1.invoke_id);
-        if (!(pc->prot.ni1.invoke_id = new_invoke_id(pc->st))) 
-          return;
-
-        MsgHead(p, pc->callref, MT_FACILITY);
-
-        for (subp = pc->chan->setup.phone; (*subp) && (*subp != '.'); subp++) len_phone++; /* len of phone number */
-        if (*subp++ == '.') len_sub = strlen(subp) + 2; /* length including info subaddress element */ 
+       u_char *subp;
+       u_char len_phone = 0;
+       u_char len_sub = 0;
+       int l;
+
+
+       strcpy(pc->prot.ni1.uus1_data, pc->chan->setup.eazmsn); /* copy uus element if available */
+       if (!pc->chan->setup.phone[0])
+       { pc->para.cause = -1;
+               l3ni1_disconnect_req(pc, pr, arg); /* disconnect immediately */
+               return;
+       } /* only uus */
+
+       if (pc->prot.ni1.invoke_id)
+               free_invoke_id(pc->st, pc->prot.ni1.invoke_id);
+
+       if (!(pc->prot.ni1.invoke_id = new_invoke_id(pc->st)))
+               return;
+
+       MsgHead(p, pc->callref, MT_FACILITY);
+
+       for (subp = pc->chan->setup.phone; (*subp) && (*subp != '.'); subp++) len_phone++; /* len of phone number */
+       if (*subp++ == '.') len_sub = strlen(subp) + 2; /* length including info subaddress element */
 
        *p++ = 0x1c;   /* Facility info element */
-        *p++ = len_phone + len_sub + 2 + 2 + 8 + 3 + 3; /* length of element */
-        *p++ = 0x91;  /* remote operations protocol */
-        *p++ = 0xa1;  /* invoke component */
-         
-        *p++ = len_phone + len_sub + 2 + 2 + 8 + 3; /* length of data */
-        *p++ = 0x02;  /* invoke id tag, integer */
+       *p++ = len_phone + len_sub + 2 + 2 + 8 + 3 + 3; /* length of element */
+       *p++ = 0x91;  /* remote operations protocol */
+       *p++ = 0xa1;  /* invoke component */
+
+       *p++ = len_phone + len_sub + 2 + 2 + 8 + 3; /* length of data */
+       *p++ = 0x02;  /* invoke id tag, integer */
        *p++ = 0x01;  /* length */
-        *p++ = pc->prot.ni1.invoke_id;  /* invoke id */ 
-        *p++ = 0x02;  /* operation value tag, integer */
+       *p++ = pc->prot.ni1.invoke_id;  /* invoke id */
+       *p++ = 0x02;  /* operation value tag, integer */
        *p++ = 0x01;  /* length */
-        *p++ = 0x0D;  /* Call Deflect */
-         
-        *p++ = 0x30;  /* sequence phone number */
-        *p++ = len_phone + 2 + 2 + 3 + len_sub; /* length */
-         
-        *p++ = 0x30;  /* Deflected to UserNumber */
-        *p++ = len_phone+2+len_sub; /* length */
-        *p++ = 0x80; /* NumberDigits */
+       *p++ = 0x0D;  /* Call Deflect */
+
+       *p++ = 0x30;  /* sequence phone number */
+       *p++ = len_phone + 2 + 2 + 3 + len_sub; /* length */
+
+       *p++ = 0x30;  /* Deflected to UserNumber */
+       *p++ = len_phone + 2 + len_sub; /* length */
+       *p++ = 0x80; /* NumberDigits */
        *p++ = len_phone; /* length */
-        for (l = 0; l < len_phone; l++)
-        *p++ = pc->chan->setup.phone[l];
+       for (l = 0; l < len_phone; l++)
+               *p++ = pc->chan->setup.phone[l];
 
-        if (len_sub)
-         { *p++ = 0x04; /* called party subaddress */
-            *p++ = len_sub - 2;
-            while (*subp) *p++ = *subp++;
-          }
+       if (len_sub)
+       { *p++ = 0x04; /* called party subaddress */
+               *p++ = len_sub - 2;
+               while (*subp) *p++ = *subp++;
+       }
 
-        *p++ = 0x01; /* screening identifier */
-        *p++ = 0x01;
-        *p++ = pc->chan->setup.screen;
+       *p++ = 0x01; /* screening identifier */
+       *p++ = 0x01;
+       *p++ = pc->chan->setup.screen;
 
        l = p - tmp;
        if (!(skb = l3_alloc_skb(l))) return;
        memcpy(skb_put(skb, l), tmp, l);
 
-        l3_msg(pc->st, DL_DATA | REQUEST, skb);
+       l3_msg(pc->st, DL_DATA | REQUEST, skb);
 } /* l3ni1_redir_req */
 
 /********************************************/
@@ -2011,8 +2011,8 @@ static void l3ni1_redir_req(struct l3_process *pc, u_char pr, void *arg)
 /********************************************/
 static void l3ni1_redir_req_early(struct l3_process *pc, u_char pr, void *arg)
 {
-  l3ni1_proceed_req(pc,pr,arg);
-  l3ni1_redir_req(pc,pr,arg);
+       l3ni1_proceed_req(pc, pr, arg);
+       l3ni1_redir_req(pc, pr, arg);
 } /* l3ni1_redir_req_early */
 
 /***********************************************/
@@ -2022,108 +2022,108 @@ static void l3ni1_redir_req_early(struct l3_process *pc, u_char pr, void *arg)
 /***********************************************/
 static int l3ni1_cmd_global(struct PStack *st, isdn_ctrl *ic)
 { u_char id;
-  u_char temp[265];
-  u_char *p = temp;
-  int i, l, proc_len; 
-  struct sk_buff *skb;
-  struct l3_process *pc = NULL;
-
-  switch (ic->arg)
-   { case NI1_CMD_INVOKE:
-       if (ic->parm.ni1_io.datalen < 0) return(-2); /* invalid parameter */ 
-
-       for (proc_len = 1, i = ic->parm.ni1_io.proc >> 8; i; i++) 
-         i = i >> 8; /* add one byte */    
-       l = ic->parm.ni1_io.datalen + proc_len + 8; /* length excluding ie header */
-       if (l > 255) 
-         return(-2); /* too long */
-
-       if (!(id = new_invoke_id(st))) 
-         return(0); /* first get a invoke id -> return if no available */
-       
-       i = -1; 
-       MsgHead(p, i, MT_FACILITY); /* build message head */
-       *p++ = 0x1C; /* Facility IE */
-       *p++ = l; /* length of ie */
-       *p++ = 0x91; /* remote operations */
-       *p++ = 0xA1; /* invoke */
-       *p++ = l - 3; /* length of invoke */
-       *p++ = 0x02; /* invoke id tag */
-       *p++ = 0x01; /* length is 1 */
-       *p++ = id; /* invoke id */
-       *p++ = 0x02; /* operation */
-       *p++ = proc_len; /* length of operation */
-       
-       for (i = proc_len; i; i--)
-         *p++ = (ic->parm.ni1_io.proc >> (i-1)) & 0xFF;
-       memcpy(p, ic->parm.ni1_io.data, ic->parm.ni1_io.datalen); /* copy data */
-       l = (p - temp) + ic->parm.ni1_io.datalen; /* total length */         
-
-       if (ic->parm.ni1_io.timeout > 0)
-        if (!(pc = ni1_new_l3_process(st, -1)))
-          { free_invoke_id(st, id);
-            return(-2);
-          } 
-       pc->prot.ni1.ll_id = ic->parm.ni1_io.ll_id; /* remember id */ 
-       pc->prot.ni1.proc = ic->parm.ni1_io.proc; /* and procedure */
-
-       if (!(skb = l3_alloc_skb(l))) 
-         { free_invoke_id(st, id);
-           if (pc) ni1_release_l3_process(pc);
-           return(-2);
-         }
-       memcpy(skb_put(skb, l), temp, l);
-       
-       if (pc)
-        { pc->prot.ni1.invoke_id = id; /* remember id */
-          L3AddTimer(&pc->timer, ic->parm.ni1_io.timeout, CC_TNI1_IO | REQUEST);
-        }
-       
-       l3_msg(st, DL_DATA | REQUEST, skb);
-       ic->parm.ni1_io.hl_id = id; /* return id */
-       return(0);
-
-     case NI1_CMD_INVOKE_ABORT:
-       if ((pc = l3ni1_search_dummy_proc(st, ic->parm.ni1_io.hl_id)))
-       { L3DelTimer(&pc->timer); /* remove timer */
-          ni1_release_l3_process(pc);
-          return(0); 
-        } 
-       else
-       { l3_debug(st, "l3ni1_cmd_global abort unknown id");
-          return(-2);
-        } 
-       break;
-    
-     default: 
-       l3_debug(st, "l3ni1_cmd_global unknown cmd 0x%lx", ic->arg);
-       return(-1);  
-   } /* switch ic-> arg */
-  return(-1);
+       u_char temp[265];
+       u_char *p = temp;
+       int i, l, proc_len;
+       struct sk_buff *skb;
+       struct l3_process *pc = NULL;
+
+       switch (ic->arg)
+       { case NI1_CMD_INVOKE:
+                       if (ic->parm.ni1_io.datalen < 0) return (-2); /* invalid parameter */
+
+                       for (proc_len = 1, i = ic->parm.ni1_io.proc >> 8; i; i++)
+                               i = i >> 8; /* add one byte */
+                       l = ic->parm.ni1_io.datalen + proc_len + 8; /* length excluding ie header */
+                       if (l > 255)
+                               return (-2); /* too long */
+
+                       if (!(id = new_invoke_id(st)))
+                               return (0); /* first get a invoke id -> return if no available */
+
+                       i = -1;
+                       MsgHead(p, i, MT_FACILITY); /* build message head */
+                       *p++ = 0x1C; /* Facility IE */
+                       *p++ = l; /* length of ie */
+                       *p++ = 0x91; /* remote operations */
+                       *p++ = 0xA1; /* invoke */
+                       *p++ = l - 3; /* length of invoke */
+                       *p++ = 0x02; /* invoke id tag */
+                       *p++ = 0x01; /* length is 1 */
+                       *p++ = id; /* invoke id */
+                       *p++ = 0x02; /* operation */
+                       *p++ = proc_len; /* length of operation */
+
+                       for (i = proc_len; i; i--)
+                               *p++ = (ic->parm.ni1_io.proc >> (i - 1)) & 0xFF;
+                       memcpy(p, ic->parm.ni1_io.data, ic->parm.ni1_io.datalen); /* copy data */
+                       l = (p - temp) + ic->parm.ni1_io.datalen; /* total length */
+
+                       if (ic->parm.ni1_io.timeout > 0)
+                               if (!(pc = ni1_new_l3_process(st, -1)))
+                               { free_invoke_id(st, id);
+                                       return (-2);
+                               }
+                       pc->prot.ni1.ll_id = ic->parm.ni1_io.ll_id; /* remember id */
+                       pc->prot.ni1.proc = ic->parm.ni1_io.proc; /* and procedure */
+
+                       if (!(skb = l3_alloc_skb(l)))
+                       { free_invoke_id(st, id);
+                               if (pc) ni1_release_l3_process(pc);
+                               return (-2);
+                       }
+                       memcpy(skb_put(skb, l), temp, l);
+
+                       if (pc)
+                       { pc->prot.ni1.invoke_id = id; /* remember id */
+                               L3AddTimer(&pc->timer, ic->parm.ni1_io.timeout, CC_TNI1_IO | REQUEST);
+                       }
+
+                       l3_msg(st, DL_DATA | REQUEST, skb);
+                       ic->parm.ni1_io.hl_id = id; /* return id */
+                       return (0);
+
+       case NI1_CMD_INVOKE_ABORT:
+               if ((pc = l3ni1_search_dummy_proc(st, ic->parm.ni1_io.hl_id)))
+               { L3DelTimer(&pc->timer); /* remove timer */
+                       ni1_release_l3_process(pc);
+                       return (0);
+               }
+               else
+               { l3_debug(st, "l3ni1_cmd_global abort unknown id");
+                       return (-2);
+               }
+               break;
+
+       default:
+               l3_debug(st, "l3ni1_cmd_global unknown cmd 0x%lx", ic->arg);
+               return (-1);
+       } /* switch ic-> arg */
+       return (-1);
 } /* l3ni1_cmd_global */
 
-static void 
+static void
 l3ni1_io_timer(struct l3_process *pc)
 { isdn_ctrl ic;
-  struct IsdnCardState *cs = pc->st->l1.hardware;
+       struct IsdnCardState *cs = pc->st->l1.hardware;
 
-  L3DelTimer(&pc->timer); /* remove timer */
+       L3DelTimer(&pc->timer); /* remove timer */
 
-  ic.driver = cs->myid;
-  ic.command = ISDN_STAT_PROT;
-  ic.arg = NI1_STAT_INVOKE_ERR;
-  ic.parm.ni1_io.hl_id = pc->prot.ni1.invoke_id;
-  ic.parm.ni1_io.ll_id = pc->prot.ni1.ll_id;
-  ic.parm.ni1_io.proc = pc->prot.ni1.proc;
-  ic.parm.ni1_io.timeout= -1;
-  ic.parm.ni1_io.datalen = 0;
-  ic.parm.ni1_io.data = NULL;
-  free_invoke_id(pc->st, pc->prot.ni1.invoke_id);
-  pc->prot.ni1.invoke_id = 0; /* reset id */
+       ic.driver = cs->myid;
+       ic.command = ISDN_STAT_PROT;
+       ic.arg = NI1_STAT_INVOKE_ERR;
+       ic.parm.ni1_io.hl_id = pc->prot.ni1.invoke_id;
+       ic.parm.ni1_io.ll_id = pc->prot.ni1.ll_id;
+       ic.parm.ni1_io.proc = pc->prot.ni1.proc;
+       ic.parm.ni1_io.timeout = -1;
+       ic.parm.ni1_io.datalen = 0;
+       ic.parm.ni1_io.data = NULL;
+       free_invoke_id(pc->st, pc->prot.ni1.invoke_id);
+       pc->prot.ni1.invoke_id = 0; /* reset id */
 
-  cs->iif.statcallb(&ic);
+       cs->iif.statcallb(&ic);
 
-  ni1_release_l3_process(pc); 
+       ni1_release_l3_process(pc);
 } /* l3ni1_io_timer */
 
 static void
@@ -2293,12 +2293,12 @@ l3ni1_status(struct l3_process *pc, u_char pr, void *arg)
 {
        u_char *p;
        struct sk_buff *skb = arg;
-       int ret; 
+       int ret;
        u_char cause = 0, callState = 0;
-       
+
        if ((ret = l3ni1_get_cause(pc, skb))) {
                if (pc->debug & L3_DEB_WARN)
-                       l3_debug(pc->st, "STATUS get_cause ret(%d)",ret);
+                       l3_debug(pc->st, "STATUS get_cause ret(%d)", ret);
                if (ret < 0)
                        cause = 96;
                else if (ret > 0)
@@ -2323,9 +2323,9 @@ l3ni1_status(struct l3_process *pc, u_char pr, void *arg)
        }
        if (cause) {
                u_char tmp;
-               
+
                if (pc->debug & L3_DEB_WARN)
-                       l3_debug(pc->st, "STATUS error(%d/%d)",ret,cause);
+                       l3_debug(pc->st, "STATUS error(%d/%d)", ret, cause);
                tmp = pc->para.cause;
                pc->para.cause = cause;
                l3ni1_status_send(pc, 0, NULL);
@@ -2351,10 +2351,10 @@ l3ni1_facility(struct l3_process *pc, u_char pr, void *arg)
 {
        struct sk_buff *skb = arg;
        int ret;
-       
+
        ret = check_infoelements(pc, skb, ie_FACILITY);
        l3ni1_std_ie_err(pc, ret);
-         {
+       {
                u_char *p;
                if ((p = findie(skb->data, skb->len, IE_FACILITY, 0)))
                        l3ni1_parse_facility(pc->st, pc, pc->callref, p);
@@ -2403,7 +2403,7 @@ l3ni1_suspend_ack(struct l3_process *pc, u_char pr, void *arg)
        /* We don't handle suspend_ack for IE errors now */
        if ((ret = check_infoelements(pc, skb, ie_SUSPEND_ACKNOWLEDGE)))
                if (pc->debug & L3_DEB_WARN)
-                       l3_debug(pc->st, "SUSPACK check ie(%d)",ret);
+                       l3_debug(pc->st, "SUSPACK check ie(%d)", ret);
        ni1_release_l3_process(pc);
 }
 
@@ -2415,8 +2415,8 @@ l3ni1_suspend_rej(struct l3_process *pc, u_char pr, void *arg)
 
        if ((ret = l3ni1_get_cause(pc, skb))) {
                if (pc->debug & L3_DEB_WARN)
-                       l3_debug(pc->st, "SUSP_REJ get_cause ret(%d)",ret);
-               if (ret < 0) 
+                       l3_debug(pc->st, "SUSP_REJ get_cause ret(%d)", ret);
+               if (ret < 0)
                        pc->para.cause = 96;
                else
                        pc->para.cause = 100;
@@ -2507,8 +2507,8 @@ l3ni1_resume_rej(struct l3_process *pc, u_char pr, void *arg)
 
        if ((ret = l3ni1_get_cause(pc, skb))) {
                if (pc->debug & L3_DEB_WARN)
-                       l3_debug(pc->st, "RES_REJ get_cause ret(%d)",ret);
-               if (ret < 0) 
+                       l3_debug(pc->st, "RES_REJ get_cause ret(%d)", ret);
+               if (ret < 0)
                        pc->para.cause = 96;
                else
                        pc->para.cause = 100;
@@ -2562,7 +2562,7 @@ l3ni1_global_restart(struct l3_process *pc, u_char pr, void *arg)
                        up->st->lli.l4l3(up->st, CC_RESTART | REQUEST, up);
                else if (up->para.bchannel == chan)
                        up->st->lli.l4l3(up->st, CC_RESTART | REQUEST, up);
-               
+
                up = up->next;
        }
        p = tmp;
@@ -2586,112 +2586,112 @@ l3ni1_global_restart(struct l3_process *pc, u_char pr, void *arg)
 static void
 l3ni1_dl_reset(struct l3_process *pc, u_char pr, void *arg)
 {
-        pc->para.cause = 0x29;          /* Temporary failure */
-        pc->para.loc = 0;
-        l3ni1_disconnect_req(pc, pr, NULL);
-        pc->st->l3.l3l4(pc->st, CC_SETUP_ERR, pc);
+       pc->para.cause = 0x29;          /* Temporary failure */
+       pc->para.loc = 0;
+       l3ni1_disconnect_req(pc, pr, NULL);
+       pc->st->l3.l3l4(pc->st, CC_SETUP_ERR, pc);
 }
 
 static void
 l3ni1_dl_release(struct l3_process *pc, u_char pr, void *arg)
 {
-        newl3state(pc, 0);
-        pc->para.cause = 0x1b;          /* Destination out of order */
-        pc->para.loc = 0;
-        pc->st->l3.l3l4(pc->st, CC_RELEASE | INDICATION, pc);
-        release_l3_process(pc);
+       newl3state(pc, 0);
+       pc->para.cause = 0x1b;          /* Destination out of order */
+       pc->para.loc = 0;
+       pc->st->l3.l3l4(pc->st, CC_RELEASE | INDICATION, pc);
+       release_l3_process(pc);
 }
 
 static void
 l3ni1_dl_reestablish(struct l3_process *pc, u_char pr, void *arg)
 {
-        L3DelTimer(&pc->timer);
-        L3AddTimer(&pc->timer, T309, CC_T309);
-        l3_msg(pc->st, DL_ESTABLISH | REQUEST, NULL);
+       L3DelTimer(&pc->timer);
+       L3AddTimer(&pc->timer, T309, CC_T309);
+       l3_msg(pc->st, DL_ESTABLISH | REQUEST, NULL);
 }
+
 static void
 l3ni1_dl_reest_status(struct l3_process *pc, u_char pr, void *arg)
 {
        L3DelTimer(&pc->timer);
-       pc->para.cause = 0x1F; /* normal, unspecified */
+
+       pc->para.cause = 0x1F; /* normal, unspecified */
        l3ni1_status_send(pc, 0, NULL);
 }
 
-static void l3ni1_SendSpid( struct l3_process *pc, u_char pr, struct sk_buff *skb, int iNewState )
+static void l3ni1_SendSpid(struct l3_process *pc, u_char pr, struct sk_buff *skb, int iNewState)
 {
-       u_char         * p;
-       char           * pSPID;
-       struct Channel * pChan = pc->st->lli.userdata;
-       int              l;
+       u_char *p;
+       char *pSPID;
+       struct Channel *pChan = pc->st->lli.userdata;
+       int l;
 
-       if ( skb )
-               dev_kfree_skb( skb);
+       if (skb)
+               dev_kfree_skb(skb);
 
-       if ( !( pSPID = strchr( pChan->setup.eazmsn, ':' ) ) )
+       if (!(pSPID = strchr(pChan->setup.eazmsn, ':')))
        {
-               printk( KERN_ERR "SPID not supplied in EAZMSN %s\n", pChan->setup.eazmsn );
-               newl3state( pc, 0 );
-               pc->st->l3.l3l2( pc->st, DL_RELEASE | REQUEST, NULL );
+               printk(KERN_ERR "SPID not supplied in EAZMSN %s\n", pChan->setup.eazmsn);
+               newl3state(pc, 0);
+               pc->st->l3.l3l2(pc->st, DL_RELEASE | REQUEST, NULL);
                return;
        }
 
-       l = strlen( ++pSPID );
-       if ( !( skb = l3_alloc_skb( 5+l ) ) )
+       l = strlen(++pSPID);
+       if (!(skb = l3_alloc_skb(5 + l)))
        {
-               printk( KERN_ERR "HiSax can't get memory to send SPID\n" );
+               printk(KERN_ERR "HiSax can't get memory to send SPID\n");
                return;
        }
 
-       p = skb_put( skb, 5 );
+       p = skb_put(skb, 5);
        *p++ = PROTO_DIS_EURO;
        *p++ = 0;
        *p++ = MT_INFORMATION;
        *p++ = IE_SPID;
        *p++ = l;
 
-       memcpy( skb_put( skb, l ), pSPID, l );
+       memcpy(skb_put(skb, l), pSPID, l);
 
-       newl3state( pc, iNewState );
+       newl3state(pc, iNewState);
 
-       L3DelTimer( &pc->timer );
-       L3AddTimer( &pc->timer, TSPID, CC_TSPID );
+       L3DelTimer(&pc->timer);
+       L3AddTimer(&pc->timer, TSPID, CC_TSPID);
 
-       pc->st->l3.l3l2( pc->st, DL_DATA | REQUEST, skb );
+       pc->st->l3.l3l2(pc->st, DL_DATA | REQUEST, skb);
 }
 
-static void l3ni1_spid_send( struct l3_process *pc, u_char pr, void *arg )
+static void l3ni1_spid_send(struct l3_process *pc, u_char pr, void *arg)
 {
-       l3ni1_SendSpid( pc, pr, arg, 20 );
+       l3ni1_SendSpid(pc, pr, arg, 20);
 }
 
-static void l3ni1_spid_epid( struct l3_process *pc, u_char pr, void *arg )
+static void l3ni1_spid_epid(struct l3_process *pc, u_char pr, void *arg)
 {
        struct sk_buff *skb = arg;
 
-       if ( skb->data[ 1 ] == 0 )
-               if ( skb->data[ 3 ] == IE_ENDPOINT_ID )
+       if (skb->data[1] == 0)
+               if (skb->data[3] == IE_ENDPOINT_ID)
                {
-                       L3DelTimer( &pc->timer );
-                       newl3state( pc, 0 );
-                       l3_msg( pc->st, DL_ESTABLISH | CONFIRM, NULL );
+                       L3DelTimer(&pc->timer);
+                       newl3state(pc, 0);
+                       l3_msg(pc->st, DL_ESTABLISH | CONFIRM, NULL);
                }
-       dev_kfree_skb( skb);
+       dev_kfree_skb(skb);
 }
 
-static void l3ni1_spid_tout( struct l3_process *pc, u_char pr, void *arg )
+static void l3ni1_spid_tout(struct l3_process *pc, u_char pr, void *arg)
 {
-       if ( pc->state < 22 )
-               l3ni1_SendSpid( pc, pr, arg, pc->state+1 );
+       if (pc->state < 22)
+               l3ni1_SendSpid(pc, pr, arg, pc->state + 1);
        else
        {
-               L3DelTimer( &pc->timer );
-               dev_kfree_skb( arg);
+               L3DelTimer(&pc->timer);
+               dev_kfree_skb(arg);
 
-               printk( KERN_ERR "SPID not accepted\n" );
-               newl3state( pc, 0 );
-               pc->st->l3.l3l2( pc->st, DL_RELEASE | REQUEST, NULL );
+               printk(KERN_ERR "SPID not accepted\n");
+               newl3state(pc, 0);
+               pc->st->l3.l3l2(pc->st, DL_RELEASE | REQUEST, NULL);
        }
 }
 
@@ -2724,12 +2724,12 @@ static struct stateentry downstatelist[] =
         CC_SETUP | RESPONSE, l3ni1_setup_rsp},
        {SBIT(10),
         CC_SUSPEND | REQUEST, l3ni1_suspend_req},
-        {SBIT(7) | SBIT(9) | SBIT(25),
-         CC_REDIR | REQUEST, l3ni1_redir_req},
-        {SBIT(6),
-         CC_REDIR | REQUEST, l3ni1_redir_req_early},
-        {SBIT(9) | SBIT(25),
-         CC_DISCONNECT | REQUEST, l3ni1_disconnect_req},
+       {SBIT(7) | SBIT(9) | SBIT(25),
+        CC_REDIR | REQUEST, l3ni1_redir_req},
+       {SBIT(6),
+        CC_REDIR | REQUEST, l3ni1_redir_req_early},
+       {SBIT(9) | SBIT(25),
+        CC_DISCONNECT | REQUEST, l3ni1_disconnect_req},
        {SBIT(25),
         CC_T302, l3ni1_t302},
        {SBIT(1),
@@ -2752,8 +2752,8 @@ static struct stateentry downstatelist[] =
         CC_T308_2, l3ni1_t308_2},
        {SBIT(10),
         CC_T309, l3ni1_dl_release},
-       { SBIT( 20 ) | SBIT( 21 ) | SBIT( 22 ),
-        CC_TSPID, l3ni1_spid_tout },
+       { SBIT(20) | SBIT(21) | SBIT(22),
+         CC_TSPID, l3ni1_spid_tout },
 };
 
 static struct stateentry datastatelist[] =
@@ -2815,22 +2815,22 @@ static struct stateentry globalmes_list[] =
        {SBIT(0),
         MT_RESTART, l3ni1_global_restart},
 /*     {SBIT(1),
-        MT_RESTART_ACKNOWLEDGE, l3ni1_restart_ack},
+       MT_RESTART_ACKNOWLEDGE, l3ni1_restart_ack},
 */
-       { SBIT( 0 ), MT_DL_ESTABLISHED, l3ni1_spid_send },
-       { SBIT( 20 ) | SBIT( 21 ) | SBIT( 22 ), MT_INFORMATION, l3ni1_spid_epid },
+       { SBIT(0), MT_DL_ESTABLISHED, l3ni1_spid_send },
+       { SBIT(20) | SBIT(21) | SBIT(22), MT_INFORMATION, l3ni1_spid_epid },
 };
 
 static struct stateentry manstatelist[] =
 {
-        {SBIT(2),
-         DL_ESTABLISH | INDICATION, l3ni1_dl_reset},
-        {SBIT(10),
-         DL_ESTABLISH | CONFIRM, l3ni1_dl_reest_status},
-        {SBIT(10),
-         DL_RELEASE | INDICATION, l3ni1_dl_reestablish},
-        {ALL_STATES,
-         DL_RELEASE | INDICATION, l3ni1_dl_release},
+       {SBIT(2),
+        DL_ESTABLISH | INDICATION, l3ni1_dl_reset},
+       {SBIT(10),
+        DL_ESTABLISH | CONFIRM, l3ni1_dl_reest_status},
+       {SBIT(10),
+        DL_RELEASE | INDICATION, l3ni1_dl_reestablish},
+       {ALL_STATES,
+        DL_RELEASE | INDICATION, l3ni1_dl_release},
 };
 
 /* *INDENT-ON* */
@@ -2845,7 +2845,7 @@ global_handler(struct PStack *st, int mt, struct sk_buff *skb)
        int i;
        struct l3_process *proc = st->l3.global;
 
-       if ( skb )      
+       if (skb)
                proc->callref = skb->data[2]; /* cr flag */
        else
                proc->callref = 0;
@@ -2856,13 +2856,13 @@ global_handler(struct PStack *st, int mt, struct sk_buff *skb)
        if (i == ARRAY_SIZE(globalmes_list)) {
                if (st->l3.debug & L3_DEB_STATE) {
                        l3_debug(st, "ni1 global state %d mt %x unhandled",
-                               proc->state, mt);
+                                proc->state, mt);
                }
                MsgHead(p, proc->callref, MT_STATUS);
                *p++ = IE_CAUSE;
                *p++ = 0x2;
                *p++ = 0x80;
-               *p++ = 81 |0x80;        /* invalid cr */
+               *p++ = 81 | 0x80;       /* invalid cr */
                *p++ = 0x14;            /* CallState */
                *p++ = 0x1;
                *p++ = proc->state & 0x3f;
@@ -2874,7 +2874,7 @@ global_handler(struct PStack *st, int mt, struct sk_buff *skb)
        } else {
                if (st->l3.debug & L3_DEB_STATE) {
                        l3_debug(st, "ni1 global %d mt %x",
-                               proc->state, mt);
+                                proc->state, mt);
                }
                globalmes_list[i].rout(proc, mt, skb);
        }
@@ -2890,23 +2890,23 @@ ni1up(struct PStack *st, int pr, void *arg)
        struct l3_process *proc;
 
        switch (pr) {
-               case (DL_DATA | INDICATION):
-               case (DL_UNIT_DATA | INDICATION):
-                       break;
-               case (DL_ESTABLISH | INDICATION):
-               case (DL_RELEASE | INDICATION):
-               case (DL_RELEASE | CONFIRM):
-                       l3_msg(st, pr, arg);
-                       return;
-                       break;
+       case (DL_DATA | INDICATION):
+       case (DL_UNIT_DATA | INDICATION):
+               break;
+       case (DL_ESTABLISH | INDICATION):
+       case (DL_RELEASE | INDICATION):
+       case (DL_RELEASE | CONFIRM):
+               l3_msg(st, pr, arg);
+               return;
+               break;
 
-               case (DL_ESTABLISH | CONFIRM):
-                       global_handler( st, MT_DL_ESTABLISHED, NULL );
-                       return;
+       case (DL_ESTABLISH | CONFIRM):
+               global_handler(st, MT_DL_ESTABLISHED, NULL);
+               return;
 
-               default:
-                       printk(KERN_ERR "HiSax ni1up unknown pr=%04x\n", pr);
-                       return;
+       default:
+               printk(KERN_ERR "HiSax ni1up unknown pr=%04x\n", pr);
+               return;
        }
        if (skb->len < 3) {
                l3_debug(st, "ni1up frame too short(%d)", skb->len);
@@ -2941,10 +2941,10 @@ ni1up(struct PStack *st, int pr, void *arg)
                if (mt == MT_FACILITY)
                {
                        if ((p = findie(skb->data, skb->len, IE_FACILITY, 0))) {
-                               l3ni1_parse_facility(st, NULL, 
-                                       (pr == (DL_DATA | INDICATION)) ? -1 : -2, p); 
+                               l3ni1_parse_facility(st, NULL,
+                                                    (pr == (DL_DATA | INDICATION)) ? -1 : -2, p);
                                dev_kfree_skb(skb);
-                               return;  
+                               return;
                        }
                }
                else
@@ -2952,13 +2952,13 @@ ni1up(struct PStack *st, int pr, void *arg)
                        global_handler(st, mt, skb);
                        return;
                }
-                               
+
                if (st->l3.debug & L3_DEB_WARN)
                        l3_debug(st, "ni1up dummy Callref (no facility msg or ie)");
                dev_kfree_skb(skb);
                return;
-       } else if ((((skb->data[1] & 0x0f) == 1) && (0==(cr & 0x7f))) ||
-               (((skb->data[1] & 0x0f) == 2) && (0==(cr & 0x7fff)))) { /* Global CallRef */
+       } else if ((((skb->data[1] & 0x0f) == 1) && (0 == (cr & 0x7f))) ||
+                  (((skb->data[1] & 0x0f) == 2) && (0 == (cr & 0x7fff)))) {    /* Global CallRef */
                if (st->l3.debug & L3_DEB_STATE)
                        l3_debug(st, "ni1up Global CallRef");
                global_handler(st, mt, skb);
@@ -3036,8 +3036,8 @@ ni1up(struct PStack *st, int pr, void *arg)
                dev_kfree_skb(skb);
                return;
        }
-       if ((p = findie(skb->data, skb->len, IE_DISPLAY, 0)) != NULL) 
-         l3ni1_deliver_display(proc, pr, p); /* Display IE included */
+       if ((p = findie(skb->data, skb->len, IE_DISPLAY, 0)) != NULL)
+               l3ni1_deliver_display(proc, pr, p); /* Display IE included */
        for (i = 0; i < ARRAY_SIZE(datastatelist); i++)
                if ((mt == datastatelist[i].primitive) &&
                    ((1 << proc->state) & datastatelist[i].state))
@@ -3045,8 +3045,8 @@ ni1up(struct PStack *st, int pr, void *arg)
        if (i == ARRAY_SIZE(datastatelist)) {
                if (st->l3.debug & L3_DEB_STATE) {
                        l3_debug(st, "ni1up%sstate %d mt %#x unhandled",
-                               (pr == (DL_DATA | INDICATION)) ? " " : "(broadcast) ",
-                               proc->state, mt);
+                                (pr == (DL_DATA | INDICATION)) ? " " : "(broadcast) ",
+                                proc->state, mt);
                }
                if ((MT_RELEASE_COMPLETE != mt) && (MT_RELEASE != mt)) {
                        proc->para.cause = 101;
@@ -3055,8 +3055,8 @@ ni1up(struct PStack *st, int pr, void *arg)
        } else {
                if (st->l3.debug & L3_DEB_STATE) {
                        l3_debug(st, "ni1up%sstate %d mt %x",
-                               (pr == (DL_DATA | INDICATION)) ? " " : "(broadcast) ",
-                               proc->state, mt);
+                                (pr == (DL_DATA | INDICATION)) ? " " : "(broadcast) ",
+                                proc->state, mt);
                }
                datastatelist[i].rout(proc, pr, skb);
        }
@@ -3092,10 +3092,10 @@ ni1down(struct PStack *st, int pr, void *arg)
                return;
        }
 
-       if ( pr == (CC_TNI1_IO | REQUEST)) {
-               l3ni1_io_timer(proc); /* timer expires */ 
+       if (pr == (CC_TNI1_IO | REQUEST)) {
+               l3ni1_io_timer(proc); /* timer expires */
                return;
-       }  
+       }
 
        for (i = 0; i < ARRAY_SIZE(downstatelist); i++)
                if ((pr == downstatelist[i].primitive) &&
@@ -3104,12 +3104,12 @@ ni1down(struct PStack *st, int pr, void *arg)
        if (i == ARRAY_SIZE(downstatelist)) {
                if (st->l3.debug & L3_DEB_STATE) {
                        l3_debug(st, "ni1down state %d prim %#x unhandled",
-                               proc->state, pr);
+                                proc->state, pr);
                }
        } else {
                if (st->l3.debug & L3_DEB_STATE) {
                        l3_debug(st, "ni1down state %d prim %#x",
-                               proc->state, pr);
+                                proc->state, pr);
                }
                downstatelist[i].rout(proc, pr, arg);
        }
@@ -3118,31 +3118,31 @@ ni1down(struct PStack *st, int pr, void *arg)
 static void
 ni1man(struct PStack *st, int pr, void *arg)
 {
-        int i;
-        struct l3_process *proc = arg;
-
-        if (!proc) {
-                printk(KERN_ERR "HiSax ni1man without proc pr=%04x\n", pr);
-                return;
-        }
-        for (i = 0; i < ARRAY_SIZE(manstatelist); i++)
-                if ((pr == manstatelist[i].primitive) &&
-                    ((1 << proc->state) & manstatelist[i].state))
-                        break;
-        if (i == ARRAY_SIZE(manstatelist)) {
-                if (st->l3.debug & L3_DEB_STATE) {
-                        l3_debug(st, "cr %d ni1man state %d prim %#x unhandled",
-                                proc->callref & 0x7f, proc->state, pr);
-                }
-        } else {
-                if (st->l3.debug & L3_DEB_STATE) {
-                        l3_debug(st, "cr %d ni1man state %d prim %#x",
-                                proc->callref & 0x7f, proc->state, pr);
-                }
-                manstatelist[i].rout(proc, pr, arg);
-        }
-}
+       int i;
+       struct l3_process *proc = arg;
+
+       if (!proc) {
+               printk(KERN_ERR "HiSax ni1man without proc pr=%04x\n", pr);
+               return;
+       }
+       for (i = 0; i < ARRAY_SIZE(manstatelist); i++)
+               if ((pr == manstatelist[i].primitive) &&
+                   ((1 << proc->state) & manstatelist[i].state))
+                       break;
+       if (i == ARRAY_SIZE(manstatelist)) {
+               if (st->l3.debug & L3_DEB_STATE) {
+                       l3_debug(st, "cr %d ni1man state %d prim %#x unhandled",
+                                proc->callref & 0x7f, proc->state, pr);
+               }
+       } else {
+               if (st->l3.debug & L3_DEB_STATE) {
+                       l3_debug(st, "cr %d ni1man state %d prim %#x",
+                                proc->callref & 0x7f, proc->state, pr);
+               }
+               manstatelist[i].rout(proc, pr, arg);
+       }
+}
+
 void
 setstack_ni1(struct PStack *st)
 {
@@ -3157,8 +3157,8 @@ setstack_ni1(struct PStack *st)
        st->prot.ni1.last_invoke_id = 0;
        st->prot.ni1.invoke_used[0] = 1; /* Bit 0 must always be set to 1 */
        i = 1;
-       while (i < 32) 
-               st->prot.ni1.invoke_used[i++] = 0;   
+       while (i < 32)
+               st->prot.ni1.invoke_used[i++] = 0;
 
        if (!(st->l3.global = kmalloc(sizeof(struct l3_process), GFP_ATOMIC))) {
                printk(KERN_ERR "HiSax can't get memory for ni1 global CR\n");
@@ -3169,7 +3169,7 @@ setstack_ni1(struct PStack *st)
                st->l3.global->debug = L3_DEB_WARN;
                st->l3.global->st = st;
                st->l3.global->N303 = 1;
-               st->l3.global->prot.ni1.invoke_id = 0; 
+               st->l3.global->prot.ni1.invoke_id = 0;
 
                L3InitTimer(st->l3.global, &st->l3.global->timer);
        }
index 4066da2..99d37d2 100644 (file)
@@ -4,13 +4,13 @@
  *
  * Author       Matt Henderson & Guy Ellis
  * Copyright    by Traverse Technologies Pty Ltd, www.travers.com.au
- * 
+ *
  * This software may be used and distributed according to the terms
  * of the GNU General Public License, incorporated herein by reference.
  *
- * 2000.6.6 Initial implementation of routines for US NI1 
- * Layer 3 protocol based on the EURO/DSS1 D-channel protocol 
- * driver written by Karsten Keil et al.  Thanks also for the 
+ * 2000.6.6 Initial implementation of routines for US NI1
+ * Layer 3 protocol based on the EURO/DSS1 D-channel protocol
+ * driver written by Karsten Keil et al.  Thanks also for the
  * code provided by Ragnar Paulson.
  *
  */
 
 /* l3ni1 specific data in l3 process */
 typedef struct
-  { unsigned char invoke_id; /* used invoke id in remote ops, 0 = not active */
-    ulong ll_id; /* remebered ll id */
-    u8 remote_operation; /* handled remote operation, 0 = not active */ 
-    int proc; /* rememered procedure */  
-    ulong remote_result; /* result of remote operation for statcallb */
-    char uus1_data[35]; /* data send during alerting or disconnect */
-  } ni1_proc_priv;
+{ unsigned char invoke_id; /* used invoke id in remote ops, 0 = not active */
+       ulong ll_id; /* remebered ll id */
+       u8 remote_operation; /* handled remote operation, 0 = not active */
+       int proc; /* rememered procedure */
+       ulong remote_result; /* result of remote operation for statcallb */
+       char uus1_data[35]; /* data send during alerting or disconnect */
+} ni1_proc_priv;
 
 /* l3dni1 specific data in protocol stack */
 typedef struct
-  { unsigned char last_invoke_id; /* last used value for invoking */
-    unsigned char invoke_used[32]; /* 256 bits for 256 values */
-  } ni1_stk_priv;        
+{ unsigned char last_invoke_id; /* last used value for invoking */
+       unsigned char invoke_used[32]; /* 256 bits for 256 values */
+} ni1_stk_priv;
 
 #endif /* only l3dni1_process */
index d4f86d6..5b63eb6 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Author       Karsten Keil
  * Copyright    by Karsten Keil      <keil@isdn4linux.de>
- * 
+ *
  * This software may be used and distributed according to the terms
  * of the GNU General Public License, incorporated herein by reference.
  *
@@ -16,12 +16,12 @@ static void
 error_handling_dchan(struct PStack *st, int Error)
 {
        switch (Error) {
-               case 'C':
-               case 'D':
-               case 'G':
-               case 'H':
-                       st->l2.l2tei(st, MDL_ERROR | REQUEST, NULL);
-                       break;
+       case 'C':
+       case 'D':
+       case 'G':
+       case 'H':
+               st->l2.l2tei(st, MDL_ERROR | REQUEST, NULL);
+               break;
        }
 }
 
@@ -31,15 +31,15 @@ hisax_manager(struct PStack *st, int pr, void *arg)
        long Code;
 
        switch (pr) {
-               case (MDL_ERROR | INDICATION):
-                       Code = (long) arg;
-                       HiSax_putstatus(st->l1.hardware, "manager: MDL_ERROR",
-                               " %c %s", (char)Code, 
+       case (MDL_ERROR | INDICATION):
+               Code = (long) arg;
+               HiSax_putstatus(st->l1.hardware, "manager: MDL_ERROR",
+                               " %c %s", (char)Code,
                                test_bit(FLG_LAPD, &st->l2.flag) ?
                                "D-channel" : "B-channel");
-                       if (test_bit(FLG_LAPD, &st->l2.flag))
-                               error_handling_dchan(st, Code);
-                       break;
+               if (test_bit(FLG_LAPD, &st->l2.flag))
+                       error_handling_dchan(st, Code);
+               break;
        }
 }
 
index 2539430..08a6b7f 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Author       Stephan von Krawczynski
  * Copyright    by Stephan von Krawczynski <skraw@ithnet.com>
- * 
+ *
  * This software may be used and distributed according to the terms
  * of the GNU General Public License, incorporated herein by reference.
  *
@@ -18,7 +18,7 @@
 
 static const char *mic_revision = "$Revision: 1.12.2.4 $";
 
-#define byteout(addr,val) outb(val,addr)
+#define byteout(addr, val) outb(val, addr)
 #define bytein(addr) inb(addr)
 
 #define MIC_ISAC       2
@@ -39,7 +39,7 @@ readreg(unsigned int ale, unsigned int adr, u_char off)
 }
 
 static inline void
-readfifo(unsigned int ale, unsigned int adr, u_char off, u_char * data, int size)
+readfifo(unsigned int ale, unsigned int adr, u_char off, u_char *data, int size)
 {
        byteout(ale, off);
        insb(adr, data, size);
@@ -54,7 +54,7 @@ writereg(unsigned int ale, unsigned int adr, u_char off, u_char data)
 }
 
 static inline void
-writefifo(unsigned int ale, unsigned int adr, u_char off, u_char * data, int size)
+writefifo(unsigned int ale, unsigned int adr, u_char off, u_char *data, int size)
 {
        byteout(ale, off);
        outsb(adr, data, size);
@@ -75,13 +75,13 @@ WriteISAC(struct IsdnCardState *cs, u_char offset, u_char value)
 }
 
 static void
-ReadISACfifo(struct IsdnCardState *cs, u_char * data, int size)
+ReadISACfifo(struct IsdnCardState *cs, u_char *data, int size)
 {
        readfifo(cs->hw.mic.adr, cs->hw.mic.isac, 0, data, size);
 }
 
 static void
-WriteISACfifo(struct IsdnCardState *cs, u_char * data, int size)
+WriteISACfifo(struct IsdnCardState *cs, u_char *data, int size)
 {
        writefifo(cs->hw.mic.adr, cs->hw.mic.isac, 0, data, size);
 }
@@ -104,16 +104,16 @@ WriteHSCX(struct IsdnCardState *cs, int hscx, u_char offset, u_char value)
  * fast interrupt HSCX stuff goes here
  */
 
-#define READHSCX(cs, nr, reg) readreg(cs->hw.mic.adr, \
-               cs->hw.mic.hscx, reg + (nr ? 0x40 : 0))
-#define WRITEHSCX(cs, nr, reg, data) writereg(cs->hw.mic.adr, \
-               cs->hw.mic.hscx, reg + (nr ? 0x40 : 0), data)
+#define READHSCX(cs, nr, reg) readreg(cs->hw.mic.adr,                  \
+                                     cs->hw.mic.hscx, reg + (nr ? 0x40 : 0))
+#define WRITEHSCX(cs, nr, reg, data) writereg(cs->hw.mic.adr,          \
+                                             cs->hw.mic.hscx, reg + (nr ? 0x40 : 0), data)
 
-#define READHSCXFIFO(cs, nr, ptr, cnt) readfifo(cs->hw.mic.adr, \
-               cs->hw.mic.hscx, (nr ? 0x40 : 0), ptr, cnt)
+#define READHSCXFIFO(cs, nr, ptr, cnt) readfifo(cs->hw.mic.adr,                \
+                                               cs->hw.mic.hscx, (nr ? 0x40 : 0), ptr, cnt)
 
-#define WRITEHSCXFIFO(cs, nr, ptr, cnt) writefifo(cs->hw.mic.adr, \
-               cs->hw.mic.hscx, (nr ? 0x40 : 0), ptr, cnt)
+#define WRITEHSCXFIFO(cs, nr, ptr, cnt) writefifo(cs->hw.mic.adr,      \
+                                                 cs->hw.mic.hscx, (nr ? 0x40 : 0), ptr, cnt)
 
 #include "hscx_irq.c"
 
@@ -126,11 +126,11 @@ mic_interrupt(int intno, void *dev_id)
 
        spin_lock_irqsave(&cs->lock, flags);
        val = readreg(cs->hw.mic.adr, cs->hw.mic.hscx, HSCX_ISTA + 0x40);
-      Start_HSCX:
+Start_HSCX:
        if (val)
                hscx_int_main(cs, val);
        val = readreg(cs->hw.mic.adr, cs->hw.mic.isac, ISAC_ISTA);
-      Start_ISAC:
+Start_ISAC:
        if (val)
                isac_interrupt(cs, val);
        val = readreg(cs->hw.mic.adr, cs->hw.mic.hscx, HSCX_ISTA + 0x40);
@@ -170,21 +170,21 @@ mic_card_msg(struct IsdnCardState *cs, int mt, void *arg)
        u_long flags;
 
        switch (mt) {
-               case CARD_RESET:
-                       return(0);
-               case CARD_RELEASE:
-                       release_io_mic(cs);
-                       return(0);
-               case CARD_INIT:
-                       spin_lock_irqsave(&cs->lock, flags);
-                       inithscx(cs); /* /RTSA := ISAC RST */
-                       inithscxisac(cs, 3);
-                       spin_unlock_irqrestore(&cs->lock, flags);
-                       return(0);
-               case CARD_TEST:
-                       return(0);
+       case CARD_RESET:
+               return (0);
+       case CARD_RELEASE:
+               release_io_mic(cs);
+               return (0);
+       case CARD_INIT:
+               spin_lock_irqsave(&cs->lock, flags);
+               inithscx(cs); /* /RTSA := ISAC RST */
+               inithscxisac(cs, 3);
+               spin_unlock_irqrestore(&cs->lock, flags);
+               return (0);
+       case CARD_TEST:
+               return (0);
        }
-       return(0);
+       return (0);
 }
 
 int __devinit
@@ -214,7 +214,7 @@ setup_mic(struct IsdnCard *card)
                return (0);
        }
        printk(KERN_INFO "mic: defined at 0x%x IRQ %d\n",
-               cs->hw.mic.cfg_reg, cs->irq);
+              cs->hw.mic.cfg_reg, cs->irq);
        setup_isac(cs);
        cs->readisac = &ReadISAC;
        cs->writeisac = &WriteISAC;
@@ -228,7 +228,7 @@ setup_mic(struct IsdnCard *card)
        ISACVersion(cs, "mic:");
        if (HscxVersion(cs, "mic:")) {
                printk(KERN_WARNING
-                   "mic: wrong HSCX versions check IO address\n");
+                      "mic: wrong HSCX versions check IO address\n");
                release_io_mic(cs);
                return (0);
        }
index 644891e..b646eed 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Author       Karsten Keil
  * Copyright    by Karsten Keil      <keil@isdn4linux.de>
- * 
+ *
  * This software may be used and distributed according to the terms
  * of the GNU General Public License, incorporated herein by reference.
  *
@@ -31,21 +31,21 @@ u_char
 NETjet_ReadIC(struct IsdnCardState *cs, u_char offset)
 {
        u_char ret;
-       
+
        cs->hw.njet.auxd &= 0xfc;
-       cs->hw.njet.auxd |= (offset>>4) & 3;
+       cs->hw.njet.auxd |= (offset >> 4) & 3;
        byteout(cs->hw.njet.auxa, cs->hw.njet.auxd);
-       ret = bytein(cs->hw.njet.isac + ((offset & 0xf)<<2));
-       return(ret);
+       ret = bytein(cs->hw.njet.isac + ((offset & 0xf) << 2));
+       return (ret);
 }
 
 void
 NETjet_WriteIC(struct IsdnCardState *cs, u_char offset, u_char value)
 {
        cs->hw.njet.auxd &= 0xfc;
-       cs->hw.njet.auxd |= (offset>>4) & 3;
+       cs->hw.njet.auxd |= (offset >> 4) & 3;
        byteout(cs->hw.njet.auxa, cs->hw.njet.auxd);
-       byteout(cs->hw.njet.isac + ((offset & 0xf)<<2), value);
+       byteout(cs->hw.njet.isac + ((offset & 0xf) << 2), value);
 }
 
 void
@@ -56,7 +56,7 @@ NETjet_ReadICfifo(struct IsdnCardState *cs, u_char *data, int size)
        insb(cs->hw.njet.isac, data, size);
 }
 
-void 
+void
 NETjet_WriteICfifo(struct IsdnCardState *cs, u_char *data, int size)
 {
        cs->hw.njet.auxd &= 0xfc;
@@ -66,17 +66,17 @@ NETjet_WriteICfifo(struct IsdnCardState *cs, u_char *data, int size)
 
 static void fill_mem(struct BCState *bcs, u_int *pos, u_int cnt, int chan, u_char fill)
 {
-       u_int mask=0x000000ff, val = 0, *p=pos;
+       u_int mask = 0x000000ff, val = 0, *p = pos;
        u_int i;
-       
+
        val |= fill;
        if (chan) {
                val  <<= 8;
                mask <<= 8;
        }
        mask ^= 0xffffffff;
-       for (i=0; i<cnt; i++) {
-               *p   &= mask;
+       for (i = 0; i < cnt; i++) {
+               *p &= mask;
                *p++ |= val;
                if (p > bcs->hw.tiger.s_end)
                        p = bcs->hw.tiger.send;
@@ -87,7 +87,7 @@ static void
 mode_tiger(struct BCState *bcs, int mode, int bc)
 {
        struct IsdnCardState *cs = bcs->cs;
-        u_char led;
+       u_char led;
 
        if (cs->debug & L1_DEB_HSCX)
                debugl1(cs, "Tiger mode %d bchan %d/%d",
@@ -95,63 +95,63 @@ mode_tiger(struct BCState *bcs, int mode, int bc)
        bcs->mode = mode;
        bcs->channel = bc;
        switch (mode) {
-               case (L1_MODE_NULL):
-                       fill_mem(bcs, bcs->hw.tiger.send,
-                               NETJET_DMA_TXSIZE, bc, 0xff);
-                       if (cs->debug & L1_DEB_HSCX)
-                               debugl1(cs, "Tiger stat rec %d/%d send %d",
-                                       bcs->hw.tiger.r_tot, bcs->hw.tiger.r_err,
-                                       bcs->hw.tiger.s_tot); 
-                       if ((cs->bcs[0].mode == L1_MODE_NULL) &&
-                               (cs->bcs[1].mode == L1_MODE_NULL)) {
-                               cs->hw.njet.dmactrl = 0;
-                               byteout(cs->hw.njet.base + NETJET_DMACTRL,
-                                       cs->hw.njet.dmactrl);
-                               byteout(cs->hw.njet.base + NETJET_IRQMASK0, 0);
-                       }
-                        if (cs->typ == ISDN_CTYPE_NETJET_S)
-                        {
-                                // led off
-                                led = bc & 0x01;
-                                led = 0x01 << (6 + led); // convert to mask
-                                led = ~led;
-                                cs->hw.njet.auxd &= led;
-                                byteout(cs->hw.njet.auxa, cs->hw.njet.auxd);
-                        }
-                       break;
-               case (L1_MODE_TRANS):
-                       break;
-               case (L1_MODE_HDLC_56K):
-               case (L1_MODE_HDLC):
+       case (L1_MODE_NULL):
+               fill_mem(bcs, bcs->hw.tiger.send,
+                        NETJET_DMA_TXSIZE, bc, 0xff);
+               if (cs->debug & L1_DEB_HSCX)
+                       debugl1(cs, "Tiger stat rec %d/%d send %d",
+                               bcs->hw.tiger.r_tot, bcs->hw.tiger.r_err,
+                               bcs->hw.tiger.s_tot);
+               if ((cs->bcs[0].mode == L1_MODE_NULL) &&
+                   (cs->bcs[1].mode == L1_MODE_NULL)) {
+                       cs->hw.njet.dmactrl = 0;
+                       byteout(cs->hw.njet.base + NETJET_DMACTRL,
+                               cs->hw.njet.dmactrl);
+                       byteout(cs->hw.njet.base + NETJET_IRQMASK0, 0);
+               }
+               if (cs->typ == ISDN_CTYPE_NETJET_S)
+               {
+                       // led off
+                       led = bc & 0x01;
+                       led = 0x01 << (6 + led); // convert to mask
+                       led = ~led;
+                       cs->hw.njet.auxd &= led;
+                       byteout(cs->hw.njet.auxa, cs->hw.njet.auxd);
+               }
+               break;
+       case (L1_MODE_TRANS):
+               break;
+       case (L1_MODE_HDLC_56K):
+       case (L1_MODE_HDLC):
+               fill_mem(bcs, bcs->hw.tiger.send,
+                        NETJET_DMA_TXSIZE, bc, 0xff);
+               bcs->hw.tiger.r_state = HDLC_ZERO_SEARCH;
+               bcs->hw.tiger.r_tot = 0;
+               bcs->hw.tiger.r_bitcnt = 0;
+               bcs->hw.tiger.r_one = 0;
+               bcs->hw.tiger.r_err = 0;
+               bcs->hw.tiger.s_tot = 0;
+               if (!cs->hw.njet.dmactrl) {
                        fill_mem(bcs, bcs->hw.tiger.send,
-                               NETJET_DMA_TXSIZE, bc, 0xff);
-                       bcs->hw.tiger.r_state = HDLC_ZERO_SEARCH;
-                       bcs->hw.tiger.r_tot = 0;
-                       bcs->hw.tiger.r_bitcnt = 0;
-                       bcs->hw.tiger.r_one = 0;
-                       bcs->hw.tiger.r_err = 0;
-                       bcs->hw.tiger.s_tot = 0;
-                       if (! cs->hw.njet.dmactrl) {
-                               fill_mem(bcs, bcs->hw.tiger.send,
-                                       NETJET_DMA_TXSIZE, !bc, 0xff);
-                               cs->hw.njet.dmactrl = 1;
-                               byteout(cs->hw.njet.base + NETJET_DMACTRL,
-                                       cs->hw.njet.dmactrl);
-                               byteout(cs->hw.njet.base + NETJET_IRQMASK0, 0x0f);
+                                NETJET_DMA_TXSIZE, !bc, 0xff);
+                       cs->hw.njet.dmactrl = 1;
+                       byteout(cs->hw.njet.base + NETJET_DMACTRL,
+                               cs->hw.njet.dmactrl);
+                       byteout(cs->hw.njet.base + NETJET_IRQMASK0, 0x0f);
                        /* was 0x3f now 0x0f for TJ300 and TJ320  GE 13/07/00 */
-                       }
-                       bcs->hw.tiger.sendp = bcs->hw.tiger.send;
-                       bcs->hw.tiger.free = NETJET_DMA_TXSIZE;
-                       test_and_set_bit(BC_FLG_EMPTY, &bcs->Flag);
-                        if (cs->typ == ISDN_CTYPE_NETJET_S)
-                        {
-                                // led on
-                                led = bc & 0x01;
-                                led = 0x01 << (6 + led); // convert to mask
-                                cs->hw.njet.auxd |= led;
-                                byteout(cs->hw.njet.auxa, cs->hw.njet.auxd);
-                        }
-                       break;
+               }
+               bcs->hw.tiger.sendp = bcs->hw.tiger.send;
+               bcs->hw.tiger.free = NETJET_DMA_TXSIZE;
+               test_and_set_bit(BC_FLG_EMPTY, &bcs->Flag);
+               if (cs->typ == ISDN_CTYPE_NETJET_S)
+               {
+                       // led on
+                       led = bc & 0x01;
+                       led = 0x01 << (6 + led); // convert to mask
+                       cs->hw.njet.auxd |= led;
+                       byteout(cs->hw.njet.auxa, cs->hw.njet.auxd);
+               }
+               break;
        }
        if (cs->debug & L1_DEB_HSCX)
                debugl1(cs, "tiger: set %x %x %x  %x/%x  pulse=%d",
@@ -166,15 +166,15 @@ mode_tiger(struct BCState *bcs, int mode, int bc)
 static void printframe(struct IsdnCardState *cs, u_char *buf, int count, char *s) {
        char tmp[128];
        char *t = tmp;
-       int i=count,j;
+       int i = count, j;
        u_char *p = buf;
 
        t += sprintf(t, "tiger %s(%4d)", s, count);
-       while (i>0) {
-               if (i>16)
-                       j=16;
+       while (i > 0) {
+               if (i > 16)
+                       j = 16;
                else
-                       j=i;
+                       j = i;
                QuickHex(t, p, j);
                debugl1(cs, tmp);
                p += j;
@@ -186,78 +186,78 @@ static void printframe(struct IsdnCardState *cs, u_char *buf, int count, char *s
 
 // macro for 64k
 
-#define MAKE_RAW_BYTE for (j=0; j<8; j++) { \
-                       bitcnt++;\
-                       s_val >>= 1;\
-                       if (val & 1) {\
-                               s_one++;\
-                               s_val |= 0x80;\
-                       } else {\
-                               s_one = 0;\
-                               s_val &= 0x7f;\
-                       }\
-                       if (bitcnt==8) {\
-                               bcs->hw.tiger.sendbuf[s_cnt++] = s_val;\
-                               bitcnt = 0;\
-                       }\
-                       if (s_one == 5) {\
-                               s_val >>= 1;\
-                               s_val &= 0x7f;\
-                               bitcnt++;\
-                               s_one = 0;\
-                       }\
-                       if (bitcnt==8) {\
-                               bcs->hw.tiger.sendbuf[s_cnt++] = s_val;\
-                               bitcnt = 0;\
-                       }\
-                       val >>= 1;\
-               }
+#define MAKE_RAW_BYTE for (j = 0; j < 8; j++) {                        \
+               bitcnt++;                                       \
+               s_val >>= 1;                                    \
+               if (val & 1) {                                  \
+                       s_one++;                                \
+                       s_val |= 0x80;                          \
+               } else {                                        \
+                       s_one = 0;                              \
+                       s_val &= 0x7f;                          \
+               }                                               \
+               if (bitcnt == 8) {                              \
+                       bcs->hw.tiger.sendbuf[s_cnt++] = s_val; \
+                       bitcnt = 0;                             \
+               }                                               \
+               if (s_one == 5) {                               \
+                       s_val >>= 1;                            \
+                       s_val &= 0x7f;                          \
+                       bitcnt++;                               \
+                       s_one = 0;                              \
+               }                                               \
+               if (bitcnt == 8) {                              \
+                       bcs->hw.tiger.sendbuf[s_cnt++] = s_val; \
+                       bitcnt = 0;                             \
+               }                                               \
+               val >>= 1;                                      \
+       }
 
 static int make_raw_data(struct BCState *bcs) {
 // this make_raw is for 64k
-       register u_int i,s_cnt=0;
+       register u_int i, s_cnt = 0;
        register u_char j;
        register u_char val;
        register u_char s_one = 0;
        register u_char s_val = 0;
        register u_char bitcnt = 0;
        u_int fcs;
-       
+
        if (!bcs->tx_skb) {
                debugl1(bcs->cs, "tiger make_raw: NULL skb");
-               return(1);
+               return (1);
        }
        bcs->hw.tiger.sendbuf[s_cnt++] = HDLC_FLAG_VALUE;
        fcs = PPP_INITFCS;
-       for (i=0; i<bcs->tx_skb->len; i++) {
+       for (i = 0; i < bcs->tx_skb->len; i++) {
                val = bcs->tx_skb->data[i];
-               fcs = PPP_FCS (fcs, val);
+               fcs = PPP_FCS(fcs, val);
                MAKE_RAW_BYTE;
        }
        fcs ^= 0xffff;
        val = fcs & 0xff;
        MAKE_RAW_BYTE;
-       val = (fcs>>8) & 0xff;
+       val = (fcs >> 8) & 0xff;
        MAKE_RAW_BYTE;
        val = HDLC_FLAG_VALUE;
-       for (j=0; j<8; j++) { 
+       for (j = 0; j < 8; j++) {
                bitcnt++;
                s_val >>= 1;
                if (val & 1)
                        s_val |= 0x80;
                else
                        s_val &= 0x7f;
-               if (bitcnt==8) {
+               if (bitcnt == 8) {
                        bcs->hw.tiger.sendbuf[s_cnt++] = s_val;
                        bitcnt = 0;
                }
                val >>= 1;
        }
        if (bcs->cs->debug & L1_DEB_HSCX)
-               debugl1(bcs->cs,"tiger make_raw: in %u out %d.%d",
+               debugl1(bcs->cs, "tiger make_raw: in %u out %d.%d",
                        bcs->tx_skb->len, s_cnt, bitcnt);
        if (bitcnt) {
-               while (8>bitcnt++) {
+               while (8 > bitcnt++) {
                        s_val >>= 1;
                        s_val |= 0x80;
                }
@@ -267,65 +267,65 @@ static int make_raw_data(struct BCState *bcs) {
        bcs->hw.tiger.sendcnt = s_cnt;
        bcs->tx_cnt -= bcs->tx_skb->len;
        bcs->hw.tiger.sp = bcs->hw.tiger.sendbuf;
-       return(0);
+       return (0);
 }
 
 // macro for 56k
 
-#define MAKE_RAW_BYTE_56K for (j=0; j<8; j++) { \
-                       bitcnt++;\
-                       s_val >>= 1;\
-                       if (val & 1) {\
-                               s_one++;\
-                               s_val |= 0x80;\
-                       } else {\
-                               s_one = 0;\
-                               s_val &= 0x7f;\
-                       }\
-                       if (bitcnt==7) {\
-                               s_val >>= 1;\
-                               s_val |= 0x80;\
-                               bcs->hw.tiger.sendbuf[s_cnt++] = s_val;\
-                               bitcnt = 0;\
-                       }\
-                       if (s_one == 5) {\
-                               s_val >>= 1;\
-                               s_val &= 0x7f;\
-                               bitcnt++;\
-                               s_one = 0;\
-                       }\
-                       if (bitcnt==7) {\
-                               s_val >>= 1;\
-                               s_val |= 0x80;\
-                               bcs->hw.tiger.sendbuf[s_cnt++] = s_val;\
-                               bitcnt = 0;\
-                       }\
-                       val >>= 1;\
-               }
+#define MAKE_RAW_BYTE_56K for (j = 0; j < 8; j++) {                    \
+               bitcnt++;                                       \
+               s_val >>= 1;                                    \
+               if (val & 1) {                                  \
+                       s_one++;                                \
+                       s_val |= 0x80;                          \
+               } else {                                        \
+                       s_one = 0;                              \
+                       s_val &= 0x7f;                          \
+               }                                               \
+               if (bitcnt == 7) {                              \
+                       s_val >>= 1;                            \
+                       s_val |= 0x80;                          \
+                       bcs->hw.tiger.sendbuf[s_cnt++] = s_val; \
+                       bitcnt = 0;                             \
+               }                                               \
+               if (s_one == 5) {                               \
+                       s_val >>= 1;                            \
+                       s_val &= 0x7f;                          \
+                       bitcnt++;                               \
+                       s_one = 0;                              \
+               }                                               \
+               if (bitcnt == 7) {                              \
+                       s_val >>= 1;                            \
+                       s_val |= 0x80;                          \
+                       bcs->hw.tiger.sendbuf[s_cnt++] = s_val; \
+                       bitcnt = 0;                             \
+               }                                               \
+               val >>= 1;                                      \
+       }
 
 static int make_raw_data_56k(struct BCState *bcs) {
 // this make_raw is for 56k
-       register u_int i,s_cnt=0;
+       register u_int i, s_cnt = 0;
        register u_char j;
        register u_char val;
        register u_char s_one = 0;
        register u_char s_val = 0;
        register u_char bitcnt = 0;
        u_int fcs;
-       
+
        if (!bcs->tx_skb) {
                debugl1(bcs->cs, "tiger make_raw_56k: NULL skb");
-               return(1);
+               return (1);
        }
        val = HDLC_FLAG_VALUE;
-       for (j=0; j<8; j++) { 
+       for (j = 0; j < 8; j++) {
                bitcnt++;
                s_val >>= 1;
                if (val & 1)
                        s_val |= 0x80;
                else
                        s_val &= 0x7f;
-               if (bitcnt==7) {
+               if (bitcnt == 7) {
                        s_val >>= 1;
                        s_val |= 0x80;
                        bcs->hw.tiger.sendbuf[s_cnt++] = s_val;
@@ -334,25 +334,25 @@ static int make_raw_data_56k(struct BCState *bcs) {
                val >>= 1;
        };
        fcs = PPP_INITFCS;
-       for (i=0; i<bcs->tx_skb->len; i++) {
+       for (i = 0; i < bcs->tx_skb->len; i++) {
                val = bcs->tx_skb->data[i];
-               fcs = PPP_FCS (fcs, val);
+               fcs = PPP_FCS(fcs, val);
                MAKE_RAW_BYTE_56K;
        }
        fcs ^= 0xffff;
        val = fcs & 0xff;
        MAKE_RAW_BYTE_56K;
-       val = (fcs>>8) & 0xff;
+       val = (fcs >> 8) & 0xff;
        MAKE_RAW_BYTE_56K;
        val = HDLC_FLAG_VALUE;
-       for (j=0; j<8; j++) { 
+       for (j = 0; j < 8; j++) {
                bitcnt++;
                s_val >>= 1;
                if (val & 1)
                        s_val |= 0x80;
                else
                        s_val &= 0x7f;
-               if (bitcnt==7) {
+               if (bitcnt == 7) {
                        s_val >>= 1;
                        s_val |= 0x80;
                        bcs->hw.tiger.sendbuf[s_cnt++] = s_val;
@@ -361,10 +361,10 @@ static int make_raw_data_56k(struct BCState *bcs) {
                val >>= 1;
        }
        if (bcs->cs->debug & L1_DEB_HSCX)
-               debugl1(bcs->cs,"tiger make_raw_56k: in %u out %d.%d",
+               debugl1(bcs->cs, "tiger make_raw_56k: in %u out %d.%d",
                        bcs->tx_skb->len, s_cnt, bitcnt);
        if (bitcnt) {
-               while (8>bitcnt++) {
+               while (8 > bitcnt++) {
                        s_val >>= 1;
                        s_val |= 0x80;
                }
@@ -374,12 +374,12 @@ static int make_raw_data_56k(struct BCState *bcs) {
        bcs->hw.tiger.sendcnt = s_cnt;
        bcs->tx_cnt -= bcs->tx_skb->len;
        bcs->hw.tiger.sp = bcs->hw.tiger.sendbuf;
-       return(0);
+       return (0);
 }
 
 static void got_frame(struct BCState *bcs, int count) {
        struct sk_buff *skb;
-               
+
        if (!(skb = dev_alloc_skb(count)))
                printk(KERN_WARNING "TIGER: receive out of memory\n");
        else {
@@ -388,18 +388,18 @@ static void got_frame(struct BCState *bcs, int count) {
        }
        test_and_set_bit(B_RCVBUFREADY, &bcs->event);
        schedule_work(&bcs->tqueue);
-       
+
        if (bcs->cs->debug & L1_DEB_RECEIVE_FRAME)
                printframe(bcs->cs, bcs->hw.tiger.rcvbuf, count, "rec");
 }
 
 
 
-static void read_raw(struct BCState *bcs, u_int *buf, int cnt){
+static void read_raw(struct BCState *bcs, u_int *buf, int cnt) {
        int i;
        register u_char j;
        register u_char val;
-       u_int  *pend = bcs->hw.tiger.rec +NETJET_DMA_RXSIZE -1;
+       u_int *pend = bcs->hw.tiger.rec + NETJET_DMA_RXSIZE - 1;
        register u_char state = bcs->hw.tiger.r_state;
        register u_char r_one = bcs->hw.tiger.r_one;
        register u_char r_val = bcs->hw.tiger.r_val;
@@ -408,7 +408,7 @@ static void read_raw(struct BCState *bcs, u_int *buf, int cnt){
        int bits;
        u_char mask;
 
-        if (bcs->mode == L1_MODE_HDLC) { // it's 64k
+       if (bcs->mode == L1_MODE_HDLC) { // it's 64k
                mask = 0xff;
                bits = 8;
        }
@@ -416,8 +416,8 @@ static void read_raw(struct BCState *bcs, u_int *buf, int cnt){
                mask = 0x7f;
                bits = 7;
        };
-       for (i=0;i<cnt;i++) {
-               val = bcs->channel ? ((*p>>8) & 0xff) : (*p & 0xff);
+       for (i = 0; i < cnt; i++) {
+               val = bcs->channel ? ((*p >> 8) & 0xff) : (*p & 0xff);
                p++;
                if (p > pend)
                        p = bcs->hw.tiger.rec;
@@ -428,137 +428,137 @@ static void read_raw(struct BCState *bcs, u_int *buf, int cnt){
                        r_one = 0;
                        continue;
                }
-               for (j=0;j<bits;j++) {
+               for (j = 0; j < bits; j++) {
                        if (state == HDLC_ZERO_SEARCH) {
                                if (val & 1) {
                                        r_one++;
                                } else {
-                                       r_one=0;
-                                       state= HDLC_FLAG_SEARCH;
+                                       r_one = 0;
+                                       state = HDLC_FLAG_SEARCH;
                                        if (bcs->cs->debug & L1_DEB_HSCX)
-                                               debugl1(bcs->cs,"tiger read_raw: zBit(%d,%d,%d) %x",
-                                                       bcs->hw.tiger.r_tot,i,j,val);
+                                               debugl1(bcs->cs, "tiger read_raw: zBit(%d,%d,%d) %x",
+                                                       bcs->hw.tiger.r_tot, i, j, val);
                                }
-                       } else if (state == HDLC_FLAG_SEARCH) { 
+                       } else if (state == HDLC_FLAG_SEARCH) {
                                if (val & 1) {
                                        r_one++;
-                                       if (r_one>6) {
-                                               state=HDLC_ZERO_SEARCH;
+                                       if (r_one > 6) {
+                                               state = HDLC_ZERO_SEARCH;
                                        }
                                } else {
-                                       if (r_one==6) {
-                                               bitcnt=0;
-                                               r_val=0;
-                                               state=HDLC_FLAG_FOUND;
+                                       if (r_one == 6) {
+                                               bitcnt = 0;
+                                               r_val = 0;
+                                               state = HDLC_FLAG_FOUND;
                                                if (bcs->cs->debug & L1_DEB_HSCX)
-                                                       debugl1(bcs->cs,"tiger read_raw: flag(%d,%d,%d) %x",
-                                                               bcs->hw.tiger.r_tot,i,j,val);
+                                                       debugl1(bcs->cs, "tiger read_raw: flag(%d,%d,%d) %x",
+                                                               bcs->hw.tiger.r_tot, i, j, val);
                                        }
-                                       r_one=0;
+                                       r_one = 0;
                                }
-                       } else if (state ==  HDLC_FLAG_FOUND) {
+                       } else if (state == HDLC_FLAG_FOUND) {
                                if (val & 1) {
                                        r_one++;
-                                       if (r_one>6) {
-                                               state=HDLC_ZERO_SEARCH;
+                                       if (r_one > 6) {
+                                               state = HDLC_ZERO_SEARCH;
                                        } else {
                                                r_val >>= 1;
                                                r_val |= 0x80;
                                                bitcnt++;
                                        }
                                } else {
-                                       if (r_one==6) {
-                                               bitcnt=0;
-                                               r_val=0;
-                                               r_one=0;
+                                       if (r_one == 6) {
+                                               bitcnt = 0;
+                                               r_val = 0;
+                                               r_one = 0;
                                                val >>= 1;
                                                continue;
-                                       } else if (r_one!=5) {
+                                       } else if (r_one != 5) {
                                                r_val >>= 1;
                                                r_val &= 0x7f;
                                                bitcnt++;
                                        }
-                                       r_one=0;        
+                                       r_one = 0;
                                }
                                if ((state != HDLC_ZERO_SEARCH) &&
-                                       !(bitcnt & 7)) {
-                                       state=HDLC_FRAME_FOUND;
+                                   !(bitcnt & 7)) {
+                                       state = HDLC_FRAME_FOUND;
                                        bcs->hw.tiger.r_fcs = PPP_INITFCS;
                                        bcs->hw.tiger.rcvbuf[0] = r_val;
-                                       bcs->hw.tiger.r_fcs = PPP_FCS (bcs->hw.tiger.r_fcs, r_val);
+                                       bcs->hw.tiger.r_fcs = PPP_FCS(bcs->hw.tiger.r_fcs, r_val);
                                        if (bcs->cs->debug & L1_DEB_HSCX)
-                                               debugl1(bcs->cs,"tiger read_raw: byte1(%d,%d,%d) rval %x val %x i %x",
-                                                       bcs->hw.tiger.r_tot,i,j,r_val,val,
+                                               debugl1(bcs->cs, "tiger read_raw: byte1(%d,%d,%d) rval %x val %x i %x",
+                                                       bcs->hw.tiger.r_tot, i, j, r_val, val,
                                                        bcs->cs->hw.njet.irqstat0);
                                }
                        } else if (state ==  HDLC_FRAME_FOUND) {
                                if (val & 1) {
                                        r_one++;
-                                       if (r_one>6) {
-                                               state=HDLC_ZERO_SEARCH;
-                                               bitcnt=0;
+                                       if (r_one > 6) {
+                                               state = HDLC_ZERO_SEARCH;
+                                               bitcnt = 0;
                                        } else {
                                                r_val >>= 1;
                                                r_val |= 0x80;
                                                bitcnt++;
                                        }
                                } else {
-                                       if (r_one==6) {
-                                               r_val=0; 
-                                               r_one=0;
+                                       if (r_one == 6) {
+                                               r_val = 0;
+                                               r_one = 0;
                                                bitcnt++;
                                                if (bitcnt & 7) {
                                                        debugl1(bcs->cs, "tiger: frame not byte aligned");
-                                                       state=HDLC_FLAG_SEARCH;
+                                                       state = HDLC_FLAG_SEARCH;
                                                        bcs->hw.tiger.r_err++;
 #ifdef ERROR_STATISTIC
                                                        bcs->err_inv++;
 #endif
                                                } else {
                                                        if (bcs->cs->debug & L1_DEB_HSCX)
-                                                               debugl1(bcs->cs,"tiger frame end(%d,%d): fcs(%x) i %x",
-                                                                       i,j,bcs->hw.tiger.r_fcs, bcs->cs->hw.njet.irqstat0);
+                                                               debugl1(bcs->cs, "tiger frame end(%d,%d): fcs(%x) i %x",
+                                                                       i, j, bcs->hw.tiger.r_fcs, bcs->cs->hw.njet.irqstat0);
                                                        if (bcs->hw.tiger.r_fcs == PPP_GOODFCS) {
-                                                               got_frame(bcs, (bitcnt>>3)-3);
+                                                               got_frame(bcs, (bitcnt >> 3) - 3);
                                                        } else {
                                                                if (bcs->cs->debug) {
                                                                        debugl1(bcs->cs, "tiger FCS error");
                                                                        printframe(bcs->cs, bcs->hw.tiger.rcvbuf,
-                                                                               (bitcnt>>3)-1, "rec");
+                                                                                  (bitcnt >> 3) - 1, "rec");
                                                                        bcs->hw.tiger.r_err++;
                                                                }
 #ifdef ERROR_STATISTIC
-                                                       bcs->err_crc++;
+                                                               bcs->err_crc++;
 #endif
                                                        }
-                                                       state=HDLC_FLAG_FOUND;
+                                                       state = HDLC_FLAG_FOUND;
                                                }
-                                               bitcnt=0;
-                                       } else if (r_one==5) {
+                                               bitcnt = 0;
+                                       } else if (r_one == 5) {
                                                val >>= 1;
-                                               r_one=0;
+                                               r_one = 0;
                                                continue;
                                        } else {
                                                r_val >>= 1;
                                                r_val &= 0x7f;
                                                bitcnt++;
                                        }
-                                       r_one=0;        
+                                       r_one = 0;
                                }
                                if ((state == HDLC_FRAME_FOUND) &&
-                                       !(bitcnt & 7)) {
-                                       if ((bitcnt>>3)>=HSCX_BUFMAX) {
+                                   !(bitcnt & 7)) {
+                                       if ((bitcnt >> 3) >= HSCX_BUFMAX) {
                                                debugl1(bcs->cs, "tiger: frame too big");
-                                               r_val=0; 
-                                               state=HDLC_FLAG_SEARCH;
+                                               r_val = 0;
+                                               state = HDLC_FLAG_SEARCH;
                                                bcs->hw.tiger.r_err++;
 #ifdef ERROR_STATISTIC
                                                bcs->err_inv++;
 #endif
                                        } else {
-                                               bcs->hw.tiger.rcvbuf[(bitcnt>>3)-1] = r_val;
-                                               bcs->hw.tiger.r_fcs = 
-                                                       PPP_FCS (bcs->hw.tiger.r_fcs, r_val);
+                                               bcs->hw.tiger.rcvbuf[(bitcnt >> 3) - 1] = r_val;
+                                               bcs->hw.tiger.r_fcs =
+                                                       PPP_FCS(bcs->hw.tiger.r_fcs, r_val);
                                        }
                                }
                        }
@@ -574,10 +574,10 @@ static void read_raw(struct BCState *bcs, u_int *buf, int cnt){
 
 void read_tiger(struct IsdnCardState *cs) {
        u_int *p;
-       int cnt = NETJET_DMA_RXSIZE/2;
-       
+       int cnt = NETJET_DMA_RXSIZE / 2;
+
        if ((cs->hw.njet.irqstat0 & cs->hw.njet.last_is0) & NETJET_IRQM0_READ) {
-               debugl1(cs,"tiger warn read double dma %x/%x",
+               debugl1(cs, "tiger warn read double dma %x/%x",
                        cs->hw.njet.irqstat0, cs->hw.njet.last_is0);
 #ifdef ERROR_STATISTIC
                if (cs->bcs[0].mode)
@@ -589,7 +589,7 @@ void read_tiger(struct IsdnCardState *cs) {
        } else {
                cs->hw.njet.last_is0 &= ~NETJET_IRQM0_READ;
                cs->hw.njet.last_is0 |= (cs->hw.njet.irqstat0 & NETJET_IRQM0_READ);
-       }       
+       }
        if (cs->hw.njet.irqstat0 & NETJET_IRQM0_READ_1)
                p = cs->bcs[0].hw.tiger.rec + NETJET_DMA_RXSIZE - 1;
        else
@@ -612,20 +612,20 @@ void netjet_fill_dma(struct BCState *bcs)
        if (!bcs->tx_skb)
                return;
        if (bcs->cs->debug & L1_DEB_HSCX)
-               debugl1(bcs->cs,"tiger fill_dma1: c%d %4lx", bcs->channel,
+               debugl1(bcs->cs, "tiger fill_dma1: c%d %4lx", bcs->channel,
                        bcs->Flag);
        if (test_and_set_bit(BC_FLG_BUSY, &bcs->Flag))
                return;
        if (bcs->mode == L1_MODE_HDLC) { // it's 64k
                if (make_raw_data(bcs))
-                       return;         
+                       return;
        }
        else { // it's 56k
                if (make_raw_data_56k(bcs))
-                       return;         
+                       return;
        };
        if (bcs->cs->debug & L1_DEB_HSCX)
-               debugl1(bcs->cs,"tiger fill_dma2: c%d %4lx", bcs->channel,
+               debugl1(bcs->cs, "tiger fill_dma2: c%d %4lx", bcs->channel,
                        bcs->Flag);
        if (test_and_clear_bit(BC_FLG_NOFRAME, &bcs->Flag)) {
                write_raw(bcs, bcs->hw.tiger.sendp, bcs->hw.tiger.free);
@@ -633,11 +633,11 @@ void netjet_fill_dma(struct BCState *bcs)
                p = bus_to_virt(inl(bcs->cs->hw.njet.base + NETJET_DMA_READ_ADR));
                sp = bcs->hw.tiger.sendp;
                if (p == bcs->hw.tiger.s_end)
-                       p = bcs->hw.tiger.send -1;
+                       p = bcs->hw.tiger.send - 1;
                if (sp == bcs->hw.tiger.s_end)
-                       sp = bcs->hw.tiger.send -1;
+                       sp = bcs->hw.tiger.send - 1;
                cnt = p - sp;
-               if (cnt <0) {
+               if (cnt < 0) {
                        write_raw(bcs, bcs->hw.tiger.sendp, bcs->hw.tiger.free);
                } else {
                        p++;
@@ -655,30 +655,30 @@ void netjet_fill_dma(struct BCState *bcs)
                cnt = bcs->hw.tiger.s_end - p;
                if (cnt < 2) {
                        p = bcs->hw.tiger.send + 1;
-                       cnt = NETJET_DMA_TXSIZE/2 - 2;
+                       cnt = NETJET_DMA_TXSIZE / 2 - 2;
                } else {
                        p++;
                        p++;
-                       if (cnt <= (NETJET_DMA_TXSIZE/2))
-                               cnt += NETJET_DMA_TXSIZE/2;
+                       if (cnt <= (NETJET_DMA_TXSIZE / 2))
+                               cnt += NETJET_DMA_TXSIZE / 2;
                        cnt--;
                        cnt--;
                }
                write_raw(bcs, p, cnt);
        }
        if (bcs->cs->debug & L1_DEB_HSCX)
-               debugl1(bcs->cs,"tiger fill_dma3: c%d %4lx", bcs->channel,
+               debugl1(bcs->cs, "tiger fill_dma3: c%d %4lx", bcs->channel,
                        bcs->Flag);
 }
 
 static void write_raw(struct BCState *bcs, u_int *buf, int cnt) {
-       u_int mask, val, *p=buf;
+       u_int mask, val, *p = buf;
        u_int i, s_cnt;
-        
-        if (cnt <= 0)
-               return;
+
+       if (cnt <= 0)
+               return;
        if (test_bit(BC_FLG_BUSY, &bcs->Flag)) {
-               if (bcs->hw.tiger.sendcnt> cnt) {
+               if (bcs->hw.tiger.sendcnt > cnt) {
                        s_cnt = cnt;
                        bcs->hw.tiger.sendcnt -= cnt;
                } else {
@@ -689,17 +689,17 @@ static void write_raw(struct BCState *bcs, u_int *buf, int cnt) {
                        mask = 0xffff00ff;
                else
                        mask = 0xffffff00;
-               for (i=0; i<s_cnt; i++) {
-                       val = bcs->channel ? ((bcs->hw.tiger.sp[i] <<8) & 0xff00) :
+               for (i = 0; i < s_cnt; i++) {
+                       val = bcs->channel ? ((bcs->hw.tiger.sp[i] << 8) & 0xff00) :
                                (bcs->hw.tiger.sp[i]);
-                       *p   &= mask;
+                       *p &= mask;
                        *p++ |= val;
-                       if (p>bcs->hw.tiger.s_end)
+                       if (p > bcs->hw.tiger.s_end)
                                p = bcs->hw.tiger.send;
                }
                bcs->hw.tiger.s_tot += s_cnt;
                if (bcs->cs->debug & L1_DEB_HSCX)
-                       debugl1(bcs->cs,"tiger write_raw: c%d %p-%p %d/%d %d %x", bcs->channel,
+                       debugl1(bcs->cs, "tiger write_raw: c%d %p-%p %d/%d %d %x", bcs->channel,
                                buf, p, s_cnt, cnt,
                                bcs->hw.tiger.sendcnt, bcs->cs->hw.njet.irqstat0);
                if (bcs->cs->debug & L1_DEB_HSCX_FIFO)
@@ -708,10 +708,10 @@ static void write_raw(struct BCState *bcs, u_int *buf, int cnt) {
                bcs->hw.tiger.sendp = p;
                if (!bcs->hw.tiger.sendcnt) {
                        if (!bcs->tx_skb) {
-                               debugl1(bcs->cs,"tiger write_raw: NULL skb s_cnt %d", s_cnt);
+                               debugl1(bcs->cs, "tiger write_raw: NULL skb s_cnt %d", s_cnt);
                        } else {
-                               if (test_bit(FLG_LLI_L1WAKEUP,&bcs->st->lli.flag) &&
-                                       (PACKET_NOACK != bcs->tx_skb->pkt_type)) {
+                               if (test_bit(FLG_LLI_L1WAKEUP, &bcs->st->lli.flag) &&
+                                   (PACKET_NOACK != bcs->tx_skb->pkt_type)) {
                                        u_long  flags;
                                        spin_lock_irqsave(&bcs->aclock, flags);
                                        bcs->ackcnt += bcs->tx_skb->len;
@@ -723,7 +723,7 @@ static void write_raw(struct BCState *bcs, u_int *buf, int cnt) {
                        }
                        test_and_clear_bit(BC_FLG_BUSY, &bcs->Flag);
                        bcs->hw.tiger.free = cnt - s_cnt;
-                       if (bcs->hw.tiger.free > (NETJET_DMA_TXSIZE/2))
+                       if (bcs->hw.tiger.free > (NETJET_DMA_TXSIZE / 2))
                                test_and_set_bit(BC_FLG_HALF, &bcs->Flag);
                        else {
                                test_and_clear_bit(BC_FLG_HALF, &bcs->Flag);
@@ -734,9 +734,9 @@ static void write_raw(struct BCState *bcs, u_int *buf, int cnt) {
                        } else {
                                mask ^= 0xffffffff;
                                if (s_cnt < cnt) {
-                                       for (i=s_cnt; i<cnt;i++) {
+                                       for (i = s_cnt; i < cnt; i++) {
                                                *p++ |= mask;
-                                               if (p>bcs->hw.tiger.s_end)
+                                               if (p > bcs->hw.tiger.s_end)
                                                        p = bcs->hw.tiger.send;
                                        }
                                        if (bcs->cs->debug & L1_DEB_HSCX)
@@ -752,20 +752,20 @@ static void write_raw(struct BCState *bcs, u_int *buf, int cnt) {
                fill_mem(bcs, buf, cnt, bcs->channel, 0xff);
                bcs->hw.tiger.free += cnt;
                if (bcs->cs->debug & L1_DEB_HSCX)
-                       debugl1(bcs->cs,"tiger write_raw: fill half");
+                       debugl1(bcs->cs, "tiger write_raw: fill half");
        } else if (test_and_clear_bit(BC_FLG_HALF, &bcs->Flag)) {
                test_and_set_bit(BC_FLG_EMPTY, &bcs->Flag);
                fill_mem(bcs, buf, cnt, bcs->channel, 0xff);
                if (bcs->cs->debug & L1_DEB_HSCX)
-                       debugl1(bcs->cs,"tiger write_raw: fill full");
+                       debugl1(bcs->cs, "tiger write_raw: fill full");
        }
 }
 
 void write_tiger(struct IsdnCardState *cs) {
-       u_int *p, cnt = NETJET_DMA_TXSIZE/2;
-       
+       u_int *p, cnt = NETJET_DMA_TXSIZE / 2;
+
        if ((cs->hw.njet.irqstat0 & cs->hw.njet.last_is0) & NETJET_IRQM0_WRITE) {
-               debugl1(cs,"tiger warn write double dma %x/%x",
+               debugl1(cs, "tiger warn write double dma %x/%x",
                        cs->hw.njet.irqstat0, cs->hw.njet.last_is0);
 #ifdef ERROR_STATISTIC
                if (cs->bcs[0].mode)
@@ -777,7 +777,7 @@ void write_tiger(struct IsdnCardState *cs) {
        } else {
                cs->hw.njet.last_is0 &= ~NETJET_IRQM0_WRITE;
                cs->hw.njet.last_is0 |= (cs->hw.njet.irqstat0 & NETJET_IRQM0_WRITE);
-       }       
+       }
        if (cs->hw.njet.irqstat0  & NETJET_IRQM0_WRITE_1)
                p = cs->bcs[0].hw.tiger.send + NETJET_DMA_TXSIZE - 1;
        else
@@ -797,55 +797,55 @@ tiger_l2l1(struct PStack *st, int pr, void *arg)
        u_long flags;
 
        switch (pr) {
-               case (PH_DATA | REQUEST):
-                       spin_lock_irqsave(&bcs->cs->lock, flags);
-                       if (bcs->tx_skb) {
-                               skb_queue_tail(&bcs->squeue, skb);
-                       } else {
-                               bcs->tx_skb = skb;
-                               bcs->cs->BC_Send_Data(bcs);
-                       }
-                       spin_unlock_irqrestore(&bcs->cs->lock, flags);
-                       break;
-               case (PH_PULL | INDICATION):
-                       spin_lock_irqsave(&bcs->cs->lock, flags);
-                       if (bcs->tx_skb) {
-                               printk(KERN_WARNING "tiger_l2l1: this shouldn't happen\n");
-                       } else {
-                               bcs->tx_skb = skb;
-                               bcs->cs->BC_Send_Data(bcs);
-                       }
-                       spin_unlock_irqrestore(&bcs->cs->lock, flags);
-                       break;
-               case (PH_PULL | REQUEST):
-                       if (!bcs->tx_skb) {
-                               test_and_clear_bit(FLG_L1_PULL_REQ, &st->l1.Flags);
-                               st->l1.l1l2(st, PH_PULL | CONFIRM, NULL);
-                       } else
-                               test_and_set_bit(FLG_L1_PULL_REQ, &st->l1.Flags);
-                       break;
-               case (PH_ACTIVATE | REQUEST):
-                       spin_lock_irqsave(&bcs->cs->lock, flags);
-                       test_and_set_bit(BC_FLG_ACTIV, &bcs->Flag);
-                       mode_tiger(bcs, st->l1.mode, st->l1.bc);
-                       /* 2001/10/04 Christoph Ersfeld, Formula-n Europe AG */
-                       spin_unlock_irqrestore(&bcs->cs->lock, flags);
-                       bcs->cs->cardmsg(bcs->cs, MDL_BC_ASSIGN, (void *)(&st->l1.bc));
-                       l1_msg_b(st, pr, arg);
-                       break;
-               case (PH_DEACTIVATE | REQUEST):
-                       /* 2001/10/04 Christoph Ersfeld, Formula-n Europe AG */
-                       bcs->cs->cardmsg(bcs->cs, MDL_BC_RELEASE, (void *)(&st->l1.bc));
-                       l1_msg_b(st, pr, arg);
-                       break;
-               case (PH_DEACTIVATE | CONFIRM):
-                       spin_lock_irqsave(&bcs->cs->lock, flags);
-                       test_and_clear_bit(BC_FLG_ACTIV, &bcs->Flag);
-                       test_and_clear_bit(BC_FLG_BUSY, &bcs->Flag);
-                       mode_tiger(bcs, 0, st->l1.bc);
-                       spin_unlock_irqrestore(&bcs->cs->lock, flags);
-                       st->l1.l1l2(st, PH_DEACTIVATE | CONFIRM, NULL);
-                       break;
+       case (PH_DATA | REQUEST):
+               spin_lock_irqsave(&bcs->cs->lock, flags);
+               if (bcs->tx_skb) {
+                       skb_queue_tail(&bcs->squeue, skb);
+               } else {
+                       bcs->tx_skb = skb;
+                       bcs->cs->BC_Send_Data(bcs);
+               }
+               spin_unlock_irqrestore(&bcs->cs->lock, flags);
+               break;
+       case (PH_PULL | INDICATION):
+               spin_lock_irqsave(&bcs->cs->lock, flags);
+               if (bcs->tx_skb) {
+                       printk(KERN_WARNING "tiger_l2l1: this shouldn't happen\n");
+               } else {
+                       bcs->tx_skb = skb;
+                       bcs->cs->BC_Send_Data(bcs);
+               }
+               spin_unlock_irqrestore(&bcs->cs->lock, flags);
+               break;
+       case (PH_PULL | REQUEST):
+               if (!bcs->tx_skb) {
+                       test_and_clear_bit(FLG_L1_PULL_REQ, &st->l1.Flags);
+                       st->l1.l1l2(st, PH_PULL | CONFIRM, NULL);
+               } else
+                       test_and_set_bit(FLG_L1_PULL_REQ, &st->l1.Flags);
+               break;
+       case (PH_ACTIVATE | REQUEST):
+               spin_lock_irqsave(&bcs->cs->lock, flags);
+               test_and_set_bit(BC_FLG_ACTIV, &bcs->Flag);
+               mode_tiger(bcs, st->l1.mode, st->l1.bc);
+               /* 2001/10/04 Christoph Ersfeld, Formula-n Europe AG */
+               spin_unlock_irqrestore(&bcs->cs->lock, flags);
+               bcs->cs->cardmsg(bcs->cs, MDL_BC_ASSIGN, (void *)(&st->l1.bc));
+               l1_msg_b(st, pr, arg);
+               break;
+       case (PH_DEACTIVATE | REQUEST):
+               /* 2001/10/04 Christoph Ersfeld, Formula-n Europe AG */
+               bcs->cs->cardmsg(bcs->cs, MDL_BC_RELEASE, (void *)(&st->l1.bc));
+               l1_msg_b(st, pr, arg);
+               break;
+       case (PH_DEACTIVATE | CONFIRM):
+               spin_lock_irqsave(&bcs->cs->lock, flags);
+               test_and_clear_bit(BC_FLG_ACTIV, &bcs->Flag);
+               test_and_clear_bit(BC_FLG_BUSY, &bcs->Flag);
+               mode_tiger(bcs, 0, st->l1.bc);
+               spin_unlock_irqrestore(&bcs->cs->lock, flags);
+               st->l1.l1l2(st, PH_DEACTIVATE | CONFIRM, NULL);
+               break;
        }
 }
 
@@ -908,33 +908,33 @@ setstack_tiger(struct PStack *st, struct BCState *bcs)
        return (0);
 }
 
+
 void
 inittiger(struct IsdnCardState *cs)
 {
        if (!(cs->bcs[0].hw.tiger.send = kmalloc(NETJET_DMA_TXSIZE * sizeof(unsigned int),
-               GFP_KERNEL | GFP_DMA))) {
+                                                GFP_KERNEL | GFP_DMA))) {
                printk(KERN_WARNING
                       "HiSax: No memory for tiger.send\n");
                return;
        }
-       cs->bcs[0].hw.tiger.s_irq = cs->bcs[0].hw.tiger.send + NETJET_DMA_TXSIZE/2 - 1;
+       cs->bcs[0].hw.tiger.s_irq = cs->bcs[0].hw.tiger.send + NETJET_DMA_TXSIZE / 2 - 1;
        cs->bcs[0].hw.tiger.s_end = cs->bcs[0].hw.tiger.send + NETJET_DMA_TXSIZE - 1;
        cs->bcs[1].hw.tiger.send = cs->bcs[0].hw.tiger.send;
        cs->bcs[1].hw.tiger.s_irq = cs->bcs[0].hw.tiger.s_irq;
        cs->bcs[1].hw.tiger.s_end = cs->bcs[0].hw.tiger.s_end;
-       
+
        memset(cs->bcs[0].hw.tiger.send, 0xff, NETJET_DMA_TXSIZE * sizeof(unsigned int));
        debugl1(cs, "tiger: send buf %p - %p", cs->bcs[0].hw.tiger.send,
                cs->bcs[0].hw.tiger.send + NETJET_DMA_TXSIZE - 1);
        outl(virt_to_bus(cs->bcs[0].hw.tiger.send),
-               cs->hw.njet.base + NETJET_DMA_READ_START);
+            cs->hw.njet.base + NETJET_DMA_READ_START);
        outl(virt_to_bus(cs->bcs[0].hw.tiger.s_irq),
-               cs->hw.njet.base + NETJET_DMA_READ_IRQ);
+            cs->hw.njet.base + NETJET_DMA_READ_IRQ);
        outl(virt_to_bus(cs->bcs[0].hw.tiger.s_end),
-               cs->hw.njet.base + NETJET_DMA_READ_END);
+            cs->hw.njet.base + NETJET_DMA_READ_END);
        if (!(cs->bcs[0].hw.tiger.rec = kmalloc(NETJET_DMA_RXSIZE * sizeof(unsigned int),
-               GFP_KERNEL | GFP_DMA))) {
+                                               GFP_KERNEL | GFP_DMA))) {
                printk(KERN_WARNING
                       "HiSax: No memory for tiger.rec\n");
                return;
@@ -944,11 +944,11 @@ inittiger(struct IsdnCardState *cs)
        cs->bcs[1].hw.tiger.rec = cs->bcs[0].hw.tiger.rec;
        memset(cs->bcs[0].hw.tiger.rec, 0xff, NETJET_DMA_RXSIZE * sizeof(unsigned int));
        outl(virt_to_bus(cs->bcs[0].hw.tiger.rec),
-               cs->hw.njet.base + NETJET_DMA_WRITE_START);
-       outl(virt_to_bus(cs->bcs[0].hw.tiger.rec + NETJET_DMA_RXSIZE/2 - 1),
-               cs->hw.njet.base + NETJET_DMA_WRITE_IRQ);
+            cs->hw.njet.base + NETJET_DMA_WRITE_START);
+       outl(virt_to_bus(cs->bcs[0].hw.tiger.rec + NETJET_DMA_RXSIZE / 2 - 1),
+            cs->hw.njet.base + NETJET_DMA_WRITE_IRQ);
        outl(virt_to_bus(cs->bcs[0].hw.tiger.rec + NETJET_DMA_RXSIZE - 1),
-               cs->hw.njet.base + NETJET_DMA_WRITE_END);
+            cs->hw.njet.base + NETJET_DMA_WRITE_END);
        debugl1(cs, "tiger: dmacfg  %x/%x  pulse=%d",
                inl(cs->hw.njet.base + NETJET_DMA_WRITE_ADR),
                inl(cs->hw.njet.base + NETJET_DMA_READ_ADR),
@@ -979,4 +979,3 @@ release_io_netjet(struct IsdnCardState *cs)
        releasetiger(cs);
        release_region(cs->hw.njet.base, 256);
 }
-
index 68e504d..70590d5 100644 (file)
@@ -6,13 +6,13 @@
  * Copyright    by Karsten Keil      <keil@isdn4linux.de>
  *              by Matt Henderson,
  *                 Traverse Technologies P/L www.traverse.com.au
- * 
+ *
  * This software may be used and distributed according to the terms
  * of the GNU General Public License, incorporated herein by reference.
  *
  */
 
-#define byteout(addr,val) outb(val,addr)
+#define byteout(addr, val) outb(val, addr)
 #define bytein(addr) inb(addr)
 
 #define NETJET_CTRL    0x00
@@ -67,4 +67,3 @@ void netjet_fill_dma(struct BCState *bcs);
 void netjet_interrupt(int intno, void *dev_id);
 void inittiger(struct IsdnCardState *cs);
 void release_io_netjet(struct IsdnCardState *cs);
-
index ccaa6e1..6569e03 100644 (file)
@@ -5,10 +5,10 @@
  *
  * Author       Karsten Keil
  * Copyright    by Karsten Keil      <keil@isdn4linux.de>
- * 
+ *
  * This software may be used and distributed according to the terms
  * of the GNU General Public License, incorporated herein by reference.
- * 
+ *
  * Thanks to Dr. Neuhaus and SAGEM for information
  *
  */
@@ -23,7 +23,7 @@
 
 static const char *niccy_revision = "$Revision: 1.21.2.4 $";
 
-#define byteout(addr,val) outb(val,addr)
+#define byteout(addr, val) outb(val, addr)
 #define bytein(addr) inb(addr)
 
 #define ISAC_PCI_DATA  0
@@ -53,21 +53,21 @@ static inline u_char readreg(unsigned int ale, unsigned int adr, u_char off)
 }
 
 static inline void readfifo(unsigned int ale, unsigned int adr, u_char off,
-               u_char *data, int size)
+                           u_char *data, int size)
 {
        byteout(ale, off);
        insb(adr, data, size);
 }
 
 static inline void writereg(unsigned int ale, unsigned int adr, u_char off,
-               u_char data)
+                           u_char data)
 {
        byteout(ale, off);
        byteout(adr, data);
 }
 
 static inline void writefifo(unsigned int ale, unsigned int adr, u_char off,
-               u_char *data, int size)
+                            u_char *data, int size)
 {
        byteout(ale, off);
        outsb(adr, data, size);
@@ -85,12 +85,12 @@ static void WriteISAC(struct IsdnCardState *cs, u_char offset, u_char value)
        writereg(cs->hw.niccy.isac_ale, cs->hw.niccy.isac, offset, value);
 }
 
-static void ReadISACfifo(struct IsdnCardState *cs, u_char * data, int size)
+static void ReadISACfifo(struct IsdnCardState *cs, u_char *data, int size)
 {
        readfifo(cs->hw.niccy.isac_ale, cs->hw.niccy.isac, 0, data, size);
 }
 
-static void WriteISACfifo(struct IsdnCardState *cs, u_char * data, int size)
+static void WriteISACfifo(struct IsdnCardState *cs, u_char *data, int size)
 {
        writefifo(cs->hw.niccy.isac_ale, cs->hw.niccy.isac, 0, data, size);
 }
@@ -98,26 +98,26 @@ static void WriteISACfifo(struct IsdnCardState *cs, u_char * data, int size)
 static u_char ReadHSCX(struct IsdnCardState *cs, int hscx, u_char offset)
 {
        return readreg(cs->hw.niccy.hscx_ale,
-                       cs->hw.niccy.hscx, offset + (hscx ? 0x40 : 0));
+                      cs->hw.niccy.hscx, offset + (hscx ? 0x40 : 0));
 }
 
 static void WriteHSCX(struct IsdnCardState *cs, int hscx, u_char offset,
-               u_char value)
+                     u_char value)
 {
        writereg(cs->hw.niccy.hscx_ale,
                 cs->hw.niccy.hscx, offset + (hscx ? 0x40 : 0), value);
 }
 
-#define READHSCX(cs, nr, reg) readreg(cs->hw.niccy.hscx_ale, \
-               cs->hw.niccy.hscx, reg + (nr ? 0x40 : 0))
-#define WRITEHSCX(cs, nr, reg, data) writereg(cs->hw.niccy.hscx_ale, \
-               cs->hw.niccy.hscx, reg + (nr ? 0x40 : 0), data)
+#define READHSCX(cs, nr, reg) readreg(cs->hw.niccy.hscx_ale,           \
+                                     cs->hw.niccy.hscx, reg + (nr ? 0x40 : 0))
+#define WRITEHSCX(cs, nr, reg, data) writereg(cs->hw.niccy.hscx_ale,   \
+                                             cs->hw.niccy.hscx, reg + (nr ? 0x40 : 0), data)
 
-#define READHSCXFIFO(cs, nr, ptr, cnt) readfifo(cs->hw.niccy.hscx_ale, \
-               cs->hw.niccy.hscx, (nr ? 0x40 : 0), ptr, cnt)
+#define READHSCXFIFO(cs, nr, ptr, cnt) readfifo(cs->hw.niccy.hscx_ale, \
+                                               cs->hw.niccy.hscx, (nr ? 0x40 : 0), ptr, cnt)
 
 #define WRITEHSCXFIFO(cs, nr, ptr, cnt) writefifo(cs->hw.niccy.hscx_ale, \
-               cs->hw.niccy.hscx, (nr ? 0x40 : 0), ptr, cnt)
+                                                 cs->hw.niccy.hscx, (nr ? 0x40 : 0), ptr, cnt)
 
 #include "hscx_irq.c"
 
@@ -138,7 +138,7 @@ static irqreturn_t niccy_interrupt(int intno, void *dev_id)
                outl(ival, cs->hw.niccy.cfg_reg + PCI_IRQ_CTRL_REG);
        }
        val = readreg(cs->hw.niccy.hscx_ale, cs->hw.niccy.hscx,
-                       HSCX_ISTA + 0x40);
+                     HSCX_ISTA + 0x40);
 Start_HSCX:
        if (val)
                hscx_int_main(cs, val);
@@ -147,7 +147,7 @@ Start_ISAC:
        if (val)
                isac_interrupt(cs, val);
        val = readreg(cs->hw.niccy.hscx_ale, cs->hw.niccy.hscx,
-                       HSCX_ISTA + 0x40);
+                     HSCX_ISTA + 0x40);
        if (val) {
                if (cs->debug & L1_DEB_HSCX)
                        debugl1(cs, "HSCX IntStat after IntRoutine");
@@ -165,7 +165,7 @@ Start_ISAC:
        writereg(cs->hw.niccy.isac_ale, cs->hw.niccy.isac, ISAC_MASK, 0xFF);
        writereg(cs->hw.niccy.isac_ale, cs->hw.niccy.isac, ISAC_MASK, 0);
        writereg(cs->hw.niccy.hscx_ale, cs->hw.niccy.hscx, HSCX_MASK, 0);
-       writereg(cs->hw.niccy.hscx_ale, cs->hw.niccy.hscx, HSCX_MASK + 0x40,0);
+       writereg(cs->hw.niccy.hscx_ale, cs->hw.niccy.hscx, HSCX_MASK + 0x40, 0);
        spin_unlock_irqrestore(&cs->lock, flags);
        return IRQ_HANDLED;
 }
@@ -241,32 +241,32 @@ int __devinit setup_niccy(struct IsdnCard *card)
                int err;
 
                pnp_c = pnp_find_card(ISAPNP_VENDOR('S', 'D', 'A'),
-                               ISAPNP_FUNCTION(0x0150), pnp_c);
+                                     ISAPNP_FUNCTION(0x0150), pnp_c);
                if (pnp_c) {
                        pnp_d = pnp_find_dev(pnp_c,
-                                       ISAPNP_VENDOR('S', 'D', 'A'),
-                                       ISAPNP_FUNCTION(0x0150), pnp_d);
+                                            ISAPNP_VENDOR('S', 'D', 'A'),
+                                            ISAPNP_FUNCTION(0x0150), pnp_d);
                        if (!pnp_d) {
                                printk(KERN_ERR "NiccyPnP: PnP error card "
-                                       "found, no device\n");
+                                      "found, no device\n");
                                return 0;
                        }
                        pnp_disable_dev(pnp_d);
                        err = pnp_activate_dev(pnp_d);
                        if (err < 0) {
                                printk(KERN_WARNING "%s: pnp_activate_dev "
-                                       "ret(%d)\n", __func__, err);
+                                      "ret(%d)\n", __func__, err);
                                return 0;
                        }
                        card->para[1] = pnp_port_start(pnp_d, 0);
                        card->para[2] = pnp_port_start(pnp_d, 1);
                        card->para[0] = pnp_irq(pnp_d, 0);
                        if (!card->para[0] || !card->para[1] ||
-                                       !card->para[2]) {
+                           !card->para[2]) {
                                printk(KERN_ERR "NiccyPnP:some resources are "
-                                       "missing %ld/%lx/%lx\n",
-                                       card->para[0], card->para[1],
-                                       card->para[2]);
+                                      "missing %ld/%lx/%lx\n",
+                                      card->para[0], card->para[1],
+                                      card->para[2]);
                                pnp_disable_dev(pnp_d);
                                return 0;
                        }
@@ -284,15 +284,15 @@ int __devinit setup_niccy(struct IsdnCard *card)
                cs->irq = card->para[0];
                if (!request_region(cs->hw.niccy.isac, 2, "niccy data")) {
                        printk(KERN_WARNING "HiSax: NICCY data port %x-%x "
-                               "already in use\n",
-                               cs->hw.niccy.isac, cs->hw.niccy.isac + 1);
+                              "already in use\n",
+                              cs->hw.niccy.isac, cs->hw.niccy.isac + 1);
                        return 0;
                }
                if (!request_region(cs->hw.niccy.isac_ale, 2, "niccy addr")) {
                        printk(KERN_WARNING "HiSax: NICCY address port %x-%x "
-                               "already in use\n",
-                               cs->hw.niccy.isac_ale,
-                               cs->hw.niccy.isac_ale + 1);
+                              "already in use\n",
+                              cs->hw.niccy.isac_ale,
+                              cs->hw.niccy.isac_ale + 1);
                        release_region(cs->hw.niccy.isac, 2);
                        return 0;
                }
@@ -303,8 +303,8 @@ int __devinit setup_niccy(struct IsdnCard *card)
                u_int pci_ioaddr;
                cs->subtyp = 0;
                if ((niccy_dev = hisax_find_pci_device(PCI_VENDOR_ID_SATSAGEM,
-                                                PCI_DEVICE_ID_SATSAGEM_NICCY,
-                                                niccy_dev))) {
+                                                      PCI_DEVICE_ID_SATSAGEM_NICCY,
+                                                      niccy_dev))) {
                        if (pci_enable_device(niccy_dev))
                                return 0;
                        /* get IRQ */
@@ -357,8 +357,8 @@ int __devinit setup_niccy(struct IsdnCard *card)
 #endif                         /* CONFIG_PCI */
        }
        printk(KERN_INFO "HiSax: NICCY %s config irq:%d data:0x%X ale:0x%X\n",
-               (cs->subtyp == 1) ? "PnP" : "PCI",
-               cs->irq, cs->hw.niccy.isac, cs->hw.niccy.isac_ale);
+              (cs->subtyp == 1) ? "PnP" : "PCI",
+              cs->irq, cs->hw.niccy.isac, cs->hw.niccy.isac_ale);
        setup_isac(cs);
        cs->readisac = &ReadISAC;
        cs->writeisac = &WriteISAC;
@@ -372,7 +372,7 @@ int __devinit setup_niccy(struct IsdnCard *card)
        ISACVersion(cs, "Niccy:");
        if (HscxVersion(cs, "Niccy:")) {
                printk(KERN_WARNING "Niccy: wrong HSCX versions check IO "
-                       "address\n");
+                      "address\n");
                release_io_niccy(cs);
                return 0;
        }
index a1b8952..f36ff69 100644 (file)
@@ -18,7 +18,7 @@ static const char *NETjet_S_revision = "$Revision: 2.13.2.4 $";
 
 static u_char dummyrr(struct IsdnCardState *cs, int chan, u_char off)
 {
-       return(5);
+       return (5);
 }
 
 static void dummywr(struct IsdnCardState *cs, int chan, u_char off, u_char value)
@@ -46,48 +46,48 @@ netjet_s_interrupt(int intno, void *dev_id)
                s1val = 1;
        } else
                s1val = 0;
-       /* 
+       /*
         * read/write stat0 is better, because lower IRQ rate
         * Note the IRQ is on for 125 us if a condition match
         * thats long on modern CPU and so the IRQ is reentered
         * all the time.
         */
        s0val = bytein(cs->hw.njet.base + NETJET_IRQSTAT0);
-       if ((s0val | s1val)==0) { // shared IRQ
+       if ((s0val | s1val) == 0) { // shared IRQ
                spin_unlock_irqrestore(&cs->lock, flags);
                return IRQ_NONE;
-       } 
+       }
        if (s0val)
                byteout(cs->hw.njet.base + NETJET_IRQSTAT0, s0val);
        /* start new code 13/07/00 GE */
        /* set bits in sval to indicate which page is free */
        if (inl(cs->hw.njet.base + NETJET_DMA_WRITE_ADR) <
-               inl(cs->hw.njet.base + NETJET_DMA_WRITE_IRQ))
+           inl(cs->hw.njet.base + NETJET_DMA_WRITE_IRQ))
                /* the 2nd write page is free */
                s0val = 0x08;
        else    /* the 1st write page is free */
-               s0val = 0x04;   
+               s0val = 0x04;
        if (inl(cs->hw.njet.base + NETJET_DMA_READ_ADR) <
-               inl(cs->hw.njet.base + NETJET_DMA_READ_IRQ))
+           inl(cs->hw.njet.base + NETJET_DMA_READ_IRQ))
                /* the 2nd read page is free */
                s0val |= 0x02;
        else    /* the 1st read page is free */
-               s0val |= 0x01;  
+               s0val |= 0x01;
        if (s0val != cs->hw.njet.last_is0) /* we have a DMA interrupt */
        {
                if (test_and_set_bit(FLG_LOCK_ATOMIC, &cs->HW_Flags)) {
                        printk(KERN_WARNING "nj LOCK_ATOMIC s0val %x->%x\n",
-                               cs->hw.njet.last_is0, s0val);
+                              cs->hw.njet.last_is0, s0val);
                        spin_unlock_irqrestore(&cs->lock, flags);
                        return IRQ_HANDLED;
                }
                cs->hw.njet.irqstat0 = s0val;
-               if ((cs->hw.njet.irqstat0 & NETJET_IRQM0_READ) != 
-                       (cs->hw.njet.last_is0 & NETJET_IRQM0_READ))
+               if ((cs->hw.njet.irqstat0 & NETJET_IRQM0_READ) !=
+                   (cs->hw.njet.last_is0 & NETJET_IRQM0_READ))
                        /* we have a read dma int */
                        read_tiger(cs);
                if ((cs->hw.njet.irqstat0 & NETJET_IRQM0_WRITE) !=
-                       (cs->hw.njet.last_is0 & NETJET_IRQM0_WRITE))
+                   (cs->hw.njet.last_is0 & NETJET_IRQM0_WRITE))
                        /* we have a write dma int */
                        write_tiger(cs);
                /* end new code 13/07/00 GE */
@@ -124,28 +124,28 @@ NETjet_S_card_msg(struct IsdnCardState *cs, int mt, void *arg)
        u_long flags;
 
        switch (mt) {
-               case CARD_RESET:
-                       spin_lock_irqsave(&cs->lock, flags);
-                       reset_netjet_s(cs);
-                       spin_unlock_irqrestore(&cs->lock, flags);
-                       return(0);
-               case CARD_RELEASE:
-                       release_io_netjet(cs);
-                       return(0);
-               case CARD_INIT:
-                       reset_netjet_s(cs);
-                       inittiger(cs);
-                       spin_lock_irqsave(&cs->lock, flags);
-                       clear_pending_isac_ints(cs);
-                       initisac(cs);
-                       /* Reenable all IRQ */
-                       cs->writeisac(cs, ISAC_MASK, 0);
-                       spin_unlock_irqrestore(&cs->lock, flags);
-                       return(0);
-               case CARD_TEST:
-                       return(0);
+       case CARD_RESET:
+               spin_lock_irqsave(&cs->lock, flags);
+               reset_netjet_s(cs);
+               spin_unlock_irqrestore(&cs->lock, flags);
+               return (0);
+       case CARD_RELEASE:
+               release_io_netjet(cs);
+               return (0);
+       case CARD_INIT:
+               reset_netjet_s(cs);
+               inittiger(cs);
+               spin_lock_irqsave(&cs->lock, flags);
+               clear_pending_isac_ints(cs);
+               initisac(cs);
+               /* Reenable all IRQ */
+               cs->writeisac(cs, ISAC_MASK, 0);
+               spin_unlock_irqrestore(&cs->lock, flags);
+               return (0);
+       case CARD_TEST:
+               return (0);
        }
-       return(0);
+       return (0);
 }
 
 static int __devinit njs_pci_probe(struct pci_dev *dev_netjet,
@@ -154,17 +154,17 @@ static int __devinit njs_pci_probe(struct pci_dev *dev_netjet,
        u32 cfg;
 
        if (pci_enable_device(dev_netjet))
-               return(0);
+               return (0);
        pci_set_master(dev_netjet);
        cs->irq = dev_netjet->irq;
        if (!cs->irq) {
                printk(KERN_WARNING "NETjet-S: No IRQ for PCI card found\n");
-               return(0);
+               return (0);
        }
        cs->hw.njet.base = pci_resource_start(dev_netjet, 0);
        if (!cs->hw.njet.base) {
                printk(KERN_WARNING "NETjet-S: No IO-Adr for PCI card found\n");
-               return(0);
+               return (0);
        }
        /* the TJ300 and TJ320 must be detected, the IRQ handling is different
         * unfortunately the chips use the same device ID, but the TJ320 has
@@ -177,14 +177,14 @@ static int __devinit njs_pci_probe(struct pci_dev *dev_netjet,
                cs->subtyp = 0; /* TJ300 */
        /* 2001/10/04 Christoph Ersfeld, Formula-n Europe AG www.formula-n.com */
        if ((dev_netjet->subsystem_vendor == 0x55) &&
-               (dev_netjet->subsystem_device == 0x02)) {
+           (dev_netjet->subsystem_device == 0x02)) {
                printk(KERN_WARNING "Netjet: You tried to load this driver with an incompatible TigerJet-card\n");
                printk(KERN_WARNING "Use type=41 for Formula-n enter:now ISDN PCI and compatible\n");
-               return(0);
+               return (0);
        }
        /* end new code */
 
-       return(1);
+       return (1);
 }
 
 static int __devinit njs_cs_init(struct IsdnCard *card,
@@ -209,18 +209,18 @@ static int __devinit njs_cs_init(struct IsdnCard *card,
        byteout(cs->hw.njet.base + NETJET_IRQMASK1, NETJET_ISACIRQ);
        byteout(cs->hw.njet.auxa, cs->hw.njet.auxd);
 
-       switch ( ( ( NETjet_ReadIC( cs, ISAC_RBCH ) >> 5 ) & 3 ) )
+       switch (((NETjet_ReadIC(cs, ISAC_RBCH) >> 5) & 3))
        {
-               case 0 :
-                       return 1;       /* end loop */
+       case 0:
+               return 1;       /* end loop */
 
-               case 3 :
-                       printk( KERN_WARNING "NETjet-S: NETspider-U PCI card found\n" );
-                       return -1;      /* continue looping */
+       case 3:
+               printk(KERN_WARNING "NETjet-S: NETspider-U PCI card found\n");
+               return -1;      /* continue looping */
 
-               default :
-                       printk( KERN_WARNING "NETjet-S: No PCI card found\n" );
-                       return 0;       /* end loop & function */
+       default:
+               printk(KERN_WARNING "NETjet-S: No PCI card found\n");
+               return 0;       /* end loop & function */
        }
        return 1;                       /* end loop */
 }
@@ -231,8 +231,8 @@ static int __devinit njs_cs_init_rest(struct IsdnCard *card,
        const int bytecnt = 256;
 
        printk(KERN_INFO
-               "NETjet-S: %s card configured at %#lx IRQ %d\n",
-               cs->subtyp ? "TJ320" : "TJ300", cs->hw.njet.base, cs->irq);
+              "NETjet-S: %s card configured at %#lx IRQ %d\n",
+              cs->subtyp ? "TJ320" : "TJ300", cs->hw.njet.base, cs->irq);
        if (!request_region(cs->hw.njet.base, bytecnt, "netjet-s isdn")) {
                printk(KERN_WARNING
                       "HiSax: NETjet-S config port %#lx-%#lx already in use\n",
@@ -271,24 +271,24 @@ setup_netjet_s(struct IsdnCard *card)
        strcpy(tmp, NETjet_S_revision);
        printk(KERN_INFO "HiSax: Traverse Tech. NETjet-S driver Rev. %s\n", HiSax_getrev(tmp));
        if (cs->typ != ISDN_CTYPE_NETJET_S)
-               return(0);
+               return (0);
        test_and_clear_bit(FLG_LOCK_ATOMIC, &cs->HW_Flags);
 
-       for ( ;; )
+       for (;;)
        {
                if ((dev_netjet = hisax_find_pci_device(PCI_VENDOR_ID_TIGERJET,
-                       PCI_DEVICE_ID_TIGERJET_300,  dev_netjet))) {
+                                                       PCI_DEVICE_ID_TIGERJET_300,  dev_netjet))) {
                        ret = njs_pci_probe(dev_netjet, cs);
                        if (!ret)
-                               return(0);
+                               return (0);
                } else {
                        printk(KERN_WARNING "NETjet-S: No PCI card found\n");
-                       return(0);
+                       return (0);
                }
 
                ret = njs_cs_init(card, cs);
                if (!ret)
-                       return(0);
+                       return (0);
                if (ret > 0)
                        break;
                /* otherwise, ret < 0, continue looping */
index 095e974..333484a 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: nj_u.c,v 2.14.2.3 2004/01/13 14:31:26 keil Exp $ 
+/* $Id: nj_u.c,v 2.14.2.3 2004/01/13 14:31:26 keil Exp $
  *
  * This software may be used and distributed according to the terms
  * of the GNU General Public License, incorporated herein by reference.
@@ -18,7 +18,7 @@ static const char *NETjet_U_revision = "$Revision: 2.14.2.3 $";
 
 static u_char dummyrr(struct IsdnCardState *cs, int chan, u_char off)
 {
-       return(5);
+       return (5);
 }
 
 static void dummywr(struct IsdnCardState *cs, int chan, u_char off, u_char value)
@@ -34,7 +34,7 @@ netjet_u_interrupt(int intno, void *dev_id)
 
        spin_lock_irqsave(&cs->lock, flags);
        if (!((sval = bytein(cs->hw.njet.base + NETJET_IRQSTAT1)) &
-               NETJET_ISACIRQ)) {
+             NETJET_ISACIRQ)) {
                val = NETjet_ReadIC(cs, ICC_ISTA);
                if (cs->debug & L1_DEB_ISAC)
                        debugl1(cs, "tiger: i1 %x %x", sval, val);
@@ -47,17 +47,17 @@ netjet_u_interrupt(int intno, void *dev_id)
        /* start new code 13/07/00 GE */
        /* set bits in sval to indicate which page is free */
        if (inl(cs->hw.njet.base + NETJET_DMA_WRITE_ADR) <
-               inl(cs->hw.njet.base + NETJET_DMA_WRITE_IRQ))
+           inl(cs->hw.njet.base + NETJET_DMA_WRITE_IRQ))
                /* the 2nd write page is free */
                sval = 0x08;
        else    /* the 1st write page is free */
-               sval = 0x04;    
+               sval = 0x04;
        if (inl(cs->hw.njet.base + NETJET_DMA_READ_ADR) <
-               inl(cs->hw.njet.base + NETJET_DMA_READ_IRQ))
+           inl(cs->hw.njet.base + NETJET_DMA_READ_IRQ))
                /* the 2nd read page is free */
                sval = sval | 0x02;
        else    /* the 1st read page is free */
-               sval = sval | 0x01;     
+               sval = sval | 0x01;
        if (sval != cs->hw.njet.last_is0) /* we have a DMA interrupt */
        {
                if (test_and_set_bit(FLG_LOCK_ATOMIC, &cs->HW_Flags)) {
@@ -65,12 +65,12 @@ netjet_u_interrupt(int intno, void *dev_id)
                        return IRQ_HANDLED;
                }
                cs->hw.njet.irqstat0 = sval;
-               if ((cs->hw.njet.irqstat0 & NETJET_IRQM0_READ) != 
-                       (cs->hw.njet.last_is0 & NETJET_IRQM0_READ))
+               if ((cs->hw.njet.irqstat0 & NETJET_IRQM0_READ) !=
+                   (cs->hw.njet.last_is0 & NETJET_IRQM0_READ))
                        /* we have a read dma int */
                        read_tiger(cs);
                if ((cs->hw.njet.irqstat0 & NETJET_IRQM0_WRITE) !=
-                       (cs->hw.njet.last_is0 & NETJET_IRQM0_WRITE))
+                   (cs->hw.njet.last_is0 & NETJET_IRQM0_WRITE))
                        /* we have a write dma int */
                        write_tiger(cs);
                /* end new code 13/07/00 GE */
@@ -104,45 +104,45 @@ NETjet_U_card_msg(struct IsdnCardState *cs, int mt, void *arg)
        u_long flags;
 
        switch (mt) {
-               case CARD_RESET:
-                       spin_lock_irqsave(&cs->lock, flags);
-                       reset_netjet_u(cs);
-                       spin_unlock_irqrestore(&cs->lock, flags);
-                       return(0);
-               case CARD_RELEASE:
-                       release_io_netjet(cs);
-                       return(0);
-               case CARD_INIT:
-                       spin_lock_irqsave(&cs->lock, flags);
-                       inittiger(cs);
-                       reset_netjet_u(cs);
-                       clear_pending_icc_ints(cs);
-                       initicc(cs);
-                       /* Reenable all IRQ */
-                       cs->writeisac(cs, ICC_MASK, 0);
-                       spin_unlock_irqrestore(&cs->lock, flags);
-                       return(0);
-               case CARD_TEST:
-                       return(0);
+       case CARD_RESET:
+               spin_lock_irqsave(&cs->lock, flags);
+               reset_netjet_u(cs);
+               spin_unlock_irqrestore(&cs->lock, flags);
+               return (0);
+       case CARD_RELEASE:
+               release_io_netjet(cs);
+               return (0);
+       case CARD_INIT:
+               spin_lock_irqsave(&cs->lock, flags);
+               inittiger(cs);
+               reset_netjet_u(cs);
+               clear_pending_icc_ints(cs);
+               initicc(cs);
+               /* Reenable all IRQ */
+               cs->writeisac(cs, ICC_MASK, 0);
+               spin_unlock_irqrestore(&cs->lock, flags);
+               return (0);
+       case CARD_TEST:
+               return (0);
        }
-       return(0);
+       return (0);
 }
 
 static int __devinit nju_pci_probe(struct pci_dev *dev_netjet,
                                   struct IsdnCardState *cs)
 {
        if (pci_enable_device(dev_netjet))
-               return(0);
+               return (0);
        pci_set_master(dev_netjet);
        cs->irq = dev_netjet->irq;
        if (!cs->irq) {
                printk(KERN_WARNING "NETspider-U: No IRQ for PCI card found\n");
-               return(0);
+               return (0);
        }
        cs->hw.njet.base = pci_resource_start(dev_netjet, 0);
        if (!cs->hw.njet.base) {
                printk(KERN_WARNING "NETspider-U: No IO-Adr for PCI card found\n");
-               return(0);
+               return (0);
        }
 
        return (1);
@@ -171,18 +171,18 @@ static int __devinit nju_cs_init(struct IsdnCard *card,
        byteout(cs->hw.njet.base + NETJET_IRQMASK1, NETJET_ISACIRQ);
        byteout(cs->hw.njet.auxa, cs->hw.njet.auxd);
 
-       switch ( ( ( NETjet_ReadIC( cs, ICC_RBCH ) >> 5 ) & 3 ) )
+       switch (((NETjet_ReadIC(cs, ICC_RBCH) >> 5) & 3))
        {
-               case 3 :
-                       return 1;       /* end loop */
+       case 3:
+               return 1;       /* end loop */
 
-               case 0 :
-                       printk( KERN_WARNING "NETspider-U: NETjet-S PCI card found\n" );
-                       return -1;      /* continue looping */
+       case 0:
+               printk(KERN_WARNING "NETspider-U: NETjet-S PCI card found\n");
+               return -1;      /* continue looping */
 
-               default :
-                       printk( KERN_WARNING "NETspider-U: No PCI card found\n" );
-                       return 0;       /* end loop & function */
+       default:
+               printk(KERN_WARNING "NETspider-U: No PCI card found\n");
+               return 0;       /* end loop & function */
        }
        return 1;                       /* end loop */
 }
@@ -193,8 +193,8 @@ static int __devinit nju_cs_init_rest(struct IsdnCard *card,
        const int bytecnt = 256;
 
        printk(KERN_INFO
-               "NETspider-U: PCI card configured at %#lx IRQ %d\n",
-               cs->hw.njet.base, cs->irq);
+              "NETspider-U: PCI card configured at %#lx IRQ %d\n",
+              cs->hw.njet.base, cs->irq);
        if (!request_region(cs->hw.njet.base, bytecnt, "netspider-u isdn")) {
                printk(KERN_WARNING
                       "HiSax: NETspider-U config port %#lx-%#lx "
@@ -235,19 +235,19 @@ setup_netjet_u(struct IsdnCard *card)
        strcpy(tmp, NETjet_U_revision);
        printk(KERN_INFO "HiSax: Traverse Tech. NETspider-U driver Rev. %s\n", HiSax_getrev(tmp));
        if (cs->typ != ISDN_CTYPE_NETJET_U)
-               return(0);
+               return (0);
        test_and_clear_bit(FLG_LOCK_ATOMIC, &cs->HW_Flags);
 
-       for ( ;; )
+       for (;;)
        {
                if ((dev_netjet = hisax_find_pci_device(PCI_VENDOR_ID_TIGERJET,
-                       PCI_DEVICE_ID_TIGERJET_300,  dev_netjet))) {
+                                                       PCI_DEVICE_ID_TIGERJET_300,  dev_netjet))) {
                        ret = nju_pci_probe(dev_netjet, cs);
                        if (!ret)
-                               return(0);
+                               return (0);
                } else {
                        printk(KERN_WARNING "NETspider-U: No PCI card found\n");
-                       return(0);
+                       return (0);
                }
 
                ret = nju_cs_init(card, cs);
index c0771f9..041bf52 100644 (file)
@@ -21,7 +21,7 @@
 #include "l3_1tr6.h"
 
 void
-iecpy(u_char * dest, u_char * iestart, int ieoffset)
+iecpy(u_char *dest, u_char *iestart, int ieoffset)
 {
        u_char *p;
        int l;
@@ -215,7 +215,7 @@ prbits(char *dest, u_char b, int start, int len)
 
 static
 u_char *
-skipext(u_char * p)
+skipext(u_char *p)
 {
        while (!(*p++ & 0x80));
        return (p);
@@ -442,7 +442,7 @@ struct CauseValue {
 
 static
 int
-prcause(char *dest, u_char * p)
+prcause(char *dest, u_char *p)
 {
        u_char *end;
        char *dp = dest;
@@ -519,7 +519,7 @@ struct MessageType cause_1tr6[] =
 static int cause_1tr6_len = ARRAY_SIZE(cause_1tr6);
 
 static int
-prcause_1tr6(char *dest, u_char * p)
+prcause_1tr6(char *dest, u_char *p)
 {
        char *dp = dest;
        int i, cause;
@@ -554,7 +554,7 @@ prcause_1tr6(char *dest, u_char * p)
 }
 
 static int
-prchident(char *dest, u_char * p)
+prchident(char *dest, u_char *p)
 {
        char *dp = dest;
 
@@ -566,7 +566,7 @@ prchident(char *dest, u_char * p)
 }
 
 static int
-prcalled(char *dest, u_char * p)
+prcalled(char *dest, u_char *p)
 {
        int l;
        char *dp = dest;
@@ -583,7 +583,7 @@ prcalled(char *dest, u_char * p)
        return (dp - dest);
 }
 static int
-prcalling(char *dest, u_char * p)
+prcalling(char *dest, u_char *p)
 {
        int l;
        char *dp = dest;
@@ -610,7 +610,7 @@ prcalling(char *dest, u_char * p)
 
 static
 int
-prbearer(char *dest, u_char * p)
+prbearer(char *dest, u_char *p)
 {
        char *dp = dest, ch;
 
@@ -658,7 +658,7 @@ prbearer(char *dest, u_char * p)
 
 static
 int
-prbearer_ni1(char *dest, u_char * p)
+prbearer_ni1(char *dest, u_char *p)
 {
        char *dp = dest;
        u_char len;
@@ -668,46 +668,46 @@ prbearer_ni1(char *dest, u_char * p)
        dp += sprintf(dp, "    octet 3  ");
        dp += prbits(dp, *p, 8, 8);
        switch (*p++) {
-               case 0x80:
-                       dp += sprintf(dp, " Speech");
-                       break;
-               case 0x88:
-                       dp += sprintf(dp, " Unrestricted digital information");
-                       break;
-               case 0x90:
-                       dp += sprintf(dp, " 3.1 kHz audio");
-                       break;
-               default:
-                       dp += sprintf(dp, " Unknown information-transfer capability");
+       case 0x80:
+               dp += sprintf(dp, " Speech");
+               break;
+       case 0x88:
+               dp += sprintf(dp, " Unrestricted digital information");
+               break;
+       case 0x90:
+               dp += sprintf(dp, " 3.1 kHz audio");
+               break;
+       default:
+               dp += sprintf(dp, " Unknown information-transfer capability");
        }
        *dp++ = '\n';
        dp += sprintf(dp, "    octet 4  ");
        dp += prbits(dp, *p, 8, 8);
        switch (*p++) {
-               case 0x90:
-                       dp += sprintf(dp, " 64 kbps, circuit mode");
-                       break;
-               case 0xc0:
-                       dp += sprintf(dp, " Packet mode");
-                       break;
-               default:
-                       dp += sprintf(dp, " Unknown transfer mode");
+       case 0x90:
+               dp += sprintf(dp, " 64 kbps, circuit mode");
+               break;
+       case 0xc0:
+               dp += sprintf(dp, " Packet mode");
+               break;
+       default:
+               dp += sprintf(dp, " Unknown transfer mode");
        }
        *dp++ = '\n';
        if (len > 2) {
                dp += sprintf(dp, "    octet 5  ");
                dp += prbits(dp, *p, 8, 8);
                switch (*p++) {
-                       case 0x21:
-                               dp += sprintf(dp, " Rate adaption\n");
-                               dp += sprintf(dp, "    octet 5a ");
-                               dp += prbits(dp, *p, 8, 8);
-                               break;
-                       case 0xa2:
-                               dp += sprintf(dp, " u-law");
-                               break;
-                       default:
-                               dp += sprintf(dp, " Unknown UI layer 1 protocol");
+               case 0x21:
+                       dp += sprintf(dp, " Rate adaption\n");
+                       dp += sprintf(dp, "    octet 5a ");
+                       dp += prbits(dp, *p, 8, 8);
+                       break;
+               case 0xa2:
+                       dp += sprintf(dp, " u-law");
+                       break;
+               default:
+                       dp += sprintf(dp, " Unknown UI layer 1 protocol");
                }
                *dp++ = '\n';
        }
@@ -715,7 +715,7 @@ prbearer_ni1(char *dest, u_char * p)
 }
 
 static int
-general(char *dest, u_char * p)
+general(char *dest, u_char *p)
 {
        char *dp = dest;
        char ch = ' ';
@@ -742,7 +742,7 @@ general(char *dest, u_char * p)
 }
 
 static int
-general_ni1(char *dest, u_char * p)
+general_ni1(char *dest, u_char *p)
 {
        char *dp = dest;
        char ch = ' ';
@@ -769,7 +769,7 @@ general_ni1(char *dest, u_char * p)
 }
 
 static int
-prcharge(char *dest, u_char * p)
+prcharge(char *dest, u_char *p)
 {
        char *dp = dest;
        int l;
@@ -786,7 +786,7 @@ prcharge(char *dest, u_char * p)
        return (dp - dest);
 }
 static int
-prtext(char *dest, u_char * p)
+prtext(char *dest, u_char *p)
 {
        char *dp = dest;
        int l;
@@ -802,7 +802,7 @@ prtext(char *dest, u_char * p)
 }
 
 static int
-prfeatureind(char *dest, u_char * p)
+prfeatureind(char *dest, u_char *p)
 {
        char *dp = dest;
 
@@ -817,21 +817,21 @@ prfeatureind(char *dest, u_char * p)
        }
        dp += sprintf(dp, "    Status:  ");
        switch (*p) {
-               case 0:
-                       dp += sprintf(dp, "Idle");
-                       break;
-               case 1:
-                       dp += sprintf(dp, "Active");
-                       break;
-               case 2:
-                       dp += sprintf(dp, "Prompt");
-                       break;
-               case 3:
-                       dp += sprintf(dp, "Pending");
-                       break;
-               default:
-                       dp += sprintf(dp, "(Reserved)");
-                       break;
+       case 0:
+               dp += sprintf(dp, "Idle");
+               break;
+       case 1:
+               dp += sprintf(dp, "Active");
+               break;
+       case 2:
+               dp += sprintf(dp, "Prompt");
+               break;
+       case 3:
+               dp += sprintf(dp, "Pending");
+               break;
+       default:
+               dp += sprintf(dp, "(Reserved)");
+               break;
        }
        *dp++ = '\n';
        return (dp - dest);
@@ -868,7 +868,7 @@ struct DTag { /* Display tags */
 #define DTAGSIZE ARRAY_SIZE(dtaglist)
 
 static int
-disptext_ni1(char *dest, u_char * p)
+disptext_ni1(char *dest, u_char *p)
 {
        char *dp = dest;
        int l, tag, len, i;
@@ -902,12 +902,12 @@ disptext_ni1(char *dest, u_char * p)
                                        *dp++ = *p++;
                        }
                        dp += sprintf(dp, "\n");
-                }
+               }
        }
        return (dp - dest);
 }
 static int
-display(char *dest, u_char * p)
+display(char *dest, u_char *p)
 {
        char *dp = dest;
        char ch = ' ';
@@ -936,7 +936,7 @@ display(char *dest, u_char * p)
 }
 
 static int
-prfacility(char *dest, u_char * p)
+prfacility(char *dest, u_char *p)
 {
        char *dp = dest;
        int l, l2;
@@ -1148,7 +1148,7 @@ static struct InformationElement we_6[] =
 #define WE_6_LEN ARRAY_SIZE(we_6)
 
 int
-QuickHex(char *txt, u_char * p, int cnt)
+QuickHex(char *txt, u_char *p, int cnt)
 {
        register int i;
        register char *t = txt;
@@ -1163,7 +1163,7 @@ QuickHex(char *txt, u_char * p, int cnt)
 }
 
 void
-LogFrame(struct IsdnCardState *cs, u_char * buf, int size)
+LogFrame(struct IsdnCardState *cs, u_char *buf, int size)
 {
        char *dp;
 
@@ -1206,7 +1206,7 @@ dlogframe(struct IsdnCardState *cs, struct sk_buff *skb, int dir)
        buf = skb->data;
        dp += sprintf(dp, "frame %s ", dir ? "network->user" : "user->network");
        size = skb->len;
-       
+
        if (tei == GROUP_TEI) {
                if (sapi == CTRL_SAPI) { /* sapi 0 */
                        if (ftyp == 3) {
@@ -1291,28 +1291,28 @@ dlogframe(struct IsdnCardState *cs, struct sk_buff *skb, int dir)
                        /* Is it a single octet information element? */
                        if (*buf & 0x80) {
                                switch ((*buf >> 4) & 7) {
-                                       case 1:
-                                               dp += sprintf(dp, "  Shift %x\n", *buf & 0xf);
-                                               cs_old = cset;
-                                               cset = *buf & 7;
-                                               cs_fest = *buf & 8;
-                                               break;
-                                       case 3:
-                                               dp += sprintf(dp, "  Congestion level %x\n", *buf & 0xf);
-                                               break;
-                                       case 2:
-                                               if (*buf == 0xa0) {
-                                                       dp += sprintf(dp, "  More data\n");
-                                                       break;
-                                               }
-                                               if (*buf == 0xa1) {
-                                                       dp += sprintf(dp, "  Sending complete\n");
-                                               }
-                                               break;
-                                               /* fall through */
-                                       default:
-                                               dp += sprintf(dp, "  Reserved %x\n", *buf);
+                               case 1:
+                                       dp += sprintf(dp, "  Shift %x\n", *buf & 0xf);
+                                       cs_old = cset;
+                                       cset = *buf & 7;
+                                       cs_fest = *buf & 8;
+                                       break;
+                               case 3:
+                                       dp += sprintf(dp, "  Congestion level %x\n", *buf & 0xf);
+                                       break;
+                               case 2:
+                                       if (*buf == 0xa0) {
+                                               dp += sprintf(dp, "  More data\n");
                                                break;
+                                       }
+                                       if (*buf == 0xa1) {
+                                               dp += sprintf(dp, "  Sending complete\n");
+                                       }
+                                       break;
+                                       /* fall through */
+                               default:
+                                       dp += sprintf(dp, "  Reserved %x\n", *buf);
+                                       break;
                                }
                                buf++;
                                continue;
@@ -1366,11 +1366,11 @@ dlogframe(struct IsdnCardState *cs, struct sk_buff *skb, int dir)
                /* display message type if it exists */
                if (i == MTSIZE)
                        dp += sprintf(dp, "callref %d %s size %d unknown message type %x!\n",
-                           cr & 0x7f, (cr & 0x80) ? "called" : "caller",
+                                     cr & 0x7f, (cr & 0x80) ? "called" : "caller",
                                      size, mt);
                else
                        dp += sprintf(dp, "callref %d %s size %d message type %s\n",
-                           cr & 0x7f, (cr & 0x80) ? "called" : "caller",
+                                     cr & 0x7f, (cr & 0x80) ? "called" : "caller",
                                      size, mtlist[i].descr);
 
                /* display each information element */
@@ -1378,15 +1378,15 @@ dlogframe(struct IsdnCardState *cs, struct sk_buff *skb, int dir)
                        /* Is it a single octet information element? */
                        if (*buf & 0x80) {
                                switch ((*buf >> 4) & 7) {
-                                       case 1:
-                                               dp += sprintf(dp, "  Shift %x\n", *buf & 0xf);
-                                               cs_old = cset;
-                                               cset = *buf & 7;
-                                               cs_fest = *buf & 8;
-                                               break;
-                                       default:
-                                               dp += sprintf(dp, "  Unknown single-octet IE %x\n", *buf);
-                                               break;
+                               case 1:
+                                       dp += sprintf(dp, "  Shift %x\n", *buf & 0xf);
+                                       cs_old = cset;
+                                       cset = *buf & 7;
+                                       cs_fest = *buf & 8;
+                                       break;
+                               default:
+                                       dp += sprintf(dp, "  Unknown single-octet IE %x\n", *buf);
+                                       break;
                                }
                                buf++;
                                continue;
@@ -1452,11 +1452,11 @@ dlogframe(struct IsdnCardState *cs, struct sk_buff *skb, int dir)
                /* display message type if it exists */
                if (i == MTSIZE)
                        dp += sprintf(dp, "callref %d %s size %d unknown message type %x!\n",
-                           cr & 0x7f, (cr & 0x80) ? "called" : "caller",
+                                     cr & 0x7f, (cr & 0x80) ? "called" : "caller",
                                      size, mt);
                else
                        dp += sprintf(dp, "callref %d %s size %d message type %s\n",
-                           cr & 0x7f, (cr & 0x80) ? "called" : "caller",
+                                     cr & 0x7f, (cr & 0x80) ? "called" : "caller",
                                      size, mtlist[i].descr);
 
                /* display each information element */
@@ -1464,28 +1464,28 @@ dlogframe(struct IsdnCardState *cs, struct sk_buff *skb, int dir)
                        /* Is it a single octet information element? */
                        if (*buf & 0x80) {
                                switch ((*buf >> 4) & 7) {
-                                       case 1:
-                                               dp += sprintf(dp, "  Shift %x\n", *buf & 0xf);
-                                               break;
-                                       case 3:
-                                               dp += sprintf(dp, "  Congestion level %x\n", *buf & 0xf);
-                                               break;
-                                       case 5:
-                                               dp += sprintf(dp, "  Repeat indicator %x\n", *buf & 0xf);
-                                               break;
-                                       case 2:
-                                               if (*buf == 0xa0) {
-                                                       dp += sprintf(dp, "  More data\n");
-                                                       break;
-                                               }
-                                               if (*buf == 0xa1) {
-                                                       dp += sprintf(dp, "  Sending complete\n");
-                                               }
-                                               break;
-                                               /* fall through */
-                                       default:
-                                               dp += sprintf(dp, "  Reserved %x\n", *buf);
+                               case 1:
+                                       dp += sprintf(dp, "  Shift %x\n", *buf & 0xf);
+                                       break;
+                               case 3:
+                                       dp += sprintf(dp, "  Congestion level %x\n", *buf & 0xf);
+                                       break;
+                               case 5:
+                                       dp += sprintf(dp, "  Repeat indicator %x\n", *buf & 0xf);
+                                       break;
+                               case 2:
+                                       if (*buf == 0xa0) {
+                                               dp += sprintf(dp, "  More data\n");
                                                break;
+                                       }
+                                       if (*buf == 0xa1) {
+                                               dp += sprintf(dp, "  Sending complete\n");
+                                       }
+                                       break;
+                                       /* fall through */
+                               default:
+                                       dp += sprintf(dp, "  Reserved %x\n", *buf);
+                                       break;
                                }
                                buf++;
                                continue;
index 16d00b5..383c4e7 100644 (file)
@@ -20,73 +20,73 @@ static const char *s0box_revision = "$Revision: 2.6.2.4 $";
 
 static inline void
 writereg(unsigned int padr, signed int addr, u_char off, u_char val) {
-       outb_p(0x1c,padr+2);
-       outb_p(0x14,padr+2);
-       outb_p((addr+off)&0x7f,padr);
-       outb_p(0x16,padr+2);
-       outb_p(val,padr);
-       outb_p(0x17,padr+2);
-       outb_p(0x14,padr+2);
-       outb_p(0x1c,padr+2);
+       outb_p(0x1c, padr + 2);
+       outb_p(0x14, padr + 2);
+       outb_p((addr + off) & 0x7f, padr);
+       outb_p(0x16, padr + 2);
+       outb_p(val, padr);
+       outb_p(0x17, padr + 2);
+       outb_p(0x14, padr + 2);
+       outb_p(0x1c, padr + 2);
 }
 
 static u_char nibtab[] = { 1, 9, 5, 0xd, 3, 0xb, 7, 0xf,
-                        0, 0, 0, 0, 0, 0, 0, 0,
-                        0, 8, 4, 0xc, 2, 0xa, 6, 0xe } ;
+                          0, 0, 0, 0, 0, 0, 0, 0,
+                          0, 8, 4, 0xc, 2, 0xa, 6, 0xe };
 
 static inline u_char
 readreg(unsigned int padr, signed int addr, u_char off) {
        register u_char n1, n2;
 
-       outb_p(0x1c,padr+2);
-       outb_p(0x14,padr+2);
-       outb_p((addr+off)|0x80,padr);
-       outb_p(0x16,padr+2);
-       outb_p(0x17,padr+2);
-       n1 = (inb_p(padr+1) >> 3) & 0x17;
-       outb_p(0x16,padr+2);
-       n2 = (inb_p(padr+1) >> 3) & 0x17;
-       outb_p(0x14,padr+2);
-       outb_p(0x1c,padr+2);
+       outb_p(0x1c, padr + 2);
+       outb_p(0x14, padr + 2);
+       outb_p((addr + off) | 0x80, padr);
+       outb_p(0x16, padr + 2);
+       outb_p(0x17, padr + 2);
+       n1 = (inb_p(padr + 1) >> 3) & 0x17;
+       outb_p(0x16, padr + 2);
+       n2 = (inb_p(padr + 1) >> 3) & 0x17;
+       outb_p(0x14, padr + 2);
+       outb_p(0x1c, padr + 2);
        return nibtab[n1] | (nibtab[n2] << 4);
 }
 
 static inline void
-read_fifo(unsigned int padr, signed int adr, u_char * data, int size)
+read_fifo(unsigned int padr, signed int adr, u_char *data, int size)
 {
        int i;
        register u_char n1, n2;
-       
-       outb_p(0x1c, padr+2);
-       outb_p(0x14, padr+2);
-       outb_p(adr|0x80, padr);
-       outb_p(0x16, padr+2);
-       for (i=0; i<size; i++) {
-               outb_p(0x17, padr+2);
-               n1 = (inb_p(padr+1) >> 3) & 0x17;
-               outb_p(0x16,padr+2);
-               n2 = (inb_p(padr+1) >> 3) & 0x17;
-               *(data++)=nibtab[n1] | (nibtab[n2] << 4);
+
+       outb_p(0x1c, padr + 2);
+       outb_p(0x14, padr + 2);
+       outb_p(adr | 0x80, padr);
+       outb_p(0x16, padr + 2);
+       for (i = 0; i < size; i++) {
+               outb_p(0x17, padr + 2);
+               n1 = (inb_p(padr + 1) >> 3) & 0x17;
+               outb_p(0x16, padr + 2);
+               n2 = (inb_p(padr + 1) >> 3) & 0x17;
+               *(data++) = nibtab[n1] | (nibtab[n2] << 4);
        }
-       outb_p(0x14,padr+2);
-       outb_p(0x1c,padr+2);
+       outb_p(0x14, padr + 2);
+       outb_p(0x1c, padr + 2);
        return;
 }
 
 static inline void
-write_fifo(unsigned int padr, signed int adr, u_char * data, int size)
+write_fifo(unsigned int padr, signed int adr, u_char *data, int size)
 {
        int i;
-       outb_p(0x1c, padr+2);
-       outb_p(0x14, padr+2);
-       outb_p(adr&0x7f, padr);
-       for (i=0; i<size; i++) {
-               outb_p(0x16, padr+2);
+       outb_p(0x1c, padr + 2);
+       outb_p(0x14, padr + 2);
+       outb_p(adr & 0x7f, padr);
+       for (i = 0; i < size; i++) {
+               outb_p(0x16, padr + 2);
                outb_p(*(data++), padr);
-               outb_p(0x17, padr+2);
+               outb_p(0x17, padr + 2);
        }
-       outb_p(0x14,padr+2);
-       outb_p(0x1c,padr+2);
+       outb_p(0x14, padr + 2);
+       outb_p(0x1c, padr + 2);
        return;
 }
 
@@ -105,13 +105,13 @@ WriteISAC(struct IsdnCardState *cs, u_char offset, u_char value)
 }
 
 static void
-ReadISACfifo(struct IsdnCardState *cs, u_char * data, int size)
+ReadISACfifo(struct IsdnCardState *cs, u_char *data, int size)
 {
        read_fifo(cs->hw.teles3.cfg_reg, cs->hw.teles3.isacfifo, data, size);
 }
 
 static void
-WriteISACfifo(struct IsdnCardState *cs, u_char * data, int size)
+WriteISACfifo(struct IsdnCardState *cs, u_char *data, int size)
 {
        write_fifo(cs->hw.teles3.cfg_reg, cs->hw.teles3.isacfifo, data, size);
 }
@@ -150,11 +150,11 @@ s0box_interrupt(int intno, void *dev_id)
 
        spin_lock_irqsave(&cs->lock, flags);
        val = readreg(cs->hw.teles3.cfg_reg, cs->hw.teles3.hscx[1], HSCX_ISTA);
-      Start_HSCX:
+Start_HSCX:
        if (val)
                hscx_int_main(cs, val);
        val = readreg(cs->hw.teles3.cfg_reg, cs->hw.teles3.isac, ISAC_ISTA);
-      Start_ISAC:
+Start_ISAC:
        if (val)
                isac_interrupt(cs, val);
        count++;
@@ -194,20 +194,20 @@ S0Box_card_msg(struct IsdnCardState *cs, int mt, void *arg)
        u_long flags;
 
        switch (mt) {
-               case CARD_RESET:
-                       break;
-               case CARD_RELEASE:
-                       release_io_s0box(cs);
-                       break;
-               case CARD_INIT:
-                       spin_lock_irqsave(&cs->lock, flags);
-                       inithscxisac(cs, 3);
-                       spin_unlock_irqrestore(&cs->lock, flags);
-                       break;
-               case CARD_TEST:
-                       break;
+       case CARD_RESET:
+               break;
+       case CARD_RELEASE:
+               release_io_s0box(cs);
+               break;
+       case CARD_INIT:
+               spin_lock_irqsave(&cs->lock, flags);
+               inithscxisac(cs, 3);
+               spin_unlock_irqrestore(&cs->lock, flags);
+               break;
+       case CARD_TEST:
+               break;
        }
-       return(0);
+       return (0);
 }
 
 int __devinit
@@ -229,17 +229,17 @@ setup_s0box(struct IsdnCard *card)
        cs->hw.teles3.hscxfifo[0] = cs->hw.teles3.hscx[0] + 0x3e;
        cs->hw.teles3.hscxfifo[1] = cs->hw.teles3.hscx[1] + 0x3e;
        cs->irq = card->para[0];
-       if (!request_region(cs->hw.teles3.cfg_reg,8, "S0Box parallel I/O")) {
+       if (!request_region(cs->hw.teles3.cfg_reg, 8, "S0Box parallel I/O")) {
                printk(KERN_WARNING "HiSax: S0Box ports %x-%x already in use\n",
-                       cs->hw.teles3.cfg_reg,
-                       cs->hw.teles3.cfg_reg + 7);
+                      cs->hw.teles3.cfg_reg,
+                      cs->hw.teles3.cfg_reg + 7);
                return 0;
        }
        printk(KERN_INFO "HiSax: S0Box config irq:%d isac:0x%x  cfg:0x%x\n",
-               cs->irq,
-               cs->hw.teles3.isac, cs->hw.teles3.cfg_reg);
+              cs->irq,
+              cs->hw.teles3.isac, cs->hw.teles3.cfg_reg);
        printk(KERN_INFO "HiSax: hscx A:0x%x  hscx B:0x%x\n",
-               cs->hw.teles3.hscx[0], cs->hw.teles3.hscx[1]);
+              cs->hw.teles3.hscx[0], cs->hw.teles3.hscx[1]);
        setup_isac(cs);
        cs->readisac = &ReadISAC;
        cs->writeisac = &WriteISAC;
index b34a81d..75dcae6 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Author       Karsten Keil
  * Copyright    by Karsten Keil      <keil@isdn4linux.de>
- * 
+ *
  * This software may be used and distributed according to the terms
  * of the GNU General Public License, incorporated herein by reference.
  *
@@ -20,7 +20,7 @@
 
 static char *saphir_rev = "$Revision: 1.10.2.4 $";
 
-#define byteout(addr,val) outb(val,addr)
+#define byteout(addr, val) outb(val, addr)
 #define bytein(addr) inb(addr)
 
 #define ISAC_DATA      0
@@ -41,7 +41,7 @@ readreg(unsigned int ale, unsigned int adr, u_char off)
 }
 
 static inline void
-readfifo(unsigned int ale, unsigned int adr, u_char off, u_char * data, int size)
+readfifo(unsigned int ale, unsigned int adr, u_char off, u_char *data, int size)
 {
        byteout(ale, off);
        insb(adr, data, size);
@@ -56,7 +56,7 @@ writereg(unsigned int ale, unsigned int adr, u_char off, u_char data)
 }
 
 static inline void
-writefifo(unsigned int ale, unsigned int adr, u_char off, u_char * data, int size)
+writefifo(unsigned int ale, unsigned int adr, u_char off, u_char *data, int size)
 {
        byteout(ale, off);
        outsb(adr, data, size);
@@ -77,13 +77,13 @@ WriteISAC(struct IsdnCardState *cs, u_char offset, u_char value)
 }
 
 static void
-ReadISACfifo(struct IsdnCardState *cs, u_char * data, int size)
+ReadISACfifo(struct IsdnCardState *cs, u_char *data, int size)
 {
        readfifo(cs->hw.saphir.ale, cs->hw.saphir.isac, 0, data, size);
 }
 
 static void
-WriteISACfifo(struct IsdnCardState *cs, u_char * data, int size)
+WriteISACfifo(struct IsdnCardState *cs, u_char *data, int size)
 {
        writefifo(cs->hw.saphir.ale, cs->hw.saphir.isac, 0, data, size);
 }
@@ -92,26 +92,26 @@ static u_char
 ReadHSCX(struct IsdnCardState *cs, int hscx, u_char offset)
 {
        return (readreg(cs->hw.saphir.ale, cs->hw.saphir.hscx,
-               offset + (hscx ? 0x40 : 0)));
+                       offset + (hscx ? 0x40 : 0)));
 }
 
 static void
 WriteHSCX(struct IsdnCardState *cs, int hscx, u_char offset, u_char value)
 {
        writereg(cs->hw.saphir.ale, cs->hw.saphir.hscx,
-               offset + (hscx ? 0x40 : 0), value);
+                offset + (hscx ? 0x40 : 0), value);
 }
 
-#define READHSCX(cs, nr, reg) readreg(cs->hw.saphir.ale, \
-               cs->hw.saphir.hscx, reg + (nr ? 0x40 : 0))
-#define WRITEHSCX(cs, nr, reg, data) writereg(cs->hw.saphir.ale, \
-               cs->hw.saphir.hscx, reg + (nr ? 0x40 : 0), data)
+#define READHSCX(cs, nr, reg) readreg(cs->hw.saphir.ale,               \
+                                     cs->hw.saphir.hscx, reg + (nr ? 0x40 : 0))
+#define WRITEHSCX(cs, nr, reg, data) writereg(cs->hw.saphir.ale,       \
+                                             cs->hw.saphir.hscx, reg + (nr ? 0x40 : 0), data)
 
-#define READHSCXFIFO(cs, nr, ptr, cnt) readfifo(cs->hw.saphir.ale, \
-               cs->hw.saphir.hscx, (nr ? 0x40 : 0), ptr, cnt)
+#define READHSCXFIFO(cs, nr, ptr, cnt) readfifo(cs->hw.saphir.ale,     \
+                                               cs->hw.saphir.hscx, (nr ? 0x40 : 0), ptr, cnt)
 
-#define WRITEHSCXFIFO(cs, nr, ptr, cnt) writefifo(cs->hw.saphir.ale, \
-               cs->hw.saphir.hscx, (nr ? 0x40 : 0), ptr, cnt)
+#define WRITEHSCXFIFO(cs, nr, ptr, cnt) writefifo(cs->hw.saphir.ale,   \
+                                                 cs->hw.saphir.hscx, (nr ? 0x40 : 0), ptr, cnt)
 
 #include "hscx_irq.c"
 
@@ -124,11 +124,11 @@ saphir_interrupt(int intno, void *dev_id)
 
        spin_lock_irqsave(&cs->lock, flags);
        val = readreg(cs->hw.saphir.ale, cs->hw.saphir.hscx, HSCX_ISTA + 0x40);
-      Start_HSCX:
+Start_HSCX:
        if (val)
                hscx_int_main(cs, val);
        val = readreg(cs->hw.saphir.ale, cs->hw.saphir.isac, ISAC_ISTA);
-      Start_ISAC:
+Start_ISAC:
        if (val)
                isac_interrupt(cs, val);
        val = readreg(cs->hw.saphir.ale, cs->hw.saphir.hscx, HSCX_ISTA + 0x40);
@@ -144,8 +144,8 @@ saphir_interrupt(int intno, void *dev_id)
                goto Start_ISAC;
        }
        /* Watchdog */
-       if (cs->hw.saphir.timer.function) 
-               mod_timer(&cs->hw.saphir.timer, jiffies+1*HZ);
+       if (cs->hw.saphir.timer.function)
+               mod_timer(&cs->hw.saphir.timer, jiffies + 1 * HZ);
        else
                printk(KERN_WARNING "saphir: Spurious timer!\n");
        writereg(cs->hw.saphir.ale, cs->hw.saphir.hscx, HSCX_MASK, 0xFF);
@@ -164,10 +164,10 @@ SaphirWatchDog(struct IsdnCardState *cs)
        u_long flags;
 
        spin_lock_irqsave(&cs->lock, flags);
-        /* 5 sec WatchDog, so read at least every 4 sec */
+       /* 5 sec WatchDog, so read at least every 4 sec */
        cs->readisac(cs, ISAC_RBCH);
        spin_unlock_irqrestore(&cs->lock, flags);
-       mod_timer(&cs->hw.saphir.timer, jiffies+1*HZ);
+       mod_timer(&cs->hw.saphir.timer, jiffies + 1 * HZ);
 }
 
 static void
@@ -185,24 +185,24 @@ saphir_reset(struct IsdnCardState *cs)
 {
        u_char irq_val;
 
-       switch(cs->irq) {
-               case 5: irq_val = 0;
-                       break;
-               case 3: irq_val = 1;
-                       break;
-               case 11:
-                       irq_val = 2;
-                       break;
-               case 12:
-                       irq_val = 3;
-                       break;
-               case 15:
-                       irq_val = 4;
-                       break;
-               default:
-                       printk(KERN_WARNING "HiSax: saphir wrong IRQ %d\n",
-                               cs->irq);
-                       return (1);
+       switch (cs->irq) {
+       case 5: irq_val = 0;
+               break;
+       case 3: irq_val = 1;
+               break;
+       case 11:
+               irq_val = 2;
+               break;
+       case 12:
+               irq_val = 3;
+               break;
+       case 15:
+               irq_val = 4;
+               break;
+       default:
+               printk(KERN_WARNING "HiSax: saphir wrong IRQ %d\n",
+                      cs->irq);
+               return (1);
        }
        byteout(cs->hw.saphir.cfg_reg + IRQ_REG, irq_val);
        byteout(cs->hw.saphir.cfg_reg + RESET_REG, 1);
@@ -220,23 +220,23 @@ saphir_card_msg(struct IsdnCardState *cs, int mt, void *arg)
        u_long flags;
 
        switch (mt) {
-               case CARD_RESET:
-                       spin_lock_irqsave(&cs->lock, flags);
-                       saphir_reset(cs);
-                       spin_unlock_irqrestore(&cs->lock, flags);
-                       return(0);
-               case CARD_RELEASE:
-                       release_io_saphir(cs);
-                       return(0);
-               case CARD_INIT:
-                       spin_lock_irqsave(&cs->lock, flags);
-                       inithscxisac(cs, 3);
-                       spin_unlock_irqrestore(&cs->lock, flags);
-                       return(0);
-               case CARD_TEST:
-                       return(0);
+       case CARD_RESET:
+               spin_lock_irqsave(&cs->lock, flags);
+               saphir_reset(cs);
+               spin_unlock_irqrestore(&cs->lock, flags);
+               return (0);
+       case CARD_RELEASE:
+               release_io_saphir(cs);
+               return (0);
+       case CARD_INIT:
+               spin_lock_irqsave(&cs->lock, flags);
+               inithscxisac(cs, 3);
+               spin_unlock_irqrestore(&cs->lock, flags);
+               return (0);
+       case CARD_TEST:
+               return (0);
        }
-       return(0);
+       return (0);
 }
 
 
@@ -259,9 +259,9 @@ setup_saphir(struct IsdnCard *card)
        cs->irq = card->para[0];
        if (!request_region(cs->hw.saphir.cfg_reg, 6, "saphir")) {
                printk(KERN_WARNING
-                       "HiSax: HST Saphir config port %x-%x already in use\n",
-                       cs->hw.saphir.cfg_reg,
-                       cs->hw.saphir.cfg_reg + 5);
+                      "HiSax: HST Saphir config port %x-%x already in use\n",
+                      cs->hw.saphir.cfg_reg,
+                      cs->hw.saphir.cfg_reg + 5);
                return (0);
        }
 
@@ -272,7 +272,7 @@ setup_saphir(struct IsdnCard *card)
        cs->hw.saphir.timer.function = (void *) SaphirWatchDog;
        cs->hw.saphir.timer.data = (long) cs;
        init_timer(&cs->hw.saphir.timer);
-       cs->hw.saphir.timer.expires = jiffies + 4*HZ;
+       cs->hw.saphir.timer.expires = jiffies + 4 * HZ;
        add_timer(&cs->hw.saphir.timer);
        if (saphir_reset(cs)) {
                release_io_saphir(cs);
@@ -290,7 +290,7 @@ setup_saphir(struct IsdnCard *card)
        ISACVersion(cs, "saphir:");
        if (HscxVersion(cs, "saphir:")) {
                printk(KERN_WARNING
-                   "saphir: wrong HSCX versions check IO address\n");
+                      "saphir: wrong HSCX versions check IO address\n");
                release_io_saphir(cs);
                return (0);
        }
index 69dfc8d..1ee531b 100644 (file)
@@ -9,7 +9,7 @@
  *
  * Author       Marcus Niemann
  * Copyright    by Marcus Niemann    <niemann@www-bib.fh-bielefeld.de>
- * 
+ *
  * This software may be used and distributed according to the terms
  * of the GNU General Public License, incorporated herein by reference.
  *
  * ISDN PC/104 IPAC            DIP-SWITCH
  * Speed Star2 IPAC            CARDMGR
  * Speed PCI   IPAC            PCI PNP
- * Speed Fax+  ISAC_ISAR       PCI PNP         Full analog support
+ * Speed Fax+  ISAC_ISAR       PCI PNP         Full analog support
  *
  * Important:
  * For the sedlbauer speed fax+ to work properly you have to download
  * the firmware onto the card.
  * For example: hisaxctrl <DriverID> 9 ISAR.BIN
-*/
+ */
 
 #include <linux/init.h>
 #include "hisax.h"
@@ -51,9 +51,9 @@
 static const char *Sedlbauer_revision = "$Revision: 1.34.2.6 $";
 
 static const char *Sedlbauer_Types[] =
-       {"None", "speed card/win", "speed star", "speed fax+",
-       "speed win II / ISDN PC/104", "speed star II", "speed pci",
-       "speed fax+ pyramid", "speed fax+ pci", "HST Saphir III"};
+{"None", "speed card/win", "speed star", "speed fax+",
+ "speed win II / ISDN PC/104", "speed star II", "speed pci",
+ "speed fax+ pyramid", "speed fax+ pci", "HST Saphir III"};
 
 #define PCI_SUBVENDOR_SPEEDFAX_PYRAMID 0x51
 #define PCI_SUBVENDOR_HST_SAPHIR3      0x52
@@ -62,11 +62,11 @@ static const char *Sedlbauer_Types[] =
 #define PCI_SUB_ID_SEDLBAUER           0x01
 
 #define SEDL_SPEED_CARD_WIN    1
-#define SEDL_SPEED_STAR        2
+#define SEDL_SPEED_STAR                2
 #define SEDL_SPEED_FAX         3
-#define SEDL_SPEED_WIN2_PC104  4
-#define SEDL_SPEED_STAR2       5
-#define SEDL_SPEED_PCI         6
+#define SEDL_SPEED_WIN2_PC104  4
+#define SEDL_SPEED_STAR2       5
+#define SEDL_SPEED_PCI         6
 #define SEDL_SPEEDFAX_PYRAMID  7
 #define SEDL_SPEEDFAX_PCI      8
 #define HST_SAPHIR3            9
@@ -80,7 +80,7 @@ static const char *Sedlbauer_Types[] =
 #define SEDL_BUS_PCI           2
 #define        SEDL_BUS_PCMCIA         3
 
-#define byteout(addr,val) outb(val,addr)
+#define byteout(addr, val) outb(val, addr)
 #define bytein(addr) inb(addr)
 
 #define SEDL_HSCX_ISA_RESET_ON 0
@@ -127,7 +127,7 @@ readreg(unsigned int ale, unsigned int adr, u_char off)
 }
 
 static inline void
-readfifo(unsigned int ale, unsigned int adr, u_char off, u_char * data, int size)
+readfifo(unsigned int ale, unsigned int adr, u_char off, u_char *data, int size)
 {
        byteout(ale, off);
        insb(adr, data, size);
@@ -142,7 +142,7 @@ writereg(unsigned int ale, unsigned int adr, u_char off, u_char data)
 }
 
 static inline void
-writefifo(unsigned int ale, unsigned int adr, u_char off, u_char * data, int size)
+writefifo(unsigned int ale, unsigned int adr, u_char off, u_char *data, int size)
 {
        byteout(ale, off);
        outsb(adr, data, size);
@@ -163,13 +163,13 @@ WriteISAC(struct IsdnCardState *cs, u_char offset, u_char value)
 }
 
 static void
-ReadISACfifo(struct IsdnCardState *cs, u_char * data, int size)
+ReadISACfifo(struct IsdnCardState *cs, u_char *data, int size)
 {
        readfifo(cs->hw.sedl.adr, cs->hw.sedl.isac, 0, data, size);
 }
 
 static void
-WriteISACfifo(struct IsdnCardState *cs, u_char * data, int size)
+WriteISACfifo(struct IsdnCardState *cs, u_char *data, int size)
 {
        writefifo(cs->hw.sedl.adr, cs->hw.sedl.isac, 0, data, size);
 }
@@ -177,23 +177,23 @@ WriteISACfifo(struct IsdnCardState *cs, u_char * data, int size)
 static u_char
 ReadISAC_IPAC(struct IsdnCardState *cs, u_char offset)
 {
-       return (readreg(cs->hw.sedl.adr, cs->hw.sedl.isac, offset|0x80));
+       return (readreg(cs->hw.sedl.adr, cs->hw.sedl.isac, offset | 0x80));
 }
 
 static void
 WriteISAC_IPAC(struct IsdnCardState *cs, u_char offset, u_char value)
 {
-       writereg(cs->hw.sedl.adr, cs->hw.sedl.isac, offset|0x80, value);
+       writereg(cs->hw.sedl.adr, cs->hw.sedl.isac, offset | 0x80, value);
 }
 
 static void
-ReadISACfifo_IPAC(struct IsdnCardState *cs, u_char * data, int size)
+ReadISACfifo_IPAC(struct IsdnCardState *cs, u_char *data, int size)
 {
        readfifo(cs->hw.sedl.adr, cs->hw.sedl.isac, 0x80, data, size);
 }
 
 static void
-WriteISACfifo_IPAC(struct IsdnCardState *cs, u_char * data, int size)
+WriteISACfifo_IPAC(struct IsdnCardState *cs, u_char *data, int size)
 {
        writefifo(cs->hw.sedl.adr, cs->hw.sedl.isac, 0x80, data, size);
 }
@@ -220,12 +220,12 @@ WriteHSCX(struct IsdnCardState *cs, int hscx, u_char offset, u_char value)
 
 static u_char
 ReadISAR(struct IsdnCardState *cs, int mode, u_char offset)
-{      
+{
        if (mode == 0)
                return (readreg(cs->hw.sedl.adr, cs->hw.sedl.hscx, offset));
        else if (mode == 1)
                byteout(cs->hw.sedl.adr, offset);
-       return(bytein(cs->hw.sedl.hscx));
+       return (bytein(cs->hw.sedl.hscx));
 }
 
 static void
@@ -244,16 +244,16 @@ WriteISAR(struct IsdnCardState *cs, int mode, u_char offset, u_char value)
  * fast interrupt HSCX stuff goes here
  */
 
-#define READHSCX(cs, nr, reg) readreg(cs->hw.sedl.adr, \
-               cs->hw.sedl.hscx, reg + (nr ? 0x40 : 0))
-#define WRITEHSCX(cs, nr, reg, data) writereg(cs->hw.sedl.adr, \
-               cs->hw.sedl.hscx, reg + (nr ? 0x40 : 0), data)
+#define READHSCX(cs, nr, reg) readreg(cs->hw.sedl.adr,                 \
+                                     cs->hw.sedl.hscx, reg + (nr ? 0x40 : 0))
+#define WRITEHSCX(cs, nr, reg, data) writereg(cs->hw.sedl.adr,         \
+                                             cs->hw.sedl.hscx, reg + (nr ? 0x40 : 0), data)
 
-#define READHSCXFIFO(cs, nr, ptr, cnt) readfifo(cs->hw.sedl.adr, \
-               cs->hw.sedl.hscx, (nr ? 0x40 : 0), ptr, cnt)
+#define READHSCXFIFO(cs, nr, ptr, cnt) readfifo(cs->hw.sedl.adr,       \
+                                               cs->hw.sedl.hscx, (nr ? 0x40 : 0), ptr, cnt)
 
-#define WRITEHSCXFIFO(cs, nr, ptr, cnt) writefifo(cs->hw.sedl.adr, \
-               cs->hw.sedl.hscx, (nr ? 0x40 : 0), ptr, cnt)
+#define WRITEHSCXFIFO(cs, nr, ptr, cnt) writefifo(cs->hw.sedl.adr,     \
+                                                 cs->hw.sedl.hscx, (nr ? 0x40 : 0), ptr, cnt)
 
 #include "hscx_irq.c"
 
@@ -274,11 +274,11 @@ sedlbauer_interrupt(int intno, void *dev_id)
        }
 
        val = readreg(cs->hw.sedl.adr, cs->hw.sedl.hscx, HSCX_ISTA + 0x40);
-      Start_HSCX:
+Start_HSCX:
        if (val)
                hscx_int_main(cs, val);
        val = readreg(cs->hw.sedl.adr, cs->hw.sedl.isac, ISAC_ISTA);
-      Start_ISAC:
+Start_ISAC:
        if (val)
                isac_interrupt(cs, val);
        val = readreg(cs->hw.sedl.adr, cs->hw.sedl.hscx, HSCX_ISTA + 0x40);
@@ -360,11 +360,11 @@ sedlbauer_interrupt_isar(int intno, void *dev_id)
 
        spin_lock_irqsave(&cs->lock, flags);
        val = readreg(cs->hw.sedl.adr, cs->hw.sedl.hscx, ISAR_IRQBIT);
-      Start_ISAR:
+Start_ISAR:
        if (val & ISAR_IRQSTA)
                isar_int_main(cs);
        val = readreg(cs->hw.sedl.adr, cs->hw.sedl.isac, ISAC_ISTA);
-      Start_ISAC:
+Start_ISAC:
        if (val)
                isac_interrupt(cs, val);
        val = readreg(cs->hw.sedl.adr, cs->hw.sedl.hscx, ISAR_IRQBIT);
@@ -411,7 +411,7 @@ reset_sedlbauer(struct IsdnCardState *cs)
        printk(KERN_INFO "Sedlbauer: resetting card\n");
 
        if (!((cs->hw.sedl.bus == SEDL_BUS_PCMCIA) &&
-          (cs->hw.sedl.chip == SEDL_CHIP_ISAC_HSCX))) {
+             (cs->hw.sedl.chip == SEDL_CHIP_ISAC_HSCX))) {
                if (cs->hw.sedl.chip == SEDL_CHIP_IPAC) {
                        writereg(cs->hw.sedl.adr, cs->hw.sedl.isac, IPAC_POTA2, 0x20);
                        mdelay(2);
@@ -423,12 +423,12 @@ reset_sedlbauer(struct IsdnCardState *cs)
                        writereg(cs->hw.sedl.adr, cs->hw.sedl.isac, IPAC_MASK, 0xc0);
                        writereg(cs->hw.sedl.adr, cs->hw.sedl.isac, IPAC_PCFG, 0x12);
                } else if ((cs->hw.sedl.chip == SEDL_CHIP_ISAC_ISAR) &&
-                       (cs->hw.sedl.bus == SEDL_BUS_PCI)) {
-                       byteout(cs->hw.sedl.cfg_reg +3, cs->hw.sedl.reset_on);
+                          (cs->hw.sedl.bus == SEDL_BUS_PCI)) {
+                       byteout(cs->hw.sedl.cfg_reg + 3, cs->hw.sedl.reset_on);
                        mdelay(2);
-                       byteout(cs->hw.sedl.cfg_reg +3, cs->hw.sedl.reset_off);
+                       byteout(cs->hw.sedl.cfg_reg + 3, cs->hw.sedl.reset_off);
                        mdelay(10);
-               } else {                
+               } else {
                        byteout(cs->hw.sedl.reset_on, SEDL_RESET);      /* Reset On */
                        mdelay(2);
                        byteout(cs->hw.sedl.reset_off, 0);      /* Reset Off */
@@ -443,86 +443,86 @@ Sedl_card_msg(struct IsdnCardState *cs, int mt, void *arg)
        u_long flags;
 
        switch (mt) {
-               case CARD_RESET:
-                       spin_lock_irqsave(&cs->lock, flags);
-                       reset_sedlbauer(cs);
-                       spin_unlock_irqrestore(&cs->lock, flags);
-                       return(0);
-               case CARD_RELEASE:
-                       if (cs->hw.sedl.bus == SEDL_BUS_PCI)
-                               /* disable all IRQ */
-                               byteout(cs->hw.sedl.cfg_reg+ 5, 0);
-                       if (cs->hw.sedl.chip == SEDL_CHIP_ISAC_ISAR) {
-                               spin_lock_irqsave(&cs->lock, flags);
-                               writereg(cs->hw.sedl.adr, cs->hw.sedl.hscx,
-                                       ISAR_IRQBIT, 0);
-                               writereg(cs->hw.sedl.adr, cs->hw.sedl.isac,
-                                       ISAC_MASK, 0xFF);
-                               reset_sedlbauer(cs);
-                               writereg(cs->hw.sedl.adr, cs->hw.sedl.hscx,
-                                       ISAR_IRQBIT, 0);
-                               writereg(cs->hw.sedl.adr, cs->hw.sedl.isac,
-                                       ISAC_MASK, 0xFF);
-                               spin_unlock_irqrestore(&cs->lock, flags);
-                       }
-                       release_io_sedlbauer(cs);
-                       return(0);
-               case CARD_INIT:
+       case CARD_RESET:
+               spin_lock_irqsave(&cs->lock, flags);
+               reset_sedlbauer(cs);
+               spin_unlock_irqrestore(&cs->lock, flags);
+               return (0);
+       case CARD_RELEASE:
+               if (cs->hw.sedl.bus == SEDL_BUS_PCI)
+                       /* disable all IRQ */
+                       byteout(cs->hw.sedl.cfg_reg + 5, 0);
+               if (cs->hw.sedl.chip == SEDL_CHIP_ISAC_ISAR) {
                        spin_lock_irqsave(&cs->lock, flags);
-                       if (cs->hw.sedl.bus == SEDL_BUS_PCI)
-                               /* enable all IRQ */
-                               byteout(cs->hw.sedl.cfg_reg+ 5, 0x02);
+                       writereg(cs->hw.sedl.adr, cs->hw.sedl.hscx,
+                                ISAR_IRQBIT, 0);
+                       writereg(cs->hw.sedl.adr, cs->hw.sedl.isac,
+                                ISAC_MASK, 0xFF);
                        reset_sedlbauer(cs);
-                       if (cs->hw.sedl.chip == SEDL_CHIP_ISAC_ISAR) {
-                               clear_pending_isac_ints(cs);
-                               writereg(cs->hw.sedl.adr, cs->hw.sedl.hscx,
-                                       ISAR_IRQBIT, 0);
-                               initisac(cs);
-                               initisar(cs);
-                               /* Reenable all IRQ */
-                               cs->writeisac(cs, ISAC_MASK, 0);
-                               /* RESET Receiver and Transmitter */
-                               cs->writeisac(cs, ISAC_CMDR, 0x41);
-                       } else {
-                               inithscxisac(cs, 3);
-                       }
+                       writereg(cs->hw.sedl.adr, cs->hw.sedl.hscx,
+                                ISAR_IRQBIT, 0);
+                       writereg(cs->hw.sedl.adr, cs->hw.sedl.isac,
+                                ISAC_MASK, 0xFF);
                        spin_unlock_irqrestore(&cs->lock, flags);
-                       return(0);
-               case CARD_TEST:
-                       return(0);
-               case MDL_INFO_CONN:
-                       if (cs->subtyp != SEDL_SPEEDFAX_PYRAMID)
-                               return(0);
-                       spin_lock_irqsave(&cs->lock, flags);
-                       if ((long) arg)
-                               cs->hw.sedl.reset_off &= ~SEDL_ISAR_PCI_LED2;
-                       else
-                               cs->hw.sedl.reset_off &= ~SEDL_ISAR_PCI_LED1;
-                       byteout(cs->hw.sedl.cfg_reg +3, cs->hw.sedl.reset_off);
-                       spin_unlock_irqrestore(&cs->lock, flags);
-                       break;
-               case MDL_INFO_REL:
-                       if (cs->subtyp != SEDL_SPEEDFAX_PYRAMID)
-                               return(0);
-                       spin_lock_irqsave(&cs->lock, flags);
-                       if ((long) arg)
-                               cs->hw.sedl.reset_off |= SEDL_ISAR_PCI_LED2;
-                       else
-                               cs->hw.sedl.reset_off |= SEDL_ISAR_PCI_LED1;
-                       byteout(cs->hw.sedl.cfg_reg +3, cs->hw.sedl.reset_off);
-                       spin_unlock_irqrestore(&cs->lock, flags);
-                       break;
+               }
+               release_io_sedlbauer(cs);
+               return (0);
+       case CARD_INIT:
+               spin_lock_irqsave(&cs->lock, flags);
+               if (cs->hw.sedl.bus == SEDL_BUS_PCI)
+                       /* enable all IRQ */
+                       byteout(cs->hw.sedl.cfg_reg + 5, 0x02);
+               reset_sedlbauer(cs);
+               if (cs->hw.sedl.chip == SEDL_CHIP_ISAC_ISAR) {
+                       clear_pending_isac_ints(cs);
+                       writereg(cs->hw.sedl.adr, cs->hw.sedl.hscx,
+                                ISAR_IRQBIT, 0);
+                       initisac(cs);
+                       initisar(cs);
+                       /* Reenable all IRQ */
+                       cs->writeisac(cs, ISAC_MASK, 0);
+                       /* RESET Receiver and Transmitter */
+                       cs->writeisac(cs, ISAC_CMDR, 0x41);
+               } else {
+                       inithscxisac(cs, 3);
+               }
+               spin_unlock_irqrestore(&cs->lock, flags);
+               return (0);
+       case CARD_TEST:
+               return (0);
+       case MDL_INFO_CONN:
+               if (cs->subtyp != SEDL_SPEEDFAX_PYRAMID)
+                       return (0);
+               spin_lock_irqsave(&cs->lock, flags);
+               if ((long) arg)
+                       cs->hw.sedl.reset_off &= ~SEDL_ISAR_PCI_LED2;
+               else
+                       cs->hw.sedl.reset_off &= ~SEDL_ISAR_PCI_LED1;
+               byteout(cs->hw.sedl.cfg_reg + 3, cs->hw.sedl.reset_off);
+               spin_unlock_irqrestore(&cs->lock, flags);
+               break;
+       case MDL_INFO_REL:
+               if (cs->subtyp != SEDL_SPEEDFAX_PYRAMID)
+                       return (0);
+               spin_lock_irqsave(&cs->lock, flags);
+               if ((long) arg)
+                       cs->hw.sedl.reset_off |= SEDL_ISAR_PCI_LED2;
+               else
+                       cs->hw.sedl.reset_off |= SEDL_ISAR_PCI_LED1;
+               byteout(cs->hw.sedl.cfg_reg + 3, cs->hw.sedl.reset_off);
+               spin_unlock_irqrestore(&cs->lock, flags);
+               break;
        }
-       return(0);
+       return (0);
 }
 
 #ifdef __ISAPNP__
 static struct isapnp_device_id sedl_ids[] __devinitdata = {
        { ISAPNP_VENDOR('S', 'A', 'G'), ISAPNP_FUNCTION(0x01),
-         ISAPNP_VENDOR('S', 'A', 'G'), ISAPNP_FUNCTION(0x01), 
+         ISAPNP_VENDOR('S', 'A', 'G'), ISAPNP_FUNCTION(0x01),
          (unsigned long) "Speed win" },
        { ISAPNP_VENDOR('S', 'A', 'G'), ISAPNP_FUNCTION(0x02),
-         ISAPNP_VENDOR('S', 'A', 'G'), ISAPNP_FUNCTION(0x02), 
+         ISAPNP_VENDOR('S', 'A', 'G'), ISAPNP_FUNCTION(0x02),
          (unsigned long) "Speed Fax+" },
        { 0, }
 };
@@ -539,31 +539,31 @@ setup_sedlbauer_isapnp(struct IsdnCard *card, int *bytecnt)
        if (!isapnp_present())
                return -1;
 
-       while(ipid->card_vendor) {
+       while (ipid->card_vendor) {
                if ((pnp_c = pnp_find_card(ipid->card_vendor,
-                       ipid->card_device, pnp_c))) {
+                                          ipid->card_device, pnp_c))) {
                        pnp_d = NULL;
                        if ((pnp_d = pnp_find_dev(pnp_c,
-                               ipid->vendor, ipid->function, pnp_d))) {
+                                                 ipid->vendor, ipid->function, pnp_d))) {
                                int err;
 
                                printk(KERN_INFO "HiSax: %s detected\n",
-                                       (char *)ipid->driver_data);
+                                      (char *)ipid->driver_data);
                                pnp_disable_dev(pnp_d);
                                err = pnp_activate_dev(pnp_d);
-                               if (err<0) {
+                               if (err < 0) {
                                        printk(KERN_WARNING "%s: pnp_activate_dev ret(%d)\n",
-                                               __func__, err);
-                                       return(0);
+                                              __func__, err);
+                                       return (0);
                                }
                                card->para[1] = pnp_port_start(pnp_d, 0);
                                card->para[0] = pnp_irq(pnp_d, 0);
 
                                if (!card->para[0] || !card->para[1]) {
                                        printk(KERN_ERR "Sedlbauer PnP:some resources are missing %ld/%lx\n",
-                                               card->para[0], card->para[1]);
+                                              card->para[0], card->para[1]);
                                        pnp_disable_dev(pnp_d);
-                                       return(0);
+                                       return (0);
                                }
                                cs->hw.sedl.cfg_reg = card->para[1];
                                cs->irq = card->para[0];
@@ -579,12 +579,12 @@ setup_sedlbauer_isapnp(struct IsdnCard *card, int *bytecnt)
                                return (1);
                        } else {
                                printk(KERN_ERR "Sedlbauer PnP: PnP error card found, no device\n");
-                               return(0);
+                               return (0);
                        }
                }
                ipid++;
                pnp_c = NULL;
-       } 
+       }
 
        printk(KERN_INFO "Sedlbauer PnP: no ISAPnP card found\n");
        return -1;
@@ -608,30 +608,30 @@ setup_sedlbauer_pci(struct IsdnCard *card)
        u16 sub_vendor_id, sub_id;
 
        if ((dev_sedl = hisax_find_pci_device(PCI_VENDOR_ID_TIGERJET,
-                       PCI_DEVICE_ID_TIGERJET_100, dev_sedl))) {
+                                             PCI_DEVICE_ID_TIGERJET_100, dev_sedl))) {
                if (pci_enable_device(dev_sedl))
-                       return(0);
+                       return (0);
                cs->irq = dev_sedl->irq;
                if (!cs->irq) {
                        printk(KERN_WARNING "Sedlbauer: No IRQ for PCI card found\n");
-                       return(0);
+                       return (0);
                }
                cs->hw.sedl.cfg_reg = pci_resource_start(dev_sedl, 0);
        } else {
                printk(KERN_WARNING "Sedlbauer: No PCI card found\n");
-               return(0);
+               return (0);
        }
        cs->irq_flags |= IRQF_SHARED;
        cs->hw.sedl.bus = SEDL_BUS_PCI;
        sub_vendor_id = dev_sedl->subsystem_vendor;
        sub_id = dev_sedl->subsystem_device;
        printk(KERN_INFO "Sedlbauer: PCI subvendor:%x subid %x\n",
-               sub_vendor_id, sub_id);
+              sub_vendor_id, sub_id);
        printk(KERN_INFO "Sedlbauer: PCI base adr %#x\n",
-               cs->hw.sedl.cfg_reg);
+              cs->hw.sedl.cfg_reg);
        if (sub_id != PCI_SUB_ID_SEDLBAUER) {
                printk(KERN_ERR "Sedlbauer: unknown sub id %#x\n", sub_id);
-               return(0);
+               return (0);
        }
        if (sub_vendor_id == PCI_SUBVENDOR_SPEEDFAX_PYRAMID) {
                cs->hw.sedl.chip = SEDL_CHIP_ISAC_ISAR;
@@ -647,19 +647,19 @@ setup_sedlbauer_pci(struct IsdnCard *card)
                cs->subtyp = SEDL_SPEED_PCI;
        } else {
                printk(KERN_ERR "Sedlbauer: unknown sub vendor id %#x\n",
-                       sub_vendor_id);
-               return(0);
+                      sub_vendor_id);
+               return (0);
        }
 
        cs->hw.sedl.reset_on = SEDL_ISAR_PCI_ISAR_RESET_ON;
        cs->hw.sedl.reset_off = SEDL_ISAR_PCI_ISAR_RESET_OFF;
        byteout(cs->hw.sedl.cfg_reg, 0xff);
        byteout(cs->hw.sedl.cfg_reg, 0x00);
-       byteout(cs->hw.sedl.cfg_reg+ 2, 0xdd);
-       byteout(cs->hw.sedl.cfg_reg+ 5, 0); /* disable all IRQ */
-       byteout(cs->hw.sedl.cfg_reg +3, cs->hw.sedl.reset_on);
+       byteout(cs->hw.sedl.cfg_reg + 2, 0xdd);
+       byteout(cs->hw.sedl.cfg_reg + 5, 0); /* disable all IRQ */
+       byteout(cs->hw.sedl.cfg_reg + 3, cs->hw.sedl.reset_on);
        mdelay(2);
-       byteout(cs->hw.sedl.cfg_reg +3, cs->hw.sedl.reset_off);
+       byteout(cs->hw.sedl.cfg_reg + 3, cs->hw.sedl.reset_off);
        mdelay(10);
 
        return (1);
@@ -684,20 +684,20 @@ setup_sedlbauer(struct IsdnCard *card)
 
        strcpy(tmp, Sedlbauer_revision);
        printk(KERN_INFO "HiSax: Sedlbauer driver Rev. %s\n", HiSax_getrev(tmp));
-       
-       if (cs->typ == ISDN_CTYPE_SEDLBAUER) {
-               cs->subtyp = SEDL_SPEED_CARD_WIN;
+
+       if (cs->typ == ISDN_CTYPE_SEDLBAUER) {
+               cs->subtyp = SEDL_SPEED_CARD_WIN;
                cs->hw.sedl.bus = SEDL_BUS_ISA;
                cs->hw.sedl.chip = SEDL_CHIP_TEST;
-       } else if (cs->typ == ISDN_CTYPE_SEDLBAUER_PCMCIA) {    
-               cs->subtyp = SEDL_SPEED_STAR;
+       } else if (cs->typ == ISDN_CTYPE_SEDLBAUER_PCMCIA) {
+               cs->subtyp = SEDL_SPEED_STAR;
                cs->hw.sedl.bus = SEDL_BUS_PCMCIA;
                cs->hw.sedl.chip = SEDL_CHIP_TEST;
-       } else if (cs->typ == ISDN_CTYPE_SEDLBAUER_FAX) {       
-               cs->subtyp = SEDL_SPEED_FAX;
+       } else if (cs->typ == ISDN_CTYPE_SEDLBAUER_FAX) {
+               cs->subtyp = SEDL_SPEED_FAX;
                cs->hw.sedl.bus = SEDL_BUS_ISA;
                cs->hw.sedl.chip = SEDL_CHIP_ISAC_ISAR;
-       } else
+       } else
                return (0);
 
        bytecnt = 8;
@@ -720,22 +720,22 @@ setup_sedlbauer(struct IsdnCard *card)
                        return (0);
 
                bytecnt = 256;
-       }       
+       }
 
-ready: 
+ready:
 
        /* In case of the sedlbauer pcmcia card, this region is in use,
         * reserved for us by the card manager. So we do not check it
         * here, it would fail.
         */
        if (cs->hw.sedl.bus != SEDL_BUS_PCMCIA &&
-               !request_region(cs->hw.sedl.cfg_reg, bytecnt, "sedlbauer isdn")) {
+           !request_region(cs->hw.sedl.cfg_reg, bytecnt, "sedlbauer isdn")) {
                printk(KERN_WARNING
-                       "HiSax: %s config port %x-%x already in use\n",
-                       CardType[card->typ],
-                       cs->hw.sedl.cfg_reg,
-                       cs->hw.sedl.cfg_reg + bytecnt);
-                       return (0);
+                      "HiSax: %s config port %x-%x already in use\n",
+                      CardType[card->typ],
+                      cs->hw.sedl.cfg_reg,
+                      cs->hw.sedl.cfg_reg + bytecnt);
+               return (0);
        }
 
        printk(KERN_INFO
@@ -753,12 +753,12 @@ ready:
  * testing ISA and PCMCIA Cards for IPAC, default is ISAC
  * do not test for PCI card, because ports are different
  * and PCI card uses only IPAC (for the moment)
- */    
+ */
        if (cs->hw.sedl.bus != SEDL_BUS_PCI) {
                val = readreg(cs->hw.sedl.cfg_reg + SEDL_IPAC_ANY_ADR,
-                       cs->hw.sedl.cfg_reg + SEDL_IPAC_ANY_IPAC, IPAC_ID);
+                             cs->hw.sedl.cfg_reg + SEDL_IPAC_ANY_IPAC, IPAC_ID);
                printk(KERN_DEBUG "Sedlbauer: testing IPAC version %x\n", val);
-               if ((val == 1) || (val == 2)) {
+               if ((val == 1) || (val == 2)) {
                        /* IPAC */
                        cs->subtyp = SEDL_SPEED_WIN2_PC104;
                        if (cs->hw.sedl.bus == SEDL_BUS_PCMCIA) {
@@ -777,16 +777,16 @@ ready:
  * hw.sedl.chip is now properly set
  */
        printk(KERN_INFO "Sedlbauer: %s detected\n",
-               Sedlbauer_Types[cs->subtyp]);
+              Sedlbauer_Types[cs->subtyp]);
 
        setup_isac(cs);
        if (cs->hw.sedl.chip == SEDL_CHIP_IPAC) {
                if (cs->hw.sedl.bus == SEDL_BUS_PCI) {
-                       cs->hw.sedl.adr  = cs->hw.sedl.cfg_reg + SEDL_IPAC_PCI_ADR;
+                       cs->hw.sedl.adr  = cs->hw.sedl.cfg_reg + SEDL_IPAC_PCI_ADR;
                        cs->hw.sedl.isac = cs->hw.sedl.cfg_reg + SEDL_IPAC_PCI_IPAC;
                        cs->hw.sedl.hscx = cs->hw.sedl.cfg_reg + SEDL_IPAC_PCI_IPAC;
                } else {
-                       cs->hw.sedl.adr  = cs->hw.sedl.cfg_reg + SEDL_IPAC_ANY_ADR;
+                       cs->hw.sedl.adr  = cs->hw.sedl.cfg_reg + SEDL_IPAC_ANY_ADR;
                        cs->hw.sedl.isac = cs->hw.sedl.cfg_reg + SEDL_IPAC_ANY_IPAC;
                        cs->hw.sedl.hscx = cs->hw.sedl.cfg_reg + SEDL_IPAC_ANY_IPAC;
                }
@@ -807,22 +807,22 @@ ready:
                if (cs->hw.sedl.chip == SEDL_CHIP_ISAC_ISAR) {
                        if (cs->hw.sedl.bus == SEDL_BUS_PCI) {
                                cs->hw.sedl.adr = cs->hw.sedl.cfg_reg +
-                                                       SEDL_ISAR_PCI_ADR;
+                                       SEDL_ISAR_PCI_ADR;
                                cs->hw.sedl.isac = cs->hw.sedl.cfg_reg +
-                                                       SEDL_ISAR_PCI_ISAC;
+                                       SEDL_ISAR_PCI_ISAC;
                                cs->hw.sedl.hscx = cs->hw.sedl.cfg_reg +
-                                                       SEDL_ISAR_PCI_ISAR;
+                                       SEDL_ISAR_PCI_ISAR;
                        } else {
                                cs->hw.sedl.adr = cs->hw.sedl.cfg_reg +
-                                                       SEDL_ISAR_ISA_ADR;
+                                       SEDL_ISAR_ISA_ADR;
                                cs->hw.sedl.isac = cs->hw.sedl.cfg_reg +
-                                                       SEDL_ISAR_ISA_ISAC;
+                                       SEDL_ISAR_ISA_ISAC;
                                cs->hw.sedl.hscx = cs->hw.sedl.cfg_reg +
-                                                       SEDL_ISAR_ISA_ISAR;
+                                       SEDL_ISAR_ISA_ISAR;
                                cs->hw.sedl.reset_on = cs->hw.sedl.cfg_reg +
-                                                       SEDL_ISAR_ISA_ISAR_RESET_ON;
+                                       SEDL_ISAR_ISA_ISAR_RESET_ON;
                                cs->hw.sedl.reset_off = cs->hw.sedl.cfg_reg +
-                                                       SEDL_ISAR_ISA_ISAR_RESET_OFF;
+                                       SEDL_ISAR_ISA_ISAR_RESET_OFF;
                        }
                        cs->bcs[0].hw.isar.reg = &cs->hw.sedl.isar;
                        cs->bcs[1].hw.isar.reg = &cs->hw.sedl.isar;
@@ -838,7 +838,7 @@ ready:
                                ver = ISARVersion(cs, "Sedlbauer:");
                                if (ver < 0)
                                        printk(KERN_WARNING
-                                               "Sedlbauer: wrong ISAR version (ret = %d)\n", ver);
+                                              "Sedlbauer: wrong ISAR version (ret = %d)\n", ver);
                                else
                                        break;
                                reset_sedlbauer(cs);
@@ -865,10 +865,10 @@ ready:
                        }
                        cs->irq_func = &sedlbauer_interrupt;
                        ISACVersion(cs, "Sedlbauer:");
-               
+
                        if (HscxVersion(cs, "Sedlbauer:")) {
                                printk(KERN_WARNING
-                                       "Sedlbauer: wrong HSCX versions check IO address\n");
+                                      "Sedlbauer: wrong HSCX versions check IO address\n");
                                release_io_sedlbauer(cs);
                                return (0);
                        }
index 06473f8..68f5049 100644 (file)
@@ -1,39 +1,39 @@
 /*======================================================================
 
-    A Sedlbauer PCMCIA client driver
-
-    This driver is for the Sedlbauer Speed Star and Speed Star II, 
-    which are ISDN PCMCIA Cards.
-    
-    The contents of this file are subject to the Mozilla Public
-    License Version 1.1 (the "License"); you may not use this file
-    except in compliance with the License. You may obtain a copy of
-    the License at http://www.mozilla.org/MPL/
-
-    Software distributed under the License is distributed on an "AS
-    IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
-    implied. See the License for the specific language governing
-    rights and limitations under the License.
-
-    The initial developer of the original code is David A. Hinds
-    <dahinds@users.sourceforge.net>.  Portions created by David A. Hinds
-    are Copyright (C) 1999 David A. Hinds.  All Rights Reserved.
-
-    Modifications from dummy_cs.c are Copyright (C) 1999-2001 Marcus Niemann
-    <maniemann@users.sourceforge.net>. All Rights Reserved.
-
-    Alternatively, the contents of this file may be used under the
-    terms of the GNU General Public License version 2 (the "GPL"), in
-    which case the provisions of the GPL are applicable instead of the
-    above.  If you wish to allow the use of your version of this file
-    only under the terms of the GPL and not to allow others to use
-    your version of this file under the MPL, indicate your decision
-    by deleting the provisions above and replace them with the notice
-    and other provisions required by the GPL.  If you do not delete
-    the provisions above, a recipient may use your version of this
-    file under either the MPL or the GPL.
-    
-======================================================================*/
+  A Sedlbauer PCMCIA client driver
+
+  This driver is for the Sedlbauer Speed Star and Speed Star II,
+  which are ISDN PCMCIA Cards.
+
+  The contents of this file are subject to the Mozilla Public
+  License Version 1.1 (the "License"); you may not use this file
+  except in compliance with the License. You may obtain a copy of
+  the License at http://www.mozilla.org/MPL/
+
+  Software distributed under the License is distributed on an "AS
+  IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+  implied. See the License for the specific language governing
+  rights and limitations under the License.
+
+  The initial developer of the original code is David A. Hinds
+  <dahinds@users.sourceforge.net>.  Portions created by David A. Hinds
+  are Copyright (C) 1999 David A. Hinds.  All Rights Reserved.
+
+  Modifications from dummy_cs.c are Copyright (C) 1999-2001 Marcus Niemann
+  <maniemann@users.sourceforge.net>. All Rights Reserved.
+
+  Alternatively, the contents of this file may be used under the
+  terms of the GNU General Public License version 2 (the "GPL"), in
+  which case the provisions of the GPL are applicable instead of the
+  above.  If you wish to allow the use of your version of this file
+  only under the terms of the GPL and not to allow others to use
+  your version of this file under the MPL, indicate your decision
+  by deleting the provisions above and replace them with the notice
+  and other provisions required by the GPL.  If you do not delete
+  the provisions above, a recipient may use your version of this
+  file under either the MPL or the GPL.
+
+  ======================================================================*/
 
 #include <linux/kernel.h>
 #include <linux/module.h>
@@ -63,32 +63,32 @@ MODULE_LICENSE("Dual MPL/GPL");
 static int protocol = 2;        /* EURO-ISDN Default */
 module_param(protocol, int, 0);
 
-static int sedlbauer_config(struct pcmcia_device *link) __devinit ;
+static int sedlbauer_config(struct pcmcia_device *link) __devinit;
 static void sedlbauer_release(struct pcmcia_device *link);
 
 static void sedlbauer_detach(struct pcmcia_device *p_dev) __devexit;
 
 typedef struct local_info_t {
        struct pcmcia_device    *p_dev;
-    int                        stop;
-    int                        cardnr;
+       int                     stop;
+       int                     cardnr;
 } local_info_t;
 
 static int __devinit sedlbauer_probe(struct pcmcia_device *link)
 {
-    local_info_t *local;
+       local_info_t *local;
 
-    dev_dbg(&link->dev, "sedlbauer_attach()\n");
+       dev_dbg(&link->dev, "sedlbauer_attach()\n");
 
-    /* Allocate space for private device-specific data */
-    local = kzalloc(sizeof(local_info_t), GFP_KERNEL);
-    if (!local) return -ENOMEM;
-    local->cardnr = -1;
+       /* Allocate space for private device-specific data */
+       local = kzalloc(sizeof(local_info_t), GFP_KERNEL);
+       if (!local) return -ENOMEM;
+       local->cardnr = -1;
 
-    local->p_dev = link;
-    link->priv = local;
+       local->p_dev = link;
+       link->priv = local;
 
-    return sedlbauer_config(link);
+       return sedlbauer_config(link);
 } /* sedlbauer_attach */
 
 static void __devexit sedlbauer_detach(struct pcmcia_device *link)
@@ -113,58 +113,58 @@ static int sedlbauer_config_check(struct pcmcia_device *p_dev, void *priv_data)
 
 static int __devinit sedlbauer_config(struct pcmcia_device *link)
 {
-    int ret;
-    IsdnCard_t  icard;
-
-    dev_dbg(&link->dev, "sedlbauer_config(0x%p)\n", link);
-
-    link->config_flags |= CONF_ENABLE_IRQ | CONF_AUTO_CHECK_VCC |
-           CONF_AUTO_SET_VPP | CONF_AUTO_AUDIO | CONF_AUTO_SET_IO;
-
-    ret = pcmcia_loop_config(link, sedlbauer_config_check, NULL);
-    if (ret)
-           goto failed;
-
-    ret = pcmcia_enable_device(link);
-    if (ret)
-           goto failed;
-
-    icard.para[0] = link->irq;
-    icard.para[1] = link->resource[0]->start;
-    icard.protocol = protocol;
-    icard.typ = ISDN_CTYPE_SEDLBAUER_PCMCIA;
-    
-    ret = hisax_init_pcmcia(link, 
-                           &(((local_info_t *)link->priv)->stop), &icard);
-    if (ret < 0) {
-       printk(KERN_ERR "sedlbauer_cs: failed to initialize SEDLBAUER PCMCIA %d with %pR\n",
-               ret, link->resource[0]);
-       sedlbauer_release(link);
-       return -ENODEV;
-    } else
-       ((local_info_t *)link->priv)->cardnr = ret;
+       int ret;
+       IsdnCard_t  icard;
+
+       dev_dbg(&link->dev, "sedlbauer_config(0x%p)\n", link);
 
-    return 0;
+       link->config_flags |= CONF_ENABLE_IRQ | CONF_AUTO_CHECK_VCC |
+               CONF_AUTO_SET_VPP | CONF_AUTO_AUDIO | CONF_AUTO_SET_IO;
+
+       ret = pcmcia_loop_config(link, sedlbauer_config_check, NULL);
+       if (ret)
+               goto failed;
+
+       ret = pcmcia_enable_device(link);
+       if (ret)
+               goto failed;
+
+       icard.para[0] = link->irq;
+       icard.para[1] = link->resource[0]->start;
+       icard.protocol = protocol;
+       icard.typ = ISDN_CTYPE_SEDLBAUER_PCMCIA;
+
+       ret = hisax_init_pcmcia(link,
+                               &(((local_info_t *)link->priv)->stop), &icard);
+       if (ret < 0) {
+               printk(KERN_ERR "sedlbauer_cs: failed to initialize SEDLBAUER PCMCIA %d with %pR\n",
+                      ret, link->resource[0]);
+               sedlbauer_release(link);
+               return -ENODEV;
+       } else
+               ((local_info_t *)link->priv)->cardnr = ret;
+
+       return 0;
 
 failed:
-    sedlbauer_release(link);
-    return -ENODEV;
+       sedlbauer_release(link);
+       return -ENODEV;
 
 } /* sedlbauer_config */
 
 static void sedlbauer_release(struct pcmcia_device *link)
 {
-    local_info_t *local = link->priv;
-    dev_dbg(&link->dev, "sedlbauer_release(0x%p)\n", link);
-
-    if (local) {
-       if (local->cardnr >= 0) {
-           /* no unregister function with hisax */
-           HiSax_closecard(local->cardnr);
+       local_info_t *local = link->priv;
+       dev_dbg(&link->dev, "sedlbauer_release(0x%p)\n", link);
+
+       if (local) {
+               if (local->cardnr >= 0) {
+                       /* no unregister function with hisax */
+                       HiSax_closecard(local->cardnr);
+               }
        }
-    }
 
-    pcmcia_disable_device(link);
+       pcmcia_disable_device(link);
 } /* sedlbauer_release */
 
 static int sedlbauer_suspend(struct pcmcia_device *link)
index 0a53759..1267298 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Author       Karsten Keil
  * Copyright    by Karsten Keil      <keil@isdn4linux.de>
- * 
+ *
  * This software may be used and distributed according to the terms
  * of the GNU General Public License, incorporated herein by reference.
  *
@@ -20,7 +20,7 @@
 
 static const char *sportster_revision = "$Revision: 1.16.2.4 $";
 
-#define byteout(addr,val) outb(val,addr)
+#define byteout(addr, val) outb(val, addr)
 #define bytein(addr) inb(addr)
 
 #define         SPORTSTER_ISAC         0xC000
@@ -33,17 +33,17 @@ static const char *sportster_revision = "$Revision: 1.16.2.4 $";
 static inline int
 calc_off(unsigned int base, unsigned int off)
 {
-       return(base + ((off & 0xfc)<<8) + ((off & 3)<<1));
+       return (base + ((off & 0xfc) << 8) + ((off & 3) << 1));
 }
 
 static inline void
-read_fifo(unsigned int adr, u_char * data, int size)
+read_fifo(unsigned int adr, u_char *data, int size)
 {
        insb(adr, data, size);
 }
 
 static void
-write_fifo(unsigned int adr, u_char * data, int size)
+write_fifo(unsigned int adr, u_char *data, int size)
 {
        outsb(adr, data, size);
 }
@@ -63,13 +63,13 @@ WriteISAC(struct IsdnCardState *cs, u_char offset, u_char value)
 }
 
 static void
-ReadISACfifo(struct IsdnCardState *cs, u_char * data, int size)
+ReadISACfifo(struct IsdnCardState *cs, u_char *data, int size)
 {
        read_fifo(cs->hw.spt.isac, data, size);
 }
 
 static void
-WriteISACfifo(struct IsdnCardState *cs, u_char * data, int size)
+WriteISACfifo(struct IsdnCardState *cs, u_char *data, int size)
 {
        write_fifo(cs->hw.spt.isac, data, size);
 }
@@ -106,11 +106,11 @@ sportster_interrupt(int intno, void *dev_id)
 
        spin_lock_irqsave(&cs->lock, flags);
        val = READHSCX(cs, 1, HSCX_ISTA);
-      Start_HSCX:
+Start_HSCX:
        if (val)
                hscx_int_main(cs, val);
        val = ReadISAC(cs, ISAC_ISTA);
-      Start_ISAC:
+Start_ISAC:
        if (val)
                isac_interrupt(cs, val);
        val = READHSCX(cs, 1, HSCX_ISTA);
@@ -126,7 +126,7 @@ sportster_interrupt(int intno, void *dev_id)
                goto Start_ISAC;
        }
        /* get a new irq impulse if there any pending */
-       bytein(cs->hw.spt.cfg_reg + SPORTSTER_RES_IRQ +1);
+       bytein(cs->hw.spt.cfg_reg + SPORTSTER_RES_IRQ + 1);
        spin_unlock_irqrestore(&cs->lock, flags);
        return IRQ_HANDLED;
 }
@@ -137,8 +137,8 @@ release_io_sportster(struct IsdnCardState *cs)
        int i, adr;
 
        byteout(cs->hw.spt.cfg_reg + SPORTSTER_RES_IRQ, 0);
-       for (i=0; i<64; i++) {
-               adr = cs->hw.spt.cfg_reg + i *1024;
+       for (i = 0; i < 64; i++) {
+               adr = cs->hw.spt.cfg_reg + i * 1024;
                release_region(adr, 8);
        }
 }
@@ -160,51 +160,51 @@ Sportster_card_msg(struct IsdnCardState *cs, int mt, void *arg)
        u_long flags;
 
        switch (mt) {
-               case CARD_RESET:
-                       spin_lock_irqsave(&cs->lock, flags);
-                       reset_sportster(cs);
-                       spin_unlock_irqrestore(&cs->lock, flags);
-                       return(0);
-               case CARD_RELEASE:
-                       release_io_sportster(cs);
-                       return(0);
-               case CARD_INIT:
-                       spin_lock_irqsave(&cs->lock, flags);
-                       reset_sportster(cs);
-                       inithscxisac(cs, 1);
-                       cs->hw.spt.res_irq |= SPORTSTER_INTE; /* IRQ On */
-                       byteout(cs->hw.spt.cfg_reg + SPORTSTER_RES_IRQ, cs->hw.spt.res_irq);
-                       inithscxisac(cs, 2);
-                       spin_unlock_irqrestore(&cs->lock, flags);
-                       return(0);
-               case CARD_TEST:
-                       return(0);
+       case CARD_RESET:
+               spin_lock_irqsave(&cs->lock, flags);
+               reset_sportster(cs);
+               spin_unlock_irqrestore(&cs->lock, flags);
+               return (0);
+       case CARD_RELEASE:
+               release_io_sportster(cs);
+               return (0);
+       case CARD_INIT:
+               spin_lock_irqsave(&cs->lock, flags);
+               reset_sportster(cs);
+               inithscxisac(cs, 1);
+               cs->hw.spt.res_irq |= SPORTSTER_INTE; /* IRQ On */
+               byteout(cs->hw.spt.cfg_reg + SPORTSTER_RES_IRQ, cs->hw.spt.res_irq);
+               inithscxisac(cs, 2);
+               spin_unlock_irqrestore(&cs->lock, flags);
+               return (0);
+       case CARD_TEST:
+               return (0);
        }
-       return(0);
+       return (0);
 }
 
 static int __devinit
 get_io_range(struct IsdnCardState *cs)
 {
        int i, j, adr;
-       
-       for (i=0;i<64;i++) {
-               adr = cs->hw.spt.cfg_reg + i *1024;
+
+       for (i = 0; i < 64; i++) {
+               adr = cs->hw.spt.cfg_reg + i * 1024;
                if (!request_region(adr, 8, "sportster")) {
                        printk(KERN_WARNING "HiSax: USR Sportster config port "
-                               "%x-%x already in use\n",
-                               adr, adr + 8);
+                              "%x-%x already in use\n",
+                              adr, adr + 8);
                        break;
-               } 
+               }
        }
-       if (i==64)
-               return(1);
+       if (i == 64)
+               return (1);
        else {
-               for (j=0; j<i; j++) {
-                       adr = cs->hw.spt.cfg_reg + j *1024;
+               for (j = 0; j < i; j++) {
+                       adr = cs->hw.spt.cfg_reg + j * 1024;
                        release_region(adr, 8);
                }
-               return(0);
+               return (0);
        }
 }
 
@@ -226,28 +226,28 @@ setup_sportster(struct IsdnCard *card)
        cs->hw.spt.isac = cs->hw.spt.cfg_reg + SPORTSTER_ISAC;
        cs->hw.spt.hscx[0] = cs->hw.spt.cfg_reg + SPORTSTER_HSCXA;
        cs->hw.spt.hscx[1] = cs->hw.spt.cfg_reg + SPORTSTER_HSCXB;
-       
-       switch(cs->irq) {
-               case 5: cs->hw.spt.res_irq = 1;
-                       break;
-               case 7: cs->hw.spt.res_irq = 2;
-                       break;
-               case 10:cs->hw.spt.res_irq = 3;
-                       break;
-               case 11:cs->hw.spt.res_irq = 4;
-                       break;
-               case 12:cs->hw.spt.res_irq = 5;
-                       break;
-               case 14:cs->hw.spt.res_irq = 6;
-                       break;
-               case 15:cs->hw.spt.res_irq = 7;
-                       break;
-               default:release_io_sportster(cs);
-                       printk(KERN_WARNING "Sportster: wrong IRQ\n");
-                       return(0);
+
+       switch (cs->irq) {
+       case 5: cs->hw.spt.res_irq = 1;
+               break;
+       case 7: cs->hw.spt.res_irq = 2;
+               break;
+       case 10:cs->hw.spt.res_irq = 3;
+               break;
+       case 11:cs->hw.spt.res_irq = 4;
+               break;
+       case 12:cs->hw.spt.res_irq = 5;
+               break;
+       case 14:cs->hw.spt.res_irq = 6;
+               break;
+       case 15:cs->hw.spt.res_irq = 7;
+               break;
+       default:release_io_sportster(cs);
+               printk(KERN_WARNING "Sportster: wrong IRQ\n");
+               return (0);
        }
        printk(KERN_INFO "HiSax: USR Sportster config irq:%d cfg:0x%X\n",
-               cs->irq, cs->hw.spt.cfg_reg);
+              cs->irq, cs->hw.spt.cfg_reg);
        setup_isac(cs);
        cs->readisac = &ReadISAC;
        cs->writeisac = &WriteISAC;
index b9054cb..8cd2d82 100644 (file)
@@ -4,7 +4,7 @@
  * Author       Frode Isaksen
  * Copyright    2001 by Frode Isaksen      <fisaksen@bewan.com>
  *              2001 by Kai Germaschewski  <kai.germaschewski@gmx.de>
- * 
+ *
  * This software may be used and distributed according to the terms
  * of the GNU General Public License, incorporated herein by reference.
  *
@@ -31,7 +31,7 @@
 #define EP_B2_IN  0x05U /* B2 channel in */
 #define EP_D_OUT  0x06U /* D channel out */
 #define EP_D_IN   0x07U /* D channel in */
-  
+
 // Number of isochronous packets. With 20 packets we get
 // 50 interrupts/sec for each endpoint.
 
@@ -51,7 +51,7 @@
 #define B_FLOW_ADJUST 2
 
 // Registers that are written using vendor specific device request
-// on endpoint 0. 
+// on endpoint 0.
 
 #define LBA                    0x02 /* S loopback */
 #define SET_DEFAULT            0x06 /* Soft reset */
@@ -84,7 +84,7 @@
 #define        FFMSK_B2                0x50 /* B2 fifo interrupt MASK register */
 #define GPIO_DIR               0x52 /* GPIO pins direction registers */
 #define GPIO_OUT               0x53 /* GPIO pins output register */
-#define GPIO_IN                        0x54 /* GPIO pins input register */ 
+#define GPIO_IN                        0x54 /* GPIO pins input register */
 #define TXCI                   0x56 /* CI command to be transmitted */
 
 
 #define IN_COUNTER_ZEROED      0x02 /* In down-counter reached 0 */
 #define OUT_COUNTER_ZEROED     0x01 /* Out down-counter reached 0 */
 
-#define ANY_REC_INT    (IN_OVERRUN+IN_UP+IN_DOWN+IN_COUNTER_ZEROED)
-#define ANY_XMIT_INT   (OUT_UNDERRUN+OUT_UP+OUT_DOWN+OUT_COUNTER_ZEROED)
+#define ANY_REC_INT    (IN_OVERRUN + IN_UP + IN_DOWN + IN_COUNTER_ZEROED)
+#define ANY_XMIT_INT   (OUT_UNDERRUN + OUT_UP + OUT_DOWN + OUT_COUNTER_ZEROED)
 
 
 // Level 1 commands that are sent using the TXCI device request
@@ -158,7 +158,7 @@ enum {
        ST_DOUT_NORMAL,
 
        ST_DOUT_WAIT_FOR_UNDERRUN,
-        ST_DOUT_WAIT_FOR_NOT_BUSY,
+       ST_DOUT_WAIT_FOR_NOT_BUSY,
        ST_DOUT_WAIT_FOR_STOP,
        ST_DOUT_WAIT_FOR_RESET,
 };
@@ -188,9 +188,9 @@ enum {
        ST_L1_F8,
 };
 
-#define L1_STATE_COUNT (ST_L1_F8+1)
+#define L1_STATE_COUNT (ST_L1_F8 + 1)
 
-// The first 16 entries match the Level 1 indications that 
+// The first 16 entries match the Level 1 indications that
 // are found at offset 4 (CCIST) in the interrupt packet
 
 enum {
@@ -217,14 +217,14 @@ enum {
 
 #define L1_EVENT_COUNT (EV_TIMER3 + 1)
 
-#define ERR(format, arg...) \
-printk(KERN_ERR "%s:%s: " format "\n" , __FILE__,  __func__ , ## arg)
+#define ERR(format, arg...)                                            \
+       printk(KERN_ERR "%s:%s: " format "\n" , __FILE__,  __func__ , ## arg)
 
-#define WARNING(format, arg...) \
-printk(KERN_WARNING "%s:%s: " format "\n" , __FILE__,  __func__ , ## arg)
+#define WARNING(format, arg...)                                                \
+       printk(KERN_WARNING "%s:%s: " format "\n" , __FILE__,  __func__ , ## arg)
 
-#define INFO(format, arg...) \
-printk(KERN_INFO "%s:%s: " format "\n" , __FILE__,  __func__ , ## arg)
+#define INFO(format, arg...)                                           \
+       printk(KERN_INFO "%s:%s: " format "\n" , __FILE__,  __func__ , ## arg)
 
 #include <linux/isdn/hdlc.h>
 #include "fsm.h"
@@ -237,7 +237,7 @@ printk(KERN_INFO "%s:%s: " format "\n" , __FILE__,  __func__ , ## arg)
 
 /* Generic FIFO structure */
 struct fifo {
-       u_char r,w,count,size;
+       u_char r, w, count, size;
        spinlock_t lock;
 };
 
@@ -269,7 +269,7 @@ static inline int fifo_add(struct fifo *fifo)
                index = -1;
        } else {
                // Return index where to get the next data to add to the FIFO
-               index = fifo->w++ & (fifo->size-1);
+               index = fifo->w++ & (fifo->size - 1);
                fifo->count++;
        }
        spin_unlock_irqrestore(&fifo->lock, flags);
@@ -294,7 +294,7 @@ static inline int fifo_remove(struct fifo *fifo)
                index = -1;
        } else {
                // Return index where to get the next data from the FIFO
-               index = fifo->r++ & (fifo->size-1);
+               index = fifo->r++ & (fifo->size - 1);
                fifo->count--;
        }
        spin_unlock_irqrestore(&fifo->lock, flags);
@@ -311,14 +311,14 @@ typedef struct ctrl_msg {
        struct usb_ctrlrequest dr;
        ctrl_complete_t complete;
        void *context;
-} ctrl_msg; 
+} ctrl_msg;
 
 /* FIFO of ctrl messages waiting to be sent */
 #define MAX_EP0_MSG 16
 struct ctrl_msg_fifo {
        struct fifo f;
        struct ctrl_msg data[MAX_EP0_MSG];
-};     
+};
 
 #define MAX_DFRAME_LEN_L1      300
 #define HSCX_BUFMAX    4096
@@ -330,7 +330,7 @@ struct st5481_ctrl {
 };
 
 struct st5481_intr {
-  //   struct evt_fifo evt_fifo;
+       //      struct evt_fifo evt_fifo;
        struct urb *urb;
 };
 
@@ -407,21 +407,21 @@ struct st5481_adapter {
  * Submit an URB with error reporting. This is a macro so
  * the __func__ returns the caller function name.
  */
-#define SUBMIT_URB(urb, mem_flags) \
-({ \
-       int status; \
-       if ((status = usb_submit_urb(urb, mem_flags)) < 0) { \
-               WARNING("usb_submit_urb failed,status=%d", status); \
-       } \
-        status; \
-})
+#define SUBMIT_URB(urb, mem_flags)                                     \
+       ({                                                              \
+               int status;                                             \
+               if ((status = usb_submit_urb(urb, mem_flags)) < 0) {    \
+                       WARNING("usb_submit_urb failed,status=%d", status); \
+               }                                                       \
+               status;                                                 \
+       })
 
 /*
  * USB double buffering, return the URB index (0 or 1).
  */
 static inline int get_buf_nr(struct urb *urbs[], struct urb *urb)
 {
-        return (urbs[0]==urb ? 0 : 1); 
+       return (urbs[0] == urb ? 0 : 1);
 }
 
 /* ---------------------------------------------------------------------- */
@@ -442,17 +442,17 @@ void st5481_d_exit(void);
 
 /* USB */
 void st5481_ph_command(struct st5481_adapter *adapter, unsigned int command);
-int st5481_setup_isocpipes(struct urb* urb[2], struct usb_device *dev, 
+int st5481_setup_isocpipes(struct urb *urb[2], struct usb_device *dev,
                           unsigned int pipe, int num_packets,
                           int packet_size, int buf_size,
                           usb_complete_t complete, void *context);
-void st5481_release_isocpipes(struct urb* urb[2]);
+void st5481_release_isocpipes(struct urb *urb[2]);
 
 void st5481_usb_pipe_reset(struct st5481_adapter *adapter,
-                   u_char pipe, ctrl_complete_t complete, void *context);
+                          u_char pipe, ctrl_complete_t complete, void *context);
 void st5481_usb_device_ctrl_msg(struct st5481_adapter *adapter,
-                        u8 request, u16 value,
-                        ctrl_complete_t complete, void *context);
+                               u8 request, u16 value,
+                               ctrl_complete_t complete, void *context);
 int  st5481_setup_usb(struct st5481_adapter *adapter);
 void st5481_release_usb(struct st5481_adapter *adapter);
 void st5481_start(struct st5481_adapter *adapter);
@@ -468,18 +468,18 @@ extern int st5481_debug;
 
 #ifdef CONFIG_HISAX_DEBUG
 
-#define DBG_ISO_PACKET(level,urb) \
-  if (level & __debug_variable) dump_iso_packet(__func__,urb)
+#define DBG_ISO_PACKET(level, urb)                                     \
+       if (level & __debug_variable) dump_iso_packet(__func__, urb)
 
 static void __attribute__((unused))
 dump_iso_packet(const char *name, struct urb *urb)
 {
-       int i,j;
-       int len,ofs;
+       int i, j;
+       int len, ofs;
        u_char *data;
 
        printk(KERN_DEBUG "%s: packets=%d,errors=%d\n",
-              name,urb->number_of_packets,urb->error_count);
+              name, urb->number_of_packets, urb->error_count);
        for (i = 0; i  < urb->number_of_packets; ++i) {
                if (urb->pipe & USB_DIR_IN) {
                        len = urb->iso_frame_desc[i].actual_length;
@@ -487,11 +487,11 @@ dump_iso_packet(const char *name, struct urb *urb)
                        len = urb->iso_frame_desc[i].length;
                }
                ofs = urb->iso_frame_desc[i].offset;
-               printk(KERN_DEBUG "len=%.2d,ofs=%.3d ",len,ofs);
+               printk(KERN_DEBUG "len=%.2d,ofs=%.3d ", len, ofs);
                if (len) {
-                       data = urb->transfer_buffer+ofs;
-                       for (j=0; j < len; j++) {
-                               printk ("%.2x", data[j]);
+                       data = urb->transfer_buffer + ofs;
+                       for (j = 0; j < len; j++) {
+                               printk("%.2x", data[j]);
                        }
                }
                printk("\n");
@@ -513,17 +513,17 @@ static inline const char *ST5481_CMD_string(int evt)
        case ST5481_CMD_ARL: return "ARL";
        case ST5481_CMD_PDN: return "PDN";
        };
-       
-       sprintf(s,"0x%x",evt);
+
+       sprintf(s, "0x%x", evt);
        return s;
-}      
+}
 
 #else
 
-#define DBG_ISO_PACKET(level,urb) do {} while (0)
+#define DBG_ISO_PACKET(level, urb) do {} while (0)
 
 #endif
 
 
 
-#endif 
+#endif
index ed4bc56..4098491 100644 (file)
@@ -4,7 +4,7 @@
  * Author       Frode Isaksen
  * Copyright    2001 by Frode Isaksen      <fisaksen@bewan.com>
  *              2001 by Kai Germaschewski  <kai.germaschewski@gmx.de>
- * 
+ *
  * This software may be used and distributed according to the terms
  * of the GNU General Public License, incorporated herein by reference.
  *
@@ -27,33 +27,33 @@ static inline void B_L1L2(struct st5481_bcs *bcs, int pr, void *arg)
 /*
  * Encode and transmit next frame.
  */
-static void usb_b_out(struct st5481_bcs *bcs,int buf_nr)
+static void usb_b_out(struct st5481_bcs *bcs, int buf_nr)
 {
        struct st5481_b_out *b_out = &bcs->b_out;
        struct st5481_adapter *adapter = bcs->adapter;
        struct urb *urb;
-       unsigned int packet_size,offset;
-       int len,buf_size,bytes_sent;
+       unsigned int packet_size, offset;
+       int len, buf_size, bytes_sent;
        int i;
        struct sk_buff *skb;
-       
+
        if (test_and_set_bit(buf_nr, &b_out->busy)) {
-               DBG(4,"ep %d urb %d busy",(bcs->channel+1)*2,buf_nr);
+               DBG(4, "ep %d urb %d busy", (bcs->channel + 1) * 2, buf_nr);
                return;
        }
        urb = b_out->urb[buf_nr];
 
        // Adjust isoc buffer size according to flow state
-       if(b_out->flow_event & (OUT_DOWN | OUT_UNDERRUN)) {
-               buf_size = NUM_ISO_PACKETS_B*SIZE_ISO_PACKETS_B_OUT + B_FLOW_ADJUST;
+       if (b_out->flow_event & (OUT_DOWN | OUT_UNDERRUN)) {
+               buf_size = NUM_ISO_PACKETS_B * SIZE_ISO_PACKETS_B_OUT + B_FLOW_ADJUST;
                packet_size = SIZE_ISO_PACKETS_B_OUT + B_FLOW_ADJUST;
-               DBG(4,"B%d,adjust flow,add %d bytes",bcs->channel+1,B_FLOW_ADJUST);
-       } else if(b_out->flow_event & OUT_UP){
-               buf_size = NUM_ISO_PACKETS_B*SIZE_ISO_PACKETS_B_OUT - B_FLOW_ADJUST;
+               DBG(4, "B%d,adjust flow,add %d bytes", bcs->channel + 1, B_FLOW_ADJUST);
+       } else if (b_out->flow_event & OUT_UP) {
+               buf_size = NUM_ISO_PACKETS_B * SIZE_ISO_PACKETS_B_OUT - B_FLOW_ADJUST;
                packet_size = SIZE_ISO_PACKETS_B_OUT - B_FLOW_ADJUST;
-               DBG(4,"B%d,adjust flow,remove %d bytes",bcs->channel+1,B_FLOW_ADJUST);
+               DBG(4, "B%d,adjust flow,remove %d bytes", bcs->channel + 1, B_FLOW_ADJUST);
        } else {
-               buf_size = NUM_ISO_PACKETS_B*SIZE_ISO_PACKETS_B_OUT;
+               buf_size = NUM_ISO_PACKETS_B * SIZE_ISO_PACKETS_B_OUT;
                packet_size = 8;
        }
        b_out->flow_event = 0;
@@ -62,15 +62,15 @@ static void usb_b_out(struct st5481_bcs *bcs,int buf_nr)
        while (len < buf_size) {
                if ((skb = b_out->tx_skb)) {
                        DBG_SKB(0x100, skb);
-                       DBG(4,"B%d,len=%d",bcs->channel+1,skb->len);
-                       
-                       if (bcs->mode == L1_MODE_TRANS) {       
+                       DBG(4, "B%d,len=%d", bcs->channel + 1, skb->len);
+
+                       if (bcs->mode == L1_MODE_TRANS) {
                                bytes_sent = buf_size - len;
                                if (skb->len < bytes_sent)
                                        bytes_sent = skb->len;
                                {       /* swap tx bytes to get hearable audio data */
                                        register unsigned char *src  = skb->data;
-                                       register unsigned char *dest = urb->transfer_buffer+len;
+                                       register unsigned char *dest = urb->transfer_buffer + len;
                                        register unsigned int count;
                                        for (count = 0; count < bytes_sent; count++)
                                                *dest++ = bitrev8(*src++);
@@ -79,7 +79,7 @@ static void usb_b_out(struct st5481_bcs *bcs,int buf_nr)
                        } else {
                                len += isdnhdlc_encode(&b_out->hdlc_state,
                                                       skb->data, skb->len, &bytes_sent,
-                                                      urb->transfer_buffer+len, buf_size-len);
+                                                      urb->transfer_buffer + len, buf_size-len);
                        }
 
                        skb_pull(skb, bytes_sent);
@@ -90,21 +90,21 @@ static void usb_b_out(struct st5481_bcs *bcs,int buf_nr)
                                B_L1L2(bcs, PH_DATA | CONFIRM, (void *)(unsigned long) skb->truesize);
                                dev_kfree_skb_any(skb);
 
-/*                             if (!(bcs->tx_skb = skb_dequeue(&bcs->sq))) { */
-/*                                     st5481B_sched_event(bcs, B_XMTBUFREADY); */
-/*                             } */
+/*                             if (!(bcs->tx_skb = skb_dequeue(&bcs->sq))) { */
+/*                                     st5481B_sched_event(bcs, B_XMTBUFREADY); */
+/*                             } */
                        }
                } else {
                        if (bcs->mode == L1_MODE_TRANS) {
-                               memset(urb->transfer_buffer+len, 0xff, buf_size-len);
+                               memset(urb->transfer_buffer + len, 0xff, buf_size-len);
                                len = buf_size;
                        } else {
                                // Send flags
                                len += isdnhdlc_encode(&b_out->hdlc_state,
                                                       NULL, 0, &bytes_sent,
-                                                      urb->transfer_buffer+len, buf_size-len);
+                                                      urb->transfer_buffer + len, buf_size-len);
                        }
-               }       
+               }
        }
 
        // Prepare the URB
@@ -118,7 +118,7 @@ static void usb_b_out(struct st5481_bcs *bcs,int buf_nr)
        urb->number_of_packets = i;
        urb->dev = adapter->usb_dev;
 
-       DBG_ISO_PACKET(0x200,urb);
+       DBG_ISO_PACKET(0x200, urb);
 
        SUBMIT_URB(urb, GFP_NOIO);
 }
@@ -131,12 +131,12 @@ static void st5481B_start_xfer(void *context)
 {
        struct st5481_bcs *bcs = context;
 
-       DBG(4,"B%d",bcs->channel+1);
+       DBG(4, "B%d", bcs->channel + 1);
 
        // Start transmitting (flags or data) on B channel
 
-       usb_b_out(bcs,0);
-       usb_b_out(bcs,1);
+       usb_b_out(bcs, 0);
+       usb_b_out(bcs, 1);
 }
 
 /*
@@ -158,7 +158,7 @@ static void led_blink(struct st5481_adapter *adapter)
        } else {
                leds &= ~GREEN_LED;
        }
-       
+
        st5481_usb_device_ctrl_msg(adapter, GPIO_OUT, leds, NULL, NULL);
 }
 
@@ -168,27 +168,27 @@ static void usb_b_out_complete(struct urb *urb)
        struct st5481_b_out *b_out = &bcs->b_out;
        struct st5481_adapter *adapter = bcs->adapter;
        int buf_nr;
-       
+
        buf_nr = get_buf_nr(b_out->urb, urb);
        test_and_clear_bit(buf_nr, &b_out->busy);
 
        if (unlikely(urb->status < 0)) {
                switch (urb->status) {
-                       case -ENOENT:
-                       case -ESHUTDOWN:
-                       case -ECONNRESET:
-                               DBG(4,"urb killed status %d", urb->status);
-                               return; // Give up
-                       default: 
-                               WARNING("urb status %d",urb->status);
-                               if (b_out->busy == 0) {
-                                       st5481_usb_pipe_reset(adapter, (bcs->channel+1)*2 | USB_DIR_OUT, NULL, NULL);
-                               }
-                               break;
+               case -ENOENT:
+               case -ESHUTDOWN:
+               case -ECONNRESET:
+                       DBG(4, "urb killed status %d", urb->status);
+                       return; // Give up
+               default:
+                       WARNING("urb status %d", urb->status);
+                       if (b_out->busy == 0) {
+                               st5481_usb_pipe_reset(adapter, (bcs->channel + 1) * 2 | USB_DIR_OUT, NULL, NULL);
+                       }
+                       break;
                }
        }
 
-       usb_b_out(bcs,buf_nr);
+       usb_b_out(bcs, buf_nr);
 
        if (adapter->number_of_leds == 2)
                led_blink(adapter);
@@ -202,7 +202,7 @@ static void st5481B_mode(struct st5481_bcs *bcs, int mode)
        struct st5481_b_out *b_out = &bcs->b_out;
        struct st5481_adapter *adapter = bcs->adapter;
 
-       DBG(4,"B%d,mode=%d", bcs->channel + 1, mode);
+       DBG(4, "B%d,mode=%d", bcs->channel + 1, mode);
 
        if (bcs->mode == mode)
                return;
@@ -223,14 +223,14 @@ static void st5481B_mode(struct st5481_bcs *bcs, int mode)
                                features |= HDLC_56KBIT;
                        isdnhdlc_out_init(&b_out->hdlc_state, features);
                }
-               st5481_usb_pipe_reset(adapter, (bcs->channel+1)*2, NULL, NULL);
-       
+               st5481_usb_pipe_reset(adapter, (bcs->channel + 1) * 2, NULL, NULL);
+
                // Enable B channel interrupts
-               st5481_usb_device_ctrl_msg(adapter, FFMSK_B1+(bcs->channel*2), 
-                                   OUT_UP+OUT_DOWN+OUT_UNDERRUN, NULL, NULL);
+               st5481_usb_device_ctrl_msg(adapter, FFMSK_B1 + (bcs->channel * 2),
+                                          OUT_UP + OUT_DOWN + OUT_UNDERRUN, NULL, NULL);
 
                // Enable B channel FIFOs
-               st5481_usb_device_ctrl_msg(adapter, OUT_B1_COUNTER+(bcs->channel*2), 32, st5481B_start_xfer, bcs);
+               st5481_usb_device_ctrl_msg(adapter, OUT_B1_COUNTER+(bcs->channel * 2), 32, st5481B_start_xfer, bcs);
                if (adapter->number_of_leds == 4) {
                        if (bcs->channel == 0) {
                                adapter->leds |= B1_LED;
@@ -240,10 +240,10 @@ static void st5481B_mode(struct st5481_bcs *bcs, int mode)
                }
        } else {
                // Disble B channel interrupts
-               st5481_usb_device_ctrl_msg(adapter, FFMSK_B1+(bcs->channel*2), 0, NULL, NULL);
+               st5481_usb_device_ctrl_msg(adapter, FFMSK_B1+(bcs->channel * 2), 0, NULL, NULL);
 
                // Disable B channel FIFOs
-               st5481_usb_device_ctrl_msg(adapter, OUT_B1_COUNTER+(bcs->channel*2), 0, NULL, NULL);
+               st5481_usb_device_ctrl_msg(adapter, OUT_B1_COUNTER+(bcs->channel * 2), 0, NULL, NULL);
 
                if (adapter->number_of_leds == 4) {
                        if (bcs->channel == 0) {
@@ -258,7 +258,7 @@ static void st5481B_mode(struct st5481_bcs *bcs, int mode)
                        dev_kfree_skb_any(b_out->tx_skb);
                        b_out->tx_skb = NULL;
                }
-               
+
        }
 }
 
@@ -268,9 +268,9 @@ static int st5481_setup_b_out(struct st5481_bcs *bcs)
        struct usb_interface *intf;
        struct usb_host_interface *altsetting = NULL;
        struct usb_host_endpoint *endpoint;
-       struct st5481_b_out *b_out = &bcs->b_out;
+       struct st5481_b_out *b_out = &bcs->b_out;
 
-       DBG(4,"");
+       DBG(4, "");
 
        intf = usb_ifnum_to_if(dev, 0);
        if (intf)
@@ -281,11 +281,11 @@ static int st5481_setup_b_out(struct st5481_bcs *bcs)
        // Allocate URBs and buffers for the B channel out
        endpoint = &altsetting->endpoint[EP_B1_OUT - 1 + bcs->channel * 2];
 
-       DBG(4,"endpoint address=%02x,packet size=%d",
+       DBG(4, "endpoint address=%02x,packet size=%d",
            endpoint->desc.bEndpointAddress, le16_to_cpu(endpoint->desc.wMaxPacketSize));
 
        // Allocate memory for 8000bytes/sec + extra bytes if underrun
-       return st5481_setup_isocpipes(b_out->urb, dev, 
+       return st5481_setup_isocpipes(b_out->urb, dev,
                                      usb_sndisocpipe(dev, endpoint->desc.bEndpointAddress),
                                      NUM_ISO_PACKETS_B, SIZE_ISO_PACKETS_B_OUT,
                                      NUM_ISO_PACKETS_B * SIZE_ISO_PACKETS_B_OUT + B_FLOW_ADJUST,
@@ -296,7 +296,7 @@ static void st5481_release_b_out(struct st5481_bcs *bcs)
 {
        struct st5481_b_out *b_out = &bcs->b_out;
 
-       DBG(4,"");
+       DBG(4, "");
 
        st5481_release_isocpipes(b_out->urb);
 }
@@ -305,7 +305,7 @@ int st5481_setup_b(struct st5481_bcs *bcs)
 {
        int retval;
 
-       DBG(4,"");
+       DBG(4, "");
 
        retval = st5481_setup_b_out(bcs);
        if (retval)
@@ -324,9 +324,9 @@ int st5481_setup_b(struct st5481_bcs *bcs)
 
        return 0;
 
- err_b_out:
+err_b_out:
        st5481_release_b_out(bcs);
- err:
+err:
        return retval;
 }
 
@@ -335,7 +335,7 @@ int st5481_setup_b(struct st5481_bcs *bcs)
  */
 void st5481_release_b(struct st5481_bcs *bcs)
 {
-       DBG(4,"");
+       DBG(4, "");
 
        st5481_release_in(&bcs->b_in);
        st5481_release_b_out(bcs);
@@ -365,12 +365,12 @@ void st5481_b_l2l1(struct hisax_if *ifc, int pr, void *arg)
                break;
        case PH_ACTIVATE | REQUEST:
                mode = (long) arg;
-               DBG(4,"B%d,PH_ACTIVATE_REQUEST %ld", bcs->channel + 1, mode);
+               DBG(4, "B%d,PH_ACTIVATE_REQUEST %ld", bcs->channel + 1, mode);
                st5481B_mode(bcs, mode);
                B_L1L2(bcs, PH_ACTIVATE | INDICATION, NULL);
                break;
        case PH_DEACTIVATE | REQUEST:
-               DBG(4,"B%d,PH_DEACTIVATE_REQUEST", bcs->channel + 1);
+               DBG(4, "B%d,PH_DEACTIVATE_REQUEST", bcs->channel + 1);
                st5481B_mode(bcs, L1_MODE_NULL);
                B_L1L2(bcs, PH_DEACTIVATE | INDICATION, NULL);
                break;
index db247b7..e88c5c7 100644 (file)
@@ -4,7 +4,7 @@
  * Author       Frode Isaksen
  * Copyright    2001 by Frode Isaksen      <fisaksen@bewan.com>
  *              2001 by Kai Germaschewski  <kai.germaschewski@gmx.de>
- * 
+ *
  * This software may be used and distributed according to the terms
  * of the GNU General Public License, incorporated herein by reference.
  *
@@ -32,22 +32,22 @@ static char *strL1State[] =
 
 static char *strL1Event[] =
 {
-       "EV_IND_DP",  
-       "EV_IND_1",   
-       "EV_IND_2",   
-       "EV_IND_3",   
-       "EV_IND_RSY", 
-       "EV_IND_5",   
-       "EV_IND_6",   
-       "EV_IND_7",   
-       "EV_IND_AP",  
-       "EV_IND_9",   
-       "EV_IND_10",  
-       "EV_IND_11",  
+       "EV_IND_DP",
+       "EV_IND_1",
+       "EV_IND_2",
+       "EV_IND_3",
+       "EV_IND_RSY",
+       "EV_IND_5",
+       "EV_IND_6",
+       "EV_IND_7",
+       "EV_IND_AP",
+       "EV_IND_9",
+       "EV_IND_10",
+       "EV_IND_11",
        "EV_IND_AI8",
        "EV_IND_AI10",
        "EV_IND_AIL",
-       "EV_IND_DI",  
+       "EV_IND_DI",
        "EV_PH_ACTIVATE_REQ",
        "EV_PH_DEACTIVATE_REQ",
        "EV_TIMER3",
@@ -67,7 +67,7 @@ l1_go_f3(struct FsmInst *fi, int event, void *arg)
 
        if (fi->state == ST_L1_F7)
                ph_disconnect(adapter);
-       
+
        FsmChangeState(fi, ST_L1_F3);
        D_L1L2(adapter, PH_DEACTIVATE | INDICATION, NULL);
 }
@@ -168,11 +168,11 @@ static struct FsmNode L1FnList[] __initdata =
 };
 
 static __printf(2, 3)
-void l1m_debug(struct FsmInst *fi, char *fmt, ...)
+       void l1m_debug(struct FsmInst *fi, char *fmt, ...)
 {
        va_list args;
        char buf[256];
-       
+
        va_start(args, fmt);
        vsnprintf(buf, sizeof(buf), fmt, args);
        DBG(8, "%s", buf);
@@ -191,54 +191,54 @@ void l1m_debug(struct FsmInst *fi, char *fmt, ...)
 
   L1 FRAME    D_OUT_STATE           USB                  D CHANNEL
   --------    -----------           ---                  ---------
-              FIXME
-
- -> [xx..xx]  SHORT_INIT            -> [7Exx..xxC1C27EFF]
-              SHORT_WAIT_DEN        <> OUT_D_COUNTER=16 
-                                                 
-              END_OF_SHORT          <- DEN_EVENT         -> 7Exx
-                                                          xxxx 
-                                                          xxxx
-                                                         xxxx 
-                                                         xxxx
-                                                         xxxx
-                                                         C1C1 
-                                                         7EFF 
-              WAIT_FOR_RESET_IDLE   <- D_UNDERRUN        <- (8ms)                        
-              IDLE                  <> Reset pipe
-
-              
+
+  FIXME
+
+  -> [xx..xx]  SHORT_INIT            -> [7Exx..xxC1C27EFF]
+  SHORT_WAIT_DEN        <> OUT_D_COUNTER=16
+
+  END_OF_SHORT          <- DEN_EVENT         -> 7Exx
+  xxxx
+  xxxx
+  xxxx
+  xxxx
+  xxxx
+  C1C1
+  7EFF
+  WAIT_FOR_RESET_IDLE   <- D_UNDERRUN        <- (8ms)
+  IDLE                  <> Reset pipe
+
+
 
   Transmit long frame (>= 16 bytes of encoded data):
 
   L1 FRAME    D_OUT_STATE           USB                  D CHANNEL
   --------    -----------           ---                  ---------
 
- -> [xx...xx] IDLE
-              WAIT_FOR_STOP         <> OUT_D_COUNTER=0
-              WAIT_FOR_RESET        <> Reset pipe
-             STOP
-             INIT_LONG_FRAME       -> [7Exx..xx]
-              WAIT_DEN              <> OUT_D_COUNTER=16 
-              OUT_NORMAL            <- DEN_EVENT       -> 7Exx
-              END_OF_FRAME_BUSY     -> [xxxx]             xxxx 
-              END_OF_FRAME_NOT_BUSY -> [xxxx]             xxxx
-                                   -> [xxxx]             xxxx 
-                                   -> [C1C2]             xxxx
-                                   -> [7EFF]             xxxx
-                                                         xxxx 
-                                                         xxxx 
-                                                          ....
-                                                         xxxx
-                                                         C1C2
-                                                         7EFF
-                                   <- D_UNDERRUN      <- (> 8ms)                        
-              WAIT_FOR_STOP         <> OUT_D_COUNTER=0
-              WAIT_FOR_RESET        <> Reset pipe
-             STOP
-
-*/          
+  -> [xx...xx] IDLE
+  WAIT_FOR_STOP         <> OUT_D_COUNTER=0
+  WAIT_FOR_RESET        <> Reset pipe
+  STOP
+  INIT_LONG_FRAME       -> [7Exx..xx]
+  WAIT_DEN              <> OUT_D_COUNTER=16
+  OUT_NORMAL            <- DEN_EVENT       -> 7Exx
+  END_OF_FRAME_BUSY     -> [xxxx]             xxxx
+  END_OF_FRAME_NOT_BUSY -> [xxxx]             xxxx
+  -> [xxxx]              xxxx
+  -> [C1C2]              xxxx
+  -> [7EFF]              xxxx
+  xxxx
+  xxxx
+  ....
+  xxxx
+  C1C2
+  7EFF
+  <- D_UNDERRUN      <- (> 8ms)
+  WAIT_FOR_STOP         <> OUT_D_COUNTER=0
+  WAIT_FOR_RESET        <> Reset pipe
+  STOP
+
+*/
 
 static struct Fsm dout_fsm;
 
@@ -254,7 +254,7 @@ static char *strDoutState[] =
        "ST_DOUT_NORMAL",
 
        "ST_DOUT_WAIT_FOR_UNDERRUN",
-        "ST_DOUT_WAIT_FOR_NOT_BUSY",
+       "ST_DOUT_WAIT_FOR_NOT_BUSY",
        "ST_DOUT_WAIT_FOR_STOP",
        "ST_DOUT_WAIT_FOR_RESET",
 };
@@ -271,11 +271,11 @@ static char *strDoutEvent[] =
 };
 
 static __printf(2, 3)
-void dout_debug(struct FsmInst *fi, char *fmt, ...)
+       void dout_debug(struct FsmInst *fi, char *fmt, ...)
 {
        va_list args;
        char buf[256];
-       
+
        va_start(args, fmt);
        vsnprintf(buf, sizeof(buf), fmt, args);
        DBG(0x2, "%s", buf);
@@ -313,19 +313,19 @@ static void usb_d_out(struct st5481_adapter *adapter, int buf_nr)
        skb = d_out->tx_skb;
 
        buf_size = NUM_ISO_PACKETS_D * SIZE_ISO_PACKETS_D_OUT;
-       
+
        if (skb) {
                len = isdnhdlc_encode(&d_out->hdlc_state,
                                      skb->data, skb->len, &bytes_sent,
                                      urb->transfer_buffer, buf_size);
-               skb_pull(skb,bytes_sent);
+               skb_pull(skb, bytes_sent);
        } else {
                // Send flags or idle
                len = isdnhdlc_encode(&d_out->hdlc_state,
                                      NULL, 0, &bytes_sent,
                                      urb->transfer_buffer, buf_size);
        }
-       
+
        if (len < buf_size) {
                FsmChangeState(&d_out->fsm, ST_DOUT_WAIT_FOR_UNDERRUN);
        }
@@ -354,15 +354,15 @@ static void usb_d_out(struct st5481_adapter *adapter, int buf_nr)
        urb->dev = adapter->usb_dev;
        // Need to transmit the next buffer 2ms after the DEN_EVENT
        urb->transfer_flags = 0;
-       urb->start_frame = usb_get_current_frame_number(adapter->usb_dev)+2;
+       urb->start_frame = usb_get_current_frame_number(adapter->usb_dev) + 2;
 
-       DBG_ISO_PACKET(0x20,urb);
+       DBG_ISO_PACKET(0x20, urb);
 
        if (usb_submit_urb(urb, GFP_KERNEL) < 0) {
                // There is another URB queued up
                urb->transfer_flags = URB_ISO_ASAP;
                SUBMIT_URB(urb, GFP_KERNEL);
-       }       
+       }
 }
 
 static void fifo_reseted(void *context)
@@ -377,7 +377,7 @@ static void usb_d_out_complete(struct urb *urb)
        struct st5481_adapter *adapter = urb->context;
        struct st5481_d_out *d_out = &adapter->d_out;
        long buf_nr;
-       
+
        DBG(2, "");
 
        buf_nr = get_buf_nr(d_out->urb, urb);
@@ -385,17 +385,17 @@ static void usb_d_out_complete(struct urb *urb)
 
        if (unlikely(urb->status < 0)) {
                switch (urb->status) {
-                       case -ENOENT:
-                       case -ESHUTDOWN:
-                       case -ECONNRESET:
-                               DBG(1,"urb killed status %d", urb->status);
-                               break;
-                       default: 
-                               WARNING("urb status %d",urb->status);
-                               if (d_out->busy == 0) {
-                                       st5481_usb_pipe_reset(adapter, EP_D_OUT | USB_DIR_OUT, fifo_reseted, adapter);
-                               }
-                               break;
+               case -ENOENT:
+               case -ESHUTDOWN:
+               case -ECONNRESET:
+                       DBG(1, "urb killed status %d", urb->status);
+                       break;
+               default:
+                       WARNING("urb status %d", urb->status);
+                       if (d_out->busy == 0) {
+                               st5481_usb_pipe_reset(adapter, EP_D_OUT | USB_DIR_OUT, fifo_reseted, adapter);
+                       }
+                       break;
                }
                return; // Give up
        }
@@ -417,7 +417,7 @@ static void dout_start_xmit(struct FsmInst *fsm, int event, void *arg)
 
        skb = d_out->tx_skb;
 
-       DBG(2,"len=%d",skb->len);
+       DBG(2, "len=%d", skb->len);
 
        isdnhdlc_out_init(&d_out->hdlc_state, HDLC_DCHANNEL | HDLC_BITREVERSE);
 
@@ -433,7 +433,7 @@ static void dout_start_xmit(struct FsmInst *fsm, int event, void *arg)
                              urb->transfer_buffer, 16);
        skb_pull(skb, bytes_sent);
 
-       if(len < 16)
+       if (len < 16)
                FsmChangeState(&d_out->fsm, ST_DOUT_SHORT_INIT);
        else
                FsmChangeState(&d_out->fsm, ST_DOUT_LONG_INIT);
@@ -455,7 +455,7 @@ static void dout_start_xmit(struct FsmInst *fsm, int event, void *arg)
        urb->dev = adapter->usb_dev;
        urb->transfer_flags = URB_ISO_ASAP;
 
-       DBG_ISO_PACKET(0x20,urb);
+       DBG_ISO_PACKET(0x20, urb);
        SUBMIT_URB(urb, GFP_KERNEL);
 }
 
@@ -480,7 +480,7 @@ static void dout_long_enable_fifo(struct FsmInst *fsm, int event, void *arg)
 {
        struct st5481_adapter *adapter = fsm->userdata;
        struct st5481_d_out *d_out = &adapter->d_out;
-    
+
        st5481_usb_device_ctrl_msg(adapter, OUT_D_COUNTER, 16, NULL, NULL);
        FsmChangeState(&d_out->fsm, ST_DOUT_LONG_WAIT_DEN);
 }
@@ -619,8 +619,8 @@ static void ph_connect(struct st5481_adapter *adapter)
        struct st5481_d_out *d_out = &adapter->d_out;
        struct st5481_in *d_in = &adapter->d_in;
 
-       DBG(8,"");
-               
+       DBG(8, "");
+
        FsmChangeState(&d_out->fsm, ST_DOUT_NONE);
 
        //      st5481_usb_device_ctrl_msg(adapter, FFMSK_D, OUT_UNDERRUN, NULL, NULL);
@@ -644,7 +644,7 @@ static void ph_connect(struct st5481_adapter *adapter)
  */
 static void ph_disconnect(struct st5481_adapter *adapter)
 {
-       DBG(8,"");
+       DBG(8, "");
 
        st5481_in_mode(&adapter->d_in, L1_MODE_NULL);
 
@@ -661,7 +661,7 @@ static int st5481_setup_d_out(struct st5481_adapter *adapter)
        struct usb_host_endpoint *endpoint;
        struct st5481_d_out *d_out = &adapter->d_out;
 
-       DBG(2,"");
+       DBG(2, "");
 
        intf = usb_ifnum_to_if(dev, 0);
        if (intf)
@@ -672,10 +672,10 @@ static int st5481_setup_d_out(struct st5481_adapter *adapter)
        // Allocate URBs and buffers for the D channel out
        endpoint = &altsetting->endpoint[EP_D_OUT-1];
 
-       DBG(2,"endpoint address=%02x,packet size=%d",
+       DBG(2, "endpoint address=%02x,packet size=%d",
            endpoint->desc.bEndpointAddress, le16_to_cpu(endpoint->desc.wMaxPacketSize));
 
-       return st5481_setup_isocpipes(d_out->urb, dev, 
+       return st5481_setup_isocpipes(d_out->urb, dev,
                                      usb_sndisocpipe(dev, endpoint->desc.bEndpointAddress),
                                      NUM_ISO_PACKETS_D, SIZE_ISO_PACKETS_D_OUT,
                                      NUM_ISO_PACKETS_D * SIZE_ISO_PACKETS_D_OUT,
@@ -686,7 +686,7 @@ static void st5481_release_d_out(struct st5481_adapter *adapter)
 {
        struct st5481_d_out *d_out = &adapter->d_out;
 
-       DBG(2,"");
+       DBG(2, "");
 
        st5481_release_isocpipes(d_out->urb);
 }
@@ -695,7 +695,7 @@ int st5481_setup_d(struct st5481_adapter *adapter)
 {
        int retval;
 
-       DBG(2,"");
+       DBG(2, "");
 
        retval = st5481_setup_d_out(adapter);
        if (retval)
@@ -726,15 +726,15 @@ int st5481_setup_d(struct st5481_adapter *adapter)
 
        return 0;
 
- err_d_out:
+err_d_out:
        st5481_release_d_out(adapter);
- err:
+err:
        return retval;
 }
 
 void st5481_release_d(struct st5481_adapter *adapter)
 {
-       DBG(2,"");
+       DBG(2, "");
 
        st5481_release_in(&adapter->d_in);
        st5481_release_d_out(adapter);
@@ -766,9 +766,9 @@ int __init st5481_d_init(void)
 
        return 0;
 
- err_l1:
+err_l1:
        FsmFree(&l1fsm);
- err:
+err:
        return retval;
 }
 
index 9f7fd18..100296e 100644 (file)
@@ -4,13 +4,13 @@
  * Author       Frode Isaksen
  * Copyright    2001 by Frode Isaksen      <fisaksen@bewan.com>
  *              2001 by Kai Germaschewski  <kai.germaschewski@gmx.de>
- * 
+ *
  * This software may be used and distributed according to the terms
  * of the GNU General Public License, incorporated herein by reference.
  *
  */
 
-/* 
+/*
  * TODO:
  *
  * b layer1 delay?
@@ -63,9 +63,9 @@ static int probe_st5481(struct usb_interface *intf,
        int retval, i;
 
        printk(KERN_INFO "st541: found adapter VendorId %04x, ProductId %04x, LEDs %d\n",
-            le16_to_cpu(dev->descriptor.idVendor),
-            le16_to_cpu(dev->descriptor.idProduct),
-            number_of_leds);
+              le16_to_cpu(dev->descriptor.idVendor),
+              le16_to_cpu(dev->descriptor.idProduct),
+              number_of_leds);
 
        adapter = kzalloc(sizeof(struct st5481_adapter), GFP_KERNEL);
        if (!adapter)
@@ -105,7 +105,7 @@ static int probe_st5481(struct usb_interface *intf,
                b_if[i] = &adapter->bcs[i].b_if;
 
        if (hisax_register(&adapter->hisax_d_if, b_if, "st5481_usb",
-                       protocol) != 0)
+                          protocol) != 0)
                goto err_b1;
 
        st5481_start(adapter);
@@ -113,15 +113,15 @@ static int probe_st5481(struct usb_interface *intf,
        usb_set_intfdata(intf, adapter);
        return 0;
 
- err_b1:
+err_b1:
        st5481_release_b(&adapter->bcs[1]);
- err_b:
+err_b:
        st5481_release_b(&adapter->bcs[0]);
- err_d:
+err_d:
        st5481_release_d(adapter);
- err_usb:
+err_usb:
        st5481_release_usb(adapter);
- err:
+err:
        kfree(adapter);
        return -EIO;
 }
@@ -134,12 +134,12 @@ static void disconnect_st5481(struct usb_interface *intf)
 {
        struct st5481_adapter *adapter = usb_get_intfdata(intf);
 
-       DBG(1,"");
+       DBG(1, "");
 
        usb_set_intfdata(intf, NULL);
        if (!adapter)
                return;
-       
+
        st5481_stop(adapter);
        st5481_release_b(&adapter->bcs[1]);
        st5481_release_b(&adapter->bcs[0]);
@@ -157,25 +157,25 @@ static void disconnect_st5481(struct usb_interface *intf)
  * The last 4 bits in the Product Id is set with 4 pins on the chip.
  */
 static struct usb_device_id st5481_ids[] = {
-       { USB_DEVICE(ST_VENDOR_ID, ST5481_PRODUCT_ID+0x0) },
-       { USB_DEVICE(ST_VENDOR_ID, ST5481_PRODUCT_ID+0x1) },
-       { USB_DEVICE(ST_VENDOR_ID, ST5481_PRODUCT_ID+0x2) },
-       { USB_DEVICE(ST_VENDOR_ID, ST5481_PRODUCT_ID+0x3) },
-       { USB_DEVICE(ST_VENDOR_ID, ST5481_PRODUCT_ID+0x4) },
-       { USB_DEVICE(ST_VENDOR_ID, ST5481_PRODUCT_ID+0x5) },
-       { USB_DEVICE(ST_VENDOR_ID, ST5481_PRODUCT_ID+0x6) },
-       { USB_DEVICE(ST_VENDOR_ID, ST5481_PRODUCT_ID+0x7) },
-       { USB_DEVICE(ST_VENDOR_ID, ST5481_PRODUCT_ID+0x8) },
-       { USB_DEVICE(ST_VENDOR_ID, ST5481_PRODUCT_ID+0x9) },
-       { USB_DEVICE(ST_VENDOR_ID, ST5481_PRODUCT_ID+0xA) },
-       { USB_DEVICE(ST_VENDOR_ID, ST5481_PRODUCT_ID+0xB) },
-       { USB_DEVICE(ST_VENDOR_ID, ST5481_PRODUCT_ID+0xC) },
-       { USB_DEVICE(ST_VENDOR_ID, ST5481_PRODUCT_ID+0xD) },
-       { USB_DEVICE(ST_VENDOR_ID, ST5481_PRODUCT_ID+0xE) },
-       { USB_DEVICE(ST_VENDOR_ID, ST5481_PRODUCT_ID+0xF) },
+       { USB_DEVICE(ST_VENDOR_ID, ST5481_PRODUCT_ID + 0x0) },
+       { USB_DEVICE(ST_VENDOR_ID, ST5481_PRODUCT_ID + 0x1) },
+       { USB_DEVICE(ST_VENDOR_ID, ST5481_PRODUCT_ID + 0x2) },
+       { USB_DEVICE(ST_VENDOR_ID, ST5481_PRODUCT_ID + 0x3) },
+       { USB_DEVICE(ST_VENDOR_ID, ST5481_PRODUCT_ID + 0x4) },
+       { USB_DEVICE(ST_VENDOR_ID, ST5481_PRODUCT_ID + 0x5) },
+       { USB_DEVICE(ST_VENDOR_ID, ST5481_PRODUCT_ID + 0x6) },
+       { USB_DEVICE(ST_VENDOR_ID, ST5481_PRODUCT_ID + 0x7) },
+       { USB_DEVICE(ST_VENDOR_ID, ST5481_PRODUCT_ID + 0x8) },
+       { USB_DEVICE(ST_VENDOR_ID, ST5481_PRODUCT_ID + 0x9) },
+       { USB_DEVICE(ST_VENDOR_ID, ST5481_PRODUCT_ID + 0xA) },
+       { USB_DEVICE(ST_VENDOR_ID, ST5481_PRODUCT_ID + 0xB) },
+       { USB_DEVICE(ST_VENDOR_ID, ST5481_PRODUCT_ID + 0xC) },
+       { USB_DEVICE(ST_VENDOR_ID, ST5481_PRODUCT_ID + 0xD) },
+       { USB_DEVICE(ST_VENDOR_ID, ST5481_PRODUCT_ID + 0xE) },
+       { USB_DEVICE(ST_VENDOR_ID, ST5481_PRODUCT_ID + 0xF) },
        { }
 };
-MODULE_DEVICE_TABLE (usb, st5481_ids);
+MODULE_DEVICE_TABLE(usb, st5481_ids);
 
 static struct usb_driver st5481_usb_driver = {
        .name =         "st5481_usb",
@@ -204,9 +204,9 @@ static int __init st5481_usb_init(void)
 
        return 0;
 
- out_d_exit:
+out_d_exit:
        st5481_d_exit();
- out:
+out:
        return retval;
 }
 
index 159e8fa..017c67e 100644 (file)
@@ -4,7 +4,7 @@
  * Author       Frode Isaksen
  * Copyright    2001 by Frode Isaksen      <fisaksen@bewan.com>
  *              2001 by Kai Germaschewski  <kai.germaschewski@gmx.de>
- * 
+ *
  * This software may be used and distributed according to the terms
  * of the GNU General Public License, incorporated herein by reference.
  *
@@ -36,13 +36,13 @@ static void usb_next_ctrl_msg(struct urb *urb,
        }
 
        if ((r_index = fifo_remove(&ctrl->msg_fifo.f)) < 0) {
-               test_and_clear_bit(0,&ctrl->busy);
+               test_and_clear_bit(0, &ctrl->busy);
                return;
-       } 
-       urb->setup_packet = 
+       }
+       urb->setup_packet =
                (unsigned char *)&ctrl->msg_fifo.data[r_index];
-       
-       DBG(1,"request=0x%02x,value=0x%04x,index=%x",
+
+       DBG(1, "request=0x%02x,value=0x%04x,index=%x",
            ((struct ctrl_msg *)urb->setup_packet)->dr.bRequest,
            ((struct ctrl_msg *)urb->setup_packet)->dr.wValue,
            ((struct ctrl_msg *)urb->setup_packet)->dr.wIndex);
@@ -64,13 +64,13 @@ static void usb_ctrl_msg(struct st5481_adapter *adapter,
        struct st5481_ctrl *ctrl = &adapter->ctrl;
        int w_index;
        struct ctrl_msg *ctrl_msg;
-       
+
        if ((w_index = fifo_add(&ctrl->msg_fifo.f)) < 0) {
                WARNING("control msg FIFO full");
                return;
        }
-       ctrl_msg = &ctrl->msg_fifo.data[w_index]; 
-   
+       ctrl_msg = &ctrl->msg_fifo.data[w_index];
+
        ctrl_msg->dr.bRequestType = requesttype;
        ctrl_msg->dr.bRequest = request;
        ctrl_msg->dr.wValue = cpu_to_le16p(&value);
@@ -86,11 +86,11 @@ static void usb_ctrl_msg(struct st5481_adapter *adapter,
  * Asynchronous endpoint 0 device request.
  */
 void st5481_usb_device_ctrl_msg(struct st5481_adapter *adapter,
-                        u8 request, u16 value,
-                        ctrl_complete_t complete, void *context)
+                               u8 request, u16 value,
+                               ctrl_complete_t complete, void *context)
 {
-       usb_ctrl_msg(adapter, request, 
-                    USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE, 
+       usb_ctrl_msg(adapter, request,
+                    USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
                     value, 0, complete, context);
 }
 
@@ -98,10 +98,10 @@ void st5481_usb_device_ctrl_msg(struct st5481_adapter *adapter,
  * Asynchronous pipe reset (async version of usb_clear_halt).
  */
 void st5481_usb_pipe_reset(struct st5481_adapter *adapter,
-                   u_char pipe,
-                   ctrl_complete_t complete, void *context)
+                          u_char pipe,
+                          ctrl_complete_t complete, void *context)
 {
-       DBG(1,"pipe=%02x",pipe);
+       DBG(1, "pipe=%02x", pipe);
 
        usb_ctrl_msg(adapter,
                     USB_REQ_CLEAR_FEATURE, USB_DIR_OUT | USB_RECIP_ENDPOINT,
@@ -115,7 +115,7 @@ void st5481_usb_pipe_reset(struct st5481_adapter *adapter,
 
 void st5481_ph_command(struct st5481_adapter *adapter, unsigned int command)
 {
-       DBG(8,"command=%s", ST5481_CMD_string(command));
+       DBG(8, "command=%s", ST5481_CMD_string(command));
 
        st5481_usb_device_ctrl_msg(adapter, TXCI, command, NULL, NULL);
 }
@@ -130,33 +130,33 @@ static void usb_ctrl_complete(struct urb *urb)
        struct st5481_adapter *adapter = urb->context;
        struct st5481_ctrl *ctrl = &adapter->ctrl;
        struct ctrl_msg *ctrl_msg;
-       
+
        if (unlikely(urb->status < 0)) {
                switch (urb->status) {
-                       case -ENOENT:
-                       case -ESHUTDOWN:
-                       case -ECONNRESET:
-                               DBG(1,"urb killed status %d", urb->status);
-                               return; // Give up
-                       default: 
-                               WARNING("urb status %d",urb->status);
-                               break;
+               case -ENOENT:
+               case -ESHUTDOWN:
+               case -ECONNRESET:
+                       DBG(1, "urb killed status %d", urb->status);
+                       return; // Give up
+               default:
+                       WARNING("urb status %d", urb->status);
+                       break;
                }
        }
 
        ctrl_msg = (struct ctrl_msg *)urb->setup_packet;
-       
+
        if (ctrl_msg->dr.bRequest == USB_REQ_CLEAR_FEATURE) {
-               /* Special case handling for pipe reset */
+               /* Special case handling for pipe reset */
                le16_to_cpus(&ctrl_msg->dr.wIndex);
                usb_reset_endpoint(adapter->usb_dev, ctrl_msg->dr.wIndex);
        }
-       
+
        if (ctrl_msg->complete)
                ctrl_msg->complete(ctrl_msg->context);
 
        clear_bit(0, &ctrl->busy);
-       
+
        // Try to send next control message
        usb_next_ctrl_msg(urb, adapter);
        return;
@@ -181,23 +181,23 @@ static void usb_int_complete(struct urb *urb)
        int status;
 
        switch (urb->status) {
-               case 0:
-                       /* success */
-                       break;
-               case -ECONNRESET:
-               case -ENOENT:
-               case -ESHUTDOWN:
-                       /* this urb is terminated, clean up */
-                       DBG(2, "urb shutting down with status: %d", urb->status);
-                       return;
-               default:
-                       WARNING("nonzero urb status received: %d", urb->status);
-                       goto exit;
+       case 0:
+               /* success */
+               break;
+       case -ECONNRESET:
+       case -ENOENT:
+       case -ESHUTDOWN:
+               /* this urb is terminated, clean up */
+               DBG(2, "urb shutting down with status: %d", urb->status);
+               return;
+       default:
+               WARNING("nonzero urb status received: %d", urb->status);
+               goto exit;
        }
 
-       
+
        DBG_PACKET(2, data, INT_PKT_SIZE);
-               
+
        if (urb->actual_length == 0) {
                goto exit;
        }
@@ -214,7 +214,7 @@ static void usb_int_complete(struct urb *urb)
                FsmEvent(&adapter->d_out.fsm, EV_DOUT_UNDERRUN, NULL);
 
        if (irqbyte & OUT_DOWN)
-;//            printk("OUT_DOWN\n");
+               ;//             printk("OUT_DOWN\n");
 
        irqbyte = data[MPINT];
        if (irqbyte & RXCI_INT)
@@ -226,7 +226,7 @@ static void usb_int_complete(struct urb *urb)
        urb->actual_length = 0;
 
 exit:
-       status = usb_submit_urb (urb, GFP_ATOMIC);
+       status = usb_submit_urb(urb, GFP_ATOMIC);
        if (status)
                WARNING("usb_submit_urb failed with result %d", status);
 }
@@ -246,11 +246,11 @@ int st5481_setup_usb(struct st5481_adapter *adapter)
        int status;
        struct urb *urb;
        u8 *buf;
-       
-       DBG(2,"");
-       
-       if ((status = usb_reset_configuration (dev)) < 0) {
-               WARNING("reset_configuration failed,status=%d",status);
+
+       DBG(2, "");
+
+       if ((status = usb_reset_configuration(dev)) < 0) {
+               WARNING("reset_configuration failed,status=%d", status);
                return status;
        }
 
@@ -261,7 +261,7 @@ int st5481_setup_usb(struct st5481_adapter *adapter)
                return -ENXIO;
 
        // Check if the config is sane
-       if ( altsetting->desc.bNumEndpoints != 7 ) {
+       if (altsetting->desc.bNumEndpoints != 7) {
                WARNING("expecting 7 got %d endpoints!", altsetting->desc.bNumEndpoints);
                return -EINVAL;
        }
@@ -271,8 +271,8 @@ int st5481_setup_usb(struct st5481_adapter *adapter)
        altsetting->endpoint[4].desc.wMaxPacketSize = __constant_cpu_to_le16(32);
 
        // Use alternative setting 3 on interface 0 to have 2B+D
-       if ((status = usb_set_interface (dev, 0, 3)) < 0) {
-               WARNING("usb_set_interface failed,status=%d",status);
+       if ((status = usb_set_interface(dev, 0, 3)) < 0) {
+               WARNING("usb_set_interface failed,status=%d", status);
                return status;
        }
 
@@ -282,36 +282,36 @@ int st5481_setup_usb(struct st5481_adapter *adapter)
                return -ENOMEM;
        }
        ctrl->urb = urb;
-       
+
        // Fill the control URB
-       usb_fill_control_urb (urb, dev, 
-                         usb_sndctrlpipe(dev, 0),
-                         NULL, NULL, 0, usb_ctrl_complete, adapter);
+       usb_fill_control_urb(urb, dev,
+                            usb_sndctrlpipe(dev, 0),
+                            NULL, NULL, 0, usb_ctrl_complete, adapter);
+
 
-               
        fifo_init(&ctrl->msg_fifo.f, ARRAY_SIZE(ctrl->msg_fifo.data));
 
        // Allocate URBs and buffers for interrupt endpoint
        urb = usb_alloc_urb(0, GFP_KERNEL);
-       if (!urb) { 
+       if (!urb) {
                return -ENOMEM;
        }
        intr->urb = urb;
-       
+
        buf = kmalloc(INT_PKT_SIZE, GFP_KERNEL);
        if (!buf) {
                return -ENOMEM;
        }
 
        endpoint = &altsetting->endpoint[EP_INT-1];
-                               
+
        // Fill the interrupt URB
        usb_fill_int_urb(urb, dev,
-                    usb_rcvintpipe(dev, endpoint->desc.bEndpointAddress),
-                    buf, INT_PKT_SIZE,
-                    usb_int_complete, adapter,
-                    endpoint->desc.bInterval);
-               
+                        usb_rcvintpipe(dev, endpoint->desc.bEndpointAddress),
+                        buf, INT_PKT_SIZE,
+                        usb_int_complete, adapter,
+                        endpoint->desc.bInterval);
+
        return 0;
 }
 
@@ -324,7 +324,7 @@ void st5481_release_usb(struct st5481_adapter *adapter)
        struct st5481_intr *intr = &adapter->intr;
        struct st5481_ctrl *ctrl = &adapter->ctrl;
 
-       DBG(1,"");
+       DBG(1, "");
 
        // Stop and free Control and Interrupt URBs
        usb_kill_urb(ctrl->urb);
@@ -343,33 +343,33 @@ void st5481_release_usb(struct st5481_adapter *adapter)
  */
 void st5481_start(struct st5481_adapter *adapter)
 {
-       static const u8 init_cmd_table[]={
-               SET_DEFAULT,0,
-               STT,0,
-               SDA_MIN,0x0d,
-               SDA_MAX,0x29,
-               SDELAY_VALUE,0x14,
-               GPIO_DIR,0x01,          
-               GPIO_OUT,RED_LED,
+       static const u8 init_cmd_table[] = {
+               SET_DEFAULT, 0,
+               STT, 0,
+               SDA_MIN, 0x0d,
+               SDA_MAX, 0x29,
+               SDELAY_VALUE, 0x14,
+               GPIO_DIR, 0x01,
+               GPIO_OUT, RED_LED,
 //             FFCTRL_OUT_D,4,
 //             FFCTRH_OUT_D,12,
-               FFCTRL_OUT_B1,6,
-               FFCTRH_OUT_B1,20,
-               FFCTRL_OUT_B2,6,
-               FFCTRH_OUT_B2,20,
-               MPMSK,RXCI_INT+DEN_INT+DCOLL_INT,
+               FFCTRL_OUT_B1, 6,
+               FFCTRH_OUT_B1, 20,
+               FFCTRL_OUT_B2, 6,
+               FFCTRH_OUT_B2, 20,
+               MPMSK, RXCI_INT + DEN_INT + DCOLL_INT,
                0
-       };      
+       };
        struct st5481_intr *intr = &adapter->intr;
        int i = 0;
-       u8 request,value;
+       u8 request, value;
 
-       DBG(8,"");
+       DBG(8, "");
 
-       adapter->leds = RED_LED; 
+       adapter->leds = RED_LED;
 
        // Start receiving on the interrupt endpoint
-       SUBMIT_URB(intr->urb, GFP_KERNEL); 
+       SUBMIT_URB(intr->urb, GFP_KERNEL);
 
        while ((request = init_cmd_table[i++])) {
                value = init_cmd_table[i++];
@@ -383,7 +383,7 @@ void st5481_start(struct st5481_adapter *adapter)
  */
 void st5481_stop(struct st5481_adapter *adapter)
 {
-       DBG(8,"");
+       DBG(8, "");
 
        st5481_usb_device_ctrl_msg(adapter, SET_DEFAULT, 0, NULL, NULL);
 }
@@ -394,22 +394,22 @@ void st5481_stop(struct st5481_adapter *adapter)
 
 static void
 fill_isoc_urb(struct urb *urb, struct usb_device *dev,
-             unsigned int pipe, void *buf, int num_packets, 
+             unsigned int pipe, void *buf, int num_packets,
              int packet_size, usb_complete_t complete,
-             void *context) 
+             void *context)
 {
        int k;
 
-       urb->dev=dev;
-       urb->pipe=pipe;
+       urb->dev = dev;
+       urb->pipe = pipe;
        urb->interval = 1;
-       urb->transfer_buffer=buf;
+       urb->transfer_buffer = buf;
        urb->number_of_packets = num_packets;
-       urb->transfer_buffer_length=num_packets*packet_size;
+       urb->transfer_buffer_length = num_packets * packet_size;
        urb->actual_length = 0;
-       urb->complete=complete;
-       urb->context=context;
-       urb->transfer_flags=URB_ISO_ASAP;
+       urb->complete = complete;
+       urb->context = context;
+       urb->transfer_flags = URB_ISO_ASAP;
        for (k = 0; k < num_packets; k++) {
                urb->iso_frame_desc[k].offset = packet_size * k;
                urb->iso_frame_desc[k].length = packet_size;
@@ -418,10 +418,10 @@ fill_isoc_urb(struct urb *urb, struct usb_device *dev,
 }
 
 int
-st5481_setup_isocpipes(struct urb* urb[2], struct usb_device *dev, 
-                          unsigned int pipe, int num_packets,
-                          int packet_size, int buf_size,
-                          usb_complete_t complete, void *context)
+st5481_setup_isocpipes(struct urb *urb[2], struct usb_device *dev,
+                      unsigned int pipe, int num_packets,
+                      int packet_size, int buf_size,
+                      usb_complete_t complete, void *context)
 {
        int j, retval;
        unsigned char *buf;
@@ -436,15 +436,15 @@ st5481_setup_isocpipes(struct urb* urb[2], struct usb_device *dev,
                buf = kmalloc(buf_size, GFP_KERNEL);
                if (!buf)
                        goto err;
-                       
+
                // Fill the isochronous URB
-               fill_isoc_urb(urb[j], dev, pipe, buf, 
+               fill_isoc_urb(urb[j], dev, pipe, buf,
                              num_packets, packet_size, complete,
                              context);
        }
        return 0;
 
- err:
+err:
        for (j = 0; j < 2; j++) {
                if (urb[j]) {
                        kfree(urb[j]->transfer_buffer);
@@ -456,7 +456,7 @@ st5481_setup_isocpipes(struct urb* urb[2], struct usb_device *dev,
        return retval;
 }
 
-void st5481_release_isocpipes(struct urb* urb[2])
+void st5481_release_isocpipes(struct urb *urb[2])
 {
        int j;
 
@@ -471,8 +471,8 @@ void st5481_release_isocpipes(struct urb* urb[2])
 /*
  * Decode frames received on the B/D channel.
  * Note that this function will be called continuously
- * with 64Kbit/s / 16Kbit/s of data and hence it will be 
- * called 50 times per second with 20 ISOC descriptors. 
+ * with 64Kbit/s / 16Kbit/s of data and hence it will be
+ * called 50 times per second with 20 ISOC descriptors.
  * Called at interrupt.
  */
 static void usb_in_complete(struct urb *urb)
@@ -484,18 +484,18 @@ static void usb_in_complete(struct urb *urb)
 
        if (unlikely(urb->status < 0)) {
                switch (urb->status) {
-                       case -ENOENT:
-                       case -ESHUTDOWN:
-                       case -ECONNRESET:
-                               DBG(1,"urb killed status %d", urb->status);
-                               return; // Give up
-                       default: 
-                               WARNING("urb status %d",urb->status);
-                               break;
+               case -ENOENT:
+               case -ESHUTDOWN:
+               case -ECONNRESET:
+                       DBG(1, "urb killed status %d", urb->status);
+                       return; // Give up
+               default:
+                       WARNING("urb status %d", urb->status);
+                       break;
                }
        }
 
-       DBG_ISO_PACKET(0x80,urb);
+       DBG_ISO_PACKET(0x80, urb);
 
        len = st5481_isoc_flatten(urb);
        ptr = urb->transfer_buffer;
@@ -506,14 +506,14 @@ static void usb_in_complete(struct urb *urb)
                        len = 0;
                } else {
                        status = isdnhdlc_decode(&in->hdlc_state, ptr, len, &count,
-                               in->rcvbuf, in->bufsize);
+                                                in->rcvbuf, in->bufsize);
                        ptr += count;
                        len -= count;
                }
-               
+
                if (status > 0) {
                        // Good frame received
-                       DBG(4,"count=%d",status);
+                       DBG(4, "count=%d", status);
                        DBG_PACKET(0x400, in->rcvbuf, status);
                        if (!(skb = dev_alloc_skb(status))) {
                                WARNING("receive out of memory\n");
@@ -542,14 +542,14 @@ int st5481_setup_in(struct st5481_in *in)
        struct usb_device *dev = in->adapter->usb_dev;
        int retval;
 
-       DBG(4,"");
+       DBG(4, "");
 
        in->rcvbuf = kmalloc(in->bufsize, GFP_KERNEL);
        retval = -ENOMEM;
        if (!in->rcvbuf)
                goto err;
 
-       retval = st5481_setup_isocpipes(in->urb, dev, 
+       retval = st5481_setup_isocpipes(in->urb, dev,
                                        usb_rcvisocpipe(dev, in->ep),
                                        in->num_packets,  in->packet_size,
                                        in->num_packets * in->packet_size,
@@ -558,51 +558,51 @@ int st5481_setup_in(struct st5481_in *in)
                goto err_free;
        return 0;
 
- err_free:
+err_free:
        kfree(in->rcvbuf);
- err:
+err:
        return retval;
 }
 
 void st5481_release_in(struct st5481_in *in)
 {
-       DBG(2,"");
+       DBG(2, "");
 
        st5481_release_isocpipes(in->urb);
 }
 
 /*
  * Make the transfer_buffer contiguous by
- * copying from the iso descriptors if necessary. 
+ * copying from the iso descriptors if necessary.
  */
 static int st5481_isoc_flatten(struct urb *urb)
 {
-       struct usb_iso_packet_descriptor *pipd,*pend;
-       unsigned char *src,*dst;
+       struct usb_iso_packet_descriptor *pipd, *pend;
+       unsigned char *src, *dst;
        unsigned int len;
-       
+
        if (urb->status < 0) {
                return urb->status;
        }
        for (pipd = &urb->iso_frame_desc[0],
                     pend = &urb->iso_frame_desc[urb->number_of_packets],
-                    dst = urb->transfer_buffer; 
-            pipd < pend; 
+                    dst = urb->transfer_buffer;
+            pipd < pend;
             pipd++) {
-               
+
                if (pipd->status < 0) {
                        return (pipd->status);
                }
-       
+
                len = pipd->actual_length;
                pipd->actual_length = 0;
-               src = urb->transfer_buffer+pipd->offset;
+               src = urb->transfer_buffer + pipd->offset;
 
                if (src != dst) {
                        // Need to copy since isoc buffers not full
                        while (len--) {
                                *dst++ = *src++;
-                       }                       
+                       }
                } else {
                        // No need to copy, just update destination buffer
                        dst += len;
@@ -617,7 +617,7 @@ static void st5481_start_rcv(void *context)
        struct st5481_in *in = context;
        struct st5481_adapter *adapter = in->adapter;
 
-       DBG(4,"");
+       DBG(4, "");
 
        in->urb[0]->dev = adapter->usb_dev;
        SUBMIT_URB(in->urb[0], GFP_KERNEL);
@@ -654,4 +654,3 @@ void st5481_in_mode(struct st5481_in *in, int mode)
                                           0, NULL, NULL);
        }
 }
-
index 842f9c9..9195f9f 100644 (file)
@@ -3,7 +3,7 @@
  * Author       Karsten Keil
  *              based on the teles driver from Jan den Ouden
  * Copyright    by Karsten Keil      <keil@isdn4linux.de>
- * 
+ *
  * This software may be used and distributed according to the terms
  * of the GNU General Public License, incorporated herein by reference.
  *
@@ -43,7 +43,7 @@ enum {
        ST_TEI_IDVERIFY,
 };
 
-#define TEI_STATE_COUNT (ST_TEI_IDVERIFY+1)
+#define TEI_STATE_COUNT (ST_TEI_IDVERIFY + 1)
 
 static char *strTeiState[] =
 {
@@ -62,7 +62,7 @@ enum {
        EV_T202,
 };
 
-#define TEI_EVENT_COUNT (EV_T202+1)
+#define TEI_EVENT_COUNT (EV_T202 + 1)
 
 static char *strTeiEvent[] =
 {
@@ -130,14 +130,14 @@ tei_id_request(struct FsmInst *fi, int event, void *arg)
 
        if (st->l2.tei != -1) {
                st->ma.tei_m.printdebug(&st->ma.tei_m,
-                       "assign request for already asigned tei %d",
-                       st->l2.tei);
+                                       "assign request for already assigned tei %d",
+                                       st->l2.tei);
                return;
        }
        st->ma.ri = random_ri();
        if (st->ma.debug)
                st->ma.tei_m.printdebug(&st->ma.tei_m,
-                       "assign request ri %d", st->ma.ri);
+                                       "assign request ri %d", st->ma.ri);
        put_tei_msg(st, ID_REQUEST, st->ma.ri, 127);
        FsmChangeState(&st->ma.tei_m, ST_TEI_IDREQ);
        FsmAddTimer(&st->ma.t202, st->ma.T202, EV_T202, NULL, 1);
@@ -156,11 +156,11 @@ tei_id_assign(struct FsmInst *fi, int event, void *arg)
        tei = skb->data[4] >> 1;
        if (st->ma.debug)
                st->ma.tei_m.printdebug(&st->ma.tei_m,
-                       "identity assign ri %d tei %d", ri, tei);
+                                       "identity assign ri %d tei %d", ri, tei);
        if ((ost = findtei(st, tei))) { /* same tei is in use */
                if (ri != ost->ma.ri) {
                        st->ma.tei_m.printdebug(&st->ma.tei_m,
-                               "possible duplicate assignment tei %d", tei);
+                                               "possible duplicate assignment tei %d", tei);
                        ost->l2.l2tei(ost, MDL_ERROR | RESPONSE, NULL);
                }
        } else if (ri == st->ma.ri) {
@@ -183,14 +183,14 @@ tei_id_test_dup(struct FsmInst *fi, int event, void *arg)
        tei = skb->data[4] >> 1;
        if (st->ma.debug)
                st->ma.tei_m.printdebug(&st->ma.tei_m,
-                       "foreign identity assign ri %d tei %d", ri, tei);
+                                       "foreign identity assign ri %d tei %d", ri, tei);
        if ((ost = findtei(st, tei))) { /* same tei is in use */
                if (ri != ost->ma.ri) { /* and it wasn't our request */
                        st->ma.tei_m.printdebug(&st->ma.tei_m,
-                               "possible duplicate assignment tei %d", tei);
+                                               "possible duplicate assignment tei %d", tei);
                        FsmEvent(&ost->ma.tei_m, EV_VERIFY, NULL);
                }
-       } 
+       }
 }
 
 static void
@@ -204,7 +204,7 @@ tei_id_denied(struct FsmInst *fi, int event, void *arg)
        tei = skb->data[4] >> 1;
        if (st->ma.debug)
                st->ma.tei_m.printdebug(&st->ma.tei_m,
-                       "identity denied ri %d tei %d", ri, tei);
+                                       "identity denied ri %d tei %d", ri, tei);
 }
 
 static void
@@ -217,7 +217,7 @@ tei_id_chk_req(struct FsmInst *fi, int event, void *arg)
        tei = skb->data[4] >> 1;
        if (st->ma.debug)
                st->ma.tei_m.printdebug(&st->ma.tei_m,
-                       "identity check req tei %d", tei);
+                                       "identity check req tei %d", tei);
        if ((st->l2.tei != -1) && ((tei == GROUP_TEI) || (tei == st->l2.tei))) {
                FsmDelTimer(&st->ma.t202, 4);
                FsmChangeState(&st->ma.tei_m, ST_TEI_NOP);
@@ -236,7 +236,7 @@ tei_id_remove(struct FsmInst *fi, int event, void *arg)
        tei = skb->data[4] >> 1;
        if (st->ma.debug)
                st->ma.tei_m.printdebug(&st->ma.tei_m,
-                       "identity remove tei %d", tei);
+                                       "identity remove tei %d", tei);
        if ((st->l2.tei != -1) && ((tei == GROUP_TEI) || (tei == st->l2.tei))) {
                FsmDelTimer(&st->ma.t202, 5);
                FsmChangeState(&st->ma.tei_m, ST_TEI_NOP);
@@ -253,7 +253,7 @@ tei_id_verify(struct FsmInst *fi, int event, void *arg)
 
        if (st->ma.debug)
                st->ma.tei_m.printdebug(&st->ma.tei_m,
-                       "id verify request for tei %d", st->l2.tei);
+                                       "id verify request for tei %d", st->l2.tei);
        put_tei_msg(st, ID_VERIFY, 0, st->l2.tei);
        FsmChangeState(&st->ma.tei_m, ST_TEI_IDVERIFY);
        FsmAddTimer(&st->ma.t202, st->ma.T202, EV_T202, NULL, 2);
@@ -270,8 +270,8 @@ tei_id_req_tout(struct FsmInst *fi, int event, void *arg)
                st->ma.ri = random_ri();
                if (st->ma.debug)
                        st->ma.tei_m.printdebug(&st->ma.tei_m,
-                               "assign req(%d) ri %d", 4 - st->ma.N202,
-                               st->ma.ri);
+                                               "assign req(%d) ri %d", 4 - st->ma.N202,
+                                               st->ma.ri);
                put_tei_msg(st, ID_REQUEST, st->ma.ri, 127);
                FsmAddTimer(&st->ma.t202, st->ma.T202, EV_T202, NULL, 3);
        } else {
@@ -292,13 +292,13 @@ tei_id_ver_tout(struct FsmInst *fi, int event, void *arg)
        if (--st->ma.N202) {
                if (st->ma.debug)
                        st->ma.tei_m.printdebug(&st->ma.tei_m,
-                               "id verify req(%d) for tei %d",
-                               3 - st->ma.N202, st->l2.tei);
+                                               "id verify req(%d) for tei %d",
+                                               3 - st->ma.N202, st->l2.tei);
                put_tei_msg(st, ID_VERIFY, 0, st->l2.tei);
                FsmAddTimer(&st->ma.t202, st->ma.T202, EV_T202, NULL, 4);
        } else {
                st->ma.tei_m.printdebug(&st->ma.tei_m,
-                       "verify req for tei %d failed", st->l2.tei);
+                                       "verify req for tei %d failed", st->l2.tei);
                st->l3.l3l2(st, MDL_REMOVE | REQUEST, NULL);
                cs = (struct IsdnCardState *) st->l1.hardware;
                cs->cardmsg(cs, MDL_REMOVE | REQUEST, NULL);
@@ -320,25 +320,25 @@ tei_l1l2(struct PStack *st, int pr, void *arg)
        if (pr == (PH_DATA | INDICATION)) {
                if (skb->len < 3) {
                        st->ma.tei_m.printdebug(&st->ma.tei_m,
-                               "short mgr frame %ld/3", skb->len);
+                                               "short mgr frame %ld/3", skb->len);
                } else if ((skb->data[0] != ((TEI_SAPI << 2) | 2)) ||
                           (skb->data[1] != ((GROUP_TEI << 1) | 1))) {
                        st->ma.tei_m.printdebug(&st->ma.tei_m,
-                               "wrong mgr sapi/tei %x/%x",
-                               skb->data[0], skb->data[1]);
+                                               "wrong mgr sapi/tei %x/%x",
+                                               skb->data[0], skb->data[1]);
                } else if ((skb->data[2] & 0xef) != UI) {
                        st->ma.tei_m.printdebug(&st->ma.tei_m,
-                               "mgr frame is not ui %x", skb->data[2]);
+                                               "mgr frame is not ui %x", skb->data[2]);
                } else {
                        skb_pull(skb, 3);
                        if (skb->len < 5) {
                                st->ma.tei_m.printdebug(&st->ma.tei_m,
-                                       "short mgr frame %ld/5", skb->len);
+                                                       "short mgr frame %ld/5", skb->len);
                        } else if (skb->data[0] != TEI_ENTITY_ID) {
                                /* wrong management entity identifier, ignore */
                                st->ma.tei_m.printdebug(&st->ma.tei_m,
-                                       "tei handler wrong entity id %x",
-                                       skb->data[0]);
+                                                       "tei handler wrong entity id %x",
+                                                       skb->data[0]);
                        } else {
                                mt = skb->data[3];
                                if (mt == ID_ASSIGNED)
@@ -351,13 +351,13 @@ tei_l1l2(struct PStack *st, int pr, void *arg)
                                        FsmEvent(&st->ma.tei_m, EV_REMOVE, skb);
                                else {
                                        st->ma.tei_m.printdebug(&st->ma.tei_m,
-                                               "tei handler wrong mt %x\n", mt);
+                                                               "tei handler wrong mt %x\n", mt);
                                }
                        }
                }
        } else {
                st->ma.tei_m.printdebug(&st->ma.tei_m,
-                       "tei handler wrong pr %x\n", pr);
+                                       "tei handler wrong pr %x\n", pr);
        }
        dev_kfree_skb(skb);
 }
@@ -371,7 +371,7 @@ tei_l2tei(struct PStack *st, int pr, void *arg)
                if (pr == (MDL_ASSIGN | INDICATION)) {
                        if (st->ma.debug)
                                st->ma.tei_m.printdebug(&st->ma.tei_m,
-                                       "fixed assign tei %d", st->l2.tei);
+                                                       "fixed assign tei %d", st->l2.tei);
                        st->l3.l3l2(st, MDL_ASSIGN | REQUEST, (void *) (long) st->l2.tei);
                        cs = (struct IsdnCardState *) st->l1.hardware;
                        cs->cardmsg(cs, MDL_ASSIGN | REQUEST, NULL);
@@ -379,14 +379,14 @@ tei_l2tei(struct PStack *st, int pr, void *arg)
                return;
        }
        switch (pr) {
-               case (MDL_ASSIGN | INDICATION):
-                       FsmEvent(&st->ma.tei_m, EV_IDREQ, arg);
-                       break;
-               case (MDL_ERROR | REQUEST):
-                       FsmEvent(&st->ma.tei_m, EV_VERIFY, arg);
-                       break;
-               default:
-                       break;
+       case (MDL_ASSIGN | INDICATION):
+               FsmEvent(&st->ma.tei_m, EV_IDREQ, arg);
+               break;
+       case (MDL_ERROR | REQUEST):
+               FsmEvent(&st->ma.tei_m, EV_VERIFY, arg);
+               break;
+       default:
+               break;
        }
 }
 
index b0ce4ae..fa329e2 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Author       Karsten Keil
  * Copyright    by Karsten Keil      <keil@isdn4linux.de>
- * 
+ *
  * This software may be used and distributed according to the terms
  * of the GNU General Public License, incorporated herein by reference.
  *
@@ -18,7 +18,7 @@
 
 static const char *TeleInt_revision = "$Revision: 1.16.2.5 $";
 
-#define byteout(addr,val) outb(val,addr)
+#define byteout(addr, val) outb(val, addr)
 #define bytein(addr) inb(addr)
 
 static inline u_char
@@ -40,14 +40,14 @@ readreg(unsigned int ale, unsigned int adr, u_char off)
 }
 
 static inline void
-readfifo(unsigned int ale, unsigned int adr, u_char off, u_char * data, int size)
+readfifo(unsigned int ale, unsigned int adr, u_char off, u_char *data, int size)
 {
        register u_char ret;
        register int max_delay = 20000;
        register int i;
-       
+
        byteout(ale, off);
-       for (i = 0; i<size; i++) {
+       for (i = 0; i < size; i++) {
                ret = HFC_BUSY & bytein(ale);
                while (ret && --max_delay)
                        ret = HFC_BUSY & bytein(ale);
@@ -78,14 +78,14 @@ writereg(unsigned int ale, unsigned int adr, u_char off, u_char data)
 }
 
 static inline void
-writefifo(unsigned int ale, unsigned int adr, u_char off, u_char * data, int size)
+writefifo(unsigned int ale, unsigned int adr, u_char off, u_char *data, int size)
 {
        register u_char ret;
        register int max_delay = 20000;
        register int i;
-       
+
        byteout(ale, off);
-       for (i = 0; i<size; i++) {
+       for (i = 0; i < size; i++) {
                ret = HFC_BUSY & bytein(ale);
                while (ret && --max_delay)
                        ret = HFC_BUSY & bytein(ale);
@@ -114,14 +114,14 @@ WriteISAC(struct IsdnCardState *cs, u_char offset, u_char value)
 }
 
 static void
-ReadISACfifo(struct IsdnCardState *cs, u_char * data, int size)
+ReadISACfifo(struct IsdnCardState *cs, u_char *data, int size)
 {
        cs->hw.hfc.cip = 0;
        readfifo(cs->hw.hfc.addr | 1, cs->hw.hfc.addr, 0, data, size);
 }
 
 static void
-WriteISACfifo(struct IsdnCardState *cs, u_char * data, int size)
+WriteISACfifo(struct IsdnCardState *cs, u_char *data, int size)
 {
        cs->hw.hfc.cip = 0;
        writefifo(cs->hw.hfc.addr | 1, cs->hw.hfc.addr, 0, data, size);
@@ -163,7 +163,7 @@ TeleInt_interrupt(int intno, void *dev_id)
 
        spin_lock_irqsave(&cs->lock, flags);
        val = readreg(cs->hw.hfc.addr | 1, cs->hw.hfc.addr, ISAC_ISTA);
-      Start_ISAC:
+Start_ISAC:
        if (val)
                isac_interrupt(cs, val);
        val = readreg(cs->hw.hfc.addr | 1, cs->hw.hfc.addr, ISAC_ISTA);
@@ -183,7 +183,7 @@ TeleInt_Timer(struct IsdnCardState *cs)
 {
        int stat = 0;
        u_long flags;
-       
+
        spin_lock_irqsave(&cs->lock, flags);
        if (cs->bcs[0].mode) {
                stat |= 1;
@@ -194,7 +194,7 @@ TeleInt_Timer(struct IsdnCardState *cs)
                main_irq_hfc(&cs->bcs[1]);
        }
        spin_unlock_irqrestore(&cs->lock, flags);
-       stat = HZ/100;
+       stat = HZ / 100;
        if (!stat)
                stat = 1;
        cs->hw.hfc.timer.expires = jiffies + stat;
@@ -229,34 +229,34 @@ TeleInt_card_msg(struct IsdnCardState *cs, int mt, void *arg)
        int delay;
 
        switch (mt) {
-               case CARD_RESET:
-                       spin_lock_irqsave(&cs->lock, flags);
-                       reset_TeleInt(cs);
-                       spin_unlock_irqrestore(&cs->lock, flags);
-                       return(0);
-               case CARD_RELEASE:
-                       release_io_TeleInt(cs);
-                       return(0);
-               case CARD_INIT:
-                       spin_lock_irqsave(&cs->lock, flags);
-                       reset_TeleInt(cs);
-                       inithfc(cs);
-                       clear_pending_isac_ints(cs);
-                       initisac(cs);
-                       /* Reenable all IRQ */
-                       cs->writeisac(cs, ISAC_MASK, 0);
-                       cs->writeisac(cs, ISAC_CMDR, 0x41);
-                       spin_unlock_irqrestore(&cs->lock, flags);
-                       delay = HZ/100;
-                       if (!delay)
-                               delay = 1;
-                       cs->hw.hfc.timer.expires = jiffies + delay;
-                       add_timer(&cs->hw.hfc.timer);
-                       return(0);
-               case CARD_TEST:
-                       return(0);
+       case CARD_RESET:
+               spin_lock_irqsave(&cs->lock, flags);
+               reset_TeleInt(cs);
+               spin_unlock_irqrestore(&cs->lock, flags);
+               return (0);
+       case CARD_RELEASE:
+               release_io_TeleInt(cs);
+               return (0);
+       case CARD_INIT:
+               spin_lock_irqsave(&cs->lock, flags);
+               reset_TeleInt(cs);
+               inithfc(cs);
+               clear_pending_isac_ints(cs);
+               initisac(cs);
+               /* Reenable all IRQ */
+               cs->writeisac(cs, ISAC_MASK, 0);
+               cs->writeisac(cs, ISAC_CMDR, 0x41);
+               spin_unlock_irqrestore(&cs->lock, flags);
+               delay = HZ / 100;
+               if (!delay)
+                       delay = 1;
+               cs->hw.hfc.timer.expires = jiffies + delay;
+               add_timer(&cs->hw.hfc.timer);
+               return (0);
+       case CARD_TEST:
+               return (0);
        }
-       return(0);
+       return (0);
 }
 
 int __devinit
@@ -293,34 +293,34 @@ setup_TeleInt(struct IsdnCard *card)
        byteout(cs->hw.hfc.addr, cs->hw.hfc.addr & 0xff);
        byteout(cs->hw.hfc.addr | 1, ((cs->hw.hfc.addr & 0x300) >> 8) | 0x54);
        switch (cs->irq) {
-               case 3:
-                       cs->hw.hfc.cirm |= HFC_INTA;
-                       break;
-               case 4:
-                       cs->hw.hfc.cirm |= HFC_INTB;
-                       break;
-               case 5:
-                       cs->hw.hfc.cirm |= HFC_INTC;
-                       break;
-               case 7:
-                       cs->hw.hfc.cirm |= HFC_INTD;
-                       break;
-               case 10:
-                       cs->hw.hfc.cirm |= HFC_INTE;
-                       break;
-               case 11:
-                       cs->hw.hfc.cirm |= HFC_INTF;
-                       break;
-               default:
-                       printk(KERN_WARNING "TeleInt: wrong IRQ\n");
-                       release_io_TeleInt(cs);
-                       return (0);
+       case 3:
+               cs->hw.hfc.cirm |= HFC_INTA;
+               break;
+       case 4:
+               cs->hw.hfc.cirm |= HFC_INTB;
+               break;
+       case 5:
+               cs->hw.hfc.cirm |= HFC_INTC;
+               break;
+       case 7:
+               cs->hw.hfc.cirm |= HFC_INTD;
+               break;
+       case 10:
+               cs->hw.hfc.cirm |= HFC_INTE;
+               break;
+       case 11:
+               cs->hw.hfc.cirm |= HFC_INTF;
+               break;
+       default:
+               printk(KERN_WARNING "TeleInt: wrong IRQ\n");
+               release_io_TeleInt(cs);
+               return (0);
        }
        byteout(cs->hw.hfc.addr | 1, cs->hw.hfc.cirm);
        byteout(cs->hw.hfc.addr | 1, cs->hw.hfc.ctmt);
 
        printk(KERN_INFO "TeleInt: defined at 0x%x IRQ %d\n",
-               cs->hw.hfc.addr, cs->irq);
+              cs->hw.hfc.addr, cs->irq);
 
        setup_isac(cs);
        cs->readisac = &ReadISAC;
index 3ca0bed..49b4a26 100644 (file)
@@ -5,7 +5,7 @@
  * Author       Karsten Keil
  *              based on the teles driver from Jan den Ouden
  * Copyright    by Karsten Keil      <keil@isdn4linux.de>
- * 
+ *
  * This software may be used and distributed according to the terms
  * of the GNU General Public License, incorporated herein by reference.
  *
@@ -24,7 +24,7 @@
 static const char *teles0_revision = "$Revision: 2.15.2.4 $";
 
 #define TELES_IOMEM_SIZE       0x400
-#define byteout(addr,val) outb(val,addr)
+#define byteout(addr, val) outb(val, addr)
 #define bytein(addr) inb(addr)
 
 static inline u_char
@@ -55,7 +55,7 @@ writehscx(void __iomem *adr, int hscx, u_char off, u_char data)
 }
 
 static inline void
-read_fifo_isac(void __iomem *adr, u_char * data, int size)
+read_fifo_isac(void __iomem *adr, u_char *data, int size)
 {
        register int i;
        register u_char __iomem *ad = adr + 0x100;
@@ -64,7 +64,7 @@ read_fifo_isac(void __iomem *adr, u_char * data, int size)
 }
 
 static inline void
-write_fifo_isac(void __iomem *adr, u_char * data, int size)
+write_fifo_isac(void __iomem *adr, u_char *data, int size)
 {
        register int i;
        register u_char __iomem *ad = adr + 0x100;
@@ -74,7 +74,7 @@ write_fifo_isac(void __iomem *adr, u_char * data, int size)
 }
 
 static inline void
-read_fifo_hscx(void __iomem *adr, int hscx, u_char * data, int size)
+read_fifo_hscx(void __iomem *adr, int hscx, u_char *data, int size)
 {
        register int i;
        register u_char __iomem *ad = adr + (hscx ? 0x1c0 : 0x180);
@@ -83,7 +83,7 @@ read_fifo_hscx(void __iomem *adr, int hscx, u_char * data, int size)
 }
 
 static inline void
-write_fifo_hscx(void __iomem *adr, int hscx, u_char * data, int size)
+write_fifo_hscx(void __iomem *adr, int hscx, u_char *data, int size)
 {
        int i;
        register u_char __iomem *ad = adr + (hscx ? 0x1c0 : 0x180);
@@ -107,13 +107,13 @@ WriteISAC(struct IsdnCardState *cs, u_char offset, u_char value)
 }
 
 static void
-ReadISACfifo(struct IsdnCardState *cs, u_char * data, int size)
+ReadISACfifo(struct IsdnCardState *cs, u_char *data, int size)
 {
        read_fifo_isac(cs->hw.teles0.membase, data, size);
 }
 
 static void
-WriteISACfifo(struct IsdnCardState *cs, u_char * data, int size)
+WriteISACfifo(struct IsdnCardState *cs, u_char *data, int size)
 {
        write_fifo_isac(cs->hw.teles0.membase, data, size);
 }
@@ -151,11 +151,11 @@ teles0_interrupt(int intno, void *dev_id)
 
        spin_lock_irqsave(&cs->lock, flags);
        val = readhscx(cs->hw.teles0.membase, 1, HSCX_ISTA);
-      Start_HSCX:
+Start_HSCX:
        if (val)
                hscx_int_main(cs, val);
        val = readisac(cs->hw.teles0.membase, ISAC_ISTA);
-      Start_ISAC:
+Start_ISAC:
        if (val)
                isac_interrupt(cs, val);
        count++;
@@ -197,33 +197,33 @@ reset_teles0(struct IsdnCardState *cs)
 
        if (cs->hw.teles0.cfg_reg) {
                switch (cs->irq) {
-                       case 2:
-                       case 9:
-                               cfval = 0x00;
-                               break;
-                       case 3:
-                               cfval = 0x02;
-                               break;
-                       case 4:
-                               cfval = 0x04;
-                               break;
-                       case 5:
-                               cfval = 0x06;
-                               break;
-                       case 10:
-                               cfval = 0x08;
-                               break;
-                       case 11:
-                               cfval = 0x0A;
-                               break;
-                       case 12:
-                               cfval = 0x0C;
-                               break;
-                       case 15:
-                               cfval = 0x0E;
-                               break;
-                       default:
-                               return(1);
+               case 2:
+               case 9:
+                       cfval = 0x00;
+                       break;
+               case 3:
+                       cfval = 0x02;
+                       break;
+               case 4:
+                       cfval = 0x04;
+                       break;
+               case 5:
+                       cfval = 0x06;
+                       break;
+               case 10:
+                       cfval = 0x08;
+                       break;
+               case 11:
+                       cfval = 0x0A;
+                       break;
+               case 12:
+                       cfval = 0x0C;
+                       break;
+               case 15:
+                       cfval = 0x0E;
+                       break;
+               default:
+                       return (1);
                }
                cfval |= ((cs->hw.teles0.phymem >> 9) & 0xF0);
                byteout(cs->hw.teles0.cfg_reg + 4, cfval);
@@ -235,7 +235,7 @@ reset_teles0(struct IsdnCardState *cs)
        HZDELAY(HZ / 5 + 1);
        writeb(1, cs->hw.teles0.membase + 0x80); mb();
        HZDELAY(HZ / 5 + 1);
-       return(0);
+       return (0);
 }
 
 static int
@@ -244,23 +244,23 @@ Teles_card_msg(struct IsdnCardState *cs, int mt, void *arg)
        u_long flags;
 
        switch (mt) {
-               case CARD_RESET:
-                       spin_lock_irqsave(&cs->lock, flags);
-                       reset_teles0(cs);
-                       spin_unlock_irqrestore(&cs->lock, flags);
-                       return(0);
-               case CARD_RELEASE:
-                       release_io_teles0(cs);
-                       return(0);
-               case CARD_INIT:
-                       spin_lock_irqsave(&cs->lock, flags);
-                       inithscxisac(cs, 3);
-                       spin_unlock_irqrestore(&cs->lock, flags);
-                       return(0);
-               case CARD_TEST:
-                       return(0);
+       case CARD_RESET:
+               spin_lock_irqsave(&cs->lock, flags);
+               reset_teles0(cs);
+               spin_unlock_irqrestore(&cs->lock, flags);
+               return (0);
+       case CARD_RELEASE:
+               release_io_teles0(cs);
+               return (0);
+       case CARD_INIT:
+               spin_lock_irqsave(&cs->lock, flags);
+               inithscxisac(cs, 3);
+               spin_unlock_irqrestore(&cs->lock, flags);
+               return (0);
+       case CARD_TEST:
+               return (0);
        }
-       return(0);
+       return (0);
 }
 
 int __devinit
@@ -283,14 +283,14 @@ setup_teles0(struct IsdnCard *card)
        if (card->para[1] < 0x10000) {
                card->para[1] <<= 4;
                printk(KERN_INFO
-                  "Teles0: membase configured DOSish, assuming 0x%lx\n",
+                      "Teles0: membase configured DOSish, assuming 0x%lx\n",
                       (unsigned long) card->para[1]);
        }
        cs->irq = card->para[0];
        if (cs->hw.teles0.cfg_reg) {
                if (!request_region(cs->hw.teles0.cfg_reg, 8, "teles cfg")) {
                        printk(KERN_WARNING
-                         "HiSax: %s config port %x-%x already in use\n",
+                              "HiSax: %s config port %x-%x already in use\n",
                               CardType[card->typ],
                               cs->hw.teles0.cfg_reg,
                               cs->hw.teles0.cfg_reg + 8);
@@ -311,8 +311,8 @@ setup_teles0(struct IsdnCard *card)
                        return (0);
                }
                val = bytein(cs->hw.teles0.cfg_reg + 2);        /* 0x1e=without AB
-                                                                  * 0x1f=with AB
-                                                                  * 0x1c 16.3 ???
+                                                                * 0x1f=with AB
+                                                                * 0x1c 16.3 ???
                                                                 */
                if (val != 0x1e && val != 0x1f) {
                        printk(KERN_WARNING "Teles0: 16.0 Byte at %x is %x\n",
@@ -326,10 +326,10 @@ setup_teles0(struct IsdnCard *card)
        cs->hw.teles0.phymem = card->para[1];
        if (!request_mem_region(cs->hw.teles0.phymem, TELES_IOMEM_SIZE, "teles iomem")) {
                printk(KERN_WARNING
-                       "HiSax: %s memory region %lx-%lx already in use\n",
-                       CardType[card->typ],
-                       cs->hw.teles0.phymem,
-                       cs->hw.teles0.phymem + TELES_IOMEM_SIZE);
+                      "HiSax: %s memory region %lx-%lx already in use\n",
+                      CardType[card->typ],
+                      cs->hw.teles0.phymem,
+                      cs->hw.teles0.phymem + TELES_IOMEM_SIZE);
                if (cs->hw.teles0.cfg_reg)
                        release_region(cs->hw.teles0.cfg_reg, 8);
                return (0);
@@ -357,7 +357,7 @@ setup_teles0(struct IsdnCard *card)
        ISACVersion(cs, "Teles0:");
        if (HscxVersion(cs, "Teles0:")) {
                printk(KERN_WARNING
-                "Teles0: wrong HSCX versions check IO/MEM addresses\n");
+                      "Teles0: wrong HSCX versions check IO/MEM addresses\n");
                release_io_teles0(cs);
                return (0);
        }
index e9f5bb4..220b919 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Author       Karsten Keil
  * Copyright    by Karsten Keil      <keil@isdn4linux.de>
- * 
+ *
  * This software may be used and distributed according to the terms
  * of the GNU General Public License, incorporated herein by reference.
  *
@@ -22,7 +22,7 @@
 
 static const char *teles3_revision = "$Revision: 2.19.2.4 $";
 
-#define byteout(addr,val) outb(val,addr)
+#define byteout(addr, val) outb(val, addr)
 #define bytein(addr) inb(addr)
 
 static inline u_char
@@ -39,13 +39,13 @@ writereg(unsigned int adr, u_char off, u_char data)
 
 
 static inline void
-read_fifo(unsigned int adr, u_char * data, int size)
+read_fifo(unsigned int adr, u_char *data, int size)
 {
        insb(adr, data, size);
 }
 
 static void
-write_fifo(unsigned int adr, u_char * data, int size)
+write_fifo(unsigned int adr, u_char *data, int size)
 {
        outsb(adr, data, size);
 }
@@ -65,13 +65,13 @@ WriteISAC(struct IsdnCardState *cs, u_char offset, u_char value)
 }
 
 static void
-ReadISACfifo(struct IsdnCardState *cs, u_char * data, int size)
+ReadISACfifo(struct IsdnCardState *cs, u_char *data, int size)
 {
        read_fifo(cs->hw.teles3.isacfifo, data, size);
 }
 
 static void
-WriteISACfifo(struct IsdnCardState *cs, u_char * data, int size)
+WriteISACfifo(struct IsdnCardState *cs, u_char *data, int size)
 {
        write_fifo(cs->hw.teles3.isacfifo, data, size);
 }
@@ -110,11 +110,11 @@ teles3_interrupt(int intno, void *dev_id)
 
        spin_lock_irqsave(&cs->lock, flags);
        val = readreg(cs->hw.teles3.hscx[1], HSCX_ISTA);
-      Start_HSCX:
+Start_HSCX:
        if (val)
                hscx_int_main(cs, val);
        val = readreg(cs->hw.teles3.isac, ISAC_ISTA);
-      Start_ISAC:
+Start_ISAC:
        if (val)
                isac_interrupt(cs, val);
        count++;
@@ -178,33 +178,33 @@ reset_teles3(struct IsdnCardState *cs)
        if (cs->typ != ISDN_CTYPE_TELESPCMCIA) {
                if ((cs->hw.teles3.cfg_reg) && (cs->typ != ISDN_CTYPE_COMPAQ_ISA)) {
                        switch (cs->irq) {
-                               case 2:
-                               case 9:
-                                       irqcfg = 0x00;
-                                       break;
-                               case 3:
-                                       irqcfg = 0x02;
-                                       break;
-                               case 4:
-                                       irqcfg = 0x04;
-                                       break;
-                               case 5:
-                                       irqcfg = 0x06;
-                                       break;
-                               case 10:
-                                       irqcfg = 0x08;
-                                       break;
-                               case 11:
-                                       irqcfg = 0x0A;
-                                       break;
-                               case 12:
-                                       irqcfg = 0x0C;
-                                       break;
-                               case 15:
-                                       irqcfg = 0x0E;
-                                       break;
-                               default:
-                                       return(1);
+                       case 2:
+                       case 9:
+                               irqcfg = 0x00;
+                               break;
+                       case 3:
+                               irqcfg = 0x02;
+                               break;
+                       case 4:
+                               irqcfg = 0x04;
+                               break;
+                       case 5:
+                               irqcfg = 0x06;
+                               break;
+                       case 10:
+                               irqcfg = 0x08;
+                               break;
+                       case 11:
+                               irqcfg = 0x0A;
+                               break;
+                       case 12:
+                               irqcfg = 0x0C;
+                               break;
+                       case 15:
+                               irqcfg = 0x0E;
+                               break;
+                       default:
+                               return (1);
                        }
                        byteout(cs->hw.teles3.cfg_reg + 4, irqcfg);
                        HZDELAY(HZ / 10 + 1);
@@ -223,7 +223,7 @@ reset_teles3(struct IsdnCardState *cs)
                        HZDELAY(2);
                }
        }
-       return(0);
+       return (0);
 }
 
 static int
@@ -232,36 +232,36 @@ Teles_card_msg(struct IsdnCardState *cs, int mt, void *arg)
        u_long flags;
 
        switch (mt) {
-               case CARD_RESET:
-                       spin_lock_irqsave(&cs->lock, flags);
-                       reset_teles3(cs);
-                       spin_unlock_irqrestore(&cs->lock, flags);
-                       return(0);
-               case CARD_RELEASE:
-                       release_io_teles3(cs);
-                       return(0);
-               case CARD_INIT:
-                       spin_lock_irqsave(&cs->lock, flags);
-                       inithscxisac(cs, 3);
-                       spin_unlock_irqrestore(&cs->lock, flags);
-                       return(0);
-               case CARD_TEST:
-                       return(0);
+       case CARD_RESET:
+               spin_lock_irqsave(&cs->lock, flags);
+               reset_teles3(cs);
+               spin_unlock_irqrestore(&cs->lock, flags);
+               return (0);
+       case CARD_RELEASE:
+               release_io_teles3(cs);
+               return (0);
+       case CARD_INIT:
+               spin_lock_irqsave(&cs->lock, flags);
+               inithscxisac(cs, 3);
+               spin_unlock_irqrestore(&cs->lock, flags);
+               return (0);
+       case CARD_TEST:
+               return (0);
        }
-       return(0);
+       return (0);
 }
 
 #ifdef __ISAPNP__
 
 static struct isapnp_device_id teles_ids[] __devinitdata = {
        { ISAPNP_VENDOR('T', 'A', 'G'), ISAPNP_FUNCTION(0x2110),
-         ISAPNP_VENDOR('T', 'A', 'G'), ISAPNP_FUNCTION(0x2110), 
+         ISAPNP_VENDOR('T', 'A', 'G'), ISAPNP_FUNCTION(0x2110),
          (unsigned long) "Teles 16.3 PnP" },
        { ISAPNP_VENDOR('C', 'T', 'X'), ISAPNP_FUNCTION(0x0),
-         ISAPNP_VENDOR('C', 'T', 'X'), ISAPNP_FUNCTION(0x0), 
+         ISAPNP_VENDOR('C', 'T', 'X'), ISAPNP_FUNCTION(0x0),
          (unsigned long) "Creatix 16.3 PnP" },
        { ISAPNP_VENDOR('C', 'P', 'Q'), ISAPNP_FUNCTION(0x1002),
-         ISAPNP_VENDOR('C', 'P', 'Q'), ISAPNP_FUNCTION(0x1002), 
+         ISAPNP_VENDOR('C', 'P', 'Q'), ISAPNP_FUNCTION(0x1002),
          (unsigned long) "Compaq ISDN S0" },
        { 0, }
 };
@@ -286,22 +286,22 @@ setup_teles3(struct IsdnCard *card)
 #ifdef __ISAPNP__
        if (!card->para[1] && isapnp_present()) {
                struct pnp_dev *pnp_d;
-               while(ipid->card_vendor) {
+               while (ipid->card_vendor) {
                        if ((pnp_c = pnp_find_card(ipid->card_vendor,
-                               ipid->card_device, pnp_c))) {
+                                                  ipid->card_device, pnp_c))) {
                                pnp_d = NULL;
                                if ((pnp_d = pnp_find_dev(pnp_c,
-                                       ipid->vendor, ipid->function, pnp_d))) {
+                                                         ipid->vendor, ipid->function, pnp_d))) {
                                        int err;
 
                                        printk(KERN_INFO "HiSax: %s detected\n",
-                                               (char *)ipid->driver_data);
+                                              (char *)ipid->driver_data);
                                        pnp_disable_dev(pnp_d);
                                        err = pnp_activate_dev(pnp_d);
-                                       if (err<0) {
+                                       if (err < 0) {
                                                printk(KERN_WARNING "%s: pnp_activate_dev ret(%d)\n",
-                                                       __func__, err);
-                                               return(0);
+                                                      __func__, err);
+                                               return (0);
                                        }
                                        card->para[3] = pnp_port_start(pnp_d, 2);
                                        card->para[2] = pnp_port_start(pnp_d, 1);
@@ -309,9 +309,9 @@ setup_teles3(struct IsdnCard *card)
                                        card->para[0] = pnp_irq(pnp_d, 0);
                                        if (!card->para[0] || !card->para[1] || !card->para[2]) {
                                                printk(KERN_ERR "Teles PnP:some resources are missing %ld/%lx/%lx\n",
-                                                       card->para[0], card->para[1], card->para[2]);
+                                                      card->para[0], card->para[1], card->para[2]);
                                                pnp_disable_dev(pnp_d);
-                                               return(0);
+                                               return (0);
                                        }
                                        break;
                                } else {
@@ -320,21 +320,21 @@ setup_teles3(struct IsdnCard *card)
                        }
                        ipid++;
                        pnp_c = NULL;
-               } 
+               }
                if (!ipid->card_vendor) {
                        printk(KERN_INFO "Teles PnP: no ISAPnP card found\n");
-                       return(0);
+                       return (0);
                }
        }
 #endif
        if (cs->typ == ISDN_CTYPE_16_3) {
                cs->hw.teles3.cfg_reg = card->para[1];
                switch (cs->hw.teles3.cfg_reg) {
-                       case 0x180:
-                       case 0x280:
-                       case 0x380:
-                               cs->hw.teles3.cfg_reg |= 0xc00;
-                               break;
+               case 0x180:
+               case 0x280:
+               case 0x380:
+                       cs->hw.teles3.cfg_reg |= 0xc00;
+                       break;
                }
                cs->hw.teles3.isac = cs->hw.teles3.cfg_reg - 0x420;
                cs->hw.teles3.hscx[0] = cs->hw.teles3.cfg_reg - 0xc20;
@@ -374,9 +374,9 @@ setup_teles3(struct IsdnCard *card)
                        if (cs->typ == ISDN_CTYPE_COMPAQ_ISA) {
                                if (!request_region(cs->hw.teles3.cfg_reg, 1, "teles3 cfg")) {
                                        printk(KERN_WARNING
-                                               "HiSax: %s config port %x already in use\n",
-                                               CardType[card->typ],
-                                               cs->hw.teles3.cfg_reg);
+                                              "HiSax: %s config port %x already in use\n",
+                                              CardType[card->typ],
+                                              cs->hw.teles3.cfg_reg);
                                        return (0);
                                }
                        } else {
@@ -385,14 +385,14 @@ setup_teles3(struct IsdnCard *card)
                                               "HiSax: %s config port %x-%x already in use\n",
                                               CardType[card->typ],
                                               cs->hw.teles3.cfg_reg,
-                                               cs->hw.teles3.cfg_reg + 8);
+                                              cs->hw.teles3.cfg_reg + 8);
                                        return (0);
                                }
                        }
                }
                if (!request_region(cs->hw.teles3.isac + 32, 32, "HiSax isac")) {
                        printk(KERN_WARNING
-                          "HiSax: %s isac ports %x-%x already in use\n",
+                              "HiSax: %s isac ports %x-%x already in use\n",
                               CardType[cs->typ],
                               cs->hw.teles3.isac + 32,
                               cs->hw.teles3.isac + 64);
@@ -407,7 +407,7 @@ setup_teles3(struct IsdnCard *card)
                }
                if (!request_region(cs->hw.teles3.hscx[0] + 32, 32, "HiSax hscx A")) {
                        printk(KERN_WARNING
-                        "HiSax: %s hscx A ports %x-%x already in use\n",
+                              "HiSax: %s hscx A ports %x-%x already in use\n",
                               CardType[cs->typ],
                               cs->hw.teles3.hscx[0] + 32,
                               cs->hw.teles3.hscx[0] + 64);
@@ -423,7 +423,7 @@ setup_teles3(struct IsdnCard *card)
                }
                if (!request_region(cs->hw.teles3.hscx[1] + 32, 32, "HiSax hscx B")) {
                        printk(KERN_WARNING
-                        "HiSax: %s hscx B ports %x-%x already in use\n",
+                              "HiSax: %s hscx B ports %x-%x already in use\n",
                               CardType[cs->typ],
                               cs->hw.teles3.hscx[1] + 32,
                               cs->hw.teles3.hscx[1] + 64);
index 161a193..bfe9428 100644 (file)
@@ -1,20 +1,20 @@
 /* $Id: teles_cs.c,v 1.1.2.2 2004/01/25 15:07:06 keil Exp $ */
 /*======================================================================
 
-    A teles S0 PCMCIA client driver
+  A teles S0 PCMCIA client driver
 
-    Based on skeleton by David Hinds, dhinds@allegro.stanford.edu
-    Written by Christof Petig, christof.petig@wtal.de
-    
-    Also inspired by ELSA PCMCIA driver 
-    by Klaus Lichtenwalder <Lichtenwalder@ACM.org>
-    
-    Extensions to new hisax_pcmcia by Karsten Keil
+  Based on skeleton by David Hinds, dhinds@allegro.stanford.edu
+  Written by Christof Petig, christof.petig@wtal.de
 
-    minor changes to be compatible with kernel 2.4.x
-    by Jan.Schubert@GMX.li
+  Also inspired by ELSA PCMCIA driver
+  by Klaus Lichtenwalder <Lichtenwalder@ACM.org>
 
-======================================================================*/
+  Extensions to new hisax_pcmcia by Karsten Keil
+
+  minor changes to be compatible with kernel 2.4.x
+  by Jan.Schubert@GMX.li
+
+  ======================================================================*/
 
 #include <linux/kernel.h>
 #include <linux/module.h>
@@ -44,33 +44,33 @@ MODULE_LICENSE("GPL");
 static int protocol = 2;        /* EURO-ISDN Default */
 module_param(protocol, int, 0);
 
-static int teles_cs_config(struct pcmcia_device *link) __devinit ;
+static int teles_cs_config(struct pcmcia_device *link) __devinit;
 static void teles_cs_release(struct pcmcia_device *link);
-static void teles_detach(struct pcmcia_device *p_dev) __devexit ;
+static void teles_detach(struct pcmcia_device *p_dev) __devexit;
 
 typedef struct local_info_t {
        struct pcmcia_device    *p_dev;
-    int                 busy;
-    int                        cardnr;
+       int                 busy;
+       int                     cardnr;
 } local_info_t;
 
 static int __devinit teles_probe(struct pcmcia_device *link)
 {
-    local_info_t *local;
+       local_info_t *local;
 
-    dev_dbg(&link->dev, "teles_attach()\n");
+       dev_dbg(&link->dev, "teles_attach()\n");
 
-    /* Allocate space for private device-specific data */
-    local = kzalloc(sizeof(local_info_t), GFP_KERNEL);
-    if (!local) return -ENOMEM;
-    local->cardnr = -1;
+       /* Allocate space for private device-specific data */
+       local = kzalloc(sizeof(local_info_t), GFP_KERNEL);
+       if (!local) return -ENOMEM;
+       local->cardnr = -1;
 
-    local->p_dev = link;
-    link->priv = local;
+       local->p_dev = link;
+       link->priv = local;
 
-    link->config_flags |= CONF_ENABLE_IRQ | CONF_AUTO_SET_IO;
+       link->config_flags |= CONF_ENABLE_IRQ | CONF_AUTO_SET_IO;
 
-    return teles_cs_config(link);
+       return teles_cs_config(link);
 } /* teles_attach */
 
 static void __devexit teles_detach(struct pcmcia_device *link)
@@ -111,64 +111,64 @@ static int teles_cs_configcheck(struct pcmcia_device *p_dev, void *priv_data)
 
 static int __devinit teles_cs_config(struct pcmcia_device *link)
 {
-    int i;
-    IsdnCard_t icard;
-
-    dev_dbg(&link->dev, "teles_config(0x%p)\n", link);
-
-    i = pcmcia_loop_config(link, teles_cs_configcheck, NULL);
-    if (i != 0)
-       goto cs_failed;
-
-    if (!link->irq)
-        goto cs_failed;
-
-    i = pcmcia_enable_device(link);
-    if (i != 0)
-      goto cs_failed;
-
-    icard.para[0] = link->irq;
-    icard.para[1] = link->resource[0]->start;
-    icard.protocol = protocol;
-    icard.typ = ISDN_CTYPE_TELESPCMCIA;
-    
-    i = hisax_init_pcmcia(link, &(((local_info_t*)link->priv)->busy), &icard);
-    if (i < 0) {
-       printk(KERN_ERR "teles_cs: failed to initialize Teles PCMCIA %d at i/o %#x\n",
-                       i, (unsigned int) link->resource[0]->start);
-       teles_cs_release(link);
-       return -ENODEV;
-    }
+       int i;
+       IsdnCard_t icard;
+
+       dev_dbg(&link->dev, "teles_config(0x%p)\n", link);
+
+       i = pcmcia_loop_config(link, teles_cs_configcheck, NULL);
+       if (i != 0)
+               goto cs_failed;
+
+       if (!link->irq)
+               goto cs_failed;
+
+       i = pcmcia_enable_device(link);
+       if (i != 0)
+               goto cs_failed;
 
-    ((local_info_t*)link->priv)->cardnr = i;
-    return 0;
+       icard.para[0] = link->irq;
+       icard.para[1] = link->resource[0]->start;
+       icard.protocol = protocol;
+       icard.typ = ISDN_CTYPE_TELESPCMCIA;
+
+       i = hisax_init_pcmcia(link, &(((local_info_t *)link->priv)->busy), &icard);
+       if (i < 0) {
+               printk(KERN_ERR "teles_cs: failed to initialize Teles PCMCIA %d at i/o %#x\n",
+                      i, (unsigned int) link->resource[0]->start);
+               teles_cs_release(link);
+               return -ENODEV;
+       }
+
+       ((local_info_t *)link->priv)->cardnr = i;
+       return 0;
 
 cs_failed:
-    teles_cs_release(link);
-    return -ENODEV;
+       teles_cs_release(link);
+       return -ENODEV;
 } /* teles_cs_config */
 
 static void teles_cs_release(struct pcmcia_device *link)
 {
-    local_info_t *local = link->priv;
+       local_info_t *local = link->priv;
 
-    dev_dbg(&link->dev, "teles_cs_release(0x%p)\n", link);
+       dev_dbg(&link->dev, "teles_cs_release(0x%p)\n", link);
 
-    if (local) {
-       if (local->cardnr >= 0) {
-           /* no unregister function with hisax */
-           HiSax_closecard(local->cardnr);
+       if (local) {
+               if (local->cardnr >= 0) {
+                       /* no unregister function with hisax */
+                       HiSax_closecard(local->cardnr);
+               }
        }
-    }
 
-    pcmcia_disable_device(link);
+       pcmcia_disable_device(link);
 } /* teles_cs_release */
 
 static int teles_suspend(struct pcmcia_device *link)
 {
        local_info_t *dev = link->priv;
 
-        dev->busy = 1;
+       dev->busy = 1;
 
        return 0;
 }
@@ -177,7 +177,7 @@ static int teles_resume(struct pcmcia_device *link)
 {
        local_info_t *dev = link->priv;
 
-        dev->busy = 0;
+       dev->busy = 0;
 
        return 0;
 }
index b85ceb3..9c002c9 100644 (file)
@@ -6,7 +6,7 @@
  *              Karsten Keil
  * Copyright    by Ton van Rosmalen
  *              by Karsten Keil      <keil@isdn4linux.de>
- * 
+ *
  * This software may be used and distributed according to the terms
  * of the GNU General Public License, incorporated herein by reference.
  *
@@ -36,9 +36,9 @@ static const char *telespci_revision = "$Revision: 2.23.2.3 $";
 #define READ_DATA_HSCX (ZORAN_PO_GID1 | ZORAN_PO_GREG1)
 #define WRITE_DATA_HSCX        (ZORAN_PO_WR | ZORAN_PO_GID1 | ZORAN_PO_GREG1)
 
-#define ZORAN_WAIT_NOBUSY      do { \
-                                       portdata = readl(adr + 0x200); \
-                               } while (portdata & ZORAN_PO_RQ_PEN)
+#define ZORAN_WAIT_NOBUSY      do {            \
+               portdata = readl(adr + 0x200);  \
+       } while (portdata & ZORAN_PO_RQ_PEN)
 
 static inline u_char
 readisac(void __iomem *adr, u_char off)
@@ -46,15 +46,15 @@ readisac(void __iomem *adr, u_char off)
        register unsigned int portdata;
 
        ZORAN_WAIT_NOBUSY;
-       
+
        /* set address for ISAC */
        writel(WRITE_ADDR_ISAC | off, adr + 0x200);
        ZORAN_WAIT_NOBUSY;
-       
+
        /* read data from ISAC */
        writel(READ_DATA_ISAC, adr + 0x200);
        ZORAN_WAIT_NOBUSY;
-       return((u_char)(portdata & ZORAN_PO_DMASK));
+       return ((u_char)(portdata & ZORAN_PO_DMASK));
 }
 
 static inline void
@@ -63,7 +63,7 @@ writeisac(void __iomem *adr, u_char off, u_char data)
        register unsigned int portdata;
 
        ZORAN_WAIT_NOBUSY;
-       
+
        /* set address for ISAC */
        writel(WRITE_ADDR_ISAC | off, adr + 0x200);
        ZORAN_WAIT_NOBUSY;
@@ -80,9 +80,9 @@ readhscx(void __iomem *adr, int hscx, u_char off)
 
        ZORAN_WAIT_NOBUSY;
        /* set address for HSCX */
-       writel(WRITE_ADDR_HSCX | ((hscx ? 0x40:0) + off), adr + 0x200);
+       writel(WRITE_ADDR_HSCX | ((hscx ? 0x40 : 0) + off), adr + 0x200);
        ZORAN_WAIT_NOBUSY;
-       
+
        /* read data from HSCX */
        writel(READ_DATA_HSCX, adr + 0x200);
        ZORAN_WAIT_NOBUSY;
@@ -96,7 +96,7 @@ writehscx(void __iomem *adr, int hscx, u_char off, u_char data)
 
        ZORAN_WAIT_NOBUSY;
        /* set address for HSCX */
-       writel(WRITE_ADDR_HSCX | ((hscx ? 0x40:0) + off), adr + 0x200);
+       writel(WRITE_ADDR_HSCX | ((hscx ? 0x40 : 0) + off), adr + 0x200);
        ZORAN_WAIT_NOBUSY;
 
        /* write data to HSCX */
@@ -105,7 +105,7 @@ writehscx(void __iomem *adr, int hscx, u_char off, u_char data)
 }
 
 static inline void
-read_fifo_isac(void __iomem *adr, u_char * data, int size)
+read_fifo_isac(void __iomem *adr, u_char *data, int size)
 {
        register unsigned int portdata;
        register int i;
@@ -123,7 +123,7 @@ read_fifo_isac(void __iomem *adr, u_char * data, int size)
 }
 
 static void
-write_fifo_isac(void __iomem *adr, u_char * data, int size)
+write_fifo_isac(void __iomem *adr, u_char *data, int size)
 {
        register unsigned int portdata;
        register int i;
@@ -140,7 +140,7 @@ write_fifo_isac(void __iomem *adr, u_char * data, int size)
 }
 
 static inline void
-read_fifo_hscx(void __iomem *adr, int hscx, u_char * data, int size)
+read_fifo_hscx(void __iomem *adr, int hscx, u_char *data, int size)
 {
        register unsigned int portdata;
        register int i;
@@ -149,7 +149,7 @@ read_fifo_hscx(void __iomem *adr, int hscx, u_char * data, int size)
        /* read data from HSCX */
        for (i = 0; i < size; i++) {
                /* set address for HSCX fifo */
-               writel(WRITE_ADDR_HSCX |(hscx ? 0x5F:0x1F), adr + 0x200);
+               writel(WRITE_ADDR_HSCX | (hscx ? 0x5F : 0x1F), adr + 0x200);
                ZORAN_WAIT_NOBUSY;
                writel(READ_DATA_HSCX, adr + 0x200);
                ZORAN_WAIT_NOBUSY;
@@ -158,7 +158,7 @@ read_fifo_hscx(void __iomem *adr, int hscx, u_char * data, int size)
 }
 
 static inline void
-write_fifo_hscx(void __iomem *adr, int hscx, u_char * data, int size)
+write_fifo_hscx(void __iomem *adr, int hscx, u_char *data, int size)
 {
        unsigned int portdata;
        register int i;
@@ -167,7 +167,7 @@ write_fifo_hscx(void __iomem *adr, int hscx, u_char * data, int size)
        /* write data to HSCX */
        for (i = 0; i < size; i++) {
                /* set address for HSCX fifo */
-               writel(WRITE_ADDR_HSCX |(hscx ? 0x5F:0x1F), adr + 0x200);
+               writel(WRITE_ADDR_HSCX | (hscx ? 0x5F : 0x1F), adr + 0x200);
                ZORAN_WAIT_NOBUSY;
                writel(WRITE_DATA_HSCX | data[i], adr + 0x200);
                ZORAN_WAIT_NOBUSY;
@@ -190,13 +190,13 @@ WriteISAC(struct IsdnCardState *cs, u_char offset, u_char value)
 }
 
 static void
-ReadISACfifo(struct IsdnCardState *cs, u_char * data, int size)
+ReadISACfifo(struct IsdnCardState *cs, u_char *data, int size)
 {
        read_fifo_isac(cs->hw.teles0.membase, data, size);
 }
 
 static void
-WriteISACfifo(struct IsdnCardState *cs, u_char * data, int size)
+WriteISACfifo(struct IsdnCardState *cs, u_char *data, int size)
 {
        write_fifo_isac(cs->hw.teles0.membase, data, size);
 }
@@ -267,20 +267,20 @@ TelesPCI_card_msg(struct IsdnCardState *cs, int mt, void *arg)
        u_long flags;
 
        switch (mt) {
-               case CARD_RESET:
-                       return(0);
-               case CARD_RELEASE:
-                       release_io_telespci(cs);
-                       return(0);
-               case CARD_INIT:
-                       spin_lock_irqsave(&cs->lock, flags);
-                       inithscxisac(cs, 3);
-                       spin_unlock_irqrestore(&cs->lock, flags);
-                       return(0);
-               case CARD_TEST:
-                       return(0);
+       case CARD_RESET:
+               return (0);
+       case CARD_RELEASE:
+               release_io_telespci(cs);
+               return (0);
+       case CARD_INIT:
+               spin_lock_irqsave(&cs->lock, flags);
+               inithscxisac(cs, 3);
+               spin_unlock_irqrestore(&cs->lock, flags);
+               return (0);
+       case CARD_TEST:
+               return (0);
        }
-       return(0);
+       return (0);
 }
 
 static struct pci_dev *dev_tel __devinitdata = NULL;
@@ -300,22 +300,22 @@ setup_telespci(struct IsdnCard *card)
        if (cs->typ != ISDN_CTYPE_TELESPCI)
                return (0);
 
-       if ((dev_tel = hisax_find_pci_device (PCI_VENDOR_ID_ZORAN, PCI_DEVICE_ID_ZORAN_36120, dev_tel))) {
+       if ((dev_tel = hisax_find_pci_device(PCI_VENDOR_ID_ZORAN, PCI_DEVICE_ID_ZORAN_36120, dev_tel))) {
                if (pci_enable_device(dev_tel))
-                       return(0);
+                       return (0);
                cs->irq = dev_tel->irq;
                if (!cs->irq) {
                        printk(KERN_WARNING "Teles: No IRQ for PCI card found\n");
-                       return(0);
+                       return (0);
                }
                cs->hw.teles0.membase = ioremap(pci_resource_start(dev_tel, 0),
-                       PAGE_SIZE);
+                                               PAGE_SIZE);
                printk(KERN_INFO "Found: Zoran, base-address: 0x%llx, irq: 0x%x\n",
-                       (unsigned long long)pci_resource_start(dev_tel, 0),
-                       dev_tel->irq);
+                      (unsigned long long)pci_resource_start(dev_tel, 0),
+                      dev_tel->irq);
        } else {
                printk(KERN_WARNING "TelesPCI: No PCI card found\n");
-               return(0);
+               return (0);
        }
 
        /* Initialize Zoran PCI controller */
@@ -346,7 +346,7 @@ setup_telespci(struct IsdnCard *card)
        ISACVersion(cs, "TelesPCI:");
        if (HscxVersion(cs, "TelesPCI:")) {
                printk(KERN_WARNING
-                "TelesPCI: wrong HSCX versions check IO/MEM addresses\n");
+                      "TelesPCI: wrong HSCX versions check IO/MEM addresses\n");
                release_io_telespci(cs);
                return (0);
        }
index e2cfb6f..0f0d094 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Author       Petr Novak
  * Copyright    by Petr Novak        <petr.novak@i.cz>
- * 
+ *
  * This software may be used and distributed according to the terms
  * of the GNU General Public License, incorporated herein by reference.
  *
@@ -69,33 +69,33 @@ static void
 W6692_new_ph(struct IsdnCardState *cs)
 {
        switch (cs->dc.w6692.ph_state) {
-               case (W_L1CMD_RST):
-                       ph_command(cs, W_L1CMD_DRC);
-                       l1_msg(cs, HW_RESET | INDICATION, NULL);
-                       /* fallthru */
-               case (W_L1IND_CD):
-                       l1_msg(cs, HW_DEACTIVATE | CONFIRM, NULL);
-                       break;
-               case (W_L1IND_DRD):
-                       l1_msg(cs, HW_DEACTIVATE | INDICATION, NULL);
-                       break;
-               case (W_L1IND_CE):
-                       l1_msg(cs, HW_POWERUP | CONFIRM, NULL);
-                       break;
-               case (W_L1IND_LD):
-                       l1_msg(cs, HW_RSYNC | INDICATION, NULL);
-                       break;
-               case (W_L1IND_ARD):
-                       l1_msg(cs, HW_INFO2 | INDICATION, NULL);
-                       break;
-               case (W_L1IND_AI8):
-                       l1_msg(cs, HW_INFO4_P8 | INDICATION, NULL);
-                       break;
-               case (W_L1IND_AI10):
-                       l1_msg(cs, HW_INFO4_P10 | INDICATION, NULL);
-                       break;
-               default:
-                       break;
+       case (W_L1CMD_RST):
+               ph_command(cs, W_L1CMD_DRC);
+               l1_msg(cs, HW_RESET | INDICATION, NULL);
+               /* fallthru */
+       case (W_L1IND_CD):
+               l1_msg(cs, HW_DEACTIVATE | CONFIRM, NULL);
+               break;
+       case (W_L1IND_DRD):
+               l1_msg(cs, HW_DEACTIVATE | INDICATION, NULL);
+               break;
+       case (W_L1IND_CE):
+               l1_msg(cs, HW_POWERUP | CONFIRM, NULL);
+               break;
+       case (W_L1IND_LD):
+               l1_msg(cs, HW_RSYNC | INDICATION, NULL);
+               break;
+       case (W_L1IND_ARD):
+               l1_msg(cs, HW_INFO2 | INDICATION, NULL);
+               break;
+       case (W_L1IND_AI8):
+               l1_msg(cs, HW_INFO4_P8 | INDICATION, NULL);
+               break;
+       case (W_L1IND_AI10):
+               l1_msg(cs, HW_INFO4_P10 | INDICATION, NULL);
+               break;
+       default:
+               break;
        }
 }
 
@@ -122,11 +122,11 @@ W6692_bh(struct work_struct *work)
        if (test_and_clear_bit(D_XMTBUFREADY, &cs->event))
                DChannel_proc_xmt(cs);
 /*
-   if (test_and_clear_bit(D_RX_MON1, &cs->event))
-   arcofi_fsm(cs, ARCOFI_RX_END, NULL);
-   if (test_and_clear_bit(D_TX_MON1, &cs->event))
-   arcofi_fsm(cs, ARCOFI_TX_END, NULL);
- */
+  if (test_and_clear_bit(D_RX_MON1, &cs->event))
+  arcofi_fsm(cs, ARCOFI_RX_END, NULL);
+  if (test_and_clear_bit(D_TX_MON1, &cs->event))
+  arcofi_fsm(cs, ARCOFI_TX_END, NULL);
+*/
 }
 
 static void
@@ -250,7 +250,7 @@ W6692B_fill_fifo(struct BCState *bcs)
                count = bcs->tx_skb->len;
 
        if ((cs->debug & L1_DEB_HSCX) && !(cs->debug & L1_DEB_HSCX_FIFO))
-               debugl1(cs, "W6692B_fill_fifo%s%d", (more ? " ": " last "), count);
+               debugl1(cs, "W6692B_fill_fifo%s%d", (more ? " " : " last "), count);
 
        ptr = bcs->tx_skb->data;
        skb_pull(bcs->tx_skb, count);
@@ -277,7 +277,7 @@ W6692B_interrupt(struct IsdnCardState *cs, u_char bchan)
        struct sk_buff *skb;
        int count;
 
-       bcs = (cs->bcs->channel == bchan) ? cs->bcs : (cs->bcs+1);
+       bcs = (cs->bcs->channel == bchan) ? cs->bcs : (cs->bcs + 1);
        val = cs->BC_Read_Reg(cs, bchan, W_B_EXIR);
        debugl1(cs, "W6692B chan %d B_EXIR 0x%02X", bchan, val);
 
@@ -322,7 +322,7 @@ W6692B_interrupt(struct IsdnCardState *cs, u_char bchan)
                r = cs->BC_Read_Reg(cs, bchan, W_B_STAR);
                if (r & W_B_STAR_RDOV) {
                        if (cs->debug & L1_DEB_WARN)
-                               debugl1(cs, "W6692 B RDOV(RMR) mode=%d",bcs->mode);
+                               debugl1(cs, "W6692 B RDOV(RMR) mode=%d", bcs->mode);
                        cs->BC_Write_Reg(cs, bchan, W_B_CMDR, W_B_CMDR_RACK | W_B_CMDR_RRST | W_B_CMDR_RACT);
                        if (bcs->mode != L1_MODE_TRANS)
                                bcs->hw.w6692.rcvidx = 0;
@@ -347,7 +347,7 @@ W6692B_interrupt(struct IsdnCardState *cs, u_char bchan)
                        W6692B_fill_fifo(bcs);
                else {
                        /* Here we lost an TX interrupt, so
-                          * restart transmitting the whole frame.
+                        * restart transmitting the whole frame.
                         */
                        if (bcs->tx_skb) {
                                skb_push(bcs->tx_skb, bcs->hw.w6692.count);
@@ -374,9 +374,9 @@ W6692B_interrupt(struct IsdnCardState *cs, u_char bchan)
                                W6692B_fill_fifo(bcs);
                                return;
                        } else {
-                               if (test_bit(FLG_LLI_L1WAKEUP,&bcs->st->lli.flag) &&
-                                       (PACKET_NOACK != bcs->tx_skb->pkt_type)) {
-                                       u_long  flags;
+                               if (test_bit(FLG_LLI_L1WAKEUP, &bcs->st->lli.flag) &&
+                                   (PACKET_NOACK != bcs->tx_skb->pkt_type)) {
+                                       u_long flags;
                                        spin_lock_irqsave(&bcs->aclock, flags);
                                        bcs->ackcnt += bcs->hw.w6692.count;
                                        spin_unlock_irqrestore(&bcs->aclock, flags);
@@ -414,7 +414,7 @@ W6692_interrupt(int intno, void *dev_id)
                spin_unlock_irqrestore(&cs->lock, flags);
                return IRQ_NONE;
        }
-      StartW6692:
+StartW6692:
        if (cs->debug & L1_DEB_ISAC)
                debugl1(cs, "W6692 ISTA %x", val);
 
@@ -473,7 +473,7 @@ W6692_interrupt(int intno, void *dev_id)
                } else
                        schedule_event(cs, D_XMTBUFREADY);
        }
-      afterXFR:
+afterXFR:
        if (val & (W_INT_XINT0 | W_INT_XINT1)) {        /* XINT0/1 - never */
                if (cs->debug & L1_DEB_ISAC)
                        debugl1(cs, "W6692 spurious XINT!");
@@ -564,108 +564,108 @@ W6692_l1hw(struct PStack *st, int pr, void *arg)
        int val;
 
        switch (pr) {
-               case (PH_DATA | REQUEST):
-                       if (cs->debug & DEB_DLOG_HEX)
-                               LogFrame(cs, skb->data, skb->len);
-                       if (cs->debug & DEB_DLOG_VERBOSE)
-                               dlogframe(cs, skb, 0);
-                       spin_lock_irqsave(&cs->lock, flags);
-                       if (cs->tx_skb) {
-                               skb_queue_tail(&cs->sq, skb);
-#ifdef L2FRAME_DEBUG           /* psa */
-                               if (cs->debug & L1_DEB_LAPD)
-                                       Logl2Frame(cs, skb, "PH_DATA Queued", 0);
-#endif
-                       } else {
-                               cs->tx_skb = skb;
-                               cs->tx_cnt = 0;
+       case (PH_DATA | REQUEST):
+               if (cs->debug & DEB_DLOG_HEX)
+                       LogFrame(cs, skb->data, skb->len);
+               if (cs->debug & DEB_DLOG_VERBOSE)
+                       dlogframe(cs, skb, 0);
+               spin_lock_irqsave(&cs->lock, flags);
+               if (cs->tx_skb) {
+                       skb_queue_tail(&cs->sq, skb);
 #ifdef L2FRAME_DEBUG           /* psa */
-                               if (cs->debug & L1_DEB_LAPD)
-                                       Logl2Frame(cs, skb, "PH_DATA", 0);
+                       if (cs->debug & L1_DEB_LAPD)
+                               Logl2Frame(cs, skb, "PH_DATA Queued", 0);
 #endif
-                               W6692_fill_fifo(cs);
-                       }
-                       spin_unlock_irqrestore(&cs->lock, flags);
-                       break;
-               case (PH_PULL | INDICATION):
-                       spin_lock_irqsave(&cs->lock, flags);
-                       if (cs->tx_skb) {
-                               if (cs->debug & L1_DEB_WARN)
-                                       debugl1(cs, " l2l1 tx_skb exist this shouldn't happen");
-                               skb_queue_tail(&cs->sq, skb);
-                               spin_unlock_irqrestore(&cs->lock, flags);
-                               break;
-                       }
-                       if (cs->debug & DEB_DLOG_HEX)
-                               LogFrame(cs, skb->data, skb->len);
-                       if (cs->debug & DEB_DLOG_VERBOSE)
-                               dlogframe(cs, skb, 0);
+               } else {
                        cs->tx_skb = skb;
                        cs->tx_cnt = 0;
 #ifdef L2FRAME_DEBUG           /* psa */
                        if (cs->debug & L1_DEB_LAPD)
-                               Logl2Frame(cs, skb, "PH_DATA_PULLED", 0);
+                               Logl2Frame(cs, skb, "PH_DATA", 0);
 #endif
                        W6692_fill_fifo(cs);
+               }
+               spin_unlock_irqrestore(&cs->lock, flags);
+               break;
+       case (PH_PULL | INDICATION):
+               spin_lock_irqsave(&cs->lock, flags);
+               if (cs->tx_skb) {
+                       if (cs->debug & L1_DEB_WARN)
+                               debugl1(cs, " l2l1 tx_skb exist this shouldn't happen");
+                       skb_queue_tail(&cs->sq, skb);
                        spin_unlock_irqrestore(&cs->lock, flags);
                        break;
-               case (PH_PULL | REQUEST):
+               }
+               if (cs->debug & DEB_DLOG_HEX)
+                       LogFrame(cs, skb->data, skb->len);
+               if (cs->debug & DEB_DLOG_VERBOSE)
+                       dlogframe(cs, skb, 0);
+               cs->tx_skb = skb;
+               cs->tx_cnt = 0;
 #ifdef L2FRAME_DEBUG           /* psa */
-                       if (cs->debug & L1_DEB_LAPD)
-                               debugl1(cs, "-> PH_REQUEST_PULL");
+               if (cs->debug & L1_DEB_LAPD)
+                       Logl2Frame(cs, skb, "PH_DATA_PULLED", 0);
 #endif
-                       if (!cs->tx_skb) {
-                               test_and_clear_bit(FLG_L1_PULL_REQ, &st->l1.Flags);
-                               st->l1.l1l2(st, PH_PULL | CONFIRM, NULL);
-                       } else
-                               test_and_set_bit(FLG_L1_PULL_REQ, &st->l1.Flags);
-                       break;
-               case (HW_RESET | REQUEST):
-                       spin_lock_irqsave(&cs->lock, flags);
-                       if ((cs->dc.w6692.ph_state == W_L1IND_DRD)) {
-                               ph_command(cs, W_L1CMD_ECK);
-                               spin_unlock_irqrestore(&cs->lock, flags);
-                       } else {
-                               ph_command(cs, W_L1CMD_RST);
-                               cs->dc.w6692.ph_state = W_L1CMD_RST;
-                               spin_unlock_irqrestore(&cs->lock, flags);
-                               W6692_new_ph(cs);
-                       }
-                       break;
-               case (HW_ENABLE | REQUEST):
-                       spin_lock_irqsave(&cs->lock, flags);
+               W6692_fill_fifo(cs);
+               spin_unlock_irqrestore(&cs->lock, flags);
+               break;
+       case (PH_PULL | REQUEST):
+#ifdef L2FRAME_DEBUG           /* psa */
+               if (cs->debug & L1_DEB_LAPD)
+                       debugl1(cs, "-> PH_REQUEST_PULL");
+#endif
+               if (!cs->tx_skb) {
+                       test_and_clear_bit(FLG_L1_PULL_REQ, &st->l1.Flags);
+                       st->l1.l1l2(st, PH_PULL | CONFIRM, NULL);
+               } else
+                       test_and_set_bit(FLG_L1_PULL_REQ, &st->l1.Flags);
+               break;
+       case (HW_RESET | REQUEST):
+               spin_lock_irqsave(&cs->lock, flags);
+               if ((cs->dc.w6692.ph_state == W_L1IND_DRD)) {
                        ph_command(cs, W_L1CMD_ECK);
                        spin_unlock_irqrestore(&cs->lock, flags);
-                       break;
-               case (HW_INFO3 | REQUEST):
-                       spin_lock_irqsave(&cs->lock, flags);
-                       ph_command(cs, W_L1CMD_AR8);
+               } else {
+                       ph_command(cs, W_L1CMD_RST);
+                       cs->dc.w6692.ph_state = W_L1CMD_RST;
                        spin_unlock_irqrestore(&cs->lock, flags);
-                       break;
-               case (HW_TESTLOOP | REQUEST):
-                       val = 0;
-                       if (1 & (long) arg)
-                               val |= 0x0c;
-                       if (2 & (long) arg)
-                               val |= 0x3;
-                       /* !!! not implemented yet */
-                       break;
-               case (HW_DEACTIVATE | RESPONSE):
-                       skb_queue_purge(&cs->rq);
-                       skb_queue_purge(&cs->sq);
-                       if (cs->tx_skb) {
-                               dev_kfree_skb_any(cs->tx_skb);
-                               cs->tx_skb = NULL;
-                       }
-                       if (test_and_clear_bit(FLG_DBUSY_TIMER, &cs->HW_Flags))
-                               del_timer(&cs->dbusytimer);
-                       if (test_and_clear_bit(FLG_L1_DBUSY, &cs->HW_Flags))
-                               schedule_event(cs, D_CLEARBUSY);
-                       break;
-               default:
-                       if (cs->debug & L1_DEB_WARN)
-                               debugl1(cs, "W6692_l1hw unknown %04x", pr);
-                       break;
+                       W6692_new_ph(cs);
+               }
+               break;
+       case (HW_ENABLE | REQUEST):
+               spin_lock_irqsave(&cs->lock, flags);
+               ph_command(cs, W_L1CMD_ECK);
+               spin_unlock_irqrestore(&cs->lock, flags);
+               break;
+       case (HW_INFO3 | REQUEST):
+               spin_lock_irqsave(&cs->lock, flags);
+               ph_command(cs, W_L1CMD_AR8);
+               spin_unlock_irqrestore(&cs->lock, flags);
+               break;
+       case (HW_TESTLOOP | REQUEST):
+               val = 0;
+               if (1 & (long) arg)
+                       val |= 0x0c;
+               if (2 & (long) arg)
+                       val |= 0x3;
+               /* !!! not implemented yet */
+               break;
+       case (HW_DEACTIVATE | RESPONSE):
+               skb_queue_purge(&cs->rq);
+               skb_queue_purge(&cs->sq);
+               if (cs->tx_skb) {
+                       dev_kfree_skb_any(cs->tx_skb);
+                       cs->tx_skb = NULL;
+               }
+               if (test_and_clear_bit(FLG_DBUSY_TIMER, &cs->HW_Flags))
+                       del_timer(&cs->dbusytimer);
+               if (test_and_clear_bit(FLG_L1_DBUSY, &cs->HW_Flags))
+                       schedule_event(cs, D_CLEARBUSY);
+               break;
+       default:
+               if (cs->debug & L1_DEB_WARN)
+                       debugl1(cs, "W6692_l1hw unknown %04x", pr);
+               break;
        }
 }
 
@@ -734,17 +734,17 @@ W6692Bmode(struct BCState *bcs, int mode, int bchan)
        bcs->hw.w6692.bchan = bchan;
 
        switch (mode) {
-               case (L1_MODE_NULL):
-                       cs->BC_Write_Reg(cs, bchan, W_B_MODE, 0);
-                       break;
-               case (L1_MODE_TRANS):
-                       cs->BC_Write_Reg(cs, bchan, W_B_MODE, W_B_MODE_MMS);
-                       break;
-               case (L1_MODE_HDLC):
-                       cs->BC_Write_Reg(cs, bchan, W_B_MODE, W_B_MODE_ITF);
-                       cs->BC_Write_Reg(cs, bchan, W_B_ADM1, 0xff);
-                       cs->BC_Write_Reg(cs, bchan, W_B_ADM2, 0xff);
-                       break;
+       case (L1_MODE_NULL):
+               cs->BC_Write_Reg(cs, bchan, W_B_MODE, 0);
+               break;
+       case (L1_MODE_TRANS):
+               cs->BC_Write_Reg(cs, bchan, W_B_MODE, W_B_MODE_MMS);
+               break;
+       case (L1_MODE_HDLC):
+               cs->BC_Write_Reg(cs, bchan, W_B_MODE, W_B_MODE_ITF);
+               cs->BC_Write_Reg(cs, bchan, W_B_ADM1, 0xff);
+               cs->BC_Write_Reg(cs, bchan, W_B_ADM2, 0xff);
+               break;
        }
        if (mode)
                cs->BC_Write_Reg(cs, bchan, W_B_CMDR, W_B_CMDR_RRST |
@@ -756,59 +756,59 @@ static void
 W6692_l2l1(struct PStack *st, int pr, void *arg)
 {
        struct sk_buff *skb = arg;
-       struct BCState *bcs = st->l1.bcs; 
+       struct BCState *bcs = st->l1.bcs;
        u_long flags;
 
        switch (pr) {
-               case (PH_DATA | REQUEST):
-                       spin_lock_irqsave(&bcs->cs->lock, flags);
-                       if (bcs->tx_skb) {
-                               skb_queue_tail(&bcs->squeue, skb);
-                       } else {
-                               bcs->tx_skb = skb;
-                               test_and_set_bit(BC_FLG_BUSY, &bcs->Flag);
-                               bcs->hw.w6692.count = 0;
-                               bcs->cs->BC_Send_Data(bcs);
-                       }
-                       spin_unlock_irqrestore(&bcs->cs->lock, flags);
-                       break;
-               case (PH_PULL | INDICATION):
-                       if (bcs->tx_skb) {
-                               printk(KERN_WARNING "W6692_l2l1: this shouldn't happen\n");
-                               break;
-                       }
-                       spin_lock_irqsave(&bcs->cs->lock, flags);
-                       test_and_set_bit(BC_FLG_BUSY, &bcs->Flag);
+       case (PH_DATA | REQUEST):
+               spin_lock_irqsave(&bcs->cs->lock, flags);
+               if (bcs->tx_skb) {
+                       skb_queue_tail(&bcs->squeue, skb);
+               } else {
                        bcs->tx_skb = skb;
+                       test_and_set_bit(BC_FLG_BUSY, &bcs->Flag);
                        bcs->hw.w6692.count = 0;
                        bcs->cs->BC_Send_Data(bcs);
-                       spin_unlock_irqrestore(&bcs->cs->lock, flags);
-                       break;
-               case (PH_PULL | REQUEST):
-                       if (!bcs->tx_skb) {
-                               test_and_clear_bit(FLG_L1_PULL_REQ, &st->l1.Flags);
-                               st->l1.l1l2(st, PH_PULL | CONFIRM, NULL);
-                       } else
-                               test_and_set_bit(FLG_L1_PULL_REQ, &st->l1.Flags);
-                       break;
-               case (PH_ACTIVATE | REQUEST):
-                       spin_lock_irqsave(&bcs->cs->lock, flags);
-                       test_and_set_bit(BC_FLG_ACTIV, &bcs->Flag);
-                       W6692Bmode(bcs, st->l1.mode, st->l1.bc);
-                       spin_unlock_irqrestore(&bcs->cs->lock, flags);
-                       l1_msg_b(st, pr, arg);
-                       break;
-               case (PH_DEACTIVATE | REQUEST):
-                       l1_msg_b(st, pr, arg);
-                       break;
-               case (PH_DEACTIVATE | CONFIRM):
-                       spin_lock_irqsave(&bcs->cs->lock, flags);
-                       test_and_clear_bit(BC_FLG_ACTIV, &bcs->Flag);
-                       test_and_clear_bit(BC_FLG_BUSY, &bcs->Flag);
-                       W6692Bmode(bcs, 0, st->l1.bc);
-                       spin_unlock_irqrestore(&bcs->cs->lock, flags);
-                       st->l1.l1l2(st, PH_DEACTIVATE | CONFIRM, NULL);
+               }
+               spin_unlock_irqrestore(&bcs->cs->lock, flags);
+               break;
+       case (PH_PULL | INDICATION):
+               if (bcs->tx_skb) {
+                       printk(KERN_WARNING "W6692_l2l1: this shouldn't happen\n");
                        break;
+               }
+               spin_lock_irqsave(&bcs->cs->lock, flags);
+               test_and_set_bit(BC_FLG_BUSY, &bcs->Flag);
+               bcs->tx_skb = skb;
+               bcs->hw.w6692.count = 0;
+               bcs->cs->BC_Send_Data(bcs);
+               spin_unlock_irqrestore(&bcs->cs->lock, flags);
+               break;
+       case (PH_PULL | REQUEST):
+               if (!bcs->tx_skb) {
+                       test_and_clear_bit(FLG_L1_PULL_REQ, &st->l1.Flags);
+                       st->l1.l1l2(st, PH_PULL | CONFIRM, NULL);
+               } else
+                       test_and_set_bit(FLG_L1_PULL_REQ, &st->l1.Flags);
+               break;
+       case (PH_ACTIVATE | REQUEST):
+               spin_lock_irqsave(&bcs->cs->lock, flags);
+               test_and_set_bit(BC_FLG_ACTIV, &bcs->Flag);
+               W6692Bmode(bcs, st->l1.mode, st->l1.bc);
+               spin_unlock_irqrestore(&bcs->cs->lock, flags);
+               l1_msg_b(st, pr, arg);
+               break;
+       case (PH_DEACTIVATE | REQUEST):
+               l1_msg_b(st, pr, arg);
+               break;
+       case (PH_DEACTIVATE | CONFIRM):
+               spin_lock_irqsave(&bcs->cs->lock, flags);
+               test_and_clear_bit(BC_FLG_ACTIV, &bcs->Flag);
+               test_and_clear_bit(BC_FLG_BUSY, &bcs->Flag);
+               W6692Bmode(bcs, 0, st->l1.bc);
+               spin_unlock_irqrestore(&bcs->cs->lock, flags);
+               st->l1.l1l2(st, PH_DEACTIVATE | CONFIRM, NULL);
+               break;
        }
 }
 
@@ -943,13 +943,13 @@ WriteW6692(struct IsdnCardState *cs, u_char offset, u_char value)
 }
 
 static void
-ReadISACfifo(struct IsdnCardState *cs, u_char * data, int size)
+ReadISACfifo(struct IsdnCardState *cs, u_char *data, int size)
 {
        insb(cs->hw.w6692.iobase + W_D_RFIFO, data, size);
 }
 
 static void
-WriteISACfifo(struct IsdnCardState *cs, u_char * data, int size)
+WriteISACfifo(struct IsdnCardState *cs, u_char *data, int size)
 {
        outsb(cs->hw.w6692.iobase + W_D_XFIFO, data, size);
 }
@@ -970,26 +970,26 @@ static int
 w6692_card_msg(struct IsdnCardState *cs, int mt, void *arg)
 {
        switch (mt) {
-               case CARD_RESET:
-                       resetW6692(cs);
-                       return (0);
-               case CARD_RELEASE:
-                       cs->writeW6692(cs, W_IMASK, 0xff);
-                       release_region(cs->hw.w6692.iobase, 256);
-                       if (cs->subtyp == W6692_USR) {
-                               cs->writeW6692(cs, W_XDATA, 0x04);
-                       }
-                       return (0);
-               case CARD_INIT:
-                       initW6692(cs, 3);
-                       return (0);
-               case CARD_TEST:
-                       return (0);
+       case CARD_RESET:
+               resetW6692(cs);
+               return (0);
+       case CARD_RELEASE:
+               cs->writeW6692(cs, W_IMASK, 0xff);
+               release_region(cs->hw.w6692.iobase, 256);
+               if (cs->subtyp == W6692_USR) {
+                       cs->writeW6692(cs, W_XDATA, 0x04);
+               }
+               return (0);
+       case CARD_INIT:
+               initW6692(cs, 3);
+               return (0);
+       case CARD_TEST:
+               return (0);
        }
        return (0);
 }
 
-static int id_idx ;
+static int id_idx;
 
 static struct pci_dev *dev_w6692 __devinitdata = NULL;
 
@@ -1009,8 +1009,8 @@ setup_w6692(struct IsdnCard *card)
 
        while (id_list[id_idx].vendor_id) {
                dev_w6692 = hisax_find_pci_device(id_list[id_idx].vendor_id,
-                                           id_list[id_idx].device_id,
-                                           dev_w6692);
+                                                 id_list[id_idx].device_id,
+                                                 dev_w6692);
                if (dev_w6692) {
                        if (pci_enable_device(dev_w6692))
                                continue;
index c79c81e..024b04d 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Author       Petr Novak
  * Copyright    by Petr Novak        <petr.novak@i.cz>
- * 
+ *
  * This software may be used and distributed according to the terms
  * of the GNU General Public License, incorporated herein by reference.
  *
 
 /* B-channel FIFO read/write routines */
 
-#define READW6692BFIFO(cs,bchan,ptr,count) \
-       insb(cs->hw.w6692.iobase+W_B_RFIFO+(bchan?0x40:0),ptr,count)
+#define READW6692BFIFO(cs, bchan, ptr, count)                          \
+       insb(cs->hw.w6692.iobase + W_B_RFIFO + (bchan ? 0x40 : 0), ptr, count)
 
-#define WRITEW6692BFIFO(cs,bchan,ptr,count) \
-       outsb(cs->hw.w6692.iobase+W_B_XFIFO+(bchan?0x40:0),ptr,count)
+#define WRITEW6692BFIFO(cs, bchan, ptr, count)                         \
+       outsb(cs->hw.w6692.iobase + W_B_XFIFO + (bchan ? 0x40 : 0), ptr, count)
 
 /* Specifications of W6692 registers */
 
index 3eb096f..2aa2a0e 100644 (file)
@@ -25,7 +25,7 @@
 #include "hysdn_defs.h"
 #include "boardergo.h"
 
-#define byteout(addr,val) outb(val,addr)
+#define byteout(addr, val) outb(val, addr)
 #define bytein(addr) inb(addr)
 
 /***************************************************/
@@ -73,7 +73,7 @@ ergo_interrupt(int intno, void *dev_id)
 static void
 ergo_irq_bh(struct work_struct *ugli_api)
 {
-       hysdn_card * card = container_of(ugli_api, hysdn_card, irq_queue);
+       hysdn_card *card = container_of(ugli_api, hysdn_card, irq_queue);
        tErgDpram *dpr;
        int again;
        unsigned long flags;
@@ -125,7 +125,7 @@ ergo_irq_bh(struct work_struct *ugli_api)
 /* stop the card (hardware reset) and disable interrupts */
 /*********************************************************/
 static void
-ergo_stopcard(hysdn_card * card)
+ergo_stopcard(hysdn_card *card)
 {
        unsigned long flags;
        unsigned char val;
@@ -150,7 +150,7 @@ ergo_stopcard(hysdn_card * card)
 /* enable or disable the cards error log. The event is queued if possible */
 /**************************************************************************/
 static void
-ergo_set_errlog_state(hysdn_card * card, int on)
+ergo_set_errlog_state(hysdn_card *card, int on)
 {
        unsigned long flags;
 
@@ -180,7 +180,7 @@ ergo_set_errlog_state(hysdn_card * card, int on)
 static const char TestText[36] = "This Message is filler, why read it";
 
 static int
-ergo_testram(hysdn_card * card)
+ergo_testram(hysdn_card *card)
 {
        tErgDpram *dpr = card->dpram;
 
@@ -212,12 +212,12 @@ ergo_testram(hysdn_card * card)
 /*****************************************************************************/
 static int
 ergo_writebootimg(struct HYSDN_CARD *card, unsigned char *buf,
-                       unsigned long offs)
+                 unsigned long offs)
 {
        unsigned char *dst;
        tErgDpram *dpram;
        int cnt = (BOOT_IMG_SIZE >> 2);         /* number of words to move and swap (byte order!) */
-       
+
        if (card->debug_flags & LOG_POF_CARD)
                hysdn_addlog(card, "ERGO: write bootldr offs=0x%lx ", offs);
 
@@ -355,7 +355,7 @@ ergo_waitpofready(struct HYSDN_CARD *card)
                        /* enable the cards interrupt */
                        byteout(card->iobase + PCI9050_INTR_REG,
                                bytein(card->iobase + PCI9050_INTR_REG) |
-                       (PCI9050_INTR_REG_ENPCI | PCI9050_INTR_REG_EN1));
+                               (PCI9050_INTR_REG_ENPCI | PCI9050_INTR_REG_EN1));
                        card->irq_enabled = 1;  /* we are ready to receive interrupts */
 
                        dpr->ToPcFlag = 0;      /* reset data indicator */
@@ -363,15 +363,15 @@ ergo_waitpofready(struct HYSDN_CARD *card)
                        dpr->ToPcInt = 1;       /* interrupt to E1 for all cards */
 
                        spin_unlock_irqrestore(&card->hysdn_lock, flags);
-                       if ((hynet_enable & (1 << card->myid)) 
-                           && (i = hysdn_net_create(card))) 
+                       if ((hynet_enable & (1 << card->myid))
+                           && (i = hysdn_net_create(card)))
                        {
                                ergo_stopcard(card);
                                card->state = CARD_STATE_BOOTERR;
                                return (i);
                        }
 #ifdef CONFIG_HYSDN_CAPI
-                       if((i = hycapi_capi_create(card))) {
+                       if ((i = hycapi_capi_create(card))) {
                                printk(KERN_WARNING "HYSDN: failed to create capi-interface.\n");
                        }
 #endif /* CONFIG_HYSDN_CAPI */
@@ -393,7 +393,7 @@ ergo_waitpofready(struct HYSDN_CARD *card)
 /* Use only during module release.                                                  */
 /************************************************************************************/
 static void
-ergo_releasehardware(hysdn_card * card)
+ergo_releasehardware(hysdn_card *card)
 {
        ergo_stopcard(card);    /* first stop the card if not already done */
        free_irq(card->irq, card);      /* release interrupt */
@@ -410,9 +410,9 @@ ergo_releasehardware(hysdn_card * card)
 /* Use only during module init.                                                  */
 /*********************************************************************************/
 int
-ergo_inithardware(hysdn_card * card)
+ergo_inithardware(hysdn_card *card)
 {
-       if (!request_region(card->iobase + PCI9050_INTR_REG, 1, "HYSDN")) 
+       if (!request_region(card->iobase + PCI9050_INTR_REG, 1, "HYSDN"))
                return (-1);
        if (!request_region(card->iobase + PCI9050_USER_IO, 1, "HYSDN")) {
                release_region(card->iobase + PCI9050_INTR_REG, 1);
index c59422a..e99bd81 100644 (file)
@@ -23,8 +23,8 @@
 
 /* following DPRAM layout copied from OS2-driver boarderg.h */
 typedef struct ErgDpram_tag {
-/*0000 */ unsigned char ToHyBuf[ERG_TO_HY_BUF_SIZE];
-/*0E00 */ unsigned char ToPcBuf[ERG_TO_PC_BUF_SIZE];
+       /*0000 */ unsigned char ToHyBuf[ERG_TO_HY_BUF_SIZE];
+       /*0E00 */ unsigned char ToPcBuf[ERG_TO_PC_BUF_SIZE];
 
        /*1C00 */ unsigned char bSoftUart[SIZE_RSV_SOFT_UART];
        /* size 0x1B0 */
@@ -37,22 +37,22 @@ typedef struct ErgDpram_tag {
        /*1DB9  unsigned long ucText[ERRLOG_TEXT_SIZE]; *//* ASCIIZ of len ucTextSize-1 */
        /*1DF0 */
 
-/*1DF0 */ unsigned short volatile ToHyChannel;
-/*1DF2 */ unsigned short volatile ToHySize;
+       /*1DF0 */ unsigned short volatile ToHyChannel;
+       /*1DF2 */ unsigned short volatile ToHySize;
        /*1DF4 */ unsigned char volatile ToHyFlag;
        /* !=0: msg for Hy waiting */
        /*1DF5 */ unsigned char volatile ToPcFlag;
        /* !=0: msg for PC waiting */
-/*1DF6 */ unsigned short volatile ToPcChannel;
-/*1DF8 */ unsigned short volatile ToPcSize;
+       /*1DF6 */ unsigned short volatile ToPcChannel;
+       /*1DF8 */ unsigned short volatile ToPcSize;
        /*1DFA */ unsigned char bRes1DBA[0x1E00 - 0x1DFA];
        /* 6 bytes */
 
-/*1E00 */ unsigned char bRestOfEntryTbl[0x1F00 - 0x1E00];
-/*1F00 */ unsigned long TrapTable[62];
+       /*1E00 */ unsigned char bRestOfEntryTbl[0x1F00 - 0x1E00];
+       /*1F00 */ unsigned long TrapTable[62];
        /*1FF8 */ unsigned char bRes1FF8[0x1FFB - 0x1FF8];
        /* low part of reset vetor */
-/*1FFB */ unsigned char ToPcIntMetro;
+       /*1FFB */ unsigned char ToPcIntMetro;
        /* notes:
         * - metro has 32-bit boot ram - accessing
         *   ToPcInt and ToHyInt would be the same;
@@ -65,13 +65,13 @@ typedef struct ErgDpram_tag {
         *   so E1 side should NOT change this byte
         *   when writing!
         */
-/*1FFC */ unsigned char volatile ToHyNoDpramErrLog;
+       /*1FFC */ unsigned char volatile ToHyNoDpramErrLog;
        /* note: ToHyNoDpramErrLog is used to inform
         *       boot loader, not to use DPRAM based
         *       ErrLog; when DOS driver is rewritten
         *       this becomes obsolete
         */
-/*1FFD */ unsigned char bRes1FFD;
+       /*1FFD */ unsigned char bRes1FFD;
        /*1FFE */ unsigned char ToPcInt;
        /* E1_intclear; on CHAMP2: E1_intset   */
        /*1FFF */ unsigned char ToHyInt;
@@ -85,16 +85,16 @@ typedef struct ErgDpram_tag {
 #define PCI9050_INTR_REG    0x4C       /* Interrupt register */
 #define PCI9050_USER_IO     0x51       /* User I/O  register */
 
-                                   /* bitmask for PCI9050_INTR_REG: */
+/* bitmask for PCI9050_INTR_REG: */
 #define PCI9050_INTR_REG_EN1    0x01   /* 1= enable (def.), 0= disable */
 #define PCI9050_INTR_REG_POL1   0x02   /* 1= active high (def.), 0= active low */
 #define PCI9050_INTR_REG_STAT1  0x04   /* 1= intr. active, 0= intr. not active (def.) */
 #define PCI9050_INTR_REG_ENPCI  0x40   /* 1= PCI interrupts enable (def.) */
 
-                                   /* bitmask for PCI9050_USER_IO: */
+/* bitmask for PCI9050_USER_IO: */
 #define PCI9050_USER_IO_EN3     0x02   /* 1= disable      , 0= enable (def.) */
 #define PCI9050_USER_IO_DIR3    0x04   /* 1= output (def.), 0= input         */
 #define PCI9050_USER_IO_DAT3    0x08   /* 1= high (def.)  , 0= low           */
 
-#define PCI9050_E1_RESET    (                     PCI9050_USER_IO_DIR3)                /* 0x04 */
-#define PCI9050_E1_RUN      (PCI9050_USER_IO_DAT3|PCI9050_USER_IO_DIR3)                /* 0x0C */
+#define PCI9050_E1_RESET    (PCI9050_USER_IO_DIR3)             /* 0x04 */
+#define PCI9050_E1_RUN      (PCI9050_USER_IO_DAT3 | PCI9050_USER_IO_DIR3)              /* 0x0C */
index 6299b06..931f916 100644 (file)
@@ -31,9 +31,9 @@
 #include "hysdn_defs.h"
 #include <linux/kernelcapi.h>
 
-static char hycapi_revision[]="$Revision: 1.8.6.4 $";
+static char hycapi_revision[] = "$Revision: 1.8.6.4 $";
 
-unsigned int hycapi_enable = 0xffffffff; 
+unsigned int hycapi_enable = 0xffffffff;
 module_param(hycapi_enable, uint, 0);
 
 typedef struct _hycapi_appl {
@@ -48,18 +48,18 @@ static u16 hycapi_send_message(struct capi_ctr *ctrl, struct sk_buff *skb);
 
 static inline int _hycapi_appCheck(int app_id, int ctrl_no)
 {
-       if((ctrl_no <= 0) || (ctrl_no > CAPI_MAXCONTR) || (app_id <= 0) ||
+       if ((ctrl_no <= 0) || (ctrl_no > CAPI_MAXCONTR) || (app_id <= 0) ||
           (app_id > CAPI_MAXAPPL))
        {
                printk(KERN_ERR "HYCAPI: Invalid request app_id %d for controller %d", app_id, ctrl_no);
                return -1;
        }
-       return ((hycapi_applications[app_id-1].ctrl_mask & (1 << (ctrl_no-1))) != 0);
+       return ((hycapi_applications[app_id - 1].ctrl_mask & (1 << (ctrl_no-1))) != 0);
 }
 
 /******************************
 Kernel-Capi callback reset_ctr
-******************************/     
+******************************/
 
 static void
 hycapi_reset_ctr(struct capi_ctr *ctrl)
@@ -75,7 +75,7 @@ hycapi_reset_ctr(struct capi_ctr *ctrl)
 
 /******************************
 Kernel-Capi callback remove_ctr
-******************************/     
+******************************/
 
 static void
 hycapi_remove_ctr(struct capi_ctr *ctrl)
@@ -85,25 +85,25 @@ hycapi_remove_ctr(struct capi_ctr *ctrl)
        hysdn_card *card = NULL;
 #ifdef HYCAPI_PRINTFNAMES
        printk(KERN_NOTICE "HYCAPI hycapi_remove_ctr\n");
-#endif 
+#endif
        cinfo = (hycapictrl_info *)(ctrl->driverdata);
-       if(!cinfo) {
+       if (!cinfo) {
                printk(KERN_ERR "No hycapictrl_info set!");
                return;
-       }    
+       }
        card = cinfo->card;
        capi_ctr_suspend_output(ctrl);
-       for(i=0; i<CAPI_MAXAPPL;i++) {
-               if(hycapi_applications[i].listen_req[ctrl->cnr-1]) {
-                       kfree_skb(hycapi_applications[i].listen_req[ctrl->cnr-1]);
-                       hycapi_applications[i].listen_req[ctrl->cnr-1] = NULL;
+       for (i = 0; i < CAPI_MAXAPPL; i++) {
+               if (hycapi_applications[i].listen_req[ctrl->cnr - 1]) {
+                       kfree_skb(hycapi_applications[i].listen_req[ctrl->cnr - 1]);
+                       hycapi_applications[i].listen_req[ctrl->cnr - 1] = NULL;
                }
        }
        detach_capi_ctr(ctrl);
        ctrl->driverdata = NULL;
        kfree(card->hyctrlinfo);
 
-               
+
        card->hyctrlinfo = NULL;
 }
 
@@ -121,7 +121,7 @@ hycapi_sendmsg_internal(struct capi_ctr *ctrl, struct sk_buff *skb)
 
        spin_lock_irq(&cinfo->lock);
 #ifdef HYCAPI_PRINTFNAMES
-       printk(KERN_NOTICE "hycapi_send_message\n");    
+       printk(KERN_NOTICE "hycapi_send_message\n");
 #endif
        cinfo->skbs[cinfo->in_idx++] = skb;     /* add to buffer list */
        if (cinfo->in_idx >= HYSDN_MAX_CAPI_SKB)
@@ -130,7 +130,7 @@ hycapi_sendmsg_internal(struct capi_ctr *ctrl, struct sk_buff *skb)
        if (cinfo->sk_count >= HYSDN_MAX_CAPI_SKB) {
                /* inform upper layers we're full */
                printk(KERN_ERR "HYSDN Card%d: CAPI-buffer overrun!\n",
-                      card->myid);     
+                      card->myid);
                capi_ctr_suspend_output(ctrl);
        }
        cinfo->tx_skb = skb;
@@ -147,7 +147,7 @@ re-register any applications in the private list.
 
 ************************************************************/
 
-static void 
+static void
 hycapi_register_internal(struct capi_ctr *ctrl, __u16 appl,
                         capi_register_params *rp)
 {
@@ -161,9 +161,9 @@ hycapi_register_internal(struct capi_ctr *ctrl, __u16 appl,
        __u16 MessageBufferSize = 0;
        int slen = strlen(ExtFeatureDefaults);
 #ifdef HYCAPI_PRINTFNAMES
-       printk(KERN_NOTICE "hycapi_register_appl\n"); 
+       printk(KERN_NOTICE "hycapi_register_appl\n");
 #endif
-       MessageBufferSize = rp->level3cnt * rp->datablkcnt * rp->datablklen; 
+       MessageBufferSize = rp->level3cnt * rp->datablkcnt * rp->datablklen;
 
        len = CAPI_MSG_BASELEN + 8 + slen + 1;
        if (!(skb = alloc_skb(len, GFP_ATOMIC))) {
@@ -171,18 +171,18 @@ hycapi_register_internal(struct capi_ctr *ctrl, __u16 appl,
                       card->myid);
                return;
        }
-       memcpy(skb_put(skb,sizeof(__u16)), &len, sizeof(__u16));
-       memcpy(skb_put(skb,sizeof(__u16)), &appl, sizeof(__u16));
-       memcpy(skb_put(skb,sizeof(__u8)), &_command, sizeof(_command));
-       memcpy(skb_put(skb,sizeof(__u8)), &_subcommand, sizeof(_subcommand));
-       memcpy(skb_put(skb,sizeof(__u16)), &MessageNumber, sizeof(__u16));
-       memcpy(skb_put(skb,sizeof(__u16)), &MessageBufferSize, sizeof(__u16)); 
-       memcpy(skb_put(skb,sizeof(__u16)), &(rp->level3cnt), sizeof(__u16));
-       memcpy(skb_put(skb,sizeof(__u16)), &(rp->datablkcnt), sizeof(__u16));
-       memcpy(skb_put(skb,sizeof(__u16)), &(rp->datablklen), sizeof(__u16));
-       memcpy(skb_put(skb,slen), ExtFeatureDefaults, slen);
-       hycapi_applications[appl-1].ctrl_mask |= (1 << (ctrl->cnr-1));    
-       hycapi_send_message(ctrl, skb);    
+       memcpy(skb_put(skb, sizeof(__u16)), &len, sizeof(__u16));
+       memcpy(skb_put(skb, sizeof(__u16)), &appl, sizeof(__u16));
+       memcpy(skb_put(skb, sizeof(__u8)), &_command, sizeof(_command));
+       memcpy(skb_put(skb, sizeof(__u8)), &_subcommand, sizeof(_subcommand));
+       memcpy(skb_put(skb, sizeof(__u16)), &MessageNumber, sizeof(__u16));
+       memcpy(skb_put(skb, sizeof(__u16)), &MessageBufferSize, sizeof(__u16));
+       memcpy(skb_put(skb, sizeof(__u16)), &(rp->level3cnt), sizeof(__u16));
+       memcpy(skb_put(skb, sizeof(__u16)), &(rp->datablkcnt), sizeof(__u16));
+       memcpy(skb_put(skb, sizeof(__u16)), &(rp->datablklen), sizeof(__u16));
+       memcpy(skb_put(skb, slen), ExtFeatureDefaults, slen);
+       hycapi_applications[appl - 1].ctrl_mask |= (1 << (ctrl->cnr - 1));
+       hycapi_send_message(ctrl, skb);
 }
 
 /************************************************************
@@ -200,12 +200,12 @@ static void hycapi_restart_internal(struct capi_ctr *ctrl)
 #ifdef HYCAPI_PRINTFNAMES
        printk(KERN_WARNING "HYSDN: hycapi_restart_internal");
 #endif
-       for(i=0; i<CAPI_MAXAPPL; i++) {
-               if(_hycapi_appCheck(i+1, ctrl->cnr) == 1) {
-                       hycapi_register_internal(ctrl, i+1, 
+       for (i = 0; i < CAPI_MAXAPPL; i++) {
+               if (_hycapi_appCheck(i + 1, ctrl->cnr) == 1) {
+                       hycapi_register_internal(ctrl, i + 1,
                                                 &hycapi_applications[i].rp);
-                       if(hycapi_applications[i].listen_req[ctrl->cnr-1]) {
-                               skb = skb_copy(hycapi_applications[i].listen_req[ctrl->cnr-1], GFP_ATOMIC);
+                       if (hycapi_applications[i].listen_req[ctrl->cnr - 1]) {
+                               skb = skb_copy(hycapi_applications[i].listen_req[ctrl->cnr - 1], GFP_ATOMIC);
                                hycapi_sendmsg_internal(ctrl, skb);
                        }
                }
@@ -220,35 +220,35 @@ The application is recorded in the internal list.
 *************************************************************/
 
 static void
-hycapi_register_appl(struct capi_ctr *ctrl, __u16 appl, 
+hycapi_register_appl(struct capi_ctr *ctrl, __u16 appl,
                     capi_register_params *rp)
 {
        int MaxLogicalConnections = 0, MaxBDataBlocks = 0, MaxBDataLen = 0;
        hycapictrl_info *cinfo = (hycapictrl_info *)(ctrl->driverdata);
        hysdn_card *card = cinfo->card;
        int chk = _hycapi_appCheck(appl, ctrl->cnr);
-       if(chk < 0) {
+       if (chk < 0) {
                return;
        }
-       if(chk == 1) {
+       if (chk == 1) {
                printk(KERN_INFO "HYSDN: apl %d already registered\n", appl);
                return;
        }
        MaxBDataBlocks = rp->datablkcnt > CAPI_MAXDATAWINDOW ? CAPI_MAXDATAWINDOW : rp->datablkcnt;
        rp->datablkcnt = MaxBDataBlocks;
-       MaxBDataLen = rp->datablklen < 1024 ? 1024 : rp->datablklen ;
+       MaxBDataLen = rp->datablklen < 1024 ? 1024 : rp->datablklen;
        rp->datablklen = MaxBDataLen;
-       
+
        MaxLogicalConnections = rp->level3cnt;
        if (MaxLogicalConnections < 0) {
-               MaxLogicalConnections = card->bchans * -MaxLogicalConnections; 
+               MaxLogicalConnections = card->bchans * -MaxLogicalConnections;
        }
        if (MaxLogicalConnections == 0) {
                MaxLogicalConnections = card->bchans;
        }
-       
+
        rp->level3cnt = MaxLogicalConnections;
-       memcpy(&hycapi_applications[appl-1].rp, 
+       memcpy(&hycapi_applications[appl - 1].rp,
               rp, sizeof(capi_register_params));
 }
 
@@ -279,19 +279,19 @@ static void hycapi_release_internal(struct capi_ctr *ctrl, __u16 appl)
                       card->myid);
                return;
        }
-       memcpy(skb_put(skb,sizeof(__u16)), &len, sizeof(__u16));
-       memcpy(skb_put(skb,sizeof(__u16)), &appl, sizeof(__u16));
-       memcpy(skb_put(skb,sizeof(__u8)), &_command, sizeof(_command));
-       memcpy(skb_put(skb,sizeof(__u8)), &_subcommand, sizeof(_subcommand));
-       memcpy(skb_put(skb,sizeof(__u16)), &MessageNumber, sizeof(__u16));    
-       hycapi_send_message(ctrl, skb);    
-       hycapi_applications[appl-1].ctrl_mask &= ~(1 << (ctrl->cnr-1));    
+       memcpy(skb_put(skb, sizeof(__u16)), &len, sizeof(__u16));
+       memcpy(skb_put(skb, sizeof(__u16)), &appl, sizeof(__u16));
+       memcpy(skb_put(skb, sizeof(__u8)), &_command, sizeof(_command));
+       memcpy(skb_put(skb, sizeof(__u8)), &_subcommand, sizeof(_subcommand));
+       memcpy(skb_put(skb, sizeof(__u16)), &MessageNumber, sizeof(__u16));
+       hycapi_send_message(ctrl, skb);
+       hycapi_applications[appl - 1].ctrl_mask &= ~(1 << (ctrl->cnr - 1));
 }
 
 /******************************************************************
 hycapi_release_appl
 
-Release the application from the internal list an remove it's 
+Release the application from the internal list an remove it's
 registration at controller-level
 ******************************************************************/
 
@@ -301,15 +301,15 @@ hycapi_release_appl(struct capi_ctr *ctrl, __u16 appl)
        int chk;
 
        chk = _hycapi_appCheck(appl, ctrl->cnr);
-       if(chk<0) {
+       if (chk < 0) {
                printk(KERN_ERR "HYCAPI: Releasing invalid appl %d on controller %d\n", appl, ctrl->cnr);
                return;
        }
-       if(hycapi_applications[appl-1].listen_req[ctrl->cnr-1]) {
-               kfree_skb(hycapi_applications[appl-1].listen_req[ctrl->cnr-1]);
-               hycapi_applications[appl-1].listen_req[ctrl->cnr-1] = NULL;
+       if (hycapi_applications[appl - 1].listen_req[ctrl->cnr - 1]) {
+               kfree_skb(hycapi_applications[appl - 1].listen_req[ctrl->cnr - 1]);
+               hycapi_applications[appl - 1].listen_req[ctrl->cnr - 1] = NULL;
        }
-       if(chk == 1)
+       if (chk == 1)
        {
                hycapi_release_internal(ctrl, appl);
        }
@@ -327,7 +327,7 @@ int hycapi_capi_release(hysdn_card *card)
 #ifdef HYCAPI_PRINTFNAMES
        printk(KERN_NOTICE "hycapi_capi_release\n");
 #endif
-       if(cinfo) {
+       if (cinfo) {
                ctrl = &cinfo->capi_ctrl;
                hycapi_remove_ctr(ctrl);
        }
@@ -347,7 +347,7 @@ int hycapi_capi_stop(hysdn_card *card)
 #ifdef HYCAPI_PRINTFNAMES
        printk(KERN_NOTICE "hycapi_capi_stop\n");
 #endif
-       if(cinfo) {
+       if (cinfo) {
                ctrl = &cinfo->capi_ctrl;
 /*             ctrl->suspend_output(ctrl); */
                capi_ctr_down(ctrl);
@@ -377,59 +377,59 @@ static u16 hycapi_send_message(struct capi_ctr *ctrl, struct sk_buff *skb)
        u16 retval = CAPI_NOERROR;
 
        appl_id = CAPIMSG_APPID(skb->data);
-       switch(_hycapi_appCheck(appl_id, ctrl->cnr))
+       switch (_hycapi_appCheck(appl_id, ctrl->cnr))
        {
-               case 0:
+       case 0:
 /*                     printk(KERN_INFO "Need to register\n"); */
-                       hycapi_register_internal(ctrl, 
-                                                appl_id,
-                                                &(hycapi_applications[appl_id-1].rp));
-                       break;
-               case 1:
-                       break;
-               default:
-                       printk(KERN_ERR "HYCAPI: Controller mixup!\n");
-                       retval = CAPI_ILLAPPNR;
-                       goto out;
+               hycapi_register_internal(ctrl,
+                                        appl_id,
+                                        &(hycapi_applications[appl_id - 1].rp));
+               break;
+       case 1:
+               break;
+       default:
+               printk(KERN_ERR "HYCAPI: Controller mixup!\n");
+               retval = CAPI_ILLAPPNR;
+               goto out;
        }
-       switch(CAPIMSG_CMD(skb->data)) {                
-               case CAPI_DISCONNECT_B3_RESP:
-                       capilib_free_ncci(&cinfo->ncci_head, appl_id, 
-                                         CAPIMSG_NCCI(skb->data));
-                       break;
-               case CAPI_DATA_B3_REQ:
-                       _len = CAPIMSG_LEN(skb->data);
-                       if (_len > 22) {
-                               _len2 = _len - 22;
-                               skb_copy_from_linear_data(skb, msghead, 22);
-                               skb_copy_to_linear_data_offset(skb, _len2,
-                                                              msghead, 22);
-                               skb_pull(skb, _len2);
-                               CAPIMSG_SETLEN(skb->data, 22);
-                               retval = capilib_data_b3_req(&cinfo->ncci_head,
-                                                            CAPIMSG_APPID(skb->data),
-                                                            CAPIMSG_NCCI(skb->data),
-                                                            CAPIMSG_MSGID(skb->data));
-                       }
-                       break;
-               case CAPI_LISTEN_REQ:
-                       if(hycapi_applications[appl_id-1].listen_req[ctrl->cnr-1])
-                       {
-                               kfree_skb(hycapi_applications[appl_id-1].listen_req[ctrl->cnr-1]);
-                               hycapi_applications[appl_id-1].listen_req[ctrl->cnr-1] = NULL;
-                       }
-                       if (!(hycapi_applications[appl_id-1].listen_req[ctrl->cnr-1] = skb_copy(skb, GFP_ATOMIC))) 
-                       {
-                               printk(KERN_ERR "HYSDN: memory squeeze in private_listen\n");
-                       } 
-                       break;
-               default:
-                       break;
+       switch (CAPIMSG_CMD(skb->data)) {
+       case CAPI_DISCONNECT_B3_RESP:
+               capilib_free_ncci(&cinfo->ncci_head, appl_id,
+                                 CAPIMSG_NCCI(skb->data));
+               break;
+       case CAPI_DATA_B3_REQ:
+               _len = CAPIMSG_LEN(skb->data);
+               if (_len > 22) {
+                       _len2 = _len - 22;
+                       skb_copy_from_linear_data(skb, msghead, 22);
+                       skb_copy_to_linear_data_offset(skb, _len2,
+                                                      msghead, 22);
+                       skb_pull(skb, _len2);
+                       CAPIMSG_SETLEN(skb->data, 22);
+                       retval = capilib_data_b3_req(&cinfo->ncci_head,
+                                                    CAPIMSG_APPID(skb->data),
+                                                    CAPIMSG_NCCI(skb->data),
+                                                    CAPIMSG_MSGID(skb->data));
+               }
+               break;
+       case CAPI_LISTEN_REQ:
+               if (hycapi_applications[appl_id - 1].listen_req[ctrl->cnr - 1])
+               {
+                       kfree_skb(hycapi_applications[appl_id - 1].listen_req[ctrl->cnr - 1]);
+                       hycapi_applications[appl_id - 1].listen_req[ctrl->cnr - 1] = NULL;
+               }
+               if (!(hycapi_applications[appl_id  -1].listen_req[ctrl->cnr - 1] = skb_copy(skb, GFP_ATOMIC)))
+               {
+                       printk(KERN_ERR "HYSDN: memory squeeze in private_listen\n");
+               }
+               break;
+       default:
+               break;
        }
- out:
+out:
        if (retval == CAPI_NOERROR)
                hycapi_sendmsg_internal(ctrl, skb);
-       else 
+       else
                dev_kfree_skb_any(skb);
 
        return retval;
@@ -445,14 +445,14 @@ static int hycapi_proc_show(struct seq_file *m, void *v)
        seq_printf(m, "%-16s %s\n", "name", cinfo->cardname);
        seq_printf(m, "%-16s 0x%x\n", "io", card->iobase);
        seq_printf(m, "%-16s %d\n", "irq", card->irq);
-    
+
        switch (card->brdtype) {
-               case BD_PCCARD:  s = "HYSDN Hycard"; break;
-               case BD_ERGO: s = "HYSDN Ergo2"; break;
-               case BD_METRO: s = "HYSDN Metro4"; break;
-               case BD_CHAMP2: s = "HYSDN Champ2";     break;
-               case BD_PLEXUS: s = "HYSDN Plexus30"; break;
-               default: s = "???"; break;
+       case BD_PCCARD:  s = "HYSDN Hycard"; break;
+       case BD_ERGO: s = "HYSDN Ergo2"; break;
+       case BD_METRO: s = "HYSDN Metro4"; break;
+       case BD_CHAMP2: s = "HYSDN Champ2";     break;
+       case BD_PLEXUS: s = "HYSDN Plexus30"; break;
+       default: s = "???"; break;
        }
        seq_printf(m, "%-16s %s\n", "type", s);
        if ((s = cinfo->version[VER_DRIVER]) != NULL)
@@ -461,9 +461,9 @@ static int hycapi_proc_show(struct seq_file *m, void *v)
                seq_printf(m, "%-16s %s\n", "ver_cardtype", s);
        if ((s = cinfo->version[VER_SERIAL]) != NULL)
                seq_printf(m, "%-16s %s\n", "ver_serial", s);
-    
+
        seq_printf(m, "%-16s %s\n", "cardname", cinfo->cardname);
-    
+
        return 0;
 }
 
@@ -491,7 +491,7 @@ on capi-interface registration.
 static int hycapi_load_firmware(struct capi_ctr *ctrl, capiloaddata *data)
 {
 #ifdef HYCAPI_PRINTFNAMES
-       printk(KERN_NOTICE "hycapi_load_firmware\n");    
+       printk(KERN_NOTICE "hycapi_load_firmware\n");
 #endif
        return 0;
 }
@@ -501,7 +501,7 @@ static char *hycapi_procinfo(struct capi_ctr *ctrl)
 {
        hycapictrl_info *cinfo = (hycapictrl_info *)(ctrl->driverdata);
 #ifdef HYCAPI_PRINTFNAMES
-       printk(KERN_NOTICE "hycapi_proc_info\n");    
+       printk(KERN_NOTICE "hycapi_proc_info\n");
 #endif
        if (!cinfo)
                return "";
@@ -525,7 +525,7 @@ New nccis are created if necessary.
 *******************************************************************/
 
 void
-hycapi_rx_capipkt(hysdn_card * card, unsigned char *buf, unsigned short len)
+hycapi_rx_capipkt(hysdn_card *card, unsigned char *buf, unsigned short len)
 {
        struct sk_buff *skb;
        hycapictrl_info *cinfo = card->hyctrlinfo;
@@ -533,24 +533,24 @@ hycapi_rx_capipkt(hysdn_card * card, unsigned char *buf, unsigned short len)
        __u16 ApplId;
        __u16 MsgLen, info;
        __u16 len2, CapiCmd;
-       __u32 CP64[2] = {0,0};
+       __u32 CP64[2] = {0, 0};
 #ifdef HYCAPI_PRINTFNAMES
-       printk(KERN_NOTICE "hycapi_rx_capipkt\n");    
+       printk(KERN_NOTICE "hycapi_rx_capipkt\n");
 #endif
-       if(!cinfo) {
+       if (!cinfo) {
                return;
        }
        ctrl = &cinfo->capi_ctrl;
-       if(len < CAPI_MSG_BASELEN) {
+       if (len < CAPI_MSG_BASELEN) {
                printk(KERN_ERR "HYSDN Card%d: invalid CAPI-message, length %d!\n",
                       card->myid, len);
                return;
-       }       
+       }
        MsgLen = CAPIMSG_LEN(buf);
        ApplId = CAPIMSG_APPID(buf);
        CapiCmd = CAPIMSG_CMD(buf);
-       
-       if((CapiCmd == CAPI_DATA_B3_IND) && (MsgLen < 30)) {
+
+       if ((CapiCmd == CAPI_DATA_B3_IND) && (MsgLen < 30)) {
                len2 = len + (30 - MsgLen);
                if (!(skb = alloc_skb(len2, GFP_ATOMIC))) {
                        printk(KERN_ERR "HYSDN Card%d: incoming packet dropped\n",
@@ -558,7 +558,7 @@ hycapi_rx_capipkt(hysdn_card * card, unsigned char *buf, unsigned short len)
                        return;
                }
                memcpy(skb_put(skb, MsgLen), buf, MsgLen);
-               memcpy(skb_put(skb, 2*sizeof(__u32)), CP64, 2* sizeof(__u32));
+               memcpy(skb_put(skb, 2 * sizeof(__u32)), CP64, 2 * sizeof(__u32));
                memcpy(skb_put(skb, len - MsgLen), buf + MsgLen,
                       len - MsgLen);
                CAPIMSG_SETLEN(skb->data, 30);
@@ -570,54 +570,54 @@ hycapi_rx_capipkt(hysdn_card * card, unsigned char *buf, unsigned short len)
                }
                memcpy(skb_put(skb, len), buf, len);
        }
-       switch(CAPIMSG_CMD(skb->data)) 
+       switch (CAPIMSG_CMD(skb->data))
        {
-               case CAPI_CONNECT_B3_CONF:
+       case CAPI_CONNECT_B3_CONF:
 /* Check info-field for error-indication: */
-                       info = CAPIMSG_U16(skb->data, 12);
-                       switch(info)
-                       {
-                               case 0:
-                                       capilib_new_ncci(&cinfo->ncci_head, ApplId, CAPIMSG_NCCI(skb->data), 
-                                                        hycapi_applications[ApplId-1].rp.datablkcnt); 
-                                       
-                                       break;
-                               case 0x0001:
-                                       printk(KERN_ERR "HYSDN Card%d: NCPI not supported by current "
-                                              "protocol. NCPI ignored.\n", card->myid);
-                                       break;
-                               case 0x2001:
-                                       printk(KERN_ERR "HYSDN Card%d: Message not supported in"
-                                              " current state\n", card->myid);
-                                       break;
-                               case 0x2002:
-                                       printk(KERN_ERR "HYSDN Card%d: invalid PLCI\n", card->myid);
-                                       break;          
-                               case 0x2004:
-                                       printk(KERN_ERR "HYSDN Card%d: out of NCCI\n", card->myid);
-                                       break;                          
-                               case 0x3008:
-                                       printk(KERN_ERR "HYSDN Card%d: NCPI not supported\n", 
-                                              card->myid);
-                                       break;  
-                               default:
-                                       printk(KERN_ERR "HYSDN Card%d: Info in CONNECT_B3_CONF: %d\n", 
-                                              card->myid, info);
-                                       break;                  
-                       }
+               info = CAPIMSG_U16(skb->data, 12);
+               switch (info)
+               {
+               case 0:
+                       capilib_new_ncci(&cinfo->ncci_head, ApplId, CAPIMSG_NCCI(skb->data),
+                                        hycapi_applications[ApplId - 1].rp.datablkcnt);
+
+                       break;
+               case 0x0001:
+                       printk(KERN_ERR "HYSDN Card%d: NCPI not supported by current "
+                              "protocol. NCPI ignored.\n", card->myid);
                        break;
-               case CAPI_CONNECT_B3_IND:
-                       capilib_new_ncci(&cinfo->ncci_head, ApplId, 
-                                        CAPIMSG_NCCI(skb->data), 
-                                        hycapi_applications[ApplId-1].rp.datablkcnt);
+               case 0x2001:
+                       printk(KERN_ERR "HYSDN Card%d: Message not supported in"
+                              " current state\n", card->myid);
                        break;
-               case CAPI_DATA_B3_CONF:
-                       capilib_data_b3_conf(&cinfo->ncci_head, ApplId,
-                                            CAPIMSG_NCCI(skb->data),
-                                            CAPIMSG_MSGID(skb->data));
+               case 0x2002:
+                       printk(KERN_ERR "HYSDN Card%d: invalid PLCI\n", card->myid);
+                       break;
+               case 0x2004:
+                       printk(KERN_ERR "HYSDN Card%d: out of NCCI\n", card->myid);
+                       break;
+               case 0x3008:
+                       printk(KERN_ERR "HYSDN Card%d: NCPI not supported\n",
+                              card->myid);
                        break;
                default:
+                       printk(KERN_ERR "HYSDN Card%d: Info in CONNECT_B3_CONF: %d\n",
+                              card->myid, info);
                        break;
+               }
+               break;
+       case CAPI_CONNECT_B3_IND:
+               capilib_new_ncci(&cinfo->ncci_head, ApplId,
+                                CAPIMSG_NCCI(skb->data),
+                                hycapi_applications[ApplId - 1].rp.datablkcnt);
+               break;
+       case CAPI_DATA_B3_CONF:
+               capilib_data_b3_conf(&cinfo->ncci_head, ApplId,
+                                    CAPIMSG_NCCI(skb->data),
+                                    CAPIMSG_MSGID(skb->data));
+               break;
+       default:
+               break;
        }
        capi_ctr_handle_message(ctrl, ApplId, skb);
 }
@@ -630,13 +630,13 @@ internal queue.
 
 *******************************************************************/
 
-void hycapi_tx_capiack(hysdn_card * card)
+void hycapi_tx_capiack(hysdn_card *card)
 {
        hycapictrl_info *cinfo = card->hyctrlinfo;
 #ifdef HYCAPI_PRINTFNAMES
-       printk(KERN_NOTICE "hycapi_tx_capiack\n");    
+       printk(KERN_NOTICE "hycapi_tx_capiack\n");
 #endif
-       if(!cinfo) {
+       if (!cinfo) {
                return;
        }
        spin_lock_irq(&cinfo->lock);
@@ -661,7 +661,7 @@ struct sk_buff *
 hycapi_tx_capiget(hysdn_card *card)
 {
        hycapictrl_info *cinfo = card->hyctrlinfo;
-       if(!cinfo) {
+       if (!cinfo) {
                return (struct sk_buff *)NULL;
        }
        if (!cinfo->sk_count)
@@ -681,10 +681,10 @@ attach the capi-driver to the kernel-capi.
 int hycapi_init(void)
 {
        int i;
-       for(i=0;i<CAPI_MAXAPPL;i++) {
+       for (i = 0; i < CAPI_MAXAPPL; i++) {
                memset(&(hycapi_applications[i]), 0, sizeof(hycapi_appl));
        }
-       return(0);
+       return (0);
 }
 
 /**************************************************************
@@ -694,7 +694,7 @@ detach the capi-driver to the kernel-capi. Actually this should
 free some more ressources. Do that later.
 **************************************************************/
 
-void 
+void
 hycapi_cleanup(void)
 {
 }
@@ -710,9 +710,9 @@ static void hycapi_fill_profile(hysdn_card *card)
        hycapictrl_info *cinfo = NULL;
        struct capi_ctr *ctrl = NULL;
        cinfo = card->hyctrlinfo;
-       if(!cinfo) return;
+       if (!cinfo) return;
        ctrl = &cinfo->capi_ctrl;
-       strcpy(ctrl->manu, "Hypercope");        
+       strcpy(ctrl->manu, "Hypercope");
        ctrl->version.majorversion = 2;
        ctrl->version.minorversion = 0;
        ctrl->version.majormanuversion = 3;
@@ -732,18 +732,18 @@ static void hycapi_fill_profile(hysdn_card *card)
                (card->faxchans ? B3_PROT_T30 : 0) |
                (card->faxchans ? B3_PROT_T30EXT : 0) |
                B3_PROT_ISO8208;
-}      
+}
 
-int 
+int
 hycapi_capi_create(hysdn_card *card)
 {
        hycapictrl_info *cinfo = NULL;
        struct capi_ctr *ctrl = NULL;
        int retval;
 #ifdef HYCAPI_PRINTFNAMES
-       printk(KERN_NOTICE "hycapi_capi_create\n");        
+       printk(KERN_NOTICE "hycapi_capi_create\n");
 #endif
-       if((hycapi_enable & (1 << card->myid)) == 0) {
+       if ((hycapi_enable & (1 << card->myid)) == 0) {
                return 1;
        }
        if (!card->hyctrlinfo) {
@@ -758,12 +758,12 @@ hycapi_capi_create(hysdn_card *card)
                INIT_LIST_HEAD(&cinfo->ncci_head);
 
                switch (card->brdtype) {
-                       case BD_PCCARD:  strcpy(cinfo->cardname,"HYSDN Hycard"); break;
-                       case BD_ERGO: strcpy(cinfo->cardname,"HYSDN Ergo2"); break;
-                       case BD_METRO: strcpy(cinfo->cardname,"HYSDN Metro4"); break;
-                       case BD_CHAMP2: strcpy(cinfo->cardname,"HYSDN Champ2"); break;
-                       case BD_PLEXUS: strcpy(cinfo->cardname,"HYSDN Plexus30"); break;
-                       default: strcpy(cinfo->cardname,"HYSDN ???"); break;
+               case BD_PCCARD:  strcpy(cinfo->cardname, "HYSDN Hycard"); break;
+               case BD_ERGO: strcpy(cinfo->cardname, "HYSDN Ergo2"); break;
+               case BD_METRO: strcpy(cinfo->cardname, "HYSDN Metro4"); break;
+               case BD_CHAMP2: strcpy(cinfo->cardname, "HYSDN Champ2"); break;
+               case BD_PLEXUS: strcpy(cinfo->cardname, "HYSDN Plexus30"); break;
+               default: strcpy(cinfo->cardname, "HYSDN ???"); break;
                }
 
                ctrl = &cinfo->capi_ctrl;
@@ -792,7 +792,7 @@ hycapi_capi_create(hysdn_card *card)
                ctrl = &card->hyctrlinfo->capi_ctrl;
                hycapi_fill_profile(card);
                capi_ctr_ready(ctrl);
-               hycapi_restart_internal(ctrl); 
+               hycapi_restart_internal(ctrl);
 /*             ctrl->resume_output(ctrl); */
        }
        return 0;
index 4f541ef..eda4741 100644 (file)
@@ -82,7 +82,7 @@ DecryptBuf(struct boot_data *boot, int cnt)
 /* id. If successful 0 is returned, a negative value shows an error.           */
 /********************************************************************************/
 static int
-pof_handle_data(hysdn_card * card, int datlen)
+pof_handle_data(hysdn_card *card, int datlen)
 {
        struct boot_data *boot = card->boot;    /* pointer to boot specific data */
        long l;
@@ -92,71 +92,71 @@ pof_handle_data(hysdn_card * card, int datlen)
        /* handle the different record types */
        switch (boot->pof_recid) {
 
-               case TAG_TIMESTMP:
-                       if (card->debug_flags & LOG_POF_RECORD)
-                               hysdn_addlog(card, "POF created %s", boot->buf.PofTime.DateTimeText);
-                       break;
+       case TAG_TIMESTMP:
+               if (card->debug_flags & LOG_POF_RECORD)
+                       hysdn_addlog(card, "POF created %s", boot->buf.PofTime.DateTimeText);
+               break;
+
+       case TAG_CBOOTDTA:
+               DecryptBuf(boot, datlen);       /* we need to encrypt the buffer */
+       case TAG_BOOTDTA:
+               if (card->debug_flags & LOG_POF_RECORD)
+                       hysdn_addlog(card, "POF got %s len=%d offs=0x%lx",
+                                    (boot->pof_recid == TAG_CBOOTDTA) ? "CBOOTDATA" : "BOOTDTA",
+                                    datlen, boot->pof_recoffset);
+
+               if (boot->pof_reclen != POF_BOOT_LOADER_TOTAL_SIZE) {
+                       boot->last_error = EPOF_BAD_IMG_SIZE;   /* invalid length */
+                       return (boot->last_error);
+               }
+               imgp = boot->buf.BootBuf;       /* start of buffer */
+               img_len = datlen;       /* maximum length to transfer */
+
+               l = POF_BOOT_LOADER_OFF_IN_PAGE -
+                       (boot->pof_recoffset & (POF_BOOT_LOADER_PAGE_SIZE - 1));
+               if (l > 0) {
+                       /* buffer needs to be truncated */
+                       imgp += l;      /* advance pointer */
+                       img_len -= l;   /* adjust len */
+               }
+               /* at this point no special handling for data wrapping over buffer */
+               /* is necessary, because the boot image always will be adjusted to */
+               /* match a page boundary inside the buffer.                        */
+               /* The buffer for the boot image on the card is filled in 2 cycles */
+               /* first the 1024 hi-words are put in the buffer, then the low 1024 */
+               /* word are handled in the same way with different offset.         */
+
+               if (img_len > 0) {
+                       /* data available for copy */
+                       if ((boot->last_error =
+                            card->writebootimg(card, imgp,
+                                               (boot->pof_recoffset > POF_BOOT_LOADER_PAGE_SIZE) ? 2 : 0)) < 0)
+                               return (boot->last_error);
+               }
+               break;  /* end of case boot image hi/lo */
 
-               case TAG_CBOOTDTA:
-                       DecryptBuf(boot, datlen);       /* we need to encrypt the buffer */
-               case TAG_BOOTDTA:
-                       if (card->debug_flags & LOG_POF_RECORD)
-                               hysdn_addlog(card, "POF got %s len=%d offs=0x%lx",
-                                            (boot->pof_recid == TAG_CBOOTDTA) ? "CBOOTDATA" : "BOOTDTA",
-                                            datlen, boot->pof_recoffset);
+       case TAG_CABSDATA:
+               DecryptBuf(boot, datlen);       /* we need to encrypt the buffer */
+       case TAG_ABSDATA:
+               if (card->debug_flags & LOG_POF_RECORD)
+                       hysdn_addlog(card, "POF got %s len=%d offs=0x%lx",
+                                    (boot->pof_recid == TAG_CABSDATA) ? "CABSDATA" : "ABSDATA",
+                                    datlen, boot->pof_recoffset);
 
-                       if (boot->pof_reclen != POF_BOOT_LOADER_TOTAL_SIZE) {
-                               boot->last_error = EPOF_BAD_IMG_SIZE;   /* invalid length */
-                               return (boot->last_error);
-                       }
-                       imgp = boot->buf.BootBuf;       /* start of buffer */
-                       img_len = datlen;       /* maximum length to transfer */
-
-                       l = POF_BOOT_LOADER_OFF_IN_PAGE -
-                           (boot->pof_recoffset & (POF_BOOT_LOADER_PAGE_SIZE - 1));
-                       if (l > 0) {
-                               /* buffer needs to be truncated */
-                               imgp += l;      /* advance pointer */
-                               img_len -= l;   /* adjust len */
-                       }
-                       /* at this point no special handling for data wrapping over buffer */
-                       /* is necessary, because the boot image always will be adjusted to */
-                       /* match a page boundary inside the buffer.                        */
-                       /* The buffer for the boot image on the card is filled in 2 cycles */
-                       /* first the 1024 hi-words are put in the buffer, then the low 1024 */
-                       /* word are handled in the same way with different offset.         */
-
-                       if (img_len > 0) {
-                               /* data available for copy */
-                               if ((boot->last_error =
-                                    card->writebootimg(card, imgp,
-                                                       (boot->pof_recoffset > POF_BOOT_LOADER_PAGE_SIZE) ? 2 : 0)) < 0)
-                                       return (boot->last_error);
-                       }
-                       break;  /* end of case boot image hi/lo */
-
-               case TAG_CABSDATA:
-                       DecryptBuf(boot, datlen);       /* we need to encrypt the buffer */
-               case TAG_ABSDATA:
-                       if (card->debug_flags & LOG_POF_RECORD)
-                               hysdn_addlog(card, "POF got %s len=%d offs=0x%lx",
-                                            (boot->pof_recid == TAG_CABSDATA) ? "CABSDATA" : "ABSDATA",
-                                            datlen, boot->pof_recoffset);
-
-                       if ((boot->last_error = card->writebootseq(card, boot->buf.BootBuf, datlen)) < 0)
-                               return (boot->last_error);      /* error writing data */
-
-                       if (boot->pof_recoffset + datlen >= boot->pof_reclen)
-                               return (card->waitpofready(card));      /* data completely spooled, wait for ready */
-
-                       break;  /* end of case boot seq data */
+               if ((boot->last_error = card->writebootseq(card, boot->buf.BootBuf, datlen)) < 0)
+                       return (boot->last_error);      /* error writing data */
 
-               default:
-                       if (card->debug_flags & LOG_POF_RECORD)
-                               hysdn_addlog(card, "POF got data(id=0x%lx) len=%d offs=0x%lx", boot->pof_recid,
-                                            datlen, boot->pof_recoffset);
+               if (boot->pof_recoffset + datlen >= boot->pof_reclen)
+                       return (card->waitpofready(card));      /* data completely spooled, wait for ready */
+
+               break;  /* end of case boot seq data */
+
+       default:
+               if (card->debug_flags & LOG_POF_RECORD)
+                       hysdn_addlog(card, "POF got data(id=0x%lx) len=%d offs=0x%lx", boot->pof_recid,
+                                    datlen, boot->pof_recoffset);
 
-                       break;  /* simply skip record */
+               break;  /* simply skip record */
        }                       /* switch boot->pof_recid */
 
        return (0);
@@ -171,7 +171,7 @@ pof_handle_data(hysdn_card * card, int datlen)
 /* occurred and booting must be aborted.                                       */
 /******************************************************************************/
 int
-pof_write_buffer(hysdn_card * card, int datlen)
+pof_write_buffer(hysdn_card *card, int datlen)
 {
        struct boot_data *boot = card->boot;    /* pointer to boot specific data */
 
@@ -184,77 +184,77 @@ pof_write_buffer(hysdn_card * card, int datlen)
                hysdn_addlog(card, "POF write: got %d bytes ", datlen);
 
        switch (boot->pof_state) {
-               case POF_READ_FILE_HEAD:
-                       if (card->debug_flags & LOG_POF_WRITE)
-                               hysdn_addlog(card, "POF write: checking file header");
-
-                       if (datlen != sizeof(tPofFileHdr)) {
-                               boot->last_error = -EPOF_INTERNAL;
-                               break;
-                       }
-                       if (boot->buf.PofFileHdr.Magic != TAGFILEMAGIC) {
-                               boot->last_error = -EPOF_BAD_MAGIC;
-                               break;
-                       }
-                       /* Setup the new state and vars */
-                       boot->Nrecs = (unsigned short)(boot->buf.PofFileHdr.N_PofRecs); /* limited to 65535 */
-                       boot->pof_state = POF_READ_TAG_HEAD;    /* now start with single tags */
-                       boot->last_error = sizeof(tPofRecHdr);  /* new length */
+       case POF_READ_FILE_HEAD:
+               if (card->debug_flags & LOG_POF_WRITE)
+                       hysdn_addlog(card, "POF write: checking file header");
+
+               if (datlen != sizeof(tPofFileHdr)) {
+                       boot->last_error = -EPOF_INTERNAL;
+                       break;
+               }
+               if (boot->buf.PofFileHdr.Magic != TAGFILEMAGIC) {
+                       boot->last_error = -EPOF_BAD_MAGIC;
+                       break;
+               }
+               /* Setup the new state and vars */
+               boot->Nrecs = (unsigned short)(boot->buf.PofFileHdr.N_PofRecs); /* limited to 65535 */
+               boot->pof_state = POF_READ_TAG_HEAD;    /* now start with single tags */
+               boot->last_error = sizeof(tPofRecHdr);  /* new length */
+               break;
+
+       case POF_READ_TAG_HEAD:
+               if (card->debug_flags & LOG_POF_WRITE)
+                       hysdn_addlog(card, "POF write: checking tag header");
+
+               if (datlen != sizeof(tPofRecHdr)) {
+                       boot->last_error = -EPOF_INTERNAL;
                        break;
+               }
+               boot->pof_recid = boot->buf.PofRecHdr.PofRecId;         /* actual pof recid */
+               boot->pof_reclen = boot->buf.PofRecHdr.PofRecDataLen;   /* total length */
+               boot->pof_recoffset = 0;        /* no starting offset */
 
-               case POF_READ_TAG_HEAD:
-                       if (card->debug_flags & LOG_POF_WRITE)
-                               hysdn_addlog(card, "POF write: checking tag header");
-
-                       if (datlen != sizeof(tPofRecHdr)) {
-                               boot->last_error = -EPOF_INTERNAL;
-                               break;
-                       }
-                       boot->pof_recid = boot->buf.PofRecHdr.PofRecId;         /* actual pof recid */
-                       boot->pof_reclen = boot->buf.PofRecHdr.PofRecDataLen;   /* total length */
-                       boot->pof_recoffset = 0;        /* no starting offset */
-
-                       if (card->debug_flags & LOG_POF_RECORD)
-                               hysdn_addlog(card, "POF: got record id=0x%lx length=%ld ",
-                                     boot->pof_recid, boot->pof_reclen);
-
-                       boot->pof_state = POF_READ_TAG_DATA;    /* now start with tag data */
-                       if (boot->pof_reclen < BOOT_BUF_SIZE)
-                               boot->last_error = boot->pof_reclen;    /* limit size */
-                       else
-                               boot->last_error = BOOT_BUF_SIZE;       /* maximum */
+               if (card->debug_flags & LOG_POF_RECORD)
+                       hysdn_addlog(card, "POF: got record id=0x%lx length=%ld ",
+                                    boot->pof_recid, boot->pof_reclen);
 
-                       if (!boot->last_error) {        /* no data inside record */
-                               boot->pof_state = POF_READ_TAG_HEAD;    /* now start with single tags */
-                               boot->last_error = sizeof(tPofRecHdr);  /* new length */
-                       }
-                       break;
+               boot->pof_state = POF_READ_TAG_DATA;    /* now start with tag data */
+               if (boot->pof_reclen < BOOT_BUF_SIZE)
+                       boot->last_error = boot->pof_reclen;    /* limit size */
+               else
+                       boot->last_error = BOOT_BUF_SIZE;       /* maximum */
 
-               case POF_READ_TAG_DATA:
-                       if (card->debug_flags & LOG_POF_WRITE)
-                               hysdn_addlog(card, "POF write: getting tag data");
-
-                       if (datlen != boot->last_error) {
-                               boot->last_error = -EPOF_INTERNAL;
-                               break;
-                       }
-                       if ((boot->last_error = pof_handle_data(card, datlen)) < 0)
-                               return (boot->last_error);      /* an error occurred */
-                       boot->pof_recoffset += datlen;
-                       if (boot->pof_recoffset >= boot->pof_reclen) {
-                               boot->pof_state = POF_READ_TAG_HEAD;    /* now start with single tags */
-                               boot->last_error = sizeof(tPofRecHdr);  /* new length */
-                       } else {
-                               if (boot->pof_reclen - boot->pof_recoffset < BOOT_BUF_SIZE)
-                                       boot->last_error = boot->pof_reclen - boot->pof_recoffset;      /* limit size */
-                               else
-                                       boot->last_error = BOOT_BUF_SIZE;       /* maximum */
-                       }
-                       break;
+               if (!boot->last_error) {        /* no data inside record */
+                       boot->pof_state = POF_READ_TAG_HEAD;    /* now start with single tags */
+                       boot->last_error = sizeof(tPofRecHdr);  /* new length */
+               }
+               break;
 
-               default:
-                       boot->last_error = -EPOF_INTERNAL;      /* unknown state */
+       case POF_READ_TAG_DATA:
+               if (card->debug_flags & LOG_POF_WRITE)
+                       hysdn_addlog(card, "POF write: getting tag data");
+
+               if (datlen != boot->last_error) {
+                       boot->last_error = -EPOF_INTERNAL;
                        break;
+               }
+               if ((boot->last_error = pof_handle_data(card, datlen)) < 0)
+                       return (boot->last_error);      /* an error occurred */
+               boot->pof_recoffset += datlen;
+               if (boot->pof_recoffset >= boot->pof_reclen) {
+                       boot->pof_state = POF_READ_TAG_HEAD;    /* now start with single tags */
+                       boot->last_error = sizeof(tPofRecHdr);  /* new length */
+               } else {
+                       if (boot->pof_reclen - boot->pof_recoffset < BOOT_BUF_SIZE)
+                               boot->last_error = boot->pof_reclen - boot->pof_recoffset;      /* limit size */
+                       else
+                               boot->last_error = BOOT_BUF_SIZE;       /* maximum */
+               }
+               break;
+
+       default:
+               boot->last_error = -EPOF_INTERNAL;      /* unknown state */
+               break;
        }                       /* switch (boot->pof_state) */
 
        return (boot->last_error);
@@ -268,7 +268,7 @@ pof_write_buffer(hysdn_card * card, int datlen)
 /* occurred. Additionally the pointer to the buffer data area is set on success */
 /*******************************************************************************/
 int
-pof_write_open(hysdn_card * card, unsigned char **bufp)
+pof_write_open(hysdn_card *card, unsigned char **bufp)
 {
        struct boot_data *boot; /* pointer to boot specific data */
 
@@ -310,7 +310,7 @@ pof_write_open(hysdn_card * card, unsigned char **bufp)
 /* The return value must be 0 if everything has happened as desired.            */
 /********************************************************************************/
 int
-pof_write_close(hysdn_card * card)
+pof_write_close(hysdn_card *card)
 {
        struct boot_data *boot = card->boot;    /* pointer to boot specific data */
 
@@ -367,27 +367,27 @@ EvalSysrTokData(hysdn_card *card, unsigned char *cp, int len)
                        return (1);
                }
                switch (*cp) {
-                       case SYSR_TOK_B_CHAN:   /* 1 */
-                               if (*(cp + 1) != 1)
-                                       return (1);     /* length invalid */
-                               card->bchans = *(cp + 2);
-                               break;
-
-                       case SYSR_TOK_FAX_CHAN: /* 2 */
-                               if (*(cp + 1) != 1)
-                                       return (1);     /* length invalid */
-                               card->faxchans = *(cp + 2);
-                               break;
-
-                       case SYSR_TOK_MAC_ADDR: /* 3 */
-                               if (*(cp + 1) != 6)
-                                       return (1);     /* length invalid */
-                               memcpy(card->mac_addr, cp + 2, 6);
-                               break;
-
-                       default:
-                               hysdn_addlog(card, "unknown token 0x%02x length %d", *cp, *(cp + 1));
-                               break;
+               case SYSR_TOK_B_CHAN:   /* 1 */
+                       if (*(cp + 1) != 1)
+                               return (1);     /* length invalid */
+                       card->bchans = *(cp + 2);
+                       break;
+
+               case SYSR_TOK_FAX_CHAN: /* 2 */
+                       if (*(cp + 1) != 1)
+                               return (1);     /* length invalid */
+                       card->faxchans = *(cp + 2);
+                       break;
+
+               case SYSR_TOK_MAC_ADDR: /* 3 */
+                       if (*(cp + 1) != 6)
+                               return (1);     /* length invalid */
+                       memcpy(card->mac_addr, cp + 2, 6);
+                       break;
+
+               default:
+                       hysdn_addlog(card, "unknown token 0x%02x length %d", *cp, *(cp + 1));
+                       break;
                }
                len -= (*(cp + 1) + 2);         /* adjust len */
                cp += (*(cp + 1) + 2);  /* and pointer */
index 18b801a..cdac46a 100644 (file)
@@ -41,7 +41,7 @@
 
 #define B1_PROT_64KBIT_HDLC        0x0001
 #define B1_PROT_64KBIT_TRANSPARENT 0x0002
-#define B1_PROT_V110_ASYNCH        0x0004 
+#define B1_PROT_V110_ASYNCH        0x0004
 #define B1_PROT_V110_SYNCH         0x0008
 #define B1_PROT_T30                0x0010
 #define B1_PROT_64KBIT_INV_HDLC    0x0020
@@ -199,14 +199,14 @@ typedef struct HYSDN_CARD {
                char *version[HYSDN_MAXVERSION];
 
                char infobuf[128];      /* for function procinfo */
-               
+
                struct HYSDN_CARD  *card;
                struct capi_ctr capi_ctrl;
                struct sk_buff *skbs[HYSDN_MAX_CAPI_SKB];
                int in_idx, out_idx;    /* indexes to buffer ring */
                int sk_count;           /* number of buffers currently in ring */
                struct sk_buff *tx_skb; /* buffer for tx operation */
-         
+
                struct list_head ncci_head;
        } *hyctrlinfo;
 #endif /* CONFIG_HYSDN_CAPI */
@@ -235,11 +235,11 @@ extern void hysdn_procconf_release(void); /* deinit proc config filesys */
 /* hysdn_proclog.c */
 extern int hysdn_proclog_init(hysdn_card *);   /* init proc log entry */
 extern void hysdn_proclog_release(hysdn_card *);       /* deinit proc log entry */
-extern void hysdn_addlog(hysdn_card *, char *,...);    /* output data to log */
+extern void hysdn_addlog(hysdn_card *, char *, ...);   /* output data to log */
 extern void hysdn_card_errlog(hysdn_card *, tErrLogEntry *, int);      /* output card log */
 
 /* boardergo.c */
-extern int ergo_inithardware(hysdn_card * card);       /* get hardware -> module init */
+extern int ergo_inithardware(hysdn_card *card);        /* get hardware -> module init */
 
 /* hysdn_boot.c */
 extern int pof_write_close(hysdn_card *);      /* close proc file after writing pof */
@@ -249,31 +249,31 @@ extern int EvalSysrTokData(hysdn_card *, unsigned char *, int);           /* Check Sysrea
 
 /* hysdn_sched.c */
 extern int hysdn_sched_tx(hysdn_card *, unsigned char *,
-                       unsigned short volatile *, unsigned short volatile *,
-                       unsigned short);
+                         unsigned short volatile *, unsigned short volatile *,
+                         unsigned short);
 extern int hysdn_sched_rx(hysdn_card *, unsigned char *, unsigned short,
-                       unsigned short);
+                         unsigned short);
 extern int hysdn_tx_cfgline(hysdn_card *, unsigned char *,
-                       unsigned short);        /* send one cfg line */
+                           unsigned short);    /* send one cfg line */
 
 /* hysdn_net.c */
-extern unsigned int hynet_enable; 
+extern unsigned int hynet_enable;
 extern int hysdn_net_create(hysdn_card *);     /* create a new net device */
 extern int hysdn_net_release(hysdn_card *);    /* delete the device */
 extern char *hysdn_net_getname(hysdn_card *);  /* get name of net interface */
 extern void hysdn_tx_netack(hysdn_card *);     /* acknowledge a packet tx */
 extern struct sk_buff *hysdn_tx_netget(hysdn_card *);  /* get next network packet */
 extern void hysdn_rx_netpkt(hysdn_card *, unsigned char *,
-                       unsigned short);        /* rxed packet from network */
+                           unsigned short);    /* rxed packet from network */
 
 #ifdef CONFIG_HYSDN_CAPI
-extern unsigned int hycapi_enable; 
+extern unsigned int hycapi_enable;
 extern int hycapi_capi_create(hysdn_card *);   /* create a new capi device */
 extern int hycapi_capi_release(hysdn_card *);  /* delete the device */
 extern int hycapi_capi_stop(hysdn_card *card);   /* suspend */
-extern void hycapi_rx_capipkt(hysdn_card * card, unsigned char * buf,
-                               unsigned short len);
-extern void hycapi_tx_capiack(hysdn_card * card);
+extern void hycapi_rx_capipkt(hysdn_card *card, unsigned char *buf,
+                             unsigned short len);
+extern void hycapi_tx_capiack(hysdn_card *card);
 extern struct sk_buff *hycapi_tx_capiget(hysdn_card *card);
 extern int hycapi_init(void);
 extern void hycapi_cleanup(void);
index 0ab42ac..b61bbb4 100644 (file)
@@ -169,8 +169,8 @@ hysdn_init(void)
                hysdn_have_procfs = 1;
 
 #ifdef CONFIG_HYSDN_CAPI
-       if(cardmax > 0) {
-               if(hycapi_init()) {
+       if (cardmax > 0) {
+               if (hycapi_init()) {
                        printk(KERN_ERR "HYCAPI: init failed\n");
 
                        if (hysdn_have_procfs)
index 11f2cce..a0efb4c 100644 (file)
@@ -23,7 +23,7 @@
 
 #include "hysdn_defs.h"
 
-unsigned int hynet_enable = 0xffffffff; 
+unsigned int hynet_enable = 0xffffffff;
 module_param(hynet_enable, uint, 0);
 
 #define MAX_SKB_BUFFERS 20     /* number of buffers for keeping TX-data */
@@ -155,7 +155,7 @@ net_send_packet(struct sk_buff *skb, struct net_device *dev)
 /* completion                                                          */
 /***********************************************************************/
 void
-hysdn_tx_netack(hysdn_card * card)
+hysdn_tx_netack(hysdn_card *card)
 {
        struct net_local *lp = card->netif;
 
@@ -181,7 +181,7 @@ hysdn_tx_netack(hysdn_card * card)
 /* we got a packet from the network, go and queue it */
 /*****************************************************/
 void
-hysdn_rx_netpkt(hysdn_card * card, unsigned char *buf, unsigned short len)
+hysdn_rx_netpkt(hysdn_card *card, unsigned char *buf, unsigned short len)
 {
        struct net_local *lp = card->netif;
        struct net_device *dev;
@@ -215,7 +215,7 @@ hysdn_rx_netpkt(hysdn_card * card, unsigned char *buf, unsigned short len)
 /* return the pointer to a network packet to be send */
 /*****************************************************/
 struct sk_buff *
-hysdn_tx_netget(hysdn_card * card)
+hysdn_tx_netget(hysdn_card *card)
 {
        struct net_local *lp = card->netif;
 
@@ -229,11 +229,11 @@ hysdn_tx_netget(hysdn_card * card)
 }                              /* hysdn_tx_netget */
 
 static const struct net_device_ops hysdn_netdev_ops = {
-       .ndo_open               = net_open,
+       .ndo_open               = net_open,
        .ndo_stop               = net_close,
        .ndo_start_xmit         = net_send_packet,
        .ndo_change_mtu         = eth_change_mtu,
-       .ndo_set_mac_address    = eth_mac_addr,
+       .ndo_set_mac_address    = eth_mac_addr,
        .ndo_validate_addr      = eth_validate_addr,
 };
 
@@ -244,13 +244,13 @@ static const struct net_device_ops hysdn_netdev_ops = {
 /* 0 announces success, else a negative error code will be returned.         */
 /*****************************************************************************/
 int
-hysdn_net_create(hysdn_card * card)
+hysdn_net_create(hysdn_card *card)
 {
        struct net_device *dev;
        int i;
        struct net_local *lp;
 
-       if(!card) {
+       if (!card) {
                printk(KERN_WARNING "No card-pt in hysdn_net_create!\n");
                return (-ENOMEM);
        }
@@ -291,7 +291,7 @@ hysdn_net_create(hysdn_card * card)
 /* value 0 announces success, else a negative error code will be returned. */
 /***************************************************************************/
 int
-hysdn_net_release(hysdn_card * card)
+hysdn_net_release(hysdn_card *card)
 {
        struct net_device *dev = card->netif;
 
@@ -316,7 +316,7 @@ hysdn_net_release(hysdn_card * card)
 /* if the interface is not existing, a "-" is returned.                      */
 /*****************************************************************************/
 char *
-hysdn_net_getname(hysdn_card * card)
+hysdn_net_getname(hysdn_card *card)
 {
        struct net_device *dev = card->netif;
 
index 3a72b90..f63f5fa 100644 (file)
@@ -16,9 +16,9 @@
 #define BOOT_BUF_SIZE   0x1000 /* =4096, maybe moved to other h file */
 #define CRYPT_FEEDTERM  0x8142
 #define CRYPT_STARTTERM 0x81a5
-                                   /*  max. timeout time in seconds
-                                    *  from end of booting to POF is ready
-                                    */
+/*  max. timeout time in seconds
+ *  from end of booting to POF is ready
+ */
 #define POF_READY_TIME_OUT_SEC  10
 
 /**********************************/
  */
 
 #define POF_BOOT_LOADER_PAGE_SIZE   0x4000     /* =16384U */
-#define POF_BOOT_LOADER_TOTAL_SIZE  (2U*POF_BOOT_LOADER_PAGE_SIZE)
+#define POF_BOOT_LOADER_TOTAL_SIZE  (2U * POF_BOOT_LOADER_PAGE_SIZE)
 
 #define POF_BOOT_LOADER_CODE_SIZE   0x0800     /* =2KB =2048U */
 
-                   /* offset in boot page, where loader code may start */
-                                           /* =0x3800= 14336U */
+/* offset in boot page, where loader code may start */
+/* =0x3800= 14336U */
 #define POF_BOOT_LOADER_OFF_IN_PAGE (POF_BOOT_LOADER_PAGE_SIZE-POF_BOOT_LOADER_CODE_SIZE)
 
 
 /*--------------------------------------POF file record structs------------*/
 typedef struct PofFileHdr_tag {        /* Pof file header */
-/*00 */ unsigned long Magic __attribute__((packed));
-/*04 */ unsigned long N_PofRecs __attribute__((packed));
+       /*00 */ unsigned long Magic __attribute__((packed));
+       /*04 */ unsigned long N_PofRecs __attribute__((packed));
 /*08 */
 } tPofFileHdr;
 
 typedef struct PofRecHdr_tag { /* Pof record header */
-/*00 */ unsigned short PofRecId __attribute__((packed));
-/*02 */ unsigned long PofRecDataLen __attribute__((packed));
+       /*00 */ unsigned short PofRecId __attribute__((packed));
+       /*02 */ unsigned long PofRecDataLen __attribute__((packed));
 /*06 */
 } tPofRecHdr;
 
 typedef struct PofTimeStamp_tag {
-/*00 */ unsigned long UnixTime __attribute__((packed));
+       /*00 */ unsigned long UnixTime __attribute__((packed));
        /*04 */ unsigned char DateTimeText[0x28];
        /* =40 */
 /*2C */
 } tPofTimeStamp;
 
-                                   /* tPofFileHdr.Magic value: */
+/* tPofFileHdr.Magic value: */
 #define TAGFILEMAGIC 0x464F501AUL
-                                   /* tPofRecHdr.PofRecId values: */
+/* tPofRecHdr.PofRecId values: */
 #define TAG_ABSDATA  0x1000    /* abs. data */
 #define TAG_BOOTDTA  0x1001    /* boot data */
 #define TAG_COMMENT  0x0020
index 5fe83bd..8023d25 100644 (file)
@@ -91,7 +91,7 @@ process_line(struct conf_writedata *cnf)
 /* write conf file -> boot or send cfg line to card */
 /****************************************************/
 static ssize_t
-hysdn_conf_write(struct file *file, const char __user *buf, size_t count, loff_t * off)
+hysdn_conf_write(struct file *file, const char __user *buf, size_t count, loff_t *off)
 {
        struct conf_writedata *cnf;
        int i;
@@ -366,7 +366,7 @@ static const struct file_operations conf_fops =
        .read           = hysdn_conf_read,
        .write          = hysdn_conf_write,
        .open           = hysdn_conf_open,
-       .release        = hysdn_conf_close,                                       
+       .release        = hysdn_conf_close,
 };
 
 /*****************************/
@@ -395,9 +395,9 @@ hysdn_procconf_init(void)
 
                sprintf(conf_name, "%s%d", PROC_CONF_BASENAME, card->myid);
                if ((card->procconf = (void *) proc_create(conf_name,
-                                               S_IFREG | S_IRUGO | S_IWUSR,
-                                               hysdn_proc_entry,
-                                               &conf_fops)) != NULL) {
+                                                          S_IFREG | S_IRUGO | S_IWUSR,
+                                                          hysdn_proc_entry,
+                                                          &conf_fops)) != NULL) {
                        hysdn_proclog_init(card);       /* init the log file entry */
                }
                card = card->next;      /* next entry */
index 236cc7d..ba91333 100644 (file)
@@ -24,7 +24,7 @@
 extern struct proc_dir_entry *hysdn_proc_entry;
 
 static DEFINE_MUTEX(hysdn_log_mutex);
-static void put_log_buffer(hysdn_card * card, char *cp);
+static void put_log_buffer(hysdn_card *card, char *cp);
 
 /*************************************************/
 /* structure keeping ascii log for device output */
@@ -54,7 +54,7 @@ struct procdata {
 /* log function for cards error log interface */
 /**********************************************/
 void
-hysdn_card_errlog(hysdn_card * card, tErrLogEntry * logp, int maxsize)
+hysdn_card_errlog(hysdn_card *card, tErrLogEntry *logp, int maxsize)
 {
        char buf[ERRLOG_TEXT_SIZE + 40];
 
@@ -66,7 +66,7 @@ hysdn_card_errlog(hysdn_card * card, tErrLogEntry * logp, int maxsize)
 /* Log function using format specifiers for output */
 /***************************************************/
 void
-hysdn_addlog(hysdn_card * card, char *fmt,...)
+hysdn_addlog(hysdn_card *card, char *fmt, ...)
 {
        struct procdata *pd = card->proclog;
        char *cp;
@@ -98,7 +98,7 @@ hysdn_addlog(hysdn_card * card, char *fmt,...)
 /* Flushes buffers not longer in use.       */
 /********************************************/
 static void
-put_log_buffer(hysdn_card * card, char *cp)
+put_log_buffer(hysdn_card *card, char *cp)
 {
        struct log_data *ib;
        struct procdata *pd = card->proclog;
@@ -115,7 +115,7 @@ put_log_buffer(hysdn_card * card, char *cp)
                return;         /* no open file for read */
 
        if (!(ib = kmalloc(sizeof(struct log_data) + strlen(cp), GFP_ATOMIC)))
-                return;        /* no memory */
+               return; /* no memory */
        strcpy(ib->log_start, cp);      /* set output string */
        ib->next = NULL;
        ib->proc_ctrl = pd;     /* point to own control structure */
@@ -153,7 +153,7 @@ put_log_buffer(hysdn_card * card, char *cp)
 /* write log file -> set log level bits */
 /****************************************/
 static ssize_t
-hysdn_log_write(struct file *file, const char __user *buf, size_t count, loff_t * off)
+hysdn_log_write(struct file *file, const char __user *buf, size_t count, loff_t *off)
 {
        int rc;
        unsigned char valbuf[128];
@@ -177,7 +177,7 @@ hysdn_log_write(struct file *file, const char __user *buf, size_t count, loff_t
 /* read log file */
 /******************/
 static ssize_t
-hysdn_log_read(struct file *file, char __user *buf, size_t count, loff_t * off)
+hysdn_log_read(struct file *file, char __user *buf, size_t count, loff_t *off)
 {
        struct log_data *inf;
        int len;
@@ -324,7 +324,7 @@ hysdn_log_close(struct inode *ino, struct file *filep)
 /* select/poll routine to be able using select() */
 /*************************************************/
 static unsigned int
-hysdn_log_poll(struct file *file, poll_table * wait)
+hysdn_log_poll(struct file *file, poll_table *wait)
 {
        unsigned int mask = 0;
        struct proc_dir_entry *pde = PDE(file->f_path.dentry->d_inode);
@@ -364,7 +364,7 @@ static const struct file_operations log_fops =
        .write          = hysdn_log_write,
        .poll           = hysdn_log_poll,
        .open           = hysdn_log_open,
-       .release        = hysdn_log_close,                                        
+       .release        = hysdn_log_close,
 };
 
 
@@ -373,7 +373,7 @@ static const struct file_operations log_fops =
 /* conf files.                                                                     */
 /***********************************************************************************/
 int
-hysdn_proclog_init(hysdn_card * card)
+hysdn_proclog_init(hysdn_card *card)
 {
        struct procdata *pd;
 
@@ -382,8 +382,8 @@ hysdn_proclog_init(hysdn_card * card)
        if ((pd = kzalloc(sizeof(struct procdata), GFP_KERNEL)) != NULL) {
                sprintf(pd->log_name, "%s%d", PROC_LOG_BASENAME, card->myid);
                pd->log = proc_create(pd->log_name,
-                               S_IFREG | S_IRUGO | S_IWUSR, hysdn_proc_entry,
-                               &log_fops);
+                                     S_IFREG | S_IRUGO | S_IWUSR, hysdn_proc_entry,
+                                     &log_fops);
 
                init_waitqueue_head(&(pd->rd_queue));
 
@@ -398,7 +398,7 @@ hysdn_proclog_init(hysdn_card * card)
 /* The module counter is assumed to be 0 !                                          */
 /************************************************************************************/
 void
-hysdn_proclog_release(hysdn_card * card)
+hysdn_proclog_release(hysdn_card *card)
 {
        struct procdata *pd;
 
index 3674d30..31d7c14 100644 (file)
 /*****************************************************************************/
 int
 hysdn_sched_rx(hysdn_card *card, unsigned char *buf, unsigned short len,
-                       unsigned short chan)
+              unsigned short chan)
 {
 
        switch (chan) {
-               case CHAN_NDIS_DATA:
-                       if (hynet_enable & (1 << card->myid)) {
-                          /* give packet to network handler */
-                               hysdn_rx_netpkt(card, buf, len);
-                       }
-                       break;
-
-               case CHAN_ERRLOG:
-                       hysdn_card_errlog(card, (tErrLogEntry *) buf, len);
-                       if (card->err_log_state == ERRLOG_STATE_ON)
-                               card->err_log_state = ERRLOG_STATE_START;       /* start new fetch */
-                       break;
+       case CHAN_NDIS_DATA:
+               if (hynet_enable & (1 << card->myid)) {
+                       /* give packet to network handler */
+                       hysdn_rx_netpkt(card, buf, len);
+               }
+               break;
+
+       case CHAN_ERRLOG:
+               hysdn_card_errlog(card, (tErrLogEntry *) buf, len);
+               if (card->err_log_state == ERRLOG_STATE_ON)
+                       card->err_log_state = ERRLOG_STATE_START;       /* start new fetch */
+               break;
 #ifdef CONFIG_HYSDN_CAPI
-               case CHAN_CAPI:
+       case CHAN_CAPI:
 /* give packet to CAPI handler */
-                       if (hycapi_enable & (1 << card->myid)) {
-                               hycapi_rx_capipkt(card, buf, len);
-                       }
-                       break;
+               if (hycapi_enable & (1 << card->myid)) {
+                       hycapi_rx_capipkt(card, buf, len);
+               }
+               break;
 #endif /* CONFIG_HYSDN_CAPI */
-               default:
-                       printk(KERN_INFO "irq message channel %d len %d unhandled \n", chan, len);
-                       break;
+       default:
+               printk(KERN_INFO "irq message channel %d len %d unhandled \n", chan, len);
+               break;
 
        }                       /* switch rx channel */
 
@@ -72,8 +72,8 @@ hysdn_sched_rx(hysdn_card *card, unsigned char *buf, unsigned short len,
 /*****************************************************************************/
 int
 hysdn_sched_tx(hysdn_card *card, unsigned char *buf,
-               unsigned short volatile *len, unsigned short volatile *chan,
-               unsigned short maxlen)
+              unsigned short volatile *len, unsigned short volatile *chan,
+              unsigned short maxlen)
 {
        struct sk_buff *skb;
 
@@ -109,8 +109,8 @@ hysdn_sched_tx(hysdn_card *card, unsigned char *buf,
                return (1);     /* tell that data should be send */
        }                       /* error log start and able to send */
        /* now handle network interface packets */
-       if ((hynet_enable & (1 << card->myid)) && 
-           (skb = hysdn_tx_netget(card)) != NULL) 
+       if ((hynet_enable & (1 << card->myid)) &&
+           (skb = hysdn_tx_netget(card)) != NULL)
        {
                if (skb->len <= maxlen) {
                        /* copy the packet to the buffer */
@@ -123,8 +123,8 @@ hysdn_sched_tx(hysdn_card *card, unsigned char *buf,
                        hysdn_tx_netack(card);  /* aknowledge packet -> throw away */
        }                       /* send a network packet if available */
 #ifdef CONFIG_HYSDN_CAPI
-       if( ((hycapi_enable & (1 << card->myid))) && 
-           ((skb = hycapi_tx_capiget(card)) != NULL) )
+       if (((hycapi_enable & (1 << card->myid))) &&
+           ((skb = hycapi_tx_capiget(card)) != NULL))
        {
                if (skb->len <= maxlen) {
                        skb_copy_from_linear_data(skb, buf, skb->len);
index 7a36694..cab6836 100644 (file)
 
 /*  basic scalar definitions have same meanning,
  *  but their declaration location depends on environment
- */ 
+ */
 
-/*--------------------------------------channel numbers---------------------*/ 
+/*--------------------------------------channel numbers---------------------*/
 #define CHAN_SYSTEM     0x0001      /* system channel (spooler to spooler) */
 #define CHAN_ERRLOG     0x0005      /* error logger */
 #define CHAN_CAPI       0x0064      /* CAPI interface */
 #define CHAN_NDIS_DATA  0x1001      /* NDIS data transfer */
 
-/*--------------------------------------POF ready msg-----------------------*/ 
-           /* NOTE: after booting POF sends system ready message to PC: */ 
+/*--------------------------------------POF ready msg-----------------------*/
+/* NOTE: after booting POF sends system ready message to PC: */
 #define RDY_MAGIC       0x52535953UL    /* 'SYSR' reversed */
 #define RDY_MAGIC_SIZE  4               /* size in bytes */
 
 #define MAX_N_TOK_BYTES 255
 
 #define MIN_RDY_MSG_SIZE    RDY_MAGIC_SIZE
-#define MAX_RDY_MSG_SIZE    (RDY_MAGIC_SIZE+MAX_N_TOK_BYTES)
+#define MAX_RDY_MSG_SIZE    (RDY_MAGIC_SIZE + MAX_N_TOK_BYTES)
 
 #define SYSR_TOK_END            0
 #define SYSR_TOK_B_CHAN         1   /* nr. of B-Channels;   DataLen=1; def: 2 */
 #define SYSR_TOK_FAX_CHAN       2   /* nr. of FAX Channels; DataLen=1; def: 0 */
 #define SYSR_TOK_MAC_ADDR       3   /* MAC-Address; DataLen=6; def: auto */
 #define SYSR_TOK_ESC            255 /* undefined data size yet */
-                           /* default values, if not corrected by token: */ 
+/* default values, if not corrected by token: */
 #define SYSR_TOK_B_CHAN_DEF     2   /* assume 2 B-Channels */
 #define SYSR_TOK_FAX_CHAN_DEF   1   /* assume 1 FAX Channel */
 
  *
  *  note:
  *  - for 16-bit FIFO add padding 0 byte to achieve even token data bytes!
- */ 
+ */
 
-/*--------------------------------------error logger------------------------*/ 
-                                           /* note: pof needs final 0 ! */ 
+/*--------------------------------------error logger------------------------*/
+/* note: pof needs final 0 ! */
 #define ERRLOG_CMD_REQ          "ERRLOG ON"
 #define ERRLOG_CMD_REQ_SIZE     10              /* with final 0 byte ! */
 #define ERRLOG_CMD_STOP         "ERRLOG OFF"
 #define ERRLOG_CMD_STOP_SIZE    11              /* with final 0 byte ! */
 
 #define ERRLOG_ENTRY_SIZE       64      /* sizeof(tErrLogEntry) */
-                                       /* remaining text size = 55 */ 
-#define ERRLOG_TEXT_SIZE    (ERRLOG_ENTRY_SIZE-2*4-1)
+                                       /* remaining text size = 55 */
+#define ERRLOG_TEXT_SIZE    (ERRLOG_ENTRY_SIZE - 2 * 4 - 1)
 
 typedef struct ErrLogEntry_tag {
-       
-/*00 */ unsigned long ulErrType;
-       
-/*04 */ unsigned long ulErrSubtype;
-       
-/*08 */ unsigned char ucTextSize;
-       
+
+       /*00 */ unsigned long ulErrType;
+
+       /*04 */ unsigned long ulErrSubtype;
+
+       /*08 */ unsigned char ucTextSize;
+
        /*09 */ unsigned char ucText[ERRLOG_TEXT_SIZE];
        /* ASCIIZ of len ucTextSize-1 */
-       
-/*40 */ 
+
+/*40 */
 } tErrLogEntry;
 
 
@@ -104,30 +104,30 @@ typedef struct ErrLogEntry_tag {
 #endif                         /*  */
 #endif                         /*  */
 
-/*--------------------------------------DPRAM boot spooler------------------*/ 
-                               /*  this is the struture used between pc and
-                                *  hyperstone to exchange boot data
-                                */ 
+/*--------------------------------------DPRAM boot spooler------------------*/
+/*  this is the struture used between pc and
+ *  hyperstone to exchange boot data
+ */
 #define DPRAM_SPOOLER_DATA_SIZE 0x20
 typedef struct DpramBootSpooler_tag {
-       
-/*00 */ unsigned char Len;
-       
-/*01 */ volatile unsigned char RdPtr;
-       
-/*02 */ unsigned char WrPtr;
-       
-/*03 */ unsigned char Data[DPRAM_SPOOLER_DATA_SIZE];
-       
-/*23 */ 
+
+       /*00 */ unsigned char Len;
+
+       /*01 */ volatile unsigned char RdPtr;
+
+       /*02 */ unsigned char WrPtr;
+
+       /*03 */ unsigned char Data[DPRAM_SPOOLER_DATA_SIZE];
+
+/*23 */
 } tDpramBootSpooler;
 
 
 #define DPRAM_SPOOLER_MIN_SIZE  5       /* Len+RdPtr+Wrptr+2*data */
 #define DPRAM_SPOOLER_DEF_SIZE  0x23    /* current default size   */
 
-/*--------------------------------------HYCARD/ERGO DPRAM SoftUart----------*/ 
-                                   /* at DPRAM offset 0x1C00: */ 
+/*--------------------------------------HYCARD/ERGO DPRAM SoftUart----------*/
+/* at DPRAM offset 0x1C00: */
 #define SIZE_RSV_SOFT_UART  0x1B0   /* 432 bytes reserved for SoftUart */
 
 
index d501393..78ce422 100644 (file)
@@ -204,9 +204,9 @@ isdn_audio_tlookup(const u_char *table, u_char *buff, unsigned long n)
                "xlatb\n\t"
                "stosb\n\t"
                "loop 1b\n\t"
-       :       "=&b"(d0), "=&c"(d1), "=&D"(d2), "=&S"(d3)
-       :       "0"((long) table), "1"(n), "2"((long) buff), "3"((long) buff)
-       :       "memory", "ax");
+               :       "=&b"(d0), "=&c"(d1), "=&D"(d2), "=&S"(d3)
+               :       "0"((long) table), "1"(n), "2"((long) buff), "3"((long) buff)
+               :       "memory", "ax");
 #else
        while (n--)
                *buff = table[*(unsigned char *)buff], buff++;
@@ -242,27 +242,27 @@ static unsigned char
 isdn_audio_linear2ulaw(int sample)
 {
        static int exp_lut[256] =
-       {
-               0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3,
-               4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
-               5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
-               5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
-               6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
-               6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
-               6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
-               6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
-               7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
-               7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
-               7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
-               7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
-               7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
-               7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
-               7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
-               7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7
-       };
+               {
+                       0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3,
+                       4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+                       5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+                       5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+                       6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+                       6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+                       6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+                       6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+                       7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+                       7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+                       7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+                       7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+                       7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+                       7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+                       7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+                       7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7
+               };
        int sign,
-        exponent,
-        mantissa;
+               exponent,
+               mantissa;
        unsigned char ulawbyte;
 
        /* Get the sample into sign-magnitude. */
@@ -299,7 +299,7 @@ static int bitmask[9] =
 };
 
 static int
-isdn_audio_get_bits(adpcm_state * s, unsigned char **in, int *len)
+isdn_audio_get_bits(adpcm_state *s, unsigned char **in, int *len)
 {
        while (s->nleft < s->nbits) {
                int d = *((*in)++);
@@ -312,7 +312,7 @@ isdn_audio_get_bits(adpcm_state * s, unsigned char **in, int *len)
 }
 
 static void
-isdn_audio_put_bits(int data, int nbits, adpcm_state * s,
+isdn_audio_put_bits(int data, int nbits, adpcm_state *s,
                    unsigned char **out, int *len)
 {
        s->word = (s->word << nbits) | (data & bitmask[nbits]);
@@ -326,7 +326,7 @@ isdn_audio_put_bits(int data, int nbits, adpcm_state * s,
 }
 
 adpcm_state *
-isdn_audio_adpcm_init(adpcm_state * s, int nbits)
+isdn_audio_adpcm_init(adpcm_state *s, int nbits)
 {
        if (!s)
                s = kmalloc(sizeof(adpcm_state), GFP_ATOMIC);
@@ -341,7 +341,7 @@ isdn_audio_adpcm_init(adpcm_state * s, int nbits)
 }
 
 dtmf_state *
-isdn_audio_dtmf_init(dtmf_state * s)
+isdn_audio_dtmf_init(dtmf_state *s)
 {
        if (!s)
                s = kmalloc(sizeof(dtmf_state), GFP_ATOMIC);
@@ -358,7 +358,7 @@ isdn_audio_dtmf_init(dtmf_state * s)
  */
 
 int
-isdn_audio_adpcm2xlaw(adpcm_state * s, int fmt, unsigned char *in,
+isdn_audio_adpcm2xlaw(adpcm_state *s, int fmt, unsigned char *in,
                      unsigned char *out, int len)
 {
        int a = s->a;
@@ -379,7 +379,7 @@ isdn_audio_adpcm2xlaw(adpcm_state * s, int fmt, unsigned char *in,
                        a++;
                if (fmt)
                        *out++ = isdn_audio_ulaw_to_alaw[
-                                        isdn_audio_linear2ulaw(a << 2)];
+                               isdn_audio_linear2ulaw(a << 2)];
                else
                        *out++ = isdn_audio_linear2ulaw(a << 2);
                olen++;
@@ -393,7 +393,7 @@ isdn_audio_adpcm2xlaw(adpcm_state * s, int fmt, unsigned char *in,
 }
 
 int
-isdn_audio_xlaw2adpcm(adpcm_state * s, int fmt, unsigned char *in,
+isdn_audio_xlaw2adpcm(adpcm_state *s, int fmt, unsigned char *in,
                      unsigned char *out, int len)
 {
        int a = s->a;
@@ -403,9 +403,9 @@ isdn_audio_xlaw2adpcm(adpcm_state * s, int fmt, unsigned char *in,
 
        while (len--) {
                int e = 0,
-                nmax = 1 << (nbits - 1);
+                       nmax = 1 << (nbits - 1);
                int sign,
-                delta;
+                       delta;
 
                if (fmt)
                        delta = (isdn_audio_alaw_to_s16[*in++] >> 2) - a;
@@ -439,26 +439,26 @@ isdn_audio_xlaw2adpcm(adpcm_state * s, int fmt, unsigned char *in,
 
 /*
  * Goertzel algorithm.
- * See http://ptolemy.eecs.berkeley.edu/papers/96/dtmf_ict/ 
+ * See http://ptolemy.eecs.berkeley.edu/papers/96/dtmf_ict/
  * for more info.
  * Result is stored into an sk_buff and queued up for later
  * evaluation.
  */
 static void
-isdn_audio_goertzel(int *sample, modem_info * info)
+isdn_audio_goertzel(int *sample, modem_info *info)
 {
        int sk,
-        sk1,
-        sk2;
+               sk1,
+               sk2;
        int k,
-        n;
+               n;
        struct sk_buff *skb;
        int *result;
 
        skb = dev_alloc_skb(sizeof(int) * NCOEFF);
        if (!skb) {
                printk(KERN_WARNING
-                 "isdn_audio: Could not alloc DTMF result for ttyI%d\n",
+                      "isdn_audio: Could not alloc DTMF result for ttyI%d\n",
                       info->line);
                return;
        }
@@ -483,16 +483,16 @@ isdn_audio_goertzel(int *sample, modem_info * info)
                        printk(KERN_DEBUG
                               "isdn_audio: dtmf goertzel overflow, sk2=%d\n", sk2);
                result[k] =
-                   ((sk * sk) >> AMP_BITS) -
-                   ((((cos2pik[k] * sk) >> 15) * sk2) >> AMP_BITS) +
-                   ((sk2 * sk2) >> AMP_BITS);
+                       ((sk * sk) >> AMP_BITS) -
+                       ((((cos2pik[k] * sk) >> 15) * sk2) >> AMP_BITS) +
+                       ((sk2 * sk2) >> AMP_BITS);
        }
        skb_queue_tail(&info->dtmf_queue, skb);
        isdn_timer_ctrl(ISDN_TIMER_MODEMREAD, 1);
 }
 
 void
-isdn_audio_eval_dtmf(modem_info * info)
+isdn_audio_eval_dtmf(modem_info *info)
 {
        struct sk_buff *skb;
        int *result;
@@ -590,7 +590,7 @@ isdn_audio_eval_dtmf(modem_info * info)
  *   fmt  = audio data format (0 = ulaw, 1 = alaw)
  */
 void
-isdn_audio_calc_dtmf(modem_info * info, unsigned char *buf, int len, int fmt)
+isdn_audio_calc_dtmf(modem_info *info, unsigned char *buf, int len, int fmt)
 {
        dtmf_state *s = info->dtmf_state;
        int i;
@@ -605,10 +605,10 @@ isdn_audio_calc_dtmf(modem_info * info, unsigned char *buf, int len, int fmt)
                for (i = 0; i < c; i++) {
                        if (fmt)
                                s->buf[s->idx++] =
-                                   isdn_audio_alaw_to_s16[*buf++] >> (15 - AMP_BITS);
+                                       isdn_audio_alaw_to_s16[*buf++] >> (15 - AMP_BITS);
                        else
                                s->buf[s->idx++] =
-                                   isdn_audio_ulaw_to_s16[*buf++] >> (15 - AMP_BITS);
+                                       isdn_audio_ulaw_to_s16[*buf++] >> (15 - AMP_BITS);
                }
                if (s->idx == DTMF_NPOINTS) {
                        isdn_audio_goertzel(s->buf, info);
@@ -619,7 +619,7 @@ isdn_audio_calc_dtmf(modem_info * info, unsigned char *buf, int len, int fmt)
 }
 
 silence_state *
-isdn_audio_silence_init(silence_state * s)
+isdn_audio_silence_init(silence_state *s)
 {
        if (!s)
                s = kmalloc(sizeof(silence_state), GFP_ATOMIC);
@@ -631,7 +631,7 @@ isdn_audio_silence_init(silence_state * s)
 }
 
 void
-isdn_audio_calc_silence(modem_info * info, unsigned char *buf, int len, int fmt)
+isdn_audio_calc_silence(modem_info *info, unsigned char *buf, int len, int fmt)
 {
        silence_state *s = info->silence_state;
        int i;
@@ -641,24 +641,24 @@ isdn_audio_calc_silence(modem_info * info, unsigned char *buf, int len, int fmt)
 
        for (i = 0; i < len; i++) {
                if (fmt)
-                   c = isdn_audio_alaw_to_ulaw[*buf++];
-                       else
-                   c = *buf++;
+                       c = isdn_audio_alaw_to_ulaw[*buf++];
+               else
+                       c = *buf++;
 
                if (c > 0) c -= 128;
                c = abs(c);
 
-               if (c > (info->emu.vpar[1] * 4)) { 
+               if (c > (info->emu.vpar[1] * 4)) {
                        s->idx = 0;
-                       s->state = 1; 
+                       s->state = 1;
                } else {
-                       if (s->idx < 210000) s->idx++; 
+                       if (s->idx < 210000) s->idx++;
                }
        }
 }
 
 void
-isdn_audio_put_dle_code(modem_info * info, u_char code)
+isdn_audio_put_dle_code(modem_info *info, u_char code)
 {
        struct sk_buff *skb;
        int di;
@@ -668,7 +668,7 @@ isdn_audio_put_dle_code(modem_info * info, u_char code)
        skb = dev_alloc_skb(2);
        if (!skb) {
                printk(KERN_WARNING
-                 "isdn_audio: Could not alloc skb for ttyI%d\n",
+                      "isdn_audio: Could not alloc skb for ttyI%d\n",
                       info->line);
                return;
        }
@@ -688,24 +688,24 @@ isdn_audio_put_dle_code(modem_info * info, u_char code)
 }
 
 void
-isdn_audio_eval_silence(modem_info * info)
+isdn_audio_eval_silence(modem_info *info)
 {
        silence_state *s = info->silence_state;
        char what;
 
        what = ' ';
 
-       if (s->idx > (info->emu.vpar[2] * 800)) { 
+       if (s->idx > (info->emu.vpar[2] * 800)) {
                s->idx = 0;
-               if (!s->state) {        /* silence from beginning of rec */ 
+               if (!s->state) {        /* silence from beginning of rec */
                        what = 's';
                } else {
                        what = 'q';
                }
        }
-               if ((what == 's') || (what == 'q')) {
-                       printk(KERN_DEBUG "ttyI%d: %s\n", info->line,
-                               (what=='s') ? "silence":"quiet");
-                       isdn_audio_put_dle_code(info, what);
-               } 
+       if ((what == 's') || (what == 'q')) {
+               printk(KERN_DEBUG "ttyI%d: %s\n", info->line,
+                      (what == 's') ? "silence" : "quiet");
+               isdn_audio_put_dle_code(info, what);
+       }
 }
index aa0b6a6..7f3c54d 100644 (file)
@@ -7,7 +7,7 @@
  */
 
 /*
- * Update: The Berkeley copyright was changed, and the change 
+ * Update: The Berkeley copyright was changed, and the change
  * is retroactive to all "true" BSD software (ie everything
  * from UCB as opposed to other peoples code that just carried
  * the same license). The new copyright doesn't clash with the
@@ -121,7 +121,7 @@ struct bsd_db {
        unsigned char  maxbits;         /* maximum bits/code */
        unsigned char  debug;           /* non-zero if debug desired */
        unsigned char  unit;            /* ppp unit number */
-       u16 seqno;                      /* sequence # of next packet */
+       u16 seqno;                      /* sequence # of next packet */
        unsigned int   mru;             /* size of receive (decompress) bufr */
        unsigned int   maxmaxcode;      /* largest valid code */
        unsigned int   max_ent;         /* largest code in use */
@@ -157,16 +157,16 @@ struct bsd_db {
 #define MAXCODE(b)     ((1 << (b)) - 1)
 #define BADCODEM1      MAXCODE(MAX_BSD_BITS)
 
-#define BSD_HASH(prefix,suffix,hshift) ((((unsigned long)(suffix))<<(hshift)) \
-                                        ^ (unsigned long)(prefix))
-#define BSD_KEY(prefix,suffix)         ((((unsigned long)(suffix)) << 16) \
+#define BSD_HASH(prefix, suffix, hshift) ((((unsigned long)(suffix)) << (hshift)) \
+                                         ^ (unsigned long)(prefix))
+#define BSD_KEY(prefix, suffix)                ((((unsigned long)(suffix)) << 16) \
                                         + (unsigned long)(prefix))
 
 #define CHECK_GAP      10000           /* Ratio check interval */
 
 #define RATIO_SCALE_LOG        8
-#define RATIO_SCALE    (1<<RATIO_SCALE_LOG)
-#define RATIO_MAX      (0x7fffffff>>RATIO_SCALE_LOG)
+#define RATIO_SCALE    (1 << RATIO_SCALE_LOG)
+#define RATIO_MAX      (0x7fffffff >> RATIO_SCALE_LOG)
 
 /*
  * clear the dictionary
@@ -175,7 +175,7 @@ struct bsd_db {
 static void bsd_clear(struct bsd_db *db)
 {
        db->clear_count++;
-       db->max_ent      = FIRST-1;
+       db->max_ent      = FIRST - 1;
        db->n_bits       = BSD_INIT_BITS;
        db->bytes_out    = 0;
        db->in_count     = 0;
@@ -197,56 +197,56 @@ static void bsd_clear(struct bsd_db *db)
  * the absence of CLEAR codes (while packets are incompressible), they
  * must compute the same ratio.
  */
-static int bsd_check (struct bsd_db *db)       /* 1=output CLEAR */
+static int bsd_check(struct bsd_db *db)        /* 1=output CLEAR */
 {
-    unsigned int new_ratio;
-
-    if (db->in_count >= db->checkpoint)
-      {
-       /* age the ratio by limiting the size of the counts */
-       if (db->in_count >= RATIO_MAX || db->bytes_out >= RATIO_MAX)
-         {
-           db->in_count  -= (db->in_count  >> 2);
-           db->bytes_out -= (db->bytes_out >> 2);
-         }
-       
-       db->checkpoint = db->in_count + CHECK_GAP;
-       
-       if (db->max_ent >= db->maxmaxcode)
-         {
-           /* Reset the dictionary only if the ratio is worse,
-            * or if it looks as if it has been poisoned
-            * by incompressible data.
-            *
-            * This does not overflow, because
-            *  db->in_count <= RATIO_MAX.
-            */
-
-           new_ratio = db->in_count << RATIO_SCALE_LOG;
-           if (db->bytes_out != 0)
-             {
-               new_ratio /= db->bytes_out;
-             }
-           
-           if (new_ratio < db->ratio || new_ratio < 1 * RATIO_SCALE)
-             {
-               bsd_clear (db);
-               return 1;
-             }
-           db->ratio = new_ratio;
-         }
-      }
-    return 0;
+       unsigned int new_ratio;
+
+       if (db->in_count >= db->checkpoint)
+       {
+               /* age the ratio by limiting the size of the counts */
+               if (db->in_count >= RATIO_MAX || db->bytes_out >= RATIO_MAX)
+               {
+                       db->in_count  -= (db->in_count  >> 2);
+                       db->bytes_out -= (db->bytes_out >> 2);
+               }
+
+               db->checkpoint = db->in_count + CHECK_GAP;
+
+               if (db->max_ent >= db->maxmaxcode)
+               {
+                       /* Reset the dictionary only if the ratio is worse,
+                        * or if it looks as if it has been poisoned
+                        * by incompressible data.
+                        *
+                        * This does not overflow, because
+                        *      db->in_count <= RATIO_MAX.
+                        */
+
+                       new_ratio = db->in_count << RATIO_SCALE_LOG;
+                       if (db->bytes_out != 0)
+                       {
+                               new_ratio /= db->bytes_out;
+                       }
+
+                       if (new_ratio < db->ratio || new_ratio < 1 * RATIO_SCALE)
+                       {
+                               bsd_clear(db);
+                               return 1;
+                       }
+                       db->ratio = new_ratio;
+               }
+       }
+       return 0;
 }
 
 /*
  * Return statistics.
  */
 
-static void bsd_stats (void *state, struct compstat *stats)
+static void bsd_stats(void *state, struct compstat *stats)
 {
        struct bsd_db *db = (struct bsd_db *) state;
-    
+
        stats->unc_bytes    = db->uncomp_bytes;
        stats->unc_packets  = db->uncomp_count;
        stats->comp_bytes   = db->comp_bytes;
@@ -260,9 +260,9 @@ static void bsd_stats (void *state, struct compstat *stats)
 /*
  * Reset state, as on a CCP ResetReq.
  */
-static void bsd_reset (void *state,unsigned char code, unsigned char id,
-                       unsigned char *data, unsigned len,
-                       struct isdn_ppp_resetparams *rsparm)
+static void bsd_reset(void *state, unsigned char code, unsigned char id,
+                     unsigned char *data, unsigned len,
+                     struct isdn_ppp_resetparams *rsparm)
 {
        struct bsd_db *db = (struct bsd_db *) state;
 
@@ -274,7 +274,7 @@ static void bsd_reset (void *state,unsigned char code, unsigned char id,
 /*
  * Release the compression structure
  */
-static void bsd_free (void *state)
+static void bsd_free(void *state)
 {
        struct bsd_db *db = (struct bsd_db *) state;
 
@@ -302,7 +302,7 @@ static void bsd_free (void *state)
 /*
  * Allocate space for a (de) compressor.
  */
-static void *bsd_alloc (struct isdn_ppp_comp_data *data)
+static void *bsd_alloc(struct isdn_ppp_comp_data *data)
 {
        int bits;
        unsigned int hsize, hshift, maxmaxcode;
@@ -310,27 +310,27 @@ static void *bsd_alloc (struct isdn_ppp_comp_data *data)
        int decomp;
 
        static unsigned int htab[][2] = {
-               { 5003 , 4 } , { 5003 , 4 } , { 5003 , 4 } , { 5003 , 4 } , 
-               { 9001 , 5 } , { 18013 , 6 } , { 35023 , 7 } , { 69001 , 8 } 
+               { 5003 , 4 } , { 5003 , 4 } , { 5003 , 4 } , { 5003 , 4 } ,
+               { 9001 , 5 } , { 18013 , 6 } , { 35023 , 7 } , { 69001 , 8 }
        };
-               
+
        if (data->optlen != 1 || data->num != CI_BSD_COMPRESS
-               || BSD_VERSION(data->options[0]) != BSD_CURRENT_VERSION)
+           || BSD_VERSION(data->options[0]) != BSD_CURRENT_VERSION)
                return NULL;
 
        bits = BSD_NBITS(data->options[0]);
 
-       if(bits < 9 || bits > 15)
+       if (bits < 9 || bits > 15)
                return NULL;
 
-       hsize = htab[bits-9][0];
-       hshift = htab[bits-9][1];
-       
+       hsize = htab[bits - 9][0];
+       hshift = htab[bits - 9][1];
+
        /*
         * Allocate the main control structure for this instance.
         */
        maxmaxcode = MAXCODE(bits);
-       db = kzalloc (sizeof (struct bsd_db),GFP_KERNEL);
+       db = kzalloc(sizeof(struct bsd_db), GFP_KERNEL);
        if (!db)
                return NULL;
 
@@ -343,7 +343,7 @@ static void *bsd_alloc (struct isdn_ppp_comp_data *data)
         */
        db->dict = vmalloc(hsize * sizeof(struct bsd_dict));
        if (!db->dict) {
-               bsd_free (db);
+               bsd_free(db);
                return NULL;
        }
 
@@ -356,7 +356,7 @@ static void *bsd_alloc (struct isdn_ppp_comp_data *data)
        else {
                db->lens = vmalloc((maxmaxcode + 1) * sizeof(db->lens[0]));
                if (!db->lens) {
-                       bsd_free (db);
+                       bsd_free(db);
                        return (NULL);
                }
        }
@@ -364,41 +364,41 @@ static void *bsd_alloc (struct isdn_ppp_comp_data *data)
        /*
         * Initialize the data information for the compression code
         */
-       db->totlen     = sizeof (struct bsd_db) + (sizeof (struct bsd_dict) * hsize);
-       db->hsize      = hsize;
-       db->hshift     = hshift;
+       db->totlen = sizeof(struct bsd_db) + (sizeof(struct bsd_dict) * hsize);
+       db->hsize = hsize;
+       db->hshift = hshift;
        db->maxmaxcode = maxmaxcode;
-       db->maxbits    = bits;
+       db->maxbits = bits;
 
-       return (void *) db;
+       return (void *)db;
 }
 
 /*
  * Initialize the database.
  */
-static int bsd_init (void *state, struct isdn_ppp_comp_data *data, int unit, int debug)
+static int bsd_init(void *state, struct isdn_ppp_comp_data *data, int unit, int debug)
 {
        struct bsd_db *db = state;
        int indx;
        int decomp;
 
-       if(!state || !data) {
-               printk(KERN_ERR "isdn_bsd_init: [%d] ERR, state %lx data %lx\n",unit,(long)state,(long)data);
+       if (!state || !data) {
+               printk(KERN_ERR "isdn_bsd_init: [%d] ERR, state %lx data %lx\n", unit, (long)state, (long)data);
                return 0;
        }
 
        decomp = db->xmit ? 0 : 1;
-    
+
        if (data->optlen != 1 || data->num != CI_BSD_COMPRESS
-               || (BSD_VERSION(data->options[0]) != BSD_CURRENT_VERSION)
-               || (BSD_NBITS(data->options[0]) != db->maxbits)
-               || (decomp && db->lens == NULL)) {
-               printk(KERN_ERR "isdn_bsd: %d %d %d %d %lx\n",data->optlen,data->num,data->options[0],decomp,(unsigned long)db->lens);
+           || (BSD_VERSION(data->options[0]) != BSD_CURRENT_VERSION)
+           || (BSD_NBITS(data->options[0]) != db->maxbits)
+           || (decomp && db->lens == NULL)) {
+               printk(KERN_ERR "isdn_bsd: %d %d %d %d %lx\n", data->optlen, data->num, data->options[0], decomp, (unsigned long)db->lens);
                return 0;
        }
 
        if (decomp)
-               for(indx=LAST;indx>=0;indx--)
+               for (indx = LAST; indx >= 0; indx--)
                        db->lens[indx] = 1;
 
        indx = db->hsize;
@@ -411,9 +411,9 @@ static int bsd_init (void *state, struct isdn_ppp_comp_data *data, int unit, int
        db->mru  = 0;
 
        db->debug = 1;
-    
-       bsd_reset(db,0,0,NULL,0,NULL);
-    
+
+       bsd_reset(db, 0, 0, NULL, 0, NULL);
+
        return 1;
 }
 
@@ -421,37 +421,37 @@ static int bsd_init (void *state, struct isdn_ppp_comp_data *data, int unit, int
  * Obtain pointers to the various structures in the compression tables
  */
 
-#define dict_ptrx(p,idx) &(p->dict[idx])
-#define lens_ptrx(p,idx) &(p->lens[idx])
+#define dict_ptrx(p, idx) &(p->dict[idx])
+#define lens_ptrx(p, idx) &(p->lens[idx])
 
 #ifdef DEBUG
 static unsigned short *lens_ptr(struct bsd_db *db, int idx)
 {
        if ((unsigned int) idx > (unsigned int) db->maxmaxcode) {
-               printk (KERN_DEBUG "<9>ppp: lens_ptr(%d) > max\n", idx);
+               printk(KERN_DEBUG "<9>ppp: lens_ptr(%d) > max\n", idx);
                idx = 0;
        }
-       return lens_ptrx (db, idx);
+       return lens_ptrx(db, idx);
 }
 
 static struct bsd_dict *dict_ptr(struct bsd_db *db, int idx)
 {
        if ((unsigned int) idx >= (unsigned int) db->hsize) {
-               printk (KERN_DEBUG "<9>ppp: dict_ptr(%d) > max\n", idx);
+               printk(KERN_DEBUG "<9>ppp: dict_ptr(%d) > max\n", idx);
                idx = 0;
        }
-       return dict_ptrx (db, idx);
+       return dict_ptrx(db, idx);
 }
 
 #else
-#define lens_ptr(db,idx) lens_ptrx(db,idx)
-#define dict_ptr(db,idx) dict_ptrx(db,idx)
+#define lens_ptr(db, idx) lens_ptrx(db, idx)
+#define dict_ptr(db, idx) dict_ptrx(db, idx)
 #endif
 
 /*
  * compress a packet
  */
-static int bsd_compress (void *state, struct sk_buff *skb_in, struct sk_buff *skb_out,int proto)
+static int bsd_compress(void *state, struct sk_buff *skb_in, struct sk_buff *skb_out, int proto)
 {
        struct bsd_db *db;
        int hshift;
@@ -463,31 +463,31 @@ static int bsd_compress (void *state, struct sk_buff *skb_in, struct sk_buff *sk
        unsigned long fcode;
        struct bsd_dict *dictp;
        unsigned char c;
-       int hval,disp,ilen,mxcode;
+       int hval, disp, ilen, mxcode;
        unsigned char *rptr = skb_in->data;
        int isize = skb_in->len;
 
-#define OUTPUT(ent)                    \
-  {                                    \
-    bitno -= n_bits;                   \
-    accm |= ((ent) << bitno);          \
-    do {                               \
-        if(skb_out && skb_tailroom(skb_out) > 0)       \
-               *(skb_put(skb_out,1)) = (unsigned char) (accm>>24); \
-       accm <<= 8;                     \
-       bitno += 8;                     \
-    } while (bitno <= 24);             \
-  }
+#define OUTPUT(ent)                                                    \
+       {                                                               \
+               bitno -= n_bits;                                        \
+               accm |= ((ent) << bitno);                               \
+               do      {                                               \
+                       if (skb_out && skb_tailroom(skb_out) > 0)       \
+                               *(skb_put(skb_out, 1)) = (unsigned char)(accm >> 24); \
+                       accm <<= 8;                                     \
+                       bitno += 8;                                     \
+               } while (bitno <= 24);                                  \
+       }
 
        /*
         * If the protocol is not in the range we're interested in,
         * just return without compressing the packet.  If it is,
         * the protocol becomes the first byte to compress.
         */
-       printk(KERN_DEBUG "bsd_compress called with %x\n",proto);
-       
+       printk(KERN_DEBUG "bsd_compress called with %x\n", proto);
+
        ent = proto;
-       if (proto < 0x21 || proto > 0xf9 || !(proto & 0x1) )
+       if (proto < 0x21 || proto > 0xf9 || !(proto & 0x1))
                return 0;
 
        db      = (struct bsd_db *) state;
@@ -496,25 +496,25 @@ static int bsd_compress (void *state, struct sk_buff *skb_in, struct sk_buff *sk
        n_bits  = db->n_bits;
        bitno   = 32;
        accm    = 0;
-       mxcode  = MAXCODE (n_bits);
-       
+       mxcode  = MAXCODE(n_bits);
+
        /* This is the PPP header information */
-       if(skb_out && skb_tailroom(skb_out) >= 2) {
-               char *v = skb_put(skb_out,2);
+       if (skb_out && skb_tailroom(skb_out) >= 2) {
+               char *v = skb_put(skb_out, 2);
                /* we only push our own data on the header,
-                 AC,PC and protos is pushed by caller  */
+                  AC,PC and protos is pushed by caller  */
                v[0] = db->seqno >> 8;
                v[1] = db->seqno;
        }
 
-       ilen   = ++isize; /* This is off by one, but that is what is in draft! */
+       ilen = ++isize; /* This is off by one, but that is what is in draft! */
 
        while (--ilen > 0) {
-               c     = *rptr++;
-               fcode = BSD_KEY  (ent, c);
-               hval  = BSD_HASH (ent, c, hshift);
-               dictp = dict_ptr (db, hval);
-       
+               c = *rptr++;
+               fcode = BSD_KEY(ent, c);
+               hval = BSD_HASH(ent, c, hshift);
+               dictp = dict_ptr(db, hval);
+
                /* Validate and then check the entry. */
                if (dictp->codem1 >= max_ent)
                        goto nomatch;
@@ -523,7 +523,7 @@ static int bsd_compress (void *state, struct sk_buff *skb_in, struct sk_buff *sk
                        ent = dictp->codem1 + 1;
                        continue;       /* found (prefix,suffix) */
                }
-       
+
                /* continue probing until a match or invalid entry */
                disp = (hval == 0) ? 1 : hval;
 
@@ -531,17 +531,17 @@ static int bsd_compress (void *state, struct sk_buff *skb_in, struct sk_buff *sk
                        hval += disp;
                        if (hval >= db->hsize)
                                hval -= db->hsize;
-                       dictp = dict_ptr (db, hval);
+                       dictp = dict_ptr(db, hval);
                        if (dictp->codem1 >= max_ent)
                                goto nomatch;
                } while (dictp->fcode != fcode);
 
                ent = dictp->codem1 + 1;        /* finally found (prefix,suffix) */
                continue;
-       
-nomatch:
+
+       nomatch:
                OUTPUT(ent);            /* output the prefix */
-       
+
                /* code -> hashtable */
                if (max_ent < db->maxmaxcode) {
                        struct bsd_dict *dictp2;
@@ -551,16 +551,16 @@ nomatch:
                        /* expand code size if needed */
                        if (max_ent >= mxcode) {
                                db->n_bits = ++n_bits;
-                               mxcode = MAXCODE (n_bits);
+                               mxcode = MAXCODE(n_bits);
                        }
-           
-                       /* 
+
+                       /*
                         * Invalidate old hash table entry using
                         * this code, and then take it over.
                         */
-                       dictp2 = dict_ptr (db, max_ent + 1);
+                       dictp2 = dict_ptr(db, max_ent + 1);
                        indx   = dictp2->cptr;
-                       dictp3 = dict_ptr (db, indx);
+                       dictp3 = dict_ptr(db, indx);
 
                        if (dictp3->codem1 == max_ent)
                                dictp3->codem1 = BADCODEM1;
@@ -571,17 +571,17 @@ nomatch:
                        db->max_ent    = ++max_ent;
 
                        if (db->lens) {
-                               unsigned short *len1 = lens_ptr (db, max_ent);
-                               unsigned short *len2 = lens_ptr (db, ent);
+                               unsigned short *len1 = lens_ptr(db, max_ent);
+                               unsigned short *len2 = lens_ptr(db, ent);
                                *len1 = *len2 + 1;
                        }
                }
                ent = c;
        }
-    
+
        OUTPUT(ent);            /* output the last code */
 
-       if(skb_out)
+       if (skb_out)
                db->bytes_out    += skb_out->len; /* Do not count bytes from here */
        db->uncomp_bytes += isize;
        db->in_count     += isize;
@@ -596,15 +596,15 @@ nomatch:
         */
 
        if (bsd_check(db))
-               OUTPUT (CLEAR);
+               OUTPUT(CLEAR);
 
        /*
         * Pad dribble bits of last code with ones.
         * Do not emit a completely useless byte of ones.
         */
-       if (bitno < 32 && skb_out && skb_tailroom(skb_out) > 0) 
-               *(skb_put(skb_out,1)) = (unsigned char) ((accm | (0xff << (bitno-8))) >> 24);
-    
+       if (bitno < 32 && skb_out && skb_tailroom(skb_out) > 0)
+               *(skb_put(skb_out, 1)) = (unsigned char)((accm | (0xff << (bitno - 8))) >> 24);
+
        /*
         * Increase code size if we would have without the packet
         * boundary because the decompressor will do so.
@@ -613,7 +613,7 @@ nomatch:
                db->n_bits++;
 
        /* If output length is too large then this is an incompressible frame. */
-       if (!skb_out || (skb_out && skb_out->len >= skb_in->len) ) {
+       if (!skb_out || (skb_out && skb_out->len >= skb_in->len)) {
                ++db->incomp_count;
                db->incomp_bytes += isize;
                return 0;
@@ -631,16 +631,16 @@ nomatch:
  * Update the "BSD Compress" dictionary on the receiver for
  * incompressible data by pretending to compress the incoming data.
  */
-static void bsd_incomp (void *state, struct sk_buff *skb_in,int proto)
+static void bsd_incomp(void *state, struct sk_buff *skb_in, int proto)
 {
-       bsd_compress (state, skb_in, NULL, proto);
+       bsd_compress(state, skb_in, NULL, proto);
 }
 
 /*
  * Decompress "BSD Compress".
  */
-static int bsd_decompress (void *state, struct sk_buff *skb_in, struct sk_buff *skb_out,
-                          struct isdn_ppp_resetparams *rsparm)
+static int bsd_decompress(void *state, struct sk_buff *skb_in, struct sk_buff *skb_out,
+                         struct isdn_ppp_resetparams *rsparm)
 {
        struct bsd_db *db;
        unsigned int max_ent;
@@ -653,7 +653,7 @@ static int bsd_decompress (void *state, struct sk_buff *skb_in, struct sk_buff *
        unsigned int incode;
        unsigned int oldcode;
        unsigned int finchar;
-       unsigned char *p,*ibuf;
+       unsigned char *p, *ibuf;
        int ilen;
        int codelen;
        int extra;
@@ -667,20 +667,20 @@ static int bsd_decompress (void *state, struct sk_buff *skb_in, struct sk_buff *
 
        printk(KERN_DEBUG "bsd_decompress called\n");
 
-       if(!skb_in || !skb_out) {
+       if (!skb_in || !skb_out) {
                printk(KERN_ERR "bsd_decompress called with NULL parameter\n");
                return DECOMP_ERROR;
        }
-    
+
        /*
         * Get the sequence number.
         */
-       if( (p = skb_pull(skb_in,2)) == NULL) {
+       if ((p = skb_pull(skb_in, 2)) == NULL) {
                return DECOMP_ERROR;
        }
-       p-=2;
-       seq   = (p[0] << 8) + p[1];
-       ilen  = skb_in->len;
+       p -= 2;
+       seq = (p[0] << 8) + p[1];
+       ilen = skb_in->len;
        ibuf = skb_in->data;
 
        /*
@@ -690,7 +690,7 @@ static int bsd_decompress (void *state, struct sk_buff *skb_in, struct sk_buff *
        if (seq != db->seqno) {
                if (db->debug) {
                        printk(KERN_DEBUG "bsd_decomp%d: bad sequence # %d, expected %d\n",
-                               db->unit, seq, db->seqno - 1);
+                              db->unit, seq, db->seqno - 1);
                }
                return DECOMP_ERROR;
        }
@@ -698,11 +698,11 @@ static int bsd_decompress (void *state, struct sk_buff *skb_in, struct sk_buff *
        ++db->seqno;
        db->bytes_out += ilen;
 
-       if(skb_tailroom(skb_out) > 0)
-               *(skb_put(skb_out,1)) = 0;
+       if (skb_tailroom(skb_out) > 0)
+               *(skb_put(skb_out, 1)) = 0;
        else
                return DECOMP_ERR_NOMEM;
-    
+
        oldcode = CLEAR;
 
        /*
@@ -734,7 +734,7 @@ static int bsd_decompress (void *state, struct sk_buff *skb_in, struct sk_buff *
                /*
                 * The dictionary must only be cleared at the end of a packet.
                 */
-       
+
                if (incode == CLEAR) {
                        if (ilen > 0) {
                                if (db->debug)
@@ -746,16 +746,16 @@ static int bsd_decompress (void *state, struct sk_buff *skb_in, struct sk_buff *
                }
 
                if ((incode > max_ent + 2) || (incode > db->maxmaxcode)
-                       || (incode > max_ent && oldcode == CLEAR)) {
+                   || (incode > max_ent && oldcode == CLEAR)) {
                        if (db->debug) {
                                printk(KERN_DEBUG "bsd_decomp%d: bad code 0x%x oldcode=0x%x ",
-                                       db->unit, incode, oldcode);
+                                      db->unit, incode, oldcode);
                                printk(KERN_DEBUG "max_ent=0x%x skb->Len=%d seqno=%d\n",
-                                       max_ent, skb_out->len, db->seqno);
+                                      max_ent, skb_out->len, db->seqno);
                        }
                        return DECOMP_FATALERROR;       /* probably a bug */
                }
-       
+
                /* Special case for KwKwK string. */
                if (incode > max_ent) {
                        finchar = oldcode;
@@ -765,13 +765,13 @@ static int bsd_decompress (void *state, struct sk_buff *skb_in, struct sk_buff *
                        extra   = 0;
                }
 
-               codelen = *(lens_ptr (db, finchar));
-               if( skb_tailroom(skb_out) < codelen + extra) {
+               codelen = *(lens_ptr(db, finchar));
+               if (skb_tailroom(skb_out) < codelen + extra) {
                        if (db->debug) {
                                printk(KERN_DEBUG "bsd_decomp%d: ran out of mru\n", db->unit);
 #ifdef DEBUG
                                printk(KERN_DEBUG "  len=%d, finchar=0x%x, codelen=%d,skblen=%d\n",
-                                       ilen, finchar, codelen, skb_out->len);
+                                      ilen, finchar, codelen, skb_out->len);
 #endif
                        }
                        return DECOMP_FATALERROR;
@@ -781,21 +781,21 @@ static int bsd_decompress (void *state, struct sk_buff *skb_in, struct sk_buff *
                 * Decode this code and install it in the decompressed buffer.
                 */
 
-               p     = skb_put(skb_out,codelen);
+               p = skb_put(skb_out, codelen);
                p += codelen;
                while (finchar > LAST) {
-                       struct bsd_dict *dictp2 = dict_ptr (db, finchar);
-           
-                       dictp = dict_ptr (db, dictp2->cptr);
+                       struct bsd_dict *dictp2 = dict_ptr(db, finchar);
+
+                       dictp = dict_ptr(db, dictp2->cptr);
 
 #ifdef DEBUG
-                       if (--codelen <= 0 || dictp->codem1 != finchar-1) {
+                       if (--codelen <= 0 || dictp->codem1 != finchar - 1) {
                                if (codelen <= 0) {
                                        printk(KERN_ERR "bsd_decomp%d: fell off end of chain ", db->unit);
                                        printk(KERN_ERR "0x%x at 0x%x by 0x%x, max_ent=0x%x\n", incode, finchar, dictp2->cptr, max_ent);
                                } else {
-                                       if (dictp->codem1 != finchar-1) {
-                                               printk(KERN_ERR "bsd_decomp%d: bad code chain 0x%x finchar=0x%x ",db->unit, incode, finchar);
+                                       if (dictp->codem1 != finchar - 1) {
+                                               printk(KERN_ERR "bsd_decomp%d: bad code chain 0x%x finchar=0x%x ", db->unit, incode, finchar);
                                                printk(KERN_ERR "oldcode=0x%x cptr=0x%x codem1=0x%x\n", oldcode, dictp2->cptr, dictp->codem1);
                                        }
                                }
@@ -810,15 +810,15 @@ static int bsd_decompress (void *state, struct sk_buff *skb_in, struct sk_buff *
                        }
                }
                *--p = finchar;
-       
+
 #ifdef DEBUG
                if (--codelen != 0)
                        printk(KERN_ERR "bsd_decomp%d: short by %d after code 0x%x, max_ent=0x%x\n", db->unit, codelen, incode, max_ent);
 #endif
-       
+
                if (extra)              /* the KwKwK case again */
-                       *(skb_put(skb_out,1)) = finchar;
-       
+                       *(skb_put(skb_out, 1)) = finchar;
+
                /*
                 * If not first code in a packet, and
                 * if not out of code space, then allocate a new code.
@@ -828,14 +828,14 @@ static int bsd_decompress (void *state, struct sk_buff *skb_in, struct sk_buff *
                 */
                if (oldcode != CLEAR && max_ent < db->maxmaxcode) {
                        struct bsd_dict *dictp2, *dictp3;
-                       u16  *lens1,  *lens2;
+                       u16 *lens1, *lens2;
                        unsigned long fcode;
                        int hval, disp, indx;
-           
-                       fcode = BSD_KEY(oldcode,finchar);
-                       hval  = BSD_HASH(oldcode,finchar,db->hshift);
-                       dictp = dict_ptr (db, hval);
-           
+
+                       fcode = BSD_KEY(oldcode, finchar);
+                       hval  = BSD_HASH(oldcode, finchar, db->hshift);
+                       dictp = dict_ptr(db, hval);
+
                        /* look for a free hash table entry */
                        if (dictp->codem1 < max_ent) {
                                disp = (hval == 0) ? 1 : hval;
@@ -843,18 +843,18 @@ static int bsd_decompress (void *state, struct sk_buff *skb_in, struct sk_buff *
                                        hval += disp;
                                        if (hval >= db->hsize)
                                                hval -= db->hsize;
-                                       dictp = dict_ptr (db, hval);
+                                       dictp = dict_ptr(db, hval);
                                } while (dictp->codem1 < max_ent);
                        }
-           
+
                        /*
                         * Invalidate previous hash table entry
                         * assigned this code, and then take it over
                         */
 
-                       dictp2 = dict_ptr (db, max_ent + 1);
+                       dictp2 = dict_ptr(db, max_ent + 1);
                        indx   = dictp2->cptr;
-                       dictp3 = dict_ptr (db, indx);
+                       dictp3 = dict_ptr(db, indx);
 
                        if (dictp3->codem1 == max_ent)
                                dictp3->codem1 = BADCODEM1;
@@ -865,10 +865,10 @@ static int bsd_decompress (void *state, struct sk_buff *skb_in, struct sk_buff *
                        db->max_ent    = ++max_ent;
 
                        /* Update the length of this string. */
-                       lens1  = lens_ptr (db, max_ent);
-                       lens2  = lens_ptr (db, oldcode);
+                       lens1  = lens_ptr(db, max_ent);
+                       lens2  = lens_ptr(db, oldcode);
                        *lens1 = *lens2 + 1;
-           
+
                        /* Expand code size if needed. */
                        if (max_ent >= MAXCODE(n_bits) && max_ent < db->maxmaxcode) {
                                db->n_bits = ++n_bits;
@@ -886,7 +886,7 @@ static int bsd_decompress (void *state, struct sk_buff *skb_in, struct sk_buff *
        if (bsd_check(db)) {
                if (db->debug)
                        printk(KERN_DEBUG "bsd_decomp%d: peer should have cleared dictionary on %d\n",
-                               db->unit, db->seqno - 1);
+                              db->unit, db->seqno - 1);
        }
        return skb_out->len;
 }
@@ -914,15 +914,15 @@ static struct isdn_ppp_compressor ippp_bsd_compress = {
 
 static int __init isdn_bsdcomp_init(void)
 {
-       int answer = isdn_ppp_register_compressor (&ippp_bsd_compress);
+       int answer = isdn_ppp_register_compressor(&ippp_bsd_compress);
        if (answer == 0)
-               printk (KERN_INFO "PPP BSD Compression module registered\n");
+               printk(KERN_INFO "PPP BSD Compression module registered\n");
        return answer;
 }
 
 static void __exit isdn_bsdcomp_exit(void)
 {
-       isdn_ppp_unregister_compressor (&ippp_bsd_compress);
+       isdn_ppp_unregister_compressor(&ippp_bsd_compress);
 }
 
 module_init(isdn_bsdcomp_init);
index 6ddb795..d9f5524 100644 (file)
@@ -111,7 +111,7 @@ isdn_unlock_drivers(void)
 
 #if defined(ISDN_DEBUG_NET_DUMP) || defined(ISDN_DEBUG_MODEM_DUMP)
 void
-isdn_dumppkt(char *s, u_char * p, int len, int dumplen)
+isdn_dumppkt(char *s, u_char *p, int len, int dumplen)
 {
        int dumpc;
 
@@ -163,58 +163,58 @@ isdn_wildmat(char *s, char *p)
        register int nostar = 1;
 
        if (!(*s) && !(*p))
-               return(1);
+               return (1);
        for (; *p; s++, p++)
                switch (*p) {
-                       case '\\':
-                               /*
-                                * Literal match with following character,
-                                * fall through.
-                                */
+               case '\\':
+                       /*
+                        * Literal match with following character,
+                        * fall through.
+                        */
+                       p++;
+               default:
+                       if (*s != *p)
+                               return (*s == '\0') ? 2 : 1;
+                                       continue;
+               case '?':
+                       /* Match anything. */
+                       if (*s == '\0')
+                               return (2);
+                       continue;
+               case '*':
+                       nostar = 0;
+                       /* Trailing star matches everything. */
+                       return (*++p ? isdn_star(s, p) : 0);
+               case '[':
+                       /* [^....] means inverse character class. */
+                       if ((reverse = (p[1] == '^')))
                                p++;
-                       default:
-                               if (*s != *p)
-                                       return (*s == '\0')?2:1;
-                               continue;
-                       case '?':
-                               /* Match anything. */
-                               if (*s == '\0')
-                                       return (2);
-                               continue;
-                       case '*':
-                               nostar = 0;     
-                               /* Trailing star matches everything. */
-                               return (*++p ? isdn_star(s, p) : 0);
-                       case '[':
-                               /* [^....] means inverse character class. */
-                               if ((reverse = (p[1] == '^')))
-                                       p++;
-                               for (last = 0, matched = 0; *++p && (*p != ']'); last = *p)
-                                       /* This next line requires a good C compiler. */
-                                       if (*p == '-' ? *s <= *++p && *s >= last : *s == *p)
-                                               matched = 1;
-                               if (matched == reverse)
-                                       return (1);
-                               continue;
+                       for (last = 0, matched = 0; *++p && (*p != ']'); last = *p)
+                               /* This next line requires a good C compiler. */
+                               if (*p == '-' ? *s <= *++p && *s >= last : *s == *p)
+                                       matched = 1;
+                       if (matched == reverse)
+                               return (1);
+                       continue;
                }
-       return (*s == '\0')?0:nostar;
+       return (*s == '\0') ? 0 : nostar;
 }
 
-int isdn_msncmp( const char * msn1, const char * msn2 )
+int isdn_msncmp(const char *msn1, const char *msn2)
 {
-       char TmpMsn1[ ISDN_MSNLEN ];
-       char TmpMsn2[ ISDN_MSNLEN ];
+       char TmpMsn1[ISDN_MSNLEN];
+       char TmpMsn2[ISDN_MSNLEN];
        char *p;
 
-       for ( p = TmpMsn1; *msn1 && *msn1 != ':'; )  // Strip off a SPID
+       for (p = TmpMsn1; *msn1 && *msn1 != ':';)  // Strip off a SPID
                *p++ = *msn1++;
        *p = '\0';
 
-       for ( p = TmpMsn2; *msn2 && *msn2 != ':'; )  // Strip off a SPID
+       for (p = TmpMsn2; *msn2 && *msn2 != ':';)  // Strip off a SPID
                *p++ = *msn2++;
        *p = '\0';
 
-       return isdn_wildmat( TmpMsn1, TmpMsn2 );
+       return isdn_wildmat(TmpMsn1, TmpMsn2);
 }
 
 int
@@ -262,8 +262,8 @@ isdn_timer_funct(ulong dummy)
                                isdn_tty_carrier_timeout();
                }
        }
-       if (tf) 
-               mod_timer(&dev->timer, jiffies+ISDN_TIMER_RES);
+       if (tf)
+               mod_timer(&dev->timer, jiffies + ISDN_TIMER_RES);
 }
 
 void
@@ -284,7 +284,7 @@ isdn_timer_ctrl(int tf, int onoff)
        else
                dev->tflags &= ~tf;
        if (dev->tflags && !old_tflags)
-               mod_timer(&dev->timer, jiffies+ISDN_TIMER_RES);
+               mod_timer(&dev->timer, jiffies + ISDN_TIMER_RES);
        spin_unlock_irqrestore(&dev->timerlock, flags);
 }
 
@@ -302,7 +302,7 @@ isdn_receive_skb_callback(int di, int channel, struct sk_buff *skb)
        }
        /* Update statistics */
        dev->ibytes[i] += skb->len;
-       
+
        /* First, try to deliver data to network-device */
        if (isdn_net_rcv_skb(i, skb))
                return;
@@ -339,40 +339,40 @@ isdn_command(isdn_ctrl *cmd)
 {
        if (cmd->driver == -1) {
                printk(KERN_WARNING "isdn_command command(%x) driver -1\n", cmd->command);
-               return(1);
+               return (1);
        }
        if (!dev->drv[cmd->driver]) {
                printk(KERN_WARNING "isdn_command command(%x) dev->drv[%d] NULL\n",
-                       cmd->command, cmd->driver);
-               return(1);
+                      cmd->command, cmd->driver);
+               return (1);
        }
        if (!dev->drv[cmd->driver]->interface) {
                printk(KERN_WARNING "isdn_command command(%x) dev->drv[%d]->interface NULL\n",
-                       cmd->command, cmd->driver);
-               return(1);
+                      cmd->command, cmd->driver);
+               return (1);
        }
        if (cmd->command == ISDN_CMD_SETL2) {
                int idx = isdn_dc2minor(cmd->driver, cmd->arg & 255);
                unsigned long l2prot = (cmd->arg >> 8) & 255;
                unsigned long features = (dev->drv[cmd->driver]->interface->features
-                                               >> ISDN_FEATURE_L2_SHIFT) &
-                                               ISDN_FEATURE_L2_MASK;
+                                         >> ISDN_FEATURE_L2_SHIFT) &
+                       ISDN_FEATURE_L2_MASK;
                unsigned long l2_feature = (1 << l2prot);
 
                switch (l2prot) {
-                       case ISDN_PROTO_L2_V11096:
-                       case ISDN_PROTO_L2_V11019:
-                       case ISDN_PROTO_L2_V11038:
+               case ISDN_PROTO_L2_V11096:
+               case ISDN_PROTO_L2_V11019:
+               case ISDN_PROTO_L2_V11038:
                        /* If V.110 requested, but not supported by
                         * HL-driver, set emulator-flag and change
                         * Layer-2 to transparent
                         */
-                               if (!(features & l2_feature)) {
-                                       dev->v110emu[idx] = l2prot;
-                                       cmd->arg = (cmd->arg & 255) |
-                                               (ISDN_PROTO_L2_TRANS << 8);
-                               } else
-                                       dev->v110emu[idx] = 0;
+                       if (!(features & l2_feature)) {
+                               dev->v110emu[idx] = l2prot;
+                               cmd->arg = (cmd->arg & 255) |
+                                       (ISDN_PROTO_L2_TRANS << 8);
+                       } else
+                               dev->v110emu[idx] = 0;
                }
        }
        return dev->drv[cmd->driver]->interface->command(cmd);
@@ -393,7 +393,7 @@ isdn_all_eaz(int di, int ch)
 }
 
 /*
- * Begin of a CAPI like LL<->HL interface, currently used only for 
+ * Begin of a CAPI like LL<->HL interface, currently used only for
  * supplementary service (CAPI 2.0 part III)
  */
 #include <linux/isdn/capicmd.h>
@@ -401,17 +401,17 @@ isdn_all_eaz(int di, int ch)
 static int
 isdn_capi_rec_hl_msg(capi_msg *cm)
 {
-       switch(cm->Command) {
-               case CAPI_FACILITY:
-                       /* in the moment only handled in tty */
-                       return(isdn_tty_capi_facility(cm));
-               default:
-                       return(-1);
+       switch (cm->Command) {
+       case CAPI_FACILITY:
+               /* in the moment only handled in tty */
+               return (isdn_tty_capi_facility(cm));
+       default:
+               return (-1);
        }
 }
 
 static int
-isdn_status_callback(isdn_ctrl * c)
+isdn_status_callback(isdn_ctrl *c)
 {
        int di;
        u_long flags;
@@ -424,314 +424,314 @@ isdn_status_callback(isdn_ctrl * c)
        di = c->driver;
        i = isdn_dc2minor(di, c->arg);
        switch (c->command) {
-               case ISDN_STAT_BSENT:
-                       if (i < 0)
-                               return -1;
-                       if (dev->global_flags & ISDN_GLOBAL_STOPPED)
-                               return 0;
-                       if (isdn_net_stat_callback(i, c))
-                               return 0;
-                       if (isdn_v110_stat_callback(i, c))
-                               return 0;
-                       if (isdn_tty_stat_callback(i, c))
-                               return 0;
-                       wake_up_interruptible(&dev->drv[di]->snd_waitq[c->arg]);
-                       break;
-               case ISDN_STAT_STAVAIL:
-                       dev->drv[di]->stavail += c->arg;
-                       wake_up_interruptible(&dev->drv[di]->st_waitq);
-                       break;
-               case ISDN_STAT_RUN:
-                       dev->drv[di]->flags |= DRV_FLAG_RUNNING;
-                       for (i = 0; i < ISDN_MAX_CHANNELS; i++)
-                               if (dev->drvmap[i] == di)
-                                       isdn_all_eaz(di, dev->chanmap[i]);
-                       set_global_features();
-                       break;
-               case ISDN_STAT_STOP:
-                       dev->drv[di]->flags &= ~DRV_FLAG_RUNNING;
-                       break;
-               case ISDN_STAT_ICALL:
-                       if (i < 0)
-                               return -1;
+       case ISDN_STAT_BSENT:
+               if (i < 0)
+                       return -1;
+               if (dev->global_flags & ISDN_GLOBAL_STOPPED)
+                       return 0;
+               if (isdn_net_stat_callback(i, c))
+                       return 0;
+               if (isdn_v110_stat_callback(i, c))
+                       return 0;
+               if (isdn_tty_stat_callback(i, c))
+                       return 0;
+               wake_up_interruptible(&dev->drv[di]->snd_waitq[c->arg]);
+               break;
+       case ISDN_STAT_STAVAIL:
+               dev->drv[di]->stavail += c->arg;
+               wake_up_interruptible(&dev->drv[di]->st_waitq);
+               break;
+       case ISDN_STAT_RUN:
+               dev->drv[di]->flags |= DRV_FLAG_RUNNING;
+               for (i = 0; i < ISDN_MAX_CHANNELS; i++)
+                       if (dev->drvmap[i] == di)
+                               isdn_all_eaz(di, dev->chanmap[i]);
+               set_global_features();
+               break;
+       case ISDN_STAT_STOP:
+               dev->drv[di]->flags &= ~DRV_FLAG_RUNNING;
+               break;
+       case ISDN_STAT_ICALL:
+               if (i < 0)
+                       return -1;
 #ifdef ISDN_DEBUG_STATCALLB
-                       printk(KERN_DEBUG "ICALL (net): %d %ld %s\n", di, c->arg, c->parm.num);
+               printk(KERN_DEBUG "ICALL (net): %d %ld %s\n", di, c->arg, c->parm.num);
 #endif
-                       if (dev->global_flags & ISDN_GLOBAL_STOPPED) {
+               if (dev->global_flags & ISDN_GLOBAL_STOPPED) {
+                       cmd.driver = di;
+                       cmd.arg = c->arg;
+                       cmd.command = ISDN_CMD_HANGUP;
+                       isdn_command(&cmd);
+                       return 0;
+               }
+               /* Try to find a network-interface which will accept incoming call */
+               r = ((c->command == ISDN_STAT_ICALLW) ? 0 : isdn_net_find_icall(di, c->arg, i, &c->parm.setup));
+               switch (r) {
+               case 0:
+                       /* No network-device replies.
+                        * Try ttyI's.
+                        * These return 0 on no match, 1 on match and
+                        * 3 on eventually match, if CID is longer.
+                        */
+                       if (c->command == ISDN_STAT_ICALL)
+                               if ((retval = isdn_tty_find_icall(di, c->arg, &c->parm.setup))) return (retval);
+#ifdef CONFIG_ISDN_DIVERSION
+                       if (divert_if)
+                               if ((retval = divert_if->stat_callback(c)))
+                                       return (retval); /* processed */
+#endif /* CONFIG_ISDN_DIVERSION */
+                       if ((!retval) && (dev->drv[di]->flags & DRV_FLAG_REJBUS)) {
+                               /* No tty responding */
                                cmd.driver = di;
                                cmd.arg = c->arg;
                                cmd.command = ISDN_CMD_HANGUP;
                                isdn_command(&cmd);
-                               return 0;
+                               retval = 2;
                        }
-                       /* Try to find a network-interface which will accept incoming call */
-                       r = ((c->command == ISDN_STAT_ICALLW) ? 0 : isdn_net_find_icall(di, c->arg, i, &c->parm.setup));
-                       switch (r) {
-                               case 0:
-                                       /* No network-device replies.
-                                        * Try ttyI's.
-                                        * These return 0 on no match, 1 on match and
-                                        * 3 on eventually match, if CID is longer.
-                                        */
-                                        if (c->command == ISDN_STAT_ICALL)
-                                         if ((retval = isdn_tty_find_icall(di, c->arg, &c->parm.setup))) return(retval);
-#ifdef CONFIG_ISDN_DIVERSION 
-                                         if (divert_if)
-                                         if ((retval = divert_if->stat_callback(c))) 
-                                           return(retval); /* processed */
-#endif /* CONFIG_ISDN_DIVERSION */                       
-                                       if ((!retval) && (dev->drv[di]->flags & DRV_FLAG_REJBUS)) {
-                                               /* No tty responding */
-                                               cmd.driver = di;
-                                               cmd.arg = c->arg;
-                                               cmd.command = ISDN_CMD_HANGUP;
-                                               isdn_command(&cmd);
-                                               retval = 2;
-                                       }
-                                       break;
-                               case 1:
-                                       /* Schedule connection-setup */
-                                       isdn_net_dial();
-                                       cmd.driver = di;
-                                       cmd.arg = c->arg;
-                                       cmd.command = ISDN_CMD_ACCEPTD;
-                                       for ( p = dev->netdev; p; p = p->next )
-                                               if ( p->local->isdn_channel == cmd.arg )
-                                               {
-                                                       strcpy( cmd.parm.setup.eazmsn, p->local->msn );
-                                                       isdn_command(&cmd);
-                                                       retval = 1;
-                                                       break;
-                                               }
-                                       break;
-
-                               case 2: /* For calling back, first reject incoming call ... */
-                               case 3: /* Interface found, but down, reject call actively  */
-                                       retval = 2;
-                                       printk(KERN_INFO "isdn: Rejecting Call\n");
-                                       cmd.driver = di;
-                                       cmd.arg = c->arg;
-                                       cmd.command = ISDN_CMD_HANGUP;
+                       break;
+               case 1:
+                       /* Schedule connection-setup */
+                       isdn_net_dial();
+                       cmd.driver = di;
+                       cmd.arg = c->arg;
+                       cmd.command = ISDN_CMD_ACCEPTD;
+                       for (p = dev->netdev; p; p = p->next)
+                               if (p->local->isdn_channel == cmd.arg)
+                               {
+                                       strcpy(cmd.parm.setup.eazmsn, p->local->msn);
                                        isdn_command(&cmd);
-                                       if (r == 3)
-                                               break;
-                                       /* Fall through */
-                               case 4:
-                                       /* ... then start callback. */
-                                       isdn_net_dial();
-                                       break;
-                               case 5:
-                                       /* Number would eventually match, if longer */
-                                       retval = 3;
+                                       retval = 1;
                                        break;
-                       }
+                               }
+                       break;
+
+               case 2: /* For calling back, first reject incoming call ... */
+               case 3: /* Interface found, but down, reject call actively  */
+                       retval = 2;
+                       printk(KERN_INFO "isdn: Rejecting Call\n");
+                       cmd.driver = di;
+                       cmd.arg = c->arg;
+                       cmd.command = ISDN_CMD_HANGUP;
+                       isdn_command(&cmd);
+                       if (r == 3)
+                               break;
+                       /* Fall through */
+               case 4:
+                       /* ... then start callback. */
+                       isdn_net_dial();
+                       break;
+               case 5:
+                       /* Number would eventually match, if longer */
+                       retval = 3;
+                       break;
+               }
 #ifdef ISDN_DEBUG_STATCALLB
-                       printk(KERN_DEBUG "ICALL: ret=%d\n", retval);
+               printk(KERN_DEBUG "ICALL: ret=%d\n", retval);
 #endif
-                       return retval;
-                       break;
-               case ISDN_STAT_CINF:
-                       if (i < 0)
-                               return -1;
+               return retval;
+               break;
+       case ISDN_STAT_CINF:
+               if (i < 0)
+                       return -1;
 #ifdef ISDN_DEBUG_STATCALLB
-                       printk(KERN_DEBUG "CINF: %ld %s\n", c->arg, c->parm.num);
+               printk(KERN_DEBUG "CINF: %ld %s\n", c->arg, c->parm.num);
 #endif
-                       if (dev->global_flags & ISDN_GLOBAL_STOPPED)
-                               return 0;
-                       if (strcmp(c->parm.num, "0"))
-                               isdn_net_stat_callback(i, c);
-                       isdn_tty_stat_callback(i, c);
-                       break;
-               case ISDN_STAT_CAUSE:
+               if (dev->global_flags & ISDN_GLOBAL_STOPPED)
+                       return 0;
+               if (strcmp(c->parm.num, "0"))
+                       isdn_net_stat_callback(i, c);
+               isdn_tty_stat_callback(i, c);
+               break;
+       case ISDN_STAT_CAUSE:
 #ifdef ISDN_DEBUG_STATCALLB
-                       printk(KERN_DEBUG "CAUSE: %ld %s\n", c->arg, c->parm.num);
+               printk(KERN_DEBUG "CAUSE: %ld %s\n", c->arg, c->parm.num);
 #endif
-                       printk(KERN_INFO "isdn: %s,ch%ld cause: %s\n",
-                              dev->drvid[di], c->arg, c->parm.num);
-                       isdn_tty_stat_callback(i, c);
+               printk(KERN_INFO "isdn: %s,ch%ld cause: %s\n",
+                      dev->drvid[di], c->arg, c->parm.num);
+               isdn_tty_stat_callback(i, c);
 #ifdef CONFIG_ISDN_DIVERSION
-                        if (divert_if)
-                         divert_if->stat_callback(c); 
+               if (divert_if)
+                       divert_if->stat_callback(c);
 #endif /* CONFIG_ISDN_DIVERSION */
-                       break;
-               case ISDN_STAT_DISPLAY:
+               break;
+       case ISDN_STAT_DISPLAY:
 #ifdef ISDN_DEBUG_STATCALLB
-                       printk(KERN_DEBUG "DISPLAY: %ld %s\n", c->arg, c->parm.display);
+               printk(KERN_DEBUG "DISPLAY: %ld %s\n", c->arg, c->parm.display);
 #endif
-                       isdn_tty_stat_callback(i, c);
+               isdn_tty_stat_callback(i, c);
 #ifdef CONFIG_ISDN_DIVERSION
-                        if (divert_if)
-                         divert_if->stat_callback(c); 
+               if (divert_if)
+                       divert_if->stat_callback(c);
 #endif /* CONFIG_ISDN_DIVERSION */
-                       break;
-               case ISDN_STAT_DCONN:
-                       if (i < 0)
-                               return -1;
+               break;
+       case ISDN_STAT_DCONN:
+               if (i < 0)
+                       return -1;
 #ifdef ISDN_DEBUG_STATCALLB
-                       printk(KERN_DEBUG "DCONN: %ld\n", c->arg);
+               printk(KERN_DEBUG "DCONN: %ld\n", c->arg);
 #endif
-                       if (dev->global_flags & ISDN_GLOBAL_STOPPED)
-                               return 0;
-                       /* Find any net-device, waiting for D-channel setup */
-                       if (isdn_net_stat_callback(i, c))
-                               break;
-                       isdn_v110_stat_callback(i, c);
-                       /* Find any ttyI, waiting for D-channel setup */
-                       if (isdn_tty_stat_callback(i, c)) {
-                               cmd.driver = di;
-                               cmd.arg = c->arg;
-                               cmd.command = ISDN_CMD_ACCEPTB;
-                               isdn_command(&cmd);
-                               break;
-                       }
+               if (dev->global_flags & ISDN_GLOBAL_STOPPED)
+                       return 0;
+               /* Find any net-device, waiting for D-channel setup */
+               if (isdn_net_stat_callback(i, c))
                        break;
-               case ISDN_STAT_DHUP:
-                       if (i < 0)
-                               return -1;
+               isdn_v110_stat_callback(i, c);
+               /* Find any ttyI, waiting for D-channel setup */
+               if (isdn_tty_stat_callback(i, c)) {
+                       cmd.driver = di;
+                       cmd.arg = c->arg;
+                       cmd.command = ISDN_CMD_ACCEPTB;
+                       isdn_command(&cmd);
+                       break;
+               }
+               break;
+       case ISDN_STAT_DHUP:
+               if (i < 0)
+                       return -1;
 #ifdef ISDN_DEBUG_STATCALLB
-                       printk(KERN_DEBUG "DHUP: %ld\n", c->arg);
+               printk(KERN_DEBUG "DHUP: %ld\n", c->arg);
 #endif
-                       if (dev->global_flags & ISDN_GLOBAL_STOPPED)
-                               return 0;
-                       dev->drv[di]->online &= ~(1 << (c->arg));
-                       isdn_info_update();
-                       /* Signal hangup to network-devices */
-                       if (isdn_net_stat_callback(i, c))
-                               break;
-                       isdn_v110_stat_callback(i, c);
-                       if (isdn_tty_stat_callback(i, c))
-                               break;
-#ifdef CONFIG_ISDN_DIVERSION
-                        if (divert_if)
-                         divert_if->stat_callback(c); 
-#endif /* CONFIG_ISDN_DIVERSION */
+               if (dev->global_flags & ISDN_GLOBAL_STOPPED)
+                       return 0;
+               dev->drv[di]->online &= ~(1 << (c->arg));
+               isdn_info_update();
+               /* Signal hangup to network-devices */
+               if (isdn_net_stat_callback(i, c))
                        break;
+               isdn_v110_stat_callback(i, c);
+               if (isdn_tty_stat_callback(i, c))
                        break;
-               case ISDN_STAT_BCONN:
-                       if (i < 0)
-                               return -1;
+#ifdef CONFIG_ISDN_DIVERSION
+               if (divert_if)
+                       divert_if->stat_callback(c);
+#endif /* CONFIG_ISDN_DIVERSION */
+               break;
+               break;
+       case ISDN_STAT_BCONN:
+               if (i < 0)
+                       return -1;
 #ifdef ISDN_DEBUG_STATCALLB
-                       printk(KERN_DEBUG "BCONN: %ld\n", c->arg);
+               printk(KERN_DEBUG "BCONN: %ld\n", c->arg);
 #endif
-                       /* Signal B-channel-connect to network-devices */
-                       if (dev->global_flags & ISDN_GLOBAL_STOPPED)
-                               return 0;
-                       dev->drv[di]->online |= (1 << (c->arg));
-                       isdn_info_update();
-                       if (isdn_net_stat_callback(i, c))
-                               break;
-                       isdn_v110_stat_callback(i, c);
-                       if (isdn_tty_stat_callback(i, c))
-                               break;
+               /* Signal B-channel-connect to network-devices */
+               if (dev->global_flags & ISDN_GLOBAL_STOPPED)
+                       return 0;
+               dev->drv[di]->online |= (1 << (c->arg));
+               isdn_info_update();
+               if (isdn_net_stat_callback(i, c))
+                       break;
+               isdn_v110_stat_callback(i, c);
+               if (isdn_tty_stat_callback(i, c))
                        break;
-               case ISDN_STAT_BHUP:
-                       if (i < 0)
-                               return -1;
+               break;
+       case ISDN_STAT_BHUP:
+               if (i < 0)
+                       return -1;
 #ifdef ISDN_DEBUG_STATCALLB
-                       printk(KERN_DEBUG "BHUP: %ld\n", c->arg);
+               printk(KERN_DEBUG "BHUP: %ld\n", c->arg);
 #endif
-                       if (dev->global_flags & ISDN_GLOBAL_STOPPED)
-                               return 0;
-                       dev->drv[di]->online &= ~(1 << (c->arg));
-                       isdn_info_update();
+               if (dev->global_flags & ISDN_GLOBAL_STOPPED)
+                       return 0;
+               dev->drv[di]->online &= ~(1 << (c->arg));
+               isdn_info_update();
 #ifdef CONFIG_ISDN_X25
-                       /* Signal hangup to network-devices */
-                       if (isdn_net_stat_callback(i, c))
-                               break;
+               /* Signal hangup to network-devices */
+               if (isdn_net_stat_callback(i, c))
+                       break;
 #endif
-                       isdn_v110_stat_callback(i, c);
-                       if (isdn_tty_stat_callback(i, c))
-                               break;
+               isdn_v110_stat_callback(i, c);
+               if (isdn_tty_stat_callback(i, c))
                        break;
-               case ISDN_STAT_NODCH:
-                       if (i < 0)
-                               return -1;
+               break;
+       case ISDN_STAT_NODCH:
+               if (i < 0)
+                       return -1;
 #ifdef ISDN_DEBUG_STATCALLB
-                       printk(KERN_DEBUG "NODCH: %ld\n", c->arg);
+               printk(KERN_DEBUG "NODCH: %ld\n", c->arg);
 #endif
-                       if (dev->global_flags & ISDN_GLOBAL_STOPPED)
-                               return 0;
-                       if (isdn_net_stat_callback(i, c))
-                               break;
-                       if (isdn_tty_stat_callback(i, c))
-                               break;
+               if (dev->global_flags & ISDN_GLOBAL_STOPPED)
+                       return 0;
+               if (isdn_net_stat_callback(i, c))
                        break;
-               case ISDN_STAT_ADDCH:
-                       spin_lock_irqsave(&dev->lock, flags);
-                       if (isdn_add_channels(dev->drv[di], di, c->arg, 1)) {
-                               spin_unlock_irqrestore(&dev->lock, flags);
-                               return -1;
-                       }
-                       spin_unlock_irqrestore(&dev->lock, flags);
-                       isdn_info_update();
+               if (isdn_tty_stat_callback(i, c))
                        break;
-               case ISDN_STAT_DISCH:
-                       spin_lock_irqsave(&dev->lock, flags);
-                       for (i = 0; i < ISDN_MAX_CHANNELS; i++)
-                               if ((dev->drvmap[i] == di) &&
-                                   (dev->chanmap[i] == c->arg)) {
-                                   if (c->parm.num[0])
-                                     dev->usage[i] &= ~ISDN_USAGE_DISABLED;
-                                   else
-                                     if (USG_NONE(dev->usage[i])) {
-                                       dev->usage[i] |= ISDN_USAGE_DISABLED;
-                                     }
-                                     else 
-                                       retval = -1;
-                                   break;
-                               }
+               break;
+       case ISDN_STAT_ADDCH:
+               spin_lock_irqsave(&dev->lock, flags);
+               if (isdn_add_channels(dev->drv[di], di, c->arg, 1)) {
                        spin_unlock_irqrestore(&dev->lock, flags);
-                       isdn_info_update();
-                       break;
-               case ISDN_STAT_UNLOAD:
-                       while (dev->drv[di]->locks > 0) {
-                               isdn_unlock_driver(dev->drv[di]);
-                       }
-                       spin_lock_irqsave(&dev->lock, flags);
-                       isdn_tty_stat_callback(i, c);
-                       for (i = 0; i < ISDN_MAX_CHANNELS; i++)
-                               if (dev->drvmap[i] == di) {
-                                       dev->drvmap[i] = -1;
-                                       dev->chanmap[i] = -1;
+                       return -1;
+               }
+               spin_unlock_irqrestore(&dev->lock, flags);
+               isdn_info_update();
+               break;
+       case ISDN_STAT_DISCH:
+               spin_lock_irqsave(&dev->lock, flags);
+               for (i = 0; i < ISDN_MAX_CHANNELS; i++)
+                       if ((dev->drvmap[i] == di) &&
+                           (dev->chanmap[i] == c->arg)) {
+                               if (c->parm.num[0])
                                        dev->usage[i] &= ~ISDN_USAGE_DISABLED;
-                               }
-                       dev->drivers--;
-                       dev->channels -= dev->drv[di]->channels;
-                       kfree(dev->drv[di]->rcverr);
-                       kfree(dev->drv[di]->rcvcount);
-                       for (i = 0; i < dev->drv[di]->channels; i++)
-                               skb_queue_purge(&dev->drv[di]->rpqueue[i]);
-                       kfree(dev->drv[di]->rpqueue);
-                       kfree(dev->drv[di]->rcv_waitq);
-                       kfree(dev->drv[di]);
-                       dev->drv[di] = NULL;
-                       dev->drvid[di][0] = '\0';
-                       isdn_info_update();
-                       set_global_features();
-                       spin_unlock_irqrestore(&dev->lock, flags);
-                       return 0;
-               case ISDN_STAT_L1ERR:
-                       break;
-               case CAPI_PUT_MESSAGE:
-                       return(isdn_capi_rec_hl_msg(&c->parm.cmsg));
+                               else
+                                       if (USG_NONE(dev->usage[i])) {
+                                               dev->usage[i] |= ISDN_USAGE_DISABLED;
+                                       }
+                                       else
+                                               retval = -1;
+                               break;
+                       }
+               spin_unlock_irqrestore(&dev->lock, flags);
+               isdn_info_update();
+               break;
+       case ISDN_STAT_UNLOAD:
+               while (dev->drv[di]->locks > 0) {
+                       isdn_unlock_driver(dev->drv[di]);
+               }
+               spin_lock_irqsave(&dev->lock, flags);
+               isdn_tty_stat_callback(i, c);
+               for (i = 0; i < ISDN_MAX_CHANNELS; i++)
+                       if (dev->drvmap[i] == di) {
+                               dev->drvmap[i] = -1;
+                               dev->chanmap[i] = -1;
+                               dev->usage[i] &= ~ISDN_USAGE_DISABLED;
+                       }
+               dev->drivers--;
+               dev->channels -= dev->drv[di]->channels;
+               kfree(dev->drv[di]->rcverr);
+               kfree(dev->drv[di]->rcvcount);
+               for (i = 0; i < dev->drv[di]->channels; i++)
+                       skb_queue_purge(&dev->drv[di]->rpqueue[i]);
+               kfree(dev->drv[di]->rpqueue);
+               kfree(dev->drv[di]->rcv_waitq);
+               kfree(dev->drv[di]);
+               dev->drv[di] = NULL;
+               dev->drvid[di][0] = '\0';
+               isdn_info_update();
+               set_global_features();
+               spin_unlock_irqrestore(&dev->lock, flags);
+               return 0;
+       case ISDN_STAT_L1ERR:
+               break;
+       case CAPI_PUT_MESSAGE:
+               return (isdn_capi_rec_hl_msg(&c->parm.cmsg));
 #ifdef CONFIG_ISDN_TTY_FAX
-               case ISDN_STAT_FAXIND:
-                       isdn_tty_stat_callback(i, c);
-                       break;
+       case ISDN_STAT_FAXIND:
+               isdn_tty_stat_callback(i, c);
+               break;
 #endif
 #ifdef CONFIG_ISDN_AUDIO
-               case ISDN_STAT_AUDIO:
-                       isdn_tty_stat_callback(i, c);
-                       break;
+       case ISDN_STAT_AUDIO:
+               isdn_tty_stat_callback(i, c);
+               break;
 #endif
 #ifdef CONFIG_ISDN_DIVERSION
-               case ISDN_STAT_PROT:
-               case ISDN_STAT_REDIR:
-                        if (divert_if)
-                          return(divert_if->stat_callback(c));
+       case ISDN_STAT_PROT:
+       case ISDN_STAT_REDIR:
+               if (divert_if)
+                       return (divert_if->stat_callback(c));
 #endif /* CONFIG_ISDN_DIVERSION */
-               default:
-                       return -1;
+       default:
+               return -1;
        }
        return 0;
 }
@@ -755,17 +755,17 @@ isdn_getnum(char **p)
  * isdn_readbchan() tries to get data from the read-queue.
  * It MUST be called with interrupts off.
  *
- * Be aware that this is not an atomic operation when sleep != 0, even though 
+ * Be aware that this is not an atomic operation when sleep != 0, even though
  * interrupts are turned off! Well, like that we are currently only called
  * on behalf of a read system call on raw device files (which are documented
  * to be dangerous and for debugging purpose only). The inode semaphore
  * takes care that this is not called for the same minor device number while
  * we are sleeping, but access is not serialized against simultaneous read()
  * from the corresponding ttyI device. Can other ugly events, like changes
- * of the mapping (di,ch)<->minor, happen during the sleep? --he 
+ * of the mapping (di,ch)<->minor, happen during the sleep? --he
  */
 int
-isdn_readbchan(int di, int channel, u_char * buf, u_char * fp, int len, wait_queue_head_t *sleep)
+isdn_readbchan(int di, int channel, u_char *buf, u_char *fp, int len, wait_queue_head_t *sleep)
 {
        int count;
        int count_pull;
@@ -890,10 +890,10 @@ isdn_readbchan_tty(int di, int channel, struct tty_struct *tty, int cisco_hack)
        if (!dev->drv[di])
                return 0;
        if (skb_queue_empty(&dev->drv[di]->rpqueue[channel]))
-                       return 0;
+               return 0;
 
        len = tty_buffer_request_room(tty, dev->drv[di]->rcvcount[channel]);
-       if(len == 0)
+       if (len == 0)
                return len;
 
        count = 0;
@@ -912,7 +912,7 @@ isdn_readbchan_tty(int di, int channel, struct tty_struct *tty, int cisco_hack)
                        count_pull = count_put = 0;
                        while ((count_pull < skb->len) && (len > 0)) {
                                /* push every character but the last to the tty buffer directly */
-                               if ( count_put )
+                               if (count_put)
                                        tty_insert_flip_char(tty, last, TTY_NORMAL);
                                len--;
                                if (dev->drv[di]->DLEflag & DLEmask) {
@@ -940,7 +940,7 @@ isdn_readbchan_tty(int di, int channel, struct tty_struct *tty, int cisco_hack)
                                dflag = 0;
                        }
                        count_put = count_pull;
-                       if(count_put > 1)
+                       if (count_put > 1)
                                tty_insert_flip_string(tty, skb->data, count_put - 1);
                        last = skb->data[count_put - 1];
                        len -= count_put;
@@ -952,7 +952,7 @@ isdn_readbchan_tty(int di, int channel, struct tty_struct *tty, int cisco_hack)
                        /* We got all the data in this buff.
                         * Now we can dequeue it.
                         */
-                       if(cisco_hack)
+                       if (cisco_hack)
                                tty_insert_flip_char(tty, last, 0xFF);
                        else
                                tty_insert_flip_char(tty, last, TTY_NORMAL);
@@ -1057,7 +1057,7 @@ isdn_info_update(void)
 }
 
 static ssize_t
-isdn_read(struct file *file, char __user *buf, size_t count, loff_t * off)
+isdn_read(struct file *file, char __user *buf, size_t count, loff_t *off)
 {
        uint minor = iminor(file->f_path.dentry->d_inode);
        int len = 0;
@@ -1112,7 +1112,7 @@ isdn_read(struct file *file, char __user *buf, size_t count, loff_t * off)
                len = isdn_readbchan(drvidx, chidx, p, NULL, count,
                                     &dev->drv[drvidx]->rcv_waitq[chidx]);
                *off += len;
-               if (copy_to_user(buf,p,len)) 
+               if (copy_to_user(buf, p, len))
                        len = -EFAULT;
                kfree(p);
                retval = len;
@@ -1135,7 +1135,7 @@ isdn_read(struct file *file, char __user *buf, size_t count, loff_t * off)
                        if (count > dev->drv[drvidx]->stavail)
                                count = dev->drv[drvidx]->stavail;
                        len = dev->drv[drvidx]->interface->readstat(buf, count,
-                               drvidx, isdn_minor2chan(minor - ISDN_MINOR_CTRL));
+                                                                   drvidx, isdn_minor2chan(minor - ISDN_MINOR_CTRL));
                        if (len < 0) {
                                retval = len;
                                goto out;
@@ -1158,13 +1158,13 @@ isdn_read(struct file *file, char __user *buf, size_t count, loff_t * off)
        }
 #endif
        retval = -ENODEV;
- out:
+out:
        mutex_unlock(&isdn_mutex);
        return retval;
 }
 
 static ssize_t
-isdn_write(struct file *file, const char __user *buf, size_t count, loff_t * off)
+isdn_write(struct file *file, const char __user *buf, size_t count, loff_t *off)
 {
        uint minor = iminor(file->f_path.dentry->d_inode);
        int drvidx;
@@ -1204,11 +1204,11 @@ isdn_write(struct file *file, const char __user *buf, size_t count, loff_t * off
                 *
                 if (!(dev->drv[drvidx]->flags & DRV_FLAG_RUNNING))
                 return -ENODEV;
-                */
+               */
                if (dev->drv[drvidx]->interface->writecmd)
                        retval = dev->drv[drvidx]->interface->
                                writecmd(buf, count, drvidx,
-                               isdn_minor2chan(minor - ISDN_MINOR_CTRL));
+                                        isdn_minor2chan(minor - ISDN_MINOR_CTRL));
                else
                        retval = count;
                goto out;
@@ -1220,13 +1220,13 @@ isdn_write(struct file *file, const char __user *buf, size_t count, loff_t * off
        }
 #endif
        retval = -ENODEV;
- out:
+out:
        mutex_unlock(&isdn_mutex);
        return retval;
 }
 
 static unsigned int
-isdn_poll(struct file *file, poll_table * wait)
+isdn_poll(struct file *file, poll_table *wait)
 {
        unsigned int mask = 0;
        unsigned int minor = iminor(file->f_path.dentry->d_inode);
@@ -1261,7 +1261,7 @@ isdn_poll(struct file *file, poll_table * wait)
        }
 #endif
        mask = POLLERR;
- out:
+out:
        mutex_unlock(&isdn_mutex);
        return mask;
 }
@@ -1294,38 +1294,38 @@ isdn_ioctl(struct file *file, uint cmd, ulong arg)
 
        if (minor == ISDN_MINOR_STATUS) {
                switch (cmd) {
-                       case IIOCGETDVR:
-                               return (TTY_DV +
-                                       (NET_DV << 8) +
-                                       (INF_DV << 16));
-                       case IIOCGETCPS:
-                               if (arg) {
-                                       ulong __user *p = argp;
-                                       int i;
-                                       if (!access_ok(VERIFY_WRITE, p,
-                                                       sizeof(ulong) * ISDN_MAX_CHANNELS * 2))
-                                               return -EFAULT;
-                                       for (i = 0; i < ISDN_MAX_CHANNELS; i++) {
-                                               put_user(dev->ibytes[i], p++);
-                                               put_user(dev->obytes[i], p++);
-                                       }
-                                       return 0;
-                               } else
-                                       return -EINVAL;
-                               break;
+               case IIOCGETDVR:
+                       return (TTY_DV +
+                               (NET_DV << 8) +
+                               (INF_DV << 16));
+               case IIOCGETCPS:
+                       if (arg) {
+                               ulong __user *p = argp;
+                               int i;
+                               if (!access_ok(VERIFY_WRITE, p,
+                                              sizeof(ulong) * ISDN_MAX_CHANNELS * 2))
+                                       return -EFAULT;
+                               for (i = 0; i < ISDN_MAX_CHANNELS; i++) {
+                                       put_user(dev->ibytes[i], p++);
+                                       put_user(dev->obytes[i], p++);
+                               }
+                               return 0;
+                       } else
+                               return -EINVAL;
+                       break;
 #ifdef CONFIG_NETDEVICES
-                       case IIOCNETGPN:
-                               /* Get peer phone number of a connected 
-                                * isdn network interface */
-                               if (arg) {
-                                       if (copy_from_user(&phone, argp, sizeof(phone)))
-                                               return -EFAULT;
-                                       return isdn_net_getpeer(&phone, argp);
-                               } else
-                                       return -EINVAL;
-#endif
-                       default:
+               case IIOCNETGPN:
+                       /* Get peer phone number of a connected
+                        * isdn network interface */
+                       if (arg) {
+                               if (copy_from_user(&phone, argp, sizeof(phone)))
+                                       return -EFAULT;
+                               return isdn_net_getpeer(&phone, argp);
+                       } else
                                return -EINVAL;
+#endif
+               default:
+                       return -EINVAL;
                }
        }
        if (!dev->drivers)
@@ -1347,360 +1347,360 @@ isdn_ioctl(struct file *file, uint cmd, ulong arg)
  * are serialized by means of a semaphore.
  */
                switch (cmd) {
-                       case IIOCNETDWRSET:
-                               printk(KERN_INFO "INFO: ISDN_DW_ABC_EXTENSION not enabled\n");
-                               return(-EINVAL);
-                       case IIOCNETLCR:
-                               printk(KERN_INFO "INFO: ISDN_ABC_LCR_SUPPORT not enabled\n");
-                               return -ENODEV;
+               case IIOCNETDWRSET:
+                       printk(KERN_INFO "INFO: ISDN_DW_ABC_EXTENSION not enabled\n");
+                       return (-EINVAL);
+               case IIOCNETLCR:
+                       printk(KERN_INFO "INFO: ISDN_ABC_LCR_SUPPORT not enabled\n");
+                       return -ENODEV;
 #ifdef CONFIG_NETDEVICES
-                       case IIOCNETAIF:
-                               /* Add a network-interface */
-                               if (arg) {
-                                       if (copy_from_user(name, argp, sizeof(name)))
-                                               return -EFAULT;
-                                       s = name;
+               case IIOCNETAIF:
+                       /* Add a network-interface */
+                       if (arg) {
+                               if (copy_from_user(name, argp, sizeof(name)))
+                                       return -EFAULT;
+                               s = name;
+                       } else {
+                               s = NULL;
+                       }
+                       ret = mutex_lock_interruptible(&dev->mtx);
+                       if (ret) return ret;
+                       if ((s = isdn_net_new(s, NULL))) {
+                               if (copy_to_user(argp, s, strlen(s) + 1)) {
+                                       ret = -EFAULT;
+                               } else {
+                                       ret = 0;
+                               }
+                       } else
+                               ret = -ENODEV;
+                       mutex_unlock(&dev->mtx);
+                       return ret;
+               case IIOCNETASL:
+                       /* Add a slave to a network-interface */
+                       if (arg) {
+                               if (copy_from_user(bname, argp, sizeof(bname) - 1))
+                                       return -EFAULT;
+                       } else
+                               return -EINVAL;
+                       ret = mutex_lock_interruptible(&dev->mtx);
+                       if (ret) return ret;
+                       if ((s = isdn_net_newslave(bname))) {
+                               if (copy_to_user(argp, s, strlen(s) + 1)) {
+                                       ret = -EFAULT;
                                } else {
-                                       s = NULL;
+                                       ret = 0;
                                }
+                       } else
+                               ret = -ENODEV;
+                       mutex_unlock(&dev->mtx);
+                       return ret;
+               case IIOCNETDIF:
+                       /* Delete a network-interface */
+                       if (arg) {
+                               if (copy_from_user(name, argp, sizeof(name)))
+                                       return -EFAULT;
                                ret = mutex_lock_interruptible(&dev->mtx);
-                               if( ret ) return ret;
-                               if ((s = isdn_net_new(s, NULL))) {
-                                       if (copy_to_user(argp, s, strlen(s) + 1)){
-                                               ret = -EFAULT;
-                                       } else {
-                                               ret = 0;
-                                       }
-                               } else
-                                       ret = -ENODEV;
+                               if (ret) return ret;
+                               ret = isdn_net_rm(name);
                                mutex_unlock(&dev->mtx);
                                return ret;
-                       case IIOCNETASL:
-                               /* Add a slave to a network-interface */
-                               if (arg) {
-                                       if (copy_from_user(bname, argp, sizeof(bname) - 1))
+                       } else
+                               return -EINVAL;
+               case IIOCNETSCF:
+                       /* Set configurable parameters of a network-interface */
+                       if (arg) {
+                               if (copy_from_user(&cfg, argp, sizeof(cfg)))
+                                       return -EFAULT;
+                               return isdn_net_setcfg(&cfg);
+                       } else
+                               return -EINVAL;
+               case IIOCNETGCF:
+                       /* Get configurable parameters of a network-interface */
+                       if (arg) {
+                               if (copy_from_user(&cfg, argp, sizeof(cfg)))
+                                       return -EFAULT;
+                               if (!(ret = isdn_net_getcfg(&cfg))) {
+                                       if (copy_to_user(argp, &cfg, sizeof(cfg)))
                                                return -EFAULT;
-                               } else
-                                       return -EINVAL;
+                               }
+                               return ret;
+                       } else
+                               return -EINVAL;
+               case IIOCNETANM:
+                       /* Add a phone-number to a network-interface */
+                       if (arg) {
+                               if (copy_from_user(&phone, argp, sizeof(phone)))
+                                       return -EFAULT;
                                ret = mutex_lock_interruptible(&dev->mtx);
-                               if( ret ) return ret;
-                               if ((s = isdn_net_newslave(bname))) {
-                                       if (copy_to_user(argp, s, strlen(s) + 1)){
-                                               ret = -EFAULT;
-                                       } else {
-                                               ret = 0;
-                                       }
-                               } else
-                                       ret = -ENODEV;
+                               if (ret) return ret;
+                               ret = isdn_net_addphone(&phone);
                                mutex_unlock(&dev->mtx);
                                return ret;
-                       case IIOCNETDIF:
-                               /* Delete a network-interface */
-                               if (arg) {
-                                       if (copy_from_user(name, argp, sizeof(name)))
-                                               return -EFAULT;
-                                       ret = mutex_lock_interruptible(&dev->mtx);
-                                       if( ret ) return ret;
-                                       ret = isdn_net_rm(name);
-                                       mutex_unlock(&dev->mtx);
-                                       return ret;
-                               } else
-                                       return -EINVAL;
-                       case IIOCNETSCF:
-                               /* Set configurable parameters of a network-interface */
-                               if (arg) {
-                                       if (copy_from_user(&cfg, argp, sizeof(cfg)))
-                                               return -EFAULT;
-                                       return isdn_net_setcfg(&cfg);
-                               } else
-                                       return -EINVAL;
-                       case IIOCNETGCF:
-                               /* Get configurable parameters of a network-interface */
-                               if (arg) {
-                                       if (copy_from_user(&cfg, argp, sizeof(cfg)))
-                                               return -EFAULT;
-                                       if (!(ret = isdn_net_getcfg(&cfg))) {
-                                               if (copy_to_user(argp, &cfg, sizeof(cfg)))
-                                                       return -EFAULT;
-                                       }
-                                       return ret;
-                               } else
-                                       return -EINVAL;
-                       case IIOCNETANM:
-                               /* Add a phone-number to a network-interface */
-                               if (arg) {
-                                       if (copy_from_user(&phone, argp, sizeof(phone)))
-                                               return -EFAULT;
-                                       ret = mutex_lock_interruptible(&dev->mtx);
-                                       if( ret ) return ret;
-                                       ret = isdn_net_addphone(&phone);
-                                       mutex_unlock(&dev->mtx);
-                                       return ret;
-                               } else
-                                       return -EINVAL;
-                       case IIOCNETGNM:
-                               /* Get list of phone-numbers of a network-interface */
-                               if (arg) {
-                                       if (copy_from_user(&phone, argp, sizeof(phone)))
-                                               return -EFAULT;
-                                       ret = mutex_lock_interruptible(&dev->mtx);
-                                       if( ret ) return ret;
-                                       ret = isdn_net_getphones(&phone, argp);
-                                       mutex_unlock(&dev->mtx);
-                                       return ret;
-                               } else
-                                       return -EINVAL;
-                       case IIOCNETDNM:
-                               /* Delete a phone-number of a network-interface */
-                               if (arg) {
-                                       if (copy_from_user(&phone, argp, sizeof(phone)))
-                                               return -EFAULT;
-                                       ret = mutex_lock_interruptible(&dev->mtx);
-                                       if( ret ) return ret;
-                                       ret = isdn_net_delphone(&phone);
-                                       mutex_unlock(&dev->mtx);
-                                       return ret;
-                               } else
-                                       return -EINVAL;
-                       case IIOCNETDIL:
-                               /* Force dialing of a network-interface */
-                               if (arg) {
-                                       if (copy_from_user(name, argp, sizeof(name)))
-                                               return -EFAULT;
-                                       return isdn_net_force_dial(name);
-                               } else
-                                       return -EINVAL;
-#ifdef CONFIG_ISDN_PPP
-                       case IIOCNETALN:
-                               if (!arg)
-                                       return -EINVAL;
-                               if (copy_from_user(name, argp, sizeof(name)))
+                       } else
+                               return -EINVAL;
+               case IIOCNETGNM:
+                       /* Get list of phone-numbers of a network-interface */
+                       if (arg) {
+                               if (copy_from_user(&phone, argp, sizeof(phone)))
                                        return -EFAULT;
-                               return isdn_ppp_dial_slave(name);
-                       case IIOCNETDLN:
-                               if (!arg)
-                                       return -EINVAL;
-                               if (copy_from_user(name, argp, sizeof(name)))
+                               ret = mutex_lock_interruptible(&dev->mtx);
+                               if (ret) return ret;
+                               ret = isdn_net_getphones(&phone, argp);
+                               mutex_unlock(&dev->mtx);
+                               return ret;
+                       } else
+                               return -EINVAL;
+               case IIOCNETDNM:
+                       /* Delete a phone-number of a network-interface */
+                       if (arg) {
+                               if (copy_from_user(&phone, argp, sizeof(phone)))
                                        return -EFAULT;
-                               return isdn_ppp_hangup_slave(name);
-#endif
-                       case IIOCNETHUP:
-                               /* Force hangup of a network-interface */
-                               if (!arg)
-                                       return -EINVAL;
+                               ret = mutex_lock_interruptible(&dev->mtx);
+                               if (ret) return ret;
+                               ret = isdn_net_delphone(&phone);
+                               mutex_unlock(&dev->mtx);
+                               return ret;
+                       } else
+                               return -EINVAL;
+               case IIOCNETDIL:
+                       /* Force dialing of a network-interface */
+                       if (arg) {
                                if (copy_from_user(name, argp, sizeof(name)))
                                        return -EFAULT;
-                               return isdn_net_force_hangup(name);
-                               break;
+                               return isdn_net_force_dial(name);
+                       } else
+                               return -EINVAL;
+#ifdef CONFIG_ISDN_PPP
+               case IIOCNETALN:
+                       if (!arg)
+                               return -EINVAL;
+                       if (copy_from_user(name, argp, sizeof(name)))
+                               return -EFAULT;
+                       return isdn_ppp_dial_slave(name);
+               case IIOCNETDLN:
+                       if (!arg)
+                               return -EINVAL;
+                       if (copy_from_user(name, argp, sizeof(name)))
+                               return -EFAULT;
+                       return isdn_ppp_hangup_slave(name);
+#endif
+               case IIOCNETHUP:
+                       /* Force hangup of a network-interface */
+                       if (!arg)
+                               return -EINVAL;
+                       if (copy_from_user(name, argp, sizeof(name)))
+                               return -EFAULT;
+                       return isdn_net_force_hangup(name);
+                       break;
 #endif                          /* CONFIG_NETDEVICES */
-                       case IIOCSETVER:
-                               dev->net_verbose = arg;
-                               printk(KERN_INFO "isdn: Verbose-Level is %d\n", dev->net_verbose);
-                               return 0;
-                       case IIOCSETGST:
-                               if (arg)
-                                       dev->global_flags |= ISDN_GLOBAL_STOPPED;
-                               else
-                                       dev->global_flags &= ~ISDN_GLOBAL_STOPPED;
-                               printk(KERN_INFO "isdn: Global Mode %s\n",
-                                      (dev->global_flags & ISDN_GLOBAL_STOPPED) ? "stopped" : "running");
-                               return 0;
-                       case IIOCSETBRJ:
-                               drvidx = -1;
-                               if (arg) {
-                                       int i;
-                                       char *p;
-                                       if (copy_from_user(&iocts, argp,
-                                            sizeof(isdn_ioctl_struct)))
-                                               return -EFAULT;
-                                       iocts.drvid[sizeof(iocts.drvid)-1] = 0;
-                                       if (strlen(iocts.drvid)) {
-                                               if ((p = strchr(iocts.drvid, ',')))
-                                                       *p = 0;
-                                               drvidx = -1;
-                                               for (i = 0; i < ISDN_MAX_DRIVERS; i++)
-                                                       if (!(strcmp(dev->drvid[i], iocts.drvid))) {
-                                                               drvidx = i;
-                                                               break;
-                                                       }
-                                       }
+               case IIOCSETVER:
+                       dev->net_verbose = arg;
+                       printk(KERN_INFO "isdn: Verbose-Level is %d\n", dev->net_verbose);
+                       return 0;
+               case IIOCSETGST:
+                       if (arg)
+                               dev->global_flags |= ISDN_GLOBAL_STOPPED;
+                       else
+                               dev->global_flags &= ~ISDN_GLOBAL_STOPPED;
+                       printk(KERN_INFO "isdn: Global Mode %s\n",
+                              (dev->global_flags & ISDN_GLOBAL_STOPPED) ? "stopped" : "running");
+                       return 0;
+               case IIOCSETBRJ:
+                       drvidx = -1;
+                       if (arg) {
+                               int i;
+                               char *p;
+                               if (copy_from_user(&iocts, argp,
+                                                  sizeof(isdn_ioctl_struct)))
+                                       return -EFAULT;
+                               iocts.drvid[sizeof(iocts.drvid) - 1] = 0;
+                               if (strlen(iocts.drvid)) {
+                                       if ((p = strchr(iocts.drvid, ',')))
+                                               *p = 0;
+                                       drvidx = -1;
+                                       for (i = 0; i < ISDN_MAX_DRIVERS; i++)
+                                               if (!(strcmp(dev->drvid[i], iocts.drvid))) {
+                                                       drvidx = i;
+                                                       break;
+                                               }
                                }
-                               if (drvidx == -1)
-                                       return -ENODEV;
-                               if (iocts.arg)
-                                       dev->drv[drvidx]->flags |= DRV_FLAG_REJBUS;
-                               else
-                                       dev->drv[drvidx]->flags &= ~DRV_FLAG_REJBUS;
-                               return 0;
-                       case IIOCSIGPRF:
-                               dev->profd = current;
-                               return 0;
-                               break;
-                       case IIOCGETPRF:
-                               /* Get all Modem-Profiles */
-                               if (arg) {
-                                       char __user *p = argp;
-                                       int i;
-
-                                       if (!access_ok(VERIFY_WRITE, argp,
-                                       (ISDN_MODEM_NUMREG + ISDN_MSNLEN + ISDN_LMSNLEN)
-                                                  * ISDN_MAX_CHANNELS))
+                       }
+                       if (drvidx == -1)
+                               return -ENODEV;
+                       if (iocts.arg)
+                               dev->drv[drvidx]->flags |= DRV_FLAG_REJBUS;
+                       else
+                               dev->drv[drvidx]->flags &= ~DRV_FLAG_REJBUS;
+                       return 0;
+               case IIOCSIGPRF:
+                       dev->profd = current;
+                       return 0;
+                       break;
+               case IIOCGETPRF:
+                       /* Get all Modem-Profiles */
+                       if (arg) {
+                               char __user *p = argp;
+                               int i;
+
+                               if (!access_ok(VERIFY_WRITE, argp,
+                                              (ISDN_MODEM_NUMREG + ISDN_MSNLEN + ISDN_LMSNLEN)
+                                              * ISDN_MAX_CHANNELS))
+                                       return -EFAULT;
+
+                               for (i = 0; i < ISDN_MAX_CHANNELS; i++) {
+                                       if (copy_to_user(p, dev->mdm.info[i].emu.profile,
+                                                        ISDN_MODEM_NUMREG))
+                                               return -EFAULT;
+                                       p += ISDN_MODEM_NUMREG;
+                                       if (copy_to_user(p, dev->mdm.info[i].emu.pmsn, ISDN_MSNLEN))
                                                return -EFAULT;
+                                       p += ISDN_MSNLEN;
+                                       if (copy_to_user(p, dev->mdm.info[i].emu.plmsn, ISDN_LMSNLEN))
+                                               return -EFAULT;
+                                       p += ISDN_LMSNLEN;
+                               }
+                               return (ISDN_MODEM_NUMREG + ISDN_MSNLEN + ISDN_LMSNLEN) * ISDN_MAX_CHANNELS;
+                       } else
+                               return -EINVAL;
+                       break;
+               case IIOCSETPRF:
+                       /* Set all Modem-Profiles */
+                       if (arg) {
+                               char __user *p = argp;
+                               int i;
+
+                               if (!access_ok(VERIFY_READ, argp,
+                                              (ISDN_MODEM_NUMREG + ISDN_MSNLEN + ISDN_LMSNLEN)
+                                              * ISDN_MAX_CHANNELS))
+                                       return -EFAULT;
 
-                                       for (i = 0; i < ISDN_MAX_CHANNELS; i++) {
-                                               if (copy_to_user(p, dev->mdm.info[i].emu.profile,
-                                                     ISDN_MODEM_NUMREG))
-                                                       return -EFAULT;
-                                               p += ISDN_MODEM_NUMREG;
-                                               if (copy_to_user(p, dev->mdm.info[i].emu.pmsn, ISDN_MSNLEN))
-                                                       return -EFAULT;
-                                               p += ISDN_MSNLEN;
-                                               if (copy_to_user(p, dev->mdm.info[i].emu.plmsn, ISDN_LMSNLEN))
-                                                       return -EFAULT;
-                                               p += ISDN_LMSNLEN;
-                                       }
-                                       return (ISDN_MODEM_NUMREG + ISDN_MSNLEN + ISDN_LMSNLEN) * ISDN_MAX_CHANNELS;
-                               } else
-                                       return -EINVAL;
-                               break;
-                       case IIOCSETPRF:
-                               /* Set all Modem-Profiles */
-                               if (arg) {
-                                       char __user *p = argp;
-                                       int i;
-
-                                       if (!access_ok(VERIFY_READ, argp,
-                                       (ISDN_MODEM_NUMREG + ISDN_MSNLEN + ISDN_LMSNLEN)
-                                                  * ISDN_MAX_CHANNELS))
+                               for (i = 0; i < ISDN_MAX_CHANNELS; i++) {
+                                       if (copy_from_user(dev->mdm.info[i].emu.profile, p,
+                                                          ISDN_MODEM_NUMREG))
+                                               return -EFAULT;
+                                       p += ISDN_MODEM_NUMREG;
+                                       if (copy_from_user(dev->mdm.info[i].emu.plmsn, p, ISDN_LMSNLEN))
                                                return -EFAULT;
+                                       p += ISDN_LMSNLEN;
+                                       if (copy_from_user(dev->mdm.info[i].emu.pmsn, p, ISDN_MSNLEN))
+                                               return -EFAULT;
+                                       p += ISDN_MSNLEN;
+                               }
+                               return 0;
+                       } else
+                               return -EINVAL;
+                       break;
+               case IIOCSETMAP:
+               case IIOCGETMAP:
+                       /* Set/Get MSN->EAZ-Mapping for a driver */
+                       if (arg) {
 
-                                       for (i = 0; i < ISDN_MAX_CHANNELS; i++) {
-                                               if (copy_from_user(dev->mdm.info[i].emu.profile, p,
-                                                    ISDN_MODEM_NUMREG))
-                                                       return -EFAULT;
-                                               p += ISDN_MODEM_NUMREG;
-                                               if (copy_from_user(dev->mdm.info[i].emu.plmsn, p, ISDN_LMSNLEN))
-                                                       return -EFAULT;
-                                               p += ISDN_LMSNLEN;
-                                               if (copy_from_user(dev->mdm.info[i].emu.pmsn, p, ISDN_MSNLEN))
-                                                       return -EFAULT;
-                                               p += ISDN_MSNLEN;
-                                       }
-                                       return 0;
+                               if (copy_from_user(&iocts, argp,
+                                                  sizeof(isdn_ioctl_struct)))
+                                       return -EFAULT;
+                               iocts.drvid[sizeof(iocts.drvid) - 1] = 0;
+                               if (strlen(iocts.drvid)) {
+                                       drvidx = -1;
+                                       for (i = 0; i < ISDN_MAX_DRIVERS; i++)
+                                               if (!(strcmp(dev->drvid[i], iocts.drvid))) {
+                                                       drvidx = i;
+                                                       break;
+                                               }
                                } else
-                                       return -EINVAL;
-                               break;
-                       case IIOCSETMAP:
-                       case IIOCGETMAP:
-                               /* Set/Get MSN->EAZ-Mapping for a driver */
-                               if (arg) {
+                                       drvidx = 0;
+                               if (drvidx == -1)
+                                       return -ENODEV;
+                               if (cmd == IIOCSETMAP) {
+                                       int loop = 1;
 
-                                       if (copy_from_user(&iocts, argp,
-                                            sizeof(isdn_ioctl_struct)))
-                                               return -EFAULT;
-                                       iocts.drvid[sizeof(iocts.drvid)-1] = 0;
-                                       if (strlen(iocts.drvid)) {
-                                               drvidx = -1;
-                                               for (i = 0; i < ISDN_MAX_DRIVERS; i++)
-                                                       if (!(strcmp(dev->drvid[i], iocts.drvid))) {
-                                                               drvidx = i;
+                                       p = (char __user *) iocts.arg;
+                                       i = 0;
+                                       while (loop) {
+                                               int j = 0;
+
+                                               while (1) {
+                                                       if (!access_ok(VERIFY_READ, p, 1))
+                                                               return -EFAULT;
+                                                       get_user(bname[j], p++);
+                                                       switch (bname[j]) {
+                                                       case '\0':
+                                                               loop = 0;
+                                                               /* Fall through */
+                                                       case ',':
+                                                               bname[j] = '\0';
+                                                               strcpy(dev->drv[drvidx]->msn2eaz[i], bname);
+                                                               j = ISDN_MSNLEN;
                                                                break;
+                                                       default:
+                                                               j++;
                                                        }
-                                       } else
-                                               drvidx = 0;
-                                       if (drvidx == -1)
-                                               return -ENODEV;
-                                       if (cmd == IIOCSETMAP) {
-                                               int loop = 1;
-
-                                               p = (char __user *) iocts.arg;
-                                               i = 0;
-                                               while (loop) {
-                                                       int j = 0;
-
-                                                       while (1) {
-                                                               if (!access_ok(VERIFY_READ, p, 1))
-                                                                       return -EFAULT;
-                                                               get_user(bname[j], p++);
-                                                               switch (bname[j]) {
-                                                                       case '\0':
-                                                                               loop = 0;
-                                                                               /* Fall through */
-                                                                       case ',':
-                                                                               bname[j] = '\0';
-                                                                               strcpy(dev->drv[drvidx]->msn2eaz[i], bname);
-                                                                               j = ISDN_MSNLEN;
-                                                                               break;
-                                                                       default:
-                                                                               j++;
-                                                               }
-                                                               if (j >= ISDN_MSNLEN)
-                                                                       break;
-                                                       }
-                                                       if (++i > 9)
+                                                       if (j >= ISDN_MSNLEN)
                                                                break;
                                                }
-                                       } else {
-                                               p = (char __user *) iocts.arg;
-                                               for (i = 0; i < 10; i++) {
-                                                       snprintf(bname, sizeof(bname), "%s%s",
-                                                               strlen(dev->drv[drvidx]->msn2eaz[i]) ?
-                                                               dev->drv[drvidx]->msn2eaz[i] : "_",
-                                                               (i < 9) ? "," : "\0");
-                                                       if (copy_to_user(p, bname, strlen(bname) + 1))
-                                                               return -EFAULT;
-                                                       p += strlen(bname);
-                                               }
+                                               if (++i > 9)
+                                                       break;
                                        }
-                                       return 0;
-                               } else
-                                       return -EINVAL;
-                       case IIOCDBGVAR:
-                               if (arg) {
-                                       if (copy_to_user(argp, &dev, sizeof(ulong)))
-                                               return -EFAULT;
-                                       return 0;
-                               } else
-                                       return -EINVAL;
-                               break;
-                       default:
-                               if ((cmd & IIOCDRVCTL) == IIOCDRVCTL)
-                                       cmd = ((cmd >> _IOC_NRSHIFT) & _IOC_NRMASK) & ISDN_DRVIOCTL_MASK;
-                               else
-                                       return -EINVAL;
-                               if (arg) {
-                                       int i;
-                                       char *p;
-                                       if (copy_from_user(&iocts, argp, sizeof(isdn_ioctl_struct)))
-                                               return -EFAULT;
-                                       iocts.drvid[sizeof(iocts.drvid)-1] = 0;
-                                       if (strlen(iocts.drvid)) {
-                                               if ((p = strchr(iocts.drvid, ',')))
-                                                       *p = 0;
-                                               drvidx = -1;
-                                               for (i = 0; i < ISDN_MAX_DRIVERS; i++)
-                                                       if (!(strcmp(dev->drvid[i], iocts.drvid))) {
-                                                               drvidx = i;
-                                                               break;
-                                                       }
-                                       } else
-                                               drvidx = 0;
-                                       if (drvidx == -1)
-                                               return -ENODEV;
-                                       if (!access_ok(VERIFY_WRITE, argp,
-                                            sizeof(isdn_ioctl_struct)))
-                                               return -EFAULT;
-                                       c.driver = drvidx;
-                                       c.command = ISDN_CMD_IOCTL;
-                                       c.arg = cmd;
-                                       memcpy(c.parm.num, &iocts.arg, sizeof(ulong));
-                                       ret = isdn_command(&c);
-                                       memcpy(&iocts.arg, c.parm.num, sizeof(ulong));
-                                       if (copy_to_user(argp, &iocts, sizeof(isdn_ioctl_struct)))
-                                               return -EFAULT;
-                                       return ret;
+                               } else {
+                                       p = (char __user *) iocts.arg;
+                                       for (i = 0; i < 10; i++) {
+                                               snprintf(bname, sizeof(bname), "%s%s",
+                                                        strlen(dev->drv[drvidx]->msn2eaz[i]) ?
+                                                        dev->drv[drvidx]->msn2eaz[i] : "_",
+                                                        (i < 9) ? "," : "\0");
+                                               if (copy_to_user(p, bname, strlen(bname) + 1))
+                                                       return -EFAULT;
+                                               p += strlen(bname);
+                                       }
+                               }
+                               return 0;
+                       } else
+                               return -EINVAL;
+               case IIOCDBGVAR:
+                       if (arg) {
+                               if (copy_to_user(argp, &dev, sizeof(ulong)))
+                                       return -EFAULT;
+                               return 0;
+                       } else
+                               return -EINVAL;
+                       break;
+               default:
+                       if ((cmd & IIOCDRVCTL) == IIOCDRVCTL)
+                               cmd = ((cmd >> _IOC_NRSHIFT) & _IOC_NRMASK) & ISDN_DRVIOCTL_MASK;
+                       else
+                               return -EINVAL;
+                       if (arg) {
+                               int i;
+                               char *p;
+                               if (copy_from_user(&iocts, argp, sizeof(isdn_ioctl_struct)))
+                                       return -EFAULT;
+                               iocts.drvid[sizeof(iocts.drvid) - 1] = 0;
+                               if (strlen(iocts.drvid)) {
+                                       if ((p = strchr(iocts.drvid, ',')))
+                                               *p = 0;
+                                       drvidx = -1;
+                                       for (i = 0; i < ISDN_MAX_DRIVERS; i++)
+                                               if (!(strcmp(dev->drvid[i], iocts.drvid))) {
+                                                       drvidx = i;
+                                                       break;
+                                               }
                                } else
-                                       return -EINVAL;
+                                       drvidx = 0;
+                               if (drvidx == -1)
+                                       return -ENODEV;
+                               if (!access_ok(VERIFY_WRITE, argp,
+                                              sizeof(isdn_ioctl_struct)))
+                                       return -EFAULT;
+                               c.driver = drvidx;
+                               c.command = ISDN_CMD_IOCTL;
+                               c.arg = cmd;
+                               memcpy(c.parm.num, &iocts.arg, sizeof(ulong));
+                               ret = isdn_command(&c);
+                               memcpy(&iocts.arg, c.parm.num, sizeof(ulong));
+                               if (copy_to_user(argp, &iocts, sizeof(isdn_ioctl_struct)))
+                                       return -EFAULT;
+                               return ret;
+                       } else
+                               return -EINVAL;
                }
        }
 #ifdef CONFIG_ISDN_PPP
@@ -1788,7 +1788,7 @@ isdn_open(struct inode *ino, struct file *filep)
                goto out;
        }
 #endif
- out:
+out:
        nonseekable_open(ino, filep);
        mutex_unlock(&isdn_mutex);
        return retval;
@@ -1832,7 +1832,7 @@ isdn_close(struct inode *ino, struct file *filep)
                isdn_ppp_release(minor - ISDN_MINOR_PPP, filep);
 #endif
 
- out:
+out:
        mutex_unlock(&isdn_mutex);
        return 0;
 }
@@ -1868,14 +1868,14 @@ isdn_map_eaz2msn(char *msn, int di)
  * Find an unused ISDN-channel, whose feature-flags match the
  * given L2- and L3-protocols.
  */
-#define L2V (~(ISDN_FEATURE_L2_V11096|ISDN_FEATURE_L2_V11019|ISDN_FEATURE_L2_V11038))
+#define L2V (~(ISDN_FEATURE_L2_V11096 | ISDN_FEATURE_L2_V11019 | ISDN_FEATURE_L2_V11038))
 
 /*
  * This function must be called with holding the dev->lock.
  */
 int
 isdn_get_free_channel(int usage, int l2_proto, int l3_proto, int pre_dev
-                     ,int pre_chan, char *msn)
+                     , int pre_chan, char *msn)
 {
        int i;
        ulong features;
@@ -1883,7 +1883,7 @@ isdn_get_free_channel(int usage, int l2_proto, int l3_proto, int pre_dev
 
        features = ((1 << l2_proto) | (0x10000 << l3_proto));
        vfeatures = (((1 << l2_proto) | (0x10000 << l3_proto)) &
-                    ~(ISDN_FEATURE_L2_V11096|ISDN_FEATURE_L2_V11019|ISDN_FEATURE_L2_V11038));
+                    ~(ISDN_FEATURE_L2_V11096 | ISDN_FEATURE_L2_V11019 | ISDN_FEATURE_L2_V11038));
        /* If Layer-2 protocol is V.110, accept drivers with
         * transparent feature even if these don't support V.110
         * because we can emulate this in linklevel.
@@ -1893,12 +1893,12 @@ isdn_get_free_channel(int usage, int l2_proto, int l3_proto, int pre_dev
                    (dev->drvmap[i] != -1)) {
                        int d = dev->drvmap[i];
                        if ((dev->usage[i] & ISDN_USAGE_EXCLUSIVE) &&
-                       ((pre_dev != d) || (pre_chan != dev->chanmap[i])))
+                           ((pre_dev != d) || (pre_chan != dev->chanmap[i])))
                                continue;
                        if (!strcmp(isdn_map_eaz2msn(msn, d), "-"))
                                continue;
                        if (dev->usage[i] & ISDN_USAGE_DISABLED)
-                               continue; /* usage not allowed */
+                               continue; /* usage not allowed */
                        if (dev->drv[d]->flags & DRV_FLAG_RUNNING) {
                                if (((dev->drv[d]->interface->features & features) == features) ||
                                    (((dev->drv[d]->interface->features & vfeatures) == vfeatures) &&
@@ -1932,7 +1932,7 @@ isdn_free_channel(int di, int ch, int usage)
 
        if ((di < 0) || (ch < 0)) {
                printk(KERN_WARNING "%s: called with invalid drv(%d) or channel(%d)\n",
-                       __func__, di, ch);
+                      __func__, di, ch);
                return;
        }
        for (i = 0; i < ISDN_MAX_CHANNELS; i++)
@@ -1976,7 +1976,7 @@ isdn_unexclusive_channel(int di, int ch)
  *  writebuf replacement for SKB_ABLE drivers
  */
 static int
-isdn_writebuf_stub(int drvidx, int chan, const u_char __user * buf, int len)
+isdn_writebuf_stub(int drvidx, int chan, const u_char __user *buf, int len)
 {
        int ret;
        int hl = dev->drv[drvidx]->interface->hl_hdrlen;
@@ -2026,8 +2026,8 @@ isdn_writebuf_skb_stub(int drvidx, int chan, int ack, struct sk_buff *skb)
        } else {
                int hl = dev->drv[drvidx]->interface->hl_hdrlen;
 
-               if( skb_headroom(skb) < hl ){
-                       /* 
+               if (skb_headroom(skb) < hl) {
+                       /*
                         * This should only occur when new HL driver with
                         * increased hl_hdrlen was loaded after netdevice
                         * was created and connected to the new driver.
@@ -2035,13 +2035,13 @@ isdn_writebuf_skb_stub(int drvidx, int chan, int ack, struct sk_buff *skb)
                         * The V.110 branch (re-allocates on its own) does
                         * not need this
                         */
-                       struct sk_buff * skb_tmp;
+                       struct sk_buff *skb_tmp;
 
                        skb_tmp = skb_realloc_headroom(skb, hl);
                        printk(KERN_DEBUG "isdn_writebuf_skb_stub: reallocating headroom%s\n", skb_tmp ? "" : " failed");
                        if (!skb_tmp) return -ENOMEM; /* 0 better? */
                        ret = dev->drv[drvidx]->interface->writebuf_skb(drvidx, chan, ack, skb_tmp);
-                       if( ret > 0 ){
+                       if (ret > 0) {
                                dev_kfree_skb(skb);
                        } else {
                                dev_kfree_skb(skb_tmp);
@@ -2059,7 +2059,7 @@ isdn_writebuf_skb_stub(int drvidx, int chan, int ack, struct sk_buff *skb)
                        /* For V.110 return unencoded data length */
                        ret = v110_ret;
                        /* if the complete frame was send we free the skb;
-                          if not upper function will requeue the skb */ 
+                          if not upper function will requeue the skb */
                        if (ret == skb->len)
                                dev_kfree_skb(skb);
                }
@@ -2077,7 +2077,7 @@ isdn_add_channels(isdn_driver_t *d, int drvidx, int n, int adding)
        init_waitqueue_head(&d->st_waitq);
        if (d->flags & DRV_FLAG_RUNNING)
                return -1;
-               if (n < 1) return 0;
+       if (n < 1) return 0;
 
        m = (adding) ? d->channels + n : n;
 
@@ -2114,7 +2114,7 @@ isdn_add_channels(isdn_driver_t *d, int drvidx, int n, int adding)
                        kfree(d->rcvcount);
                        kfree(d->rcverr);
                }
-               return -1; 
+               return -1;
        }
        for (j = 0; j < m; j++) {
                skb_queue_head_init(&d->rpqueue[j]);
@@ -2172,45 +2172,45 @@ set_global_features(void)
 
 static char *map_drvname(int di)
 {
-  if ((di < 0) || (di >= ISDN_MAX_DRIVERS)) 
-    return(NULL);
-  return(dev->drvid[di]); /* driver name */
+       if ((di < 0) || (di >= ISDN_MAX_DRIVERS))
+               return (NULL);
+       return (dev->drvid[di]); /* driver name */
 } /* map_drvname */
 
 static int map_namedrv(char *id)
 {  int i;
 
-   for (i = 0; i < ISDN_MAX_DRIVERS; i++)
-    { if (!strcmp(dev->drvid[i],id)) 
-        return(i);
-    }
-   return(-1);
+       for (i = 0; i < ISDN_MAX_DRIVERS; i++)
+       { if (!strcmp(dev->drvid[i], id))
+                       return (i);
+       }
+       return (-1);
 } /* map_namedrv */
 
 int DIVERT_REG_NAME(isdn_divert_if *i_div)
 {
-  if (i_div->if_magic != DIVERT_IF_MAGIC) 
-    return(DIVERT_VER_ERR);
-  switch (i_div->cmd)
-    {
-      case DIVERT_CMD_REL:
-        if (divert_if != i_div) 
-          return(DIVERT_REL_ERR);
-        divert_if = NULL; /* free interface */
-        return(DIVERT_NO_ERR);
-
-      case DIVERT_CMD_REG:
-        if (divert_if) 
-          return(DIVERT_REG_ERR);
-        i_div->ll_cmd = isdn_command; /* set command function */
-        i_div->drv_to_name = map_drvname; 
-        i_div->name_to_drv = map_namedrv; 
-        divert_if = i_div; /* remember interface */
-        return(DIVERT_NO_ERR);
-
-      default:
-        return(DIVERT_CMD_ERR);   
-    }
+       if (i_div->if_magic != DIVERT_IF_MAGIC)
+               return (DIVERT_VER_ERR);
+       switch (i_div->cmd)
+       {
+       case DIVERT_CMD_REL:
+               if (divert_if != i_div)
+                       return (DIVERT_REL_ERR);
+               divert_if = NULL; /* free interface */
+               return (DIVERT_NO_ERR);
+
+       case DIVERT_CMD_REG:
+               if (divert_if)
+                       return (DIVERT_REG_ERR);
+               i_div->ll_cmd = isdn_command; /* set command function */
+               i_div->drv_to_name = map_drvname;
+               i_div->name_to_drv = map_namedrv;
+               divert_if = i_div; /* remember interface */
+               return (DIVERT_NO_ERR);
+
+       default:
+               return (DIVERT_CMD_ERR);
+       }
 } /* DIVERT_REG_NAME */
 
 EXPORT_SYMBOL(DIVERT_REG_NAME);
@@ -2225,7 +2225,7 @@ EXPORT_SYMBOL(isdn_ppp_unregister_compressor);
 #endif
 
 int
-register_isdn(isdn_if * i)
+register_isdn(isdn_if *i)
 {
        isdn_driver_t *d;
        int j;
@@ -2280,10 +2280,10 @@ register_isdn(isdn_if * i)
 }
 
 /*
- *****************************************************************************
- * And now the modules code.
- *****************************************************************************
- */
+*****************************************************************************
+* And now the modules code.
+*****************************************************************************
+*/
 
 static char *
 isdn_getrev(const char *revision)
index 082735d..9a471f6 100644 (file)
@@ -29,19 +29,19 @@ extern void isdn_lock_drivers(void);
 extern void isdn_unlock_drivers(void);
 extern void isdn_free_channel(int di, int ch, int usage);
 extern void isdn_all_eaz(int di, int ch);
-extern int  isdn_command(isdn_ctrl *);
-extern int  isdn_dc2minor(int di, int ch);
+extern int isdn_command(isdn_ctrl *);
+extern int isdn_dc2minor(int di, int ch);
 extern void isdn_info_update(void);
 extern char *isdn_map_eaz2msn(char *msn, int di);
 extern void isdn_timer_ctrl(int tf, int onoff);
 extern void isdn_unexclusive_channel(int di, int ch);
-extern int  isdn_getnum(char **);
-extern int  isdn_readbchan(int, int, u_char *, u_char *, int, wait_queue_head_t *);
-extern int  isdn_readbchan_tty(int, int, struct tty_struct *, int);
-extern int  isdn_get_free_channel(int, int, int, int, int, char *);
-extern int  isdn_writebuf_skb_stub(int, int, int, struct sk_buff *);
-extern int  register_isdn(isdn_if * i);
-extern int  isdn_msncmp( const char *,  const char *);
+extern int isdn_getnum(char **);
+extern int isdn_readbchan(int, int, u_char *, u_char *, int, wait_queue_head_t *);
+extern int isdn_readbchan_tty(int, int, struct tty_struct *, int);
+extern int isdn_get_free_channel(int, int, int, int, int, char *);
+extern int isdn_writebuf_skb_stub(int, int, int, struct sk_buff *);
+extern int register_isdn(isdn_if *i);
+extern int isdn_msncmp(const char *,  const char *);
 #if defined(ISDN_DEBUG_NET_DUMP) || defined(ISDN_DEBUG_MODEM_DUMP)
 extern void isdn_dumppkt(char *, u_char *, int, int);
 #endif
index d568689..91d5730 100644 (file)
@@ -1,5 +1,5 @@
 /* $Id: isdn_concap.c,v 1.1.2.2 2004/01/12 22:37:19 keil Exp $
- * 
+ *
  * Linux ISDN subsystem, protocol encapsulation
  *
  * This software may be used and distributed according to the terms
    protocols that require for reliable datalink semantics. That means:
 
    - before any data is to be submitted the connection must explicitly
-     be set up.
+   be set up.
    - after the successful set up of the connection is signalled the
-     connection is considered to be reliably up.
+   connection is considered to be reliably up.
 
-   Auto-dialing ist not compatible with this requirements. Thus, auto-dialing 
+   Auto-dialing ist not compatible with this requirements. Thus, auto-dialing
    is completely bypassed.
 
    It might be possible to implement a (non standardized) datalink protocol
    that provides a reliable data link service while using some auto dialing
    mechanism. Such a protocol would need an auxiliary channel (i.e. user-user-
    signaling on the D-channel) while the B-channel is down.
-   */
+*/
 
 
 static int isdn_concap_dl_data_req(struct concap_proto *concap, struct sk_buff *skb)
 {
-       struct net_device *ndev = concap -> net_dev;
+       struct net_device *ndev = concap->net_dev;
        isdn_net_dev *nd = ((isdn_net_local *) netdev_priv(ndev))->netdev;
        isdn_net_local *lp = isdn_net_get_locked_lp(nd);
 
-       IX25DEBUG( "isdn_concap_dl_data_req: %s \n", concap->net_dev->name);
+       IX25DEBUG("isdn_concap_dl_data_req: %s \n", concap->net_dev->name);
        if (!lp) {
-               IX25DEBUG( "isdn_concap_dl_data_req: %s : isdn_net_send_skb returned %d\n", concap -> net_dev -> name, 1);
+               IX25DEBUG("isdn_concap_dl_data_req: %s : isdn_net_send_skb returned %d\n", concap->net_dev->name, 1);
                return 1;
        }
        lp->huptimer = 0;
        isdn_net_writebuf_skb(lp, skb);
        spin_unlock_bh(&lp->xmit_lock);
-       IX25DEBUG( "isdn_concap_dl_data_req: %s : isdn_net_send_skb returned %d\n", concap -> net_dev -> name, 0);
+       IX25DEBUG("isdn_concap_dl_data_req: %s : isdn_net_send_skb returned %d\n", concap->net_dev->name, 0);
        return 0;
 }
 
 
 static int isdn_concap_dl_connect_req(struct concap_proto *concap)
 {
-       struct net_device *ndev = concap -> net_dev;
+       struct net_device *ndev = concap->net_dev;
        isdn_net_local *lp = netdev_priv(ndev);
        int ret;
-       IX25DEBUG( "isdn_concap_dl_connect_req: %s \n", ndev -> name);
+       IX25DEBUG("isdn_concap_dl_connect_req: %s \n", ndev->name);
 
        /* dial ... */
-       ret = isdn_net_dial_req( lp );
-       if ( ret ) IX25DEBUG("dialing failed\n");
+       ret = isdn_net_dial_req(lp);
+       if (ret) IX25DEBUG("dialing failed\n");
        return ret;
 }
 
 static int isdn_concap_dl_disconn_req(struct concap_proto *concap)
 {
-       IX25DEBUG( "isdn_concap_dl_disconn_req: %s \n", concap -> net_dev -> name);
+       IX25DEBUG("isdn_concap_dl_disconn_req: %s \n", concap->net_dev->name);
 
-       isdn_net_hangup( concap -> net_dev );
+       isdn_net_hangup(concap->net_dev);
        return 0;
 }
 
@@ -88,10 +88,10 @@ struct concap_device_ops isdn_concap_reliable_dl_dops = {
 /* The following should better go into a dedicated source file such that
    this sourcefile does not need to include any protocol specific header
    files. For now:
-   */
-struct concap_proto * isdn_concap_new( int encap )
+*/
+struct concap_proto *isdn_concap_new(int encap)
 {
-       switch ( encap ) {
+       switch (encap) {
        case ISDN_NET_ENCAP_X25IFACE:
                return isdn_x25iface_proto_new();
        }
index 6ac7e04..cd7e3ba 100644 (file)
@@ -8,6 +8,4 @@
  */
 
 extern struct concap_device_ops isdn_concap_reliable_dl_dops;
-extern struct concap_proto * isdn_concap_new( int );
-
-
+extern struct concap_proto *isdn_concap_new(int);
index 802ab87..babc621 100644 (file)
@@ -9,7 +9,7 @@
  * This software may be used and distributed according to the terms
  * of the GNU General Public License, incorporated herein by reference.
  *
- * Data Over Voice (DOV) support added - Guy Ellis 23-Mar-02 
+ * Data Over Voice (DOV) support added - Guy Ellis 23-Mar-02
  *                                       guy@traverse.com.au
  * Outgoing calls - looks for a 'V' in first char of dialed number
  * Incoming calls - checks first character of eaz as follows:
@@ -18,7 +18,7 @@
  *   'B'     - accept BOTH DATA and DOV types
  *
  * Jan 2001: fix CISCO HDLC      Bjoern A. Zeeb <i4l@zabbadoz.net>
- *           for info on the protocol, see 
+ *           for info on the protocol, see
  *           http://i4l.zabbadoz.net/i4l/cisco-hdlc.txt
  */
 
@@ -40,7 +40,7 @@
 
 
 /*
- * Outline of new tbusy handling: 
+ * Outline of new tbusy handling:
  *
  * Old method, roughly spoken, consisted of setting tbusy when entering
  * isdn_net_start_xmit() and at several other locations and clearing
  * Most of the changes were pretty obvious and basically done by HE already.
  *
  * One problem of the isdn net device code is that is uses struct net_device
- * for masters and slaves. However, only master interface are registered to 
- * the network layer, and therefore, it only makes sense to call netif_* 
+ * for masters and slaves. However, only master interface are registered to
+ * the network layer, and therefore, it only makes sense to call netif_*
  * functions on them.
  *
  * --KG
  */
 
-/* 
+/*
  * Find out if the netdevice has been ifup-ed yet.
  * For slaves, look at the corresponding master.
  */
@@ -74,8 +74,8 @@ static __inline__ int isdn_net_device_started(isdn_net_dev *n)
 {
        isdn_net_local *lp = n->local;
        struct net_device *dev;
-       
-       if (lp->master) 
+
+       if (lp->master)
                dev = lp->master;
        else
                dev = n->dev;
@@ -88,7 +88,7 @@ static __inline__ int isdn_net_device_started(isdn_net_dev *n)
  */
 static __inline__ void isdn_net_device_wake_queue(isdn_net_local *lp)
 {
-       if (lp->master) 
+       if (lp->master)
                netif_wake_queue(lp->master);
        else
                netif_wake_queue(lp->netdev->dev);
@@ -108,7 +108,7 @@ static __inline__ void isdn_net_device_stop_queue(isdn_net_local *lp)
 
 /*
  * find out if the net_device which this lp belongs to (lp can be
- * master or slave) is busy. It's busy iff all (master and slave) 
+ * master or slave) is busy. It's busy iff all (master and slave)
  * queues are busy
  */
 static __inline__ int isdn_net_device_busy(isdn_net_local *lp)
@@ -124,7 +124,7 @@ static __inline__ int isdn_net_device_busy(isdn_net_local *lp)
                nd = ISDN_MASTER_PRIV(lp)->netdev;
        else
                nd = lp->netdev;
-       
+
        spin_lock_irqsave(&nd->queue_lock, flags);
        nlp = lp->next;
        while (nlp != lp) {
@@ -155,7 +155,7 @@ static __inline__ void isdn_net_dec_frame_cnt(isdn_net_local *lp)
                } else {
                        isdn_net_device_wake_queue(lp);
                }
-       }                                                                      
+       }
 }
 
 static __inline__ void isdn_net_zero_frame_cnt(isdn_net_local *lp)
@@ -163,36 +163,36 @@ static __inline__ void isdn_net_zero_frame_cnt(isdn_net_local *lp)
        atomic_set(&lp->frame_cnt, 0);
 }
 
-/* For 2.2.x we leave the transmitter busy timeout at 2 secs, just 
+/* For 2.2.x we leave the transmitter busy timeout at 2 secs, just
  * to be safe.
  * For 2.3.x we push it up to 20 secs, because call establishment
- * (in particular callback) may take such a long time, and we 
+ * (in particular callback) may take such a long time, and we
  * don't want confusing messages in the log. However, there is a slight
  * possibility that this large timeout will break other things like MPPP,
  * which might rely on the tx timeout. If so, we'll find out this way...
  */
 
-#define ISDN_NET_TX_TIMEOUT (20*HZ) 
+#define ISDN_NET_TX_TIMEOUT (20 * HZ)
 
 /* Prototypes */
 
 static int isdn_net_force_dial_lp(isdn_net_local *);
 static netdev_tx_t isdn_net_start_xmit(struct sk_buff *,
-                                            struct net_device *);
+                                      struct net_device *);
 
 static void isdn_net_ciscohdlck_connected(isdn_net_local *lp);
 static void isdn_net_ciscohdlck_disconnected(isdn_net_local *lp);
 
 char *isdn_net_revision = "$Revision: 1.1.2.2 $";
 
- /*
-  * Code for raw-networking over ISDN
-  */
+/*
+ * Code for raw-networking over ISDN
+ */
 
 static void
 isdn_net_unreachable(struct net_device *dev, struct sk_buff *skb, char *reason)
 {
-       if(skb) {
+       if (skb) {
 
                u_short proto = ntohs(skb->protocol);
 
@@ -200,13 +200,13 @@ isdn_net_unreachable(struct net_device *dev, struct sk_buff *skb, char *reason)
                       dev->name,
                       (reason != NULL) ? reason : "unknown",
                       (proto != ETH_P_IP) ? "Protocol != ETH_P_IP" : "");
-               
+
                dst_link_failure(skb);
        }
        else {  /* dial not triggered by rawIP packet */
                printk(KERN_DEBUG "isdn_net: %s: %s\n",
-                          dev->name,
-                          (reason != NULL) ? reason : "reason unknown");
+                      dev->name,
+                      (reason != NULL) ? reason : "reason unknown");
        }
 }
 
@@ -214,14 +214,14 @@ static void
 isdn_net_reset(struct net_device *dev)
 {
 #ifdef CONFIG_ISDN_X25
-       struct concap_device_ops * dops =
-               ((isdn_net_local *) netdev_priv(dev))->dops;
-       struct concap_proto * cprot =
-               ((isdn_net_local *) netdev_priv(dev))->netdev->cprot;
+       struct concap_device_ops *dops =
+               ((isdn_net_local *)netdev_priv(dev))->dops;
+       struct concap_proto *cprot =
+               ((isdn_net_local *)netdev_priv(dev))->netdev->cprot;
 #endif
 #ifdef CONFIG_ISDN_X25
-       if( cprot && cprot -> pops && dops )
-               cprot -> pops -> restart ( cprot, dev, dops );
+       if (cprot && cprot->pops && dops)
+               cprot->pops->restart(cprot, dev, dops);
 #endif
 }
 
@@ -248,7 +248,7 @@ isdn_net_open(struct net_device *dev)
                 */
                struct in_ifaddr *ifa = in_dev->ifa_list;
                if (ifa != NULL)
-                       memcpy(dev->dev_addr+2, &ifa->ifa_local, 4);
+                       memcpy(dev->dev_addr + 2, &ifa->ifa_local, 4);
        }
 
        /* If this interface has slaves, start them also */
@@ -267,7 +267,7 @@ isdn_net_open(struct net_device *dev)
  * Assign an ISDN-channel to a net-interface
  */
 static void
-isdn_net_bind_channel(isdn_net_local * lp, int idx)
+isdn_net_bind_channel(isdn_net_local *lp, int idx)
 {
        lp->flags |= ISDN_NET_CONNECTED;
        lp->isdn_device = dev->drvmap[idx];
@@ -280,7 +280,7 @@ isdn_net_bind_channel(isdn_net_local * lp, int idx)
  * unbind a net-interface (resets interface after an error)
  */
 static void
-isdn_net_unbind_channel(isdn_net_local * lp)
+isdn_net_unbind_channel(isdn_net_local *lp)
 {
        skb_queue_purge(&lp->super_tx_queue);
 
@@ -288,7 +288,7 @@ isdn_net_unbind_channel(isdn_net_local * lp)
                /* Moral equivalent of dev_purge_queues():
                   BEWARE! This chunk of code cannot be called from hardware
                   interrupt handler. I hope it is true. --ANK
-                */
+               */
                qdisc_reset_all_tx(lp->netdev->dev);
        }
        lp->dialstate = 0;
@@ -368,7 +368,7 @@ isdn_net_autohup(void)
                                        isdn_net_hangup(p->dev);
                        }
 
-                       if(dev->global_flags & ISDN_GLOBAL_STOPPED || (ISDN_NET_DIALMODE(*l) == ISDN_NET_DM_OFF)) {
+                       if (dev->global_flags & ISDN_GLOBAL_STOPPED || (ISDN_NET_DIALMODE(*l) == ISDN_NET_DM_OFF)) {
                                isdn_net_hangup(p->dev);
                                break;
                        }
@@ -403,143 +403,143 @@ isdn_net_stat_callback(int idx, isdn_ctrl *c)
                struct concap_proto_ops *pops = cprot ? cprot->pops : NULL;
 #endif
                switch (cmd) {
-                       case ISDN_STAT_BSENT:
-                               /* A packet has successfully been sent out */
-                               if ((lp->flags & ISDN_NET_CONNECTED) &&
-                                   (!lp->dialstate)) {
-                                       isdn_net_dec_frame_cnt(lp);
-                                       lp->stats.tx_packets++;
-                                       lp->stats.tx_bytes += c->parm.length;
-                               }
+               case ISDN_STAT_BSENT:
+                       /* A packet has successfully been sent out */
+                       if ((lp->flags & ISDN_NET_CONNECTED) &&
+                           (!lp->dialstate)) {
+                               isdn_net_dec_frame_cnt(lp);
+                               lp->stats.tx_packets++;
+                               lp->stats.tx_bytes += c->parm.length;
+                       }
+                       return 1;
+               case ISDN_STAT_DCONN:
+                       /* D-Channel is up */
+                       switch (lp->dialstate) {
+                       case 4:
+                       case 7:
+                       case 8:
+                               lp->dialstate++;
                                return 1;
-                       case ISDN_STAT_DCONN:
-                               /* D-Channel is up */
-                               switch (lp->dialstate) {
-                                       case 4:
-                                       case 7:
-                                       case 8:
-                                               lp->dialstate++;
-                                               return 1;
-                                       case 12:
-                                               lp->dialstate = 5;
-                                               return 1;
-                               }
-                               break;
-                       case ISDN_STAT_DHUP:
-                               /* Either D-Channel-hangup or error during dialout */
+                       case 12:
+                               lp->dialstate = 5;
+                               return 1;
+                       }
+                       break;
+               case ISDN_STAT_DHUP:
+                       /* Either D-Channel-hangup or error during dialout */
 #ifdef CONFIG_ISDN_X25
-                               /* If we are not connencted then dialing had
-                                  failed. If there are generic encap protocol
-                                  receiver routines signal the closure of
-                                  the link*/
-
-                               if( !(lp->flags & ISDN_NET_CONNECTED)
-                                   && pops && pops -> disconn_ind )
-                                       pops -> disconn_ind(cprot);
+                       /* If we are not connencted then dialing had
+                          failed. If there are generic encap protocol
+                          receiver routines signal the closure of
+                          the link*/
+
+                       if (!(lp->flags & ISDN_NET_CONNECTED)
+                           && pops && pops->disconn_ind)
+                               pops->disconn_ind(cprot);
 #endif /* CONFIG_ISDN_X25 */
-                               if ((!lp->dialstate) && (lp->flags & ISDN_NET_CONNECTED)) {
-                                       if (lp->p_encap == ISDN_NET_ENCAP_CISCOHDLCK)
-                                               isdn_net_ciscohdlck_disconnected(lp);
+                       if ((!lp->dialstate) && (lp->flags & ISDN_NET_CONNECTED)) {
+                               if (lp->p_encap == ISDN_NET_ENCAP_CISCOHDLCK)
+                                       isdn_net_ciscohdlck_disconnected(lp);
 #ifdef CONFIG_ISDN_PPP
-                                       if (lp->p_encap == ISDN_NET_ENCAP_SYNCPPP)
-                                               isdn_ppp_free(lp);
+                               if (lp->p_encap == ISDN_NET_ENCAP_SYNCPPP)
+                                       isdn_ppp_free(lp);
 #endif
-                                       isdn_net_lp_disconnected(lp);
-                                       isdn_all_eaz(lp->isdn_device, lp->isdn_channel);
-                                       printk(KERN_INFO "%s: remote hangup\n", p->dev->name);
-                                       printk(KERN_INFO "%s: Chargesum is %d\n", p->dev->name,
-                                              lp->charge);
-                                       isdn_net_unbind_channel(lp);
-                                       return 1;
-                               }
-                               break;
+                               isdn_net_lp_disconnected(lp);
+                               isdn_all_eaz(lp->isdn_device, lp->isdn_channel);
+                               printk(KERN_INFO "%s: remote hangup\n", p->dev->name);
+                               printk(KERN_INFO "%s: Chargesum is %d\n", p->dev->name,
+                                      lp->charge);
+                               isdn_net_unbind_channel(lp);
+                               return 1;
+                       }
+                       break;
 #ifdef CONFIG_ISDN_X25
-                       case ISDN_STAT_BHUP:
-                               /* B-Channel-hangup */
-                               /* try if there are generic encap protocol
-                                  receiver routines and signal the closure of
-                                  the link */
-                               if( pops  &&  pops -> disconn_ind ){
-                                               pops -> disconn_ind(cprot);
-                                               return 1;
-                                       }
-                               break;
+               case ISDN_STAT_BHUP:
+                       /* B-Channel-hangup */
+                       /* try if there are generic encap protocol
+                          receiver routines and signal the closure of
+                          the link */
+                       if (pops && pops->disconn_ind) {
+                               pops->disconn_ind(cprot);
+                               return 1;
+                       }
+                       break;
 #endif /* CONFIG_ISDN_X25 */
-                       case ISDN_STAT_BCONN:
-                               /* B-Channel is up */
-                               isdn_net_zero_frame_cnt(lp);
-                               switch (lp->dialstate) {
-                                       case 5:
-                                       case 6:
-                                       case 7:
-                                       case 8:
-                                       case 9:
-                                       case 10:
-                                       case 12:
-                                               if (lp->dialstate <= 6) {
-                                                       dev->usage[idx] |= ISDN_USAGE_OUTGOING;
-                                                       isdn_info_update();
-                                               } else
-                                                       dev->rx_netdev[idx] = p;
-                                               lp->dialstate = 0;
-                                               isdn_timer_ctrl(ISDN_TIMER_NETHANGUP, 1);
-                                               if (lp->p_encap == ISDN_NET_ENCAP_CISCOHDLCK)
-                                                       isdn_net_ciscohdlck_connected(lp);
-                                               if (lp->p_encap != ISDN_NET_ENCAP_SYNCPPP) {
-                                                       if (lp->master) { /* is lp a slave? */
-                                                               isdn_net_dev *nd = ISDN_MASTER_PRIV(lp)->netdev;
-                                                               isdn_net_add_to_bundle(nd, lp);
-                                                       }
-                                               }
-                                               printk(KERN_INFO "isdn_net: %s connected\n", p->dev->name);
-                                               /* If first Chargeinfo comes before B-Channel connect,
-                                                * we correct the timestamp here.
-                                                */
-                                               lp->chargetime = jiffies;
+               case ISDN_STAT_BCONN:
+                       /* B-Channel is up */
+                       isdn_net_zero_frame_cnt(lp);
+                       switch (lp->dialstate) {
+                       case 5:
+                       case 6:
+                       case 7:
+                       case 8:
+                       case 9:
+                       case 10:
+                       case 12:
+                               if (lp->dialstate <= 6) {
+                                       dev->usage[idx] |= ISDN_USAGE_OUTGOING;
+                                       isdn_info_update();
+                               } else
+                                       dev->rx_netdev[idx] = p;
+                               lp->dialstate = 0;
+                               isdn_timer_ctrl(ISDN_TIMER_NETHANGUP, 1);
+                               if (lp->p_encap == ISDN_NET_ENCAP_CISCOHDLCK)
+                                       isdn_net_ciscohdlck_connected(lp);
+                               if (lp->p_encap != ISDN_NET_ENCAP_SYNCPPP) {
+                                       if (lp->master) { /* is lp a slave? */
+                                               isdn_net_dev *nd = ISDN_MASTER_PRIV(lp)->netdev;
+                                               isdn_net_add_to_bundle(nd, lp);
+                                       }
+                               }
+                               printk(KERN_INFO "isdn_net: %s connected\n", p->dev->name);
+                               /* If first Chargeinfo comes before B-Channel connect,
+                                * we correct the timestamp here.
+                                */
+                               lp->chargetime = jiffies;
 
-                                               /* reset dial-timeout */
-                                               lp->dialstarted = 0;
-                                               lp->dialwait_timer = 0;
+                               /* reset dial-timeout */
+                               lp->dialstarted = 0;
+                               lp->dialwait_timer = 0;
 
 #ifdef CONFIG_ISDN_PPP
-                                               if (lp->p_encap == ISDN_NET_ENCAP_SYNCPPP)
-                                                       isdn_ppp_wakeup_daemon(lp);
+                               if (lp->p_encap == ISDN_NET_ENCAP_SYNCPPP)
+                                       isdn_ppp_wakeup_daemon(lp);
 #endif
 #ifdef CONFIG_ISDN_X25
-                                               /* try if there are generic concap receiver routines */
-                                               if( pops )
-                                                       if( pops->connect_ind)
-                                                               pops->connect_ind(cprot);
+                               /* try if there are generic concap receiver routines */
+                               if (pops)
+                                       if (pops->connect_ind)
+                                               pops->connect_ind(cprot);
 #endif /* CONFIG_ISDN_X25 */
-                                               /* ppp needs to do negotiations first */
-                                               if (lp->p_encap != ISDN_NET_ENCAP_SYNCPPP)
-                                                       isdn_net_device_wake_queue(lp);
-                                               return 1;
-                               }
-                               break;
-                       case ISDN_STAT_NODCH:
-                               /* No D-Channel avail. */
-                               if (lp->dialstate == 4) {
-                                       lp->dialstate--;
-                                       return 1;
-                               }
-                               break;
-                       case ISDN_STAT_CINF:
-                               /* Charge-info from TelCo. Calculate interval between
-                                * charge-infos and set timestamp for last info for
-                                * usage by isdn_net_autohup()
-                                */
-                               lp->charge++;
-                               if (lp->hupflags & ISDN_HAVECHARGE) {
-                                       lp->hupflags &= ~ISDN_WAITCHARGE;
-                                       lp->chargeint = jiffies - lp->chargetime - (2 * HZ);
-                               }
-                               if (lp->hupflags & ISDN_WAITCHARGE)
-                                       lp->hupflags |= ISDN_HAVECHARGE;
-                               lp->chargetime = jiffies;
-                               printk(KERN_DEBUG "isdn_net: Got CINF chargetime of %s now %lu\n",
-                                      p->dev->name, lp->chargetime);
+                               /* ppp needs to do negotiations first */
+                               if (lp->p_encap != ISDN_NET_ENCAP_SYNCPPP)
+                                       isdn_net_device_wake_queue(lp);
                                return 1;
+                       }
+                       break;
+               case ISDN_STAT_NODCH:
+                       /* No D-Channel avail. */
+                       if (lp->dialstate == 4) {
+                               lp->dialstate--;
+                               return 1;
+                       }
+                       break;
+               case ISDN_STAT_CINF:
+                       /* Charge-info from TelCo. Calculate interval between
+                        * charge-infos and set timestamp for last info for
+                        * usage by isdn_net_autohup()
+                        */
+                       lp->charge++;
+                       if (lp->hupflags & ISDN_HAVECHARGE) {
+                               lp->hupflags &= ~ISDN_WAITCHARGE;
+                               lp->chargeint = jiffies - lp->chargetime - (2 * HZ);
+                       }
+                       if (lp->hupflags & ISDN_WAITCHARGE)
+                               lp->hupflags |= ISDN_HAVECHARGE;
+                       lp->chargetime = jiffies;
+                       printk(KERN_DEBUG "isdn_net: Got CINF chargetime of %s now %lu\n",
+                              p->dev->name, lp->chargetime);
+                       return 1;
                }
        }
        return 0;
@@ -562,7 +562,7 @@ isdn_net_dial(void)
        int anymore = 0;
        int i;
        isdn_ctrl cmd;
-        u_char *phone_number;
+       u_char *phone_number;
 
        while (p) {
                isdn_net_local *lp = p->local;
@@ -572,249 +572,249 @@ isdn_net_dial(void)
                        printk(KERN_DEBUG "%s: dialstate=%d\n", p->dev->name, lp->dialstate);
 #endif
                switch (lp->dialstate) {
-                       case 0:
-                               /* Nothing to do for this interface */
+               case 0:
+                       /* Nothing to do for this interface */
+                       break;
+               case 1:
+                       /* Initiate dialout. Set phone-number-pointer to first number
+                        * of interface.
+                        */
+                       lp->dial = lp->phone[1];
+                       if (!lp->dial) {
+                               printk(KERN_WARNING "%s: phone number deleted?\n",
+                                      p->dev->name);
+                               isdn_net_hangup(p->dev);
                                break;
-                       case 1:
-                               /* Initiate dialout. Set phone-number-pointer to first number
-                                * of interface.
-                                */
-                               lp->dial = lp->phone[1];
-                               if (!lp->dial) {
-                                       printk(KERN_WARNING "%s: phone number deleted?\n",
-                                              p->dev->name);
-                                       isdn_net_hangup(p->dev);
-                                       break;
+                       }
+                       anymore = 1;
+
+                       if (lp->dialtimeout > 0)
+                               if (lp->dialstarted == 0 || time_after(jiffies, lp->dialstarted + lp->dialtimeout + lp->dialwait)) {
+                                       lp->dialstarted = jiffies;
+                                       lp->dialwait_timer = 0;
                                }
-                               anymore = 1;
 
-                               if(lp->dialtimeout > 0)
-                                       if(lp->dialstarted == 0 || time_after(jiffies, lp->dialstarted + lp->dialtimeout + lp->dialwait)) {
-                                               lp->dialstarted = jiffies;
-                                               lp->dialwait_timer = 0;
+                       lp->dialstate++;
+                       /* Fall through */
+               case 2:
+                       /* Prepare dialing. Clear EAZ, then set EAZ. */
+                       cmd.driver = lp->isdn_device;
+                       cmd.arg = lp->isdn_channel;
+                       cmd.command = ISDN_CMD_CLREAZ;
+                       isdn_command(&cmd);
+                       sprintf(cmd.parm.num, "%s", isdn_map_eaz2msn(lp->msn, cmd.driver));
+                       cmd.command = ISDN_CMD_SETEAZ;
+                       isdn_command(&cmd);
+                       lp->dialretry = 0;
+                       anymore = 1;
+                       lp->dialstate++;
+                       /* Fall through */
+               case 3:
+                       /* Setup interface, dial current phone-number, switch to next number.
+                        * If list of phone-numbers is exhausted, increment
+                        * retry-counter.
+                        */
+                       if (dev->global_flags & ISDN_GLOBAL_STOPPED || (ISDN_NET_DIALMODE(*lp) == ISDN_NET_DM_OFF)) {
+                               char *s;
+                               if (dev->global_flags & ISDN_GLOBAL_STOPPED)
+                                       s = "dial suppressed: isdn system stopped";
+                               else
+                                       s = "dial suppressed: dialmode `off'";
+                               isdn_net_unreachable(p->dev, NULL, s);
+                               isdn_net_hangup(p->dev);
+                               break;
+                       }
+                       cmd.driver = lp->isdn_device;
+                       cmd.command = ISDN_CMD_SETL2;
+                       cmd.arg = lp->isdn_channel + (lp->l2_proto << 8);
+                       isdn_command(&cmd);
+                       cmd.driver = lp->isdn_device;
+                       cmd.command = ISDN_CMD_SETL3;
+                       cmd.arg = lp->isdn_channel + (lp->l3_proto << 8);
+                       isdn_command(&cmd);
+                       cmd.driver = lp->isdn_device;
+                       cmd.arg = lp->isdn_channel;
+                       if (!lp->dial) {
+                               printk(KERN_WARNING "%s: phone number deleted?\n",
+                                      p->dev->name);
+                               isdn_net_hangup(p->dev);
+                               break;
+                       }
+                       if (!strncmp(lp->dial->num, "LEASED", strlen("LEASED"))) {
+                               lp->dialstate = 4;
+                               printk(KERN_INFO "%s: Open leased line ...\n", p->dev->name);
+                       } else {
+                               if (lp->dialtimeout > 0)
+                                       if (time_after(jiffies, lp->dialstarted + lp->dialtimeout)) {
+                                               lp->dialwait_timer = jiffies + lp->dialwait;
+                                               lp->dialstarted = 0;
+                                               isdn_net_unreachable(p->dev, NULL, "dial: timed out");
+                                               isdn_net_hangup(p->dev);
+                                               break;
                                        }
 
-                               lp->dialstate++;
-                               /* Fall through */
-                       case 2:
-                               /* Prepare dialing. Clear EAZ, then set EAZ. */
-                               cmd.driver = lp->isdn_device;
-                               cmd.arg = lp->isdn_channel;
-                               cmd.command = ISDN_CMD_CLREAZ;
-                               isdn_command(&cmd);
-                               sprintf(cmd.parm.num, "%s", isdn_map_eaz2msn(lp->msn, cmd.driver));
-                               cmd.command = ISDN_CMD_SETEAZ;
-                               isdn_command(&cmd);
-                               lp->dialretry = 0;
-                               anymore = 1;
-                               lp->dialstate++;
-                               /* Fall through */
-                       case 3:
-                               /* Setup interface, dial current phone-number, switch to next number.
-                                * If list of phone-numbers is exhausted, increment
-                                * retry-counter.
-                                */
-                               if(dev->global_flags & ISDN_GLOBAL_STOPPED || (ISDN_NET_DIALMODE(*lp) == ISDN_NET_DM_OFF)) {
-                                       char *s;
-                                       if (dev->global_flags & ISDN_GLOBAL_STOPPED)
-                                               s = "dial suppressed: isdn system stopped";
-                                       else
-                                               s = "dial suppressed: dialmode `off'";
-                                       isdn_net_unreachable(p->dev, NULL, s);
-                                       isdn_net_hangup(p->dev);
-                                       break;
-                               }
-                               cmd.driver = lp->isdn_device;
-                               cmd.command = ISDN_CMD_SETL2;
-                               cmd.arg = lp->isdn_channel + (lp->l2_proto << 8);
-                               isdn_command(&cmd);
-                               cmd.driver = lp->isdn_device;
-                               cmd.command = ISDN_CMD_SETL3;
-                               cmd.arg = lp->isdn_channel + (lp->l3_proto << 8);
-                               isdn_command(&cmd);
                                cmd.driver = lp->isdn_device;
-                               cmd.arg = lp->isdn_channel;
-                               if (!lp->dial) {
-                                       printk(KERN_WARNING "%s: phone number deleted?\n",
-                                              p->dev->name);
-                                       isdn_net_hangup(p->dev);
-                                       break;
+                               cmd.command = ISDN_CMD_DIAL;
+                               cmd.parm.setup.si2 = 0;
+
+                               /* check for DOV */
+                               phone_number = lp->dial->num;
+                               if ((*phone_number == 'v') ||
+                                   (*phone_number == 'V')) { /* DOV call */
+                                       cmd.parm.setup.si1 = 1;
+                               } else { /* DATA call */
+                                       cmd.parm.setup.si1 = 7;
                                }
-                               if (!strncmp(lp->dial->num, "LEASED", strlen("LEASED"))) {
-                                       lp->dialstate = 4;
-                                       printk(KERN_INFO "%s: Open leased line ...\n", p->dev->name);
-                               } else {
-                                       if(lp->dialtimeout > 0)
-                                               if (time_after(jiffies, lp->dialstarted + lp->dialtimeout)) {
-                                                       lp->dialwait_timer = jiffies + lp->dialwait;
-                                                       lp->dialstarted = 0;
-                                                       isdn_net_unreachable(p->dev, NULL, "dial: timed out");
-                                                       isdn_net_hangup(p->dev);
-                                                       break;
-                                               }
 
-                                       cmd.driver = lp->isdn_device;
-                                       cmd.command = ISDN_CMD_DIAL;
-                                       cmd.parm.setup.si2 = 0;
-
-                                        /* check for DOV */
-                                        phone_number = lp->dial->num;
-                                        if ((*phone_number == 'v') ||
-                                           (*phone_number == 'V')) { /* DOV call */
-                                                cmd.parm.setup.si1 = 1;
-                                        } else { /* DATA call */
-                                                cmd.parm.setup.si1 = 7;
-                                       }
+                               strcpy(cmd.parm.setup.phone, phone_number);
+                               /*
+                                * Switch to next number or back to start if at end of list.
+                                */
+                               if (!(lp->dial = (isdn_net_phone *) lp->dial->next)) {
+                                       lp->dial = lp->phone[1];
+                                       lp->dialretry++;
 
-                                       strcpy(cmd.parm.setup.phone, phone_number);
-                                       /*
-                                        * Switch to next number or back to start if at end of list.
-                                        */
-                                       if (!(lp->dial = (isdn_net_phone *) lp->dial->next)) {
-                                               lp->dial = lp->phone[1];
-                                               lp->dialretry++;
-
-                                               if (lp->dialretry > lp->dialmax) {
-                                                       if (lp->dialtimeout == 0) {
-                                                               lp->dialwait_timer = jiffies + lp->dialwait;
-                                                               lp->dialstarted = 0;
-                                                               isdn_net_unreachable(p->dev, NULL, "dial: tried all numbers dialmax times");
-                                                       }
-                                                       isdn_net_hangup(p->dev);
-                                                       break;
+                                       if (lp->dialretry > lp->dialmax) {
+                                               if (lp->dialtimeout == 0) {
+                                                       lp->dialwait_timer = jiffies + lp->dialwait;
+                                                       lp->dialstarted = 0;
+                                                       isdn_net_unreachable(p->dev, NULL, "dial: tried all numbers dialmax times");
                                                }
+                                               isdn_net_hangup(p->dev);
+                                               break;
                                        }
-                                       sprintf(cmd.parm.setup.eazmsn, "%s",
-                                               isdn_map_eaz2msn(lp->msn, cmd.driver));
-                                       i = isdn_dc2minor(lp->isdn_device, lp->isdn_channel);
-                                       if (i >= 0) {
-                                               strcpy(dev->num[i], cmd.parm.setup.phone);
-                                               dev->usage[i] |= ISDN_USAGE_OUTGOING;
-                                               isdn_info_update();
-                                       }
-                                       printk(KERN_INFO "%s: dialing %d %s... %s\n", p->dev->name,
-                                              lp->dialretry, cmd.parm.setup.phone,
-                                              (cmd.parm.setup.si1 == 1) ? "DOV" : "");
-                                       lp->dtimer = 0;
-#ifdef ISDN_DEBUG_NET_DIAL
-                                       printk(KERN_DEBUG "dial: d=%d c=%d\n", lp->isdn_device,
-                                              lp->isdn_channel);
-#endif
-                                       isdn_command(&cmd);
                                }
-                               lp->huptimer = 0;
-                               lp->outgoing = 1;
-                               if (lp->chargeint) {
-                                       lp->hupflags |= ISDN_HAVECHARGE;
-                                       lp->hupflags &= ~ISDN_WAITCHARGE;
-                               } else {
-                                       lp->hupflags |= ISDN_WAITCHARGE;
-                                       lp->hupflags &= ~ISDN_HAVECHARGE;
+                               sprintf(cmd.parm.setup.eazmsn, "%s",
+                                       isdn_map_eaz2msn(lp->msn, cmd.driver));
+                               i = isdn_dc2minor(lp->isdn_device, lp->isdn_channel);
+                               if (i >= 0) {
+                                       strcpy(dev->num[i], cmd.parm.setup.phone);
+                                       dev->usage[i] |= ISDN_USAGE_OUTGOING;
+                                       isdn_info_update();
                                }
-                               anymore = 1;
-                               lp->dialstate =
-                                   (lp->cbdelay &&
-                                    (lp->flags & ISDN_NET_CBOUT)) ? 12 : 4;
-                               break;
-                       case 4:
-                               /* Wait for D-Channel-connect.
-                                * If timeout, switch back to state 3.
-                                * Dialmax-handling moved to state 3.
-                                */
-                               if (lp->dtimer++ > ISDN_TIMER_DTIMEOUT10)
-                                       lp->dialstate = 3;
-                               anymore = 1;
-                               break;
-                       case 5:
-                               /* Got D-Channel-Connect, send B-Channel-request */
-                               cmd.driver = lp->isdn_device;
-                               cmd.arg = lp->isdn_channel;
-                               cmd.command = ISDN_CMD_ACCEPTB;
-                               anymore = 1;
+                               printk(KERN_INFO "%s: dialing %d %s... %s\n", p->dev->name,
+                                      lp->dialretry, cmd.parm.setup.phone,
+                                      (cmd.parm.setup.si1 == 1) ? "DOV" : "");
                                lp->dtimer = 0;
-                               lp->dialstate++;
+#ifdef ISDN_DEBUG_NET_DIAL
+                               printk(KERN_DEBUG "dial: d=%d c=%d\n", lp->isdn_device,
+                                      lp->isdn_channel);
+#endif
                                isdn_command(&cmd);
-                               break;
-                       case 6:
-                               /* Wait for B- or D-Channel-connect. If timeout,
-                                * switch back to state 3.
-                                */
+                       }
+                       lp->huptimer = 0;
+                       lp->outgoing = 1;
+                       if (lp->chargeint) {
+                               lp->hupflags |= ISDN_HAVECHARGE;
+                               lp->hupflags &= ~ISDN_WAITCHARGE;
+                       } else {
+                               lp->hupflags |= ISDN_WAITCHARGE;
+                               lp->hupflags &= ~ISDN_HAVECHARGE;
+                       }
+                       anymore = 1;
+                       lp->dialstate =
+                               (lp->cbdelay &&
+                                (lp->flags & ISDN_NET_CBOUT)) ? 12 : 4;
+                       break;
+               case 4:
+                       /* Wait for D-Channel-connect.
+                        * If timeout, switch back to state 3.
+                        * Dialmax-handling moved to state 3.
+                        */
+                       if (lp->dtimer++ > ISDN_TIMER_DTIMEOUT10)
+                               lp->dialstate = 3;
+                       anymore = 1;
+                       break;
+               case 5:
+                       /* Got D-Channel-Connect, send B-Channel-request */
+                       cmd.driver = lp->isdn_device;
+                       cmd.arg = lp->isdn_channel;
+                       cmd.command = ISDN_CMD_ACCEPTB;
+                       anymore = 1;
+                       lp->dtimer = 0;
+                       lp->dialstate++;
+                       isdn_command(&cmd);
+                       break;
+               case 6:
+                       /* Wait for B- or D-Channel-connect. If timeout,
+                        * switch back to state 3.
+                        */
 #ifdef ISDN_DEBUG_NET_DIAL
-                               printk(KERN_DEBUG "dialtimer2: %d\n", lp->dtimer);
+                       printk(KERN_DEBUG "dialtimer2: %d\n", lp->dtimer);
 #endif
-                               if (lp->dtimer++ > ISDN_TIMER_DTIMEOUT10)
-                                       lp->dialstate = 3;
-                               anymore = 1;
-                               break;
-                       case 7:
-                               /* Got incoming Call, setup L2 and L3 protocols,
-                                * then wait for D-Channel-connect
-                                */
+                       if (lp->dtimer++ > ISDN_TIMER_DTIMEOUT10)
+                               lp->dialstate = 3;
+                       anymore = 1;
+                       break;
+               case 7:
+                       /* Got incoming Call, setup L2 and L3 protocols,
+                        * then wait for D-Channel-connect
+                        */
 #ifdef ISDN_DEBUG_NET_DIAL
-                               printk(KERN_DEBUG "dialtimer4: %d\n", lp->dtimer);
+                       printk(KERN_DEBUG "dialtimer4: %d\n", lp->dtimer);
 #endif
-                               cmd.driver = lp->isdn_device;
-                               cmd.command = ISDN_CMD_SETL2;
-                               cmd.arg = lp->isdn_channel + (lp->l2_proto << 8);
-                               isdn_command(&cmd);
-                               cmd.driver = lp->isdn_device;
-                               cmd.command = ISDN_CMD_SETL3;
-                               cmd.arg = lp->isdn_channel + (lp->l3_proto << 8);
-                               isdn_command(&cmd);
-                               if (lp->dtimer++ > ISDN_TIMER_DTIMEOUT15)
-                                       isdn_net_hangup(p->dev);
-                               else {
-                                       anymore = 1;
-                                       lp->dialstate++;
-                               }
-                               break;
-                       case 9:
-                               /* Got incoming D-Channel-Connect, send B-Channel-request */
-                               cmd.driver = lp->isdn_device;
-                               cmd.arg = lp->isdn_channel;
-                               cmd.command = ISDN_CMD_ACCEPTB;
-                               isdn_command(&cmd);
+                       cmd.driver = lp->isdn_device;
+                       cmd.command = ISDN_CMD_SETL2;
+                       cmd.arg = lp->isdn_channel + (lp->l2_proto << 8);
+                       isdn_command(&cmd);
+                       cmd.driver = lp->isdn_device;
+                       cmd.command = ISDN_CMD_SETL3;
+                       cmd.arg = lp->isdn_channel + (lp->l3_proto << 8);
+                       isdn_command(&cmd);
+                       if (lp->dtimer++ > ISDN_TIMER_DTIMEOUT15)
+                               isdn_net_hangup(p->dev);
+                       else {
                                anymore = 1;
-                               lp->dtimer = 0;
                                lp->dialstate++;
-                               break;
-                       case 8:
-                       case 10:
-                               /*  Wait for B- or D-channel-connect */
+                       }
+                       break;
+               case 9:
+                       /* Got incoming D-Channel-Connect, send B-Channel-request */
+                       cmd.driver = lp->isdn_device;
+                       cmd.arg = lp->isdn_channel;
+                       cmd.command = ISDN_CMD_ACCEPTB;
+                       isdn_command(&cmd);
+                       anymore = 1;
+                       lp->dtimer = 0;
+                       lp->dialstate++;
+                       break;
+               case 8:
+               case 10:
+                       /*  Wait for B- or D-channel-connect */
 #ifdef ISDN_DEBUG_NET_DIAL
-                               printk(KERN_DEBUG "dialtimer4: %d\n", lp->dtimer);
+                       printk(KERN_DEBUG "dialtimer4: %d\n", lp->dtimer);
 #endif
-                               if (lp->dtimer++ > ISDN_TIMER_DTIMEOUT10)
-                                       isdn_net_hangup(p->dev);
-                               else
-                                       anymore = 1;
-                               break;
-                       case 11:
-                               /* Callback Delay */
-                               if (lp->dtimer++ > lp->cbdelay)
-                                       lp->dialstate = 1;
-                               anymore = 1;
-                               break;
-                       case 12:
-                               /* Remote does callback. Hangup after cbdelay, then wait for incoming
-                                * call (in state 4).
-                                */
-                               if (lp->dtimer++ > lp->cbdelay)
-                               {
-                                       printk(KERN_INFO "%s: hangup waiting for callback ...\n", p->dev->name);
-                                       lp->dtimer = 0;
-                                       lp->dialstate = 4;
-                                       cmd.driver = lp->isdn_device;
-                                       cmd.command = ISDN_CMD_HANGUP;
-                                       cmd.arg = lp->isdn_channel;
-                                       isdn_command(&cmd);
-                                       isdn_all_eaz(lp->isdn_device, lp->isdn_channel);
-                               }
+                       if (lp->dtimer++ > ISDN_TIMER_DTIMEOUT10)
+                               isdn_net_hangup(p->dev);
+                       else
                                anymore = 1;
-                               break;
-                       default:
-                               printk(KERN_WARNING "isdn_net: Illegal dialstate %d for device %s\n",
-                                      lp->dialstate, p->dev->name);
+                       break;
+               case 11:
+                       /* Callback Delay */
+                       if (lp->dtimer++ > lp->cbdelay)
+                               lp->dialstate = 1;
+                       anymore = 1;
+                       break;
+               case 12:
+                       /* Remote does callback. Hangup after cbdelay, then wait for incoming
+                        * call (in state 4).
+                        */
+                       if (lp->dtimer++ > lp->cbdelay)
+                       {
+                               printk(KERN_INFO "%s: hangup waiting for callback ...\n", p->dev->name);
+                               lp->dtimer = 0;
+                               lp->dialstate = 4;
+                               cmd.driver = lp->isdn_device;
+                               cmd.command = ISDN_CMD_HANGUP;
+                               cmd.arg = lp->isdn_channel;
+                               isdn_command(&cmd);
+                               isdn_all_eaz(lp->isdn_device, lp->isdn_channel);
+                       }
+                       anymore = 1;
+                       break;
+               default:
+                       printk(KERN_WARNING "isdn_net: Illegal dialstate %d for device %s\n",
+                              lp->dialstate, p->dev->name);
                }
                p = (isdn_net_dev *) p->next;
        }
@@ -839,8 +839,8 @@ isdn_net_hangup(struct net_device *d)
                        isdn_net_local *slp = ISDN_SLAVE_PRIV(lp);
                        if (slp->flags & ISDN_NET_CONNECTED) {
                                printk(KERN_INFO
-                                       "isdn_net: hang up slave %s before %s\n",
-                                       lp->slave->name, d->name);
+                                      "isdn_net: hang up slave %s before %s\n",
+                                      lp->slave->name, d->name);
                                isdn_net_hangup(lp->slave);
                        }
                }
@@ -854,8 +854,8 @@ isdn_net_hangup(struct net_device *d)
                /* try if there are generic encap protocol
                   receiver routines and signal the closure of
                   the link */
-               if( pops && pops -> disconn_ind )
-                 pops -> disconn_ind(cprot);
+               if (pops && pops->disconn_ind)
+                       pops->disconn_ind(cprot);
 #endif /* CONFIG_ISDN_X25 */
 
                cmd.driver = lp->isdn_device;
@@ -874,7 +874,7 @@ typedef struct {
 } ip_ports;
 
 static void
-isdn_net_log_skb(struct sk_buff * skb, isdn_net_local * lp)
+isdn_net_log_skb(struct sk_buff *skb, isdn_net_local *lp)
 {
        /* hopefully, this was set correctly */
        const u_char *p = skb_network_header(skb);
@@ -887,72 +887,72 @@ isdn_net_log_skb(struct sk_buff * skb, isdn_net_local * lp)
        /* This check stolen from 2.1.72 dev_queue_xmit_nit() */
        if (p < skb->data || skb->network_header >= skb->tail) {
                /* fall back to old isdn_net_log_packet method() */
-               char * buf = skb->data;
+               char *buf = skb->data;
 
                printk(KERN_DEBUG "isdn_net: protocol %04x is buggy, dev %s\n", skb->protocol, lp->netdev->dev->name);
                p = buf;
                proto = ETH_P_IP;
                switch (lp->p_encap) {
-                       case ISDN_NET_ENCAP_IPTYP:
-                               proto = ntohs(*(__be16 *)&buf[0]);
-                               p = &buf[2];
-                               break;
-                       case ISDN_NET_ENCAP_ETHER:
-                               proto = ntohs(*(__be16 *)&buf[12]);
-                               p = &buf[14];
-                               break;
-                       case ISDN_NET_ENCAP_CISCOHDLC:
-                               proto = ntohs(*(__be16 *)&buf[2]);
-                               p = &buf[4];
-                               break;
+               case ISDN_NET_ENCAP_IPTYP:
+                       proto = ntohs(*(__be16 *)&buf[0]);
+                       p = &buf[2];
+                       break;
+               case ISDN_NET_ENCAP_ETHER:
+                       proto = ntohs(*(__be16 *)&buf[12]);
+                       p = &buf[14];
+                       break;
+               case ISDN_NET_ENCAP_CISCOHDLC:
+                       proto = ntohs(*(__be16 *)&buf[2]);
+                       p = &buf[4];
+                       break;
 #ifdef CONFIG_ISDN_PPP
-                       case ISDN_NET_ENCAP_SYNCPPP:
-                               proto = ntohs(skb->protocol);
-                               p = &buf[IPPP_MAX_HEADER];
-                               break;
+               case ISDN_NET_ENCAP_SYNCPPP:
+                       proto = ntohs(skb->protocol);
+                       p = &buf[IPPP_MAX_HEADER];
+                       break;
 #endif
                }
        }
        data_ofs = ((p[0] & 15) * 4);
        switch (proto) {
-               case ETH_P_IP:
-                       switch (p[9]) {
-                               case 1:
-                                       strcpy(addinfo, " ICMP");
-                                       break;
-                               case 2:
-                                       strcpy(addinfo, " IGMP");
-                                       break;
-                               case 4:
-                                       strcpy(addinfo, " IPIP");
-                                       break;
-                               case 6:
-                                       ipp = (ip_ports *) (&p[data_ofs]);
-                                       sprintf(addinfo, " TCP, port: %d -> %d", ntohs(ipp->source),
-                                               ntohs(ipp->dest));
-                                       break;
-                               case 8:
-                                       strcpy(addinfo, " EGP");
-                                       break;
-                               case 12:
-                                       strcpy(addinfo, " PUP");
-                                       break;
-                               case 17:
-                                       ipp = (ip_ports *) (&p[data_ofs]);
-                                       sprintf(addinfo, " UDP, port: %d -> %d", ntohs(ipp->source),
-                                               ntohs(ipp->dest));
-                                       break;
-                               case 22:
-                                       strcpy(addinfo, " IDP");
-                                       break;
-                       }
-                       printk(KERN_INFO "OPEN: %pI4 -> %pI4%s\n",
-                              p + 12, p + 16, addinfo);
+       case ETH_P_IP:
+               switch (p[9]) {
+               case 1:
+                       strcpy(addinfo, " ICMP");
+                       break;
+               case 2:
+                       strcpy(addinfo, " IGMP");
+                       break;
+               case 4:
+                       strcpy(addinfo, " IPIP");
+                       break;
+               case 6:
+                       ipp = (ip_ports *) (&p[data_ofs]);
+                       sprintf(addinfo, " TCP, port: %d -> %d", ntohs(ipp->source),
+                               ntohs(ipp->dest));
+                       break;
+               case 8:
+                       strcpy(addinfo, " EGP");
+                       break;
+               case 12:
+                       strcpy(addinfo, " PUP");
+                       break;
+               case 17:
+                       ipp = (ip_ports *) (&p[data_ofs]);
+                       sprintf(addinfo, " UDP, port: %d -> %d", ntohs(ipp->source),
+                               ntohs(ipp->dest));
                        break;
-               case ETH_P_ARP:
-                       printk(KERN_INFO "OPEN: ARP %pI4 -> *.*.*.* ?%pI4\n",
-                              p + 14, p + 24);
+               case 22:
+                       strcpy(addinfo, " IDP");
                        break;
+               }
+               printk(KERN_INFO "OPEN: %pI4 -> %pI4%s\n",
+                      p + 12, p + 16, addinfo);
+               break;
+       case ETH_P_ARP:
+               printk(KERN_INFO "OPEN: ARP %pI4 -> *.*.*.* ?%pI4\n",
+                      p + 14, p + 24);
+               break;
        }
 }
 
@@ -964,7 +964,7 @@ isdn_net_log_skb(struct sk_buff * skb, isdn_net_local * lp)
 void isdn_net_write_super(isdn_net_local *lp, struct sk_buff *skb)
 {
        if (in_irq()) {
-               // we can't grab the lock from irq context, 
+               // we can't grab the lock from irq context,
                // so we just queue the packet
                skb_queue_tail(&lp->super_tx_queue, skb);
                schedule_work(&lp->tqueue);
@@ -993,12 +993,12 @@ static void isdn_net_softint(struct work_struct *work)
                skb = skb_dequeue(&lp->super_tx_queue);
                if (!skb)
                        break;
-               isdn_net_writebuf_skb(lp, skb);                                
+               isdn_net_writebuf_skb(lp, skb);
        }
        spin_unlock_bh(&lp->xmit_lock);
 }
 
-/* 
+/*
  * all frames sent from the (net) LL to a HL driver should go via this function
  * it's serialized by the caller holding the lp->xmit_lock spinlock
  */
@@ -1024,12 +1024,12 @@ void isdn_net_writebuf_skb(isdn_net_local *lp, struct sk_buff *skb)
                printk(KERN_WARNING "%s: HL driver queue full\n", lp->netdev->dev->name);
                goto error;
        }
-       
+
        lp->transcount += len;
        isdn_net_inc_frame_cnt(lp);
        return;
 
- error:
+error:
        dev_kfree_skb(skb);
        lp->stats.tx_errors++;
 
@@ -1129,14 +1129,14 @@ isdn_net_adjust_hdr(struct sk_buff *skb, struct net_device *dev)
 }
 
 
-static void isdn_net_tx_timeout(struct net_device * ndev)
+static void isdn_net_tx_timeout(struct net_device *ndev)
 {
        isdn_net_local *lp = netdev_priv(ndev);
 
        printk(KERN_WARNING "isdn_tx_timeout dev %s dialstate %d\n", ndev->name, lp->dialstate);
-       if (!lp->dialstate){
+       if (!lp->dialstate) {
                lp->stats.tx_errors++;
-                /*
+               /*
                 * There is a certain probability that this currently
                 * works at all because if we always wake up the interface,
                 * then upper layer will try to send the next packet
@@ -1149,7 +1149,7 @@ static void isdn_net_tx_timeout(struct net_device * ndev)
                 *
                 * actually, this may not matter at all, because ISDN hardware
                 * should not see transmitter hangs at all IMO
-                * changed KERN_DEBUG to KERN_WARNING to find out if this is 
+                * changed KERN_DEBUG to KERN_WARNING to find out if this is
                 * ever called   --KG
                 */
        }
@@ -1167,27 +1167,27 @@ isdn_net_start_xmit(struct sk_buff *skb, struct net_device *ndev)
 {
        isdn_net_local *lp = netdev_priv(ndev);
 #ifdef CONFIG_ISDN_X25
-       struct concap_proto * cprot = lp -> netdev -> cprot;
+       struct concap_proto *cprot = lp->netdev->cprot;
 /* At this point hard_start_xmit() passes control to the encapsulation
    protocol (if present).
    For X.25 auto-dialing is completly bypassed because:
    - It does not conform with the semantics of a reliable datalink
-     service as needed by X.25 PLP.
+   service as needed by X.25 PLP.
    - I don't want that the interface starts dialing when the network layer
-     sends a message which requests to disconnect the lapb link (or if it
-     sends any other message not resulting in data transmission).
+   sends a message which requests to disconnect the lapb link (or if it
+   sends any other message not resulting in data transmission).
    Instead, dialing will be initiated by the encapsulation protocol entity
    when a dl_establish request is received from the upper layer.
 */
-       if (cprot && cprot -> pops) {
-               int ret = cprot -> pops -> encap_and_xmit ( cprot , skb);
+       if (cprot && cprot->pops) {
+               int ret = cprot->pops->encap_and_xmit(cprot, skb);
 
                if (ret)
                        netif_stop_queue(ndev);
                return ret;
        } else
 #endif
-       /* auto-dialing xmit function */
+               /* auto-dialing xmit function */
        {
 #ifdef ISDN_DEBUG_NET_DUMP
                u_char *buf;
@@ -1209,12 +1209,12 @@ isdn_net_start_xmit(struct sk_buff *skb, struct net_device *ndev)
                        if (lp->phone[1]) {
                                ulong flags;
 
-                               if(lp->dialwait_timer <= 0)
-                                       if(lp->dialstarted > 0 && lp->dialtimeout > 0 && time_before(jiffies, lp->dialstarted + lp->dialtimeout + lp->dialwait))
+                               if (lp->dialwait_timer <= 0)
+                                       if (lp->dialstarted > 0 && lp->dialtimeout > 0 && time_before(jiffies, lp->dialstarted + lp->dialtimeout + lp->dialwait))
                                                lp->dialwait_timer = lp->dialstarted + lp->dialtimeout + lp->dialwait;
 
-                               if(lp->dialwait_timer > 0) {
-                                       if(time_before(jiffies, lp->dialwait_timer)) {
+                               if (lp->dialwait_timer > 0) {
+                                       if (time_before(jiffies, lp->dialwait_timer)) {
                                                isdn_net_unreachable(ndev, skb, "dial rejected: retry-time not reached");
                                                dev_kfree_skb(skb);
                                                return NETDEV_TX_OK;
@@ -1224,26 +1224,26 @@ isdn_net_start_xmit(struct sk_buff *skb, struct net_device *ndev)
                                /* Grab a free ISDN-Channel */
                                spin_lock_irqsave(&dev->lock, flags);
                                if (((chi =
-                                    isdn_get_free_channel(
-                                                       ISDN_USAGE_NET,
-                                                       lp->l2_proto,
-                                                       lp->l3_proto,
-                                                       lp->pre_device,
-                                                       lp->pre_channel,
-                                                       lp->msn)
-                                                       ) < 0) &&
-                                       ((chi =
-                                    isdn_get_free_channel(
-                                                       ISDN_USAGE_NET,
-                                                       lp->l2_proto,
-                                                       lp->l3_proto,
-                                                       lp->pre_device,
-                                                       lp->pre_channel^1,
-                                                       lp->msn)
-                                                       ) < 0)) {
+                                     isdn_get_free_channel(
+                                             ISDN_USAGE_NET,
+                                             lp->l2_proto,
+                                             lp->l3_proto,
+                                             lp->pre_device,
+                                             lp->pre_channel,
+                                             lp->msn)
+                                            ) < 0) &&
+                                   ((chi =
+                                     isdn_get_free_channel(
+                                             ISDN_USAGE_NET,
+                                             lp->l2_proto,
+                                             lp->l3_proto,
+                                             lp->pre_device,
+                                             lp->pre_channel^1,
+                                             lp->msn)
+                                           ) < 0)) {
                                        spin_unlock_irqrestore(&dev->lock, flags);
                                        isdn_net_unreachable(ndev, skb,
-                                                          "No channel");
+                                                            "No channel");
                                        dev_kfree_skb(skb);
                                        return NETDEV_TX_OK;
                                }
@@ -1290,13 +1290,13 @@ isdn_net_start_xmit(struct sk_buff *skb, struct net_device *ndev)
                                return NETDEV_TX_OK;
                        }
                } else {
-                       /* Device is connected to an ISDN channel */ 
+                       /* Device is connected to an ISDN channel */
                        ndev->trans_start = jiffies;
                        if (!lp->dialstate) {
                                /* ISDN connection is established, try sending */
                                int ret;
                                ret = (isdn_net_xmit(ndev, skb));
-                               if(ret) netif_stop_queue(ndev);
+                               if (ret) netif_stop_queue(ndev);
                                return ret;
                        } else
                                netif_stop_queue(ndev);
@@ -1313,13 +1313,13 @@ isdn_net_close(struct net_device *dev)
 {
        struct net_device *p;
 #ifdef CONFIG_ISDN_X25
-       struct concap_proto * cprot =
-               ((isdn_net_local *) netdev_priv(dev))->netdev->cprot;
-       /* printk(KERN_DEBUG "isdn_net_close %s\n" , dev-> name ); */
+       struct concap_proto *cprot =
+               ((isdn_net_local *)netdev_priv(dev))->netdev->cprot;
+       /* printk(KERN_DEBUG "isdn_net_close %s\n" , dev-> name); */
 #endif
 
 #ifdef CONFIG_ISDN_X25
-       if( cprot && cprot -> pops ) cprot -> pops -> close( cprot );
+       if (cprot && cprot->pops) cprot->pops->close(cprot);
 #endif
        netif_stop_queue(dev);
        p = MASTER_TO_SLAVE(dev);
@@ -1327,10 +1327,10 @@ isdn_net_close(struct net_device *dev)
                /* If this interface has slaves, stop them also */
                while (p) {
 #ifdef CONFIG_ISDN_X25
-                       cprot = ((isdn_net_local *) netdev_priv(p))
-                               -> netdev -> cprot;
-                       if( cprot && cprot -> pops )
-                               cprot -> pops -> close( cprot );
+                       cprot = ((isdn_net_local *)netdev_priv(p))
+                               ->netdev->cprot;
+                       if (cprot && cprot->pops)
+                               cprot->pops->close(cprot);
 #endif
                        isdn_net_hangup(p);
                        p = MASTER_TO_SLAVE(p);
@@ -1405,7 +1405,7 @@ isdn_net_type_trans(struct sk_buff *skb, struct net_device *dev)
 }
 
 
-/* 
+/*
  * CISCO HDLC keepalive specific stuff
  */
 static struct sk_buff*
@@ -1417,7 +1417,7 @@ isdn_net_ciscohdlck_alloc_skb(isdn_net_local *lp, int len)
        skb = alloc_skb(hl + len, GFP_ATOMIC);
        if (skb)
                skb_reserve(skb, hl);
-       else 
+       else
                printk("isdn out of mem at %s:%d!\n", __FILE__, __LINE__);
        return skb;
 }
@@ -1439,52 +1439,52 @@ isdn_ciscohdlck_dev_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
 
        switch (cmd) {
                /* get/set keepalive period */
-               case SIOCGKEEPPERIOD:
-                       len = (unsigned long)sizeof(lp->cisco_keepalive_period);
-                       if (copy_to_user(ifr->ifr_data,
-                               &lp->cisco_keepalive_period, len))
-                               rc = -EFAULT;
-                       break;
-               case SIOCSKEEPPERIOD:
-                       tmp = lp->cisco_keepalive_period;
-                       len = (unsigned long)sizeof(lp->cisco_keepalive_period);
-                       if (copy_from_user(&period, ifr->ifr_data, len))
-                               rc = -EFAULT;
-                       if ((period > 0) && (period <= 32767))
-                               lp->cisco_keepalive_period = period;
-                       else
-                               rc = -EINVAL;
-                       if (!rc && (tmp != lp->cisco_keepalive_period)) {
-                               expires = (unsigned long)(jiffies +
-                                       lp->cisco_keepalive_period * HZ);
-                               mod_timer(&lp->cisco_timer, expires);
-                               printk(KERN_INFO "%s: Keepalive period set "
-                                       "to %d seconds.\n",
-                                       dev->name, lp->cisco_keepalive_period);
-                       }
-                       break;
+       case SIOCGKEEPPERIOD:
+               len = (unsigned long)sizeof(lp->cisco_keepalive_period);
+               if (copy_to_user(ifr->ifr_data,
+                                &lp->cisco_keepalive_period, len))
+                       rc = -EFAULT;
+               break;
+       case SIOCSKEEPPERIOD:
+               tmp = lp->cisco_keepalive_period;
+               len = (unsigned long)sizeof(lp->cisco_keepalive_period);
+               if (copy_from_user(&period, ifr->ifr_data, len))
+                       rc = -EFAULT;
+               if ((period > 0) && (period <= 32767))
+                       lp->cisco_keepalive_period = period;
+               else
+                       rc = -EINVAL;
+               if (!rc && (tmp != lp->cisco_keepalive_period)) {
+                       expires = (unsigned long)(jiffies +
+                                                 lp->cisco_keepalive_period * HZ);
+                       mod_timer(&lp->cisco_timer, expires);
+                       printk(KERN_INFO "%s: Keepalive period set "
+                              "to %d seconds.\n",
+                              dev->name, lp->cisco_keepalive_period);
+               }
+               break;
 
                /* get/set debugging */
-               case SIOCGDEBSERINT:
-                       len = (unsigned long)sizeof(lp->cisco_debserint);
-                       if (copy_to_user(ifr->ifr_data,
-                               &lp->cisco_debserint, len))
-                               rc = -EFAULT;
-                       break;
-               case SIOCSDEBSERINT:
-                       len = (unsigned long)sizeof(lp->cisco_debserint);
-                       if (copy_from_user(&debserint,
-                               ifr->ifr_data, len))
-                               rc = -EFAULT;
-                       if ((debserint >= 0) && (debserint <= 64))
-                               lp->cisco_debserint = debserint;
-                       else
-                               rc = -EINVAL;
-                       break;
-
-               default:
+       case SIOCGDEBSERINT:
+               len = (unsigned long)sizeof(lp->cisco_debserint);
+               if (copy_to_user(ifr->ifr_data,
+                                &lp->cisco_debserint, len))
+                       rc = -EFAULT;
+               break;
+       case SIOCSDEBSERINT:
+               len = (unsigned long)sizeof(lp->cisco_debserint);
+               if (copy_from_user(&debserint,
+                                  ifr->ifr_data, len))
+                       rc = -EFAULT;
+               if ((debserint >= 0) && (debserint <= 64))
+                       lp->cisco_debserint = debserint;
+               else
                        rc = -EINVAL;
-                       break;
+               break;
+
+       default:
+               rc = -EINVAL;
+               break;
        }
        return (rc);
 }
@@ -1524,30 +1524,30 @@ isdn_net_ciscohdlck_slarp_send_keepalive(unsigned long data)
        lp->cisco_myseq++;
 
        myseq_diff = (lp->cisco_myseq - lp->cisco_mineseen);
-       if ((lp->cisco_line_state) && ((myseq_diff >= 3)||(myseq_diff <= -3))) {
+       if ((lp->cisco_line_state) && ((myseq_diff >= 3) || (myseq_diff <= -3))) {
                /* line up -> down */
                lp->cisco_line_state = 0;
-               printk (KERN_WARNING
-                               "UPDOWN: Line protocol on Interface %s,"
-                               " changed state to down\n", lp->netdev->dev->name);
+               printk(KERN_WARNING
+                      "UPDOWN: Line protocol on Interface %s,"
+                      " changed state to down\n", lp->netdev->dev->name);
                /* should stop routing higher-level data across */
        } else if ((!lp->cisco_line_state) &&
-               (myseq_diff >= 0) && (myseq_diff <= 2)) {
+                  (myseq_diff >= 0) && (myseq_diff <= 2)) {
                /* line down -> up */
                lp->cisco_line_state = 1;
-               printk (KERN_WARNING
-                               "UPDOWN: Line protocol on Interface %s,"
-                               " changed state to up\n", lp->netdev->dev->name);
+               printk(KERN_WARNING
+                      "UPDOWN: Line protocol on Interface %s,"
+                      " changed state to up\n", lp->netdev->dev->name);
                /* restart routing higher-level data across */
        }
 
        if (lp->cisco_debserint)
-               printk (KERN_DEBUG "%s: HDLC "
-                       "myseq %lu, mineseen %lu%c, yourseen %lu, %s\n",
-                       lp->netdev->dev->name, last_cisco_myseq, lp->cisco_mineseen,
-                       ((last_cisco_myseq == lp->cisco_mineseen) ? '*' : 040),
-                       lp->cisco_yourseq,
-                       ((lp->cisco_line_state) ? "line up" : "line down"));
+               printk(KERN_DEBUG "%s: HDLC "
+                      "myseq %lu, mineseen %lu%c, yourseen %lu, %s\n",
+                      lp->netdev->dev->name, last_cisco_myseq, lp->cisco_mineseen,
+                      ((last_cisco_myseq == lp->cisco_mineseen) ? '*' : 040),
+                      lp->cisco_yourseq,
+                      ((lp->cisco_line_state) ? "line up" : "line down"));
 
        skb = isdn_net_ciscohdlck_alloc_skb(lp, 4 + 14);
        if (!skb)
@@ -1570,7 +1570,7 @@ isdn_net_ciscohdlck_slarp_send_keepalive(unsigned long data)
        isdn_net_write_super(lp, skb);
 
        lp->cisco_timer.expires = jiffies + lp->cisco_keepalive_period * HZ;
-       
+
        add_timer(&lp->cisco_timer);
 }
 
@@ -1601,7 +1601,7 @@ isdn_net_ciscohdlck_slarp_send_request(isdn_net_local *lp)
        isdn_net_write_super(lp, skb);
 }
 
-static void 
+static void
 isdn_net_ciscohdlck_connected(isdn_net_local *lp)
 {
        lp->cisco_myseq = 0;
@@ -1622,7 +1622,7 @@ isdn_net_ciscohdlck_connected(isdn_net_local *lp)
        add_timer(&lp->cisco_timer);
 }
 
-static void 
+static void
 isdn_net_ciscohdlck_disconnected(isdn_net_local *lp)
 {
        del_timer(&lp->cisco_timer);
@@ -1703,20 +1703,20 @@ isdn_net_ciscohdlck_slarp_in(isdn_net_local *lp, struct sk_buff *skb)
                printk(KERN_INFO "%s: got slarp reply: remote ip: %pI4, local ip: %pI4 mask: %pI4\n",
                       lp->netdev->dev->name, addr, &local, mask);
                break;
-  slarp_reply_out:
+       slarp_reply_out:
                printk(KERN_INFO "%s: got invalid slarp reply (%pI4/%pI4) - ignored\n",
                       lp->netdev->dev->name, addr, mask);
                break;
        case CISCO_SLARP_KEEPALIVE:
                period = (int)((jiffies - lp->cisco_last_slarp_in
-                               + HZ/2 - 1) / HZ);
+                               + HZ / 2 - 1) / HZ);
                if (lp->cisco_debserint &&
-                               (period != lp->cisco_keepalive_period) &&
-                               lp->cisco_last_slarp_in) {
+                   (period != lp->cisco_keepalive_period) &&
+                   lp->cisco_last_slarp_in) {
                        printk(KERN_DEBUG "%s: Keepalive period mismatch - "
-                               "is %d but should be %d.\n",
-                               lp->netdev->dev->name, period,
-                               lp->cisco_keepalive_period);
+                              "is %d but should be %d.\n",
+                              lp->netdev->dev->name, period,
+                              lp->cisco_keepalive_period);
                }
                lp->cisco_last_slarp_in = jiffies;
                my_seq = be32_to_cpup((__be32 *)(p + 0));
@@ -1732,10 +1732,10 @@ static void
 isdn_net_ciscohdlck_receive(isdn_net_local *lp, struct sk_buff *skb)
 {
        unsigned char *p;
-       u8 addr;
-       u8 ctrl;
-       u16 type;
-       
+       u8 addr;
+       u8 ctrl;
+       u16 type;
+
        if (skb->len < 4)
                goto out_free;
 
@@ -1745,7 +1745,7 @@ isdn_net_ciscohdlck_receive(isdn_net_local *lp, struct sk_buff *skb)
        type = be16_to_cpup((__be16 *)(p + 2));
        p += 4;
        skb_pull(skb, 4);
-       
+
        if (addr != CISCO_ADDR_UNICAST && addr != CISCO_ADDR_BROADCAST) {
                printk(KERN_WARNING "%s: Unknown Cisco addr 0x%02x\n",
                       lp->netdev->dev->name, addr);
@@ -1764,8 +1764,8 @@ isdn_net_ciscohdlck_receive(isdn_net_local *lp, struct sk_buff *skb)
        case CISCO_TYPE_CDP:
                if (lp->cisco_debserint)
                        printk(KERN_DEBUG "%s: Received CDP packet. use "
-                               "\"no cdp enable\" on cisco.\n",
-                               lp->netdev->dev->name);
+                              "\"no cdp enable\" on cisco.\n",
+                              lp->netdev->dev->name);
                goto out_free;
        default:
                /* no special cisco protocol */
@@ -1774,7 +1774,7 @@ isdn_net_ciscohdlck_receive(isdn_net_local *lp, struct sk_buff *skb)
                return;
        }
 
- out_free:
+out_free:
        kfree_skb(skb);
 }
 
@@ -1787,7 +1787,7 @@ isdn_net_receive(struct net_device *ndev, struct sk_buff *skb)
        isdn_net_local *lp = netdev_priv(ndev);
        isdn_net_local *olp = lp;       /* original 'lp' */
 #ifdef CONFIG_ISDN_X25
-       struct concap_proto *cprot = lp -> netdev -> cprot;
+       struct concap_proto *cprot = lp->netdev->cprot;
 #endif
        lp->transcount += skb->len;
 
@@ -1809,60 +1809,60 @@ isdn_net_receive(struct net_device *ndev, struct sk_buff *skb)
        isdn_dumppkt("R:", skb->data, skb->len, 40);
 #endif
        switch (lp->p_encap) {
-               case ISDN_NET_ENCAP_ETHER:
-                       /* Ethernet over ISDN */
-                       olp->huptimer = 0;
-                       lp->huptimer = 0;
-                       skb->protocol = isdn_net_type_trans(skb, ndev);
-                       break;
-               case ISDN_NET_ENCAP_UIHDLC:
-                       /* HDLC with UI-frame (for ispa with -h1 option) */
-                       olp->huptimer = 0;
-                       lp->huptimer = 0;
-                       skb_pull(skb, 2);
-                       /* Fall through */
-               case ISDN_NET_ENCAP_RAWIP:
-                       /* RAW-IP without MAC-Header */
-                       olp->huptimer = 0;
-                       lp->huptimer = 0;
-                       skb->protocol = htons(ETH_P_IP);
-                       break;
-               case ISDN_NET_ENCAP_CISCOHDLCK:
-                       isdn_net_ciscohdlck_receive(lp, skb);
-                       return;
-               case ISDN_NET_ENCAP_CISCOHDLC:
-                       /* CISCO-HDLC IP with type field and  fake I-frame-header */
-                       skb_pull(skb, 2);
-                       /* Fall through */
-               case ISDN_NET_ENCAP_IPTYP:
-                       /* IP with type field */
-                       olp->huptimer = 0;
-                       lp->huptimer = 0;
-                       skb->protocol = *(__be16 *)&(skb->data[0]);
-                       skb_pull(skb, 2);
-                       if (*(unsigned short *) skb->data == 0xFFFF)
-                               skb->protocol = htons(ETH_P_802_3);
-                       break;
+       case ISDN_NET_ENCAP_ETHER:
+               /* Ethernet over ISDN */
+               olp->huptimer = 0;
+               lp->huptimer = 0;
+               skb->protocol = isdn_net_type_trans(skb, ndev);
+               break;
+       case ISDN_NET_ENCAP_UIHDLC:
+               /* HDLC with UI-frame (for ispa with -h1 option) */
+               olp->huptimer = 0;
+               lp->huptimer = 0;
+               skb_pull(skb, 2);
+               /* Fall through */
+       case ISDN_NET_ENCAP_RAWIP:
+               /* RAW-IP without MAC-Header */
+               olp->huptimer = 0;
+               lp->huptimer = 0;
+               skb->protocol = htons(ETH_P_IP);
+               break;
+       case ISDN_NET_ENCAP_CISCOHDLCK:
+               isdn_net_ciscohdlck_receive(lp, skb);
+               return;
+       case ISDN_NET_ENCAP_CISCOHDLC:
+               /* CISCO-HDLC IP with type field and  fake I-frame-header */
+               skb_pull(skb, 2);
+               /* Fall through */
+       case ISDN_NET_ENCAP_IPTYP:
+               /* IP with type field */
+               olp->huptimer = 0;
+               lp->huptimer = 0;
+               skb->protocol = *(__be16 *)&(skb->data[0]);
+               skb_pull(skb, 2);
+               if (*(unsigned short *) skb->data == 0xFFFF)
+                       skb->protocol = htons(ETH_P_802_3);
+               break;
 #ifdef CONFIG_ISDN_PPP
-               case ISDN_NET_ENCAP_SYNCPPP:
-                       /* huptimer is done in isdn_ppp_push_higher */
-                       isdn_ppp_receive(lp->netdev, olp, skb);
-                       return;
+       case ISDN_NET_ENCAP_SYNCPPP:
+               /* huptimer is done in isdn_ppp_push_higher */
+               isdn_ppp_receive(lp->netdev, olp, skb);
+               return;
 #endif
 
-               default:
+       default:
 #ifdef CONFIG_ISDN_X25
-                 /* try if there are generic sync_device receiver routines */
-                       if(cprot) if(cprot -> pops)
-                               if( cprot -> pops -> data_ind){
-                                       cprot -> pops -> data_ind(cprot,skb);
-                                       return;
-                               };
+               /* try if there are generic sync_device receiver routines */
+               if (cprot) if (cprot->pops)
+                                  if (cprot->pops->data_ind) {
+                                          cprot->pops->data_ind(cprot, skb);
+                                          return;
+                                  };
 #endif /* CONFIG_ISDN_X25 */
-                       printk(KERN_WARNING "%s: unknown encapsulation, dropping\n",
-                              lp->netdev->dev->name);
-                       kfree_skb(skb);
-                       return;
+               printk(KERN_WARNING "%s: unknown encapsulation, dropping\n",
+                      lp->netdev->dev->name);
+               kfree_skb(skb);
+               return;
        }
 
        netif_rx(skb);
@@ -1904,48 +1904,48 @@ static int isdn_net_header(struct sk_buff *skb, struct net_device *dev,
        int len = 0;
 
        switch (lp->p_encap) {
-               case ISDN_NET_ENCAP_ETHER:
-                       len = eth_header(skb, dev, type, daddr, saddr, plen);
-                       break;
+       case ISDN_NET_ENCAP_ETHER:
+               len = eth_header(skb, dev, type, daddr, saddr, plen);
+               break;
 #ifdef CONFIG_ISDN_PPP
-               case ISDN_NET_ENCAP_SYNCPPP:
-                       /* stick on a fake header to keep fragmentation code happy. */
-                       len = IPPP_MAX_HEADER;
-                       skb_push(skb,len);
-                       break;
+       case ISDN_NET_ENCAP_SYNCPPP:
+               /* stick on a fake header to keep fragmentation code happy. */
+               len = IPPP_MAX_HEADER;
+               skb_push(skb, len);
+               break;
 #endif
-               case ISDN_NET_ENCAP_RAWIP:
-                       printk(KERN_WARNING "isdn_net_header called with RAW_IP!\n");
-                       len = 0;
-                       break;
-               case ISDN_NET_ENCAP_IPTYP:
-                       /* ethernet type field */
-                       *((__be16 *)skb_push(skb, 2)) = htons(type);
-                       len = 2;
-                       break;
-               case ISDN_NET_ENCAP_UIHDLC:
-                       /* HDLC with UI-Frames (for ispa with -h1 option) */
-                       *((__be16 *)skb_push(skb, 2)) = htons(0x0103);
-                       len = 2;
-                       break;
-               case ISDN_NET_ENCAP_CISCOHDLC:
-               case ISDN_NET_ENCAP_CISCOHDLCK:
-                       p = skb_push(skb, 4);
-                       *(u8 *)(p + 0) = CISCO_ADDR_UNICAST;
-                       *(u8 *)(p + 1) = CISCO_CTRL;
-                       *(__be16 *)(p + 2) = cpu_to_be16(type);
-                       p += 4;
-                       len = 4;
-                       break;
+       case ISDN_NET_ENCAP_RAWIP:
+               printk(KERN_WARNING "isdn_net_header called with RAW_IP!\n");
+               len = 0;
+               break;
+       case ISDN_NET_ENCAP_IPTYP:
+               /* ethernet type field */
+               *((__be16 *)skb_push(skb, 2)) = htons(type);
+               len = 2;
+               break;
+       case ISDN_NET_ENCAP_UIHDLC:
+               /* HDLC with UI-Frames (for ispa with -h1 option) */
+               *((__be16 *)skb_push(skb, 2)) = htons(0x0103);
+               len = 2;
+               break;
+       case ISDN_NET_ENCAP_CISCOHDLC:
+       case ISDN_NET_ENCAP_CISCOHDLCK:
+               p = skb_push(skb, 4);
+               *(u8 *)(p + 0) = CISCO_ADDR_UNICAST;
+               *(u8 *)(p + 1) = CISCO_CTRL;
+               *(__be16 *)(p + 2) = cpu_to_be16(type);
+               p += 4;
+               len = 4;
+               break;
 #ifdef CONFIG_ISDN_X25
-               default:
-                 /* try if there are generic concap protocol routines */
-                       if( lp-> netdev -> cprot ){
-                               printk(KERN_WARNING "isdn_net_header called with concap_proto!\n");
-                               len = 0;
-                               break;
-                       }
+       default:
+               /* try if there are generic concap protocol routines */
+               if (lp->netdev->cprot) {
+                       printk(KERN_WARNING "isdn_net_header called with concap_proto!\n");
+                       len = 0;
                        break;
+               }
+               break;
 #endif /* CONFIG_ISDN_X25 */
        }
        return len;
@@ -2045,12 +2045,12 @@ isdn_net_swapbind(int drvidx)
        while (p) {
                if (p->local->pre_device == drvidx)
                        switch (p->local->pre_channel) {
-                               case 0:
-                                       p->local->pre_channel = 1;
-                                       break;
-                               case 1:
-                                       p->local->pre_channel = 0;
-                                       break;
+                       case 0:
+                               p->local->pre_channel = 1;
+                               break;
+                       case 1:
+                               p->local->pre_channel = 0;
+                               break;
                        }
                p = (isdn_net_dev *) p->next;
        }
@@ -2134,7 +2134,7 @@ isdn_net_find_icall(int di, int ch, int idx, setup_parm *setup)
        ematch = wret = swapped = 0;
 #ifdef ISDN_DEBUG_NET_ICALL
        printk(KERN_DEBUG "n_fi: di=%d ch=%d idx=%d usg=%d\n", di, ch, idx,
-               dev->usage[idx]);
+              dev->usage[idx]);
 #endif
        while (p) {
                int matchret;
@@ -2142,32 +2142,32 @@ isdn_net_find_icall(int di, int ch, int idx, setup_parm *setup)
 
                /* If last check has triggered as binding-swap, revert it */
                switch (swapped) {
-                       case 2:
-                               isdn_net_swap_usage(idx, sidx);
-                               /* fall through */
-                       case 1:
-                               isdn_net_swapbind(di);
-                               break;
+               case 2:
+                       isdn_net_swap_usage(idx, sidx);
+                       /* fall through */
+               case 1:
+                       isdn_net_swapbind(di);
+                       break;
                }
                swapped = 0;
-                /* check acceptable call types for DOV */
-                my_eaz = isdn_map_eaz2msn(lp->msn, di);
-                if (si1 == 1) { /* it's a DOV call, check if we allow it */
-                        if (*my_eaz == 'v' || *my_eaz == 'V' ||
+               /* check acceptable call types for DOV */
+               my_eaz = isdn_map_eaz2msn(lp->msn, di);
+               if (si1 == 1) { /* it's a DOV call, check if we allow it */
+                       if (*my_eaz == 'v' || *my_eaz == 'V' ||
                            *my_eaz == 'b' || *my_eaz == 'B')
-                                my_eaz++; /* skip to allow a match */
-                        else
-                                my_eaz = NULL; /* force non match */
-                } else { /* it's a DATA call, check if we allow it */
-                        if (*my_eaz == 'b' || *my_eaz == 'B')
-                                my_eaz++; /* skip to allow a match */
-                }
-                if (my_eaz)
-                        matchret = isdn_msncmp(eaz, my_eaz);
-                else
-                        matchret = 1;
-                if (!matchret)
-                        ematch = 1;
+                               my_eaz++; /* skip to allow a match */
+                       else
+                               my_eaz = NULL; /* force non match */
+               } else { /* it's a DATA call, check if we allow it */
+                       if (*my_eaz == 'b' || *my_eaz == 'B')
+                               my_eaz++; /* skip to allow a match */
+               }
+               if (my_eaz)
+                       matchret = isdn_msncmp(eaz, my_eaz);
+               else
+                       matchret = 1;
+               if (!matchret)
+                       ematch = 1;
 
                /* Remember if more numbers eventually can match */
                if (matchret > wret)
@@ -2181,8 +2181,8 @@ isdn_net_find_icall(int di, int ch, int idx, setup_parm *setup)
                      (USG_NONE(dev->usage[idx]))) ||                     /* and ch. unused or */
                     ((((lp->dialstate == 4) || (lp->dialstate == 12)) && /* if dialing        */
                       (!(lp->flags & ISDN_NET_CALLBACK)))                /* but no callback   */
-                    )))
-                        {
+                            )))
+               {
 #ifdef ISDN_DEBUG_NET_ICALL
                        printk(KERN_DEBUG "n_fi: match1, pdev=%d pch=%d\n",
                               lp->pre_device, lp->pre_channel);
@@ -2312,7 +2312,7 @@ isdn_net_find_icall(int di, int ch, int idx, setup_parm *setup)
                                                p = (isdn_net_dev *) p->next;
                                                continue;
                                        }
-                               } 
+                               }
                                if (lp->flags & ISDN_NET_CALLBACK) {
                                        int chi;
                                        /*
@@ -2330,18 +2330,18 @@ isdn_net_find_icall(int di, int ch, int idx, setup_parm *setup)
                                        if (lp->phone[1]) {
                                                /* Grab a free ISDN-Channel */
                                                spin_lock_irqsave(&dev->lock, flags);
-                                               if ((chi = 
-                                                       isdn_get_free_channel(
-                                                               ISDN_USAGE_NET,
-                                                               lp->l2_proto,
-                                                               lp->l3_proto,
-                                                               lp->pre_device,
-                                                               lp->pre_channel,
-                                                               lp->msn)
-                                                               ) < 0) {
+                                               if ((chi =
+                                                    isdn_get_free_channel(
+                                                            ISDN_USAGE_NET,
+                                                            lp->l2_proto,
+                                                            lp->l3_proto,
+                                                            lp->pre_device,
+                                                            lp->pre_channel,
+                                                            lp->msn)
+                                                           ) < 0) {
 
                                                        printk(KERN_WARNING "isdn_net_find_icall: No channel for %s\n",
-                                                               p->dev->name);
+                                                              p->dev->name);
                                                        spin_unlock_irqrestore(&dev->lock, flags);
                                                        return 0;
                                                }
@@ -2363,11 +2363,11 @@ isdn_net_find_icall(int di, int ch, int idx, setup_parm *setup)
                                                return (lp->flags & ISDN_NET_CBHUP) ? 2 : 4;
                                        } else
                                                printk(KERN_WARNING "isdn_net: %s: No phone number\n",
-                                                       p->dev->name);
+                                                      p->dev->name);
                                        return 0;
                                } else {
                                        printk(KERN_DEBUG "%s: call from %s -> %s accepted\n",
-                                               p->dev->name, nr, eaz);
+                                              p->dev->name, nr, eaz);
                                        /* if this interface is dialing, it does it probably on a different
                                           device, so free this device */
                                        if ((lp->dialstate == 4) || (lp->dialstate == 12)) {
@@ -2377,7 +2377,7 @@ isdn_net_find_icall(int di, int ch, int idx, setup_parm *setup)
 #endif
                                                isdn_net_lp_disconnected(lp);
                                                isdn_free_channel(lp->isdn_device, lp->isdn_channel,
-                                                        ISDN_USAGE_NET);
+                                                                 ISDN_USAGE_NET);
                                        }
                                        spin_lock_irqsave(&dev->lock, flags);
                                        dev->usage[idx] &= ISDN_USAGE_EXCLUSIVE;
@@ -2414,7 +2414,7 @@ isdn_net_find_icall(int di, int ch, int idx, setup_parm *setup)
        /* If none of configured EAZ/MSN matched and not verbose, be silent */
        if (!ematch || dev->net_verbose)
                printk(KERN_INFO "isdn_net: call from %s -> %d %s ignored\n", nr, di, eaz);
-       return (wret == 2)?5:0;
+       return (wret == 2) ? 5 : 0;
 }
 
 /*
@@ -2439,7 +2439,7 @@ isdn_net_findif(char *name)
  * from isdn_net_start_xmit().
  */
 static int
-isdn_net_force_dial_lp(isdn_net_local * lp)
+isdn_net_force_dial_lp(isdn_net_local *lp)
 {
        if ((!(lp->flags & ISDN_NET_CONNECTED)) && !lp->dialstate) {
                int chi;
@@ -2449,14 +2449,14 @@ isdn_net_force_dial_lp(isdn_net_local * lp)
                        /* Grab a free ISDN-Channel */
                        spin_lock_irqsave(&dev->lock, flags);
                        if ((chi = isdn_get_free_channel(
-                                       ISDN_USAGE_NET,
-                                       lp->l2_proto,
-                                       lp->l3_proto,
-                                       lp->pre_device,
-                                       lp->pre_channel,
-                                       lp->msn)) < 0) {
+                                    ISDN_USAGE_NET,
+                                    lp->l2_proto,
+                                    lp->l3_proto,
+                                    lp->pre_device,
+                                    lp->pre_channel,
+                                    lp->msn)) < 0) {
                                printk(KERN_WARNING "isdn_net_force_dial: No channel for %s\n",
-                                       lp->netdev->dev->name);
+                                      lp->netdev->dev->name);
                                spin_unlock_irqrestore(&dev->lock, flags);
                                return -EAGAIN;
                        }
@@ -2487,7 +2487,7 @@ isdn_net_force_dial_lp(isdn_net_local * lp)
  * themselves.
  */
 int
-isdn_net_dial_req(isdn_net_local * lp)
+isdn_net_dial_req(isdn_net_local *lp)
 {
        /* is there a better error code? */
        if (!(ISDN_NET_DIALMODE(*lp) == ISDN_NET_DM_AUTO)) return -EBUSY;
@@ -2531,7 +2531,7 @@ static void _isdn_setup(struct net_device *dev)
        ether_setup(dev);
 
        /* Setup the generic properties */
-       dev->flags = IFF_NOARP|IFF_POINTOPOINT;
+       dev->flags = IFF_NOARP | IFF_POINTOPOINT;
 
        /* isdn prepends a header in the tx path, can't share skbs */
        dev->priv_flags &= ~IFF_TX_SKB_SHARING;
@@ -2655,7 +2655,7 @@ isdn_net_newslave(char *parm)
                if (n->local->master)
                        return NULL;
                /* Master must not be started yet */
-               if (isdn_net_device_started(n)) 
+               if (isdn_net_device_started(n))
                        return NULL;
                return (isdn_net_new(newname, n->dev));
        }
@@ -2669,7 +2669,7 @@ isdn_net_newslave(char *parm)
  * setup first, if only selected parameters are to be changed.
  */
 int
-isdn_net_setcfg(isdn_net_ioctl_cfg * cfg)
+isdn_net_setcfg(isdn_net_ioctl_cfg *cfg)
 {
        isdn_net_dev *p = isdn_net_findif(cfg->name);
        ulong features;
@@ -2692,9 +2692,9 @@ isdn_net_setcfg(isdn_net_ioctl_cfg * cfg)
                        printk(KERN_WARNING "isdn_net: No driver with selected features\n");
                        return -ENODEV;
                }
-               if (lp->p_encap != cfg->p_encap){
+               if (lp->p_encap != cfg->p_encap) {
 #ifdef CONFIG_ISDN_X25
-                       struct concap_proto * cprot = p -> cprot;
+                       struct concap_proto *cprot = p->cprot;
 #endif
                        if (isdn_net_device_started(p)) {
                                printk(KERN_WARNING "%s: cannot change encap when if is up\n",
@@ -2702,24 +2702,24 @@ isdn_net_setcfg(isdn_net_ioctl_cfg * cfg)
                                return -EBUSY;
                        }
 #ifdef CONFIG_ISDN_X25
-                       if( cprot && cprot -> pops )
-                               cprot -> pops -> proto_del ( cprot );
-                       p -> cprot = NULL;
-                       lp -> dops = NULL;
+                       if (cprot && cprot->pops)
+                               cprot->pops->proto_del(cprot);
+                       p->cprot = NULL;
+                       lp->dops = NULL;
                        /* ... ,  prepare for configuration of new one ... */
-                       switch ( cfg -> p_encap ){
+                       switch (cfg->p_encap) {
                        case ISDN_NET_ENCAP_X25IFACE:
-                               lp -> dops = &isdn_concap_reliable_dl_dops;
+                               lp->dops = &isdn_concap_reliable_dl_dops;
                        }
                        /* ... and allocate new one ... */
-                       p -> cprot = isdn_concap_new( cfg -> p_encap );
+                       p->cprot = isdn_concap_new(cfg->p_encap);
                        /* p -> cprot == NULL now if p_encap is not supported
                           by means of the concap_proto mechanism */
                        /* the protocol is not configured yet; this will
                           happen later when isdn_net_reset() is called */
 #endif
                }
-               switch ( cfg->p_encap ) {
+               switch (cfg->p_encap) {
                case ISDN_NET_ENCAP_SYNCPPP:
 #ifndef CONFIG_ISDN_PPP
                        printk(KERN_WARNING "%s: SyncPPP support not configured\n",
@@ -2743,8 +2743,8 @@ isdn_net_setcfg(isdn_net_ioctl_cfg * cfg)
                case ISDN_NET_ENCAP_CISCOHDLCK:
                        break;
                default:
-                       if( cfg->p_encap >= 0 &&
-                           cfg->p_encap <= ISDN_NET_ENCAP_MAX_ENCAP )
+                       if (cfg->p_encap >= 0 &&
+                           cfg->p_encap <= ISDN_NET_ENCAP_MAX_ENCAP)
                                break;
                        printk(KERN_WARNING
                               "%s: encapsulation protocol %d not supported\n",
@@ -2754,10 +2754,10 @@ isdn_net_setcfg(isdn_net_ioctl_cfg * cfg)
                if (strlen(cfg->drvid)) {
                        /* A bind has been requested ... */
                        char *c,
-                       *e;
+                               *e;
 
                        if (strnlen(cfg->drvid, sizeof(cfg->drvid)) ==
-                                       sizeof(cfg->drvid))
+                           sizeof(cfg->drvid))
                                return -EINVAL;
                        drvidx = -1;
                        chidx = -1;
@@ -2789,8 +2789,8 @@ isdn_net_setcfg(isdn_net_ioctl_cfg * cfg)
                        /* If binding is exclusive, try to grab the channel */
                        spin_lock_irqsave(&dev->lock, flags);
                        if ((i = isdn_get_free_channel(ISDN_USAGE_NET,
-                               lp->l2_proto, lp->l3_proto, drvidx,
-                               chidx, lp->msn)) < 0) {
+                                                      lp->l2_proto, lp->l3_proto, drvidx,
+                                                      chidx, lp->msn)) < 0) {
                                /* Grab failed, because desired channel is in use */
                                lp->exclusive = -1;
                                spin_unlock_irqrestore(&dev->lock, flags);
@@ -2834,23 +2834,23 @@ isdn_net_setcfg(isdn_net_ioctl_cfg * cfg)
                else
                        lp->flags &= ~ISDN_NET_CBHUP;
                switch (cfg->callback) {
-                       case 0:
-                               lp->flags &= ~(ISDN_NET_CALLBACK | ISDN_NET_CBOUT);
-                               break;
-                       case 1:
-                               lp->flags |= ISDN_NET_CALLBACK;
-                               lp->flags &= ~ISDN_NET_CBOUT;
-                               break;
-                       case 2:
-                               lp->flags |= ISDN_NET_CBOUT;
-                               lp->flags &= ~ISDN_NET_CALLBACK;
-                               break;
+               case 0:
+                       lp->flags &= ~(ISDN_NET_CALLBACK | ISDN_NET_CBOUT);
+                       break;
+               case 1:
+                       lp->flags |= ISDN_NET_CALLBACK;
+                       lp->flags &= ~ISDN_NET_CBOUT;
+                       break;
+               case 2:
+                       lp->flags |= ISDN_NET_CBOUT;
+                       lp->flags &= ~ISDN_NET_CALLBACK;
+                       break;
                }
                lp->flags &= ~ISDN_NET_DIALMODE_MASK;   /* first all bits off */
                if (cfg->dialmode && !(cfg->dialmode & ISDN_NET_DIALMODE_MASK)) {
                        /* old isdnctrl version, where only 0 or 1 is given */
                        printk(KERN_WARNING
-                            "Old isdnctrl version detected! Please update.\n");
+                              "Old isdnctrl version detected! Please update.\n");
                        lp->flags |= ISDN_NET_DM_OFF; /* turn on `off' bit */
                }
                else {
@@ -2871,13 +2871,13 @@ isdn_net_setcfg(isdn_net_ioctl_cfg * cfg)
                if (cfg->p_encap != lp->p_encap) {
                        if (cfg->p_encap == ISDN_NET_ENCAP_RAWIP) {
                                p->dev->header_ops = NULL;
-                               p->dev->flags = IFF_NOARP|IFF_POINTOPOINT;
+                               p->dev->flags = IFF_NOARP | IFF_POINTOPOINT;
                        } else {
                                p->dev->header_ops = &isdn_header_ops;
                                if (cfg->p_encap == ISDN_NET_ENCAP_ETHER)
                                        p->dev->flags = IFF_BROADCAST | IFF_MULTICAST;
                                else
-                                       p->dev->flags = IFF_NOARP|IFF_POINTOPOINT;
+                                       p->dev->flags = IFF_NOARP | IFF_POINTOPOINT;
                        }
                }
                lp->p_encap = cfg->p_encap;
@@ -2890,7 +2890,7 @@ isdn_net_setcfg(isdn_net_ioctl_cfg * cfg)
  * Perform get-interface-parameters.ioctl
  */
 int
-isdn_net_getcfg(isdn_net_ioctl_cfg * cfg)
+isdn_net_getcfg(isdn_net_ioctl_cfg *cfg)
 {
        isdn_net_dev *p = isdn_net_findif(cfg->name);
 
@@ -2924,7 +2924,7 @@ isdn_net_getcfg(isdn_net_ioctl_cfg * cfg)
                cfg->triggercps = lp->triggercps;
                cfg->slavedelay = lp->slavedelay / HZ;
                cfg->chargeint = (lp->hupflags & ISDN_CHARGEHUP) ?
-                   (lp->chargeint / HZ) : 0;
+                       (lp->chargeint / HZ) : 0;
                cfg->pppbind = lp->pppbind;
                cfg->dialtimeout = lp->dialtimeout >= 0 ? lp->dialtimeout / HZ : -1;
                cfg->dialwait = lp->dialwait / HZ;
@@ -2951,7 +2951,7 @@ isdn_net_getcfg(isdn_net_ioctl_cfg * cfg)
  * Add a phone-number to an interface.
  */
 int
-isdn_net_addphone(isdn_net_ioctl_phone * phone)
+isdn_net_addphone(isdn_net_ioctl_phone *phone)
 {
        isdn_net_dev *p = isdn_net_findif(phone->name);
        isdn_net_phone *n;
@@ -2972,7 +2972,7 @@ isdn_net_addphone(isdn_net_ioctl_phone * phone)
  * This might sleep and must be called with the isdn semaphore down.
  */
 int
-isdn_net_getphones(isdn_net_ioctl_phone * phone, char __user *phones)
+isdn_net_getphones(isdn_net_ioctl_phone *phone, char __user *phones)
 {
        isdn_net_dev *p = isdn_net_findif(phone->name);
        int inout = phone->outgoing & 1;
@@ -3015,15 +3015,15 @@ isdn_net_getpeer(isdn_net_ioctl_phone *phone, isdn_net_ioctl_phone __user *peer)
        /*
         * Theoretical race: while this executes, the remote number might
         * become invalid (hang up) or change (new connection), resulting
-         * in (partially) wrong number copied to user. This race
+        * in (partially) wrong number copied to user. This race
         * currently ignored.
         */
        ch = p->local->isdn_channel;
        dv = p->local->isdn_device;
-       if(ch < 0 && dv < 0)
+       if (ch < 0 && dv < 0)
                return -ENOTCONN;
        idx = isdn_dc2minor(dv, ch);
-       if (idx <0 )
+       if (idx < 0)
                return -ENODEV;
        /* for pre-bound channels, we need this extra check */
        if (strncmp(dev->num[idx], "???", 3) == 0)
@@ -3038,7 +3038,7 @@ isdn_net_getpeer(isdn_net_ioctl_phone *phone, isdn_net_ioctl_phone __user *peer)
  * Delete a phone-number from an interface.
  */
 int
-isdn_net_delphone(isdn_net_ioctl_phone * phone)
+isdn_net_delphone(isdn_net_ioctl_phone *phone)
 {
        isdn_net_dev *p = isdn_net_findif(phone->name);
        int inout = phone->outgoing & 1;
@@ -3071,7 +3071,7 @@ isdn_net_delphone(isdn_net_ioctl_phone * phone)
  * Delete all phone-numbers of an interface.
  */
 static int
-isdn_net_rmallphone(isdn_net_dev * p)
+isdn_net_rmallphone(isdn_net_dev *p)
 {
        isdn_net_phone *n;
        isdn_net_phone *m;
@@ -3118,7 +3118,7 @@ isdn_net_force_hangup(char *name)
  * Helper-function for isdn_net_rm: Do the real work.
  */
 static int
-isdn_net_realrm(isdn_net_dev * p, isdn_net_dev * q)
+isdn_net_realrm(isdn_net_dev *p, isdn_net_dev *q)
 {
        u_long flags;
 
@@ -3126,8 +3126,8 @@ isdn_net_realrm(isdn_net_dev * p, isdn_net_dev * q)
                return -EBUSY;
        }
 #ifdef CONFIG_ISDN_X25
-       if( p -> cprot && p -> cprot -> pops )
-               p -> cprot -> pops -> proto_del ( p -> cprot );
+       if (p->cprot && p->cprot->pops)
+               p->cprot->pops->proto_del(p->cprot);
 #endif
        /* Free all phone-entries */
        isdn_net_rmallphone(p);
index 7511f08..cca6d68 100644 (file)
@@ -11,7 +11,7 @@
  *
  */
 
-                             /* Definitions for hupflags:                */
+/* Definitions for hupflags:                */
 #define ISDN_WAITCHARGE  1      /* did not get a charge info yet            */
 #define ISDN_HAVECHARGE  2      /* We know a charge info                    */
 #define ISDN_CHARGEHUP   4      /* We want to use the charge mechanism      */
@@ -58,8 +58,8 @@ extern void isdn_net_write_super(isdn_net_local *lp, struct sk_buff *skb);
 
 #define ISDN_MASTER_PRIV(lp) ((isdn_net_local *) netdev_priv(lp->master))
 #define ISDN_SLAVE_PRIV(lp) ((isdn_net_local *) netdev_priv(lp->slave))
-#define MASTER_TO_SLAVE(master)        \
-                       (((isdn_net_local *) netdev_priv(master))->slave)
+#define MASTER_TO_SLAVE(master)                                        \
+       (((isdn_net_local *) netdev_priv(master))->slave)
 
 /*
  * is this particular channel busy?
@@ -68,7 +68,7 @@ static __inline__ int isdn_net_lp_busy(isdn_net_local *lp)
 {
        if (atomic_read(&lp->frame_cnt) < ISDN_NET_MAX_QUEUE_LENGTH)
                return 0;
-       else 
+       else
                return 1;
 }
 
@@ -76,7 +76,7 @@ static __inline__ int isdn_net_lp_busy(isdn_net_local *lp)
  * For the given net device, this will get a non-busy channel out of the
  * corresponding bundle. The returned channel is locked.
  */
-static __inline__ isdn_net_local * isdn_net_get_locked_lp(isdn_net_dev *nd)
+static __inline__ isdn_net_local *isdn_net_get_locked_lp(isdn_net_dev *nd)
 {
        unsigned long flags;
        isdn_net_local *lp;
@@ -149,4 +149,3 @@ static __inline__ void isdn_net_rm_from_bundle(isdn_net_local *lp)
 //             __func__, master_lp->netdev->queue);
        spin_unlock_irqrestore(&master_lp->netdev->queue_lock, flags);
 }
-
index 1b002b0..a1e7601 100644 (file)
 /* Prototypes */
 static int isdn_ppp_fill_rq(unsigned char *buf, int len, int proto, int slot);
 static int isdn_ppp_closewait(int slot);
-static void isdn_ppp_push_higher(isdn_net_dev * net_dev, isdn_net_local * lp,
+static void isdn_ppp_push_higher(isdn_net_dev *net_dev, isdn_net_local *lp,
                                 struct sk_buff *skb, int proto);
 static int isdn_ppp_if_get_unit(char *namebuf);
-static int isdn_ppp_set_compressor(struct ippp_struct *is,struct isdn_ppp_comp_data *);
+static int isdn_ppp_set_compressor(struct ippp_struct *is, struct isdn_ppp_comp_data *);
 static struct sk_buff *isdn_ppp_decompress(struct sk_buff *,
-                               struct ippp_struct *,struct ippp_struct *,int *proto);
-static void isdn_ppp_receive_ccp(isdn_net_dev * net_dev, isdn_net_local * lp,
-                               struct sk_buff *skb,int proto);
-static struct sk_buff *isdn_ppp_compress(struct sk_buff *skb_in,int *proto,
-       struct ippp_struct *is,struct ippp_struct *master,int type);
+                                          struct ippp_struct *, struct ippp_struct *, int *proto);
+static void isdn_ppp_receive_ccp(isdn_net_dev *net_dev, isdn_net_local *lp,
+                                struct sk_buff *skb, int proto);
+static struct sk_buff *isdn_ppp_compress(struct sk_buff *skb_in, int *proto,
+                                        struct ippp_struct *is, struct ippp_struct *master, int type);
 static void isdn_ppp_send_ccp(isdn_net_dev *net_dev, isdn_net_local *lp,
-        struct sk_buff *skb);
+                             struct sk_buff *skb);
 
 /* New CCP stuff */
 static void isdn_ppp_ccp_kickup(struct ippp_struct *is);
@@ -52,7 +52,7 @@ static void isdn_ppp_ccp_reset_free_state(struct ippp_struct *is,
                                          unsigned char id);
 static void isdn_ppp_ccp_timer_callback(unsigned long closure);
 static struct ippp_ccp_reset_state *isdn_ppp_ccp_reset_alloc_state(struct ippp_struct *is,
-                                                     unsigned char id);
+                                                                  unsigned char id);
 static void isdn_ppp_ccp_reset_trans(struct ippp_struct *is,
                                     struct isdn_ppp_resetparams *rp);
 static void isdn_ppp_ccp_reset_ack_rcvd(struct ippp_struct *is,
@@ -61,17 +61,17 @@ static void isdn_ppp_ccp_reset_ack_rcvd(struct ippp_struct *is,
 
 
 #ifdef CONFIG_ISDN_MPP
-static ippp_bundle * isdn_ppp_bundle_arr = NULL;
+static ippp_bundle *isdn_ppp_bundle_arr = NULL;
+
 static int isdn_ppp_mp_bundle_array_init(void);
-static int isdn_ppp_mp_init( isdn_net_local * lp, ippp_bundle * add_to );
-static void isdn_ppp_mp_receive(isdn_net_dev * net_dev, isdn_net_local * lp, 
-                                                       struct sk_buff *skb);
-static void isdn_ppp_mp_cleanup( isdn_net_local * lp );
+static int isdn_ppp_mp_init(isdn_net_local *lp, ippp_bundle *add_to);
+static void isdn_ppp_mp_receive(isdn_net_dev *net_dev, isdn_net_local *lp,
+                               struct sk_buff *skb);
+static void isdn_ppp_mp_cleanup(isdn_net_local *lp);
 
 static int isdn_ppp_bundle(struct ippp_struct *, int unit);
 #endif /* CONFIG_ISDN_MPP */
-  
+
 char *isdn_ppp_revision = "$Revision: 1.1.2.3 $";
 
 static struct ippp_struct *ippp_table[ISDN_MAX_CHANNELS];
@@ -82,11 +82,11 @@ static struct isdn_ppp_compressor *ipc_head = NULL;
  * frame log (debug)
  */
 static void
-isdn_ppp_frame_log(char *info, char *data, int len, int maxlen,int unit,int slot)
+isdn_ppp_frame_log(char *info, char *data, int len, int maxlen, int unit, int slot)
 {
        int cnt,
-        j,
-        i;
+               j,
+               i;
        char buf[80];
 
        if (len < maxlen)
@@ -94,8 +94,8 @@ isdn_ppp_frame_log(char *info, char *data, int len, int maxlen,int unit,int slot
 
        for (i = 0, cnt = 0; cnt < maxlen; i++) {
                for (j = 0; j < 16 && cnt < maxlen; j++, cnt++)
-                       sprintf(buf + j * 3, "%02x ", (unsigned char) data[cnt]);
-               printk(KERN_DEBUG "[%d/%d].%s[%d]: %s\n",unit,slot, info, i, buf);
+                       sprintf(buf + j * 3, "%02x ", (unsigned char)data[cnt]);
+               printk(KERN_DEBUG "[%d/%d].%s[%d]: %s\n", unit, slot, info, i, buf);
        }
 }
 
@@ -105,13 +105,13 @@ isdn_ppp_frame_log(char *info, char *data, int len, int maxlen,int unit,int slot
  *       in this case we bind another lp to the master device
  */
 int
-isdn_ppp_free(isdn_net_local * lp)
+isdn_ppp_free(isdn_net_local *lp)
 {
        struct ippp_struct *is;
 
        if (lp->ppp_slot < 0 || lp->ppp_slot >= ISDN_MAX_CHANNELS) {
                printk(KERN_ERR "%s: ppp_slot(%d) out of range\n",
-                       __func__, lp->ppp_slot);
+                      __func__, lp->ppp_slot);
                return 0;
        }
 
@@ -128,7 +128,7 @@ isdn_ppp_free(isdn_net_local * lp)
 #endif /* CONFIG_ISDN_MPP */
        if (lp->ppp_slot < 0 || lp->ppp_slot >= ISDN_MAX_CHANNELS) {
                printk(KERN_ERR "%s: ppp_slot(%d) now invalid\n",
-                       __func__, lp->ppp_slot);
+                      __func__, lp->ppp_slot);
                return 0;
        }
        is = ippp_table[lp->ppp_slot];
@@ -153,7 +153,7 @@ isdn_ppp_free(isdn_net_local * lp)
  * no additional lock is needed
  */
 int
-isdn_ppp_bind(isdn_net_local * lp)
+isdn_ppp_bind(isdn_net_local *lp)
 {
        int i;
        int unit = 0;
@@ -195,11 +195,11 @@ isdn_ppp_bind(isdn_net_local * lp)
        unit = isdn_ppp_if_get_unit(lp->netdev->dev->name);
        if (unit < 0) {
                printk(KERN_ERR "isdn_ppp_bind: illegal interface name %s.\n",
-                       lp->netdev->dev->name);
+                      lp->netdev->dev->name);
                retval = -1;
                goto out;
        }
-       
+
        lp->ppp_slot = i;
        is = ippp_table[i];
        is->lp = lp;
@@ -213,7 +213,7 @@ isdn_ppp_bind(isdn_net_local * lp)
 
        retval = lp->ppp_slot;
 
- out:
+out:
        return retval;
 }
 
@@ -223,11 +223,11 @@ isdn_ppp_bind(isdn_net_local * lp)
  */
 
 void
-isdn_ppp_wakeup_daemon(isdn_net_local * lp)
+isdn_ppp_wakeup_daemon(isdn_net_local *lp)
 {
        if (lp->ppp_slot < 0 || lp->ppp_slot >= ISDN_MAX_CHANNELS) {
                printk(KERN_ERR "%s: ppp_slot(%d) out of range\n",
-                       __func__, lp->ppp_slot);
+                      __func__, lp->ppp_slot);
                return;
        }
        ippp_table[lp->ppp_slot]->state = IPPP_OPEN | IPPP_CONNECT | IPPP_NOBLOCK;
@@ -246,7 +246,7 @@ isdn_ppp_closewait(int slot)
 
        if (slot < 0 || slot >= ISDN_MAX_CHANNELS) {
                printk(KERN_ERR "%s: slot(%d) out of range\n",
-                       __func__, slot);
+                      __func__, slot);
                return 0;
        }
        is = ippp_table[slot];
@@ -289,7 +289,7 @@ isdn_ppp_open(int min, struct file *file)
                return -EBUSY;
        }
        is = file->private_data = ippp_table[slot];
-       
+
        printk(KERN_DEBUG "ippp, open, slot: %d, minor: %d, state: %04x\n",
               slot, min, is->state);
 
@@ -385,21 +385,21 @@ isdn_ppp_release(int min, struct file *file)
 #endif
 
 /* TODO: if this was the previous master: link the stuff to the new master */
-       if(is->comp_stat)
+       if (is->comp_stat)
                is->compressor->free(is->comp_stat);
-       if(is->link_comp_stat)
+       if (is->link_comp_stat)
                is->link_compressor->free(is->link_comp_stat);
-       if(is->link_decomp_stat)
+       if (is->link_decomp_stat)
                is->link_decompressor->free(is->link_decomp_stat);
-       if(is->decomp_stat)
+       if (is->decomp_stat)
                is->decompressor->free(is->decomp_stat);
-        is->compressor   = is->link_compressor   = NULL;
-        is->decompressor = is->link_decompressor = NULL;
+       is->compressor   = is->link_compressor   = NULL;
+       is->decompressor = is->link_decompressor = NULL;
        is->comp_stat    = is->link_comp_stat    = NULL;
-        is->decomp_stat  = is->link_decomp_stat  = NULL;
+       is->decomp_stat  = is->link_decomp_stat  = NULL;
 
        /* Clean up if necessary */
-       if(is->reset)
+       if (is->reset)
                isdn_ppp_ccp_reset_free(is);
 
        /* this slot is ready for new connections */
@@ -423,9 +423,9 @@ get_arg(void __user *b, void *val, int len)
  * set arg .. ioctl helper
  */
 static int
-set_arg(void __user *b, void *val,int len)
+set_arg(void __user *b, void *val, int len)
 {
-       if(len <= 0)
+       if (len <= 0)
                len = sizeof(void *);
        if (copy_to_user(b, val, len))
                return -EFAULT;
@@ -471,7 +471,7 @@ int
 isdn_ppp_ioctl(int min, struct file *file, unsigned int cmd, unsigned long arg)
 {
        unsigned long val;
-       int r,i,j;
+       int r, i, j;
        struct ippp_struct *is;
        isdn_net_local *lp;
        struct isdn_ppp_comp_data data;
@@ -487,177 +487,177 @@ isdn_ppp_ioctl(int min, struct file *file, unsigned int cmd, unsigned long arg)
                return -EINVAL;
 
        switch (cmd) {
-               case PPPIOCBUNDLE:
+       case PPPIOCBUNDLE:
 #ifdef CONFIG_ISDN_MPP
-                       if (!(is->state & IPPP_CONNECT))
-                               return -EINVAL;
-                       if ((r = get_arg(argp, &val, sizeof(val) )))
-                               return r;
-                       printk(KERN_DEBUG "iPPP-bundle: minor: %d, slave unit: %d, master unit: %d\n",
-                              (int) min, (int) is->unit, (int) val);
-                       return isdn_ppp_bundle(is, val);
+               if (!(is->state & IPPP_CONNECT))
+                       return -EINVAL;
+               if ((r = get_arg(argp, &val, sizeof(val))))
+                       return r;
+               printk(KERN_DEBUG "iPPP-bundle: minor: %d, slave unit: %d, master unit: %d\n",
+                      (int) min, (int) is->unit, (int) val);
+               return isdn_ppp_bundle(is, val);
 #else
-                       return -1;
+               return -1;
 #endif
-                       break;
-               case PPPIOCGUNIT:       /* get ppp/isdn unit number */
-                       if ((r = set_arg(argp, &is->unit, sizeof(is->unit) )))
-                               return r;
-                       break;
-               case PPPIOCGIFNAME:
-                       if(!lp)
-                               return -EINVAL;
-                       if ((r = set_arg(argp, lp->netdev->dev->name,
-                               strlen(lp->netdev->dev->name))))
-                               return r;
-                       break;
-               case PPPIOCGMPFLAGS:    /* get configuration flags */
-                       if ((r = set_arg(argp, &is->mpppcfg, sizeof(is->mpppcfg) )))
-                               return r;
-                       break;
-               case PPPIOCSMPFLAGS:    /* set configuration flags */
-                       if ((r = get_arg(argp, &val, sizeof(val) )))
-                               return r;
-                       is->mpppcfg = val;
-                       break;
-               case PPPIOCGFLAGS:      /* get configuration flags */
-                       if ((r = set_arg(argp, &is->pppcfg,sizeof(is->pppcfg) )))
-                               return r;
-                       break;
-               case PPPIOCSFLAGS:      /* set configuration flags */
-                       if ((r = get_arg(argp, &val, sizeof(val) ))) {
-                               return r;
-                       }
-                       if (val & SC_ENABLE_IP && !(is->pppcfg & SC_ENABLE_IP) && (is->state & IPPP_CONNECT)) {
-                               if (lp) {
-                                       /* OK .. we are ready to send buffers */
-                                       is->pppcfg = val; /* isdn_ppp_xmit test for SC_ENABLE_IP !!! */
-                                       netif_wake_queue(lp->netdev->dev);
-                                       break;
-                               }
-                       }
-                       is->pppcfg = val;
-                       break;
-               case PPPIOCGIDLE:       /* get idle time information */
+               break;
+       case PPPIOCGUNIT:       /* get ppp/isdn unit number */
+               if ((r = set_arg(argp, &is->unit, sizeof(is->unit))))
+                       return r;
+               break;
+       case PPPIOCGIFNAME:
+               if (!lp)
+                       return -EINVAL;
+               if ((r = set_arg(argp, lp->netdev->dev->name,
+                                strlen(lp->netdev->dev->name))))
+                       return r;
+               break;
+       case PPPIOCGMPFLAGS:    /* get configuration flags */
+               if ((r = set_arg(argp, &is->mpppcfg, sizeof(is->mpppcfg))))
+                       return r;
+               break;
+       case PPPIOCSMPFLAGS:    /* set configuration flags */
+               if ((r = get_arg(argp, &val, sizeof(val))))
+                       return r;
+               is->mpppcfg = val;
+               break;
+       case PPPIOCGFLAGS:      /* get configuration flags */
+               if ((r = set_arg(argp, &is->pppcfg, sizeof(is->pppcfg))))
+                       return r;
+               break;
+       case PPPIOCSFLAGS:      /* set configuration flags */
+               if ((r = get_arg(argp, &val, sizeof(val)))) {
+                       return r;
+               }
+               if (val & SC_ENABLE_IP && !(is->pppcfg & SC_ENABLE_IP) && (is->state & IPPP_CONNECT)) {
                        if (lp) {
-                               struct ppp_idle pidle;
-                               pidle.xmit_idle = pidle.recv_idle = lp->huptimer;
-                               if ((r = set_arg(argp, &pidle,sizeof(struct ppp_idle))))
-                                        return r;
+                               /* OK .. we are ready to send buffers */
+                               is->pppcfg = val; /* isdn_ppp_xmit test for SC_ENABLE_IP !!! */
+                               netif_wake_queue(lp->netdev->dev);
+                               break;
                        }
-                       break;
-               case PPPIOCSMRU:        /* set receive unit size for PPP */
-                       if ((r = get_arg(argp, &val, sizeof(val) )))
-                               return r;
-                       is->mru = val;
-                       break;
-               case PPPIOCSMPMRU:
-                       break;
-               case PPPIOCSMPMTU:
-                       break;
-               case PPPIOCSMAXCID:     /* set the maximum compression slot id */
-                       if ((r = get_arg(argp, &val, sizeof(val) )))
+               }
+               is->pppcfg = val;
+               break;
+       case PPPIOCGIDLE:       /* get idle time information */
+               if (lp) {
+                       struct ppp_idle pidle;
+                       pidle.xmit_idle = pidle.recv_idle = lp->huptimer;
+                       if ((r = set_arg(argp, &pidle, sizeof(struct ppp_idle))))
                                return r;
-                       val++;
-                       if (is->maxcid != val) {
+               }
+               break;
+       case PPPIOCSMRU:        /* set receive unit size for PPP */
+               if ((r = get_arg(argp, &val, sizeof(val))))
+                       return r;
+               is->mru = val;
+               break;
+       case PPPIOCSMPMRU:
+               break;
+       case PPPIOCSMPMTU:
+               break;
+       case PPPIOCSMAXCID:     /* set the maximum compression slot id */
+               if ((r = get_arg(argp, &val, sizeof(val))))
+                       return r;
+               val++;
+               if (is->maxcid != val) {
 #ifdef CONFIG_ISDN_PPP_VJ
-                               struct slcompress *sltmp;
+                       struct slcompress *sltmp;
 #endif
-                               if (is->debug & 0x1)
-                                       printk(KERN_DEBUG "ippp, ioctl: changed MAXCID to %ld\n", val);
-                               is->maxcid = val;
+                       if (is->debug & 0x1)
+                               printk(KERN_DEBUG "ippp, ioctl: changed MAXCID to %ld\n", val);
+                       is->maxcid = val;
 #ifdef CONFIG_ISDN_PPP_VJ
-                               sltmp = slhc_init(16, val);
-                               if (!sltmp) {
-                                       printk(KERN_ERR "ippp, can't realloc slhc struct\n");
-                                       return -ENOMEM;
-                               }
-                               if (is->slcomp)
-                                       slhc_free(is->slcomp);
-                               is->slcomp = sltmp;
-#endif
-                       }
-                       break;
-               case PPPIOCGDEBUG:
-                       if ((r = set_arg(argp, &is->debug, sizeof(is->debug) )))
-                               return r;
-                       break;
-               case PPPIOCSDEBUG:
-                       if ((r = get_arg(argp, &val, sizeof(val) )))
-                               return r;
-                       is->debug = val;
-                       break;
-               case PPPIOCGCOMPRESSORS:
-                       {
-                               unsigned long protos[8] = {0,};
-                               struct isdn_ppp_compressor *ipc = ipc_head;
-                               while(ipc) {
-                                       j = ipc->num / (sizeof(long)*8);
-                                       i = ipc->num % (sizeof(long)*8);
-                                       if(j < 8)
-                                               protos[j] |= (0x1<<i);
-                                       ipc = ipc->next;
-                               }
-                               if ((r = set_arg(argp,protos,8*sizeof(long) )))
-                                       return r;
+                       sltmp = slhc_init(16, val);
+                       if (!sltmp) {
+                               printk(KERN_ERR "ippp, can't realloc slhc struct\n");
+                               return -ENOMEM;
                        }
-                       break;
-               case PPPIOCSCOMPRESSOR:
-                       if ((r = get_arg(argp, &data, sizeof(struct isdn_ppp_comp_data))))
-                               return r;
-                       return isdn_ppp_set_compressor(is, &data);
-               case PPPIOCGCALLINFO:
-                       {
-                               struct pppcallinfo pci;
-                               memset((char *) &pci,0,sizeof(struct pppcallinfo));
-                               if(lp)
-                               {
-                                       strncpy(pci.local_num,lp->msn,63);
-                                       if(lp->dial) {
-                                               strncpy(pci.remote_num,lp->dial->num,63);
-                                       }
-                                       pci.charge_units = lp->charge;
-                                       if(lp->outgoing)
-                                               pci.calltype = CALLTYPE_OUTGOING;
-                                       else
-                                               pci.calltype = CALLTYPE_INCOMING;
-                                       if(lp->flags & ISDN_NET_CALLBACK)
-                                               pci.calltype |= CALLTYPE_CALLBACK;
-                               }
-                               return set_arg(argp,&pci,sizeof(struct pppcallinfo));
+                       if (is->slcomp)
+                               slhc_free(is->slcomp);
+                       is->slcomp = sltmp;
+#endif
+               }
+               break;
+       case PPPIOCGDEBUG:
+               if ((r = set_arg(argp, &is->debug, sizeof(is->debug))))
+                       return r;
+               break;
+       case PPPIOCSDEBUG:
+               if ((r = get_arg(argp, &val, sizeof(val))))
+                       return r;
+               is->debug = val;
+               break;
+       case PPPIOCGCOMPRESSORS:
+       {
+               unsigned long protos[8] = {0,};
+               struct isdn_ppp_compressor *ipc = ipc_head;
+               while (ipc) {
+                       j = ipc->num / (sizeof(long) * 8);
+                       i = ipc->num % (sizeof(long) * 8);
+                       if (j < 8)
+                               protos[j] |= (0x1 << i);
+                       ipc = ipc->next;
+               }
+               if ((r = set_arg(argp, protos, 8 * sizeof(long))))
+                       return r;
+       }
+       break;
+       case PPPIOCSCOMPRESSOR:
+               if ((r = get_arg(argp, &data, sizeof(struct isdn_ppp_comp_data))))
+                       return r;
+               return isdn_ppp_set_compressor(is, &data);
+       case PPPIOCGCALLINFO:
+       {
+               struct pppcallinfo pci;
+               memset((char *)&pci, 0, sizeof(struct pppcallinfo));
+               if (lp)
+               {
+                       strncpy(pci.local_num, lp->msn, 63);
+                       if (lp->dial) {
+                               strncpy(pci.remote_num, lp->dial->num, 63);
                        }
+                       pci.charge_units = lp->charge;
+                       if (lp->outgoing)
+                               pci.calltype = CALLTYPE_OUTGOING;
+                       else
+                               pci.calltype = CALLTYPE_INCOMING;
+                       if (lp->flags & ISDN_NET_CALLBACK)
+                               pci.calltype |= CALLTYPE_CALLBACK;
+               }
+               return set_arg(argp, &pci, sizeof(struct pppcallinfo));
+       }
 #ifdef CONFIG_IPPP_FILTER
-               case PPPIOCSPASS:
-                       {
-                               struct sock_filter *code;
-                               int len = get_filter(argp, &code);
-                               if (len < 0)
-                                       return len;
-                               kfree(is->pass_filter);
-                               is->pass_filter = code;
-                               is->pass_len = len;
-                               break;
-                       }
-               case PPPIOCSACTIVE:
-                       {
-                               struct sock_filter *code;
-                               int len = get_filter(argp, &code);
-                               if (len < 0)
-                                       return len;
-                               kfree(is->active_filter);
-                               is->active_filter = code;
-                               is->active_len = len;
-                               break;
-                       }
+       case PPPIOCSPASS:
+       {
+               struct sock_filter *code;
+               int len = get_filter(argp, &code);
+               if (len < 0)
+                       return len;
+               kfree(is->pass_filter);
+               is->pass_filter = code;
+               is->pass_len = len;
+               break;
+       }
+       case PPPIOCSACTIVE:
+       {
+               struct sock_filter *code;
+               int len = get_filter(argp, &code);
+               if (len < 0)
+                       return len;
+               kfree(is->active_filter);
+               is->active_filter = code;
+               is->active_len = len;
+               break;
+       }
 #endif /* CONFIG_IPPP_FILTER */
-               default:
-                       break;
+       default:
+               break;
        }
        return 0;
 }
 
 unsigned int
-isdn_ppp_poll(struct file *file, poll_table * wait)
+isdn_ppp_poll(struct file *file, poll_table *wait)
 {
        u_int mask;
        struct ippp_buf_queue *bf, *bl;
@@ -668,13 +668,13 @@ isdn_ppp_poll(struct file *file, poll_table * wait)
 
        if (is->debug & 0x2)
                printk(KERN_DEBUG "isdn_ppp_poll: minor: %d\n",
-                               iminor(file->f_path.dentry->d_inode));
+                      iminor(file->f_path.dentry->d_inode));
 
        /* just registers wait_queue hook. This doesn't really wait. */
        poll_wait(file, &is->wq, wait);
 
        if (!(is->state & IPPP_OPEN)) {
-               if(is->state == IPPP_CLOSEWAIT)
+               if (is->state == IPPP_CLOSEWAIT)
                        return POLLHUP;
                printk(KERN_DEBUG "isdn_ppp: device not open\n");
                return POLLERR;
@@ -827,7 +827,7 @@ isdn_ppp_write(int min, struct file *file, const char __user *buf, int count)
                        return 0;
 
                if ((dev->drv[lp->isdn_device]->flags & DRV_FLAG_RUNNING) &&
-                       lp->dialstate == 0 &&
+                   lp->dialstate == 0 &&
                    (lp->flags & ISDN_NET_CONNECTED)) {
                        unsigned short hl;
                        struct sk_buff *skb;
@@ -837,7 +837,7 @@ isdn_ppp_write(int min, struct file *file, const char __user *buf, int count)
                         * 16 bytes, now we are looking what the driver want
                         */
                        hl = dev->drv[lp->isdn_device]->interface->hl_hdrlen;
-                       skb = alloc_skb(hl+count, GFP_ATOMIC);
+                       skb = alloc_skb(hl + count, GFP_ATOMIC);
                        if (!skb) {
                                printk(KERN_WARNING "isdn_ppp_write: out of memory!\n");
                                return count;
@@ -850,10 +850,10 @@ isdn_ppp_write(int min, struct file *file, const char __user *buf, int count)
                        }
                        if (is->debug & 0x40) {
                                printk(KERN_DEBUG "ppp xmit: len %d\n", (int) skb->len);
-                               isdn_ppp_frame_log("xmit", skb->data, skb->len, 32,is->unit,lp->ppp_slot);
+                               isdn_ppp_frame_log("xmit", skb->data, skb->len, 32, is->unit, lp->ppp_slot);
                        }
 
-                       isdn_ppp_send_ccp(lp->netdev,lp,skb); /* keeps CCP/compression states in sync */
+                       isdn_ppp_send_ccp(lp->netdev, lp, skb); /* keeps CCP/compression states in sync */
 
                        isdn_net_write_super(lp, skb);
                }
@@ -869,10 +869,10 @@ int
 isdn_ppp_init(void)
 {
        int i,
-        j;
-        
+               j;
+
 #ifdef CONFIG_ISDN_MPP
-       if( isdn_ppp_mp_bundle_array_init() < 0 )
+       if (isdn_ppp_mp_bundle_array_init() < 0)
                return -ENOMEM;
 #endif /* CONFIG_ISDN_MPP */
 
@@ -891,7 +891,7 @@ isdn_ppp_init(void)
                for (j = 0; j < NUM_RCV_BUFFS; j++) {
                        ippp_table[i]->rq[j].buf = NULL;
                        ippp_table[i]->rq[j].last = ippp_table[i]->rq +
-                           (NUM_RCV_BUFFS + j - 1) % NUM_RCV_BUFFS;
+                               (NUM_RCV_BUFFS + j - 1) % NUM_RCV_BUFFS;
                        ippp_table[i]->rq[j].next = ippp_table[i]->rq + (j + 1) % NUM_RCV_BUFFS;
                }
        }
@@ -916,7 +916,7 @@ isdn_ppp_cleanup(void)
  * check for address/control field and skip if allowed
  * retval != 0 -> discard packet silently
  */
-static int isdn_ppp_skip_ac(struct ippp_struct *is, struct sk_buff *skb) 
+static int isdn_ppp_skip_ac(struct ippp_struct *is, struct sk_buff *skb)
 {
        if (skb->len < 1)
                return -1;
@@ -930,7 +930,7 @@ static int isdn_ppp_skip_ac(struct ippp_struct *is, struct sk_buff *skb)
 
                // skip address/control (AC) field
                skb_pull(skb, 2);
-       } else { 
+       } else {
                if (is->pppcfg & SC_REJ_COMP_AC)
                        // if AC compression was not negotiated, but used, discard packet
                        return -1;
@@ -942,10 +942,10 @@ static int isdn_ppp_skip_ac(struct ippp_struct *is, struct sk_buff *skb)
  * get the PPP protocol header and pull skb
  * retval < 0 -> discard packet silently
  */
-static int isdn_ppp_strip_proto(struct sk_buff *skb) 
+static int isdn_ppp_strip_proto(struct sk_buff *skb)
 {
        int proto;
-       
+
        if (skb->len < 1)
                return -1;
 
@@ -966,7 +966,7 @@ static int isdn_ppp_strip_proto(struct sk_buff *skb)
 /*
  * handler for incoming packets on a syncPPP interface
  */
-void isdn_ppp_receive(isdn_net_dev * net_dev, isdn_net_local * lp, struct sk_buff *skb)
+void isdn_ppp_receive(isdn_net_dev *net_dev, isdn_net_local *lp, struct sk_buff *skb)
 {
        struct ippp_struct *is;
        int slot;
@@ -977,7 +977,7 @@ void isdn_ppp_receive(isdn_net_dev * net_dev, isdn_net_local * lp, struct sk_buf
        slot = lp->ppp_slot;
        if (slot < 0 || slot >= ISDN_MAX_CHANNELS) {
                printk(KERN_ERR "isdn_ppp_receive: lp->ppp_slot(%d)\n",
-                       lp->ppp_slot);
+                      lp->ppp_slot);
                kfree_skb(skb);
                return;
        }
@@ -985,35 +985,35 @@ void isdn_ppp_receive(isdn_net_dev * net_dev, isdn_net_local * lp, struct sk_buf
 
        if (is->debug & 0x4) {
                printk(KERN_DEBUG "ippp_receive: is:%08lx lp:%08lx slot:%d unit:%d len:%d\n",
-                      (long)is,(long)lp,lp->ppp_slot,is->unit,(int) skb->len);
-               isdn_ppp_frame_log("receive", skb->data, skb->len, 32,is->unit,lp->ppp_slot);
-       }
-
-       if (isdn_ppp_skip_ac(is, skb) < 0) {
-               kfree_skb(skb);
-               return;
-       }
-       proto = isdn_ppp_strip_proto(skb);
-       if (proto < 0) {
-               kfree_skb(skb);
-               return;
-       }
-  
+                      (long)is, (long)lp, lp->ppp_slot, is->unit, (int)skb->len);
+               isdn_ppp_frame_log("receive", skb->data, skb->len, 32, is->unit, lp->ppp_slot);
+       }
+
+       if (isdn_ppp_skip_ac(is, skb) < 0) {
+               kfree_skb(skb);
+               return;
+       }
+       proto = isdn_ppp_strip_proto(skb);
+       if (proto < 0) {
+               kfree_skb(skb);
+               return;
+       }
+
 #ifdef CONFIG_ISDN_MPP
-       if (is->compflags & SC_LINK_DECOMP_ON) {
-               skb = isdn_ppp_decompress(skb, is, NULL, &proto);
-               if (!skb) // decompression error
-                       return;
-       }
-       
-       if (!(is->mpppcfg & SC_REJ_MP_PROT)) { // we agreed to receive MPPP
-               if (proto == PPP_MP) {
-                       isdn_ppp_mp_receive(net_dev, lp, skb);
-                       return;
-               }
-       } 
+       if (is->compflags & SC_LINK_DECOMP_ON) {
+               skb = isdn_ppp_decompress(skb, is, NULL, &proto);
+               if (!skb) // decompression error
+                       return;
+       }
+
+       if (!(is->mpppcfg & SC_REJ_MP_PROT)) { // we agreed to receive MPPP
+               if (proto == PPP_MP) {
+                       isdn_ppp_mp_receive(net_dev, lp, skb);
+                       return;
+               }
+       }
 #endif
-       isdn_ppp_push_higher(net_dev, lp, skb, proto);
+       isdn_ppp_push_higher(net_dev, lp, skb, proto);
 }
 
 /*
@@ -1022,116 +1022,116 @@ void isdn_ppp_receive(isdn_net_dev * net_dev, isdn_net_local * lp, struct sk_buf
  * note: net_dev has to be master net_dev
  */
 static void
-isdn_ppp_push_higher(isdn_net_dev * net_dev, isdn_net_local * lp, struct sk_buff *skb, int proto)
+isdn_ppp_push_higher(isdn_net_dev *net_dev, isdn_net_local *lp, struct sk_buff *skb, int proto)
 {
        struct net_device *dev = net_dev->dev;
-       struct ippp_struct *is, *mis;
+       struct ippp_struct *is, *mis;
        isdn_net_local *mlp = NULL;
        int slot;
 
        slot = lp->ppp_slot;
        if (slot < 0 || slot >= ISDN_MAX_CHANNELS) {
                printk(KERN_ERR "isdn_ppp_push_higher: lp->ppp_slot(%d)\n",
-                       lp->ppp_slot);
+                      lp->ppp_slot);
                goto drop_packet;
        }
        is = ippp_table[slot];
-       
-       if (lp->master) { // FIXME?
+
+       if (lp->master) { // FIXME?
                mlp = ISDN_MASTER_PRIV(lp);
-               slot = mlp->ppp_slot;
-               if (slot < 0 || slot >= ISDN_MAX_CHANNELS) {
-                       printk(KERN_ERR "isdn_ppp_push_higher: master->ppp_slot(%d)\n",
-                               lp->ppp_slot);
+               slot = mlp->ppp_slot;
+               if (slot < 0 || slot >= ISDN_MAX_CHANNELS) {
+                       printk(KERN_ERR "isdn_ppp_push_higher: master->ppp_slot(%d)\n",
+                              lp->ppp_slot);
                        goto drop_packet;
-               }
-       }
-       mis = ippp_table[slot];
+               }
+       }
+       mis = ippp_table[slot];
 
        if (is->debug & 0x10) {
                printk(KERN_DEBUG "push, skb %d %04x\n", (int) skb->len, proto);
-               isdn_ppp_frame_log("rpush", skb->data, skb->len, 32,is->unit,lp->ppp_slot);
+               isdn_ppp_frame_log("rpush", skb->data, skb->len, 32, is->unit, lp->ppp_slot);
        }
        if (mis->compflags & SC_DECOMP_ON) {
                skb = isdn_ppp_decompress(skb, is, mis, &proto);
                if (!skb) // decompression error
-                       return;
-       }
+                       return;
+       }
        switch (proto) {
-               case PPP_IPX:  /* untested */
-                       if (is->debug & 0x20)
-                               printk(KERN_DEBUG "isdn_ppp: IPX\n");
-                       skb->protocol = htons(ETH_P_IPX);
-                       break;
-               case PPP_IP:
-                       if (is->debug & 0x20)
-                               printk(KERN_DEBUG "isdn_ppp: IP\n");
-                       skb->protocol = htons(ETH_P_IP);
-                       break;
-               case PPP_COMP:
-               case PPP_COMPFRAG:
-                       printk(KERN_INFO "isdn_ppp: unexpected compressed frame dropped\n");
-                       goto drop_packet;
+       case PPP_IPX:  /* untested */
+               if (is->debug & 0x20)
+                       printk(KERN_DEBUG "isdn_ppp: IPX\n");
+               skb->protocol = htons(ETH_P_IPX);
+               break;
+       case PPP_IP:
+               if (is->debug & 0x20)
+                       printk(KERN_DEBUG "isdn_ppp: IP\n");
+               skb->protocol = htons(ETH_P_IP);
+               break;
+       case PPP_COMP:
+       case PPP_COMPFRAG:
+               printk(KERN_INFO "isdn_ppp: unexpected compressed frame dropped\n");
+               goto drop_packet;
 #ifdef CONFIG_ISDN_PPP_VJ
-               case PPP_VJC_UNCOMP:
-                       if (is->debug & 0x20)
-                               printk(KERN_DEBUG "isdn_ppp: VJC_UNCOMP\n");
+       case PPP_VJC_UNCOMP:
+               if (is->debug & 0x20)
+                       printk(KERN_DEBUG "isdn_ppp: VJC_UNCOMP\n");
+               if (net_dev->local->ppp_slot < 0) {
+                       printk(KERN_ERR "%s: net_dev->local->ppp_slot(%d) out of range\n",
+                              __func__, net_dev->local->ppp_slot);
+                       goto drop_packet;
+               }
+               if (slhc_remember(ippp_table[net_dev->local->ppp_slot]->slcomp, skb->data, skb->len) <= 0) {
+                       printk(KERN_WARNING "isdn_ppp: received illegal VJC_UNCOMP frame!\n");
+                       goto drop_packet;
+               }
+               skb->protocol = htons(ETH_P_IP);
+               break;
+       case PPP_VJC_COMP:
+               if (is->debug & 0x20)
+                       printk(KERN_DEBUG "isdn_ppp: VJC_COMP\n");
+               {
+                       struct sk_buff *skb_old = skb;
+                       int pkt_len;
+                       skb = dev_alloc_skb(skb_old->len + 128);
+
+                       if (!skb) {
+                               printk(KERN_WARNING "%s: Memory squeeze, dropping packet.\n", dev->name);
+                               skb = skb_old;
+                               goto drop_packet;
+                       }
+                       skb_put(skb, skb_old->len + 128);
+                       skb_copy_from_linear_data(skb_old, skb->data,
+                                                 skb_old->len);
                        if (net_dev->local->ppp_slot < 0) {
                                printk(KERN_ERR "%s: net_dev->local->ppp_slot(%d) out of range\n",
-                                       __func__, net_dev->local->ppp_slot);
+                                      __func__, net_dev->local->ppp_slot);
                                goto drop_packet;
                        }
-                       if (slhc_remember(ippp_table[net_dev->local->ppp_slot]->slcomp, skb->data, skb->len) <= 0) {
-                               printk(KERN_WARNING "isdn_ppp: received illegal VJC_UNCOMP frame!\n");
+                       pkt_len = slhc_uncompress(ippp_table[net_dev->local->ppp_slot]->slcomp,
+                                                 skb->data, skb_old->len);
+                       kfree_skb(skb_old);
+                       if (pkt_len < 0)
                                goto drop_packet;
-                       }
+
+                       skb_trim(skb, pkt_len);
                        skb->protocol = htons(ETH_P_IP);
-                       break;
-               case PPP_VJC_COMP:
-                       if (is->debug & 0x20)
-                               printk(KERN_DEBUG "isdn_ppp: VJC_COMP\n");
-                       {
-                               struct sk_buff *skb_old = skb;
-                               int pkt_len;
-                               skb = dev_alloc_skb(skb_old->len + 128);
-
-                               if (!skb) {
-                                       printk(KERN_WARNING "%s: Memory squeeze, dropping packet.\n", dev->name);
-                                       skb = skb_old;
-                                       goto drop_packet;
-                               }
-                               skb_put(skb, skb_old->len + 128);
-                               skb_copy_from_linear_data(skb_old, skb->data,
-                                                         skb_old->len);
-                               if (net_dev->local->ppp_slot < 0) {
-                                       printk(KERN_ERR "%s: net_dev->local->ppp_slot(%d) out of range\n",
-                                               __func__, net_dev->local->ppp_slot);
-                                       goto drop_packet;
-                               }
-                               pkt_len = slhc_uncompress(ippp_table[net_dev->local->ppp_slot]->slcomp,
-                                               skb->data, skb_old->len);
-                               kfree_skb(skb_old);
-                               if (pkt_len < 0)
-                                       goto drop_packet;
-
-                               skb_trim(skb, pkt_len);
-                               skb->protocol = htons(ETH_P_IP);
-                       }
-                       break;
+               }
+               break;
 #endif
-               case PPP_CCP:
-               case PPP_CCPFRAG:
-                       isdn_ppp_receive_ccp(net_dev,lp,skb,proto);
-                       /* Dont pop up ResetReq/Ack stuff to the daemon any
-                          longer - the job is done already */
-                       if(skb->data[0] == CCP_RESETREQ ||
-                          skb->data[0] == CCP_RESETACK)
-                               break;
-                       /* fall through */
-               default:
-                       isdn_ppp_fill_rq(skb->data, skb->len, proto, lp->ppp_slot);     /* push data to pppd device */
-                       kfree_skb(skb);
-                       return;
+       case PPP_CCP:
+       case PPP_CCPFRAG:
+               isdn_ppp_receive_ccp(net_dev, lp, skb, proto);
+               /* Dont pop up ResetReq/Ack stuff to the daemon any
+                  longer - the job is done already */
+               if (skb->data[0] == CCP_RESETREQ ||
+                   skb->data[0] == CCP_RESETACK)
+                       break;
+               /* fall through */
+       default:
+               isdn_ppp_fill_rq(skb->data, skb->len, proto, lp->ppp_slot);     /* push data to pppd device */
+               kfree_skb(skb);
+               return;
        }
 
 #ifdef CONFIG_IPPP_FILTER
@@ -1156,7 +1156,7 @@ isdn_ppp_push_higher(isdn_net_dev * net_dev, isdn_net_local * lp, struct sk_buff
        if (!(is->active_filter
              && sk_run_filter(skb, is->active_filter) == 0)) {
                if (is->debug & 0x2)
-                       printk(KERN_DEBUG "IPPP: link-active filter: reseting huptimer.\n");
+                       printk(KERN_DEBUG "IPPP: link-active filter: resetting huptimer.\n");
                lp->huptimer = 0;
                if (mlp)
                        mlp->huptimer = 0;
@@ -1173,7 +1173,7 @@ isdn_ppp_push_higher(isdn_net_dev * net_dev, isdn_net_local * lp, struct sk_buff
        /* net_dev->local->stats.rx_packets++; done in isdn_net.c */
        return;
 
- drop_packet:
+drop_packet:
        net_dev->local->stats.rx_dropped++;
        kfree_skb(skb);
 }
@@ -1183,11 +1183,11 @@ isdn_ppp_push_higher(isdn_net_dev * net_dev, isdn_net_local * lp, struct sk_buff
  * checks whether we have enough space at the beginning of the skb
  * and allocs a new SKB if necessary
  */
-static unsigned char *isdn_ppp_skb_push(struct sk_buff **skb_p,int len)
+static unsigned char *isdn_ppp_skb_push(struct sk_buff **skb_p, int len)
 {
        struct sk_buff *skb = *skb_p;
 
-       if(skb_headroom(skb) < len) {
+       if (skb_headroom(skb) < len) {
                struct sk_buff *nskb = skb_realloc_headroom(skb, len);
 
                if (!nskb) {
@@ -1195,12 +1195,12 @@ static unsigned char *isdn_ppp_skb_push(struct sk_buff **skb_p,int len)
                        dev_kfree_skb(skb);
                        return NULL;
                }
-               printk(KERN_DEBUG "isdn_ppp_skb_push:under %d %d\n",skb_headroom(skb),len);
+               printk(KERN_DEBUG "isdn_ppp_skb_push:under %d %d\n", skb_headroom(skb), len);
                dev_kfree_skb(skb);
                *skb_p = nskb;
                return skb_push(nskb, len);
        }
-       return skb_push(skb,len);
+       return skb_push(skb, len);
 }
 
 /*
@@ -1214,10 +1214,10 @@ static unsigned char *isdn_ppp_skb_push(struct sk_buff **skb_p,int len)
 int
 isdn_ppp_xmit(struct sk_buff *skb, struct net_device *netdev)
 {
-       isdn_net_local *lp,*mlp;
+       isdn_net_local *lp, *mlp;
        isdn_net_dev *nd;
        unsigned int proto = PPP_IP;     /* 0x21 */
-       struct ippp_struct *ipt,*ipts;
+       struct ippp_struct *ipt, *ipts;
        int slot, retval = NETDEV_TX_OK;
 
        mlp = netdev_priv(netdev);
@@ -1226,7 +1226,7 @@ isdn_ppp_xmit(struct sk_buff *skb, struct net_device *netdev)
        slot = mlp->ppp_slot;
        if (slot < 0 || slot >= ISDN_MAX_CHANNELS) {
                printk(KERN_ERR "isdn_ppp_xmit: lp->ppp_slot(%d)\n",
-                       mlp->ppp_slot);
+                      mlp->ppp_slot);
                kfree_skb(skb);
                goto out;
        }
@@ -1240,17 +1240,17 @@ isdn_ppp_xmit(struct sk_buff *skb, struct net_device *netdev)
        }
 
        switch (ntohs(skb->protocol)) {
-               case ETH_P_IP:
-                       proto = PPP_IP;
-                       break;
-               case ETH_P_IPX:
-                       proto = PPP_IPX;        /* untested */
-                       break;
-               default:
-                       printk(KERN_ERR "isdn_ppp: skipped unsupported protocol: %#x.\n", 
-                              skb->protocol);
-                       dev_kfree_skb(skb);
-                       goto out;
+       case ETH_P_IP:
+               proto = PPP_IP;
+               break;
+       case ETH_P_IPX:
+               proto = PPP_IPX;        /* untested */
+               break;
+       default:
+               printk(KERN_ERR "isdn_ppp: skipped unsupported protocol: %#x.\n",
+                      skb->protocol);
+               dev_kfree_skb(skb);
+               goto out;
        }
 
        lp = isdn_net_get_locked_lp(nd);
@@ -1264,7 +1264,7 @@ isdn_ppp_xmit(struct sk_buff *skb, struct net_device *netdev)
        slot = lp->ppp_slot;
        if (slot < 0 || slot >= ISDN_MAX_CHANNELS) {
                printk(KERN_ERR "isdn_ppp_xmit: lp->ppp_slot(%d)\n",
-                       lp->ppp_slot);
+                      lp->ppp_slot);
                kfree_skb(skb);
                goto unlock;
        }
@@ -1277,7 +1277,7 @@ isdn_ppp_xmit(struct sk_buff *skb, struct net_device *netdev)
        /* Pull off the fake header we stuck on earlier to keep
         * the fragmentation code happy.
         */
-       skb_pull(skb,IPPP_MAX_HEADER);
+       skb_pull(skb, IPPP_MAX_HEADER);
 
 #ifdef CONFIG_IPPP_FILTER
        /* check if we should pass this packet
@@ -1302,7 +1302,7 @@ isdn_ppp_xmit(struct sk_buff *skb, struct net_device *netdev)
        if (!(ipt->active_filter
              && sk_run_filter(skb, ipt->active_filter) == 0)) {
                if (ipt->debug & 0x4)
-                       printk(KERN_DEBUG "IPPP: link-active filter: reseting huptimer.\n");
+                       printk(KERN_DEBUG "IPPP: link-active filter: resetting huptimer.\n");
                lp->huptimer = 0;
        }
        skb_pull(skb, 4);
@@ -1312,26 +1312,26 @@ isdn_ppp_xmit(struct sk_buff *skb, struct net_device *netdev)
 
        if (ipt->debug & 0x4)
                printk(KERN_DEBUG "xmit skb, len %d\n", (int) skb->len);
-        if (ipts->debug & 0x40)
-                isdn_ppp_frame_log("xmit0", skb->data, skb->len, 32,ipts->unit,lp->ppp_slot);
+       if (ipts->debug & 0x40)
+               isdn_ppp_frame_log("xmit0", skb->data, skb->len, 32, ipts->unit, lp->ppp_slot);
 
 #ifdef CONFIG_ISDN_PPP_VJ
        if (proto == PPP_IP && ipts->pppcfg & SC_COMP_TCP) {    /* ipts here? probably yes, but check this again */
                struct sk_buff *new_skb;
-               unsigned short hl;
+               unsigned short hl;
                /*
                 * we need to reserve enough space in front of
                 * sk_buff. old call to dev_alloc_skb only reserved
                 * 16 bytes, now we are looking what the driver want.
                 */
                hl = dev->drv[lp->isdn_device]->interface->hl_hdrlen + IPPP_MAX_HEADER;
-               /* 
+               /*
                 * Note: hl might still be insufficient because the method
                 * above does not account for a possibible MPPP slave channel
                 * which had larger HL header space requirements than the
                 * master.
                 */
-               new_skb = alloc_skb(hl+skb->len, GFP_ATOMIC);
+               new_skb = alloc_skb(hl + skb->len, GFP_ATOMIC);
                if (new_skb) {
                        u_char *buf;
                        int pktlen;
@@ -1342,9 +1342,9 @@ isdn_ppp_xmit(struct sk_buff *skb, struct net_device *netdev)
                        buf = skb->data;
 
                        pktlen = slhc_compress(ipts->slcomp, skb->data, skb->len, new_skb->data,
-                                &buf, !(ipts->pppcfg & SC_NO_TCP_CCID));
+                                              &buf, !(ipts->pppcfg & SC_NO_TCP_CCID));
 
-                       if (buf != skb->data) { 
+                       if (buf != skb->data) {
                                if (new_skb->data != buf)
                                        printk(KERN_ERR "isdn_ppp: FATAL error after slhc_compress!!\n");
                                dev_kfree_skb(skb);
@@ -1369,11 +1369,11 @@ isdn_ppp_xmit(struct sk_buff *skb, struct net_device *netdev)
        /*
         * normal (single link) or bundle compression
         */
-       if(ipts->compflags & SC_COMP_ON) {
+       if (ipts->compflags & SC_COMP_ON) {
                /* We send compressed only if both down- und upstream
                   compression is negotiated, that means, CCP is up */
-               if(ipts->compflags & SC_DECOMP_ON) {
-                       skb = isdn_ppp_compress(skb,&proto,ipt,ipts,0);
+               if (ipts->compflags & SC_DECOMP_ON) {
+                       skb = isdn_ppp_compress(skb, &proto, ipt, ipts, 0);
                } else {
                        printk(KERN_DEBUG "isdn_ppp: CCP not yet up - sending as-is\n");
                }
@@ -1389,7 +1389,7 @@ isdn_ppp_xmit(struct sk_buff *skb, struct net_device *netdev)
                ipts->mp_seqno++;
                if (ipt->mpppcfg & SC_OUT_SHORT_SEQ) {
                        unsigned char *data = isdn_ppp_skb_push(&skb, 3);
-                       if(!data)
+                       if (!data)
                                goto unlock;
                        mp_seqno &= 0xfff;
                        data[0] = MP_BEGIN_FRAG | MP_END_FRAG | ((mp_seqno >> 8) & 0xf);        /* (B)egin & (E)ndbit .. */
@@ -1397,7 +1397,7 @@ isdn_ppp_xmit(struct sk_buff *skb, struct net_device *netdev)
                        data[2] = proto;        /* PID compression */
                } else {
                        unsigned char *data = isdn_ppp_skb_push(&skb, 5);
-                       if(!data)
+                       if (!data)
                                goto unlock;
                        data[0] = MP_BEGIN_FRAG | MP_END_FRAG;  /* (B)egin & (E)ndbit .. */
                        data[1] = (mp_seqno >> 16) & 0xff;      /* sequence number: 24bit */
@@ -1412,25 +1412,25 @@ isdn_ppp_xmit(struct sk_buff *skb, struct net_device *netdev)
        /*
         * 'link in bundle' compression  ...
         */
-       if(ipt->compflags & SC_LINK_COMP_ON)
-               skb = isdn_ppp_compress(skb,&proto,ipt,ipts,1);
+       if (ipt->compflags & SC_LINK_COMP_ON)
+               skb = isdn_ppp_compress(skb, &proto, ipt, ipts, 1);
 
-       if( (ipt->pppcfg & SC_COMP_PROT) && (proto <= 0xff) ) {
-               unsigned char *data = isdn_ppp_skb_push(&skb,1);
-               if(!data)
+       if ((ipt->pppcfg & SC_COMP_PROT) && (proto <= 0xff)) {
+               unsigned char *data = isdn_ppp_skb_push(&skb, 1);
+               if (!data)
                        goto unlock;
                data[0] = proto & 0xff;
        }
        else {
-               unsigned char *data = isdn_ppp_skb_push(&skb,2);
-               if(!data)
+               unsigned char *data = isdn_ppp_skb_push(&skb, 2);
+               if (!data)
                        goto unlock;
                data[0] = (proto >> 8) & 0xff;
                data[1] = proto & 0xff;
        }
-       if(!(ipt->pppcfg & SC_COMP_AC)) {
-               unsigned char *data = isdn_ppp_skb_push(&skb,2);
-               if(!data)
+       if (!(ipt->pppcfg & SC_COMP_AC)) {
+               unsigned char *data = isdn_ppp_skb_push(&skb, 2);
+               if (!data)
                        goto unlock;
                data[0] = 0xff;    /* All Stations */
                data[1] = 0x03;    /* Unnumbered information */
@@ -1440,14 +1440,14 @@ isdn_ppp_xmit(struct sk_buff *skb, struct net_device *netdev)
 
        if (ipts->debug & 0x40) {
                printk(KERN_DEBUG "skb xmit: len: %d\n", (int) skb->len);
-               isdn_ppp_frame_log("xmit", skb->data, skb->len, 32,ipt->unit,lp->ppp_slot);
+               isdn_ppp_frame_log("xmit", skb->data, skb->len, 32, ipt->unit, lp->ppp_slot);
        }
-       
+
        isdn_net_writebuf_skb(lp, skb);
 
- unlock:
+unlock:
        spin_unlock_bh(&lp->xmit_lock);
- out:
+out:
        return retval;
 }
 
@@ -1488,12 +1488,12 @@ int isdn_ppp_autodial_filter(struct sk_buff *skb, isdn_net_local *lp)
                p++;
                *p = htons(proto);
        }
-       
+
        drop |= is->pass_filter
-               && sk_run_filter(skb, is->pass_filter) == 0;
+               && sk_run_filter(skb, is->pass_filter) == 0;
        drop |= is->active_filter
-               && sk_run_filter(skb, is->active_filter) == 0;
-       
+               && sk_run_filter(skb, is->active_filter) == 0;
+
        skb_push(skb, IPPP_MAX_HEADER - 4);
        return drop;
 }
@@ -1502,8 +1502,8 @@ int isdn_ppp_autodial_filter(struct sk_buff *skb, isdn_net_local *lp)
 
 /* this is _not_ rfc1990 header, but something we convert both short and long
  * headers to for convinience's sake:
- *     byte 0 is flags as in rfc1990
- *     bytes 1...4 is 24-bit seqence number converted to host byte order 
+ *     byte 0 is flags as in rfc1990
+ *     bytes 1...4 is 24-bit seqence number converted to host byte order
  */
 #define MP_HEADER_LEN  5
 
@@ -1511,51 +1511,51 @@ int isdn_ppp_autodial_filter(struct sk_buff *skb, isdn_net_local *lp)
 #define MP_SHORTSEQ_MASK       0x00000fff
 #define MP_LONGSEQ_MAX         MP_LONGSEQ_MASK
 #define MP_SHORTSEQ_MAX                MP_SHORTSEQ_MASK
-#define MP_LONGSEQ_MAXBIT      ((MP_LONGSEQ_MASK+1)>>1)
-#define MP_SHORTSEQ_MAXBIT     ((MP_SHORTSEQ_MASK+1)>>1)
+#define MP_LONGSEQ_MAXBIT      ((MP_LONGSEQ_MASK + 1) >> 1)
+#define MP_SHORTSEQ_MAXBIT     ((MP_SHORTSEQ_MASK + 1) >> 1)
 
 /* sequence-wrap safe comparisons (for long sequence)*/
-#define MP_LT(a,b)     ((a-b)&MP_LONGSEQ_MAXBIT)
-#define MP_LE(a,b)     !((b-a)&MP_LONGSEQ_MAXBIT)
-#define MP_GT(a,b)     ((b-a)&MP_LONGSEQ_MAXBIT)
-#define MP_GE(a,b)     !((a-b)&MP_LONGSEQ_MAXBIT)
+#define MP_LT(a, b)    ((a - b) & MP_LONGSEQ_MAXBIT)
+#define MP_LE(a, b)    !((b - a) & MP_LONGSEQ_MAXBIT)
+#define MP_GT(a, b)    ((b - a) & MP_LONGSEQ_MAXBIT)
+#define MP_GE(a, b)    !((a - b) & MP_LONGSEQ_MAXBIT)
 
-#define MP_SEQ(f)      ((*(u32*)(f->data+1)))
+#define MP_SEQ(f)      ((*(u32 *)(f->data + 1)))
 #define MP_FLAGS(f)    (f->data[0])
 
 static int isdn_ppp_mp_bundle_array_init(void)
 {
        int i;
-       int sz = ISDN_MAX_CHANNELS*sizeof(ippp_bundle);
-       if( (isdn_ppp_bundle_arr = kzalloc(sz, GFP_KERNEL)) == NULL )
+       int sz = ISDN_MAX_CHANNELS * sizeof(ippp_bundle);
+       if ((isdn_ppp_bundle_arr = kzalloc(sz, GFP_KERNEL)) == NULL)
                return -ENOMEM;
-       for( i = 0; i < ISDN_MAX_CHANNELS; i++ )
+       for (i = 0; i < ISDN_MAX_CHANNELS; i++)
                spin_lock_init(&isdn_ppp_bundle_arr[i].lock);
        return 0;
 }
 
-static ippp_bundle * isdn_ppp_mp_bundle_alloc(void)
+static ippp_bundle *isdn_ppp_mp_bundle_alloc(void)
 {
        int i;
-       for( i = 0; i < ISDN_MAX_CHANNELS; i++ )
+       for (i = 0; i < ISDN_MAX_CHANNELS; i++)
                if (isdn_ppp_bundle_arr[i].ref_ct <= 0)
                        return (isdn_ppp_bundle_arr + i);
        return NULL;
 }
 
-static int isdn_ppp_mp_init( isdn_net_local * lp, ippp_bundle * add_to )
+static int isdn_ppp_mp_init(isdn_net_local *lp, ippp_bundle *add_to)
 {
-       struct ippp_struct * is;
+       struct ippp_struct *is;
 
        if (lp->ppp_slot < 0) {
                printk(KERN_ERR "%s: lp->ppp_slot(%d) out of range\n",
-                       __func__, lp->ppp_slot);
-               return(-EINVAL);
+                      __func__, lp->ppp_slot);
+               return (-EINVAL);
        }
 
        is = ippp_table[lp->ppp_slot];
        if (add_to) {
-               if( lp->netdev->pb )
+               if (lp->netdev->pb)
                        lp->netdev->pb->ref_ct--;
                lp->netdev->pb = add_to;
        } else {                /* first link in a bundle */
@@ -1568,76 +1568,76 @@ static int isdn_ppp_mp_init( isdn_net_local * lp, ippp_bundle * add_to )
                lp->netdev->pb->seq = UINT_MAX;
        }
        lp->netdev->pb->ref_ct++;
-       
+
        is->last_link_seqno = 0;
        return 0;
 }
 
-static u32 isdn_ppp_mp_get_seq( int short_seq, 
-                                       struct sk_buff * skb, u32 last_seq );
-static struct sk_buff * isdn_ppp_mp_discard( ippp_bundle * mp,
-                       struct sk_buff * from, struct sk_buff * to );
-static void isdn_ppp_mp_reassembly( isdn_net_dev * net_dev, isdn_net_local * lp,
-                               struct sk_buff * from, struct sk_buff * to );
-static void isdn_ppp_mp_free_skb( ippp_bundle * mp, struct sk_buff * skb );
-static void isdn_ppp_mp_print_recv_pkt( int slot, struct sk_buff * skb );
-
-static void isdn_ppp_mp_receive(isdn_net_dev * net_dev, isdn_net_local * lp, 
-                                                       struct sk_buff *skb)
+static u32 isdn_ppp_mp_get_seq(int short_seq,
+                              struct sk_buff *skb, u32 last_seq);
+static struct sk_buff *isdn_ppp_mp_discard(ippp_bundle *mp,
+                                          struct sk_buff *from, struct sk_buff *to);
+static void isdn_ppp_mp_reassembly(isdn_net_dev *net_dev, isdn_net_local *lp,
+                                  struct sk_buff *from, struct sk_buff *to);
+static void isdn_ppp_mp_free_skb(ippp_bundle *mp, struct sk_buff *skb);
+static void isdn_ppp_mp_print_recv_pkt(int slot, struct sk_buff *skb);
+
+static void isdn_ppp_mp_receive(isdn_net_dev *net_dev, isdn_net_local *lp,
+                               struct sk_buff *skb)
 {
        struct ippp_struct *is;
-       isdn_net_local * lpq;
-       ippp_bundle * mp;
-       isdn_mppp_stats * stats;
-       struct sk_buff * newfrag, * frag, * start, *nextf;
+       isdn_net_local *lpq;
+       ippp_bundle *mp;
+       isdn_mppp_stats *stats;
+       struct sk_buff *newfrag, *frag, *start, *nextf;
        u32 newseq, minseq, thisseq;
        unsigned long flags;
        int slot;
 
        spin_lock_irqsave(&net_dev->pb->lock, flags);
-       mp = net_dev->pb;
-        stats = &mp->stats;
+       mp = net_dev->pb;
+       stats = &mp->stats;
        slot = lp->ppp_slot;
        if (slot < 0 || slot >= ISDN_MAX_CHANNELS) {
                printk(KERN_ERR "%s: lp->ppp_slot(%d)\n",
-                       __func__, lp->ppp_slot);
+                      __func__, lp->ppp_slot);
                stats->frame_drops++;
                dev_kfree_skb(skb);
                spin_unlock_irqrestore(&mp->lock, flags);
                return;
        }
        is = ippp_table[slot];
-       if( ++mp->frames > stats->max_queue_len )
+       if (++mp->frames > stats->max_queue_len)
                stats->max_queue_len = mp->frames;
-       
+
        if (is->debug & 0x8)
                isdn_ppp_mp_print_recv_pkt(lp->ppp_slot, skb);
 
-       newseq = isdn_ppp_mp_get_seq(is->mpppcfg & SC_IN_SHORT_SEQ, 
-                                               skb, is->last_link_seqno);
+       newseq = isdn_ppp_mp_get_seq(is->mpppcfg & SC_IN_SHORT_SEQ,
+                                    skb, is->last_link_seqno);
 
 
        /* if this packet seq # is less than last already processed one,
-        * toss it right away, but check for sequence start case first 
+        * toss it right away, but check for sequence start case first
         */
-       if( mp->seq > MP_LONGSEQ_MAX && (newseq & MP_LONGSEQ_MAXBIT) ) {
+       if (mp->seq > MP_LONGSEQ_MAX && (newseq & MP_LONGSEQ_MAXBIT)) {
                mp->seq = newseq;       /* the first packet: required for
                                         * rfc1990 non-compliant clients --
                                         * prevents constant packet toss */
-       } else if( MP_LT(newseq, mp->seq) ) {
+       } else if (MP_LT(newseq, mp->seq)) {
                stats->frame_drops++;
                isdn_ppp_mp_free_skb(mp, skb);
                spin_unlock_irqrestore(&mp->lock, flags);
                return;
        }
-       
+
        /* find the minimum received sequence number over all links */
        is->last_link_seqno = minseq = newseq;
        for (lpq = net_dev->queue;;) {
                slot = lpq->ppp_slot;
                if (slot < 0 || slot >= ISDN_MAX_CHANNELS) {
                        printk(KERN_ERR "%s: lpq->ppp_slot(%d)\n",
-                               __func__, lpq->ppp_slot);
+                              __func__, lpq->ppp_slot);
                } else {
                        u32 lls = ippp_table[slot]->last_link_seqno;
                        if (MP_LT(lls, minseq))
@@ -1651,17 +1651,17 @@ static void isdn_ppp_mp_receive(isdn_net_dev * net_dev, isdn_net_local * lp,
                                         * packets */
        newfrag = skb;
 
-       /* if this new fragment is before the first one, then enqueue it now. */
-       if ((frag = mp->frags) == NULL || MP_LT(newseq, MP_SEQ(frag))) {
+       /* if this new fragment is before the first one, then enqueue it now. */
+       if ((frag = mp->frags) == NULL || MP_LT(newseq, MP_SEQ(frag))) {
                newfrag->next = frag;
-               mp->frags = frag = newfrag;
-               newfrag = NULL;
-       }
+               mp->frags = frag = newfrag;
+               newfrag = NULL;
+       }
 
-       start = MP_FLAGS(frag) & MP_BEGIN_FRAG &&
-                               MP_SEQ(frag) == mp->seq ? frag : NULL;
+       start = MP_FLAGS(frag) & MP_BEGIN_FRAG &&
+               MP_SEQ(frag) == mp->seq ? frag : NULL;
 
-       /* 
+       /*
         * main fragment traversing loop
         *
         * try to accomplish several tasks:
@@ -1675,71 +1675,71 @@ static void isdn_ppp_mp_receive(isdn_net_dev * net_dev, isdn_net_local * lp,
         *   come to complete such sequence and it should be discarded
         *
         * loop completes when we accomplished the following tasks:
-        * - new fragment is inserted in the proper sequence ('newfrag' is 
+        * - new fragment is inserted in the proper sequence ('newfrag' is
         *   set to NULL)
-        * - we hit a gap in the sequence, so no reassembly/processing is 
+        * - we hit a gap in the sequence, so no reassembly/processing is
         *   possible ('start' would be set to NULL)
         *
         * algorithm for this code is derived from code in the book
         * 'PPP Design And Debugging' by James Carlson (Addison-Wesley)
         */
-       while (start != NULL || newfrag != NULL) {
-
-               thisseq = MP_SEQ(frag);
-               nextf = frag->next;
-
-               /* drop any duplicate fragments */
-               if (newfrag != NULL && thisseq == newseq) {
-                       isdn_ppp_mp_free_skb(mp, newfrag);
-                       newfrag = NULL;
-               }
-
-               /* insert new fragment before next element if possible. */
-               if (newfrag != NULL && (nextf == NULL || 
-                                               MP_LT(newseq, MP_SEQ(nextf)))) {
-                       newfrag->next = nextf;
-                       frag->next = nextf = newfrag;
-                       newfrag = NULL;
-               }
-
-               if (start != NULL) {
-                       /* check for misplaced start */
-                       if (start != frag && (MP_FLAGS(frag) & MP_BEGIN_FRAG)) {
+       while (start != NULL || newfrag != NULL) {
+
+               thisseq = MP_SEQ(frag);
+               nextf = frag->next;
+
+               /* drop any duplicate fragments */
+               if (newfrag != NULL && thisseq == newseq) {
+                       isdn_ppp_mp_free_skb(mp, newfrag);
+                       newfrag = NULL;
+               }
+
+               /* insert new fragment before next element if possible. */
+               if (newfrag != NULL && (nextf == NULL ||
+                                       MP_LT(newseq, MP_SEQ(nextf)))) {
+                       newfrag->next = nextf;
+                       frag->next = nextf = newfrag;
+                       newfrag = NULL;
+               }
+
+               if (start != NULL) {
+                       /* check for misplaced start */
+                       if (start != frag && (MP_FLAGS(frag) & MP_BEGIN_FRAG)) {
                                printk(KERN_WARNING"isdn_mppp(seq %d): new "
-                                     "BEGIN flag with no prior END", thisseq);
+                                      "BEGIN flag with no prior END", thisseq);
                                stats->seqerrs++;
                                stats->frame_drops++;
-                               start = isdn_ppp_mp_discard(mp, start,frag);
+                               start = isdn_ppp_mp_discard(mp, start, frag);
                                nextf = frag->next;
-                       }
-               } else if (MP_LE(thisseq, minseq)) {            
-                       if (MP_FLAGS(frag) & MP_BEGIN_FRAG)
+                       }
+               } else if (MP_LE(thisseq, minseq)) {
+                       if (MP_FLAGS(frag) & MP_BEGIN_FRAG)
                                start = frag;
-                       else {
+                       else {
                                if (MP_FLAGS(frag) & MP_END_FRAG)
-                                       stats->frame_drops++;
-                               if( mp->frags == frag )
-                                       mp->frags = nextf;      
+                                       stats->frame_drops++;
+                               if (mp->frags == frag)
+                                       mp->frags = nextf;
                                isdn_ppp_mp_free_skb(mp, frag);
                                frag = nextf;
                                continue;
-                       }
+                       }
                }
-               
+
                /* if start is non-null and we have end fragment, then
-                * we have full reassembly sequence -- reassemble 
+                * we have full reassembly sequence -- reassemble
                 * and process packet now
                 */
-               if (start != NULL && (MP_FLAGS(frag) & MP_END_FRAG)) {
-                       minseq = mp->seq = (thisseq+1) & MP_LONGSEQ_MASK;
-                       /* Reassemble the packet then dispatch it */
+               if (start != NULL && (MP_FLAGS(frag) & MP_END_FRAG)) {
+                       minseq = mp->seq = (thisseq + 1) & MP_LONGSEQ_MASK;
+                       /* Reassemble the packet then dispatch it */
                        isdn_ppp_mp_reassembly(net_dev, lp, start, nextf);
-      
-                       start = NULL;
-                       frag = NULL;
 
-                       mp->frags = nextf;
-               }
+                       start = NULL;
+                       frag = NULL;
+
+                       mp->frags = nextf;
+               }
 
                /* check if need to update start pointer: if we just
                 * reassembled the packet and sequence is contiguous
@@ -1749,48 +1749,48 @@ static void isdn_ppp_mp_receive(isdn_net_dev * net_dev, isdn_net_local * lp,
                 * if sequence is not contiguous, either clear everything
                 * below low watermark and set start to the next frag or
                 * clear start ptr.
-                */ 
-               if (nextf != NULL && 
-                   ((thisseq+1) & MP_LONGSEQ_MASK) == MP_SEQ(nextf)) {
-                       /* if we just reassembled and the next one is here, 
+                */
+               if (nextf != NULL &&
+                   ((thisseq + 1) & MP_LONGSEQ_MASK) == MP_SEQ(nextf)) {
+                       /* if we just reassembled and the next one is here,
                         * then start another reassembly. */
 
-                       if (frag == NULL) {
+                       if (frag == NULL) {
                                if (MP_FLAGS(nextf) & MP_BEGIN_FRAG)
-                                       start = nextf;
+                                       start = nextf;
                                else
                                {
-                                       printk(KERN_WARNING"isdn_mppp(seq %d):"
-                                               " END flag with no following "
-                                               "BEGIN", thisseq);
+                                       printk(KERN_WARNING"isdn_mppp(seq %d):"
+                                              " END flag with no following "
+                                              "BEGIN", thisseq);
                                        stats->seqerrs++;
                                }
                        }
 
-               } else {
-                       if ( nextf != NULL && frag != NULL &&
-                                               MP_LT(thisseq, minseq)) {
+               } else {
+                       if (nextf != NULL && frag != NULL &&
+                           MP_LT(thisseq, minseq)) {
                                /* we've got a break in the sequence
                                 * and we not at the end yet
                                 * and we did not just reassembled
                                 *(if we did, there wouldn't be anything before)
-                                * and we below the low watermark 
-                                * discard all the frames below low watermark 
+                                * and we below the low watermark
+                                * discard all the frames below low watermark
                                 * and start over */
                                stats->frame_drops++;
-                               mp->frags = isdn_ppp_mp_discard(mp,start,nextf);
+                               mp->frags = isdn_ppp_mp_discard(mp, start, nextf);
                        }
                        /* break in the sequence, no reassembly */
-                       start = NULL;
-               }
-                               
-               frag = nextf;
-       }       /* while -- main loop */
-       
-       if (mp->frags == NULL)
-               mp->frags = frag;
-               
-       /* rather straighforward way to deal with (not very) possible 
+                       start = NULL;
+               }
+
+               frag = nextf;
+       }       /* while -- main loop */
+
+       if (mp->frags == NULL)
+               mp->frags = frag;
+
+       /* rather straighforward way to deal with (not very) possible
         * queue overflow */
        if (mp->frames > MP_MAX_QUEUE_LEN) {
                stats->overflows++;
@@ -1803,11 +1803,11 @@ static void isdn_ppp_mp_receive(isdn_net_dev * net_dev, isdn_net_local * lp,
        spin_unlock_irqrestore(&mp->lock, flags);
 }
 
-static void isdn_ppp_mp_cleanup( isdn_net_local * lp )
+static void isdn_ppp_mp_cleanup(isdn_net_local *lp)
 {
-       struct sk_buff * frag = lp->netdev->pb->frags;
-       struct sk_buff * nextfrag;
-       while( frag ) {
+       struct sk_buff *frag = lp->netdev->pb->frags;
+       struct sk_buff *nextfrag;
+       while (frag) {
                nextfrag = frag->next;
                isdn_ppp_mp_free_skb(lp->netdev->pb, frag);
                frag = nextfrag;
@@ -1815,117 +1815,117 @@ static void isdn_ppp_mp_cleanup( isdn_net_local * lp )
        lp->netdev->pb->frags = NULL;
 }
 
-static u32 isdn_ppp_mp_get_seq( int short_seq, 
-                                       struct sk_buff * skb, u32 last_seq )
+static u32 isdn_ppp_mp_get_seq(int short_seq,
+                              struct sk_buff *skb, u32 last_seq)
 {
        u32 seq;
        int flags = skb->data[0] & (MP_BEGIN_FRAG | MP_END_FRAG);
-   
-       if( !short_seq )
+
+       if (!short_seq)
        {
                seq = ntohl(*(__be32 *)skb->data) & MP_LONGSEQ_MASK;
-               skb_push(skb,1);
+               skb_push(skb, 1);
        }
        else
        {
-               /* convert 12-bit short seq number to 24-bit long one 
-               */
+               /* convert 12-bit short seq number to 24-bit long one
+                */
                seq = ntohs(*(__be16 *)skb->data) & MP_SHORTSEQ_MASK;
-       
+
                /* check for seqence wrap */
-               if( !(seq &  MP_SHORTSEQ_MAXBIT) && 
-                    (last_seq &  MP_SHORTSEQ_MAXBIT) && 
-                    (unsigned long)last_seq <= MP_LONGSEQ_MAX )
-                       seq |= (last_seq + MP_SHORTSEQ_MAX+1) & 
-                                       (~MP_SHORTSEQ_MASK & MP_LONGSEQ_MASK);
+               if (!(seq &  MP_SHORTSEQ_MAXBIT) &&
+                   (last_seq &  MP_SHORTSEQ_MAXBIT) &&
+                   (unsigned long)last_seq <= MP_LONGSEQ_MAX)
+                       seq |= (last_seq + MP_SHORTSEQ_MAX + 1) &
+                               (~MP_SHORTSEQ_MASK & MP_LONGSEQ_MASK);
                else
                        seq |= last_seq & (~MP_SHORTSEQ_MASK & MP_LONGSEQ_MASK);
-               
+
                skb_push(skb, 3);       /* put converted seqence back in skb */
        }
-       *(u32*)(skb->data+1) = seq;     /* put seqence back in _host_ byte
+       *(u32 *)(skb->data + 1) = seq;  /* put seqence back in _host_ byte
                                         * order */
        skb->data[0] = flags;           /* restore flags */
        return seq;
 }
 
-struct sk_buff * isdn_ppp_mp_discard( ippp_bundle * mp,
-                       struct sk_buff * from, struct sk_buff * to )
+struct sk_buff *isdn_ppp_mp_discard(ippp_bundle *mp,
+                                   struct sk_buff *from, struct sk_buff *to)
 {
-       if( from )
+       if (from)
                while (from != to) {
-                       struct sk_buff * next = from->next;
+                       struct sk_buff *next = from->next;
                        isdn_ppp_mp_free_skb(mp, from);
-                       from = next;
+                       from = next;
                }
        return from;
 }
 
-void isdn_ppp_mp_reassembly( isdn_net_dev * net_dev, isdn_net_local * lp,
-                               struct sk_buff * from, struct sk_buff * to )
+void isdn_ppp_mp_reassembly(isdn_net_dev *net_dev, isdn_net_local *lp,
+                           struct sk_buff *from, struct sk_buff *to)
 {
-       ippp_bundle * mp = net_dev->pb;
+       ippp_bundle *mp = net_dev->pb;
        int proto;
-       struct sk_buff * skb;
+       struct sk_buff *skb;
        unsigned int tot_len;
 
        if (lp->ppp_slot < 0 || lp->ppp_slot >= ISDN_MAX_CHANNELS) {
                printk(KERN_ERR "%s: lp->ppp_slot(%d) out of range\n",
-                       __func__, lp->ppp_slot);
+                      __func__, lp->ppp_slot);
                return;
        }
-       if( MP_FLAGS(from) == (MP_BEGIN_FRAG | MP_END_FRAG) ) {
-               if( ippp_table[lp->ppp_slot]->debug & 0x40 )
+       if (MP_FLAGS(from) == (MP_BEGIN_FRAG | MP_END_FRAG)) {
+               if (ippp_table[lp->ppp_slot]->debug & 0x40)
                        printk(KERN_DEBUG "isdn_mppp: reassembly: frame %d, "
-                                       "len %d\n", MP_SEQ(from), from->len );
+                              "len %d\n", MP_SEQ(from), from->len);
                skb = from;
                skb_pull(skb, MP_HEADER_LEN);
-               mp->frames--;   
+               mp->frames--;
        } else {
-               struct sk_buff * frag;
+               struct sk_buff *frag;
                int n;
 
-               for(tot_len=n=0, frag=from; frag != to; frag=frag->next, n++)
+               for (tot_len = n = 0, frag = from; frag != to; frag = frag->next, n++)
                        tot_len += frag->len - MP_HEADER_LEN;
 
-               if( ippp_table[lp->ppp_slot]->debug & 0x40 )
+               if (ippp_table[lp->ppp_slot]->debug & 0x40)
                        printk(KERN_DEBUG"isdn_mppp: reassembling frames %d "
-                               "to %d, len %d\n", MP_SEQ(from), 
-                               (MP_SEQ(from)+n-1) & MP_LONGSEQ_MASK, tot_len );
-               if( (skb = dev_alloc_skb(tot_len)) == NULL ) {
+                              "to %d, len %d\n", MP_SEQ(from),
+                              (MP_SEQ(from) + n - 1) & MP_LONGSEQ_MASK, tot_len);
+               if ((skb = dev_alloc_skb(tot_len)) == NULL) {
                        printk(KERN_ERR "isdn_mppp: cannot allocate sk buff "
-                                       "of size %d\n", tot_len);
+                              "of size %d\n", tot_len);
                        isdn_ppp_mp_discard(mp, from, to);
                        return;
                }
 
-               while( from != to ) {
+               while (from != to) {
                        unsigned int len = from->len - MP_HEADER_LEN;
 
                        skb_copy_from_linear_data_offset(from, MP_HEADER_LEN,
-                                                        skb_put(skb,len),
+                                                        skb_put(skb, len),
                                                         len);
                        frag = from->next;
                        isdn_ppp_mp_free_skb(mp, from);
-                       from = frag; 
+                       from = frag;
                }
        }
-       proto = isdn_ppp_strip_proto(skb);
+       proto = isdn_ppp_strip_proto(skb);
        isdn_ppp_push_higher(net_dev, lp, skb, proto);
 }
 
-static void isdn_ppp_mp_free_skb(ippp_bundle * mp, struct sk_buff * skb)
+static void isdn_ppp_mp_free_skb(ippp_bundle *mp, struct sk_buff *skb)
 {
        dev_kfree_skb(skb);
        mp->frames--;
 }
 
-static void isdn_ppp_mp_print_recv_pkt( int slot, struct sk_buff * skb )
+static void isdn_ppp_mp_print_recv_pkt(int slot, struct sk_buff *skb)
 {
-       printk(KERN_DEBUG "mp_recv: %d/%d -> %02x %02x %02x %02x %02x %02x\n", 
-               slot, (int) skb->len, 
-               (int) skb->data[0], (int) skb->data[1], (int) skb->data[2],
-               (int) skb->data[3], (int) skb->data[4], (int) skb->data[5]);
+       printk(KERN_DEBUG "mp_recv: %d/%d -> %02x %02x %02x %02x %02x %02x\n",
+              slot, (int) skb->len,
+              (int) skb->data[0], (int) skb->data[1], (int) skb->data[2],
+              (int) skb->data[3], (int) skb->data[4], (int) skb->data[5]);
 }
 
 static int
@@ -1944,18 +1944,18 @@ isdn_ppp_bundle(struct ippp_struct *is, int unit)
                return -EINVAL;
        }
 
-       spin_lock_irqsave(&p->pb->lock, flags);
+       spin_lock_irqsave(&p->pb->lock, flags);
 
        nlp = is->lp;
        lp = p->queue;
-       if( nlp->ppp_slot < 0 || nlp->ppp_slot >= ISDN_MAX_CHANNELS ||
-               lp->ppp_slot < 0 || lp->ppp_slot >= ISDN_MAX_CHANNELS ) {
+       if (nlp->ppp_slot < 0 || nlp->ppp_slot >= ISDN_MAX_CHANNELS ||
+           lp->ppp_slot < 0 || lp->ppp_slot >= ISDN_MAX_CHANNELS) {
                printk(KERN_ERR "ippp_bundle: binding to invalid slot %d\n",
-                       nlp->ppp_slot < 0 || nlp->ppp_slot >= ISDN_MAX_CHANNELS ? 
-                       nlp->ppp_slot : lp->ppp_slot );
+                      nlp->ppp_slot < 0 || nlp->ppp_slot >= ISDN_MAX_CHANNELS ?
+                      nlp->ppp_slot : lp->ppp_slot);
                rc = -EINVAL;
                goto out;
-       }
+       }
 
        isdn_net_add_to_bundle(p, nlp);
 
@@ -1971,9 +1971,9 @@ out:
        spin_unlock_irqrestore(&p->pb->lock, flags);
        return rc;
 }
-  
+
 #endif /* CONFIG_ISDN_MPP */
-  
+
 /*
  * network device ioctl handlers
  */
@@ -2020,7 +2020,7 @@ isdn_ppp_dev_ioctl_stats(int slot, struct ifreq *ifr, struct net_device *dev)
 int
 isdn_ppp_dev_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
 {
-       int error=0;
+       int error = 0;
        int len;
        isdn_net_local *lp = netdev_priv(dev);
 
@@ -2030,18 +2030,18 @@ isdn_ppp_dev_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
 
        switch (cmd) {
 #define PPP_VERSION "2.3.7"
-               case SIOCGPPPVER:
-                       len = strlen(PPP_VERSION) + 1;
-                       if (copy_to_user(ifr->ifr_data, PPP_VERSION, len))
-                               error = -EFAULT;
-                       break;
+       case SIOCGPPPVER:
+               len = strlen(PPP_VERSION) + 1;
+               if (copy_to_user(ifr->ifr_data, PPP_VERSION, len))
+                       error = -EFAULT;
+               break;
 
-               case SIOCGPPPSTATS:
-                       error = isdn_ppp_dev_ioctl_stats(lp->ppp_slot, ifr, dev);
-                       break;
-               default:
-                       error = -EINVAL;
-                       break;
+       case SIOCGPPPSTATS:
+               error = isdn_ppp_dev_ioctl_stats(lp->ppp_slot, ifr, dev);
+               break;
+       default:
+               error = -EINVAL;
+               break;
        }
        return error;
 }
@@ -2050,9 +2050,9 @@ static int
 isdn_ppp_if_get_unit(char *name)
 {
        int len,
-        i,
-        unit = 0,
-        deci;
+               i,
+               unit = 0,
+               deci;
 
        len = strlen(name);
 
@@ -2129,7 +2129,7 @@ isdn_ppp_hangup_slave(char *name)
                                break;
                } else if (mlp->flags & ISDN_NET_CONNECTED)
                        break;
-               
+
                sdev = mlp->slave;
        }
        if (!sdev)
@@ -2202,8 +2202,8 @@ static void isdn_ppp_ccp_xmit_reset(struct ippp_struct *is, int proto,
 
        /* Alloc large enough skb */
        hl = dev->drv[lp->isdn_device]->interface->hl_hdrlen;
-       skb = alloc_skb(len + hl + 16,GFP_ATOMIC);
-       if(!skb) {
+       skb = alloc_skb(len + hl + 16, GFP_ATOMIC);
+       if (!skb) {
                printk(KERN_WARNING
                       "ippp: CCP cannot send reset - out of memory\n");
                return;
@@ -2211,7 +2211,7 @@ static void isdn_ppp_ccp_xmit_reset(struct ippp_struct *is, int proto,
        skb_reserve(skb, hl);
 
        /* We may need to stuff an address and control field first */
-       if(!(is->pppcfg & SC_COMP_AC)) {
+       if (!(is->pppcfg & SC_COMP_AC)) {
                p = skb_put(skb, 2);
                *p++ = 0xff;
                *p++ = 0x03;
@@ -2228,14 +2228,14 @@ static void isdn_ppp_ccp_xmit_reset(struct ippp_struct *is, int proto,
        *p++ = (cnt & 0xff);
 
        /* Now stuff remaining bytes */
-       if(len) {
+       if (len) {
                p = skb_put(skb, len);
                memcpy(p, data, len);
        }
 
        /* skb is now ready for xmit */
        printk(KERN_DEBUG "Sending CCP Frame:\n");
-       isdn_ppp_frame_log("ccp-xmit", skb->data, skb->len, 32, is->unit,lp->ppp_slot);
+       isdn_ppp_frame_log("ccp-xmit", skb->data, skb->len, 32, is->unit, lp->ppp_slot);
 
        isdn_net_write_super(lp, skb);
 }
@@ -2245,7 +2245,7 @@ static struct ippp_ccp_reset *isdn_ppp_ccp_reset_alloc(struct ippp_struct *is)
 {
        struct ippp_ccp_reset *r;
        r = kzalloc(sizeof(struct ippp_ccp_reset), GFP_KERNEL);
-       if(!r) {
+       if (!r) {
                printk(KERN_ERR "ippp_ccp: failed to allocate reset data"
                       " structure - no mem\n");
                return NULL;
@@ -2262,8 +2262,8 @@ static void isdn_ppp_ccp_reset_free(struct ippp_struct *is)
 
        printk(KERN_DEBUG "ippp_ccp: freeing reset data structure %p\n",
               is->reset);
-       for(id = 0; id < 256; id++) {
-               if(is->reset->rs[id]) {
+       for (id = 0; id < 256; id++) {
+               if (is->reset->rs[id]) {
                        isdn_ppp_ccp_reset_free_state(is, (unsigned char)id);
                }
        }
@@ -2277,11 +2277,11 @@ static void isdn_ppp_ccp_reset_free_state(struct ippp_struct *is,
 {
        struct ippp_ccp_reset_state *rs;
 
-       if(is->reset->rs[id]) {
+       if (is->reset->rs[id]) {
                printk(KERN_DEBUG "ippp_ccp: freeing state for id %d\n", id);
                rs = is->reset->rs[id];
                /* Make sure the kernel will not call back later */
-               if(rs->ta)
+               if (rs->ta)
                        del_timer(&rs->timer);
                is->reset->rs[id] = NULL;
                kfree(rs);
@@ -2297,13 +2297,13 @@ static void isdn_ppp_ccp_timer_callback(unsigned long closure)
        struct ippp_ccp_reset_state *rs =
                (struct ippp_ccp_reset_state *)closure;
 
-       if(!rs) {
+       if (!rs) {
                printk(KERN_ERR "ippp_ccp: timer cb with zero closure.\n");
                return;
        }
-       if(rs->ta && rs->state == CCPResetSentReq) {
+       if (rs->ta && rs->state == CCPResetSentReq) {
                /* We are correct here */
-               if(!rs->expra) {
+               if (!rs->expra) {
                        /* Hmm, there is no Ack really expected. We can clean
                           up the state now, it will be reallocated if the
                           decompressor insists on another reset */
@@ -2317,7 +2317,7 @@ static void isdn_ppp_ccp_timer_callback(unsigned long closure)
                isdn_ppp_ccp_xmit_reset(rs->is, PPP_CCP, CCP_RESETREQ, rs->id,
                                        rs->data, rs->dlen);
                /* Restart timer */
-               rs->timer.expires = jiffies + HZ*5;
+               rs->timer.expires = jiffies + HZ * 5;
                add_timer(&rs->timer);
        } else {
                printk(KERN_WARNING "ippp_ccp: timer cb in wrong state %d\n",
@@ -2327,16 +2327,16 @@ static void isdn_ppp_ccp_timer_callback(unsigned long closure)
 
 /* Allocate a new reset transaction state */
 static struct ippp_ccp_reset_state *isdn_ppp_ccp_reset_alloc_state(struct ippp_struct *is,
-                                                     unsigned char id)
+                                                                  unsigned char id)
 {
        struct ippp_ccp_reset_state *rs;
-       if(is->reset->rs[id]) {
+       if (is->reset->rs[id]) {
                printk(KERN_WARNING "ippp_ccp: old state exists for id %d\n",
                       id);
                return NULL;
        } else {
                rs = kzalloc(sizeof(struct ippp_ccp_reset_state), GFP_KERNEL);
-               if(!rs)
+               if (!rs)
                        return NULL;
                rs->state = CCPResetIdle;
                rs->is = is;
@@ -2357,21 +2357,21 @@ static void isdn_ppp_ccp_reset_trans(struct ippp_struct *is,
 {
        struct ippp_ccp_reset_state *rs;
 
-       if(rp->valid) {
+       if (rp->valid) {
                /* The decompressor defines parameters by itself */
-               if(rp->rsend) {
+               if (rp->rsend) {
                        /* And he wants us to send a request */
-                       if(!(rp->idval)) {
+                       if (!(rp->idval)) {
                                printk(KERN_ERR "ippp_ccp: decompressor must"
                                       " specify reset id\n");
                                return;
                        }
-                       if(is->reset->rs[rp->id]) {
+                       if (is->reset->rs[rp->id]) {
                                /* There is already a transaction in existence
                                   for this id. May be still waiting for a
                                   Ack or may be wrong. */
                                rs = is->reset->rs[rp->id];
-                               if(rs->state == CCPResetSentReq && rs->ta) {
+                               if (rs->state == CCPResetSentReq && rs->ta) {
                                        printk(KERN_DEBUG "ippp_ccp: reset"
                                               " trans still in progress"
                                               " for id %d\n", rp->id);
@@ -2385,14 +2385,14 @@ static void isdn_ppp_ccp_reset_trans(struct ippp_struct *is,
                                printk(KERN_DEBUG "ippp_ccp: new trans for id"
                                       " %d to be started\n", rp->id);
                                rs = isdn_ppp_ccp_reset_alloc_state(is, rp->id);
-                               if(!rs) {
+                               if (!rs) {
                                        printk(KERN_ERR "ippp_ccp: out of mem"
                                               " allocing ccp trans\n");
                                        return;
                                }
                                rs->state = CCPResetSentReq;
                                rs->expra = rp->expra;
-                               if(rp->dtval) {
+                               if (rp->dtval) {
                                        rs->dlen = rp->dlen;
                                        memcpy(rs->data, rp->data, rp->dlen);
                                }
@@ -2401,7 +2401,7 @@ static void isdn_ppp_ccp_reset_trans(struct ippp_struct *is,
                                                        CCP_RESETREQ, rs->id,
                                                        rs->data, rs->dlen);
                                /* Start the timer */
-                               rs->timer.expires = jiffies + 5*HZ;
+                               rs->timer.expires = jiffies + 5 * HZ;
                                add_timer(&rs->timer);
                                rs->ta = 1;
                        }
@@ -2413,12 +2413,12 @@ static void isdn_ppp_ccp_reset_trans(struct ippp_struct *is,
                   care about them, so we just send the minimal requests
                   and increase ids only when an Ack is received for a
                   given id */
-               if(is->reset->rs[is->reset->lastid]) {
+               if (is->reset->rs[is->reset->lastid]) {
                        /* There is already a transaction in existence
                           for this id. May be still waiting for a
                           Ack or may be wrong. */
                        rs = is->reset->rs[is->reset->lastid];
-                       if(rs->state == CCPResetSentReq && rs->ta) {
+                       if (rs->state == CCPResetSentReq && rs->ta) {
                                printk(KERN_DEBUG "ippp_ccp: reset"
                                       " trans still in progress"
                                       " for id %d\n", rp->id);
@@ -2432,7 +2432,7 @@ static void isdn_ppp_ccp_reset_trans(struct ippp_struct *is,
                               " %d to be started\n", is->reset->lastid);
                        rs = isdn_ppp_ccp_reset_alloc_state(is,
                                                            is->reset->lastid);
-                       if(!rs) {
+                       if (!rs) {
                                printk(KERN_ERR "ippp_ccp: out of mem"
                                       " allocing ccp trans\n");
                                return;
@@ -2446,7 +2446,7 @@ static void isdn_ppp_ccp_reset_trans(struct ippp_struct *is,
                        isdn_ppp_ccp_xmit_reset(is, PPP_CCP, CCP_RESETREQ,
                                                rs->id, NULL, 0);
                        /* Start the timer */
-                       rs->timer.expires = jiffies + 5*HZ;
+                       rs->timer.expires = jiffies + 5 * HZ;
                        add_timer(&rs->timer);
                        rs->ta = 1;
                }
@@ -2460,17 +2460,17 @@ static void isdn_ppp_ccp_reset_ack_rcvd(struct ippp_struct *is,
 {
        struct ippp_ccp_reset_state *rs = is->reset->rs[id];
 
-       if(rs) {
-               if(rs->ta && rs->state == CCPResetSentReq) {
+       if (rs) {
+               if (rs->ta && rs->state == CCPResetSentReq) {
                        /* Great, we are correct */
-                       if(!rs->expra)
+                       if (!rs->expra)
                                printk(KERN_DEBUG "ippp_ccp: ResetAck received"
                                       " for id %d but not expected\n", id);
                } else {
                        printk(KERN_INFO "ippp_ccp: ResetAck received out of"
                               "sync for id %d\n", id);
                }
-               if(rs->ta) {
+               if (rs->ta) {
                        rs->ta = 0;
                        del_timer(&rs->timer);
                }
@@ -2483,7 +2483,7 @@ static void isdn_ppp_ccp_reset_ack_rcvd(struct ippp_struct *is,
        is->reset->lastid++;
 }
 
-/* 
+/*
  * decompress packet
  *
  * if master = 0, we're trying to uncompress an per-link compressed packet,
@@ -2495,8 +2495,8 @@ static void isdn_ppp_ccp_reset_ack_rcvd(struct ippp_struct *is,
  *        NULL if decompression error
  */
 
-static struct sk_buff *isdn_ppp_decompress(struct sk_buff *skb,struct ippp_struct *is,struct ippp_struct *master,
-       int *proto)
+static struct sk_buff *isdn_ppp_decompress(struct sk_buff *skb, struct ippp_struct *is, struct ippp_struct *master,
+                                          int *proto)
 {
        void *stat = NULL;
        struct isdn_ppp_compressor *ipc = NULL;
@@ -2506,8 +2506,8 @@ static struct sk_buff *isdn_ppp_decompress(struct sk_buff *skb,struct ippp_struc
        struct isdn_ppp_resetparams rsparm;
        unsigned char rsdata[IPPP_RESET_MAXDATABYTES];
 
-       if(!master) {
-               // per-link decompression 
+       if (!master) {
+               // per-link decompression
                stat = is->link_decomp_stat;
                ipc = is->link_decompressor;
                ri = is;
@@ -2524,28 +2524,28 @@ static struct sk_buff *isdn_ppp_decompress(struct sk_buff *skb,struct ippp_struc
        }
        BUG_ON(!stat); // if we have a compressor, stat has been set as well
 
-       if((master && *proto == PPP_COMP) || (!master && *proto == PPP_COMPFRAG) ) {
+       if ((master && *proto == PPP_COMP) || (!master && *proto == PPP_COMPFRAG)) {
                // compressed packets are compressed by their protocol type
 
                // Set up reset params for the decompressor
-               memset(&rsparm, 0, sizeof(rsparm));
-               rsparm.data = rsdata;
-               rsparm.maxdlen = IPPP_RESET_MAXDATABYTES;
-  
-               skb_out = dev_alloc_skb(is->mru + PPP_HDRLEN);
-               if (!skb_out) {
-                       kfree_skb(skb);
-                       printk(KERN_ERR "ippp: decomp memory allocation failure\n");
+               memset(&rsparm, 0, sizeof(rsparm));
+               rsparm.data = rsdata;
+               rsparm.maxdlen = IPPP_RESET_MAXDATABYTES;
+
+               skb_out = dev_alloc_skb(is->mru + PPP_HDRLEN);
+               if (!skb_out) {
+                       kfree_skb(skb);
+                       printk(KERN_ERR "ippp: decomp memory allocation failure\n");
                        return NULL;
-               }
+               }
                len = ipc->decompress(stat, skb, skb_out, &rsparm);
                kfree_skb(skb);
                if (len <= 0) {
-                       switch(len) {
+                       switch (len) {
                        case DECOMP_ERROR:
                                printk(KERN_INFO "ippp: decomp wants reset %s params\n",
                                       rsparm.valid ? "with" : "without");
-                               
+
                                isdn_ppp_ccp_reset_trans(ri, &rsparm);
                                break;
                        case DECOMP_FATALERROR:
@@ -2563,7 +2563,7 @@ static struct sk_buff *isdn_ppp_decompress(struct sk_buff *skb,struct ippp_struc
                        return NULL;
                }
                return skb_out;
-       } else { 
+       } else {
                // uncompressed packets are fed through the decompressor to
                // update the decompressor state
                ipc->incomp(stat, skb, *proto);
@@ -2572,31 +2572,31 @@ static struct sk_buff *isdn_ppp_decompress(struct sk_buff *skb,struct ippp_struc
 }
 
 /*
- * compress a frame 
+ * compress a frame
  *   type=0: normal/bundle compression
  *       =1: link compression
  * returns original skb if we haven't compressed the frame
  * and a new skb pointer if we've done it
  */
-static struct sk_buff *isdn_ppp_compress(struct sk_buff *skb_in,int *proto,
-       struct ippp_struct *is,struct ippp_struct *master,int type)
+static struct sk_buff *isdn_ppp_compress(struct sk_buff *skb_in, int *proto,
+                                        struct ippp_struct *is, struct ippp_struct *master, int type)
 {
-    int ret;
-    int new_proto;
-    struct isdn_ppp_compressor *compressor;
-    void *stat;
-    struct sk_buff *skb_out;
+       int ret;
+       int new_proto;
+       struct isdn_ppp_compressor *compressor;
+       void *stat;
+       struct sk_buff *skb_out;
 
        /* we do not compress control protocols */
-    if(*proto < 0 || *proto > 0x3fff) {
-           return skb_in;
-    }
+       if (*proto < 0 || *proto > 0x3fff) {
+               return skb_in;
+       }
 
-       if(type) { /* type=1 => Link compression */
+       if (type) { /* type=1 => Link compression */
                return skb_in;
        }
        else {
-               if(!master) {
+               if (!master) {
                        compressor = is->compressor;
                        stat = is->comp_stat;
                }
@@ -2607,90 +2607,90 @@ static struct sk_buff *isdn_ppp_compress(struct sk_buff *skb_in,int *proto,
                new_proto = PPP_COMP;
        }
 
-       if(!compressor) {
+       if (!compressor) {
                printk(KERN_ERR "isdn_ppp: No compressor set!\n");
                return skb_in;
        }
-       if(!stat) {
+       if (!stat) {
                printk(KERN_ERR "isdn_ppp: Compressor not initialized?\n");
                return skb_in;
        }
 
        /* Allow for at least 150 % expansion (for now) */
-       skb_out = alloc_skb(skb_in->len + skb_in->len/2 + 32 +
-               skb_headroom(skb_in), GFP_ATOMIC);
-       if(!skb_out)
+       skb_out = alloc_skb(skb_in->len + skb_in->len / 2 + 32 +
+                           skb_headroom(skb_in), GFP_ATOMIC);
+       if (!skb_out)
                return skb_in;
        skb_reserve(skb_out, skb_headroom(skb_in));
 
-       ret = (compressor->compress)(stat,skb_in,skb_out,*proto);
-       if(!ret) {
+       ret = (compressor->compress)(stat, skb_in, skb_out, *proto);
+       if (!ret) {
                dev_kfree_skb(skb_out);
                return skb_in;
        }
-       
+
        dev_kfree_skb(skb_in);
        *proto = new_proto;
        return skb_out;
 }
 
 /*
- * we received a CCP frame .. 
+ * we received a CCP frame ..
  * not a clean solution, but we MUST handle a few cases in the kernel
  */
 static void isdn_ppp_receive_ccp(isdn_net_dev *net_dev, isdn_net_local *lp,
-        struct sk_buff *skb,int proto)
+                                struct sk_buff *skb, int proto)
 {
        struct ippp_struct *is;
        struct ippp_struct *mis;
        int len;
        struct isdn_ppp_resetparams rsparm;
-       unsigned char rsdata[IPPP_RESET_MAXDATABYTES];  
+       unsigned char rsdata[IPPP_RESET_MAXDATABYTES];
 
        printk(KERN_DEBUG "Received CCP frame from peer slot(%d)\n",
-               lp->ppp_slot);
+              lp->ppp_slot);
        if (lp->ppp_slot < 0 || lp->ppp_slot >= ISDN_MAX_CHANNELS) {
                printk(KERN_ERR "%s: lp->ppp_slot(%d) out of range\n",
-                       __func__, lp->ppp_slot);
+                      __func__, lp->ppp_slot);
                return;
        }
        is = ippp_table[lp->ppp_slot];
-       isdn_ppp_frame_log("ccp-rcv", skb->data, skb->len, 32, is->unit,lp->ppp_slot);
+       isdn_ppp_frame_log("ccp-rcv", skb->data, skb->len, 32, is->unit, lp->ppp_slot);
 
-       if(lp->master) {
+       if (lp->master) {
                int slot = ISDN_MASTER_PRIV(lp)->ppp_slot;
                if (slot < 0 || slot >= ISDN_MAX_CHANNELS) {
                        printk(KERN_ERR "%s: slot(%d) out of range\n",
-                               __func__, slot);
+                              __func__, slot);
                        return;
-               }       
+               }
                mis = ippp_table[slot];
        } else
                mis = is;
 
-       switch(skb->data[0]) {
+       switch (skb->data[0]) {
        case CCP_CONFREQ:
-               if(is->debug & 0x10)
+               if (is->debug & 0x10)
                        printk(KERN_DEBUG "Disable compression here!\n");
-               if(proto == PPP_CCP)
-                       mis->compflags &= ~SC_COMP_ON;          
+               if (proto == PPP_CCP)
+                       mis->compflags &= ~SC_COMP_ON;
                else
-                       is->compflags &= ~SC_LINK_COMP_ON;              
+                       is->compflags &= ~SC_LINK_COMP_ON;
                break;
        case CCP_TERMREQ:
        case CCP_TERMACK:
-               if(is->debug & 0x10)
+               if (is->debug & 0x10)
                        printk(KERN_DEBUG "Disable (de)compression here!\n");
-               if(proto == PPP_CCP)
-                       mis->compflags &= ~(SC_DECOMP_ON|SC_COMP_ON);           
+               if (proto == PPP_CCP)
+                       mis->compflags &= ~(SC_DECOMP_ON | SC_COMP_ON);
                else
-                       is->compflags &= ~(SC_LINK_DECOMP_ON|SC_LINK_COMP_ON);          
+                       is->compflags &= ~(SC_LINK_DECOMP_ON | SC_LINK_COMP_ON);
                break;
        case CCP_CONFACK:
                /* if we RECEIVE an ackowledge we enable the decompressor */
-               if(is->debug & 0x10)
+               if (is->debug & 0x10)
                        printk(KERN_DEBUG "Enable decompression here!\n");
-               if(proto == PPP_CCP) {
+               if (proto == PPP_CCP) {
                        if (!mis->decompressor)
                                break;
                        mis->compflags |= SC_DECOMP_ON;
@@ -2706,11 +2706,11 @@ static void isdn_ppp_receive_ccp(isdn_net_dev *net_dev, isdn_net_local *lp,
                len = (skb->data[2] << 8) | skb->data[3];
                len -= 4;
 
-               if(proto == PPP_CCP) {
+               if (proto == PPP_CCP) {
                        /* If a reset Ack was outstanding for this id, then
                           clean up the state engine */
                        isdn_ppp_ccp_reset_ack_rcvd(mis, skb->data[1]);
-                       if(mis->decompressor && mis->decomp_stat)
+                       if (mis->decompressor && mis->decomp_stat)
                                mis->decompressor->
                                        reset(mis->decomp_stat,
                                              skb->data[0],
@@ -2722,7 +2722,7 @@ static void isdn_ppp_receive_ccp(isdn_net_dev *net_dev, isdn_net_local *lp,
                }
                else {
                        isdn_ppp_ccp_reset_ack_rcvd(is, skb->data[1]);
-                       if(is->link_decompressor && is->link_decomp_stat)
+                       if (is->link_decompressor && is->link_decomp_stat)
                                is->link_decompressor->
                                        reset(is->link_decomp_stat,
                                              skb->data[0],
@@ -2740,12 +2740,12 @@ static void isdn_ppp_receive_ccp(isdn_net_dev *net_dev, isdn_net_local *lp,
                /* Set up reset params for the reset entry */
                memset(&rsparm, 0, sizeof(rsparm));
                rsparm.data = rsdata;
-               rsparm.maxdlen = IPPP_RESET_MAXDATABYTES; 
+               rsparm.maxdlen = IPPP_RESET_MAXDATABYTES;
                /* Isolate data length */
                len = (skb->data[2] << 8) | skb->data[3];
                len -= 4;
-               if(proto == PPP_CCP) {
-                       if(mis->compressor && mis->comp_stat)
+               if (proto == PPP_CCP) {
+                       if (mis->compressor && mis->comp_stat)
                                mis->compressor->
                                        reset(mis->comp_stat,
                                              skb->data[0],
@@ -2754,7 +2754,7 @@ static void isdn_ppp_receive_ccp(isdn_net_dev *net_dev, isdn_net_local *lp,
                                              len, &rsparm);
                }
                else {
-                       if(is->link_compressor && is->link_comp_stat)
+                       if (is->link_compressor && is->link_comp_stat)
                                is->link_compressor->
                                        reset(is->link_comp_stat,
                                              skb->data[0],
@@ -2763,9 +2763,9 @@ static void isdn_ppp_receive_ccp(isdn_net_dev *net_dev, isdn_net_local *lp,
                                              len, &rsparm);
                }
                /* Ack the Req as specified by rsparm */
-               if(rsparm.valid) {
+               if (rsparm.valid) {
                        /* Compressor reset handler decided how to answer */
-                       if(rsparm.rsend) {
+                       if (rsparm.rsend) {
                                /* We should send a Frame */
                                isdn_ppp_ccp_xmit_reset(is, proto, CCP_RESETACK,
                                                        rsparm.idval ? rsparm.id
@@ -2817,69 +2817,69 @@ static void isdn_ppp_receive_ccp(isdn_net_dev *net_dev, isdn_net_local *lp,
 
 static void isdn_ppp_send_ccp(isdn_net_dev *net_dev, isdn_net_local *lp, struct sk_buff *skb)
 {
-       struct ippp_struct *mis,*is;
+       struct ippp_struct *mis, *is;
        int proto, slot = lp->ppp_slot;
        unsigned char *data;
 
-       if(!skb || skb->len < 3)
+       if (!skb || skb->len < 3)
                return;
        if (slot < 0 || slot >= ISDN_MAX_CHANNELS) {
                printk(KERN_ERR "%s: lp->ppp_slot(%d) out of range\n",
-                       __func__, slot);
+                      __func__, slot);
                return;
-       }       
+       }
        is = ippp_table[slot];
        /* Daemon may send with or without address and control field comp */
        data = skb->data;
-       if(!(is->pppcfg & SC_COMP_AC) && data[0] == 0xff && data[1] == 0x03) {
+       if (!(is->pppcfg & SC_COMP_AC) && data[0] == 0xff && data[1] == 0x03) {
                data += 2;
-               if(skb->len < 5)
+               if (skb->len < 5)
                        return;
        }
 
-       proto = ((int)data[0]<<8)+data[1];
-       if(proto != PPP_CCP && proto != PPP_CCPFRAG)
+       proto = ((int)data[0]<<8) + data[1];
+       if (proto != PPP_CCP && proto != PPP_CCPFRAG)
                return;
 
        printk(KERN_DEBUG "Received CCP frame from daemon:\n");
-       isdn_ppp_frame_log("ccp-xmit", skb->data, skb->len, 32, is->unit,lp->ppp_slot);
+       isdn_ppp_frame_log("ccp-xmit", skb->data, skb->len, 32, is->unit, lp->ppp_slot);
 
        if (lp->master) {
                slot = ISDN_MASTER_PRIV(lp)->ppp_slot;
                if (slot < 0 || slot >= ISDN_MAX_CHANNELS) {
                        printk(KERN_ERR "%s: slot(%d) out of range\n",
-                               __func__, slot);
+                              __func__, slot);
                        return;
-               }       
+               }
                mis = ippp_table[slot];
        } else
                mis = is;
        if (mis != is)
                printk(KERN_DEBUG "isdn_ppp: Ouch! Master CCP sends on slave slot!\n");
-       
-        switch(data[2]) {
+
+       switch (data[2]) {
        case CCP_CONFREQ:
-               if(is->debug & 0x10)
+               if (is->debug & 0x10)
                        printk(KERN_DEBUG "Disable decompression here!\n");
-               if(proto == PPP_CCP)
+               if (proto == PPP_CCP)
                        is->compflags &= ~SC_DECOMP_ON;
                else
                        is->compflags &= ~SC_LINK_DECOMP_ON;
                break;
        case CCP_TERMREQ:
        case CCP_TERMACK:
-               if(is->debug & 0x10)
+               if (is->debug & 0x10)
                        printk(KERN_DEBUG "Disable (de)compression here!\n");
-               if(proto == PPP_CCP)
-                       is->compflags &= ~(SC_DECOMP_ON|SC_COMP_ON);
+               if (proto == PPP_CCP)
+                       is->compflags &= ~(SC_DECOMP_ON | SC_COMP_ON);
                else
-                       is->compflags &= ~(SC_LINK_DECOMP_ON|SC_LINK_COMP_ON);
+                       is->compflags &= ~(SC_LINK_DECOMP_ON | SC_LINK_COMP_ON);
                break;
        case CCP_CONFACK:
                /* if we SEND an ackowledge we can/must enable the compressor */
-               if(is->debug & 0x10)
+               if (is->debug & 0x10)
                        printk(KERN_DEBUG "Enable compression here!\n");
-               if(proto == PPP_CCP) {
+               if (proto == PPP_CCP) {
                        if (!is->compressor)
                                break;
                        is->compflags |= SC_COMP_ON;
@@ -2891,21 +2891,21 @@ static void isdn_ppp_send_ccp(isdn_net_dev *net_dev, isdn_net_local *lp, struct
                break;
        case CCP_RESETACK:
                /* If we send a ACK we should reset our compressor */
-               if(is->debug & 0x10)
+               if (is->debug & 0x10)
                        printk(KERN_DEBUG "Reset decompression state here!\n");
                printk(KERN_DEBUG "ResetAck from daemon passed by\n");
-               if(proto == PPP_CCP) {
+               if (proto == PPP_CCP) {
                        /* link to master? */
-                       if(is->compressor && is->comp_stat)
+                       if (is->compressor && is->comp_stat)
                                is->compressor->reset(is->comp_stat, 0, 0,
                                                      NULL, 0, NULL);
-                       is->compflags &= ~SC_COMP_DISCARD;      
+                       is->compflags &= ~SC_COMP_DISCARD;
                }
                else {
-                       if(is->link_compressor && is->link_comp_stat)
+                       if (is->link_compressor && is->link_comp_stat)
                                is->link_compressor->reset(is->link_comp_stat,
                                                           0, 0, NULL, 0, NULL);
-                       is->compflags &= ~SC_LINK_COMP_DISCARD; 
+                       is->compflags &= ~SC_LINK_COMP_DISCARD;
                }
                break;
        case CCP_RESETREQ:
@@ -2919,7 +2919,7 @@ int isdn_ppp_register_compressor(struct isdn_ppp_compressor *ipc)
 {
        ipc->next = ipc_head;
        ipc->prev = NULL;
-       if(ipc_head) {
+       if (ipc_head) {
                ipc_head->prev = ipc;
        }
        ipc_head = ipc;
@@ -2928,11 +2928,11 @@ int isdn_ppp_register_compressor(struct isdn_ppp_compressor *ipc)
 
 int isdn_ppp_unregister_compressor(struct isdn_ppp_compressor *ipc)
 {
-       if(ipc->prev)
+       if (ipc->prev)
                ipc->prev->next = ipc->next;
        else
                ipc_head = ipc->next;
-       if(ipc->next)
+       if (ipc->next)
                ipc->next->prev = ipc->prev;
        ipc->prev = ipc->next = NULL;
        return 0;
@@ -2945,26 +2945,26 @@ static int isdn_ppp_set_compressor(struct ippp_struct *is, struct isdn_ppp_comp_
        void *stat;
        int num = data->num;
 
-       if(is->debug & 0x10)
-               printk(KERN_DEBUG "[%d] Set %s type %d\n",is->unit,
-                       (data->flags&IPPP_COMP_FLAG_XMIT)?"compressor":"decompressor",num);
+       if (is->debug & 0x10)
+               printk(KERN_DEBUG "[%d] Set %s type %d\n", is->unit,
+                      (data->flags & IPPP_COMP_FLAG_XMIT) ? "compressor" : "decompressor", num);
 
        /* If is has no valid reset state vector, we cannot allocate a
           decompressor. The decompressor would cause reset transactions
           sooner or later, and they need that vector. */
 
-       if(!(data->flags & IPPP_COMP_FLAG_XMIT) && !is->reset) {
+       if (!(data->flags & IPPP_COMP_FLAG_XMIT) && !is->reset) {
                printk(KERN_ERR "ippp_ccp: no reset data structure - can't"
                       " allow decompression.\n");
                return -ENOMEM;
        }
 
-       while(ipc) {
-               if(ipc->num == num) {
+       while (ipc) {
+               if (ipc->num == num) {
                        stat = ipc->alloc(data);
-                       if(stat) {
-                               ret = ipc->init(stat,data,is->unit,0);
-                               if(!ret) {
+                       if (stat) {
+                               ret = ipc->init(stat, data, is->unit, 0);
+                               if (!ret) {
                                        printk(KERN_ERR "Can't init (de)compression!\n");
                                        ipc->free(stat);
                                        stat = NULL;
@@ -2976,32 +2976,32 @@ static int isdn_ppp_set_compressor(struct ippp_struct *is, struct isdn_ppp_comp_
                                break;
                        }
 
-                        if(data->flags & IPPP_COMP_FLAG_XMIT) {
-                               if(data->flags & IPPP_COMP_FLAG_LINK) {
-                                       if(is->link_comp_stat)
+                       if (data->flags & IPPP_COMP_FLAG_XMIT) {
+                               if (data->flags & IPPP_COMP_FLAG_LINK) {
+                                       if (is->link_comp_stat)
                                                is->link_compressor->free(is->link_comp_stat);
                                        is->link_comp_stat = stat;
-                                       is->link_compressor = ipc;
+                                       is->link_compressor = ipc;
                                }
                                else {
-                                       if(is->comp_stat)
+                                       if (is->comp_stat)
                                                is->compressor->free(is->comp_stat);
                                        is->comp_stat = stat;
-                                       is->compressor = ipc;
+                                       is->compressor = ipc;
                                }
                        }
-                        else {
-                               if(data->flags & IPPP_COMP_FLAG_LINK) {
-                                       if(is->link_decomp_stat)
+                       else {
+                               if (data->flags & IPPP_COMP_FLAG_LINK) {
+                                       if (is->link_decomp_stat)
                                                is->link_decompressor->free(is->link_decomp_stat);
                                        is->link_decomp_stat = stat;
-                                       is->link_decompressor = ipc;
+                                       is->link_decompressor = ipc;
                                }
                                else {
-                                       if(is->decomp_stat)
+                                       if (is->decomp_stat)
                                                is->decompressor->free(is->decomp_stat);
                                        is->decomp_stat = stat;
-                                       is->decompressor = ipc;
+                                       is->decompressor = ipc;
                                }
                        }
                        return 0;
index 8cc05c7..4e9b893 100644 (file)
@@ -39,5 +39,3 @@ extern int isdn_ppp_unregister_compressor(struct isdn_ppp_compressor *ipc);
 #define IPPP_ASSIGNED  0x10
 
 #define IPPP_MAX_HEADER 10
-
-
index 2c26b64..89a2887 100644 (file)
@@ -61,7 +61,7 @@ char *isdn_tty_revision = "$Revision: 1.1.2.3 $";
  *      isdn_tty_readmodem().
  */
 static int
-isdn_tty_try_read(modem_info * info, struct sk_buff *skb)
+isdn_tty_try_read(modem_info *info, struct sk_buff *skb)
 {
        int c;
        int len;
@@ -93,7 +93,7 @@ isdn_tty_try_read(modem_info * info, struct sk_buff *skb)
                                                last = *dp;
                                        } else {
 #endif
-                                               if(len > 1)
+                                               if (len > 1)
                                                        tty_insert_flip_string(tty, skb->data, len - 1);
                                                last = skb->data[len - 1];
 #ifdef CONFIG_ISDN_AUDIO
@@ -179,7 +179,7 @@ isdn_tty_rcv_skb(int i, int di, int channel, struct sk_buff *skb)
        info = &dev->mdm.info[midx];
 #ifdef CONFIG_ISDN_AUDIO
        ifmt = 1;
-       
+
        if ((info->vonline) && (!info->emu.vpar[4]))
                isdn_audio_calc_dtmf(info, skb->data, skb->len, ifmt);
        if ((info->vonline & 1) && (info->emu.vpar[1]))
@@ -213,29 +213,29 @@ isdn_tty_rcv_skb(int i, int di, int channel, struct sk_buff *skb)
        if (info->vonline & 1) {
                /* voice conversion/compression */
                switch (info->emu.vpar[3]) {
-                       case 2:
-                       case 3:
-                       case 4:
-                               /* adpcm
-                                * Since compressed data takes less
-                                * space, we can overwrite the buffer.
-                                */
-                               skb_trim(skb, isdn_audio_xlaw2adpcm(info->adpcmr,
-                                                                   ifmt,
-                                                                   skb->data,
-                                                                   skb->data,
-                                                                   skb->len));
-                               break;
-                       case 5:
-                               /* a-law */
-                               if (!ifmt)
-                                       isdn_audio_ulaw2alaw(skb->data, skb->len);
-                               break;
-                       case 6:
-                               /* u-law */
-                               if (ifmt)
-                                       isdn_audio_alaw2ulaw(skb->data, skb->len);
-                               break;
+               case 2:
+               case 3:
+               case 4:
+                       /* adpcm
+                        * Since compressed data takes less
+                        * space, we can overwrite the buffer.
+                        */
+                       skb_trim(skb, isdn_audio_xlaw2adpcm(info->adpcmr,
+                                                           ifmt,
+                                                           skb->data,
+                                                           skb->data,
+                                                           skb->len));
+                       break;
+               case 5:
+                       /* a-law */
+                       if (!ifmt)
+                               isdn_audio_ulaw2alaw(skb->data, skb->len);
+                       break;
+               case 6:
+                       /* u-law */
+                       if (ifmt)
+                               isdn_audio_alaw2ulaw(skb->data, skb->len);
+                       break;
                }
                ISDN_AUDIO_SKB_DLECOUNT(skb) =
                        isdn_tty_countDLE(skb->data, skb->len);
@@ -275,7 +275,7 @@ isdn_tty_rcv_skb(int i, int di, int channel, struct sk_buff *skb)
 }
 
 static void
-isdn_tty_cleanup_xmit(modem_info * info)
+isdn_tty_cleanup_xmit(modem_info *info)
 {
        skb_queue_purge(&info->xmit_queue);
 #ifdef CONFIG_ISDN_AUDIO
@@ -284,7 +284,7 @@ isdn_tty_cleanup_xmit(modem_info * info)
 }
 
 static void
-isdn_tty_tint(modem_info * info)
+isdn_tty_tint(modem_info *info)
 {
        struct sk_buff *skb = skb_dequeue(&info->xmit_queue);
        int len, slen;
@@ -325,7 +325,7 @@ isdn_tty_countDLE(unsigned char *buf, int len)
  * DLE-decoding when sending audio-data.
  */
 static int
-isdn_tty_handleDLEdown(modem_info * info, atemu * m, int len)
+isdn_tty_handleDLEdown(modem_info *info, atemu *m, int len)
 {
        unsigned char *p = &info->xmit_buf[info->xmit_count];
        int count = 0;
@@ -334,42 +334,42 @@ isdn_tty_handleDLEdown(modem_info * info, atemu * m, int len)
                if (m->lastDLE) {
                        m->lastDLE = 0;
                        switch (*p) {
-                               case DLE:
-                                       /* Escape code */
-                                       if (len > 1)
-                                               memmove(p, p + 1, len - 1);
-                                       p--;
-                                       count++;
-                                       break;
-                               case ETX:
-                                       /* End of data */
-                                       info->vonline |= 4;
-                                       return count;
-                               case DC4:
-                                       /* Abort RX */
-                                       info->vonline &= ~1;
+                       case DLE:
+                               /* Escape code */
+                               if (len > 1)
+                                       memmove(p, p + 1, len - 1);
+                               p--;
+                               count++;
+                               break;
+                       case ETX:
+                               /* End of data */
+                               info->vonline |= 4;
+                               return count;
+                       case DC4:
+                               /* Abort RX */
+                               info->vonline &= ~1;
 #ifdef ISDN_DEBUG_MODEM_VOICE
-                                       printk(KERN_DEBUG
-                                              "DLEdown: got DLE-DC4, send DLE-ETX on ttyI%d\n",
-                                              info->line);
+                               printk(KERN_DEBUG
+                                      "DLEdown: got DLE-DC4, send DLE-ETX on ttyI%d\n",
+                                      info->line);
 #endif
-                                       isdn_tty_at_cout("\020\003", info);
-                                       if (!info->vonline) {
+                               isdn_tty_at_cout("\020\003", info);
+                               if (!info->vonline) {
 #ifdef ISDN_DEBUG_MODEM_VOICE
-                                               printk(KERN_DEBUG
-                                                      "DLEdown: send VCON on ttyI%d\n",
-                                                      info->line);
+                                       printk(KERN_DEBUG
+                                              "DLEdown: send VCON on ttyI%d\n",
+                                              info->line);
 #endif
-                                               isdn_tty_at_cout("\r\nVCON\r\n", info);
-                                       }
-                                       /* Fall through */
-                               case 'q':
-                               case 's':
-                                       /* Silence */
-                                       if (len > 1)
-                                               memmove(p, p + 1, len - 1);
-                                       p--;
-                                       break;
+                                       isdn_tty_at_cout("\r\nVCON\r\n", info);
+                               }
+                               /* Fall through */
+                       case 'q':
+                       case 's':
+                               /* Silence */
+                               if (len > 1)
+                                       memmove(p, p + 1, len - 1);
+                               p--;
+                               break;
                        }
                } else {
                        if (*p == DLE)
@@ -416,7 +416,7 @@ static int voice_cf[7] =
  * T.70 if necessary, and finally queues it up for sending via isdn_tty_tint.
  */
 static void
-isdn_tty_senddown(modem_info * info)
+isdn_tty_senddown(modem_info *info)
 {
        int buflen;
        int skb_res;
@@ -440,9 +440,9 @@ isdn_tty_senddown(modem_info * info)
 #endif
        if (!(buflen = info->xmit_count))
                return;
-       if ((info->emu.mdmreg[REG_CTS] & BIT_CTS) != 0)
+       if ((info->emu.mdmreg[REG_CTS] & BIT_CTS) != 0)
                info->msr &= ~UART_MSR_CTS;
-       info->lsr &= ~UART_LSR_TEMT;    
+       info->lsr &= ~UART_LSR_TEMT;
        /* info->xmit_count is modified here and in isdn_tty_write().
         * So we return here if isdn_tty_write() is in the
         * critical section.
@@ -485,32 +485,32 @@ isdn_tty_senddown(modem_info * info)
 
                /* voice conversion/decompression */
                switch (info->emu.vpar[3]) {
-                       case 2:
-                       case 3:
-                       case 4:
-                               /* adpcm, compatible to ZyXel 1496 modem
-                                * with ROM revision 6.01
-                                */
-                               audio_len = isdn_audio_adpcm2xlaw(info->adpcms,
-                                                                 ifmt,
-                                                                 skb->data,
-                                                   skb_put(skb, audio_len),
-                                                                 buflen);
-                               skb_pull(skb, buflen);
-                               skb_trim(skb, audio_len);
-                               break;
-                       case 5:
-                               /* a-law */
-                               if (!ifmt)
-                                       isdn_audio_alaw2ulaw(skb->data,
-                                                            buflen);
-                               break;
-                       case 6:
-                               /* u-law */
-                               if (ifmt)
-                                       isdn_audio_ulaw2alaw(skb->data,
-                                                            buflen);
-                               break;
+               case 2:
+               case 3:
+               case 4:
+                       /* adpcm, compatible to ZyXel 1496 modem
+                        * with ROM revision 6.01
+                        */
+                       audio_len = isdn_audio_adpcm2xlaw(info->adpcms,
+                                                         ifmt,
+                                                         skb->data,
+                                                         skb_put(skb, audio_len),
+                                                         buflen);
+                       skb_pull(skb, buflen);
+                       skb_trim(skb, audio_len);
+                       break;
+               case 5:
+                       /* a-law */
+                       if (!ifmt)
+                               isdn_audio_alaw2ulaw(skb->data,
+                                                    buflen);
+                       break;
+               case 6:
+                       /* u-law */
+                       if (ifmt)
+                               isdn_audio_ulaw2alaw(skb->data,
+                                                    buflen);
+                       break;
                }
        }
 #endif                          /* CONFIG_ISDN_AUDIO */
@@ -550,7 +550,7 @@ isdn_tty_modem_do_ncarrier(unsigned long data)
  * low.
  */
 static void
-isdn_tty_modem_ncarrier(modem_info * info)
+isdn_tty_modem_ncarrier(modem_info *info)
 {
        if (info->ncarrier) {
                info->nc_timer.expires = jiffies + HZ;
@@ -568,30 +568,30 @@ isdn_calc_usage(int si, int l2)
 
 #ifdef CONFIG_ISDN_AUDIO
        if (si == 1) {
-               switch(l2) {
-                       case ISDN_PROTO_L2_MODEM: 
-                               usg = ISDN_USAGE_MODEM;
-                               break;
+               switch (l2) {
+               case ISDN_PROTO_L2_MODEM:
+                       usg = ISDN_USAGE_MODEM;
+                       break;
 #ifdef CONFIG_ISDN_TTY_FAX
-                       case ISDN_PROTO_L2_FAX: 
-                               usg = ISDN_USAGE_FAX;
-                               break;
+               case ISDN_PROTO_L2_FAX:
+                       usg = ISDN_USAGE_FAX;
+                       break;
 #endif
-                       case ISDN_PROTO_L2_TRANS: 
-                       default:
-                               usg = ISDN_USAGE_VOICE;
-                               break;
+               case ISDN_PROTO_L2_TRANS:
+               default:
+                       usg = ISDN_USAGE_VOICE;
+                       break;
                }
        }
 #endif
-       return(usg);
+       return (usg);
 }
 
 /* isdn_tty_dial() performs dialing of a tty an the necessary
  * setup of the lower levels before that.
  */
 static void
-isdn_tty_dial(char *n, modem_info * info, atemu * m)
+isdn_tty_dial(char *n, modem_info *info, atemu *m)
 {
        int usg = ISDN_USAGE_MODEM;
        int si = 7;
@@ -608,10 +608,10 @@ isdn_tty_dial(char *n, modem_info * info, atemu * m)
                }
        usg = isdn_calc_usage(si, l2);
 #ifdef CONFIG_ISDN_AUDIO
-       if ((si == 1) && 
-               (l2 != ISDN_PROTO_L2_MODEM)
+       if ((si == 1) &&
+           (l2 != ISDN_PROTO_L2_MODEM)
 #ifdef CONFIG_ISDN_TTY_FAX
-               && (l2 != ISDN_PROTO_L2_FAX)
+           && (l2 != ISDN_PROTO_L2_FAX)
 #endif
                ) {
                l2 = ISDN_PROTO_L2_TRANS;
@@ -679,7 +679,7 @@ isdn_tty_dial(char *n, modem_info * info, atemu * m)
  * and some cleanup is done also.
  */
 void
-isdn_tty_modem_hup(modem_info * info, int local)
+isdn_tty_modem_hup(modem_info *info, int local)
 {
        isdn_ctrl cmd;
        int di, ch;
@@ -723,7 +723,7 @@ isdn_tty_modem_hup(modem_info * info, int local)
        info->adpcmr = NULL;
 #endif
        if ((info->msr & UART_MSR_RI) &&
-               (info->emu.mdmreg[REG_RUNG] & BIT_RUNG))
+           (info->emu.mdmreg[REG_RUNG] & BIT_RUNG))
                isdn_tty_modem_result(RESULT_RUNG, info);
        info->msr &= ~(UART_MSR_DCD | UART_MSR_RI);
        info->lsr |= UART_LSR_TEMT;
@@ -746,7 +746,7 @@ isdn_tty_modem_hup(modem_info * info, int local)
 }
 
 /*
- * Begin of a CAPI like interface, currently used only for 
+ * Begin of a CAPI like interface, currently used only for
  * supplementary service (CAPI 2.0 part III)
  */
 #include <linux/isdn/capicmd.h>
@@ -754,16 +754,16 @@ isdn_tty_modem_hup(modem_info * info, int local)
 
 int
 isdn_tty_capi_facility(capi_msg *cm) {
-       return(-1); /* dummy */
+       return (-1); /* dummy */
 }
 
 /* isdn_tty_suspend() tries to suspend the current tty connection
  */
 static void
-isdn_tty_suspend(char *id, modem_info * info, atemu * m)
+isdn_tty_suspend(char *id, modem_info *info, atemu *m)
 {
        isdn_ctrl cmd;
-       
+
        int l;
 
        if (!info)
@@ -774,7 +774,7 @@ isdn_tty_suspend(char *id, modem_info * info, atemu * m)
 #endif
        l = strlen(id);
        if ((info->isdn_driver >= 0)) {
-               cmd.parm.cmsg.Length = l+18;
+               cmd.parm.cmsg.Length = l + 18;
                cmd.parm.cmsg.Command = CAPI_FACILITY;
                cmd.parm.cmsg.Subcommand = CAPI_REQ;
                cmd.parm.cmsg.adr.Controller = info->isdn_driver + 1;
@@ -800,7 +800,7 @@ isdn_tty_suspend(char *id, modem_info * info, atemu * m)
  */
 
 static void
-isdn_tty_resume(char *id, modem_info * info, atemu * m)
+isdn_tty_resume(char *id, modem_info *info, atemu *m)
 {
        int usg = ISDN_USAGE_MODEM;
        int si = 7;
@@ -819,10 +819,10 @@ isdn_tty_resume(char *id, modem_info * info, atemu * m)
                }
        usg = isdn_calc_usage(si, l2);
 #ifdef CONFIG_ISDN_AUDIO
-       if ((si == 1) && 
-               (l2 != ISDN_PROTO_L2_MODEM)
+       if ((si == 1) &&
+           (l2 != ISDN_PROTO_L2_MODEM)
 #ifdef CONFIG_ISDN_TTY_FAX
-               && (l2 != ISDN_PROTO_L2_FAX)
+           && (l2 != ISDN_PROTO_L2_FAX)
 #endif
                ) {
                l2 = ISDN_PROTO_L2_TRANS;
@@ -864,18 +864,18 @@ isdn_tty_resume(char *id, modem_info * info, atemu * m)
                isdn_command(&cmd);
                cmd.driver = info->isdn_driver;
                cmd.arg = info->isdn_channel;
-               cmd.parm.cmsg.Length = l+18;
+               cmd.parm.cmsg.Length = l + 18;
                cmd.parm.cmsg.Command = CAPI_FACILITY;
                cmd.parm.cmsg.Subcommand = CAPI_REQ;
                cmd.parm.cmsg.adr.Controller = info->isdn_driver + 1;
                cmd.parm.cmsg.para[0] = 3; /* 16 bit 0x0003 suplementary service */
                cmd.parm.cmsg.para[1] = 0;
-               cmd.parm.cmsg.para[2] = l+3;
+               cmd.parm.cmsg.para[2] = l + 3;
                cmd.parm.cmsg.para[3] = 5; /* 16 bit 0x0005 Resume */
                cmd.parm.cmsg.para[4] = 0;
                cmd.parm.cmsg.para[5] = l;
                strncpy(&cmd.parm.cmsg.para[6], id, l);
-               cmd.command =CAPI_PUT_MESSAGE;
+               cmd.command = CAPI_PUT_MESSAGE;
                info->dialing = 1;
 //             strcpy(dev->num[i], n);
                isdn_info_update();
@@ -889,7 +889,7 @@ isdn_tty_resume(char *id, modem_info * info, atemu * m)
  */
 
 static void
-isdn_tty_send_msg(modem_info * info, atemu * m, char *msg)
+isdn_tty_send_msg(modem_info *info, atemu *m, char *msg)
 {
        int usg = ISDN_USAGE_MODEM;
        int si = 7;
@@ -912,10 +912,10 @@ isdn_tty_send_msg(modem_info * info, atemu * m, char *msg)
                }
        usg = isdn_calc_usage(si, l2);
 #ifdef CONFIG_ISDN_AUDIO
-       if ((si == 1) && 
-               (l2 != ISDN_PROTO_L2_MODEM)
+       if ((si == 1) &&
+           (l2 != ISDN_PROTO_L2_MODEM)
 #ifdef CONFIG_ISDN_TTY_FAX
-               && (l2 != ISDN_PROTO_L2_FAX)
+           && (l2 != ISDN_PROTO_L2_FAX)
 #endif
                ) {
                l2 = ISDN_PROTO_L2_TRANS;
@@ -956,14 +956,14 @@ isdn_tty_send_msg(modem_info * info, atemu * m, char *msg)
                isdn_command(&cmd);
                cmd.driver = info->isdn_driver;
                cmd.arg = info->isdn_channel;
-               cmd.parm.cmsg.Length = l+14;
+               cmd.parm.cmsg.Length = l + 14;
                cmd.parm.cmsg.Command = CAPI_MANUFACTURER;
                cmd.parm.cmsg.Subcommand = CAPI_REQ;
                cmd.parm.cmsg.adr.Controller = info->isdn_driver + 1;
-               cmd.parm.cmsg.para[0] = l+1;
+               cmd.parm.cmsg.para[0] = l + 1;
                strncpy(&cmd.parm.cmsg.para[1], msg, l);
-               cmd.parm.cmsg.para[l+1] = 0xd;
-               cmd.command =CAPI_PUT_MESSAGE;
+               cmd.parm.cmsg.para[l + 1] = 0xd;
+               cmd.command = CAPI_PUT_MESSAGE;
 /*             info->dialing = 1;
                strcpy(dev->num[i], n);
                isdn_info_update();
@@ -978,7 +978,7 @@ isdn_tty_paranoia_check(modem_info *info, char *name, const char *routine)
 #ifdef MODEM_PARANOIA_CHECK
        if (!info) {
                printk(KERN_WARNING "isdn_tty: null info_struct for %s in %s\n",
-                       name, routine);
+                      name, routine);
                return 1;
        }
        if (info->magic != ISDN_ASYNC_MAGIC) {
@@ -995,11 +995,11 @@ isdn_tty_paranoia_check(modem_info *info, char *name, const char *routine)
  * the specified baud rate for a serial port.
  */
 static void
-isdn_tty_change_speed(modem_info * info)
+isdn_tty_change_speed(modem_info *info)
 {
        uint cflag,
-        cval,
-        quot;
+               cval,
+               quot;
        int i;
 
        if (!info->tty || !info->tty->termios)
@@ -1051,7 +1051,7 @@ isdn_tty_change_speed(modem_info * info)
 }
 
 static int
-isdn_tty_startup(modem_info * info)
+isdn_tty_startup(modem_info *info)
 {
        if (info->flags & ISDN_ASYNC_INITIALIZED)
                return 0;
@@ -1081,7 +1081,7 @@ isdn_tty_startup(modem_info * info)
  * DTR is dropped if the hangup on close termio flag is on.
  */
 static void
-isdn_tty_shutdown(modem_info * info)
+isdn_tty_shutdown(modem_info *info)
 {
        if (!(info->flags & ISDN_ASYNC_INITIALIZED))
                return;
@@ -1116,7 +1116,7 @@ isdn_tty_shutdown(modem_info * info)
  *  - If dialing, abort dial.
  */
 static int
-isdn_tty_write(struct tty_struct *tty, const u_char * buf, int count)
+isdn_tty_write(struct tty_struct *tty, const u_char *buf, int count)
 {
        int c;
        int total = 0;
@@ -1176,27 +1176,27 @@ isdn_tty_write(struct tty_struct *tty, const u_char * buf, int count)
                                        }
                                }
                        } else
-                       if (TTY_IS_FCLASS1(info)) {
-                               int cc = isdn_tty_handleDLEdown(info, m, c);
-                               
-                               if (info->vonline & 4) { /* ETX seen */
-                                       isdn_ctrl c;
-
-                                       c.command = ISDN_CMD_FAXCMD;
-                                       c.driver = info->isdn_driver;
-                                       c.arg = info->isdn_channel;
-                                       c.parm.aux.cmd = ISDN_FAX_CLASS1_CTRL;
-                                       c.parm.aux.subcmd = ETX;
-                                       isdn_command(&c);
-                               }
-                               info->vonline = 0;
+                               if (TTY_IS_FCLASS1(info)) {
+                                       int cc = isdn_tty_handleDLEdown(info, m, c);
+
+                                       if (info->vonline & 4) { /* ETX seen */
+                                               isdn_ctrl c;
+
+                                               c.command = ISDN_CMD_FAXCMD;
+                                               c.driver = info->isdn_driver;
+                                               c.arg = info->isdn_channel;
+                                               c.parm.aux.cmd = ISDN_FAX_CLASS1_CTRL;
+                                               c.parm.aux.subcmd = ETX;
+                                               isdn_command(&c);
+                                       }
+                                       info->vonline = 0;
 #ifdef ISDN_DEBUG_MODEM_VOICE
-                               printk(KERN_DEBUG "fax dle cc/c %d/%d\n", cc, c);
+                                       printk(KERN_DEBUG "fax dle cc/c %d/%d\n", cc, c);
 #endif
-                               info->xmit_count += cc;
-                       } else
+                                       info->xmit_count += cc;
+                               } else
 #endif
-                               info->xmit_count += c;
+                                       info->xmit_count += c;
                } else {
                        info->msr |= UART_MSR_CTS;
                        info->lsr |= UART_LSR_TEMT;
@@ -1332,7 +1332,7 @@ isdn_tty_unthrottle(struct tty_struct *tty)
  *          allows RS485 driver to be written in user space.
  */
 static int
-isdn_tty_get_lsr_info(modem_info * info, uint __user * value)
+isdn_tty_get_lsr_info(modem_info *info, uint __user *value)
 {
        u_char status;
        uint result;
@@ -1363,16 +1363,16 @@ isdn_tty_tiocmget(struct tty_struct *tty)
        status = info->msr;
        mutex_unlock(&modem_info_mutex);
        return ((control & UART_MCR_RTS) ? TIOCM_RTS : 0)
-           | ((control & UART_MCR_DTR) ? TIOCM_DTR : 0)
-           | ((status & UART_MSR_DCD) ? TIOCM_CAR : 0)
-           | ((status & UART_MSR_RI) ? TIOCM_RNG : 0)
-           | ((status & UART_MSR_DSR) ? TIOCM_DSR : 0)
-           | ((status & UART_MSR_CTS) ? TIOCM_CTS : 0);
+               | ((control & UART_MCR_DTR) ? TIOCM_DTR : 0)
+               | ((status & UART_MSR_DCD) ? TIOCM_CAR : 0)
+               | ((status & UART_MSR_RI) ? TIOCM_RNG : 0)
+               | ((status & UART_MSR_DSR) ? TIOCM_DSR : 0)
+               | ((status & UART_MSR_CTS) ? TIOCM_CTS : 0);
 }
 
 static int
 isdn_tty_tiocmset(struct tty_struct *tty,
-               unsigned int set, unsigned int clear)
+                 unsigned int set, unsigned int clear)
 {
        modem_info *info = (modem_info *) tty->driver_data;
 
@@ -1422,34 +1422,34 @@ isdn_tty_ioctl(struct tty_struct *tty, uint cmd, ulong arg)
        if (tty->flags & (1 << TTY_IO_ERROR))
                return -EIO;
        switch (cmd) {
-               case TCSBRK:   /* SVID version: non-zero arg --> no break */
+       case TCSBRK:   /* SVID version: non-zero arg --> no break */
 #ifdef ISDN_DEBUG_MODEM_IOCTL
-                       printk(KERN_DEBUG "ttyI%d ioctl TCSBRK\n", info->line);
-#endif
-                       retval = tty_check_change(tty);
-                       if (retval)
-                               return retval;
-                       tty_wait_until_sent(tty, 0);
-                       return 0;
-               case TCSBRKP:  /* support for POSIX tcsendbreak() */
+               printk(KERN_DEBUG "ttyI%d ioctl TCSBRK\n", info->line);
+#endif
+               retval = tty_check_change(tty);
+               if (retval)
+                       return retval;
+               tty_wait_until_sent(tty, 0);
+               return 0;
+       case TCSBRKP:  /* support for POSIX tcsendbreak() */
 #ifdef ISDN_DEBUG_MODEM_IOCTL
-                       printk(KERN_DEBUG "ttyI%d ioctl TCSBRKP\n", info->line);
-#endif
-                       retval = tty_check_change(tty);
-                       if (retval)
-                               return retval;
-                       tty_wait_until_sent(tty, 0);
-                       return 0;
-               case TIOCSERGETLSR:     /* Get line status register */
+               printk(KERN_DEBUG "ttyI%d ioctl TCSBRKP\n", info->line);
+#endif
+               retval = tty_check_change(tty);
+               if (retval)
+                       return retval;
+               tty_wait_until_sent(tty, 0);
+               return 0;
+       case TIOCSERGETLSR:     /* Get line status register */
 #ifdef ISDN_DEBUG_MODEM_IOCTL
-                       printk(KERN_DEBUG "ttyI%d ioctl TIOCSERGETLSR\n", info->line);
+               printk(KERN_DEBUG "ttyI%d ioctl TIOCSERGETLSR\n", info->line);
 #endif
-                       return isdn_tty_get_lsr_info(info, (uint __user *) arg);
-               default:
+               return isdn_tty_get_lsr_info(info, (uint __user *) arg);
+       default:
 #ifdef ISDN_DEBUG_MODEM_IOCTL
-                       printk(KERN_DEBUG "UNKNOWN ioctl 0x%08x on ttyi%d\n", cmd, info->line);
+               printk(KERN_DEBUG "UNKNOWN ioctl 0x%08x on ttyi%d\n", cmd, info->line);
 #endif
-                       return -ENOIOCTLCMD;
+               return -ENOIOCTLCMD;
        }
        return 0;
 }
@@ -1479,7 +1479,7 @@ isdn_tty_set_termios(struct tty_struct *tty, struct ktermios *old_termios)
  * ------------------------------------------------------------
  */
 static int
-isdn_tty_block_til_ready(struct tty_struct *tty, struct file *filp, modem_info * info)
+isdn_tty_block_til_ready(struct tty_struct *tty, struct file *filp, modem_info *info)
 {
        DECLARE_WAITQUEUE(wait, NULL);
        int do_clocal = 0;
@@ -1603,7 +1603,7 @@ isdn_tty_open(struct tty_struct *tty, struct file *filp)
                return -ENODEV;
        }
 #ifdef ISDN_DEBUG_MODEM_OPEN
-       printk(KERN_DEBUG "isdn_tty_open %s, count = %d\n", tty->name, 
+       printk(KERN_DEBUG "isdn_tty_open %s, count = %d\n", tty->name,
               info->count);
 #endif
        info->count++;
@@ -1703,7 +1703,7 @@ isdn_tty_close(struct tty_struct *tty, struct file *filp)
                timeout = jiffies + HZ;
                while (!(info->lsr & UART_LSR_TEMT)) {
                        schedule_timeout_interruptible(20);
-                       if (time_after(jiffies,timeout))
+                       if (time_after(jiffies, timeout))
                                break;
                }
        }
@@ -1746,7 +1746,7 @@ isdn_tty_hangup(struct tty_struct *tty)
 /* This routine initializes all emulator-data.
  */
 static void
-isdn_tty_reset_profile(atemu * m)
+isdn_tty_reset_profile(atemu *m)
 {
        m->profile[0] = 0;
        m->profile[1] = 0;
@@ -1776,7 +1776,7 @@ isdn_tty_reset_profile(atemu * m)
 
 #ifdef CONFIG_ISDN_AUDIO
 static void
-isdn_tty_modem_reset_vpar(atemu * m)
+isdn_tty_modem_reset_vpar(atemu *m)
 {
        m->vpar[0] = 2;         /* Voice-device            (2 = phone line) */
        m->vpar[1] = 0;         /* Silence detection level (0 = none      ) */
@@ -1789,7 +1789,7 @@ isdn_tty_modem_reset_vpar(atemu * m)
 
 #ifdef CONFIG_ISDN_TTY_FAX
 static void
-isdn_tty_modem_reset_faxpar(modem_info * info)
+isdn_tty_modem_reset_faxpar(modem_info *info)
 {
        T30_s *f = info->fax;
 
@@ -1822,7 +1822,7 @@ isdn_tty_modem_reset_faxpar(modem_info * info)
 #endif
 
 static void
-isdn_tty_modem_reset_regs(modem_info * info, int force)
+isdn_tty_modem_reset_regs(modem_info *info, int force)
 {
        atemu *m = &info->emu;
        if ((m->mdmreg[REG_DTRR] & BIT_DTRR) || force) {
@@ -1841,7 +1841,7 @@ isdn_tty_modem_reset_regs(modem_info * info, int force)
 }
 
 static void
-modem_write_profile(atemu * m)
+modem_write_profile(atemu *m)
 {
        memcpy(m->profile, m->mdmreg, ISDN_MODEM_NUMREG);
        memcpy(m->pmsn, m->msn, ISDN_MSNLEN);
@@ -1851,7 +1851,7 @@ modem_write_profile(atemu * m)
 }
 
 static const struct tty_operations modem_ops = {
-        .open = isdn_tty_open,
+       .open = isdn_tty_open,
        .close = isdn_tty_close,
        .write = isdn_tty_write,
        .flush_chars = isdn_tty_flush_chars,
@@ -1951,7 +1951,7 @@ err_unregister:
                kfree(info->xmit_buf - 4);
        }
        tty_unregister_driver(m->tty_modem);
- err:
+err:
        put_tty_driver(m->tty_modem);
        m->tty_modem = NULL;
        return retval;
@@ -2021,8 +2021,8 @@ isdn_tty_match_icall(char *cid, atemu *emu, int di)
                int tmp;
                tmp = isdn_msncmp(cid, isdn_map_eaz2msn(emu->msn, di));
 #ifdef ISDN_DEBUG_MODEM_ICALL
-                       printk(KERN_DEBUG "m_fi: mmsn=%s -> tmp=%d\n",
-                              isdn_map_eaz2msn(emu->msn, di), tmp);
+               printk(KERN_DEBUG "m_fi: mmsn=%s -> tmp=%d\n",
+                      isdn_map_eaz2msn(emu->msn, di), tmp);
 #endif
                return tmp;
        }
@@ -2071,8 +2071,8 @@ isdn_tty_find_icall(int di, int ch, setup_parm *setup)
        for (i = 0; i < ISDN_MAX_CHANNELS; i++) {
                modem_info *info = &dev->mdm.info[i];
 
-                if (info->count == 0)
-                    continue;
+               if (info->count == 0)
+                       continue;
                if ((info->emu.mdmreg[REG_SI1] & si2bit[si1]) &&  /* SI1 is matching */
                    (info->emu.mdmreg[REG_SI2] == si2)) {         /* SI2 is matching */
                        idx = isdn_dc2minor(di, ch);
@@ -2099,7 +2099,7 @@ isdn_tty_find_icall(int di, int ch, setup_parm *setup)
                                        info->drv_index = idx;
                                        dev->m_idx[idx] = info->line;
                                        dev->usage[idx] &= ISDN_USAGE_EXCLUSIVE;
-                                       dev->usage[idx] |= isdn_calc_usage(si1, info->emu.mdmreg[REG_L2PROT]); 
+                                       dev->usage[idx] |= isdn_calc_usage(si1, info->emu.mdmreg[REG_L2PROT]);
                                        strcpy(dev->num[idx], nr);
                                        strcpy(info->emu.cpn, eaz);
                                        info->emu.mdmreg[REG_SI1I] = si2bit[si1];
@@ -2119,11 +2119,11 @@ isdn_tty_find_icall(int di, int ch, setup_parm *setup)
        }
        spin_unlock_irqrestore(&dev->lock, flags);
        printk(KERN_INFO "isdn_tty: call from %s -> %s %s\n", nr, eaz,
-              ((dev->drv[di]->flags & DRV_FLAG_REJBUS) && (wret != 2))? "rejected" : "ignored");
-       return (wret == 2)?3:0;
+              ((dev->drv[di]->flags & DRV_FLAG_REJBUS) && (wret != 2)) ? "rejected" : "ignored");
+       return (wret == 2) ? 3 : 0;
 }
 
-#define TTY_IS_ACTIVE(info) \
+#define TTY_IS_ACTIVE(info)                                            \
        (info->flags & (ISDN_ASYNC_NORMAL_ACTIVE | ISDN_ASYNC_CALLOUT_ACTIVE))
 
 int
@@ -2138,174 +2138,174 @@ isdn_tty_stat_callback(int i, isdn_ctrl *c)
        if ((mi = dev->m_idx[i]) >= 0) {
                info = &dev->mdm.info[mi];
                switch (c->command) {
-                        case ISDN_STAT_CINF:
-                                printk(KERN_DEBUG "CHARGEINFO on ttyI%d: %ld %s\n", info->line, c->arg, c->parm.num);
-                                info->emu.charge = (unsigned) simple_strtoul(c->parm.num, &e, 10);
-                                if (e == (char *)c->parm.num)
-                                       info->emu.charge = 0;
-                               
-                                break;                 
-                       case ISDN_STAT_BSENT:
-#ifdef ISDN_TTY_STAT_DEBUG
-                               printk(KERN_DEBUG "tty_STAT_BSENT ttyI%d\n", info->line);
-#endif
-                               if ((info->isdn_driver == c->driver) &&
-                                   (info->isdn_channel == c->arg)) {
-                                       info->msr |= UART_MSR_CTS;
-                                       if (info->send_outstanding)
-                                               if (!(--info->send_outstanding))
-                                                       info->lsr |= UART_LSR_TEMT;
-                                       isdn_tty_tint(info);
-                                       return 1;
-                               }
-                               break;
-                       case ISDN_STAT_CAUSE:
+               case ISDN_STAT_CINF:
+                       printk(KERN_DEBUG "CHARGEINFO on ttyI%d: %ld %s\n", info->line, c->arg, c->parm.num);
+                       info->emu.charge = (unsigned) simple_strtoul(c->parm.num, &e, 10);
+                       if (e == (char *)c->parm.num)
+                               info->emu.charge = 0;
+
+                       break;
+               case ISDN_STAT_BSENT:
 #ifdef ISDN_TTY_STAT_DEBUG
-                               printk(KERN_DEBUG "tty_STAT_CAUSE ttyI%d\n", info->line);
+                       printk(KERN_DEBUG "tty_STAT_BSENT ttyI%d\n", info->line);
 #endif
-                               /* Signal cause to tty-device */
-                               strncpy(info->last_cause, c->parm.num, 5);
+                       if ((info->isdn_driver == c->driver) &&
+                           (info->isdn_channel == c->arg)) {
+                               info->msr |= UART_MSR_CTS;
+                               if (info->send_outstanding)
+                                       if (!(--info->send_outstanding))
+                                               info->lsr |= UART_LSR_TEMT;
+                               isdn_tty_tint(info);
                                return 1;
-                       case ISDN_STAT_DISPLAY:
+                       }
+                       break;
+               case ISDN_STAT_CAUSE:
 #ifdef ISDN_TTY_STAT_DEBUG
-                               printk(KERN_DEBUG "tty_STAT_DISPLAY ttyI%d\n", info->line);
-#endif
-                               /* Signal display to tty-device */
-                               if ((info->emu.mdmreg[REG_DISPLAY] & BIT_DISPLAY) && 
-                                       !(info->emu.mdmreg[REG_RESPNUM] & BIT_RESPNUM)) {
-                                 isdn_tty_at_cout("\r\n", info);
-                                 isdn_tty_at_cout("DISPLAY: ", info);
-                                 isdn_tty_at_cout(c->parm.display, info);
-                                 isdn_tty_at_cout("\r\n", info);
-                               }
-                               return 1;
-                       case ISDN_STAT_DCONN:
+                       printk(KERN_DEBUG "tty_STAT_CAUSE ttyI%d\n", info->line);
+#endif
+                       /* Signal cause to tty-device */
+                       strncpy(info->last_cause, c->parm.num, 5);
+                       return 1;
+               case ISDN_STAT_DISPLAY:
 #ifdef ISDN_TTY_STAT_DEBUG
-                               printk(KERN_DEBUG "tty_STAT_DCONN ttyI%d\n", info->line);
+                       printk(KERN_DEBUG "tty_STAT_DISPLAY ttyI%d\n", info->line);
 #endif
-                               if (TTY_IS_ACTIVE(info)) {
-                                       if (info->dialing == 1) {
-                                               info->dialing = 2;
-                                               return 1;
-                                       }
+                       /* Signal display to tty-device */
+                       if ((info->emu.mdmreg[REG_DISPLAY] & BIT_DISPLAY) &&
+                           !(info->emu.mdmreg[REG_RESPNUM] & BIT_RESPNUM)) {
+                               isdn_tty_at_cout("\r\n", info);
+                               isdn_tty_at_cout("DISPLAY: ", info);
+                               isdn_tty_at_cout(c->parm.display, info);
+                               isdn_tty_at_cout("\r\n", info);
+                       }
+                       return 1;
+               case ISDN_STAT_DCONN:
+#ifdef ISDN_TTY_STAT_DEBUG
+                       printk(KERN_DEBUG "tty_STAT_DCONN ttyI%d\n", info->line);
+#endif
+                       if (TTY_IS_ACTIVE(info)) {
+                               if (info->dialing == 1) {
+                                       info->dialing = 2;
+                                       return 1;
                                }
-                               break;
-                       case ISDN_STAT_DHUP:
+                       }
+                       break;
+               case ISDN_STAT_DHUP:
 #ifdef ISDN_TTY_STAT_DEBUG
-                               printk(KERN_DEBUG "tty_STAT_DHUP ttyI%d\n", info->line);
+                       printk(KERN_DEBUG "tty_STAT_DHUP ttyI%d\n", info->line);
 #endif
-                               if (TTY_IS_ACTIVE(info)) {
-                                       if (info->dialing == 1) 
-                                               isdn_tty_modem_result(RESULT_BUSY, info);
-                                       if (info->dialing > 1) 
-                                               isdn_tty_modem_result(RESULT_NO_CARRIER, info);
-                                       info->dialing = 0;
+                       if (TTY_IS_ACTIVE(info)) {
+                               if (info->dialing == 1)
+                                       isdn_tty_modem_result(RESULT_BUSY, info);
+                               if (info->dialing > 1)
+                                       isdn_tty_modem_result(RESULT_NO_CARRIER, info);
+                               info->dialing = 0;
 #ifdef ISDN_DEBUG_MODEM_HUP
-                                       printk(KERN_DEBUG "Mhup in ISDN_STAT_DHUP\n");
+                               printk(KERN_DEBUG "Mhup in ISDN_STAT_DHUP\n");
 #endif
-                                       isdn_tty_modem_hup(info, 0);
-                                       return 1;
-                               }
-                               break;
-                       case ISDN_STAT_BCONN:
+                               isdn_tty_modem_hup(info, 0);
+                               return 1;
+                       }
+                       break;
+               case ISDN_STAT_BCONN:
 #ifdef ISDN_TTY_STAT_DEBUG
-                               printk(KERN_DEBUG "tty_STAT_BCONN ttyI%d\n", info->line);
-#endif
-                               /* Wake up any processes waiting
-                                * for incoming call of this device when
-                                * DCD follow the state of incoming carrier
-                                */
-                               if (info->blocked_open &&
-                                  (info->emu.mdmreg[REG_DCD] & BIT_DCD)) {
-                                       wake_up_interruptible(&info->open_wait);
-                               }
+                       printk(KERN_DEBUG "tty_STAT_BCONN ttyI%d\n", info->line);
+#endif
+                       /* Wake up any processes waiting
+                        * for incoming call of this device when
+                        * DCD follow the state of incoming carrier
+                        */
+                       if (info->blocked_open &&
+                           (info->emu.mdmreg[REG_DCD] & BIT_DCD)) {
+                               wake_up_interruptible(&info->open_wait);
+                       }
 
-                               /* Schedule CONNECT-Message to any tty
-                                * waiting for it and
-                                * set DCD-bit of its modem-status.
-                                */
-                               if (TTY_IS_ACTIVE(info) ||
-                                   (info->blocked_open && (info->emu.mdmreg[REG_DCD] & BIT_DCD))) {
-                                       info->msr |= UART_MSR_DCD;
-                                       info->emu.charge = 0;
-                                       if (info->dialing & 0xf)
-                                               info->last_dir = 1;
-                                       else
-                                               info->last_dir = 0;
-                                       info->dialing = 0;
-                                       info->rcvsched = 1;
-                                       if (USG_MODEM(dev->usage[i])) {
-                                               if (info->emu.mdmreg[REG_L2PROT] == ISDN_PROTO_L2_MODEM) {
-                                                       strcpy(info->emu.connmsg, c->parm.num);
-                                                       isdn_tty_modem_result(RESULT_CONNECT, info);
-                                               } else
-                                                       isdn_tty_modem_result(RESULT_CONNECT64000, info);
-                                       }
-                                       if (USG_VOICE(dev->usage[i]))
-                                               isdn_tty_modem_result(RESULT_VCON, info);
-                                       return 1;
+                       /* Schedule CONNECT-Message to any tty
+                        * waiting for it and
+                        * set DCD-bit of its modem-status.
+                        */
+                       if (TTY_IS_ACTIVE(info) ||
+                           (info->blocked_open && (info->emu.mdmreg[REG_DCD] & BIT_DCD))) {
+                               info->msr |= UART_MSR_DCD;
+                               info->emu.charge = 0;
+                               if (info->dialing & 0xf)
+                                       info->last_dir = 1;
+                               else
+                                       info->last_dir = 0;
+                               info->dialing = 0;
+                               info->rcvsched = 1;
+                               if (USG_MODEM(dev->usage[i])) {
+                                       if (info->emu.mdmreg[REG_L2PROT] == ISDN_PROTO_L2_MODEM) {
+                                               strcpy(info->emu.connmsg, c->parm.num);
+                                               isdn_tty_modem_result(RESULT_CONNECT, info);
+                                       } else
+                                               isdn_tty_modem_result(RESULT_CONNECT64000, info);
                                }
-                               break;
-                       case ISDN_STAT_BHUP:
+                               if (USG_VOICE(dev->usage[i]))
+                                       isdn_tty_modem_result(RESULT_VCON, info);
+                               return 1;
+                       }
+                       break;
+               case ISDN_STAT_BHUP:
 #ifdef ISDN_TTY_STAT_DEBUG
-                               printk(KERN_DEBUG "tty_STAT_BHUP ttyI%d\n", info->line);
+                       printk(KERN_DEBUG "tty_STAT_BHUP ttyI%d\n", info->line);
 #endif
-                               if (TTY_IS_ACTIVE(info)) {
+                       if (TTY_IS_ACTIVE(info)) {
 #ifdef ISDN_DEBUG_MODEM_HUP
-                                       printk(KERN_DEBUG "Mhup in ISDN_STAT_BHUP\n");
+                               printk(KERN_DEBUG "Mhup in ISDN_STAT_BHUP\n");
 #endif
-                                       isdn_tty_modem_hup(info, 0);
-                                       return 1;
-                               }
-                               break;
-                       case ISDN_STAT_NODCH:
+                               isdn_tty_modem_hup(info, 0);
+                               return 1;
+                       }
+                       break;
+               case ISDN_STAT_NODCH:
 #ifdef ISDN_TTY_STAT_DEBUG
-                               printk(KERN_DEBUG "tty_STAT_NODCH ttyI%d\n", info->line);
-#endif
-                               if (TTY_IS_ACTIVE(info)) {
-                                       if (info->dialing) {
-                                               info->dialing = 0;
-                                               info->last_l2 = -1;
-                                               info->last_si = 0;
-                                               sprintf(info->last_cause, "0000");
-                                               isdn_tty_modem_result(RESULT_NO_DIALTONE, info);
-                                       }
-                                       isdn_tty_modem_hup(info, 0);
-                                       return 1;
+                       printk(KERN_DEBUG "tty_STAT_NODCH ttyI%d\n", info->line);
+#endif
+                       if (TTY_IS_ACTIVE(info)) {
+                               if (info->dialing) {
+                                       info->dialing = 0;
+                                       info->last_l2 = -1;
+                                       info->last_si = 0;
+                                       sprintf(info->last_cause, "0000");
+                                       isdn_tty_modem_result(RESULT_NO_DIALTONE, info);
                                }
-                               break;
-                       case ISDN_STAT_UNLOAD:
+                               isdn_tty_modem_hup(info, 0);
+                               return 1;
+                       }
+                       break;
+               case ISDN_STAT_UNLOAD:
 #ifdef ISDN_TTY_STAT_DEBUG
-                               printk(KERN_DEBUG "tty_STAT_UNLOAD ttyI%d\n", info->line);
+                       printk(KERN_DEBUG "tty_STAT_UNLOAD ttyI%d\n", info->line);
 #endif
-                               for (i = 0; i < ISDN_MAX_CHANNELS; i++) {
-                                       info = &dev->mdm.info[i];
-                                       if (info->isdn_driver == c->driver) {
-                                               if (info->online)
-                                                       isdn_tty_modem_hup(info, 1);
-                                       }
+                       for (i = 0; i < ISDN_MAX_CHANNELS; i++) {
+                               info = &dev->mdm.info[i];
+                               if (info->isdn_driver == c->driver) {
+                                       if (info->online)
+                                               isdn_tty_modem_hup(info, 1);
                                }
-                               return 1;
+                       }
+                       return 1;
 #ifdef CONFIG_ISDN_TTY_FAX
-                       case ISDN_STAT_FAXIND:
-                               if (TTY_IS_ACTIVE(info)) {
-                                       isdn_tty_fax_command(info, c); 
-                               }
-                               break;
+               case ISDN_STAT_FAXIND:
+                       if (TTY_IS_ACTIVE(info)) {
+                               isdn_tty_fax_command(info, c);
+                       }
+                       break;
 #endif
 #ifdef CONFIG_ISDN_AUDIO
-                       case ISDN_STAT_AUDIO:
-                               if (TTY_IS_ACTIVE(info)) {
-                                       switch(c->parm.num[0]) {
-                                               case ISDN_AUDIO_DTMF:
-                                                       if (info->vonline) {
-                                                               isdn_audio_put_dle_code(info,
+               case ISDN_STAT_AUDIO:
+                       if (TTY_IS_ACTIVE(info)) {
+                               switch (c->parm.num[0]) {
+                               case ISDN_AUDIO_DTMF:
+                                       if (info->vonline) {
+                                               isdn_audio_put_dle_code(info,
                                                                        c->parm.num[1]);
-                                                       }
-                                                       break;
                                        }
+                                       break;
                                }
-                               break;
+                       }
+                       break;
 #endif
                }
        }
@@ -2314,16 +2314,16 @@ isdn_tty_stat_callback(int i, isdn_ctrl *c)
 
 /*********************************************************************
  Modem-Emulator-Routines
- *********************************************************************/
+*********************************************************************/
 
-#define cmdchar(c) ((c>=' ')&&(c<=0x7f))
+#define cmdchar(c) ((c >= ' ') && (c <= 0x7f))
 
 /*
  * Put a message from the AT-emulator into receive-buffer of tty,
  * convert CR, LF, and BS to values in modem-registers 3, 4 and 5.
  */
 void
-isdn_tty_at_cout(char *msg, modem_info * info)
+isdn_tty_at_cout(char *msg, modem_info *info)
 {
        struct tty_struct *tty;
        atemu *m = &info->emu;
@@ -2351,7 +2351,7 @@ isdn_tty_at_cout(char *msg, modem_info * info)
        /* use queue instead of direct, if online and */
        /* data is in queue or buffer is full */
        if (info->online && ((tty_buffer_request_room(tty, l) < l) ||
-           !skb_queue_empty(&dev->drv[info->isdn_driver]->rpqueue[info->isdn_channel]))) {
+                            !skb_queue_empty(&dev->drv[info->isdn_driver]->rpqueue[info->isdn_channel]))) {
                skb = alloc_skb(l, GFP_ATOMIC);
                if (!skb) {
                        spin_unlock_irqrestore(&info->readlock, flags);
@@ -2366,22 +2366,22 @@ isdn_tty_at_cout(char *msg, modem_info * info)
 
        for (p = msg; *p; p++) {
                switch (*p) {
-                       case '\r':
-                               c = m->mdmreg[REG_CR];
-                               break;
-                       case '\n':
-                               c = m->mdmreg[REG_LF];
-                               break;
-                       case '\b':
-                               c = m->mdmreg[REG_BS];
-                               break;
-                       default:
-                               c = *p;
+               case '\r':
+                       c = m->mdmreg[REG_CR];
+                       break;
+               case '\n':
+                       c = m->mdmreg[REG_LF];
+                       break;
+               case '\b':
+                       c = m->mdmreg[REG_BS];
+                       break;
+               default:
+                       c = *p;
                }
                if (skb) {
                        *sp++ = c;
                } else {
-                       if(tty_insert_flip_char(tty, c, TTY_NORMAL) == 0)
+                       if (tty_insert_flip_char(tty, c, TTY_NORMAL) == 0)
                                break;
                }
        }
@@ -2403,7 +2403,7 @@ isdn_tty_at_cout(char *msg, modem_info * info)
  * Perform ATH Hangup
  */
 static void
-isdn_tty_on_hook(modem_info * info)
+isdn_tty_on_hook(modem_info *info)
 {
        if (info->isdn_channel >= 0) {
 #ifdef ISDN_DEBUG_MODEM_HUP
@@ -2419,8 +2419,8 @@ isdn_tty_off_hook(void)
        printk(KERN_DEBUG "isdn_tty_off_hook\n");
 }
 
-#define PLUSWAIT1 (HZ/2)        /* 0.5 sec. */
-#define PLUSWAIT2 (HZ*3/2)      /* 1.5 sec */
+#define PLUSWAIT1 (HZ / 2)      /* 0.5 sec. */
+#define PLUSWAIT2 (HZ * 3 / 2)  /* 1.5 sec */
 
 /*
  * Check Buffer for Modem-escape-sequence, activate timer-callback to
@@ -2434,7 +2434,7 @@ isdn_tty_off_hook(void)
  *   lastplus   timestamp of last character
  */
 static void
-isdn_tty_check_esc(const u_char * p, u_char plus, int count, int *pluscount,
+isdn_tty_check_esc(const u_char *p, u_char plus, int count, int *pluscount,
                   u_long *lastplus)
 {
        if (plus > 127)
@@ -2474,69 +2474,69 @@ isdn_tty_check_esc(const u_char * p, u_char plus, int count, int *pluscount,
  */
 
 static void
-isdn_tty_modem_result(int code, modem_info * info)
+isdn_tty_modem_result(int code, modem_info *info)
 {
        atemu *m = &info->emu;
        static char *msg[] =
-       {"OK", "CONNECT", "RING", "NO CARRIER", "ERROR",
-        "CONNECT 64000", "NO DIALTONE", "BUSY", "NO ANSWER",
-        "RINGING", "NO MSN/EAZ", "VCON", "RUNG"};
-       char s[ISDN_MSNLEN+10];
+               {"OK", "CONNECT", "RING", "NO CARRIER", "ERROR",
+                "CONNECT 64000", "NO DIALTONE", "BUSY", "NO ANSWER",
+                "RINGING", "NO MSN/EAZ", "VCON", "RUNG"};
+       char s[ISDN_MSNLEN + 10];
 
        switch (code) {
-               case RESULT_RING:
-                       m->mdmreg[REG_RINGCNT]++;
-                       if (m->mdmreg[REG_RINGCNT] == m->mdmreg[REG_RINGATA])
-                               /* Automatically accept incoming call */
-                               isdn_tty_cmd_ATA(info);
-                       break;
-               case RESULT_NO_CARRIER:
+       case RESULT_RING:
+               m->mdmreg[REG_RINGCNT]++;
+               if (m->mdmreg[REG_RINGCNT] == m->mdmreg[REG_RINGATA])
+                       /* Automatically accept incoming call */
+                       isdn_tty_cmd_ATA(info);
+               break;
+       case RESULT_NO_CARRIER:
 #ifdef ISDN_DEBUG_MODEM_HUP
-                       printk(KERN_DEBUG "modem_result: NO CARRIER %d %d\n",
-                              (info->flags & ISDN_ASYNC_CLOSING),
-                              (!info->tty));
-#endif
-                       m->mdmreg[REG_RINGCNT] = 0;
-                       del_timer(&info->nc_timer);
-                       info->ncarrier = 0;
-                       if ((info->flags & ISDN_ASYNC_CLOSING) || (!info->tty)) {
-                               return;
-                       }
+               printk(KERN_DEBUG "modem_result: NO CARRIER %d %d\n",
+                      (info->flags & ISDN_ASYNC_CLOSING),
+                      (!info->tty));
+#endif
+               m->mdmreg[REG_RINGCNT] = 0;
+               del_timer(&info->nc_timer);
+               info->ncarrier = 0;
+               if ((info->flags & ISDN_ASYNC_CLOSING) || (!info->tty)) {
+                       return;
+               }
 #ifdef CONFIG_ISDN_AUDIO
-                       if (info->vonline & 1) {
+               if (info->vonline & 1) {
 #ifdef ISDN_DEBUG_MODEM_VOICE
-                               printk(KERN_DEBUG "res3: send DLE-ETX on ttyI%d\n",
-                                      info->line);
+                       printk(KERN_DEBUG "res3: send DLE-ETX on ttyI%d\n",
+                              info->line);
 #endif
-                               /* voice-recording, add DLE-ETX */
-                               isdn_tty_at_cout("\020\003", info);
-                       }
-                       if (info->vonline & 2) {
+                       /* voice-recording, add DLE-ETX */
+                       isdn_tty_at_cout("\020\003", info);
+               }
+               if (info->vonline & 2) {
 #ifdef ISDN_DEBUG_MODEM_VOICE
-                               printk(KERN_DEBUG "res3: send DLE-DC4 on ttyI%d\n",
-                                      info->line);
+                       printk(KERN_DEBUG "res3: send DLE-DC4 on ttyI%d\n",
+                              info->line);
 #endif
-                               /* voice-playing, add DLE-DC4 */
-                               isdn_tty_at_cout("\020\024", info);
-                       }
+                       /* voice-playing, add DLE-DC4 */
+                       isdn_tty_at_cout("\020\024", info);
+               }
 #endif
-                       break;
-               case RESULT_CONNECT:
-               case RESULT_CONNECT64000:
-                       sprintf(info->last_cause, "0000");
-                       if (!info->online)
-                               info->online = 2;
-                       break;
-               case RESULT_VCON:
+               break;
+       case RESULT_CONNECT:
+       case RESULT_CONNECT64000:
+               sprintf(info->last_cause, "0000");
+               if (!info->online)
+                       info->online = 2;
+               break;
+       case RESULT_VCON:
 #ifdef ISDN_DEBUG_MODEM_VOICE
-                       printk(KERN_DEBUG "res3: send VCON on ttyI%d\n",
-                              info->line);
+               printk(KERN_DEBUG "res3: send VCON on ttyI%d\n",
+                      info->line);
 #endif
-                       sprintf(info->last_cause, "0000");
-                       if (!info->online)
-                               info->online = 1;
-                       break;
-       } /* switch(code) */
+               sprintf(info->last_cause, "0000");
+               if (!info->online)
+                       info->online = 1;
+               break;
+       } /* switch (code) */
 
        if (m->mdmreg[REG_RESP] & BIT_RESP) {
                /* Show results */
@@ -2546,87 +2546,87 @@ isdn_tty_modem_result(int code, modem_info * info)
                        isdn_tty_at_cout(s, info);
                } else {
                        if (code == RESULT_RING) {
-                           /* return if "show RUNG" and ringcounter>1 */
-                           if ((m->mdmreg[REG_RUNG] & BIT_RUNG) &&
+                               /* return if "show RUNG" and ringcounter>1 */
+                               if ((m->mdmreg[REG_RUNG] & BIT_RUNG) &&
                                    (m->mdmreg[REG_RINGCNT] > 1))
-                                               return;
-                           /* print CID, _before_ _every_ ring */
-                           if (!(m->mdmreg[REG_CIDONCE] & BIT_CIDONCE)) {
-                                   isdn_tty_at_cout("\r\nCALLER NUMBER: ", info);
-                                   isdn_tty_at_cout(dev->num[info->drv_index], info);
-                                   if (m->mdmreg[REG_CDN] & BIT_CDN) {
-                                           isdn_tty_at_cout("\r\nCALLED NUMBER: ", info);
-                                           isdn_tty_at_cout(info->emu.cpn, info);
-                                   }
-                           }
+                                       return;
+                               /* print CID, _before_ _every_ ring */
+                               if (!(m->mdmreg[REG_CIDONCE] & BIT_CIDONCE)) {
+                                       isdn_tty_at_cout("\r\nCALLER NUMBER: ", info);
+                                       isdn_tty_at_cout(dev->num[info->drv_index], info);
+                                       if (m->mdmreg[REG_CDN] & BIT_CDN) {
+                                               isdn_tty_at_cout("\r\nCALLED NUMBER: ", info);
+                                               isdn_tty_at_cout(info->emu.cpn, info);
+                                       }
+                               }
                        }
                        isdn_tty_at_cout("\r\n", info);
                        isdn_tty_at_cout(msg[code], info);
                        switch (code) {
-                               case RESULT_CONNECT:
-                                       switch (m->mdmreg[REG_L2PROT]) {
-                                               case ISDN_PROTO_L2_MODEM:
-                                                       isdn_tty_at_cout(" ", info);
-                                                       isdn_tty_at_cout(m->connmsg, info);
-                                                       break;
-                                       }
+                       case RESULT_CONNECT:
+                               switch (m->mdmreg[REG_L2PROT]) {
+                               case ISDN_PROTO_L2_MODEM:
+                                       isdn_tty_at_cout(" ", info);
+                                       isdn_tty_at_cout(m->connmsg, info);
                                        break;
-                               case RESULT_RING:
-                                       /* Append CPN, if enabled */
-                                       if ((m->mdmreg[REG_CPN] & BIT_CPN)) {
-                                               sprintf(s, "/%s", m->cpn);
-                                               isdn_tty_at_cout(s, info);
-                                       }
-                                       /* Print CID only once, _after_ 1st RING */
-                                       if ((m->mdmreg[REG_CIDONCE] & BIT_CIDONCE) &&
-                                           (m->mdmreg[REG_RINGCNT] == 1)) {
-                                               isdn_tty_at_cout("\r\n", info);
-                                               isdn_tty_at_cout("CALLER NUMBER: ", info);
-                                               isdn_tty_at_cout(dev->num[info->drv_index], info);
-                                               if (m->mdmreg[REG_CDN] & BIT_CDN) {
-                                                       isdn_tty_at_cout("\r\nCALLED NUMBER: ", info);
-                                                       isdn_tty_at_cout(info->emu.cpn, info);
-                                               }
+                               }
+                               break;
+                       case RESULT_RING:
+                               /* Append CPN, if enabled */
+                               if ((m->mdmreg[REG_CPN] & BIT_CPN)) {
+                                       sprintf(s, "/%s", m->cpn);
+                                       isdn_tty_at_cout(s, info);
+                               }
+                               /* Print CID only once, _after_ 1st RING */
+                               if ((m->mdmreg[REG_CIDONCE] & BIT_CIDONCE) &&
+                                   (m->mdmreg[REG_RINGCNT] == 1)) {
+                                       isdn_tty_at_cout("\r\n", info);
+                                       isdn_tty_at_cout("CALLER NUMBER: ", info);
+                                       isdn_tty_at_cout(dev->num[info->drv_index], info);
+                                       if (m->mdmreg[REG_CDN] & BIT_CDN) {
+                                               isdn_tty_at_cout("\r\nCALLED NUMBER: ", info);
+                                               isdn_tty_at_cout(info->emu.cpn, info);
                                        }
+                               }
+                               break;
+                       case RESULT_NO_CARRIER:
+                       case RESULT_NO_DIALTONE:
+                       case RESULT_BUSY:
+                       case RESULT_NO_ANSWER:
+                               m->mdmreg[REG_RINGCNT] = 0;
+                               /* Append Cause-Message if enabled */
+                               if (m->mdmreg[REG_RESPXT] & BIT_RESPXT) {
+                                       sprintf(s, "/%s", info->last_cause);
+                                       isdn_tty_at_cout(s, info);
+                               }
+                               break;
+                       case RESULT_CONNECT64000:
+                               /* Append Protocol to CONNECT message */
+                               switch (m->mdmreg[REG_L2PROT]) {
+                               case ISDN_PROTO_L2_X75I:
+                               case ISDN_PROTO_L2_X75UI:
+                               case ISDN_PROTO_L2_X75BUI:
+                                       isdn_tty_at_cout("/X.75", info);
                                        break;
-                               case RESULT_NO_CARRIER:
-                               case RESULT_NO_DIALTONE:
-                               case RESULT_BUSY:
-                               case RESULT_NO_ANSWER:
-                                       m->mdmreg[REG_RINGCNT] = 0;
-                                       /* Append Cause-Message if enabled */
-                                       if (m->mdmreg[REG_RESPXT] & BIT_RESPXT) {
-                                               sprintf(s, "/%s", info->last_cause);
-                                               isdn_tty_at_cout(s, info);
-                                       }
+                               case ISDN_PROTO_L2_HDLC:
+                                       isdn_tty_at_cout("/HDLC", info);
                                        break;
-                               case RESULT_CONNECT64000:
-                                       /* Append Protocol to CONNECT message */
-                                       switch (m->mdmreg[REG_L2PROT]) {
-                                               case ISDN_PROTO_L2_X75I:
-                                               case ISDN_PROTO_L2_X75UI:
-                                               case ISDN_PROTO_L2_X75BUI:
-                                                       isdn_tty_at_cout("/X.75", info);
-                                                       break;
-                                               case ISDN_PROTO_L2_HDLC:
-                                                       isdn_tty_at_cout("/HDLC", info);
-                                                       break;
-                                               case ISDN_PROTO_L2_V11096:
-                                                       isdn_tty_at_cout("/V110/9600", info);
-                                                       break;
-                                               case ISDN_PROTO_L2_V11019:
-                                                       isdn_tty_at_cout("/V110/19200", info);
-                                                       break;
-                                               case ISDN_PROTO_L2_V11038:
-                                                       isdn_tty_at_cout("/V110/38400", info);
-                                                       break;
-                                       }
-                                       if (m->mdmreg[REG_T70] & BIT_T70) {
-                                               isdn_tty_at_cout("/T.70", info);
-                                               if (m->mdmreg[REG_T70] & BIT_T70_EXT)
-                                                       isdn_tty_at_cout("+", info);
-                                       }
+                               case ISDN_PROTO_L2_V11096:
+                                       isdn_tty_at_cout("/V110/9600", info);
+                                       break;
+                               case ISDN_PROTO_L2_V11019:
+                                       isdn_tty_at_cout("/V110/19200", info);
+                                       break;
+                               case ISDN_PROTO_L2_V11038:
+                                       isdn_tty_at_cout("/V110/38400", info);
                                        break;
+                               }
+                               if (m->mdmreg[REG_T70] & BIT_T70) {
+                                       isdn_tty_at_cout("/T.70", info);
+                                       if (m->mdmreg[REG_T70] & BIT_T70_EXT)
+                                               isdn_tty_at_cout("+", info);
+                               }
+                               break;
                        }
                        isdn_tty_at_cout("\r\n", info);
                }
@@ -2648,7 +2648,7 @@ isdn_tty_modem_result(int code, modem_info * info)
  * Display a modem-register-value.
  */
 static void
-isdn_tty_show_profile(int ridx, modem_info * info)
+isdn_tty_show_profile(int ridx, modem_info *info)
 {
        char v[6];
 
@@ -2667,7 +2667,7 @@ isdn_tty_get_msnstr(char *n, char **p)
        while (((*p[0] >= '0' && *p[0] <= '9') ||
                /* Why a comma ??? */
                (*p[0] == ',') || (*p[0] == ':')) &&
-               (limit--))
+              (limit--))
                *n++ = *p[0]++;
        *n = '\0';
 }
@@ -2676,20 +2676,20 @@ isdn_tty_get_msnstr(char *n, char **p)
  * Get phone-number from modem-commandbuffer
  */
 static void
-isdn_tty_getdial(char *p, char *q,int cnt)
+isdn_tty_getdial(char *p, char *q, int cnt)
 {
        int first = 1;
        int limit = ISDN_MSNLEN - 1;    /* MUST match the size of interface var to avoid
-                                       buffer overflow */
+                                          buffer overflow */
 
-       while (strchr(" 0123456789,#.*WPTSR-", *p) && *p && --cnt>0) {
+       while (strchr(" 0123456789,#.*WPTSR-", *p) && *p && --cnt > 0) {
                if ((*p >= '0' && *p <= '9') || ((*p == 'S') && first) ||
                    ((*p == 'R') && first) ||
                    (*p == '*') || (*p == '#')) {
                        *q++ = *p;
                        limit--;
                }
-               if(!limit)
+               if (!limit)
                        break;
                p++;
                first = 0;
@@ -2701,7 +2701,7 @@ isdn_tty_getdial(char *p, char *q,int cnt)
 #define PARSE_ERROR1 { isdn_tty_modem_result(RESULT_ERROR, info); return 1; }
 
 static void
-isdn_tty_report(modem_info * info)
+isdn_tty_report(modem_info *info)
 {
        atemu *m = &info->emu;
        char s[80];
@@ -2713,39 +2713,39 @@ isdn_tty_report(modem_info * info)
        isdn_tty_at_cout(s, info);
        isdn_tty_at_cout("    Layer-2 Protocol: ", info);
        switch (info->last_l2) {
-               case ISDN_PROTO_L2_X75I:
-                       isdn_tty_at_cout("X.75i", info);
-                       break;
-               case ISDN_PROTO_L2_X75UI:
-                       isdn_tty_at_cout("X.75ui", info);
-                       break;
-               case ISDN_PROTO_L2_X75BUI:
-                       isdn_tty_at_cout("X.75bui", info);
-                       break;
-               case ISDN_PROTO_L2_HDLC:
-                       isdn_tty_at_cout("HDLC", info);
-                       break;
-               case ISDN_PROTO_L2_V11096:
-                       isdn_tty_at_cout("V.110 9600 Baud", info);
-                       break;
-               case ISDN_PROTO_L2_V11019:
-                       isdn_tty_at_cout("V.110 19200 Baud", info);
-                       break;
-               case ISDN_PROTO_L2_V11038:
-                       isdn_tty_at_cout("V.110 38400 Baud", info);
-                       break;
-               case ISDN_PROTO_L2_TRANS:
-                       isdn_tty_at_cout("transparent", info);
-                       break;
-               case ISDN_PROTO_L2_MODEM:
-                       isdn_tty_at_cout("modem", info);
-                       break;
-               case ISDN_PROTO_L2_FAX:
-                       isdn_tty_at_cout("fax", info);
-                       break;
-               default:
-                       isdn_tty_at_cout("unknown", info);
-                       break;
+       case ISDN_PROTO_L2_X75I:
+               isdn_tty_at_cout("X.75i", info);
+               break;
+       case ISDN_PROTO_L2_X75UI:
+               isdn_tty_at_cout("X.75ui", info);
+               break;
+       case ISDN_PROTO_L2_X75BUI:
+               isdn_tty_at_cout("X.75bui", info);
+               break;
+       case ISDN_PROTO_L2_HDLC:
+               isdn_tty_at_cout("HDLC", info);
+               break;
+       case ISDN_PROTO_L2_V11096:
+               isdn_tty_at_cout("V.110 9600 Baud", info);
+               break;
+       case ISDN_PROTO_L2_V11019:
+               isdn_tty_at_cout("V.110 19200 Baud", info);
+               break;
+       case ISDN_PROTO_L2_V11038:
+               isdn_tty_at_cout("V.110 38400 Baud", info);
+               break;
+       case ISDN_PROTO_L2_TRANS:
+               isdn_tty_at_cout("transparent", info);
+               break;
+       case ISDN_PROTO_L2_MODEM:
+               isdn_tty_at_cout("modem", info);
+               break;
+       case ISDN_PROTO_L2_FAX:
+               isdn_tty_at_cout("fax", info);
+               break;
+       default:
+               isdn_tty_at_cout("unknown", info);
+               break;
        }
        if (m->mdmreg[REG_T70] & BIT_T70) {
                isdn_tty_at_cout("/T.70", info);
@@ -2755,19 +2755,19 @@ isdn_tty_report(modem_info * info)
        isdn_tty_at_cout("\r\n", info);
        isdn_tty_at_cout("    Service:          ", info);
        switch (info->last_si) {
-               case 1:
-                       isdn_tty_at_cout("audio\r\n", info);
-                       break;
-               case 5:
-                       isdn_tty_at_cout("btx\r\n", info);
-                       break;
-               case 7:
-                       isdn_tty_at_cout("data\r\n", info);
-                       break;
-               default:
-                       sprintf(s, "%d\r\n", info->last_si);
-                       isdn_tty_at_cout(s, info);
-                       break;
+       case 1:
+               isdn_tty_at_cout("audio\r\n", info);
+               break;
+       case 5:
+               isdn_tty_at_cout("btx\r\n", info);
+               break;
+       case 7:
+               isdn_tty_at_cout("data\r\n", info);
+               break;
+       default:
+               sprintf(s, "%d\r\n", info->last_si);
+               isdn_tty_at_cout(s, info);
+               break;
        }
        sprintf(s, "    Hangup location:  %s\r\n", info->last_lhup ? "local" : "remote");
        isdn_tty_at_cout(s, info);
@@ -2779,7 +2779,7 @@ isdn_tty_report(modem_info * info)
  * Parse AT&.. commands.
  */
 static int
-isdn_tty_cmd_ATand(char **p, modem_info * info)
+isdn_tty_cmd_ATand(char **p, modem_info *info)
 {
        atemu *m = &info->emu;
        int i;
@@ -2788,224 +2788,224 @@ isdn_tty_cmd_ATand(char **p, modem_info * info)
 #define MAXRB (sizeof(rb) - 1)
 
        switch (*p[0]) {
-               case 'B':
-                       /* &B - Set Buffersize */
-                       p[0]++;
-                       i = isdn_getnum(p);
-                       if ((i < 0) || (i > ISDN_SERIAL_XMIT_MAX))
-                               PARSE_ERROR1;
+       case 'B':
+               /* &B - Set Buffersize */
+               p[0]++;
+               i = isdn_getnum(p);
+               if ((i < 0) || (i > ISDN_SERIAL_XMIT_MAX))
+                       PARSE_ERROR1;
 #ifdef CONFIG_ISDN_AUDIO
-                       if ((m->mdmreg[REG_SI1] & 1) && (i > VBUF))
-                               PARSE_ERROR1;
+               if ((m->mdmreg[REG_SI1] & 1) && (i > VBUF))
+                       PARSE_ERROR1;
 #endif
-                       m->mdmreg[REG_PSIZE] = i / 16;
-                       info->xmit_size = m->mdmreg[REG_PSIZE] * 16;
-                       switch (m->mdmreg[REG_L2PROT]) {
-                               case ISDN_PROTO_L2_V11096:
-                               case ISDN_PROTO_L2_V11019:
-                               case ISDN_PROTO_L2_V11038:
-                                       info->xmit_size /= 10;          
-                       }
-                       break;
-               case 'C':
-                       /* &C - DCD Status */
-                       p[0]++;
-                       switch (isdn_getnum(p)) {
-                               case 0:
-                                       m->mdmreg[REG_DCD] &= ~BIT_DCD;
-                                       break;
-                               case 1:
-                                       m->mdmreg[REG_DCD] |= BIT_DCD;
-                                       break;
-                               default:
-                                       PARSE_ERROR1
-                       }
+               m->mdmreg[REG_PSIZE] = i / 16;
+               info->xmit_size = m->mdmreg[REG_PSIZE] * 16;
+               switch (m->mdmreg[REG_L2PROT]) {
+               case ISDN_PROTO_L2_V11096:
+               case ISDN_PROTO_L2_V11019:
+               case ISDN_PROTO_L2_V11038:
+                       info->xmit_size /= 10;
+               }
+               break;
+       case 'C':
+               /* &C - DCD Status */
+               p[0]++;
+               switch (isdn_getnum(p)) {
+               case 0:
+                       m->mdmreg[REG_DCD] &= ~BIT_DCD;
                        break;
-               case 'D':
-                       /* &D - Set DTR-Low-behavior */
-                       p[0]++;
-                       switch (isdn_getnum(p)) {
-                               case 0:
-                                       m->mdmreg[REG_DTRHUP] &= ~BIT_DTRHUP;
-                                       m->mdmreg[REG_DTRR] &= ~BIT_DTRR;
-                                       break;
-                               case 2:
-                                       m->mdmreg[REG_DTRHUP] |= BIT_DTRHUP;
-                                       m->mdmreg[REG_DTRR] &= ~BIT_DTRR;
-                                       break;
-                               case 3:
-                                       m->mdmreg[REG_DTRHUP] |= BIT_DTRHUP;
-                                       m->mdmreg[REG_DTRR] |= BIT_DTRR;
-                                       break;
-                               default:
-                                       PARSE_ERROR1
-                       }
+               case 1:
+                       m->mdmreg[REG_DCD] |= BIT_DCD;
                        break;
-               case 'E':
-                       /* &E -Set EAZ/MSN */
-                       p[0]++;
-                       isdn_tty_get_msnstr(m->msn, p);
+               default:
+                       PARSE_ERROR1
+                               }
+               break;
+       case 'D':
+               /* &D - Set DTR-Low-behavior */
+               p[0]++;
+               switch (isdn_getnum(p)) {
+               case 0:
+                       m->mdmreg[REG_DTRHUP] &= ~BIT_DTRHUP;
+                       m->mdmreg[REG_DTRR] &= ~BIT_DTRR;
                        break;
-               case 'F':
-                       /* &F -Set Factory-Defaults */
-                       p[0]++;
-                       if (info->msr & UART_MSR_DCD)
-                               PARSE_ERROR1;
-                       isdn_tty_reset_profile(m);
-                       isdn_tty_modem_reset_regs(info, 1);
+               case 2:
+                       m->mdmreg[REG_DTRHUP] |= BIT_DTRHUP;
+                       m->mdmreg[REG_DTRR] &= ~BIT_DTRR;
+                       break;
+               case 3:
+                       m->mdmreg[REG_DTRHUP] |= BIT_DTRHUP;
+                       m->mdmreg[REG_DTRR] |= BIT_DTRR;
                        break;
+               default:
+                       PARSE_ERROR1
+                               }
+               break;
+       case 'E':
+               /* &E -Set EAZ/MSN */
+               p[0]++;
+               isdn_tty_get_msnstr(m->msn, p);
+               break;
+       case 'F':
+               /* &F -Set Factory-Defaults */
+               p[0]++;
+               if (info->msr & UART_MSR_DCD)
+                       PARSE_ERROR1;
+               isdn_tty_reset_profile(m);
+               isdn_tty_modem_reset_regs(info, 1);
+               break;
 #ifdef DUMMY_HAYES_AT
-               case 'K':
-                       /* only for be compilant with common scripts */
-                       /* &K Flowcontrol - no function */
-                       p[0]++;
-                       isdn_getnum(p);
+       case 'K':
+               /* only for be compilant with common scripts */
+               /* &K Flowcontrol - no function */
+               p[0]++;
+               isdn_getnum(p);
+               break;
+#endif
+       case 'L':
+               /* &L -Set Numbers to listen on */
+               p[0]++;
+               i = 0;
+               while (*p[0] && (strchr("0123456789,-*[]?;", *p[0])) &&
+                      (i < ISDN_LMSNLEN - 1))
+                       m->lmsn[i++] = *p[0]++;
+               m->lmsn[i] = '\0';
+               break;
+       case 'R':
+               /* &R - Set V.110 bitrate adaption */
+               p[0]++;
+               i = isdn_getnum(p);
+               switch (i) {
+               case 0:
+                       /* Switch off V.110, back to X.75 */
+                       m->mdmreg[REG_L2PROT] = ISDN_PROTO_L2_X75I;
+                       m->mdmreg[REG_SI2] = 0;
+                       info->xmit_size = m->mdmreg[REG_PSIZE] * 16;
                        break;
-#endif
-               case 'L':
-                       /* &L -Set Numbers to listen on */
-                       p[0]++;
-                       i = 0;
-                       while (*p[0] && (strchr("0123456789,-*[]?;", *p[0])) &&
-                              (i < ISDN_LMSNLEN - 1))
-                               m->lmsn[i++] = *p[0]++;
-                       m->lmsn[i] = '\0';
-                       break;
-               case 'R':
-                       /* &R - Set V.110 bitrate adaption */
-                       p[0]++;
-                       i = isdn_getnum(p);
-                       switch (i) {
-                               case 0:
-                                       /* Switch off V.110, back to X.75 */
-                                       m->mdmreg[REG_L2PROT] = ISDN_PROTO_L2_X75I;
-                                       m->mdmreg[REG_SI2] = 0;
-                                       info->xmit_size = m->mdmreg[REG_PSIZE] * 16;
-                                       break;
-                               case 9600:
-                                       m->mdmreg[REG_L2PROT] = ISDN_PROTO_L2_V11096;
-                                       m->mdmreg[REG_SI2] = 197;
-                                       info->xmit_size = m->mdmreg[REG_PSIZE] * 16 / 10;
-                                       break;
-                               case 19200:
-                                       m->mdmreg[REG_L2PROT] = ISDN_PROTO_L2_V11019;
-                                       m->mdmreg[REG_SI2] = 199;
-                                       info->xmit_size = m->mdmreg[REG_PSIZE] * 16 / 10;
-                                       break;
-                               case 38400:
-                                       m->mdmreg[REG_L2PROT] = ISDN_PROTO_L2_V11038;
-                                       m->mdmreg[REG_SI2] = 198; /* no existing standard for this */
-                                       info->xmit_size = m->mdmreg[REG_PSIZE] * 16 / 10;
-                                       break;
-                               default:
-                                       PARSE_ERROR1;
-                       }
-                       /* Switch off T.70 */
-                       m->mdmreg[REG_T70] &= ~(BIT_T70 | BIT_T70_EXT);
-                       /* Set Service 7 */
-                       m->mdmreg[REG_SI1] |= 4;
+               case 9600:
+                       m->mdmreg[REG_L2PROT] = ISDN_PROTO_L2_V11096;
+                       m->mdmreg[REG_SI2] = 197;
+                       info->xmit_size = m->mdmreg[REG_PSIZE] * 16 / 10;
                        break;
-               case 'S':
-                       /* &S - Set Windowsize */
-                       p[0]++;
-                       i = isdn_getnum(p);
-                       if ((i > 0) && (i < 9))
-                               m->mdmreg[REG_WSIZE] = i;
-                       else
-                               PARSE_ERROR1;
+               case 19200:
+                       m->mdmreg[REG_L2PROT] = ISDN_PROTO_L2_V11019;
+                       m->mdmreg[REG_SI2] = 199;
+                       info->xmit_size = m->mdmreg[REG_PSIZE] * 16 / 10;
                        break;
-               case 'V':
-                       /* &V - Show registers */
-                       p[0]++;
-                       isdn_tty_at_cout("\r\n", info);
-                       for (i = 0; i < ISDN_MODEM_NUMREG; i++) {
-                               sprintf(rb, "S%02d=%03d%s", i,
-                                       m->mdmreg[i], ((i + 1) % 10) ? " " : "\r\n");
-                               isdn_tty_at_cout(rb, info);
-                       }
-                       sprintf(rb, "\r\nEAZ/MSN: %.50s\r\n",
-                               strlen(m->msn) ? m->msn : "None");
-                       isdn_tty_at_cout(rb, info);
-                       if (strlen(m->lmsn)) {
-                               isdn_tty_at_cout("\r\nListen: ", info);
-                               isdn_tty_at_cout(m->lmsn, info);
-                               isdn_tty_at_cout("\r\n", info);
-                       }
+               case 38400:
+                       m->mdmreg[REG_L2PROT] = ISDN_PROTO_L2_V11038;
+                       m->mdmreg[REG_SI2] = 198; /* no existing standard for this */
+                       info->xmit_size = m->mdmreg[REG_PSIZE] * 16 / 10;
                        break;
-               case 'W':
-                       /* &W - Write Profile */
+               default:
+                       PARSE_ERROR1;
+               }
+               /* Switch off T.70 */
+               m->mdmreg[REG_T70] &= ~(BIT_T70 | BIT_T70_EXT);
+               /* Set Service 7 */
+               m->mdmreg[REG_SI1] |= 4;
+               break;
+       case 'S':
+               /* &S - Set Windowsize */
+               p[0]++;
+               i = isdn_getnum(p);
+               if ((i > 0) && (i < 9))
+                       m->mdmreg[REG_WSIZE] = i;
+               else
+                       PARSE_ERROR1;
+               break;
+       case 'V':
+               /* &V - Show registers */
+               p[0]++;
+               isdn_tty_at_cout("\r\n", info);
+               for (i = 0; i < ISDN_MODEM_NUMREG; i++) {
+                       sprintf(rb, "S%02d=%03d%s", i,
+                               m->mdmreg[i], ((i + 1) % 10) ? " " : "\r\n");
+                       isdn_tty_at_cout(rb, info);
+               }
+               sprintf(rb, "\r\nEAZ/MSN: %.50s\r\n",
+                       strlen(m->msn) ? m->msn : "None");
+               isdn_tty_at_cout(rb, info);
+               if (strlen(m->lmsn)) {
+                       isdn_tty_at_cout("\r\nListen: ", info);
+                       isdn_tty_at_cout(m->lmsn, info);
+                       isdn_tty_at_cout("\r\n", info);
+               }
+               break;
+       case 'W':
+               /* &W - Write Profile */
+               p[0]++;
+               switch (*p[0]) {
+               case '0':
                        p[0]++;
-                       switch (*p[0]) {
-                               case '0':
-                                       p[0]++;
-                                       modem_write_profile(m);
-                                       break;
-                               default:
-                                       PARSE_ERROR1;
-                       }
+                       modem_write_profile(m);
                        break;
-               case 'X':
-                       /* &X - Switch to BTX-Mode and T.70 */
-                       p[0]++;
-                       switch (isdn_getnum(p)) {
-                               case 0:
-                                       m->mdmreg[REG_T70] &= ~(BIT_T70 | BIT_T70_EXT);
-                                       info->xmit_size = m->mdmreg[REG_PSIZE] * 16;
-                                       break;
-                               case 1:
-                                       m->mdmreg[REG_T70] |= BIT_T70;
-                                       m->mdmreg[REG_T70] &= ~BIT_T70_EXT;
-                                       m->mdmreg[REG_L2PROT] = ISDN_PROTO_L2_X75I;
-                                       info->xmit_size = 112;
-                                       m->mdmreg[REG_SI1] = 4;
-                                       m->mdmreg[REG_SI2] = 0;
-                                       break;
-                               case 2:
-                                       m->mdmreg[REG_T70] |= (BIT_T70 | BIT_T70_EXT);
-                                       m->mdmreg[REG_L2PROT] = ISDN_PROTO_L2_X75I;
-                                       info->xmit_size = 112;
-                                       m->mdmreg[REG_SI1] = 4;
-                                       m->mdmreg[REG_SI2] = 0;
-                                       break;
-                               default:
-                                       PARSE_ERROR1;
-                       }
+               default:
+                       PARSE_ERROR1;
+               }
+               break;
+       case 'X':
+               /* &X - Switch to BTX-Mode and T.70 */
+               p[0]++;
+               switch (isdn_getnum(p)) {
+               case 0:
+                       m->mdmreg[REG_T70] &= ~(BIT_T70 | BIT_T70_EXT);
+                       info->xmit_size = m->mdmreg[REG_PSIZE] * 16;
+                       break;
+               case 1:
+                       m->mdmreg[REG_T70] |= BIT_T70;
+                       m->mdmreg[REG_T70] &= ~BIT_T70_EXT;
+                       m->mdmreg[REG_L2PROT] = ISDN_PROTO_L2_X75I;
+                       info->xmit_size = 112;
+                       m->mdmreg[REG_SI1] = 4;
+                       m->mdmreg[REG_SI2] = 0;
+                       break;
+               case 2:
+                       m->mdmreg[REG_T70] |= (BIT_T70 | BIT_T70_EXT);
+                       m->mdmreg[REG_L2PROT] = ISDN_PROTO_L2_X75I;
+                       info->xmit_size = 112;
+                       m->mdmreg[REG_SI1] = 4;
+                       m->mdmreg[REG_SI2] = 0;
                        break;
                default:
                        PARSE_ERROR1;
+               }
+               break;
+       default:
+               PARSE_ERROR1;
        }
        return 0;
 }
 
 static int
-isdn_tty_check_ats(int mreg, int mval, modem_info * info, atemu * m)
+isdn_tty_check_ats(int mreg, int mval, modem_info *info, atemu *m)
 {
        /* Some plausibility checks */
        switch (mreg) {
-               case REG_L2PROT:
-                       if (mval > ISDN_PROTO_L2_MAX)
-                               return 1;
-                       break;
-               case REG_PSIZE:
-                       if ((mval * 16) > ISDN_SERIAL_XMIT_MAX)
-                               return 1;
+       case REG_L2PROT:
+               if (mval > ISDN_PROTO_L2_MAX)
+                       return 1;
+               break;
+       case REG_PSIZE:
+               if ((mval * 16) > ISDN_SERIAL_XMIT_MAX)
+                       return 1;
 #ifdef CONFIG_ISDN_AUDIO
-                       if ((m->mdmreg[REG_SI1] & 1) && (mval > VBUFX))
-                               return 1;
-#endif
-                       info->xmit_size = mval * 16;
-                       switch (m->mdmreg[REG_L2PROT]) {
-                               case ISDN_PROTO_L2_V11096:
-                               case ISDN_PROTO_L2_V11019:
-                               case ISDN_PROTO_L2_V11038:
-                                       info->xmit_size /= 10;          
-                       }
-                       break;
-               case REG_SI1I:
-               case REG_PLAN:
-               case REG_SCREEN:
-                       /* readonly registers */
+               if ((m->mdmreg[REG_SI1] & 1) && (mval > VBUFX))
                        return 1;
+#endif
+               info->xmit_size = mval * 16;
+               switch (m->mdmreg[REG_L2PROT]) {
+               case ISDN_PROTO_L2_V11096:
+               case ISDN_PROTO_L2_V11019:
+               case ISDN_PROTO_L2_V11038:
+                       info->xmit_size /= 10;
+               }
+               break;
+       case REG_SI1I:
+       case REG_PLAN:
+       case REG_SCREEN:
+               /* readonly registers */
+               return 1;
        }
        return 0;
 }
@@ -3014,7 +3014,7 @@ isdn_tty_check_ats(int mreg, int mval, modem_info * info, atemu * m)
  * Perform ATS command
  */
 static int
-isdn_tty_cmd_ATS(char **p, modem_info * info)
+isdn_tty_cmd_ATS(char **p, modem_info *info)
 {
        atemu *m = &info->emu;
        int bitpos;
@@ -3026,52 +3026,52 @@ isdn_tty_cmd_ATS(char **p, modem_info * info)
        if (mreg < 0 || mreg >= ISDN_MODEM_NUMREG)
                PARSE_ERROR1;
        switch (*p[0]) {
+       case '=':
+               p[0]++;
+               mval = isdn_getnum(p);
+               if (mval < 0 || mval > 255)
+                       PARSE_ERROR1;
+               if (isdn_tty_check_ats(mreg, mval, info, m))
+                       PARSE_ERROR1;
+               m->mdmreg[mreg] = mval;
+               break;
+       case '.':
+               /* Set/Clear a single bit */
+               p[0]++;
+               bitpos = isdn_getnum(p);
+               if ((bitpos < 0) || (bitpos > 7))
+                       PARSE_ERROR1;
+               switch (*p[0]) {
                case '=':
                        p[0]++;
-                       mval = isdn_getnum(p);
-                       if (mval < 0 || mval > 255)
+                       bval = isdn_getnum(p);
+                       if (bval < 0 || bval > 1)
                                PARSE_ERROR1;
+                       if (bval)
+                               mval = m->mdmreg[mreg] | (1 << bitpos);
+                       else
+                               mval = m->mdmreg[mreg] & ~(1 << bitpos);
                        if (isdn_tty_check_ats(mreg, mval, info, m))
                                PARSE_ERROR1;
                        m->mdmreg[mreg] = mval;
                        break;
-               case '.':
-                       /* Set/Clear a single bit */
-                       p[0]++;
-                       bitpos = isdn_getnum(p);
-                       if ((bitpos < 0) || (bitpos > 7))
-                               PARSE_ERROR1;
-                       switch (*p[0]) {
-                               case '=':
-                                       p[0]++;
-                                       bval = isdn_getnum(p);
-                                       if (bval < 0 || bval > 1)
-                                               PARSE_ERROR1;
-                                       if (bval)
-                                               mval = m->mdmreg[mreg] | (1 << bitpos);
-                                       else
-                                               mval = m->mdmreg[mreg] & ~(1 << bitpos);
-                                       if (isdn_tty_check_ats(mreg, mval, info, m))
-                                               PARSE_ERROR1;
-                                       m->mdmreg[mreg] = mval;
-                                       break;
-                               case '?':
-                                       p[0]++;
-                                       isdn_tty_at_cout("\r\n", info);
-                                       isdn_tty_at_cout((m->mdmreg[mreg] & (1 << bitpos)) ? "1" : "0",
-                                                        info);
-                                       break;
-                               default:
-                                       PARSE_ERROR1;
-                       }
-                       break;
                case '?':
                        p[0]++;
-                       isdn_tty_show_profile(mreg, info);
+                       isdn_tty_at_cout("\r\n", info);
+                       isdn_tty_at_cout((m->mdmreg[mreg] & (1 << bitpos)) ? "1" : "0",
+                                        info);
                        break;
                default:
                        PARSE_ERROR1;
-                       break;
+               }
+               break;
+       case '?':
+               p[0]++;
+               isdn_tty_show_profile(mreg, info);
+               break;
+       default:
+               PARSE_ERROR1;
+               break;
        }
        return 0;
 }
@@ -3080,7 +3080,7 @@ isdn_tty_cmd_ATS(char **p, modem_info * info)
  * Perform ATA command
  */
 static void
-isdn_tty_cmd_ATA(modem_info * info)
+isdn_tty_cmd_ATA(modem_info *info)
 {
        atemu *m = &info->emu;
        isdn_ctrl cmd;
@@ -3134,7 +3134,7 @@ isdn_tty_cmd_ATA(modem_info * info)
  * Parse AT+F.. commands
  */
 static int
-isdn_tty_cmd_PLUSF(char **p, modem_info * info)
+isdn_tty_cmd_PLUSF(char **p, modem_info *info)
 {
        atemu *m = &info->emu;
        char rs[20];
@@ -3142,81 +3142,81 @@ isdn_tty_cmd_PLUSF(char **p, modem_info * info)
        if (!strncmp(p[0], "CLASS", 5)) {
                p[0] += 5;
                switch (*p[0]) {
-                       case '?':
-                               p[0]++;
-                               sprintf(rs, "\r\n%d",
-                                       (m->mdmreg[REG_SI1] & 1) ? 8 : 0);
+               case '?':
+                       p[0]++;
+                       sprintf(rs, "\r\n%d",
+                               (m->mdmreg[REG_SI1] & 1) ? 8 : 0);
 #ifdef CONFIG_ISDN_TTY_FAX
-                               if (TTY_IS_FCLASS2(info))
-                                               sprintf(rs, "\r\n2");
-                               else if (TTY_IS_FCLASS1(info))
-                                               sprintf(rs, "\r\n1");
+                       if (TTY_IS_FCLASS2(info))
+                               sprintf(rs, "\r\n2");
+                       else if (TTY_IS_FCLASS1(info))
+                               sprintf(rs, "\r\n1");
 #endif
-                               isdn_tty_at_cout(rs, info);
-                               break;
-                       case '=':
+                       isdn_tty_at_cout(rs, info);
+                       break;
+               case '=':
+                       p[0]++;
+                       switch (*p[0]) {
+                       case '0':
                                p[0]++;
-                               switch (*p[0]) {
-                                       case '0':
-                                               p[0]++;
-                                               m->mdmreg[REG_L2PROT] = ISDN_PROTO_L2_X75I;
-                                               m->mdmreg[REG_L3PROT] = ISDN_PROTO_L3_TRANS;
-                                               m->mdmreg[REG_SI1] = 4;
-                                               info->xmit_size =
-                                                   m->mdmreg[REG_PSIZE] * 16;
-                                               break;
+                               m->mdmreg[REG_L2PROT] = ISDN_PROTO_L2_X75I;
+                               m->mdmreg[REG_L3PROT] = ISDN_PROTO_L3_TRANS;
+                               m->mdmreg[REG_SI1] = 4;
+                               info->xmit_size =
+                                       m->mdmreg[REG_PSIZE] * 16;
+                               break;
 #ifdef CONFIG_ISDN_TTY_FAX
-                                       case '1':
-                                               p[0]++;
-                                               if (!(dev->global_features &
-                                                       ISDN_FEATURE_L3_FCLASS1))
-                                                       PARSE_ERROR1;
-                                               m->mdmreg[REG_SI1] = 1;
-                                               m->mdmreg[REG_L2PROT] = ISDN_PROTO_L2_FAX;
-                                               m->mdmreg[REG_L3PROT] = ISDN_PROTO_L3_FCLASS1;
-                                               info->xmit_size =
-                                                   m->mdmreg[REG_PSIZE] * 16;
-                                               break;
-                                       case '2':
-                                               p[0]++;
-                                               if (!(dev->global_features &
-                                                       ISDN_FEATURE_L3_FCLASS2))
-                                                       PARSE_ERROR1;
-                                               m->mdmreg[REG_SI1] = 1;
-                                               m->mdmreg[REG_L2PROT] = ISDN_PROTO_L2_FAX;
-                                               m->mdmreg[REG_L3PROT] = ISDN_PROTO_L3_FCLASS2;
-                                               info->xmit_size =
-                                                   m->mdmreg[REG_PSIZE] * 16;
-                                               break;
+                       case '1':
+                               p[0]++;
+                               if (!(dev->global_features &
+                                     ISDN_FEATURE_L3_FCLASS1))
+                                       PARSE_ERROR1;
+                               m->mdmreg[REG_SI1] = 1;
+                               m->mdmreg[REG_L2PROT] = ISDN_PROTO_L2_FAX;
+                               m->mdmreg[REG_L3PROT] = ISDN_PROTO_L3_FCLASS1;
+                               info->xmit_size =
+                                       m->mdmreg[REG_PSIZE] * 16;
+                               break;
+                       case '2':
+                               p[0]++;
+                               if (!(dev->global_features &
+                                     ISDN_FEATURE_L3_FCLASS2))
+                                       PARSE_ERROR1;
+                               m->mdmreg[REG_SI1] = 1;
+                               m->mdmreg[REG_L2PROT] = ISDN_PROTO_L2_FAX;
+                               m->mdmreg[REG_L3PROT] = ISDN_PROTO_L3_FCLASS2;
+                               info->xmit_size =
+                                       m->mdmreg[REG_PSIZE] * 16;
+                               break;
 #endif
-                                       case '8':
-                                               p[0]++;
-                                               /* L2 will change on dialout with si=1 */
-                                               m->mdmreg[REG_L2PROT] = ISDN_PROTO_L2_X75I;
-                                               m->mdmreg[REG_L3PROT] = ISDN_PROTO_L3_TRANS;
-                                               m->mdmreg[REG_SI1] = 5;
-                                               info->xmit_size = VBUF;
-                                               break;
-                                       case '?':
-                                               p[0]++;
-                                               strcpy(rs, "\r\n0,");
+                       case '8':
+                               p[0]++;
+                               /* L2 will change on dialout with si=1 */
+                               m->mdmreg[REG_L2PROT] = ISDN_PROTO_L2_X75I;
+                               m->mdmreg[REG_L3PROT] = ISDN_PROTO_L3_TRANS;
+                               m->mdmreg[REG_SI1] = 5;
+                               info->xmit_size = VBUF;
+                               break;
+                       case '?':
+                               p[0]++;
+                               strcpy(rs, "\r\n0,");
 #ifdef CONFIG_ISDN_TTY_FAX
-                                               if (dev->global_features &
-                                                       ISDN_FEATURE_L3_FCLASS1)
-                                                       strcat(rs, "1,");
-                                               if (dev->global_features &
-                                                       ISDN_FEATURE_L3_FCLASS2)
-                                                       strcat(rs, "2,");
-#endif
-                                               strcat(rs, "8");
-                                               isdn_tty_at_cout(rs, info);
-                                               break;
-                                       default:
-                                               PARSE_ERROR1;
-                               }
+                               if (dev->global_features &
+                                   ISDN_FEATURE_L3_FCLASS1)
+                                       strcat(rs, "1,");
+                               if (dev->global_features &
+                                   ISDN_FEATURE_L3_FCLASS2)
+                                       strcat(rs, "2,");
+#endif
+                               strcat(rs, "8");
+                               isdn_tty_at_cout(rs, info);
                                break;
                        default:
                                PARSE_ERROR1;
+                       }
+                       break;
+               default:
+                       PARSE_ERROR1;
                }
                return 0;
        }
@@ -3231,12 +3231,12 @@ isdn_tty_cmd_PLUSF(char **p, modem_info * info)
  * Parse AT+V.. commands
  */
 static int
-isdn_tty_cmd_PLUSV(char **p, modem_info * info)
+isdn_tty_cmd_PLUSV(char **p, modem_info *info)
 {
        atemu *m = &info->emu;
        isdn_ctrl cmd;
        static char *vcmd[] =
-       {"NH", "IP", "LS", "RX", "SD", "SM", "TX", "DD", NULL};
+               {"NH", "IP", "LS", "RX", "SD", "SM", "TX", "DD", NULL};
        int i;
        int par1;
        int par2;
@@ -3251,256 +3251,256 @@ isdn_tty_cmd_PLUSV(char **p, modem_info * info)
                i++;
        }
        switch (i) {
-               case 0:
-                       /* AT+VNH - Auto hangup feature */
+       case 0:
+               /* AT+VNH - Auto hangup feature */
+               switch (*p[0]) {
+               case '?':
+                       p[0]++;
+                       isdn_tty_at_cout("\r\n1", info);
+                       break;
+               case '=':
+                       p[0]++;
                        switch (*p[0]) {
-                               case '?':
-                                       p[0]++;
-                                       isdn_tty_at_cout("\r\n1", info);
-                                       break;
-                               case '=':
-                                       p[0]++;
-                                       switch (*p[0]) {
-                                               case '1':
-                                                       p[0]++;
-                                                       break;
-                                               case '?':
-                                                       p[0]++;
-                                                       isdn_tty_at_cout("\r\n1", info);
-                                                       break;
-                                               default:
-                                                       PARSE_ERROR1;
-                                       }
-                                       break;
-                               default:
-                                       PARSE_ERROR1;
+                       case '1':
+                               p[0]++;
+                               break;
+                       case '?':
+                               p[0]++;
+                               isdn_tty_at_cout("\r\n1", info);
+                               break;
+                       default:
+                               PARSE_ERROR1;
                        }
                        break;
-               case 1:
-                       /* AT+VIP - Reset all voice parameters */
-                       isdn_tty_modem_reset_vpar(m);
+               default:
+                       PARSE_ERROR1;
+               }
+               break;
+       case 1:
+               /* AT+VIP - Reset all voice parameters */
+               isdn_tty_modem_reset_vpar(m);
+               break;
+       case 2:
+               /* AT+VLS - Select device, accept incoming call */
+               switch (*p[0]) {
+               case '?':
+                       p[0]++;
+                       sprintf(rs, "\r\n%d", m->vpar[0]);
+                       isdn_tty_at_cout(rs, info);
                        break;
-               case 2:
-                       /* AT+VLS - Select device, accept incoming call */
+               case '=':
+                       p[0]++;
                        switch (*p[0]) {
-                               case '?':
-                                       p[0]++;
-                                       sprintf(rs, "\r\n%d", m->vpar[0]);
-                                       isdn_tty_at_cout(rs, info);
-                                       break;
-                               case '=':
-                                       p[0]++;
-                                       switch (*p[0]) {
-                                               case '0':
-                                                       p[0]++;
-                                                       m->vpar[0] = 0;
-                                                       break;
-                                               case '2':
-                                                       p[0]++;
-                                                       m->vpar[0] = 2;
-                                                       break;
-                                               case '?':
-                                                       p[0]++;
-                                                       isdn_tty_at_cout("\r\n0,2", info);
-                                                       break;
-                                               default:
-                                                       PARSE_ERROR1;
-                                       }
-                                       break;
-                               default:
-                                       PARSE_ERROR1;
-                       }
-                       break;
-               case 3:
-                       /* AT+VRX - Start recording */
-                       if (!m->vpar[0])
-                               PARSE_ERROR1;
-                       if (info->online != 1) {
-                               isdn_tty_modem_result(RESULT_NO_ANSWER, info);
-                               return 1;
-                       }
-                       info->dtmf_state = isdn_audio_dtmf_init(info->dtmf_state);
-                       if (!info->dtmf_state) {
-                               printk(KERN_WARNING "isdn_tty: Couldn't malloc dtmf state\n");
+                       case '0':
+                               p[0]++;
+                               m->vpar[0] = 0;
+                               break;
+                       case '2':
+                               p[0]++;
+                               m->vpar[0] = 2;
+                               break;
+                       case '?':
+                               p[0]++;
+                               isdn_tty_at_cout("\r\n0,2", info);
+                               break;
+                       default:
                                PARSE_ERROR1;
                        }
-                       info->silence_state = isdn_audio_silence_init(info->silence_state);
-                       if (!info->silence_state) {
-                               printk(KERN_WARNING "isdn_tty: Couldn't malloc silence state\n");
+                       break;
+               default:
+                       PARSE_ERROR1;
+               }
+               break;
+       case 3:
+               /* AT+VRX - Start recording */
+               if (!m->vpar[0])
+                       PARSE_ERROR1;
+               if (info->online != 1) {
+                       isdn_tty_modem_result(RESULT_NO_ANSWER, info);
+                       return 1;
+               }
+               info->dtmf_state = isdn_audio_dtmf_init(info->dtmf_state);
+               if (!info->dtmf_state) {
+                       printk(KERN_WARNING "isdn_tty: Couldn't malloc dtmf state\n");
+                       PARSE_ERROR1;
+               }
+               info->silence_state = isdn_audio_silence_init(info->silence_state);
+               if (!info->silence_state) {
+                       printk(KERN_WARNING "isdn_tty: Couldn't malloc silence state\n");
+                       PARSE_ERROR1;
+               }
+               if (m->vpar[3] < 5) {
+                       info->adpcmr = isdn_audio_adpcm_init(info->adpcmr, m->vpar[3]);
+                       if (!info->adpcmr) {
+                               printk(KERN_WARNING "isdn_tty: Couldn't malloc adpcm state\n");
                                PARSE_ERROR1;
                        }
-                       if (m->vpar[3] < 5) {
-                               info->adpcmr = isdn_audio_adpcm_init(info->adpcmr, m->vpar[3]);
-                               if (!info->adpcmr) {
-                                       printk(KERN_WARNING "isdn_tty: Couldn't malloc adpcm state\n");
-                                       PARSE_ERROR1;
-                               }
-                       }
+               }
 #ifdef ISDN_DEBUG_AT
-                       printk(KERN_DEBUG "AT: +VRX\n");
+               printk(KERN_DEBUG "AT: +VRX\n");
 #endif
-                       info->vonline |= 1;
-                       isdn_tty_modem_result(RESULT_CONNECT, info);
-                       return 0;
+               info->vonline |= 1;
+               isdn_tty_modem_result(RESULT_CONNECT, info);
+               return 0;
+               break;
+       case 4:
+               /* AT+VSD - Silence detection */
+               switch (*p[0]) {
+               case '?':
+                       p[0]++;
+                       sprintf(rs, "\r\n<%d>,<%d>",
+                               m->vpar[1],
+                               m->vpar[2]);
+                       isdn_tty_at_cout(rs, info);
                        break;
-               case 4:
-                       /* AT+VSD - Silence detection */
-                       switch (*p[0]) {
-                               case '?':
-                                       p[0]++;
-                                       sprintf(rs, "\r\n<%d>,<%d>",
-                                               m->vpar[1],
-                                               m->vpar[2]);
-                                       isdn_tty_at_cout(rs, info);
-                                       break;
-                               case '=':
-                                       p[0]++;
-                                       if ((*p[0]>='0') && (*p[0]<='9')) {
-                                               par1 = isdn_getnum(p);
-                                               if ((par1 < 0) || (par1 > 31))
-                                                       PARSE_ERROR1;
-                                               if (*p[0] != ',')
-                                                       PARSE_ERROR1;
-                                               p[0]++;
-                                               par2 = isdn_getnum(p);
-                                               if ((par2 < 0) || (par2 > 255))
-                                                       PARSE_ERROR1;
-                                               m->vpar[1] = par1;
-                                               m->vpar[2] = par2;
-                                               break;
-                                       } else 
-                                       if (*p[0] == '?') {
-                                               p[0]++;
-                                               isdn_tty_at_cout("\r\n<0-31>,<0-255>",
-                                                          info);
-                                               break;
-                                       } else
+               case '=':
+                       p[0]++;
+                       if ((*p[0] >= '0') && (*p[0] <= '9')) {
+                               par1 = isdn_getnum(p);
+                               if ((par1 < 0) || (par1 > 31))
                                        PARSE_ERROR1;
-                                       break;
-                               default:
+                               if (*p[0] != ',')
                                        PARSE_ERROR1;
-                       }
-                       break;
-               case 5:
-                       /* AT+VSM - Select compression */
-                       switch (*p[0]) {
-                               case '?':
-                                       p[0]++;
-                                       sprintf(rs, "\r\n<%d>,<%d><8000>",
-                                               m->vpar[3],
-                                               m->vpar[1]);
-                                       isdn_tty_at_cout(rs, info);
-                                       break;
-                               case '=':
+                               p[0]++;
+                               par2 = isdn_getnum(p);
+                               if ((par2 < 0) || (par2 > 255))
+                                       PARSE_ERROR1;
+                               m->vpar[1] = par1;
+                               m->vpar[2] = par2;
+                               break;
+                       } else
+                               if (*p[0] == '?') {
                                        p[0]++;
-                                       switch (*p[0]) {
-                                               case '2':
-                                               case '3':
-                                               case '4':
-                                               case '5':
-                                               case '6':
-                                                       par1 = isdn_getnum(p);
-                                                       if ((par1 < 2) || (par1 > 6))
-                                                               PARSE_ERROR1;
-                                                       m->vpar[3] = par1;
-                                                       break;
-                                               case '?':
-                                                       p[0]++;
-                                                       isdn_tty_at_cout("\r\n2;ADPCM;2;0;(8000)\r\n",
-                                                                  info);
-                                                       isdn_tty_at_cout("3;ADPCM;3;0;(8000)\r\n",
-                                                                  info);
-                                                       isdn_tty_at_cout("4;ADPCM;4;0;(8000)\r\n",
-                                                                  info);
-                                                       isdn_tty_at_cout("5;ALAW;8;0;(8000)\r\n",
-                                                                  info);
-                                                       isdn_tty_at_cout("6;ULAW;8;0;(8000)\r\n",
-                                                                  info);
-                                                       break;
-                                               default:
-                                                       PARSE_ERROR1;
-                                       }
+                                       isdn_tty_at_cout("\r\n<0-31>,<0-255>",
+                                                        info);
                                        break;
-                               default:
+                               } else
                                        PARSE_ERROR1;
-                       }
                        break;
-               case 6:
-                       /* AT+VTX - Start sending */
-                       if (!m->vpar[0])
+               default:
+                       PARSE_ERROR1;
+               }
+               break;
+       case 5:
+               /* AT+VSM - Select compression */
+               switch (*p[0]) {
+               case '?':
+                       p[0]++;
+                       sprintf(rs, "\r\n<%d>,<%d><8000>",
+                               m->vpar[3],
+                               m->vpar[1]);
+                       isdn_tty_at_cout(rs, info);
+                       break;
+               case '=':
+                       p[0]++;
+                       switch (*p[0]) {
+                       case '2':
+                       case '3':
+                       case '4':
+                       case '5':
+                       case '6':
+                               par1 = isdn_getnum(p);
+                               if ((par1 < 2) || (par1 > 6))
+                                       PARSE_ERROR1;
+                               m->vpar[3] = par1;
+                               break;
+                       case '?':
+                               p[0]++;
+                               isdn_tty_at_cout("\r\n2;ADPCM;2;0;(8000)\r\n",
+                                                info);
+                               isdn_tty_at_cout("3;ADPCM;3;0;(8000)\r\n",
+                                                info);
+                               isdn_tty_at_cout("4;ADPCM;4;0;(8000)\r\n",
+                                                info);
+                               isdn_tty_at_cout("5;ALAW;8;0;(8000)\r\n",
+                                                info);
+                               isdn_tty_at_cout("6;ULAW;8;0;(8000)\r\n",
+                                                info);
+                               break;
+                       default:
                                PARSE_ERROR1;
-                       if (info->online != 1) {
-                               isdn_tty_modem_result(RESULT_NO_ANSWER, info);
-                               return 1;
                        }
-                       info->dtmf_state = isdn_audio_dtmf_init(info->dtmf_state);
-                       if (!info->dtmf_state) {
-                               printk(KERN_WARNING "isdn_tty: Couldn't malloc dtmf state\n");
+                       break;
+               default:
+                       PARSE_ERROR1;
+               }
+               break;
+       case 6:
+               /* AT+VTX - Start sending */
+               if (!m->vpar[0])
+                       PARSE_ERROR1;
+               if (info->online != 1) {
+                       isdn_tty_modem_result(RESULT_NO_ANSWER, info);
+                       return 1;
+               }
+               info->dtmf_state = isdn_audio_dtmf_init(info->dtmf_state);
+               if (!info->dtmf_state) {
+                       printk(KERN_WARNING "isdn_tty: Couldn't malloc dtmf state\n");
+                       PARSE_ERROR1;
+               }
+               if (m->vpar[3] < 5) {
+                       info->adpcms = isdn_audio_adpcm_init(info->adpcms, m->vpar[3]);
+                       if (!info->adpcms) {
+                               printk(KERN_WARNING "isdn_tty: Couldn't malloc adpcm state\n");
                                PARSE_ERROR1;
                        }
-                       if (m->vpar[3] < 5) {
-                               info->adpcms = isdn_audio_adpcm_init(info->adpcms, m->vpar[3]);
-                               if (!info->adpcms) {
-                                       printk(KERN_WARNING "isdn_tty: Couldn't malloc adpcm state\n");
-                                       PARSE_ERROR1;
-                               }
-                       }
+               }
 #ifdef ISDN_DEBUG_AT
-                       printk(KERN_DEBUG "AT: +VTX\n");
+               printk(KERN_DEBUG "AT: +VTX\n");
 #endif
-                       m->lastDLE = 0;
-                       info->vonline |= 2;
-                       isdn_tty_modem_result(RESULT_CONNECT, info);
-                       return 0;
+               m->lastDLE = 0;
+               info->vonline |= 2;
+               isdn_tty_modem_result(RESULT_CONNECT, info);
+               return 0;
+               break;
+       case 7:
+               /* AT+VDD - DTMF detection */
+               switch (*p[0]) {
+               case '?':
+                       p[0]++;
+                       sprintf(rs, "\r\n<%d>,<%d>",
+                               m->vpar[4],
+                               m->vpar[5]);
+                       isdn_tty_at_cout(rs, info);
                        break;
-               case 7:
-                       /* AT+VDD - DTMF detection */
-                       switch (*p[0]) {
-                               case '?':
-                                       p[0]++;
-                                       sprintf(rs, "\r\n<%d>,<%d>",
-                                               m->vpar[4],
-                                               m->vpar[5]);
-                                       isdn_tty_at_cout(rs, info);
-                                       break;
-                               case '=':
-                                       p[0]++;
-                                       if ((*p[0]>='0') && (*p[0]<='9')) {
-                                               if (info->online != 1)
-                                                       PARSE_ERROR1;
-                                               par1 = isdn_getnum(p);
-                                               if ((par1 < 0) || (par1 > 15))
-                                                       PARSE_ERROR1;
-                                               if (*p[0] != ',')
-                                                       PARSE_ERROR1;
-                                               p[0]++;
-                                               par2 = isdn_getnum(p);
-                                               if ((par2 < 0) || (par2 > 255))
-                                                       PARSE_ERROR1;
-                                               m->vpar[4] = par1;
-                                               m->vpar[5] = par2;
-                                               cmd.driver = info->isdn_driver;
-                                               cmd.command = ISDN_CMD_AUDIO;
-                                               cmd.arg = info->isdn_channel + (ISDN_AUDIO_SETDD << 8);
-                                               cmd.parm.num[0] = par1;
-                                               cmd.parm.num[1] = par2;
-                                               isdn_command(&cmd);
-                                               break;
-                                       } else
-                                       if (*p[0] == '?') {
-                                               p[0]++;
-                                               isdn_tty_at_cout("\r\n<0-15>,<0-255>",
-                                                       info);
-                                               break;
-                                       } else
+               case '=':
+                       p[0]++;
+                       if ((*p[0] >= '0') && (*p[0] <= '9')) {
+                               if (info->online != 1)
+                                       PARSE_ERROR1;
+                               par1 = isdn_getnum(p);
+                               if ((par1 < 0) || (par1 > 15))
+                                       PARSE_ERROR1;
+                               if (*p[0] != ',')
                                        PARSE_ERROR1;
+                               p[0]++;
+                               par2 = isdn_getnum(p);
+                               if ((par2 < 0) || (par2 > 255))
+                                       PARSE_ERROR1;
+                               m->vpar[4] = par1;
+                               m->vpar[5] = par2;
+                               cmd.driver = info->isdn_driver;
+                               cmd.command = ISDN_CMD_AUDIO;
+                               cmd.arg = info->isdn_channel + (ISDN_AUDIO_SETDD << 8);
+                               cmd.parm.num[0] = par1;
+                               cmd.parm.num[1] = par2;
+                               isdn_command(&cmd);
+                               break;
+                       } else
+                               if (*p[0] == '?') {
+                                       p[0]++;
+                                       isdn_tty_at_cout("\r\n<0-15>,<0-255>",
+                                                        info);
                                        break;
-                               default:
+                               } else
                                        PARSE_ERROR1;
-                       }
                        break;
                default:
                        PARSE_ERROR1;
+               }
+               break;
+       default:
+               PARSE_ERROR1;
        }
        return 0;
 }
@@ -3510,7 +3510,7 @@ isdn_tty_cmd_PLUSV(char **p, modem_info * info)
  * Parse and perform an AT-command-line.
  */
 static void
-isdn_tty_parse_at(modem_info * info)
+isdn_tty_parse_at(modem_info *info)
 {
        atemu *m = &info->emu;
        char *p;
@@ -3521,188 +3521,188 @@ isdn_tty_parse_at(modem_info * info)
 #endif
        for (p = &m->mdmcmd[2]; *p;) {
                switch (*p) {
-                       case ' ':
-                               p++;
+               case ' ':
+                       p++;
+                       break;
+               case 'A':
+                       /* A - Accept incoming call */
+                       p++;
+                       isdn_tty_cmd_ATA(info);
+                       return;
+                       break;
+               case 'D':
+                       /* D - Dial */
+                       if (info->msr & UART_MSR_DCD)
+                               PARSE_ERROR;
+                       if (info->msr & UART_MSR_RI) {
+                               isdn_tty_modem_result(RESULT_NO_CARRIER, info);
+                               return;
+                       }
+                       isdn_tty_getdial(++p, ds, sizeof ds);
+                       p += strlen(p);
+                       if (!strlen(m->msn))
+                               isdn_tty_modem_result(RESULT_NO_MSN_EAZ, info);
+                       else if (strlen(ds))
+                               isdn_tty_dial(ds, info, m);
+                       else
+                               PARSE_ERROR;
+                       return;
+               case 'E':
+                       /* E - Turn Echo on/off */
+                       p++;
+                       switch (isdn_getnum(&p)) {
+                       case 0:
+                               m->mdmreg[REG_ECHO] &= ~BIT_ECHO;
                                break;
-                       case 'A':
-                               /* A - Accept incoming call */
+                       case 1:
+                               m->mdmreg[REG_ECHO] |= BIT_ECHO;
+                               break;
+                       default:
+                               PARSE_ERROR;
+                       }
+                       break;
+               case 'H':
+                       /* H - On/Off-hook */
+                       p++;
+                       switch (*p) {
+                       case '0':
                                p++;
-                               isdn_tty_cmd_ATA(info);
-                               return;
+                               isdn_tty_on_hook(info);
                                break;
-                       case 'D':
-                               /* D - Dial */
-                               if (info->msr & UART_MSR_DCD)
-                                       PARSE_ERROR;
-                               if (info->msr & UART_MSR_RI) {
-                                       isdn_tty_modem_result(RESULT_NO_CARRIER, info);
-                                       return;
-                               }
-                               isdn_tty_getdial(++p, ds, sizeof ds);
-                               p += strlen(p);
-                               if (!strlen(m->msn))
-                                       isdn_tty_modem_result(RESULT_NO_MSN_EAZ, info);
-                               else if (strlen(ds))
-                                       isdn_tty_dial(ds, info, m);
-                               else
-                                       PARSE_ERROR;
-                               return;
-                       case 'E':
-                               /* E - Turn Echo on/off */
+                       case '1':
                                p++;
-                               switch (isdn_getnum(&p)) {
-                                       case 0:
-                                               m->mdmreg[REG_ECHO] &= ~BIT_ECHO;
-                                               break;
-                                       case 1:
-                                               m->mdmreg[REG_ECHO] |= BIT_ECHO;
-                                               break;
-                                       default:
-                                               PARSE_ERROR;
-                               }
+                               isdn_tty_off_hook();
                                break;
-                       case 'H':
-                               /* H - On/Off-hook */
+                       default:
+                               isdn_tty_on_hook(info);
+                               break;
+                       }
+                       break;
+               case 'I':
+                       /* I - Information */
+                       p++;
+                       isdn_tty_at_cout("\r\nLinux ISDN", info);
+                       switch (*p) {
+                       case '0':
+                       case '1':
                                p++;
-                               switch (*p) {
-                                       case '0':
-                                               p++;
-                                               isdn_tty_on_hook(info);
-                                               break;
-                                       case '1':
-                                               p++;
-                                               isdn_tty_off_hook();
-                                               break;
-                                       default:
-                                               isdn_tty_on_hook(info);
-                                               break;
-                               }
                                break;
-                       case 'I':
-                               /* I - Information */
+                       case '2':
                                p++;
-                               isdn_tty_at_cout("\r\nLinux ISDN", info);
-                               switch (*p) {
-                                       case '0':
-                                       case '1':
-                                               p++;
-                                               break;
-                                       case '2':
-                                               p++;
-                                               isdn_tty_report(info);
-                                               break;
-                                       case '3':
-                                                p++;
-                                                snprintf(ds, sizeof(ds), "\r\n%d", info->emu.charge);
-                                                isdn_tty_at_cout(ds, info);
-                                                break;
-                                       default:;
-                               }
+                               isdn_tty_report(info);
                                break;
-#ifdef DUMMY_HAYES_AT
-                       case 'L':
-                       case 'M':
-                               /* only for be compilant with common scripts */
-                               /* no function */
+                       case '3':
                                p++;
-                               isdn_getnum(&p);
+                               snprintf(ds, sizeof(ds), "\r\n%d", info->emu.charge);
+                               isdn_tty_at_cout(ds, info);
                                break;
+                       default:;
+                       }
+                       break;
+#ifdef DUMMY_HAYES_AT
+               case 'L':
+               case 'M':
+                       /* only for be compilant with common scripts */
+                       /* no function */
+                       p++;
+                       isdn_getnum(&p);
+                       break;
 #endif
-                       case 'O':
-                               /* O - Go online */
-                               p++;
-                               if (info->msr & UART_MSR_DCD)
-                                       /* if B-Channel is up */
-                                       isdn_tty_modem_result((m->mdmreg[REG_L2PROT] == ISDN_PROTO_L2_MODEM) ? RESULT_CONNECT:RESULT_CONNECT64000, info);
-                               else
-                                       isdn_tty_modem_result(RESULT_NO_CARRIER, info);
+               case 'O':
+                       /* O - Go online */
+                       p++;
+                       if (info->msr & UART_MSR_DCD)
+                               /* if B-Channel is up */
+                               isdn_tty_modem_result((m->mdmreg[REG_L2PROT] == ISDN_PROTO_L2_MODEM) ? RESULT_CONNECT : RESULT_CONNECT64000, info);
+                       else
+                               isdn_tty_modem_result(RESULT_NO_CARRIER, info);
+                       return;
+               case 'Q':
+                       /* Q - Turn Emulator messages on/off */
+                       p++;
+                       switch (isdn_getnum(&p)) {
+                       case 0:
+                               m->mdmreg[REG_RESP] |= BIT_RESP;
+                               break;
+                       case 1:
+                               m->mdmreg[REG_RESP] &= ~BIT_RESP;
+                               break;
+                       default:
+                               PARSE_ERROR;
+                       }
+                       break;
+               case 'S':
+                       /* S - Set/Get Register */
+                       p++;
+                       if (isdn_tty_cmd_ATS(&p, info))
                                return;
-                       case 'Q':
-                               /* Q - Turn Emulator messages on/off */
-                               p++;
-                               switch (isdn_getnum(&p)) {
-                                       case 0:
-                                               m->mdmreg[REG_RESP] |= BIT_RESP;
-                                               break;
-                                       case 1:
-                                               m->mdmreg[REG_RESP] &= ~BIT_RESP;
-                                               break;
-                                       default:
-                                               PARSE_ERROR;
-                               }
+                       break;
+               case 'V':
+                       /* V - Numeric or ASCII Emulator-messages */
+                       p++;
+                       switch (isdn_getnum(&p)) {
+                       case 0:
+                               m->mdmreg[REG_RESP] |= BIT_RESPNUM;
+                               break;
+                       case 1:
+                               m->mdmreg[REG_RESP] &= ~BIT_RESPNUM;
                                break;
-                       case 'S':
-                               /* S - Set/Get Register */
+                       default:
+                               PARSE_ERROR;
+                       }
+                       break;
+               case 'Z':
+                       /* Z - Load Registers from Profile */
+                       p++;
+                       if (info->msr & UART_MSR_DCD) {
+                               info->online = 0;
+                               isdn_tty_on_hook(info);
+                       }
+                       isdn_tty_modem_reset_regs(info, 1);
+                       break;
+               case '+':
+                       p++;
+                       switch (*p) {
+#ifdef CONFIG_ISDN_AUDIO
+                       case 'F':
                                p++;
-                               if (isdn_tty_cmd_ATS(&p, info))
+                               if (isdn_tty_cmd_PLUSF(&p, info))
                                        return;
                                break;
                        case 'V':
-                               /* V - Numeric or ASCII Emulator-messages */
+                               if ((!(m->mdmreg[REG_SI1] & 1)) ||
+                                   (m->mdmreg[REG_L2PROT] == ISDN_PROTO_L2_MODEM))
+                                       PARSE_ERROR;
                                p++;
-                               switch (isdn_getnum(&p)) {
-                                       case 0:
-                                               m->mdmreg[REG_RESP] |= BIT_RESPNUM;
-                                               break;
-                                       case 1:
-                                               m->mdmreg[REG_RESP] &= ~BIT_RESPNUM;
-                                               break;
-                                       default:
-                                               PARSE_ERROR;
-                               }
+                               if (isdn_tty_cmd_PLUSV(&p, info))
+                                       return;
                                break;
-                       case 'Z':
-                               /* Z - Load Registers from Profile */
+#endif                          /* CONFIG_ISDN_AUDIO */
+                       case 'S':       /* SUSPEND */
                                p++;
-                               if (info->msr & UART_MSR_DCD) {
-                                       info->online = 0;
-                                       isdn_tty_on_hook(info);
-                               }
-                               isdn_tty_modem_reset_regs(info, 1);
+                               isdn_tty_get_msnstr(ds, &p);
+                               isdn_tty_suspend(ds, info, m);
                                break;
-                       case '+':
+                       case 'R':       /* RESUME */
                                p++;
-                               switch (*p) {
-#ifdef CONFIG_ISDN_AUDIO
-                                       case 'F':
-                                               p++;
-                                               if (isdn_tty_cmd_PLUSF(&p, info))
-                                                       return;
-                                               break;
-                                       case 'V':
-                                               if ((!(m->mdmreg[REG_SI1] & 1)) ||
-                                                       (m->mdmreg[REG_L2PROT] == ISDN_PROTO_L2_MODEM))
-                                                       PARSE_ERROR;
-                                               p++;
-                                               if (isdn_tty_cmd_PLUSV(&p, info))
-                                                       return;
-                                               break;
-#endif                          /* CONFIG_ISDN_AUDIO */
-                                       case 'S':       /* SUSPEND */
-                                               p++;
-                                               isdn_tty_get_msnstr(ds, &p);
-                                               isdn_tty_suspend(ds, info, m);
-                                               break;
-                                       case 'R':       /* RESUME */
-                                               p++;
-                                               isdn_tty_get_msnstr(ds, &p);
-                                               isdn_tty_resume(ds, info, m);
-                                               break;
-                                       case 'M':       /* MESSAGE */
-                                               p++;
-                                               isdn_tty_send_msg(info, m, p);
-                                               break;
-                                       default:
-                                               PARSE_ERROR;
-                               }
+                               isdn_tty_get_msnstr(ds, &p);
+                               isdn_tty_resume(ds, info, m);
                                break;
-                       case '&':
+                       case 'M':       /* MESSAGE */
                                p++;
-                               if (isdn_tty_cmd_ATand(&p, info))
-                                       return;
+                               isdn_tty_send_msg(info, m, p);
                                break;
                        default:
                                PARSE_ERROR;
+                       }
+                       break;
+               case '&':
+                       p++;
+                       if (isdn_tty_cmd_ATand(&p, info))
+                               return;
+                       break;
+               default:
+                       PARSE_ERROR;
                }
        }
 #ifdef CONFIG_ISDN_AUDIO
@@ -3714,7 +3714,7 @@ isdn_tty_parse_at(modem_info * info)
 /* Need own toupper() because standard-toupper is not available
  * within modules.
  */
-#define my_toupper(c) (((c>='a')&&(c<='z'))?(c&0xdf):c)
+#define my_toupper(c) (((c >= 'a') && (c <= 'z')) ? (c & 0xdf) : c)
 
 /*
  * Perform line-editing of AT-commands
@@ -3725,7 +3725,7 @@ isdn_tty_parse_at(modem_info * info)
  *   channel  index to line (minor-device)
  */
 static int
-isdn_tty_edit_at(const char *p, int count, modem_info * info)
+isdn_tty_edit_at(const char *p, int count, modem_info *info)
 {
        atemu *m = &info->emu;
        int total = 0;
@@ -3768,23 +3768,23 @@ isdn_tty_edit_at(const char *p, int count, modem_info * info)
                        if (m->mdmcmdl < 255) {
                                c = my_toupper(c);
                                switch (m->mdmcmdl) {
-                                       case 1:
-                                               if (c == 'T') {
-                                                       m->mdmcmd[m->mdmcmdl] = c;
-                                                       m->mdmcmd[++m->mdmcmdl] = 0;
-                                                       break;
-                                               } else
-                                                       m->mdmcmdl = 0;
-                                               /* Fall through, check for 'A' */
-                                       case 0:
-                                               if (c == 'A') {
-                                                       m->mdmcmd[m->mdmcmdl] = c;
-                                                       m->mdmcmd[++m->mdmcmdl] = 0;
-                                               }
+                               case 1:
+                                       if (c == 'T') {
+                                               m->mdmcmd[m->mdmcmdl] = c;
+                                               m->mdmcmd[++m->mdmcmdl] = 0;
                                                break;
-                                       default:
+                                       } else
+                                               m->mdmcmdl = 0;
+                                       /* Fall through, check for 'A' */
+                               case 0:
+                                       if (c == 'A') {
                                                m->mdmcmd[m->mdmcmdl] = c;
                                                m->mdmcmd[++m->mdmcmdl] = 0;
+                                       }
+                                       break;
+                               default:
+                                       m->mdmcmd[m->mdmcmdl] = c;
+                                       m->mdmcmd[++m->mdmcmdl] = 0;
                                }
                        }
                }
index 692c74d..a6f801d 100644 (file)
 #define RESULT_VCON            11
 #define RESULT_RUNG            12
 
-#define TTY_IS_FCLASS1(info) \
-       ((info->emu.mdmreg[REG_L2PROT] == ISDN_PROTO_L2_FAX) && \
+#define TTY_IS_FCLASS1(info)                                           \
+       ((info->emu.mdmreg[REG_L2PROT] == ISDN_PROTO_L2_FAX) &&         \
         (info->emu.mdmreg[REG_L3PROT] == ISDN_PROTO_L3_FCLASS1))
-#define TTY_IS_FCLASS2(info) \
-       ((info->emu.mdmreg[REG_L2PROT] == ISDN_PROTO_L2_FAX) && \
+#define TTY_IS_FCLASS2(info)                                           \
+       ((info->emu.mdmreg[REG_L2PROT] == ISDN_PROTO_L2_FAX) &&         \
         (info->emu.mdmreg[REG_L3PROT] == ISDN_PROTO_L3_FCLASS2))
 
 extern void isdn_tty_modem_escape(void);
@@ -110,7 +110,7 @@ extern void isdn_tty_readmodem(void);
 extern int  isdn_tty_find_icall(int, int, setup_parm *);
 extern int  isdn_tty_stat_callback(int, isdn_ctrl *);
 extern int  isdn_tty_rcv_skb(int, int, int, struct sk_buff *);
-extern int  isdn_tty_capi_facility(capi_msg *cm); 
+extern int  isdn_tty_capi_facility(capi_msg *cm);
 extern void isdn_tty_at_cout(char *, modem_info *);
 extern void isdn_tty_modem_hup(modem_info *, int);
 #ifdef CONFIG_ISDN_TTY_FAX
index 4c41f19..47aae49 100644 (file)
@@ -45,7 +45,7 @@ isdn_getrev(const char *revision)
  */
 
 static void
-isdn_tty_fax_modem_result(int code, modem_info * info)
+isdn_tty_fax_modem_result(int code, modem_info *info)
 {
        atemu *m = &info->emu;
        T30_s *f = info->fax;
@@ -54,9 +54,9 @@ isdn_tty_fax_modem_result(int code, modem_info * info)
        char *rp;
        int i;
        static char *msg[] =
-       {"OK", "ERROR", "+FCON", "+FCSI:", "+FDIS:",
-        "+FHNG:", "+FDCS:", "CONNECT", "+FTSI:",
-        "+FCFR", "+FPTS:", "+FET:"};
+               {"OK", "ERROR", "+FCON", "+FCSI:", "+FDIS:",
+                "+FHNG:", "+FDCS:", "CONNECT", "+FTSI:",
+                "+FCFR", "+FPTS:", "+FET:"};
 
 
        isdn_tty_at_cout("\r\n", info);
@@ -64,95 +64,95 @@ isdn_tty_fax_modem_result(int code, modem_info * info)
 
 #ifdef ISDN_TTY_FAX_CMD_DEBUG
        printk(KERN_DEBUG "isdn_tty: Fax send %s on ttyI%d\n",
-               msg[code], info->line);
+              msg[code], info->line);
 #endif
        switch (code) {
-               case 0: /* OK */
-                       break;
-               case 1: /* ERROR */
-                       break;
-               case 2: /* +FCON */
-                       /* Append CPN, if enabled */
-                       if ((m->mdmreg[REG_CPNFCON] & BIT_CPNFCON) &&
-                               (!(dev->usage[info->isdn_channel] & ISDN_USAGE_OUTGOING))) {
-                               sprintf(rs, "/%s", m->cpn);
-                               isdn_tty_at_cout(rs, info);
-                       }
-                       info->online = 1;
-                       f->fet = 0;
-                       if (f->phase == ISDN_FAX_PHASE_A)
-                               f->phase = ISDN_FAX_PHASE_B;
-                       break;
-               case 3: /* +FCSI */
-               case 8: /* +FTSI */
-                       sprintf(rs, "\"%s\"", f->r_id);
-                       isdn_tty_at_cout(rs, info);
-                       break;
-               case 4: /* +FDIS */
-                       rs[0] = 0;
-                       rp = &f->r_resolution;
-                       for (i = 0; i < 8; i++) {
-                               sprintf(rss, "%c%s", rp[i] + 48,
-                                       (i < 7) ? "," : "");
-                               strcat(rs, rss);
-                       }
+       case 0: /* OK */
+               break;
+       case 1: /* ERROR */
+               break;
+       case 2: /* +FCON */
+               /* Append CPN, if enabled */
+               if ((m->mdmreg[REG_CPNFCON] & BIT_CPNFCON) &&
+                   (!(dev->usage[info->isdn_channel] & ISDN_USAGE_OUTGOING))) {
+                       sprintf(rs, "/%s", m->cpn);
                        isdn_tty_at_cout(rs, info);
+               }
+               info->online = 1;
+               f->fet = 0;
+               if (f->phase == ISDN_FAX_PHASE_A)
+                       f->phase = ISDN_FAX_PHASE_B;
+               break;
+       case 3: /* +FCSI */
+       case 8: /* +FTSI */
+               sprintf(rs, "\"%s\"", f->r_id);
+               isdn_tty_at_cout(rs, info);
+               break;
+       case 4: /* +FDIS */
+               rs[0] = 0;
+               rp = &f->r_resolution;
+               for (i = 0; i < 8; i++) {
+                       sprintf(rss, "%c%s", rp[i] + 48,
+                               (i < 7) ? "," : "");
+                       strcat(rs, rss);
+               }
+               isdn_tty_at_cout(rs, info);
 #ifdef ISDN_TTY_FAX_CMD_DEBUG
-                       printk(KERN_DEBUG "isdn_tty: Fax DIS=%s on ttyI%d\n",
-                              rs, info->line);
+               printk(KERN_DEBUG "isdn_tty: Fax DIS=%s on ttyI%d\n",
+                      rs, info->line);
 #endif
-                       break;
-               case 5: /* +FHNG */
-                       sprintf(rs, "%d", f->code);
-                       isdn_tty_at_cout(rs, info);
-                       info->faxonline = 0;
-                       break;
-               case 6: /* +FDCS */
-                       rs[0] = 0;
-                       rp = &f->r_resolution;
-                       for (i = 0; i < 8; i++) {
-                               sprintf(rss, "%c%s", rp[i] + 48,
-                                       (i < 7) ? "," : "");
-                               strcat(rs, rss);
-                       }
-                       isdn_tty_at_cout(rs, info);
+               break;
+       case 5: /* +FHNG */
+               sprintf(rs, "%d", f->code);
+               isdn_tty_at_cout(rs, info);
+               info->faxonline = 0;
+               break;
+       case 6: /* +FDCS */
+               rs[0] = 0;
+               rp = &f->r_resolution;
+               for (i = 0; i < 8; i++) {
+                       sprintf(rss, "%c%s", rp[i] + 48,
+                               (i < 7) ? "," : "");
+                       strcat(rs, rss);
+               }
+               isdn_tty_at_cout(rs, info);
 #ifdef ISDN_TTY_FAX_CMD_DEBUG
-                       printk(KERN_DEBUG "isdn_tty: Fax DCS=%s on ttyI%d\n",
-                              rs, info->line);
+               printk(KERN_DEBUG "isdn_tty: Fax DCS=%s on ttyI%d\n",
+                      rs, info->line);
 #endif
-                       break;
-               case 7: /* CONNECT */
-                       info->faxonline |= 2;
-                       break;
-               case 9: /* FCFR */
-                       break;
-               case 10:        /* FPTS */
-                       isdn_tty_at_cout("1", info);
-                       break;
-               case 11:        /* FET */
-                       sprintf(rs, "%d", f->fet);
-                       isdn_tty_at_cout(rs, info);
-                       break;
+               break;
+       case 7: /* CONNECT */
+               info->faxonline |= 2;
+               break;
+       case 9: /* FCFR */
+               break;
+       case 10:        /* FPTS */
+               isdn_tty_at_cout("1", info);
+               break;
+       case 11:        /* FET */
+               sprintf(rs, "%d", f->fet);
+               isdn_tty_at_cout(rs, info);
+               break;
        }
 
        isdn_tty_at_cout("\r\n", info);
 
        switch (code) {
-               case 7: /* CONNECT */
-                       info->online = 2;
-                       if (info->faxonline & 1) {
-                               sprintf(rs, "%c", XON);
-                               isdn_tty_at_cout(rs, info);
-                       }
-                       break;
+       case 7: /* CONNECT */
+               info->online = 2;
+               if (info->faxonline & 1) {
+                       sprintf(rs, "%c", XON);
+                       isdn_tty_at_cout(rs, info);
+               }
+               break;
        }
 }
 
 static int
-isdn_tty_fax_command1(modem_info * info, isdn_ctrl * c)
+isdn_tty_fax_command1(modem_info *info, isdn_ctrl *c)
 {
        static char *msg[] =
-       {"OK", "CONNECT", "NO CARRIER", "ERROR", "FCERROR"};
+               {"OK", "CONNECT", "NO CARRIER", "ERROR", "FCERROR"};
 
 #ifdef ISDN_TTY_FAX_CMD_DEBUG
        printk(KERN_DEBUG "isdn_tty: FCLASS1 cmd(%d)\n", c->parm.aux.cmd);
@@ -165,30 +165,30 @@ isdn_tty_fax_command1(modem_info * info, isdn_ctrl * c)
                isdn_tty_at_cout("\r\n", info);
        }
        switch (c->parm.aux.cmd) {
-               case ISDN_FAX_CLASS1_CONNECT:
-                       info->online = 2;
-                       break;
-               case ISDN_FAX_CLASS1_OK:
-               case ISDN_FAX_CLASS1_FCERROR:
-               case ISDN_FAX_CLASS1_ERROR:
-               case ISDN_FAX_CLASS1_NOCARR:
-                       break;
-               case ISDN_FAX_CLASS1_QUERY:
+       case ISDN_FAX_CLASS1_CONNECT:
+               info->online = 2;
+               break;
+       case ISDN_FAX_CLASS1_OK:
+       case ISDN_FAX_CLASS1_FCERROR:
+       case ISDN_FAX_CLASS1_ERROR:
+       case ISDN_FAX_CLASS1_NOCARR:
+               break;
+       case ISDN_FAX_CLASS1_QUERY:
+               isdn_tty_at_cout("\r\n", info);
+               if (!c->parm.aux.para[0]) {
+                       isdn_tty_at_cout(msg[ISDN_FAX_CLASS1_ERROR], info);
                        isdn_tty_at_cout("\r\n", info);
-                       if (!c->parm.aux.para[0]) {
-                               isdn_tty_at_cout(msg[ISDN_FAX_CLASS1_ERROR], info);
-                               isdn_tty_at_cout("\r\n", info);
-                       } else {
-                               isdn_tty_at_cout(c->parm.aux.para, info);
-                               isdn_tty_at_cout("\r\nOK\r\n", info);
-                       }
-                       break;
+               } else {
+                       isdn_tty_at_cout(c->parm.aux.para, info);
+                       isdn_tty_at_cout("\r\nOK\r\n", info);
+               }
+               break;
        }
        return (0);
 }
 
 int
-isdn_tty_fax_command(modem_info * info, isdn_ctrl * c)
+isdn_tty_fax_command(modem_info *info, isdn_ctrl *c)
 {
        T30_s *f = info->fax;
        char rs[10];
@@ -201,78 +201,78 @@ isdn_tty_fax_command(modem_info * info, isdn_ctrl * c)
               f->r_code, info->line);
 #endif
        switch (f->r_code) {
-               case ISDN_TTY_FAX_FCON:
-                       info->faxonline = 1;
-                       isdn_tty_fax_modem_result(2, info);     /* +FCON */
-                       return (0);
-               case ISDN_TTY_FAX_FCON_I:
-                       info->faxonline = 16;
-                       isdn_tty_fax_modem_result(2, info);     /* +FCON */
-                       return (0);
-               case ISDN_TTY_FAX_RID:
-                       if (info->faxonline & 1)
-                               isdn_tty_fax_modem_result(3, info);     /* +FCSI */
-                       if (info->faxonline & 16)
-                               isdn_tty_fax_modem_result(8, info);     /* +FTSI */
-                       return (0);
-               case ISDN_TTY_FAX_DIS:
-                       isdn_tty_fax_modem_result(4, info);     /* +FDIS */
-                       return (0);
-               case ISDN_TTY_FAX_HNG:
-                       if (f->phase == ISDN_FAX_PHASE_C) {
-                               if (f->direction == ISDN_TTY_FAX_CONN_IN) {
-                                       sprintf(rs, "%c%c", DLE, ETX);
-                                       isdn_tty_at_cout(rs, info);
-                               } else {
-                                       sprintf(rs, "%c", 0x18);
-                                       isdn_tty_at_cout(rs, info);
-                               }
-                               info->faxonline &= ~2;  /* leave data mode */
-                               info->online = 1;
-                       }
-                       f->phase = ISDN_FAX_PHASE_E;
-                       isdn_tty_fax_modem_result(5, info);     /* +FHNG */
-                       isdn_tty_fax_modem_result(0, info);     /* OK */
-                       return (0);
-               case ISDN_TTY_FAX_DCS:
-                       isdn_tty_fax_modem_result(6, info);     /* +FDCS */
-                       isdn_tty_fax_modem_result(7, info);     /* CONNECT */
-                       f->phase = ISDN_FAX_PHASE_C;
-                       return (0);
-               case ISDN_TTY_FAX_TRAIN_OK:
-                       isdn_tty_fax_modem_result(6, info);     /* +FDCS */
-                       isdn_tty_fax_modem_result(0, info);     /* OK */
-                       return (0);
-               case ISDN_TTY_FAX_SENT:
-                       isdn_tty_fax_modem_result(0, info);     /* OK */
-                       return (0);
-               case ISDN_TTY_FAX_CFR:
-                       isdn_tty_fax_modem_result(9, info);     /* +FCFR */
-                       return (0);
-               case ISDN_TTY_FAX_ET:
-                       sprintf(rs, "%c%c", DLE, ETX);
-                       isdn_tty_at_cout(rs, info);
-                       isdn_tty_fax_modem_result(10, info);    /* +FPTS */
-                       isdn_tty_fax_modem_result(11, info);    /* +FET */
-                       isdn_tty_fax_modem_result(0, info);     /* OK */
-                       info->faxonline &= ~2;  /* leave data mode */
-                       info->online = 1;
-                       f->phase = ISDN_FAX_PHASE_D;
-                       return (0);
-               case ISDN_TTY_FAX_PTS:
-                       isdn_tty_fax_modem_result(10, info);    /* +FPTS */
-                       if (f->direction == ISDN_TTY_FAX_CONN_OUT) {
-                               if (f->fet == 1)
-                                       f->phase = ISDN_FAX_PHASE_B;
-                               if (f->fet == 0)
-                                       isdn_tty_fax_modem_result(0, info);     /* OK */
+       case ISDN_TTY_FAX_FCON:
+               info->faxonline = 1;
+               isdn_tty_fax_modem_result(2, info);     /* +FCON */
+               return (0);
+       case ISDN_TTY_FAX_FCON_I:
+               info->faxonline = 16;
+               isdn_tty_fax_modem_result(2, info);     /* +FCON */
+               return (0);
+       case ISDN_TTY_FAX_RID:
+               if (info->faxonline & 1)
+                       isdn_tty_fax_modem_result(3, info);     /* +FCSI */
+               if (info->faxonline & 16)
+                       isdn_tty_fax_modem_result(8, info);     /* +FTSI */
+               return (0);
+       case ISDN_TTY_FAX_DIS:
+               isdn_tty_fax_modem_result(4, info);     /* +FDIS */
+               return (0);
+       case ISDN_TTY_FAX_HNG:
+               if (f->phase == ISDN_FAX_PHASE_C) {
+                       if (f->direction == ISDN_TTY_FAX_CONN_IN) {
+                               sprintf(rs, "%c%c", DLE, ETX);
+                               isdn_tty_at_cout(rs, info);
+                       } else {
+                               sprintf(rs, "%c", 0x18);
+                               isdn_tty_at_cout(rs, info);
                        }
-                       return (0);
-               case ISDN_TTY_FAX_EOP:
                        info->faxonline &= ~2;  /* leave data mode */
                        info->online = 1;
-                       f->phase = ISDN_FAX_PHASE_D;
-                       return (0);
+               }
+               f->phase = ISDN_FAX_PHASE_E;
+               isdn_tty_fax_modem_result(5, info);     /* +FHNG */
+               isdn_tty_fax_modem_result(0, info);     /* OK */
+               return (0);
+       case ISDN_TTY_FAX_DCS:
+               isdn_tty_fax_modem_result(6, info);     /* +FDCS */
+               isdn_tty_fax_modem_result(7, info);     /* CONNECT */
+               f->phase = ISDN_FAX_PHASE_C;
+               return (0);
+       case ISDN_TTY_FAX_TRAIN_OK:
+               isdn_tty_fax_modem_result(6, info);     /* +FDCS */
+               isdn_tty_fax_modem_result(0, info);     /* OK */
+               return (0);
+       case ISDN_TTY_FAX_SENT:
+               isdn_tty_fax_modem_result(0, info);     /* OK */
+               return (0);
+       case ISDN_TTY_FAX_CFR:
+               isdn_tty_fax_modem_result(9, info);     /* +FCFR */
+               return (0);
+       case ISDN_TTY_FAX_ET:
+               sprintf(rs, "%c%c", DLE, ETX);
+               isdn_tty_at_cout(rs, info);
+               isdn_tty_fax_modem_result(10, info);    /* +FPTS */
+               isdn_tty_fax_modem_result(11, info);    /* +FET */
+               isdn_tty_fax_modem_result(0, info);     /* OK */
+               info->faxonline &= ~2;  /* leave data mode */
+               info->online = 1;
+               f->phase = ISDN_FAX_PHASE_D;
+               return (0);
+       case ISDN_TTY_FAX_PTS:
+               isdn_tty_fax_modem_result(10, info);    /* +FPTS */
+               if (f->direction == ISDN_TTY_FAX_CONN_OUT) {
+                       if (f->fet == 1)
+                               f->phase = ISDN_FAX_PHASE_B;
+                       if (f->fet == 0)
+                               isdn_tty_fax_modem_result(0, info);     /* OK */
+               }
+               return (0);
+       case ISDN_TTY_FAX_EOP:
+               info->faxonline &= ~2;  /* leave data mode */
+               info->online = 1;
+               f->phase = ISDN_FAX_PHASE_D;
+               return (0);
 
        }
        return (-1);
@@ -280,7 +280,7 @@ isdn_tty_fax_command(modem_info * info, isdn_ctrl * c)
 
 
 void
-isdn_tty_fax_bitorder(modem_info * info, struct sk_buff *skb)
+isdn_tty_fax_bitorder(modem_info *info, struct sk_buff *skb)
 {
        __u8 LeftMask;
        __u8 RightMask;
@@ -292,10 +292,10 @@ isdn_tty_fax_bitorder(modem_info * info, struct sk_buff *skb)
                for (i = 0; i < skb->len; i++) {
                        Data = skb->data[i];
                        for (
-                                   LeftMask = 0x80, RightMask = 0x01;
-                                   LeftMask > RightMask;
-                                   LeftMask >>= 1, RightMask <<= 1
-                           ) {
+                               LeftMask = 0x80, RightMask = 0x01;
+                               LeftMask > RightMask;
+                               LeftMask >>= 1, RightMask <<= 1
+                               ) {
                                fBit = (Data & LeftMask);
                                if (Data & RightMask)
                                        Data |= LeftMask;
@@ -317,10 +317,10 @@ isdn_tty_fax_bitorder(modem_info * info, struct sk_buff *skb)
  */
 
 static int
-isdn_tty_cmd_FCLASS1(char **p, modem_info * info)
+isdn_tty_cmd_FCLASS1(char **p, modem_info *info)
 {
        static char *cmd[] =
-       {"AE", "TS", "RS", "TM", "RM", "TH", "RH"};
+               {"AE", "TS", "RS", "TM", "RM", "TH", "RH"};
        isdn_ctrl c;
        int par, i;
        u_long flags;
@@ -337,28 +337,28 @@ isdn_tty_cmd_FCLASS1(char **p, modem_info * info)
 
        p[0] += 2;
        switch (*p[0]) {
-               case '?':
-                       p[0]++;
-                       c.parm.aux.subcmd = AT_QUERY;
-                       break;
-               case '=':
+       case '?':
+               p[0]++;
+               c.parm.aux.subcmd = AT_QUERY;
+               break;
+       case '=':
+               p[0]++;
+               if (*p[0] == '?') {
                        p[0]++;
-                       if (*p[0] == '?') {
-                               p[0]++;
-                               c.parm.aux.subcmd = AT_EQ_QUERY;
-                       } else {
-                               par = isdn_getnum(p);
-                               if ((par < 0) || (par > 255))
-                                       PARSE_ERROR1;
-                               c.parm.aux.subcmd = AT_EQ_VALUE;
-                               c.parm.aux.para[0] = par;
-                       }
-                       break;
-               case 0:
-                       c.parm.aux.subcmd = AT_COMMAND;
-                       break;
-               default:
-                       PARSE_ERROR1;
+                       c.parm.aux.subcmd = AT_EQ_QUERY;
+               } else {
+                       par = isdn_getnum(p);
+                       if ((par < 0) || (par > 255))
+                               PARSE_ERROR1;
+                       c.parm.aux.subcmd = AT_EQ_VALUE;
+                       c.parm.aux.para[0] = par;
+               }
+               break;
+       case 0:
+               c.parm.aux.subcmd = AT_COMMAND;
+               break;
+       default:
+               PARSE_ERROR1;
        }
        c.command = ISDN_CMD_FAXCMD;
 #ifdef ISDN_TTY_FAX_CMD_DEBUG
@@ -409,7 +409,7 @@ isdn_tty_cmd_FCLASS1(char **p, modem_info * info)
  */
 
 static int
-isdn_tty_cmd_FCLASS2(char **p, modem_info * info)
+isdn_tty_cmd_FCLASS2(char **p, modem_info *info)
 {
        atemu *m = &info->emu;
        T30_s *f = info->fax;
@@ -418,25 +418,25 @@ isdn_tty_cmd_FCLASS2(char **p, modem_info * info)
        char rs[50];
        char rss[50];
        int maxdccval[] =
-       {1, 5, 2, 2, 3, 2, 0, 7};
+               {1, 5, 2, 2, 3, 2, 0, 7};
 
        /* FAA still unchanged */
        if (!strncmp(p[0], "AA", 2)) {  /* TODO */
                p[0] += 2;
                switch (*p[0]) {
-                       case '?':
-                               p[0]++;
-                               sprintf(rs, "\r\n%d", 0);
-                               isdn_tty_at_cout(rs, info);
-                               break;
-                       case '=':
-                               p[0]++;
-                               par = isdn_getnum(p);
-                               if ((par < 0) || (par > 255))
-                                       PARSE_ERROR1;
-                               break;
-                       default:
+               case '?':
+                       p[0]++;
+                       sprintf(rs, "\r\n%d", 0);
+                       isdn_tty_at_cout(rs, info);
+                       break;
+               case '=':
+                       p[0]++;
+                       par = isdn_getnum(p);
+                       if ((par < 0) || (par > 255))
                                PARSE_ERROR1;
+                       break;
+               default:
+                       PARSE_ERROR1;
                }
                return 0;
        }
@@ -444,29 +444,29 @@ isdn_tty_cmd_FCLASS2(char **p, modem_info * info)
        if (!strncmp(p[0], "BADLIN", 6)) {
                p[0] += 6;
                switch (*p[0]) {
-                       case '?':
+               case '?':
+                       p[0]++;
+                       sprintf(rs, "\r\n%d", f->badlin);
+                       isdn_tty_at_cout(rs, info);
+                       break;
+               case '=':
+                       p[0]++;
+                       if (*p[0] == '?') {
                                p[0]++;
-                               sprintf(rs, "\r\n%d", f->badlin);
+                               sprintf(rs, "\r\n0-255");
                                isdn_tty_at_cout(rs, info);
-                               break;
-                       case '=':
-                               p[0]++;
-                               if (*p[0] == '?') {
-                                       p[0]++;
-                                       sprintf(rs, "\r\n0-255");
-                                       isdn_tty_at_cout(rs, info);
-                               } else {
-                                       par = isdn_getnum(p);
-                                       if ((par < 0) || (par > 255))
-                                               PARSE_ERROR1;
-                                       f->badlin = par;
+                       } else {
+                               par = isdn_getnum(p);
+                               if ((par < 0) || (par > 255))
+                                       PARSE_ERROR1;
+                               f->badlin = par;
 #ifdef ISDN_TTY_FAX_STAT_DEBUG
-                                       printk(KERN_DEBUG "isdn_tty: Fax FBADLIN=%d\n", par);
+                               printk(KERN_DEBUG "isdn_tty: Fax FBADLIN=%d\n", par);
 #endif
-                               }
-                               break;
-                       default:
-                               PARSE_ERROR1;
+                       }
+                       break;
+               default:
+                       PARSE_ERROR1;
                }
                return 0;
        }
@@ -474,29 +474,29 @@ isdn_tty_cmd_FCLASS2(char **p, modem_info * info)
        if (!strncmp(p[0], "BADMUL", 6)) {
                p[0] += 6;
                switch (*p[0]) {
-                       case '?':
+               case '?':
+                       p[0]++;
+                       sprintf(rs, "\r\n%d", f->badmul);
+                       isdn_tty_at_cout(rs, info);
+                       break;
+               case '=':
+                       p[0]++;
+                       if (*p[0] == '?') {
                                p[0]++;
-                               sprintf(rs, "\r\n%d", f->badmul);
+                               sprintf(rs, "\r\n0-255");
                                isdn_tty_at_cout(rs, info);
-                               break;
-                       case '=':
-                               p[0]++;
-                               if (*p[0] == '?') {
-                                       p[0]++;
-                                       sprintf(rs, "\r\n0-255");
-                                       isdn_tty_at_cout(rs, info);
-                               } else {
-                                       par = isdn_getnum(p);
-                                       if ((par < 0) || (par > 255))
-                                               PARSE_ERROR1;
-                                       f->badmul = par;
+                       } else {
+                               par = isdn_getnum(p);
+                               if ((par < 0) || (par > 255))
+                                       PARSE_ERROR1;
+                               f->badmul = par;
 #ifdef ISDN_TTY_FAX_STAT_DEBUG
-                                       printk(KERN_DEBUG "isdn_tty: Fax FBADMUL=%d\n", par);
+                               printk(KERN_DEBUG "isdn_tty: Fax FBADMUL=%d\n", par);
 #endif
-                               }
-                               break;
-                       default:
-                               PARSE_ERROR1;
+                       }
+                       break;
+               default:
+                       PARSE_ERROR1;
                }
                return 0;
        }
@@ -504,29 +504,29 @@ isdn_tty_cmd_FCLASS2(char **p, modem_info * info)
        if (!strncmp(p[0], "BOR", 3)) {
                p[0] += 3;
                switch (*p[0]) {
-                       case '?':
+               case '?':
+                       p[0]++;
+                       sprintf(rs, "\r\n%d", f->bor);
+                       isdn_tty_at_cout(rs, info);
+                       break;
+               case '=':
+                       p[0]++;
+                       if (*p[0] == '?') {
                                p[0]++;
-                               sprintf(rs, "\r\n%d", f->bor);
+                               sprintf(rs, "\r\n0,1");
                                isdn_tty_at_cout(rs, info);
-                               break;
-                       case '=':
-                               p[0]++;
-                               if (*p[0] == '?') {
-                                       p[0]++;
-                                       sprintf(rs, "\r\n0,1");
-                                       isdn_tty_at_cout(rs, info);
-                               } else {
-                                       par = isdn_getnum(p);
-                                       if ((par < 0) || (par > 1))
-                                               PARSE_ERROR1;
-                                       f->bor = par;
+                       } else {
+                               par = isdn_getnum(p);
+                               if ((par < 0) || (par > 1))
+                                       PARSE_ERROR1;
+                               f->bor = par;
 #ifdef ISDN_TTY_FAX_STAT_DEBUG
-                                       printk(KERN_DEBUG "isdn_tty: Fax FBOR=%d\n", par);
+                               printk(KERN_DEBUG "isdn_tty: Fax FBOR=%d\n", par);
 #endif
-                               }
-                               break;
-                       default:
-                               PARSE_ERROR1;
+                       }
+                       break;
+               default:
+                       PARSE_ERROR1;
                }
                return 0;
        }
@@ -534,29 +534,29 @@ isdn_tty_cmd_FCLASS2(char **p, modem_info * info)
        if (!strncmp(p[0], "NBC", 3)) {
                p[0] += 3;
                switch (*p[0]) {
-                       case '?':
+               case '?':
+                       p[0]++;
+                       sprintf(rs, "\r\n%d", f->nbc);
+                       isdn_tty_at_cout(rs, info);
+                       break;
+               case '=':
+                       p[0]++;
+                       if (*p[0] == '?') {
                                p[0]++;
-                               sprintf(rs, "\r\n%d", f->nbc);
+                               sprintf(rs, "\r\n0,1");
                                isdn_tty_at_cout(rs, info);
-                               break;
-                       case '=':
-                               p[0]++;
-                               if (*p[0] == '?') {
-                                       p[0]++;
-                                       sprintf(rs, "\r\n0,1");
-                                       isdn_tty_at_cout(rs, info);
-                               } else {
-                                       par = isdn_getnum(p);
-                                       if ((par < 0) || (par > 1))
-                                               PARSE_ERROR1;
-                                       f->nbc = par;
+                       } else {
+                               par = isdn_getnum(p);
+                               if ((par < 0) || (par > 1))
+                                       PARSE_ERROR1;
+                               f->nbc = par;
 #ifdef ISDN_TTY_FAX_STAT_DEBUG
-                                       printk(KERN_DEBUG "isdn_tty: Fax FNBC=%d\n", par);
+                               printk(KERN_DEBUG "isdn_tty: Fax FNBC=%d\n", par);
 #endif
-                               }
-                               break;
-                       default:
-                               PARSE_ERROR1;
+                       }
+                       break;
+               default:
+                       PARSE_ERROR1;
                }
                return 0;
        }
@@ -576,36 +576,36 @@ isdn_tty_cmd_FCLASS2(char **p, modem_info * info)
                int i, r;
                p[0] += 3;
                switch (*p[0]) {
-                       case '?':
+               case '?':
+                       p[0]++;
+                       sprintf(rs, "\r\n\"%s\"", f->pollid);
+                       isdn_tty_at_cout(rs, info);
+                       break;
+               case '=':
+                       p[0]++;
+                       if (*p[0] == '?') {
                                p[0]++;
-                               sprintf(rs, "\r\n\"%s\"", f->pollid);
+                               sprintf(rs, "\r\n\"STRING\"");
                                isdn_tty_at_cout(rs, info);
-                               break;
-                       case '=':
-                               p[0]++;
-                               if (*p[0] == '?') {
+                       } else {
+                               if (*p[0] == '"')
                                        p[0]++;
-                                       sprintf(rs, "\r\n\"STRING\"");
-                                       isdn_tty_at_cout(rs, info);
-                               } else {
-                                       if (*p[0] == '"')
-                                               p[0]++;
-                                       for (i = 0; (*p[0]) && i < (FAXIDLEN - 1) && (*p[0] != '"'); i++) {
-                                               f->pollid[i] = *p[0]++;
-                                       }
-                                       if (*p[0] == '"')
-                                               p[0]++;
-                                       for (r = i; r < FAXIDLEN; r++) {
-                                               f->pollid[r] = 32;
-                                       }
-                                       f->pollid[FAXIDLEN - 1] = 0;
+                               for (i = 0; (*p[0]) && i < (FAXIDLEN - 1) && (*p[0] != '"'); i++) {
+                                       f->pollid[i] = *p[0]++;
+                               }
+                               if (*p[0] == '"')
+                                       p[0]++;
+                               for (r = i; r < FAXIDLEN; r++) {
+                                       f->pollid[r] = 32;
+                               }
+                               f->pollid[FAXIDLEN - 1] = 0;
 #ifdef ISDN_TTY_FAX_STAT_DEBUG
-                                       printk(KERN_DEBUG "isdn_tty: Fax local poll ID rx \"%s\"\n", f->pollid);
+                               printk(KERN_DEBUG "isdn_tty: Fax local poll ID rx \"%s\"\n", f->pollid);
 #endif
-                               }
-                               break;
-                       default:
-                               PARSE_ERROR1;
+                       }
+                       break;
+               default:
+                       PARSE_ERROR1;
                }
                return 0;
        }
@@ -613,29 +613,29 @@ isdn_tty_cmd_FCLASS2(char **p, modem_info * info)
        if (!strncmp(p[0], "CQ", 2)) {
                p[0] += 2;
                switch (*p[0]) {
-                       case '?':
+               case '?':
+                       p[0]++;
+                       sprintf(rs, "\r\n%d", f->cq);
+                       isdn_tty_at_cout(rs, info);
+                       break;
+               case '=':
+                       p[0]++;
+                       if (*p[0] == '?') {
                                p[0]++;
-                               sprintf(rs, "\r\n%d", f->cq);
+                               sprintf(rs, "\r\n0,1,2");
                                isdn_tty_at_cout(rs, info);
-                               break;
-                       case '=':
-                               p[0]++;
-                               if (*p[0] == '?') {
-                                       p[0]++;
-                                       sprintf(rs, "\r\n0,1,2");
-                                       isdn_tty_at_cout(rs, info);
-                               } else {
-                                       par = isdn_getnum(p);
-                                       if ((par < 0) || (par > 2))
-                                               PARSE_ERROR1;
-                                       f->cq = par;
+                       } else {
+                               par = isdn_getnum(p);
+                               if ((par < 0) || (par > 2))
+                                       PARSE_ERROR1;
+                               f->cq = par;
 #ifdef ISDN_TTY_FAX_STAT_DEBUG
-                                       printk(KERN_DEBUG "isdn_tty: Fax FCQ=%d\n", par);
+                               printk(KERN_DEBUG "isdn_tty: Fax FCQ=%d\n", par);
 #endif
-                               }
-                               break;
-                       default:
-                               PARSE_ERROR1;
+                       }
+                       break;
+               default:
+                       PARSE_ERROR1;
                }
                return 0;
        }
@@ -643,29 +643,29 @@ isdn_tty_cmd_FCLASS2(char **p, modem_info * info)
        if (!strncmp(p[0], "CR", 2)) {
                p[0] += 2;
                switch (*p[0]) {
-                       case '?':
+               case '?':
+                       p[0]++;
+                       sprintf(rs, "\r\n%d", f->cr);   /* read actual value from struct and print */
+                       isdn_tty_at_cout(rs, info);
+                       break;
+               case '=':
+                       p[0]++;
+                       if (*p[0] == '?') {
                                p[0]++;
-                               sprintf(rs, "\r\n%d", f->cr);   /* read actual value from struct and print */
+                               sprintf(rs, "\r\n0,1");         /* display online help */
                                isdn_tty_at_cout(rs, info);
-                               break;
-                       case '=':
-                               p[0]++;
-                               if (*p[0] == '?') {
-                                       p[0]++;
-                                       sprintf(rs, "\r\n0,1");         /* display online help */
-                                       isdn_tty_at_cout(rs, info);
-                               } else {
-                                       par = isdn_getnum(p);
-                                       if ((par < 0) || (par > 1))
-                                               PARSE_ERROR1;
-                                       f->cr = par;
+                       } else {
+                               par = isdn_getnum(p);
+                               if ((par < 0) || (par > 1))
+                                       PARSE_ERROR1;
+                               f->cr = par;
 #ifdef ISDN_TTY_FAX_STAT_DEBUG
-                                       printk(KERN_DEBUG "isdn_tty: Fax FCR=%d\n", par);
+                               printk(KERN_DEBUG "isdn_tty: Fax FCR=%d\n", par);
 #endif
-                               }
-                               break;
-                       default:
-                               PARSE_ERROR1;
+                       }
+                       break;
+               default:
+                       PARSE_ERROR1;
                }
                return 0;
        }
@@ -673,29 +673,29 @@ isdn_tty_cmd_FCLASS2(char **p, modem_info * info)
        if (!strncmp(p[0], "CTCRTY", 6)) {
                p[0] += 6;
                switch (*p[0]) {
-                       case '?':
+               case '?':
+                       p[0]++;
+                       sprintf(rs, "\r\n%d", f->ctcrty);
+                       isdn_tty_at_cout(rs, info);
+                       break;
+               case '=':
+                       p[0]++;
+                       if (*p[0] == '?') {
                                p[0]++;
-                               sprintf(rs, "\r\n%d", f->ctcrty);
+                               sprintf(rs, "\r\n0-255");
                                isdn_tty_at_cout(rs, info);
-                               break;
-                       case '=':
-                               p[0]++;
-                               if (*p[0] == '?') {
-                                       p[0]++;
-                                       sprintf(rs, "\r\n0-255");
-                                       isdn_tty_at_cout(rs, info);
-                               } else {
-                                       par = isdn_getnum(p);
-                                       if ((par < 0) || (par > 255))
-                                               PARSE_ERROR1;
-                                       f->ctcrty = par;
+                       } else {
+                               par = isdn_getnum(p);
+                               if ((par < 0) || (par > 255))
+                                       PARSE_ERROR1;
+                               f->ctcrty = par;
 #ifdef ISDN_TTY_FAX_STAT_DEBUG
-                                       printk(KERN_DEBUG "isdn_tty: Fax FCTCRTY=%d\n", par);
+                               printk(KERN_DEBUG "isdn_tty: Fax FCTCRTY=%d\n", par);
 #endif
-                               }
-                               break;
-                       default:
-                               PARSE_ERROR1;
+                       }
+                       break;
+               default:
+                       PARSE_ERROR1;
                }
                return 0;
        }
@@ -706,42 +706,42 @@ isdn_tty_cmd_FCLASS2(char **p, modem_info * info)
 
                p[0] += 3;
                switch (*p[0]) {
-                       case '?':
-                               p[0]++;
-                               strcpy(rs, "\r\n");
-                               for (i = 0; i < 8; i++) {
-                                       sprintf(rss, "%c%s", rp[i] + 48,
-                                               (i < 7) ? "," : "");
-                                       strcat(rs, rss);
-                               }
-                               isdn_tty_at_cout(rs, info);
-                               break;
-                       case '=':
+               case '?':
+                       p[0]++;
+                       strcpy(rs, "\r\n");
+                       for (i = 0; i < 8; i++) {
+                               sprintf(rss, "%c%s", rp[i] + 48,
+                                       (i < 7) ? "," : "");
+                               strcat(rs, rss);
+                       }
+                       isdn_tty_at_cout(rs, info);
+                       break;
+               case '=':
+                       p[0]++;
+                       if (*p[0] == '?') {
+                               isdn_tty_at_cout("\r\n(0,1),(0-5),(0-2),(0-2),(0-3),(0-2),(0),(0-7)", info);
                                p[0]++;
-                               if (*p[0] == '?') {
-                                       isdn_tty_at_cout("\r\n(0,1),(0-5),(0-2),(0-2),(0-3),(0-2),(0),(0-7)", info);
-                                       p[0]++;
-                               } else {
-                                       for (i = 0; (((*p[0] >= '0') && (*p[0] <= '9')) || (*p[0] == ',')) && (i < 8); i++) {
-                                               if (*p[0] != ',') {
-                                                       if ((*p[0] - 48) > maxdccval[i]) {
-                                                               PARSE_ERROR1;
-                                                       }
-                                                       rp[i] = *p[0] - 48;
-                                                       p[0]++;
-                                                       if (*p[0] == ',')
-                                                               p[0]++;
-                                               } else
+                       } else {
+                               for (i = 0; (((*p[0] >= '0') && (*p[0] <= '9')) || (*p[0] == ',')) && (i < 8); i++) {
+                                       if (*p[0] != ',') {
+                                               if ((*p[0] - 48) > maxdccval[i]) {
+                                                       PARSE_ERROR1;
+                                               }
+                                               rp[i] = *p[0] - 48;
+                                               p[0]++;
+                                               if (*p[0] == ',')
                                                        p[0]++;
-                                       }
+                                       } else
+                                               p[0]++;
+                               }
 #ifdef ISDN_TTY_FAX_STAT_DEBUG
-                                       printk(KERN_DEBUG "isdn_tty: Fax FDCC capabilities DCE=%d,%d,%d,%d,%d,%d,%d,%d\n",
-                                              rp[0], rp[1], rp[2], rp[3], rp[4], rp[5], rp[6], rp[7]);
+                               printk(KERN_DEBUG "isdn_tty: Fax FDCC capabilities DCE=%d,%d,%d,%d,%d,%d,%d,%d\n",
+                                      rp[0], rp[1], rp[2], rp[3], rp[4], rp[5], rp[6], rp[7]);
 #endif
-                               }
-                               break;
-                       default:
-                               PARSE_ERROR1;
+                       }
+                       break;
+               default:
+                       PARSE_ERROR1;
                }
                return 0;
        }
@@ -752,42 +752,42 @@ isdn_tty_cmd_FCLASS2(char **p, modem_info * info)
 
                p[0] += 3;
                switch (*p[0]) {
-                       case '?':
-                               p[0]++;
-                               strcpy(rs, "\r\n");
-                               for (i = 0; i < 8; i++) {
-                                       sprintf(rss, "%c%s", rp[i] + 48,
-                                               (i < 7) ? "," : "");
-                                       strcat(rs, rss);
-                               }
-                               isdn_tty_at_cout(rs, info);
-                               break;
-                       case '=':
+               case '?':
+                       p[0]++;
+                       strcpy(rs, "\r\n");
+                       for (i = 0; i < 8; i++) {
+                               sprintf(rss, "%c%s", rp[i] + 48,
+                                       (i < 7) ? "," : "");
+                               strcat(rs, rss);
+                       }
+                       isdn_tty_at_cout(rs, info);
+                       break;
+               case '=':
+                       p[0]++;
+                       if (*p[0] == '?') {
+                               isdn_tty_at_cout("\r\n(0,1),(0-5),(0-2),(0-2),(0-3),(0-2),(0),(0-7)", info);
                                p[0]++;
-                               if (*p[0] == '?') {
-                                       isdn_tty_at_cout("\r\n(0,1),(0-5),(0-2),(0-2),(0-3),(0-2),(0),(0-7)", info);
-                                       p[0]++;
-                               } else {
-                                       for (i = 0; (((*p[0] >= '0') && (*p[0] <= '9')) || (*p[0] == ',')) && (i < 8); i++) {
-                                               if (*p[0] != ',') {
-                                                       if ((*p[0] - 48) > maxdccval[i]) {
-                                                               PARSE_ERROR1;
-                                                       }
-                                                       rp[i] = *p[0] - 48;
-                                                       p[0]++;
-                                                       if (*p[0] == ',')
-                                                               p[0]++;
-                                               } else
+                       } else {
+                               for (i = 0; (((*p[0] >= '0') && (*p[0] <= '9')) || (*p[0] == ',')) && (i < 8); i++) {
+                                       if (*p[0] != ',') {
+                                               if ((*p[0] - 48) > maxdccval[i]) {
+                                                       PARSE_ERROR1;
+                                               }
+                                               rp[i] = *p[0] - 48;
+                                               p[0]++;
+                                               if (*p[0] == ',')
                                                        p[0]++;
-                                       }
+                                       } else
+                                               p[0]++;
+                               }
 #ifdef ISDN_TTY_FAX_STAT_DEBUG
-                                       printk(KERN_DEBUG "isdn_tty: Fax FDIS session parms=%d,%d,%d,%d,%d,%d,%d,%d\n",
-                                              rp[0], rp[1], rp[2], rp[3], rp[4], rp[5], rp[6], rp[7]);
+                               printk(KERN_DEBUG "isdn_tty: Fax FDIS session parms=%d,%d,%d,%d,%d,%d,%d,%d\n",
+                                      rp[0], rp[1], rp[2], rp[3], rp[4], rp[5], rp[6], rp[7]);
 #endif
-                               }
-                               break;
-                       default:
-                               PARSE_ERROR1;
+                       }
+                       break;
+               default:
+                       PARSE_ERROR1;
                }
                return 0;
        }
@@ -808,18 +808,18 @@ isdn_tty_cmd_FCLASS2(char **p, modem_info * info)
                                f->phase = ISDN_FAX_PHASE_C;
                        } else if (f->phase == ISDN_FAX_PHASE_D) {
                                switch (f->fet) {
-                                       case 0: /* next page will be received */
-                                               f->phase = ISDN_FAX_PHASE_C;
-                                               isdn_tty_fax_modem_result(7, info);     /* CONNECT */
-                                               break;
-                                       case 1: /* next doc will be received */
-                                               f->phase = ISDN_FAX_PHASE_B;
-                                               break;
-                                       case 2: /* fax session is terminating */
-                                               f->phase = ISDN_FAX_PHASE_E;
-                                               break;
-                                       default:
-                                               PARSE_ERROR1;
+                               case 0: /* next page will be received */
+                                       f->phase = ISDN_FAX_PHASE_C;
+                                       isdn_tty_fax_modem_result(7, info);     /* CONNECT */
+                                       break;
+                               case 1: /* next doc will be received */
+                                       f->phase = ISDN_FAX_PHASE_B;
+                                       break;
+                               case 2: /* fax session is terminating */
+                                       f->phase = ISDN_FAX_PHASE_E;
+                                       break;
+                               default:
+                                       PARSE_ERROR1;
                                }
                        }
                } else {
@@ -830,7 +830,7 @@ isdn_tty_cmd_FCLASS2(char **p, modem_info * info)
        /* DT=df,vr,wd,ln - TX phase C data command (release DCE to proceed with negotiation) */
        if (!strncmp(p[0], "DT", 2)) {
                int i, val[] =
-               {4, 0, 2, 3};
+                       {4, 0, 2, 3};
                char *rp = &f->resolution;
 
                p[0] += 2;
@@ -872,29 +872,29 @@ isdn_tty_cmd_FCLASS2(char **p, modem_info * info)
        if (!strncmp(p[0], "ECM", 3)) {
                p[0] += 3;
                switch (*p[0]) {
-                       case '?':
+               case '?':
+                       p[0]++;
+                       sprintf(rs, "\r\n%d", f->ecm);
+                       isdn_tty_at_cout(rs, info);
+                       break;
+               case '=':
+                       p[0]++;
+                       if (*p[0] == '?') {
                                p[0]++;
-                               sprintf(rs, "\r\n%d", f->ecm);
+                               sprintf(rs, "\r\n0,2");
                                isdn_tty_at_cout(rs, info);
-                               break;
-                       case '=':
-                               p[0]++;
-                               if (*p[0] == '?') {
-                                       p[0]++;
-                                       sprintf(rs, "\r\n0,2");
-                                       isdn_tty_at_cout(rs, info);
-                               } else {
-                                       par = isdn_getnum(p);
-                                       if ((par != 0) && (par != 2))
-                                               PARSE_ERROR1;
-                                       f->ecm = par;
+                       } else {
+                               par = isdn_getnum(p);
+                               if ((par != 0) && (par != 2))
+                                       PARSE_ERROR1;
+                               f->ecm = par;
 #ifdef ISDN_TTY_FAX_STAT_DEBUG
-                                       printk(KERN_DEBUG "isdn_tty: Fax FECM=%d\n", par);
+                               printk(KERN_DEBUG "isdn_tty: Fax FECM=%d\n", par);
 #endif
-                               }
-                               break;
-                       default:
-                               PARSE_ERROR1;
+                       }
+                       break;
+               default:
+                       PARSE_ERROR1;
                }
                return 0;
        }
@@ -938,36 +938,36 @@ isdn_tty_cmd_FCLASS2(char **p, modem_info * info)
                int i, r;
                p[0] += 3;
                switch (*p[0]) {
-                       case '?':
+               case '?':
+                       p[0]++;
+                       sprintf(rs, "\r\n\"%s\"", f->id);
+                       isdn_tty_at_cout(rs, info);
+                       break;
+               case '=':
+                       p[0]++;
+                       if (*p[0] == '?') {
                                p[0]++;
-                               sprintf(rs, "\r\n\"%s\"", f->id);
+                               sprintf(rs, "\r\n\"STRING\"");
                                isdn_tty_at_cout(rs, info);
-                               break;
-                       case '=':
-                               p[0]++;
-                               if (*p[0] == '?') {
+                       } else {
+                               if (*p[0] == '"')
                                        p[0]++;
-                                       sprintf(rs, "\r\n\"STRING\"");
-                                       isdn_tty_at_cout(rs, info);
-                               } else {
-                                       if (*p[0] == '"')
-                                               p[0]++;
-                                       for (i = 0; (*p[0]) && i < (FAXIDLEN - 1) && (*p[0] != '"'); i++) {
-                                               f->id[i] = *p[0]++;
-                                       }
-                                       if (*p[0] == '"')
-                                               p[0]++;
-                                       for (r = i; r < FAXIDLEN; r++) {
-                                               f->id[r] = 32;
-                                       }
-                                       f->id[FAXIDLEN - 1] = 0;
+                               for (i = 0; (*p[0]) && i < (FAXIDLEN - 1) && (*p[0] != '"'); i++) {
+                                       f->id[i] = *p[0]++;
+                               }
+                               if (*p[0] == '"')
+                                       p[0]++;
+                               for (r = i; r < FAXIDLEN; r++) {
+                                       f->id[r] = 32;
+                               }
+                               f->id[FAXIDLEN - 1] = 0;
 #ifdef ISDN_TTY_FAX_STAT_DEBUG
-                                       printk(KERN_DEBUG "isdn_tty: Fax local ID \"%s\"\n", f->id);
+                               printk(KERN_DEBUG "isdn_tty: Fax local ID \"%s\"\n", f->id);
 #endif
-                               }
-                               break;
-                       default:
-                               PARSE_ERROR1;
+                       }
+                       break;
+               default:
+                       PARSE_ERROR1;
                }
                return 0;
        }
@@ -994,29 +994,29 @@ isdn_tty_cmd_FCLASS2(char **p, modem_info * info)
        if (!strncmp(p[0], "MINSP", 5)) {
                p[0] += 5;
                switch (*p[0]) {
-                       case '?':
+               case '?':
+                       p[0]++;
+                       sprintf(rs, "\r\n%d", f->minsp);
+                       isdn_tty_at_cout(rs, info);
+                       break;
+               case '=':
+                       p[0]++;
+                       if (*p[0] == '?') {
                                p[0]++;
-                               sprintf(rs, "\r\n%d", f->minsp);
+                               sprintf(rs, "\r\n0-5");
                                isdn_tty_at_cout(rs, info);
-                               break;
-                       case '=':
-                               p[0]++;
-                               if (*p[0] == '?') {
-                                       p[0]++;
-                                       sprintf(rs, "\r\n0-5");
-                                       isdn_tty_at_cout(rs, info);
-                               } else {
-                                       par = isdn_getnum(p);
-                                       if ((par < 0) || (par > 5))
-                                               PARSE_ERROR1;
-                                       f->minsp = par;
+                       } else {
+                               par = isdn_getnum(p);
+                               if ((par < 0) || (par > 5))
+                                       PARSE_ERROR1;
+                               f->minsp = par;
 #ifdef ISDN_TTY_FAX_STAT_DEBUG
-                                       printk(KERN_DEBUG "isdn_tty: Fax FMINSP=%d\n", par);
+                               printk(KERN_DEBUG "isdn_tty: Fax FMINSP=%d\n", par);
 #endif
-                               }
-                               break;
-                       default:
-                               PARSE_ERROR1;
+                       }
+                       break;
+               default:
+                       PARSE_ERROR1;
                }
                return 0;
        }
@@ -1024,29 +1024,29 @@ isdn_tty_cmd_FCLASS2(char **p, modem_info * info)
        if (!strncmp(p[0], "PHCTO", 5)) {
                p[0] += 5;
                switch (*p[0]) {
-                       case '?':
+               case '?':
+                       p[0]++;
+                       sprintf(rs, "\r\n%d", f->phcto);
+                       isdn_tty_at_cout(rs, info);
+                       break;
+               case '=':
+                       p[0]++;
+                       if (*p[0] == '?') {
                                p[0]++;
-                               sprintf(rs, "\r\n%d", f->phcto);
+                               sprintf(rs, "\r\n0-255");
                                isdn_tty_at_cout(rs, info);
-                               break;
-                       case '=':
-                               p[0]++;
-                               if (*p[0] == '?') {
-                                       p[0]++;
-                                       sprintf(rs, "\r\n0-255");
-                                       isdn_tty_at_cout(rs, info);
-                               } else {
-                                       par = isdn_getnum(p);
-                                       if ((par < 0) || (par > 255))
-                                               PARSE_ERROR1;
-                                       f->phcto = par;
+                       } else {
+                               par = isdn_getnum(p);
+                               if ((par < 0) || (par > 255))
+                                       PARSE_ERROR1;
+                               f->phcto = par;
 #ifdef ISDN_TTY_FAX_STAT_DEBUG
-                                       printk(KERN_DEBUG "isdn_tty: Fax FPHCTO=%d\n", par);
+                               printk(KERN_DEBUG "isdn_tty: Fax FPHCTO=%d\n", par);
 #endif
-                               }
-                               break;
-                       default:
-                               PARSE_ERROR1;
+                       }
+                       break;
+               default:
+                       PARSE_ERROR1;
                }
                return 0;
        }
@@ -1055,29 +1055,29 @@ isdn_tty_cmd_FCLASS2(char **p, modem_info * info)
        if (!strncmp(p[0], "REL", 3)) {
                p[0] += 3;
                switch (*p[0]) {
-                       case '?':
+               case '?':
+                       p[0]++;
+                       sprintf(rs, "\r\n%d", f->rel);
+                       isdn_tty_at_cout(rs, info);
+                       break;
+               case '=':
+                       p[0]++;
+                       if (*p[0] == '?') {
                                p[0]++;
-                               sprintf(rs, "\r\n%d", f->rel);
+                               sprintf(rs, "\r\n0,1");
                                isdn_tty_at_cout(rs, info);
-                               break;
-                       case '=':
-                               p[0]++;
-                               if (*p[0] == '?') {
-                                       p[0]++;
-                                       sprintf(rs, "\r\n0,1");
-                                       isdn_tty_at_cout(rs, info);
-                               } else {
-                                       par = isdn_getnum(p);
-                                       if ((par < 0) || (par > 1))
-                                               PARSE_ERROR1;
-                                       f->rel = par;
+                       } else {
+                               par = isdn_getnum(p);
+                               if ((par < 0) || (par > 1))
+                                       PARSE_ERROR1;
+                               f->rel = par;
 #ifdef ISDN_TTY_FAX_STAT_DEBUG
-                                       printk(KERN_DEBUG "isdn_tty: Fax FREL=%d\n", par);
+                               printk(KERN_DEBUG "isdn_tty: Fax FREL=%d\n", par);
 #endif
-                               }
-                               break;
-                       default:
-                               PARSE_ERROR1;
+                       }
+                       break;
+               default:
+                       PARSE_ERROR1;
                }
                return 0;
        }
@@ -1100,11 +1100,11 @@ isdn_tty_cmd_FCLASS2(char **p, modem_info * info)
                printk(KERN_DEBUG "isdn_tty: Fax FTBC=%c\n", *p[0]);
 #endif
                switch (*p[0]) {
-                       case '0':
-                               p[0]++;
-                               break;
-                       default:
-                               PARSE_ERROR1;
+               case '0':
+                       p[0]++;
+                       break;
+               default:
+                       PARSE_ERROR1;
                }
                return 0;
        }
@@ -1113,7 +1113,7 @@ isdn_tty_cmd_FCLASS2(char **p, modem_info * info)
 }
 
 int
-isdn_tty_cmd_PLUSF_FAX(char **p, modem_info * info)
+isdn_tty_cmd_PLUSF_FAX(char **p, modem_info *info)
 {
        if (TTY_IS_FCLASS2(info))
                return (isdn_tty_cmd_FCLASS2(p, info));
index 757a890..ccda4fc 100644 (file)
@@ -15,4 +15,3 @@
 #define XON    0x11
 #define XOFF   0x13
 #define DC2    0x12
-
index c5d02b6..52827a8 100644 (file)
@@ -26,8 +26,8 @@ char *isdn_v110_revision = "$Revision: 1.1.2.2 $";
 #define V110_19200  15
 #define V110_9600    3
 
-/* 
- * The following data are precoded matrices, online and offline matrix 
+/*
+ * The following data are precoded matrices, online and offline matrix
  * for 9600, 19200 und 38400, respectively
  */
 static unsigned char V110_OnMatrix_9600[] =
@@ -56,7 +56,7 @@ static unsigned char V110_OnMatrix_38400[] =
 static unsigned char V110_OffMatrix_38400[] =
 {0x00, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff};
 
-/* 
+/*
  * FlipBits reorders sequences of keylen bits in one byte.
  * E.g. source order 7654321 will be converted to 45670123 when keylen = 4,
  * and to 67452301 when keylen = 2. This is necessary because ordering on
@@ -103,18 +103,18 @@ isdn_v110_open(unsigned char key, int hdrlen, int maxsize)
        v->decodelen = 0;
 
        switch (key) {
-               case V110_38400:
-                       v->OnlineFrame = V110_OnMatrix_38400;
-                       v->OfflineFrame = V110_OffMatrix_38400;
-                       break;
-               case V110_19200:
-                       v->OnlineFrame = V110_OnMatrix_19200;
-                       v->OfflineFrame = V110_OffMatrix_19200;
-                       break;
-               default:
-                       v->OnlineFrame = V110_OnMatrix_9600;
-                       v->OfflineFrame = V110_OffMatrix_9600;
-                       break;
+       case V110_38400:
+               v->OnlineFrame = V110_OnMatrix_38400;
+               v->OfflineFrame = V110_OffMatrix_38400;
+               break;
+       case V110_19200:
+               v->OnlineFrame = V110_OnMatrix_19200;
+               v->OfflineFrame = V110_OffMatrix_19200;
+               break;
+       default:
+               v->OnlineFrame = V110_OnMatrix_9600;
+               v->OfflineFrame = V110_OffMatrix_9600;
+               break;
        }
        v->framelen = v->nbytes * 10;
        v->SyncInit = 5;
@@ -132,7 +132,7 @@ isdn_v110_open(unsigned char key, int hdrlen, int maxsize)
 
 /* isdn_v110_close frees private V.110 data structures */
 void
-isdn_v110_close(isdn_v110_stream * v)
+isdn_v110_close(isdn_v110_stream *v)
 {
        if (v == NULL)
                return;
@@ -144,11 +144,11 @@ isdn_v110_close(isdn_v110_stream * v)
 }
 
 
-/* 
- * ValidHeaderBytes return the number of valid bytes in v->decodebuf 
+/*
+ * ValidHeaderBytes return the number of valid bytes in v->decodebuf
  */
 static int
-ValidHeaderBytes(isdn_v110_stream * v)
+ValidHeaderBytes(isdn_v110_stream *v)
 {
        int i;
        for (i = 0; (i < v->decodelen) && (i < v->nbytes); i++)
@@ -157,11 +157,11 @@ ValidHeaderBytes(isdn_v110_stream * v)
        return i;
 }
 
-/* 
- * SyncHeader moves the decodebuf ptr to the next valid header 
+/*
+ * SyncHeader moves the decodebuf ptr to the next valid header
  */
 static void
-SyncHeader(isdn_v110_stream * v)
+SyncHeader(isdn_v110_stream *v)
 {
        unsigned char *rbuf = v->decodebuf;
        int len = v->decodelen;
@@ -185,9 +185,9 @@ SyncHeader(isdn_v110_stream * v)
    only complete matices must be given.
    From these, netto data is extracted and returned in buf. The return-value
    is the bytecount of the decoded data.
- */
+*/
 static int
-DecodeMatrix(isdn_v110_stream * v, unsigned char *m, int len, unsigned char *buf)
+DecodeMatrix(isdn_v110_stream *v, unsigned char *m, int len, unsigned char *buf)
 {
        int line = 0;
        int buflen = 0;
@@ -203,7 +203,7 @@ DecodeMatrix(isdn_v110_stream * v, unsigned char *m, int len, unsigned char *buf
                                printk(KERN_DEBUG "isdn_v110: DecodeMatrix, V110 Bad Header\n");
                                /* returning now is not the right thing, though :-( */
 #endif
-                       } 
+                       }
                        line++; /* next line of matrix */
                        continue;
                } else if ((line % 10) == 5) {  /* in line 5 there's only e-bits ! */
@@ -217,7 +217,7 @@ DecodeMatrix(isdn_v110_stream * v, unsigned char *m, int len, unsigned char *buf
                        continue;
                } else if (!introducer) {       /* every byte starts with 10 (stopbit, startbit) */
                        introducer = (m[line] & mbit) ? 0 : 1;  /* current bit of the matrix */
-                     next_byte:
+               next_byte:
                        if (mbit > 2) { /* was it the last bit in this line ? */
                                mbit >>= 1;     /* no -> take next */
                                continue;
@@ -246,13 +246,13 @@ DecodeMatrix(isdn_v110_stream * v, unsigned char *m, int len, unsigned char *buf
        return buflen;          /* return number of bytes in the output buffer */
 }
 
-/* 
- * DecodeStream receives V.110 coded data from the input stream. It recovers the 
+/*
+ * DecodeStream receives V.110 coded data from the input stream. It recovers the
  * original frames.
  * The input stream doesn't need to be framed
  */
 struct sk_buff *
-isdn_v110_decode(isdn_v110_stream * v, struct sk_buff *skb)
+isdn_v110_decode(isdn_v110_stream *v, struct sk_buff *skb)
 {
        int i;
        int j;
@@ -283,7 +283,7 @@ isdn_v110_decode(isdn_v110_stream * v, struct sk_buff *skb)
        /* copy new data to decode-buffer */
        memcpy(&(v->decodebuf[v->decodelen]), rbuf, len);
        v->decodelen += len;
-      ReSync:
+ReSync:
        if (v->decodelen < v->nbytes) { /* got a new header ? */
                dev_kfree_skb(skb);
                return NULL;    /* no, try later      */
@@ -320,7 +320,7 @@ isdn_v110_decode(isdn_v110_stream * v, struct sk_buff *skb)
 /* EncodeMatrix takes input data in buf, len is the bytecount.
    Data is encoded into v110 frames in m. Return value is the number of
    matrix-lines generated.
- */
+*/
 static int
 EncodeMatrix(unsigned char *buf, int len, unsigned char *m, int mlen)
 {
@@ -333,14 +333,14 @@ EncodeMatrix(unsigned char *buf, int len, unsigned char *m, int mlen)
 
        while ((i < len) && (line < mlen)) {    /* while we still have input data */
                switch (line % 10) {    /* in which line of the matrix are we? */
-                       case 0:
-                               m[line++] = 0x00;       /* line 0 is always 0 */
-                               mbit = 128;     /* go on with the 7th bit */
-                               break;
-                       case 5:
-                               m[line++] = 0xbf;       /* line 5 is always 10111111 */
-                               mbit = 128;     /* go on with the 7th bit */
-                               break;
+               case 0:
+                       m[line++] = 0x00;       /* line 0 is always 0 */
+                       mbit = 128;     /* go on with the 7th bit */
+                       break;
+               case 5:
+                       m[line++] = 0xbf;       /* line 5 is always 10111111 */
+                       mbit = 128;     /* go on with the 7th bit */
+                       break;
                }
                if (line >= mlen) {
                        printk(KERN_WARNING "isdn_v110 (EncodeMatrix): buffer full!\n");
@@ -348,16 +348,16 @@ EncodeMatrix(unsigned char *buf, int len, unsigned char *m, int mlen)
                }
        next_bit:
                switch (mbit) { /* leftmost or rightmost bit ? */
-                       case 1:
-                               line++; /* rightmost -> go to next line */
-                               if (line >= mlen) {
-                                       printk(KERN_WARNING "isdn_v110 (EncodeMatrix): buffer full!\n");
-                                       return line;
-                               }
-                       case 128:
-                               m[line] = 128;  /* leftmost -> set byte to 1000000 */
-                               mbit = 64;      /* current bit in the matrix line */
-                               continue;
+               case 1:
+                       line++; /* rightmost -> go to next line */
+                       if (line >= mlen) {
+                               printk(KERN_WARNING "isdn_v110 (EncodeMatrix): buffer full!\n");
+                               return line;
+                       }
+               case 128:
+                       m[line] = 128;  /* leftmost -> set byte to 1000000 */
+                       mbit = 64;      /* current bit in the matrix line */
+                       continue;
                }
                if (introducer) {       /* set 110 sequence ? */
                        introducer--;   /* set on digit less */
@@ -384,24 +384,24 @@ EncodeMatrix(unsigned char *buf, int len, unsigned char *m, int mlen)
        /* if necessary, generate remaining lines of the matrix... */
        if ((line) && ((line + 10) < mlen))
                switch (++line % 10) {
-                       case 1:
-                               m[line++] = 0xfe;
-                       case 2:
-                               m[line++] = 0xfe;
-                       case 3:
-                               m[line++] = 0xfe;
-                       case 4:
-                               m[line++] = 0xfe;
-                       case 5:
-                               m[line++] = 0xbf;
-                       case 6:
-                               m[line++] = 0xfe;
-                       case 7:
-                               m[line++] = 0xfe;
-                       case 8:
-                               m[line++] = 0xfe;
-                       case 9:
-                               m[line++] = 0xfe;
+               case 1:
+                       m[line++] = 0xfe;
+               case 2:
+                       m[line++] = 0xfe;
+               case 3:
+                       m[line++] = 0xfe;
+               case 4:
+                       m[line++] = 0xfe;
+               case 5:
+                       m[line++] = 0xbf;
+               case 6:
+                       m[line++] = 0xfe;
+               case 7:
+                       m[line++] = 0xfe;
+               case 8:
+                       m[line++] = 0xfe;
+               case 9:
+                       m[line++] = 0xfe;
                }
        return line;            /* that's how many lines we have */
 }
@@ -447,7 +447,7 @@ isdn_v110_idle(isdn_v110_stream *v)
 }
 
 struct sk_buff *
-isdn_v110_encode(isdn_v110_stream * v, struct sk_buff *skb)
+isdn_v110_encode(isdn_v110_stream *v, struct sk_buff *skb)
 {
        int i;
        int j;
@@ -524,93 +524,93 @@ isdn_v110_stat_callback(int idx, isdn_ctrl *c)
        if (idx < 0)
                return 0;
        switch (c->command) {
-               case ISDN_STAT_BSENT:
-                        /* Keep the send-queue of the driver filled
-                        * with frames:
-                        * If number of outstanding frames < 3,
-                        * send down an Idle-Frame (or an Sync-Frame, if
-                        * v->SyncInit != 0). 
-                        */
-                       if (!(v = dev->v110[idx]))
-                               return 0;
-                       atomic_inc(&dev->v110use[idx]);
-                       for (i=0; i * v->framelen < c->parm.length; i++) {
-                               if (v->skbidle > 0) {
-                                       v->skbidle--;
-                                       ret = 1;
+       case ISDN_STAT_BSENT:
+               /* Keep the send-queue of the driver filled
+                * with frames:
+                * If number of outstanding frames < 3,
+                * send down an Idle-Frame (or an Sync-Frame, if
+                * v->SyncInit != 0).
+                */
+               if (!(v = dev->v110[idx]))
+                       return 0;
+               atomic_inc(&dev->v110use[idx]);
+               for (i = 0; i * v->framelen < c->parm.length; i++) {
+                       if (v->skbidle > 0) {
+                               v->skbidle--;
+                               ret = 1;
+                       } else {
+                               if (v->skbuser > 0)
+                                       v->skbuser--;
+                               ret = 0;
+                       }
+               }
+               for (i = v->skbuser + v->skbidle; i < 2; i++) {
+                       struct sk_buff *skb;
+                       if (v->SyncInit > 0)
+                               skb = isdn_v110_sync(v);
+                       else
+                               skb = isdn_v110_idle(v);
+                       if (skb) {
+                               if (dev->drv[c->driver]->interface->writebuf_skb(c->driver, c->arg, 1, skb) <= 0) {
+                                       dev_kfree_skb(skb);
+                                       break;
                                } else {
-                                       if (v->skbuser > 0)
-                                               v->skbuser--;
-                                       ret = 0;
+                                       if (v->SyncInit)
+                                               v->SyncInit--;
+                                       v->skbidle++;
                                }
+                       } else
+                               break;
+               }
+               atomic_dec(&dev->v110use[idx]);
+               return ret;
+       case ISDN_STAT_DHUP:
+       case ISDN_STAT_BHUP:
+               while (1) {
+                       atomic_inc(&dev->v110use[idx]);
+                       if (atomic_dec_and_test(&dev->v110use[idx])) {
+                               isdn_v110_close(dev->v110[idx]);
+                               dev->v110[idx] = NULL;
+                               break;
+                       }
+                       mdelay(1);
+               }
+               break;
+       case ISDN_STAT_BCONN:
+               if (dev->v110emu[idx] && (dev->v110[idx] == NULL)) {
+                       int hdrlen = dev->drv[c->driver]->interface->hl_hdrlen;
+                       int maxsize = dev->drv[c->driver]->interface->maxbufsize;
+                       atomic_inc(&dev->v110use[idx]);
+                       switch (dev->v110emu[idx]) {
+                       case ISDN_PROTO_L2_V11096:
+                               dev->v110[idx] = isdn_v110_open(V110_9600, hdrlen, maxsize);
+                               break;
+                       case ISDN_PROTO_L2_V11019:
+                               dev->v110[idx] = isdn_v110_open(V110_19200, hdrlen, maxsize);
+                               break;
+                       case ISDN_PROTO_L2_V11038:
+                               dev->v110[idx] = isdn_v110_open(V110_38400, hdrlen, maxsize);
+                               break;
+                       default:;
                        }
-                       for (i = v->skbuser + v->skbidle; i < 2; i++) {
-                               struct sk_buff *skb;
-                               if (v->SyncInit > 0)
-                                       skb = isdn_v110_sync(v);
-                               else
-                                       skb = isdn_v110_idle(v);
-                               if (skb) {
+                       if ((v = dev->v110[idx])) {
+                               while (v->SyncInit) {
+                                       struct sk_buff *skb = isdn_v110_sync(v);
                                        if (dev->drv[c->driver]->interface->writebuf_skb(c->driver, c->arg, 1, skb) <= 0) {
                                                dev_kfree_skb(skb);
+                                               /* Unable to send, try later */
                                                break;
-                                       } else {
-                                               if (v->SyncInit)
-                                                       v->SyncInit--;
-                                               v->skbidle++;
                                        }
-                               } else
-                                       break;
-                       }
-                       atomic_dec(&dev->v110use[idx]);
-                       return ret;
-               case ISDN_STAT_DHUP:
-               case ISDN_STAT_BHUP:
-                       while (1) {
-                               atomic_inc(&dev->v110use[idx]);
-                               if (atomic_dec_and_test(&dev->v110use[idx])) {
-                                       isdn_v110_close(dev->v110[idx]);
-                                       dev->v110[idx] = NULL;
-                                       break;
+                                       v->SyncInit--;
+                                       v->skbidle++;
                                }
-                               mdelay(1);
-                       }
-                       break;
-               case ISDN_STAT_BCONN:
-                       if (dev->v110emu[idx] && (dev->v110[idx] == NULL)) {
-                               int hdrlen = dev->drv[c->driver]->interface->hl_hdrlen;
-                               int maxsize = dev->drv[c->driver]->interface->maxbufsize;
-                               atomic_inc(&dev->v110use[idx]);
-                               switch (dev->v110emu[idx]) {
-                                       case ISDN_PROTO_L2_V11096:
-                                               dev->v110[idx] = isdn_v110_open(V110_9600, hdrlen, maxsize);
-                                               break;
-                                       case ISDN_PROTO_L2_V11019:
-                                               dev->v110[idx] = isdn_v110_open(V110_19200, hdrlen, maxsize);
-                                               break;
-                                       case ISDN_PROTO_L2_V11038:
-                                               dev->v110[idx] = isdn_v110_open(V110_38400, hdrlen, maxsize);
-                                               break;
-                                       default:;
-                               }
-                               if ((v = dev->v110[idx])) {
-                                       while (v->SyncInit) {
-                                               struct sk_buff *skb = isdn_v110_sync(v);
-                                               if (dev->drv[c->driver]->interface->writebuf_skb(c->driver, c->arg, 1, skb) <= 0) {
-                                                       dev_kfree_skb(skb);
-                                                       /* Unable to send, try later */
-                                                       break;
-                                               }
-                                               v->SyncInit--;
-                                               v->skbidle++;
-                                       }
-                               } else
-                                       printk(KERN_WARNING "isdn_v110: Couldn't open stream for chan %d\n", idx);
-                               atomic_dec(&dev->v110use[idx]);
-                       }
-                       break;
-               default:
-                       return 0;
+                       } else
+                               printk(KERN_WARNING "isdn_v110: Couldn't open stream for chan %d\n", idx);
+                       atomic_dec(&dev->v110use[idx]);
+               }
+               break;
+       default:
+               return 0;
        }
        return 0;
 }
index 08f274b..de774ab 100644 (file)
 #ifndef _isdn_v110_h_
 #define _isdn_v110_h_
 
-/* 
- * isdn_v110_encode will take raw data and encode it using V.110 
+/*
+ * isdn_v110_encode will take raw data and encode it using V.110
  */
 extern struct sk_buff *isdn_v110_encode(isdn_v110_stream *, struct sk_buff *);
 
-/* 
+/*
  * isdn_v110_decode receives V.110 coded data from the stream and rebuilds
  * frames from them. The source stream doesn't need to be framed.
  */
 extern struct sk_buff *isdn_v110_decode(isdn_v110_stream *, struct sk_buff *);
 
 extern int isdn_v110_stat_callback(int, isdn_ctrl *);
-extern void isdn_v110_close(isdn_v110_stream * v);
+extern void isdn_v110_close(isdn_v110_stream *v);
 
 #endif
index fd10d7c..e2d4e58 100644 (file)
@@ -26,7 +26,7 @@
 #include "isdn_x25iface.h"
 
 /* for debugging messages not to cause an oops when device pointer is NULL*/
-#define MY_DEVNAME(dev)  ( (dev) ? (dev)->name : "DEVICE UNSPECIFIED" )
+#define MY_DEVNAME(dev)  ((dev) ? (dev)->name : "DEVICE UNSPECIFIED")
 
 
 typedef struct isdn_x25iface_proto_data {
@@ -34,22 +34,22 @@ typedef struct isdn_x25iface_proto_data {
        enum wan_states state;
        /* Private stuff, not to be accessed via proto_data. We provide the
           other storage for the concap_proto instance here as well,
-          enabling us to allocate both with just one kmalloc(): */ 
+          enabling us to allocate both with just one kmalloc(): */
        struct concap_proto priv;
 } ix25_pdata_t;
 
 
 
 /* is now in header file (extern): struct concap_proto * isdn_x25iface_proto_new(void); */
-static void isdn_x25iface_proto_del( struct concap_proto * );
-static int isdn_x25iface_proto_close( struct concap_proto * );
-static int isdn_x25iface_proto_restart( struct concap_proto *,
-                                       struct net_device *,
-                                       struct concap_device_ops *);
-static int isdn_x25iface_xmit( struct concap_proto *, struct sk_buff * );
-static int isdn_x25iface_receive( struct concap_proto *, struct sk_buff * );
-static int isdn_x25iface_connect_ind( struct concap_proto * );
-static int isdn_x25iface_disconn_ind( struct concap_proto * );
+static void isdn_x25iface_proto_del(struct concap_proto *);
+static int isdn_x25iface_proto_close(struct concap_proto *);
+static int isdn_x25iface_proto_restart(struct concap_proto *,
+                                      struct net_device *,
+                                      struct concap_device_ops *);
+static int isdn_x25iface_xmit(struct concap_proto *, struct sk_buff *);
+static int isdn_x25iface_receive(struct concap_proto *, struct sk_buff *);
+static int isdn_x25iface_connect_ind(struct concap_proto *);
+static int isdn_x25iface_disconn_ind(struct concap_proto *);
 
 
 static struct concap_proto_ops ix25_pops = {
@@ -64,65 +64,65 @@ static struct concap_proto_ops ix25_pops = {
 };
 
 /* error message helper function */
-static void illegal_state_warn( unsigned state, unsigned char firstbyte) 
+static void illegal_state_warn(unsigned state, unsigned char firstbyte)
 {
-       printk( KERN_WARNING "isdn_x25iface: firstbyte %x illegal in"
-               "current state %d\n",firstbyte, state );
+       printk(KERN_WARNING "isdn_x25iface: firstbyte %x illegal in"
+              "current state %d\n", firstbyte, state);
 }
 
 /* check protocol data field for consistency */
-static int pdata_is_bad( ix25_pdata_t * pda ){
+static int pdata_is_bad(ix25_pdata_t *pda) {
 
-       if( pda  &&  pda -> magic == ISDN_X25IFACE_MAGIC ) return 0;
-       printk( KERN_WARNING
-               "isdn_x25iface_xxx: illegal pointer to proto data\n" );
+       if (pda  &&  pda->magic == ISDN_X25IFACE_MAGIC) return 0;
+       printk(KERN_WARNING
+              "isdn_x25iface_xxx: illegal pointer to proto data\n");
        return 1;
 }
 
 /* create a new x25 interface protocol instance
  */
-struct concap_proto * isdn_x25iface_proto_new(void)
+struct concap_proto *isdn_x25iface_proto_new(void)
 {
-       ix25_pdata_t * tmp = kmalloc(sizeof(ix25_pdata_t),GFP_KERNEL);
+       ix25_pdata_t *tmp = kmalloc(sizeof(ix25_pdata_t), GFP_KERNEL);
        IX25DEBUG("isdn_x25iface_proto_new\n");
-       if( tmp ){
-               tmp -> magic = ISDN_X25IFACE_MAGIC;
-               tmp -> state = WAN_UNCONFIGURED;
+       if (tmp) {
+               tmp->magic = ISDN_X25IFACE_MAGIC;
+               tmp->state = WAN_UNCONFIGURED;
                /* private data space used to hold the concap_proto data.
                   Only to be accessed via the returned pointer */
                spin_lock_init(&tmp->priv.lock);
-               tmp -> priv.dops       = NULL;
-               tmp -> priv.net_dev    = NULL;
-               tmp -> priv.pops       = &ix25_pops;
-               tmp -> priv.flags      = 0;
-               tmp -> priv.proto_data = tmp;
-               return( &(tmp -> priv) );
+               tmp->priv.dops       = NULL;
+               tmp->priv.net_dev    = NULL;
+               tmp->priv.pops       = &ix25_pops;
+               tmp->priv.flags      = 0;
+               tmp->priv.proto_data = tmp;
+               return (&(tmp->priv));
        }
        return NULL;
 };
 
-/* close the x25iface encapsulation protocol 
+/* close the x25iface encapsulation protocol
  */
-static int isdn_x25iface_proto_close(struct concap_proto *cprot){
+static int isdn_x25iface_proto_close(struct concap_proto *cprot) {
 
        ix25_pdata_t *tmp;
-        int ret = 0;
+       int ret = 0;
        ulong flags;
 
-       if( ! cprot ){
-               printk( KERN_ERR "isdn_x25iface_proto_close: "
-                       "invalid concap_proto pointer\n" );
+       if (!cprot) {
+               printk(KERN_ERR "isdn_x25iface_proto_close: "
+                      "invalid concap_proto pointer\n");
                return -1;
        }
-       IX25DEBUG( "isdn_x25iface_proto_close %s \n", MY_DEVNAME(cprot -> net_dev) );
+       IX25DEBUG("isdn_x25iface_proto_close %s \n", MY_DEVNAME(cprot->net_dev));
        spin_lock_irqsave(&cprot->lock, flags);
-       cprot -> dops    = NULL;
-       cprot -> net_dev = NULL;
-       tmp = cprot -> proto_data;
-       if( pdata_is_bad( tmp ) ){
+       cprot->dops    = NULL;
+       cprot->net_dev = NULL;
+       tmp = cprot->proto_data;
+       if (pdata_is_bad(tmp)) {
                ret = -1;
        } else {
-               tmp -> state = WAN_UNCONFIGURED;
+               tmp->state = WAN_UNCONFIGURED;
        }
        spin_unlock_irqrestore(&cprot->lock, flags);
        return ret;
@@ -130,100 +130,100 @@ static int isdn_x25iface_proto_close(struct concap_proto *cprot){
 
 /* Delete the x25iface encapsulation protocol instance
  */
-static void isdn_x25iface_proto_del(struct concap_proto *cprot){
+static void isdn_x25iface_proto_del(struct concap_proto *cprot) {
+
+       ix25_pdata_t *tmp;
 
-       ix25_pdata_t * tmp;
-       IX25DEBUG( "isdn_x25iface_proto_del \n" );
-       if( ! cprot ){
-               printk( KERN_ERR "isdn_x25iface_proto_del: "
-                       "concap_proto pointer is NULL\n" );
+       IX25DEBUG("isdn_x25iface_proto_del \n");
+       if (!cprot) {
+               printk(KERN_ERR "isdn_x25iface_proto_del: "
+                      "concap_proto pointer is NULL\n");
                return;
        }
-       tmp = cprot -> proto_data;
-       if( tmp == NULL ){ 
-               printk( KERN_ERR "isdn_x25iface_proto_del: inconsistent "
-                       "proto_data pointer (maybe already deleted?)\n"); 
+       tmp = cprot->proto_data;
+       if (tmp == NULL) {
+               printk(KERN_ERR "isdn_x25iface_proto_del: inconsistent "
+                      "proto_data pointer (maybe already deleted?)\n");
                return;
        }
        /* close if the protocol is still open */
-       if( cprot -> dops ) isdn_x25iface_proto_close(cprot);
+       if (cprot->dops) isdn_x25iface_proto_close(cprot);
        /* freeing the storage should be sufficient now. But some additional
           settings might help to catch wild pointer bugs */
-       tmp -> magic = 0;
-       cprot -> proto_data = NULL;
+       tmp->magic = 0;
+       cprot->proto_data = NULL;
 
-       kfree( tmp );
+       kfree(tmp);
        return;
 }
 
 /* (re-)initialize the data structures for x25iface encapsulation
  */
 static int isdn_x25iface_proto_restart(struct concap_proto *cprot,
-                                       struct net_device *ndev,
-                                       struct concap_device_ops *dops)
+                                      struct net_device *ndev,
+                                      struct concap_device_ops *dops)
 {
-       ix25_pdata_t * pda = cprot -> proto_data ;
+       ix25_pdata_t *pda = cprot->proto_data;
        ulong flags;
 
-       IX25DEBUG( "isdn_x25iface_proto_restart %s \n", MY_DEVNAME(ndev) );
+       IX25DEBUG("isdn_x25iface_proto_restart %s \n", MY_DEVNAME(ndev));
 
-       if ( pdata_is_bad( pda ) ) return -1;
+       if (pdata_is_bad(pda)) return -1;
 
-       if( !( dops  && dops -> data_req && dops -> connect_req 
-              && dops -> disconn_req )  ){
-               printk( KERN_WARNING "isdn_x25iface_restart: required dops"
-                       " missing\n" );
+       if (!(dops && dops->data_req && dops->connect_req
+             && dops->disconn_req)) {
+               printk(KERN_WARNING "isdn_x25iface_restart: required dops"
+                      " missing\n");
                isdn_x25iface_proto_close(cprot);
                return -1;
        }
        spin_lock_irqsave(&cprot->lock, flags);
-       cprot -> net_dev = ndev;
-       cprot -> pops = &ix25_pops;
-       cprot -> dops = dops;
-       pda -> state = WAN_DISCONNECTED;
+       cprot->net_dev = ndev;
+       cprot->pops = &ix25_pops;
+       cprot->dops = dops;
+       pda->state = WAN_DISCONNECTED;
        spin_unlock_irqrestore(&cprot->lock, flags);
        return 0;
 }
 
-/* deliver a dl_data frame received from i4l HL driver to the network layer 
+/* deliver a dl_data frame received from i4l HL driver to the network layer
  */
 static int isdn_x25iface_receive(struct concap_proto *cprot, struct sk_buff *skb)
 {
-       IX25DEBUG( "isdn_x25iface_receive %s \n", MY_DEVNAME(cprot->net_dev) );
-       if ( ( (ix25_pdata_t*) (cprot->proto_data) ) 
-            -> state == WAN_CONNECTED ){
-               if( skb_push(skb, 1)){
+       IX25DEBUG("isdn_x25iface_receive %s \n", MY_DEVNAME(cprot->net_dev));
+       if (((ix25_pdata_t *)(cprot->proto_data))
+           ->state == WAN_CONNECTED) {
+               if (skb_push(skb, 1)) {
                        skb->data[0] = X25_IFACE_DATA;
                        skb->protocol = x25_type_trans(skb, cprot->net_dev);
                        netif_rx(skb);
                        return 0;
                }
        }
-       printk(KERN_WARNING "isdn_x25iface_receive %s: not connected, skb dropped\n", MY_DEVNAME(cprot->net_dev) );
+       printk(KERN_WARNING "isdn_x25iface_receive %s: not connected, skb dropped\n", MY_DEVNAME(cprot->net_dev));
        dev_kfree_skb(skb);
        return -1;
 }
 
-/* a connection set up is indicated by lower layer 
+/* a connection set up is indicated by lower layer
  */
 static int isdn_x25iface_connect_ind(struct concap_proto *cprot)
 {
-       struct sk_buff * skb;
-       enum wan_states *state_p 
-         = &( ( (ix25_pdata_t*) (cprot->proto_data) ) -> state);
-       IX25DEBUG( "isdn_x25iface_connect_ind %s \n"
-                  , MY_DEVNAME(cprot->net_dev) );
-       if( *state_p == WAN_UNCONFIGURED ){ 
-               printk(KERN_WARNING 
+       struct sk_buff *skb;
+       enum wan_states *state_p
+               = &(((ix25_pdata_t *)(cprot->proto_data))->state);
+       IX25DEBUG("isdn_x25iface_connect_ind %s \n"
+                 , MY_DEVNAME(cprot->net_dev));
+       if (*state_p == WAN_UNCONFIGURED) {
+               printk(KERN_WARNING
                       "isdn_x25iface_connect_ind while unconfigured %s\n"
-                      , MY_DEVNAME(cprot->net_dev) );
+                      , MY_DEVNAME(cprot->net_dev));
                return -1;
        }
        *state_p = WAN_CONNECTED;
 
        skb = dev_alloc_skb(1);
-       if( skb ){
+       if (skb) {
                *(skb_put(skb, 1)) = X25_IFACE_CONNECT;
                skb->protocol = x25_type_trans(skb, cprot->net_dev);
                netif_rx(skb);
@@ -231,28 +231,28 @@ static int isdn_x25iface_connect_ind(struct concap_proto *cprot)
        } else {
                printk(KERN_WARNING "isdn_x25iface_connect_ind: "
                       " out of memory -- disconnecting\n");
-               cprot -> dops -> disconn_req(cprot);
+               cprot->dops->disconn_req(cprot);
                return -1;
        }
 }
-       
-/* a disconnect is indicated by lower layer 
+
+/* a disconnect is indicated by lower layer
  */
 static int isdn_x25iface_disconn_ind(struct concap_proto *cprot)
 {
        struct sk_buff *skb;
-       enum wan_states *state_p 
-         = &( ( (ix25_pdata_t*) (cprot->proto_data) ) -> state);
-       IX25DEBUG( "isdn_x25iface_disconn_ind %s \n", MY_DEVNAME(cprot -> net_dev) );
-       if( *state_p == WAN_UNCONFIGURED ){ 
-               printk(KERN_WARNING 
+       enum wan_states *state_p
+               = &(((ix25_pdata_t *)(cprot->proto_data))->state);
+       IX25DEBUG("isdn_x25iface_disconn_ind %s \n", MY_DEVNAME(cprot->net_dev));
+       if (*state_p == WAN_UNCONFIGURED) {
+               printk(KERN_WARNING
                       "isdn_x25iface_disconn_ind while unconfigured\n");
                return -1;
        }
-       if(! cprot -> net_dev) return -1;
+       if (!cprot->net_dev) return -1;
        *state_p = WAN_DISCONNECTED;
        skb = dev_alloc_skb(1);
-       if( skb ){
+       if (skb) {
                *(skb_put(skb, 1)) = X25_IFACE_DISCONNECT;
                skb->protocol = x25_type_trans(skb, cprot->net_dev);
                netif_rx(skb);
@@ -266,57 +266,57 @@ static int isdn_x25iface_disconn_ind(struct concap_proto *cprot)
 
 /* process a frame handed over to us from linux network layer. First byte
    semantics as defined in Documentation/networking/x25-iface.txt
-   */
+*/
 static int isdn_x25iface_xmit(struct concap_proto *cprot, struct sk_buff *skb)
 {
        unsigned char firstbyte = skb->data[0];
-       enum wan_states *state = &((ix25_pdata_t*)cprot->proto_data)->state;
+       enum wan_states *state = &((ix25_pdata_t *)cprot->proto_data)->state;
        int ret = 0;
        IX25DEBUG("isdn_x25iface_xmit: %s first=%x state=%d\n",
-               MY_DEVNAME(cprot->net_dev), firstbyte, *state);
-       switch ( firstbyte ){
+                 MY_DEVNAME(cprot->net_dev), firstbyte, *state);
+       switch (firstbyte) {
        case X25_IFACE_DATA:
-               if( *state == WAN_CONNECTED ){
+               if (*state == WAN_CONNECTED) {
                        skb_pull(skb, 1);
-                       cprot -> net_dev -> trans_start = jiffies;
-                       ret = ( cprot -> dops -> data_req(cprot, skb) );
+                       cprot->net_dev->trans_start = jiffies;
+                       ret = (cprot->dops->data_req(cprot, skb));
                        /* prepare for future retransmissions */
-                       if( ret ) skb_push(skb,1);
+                       if (ret) skb_push(skb, 1);
                        return ret;
                }
-               illegal_state_warn( *state, firstbyte ); 
+               illegal_state_warn(*state, firstbyte);
                break;
        case X25_IFACE_CONNECT:
-               if( *state == WAN_DISCONNECTED ){
+               if (*state == WAN_DISCONNECTED) {
                        *state = WAN_CONNECTING;
-                       ret = cprot -> dops -> connect_req(cprot);
-                       if(ret){
+                       ret = cprot->dops->connect_req(cprot);
+                       if (ret) {
                                /* reset state and notify upper layer about
                                 * immidiatly failed attempts */
                                isdn_x25iface_disconn_ind(cprot);
                        }
                } else {
-                       illegal_state_warn( *state, firstbyte );
+                       illegal_state_warn(*state, firstbyte);
                }
                break;
        case X25_IFACE_DISCONNECT:
-               switch ( *state ){
-               case WAN_DISCONNECTED: 
+               switch (*state) {
+               case WAN_DISCONNECTED:
                        /* Should not happen. However, give upper layer a
                           chance to recover from inconstistency  but don't
                           trust the lower layer sending the disconn_confirm
                           when already disconnected */
                        printk(KERN_WARNING "isdn_x25iface_xmit: disconnect "
-                              " requested while disconnected\n" );
+                              " requested while disconnected\n");
                        isdn_x25iface_disconn_ind(cprot);
                        break; /* prevent infinite loops */
                case WAN_CONNECTING:
                case WAN_CONNECTED:
                        *state = WAN_DISCONNECTED;
-                       cprot -> dops -> disconn_req(cprot);
+                       cprot->dops->disconn_req(cprot);
                        break;
                default:
-                       illegal_state_warn( *state, firstbyte );
+                       illegal_state_warn(*state, firstbyte);
                }
                break;
        case X25_IFACE_PARAMS:
index 41a3d49..0b26e3b 100644 (file)
@@ -13,9 +13,9 @@
 #define ISDN_X25IFACE_MAGIC 0x1e75a2b9
 /* #define DEBUG_ISDN_X25 if you want isdn_x25 debugging messages */
 #ifdef DEBUG_ISDN_X25
-#   define IX25DEBUG(fmt,args...) printk(KERN_DEBUG fmt , ## args)
+#   define IX25DEBUG(fmt, args...) printk(KERN_DEBUG fmt, ##args)
 #else
-#   define IX25DEBUG(fmt,args...)
+#   define IX25DEBUG(fmt, args...)
 #endif
 
 #include <linux/skbuff.h>
 #include <linux/isdn.h>
 #include <linux/concap.h>
 
-extern struct concap_proto_ops * isdn_x25iface_concap_proto_ops_pt;
-extern struct concap_proto     * isdn_x25iface_proto_new(void);
+extern struct concap_proto_ops *isdn_x25iface_concap_proto_ops_pt;
+extern struct concap_proto *isdn_x25iface_proto_new(void);
 
 
 
 #endif
-
-
-
-
-
-
-
-
index c989aa3..027d1c5 100644 (file)
@@ -88,7 +88,7 @@ check_frame(struct isdnhdlc_vars *hdlc)
 {
        int status;
 
-       if (hdlc->dstpos < 2)   /* too small - framing error */
+       if (hdlc->dstpos < 2)   /* too small - framing error */
                status = -HDLC_FRAMING_ERROR;
        else if (hdlc->crc != 0xf0b8)   /* crc error */
                status = -HDLC_CRC_ERROR;
@@ -127,9 +127,9 @@ check_frame(struct isdnhdlc_vars *hdlc)
   dsize - destination buffer size
   returns - number of decoded bytes in the destination buffer and status
   flag.
- */
+*/
 int isdnhdlc_decode(struct isdnhdlc_vars *hdlc, const u8 *src, int slen,
-       int *count, u8 *dst, int dsize)
+                   int *count, u8 *dst, int dsize)
 {
        int status = 0;
 
@@ -145,28 +145,28 @@ int isdnhdlc_decode(struct isdnhdlc_vars *hdlc, const u8 *src, int slen,
                0x00, 0x00, 0x80, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc, 0xfe, 0xff
        };
 
-#define handle_fast_flag(h) \
-       do {\
-               if (h->cbin == fast_flag[h->bit_shift]) {\
-                       h->ffvalue = fast_flag_value[h->bit_shift];\
-                       h->state = HDLC_FAST_FLAG;\
-                       h->ffbit_shift = h->bit_shift;\
-                       h->bit_shift = 1;\
-               } else {\
-                       h->state = HDLC_GET_DATA;\
-                       h->data_received = 0;\
-               } \
+#define handle_fast_flag(h)                                            \
+       do {                                                            \
+               if (h->cbin == fast_flag[h->bit_shift]) {               \
+                       h->ffvalue = fast_flag_value[h->bit_shift];     \
+                       h->state = HDLC_FAST_FLAG;                      \
+                       h->ffbit_shift = h->bit_shift;                  \
+                       h->bit_shift = 1;                               \
+               } else {                                                \
+                       h->state = HDLC_GET_DATA;                       \
+                       h->data_received = 0;                           \
+               }                                                       \
        } while (0)
 
-#define handle_abort(h) \
-       do {\
-               h->shift_reg = fast_abort[h->ffbit_shift - 1];\
-               h->hdlc_bits1 = h->ffbit_shift - 2;\
-               if (h->hdlc_bits1 < 0)\
-                       h->hdlc_bits1 = 0;\
-               h->data_bits = h->ffbit_shift - 1;\
-               h->state = HDLC_GET_DATA;\
-               h->data_received = 0;\
+#define handle_abort(h)                                                \
+       do {                                                    \
+               h->shift_reg = fast_abort[h->ffbit_shift - 1];  \
+               h->hdlc_bits1 = h->ffbit_shift - 2;             \
+               if (h->hdlc_bits1 < 0)                          \
+                       h->hdlc_bits1 = 0;                      \
+               h->data_bits = h->ffbit_shift - 1;              \
+               h->state = HDLC_GET_DATA;                       \
+               h->data_received = 0;                           \
        } while (0)
 
        *count = slen;
@@ -204,7 +204,7 @@ int isdnhdlc_decode(struct isdnhdlc_vars *hdlc, const u8 *src, int slen,
                                if ((!hdlc->do_adapt56) &&
                                    (++hdlc->hdlc_bits1 >= 8) &&
                                    (hdlc->bit_shift == 1))
-                                               hdlc->state = HDLC_FAST_IDLE;
+                                       hdlc->state = HDLC_FAST_IDLE;
                        }
                        hdlc->cbin <<= 1;
                        hdlc->bit_shift--;
@@ -295,7 +295,7 @@ int isdnhdlc_decode(struct isdnhdlc_vars *hdlc, const u8 *src, int slen,
                                hdlc->data_bits = 0;
                                hdlc->data_received = 1;
                                hdlc->crc = crc_ccitt_byte(hdlc->crc,
-                                               hdlc->shift_reg);
+                                                          hdlc->shift_reg);
 
                                /* good byte received */
                                if (hdlc->dstpos < dsize)
@@ -352,7 +352,7 @@ EXPORT_SYMBOL(isdnhdlc_decode);
   returns - number of encoded bytes in the destination buffer
 */
 int isdnhdlc_encode(struct isdnhdlc_vars *hdlc, const u8 *src, u16 slen,
-       int *count, u8 *dst, int dsize)
+                   int *count, u8 *dst, int dsize)
 {
        static const unsigned char xfast_flag_value[] = {
                0x7e, 0x3f, 0x9f, 0xcf, 0xe7, 0xf3, 0xf9, 0xfc, 0x7e
@@ -478,7 +478,7 @@ int isdnhdlc_encode(struct isdnhdlc_vars *hdlc, const u8 *src, u16 slen,
                        }
                        if (hdlc->bit_shift == 8)
                                hdlc->crc = crc_ccitt_byte(hdlc->crc,
-                                       hdlc->shift_reg);
+                                                          hdlc->shift_reg);
                        if (hdlc->shift_reg & 0x01) {
                                hdlc->hdlc_bits1++;
                                hdlc->cbin++;
index 1f355bb..e74df7c 100644 (file)
@@ -54,7 +54,7 @@ static int icn_addcard(int, char *, char *);
  *   channel = channel number
  */
 static void
-icn_free_queue(icn_card * card, int channel)
+icn_free_queue(icn_card *card, int channel)
 {
        struct sk_buff_head *queue = &card->spqueue[channel];
        struct sk_buff *skb;
@@ -93,7 +93,7 @@ icn_shiftout(unsigned short port,
  * disable a cards shared memory
  */
 static inline void
-icn_disable_ram(icn_card * card)
+icn_disable_ram(icn_card *card)
 {
        OUTB_P(0, ICN_MAPRAM);
 }
@@ -102,7 +102,7 @@ icn_disable_ram(icn_card * card)
  * enable a cards shared memory
  */
 static inline void
-icn_enable_ram(icn_card * card)
+icn_enable_ram(icn_card *card)
 {
        OUTB_P(0xff, ICN_MAPRAM);
 }
@@ -113,7 +113,7 @@ icn_enable_ram(icn_card * card)
  * must called with holding the devlock
  */
 static inline void
-icn_map_channel(icn_card * card, int channel)
+icn_map_channel(icn_card *card, int channel)
 {
 #ifdef MAP_DEBUG
        printk(KERN_DEBUG "icn_map_channel %d %d\n", dev.channel, channel);
@@ -139,7 +139,7 @@ icn_map_channel(icn_card * card, int channel)
  * must called with holding the devlock
  */
 static inline int
-icn_lock_channel(icn_card * card, int channel)
+icn_lock_channel(icn_card *card, int channel)
 {
        register int retval;
 
@@ -194,7 +194,7 @@ icn_release_channel(void)
  * Return 1 on success, 0 on failure.
  */
 static inline int
-icn_trymaplock_channel(icn_card * card, int channel)
+icn_trymaplock_channel(icn_card *card, int channel)
 {
        ulong flags;
 
@@ -225,7 +225,7 @@ icn_trymaplock_channel(icn_card * card, int channel)
  * then map same or other channel without locking.
  */
 static inline void
-icn_maprelease_channel(icn_card * card, int channel)
+icn_maprelease_channel(icn_card *card, int channel)
 {
        ulong flags;
 
@@ -246,7 +246,7 @@ icn_maprelease_channel(icn_card * card, int channel)
  */
 
 static void
-icn_pollbchan_receive(int channel, icn_card * card)
+icn_pollbchan_receive(int channel, icn_card *card)
 {
        int mch = channel + ((card->secondhalf) ? 2 : 0);
        int eflag;
@@ -297,7 +297,7 @@ icn_pollbchan_receive(int channel, icn_card * card)
  */
 
 static void
-icn_pollbchan_send(int channel, icn_card * card)
+icn_pollbchan_send(int channel, icn_card *card)
 {
        int mch = channel + ((card->secondhalf) ? 2 : 0);
        int cnt;
@@ -309,7 +309,7 @@ icn_pollbchan_send(int channel, icn_card * card)
              !skb_queue_empty(&card->spqueue[channel])))
                return;
        if (icn_trymaplock_channel(card, mch)) {
-               while (sbfree && 
+               while (sbfree &&
                       (card->sndcount[channel] ||
                        !skb_queue_empty(&card->spqueue[channel]) ||
                        card->xskb[channel])) {
@@ -327,7 +327,7 @@ icn_pollbchan_send(int channel, icn_card * card)
                                        /* Pop ACK-flag off skb.
                                         * Store length to xlen.
                                         */
-                                       if (*(skb_pull(skb,1)))
+                                       if (*(skb_pull(skb, 1)))
                                                card->xlen[channel] = skb->len;
                                        else
                                                card->xlen[channel] = 0;
@@ -396,7 +396,7 @@ icn_pollbchan(unsigned long data)
        if (card->flags & (ICN_FLAGS_B1ACTIVE | ICN_FLAGS_B2ACTIVE)) {
                /* schedule b-channel polling again */
                spin_lock_irqsave(&card->lock, flags);
-               mod_timer(&card->rb_timer, jiffies+ICN_TIMER_BCREAD);
+               mod_timer(&card->rb_timer, jiffies + ICN_TIMER_BCREAD);
                card->flags |= ICN_FLAGS_RBTIMER;
                spin_unlock_irqrestore(&card->lock, flags);
        } else
@@ -428,7 +428,7 @@ static icn_stat icn_stat_table[] =
        {"E_L1: ACT FAIL", ISDN_STAT_BHUP,  8}, /* Layer-1 activation failed  */
        {"E_L2: DATA LIN", ISDN_STAT_BHUP,  8}, /* Layer-2 data link lost     */
        {"E_L1: ACTIVATION FAILED",
-                                          ISDN_STAT_BHUP,  8}, /* Layer-1 activation failed  */
+        ISDN_STAT_BHUP,  8},   /* Layer-1 activation failed  */
        {NULL, 0, -1}
 };
 /* *INDENT-ON* */
@@ -445,7 +445,7 @@ static icn_stat icn_stat_table[] =
  */
 
 static void
-icn_parse_status(u_char * status, int channel, icn_card * card)
+icn_parse_status(u_char *status, int channel, icn_card *card)
 {
        icn_stat *s = icn_stat_table;
        int action = -1;
@@ -465,128 +465,128 @@ icn_parse_status(u_char * status, int channel, icn_card * card)
        cmd.driver = card->myid;
        cmd.arg = channel;
        switch (action) {
-               case 11:
-                       spin_lock_irqsave(&card->lock, flags);
-                       icn_free_queue(card,channel);
-                       card->rcvidx[channel] = 0;
-
-                       if (card->flags & 
-                           ((channel)?ICN_FLAGS_B2ACTIVE:ICN_FLAGS_B1ACTIVE)) {
-                               
-                               isdn_ctrl ncmd;
-                               
-                               card->flags &= ~((channel)?
-                                                ICN_FLAGS_B2ACTIVE:ICN_FLAGS_B1ACTIVE);
-                               
-                               memset(&ncmd, 0, sizeof(ncmd));
-                               
-                               ncmd.driver = card->myid;
-                               ncmd.arg = channel;
-                               ncmd.command = ISDN_STAT_BHUP;
-                               spin_unlock_irqrestore(&card->lock, flags);
-                               card->interface.statcallb(&cmd);
-                       } else
-                               spin_unlock_irqrestore(&card->lock, flags);
-                       break;
-               case 1:
-                       spin_lock_irqsave(&card->lock, flags);
-                       icn_free_queue(card,channel);
-                       card->flags |= (channel) ?
-                           ICN_FLAGS_B2ACTIVE : ICN_FLAGS_B1ACTIVE;
-                       spin_unlock_irqrestore(&card->lock, flags);
-                       break;
-               case 2:
-                       spin_lock_irqsave(&card->lock, flags);
+       case 11:
+               spin_lock_irqsave(&card->lock, flags);
+               icn_free_queue(card, channel);
+               card->rcvidx[channel] = 0;
+
+               if (card->flags &
+                   ((channel) ? ICN_FLAGS_B2ACTIVE : ICN_FLAGS_B1ACTIVE)) {
+
+                       isdn_ctrl ncmd;
+
                        card->flags &= ~((channel) ?
-                               ICN_FLAGS_B2ACTIVE : ICN_FLAGS_B1ACTIVE);
-                       icn_free_queue(card, channel);
-                       card->rcvidx[channel] = 0;
-                       spin_unlock_irqrestore(&card->lock, flags);
-                       break;
-               case 3:
-                       {
-                               char *t = status + 6;
-                               char *s = strchr(t, ',');
-
-                               *s++ = '\0';
-                               strlcpy(cmd.parm.setup.phone, t,
-                                       sizeof(cmd.parm.setup.phone));
-                               s = strchr(t = s, ',');
-                               *s++ = '\0';
-                               if (!strlen(t))
-                                       cmd.parm.setup.si1 = 0;
-                               else
-                                       cmd.parm.setup.si1 =
-                                           simple_strtoul(t, NULL, 10);
-                               s = strchr(t = s, ',');
-                               *s++ = '\0';
-                               if (!strlen(t))
-                                       cmd.parm.setup.si2 = 0;
-                               else
-                                       cmd.parm.setup.si2 =
-                                           simple_strtoul(t, NULL, 10);
-                               strlcpy(cmd.parm.setup.eazmsn, s,
-                                       sizeof(cmd.parm.setup.eazmsn));
-                       }
-                       cmd.parm.setup.plan = 0;
-                       cmd.parm.setup.screen = 0;
-                       break;
-               case 4:
-                       sprintf(cmd.parm.setup.phone, "LEASED%d", card->myid);
-                       sprintf(cmd.parm.setup.eazmsn, "%d", channel + 1);
-                       cmd.parm.setup.si1 = 7;
-                       cmd.parm.setup.si2 = 0;
-                       cmd.parm.setup.plan = 0;
-                       cmd.parm.setup.screen = 0;
-                       break;
-               case 5:
-                       strlcpy(cmd.parm.num, status + 3, sizeof(cmd.parm.num));
-                       break;
-               case 6:
-                       snprintf(cmd.parm.num, sizeof(cmd.parm.num), "%d",
-                            (int) simple_strtoul(status + 7, NULL, 16));
-                       break;
-               case 7:
-                       status += 3;
-                       if (strlen(status) == 4)
-                               snprintf(cmd.parm.num, sizeof(cmd.parm.num), "%s%c%c",
-                                    status + 2, *status, *(status + 1));
-                       else
-                               strlcpy(cmd.parm.num, status + 1, sizeof(cmd.parm.num));
-                       break;
-               case 8:
-                       spin_lock_irqsave(&card->lock, flags);
-                       card->flags &= ~ICN_FLAGS_B1ACTIVE;
-                       icn_free_queue(card, 0);
-                       card->rcvidx[0] = 0;
+                                        ICN_FLAGS_B2ACTIVE : ICN_FLAGS_B1ACTIVE);
+
+                       memset(&ncmd, 0, sizeof(ncmd));
+
+                       ncmd.driver = card->myid;
+                       ncmd.arg = channel;
+                       ncmd.command = ISDN_STAT_BHUP;
                        spin_unlock_irqrestore(&card->lock, flags);
-                       cmd.arg = 0;
-                       cmd.driver = card->myid;
-                       card->interface.statcallb(&cmd);
-                       cmd.command = ISDN_STAT_DHUP;
-                       cmd.arg = 0;
-                       cmd.driver = card->myid;
                        card->interface.statcallb(&cmd);
-                       cmd.command = ISDN_STAT_BHUP;
-                       spin_lock_irqsave(&card->lock, flags);
-                       card->flags &= ~ICN_FLAGS_B2ACTIVE;
-                       icn_free_queue(card, 1);
-                       card->rcvidx[1] = 0;
+               } else
                        spin_unlock_irqrestore(&card->lock, flags);
-                       cmd.arg = 1;
-                       cmd.driver = card->myid;
-                       card->interface.statcallb(&cmd);
-                       cmd.command = ISDN_STAT_DHUP;
-                       cmd.arg = 1;
-                       cmd.driver = card->myid;
-                       break;
+               break;
+       case 1:
+               spin_lock_irqsave(&card->lock, flags);
+               icn_free_queue(card, channel);
+               card->flags |= (channel) ?
+                       ICN_FLAGS_B2ACTIVE : ICN_FLAGS_B1ACTIVE;
+               spin_unlock_irqrestore(&card->lock, flags);
+               break;
+       case 2:
+               spin_lock_irqsave(&card->lock, flags);
+               card->flags &= ~((channel) ?
+                                ICN_FLAGS_B2ACTIVE : ICN_FLAGS_B1ACTIVE);
+               icn_free_queue(card, channel);
+               card->rcvidx[channel] = 0;
+               spin_unlock_irqrestore(&card->lock, flags);
+               break;
+       case 3:
+       {
+               char *t = status + 6;
+               char *s = strchr(t, ',');
+
+               *s++ = '\0';
+               strlcpy(cmd.parm.setup.phone, t,
+                       sizeof(cmd.parm.setup.phone));
+               s = strchr(t = s, ',');
+               *s++ = '\0';
+               if (!strlen(t))
+                       cmd.parm.setup.si1 = 0;
+               else
+                       cmd.parm.setup.si1 =
+                               simple_strtoul(t, NULL, 10);
+               s = strchr(t = s, ',');
+               *s++ = '\0';
+               if (!strlen(t))
+                       cmd.parm.setup.si2 = 0;
+               else
+                       cmd.parm.setup.si2 =
+                               simple_strtoul(t, NULL, 10);
+               strlcpy(cmd.parm.setup.eazmsn, s,
+                       sizeof(cmd.parm.setup.eazmsn));
+       }
+       cmd.parm.setup.plan = 0;
+       cmd.parm.setup.screen = 0;
+       break;
+       case 4:
+               sprintf(cmd.parm.setup.phone, "LEASED%d", card->myid);
+               sprintf(cmd.parm.setup.eazmsn, "%d", channel + 1);
+               cmd.parm.setup.si1 = 7;
+               cmd.parm.setup.si2 = 0;
+               cmd.parm.setup.plan = 0;
+               cmd.parm.setup.screen = 0;
+               break;
+       case 5:
+               strlcpy(cmd.parm.num, status + 3, sizeof(cmd.parm.num));
+               break;
+       case 6:
+               snprintf(cmd.parm.num, sizeof(cmd.parm.num), "%d",
+                        (int) simple_strtoul(status + 7, NULL, 16));
+               break;
+       case 7:
+               status += 3;
+               if (strlen(status) == 4)
+                       snprintf(cmd.parm.num, sizeof(cmd.parm.num), "%s%c%c",
+                                status + 2, *status, *(status + 1));
+               else
+                       strlcpy(cmd.parm.num, status + 1, sizeof(cmd.parm.num));
+               break;
+       case 8:
+               spin_lock_irqsave(&card->lock, flags);
+               card->flags &= ~ICN_FLAGS_B1ACTIVE;
+               icn_free_queue(card, 0);
+               card->rcvidx[0] = 0;
+               spin_unlock_irqrestore(&card->lock, flags);
+               cmd.arg = 0;
+               cmd.driver = card->myid;
+               card->interface.statcallb(&cmd);
+               cmd.command = ISDN_STAT_DHUP;
+               cmd.arg = 0;
+               cmd.driver = card->myid;
+               card->interface.statcallb(&cmd);
+               cmd.command = ISDN_STAT_BHUP;
+               spin_lock_irqsave(&card->lock, flags);
+               card->flags &= ~ICN_FLAGS_B2ACTIVE;
+               icn_free_queue(card, 1);
+               card->rcvidx[1] = 0;
+               spin_unlock_irqrestore(&card->lock, flags);
+               cmd.arg = 1;
+               cmd.driver = card->myid;
+               card->interface.statcallb(&cmd);
+               cmd.command = ISDN_STAT_DHUP;
+               cmd.arg = 1;
+               cmd.driver = card->myid;
+               break;
        }
        card->interface.statcallb(&cmd);
        return;
 }
 
 static void
-icn_putmsg(icn_card * card, unsigned char c)
+icn_putmsg(icn_card *card, unsigned char c)
 {
        ulong flags;
 
@@ -688,7 +688,7 @@ icn_polldchan(unsigned long data)
                        add_timer(&card->rb_timer);
                }
        /* schedule again */
-       mod_timer(&card->st_timer, jiffies+ICN_TIMER_DCREAD);
+       mod_timer(&card->st_timer, jiffies + ICN_TIMER_DCREAD);
        spin_unlock_irqrestore(&card->lock, flags);
 }
 
@@ -702,7 +702,7 @@ icn_polldchan(unsigned long data)
  */
 
 static int
-icn_sendbuf(int channel, int ack, struct sk_buff *skb, icn_card * card)
+icn_sendbuf(int channel, int ack, struct sk_buff *skb, icn_card *card)
 {
        int len = skb->len;
        unsigned long flags;
@@ -718,13 +718,13 @@ icn_sendbuf(int channel, int ack, struct sk_buff *skb, icn_card * card)
                        return 0;
                if (card->sndcount[channel] > ICN_MAX_SQUEUE)
                        return 0;
-               #warning TODO test headroom or use skb->nb to flag ACK
+#warning TODO test headroom or use skb->nb to flag ACK
                nskb = skb_clone(skb, GFP_ATOMIC);
                if (nskb) {
                        /* Push ACK flag as one
                         * byte in front of data.
                         */
-                       *(skb_push(nskb, 1)) = ack?1:0;
+                       *(skb_push(nskb, 1)) = ack ? 1 : 0;
                        skb_queue_tail(&card->spqueue[channel], nskb);
                        dev_kfree_skb(skb);
                } else
@@ -785,20 +785,20 @@ icn_check_loader(int cardnumber)
  */
 
 #ifdef BOOT_DEBUG
-#define SLEEP(sec) { \
-int slsec = sec; \
-  printk(KERN_DEBUG "SLEEP(%d)\n",slsec); \
-  while (slsec) { \
-    msleep_interruptible(1000); \
-    slsec--; \
-  } \
-}
+#define SLEEP(sec) {                                           \
+               int slsec = sec;                                \
+               printk(KERN_DEBUG "SLEEP(%d)\n", slsec);        \
+               while (slsec) {                                 \
+                       msleep_interruptible(1000);             \
+                       slsec--;                                \
+               }                                               \
+       }
 #else
 #define SLEEP(sec)
 #endif
 
 static int
-icn_loadboot(u_char __user * buffer, icn_card * card)
+icn_loadboot(u_char __user *buffer, icn_card *card)
 {
        int ret;
        u_char *codebuf;
@@ -896,14 +896,14 @@ icn_loadboot(u_char __user * buffer, icn_card * card)
        SLEEP(1);
        ret = (icn_check_loader(1));
 
- out_kfree:
+out_kfree:
        kfree(codebuf);
- out:
+out:
        return ret;
 }
 
 static int
-icn_loadproto(u_char __user * buffer, icn_card * card)
+icn_loadproto(u_char __user *buffer, icn_card *card)
 {
        register u_char __user *p = buffer;
        u_char codebuf[256];
@@ -1004,7 +1004,7 @@ icn_loadproto(u_char __user * buffer, icn_card * card)
 
 /* Read the Status-replies from the Interface */
 static int
-icn_readstatus(u_char __user *buf, int len, icn_card * card)
+icn_readstatus(u_char __user *buf, int len, icn_card *card)
 {
        int count;
        u_char __user *p;
@@ -1022,7 +1022,7 @@ icn_readstatus(u_char __user *buf, int len, icn_card * card)
 
 /* Put command-strings into the command-queue of the Interface */
 static int
-icn_writecmd(const u_char * buf, int len, int user, icn_card * card)
+icn_writecmd(const u_char *buf, int len, int user, icn_card *card)
 {
        int mch = card->secondhalf ? 2 : 0;
        int pp;
@@ -1057,9 +1057,9 @@ icn_writecmd(const u_char * buf, int len, int user, icn_card * card)
 
                icn_putmsg(card, '>');
                for (p = msg, pp = readb(&cmd_i), i = count; i > 0; i--, p++, pp
-                    ++) {
+                            ++) {
                        writeb((*p == '\n') ? 0xff : *p,
-                          &dev.shmem->comm_buffers.pcio_buf[pp & 0xff]);
+                              &dev.shmem->comm_buffers.pcio_buf[pp & 0xff]);
                        len--;
                        xcount++;
                        icn_putmsg(card, *p);
@@ -1093,7 +1093,7 @@ icn_writecmd(const u_char * buf, int len, int user, icn_card * card)
  * Delete card's pending timers, send STOP to linklevel
  */
 static void
-icn_stopcard(icn_card * card)
+icn_stopcard(icn_card *card)
 {
        unsigned long flags;
        isdn_ctrl cmd;
@@ -1150,7 +1150,7 @@ icn_disable_cards(void)
 }
 
 static int
-icn_command(isdn_ctrl * c, icn_card * card)
+icn_command(isdn_ctrl *c, icn_card *card)
 {
        ulong a;
        ulong flags;
@@ -1161,275 +1161,275 @@ icn_command(isdn_ctrl * c, icn_card * card)
        char __user *arg;
 
        switch (c->command) {
-               case ISDN_CMD_IOCTL:
-                       memcpy(&a, c->parm.num, sizeof(ulong));
-                       arg = (char __user *)a;
-                       switch (c->arg) {
-                               case ICN_IOCTL_SETMMIO:
-                                       if (dev.memaddr != (a & 0x0ffc000)) {
-                                               if (!request_mem_region(a & 0x0ffc000, 0x4000, "icn-isdn (all cards)")) {
-                                                       printk(KERN_WARNING
-                                                              "icn: memory at 0x%08lx in use.\n",
-                                                              a & 0x0ffc000);
-                                                       return -EINVAL;
-                                               }
-                                               release_mem_region(a & 0x0ffc000, 0x4000);
-                                               icn_stopallcards();
-                                               spin_lock_irqsave(&card->lock, flags);
-                                               if (dev.mvalid) {
-                                                       iounmap(dev.shmem);
-                                                       release_mem_region(dev.memaddr, 0x4000);
-                                               }
-                                               dev.mvalid = 0;
-                                               dev.memaddr = a & 0x0ffc000;
-                                               spin_unlock_irqrestore(&card->lock, flags);
-                                               printk(KERN_INFO
-                                                      "icn: (%s) mmio set to 0x%08lx\n",
-                                                      CID,
-                                                      dev.memaddr);
-                                       }
-                                       break;
-                               case ICN_IOCTL_GETMMIO:
-                                       return (long) dev.memaddr;
-                               case ICN_IOCTL_SETPORT:
-                                       if (a == 0x300 || a == 0x310 || a == 0x320 || a == 0x330
-                                           || a == 0x340 || a == 0x350 || a == 0x360 ||
-                                           a == 0x308 || a == 0x318 || a == 0x328 || a == 0x338
-                                           || a == 0x348 || a == 0x358 || a == 0x368) {
-                                               if (card->port != (unsigned short) a) {
-                                                       if (!request_region((unsigned short) a, ICN_PORTLEN, "icn-isdn")) {
-                                                               printk(KERN_WARNING
-                                                                      "icn: (%s) ports 0x%03x-0x%03x in use.\n",
-                                                                      CID, (int) a, (int) a + ICN_PORTLEN);
-                                                               return -EINVAL;
-                                                       }
-                                                       release_region((unsigned short) a, ICN_PORTLEN);
-                                                       icn_stopcard(card);
-                                                       spin_lock_irqsave(&card->lock, flags);
-                                                       if (card->rvalid)
-                                                               release_region(card->port, ICN_PORTLEN);
-                                                       card->port = (unsigned short) a;
-                                                       card->rvalid = 0;
-                                                       if (card->doubleS0) {
-                                                               card->other->port = (unsigned short) a;
-                                                               card->other->rvalid = 0;
-                                                       }
-                                                       spin_unlock_irqrestore(&card->lock, flags);
-                                                       printk(KERN_INFO
-                                                              "icn: (%s) port set to 0x%03x\n",
-                                                       CID, card->port);
-                                               }
-                                       } else
+       case ISDN_CMD_IOCTL:
+               memcpy(&a, c->parm.num, sizeof(ulong));
+               arg = (char __user *)a;
+               switch (c->arg) {
+               case ICN_IOCTL_SETMMIO:
+                       if (dev.memaddr != (a & 0x0ffc000)) {
+                               if (!request_mem_region(a & 0x0ffc000, 0x4000, "icn-isdn (all cards)")) {
+                                       printk(KERN_WARNING
+                                              "icn: memory at 0x%08lx in use.\n",
+                                              a & 0x0ffc000);
+                                       return -EINVAL;
+                               }
+                               release_mem_region(a & 0x0ffc000, 0x4000);
+                               icn_stopallcards();
+                               spin_lock_irqsave(&card->lock, flags);
+                               if (dev.mvalid) {
+                                       iounmap(dev.shmem);
+                                       release_mem_region(dev.memaddr, 0x4000);
+                               }
+                               dev.mvalid = 0;
+                               dev.memaddr = a & 0x0ffc000;
+                               spin_unlock_irqrestore(&card->lock, flags);
+                               printk(KERN_INFO
+                                      "icn: (%s) mmio set to 0x%08lx\n",
+                                      CID,
+                                      dev.memaddr);
+                       }
+                       break;
+               case ICN_IOCTL_GETMMIO:
+                       return (long) dev.memaddr;
+               case ICN_IOCTL_SETPORT:
+                       if (a == 0x300 || a == 0x310 || a == 0x320 || a == 0x330
+                           || a == 0x340 || a == 0x350 || a == 0x360 ||
+                           a == 0x308 || a == 0x318 || a == 0x328 || a == 0x338
+                           || a == 0x348 || a == 0x358 || a == 0x368) {
+                               if (card->port != (unsigned short) a) {
+                                       if (!request_region((unsigned short) a, ICN_PORTLEN, "icn-isdn")) {
+                                               printk(KERN_WARNING
+                                                      "icn: (%s) ports 0x%03x-0x%03x in use.\n",
+                                                      CID, (int) a, (int) a + ICN_PORTLEN);
                                                return -EINVAL;
-                                       break;
-                               case ICN_IOCTL_GETPORT:
-                                       return (int) card->port;
-                               case ICN_IOCTL_GETDOUBLE:
-                                       return (int) card->doubleS0;
-                               case ICN_IOCTL_DEBUGVAR:
-                                       if (copy_to_user(arg,
-                                                        &card,
-                                                        sizeof(ulong)))
-                                               return -EFAULT;
-                                       a += sizeof(ulong);
-                                       {
-                                               ulong l = (ulong) & dev;
-                                               if (copy_to_user(arg,
-                                                                &l,
-                                                                sizeof(ulong)))
-                                                       return -EFAULT;
                                        }
-                                       return 0;
-                               case ICN_IOCTL_LOADBOOT:
-                                       if (dev.firstload) {
-                                               icn_disable_cards();
-                                               dev.firstload = 0;
-                                       }
-                                       icn_stopcard(card);
-                                       return (icn_loadboot(arg, card));
-                               case ICN_IOCTL_LOADPROTO:
+                                       release_region((unsigned short) a, ICN_PORTLEN);
                                        icn_stopcard(card);
-                                       if ((i = (icn_loadproto(arg, card))))
-                                               return i;
-                                       if (card->doubleS0)
-                                               i = icn_loadproto(arg + ICN_CODE_STAGE2, card->other);
-                                       return i;
-                                       break;
-                               case ICN_IOCTL_ADDCARD:
-                                       if (!dev.firstload)
-                                               return -EBUSY;
-                                       if (copy_from_user(&cdef,
-                                                          arg,
-                                                          sizeof(cdef)))
-                                               return -EFAULT;
-                                       return (icn_addcard(cdef.port, cdef.id1, cdef.id2));
-                                       break;
-                               case ICN_IOCTL_LEASEDCFG:
-                                       if (a) {
-                                               if (!card->leased) {
-                                                       card->leased = 1;
-                                                       while (card->ptype == ISDN_PTYPE_UNKNOWN) {
-                                                               msleep_interruptible(ICN_BOOT_TIMEOUT1);
-                                                       }
-                                                       msleep_interruptible(ICN_BOOT_TIMEOUT1);
-                                                       sprintf(cbuf, "00;FV2ON\n01;EAZ%c\n02;EAZ%c\n",
-                                                               (a & 1)?'1':'C', (a & 2)?'2':'C');
-                                                       i = icn_writecmd(cbuf, strlen(cbuf), 0, card);
-                                                       printk(KERN_INFO
-                                                              "icn: (%s) Leased-line mode enabled\n",
-                                                              CID);
-                                                       cmd.command = ISDN_STAT_RUN;
-                                                       cmd.driver = card->myid;
-                                                       cmd.arg = 0;
-                                                       card->interface.statcallb(&cmd);
-                                               }
-                                       } else {
-                                               if (card->leased) {
-                                                       card->leased = 0;
-                                                       sprintf(cbuf, "00;FV2OFF\n");
-                                                       i = icn_writecmd(cbuf, strlen(cbuf), 0, card);
-                                                       printk(KERN_INFO
-                                                              "icn: (%s) Leased-line mode disabled\n",
-                                                              CID);
-                                                       cmd.command = ISDN_STAT_RUN;
-                                                       cmd.driver = card->myid;
-                                                       cmd.arg = 0;
-                                                       card->interface.statcallb(&cmd);
-                                               }
+                                       spin_lock_irqsave(&card->lock, flags);
+                                       if (card->rvalid)
+                                               release_region(card->port, ICN_PORTLEN);
+                                       card->port = (unsigned short) a;
+                                       card->rvalid = 0;
+                                       if (card->doubleS0) {
+                                               card->other->port = (unsigned short) a;
+                                               card->other->rvalid = 0;
                                        }
-                                       return 0;
-                               default:
-                                       return -EINVAL;
-                       }
+                                       spin_unlock_irqrestore(&card->lock, flags);
+                                       printk(KERN_INFO
+                                              "icn: (%s) port set to 0x%03x\n",
+                                              CID, card->port);
+                               }
+                       } else
+                               return -EINVAL;
                        break;
-               case ISDN_CMD_DIAL:
-                       if (!(card->flags & ICN_FLAGS_RUNNING))
-                               return -ENODEV;
-                       if (card->leased)
-                               break;
-                       if ((c->arg & 255) < ICN_BCH) {
-                               char *p;
-                               char dial[50];
-                               char dcode[4];
-
-                               a = c->arg;
-                               p = c->parm.setup.phone;
-                               if (*p == 's' || *p == 'S') {
-                                       /* Dial for SPV */
-                                       p++;
-                                       strcpy(dcode, "SCA");
-                               } else
-                                       /* Normal Dial */
-                                       strcpy(dcode, "CAL");
-                               strcpy(dial, p);
-                               sprintf(cbuf, "%02d;D%s_R%s,%02d,%02d,%s\n", (int) (a + 1),
-                                       dcode, dial, c->parm.setup.si1,
-                               c->parm.setup.si2, c->parm.setup.eazmsn);
-                               i = icn_writecmd(cbuf, strlen(cbuf), 0, card);
+               case ICN_IOCTL_GETPORT:
+                       return (int) card->port;
+               case ICN_IOCTL_GETDOUBLE:
+                       return (int) card->doubleS0;
+               case ICN_IOCTL_DEBUGVAR:
+                       if (copy_to_user(arg,
+                                        &card,
+                                        sizeof(ulong)))
+                               return -EFAULT;
+                       a += sizeof(ulong);
+                       {
+                               ulong l = (ulong)&dev;
+                               if (copy_to_user(arg,
+                                                &l,
+                                                sizeof(ulong)))
+                                       return -EFAULT;
                        }
+                       return 0;
+               case ICN_IOCTL_LOADBOOT:
+                       if (dev.firstload) {
+                               icn_disable_cards();
+                               dev.firstload = 0;
+                       }
+                       icn_stopcard(card);
+                       return (icn_loadboot(arg, card));
+               case ICN_IOCTL_LOADPROTO:
+                       icn_stopcard(card);
+                       if ((i = (icn_loadproto(arg, card))))
+                               return i;
+                       if (card->doubleS0)
+                               i = icn_loadproto(arg + ICN_CODE_STAGE2, card->other);
+                       return i;
+                       break;
+               case ICN_IOCTL_ADDCARD:
+                       if (!dev.firstload)
+                               return -EBUSY;
+                       if (copy_from_user(&cdef,
+                                          arg,
+                                          sizeof(cdef)))
+                               return -EFAULT;
+                       return (icn_addcard(cdef.port, cdef.id1, cdef.id2));
                        break;
-               case ISDN_CMD_ACCEPTD:
-                       if (!(card->flags & ICN_FLAGS_RUNNING))
-                               return -ENODEV;
-                       if (c->arg < ICN_BCH) {
-                               a = c->arg + 1;
-                               if (card->fw_rev >= 300) {
-                                       switch (card->l2_proto[a - 1]) {
-                                               case ISDN_PROTO_L2_X75I:
-                                                       sprintf(cbuf, "%02d;BX75\n", (int) a);
-                                                       break;
-                                               case ISDN_PROTO_L2_HDLC:
-                                                       sprintf(cbuf, "%02d;BTRA\n", (int) a);
-                                                       break;
+               case ICN_IOCTL_LEASEDCFG:
+                       if (a) {
+                               if (!card->leased) {
+                                       card->leased = 1;
+                                       while (card->ptype == ISDN_PTYPE_UNKNOWN) {
+                                               msleep_interruptible(ICN_BOOT_TIMEOUT1);
                                        }
+                                       msleep_interruptible(ICN_BOOT_TIMEOUT1);
+                                       sprintf(cbuf, "00;FV2ON\n01;EAZ%c\n02;EAZ%c\n",
+                                               (a & 1) ? '1' : 'C', (a & 2) ? '2' : 'C');
                                        i = icn_writecmd(cbuf, strlen(cbuf), 0, card);
+                                       printk(KERN_INFO
+                                              "icn: (%s) Leased-line mode enabled\n",
+                                              CID);
+                                       cmd.command = ISDN_STAT_RUN;
+                                       cmd.driver = card->myid;
+                                       cmd.arg = 0;
+                                       card->interface.statcallb(&cmd);
+                               }
+                       } else {
+                               if (card->leased) {
+                                       card->leased = 0;
+                                       sprintf(cbuf, "00;FV2OFF\n");
+                                       i = icn_writecmd(cbuf, strlen(cbuf), 0, card);
+                                       printk(KERN_INFO
+                                              "icn: (%s) Leased-line mode disabled\n",
+                                              CID);
+                                       cmd.command = ISDN_STAT_RUN;
+                                       cmd.driver = card->myid;
+                                       cmd.arg = 0;
+                                       card->interface.statcallb(&cmd);
                                }
-                               sprintf(cbuf, "%02d;DCON_R\n", (int) a);
-                               i = icn_writecmd(cbuf, strlen(cbuf), 0, card);
                        }
+                       return 0;
+               default:
+                       return -EINVAL;
+               }
+               break;
+       case ISDN_CMD_DIAL:
+               if (!(card->flags & ICN_FLAGS_RUNNING))
+                       return -ENODEV;
+               if (card->leased)
                        break;
-               case ISDN_CMD_ACCEPTB:
-                       if (!(card->flags & ICN_FLAGS_RUNNING))
-                               return -ENODEV;
-                       if (c->arg < ICN_BCH) {
-                               a = c->arg + 1;
-                               if (card->fw_rev >= 300)
-                                       switch (card->l2_proto[a - 1]) {
-                                               case ISDN_PROTO_L2_X75I:
-                                                       sprintf(cbuf, "%02d;BCON_R,BX75\n", (int) a);
-                                                       break;
-                                               case ISDN_PROTO_L2_HDLC:
-                                                       sprintf(cbuf, "%02d;BCON_R,BTRA\n", (int) a);
-                                                       break;
-                               } else
-                                       sprintf(cbuf, "%02d;BCON_R\n", (int) a);
+               if ((c->arg & 255) < ICN_BCH) {
+                       char *p;
+                       char dial[50];
+                       char dcode[4];
+
+                       a = c->arg;
+                       p = c->parm.setup.phone;
+                       if (*p == 's' || *p == 'S') {
+                               /* Dial for SPV */
+                               p++;
+                               strcpy(dcode, "SCA");
+                       } else
+                               /* Normal Dial */
+                               strcpy(dcode, "CAL");
+                       strcpy(dial, p);
+                       sprintf(cbuf, "%02d;D%s_R%s,%02d,%02d,%s\n", (int) (a + 1),
+                               dcode, dial, c->parm.setup.si1,
+                               c->parm.setup.si2, c->parm.setup.eazmsn);
+                       i = icn_writecmd(cbuf, strlen(cbuf), 0, card);
+               }
+               break;
+       case ISDN_CMD_ACCEPTD:
+               if (!(card->flags & ICN_FLAGS_RUNNING))
+                       return -ENODEV;
+               if (c->arg < ICN_BCH) {
+                       a = c->arg + 1;
+                       if (card->fw_rev >= 300) {
+                               switch (card->l2_proto[a - 1]) {
+                               case ISDN_PROTO_L2_X75I:
+                                       sprintf(cbuf, "%02d;BX75\n", (int) a);
+                                       break;
+                               case ISDN_PROTO_L2_HDLC:
+                                       sprintf(cbuf, "%02d;BTRA\n", (int) a);
+                                       break;
+                               }
                                i = icn_writecmd(cbuf, strlen(cbuf), 0, card);
                        }
+                       sprintf(cbuf, "%02d;DCON_R\n", (int) a);
+                       i = icn_writecmd(cbuf, strlen(cbuf), 0, card);
+               }
+               break;
+       case ISDN_CMD_ACCEPTB:
+               if (!(card->flags & ICN_FLAGS_RUNNING))
+                       return -ENODEV;
+               if (c->arg < ICN_BCH) {
+                       a = c->arg + 1;
+                       if (card->fw_rev >= 300)
+                               switch (card->l2_proto[a - 1]) {
+                               case ISDN_PROTO_L2_X75I:
+                                       sprintf(cbuf, "%02d;BCON_R,BX75\n", (int) a);
+                                       break;
+                               case ISDN_PROTO_L2_HDLC:
+                                       sprintf(cbuf, "%02d;BCON_R,BTRA\n", (int) a);
+                                       break;
+                               } else
+                               sprintf(cbuf, "%02d;BCON_R\n", (int) a);
+                       i = icn_writecmd(cbuf, strlen(cbuf), 0, card);
+               }
+               break;
+       case ISDN_CMD_HANGUP:
+               if (!(card->flags & ICN_FLAGS_RUNNING))
+                       return -ENODEV;
+               if (c->arg < ICN_BCH) {
+                       a = c->arg + 1;
+                       sprintf(cbuf, "%02d;BDIS_R\n%02d;DDIS_R\n", (int) a, (int) a);
+                       i = icn_writecmd(cbuf, strlen(cbuf), 0, card);
+               }
+               break;
+       case ISDN_CMD_SETEAZ:
+               if (!(card->flags & ICN_FLAGS_RUNNING))
+                       return -ENODEV;
+               if (card->leased)
                        break;
-               case ISDN_CMD_HANGUP:
-                       if (!(card->flags & ICN_FLAGS_RUNNING))
-                               return -ENODEV;
-                       if (c->arg < ICN_BCH) {
-                               a = c->arg + 1;
-                               sprintf(cbuf, "%02d;BDIS_R\n%02d;DDIS_R\n", (int) a, (int) a);
-                               i = icn_writecmd(cbuf, strlen(cbuf), 0, card);
-                       }
+               if (c->arg < ICN_BCH) {
+                       a = c->arg + 1;
+                       if (card->ptype == ISDN_PTYPE_EURO) {
+                               sprintf(cbuf, "%02d;MS%s%s\n", (int) a,
+                                       c->parm.num[0] ? "N" : "ALL", c->parm.num);
+                       } else
+                               sprintf(cbuf, "%02d;EAZ%s\n", (int) a,
+                                       c->parm.num[0] ? (char *)(c->parm.num) : "0123456789");
+                       i = icn_writecmd(cbuf, strlen(cbuf), 0, card);
+               }
+               break;
+       case ISDN_CMD_CLREAZ:
+               if (!(card->flags & ICN_FLAGS_RUNNING))
+                       return -ENODEV;
+               if (card->leased)
                        break;
-               case ISDN_CMD_SETEAZ:
-                       if (!(card->flags & ICN_FLAGS_RUNNING))
-                               return -ENODEV;
-                       if (card->leased)
+               if (c->arg < ICN_BCH) {
+                       a = c->arg + 1;
+                       if (card->ptype == ISDN_PTYPE_EURO)
+                               sprintf(cbuf, "%02d;MSNC\n", (int) a);
+                       else
+                               sprintf(cbuf, "%02d;EAZC\n", (int) a);
+                       i = icn_writecmd(cbuf, strlen(cbuf), 0, card);
+               }
+               break;
+       case ISDN_CMD_SETL2:
+               if (!(card->flags & ICN_FLAGS_RUNNING))
+                       return -ENODEV;
+               if ((c->arg & 255) < ICN_BCH) {
+                       a = c->arg;
+                       switch (a >> 8) {
+                       case ISDN_PROTO_L2_X75I:
+                               sprintf(cbuf, "%02d;BX75\n", (int) (a & 255) + 1);
                                break;
-                       if (c->arg < ICN_BCH) {
-                               a = c->arg + 1;
-                               if (card->ptype == ISDN_PTYPE_EURO) {
-                                       sprintf(cbuf, "%02d;MS%s%s\n", (int) a,
-                                               c->parm.num[0] ? "N" : "ALL", c->parm.num);
-                               } else
-                                       sprintf(cbuf, "%02d;EAZ%s\n", (int) a,
-                                               c->parm.num[0] ? (char *)(c->parm.num) : "0123456789");
-                               i = icn_writecmd(cbuf, strlen(cbuf), 0, card);
-                       }
-                       break;
-               case ISDN_CMD_CLREAZ:
-                       if (!(card->flags & ICN_FLAGS_RUNNING))
-                               return -ENODEV;
-                       if (card->leased)
+                       case ISDN_PROTO_L2_HDLC:
+                               sprintf(cbuf, "%02d;BTRA\n", (int) (a & 255) + 1);
                                break;
-                       if (c->arg < ICN_BCH) {
-                               a = c->arg + 1;
-                               if (card->ptype == ISDN_PTYPE_EURO)
-                                       sprintf(cbuf, "%02d;MSNC\n", (int) a);
-                               else
-                                       sprintf(cbuf, "%02d;EAZC\n", (int) a);
-                               i = icn_writecmd(cbuf, strlen(cbuf), 0, card);
-                       }
-                       break;
-               case ISDN_CMD_SETL2:
-                       if (!(card->flags & ICN_FLAGS_RUNNING))
-                               return -ENODEV;
-                       if ((c->arg & 255) < ICN_BCH) {
-                               a = c->arg;
-                               switch (a >> 8) {
-                                       case ISDN_PROTO_L2_X75I:
-                                               sprintf(cbuf, "%02d;BX75\n", (int) (a & 255) + 1);
-                                               break;
-                                       case ISDN_PROTO_L2_HDLC:
-                                               sprintf(cbuf, "%02d;BTRA\n", (int) (a & 255) + 1);
-                                               break;
-                                       default:
-                                               return -EINVAL;
-                               }
-                               i = icn_writecmd(cbuf, strlen(cbuf), 0, card);
-                               card->l2_proto[a & 255] = (a >> 8);
+                       default:
+                               return -EINVAL;
                        }
-                       break;
-               case ISDN_CMD_SETL3:
-                       if (!(card->flags & ICN_FLAGS_RUNNING))
-                               return -ENODEV;
-                       return 0;
-               default:
-                       return -EINVAL;
+                       i = icn_writecmd(cbuf, strlen(cbuf), 0, card);
+                       card->l2_proto[a & 255] = (a >> 8);
+               }
+               break;
+       case ISDN_CMD_SETL3:
+               if (!(card->flags & ICN_FLAGS_RUNNING))
+                       return -ENODEV;
+               return 0;
+       default:
+               return -EINVAL;
        }
        return 0;
 }
@@ -1454,7 +1454,7 @@ icn_findcard(int driverid)
  * Wrapper functions for interface to linklevel
  */
 static int
-if_command(isdn_ctrl * c)
+if_command(isdn_ctrl *c)
 {
        icn_card *card = icn_findcard(c->driver);
 
@@ -1537,9 +1537,9 @@ icn_initcard(int port, char *id)
        card->interface.writecmd = if_writecmd;
        card->interface.readstat = if_readstatus;
        card->interface.features = ISDN_FEATURE_L2_X75I |
-           ISDN_FEATURE_L2_HDLC |
-           ISDN_FEATURE_L3_TRANS |
-           ISDN_FEATURE_P_UNKNOWN;
+               ISDN_FEATURE_L2_HDLC |
+               ISDN_FEATURE_L3_TRANS |
+               ISDN_FEATURE_P_UNKNOWN;
        card->ptype = ISDN_PTYPE_UNKNOWN;
        strlcpy(card->interface.id, id, sizeof(card->interface.id));
        card->msg_buf_write = card->msg_buf;
@@ -1619,7 +1619,7 @@ icn_setup(char *line)
                        icn_id2 = sid2;
                }
        }
-       return(1);
+       return (1);
 }
 __setup("icn=", icn_setup);
 #endif /* MODULE */
index 7d7245f..b713466 100644 (file)
@@ -54,7 +54,7 @@ typedef struct icn_cdef {
 
 /* some useful macros for debugging */
 #ifdef ICN_DEBUG_PORT
-#define OUTB_P(v,p) {printk(KERN_DEBUG "icn: outb_p(0x%02x,0x%03x)\n",v,p); outb_p(v,p);}
+#define OUTB_P(v, p) {printk(KERN_DEBUG "icn: outb_p(0x%02x,0x%03x)\n", v, p); outb_p(v, p);}
 #else
 #define OUTB_P outb
 #endif
@@ -71,8 +71,8 @@ typedef struct icn_cdef {
 
 #define ICN_BOOT_TIMEOUT1  1000 /* Delay for Boot-download (msecs)         */
 
-#define ICN_TIMER_BCREAD (HZ/100)      /* B-Channel poll-cycle                    */
-#define ICN_TIMER_DCREAD (HZ/2) /* D-Channel poll-cycle                    */
+#define ICN_TIMER_BCREAD (HZ / 100)    /* B-Channel poll-cycle                    */
+#define ICN_TIMER_DCREAD (HZ / 2) /* D-Channel poll-cycle                    */
 
 #define ICN_CODE_STAGE1 4096    /* Size of bootcode                        */
 #define ICN_CODE_STAGE2 65536   /* Size of protocol-code                   */
@@ -140,7 +140,7 @@ typedef struct icn_card {
        int myid;               /* Driver-Nr. assigned by linklevel */
        int rvalid;             /* IO-portregion has been requested */
        int leased;             /* Flag: This Adapter is connected  */
-                               /*       to a leased line           */
+                               /*       to a leased line           */
        unsigned short flags;   /* Statusflags                      */
        int doubleS0;           /* Flag: ICN4B                      */
        int secondhalf;         /* Flag: Second half of a doubleS0  */
@@ -197,16 +197,16 @@ static icn_dev dev;
 
 /* Macros for accessing ports */
 #define ICN_CFG    (card->port)
-#define ICN_MAPRAM (card->port+1)
-#define ICN_RUN    (card->port+2)
-#define ICN_BANK   (card->port+3)
+#define ICN_MAPRAM (card->port + 1)
+#define ICN_RUN    (card->port + 2)
+#define ICN_BANK   (card->port + 3)
 
 /* Return true, if there is a free transmit-buffer */
-#define sbfree (((readb(&dev.shmem->data_control.scns)+1) & 0xf) != \
+#define sbfree (((readb(&dev.shmem->data_control.scns) + 1) & 0xf) !=  \
                readb(&dev.shmem->data_control.scnr))
 
 /* Switch to next transmit-buffer */
-#define sbnext (writeb((readb(&dev.shmem->data_control.scns)+1) & 0xf, \
+#define sbnext (writeb((readb(&dev.shmem->data_control.scns) + 1) & 0xf,       \
                       &dev.shmem->data_control.scns))
 
 /* Shortcuts for transmit-buffer-access */
@@ -220,7 +220,7 @@ static icn_dev dev;
                readb(&dev.shmem->data_control.ecns))
 
 /* Switch to next receive-buffer */
-#define rbnext (writeb((readb(&dev.shmem->data_control.ecnr)+1) & 0xf, \
+#define rbnext (writeb((readb(&dev.shmem->data_control.ecnr) + 1) & 0xf,       \
                       &dev.shmem->data_control.ecnr))
 
 /* Shortcuts for receive-buffer-access */
@@ -234,18 +234,18 @@ static icn_dev dev;
 #define cmd_i (dev.shmem->comm_control.pcio_i)
 
 /* Return free space in command-buffer */
-#define cmd_free ((readb(&cmd_i)>=readb(&cmd_o))? \
-                 0x100-readb(&cmd_i)+readb(&cmd_o): \
-                 readb(&cmd_o)-readb(&cmd_i))
+#define cmd_free ((readb(&cmd_i) >= readb(&cmd_o)) ?           \
+                 0x100 - readb(&cmd_i) + readb(&cmd_o) :       \
+                 readb(&cmd_o) - readb(&cmd_i))
 
 /* Shortcuts for message-buffer-access */
 #define msg_o (dev.shmem->comm_control.iopc_o)
 #define msg_i (dev.shmem->comm_control.iopc_i)
 
 /* Return length of Message, if avail. */
-#define msg_avail ((readb(&msg_o)>readb(&msg_i))? \
-                  0x100-readb(&msg_o)+readb(&msg_i): \
-                  readb(&msg_i)-readb(&msg_o))
+#define msg_avail ((readb(&msg_o) > readb(&msg_i)) ?           \
+                  0x100 - readb(&msg_o) + readb(&msg_i) :      \
+                  readb(&msg_i) - readb(&msg_o))
 
 #define CID (card->interface.id)
 
index d497db0..5405ec6 100644 (file)
@@ -35,7 +35,7 @@ static int isdnloop_addcard(char *);
  *   channel = channel number
  */
 static void
-isdnloop_free_queue(isdnloop_card * card, int channel)
+isdnloop_free_queue(isdnloop_card *card, int channel)
 {
        struct sk_buff_head *queue = &card->bqueue[channel];
 
@@ -52,7 +52,7 @@ isdnloop_free_queue(isdnloop_card * card, int channel)
  *   ch   = channel number (0-based)
  */
 static void
-isdnloop_bchan_send(isdnloop_card * card, int ch)
+isdnloop_bchan_send(isdnloop_card *card, int ch)
 {
        isdnloop_card *rcard = card->rcard[ch];
        int rch = card->rch[ch], len, ack;
@@ -66,7 +66,7 @@ isdnloop_bchan_send(isdnloop_card * card, int ch)
                        ack = *(skb->head); /* used as scratch area */
                        cmd.driver = card->myid;
                        cmd.arg = ch;
-                       if (rcard){
+                       if (rcard) {
                                rcard->interface.rcvcallb_skb(rcard->myid, rch, skb);
                        } else {
                                printk(KERN_WARNING "isdnloop: no rcard, skb dropped\n");
@@ -119,7 +119,7 @@ isdnloop_pollbchan(unsigned long data)
  *   cmd   = pointer to struct to be filled.
  */
 static void
-isdnloop_parse_setup(char *setup, isdn_ctrl * cmd)
+isdnloop_parse_setup(char *setup, isdn_ctrl *cmd)
 {
        char *t = setup;
        char *s = strchr(t, ',');
@@ -138,7 +138,7 @@ isdnloop_parse_setup(char *setup, isdn_ctrl * cmd)
                cmd->parm.setup.si2 = 0;
        else
                cmd->parm.setup.si2 =
-                   simple_strtoul(t, NULL, 10);
+                       simple_strtoul(t, NULL, 10);
        strlcpy(cmd->parm.setup.eazmsn, s, sizeof(cmd->parm.setup.eazmsn));
        cmd->parm.setup.plan = 0;
        cmd->parm.setup.screen = 0;
@@ -166,7 +166,7 @@ static isdnloop_stat isdnloop_stat_table[] =
        {"E_L1: ACT FAIL", ISDN_STAT_BHUP,  8}, /* Layer-1 activation failed  */
        {"E_L2: DATA LIN", ISDN_STAT_BHUP,  8}, /* Layer-2 data link lost     */
        {"E_L1: ACTIVATION FAILED",
-                          ISDN_STAT_BHUP,  8},         /* Layer-1 activation failed  */
+        ISDN_STAT_BHUP,  8},         /* Layer-1 activation failed  */
        {NULL, 0, -1}
 };
 /* *INDENT-ON* */
@@ -183,7 +183,7 @@ static isdnloop_stat isdnloop_stat_table[] =
  *   card    = card where message comes from.
  */
 static void
-isdnloop_parse_status(u_char * status, int channel, isdnloop_card * card)
+isdnloop_parse_status(u_char *status, int channel, isdnloop_card *card)
 {
        isdnloop_stat *s = isdnloop_stat_table;
        int action = -1;
@@ -202,69 +202,69 @@ isdnloop_parse_status(u_char * status, int channel, isdnloop_card * card)
        cmd.driver = card->myid;
        cmd.arg = channel;
        switch (action) {
-               case 1:
-                       /* BCON_x */
-                       card->flags |= (channel) ?
-                           ISDNLOOP_FLAGS_B2ACTIVE : ISDNLOOP_FLAGS_B1ACTIVE;
-                       break;
-               case 2:
-                       /* BDIS_x */
-                       card->flags &= ~((channel) ?
-                                        ISDNLOOP_FLAGS_B2ACTIVE : ISDNLOOP_FLAGS_B1ACTIVE);
-                       isdnloop_free_queue(card, channel);
-                       break;
-               case 3:
-                       /* DCAL_I and DSCA_I */
-                       isdnloop_parse_setup(status + 6, &cmd);
-                       break;
-               case 4:
-                       /* FCALL */
-                       sprintf(cmd.parm.setup.phone, "LEASED%d", card->myid);
-                       sprintf(cmd.parm.setup.eazmsn, "%d", channel + 1);
-                       cmd.parm.setup.si1 = 7;
-                       cmd.parm.setup.si2 = 0;
-                       cmd.parm.setup.plan = 0;
-                       cmd.parm.setup.screen = 0;
-                       break;
-               case 5:
-                       /* CIF */
-                       strlcpy(cmd.parm.num, status + 3, sizeof(cmd.parm.num));
-                       break;
-               case 6:
-                       /* AOC */
-                       snprintf(cmd.parm.num, sizeof(cmd.parm.num), "%d",
-                            (int) simple_strtoul(status + 7, NULL, 16));
-                       break;
-               case 7:
-                       /* CAU */
-                       status += 3;
-                       if (strlen(status) == 4)
-                               snprintf(cmd.parm.num, sizeof(cmd.parm.num), "%s%c%c",
-                                    status + 2, *status, *(status + 1));
-                       else
-                               strlcpy(cmd.parm.num, status + 1, sizeof(cmd.parm.num));
-                       break;
-               case 8:
-                       /* Misc Errors on L1 and L2 */
-                       card->flags &= ~ISDNLOOP_FLAGS_B1ACTIVE;
-                       isdnloop_free_queue(card, 0);
-                       cmd.arg = 0;
-                       cmd.driver = card->myid;
-                       card->interface.statcallb(&cmd);
-                       cmd.command = ISDN_STAT_DHUP;
-                       cmd.arg = 0;
-                       cmd.driver = card->myid;
-                       card->interface.statcallb(&cmd);
-                       cmd.command = ISDN_STAT_BHUP;
-                       card->flags &= ~ISDNLOOP_FLAGS_B2ACTIVE;
-                       isdnloop_free_queue(card, 1);
-                       cmd.arg = 1;
-                       cmd.driver = card->myid;
-                       card->interface.statcallb(&cmd);
-                       cmd.command = ISDN_STAT_DHUP;
-                       cmd.arg = 1;
-                       cmd.driver = card->myid;
-                       break;
+       case 1:
+               /* BCON_x */
+               card->flags |= (channel) ?
+                       ISDNLOOP_FLAGS_B2ACTIVE : ISDNLOOP_FLAGS_B1ACTIVE;
+               break;
+       case 2:
+               /* BDIS_x */
+               card->flags &= ~((channel) ?
+                                ISDNLOOP_FLAGS_B2ACTIVE : ISDNLOOP_FLAGS_B1ACTIVE);
+               isdnloop_free_queue(card, channel);
+               break;
+       case 3:
+               /* DCAL_I and DSCA_I */
+               isdnloop_parse_setup(status + 6, &cmd);
+               break;
+       case 4:
+               /* FCALL */
+               sprintf(cmd.parm.setup.phone, "LEASED%d", card->myid);
+               sprintf(cmd.parm.setup.eazmsn, "%d", channel + 1);
+               cmd.parm.setup.si1 = 7;
+               cmd.parm.setup.si2 = 0;
+               cmd.parm.setup.plan = 0;
+               cmd.parm.setup.screen = 0;
+               break;
+       case 5:
+               /* CIF */
+               strlcpy(cmd.parm.num, status + 3, sizeof(cmd.parm.num));
+               break;
+       case 6:
+               /* AOC */
+               snprintf(cmd.parm.num, sizeof(cmd.parm.num), "%d",
+                        (int) simple_strtoul(status + 7, NULL, 16));
+               break;
+       case 7:
+               /* CAU */
+               status += 3;
+               if (strlen(status) == 4)
+                       snprintf(cmd.parm.num, sizeof(cmd.parm.num), "%s%c%c",
+                                status + 2, *status, *(status + 1));
+               else
+                       strlcpy(cmd.parm.num, status + 1, sizeof(cmd.parm.num));
+               break;
+       case 8:
+               /* Misc Errors on L1 and L2 */
+               card->flags &= ~ISDNLOOP_FLAGS_B1ACTIVE;
+               isdnloop_free_queue(card, 0);
+               cmd.arg = 0;
+               cmd.driver = card->myid;
+               card->interface.statcallb(&cmd);
+               cmd.command = ISDN_STAT_DHUP;
+               cmd.arg = 0;
+               cmd.driver = card->myid;
+               card->interface.statcallb(&cmd);
+               cmd.command = ISDN_STAT_BHUP;
+               card->flags &= ~ISDNLOOP_FLAGS_B2ACTIVE;
+               isdnloop_free_queue(card, 1);
+               cmd.arg = 1;
+               cmd.driver = card->myid;
+               card->interface.statcallb(&cmd);
+               cmd.command = ISDN_STAT_DHUP;
+               cmd.arg = 1;
+               cmd.driver = card->myid;
+               break;
        }
        card->interface.statcallb(&cmd);
 }
@@ -277,7 +277,7 @@ isdnloop_parse_status(u_char * status, int channel, isdnloop_card * card)
  *   c    = char to store.
  */
 static void
-isdnloop_putmsg(isdnloop_card * card, unsigned char c)
+isdnloop_putmsg(isdnloop_card *card, unsigned char c)
 {
        ulong flags;
 
@@ -335,7 +335,7 @@ isdnloop_polldchan(unsigned long data)
                        card->imsg[card->iptr] = 0;
                        card->iptr = 0;
                        if (card->imsg[0] == '0' && card->imsg[1] >= '0' &&
-                         card->imsg[1] <= '2' && card->imsg[2] == ';') {
+                           card->imsg[1] <= '2' && card->imsg[2] == ';') {
                                ch = (card->imsg[1] - '0') - 1;
                                p = &card->imsg[3];
                                isdnloop_parse_status(p, ch, card);
@@ -397,7 +397,7 @@ isdnloop_polldchan(unsigned long data)
  *   Number of bytes transferred, -E??? on error
  */
 static int
-isdnloop_sendbuf(int channel, struct sk_buff *skb, isdnloop_card * card)
+isdnloop_sendbuf(int channel, struct sk_buff *skb, isdnloop_card *card)
 {
        int len = skb->len;
        unsigned long flags;
@@ -440,7 +440,7 @@ isdnloop_sendbuf(int channel, struct sk_buff *skb, isdnloop_card * card)
  *   number of bytes actually transferred.
  */
 static int
-isdnloop_readstatus(u_char __user *buf, int len, isdnloop_card * card)
+isdnloop_readstatus(u_char __user *buf, int len, isdnloop_card *card)
 {
        int count;
        u_char __user *p;
@@ -468,7 +468,7 @@ isdnloop_readstatus(u_char __user *buf, int len, isdnloop_card * card)
  *   0 on success, 1 on memory squeeze.
  */
 static int
-isdnloop_fake(isdnloop_card * card, char *s, int ch)
+isdnloop_fake(isdnloop_card *card, char *s, int ch)
 {
        struct sk_buff *skb;
        int len = strlen(s) + ((ch >= 0) ? 3 : 0);
@@ -517,7 +517,7 @@ static isdnloop_stat isdnloop_cmd_table[] =
  *   card = pointer to card struct.
  */
 static void
-isdnloop_fake_err(isdnloop_card * card)
+isdnloop_fake_err(isdnloop_card *card)
 {
        char buf[60];
 
@@ -543,19 +543,19 @@ static u_char ctable_1t[] =
  *   Pointer to buffer containing the assembled message.
  */
 static char *
-isdnloop_unicause(isdnloop_card * card, int loc, int cau)
+isdnloop_unicause(isdnloop_card *card, int loc, int cau)
 {
        static char buf[6];
 
        switch (card->ptype) {
-               case ISDN_PTYPE_EURO:
-                       sprintf(buf, "E%02X%02X", (loc) ? 4 : 2, ctable_eu[cau]);
-                       break;
-               case ISDN_PTYPE_1TR6:
-                       sprintf(buf, "%02X44", ctable_1t[cau]);
-                       break;
-               default:
-                       return ("0000");
+       case ISDN_PTYPE_EURO:
+               sprintf(buf, "E%02X%02X", (loc) ? 4 : 2, ctable_eu[cau]);
+               break;
+       case ISDN_PTYPE_1TR6:
+               sprintf(buf, "%02X44", ctable_1t[cau]);
+               break;
+       default:
+               return ("0000");
        }
        return (buf);
 }
@@ -569,7 +569,7 @@ isdnloop_unicause(isdnloop_card * card, int loc, int cau)
  *   ch   = channel (0-based)
  */
 static void
-isdnloop_atimeout(isdnloop_card * card, int ch)
+isdnloop_atimeout(isdnloop_card *card, int ch)
 {
        unsigned long flags;
        char buf[60];
@@ -615,7 +615,7 @@ isdnloop_atimeout1(unsigned long data)
  *   ch   = channel to watch for.
  */
 static void
-isdnloop_start_ctimer(isdnloop_card * card, int ch)
+isdnloop_start_ctimer(isdnloop_card *card, int ch)
 {
        unsigned long flags;
 
@@ -639,7 +639,7 @@ isdnloop_start_ctimer(isdnloop_card * card, int ch)
  *   ch   = channel (0-based).
  */
 static void
-isdnloop_kill_ctimer(isdnloop_card * card, int ch)
+isdnloop_kill_ctimer(isdnloop_card *card, int ch)
 {
        unsigned long flags;
 
@@ -668,7 +668,7 @@ static u_char bit2si[] =
  *   3 = found matching number but SI does not match.
  */
 static int
-isdnloop_try_call(isdnloop_card * card, char *p, int lch, isdn_ctrl * cmd)
+isdnloop_try_call(isdnloop_card *card, char *p, int lch, isdn_ctrl *cmd)
 {
        isdnloop_card *cc = cards;
        unsigned long flags;
@@ -686,19 +686,19 @@ isdnloop_try_call(isdnloop_card * card, char *p, int lch, isdn_ctrl * cmd)
                                continue;
                        num_match = 0;
                        switch (cc->ptype) {
-                               case ISDN_PTYPE_EURO:
-                                       for (i = 0; i < 3; i++)
-                                               if (!(strcmp(cc->s0num[i], cmd->parm.setup.phone)))
-                                                       num_match = 1;
-                                       break;
-                               case ISDN_PTYPE_1TR6:
-                                       e = cc->eazlist[ch];
-                                       while (*e) {
-                                               sprintf(nbuf, "%s%c", cc->s0num[0], *e);
-                                               if (!(strcmp(nbuf, cmd->parm.setup.phone)))
-                                                       num_match = 1;
-                                               e++;
-                                       }
+                       case ISDN_PTYPE_EURO:
+                               for (i = 0; i < 3; i++)
+                                       if (!(strcmp(cc->s0num[i], cmd->parm.setup.phone)))
+                                               num_match = 1;
+                               break;
+                       case ISDN_PTYPE_1TR6:
+                               e = cc->eazlist[ch];
+                               while (*e) {
+                                       sprintf(nbuf, "%s%c", cc->s0num[0], *e);
+                                       if (!(strcmp(nbuf, cmd->parm.setup.phone)))
+                                               num_match = 1;
+                                       e++;
+                               }
                        }
                        if (num_match) {
                                spin_lock_irqsave(&card->isdnloop_lock, flags);
@@ -741,7 +741,7 @@ isdnloop_try_call(isdnloop_card * card, char *p, int lch, isdn_ctrl * cmd)
  *   pointer to new phone number.
  */
 static char *
-isdnloop_vstphone(isdnloop_card * card, char *phone, int caller)
+isdnloop_vstphone(isdnloop_card *card, char *phone, int caller)
 {
        int i;
        static char nphone[30];
@@ -751,22 +751,22 @@ isdnloop_vstphone(isdnloop_card * card, char *phone, int caller)
                return "";
        }
        switch (card->ptype) {
-               case ISDN_PTYPE_EURO:
-                       if (caller) {
-                               for (i = 0; i < 2; i++)
-                                       if (!(strcmp(card->s0num[i], phone)))
-                                               return (phone);
-                               return (card->s0num[0]);
-                       }
-                       return (phone);
-                       break;
-               case ISDN_PTYPE_1TR6:
-                       if (caller) {
-                               sprintf(nphone, "%s%c", card->s0num[0], phone[0]);
-                               return (nphone);
-                       } else
-                               return (&phone[strlen(phone) - 1]);
-                       break;
+       case ISDN_PTYPE_EURO:
+               if (caller) {
+                       for (i = 0; i < 2; i++)
+                               if (!(strcmp(card->s0num[i], phone)))
+                                       return (phone);
+                       return (card->s0num[0]);
+               }
+               return (phone);
+               break;
+       case ISDN_PTYPE_1TR6:
+               if (caller) {
+                       sprintf(nphone, "%s%c", card->s0num[0], phone[0]);
+                       return (nphone);
+               } else
+                       return (&phone[strlen(phone) - 1]);
+               break;
        }
        return "";
 }
@@ -779,7 +779,7 @@ isdnloop_vstphone(isdnloop_card * card, char *phone, int caller)
  *   card = pointer to card struct.
  */
 static void
-isdnloop_parse_cmd(isdnloop_card * card)
+isdnloop_parse_cmd(isdnloop_card *card)
 {
        char *p = card->omsg;
        isdn_ctrl cmd;
@@ -813,141 +813,141 @@ isdnloop_parse_cmd(isdnloop_card * card)
        if (action == -1)
                return;
        switch (action) {
-               case 1:
-                       /* 0x;BCON_R */
-                       if (card->rcard[ch - 1]) {
-                               isdnloop_fake(card->rcard[ch - 1], "BCON_I",
-                                             card->rch[ch - 1] + 1);
-                               isdnloop_fake(card, "BCON_C", ch);
-                       }
-                       break;
-               case 17:
-                       /* 0x;BCON_I */
-                       if (card->rcard[ch - 1]) {
-                               isdnloop_fake(card->rcard[ch - 1], "BCON_C",
-                                             card->rch[ch - 1] + 1);
-                       }
-                       break;
-               case 2:
-                       /* 0x;BDIS_R */
-                       isdnloop_fake(card, "BDIS_C", ch);
-                       if (card->rcard[ch - 1]) {
-                               isdnloop_fake(card->rcard[ch - 1], "BDIS_I",
-                                             card->rch[ch - 1] + 1);
-                       }
-                       break;
-               case 16:
-                       /* 0x;DCON_R */
-                       isdnloop_kill_ctimer(card, ch - 1);
-                       if (card->rcard[ch - 1]) {
-                               isdnloop_kill_ctimer(card->rcard[ch - 1], card->rch[ch - 1]);
-                               isdnloop_fake(card->rcard[ch - 1], "DCON_C",
-                                             card->rch[ch - 1] + 1);
-                               isdnloop_fake(card, "DCON_C", ch);
-                       }
-                       break;
-               case 3:
-                       /* 0x;DDIS_R */
-                       isdnloop_kill_ctimer(card, ch - 1);
-                       if (card->rcard[ch - 1]) {
-                               isdnloop_kill_ctimer(card->rcard[ch - 1], card->rch[ch - 1]);
-                               isdnloop_fake(card->rcard[ch - 1], "DDIS_I",
-                                             card->rch[ch - 1] + 1);
-                               card->rcard[ch - 1] = NULL;
-                       }
-                       isdnloop_fake(card, "DDIS_C", ch);
-                       break;
-               case 4:
-                       /* 0x;DSCA_Rdd,yy,zz,oo */
-                       if (card->ptype != ISDN_PTYPE_1TR6) {
-                               isdnloop_fake_err(card);
-                               return;
-                       }
+       case 1:
+               /* 0x;BCON_R */
+               if (card->rcard[ch - 1]) {
+                       isdnloop_fake(card->rcard[ch - 1], "BCON_I",
+                                     card->rch[ch - 1] + 1);
+                       isdnloop_fake(card, "BCON_C", ch);
+               }
+               break;
+       case 17:
+               /* 0x;BCON_I */
+               if (card->rcard[ch - 1]) {
+                       isdnloop_fake(card->rcard[ch - 1], "BCON_C",
+                                     card->rch[ch - 1] + 1);
+               }
+               break;
+       case 2:
+               /* 0x;BDIS_R */
+               isdnloop_fake(card, "BDIS_C", ch);
+               if (card->rcard[ch - 1]) {
+                       isdnloop_fake(card->rcard[ch - 1], "BDIS_I",
+                                     card->rch[ch - 1] + 1);
+               }
+               break;
+       case 16:
+               /* 0x;DCON_R */
+               isdnloop_kill_ctimer(card, ch - 1);
+               if (card->rcard[ch - 1]) {
+                       isdnloop_kill_ctimer(card->rcard[ch - 1], card->rch[ch - 1]);
+                       isdnloop_fake(card->rcard[ch - 1], "DCON_C",
+                                     card->rch[ch - 1] + 1);
+                       isdnloop_fake(card, "DCON_C", ch);
+               }
+               break;
+       case 3:
+               /* 0x;DDIS_R */
+               isdnloop_kill_ctimer(card, ch - 1);
+               if (card->rcard[ch - 1]) {
+                       isdnloop_kill_ctimer(card->rcard[ch - 1], card->rch[ch - 1]);
+                       isdnloop_fake(card->rcard[ch - 1], "DDIS_I",
+                                     card->rch[ch - 1] + 1);
+                       card->rcard[ch - 1] = NULL;
+               }
+               isdnloop_fake(card, "DDIS_C", ch);
+               break;
+       case 4:
+               /* 0x;DSCA_Rdd,yy,zz,oo */
+               if (card->ptype != ISDN_PTYPE_1TR6) {
+                       isdnloop_fake_err(card);
+                       return;
+               }
+               /* Fall through */
+       case 5:
+               /* 0x;DCAL_Rdd,yy,zz,oo */
+               p += 6;
+               switch (isdnloop_try_call(card, p, ch - 1, &cmd)) {
+               case 0:
+                       /* Alerting */
+                       sprintf(buf, "D%s_I%s,%02d,%02d,%s",
+                               (action == 4) ? "SCA" : "CAL",
+                               isdnloop_vstphone(card, cmd.parm.setup.eazmsn, 1),
+                               cmd.parm.setup.si1,
+                               cmd.parm.setup.si2,
+                               isdnloop_vstphone(card->rcard[ch - 1],
+                                                 cmd.parm.setup.phone, 0));
+                       isdnloop_fake(card->rcard[ch - 1], buf, card->rch[ch - 1] + 1);
                        /* Fall through */
-               case 5:
-                       /* 0x;DCAL_Rdd,yy,zz,oo */
-                       p += 6;
-                       switch (isdnloop_try_call(card, p, ch - 1, &cmd)) {
-                               case 0:
-                                       /* Alerting */
-                                       sprintf(buf, "D%s_I%s,%02d,%02d,%s",
-                                          (action == 4) ? "SCA" : "CAL",
-                                               isdnloop_vstphone(card, cmd.parm.setup.eazmsn, 1),
-                                               cmd.parm.setup.si1,
-                                               cmd.parm.setup.si2,
-                                       isdnloop_vstphone(card->rcard[ch - 1],
-                                              cmd.parm.setup.phone, 0));
-                                       isdnloop_fake(card->rcard[ch - 1], buf, card->rch[ch - 1] + 1);
-                                       /* Fall through */
-                               case 3:
-                                       /* si1 does not match, don't alert but start timer */
-                                       isdnloop_start_ctimer(card, ch - 1);
-                                       break;
-                               case 1:
-                                       /* Remote busy */
-                                       isdnloop_fake(card, "DDIS_I", ch);
-                                       sprintf(buf, "CAU%s", isdnloop_unicause(card, 1, 1));
-                                       isdnloop_fake(card, buf, ch);
-                                       break;
-                               case 2:
-                                       /* No such user */
-                                       isdnloop_fake(card, "DDIS_I", ch);
-                                       sprintf(buf, "CAU%s", isdnloop_unicause(card, 1, 2));
-                                       isdnloop_fake(card, buf, ch);
-                                       break;
-                       }
-                       break;
-               case 6:
-                       /* 0x;EAZC */
-                       card->eazlist[ch - 1][0] = '\0';
-                       break;
-               case 7:
-                       /* 0x;EAZ */
-                       p += 3;
-                       strcpy(card->eazlist[ch - 1], p);
-                       break;
-               case 8:
-                       /* 0x;SEEAZ */
-                       sprintf(buf, "EAZ-LIST: %s", card->eazlist[ch - 1]);
-                       isdnloop_fake(card, buf, ch + 1);
-                       break;
-               case 9:
-                       /* 0x;MSN */
-                       break;
-               case 10:
-                       /* 0x;MSNALL */
-                       break;
-               case 11:
-                       /* 0x;SETSIL */
-                       p += 6;
-                       i = 0;
-                       while (strchr("0157", *p)) {
-                               if (i)
-                                       card->sil[ch - 1] |= si2bit[*p - '0'];
-                               i = (*p++ == '0');
-                       }
-                       if (*p)
-                               isdnloop_fake_err(card);
-                       break;
-               case 12:
-                       /* 0x;SEESIL */
-                       sprintf(buf, "SIN-LIST: ");
-                       p = buf + 10;
-                       for (i = 0; i < 3; i++)
-                               if (card->sil[ch - 1] & (1 << i))
-                                       p += sprintf(p, "%02d", bit2si[i]);
-                       isdnloop_fake(card, buf, ch + 1);
-                       break;
-               case 13:
-                       /* 0x;SILC */
-                       card->sil[ch - 1] = 0;
+               case 3:
+                       /* si1 does not match, don't alert but start timer */
+                       isdnloop_start_ctimer(card, ch - 1);
                        break;
-               case 14:
-                       /* 00;FV2ON */
+               case 1:
+                       /* Remote busy */
+                       isdnloop_fake(card, "DDIS_I", ch);
+                       sprintf(buf, "CAU%s", isdnloop_unicause(card, 1, 1));
+                       isdnloop_fake(card, buf, ch);
                        break;
-               case 15:
-                       /* 00;FV2OFF */
+               case 2:
+                       /* No such user */
+                       isdnloop_fake(card, "DDIS_I", ch);
+                       sprintf(buf, "CAU%s", isdnloop_unicause(card, 1, 2));
+                       isdnloop_fake(card, buf, ch);
                        break;
+               }
+               break;
+       case 6:
+               /* 0x;EAZC */
+               card->eazlist[ch - 1][0] = '\0';
+               break;
+       case 7:
+               /* 0x;EAZ */
+               p += 3;
+               strcpy(card->eazlist[ch - 1], p);
+               break;
+       case 8:
+               /* 0x;SEEAZ */
+               sprintf(buf, "EAZ-LIST: %s", card->eazlist[ch - 1]);
+               isdnloop_fake(card, buf, ch + 1);
+               break;
+       case 9:
+               /* 0x;MSN */
+               break;
+       case 10:
+               /* 0x;MSNALL */
+               break;
+       case 11:
+               /* 0x;SETSIL */
+               p += 6;
+               i = 0;
+               while (strchr("0157", *p)) {
+                       if (i)
+                               card->sil[ch - 1] |= si2bit[*p - '0'];
+                       i = (*p++ == '0');
+               }
+               if (*p)
+                       isdnloop_fake_err(card);
+               break;
+       case 12:
+               /* 0x;SEESIL */
+               sprintf(buf, "SIN-LIST: ");
+               p = buf + 10;
+               for (i = 0; i < 3; i++)
+                       if (card->sil[ch - 1] & (1 << i))
+                               p += sprintf(p, "%02d", bit2si[i]);
+               isdnloop_fake(card, buf, ch + 1);
+               break;
+       case 13:
+               /* 0x;SILC */
+               card->sil[ch - 1] = 0;
+               break;
+       case 14:
+               /* 00;FV2ON */
+               break;
+       case 15:
+               /* 00;FV2OFF */
+               break;
        }
 }
 
@@ -966,7 +966,7 @@ isdnloop_parse_cmd(isdnloop_card * card)
  *   number of bytes transferred (currently always equals len).
  */
 static int
-isdnloop_writecmd(const u_char * buf, int len, int user, isdnloop_card * card)
+isdnloop_writecmd(const u_char *buf, int len, int user, isdnloop_card *card)
 {
        int xcount = 0;
        int ocount = 1;
@@ -1016,7 +1016,7 @@ isdnloop_writecmd(const u_char * buf, int len, int user, isdnloop_card * card)
  * Delete card's pending timers, send STOP to linklevel
  */
 static void
-isdnloop_stopcard(isdnloop_card * card)
+isdnloop_stopcard(isdnloop_card *card)
 {
        unsigned long flags;
        isdn_ctrl cmd;
@@ -1061,7 +1061,7 @@ isdnloop_stopallcards(void)
  *   0 on success, -E??? otherwise.
  */
 static int
-isdnloop_start(isdnloop_card * card, isdnloop_sdef * sdefp)
+isdnloop_start(isdnloop_card *card, isdnloop_sdef *sdefp)
 {
        unsigned long flags;
        isdnloop_sdef sdef;
@@ -1073,40 +1073,40 @@ isdnloop_start(isdnloop_card * card, isdnloop_sdef * sdefp)
                return -EFAULT;
        spin_lock_irqsave(&card->isdnloop_lock, flags);
        switch (sdef.ptype) {
-               case ISDN_PTYPE_EURO:
-                       if (isdnloop_fake(card, "DRV1.23EC-Q.931-CAPI-CNS-BASIS-20.02.96",
-                                         -1)) {
-                               spin_unlock_irqrestore(&card->isdnloop_lock, flags);
-                               return -ENOMEM;
-                       }
-                       card->sil[0] = card->sil[1] = 4;
-                       if (isdnloop_fake(card, "TEI OK", 0)) {
-                               spin_unlock_irqrestore(&card->isdnloop_lock, flags);
-                               return -ENOMEM;
-                       }
-                       for (i = 0; i < 3; i++)
-                               strcpy(card->s0num[i], sdef.num[i]);
-                       break;
-               case ISDN_PTYPE_1TR6:
-                       if (isdnloop_fake(card, "DRV1.04TC-1TR6-CAPI-CNS-BASIS-29.11.95",
-                                         -1)) {
-                               spin_unlock_irqrestore(&card->isdnloop_lock, flags);
-                               return -ENOMEM;
-                       }
-                       card->sil[0] = card->sil[1] = 4;
-                       if (isdnloop_fake(card, "TEI OK", 0)) {
-                               spin_unlock_irqrestore(&card->isdnloop_lock, flags);
-                               return -ENOMEM;
-                       }
-                       strcpy(card->s0num[0], sdef.num[0]);
-                       card->s0num[1][0] = '\0';
-                       card->s0num[2][0] = '\0';
-                       break;
-               default:
+       case ISDN_PTYPE_EURO:
+               if (isdnloop_fake(card, "DRV1.23EC-Q.931-CAPI-CNS-BASIS-20.02.96",
+                                 -1)) {
                        spin_unlock_irqrestore(&card->isdnloop_lock, flags);
-                       printk(KERN_WARNING "isdnloop: Illegal D-channel protocol %d\n",
-                              sdef.ptype);
-                       return -EINVAL;
+                       return -ENOMEM;
+               }
+               card->sil[0] = card->sil[1] = 4;
+               if (isdnloop_fake(card, "TEI OK", 0)) {
+                       spin_unlock_irqrestore(&card->isdnloop_lock, flags);
+                       return -ENOMEM;
+               }
+               for (i = 0; i < 3; i++)
+                       strcpy(card->s0num[i], sdef.num[i]);
+               break;
+       case ISDN_PTYPE_1TR6:
+               if (isdnloop_fake(card, "DRV1.04TC-1TR6-CAPI-CNS-BASIS-29.11.95",
+                                 -1)) {
+                       spin_unlock_irqrestore(&card->isdnloop_lock, flags);
+                       return -ENOMEM;
+               }
+               card->sil[0] = card->sil[1] = 4;
+               if (isdnloop_fake(card, "TEI OK", 0)) {
+                       spin_unlock_irqrestore(&card->isdnloop_lock, flags);
+                       return -ENOMEM;
+               }
+               strcpy(card->s0num[0], sdef.num[0]);
+               card->s0num[1][0] = '\0';
+               card->s0num[2][0] = '\0';
+               break;
+       default:
+               spin_unlock_irqrestore(&card->isdnloop_lock, flags);
+               printk(KERN_WARNING "isdnloop: Illegal D-channel protocol %d\n",
+                      sdef.ptype);
+               return -EINVAL;
        }
        init_timer(&card->st_timer);
        card->st_timer.expires = jiffies + ISDNLOOP_TIMER_DCREAD;
@@ -1122,7 +1122,7 @@ isdnloop_start(isdnloop_card * card, isdnloop_sdef * sdefp)
  * Main handler for commands sent by linklevel.
  */
 static int
-isdnloop_command(isdn_ctrl * c, isdnloop_card * card)
+isdnloop_command(isdn_ctrl *c, isdnloop_card *card)
 {
        ulong a;
        int i;
@@ -1131,215 +1131,215 @@ isdnloop_command(isdn_ctrl * c, isdnloop_card * card)
        isdnloop_cdef cdef;
 
        switch (c->command) {
-               case ISDN_CMD_IOCTL:
-                       memcpy(&a, c->parm.num, sizeof(ulong));
-                       switch (c->arg) {
-                               case ISDNLOOP_IOCTL_DEBUGVAR:
-                                       return (ulong) card;
-                               case ISDNLOOP_IOCTL_STARTUP:
-                                       if (!access_ok(VERIFY_READ, (void *) a, sizeof(isdnloop_sdef)))
-                                               return -EFAULT;
-                                       return (isdnloop_start(card, (isdnloop_sdef *) a));
-                                       break;
-                               case ISDNLOOP_IOCTL_ADDCARD:
-                                       if (copy_from_user((char *)&cdef,
-                                                          (char *)a,
-                                                          sizeof(cdef)))
-                                               return -EFAULT;
-                                       return (isdnloop_addcard(cdef.id1));
-                                       break;
-                               case ISDNLOOP_IOCTL_LEASEDCFG:
-                                       if (a) {
-                                               if (!card->leased) {
-                                                       card->leased = 1;
-                                                       while (card->ptype == ISDN_PTYPE_UNKNOWN)
-                                                               schedule_timeout_interruptible(10);
-                                                       schedule_timeout_interruptible(10);
-                                                       sprintf(cbuf, "00;FV2ON\n01;EAZ1\n02;EAZ2\n");
-                                                       i = isdnloop_writecmd(cbuf, strlen(cbuf), 0, card);
-                                                       printk(KERN_INFO
-                                                              "isdnloop: (%s) Leased-line mode enabled\n",
-                                                              CID);
-                                                       cmd.command = ISDN_STAT_RUN;
-                                                       cmd.driver = card->myid;
-                                                       cmd.arg = 0;
-                                                       card->interface.statcallb(&cmd);
-                                               }
-                                       } else {
-                                               if (card->leased) {
-                                                       card->leased = 0;
-                                                       sprintf(cbuf, "00;FV2OFF\n");
-                                                       i = isdnloop_writecmd(cbuf, strlen(cbuf), 0, card);
-                                                       printk(KERN_INFO
-                                                              "isdnloop: (%s) Leased-line mode disabled\n",
-                                                              CID);
-                                                       cmd.command = ISDN_STAT_RUN;
-                                                       cmd.driver = card->myid;
-                                                       cmd.arg = 0;
-                                                       card->interface.statcallb(&cmd);
-                                               }
-                                       }
-                                       return 0;
-                               default:
-                                       return -EINVAL;
+       case ISDN_CMD_IOCTL:
+               memcpy(&a, c->parm.num, sizeof(ulong));
+               switch (c->arg) {
+               case ISDNLOOP_IOCTL_DEBUGVAR:
+                       return (ulong) card;
+               case ISDNLOOP_IOCTL_STARTUP:
+                       if (!access_ok(VERIFY_READ, (void *) a, sizeof(isdnloop_sdef)))
+                               return -EFAULT;
+                       return (isdnloop_start(card, (isdnloop_sdef *) a));
+                       break;
+               case ISDNLOOP_IOCTL_ADDCARD:
+                       if (copy_from_user((char *)&cdef,
+                                          (char *)a,
+                                          sizeof(cdef)))
+                               return -EFAULT;
+                       return (isdnloop_addcard(cdef.id1));
+                       break;
+               case ISDNLOOP_IOCTL_LEASEDCFG:
+                       if (a) {
+                               if (!card->leased) {
+                                       card->leased = 1;
+                                       while (card->ptype == ISDN_PTYPE_UNKNOWN)
+                                               schedule_timeout_interruptible(10);
+                                       schedule_timeout_interruptible(10);
+                                       sprintf(cbuf, "00;FV2ON\n01;EAZ1\n02;EAZ2\n");
+                                       i = isdnloop_writecmd(cbuf, strlen(cbuf), 0, card);
+                                       printk(KERN_INFO
+                                              "isdnloop: (%s) Leased-line mode enabled\n",
+                                              CID);
+                                       cmd.command = ISDN_STAT_RUN;
+                                       cmd.driver = card->myid;
+                                       cmd.arg = 0;
+                                       card->interface.statcallb(&cmd);
+                               }
+                       } else {
+                               if (card->leased) {
+                                       card->leased = 0;
+                                       sprintf(cbuf, "00;FV2OFF\n");
+                                       i = isdnloop_writecmd(cbuf, strlen(cbuf), 0, card);
+                                       printk(KERN_INFO
+                                              "isdnloop: (%s) Leased-line mode disabled\n",
+                                              CID);
+                                       cmd.command = ISDN_STAT_RUN;
+                                       cmd.driver = card->myid;
+                                       cmd.arg = 0;
+                                       card->interface.statcallb(&cmd);
+                               }
                        }
+                       return 0;
+               default:
+                       return -EINVAL;
+               }
+               break;
+       case ISDN_CMD_DIAL:
+               if (!(card->flags & ISDNLOOP_FLAGS_RUNNING))
+                       return -ENODEV;
+               if (card->leased)
                        break;
-               case ISDN_CMD_DIAL:
-                       if (!(card->flags & ISDNLOOP_FLAGS_RUNNING))
-                               return -ENODEV;
-                       if (card->leased)
-                               break;
-                       if ((c->arg & 255) < ISDNLOOP_BCH) {
-                               char *p;
-                               char dial[50];
-                               char dcode[4];
-
-                               a = c->arg;
-                               p = c->parm.setup.phone;
-                               if (*p == 's' || *p == 'S') {
-                                       /* Dial for SPV */
-                                       p++;
-                                       strcpy(dcode, "SCA");
-                               } else
-                                       /* Normal Dial */
-                                       strcpy(dcode, "CAL");
-                               strcpy(dial, p);
-                               sprintf(cbuf, "%02d;D%s_R%s,%02d,%02d,%s\n", (int) (a + 1),
-                                       dcode, dial, c->parm.setup.si1,
+               if ((c->arg & 255) < ISDNLOOP_BCH) {
+                       char *p;
+                       char dial[50];
+                       char dcode[4];
+
+                       a = c->arg;
+                       p = c->parm.setup.phone;
+                       if (*p == 's' || *p == 'S') {
+                               /* Dial for SPV */
+                               p++;
+                               strcpy(dcode, "SCA");
+                       } else
+                               /* Normal Dial */
+                               strcpy(dcode, "CAL");
+                       strcpy(dial, p);
+                       sprintf(cbuf, "%02d;D%s_R%s,%02d,%02d,%s\n", (int) (a + 1),
+                               dcode, dial, c->parm.setup.si1,
                                c->parm.setup.si2, c->parm.setup.eazmsn);
+                       i = isdnloop_writecmd(cbuf, strlen(cbuf), 0, card);
+               }
+               break;
+       case ISDN_CMD_ACCEPTD:
+               if (!(card->flags & ISDNLOOP_FLAGS_RUNNING))
+                       return -ENODEV;
+               if (c->arg < ISDNLOOP_BCH) {
+                       a = c->arg + 1;
+                       cbuf[0] = 0;
+                       switch (card->l2_proto[a - 1]) {
+                       case ISDN_PROTO_L2_X75I:
+                               sprintf(cbuf, "%02d;BX75\n", (int) a);
+                               break;
+#ifdef CONFIG_ISDN_X25
+                       case ISDN_PROTO_L2_X25DTE:
+                               sprintf(cbuf, "%02d;BX2T\n", (int) a);
+                               break;
+                       case ISDN_PROTO_L2_X25DCE:
+                               sprintf(cbuf, "%02d;BX2C\n", (int) a);
+                               break;
+#endif
+                       case ISDN_PROTO_L2_HDLC:
+                               sprintf(cbuf, "%02d;BTRA\n", (int) a);
+                               break;
+                       }
+                       if (strlen(cbuf))
                                i = isdnloop_writecmd(cbuf, strlen(cbuf), 0, card);
+                       sprintf(cbuf, "%02d;DCON_R\n", (int) a);
+                       i = isdnloop_writecmd(cbuf, strlen(cbuf), 0, card);
+               }
+               break;
+       case ISDN_CMD_ACCEPTB:
+               if (!(card->flags & ISDNLOOP_FLAGS_RUNNING))
+                       return -ENODEV;
+               if (c->arg < ISDNLOOP_BCH) {
+                       a = c->arg + 1;
+                       switch (card->l2_proto[a - 1]) {
+                       case ISDN_PROTO_L2_X75I:
+                               sprintf(cbuf, "%02d;BCON_R,BX75\n", (int) a);
+                               break;
+#ifdef CONFIG_ISDN_X25
+                       case ISDN_PROTO_L2_X25DTE:
+                               sprintf(cbuf, "%02d;BCON_R,BX2T\n", (int) a);
+                               break;
+                       case ISDN_PROTO_L2_X25DCE:
+                               sprintf(cbuf, "%02d;BCON_R,BX2C\n", (int) a);
+                               break;
+#endif
+                       case ISDN_PROTO_L2_HDLC:
+                               sprintf(cbuf, "%02d;BCON_R,BTRA\n", (int) a);
+                               break;
+                       default:
+                               sprintf(cbuf, "%02d;BCON_R\n", (int) a);
                        }
+                       printk(KERN_DEBUG "isdnloop writecmd '%s'\n", cbuf);
+                       i = isdnloop_writecmd(cbuf, strlen(cbuf), 0, card);
                        break;
-               case ISDN_CMD_ACCEPTD:
+               case ISDN_CMD_HANGUP:
                        if (!(card->flags & ISDNLOOP_FLAGS_RUNNING))
                                return -ENODEV;
                        if (c->arg < ISDNLOOP_BCH) {
                                a = c->arg + 1;
-                               cbuf[0] = 0;
-                               switch (card->l2_proto[a - 1]) {
-                                       case ISDN_PROTO_L2_X75I:
-                                               sprintf(cbuf, "%02d;BX75\n", (int) a);
-                                               break;
-#ifdef CONFIG_ISDN_X25
-                                       case ISDN_PROTO_L2_X25DTE:
-                                               sprintf(cbuf, "%02d;BX2T\n", (int) a);
-                                               break;
-                                       case ISDN_PROTO_L2_X25DCE:
-                                               sprintf(cbuf, "%02d;BX2C\n", (int) a);
-                                               break;
-#endif
-                                       case ISDN_PROTO_L2_HDLC:
-                                               sprintf(cbuf, "%02d;BTRA\n", (int) a);
-                                               break;
-                               }
-                               if (strlen(cbuf))
-                                       i = isdnloop_writecmd(cbuf, strlen(cbuf), 0, card);
-                               sprintf(cbuf, "%02d;DCON_R\n", (int) a);
+                               sprintf(cbuf, "%02d;BDIS_R\n%02d;DDIS_R\n", (int) a, (int) a);
                                i = isdnloop_writecmd(cbuf, strlen(cbuf), 0, card);
                        }
                        break;
-               case ISDN_CMD_ACCEPTB:
+               case ISDN_CMD_SETEAZ:
                        if (!(card->flags & ISDNLOOP_FLAGS_RUNNING))
                                return -ENODEV;
+                       if (card->leased)
+                               break;
                        if (c->arg < ISDNLOOP_BCH) {
                                a = c->arg + 1;
-                               switch (card->l2_proto[a - 1]) {
-                                       case ISDN_PROTO_L2_X75I:
-                                               sprintf(cbuf, "%02d;BCON_R,BX75\n", (int) a);
-                                               break;
-#ifdef CONFIG_ISDN_X25
-                                       case ISDN_PROTO_L2_X25DTE:
-                                               sprintf(cbuf, "%02d;BCON_R,BX2T\n", (int) a);
-                                               break;
-                                       case ISDN_PROTO_L2_X25DCE:
-                                               sprintf(cbuf, "%02d;BCON_R,BX2C\n", (int) a);
-                                               break;
-#endif
-                                       case ISDN_PROTO_L2_HDLC:
-                                               sprintf(cbuf, "%02d;BCON_R,BTRA\n", (int) a);
-                                               break;
-                                       default:
-                                               sprintf(cbuf, "%02d;BCON_R\n", (int) a);
-                               }
-                               printk(KERN_DEBUG "isdnloop writecmd '%s'\n", cbuf);
+                               if (card->ptype == ISDN_PTYPE_EURO) {
+                                       sprintf(cbuf, "%02d;MS%s%s\n", (int) a,
+                                               c->parm.num[0] ? "N" : "ALL", c->parm.num);
+                               } else
+                                       sprintf(cbuf, "%02d;EAZ%s\n", (int) a,
+                                               c->parm.num[0] ? c->parm.num : (u_char *) "0123456789");
                                i = isdnloop_writecmd(cbuf, strlen(cbuf), 0, card);
-                               break;
-               case ISDN_CMD_HANGUP:
-                               if (!(card->flags & ISDNLOOP_FLAGS_RUNNING))
-                                       return -ENODEV;
-                               if (c->arg < ISDNLOOP_BCH) {
-                                       a = c->arg + 1;
-                                       sprintf(cbuf, "%02d;BDIS_R\n%02d;DDIS_R\n", (int) a, (int) a);
-                                       i = isdnloop_writecmd(cbuf, strlen(cbuf), 0, card);
-                               }
-                               break;
-               case ISDN_CMD_SETEAZ:
-                               if (!(card->flags & ISDNLOOP_FLAGS_RUNNING))
-                                       return -ENODEV;
-                               if (card->leased)
-                                       break;
-                               if (c->arg < ISDNLOOP_BCH) {
-                                       a = c->arg + 1;
-                                       if (card->ptype == ISDN_PTYPE_EURO) {
-                                               sprintf(cbuf, "%02d;MS%s%s\n", (int) a,
-                                                       c->parm.num[0] ? "N" : "ALL", c->parm.num);
-                                       } else
-                                               sprintf(cbuf, "%02d;EAZ%s\n", (int) a,
-                                                       c->parm.num[0] ? c->parm.num : (u_char *) "0123456789");
-                                       i = isdnloop_writecmd(cbuf, strlen(cbuf), 0, card);
-                               }
-                               break;
+                       }
+                       break;
                case ISDN_CMD_CLREAZ:
-                               if (!(card->flags & ISDNLOOP_FLAGS_RUNNING))
-                                       return -ENODEV;
-                               if (card->leased)
-                                       break;
-                               if (c->arg < ISDNLOOP_BCH) {
-                                       a = c->arg + 1;
-                                       if (card->ptype == ISDN_PTYPE_EURO)
-                                               sprintf(cbuf, "%02d;MSNC\n", (int) a);
-                                       else
-                                               sprintf(cbuf, "%02d;EAZC\n", (int) a);
-                                       i = isdnloop_writecmd(cbuf, strlen(cbuf), 0, card);
-                               }
+                       if (!(card->flags & ISDNLOOP_FLAGS_RUNNING))
+                               return -ENODEV;
+                       if (card->leased)
                                break;
+                       if (c->arg < ISDNLOOP_BCH) {
+                               a = c->arg + 1;
+                               if (card->ptype == ISDN_PTYPE_EURO)
+                                       sprintf(cbuf, "%02d;MSNC\n", (int) a);
+                               else
+                                       sprintf(cbuf, "%02d;EAZC\n", (int) a);
+                               i = isdnloop_writecmd(cbuf, strlen(cbuf), 0, card);
+                       }
+                       break;
                case ISDN_CMD_SETL2:
-                               if (!(card->flags & ISDNLOOP_FLAGS_RUNNING))
-                                       return -ENODEV;
-                               if ((c->arg & 255) < ISDNLOOP_BCH) {
-                                       a = c->arg;
-                                       switch (a >> 8) {
-                                               case ISDN_PROTO_L2_X75I:
-                                                       sprintf(cbuf, "%02d;BX75\n", (int) (a & 255) + 1);
-                                                       break;
+                       if (!(card->flags & ISDNLOOP_FLAGS_RUNNING))
+                               return -ENODEV;
+                       if ((c->arg & 255) < ISDNLOOP_BCH) {
+                               a = c->arg;
+                               switch (a >> 8) {
+                               case ISDN_PROTO_L2_X75I:
+                                       sprintf(cbuf, "%02d;BX75\n", (int) (a & 255) + 1);
+                                       break;
 #ifdef CONFIG_ISDN_X25
-                                               case ISDN_PROTO_L2_X25DTE:
-                                                       sprintf(cbuf, "%02d;BX2T\n", (int) (a & 255) + 1);
-                                                       break;
-                                               case ISDN_PROTO_L2_X25DCE:
-                                                       sprintf(cbuf, "%02d;BX2C\n", (int) (a & 255) + 1);
-                                                       break;
+                               case ISDN_PROTO_L2_X25DTE:
+                                       sprintf(cbuf, "%02d;BX2T\n", (int) (a & 255) + 1);
+                                       break;
+                               case ISDN_PROTO_L2_X25DCE:
+                                       sprintf(cbuf, "%02d;BX2C\n", (int) (a & 255) + 1);
+                                       break;
 #endif
-                                               case ISDN_PROTO_L2_HDLC:
-                                                       sprintf(cbuf, "%02d;BTRA\n", (int) (a & 255) + 1);
-                                                       break;
-                                               case ISDN_PROTO_L2_TRANS:
-                                                       sprintf(cbuf, "%02d;BTRA\n", (int) (a & 255) + 1);
-                                                       break;
-                                               default:
-                                                       return -EINVAL;
-                                       }
-                                       i = isdnloop_writecmd(cbuf, strlen(cbuf), 0, card);
-                                       card->l2_proto[a & 255] = (a >> 8);
+                               case ISDN_PROTO_L2_HDLC:
+                                       sprintf(cbuf, "%02d;BTRA\n", (int) (a & 255) + 1);
+                                       break;
+                               case ISDN_PROTO_L2_TRANS:
+                                       sprintf(cbuf, "%02d;BTRA\n", (int) (a & 255) + 1);
+                                       break;
+                               default:
+                                       return -EINVAL;
                                }
-                               break;
+                               i = isdnloop_writecmd(cbuf, strlen(cbuf), 0, card);
+                               card->l2_proto[a & 255] = (a >> 8);
+                       }
+                       break;
                case ISDN_CMD_SETL3:
-                               if (!(card->flags & ISDNLOOP_FLAGS_RUNNING))
-                                       return -ENODEV;
-                               return 0;
+                       if (!(card->flags & ISDNLOOP_FLAGS_RUNNING))
+                               return -ENODEV;
+                       return 0;
                default:
-                               return -EINVAL;
-                       }
+                       return -EINVAL;
+               }
        }
        return 0;
 }
@@ -1364,7 +1364,7 @@ isdnloop_findcard(int driverid)
  * Wrapper functions for interface to linklevel
  */
 static int
-if_command(isdn_ctrl * c)
+if_command(isdn_ctrl *c)
 {
        isdnloop_card *card = isdnloop_findcard(c->driver);
 
@@ -1434,12 +1434,12 @@ isdnloop_initcard(char *id)
 
        if (!(card = kzalloc(sizeof(isdnloop_card), GFP_KERNEL))) {
                printk(KERN_WARNING
-                "isdnloop: (%s) Could not allocate card-struct.\n", id);
+                      "isdnloop: (%s) Could not allocate card-struct.\n", id);
                return (isdnloop_card *) 0;
        }
        card->interface.owner = THIS_MODULE;
        card->interface.channels = ISDNLOOP_BCH;
-       card->interface.hl_hdrlen  = 1; /* scratch area for storing ack flag*/ 
+       card->interface.hl_hdrlen  = 1; /* scratch area for storing ack flag*/
        card->interface.maxbufsize = 4000;
        card->interface.command = if_command;
        card->interface.writebuf_skb = if_sendbuf;
@@ -1447,12 +1447,12 @@ isdnloop_initcard(char *id)
        card->interface.readstat = if_readstatus;
        card->interface.features = ISDN_FEATURE_L2_X75I |
 #ifdef CONFIG_ISDN_X25
-           ISDN_FEATURE_L2_X25DTE |
-           ISDN_FEATURE_L2_X25DCE |
+               ISDN_FEATURE_L2_X25DTE |
+               ISDN_FEATURE_L2_X25DCE |
 #endif
-           ISDN_FEATURE_L2_HDLC |
-           ISDN_FEATURE_L3_TRANS |
-           ISDN_FEATURE_P_UNKNOWN;
+               ISDN_FEATURE_L2_HDLC |
+               ISDN_FEATURE_L3_TRANS |
+               ISDN_FEATURE_P_UNKNOWN;
        card->ptype = ISDN_PTYPE_UNKNOWN;
        strlcpy(card->interface.id, id, sizeof(card->interface.id));
        card->msg_buf_write = card->msg_buf;
index 0d458a8..e9e0355 100644 (file)
@@ -55,7 +55,7 @@ typedef struct isdnloop_sdef {
 #define ISDNLOOP_FLAGS_RBTIMER  8      /* scheduling of B-Channel-poll  */
 #define ISDNLOOP_TIMER_BCREAD 1 /* B-Channel poll-cycle          */
 #define ISDNLOOP_TIMER_DCREAD (HZ/2)   /* D-Channel poll-cycle          */
-#define ISDNLOOP_TIMER_ALERTWAIT (10*HZ)       /* Alert timeout                 */
+#define ISDNLOOP_TIMER_ALERTWAIT (10 * HZ)     /* Alert timeout                 */
 #define ISDNLOOP_MAX_SQUEUE 65536      /* Max. outstanding send-data    */
 #define ISDNLOOP_BCH 2          /* channels per card             */
 
@@ -79,7 +79,7 @@ typedef struct isdnloop_card {
        struct timer_list st_timer;     /* Timer for Status-Polls           */
        struct timer_list rb_timer;     /* Timer for B-Channel-Polls        */
        struct timer_list
-        c_timer[ISDNLOOP_BCH]; /* Timer for Alerting               */
+       c_timer[ISDNLOOP_BCH]; /* Timer for Alerting               */
        int l2_proto[ISDNLOOP_BCH];     /* Current layer-2-protocol         */
        isdn_if interface;      /* Interface to upper layer         */
        int iptr;               /* Index to imsg-buffer             */
@@ -92,7 +92,7 @@ typedef struct isdnloop_card {
        char *msg_buf_end;      /* Pointer to end of statusbuffer   */
        int sndcount[ISDNLOOP_BCH];     /* Byte-counters for B-Ch.-send     */
        struct sk_buff_head
-        bqueue[ISDNLOOP_BCH];  /* B-Channel queues                 */
+       bqueue[ISDNLOOP_BCH];  /* B-Channel queues                 */
        struct sk_buff_head dqueue;     /* D-Channel queue                  */
        spinlock_t isdnloop_lock;
 } isdnloop_card;
index 7418f2d..693fb7c 100644 (file)
  * Quick API description:
  *
  * A clock source registers using mISDN_register_clock:
- *     name = text string to name clock source
+ *     name = text string to name clock source
  *     priority = value to priorize clock sources (0 = default)
  *     ctl = callback function to enable/disable clock source
  *     priv = private pointer of clock source
- *     return = pointer to clock source structure;
+ *     return = pointer to clock source structure;
  *
  * Note: Callback 'ctl' can be called before mISDN_register_clock returns!
  *       Also it can be called during mISDN_unregister_clock.
@@ -74,14 +74,14 @@ select_iclock(void)
                /* last used clock source still exists but changes, disable */
                if (*debug & DEBUG_CLOCK)
                        printk(KERN_DEBUG "Old clock source '%s' disable.\n",
-                               lastclock->name);
+                              lastclock->name);
                lastclock->ctl(lastclock->priv, 0);
        }
        if (bestclock && bestclock != iclock_current) {
                /* new clock source selected, enable */
                if (*debug & DEBUG_CLOCK)
                        printk(KERN_DEBUG "New clock source '%s' enable.\n",
-                               bestclock->name);
+                              bestclock->name);
                bestclock->ctl(bestclock->priv, 1);
        }
        if (bestclock != iclock_current) {
@@ -104,7 +104,7 @@ struct mISDNclock
                printk(KERN_ERR "%s: No memory for clock entry.\n", __func__);
                return NULL;
        }
-       strncpy(iclock->name, name, sizeof(iclock->name)-1);
+       strncpy(iclock->name, name, sizeof(iclock->name) - 1);
        iclock->pri = pri;
        iclock->priv = priv;
        iclock->ctl = ctl;
@@ -123,13 +123,13 @@ mISDN_unregister_clock(struct mISDNclock *iclock)
 
        if (*debug & (DEBUG_CORE | DEBUG_CLOCK))
                printk(KERN_DEBUG "%s: %s %d\n", __func__, iclock->name,
-                       iclock->pri);
+                      iclock->pri);
        write_lock_irqsave(&iclock_lock, flags);
        if (iclock_current == iclock) {
                if (*debug & DEBUG_CLOCK)
                        printk(KERN_DEBUG
-                               "Current clock source '%s' unregisters.\n",
-                               iclock->name);
+                              "Current clock source '%s' unregisters.\n",
+                              iclock->name);
                iclock->ctl(iclock->priv, 0);
        }
        list_del(&iclock->list);
@@ -149,9 +149,9 @@ mISDN_clock_update(struct mISDNclock *iclock, int samples, struct timeval *tv)
        write_lock_irqsave(&iclock_lock, flags);
        if (iclock_current != iclock) {
                printk(KERN_ERR "%s: '%s' sends us clock updates, but we do "
-                       "listen to '%s'. This is a bug!\n", __func__,
-                       iclock->name,
-                       iclock_current ? iclock_current->name : "nothing");
+                      "listen to '%s'. This is a bug!\n", __func__,
+                      iclock->name,
+                      iclock_current ? iclock_current->name : "nothing");
                iclock->ctl(iclock->priv, 0);
                write_unlock_irqrestore(&iclock_lock, flags);
                return;
@@ -185,7 +185,7 @@ mISDN_clock_update(struct mISDNclock *iclock, int samples, struct timeval *tv)
                iclock_tv_valid = 1;
                if (*debug & DEBUG_CLOCK)
                        printk("Received first clock from source '%s'.\n",
-                           iclock_current ? iclock_current->name : "nothing");
+                              iclock_current ? iclock_current->name : "nothing");
        }
        write_unlock_irqrestore(&iclock_lock, flags);
 }
@@ -215,4 +215,3 @@ mISDN_clock_get(void)
        return count;
 }
 EXPORT_SYMBOL(mISDN_clock_get);
-
index afeebb0..a24530f 100644 (file)
@@ -38,7 +38,7 @@ static void mISDN_dev_release(struct device *dev)
 }
 
 static ssize_t _show_id(struct device *dev,
-                               struct device_attribute *attr, char *buf)
+                       struct device_attribute *attr, char *buf)
 {
        struct mISDNdevice *mdev = dev_to_mISDN(dev);
 
@@ -48,7 +48,7 @@ static ssize_t _show_id(struct device *dev,
 }
 
 static ssize_t _show_nrbchan(struct device *dev,
-                               struct device_attribute *attr, char *buf)
+                            struct device_attribute *attr, char *buf)
 {
        struct mISDNdevice *mdev = dev_to_mISDN(dev);
 
@@ -58,7 +58,7 @@ static ssize_t _show_nrbchan(struct device *dev,
 }
 
 static ssize_t _show_d_protocols(struct device *dev,
-                               struct device_attribute *attr, char *buf)
+                                struct device_attribute *attr, char *buf)
 {
        struct mISDNdevice *mdev = dev_to_mISDN(dev);
 
@@ -68,7 +68,7 @@ static ssize_t _show_d_protocols(struct device *dev,
 }
 
 static ssize_t _show_b_protocols(struct device *dev,
-                               struct device_attribute *attr, char *buf)
+                                struct device_attribute *attr, char *buf)
 {
        struct mISDNdevice *mdev = dev_to_mISDN(dev);
 
@@ -78,7 +78,7 @@ static ssize_t _show_b_protocols(struct device *dev,
 }
 
 static ssize_t _show_protocol(struct device *dev,
-                               struct device_attribute *attr, char *buf)
+                             struct device_attribute *attr, char *buf)
 {
        struct mISDNdevice *mdev = dev_to_mISDN(dev);
 
@@ -88,7 +88,7 @@ static ssize_t _show_protocol(struct device *dev,
 }
 
 static ssize_t _show_name(struct device *dev,
-                               struct device_attribute *attr, char *buf)
+                         struct device_attribute *attr, char *buf)
 {
        strcpy(buf, dev_name(dev));
        return strlen(buf);
@@ -96,7 +96,7 @@ static ssize_t _show_name(struct device *dev,
 
 #if 0 /* hangs */
 static ssize_t _set_name(struct device *dev, struct device_attribute *attr,
-                               const char *buf, size_t count)
+                        const char *buf, size_t count)
 {
        int err = 0;
        char *out = kmalloc(count + 1, GFP_KERNEL);
@@ -136,7 +136,7 @@ static struct device_attribute mISDN_dev_attrs[] = {
        __ATTR(channelmap,  S_IRUGO,         _show_channelmap,  NULL),
        __ATTR(nrbchan,     S_IRUGO,         _show_nrbchan,     NULL),
        __ATTR(name,        S_IRUGO,         _show_name,        NULL),
-/*     __ATTR(name,        S_IRUGO|S_IWUSR, _show_name,       _set_name), */
+/*     __ATTR(name,        S_IRUGO | S_IWUSR, _show_name,      _set_name), */
        {}
 };
 
@@ -187,7 +187,7 @@ struct mISDNdevice
 *get_mdevice(u_int id)
 {
        return dev_to_mISDN(class_find_device(&mISDN_class, NULL, &id,
-               _get_mdevice));
+                                             _get_mdevice));
 }
 
 static int
@@ -221,7 +221,7 @@ get_free_devid(void)
 
 int
 mISDN_register_device(struct mISDNdevice *dev,
-                       struct device *parent, char *name)
+                     struct device *parent, char *name)
 {
        int     err;
 
@@ -237,7 +237,7 @@ mISDN_register_device(struct mISDNdevice *dev,
                dev_set_name(&dev->dev, "mISDN%d", dev->id);
        if (debug & DEBUG_CORE)
                printk(KERN_DEBUG "mISDN_register %s %d\n",
-                       dev_name(&dev->dev), dev->id);
+                      dev_name(&dev->dev), dev->id);
        err = create_stack(dev);
        if (err)
                goto error1;
@@ -265,7 +265,7 @@ void
 mISDN_unregister_device(struct mISDNdevice *dev) {
        if (debug & DEBUG_CORE)
                printk(KERN_DEBUG "mISDN_unregister %s %d\n",
-                       dev_name(&dev->dev), dev->id);
+                      dev_name(&dev->dev), dev->id);
        /* sysfs_remove_link(&dev->dev.kobj, "device"); */
        device_del(&dev->dev);
        dev_set_drvdata(&dev->dev, NULL);
@@ -311,7 +311,7 @@ get_Bprotocol4id(u_int id)
 
        if (id < ISDN_P_B_START || id > 63) {
                printk(KERN_WARNING "%s id not in range  %d\n",
-                   __func__, id);
+                      __func__, id);
                return NULL;
        }
        m = 1 << (id & ISDN_P_B_MASK);
@@ -326,12 +326,12 @@ mISDN_register_Bprotocol(struct Bprotocol *bp)
 
        if (debug & DEBUG_CORE)
                printk(KERN_DEBUG "%s: %s/%x\n", __func__,
-                   bp->name, bp->Bprotocols);
+                      bp->name, bp->Bprotocols);
        old = get_Bprotocol4mask(bp->Bprotocols);
        if (old) {
                printk(KERN_WARNING
-                   "register duplicate protocol old %s/%x new %s/%x\n",
-                   old->name, old->Bprotocols, bp->name, bp->Bprotocols);
+                      "register duplicate protocol old %s/%x new %s/%x\n",
+                      old->name, old->Bprotocols, bp->name, bp->Bprotocols);
                return -EBUSY;
        }
        write_lock_irqsave(&bp_lock, flags);
@@ -348,7 +348,7 @@ mISDN_unregister_Bprotocol(struct Bprotocol *bp)
 
        if (debug & DEBUG_CORE)
                printk(KERN_DEBUG "%s: %s/%x\n", __func__, bp->name,
-                       bp->Bprotocols);
+                      bp->Bprotocols);
        write_lock_irqsave(&bp_lock, flags);
        list_del(&bp->list);
        write_unlock_irqrestore(&bp_lock, flags);
@@ -361,7 +361,7 @@ mISDNInit(void)
        int     err;
 
        printk(KERN_INFO "Modular ISDN core version %d.%d.%d\n",
-               MISDN_MAJOR_VERSION, MISDN_MINOR_VERSION, MISDN_RELEASE);
+              MISDN_MAJOR_VERSION, MISDN_MINOR_VERSION, MISDN_RELEASE);
        mISDN_init_clock(&debug);
        mISDN_initstack(&debug);
        err = class_register(&mISDN_class);
@@ -406,4 +406,3 @@ static void mISDN_cleanup(void)
 
 module_init(mISDNInit);
 module_exit(mISDN_cleanup);
-
index 7ac2f81..52695bb 100644 (file)
@@ -45,11 +45,11 @@ extern int                  get_mdevice_count(void);
 #define MGR_OPT_NETWORK                25
 
 extern int     connect_Bstack(struct mISDNdevice *, struct mISDNchannel *,
-                       u_int, struct sockaddr_mISDN *);
+                              u_int, struct sockaddr_mISDN *);
 extern int     connect_layer1(struct mISDNdevice *, struct mISDNchannel *,
-                       u_int, struct sockaddr_mISDN *);
+                              u_int, struct sockaddr_mISDN *);
 extern int     create_l2entity(struct mISDNdevice *, struct mISDNchannel *,
-                       u_int, struct sockaddr_mISDN *);
+                               u_int, struct sockaddr_mISDN *);
 
 extern int     create_stack(struct mISDNdevice *);
 extern int     create_teimanager(struct mISDNdevice *);
@@ -71,7 +71,7 @@ extern void   mISDN_timer_cleanup(void);
 
 extern int     l1_init(u_int *);
 extern void    l1_cleanup(void);
-extern int     Isdnl2_Init(u_int *);
+extern int     Isdnl2_Init(u_int *);
 extern void    Isdnl2_cleanup(void);
 
 extern void    mISDN_init_clock(u_int *);
index 8549431..afe4173 100644 (file)
@@ -24,8 +24,8 @@
  * bit 1 = enable hfc hardware acceleration for all channels
  *
  */
-#define DSP_OPT_ULAW           (1<<0)
-#define DSP_OPT_NOHARDWARE     (1<<1)
+#define DSP_OPT_ULAW           (1 << 0)
+#define DSP_OPT_NOHARDWARE     (1 << 1)
 
 #include <linux/timer.h>
 #include <linux/workqueue.h>
@@ -97,12 +97,12 @@ struct dsp_conf_member {
 struct dsp_conf {
        struct list_head        list;
        u32                     id;
-                               /* all cmx stacks with the same ID are
-                                connected */
+       /* all cmx stacks with the same ID are
+          connected */
        struct list_head        mlist;
        int                     software; /* conf is processed by software */
        int                     hardware; /* conf is processed by hardware */
-                               /* note: if both unset, has only one member */
+       /* note: if both unset, has only one member */
 };
 
 
@@ -122,7 +122,7 @@ struct dsp_dtmf {
        int             hardware; /* dtmf uses hardware decoding */
        int             size; /* number of bytes in buffer */
        signed short    buffer[DSP_DTMF_NPOINTS];
-               /* buffers one full dtmf frame */
+       /* buffers one full dtmf frame */
        u8              lastwhat, lastdigit;
        int             count;
        u8              digits[16]; /* dtmf result */
@@ -189,7 +189,7 @@ struct dsp {
        u32             conf_id;
        struct dsp_conf *conf;
        struct dsp_conf_member
-                       *member;
+       *member;
 
        /* buffer stuff */
        int             rx_W; /* current write pos for data without timestamp */
@@ -203,7 +203,7 @@ struct dsp {
        u8              rx_buff[CMX_BUFF_SIZE];
        int             last_tx; /* if set, we transmitted last poll interval */
        int             cmx_delay; /* initial delay of buffers,
-                               or 0 for dynamic jitter buffer */
+                                     or 0 for dynamic jitter buffer */
        int             tx_dejitter; /* if set, dejitter tx buffer */
        int             tx_data; /* enables tx-data of CMX to upper layer */
 
@@ -231,7 +231,7 @@ struct dsp {
        int             bf_sync;
 
        struct dsp_pipeline
-                       pipeline;
+       pipeline;
 };
 
 /* functions */
@@ -253,7 +253,7 @@ extern int dsp_cmx_del_conf(struct dsp_conf *conf);
 extern void dsp_dtmf_goertzel_init(struct dsp *dsp);
 extern void dsp_dtmf_hardware(struct dsp *dsp);
 extern u8 *dsp_dtmf_goertzel_decode(struct dsp *dsp, u8 *data, int len,
-               int fmt);
+                                   int fmt);
 
 extern int dsp_tone(struct dsp *dsp, int tone);
 extern void dsp_tone_copy(struct dsp *dsp, u8 *data, int len);
@@ -270,7 +270,6 @@ extern int  dsp_pipeline_init(struct dsp_pipeline *pipeline);
 extern void dsp_pipeline_destroy(struct dsp_pipeline *pipeline);
 extern int  dsp_pipeline_build(struct dsp_pipeline *pipeline, const char *cfg);
 extern void dsp_pipeline_process_tx(struct dsp_pipeline *pipeline, u8 *data,
-               int len);
+                                   int len);
 extern void dsp_pipeline_process_rx(struct dsp_pipeline *pipeline, u8 *data,
-               int len, unsigned int txlen);
-
+                                   int len, unsigned int txlen);
index b8f18bd..0602295 100644 (file)
@@ -61,7 +61,7 @@ static inline unsigned char linear2alaw(short int linear)
        }
 
        /* Convert the scaled magnitude to segment number. */
-       for (seg = 0;  seg < 8;  seg++) {
+       for (seg = 0; seg < 8; seg++) {
                if (pcm_val <= seg_end[seg])
                        break;
        }
@@ -263,7 +263,7 @@ dsp_audio_generate_mix_table(void)
                                sample = 32767;
                        if (sample < -32768)
                                sample = -32768;
-                       dsp_audio_mix_law[(i<<8)|j] =
+                       dsp_audio_mix_law[(i << 8) | j] =
                                dsp_audio_s16_to_law[sample & 0xffff];
                        j++;
                }
@@ -431,4 +431,3 @@ dsp_change_volume(struct sk_buff *skb, int volume)
                i++;
        }
 }
-
index 038191b..c0c933a 100644 (file)
@@ -38,7 +38,7 @@ struct biquad2_state {
 };
 
 static inline void biquad2_init(struct biquad2_state *bq,
-    int32_t gain, int32_t a1, int32_t a2, int32_t b1, int32_t b2)
+                               int32_t gain, int32_t a1, int32_t a2, int32_t b1, int32_t b2)
 {
        bq->gain = gain;
        bq->a1 = a1;
@@ -55,8 +55,8 @@ static inline int16_t biquad2(struct biquad2_state *bq, int16_t sample)
        int32_t y;
        int32_t z0;
 
-       z0 = sample*bq->gain + bq->z1*bq->a1 + bq->z2*bq->a2;
-       y = z0 + bq->z1*bq->b1 + bq->z2*bq->b2;
+       z0 = sample * bq->gain + bq->z1 * bq->a1 + bq->z2 * bq->a2;
+       y = z0 + bq->z1 * bq->b1 + bq->z2 * bq->b2;
 
        bq->z2 = bq->z1;
        bq->z1 = z0 >> 15;
index 18e411e..0aa572f 100644 (file)
@@ -354,8 +354,8 @@ static const u32 bf_sbox[256 * 4] = {
 #define GET32_1(x) (((x) >> (16)) & (0xff))
 #define GET32_0(x) (((x) >> (24)) & (0xff))
 
-#define bf_F(x) (((S[GET32_0(x)] + S[256 + GET32_1(x)]) ^ \
-    S[512 + GET32_2(x)]) + S[768 + GET32_3(x)])
+#define bf_F(x) (((S[GET32_0(x)] + S[256 + GET32_1(x)]) ^      \
+                 S[512 + GET32_2(x)]) + S[768 + GET32_3(x)])
 
 #define EROUND(a, b, n)  do { b ^= P[n]; a ^= bf_F(b); } while (0)
 #define DROUND(a, b, n)  do { a ^= bf_F(b); b ^= P[n]; } while (0)
@@ -388,17 +388,17 @@ dsp_bf_encrypt(struct dsp *dsp, u8 *data, int len)
                j = 0;
                /* transcode 9 samples xlaw to 8 bytes */
                yl = dsp_audio_law2seven[bf_data_in[0]];
-               yl = (yl<<7) | dsp_audio_law2seven[bf_data_in[1]];
-               yl = (yl<<7) | dsp_audio_law2seven[bf_data_in[2]];
-               yl = (yl<<7) | dsp_audio_law2seven[bf_data_in[3]];
+               yl = (yl << 7) | dsp_audio_law2seven[bf_data_in[1]];
+               yl = (yl << 7) | dsp_audio_law2seven[bf_data_in[2]];
+               yl = (yl << 7) | dsp_audio_law2seven[bf_data_in[3]];
                nibble = dsp_audio_law2seven[bf_data_in[4]];
                yr = nibble;
-               yl = (yl<<4) | (nibble>>3);
-               yr = (yr<<7) | dsp_audio_law2seven[bf_data_in[5]];
-               yr = (yr<<7) | dsp_audio_law2seven[bf_data_in[6]];
-               yr = (yr<<7) | dsp_audio_law2seven[bf_data_in[7]];
-               yr = (yr<<7) | dsp_audio_law2seven[bf_data_in[8]];
-               yr = (yr<<1) | (bf_data_in[0] & 1);
+               yl = (yl << 4) | (nibble >> 3);
+               yr = (yr << 7) | dsp_audio_law2seven[bf_data_in[5]];
+               yr = (yr << 7) | dsp_audio_law2seven[bf_data_in[6]];
+               yr = (yr << 7) | dsp_audio_law2seven[bf_data_in[7]];
+               yr = (yr << 7) | dsp_audio_law2seven[bf_data_in[8]];
+               yr = (yr << 1) | (bf_data_in[0] & 1);
 
                /* fill unused bit with random noise of audio input */
                /* encrypt */
@@ -423,24 +423,24 @@ dsp_bf_encrypt(struct dsp *dsp, u8 *data, int len)
                yr ^= P[17];
 
                /* calculate 3-bit checksumme */
-               cs = yl ^ (yl>>3) ^ (yl>>6) ^ (yl>>9) ^ (yl>>12) ^ (yl>>15)
-                       ^ (yl>>18) ^ (yl>>21) ^ (yl>>24) ^ (yl>>27) ^ (yl>>30)
-                       ^ (yr<<2) ^ (yr>>1) ^ (yr>>4) ^ (yr>>7) ^ (yr>>10)
-                       ^ (yr>>13) ^ (yr>>16) ^ (yr>>19) ^ (yr>>22) ^ (yr>>25)
-                       ^ (yr>>28) ^ (yr>>31);
+               cs = yl ^ (yl >> 3) ^ (yl >> 6) ^ (yl >> 9) ^ (yl >> 12) ^ (yl >> 15)
+                       ^ (yl >> 18) ^ (yl >> 21) ^ (yl >> 24) ^ (yl >> 27) ^ (yl >> 30)
+                       ^ (yr << 2) ^ (yr >> 1) ^ (yr >> 4) ^ (yr >> 7) ^ (yr >> 10)
+                       ^ (yr >> 13) ^ (yr >> 16) ^ (yr >> 19) ^ (yr >> 22) ^ (yr >> 25)
+                       ^ (yr >> 28) ^ (yr >> 31);
 
                /*
                 * transcode 8 crypted bytes to 9 data bytes with sync
                 * and checksum information
                 */
-               bf_crypt_out[0] = (yl>>25) | 0x80;
-               bf_crypt_out[1] = (yl>>18) & 0x7f;
-               bf_crypt_out[2] = (yl>>11) & 0x7f;
-               bf_crypt_out[3] = (yl>>4) & 0x7f;
-               bf_crypt_out[4] = ((yl<<3) & 0x78) | ((yr>>29) & 0x07);
-               bf_crypt_out[5] = ((yr>>22) & 0x7f) | ((cs<<5) & 0x80);
-               bf_crypt_out[6] = ((yr>>15) & 0x7f) | ((cs<<6) & 0x80);
-               bf_crypt_out[7] = ((yr>>8) & 0x7f) | (cs<<7);
+               bf_crypt_out[0] = (yl >> 25) | 0x80;
+               bf_crypt_out[1] = (yl >> 18) & 0x7f;
+               bf_crypt_out[2] = (yl >> 11) & 0x7f;
+               bf_crypt_out[3] = (yl >> 4) & 0x7f;
+               bf_crypt_out[4] = ((yl << 3) & 0x78) | ((yr >> 29) & 0x07);
+               bf_crypt_out[5] = ((yr >> 22) & 0x7f) | ((cs << 5) & 0x80);
+               bf_crypt_out[6] = ((yr >> 15) & 0x7f) | ((cs << 6) & 0x80);
+               bf_crypt_out[7] = ((yr >> 8) & 0x7f) | (cs << 7);
                bf_crypt_out[8] = yr;
        }
 
@@ -474,45 +474,45 @@ dsp_bf_decrypt(struct dsp *dsp, u8 *data, int len)
                 * shift upper bit and rotate data to buffer ring
                 * send current decrypted data
                 */
-               sync = (sync<<1) | ((*data)>>7);
+               sync = (sync << 1) | ((*data) >> 7);
                bf_crypt_inring[j++ & 15] = *data;
                *data++ = bf_data_out[k++];
                i++;
                if (k == 9)
                        k = 0; /* repeat if no sync has been found */
                /* check if not in sync */
-               if ((sync&0x1f0) != 0x100)
+               if ((sync & 0x1f0) != 0x100)
                        continue;
                j -= 9;
                /* transcode receive data to 64 bit block of encrypted data */
                yl = bf_crypt_inring[j++ & 15];
-               yl = (yl<<7) | bf_crypt_inring[j++ & 15]; /* bit7 = 0 */
-               yl = (yl<<7) | bf_crypt_inring[j++ & 15]; /* bit7 = 0 */
-               yl = (yl<<7) | bf_crypt_inring[j++ & 15]; /* bit7 = 0 */
+               yl = (yl << 7) | bf_crypt_inring[j++ & 15]; /* bit7 = 0 */
+               yl = (yl << 7) | bf_crypt_inring[j++ & 15]; /* bit7 = 0 */
+               yl = (yl << 7) | bf_crypt_inring[j++ & 15]; /* bit7 = 0 */
                nibble = bf_crypt_inring[j++ & 15]; /* bit7 = 0 */
                yr = nibble;
-               yl = (yl<<4) | (nibble>>3);
+               yl = (yl << 4) | (nibble >> 3);
                cs2 = bf_crypt_inring[j++ & 15];
-               yr = (yr<<7) | (cs2 & 0x7f);
+               yr = (yr << 7) | (cs2 & 0x7f);
                cs1 = bf_crypt_inring[j++ & 15];
-               yr = (yr<<7) | (cs1 & 0x7f);
+               yr = (yr << 7) | (cs1 & 0x7f);
                cs0 = bf_crypt_inring[j++ & 15];
-               yr = (yr<<7) | (cs0 & 0x7f);
-               yr = (yr<<8) | bf_crypt_inring[j++ & 15];
+               yr = (yr << 7) | (cs0 & 0x7f);
+               yr = (yr << 8) | bf_crypt_inring[j++ & 15];
 
                /* calculate 3-bit checksumme */
-               cs = yl ^ (yl>>3) ^ (yl>>6) ^ (yl>>9) ^ (yl>>12) ^ (yl>>15)
-                       ^ (yl>>18) ^ (yl>>21) ^ (yl>>24) ^ (yl>>27) ^ (yl>>30)
-                       ^ (yr<<2) ^ (yr>>1) ^ (yr>>4) ^ (yr>>7) ^ (yr>>10)
-                       ^ (yr>>13) ^ (yr>>16) ^ (yr>>19) ^ (yr>>22) ^ (yr>>25)
-                       ^ (yr>>28) ^ (yr>>31);
+               cs = yl ^ (yl >> 3) ^ (yl >> 6) ^ (yl >> 9) ^ (yl >> 12) ^ (yl >> 15)
+                       ^ (yl >> 18) ^ (yl >> 21) ^ (yl >> 24) ^ (yl >> 27) ^ (yl >> 30)
+                       ^ (yr << 2) ^ (yr >> 1) ^ (yr >> 4) ^ (yr >> 7) ^ (yr >> 10)
+                       ^ (yr >> 13) ^ (yr >> 16) ^ (yr >> 19) ^ (yr >> 22) ^ (yr >> 25)
+                       ^ (yr >> 28) ^ (yr >> 31);
 
                /* check if frame is valid */
-               if ((cs&0x7) != (((cs2>>5)&4) | ((cs1>>6)&2) | (cs0 >> 7))) {
+               if ((cs & 0x7) != (((cs2 >> 5) & 4) | ((cs1 >> 6) & 2) | (cs0 >> 7))) {
                        if (dsp_debug & DEBUG_DSP_BLOWFISH)
                                printk(KERN_DEBUG
-                                   "DSP BLOWFISH: received corrupt frame, "
-                                   "checksumme is not correct\n");
+                                      "DSP BLOWFISH: received corrupt frame, "
+                                      "checksumme is not correct\n");
                        continue;
                }
 
@@ -537,17 +537,17 @@ dsp_bf_decrypt(struct dsp *dsp, u8 *data, int len)
                DROUND(yr, yl, 0);
 
                /* transcode 8 crypted bytes to 9 sample bytes */
-               bf_data_out[0] = dsp_audio_seven2law[(yl>>25) & 0x7f];
-               bf_data_out[1] = dsp_audio_seven2law[(yl>>18) & 0x7f];
-               bf_data_out[2] = dsp_audio_seven2law[(yl>>11) & 0x7f];
-               bf_data_out[3] = dsp_audio_seven2law[(yl>>4) & 0x7f];
-               bf_data_out[4] = dsp_audio_seven2law[((yl<<3) & 0x78) |
-                   ((yr>>29) & 0x07)];
-
-               bf_data_out[5] = dsp_audio_seven2law[(yr>>22) & 0x7f];
-               bf_data_out[6] = dsp_audio_seven2law[(yr>>15) & 0x7f];
-               bf_data_out[7] = dsp_audio_seven2law[(yr>>8) & 0x7f];
-               bf_data_out[8] = dsp_audio_seven2law[(yr>>1) & 0x7f];
+               bf_data_out[0] = dsp_audio_seven2law[(yl >> 25) & 0x7f];
+               bf_data_out[1] = dsp_audio_seven2law[(yl >> 18) & 0x7f];
+               bf_data_out[2] = dsp_audio_seven2law[(yl >> 11) & 0x7f];
+               bf_data_out[3] = dsp_audio_seven2law[(yl >> 4) & 0x7f];
+               bf_data_out[4] = dsp_audio_seven2law[((yl << 3) & 0x78) |
+                                                    ((yr >> 29) & 0x07)];
+
+               bf_data_out[5] = dsp_audio_seven2law[(yr >> 22) & 0x7f];
+               bf_data_out[6] = dsp_audio_seven2law[(yr >> 15) & 0x7f];
+               bf_data_out[7] = dsp_audio_seven2law[(yr >> 8) & 0x7f];
+               bf_data_out[8] = dsp_audio_seven2law[(yr >> 1) & 0x7f];
                k = 0; /* start with new decoded frame */
        }
 
@@ -631,9 +631,9 @@ dsp_bf_init(struct dsp *dsp, const u8 *key, uint keylen)
        /* Actual subkey generation */
        for (j = 0, i = 0; i < 16 + 2; i++) {
                temp = (((u32)key[j] << 24) |
-                   ((u32)key[(j + 1) % keylen] << 16) |
-                   ((u32)key[(j + 2) % keylen] << 8) |
-                   ((u32)key[(j + 3) % keylen]));
+                       ((u32)key[(j + 1) % keylen] << 16) |
+                       ((u32)key[(j + 2) % keylen] << 8) |
+                       ((u32)key[(j + 3) % keylen]));
 
                P[i] = P[i] ^ temp;
                j = (j + 4) % keylen;
index 4d395de..334feab 100644 (file)
@@ -165,8 +165,8 @@ dsp_cmx_debug(struct dsp *dsp)
        printk(KERN_DEBUG "-----Current DSP\n");
        list_for_each_entry(odsp, &dsp_ilist, list) {
                printk(KERN_DEBUG "* %s hardecho=%d softecho=%d txmix=%d",
-                   odsp->name, odsp->echo.hardware, odsp->echo.software,
-                   odsp->tx_mix);
+                      odsp->name, odsp->echo.hardware, odsp->echo.software,
+                      odsp->tx_mix);
                if (odsp->conf)
                        printk(" (Conf %d)", odsp->conf->id);
                if (dsp == odsp)
@@ -178,14 +178,14 @@ dsp_cmx_debug(struct dsp *dsp)
                printk(KERN_DEBUG "* Conf %d (%p)\n", conf->id, conf);
                list_for_each_entry(member, &conf->mlist, list) {
                        printk(KERN_DEBUG
-                           "  - member = %s (slot_tx %d, bank_tx %d, "
-                           "slot_rx %d, bank_rx %d hfc_conf %d "
-                           "tx_data %d rx_is_off %d)%s\n",
-                           member->dsp->name, member->dsp->pcm_slot_tx,
-                           member->dsp->pcm_bank_tx, member->dsp->pcm_slot_rx,
-                           member->dsp->pcm_bank_rx, member->dsp->hfc_conf,
-                           member->dsp->tx_data, member->dsp->rx_is_off,
-                           (member->dsp == dsp) ? " *this*" : "");
+                              "  - member = %s (slot_tx %d, bank_tx %d, "
+                              "slot_rx %d, bank_rx %d hfc_conf %d "
+                              "tx_data %d rx_is_off %d)%s\n",
+                              member->dsp->name, member->dsp->pcm_slot_tx,
+                              member->dsp->pcm_bank_tx, member->dsp->pcm_slot_rx,
+                              member->dsp->pcm_bank_rx, member->dsp->hfc_conf,
+                              member->dsp->tx_data, member->dsp->rx_is_off,
+                              (member->dsp == dsp) ? " *this*" : "");
                }
        }
        printk(KERN_DEBUG "-----end\n");
@@ -227,13 +227,13 @@ dsp_cmx_add_conf_member(struct dsp *dsp, struct dsp_conf *conf)
        }
        if (dsp->member) {
                printk(KERN_WARNING "%s: dsp is already member in a conf.\n",
-                       __func__);
+                      __func__);
                return -EINVAL;
        }
 
        if (dsp->conf) {
                printk(KERN_WARNING "%s: dsp is already in a conf.\n",
-                       __func__);
+                      __func__);
                return -EINVAL;
        }
 
@@ -268,19 +268,19 @@ dsp_cmx_del_conf_member(struct dsp *dsp)
 
        if (!dsp) {
                printk(KERN_WARNING "%s: dsp is 0.\n",
-                       __func__);
+                      __func__);
                return -EINVAL;
        }
 
        if (!dsp->conf) {
                printk(KERN_WARNING "%s: dsp is not in a conf.\n",
-                       __func__);
+                      __func__);
                return -EINVAL;
        }
 
        if (list_empty(&dsp->conf->mlist)) {
                printk(KERN_WARNING "%s: dsp has linked an empty conf.\n",
-                       __func__);
+                      __func__);
                return -EINVAL;
        }
 
@@ -295,8 +295,8 @@ dsp_cmx_del_conf_member(struct dsp *dsp)
                }
        }
        printk(KERN_WARNING
-           "%s: dsp is not present in its own conf_meber list.\n",
-           __func__);
+              "%s: dsp is not present in its own conf_meber list.\n",
+              __func__);
 
        return -EINVAL;
 }
@@ -312,7 +312,7 @@ static struct dsp_conf
 
        if (!id) {
                printk(KERN_WARNING "%s: id is 0.\n",
-                   __func__);
+                      __func__);
                return NULL;
        }
 
@@ -338,13 +338,13 @@ dsp_cmx_del_conf(struct dsp_conf *conf)
 {
        if (!conf) {
                printk(KERN_WARNING "%s: conf is null.\n",
-                   __func__);
+                      __func__);
                return -EINVAL;
        }
 
        if (!list_empty(&conf->mlist)) {
                printk(KERN_WARNING "%s: conf not empty.\n",
-                   __func__);
+                      __func__);
                return -EINVAL;
        }
        list_del(&conf->list);
@@ -359,7 +359,7 @@ dsp_cmx_del_conf(struct dsp_conf *conf)
  */
 static void
 dsp_cmx_hw_message(struct dsp *dsp, u32 message, u32 param1, u32 param2,
-    u32 param3, u32 param4)
+                  u32 param3, u32 param4)
 {
        struct mISDN_ctrl_req cq;
 
@@ -389,7 +389,7 @@ dsp_cmx_hardware(struct dsp_conf *conf, struct dsp *dsp)
        int             freeunits[8];
        u_char          freeslots[256];
        int             same_hfc = -1, same_pcm = -1, current_conf = -1,
-           all_conf = 1, tx_data = 0;
+               all_conf = 1, tx_data = 0;
 
        /* dsp gets updated (no conf) */
        if (!conf) {
@@ -397,17 +397,17 @@ dsp_cmx_hardware(struct dsp_conf *conf, struct dsp *dsp)
                        return;
                if (dsp_debug & DEBUG_DSP_CMX)
                        printk(KERN_DEBUG "%s checking dsp %s\n",
-                           __func__, dsp->name);
-one_member:
+                              __func__, dsp->name);
+       one_member:
                /* remove HFC conference if enabled */
                if (dsp->hfc_conf >= 0) {
                        if (dsp_debug & DEBUG_DSP_CMX)
                                printk(KERN_DEBUG
-                                   "%s removing %s from HFC conf %d "
-                                   "because dsp is split\n", __func__,
-                                   dsp->name, dsp->hfc_conf);
+                                      "%s removing %s from HFC conf %d "
+                                      "because dsp is split\n", __func__,
+                                      dsp->name, dsp->hfc_conf);
                        dsp_cmx_hw_message(dsp, MISDN_CTRL_HFC_CONF_SPLIT,
-                           0, 0, 0, 0);
+                                          0, 0, 0, 0);
                        dsp->hfc_conf = -1;
                }
                /* process hw echo */
@@ -418,12 +418,12 @@ one_member:
                        if (dsp->pcm_slot_tx >= 0 || dsp->pcm_slot_rx >= 0) {
                                if (dsp_debug & DEBUG_DSP_CMX)
                                        printk(KERN_DEBUG "%s removing %s from"
-                                           " PCM slot %d (TX) %d (RX) because"
-                                           " dsp is split (no echo)\n",
-                                           __func__, dsp->name,
-                                           dsp->pcm_slot_tx, dsp->pcm_slot_rx);
+                                              " PCM slot %d (TX) %d (RX) because"
+                                              " dsp is split (no echo)\n",
+                                              __func__, dsp->name,
+                                              dsp->pcm_slot_tx, dsp->pcm_slot_rx);
                                dsp_cmx_hw_message(dsp, MISDN_CTRL_HFC_PCM_DISC,
-                                   0, 0, 0, 0);
+                                                  0, 0, 0, 0);
                                dsp->pcm_slot_tx = -1;
                                dsp->pcm_bank_tx = -1;
                                dsp->pcm_slot_rx = -1;
@@ -447,11 +447,11 @@ one_member:
                        dsp->pcm_bank_rx = 2;
                        if (dsp_debug & DEBUG_DSP_CMX)
                                printk(KERN_DEBUG
-                                   "%s refresh %s for echo using slot %d\n",
-                                   __func__, dsp->name,
-                                   dsp->pcm_slot_tx);
+                                      "%s refresh %s for echo using slot %d\n",
+                                      __func__, dsp->name,
+                                      dsp->pcm_slot_tx);
                        dsp_cmx_hw_message(dsp, MISDN_CTRL_HFC_PCM_CONN,
-                           dsp->pcm_slot_tx, 2, dsp->pcm_slot_rx, 2);
+                                          dsp->pcm_slot_tx, 2, dsp->pcm_slot_rx, 2);
                        dsp->echo.hardware = 1;
                        return;
                }
@@ -479,8 +479,8 @@ one_member:
                if (i == ii) {
                        if (dsp_debug & DEBUG_DSP_CMX)
                                printk(KERN_DEBUG
-                                   "%s no slot available for echo\n",
-                                   __func__);
+                                      "%s no slot available for echo\n",
+                                      __func__);
                        /* no more slots available */
                        dsp->echo.software = 1;
                        return;
@@ -492,10 +492,10 @@ one_member:
                dsp->pcm_bank_rx = 2;
                if (dsp_debug & DEBUG_DSP_CMX)
                        printk(KERN_DEBUG
-                           "%s assign echo for %s using slot %d\n",
-                           __func__, dsp->name, dsp->pcm_slot_tx);
+                              "%s assign echo for %s using slot %d\n",
+                              __func__, dsp->name, dsp->pcm_slot_tx);
                dsp_cmx_hw_message(dsp, MISDN_CTRL_HFC_PCM_CONN,
-                   dsp->pcm_slot_tx, 2, dsp->pcm_slot_rx, 2);
+                                  dsp->pcm_slot_tx, 2, dsp->pcm_slot_rx, 2);
                dsp->echo.hardware = 1;
                return;
        }
@@ -503,11 +503,11 @@ one_member:
        /* conf gets updated (all members) */
        if (dsp_debug & DEBUG_DSP_CMX)
                printk(KERN_DEBUG "%s checking conference %d\n",
-                   __func__, conf->id);
+                      __func__, conf->id);
 
        if (list_empty(&conf->mlist)) {
                printk(KERN_ERR "%s: conference whithout members\n",
-                   __func__);
+                      __func__);
                return;
        }
        member = list_entry(conf->mlist.next, struct dsp_conf_member, list);
@@ -519,25 +519,25 @@ one_member:
                if (member->dsp->tx_mix) {
                        if (dsp_debug & DEBUG_DSP_CMX)
                                printk(KERN_DEBUG
-                                   "%s dsp %s cannot form a conf, because "
-                                   "tx_mix is turned on\n", __func__,
-                                   member->dsp->name);
-conf_software:
+                                      "%s dsp %s cannot form a conf, because "
+                                      "tx_mix is turned on\n", __func__,
+                                      member->dsp->name);
+               conf_software:
                        list_for_each_entry(member, &conf->mlist, list) {
                                dsp = member->dsp;
                                /* remove HFC conference if enabled */
                                if (dsp->hfc_conf >= 0) {
                                        if (dsp_debug & DEBUG_DSP_CMX)
                                                printk(KERN_DEBUG
-                                                   "%s removing %s from HFC "
-                                                   "conf %d because not "
-                                                   "possible with hardware\n",
-                                                   __func__,
-                                                   dsp->name,
-                                                   dsp->hfc_conf);
+                                                      "%s removing %s from HFC "
+                                                      "conf %d because not "
+                                                      "possible with hardware\n",
+                                                      __func__,
+                                                      dsp->name,
+                                                      dsp->hfc_conf);
                                        dsp_cmx_hw_message(dsp,
-                                           MISDN_CTRL_HFC_CONF_SPLIT,
-                                           0, 0, 0, 0);
+                                                          MISDN_CTRL_HFC_CONF_SPLIT,
+                                                          0, 0, 0, 0);
                                        dsp->hfc_conf = -1;
                                }
                                /* remove PCM slot if assigned */
@@ -545,16 +545,16 @@ conf_software:
                                    dsp->pcm_slot_rx >= 0) {
                                        if (dsp_debug & DEBUG_DSP_CMX)
                                                printk(KERN_DEBUG "%s removing "
-                                                   "%s from PCM slot %d (TX)"
-                                                   " slot %d (RX) because not"
-                                                   " possible with hardware\n",
-                                                   __func__,
-                                                   dsp->name,
-                                                   dsp->pcm_slot_tx,
-                                                   dsp->pcm_slot_rx);
+                                                      "%s from PCM slot %d (TX)"
+                                                      " slot %d (RX) because not"
+                                                      " possible with hardware\n",
+                                                      __func__,
+                                                      dsp->name,
+                                                      dsp->pcm_slot_tx,
+                                                      dsp->pcm_slot_rx);
                                        dsp_cmx_hw_message(dsp,
-                                           MISDN_CTRL_HFC_PCM_DISC,
-                                           0, 0, 0, 0);
+                                                          MISDN_CTRL_HFC_PCM_DISC,
+                                                          0, 0, 0, 0);
                                        dsp->pcm_slot_tx = -1;
                                        dsp->pcm_bank_tx = -1;
                                        dsp->pcm_slot_rx = -1;
@@ -569,79 +569,79 @@ conf_software:
                if (member->dsp->echo.hardware || member->dsp->echo.software) {
                        if (dsp_debug & DEBUG_DSP_CMX)
                                printk(KERN_DEBUG
-                                   "%s dsp %s cannot form a conf, because "
-                                   "echo is turned on\n", __func__,
-                                   member->dsp->name);
+                                      "%s dsp %s cannot form a conf, because "
+                                      "echo is turned on\n", __func__,
+                                      member->dsp->name);
                        goto conf_software;
                }
                /* check if member has tx_mix turned on */
                if (member->dsp->tx_mix) {
                        if (dsp_debug & DEBUG_DSP_CMX)
                                printk(KERN_DEBUG
-                                   "%s dsp %s cannot form a conf, because "
-                                   "tx_mix is turned on\n",
-                                   __func__, member->dsp->name);
+                                      "%s dsp %s cannot form a conf, because "
+                                      "tx_mix is turned on\n",
+                                      __func__, member->dsp->name);
                        goto conf_software;
                }
                /* check if member changes volume at an not suppoted level */
                if (member->dsp->tx_volume) {
                        if (dsp_debug & DEBUG_DSP_CMX)
                                printk(KERN_DEBUG
-                                   "%s dsp %s cannot form a conf, because "
-                                   "tx_volume is changed\n",
-                                   __func__, member->dsp->name);
+                                      "%s dsp %s cannot form a conf, because "
+                                      "tx_volume is changed\n",
+                                      __func__, member->dsp->name);
                        goto conf_software;
                }
                if (member->dsp->rx_volume) {
                        if (dsp_debug & DEBUG_DSP_CMX)
                                printk(KERN_DEBUG
-                                   "%s dsp %s cannot form a conf, because "
-                                   "rx_volume is changed\n",
-                                   __func__, member->dsp->name);
+                                      "%s dsp %s cannot form a conf, because "
+                                      "rx_volume is changed\n",
+                                      __func__, member->dsp->name);
                        goto conf_software;
                }
                /* check if tx-data turned on */
                if (member->dsp->tx_data) {
                        if (dsp_debug & DEBUG_DSP_CMX)
                                printk(KERN_DEBUG
-                                   "%s dsp %s tx_data is turned on\n",
-                                   __func__, member->dsp->name);
+                                      "%s dsp %s tx_data is turned on\n",
+                                      __func__, member->dsp->name);
                        tx_data = 1;
                }
                /* check if pipeline exists */
                if (member->dsp->pipeline.inuse) {
                        if (dsp_debug & DEBUG_DSP_CMX)
                                printk(KERN_DEBUG
-                                   "%s dsp %s cannot form a conf, because "
-                                   "pipeline exists\n", __func__,
-                                   member->dsp->name);
+                                      "%s dsp %s cannot form a conf, because "
+                                      "pipeline exists\n", __func__,
+                                      member->dsp->name);
                        goto conf_software;
                }
                /* check if encryption is enabled */
                if (member->dsp->bf_enable) {
                        if (dsp_debug & DEBUG_DSP_CMX)
                                printk(KERN_DEBUG "%s dsp %s cannot form a "
-                                   "conf, because encryption is enabled\n",
-                                   __func__, member->dsp->name);
+                                      "conf, because encryption is enabled\n",
+                                      __func__, member->dsp->name);
                        goto conf_software;
                }
                /* check if member is on a card with PCM support */
                if (member->dsp->features.pcm_id < 0) {
                        if (dsp_debug & DEBUG_DSP_CMX)
                                printk(KERN_DEBUG
-                                   "%s dsp %s cannot form a conf, because "
-                                   "dsp has no PCM bus\n",
-                                   __func__, member->dsp->name);
+                                      "%s dsp %s cannot form a conf, because "
+                                      "dsp has no PCM bus\n",
+                                      __func__, member->dsp->name);
                        goto conf_software;
                }
                /* check if relations are on the same PCM bus */
                if (member->dsp->features.pcm_id != same_pcm) {
                        if (dsp_debug & DEBUG_DSP_CMX)
                                printk(KERN_DEBUG
-                                   "%s dsp %s cannot form a conf, because "
-                                   "dsp is on a different PCM bus than the "
-                                   "first dsp\n",
-                                   __func__, member->dsp->name);
+                                      "%s dsp %s cannot form a conf, because "
+                                      "dsp is on a different PCM bus than the "
+                                      "first dsp\n",
+                                      __func__, member->dsp->name);
                        goto conf_software;
                }
                /* determine if members are on the same hfc chip */
@@ -665,12 +665,12 @@ conf_software:
        if (memb == 1) {
                if (dsp_debug & DEBUG_DSP_CMX)
                        printk(KERN_DEBUG
-                           "%s conf %d cannot form a HW conference, "
-                           "because dsp is alone\n", __func__, conf->id);
+                              "%s conf %d cannot form a HW conference, "
+                              "because dsp is alone\n", __func__, conf->id);
                conf->hardware = 0;
                conf->software = 0;
                member = list_entry(conf->mlist.next, struct dsp_conf_member,
-                       list);
+                                   list);
                dsp = member->dsp;
                goto one_member;
        }
@@ -684,30 +684,30 @@ conf_software:
        /* if we have only two members */
        if (memb == 2) {
                member = list_entry(conf->mlist.next, struct dsp_conf_member,
-                       list);
+                                   list);
                nextm = list_entry(member->list.next, struct dsp_conf_member,
-                       list);
+                                  list);
                /* remove HFC conference if enabled */
                if (member->dsp->hfc_conf >= 0) {
                        if (dsp_debug & DEBUG_DSP_CMX)
                                printk(KERN_DEBUG
-                                   "%s removing %s from HFC conf %d because "
-                                   "two parties require only a PCM slot\n",
-                                   __func__, member->dsp->name,
-                                   member->dsp->hfc_conf);
+                                      "%s removing %s from HFC conf %d because "
+                                      "two parties require only a PCM slot\n",
+                                      __func__, member->dsp->name,
+                                      member->dsp->hfc_conf);
                        dsp_cmx_hw_message(member->dsp,
-                           MISDN_CTRL_HFC_CONF_SPLIT, 0, 0, 0, 0);
+                                          MISDN_CTRL_HFC_CONF_SPLIT, 0, 0, 0, 0);
                        member->dsp->hfc_conf = -1;
                }
                if (nextm->dsp->hfc_conf >= 0) {
                        if (dsp_debug & DEBUG_DSP_CMX)
                                printk(KERN_DEBUG
-                                   "%s removing %s from HFC conf %d because "
-                                   "two parties require only a PCM slot\n",
-                                   __func__, nextm->dsp->name,
-                                   nextm->dsp->hfc_conf);
+                                      "%s removing %s from HFC conf %d because "
+                                      "two parties require only a PCM slot\n",
+                                      __func__, nextm->dsp->name,
+                                      nextm->dsp->hfc_conf);
                        dsp_cmx_hw_message(nextm->dsp,
-                           MISDN_CTRL_HFC_CONF_SPLIT, 0, 0, 0, 0);
+                                          MISDN_CTRL_HFC_CONF_SPLIT, 0, 0, 0, 0);
                        nextm->dsp->hfc_conf = -1;
                }
                /* if members have two banks (and not on the same chip) */
@@ -733,15 +733,15 @@ conf_software:
                                /* all members have same slot */
                                if (dsp_debug & DEBUG_DSP_CMX)
                                        printk(KERN_DEBUG
-                                           "%s dsp %s & %s stay joined on "
-                                           "PCM slot %d bank %d (TX) bank %d "
-                                           "(RX) (on different chips)\n",
-                                           __func__,
-                                           member->dsp->name,
-                                           nextm->dsp->name,
-                                           member->dsp->pcm_slot_tx,
-                                           member->dsp->pcm_bank_tx,
-                                           member->dsp->pcm_bank_rx);
+                                              "%s dsp %s & %s stay joined on "
+                                              "PCM slot %d bank %d (TX) bank %d "
+                                              "(RX) (on different chips)\n",
+                                              __func__,
+                                              member->dsp->name,
+                                              nextm->dsp->name,
+                                              member->dsp->pcm_slot_tx,
+                                              member->dsp->pcm_bank_tx,
+                                              member->dsp->pcm_bank_rx);
                                conf->hardware = 0;
                                conf->software = 1;
                                return;
@@ -773,10 +773,10 @@ conf_software:
                        if (i == ii) {
                                if (dsp_debug & DEBUG_DSP_CMX)
                                        printk(KERN_DEBUG
-                                           "%s no slot available for "
-                                           "%s & %s\n", __func__,
-                                           member->dsp->name,
-                                           nextm->dsp->name);
+                                              "%s no slot available for "
+                                              "%s & %s\n", __func__,
+                                              member->dsp->name,
+                                              nextm->dsp->name);
                                /* no more slots available */
                                goto conf_software;
                        }
@@ -791,23 +791,23 @@ conf_software:
                        nextm->dsp->pcm_bank_tx = 0;
                        if (dsp_debug & DEBUG_DSP_CMX)
                                printk(KERN_DEBUG
-                                   "%s adding %s & %s to new PCM slot %d "
-                                   "(TX and RX on different chips) because "
-                                   "both members have not same slots\n",
-                                   __func__,
-                                   member->dsp->name,
-                                   nextm->dsp->name,
-                                   member->dsp->pcm_slot_tx);
+                                      "%s adding %s & %s to new PCM slot %d "
+                                      "(TX and RX on different chips) because "
+                                      "both members have not same slots\n",
+                                      __func__,
+                                      member->dsp->name,
+                                      nextm->dsp->name,
+                                      member->dsp->pcm_slot_tx);
                        dsp_cmx_hw_message(member->dsp, MISDN_CTRL_HFC_PCM_CONN,
-                           member->dsp->pcm_slot_tx, member->dsp->pcm_bank_tx,
-                           member->dsp->pcm_slot_rx, member->dsp->pcm_bank_rx);
+                                          member->dsp->pcm_slot_tx, member->dsp->pcm_bank_tx,
+                                          member->dsp->pcm_slot_rx, member->dsp->pcm_bank_rx);
                        dsp_cmx_hw_message(nextm->dsp, MISDN_CTRL_HFC_PCM_CONN,
-                           nextm->dsp->pcm_slot_tx, nextm->dsp->pcm_bank_tx,
-                           nextm->dsp->pcm_slot_rx, nextm->dsp->pcm_bank_rx);
+                                          nextm->dsp->pcm_slot_tx, nextm->dsp->pcm_bank_tx,
+                                          nextm->dsp->pcm_slot_rx, nextm->dsp->pcm_bank_rx);
                        conf->hardware = 1;
                        conf->software = tx_data;
                        return;
-               /* if members have one bank (or on the same chip) */
+                       /* if members have one bank (or on the same chip) */
                } else {
                        /* if both members have different crossed slots */
                        if (member->dsp->pcm_slot_tx >= 0 &&
@@ -827,13 +827,13 @@ conf_software:
                                /* all members have same slot */
                                if (dsp_debug & DEBUG_DSP_CMX)
                                        printk(KERN_DEBUG
-                                           "%s dsp %s & %s stay joined on PCM "
-                                           "slot %d (TX) %d (RX) on same chip "
-                                           "or one bank PCM)\n", __func__,
-                                           member->dsp->name,
-                                           nextm->dsp->name,
-                                           member->dsp->pcm_slot_tx,
-                                           member->dsp->pcm_slot_rx);
+                                              "%s dsp %s & %s stay joined on PCM "
+                                              "slot %d (TX) %d (RX) on same chip "
+                                              "or one bank PCM)\n", __func__,
+                                              member->dsp->name,
+                                              nextm->dsp->name,
+                                              member->dsp->pcm_slot_tx,
+                                              member->dsp->pcm_slot_rx);
                                conf->hardware = 0;
                                conf->software = 1;
                                return;
@@ -865,14 +865,14 @@ conf_software:
                        if (i1 == ii) {
                                if (dsp_debug & DEBUG_DSP_CMX)
                                        printk(KERN_DEBUG
-                                           "%s no slot available "
-                                           "for %s & %s\n", __func__,
-                                           member->dsp->name,
-                                           nextm->dsp->name);
+                                              "%s no slot available "
+                                              "for %s & %s\n", __func__,
+                                              member->dsp->name,
+                                              nextm->dsp->name);
                                /* no more slots available */
                                goto conf_software;
                        }
-                       i2 = i1+1;
+                       i2 = i1 + 1;
                        while (i2 < ii) {
                                if (freeslots[i2])
                                        break;
@@ -881,11 +881,11 @@ conf_software:
                        if (i2 == ii) {
                                if (dsp_debug & DEBUG_DSP_CMX)
                                        printk(KERN_DEBUG
-                                           "%s no slot available "
-                                           "for %s & %s\n",
-                                           __func__,
-                                           member->dsp->name,
-                                           nextm->dsp->name);
+                                              "%s no slot available "
+                                              "for %s & %s\n",
+                                              __func__,
+                                              member->dsp->name,
+                                              nextm->dsp->name);
                                /* no more slots available */
                                goto conf_software;
                        }
@@ -900,20 +900,20 @@ conf_software:
                        nextm->dsp->pcm_bank_tx = 0;
                        if (dsp_debug & DEBUG_DSP_CMX)
                                printk(KERN_DEBUG
-                                   "%s adding %s & %s to new PCM slot %d "
-                                   "(TX) %d (RX) on same chip or one bank "
-                                   "PCM, because both members have not "
-                                   "crossed slots\n", __func__,
-                                   member->dsp->name,
-                                   nextm->dsp->name,
-                                   member->dsp->pcm_slot_tx,
-                                   member->dsp->pcm_slot_rx);
+                                      "%s adding %s & %s to new PCM slot %d "
+                                      "(TX) %d (RX) on same chip or one bank "
+                                      "PCM, because both members have not "
+                                      "crossed slots\n", __func__,
+                                      member->dsp->name,
+                                      nextm->dsp->name,
+                                      member->dsp->pcm_slot_tx,
+                                      member->dsp->pcm_slot_rx);
                        dsp_cmx_hw_message(member->dsp, MISDN_CTRL_HFC_PCM_CONN,
-                           member->dsp->pcm_slot_tx, member->dsp->pcm_bank_tx,
-                           member->dsp->pcm_slot_rx, member->dsp->pcm_bank_rx);
+                                          member->dsp->pcm_slot_tx, member->dsp->pcm_bank_tx,
+                                          member->dsp->pcm_slot_rx, member->dsp->pcm_bank_rx);
                        dsp_cmx_hw_message(nextm->dsp, MISDN_CTRL_HFC_PCM_CONN,
-                           nextm->dsp->pcm_slot_tx, nextm->dsp->pcm_bank_tx,
-                           nextm->dsp->pcm_slot_rx, nextm->dsp->pcm_bank_rx);
+                                          nextm->dsp->pcm_slot_tx, nextm->dsp->pcm_bank_tx,
+                                          nextm->dsp->pcm_slot_rx, nextm->dsp->pcm_bank_rx);
                        conf->hardware = 1;
                        conf->software = tx_data;
                        return;
@@ -929,10 +929,10 @@ conf_software:
        if (same_hfc < 0) {
                if (dsp_debug & DEBUG_DSP_CMX)
                        printk(KERN_DEBUG
-                           "%s conference %d cannot be formed, because "
-                           "members are on different chips or not "
-                           "on HFC chip\n",
-                           __func__, conf->id);
+                              "%s conference %d cannot be formed, because "
+                              "members are on different chips or not "
+                              "on HFC chip\n",
+                              __func__, conf->id);
                goto conf_software;
        }
 
@@ -946,7 +946,7 @@ conf_software:
         * if there is an existing conference, but not all members have joined
         */
        if (current_conf >= 0) {
-join_members:
+       join_members:
                list_for_each_entry(member, &conf->mlist, list) {
                        /* if no conference engine on our chip, change to
                         * software */
@@ -966,10 +966,10 @@ join_members:
                                 * slot will be overwritten.
                                 */
                                if (
-                                   dsp != member->dsp &&
-                               /* dsp must be on the same PCM */
-                                   member->dsp->features.pcm_id ==
-                                   dsp->features.pcm_id) {
+                                       dsp != member->dsp &&
+                                       /* dsp must be on the same PCM */
+                                       member->dsp->features.pcm_id ==
+                                       dsp->features.pcm_id) {
                                        /* dsp must be on a slot */
                                        if (dsp->pcm_slot_tx >= 0 &&
                                            dsp->pcm_slot_tx <
@@ -992,16 +992,16 @@ join_members:
                                /* no more slots available */
                                if (dsp_debug & DEBUG_DSP_CMX)
                                        printk(KERN_DEBUG
-                                           "%s conference %d cannot be formed,"
-                                           " because no slot free\n",
-                                           __func__, conf->id);
+                                              "%s conference %d cannot be formed,"
+                                              " because no slot free\n",
+                                              __func__, conf->id);
                                goto conf_software;
                        }
                        if (dsp_debug & DEBUG_DSP_CMX)
                                printk(KERN_DEBUG
-                                   "%s changing dsp %s to HW conference "
-                                   "%d slot %d\n", __func__,
-                                   member->dsp->name, current_conf, i);
+                                      "%s changing dsp %s to HW conference "
+                                      "%d slot %d\n", __func__,
+                                      member->dsp->name, current_conf, i);
                        /* assign free slot & set PCM & join conf */
                        member->dsp->pcm_slot_tx = i;
                        member->dsp->pcm_slot_rx = i;
@@ -1009,9 +1009,9 @@ join_members:
                        member->dsp->pcm_bank_rx = 2;
                        member->dsp->hfc_conf = current_conf;
                        dsp_cmx_hw_message(member->dsp, MISDN_CTRL_HFC_PCM_CONN,
-                           i, 2, i, 2);
+                                          i, 2, i, 2);
                        dsp_cmx_hw_message(member->dsp,
-                           MISDN_CTRL_HFC_CONF_JOIN, current_conf, 0, 0, 0);
+                                          MISDN_CTRL_HFC_CONF_JOIN, current_conf, 0, 0, 0);
                }
                return;
        }
@@ -1040,9 +1040,9 @@ join_members:
                /* no more conferences available */
                if (dsp_debug & DEBUG_DSP_CMX)
                        printk(KERN_DEBUG
-                           "%s conference %d cannot be formed, because "
-                           "no conference number free\n",
-                           __func__, conf->id);
+                              "%s conference %d cannot be formed, because "
+                              "no conference number free\n",
+                              __func__, conf->id);
                goto conf_software;
        }
        /* join all members */
@@ -1070,7 +1070,7 @@ dsp_cmx_conf(struct dsp *dsp, u32 conf_id)
        if (dsp->conf_id) {
                if (dsp_debug & DEBUG_DSP_CMX)
                        printk(KERN_DEBUG "removing us from conference %d\n",
-                               dsp->conf->id);
+                              dsp->conf->id);
                /* remove us from conf */
                conf = dsp->conf;
                err = dsp_cmx_del_conf_member(dsp);
@@ -1085,7 +1085,7 @@ dsp_cmx_conf(struct dsp *dsp, u32 conf_id)
                if (list_empty(&conf->mlist)) {
                        if (dsp_debug & DEBUG_DSP_CMX)
                                printk(KERN_DEBUG
-                                   "conference is empty, so we remove it.\n");
+                                      "conference is empty, so we remove it.\n");
                        err = dsp_cmx_del_conf(conf);
                        if (err)
                                return err;
@@ -1102,29 +1102,29 @@ dsp_cmx_conf(struct dsp *dsp, u32 conf_id)
        /* now add us to conf */
        if (dsp_debug & DEBUG_DSP_CMX)
                printk(KERN_DEBUG "searching conference %d\n",
-                       conf_id);
+                      conf_id);
        conf = dsp_cmx_search_conf(conf_id);
        if (!conf) {
                if (dsp_debug & DEBUG_DSP_CMX)
                        printk(KERN_DEBUG
-                           "conference doesn't exist yet, creating.\n");
+                              "conference doesn't exist yet, creating.\n");
                /* the conference doesn't exist, so we create */
                conf = dsp_cmx_new_conf(conf_id);
                if (!conf)
                        return -EINVAL;
        } else if (!list_empty(&conf->mlist)) {
                member = list_entry(conf->mlist.next, struct dsp_conf_member,
-                       list);
+                                   list);
                if (dsp->hdlc && !member->dsp->hdlc) {
                        if (dsp_debug & DEBUG_DSP_CMX)
                                printk(KERN_DEBUG
-                                   "cannot join transparent conference.\n");
+                                      "cannot join transparent conference.\n");
                        return -EINVAL;
                }
                if (!dsp->hdlc && member->dsp->hdlc) {
                        if (dsp_debug & DEBUG_DSP_CMX)
                                printk(KERN_DEBUG
-                                   "cannot join hdlc conference.\n");
+                                      "cannot join hdlc conference.\n");
                        return -EINVAL;
                }
        }
@@ -1138,7 +1138,7 @@ dsp_cmx_conf(struct dsp *dsp, u32 conf_id)
        if (list_empty(&conf->mlist)) {
                if (dsp_debug & DEBUG_DSP_CMX)
                        printk(KERN_DEBUG
-                           "we are alone in this conference, so exit.\n");
+                              "we are alone in this conference, so exit.\n");
                /* update hardware */
                dsp_cmx_hardware(NULL, dsp);
                return 0;
@@ -1166,7 +1166,7 @@ showdelay(struct dsp *dsp, int samples, int delay)
        sdelay = delay * 50 / (dsp_poll << 2);
 
        printk(KERN_DEBUG "DELAY (%s) %3d >%s\n", dsp->name, delay,
-               sdelay > 50 ? "..." : bar + 50 - sdelay);
+              sdelay > 50 ? "..." : bar + 50 - sdelay);
 }
 #endif
 
@@ -1188,9 +1188,9 @@ dsp_cmx_receive(struct dsp *dsp, struct sk_buff *skb)
        /* half of the buffer should be larger than maximum packet size */
        if (len >= CMX_BUFF_HALF) {
                printk(KERN_ERR
-                   "%s line %d: packet from card is too large (%d bytes). "
-                   "please make card send smaller packets OR increase "
-                   "CMX_BUFF_SIZE\n", __FILE__, __LINE__, len);
+                      "%s line %d: packet from card is too large (%d bytes). "
+                      "please make card send smaller packets OR increase "
+                      "CMX_BUFF_SIZE\n", __FILE__, __LINE__, len);
                return;
        }
 
@@ -1228,9 +1228,9 @@ dsp_cmx_receive(struct dsp *dsp, struct sk_buff *skb)
        if (((dsp->rx_W-dsp->rx_R) & CMX_BUFF_MASK) >= CMX_BUFF_HALF) {
                if (dsp_debug & DEBUG_DSP_CLOCK)
                        printk(KERN_DEBUG
-                           "cmx_receive(dsp=%lx): UNDERRUN (or overrun the "
-                           "maximum delay), adjusting read pointer! "
-                           "(inst %s)\n", (u_long)dsp, dsp->name);
+                              "cmx_receive(dsp=%lx): UNDERRUN (or overrun the "
+                              "maximum delay), adjusting read pointer! "
+                              "(inst %s)\n", (u_long)dsp, dsp->name);
                /* flush rx buffer and set delay to dsp_poll / 2 */
                if (dsp->features.unordered) {
                        dsp->rx_R = (hh->id & CMX_BUFF_MASK);
@@ -1255,27 +1255,27 @@ dsp_cmx_receive(struct dsp *dsp, struct sk_buff *skb)
                    (dsp->cmx_delay << 1)) {
                        if (dsp_debug & DEBUG_DSP_CLOCK)
                                printk(KERN_DEBUG
-                                   "cmx_receive(dsp=%lx): OVERRUN (because "
-                                   "twice the delay is reached), adjusting "
-                                   "read pointer! (inst %s)\n",
-                                   (u_long)dsp, dsp->name);
-               /* flush buffer */
-               if (dsp->features.unordered) {
-                       dsp->rx_R = (hh->id & CMX_BUFF_MASK);
-                       dsp->rx_W = (dsp->rx_R + dsp->cmx_delay)
-                               & CMX_BUFF_MASK;
-               } else {
-                       dsp->rx_R = 0;
-                       dsp->rx_W = dsp->cmx_delay;
+                                      "cmx_receive(dsp=%lx): OVERRUN (because "
+                                      "twice the delay is reached), adjusting "
+                                      "read pointer! (inst %s)\n",
+                                      (u_long)dsp, dsp->name);
+                       /* flush buffer */
+                       if (dsp->features.unordered) {
+                               dsp->rx_R = (hh->id & CMX_BUFF_MASK);
+                               dsp->rx_W = (dsp->rx_R + dsp->cmx_delay)
+                                       & CMX_BUFF_MASK;
+                       } else {
+                               dsp->rx_R = 0;
+                               dsp->rx_W = dsp->cmx_delay;
+                       }
+                       memset(dsp->rx_buff, dsp_silence, sizeof(dsp->rx_buff));
                }
-               memset(dsp->rx_buff, dsp_silence, sizeof(dsp->rx_buff));
-       }
 
        /* show where to write */
 #ifdef CMX_DEBUG
        printk(KERN_DEBUG
-           "cmx_receive(dsp=%lx): rx_R(dsp)=%05x rx_W(dsp)=%05x len=%d %s\n",
-           (u_long)dsp, dsp->rx_R, dsp->rx_W, len, dsp->name);
+              "cmx_receive(dsp=%lx): rx_R(dsp)=%05x rx_W(dsp)=%05x len=%d %s\n",
+              (u_long)dsp, dsp->rx_R, dsp->rx_W, len, dsp->name);
 #endif
 
        /* write data into rx_buffer */
@@ -1290,7 +1290,7 @@ dsp_cmx_receive(struct dsp *dsp, struct sk_buff *skb)
        }
 
        /* increase write-pointer */
-       dsp->rx_W = ((dsp->rx_W+len) & CMX_BUFF_MASK);
+       dsp->rx_W = ((dsp->rx_W + len) & CMX_BUFF_MASK);
 #ifdef CMX_DELAY_DEBUG
        showdelay(dsp, len, (dsp->rx_W-dsp->rx_R) & CMX_BUFF_MASK);
 #endif
@@ -1319,7 +1319,7 @@ dsp_cmx_send_member(struct dsp *dsp, int len, s32 *c, int members)
                return;
        }
        if (((dsp->conf && dsp->conf->hardware) || /* hardware conf */
-           dsp->echo.hardware) && /* OR hardware echo */
+            dsp->echo.hardware) && /* OR hardware echo */
            dsp->tx_R == dsp->tx_W && /* AND no tx-data */
            !(dsp->tone.tone && dsp->tone.software)) { /* AND not soft tones */
                if (!dsp->tx_data) { /* no tx_data for user space required */
@@ -1334,8 +1334,8 @@ dsp_cmx_send_member(struct dsp *dsp, int len, s32 *c, int members)
 
 #ifdef CMX_DEBUG
        printk(KERN_DEBUG
-           "SEND members=%d dsp=%s, conf=%p, rx_R=%05x rx_W=%05x\n",
-           members, dsp->name, conf, dsp->rx_R, dsp->rx_W);
+              "SEND members=%d dsp=%s, conf=%p, rx_R=%05x rx_W=%05x\n",
+              members, dsp->name, conf, dsp->rx_R, dsp->rx_W);
 #endif
 
        /* preload if we have delay set */
@@ -1349,8 +1349,8 @@ dsp_cmx_send_member(struct dsp *dsp, int len, s32 *c, int members)
        nskb = mI_alloc_skb(len + preload, GFP_ATOMIC);
        if (!nskb) {
                printk(KERN_ERR
-                   "FATAL ERROR in mISDN_dsp.o: cannot alloc %d bytes\n",
-                   len + preload);
+                      "FATAL ERROR in mISDN_dsp.o: cannot alloc %d bytes\n",
+                      len + preload);
                return;
        }
        hh = mISDN_HEAD_P(nskb);
@@ -1386,22 +1386,22 @@ dsp_cmx_send_member(struct dsp *dsp, int len, s32 *c, int members)
        if (!dsp->tx_mix && t != tt) {
                /* -> send tx-data and continue when not enough */
 #ifdef CMX_TX_DEBUG
-       sprintf(debugbuf, "TX sending (%04x-%04x)%p: ", t, tt, p);
+               sprintf(debugbuf, "TX sending (%04x-%04x)%p: ", t, tt, p);
 #endif
                while (r != rr && t != tt) {
 #ifdef CMX_TX_DEBUG
                        if (strlen(debugbuf) < 48)
-                               sprintf(debugbuf+strlen(debugbuf), " %02x",
-                                   p[t]);
+                               sprintf(debugbuf + strlen(debugbuf), " %02x",
+                                       p[t]);
 #endif
                        *d++ = p[t]; /* write tx_buff */
-                       t = (t+1) & CMX_BUFF_MASK;
-                       r = (r+1) & CMX_BUFF_MASK;
+                       t = (t + 1) & CMX_BUFF_MASK;
+                       r = (r + 1) & CMX_BUFF_MASK;
                }
                if (r == rr) {
                        dsp->tx_R = t;
 #ifdef CMX_TX_DEBUG
-       printk(KERN_DEBUG "%s\n", debugbuf);
+                       printk(KERN_DEBUG "%s\n", debugbuf);
 #endif
                        goto send_packet;
                }
@@ -1417,29 +1417,29 @@ dsp_cmx_send_member(struct dsp *dsp, int len, s32 *c, int members)
                        /* -> send tx-data if available or use 0-volume */
                        while (r != rr && t != tt) {
                                *d++ = p[t]; /* write tx_buff */
-                               t = (t+1) & CMX_BUFF_MASK;
-                               r = (r+1) & CMX_BUFF_MASK;
+                               t = (t + 1) & CMX_BUFF_MASK;
+                               r = (r + 1) & CMX_BUFF_MASK;
                        }
                        if (r != rr) {
                                if (dsp_debug & DEBUG_DSP_CLOCK)
                                        printk(KERN_DEBUG "%s: RX empty\n",
-                                               __func__);
-                               memset(d, dsp_silence, (rr-r)&CMX_BUFF_MASK);
+                                              __func__);
+                               memset(d, dsp_silence, (rr - r) & CMX_BUFF_MASK);
                        }
-               /* -> if echo is enabled */
+                       /* -> if echo is enabled */
                } else {
                        /*
                         * -> mix tx-data with echo if available,
                         * or use echo only
                         */
                        while (r != rr && t != tt) {
-                               *d++ = dsp_audio_mix_law[(p[t]<<8)|q[r]];
-                               t = (t+1) & CMX_BUFF_MASK;
-                               r = (r+1) & CMX_BUFF_MASK;
+                               *d++ = dsp_audio_mix_law[(p[t] << 8) | q[r]];
+                               t = (t + 1) & CMX_BUFF_MASK;
+                               r = (r + 1) & CMX_BUFF_MASK;
                        }
                        while (r != rr) {
                                *d++ = q[r]; /* echo */
-                               r = (r+1) & CMX_BUFF_MASK;
+                               r = (r + 1) & CMX_BUFF_MASK;
                        }
                }
                dsp->tx_R = t;
@@ -1449,63 +1449,63 @@ dsp_cmx_send_member(struct dsp *dsp, int len, s32 *c, int members)
 #ifdef CMX_CONF_DEBUG
        if (0) {
 #else
-       if (members == 2) {
+               if (members == 2) {
 #endif
-               /* "other" becomes other party */
-               other = (list_entry(conf->mlist.next,
-                   struct dsp_conf_member, list))->dsp;
-               if (other == member)
-                       other = (list_entry(conf->mlist.prev,
-                           struct dsp_conf_member, list))->dsp;
-               o_q = other->rx_buff; /* received data */
-               o_rr = (other->rx_R + len) & CMX_BUFF_MASK;
+                       /* "other" becomes other party */
+                       other = (list_entry(conf->mlist.next,
+                                           struct dsp_conf_member, list))->dsp;
+                       if (other == member)
+                               other = (list_entry(conf->mlist.prev,
+                                                   struct dsp_conf_member, list))->dsp;
+                       o_q = other->rx_buff; /* received data */
+                       o_rr = (other->rx_R + len) & CMX_BUFF_MASK;
                        /* end of rx-pointer */
-               o_r = (o_rr - rr + r) & CMX_BUFF_MASK;
+                       o_r = (o_rr - rr + r) & CMX_BUFF_MASK;
                        /* start rx-pointer at current read position*/
-               /* -> if echo is NOT enabled */
-               if (!dsp->echo.software) {
-                       /*
-                        * -> copy other member's rx-data,
-                        * if tx-data is available, mix
-                        */
-                       while (o_r != o_rr && t != tt) {
-                               *d++ = dsp_audio_mix_law[(p[t]<<8)|o_q[o_r]];
-                               t = (t+1) & CMX_BUFF_MASK;
-                               o_r = (o_r+1) & CMX_BUFF_MASK;
-                       }
-                       while (o_r != o_rr) {
-                               *d++ = o_q[o_r];
-                               o_r = (o_r+1) & CMX_BUFF_MASK;
-                       }
-               /* -> if echo is enabled */
-               } else {
-                       /*
-                        * -> mix other member's rx-data with echo,
-                        * if tx-data is available, mix
-                        */
-                       while (r != rr && t != tt) {
-                               sample = dsp_audio_law_to_s32[p[t]] +
-                                   dsp_audio_law_to_s32[q[r]] +
-                                   dsp_audio_law_to_s32[o_q[o_r]];
-                               if (sample < -32768)
-                                       sample = -32768;
-                               else if (sample > 32767)
-                                       sample = 32767;
-                               *d++ = dsp_audio_s16_to_law[sample & 0xffff];
-                                   /* tx-data + rx_data + echo */
-                               t = (t+1) & CMX_BUFF_MASK;
-                               r = (r+1) & CMX_BUFF_MASK;
-                               o_r = (o_r+1) & CMX_BUFF_MASK;
-                       }
-                       while (r != rr) {
-                               *d++ = dsp_audio_mix_law[(q[r]<<8)|o_q[o_r]];
-                               r = (r+1) & CMX_BUFF_MASK;
-                               o_r = (o_r+1) & CMX_BUFF_MASK;
+                       /* -> if echo is NOT enabled */
+                       if (!dsp->echo.software) {
+                               /*
+                                * -> copy other member's rx-data,
+                                * if tx-data is available, mix
+                                */
+                               while (o_r != o_rr && t != tt) {
+                                       *d++ = dsp_audio_mix_law[(p[t] << 8) | o_q[o_r]];
+                                       t = (t + 1) & CMX_BUFF_MASK;
+                                       o_r = (o_r + 1) & CMX_BUFF_MASK;
+                               }
+                               while (o_r != o_rr) {
+                                       *d++ = o_q[o_r];
+                                       o_r = (o_r + 1) & CMX_BUFF_MASK;
+                               }
+                               /* -> if echo is enabled */
+                       } else {
+                               /*
+                                * -> mix other member's rx-data with echo,
+                                * if tx-data is available, mix
+                                */
+                               while (r != rr && t != tt) {
+                                       sample = dsp_audio_law_to_s32[p[t]] +
+                                               dsp_audio_law_to_s32[q[r]] +
+                                               dsp_audio_law_to_s32[o_q[o_r]];
+                                       if (sample < -32768)
+                                               sample = -32768;
+                                       else if (sample > 32767)
+                                               sample = 32767;
+                                       *d++ = dsp_audio_s16_to_law[sample & 0xffff];
+                                       /* tx-data + rx_data + echo */
+                                       t = (t + 1) & CMX_BUFF_MASK;
+                                       r = (r + 1) & CMX_BUFF_MASK;
+                                       o_r = (o_r + 1) & CMX_BUFF_MASK;
+                               }
+                               while (r != rr) {
+                                       *d++ = dsp_audio_mix_law[(q[r] << 8) | o_q[o_r]];
+                                       r = (r + 1) & CMX_BUFF_MASK;
+                                       o_r = (o_r + 1) & CMX_BUFF_MASK;
+                               }
                        }
+                       dsp->tx_R = t;
+                       goto send_packet;
                }
-               dsp->tx_R = t;
-               goto send_packet;
-       }
 #ifdef DSP_NEVER_DEFINED
        }
 #endif
@@ -1518,15 +1518,15 @@ dsp_cmx_send_member(struct dsp *dsp, int len, s32 *c, int members)
                 */
                while (r != rr && t != tt) {
                        sample = dsp_audio_law_to_s32[p[t]] + *c++ -
-                           dsp_audio_law_to_s32[q[r]];
+                               dsp_audio_law_to_s32[q[r]];
                        if (sample < -32768)
                                sample = -32768;
                        else if (sample > 32767)
                                sample = 32767;
                        *d++ = dsp_audio_s16_to_law[sample & 0xffff];
-                           /* conf-rx+tx */
-                       r = (r+1) & CMX_BUFF_MASK;
-                       t = (t+1) & CMX_BUFF_MASK;
+                       /* conf-rx+tx */
+                       r = (r + 1) & CMX_BUFF_MASK;
+                       t = (t + 1) & CMX_BUFF_MASK;
                }
                while (r != rr) {
                        sample = *c++ - dsp_audio_law_to_s32[q[r]];
@@ -1535,10 +1535,10 @@ dsp_cmx_send_member(struct dsp *dsp, int len, s32 *c, int members)
                        else if (sample > 32767)
                                sample = 32767;
                        *d++ = dsp_audio_s16_to_law[sample & 0xffff];
-                           /* conf-rx */
-                       r = (r+1) & CMX_BUFF_MASK;
+                       /* conf-rx */
+                       r = (r + 1) & CMX_BUFF_MASK;
                }
-       /* -> if echo is enabled */
+               /* -> if echo is enabled */
        } else {
                /*
                 * -> encode conf-data, if tx-data
@@ -1551,9 +1551,9 @@ dsp_cmx_send_member(struct dsp *dsp, int len, s32 *c, int members)
                        else if (sample > 32767)
                                sample = 32767;
                        *d++ = dsp_audio_s16_to_law[sample & 0xffff];
-                           /* conf(echo)+tx */
-                       t = (t+1) & CMX_BUFF_MASK;
-                       r = (r+1) & CMX_BUFF_MASK;
+                       /* conf(echo)+tx */
+                       t = (t + 1) & CMX_BUFF_MASK;
+                       r = (r + 1) & CMX_BUFF_MASK;
                }
                while (r != rr) {
                        sample = *c++;
@@ -1562,8 +1562,8 @@ dsp_cmx_send_member(struct dsp *dsp, int len, s32 *c, int members)
                        else if (sample > 32767)
                                sample = 32767;
                        *d++ = dsp_audio_s16_to_law[sample & 0xffff];
-                           /* conf(echo) */
-                       r = (r+1) & CMX_BUFF_MASK;
+                       /* conf(echo) */
+                       r = (r + 1) & CMX_BUFF_MASK;
                }
        }
        dsp->tx_R = t;
@@ -1587,14 +1587,14 @@ send_packet:
                        txskb = mI_alloc_skb(len, GFP_ATOMIC);
                        if (!txskb) {
                                printk(KERN_ERR
-                                   "FATAL ERROR in mISDN_dsp.o: "
-                                   "cannot alloc %d bytes\n", len);
+                                      "FATAL ERROR in mISDN_dsp.o: "
+                                      "cannot alloc %d bytes\n", len);
                        } else {
                                thh = mISDN_HEAD_P(txskb);
                                thh->prim = DL_DATA_REQ;
                                thh->id = 0;
-                               memcpy(skb_put(txskb, len), nskb->data+preload,
-                                       len);
+                               memcpy(skb_put(txskb, len), nskb->data + preload,
+                                      len);
                                /* queue (trigger later) */
                                skb_queue_tail(&dsp->sendq, txskb);
                        }
@@ -1608,7 +1608,7 @@ send_packet:
        /* pipeline */
        if (dsp->pipeline.inuse)
                dsp_pipeline_process_tx(&dsp->pipeline, nskb->data,
-                       nskb->len);
+                                       nskb->len);
        /* crypt */
        if (dsp->bf_enable)
                dsp_bf_encrypt(dsp, nskb->data, nskb->len);
@@ -1621,7 +1621,7 @@ static u32        jittercount; /* counter for jitter check */
 struct timer_list dsp_spl_tl;
 u32    dsp_spl_jiffies; /* calculate the next time to fire */
 static u16     dsp_count; /* last sample count */
-static int     dsp_count_valid ; /* if we have last sample count */
+static int     dsp_count_valid; /* if we have last sample count */
 
 void
 dsp_cmx_send(void *arg)
@@ -1630,7 +1630,7 @@ dsp_cmx_send(void *arg)
        struct dsp_conf_member *member;
        struct dsp *dsp;
        int mustmix, members;
-       static s32 mixbuffer[MAX_POLL+100];
+       static s32 mixbuffer[MAX_POLL + 100];
        s32 *c;
        u8 *p, *q;
        int r, rr;
@@ -1675,9 +1675,9 @@ dsp_cmx_send(void *arg)
 #ifdef CMX_CONF_DEBUG
                        if (conf->software && members > 1)
 #else
-                       if (conf->software && members > 2)
+                               if (conf->software && members > 2)
 #endif
-                               mustmix = 1;
+                                       mustmix = 1;
                }
 
                /* transmission required */
@@ -1698,265 +1698,263 @@ dsp_cmx_send(void *arg)
 #ifdef CMX_CONF_DEBUG
                if (conf->software && members > 1) {
 #else
-               if (conf->software && members > 2) {
+                       if (conf->software && members > 2) {
 #endif
-                       /* check for hdlc conf */
-                       member = list_entry(conf->mlist.next,
-                               struct dsp_conf_member, list);
-                       if (member->dsp->hdlc)
-                               continue;
-                       /* mix all data */
-                       memset(mixbuffer, 0, length*sizeof(s32));
-                       list_for_each_entry(member, &conf->mlist, list) {
-                               dsp = member->dsp;
-                               /* get range of data to mix */
-                               c = mixbuffer;
-                               q = dsp->rx_buff;
-                               r = dsp->rx_R;
-                               rr = (r + length) & CMX_BUFF_MASK;
-                               /* add member's data */
-                               while (r != rr) {
-                                       *c++ += dsp_audio_law_to_s32[q[r]];
-                                       r = (r+1) & CMX_BUFF_MASK;
+                               /* check for hdlc conf */
+                               member = list_entry(conf->mlist.next,
+                                                   struct dsp_conf_member, list);
+                               if (member->dsp->hdlc)
+                                       continue;
+                               /* mix all data */
+                               memset(mixbuffer, 0, length * sizeof(s32));
+                               list_for_each_entry(member, &conf->mlist, list) {
+                                       dsp = member->dsp;
+                                       /* get range of data to mix */
+                                       c = mixbuffer;
+                                       q = dsp->rx_buff;
+                                       r = dsp->rx_R;
+                                       rr = (r + length) & CMX_BUFF_MASK;
+                                       /* add member's data */
+                                       while (r != rr) {
+                                               *c++ += dsp_audio_law_to_s32[q[r]];
+                                               r = (r + 1) & CMX_BUFF_MASK;
+                                       }
                                }
-                       }
-
-                       /* process each member */
-                       list_for_each_entry(member, &conf->mlist, list) {
-                               /* transmission */
-                               dsp_cmx_send_member(member->dsp, length,
-                                   mixbuffer, members);
-                       }
-               }
-       }
 
-       /* delete rx-data, increment buffers, change pointers */
-       list_for_each_entry(dsp, &dsp_ilist, list) {
-               if (dsp->hdlc)
-                       continue;
-               p = dsp->rx_buff;
-               q = dsp->tx_buff;
-               r = dsp->rx_R;
-               /* move receive pointer when receiving */
-               if (!dsp->rx_is_off) {
-                       rr = (r + length) & CMX_BUFF_MASK;
-                       /* delete rx-data */
-                       while (r != rr) {
-                               p[r] = dsp_silence;
-                               r = (r+1) & CMX_BUFF_MASK;
+                               /* process each member */
+                               list_for_each_entry(member, &conf->mlist, list) {
+                                       /* transmission */
+                                       dsp_cmx_send_member(member->dsp, length,
+                                                           mixbuffer, members);
+                               }
                        }
-                       /* increment rx-buffer pointer */
-                       dsp->rx_R = r; /* write incremented read pointer */
                }
 
-               /* check current rx_delay */
-               delay = (dsp->rx_W-dsp->rx_R) & CMX_BUFF_MASK;
-               if (delay >= CMX_BUFF_HALF)
-                       delay = 0; /* will be the delay before next write */
-               /* check for lower delay */
-               if (delay < dsp->rx_delay[0])
-                       dsp->rx_delay[0] = delay;
-               /* check current tx_delay */
-               delay = (dsp->tx_W-dsp->tx_R) & CMX_BUFF_MASK;
-               if (delay >= CMX_BUFF_HALF)
-                       delay = 0; /* will be the delay before next write */
-               /* check for lower delay */
-               if (delay < dsp->tx_delay[0])
-                       dsp->tx_delay[0] = delay;
-               if (jittercheck) {
-                       /* find the lowest of all rx_delays */
-                       delay = dsp->rx_delay[0];
-                       i = 1;
-                       while (i < MAX_SECONDS_JITTER_CHECK) {
-                               if (delay > dsp->rx_delay[i])
-                                       delay = dsp->rx_delay[i];
-                               i++;
-                       }
-                       /*
-                        * remove rx_delay only if we have delay AND we
-                        * have not preset cmx_delay AND
-                        * the delay is greater dsp_poll
-                        */
-                       if (delay > dsp_poll && !dsp->cmx_delay) {
-                               if (dsp_debug & DEBUG_DSP_CLOCK)
-                                       printk(KERN_DEBUG
-                                           "%s lowest rx_delay of %d bytes for"
-                                           " dsp %s are now removed.\n",
-                                           __func__, delay,
-                                           dsp->name);
-                               r = dsp->rx_R;
-                               rr = (r + delay - (dsp_poll >> 1))
-                                       & CMX_BUFF_MASK;
+               /* delete rx-data, increment buffers, change pointers */
+               list_for_each_entry(dsp, &dsp_ilist, list) {
+                       if (dsp->hdlc)
+                               continue;
+                       p = dsp->rx_buff;
+                       q = dsp->tx_buff;
+                       r = dsp->rx_R;
+                       /* move receive pointer when receiving */
+                       if (!dsp->rx_is_off) {
+                               rr = (r + length) & CMX_BUFF_MASK;
                                /* delete rx-data */
                                while (r != rr) {
                                        p[r] = dsp_silence;
-                                       r = (r+1) & CMX_BUFF_MASK;
+                                       r = (r + 1) & CMX_BUFF_MASK;
                                }
                                /* increment rx-buffer pointer */
-                               dsp->rx_R = r;
-                                   /* write incremented read pointer */
-                       }
-                       /* find the lowest of all tx_delays */
-                       delay = dsp->tx_delay[0];
-                       i = 1;
-                       while (i < MAX_SECONDS_JITTER_CHECK) {
-                               if (delay > dsp->tx_delay[i])
-                                       delay = dsp->tx_delay[i];
-                               i++;
+                               dsp->rx_R = r; /* write incremented read pointer */
                        }
-                       /*
-                        * remove delay only if we have delay AND we
-                        * have enabled tx_dejitter
-                        */
-                       if (delay > dsp_poll && dsp->tx_dejitter) {
-                               if (dsp_debug & DEBUG_DSP_CLOCK)
-                                       printk(KERN_DEBUG
-                                           "%s lowest tx_delay of %d bytes for"
-                                           " dsp %s are now removed.\n",
-                                           __func__, delay,
-                                           dsp->name);
-                               r = dsp->tx_R;
-                               rr = (r + delay - (dsp_poll >> 1))
-                                       & CMX_BUFF_MASK;
-                               /* delete tx-data */
-                               while (r != rr) {
-                                       q[r] = dsp_silence;
-                                       r = (r+1) & CMX_BUFF_MASK;
+
+                       /* check current rx_delay */
+                       delay = (dsp->rx_W-dsp->rx_R) & CMX_BUFF_MASK;
+                       if (delay >= CMX_BUFF_HALF)
+                               delay = 0; /* will be the delay before next write */
+                       /* check for lower delay */
+                       if (delay < dsp->rx_delay[0])
+                               dsp->rx_delay[0] = delay;
+                       /* check current tx_delay */
+                       delay = (dsp->tx_W-dsp->tx_R) & CMX_BUFF_MASK;
+                       if (delay >= CMX_BUFF_HALF)
+                               delay = 0; /* will be the delay before next write */
+                       /* check for lower delay */
+                       if (delay < dsp->tx_delay[0])
+                               dsp->tx_delay[0] = delay;
+                       if (jittercheck) {
+                               /* find the lowest of all rx_delays */
+                               delay = dsp->rx_delay[0];
+                               i = 1;
+                               while (i < MAX_SECONDS_JITTER_CHECK) {
+                                       if (delay > dsp->rx_delay[i])
+                                               delay = dsp->rx_delay[i];
+                                       i++;
                                }
-                               /* increment rx-buffer pointer */
-                               dsp->tx_R = r;
-                                   /* write incremented read pointer */
-                       }
-                       /* scroll up delays */
-                       i = MAX_SECONDS_JITTER_CHECK - 1;
-                       while (i) {
-                               dsp->rx_delay[i] = dsp->rx_delay[i-1];
-                               dsp->tx_delay[i] = dsp->tx_delay[i-1];
-                               i--;
+                               /*
+                                * remove rx_delay only if we have delay AND we
+                                * have not preset cmx_delay AND
+                                * the delay is greater dsp_poll
+                                */
+                               if (delay > dsp_poll && !dsp->cmx_delay) {
+                                       if (dsp_debug & DEBUG_DSP_CLOCK)
+                                               printk(KERN_DEBUG
+                                                      "%s lowest rx_delay of %d bytes for"
+                                                      " dsp %s are now removed.\n",
+                                                      __func__, delay,
+                                                      dsp->name);
+                                       r = dsp->rx_R;
+                                       rr = (r + delay - (dsp_poll >> 1))
+                                               & CMX_BUFF_MASK;
+                                       /* delete rx-data */
+                                       while (r != rr) {
+                                               p[r] = dsp_silence;
+                                               r = (r + 1) & CMX_BUFF_MASK;
+                                       }
+                                       /* increment rx-buffer pointer */
+                                       dsp->rx_R = r;
+                                       /* write incremented read pointer */
+                               }
+                               /* find the lowest of all tx_delays */
+                               delay = dsp->tx_delay[0];
+                               i = 1;
+                               while (i < MAX_SECONDS_JITTER_CHECK) {
+                                       if (delay > dsp->tx_delay[i])
+                                               delay = dsp->tx_delay[i];
+                                       i++;
+                               }
+                               /*
+                                * remove delay only if we have delay AND we
+                                * have enabled tx_dejitter
+                                */
+                               if (delay > dsp_poll && dsp->tx_dejitter) {
+                                       if (dsp_debug & DEBUG_DSP_CLOCK)
+                                               printk(KERN_DEBUG
+                                                      "%s lowest tx_delay of %d bytes for"
+                                                      " dsp %s are now removed.\n",
+                                                      __func__, delay,
+                                                      dsp->name);
+                                       r = dsp->tx_R;
+                                       rr = (r + delay - (dsp_poll >> 1))
+                                               & CMX_BUFF_MASK;
+                                       /* delete tx-data */
+                                       while (r != rr) {
+                                               q[r] = dsp_silence;
+                                               r = (r + 1) & CMX_BUFF_MASK;
+                                       }
+                                       /* increment rx-buffer pointer */
+                                       dsp->tx_R = r;
+                                       /* write incremented read pointer */
+                               }
+                               /* scroll up delays */
+                               i = MAX_SECONDS_JITTER_CHECK - 1;
+                               while (i) {
+                                       dsp->rx_delay[i] = dsp->rx_delay[i - 1];
+                                       dsp->tx_delay[i] = dsp->tx_delay[i - 1];
+                                       i--;
+                               }
+                               dsp->tx_delay[0] = CMX_BUFF_HALF; /* (infinite) delay */
+                               dsp->rx_delay[0] = CMX_BUFF_HALF; /* (infinite) delay */
                        }
-                       dsp->tx_delay[0] = CMX_BUFF_HALF; /* (infinite) delay */
-                       dsp->rx_delay[0] = CMX_BUFF_HALF; /* (infinite) delay */
                }
-       }
 
-       /* if next event would be in the past ... */
-       if ((s32)(dsp_spl_jiffies+dsp_tics-jiffies) <= 0)
-               dsp_spl_jiffies = jiffies + 1;
-       else
-               dsp_spl_jiffies += dsp_tics;
+               /* if next event would be in the past ... */
+               if ((s32)(dsp_spl_jiffies + dsp_tics-jiffies) <= 0)
+                       dsp_spl_jiffies = jiffies + 1;
+               else
+                       dsp_spl_jiffies += dsp_tics;
 
-       dsp_spl_tl.expires = dsp_spl_jiffies;
-       add_timer(&dsp_spl_tl);
+               dsp_spl_tl.expires = dsp_spl_jiffies;
+               add_timer(&dsp_spl_tl);
 
-       /* unlock */
-       spin_unlock_irqrestore(&dsp_lock, flags);
-}
+               /* unlock */
+               spin_unlock_irqrestore(&dsp_lock, flags);
+       }
 
 /*
  * audio data is transmitted from upper layer to the dsp
  */
-void
-dsp_cmx_transmit(struct dsp *dsp, struct sk_buff *skb)
-{
-       u_int w, ww;
-       u8 *d, *p;
-       int space; /* todo: , l = skb->len; */
+       void
+               dsp_cmx_transmit(struct dsp *dsp, struct sk_buff *skb)
+       {
+               u_int w, ww;
+               u8 *d, *p;
+               int space; /* todo: , l = skb->len; */
 #ifdef CMX_TX_DEBUG
-       char debugbuf[256] = "";
+               char debugbuf[256] = "";
 #endif
 
-       /* check if there is enough space, and then copy */
-       w = dsp->tx_W;
-       ww = dsp->tx_R;
-       p = dsp->tx_buff;
-       d = skb->data;
-       space = (ww - w - 1) & CMX_BUFF_MASK;
-       /* write-pointer should not overrun nor reach read pointer */
-       if (space < skb->len) {
-               /* write to the space we have left */
-               ww = (ww - 1) & CMX_BUFF_MASK; /* end one byte prior tx_R */
-               if (dsp_debug & DEBUG_DSP_CLOCK)
-                       printk(KERN_DEBUG "%s: TX overflow space=%d skb->len="
-                           "%d, w=0x%04x, ww=0x%04x\n", __func__, space,
-                           skb->len, w, ww);
-       } else
-               /* write until all byte are copied */
-               ww = (w + skb->len) & CMX_BUFF_MASK;
-       dsp->tx_W = ww;
-
-       /* show current buffer */
+               /* check if there is enough space, and then copy */
+               w = dsp->tx_W;
+               ww = dsp->tx_R;
+               p = dsp->tx_buff;
+               d = skb->data;
+               space = (ww - w - 1) & CMX_BUFF_MASK;
+               /* write-pointer should not overrun nor reach read pointer */
+               if (space < skb->len) {
+                       /* write to the space we have left */
+                       ww = (ww - 1) & CMX_BUFF_MASK; /* end one byte prior tx_R */
+                       if (dsp_debug & DEBUG_DSP_CLOCK)
+                               printk(KERN_DEBUG "%s: TX overflow space=%d skb->len="
+                                      "%d, w=0x%04x, ww=0x%04x\n", __func__, space,
+                                      skb->len, w, ww);
+               } else
+                       /* write until all byte are copied */
+                       ww = (w + skb->len) & CMX_BUFF_MASK;
+               dsp->tx_W = ww;
+
+               /* show current buffer */
 #ifdef CMX_DEBUG
-       printk(KERN_DEBUG
-           "cmx_transmit(dsp=%lx) %d bytes to 0x%x-0x%x. %s\n",
-           (u_long)dsp, (ww-w)&CMX_BUFF_MASK, w, ww, dsp->name);
+               printk(KERN_DEBUG
+                      "cmx_transmit(dsp=%lx) %d bytes to 0x%x-0x%x. %s\n",
+                      (u_long)dsp, (ww - w) & CMX_BUFF_MASK, w, ww, dsp->name);
 #endif
 
-       /* copy transmit data to tx-buffer */
+               /* copy transmit data to tx-buffer */
 #ifdef CMX_TX_DEBUG
-       sprintf(debugbuf, "TX getting (%04x-%04x)%p: ", w, ww, p);
+               sprintf(debugbuf, "TX getting (%04x-%04x)%p: ", w, ww, p);
 #endif
-       while (w != ww) {
+               while (w != ww) {
 #ifdef CMX_TX_DEBUG
-               if (strlen(debugbuf) < 48)
-                       sprintf(debugbuf+strlen(debugbuf), " %02x", *d);
+                       if (strlen(debugbuf) < 48)
+                               sprintf(debugbuf + strlen(debugbuf), " %02x", *d);
 #endif
-               p[w] = *d++;
-               w = (w+1) & CMX_BUFF_MASK;
-       }
+                       p[w] = *d++;
+                       w = (w + 1) & CMX_BUFF_MASK;
+               }
 #ifdef CMX_TX_DEBUG
-       printk(KERN_DEBUG "%s\n", debugbuf);
+               printk(KERN_DEBUG "%s\n", debugbuf);
 #endif
 
-}
+       }
 
 /*
  * hdlc data is received from card and sent to all members.
  */
-void
-dsp_cmx_hdlc(struct dsp *dsp, struct sk_buff *skb)
-{
-       struct sk_buff *nskb = NULL;
-       struct dsp_conf_member *member;
-       struct mISDNhead *hh;
-
-       /* not if not active */
-       if (!dsp->b_active)
-               return;
+       void
+               dsp_cmx_hdlc(struct dsp *dsp, struct sk_buff *skb)
+       {
+               struct sk_buff *nskb = NULL;
+               struct dsp_conf_member *member;
+               struct mISDNhead *hh;
+
+               /* not if not active */
+               if (!dsp->b_active)
+                       return;
 
-       /* check if we have sompen */
-       if (skb->len < 1)
-               return;
+               /* check if we have sompen */
+               if (skb->len < 1)
+                       return;
 
-       /* no conf */
-       if (!dsp->conf) {
-               /* in case of software echo */
-               if (dsp->echo.software) {
-                       nskb = skb_clone(skb, GFP_ATOMIC);
-                       if (nskb) {
-                               hh = mISDN_HEAD_P(nskb);
-                               hh->prim = PH_DATA_REQ;
-                               hh->id = 0;
-                               skb_queue_tail(&dsp->sendq, nskb);
-                               schedule_work(&dsp->workq);
+               /* no conf */
+               if (!dsp->conf) {
+                       /* in case of software echo */
+                       if (dsp->echo.software) {
+                               nskb = skb_clone(skb, GFP_ATOMIC);
+                               if (nskb) {
+                                       hh = mISDN_HEAD_P(nskb);
+                                       hh->prim = PH_DATA_REQ;
+                                       hh->id = 0;
+                                       skb_queue_tail(&dsp->sendq, nskb);
+                                       schedule_work(&dsp->workq);
+                               }
                        }
+                       return;
                }
-               return;
-       }
-       /* in case of hardware conference */
-       if (dsp->conf->hardware)
-               return;
-       list_for_each_entry(member, &dsp->conf->mlist, list) {
-               if (dsp->echo.software || member->dsp != dsp) {
-                       nskb = skb_clone(skb, GFP_ATOMIC);
-                       if (nskb) {
-                               hh = mISDN_HEAD_P(nskb);
-                               hh->prim = PH_DATA_REQ;
-                               hh->id = 0;
-                               skb_queue_tail(&member->dsp->sendq, nskb);
-                               schedule_work(&member->dsp->workq);
+               /* in case of hardware conference */
+               if (dsp->conf->hardware)
+                       return;
+               list_for_each_entry(member, &dsp->conf->mlist, list) {
+                       if (dsp->echo.software || member->dsp != dsp) {
+                               nskb = skb_clone(skb, GFP_ATOMIC);
+                               if (nskb) {
+                                       hh = mISDN_HEAD_P(nskb);
+                                       hh->prim = PH_DATA_REQ;
+                                       hh->id = 0;
+                                       skb_queue_tail(&member->dsp->sendq, nskb);
+                                       schedule_work(&member->dsp->workq);
+                               }
                        }
                }
        }
-}
-
-
index 0c41553..2ac2d7a 100644 (file)
@@ -218,20 +218,20 @@ dsp_rx_off_member(struct dsp *dsp)
        if (!dsp->ch.peer) {
                if (dsp_debug & DEBUG_DSP_CORE)
                        printk(KERN_DEBUG "%s: no peer, no rx_off\n",
-                               __func__);
+                              __func__);
                return;
        }
        cq.op = MISDN_CTRL_RX_OFF;
        cq.p1 = rx_off;
        if (dsp->ch.peer->ctrl(dsp->ch.peer, CONTROL_CHANNEL, &cq)) {
                printk(KERN_DEBUG "%s: 2nd CONTROL_CHANNEL failed\n",
-                       __func__);
+                      __func__);
                return;
        }
        dsp->rx_is_off = rx_off;
        if (dsp_debug & DEBUG_DSP_CORE)
                printk(KERN_DEBUG "%s: %s set rx_off = %d\n",
-                       __func__, dsp->name, rx_off);
+                      __func__, dsp->name, rx_off);
 }
 static void
 dsp_rx_off(struct dsp *dsp)
@@ -263,19 +263,19 @@ dsp_fill_empty(struct dsp *dsp)
        if (!dsp->ch.peer) {
                if (dsp_debug & DEBUG_DSP_CORE)
                        printk(KERN_DEBUG "%s: no peer, no fill_empty\n",
-                               __func__);
+                              __func__);
                return;
        }
        cq.op = MISDN_CTRL_FILL_EMPTY;
        cq.p1 = 1;
        if (dsp->ch.peer->ctrl(dsp->ch.peer, CONTROL_CHANNEL, &cq)) {
                printk(KERN_DEBUG "%s: CONTROL_CHANNEL failed\n",
-                       __func__);
+                      __func__);
                return;
        }
        if (dsp_debug & DEBUG_DSP_CORE)
                printk(KERN_DEBUG "%s: %s set fill_empty = 1\n",
-                       __func__, dsp->name);
+                      __func__, dsp->name);
 }
 
 static int
@@ -304,7 +304,7 @@ dsp_control_req(struct dsp *dsp, struct mISDNhead *hh, struct sk_buff *skb)
                if (len == sizeof(int)) {
                        if (dsp_debug & DEBUG_DSP_CORE)
                                printk(KERN_NOTICE "changing DTMF Threshold "
-                                       "to %d\n", *((int *)data));
+                                      "to %d\n", *((int *)data));
                        dsp->dtmf.treshold = (*(int *)data) * 10000;
                }
                dsp->dtmf.enable = 1;
@@ -331,19 +331,19 @@ dsp_control_req(struct dsp *dsp, struct mISDNhead *hh, struct sk_buff *skb)
                        goto conf_split;
                if (dsp_debug & DEBUG_DSP_CORE)
                        printk(KERN_DEBUG "%s: join conference %d\n",
-                               __func__, *((u32 *)data));
+                              __func__, *((u32 *)data));
                ret = dsp_cmx_conf(dsp, *((u32 *)data));
-                       /* dsp_cmx_hardware will also be called here */
+               /* dsp_cmx_hardware will also be called here */
                dsp_rx_off(dsp);
                if (dsp_debug & DEBUG_DSP_CMX)
                        dsp_cmx_debug(dsp);
                break;
        case DSP_CONF_SPLIT: /* remove from conference */
-conf_split:
+       conf_split:
                if (dsp_debug & DEBUG_DSP_CORE)
                        printk(KERN_DEBUG "%s: release conference\n", __func__);
                ret = dsp_cmx_conf(dsp, 0);
-                       /* dsp_cmx_hardware will also be called here */
+               /* dsp_cmx_hardware will also be called here */
                if (dsp_debug & DEBUG_DSP_CMX)
                        dsp_cmx_debug(dsp);
                dsp_rx_off(dsp);
@@ -359,7 +359,7 @@ conf_split:
                }
                if (dsp_debug & DEBUG_DSP_CORE)
                        printk(KERN_DEBUG "%s: turn tone 0x%x on\n",
-                               __func__, *((int *)skb->data));
+                              __func__, *((int *)skb->data));
                ret = dsp_tone(dsp, *((int *)data));
                if (!ret) {
                        dsp_cmx_hardware(dsp->conf, dsp);
@@ -379,7 +379,7 @@ conf_split:
                dsp_cmx_hardware(dsp->conf, dsp);
                dsp_rx_off(dsp);
                /* reset tx buffers (user space data) */
-tone_off:
+       tone_off:
                dsp->rx_W = 0;
                dsp->rx_R = 0;
                break;
@@ -395,7 +395,7 @@ tone_off:
                dsp->tx_volume = *((int *)data);
                if (dsp_debug & DEBUG_DSP_CORE)
                        printk(KERN_DEBUG "%s: change tx vol to %d\n",
-                               __func__, dsp->tx_volume);
+                              __func__, dsp->tx_volume);
                dsp_cmx_hardware(dsp->conf, dsp);
                dsp_dtmf_hardware(dsp);
                dsp_rx_off(dsp);
@@ -412,7 +412,7 @@ tone_off:
                dsp->rx_volume = *((int *)data);
                if (dsp_debug & DEBUG_DSP_CORE)
                        printk(KERN_DEBUG "%s: change rx vol to %d\n",
-                               __func__, dsp->tx_volume);
+                              __func__, dsp->tx_volume);
                dsp_cmx_hardware(dsp->conf, dsp);
                dsp_dtmf_hardware(dsp);
                dsp_rx_off(dsp);
@@ -439,14 +439,14 @@ tone_off:
        case DSP_RECEIVE_ON: /* enable receive to user space */
                if (dsp_debug & DEBUG_DSP_CORE)
                        printk(KERN_DEBUG "%s: enable receive to user "
-                               "space\n", __func__);
+                              "space\n", __func__);
                dsp->rx_disabled = 0;
                dsp_rx_off(dsp);
                break;
        case DSP_RECEIVE_OFF: /* disable receive to user space */
                if (dsp_debug & DEBUG_DSP_CORE)
                        printk(KERN_DEBUG "%s: disable receive to "
-                               "user space\n", __func__);
+                              "user space\n", __func__);
                dsp->rx_disabled = 1;
                dsp_rx_off(dsp);
                break;
@@ -457,7 +457,7 @@ tone_off:
                }
                if (dsp_debug & DEBUG_DSP_CORE)
                        printk(KERN_DEBUG "%s: enable mixing of "
-                               "tx-data with conf mebers\n", __func__);
+                              "tx-data with conf mebers\n", __func__);
                dsp->tx_mix = 1;
                dsp_cmx_hardware(dsp->conf, dsp);
                dsp_rx_off(dsp);
@@ -471,7 +471,7 @@ tone_off:
                }
                if (dsp_debug & DEBUG_DSP_CORE)
                        printk(KERN_DEBUG "%s: disable mixing of "
-                               "tx-data with conf mebers\n", __func__);
+                              "tx-data with conf mebers\n", __func__);
                dsp->tx_mix = 0;
                dsp_cmx_hardware(dsp->conf, dsp);
                dsp_rx_off(dsp);
@@ -507,18 +507,18 @@ tone_off:
                        break;
                }
                dsp->cmx_delay = (*((int *)data)) << 3;
-                       /* milliseconds to samples */
-               if (dsp->cmx_delay >= (CMX_BUFF_HALF>>1))
+               /* milliseconds to samples */
+               if (dsp->cmx_delay >= (CMX_BUFF_HALF >> 1))
                        /* clip to half of maximum usable buffer
-                       (half of half buffer) */
-                       dsp->cmx_delay = (CMX_BUFF_HALF>>1) - 1;
+                          (half of half buffer) */
+                       dsp->cmx_delay = (CMX_BUFF_HALF >> 1) - 1;
                if (dsp_debug & DEBUG_DSP_CORE)
                        printk(KERN_DEBUG "%s: use delay algorithm to "
-                               "compensate jitter (%d samples)\n",
-                               __func__, dsp->cmx_delay);
+                              "compensate jitter (%d samples)\n",
+                              __func__, dsp->cmx_delay);
                break;
        case DSP_JITTER: /* use dynamic jitter algorithm instead of
-                   delay algorithm */
+                           delay algorithm */
                if (dsp->hdlc) {
                        ret = -EINVAL;
                        break;
@@ -526,7 +526,7 @@ tone_off:
                dsp->cmx_delay = 0;
                if (dsp_debug & DEBUG_DSP_CORE)
                        printk(KERN_DEBUG "%s: use jitter algorithm to "
-                               "compensate jitter\n", __func__);
+                              "compensate jitter\n", __func__);
                break;
        case DSP_TX_DEJITTER: /* use dynamic jitter algorithm for tx-buffer */
                if (dsp->hdlc) {
@@ -536,7 +536,7 @@ tone_off:
                dsp->tx_dejitter = 1;
                if (dsp_debug & DEBUG_DSP_CORE)
                        printk(KERN_DEBUG "%s: use dejitter on TX "
-                               "buffer\n", __func__);
+                              "buffer\n", __func__);
                break;
        case DSP_TX_DEJ_OFF: /* use tx-buffer without dejittering*/
                if (dsp->hdlc) {
@@ -546,7 +546,7 @@ tone_off:
                dsp->tx_dejitter = 0;
                if (dsp_debug & DEBUG_DSP_CORE)
                        printk(KERN_DEBUG "%s: use TX buffer without "
-                               "dejittering\n", __func__);
+                              "dejittering\n", __func__);
                break;
        case DSP_PIPELINE_CFG:
                if (dsp->hdlc) {
@@ -555,13 +555,13 @@ tone_off:
                }
                if (len > 0 && ((char *)data)[len - 1]) {
                        printk(KERN_DEBUG "%s: pipeline config string "
-                               "is not NULL terminated!\n", __func__);
+                              "is not NULL terminated!\n", __func__);
                        ret = -EINVAL;
                } else {
                        dsp->pipeline.inuse = 1;
                        dsp_cmx_hardware(dsp->conf, dsp);
                        ret = dsp_pipeline_build(&dsp->pipeline,
-                               len > 0 ? data : NULL);
+                                                len > 0 ? data : NULL);
                        dsp_cmx_hardware(dsp->conf, dsp);
                        dsp_rx_off(dsp);
                }
@@ -577,7 +577,7 @@ tone_off:
                }
                if (dsp_debug & DEBUG_DSP_CORE)
                        printk(KERN_DEBUG "%s: turn blowfish on (key "
-                               "not shown)\n", __func__);
+                              "not shown)\n", __func__);
                ret = dsp_bf_init(dsp, (u8 *)data, len);
                /* set new cont */
                if (!ret)
@@ -586,7 +586,7 @@ tone_off:
                        cont = DSP_BF_REJECT;
                /* send indication if it worked to set it */
                nskb = _alloc_mISDN_skb(PH_CONTROL_IND, MISDN_ID_ANY,
-                       sizeof(int), &cont, GFP_ATOMIC);
+                                       sizeof(int), &cont, GFP_ATOMIC);
                if (nskb) {
                        if (dsp->up) {
                                if (dsp->up->send(dsp->up, nskb))
@@ -615,7 +615,7 @@ tone_off:
        default:
                if (dsp_debug & DEBUG_DSP_CORE)
                        printk(KERN_DEBUG "%s: ctrl req %x unhandled\n",
-                               __func__, cont);
+                              __func__, cont);
                ret = -EINVAL;
        }
        return ret;
@@ -630,14 +630,14 @@ get_features(struct mISDNchannel *ch)
        if (!ch->peer) {
                if (dsp_debug & DEBUG_DSP_CORE)
                        printk(KERN_DEBUG "%s: no peer, no features\n",
-                               __func__);
+                              __func__);
                return;
        }
        memset(&cq, 0, sizeof(cq));
        cq.op = MISDN_CTRL_GETOP;
        if (ch->peer->ctrl(ch->peer, CONTROL_CHANNEL, &cq) < 0) {
                printk(KERN_DEBUG "%s: CONTROL_CHANNEL failed\n",
-                       __func__);
+                      __func__);
                return;
        }
        if (cq.op & MISDN_CTRL_RX_OFF)
@@ -651,12 +651,12 @@ get_features(struct mISDNchannel *ch)
                *((u_long *)&cq.p1) = (u_long)&dsp->features;
                if (ch->peer->ctrl(ch->peer, CONTROL_CHANNEL, &cq)) {
                        printk(KERN_DEBUG "%s: 2nd CONTROL_CHANNEL failed\n",
-                               __func__);
+                              __func__);
                }
        } else
                if (dsp_debug & DEBUG_DSP_CORE)
                        printk(KERN_DEBUG "%s: features not supported for %s\n",
-                               __func__, dsp->name);
+                              __func__, dsp->name);
 }
 
 static int
@@ -670,7 +670,7 @@ dsp_function(struct mISDNchannel *ch,  struct sk_buff *skb)
 
        hh = mISDN_HEAD_P(skb);
        switch (hh->prim) {
-       /* FROM DOWN */
+               /* FROM DOWN */
        case (PH_DATA_CNF):
                dsp->data_pending = 0;
                /* trigger next hdlc frame, if any */
@@ -690,8 +690,8 @@ dsp_function(struct mISDNchannel *ch,  struct sk_buff *skb)
                if (dsp->rx_is_off) {
                        if (dsp_debug & DEBUG_DSP_CORE)
                                printk(KERN_DEBUG "%s: rx-data during rx_off"
-                                       " for %s\n",
-                               __func__, dsp->name);
+                                      " for %s\n",
+                                      __func__, dsp->name);
                }
                if (dsp->hdlc) {
                        /* hdlc */
@@ -716,14 +716,14 @@ dsp_function(struct mISDNchannel *ch,  struct sk_buff *skb)
                /* pipeline */
                if (dsp->pipeline.inuse)
                        dsp_pipeline_process_rx(&dsp->pipeline, skb->data,
-                               skb->len, hh->id);
+                                               skb->len, hh->id);
                /* change volume if requested */
                if (dsp->rx_volume)
                        dsp_change_volume(skb, dsp->rx_volume);
                /* check if dtmf soft decoding is turned on */
                if (dsp->dtmf.software) {
                        digits = dsp_dtmf_goertzel_decode(dsp, skb->data,
-                               skb->len, (dsp_options&DSP_OPT_ULAW) ? 1 : 0);
+                                                         skb->len, (dsp_options & DSP_OPT_ULAW) ? 1 : 0);
                }
                /* we need to process receive data if software */
                if (dsp->conf && dsp->conf->software) {
@@ -740,16 +740,16 @@ dsp_function(struct mISDNchannel *ch,  struct sk_buff *skb)
                                struct sk_buff *nskb;
                                if (dsp_debug & DEBUG_DSP_DTMF)
                                        printk(KERN_DEBUG "%s: digit"
-                                           "(%c) to layer %s\n",
-                                           __func__, *digits, dsp->name);
+                                              "(%c) to layer %s\n",
+                                              __func__, *digits, dsp->name);
                                k = *digits | DTMF_TONE_VAL;
                                nskb = _alloc_mISDN_skb(PH_CONTROL_IND,
-                                       MISDN_ID_ANY, sizeof(int), &k,
-                                       GFP_ATOMIC);
+                                                       MISDN_ID_ANY, sizeof(int), &k,
+                                                       GFP_ATOMIC);
                                if (nskb) {
                                        if (dsp->up) {
                                                if (dsp->up->send(
-                                                   dsp->up, nskb))
+                                                           dsp->up, nskb))
                                                        dev_kfree_skb(nskb);
                                        } else
                                                dev_kfree_skb(nskb);
@@ -768,34 +768,34 @@ dsp_function(struct mISDNchannel *ch,  struct sk_buff *skb)
        case (PH_CONTROL_IND):
                if (dsp_debug & DEBUG_DSP_DTMFCOEFF)
                        printk(KERN_DEBUG "%s: PH_CONTROL INDICATION "
-                               "received: %x (len %d) %s\n", __func__,
-                               hh->id, skb->len, dsp->name);
+                              "received: %x (len %d) %s\n", __func__,
+                              hh->id, skb->len, dsp->name);
                switch (hh->id) {
                case (DTMF_HFC_COEF): /* getting coefficients */
                        if (!dsp->dtmf.hardware) {
                                if (dsp_debug & DEBUG_DSP_DTMFCOEFF)
                                        printk(KERN_DEBUG "%s: ignoring DTMF "
-                                               "coefficients from HFC\n",
-                                               __func__);
+                                              "coefficients from HFC\n",
+                                              __func__);
                                break;
                        }
                        digits = dsp_dtmf_goertzel_decode(dsp, skb->data,
-                               skb->len, 2);
+                                                         skb->len, 2);
                        while (*digits) {
                                int k;
                                struct sk_buff *nskb;
                                if (dsp_debug & DEBUG_DSP_DTMF)
                                        printk(KERN_DEBUG "%s: digit"
-                                           "(%c) to layer %s\n",
-                                           __func__, *digits, dsp->name);
+                                              "(%c) to layer %s\n",
+                                              __func__, *digits, dsp->name);
                                k = *digits | DTMF_TONE_VAL;
                                nskb = _alloc_mISDN_skb(PH_CONTROL_IND,
-                                       MISDN_ID_ANY, sizeof(int), &k,
-                                       GFP_ATOMIC);
+                                                       MISDN_ID_ANY, sizeof(int), &k,
+                                                       GFP_ATOMIC);
                                if (nskb) {
                                        if (dsp->up) {
                                                if (dsp->up->send(
-                                                   dsp->up, nskb))
+                                                           dsp->up, nskb))
                                                        dev_kfree_skb(nskb);
                                        } else
                                                dev_kfree_skb(nskb);
@@ -812,7 +812,7 @@ dsp_function(struct mISDNchannel *ch,  struct sk_buff *skb)
                        dsp->tx_volume = *((int *)skb->data);
                        if (dsp_debug & DEBUG_DSP_CORE)
                                printk(KERN_DEBUG "%s: change tx volume to "
-                                       "%d\n", __func__, dsp->tx_volume);
+                                      "%d\n", __func__, dsp->tx_volume);
                        dsp_cmx_hardware(dsp->conf, dsp);
                        dsp_dtmf_hardware(dsp);
                        dsp_rx_off(dsp);
@@ -821,7 +821,7 @@ dsp_function(struct mISDNchannel *ch,  struct sk_buff *skb)
                default:
                        if (dsp_debug & DEBUG_DSP_CORE)
                                printk(KERN_DEBUG "%s: ctrl ind %x unhandled "
-                                       "%s\n", __func__, hh->id, dsp->name);
+                                      "%s\n", __func__, hh->id, dsp->name);
                        ret = -EINVAL;
                }
                break;
@@ -829,13 +829,13 @@ dsp_function(struct mISDNchannel *ch,  struct sk_buff *skb)
        case (PH_ACTIVATE_CNF):
                if (dsp_debug & DEBUG_DSP_CORE)
                        printk(KERN_DEBUG "%s: b_channel is now active %s\n",
-                               __func__, dsp->name);
+                              __func__, dsp->name);
                /* bchannel now active */
                spin_lock_irqsave(&dsp_lock, flags);
                dsp->b_active = 1;
                dsp->data_pending = 0;
                dsp->rx_init = 1;
-                       /* rx_W and rx_R will be adjusted on first frame */
+               /* rx_W and rx_R will be adjusted on first frame */
                dsp->rx_W = 0;
                dsp->rx_R = 0;
                memset(dsp->rx_buff, 0, sizeof(dsp->rx_buff));
@@ -845,8 +845,8 @@ dsp_function(struct mISDNchannel *ch,  struct sk_buff *skb)
                spin_unlock_irqrestore(&dsp_lock, flags);
                if (dsp_debug & DEBUG_DSP_CORE)
                        printk(KERN_DEBUG "%s: done with activation, sending "
-                               "confirm to user space. %s\n", __func__,
-                               dsp->name);
+                              "confirm to user space. %s\n", __func__,
+                              dsp->name);
                /* send activation to upper layer */
                hh->prim = DL_ESTABLISH_CNF;
                if (dsp->up)
@@ -856,7 +856,7 @@ dsp_function(struct mISDNchannel *ch,  struct sk_buff *skb)
        case (PH_DEACTIVATE_CNF):
                if (dsp_debug & DEBUG_DSP_CORE)
                        printk(KERN_DEBUG "%s: b_channel is now inactive %s\n",
-                               __func__, dsp->name);
+                              __func__, dsp->name);
                /* bchannel now inactive */
                spin_lock_irqsave(&dsp_lock, flags);
                dsp->b_active = 0;
@@ -868,7 +868,7 @@ dsp_function(struct mISDNchannel *ch,  struct sk_buff *skb)
                if (dsp->up)
                        return dsp->up->send(dsp->up, skb);
                break;
-       /* FROM UP */
+               /* FROM UP */
        case (DL_DATA_REQ):
        case (PH_DATA_REQ):
                if (skb->len < 1) {
@@ -904,7 +904,7 @@ dsp_function(struct mISDNchannel *ch,  struct sk_buff *skb)
        case (PH_ACTIVATE_REQ):
                if (dsp_debug & DEBUG_DSP_CORE)
                        printk(KERN_DEBUG "%s: activating b_channel %s\n",
-                               __func__, dsp->name);
+                              __func__, dsp->name);
                if (dsp->dtmf.hardware || dsp->dtmf.software)
                        dsp_dtmf_goertzel_init(dsp);
                get_features(ch);
@@ -920,7 +920,7 @@ dsp_function(struct mISDNchannel *ch,  struct sk_buff *skb)
        case (PH_DEACTIVATE_REQ):
                if (dsp_debug & DEBUG_DSP_CORE)
                        printk(KERN_DEBUG "%s: releasing b_channel %s\n",
-                               __func__, dsp->name);
+                              __func__, dsp->name);
                spin_lock_irqsave(&dsp_lock, flags);
                dsp->tone.tone = 0;
                dsp->tone.hardware = 0;
@@ -939,7 +939,7 @@ dsp_function(struct mISDNchannel *ch,  struct sk_buff *skb)
        default:
                if (dsp_debug & DEBUG_DSP_CORE)
                        printk(KERN_DEBUG "%s: msg %x unhandled %s\n",
-                               __func__, hh->prim, dsp->name);
+                              __func__, hh->prim, dsp->name);
                ret = -EINVAL;
        }
        if (!ret)
@@ -978,7 +978,7 @@ dsp_ctrl(struct mISDNchannel *ch, u_int cmd, void *arg)
                skb_queue_purge(&dsp->sendq);
                if (dsp_debug & DEBUG_DSP_CTRL)
                        printk(KERN_DEBUG "%s: releasing member %s\n",
-                               __func__, dsp->name);
+                              __func__, dsp->name);
                dsp->b_active = 0;
                dsp_cmx_conf(dsp, 0); /* dsp_cmx_hardware will also be called
                                         here */
@@ -986,13 +986,13 @@ dsp_ctrl(struct mISDNchannel *ch, u_int cmd, void *arg)
 
                if (dsp_debug & DEBUG_DSP_CTRL)
                        printk(KERN_DEBUG "%s: remove & destroy object %s\n",
-                               __func__, dsp->name);
+                              __func__, dsp->name);
                list_del(&dsp->list);
                spin_unlock_irqrestore(&dsp_lock, flags);
 
                if (dsp_debug & DEBUG_DSP_CTRL)
                        printk(KERN_DEBUG "%s: dsp instance released\n",
-                               __func__);
+                              __func__);
                vfree(dsp);
                module_put(THIS_MODULE);
                break;
@@ -1016,7 +1016,7 @@ dsp_send_bh(struct work_struct *work)
                if (dsp->data_pending) {
                        if (dsp_debug & DEBUG_DSP_CORE)
                                printk(KERN_DEBUG "%s: fifo full %s, this is "
-                                       "no bug!\n", __func__, dsp->name);
+                                      "no bug!\n", __func__, dsp->name);
                        /* flush transparent data, if not acked */
                        dev_kfree_skb(skb);
                        continue;
@@ -1050,7 +1050,7 @@ dspcreate(struct channel_req *crq)
        u_long          flags;
 
        if (crq->protocol != ISDN_P_B_L2DSP
-        && crq->protocol != ISDN_P_B_L2DSPHDLC)
+           && crq->protocol != ISDN_P_B_L2DSPHDLC)
                return -EPROTONOSUPPORT;
        ndsp = vzalloc(sizeof(struct dsp));
        if (!ndsp) {
@@ -1076,7 +1076,7 @@ dspcreate(struct channel_req *crq)
        }
        if (!try_module_get(THIS_MODULE))
                printk(KERN_WARNING "%s:cannot get module\n",
-                       __func__);
+                      __func__);
 
        sprintf(ndsp->name, "DSP_C%x(0x%p)",
                ndsp->up->st->dev->id + 1, ndsp);
@@ -1095,7 +1095,7 @@ dspcreate(struct channel_req *crq)
 
        if (dtmfthreshold < 20 || dtmfthreshold > 500)
                dtmfthreshold = 200;
-       ndsp->dtmf.treshold = dtmfthreshold*10000;
+       ndsp->dtmf.treshold = dtmfthreshold * 10000;
 
        /* init pipeline append to list */
        spin_lock_irqsave(&dsp_lock, flags);
@@ -1109,7 +1109,7 @@ dspcreate(struct channel_req *crq)
 
 static struct Bprotocol DSP = {
        .Bprotocols = (1 << (ISDN_P_B_L2DSP & ISDN_P_B_MASK))
-               | (1 << (ISDN_P_B_L2DSPHDLC & ISDN_P_B_MASK)),
+       | (1 << (ISDN_P_B_L2DSPHDLC & ISDN_P_B_MASK)),
        .name = "dsp",
        .create = dspcreate
 };
@@ -1119,7 +1119,7 @@ static int __init dsp_init(void)
        int err;
        int tics;
 
-       printk(KERN_INFO "DSP modul %s\n", mISDN_dsp_revision);
+       printk(KERN_INFO "DSP module %s\n", mISDN_dsp_revision);
 
        dsp_options = options;
        dsp_debug = debug;
@@ -1129,21 +1129,21 @@ static int __init dsp_init(void)
        if (dsp_poll) {
                if (dsp_poll > MAX_POLL) {
                        printk(KERN_ERR "%s: Wrong poll value (%d), use %d "
-                               "maximum.\n", __func__, poll, MAX_POLL);
+                              "maximum.\n", __func__, poll, MAX_POLL);
                        err = -EINVAL;
                        return err;
                }
                if (dsp_poll < 8) {
                        printk(KERN_ERR "%s: Wrong poll value (%d), use 8 "
-                               "minimum.\n", __func__, dsp_poll);
+                              "minimum.\n", __func__, dsp_poll);
                        err = -EINVAL;
                        return err;
                }
                dsp_tics = poll * HZ / 8000;
                if (dsp_tics * 8000 != poll * HZ) {
                        printk(KERN_INFO "mISDN_dsp: Cannot clock every %d "
-                               "samples (0,125 ms). It is not a multiple of "
-                               "%d HZ.\n", poll, HZ);
+                              "samples (0,125 ms). It is not a multiple of "
+                              "%d HZ.\n", poll, HZ);
                        err = -EINVAL;
                        return err;
                }
@@ -1162,14 +1162,14 @@ static int __init dsp_init(void)
        }
        if (dsp_poll == 0) {
                printk(KERN_INFO "mISDN_dsp: There is no multiple of kernel "
-                       "clock that equals exactly the duration of 8-256 "
-                       "samples. (Choose kernel clock speed like 100, 250, "
-                       "300, 1000)\n");
+                      "clock that equals exactly the duration of 8-256 "
+                      "samples. (Choose kernel clock speed like 100, 250, "
+                      "300, 1000)\n");
                err = -EINVAL;
                return err;
        }
        printk(KERN_INFO "mISDN_dsp: DSP clocks every %d samples. This equals "
-               "%d jiffies.\n", dsp_poll, dsp_tics);
+              "%d jiffies.\n", dsp_poll, dsp_tics);
 
        spin_lock_init(&dsp_lock);
        INIT_LIST_HEAD(&dsp_ilist);
@@ -1177,8 +1177,8 @@ static int __init dsp_init(void)
 
        /* init conversion tables */
        dsp_audio_generate_law_tables();
-       dsp_silence = (dsp_options&DSP_OPT_ULAW) ? 0xff : 0x2a;
-       dsp_audio_law_to_s32 = (dsp_options&DSP_OPT_ULAW) ?
+       dsp_silence = (dsp_options & DSP_OPT_ULAW) ? 0xff : 0x2a;
+       dsp_audio_law_to_s32 = (dsp_options & DSP_OPT_ULAW) ?
                dsp_audio_ulaw_to_s32 : dsp_audio_alaw_to_s32;
        dsp_audio_generate_s2law_table();
        dsp_audio_generate_seven();
@@ -1190,7 +1190,7 @@ static int __init dsp_init(void)
        err = dsp_pipeline_module_init();
        if (err) {
                printk(KERN_ERR "mISDN_dsp: Can't initialize pipeline, "
-                       "error(%d)\n", err);
+                      "error(%d)\n", err);
                return err;
        }
 
@@ -1221,11 +1221,11 @@ static void __exit dsp_cleanup(void)
 
        if (!list_empty(&dsp_ilist)) {
                printk(KERN_ERR "mISDN_dsp: Audio DSP object inst list not "
-                       "empty.\n");
+                      "empty.\n");
        }
        if (!list_empty(&conf_ilist)) {
                printk(KERN_ERR "mISDN_dsp: Conference list not empty. Not "
-                       "all memory freed.\n");
+                      "all memory freed.\n");
        }
 
        dsp_pipeline_module_exit();
@@ -1233,4 +1233,3 @@ static void __exit dsp_cleanup(void)
 
 module_init(dsp_init);
 module_exit(dsp_cleanup);
-
index 5b484c3..887860b 100644 (file)
@@ -61,31 +61,31 @@ void dsp_dtmf_hardware(struct dsp *dsp)
        if (dsp->tx_volume) {
                if (dsp_debug & DEBUG_DSP_DTMF)
                        printk(KERN_DEBUG "%s dsp %s cannot do hardware DTMF, "
-                               "because tx_volume is changed\n",
-                               __func__, dsp->name);
+                              "because tx_volume is changed\n",
+                              __func__, dsp->name);
                hardware = 0;
        }
        if (dsp->rx_volume) {
                if (dsp_debug & DEBUG_DSP_DTMF)
                        printk(KERN_DEBUG "%s dsp %s cannot do hardware DTMF, "
-                               "because rx_volume is changed\n",
-                               __func__, dsp->name);
+                              "because rx_volume is changed\n",
+                              __func__, dsp->name);
                hardware = 0;
        }
        /* check if encryption is enabled */
        if (dsp->bf_enable) {
                if (dsp_debug & DEBUG_DSP_DTMF)
                        printk(KERN_DEBUG "%s dsp %s cannot do hardware DTMF, "
-                               "because encryption is enabled\n",
-                               __func__, dsp->name);
+                              "because encryption is enabled\n",
+                              __func__, dsp->name);
                hardware = 0;
        }
        /* check if pipeline exists */
        if (dsp->pipeline.inuse) {
                if (dsp_debug & DEBUG_DSP_DTMF)
                        printk(KERN_DEBUG "%s dsp %s cannot do hardware DTMF, "
-                               "because pipeline exists.\n",
-                               __func__, dsp->name);
+                              "because pipeline exists.\n",
+                              __func__, dsp->name);
                hardware = 0;
        }
 
@@ -150,23 +150,23 @@ again:
                if (len < 64) {
                        if (len > 0)
                                printk(KERN_ERR "%s: coefficients have invalid "
-                                       "size. (is=%d < must=%d)\n",
-                                       __func__, len, 64);
+                                      "size. (is=%d < must=%d)\n",
+                                      __func__, len, 64);
                        return dsp->dtmf.digits;
                }
                hfccoeff = (s32 *)data;
                for (k = 0; k < NCOEFF; k++) {
-                       sk2 = (*hfccoeff++)>>4;
-                       sk = (*hfccoeff++)>>4;
+                       sk2 = (*hfccoeff++) >> 4;
+                       sk = (*hfccoeff++) >> 4;
                        if (sk > 32767 || sk < -32767 || sk2 > 32767
                            || sk2 < -32767)
                                printk(KERN_WARNING
-                                       "DTMF-Detection overflow\n");
+                                      "DTMF-Detection overflow\n");
                        /* compute |X(k)|**2 */
                        result[k] =
-                                (sk * sk) -
-                                (((cos2pik[k] * sk) >> 15) * sk2) +
-                                (sk2 * sk2);
+                               (sk * sk) -
+                               (((cos2pik[k] * sk) >> 15) * sk2) +
+                               (sk2 * sk2);
                }
                data += 64;
                len -= 64;
@@ -188,7 +188,7 @@ again:
                buf = dsp->dtmf.buffer;
                cos2pik_ = cos2pik[k];
                for (n = 0; n < DSP_DTMF_NPOINTS; n++) {
-                       sk = ((cos2pik_*sk1)>>15) - sk2 + (*buf++);
+                       sk = ((cos2pik_ * sk1) >> 15) - sk2 + (*buf++);
                        sk2 = sk1;
                        sk1 = sk;
                }
@@ -224,14 +224,14 @@ coefficients:
 
        if (dsp_debug & DEBUG_DSP_DTMFCOEFF)
                printk(KERN_DEBUG "a %3d %3d %3d %3d %3d %3d %3d %3d"
-                       " tr:%3d r %3d %3d %3d %3d %3d %3d %3d %3d\n",
-                       result[0]/10000, result[1]/10000, result[2]/10000,
-                       result[3]/10000, result[4]/10000, result[5]/10000,
-                       result[6]/10000, result[7]/10000, tresh/10000,
-                       result[0]/(tresh/100), result[1]/(tresh/100),
-                       result[2]/(tresh/100), result[3]/(tresh/100),
-                       result[4]/(tresh/100), result[5]/(tresh/100),
-                       result[6]/(tresh/100), result[7]/(tresh/100));
+                      " tr:%3d r %3d %3d %3d %3d %3d %3d %3d %3d\n",
+                      result[0] / 10000, result[1] / 10000, result[2] / 10000,
+                      result[3] / 10000, result[4] / 10000, result[5] / 10000,
+                      result[6] / 10000, result[7] / 10000, tresh / 10000,
+                      result[0] / (tresh / 100), result[1] / (tresh / 100),
+                      result[2] / (tresh / 100), result[3] / (tresh / 100),
+                      result[4] / (tresh / 100), result[5] / (tresh / 100),
+                      result[6] / (tresh / 100), result[7] / (tresh / 100));
 
        /* calc digit (lowgroup/highgroup) */
        lowgroup = -1;
@@ -247,7 +247,7 @@ coefficients:
                        break;  /* noise in between */
                }
                /* good level found. This is allowed only one time per group */
-               if (i < NCOEFF/2) {
+               if (i < NCOEFF / 2) {
                        /* lowgroup */
                        if (lowgroup >= 0) {
                                /* Bad. Another tone found. */
@@ -262,7 +262,7 @@ coefficients:
                                highgroup = -1;
                                break;
                        } else
-                               highgroup = i-(NCOEFF/2);
+                               highgroup = i - (NCOEFF / 2);
                }
        }
 
@@ -285,13 +285,13 @@ storedigit:
                        if (what) {
                                if (dsp_debug & DEBUG_DSP_DTMF)
                                        printk(KERN_DEBUG "DTMF digit: %c\n",
-                                               what);
-                               if ((strlen(dsp->dtmf.digits)+1)
-                                       < sizeof(dsp->dtmf.digits)) {
+                                              what);
+                               if ((strlen(dsp->dtmf.digits) + 1)
+                                   < sizeof(dsp->dtmf.digits)) {
                                        dsp->dtmf.digits[strlen(
-                                               dsp->dtmf.digits)+1] = '\0';
+                                                       dsp->dtmf.digits) + 1] = '\0';
                                        dsp->dtmf.digits[strlen(
-                                               dsp->dtmf.digits)] = what;
+                                                       dsp->dtmf.digits)] = what;
                                }
                        }
                }
@@ -302,5 +302,3 @@ storedigit:
 
        goto again;
 }
-
-
index 21dbd15..fed99ac 100644 (file)
@@ -46,15 +46,15 @@ struct ec_disable_detector_state {
 static inline void
 echo_can_disable_detector_init(struct ec_disable_detector_state *det)
 {
-    /* Elliptic notch */
-    /* This is actually centred at 2095Hz, but gets the balance we want, due
-       to the asymmetric walls of the notch */
+       /* Elliptic notch */
+       /* This is actually centred at 2095Hz, but gets the balance we want, due
+          to the asymmetric walls of the notch */
        biquad2_init(&det->notch,
-               (int32_t) (-0.7600000*32768.0),
-               (int32_t) (-0.1183852*32768.0),
-               (int32_t) (-0.5104039*32768.0),
-               (int32_t) (0.1567596*32768.0),
-               (int32_t) (1.0000000*32768.0));
+                    (int32_t)(-0.7600000 * 32768.0),
+                    (int32_t)(-0.1183852 * 32768.0),
+                    (int32_t)(-0.5104039 * 32768.0),
+                    (int32_t)(0.1567596 * 32768.0),
+                    (int32_t)(1.0000000 * 32768.0));
 
        det->channel_level = 0;
        det->notch_level = 0;
@@ -67,7 +67,7 @@ echo_can_disable_detector_init(struct ec_disable_detector_state *det)
 
 static inline int
 echo_can_disable_detector_update(struct ec_disable_detector_state *det,
-int16_t amp)
+                                int16_t amp)
 {
        int16_t notched;
 
@@ -82,13 +82,13 @@ int16_t amp)
        det->notch_level += ((abs(notched) - det->notch_level) >> 4);
        if (det->channel_level > 280) {
                /* There is adequate energy in the channel.
-                Is it mostly at 2100Hz? */
-               if (det->notch_level*6 < det->channel_level) {
+                  Is it mostly at 2100Hz? */
+               if (det->notch_level * 6 < det->channel_level) {
                        /* The notch says yes, so we have the tone. */
                        if (!det->tone_present) {
                                /* Do we get a kick every 450+-25ms? */
-                               if (det->tone_cycle_duration >= 425*8
-                                       && det->tone_cycle_duration <= 475*8) {
+                               if (det->tone_cycle_duration >= 425 * 8
+                                   && det->tone_cycle_duration <= 475 * 8) {
                                        det->good_cycles++;
                                        if (det->good_cycles > 2)
                                                det->hit = TRUE;
index 806a997..a6e8707 100644 (file)
@@ -56,7 +56,7 @@ void dsp_hwec_enable(struct dsp *dsp, const char *arg)
 
        if (!dsp) {
                printk(KERN_ERR "%s: failed to enable hwec: dsp is NULL\n",
-                       __func__);
+                      __func__);
                return;
        }
 
@@ -93,13 +93,13 @@ void dsp_hwec_enable(struct dsp *dsp, const char *arg)
 
 _do:
        printk(KERN_DEBUG "%s: enabling hwec with deftaps=%d\n",
-               __func__, deftaps);
+              __func__, deftaps);
        memset(&cq, 0, sizeof(cq));
        cq.op = MISDN_CTRL_HFC_ECHOCAN_ON;
        cq.p1 = deftaps;
        if (!dsp->ch.peer->ctrl(&dsp->ch, CONTROL_CHANNEL, &cq)) {
                printk(KERN_DEBUG "%s: CONTROL_CHANNEL failed\n",
-                       __func__);
+                      __func__);
                return;
        }
 }
@@ -110,7 +110,7 @@ void dsp_hwec_disable(struct dsp *dsp)
 
        if (!dsp) {
                printk(KERN_ERR "%s: failed to disable hwec: dsp is NULL\n",
-                       __func__);
+                      __func__);
                return;
        }
 
@@ -119,7 +119,7 @@ void dsp_hwec_disable(struct dsp *dsp)
        cq.op = MISDN_CTRL_HFC_ECHOCAN_OFF;
        if (!dsp->ch.peer->ctrl(&dsp->ch, CONTROL_CHANNEL, &cq)) {
                printk(KERN_DEBUG "%s: CONTROL_CHANNEL failed\n",
-                       __func__);
+                      __func__);
                return;
        }
 }
@@ -135,4 +135,3 @@ void dsp_hwec_exit(void)
 {
        mISDN_dsp_element_unregister(dsp_hwec);
 }
-
index eebe80c..bbca1eb 100644 (file)
@@ -7,4 +7,3 @@ extern void dsp_hwec_enable(struct dsp *dsp, const char *arg);
 extern void dsp_hwec_disable(struct dsp *dsp);
 extern int  dsp_hwec_init(void);
 extern void dsp_hwec_exit(void);
-
index b6c9a58..88305c9 100644 (file)
@@ -63,11 +63,11 @@ attr_show_args(struct device *dev, struct device_attribute *attr, char *buf)
        *buf = 0;
        for (i = 0; i < elem->num_args; i++)
                p += sprintf(p, "Name:        %s\n%s%s%sDescription: %s\n\n",
-                         elem->args[i].name,
-                         elem->args[i].def ? "Default:     " : "",
-                         elem->args[i].def ? elem->args[i].def : "",
-                         elem->args[i].def ? "\n" : "",
-                         elem->args[i].desc);
+                            elem->args[i].name,
+                            elem->args[i].def ? "Default:     " : "",
+                            elem->args[i].def ? elem->args[i].def : "",
+                            elem->args[i].def ? "\n" : "",
+                            elem->args[i].desc);
 
        return p - buf;
 }
@@ -106,17 +106,17 @@ int mISDN_dsp_element_register(struct mISDN_dsp_element *elem)
        ret = device_register(&entry->dev);
        if (ret) {
                printk(KERN_ERR "%s: failed to register %s\n",
-                       __func__, elem->name);
+                      __func__, elem->name);
                goto err1;
        }
        list_add_tail(&entry->list, &dsp_elements);
 
        for (i = 0; i < ARRAY_SIZE(element_attributes); ++i) {
                ret = device_create_file(&entry->dev,
-                               &element_attributes[i]);
+                                        &element_attributes[i]);
                if (ret) {
                        printk(KERN_ERR "%s: failed to create device file\n",
-                               __func__);
+                              __func__);
                        goto err2;
                }
        }
@@ -148,7 +148,7 @@ void mISDN_dsp_element_unregister(struct mISDN_dsp_element *elem)
                        device_unregister(&entry->dev);
 #ifdef PIPELINE_DEBUG
                        printk(KERN_DEBUG "%s: %s unregistered\n",
-                               __func__, elem->name);
+                              __func__, elem->name);
 #endif
                        return;
                }
@@ -182,7 +182,7 @@ void dsp_pipeline_module_exit(void)
        list_for_each_entry_safe(entry, n, &dsp_elements, list) {
                list_del(&entry->list);
                printk(KERN_WARNING "%s: element was still registered: %s\n",
-                       __func__, entry->elem->name);
+                      __func__, entry->elem->name);
                kfree(entry);
        }
 
@@ -213,7 +213,7 @@ static inline void _dsp_pipeline_destroy(struct dsp_pipeline *pipeline)
                list_del(&entry->list);
                if (entry->elem == dsp_hwec)
                        dsp_hwec_disable(container_of(pipeline, struct dsp,
-                               pipeline));
+                                                     pipeline));
                else
                        entry->elem->free(entry->p);
                kfree(entry);
@@ -271,11 +271,11 @@ int dsp_pipeline_build(struct dsp_pipeline *pipeline, const char *cfg)
                                elem = entry->elem;
 
                                pipeline_entry = kmalloc(sizeof(struct
-                                       dsp_pipeline_entry), GFP_ATOMIC);
+                                                               dsp_pipeline_entry), GFP_ATOMIC);
                                if (!pipeline_entry) {
                                        printk(KERN_ERR "%s: failed to add "
-                                           "entry to pipeline: %s (out of "
-                                           "memory)\n", __func__, elem->name);
+                                              "entry to pipeline: %s (out of "
+                                              "memory)\n", __func__, elem->name);
                                        incomplete = 1;
                                        goto _out;
                                }
@@ -285,26 +285,26 @@ int dsp_pipeline_build(struct dsp_pipeline *pipeline, const char *cfg)
                                        /* This is a hack to make the hwec
                                           available as a pipeline module */
                                        dsp_hwec_enable(container_of(pipeline,
-                                               struct dsp, pipeline), args);
+                                                                    struct dsp, pipeline), args);
                                        list_add_tail(&pipeline_entry->list,
-                                               &pipeline->list);
+                                                     &pipeline->list);
                                } else {
                                        pipeline_entry->p = elem->new(args);
                                        if (pipeline_entry->p) {
                                                list_add_tail(&pipeline_entry->
-                                                       list, &pipeline->list);
+                                                             list, &pipeline->list);
 #ifdef PIPELINE_DEBUG
                                                printk(KERN_DEBUG "%s: created "
-                                                   "instance of %s%s%s\n",
-                                                   __func__, name, args ?
-                                                   " with args " : "", args ?
-                                                   args : "");
+                                                      "instance of %s%s%s\n",
+                                                      __func__, name, args ?
+                                                      " with args " : "", args ?
+                                                      args : "");
 #endif
                                        } else {
                                                printk(KERN_ERR "%s: failed "
-                                                 "to add entry to pipeline: "
-                                                 "%s (new() returned NULL)\n",
-                                                 __func__, elem->name);
+                                                      "to add entry to pipeline: "
+                                                      "%s (new() returned NULL)\n",
+                                                      __func__, elem->name);
                                                kfree(pipeline_entry);
                                                incomplete = 1;
                                        }
@@ -317,7 +317,7 @@ int dsp_pipeline_build(struct dsp_pipeline *pipeline, const char *cfg)
                        found = 0;
                else {
                        printk(KERN_ERR "%s: element not found, skipping: "
-                               "%s\n", __func__, name);
+                              "%s\n", __func__, name);
                        incomplete = 1;
                }
        }
@@ -330,7 +330,7 @@ _out:
 
 #ifdef PIPELINE_DEBUG
        printk(KERN_DEBUG "%s: dsp pipeline built%s: %s\n",
-               __func__, incomplete ? " incomplete" : "", cfg);
+              __func__, incomplete ? " incomplete" : "", cfg);
 #endif
        kfree(dup);
        return 0;
@@ -349,7 +349,7 @@ void dsp_pipeline_process_tx(struct dsp_pipeline *pipeline, u8 *data, int len)
 }
 
 void dsp_pipeline_process_rx(struct dsp_pipeline *pipeline, u8 *data, int len,
-       unsigned int txlen)
+                            unsigned int txlen)
 {
        struct dsp_pipeline_entry *entry;
 
@@ -360,5 +360,3 @@ void dsp_pipeline_process_rx(struct dsp_pipeline *pipeline, u8 *data, int len,
                if (entry->elem->process_rx)
                        entry->elem->process_rx(entry->p, data, len, txlen);
 }
-
-
index 4e4440e..057e0d6 100644 (file)
@@ -239,120 +239,120 @@ static struct pattern {
        u32 seq[10];
 } pattern[] = {
        {TONE_GERMAN_DIALTONE,
-       {DATA_GA, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL},
-       {SIZE_GA, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL},
-       {1900, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
+        {DATA_GA, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL},
+        {SIZE_GA, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL},
+        {1900, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
 
        {TONE_GERMAN_OLDDIALTONE,
-       {DATA_GO, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL},
-       {SIZE_GO, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL},
-       {1998, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
+        {DATA_GO, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL},
+        {SIZE_GO, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL},
+        {1998, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
 
        {TONE_AMERICAN_DIALTONE,
-       {DATA_DT, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL},
-       {SIZE_DT, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL},
-       {8000, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
+        {DATA_DT, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL},
+        {SIZE_DT, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL},
+        {8000, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
 
        {TONE_GERMAN_DIALPBX,
-       {DATA_GA, DATA_S, DATA_GA, DATA_S, DATA_GA, DATA_S, NULL, NULL, NULL,
-               NULL},
-       {SIZE_GA, SIZE_S, SIZE_GA, SIZE_S, SIZE_GA, SIZE_S, NULL, NULL, NULL,
-               NULL},
-       {2000, 2000, 2000, 2000, 2000, 12000, 0, 0, 0, 0} },
+        {DATA_GA, DATA_S, DATA_GA, DATA_S, DATA_GA, DATA_S, NULL, NULL, NULL,
+         NULL},
+        {SIZE_GA, SIZE_S, SIZE_GA, SIZE_S, SIZE_GA, SIZE_S, NULL, NULL, NULL,
+         NULL},
+        {2000, 2000, 2000, 2000, 2000, 12000, 0, 0, 0, 0} },
 
        {TONE_GERMAN_OLDDIALPBX,
-       {DATA_GO, DATA_S, DATA_GO, DATA_S, DATA_GO, DATA_S, NULL, NULL, NULL,
-               NULL},
-       {SIZE_GO, SIZE_S, SIZE_GO, SIZE_S, SIZE_GO, SIZE_S, NULL, NULL, NULL,
-               NULL},
-       {2000, 2000, 2000, 2000, 2000, 12000, 0, 0, 0, 0} },
+        {DATA_GO, DATA_S, DATA_GO, DATA_S, DATA_GO, DATA_S, NULL, NULL, NULL,
+         NULL},
+        {SIZE_GO, SIZE_S, SIZE_GO, SIZE_S, SIZE_GO, SIZE_S, NULL, NULL, NULL,
+         NULL},
+        {2000, 2000, 2000, 2000, 2000, 12000, 0, 0, 0, 0} },
 
        {TONE_AMERICAN_DIALPBX,
-       {DATA_DT, DATA_S, DATA_DT, DATA_S, DATA_DT, DATA_S, NULL, NULL, NULL,
-               NULL},
-       {SIZE_DT, SIZE_S, SIZE_DT, SIZE_S, SIZE_DT, SIZE_S, NULL, NULL, NULL,
-               NULL},
-       {2000, 2000, 2000, 2000, 2000, 12000, 0, 0, 0, 0} },
+        {DATA_DT, DATA_S, DATA_DT, DATA_S, DATA_DT, DATA_S, NULL, NULL, NULL,
+         NULL},
+        {SIZE_DT, SIZE_S, SIZE_DT, SIZE_S, SIZE_DT, SIZE_S, NULL, NULL, NULL,
+         NULL},
+        {2000, 2000, 2000, 2000, 2000, 12000, 0, 0, 0, 0} },
 
        {TONE_GERMAN_RINGING,
-       {DATA_GA, DATA_S, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL},
-       {SIZE_GA, SIZE_S, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL},
-       {8000, 32000, 0, 0, 0, 0, 0, 0, 0, 0} },
+        {DATA_GA, DATA_S, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL},
+        {SIZE_GA, SIZE_S, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL},
+        {8000, 32000, 0, 0, 0, 0, 0, 0, 0, 0} },
 
        {TONE_GERMAN_OLDRINGING,
-       {DATA_GO, DATA_S, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL},
-       {SIZE_GO, SIZE_S, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL},
-       {8000, 40000, 0, 0, 0, 0, 0, 0, 0, 0} },
+        {DATA_GO, DATA_S, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL},
+        {SIZE_GO, SIZE_S, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL},
+        {8000, 40000, 0, 0, 0, 0, 0, 0, 0, 0} },
 
        {TONE_AMERICAN_RINGING,
-       {DATA_RI, DATA_S, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL},
-       {SIZE_RI, SIZE_S, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL},
-       {8000, 32000, 0, 0, 0, 0, 0, 0, 0, 0} },
+        {DATA_RI, DATA_S, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL},
+        {SIZE_RI, SIZE_S, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL},
+        {8000, 32000, 0, 0, 0, 0, 0, 0, 0, 0} },
 
        {TONE_GERMAN_RINGPBX,
-       {DATA_GA, DATA_S, DATA_GA, DATA_S, NULL, NULL, NULL, NULL, NULL, NULL},
-       {SIZE_GA, SIZE_S, SIZE_GA, SIZE_S, NULL, NULL, NULL, NULL, NULL, NULL},
-       {4000, 4000, 4000, 28000, 0, 0, 0, 0, 0, 0} },
+        {DATA_GA, DATA_S, DATA_GA, DATA_S, NULL, NULL, NULL, NULL, NULL, NULL},
+        {SIZE_GA, SIZE_S, SIZE_GA, SIZE_S, NULL, NULL, NULL, NULL, NULL, NULL},
+        {4000, 4000, 4000, 28000, 0, 0, 0, 0, 0, 0} },
 
        {TONE_GERMAN_OLDRINGPBX,
-       {DATA_GO, DATA_S, DATA_GO, DATA_S, NULL, NULL, NULL, NULL, NULL, NULL},
-       {SIZE_GO, SIZE_S, SIZE_GO, SIZE_S, NULL, NULL, NULL, NULL, NULL, NULL},
-       {4000, 4000, 4000, 28000, 0, 0, 0, 0, 0, 0} },
+        {DATA_GO, DATA_S, DATA_GO, DATA_S, NULL, NULL, NULL, NULL, NULL, NULL},
+        {SIZE_GO, SIZE_S, SIZE_GO, SIZE_S, NULL, NULL, NULL, NULL, NULL, NULL},
+        {4000, 4000, 4000, 28000, 0, 0, 0, 0, 0, 0} },
 
        {TONE_AMERICAN_RINGPBX,
-       {DATA_RI, DATA_S, DATA_RI, DATA_S, NULL, NULL, NULL, NULL, NULL, NULL},
-       {SIZE_RI, SIZE_S, SIZE_RI, SIZE_S, NULL, NULL, NULL, NULL, NULL, NULL},
-       {4000, 4000, 4000, 28000, 0, 0, 0, 0, 0, 0} },
+        {DATA_RI, DATA_S, DATA_RI, DATA_S, NULL, NULL, NULL, NULL, NULL, NULL},
+        {SIZE_RI, SIZE_S, SIZE_RI, SIZE_S, NULL, NULL, NULL, NULL, NULL, NULL},
+        {4000, 4000, 4000, 28000, 0, 0, 0, 0, 0, 0} },
 
        {TONE_GERMAN_BUSY,
-       {DATA_GA, DATA_S, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL},
-       {SIZE_GA, SIZE_S, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL},
-       {4000, 4000, 0, 0, 0, 0, 0, 0, 0, 0} },
+        {DATA_GA, DATA_S, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL},
+        {SIZE_GA, SIZE_S, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL},
+        {4000, 4000, 0, 0, 0, 0, 0, 0, 0, 0} },
 
        {TONE_GERMAN_OLDBUSY,
-       {DATA_GO, DATA_S, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL},
-       {SIZE_GO, SIZE_S, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL},
-       {1000, 5000, 0, 0, 0, 0, 0, 0, 0, 0} },
+        {DATA_GO, DATA_S, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL},
+        {SIZE_GO, SIZE_S, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL},
+        {1000, 5000, 0, 0, 0, 0, 0, 0, 0, 0} },
 
        {TONE_AMERICAN_BUSY,
-       {DATA_BU, DATA_S, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL},
-       {SIZE_BU, SIZE_S, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL},
-       {4000, 4000, 0, 0, 0, 0, 0, 0, 0, 0} },
+        {DATA_BU, DATA_S, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL},
+        {SIZE_BU, SIZE_S, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL},
+        {4000, 4000, 0, 0, 0, 0, 0, 0, 0, 0} },
 
        {TONE_GERMAN_HANGUP,
-       {DATA_GA, DATA_S, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL},
-       {SIZE_GA, SIZE_S, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL},
-       {4000, 4000, 0, 0, 0, 0, 0, 0, 0, 0} },
+        {DATA_GA, DATA_S, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL},
+        {SIZE_GA, SIZE_S, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL},
+        {4000, 4000, 0, 0, 0, 0, 0, 0, 0, 0} },
 
        {TONE_GERMAN_OLDHANGUP,
-       {DATA_GO, DATA_S, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL},
-       {SIZE_GO, SIZE_S, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL},
-       {1000, 5000, 0, 0, 0, 0, 0, 0, 0, 0} },
+        {DATA_GO, DATA_S, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL},
+        {SIZE_GO, SIZE_S, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL},
+        {1000, 5000, 0, 0, 0, 0, 0, 0, 0, 0} },
 
        {TONE_AMERICAN_HANGUP,
-       {DATA_DT, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL},
-       {SIZE_DT, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL},
-       {8000, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
+        {DATA_DT, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL},
+        {SIZE_DT, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL},
+        {8000, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
 
        {TONE_SPECIAL_INFO,
-       {DATA_S1, DATA_S2, DATA_S3, DATA_S, NULL, NULL, NULL, NULL, NULL, NULL},
-       {SIZE_S1, SIZE_S2, SIZE_S3, SIZE_S, NULL, NULL, NULL, NULL, NULL, NULL},
-       {2666, 2666, 2666, 8002, 0, 0, 0, 0, 0, 0} },
+        {DATA_S1, DATA_S2, DATA_S3, DATA_S, NULL, NULL, NULL, NULL, NULL, NULL},
+        {SIZE_S1, SIZE_S2, SIZE_S3, SIZE_S, NULL, NULL, NULL, NULL, NULL, NULL},
+        {2666, 2666, 2666, 8002, 0, 0, 0, 0, 0, 0} },
 
        {TONE_GERMAN_GASSENBESETZT,
-       {DATA_GA, DATA_S, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL},
-       {SIZE_GA, SIZE_S, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL},
-       {2000, 2000, 0, 0, 0, 0, 0, 0, 0, 0} },
+        {DATA_GA, DATA_S, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL},
+        {SIZE_GA, SIZE_S, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL},
+        {2000, 2000, 0, 0, 0, 0, 0, 0, 0, 0} },
 
        {TONE_GERMAN_AUFSCHALTTON,
-       {DATA_GO, DATA_S, DATA_GO, DATA_S, NULL, NULL, NULL, NULL, NULL, NULL},
-       {SIZE_GO, SIZE_S, SIZE_GO, SIZE_S, NULL, NULL, NULL, NULL, NULL, NULL},
-       {1000, 5000, 1000, 17000, 0, 0, 0, 0, 0, 0} },
+        {DATA_GO, DATA_S, DATA_GO, DATA_S, NULL, NULL, NULL, NULL, NULL, NULL},
+        {SIZE_GO, SIZE_S, SIZE_GO, SIZE_S, NULL, NULL, NULL, NULL, NULL, NULL},
+        {1000, 5000, 1000, 17000, 0, 0, 0, 0, 0, 0} },
 
        {0,
-       {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL},
-       {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL},
-       {0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
+        {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL},
+        {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL},
+        {0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
 };
 
 /******************
@@ -386,7 +386,7 @@ void dsp_tone_copy(struct dsp *dsp, u8 *data, int len)
 
        /* process pattern */
        pat = (struct pattern *)tone->pattern;
-               /* points to the current pattern */
+       /* points to the current pattern */
        index = tone->index; /* gives current sequence index */
        count = tone->count; /* gives current sample */
 
@@ -404,19 +404,19 @@ void dsp_tone_copy(struct dsp *dsp, u8 *data, int len)
                                break;
                        if (dsp_debug & DEBUG_DSP_TONE)
                                printk(KERN_DEBUG "%s: reaching next sequence "
-                                       "(index=%d)\n", __func__, index);
+                                      "(index=%d)\n", __func__, index);
                        count -= pat->seq[index];
                        index++;
                }
                /* calculate start and number of samples */
                start = count % (*(pat->siz[index]));
                num = len;
-               if (num+count > pat->seq[index])
+               if (num + count > pat->seq[index])
                        num = pat->seq[index] - count;
-               if (num+start > (*(pat->siz[index])))
+               if (num + start > (*(pat->siz[index])))
                        num = (*(pat->siz[index])) - start;
                /* copy memory */
-               memcpy(data, pat->data[index]+start, num);
+               memcpy(data, pat->data[index] + start, num);
                /* reduce length */
                data += num;
                count += num;
@@ -441,8 +441,8 @@ dsp_tone_hw_message(struct dsp *dsp, u8 *sample, int len)
 
        /* unlocking is not required, because we don't expect a response */
        nskb = _alloc_mISDN_skb(PH_CONTROL_REQ,
-               (len) ? HFC_SPL_LOOP_ON : HFC_SPL_LOOP_OFF, len, sample,
-               GFP_ATOMIC);
+                               (len) ? HFC_SPL_LOOP_ON : HFC_SPL_LOOP_OFF, len, sample,
+                               GFP_ATOMIC);
        if (nskb) {
                if (dsp->ch.peer) {
                        if (dsp->ch.recv(dsp->ch.peer, nskb))
@@ -528,7 +528,7 @@ dsp_tone(struct dsp *dsp, int tone)
        }
        if (dsp_debug & DEBUG_DSP_TONE)
                printk(KERN_DEBUG "%s: now starting tone %d (index=%d)\n",
-                       __func__, tone, 0);
+                      __func__, tone, 0);
        tonet->tone = tone;
        tonet->pattern = pat;
        tonet->index = 0;
@@ -550,8 +550,3 @@ dsp_tone(struct dsp *dsp, int tone)
 
        return 0;
 }
-
-
-
-
-
index b5d6553..26477d4 100644 (file)
 
 void
 mISDN_FsmNew(struct Fsm *fsm,
-       struct FsmNode *fnlist, int fncount)
+            struct FsmNode *fnlist, int fncount)
 {
        int i;
 
        fsm->jumpmatrix = kzalloc(sizeof(FSMFNPTR) * fsm->state_count *
-               fsm->event_count, GFP_KERNEL);
+                                 fsm->event_count, GFP_KERNEL);
 
        for (i = 0; i < fncount; i++)
                if ((fnlist[i].state >= fsm->state_count) ||
                    (fnlist[i].event >= fsm->event_count)) {
                        printk(KERN_ERR
-                           "mISDN_FsmNew Error: %d st(%ld/%ld) ev(%ld/%ld)\n",
-                           i, (long)fnlist[i].state, (long)fsm->state_count,
-                           (long)fnlist[i].event, (long)fsm->event_count);
+                              "mISDN_FsmNew Error: %d st(%ld/%ld) ev(%ld/%ld)\n",
+                              i, (long)fnlist[i].state, (long)fsm->state_count,
+                              (long)fnlist[i].event, (long)fsm->event_count);
                } else
                        fsm->jumpmatrix[fsm->state_count * fnlist[i].event +
-                           fnlist[i].state] = (FSMFNPTR) fnlist[i].routine;
+                                       fnlist[i].state] = (FSMFNPTR) fnlist[i].routine;
 }
 EXPORT_SYMBOL(mISDN_FsmNew);
 
@@ -63,24 +63,24 @@ mISDN_FsmEvent(struct FsmInst *fi, int event, void *arg)
        if ((fi->state >= fi->fsm->state_count) ||
            (event >= fi->fsm->event_count)) {
                printk(KERN_ERR
-                   "mISDN_FsmEvent Error st(%ld/%ld) ev(%d/%ld)\n",
-                   (long)fi->state, (long)fi->fsm->state_count, event,
-                   (long)fi->fsm->event_count);
+                      "mISDN_FsmEvent Error st(%ld/%ld) ev(%d/%ld)\n",
+                      (long)fi->state, (long)fi->fsm->state_count, event,
+                      (long)fi->fsm->event_count);
                return 1;
        }
        r = fi->fsm->jumpmatrix[fi->fsm->state_count * event + fi->state];
        if (r) {
                if (fi->debug)
                        fi->printdebug(fi, "State %s Event %s",
-                               fi->fsm->strState[fi->state],
-                               fi->fsm->strEvent[event]);
+                                      fi->fsm->strState[fi->state],
+                                      fi->fsm->strEvent[event]);
                r(fi, event, arg);
                return 0;
        } else {
                if (fi->debug)
                        fi->printdebug(fi, "State %s Event %s no action",
-                               fi->fsm->strState[fi->state],
-                               fi->fsm->strEvent[event]);
+                                      fi->fsm->strState[fi->state],
+                                      fi->fsm->strEvent[event]);
                return 1;
        }
 }
@@ -92,7 +92,7 @@ mISDN_FsmChangeState(struct FsmInst *fi, int newstate)
        fi->state = newstate;
        if (fi->debug)
                fi->printdebug(fi, "ChangeState %s",
-                       fi->fsm->strState[newstate]);
+                              fi->fsm->strState[newstate]);
 }
 EXPORT_SYMBOL(mISDN_FsmChangeState);
 
@@ -126,7 +126,7 @@ mISDN_FsmDelTimer(struct FsmTimer *ft, int where)
 #if FSM_TIMER_DEBUG
        if (ft->fi->debug)
                ft->fi->printdebug(ft->fi, "mISDN_FsmDelTimer %lx %d",
-                       (long) ft, where);
+                                  (long) ft, where);
 #endif
        del_timer(&ft->tl);
 }
@@ -134,21 +134,21 @@ EXPORT_SYMBOL(mISDN_FsmDelTimer);
 
 int
 mISDN_FsmAddTimer(struct FsmTimer *ft,
-           int millisec, int event, void *arg, int where)
+                 int millisec, int event, void *arg, int where)
 {
 
 #if FSM_TIMER_DEBUG
        if (ft->fi->debug)
                ft->fi->printdebug(ft->fi, "mISDN_FsmAddTimer %lx %d %d",
-                       (long) ft, millisec, where);
+                                  (long) ft, millisec, where);
 #endif
 
        if (timer_pending(&ft->tl)) {
                if (ft->fi->debug) {
                        printk(KERN_WARNING
-                               "mISDN_FsmAddTimer: timer already active!\n");
+                              "mISDN_FsmAddTimer: timer already active!\n");
                        ft->fi->printdebug(ft->fi,
-                               "mISDN_FsmAddTimer already active!");
+                                          "mISDN_FsmAddTimer already active!");
                }
                return -1;
        }
@@ -163,13 +163,13 @@ EXPORT_SYMBOL(mISDN_FsmAddTimer);
 
 void
 mISDN_FsmRestartTimer(struct FsmTimer *ft,
-           int millisec, int event, void *arg, int where)
+                     int millisec, int event, void *arg, int where)
 {
 
 #if FSM_TIMER_DEBUG
        if (ft->fi->debug)
                ft->fi->printdebug(ft->fi, "mISDN_FsmRestartTimer %lx %d %d",
-                       (long) ft, millisec, where);
+                                  (long) ft, millisec, where);
 #endif
 
        if (timer_pending(&ft->tl))
index f6e108d..c74c363 100644 (file)
@@ -206,7 +206,7 @@ recv_Bchannel(struct bchannel *bch, unsigned int id)
        hh->id = id;
        if (bch->rcount >= 64) {
                printk(KERN_WARNING "B-channel %p receive queue overflow, "
-                       "flushing!\n", bch);
+                      "flushing!\n", bch);
                skb_queue_purge(&bch->rqueue);
                bch->rcount = 0;
                return;
@@ -231,7 +231,7 @@ recv_Bchannel_skb(struct bchannel *bch, struct sk_buff *skb)
 {
        if (bch->rcount >= 64) {
                printk(KERN_WARNING "B-channel %p receive queue overflow, "
-                       "flushing!\n", bch);
+                      "flushing!\n", bch);
                skb_queue_purge(&bch->rqueue);
                bch->rcount = 0;
        }
@@ -247,10 +247,10 @@ confirm_Dsend(struct dchannel *dch)
        struct sk_buff  *skb;
 
        skb = _alloc_mISDN_skb(PH_DATA_CNF, mISDN_HEAD_ID(dch->tx_skb),
-           0, NULL, GFP_ATOMIC);
+                              0, NULL, GFP_ATOMIC);
        if (!skb) {
                printk(KERN_ERR "%s: no skb id %x\n", __func__,
-                   mISDN_HEAD_ID(dch->tx_skb));
+                      mISDN_HEAD_ID(dch->tx_skb));
                return;
        }
        skb_queue_tail(&dch->rqueue, skb);
@@ -279,15 +279,15 @@ confirm_Bsend(struct bchannel *bch)
 
        if (bch->rcount >= 64) {
                printk(KERN_WARNING "B-channel %p receive queue overflow, "
-                       "flushing!\n", bch);
+                      "flushing!\n", bch);
                skb_queue_purge(&bch->rqueue);
                bch->rcount = 0;
        }
        skb = _alloc_mISDN_skb(PH_DATA_CNF, mISDN_HEAD_ID(bch->tx_skb),
-           0, NULL, GFP_ATOMIC);
+                              0, NULL, GFP_ATOMIC);
        if (!skb) {
                printk(KERN_ERR "%s: no skb id %x\n", __func__,
-                   mISDN_HEAD_ID(bch->tx_skb));
+                      mISDN_HEAD_ID(bch->tx_skb));
                return;
        }
        bch->rcount++;
@@ -349,7 +349,7 @@ dchannel_senddata(struct dchannel *ch, struct sk_buff *skb)
        }
        if (skb->len > ch->maxlen) {
                printk(KERN_WARNING "%s: skb too large(%d/%d)\n",
-                       __func__, skb->len, ch->maxlen);
+                      __func__, skb->len, ch->maxlen);
                return -EINVAL;
        }
        /* HW lock must be obtained */
@@ -376,15 +376,15 @@ bchannel_senddata(struct bchannel *ch, struct sk_buff *skb)
        }
        if (skb->len > ch->maxlen) {
                printk(KERN_WARNING "%s: skb too large(%d/%d)\n",
-                       __func__, skb->len, ch->maxlen);
+                      __func__, skb->len, ch->maxlen);
                return -EINVAL;
        }
        /* HW lock must be obtained */
        /* check for pending next_skb */
        if (ch->next_skb) {
                printk(KERN_WARNING
-                   "%s: next_skb exist ERROR (skb->len=%d next_skb->len=%d)\n",
-                   __func__, skb->len, ch->next_skb->len);
+                      "%s: next_skb exist ERROR (skb->len=%d next_skb->len=%d)\n",
+                      __func__, skb->len, ch->next_skb->len);
                return -EBUSY;
        }
        if (test_and_set_bit(FLG_TX_BUSY, &ch->Flags)) {
index bc26c89..661c060 100644 (file)
@@ -10,7 +10,7 @@
 
 /* enable to disorder received bchannels by sequence 2143658798... */
 /*
-#define REORDER_DEBUG
+  #define REORDER_DEBUG
 */
 
 /* frames */
@@ -29,8 +29,8 @@
 
 /* channel structure */
 struct l1oip_chan {
-       struct dchannel         *dch;
-       struct bchannel         *bch;
+       struct dchannel         *dch;
+       struct bchannel         *bch;
        u32                     tx_counter;     /* counts xmit bytes/packets */
        u32                     rx_counter;     /* counts recv bytes/packets */
        u32                     codecstate;     /* used by codec to save data */
@@ -60,19 +60,19 @@ struct l1oip {
        int                     limit;          /* limit number of bchannels */
 
        /* timer */
-       struct timer_list       keep_tl;
-       struct timer_list       timeout_tl;
+       struct timer_list       keep_tl;
+       struct timer_list       timeout_tl;
        int                     timeout_on;
        struct work_struct      workq;
 
        /* socket */
-       struct socket           *socket;        /* if set, socket is created */
-       struct completion       socket_complete;/* completion of sock thread */
+       struct socket           *socket;        /* if set, socket is created */
+       struct completion       socket_complete;/* completion of sock thread */
        struct task_struct      *socket_thread;
-       spinlock_t              socket_lock;    /* access sock outside thread */
+       spinlock_t              socket_lock;    /* access sock outside thread */
        u32                     remoteip;       /* if all set, ip is assigned */
-       u16                     localport;      /* must always be set */
-       u16                     remoteport;     /* must always be set */
+       u16                     localport;      /* must always be set */
+       u16                     remoteport;     /* must always be set */
        struct sockaddr_in      sin_local;      /* local socket name */
        struct sockaddr_in      sin_remote;     /* remote socket name */
        struct msghdr           sendmsg;        /* ip message to send */
@@ -88,4 +88,3 @@ extern int l1oip_alaw_to_ulaw(u8 *data, int len, u8 *result);
 extern int l1oip_ulaw_to_alaw(u8 *data, int len, u8 *result);
 extern void l1oip_4bit_free(void);
 extern int l1oip_4bit_alloc(int ulaw);
-
index 5a89972..a601c84 100644 (file)
 
 /*
 
-How the codec works:
---------------------
+  How the codec works:
+  --------------------
 
-The volume is increased to increase the dynamic range of the audio signal.
-Each sample is converted to a-LAW with only 16 steps of level resolution.
-A pair of two samples are stored in one byte.
+  The volume is increased to increase the dynamic range of the audio signal.
+  Each sample is converted to a-LAW with only 16 steps of level resolution.
+  A pair of two samples are stored in one byte.
 
-The first byte is stored in the upper bits, the second byte is stored in the
-lower bits.
+  The first byte is stored in the upper bits, the second byte is stored in the
+  lower bits.
 
-To speed up compression and decompression, two lookup tables are formed:
+  To speed up compression and decompression, two lookup tables are formed:
 
-- 16 bits index for two samples (law encoded) with 8 bit compressed result.
-- 8 bits index for one compressed data with 16 bits decompressed result.
+  - 16 bits index for two samples (law encoded) with 8 bit compressed result.
+  - 8 bits index for one compressed data with 16 bits decompressed result.
 
-NOTE: The bytes are handled as they are law-encoded.
+  NOTE: The bytes are handled as they are law-encoded.
 
 */
 
@@ -232,7 +232,7 @@ l1oip_law_to_4bit(u8 *data, int len, u8 *result, u32 *state)
 
        /* send saved byte and first input byte */
        if (*state) {
-               *result++ = table_com[(((*state)<<8)&0xff00) | (*data++)];
+               *result++ = table_com[(((*state) << 8) & 0xff00) | (*data++)];
                len--;
                o++;
        }
@@ -267,7 +267,7 @@ l1oip_4bit_to_law(u8 *data, int len, u8 *result)
 
        while (i < len) {
                r = table_dec[*data++];
-               *result++ = r>>8;
+               *result++ = r >> 8;
                *result++ = r;
                i++;
        }
@@ -345,8 +345,8 @@ l1oip_4bit_alloc(int ulaw)
                        c = alaw_to_4bit[i1];
                i2 = 0;
                while (i2 < 256) {
-                       table_com[(i1<<8) | i2] |= (c<<4);
-                       table_com[(i2<<8) | i1] |= c;
+                       table_com[(i1 << 8) | i2] |= (c << 4);
+                       table_com[(i2 << 8) | i1] |= c;
                        i2++;
                }
                i1++;
@@ -361,8 +361,8 @@ l1oip_4bit_alloc(int ulaw)
                        sample = _4bit_to_alaw[i1];
                i2 = 0;
                while (i2 < 16) {
-                       table_dec[(i1<<4) | i2] |= (sample<<8);
-                       table_dec[(i2<<4) | i1] |= sample;
+                       table_dec[(i1 << 4) | i2] |= (sample << 8);
+                       table_dec[(i2 << 4) | i1] |= sample;
                        i2++;
                }
                i1++;
@@ -370,5 +370,3 @@ l1oip_4bit_alloc(int ulaw)
 
        return 0;
 }
-
-
index 22f8ec8..0f88acf 100644 (file)
 
 /* module parameters:
  * type:
-       Value 1 = BRI
-       Value 2 = PRI
-       Value 3 = BRI (multi channel frame, not supported yet)
-       Value 4 = PRI (multi channel frame, not supported yet)
-       A multi channel frame reduces overhead to a single frame for all
-       b-channels, but increases delay.
-       (NOTE: Multi channel frames are not implemented yet.)
+ Value 1       = BRI
+ Value 2       = PRI
+ Value 3 = BRI (multi channel frame, not supported yet)
+ Value 4 = PRI (multi channel frame, not supported yet)
+ A multi channel frame reduces overhead to a single frame for all
+ b-channels, but increases delay.
+ (NOTE: Multi channel frames are not implemented yet.)
 
  * codec:
-       Value 0 = transparent (default)
-       Value 1 = transfer ALAW
-       Value 2 = transfer ULAW
-       Value 3 = transfer generic 4 bit compression.
+ Value 0 = transparent (default)
+ Value 1 = transfer ALAW
+ Value 2 = transfer ULAW
+ Value 3 = transfer generic 4 bit compression.
 
  * ulaw:
-       0 = we use a-Law (default)
-       1 = we use u-Law
+ 0 = we use a-Law (default)
+ 1 = we use u-Law
 
  * limit:
-       limitation of B-channels to control bandwidth (1...126)
-       BRI: 1 or 2
-       PRI: 1-30, 31-126 (126, because dchannel ist not counted here)
-       Also limited ressources are used for stack, resulting in less channels.
-       It is possible to have more channels than 30 in PRI mode, this must
-       be supported by the application.
+ limitation of B-channels to control bandwidth (1...126)
+ BRI: 1 or 2
+ PRI: 1-30, 31-126 (126, because dchannel ist not counted here)
+ Also limited ressources are used for stack, resulting in less channels.
+ It is possible to have more channels than 30 in PRI mode, this must
+ be supported by the application.
 
  * ip:
-       byte representation of remote ip address (127.0.0.1 -> 127,0,0,1)
-       If not given or four 0, no remote address is set.
-       For multiple interfaces, concat ip addresses. (127,0,0,1,127,0,0,1)
+ byte representation of remote ip address (127.0.0.1 -> 127,0,0,1)
+ If not given or four 0, no remote address is set.
+ For multiple interfaces, concat ip addresses. (127,0,0,1,127,0,0,1)
 
  * port:
-       port number (local interface)
-       If not given or 0, port 931 is used for fist instance, 932 for next...
-       For multiple interfaces, different ports must be given.
+ port number (local interface)
+ If not given or 0, port 931 is used for fist instance, 932 for next...
+ For multiple interfaces, different ports must be given.
 
  * remoteport:
-       port number (remote interface)
-       If not given or 0, remote port equals local port
-       For multiple interfaces on equal sites, different ports must be given.
+ port number (remote interface)
+ If not given or 0, remote port equals local port
+ For multiple interfaces on equal sites, different ports must be given.
 
  * ondemand:
-       0 = fixed (always transmit packets, even when remote side timed out)
-       1 = on demand (only transmit packets, when remote side is detected)
-       the default is 0
-       NOTE: ID must also be set for on demand.
+ 0 = fixed (always transmit packets, even when remote side timed out)
+ 1 = on demand (only transmit packets, when remote side is detected)
+ the default is 0
+ NOTE: ID must also be set for on demand.
 
  * id:
-       optional value to identify frames. This value must be equal on both
-       peers and should be random. If omitted or 0, no ID is transmitted.
+ optional value to identify frames. This value must be equal on both
+ peers and should be random. If omitted or 0, no ID is transmitted.
 
  * debug:
-       NOTE: only one debug value must be given for all cards
-       enable debugging (see l1oip.h for debug options)
+ NOTE: only one debug value must be given for all cards
+ enable debugging (see l1oip.h for debug options)
 
 
-Special mISDN controls:
+ Special mISDN controls:
 
  op = MISDN_CTRL_SETPEER*
  p1 = bytes 0-3 : remote IP address in network order (left element first)
@@ -91,133 +91,133 @@ Special mISDN controls:
  op = MISDN_CTRL_UNSETPEER*
 
  * Use l1oipctrl for comfortable setting or removing ip address.
-   (Layer 1 Over IP CTRL)
+ (Layer 1 Over IP CTRL)
 
 
-L1oIP-Protocol
---------------
+ L1oIP-Protocol
+ --------------
 
-Frame Header:
+ Frame Header:
 
  7 6 5 4 3 2 1 0
-+---------------+
-|Ver|T|I|Coding |
-+---------------+
-|  ID byte 3 *  |
-+---------------+
-|  ID byte 2 *  |
-+---------------+
-|  ID byte 1 *  |
-+---------------+
-|  ID byte 0 *  |
-+---------------+
-|M|   Channel   |
-+---------------+
-|    Length *   |
-+---------------+
-| Time Base MSB |
-+---------------+
-| Time Base LSB |
-+---------------+
-| Data....     |
-
-...
-
-|               |
-+---------------+
-|M|   Channel   |
-+---------------+
-|    Length *   |
-+---------------+
-| Time Base MSB |
-+---------------+
-| Time Base LSB |
-+---------------+
-| Data....     |
-
-...
-
-
-* Only included in some cases.
-
-- Ver = Version
-If version is missmatch, the frame must be ignored.
-
-- T = Type of interface
-Must be 0 for S0 or 1 for E1.
-
-- I = Id present
-If bit is set, four ID bytes are included in frame.
-
-- ID = Connection ID
-Additional ID to prevent Denial of Service attacs. Also it prevents hijacking
-connections with dynamic IP. The ID should be random and must not be 0.
-
-- Coding = Type of codec
-Must be 0 for no transcoding. Also for D-channel and other HDLC frames.
+ +---------------+
+ |Ver|T|I|Coding |
+ +---------------+
+ |  ID byte 3 *  |
+ +---------------+
+ |  ID byte 2 *  |
+ +---------------+
+ |  ID byte 1 *  |
+ +---------------+
+ |  ID byte 0 *  |
+ +---------------+
+ |M|   Channel   |
+ +---------------+
+ |    Length *   |
+ +---------------+
+ | Time Base MSB |
+ +---------------+
+ | Time Base LSB |
+ +---------------+
+ | Data....    |
+
+ ...
+
+ |               |
+ +---------------+
+ |M|   Channel   |
+ +---------------+
+ |    Length *   |
+ +---------------+
+ | Time Base MSB |
+ +---------------+
+ | Time Base LSB |
+ +---------------+
+ | Data....    |
+
+ ...
+
+
+ * Only included in some cases.
+
+ - Ver = Version
+ If version is missmatch, the frame must be ignored.
+
+ - T = Type of interface
+ Must be 0 for S0 or 1 for E1.
+
+ - I = Id present
+ If bit is set, four ID bytes are included in frame.
+
+ - ID = Connection ID
+ Additional ID to prevent Denial of Service attacs. Also it prevents hijacking
+ connections with dynamic IP. The ID should be random and must not be 0.
+
+ - Coding = Type of codec
+ Must be 0 for no transcoding. Also for D-channel and other HDLC frames.
  1 and 2 are reserved for explicitly use of a-LAW or u-LAW codec.
  3 is used for generic table compressor.
 
-- M = More channels to come. If this flag is 1, the following byte contains
-the length of the channel data. After the data block, the next channel will
-be defined. The flag for the last channel block (or if only one channel is
-transmitted), must be 0 and no length is given.
+ - M = More channels to come. If this flag is 1, the following byte contains
+ the length of the channel data. After the data block, the next channel will
+ be defined. The flag for the last channel block (or if only one channel is
+ transmitted), must be 0 and no length is given.
 
-- Channel = Channel number
-0 reserved
-1-3 channel data for S0 (3 is D-channel)
-1-31 channel data for E1 (16 is D-channel)
-32-127 channel data for extended E1 (16 is D-channel)
+ - Channel = Channel number
+ 0 reserved
+ 1-3 channel data for S0 (3 is D-channel)
+ 1-31 channel data for E1 (16 is D-channel)
+ 32-127 channel data for extended E1 (16 is D-channel)
 
-- The length is used if the M-flag is 1. It is used to find the next channel
-inside frame.
-NOTE: A value of 0 equals 256 bytes of data.
+ - The length is used if the M-flag is 1. It is used to find the next channel
+ inside frame.
+ NOTE: A value of 0 equals 256 bytes of data.
  -> For larger data blocks, a single frame must be used.
  -> For larger streams, a single frame or multiple blocks with same channel ID
-   must be used.
+ must be used.
 
-- Time Base = Timestamp of first sample in frame
-The "Time Base" is used to rearange packets and to detect packet loss.
-The 16 bits are sent in network order (MSB first) and count 1/8000 th of a
-second. This causes a wrap around each 8,192 seconds. There is no requirement
-for the initial "Time Base", but 0 should be used for the first packet.
-In case of HDLC data, this timestamp counts the packet or byte number.
+ - Time Base = Timestamp of first sample in frame
+ The "Time Base" is used to rearange packets and to detect packet loss.
+ The 16 bits are sent in network order (MSB first) and count 1/8000 th of a
+ second. This causes a wrap around each 8,192 seconds. There is no requirement
+ for the initial "Time Base", but 0 should be used for the first packet.
+ In case of HDLC data, this timestamp counts the packet or byte number.
 
 
-Two Timers:
+ Two Timers:
 
-After initialisation, a timer of 15 seconds is started. Whenever a packet is
-transmitted, the timer is reset to 15 seconds again. If the timer expires, an
-empty packet is transmitted. This keep the connection alive.
+ After initialisation, a timer of 15 seconds is started. Whenever a packet is
+ transmitted, the timer is reset to 15 seconds again. If the timer expires, an
+ empty packet is transmitted. This keep the connection alive.
 
-When a valid packet is received, a timer 65 seconds is started. The interface
-become ACTIVE. If the timer expires, the interface becomes INACTIVE.
+ When a valid packet is received, a timer 65 seconds is started. The interface
+ become ACTIVE. If the timer expires, the interface becomes INACTIVE.
 
 
-Dynamic IP handling:
+ Dynamic IP handling:
 
-To allow dynamic IP, the ID must be non 0. In this case, any packet with the
-correct port number and ID will be accepted. If the remote side changes its IP
-the new IP is used for all transmitted packets until it changes again.
+ To allow dynamic IP, the ID must be non 0. In this case, any packet with the
+ correct port number and ID will be accepted. If the remote side changes its IP
+ the new IP is used for all transmitted packets until it changes again.
 
 
-On Demand:
+ On Demand:
 
-If the ondemand parameter is given, the remote IP is set to 0 on timeout.
-This will stop keepalive traffic to remote. If the remote is online again,
-traffic will continue to the remote address. This is useful for road warriors.
-This feature only works with ID set, otherwhise it is highly unsecure.
+ If the ondemand parameter is given, the remote IP is set to 0 on timeout.
+ This will stop keepalive traffic to remote. If the remote is online again,
+ traffic will continue to the remote address. This is useful for road warriors.
+ This feature only works with ID set, otherwhise it is highly unsecure.
 
 
-Socket and Thread
------------------
+ Socket and Thread
+ -----------------
 
-The complete socket opening and closing is done by a thread.
-When the thread opened a socket, the hc->socket descriptor is set. Whenever a
-packet shall be sent to the socket, the hc->socket must be checked wheter not
-NULL. To prevent change in socket descriptor, the hc->socket_lock must be used.
-To change the socket, a recall of l1oip_socket_open() will safely kill the
-socket process and create a new one.
+ The complete socket opening and closing is done by a thread.
+ When the thread opened a socket, the hc->socket descriptor is set. Whenever a
+ packet shall be sent to the socket, the hc->socket must be checked wheter not
+ NULL. To prevent change in socket descriptor, the hc->socket_lock must be used.
+ To change the socket, a recall of l1oip_socket_open() will safely kill the
+ socket process and create a new one.
 
 */
 
@@ -247,7 +247,7 @@ static struct list_head l1oip_ilist;
 #define MAX_CARDS      16
 static u_int type[MAX_CARDS];
 static u_int codec[MAX_CARDS];
-static u_int ip[MAX_CARDS*4];
+static u_int ip[MAX_CARDS * 4];
 static u_int port[MAX_CARDS];
 static u_int remoteport[MAX_CARDS];
 static u_int ondemand[MAX_CARDS];
@@ -274,26 +274,26 @@ module_param(debug, uint, S_IRUGO | S_IWUSR);
  */
 static int
 l1oip_socket_send(struct l1oip *hc, u8 localcodec, u8 channel, u32 chanmask,
-       u16 timebase, u8 *buf, int len)
+                 u16 timebase, u8 *buf, int len)
 {
        u8 *p;
        int multi = 0;
-       u8 frame[len+32];
+       u8 frame[len + 32];
        struct socket *socket = NULL;
 
        if (debug & DEBUG_L1OIP_MSG)
                printk(KERN_DEBUG "%s: sending data to socket (len = %d)\n",
-                       __func__, len);
+                      __func__, len);
 
        p = frame;
 
        /* restart timer */
-       if ((int)(hc->keep_tl.expires-jiffies) < 5*HZ) {
+       if ((int)(hc->keep_tl.expires-jiffies) < 5 * HZ) {
                del_timer(&hc->keep_tl);
-               hc->keep_tl.expires = jiffies + L1OIP_KEEPALIVE*HZ;
+               hc->keep_tl.expires = jiffies + L1OIP_KEEPALIVE * HZ;
                add_timer(&hc->keep_tl);
        } else
-               hc->keep_tl.expires = jiffies + L1OIP_KEEPALIVE*HZ;
+               hc->keep_tl.expires = jiffies + L1OIP_KEEPALIVE * HZ;
 
        if (debug & DEBUG_L1OIP_MSG)
                printk(KERN_DEBUG "%s: resetting timer\n", __func__);
@@ -302,25 +302,25 @@ l1oip_socket_send(struct l1oip *hc, u8 localcodec, u8 channel, u32 chanmask,
        if (!hc->sin_remote.sin_addr.s_addr || !hc->sin_remote.sin_port) {
                if (debug & DEBUG_L1OIP_MSG)
                        printk(KERN_DEBUG "%s: dropping frame, because remote "
-                               "IP is not set.\n", __func__);
+                              "IP is not set.\n", __func__);
                return len;
        }
 
        /* assemble frame */
-       *p++ = (L1OIP_VERSION<<6) /* version and coding */
-            | (hc->pri ? 0x20 : 0x00) /* type */
-            | (hc->id ? 0x10 : 0x00) /* id */
-            | localcodec;
+       *p++ = (L1OIP_VERSION << 6) /* version and coding */
+               | (hc->pri ? 0x20 : 0x00) /* type */
+               | (hc->id ? 0x10 : 0x00) /* id */
+               | localcodec;
        if (hc->id) {
-               *p++ = hc->id>>24; /* id */
-               *p++ = hc->id>>16;
-               *p++ = hc->id>>8;
+               *p++ = hc->id >> 24; /* id */
+               *p++ = hc->id >> 16;
+               *p++ = hc->id >> 8;
                *p++ = hc->id;
        }
        *p++ = (multi == 1) ? 0x80 : 0x00 + channel; /* m-flag, channel */
        if (multi == 1)
                *p++ = len; /* length */
-       *p++ = timebase>>8; /* time base */
+       *p++ = timebase >> 8; /* time base */
        *p++ = timebase;
 
        if (buf && len) { /* add data to frame */
@@ -330,7 +330,7 @@ l1oip_socket_send(struct l1oip *hc, u8 localcodec, u8 channel, u32 chanmask,
                        l1oip_alaw_to_ulaw(buf, len, p);
                else if (localcodec == 3)
                        len = l1oip_law_to_4bit(buf, len, p,
-                               &hc->chan[channel].codecstate);
+                                               &hc->chan[channel].codecstate);
                else
                        memcpy(p, buf, len);
        }
@@ -349,7 +349,7 @@ l1oip_socket_send(struct l1oip *hc, u8 localcodec, u8 channel, u32 chanmask,
        /* send packet */
        if (debug & DEBUG_L1OIP_MSG)
                printk(KERN_DEBUG "%s: sending packet to socket (len "
-                       "= %d)\n", __func__, len);
+                      "= %d)\n", __func__, len);
        hc->sendiov.iov_base = frame;
        hc->sendiov.iov_len  = len;
        len = kernel_sendmsg(socket, &hc->sendmsg, &hc->sendiov, 1, len);
@@ -365,7 +365,7 @@ l1oip_socket_send(struct l1oip *hc, u8 localcodec, u8 channel, u32 chanmask,
  */
 static void
 l1oip_socket_recv(struct l1oip *hc, u8 remotecodec, u8 channel, u16 timebase,
-       u8 *buf, int len)
+                 u8 *buf, int len)
 {
        struct sk_buff *nskb;
        struct bchannel *bch;
@@ -376,34 +376,34 @@ l1oip_socket_recv(struct l1oip *hc, u8 remotecodec, u8 channel, u16 timebase,
        if (len == 0) {
                if (debug & DEBUG_L1OIP_MSG)
                        printk(KERN_DEBUG "%s: received empty keepalive data, "
-                               "ignoring\n", __func__);
+                              "ignoring\n", __func__);
                return;
        }
 
        if (debug & DEBUG_L1OIP_MSG)
                printk(KERN_DEBUG "%s: received data, sending to mISDN (%d)\n",
-                       __func__, len);
+                      __func__, len);
 
        if (channel < 1 || channel > 127) {
                printk(KERN_WARNING "%s: packet error - channel %d out of "
-                       "range\n", __func__, channel);
+                      "range\n", __func__, channel);
                return;
        }
        dch = hc->chan[channel].dch;
        bch = hc->chan[channel].bch;
        if (!dch && !bch) {
                printk(KERN_WARNING "%s: packet error - channel %d not in "
-                       "stack\n", __func__, channel);
+                      "stack\n", __func__, channel);
                return;
        }
 
        /* prepare message */
-       nskb = mI_alloc_skb((remotecodec == 3) ? (len<<1) : len, GFP_ATOMIC);
+       nskb = mI_alloc_skb((remotecodec == 3) ? (len << 1) : len, GFP_ATOMIC);
        if (!nskb) {
                printk(KERN_ERR "%s: No mem for skb.\n", __func__);
                return;
        }
-       p = skb_put(nskb, (remotecodec == 3) ? (len<<1) : len);
+       p = skb_put(nskb, (remotecodec == 3) ? (len << 1) : len);
 
        if (remotecodec == 1 && ulaw)
                l1oip_alaw_to_ulaw(buf, len, p);
@@ -428,7 +428,7 @@ l1oip_socket_recv(struct l1oip *hc, u8 remotecodec, u8 channel, u16 timebase,
                                rx_counter =
                                        (rx_counter & 0xffff0000) | timebase;
                        else
-                               rx_counter = ((rx_counter & 0xffff0000)+0x10000)
+                               rx_counter = ((rx_counter & 0xffff0000) + 0x10000)
                                        | timebase;
                } else {
                        /* time has changed backwards */
@@ -436,7 +436,7 @@ l1oip_socket_recv(struct l1oip *hc, u8 remotecodec, u8 channel, u16 timebase,
                                rx_counter =
                                        (rx_counter & 0xffff0000) | timebase;
                        else
-                               rx_counter = ((rx_counter & 0xffff0000)-0x10000)
+                               rx_counter = ((rx_counter & 0xffff0000) - 0x10000)
                                        | timebase;
                }
                hc->chan[channel].rx_counter = rx_counter;
@@ -476,42 +476,42 @@ l1oip_socket_parse(struct l1oip *hc, struct sockaddr_in *sin, u8 *buf, int len)
 
        if (debug & DEBUG_L1OIP_MSG)
                printk(KERN_DEBUG "%s: received frame, parsing... (%d)\n",
-                       __func__, len);
+                      __func__, len);
 
        /* check length */
-       if (len < 1+1+2) {
+       if (len < 1 + 1 + 2) {
                printk(KERN_WARNING "%s: packet error - length %d below "
-                       "4 bytes\n", __func__, len);
+                      "4 bytes\n", __func__, len);
                return;
        }
 
        /* check version */
-       if (((*buf)>>6) != L1OIP_VERSION) {
+       if (((*buf) >> 6) != L1OIP_VERSION) {
                printk(KERN_WARNING "%s: packet error - unknown version %d\n",
-                       __func__, buf[0]>>6);
+                      __func__, buf[0]>>6);
                return;
        }
 
        /* check type */
-       if (((*buf)&0x20) && !hc->pri) {
+       if (((*buf) & 0x20) && !hc->pri) {
                printk(KERN_WARNING "%s: packet error - received E1 packet "
-                       "on S0 interface\n", __func__);
+                      "on S0 interface\n", __func__);
                return;
        }
-       if (!((*buf)&0x20) && hc->pri) {
+       if (!((*buf) & 0x20) && hc->pri) {
                printk(KERN_WARNING "%s: packet error - received S0 packet "
-                       "on E1 interface\n", __func__);
+                      "on E1 interface\n", __func__);
                return;
        }
 
        /* get id flag */
-       packet_id = (*buf>>4)&1;
+       packet_id = (*buf >> 4) & 1;
 
        /* check coding */
        remotecodec = (*buf) & 0x0f;
        if (remotecodec > 3) {
                printk(KERN_WARNING "%s: packet error - remotecodec %d "
-                       "unsupported\n", __func__, remotecodec);
+                      "unsupported\n", __func__, remotecodec);
                return;
        }
        buf++;
@@ -521,12 +521,12 @@ l1oip_socket_parse(struct l1oip *hc, struct sockaddr_in *sin, u8 *buf, int len)
        if (packet_id) {
                if (!hc->id) {
                        printk(KERN_WARNING "%s: packet error - packet has id "
-                               "0x%x, but we have not\n", __func__, packet_id);
+                              "0x%x, but we have not\n", __func__, packet_id);
                        return;
                }
                if (len < 4) {
                        printk(KERN_WARNING "%s: packet error - packet too "
-                               "short for ID value\n", __func__);
+                              "short for ID value\n", __func__);
                        return;
                }
                packet_id = (*buf++) << 24;
@@ -537,14 +537,14 @@ l1oip_socket_parse(struct l1oip *hc, struct sockaddr_in *sin, u8 *buf, int len)
 
                if (packet_id != hc->id) {
                        printk(KERN_WARNING "%s: packet error - ID mismatch, "
-                               "got 0x%x, we 0x%x\n",
-                               __func__, packet_id, hc->id);
+                              "got 0x%x, we 0x%x\n",
+                              __func__, packet_id, hc->id);
                        return;
                }
        } else {
                if (hc->id) {
                        printk(KERN_WARNING "%s: packet error - packet has no "
-                               "ID, but we have\n", __func__);
+                              "ID, but we have\n", __func__);
                        return;
                }
        }
@@ -552,13 +552,13 @@ l1oip_socket_parse(struct l1oip *hc, struct sockaddr_in *sin, u8 *buf, int len)
 multiframe:
        if (len < 1) {
                printk(KERN_WARNING "%s: packet error - packet too short, "
-                       "channel expected at position %d.\n",
-                       __func__, len-len_start+1);
+                      "channel expected at position %d.\n",
+                      __func__, len-len_start + 1);
                return;
        }
 
        /* get channel and multiframe flag */
-       channel = *buf&0x7f;
+       channel = *buf & 0x7f;
        m = *buf >> 7;
        buf++;
        len--;
@@ -567,8 +567,8 @@ multiframe:
        if (m) {
                if (len < 1) {
                        printk(KERN_WARNING "%s: packet error - packet too "
-                               "short, length expected at position %d.\n",
-                               __func__, len_start-len-1);
+                              "short, length expected at position %d.\n",
+                              __func__, len_start - len - 1);
                        return;
                }
 
@@ -576,26 +576,26 @@ multiframe:
                len--;
                if (mlen == 0)
                        mlen = 256;
-               if (len < mlen+3) {
+               if (len < mlen + 3) {
                        printk(KERN_WARNING "%s: packet error - length %d at "
-                               "position %d exceeds total length %d.\n",
-                               __func__, mlen, len_start-len-1, len_start);
+                              "position %d exceeds total length %d.\n",
+                              __func__, mlen, len_start-len - 1, len_start);
                        return;
                }
-               if (len == mlen+3) {
+               if (len == mlen + 3) {
                        printk(KERN_WARNING "%s: packet error - length %d at "
-                               "position %d will not allow additional "
-                               "packet.\n",
-                               __func__, mlen, len_start-len+1);
+                              "position %d will not allow additional "
+                              "packet.\n",
+                              __func__, mlen, len_start-len + 1);
                        return;
                }
        } else
-               mlen = len-2; /* single frame, subtract timebase */
+               mlen = len - 2; /* single frame, subtract timebase */
 
        if (len < 2) {
                printk(KERN_WARNING "%s: packet error - packet too short, time "
-                       "base expected at position %d.\n",
-                       __func__, len-len_start+1);
+                      "base expected at position %d.\n",
+                      __func__, len-len_start + 1);
                return;
        }
 
@@ -606,12 +606,12 @@ multiframe:
 
        /* if inactive, we send up a PH_ACTIVATE and activate */
        if (!test_bit(FLG_ACTIVE, &dch->Flags)) {
-               if (debug & (DEBUG_L1OIP_MSG|DEBUG_L1OIP_SOCKET))
+               if (debug & (DEBUG_L1OIP_MSG | DEBUG_L1OIP_SOCKET))
                        printk(KERN_DEBUG "%s: interface become active due to "
-                               "received packet\n", __func__);
+                              "received packet\n", __func__);
                test_and_set_bit(FLG_ACTIVE, &dch->Flags);
                _queue_data(&dch->dev.D, PH_ACTIVATE_IND, MISDN_ID_ANY, 0,
-                       NULL, GFP_ATOMIC);
+                           NULL, GFP_ATOMIC);
        }
 
        /* distribute packet */
@@ -624,24 +624,24 @@ multiframe:
                goto multiframe;
 
        /* restart timer */
-       if ((int)(hc->timeout_tl.expires-jiffies) < 5*HZ || !hc->timeout_on) {
+       if ((int)(hc->timeout_tl.expires-jiffies) < 5 * HZ || !hc->timeout_on) {
                hc->timeout_on = 1;
                del_timer(&hc->timeout_tl);
-               hc->timeout_tl.expires = jiffies + L1OIP_TIMEOUT*HZ;
+               hc->timeout_tl.expires = jiffies + L1OIP_TIMEOUT * HZ;
                add_timer(&hc->timeout_tl);
        } else /* only adjust timer */
-               hc->timeout_tl.expires = jiffies + L1OIP_TIMEOUT*HZ;
+               hc->timeout_tl.expires = jiffies + L1OIP_TIMEOUT * HZ;
 
        /* if ip or source port changes */
        if ((hc->sin_remote.sin_addr.s_addr != sin->sin_addr.s_addr)
-        || (hc->sin_remote.sin_port != sin->sin_port)) {
+           || (hc->sin_remote.sin_port != sin->sin_port)) {
                if (debug & DEBUG_L1OIP_SOCKET)
                        printk(KERN_DEBUG "%s: remote address changes from "
-                               "0x%08x to 0x%08x (port %d to %d)\n", __func__,
-                               ntohl(hc->sin_remote.sin_addr.s_addr),
-                               ntohl(sin->sin_addr.s_addr),
-                               ntohs(hc->sin_remote.sin_port),
-                               ntohs(sin->sin_port));
+                              "0x%08x to 0x%08x (port %d to %d)\n", __func__,
+                              ntohl(hc->sin_remote.sin_addr.s_addr),
+                              ntohl(sin->sin_addr.s_addr),
+                              ntohs(hc->sin_remote.sin_port),
+                              ntohs(sin->sin_port));
                hc->sin_remote.sin_addr.s_addr = sin->sin_addr.s_addr;
                hc->sin_remote.sin_port = sin->sin_port;
        }
@@ -694,9 +694,9 @@ l1oip_socket_thread(void *data)
 
        /* bind to incomming port */
        if (socket->ops->bind(socket, (struct sockaddr *)&hc->sin_local,
-           sizeof(hc->sin_local))) {
+                             sizeof(hc->sin_local))) {
                printk(KERN_ERR "%s: Failed to bind socket to port %d.\n",
-                       __func__, hc->localport);
+                      __func__, hc->localport);
                ret = -EINVAL;
                goto fail;
        }
@@ -728,7 +728,7 @@ l1oip_socket_thread(void *data)
        /* read loop */
        if (debug & DEBUG_L1OIP_SOCKET)
                printk(KERN_DEBUG "%s: socket created and open\n",
-                       __func__);
+                      __func__);
        while (!signal_pending(current)) {
                struct kvec iov = {
                        .iov_base = recvbuf,
@@ -741,7 +741,7 @@ l1oip_socket_thread(void *data)
                } else {
                        if (debug & DEBUG_L1OIP_SOCKET)
                                printk(KERN_WARNING
-                                   "%s: broken pipe on socket\n", __func__);
+                                      "%s: broken pipe on socket\n", __func__);
                }
        }
 
@@ -750,7 +750,7 @@ l1oip_socket_thread(void *data)
        /* if hc->socket is NULL, it is in use until it is given back */
        while (!hc->socket) {
                spin_unlock(&hc->socket_lock);
-               schedule_timeout(HZ/10);
+               schedule_timeout(HZ / 10);
                spin_lock(&hc->socket_lock);
        }
        hc->socket = NULL;
@@ -758,7 +758,7 @@ l1oip_socket_thread(void *data)
 
        if (debug & DEBUG_L1OIP_SOCKET)
                printk(KERN_DEBUG "%s: socket thread terminating\n",
-                       __func__);
+                      __func__);
 
 fail:
        /* free recvbuf */
@@ -774,7 +774,7 @@ fail:
 
        if (debug & DEBUG_L1OIP_SOCKET)
                printk(KERN_DEBUG "%s: socket thread terminated\n",
-                       __func__);
+                      __func__);
        return ret;
 }
 
@@ -787,19 +787,19 @@ l1oip_socket_close(struct l1oip *hc)
        if (hc->socket_thread) {
                if (debug & DEBUG_L1OIP_SOCKET)
                        printk(KERN_DEBUG "%s: socket thread exists, "
-                               "killing...\n", __func__);
+                              "killing...\n", __func__);
                send_sig(SIGTERM, hc->socket_thread, 0);
                wait_for_completion(&hc->socket_complete);
        }
 
        /* if active, we send up a PH_DEACTIVATE and deactivate */
        if (test_bit(FLG_ACTIVE, &dch->Flags)) {
-               if (debug & (DEBUG_L1OIP_MSG|DEBUG_L1OIP_SOCKET))
+               if (debug & (DEBUG_L1OIP_MSG | DEBUG_L1OIP_SOCKET))
                        printk(KERN_DEBUG "%s: interface become deactivated "
-                               "due to timeout\n", __func__);
+                              "due to timeout\n", __func__);
                test_and_clear_bit(FLG_ACTIVE, &dch->Flags);
                _queue_data(&dch->dev.D, PH_DEACTIVATE_IND, MISDN_ID_ANY, 0,
-                       NULL, GFP_ATOMIC);
+                           NULL, GFP_ATOMIC);
        }
 }
 
@@ -813,11 +813,11 @@ l1oip_socket_open(struct l1oip *hc)
 
        /* create receive process */
        hc->socket_thread = kthread_run(l1oip_socket_thread, hc, "l1oip_%s",
-               hc->name);
+                                       hc->name);
        if (IS_ERR(hc->socket_thread)) {
                int err = PTR_ERR(hc->socket_thread);
                printk(KERN_ERR "%s: Failed (%d) to create socket process.\n",
-                       __func__, err);
+                      __func__, err);
                hc->socket_thread = NULL;
                sock_release(hc->socket);
                return err;
@@ -834,9 +834,9 @@ l1oip_send_bh(struct work_struct *work)
 {
        struct l1oip *hc = container_of(work, struct l1oip, workq);
 
-       if (debug & (DEBUG_L1OIP_MSG|DEBUG_L1OIP_SOCKET))
+       if (debug & (DEBUG_L1OIP_MSG | DEBUG_L1OIP_SOCKET))
                printk(KERN_DEBUG "%s: keepalive timer expired, sending empty "
-                       "frame on dchannel\n", __func__);
+                      "frame on dchannel\n", __func__);
 
        /* send an empty l1oip frame at D-channel */
        l1oip_socket_send(hc, 0, hc->d_idx, 0, 0, NULL, 0);
@@ -862,25 +862,25 @@ l1oip_timeout(void *data)
 
        if (debug & DEBUG_L1OIP_MSG)
                printk(KERN_DEBUG "%s: timeout timer expired, turn layer one "
-                       "down.\n", __func__);
+                      "down.\n", __func__);
 
        hc->timeout_on = 0; /* state that timer must be initialized next time */
 
        /* if timeout, we send up a PH_DEACTIVATE and deactivate */
        if (test_bit(FLG_ACTIVE, &dch->Flags)) {
-               if (debug & (DEBUG_L1OIP_MSG|DEBUG_L1OIP_SOCKET))
+               if (debug & (DEBUG_L1OIP_MSG | DEBUG_L1OIP_SOCKET))
                        printk(KERN_DEBUG "%s: interface become deactivated "
-                               "due to timeout\n", __func__);
+                              "due to timeout\n", __func__);
                test_and_clear_bit(FLG_ACTIVE, &dch->Flags);
                _queue_data(&dch->dev.D, PH_DEACTIVATE_IND, MISDN_ID_ANY, 0,
-                       NULL, GFP_ATOMIC);
+                           NULL, GFP_ATOMIC);
        }
 
        /* if we have ondemand set, we remove ip address */
        if (hc->ondemand) {
                if (debug & DEBUG_L1OIP_MSG)
                        printk(KERN_DEBUG "%s: on demand causes ip address to "
-                               "be removed\n", __func__);
+                              "be removed\n", __func__);
                hc->sin_remote.sin_addr.s_addr = 0;
        }
 }
@@ -904,12 +904,12 @@ handle_dmsg(struct mISDNchannel *ch, struct sk_buff *skb)
        case PH_DATA_REQ:
                if (skb->len < 1) {
                        printk(KERN_WARNING "%s: skb too small\n",
-                               __func__);
+                              __func__);
                        break;
                }
                if (skb->len > MAX_DFRAME_LEN_L1 || skb->len > L1OIP_MAX_LEN) {
                        printk(KERN_WARNING "%s: skb too large\n",
-                               __func__);
+                              __func__);
                        break;
                }
                /* send frame */
@@ -918,7 +918,7 @@ handle_dmsg(struct mISDNchannel *ch, struct sk_buff *skb)
                while (l) {
                        ll = (l < L1OIP_MAX_PERFRAME) ? l : L1OIP_MAX_PERFRAME;
                        l1oip_socket_send(hc, 0, dch->slot, 0,
-                               hc->chan[dch->slot].tx_counter++, p, ll);
+                                         hc->chan[dch->slot].tx_counter++, p, ll);
                        p += ll;
                        l -= ll;
                }
@@ -926,9 +926,9 @@ handle_dmsg(struct mISDNchannel *ch, struct sk_buff *skb)
                queue_ch_frame(ch, PH_DATA_CNF, hh->id, skb);
                return 0;
        case PH_ACTIVATE_REQ:
-               if (debug & (DEBUG_L1OIP_MSG|DEBUG_L1OIP_SOCKET))
+               if (debug & (DEBUG_L1OIP_MSG | DEBUG_L1OIP_SOCKET))
                        printk(KERN_DEBUG "%s: PH_ACTIVATE channel %d (1..%d)\n"
-                               , __func__, dch->slot, hc->b_num+1);
+                              , __func__, dch->slot, hc->b_num + 1);
                skb_trim(skb, 0);
                if (test_bit(FLG_ACTIVE, &dch->Flags))
                        queue_ch_frame(ch, PH_ACTIVATE_IND, hh->id, skb);
@@ -936,10 +936,10 @@ handle_dmsg(struct mISDNchannel *ch, struct sk_buff *skb)
                        queue_ch_frame(ch, PH_DEACTIVATE_IND, hh->id, skb);
                return 0;
        case PH_DEACTIVATE_REQ:
-               if (debug & (DEBUG_L1OIP_MSG|DEBUG_L1OIP_SOCKET))
+               if (debug & (DEBUG_L1OIP_MSG | DEBUG_L1OIP_SOCKET))
                        printk(KERN_DEBUG "%s: PH_DEACTIVATE channel %d "
-                               "(1..%d)\n", __func__, dch->slot,
-                               hc->b_num+1);
+                              "(1..%d)\n", __func__, dch->slot,
+                              hc->b_num + 1);
                skb_trim(skb, 0);
                if (test_bit(FLG_ACTIVE, &dch->Flags))
                        queue_ch_frame(ch, PH_ACTIVATE_IND, hh->id, skb);
@@ -971,26 +971,26 @@ channel_dctrl(struct dchannel *dch, struct mISDN_ctrl_req *cq)
                        hc->remoteport = hc->localport;
                if (debug & DEBUG_L1OIP_SOCKET)
                        printk(KERN_DEBUG "%s: got new ip address from user "
-                               "space.\n", __func__);
+                              "space.\n", __func__);
                l1oip_socket_open(hc);
                break;
        case MISDN_CTRL_UNSETPEER:
                if (debug & DEBUG_L1OIP_SOCKET)
                        printk(KERN_DEBUG "%s: removing ip address.\n",
-                               __func__);
+                              __func__);
                hc->remoteip = 0;
                l1oip_socket_open(hc);
                break;
        case MISDN_CTRL_GETPEER:
                if (debug & DEBUG_L1OIP_SOCKET)
                        printk(KERN_DEBUG "%s: getting ip address.\n",
-                               __func__);
+                              __func__);
                cq->p1 = hc->remoteip;
                cq->p2 = hc->remoteport | (hc->localport << 16);
                break;
        default:
                printk(KERN_WARNING "%s: unknown Op %x\n",
-                   __func__, cq->op);
+                      __func__, cq->op);
                ret = -EINVAL;
                break;
        }
@@ -1002,21 +1002,21 @@ open_dchannel(struct l1oip *hc, struct dchannel *dch, struct channel_req *rq)
 {
        if (debug & DEBUG_HW_OPEN)
                printk(KERN_DEBUG "%s: dev(%d) open from %p\n", __func__,
-                   dch->dev.id, __builtin_return_address(0));
+                      dch->dev.id, __builtin_return_address(0));
        if (rq->protocol == ISDN_P_NONE)
                return -EINVAL;
        if ((dch->dev.D.protocol != ISDN_P_NONE) &&
            (dch->dev.D.protocol != rq->protocol)) {
                if (debug & DEBUG_HW_OPEN)
                        printk(KERN_WARNING "%s: change protocol %x to %x\n",
-                       __func__, dch->dev.D.protocol, rq->protocol);
+                              __func__, dch->dev.D.protocol, rq->protocol);
        }
        if (dch->dev.D.protocol != rq->protocol)
                dch->dev.D.protocol = rq->protocol;
 
        if (test_bit(FLG_ACTIVE, &dch->Flags)) {
                _queue_data(&dch->dev.D, PH_ACTIVATE_IND, MISDN_ID_ANY,
-                   0, NULL, GFP_KERNEL);
+                           0, NULL, GFP_KERNEL);
        }
        rq->ch = &dch->dev.D;
        if (!try_module_get(THIS_MODULE))
@@ -1038,7 +1038,7 @@ open_bchannel(struct l1oip *hc, struct dchannel *dch, struct channel_req *rq)
        bch = hc->chan[ch].bch;
        if (!bch) {
                printk(KERN_ERR "%s:internal error ch %d has no bch\n",
-                   __func__, ch);
+                      __func__, ch);
                return -EINVAL;
        }
        if (test_and_set_bit(FLG_OPEN, &bch->Flags))
@@ -1061,7 +1061,7 @@ l1oip_dctrl(struct mISDNchannel *ch, u_int cmd, void *arg)
 
        if (dch->debug & DEBUG_HW)
                printk(KERN_DEBUG "%s: cmd:%x %p\n",
-                   __func__, cmd, arg);
+                      __func__, cmd, arg);
        switch (cmd) {
        case OPEN_CHANNEL:
                rq = arg;
@@ -1089,8 +1089,8 @@ l1oip_dctrl(struct mISDNchannel *ch, u_int cmd, void *arg)
        case CLOSE_CHANNEL:
                if (debug & DEBUG_HW_OPEN)
                        printk(KERN_DEBUG "%s: dev(%d) close from %p\n",
-                           __func__, dch->dev.id,
-                           __builtin_return_address(0));
+                              __func__, dch->dev.id,
+                              __builtin_return_address(0));
                module_put(THIS_MODULE);
                break;
        case CONTROL_CHANNEL:
@@ -1099,7 +1099,7 @@ l1oip_dctrl(struct mISDNchannel *ch, u_int cmd, void *arg)
        default:
                if (dch->debug & DEBUG_HW)
                        printk(KERN_DEBUG "%s: unknown command %x\n",
-                           __func__, cmd);
+                              __func__, cmd);
                err = -EINVAL;
        }
        return err;
@@ -1112,48 +1112,38 @@ handle_bmsg(struct mISDNchannel *ch, struct sk_buff *skb)
        struct l1oip                    *hc = bch->hw;
        int                     ret = -EINVAL;
        struct mISDNhead        *hh = mISDN_HEAD_P(skb);
-       int                     l, ll, i;
+       int                     l, ll;
        unsigned char           *p;
 
        switch (hh->prim) {
        case PH_DATA_REQ:
                if (skb->len <= 0) {
                        printk(KERN_WARNING "%s: skb too small\n",
-                               __func__);
+                              __func__);
                        break;
                }
                if (skb->len > MAX_DFRAME_LEN_L1 || skb->len > L1OIP_MAX_LEN) {
                        printk(KERN_WARNING "%s: skb too large\n",
-                               __func__);
+                              __func__);
                        break;
                }
                /* check for AIS / ulaw-silence */
-               p = skb->data;
                l = skb->len;
-               for (i = 0; i < l; i++) {
-                       if (*p++ != 0xff)
-                               break;
-               }
-               if (i == l) {
+               if (!memchr_inv(skb->data, 0xff, l)) {
                        if (debug & DEBUG_L1OIP_MSG)
                                printk(KERN_DEBUG "%s: got AIS, not sending, "
-                                       "but counting\n", __func__);
+                                      "but counting\n", __func__);
                        hc->chan[bch->slot].tx_counter += l;
                        skb_trim(skb, 0);
                        queue_ch_frame(ch, PH_DATA_CNF, hh->id, skb);
                        return 0;
                }
                /* check for silence */
-               p = skb->data;
                l = skb->len;
-               for (i = 0; i < l; i++) {
-                       if (*p++ != 0x2a)
-                               break;
-               }
-               if (i == l) {
+               if (!memchr_inv(skb->data, 0x2a, l)) {
                        if (debug & DEBUG_L1OIP_MSG)
                                printk(KERN_DEBUG "%s: got silence, not sending"
-                                       ", but counting\n", __func__);
+                                      ", but counting\n", __func__);
                        hc->chan[bch->slot].tx_counter += l;
                        skb_trim(skb, 0);
                        queue_ch_frame(ch, PH_DATA_CNF, hh->id, skb);
@@ -1166,7 +1156,7 @@ handle_bmsg(struct mISDNchannel *ch, struct sk_buff *skb)
                while (l) {
                        ll = (l < L1OIP_MAX_PERFRAME) ? l : L1OIP_MAX_PERFRAME;
                        l1oip_socket_send(hc, hc->codec, bch->slot, 0,
-                               hc->chan[bch->slot].tx_counter, p, ll);
+                                         hc->chan[bch->slot].tx_counter, p, ll);
                        hc->chan[bch->slot].tx_counter += ll;
                        p += ll;
                        l -= ll;
@@ -1175,19 +1165,19 @@ handle_bmsg(struct mISDNchannel *ch, struct sk_buff *skb)
                queue_ch_frame(ch, PH_DATA_CNF, hh->id, skb);
                return 0;
        case PH_ACTIVATE_REQ:
-               if (debug & (DEBUG_L1OIP_MSG|DEBUG_L1OIP_SOCKET))
+               if (debug & (DEBUG_L1OIP_MSG | DEBUG_L1OIP_SOCKET))
                        printk(KERN_DEBUG "%s: PH_ACTIVATE channel %d (1..%d)\n"
-                               , __func__, bch->slot, hc->b_num+1);
+                              , __func__, bch->slot, hc->b_num + 1);
                hc->chan[bch->slot].codecstate = 0;
                test_and_set_bit(FLG_ACTIVE, &bch->Flags);
                skb_trim(skb, 0);
                queue_ch_frame(ch, PH_ACTIVATE_IND, hh->id, skb);
                return 0;
        case PH_DEACTIVATE_REQ:
-               if (debug & (DEBUG_L1OIP_MSG|DEBUG_L1OIP_SOCKET))
+               if (debug & (DEBUG_L1OIP_MSG | DEBUG_L1OIP_SOCKET))
                        printk(KERN_DEBUG "%s: PH_DEACTIVATE channel %d "
-                               "(1..%d)\n", __func__, bch->slot,
-                               hc->b_num+1);
+                              "(1..%d)\n", __func__, bch->slot,
+                              hc->b_num + 1);
                test_and_clear_bit(FLG_ACTIVE, &bch->Flags);
                skb_trim(skb, 0);
                queue_ch_frame(ch, PH_DEACTIVATE_IND, hh->id, skb);
@@ -1212,14 +1202,14 @@ channel_bctrl(struct bchannel *bch, struct mISDN_ctrl_req *cq)
        case MISDN_CTRL_HW_FEATURES: /* fill features structure */
                if (debug & DEBUG_L1OIP_MSG)
                        printk(KERN_DEBUG "%s: HW_FEATURE request\n",
-                           __func__);
+                              __func__);
                /* create confirm */
                features->unclocked = 1;
                features->unordered = 1;
                break;
        default:
                printk(KERN_WARNING "%s: unknown Op %x\n",
-                   __func__, cq->op);
+                      __func__, cq->op);
                ret = -EINVAL;
                break;
        }
@@ -1234,7 +1224,7 @@ l1oip_bctrl(struct mISDNchannel *ch, u_int cmd, void *arg)
 
        if (bch->debug & DEBUG_HW)
                printk(KERN_DEBUG "%s: cmd:%x %p\n",
-                   __func__, cmd, arg);
+                      __func__, cmd, arg);
        switch (cmd) {
        case CLOSE_CHANNEL:
                test_and_clear_bit(FLG_OPEN, &bch->Flags);
@@ -1249,7 +1239,7 @@ l1oip_bctrl(struct mISDNchannel *ch, u_int cmd, void *arg)
                break;
        default:
                printk(KERN_WARNING "%s: unknown prim(%x)\n",
-                       __func__, cmd);
+                      __func__, cmd);
        }
        return err;
 }
@@ -1340,18 +1330,18 @@ init_card(struct l1oip *hc, int pri, int bundle)
                break;
        default:
                printk(KERN_ERR "Codec(%d) not supported.\n",
-                       codec[l1oip_cnt]);
+                      codec[l1oip_cnt]);
                return -EINVAL;
        }
        hc->codec = codec[l1oip_cnt];
        if (debug & DEBUG_L1OIP_INIT)
                printk(KERN_DEBUG "%s: using codec %d\n",
-                       __func__, hc->codec);
+                      __func__, hc->codec);
 
        if (id[l1oip_cnt] == 0) {
                printk(KERN_WARNING "Warning: No 'id' value given or "
-                       "0, this is highly unsecure. Please use 32 "
-                       "bit randmom number 0x...\n");
+                      "0, this is highly unsecure. Please use 32 "
+                      "bit randmom number 0x...\n");
        }
        hc->id = id[l1oip_cnt];
        if (debug & DEBUG_L1OIP_INIT)
@@ -1360,7 +1350,7 @@ init_card(struct l1oip *hc, int pri, int bundle)
        hc->ondemand = ondemand[l1oip_cnt];
        if (hc->ondemand && !hc->id) {
                printk(KERN_ERR "%s: ondemand option only allowed in "
-                       "conjunction with non 0 ID\n", __func__);
+                      "conjunction with non 0 ID\n", __func__);
                return -EINVAL;
        }
 
@@ -1368,37 +1358,37 @@ init_card(struct l1oip *hc, int pri, int bundle)
                hc->b_num = limit[l1oip_cnt];
        if (!pri && hc->b_num > 2) {
                printk(KERN_ERR "Maximum limit for BRI interface is 2 "
-                       "channels.\n");
+                      "channels.\n");
                return -EINVAL;
        }
        if (pri && hc->b_num > 126) {
                printk(KERN_ERR "Maximum limit for PRI interface is 126 "
-                       "channels.\n");
+                      "channels.\n");
                return -EINVAL;
        }
        if (pri && hc->b_num > 30) {
                printk(KERN_WARNING "Maximum limit for BRI interface is 30 "
-                       "channels.\n");
+                      "channels.\n");
                printk(KERN_WARNING "Your selection of %d channels must be "
-                       "supported by application.\n", hc->limit);
+                      "supported by application.\n", hc->limit);
        }
 
-       hc->remoteip = ip[l1oip_cnt<<2] << 24
-                    | ip[(l1oip_cnt<<2)+1] << 16
-                    | ip[(l1oip_cnt<<2)+2] << 8
-                    | ip[(l1oip_cnt<<2)+3];
-       hc->localport = port[l1oip_cnt]?:(L1OIP_DEFAULTPORT+l1oip_cnt);
+       hc->remoteip = ip[l1oip_cnt << 2] << 24
+               | ip[(l1oip_cnt << 2) + 1] << 16
+               | ip[(l1oip_cnt << 2) + 2] << 8
+               | ip[(l1oip_cnt << 2) + 3];
+       hc->localport = port[l1oip_cnt]?:(L1OIP_DEFAULTPORT + l1oip_cnt);
        if (remoteport[l1oip_cnt])
                hc->remoteport = remoteport[l1oip_cnt];
        else
                hc->remoteport = hc->localport;
        if (debug & DEBUG_L1OIP_INIT)
                printk(KERN_DEBUG "%s: using local port %d remote ip "
-                       "%d.%d.%d.%d port %d ondemand %d\n", __func__,
-                       hc->localport, hc->remoteip >> 24,
-                       (hc->remoteip >> 16) & 0xff,
-                       (hc->remoteip >> 8) & 0xff, hc->remoteip & 0xff,
-                       hc->remoteport, hc->ondemand);
+                      "%d.%d.%d.%d port %d ondemand %d\n", __func__,
+                      hc->localport, hc->remoteip >> 24,
+                      (hc->remoteip >> 16) & 0xff,
+                      (hc->remoteip >> 8) & 0xff, hc->remoteip & 0xff,
+                      hc->remoteport, hc->ondemand);
 
        dch = kzalloc(sizeof(struct dchannel), GFP_KERNEL);
        if (!dch)
@@ -1411,7 +1401,7 @@ init_card(struct l1oip *hc, int pri, int bundle)
        else
                dch->dev.Dprotocols = (1 << ISDN_P_TE_S0) | (1 << ISDN_P_NT_S0);
        dch->dev.Bprotocols = (1 << (ISDN_P_B_RAW & ISDN_P_B_MASK)) |
-           (1 << (ISDN_P_B_HDLC & ISDN_P_B_MASK));
+               (1 << (ISDN_P_B_HDLC & ISDN_P_B_MASK));
        dch->dev.D.send = handle_dmsg;
        dch->dev.D.ctrl = l1oip_dctrl;
        dch->dev.nrbchan = hc->b_num;
@@ -1424,7 +1414,7 @@ init_card(struct l1oip *hc, int pri, int bundle)
                bch = kzalloc(sizeof(struct bchannel), GFP_KERNEL);
                if (!bch) {
                        printk(KERN_ERR "%s: no memory for bchannel\n",
-                           __func__);
+                              __func__);
                        return -ENOMEM;
                }
                bch->nr = i + ch;
@@ -1447,7 +1437,7 @@ init_card(struct l1oip *hc, int pri, int bundle)
 
        if (debug & DEBUG_L1OIP_INIT)
                printk(KERN_DEBUG "%s: Setting up network card(%d)\n",
-                       __func__, l1oip_cnt + 1);
+                      __func__, l1oip_cnt + 1);
        ret = l1oip_socket_open(hc);
        if (ret)
                return ret;
@@ -1455,7 +1445,7 @@ init_card(struct l1oip *hc, int pri, int bundle)
        hc->keep_tl.function = (void *)l1oip_keepalive;
        hc->keep_tl.data = (ulong)hc;
        init_timer(&hc->keep_tl);
-       hc->keep_tl.expires = jiffies + 2*HZ; /* two seconds first time */
+       hc->keep_tl.expires = jiffies + 2 * HZ; /* two seconds first time */
        add_timer(&hc->keep_tl);
 
        hc->timeout_tl.function = (void *)l1oip_timeout;
@@ -1474,7 +1464,7 @@ l1oip_init(void)
        int             ret;
 
        printk(KERN_INFO "mISDN: Layer-1-over-IP driver Rev. %s\n",
-               l1oip_revision);
+              l1oip_revision);
 
        INIT_LIST_HEAD(&l1oip_ilist);
        spin_lock_init(&l1oip_lock);
@@ -1503,16 +1493,16 @@ l1oip_init(void)
                        break;
                default:
                        printk(KERN_ERR "Card type(%d) not supported.\n",
-                               type[l1oip_cnt] & 0xff);
+                              type[l1oip_cnt] & 0xff);
                        l1oip_cleanup();
                        return -EINVAL;
                }
 
                if (debug & DEBUG_L1OIP_INIT)
                        printk(KERN_DEBUG "%s: interface %d is %s with %s.\n",
-                           __func__, l1oip_cnt, pri ? "PRI" : "BRI",
-                           bundle ? "bundled IP packet for all B-channels" :
-                           "separate IP packets for every B-channel");
+                              __func__, l1oip_cnt, pri ? "PRI" : "BRI",
+                              bundle ? "bundled IP packet for all B-channels" :
+                              "separate IP packets for every B-channel");
 
                hc = kzalloc(sizeof(struct l1oip), GFP_ATOMIC);
                if (!hc) {
@@ -1540,4 +1530,3 @@ l1oip_init(void)
 
 module_init(l1oip_init);
 module_exit(l1oip_cleanup);
-
index 5cc7c00..0fc49b3 100644 (file)
 static u_int *debug;
 
 struct layer1 {
-       u_long                  Flags;
-       struct FsmInst          l1m;
-       struct FsmTimer         timer;
-       int                     delay;
-       struct dchannel         *dch;
-       dchannel_l1callback     *dcb;
+       u_long Flags;
+       struct FsmInst l1m;
+       struct FsmTimer timer;
+       int delay;
+       struct dchannel *dch;
+       dchannel_l1callback *dcb;
 };
 
 #define TIMER3_VALUE 7000
@@ -49,7 +49,7 @@ enum {
        ST_L1_F8,
 };
 
-#define L1S_STATE_COUNT (ST_L1_F8+1)
+#define L1S_STATE_COUNT (ST_L1_F8 + 1)
 
 static char *strL1SState[] =
 {
@@ -358,7 +358,7 @@ l1_event(struct layer1 *l1, u_int event)
        default:
                if (*debug & DEBUG_L1)
                        printk(KERN_DEBUG "%s %x unhandled\n",
-                           __func__, event);
+                              __func__, event);
                err = -EINVAL;
        }
        return err;
index 9c8125f..d1d332c 100644 (file)
@@ -23,4 +23,3 @@
 #define FLG_L1_PULL_REQ                6
 #define FLG_L1_UINT            7
 #define FLG_L1_DBLOCKED                8
-
index 5bc0015..39d7375 100644 (file)
@@ -63,7 +63,7 @@ enum {
        EV_L2_FRAME_ERROR,
 };
 
-#define L2_EVENT_COUNT (EV_L2_FRAME_ERROR+1)
+#define L2_EVENT_COUNT (EV_L2_FRAME_ERROR + 1)
 
 static char *strL2Event[] =
 {
@@ -281,9 +281,9 @@ l2mgr(struct layer2 *l2, u_int prim, void *arg) {
        long c = (long)arg;
 
        printk(KERN_WARNING
-           "l2mgr: addr:%x prim %x %c\n", l2->id, prim, (char)c);
+              "l2mgr: addr:%x prim %x %c\n", l2->id, prim, (char)c);
        if (test_bit(FLG_LAPD, &l2->flag) &&
-               !test_bit(FLG_FIXED_TEI, &l2->flag)) {
+           !test_bit(FLG_FIXED_TEI, &l2->flag)) {
                switch (c) {
                case 'C':
                case 'D':
@@ -340,7 +340,7 @@ ReleaseWin(struct layer2 *l2)
 
        if (cnt)
                printk(KERN_WARNING
-                   "isdnl2 freed %d skbuffs in release\n", cnt);
+                      "isdnl2 freed %d skbuffs in release\n", cnt);
 }
 
 inline unsigned int
@@ -471,7 +471,7 @@ inline int
 IsRNR(u_char *data, struct layer2 *l2)
 {
        return test_bit(FLG_MOD128, &l2->flag) ?
-           data[0] == RNR : (data[0] & 0xf) == RNR;
+               data[0] == RNR : (data[0] & 0xf) == RNR;
 }
 
 static int
@@ -543,15 +543,15 @@ FRMR_error(struct layer2 *l2, struct sk_buff *skb)
                        return 'N';
                else if (*debug & DEBUG_L2)
                        l2m_debug(&l2->l2m,
-                           "FRMR information %2x %2x %2x %2x %2x",
-                           datap[0], datap[1], datap[2], datap[3], datap[4]);
+                                 "FRMR information %2x %2x %2x %2x %2x",
+                                 datap[0], datap[1], datap[2], datap[3], datap[4]);
        } else {
                if (skb->len < headers + 3)
                        return 'N';
                else if (*debug & DEBUG_L2)
                        l2m_debug(&l2->l2m,
-                           "FRMR information %2x %2x %2x",
-                           datap[0], datap[1], datap[2]);
+                                 "FRMR information %2x %2x %2x",
+                                 datap[0], datap[1], datap[2]);
        }
        return 0;
 }
@@ -604,7 +604,7 @@ send_uframe(struct layer2 *l2, struct sk_buff *skb, u_char cmd, u_char cr)
                skb = mI_alloc_skb(i, GFP_ATOMIC);
                if (!skb) {
                        printk(KERN_WARNING "%s: can't alloc skbuff\n",
-                               __func__);
+                              __func__);
                        return;
                }
        }
@@ -1051,7 +1051,7 @@ l2_st5_dm_release(struct FsmInst *fi, int event, void *arg)
                        skb_queue_purge(&l2->i_queue);
                if (test_bit(FLG_LAPB, &l2->flag))
                        l2down_create(l2, PH_DEACTIVATE_REQ,
-                               l2_newid(l2), 0, NULL);
+                                     l2_newid(l2), 0, NULL);
                st5_dl_release_l2l3(l2);
                mISDN_FsmChangeState(fi, ST_L2_4);
                if (l2->tm)
@@ -1090,7 +1090,7 @@ enquiry_cr(struct layer2 *l2, u_char typ, u_char cr, u_char pf)
        skb = mI_alloc_skb(i, GFP_ATOMIC);
        if (!skb) {
                printk(KERN_WARNING
-                   "isdnl2 can't alloc sbbuff for enquiry_cr\n");
+                      "isdnl2 can't alloc sbbuff for enquiry_cr\n");
                return;
        }
        memcpy(skb_put(skb, i), tmp, i);
@@ -1149,8 +1149,8 @@ invoke_retransmission(struct layer2 *l2, unsigned int nr)
                                skb_queue_head(&l2->i_queue, l2->windowar[p1]);
                        else
                                printk(KERN_WARNING
-                                   "%s: windowar[%d] is NULL\n",
-                                   __func__, p1);
+                                      "%s: windowar[%d] is NULL\n",
+                                      __func__, p1);
                        l2->windowar[p1] = NULL;
                }
                mISDN_FsmEvent(&l2->l2m, EV_L2_ACK_PULL, NULL);
@@ -1199,13 +1199,13 @@ l2_st7_got_super(struct FsmInst *fi, int event, void *arg)
                        invoke_retransmission(l2, nr);
                        stop_t200(l2, 10);
                        if (mISDN_FsmAddTimer(&l2->t203, l2->T203,
-                                       EV_L2_T203, NULL, 6))
+                                             EV_L2_T203, NULL, 6))
                                l2m_debug(&l2->l2m, "Restart T203 ST7 REJ");
                } else if ((nr == l2->vs) && (typ == RR)) {
                        setva(l2, nr);
                        stop_t200(l2, 11);
                        mISDN_FsmRestartTimer(&l2->t203, l2->T203,
-                                       EV_L2_T203, NULL, 7);
+                                             EV_L2_T203, NULL, 7);
                } else if ((l2->va != nr) || (typ == RNR)) {
                        setva(l2, nr);
                        if (typ != RR)
@@ -1303,7 +1303,7 @@ l2_got_iframe(struct FsmInst *fi, int event, void *arg)
                        if (nr == l2->vs) {
                                stop_t200(l2, 13);
                                mISDN_FsmRestartTimer(&l2->t203, l2->T203,
-                                               EV_L2_T203, NULL, 7);
+                                                     EV_L2_T203, NULL, 7);
                        } else if (nr != l2->va)
                                restart_t200(l2, 14);
                }
@@ -1343,7 +1343,7 @@ l2_st5_tout_200(struct FsmInst *fi, int event, void *arg)
        struct layer2 *l2 = fi->userdata;
 
        if (test_bit(FLG_LAPD, &l2->flag) &&
-               test_bit(FLG_DCHAN_BUSY, &l2->flag)) {
+           test_bit(FLG_DCHAN_BUSY, &l2->flag)) {
                mISDN_FsmAddTimer(&l2->t200, l2->T200, EV_L2_T200, NULL, 9);
        } else if (l2->rc == l2->N200) {
                mISDN_FsmChangeState(fi, ST_L2_4);
@@ -1352,7 +1352,7 @@ l2_st5_tout_200(struct FsmInst *fi, int event, void *arg)
                l2mgr(l2, MDL_ERROR_IND, (void *) 'G');
                if (test_bit(FLG_LAPB, &l2->flag))
                        l2down_create(l2, PH_DEACTIVATE_REQ,
-                               l2_newid(l2), 0, NULL);
+                                     l2_newid(l2), 0, NULL);
                st5_dl_release_l2l3(l2);
                if (l2->tm)
                        l2_tei(l2, MDL_STATUS_DOWN_IND, 0);
@@ -1360,7 +1360,7 @@ l2_st5_tout_200(struct FsmInst *fi, int event, void *arg)
                l2->rc++;
                mISDN_FsmAddTimer(&l2->t200, l2->T200, EV_L2_T200, NULL, 9);
                send_uframe(l2, NULL, (test_bit(FLG_MOD128, &l2->flag) ?
-                       SABME : SABM) | 0x10, CMD);
+                                      SABME : SABM) | 0x10, CMD);
        }
 }
 
@@ -1370,7 +1370,7 @@ l2_st6_tout_200(struct FsmInst *fi, int event, void *arg)
        struct layer2 *l2 = fi->userdata;
 
        if (test_bit(FLG_LAPD, &l2->flag) &&
-               test_bit(FLG_DCHAN_BUSY, &l2->flag)) {
+           test_bit(FLG_DCHAN_BUSY, &l2->flag)) {
                mISDN_FsmAddTimer(&l2->t200, l2->T200, EV_L2_T200, NULL, 9);
        } else if (l2->rc == l2->N200) {
                mISDN_FsmChangeState(fi, ST_L2_4);
@@ -1382,7 +1382,7 @@ l2_st6_tout_200(struct FsmInst *fi, int event, void *arg)
        } else {
                l2->rc++;
                mISDN_FsmAddTimer(&l2->t200, l2->T200, EV_L2_T200,
-                           NULL, 9);
+                                 NULL, 9);
                send_uframe(l2, NULL, DISC | 0x10, CMD);
        }
 }
@@ -1393,7 +1393,7 @@ l2_st7_tout_200(struct FsmInst *fi, int event, void *arg)
        struct layer2 *l2 = fi->userdata;
 
        if (test_bit(FLG_LAPD, &l2->flag) &&
-               test_bit(FLG_DCHAN_BUSY, &l2->flag)) {
+           test_bit(FLG_DCHAN_BUSY, &l2->flag)) {
                mISDN_FsmAddTimer(&l2->t200, l2->T200, EV_L2_T200, NULL, 9);
                return;
        }
@@ -1410,7 +1410,7 @@ l2_st8_tout_200(struct FsmInst *fi, int event, void *arg)
        struct layer2 *l2 = fi->userdata;
 
        if (test_bit(FLG_LAPD, &l2->flag) &&
-               test_bit(FLG_DCHAN_BUSY, &l2->flag)) {
+           test_bit(FLG_DCHAN_BUSY, &l2->flag)) {
                mISDN_FsmAddTimer(&l2->t200, l2->T200, EV_L2_T200, NULL, 9);
                return;
        }
@@ -1431,7 +1431,7 @@ l2_st7_tout_203(struct FsmInst *fi, int event, void *arg)
        struct layer2 *l2 = fi->userdata;
 
        if (test_bit(FLG_LAPD, &l2->flag) &&
-               test_bit(FLG_DCHAN_BUSY, &l2->flag)) {
+           test_bit(FLG_DCHAN_BUSY, &l2->flag)) {
                mISDN_FsmAddTimer(&l2->t203, l2->T203, EV_L2_T203, NULL, 9);
                return;
        }
@@ -1462,7 +1462,7 @@ l2_pull_iqueue(struct FsmInst *fi, int event, void *arg)
        p1 = (p1 + l2->sow) % l2->window;
        if (l2->windowar[p1]) {
                printk(KERN_WARNING "isdnl2 try overwrite ack queue entry %d\n",
-                   p1);
+                      p1);
                dev_kfree_skb(l2->windowar[p1]);
        }
        l2->windowar[p1] = skb;
@@ -1482,7 +1482,7 @@ l2_pull_iqueue(struct FsmInst *fi, int event, void *arg)
                memcpy(skb_push(nskb, i), header, i);
        else {
                printk(KERN_WARNING
-                   "isdnl2 pull_iqueue skb header(%d/%d) too short\n", i, p1);
+                      "isdnl2 pull_iqueue skb header(%d/%d) too short\n", i, p1);
                oskb = nskb;
                nskb = mI_alloc_skb(oskb->len + i, GFP_ATOMIC);
                if (!nskb) {
@@ -1537,7 +1537,7 @@ l2_st8_got_super(struct FsmInst *fi, int event, void *arg)
                        } else {
                                stop_t200(l2, 16);
                                mISDN_FsmAddTimer(&l2->t203, l2->T203,
-                                           EV_L2_T203, NULL, 5);
+                                                 EV_L2_T203, NULL, 5);
                                setva(l2, nr);
                        }
                        invoke_retransmission(l2, nr);
@@ -1858,7 +1858,7 @@ ph_data_indication(struct layer2 *l2, struct mISDNhead *hh, struct sk_buff *skb)
                ptei = *datap++;
                if ((psapi & 1) || !(ptei & 1)) {
                        printk(KERN_WARNING
-                           "l2 D-channel frame wrong EA0/EA1\n");
+                              "l2 D-channel frame wrong EA0/EA1\n");
                        return ret;
                }
                psapi >>= 2;
@@ -1867,7 +1867,7 @@ ph_data_indication(struct layer2 *l2, struct mISDNhead *hh, struct sk_buff *skb)
                        /* not our business */
                        if (*debug & DEBUG_L2)
                                printk(KERN_DEBUG "%s: sapi %d/%d mismatch\n",
-                                       __func__, psapi, l2->sapi);
+                                      __func__, psapi, l2->sapi);
                        dev_kfree_skb(skb);
                        return 0;
                }
@@ -1875,7 +1875,7 @@ ph_data_indication(struct layer2 *l2, struct mISDNhead *hh, struct sk_buff *skb)
                        /* not our business */
                        if (*debug & DEBUG_L2)
                                printk(KERN_DEBUG "%s: tei %d/%d mismatch\n",
-                                       __func__, ptei, l2->tei);
+                                      __func__, ptei, l2->tei);
                        dev_kfree_skb(skb);
                        return 0;
                }
@@ -1927,11 +1927,11 @@ l2_send(struct mISDNchannel *ch, struct sk_buff *skb)
 {
        struct layer2           *l2 = container_of(ch, struct layer2, ch);
        struct mISDNhead        *hh =  mISDN_HEAD_P(skb);
-       int                     ret = -EINVAL;
+       int                     ret = -EINVAL;
 
        if (*debug & DEBUG_L2_RECV)
                printk(KERN_DEBUG "%s: prim(%x) id(%x) sapi(%d) tei(%d)\n",
-                   __func__, hh->prim, hh->id, l2->sapi, l2->tei);
+                      __func__, hh->prim, hh->id, l2->sapi, l2->tei);
        switch (hh->prim) {
        case PH_DATA_IND:
                ret = ph_data_indication(l2, hh, skb);
@@ -1944,7 +1944,7 @@ l2_send(struct mISDNchannel *ch, struct sk_buff *skb)
                l2up_create(l2, MPH_ACTIVATE_IND, 0, NULL);
                if (test_and_clear_bit(FLG_ESTAB_PEND, &l2->flag))
                        ret = mISDN_FsmEvent(&l2->l2m,
-                               EV_L2_DL_ESTABLISH_REQ, skb);
+                                            EV_L2_DL_ESTABLISH_REQ, skb);
                break;
        case PH_DEACTIVATE_IND:
                test_and_clear_bit(FLG_L1_ACTIV, &l2->flag);
@@ -1967,30 +1967,30 @@ l2_send(struct mISDNchannel *ch, struct sk_buff *skb)
                        test_and_set_bit(FLG_ORIG, &l2->flag);
                if (test_bit(FLG_L1_ACTIV, &l2->flag)) {
                        if (test_bit(FLG_LAPD, &l2->flag) ||
-                               test_bit(FLG_ORIG, &l2->flag))
+                           test_bit(FLG_ORIG, &l2->flag))
                                ret = mISDN_FsmEvent(&l2->l2m,
-                                       EV_L2_DL_ESTABLISH_REQ, skb);
+                                                    EV_L2_DL_ESTABLISH_REQ, skb);
                } else {
                        if (test_bit(FLG_LAPD, &l2->flag) ||
-                               test_bit(FLG_ORIG, &l2->flag)) {
+                           test_bit(FLG_ORIG, &l2->flag)) {
                                test_and_set_bit(FLG_ESTAB_PEND,
-                                       &l2->flag);
+                                                &l2->flag);
                        }
                        ret = l2down(l2, PH_ACTIVATE_REQ, l2_newid(l2),
-                           skb);
+                                    skb);
                }
                break;
        case DL_RELEASE_REQ:
                if (test_bit(FLG_LAPB, &l2->flag))
                        l2down_create(l2, PH_DEACTIVATE_REQ,
-                               l2_newid(l2), 0, NULL);
+                                     l2_newid(l2), 0, NULL);
                ret = mISDN_FsmEvent(&l2->l2m, EV_L2_DL_RELEASE_REQ,
-                   skb);
+                                    skb);
                break;
        default:
                if (*debug & DEBUG_L2)
                        l2m_debug(&l2->l2m, "l2 unknown pr %04x",
-                           hh->prim);
+                                 hh->prim);
        }
        if (ret) {
                dev_kfree_skb(skb);
@@ -2038,7 +2038,7 @@ release_l2(struct layer2 *l2)
                TEIrelease(l2);
                if (l2->ch.st)
                        l2->ch.st->dev->D.ctrl(&l2->ch.st->dev->D,
-                           CLOSE_CHANNEL, NULL);
+                                              CLOSE_CHANNEL, NULL);
        }
        kfree(l2);
 }
@@ -2058,7 +2058,7 @@ l2_ctrl(struct mISDNchannel *ch, u_int cmd, void *arg)
                        set_channel_address(&l2->ch, l2->sapi, l2->tei);
                        info = DL_INFO_L2_CONNECT;
                        l2up_create(l2, DL_INFORMATION_IND,
-                           sizeof(info), &info);
+                                   sizeof(info), &info);
                }
                break;
        case CLOSE_CHANNEL:
@@ -2072,7 +2072,7 @@ l2_ctrl(struct mISDNchannel *ch, u_int cmd, void *arg)
 
 struct layer2 *
 create_l2(struct mISDNchannel *ch, u_int protocol, u_long options, int tei,
-               int sapi)
+         int sapi)
 {
        struct layer2           *l2;
        struct channel_req      rq;
@@ -2151,7 +2151,7 @@ create_l2(struct mISDNchannel *ch, u_int protocol, u_long options, int tei,
                break;
        default:
                printk(KERN_ERR "layer2 create failed prt %x\n",
-                       protocol);
+                      protocol);
                kfree(l2);
                return NULL;
        }
@@ -2162,8 +2162,8 @@ create_l2(struct mISDNchannel *ch, u_int protocol, u_long options, int tei,
        InitWin(l2);
        l2->l2m.fsm = &l2fsm;
        if (test_bit(FLG_LAPB, &l2->flag) ||
-               test_bit(FLG_PTP, &l2->flag) ||
-               test_bit(FLG_LAPD_NET, &l2->flag))
+           test_bit(FLG_PTP, &l2->flag) ||
+           test_bit(FLG_LAPD_NET, &l2->flag))
                l2->l2m.state = ST_L2_4;
        else
                l2->l2m.state = ST_L2_1;
@@ -2219,4 +2219,3 @@ Isdnl2_cleanup(void)
        TEIFree();
        mISDN_FsmFree(&l2fsm);
 }
-
index 9547fb3..fe68d94 100644 (file)
@@ -87,18 +87,18 @@ enum {
        ST_L2_8,
 };
 
-#define L2_STATE_COUNT (ST_L2_8+1)
+#define L2_STATE_COUNT (ST_L2_8 + 1)
 
 extern struct layer2   *create_l2(struct mISDNchannel *, u_int,
-                               u_long, int, int);
+                                  u_long, int, int);
 extern int             tei_l2(struct layer2 *, u_int, u_long arg);
 
 
 /* from tei.c */
-extern int             l2_tei(struct layer2 *, u_int, u_long arg);
-extern void            TEIrelease(struct layer2 *);
-extern int             TEIInit(u_int *);
-extern void            TEIFree(void);
+extern int             l2_tei(struct layer2 *, u_int, u_long arg);
+extern void            TEIrelease(struct layer2 *);
+extern int             TEIInit(u_int *);
+extern void            TEIFree(void);
 
 #define MAX_L2HEADER_LEN 4
 
index 738ea8d..abe2d69 100644 (file)
@@ -113,7 +113,7 @@ mISDN_sock_cmsg(struct sock *sk, struct msghdr *msg, struct sk_buff *skb)
 
 static int
 mISDN_sock_recvmsg(struct kiocb *iocb, struct socket *sock,
-    struct msghdr *msg, size_t len, int flags)
+                  struct msghdr *msg, size_t len, int flags)
 {
        struct sk_buff          *skb;
        struct sock             *sk = sock->sk;
@@ -123,8 +123,8 @@ mISDN_sock_recvmsg(struct kiocb *iocb, struct socket *sock,
 
        if (*debug & DEBUG_SOCKET)
                printk(KERN_DEBUG "%s: len %d, flags %x ch.nr %d, proto %x\n",
-                       __func__, (int)len, flags, _pms(sk)->ch.nr,
-                       sk->sk_protocol);
+                      __func__, (int)len, flags, _pms(sk)->ch.nr,
+                      sk->sk_protocol);
        if (flags & (MSG_OOB))
                return -EOPNOTSUPP;
 
@@ -153,7 +153,7 @@ mISDN_sock_recvmsg(struct kiocb *iocb, struct socket *sock,
        } else {
                if (msg->msg_namelen)
                        printk(KERN_WARNING "%s: too small namelen %d\n",
-                           __func__, msg->msg_namelen);
+                              __func__, msg->msg_namelen);
                msg->msg_namelen = 0;
        }
 
@@ -166,7 +166,7 @@ mISDN_sock_recvmsg(struct kiocb *iocb, struct socket *sock,
                return -ENOSPC;
        }
        memcpy(skb_push(skb, MISDN_HEADER_LEN), mISDN_HEAD_P(skb),
-           MISDN_HEADER_LEN);
+              MISDN_HEADER_LEN);
 
        err = skb_copy_datagram_iovec(skb, 0, msg->msg_iov, copied);
 
@@ -179,7 +179,7 @@ mISDN_sock_recvmsg(struct kiocb *iocb, struct socket *sock,
 
 static int
 mISDN_sock_sendmsg(struct kiocb *iocb, struct socket *sock,
-    struct msghdr *msg, size_t len)
+                  struct msghdr *msg, size_t len)
 {
        struct sock             *sk = sock->sk;
        struct sk_buff          *skb;
@@ -188,13 +188,13 @@ mISDN_sock_sendmsg(struct kiocb *iocb, struct socket *sock,
 
        if (*debug & DEBUG_SOCKET)
                printk(KERN_DEBUG "%s: len %d flags %x ch %d proto %x\n",
-                    __func__, (int)len, msg->msg_flags, _pms(sk)->ch.nr,
-                    sk->sk_protocol);
+                      __func__, (int)len, msg->msg_flags, _pms(sk)->ch.nr,
+                      sk->sk_protocol);
 
        if (msg->msg_flags & MSG_OOB)
                return -EOPNOTSUPP;
 
-       if (msg->msg_flags & ~(MSG_DONTWAIT|MSG_NOSIGNAL|MSG_ERRQUEUE))
+       if (msg->msg_flags & ~(MSG_DONTWAIT | MSG_NOSIGNAL | MSG_ERRQUEUE))
                return -EINVAL;
 
        if (len < MISDN_HEADER_LEN)
@@ -229,7 +229,7 @@ mISDN_sock_sendmsg(struct kiocb *iocb, struct socket *sock,
 
        if (*debug & DEBUG_SOCKET)
                printk(KERN_DEBUG "%s: ID:%x\n",
-                    __func__, mISDN_HEAD_ID(skb));
+                      __func__, mISDN_HEAD_ID(skb));
 
        err = -ENODEV;
        if (!_pms(sk)->ch.peer)
@@ -312,16 +312,16 @@ data_sock_ioctl_bound(struct sock *sk, unsigned int cmd, void __user *p)
                }
                if ((sk->sk_protocol & ~ISDN_P_B_MASK) == ISDN_P_B_START) {
                        list_for_each_entry_safe(bchan, next,
-                               &_pms(sk)->dev->bchannels, list) {
+                                                &_pms(sk)->dev->bchannels, list) {
                                if (bchan->nr == cq.channel) {
                                        err = bchan->ctrl(bchan,
-                                               CONTROL_CHANNEL, &cq);
+                                                         CONTROL_CHANNEL, &cq);
                                        break;
                                }
                        }
                } else
                        err = _pms(sk)->dev->D.ctrl(&_pms(sk)->dev->D,
-                               CONTROL_CHANNEL, &cq);
+                                                   CONTROL_CHANNEL, &cq);
                if (err)
                        break;
                if (copy_to_user(p, &cq, sizeof(cq)))
@@ -338,11 +338,11 @@ data_sock_ioctl_bound(struct sock *sk, unsigned int cmd, void __user *p)
                        break;
                }
                err = _pms(sk)->dev->teimgr->ctrl(_pms(sk)->dev->teimgr,
-                   CONTROL_CHANNEL, val);
+                                                 CONTROL_CHANNEL, val);
                break;
        case IMHOLD_L1:
                if (sk->sk_protocol != ISDN_P_LAPD_NT
-                && sk->sk_protocol != ISDN_P_LAPD_TE) {
+                   && sk->sk_protocol != ISDN_P_LAPD_TE) {
                        err = -EINVAL;
                        break;
                }
@@ -352,7 +352,7 @@ data_sock_ioctl_bound(struct sock *sk, unsigned int cmd, void __user *p)
                        break;
                }
                err = _pms(sk)->dev->teimgr->ctrl(_pms(sk)->dev->teimgr,
-                   CONTROL_CHANNEL, val);
+                                                 CONTROL_CHANNEL, val);
                break;
        default:
                err = -EINVAL;
@@ -366,7 +366,7 @@ done:
 static int
 data_sock_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
 {
-       int                     err = 0, id;
+       int                     err = 0, id;
        struct sock             *sk = sock->sk;
        struct mISDNdevice      *dev;
        struct mISDNversion     ver;
@@ -399,7 +399,7 @@ data_sock_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
                        di.Bprotocols = dev->Bprotocols | get_all_Bprotocols();
                        di.protocol = dev->D.protocol;
                        memcpy(di.channelmap, dev->channelmap,
-                               sizeof(di.channelmap));
+                              sizeof(di.channelmap));
                        di.nrbchan = dev->nrbchan;
                        strcpy(di.name, dev_name(&dev->dev));
                        if (copy_to_user((void __user *)arg, &di, sizeof(di)))
@@ -410,7 +410,7 @@ data_sock_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
        default:
                if (sk->sk_state == MISDN_BOUND)
                        err = data_sock_ioctl_bound(sk, cmd,
-                               (void __user *)arg);
+                                                   (void __user *)arg);
                else
                        err = -ENOTCONN;
        }
@@ -418,14 +418,14 @@ data_sock_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
 }
 
 static int data_sock_setsockopt(struct socket *sock, int level, int optname,
-       char __user *optval, unsigned int len)
+                               char __user *optval, unsigned int len)
 {
        struct sock *sk = sock->sk;
        int err = 0, opt = 0;
 
        if (*debug & DEBUG_SOCKET)
                printk(KERN_DEBUG "%s(%p, %d, %x, %p, %d)\n", __func__, sock,
-                   level, optname, optval, len);
+                      level, optname, optval, len);
 
        lock_sock(sk);
 
@@ -450,7 +450,7 @@ static int data_sock_setsockopt(struct socket *sock, int level, int optname,
 }
 
 static int data_sock_getsockopt(struct socket *sock, int level, int optname,
-       char __user *optval, int __user *optlen)
+                               char __user *optval, int __user *optlen)
 {
        struct sock *sk = sock->sk;
        int len, opt;
@@ -516,7 +516,7 @@ data_sock_bind(struct socket *sock, struct sockaddr *addr, int addr_len)
                        if (csk->sk_protocol >= ISDN_P_B_START)
                                continue;
                        if (IS_ISDN_P_TE(csk->sk_protocol)
-                                       == IS_ISDN_P_TE(sk->sk_protocol))
+                           == IS_ISDN_P_TE(sk->sk_protocol))
                                continue;
                        read_unlock_bh(&data_sockets.lock);
                        err = -EBUSY;
@@ -535,14 +535,14 @@ data_sock_bind(struct socket *sock, struct sockaddr *addr, int addr_len)
        case ISDN_P_NT_E1:
                mISDN_sock_unlink(&data_sockets, sk);
                err = connect_layer1(_pms(sk)->dev, &_pms(sk)->ch,
-                   sk->sk_protocol, maddr);
+                                    sk->sk_protocol, maddr);
                if (err)
                        mISDN_sock_link(&data_sockets, sk);
                break;
        case ISDN_P_LAPD_TE:
        case ISDN_P_LAPD_NT:
                err = create_l2entity(_pms(sk)->dev, &_pms(sk)->ch,
-                   sk->sk_protocol, maddr);
+                                     sk->sk_protocol, maddr);
                break;
        case ISDN_P_B_RAW:
        case ISDN_P_B_HDLC:
@@ -551,7 +551,7 @@ data_sock_bind(struct socket *sock, struct sockaddr *addr, int addr_len)
        case ISDN_P_B_L2DSP:
        case ISDN_P_B_L2DSPHDLC:
                err = connect_Bstack(_pms(sk)->dev, &_pms(sk)->ch,
-                   sk->sk_protocol, maddr);
+                                    sk->sk_protocol, maddr);
                break;
        default:
                err = -EPROTONOSUPPORT;
@@ -568,9 +568,9 @@ done:
 
 static int
 data_sock_getname(struct socket *sock, struct sockaddr *addr,
-    int *addr_len, int peer)
+                 int *addr_len, int peer)
 {
-       struct sockaddr_mISDN   *maddr = (struct sockaddr_mISDN *) addr;
+       struct sockaddr_mISDN   *maddr = (struct sockaddr_mISDN *) addr;
        struct sock             *sk = sock->sk;
 
        if (!_pms(sk)->dev)
@@ -651,7 +651,7 @@ base_sock_release(struct socket *sock)
 static int
 base_sock_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
 {
-       int                     err = 0, id;
+       int                     err = 0, id;
        struct mISDNdevice      *dev;
        struct mISDNversion     ver;
 
@@ -683,7 +683,7 @@ base_sock_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
                        di.Bprotocols = dev->Bprotocols | get_all_Bprotocols();
                        di.protocol = dev->D.protocol;
                        memcpy(di.channelmap, dev->channelmap,
-                               sizeof(di.channelmap));
+                              sizeof(di.channelmap));
                        di.nrbchan = dev->nrbchan;
                        strcpy(di.name, dev_name(&dev->dev));
                        if (copy_to_user((void __user *)arg, &di, sizeof(di)))
@@ -692,20 +692,20 @@ base_sock_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
                        err = -ENODEV;
                break;
        case IMSETDEVNAME:
-               {
-                       struct mISDN_devrename dn;
-                       if (copy_from_user(&dn, (void __user *)arg,
-                           sizeof(dn))) {
-                               err = -EFAULT;
-                               break;
-                       }
-                       dev = get_mdevice(dn.id);
-                       if (dev)
-                               err = device_rename(&dev->dev, dn.name);
-                       else
-                               err = -ENODEV;
+       {
+               struct mISDN_devrename dn;
+               if (copy_from_user(&dn, (void __user *)arg,
+                                  sizeof(dn))) {
+                       err = -EFAULT;
+                       break;
                }
-               break;
+               dev = get_mdevice(dn.id);
+               if (dev)
+                       err = device_rename(&dev->dev, dn.name);
+               else
+                       err = -ENODEV;
+       }
+       break;
        default:
                err = -EINVAL;
        }
@@ -790,7 +790,7 @@ mISDN_sock_create(struct net *net, struct socket *sock, int proto, int kern)
 {
        int err = -EPROTONOSUPPORT;
 
-       switch  (proto) {
+       switch (proto) {
        case ISDN_P_BASE:
                err = base_sock_create(net, sock, proto);
                break;
@@ -838,4 +838,3 @@ misdn_sock_cleanup(void)
 {
        sock_unregister(PF_ISDN);
 }
-
index a5b632e..1a0ae44 100644 (file)
@@ -29,7 +29,7 @@ _queue_message(struct mISDNstack *st, struct sk_buff *skb)
 
        if (*debug & DEBUG_QUEUE_FUNC)
                printk(KERN_DEBUG "%s prim(%x) id(%x) %p\n",
-                   __func__, hh->prim, hh->id, skb);
+                      __func__, hh->prim, hh->id, skb);
        skb_queue_tail(&st->msgq, skb);
        if (likely(!test_bit(mISDN_STACK_STOPPED, &st->status))) {
                test_and_set_bit(mISDN_STACK_WORK, &st->status);
@@ -109,15 +109,15 @@ send_layer2(struct mISDNstack *st, struct sk_buff *skb)
                                if (ret) {
                                        if (*debug & DEBUG_SEND_ERR)
                                                printk(KERN_DEBUG
-                                                   "%s ch%d prim(%x) addr(%x)"
-                                                   " err %d\n",
-                                                   __func__, ch->nr,
-                                                   hh->prim, ch->addr, ret);
+                                                      "%s ch%d prim(%x) addr(%x)"
+                                                      " err %d\n",
+                                                      __func__, ch->nr,
+                                                      hh->prim, ch->addr, ret);
                                        dev_kfree_skb(cskb);
                                }
                        } else {
                                printk(KERN_WARNING "%s ch%d addr %x no mem\n",
-                                   __func__, ch->nr, ch->addr);
+                                      __func__, ch->nr, ch->addr);
                                goto out;
                        }
                }
@@ -135,8 +135,8 @@ send_layer2(struct mISDNstack *st, struct sk_buff *skb)
                        skb = NULL;
                else if (*debug & DEBUG_SEND_ERR)
                        printk(KERN_DEBUG
-                           "%s ch%d mgr prim(%x) addr(%x) err %d\n",
-                           __func__, ch->nr, hh->prim, ch->addr, ret);
+                              "%s ch%d mgr prim(%x) addr(%x) err %d\n",
+                              __func__, ch->nr, hh->prim, ch->addr, ret);
        }
 out:
        mutex_unlock(&st->lmutex);
@@ -154,7 +154,7 @@ send_msg_to_layer(struct mISDNstack *st, struct sk_buff *skb)
        lm = hh->prim & MISDN_LAYERMASK;
        if (*debug & DEBUG_QUEUE_FUNC)
                printk(KERN_DEBUG "%s prim(%x) id(%x) %p\n",
-                   __func__, hh->prim, hh->id, skb);
+                      __func__, hh->prim, hh->id, skb);
        if (lm == 0x1) {
                if (!hlist_empty(&st->l1sock.head)) {
                        __net_timestamp(skb);
@@ -172,9 +172,9 @@ send_msg_to_layer(struct mISDNstack *st, struct sk_buff *skb)
                        return ch->send(ch, skb);
                else
                        printk(KERN_WARNING
-                           "%s: dev(%s) prim(%x) id(%x) no channel\n",
-                           __func__, dev_name(&st->dev->dev), hh->prim,
-                           hh->id);
+                              "%s: dev(%s) prim(%x) id(%x) no channel\n",
+                              __func__, dev_name(&st->dev->dev), hh->prim,
+                              hh->id);
        } else if (lm == 0x8) {
                WARN_ON(lm == 0x8);
                ch = get_channel4id(st, hh->id);
@@ -182,13 +182,13 @@ send_msg_to_layer(struct mISDNstack *st, struct sk_buff *skb)
                        return ch->send(ch, skb);
                else
                        printk(KERN_WARNING
-                           "%s: dev(%s) prim(%x) id(%x) no channel\n",
-                           __func__, dev_name(&st->dev->dev), hh->prim,
-                           hh->id);
+                              "%s: dev(%s) prim(%x) id(%x) no channel\n",
+                              __func__, dev_name(&st->dev->dev), hh->prim,
+                              hh->id);
        } else {
                /* broadcast not handled yet */
                printk(KERN_WARNING "%s: dev(%s) prim %x not delivered\n",
-                   __func__, dev_name(&st->dev->dev), hh->prim);
+                      __func__, dev_name(&st->dev->dev), hh->prim);
        }
        return -ESRCH;
 }
@@ -207,7 +207,7 @@ mISDNStackd(void *data)
        sigfillset(&current->blocked);
        if (*debug & DEBUG_MSG_THREAD)
                printk(KERN_DEBUG "mISDNStackd %s started\n",
-                   dev_name(&st->dev->dev));
+                      dev_name(&st->dev->dev));
 
        if (st->notify != NULL) {
                complete(st->notify);
@@ -226,13 +226,13 @@ mISDNStackd(void *data)
                        skb = skb_dequeue(&st->msgq);
                        if (!skb) {
                                test_and_clear_bit(mISDN_STACK_WORK,
-                                       &st->status);
+                                                  &st->status);
                                /* test if a race happens */
                                skb = skb_dequeue(&st->msgq);
                                if (!skb)
                                        continue;
                                test_and_set_bit(mISDN_STACK_WORK,
-                                   &st->status);
+                                                &st->status);
                        }
 #ifdef MISDN_MSG_STATS
                        st->msg_cnt++;
@@ -241,20 +241,20 @@ mISDNStackd(void *data)
                        if (unlikely(err)) {
                                if (*debug & DEBUG_SEND_ERR)
                                        printk(KERN_DEBUG
-                                           "%s: %s prim(%x) id(%x) "
-                                           "send call(%d)\n",
-                                           __func__, dev_name(&st->dev->dev),
-                                           mISDN_HEAD_PRIM(skb),
-                                           mISDN_HEAD_ID(skb), err);
+                                              "%s: %s prim(%x) id(%x) "
+                                              "send call(%d)\n",
+                                              __func__, dev_name(&st->dev->dev),
+                                              mISDN_HEAD_PRIM(skb),
+                                              mISDN_HEAD_ID(skb), err);
                                dev_kfree_skb(skb);
                                continue;
                        }
                        if (unlikely(test_bit(mISDN_STACK_STOPPED,
-                           &st->status))) {
+                                             &st->status))) {
                                test_and_clear_bit(mISDN_STACK_WORK,
-                                   &st->status);
+                                                  &st->status);
                                test_and_clear_bit(mISDN_STACK_RUNNING,
-                                   &st->status);
+                                                  &st->status);
                                break;
                        }
                }
@@ -270,7 +270,7 @@ mISDNStackd(void *data)
                        test_and_set_bit(mISDN_STACK_RUNNING, &st->status);
                        if (!skb_queue_empty(&st->msgq))
                                test_and_set_bit(mISDN_STACK_WORK,
-                                   &st->status);
+                                                &st->status);
                }
                if (test_bit(mISDN_STACK_ABORT, &st->status))
                        break;
@@ -283,10 +283,10 @@ mISDNStackd(void *data)
 #endif
                test_and_clear_bit(mISDN_STACK_ACTIVE, &st->status);
                wait_event_interruptible(st->workq, (st->status &
-                   mISDN_STACK_ACTION_MASK));
+                                                    mISDN_STACK_ACTION_MASK));
                if (*debug & DEBUG_MSG_THREAD)
                        printk(KERN_DEBUG "%s: %s wake status %08lx\n",
-                           __func__, dev_name(&st->dev->dev), st->status);
+                              __func__, dev_name(&st->dev->dev), st->status);
                test_and_set_bit(mISDN_STACK_ACTIVE, &st->status);
 
                test_and_clear_bit(mISDN_STACK_WAKEUP, &st->status);
@@ -300,17 +300,17 @@ mISDNStackd(void *data)
        }
 #ifdef MISDN_MSG_STATS
        printk(KERN_DEBUG "mISDNStackd daemon for %s proceed %d "
-           "msg %d sleep %d stopped\n",
-           dev_name(&st->dev->dev), st->msg_cnt, st->sleep_cnt,
-           st->stopped_cnt);
+              "msg %d sleep %d stopped\n",
+              dev_name(&st->dev->dev), st->msg_cnt, st->sleep_cnt,
+              st->stopped_cnt);
        printk(KERN_DEBUG
-           "mISDNStackd daemon for %s utime(%ld) stime(%ld)\n",
-           dev_name(&st->dev->dev), st->thread->utime, st->thread->stime);
+              "mISDNStackd daemon for %s utime(%ld) stime(%ld)\n",
+              dev_name(&st->dev->dev), st->thread->utime, st->thread->stime);
        printk(KERN_DEBUG
-           "mISDNStackd daemon for %s nvcsw(%ld) nivcsw(%ld)\n",
-           dev_name(&st->dev->dev), st->thread->nvcsw, st->thread->nivcsw);
+              "mISDNStackd daemon for %s nvcsw(%ld) nivcsw(%ld)\n",
+              dev_name(&st->dev->dev), st->thread->nvcsw, st->thread->nivcsw);
        printk(KERN_DEBUG "mISDNStackd daemon for %s killed now\n",
-           dev_name(&st->dev->dev));
+              dev_name(&st->dev->dev));
 #endif
        test_and_set_bit(mISDN_STACK_KILLED, &st->status);
        test_and_clear_bit(mISDN_STACK_RUNNING, &st->status);
@@ -401,15 +401,15 @@ create_stack(struct mISDNdevice *dev)
        newst->own.recv = mISDN_queue_message;
        if (*debug & DEBUG_CORE_FUNC)
                printk(KERN_DEBUG "%s: st(%s)\n", __func__,
-                   dev_name(&newst->dev->dev));
+                      dev_name(&newst->dev->dev));
        newst->notify = &done;
        newst->thread = kthread_run(mISDNStackd, (void *)newst, "mISDN_%s",
-               dev_name(&newst->dev->dev));
+                                   dev_name(&newst->dev->dev));
        if (IS_ERR(newst->thread)) {
                err = PTR_ERR(newst->thread);
                printk(KERN_ERR
-                       "mISDN:cannot create kernel thread for %s (%d)\n",
-                       dev_name(&newst->dev->dev), err);
+                      "mISDN:cannot create kernel thread for %s (%d)\n",
+                      dev_name(&newst->dev->dev), err);
                delete_teimanager(dev->teimgr);
                kfree(newst);
        } else
@@ -419,7 +419,7 @@ create_stack(struct mISDNdevice *dev)
 
 int
 connect_layer1(struct mISDNdevice *dev, struct mISDNchannel *ch,
-               u_int protocol, struct sockaddr_mISDN *adr)
+              u_int protocol, struct sockaddr_mISDN *adr)
 {
        struct mISDN_sock       *msk = container_of(ch, struct mISDN_sock, ch);
        struct channel_req      rq;
@@ -428,8 +428,8 @@ connect_layer1(struct mISDNdevice *dev, struct mISDNchannel *ch,
 
        if (*debug &  DEBUG_CORE_FUNC)
                printk(KERN_DEBUG "%s: %s proto(%x) adr(%d %d %d %d)\n",
-                       __func__, dev_name(&dev->dev), protocol, adr->dev,
-                       adr->channel, adr->sapi, adr->tei);
+                      __func__, dev_name(&dev->dev), protocol, adr->dev,
+                      adr->channel, adr->sapi, adr->tei);
        switch (protocol) {
        case ISDN_P_NT_S0:
        case ISDN_P_NT_E1:
@@ -442,7 +442,7 @@ connect_layer1(struct mISDNdevice *dev, struct mISDNchannel *ch,
                rq.adr.channel = adr->channel;
                err = dev->D.ctrl(&dev->D, OPEN_CHANNEL, &rq);
                printk(KERN_DEBUG "%s: ret %d (dev %d)\n", __func__, err,
-                       dev->id);
+                      dev->id);
                if (err)
                        return err;
                write_lock_bh(&dev->D.st->l1sock.lock);
@@ -457,7 +457,7 @@ connect_layer1(struct mISDNdevice *dev, struct mISDNchannel *ch,
 
 int
 connect_Bstack(struct mISDNdevice *dev, struct mISDNchannel *ch,
-    u_int protocol, struct sockaddr_mISDN *adr)
+              u_int protocol, struct sockaddr_mISDN *adr)
 {
        struct channel_req      rq, rq2;
        int                     pmask, err;
@@ -465,9 +465,9 @@ connect_Bstack(struct mISDNdevice *dev, struct mISDNchannel *ch,
 
        if (*debug &  DEBUG_CORE_FUNC)
                printk(KERN_DEBUG "%s: %s proto(%x) adr(%d %d %d %d)\n",
-                       __func__, dev_name(&dev->dev), protocol,
-                       adr->dev, adr->channel, adr->sapi,
-                       adr->tei);
+                      __func__, dev_name(&dev->dev), protocol,
+                      adr->dev, adr->channel, adr->sapi,
+                      adr->tei);
        ch->st = dev->D.st;
        pmask = 1 << (protocol & ISDN_P_B_MASK);
        if (pmask & dev->Bprotocols) {
@@ -514,16 +514,16 @@ connect_Bstack(struct mISDNdevice *dev, struct mISDNchannel *ch,
 
 int
 create_l2entity(struct mISDNdevice *dev, struct mISDNchannel *ch,
-    u_int protocol, struct sockaddr_mISDN *adr)
+               u_int protocol, struct sockaddr_mISDN *adr)
 {
        struct channel_req      rq;
        int                     err;
 
        if (*debug &  DEBUG_CORE_FUNC)
                printk(KERN_DEBUG "%s: %s proto(%x) adr(%d %d %d %d)\n",
-                       __func__, dev_name(&dev->dev), protocol,
-                       adr->dev, adr->channel, adr->sapi,
-                       adr->tei);
+                      __func__, dev_name(&dev->dev), protocol,
+                      adr->dev, adr->channel, adr->sapi,
+                      adr->tei);
        rq.protocol = ISDN_P_TE_S0;
        if (dev->Dprotocols & (1 << ISDN_P_TE_E1))
                rq.protocol = ISDN_P_TE_E1;
@@ -573,7 +573,7 @@ delete_channel(struct mISDNchannel *ch)
        }
        if (*debug & DEBUG_CORE_FUNC)
                printk(KERN_DEBUG "%s: st(%s) protocol(%x)\n", __func__,
-                   dev_name(&ch->st->dev->dev), ch->protocol);
+                      dev_name(&ch->st->dev->dev), ch->protocol);
        if (ch->protocol >= ISDN_P_B_START) {
                if (ch->peer) {
                        ch->peer->ctrl(ch->peer, CLOSE_CHANNEL, NULL);
@@ -602,7 +602,7 @@ delete_channel(struct mISDNchannel *ch)
                        pch->ctrl(pch, CLOSE_CHANNEL, NULL);
                } else
                        printk(KERN_WARNING "%s: no l2 channel\n",
-                           __func__);
+                              __func__);
                break;
        case ISDN_P_LAPD_NT:
                pch = ch->st->dev->teimgr;
@@ -610,7 +610,7 @@ delete_channel(struct mISDNchannel *ch)
                        pch->ctrl(pch, CLOSE_CHANNEL, NULL);
                } else
                        printk(KERN_WARNING "%s: no l2 channel\n",
-                           __func__);
+                              __func__);
                break;
        default:
                break;
@@ -626,14 +626,14 @@ delete_stack(struct mISDNdevice *dev)
 
        if (*debug & DEBUG_CORE_FUNC)
                printk(KERN_DEBUG "%s: st(%s)\n", __func__,
-                   dev_name(&st->dev->dev));
+                      dev_name(&st->dev->dev));
        if (dev->teimgr)
                delete_teimanager(dev->teimgr);
        if (st->thread) {
                if (st->notify) {
                        printk(KERN_WARNING "%s: notifier in use\n",
-                           __func__);
-                               complete(st->notify);
+                              __func__);
+                       complete(st->notify);
                }
                st->notify = &done;
                test_and_set_bit(mISDN_STACK_ABORT, &st->status);
@@ -643,10 +643,10 @@ delete_stack(struct mISDNdevice *dev)
        }
        if (!list_empty(&st->layer2))
                printk(KERN_WARNING "%s: layer2 list not empty\n",
-                   __func__);
+                      __func__);
        if (!hlist_empty(&st->l1sock.head))
                printk(KERN_WARNING "%s: layer1 list not empty\n",
-                   __func__);
+                      __func__);
        kfree(st);
 }
 
index 687c9b6..ba2bc0c 100644 (file)
@@ -34,7 +34,7 @@
 
 #define DATIMER_VAL    10000
 
-static         u_int   *debug;
+static u_int   *debug;
 
 static struct Fsm deactfsm = {NULL, 0, 0, NULL, NULL};
 static struct Fsm teifsmu = {NULL, 0, 0, NULL, NULL};
@@ -45,7 +45,7 @@ enum {
        ST_L1_DEACT_PENDING,
        ST_L1_ACTIV,
 };
-#define DEACT_STATE_COUNT (ST_L1_ACTIV+1)
+#define DEACT_STATE_COUNT (ST_L1_ACTIV + 1)
 
 static char *strDeactState[] =
 {
@@ -63,7 +63,7 @@ enum {
        EV_DATIMER,
 };
 
-#define DEACT_EVENT_COUNT (EV_DATIMER+1)
+#define DEACT_EVENT_COUNT (EV_DATIMER + 1)
 
 static char *strDeactEvent[] =
 {
@@ -130,7 +130,7 @@ da_deactivate(struct FsmInst *fi, int event, void *arg)
        /* All TEI are inactiv */
        if (!test_bit(OPTION_L1_HOLD, &mgr->options)) {
                mISDN_FsmAddTimer(&mgr->datimer, DATIMER_VAL, EV_DATIMER,
-                       NULL, 1);
+                                 NULL, 1);
                mISDN_FsmChangeState(fi, ST_L1_DEACT_PENDING);
        }
 }
@@ -144,7 +144,7 @@ da_ui(struct FsmInst *fi, int event, void *arg)
        if (!test_bit(OPTION_L1_HOLD, &mgr->options)) {
                mISDN_FsmDelTimer(&mgr->datimer, 2);
                mISDN_FsmAddTimer(&mgr->datimer, DATIMER_VAL, EV_DATIMER,
-                       NULL, 2);
+                                 NULL, 2);
        }
 }
 
@@ -169,7 +169,7 @@ da_timer(struct FsmInst *fi, int event, void *arg)
        /* All TEI are inactiv */
        mISDN_FsmChangeState(fi, ST_L1_DEACT);
        _queue_data(&mgr->ch, PH_DEACTIVATE_REQ, MISDN_ID_ANY, 0, NULL,
-           GFP_ATOMIC);
+                   GFP_ATOMIC);
 }
 
 static struct FsmNode DeactFnList[] =
@@ -188,7 +188,7 @@ enum {
        ST_TEI_IDVERIFY,
 };
 
-#define TEI_STATE_COUNT (ST_TEI_IDVERIFY+1)
+#define TEI_STATE_COUNT (ST_TEI_IDVERIFY + 1)
 
 static char *strTeiState[] =
 {
@@ -209,7 +209,7 @@ enum {
        EV_TIMER,
 };
 
-#define TEI_EVENT_COUNT (EV_TIMER+1)
+#define TEI_EVENT_COUNT (EV_TIMER + 1)
 
 static char *strTeiEvent[] =
 {
@@ -257,8 +257,8 @@ get_free_id(struct manager *mgr)
        list_for_each_entry(l2, &mgr->layer2, list) {
                if (l2->ch.nr > 63) {
                        printk(KERN_WARNING
-                           "%s: more as 63 layer2 for one device\n",
-                           __func__);
+                              "%s: more as 63 layer2 for one device\n",
+                              __func__);
                        return -EBUSY;
                }
                test_and_set_bit(l2->ch.nr, (u_long *)&ids);
@@ -267,7 +267,7 @@ get_free_id(struct manager *mgr)
                if (!test_bit(i, (u_long *)&ids))
                        return i;
        printk(KERN_WARNING "%s: more as 63 layer2 for one device\n",
-           __func__);
+              __func__);
        return -EBUSY;
 }
 
@@ -294,7 +294,7 @@ get_free_tei(struct manager *mgr)
                if (!test_bit(i, (u_long *)&ids))
                        return i + 64;
        printk(KERN_WARNING "%s: more as 63 dynamic tei for one device\n",
-           __func__);
+              __func__);
        return -1;
 }
 
@@ -385,7 +385,7 @@ mgr_send_down(struct manager *mgr, struct sk_buff *skb)
        skb_queue_tail(&mgr->sendq, skb);
        if (!test_bit(MGR_PH_ACTIVE, &mgr->options)) {
                _queue_data(&mgr->ch, PH_ACTIVATE_REQ, MISDN_ID_ANY, 0,
-                   NULL, GFP_KERNEL);
+                           NULL, GFP_KERNEL);
        } else {
                do_send(mgr);
        }
@@ -398,7 +398,7 @@ dl_unit_data(struct manager *mgr, struct sk_buff *skb)
                return -EINVAL;
        if (!test_bit(MGR_PH_ACTIVE, &mgr->options))
                _queue_data(&mgr->ch, PH_ACTIVATE_REQ, MISDN_ID_ANY, 0,
-                   NULL, GFP_KERNEL);
+                           NULL, GFP_KERNEL);
        skb_push(skb, 3);
        skb->data[0] = 0x02; /* SAPI 0 C/R = 1 */
        skb->data[1] = 0xff; /* TEI 127 */
@@ -468,14 +468,14 @@ tei_id_request(struct FsmInst *fi, int event, void *arg)
 
        if (tm->l2->tei != GROUP_TEI) {
                tm->tei_m.printdebug(&tm->tei_m,
-                       "assign request for already assigned tei %d",
-                       tm->l2->tei);
+                                    "assign request for already assigned tei %d",
+                                    tm->l2->tei);
                return;
        }
        tm->ri = random_ri();
        if (*debug & DEBUG_L2_TEI)
                tm->tei_m.printdebug(&tm->tei_m,
-                       "assign request ri %d", tm->ri);
+                                    "assign request ri %d", tm->ri);
        put_tei_msg(tm->mgr, ID_REQUEST, tm->ri, GROUP_TEI);
        mISDN_FsmChangeState(fi, ST_TEI_IDREQ);
        mISDN_FsmAddTimer(&tm->timer, tm->tval, EV_TIMER, NULL, 1);
@@ -496,12 +496,12 @@ tei_id_assign(struct FsmInst *fi, int event, void *arg)
        tei = *dp >> 1;
        if (*debug & DEBUG_L2_TEI)
                tm->tei_m.printdebug(fi, "identity assign ri %d tei %d",
-                       ri, tei);
+                                    ri, tei);
        l2 = findtei(tm->mgr, tei);
        if (l2) {       /* same tei is in use */
                if (ri != l2->tm->ri) {
                        tm->tei_m.printdebug(fi,
-                               "possible duplicate assignment tei %d", tei);
+                                            "possible duplicate assignment tei %d", tei);
                        tei_l2(l2, MDL_ERROR_RSP, 0);
                }
        } else if (ri == tm->ri) {
@@ -525,12 +525,12 @@ tei_id_test_dup(struct FsmInst *fi, int event, void *arg)
        tei = *dp >> 1;
        if (*debug & DEBUG_L2_TEI)
                tm->tei_m.printdebug(fi, "foreign identity assign ri %d tei %d",
-                       ri, tei);
+                                    ri, tei);
        l2 = findtei(tm->mgr, tei);
        if (l2) {       /* same tei is in use */
                if (ri != l2->tm->ri) { /* and it wasn't our request */
                        tm->tei_m.printdebug(fi,
-                               "possible duplicate assignment tei %d", tei);
+                                            "possible duplicate assignment tei %d", tei);
                        mISDN_FsmEvent(&l2->tm->tei_m, EV_VERIFY, NULL);
                }
        }
@@ -549,7 +549,7 @@ tei_id_denied(struct FsmInst *fi, int event, void *arg)
        tei = *dp >> 1;
        if (*debug & DEBUG_L2_TEI)
                tm->tei_m.printdebug(fi, "identity denied ri %d tei %d",
-                       ri, tei);
+                                    ri, tei);
 }
 
 static void
@@ -559,11 +559,11 @@ tei_id_chk_req(struct FsmInst *fi, int event, void *arg)
        u_char *dp = arg;
        int tei;
 
-       tei = *(dp+3) >> 1;
+       tei = *(dp + 3) >> 1;
        if (*debug & DEBUG_L2_TEI)
                tm->tei_m.printdebug(fi, "identity check req tei %d", tei);
        if ((tm->l2->tei != GROUP_TEI) && ((tei == GROUP_TEI) ||
-           (tei == tm->l2->tei))) {
+                                          (tei == tm->l2->tei))) {
                mISDN_FsmDelTimer(&tm->timer, 4);
                mISDN_FsmChangeState(&tm->tei_m, ST_TEI_NOP);
                put_tei_msg(tm->mgr, ID_CHK_RES, random_ri(), tm->l2->tei);
@@ -577,7 +577,7 @@ tei_id_remove(struct FsmInst *fi, int event, void *arg)
        u_char *dp = arg;
        int tei;
 
-       tei = *(dp+3) >> 1;
+       tei = *(dp + 3) >> 1;
        if (*debug & DEBUG_L2_TEI)
                tm->tei_m.printdebug(fi, "identity remove tei %d", tei);
        if ((tm->l2->tei != GROUP_TEI) &&
@@ -595,7 +595,7 @@ tei_id_verify(struct FsmInst *fi, int event, void *arg)
 
        if (*debug & DEBUG_L2_TEI)
                tm->tei_m.printdebug(fi, "id verify request for tei %d",
-                       tm->l2->tei);
+                                    tm->l2->tei);
        put_tei_msg(tm->mgr, ID_VERIFY, 0, tm->l2->tei);
        mISDN_FsmChangeState(&tm->tei_m, ST_TEI_IDVERIFY);
        mISDN_FsmAddTimer(&tm->timer, tm->tval, EV_TIMER, NULL, 2);
@@ -611,7 +611,7 @@ tei_id_req_tout(struct FsmInst *fi, int event, void *arg)
                tm->ri = random_ri();
                if (*debug & DEBUG_L2_TEI)
                        tm->tei_m.printdebug(fi, "assign req(%d) ri %d",
-                               4 - tm->nval, tm->ri);
+                                            4 - tm->nval, tm->ri);
                put_tei_msg(tm->mgr, ID_REQUEST, tm->ri, GROUP_TEI);
                mISDN_FsmAddTimer(&tm->timer, tm->tval, EV_TIMER, NULL, 3);
        } else {
@@ -629,13 +629,13 @@ tei_id_ver_tout(struct FsmInst *fi, int event, void *arg)
        if (--tm->nval) {
                if (*debug & DEBUG_L2_TEI)
                        tm->tei_m.printdebug(fi,
-                               "id verify req(%d) for tei %d",
-                               3 - tm->nval, tm->l2->tei);
+                                            "id verify req(%d) for tei %d",
+                                            3 - tm->nval, tm->l2->tei);
                put_tei_msg(tm->mgr, ID_VERIFY, 0, tm->l2->tei);
                mISDN_FsmAddTimer(&tm->timer, tm->tval, EV_TIMER, NULL, 4);
        } else {
                tm->tei_m.printdebug(fi, "verify req for tei %d failed",
-                       tm->l2->tei);
+                                    tm->l2->tei);
                tei_l2(tm->l2, MDL_REMOVE_REQ, 0);
                mISDN_FsmChangeState(fi, ST_TEI_NOP);
        }
@@ -673,14 +673,14 @@ tei_assign_req(struct FsmInst *fi, int event, void *arg)
 
        if (tm->l2->tei == GROUP_TEI) {
                tm->tei_m.printdebug(&tm->tei_m,
-                       "net tei assign request without tei");
+                                    "net tei assign request without tei");
                return;
        }
        tm->ri = ((unsigned int) *dp++ << 8);
        tm->ri += *dp++;
        if (*debug & DEBUG_L2_TEI)
                tm->tei_m.printdebug(&tm->tei_m,
-                       "net assign request ri %d teim %d", tm->ri, *dp);
+                                    "net assign request ri %d teim %d", tm->ri, *dp);
        put_tei_msg(tm->mgr, ID_ASSIGNED, tm->ri, tm->l2->tei);
        mISDN_FsmChangeState(fi, ST_TEI_NOP);
 }
@@ -692,7 +692,7 @@ tei_id_chk_req_net(struct FsmInst *fi, int event, void *arg)
 
        if (*debug & DEBUG_L2_TEI)
                tm->tei_m.printdebug(fi, "id check request for tei %d",
-                   tm->l2->tei);
+                                    tm->l2->tei);
        tm->rcnt = 0;
        put_tei_msg(tm->mgr, ID_CHK_REQ, 0, tm->l2->tei);
        mISDN_FsmChangeState(&tm->tei_m, ST_TEI_IDVERIFY);
@@ -724,7 +724,7 @@ tei_id_verify_net(struct FsmInst *fi, int event, void *arg)
        tei = dp[3] >> 1;
        if (*debug & DEBUG_L2_TEI)
                tm->tei_m.printdebug(fi, "identity verify req tei %d/%d",
-                   tei, tm->l2->tei);
+                                    tei, tm->l2->tei);
        if (tei == tm->l2->tei)
                tei_id_chk_req_net(fi, event, arg);
 }
@@ -737,7 +737,7 @@ tei_id_ver_tout_net(struct FsmInst *fi, int event, void *arg)
        if (tm->rcnt == 1) {
                if (*debug & DEBUG_L2_TEI)
                        tm->tei_m.printdebug(fi,
-                           "check req for tei %d successful\n", tm->l2->tei);
+                                            "check req for tei %d successful\n", tm->l2->tei);
                mISDN_FsmChangeState(fi, ST_TEI_NOP);
        } else if (tm->rcnt > 1) {
                /* duplicate assignment; remove */
@@ -745,13 +745,13 @@ tei_id_ver_tout_net(struct FsmInst *fi, int event, void *arg)
        } else if (--tm->nval) {
                if (*debug & DEBUG_L2_TEI)
                        tm->tei_m.printdebug(fi,
-                               "id check req(%d) for tei %d",
-                               3 - tm->nval, tm->l2->tei);
+                                            "id check req(%d) for tei %d",
+                                            3 - tm->nval, tm->l2->tei);
                put_tei_msg(tm->mgr, ID_CHK_REQ, 0, tm->l2->tei);
                mISDN_FsmAddTimer(&tm->timer, tm->tval, EV_TIMER, NULL, 4);
        } else {
                tm->tei_m.printdebug(fi, "check req for tei %d failed",
-                       tm->l2->tei);
+                                    tm->l2->tei);
                mISDN_FsmChangeState(fi, ST_TEI_NOP);
                tei_l2remove(tm->l2);
        }
@@ -800,7 +800,7 @@ create_new_tei(struct manager *mgr, int tei, int sapi)
        if ((tei >= 0) && (tei < 64))
                test_and_set_bit(OPTION_L2_FIXEDTEI, &opt);
        if (mgr->ch.st->dev->Dprotocols
-         & ((1 << ISDN_P_TE_E1) | (1 << ISDN_P_NT_E1)))
+           & ((1 << ISDN_P_TE_E1) | (1 << ISDN_P_NT_E1)))
                test_and_set_bit(OPTION_L2_PMX, &opt);
        l2 = create_l2(mgr->up, ISDN_P_LAPD_NT, opt, tei, sapi);
        if (!l2) {
@@ -880,7 +880,7 @@ ph_data_ind(struct manager *mgr, struct sk_buff *skb)
        if (skb->len < 8) {
                if (*debug  & DEBUG_L2_TEI)
                        printk(KERN_DEBUG "%s: short mgr frame %d/8\n",
-                           __func__, skb->len);
+                              __func__, skb->len);
                goto done;
        }
 
@@ -979,15 +979,15 @@ static int
 create_teimgr(struct manager *mgr, struct channel_req *crq)
 {
        struct layer2   *l2;
-       u_long          opt = 0;
+       u_long          opt = 0;
        u_long          flags;
        int             id;
 
        if (*debug & DEBUG_L2_TEI)
                printk(KERN_DEBUG "%s: %s proto(%x) adr(%d %d %d %d)\n",
-                       __func__, dev_name(&mgr->ch.st->dev->dev),
-                       crq->protocol, crq->adr.dev, crq->adr.channel,
-                       crq->adr.sapi, crq->adr.tei);
+                      __func__, dev_name(&mgr->ch.st->dev->dev),
+                      crq->protocol, crq->adr.dev, crq->adr.channel,
+                      crq->adr.sapi, crq->adr.tei);
        if (crq->adr.tei > GROUP_TEI)
                return -EINVAL;
        if (crq->adr.tei < 64)
@@ -1001,8 +1001,8 @@ create_teimgr(struct manager *mgr, struct channel_req *crq)
                        return -EINVAL;
                if (mgr->up) {
                        printk(KERN_WARNING
-                           "%s: only one network manager is allowed\n",
-                           __func__);
+                              "%s: only one network manager is allowed\n",
+                              __func__);
                        return -EBUSY;
                }
        } else if (test_bit(MGR_OPT_USER, &mgr->options)) {
@@ -1017,7 +1017,7 @@ create_teimgr(struct manager *mgr, struct channel_req *crq)
                        test_and_set_bit(MGR_OPT_USER, &mgr->options);
        }
        if (mgr->ch.st->dev->Dprotocols
-         & ((1 << ISDN_P_TE_E1) | (1 << ISDN_P_NT_E1)))
+           & ((1 << ISDN_P_TE_E1) | (1 << ISDN_P_NT_E1)))
                test_and_set_bit(OPTION_L2_PMX, &opt);
        if ((crq->protocol == ISDN_P_LAPD_NT) && (crq->adr.tei == 127)) {
                mgr->up = crq->ch;
@@ -1035,7 +1035,7 @@ create_teimgr(struct manager *mgr, struct channel_req *crq)
                return 0;
        }
        l2 = create_l2(crq->ch, crq->protocol, opt,
-               crq->adr.tei, crq->adr.sapi);
+                      crq->adr.tei, crq->adr.sapi);
        if (!l2)
                return -ENOMEM;
        l2->tm = kzalloc(sizeof(struct teimgr), GFP_KERNEL);
@@ -1084,7 +1084,7 @@ mgr_send(struct mISDNchannel *ch, struct sk_buff *skb)
        mgr = container_of(ch, struct manager, ch);
        if (*debug & DEBUG_L2_RECV)
                printk(KERN_DEBUG "%s: prim(%x) id(%x)\n",
-                   __func__, hh->prim, hh->id);
+                      __func__, hh->prim, hh->id);
        switch (hh->prim) {
        case PH_DATA_IND:
                mISDN_FsmEvent(&mgr->deact, EV_UI, NULL);
@@ -1181,7 +1181,7 @@ check_data(struct manager *mgr, struct sk_buff *skb)
 
        if (*debug & DEBUG_L2_CTRL)
                printk(KERN_DEBUG "%s: prim(%x) id(%x)\n",
-                   __func__, hh->prim, hh->id);
+                      __func__, hh->prim, hh->id);
        if (test_bit(MGR_OPT_USER, &mgr->options))
                return -ENOTCONN;
        if (hh->prim != PH_DATA_IND)
@@ -1201,12 +1201,12 @@ check_data(struct manager *mgr, struct sk_buff *skb)
        /* We got a SABME for a fixed TEI */
        if (*debug & DEBUG_L2_CTRL)
                printk(KERN_DEBUG "%s: SABME sapi(%d) tei(%d)\n",
-                   __func__, sapi, tei);
+                      __func__, sapi, tei);
        l2 = create_new_tei(mgr, tei, sapi);
        if (!l2) {
                if (*debug & DEBUG_L2_CTRL)
                        printk(KERN_DEBUG "%s: failed to create new tei\n",
-                           __func__);
+                              __func__);
                return -ENOMEM;
        }
        ret = l2->ch.send(&l2->ch, skb);
@@ -1285,15 +1285,15 @@ mgr_bcast(struct mISDNchannel *ch, struct sk_buff *skb)
                                if (ret) {
                                        if (*debug & DEBUG_SEND_ERR)
                                                printk(KERN_DEBUG
-                                                   "%s ch%d prim(%x) addr(%x)"
-                                                   " err %d\n",
-                                                   __func__, l2->ch.nr,
-                                                   hh->prim, l2->ch.addr, ret);
+                                                      "%s ch%d prim(%x) addr(%x)"
+                                                      " err %d\n",
+                                                      __func__, l2->ch.nr,
+                                                      hh->prim, l2->ch.addr, ret);
                                } else
                                        cskb = NULL;
                        } else {
                                printk(KERN_WARNING "%s ch%d addr %x no mem\n",
-                                   __func__, ch->nr, ch->addr);
+                                      __func__, ch->nr, ch->addr);
                                goto out;
                        }
                }
index 859c81e..1094667 100644 (file)
@@ -98,13 +98,13 @@ mISDN_read(struct file *filep, char __user *buf, size_t count, loff_t *off)
 
        if (*debug & DEBUG_TIMER)
                printk(KERN_DEBUG "%s(%p, %p, %d, %p)\n", __func__,
-                       filep, buf, (int)count, off);
+                      filep, buf, (int)count, off);
 
        if (list_empty(&dev->expired) && (dev->work == 0)) {
                if (filep->f_flags & O_NONBLOCK)
                        return -EAGAIN;
                wait_event_interruptible(dev->wait, (dev->work ||
-                   !list_empty(&dev->expired)));
+                                                    !list_empty(&dev->expired)));
                if (signal_pending(current))
                        return -ERESTARTSYS;
        }
@@ -141,7 +141,7 @@ mISDN_poll(struct file *filep, poll_table *wait)
                        mask |= (POLLIN | POLLRDNORM);
                if (*debug & DEBUG_TIMER)
                        printk(KERN_DEBUG "%s work(%d) empty(%d)\n", __func__,
-                               dev->work, list_empty(&dev->expired));
+                              dev->work, list_empty(&dev->expired));
        }
        return mask;
 }
@@ -161,7 +161,7 @@ dev_expire_timer(unsigned long data)
 static int
 misdn_add_timer(struct mISDNtimerdev *dev, int timeout)
 {
-       int                     id;
+       int                     id;
        u_long                  flags;
        struct mISDNtimer       *timer;
 
@@ -224,7 +224,7 @@ mISDN_ioctl(struct file *filep, unsigned int cmd, unsigned long arg)
 
        if (*debug & DEBUG_TIMER)
                printk(KERN_DEBUG "%s(%p, %x, %lx)\n", __func__,
-                   filep, cmd, arg);
+                      filep, cmd, arg);
        mutex_lock(&mISDN_mutex);
        switch (cmd) {
        case IMADDTIMER:
@@ -235,7 +235,7 @@ mISDN_ioctl(struct file *filep, unsigned int cmd, unsigned long arg)
                id = misdn_add_timer(dev, tout);
                if (*debug & DEBUG_TIMER)
                        printk(KERN_DEBUG "%s add %d id %d\n", __func__,
-                           tout, id);
+                              tout, id);
                if (id < 0) {
                        ret = id;
                        break;
index 976143b..efb6d6a 100644 (file)
@@ -2,16 +2,16 @@
  * Callbacks for the FSM
  *
  * Copyright (C) 1996 Universidade de Lisboa
- * 
+ *
  * Written by Pedro Roque Marques (roque@di.fc.ul.pt)
  *
- * This software may be used and distributed according to the terms of 
+ * This software may be used and distributed according to the terms of
  * the GNU General Public License, incorporated herein by reference.
  */
 
 /*
  * Fix: 19981230 - Carlos Morgado <chbm@techie.com>
- * Port of Nelson Escravana's <nelson.escravana@usa.net> fix to CalledPN 
+ * Port of Nelson Escravana's <nelson.escravana@usa.net> fix to CalledPN
  * NULL pointer dereference in cb_in_1 (originally fixed in 2.0)
  */
 
@@ -39,86 +39,86 @@ ushort last_ref_num = 1;
  *
  */
 
-void cb_out_1(struct pcbit_dev * dev, struct pcbit_chan* chan, 
-             struct callb_data *cbdata) 
+void cb_out_1(struct pcbit_dev *dev, struct pcbit_chan *chan,
+             struct callb_data *cbdata)
 {
        struct sk_buff *skb;
        int len;
-        ushort refnum;
+       ushort refnum;
 
 
 #ifdef DEBUG
-        printk(KERN_DEBUG "Called Party Number: %s\n", 
-               cbdata->data.setup.CalledPN);
+       printk(KERN_DEBUG "Called Party Number: %s\n",
+              cbdata->data.setup.CalledPN);
 #endif
-        /*
-         * hdr - kmalloc in capi_conn_req
-         *     - kfree   when msg has been sent
-         */
+       /*
+        * hdr - kmalloc in capi_conn_req
+        *     - kfree   when msg has been sent
+        */
 
-        if ((len = capi_conn_req(cbdata->data.setup.CalledPN, &skb, 
+       if ((len = capi_conn_req(cbdata->data.setup.CalledPN, &skb,
                                 chan->proto)) < 0)
-        {
-                printk("capi_conn_req failed\n");
-                return;
-        }
+       {
+               printk("capi_conn_req failed\n");
+               return;
+       }
 
 
-        refnum = last_ref_num++ & 0x7fffU;
+       refnum = last_ref_num++ & 0x7fffU;
 
-        chan->callref = 0;
-        chan->layer2link = 0;
-        chan->snum = 0;
-        chan->s_refnum = refnum;
+       chan->callref = 0;
+       chan->layer2link = 0;
+       chan->snum = 0;
+       chan->s_refnum = refnum;
 
-        pcbit_l2_write(dev, MSG_CONN_REQ, refnum, skb, len);
+       pcbit_l2_write(dev, MSG_CONN_REQ, refnum, skb, len);
 }
 
 /*
  *  rcv CONNECT
  *  will go into ACTIVE state
  *  send CONN_ACTIVE_RESP
- *  send Select protocol request 
+ *  send Select protocol request
  */
 
-void cb_out_2(struct pcbit_dev * dev, struct pcbit_chan* chan, 
-             struct callb_data *data) 
+void cb_out_2(struct pcbit_dev *dev, struct pcbit_chan *chan,
+             struct callb_data *data)
 {
-        isdn_ctrl ictl;
-       struct sk_buff *skb;
+       isdn_ctrl ictl;
+       struct sk_buff *skb;
        int len;
-        ushort refnum;
+       ushort refnum;
 
-        if ((len=capi_conn_active_resp(chan, &skb)) < 0)
-        {
-                printk("capi_conn_active_req failed\n");
-                return;
-        }
+       if ((len = capi_conn_active_resp(chan, &skb)) < 0)
+       {
+               printk("capi_conn_active_req failed\n");
+               return;
+       }
 
-        refnum = last_ref_num++ & 0x7fffU;
-        chan->s_refnum = refnum;
+       refnum = last_ref_num++ & 0x7fffU;
+       chan->s_refnum = refnum;
 
-        pcbit_l2_write(dev, MSG_CONN_ACTV_RESP, refnum, skb, len);
+       pcbit_l2_write(dev, MSG_CONN_ACTV_RESP, refnum, skb, len);
 
 
-        ictl.command = ISDN_STAT_DCONN;
-        ictl.driver=dev->id;
-        ictl.arg=chan->id;
-        dev->dev_if->statcallb(&ictl);
+       ictl.command = ISDN_STAT_DCONN;
+       ictl.driver = dev->id;
+       ictl.arg = chan->id;
+       dev->dev_if->statcallb(&ictl);
 
-        /* ACTIVE D-channel */
+       /* ACTIVE D-channel */
 
-        /* Select protocol  */
+       /* Select protocol  */
 
-        if ((len=capi_select_proto_req(chan, &skb, 1 /*outgoing*/)) < 0) { 
-                printk("capi_select_proto_req failed\n");
-                return;
-        }
+       if ((len = capi_select_proto_req(chan, &skb, 1 /*outgoing*/)) < 0) {
+               printk("capi_select_proto_req failed\n");
+               return;
+       }
 
-        refnum = last_ref_num++ & 0x7fffU;
-        chan->s_refnum = refnum;
+       refnum = last_ref_num++ & 0x7fffU;
+       chan->s_refnum = refnum;
 
-        pcbit_l2_write(dev, MSG_SELP_REQ, refnum, skb, len);
+       pcbit_l2_write(dev, MSG_SELP_REQ, refnum, skb, len);
 }
 
 
@@ -127,22 +127,22 @@ void cb_out_2(struct pcbit_dev * dev, struct pcbit_chan* chan,
  * inform user
  */
 
-void cb_in_1(struct pcbit_dev * dev, struct pcbit_chan* chan,
-            struct callb_data *cbdata) 
+void cb_in_1(struct pcbit_dev *dev, struct pcbit_chan *chan,
+            struct callb_data *cbdata)
 {
-        isdn_ctrl ictl;
-        unsigned short refnum;
-       struct sk_buff *skb;
+       isdn_ctrl ictl;
+       unsigned short refnum;
+       struct sk_buff *skb;
        int len;
 
 
-        ictl.command = ISDN_STAT_ICALL;
-        ictl.driver=dev->id;
-        ictl.arg=chan->id;
-        
-        /*
-         *  ictl.num >= strlen() + strlen() + 5
-         */
+       ictl.command = ISDN_STAT_ICALL;
+       ictl.driver = dev->id;
+       ictl.arg = chan->id;
+
+       /*
+        *  ictl.num >= strlen() + strlen() + 5
+        */
 
        if (cbdata->data.setup.CallingPN == NULL) {
                printk(KERN_DEBUG "NULL CallingPN to phone; using 0\n");
@@ -167,18 +167,18 @@ void cb_in_1(struct pcbit_dev * dev, struct pcbit_chan* chan,
        printk(KERN_DEBUG "statstr: %s\n", ictl.num);
 #endif
 
-        dev->dev_if->statcallb(&ictl);
+       dev->dev_if->statcallb(&ictl);
+
 
-        
-        if ((len=capi_conn_resp(chan, &skb)) < 0) {
-                printk(KERN_DEBUG "capi_conn_resp failed\n");
-                return;
+       if ((len = capi_conn_resp(chan, &skb)) < 0) {
+               printk(KERN_DEBUG "capi_conn_resp failed\n");
+               return;
        }
 
-        refnum = last_ref_num++ & 0x7fffU;
-        chan->s_refnum = refnum;
+       refnum = last_ref_num++ & 0x7fffU;
+       chan->s_refnum = refnum;
 
-        pcbit_l2_write(dev, MSG_CONN_RESP, refnum, skb, len);
+       pcbit_l2_write(dev, MSG_CONN_RESP, refnum, skb, len);
 }
 
 /*
@@ -187,24 +187,24 @@ void cb_in_1(struct pcbit_dev * dev, struct pcbit_chan* chan,
  * send CONNECT message CONNECT_ACTIVE_REQ in CAPI
  */
 
-void cb_in_2(struct pcbit_dev * dev, struct pcbit_chan* chan,
+void cb_in_2(struct pcbit_dev *dev, struct pcbit_chan *chan,
             struct callb_data *data)
 {
-        unsigned short refnum;
+       unsigned short refnum;
        struct sk_buff *skb;
-        int len;
-        
-        if ((len = capi_conn_active_req(chan, &skb)) < 0) {        
-                printk(KERN_DEBUG "capi_conn_active_req failed\n");
-                return;
-        }
+       int len;
+
+       if ((len = capi_conn_active_req(chan, &skb)) < 0) {
+               printk(KERN_DEBUG "capi_conn_active_req failed\n");
+               return;
+       }
 
 
-        refnum = last_ref_num++ & 0x7fffU;
-        chan->s_refnum = refnum;
+       refnum = last_ref_num++ & 0x7fffU;
+       chan->s_refnum = refnum;
 
        printk(KERN_DEBUG "sending MSG_CONN_ACTV_REQ\n");
-        pcbit_l2_write(dev, MSG_CONN_ACTV_REQ, refnum, skb, len);
+       pcbit_l2_write(dev, MSG_CONN_ACTV_REQ, refnum, skb, len);
 }
 
 /*
@@ -213,23 +213,23 @@ void cb_in_2(struct pcbit_dev * dev, struct pcbit_chan* chan,
  *
  */
 
-void cb_in_3(struct pcbit_dev * dev, struct pcbit_chan* chan, 
+void cb_in_3(struct pcbit_dev *dev, struct pcbit_chan *chan,
             struct callb_data *data)
 {
-        unsigned short refnum;
-       struct sk_buff *skb;
+       unsigned short refnum;
+       struct sk_buff *skb;
        int len;
-        
-        if ((len = capi_select_proto_req(chan, &skb, 0 /*incoming*/)) < 0)
-        {
-                printk("capi_select_proto_req failed\n");
-                return;
-        }
 
-        refnum = last_ref_num++ & 0x7fffU;
-        chan->s_refnum = refnum;
+       if ((len = capi_select_proto_req(chan, &skb, 0 /*incoming*/)) < 0)
+       {
+               printk("capi_select_proto_req failed\n");
+               return;
+       }
+
+       refnum = last_ref_num++ & 0x7fffU;
+       chan->s_refnum = refnum;
 
-        pcbit_l2_write(dev, MSG_SELP_REQ, refnum, skb, len);
+       pcbit_l2_write(dev, MSG_SELP_REQ, refnum, skb, len);
 
 }
 
@@ -239,52 +239,52 @@ void cb_in_3(struct pcbit_dev * dev, struct pcbit_chan* chan,
  * send disconnect resp
  * send msg to user
  */
-void cb_disc_1(struct pcbit_dev * dev, struct pcbit_chan* chan, 
+void cb_disc_1(struct pcbit_dev *dev, struct pcbit_chan *chan,
               struct callb_data *data)
 {
-       struct sk_buff *skb;
+       struct sk_buff *skb;
        int len;
-        ushort refnum;
-        isdn_ctrl ictl;
-  
-        if ((len = capi_disc_resp(chan, &skb)) < 0) {
-                printk("capi_disc_resp failed\n");
-                return;
-        }
-
-        refnum = last_ref_num++ & 0x7fffU;
-        chan->s_refnum = refnum;
-
-        pcbit_l2_write(dev, MSG_DISC_RESP, refnum, skb, len);    
-
-        ictl.command = ISDN_STAT_BHUP;
-        ictl.driver=dev->id;
-        ictl.arg=chan->id;
-        dev->dev_if->statcallb(&ictl);
+       ushort refnum;
+       isdn_ctrl ictl;
+
+       if ((len = capi_disc_resp(chan, &skb)) < 0) {
+               printk("capi_disc_resp failed\n");
+               return;
+       }
+
+       refnum = last_ref_num++ & 0x7fffU;
+       chan->s_refnum = refnum;
+
+       pcbit_l2_write(dev, MSG_DISC_RESP, refnum, skb, len);
+
+       ictl.command = ISDN_STAT_BHUP;
+       ictl.driver = dev->id;
+       ictl.arg = chan->id;
+       dev->dev_if->statcallb(&ictl);
 }
 
-        
+
 /*
  *  User HANGUP on active/call proceeding state
  *  send disc.req
  */
-void cb_disc_2(struct pcbit_dev * dev, struct pcbit_chan* chan, 
+void cb_disc_2(struct pcbit_dev *dev, struct pcbit_chan *chan,
               struct callb_data *data)
 {
-       struct sk_buff *skb;
+       struct sk_buff *skb;
        int len;
-        ushort refnum;
+       ushort refnum;
 
-        if ((len = capi_disc_req(chan->callref, &skb, CAUSE_NORMAL)) < 0)
-        {
-                printk("capi_disc_req failed\n");
-                return;
-        }
+       if ((len = capi_disc_req(chan->callref, &skb, CAUSE_NORMAL)) < 0)
+       {
+               printk("capi_disc_req failed\n");
+               return;
+       }
 
-        refnum = last_ref_num++ & 0x7fffU;
-        chan->s_refnum = refnum;
+       refnum = last_ref_num++ & 0x7fffU;
+       chan->s_refnum = refnum;
 
-        pcbit_l2_write(dev, MSG_DISC_REQ, refnum, skb, len);  
+       pcbit_l2_write(dev, MSG_DISC_REQ, refnum, skb, len);
 }
 
 /*
@@ -292,18 +292,18 @@ void cb_disc_2(struct pcbit_dev * dev, struct pcbit_chan* chan,
  *  Problem: when the HL driver sends the disc req itself
  *           LL receives BHUP
  */
-void cb_disc_3(struct pcbit_dev * dev, struct pcbit_chan* chan, 
+void cb_disc_3(struct pcbit_dev *dev, struct pcbit_chan *chan,
               struct callb_data *data)
 {
-        isdn_ctrl ictl;
+       isdn_ctrl ictl;
 
-        ictl.command = ISDN_STAT_BHUP;
-        ictl.driver=dev->id;
-        ictl.arg=chan->id;
-        dev->dev_if->statcallb(&ictl);
+       ictl.command = ISDN_STAT_BHUP;
+       ictl.driver = dev->id;
+       ictl.arg = chan->id;
+       dev->dev_if->statcallb(&ictl);
 }
 
-void cb_notdone(struct pcbit_dev * dev, struct pcbit_chan* chan, 
+void cb_notdone(struct pcbit_dev *dev, struct pcbit_chan *chan,
                struct callb_data *data)
 {
 }
@@ -311,38 +311,35 @@ void cb_notdone(struct pcbit_dev * dev, struct pcbit_chan* chan,
 /*
  * send activate b-chan protocol
  */
-void cb_selp_1(struct pcbit_dev * dev, struct pcbit_chan* chan, 
-              struct callb_data *data) 
+void cb_selp_1(struct pcbit_dev *dev, struct pcbit_chan *chan,
+              struct callb_data *data)
 {
-       struct sk_buff *skb;
+       struct sk_buff *skb;
        int len;
-        ushort refnum;
+       ushort refnum;
 
-        if ((len = capi_activate_transp_req(chan, &skb)) < 0)
-        {
-                printk("capi_conn_activate_transp_req failed\n");
-                return;
-        }
+       if ((len = capi_activate_transp_req(chan, &skb)) < 0)
+       {
+               printk("capi_conn_activate_transp_req failed\n");
+               return;
+       }
 
-        refnum = last_ref_num++ & 0x7fffU;
-        chan->s_refnum = refnum;
+       refnum = last_ref_num++ & 0x7fffU;
+       chan->s_refnum = refnum;
 
-        pcbit_l2_write(dev, MSG_ACT_TRANSP_REQ, refnum, skb, len);
+       pcbit_l2_write(dev, MSG_ACT_TRANSP_REQ, refnum, skb, len);
 }
 
 /*
  *  Inform User that the B-channel is available
  */
-void cb_open(struct pcbit_dev * dev, struct pcbit_chan* chan, 
-            struct callb_data *data) 
+void cb_open(struct pcbit_dev *dev, struct pcbit_chan *chan,
+            struct callb_data *data)
 {
-        isdn_ctrl ictl;
+       isdn_ctrl ictl;
 
-        ictl.command = ISDN_STAT_BCONN;
-        ictl.driver=dev->id;
-        ictl.arg=chan->id;
-        dev->dev_if->statcallb(&ictl);
+       ictl.command = ISDN_STAT_BCONN;
+       ictl.driver = dev->id;
+       ictl.arg = chan->id;
+       dev->dev_if->statcallb(&ictl);
 }
-
-
-
index 17aa0f5..a036b4a 100644 (file)
@@ -2,10 +2,10 @@
  * Callbacks prototypes for FSM
  *
  * Copyright (C) 1996 Universidade de Lisboa
- * 
+ *
  * Written by Pedro Roque Marques (roque@di.fc.ul.pt)
  *
- * This software may be used and distributed according to the terms of 
+ * This software may be used and distributed according to the terms of
  * the GNU General Public License, incorporated herein by reference.
  */
 
 #define CALLBACKS_H
 
 
-extern void cb_out_1(struct pcbit_dev * dev, struct pcbit_chan* chan, 
+extern void cb_out_1(struct pcbit_dev *dev, struct pcbit_chan *chan,
                     struct callb_data *data);
 
-extern void cb_out_2(struct pcbit_dev * dev, struct pcbit_chan* chan, 
+extern void cb_out_2(struct pcbit_dev *dev, struct pcbit_chan *chan,
                     struct callb_data *data);
 
-extern void cb_in_1(struct pcbit_dev * dev, struct pcbit_chan* chan, 
+extern void cb_in_1(struct pcbit_dev *dev, struct pcbit_chan *chan,
                    struct callb_data *data);
-extern void cb_in_2(struct pcbit_dev * dev, struct pcbit_chan* chan, 
+extern void cb_in_2(struct pcbit_dev *dev, struct pcbit_chan *chan,
                    struct callb_data *data);
-extern void cb_in_3(struct pcbit_dev * dev, struct pcbit_chan* chan, 
+extern void cb_in_3(struct pcbit_dev *dev, struct pcbit_chan *chan,
                    struct callb_data *data);
 
-extern void cb_disc_1(struct pcbit_dev * dev, struct pcbit_chan* chan, 
+extern void cb_disc_1(struct pcbit_dev *dev, struct pcbit_chan *chan,
                      struct callb_data *data);
-extern void cb_disc_2(struct pcbit_dev * dev, struct pcbit_chan* chan, 
+extern void cb_disc_2(struct pcbit_dev *dev, struct pcbit_chan *chan,
                      struct callb_data *data);
-extern void cb_disc_3(struct pcbit_dev * dev, struct pcbit_chan* chan, 
+extern void cb_disc_3(struct pcbit_dev *dev, struct pcbit_chan *chan,
                      struct callb_data *data);
 
-extern void cb_notdone(struct pcbit_dev * dev, struct pcbit_chan* chan, 
+extern void cb_notdone(struct pcbit_dev *dev, struct pcbit_chan *chan,
                       struct callb_data *data);
 
-extern void cb_selp_1(struct pcbit_dev * dev, struct pcbit_chan* chan, 
+extern void cb_selp_1(struct pcbit_dev *dev, struct pcbit_chan *chan,
                      struct callb_data *data);
-extern void cb_open(struct pcbit_dev * dev, struct pcbit_chan* chan, 
+extern void cb_open(struct pcbit_dev *dev, struct pcbit_chan *chan,
                    struct callb_data *data);
 
 #endif
-
-
index ac5a91c..4e3cbf8 100644 (file)
@@ -3,10 +3,10 @@
  * Portugal Telecom CAPI 2.0
  *
  * Copyright (C) 1996 Universidade de Lisboa
- * 
+ *
  * Written by Pedro Roque Marques (roque@di.fc.ul.pt)
  *
- * This software may be used and distributed according to the terms of 
+ * This software may be used and distributed according to the terms of
  * the GNU General Public License, incorporated herein by reference.
  *
  * Not compatible with the AVM Gmbh. CAPI 2.0
  *
  */
 
-int capi_conn_req(const char * calledPN, struct sk_buff **skb, int proto)
+int capi_conn_req(const char *calledPN, struct sk_buff **skb, int proto)
 {
-        ushort len;
-
-        /*
-         * length
-         *   AppInfoMask - 2
-         *   BC0         - 3
-         *   BC1         - 1
-         *   Chan        - 2
-         *   Keypad      - 1
-         *   CPN         - 1
-         *   CPSA        - 1
-         *   CalledPN    - 2 + strlen
-         *   CalledPSA   - 1
-         *   rest...     - 4
-         *   ----------------
-         *   Total        18 + strlen
-         */
-
-        len = 18 + strlen(calledPN);
+       ushort len;
+
+       /*
+        * length
+        *   AppInfoMask - 2
+        *   BC0         - 3
+        *   BC1         - 1
+        *   Chan        - 2
+        *   Keypad      - 1
+        *   CPN         - 1
+        *   CPSA        - 1
+        *   CalledPN    - 2 + strlen
+        *   CalledPSA   - 1
+        *   rest...     - 4
+        *   ----------------
+        *   Total        18 + strlen
+        */
+
+       len = 18 + strlen(calledPN);
 
        if (proto == ISDN_PROTO_L2_TRANS)
                len++;
 
        if ((*skb = dev_alloc_skb(len)) == NULL) {
-    
-               printk(KERN_WARNING "capi_conn_req: alloc_skb failed\n");
+
+               printk(KERN_WARNING "capi_conn_req: alloc_skb failed\n");
                return -1;
        }
 
-        /* InfoElmMask */
-        *((ushort*) skb_put(*skb, 2)) = AppInfoMask; 
+       /* InfoElmMask */
+       *((ushort *)skb_put(*skb, 2)) = AppInfoMask;
 
        if (proto == ISDN_PROTO_L2_TRANS)
        {
@@ -101,162 +101,162 @@ int capi_conn_req(const char * calledPN, struct sk_buff **skb, int proto)
                *(skb_put(*skb, 1)) = 0x90;     /* BC0.Octect4          */
        }
 
-        /* Bearer Capability - Optional*/
-        *(skb_put(*skb, 1)) = 0;        /* BC1.Length = 0                    */
+       /* Bearer Capability - Optional*/
+       *(skb_put(*skb, 1)) = 0;        /* BC1.Length = 0                    */
 
-        *(skb_put(*skb, 1)) = 1;        /* ChannelID.Length = 1              */
-        *(skb_put(*skb, 1)) = 0x83;     /* Basic Interface - Any Channel     */
+       *(skb_put(*skb, 1)) = 1;        /* ChannelID.Length = 1              */
+       *(skb_put(*skb, 1)) = 0x83;     /* Basic Interface - Any Channel     */
 
-        *(skb_put(*skb, 1)) = 0;        /* Keypad.Length = 0                 */
-                  
+       *(skb_put(*skb, 1)) = 0;        /* Keypad.Length = 0                 */
 
-        *(skb_put(*skb, 1)) = 0;        /* CallingPN.Length = 0              */
-        *(skb_put(*skb, 1)) = 0;        /* CallingPSA.Length = 0             */
 
-        /* Called Party Number */
-        *(skb_put(*skb, 1)) = strlen(calledPN) + 1;
-        *(skb_put(*skb, 1)) = 0x81;
-        memcpy(skb_put(*skb, strlen(calledPN)), calledPN, strlen(calledPN));
+       *(skb_put(*skb, 1)) = 0;        /* CallingPN.Length = 0              */
+       *(skb_put(*skb, 1)) = 0;        /* CallingPSA.Length = 0             */
 
-        /* '#' */
+       /* Called Party Number */
+       *(skb_put(*skb, 1)) = strlen(calledPN) + 1;
+       *(skb_put(*skb, 1)) = 0x81;
+       memcpy(skb_put(*skb, strlen(calledPN)), calledPN, strlen(calledPN));
 
-        *(skb_put(*skb, 1)) = 0;       /* CalledPSA.Length = 0     */
+       /* '#' */
 
-        /* LLC.Length  = 0; */
-        /* HLC0.Length = 0; */
-        /* HLC1.Length = 0; */ 
-        /* UTUS.Length = 0; */
-        memset(skb_put(*skb, 4), 0, 4);
+       *(skb_put(*skb, 1)) = 0;       /* CalledPSA.Length = 0     */
 
-        return len;
+       /* LLC.Length  = 0; */
+       /* HLC0.Length = 0; */
+       /* HLC1.Length = 0; */
+       /* UTUS.Length = 0; */
+       memset(skb_put(*skb, 4), 0, 4);
+
+       return len;
 }
 
-int capi_conn_resp(struct pcbit_chan* chan, struct sk_buff **skb)
+int capi_conn_resp(struct pcbit_chan *chan, struct sk_buff **skb)
 {
-        
+
        if ((*skb = dev_alloc_skb(5)) == NULL) {
-    
+
                printk(KERN_WARNING "capi_conn_resp: alloc_skb failed\n");
                return -1;
        }
 
-        *((ushort*) skb_put(*skb, 2) ) = chan->callref;  
-        *(skb_put(*skb, 1)) = 0x01;  /* ACCEPT_CALL */
-        *(skb_put(*skb, 1)) = 0;
-        *(skb_put(*skb, 1)) = 0;
+       *((ushort *)skb_put(*skb, 2)) = chan->callref;
+       *(skb_put(*skb, 1)) = 0x01;  /* ACCEPT_CALL */
+       *(skb_put(*skb, 1)) = 0;
+       *(skb_put(*skb, 1)) = 0;
 
-        return 5;
+       return 5;
 }
 
-int capi_conn_active_req(struct pcbit_chan* chan, struct sk_buff **skb)
+int capi_conn_active_req(struct pcbit_chan *chan, struct sk_buff **skb)
 {
-        /*
-         * 8 bytes
-         */
-        
+       /*
+        * 8 bytes
+        */
+
        if ((*skb = dev_alloc_skb(8)) == NULL) {
-    
+
                printk(KERN_WARNING "capi_conn_active_req: alloc_skb failed\n");
                return -1;
        }
 
-        *((ushort*) skb_put(*skb, 2) ) = chan->callref;  
+       *((ushort *)skb_put(*skb, 2)) = chan->callref;
 
 #ifdef DEBUG
-       printk(KERN_DEBUG "Call Reference: %04x\n", chan->callref); 
+       printk(KERN_DEBUG "Call Reference: %04x\n", chan->callref);
 #endif
 
-        *(skb_put(*skb, 1)) = 0;       /*  BC.Length = 0;          */
-        *(skb_put(*skb, 1)) = 0;       /*  ConnectedPN.Length = 0  */
-        *(skb_put(*skb, 1)) = 0;       /*  PSA.Length              */
-        *(skb_put(*skb, 1)) = 0;       /*  LLC.Length = 0;         */
-        *(skb_put(*skb, 1)) = 0;       /*  HLC.Length = 0;         */
-        *(skb_put(*skb, 1)) = 0;       /*  UTUS.Length = 0;        */
+       *(skb_put(*skb, 1)) = 0;       /*  BC.Length = 0;          */
+       *(skb_put(*skb, 1)) = 0;       /*  ConnectedPN.Length = 0  */
+       *(skb_put(*skb, 1)) = 0;       /*  PSA.Length              */
+       *(skb_put(*skb, 1)) = 0;       /*  LLC.Length = 0;         */
+       *(skb_put(*skb, 1)) = 0;       /*  HLC.Length = 0;         */
+       *(skb_put(*skb, 1)) = 0;       /*  UTUS.Length = 0;        */
 
        return 8;
 }
 
-int capi_conn_active_resp(struct pcbit_chan* chan, struct sk_buff **skb)
+int capi_conn_active_resp(struct pcbit_chan *chan, struct sk_buff **skb)
 {
-        /*
-         * 2 bytes
-         */
-  
+       /*
+        * 2 bytes
+        */
+
        if ((*skb = dev_alloc_skb(2)) == NULL) {
-    
+
                printk(KERN_WARNING "capi_conn_active_resp: alloc_skb failed\n");
                return -1;
        }
 
-        *((ushort*) skb_put(*skb, 2) ) = chan->callref;  
+       *((ushort *)skb_put(*skb, 2)) = chan->callref;
 
-        return 2;
+       return 2;
 }
 
 
-int capi_select_proto_req(struct pcbit_chan *chan, struct sk_buff **skb, 
-                          int outgoing)
+int capi_select_proto_req(struct pcbit_chan *chan, struct sk_buff **skb,
+                         int outgoing)
 {
 
-        /*
-         * 18 bytes
-         */
+       /*
+        * 18 bytes
+        */
 
        if ((*skb = dev_alloc_skb(18)) == NULL) {
-    
+
                printk(KERN_WARNING "capi_select_proto_req: alloc_skb failed\n");
                return -1;
        }
 
-        *((ushort*) skb_put(*skb, 2) ) = chan->callref;  
+       *((ushort *)skb_put(*skb, 2)) = chan->callref;
 
-        /* Layer2 protocol */
+       /* Layer2 protocol */
 
-        switch (chan->proto) {
-        case ISDN_PROTO_L2_X75I: 
-                *(skb_put(*skb, 1)) = 0x05;            /* LAPB */
-                break;
-        case ISDN_PROTO_L2_HDLC:
-                *(skb_put(*skb, 1)) = 0x02;
-                break;
+       switch (chan->proto) {
+       case ISDN_PROTO_L2_X75I:
+               *(skb_put(*skb, 1)) = 0x05;            /* LAPB */
+               break;
+       case ISDN_PROTO_L2_HDLC:
+               *(skb_put(*skb, 1)) = 0x02;
+               break;
        case ISDN_PROTO_L2_TRANS:
-               /* 
+               /*
                 *      Voice (a-law)
                 */
                *(skb_put(*skb, 1)) = 0x06;
                break;
-        default:
-#ifdef DEBUG 
-                printk(KERN_DEBUG "Transparent\n");
+       default:
+#ifdef DEBUG
+               printk(KERN_DEBUG "Transparent\n");
 #endif
-                *(skb_put(*skb, 1)) = 0x03;
-                break;
-        }
-
-        *(skb_put(*skb, 1)) = (outgoing ? 0x02 : 0x42);    /* Don't ask */
-        *(skb_put(*skb, 1)) = 0x00;
-  
-        *((ushort *) skb_put(*skb, 2)) = MRU;
-
-        *(skb_put(*skb, 1)) = 0x08;           /* Modulo */
-        *(skb_put(*skb, 1)) = 0x07;           /* Max Window */
-  
-        *(skb_put(*skb, 1)) = 0x01;           /* No Layer3 Protocol */
-
-        /*
-         * 2 - layer3 MTU       [10]
-         *   - Modulo           [12]
-         *   - Window           
-         *   - layer1 proto     [14]
-         *   - bitrate
-         *   - sub-channel      [16]
-         *   - layer1dataformat [17]
-         */
-
-        memset(skb_put(*skb, 8), 0, 8);
-
-        return 18;
+               *(skb_put(*skb, 1)) = 0x03;
+               break;
+       }
+
+       *(skb_put(*skb, 1)) = (outgoing ? 0x02 : 0x42);    /* Don't ask */
+       *(skb_put(*skb, 1)) = 0x00;
+
+       *((ushort *) skb_put(*skb, 2)) = MRU;
+
+
+       *(skb_put(*skb, 1)) = 0x08;           /* Modulo */
+       *(skb_put(*skb, 1)) = 0x07;           /* Max Window */
+
+       *(skb_put(*skb, 1)) = 0x01;           /* No Layer3 Protocol */
+
+       /*
+        * 2 - layer3 MTU       [10]
+        *   - Modulo           [12]
+        *   - Window
+        *   - layer1 proto     [14]
+        *   - bitrate
+        *   - sub-channel      [16]
+        *   - layer1dataformat [17]
+        */
+
+       memset(skb_put(*skb, 8), 0, 8);
+
+       return 18;
 }
 
 
@@ -264,45 +264,45 @@ int capi_activate_transp_req(struct pcbit_chan *chan, struct sk_buff **skb)
 {
 
        if ((*skb = dev_alloc_skb(7)) == NULL) {
-    
+
                printk(KERN_WARNING "capi_activate_transp_req: alloc_skb failed\n");
                return -1;
        }
 
-        *((ushort*) skb_put(*skb, 2) ) = chan->callref;  
+       *((ushort *)skb_put(*skb, 2)) = chan->callref;
 
-        
-        *(skb_put(*skb, 1)) = chan->layer2link; /* Layer2 id */
-        *(skb_put(*skb, 1)) = 0x00;             /* Transmit by default */
 
-        *((ushort *) skb_put(*skb, 2)) = MRU;
+       *(skb_put(*skb, 1)) = chan->layer2link; /* Layer2 id */
+       *(skb_put(*skb, 1)) = 0x00;             /* Transmit by default */
 
-        *(skb_put(*skb, 1)) = 0x01;             /* Enables reception*/
+       *((ushort *) skb_put(*skb, 2)) = MRU;
 
-        return 7;
+       *(skb_put(*skb, 1)) = 0x01;             /* Enables reception*/
+
+       return 7;
 }
 
-int capi_tdata_req(struct pcbit_chan* chan, struct sk_buff *skb)
+int capi_tdata_req(struct pcbit_chan *chan, struct sk_buff *skb)
 {
        ushort data_len;
-       
 
-       /*  
-        * callref      - 2  
+
+       /*
+        * callref      - 2
         * layer2link   - 1
-        * wBlockLength - 2 
+        * wBlockLength - 2
         * data         - 4
         * sernum       - 1
         */
-       
+
        data_len = skb->len;
 
-       if(skb_headroom(skb) < 10)
+       if (skb_headroom(skb) < 10)
        {
                printk(KERN_CRIT "No headspace (%u) on headroom %p for capi header\n", skb_headroom(skb), skb);
        }
        else
-       {       
+       {
                skb_push(skb, 10);
        }
 
@@ -318,58 +318,58 @@ int capi_tdata_req(struct pcbit_chan* chan, struct sk_buff *skb)
        return 10;
 }
 
-int capi_tdata_resp(struct pcbit_chan *chan, struct sk_buff ** skb)
-                   
+int capi_tdata_resp(struct pcbit_chan *chan, struct sk_buff **skb)
+
 {
        if ((*skb = dev_alloc_skb(4)) == NULL) {
-    
+
                printk(KERN_WARNING "capi_tdata_resp: alloc_skb failed\n");
                return -1;
        }
 
-        *((ushort*) skb_put(*skb, 2) ) = chan->callref;  
+       *((ushort *)skb_put(*skb, 2)) = chan->callref;
 
-        *(skb_put(*skb, 1)) = chan->layer2link;
-        *(skb_put(*skb, 1)) = chan->r_refnum;
+       *(skb_put(*skb, 1)) = chan->layer2link;
+       *(skb_put(*skb, 1)) = chan->r_refnum;
 
-        return (*skb)->len;
+       return (*skb)->len;
 }
 
 int capi_disc_req(ushort callref, struct sk_buff **skb, u_char cause)
 {
 
        if ((*skb = dev_alloc_skb(6)) == NULL) {
-    
+
                printk(KERN_WARNING "capi_disc_req: alloc_skb failed\n");
                return -1;
        }
 
-        *((ushort*) skb_put(*skb, 2) ) = callref;  
+       *((ushort *)skb_put(*skb, 2)) = callref;
 
-        *(skb_put(*skb, 1)) = 2;                  /* Cause.Length = 2; */
-        *(skb_put(*skb, 1)) = 0x80;
-        *(skb_put(*skb, 1)) = 0x80 | cause;           
+       *(skb_put(*skb, 1)) = 2;                  /* Cause.Length = 2; */
+       *(skb_put(*skb, 1)) = 0x80;
+       *(skb_put(*skb, 1)) = 0x80 | cause;
 
-        /* 
-         * Change it: we should send 'Sic transit gloria Mundi' here ;-) 
-         */
+       /*
+        * Change it: we should send 'Sic transit gloria Mundi' here ;-)
+        */
 
-        *(skb_put(*skb, 1)) = 0;                   /* UTUS.Length = 0;  */
+       *(skb_put(*skb, 1)) = 0;                   /* UTUS.Length = 0;  */
 
-        return 6;
+       return 6;
 }
 
 int capi_disc_resp(struct pcbit_chan *chan, struct sk_buff **skb)
 {
        if ((*skb = dev_alloc_skb(2)) == NULL) {
-    
+
                printk(KERN_WARNING "capi_disc_resp: alloc_skb failed\n");
                return -1;
        }
 
-        *((ushort*) skb_put(*skb, 2)) = chan->callref;  
+       *((ushort *)skb_put(*skb, 2)) = chan->callref;
 
-        return 2;
+       return 2;
 }
 
 
@@ -378,57 +378,57 @@ int capi_disc_resp(struct pcbit_chan *chan, struct sk_buff **skb)
  *
  */
 
-int capi_decode_conn_ind(struct pcbit_chan * chan, 
-                         struct sk_buff *skb,
-                         struct callb_data *info) 
+int capi_decode_conn_ind(struct pcbit_chan *chan,
+                        struct sk_buff *skb,
+                        struct callb_data *info)
 {
-        int CIlen, len;
+       int CIlen, len;
 
-        /* Call Reference [CAPI] */
-        chan->callref = *((ushort*) skb->data);
-        skb_pull(skb, 2);
+       /* Call Reference [CAPI] */
+       chan->callref = *((ushort *)skb->data);
+       skb_pull(skb, 2);
 
 #ifdef DEBUG
-       printk(KERN_DEBUG "Call Reference: %04x\n", chan->callref); 
+       printk(KERN_DEBUG "Call Reference: %04x\n", chan->callref);
 #endif
 
-        /* Channel Identification */
+       /* Channel Identification */
 
-        /* Expect  
-           Len = 1 
-           Octect 3 = 0100 10CC - [ 7 Basic, 4 , 2-1 chan ]
-           */
+       /* Expect
+          Len = 1
+          Octect 3 = 0100 10CC - [ 7 Basic, 4 , 2-1 chan ]
+       */
 
-        CIlen = skb->data[0];
+       CIlen = skb->data[0];
 #ifdef DEBUG
-        if (CIlen == 1) {
+       if (CIlen == 1) {
 
-                if ( ((skb->data[1]) & 0xFC) == 0x48 )
-                        printk(KERN_DEBUG "decode_conn_ind: chan ok\n");
-                printk(KERN_DEBUG "phyChan = %d\n", skb->data[1] & 0x03); 
-        }
+               if (((skb->data[1]) & 0xFC) == 0x48)
+                       printk(KERN_DEBUG "decode_conn_ind: chan ok\n");
+               printk(KERN_DEBUG "phyChan = %d\n", skb->data[1] & 0x03);
+       }
        else
                printk(KERN_DEBUG "conn_ind: CIlen = %d\n", CIlen);
 #endif
-        skb_pull(skb, CIlen + 1);
+       skb_pull(skb, CIlen + 1);
 
-        /* Calling Party Number */
-        /* An "additional service" as far as Portugal Telecom is concerned */
+       /* Calling Party Number */
+       /* An "additional service" as far as Portugal Telecom is concerned */
 
-        len = skb->data[0];
+       len = skb->data[0];
 
        if (len > 0) {
                int count = 1;
-               
+
 #ifdef DEBUG
                printk(KERN_DEBUG "CPN: Octect 3 %02x\n", skb->data[1]);
 #endif
                if ((skb->data[1] & 0x80) == 0)
                        count = 2;
-               
+
                if (!(info->data.setup.CallingPN = kmalloc(len - count + 1, GFP_ATOMIC)))
                        return -1;
-       
+
                skb_copy_from_linear_data_offset(skb, count + 1,
                                                 info->data.setup.CallingPN,
                                                 len - count);
@@ -442,22 +442,22 @@ int capi_decode_conn_ind(struct pcbit_chan * chan,
 
        skb_pull(skb, len + 1);
 
-        /* Calling Party Subaddress */
-        skb_pull(skb, skb->data[0] + 1);
+       /* Calling Party Subaddress */
+       skb_pull(skb, skb->data[0] + 1);
 
-        /* Called Party Number */
+       /* Called Party Number */
 
-        len = skb->data[0];
+       len = skb->data[0];
 
        if (len > 0) {
                int count = 1;
-               
+
                if ((skb->data[1] & 0x80) == 0)
                        count = 2;
-        
+
                if (!(info->data.setup.CalledPN = kmalloc(len - count + 1, GFP_ATOMIC)))
                        return -1;
-        
+
                skb_copy_from_linear_data_offset(skb, count + 1,
                                                 info->data.setup.CalledPN,
                                                 len - count);
@@ -471,73 +471,73 @@ int capi_decode_conn_ind(struct pcbit_chan * chan,
 
        skb_pull(skb, len + 1);
 
-        /* Called Party Subaddress */
-        skb_pull(skb, skb->data[0] + 1);
+       /* Called Party Subaddress */
+       skb_pull(skb, skb->data[0] + 1);
 
-        /* LLC */
-        skb_pull(skb, skb->data[0] + 1);
+       /* LLC */
+       skb_pull(skb, skb->data[0] + 1);
 
-        /* HLC */
-        skb_pull(skb, skb->data[0] + 1);
+       /* HLC */
+       skb_pull(skb, skb->data[0] + 1);
 
-        /* U2U */
-        skb_pull(skb, skb->data[0] + 1);
+       /* U2U */
+       skb_pull(skb, skb->data[0] + 1);
 
-        return 0;
+       return 0;
 }
 
 /*
  *  returns errcode
  */
 
-int capi_decode_conn_conf(struct pcbit_chan * chan, struct sk_buff *skb,
-                         int *complete) 
+int capi_decode_conn_conf(struct pcbit_chan *chan, struct sk_buff *skb,
+                         int *complete)
 {
-        int errcode;
-  
-        chan->callref = *((ushort *) skb->data);     /* Update CallReference */
-        skb_pull(skb, 2);
+       int errcode;
+
+       chan->callref = *((ushort *)skb->data);     /* Update CallReference */
+       skb_pull(skb, 2);
+
+       errcode = *((ushort *) skb->data);   /* read errcode */
+       skb_pull(skb, 2);
 
-        errcode = *((ushort *) skb->data);   /* read errcode */
-        skb_pull(skb, 2);
+       *complete = *(skb->data);
+       skb_pull(skb, 1);
 
-        *complete = *(skb->data);
-        skb_pull(skb, 1);
+       /* FIX ME */
+       /* This is actually a firmware bug */
+       if (!*complete)
+       {
+               printk(KERN_DEBUG "complete=%02x\n", *complete);
+               *complete = 1;
+       }
 
-        /* FIX ME */
-        /* This is actually a firmware bug */
-        if (!*complete)
-        {
-                printk(KERN_DEBUG "complete=%02x\n", *complete);
-                *complete = 1;
-        }
 
+       /* Optional Bearer Capability */
+       skb_pull(skb, *(skb->data) + 1);
 
-        /* Optional Bearer Capability */
-        skb_pull(skb, *(skb->data) + 1);
-        
-        /* Channel Identification */
-        skb_pull(skb, *(skb->data) + 1);
+       /* Channel Identification */
+       skb_pull(skb, *(skb->data) + 1);
 
-        /* High Layer Compatibility follows */
-        skb_pull(skb, *(skb->data) + 1);
+       /* High Layer Compatibility follows */
+       skb_pull(skb, *(skb->data) + 1);
 
-        return errcode;
+       return errcode;
 }
 
-int capi_decode_conn_actv_ind(struct pcbit_chan * chan, struct sk_buff *skb)
+int capi_decode_conn_actv_ind(struct pcbit_chan *chan, struct sk_buff *skb)
 {
-        ushort len;
+       ushort len;
 #ifdef DEBUG
-        char str[32];
+       char str[32];
 #endif
 
-        /* Yet Another Bearer Capability */
-        skb_pull(skb, *(skb->data) + 1);
-  
+       /* Yet Another Bearer Capability */
+       skb_pull(skb, *(skb->data) + 1);
 
-        /* Connected Party Number */
-        len=*(skb->data);
+
+       /* Connected Party Number */
+       len = *(skb->data);
 
 #ifdef DEBUG
        if (len > 1 && len < 31) {
@@ -549,106 +549,101 @@ int capi_decode_conn_actv_ind(struct pcbit_chan * chan, struct sk_buff *skb)
                printk(KERN_DEBUG "actv_ind CPN len = %d\n", len);
 #endif
 
-        skb_pull(skb, len + 1);
+       skb_pull(skb, len + 1);
 
-        /* Connected Subaddress */
-        skb_pull(skb, *(skb->data) + 1);
+       /* Connected Subaddress */
+       skb_pull(skb, *(skb->data) + 1);
 
-        /* Low Layer Capability */
-        skb_pull(skb, *(skb->data) + 1);
+       /* Low Layer Capability */
+       skb_pull(skb, *(skb->data) + 1);
 
-        /* High Layer Capability */
-        skb_pull(skb, *(skb->data) + 1);
+       /* High Layer Capability */
+       skb_pull(skb, *(skb->data) + 1);
 
-        return 0;
+       return 0;
 }
 
-int capi_decode_conn_actv_conf(struct pcbit_chan * chan, struct sk_buff *skb)
+int capi_decode_conn_actv_conf(struct pcbit_chan *chan, struct sk_buff *skb)
 {
-        ushort errcode;
-
-        errcode = *((ushort*) skb->data);
-        skb_pull(skb, 2);
-        
-        /* Channel Identification 
-        skb_pull(skb, skb->data[0] + 1);
-        */
-        return errcode;
+       ushort errcode;
+
+       errcode = *((ushort *)skb->data);
+       skb_pull(skb, 2);
+
+       /* Channel Identification
+          skb_pull(skb, skb->data[0] + 1);
+       */
+       return errcode;
 }
 
 
 int capi_decode_sel_proto_conf(struct pcbit_chan *chan, struct sk_buff *skb)
 {
-        ushort errcode;
-        
-        chan->layer2link = *(skb->data);
-        skb_pull(skb, 1);
+       ushort errcode;
 
-        errcode = *((ushort*) skb->data);
-        skb_pull(skb, 2);
+       chan->layer2link = *(skb->data);
+       skb_pull(skb, 1);
 
-        return errcode;
+       errcode = *((ushort *)skb->data);
+       skb_pull(skb, 2);
+
+       return errcode;
 }
 
 int capi_decode_actv_trans_conf(struct pcbit_chan *chan, struct sk_buff *skb)
 {
-        ushort errcode;
+       ushort errcode;
 
-        if (chan->layer2link != *(skb->data) )
-                printk("capi_decode_actv_trans_conf: layer2link doesn't match\n");
+       if (chan->layer2link != *(skb->data))
+               printk("capi_decode_actv_trans_conf: layer2link doesn't match\n");
 
-        skb_pull(skb, 1);
+       skb_pull(skb, 1);
 
-        errcode = *((ushort*) skb->data);
-        skb_pull(skb, 2);
+       errcode = *((ushort *)skb->data);
+       skb_pull(skb, 2);
 
-        return errcode;        
+       return errcode;
 }
 
 int capi_decode_disc_ind(struct pcbit_chan *chan, struct sk_buff *skb)
 {
-        ushort len;
+       ushort len;
 #ifdef DEBUG
-        int i;
+       int i;
 #endif
-        /* Cause */
-        
-        len = *(skb->data);
-        skb_pull(skb, 1);
+       /* Cause */
+
+       len = *(skb->data);
+       skb_pull(skb, 1);
 
 #ifdef DEBUG
 
-        for (i=0; i<len; i++)
-                printk(KERN_DEBUG "Cause Octect %d: %02x\n", i+3, 
-                       *(skb->data + i));
+       for (i = 0; i < len; i++)
+               printk(KERN_DEBUG "Cause Octect %d: %02x\n", i + 3,
+                      *(skb->data + i));
 #endif
 
-        skb_pull(skb, len);
+       skb_pull(skb, len);
 
-        return 0;
+       return 0;
 }
 
 #ifdef DEBUG
 int capi_decode_debug_188(u_char *hdr, ushort hdrlen)
 {
-        char str[64];
-        int len;
-        
-        len = hdr[0];
-
-        if (len < 64 && len == hdrlen - 1) {        
-                memcpy(str, hdr + 1, hdrlen - 1);
-                str[hdrlen - 1] = 0;
-                printk("%s\n", str);
-        }
-        else
-                printk("debug message incorrect\n");
-
-        return 0;
-}
-#endif
-
-
+       char str[64];
+       int len;
 
+       len = hdr[0];
 
+       if (len < 64 && len == hdrlen - 1) {
+               memcpy(str, hdr + 1, hdrlen - 1);
+               str[hdrlen - 1] = 0;
+               printk("%s\n", str);
+       }
+       else
+               printk("debug message incorrect\n");
 
+       return 0;
+}
+#endif
index df8e73c..635f634 100644 (file)
@@ -2,10 +2,10 @@
  * CAPI encode/decode prototypes and defines
  *
  * Copyright (C) 1996 Universidade de Lisboa
- * 
+ *
  * Written by Pedro Roque Marques (roque@di.fc.ul.pt)
  *
- * This software may be used and distributed according to the terms of 
+ * This software may be used and distributed according to the terms of
  * the GNU General Public License, incorporated herein by reference.
  */
 
 
 #define REQ_CAUSE         0x01
 #define REQ_DISPLAY       0x04
-#define REQ_USER_TO_USER  0x08 
+#define REQ_USER_TO_USER  0x08
 
-#define AppInfoMask  REQ_CAUSE|REQ_DISPLAY|REQ_USER_TO_USER 
+#define AppInfoMask  REQ_CAUSE | REQ_DISPLAY | REQ_USER_TO_USER
 
 /* Connection Setup */
-extern int capi_conn_req(const char * calledPN, struct sk_buff **buf,
+extern int capi_conn_req(const char *calledPN, struct sk_buff **buf,
                         int proto);
-extern int capi_decode_conn_conf(struct pcbit_chan * chan, struct sk_buff *skb,
-                                int *complete); 
+extern int capi_decode_conn_conf(struct pcbit_chan *chan, struct sk_buff *skb,
+                                int *complete);
 
-extern int capi_decode_conn_ind(struct pcbit_chan * chan, struct sk_buff *skb,
+extern int capi_decode_conn_ind(struct pcbit_chan *chan, struct sk_buff *skb,
                                struct callb_data *info);
-extern int capi_conn_resp(struct pcbit_chan* chan, struct sk_buff **skb);
+extern int capi_conn_resp(struct pcbit_chan *chan, struct sk_buff **skb);
 
-extern int capi_conn_active_req(struct pcbit_chan* chan, struct sk_buff **skb);
-extern int capi_decode_conn_actv_conf(struct pcbit_chan * chan, 
+extern int capi_conn_active_req(struct pcbit_chan *chan, struct sk_buff **skb);
+extern int capi_decode_conn_actv_conf(struct pcbit_chan *chan,
                                      struct sk_buff *skb);
 
-extern int capi_decode_conn_actv_ind(struct pcbit_chan * chan, 
+extern int capi_decode_conn_actv_ind(struct pcbit_chan *chan,
                                     struct sk_buff *skb);
-extern int capi_conn_active_resp(struct pcbit_chan* chan, 
+extern int capi_conn_active_resp(struct pcbit_chan *chan,
                                 struct sk_buff **skb);
 
 /* Data */
 extern int capi_select_proto_req(struct pcbit_chan *chan, struct sk_buff **skb,
                                 int outgoing);
-extern int capi_decode_sel_proto_conf(struct pcbit_chan *chan, 
+extern int capi_decode_sel_proto_conf(struct pcbit_chan *chan,
                                      struct sk_buff *skb);
 
-extern int capi_activate_transp_req(struct pcbit_chan *chan, 
+extern int capi_activate_transp_req(struct pcbit_chan *chan,
                                    struct sk_buff **skb);
-extern int capi_decode_actv_trans_conf(struct pcbit_chan *chan, 
+extern int capi_decode_actv_trans_conf(struct pcbit_chan *chan,
                                       struct sk_buff *skb);
 
-extern int capi_tdata_req(struct pcbit_chan* chan, struct sk_buff *skb);
-extern int capi_tdata_resp(struct pcbit_chan *chan, struct sk_buff ** skb);
+extern int capi_tdata_req(struct pcbit_chan *chan, struct sk_buff *skb);
+extern int capi_tdata_resp(struct pcbit_chan *chan, struct sk_buff **skb);
 
 /* Connection Termination */
 extern int capi_disc_req(ushort callref, struct sk_buff **skb, u_char cause);
@@ -62,12 +62,12 @@ extern int capi_disc_resp(struct pcbit_chan *chan, struct sk_buff **skb);
 extern int capi_decode_debug_188(u_char *hdr, ushort hdrlen);
 #endif
 
-static inline struct pcbit_chan * 
+static inline struct pcbit_chan *
 capi_channel(struct pcbit_dev *dev, struct sk_buff *skb)
 {
        ushort callref;
 
-       callref = *((ushort*) skb->data);
+       callref = *((ushort *)skb->data);
        skb_pull(skb, 2);
 
        if (dev->b1->callref == callref)
@@ -79,9 +79,3 @@ capi_channel(struct pcbit_dev *dev, struct sk_buff *skb)
 }
 
 #endif
-
-
-
-
-
-
index 1507d2e..1eaf622 100644 (file)
@@ -2,10 +2,10 @@
  * PCBIT-D interface with isdn4linux
  *
  * Copyright (C) 1996 Universidade de Lisboa
- * 
+ *
  * Written by Pedro Roque Marques (roque@di.fc.ul.pt)
  *
- * This software may be used and distributed according to the terms of 
+ * This software may be used and distributed according to the terms of
  * the GNU General Public License, incorporated herein by reference.
  */
 
@@ -14,7 +14,7 @@
  *
  *     Nuno Grilo      <l38486@alfa.ist.utl.pt>
  *      fixed msn_list NULL pointer dereference.
- *             
+ *
  */
 
 #include <linux/module.h>
@@ -43,9 +43,9 @@
 
 extern ushort last_ref_num;
 
-static int pcbit_ioctl(isdn_ctrl* ctl);
+static int pcbit_ioctl(isdn_ctrl *ctl);
 
-static char* pcbit_devname[MAX_PCBIT_CARDS] = {
+static char *pcbit_devname[MAX_PCBIT_CARDS] = {
        "pcbit0",
        "pcbit1",
        "pcbit2",
@@ -56,12 +56,12 @@ static char* pcbit_devname[MAX_PCBIT_CARDS] = {
  * prototypes
  */
 
-static int pcbit_command(isdn_ctrl* ctl);
-static int pcbit_stat(u_char __user * buf, int len, int, int);
+static int pcbit_command(isdn_ctrl *ctl);
+static int pcbit_stat(u_char __user *buf, int len, int, int);
 static int pcbit_xmit(int driver, int chan, int ack, struct sk_buff *skb);
 static int pcbit_writecmd(const u_char __user *, int, int, int);
 
-static int set_protocol_running(struct pcbit_dev * dev);
+static int set_protocol_running(struct pcbit_dev *dev);
 
 static void pcbit_clear_msn(struct pcbit_dev *dev);
 static void pcbit_set_msn(struct pcbit_dev *dev, char *list);
@@ -73,7 +73,7 @@ int pcbit_init_dev(int board, int mem_base, int irq)
        struct pcbit_dev *dev;
        isdn_if *dev_if;
 
-       if ((dev=kzalloc(sizeof(struct pcbit_dev), GFP_KERNEL)) == NULL)
+       if ((dev = kzalloc(sizeof(struct pcbit_dev), GFP_KERNEL)) == NULL)
        {
                printk("pcbit_init: couldn't malloc pcbit_dev struct\n");
                return -ENOMEM;
@@ -83,19 +83,19 @@ int pcbit_init_dev(int board, int mem_base, int irq)
        init_waitqueue_head(&dev->set_running_wq);
        spin_lock_init(&dev->lock);
 
-       if (mem_base >= 0xA0000 && mem_base <= 0xFFFFF ) {
+       if (mem_base >= 0xA0000 && mem_base <= 0xFFFFF) {
                dev->ph_mem = mem_base;
                if (!request_mem_region(dev->ph_mem, 4096, "PCBIT mem")) {
                        printk(KERN_WARNING
-                               "PCBIT: memory region %lx-%lx already in use\n",
-                               dev->ph_mem, dev->ph_mem + 4096);
+                              "PCBIT: memory region %lx-%lx already in use\n",
+                              dev->ph_mem, dev->ph_mem + 4096);
                        kfree(dev);
                        dev_pcbit[board] = NULL;
                        return -EACCES;
                }
                dev->sh_mem = ioremap(dev->ph_mem, 4096);
        }
-       else 
+       else
        {
                printk("memory address invalid");
                kfree(dev);
@@ -111,7 +111,7 @@ int pcbit_init_dev(int board, int mem_base, int irq)
                kfree(dev);
                return -ENOMEM;
        }
-    
+
        dev->b2 = kzalloc(sizeof(struct pcbit_chan), GFP_KERNEL);
        if (!dev->b2) {
                printk("pcbit_init: couldn't malloc pcbit_chan struct\n");
@@ -130,7 +130,7 @@ int pcbit_init_dev(int board, int mem_base, int irq)
         *  interrupts
         */
 
-       if (request_irq(irq, &pcbit_irq_handler, 0, pcbit_devname[board], dev) != 0) 
+       if (request_irq(irq, &pcbit_irq_handler, 0, pcbit_devname[board], dev) != 0)
        {
                kfree(dev->b1);
                kfree(dev->b2);
@@ -168,16 +168,16 @@ int pcbit_init_dev(int board, int mem_base, int irq)
        dev_if->owner = THIS_MODULE;
 
        dev_if->channels = 2;
-       
-       dev_if->features = (ISDN_FEATURE_P_EURO  | ISDN_FEATURE_L3_TRANS | 
-                           ISDN_FEATURE_L2_HDLC | ISDN_FEATURE_L2_TRANS );
+
+       dev_if->features = (ISDN_FEATURE_P_EURO  | ISDN_FEATURE_L3_TRANS |
+                           ISDN_FEATURE_L2_HDLC | ISDN_FEATURE_L2_TRANS);
 
        dev_if->writebuf_skb = pcbit_xmit;
        dev_if->hl_hdrlen = 16;
 
        dev_if->maxbufsize = MAXBUFSIZE;
        dev_if->command  = pcbit_command;
-       
+
        dev_if->writecmd = pcbit_writecmd;
        dev_if->readstat = pcbit_stat;
 
@@ -211,12 +211,12 @@ int pcbit_init_dev(int board, int mem_base, int irq)
 #ifdef MODULE
 void pcbit_terminate(int board)
 {
-       struct pcbit_dev * dev;
+       struct pcbit_dev *dev;
 
        dev = dev_pcbit[board];
 
        if (dev) {
-            /* unregister_isdn(dev->dev_if); */
+               /* unregister_isdn(dev->dev_if); */
                free_irq(dev->irq, dev);
                pcbit_clear_msn(dev);
                kfree(dev->dev_if);
@@ -233,9 +233,9 @@ void pcbit_terminate(int board)
 }
 #endif
 
-static int pcbit_command(isdn_ctrl* ctl)
+static int pcbit_command(isdn_ctrl *ctl)
 {
-       struct pcbit_dev  *dev;
+       struct pcbit_dev *dev;
        struct pcbit_chan *chan;
        struct callb_data info;
 
@@ -250,7 +250,7 @@ static int pcbit_command(isdn_ctrl* ctl)
        chan = (ctl->arg & 0x0F) ? dev->b2 : dev->b1;
 
 
-       switch(ctl->command) {
+       switch (ctl->command) {
        case ISDN_CMD_IOCTL:
                return pcbit_ioctl(ctl);
                break;
@@ -299,10 +299,10 @@ static int pcbit_command(isdn_ctrl* ctl)
 static void pcbit_block_timer(unsigned long data)
 {
        struct pcbit_chan *chan;
-       struct pcbit_dev * dev;
+       struct pcbit_dev *dev;
        isdn_ctrl ictl;
 
-       chan = (struct pcbit_chan *) data;
+       chan = (struct pcbit_chan *)data;
 
        dev = chan2dev(chan);
 
@@ -316,12 +316,12 @@ static void pcbit_block_timer(unsigned long data)
 
 #ifdef DEBUG
        printk(KERN_DEBUG "pcbit_block_timer\n");
-#endif 
+#endif
        chan->queued = 0;
        ictl.driver = dev->id;
        ictl.command = ISDN_STAT_BSENT;
        ictl.arg = chan->id;
-       dev->dev_if->statcallb(&ictl);     
+       dev->dev_if->statcallb(&ictl);
 }
 #endif
 
@@ -329,7 +329,7 @@ static int pcbit_xmit(int driver, int chnum, int ack, struct sk_buff *skb)
 {
        ushort hdrlen;
        int refnum, len;
-       struct pcbit_chan * chan;
+       struct pcbit_chan *chan;
        struct pcbit_dev *dev;
 
        dev = finddev(driver);
@@ -345,10 +345,10 @@ static int pcbit_xmit(int driver, int chnum, int ack, struct sk_buff *skb)
        if (chan->fsm_state != ST_ACTIVE)
                return -1;
 
-       if (chan->queued >= MAX_QUEUED )
+       if (chan->queued >= MAX_QUEUED)
        {
 #ifdef DEBUG_QUEUE
-               printk(KERN_DEBUG 
+               printk(KERN_DEBUG
                       "pcbit: %d packets already in queue - write fails\n",
                       chan->queued);
 #endif
@@ -365,14 +365,14 @@ static int pcbit_xmit(int driver, int chnum, int ack, struct sk_buff *skb)
                        chan->block_timer.expires = jiffies + 1 * HZ;
                        add_timer(&chan->block_timer);
                }
-#endif         
-               return 0;                        
+#endif
+               return 0;
        }
 
 
        chan->queued++;
-       
-        len = skb->len;
+
+       len = skb->len;
 
        hdrlen = capi_tdata_req(chan, skb);
 
@@ -386,10 +386,10 @@ static int pcbit_xmit(int driver, int chnum, int ack, struct sk_buff *skb)
 
 static int pcbit_writecmd(const u_char __user *buf, int len, int driver, int channel)
 {
-       struct pcbit_dev * dev;
+       struct pcbit_dev *dev;
        int i, j;
-       const u_char * loadbuf;
-       u_char * ptr = NULL;
+       const u_char *loadbuf;
+       u_char *ptr = NULL;
        u_char *cbuf;
 
        int errstat;
@@ -402,7 +402,7 @@ static int pcbit_writecmd(const u_char __user *buf, int len, int driver, int cha
                return -ENODEV;
        }
 
-       switch(dev->l2_state) {
+       switch (dev->l2_state) {
        case L2_LWMODE:
                /* check (size <= rdp_size); write buf into board */
                if (len < 0 || len > BANK4 + 1 || len > 1024)
@@ -422,19 +422,19 @@ static int pcbit_writecmd(const u_char __user *buf, int len, int driver, int cha
                /* this is the hard part */
                /* dumb board */
                /* get it into kernel space */
-               if ((ptr = kmalloc(len, GFP_KERNEL))==NULL)
+               if ((ptr = kmalloc(len, GFP_KERNEL)) == NULL)
                        return -ENOMEM;
                if (copy_from_user(ptr, buf, len)) {
                        kfree(ptr);
                        return -EFAULT;
                }
                loadbuf = ptr;
-    
+
                errstat = 0;
 
-               for (i=0; i < len; i++)
+               for (i = 0; i < len; i++)
                {
-                       for(j=0; j < LOAD_RETRY; j++)
+                       for (j = 0; j < LOAD_RETRY; j++)
                                if (!(readb(dev->sh_mem + dev->loadptr)))
                                        break;
 
@@ -464,9 +464,9 @@ static int pcbit_writecmd(const u_char __user *buf, int len, int driver, int cha
  *
  */
 
-void pcbit_l3_receive(struct pcbit_dev * dev, ulong msg, 
-                            struct sk_buff * skb,
-                            ushort hdr_len, ushort refnum)
+void pcbit_l3_receive(struct pcbit_dev *dev, ulong msg,
+                     struct sk_buff *skb,
+                     ushort hdr_len, ushort refnum)
 {
        struct pcbit_chan *chan;
        struct sk_buff *skb2;
@@ -475,11 +475,11 @@ void pcbit_l3_receive(struct pcbit_dev * dev, ulong msg,
        int complete, err;
        isdn_ctrl ictl;
 
-       switch(msg) {
+       switch (msg) {
 
        case MSG_TDATA_IND:
                if (!(chan = capi_channel(dev, skb))) {
-                       printk(KERN_WARNING 
+                       printk(KERN_WARNING
                               "CAPI header: unknown channel id\n");
                        break;
                }
@@ -488,30 +488,30 @@ void pcbit_l3_receive(struct pcbit_dev * dev, ulong msg,
 
                dev->dev_if->rcvcallb_skb(dev->id, chan->id, skb);
 
-               if (capi_tdata_resp(chan, &skb2) > 0) 
-                       pcbit_l2_write(dev, MSG_TDATA_RESP, refnum, 
+               if (capi_tdata_resp(chan, &skb2) > 0)
+                       pcbit_l2_write(dev, MSG_TDATA_RESP, refnum,
                                       skb2, skb2->len);
                return;
-               break;  
+               break;
        case MSG_TDATA_CONF:
                if (!(chan = capi_channel(dev, skb))) {
-                       printk(KERN_WARNING 
+                       printk(KERN_WARNING
                               "CAPI header: unknown channel id\n");
                        break;
                }
 
 #ifdef DEBUG
-               if ( (*((ushort *) (skb->data + 2) )) != 0) {
-                        printk(KERN_DEBUG "TDATA_CONF error\n");
+               if ((*((ushort *)(skb->data + 2))) != 0) {
+                       printk(KERN_DEBUG "TDATA_CONF error\n");
                }
 #endif
 #ifdef BLOCK_TIMER
-                if (chan->queued == MAX_QUEUED) {
-                        del_timer(&chan->block_timer);
+               if (chan->queued == MAX_QUEUED) {
+                       del_timer(&chan->block_timer);
                        chan->block_timer.function = NULL;
                }
-                
-#endif         
+
+#endif
                chan->queued--;
 
                ictl.driver = dev->id;
@@ -523,7 +523,7 @@ void pcbit_l3_receive(struct pcbit_dev * dev, ulong msg,
        case MSG_CONN_IND:
                /*
                 *  channel: 1st not used will do
-                *           if both are used we're in trouble 
+                *           if both are used we're in trouble
                 */
 
                if (!dev->b1->fsm_state)
@@ -531,12 +531,12 @@ void pcbit_l3_receive(struct pcbit_dev * dev, ulong msg,
                else if (!dev->b2->fsm_state)
                        chan = dev->b2;
                else {
-                       printk(KERN_INFO 
+                       printk(KERN_INFO
                               "Incoming connection: no channels available");
 
-                       if ((len = capi_disc_req(*(ushort*)(skb->data), &skb2, CAUSE_NOCHAN)) > 0)
+                       if ((len = capi_disc_req(*(ushort *)(skb->data), &skb2, CAUSE_NOCHAN)) > 0)
                                pcbit_l2_write(dev, MSG_DISC_REQ, refnum, skb2, len);
-                       break;  
+                       break;
                }
 
                cbdata.data.setup.CalledPN = NULL;
@@ -547,7 +547,7 @@ void pcbit_l3_receive(struct pcbit_dev * dev, ulong msg,
 
                pcbit_fsm_event(dev, chan, EV_NET_SETUP, NULL);
 
-               if (pcbit_check_msn(dev, cbdata.data.setup.CallingPN)) 
+               if (pcbit_check_msn(dev, cbdata.data.setup.CallingPN))
                        pcbit_fsm_event(dev, chan, EV_USR_PROCED_REQ, &cbdata);
                else
                        pcbit_fsm_event(dev, chan, EV_USR_RELEASE_REQ, NULL);
@@ -555,26 +555,26 @@ void pcbit_l3_receive(struct pcbit_dev * dev, ulong msg,
                kfree(cbdata.data.setup.CalledPN);
                kfree(cbdata.data.setup.CallingPN);
                break;
-    
+
        case MSG_CONN_CONF:
-               /* 
+               /*
                 * We should be able to find the channel by the message
                 * reference number. The current version of the firmware
                 * doesn't sent the ref number correctly.
                 */
 #ifdef DEBUG
-               printk(KERN_DEBUG "refnum=%04x b1=%04x b2=%04x\n", refnum, 
-                      dev->b1->s_refnum, 
+               printk(KERN_DEBUG "refnum=%04x b1=%04x b2=%04x\n", refnum,
+                      dev->b1->s_refnum,
                       dev->b2->s_refnum);
 #endif
                /* We just try to find a channel in the right state */
 
                if (dev->b1->fsm_state == ST_CALL_INIT)
                        chan = dev->b1;
-               else {             
+               else {
                        if (dev->b2->s_refnum == ST_CALL_INIT)
                                chan = dev->b2;
-                       else {                  
+                       else {
                                chan = NULL;
                                printk(KERN_WARNING "Connection Confirm - no channel in Call Init state\n");
                                break;
@@ -589,18 +589,18 @@ void pcbit_l3_receive(struct pcbit_dev * dev, ulong msg,
                                pcbit_fsm_event(dev, chan, EV_NET_CALL_PROC, NULL);
                        else
                                pcbit_fsm_event(dev, chan, EV_NET_SETUP_ACK, NULL);
-               break; 
+               break;
        case MSG_CONN_ACTV_IND:
 
                if (!(chan = capi_channel(dev, skb))) {
-                       printk(KERN_WARNING 
+                       printk(KERN_WARNING
                               "CAPI header: unknown channel id\n");
                        break;
                }
-               
+
                if (capi_decode_conn_actv_ind(chan, skb)) {
                        printk("error in capi_decode_conn_actv_ind\n");
-                    /* pcbit_fsm_event(dev, chan, EV_ERROR, NULL); */
+                       /* pcbit_fsm_event(dev, chan, EV_ERROR, NULL); */
                        break;
                }
                chan->r_refnum = refnum;
@@ -609,14 +609,14 @@ void pcbit_l3_receive(struct pcbit_dev * dev, ulong msg,
        case MSG_CONN_ACTV_CONF:
 
                if (!(chan = capi_channel(dev, skb))) {
-                       printk(KERN_WARNING 
+                       printk(KERN_WARNING
                               "CAPI header: unknown channel id\n");
                        break;
                }
 
                if (capi_decode_conn_actv_conf(chan, skb) == 0)
                        pcbit_fsm_event(dev, chan, EV_NET_CONN_ACK, NULL);
-               
+
                else
                        printk(KERN_DEBUG "decode_conn_actv_conf failed\n");
                break;
@@ -624,7 +624,7 @@ void pcbit_l3_receive(struct pcbit_dev * dev, ulong msg,
        case  MSG_SELP_CONF:
 
                if (!(chan = capi_channel(dev, skb))) {
-                       printk(KERN_WARNING 
+                       printk(KERN_WARNING
                               "CAPI header: unknown channel id\n");
                        break;
                }
@@ -638,7 +638,7 @@ void pcbit_l3_receive(struct pcbit_dev * dev, ulong msg,
                break;
        case MSG_ACT_TRANSP_CONF:
                if (!(chan = capi_channel(dev, skb))) {
-                       printk(KERN_WARNING 
+                       printk(KERN_WARNING
                               "CAPI header: unknown channel id\n");
                        break;
                }
@@ -650,7 +650,7 @@ void pcbit_l3_receive(struct pcbit_dev * dev, ulong msg,
        case MSG_DISC_IND:
 
                if (!(chan = capi_channel(dev, skb))) {
-                       printk(KERN_WARNING 
+                       printk(KERN_WARNING
                               "CAPI header: unknown channel id\n");
                        break;
                }
@@ -662,7 +662,7 @@ void pcbit_l3_receive(struct pcbit_dev * dev, ulong msg,
                break;
        case MSG_DISC_CONF:
                if (!(chan = capi_channel(dev, skb))) {
-                       printk(KERN_WARNING 
+                       printk(KERN_WARNING
                               "CAPI header: unknown channel id\n");
                        break;
                }
@@ -711,24 +711,24 @@ static int pcbit_stat(u_char __user *buf, int len, int driver, int channel)
                stat_count = STATBUF_LEN - stat_st + stat_end;
 
        /* FIXME: should we sleep and wait for more cookies ? */
-       if (len > stat_count)            
+       if (len > stat_count)
                len = stat_count;
 
        if (stat_st < stat_end)
        {
                if (copy_to_user(buf, statbuf + stat_st, len))
                        return -EFAULT;
-               stat_st += len;    
+               stat_st += len;
        }
        else
        {
                if (len > STATBUF_LEN - stat_st)
                {
                        if (copy_to_user(buf, statbuf + stat_st,
-                                      STATBUF_LEN - stat_st))
+                                        STATBUF_LEN - stat_st))
                                return -EFAULT;
                        if (copy_to_user(buf, statbuf,
-                                      len - (STATBUF_LEN - stat_st)))
+                                        len - (STATBUF_LEN - stat_st)))
                                return -EFAULT;
 
                        stat_st = len - (STATBUF_LEN - stat_st);
@@ -739,7 +739,7 @@ static int pcbit_stat(u_char __user *buf, int len, int driver, int channel)
                                return -EFAULT;
 
                        stat_st += len;
-                       
+
                        if (stat_st == STATBUF_LEN)
                                stat_st = 0;
                }
@@ -756,27 +756,27 @@ static void pcbit_logstat(struct pcbit_dev *dev, char *str)
        int i;
        isdn_ctrl ictl;
 
-       for (i=stat_end; i<strlen(str); i++)
+       for (i = stat_end; i < strlen(str); i++)
        {
-               statbuf[i]=str[i];
+               statbuf[i] = str[i];
                stat_end = (stat_end + 1) % STATBUF_LEN;
                if (stat_end == stat_st)
                        stat_st = (stat_st + 1) % STATBUF_LEN;
        }
 
-       ictl.command=ISDN_STAT_STAVAIL;
-       ictl.driver=dev->id;
-       ictl.arg=strlen(str);
+       ictl.command = ISDN_STAT_STAVAIL;
+       ictl.driver = dev->id;
+       ictl.arg = strlen(str);
        dev->dev_if->statcallb(&ictl);
 }
-       
-void pcbit_state_change(struct pcbit_dev * dev, struct pcbit_chan * chan, 
+
+void pcbit_state_change(struct pcbit_dev *dev, struct pcbit_chan *chan,
                        unsigned short i, unsigned short ev, unsigned short f)
 {
        char buf[256];
-  
+
        sprintf(buf, "change on device: %d channel:%d\n%s -> %s -> %s\n",
-               dev->id, chan->id, 
+               dev->id, chan->id,
                isdn_state_table[i], strisdnevent(ev), isdn_state_table[f]
                );
 
@@ -789,7 +789,7 @@ void pcbit_state_change(struct pcbit_dev * dev, struct pcbit_chan * chan,
 
 static void set_running_timeout(unsigned long ptr)
 {
-       struct pcbit_dev * dev;
+       struct pcbit_dev *dev;
 
 #ifdef DEBUG
        printk(KERN_DEBUG "set_running_timeout\n");
@@ -799,7 +799,7 @@ static void set_running_timeout(unsigned long ptr)
        wake_up_interruptible(&dev->set_running_wq);
 }
 
-static int set_protocol_running(struct pcbit_dev * dev)
+static int set_protocol_running(struct pcbit_dev *dev)
 {
        isdn_ctrl ctl;
 
@@ -813,7 +813,7 @@ static int set_protocol_running(struct pcbit_dev * dev)
 
        dev->l2_state = L2_STARTING;
 
-       writeb((0x80U | ((dev->rcv_seq & 0x07) << 3) | (dev->send_seq & 0x07)), 
+       writeb((0x80U | ((dev->rcv_seq & 0x07) << 3) | (dev->send_seq & 0x07)),
               dev->sh_mem + BANK4);
 
        add_timer(&dev->set_running_timer);
@@ -830,8 +830,8 @@ static int set_protocol_running(struct pcbit_dev * dev)
 
                dev->writeptr = dev->sh_mem;
                dev->readptr = dev->sh_mem + BANK2;
-    
-               /* tell the good news to the upper layer */  
+
+               /* tell the good news to the upper layer */
                ctl.driver = dev->id;
                ctl.command = ISDN_STAT_RUN;
 
@@ -845,7 +845,7 @@ static int set_protocol_running(struct pcbit_dev * dev)
                dev->l2_state = L2_DOWN;
 
 #ifdef DEBUG
-               printk(KERN_DEBUG "Bank3 = %02x\n", 
+               printk(KERN_DEBUG "Bank3 = %02x\n",
                       readb(dev->sh_mem + BANK3));
 #endif
                writeb(0x40, dev->sh_mem + BANK4);
@@ -862,13 +862,13 @@ static int set_protocol_running(struct pcbit_dev * dev)
        return 0;
 }
 
-static int pcbit_ioctl(isdn_ctrl* ctl)
+static int pcbit_ioctl(isdn_ctrl *ctl)
 {
-       struct pcbit_dev * dev;
+       struct pcbit_dev *dev;
        struct pcbit_ioctl *cmd;
 
        dev = finddev(ctl->driver);
-  
+
        if (!dev)
        {
                printk(KERN_DEBUG "pcbit_ioctl: unknown device\n");
@@ -877,7 +877,7 @@ static int pcbit_ioctl(isdn_ctrl* ctl)
 
        cmd = (struct pcbit_ioctl *) ctl->parm.num;
 
-       switch(ctl->arg) {
+       switch (ctl->arg) {
        case PCBIT_IOCTL_GETSTAT:
                cmd->info.l2_status = dev->l2_state;
                break;
@@ -890,7 +890,7 @@ static int pcbit_ioctl(isdn_ctrl* ctl)
 
                dev->writeptr = dev->sh_mem;
                dev->readptr = dev->sh_mem + BANK2;
-    
+
                dev->l2_state = L2_LOADING;
                break;
 
@@ -907,21 +907,21 @@ static int pcbit_ioctl(isdn_ctrl* ctl)
                dev->loadptr = LOAD_ZONE_START;
                dev->l2_state = L2_FWMODE;
 
-               break; 
+               break;
        case PCBIT_IOCTL_ENDLOAD:
                if (dev->l2_state == L2_RUNNING)
                        return -EBUSY;
                dev->l2_state = L2_DOWN;
-               break; 
+               break;
 
-       case PCBIT_IOCTL_SETBYTE: 
+       case PCBIT_IOCTL_SETBYTE:
                if (dev->l2_state == L2_RUNNING)
                        return -EBUSY;
 
                /* check addr */
                if (cmd->info.rdp_byte.addr > BANK4)
                        return -EFAULT;
-               
+
                writeb(cmd->info.rdp_byte.value, dev->sh_mem + cmd->info.rdp_byte.addr);
                break;
        case PCBIT_IOCTL_GETBYTE:
@@ -935,10 +935,10 @@ static int pcbit_ioctl(isdn_ctrl* ctl)
                        printk("getbyte: invalid addr %04x\n", cmd->info.rdp_byte.addr);
                        return -EFAULT;
                }
-               
-               cmd->info.rdp_byte.value = readb(dev->sh_mem + cmd->info.rdp_byte.addr); 
+
+               cmd->info.rdp_byte.value = readb(dev->sh_mem + cmd->info.rdp_byte.addr);
                break;
-       case PCBIT_IOCTL_RUNNING: 
+       case PCBIT_IOCTL_RUNNING:
                if (dev->l2_state == L2_RUNNING)
                        return -EBUSY;
                return set_protocol_running(dev);
@@ -972,25 +972,25 @@ static int pcbit_ioctl(isdn_ctrl* ctl)
        return 0;
 }
 
-/* 
+/*
  *        MSN list handling
  *
  *        if null reject all calls
- *        if first entry has null MSN accept all calls 
+ *        if first entry has null MSN accept all calls
  */
 
 static void pcbit_clear_msn(struct pcbit_dev *dev)
 {
        struct msn_entry *ptr, *back;
 
-       for (ptr=dev->msn_list; ptr; )
+       for (ptr = dev->msn_list; ptr;)
        {
                back = ptr->next;
                kfree(ptr);
                ptr = back;
        }
 
-       dev->msn_list = NULL; 
+       dev->msn_list = NULL;
 }
 
 static void pcbit_set_msn(struct pcbit_dev *dev, char *list)
@@ -1016,12 +1016,12 @@ static void pcbit_set_msn(struct pcbit_dev *dev, char *list)
        }
 
        if (dev->msn_list)
-               for (back=dev->msn_list; back->next; back=back->next);
-       
+               for (back = dev->msn_list; back->next; back = back->next);
+
        sp = list;
 
        do {
-               cp=strchr(sp, ',');
+               cp = strchr(sp, ',');
                if (cp)
                        len = cp - sp;
                else
@@ -1034,7 +1034,7 @@ static void pcbit_set_msn(struct pcbit_dev *dev, char *list)
                        return;
                }
                ptr->next = NULL;
-               
+
                ptr->msn = kmalloc(len, GFP_ATOMIC);
                if (!ptr->msn) {
                        printk(KERN_WARNING "kmalloc failed\n");
@@ -1054,7 +1054,7 @@ static void pcbit_set_msn(struct pcbit_dev *dev, char *list)
                        back->next = ptr;
                back = ptr;
                sp += len;
-       } while(cp);
+       } while (cp);
 }
 
 /*
@@ -1063,12 +1063,12 @@ static void pcbit_set_msn(struct pcbit_dev *dev, char *list)
 static int pcbit_check_msn(struct pcbit_dev *dev, char *msn)
 {
        struct msn_entry *ptr;
-       
-       for (ptr=dev->msn_list; ptr; ptr=ptr->next) {
 
-               if (ptr->msn == NULL) 
+       for (ptr = dev->msn_list; ptr; ptr = ptr->next) {
+
+               if (ptr->msn == NULL)
                        return 1;
-               
+
                if (strcmp(ptr->msn, msn) == 0)
                        return 1;
        }
index 80c9c16..b2262ba 100644 (file)
@@ -3,10 +3,10 @@
  * base: ITU-T Rec Q.931
  *
  * Copyright (C) 1996 Universidade de Lisboa
- * 
+ *
  * Written by Pedro Roque Marques (roque@di.fc.ul.pt)
  *
- * This software may be used and distributed according to the terms of 
+ * This software may be used and distributed according to the terms of
  * the GNU General Public License, incorporated herein by reference.
  */
 
 
 
 const char * const isdn_state_table[] = {
-  "Closed",
-  "Call initiated",
-  "Overlap sending",
-  "Outgoing call proceeding",
-  "NOT DEFINED",
-  "Call delivered",
-  "Call present",
-  "Call received",
-  "Connect request",
-  "Incoming call proceeding",
-  "Active",
-  "Disconnect request",
-  "Disconnect indication",
-  "NOT DEFINED",
-  "NOT DEFINED",
-  "Suspend request",
-  "NOT DEFINED",
-  "Resume request",
-  "NOT DEFINED",
-  "Release Request",
-  "NOT DEFINED",
-  "NOT DEFINED",
-  "NOT DEFINED",
-  "NOT DEFINED",
-  "NOT DEFINED",
-  "Overlap receiving",
-  "Select protocol on B-Channel",
-  "Activate B-channel protocol"
+       "Closed",
+       "Call initiated",
+       "Overlap sending",
+       "Outgoing call proceeding",
+       "NOT DEFINED",
+       "Call delivered",
+       "Call present",
+       "Call received",
+       "Connect request",
+       "Incoming call proceeding",
+       "Active",
+       "Disconnect request",
+       "Disconnect indication",
+       "NOT DEFINED",
+       "NOT DEFINED",
+       "Suspend request",
+       "NOT DEFINED",
+       "Resume request",
+       "NOT DEFINED",
+       "Release Request",
+       "NOT DEFINED",
+       "NOT DEFINED",
+       "NOT DEFINED",
+       "NOT DEFINED",
+       "NOT DEFINED",
+       "Overlap receiving",
+       "Select protocol on B-Channel",
+       "Activate B-channel protocol"
 };
 
 #ifdef DEBUG_ERRS
 static
 struct CauseValue {
-  byte nr;
-  char *descr;
-} cvlist[]={
-  {0x01,"Unallocated (unassigned) number"},
-  {0x02,"No route to specified transit network"},
-  {0x03,"No route to destination"},
-  {0x04,"Send special information tone"},
-  {0x05,"Misdialled trunk prefix"},
-  {0x06,"Channel unacceptable"},
-  {0x07,"Channel awarded and being delivered in an established channel"},
-  {0x08,"Preemption"},
-  {0x09,"Preemption - circuit reserved for reuse"},
-  {0x10,"Normal call clearing"},
-  {0x11,"User busy"},
-  {0x12,"No user responding"},
-  {0x13,"No answer from user (user alerted)"},
-  {0x14,"Subscriber absent"},
-  {0x15,"Call rejected"},
-  {0x16,"Number changed"},
-  {0x1a,"non-selected user clearing"},
-  {0x1b,"Destination out of order"},
-  {0x1c,"Invalid number format (address incomplete)"},
-  {0x1d,"Facility rejected"},
-  {0x1e,"Response to Status enquiry"},
-  {0x1f,"Normal, unspecified"},
-  {0x22,"No circuit/channel available"},
-  {0x26,"Network out of order"},
-  {0x27,"Permanent frame mode connection out-of-service"},
-  {0x28,"Permanent frame mode connection operational"},
-  {0x29,"Temporary failure"},
-  {0x2a,"Switching equipment congestion"},
-  {0x2b,"Access information discarded"},
-  {0x2c,"Requested circuit/channel not available"},
-  {0x2e,"Precedence call blocked"},
-  {0x2f,"Resource unavailable, unspecified"},
-  {0x31,"Quality of service unavailable"},
-  {0x32,"Requested facility not subscribed"},
-  {0x35,"Outgoing calls barred within CUG"},
-  {0x37,"Incoming calls barred within CUG"},
-  {0x39,"Bearer capability not authorized"},
-  {0x3a,"Bearer capability not presently available"},
-  {0x3e,"Inconsistency in designated outgoing access information and subscriber class"},
-  {0x3f,"Service or option not available, unspecified"},
-  {0x41,"Bearer capability not implemented"},
-  {0x42,"Channel type not implemented"},
-  {0x43,"Requested facility not implemented"},
-  {0x44,"Only restricted digital information bearer capability is available"},
-  {0x4f,"Service or option not implemented"},
-  {0x51,"Invalid call reference value"},
-  {0x52,"Identified channel does not exist"},
-  {0x53,"A suspended call exists, but this call identity does not"},
-  {0x54,"Call identity in use"},
-  {0x55,"No call suspended"},
-  {0x56,"Call having the requested call identity has been cleared"},
-  {0x57,"User not member of CUG"},
-  {0x58,"Incompatible destination"},
-  {0x5a,"Non-existent CUG"},
-  {0x5b,"Invalid transit network selection"},
-  {0x5f,"Invalid message, unspecified"},
-  {0x60,"Mandatory information element is missing"},
-  {0x61,"Message type non-existent or not implemented"},
-  {0x62,"Message not compatible with call state or message type non-existent or not implemented"},
-  {0x63,"Information element/parameter non-existent or not implemented"},
-  {0x64,"Invalid information element contents"},
-  {0x65,"Message not compatible with call state"},
-  {0x66,"Recovery on timer expiry"},
-  {0x67,"Parameter non-existent or not implemented - passed on"},
-  {0x6e,"Message with unrecognized parameter discarded"},
-  {0x6f,"Protocol error, unspecified"},
-  {0x7f,"Interworking, unspecified"}
+       byte nr;
+       char *descr;
+} cvlist[] = {
+       {0x01, "Unallocated (unassigned) number"},
+       {0x02, "No route to specified transit network"},
+       {0x03, "No route to destination"},
+       {0x04, "Send special information tone"},
+       {0x05, "Misdialled trunk prefix"},
+       {0x06, "Channel unacceptable"},
+       {0x07, "Channel awarded and being delivered in an established channel"},
+       {0x08, "Preemption"},
+       {0x09, "Preemption - circuit reserved for reuse"},
+       {0x10, "Normal call clearing"},
+       {0x11, "User busy"},
+       {0x12, "No user responding"},
+       {0x13, "No answer from user (user alerted)"},
+       {0x14, "Subscriber absent"},
+       {0x15, "Call rejected"},
+       {0x16, "Number changed"},
+       {0x1a, "non-selected user clearing"},
+       {0x1b, "Destination out of order"},
+       {0x1c, "Invalid number format (address incomplete)"},
+       {0x1d, "Facility rejected"},
+       {0x1e, "Response to Status enquiry"},
+       {0x1f, "Normal, unspecified"},
+       {0x22, "No circuit/channel available"},
+       {0x26, "Network out of order"},
+       {0x27, "Permanent frame mode connection out-of-service"},
+       {0x28, "Permanent frame mode connection operational"},
+       {0x29, "Temporary failure"},
+       {0x2a, "Switching equipment congestion"},
+       {0x2b, "Access information discarded"},
+       {0x2c, "Requested circuit/channel not available"},
+       {0x2e, "Precedence call blocked"},
+       {0x2f, "Resource unavailable, unspecified"},
+       {0x31, "Quality of service unavailable"},
+       {0x32, "Requested facility not subscribed"},
+       {0x35, "Outgoing calls barred within CUG"},
+       {0x37, "Incoming calls barred within CUG"},
+       {0x39, "Bearer capability not authorized"},
+       {0x3a, "Bearer capability not presently available"},
+       {0x3e, "Inconsistency in designated outgoing access information and subscriber class"},
+       {0x3f, "Service or option not available, unspecified"},
+       {0x41, "Bearer capability not implemented"},
+       {0x42, "Channel type not implemented"},
+       {0x43, "Requested facility not implemented"},
+       {0x44, "Only restricted digital information bearer capability is available"},
+       {0x4f, "Service or option not implemented"},
+       {0x51, "Invalid call reference value"},
+       {0x52, "Identified channel does not exist"},
+       {0x53, "A suspended call exists, but this call identity does not"},
+       {0x54, "Call identity in use"},
+       {0x55, "No call suspended"},
+       {0x56, "Call having the requested call identity has been cleared"},
+       {0x57, "User not member of CUG"},
+       {0x58, "Incompatible destination"},
+       {0x5a, "Non-existent CUG"},
+       {0x5b, "Invalid transit network selection"},
+       {0x5f, "Invalid message, unspecified"},
+       {0x60, "Mandatory information element is missing"},
+       {0x61, "Message type non-existent or not implemented"},
+       {0x62, "Message not compatible with call state or message type non-existent or not implemented"},
+       {0x63, "Information element/parameter non-existent or not implemented"},
+       {0x64, "Invalid information element contents"},
+       {0x65, "Message not compatible with call state"},
+       {0x66, "Recovery on timer expiry"},
+       {0x67, "Parameter non-existent or not implemented - passed on"},
+       {0x6e, "Message with unrecognized parameter discarded"},
+       {0x6f, "Protocol error, unspecified"},
+       {0x7f, "Interworking, unspecified"}
 };
 
 #endif
 
 static struct isdn_event_desc {
-  unsigned short ev;
-  char * desc;
-} isdn_event_table [] = {
-  {EV_USR_SETUP_REQ,     "CC->L3: Setup Request"},
-  {EV_USR_SETUP_RESP,    "CC->L3: Setup Response"},
-  {EV_USR_PROCED_REQ,    "CC->L3: Proceeding Request"},
-  {EV_USR_RELEASE_REQ,   "CC->L3: Release Request"},
-
-  {EV_NET_SETUP,        "NET->TE: setup "},
-  {EV_NET_CALL_PROC,    "NET->TE: call proceeding"},
-  {EV_NET_SETUP_ACK,    "NET->TE: setup acknowledge (more info needed)"},
-  {EV_NET_CONN,         "NET->TE: connect"},
-  {EV_NET_CONN_ACK,     "NET->TE: connect acknowledge"},
-  {EV_NET_DISC,         "NET->TE: disconnect indication"},
-  {EV_NET_RELEASE,      "NET->TE: release"},
-  {EV_NET_RELEASE_COMP, "NET->TE: release complete"},
-  {EV_NET_SELP_RESP,    "Board: Select B-channel protocol ack"},
-  {EV_NET_ACTV_RESP,    "Board: Activate B-channel protocol ack"},
-  {EV_TIMER,            "Timeout"},
-  {0, "NULL"}
+       unsigned short ev;
+       char *desc;
+} isdn_event_table[] = {
+       {EV_USR_SETUP_REQ,     "CC->L3: Setup Request"},
+       {EV_USR_SETUP_RESP,    "CC->L3: Setup Response"},
+       {EV_USR_PROCED_REQ,    "CC->L3: Proceeding Request"},
+       {EV_USR_RELEASE_REQ,   "CC->L3: Release Request"},
+
+       {EV_NET_SETUP,        "NET->TE: setup "},
+       {EV_NET_CALL_PROC,    "NET->TE: call proceeding"},
+       {EV_NET_SETUP_ACK,    "NET->TE: setup acknowledge (more info needed)"},
+       {EV_NET_CONN,         "NET->TE: connect"},
+       {EV_NET_CONN_ACK,     "NET->TE: connect acknowledge"},
+       {EV_NET_DISC,         "NET->TE: disconnect indication"},
+       {EV_NET_RELEASE,      "NET->TE: release"},
+       {EV_NET_RELEASE_COMP, "NET->TE: release complete"},
+       {EV_NET_SELP_RESP,    "Board: Select B-channel protocol ack"},
+       {EV_NET_ACTV_RESP,    "Board: Activate B-channel protocol ack"},
+       {EV_TIMER,            "Timeout"},
+       {0, "NULL"}
 };
 
-char * strisdnevent(ushort ev)
+char *strisdnevent(ushort ev)
 {
-  struct isdn_event_desc * entry;
-  for (entry = isdn_event_table; entry->ev; entry++)
-    if (entry->ev == ev)
-      break;
+       struct isdn_event_desc *entry;
+
+       for (entry = isdn_event_table; entry->ev; entry++)
+               if (entry->ev == ev)
+                       break;
 
-  return entry->desc;
+       return entry->desc;
 }
 
 /*
@@ -180,130 +180,130 @@ char * strisdnevent(ushort ev)
  */
 
 static struct fsm_timer_entry fsm_timers[] = {
-  {ST_CALL_PROC, 10},
-  {ST_DISC_REQ, 2},
-  {ST_ACTIVE_SELP, 5},
-  {ST_ACTIVE_ACTV, 5},
-  {ST_INCM_PROC, 10},
-  {ST_CONN_REQ, 2},
-  {0xff, 0}
+       {ST_CALL_PROC, 10},
+       {ST_DISC_REQ, 2},
+       {ST_ACTIVE_SELP, 5},
+       {ST_ACTIVE_ACTV, 5},
+       {ST_INCM_PROC, 10},
+       {ST_CONN_REQ, 2},
+       {0xff, 0}
 };
 
 static struct fsm_entry fsm_table[] = {
 /* Connect Phase */
-  /* Outgoing */
-  {ST_NULL, ST_CALL_INIT, EV_USR_SETUP_REQ, cb_out_1},
+       /* Outgoing */
+       {ST_NULL, ST_CALL_INIT, EV_USR_SETUP_REQ, cb_out_1},
 
-  {ST_CALL_INIT, ST_OVER_SEND, EV_NET_SETUP_ACK, cb_notdone},
-  {ST_CALL_INIT, ST_CALL_PROC, EV_NET_CALL_PROC, NULL},
-  {ST_CALL_INIT, ST_NULL, EV_NET_DISC, cb_out_2},
+       {ST_CALL_INIT, ST_OVER_SEND, EV_NET_SETUP_ACK, cb_notdone},
+       {ST_CALL_INIT, ST_CALL_PROC, EV_NET_CALL_PROC, NULL},
+       {ST_CALL_INIT, ST_NULL, EV_NET_DISC, cb_out_2},
 
-  {ST_CALL_PROC, ST_ACTIVE_SELP, EV_NET_CONN, cb_out_2},
-  {ST_CALL_PROC, ST_NULL, EV_NET_DISC, cb_disc_1},
-  {ST_CALL_PROC, ST_DISC_REQ, EV_USR_RELEASE_REQ, cb_disc_2},
+       {ST_CALL_PROC, ST_ACTIVE_SELP, EV_NET_CONN, cb_out_2},
+       {ST_CALL_PROC, ST_NULL, EV_NET_DISC, cb_disc_1},
+       {ST_CALL_PROC, ST_DISC_REQ, EV_USR_RELEASE_REQ, cb_disc_2},
 
-  /* Incoming */
-  {ST_NULL, ST_CALL_PRES, EV_NET_SETUP, NULL},
+       /* Incoming */
+       {ST_NULL, ST_CALL_PRES, EV_NET_SETUP, NULL},
 
-  {ST_CALL_PRES, ST_INCM_PROC, EV_USR_PROCED_REQ, cb_in_1},
-  {ST_CALL_PRES, ST_DISC_REQ, EV_USR_RELEASE_REQ, cb_disc_2},
+       {ST_CALL_PRES, ST_INCM_PROC, EV_USR_PROCED_REQ, cb_in_1},
+       {ST_CALL_PRES, ST_DISC_REQ, EV_USR_RELEASE_REQ, cb_disc_2},
 
-  {ST_INCM_PROC, ST_CONN_REQ, EV_USR_SETUP_RESP, cb_in_2},
-  {ST_INCM_PROC, ST_DISC_REQ, EV_USR_RELEASE_REQ, cb_disc_2},
+       {ST_INCM_PROC, ST_CONN_REQ, EV_USR_SETUP_RESP, cb_in_2},
+       {ST_INCM_PROC, ST_DISC_REQ, EV_USR_RELEASE_REQ, cb_disc_2},
 
-  {ST_CONN_REQ, ST_ACTIVE_SELP, EV_NET_CONN_ACK, cb_in_3},
+       {ST_CONN_REQ, ST_ACTIVE_SELP, EV_NET_CONN_ACK, cb_in_3},
 
-  /* Active */
-  {ST_ACTIVE, ST_NULL, EV_NET_DISC, cb_disc_1},
-  {ST_ACTIVE, ST_DISC_REQ, EV_USR_RELEASE_REQ, cb_disc_2},
-  {ST_ACTIVE, ST_NULL, EV_NET_RELEASE, cb_disc_3},
+       /* Active */
+       {ST_ACTIVE, ST_NULL, EV_NET_DISC, cb_disc_1},
+       {ST_ACTIVE, ST_DISC_REQ, EV_USR_RELEASE_REQ, cb_disc_2},
+       {ST_ACTIVE, ST_NULL, EV_NET_RELEASE, cb_disc_3},
 
-  /* Disconnect */
+       /* Disconnect */
 
-  {ST_DISC_REQ, ST_NULL, EV_NET_DISC, cb_disc_1},
-  {ST_DISC_REQ, ST_NULL, EV_NET_RELEASE, cb_disc_3},
+       {ST_DISC_REQ, ST_NULL, EV_NET_DISC, cb_disc_1},
+       {ST_DISC_REQ, ST_NULL, EV_NET_RELEASE, cb_disc_3},
 
-  /* protocol selection */
-  {ST_ACTIVE_SELP, ST_ACTIVE_ACTV, EV_NET_SELP_RESP, cb_selp_1},
-  {ST_ACTIVE_SELP, ST_DISC_REQ, EV_USR_RELEASE_REQ, cb_disc_2},
+       /* protocol selection */
+       {ST_ACTIVE_SELP, ST_ACTIVE_ACTV, EV_NET_SELP_RESP, cb_selp_1},
+       {ST_ACTIVE_SELP, ST_DISC_REQ, EV_USR_RELEASE_REQ, cb_disc_2},
 
-  {ST_ACTIVE_ACTV, ST_ACTIVE, EV_NET_ACTV_RESP, cb_open},
-  {ST_ACTIVE_ACTV, ST_DISC_REQ, EV_USR_RELEASE_REQ, cb_disc_2},
+       {ST_ACTIVE_ACTV, ST_ACTIVE, EV_NET_ACTV_RESP, cb_open},
+       {ST_ACTIVE_ACTV, ST_DISC_REQ, EV_USR_RELEASE_REQ, cb_disc_2},
 
-  /* Timers */
-  {ST_CALL_PROC, ST_DISC_REQ, EV_TIMER, cb_disc_2},
-  {ST_DISC_REQ, ST_NULL, EV_TIMER, cb_disc_3},
-  {ST_ACTIVE_SELP, ST_DISC_REQ, EV_TIMER, cb_disc_2},
-  {ST_ACTIVE_ACTV, ST_DISC_REQ, EV_TIMER, cb_disc_2},        
-  {ST_INCM_PROC, ST_DISC_REQ, EV_TIMER, cb_disc_2},
-  {ST_CONN_REQ, ST_CONN_REQ, EV_TIMER, cb_in_2},
-        
-  {0xff, 0, 0, NULL}
+       /* Timers */
+       {ST_CALL_PROC, ST_DISC_REQ, EV_TIMER, cb_disc_2},
+       {ST_DISC_REQ, ST_NULL, EV_TIMER, cb_disc_3},
+       {ST_ACTIVE_SELP, ST_DISC_REQ, EV_TIMER, cb_disc_2},
+       {ST_ACTIVE_ACTV, ST_DISC_REQ, EV_TIMER, cb_disc_2},
+       {ST_INCM_PROC, ST_DISC_REQ, EV_TIMER, cb_disc_2},
+       {ST_CONN_REQ, ST_CONN_REQ, EV_TIMER, cb_in_2},
+
+       {0xff, 0, 0, NULL}
 };
 
 
 static void pcbit_fsm_timer(unsigned long data)
 {
-        struct pcbit_dev *dev;
-        struct pcbit_chan *chan;
+       struct pcbit_dev *dev;
+       struct pcbit_chan *chan;
 
-        chan = (struct pcbit_chan *) data;
+       chan = (struct pcbit_chan *) data;
 
-        del_timer(&chan->fsm_timer);
-        chan->fsm_timer.function = NULL;
+       del_timer(&chan->fsm_timer);
+       chan->fsm_timer.function = NULL;
 
-        dev = chan2dev(chan);
+       dev = chan2dev(chan);
 
-        if (dev == NULL) {
-                printk(KERN_WARNING "pcbit: timer for unknown device\n");
-                return;
-        }
+       if (dev == NULL) {
+               printk(KERN_WARNING "pcbit: timer for unknown device\n");
+               return;
+       }
 
-        pcbit_fsm_event(dev, chan, EV_TIMER, NULL);
+       pcbit_fsm_event(dev, chan, EV_TIMER, NULL);
 }
 
 
 void pcbit_fsm_event(struct pcbit_dev *dev, struct pcbit_chan *chan,
-                  unsigned short event, struct callb_data *data)
+                    unsigned short event, struct callb_data *data)
 {
-       struct fsm_entry * action;      
+       struct fsm_entry *action;
        struct fsm_timer_entry *tentry;
        unsigned long flags;
 
        spin_lock_irqsave(&dev->lock, flags);
 
-        for (action = fsm_table; action->init != 0xff; action++)
-                if (action->init == chan->fsm_state && action->event == event)
-                        break;
-  
+       for (action = fsm_table; action->init != 0xff; action++)
+               if (action->init == chan->fsm_state && action->event == event)
+                       break;
+
        if (action->init == 0xff) {
-               
+
                spin_unlock_irqrestore(&dev->lock, flags);
-               printk(KERN_DEBUG "fsm error: event %x on state %x\n", 
-                       event, chan->fsm_state);
+               printk(KERN_DEBUG "fsm error: event %x on state %x\n",
+                      event, chan->fsm_state);
                return;
        }
 
-        if (chan->fsm_timer.function) {
-                del_timer(&chan->fsm_timer);
-                chan->fsm_timer.function = NULL;
-        }
+       if (chan->fsm_timer.function) {
+               del_timer(&chan->fsm_timer);
+               chan->fsm_timer.function = NULL;
+       }
 
        chan->fsm_state = action->final;
-  
+
        pcbit_state_change(dev, chan, action->init, event, action->final);
 
-        for (tentry = fsm_timers; tentry->init != 0xff; tentry++)
-                if (tentry->init == chan->fsm_state)
-                        break;
+       for (tentry = fsm_timers; tentry->init != 0xff; tentry++)
+               if (tentry->init == chan->fsm_state)
+                       break;
 
-        if (tentry->init != 0xff) {
-                init_timer(&chan->fsm_timer);
-                chan->fsm_timer.function = &pcbit_fsm_timer;
-                chan->fsm_timer.data = (ulong) chan;
-                chan->fsm_timer.expires = jiffies + tentry->timeout * HZ;
-                add_timer(&chan->fsm_timer);
-        }
+       if (tentry->init != 0xff) {
+               init_timer(&chan->fsm_timer);
+               chan->fsm_timer.function = &pcbit_fsm_timer;
+               chan->fsm_timer.data = (ulong) chan;
+               chan->fsm_timer.expires = jiffies + tentry->timeout * HZ;
+               add_timer(&chan->fsm_timer);
+       }
 
        spin_unlock_irqrestore(&dev->lock, flags);
 
@@ -311,7 +311,3 @@ void pcbit_fsm_event(struct pcbit_dev *dev, struct pcbit_chan *chan,
                action->callb(dev, chan, data);
 
 }
-
-
-
-
index 39f8346..2f6b3a8 100644 (file)
@@ -2,10 +2,10 @@
  * DSS.1 module definitions
  *
  * Copyright (C) 1996 Universidade de Lisboa
- * 
+ *
  * Written by Pedro Roque Marques (roque@di.fc.ul.pt)
  *
- * This software may be used and distributed according to the terms of 
+ * This software may be used and distributed according to the terms of
  * the GNU General Public License, incorporated herein by reference.
  */
 
@@ -62,9 +62,9 @@
 /*
  *  Cause values
  *  only the ones we use
- */ 
+ */
 
-#define CAUSE_NORMAL          0x10U 
+#define CAUSE_NORMAL          0x10U
 #define CAUSE_NOCHAN          0x22U
 
 struct callb_data {
@@ -94,9 +94,6 @@ extern const char * const isdn_state_table[];
 
 void pcbit_fsm_event(struct pcbit_dev *, struct pcbit_chan *,
                     unsigned short event, struct callb_data *);
-char * strisdnevent(ushort ev);
+char *strisdnevent(ushort ev);
 
 #endif
-
-
-
index 30f0f45..682911f 100644 (file)
@@ -12,7 +12,7 @@
 /*
  * 19991203 - Fernando Carvalho - takion@superbofh.org
  * Hacked to compile with egcs and run with current version of isdn modules
-*/
+ */
 
 /*
  *        Based on documentation provided by Inesc:
@@ -77,7 +77,7 @@ pcbit_l2_write(struct pcbit_dev *dev, ulong msg, ushort refnum,
               struct sk_buff *skb, unsigned short hdr_len)
 {
        struct frame_buf *frame,
-       *ptr;
+               *ptr;
        unsigned long flags;
 
        if (dev->l2_state != L2_RUNNING && dev->l2_state != L2_LOADING) {
@@ -85,7 +85,7 @@ pcbit_l2_write(struct pcbit_dev *dev, ulong msg, ushort refnum,
                return -1;
        }
        if ((frame = kmalloc(sizeof(struct frame_buf),
-                                                 GFP_ATOMIC)) == NULL) {
+                            GFP_ATOMIC)) == NULL) {
                printk(KERN_WARNING "pcbit_2_write: kmalloc failed\n");
                dev_kfree_skb(skb);
                return -1;
@@ -147,7 +147,7 @@ pcbit_transmit(struct pcbit_dev *dev)
        int flen;               /* fragment frame length including all headers */
        int free;
        int count,
-        cp_len;
+               cp_len;
        unsigned long flags;
        unsigned short tt;
 
@@ -177,7 +177,7 @@ pcbit_transmit(struct pcbit_dev *dev)
 
                        /* Type 0 frame */
 
-                       ulong   msg;
+                       ulong   msg;
 
                        if (frame->skb)
                                flen = FRAME_HDR_LEN + PREHDR_LEN + frame->skb->len;
@@ -270,7 +270,7 @@ pcbit_transmit(struct pcbit_dev *dev)
                spin_unlock_irqrestore(&dev->lock, flags);
 #ifdef DEBUG
                printk(KERN_DEBUG "unacked %d free %d write_queue %s\n",
-                    unacked, dev->free, dev->write_queue ? "not empty" :
+                      unacked, dev->free, dev->write_queue ? "not empty" :
                       "empty");
 #endif
        }
@@ -301,8 +301,8 @@ pcbit_deliver(struct work_struct *work)
                SET_MSG_CMD(msg, frame->skb->data[2]);
                SET_MSG_SCMD(msg, frame->skb->data[3]);
 
-               frame->refnum = *((ushort *) frame->skb->data + 4);
-               frame->msg = *((ulong *) & msg);
+               frame->refnum = *((ushort *)frame->skb->data + 4);
+               frame->msg = *((ulong *)&msg);
 
                skb_pull(frame->skb, 6);
 
@@ -326,7 +326,7 @@ pcbit_receive(struct pcbit_dev *dev)
 {
        unsigned short tt;
        u_char cpu,
-        proc;
+               proc;
        struct frame_buf *frame = NULL;
        unsigned long flags;
        u_char type1;
@@ -378,10 +378,10 @@ pcbit_receive(struct pcbit_dev *dev)
                frame->dt_len = pcbit_readw(dev);
 
                /*
-                  * 0 sized packet
-                  * I don't know if they are an error or not...
-                  * But they are very frequent
-                  * Not documented
+                * 0 sized packet
+                * I don't know if they are an error or not...
+                * But they are very frequent
+                * Not documented
                 */
 
                if (frame->hdr_len == 0) {
@@ -499,8 +499,8 @@ pcbit_irq_handler(int interrupt, void *devptr)
 {
        struct pcbit_dev *dev;
        u_char info,
-        ack_seq,
-        read_seq;
+               ack_seq,
+               read_seq;
 
        dev = (struct pcbit_dev *) devptr;
 
@@ -666,7 +666,7 @@ static void
 pcbit_recv_ack(struct pcbit_dev *dev, unsigned char ack)
 {
        int i,
-        count;
+               count;
        int unacked;
 
        unacked = (dev->send_seq + (8 - dev->unack_seq)) & 0x07;
@@ -678,13 +678,13 @@ pcbit_recv_ack(struct pcbit_dev *dev, unsigned char ack)
                if (dev->send_seq > dev->unack_seq) {
                        if (ack <= dev->unack_seq || ack > dev->send_seq) {
                                printk(KERN_DEBUG
-                                    "layer 2 ack unacceptable - dev %d",
+                                      "layer 2 ack unacceptable - dev %d",
                                       dev->id);
 
                                pcbit_l2_error(dev);
                        } else if (ack > dev->send_seq && ack <= dev->unack_seq) {
                                printk(KERN_DEBUG
-                                    "layer 2 ack unacceptable - dev %d",
+                                      "layer 2 ack unacceptable - dev %d",
                                       dev->id);
                                pcbit_l2_error(dev);
                        }
index 2ac295e..be1327b 100644 (file)
@@ -2,17 +2,17 @@
  * PCBIT-D low-layer interface definitions
  *
  * Copyright (C) 1996 Universidade de Lisboa
- * 
+ *
  * Written by Pedro Roque Marques (roque@di.fc.ul.pt)
  *
- * This software may be used and distributed according to the terms of 
+ * This software may be used and distributed according to the terms of
  * the GNU General Public License, incorporated herein by reference.
  */
 
 /*
  * 19991203 - Fernando Carvalho - takion@superbofh.org
  * Hacked to compile with egcs and run with current version of isdn modules
-*/
+ */
 
 #ifndef LAYER2_H
 #define LAYER2_H
@@ -37,8 +37,8 @@
 
 /* TAM - XX - C - S  - NUM */
 #define PREHDR_LEN 8
-/* TT  - M  - I - TH - TD  */      
-#define FRAME_HDR_LEN  8   
+/* TT  - M  - I - TH - TD  */
+#define FRAME_HDR_LEN  8
 
 #define MSG_CONN_REQ           0x08000100
 #define MSG_CONN_CONF          0x00000101
 #define MSG_DEBUG_188           0x0000ff00
 
 /*
-   
-   long  4 3 2 1
-   Intel 1 2 3 4
+
+  long  4 3 2 1
+  Intel 1 2 3 4
 */
 
 #ifdef __LITTLE_ENDIAN
-#define SET_MSG_SCMD(msg, ch)  (msg = (msg & 0xffffff00) | (((ch) & 0xff)))
-#define SET_MSG_CMD(msg, ch)   (msg = (msg & 0xffff00ff) | (((ch) & 0xff) << 8))
-#define SET_MSG_PROC(msg, ch)  (msg = (msg & 0xff00ffff) | (((ch) & 0xff) << 16))
-#define SET_MSG_CPU(msg, ch)   (msg = (msg & 0x00ffffff) | (((ch) & 0xff) << 24))
+#define SET_MSG_SCMD(msg, ch)  (msg = (msg & 0xffffff00) | (((ch) & 0xff)))
+#define SET_MSG_CMD(msg, ch)   (msg = (msg & 0xffff00ff) | (((ch) & 0xff) << 8))
+#define SET_MSG_PROC(msg, ch)  (msg = (msg & 0xff00ffff) | (((ch) & 0xff) << 16))
+#define SET_MSG_CPU(msg, ch)   (msg = (msg & 0x00ffffff) | (((ch) & 0xff) << 24))
 
-#define GET_MSG_SCMD(msg)      ((msg) & 0xFF)
-#define GET_MSG_CMD(msg)       ((msg) >> 8 & 0xFF)
-#define GET_MSG_PROC(msg)      ((msg) >> 16 & 0xFF)
-#define GET_MSG_CPU(msg)       ((msg) >> 24)
+#define GET_MSG_SCMD(msg)      ((msg) & 0xFF)
+#define GET_MSG_CMD(msg)       ((msg) >> 8 & 0xFF)
+#define GET_MSG_PROC(msg)      ((msg) >> 16 & 0xFF)
+#define GET_MSG_CPU(msg)       ((msg) >> 24)
 
 #else
 #error "Non-Intel CPU"
 #define SCHED_READ    0x01
 #define SCHED_WRITE   0x02
 
-#define SET_RUN_TIMEOUT 2*HZ /* 2 seconds */
-     
+#define SET_RUN_TIMEOUT 2 * HZ /* 2 seconds */
+
 struct frame_buf {
-        ulong msg;
-        unsigned int refnum;
-        unsigned int dt_len;
-        unsigned int hdr_len;
-        struct sk_buff *skb;
+       ulong msg;
+       unsigned int refnum;
+       unsigned int dt_len;
+       unsigned int hdr_len;
+       struct sk_buff *skb;
        unsigned int copied;
-        struct frame_buf * next;
+       struct frame_buf *next;
 };
 
-extern int pcbit_l2_write(struct pcbit_dev * dev, ulong msg, ushort refnum, 
-                          struct sk_buff *skb, unsigned short hdr_len);
+extern int pcbit_l2_write(struct pcbit_dev *dev, ulong msg, ushort refnum,
+                         struct sk_buff *skb, unsigned short hdr_len);
 
 extern irqreturn_t pcbit_irq_handler(int interrupt, void *);
 
-extern struct pcbit_dev * dev_pcbit[MAX_PCBIT_CARDS];
+extern struct pcbit_dev *dev_pcbit[MAX_PCBIT_CARDS];
 
 #ifdef DEBUG
 static __inline__ void log_state(struct pcbit_dev *dev) {
-        printk(KERN_DEBUG "writeptr = %ld\n", 
+       printk(KERN_DEBUG "writeptr = %ld\n",
               (ulong) (dev->writeptr - dev->sh_mem));
-        printk(KERN_DEBUG "readptr  = %ld\n", 
+       printk(KERN_DEBUG "readptr  = %ld\n",
               (ulong) (dev->readptr - (dev->sh_mem + BANK2)));
-        printk(KERN_DEBUG "{rcv_seq=%01x, send_seq=%01x, unack_seq=%01x}\n", 
+       printk(KERN_DEBUG "{rcv_seq=%01x, send_seq=%01x, unack_seq=%01x}\n",
               dev->rcv_seq, dev->send_seq, dev->unack_seq);
 }
 #endif
 
-static __inline__ struct pcbit_dev * chan2dev(struct pcbit_chan * chan) 
+static __inline__ struct pcbit_dev *chan2dev(struct pcbit_chan *chan)
 {
-        struct pcbit_dev * dev;
-        int i;
+       struct pcbit_dev *dev;
+       int i;
 
 
-        for (i=0; i<MAX_PCBIT_CARDS; i++)
-                if ((dev=dev_pcbit[i]))
-                        if (dev->b1 == chan || dev->b2 == chan)
-                                return dev;
-        return NULL;
+       for (i = 0; i < MAX_PCBIT_CARDS; i++)
+               if ((dev = dev_pcbit[i]))
+                       if (dev->b1 == chan || dev->b2 == chan)
+                               return dev;
+       return NULL;
 
 }
 
-static __inline__ struct pcbit_dev * finddev(int id)
+static __inline__ struct pcbit_dev *finddev(int id)
 {
-  struct pcbit_dev * dev;
-  int i;
-
-  for (i=0; i<MAX_PCBIT_CARDS; i++)
-    if ((dev=dev_pcbit[i]))
-      if (dev->id == id)
-       return dev;
-  return NULL;
+       struct pcbit_dev *dev;
+       int i;
+
+       for (i = 0; i < MAX_PCBIT_CARDS; i++)
+               if ((dev = dev_pcbit[i]))
+                       if (dev->id == id)
+                               return dev;
+       return NULL;
 }
 
 
@@ -172,117 +172,110 @@ static __inline__ struct pcbit_dev * finddev(int id)
 
 static __inline__ void pcbit_writeb(struct pcbit_dev *dev, unsigned char dt)
 {
-  writeb(dt, dev->writeptr++);
-  if (dev->writeptr == dev->sh_mem + BANKLEN)
-    dev->writeptr = dev->sh_mem;
+       writeb(dt, dev->writeptr++);
+       if (dev->writeptr == dev->sh_mem + BANKLEN)
+               dev->writeptr = dev->sh_mem;
 }
 
 static __inline__ void pcbit_writew(struct pcbit_dev *dev, unsigned short dt)
 {
-  int dist;
-
-  dist = BANKLEN - (dev->writeptr - dev->sh_mem);
-  switch (dist) {
-  case 2:
-    writew(dt, dev->writeptr);
-    dev->writeptr = dev->sh_mem;
-    break;
-  case 1:
-    writeb((u_char) (dt & 0x00ffU), dev->writeptr);    
-    dev->writeptr = dev->sh_mem;
-    writeb((u_char) (dt >> 8), dev->writeptr++);    
-    break;
-  default:
-    writew(dt, dev->writeptr);
-    dev->writeptr += 2;
-    break;
-  };
+       int dist;
+
+       dist = BANKLEN - (dev->writeptr - dev->sh_mem);
+       switch (dist) {
+       case 2:
+               writew(dt, dev->writeptr);
+               dev->writeptr = dev->sh_mem;
+               break;
+       case 1:
+               writeb((u_char) (dt & 0x00ffU), dev->writeptr);
+               dev->writeptr = dev->sh_mem;
+               writeb((u_char) (dt >> 8), dev->writeptr++);
+               break;
+       default:
+               writew(dt, dev->writeptr);
+               dev->writeptr += 2;
+               break;
+       };
 }
 
-static __inline__ void memcpy_topcbit(struct pcbit_dev * dev, u_char * data, 
+static __inline__ void memcpy_topcbit(struct pcbit_dev *dev, u_char *data,
                                      int len)
 {
-  int diff;
-
-  diff = len - (BANKLEN - (dev->writeptr - dev->sh_mem) );
-
-  if (diff > 0)
-    {
-      memcpy_toio(dev->writeptr, data, len - diff);
-      memcpy_toio(dev->sh_mem, data + (len - diff), diff);
-      dev->writeptr = dev->sh_mem + diff;
-    }
-  else
-    {
-      memcpy_toio(dev->writeptr, data, len);
-
-      dev->writeptr += len;
-      if (diff == 0)
-       dev->writeptr = dev->sh_mem;
-    }
+       int diff;
+
+       diff = len - (BANKLEN - (dev->writeptr - dev->sh_mem));
+
+       if (diff > 0)
+       {
+               memcpy_toio(dev->writeptr, data, len - diff);
+               memcpy_toio(dev->sh_mem, data + (len - diff), diff);
+               dev->writeptr = dev->sh_mem + diff;
+       }
+       else
+       {
+               memcpy_toio(dev->writeptr, data, len);
+
+               dev->writeptr += len;
+               if (diff == 0)
+                       dev->writeptr = dev->sh_mem;
+       }
 }
 
 static __inline__ unsigned char pcbit_readb(struct pcbit_dev *dev)
 {
-  unsigned char val;
+       unsigned char val;
 
-  val = readb(dev->readptr++);
-  if (dev->readptr == dev->sh_mem + BANK2 + BANKLEN)
-    dev->readptr = dev->sh_mem + BANK2;
+       val = readb(dev->readptr++);
+       if (dev->readptr == dev->sh_mem + BANK2 + BANKLEN)
+               dev->readptr = dev->sh_mem + BANK2;
 
-  return val;
+       return val;
 }
 
 static __inline__ unsigned short pcbit_readw(struct pcbit_dev *dev)
 {
-  int dist;
-  unsigned short val;
-
-  dist = BANKLEN - ( dev->readptr - (dev->sh_mem + BANK2 ) );
-  switch (dist) {
-  case 2:
-    val = readw(dev->readptr);
-    dev->readptr = dev->sh_mem + BANK2;
-    break;
-  case 1:
-    val = readb(dev->readptr);
-    dev->readptr = dev->sh_mem + BANK2;
-    val = (readb(dev->readptr++) << 8) | val;
-    break;
-  default:
-    val = readw(dev->readptr);
-    dev->readptr += 2;
-    break;
-  };
-  return val;
+       int dist;
+       unsigned short val;
+
+       dist = BANKLEN - (dev->readptr - (dev->sh_mem + BANK2));
+       switch (dist) {
+       case 2:
+               val = readw(dev->readptr);
+               dev->readptr = dev->sh_mem + BANK2;
+               break;
+       case 1:
+               val = readb(dev->readptr);
+               dev->readptr = dev->sh_mem + BANK2;
+               val = (readb(dev->readptr++) << 8) | val;
+               break;
+       default:
+               val = readw(dev->readptr);
+               dev->readptr += 2;
+               break;
+       };
+       return val;
 }
 
-static __inline__ void memcpy_frompcbit(struct pcbit_dev * dev, u_char * data, int len)
+static __inline__ void memcpy_frompcbit(struct pcbit_dev *dev, u_char *data, int len)
 {
-  int diff;
-
-  diff = len - (BANKLEN - (dev->readptr - (dev->sh_mem + BANK2) ) ); 
-  if (diff > 0)
-    {
-      memcpy_fromio(data, dev->readptr, len - diff);
-      memcpy_fromio(data + (len - diff), dev->sh_mem + BANK2 , diff);
-      dev->readptr = dev->sh_mem + BANK2 + diff;
-    }
-  else
-    {
-      memcpy_fromio(data, dev->readptr, len);
-      dev->readptr += len;
-      if (diff == 0)
-       dev->readptr = dev->sh_mem + BANK2;
-    }
+       int diff;
+
+       diff = len - (BANKLEN - (dev->readptr - (dev->sh_mem + BANK2)));
+       if (diff > 0)
+       {
+               memcpy_fromio(data, dev->readptr, len - diff);
+               memcpy_fromio(data + (len - diff), dev->sh_mem + BANK2 , diff);
+               dev->readptr = dev->sh_mem + BANK2 + diff;
+       }
+       else
+       {
+               memcpy_fromio(data, dev->readptr, len);
+               dev->readptr += len;
+               if (diff == 0)
+                       dev->readptr = dev->sh_mem + BANK2;
+       }
 }
 
 
 #endif
-
-
-
-
-
-
-
index 04ea241..0a59bd0 100644 (file)
@@ -2,10 +2,10 @@
  * PCBIT-D module support
  *
  * Copyright (C) 1996 Universidade de Lisboa
- * 
+ *
  * Written by Pedro Roque Marques (roque@di.fc.ul.pt)
  *
- * This software may be used and distributed according to the terms of 
+ * This software may be used and distributed according to the terms of
  * the GNU General Public License, incorporated herein by reference.
  */
 
@@ -29,7 +29,7 @@ module_param_array(mem, int, NULL, 0);
 module_param_array(irq, int, NULL, 0);
 
 static int num_boards;
-struct pcbit_dev * dev_pcbit[MAX_PCBIT_CARDS];
+struct pcbit_dev *dev_pcbit[MAX_PCBIT_CARDS];
 
 static int __init pcbit_init(void)
 {
@@ -37,26 +37,26 @@ static int __init pcbit_init(void)
 
        num_boards = 0;
 
-       printk(KERN_NOTICE 
+       printk(KERN_NOTICE
               "PCBIT-D device driver v 0.5-fjpc0 19991204 - "
               "Copyright (C) 1996 Universidade de Lisboa\n");
 
-       if (mem[0] || irq[0]) 
+       if (mem[0] || irq[0])
        {
-               for (board=0; board < MAX_PCBIT_CARDS && mem[board] && irq[board]; board++)
+               for (board = 0; board < MAX_PCBIT_CARDS && mem[board] && irq[board]; board++)
                {
                        if (!mem[board])
                                mem[board] = 0xD0000;
                        if (!irq[board])
                                irq[board] = 5;
-                       
+
                        if (pcbit_init_dev(board, mem[board], irq[board]) == 0)
                                num_boards++;
-               
-                       else 
+
+                       else
                        {
-                               printk(KERN_WARNING 
-                                      "pcbit_init failed for dev %d", 
+                               printk(KERN_WARNING
+                                      "pcbit_init failed for dev %d",
                                       board + 1);
                                return -EIO;
                        }
@@ -67,7 +67,7 @@ static int __init pcbit_init(void)
 
        if (!num_boards)
        {
-               printk(KERN_INFO 
+               printk(KERN_INFO
                       "Trying to detect board using default settings\n");
                if (pcbit_init_dev(0, 0xD0000, 5) == 0)
                        num_boards++;
@@ -84,7 +84,7 @@ static void __exit pcbit_exit(void)
 
        for (board = 0; board < num_boards; board++)
                pcbit_terminate(board);
-       printk(KERN_NOTICE 
+       printk(KERN_NOTICE
               "PCBIT-D module unloaded\n");
 #endif
 }
@@ -95,20 +95,20 @@ static int __init pcbit_setup(char *line)
 {
        int i, j, argc;
        char *str;
-       int ints[MAX_PARA+1];
+       int ints[MAX_PARA + 1];
 
        str = get_options(line, MAX_PARA, ints);
        argc = ints[0];
        i = 0;
        j = 1;
 
-       while (argc && (i<MAX_PCBIT_CARDS)) {
+       while (argc && (i < MAX_PCBIT_CARDS)) {
 
                if (argc) {
                        mem[i]  = ints[j];
                        j++; argc--;
                }
-               
+
                if (argc) {
                        irq[i]  = ints[j];
                        j++; argc--;
@@ -116,11 +116,10 @@ static int __init pcbit_setup(char *line)
 
                i++;
        }
-       return(1);
+       return (1);
 }
 __setup("pcbit=", pcbit_setup);
 #endif
 
 module_init(pcbit_init);
 module_exit(pcbit_exit);
-
index d76fffc..0a5a994 100644 (file)
@@ -2,10 +2,10 @@
  * PCBIT-D device driver definitions
  *
  * Copyright (C) 1996 Universidade de Lisboa
- * 
+ *
  * Written by Pedro Roque Marques (roque@di.fc.ul.pt)
  *
- * This software may be used and distributed according to the terms of 
+ * This software may be used and distributed according to the terms of
  * the GNU General Public License, incorporated herein by reference.
  */
 
@@ -32,14 +32,14 @@ struct pcbit_chan {
        unsigned short r_refnum;
        unsigned short fsm_state;
        struct timer_list fsm_timer;
-#ifdef  BLOCK_TIMER
+#ifdef BLOCK_TIMER
        struct timer_list block_timer;
 #endif
 };
 
 struct msn_entry {
        char *msn;
-       struct msn_entry * next;
+       struct msn_entry *next;
 };
 
 struct pcbit_dev {
@@ -49,15 +49,15 @@ struct pcbit_dev {
        unsigned long ph_mem;
        unsigned int irq;
        unsigned int id;
-       unsigned int interrupt;                 /* set during interrupt 
+       unsigned int interrupt;                 /* set during interrupt
                                                   processing */
        spinlock_t lock;
        /* isdn4linux */
 
-       struct msn_entry * msn_list;            /* ISDN address list */
-       
-       isdn_if * dev_if;
-       
+       struct msn_entry *msn_list;             /* ISDN address list */
+
+       isdn_if *dev_if;
+
        ushort ll_hdrlen;
        ushort hl_hdrlen;
 
@@ -89,17 +89,17 @@ struct pcbit_dev {
        unsigned char send_seq;
        unsigned char rcv_seq;
        unsigned char unack_seq;
-  
+
        unsigned short free;
 
        /* channels */
 
        struct pcbit_chan *b1;
-       struct pcbit_chan *b2;  
+       struct pcbit_chan *b2;
 };
 
-#define STATS_TIMER (10*HZ)
-#define ERRTIME     (HZ/10)
+#define STATS_TIMER (10 * HZ)
+#define ERRTIME     (HZ / 10)
 
 /* MRU */
 #define MAXBUFSIZE  1534
@@ -107,7 +107,7 @@ struct pcbit_dev {
 
 #define STATBUF_LEN 2048
 /*
- * 
+ *
  */
 
 #endif /* __KERNEL__ */
@@ -169,9 +169,9 @@ struct pcbit_ioctl {
 void pcbit_deliver(struct work_struct *work);
 int pcbit_init_dev(int board, int mem_base, int irq);
 void pcbit_terminate(int board);
-void pcbit_l3_receive(struct pcbit_dev * dev, ulong msg, struct sk_buff * skb,
+void pcbit_l3_receive(struct pcbit_dev *dev, ulong msg, struct sk_buff *skb,
                      ushort hdr_len, ushort refnum);
-void pcbit_state_change(struct pcbit_dev * dev, struct pcbit_chan * chan,
+void pcbit_state_change(struct pcbit_dev *dev, struct pcbit_chan *chan,
                        unsigned short i, unsigned short ev, unsigned short f);
 
 #endif
index 0120bcf..3da69ee 100644 (file)
@@ -118,7 +118,7 @@ int send_and_receive(int card, unsigned int procid, unsigned char type,
                     unsigned char class, unsigned char code,
                     unsigned char link, unsigned char data_len,
                     unsigned char *data,  RspMessage *mesgdata, int timeout);
-void flushreadfifo (int card);
+void flushreadfifo(int card);
 int sendmessage(int card, unsigned int procid, unsigned int type,
                unsigned int class, unsigned int code, unsigned int link,
                unsigned int data_len, unsigned int *data);
index 0e4969c..4a4e661 100644 (file)
@@ -69,14 +69,14 @@ int get_card_from_id(int driver)
 {
        int i;
 
-       for(i = 0 ; i < cinst ; i++) {
-               if(sc_adapter[i]->driverId == driver)
+       for (i = 0; i < cinst; i++) {
+               if (sc_adapter[i]->driverId == driver)
                        return i;
        }
        return -ENODEV;
 }
 
-/* 
+/*
  * command
  */
 
@@ -85,7 +85,7 @@ int command(isdn_ctrl *cmd)
        int card;
 
        card = get_card_from_id(cmd->driver);
-       if(!IS_VALID_CARD(card)) {
+       if (!IS_VALID_CARD(card)) {
                pr_debug("Invalid param: %d is not a valid card id\n", card);
                return -ENODEV;
        }
@@ -93,17 +93,17 @@ int command(isdn_ctrl *cmd)
        /*
         * Dispatch the command
         */
-       switch(cmd->command) {
+       switch (cmd->command) {
        case ISDN_CMD_IOCTL:
        {
-               unsigned long   cmdptr;
+               unsigned long   cmdptr;
                scs_ioctl       ioc;
 
                memcpy(&cmdptr, cmd->parm.num, sizeof(unsigned long));
                if (copy_from_user(&ioc, (scs_ioctl __user *)cmdptr,
                                   sizeof(scs_ioctl))) {
                        pr_debug("%s: Failed to verify user space 0x%lx\n",
-                               sc_adapter[card]->devicename, cmdptr);
+                                sc_adapter[card]->devicename, cmdptr);
                        return -EFAULT;
                }
                return sc_ioctl(card, &ioc);
@@ -133,76 +133,76 @@ int command(isdn_ctrl *cmd)
 /*
  * start the onboard firmware
  */
-int startproc(int card) 
+int startproc(int card)
 {
        int status;
 
-       if(!IS_VALID_CARD(card)) {
+       if (!IS_VALID_CARD(card)) {
                pr_debug("Invalid param: %d is not a valid card id\n", card);
                return -ENODEV;
        }
 
        /*
-        * send start msg 
+        * send start msg
         */
-               status = sendmessage(card, CMPID,cmReqType2,
-                         cmReqClass0,
-                         cmReqStartProc,
-                         0,0,NULL);
+       status = sendmessage(card, CMPID, cmReqType2,
+                            cmReqClass0,
+                            cmReqStartProc,
+                            0, 0, NULL);
        pr_debug("%s: Sent startProc\n", sc_adapter[card]->devicename);
-       
+
        return status;
 }
 
 
 /*
- * Dials the number passed in 
+ * Dials the number passed in
  */
 static int dial(int card, unsigned long channel, setup_parm setup)
 {
        int status;
        char Phone[48];
-  
-       if(!IS_VALID_CARD(card)) {
+
+       if (!IS_VALID_CARD(card)) {
                pr_debug("Invalid param: %d is not a valid card id\n", card);
                return -ENODEV;
        }
 
-       /*extract ISDN number to dial from eaz/msn string*/ 
-       strcpy(Phone,setup.phone); 
+       /*extract ISDN number to dial from eaz/msn string*/
+       strcpy(Phone, setup.phone);
 
        /*send the connection message*/
-       status = sendmessage(card, CEPID,ceReqTypePhy,
-                               ceReqClass1,
-                               ceReqPhyConnect,
-                               (unsigned char) channel+1, 
-                               strlen(Phone),
-                               (unsigned int *) Phone);
+       status = sendmessage(card, CEPID, ceReqTypePhy,
+                            ceReqClass1,
+                            ceReqPhyConnect,
+                            (unsigned char)channel + 1,
+                            strlen(Phone),
+                            (unsigned int *)Phone);
 
        pr_debug("%s: Dialing %s on channel %lu\n",
-               sc_adapter[card]->devicename, Phone, channel+1);
-       
+                sc_adapter[card]->devicename, Phone, channel + 1);
+
        return status;
 }
 
 /*
- * Answer an incoming call 
+ * Answer an incoming call
  */
 static int answer(int card, unsigned long channel)
 {
-       if(!IS_VALID_CARD(card)) {
+       if (!IS_VALID_CARD(card)) {
                pr_debug("Invalid param: %d is not a valid card id\n", card);
                return -ENODEV;
        }
 
-       if(setup_buffers(card, channel+1)) {
-               hangup(card, channel+1);
+       if (setup_buffers(card, channel + 1)) {
+               hangup(card, channel + 1);
                return -ENOBUFS;
        }
 
-       indicate_status(card, ISDN_STAT_BCONN,channel,NULL);
+       indicate_status(card, ISDN_STAT_BCONN, channel, NULL);
        pr_debug("%s: Answered incoming call on channel %lu\n",
-               sc_adapter[card]->devicename, channel+1);
+                sc_adapter[card]->devicename, channel + 1);
        return 0;
 }
 
@@ -213,19 +213,19 @@ static int hangup(int card, unsigned long channel)
 {
        int status;
 
-       if(!IS_VALID_CARD(card)) {
+       if (!IS_VALID_CARD(card)) {
                pr_debug("Invalid param: %d is not a valid card id\n", card);
                return -ENODEV;
        }
 
        status = sendmessage(card, CEPID, ceReqTypePhy,
-                                                ceReqClass1,
-                                                ceReqPhyDisconnect,
-                                                (unsigned char) channel+1,
-                                                0,
-                                                NULL);
+                            ceReqClass1,
+                            ceReqPhyDisconnect,
+                            (unsigned char)channel + 1,
+                            0,
+                            NULL);
        pr_debug("%s: Sent HANGUP message to channel %lu\n",
-               sc_adapter[card]->devicename, channel+1);
+                sc_adapter[card]->devicename, channel + 1);
        return status;
 }
 
@@ -234,10 +234,10 @@ static int hangup(int card, unsigned long channel)
  */
 static int setl2(int card, unsigned long arg)
 {
-       int status =0;
-       int protocol,channel;
+       int status = 0;
+       int protocol, channel;
 
-       if(!IS_VALID_CARD(card)) {
+       if (!IS_VALID_CARD(card)) {
                pr_debug("Invalid param: %d is not a valid card id\n", card);
                return -ENODEV;
        }
@@ -249,14 +249,14 @@ static int setl2(int card, unsigned long arg)
         * check that the adapter is also set to the correct protocol
         */
        pr_debug("%s: Sending GetFrameFormat for channel %d\n",
-               sc_adapter[card]->devicename, channel+1);
+                sc_adapter[card]->devicename, channel + 1);
        status = sendmessage(card, CEPID, ceReqTypeCall,
-                               ceReqClass0,
-                               ceReqCallGetFrameFormat,
-                               (unsigned char)channel+1,
-                               1,
-                               (unsigned int *) protocol);
-       if(status) 
+                            ceReqClass0,
+                            ceReqCallGetFrameFormat,
+                            (unsigned char)channel + 1,
+                            1,
+                            (unsigned int *)protocol);
+       if (status)
                return status;
        return 0;
 }
@@ -268,7 +268,7 @@ static int setl3(int card, unsigned long channel)
 {
        int protocol = channel >> 8;
 
-       if(!IS_VALID_CARD(card)) {
+       if (!IS_VALID_CARD(card)) {
                pr_debug("Invalid param: %d is not a valid card id\n", card);
                return -ENODEV;
        }
@@ -279,26 +279,26 @@ static int setl3(int card, unsigned long channel)
 
 static int acceptb(int card, unsigned long channel)
 {
-       if(!IS_VALID_CARD(card)) {
+       if (!IS_VALID_CARD(card)) {
                pr_debug("Invalid param: %d is not a valid card id\n", card);
                return -ENODEV;
        }
 
-       if(setup_buffers(card, channel+1))
+       if (setup_buffers(card, channel + 1))
        {
-               hangup(card, channel+1);
+               hangup(card, channel + 1);
                return -ENOBUFS;
        }
 
        pr_debug("%s: B-Channel connection accepted on channel %lu\n",
-               sc_adapter[card]->devicename, channel+1);
+                sc_adapter[card]->devicename, channel + 1);
        indicate_status(card, ISDN_STAT_BCONN, channel, NULL);
        return 0;
 }
 
 static int clreaz(int card, unsigned long arg)
 {
-       if(!IS_VALID_CARD(card)) {
+       if (!IS_VALID_CARD(card)) {
                pr_debug("Invalid param: %d is not a valid card id\n", card);
                return -ENODEV;
        }
@@ -306,13 +306,13 @@ static int clreaz(int card, unsigned long arg)
        strcpy(sc_adapter[card]->channel[arg].eazlist, "");
        sc_adapter[card]->channel[arg].eazclear = 1;
        pr_debug("%s: EAZ List cleared for channel %lu\n",
-               sc_adapter[card]->devicename, arg+1);
+                sc_adapter[card]->devicename, arg + 1);
        return 0;
 }
 
 static int seteaz(int card, unsigned long arg, char *num)
 {
-       if(!IS_VALID_CARD(card)) {
+       if (!IS_VALID_CARD(card)) {
                pr_debug("Invalid param: %d is not a valid card id\n", card);
                return -ENODEV;
        }
@@ -320,8 +320,8 @@ static int seteaz(int card, unsigned long arg, char *num)
        strcpy(sc_adapter[card]->channel[arg].eazlist, num);
        sc_adapter[card]->channel[arg].eazclear = 0;
        pr_debug("%s: EAZ list for channel %lu set to: %s\n",
-               sc_adapter[card]->devicename, arg+1,
-               sc_adapter[card]->channel[arg].eazlist);
+                sc_adapter[card]->devicename, arg + 1,
+                sc_adapter[card]->channel[arg].eazlist);
        return 0;
 }
 
@@ -329,14 +329,14 @@ int reset(int card)
 {
        unsigned long flags;
 
-       if(!IS_VALID_CARD(card)) {
+       if (!IS_VALID_CARD(card)) {
                pr_debug("Invalid param: %d is not a valid card id\n", card);
                return -ENODEV;
        }
 
        indicate_status(card, ISDN_STAT_STOP, 0, NULL);
 
-       if(sc_adapter[card]->EngineUp) {
+       if (sc_adapter[card]->EngineUp) {
                del_timer(&sc_adapter[card]->stat_timer);
        }
 
@@ -350,14 +350,14 @@ int reset(int card)
        add_timer(&sc_adapter[card]->reset_timer);
        spin_unlock_irqrestore(&sc_adapter[card]->lock, flags);
 
-       outb(0x1,sc_adapter[card]->ioport[SFT_RESET]);
+       outb(0x1, sc_adapter[card]->ioport[SFT_RESET]);
 
        pr_debug("%s: Adapter Reset\n", sc_adapter[card]->devicename);
        return 0;
 }
 
-void flushreadfifo (int card)
+void flushreadfifo(int card)
 {
-       while(inb(sc_adapter[card]->ioport[FIFO_STATUS]) & RF_HAS_DATA)
+       while (inb(sc_adapter[card]->ioport[FIFO_STATUS]) & RF_HAS_DATA)
                inb(sc_adapter[card]->ioport[FIFO_READ]);
 }
index 498f403..717003a 100644 (file)
@@ -38,26 +38,26 @@ static char *events[] = { "ISDN_STAT_STAVAIL",
                          "ISDN_STAT_CAUSE" };
 #endif
 
-int indicate_status(int card, int event,ulong Channel,char *Data)
+int indicate_status(int card, int event, ulong Channel, char *Data)
 {
        isdn_ctrl cmd;
 
 #ifdef DEBUG
        pr_debug("%s: Indicating event %s on Channel %d\n",
-               sc_adapter[card]->devicename, events[event-256], Channel);
+                sc_adapter[card]->devicename, events[event - 256], Channel);
 #endif
-       if (Data != NULL){
+       if (Data != NULL) {
                pr_debug("%s: Event data: %s\n", sc_adapter[card]->devicename,
-                       Data);
+                        Data);
                switch (event) {
-                       case ISDN_STAT_BSENT:
-                               memcpy(&cmd.parm.length, Data, sizeof(cmd.parm.length));
-                               break;
-                       case ISDN_STAT_ICALL:
-                               memcpy(&cmd.parm.setup, Data, sizeof(cmd.parm.setup));
-                               break;
-                       default:
-                               strcpy(cmd.parm.num, Data);
+               case ISDN_STAT_BSENT:
+                       memcpy(&cmd.parm.length, Data, sizeof(cmd.parm.length));
+                       break;
+               case ISDN_STAT_ICALL:
+                       memcpy(&cmd.parm.setup, Data, sizeof(cmd.parm.setup));
+                       break;
+               default:
+                       strcpy(cmd.parm.num, Data);
                }
        }
 
index 6273248..81fbe78 100644 (file)
  */
 
 /* Determine if a channel number is valid for the adapter */
-#define IS_VALID_CHANNEL(y,x)  ((x>0) && (x <= sc_adapter[y]->channels))
+#define IS_VALID_CHANNEL(y, x) ((x > 0) && (x <= sc_adapter[y]->channels))
 
 #endif
index 023de78..6b580b2 100644 (file)
@@ -27,9 +27,9 @@ static const char version[] = "2.0b1";
 static const char *boardname[] = { "DataCommute/BRI", "DataCommute/PRI", "TeleCommute/BRI" };
 
 /* insmod set parameters */
-static unsigned int io[] = {0,0,0,0};
-static unsigned char irq[] = {0,0,0,0};
-static unsigned long ram[] = {0,0,0,0};
+static unsigned int io[] = {0, 0, 0, 0};
+static unsigned char irq[] = {0, 0, 0, 0};
+static unsigned long ram[] = {0, 0, 0, 0};
 static bool do_reset = 0;
 
 module_param_array(io, int, NULL, 0);
@@ -62,7 +62,7 @@ static int __init sc_init(void)
 #endif
        pr_info("Copyright (C) 1996 SpellCaster Telecommunications Inc.\n");
 
-       while(b++ < MAX_CARDS - 1) {
+       while (b++ < MAX_CARDS - 1) {
                pr_debug("Probing for adapter #%d\n", b);
                /*
                 * Initialize reusable variables
@@ -72,17 +72,17 @@ static int __init sc_init(void)
                channels = 0;
                pgport = 0;
 
-               /* 
-                * See if we should probe for IO base 
+               /*
+                * See if we should probe for IO base
                 */
                pr_debug("I/O Base for board %d is 0x%x, %s probe\n", b, io[b],
-                       io[b] == 0 ? "will" : "won't");
-               if(io[b]) {
+                        io[b] == 0 ? "will" : "won't");
+               if (io[b]) {
                        /*
                         * No, I/O Base has been provided
                         */
-                       for (i = 0 ; i < MAX_IO_REGS - 1 ; i++) {
-                               if(!request_region(io[b] + i * 0x400, 1, "sc test")) {
+                       for (i = 0; i < MAX_IO_REGS - 1; i++) {
+                               if (!request_region(io[b] + i * 0x400, 1, "sc test")) {
                                        pr_debug("request_region for 0x%x failed\n", io[b] + i * 0x400);
                                        io[b] = 0;
                                        break;
@@ -93,13 +93,13 @@ static int __init sc_init(void)
                        /*
                         * Confirm the I/O Address with a test
                         */
-                       if(io[b] == 0) {
+                       if (io[b] == 0) {
                                pr_debug("I/O Address invalid.\n");
                                continue;
                        }
 
                        outb(0x18, io[b] + 0x400 * EXP_PAGE0);
-                       if(inb(io[b] + 0x400 * EXP_PAGE0) != 0x18) {
+                       if (inb(io[b] + 0x400 * EXP_PAGE0) != 0x18) {
                                pr_debug("I/O Base 0x%x fails test\n",
                                         io[b] + 0x400 * EXP_PAGE0);
                                continue;
@@ -109,12 +109,12 @@ static int __init sc_init(void)
                        /*
                         * Yes, probe for I/O Base
                         */
-                       if(probe_exhasted) {
+                       if (probe_exhasted) {
                                pr_debug("All probe addresses exhasted, skipping\n");
                                continue;
                        }
                        pr_debug("Probing for I/O...\n");
-                       for (i = last_base ; i <= IOBASE_MAX ; i += IOBASE_OFFSET) {
+                       for (i = last_base; i <= IOBASE_MAX; i += IOBASE_OFFSET) {
                                int found_io = 1;
                                if (i == IOBASE_MAX) {
                                        probe_exhasted = 1; /* No more addresses to probe */
@@ -122,19 +122,19 @@ static int __init sc_init(void)
                                }
                                last_base = i + IOBASE_OFFSET;
                                pr_debug("  checking 0x%x...", i);
-                               for ( j = 0 ; j < MAX_IO_REGS - 1 ; j++) {
-                                       if(!request_region(i + j * 0x400, 1, "sc test")) {
+                               for (j = 0; j < MAX_IO_REGS - 1; j++) {
+                                       if (!request_region(i + j * 0x400, 1, "sc test")) {
                                                pr_debug("Failed\n");
                                                found_io = 0;
                                                break;
                                        } else
                                                release_region(i + j * 0x400, 1);
-                               }       
+                               }
 
-                               if(found_io) {
+                               if (found_io) {
                                        io[b] = i;
                                        outb(0x18, io[b] + 0x400 * EXP_PAGE0);
-                                       if(inb(io[b] + 0x400 * EXP_PAGE0) != 0x18) { 
+                                       if (inb(io[b] + 0x400 * EXP_PAGE0) != 0x18) {
                                                pr_debug("Failed by test\n");
                                                continue;
                                        }
@@ -142,7 +142,7 @@ static int __init sc_init(void)
                                        break;
                                }
                        }
-                       if(probe_exhasted) {
+                       if (probe_exhasted) {
                                continue;
                        }
                }
@@ -150,23 +150,23 @@ static int __init sc_init(void)
                /*
                 * See if we should probe for shared RAM
                 */
-               if(do_reset) {
+               if (do_reset) {
                        pr_debug("Doing a SAFE probe reset\n");
                        outb(0xFF, io[b] + RESET_OFFSET);
                        msleep_interruptible(10000);
                }
                pr_debug("RAM Base for board %d is 0x%lx, %s probe\n", b,
-                       ram[b], ram[b] == 0 ? "will" : "won't");
+                        ram[b], ram[b] == 0 ? "will" : "won't");
 
-               if(ram[b]) {
+               if (ram[b]) {
                        /*
                         * No, the RAM base has been provided
                         * Just look for a signature and ID the
                         * board model
                         */
-                       if(request_region(ram[b], SRAM_PAGESIZE, "sc test")) {
+                       if (request_region(ram[b], SRAM_PAGESIZE, "sc test")) {
                                pr_debug("request_region for RAM base 0x%lx succeeded\n", ram[b]);
-                               model = identify_board(ram[b], io[b]);
+                               model = identify_board(ram[b], io[b]);
                                release_region(ram[b], SRAM_PAGESIZE);
                        }
                }
@@ -175,15 +175,15 @@ static int __init sc_init(void)
                         * Yes, probe for free RAM and look for
                         * a signature and id the board model
                         */
-                       for (i = SRAM_MIN ; i < SRAM_MAX ; i += SRAM_PAGESIZE) {
+                       for (i = SRAM_MIN; i < SRAM_MAX; i += SRAM_PAGESIZE) {
                                pr_debug("Checking RAM address 0x%x...\n", i);
-                               if(request_region(i, SRAM_PAGESIZE, "sc test")) {
+                               if (request_region(i, SRAM_PAGESIZE, "sc test")) {
                                        pr_debug("  request_region succeeded\n");
                                        model = identify_board(i, io[b]);
                                        release_region(i, SRAM_PAGESIZE);
                                        if (model >= 0) {
                                                pr_debug("  Identified a %s\n",
-                                                       boardname[model]);
+                                                        boardname[model]);
                                                ram[b] = i;
                                                break;
                                        }
@@ -196,19 +196,19 @@ static int __init sc_init(void)
                /*
                 * See if we found free RAM and the board model
                 */
-               if(!ram[b] || model < 0) {
+               if (!ram[b] || model < 0) {
                        /*
                         * Nope, there was no place in RAM for the
                         * board, or it couldn't be identified
                         */
-                        pr_debug("Failed to find an adapter at 0x%lx\n", ram[b]);
-                        continue;
+                       pr_debug("Failed to find an adapter at 0x%lx\n", ram[b]);
+                       continue;
                }
 
                /*
                 * Set the board's magic number, memory size and page register
                 */
-               switch(model) {
+               switch (model) {
                case PRI_BOARD:
                        channels = 23;
                        magic = 0x20000;
@@ -224,7 +224,7 @@ static int __init sc_init(void)
                        features = BRI_FEATURES;
                        break;
                }
-               switch(ram[b] >> 12 & 0x0F) {
+               switch (ram[b] >> 12 & 0x0F) {
                case 0x0:
                        pr_debug("RAM Page register set to EXP_PAGE0\n");
                        pgport = EXP_PAGE0;
@@ -250,12 +250,12 @@ static int __init sc_init(void)
                        continue;
                }
 
-               pr_debug("current IRQ: %d  b: %d\n",irq[b],b);
+               pr_debug("current IRQ: %d  b: %d\n", irq[b], b);
 
                /*
                 * Make sure we got an IRQ
                 */
-               if(!irq[b]) {
+               if (!irq[b]) {
                        /*
                         * No interrupt could be used
                         */
@@ -299,7 +299,7 @@ static int __init sc_init(void)
                }
                spin_lock_init(&sc_adapter[cinst]->lock);
 
-               if(!register_isdn(interface)) {
+               if (!register_isdn(interface)) {
                        /*
                         * Oops, couldn't register for some reason
                         */
@@ -344,30 +344,30 @@ static int __init sc_init(void)
                        kfree(interface);
                        kfree(sc_adapter[cinst]);
                        continue;
-                       
+
                }
                sc_adapter[cinst]->iobase = io[b];
-               for(i = 0 ; i < MAX_IO_REGS - 1 ; i++) {
+               for (i = 0; i < MAX_IO_REGS - 1; i++) {
                        sc_adapter[cinst]->ioport[i] = io[b] + i * 0x400;
                        request_region(sc_adapter[cinst]->ioport[i], 1,
-                                       interface->id);
+                                      interface->id);
                        pr_debug("Requesting I/O Port %#x\n",
-                               sc_adapter[cinst]->ioport[i]);
+                                sc_adapter[cinst]->ioport[i]);
                }
                sc_adapter[cinst]->ioport[IRQ_SELECT] = io[b] + 0x2;
                request_region(sc_adapter[cinst]->ioport[IRQ_SELECT], 1,
-                               interface->id);
+                              interface->id);
                pr_debug("Requesting I/O Port %#x\n",
-                               sc_adapter[cinst]->ioport[IRQ_SELECT]);
+                        sc_adapter[cinst]->ioport[IRQ_SELECT]);
                sc_adapter[cinst]->rambase = ram[b];
                request_region(sc_adapter[cinst]->rambase, SRAM_PAGESIZE,
-                               interface->id);
+                              interface->id);
 
-               pr_info("  %s (%d) - %s %d channels IRQ %d, I/O Base 0x%x, RAM Base 0x%lx\n", 
+               pr_info("  %s (%d) - %s %d channels IRQ %d, I/O Base 0x%x, RAM Base 0x%lx\n",
                        sc_adapter[cinst]->devicename,
                        sc_adapter[cinst]->driverId,
                        boardname[model], channels, irq[b], io[b], ram[b]);
-               
+
                /*
                 * reset the adapter to put things in motion
                 */
@@ -376,7 +376,7 @@ static int __init sc_init(void)
                cinst++;
                status = 0;
        }
-       if (status) 
+       if (status)
                pr_info("Failed to find any adapters, driver unloaded\n");
        return status;
 }
@@ -385,7 +385,7 @@ static void __exit sc_exit(void)
 {
        int i, j;
 
-       for(i = 0 ; i < cinst ; i++) {
+       for (i = 0; i < cinst; i++) {
                pr_debug("Cleaning up after adapter %d\n", i);
                /*
                 * kill the timers
@@ -417,14 +417,14 @@ static void __exit sc_exit(void)
                /*
                 * Release the I/O Port regions
                 */
-               for(j = 0 ; j < MAX_IO_REGS - 1; j++) {
+               for (j = 0; j < MAX_IO_REGS - 1; j++) {
                        release_region(sc_adapter[i]->ioport[j], 1);
                        pr_debug("Releasing I/O Port %#x\n",
-                               sc_adapter[i]->ioport[j]);
+                                sc_adapter[i]->ioport[j]);
                }
                release_region(sc_adapter[i]->ioport[IRQ_SELECT], 1);
                pr_debug("Releasing I/O Port %#x\n",
-                       sc_adapter[i]->ioport[IRQ_SELECT]);
+                        sc_adapter[i]->ioport[IRQ_SELECT]);
 
                /*
                 * Release any memory we alloced
@@ -447,19 +447,19 @@ static int identify_board(unsigned long rambase, unsigned int iobase)
        int x;
 
        pr_debug("Attempting to identify adapter @ 0x%lx io 0x%x\n",
-               rambase, iobase);
+                rambase, iobase);
 
        /*
         * Enable the base pointer
         */
        outb(rambase >> 12, iobase + 0x2c00);
 
-       switch(rambase >> 12 & 0x0F) {
+       switch (rambase >> 12 & 0x0F) {
        case 0x0:
                pgport = iobase + PG0_OFFSET;
                pr_debug("Page Register offset is 0x%x\n", PG0_OFFSET);
                break;
-               
+
        case 0x4:
                pgport = iobase + PG1_OFFSET;
                pr_debug("Page Register offset is 0x%x\n", PG1_OFFSET);
@@ -486,7 +486,7 @@ static int identify_board(unsigned long rambase, unsigned int iobase)
        msleep_interruptible(1000);
        sig = readl(rambase + SIG_OFFSET);
        pr_debug("Looking for a signature, got 0x%lx\n", sig);
-       if(sig == SIGNATURE)
+       if (sig == SIGNATURE)
                return PRI_BOARD;
 
        /*
@@ -496,7 +496,7 @@ static int identify_board(unsigned long rambase, unsigned int iobase)
        msleep_interruptible(1000);
        sig = readl(rambase + SIG_OFFSET);
        pr_debug("Looking for a signature, got 0x%lx\n", sig);
-       if(sig == SIGNATURE)
+       if (sig == SIGNATURE)
                return BRI_BOARD;
 
        return -1;
@@ -506,7 +506,7 @@ static int identify_board(unsigned long rambase, unsigned int iobase)
         */
        sig = readl(rambase + SIG_OFFSET);
        pr_debug("Looking for a signature, got 0x%lx\n", sig);
-       if(sig != SIGNATURE)
+       if (sig != SIGNATURE)
                return -1;
 
        dpm = (DualPortMemory *) rambase;
@@ -523,11 +523,11 @@ static int identify_board(unsigned long rambase, unsigned int iobase)
         * Wait for the response
         */
        x = 0;
-       while((inb(iobase + FIFOSTAT_OFFSET) & RF_HAS_DATA) && x < 100) {
+       while ((inb(iobase + FIFOSTAT_OFFSET) & RF_HAS_DATA) && x < 100) {
                schedule_timeout_interruptible(1);
                x++;
        }
-       if(x == 100) {
+       if (x == 100) {
                pr_debug("Timeout waiting for response\n");
                return -1;
        }
@@ -540,11 +540,11 @@ static int identify_board(unsigned long rambase, unsigned int iobase)
                 hwci.st_u_sense ? "S/T" : "U", hwci.ram_size,
                 hwci.serial_no, hwci.part_no, hwci.rev_no);
 
-       if(!strncmp(PRI_PARTNO, hwci.part_no, 6))
+       if (!strncmp(PRI_PARTNO, hwci.part_no, 6))
                return PRI_BOARD;
-       if(!strncmp(BRI_PARTNO, hwci.part_no, 6))
+       if (!strncmp(BRI_PARTNO, hwci.part_no, 6))
                return BRI_BOARD;
-               
+
        return -1;
 }
 
index f0225bc..e80cc76 100644 (file)
@@ -22,7 +22,7 @@
 #include <linux/interrupt.h>
 
 /*
- * 
+ *
  */
 irqreturn_t interrupt_handler(int dummy, void *card_inst)
 {
@@ -31,15 +31,15 @@ irqreturn_t interrupt_handler(int dummy, void *card_inst)
        int channel;
        int card = (int)(unsigned long) card_inst;
 
-       if(!IS_VALID_CARD(card)) {
+       if (!IS_VALID_CARD(card)) {
                pr_debug("Invalid param: %d is not a valid card id\n", card);
                return IRQ_NONE;
        }
 
        pr_debug("%s: Entered Interrupt handler\n",
-                       sc_adapter[card]->devicename);
-       
-       /*
+                sc_adapter[card]->devicename);
+
+       /*
         * Pull all of the waiting messages off the response queue
         */
        while (!receivemessage(card, &rcvmsg)) {
@@ -47,31 +47,31 @@ irqreturn_t interrupt_handler(int dummy, void *card_inst)
                 * Push the message to the adapter structure for
                 * send_and_receive to snoop
                 */
-               if(sc_adapter[card]->want_async_messages)
+               if (sc_adapter[card]->want_async_messages)
                        memcpy(&(sc_adapter[card]->async_msg),
-                                       &rcvmsg, sizeof(RspMessage));
+                              &rcvmsg, sizeof(RspMessage));
 
                channel = (unsigned int) rcvmsg.phy_link_no;
-               
+
                /*
                 * Trap Invalid request messages
                 */
-               if(IS_CM_MESSAGE(rcvmsg, 0, 0, Invalid)) {
-                       pr_debug("%s: Invalid request Message, rsp_status = %d\n", 
-                               sc_adapter[card]->devicename,
-                               rcvmsg.rsp_status);
-                       break;  
+               if (IS_CM_MESSAGE(rcvmsg, 0, 0, Invalid)) {
+                       pr_debug("%s: Invalid request Message, rsp_status = %d\n",
+                                sc_adapter[card]->devicename,
+                                rcvmsg.rsp_status);
+                       break;
                }
-               
+
                /*
                 * Check for a linkRead message
                 */
                if (IS_CE_MESSAGE(rcvmsg, Lnk, 1, Read))
                {
                        pr_debug("%s: Received packet 0x%x bytes long at 0x%lx\n",
-                                               sc_adapter[card]->devicename,
-                                               rcvmsg.msg_data.response.msg_len,
-                                               rcvmsg.msg_data.response.buff_offset);
+                                sc_adapter[card]->devicename,
+                                rcvmsg.msg_data.response.msg_len,
+                                rcvmsg.msg_data.response.buff_offset);
                        rcvpkt(card, &rcvmsg);
                        continue;
 
@@ -80,49 +80,49 @@ irqreturn_t interrupt_handler(int dummy, void *card_inst)
                /*
                 * Handle a write acknoledgement
                 */
-               if(IS_CE_MESSAGE(rcvmsg, Lnk, 1, Write)) {
+               if (IS_CE_MESSAGE(rcvmsg, Lnk, 1, Write)) {
                        pr_debug("%s: Packet Send ACK on channel %d\n",
-                               sc_adapter[card]->devicename,
-                               rcvmsg.phy_link_no);
-                       sc_adapter[card]->channel[rcvmsg.phy_link_no-1].free_sendbufs++;
+                                sc_adapter[card]->devicename,
+                                rcvmsg.phy_link_no);
+                       sc_adapter[card]->channel[rcvmsg.phy_link_no - 1].free_sendbufs++;
                        continue;
                }
 
                /*
                 * Handle a connection message
                 */
-               if (IS_CE_MESSAGE(rcvmsg, Phy, 1, Connect)) 
+               if (IS_CE_MESSAGE(rcvmsg, Phy, 1, Connect))
                {
                        unsigned int callid;
-                       setup_parm setup;       
+                       setup_parm setup;
                        pr_debug("%s: Connect message: line %d: status %d: cause 0x%x\n",
-                                               sc_adapter[card]->devicename,
-                                               rcvmsg.phy_link_no,
-                                               rcvmsg.rsp_status,
-                                               rcvmsg.msg_data.byte_array[2]);
-                       
-                       memcpy(&callid,rcvmsg.msg_data.byte_array,sizeof(int));
-                       if(callid>=0x8000 && callid<=0xFFFF)
-                       {               
+                                sc_adapter[card]->devicename,
+                                rcvmsg.phy_link_no,
+                                rcvmsg.rsp_status,
+                                rcvmsg.msg_data.byte_array[2]);
+
+                       memcpy(&callid, rcvmsg.msg_data.byte_array, sizeof(int));
+                       if (callid >= 0x8000 && callid <= 0xFFFF)
+                       {
                                pr_debug("%s: Got Dial-Out Rsp\n",
-                                       sc_adapter[card]->devicename);
+                                        sc_adapter[card]->devicename);
                                indicate_status(card, ISDN_STAT_DCONN,
-                                               (unsigned long)rcvmsg.phy_link_no-1,NULL);
-                               
+                                               (unsigned long)rcvmsg.phy_link_no - 1, NULL);
+
                        }
-                       else if(callid>=0x0000 && callid<=0x7FFF)
+                       else if (callid >= 0x0000 && callid <= 0x7FFF)
                        {
                                int len;
 
                                pr_debug("%s: Got Incoming Call\n",
-                                               sc_adapter[card]->devicename);
+                                        sc_adapter[card]->devicename);
                                len = strlcpy(setup.phone, &(rcvmsg.msg_data.byte_array[4]),
-                                               sizeof(setup.phone));
+                                             sizeof(setup.phone));
                                if (len >= sizeof(setup.phone))
                                        continue;
                                len = strlcpy(setup.eazmsn,
-                                               sc_adapter[card]->channel[rcvmsg.phy_link_no - 1].dn,
-                                               sizeof(setup.eazmsn));
+                                             sc_adapter[card]->channel[rcvmsg.phy_link_no - 1].dn,
+                                             sizeof(setup.eazmsn));
                                if (len >= sizeof(setup.eazmsn))
                                        continue;
                                setup.si1 = 7;
@@ -130,8 +130,8 @@ irqreturn_t interrupt_handler(int dummy, void *card_inst)
                                setup.plan = 0;
                                setup.screen = 0;
 
-                               indicate_status(card, ISDN_STAT_ICALL,(unsigned long)rcvmsg.phy_link_no-1,(char *)&setup);
-                               indicate_status(card, ISDN_STAT_DCONN,(unsigned long)rcvmsg.phy_link_no-1,NULL);
+                               indicate_status(card, ISDN_STAT_ICALL, (unsigned long)rcvmsg.phy_link_no - 1, (char *)&setup);
+                               indicate_status(card, ISDN_STAT_DCONN, (unsigned long)rcvmsg.phy_link_no - 1, NULL);
                        }
                        continue;
                }
@@ -139,16 +139,16 @@ irqreturn_t interrupt_handler(int dummy, void *card_inst)
                /*
                 * Handle a disconnection message
                 */
-               if (IS_CE_MESSAGE(rcvmsg, Phy, 1, Disconnect)) 
+               if (IS_CE_MESSAGE(rcvmsg, Phy, 1, Disconnect))
                {
                        pr_debug("%s: disconnect message: line %d: status %d: cause 0x%x\n",
-                                               sc_adapter[card]->devicename,
-                                               rcvmsg.phy_link_no,
-                                               rcvmsg.rsp_status,
-                                               rcvmsg.msg_data.byte_array[2]);
+                                sc_adapter[card]->devicename,
+                                rcvmsg.phy_link_no,
+                                rcvmsg.rsp_status,
+                                rcvmsg.msg_data.byte_array[2]);
 
-                       indicate_status(card, ISDN_STAT_BHUP,(unsigned long)rcvmsg.phy_link_no-1,NULL);
-                       indicate_status(card, ISDN_STAT_DHUP,(unsigned long)rcvmsg.phy_link_no-1,NULL);
+                       indicate_status(card, ISDN_STAT_BHUP, (unsigned long)rcvmsg.phy_link_no - 1, NULL);
+                       indicate_status(card, ISDN_STAT_DHUP, (unsigned long)rcvmsg.phy_link_no - 1, NULL);
                        continue;
 
                }
@@ -158,10 +158,10 @@ irqreturn_t interrupt_handler(int dummy, void *card_inst)
                 */
                if (IS_CM_MESSAGE(rcvmsg, 5, 0, MiscEngineUp)) {
                        pr_debug("%s: Received EngineUp message\n",
-                               sc_adapter[card]->devicename);
+                                sc_adapter[card]->devicename);
                        sc_adapter[card]->EngineUp = 1;
-                       sendmessage(card, CEPID,ceReqTypeCall,ceReqClass0,ceReqCallGetMyNumber,1,0,NULL);
-                       sendmessage(card, CEPID,ceReqTypeCall,ceReqClass0,ceReqCallGetMyNumber,2,0,NULL);
+                       sendmessage(card, CEPID, ceReqTypeCall, ceReqClass0, ceReqCallGetMyNumber, 1, 0, NULL);
+                       sendmessage(card, CEPID, ceReqTypeCall, ceReqClass0, ceReqCallGetMyNumber, 2, 0, NULL);
                        init_timer(&sc_adapter[card]->stat_timer);
                        sc_adapter[card]->stat_timer.function = check_phystat;
                        sc_adapter[card]->stat_timer.data = card;
@@ -175,25 +175,25 @@ irqreturn_t interrupt_handler(int dummy, void *card_inst)
                 */
                if (IS_CM_MESSAGE(rcvmsg, 2, 0, StartProc)) {
                        pr_debug("%s: StartProc Response Status %d\n",
-                               sc_adapter[card]->devicename,
-                               rcvmsg.rsp_status);
+                                sc_adapter[card]->devicename,
+                                rcvmsg.rsp_status);
                        continue;
                }
 
                /*
                 * Handle a GetMyNumber Rsp
                 */
-               if (IS_CE_MESSAGE(rcvmsg,Call,0,GetMyNumber)){
+               if (IS_CE_MESSAGE(rcvmsg, Call, 0, GetMyNumber)) {
                        strlcpy(sc_adapter[card]->channel[rcvmsg.phy_link_no - 1].dn,
                                rcvmsg.msg_data.byte_array,
                                sizeof(rcvmsg.msg_data.byte_array));
                        continue;
                }
-                       
+
                /*
                 * PhyStatus response
                 */
-               if(IS_CE_MESSAGE(rcvmsg, Phy, 2, Status)) {
+               if (IS_CE_MESSAGE(rcvmsg, Phy, 2, Status)) {
                        unsigned int b1stat, b2stat;
 
                        /*
@@ -204,30 +204,30 @@ irqreturn_t interrupt_handler(int dummy, void *card_inst)
 
                        sc_adapter[card]->nphystat = (b2stat >> 8) | b1stat; /* endian?? */
                        pr_debug("%s: PhyStat is 0x%2x\n",
-                               sc_adapter[card]->devicename,
-                               sc_adapter[card]->nphystat);
+                                sc_adapter[card]->devicename,
+                                sc_adapter[card]->nphystat);
                        continue;
                }
 
 
-               /* 
+               /*
                 * Handle a GetFramFormat
                 */
-               if(IS_CE_MESSAGE(rcvmsg, Call, 0, GetFrameFormat)) {
-                       if(rcvmsg.msg_data.byte_array[0] != HDLC_PROTO) {
+               if (IS_CE_MESSAGE(rcvmsg, Call, 0, GetFrameFormat)) {
+                       if (rcvmsg.msg_data.byte_array[0] != HDLC_PROTO) {
                                unsigned int proto = HDLC_PROTO;
                                /*
                                 * Set board format to HDLC if it wasn't already
                                 */
                                pr_debug("%s: current frame format: 0x%x, will change to HDLC\n",
-                                               sc_adapter[card]->devicename,
-                                       rcvmsg.msg_data.byte_array[0]);
+                                        sc_adapter[card]->devicename,
+                                        rcvmsg.msg_data.byte_array[0]);
                                sendmessage(card, CEPID, ceReqTypeCall,
-                                               ceReqClass0,
-                                               ceReqCallSetFrameFormat,
-                                               (unsigned char) channel +1,
-                                               1,&proto);
-                               }
+                                           ceReqClass0,
+                                           ceReqCallSetFrameFormat,
+                                           (unsigned char)channel + 1,
+                                           1, &proto);
+                       }
                        continue;
                }
 
@@ -235,13 +235,13 @@ irqreturn_t interrupt_handler(int dummy, void *card_inst)
                 * Hmm...
                 */
                pr_debug("%s: Received unhandled message (%d,%d,%d) link %d\n",
-                       sc_adapter[card]->devicename,
-                       rcvmsg.type, rcvmsg.class, rcvmsg.code,
-                       rcvmsg.phy_link_no);
+                        sc_adapter[card]->devicename,
+                        rcvmsg.type, rcvmsg.class, rcvmsg.code,
+                        rcvmsg.phy_link_no);
 
        }       /* while */
 
        pr_debug("%s: Exiting Interrupt Handler\n",
-                       sc_adapter[card]->devicename);
+                sc_adapter[card]->devicename);
        return IRQ_HANDLED;
 }
index 4cfdbe0..e63983a 100644 (file)
@@ -30,11 +30,11 @@ int sc_ioctl(int card, scs_ioctl *data)
        if (!rcvmsg)
                return -ENOMEM;
 
-       switch(data->command) {
+       switch (data->command) {
        case SCIOCRESET:        /* Perform a hard reset of the adapter */
        {
                pr_debug("%s: SCIOCRESET: ioctl received\n",
-                       sc_adapter[card]->devicename);
+                        sc_adapter[card]->devicename);
                sc_adapter[card]->StartOnReset = 0;
                kfree(rcvmsg);
                return reset(card);
@@ -50,10 +50,10 @@ int sc_ioctl(int card, scs_ioctl *data)
                        return -ENOMEM;
                }
                pr_debug("%s: SCIOLOAD: ioctl received\n",
-                               sc_adapter[card]->devicename);
-               if(sc_adapter[card]->EngineUp) {
+                        sc_adapter[card]->devicename);
+               if (sc_adapter[card]->EngineUp) {
                        pr_debug("%s: SCIOCLOAD: command failed, LoadProc while engine running.\n",
-                               sc_adapter[card]->devicename);
+                                sc_adapter[card]->devicename);
                        kfree(rcvmsg);
                        kfree(srec);
                        return -1;
@@ -69,18 +69,18 @@ int sc_ioctl(int card, scs_ioctl *data)
                }
 
                status = send_and_receive(card, CMPID, cmReqType2, cmReqClass0, cmReqLoadProc,
-                               0, SCIOC_SRECSIZE, srec, rcvmsg, SAR_TIMEOUT);
+                                         0, SCIOC_SRECSIZE, srec, rcvmsg, SAR_TIMEOUT);
                kfree(rcvmsg);
                kfree(srec);
 
-               if(status) {
-                       pr_debug("%s: SCIOCLOAD: command failed, status = %d\n", 
-                               sc_adapter[card]->devicename, status);
+               if (status) {
+                       pr_debug("%s: SCIOCLOAD: command failed, status = %d\n",
+                                sc_adapter[card]->devicename, status);
                        return -1;
                }
                else {
                        pr_debug("%s: SCIOCLOAD: command successful\n",
-                                       sc_adapter[card]->devicename);
+                                sc_adapter[card]->devicename);
                        return 0;
                }
        }
@@ -89,10 +89,10 @@ int sc_ioctl(int card, scs_ioctl *data)
        {
                kfree(rcvmsg);
                pr_debug("%s: SCIOSTART: ioctl received\n",
-                               sc_adapter[card]->devicename);
-               if(sc_adapter[card]->EngineUp) {
+                        sc_adapter[card]->devicename);
+               if (sc_adapter[card]->EngineUp) {
                        pr_debug("%s: SCIOCSTART: command failed, engine already running.\n",
-                               sc_adapter[card]->devicename);
+                                sc_adapter[card]->devicename);
                        return -1;
                }
 
@@ -104,7 +104,7 @@ int sc_ioctl(int card, scs_ioctl *data)
        case SCIOCSETSWITCH:
        {
                pr_debug("%s: SCIOSETSWITCH: ioctl received\n",
-                               sc_adapter[card]->devicename);
+                        sc_adapter[card]->devicename);
 
                /*
                 * Get the switch type from user space
@@ -115,41 +115,41 @@ int sc_ioctl(int card, scs_ioctl *data)
                }
 
                pr_debug("%s: SCIOCSETSWITCH: setting switch type to %d\n",
-                       sc_adapter[card]->devicename,
-                       switchtype);
+                        sc_adapter[card]->devicename,
+                        switchtype);
                status = send_and_receive(card, CEPID, ceReqTypeCall, ceReqClass0, ceReqCallSetSwitchType,
-                                               0, sizeof(char),&switchtype, rcvmsg, SAR_TIMEOUT);
-               if(!status && !(rcvmsg->rsp_status)) {
+                                         0, sizeof(char), &switchtype, rcvmsg, SAR_TIMEOUT);
+               if (!status && !(rcvmsg->rsp_status)) {
                        pr_debug("%s: SCIOCSETSWITCH: command successful\n",
-                               sc_adapter[card]->devicename);
+                                sc_adapter[card]->devicename);
                        kfree(rcvmsg);
                        return 0;
                }
                else {
                        pr_debug("%s: SCIOCSETSWITCH: command failed (status = %d)\n",
-                               sc_adapter[card]->devicename, status);
+                                sc_adapter[card]->devicename, status);
                        kfree(rcvmsg);
                        return status;
                }
        }
-               
+
        case SCIOCGETSWITCH:
        {
                pr_debug("%s: SCIOGETSWITCH: ioctl received\n",
-                               sc_adapter[card]->devicename);
+                        sc_adapter[card]->devicename);
 
                /*
                 * Get the switch type from the board
                 */
-               status = send_and_receive(card, CEPID, ceReqTypeCall, ceReqClass0, 
-                       ceReqCallGetSwitchType, 0, 0, NULL, rcvmsg, SAR_TIMEOUT);
+               status = send_and_receive(card, CEPID, ceReqTypeCall, ceReqClass0,
+                                         ceReqCallGetSwitchType, 0, 0, NULL, rcvmsg, SAR_TIMEOUT);
                if (!status && !(rcvmsg->rsp_status)) {
                        pr_debug("%s: SCIOCGETSWITCH: command successful\n",
-                                       sc_adapter[card]->devicename);
+                                sc_adapter[card]->devicename);
                }
                else {
                        pr_debug("%s: SCIOCGETSWITCH: command failed (status = %d)\n",
-                               sc_adapter[card]->devicename, status);
+                                sc_adapter[card]->devicename, status);
                        kfree(rcvmsg);
                        return status;
                }
@@ -172,7 +172,7 @@ int sc_ioctl(int card, scs_ioctl *data)
        case SCIOCGETSPID:
        {
                pr_debug("%s: SCIOGETSPID: ioctl received\n",
-                               sc_adapter[card]->devicename);
+                        sc_adapter[card]->devicename);
 
                spid = kzalloc(SCIOC_SPIDSIZE, GFP_KERNEL);
                if (!spid) {
@@ -183,13 +183,13 @@ int sc_ioctl(int card, scs_ioctl *data)
                 * Get the spid from the board
                 */
                status = send_and_receive(card, CEPID, ceReqTypeCall, ceReqClass0, ceReqCallGetSPID,
-                                       data->channel, 0, NULL, rcvmsg, SAR_TIMEOUT);
+                                         data->channel, 0, NULL, rcvmsg, SAR_TIMEOUT);
                if (!status) {
                        pr_debug("%s: SCIOCGETSPID: command successful\n",
-                                       sc_adapter[card]->devicename);
+                                sc_adapter[card]->devicename);
                } else {
                        pr_debug("%s: SCIOCGETSPID: command failed (status = %d)\n",
-                               sc_adapter[card]->devicename, status);
+                                sc_adapter[card]->devicename, status);
                        kfree(spid);
                        kfree(rcvmsg);
                        return status;
@@ -208,12 +208,12 @@ int sc_ioctl(int card, scs_ioctl *data)
                kfree(spid);
                kfree(rcvmsg);
                return 0;
-       }       
+       }
 
        case SCIOCSETSPID:
        {
                pr_debug("%s: DCBIOSETSPID: ioctl received\n",
-                               sc_adapter[card]->devicename);
+                        sc_adapter[card]->devicename);
 
                /*
                 * Get the spid from user space
@@ -224,21 +224,21 @@ int sc_ioctl(int card, scs_ioctl *data)
                        return PTR_ERR(spid);
                }
 
-               pr_debug("%s: SCIOCSETSPID: setting channel %d spid to %s\n", 
-                       sc_adapter[card]->devicename, data->channel, spid);
-               status = send_and_receive(card, CEPID, ceReqTypeCall, 
-                       ceReqClass0, ceReqCallSetSPID, data->channel, 
-                       strlen(spid), spid, rcvmsg, SAR_TIMEOUT);
-               if(!status && !(rcvmsg->rsp_status)) {
-                       pr_debug("%s: SCIOCSETSPID: command successful\n", 
-                               sc_adapter[card]->devicename);
+               pr_debug("%s: SCIOCSETSPID: setting channel %d spid to %s\n",
+                        sc_adapter[card]->devicename, data->channel, spid);
+               status = send_and_receive(card, CEPID, ceReqTypeCall,
+                                         ceReqClass0, ceReqCallSetSPID, data->channel,
+                                         strlen(spid), spid, rcvmsg, SAR_TIMEOUT);
+               if (!status && !(rcvmsg->rsp_status)) {
+                       pr_debug("%s: SCIOCSETSPID: command successful\n",
+                                sc_adapter[card]->devicename);
                        kfree(rcvmsg);
                        kfree(spid);
                        return 0;
                }
                else {
                        pr_debug("%s: SCIOCSETSPID: command failed (status = %d)\n",
-                               sc_adapter[card]->devicename, status);
+                                sc_adapter[card]->devicename, status);
                        kfree(rcvmsg);
                        kfree(spid);
                        return status;
@@ -248,20 +248,20 @@ int sc_ioctl(int card, scs_ioctl *data)
        case SCIOCGETDN:
        {
                pr_debug("%s: SCIOGETDN: ioctl received\n",
-                               sc_adapter[card]->devicename);
+                        sc_adapter[card]->devicename);
 
                /*
                 * Get the dn from the board
                 */
                status = send_and_receive(card, CEPID, ceReqTypeCall, ceReqClass0, ceReqCallGetMyNumber,
-                                       data->channel, 0, NULL, rcvmsg, SAR_TIMEOUT);
+                                         data->channel, 0, NULL, rcvmsg, SAR_TIMEOUT);
                if (!status) {
                        pr_debug("%s: SCIOCGETDN: command successful\n",
-                                       sc_adapter[card]->devicename);
+                                sc_adapter[card]->devicename);
                }
                else {
                        pr_debug("%s: SCIOCGETDN: command failed (status = %d)\n",
-                               sc_adapter[card]->devicename, status);
+                                sc_adapter[card]->devicename, status);
                        kfree(rcvmsg);
                        return status;
                }
@@ -283,12 +283,12 @@ int sc_ioctl(int card, scs_ioctl *data)
                }
                kfree(dn);
                return 0;
-       }       
+       }
 
        case SCIOCSETDN:
        {
                pr_debug("%s: SCIOSETDN: ioctl received\n",
-                               sc_adapter[card]->devicename);
+                        sc_adapter[card]->devicename);
 
                /*
                 * Get the spid from user space
@@ -299,21 +299,21 @@ int sc_ioctl(int card, scs_ioctl *data)
                        return PTR_ERR(dn);
                }
 
-               pr_debug("%s: SCIOCSETDN: setting channel %d dn to %s\n", 
-                       sc_adapter[card]->devicename, data->channel, dn);
-               status = send_and_receive(card, CEPID, ceReqTypeCall, 
-                       ceReqClass0, ceReqCallSetMyNumber, data->channel, 
-                       strlen(dn),dn,rcvmsg, SAR_TIMEOUT);
-               if(!status && !(rcvmsg->rsp_status)) {
-                       pr_debug("%s: SCIOCSETDN: command successful\n", 
-                               sc_adapter[card]->devicename);
+               pr_debug("%s: SCIOCSETDN: setting channel %d dn to %s\n",
+                        sc_adapter[card]->devicename, data->channel, dn);
+               status = send_and_receive(card, CEPID, ceReqTypeCall,
+                                         ceReqClass0, ceReqCallSetMyNumber, data->channel,
+                                         strlen(dn), dn, rcvmsg, SAR_TIMEOUT);
+               if (!status && !(rcvmsg->rsp_status)) {
+                       pr_debug("%s: SCIOCSETDN: command successful\n",
+                                sc_adapter[card]->devicename);
                        kfree(rcvmsg);
                        kfree(dn);
                        return 0;
                }
                else {
                        pr_debug("%s: SCIOCSETDN: command failed (status = %d)\n",
-                               sc_adapter[card]->devicename, status);
+                                sc_adapter[card]->devicename, status);
                        kfree(rcvmsg);
                        kfree(dn);
                        return status;
@@ -323,11 +323,11 @@ int sc_ioctl(int card, scs_ioctl *data)
        case SCIOCTRACE:
 
                pr_debug("%s: SCIOTRACE: ioctl received\n",
-                               sc_adapter[card]->devicename);
+                        sc_adapter[card]->devicename);
 /*             sc_adapter[card]->trace = !sc_adapter[card]->trace;
                pr_debug("%s: SCIOCTRACE: tracing turned %s\n",
-                               sc_adapter[card]->devicename,
-                       sc_adapter[card]->trace ? "ON" : "OFF"); */
+               sc_adapter[card]->devicename,
+               sc_adapter[card]->trace ? "ON" : "OFF"); */
                break;
 
        case SCIOCSTAT:
@@ -335,7 +335,7 @@ int sc_ioctl(int card, scs_ioctl *data)
                boardInfo *bi;
 
                pr_debug("%s: SCIOSTAT: ioctl received\n",
-                               sc_adapter[card]->devicename);
+                        sc_adapter[card]->devicename);
 
                bi = kzalloc(sizeof(boardInfo), GFP_KERNEL);
                if (!bi) {
@@ -358,20 +358,20 @@ int sc_ioctl(int card, scs_ioctl *data)
        case SCIOCGETSPEED:
        {
                pr_debug("%s: SCIOGETSPEED: ioctl received\n",
-                               sc_adapter[card]->devicename);
+                        sc_adapter[card]->devicename);
 
                /*
                 * Get the speed from the board
                 */
-               status = send_and_receive(card, CEPID, ceReqTypeCall, ceReqClass0, 
-                       ceReqCallGetCallType, data->channel, 0, NULL, rcvmsg, SAR_TIMEOUT);
+               status = send_and_receive(card, CEPID, ceReqTypeCall, ceReqClass0,
+                                         ceReqCallGetCallType, data->channel, 0, NULL, rcvmsg, SAR_TIMEOUT);
                if (!status && !(rcvmsg->rsp_status)) {
                        pr_debug("%s: SCIOCGETSPEED: command successful\n",
-                               sc_adapter[card]->devicename);
+                                sc_adapter[card]->devicename);
                }
                else {
                        pr_debug("%s: SCIOCGETSPEED: command failed (status = %d)\n",
-                               sc_adapter[card]->devicename, status);
+                                sc_adapter[card]->devicename, status);
                        kfree(rcvmsg);
                        return status;
                }
@@ -392,12 +392,12 @@ int sc_ioctl(int card, scs_ioctl *data)
 
        case SCIOCSETSPEED:
                pr_debug("%s: SCIOCSETSPEED: ioctl received\n",
-                               sc_adapter[card]->devicename);
+                        sc_adapter[card]->devicename);
                break;
 
        case SCIOCLOOPTST:
                pr_debug("%s: SCIOCLOOPTST: ioctl received\n",
-                               sc_adapter[card]->devicename);
+                        sc_adapter[card]->devicename);
                break;
 
        default:
@@ -432,32 +432,32 @@ static int GetStatus(int card, boardInfo *bi)
         * Get the current PhyStats and LnkStats
         */
        status = send_and_receive(card, CEPID, ceReqTypePhy, ceReqClass2,
-               ceReqPhyStatus, 0, 0, NULL, &rcvmsg, SAR_TIMEOUT);
-       if(!status) {
-               if(sc_adapter[card]->model < PRI_BOARD) {
+                                 ceReqPhyStatus, 0, 0, NULL, &rcvmsg, SAR_TIMEOUT);
+       if (!status) {
+               if (sc_adapter[card]->model < PRI_BOARD) {
                        bi->l1_status = rcvmsg.msg_data.byte_array[2];
-                       for(i = 0 ; i < BRI_CHANNELS ; i++)
+                       for (i = 0; i < BRI_CHANNELS; i++)
                                bi->status.bristats[i].phy_stat =
                                        rcvmsg.msg_data.byte_array[i];
                }
                else {
                        bi->l1_status = rcvmsg.msg_data.byte_array[0];
                        bi->l2_status = rcvmsg.msg_data.byte_array[1];
-                       for(i = 0 ; i < PRI_CHANNELS ; i++)
-                               bi->status.pristats[i].phy_stat = 
-                                       rcvmsg.msg_data.byte_array[i+2];
+                       for (i = 0; i < PRI_CHANNELS; i++)
+                               bi->status.pristats[i].phy_stat =
+                                       rcvmsg.msg_data.byte_array[i + 2];
                }
        }
-       
+
        /*
         * Get the call types for each channel
         */
-       for (i = 0 ; i < sc_adapter[card]->nChannels ; i++) {
+       for (i = 0; i < sc_adapter[card]->nChannels; i++) {
                status = send_and_receive(card, CEPID, ceReqTypeCall, ceReqClass0,
-                       ceReqCallGetCallType, 0, 0, NULL, &rcvmsg, SAR_TIMEOUT);
-               if(!status) {
+                                         ceReqCallGetCallType, 0, 0, NULL, &rcvmsg, SAR_TIMEOUT);
+               if (!status) {
                        if (sc_adapter[card]->model == PRI_BOARD) {
-                               bi->status.pristats[i].call_type = 
+                               bi->status.pristats[i].call_type =
                                        rcvmsg.msg_data.byte_array[0];
                        }
                        else {
@@ -466,7 +466,7 @@ static int GetStatus(int card, boardInfo *bi)
                        }
                }
        }
-       
+
        /*
         * If PRI, get the call states and service states for each channel
         */
@@ -475,10 +475,10 @@ static int GetStatus(int card, boardInfo *bi)
                 * Get the call states
                 */
                status = send_and_receive(card, CEPID, ceReqTypeStat, ceReqClass2,
-                       ceReqPhyChCallState, 0, 0, NULL, &rcvmsg, SAR_TIMEOUT);
-               if(!status) {
-                       for( i = 0 ; i < PRI_CHANNELS ; i++ )
-                               bi->status.pristats[i].call_state = 
+                                         ceReqPhyChCallState, 0, 0, NULL, &rcvmsg, SAR_TIMEOUT);
+               if (!status) {
+                       for (i = 0; i < PRI_CHANNELS; i++)
+                               bi->status.pristats[i].call_state =
                                        rcvmsg.msg_data.byte_array[i];
                }
 
@@ -486,27 +486,27 @@ static int GetStatus(int card, boardInfo *bi)
                 * Get the service states
                 */
                status = send_and_receive(card, CEPID, ceReqTypeStat, ceReqClass2,
-                       ceReqPhyChServState, 0, 0, NULL, &rcvmsg, SAR_TIMEOUT);
-               if(!status) {
-                       for( i = 0 ; i < PRI_CHANNELS ; i++ )
-                               bi->status.pristats[i].serv_state = 
+                                         ceReqPhyChServState, 0, 0, NULL, &rcvmsg, SAR_TIMEOUT);
+               if (!status) {
+                       for (i = 0; i < PRI_CHANNELS; i++)
+                               bi->status.pristats[i].serv_state =
                                        rcvmsg.msg_data.byte_array[i];
                }
 
                /*
                 * Get the link stats for the channels
                 */
-               for (i = 1 ; i <= PRI_CHANNELS ; i++) {
+               for (i = 1; i <= PRI_CHANNELS; i++) {
                        status = send_and_receive(card, CEPID, ceReqTypeLnk, ceReqClass0,
-                               ceReqLnkGetStats, i, 0, NULL, &rcvmsg, SAR_TIMEOUT);
+                                                 ceReqLnkGetStats, i, 0, NULL, &rcvmsg, SAR_TIMEOUT);
                        if (!status) {
-                               bi->status.pristats[i-1].link_stats.tx_good =
+                               bi->status.pristats[i - 1].link_stats.tx_good =
                                        (unsigned long)rcvmsg.msg_data.byte_array[0];
-                               bi->status.pristats[i-1].link_stats.tx_bad =
+                               bi->status.pristats[i - 1].link_stats.tx_bad =
                                        (unsigned long)rcvmsg.msg_data.byte_array[4];
-                               bi->status.pristats[i-1].link_stats.rx_good =
+                               bi->status.pristats[i - 1].link_stats.rx_good =
                                        (unsigned long)rcvmsg.msg_data.byte_array[8];
-                               bi->status.pristats[i-1].link_stats.rx_bad =
+                               bi->status.pristats[i - 1].link_stats.rx_bad =
                                        (unsigned long)rcvmsg.msg_data.byte_array[12];
                        }
                }
@@ -515,7 +515,7 @@ static int GetStatus(int card, boardInfo *bi)
                 * Link stats for the D channel
                 */
                status = send_and_receive(card, CEPID, ceReqTypeLnk, ceReqClass0,
-                       ceReqLnkGetStats, 0, 0, NULL, &rcvmsg, SAR_TIMEOUT);
+                                         ceReqLnkGetStats, 0, 0, NULL, &rcvmsg, SAR_TIMEOUT);
                if (!status) {
                        bi->dch_stats.tx_good = (unsigned long)rcvmsg.msg_data.byte_array[0];
                        bi->dch_stats.tx_bad = (unsigned long)rcvmsg.msg_data.byte_array[4];
@@ -534,49 +534,49 @@ static int GetStatus(int card, boardInfo *bi)
         * Get the link stats for the channels
         */
        status = send_and_receive(card, CEPID, ceReqTypeLnk, ceReqClass0,
-               ceReqLnkGetStats, 0, 0, NULL, &rcvmsg, SAR_TIMEOUT);
+                                 ceReqLnkGetStats, 0, 0, NULL, &rcvmsg, SAR_TIMEOUT);
        if (!status) {
                bi->dch_stats.tx_good = (unsigned long)rcvmsg.msg_data.byte_array[0];
                bi->dch_stats.tx_bad = (unsigned long)rcvmsg.msg_data.byte_array[4];
                bi->dch_stats.rx_good = (unsigned long)rcvmsg.msg_data.byte_array[8];
                bi->dch_stats.rx_bad = (unsigned long)rcvmsg.msg_data.byte_array[12];
-               bi->status.bristats[0].link_stats.tx_good = 
+               bi->status.bristats[0].link_stats.tx_good =
                        (unsigned long)rcvmsg.msg_data.byte_array[16];
-               bi->status.bristats[0].link_stats.tx_bad = 
+               bi->status.bristats[0].link_stats.tx_bad =
                        (unsigned long)rcvmsg.msg_data.byte_array[20];
-               bi->status.bristats[0].link_stats.rx_good = 
+               bi->status.bristats[0].link_stats.rx_good =
                        (unsigned long)rcvmsg.msg_data.byte_array[24];
-               bi->status.bristats[0].link_stats.rx_bad = 
+               bi->status.bristats[0].link_stats.rx_bad =
                        (unsigned long)rcvmsg.msg_data.byte_array[28];
-               bi->status.bristats[1].link_stats.tx_good = 
+               bi->status.bristats[1].link_stats.tx_good =
                        (unsigned long)rcvmsg.msg_data.byte_array[32];
-               bi->status.bristats[1].link_stats.tx_bad = 
+               bi->status.bristats[1].link_stats.tx_bad =
                        (unsigned long)rcvmsg.msg_data.byte_array[36];
-               bi->status.bristats[1].link_stats.rx_good = 
+               bi->status.bristats[1].link_stats.rx_good =
                        (unsigned long)rcvmsg.msg_data.byte_array[40];
-               bi->status.bristats[1].link_stats.rx_bad = 
+               bi->status.bristats[1].link_stats.rx_bad =
                        (unsigned long)rcvmsg.msg_data.byte_array[44];
        }
 
        /*
         * Get the SPIDs
         */
-       for (i = 0 ; i < BRI_CHANNELS ; i++) {
+       for (i = 0; i < BRI_CHANNELS; i++) {
                status = send_and_receive(card, CEPID, ceReqTypeCall, ceReqClass0,
-                       ceReqCallGetSPID, i+1, 0, NULL, &rcvmsg, SAR_TIMEOUT);
+                                         ceReqCallGetSPID, i + 1, 0, NULL, &rcvmsg, SAR_TIMEOUT);
                if (!status)
                        strcpy(bi->status.bristats[i].spid, rcvmsg.msg_data.byte_array);
        }
-               
+
        /*
         * Get the DNs
         */
-       for (i = 0 ; i < BRI_CHANNELS ; i++) {
+       for (i = 0; i < BRI_CHANNELS; i++) {
                status = send_and_receive(card, CEPID, ceReqTypeCall, ceReqClass0,
-                       ceReqCallGetMyNumber, i+1, 0, NULL, &rcvmsg, SAR_TIMEOUT);
+                                         ceReqCallGetMyNumber, i + 1, 0, NULL, &rcvmsg, SAR_TIMEOUT);
                if (!status)
                        strcpy(bi->status.bristats[i].dn, rcvmsg.msg_data.byte_array);
        }
-               
+
        return 0;
 }
index 0b4c4f1..9679a19 100644 (file)
@@ -25,7 +25,7 @@
 /*
  * receive a message from the board
  */
-int receivemessage(int card, RspMessage *rspmsg) 
+int receivemessage(int card, RspMessage *rspmsg)
 {
        DualPortMemory *dpm;
        unsigned long flags;
@@ -34,9 +34,9 @@ int receivemessage(int card, RspMessage *rspmsg)
                pr_debug("Invalid param: %d is not a valid card id\n", card);
                return -EINVAL;
        }
-       
+
        pr_debug("%s: Entered receivemessage\n",
-                       sc_adapter[card]->devicename);
+                sc_adapter[card]->devicename);
 
        /*
         * See if there are messages waiting
@@ -47,47 +47,47 @@ int receivemessage(int card, RspMessage *rspmsg)
                 */
                spin_lock_irqsave(&sc_adapter[card]->lock, flags);
                outb((sc_adapter[card]->shmem_magic >> 14) | 0x80,
-                       sc_adapter[card]->ioport[sc_adapter[card]->shmem_pgport]);
+                    sc_adapter[card]->ioport[sc_adapter[card]->shmem_pgport]);
                dpm = (DualPortMemory *) sc_adapter[card]->rambase;
-               memcpy_fromio(rspmsg, &(dpm->rsp_queue[dpm->rsp_tail]), 
-                       MSG_LEN);
-               dpm->rsp_tail = (dpm->rsp_tail+1) % MAX_MESSAGES;
+               memcpy_fromio(rspmsg, &(dpm->rsp_queue[dpm->rsp_tail]),
+                             MSG_LEN);
+               dpm->rsp_tail = (dpm->rsp_tail + 1) % MAX_MESSAGES;
                inb(sc_adapter[card]->ioport[FIFO_READ]);
                spin_unlock_irqrestore(&sc_adapter[card]->lock, flags);
                /*
                 * Tell the board that the message is received
                 */
                pr_debug("%s: Received Message seq:%d pid:%d time:%d cmd:%d "
-                               "cnt:%d (type,class,code):(%d,%d,%d) "
-                               "link:%d stat:0x%x\n",
-                                       sc_adapter[card]->devicename,
-                                       rspmsg->sequence_no,
-                                       rspmsg->process_id,
-                                       rspmsg->time_stamp,
-                                       rspmsg->cmd_sequence_no,
-                                       rspmsg->msg_byte_cnt,
-                                       rspmsg->type,
-                                       rspmsg->class,
-                                       rspmsg->code,
-                                       rspmsg->phy_link_no, 
-                                       rspmsg->rsp_status);
+                        "cnt:%d (type,class,code):(%d,%d,%d) "
+                        "link:%d stat:0x%x\n",
+                        sc_adapter[card]->devicename,
+                        rspmsg->sequence_no,
+                        rspmsg->process_id,
+                        rspmsg->time_stamp,
+                        rspmsg->cmd_sequence_no,
+                        rspmsg->msg_byte_cnt,
+                        rspmsg->type,
+                        rspmsg->class,
+                        rspmsg->code,
+                        rspmsg->phy_link_no,
+                        rspmsg->rsp_status);
 
                return 0;
        }
        return -ENOMSG;
 }
-       
+
 /*
  * send a message to the board
  */
 int sendmessage(int card,
                unsigned int procid,
-               unsigned int type, 
-               unsigned int class, 
+               unsigned int type,
+               unsigned int class,
                unsigned int code,
-               unsigned int link, 
-               unsigned int data_len, 
-               unsigned int *data) 
+               unsigned int link,
+               unsigned int data_len,
+               unsigned int *data)
 {
        DualPortMemory *dpm;
        ReqMessage sndmsg;
@@ -102,15 +102,15 @@ int sendmessage(int card,
         * Make sure we only send CEPID messages when the engine is up
         * and CMPID messages when it is down
         */
-       if(sc_adapter[card]->EngineUp && procid == CMPID) {
+       if (sc_adapter[card]->EngineUp && procid == CMPID) {
                pr_debug("%s: Attempt to send CM message with engine up\n",
-                       sc_adapter[card]->devicename);
+                        sc_adapter[card]->devicename);
                return -ESRCH;
        }
 
-       if(!sc_adapter[card]->EngineUp && procid == CEPID) {
+       if (!sc_adapter[card]->EngineUp && procid == CEPID) {
                pr_debug("%s: Attempt to send CE message with engine down\n",
-                       sc_adapter[card]->devicename);
+                        sc_adapter[card]->devicename);
                return -ESRCH;
        }
 
@@ -142,39 +142,39 @@ int sendmessage(int card,
         */
        spin_lock_irqsave(&sc_adapter[card]->lock, flags);
        outb((sc_adapter[card]->shmem_magic >> 14) | 0x80,
-               sc_adapter[card]->ioport[sc_adapter[card]->shmem_pgport]);
+            sc_adapter[card]->ioport[sc_adapter[card]->shmem_pgport]);
        dpm = (DualPortMemory *) sc_adapter[card]->rambase;     /* Fix me */
-       memcpy_toio(&(dpm->req_queue[dpm->req_head]),&sndmsg,MSG_LEN);
-       dpm->req_head = (dpm->req_head+1) % MAX_MESSAGES;
+       memcpy_toio(&(dpm->req_queue[dpm->req_head]), &sndmsg, MSG_LEN);
+       dpm->req_head = (dpm->req_head + 1) % MAX_MESSAGES;
        outb(sndmsg.sequence_no, sc_adapter[card]->ioport[FIFO_WRITE]);
        spin_unlock_irqrestore(&sc_adapter[card]->lock, flags);
-               
+
        pr_debug("%s: Sent Message seq:%d pid:%d time:%d "
-                       "cnt:%d (type,class,code):(%d,%d,%d) "
-                       "link:%d\n ",
-                               sc_adapter[card]->devicename,
-                               sndmsg.sequence_no,
-                               sndmsg.process_id,
-                               sndmsg.time_stamp,
-                               sndmsg.msg_byte_cnt,
-                               sndmsg.type,
-                               sndmsg.class,
-                               sndmsg.code,
-                               sndmsg.phy_link_no); 
-               
+                "cnt:%d (type,class,code):(%d,%d,%d) "
+                "link:%d\n ",
+                sc_adapter[card]->devicename,
+                sndmsg.sequence_no,
+                sndmsg.process_id,
+                sndmsg.time_stamp,
+                sndmsg.msg_byte_cnt,
+                sndmsg.type,
+                sndmsg.class,
+                sndmsg.code,
+                sndmsg.phy_link_no);
+
        return 0;
 }
 
 int send_and_receive(int card,
-               unsigned int procid, 
-               unsigned char type,
-               unsigned char class, 
-               unsigned char code,
-               unsigned char link,
-               unsigned char data_len, 
-               unsigned char *data, 
-               RspMessage *mesgdata,
-               int timeout) 
+                    unsigned int procid,
+                    unsigned char type,
+                    unsigned char class,
+                    unsigned char code,
+                    unsigned char link,
+                    unsigned char data_len,
+                    unsigned char *data,
+                    RspMessage *mesgdata,
+                    int timeout)
 {
        int retval;
        int tries;
@@ -185,12 +185,12 @@ int send_and_receive(int card,
        }
 
        sc_adapter[card]->want_async_messages = 1;
-       retval = sendmessage(card, procid, type, class, code, link, 
-                       data_len, (unsigned int *) data);
-  
+       retval = sendmessage(card, procid, type, class, code, link,
+                            data_len, (unsigned int *) data);
+
        if (retval) {
                pr_debug("%s: SendMessage failed in SAR\n",
-                       sc_adapter[card]->devicename);
+                        sc_adapter[card]->devicename);
                sc_adapter[card]->want_async_messages = 0;
                return -EIO;
        }
@@ -199,7 +199,7 @@ int send_and_receive(int card,
        /* wait for the response */
        while (tries < timeout) {
                schedule_timeout_interruptible(1);
-               
+
                pr_debug("SAR waiting..\n");
 
                /*
@@ -214,14 +214,14 @@ int send_and_receive(int card,
                         * Got it!
                         */
                        pr_debug("%s: Got ASYNC message\n",
-                               sc_adapter[card]->devicename);
+                                sc_adapter[card]->devicename);
                        memcpy(mesgdata, &(sc_adapter[card]->async_msg),
-                               sizeof(RspMessage));
+                              sizeof(RspMessage));
                        sc_adapter[card]->want_async_messages = 0;
                        return 0;
                }
 
-               tries++;
+               tries++;
        }
 
        pr_debug("%s: SAR message timeout\n", sc_adapter[card]->devicename);
index 8eb15e7..5e6f4a5 100644 (file)
@@ -21,7 +21,7 @@
 /*
  * Board message macros, defines and structures
  */
+
 #ifndef MESSAGE_H
 #define MESSAGE_H
 
  * Macro to determine if a message is a loader message
  */
 #define IS_CM_MESSAGE(mesg, tx, cx, dx)                \
-               ((mesg.type == cmRspType##tx)           \
-               &&(mesg.class == cmRspClass##cx)        \
-               &&(mesg.code == cmRsp##dx))
+       ((mesg.type == cmRspType##tx)           \
+        && (mesg.class == cmRspClass##cx)      \
+        && (mesg.code == cmRsp##dx))
 
 /*
  * Macro to determine if a message is a firmware message
  */
 #define IS_CE_MESSAGE(mesg, tx, cx, dx)                \
-               ((mesg.type == ceRspType##tx)           \
-               &&(mesg.class == ceRspClass##cx)        \
-               &&(mesg.code == ceRsp##tx##dx))
+       ((mesg.type == ceRspType##tx)           \
+        && (mesg.class == ceRspClass##cx)      \
+        && (mesg.code == ceRsp##tx##dx))
 
-/* 
+/*
  * Loader Request and Response Messages
  */
 
@@ -186,7 +186,7 @@ typedef struct {
 } LLData;
 
 
-/* 
+/*
  * Message payload template for an HWConfig message
  */
 typedef struct {
index 5ff6ae8..2446957 100644 (file)
@@ -29,27 +29,27 @@ int sndpkt(int devId, int channel, int ack, struct sk_buff *data)
 
        card = get_card_from_id(devId);
 
-       if(!IS_VALID_CARD(card)) {
+       if (!IS_VALID_CARD(card)) {
                pr_debug("invalid param: %d is not a valid card id\n", card);
                return -ENODEV;
        }
 
        pr_debug("%s: sndpkt: frst = 0x%lx nxt = %d  f = %d n = %d\n",
-               sc_adapter[card]->devicename,
-               sc_adapter[card]->channel[channel].first_sendbuf,
-               sc_adapter[card]->channel[channel].next_sendbuf,
-               sc_adapter[card]->channel[channel].free_sendbufs,
-               sc_adapter[card]->channel[channel].num_sendbufs);
+                sc_adapter[card]->devicename,
+                sc_adapter[card]->channel[channel].first_sendbuf,
+                sc_adapter[card]->channel[channel].next_sendbuf,
+                sc_adapter[card]->channel[channel].free_sendbufs,
+                sc_adapter[card]->channel[channel].num_sendbufs);
 
-       if(!sc_adapter[card]->channel[channel].free_sendbufs) {
+       if (!sc_adapter[card]->channel[channel].free_sendbufs) {
                pr_debug("%s: out of TX buffers\n",
-                               sc_adapter[card]->devicename);
+                        sc_adapter[card]->devicename);
                return -EINVAL;
        }
 
-       if(data->len > BUFFER_SIZE) {
+       if (data->len > BUFFER_SIZE) {
                pr_debug("%s: data overflows buffer size (data > buffer)\n",
-                       sc_adapter[card]->devicename);
+                        sc_adapter[card]->devicename);
                return -EINVAL;
        }
 
@@ -57,24 +57,24 @@ int sndpkt(int devId, int channel, int ack, struct sk_buff *data)
                BUFFER_SIZE + sc_adapter[card]->channel[channel].first_sendbuf;
        ReqLnkWrite.msg_len = data->len; /* sk_buff size */
        pr_debug("%s: writing %d bytes to buffer offset 0x%lx\n",
-                       sc_adapter[card]->devicename,
-                       ReqLnkWrite.msg_len, ReqLnkWrite.buff_offset);
+                sc_adapter[card]->devicename,
+                ReqLnkWrite.msg_len, ReqLnkWrite.buff_offset);
        memcpy_toshmem(card, (char *)ReqLnkWrite.buff_offset, data->data, ReqLnkWrite.msg_len);
 
        /*
         * sendmessage
         */
        pr_debug("%s: sndpkt size=%d, buf_offset=0x%lx buf_indx=%d\n",
-               sc_adapter[card]->devicename,
-               ReqLnkWrite.msg_len, ReqLnkWrite.buff_offset,
-               sc_adapter[card]->channel[channel].next_sendbuf);
+                sc_adapter[card]->devicename,
+                ReqLnkWrite.msg_len, ReqLnkWrite.buff_offset,
+                sc_adapter[card]->channel[channel].next_sendbuf);
 
        status = sendmessage(card, CEPID, ceReqTypeLnk, ceReqClass1, ceReqLnkWrite,
-                               channel+1, sizeof(LLData), (unsigned int*)&ReqLnkWrite);
+                            channel + 1, sizeof(LLData), (unsigned int *)&ReqLnkWrite);
        len = data->len;
-       if(status) {
+       if (status) {
                pr_debug("%s: failed to send packet, status = %d\n",
-                               sc_adapter[card]->devicename, status);
+                        sc_adapter[card]->devicename, status);
                return -1;
        }
        else {
@@ -83,9 +83,9 @@ int sndpkt(int devId, int channel, int ack, struct sk_buff *data)
                        ++sc_adapter[card]->channel[channel].next_sendbuf ==
                        sc_adapter[card]->channel[channel].num_sendbufs ? 0 :
                        sc_adapter[card]->channel[channel].next_sendbuf;
-                       pr_debug("%s: packet sent successfully\n", sc_adapter[card]->devicename);
+               pr_debug("%s: packet sent successfully\n", sc_adapter[card]->devicename);
                dev_kfree_skb(data);
-               indicate_status(card,ISDN_STAT_BSENT,channel, (char *)&len);
+               indicate_status(card, ISDN_STAT_BSENT, channel, (char *)&len);
        }
        return len;
 }
@@ -95,49 +95,49 @@ void rcvpkt(int card, RspMessage *rcvmsg)
        LLData newll;
        struct sk_buff *skb;
 
-       if(!IS_VALID_CARD(card)) {
+       if (!IS_VALID_CARD(card)) {
                pr_debug("invalid param: %d is not a valid card id\n", card);
                return;
        }
 
-       switch(rcvmsg->rsp_status){
+       switch (rcvmsg->rsp_status) {
        case 0x01:
        case 0x02:
        case 0x70:
                pr_debug("%s: error status code: 0x%x\n",
-                       sc_adapter[card]->devicename, rcvmsg->rsp_status);
+                        sc_adapter[card]->devicename, rcvmsg->rsp_status);
                return;
-       case 0x00: 
-           if (!(skb = dev_alloc_skb(rcvmsg->msg_data.response.msg_len))) {
+       case 0x00:
+               if (!(skb = dev_alloc_skb(rcvmsg->msg_data.response.msg_len))) {
                        printk(KERN_WARNING "%s: rcvpkt out of memory, dropping packet\n",
-                               sc_adapter[card]->devicename);
+                              sc_adapter[card]->devicename);
                        return;
                }
                skb_put(skb, rcvmsg->msg_data.response.msg_len);
                pr_debug("%s: getting data from offset: 0x%lx\n",
-                       sc_adapter[card]->devicename,
-                       rcvmsg->msg_data.response.buff_offset);
+                        sc_adapter[card]->devicename,
+                        rcvmsg->msg_data.response.buff_offset);
                memcpy_fromshmem(card,
-                       skb_put(skb, rcvmsg->msg_data.response.msg_len),
-                       (char *)rcvmsg->msg_data.response.buff_offset,
-                       rcvmsg->msg_data.response.msg_len);
+                                skb_put(skb, rcvmsg->msg_data.response.msg_len),
+                                (char *)rcvmsg->msg_data.response.buff_offset,
+                                rcvmsg->msg_data.response.msg_len);
                sc_adapter[card]->card->rcvcallb_skb(sc_adapter[card]->driverId,
-                       rcvmsg->phy_link_no-1, skb);
+                                                    rcvmsg->phy_link_no - 1, skb);
 
        case 0x03:
                /*
-                * Recycle the buffer
-                */
+                * Recycle the buffer
+                */
                pr_debug("%s: buffer size : %d\n",
-                               sc_adapter[card]->devicename, BUFFER_SIZE);
+                        sc_adapter[card]->devicename, BUFFER_SIZE);
 /*             memset_shmem(card, rcvmsg->msg_data.response.buff_offset, 0, BUFFER_SIZE); */
                newll.buff_offset = rcvmsg->msg_data.response.buff_offset;
                newll.msg_len = BUFFER_SIZE;
                pr_debug("%s: recycled buffer at offset 0x%lx size %d\n",
-                       sc_adapter[card]->devicename,
-                       newll.buff_offset, newll.msg_len);
+                        sc_adapter[card]->devicename,
+                        newll.buff_offset, newll.msg_len);
                sendmessage(card, CEPID, ceReqTypeLnk, ceReqClass1, ceReqLnkRead,
-                       rcvmsg->phy_link_no, sizeof(LLData), (unsigned int *)&newll);
+                           rcvmsg->phy_link_no, sizeof(LLData), (unsigned int *)&newll);
        }
 
 }
@@ -148,7 +148,7 @@ int setup_buffers(int card, int c)
        unsigned int buffer_size;
        LLData  RcvBuffOffset;
 
-       if(!IS_VALID_CARD(card)) {
+       if (!IS_VALID_CARD(card)) {
                pr_debug("invalid param: %d is not a valid card id\n", card);
                return -ENODEV;
        }
@@ -157,49 +157,48 @@ int setup_buffers(int card, int c)
         * Calculate the buffer offsets (send/recv/send/recv)
         */
        pr_debug("%s: setting up channel buffer space in shared RAM\n",
-                       sc_adapter[card]->devicename);
+                sc_adapter[card]->devicename);
        buffer_size = BUFFER_SIZE;
        nBuffers = ((sc_adapter[card]->ramsize - BUFFER_BASE) / buffer_size) / 2;
        nBuffers = nBuffers > BUFFERS_MAX ? BUFFERS_MAX : nBuffers;
        pr_debug("%s: calculating buffer space: %d buffers, %d big\n",
-               sc_adapter[card]->devicename,
-               nBuffers, buffer_size);
-       if(nBuffers < 2) {
+                sc_adapter[card]->devicename,
+                nBuffers, buffer_size);
+       if (nBuffers < 2) {
                pr_debug("%s: not enough buffer space\n",
-                       sc_adapter[card]->devicename);
+                        sc_adapter[card]->devicename);
                return -1;
        }
        cBase = (nBuffers * buffer_size) * (c - 1);
        pr_debug("%s: channel buffer offset from shared RAM: 0x%x\n",
-                       sc_adapter[card]->devicename, cBase);
-       sc_adapter[card]->channel[c-1].first_sendbuf = BUFFER_BASE + cBase;
-       sc_adapter[card]->channel[c-1].num_sendbufs = nBuffers / 2;
-       sc_adapter[card]->channel[c-1].free_sendbufs = nBuffers / 2;
-       sc_adapter[card]->channel[c-1].next_sendbuf = 0;
+                sc_adapter[card]->devicename, cBase);
+       sc_adapter[card]->channel[c - 1].first_sendbuf = BUFFER_BASE + cBase;
+       sc_adapter[card]->channel[c - 1].num_sendbufs = nBuffers / 2;
+       sc_adapter[card]->channel[c - 1].free_sendbufs = nBuffers / 2;
+       sc_adapter[card]->channel[c - 1].next_sendbuf = 0;
        pr_debug("%s: send buffer setup complete: first=0x%lx n=%d f=%d, nxt=%d\n",
-                               sc_adapter[card]->devicename,
-                               sc_adapter[card]->channel[c-1].first_sendbuf,
-                               sc_adapter[card]->channel[c-1].num_sendbufs,
-                               sc_adapter[card]->channel[c-1].free_sendbufs,
-                               sc_adapter[card]->channel[c-1].next_sendbuf);
+                sc_adapter[card]->devicename,
+                sc_adapter[card]->channel[c - 1].first_sendbuf,
+                sc_adapter[card]->channel[c - 1].num_sendbufs,
+                sc_adapter[card]->channel[c - 1].free_sendbufs,
+                sc_adapter[card]->channel[c - 1].next_sendbuf);
 
        /*
         * Prep the receive buffers
         */
        pr_debug("%s: adding %d RecvBuffers:\n",
-                       sc_adapter[card]->devicename, nBuffers /2);
-       for (i = 0 ; i < nBuffers / 2; i++) {
-               RcvBuffOffset.buff_offset = 
-                       ((sc_adapter[card]->channel[c-1].first_sendbuf +
-                       (nBuffers / 2) * buffer_size) + (buffer_size * i));
+                sc_adapter[card]->devicename, nBuffers / 2);
+       for (i = 0; i < nBuffers / 2; i++) {
+               RcvBuffOffset.buff_offset =
+                       ((sc_adapter[card]->channel[c - 1].first_sendbuf +
+                         (nBuffers / 2) * buffer_size) + (buffer_size * i));
                RcvBuffOffset.msg_len = buffer_size;
                pr_debug("%s: adding RcvBuffer #%d offset=0x%lx sz=%d bufsz:%d\n",
-                               sc_adapter[card]->devicename,
-                               i + 1, RcvBuffOffset.buff_offset, 
-                               RcvBuffOffset.msg_len,buffer_size);
+                        sc_adapter[card]->devicename,
+                        i + 1, RcvBuffOffset.buff_offset,
+                        RcvBuffOffset.msg_len, buffer_size);
                sendmessage(card, CEPID, ceReqTypeLnk, ceReqClass1, ceReqLnkRead,
-                               c, sizeof(LLData), (unsigned int *)&RcvBuffOffset);
-       } 
+                           c, sizeof(LLData), (unsigned int *)&RcvBuffOffset);
+       }
        return 0;
 }
-
index dfb107a..a50e143 100644 (file)
@@ -17,9 +17,9 @@
 #define SCIOCGETSWITCH 0x06    /* Get switch type */
 #define SCIOCSETSWITCH 0x07    /* Set switch type */
 #define SCIOCGETSPID   0x08    /* Get channel SPID */
-#define SCIOCSETSPID   0x09    /* Set channel SPID */
+#define SCIOCSETSPID   0x09    /* Set channel SPID */
 #define SCIOCGETDN     0x0A    /* Get channel DN */
-#define SCIOCSETDN     0x0B    /* Set channel DN */
+#define SCIOCSETDN     0x0B    /* Set channel DN */
 #define SCIOCTRACE     0x0C    /* Toggle trace mode */
 #define SCIOCSTAT      0x0D    /* Get line status */
 #define SCIOCGETSPEED  0x0E    /* Set channel speed */
@@ -108,4 +108,3 @@ typedef struct {
 } boardInfo;
 
 #endif  /*  __ISDN_SC_SCIOC_H__  */
-
index 7f16d75..d24506c 100644 (file)
@@ -42,22 +42,22 @@ void memcpy_toshmem(int card, void *dest, const void *src, size_t n)
         * determine the page to load from the address
         */
        ch = (unsigned long) dest / SRAM_PAGESIZE;
-       pr_debug("%s: loaded page %d\n", sc_adapter[card]->devicename,ch);
+       pr_debug("%s: loaded page %d\n", sc_adapter[card]->devicename, ch);
        /*
         * Block interrupts and load the page
         */
        spin_lock_irqsave(&sc_adapter[card]->lock, flags);
 
        outb(((sc_adapter[card]->shmem_magic + ch * SRAM_PAGESIZE) >> 14) | 0x80,
-               sc_adapter[card]->ioport[sc_adapter[card]->shmem_pgport]);
+            sc_adapter[card]->ioport[sc_adapter[card]->shmem_pgport]);
        memcpy_toio((void __iomem *)(sc_adapter[card]->rambase + dest_rem), src, n);
        spin_unlock_irqrestore(&sc_adapter[card]->lock, flags);
-       pr_debug("%s: set page to %#x\n",sc_adapter[card]->devicename,
-               ((sc_adapter[card]->shmem_magic + ch * SRAM_PAGESIZE)>>14)|0x80);
+       pr_debug("%s: set page to %#x\n", sc_adapter[card]->devicename,
+                ((sc_adapter[card]->shmem_magic + ch * SRAM_PAGESIZE) >> 14) | 0x80);
        pr_debug("%s: copying %zu bytes from %#lx to %#lx\n",
-               sc_adapter[card]->devicename, n,
-               (unsigned long) src,
-               sc_adapter[card]->rambase + ((unsigned long) dest %0x4000));
+                sc_adapter[card]->devicename, n,
+                (unsigned long) src,
+                sc_adapter[card]->rambase + ((unsigned long) dest % 0x4000));
 }
 
 /*
@@ -68,12 +68,12 @@ void memcpy_fromshmem(int card, void *dest, const void *src, size_t n)
        unsigned long flags;
        unsigned char ch;
 
-       if(!IS_VALID_CARD(card)) {
+       if (!IS_VALID_CARD(card)) {
                pr_debug("Invalid param: %d is not a valid card id\n", card);
                return;
        }
 
-       if(n > SRAM_PAGESIZE) {
+       if (n > SRAM_PAGESIZE) {
                return;
        }
 
@@ -81,24 +81,24 @@ void memcpy_fromshmem(int card, void *dest, const void *src, size_t n)
         * determine the page to load from the address
         */
        ch = (unsigned long) src / SRAM_PAGESIZE;
-       pr_debug("%s: loaded page %d\n", sc_adapter[card]->devicename,ch);
-       
-       
+       pr_debug("%s: loaded page %d\n", sc_adapter[card]->devicename, ch);
+
+
        /*
         * Block interrupts and load the page
         */
        spin_lock_irqsave(&sc_adapter[card]->lock, flags);
 
        outb(((sc_adapter[card]->shmem_magic + ch * SRAM_PAGESIZE) >> 14) | 0x80,
-               sc_adapter[card]->ioport[sc_adapter[card]->shmem_pgport]);
-       memcpy_fromio(dest,(void *)(sc_adapter[card]->rambase +
-               ((unsigned long) src % 0x4000)), n);
+            sc_adapter[card]->ioport[sc_adapter[card]->shmem_pgport]);
+       memcpy_fromio(dest, (void *)(sc_adapter[card]->rambase +
+                                    ((unsigned long) src % 0x4000)), n);
        spin_unlock_irqrestore(&sc_adapter[card]->lock, flags);
-       pr_debug("%s: set page to %#x\n",sc_adapter[card]->devicename,
-               ((sc_adapter[card]->shmem_magic + ch * SRAM_PAGESIZE)>>14)|0x80);
+       pr_debug("%s: set page to %#x\n", sc_adapter[card]->devicename,
+                ((sc_adapter[card]->shmem_magic + ch * SRAM_PAGESIZE) >> 14) | 0x80);
 /*     pr_debug("%s: copying %d bytes from %#x to %#x\n",
-               sc_adapter[card]->devicename, n,
-               sc_adapter[card]->rambase + ((unsigned long) src %0x4000), (unsigned long) dest); */
+       sc_adapter[card]->devicename, n,
+       sc_adapter[card]->rambase + ((unsigned long) src %0x4000), (unsigned long) dest); */
 }
 
 #if 0
@@ -107,12 +107,12 @@ void memset_shmem(int card, void *dest, int c, size_t n)
        unsigned long flags;
        unsigned char ch;
 
-       if(!IS_VALID_CARD(card)) {
+       if (!IS_VALID_CARD(card)) {
                pr_debug("Invalid param: %d is not a valid card id\n", card);
                return;
        }
 
-       if(n > SRAM_PAGESIZE) {
+       if (n > SRAM_PAGESIZE) {
                return;
        }
 
@@ -120,7 +120,7 @@ void memset_shmem(int card, void *dest, int c, size_t n)
         * determine the page to load from the address
         */
        ch = (unsigned long) dest / SRAM_PAGESIZE;
-       pr_debug("%s: loaded page %d\n",sc_adapter[card]->devicename,ch);
+       pr_debug("%s: loaded page %d\n", sc_adapter[card]->devicename, ch);
 
        /*
         * Block interrupts and load the page
@@ -128,11 +128,11 @@ void memset_shmem(int card, void *dest, int c, size_t n)
        spin_lock_irqsave(&sc_adapter[card]->lock, flags);
 
        outb(((sc_adapter[card]->shmem_magic + ch * SRAM_PAGESIZE) >> 14) | 0x80,
-               sc_adapter[card]->ioport[sc_adapter[card]->shmem_pgport]);
+            sc_adapter[card]->ioport[sc_adapter[card]->shmem_pgport]);
        memset_io(sc_adapter[card]->rambase +
-               ((unsigned long) dest % 0x4000), c, n);
-       pr_debug("%s: set page to %#x\n",sc_adapter[card]->devicename,
-               ((sc_adapter[card]->shmem_magic + ch * SRAM_PAGESIZE)>>14)|0x80);
+                 ((unsigned long) dest % 0x4000), c, n);
+       pr_debug("%s: set page to %#x\n", sc_adapter[card]->devicename,
+                ((sc_adapter[card]->shmem_magic + ch * SRAM_PAGESIZE) >> 14) | 0x80);
        spin_unlock_irqrestore(&sc_adapter[card]->lock, flags);
 }
 #endif  /*  0  */
index 91fbe0d..6fbac22 100644 (file)
@@ -31,7 +31,7 @@ static void setup_ports(int card)
 
        /* And the IRQ */
        outb((sc_adapter[card]->interrupt | 0x80),
-               sc_adapter[card]->ioport[IRQ_SELECT]);
+            sc_adapter[card]->ioport[IRQ_SELECT]);
 }
 
 /*
@@ -50,18 +50,18 @@ void sc_check_reset(unsigned long data)
        int card = (unsigned int) data;
 
        pr_debug("%s: check_timer timer called\n",
-               sc_adapter[card]->devicename);
+                sc_adapter[card]->devicename);
 
        /* Setup the io ports */
        setup_ports(card);
 
        spin_lock_irqsave(&sc_adapter[card]->lock, flags);
        outb(sc_adapter[card]->ioport[sc_adapter[card]->shmem_pgport],
-               (sc_adapter[card]->shmem_magic>>14) | 0x80);
+            (sc_adapter[card]->shmem_magic >> 14) | 0x80);
        sig = (unsigned long) *((unsigned long *)(sc_adapter[card]->rambase + SIG_OFFSET));
 
        /* check the signature */
-       if(sig == SIGNATURE) {
+       if (sig == SIGNATURE) {
                flushreadfifo(card);
                spin_unlock_irqrestore(&sc_adapter[card]->lock, flags);
                /* See if we need to do a startproc */
@@ -69,8 +69,8 @@ void sc_check_reset(unsigned long data)
                        startproc(card);
        } else  {
                pr_debug("%s: No signature yet, waiting another %lu jiffies.\n",
-                       sc_adapter[card]->devicename, CHECKRESET_TIME);
-               mod_timer(&sc_adapter[card]->reset_timer, jiffies+CHECKRESET_TIME);
+                        sc_adapter[card]->devicename, CHECKRESET_TIME);
+               mod_timer(&sc_adapter[card]->reset_timer, jiffies + CHECKRESET_TIME);
                spin_unlock_irqrestore(&sc_adapter[card]->lock, flags);
        }
 }
@@ -91,19 +91,19 @@ void check_phystat(unsigned long data)
        int card = (unsigned int) data;
 
        pr_debug("%s: Checking status...\n", sc_adapter[card]->devicename);
-       /* 
+       /*
         * check the results of the last PhyStat and change only if
         * has changed drastically
         */
        if (sc_adapter[card]->nphystat && !sc_adapter[card]->phystat) {   /* All is well */
                pr_debug("PhyStat transition to RUN\n");
-               pr_info("%s: Switch contacted, transmitter enabled\n", 
+               pr_info("%s: Switch contacted, transmitter enabled\n",
                        sc_adapter[card]->devicename);
                indicate_status(card, ISDN_STAT_RUN, 0, NULL);
        }
        else if (!sc_adapter[card]->nphystat && sc_adapter[card]->phystat) {   /* All is not well */
                pr_debug("PhyStat transition to STOP\n");
-               pr_info("%s: Switch connection lost, transmitter disabled\n", 
+               pr_info("%s: Switch connection lost, transmitter disabled\n",
                        sc_adapter[card]->devicename);
 
                indicate_status(card, ISDN_STAT_STOP, 0, NULL);
@@ -113,11 +113,10 @@ void check_phystat(unsigned long data)
 
        /* Reinitialize the timer */
        spin_lock_irqsave(&sc_adapter[card]->lock, flags);
-       mod_timer(&sc_adapter[card]->stat_timer, jiffies+CHECKSTAT_TIME);
+       mod_timer(&sc_adapter[card]->stat_timer, jiffies + CHECKSTAT_TIME);
        spin_unlock_irqrestore(&sc_adapter[card]->lock, flags);
 
        /* Send a new cePhyStatus message */
-       sendmessage(card, CEPID,ceReqTypePhy,ceReqClass2,
-               ceReqPhyStatus,0,0,NULL);
+       sendmessage(card, CEPID, ceReqTypePhy, ceReqClass2,
+                   ceReqPhyStatus, 0, 0, NULL);
 }
-
index 0ae0d7c..793b001 100644 (file)
@@ -660,7 +660,7 @@ static void __attach_bond_to_agg(struct port *port)
 static void __detach_bond_from_agg(struct port *port)
 {
        port = NULL; /* just to satisfy the compiler */
-       // This function does nothing sience the parser/multiplexer of the receive
+       // This function does nothing since the parser/multiplexer of the receive
        // and the parser/multiplexer of the aggregator are already combined
 }
 
index f820b26..9abfde4 100644 (file)
@@ -180,11 +180,9 @@ static int tlb_initialize(struct bonding *bond)
        int i;
 
        new_hashtbl = kzalloc(size, GFP_KERNEL);
-       if (!new_hashtbl) {
-               pr_err("%s: Error: Failed to allocate TLB hash table\n",
-                      bond->dev->name);
+       if (!new_hashtbl)
                return -1;
-       }
+
        _lock_tx_hashtbl_bh(bond);
 
        bond_info->tx_hashtbl = new_hashtbl;
@@ -784,11 +782,9 @@ static int rlb_initialize(struct bonding *bond)
        int i;
 
        new_hashtbl = kmalloc(size, GFP_KERNEL);
-       if (!new_hashtbl) {
-               pr_err("%s: Error: Failed to allocate RLB hash table\n",
-                      bond->dev->name);
+       if (!new_hashtbl)
                return -1;
-       }
+
        _lock_rx_hashtbl_bh(bond);
 
        bond_info->rx_hashtbl = new_hashtbl;
index 0a4fc62..c8afd62 100644 (file)
@@ -426,6 +426,35 @@ static int cfhsi_rx_desc(struct cfhsi_desc *desc, struct cfhsi *cfhsi)
        return xfer_sz;
 }
 
+static int cfhsi_rx_desc_len(struct cfhsi_desc *desc)
+{
+       int xfer_sz = 0;
+       int nfrms = 0;
+       u16 *plen;
+
+       if ((desc->header & ~CFHSI_PIGGY_DESC) ||
+                       (desc->offset > CFHSI_MAX_EMB_FRM_SZ)) {
+
+               pr_err("Invalid descriptor. %x %x\n", desc->header,
+                               desc->offset);
+               return -EPROTO;
+       }
+
+       /* Calculate transfer length. */
+       plen = desc->cffrm_len;
+       while (nfrms < CFHSI_MAX_PKTS && *plen) {
+               xfer_sz += *plen;
+               plen++;
+               nfrms++;
+       }
+
+       if (xfer_sz % 4) {
+               pr_err("Invalid payload len: %d, ignored.\n", xfer_sz);
+               return -EPROTO;
+       }
+       return xfer_sz;
+}
+
 static int cfhsi_rx_pld(struct cfhsi_desc *desc, struct cfhsi *cfhsi)
 {
        int rx_sz = 0;
@@ -517,8 +546,10 @@ static int cfhsi_rx_pld(struct cfhsi_desc *desc, struct cfhsi *cfhsi)
 static void cfhsi_rx_done(struct cfhsi *cfhsi)
 {
        int res;
-       int desc_pld_len = 0;
+       int desc_pld_len = 0, rx_len, rx_state;
        struct cfhsi_desc *desc = NULL;
+       u8 *rx_ptr, *rx_buf;
+       struct cfhsi_desc *piggy_desc = NULL;
 
        desc = (struct cfhsi_desc *)cfhsi->rx_buf;
 
@@ -534,65 +565,71 @@ static void cfhsi_rx_done(struct cfhsi *cfhsi)
        spin_unlock_bh(&cfhsi->lock);
 
        if (cfhsi->rx_state.state == CFHSI_RX_STATE_DESC) {
-               desc_pld_len = cfhsi_rx_desc(desc, cfhsi);
-               if (desc_pld_len == -ENOMEM)
-                       goto restart;
-               if (desc_pld_len == -EPROTO)
+               desc_pld_len = cfhsi_rx_desc_len(desc);
+
+               if (desc_pld_len < 0)
                        goto out_of_sync;
+
+               rx_buf = cfhsi->rx_buf;
+               rx_len = desc_pld_len;
+               if (desc_pld_len > 0 && (desc->header & CFHSI_PIGGY_DESC))
+                       rx_len += CFHSI_DESC_SZ;
+               if (desc_pld_len == 0)
+                       rx_buf = cfhsi->rx_flip_buf;
        } else {
-               int pld_len;
+               rx_buf = cfhsi->rx_flip_buf;
 
-               if (!cfhsi->rx_state.piggy_desc) {
-                       pld_len = cfhsi_rx_pld(desc, cfhsi);
-                       if (pld_len == -ENOMEM)
-                               goto restart;
-                       if (pld_len == -EPROTO)
-                               goto out_of_sync;
-                       cfhsi->rx_state.pld_len = pld_len;
-               } else {
-                       pld_len = cfhsi->rx_state.pld_len;
-               }
+               rx_len = CFHSI_DESC_SZ;
+               if (cfhsi->rx_state.pld_len > 0 &&
+                               (desc->header & CFHSI_PIGGY_DESC)) {
 
-               if ((pld_len > 0) && (desc->header & CFHSI_PIGGY_DESC)) {
-                       struct cfhsi_desc *piggy_desc;
                        piggy_desc = (struct cfhsi_desc *)
                                (desc->emb_frm + CFHSI_MAX_EMB_FRM_SZ +
-                                               pld_len);
+                                               cfhsi->rx_state.pld_len);
+
                        cfhsi->rx_state.piggy_desc = true;
 
-                       /* Extract piggy-backed descriptor. */
-                       desc_pld_len = cfhsi_rx_desc(piggy_desc, cfhsi);
-                       if (desc_pld_len == -ENOMEM)
-                               goto restart;
+                       /* Extract payload len from piggy-backed descriptor. */
+                       desc_pld_len = cfhsi_rx_desc_len(piggy_desc);
+                       if (desc_pld_len < 0)
+                               goto out_of_sync;
+
+                       if (desc_pld_len > 0)
+                               rx_len = desc_pld_len;
+
+                       if (desc_pld_len > 0 &&
+                                       (piggy_desc->header & CFHSI_PIGGY_DESC))
+                               rx_len += CFHSI_DESC_SZ;
 
                        /*
                         * Copy needed information from the piggy-backed
                         * descriptor to the descriptor in the start.
                         */
-                       memcpy((u8 *)desc, (u8 *)piggy_desc,
+                       memcpy(rx_buf, (u8 *)piggy_desc,
                                        CFHSI_DESC_SHORT_SZ);
-
+                       /* Mark no embedded frame here */
+                       piggy_desc->offset = 0;
                        if (desc_pld_len == -EPROTO)
                                goto out_of_sync;
                }
        }
 
-       memset(&cfhsi->rx_state, 0, sizeof(cfhsi->rx_state));
        if (desc_pld_len) {
-               cfhsi->rx_state.state = CFHSI_RX_STATE_PAYLOAD;
-               cfhsi->rx_ptr = cfhsi->rx_buf + CFHSI_DESC_SZ;
-               cfhsi->rx_len = desc_pld_len;
+               rx_state = CFHSI_RX_STATE_PAYLOAD;
+               rx_ptr = rx_buf + CFHSI_DESC_SZ;
        } else {
-               cfhsi->rx_state.state = CFHSI_RX_STATE_DESC;
-               cfhsi->rx_ptr = cfhsi->rx_buf;
-               cfhsi->rx_len = CFHSI_DESC_SZ;
+               rx_state = CFHSI_RX_STATE_DESC;
+               rx_ptr = rx_buf;
+               rx_len = CFHSI_DESC_SZ;
        }
 
+       /* Initiate next read */
        if (test_bit(CFHSI_AWAKE, &cfhsi->bits)) {
                /* Set up new transfer. */
                dev_dbg(&cfhsi->ndev->dev, "%s: Start RX.\n",
-                       __func__);
-               res = cfhsi->dev->cfhsi_rx(cfhsi->rx_ptr, cfhsi->rx_len,
+                               __func__);
+
+               res = cfhsi->dev->cfhsi_rx(rx_ptr, rx_len,
                                cfhsi->dev);
                if (WARN_ON(res < 0)) {
                        dev_err(&cfhsi->ndev->dev, "%s: RX error %d.\n",
@@ -601,16 +638,32 @@ static void cfhsi_rx_done(struct cfhsi *cfhsi)
                        cfhsi->ndev->stats.rx_dropped++;
                }
        }
-       return;
 
-restart:
-       if (++cfhsi->rx_state.retries > CFHSI_MAX_RX_RETRIES) {
-               dev_err(&cfhsi->ndev->dev, "%s: No memory available "
-                       "in %d iterations.\n",
-                       __func__, CFHSI_MAX_RX_RETRIES);
-               BUG();
+       if (cfhsi->rx_state.state == CFHSI_RX_STATE_DESC) {
+               /* Extract payload from descriptor */
+               if (cfhsi_rx_desc(desc, cfhsi) < 0)
+                       goto out_of_sync;
+       } else {
+               /* Extract payload */
+               if (cfhsi_rx_pld(desc, cfhsi) < 0)
+                       goto out_of_sync;
+               if (piggy_desc) {
+                       /* Extract any payload in piggyback descriptor. */
+                       if (cfhsi_rx_desc(piggy_desc, cfhsi) < 0)
+                               goto out_of_sync;
+               }
        }
-       mod_timer(&cfhsi->rx_slowpath_timer, jiffies + 1);
+
+       /* Update state info */
+       memset(&cfhsi->rx_state, 0, sizeof(cfhsi->rx_state));
+       cfhsi->rx_state.state = rx_state;
+       cfhsi->rx_ptr = rx_ptr;
+       cfhsi->rx_len = rx_len;
+       cfhsi->rx_state.pld_len = desc_pld_len;
+       cfhsi->rx_state.piggy_desc = desc->header & CFHSI_PIGGY_DESC;
+
+       if (rx_buf != cfhsi->rx_buf)
+               swap(cfhsi->rx_buf, cfhsi->rx_flip_buf);
        return;
 
 out_of_sync:
@@ -1040,6 +1093,12 @@ int cfhsi_probe(struct platform_device *pdev)
                goto err_alloc_rx;
        }
 
+       cfhsi->rx_flip_buf = kzalloc(CFHSI_BUF_SZ_RX, GFP_KERNEL);
+       if (!cfhsi->rx_flip_buf) {
+               res = -ENODEV;
+               goto err_alloc_rx_flip;
+       }
+
        /* Pre-calculate inactivity timeout. */
        if (inactivity_timeout != -1) {
                cfhsi->inactivity_timeout =
@@ -1138,6 +1197,8 @@ int cfhsi_probe(struct platform_device *pdev)
  err_activate:
        destroy_workqueue(cfhsi->wq);
  err_create_wq:
+       kfree(cfhsi->rx_flip_buf);
+ err_alloc_rx_flip:
        kfree(cfhsi->rx_buf);
  err_alloc_rx:
        kfree(cfhsi->tx_buf);
index ab45758..bb709fd 100644 (file)
@@ -103,11 +103,11 @@ config CAN_FLEXCAN
          Say Y here if you want to support for Freescale FlexCAN.
 
 config PCH_CAN
-       tristate "PCH CAN"
+       tristate "Intel EG20T PCH CAN controller"
        depends on CAN_DEV && PCI
        ---help---
-         This driver is for PCH CAN of Topcliff which is an IOH for x86
-         embedded processor.
+         This driver is for PCH CAN of Topcliff (Intel EG20T PCH) which
+         is an IOH for x86 embedded processor (Intel Atom E6xx series).
          This driver can access CAN bus.
 
 source "drivers/net/can/mscan/Kconfig"
index 349e0fa..3f88473 100644 (file)
@@ -82,8 +82,7 @@ static int bfin_can_set_bittiming(struct net_device *dev)
        bfin_write(&reg->clock, clk);
        bfin_write(&reg->timing, timing);
 
-       dev_info(dev->dev.parent, "setting CLOCK=0x%04x TIMING=0x%04x\n",
-                       clk, timing);
+       netdev_info(dev, "setting CLOCK=0x%04x TIMING=0x%04x\n", clk, timing);
 
        return 0;
 }
@@ -108,8 +107,7 @@ static void bfin_can_set_reset_mode(struct net_device *dev)
        while (!(bfin_read(&reg->control) & CCA)) {
                udelay(10);
                if (--timeout == 0) {
-                       dev_err(dev->dev.parent,
-                                       "fail to enter configuration mode\n");
+                       netdev_err(dev, "fail to enter configuration mode\n");
                        BUG();
                }
        }
@@ -165,8 +163,7 @@ static void bfin_can_set_normal_mode(struct net_device *dev)
        while (bfin_read(&reg->status) & CCA) {
                udelay(10);
                if (--timeout == 0) {
-                       dev_err(dev->dev.parent,
-                                       "fail to leave configuration mode\n");
+                       netdev_err(dev, "fail to leave configuration mode\n");
                        BUG();
                }
        }
@@ -224,6 +221,20 @@ static int bfin_can_set_mode(struct net_device *dev, enum can_mode mode)
        return 0;
 }
 
+static int bfin_can_get_berr_counter(const struct net_device *dev,
+                                    struct can_berr_counter *bec)
+{
+       struct bfin_can_priv *priv = netdev_priv(dev);
+       struct bfin_can_regs __iomem *reg = priv->membase;
+
+       u16 cec = bfin_read(&reg->cec);
+
+       bec->txerr = cec >> 8;
+       bec->rxerr = cec;
+
+       return 0;
+}
+
 static int bfin_can_start_xmit(struct sk_buff *skb, struct net_device *dev)
 {
        struct bfin_can_priv *priv = netdev_priv(dev);
@@ -331,7 +342,7 @@ static int bfin_can_err(struct net_device *dev, u16 isrc, u16 status)
 
        if (isrc & RMLIS) {
                /* data overrun interrupt */
-               dev_dbg(dev->dev.parent, "data overrun interrupt\n");
+               netdev_dbg(dev, "data overrun interrupt\n");
                cf->can_id |= CAN_ERR_CRTL;
                cf->data[1] = CAN_ERR_CRTL_RX_OVERFLOW;
                stats->rx_over_errors++;
@@ -339,7 +350,7 @@ static int bfin_can_err(struct net_device *dev, u16 isrc, u16 status)
        }
 
        if (isrc & BOIS) {
-               dev_dbg(dev->dev.parent, "bus-off mode interrupt\n");
+               netdev_dbg(dev, "bus-off mode interrupt\n");
                state = CAN_STATE_BUS_OFF;
                cf->can_id |= CAN_ERR_BUSOFF;
                can_bus_off(dev);
@@ -347,13 +358,12 @@ static int bfin_can_err(struct net_device *dev, u16 isrc, u16 status)
 
        if (isrc & EPIS) {
                /* error passive interrupt */
-               dev_dbg(dev->dev.parent, "error passive interrupt\n");
+               netdev_dbg(dev, "error passive interrupt\n");
                state = CAN_STATE_ERROR_PASSIVE;
        }
 
        if ((isrc & EWTIS) || (isrc & EWRIS)) {
-               dev_dbg(dev->dev.parent,
-                               "Error Warning Transmit/Receive Interrupt\n");
+               netdev_dbg(dev, "Error Warning Transmit/Receive Interrupt\n");
                state = CAN_STATE_ERROR_WARNING;
        }
 
@@ -509,6 +519,7 @@ struct net_device *alloc_bfin_candev(void)
        priv->can.bittiming_const = &bfin_can_bittiming_const;
        priv->can.do_set_bittiming = bfin_can_set_bittiming;
        priv->can.do_set_mode = bfin_can_set_mode;
+       priv->can.do_get_berr_counter = bfin_can_get_berr_counter;
        priv->can.ctrlmode_supported = CAN_CTRLMODE_3_SAMPLES;
 
        return dev;
@@ -636,8 +647,7 @@ static int bfin_can_suspend(struct platform_device *pdev, pm_message_t mesg)
                while (!(bfin_read(&reg->intr) & SMACK)) {
                        udelay(10);
                        if (--timeout == 0) {
-                               dev_err(dev->dev.parent,
-                                               "fail to enter sleep mode\n");
+                               netdev_err(dev, "fail to enter sleep mode\n");
                                BUG();
                        }
                }
index c30f0e6..d42a6a7 100644 (file)
@@ -34,7 +34,6 @@
 #include <linux/can.h>
 #include <linux/can/dev.h>
 #include <linux/can/error.h>
-#include <linux/can/dev.h>
 #include <linux/can/platform/cc770.h>
 
 #include "cc770.h"
index 120f1ab..c5fe3a3 100644 (file)
@@ -130,13 +130,13 @@ static int can_calc_bittiming(struct net_device *dev, struct can_bittiming *bt)
                /* Error in one-tenth of a percent */
                error = (best_error * 1000) / bt->bitrate;
                if (error > CAN_CALC_MAX_ERROR) {
-                       dev_err(dev->dev.parent,
-                               "bitrate error %ld.%ld%% too high\n",
-                               error / 10, error % 10);
+                       netdev_err(dev,
+                                  "bitrate error %ld.%ld%% too high\n",
+                                  error / 10, error % 10);
                        return -EDOM;
                } else {
-                       dev_warn(dev->dev.parent, "bitrate error %ld.%ld%%\n",
-                                error / 10, error % 10);
+                       netdev_warn(dev, "bitrate error %ld.%ld%%\n",
+                                   error / 10, error % 10);
                }
        }
 
@@ -172,7 +172,7 @@ static int can_calc_bittiming(struct net_device *dev, struct can_bittiming *bt)
 #else /* !CONFIG_CAN_CALC_BITTIMING */
 static int can_calc_bittiming(struct net_device *dev, struct can_bittiming *bt)
 {
-       dev_err(dev->dev.parent, "bit-timing calculation not available\n");
+       netdev_err(dev, "bit-timing calculation not available\n");
        return -EINVAL;
 }
 #endif /* CONFIG_CAN_CALC_BITTIMING */
@@ -313,8 +313,7 @@ void can_put_echo_skb(struct sk_buff *skb, struct net_device *dev,
                priv->echo_skb[idx] = skb;
        } else {
                /* locking problem with netif_stop_queue() ?? */
-               dev_err(dev->dev.parent, "%s: BUG! echo_skb is occupied!\n",
-                       __func__);
+               netdev_err(dev, "%s: BUG! echo_skb is occupied!\n", __func__);
                kfree_skb(skb);
        }
 }
@@ -327,16 +326,24 @@ EXPORT_SYMBOL_GPL(can_put_echo_skb);
  * is handled in the device driver. The driver must protect
  * access to priv->echo_skb, if necessary.
  */
-void can_get_echo_skb(struct net_device *dev, unsigned int idx)
+unsigned int can_get_echo_skb(struct net_device *dev, unsigned int idx)
 {
        struct can_priv *priv = netdev_priv(dev);
 
        BUG_ON(idx >= priv->echo_skb_max);
 
        if (priv->echo_skb[idx]) {
+               struct sk_buff *skb = priv->echo_skb[idx];
+               struct can_frame *cf = (struct can_frame *)skb->data;
+               u8 dlc = cf->can_dlc;
+
                netif_rx(priv->echo_skb[idx]);
                priv->echo_skb[idx] = NULL;
+
+               return dlc;
        }
+
+       return 0;
 }
 EXPORT_SYMBOL_GPL(can_get_echo_skb);
 
@@ -392,7 +399,7 @@ void can_restart(unsigned long data)
        stats->rx_bytes += cf->can_dlc;
 
 restart:
-       dev_dbg(dev->dev.parent, "restarted\n");
+       netdev_dbg(dev, "restarted\n");
        priv->can_stats.restarts++;
 
        /* Now restart the device */
@@ -400,7 +407,7 @@ restart:
 
        netif_carrier_on(dev);
        if (err)
-               dev_err(dev->dev.parent, "Error %d during restart", err);
+               netdev_err(dev, "Error %d during restart", err);
 }
 
 int can_restart_now(struct net_device *dev)
@@ -433,7 +440,7 @@ void can_bus_off(struct net_device *dev)
 {
        struct can_priv *priv = netdev_priv(dev);
 
-       dev_dbg(dev->dev.parent, "bus-off\n");
+       netdev_dbg(dev, "bus-off\n");
 
        netif_carrier_off(dev);
        priv->can_stats.bus_off++;
@@ -545,7 +552,7 @@ int open_candev(struct net_device *dev)
        struct can_priv *priv = netdev_priv(dev);
 
        if (!priv->bittiming.tq && !priv->bittiming.bitrate) {
-               dev_err(dev->dev.parent, "bit-timing not yet defined\n");
+               netdev_err(dev, "bit-timing not yet defined\n");
                return -EINVAL;
        }
 
index 96d2357..1efb083 100644 (file)
@@ -272,7 +272,6 @@ static int flexcan_get_berr_counter(const struct net_device *dev,
 static int flexcan_start_xmit(struct sk_buff *skb, struct net_device *dev)
 {
        const struct flexcan_priv *priv = netdev_priv(dev);
-       struct net_device_stats *stats = &dev->stats;
        struct flexcan_regs __iomem *regs = priv->base;
        struct can_frame *cf = (struct can_frame *)skb->data;
        u32 can_id;
@@ -302,14 +301,11 @@ static int flexcan_start_xmit(struct sk_buff *skb, struct net_device *dev)
                flexcan_write(data, &regs->cantxfg[FLEXCAN_TX_BUF_ID].data[1]);
        }
 
+       can_put_echo_skb(skb, dev, 0);
+
        flexcan_write(can_id, &regs->cantxfg[FLEXCAN_TX_BUF_ID].can_id);
        flexcan_write(ctrl, &regs->cantxfg[FLEXCAN_TX_BUF_ID].can_ctrl);
 
-       kfree_skb(skb);
-
-       /* tx_packets is incremented in flexcan_irq */
-       stats->tx_bytes += cf->can_dlc;
-
        return NETDEV_TX_OK;
 }
 
@@ -322,34 +318,34 @@ static void do_bus_err(struct net_device *dev,
        cf->can_id |= CAN_ERR_PROT | CAN_ERR_BUSERROR;
 
        if (reg_esr & FLEXCAN_ESR_BIT1_ERR) {
-               dev_dbg(dev->dev.parent, "BIT1_ERR irq\n");
+               netdev_dbg(dev, "BIT1_ERR irq\n");
                cf->data[2] |= CAN_ERR_PROT_BIT1;
                tx_errors = 1;
        }
        if (reg_esr & FLEXCAN_ESR_BIT0_ERR) {
-               dev_dbg(dev->dev.parent, "BIT0_ERR irq\n");
+               netdev_dbg(dev, "BIT0_ERR irq\n");
                cf->data[2] |= CAN_ERR_PROT_BIT0;
                tx_errors = 1;
        }
        if (reg_esr & FLEXCAN_ESR_ACK_ERR) {
-               dev_dbg(dev->dev.parent, "ACK_ERR irq\n");
+               netdev_dbg(dev, "ACK_ERR irq\n");
                cf->can_id |= CAN_ERR_ACK;
                cf->data[3] |= CAN_ERR_PROT_LOC_ACK;
                tx_errors = 1;
        }
        if (reg_esr & FLEXCAN_ESR_CRC_ERR) {
-               dev_dbg(dev->dev.parent, "CRC_ERR irq\n");
+               netdev_dbg(dev, "CRC_ERR irq\n");
                cf->data[2] |= CAN_ERR_PROT_BIT;
                cf->data[3] |= CAN_ERR_PROT_LOC_CRC_SEQ;
                rx_errors = 1;
        }
        if (reg_esr & FLEXCAN_ESR_FRM_ERR) {
-               dev_dbg(dev->dev.parent, "FRM_ERR irq\n");
+               netdev_dbg(dev, "FRM_ERR irq\n");
                cf->data[2] |= CAN_ERR_PROT_FORM;
                rx_errors = 1;
        }
        if (reg_esr & FLEXCAN_ESR_STF_ERR) {
-               dev_dbg(dev->dev.parent, "STF_ERR irq\n");
+               netdev_dbg(dev, "STF_ERR irq\n");
                cf->data[2] |= CAN_ERR_PROT_STUFF;
                rx_errors = 1;
        }
@@ -396,7 +392,7 @@ static void do_state(struct net_device *dev,
                 */
                if (new_state >= CAN_STATE_ERROR_WARNING &&
                    new_state <= CAN_STATE_BUS_OFF) {
-                       dev_dbg(dev->dev.parent, "Error Warning IRQ\n");
+                       netdev_dbg(dev, "Error Warning IRQ\n");
                        priv->can.can_stats.error_warning++;
 
                        cf->can_id |= CAN_ERR_CRTL;
@@ -412,7 +408,7 @@ static void do_state(struct net_device *dev,
                 */
                if (new_state >= CAN_STATE_ERROR_PASSIVE &&
                    new_state <= CAN_STATE_BUS_OFF) {
-                       dev_dbg(dev->dev.parent, "Error Passive IRQ\n");
+                       netdev_dbg(dev, "Error Passive IRQ\n");
                        priv->can.can_stats.error_passive++;
 
                        cf->can_id |= CAN_ERR_CRTL;
@@ -422,8 +418,8 @@ static void do_state(struct net_device *dev,
                }
                break;
        case CAN_STATE_BUS_OFF:
-               dev_err(dev->dev.parent,
-                       "BUG! hardware recovered automatically from BUS_OFF\n");
+               netdev_err(dev, "BUG! "
+                          "hardware recovered automatically from BUS_OFF\n");
                break;
        default:
                break;
@@ -432,7 +428,7 @@ static void do_state(struct net_device *dev,
        /* process state changes depending on the new state */
        switch (new_state) {
        case CAN_STATE_ERROR_ACTIVE:
-               dev_dbg(dev->dev.parent, "Error Active\n");
+               netdev_dbg(dev, "Error Active\n");
                cf->can_id |= CAN_ERR_PROT;
                cf->data[2] = CAN_ERR_PROT_ACTIVE;
                break;
@@ -614,7 +610,7 @@ static irqreturn_t flexcan_irq(int irq, void *dev_id)
 
        /* transmission complete interrupt */
        if (reg_iflag1 & (1 << FLEXCAN_TX_BUF_ID)) {
-               /* tx_bytes is incremented in flexcan_start_xmit */
+               stats->tx_bytes += can_get_echo_skb(dev, 0);
                stats->tx_packets++;
                flexcan_write((1 << FLEXCAN_TX_BUF_ID), &regs->iflag1);
                netif_wake_queue(dev);
@@ -653,12 +649,12 @@ static void flexcan_set_bittiming(struct net_device *dev)
        if (priv->can.ctrlmode & CAN_CTRLMODE_3_SAMPLES)
                reg |= FLEXCAN_CTRL_SMP;
 
-       dev_info(dev->dev.parent, "writing ctrl=0x%08x\n", reg);
+       netdev_info(dev, "writing ctrl=0x%08x\n", reg);
        flexcan_write(reg, &regs->ctrl);
 
        /* print chip status */
-       dev_dbg(dev->dev.parent, "%s: mcr=0x%08x ctrl=0x%08x\n", __func__,
-               flexcan_read(&regs->mcr), flexcan_read(&regs->ctrl));
+       netdev_dbg(dev, "%s: mcr=0x%08x ctrl=0x%08x\n", __func__,
+                  flexcan_read(&regs->mcr), flexcan_read(&regs->ctrl));
 }
 
 /*
@@ -684,9 +680,8 @@ static int flexcan_chip_start(struct net_device *dev)
 
        reg_mcr = flexcan_read(&regs->mcr);
        if (reg_mcr & FLEXCAN_MCR_SOFTRST) {
-               dev_err(dev->dev.parent,
-                       "Failed to softreset can module (mcr=0x%08x)\n",
-                       reg_mcr);
+               netdev_err(dev, "Failed to softreset can module (mcr=0x%08x)\n",
+                          reg_mcr);
                err = -ENODEV;
                goto out;
        }
@@ -702,13 +697,14 @@ static int flexcan_chip_start(struct net_device *dev)
         * only supervisor access
         * enable warning int
         * choose format C
+        * disable local echo
         *
         */
        reg_mcr = flexcan_read(&regs->mcr);
        reg_mcr |= FLEXCAN_MCR_FRZ | FLEXCAN_MCR_FEN | FLEXCAN_MCR_HALT |
                FLEXCAN_MCR_SUPV | FLEXCAN_MCR_WRN_EN |
-               FLEXCAN_MCR_IDAM_C;
-       dev_dbg(dev->dev.parent, "%s: writing mcr=0x%08x", __func__, reg_mcr);
+               FLEXCAN_MCR_IDAM_C | FLEXCAN_MCR_SRX_DIS;
+       netdev_dbg(dev, "%s: writing mcr=0x%08x", __func__, reg_mcr);
        flexcan_write(reg_mcr, &regs->mcr);
 
        /*
@@ -734,7 +730,7 @@ static int flexcan_chip_start(struct net_device *dev)
 
        /* save for later use */
        priv->reg_ctrl_default = reg_ctrl;
-       dev_dbg(dev->dev.parent, "%s: writing ctrl=0x%08x", __func__, reg_ctrl);
+       netdev_dbg(dev, "%s: writing ctrl=0x%08x", __func__, reg_ctrl);
        flexcan_write(reg_ctrl, &regs->ctrl);
 
        for (i = 0; i < ARRAY_SIZE(regs->cantxfg); i++) {
@@ -766,8 +762,8 @@ static int flexcan_chip_start(struct net_device *dev)
        flexcan_write(FLEXCAN_IFLAG_DEFAULT, &regs->imask1);
 
        /* print chip status */
-       dev_dbg(dev->dev.parent, "%s: reading mcr=0x%08x ctrl=0x%08x\n",
-               __func__, flexcan_read(&regs->mcr), flexcan_read(&regs->ctrl));
+       netdev_dbg(dev, "%s: reading mcr=0x%08x ctrl=0x%08x\n", __func__,
+                  flexcan_read(&regs->mcr), flexcan_read(&regs->ctrl));
 
        return 0;
 
@@ -905,8 +901,7 @@ static int __devinit register_flexcandev(struct net_device *dev)
         */
        reg = flexcan_read(&regs->mcr);
        if (!(reg & FLEXCAN_MCR_FEN)) {
-               dev_err(dev->dev.parent,
-                       "Could not enable RX FIFO, unsupported core\n");
+               netdev_err(dev, "Could not enable RX FIFO, unsupported core\n");
                err = -ENODEV;
                goto out;
        }
@@ -975,7 +970,7 @@ static int __devinit flexcan_probe(struct platform_device *pdev)
                goto failed_map;
        }
 
-       dev = alloc_candev(sizeof(struct flexcan_priv), 0);
+       dev = alloc_candev(sizeof(struct flexcan_priv), 1);
        if (!dev) {
                err = -ENOMEM;
                goto failed_alloc;
@@ -983,7 +978,7 @@ static int __devinit flexcan_probe(struct platform_device *pdev)
 
        dev->netdev_ops = &flexcan_netdev_ops;
        dev->irq = irq;
-       dev->flags |= IFF_ECHO; /* we support local echo in hardware */
+       dev->flags |= IFF_ECHO;
 
        priv = netdev_priv(dev);
        priv->can.clock.freq = clock_freq;
index 330140e..346785c 100644 (file)
@@ -712,8 +712,7 @@ static void mcp251x_error_skb(struct net_device *net, int can_id, int data1)
                frame->data[1] = data1;
                netif_rx_ni(skb);
        } else {
-               dev_err(&net->dev,
-                       "cannot allocate error skb\n");
+               netdev_err(net, "cannot allocate error skb\n");
        }
 }
 
index 1c82dd8..41a2a2d 100644 (file)
@@ -95,9 +95,9 @@ static int mscan_set_mode(struct net_device *dev, u8 mode)
                         * any, at once.
                         */
                        if (i >= MSCAN_SET_MODE_RETRIES)
-                               dev_dbg(dev->dev.parent,
-                                       "device failed to enter sleep mode. "
-                                       "We proceed anyhow.\n");
+                               netdev_dbg(dev,
+                                          "device failed to enter sleep mode. "
+                                          "We proceed anyhow.\n");
                        else
                                priv->can.state = CAN_STATE_SLEEPING;
                }
@@ -213,7 +213,7 @@ static netdev_tx_t mscan_start_xmit(struct sk_buff *skb, struct net_device *dev)
        switch (hweight8(i)) {
        case 0:
                netif_stop_queue(dev);
-               dev_err(dev->dev.parent, "Tx Ring full when queue awake!\n");
+               netdev_err(dev, "Tx Ring full when queue awake!\n");
                return NETDEV_TX_BUSY;
        case 1:
                /*
@@ -352,7 +352,7 @@ static void mscan_get_err_frame(struct net_device *dev, struct can_frame *frame,
        struct net_device_stats *stats = &dev->stats;
        enum can_state old_state;
 
-       dev_dbg(dev->dev.parent, "error interrupt (canrflg=%#x)\n", canrflg);
+       netdev_dbg(dev, "error interrupt (canrflg=%#x)\n", canrflg);
        frame->can_id = CAN_ERR_FLAG;
 
        if (canrflg & MSCAN_OVRIF) {
@@ -427,7 +427,7 @@ static int mscan_rx_poll(struct napi_struct *napi, int quota)
                skb = alloc_can_skb(dev, &frame);
                if (!skb) {
                        if (printk_ratelimit())
-                               dev_notice(dev->dev.parent, "packet dropped\n");
+                               netdev_notice(dev, "packet dropped\n");
                        stats->rx_dropped++;
                        out_8(&regs->canrflg, canrflg);
                        continue;
@@ -551,8 +551,7 @@ static int mscan_do_set_bittiming(struct net_device *dev)
                BTR1_SET_TSEG2(bt->phase_seg2) |
                BTR1_SET_SAM(priv->can.ctrlmode & CAN_CTRLMODE_3_SAMPLES));
 
-       dev_info(dev->dev.parent, "setting BTR0=0x%02x BTR1=0x%02x\n",
-               btr0, btr1);
+       netdev_info(dev, "setting BTR0=0x%02x BTR1=0x%02x\n", btr0, btr1);
 
        out_8(&regs->canbtr0, btr0);
        out_8(&regs->canbtr1, btr1);
@@ -560,6 +559,18 @@ static int mscan_do_set_bittiming(struct net_device *dev)
        return 0;
 }
 
+static int mscan_get_berr_counter(const struct net_device *dev,
+                                 struct can_berr_counter *bec)
+{
+       struct mscan_priv *priv = netdev_priv(dev);
+       struct mscan_regs __iomem *regs = priv->reg_base;
+
+       bec->txerr = in_8(&regs->cantxerr);
+       bec->rxerr = in_8(&regs->canrxerr);
+
+       return 0;
+}
+
 static int mscan_open(struct net_device *dev)
 {
        int ret;
@@ -575,7 +586,7 @@ static int mscan_open(struct net_device *dev)
 
        ret = request_irq(dev->irq, mscan_isr, 0, dev->name, dev);
        if (ret < 0) {
-               dev_err(dev->dev.parent, "failed to attach interrupt\n");
+               netdev_err(dev, "failed to attach interrupt\n");
                goto exit_napi_disable;
        }
 
@@ -639,8 +650,10 @@ int register_mscandev(struct net_device *dev, int mscan_clksrc)
        else
                ctl1 &= ~MSCAN_CLKSRC;
 
-       if (priv->type == MSCAN_TYPE_MPC5121)
+       if (priv->type == MSCAN_TYPE_MPC5121) {
+               priv->can.do_get_berr_counter = mscan_get_berr_counter;
                ctl1 |= MSCAN_BORM; /* bus-off recovery upon request */
+       }
 
        ctl1 |= MSCAN_CANE;
        out_8(&regs->canctl1, ctl1);
index 6edc25e..2bb215e 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 1999 - 2010 Intel Corporation.
- * Copyright (C) 2010 OKI SEMICONDUCTOR CO., LTD.
+ * Copyright (C) 2010 LAPIS SEMICONDUCTOR CO., LTD.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 36e9d59..b60d6c5 100644 (file)
@@ -43,12 +43,33 @@ config CAN_EMS_PCI
          CPC-PCIe and CPC-104P cards from EMS Dr. Thomas Wuensche
          (http://www.ems-wuensche.de).
 
+config CAN_PEAK_PCMCIA
+       tristate "PEAK PCAN-PC Card"
+       depends on PCMCIA
+       ---help---
+         This driver is for the PCAN-PC Card PCMCIA adapter (1 or 2 channels)
+         from PEAK-System (http://www.peak-system.com). To compile this
+         driver as a module, choose M here: the module will be called
+         peak_pcmcia.
+
 config CAN_PEAK_PCI
-       tristate "PEAK PCAN PCI/PCIe Cards"
+       tristate "PEAK PCAN-PCI/PCIe/miniPCI Cards"
        depends on PCI
        ---help---
-         This driver is for the PCAN PCI/PCIe cards (1, 2, 3 or 4 channels)
-         from PEAK Systems (http://www.peak-system.com).
+         This driver is for the PCAN-PCI/PCIe/miniPCI cards
+         (1, 2, 3 or 4 channels) from PEAK-System Technik
+         (http://www.peak-system.com).
+
+config CAN_PEAK_PCIEC
+       bool "PEAK PCAN-ExpressCard Cards"
+       depends on CAN_PEAK_PCI
+       select I2C
+       select I2C_ALGOBIT
+       default y
+       ---help---
+         Say Y here if you want to use a PCAN-ExpressCard from PEAK-System
+         Technik. This will also automatically select I2C and I2C_ALGO
+         configuration options.
 
 config CAN_KVASER_PCI
        tristate "Kvaser PCIcanx and Kvaser PCIcan PCI Cards"
@@ -71,6 +92,7 @@ config CAN_PLX_PCI
           - esd CAN-PCIe/2000
           - Marathon CAN-bus-PCI card (http://www.marathon.ru/)
           - TEWS TECHNOLOGIES TPMC810 card (http://www.tews.com/)
+          - IXXAT Automation PC-I 04/PCI card (http://www.ixxat.com/)
 
 config CAN_TSCAN1
        tristate "TS-CAN1 PC104 boards"
index 0604f24..b3d05cb 100644 (file)
@@ -9,6 +9,7 @@ obj-$(CONFIG_CAN_SJA1000_OF_PLATFORM) += sja1000_of_platform.o
 obj-$(CONFIG_CAN_EMS_PCMCIA) += ems_pcmcia.o
 obj-$(CONFIG_CAN_EMS_PCI) += ems_pci.o
 obj-$(CONFIG_CAN_KVASER_PCI) += kvaser_pci.o
+obj-$(CONFIG_CAN_PEAK_PCMCIA) += peak_pcmcia.o
 obj-$(CONFIG_CAN_PEAK_PCI) += peak_pci.o
 obj-$(CONFIG_CAN_PLX_PCI) += plx_pci.o
 obj-$(CONFIG_CAN_TSCAN1) += tscan1.o
index 2147959..5f92b86 100644 (file)
@@ -1,5 +1,6 @@
 /*
  * Copyright (C) 2007, 2011 Wolfgang Grandegger <wg@grandegger.com>
+ * Copyright (C) 2012 Stephane Grosjean <s.grosjean@peak-system.com>
  *
  * Derived from the PCAN project file driver/src/pcan_pci.c:
  *
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  */
 
 #include <linux/kernel.h>
 #include <linux/delay.h>
 #include <linux/pci.h>
 #include <linux/io.h>
+#include <linux/i2c.h>
+#include <linux/i2c-algo-bit.h>
 #include <linux/can.h>
 #include <linux/can/dev.h>
 
 #include "sja1000.h"
 
 MODULE_AUTHOR("Wolfgang Grandegger <wg@grandegger.com>");
-MODULE_DESCRIPTION("Socket-CAN driver for PEAK PCAN PCI/PCIe cards");
-MODULE_SUPPORTED_DEVICE("PEAK PCAN PCI/PCIe CAN card");
+MODULE_DESCRIPTION("Socket-CAN driver for PEAK PCAN PCI family cards");
+MODULE_SUPPORTED_DEVICE("PEAK PCAN PCI/PCIe/PCIeC miniPCI CAN cards");
 MODULE_LICENSE("GPL v2");
 
 #define DRV_NAME  "peak_pci"
 
+struct peak_pciec_card;
 struct peak_pci_chan {
        void __iomem *cfg_base;         /* Common for all channels */
        struct net_device *prev_dev;    /* Chain of network devices */
        u16 icr_mask;                   /* Interrupt mask for fast ack */
+       struct peak_pciec_card *pciec_card;     /* only for PCIeC LEDs */
 };
 
 #define PEAK_PCI_CAN_CLOCK     (16000000 / 2)
@@ -61,16 +62,464 @@ struct peak_pci_chan {
 
 #define PEAK_PCI_VENDOR_ID     0x001C  /* The PCI device and vendor IDs */
 #define PEAK_PCI_DEVICE_ID     0x0001  /* for PCI/PCIe slot cards */
+#define PEAK_PCIEC_DEVICE_ID   0x0002  /* for ExpressCard slot cards */
+#define PEAK_PCIE_DEVICE_ID    0x0003  /* for nextgen PCIe slot cards */
+#define PEAK_MPCI_DEVICE_ID    0x0008  /* The miniPCI slot cards */
+
+#define PEAK_PCI_CHAN_MAX      4
 
-static const u16 peak_pci_icr_masks[] = {0x02, 0x01, 0x40, 0x80};
+static const u16 peak_pci_icr_masks[PEAK_PCI_CHAN_MAX] = {
+       0x02, 0x01, 0x40, 0x80
+};
 
 static DEFINE_PCI_DEVICE_TABLE(peak_pci_tbl) = {
        {PEAK_PCI_VENDOR_ID, PEAK_PCI_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID,},
+       {PEAK_PCI_VENDOR_ID, PEAK_PCIE_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID,},
+       {PEAK_PCI_VENDOR_ID, PEAK_MPCI_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID,},
+#ifdef CONFIG_CAN_PEAK_PCIEC
+       {PEAK_PCI_VENDOR_ID, PEAK_PCIEC_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID,},
+#endif
        {0,}
 };
 
 MODULE_DEVICE_TABLE(pci, peak_pci_tbl);
 
+#ifdef CONFIG_CAN_PEAK_PCIEC
+/*
+ * PCAN-ExpressCard needs I2C bit-banging configuration option.
+ */
+
+/* GPIOICR byte access offsets */
+#define PITA_GPOUT             0x18    /* GPx output value */
+#define PITA_GPIN              0x19    /* GPx input value */
+#define PITA_GPOEN             0x1A    /* configure GPx as ouput pin */
+
+/* I2C GP bits */
+#define PITA_GPIN_SCL          0x01    /* Serial Clock Line */
+#define PITA_GPIN_SDA          0x04    /* Serial DAta line */
+
+#define PCA9553_1_SLAVEADDR    (0xC4 >> 1)
+
+/* PCA9553 LS0 fields values */
+enum {
+       PCA9553_LOW,
+       PCA9553_HIGHZ,
+       PCA9553_PWM0,
+       PCA9553_PWM1
+};
+
+/* LEDs control */
+#define PCA9553_ON             PCA9553_LOW
+#define PCA9553_OFF            PCA9553_HIGHZ
+#define PCA9553_SLOW           PCA9553_PWM0
+#define PCA9553_FAST           PCA9553_PWM1
+
+#define PCA9553_LED(c)         (1 << (c))
+#define PCA9553_LED_STATE(s, c)        ((s) << ((c) << 1))
+
+#define PCA9553_LED_ON(c)      PCA9553_LED_STATE(PCA9553_ON, c)
+#define PCA9553_LED_OFF(c)     PCA9553_LED_STATE(PCA9553_OFF, c)
+#define PCA9553_LED_SLOW(c)    PCA9553_LED_STATE(PCA9553_SLOW, c)
+#define PCA9553_LED_FAST(c)    PCA9553_LED_STATE(PCA9553_FAST, c)
+#define PCA9553_LED_MASK(c)    PCA9553_LED_STATE(0x03, c)
+
+#define PCA9553_LED_OFF_ALL    (PCA9553_LED_OFF(0) | PCA9553_LED_OFF(1))
+
+#define PCA9553_LS0_INIT       0x40 /* initial value (!= from 0x00) */
+
+struct peak_pciec_chan {
+       struct net_device *netdev;
+       unsigned long prev_rx_bytes;
+       unsigned long prev_tx_bytes;
+};
+
+struct peak_pciec_card {
+       void __iomem *cfg_base;         /* Common for all channels */
+       void __iomem *reg_base;         /* first channel base address */
+       u8 led_cache;                   /* leds state cache */
+
+       /* PCIExpressCard i2c data */
+       struct i2c_algo_bit_data i2c_bit;
+       struct i2c_adapter led_chip;
+       struct delayed_work led_work;   /* led delayed work */
+       int chan_count;
+       struct peak_pciec_chan channel[PEAK_PCI_CHAN_MAX];
+};
+
+/* "normal" pci register write callback is overloaded for leds control */
+static void peak_pci_write_reg(const struct sja1000_priv *priv,
+                              int port, u8 val);
+
+static inline void pita_set_scl_highz(struct peak_pciec_card *card)
+{
+       u8 gp_outen = readb(card->cfg_base + PITA_GPOEN) & ~PITA_GPIN_SCL;
+       writeb(gp_outen, card->cfg_base + PITA_GPOEN);
+}
+
+static inline void pita_set_sda_highz(struct peak_pciec_card *card)
+{
+       u8 gp_outen = readb(card->cfg_base + PITA_GPOEN) & ~PITA_GPIN_SDA;
+       writeb(gp_outen, card->cfg_base + PITA_GPOEN);
+}
+
+static void peak_pciec_init_pita_gpio(struct peak_pciec_card *card)
+{
+       /* raise SCL & SDA GPIOs to high-Z */
+       pita_set_scl_highz(card);
+       pita_set_sda_highz(card);
+}
+
+static void pita_setsda(void *data, int state)
+{
+       struct peak_pciec_card *card = (struct peak_pciec_card *)data;
+       u8 gp_out, gp_outen;
+
+       /* set output sda always to 0 */
+       gp_out = readb(card->cfg_base + PITA_GPOUT) & ~PITA_GPIN_SDA;
+       writeb(gp_out, card->cfg_base + PITA_GPOUT);
+
+       /* control output sda with GPOEN */
+       gp_outen = readb(card->cfg_base + PITA_GPOEN);
+       if (state)
+               gp_outen &= ~PITA_GPIN_SDA;
+       else
+               gp_outen |= PITA_GPIN_SDA;
+
+       writeb(gp_outen, card->cfg_base + PITA_GPOEN);
+}
+
+static void pita_setscl(void *data, int state)
+{
+       struct peak_pciec_card *card = (struct peak_pciec_card *)data;
+       u8 gp_out, gp_outen;
+
+       /* set output scl always to 0 */
+       gp_out = readb(card->cfg_base + PITA_GPOUT) & ~PITA_GPIN_SCL;
+       writeb(gp_out, card->cfg_base + PITA_GPOUT);
+
+       /* control output scl with GPOEN */
+       gp_outen = readb(card->cfg_base + PITA_GPOEN);
+       if (state)
+               gp_outen &= ~PITA_GPIN_SCL;
+       else
+               gp_outen |= PITA_GPIN_SCL;
+
+       writeb(gp_outen, card->cfg_base + PITA_GPOEN);
+}
+
+static int pita_getsda(void *data)
+{
+       struct peak_pciec_card *card = (struct peak_pciec_card *)data;
+
+       /* set tristate */
+       pita_set_sda_highz(card);
+
+       return (readb(card->cfg_base + PITA_GPIN) & PITA_GPIN_SDA) ? 1 : 0;
+}
+
+static int pita_getscl(void *data)
+{
+       struct peak_pciec_card *card = (struct peak_pciec_card *)data;
+
+       /* set tristate */
+       pita_set_scl_highz(card);
+
+       return (readb(card->cfg_base + PITA_GPIN) & PITA_GPIN_SCL) ? 1 : 0;
+}
+
+/*
+ * write commands to the LED chip though the I2C-bus of the PCAN-PCIeC
+ */
+static int peak_pciec_write_pca9553(struct peak_pciec_card *card,
+                                   u8 offset, u8 data)
+{
+       u8 buffer[2] = {
+               offset,
+               data
+       };
+       struct i2c_msg msg = {
+               .addr = PCA9553_1_SLAVEADDR,
+               .len = 2,
+               .buf = buffer,
+       };
+       int ret;
+
+       /* cache led mask */
+       if ((offset == 5) && (data == card->led_cache))
+               return 0;
+
+       ret = i2c_transfer(&card->led_chip, &msg, 1);
+       if (ret < 0)
+               return ret;
+
+       if (offset == 5)
+               card->led_cache = data;
+
+       return 0;
+}
+
+/*
+ * delayed work callback used to control the LEDs
+ */
+static void peak_pciec_led_work(struct work_struct *work)
+{
+       struct peak_pciec_card *card =
+               container_of(work, struct peak_pciec_card, led_work.work);
+       struct net_device *netdev;
+       u8 new_led = card->led_cache;
+       int i, up_count = 0;
+
+       /* first check what is to do */
+       for (i = 0; i < card->chan_count; i++) {
+               /* default is: not configured */
+               new_led &= ~PCA9553_LED_MASK(i);
+               new_led |= PCA9553_LED_ON(i);
+
+               netdev = card->channel[i].netdev;
+               if (!netdev || !(netdev->flags & IFF_UP))
+                       continue;
+
+               up_count++;
+
+               /* no activity (but configured) */
+               new_led &= ~PCA9553_LED_MASK(i);
+               new_led |= PCA9553_LED_SLOW(i);
+
+               /* if bytes counters changed, set fast blinking led */
+               if (netdev->stats.rx_bytes != card->channel[i].prev_rx_bytes) {
+                       card->channel[i].prev_rx_bytes = netdev->stats.rx_bytes;
+                       new_led &= ~PCA9553_LED_MASK(i);
+                       new_led |= PCA9553_LED_FAST(i);
+               }
+               if (netdev->stats.tx_bytes != card->channel[i].prev_tx_bytes) {
+                       card->channel[i].prev_tx_bytes = netdev->stats.tx_bytes;
+                       new_led &= ~PCA9553_LED_MASK(i);
+                       new_led |= PCA9553_LED_FAST(i);
+               }
+       }
+
+       /* check if LS0 settings changed, only update i2c if so */
+       peak_pciec_write_pca9553(card, 5, new_led);
+
+       /* restart timer (except if no more configured channels) */
+       if (up_count)
+               schedule_delayed_work(&card->led_work, HZ);
+}
+
+/*
+ * set LEDs blinking state
+ */
+static void peak_pciec_set_leds(struct peak_pciec_card *card, u8 led_mask, u8 s)
+{
+       u8 new_led = card->led_cache;
+       int i;
+
+       /* first check what is to do */
+       for (i = 0; i < card->chan_count; i++)
+               if (led_mask & PCA9553_LED(i)) {
+                       new_led &= ~PCA9553_LED_MASK(i);
+                       new_led |= PCA9553_LED_STATE(s, i);
+               }
+
+       /* check if LS0 settings changed, only update i2c if so */
+       peak_pciec_write_pca9553(card, 5, new_led);
+}
+
+/*
+ * start one second delayed work to control LEDs
+ */
+static void peak_pciec_start_led_work(struct peak_pciec_card *card)
+{
+       if (!delayed_work_pending(&card->led_work))
+               schedule_delayed_work(&card->led_work, HZ);
+}
+
+/*
+ * stop LEDs delayed work
+ */
+static void peak_pciec_stop_led_work(struct peak_pciec_card *card)
+{
+       cancel_delayed_work_sync(&card->led_work);
+}
+
+/*
+ * initialize the PCA9553 4-bit I2C-bus LED chip
+ */
+static int peak_pciec_init_leds(struct peak_pciec_card *card)
+{
+       int err;
+
+       /* prescaler for frequency 0: "SLOW" = 1 Hz = "44" */
+       err = peak_pciec_write_pca9553(card, 1, 44 / 1);
+       if (err)
+               return err;
+
+       /* duty cycle 0: 50% */
+       err = peak_pciec_write_pca9553(card, 2, 0x80);
+       if (err)
+               return err;
+
+       /* prescaler for frequency 1: "FAST" = 5 Hz */
+       err = peak_pciec_write_pca9553(card, 3, 44 / 5);
+       if (err)
+               return err;
+
+       /* duty cycle 1: 50% */
+       err = peak_pciec_write_pca9553(card, 4, 0x80);
+       if (err)
+               return err;
+
+       /* switch LEDs to initial state */
+       return peak_pciec_write_pca9553(card, 5, PCA9553_LS0_INIT);
+}
+
+/*
+ * restore LEDs state to off peak_pciec_leds_exit
+ */
+static void peak_pciec_leds_exit(struct peak_pciec_card *card)
+{
+       /* switch LEDs to off */
+       peak_pciec_write_pca9553(card, 5, PCA9553_LED_OFF_ALL);
+}
+
+/*
+ * normal write sja1000 register method overloaded to catch when controller
+ * is started or stopped, to control leds
+ */
+static void peak_pciec_write_reg(const struct sja1000_priv *priv,
+                                int port, u8 val)
+{
+       struct peak_pci_chan *chan = priv->priv;
+       struct peak_pciec_card *card = chan->pciec_card;
+       int c = (priv->reg_base - card->reg_base) / PEAK_PCI_CHAN_SIZE;
+
+       /* sja1000 register changes control the leds state */
+       if (port == REG_MOD)
+               switch (val) {
+               case MOD_RM:
+                       /* Reset Mode: set led on */
+                       peak_pciec_set_leds(card, PCA9553_LED(c), PCA9553_ON);
+                       break;
+               case 0x00:
+                       /* Normal Mode: led slow blinking and start led timer */
+                       peak_pciec_set_leds(card, PCA9553_LED(c), PCA9553_SLOW);
+                       peak_pciec_start_led_work(card);
+                       break;
+               default:
+                       break;
+               }
+
+       /* call base function */
+       peak_pci_write_reg(priv, port, val);
+}
+
+static struct i2c_algo_bit_data peak_pciec_i2c_bit_ops = {
+       .setsda = pita_setsda,
+       .setscl = pita_setscl,
+       .getsda = pita_getsda,
+       .getscl = pita_getscl,
+       .udelay = 10,
+       .timeout = HZ,
+};
+
+static int peak_pciec_probe(struct pci_dev *pdev, struct net_device *dev)
+{
+       struct sja1000_priv *priv = netdev_priv(dev);
+       struct peak_pci_chan *chan = priv->priv;
+       struct peak_pciec_card *card;
+       int err;
+
+       /* copy i2c object address from 1st channel */
+       if (chan->prev_dev) {
+               struct sja1000_priv *prev_priv = netdev_priv(chan->prev_dev);
+               struct peak_pci_chan *prev_chan = prev_priv->priv;
+
+               card = prev_chan->pciec_card;
+               if (!card)
+                       return -ENODEV;
+
+       /* channel is the first one: do the init part */
+       } else {
+               /* create the bit banging I2C adapter structure */
+               card = kzalloc(sizeof(struct peak_pciec_card), GFP_KERNEL);
+               if (!card) {
+                       dev_err(&pdev->dev,
+                                "failed allocating memory for i2c chip\n");
+                       return -ENOMEM;
+               }
+
+               card->cfg_base = chan->cfg_base;
+               card->reg_base = priv->reg_base;
+
+               card->led_chip.owner = THIS_MODULE;
+               card->led_chip.dev.parent = &pdev->dev;
+               card->led_chip.algo_data = &card->i2c_bit;
+               strncpy(card->led_chip.name, "peak_i2c",
+                       sizeof(card->led_chip.name));
+
+               card->i2c_bit = peak_pciec_i2c_bit_ops;
+               card->i2c_bit.udelay = 10;
+               card->i2c_bit.timeout = HZ;
+               card->i2c_bit.data = card;
+
+               peak_pciec_init_pita_gpio(card);
+
+               err = i2c_bit_add_bus(&card->led_chip);
+               if (err) {
+                       dev_err(&pdev->dev, "i2c init failed\n");
+                       goto pciec_init_err_1;
+               }
+
+               err = peak_pciec_init_leds(card);
+               if (err) {
+                       dev_err(&pdev->dev, "leds hardware init failed\n");
+                       goto pciec_init_err_2;
+               }
+
+               INIT_DELAYED_WORK(&card->led_work, peak_pciec_led_work);
+               /* PCAN-ExpressCard needs its own callback for leds */
+               priv->write_reg = peak_pciec_write_reg;
+       }
+
+       chan->pciec_card = card;
+       card->channel[card->chan_count++].netdev = dev;
+
+       return 0;
+
+pciec_init_err_2:
+       i2c_del_adapter(&card->led_chip);
+
+pciec_init_err_1:
+       peak_pciec_init_pita_gpio(card);
+       kfree(card);
+
+       return err;
+}
+
+static void peak_pciec_remove(struct peak_pciec_card *card)
+{
+       peak_pciec_stop_led_work(card);
+       peak_pciec_leds_exit(card);
+       i2c_del_adapter(&card->led_chip);
+       peak_pciec_init_pita_gpio(card);
+       kfree(card);
+}
+
+#else /* CONFIG_CAN_PEAK_PCIEC */
+
+/*
+ * Placebo functions when PCAN-ExpressCard support is not selected
+ */
+static inline int peak_pciec_probe(struct pci_dev *pdev, struct net_device *dev)
+{
+       return -ENODEV;
+}
+
+static inline void peak_pciec_remove(struct peak_pciec_card *card)
+{
+}
+#endif /* CONFIG_CAN_PEAK_PCIEC */
+
 static u8 peak_pci_read_reg(const struct sja1000_priv *priv, int port)
 {
        return readb(priv->reg_base + (port << 2));
@@ -188,17 +637,31 @@ static int __devinit peak_pci_probe(struct pci_dev *pdev,
 
                SET_NETDEV_DEV(dev, &pdev->dev);
 
+               /* Create chain of SJA1000 devices */
+               chan->prev_dev = pci_get_drvdata(pdev);
+               pci_set_drvdata(pdev, dev);
+
+               /*
+                * PCAN-ExpressCard needs some additional i2c init.
+                * This must be done *before* register_sja1000dev() but
+                * *after* devices linkage
+                */
+               if (pdev->device == PEAK_PCIEC_DEVICE_ID) {
+                       err = peak_pciec_probe(pdev, dev);
+                       if (err) {
+                               dev_err(&pdev->dev,
+                                       "failed to probe device (err %d)\n",
+                                       err);
+                               goto failure_free_dev;
+                       }
+               }
+
                err = register_sja1000dev(dev);
                if (err) {
                        dev_err(&pdev->dev, "failed to register device\n");
-                       free_sja1000dev(dev);
-                       goto failure_remove_channels;
+                       goto failure_free_dev;
                }
 
-               /* Create chain of SJA1000 devices */
-               chan->prev_dev = pci_get_drvdata(pdev);
-               pci_set_drvdata(pdev, dev);
-
                dev_info(&pdev->dev,
                         "%s at reg_base=0x%p cfg_base=0x%p irq=%d\n",
                         dev->name, priv->reg_base, chan->cfg_base, dev->irq);
@@ -209,10 +672,15 @@ static int __devinit peak_pci_probe(struct pci_dev *pdev,
 
        return 0;
 
+failure_free_dev:
+       pci_set_drvdata(pdev, chan->prev_dev);
+       free_sja1000dev(dev);
+
 failure_remove_channels:
        /* Disable interrupts */
        writew(0x0, cfg_base + PITA_ICR + 2);
 
+       chan = NULL;
        for (dev = pci_get_drvdata(pdev); dev; dev = chan->prev_dev) {
                unregister_sja1000dev(dev);
                free_sja1000dev(dev);
@@ -220,6 +688,10 @@ failure_remove_channels:
                chan = priv->priv;
        }
 
+       /* free any PCIeC resources too */
+       if (chan && chan->pciec_card)
+               peak_pciec_remove(chan->pciec_card);
+
        pci_iounmap(pdev, reg_base);
 
 failure_unmap_cfg_base:
@@ -251,8 +723,13 @@ static void __devexit peak_pci_remove(struct pci_dev *pdev)
                unregister_sja1000dev(dev);
                free_sja1000dev(dev);
                dev = chan->prev_dev;
-               if (!dev)
+
+               if (!dev) {
+                       /* do that only for first channel */
+                       if (chan->pciec_card)
+                               peak_pciec_remove(chan->pciec_card);
                        break;
+               }
                priv = netdev_priv(dev);
                chan = priv->priv;
        }
diff --git a/drivers/net/can/sja1000/peak_pcmcia.c b/drivers/net/can/sja1000/peak_pcmcia.c
new file mode 100644 (file)
index 0000000..ec6bd9d
--- /dev/null
@@ -0,0 +1,753 @@
+/*
+ * Copyright (C) 2010-2012 Stephane Grosjean <s.grosjean@peak-system.com>
+ *
+ * CAN driver for PEAK-System PCAN-PC Card
+ * Derived from the PCAN project file driver/src/pcan_pccard.c
+ * Copyright (C) 2006-2010 PEAK System-Technik GmbH
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the version 2 of the GNU General Public License
+ * as published by the Free Software Foundation
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/interrupt.h>
+#include <linux/netdevice.h>
+#include <linux/delay.h>
+#include <linux/timer.h>
+#include <linux/io.h>
+#include <pcmcia/cistpl.h>
+#include <pcmcia/ds.h>
+#include <linux/can.h>
+#include <linux/can/dev.h>
+#include "sja1000.h"
+
+MODULE_AUTHOR("Stephane Grosjean <s.grosjean@peak-system.com>");
+MODULE_DESCRIPTION("CAN driver for PEAK-System PCAN-PC Cards");
+MODULE_LICENSE("GPL v2");
+MODULE_SUPPORTED_DEVICE("PEAK PCAN-PC Card");
+
+/* PEAK-System PCMCIA driver name */
+#define PCC_NAME               "peak_pcmcia"
+
+#define PCC_CHAN_MAX           2
+
+#define PCC_CAN_CLOCK          (16000000 / 2)
+
+#define PCC_MANF_ID            0x0377
+#define PCC_CARD_ID            0x0001
+
+#define PCC_CHAN_SIZE          0x20
+#define PCC_CHAN_OFF(c)                ((c) * PCC_CHAN_SIZE)
+#define PCC_COMN_OFF           (PCC_CHAN_OFF(PCC_CHAN_MAX))
+#define PCC_COMN_SIZE          0x40
+
+/* common area registers */
+#define PCC_CCR                        0x00
+#define PCC_CSR                        0x02
+#define PCC_CPR                        0x04
+#define PCC_SPI_DIR            0x06
+#define PCC_SPI_DOR            0x08
+#define PCC_SPI_ADR            0x0a
+#define PCC_SPI_IR             0x0c
+#define PCC_FW_MAJOR           0x10
+#define PCC_FW_MINOR           0x12
+
+/* CCR bits */
+#define PCC_CCR_CLK_16         0x00
+#define PCC_CCR_CLK_10         0x01
+#define PCC_CCR_CLK_21         0x02
+#define PCC_CCR_CLK_8          0x03
+#define PCC_CCR_CLK_MASK       PCC_CCR_CLK_8
+
+#define PCC_CCR_RST_CHAN(c)    (0x01 << ((c) + 2))
+#define PCC_CCR_RST_ALL                (PCC_CCR_RST_CHAN(0) | PCC_CCR_RST_CHAN(1))
+#define PCC_CCR_RST_MASK       PCC_CCR_RST_ALL
+
+/* led selection bits */
+#define PCC_LED(c)             (1 << (c))
+#define PCC_LED_ALL            (PCC_LED(0) | PCC_LED(1))
+
+/* led state value */
+#define PCC_LED_ON             0x00
+#define PCC_LED_FAST           0x01
+#define PCC_LED_SLOW           0x02
+#define PCC_LED_OFF            0x03
+
+#define PCC_CCR_LED_CHAN(s, c) ((s) << (((c) + 2) << 1))
+
+#define PCC_CCR_LED_ON_CHAN(c)         PCC_CCR_LED_CHAN(PCC_LED_ON, c)
+#define PCC_CCR_LED_FAST_CHAN(c)       PCC_CCR_LED_CHAN(PCC_LED_FAST, c)
+#define PCC_CCR_LED_SLOW_CHAN(c)       PCC_CCR_LED_CHAN(PCC_LED_SLOW, c)
+#define PCC_CCR_LED_OFF_CHAN(c)                PCC_CCR_LED_CHAN(PCC_LED_OFF, c)
+#define PCC_CCR_LED_MASK_CHAN(c)       PCC_CCR_LED_OFF_CHAN(c)
+#define PCC_CCR_LED_OFF_ALL            (PCC_CCR_LED_OFF_CHAN(0) | \
+                                        PCC_CCR_LED_OFF_CHAN(1))
+#define PCC_CCR_LED_MASK               PCC_CCR_LED_OFF_ALL
+
+#define PCC_CCR_INIT   (PCC_CCR_CLK_16 | PCC_CCR_RST_ALL | PCC_CCR_LED_OFF_ALL)
+
+/* CSR bits */
+#define PCC_CSR_SPI_BUSY               0x04
+
+/* time waiting for SPI busy (prevent from infinite loop) */
+#define PCC_SPI_MAX_BUSY_WAIT_MS       3
+
+/* max count of reading the SPI status register waiting for a change */
+/* (prevent from infinite loop) */
+#define PCC_WRITE_MAX_LOOP             1000
+
+/* max nb of int handled by that isr in one shot (prevent from infinite loop) */
+#define PCC_ISR_MAX_LOOP               10
+
+/* EEPROM chip instruction set */
+/* note: EEPROM Read/Write instructions include A8 bit */
+#define PCC_EEP_WRITE(a)       (0x02 | (((a) & 0x100) >> 5))
+#define PCC_EEP_READ(a)                (0x03 | (((a) & 0x100) >> 5))
+#define PCC_EEP_WRDI           0x04    /* EEPROM Write Disable */
+#define PCC_EEP_RDSR           0x05    /* EEPROM Read Status Register */
+#define PCC_EEP_WREN           0x06    /* EEPROM Write Enable */
+
+/* EEPROM Status Register bits */
+#define PCC_EEP_SR_WEN         0x02    /* EEPROM SR Write Enable bit */
+#define PCC_EEP_SR_WIP         0x01    /* EEPROM SR Write In Progress bit */
+
+/*
+ * The board configuration is probably following:
+ * RX1 is connected to ground.
+ * TX1 is not connected.
+ * CLKO is not connected.
+ * Setting the OCR register to 0xDA is a good idea.
+ * This means normal output mode, push-pull and the correct polarity.
+ */
+#define PCC_OCR                        (OCR_TX0_PUSHPULL | OCR_TX1_PUSHPULL)
+
+/*
+ * In the CDR register, you should set CBP to 1.
+ * You will probably also want to set the clock divider value to 7
+ * (meaning direct oscillator output) because the second SJA1000 chip
+ * is driven by the first one CLKOUT output.
+ */
+#define PCC_CDR                        (CDR_CBP | CDR_CLKOUT_MASK)
+
+struct pcan_channel {
+       struct net_device *netdev;
+       unsigned long prev_rx_bytes;
+       unsigned long prev_tx_bytes;
+};
+
+/* PCAN-PC Card private structure */
+struct pcan_pccard {
+       struct pcmcia_device *pdev;
+       int chan_count;
+       struct pcan_channel channel[PCC_CHAN_MAX];
+       u8 ccr;
+       u8 fw_major;
+       u8 fw_minor;
+       void __iomem *ioport_addr;
+       struct timer_list led_timer;
+};
+
+static struct pcmcia_device_id pcan_table[] = {
+       PCMCIA_DEVICE_MANF_CARD(PCC_MANF_ID, PCC_CARD_ID),
+       PCMCIA_DEVICE_NULL,
+};
+
+MODULE_DEVICE_TABLE(pcmcia, pcan_table);
+
+static void pcan_set_leds(struct pcan_pccard *card, u8 mask, u8 state);
+
+/*
+ * start timer which controls leds state
+ */
+static void pcan_start_led_timer(struct pcan_pccard *card)
+{
+       if (!timer_pending(&card->led_timer))
+               mod_timer(&card->led_timer, jiffies + HZ);
+}
+
+/*
+ * stop the timer which controls leds state
+ */
+static void pcan_stop_led_timer(struct pcan_pccard *card)
+{
+       del_timer_sync(&card->led_timer);
+}
+
+/*
+ * read a sja1000 register
+ */
+static u8 pcan_read_canreg(const struct sja1000_priv *priv, int port)
+{
+       return ioread8(priv->reg_base + port);
+}
+
+/*
+ * write a sja1000 register
+ */
+static void pcan_write_canreg(const struct sja1000_priv *priv, int port, u8 v)
+{
+       struct pcan_pccard *card = priv->priv;
+       int c = (priv->reg_base - card->ioport_addr) / PCC_CHAN_SIZE;
+
+       /* sja1000 register changes control the leds state */
+       if (port == REG_MOD)
+               switch (v) {
+               case MOD_RM:
+                       /* Reset Mode: set led on */
+                       pcan_set_leds(card, PCC_LED(c), PCC_LED_ON);
+                       break;
+               case 0x00:
+                       /* Normal Mode: led slow blinking and start led timer */
+                       pcan_set_leds(card, PCC_LED(c), PCC_LED_SLOW);
+                       pcan_start_led_timer(card);
+                       break;
+               default:
+                       break;
+               }
+
+       iowrite8(v, priv->reg_base + port);
+}
+
+/*
+ * read a register from the common area
+ */
+static u8 pcan_read_reg(struct pcan_pccard *card, int port)
+{
+       return ioread8(card->ioport_addr + PCC_COMN_OFF + port);
+}
+
+/*
+ * write a register into the common area
+ */
+static void pcan_write_reg(struct pcan_pccard *card, int port, u8 v)
+{
+       /* cache ccr value */
+       if (port == PCC_CCR) {
+               if (card->ccr == v)
+                       return;
+               card->ccr = v;
+       }
+
+       iowrite8(v, card->ioport_addr + PCC_COMN_OFF + port);
+}
+
+/*
+ * check whether the card is present by checking its fw version numbers
+ * against values read at probing time.
+ */
+static inline int pcan_pccard_present(struct pcan_pccard *card)
+{
+       return ((pcan_read_reg(card, PCC_FW_MAJOR) == card->fw_major) &&
+               (pcan_read_reg(card, PCC_FW_MINOR) == card->fw_minor));
+}
+
+/*
+ * wait for SPI engine while it is busy
+ */
+static int pcan_wait_spi_busy(struct pcan_pccard *card)
+{
+       unsigned long timeout = jiffies +
+                               msecs_to_jiffies(PCC_SPI_MAX_BUSY_WAIT_MS) + 1;
+
+       /* be sure to read status at least once after sleeping */
+       while (pcan_read_reg(card, PCC_CSR) & PCC_CSR_SPI_BUSY) {
+               if (time_after(jiffies, timeout))
+                       return -EBUSY;
+               schedule();
+       }
+
+       return 0;
+}
+
+/*
+ * write data in device eeprom
+ */
+static int pcan_write_eeprom(struct pcan_pccard *card, u16 addr, u8 v)
+{
+       u8 status;
+       int err, i;
+
+       /* write instruction enabling write */
+       pcan_write_reg(card, PCC_SPI_IR, PCC_EEP_WREN);
+       err = pcan_wait_spi_busy(card);
+       if (err)
+               goto we_spi_err;
+
+       /* wait until write enabled */
+       for (i = 0; i < PCC_WRITE_MAX_LOOP; i++) {
+               /* write instruction reading the status register */
+               pcan_write_reg(card, PCC_SPI_IR, PCC_EEP_RDSR);
+               err = pcan_wait_spi_busy(card);
+               if (err)
+                       goto we_spi_err;
+
+               /* get status register value and check write enable bit */
+               status = pcan_read_reg(card, PCC_SPI_DIR);
+               if (status & PCC_EEP_SR_WEN)
+                       break;
+       }
+
+       if (i >= PCC_WRITE_MAX_LOOP) {
+               dev_err(&card->pdev->dev,
+                       "stop waiting to be allowed to write in eeprom\n");
+               return -EIO;
+       }
+
+       /* set address and data */
+       pcan_write_reg(card, PCC_SPI_ADR, addr & 0xff);
+       pcan_write_reg(card, PCC_SPI_DOR, v);
+
+       /*
+        * write instruction with bit[3] set according to address value:
+        * if addr refers to upper half of the memory array: bit[3] = 1
+        */
+       pcan_write_reg(card, PCC_SPI_IR, PCC_EEP_WRITE(addr));
+       err = pcan_wait_spi_busy(card);
+       if (err)
+               goto we_spi_err;
+
+       /* wait while write in progress */
+       for (i = 0; i < PCC_WRITE_MAX_LOOP; i++) {
+               /* write instruction reading the status register */
+               pcan_write_reg(card, PCC_SPI_IR, PCC_EEP_RDSR);
+               err = pcan_wait_spi_busy(card);
+               if (err)
+                       goto we_spi_err;
+
+               /* get status register value and check write in progress bit */
+               status = pcan_read_reg(card, PCC_SPI_DIR);
+               if (!(status & PCC_EEP_SR_WIP))
+                       break;
+       }
+
+       if (i >= PCC_WRITE_MAX_LOOP) {
+               dev_err(&card->pdev->dev,
+                       "stop waiting for write in eeprom to complete\n");
+               return -EIO;
+       }
+
+       /* write instruction disabling write */
+       pcan_write_reg(card, PCC_SPI_IR, PCC_EEP_WRDI);
+       err = pcan_wait_spi_busy(card);
+       if (err)
+               goto we_spi_err;
+
+       return 0;
+
+we_spi_err:
+       dev_err(&card->pdev->dev,
+               "stop waiting (spi engine always busy) err %d\n", err);
+
+       return err;
+}
+
+static void pcan_set_leds(struct pcan_pccard *card, u8 led_mask, u8 state)
+{
+       u8 ccr = card->ccr;
+       int i;
+
+       for (i = 0; i < card->chan_count; i++)
+               if (led_mask & PCC_LED(i)) {
+                       /* clear corresponding led bits in ccr */
+                       ccr &= ~PCC_CCR_LED_MASK_CHAN(i);
+                       /* then set new bits */
+                       ccr |= PCC_CCR_LED_CHAN(state, i);
+               }
+
+       /* real write only if something has changed in ccr */
+       pcan_write_reg(card, PCC_CCR, ccr);
+}
+
+/*
+ * enable/disable CAN connectors power
+ */
+static inline void pcan_set_can_power(struct pcan_pccard *card, int onoff)
+{
+       int err;
+
+       err = pcan_write_eeprom(card, 0, !!onoff);
+       if (err)
+               dev_err(&card->pdev->dev,
+                       "failed setting power %s to can connectors (err %d)\n",
+                       (onoff) ? "on" : "off", err);
+}
+
+/*
+ * set leds state according to channel activity
+ */
+static void pcan_led_timer(unsigned long arg)
+{
+       struct pcan_pccard *card = (struct pcan_pccard *)arg;
+       struct net_device *netdev;
+       int i, up_count = 0;
+       u8 ccr;
+
+       ccr = card->ccr;
+       for (i = 0; i < card->chan_count; i++) {
+               /* default is: not configured */
+               ccr &= ~PCC_CCR_LED_MASK_CHAN(i);
+               ccr |= PCC_CCR_LED_ON_CHAN(i);
+
+               netdev = card->channel[i].netdev;
+               if (!netdev || !(netdev->flags & IFF_UP))
+                       continue;
+
+               up_count++;
+
+               /* no activity (but configured) */
+               ccr &= ~PCC_CCR_LED_MASK_CHAN(i);
+               ccr |= PCC_CCR_LED_SLOW_CHAN(i);
+
+               /* if bytes counters changed, set fast blinking led */
+               if (netdev->stats.rx_bytes != card->channel[i].prev_rx_bytes) {
+                       card->channel[i].prev_rx_bytes = netdev->stats.rx_bytes;
+                       ccr &= ~PCC_CCR_LED_MASK_CHAN(i);
+                       ccr |= PCC_CCR_LED_FAST_CHAN(i);
+               }
+               if (netdev->stats.tx_bytes != card->channel[i].prev_tx_bytes) {
+                       card->channel[i].prev_tx_bytes = netdev->stats.tx_bytes;
+                       ccr &= ~PCC_CCR_LED_MASK_CHAN(i);
+                       ccr |= PCC_CCR_LED_FAST_CHAN(i);
+               }
+       }
+
+       /* write the new leds state */
+       pcan_write_reg(card, PCC_CCR, ccr);
+
+       /* restart timer (except if no more configured channels) */
+       if (up_count)
+               mod_timer(&card->led_timer, jiffies + HZ);
+}
+
+/*
+ * interrupt service routine
+ */
+static irqreturn_t pcan_isr(int irq, void *dev_id)
+{
+       struct pcan_pccard *card = dev_id;
+       int irq_handled;
+
+       /* prevent from infinite loop */
+       for (irq_handled = 0; irq_handled < PCC_ISR_MAX_LOOP; irq_handled++) {
+               /* handle shared interrupt and next loop */
+               int nothing_to_handle = 1;
+               int i;
+
+               /* check interrupt for each channel */
+               for (i = 0; i < card->chan_count; i++) {
+                       struct net_device *netdev;
+
+                       /*
+                        * check whether the card is present before calling
+                        * sja1000_interrupt() to speed up hotplug detection
+                        */
+                       if (!pcan_pccard_present(card)) {
+                               /* card unplugged during isr */
+                               return IRQ_NONE;
+                       }
+
+                       /*
+                        * should check whether all or SJA1000_MAX_IRQ
+                        * interrupts have been handled: loop again to be sure.
+                        */
+                       netdev = card->channel[i].netdev;
+                       if (netdev &&
+                           sja1000_interrupt(irq, netdev) == IRQ_HANDLED)
+                               nothing_to_handle = 0;
+               }
+
+               if (nothing_to_handle)
+                       break;
+       }
+
+       return (irq_handled) ? IRQ_HANDLED : IRQ_NONE;
+}
+
+/*
+ * free all resources used by the channels and switch off leds and can power
+ */
+static void pcan_free_channels(struct pcan_pccard *card)
+{
+       int i;
+       u8 led_mask = 0;
+
+       for (i = 0; i < card->chan_count; i++) {
+               struct net_device *netdev;
+               char name[IFNAMSIZ];
+
+               led_mask |= PCC_LED(i);
+
+               netdev = card->channel[i].netdev;
+               if (!netdev)
+                       continue;
+
+               strncpy(name, netdev->name, IFNAMSIZ);
+
+               unregister_sja1000dev(netdev);
+
+               free_sja1000dev(netdev);
+
+               dev_info(&card->pdev->dev, "%s removed\n", name);
+       }
+
+       /* do it only if device not removed */
+       if (pcan_pccard_present(card)) {
+               pcan_set_leds(card, led_mask, PCC_LED_OFF);
+               pcan_set_can_power(card, 0);
+       }
+}
+
+/*
+ * check if a CAN controller is present at the specified location
+ */
+static inline int pcan_channel_present(struct sja1000_priv *priv)
+{
+       /* make sure SJA1000 is in reset mode */
+       pcan_write_canreg(priv, REG_MOD, 1);
+       pcan_write_canreg(priv, REG_CDR, CDR_PELICAN);
+
+       /* read reset-values */
+       if (pcan_read_canreg(priv, REG_CDR) == CDR_PELICAN)
+               return 1;
+
+       return 0;
+}
+
+static int pcan_add_channels(struct pcan_pccard *card)
+{
+       struct pcmcia_device *pdev = card->pdev;
+       int i, err = 0;
+       u8 ccr = PCC_CCR_INIT;
+
+       /* init common registers (reset channels and leds off) */
+       card->ccr = ~ccr;
+       pcan_write_reg(card, PCC_CCR, ccr);
+
+       /* wait 2ms before unresetting channels */
+       mdelay(2);
+
+       ccr &= ~PCC_CCR_RST_ALL;
+       pcan_write_reg(card, PCC_CCR, ccr);
+
+       /* create one network device per channel detected */
+       for (i = 0; i < ARRAY_SIZE(card->channel); i++) {
+               struct net_device *netdev;
+               struct sja1000_priv *priv;
+
+               netdev = alloc_sja1000dev(0);
+               if (!netdev) {
+                       err = -ENOMEM;
+                       break;
+               }
+
+               /* update linkages */
+               priv = netdev_priv(netdev);
+               priv->priv = card;
+               SET_NETDEV_DEV(netdev, &pdev->dev);
+
+               priv->irq_flags = IRQF_SHARED;
+               netdev->irq = pdev->irq;
+               priv->reg_base = card->ioport_addr + PCC_CHAN_OFF(i);
+
+               /* check if channel is present */
+               if (!pcan_channel_present(priv)) {
+                       dev_err(&pdev->dev, "channel %d not present\n", i);
+                       free_sja1000dev(netdev);
+                       continue;
+               }
+
+               priv->read_reg  = pcan_read_canreg;
+               priv->write_reg = pcan_write_canreg;
+               priv->can.clock.freq = PCC_CAN_CLOCK;
+               priv->ocr = PCC_OCR;
+               priv->cdr = PCC_CDR;
+
+               /* Neither a slave device distributes the clock */
+               if (i > 0)
+                       priv->cdr |= CDR_CLK_OFF;
+
+               priv->flags |= SJA1000_CUSTOM_IRQ_HANDLER;
+
+               /* register SJA1000 device */
+               err = register_sja1000dev(netdev);
+               if (err) {
+                       free_sja1000dev(netdev);
+                       continue;
+               }
+
+               card->channel[i].netdev = netdev;
+               card->chan_count++;
+
+               /* set corresponding led on in the new ccr */
+               ccr &= ~PCC_CCR_LED_OFF_CHAN(i);
+
+               dev_info(&pdev->dev,
+                       "%s on channel %d at 0x%p irq %d\n",
+                       netdev->name, i, priv->reg_base, pdev->irq);
+       }
+
+       /* write new ccr (change leds state) */
+       pcan_write_reg(card, PCC_CCR, ccr);
+
+       return err;
+}
+
+static int pcan_conf_check(struct pcmcia_device *pdev, void *priv_data)
+{
+       pdev->resource[0]->flags &= ~IO_DATA_PATH_WIDTH;
+       pdev->resource[0]->flags |= IO_DATA_PATH_WIDTH_8; /* only */
+       pdev->io_lines = 10;
+
+       /* This reserves IO space but doesn't actually enable it */
+       return pcmcia_request_io(pdev);
+}
+
+/*
+ * free all resources used by the device
+ */
+static void pcan_free(struct pcmcia_device *pdev)
+{
+       struct pcan_pccard *card = pdev->priv;
+
+       if (!card)
+               return;
+
+       free_irq(pdev->irq, card);
+       pcan_stop_led_timer(card);
+
+       pcan_free_channels(card);
+
+       ioport_unmap(card->ioport_addr);
+
+       kfree(card);
+       pdev->priv = NULL;
+}
+
+/*
+ * setup PCMCIA socket and probe for PEAK-System PC-CARD
+ */
+static int __devinit pcan_probe(struct pcmcia_device *pdev)
+{
+       struct pcan_pccard *card;
+       int err;
+
+       pdev->config_flags |= CONF_ENABLE_IRQ | CONF_AUTO_SET_IO;
+
+       err = pcmcia_loop_config(pdev, pcan_conf_check, NULL);
+       if (err) {
+               dev_err(&pdev->dev, "pcmcia_loop_config() error %d\n", err);
+               goto probe_err_1;
+       }
+
+       if (!pdev->irq) {
+               dev_err(&pdev->dev, "no irq assigned\n");
+               err = -ENODEV;
+               goto probe_err_1;
+       }
+
+       err = pcmcia_enable_device(pdev);
+       if (err) {
+               dev_err(&pdev->dev, "pcmcia_enable_device failed err=%d\n",
+                       err);
+               goto probe_err_1;
+       }
+
+       card = kzalloc(sizeof(struct pcan_pccard), GFP_KERNEL);
+       if (!card) {
+               dev_err(&pdev->dev, "couldn't allocate card memory\n");
+               err = -ENOMEM;
+               goto probe_err_2;
+       }
+
+       card->pdev = pdev;
+       pdev->priv = card;
+
+       /* sja1000 api uses iomem */
+       card->ioport_addr = ioport_map(pdev->resource[0]->start,
+                                       resource_size(pdev->resource[0]));
+       if (!card->ioport_addr) {
+               dev_err(&pdev->dev, "couldn't map io port into io memory\n");
+               err = -ENOMEM;
+               goto probe_err_3;
+       }
+       card->fw_major = pcan_read_reg(card, PCC_FW_MAJOR);
+       card->fw_minor = pcan_read_reg(card, PCC_FW_MINOR);
+
+       /* display board name and firware version */
+       dev_info(&pdev->dev, "PEAK-System pcmcia card %s fw %d.%d\n",
+               pdev->prod_id[1] ? pdev->prod_id[1] : "PCAN-PC Card",
+               card->fw_major, card->fw_minor);
+
+       /* detect available channels */
+       pcan_add_channels(card);
+       if (!card->chan_count)
+               goto probe_err_4;
+
+       /* init the timer which controls the leds */
+       init_timer(&card->led_timer);
+       card->led_timer.function = pcan_led_timer;
+       card->led_timer.data = (unsigned long)card;
+
+       /* request the given irq */
+       err = request_irq(pdev->irq, &pcan_isr, IRQF_SHARED, PCC_NAME, card);
+       if (err) {
+               dev_err(&pdev->dev, "couldn't request irq%d\n", pdev->irq);
+               goto probe_err_5;
+       }
+
+       /* power on the connectors */
+       pcan_set_can_power(card, 1);
+
+       return 0;
+
+probe_err_5:
+       /* unregister can devices from network */
+       pcan_free_channels(card);
+
+probe_err_4:
+       ioport_unmap(card->ioport_addr);
+
+probe_err_3:
+       kfree(card);
+       pdev->priv = NULL;
+
+probe_err_2:
+       pcmcia_disable_device(pdev);
+
+probe_err_1:
+       return err;
+}
+
+/*
+ * release claimed resources
+ */
+static void pcan_remove(struct pcmcia_device *pdev)
+{
+       pcan_free(pdev);
+       pcmcia_disable_device(pdev);
+}
+
+static struct pcmcia_driver pcan_driver = {
+       .name = PCC_NAME,
+       .probe = pcan_probe,
+       .remove = pcan_remove,
+       .id_table = pcan_table,
+};
+
+static int __init pcan_init(void)
+{
+       return pcmcia_register_driver(&pcan_driver);
+}
+module_init(pcan_init);
+
+static void __exit pcan_exit(void)
+{
+       pcmcia_unregister_driver(&pcan_driver);
+}
+module_exit(pcan_exit);
index c7f3d4e..a227586 100644 (file)
@@ -43,7 +43,8 @@ MODULE_SUPPORTED_DEVICE("Adlink PCI-7841/cPCI-7841, "
                        "TEWS TECHNOLOGIES TPMC810, "
                        "esd CAN-PCI/CPCI/PCI104/200, "
                        "esd CAN-PCI/PMC/266, "
-                       "esd CAN-PCIe/2000")
+                       "esd CAN-PCIe/2000, "
+                       "IXXAT PC-I 04/PCI")
 MODULE_LICENSE("GPL v2");
 
 #define PLX_PCI_MAX_CHAN 2
@@ -121,6 +122,10 @@ struct plx_pci_card {
 #define ESD_PCI_SUB_SYS_ID_PCIE2000    0x0200
 #define ESD_PCI_SUB_SYS_ID_PCI104200   0x0501
 
+#define IXXAT_PCI_VENDOR_ID            0x10b5
+#define IXXAT_PCI_DEVICE_ID            0x9050
+#define IXXAT_PCI_SUB_SYS_ID           0x2540
+
 #define MARATHON_PCI_DEVICE_ID         0x2715
 
 #define TEWS_PCI_VENDOR_ID             0x1498
@@ -193,6 +198,14 @@ static struct plx_pci_card_info plx_pci_card_info_esd2000 __devinitdata = {
        /* based on PEX8311 */
 };
 
+static struct plx_pci_card_info plx_pci_card_info_ixxat __devinitdata = {
+       "IXXAT PC-I 04/PCI", 2,
+       PLX_PCI_CAN_CLOCK, PLX_PCI_OCR, PLX_PCI_CDR,
+       {0, 0x00, 0x00}, { {2, 0x00, 0x80}, {2, 0x200, 0x80} },
+       &plx_pci_reset_common
+       /* based on PLX9050 */
+};
+
 static struct plx_pci_card_info plx_pci_card_info_marathon __devinitdata = {
        "Marathon CAN-bus-PCI", 2,
        PLX_PCI_CAN_CLOCK, PLX_PCI_OCR, PLX_PCI_CDR,
@@ -267,6 +280,13 @@ static DEFINE_PCI_DEVICE_TABLE(plx_pci_tbl) = {
                (kernel_ulong_t)&plx_pci_card_info_esd2000
        },
        {
+               /* IXXAT PC-I 04/PCI card */
+               IXXAT_PCI_VENDOR_ID, IXXAT_PCI_DEVICE_ID,
+               PCI_ANY_ID, IXXAT_PCI_SUB_SYS_ID,
+               0, 0,
+               (kernel_ulong_t)&plx_pci_card_info_ixxat
+       },
+       {
                /* Marathon CAN-bus-PCI card */
                PCI_VENDOR_ID_PLX, MARATHON_PCI_DEVICE_ID,
                PCI_ANY_ID, PCI_ANY_ID,
index 192b0d1..5e10472 100644 (file)
@@ -133,7 +133,7 @@ static void set_reset_mode(struct net_device *dev)
                status = priv->read_reg(priv, REG_MOD);
        }
 
-       dev_err(dev->dev.parent, "setting SJA1000 into reset mode failed!\n");
+       netdev_err(dev, "setting SJA1000 into reset mode failed!\n");
 }
 
 static void set_normal_mode(struct net_device *dev)
@@ -161,7 +161,7 @@ static void set_normal_mode(struct net_device *dev)
                status = priv->read_reg(priv, REG_MOD);
        }
 
-       dev_err(dev->dev.parent, "setting SJA1000 into normal mode failed!\n");
+       netdev_err(dev, "setting SJA1000 into normal mode failed!\n");
 }
 
 static void sja1000_start(struct net_device *dev)
@@ -214,8 +214,7 @@ static int sja1000_set_bittiming(struct net_device *dev)
        if (priv->can.ctrlmode & CAN_CTRLMODE_3_SAMPLES)
                btr1 |= 0x80;
 
-       dev_info(dev->dev.parent,
-                "setting BTR0=0x%02x BTR1=0x%02x\n", btr0, btr1);
+       netdev_info(dev, "setting BTR0=0x%02x BTR1=0x%02x\n", btr0, btr1);
 
        priv->write_reg(priv, REG_BTR0, btr0);
        priv->write_reg(priv, REG_BTR1, btr1);
@@ -383,7 +382,7 @@ static int sja1000_err(struct net_device *dev, uint8_t isrc, uint8_t status)
 
        if (isrc & IRQ_DOI) {
                /* data overrun interrupt */
-               dev_dbg(dev->dev.parent, "data overrun interrupt\n");
+               netdev_dbg(dev, "data overrun interrupt\n");
                cf->can_id |= CAN_ERR_CRTL;
                cf->data[1] = CAN_ERR_CRTL_RX_OVERFLOW;
                stats->rx_over_errors++;
@@ -393,7 +392,7 @@ static int sja1000_err(struct net_device *dev, uint8_t isrc, uint8_t status)
 
        if (isrc & IRQ_EI) {
                /* error warning interrupt */
-               dev_dbg(dev->dev.parent, "error warning interrupt\n");
+               netdev_dbg(dev, "error warning interrupt\n");
 
                if (status & SR_BS) {
                        state = CAN_STATE_BUS_OFF;
@@ -434,7 +433,7 @@ static int sja1000_err(struct net_device *dev, uint8_t isrc, uint8_t status)
        }
        if (isrc & IRQ_EPI) {
                /* error passive interrupt */
-               dev_dbg(dev->dev.parent, "error passive interrupt\n");
+               netdev_dbg(dev, "error passive interrupt\n");
                if (status & SR_ES)
                        state = CAN_STATE_ERROR_PASSIVE;
                else
@@ -442,7 +441,7 @@ static int sja1000_err(struct net_device *dev, uint8_t isrc, uint8_t status)
        }
        if (isrc & IRQ_ALI) {
                /* arbitration lost interrupt */
-               dev_dbg(dev->dev.parent, "arbitration lost interrupt\n");
+               netdev_dbg(dev, "arbitration lost interrupt\n");
                alc = priv->read_reg(priv, REG_ALC);
                priv->can.can_stats.arbitration_lost++;
                stats->tx_errors++;
@@ -503,7 +502,7 @@ irqreturn_t sja1000_interrupt(int irq, void *dev_id)
                        return IRQ_NONE;
 
                if (isrc & IRQ_WUI)
-                       dev_warn(dev->dev.parent, "wakeup interrupt\n");
+                       netdev_warn(dev, "wakeup interrupt\n");
 
                if (isrc & IRQ_TI) {
                        /* transmission complete interrupt */
@@ -533,7 +532,7 @@ irqreturn_t sja1000_interrupt(int irq, void *dev_id)
                priv->post_irq(priv);
 
        if (n >= SJA1000_MAX_IRQ)
-               dev_dbg(dev->dev.parent, "%d messages handled in ISR", n);
+               netdev_dbg(dev, "%d messages handled in ISR", n);
 
        return (n) ? IRQ_HANDLED : IRQ_NONE;
 }
index 3f1ebcc..98a5a7d 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * slcan.c - serial line CAN interface driver (using tty line discipline)
  *
- * This file is derived from linux/drivers/net/slip.c
+ * This file is derived from linux/drivers/net/slip/slip.c
  *
  * slip.c Authors  : Laurence Culhane <loz@holmes.demon.co.uk>
  *                   Fred N. van Kempen <waltje@uwalt.nl.mugnet.org>
@@ -639,10 +639,8 @@ static int __init slcan_init(void)
        printk(KERN_INFO "slcan: %d dynamic interface channels.\n", maxdev);
 
        slcan_devs = kzalloc(sizeof(struct net_device *)*maxdev, GFP_KERNEL);
-       if (!slcan_devs) {
-               printk(KERN_ERR "slcan: can't allocate slcan device array!\n");
+       if (!slcan_devs)
                return -ENOMEM;
-       }
 
        /* Fill in our line protocol discipline, and register it */
        status = tty_register_ldisc(N_SLCAN, &slc_ldisc);
index 5a2e1e3..4accd7e 100644 (file)
@@ -306,7 +306,7 @@ static int ti_hecc_set_btc(struct ti_hecc_priv *priv)
                if (bit_timing->brp > 4)
                        can_btc |= HECC_CANBTC_SAM;
                else
-                       dev_warn(priv->ndev->dev.parent, "WARN: Triple" \
+                       netdev_warn(priv->ndev, "WARN: Triple"
                                "sampling not set due to h/w limitations");
        }
        can_btc |= ((bit_timing->sjw - 1) & 0x3) << 8;
@@ -315,7 +315,7 @@ static int ti_hecc_set_btc(struct ti_hecc_priv *priv)
        /* ERM being set to 0 by default meaning resync at falling edge */
 
        hecc_write(priv, HECC_CANBTC, can_btc);
-       dev_info(priv->ndev->dev.parent, "setting CANBTC=%#x\n", can_btc);
+       netdev_info(priv->ndev, "setting CANBTC=%#x\n", can_btc);
 
        return 0;
 }
@@ -332,7 +332,7 @@ static void ti_hecc_reset(struct net_device *ndev)
        u32 cnt;
        struct ti_hecc_priv *priv = netdev_priv(ndev);
 
-       dev_dbg(ndev->dev.parent, "resetting hecc ...\n");
+       netdev_dbg(ndev, "resetting hecc ...\n");
        hecc_set_bit(priv, HECC_CANMC, HECC_CANMC_SRES);
 
        /* Set change control request and wait till enabled */
@@ -458,6 +458,17 @@ static int ti_hecc_do_set_mode(struct net_device *ndev, enum can_mode mode)
        return ret;
 }
 
+static int ti_hecc_get_berr_counter(const struct net_device *ndev,
+                                       struct can_berr_counter *bec)
+{
+       struct ti_hecc_priv *priv = netdev_priv(ndev);
+
+       bec->txerr = hecc_read(priv, HECC_CANTEC);
+       bec->rxerr = hecc_read(priv, HECC_CANREC);
+
+       return 0;
+}
+
 /*
  * ti_hecc_xmit: HECC Transmit
  *
@@ -496,7 +507,7 @@ static netdev_tx_t ti_hecc_xmit(struct sk_buff *skb, struct net_device *ndev)
        if (unlikely(hecc_read(priv, HECC_CANME) & mbx_mask)) {
                spin_unlock_irqrestore(&priv->mbx_lock, flags);
                netif_stop_queue(ndev);
-               dev_err(priv->ndev->dev.parent,
+               netdev_err(priv->ndev,
                        "BUG: TX mbx not ready tx_head=%08X, tx_tail=%08X\n",
                        priv->tx_head, priv->tx_tail);
                return NETDEV_TX_BUSY;
@@ -550,7 +561,7 @@ static int ti_hecc_rx_pkt(struct ti_hecc_priv *priv, int mbxno)
        skb = alloc_can_skb(priv->ndev, &cf);
        if (!skb) {
                if (printk_ratelimit())
-                       dev_err(priv->ndev->dev.parent,
+                       netdev_err(priv->ndev,
                                "ti_hecc_rx_pkt: alloc_can_skb() failed\n");
                return -ENOMEM;
        }
@@ -668,7 +679,7 @@ static int ti_hecc_error(struct net_device *ndev, int int_status,
        skb = alloc_can_err_skb(ndev, &cf);
        if (!skb) {
                if (printk_ratelimit())
-                       dev_err(priv->ndev->dev.parent,
+                       netdev_err(priv->ndev,
                                "ti_hecc_error: alloc_can_err_skb() failed\n");
                return -ENOMEM;
        }
@@ -684,7 +695,7 @@ static int ti_hecc_error(struct net_device *ndev, int int_status,
                                cf->data[1] |= CAN_ERR_CRTL_RX_WARNING;
                }
                hecc_set_bit(priv, HECC_CANES, HECC_CANES_EW);
-               dev_dbg(priv->ndev->dev.parent, "Error Warning interrupt\n");
+               netdev_dbg(priv->ndev, "Error Warning interrupt\n");
                hecc_clear_bit(priv, HECC_CANMC, HECC_CANMC_CCR);
        }
 
@@ -699,7 +710,7 @@ static int ti_hecc_error(struct net_device *ndev, int int_status,
                                cf->data[1] |= CAN_ERR_CRTL_RX_PASSIVE;
                }
                hecc_set_bit(priv, HECC_CANES, HECC_CANES_EP);
-               dev_dbg(priv->ndev->dev.parent, "Error passive interrupt\n");
+               netdev_dbg(priv->ndev, "Error passive interrupt\n");
                hecc_clear_bit(priv, HECC_CANMC, HECC_CANMC_CCR);
        }
 
@@ -825,7 +836,7 @@ static int ti_hecc_open(struct net_device *ndev)
        err = request_irq(ndev->irq, ti_hecc_interrupt, IRQF_SHARED,
                        ndev->name, ndev);
        if (err) {
-               dev_err(ndev->dev.parent, "error requesting interrupt\n");
+               netdev_err(ndev, "error requesting interrupt\n");
                return err;
        }
 
@@ -834,7 +845,7 @@ static int ti_hecc_open(struct net_device *ndev)
        /* Open common can device */
        err = open_candev(ndev);
        if (err) {
-               dev_err(ndev->dev.parent, "open_candev() failed %d\n", err);
+               netdev_err(ndev, "open_candev() failed %d\n", err);
                ti_hecc_transceiver_switch(priv, 0);
                free_irq(ndev->irq, ndev);
                return err;
@@ -923,6 +934,7 @@ static int ti_hecc_probe(struct platform_device *pdev)
        priv->can.bittiming_const = &ti_hecc_bittiming_const;
        priv->can.do_set_mode = ti_hecc_do_set_mode;
        priv->can.do_get_state = ti_hecc_get_state;
+       priv->can.do_get_berr_counter = ti_hecc_get_berr_counter;
        priv->can.ctrlmode_supported = CAN_CTRLMODE_3_SAMPLES;
 
        spin_lock_init(&priv->mbx_lock);
index 0452549..0a68768 100644 (file)
@@ -13,4 +13,10 @@ config CAN_ESD_USB2
           This driver supports the CAN-USB/2 interface
           from esd electronic system design gmbh (http://www.esd.eu).
 
+config CAN_PEAK_USB
+       tristate "PEAK PCAN-USB/USB Pro interfaces"
+       ---help---
+         This driver supports the PCAN-USB and PCAN-USB Pro adapters
+         from PEAK-System Technik (http://www.peak-system.com).
+
 endmenu
index fce3cf1..da6d1d3 100644 (file)
@@ -4,5 +4,6 @@
 
 obj-$(CONFIG_CAN_EMS_USB) += ems_usb.o
 obj-$(CONFIG_CAN_ESD_USB2) += esd_usb2.o
+obj-$(CONFIG_CAN_PEAK_USB) += peak_usb/
 
 ccflags-$(CONFIG_CAN_DEBUG_DEVICES) := -DDEBUG
index 7dae64d..7ae65fc 100644 (file)
@@ -288,8 +288,7 @@ static void ems_usb_read_interrupt_callback(struct urb *urb)
                return;
 
        default:
-               dev_info(netdev->dev.parent, "Rx interrupt aborted %d\n",
-                        urb->status);
+               netdev_info(netdev, "Rx interrupt aborted %d\n", urb->status);
                break;
        }
 
@@ -298,8 +297,7 @@ static void ems_usb_read_interrupt_callback(struct urb *urb)
        if (err == -ENODEV)
                netif_device_detach(netdev);
        else if (err)
-               dev_err(netdev->dev.parent,
-                       "failed resubmitting intr urb: %d\n", err);
+               netdev_err(netdev, "failed resubmitting intr urb: %d\n", err);
 }
 
 static void ems_usb_rx_can_msg(struct ems_usb *dev, struct ems_cpc_msg *msg)
@@ -431,8 +429,7 @@ static void ems_usb_read_bulk_callback(struct urb *urb)
                return;
 
        default:
-               dev_info(netdev->dev.parent, "Rx URB aborted (%d)\n",
-                        urb->status);
+               netdev_info(netdev, "Rx URB aborted (%d)\n", urb->status);
                goto resubmit_urb;
        }
 
@@ -477,7 +474,7 @@ static void ems_usb_read_bulk_callback(struct urb *urb)
                        msg_count--;
 
                        if (start > urb->transfer_buffer_length) {
-                               dev_err(netdev->dev.parent, "format error\n");
+                               netdev_err(netdev, "format error\n");
                                break;
                        }
                }
@@ -493,8 +490,8 @@ resubmit_urb:
        if (retval == -ENODEV)
                netif_device_detach(netdev);
        else if (retval)
-               dev_err(netdev->dev.parent,
-                       "failed resubmitting read bulk urb: %d\n", retval);
+               netdev_err(netdev,
+                          "failed resubmitting read bulk urb: %d\n", retval);
 }
 
 /*
@@ -521,8 +518,7 @@ static void ems_usb_write_bulk_callback(struct urb *urb)
                return;
 
        if (urb->status)
-               dev_info(netdev->dev.parent, "Tx URB aborted (%d)\n",
-                        urb->status);
+               netdev_info(netdev, "Tx URB aborted (%d)\n", urb->status);
 
        netdev->trans_start = jiffies;
 
@@ -605,18 +601,18 @@ static int ems_usb_start(struct ems_usb *dev)
                /* create a URB, and a buffer for it */
                urb = usb_alloc_urb(0, GFP_KERNEL);
                if (!urb) {
-                       dev_err(netdev->dev.parent,
-                               "No memory left for URBs\n");
-                       return -ENOMEM;
+                       netdev_err(netdev, "No memory left for URBs\n");
+                       err = -ENOMEM;
+                       break;
                }
 
                buf = usb_alloc_coherent(dev->udev, RX_BUFFER_SIZE, GFP_KERNEL,
                                         &urb->transfer_dma);
                if (!buf) {
-                       dev_err(netdev->dev.parent,
-                               "No memory left for USB buffer\n");
+                       netdev_err(netdev, "No memory left for USB buffer\n");
                        usb_free_urb(urb);
-                       return -ENOMEM;
+                       err = -ENOMEM;
+                       break;
                }
 
                usb_fill_bulk_urb(urb, dev->udev, usb_rcvbulkpipe(dev->udev, 2),
@@ -639,13 +635,13 @@ static int ems_usb_start(struct ems_usb *dev)
 
        /* Did we submit any URBs */
        if (i == 0) {
-               dev_warn(netdev->dev.parent, "couldn't setup read URBs\n");
+               netdev_warn(netdev, "couldn't setup read URBs\n");
                return err;
        }
 
        /* Warn if we've couldn't transmit all the URBs */
        if (i < MAX_RX_URBS)
-               dev_warn(netdev->dev.parent, "rx performance may be slow\n");
+               netdev_warn(netdev, "rx performance may be slow\n");
 
        /* Setup and start interrupt URB */
        usb_fill_int_urb(dev->intr_urb, dev->udev,
@@ -656,8 +652,7 @@ static int ems_usb_start(struct ems_usb *dev)
 
        err = usb_submit_urb(dev->intr_urb, GFP_KERNEL);
        if (err) {
-               dev_warn(netdev->dev.parent, "intr URB submit failed: %d\n",
-                        err);
+               netdev_warn(netdev, "intr URB submit failed: %d\n", err);
 
                return err;
        }
@@ -686,7 +681,7 @@ static int ems_usb_start(struct ems_usb *dev)
        return 0;
 
 failed:
-       dev_warn(netdev->dev.parent, "couldn't submit control: %d\n", err);
+       netdev_warn(netdev, "couldn't submit control: %d\n", err);
 
        return err;
 }
@@ -726,8 +721,7 @@ static int ems_usb_open(struct net_device *netdev)
                if (err == -ENODEV)
                        netif_device_detach(dev->netdev);
 
-               dev_warn(netdev->dev.parent, "couldn't start device: %d\n",
-                        err);
+               netdev_warn(netdev, "couldn't start device: %d\n", err);
 
                close_candev(netdev);
 
@@ -760,13 +754,13 @@ static netdev_tx_t ems_usb_start_xmit(struct sk_buff *skb, struct net_device *ne
        /* create a URB, and a buffer for it, and copy the data to the URB */
        urb = usb_alloc_urb(0, GFP_ATOMIC);
        if (!urb) {
-               dev_err(netdev->dev.parent, "No memory left for URBs\n");
+               netdev_err(netdev, "No memory left for URBs\n");
                goto nomem;
        }
 
        buf = usb_alloc_coherent(dev->udev, size, GFP_ATOMIC, &urb->transfer_dma);
        if (!buf) {
-               dev_err(netdev->dev.parent, "No memory left for USB buffer\n");
+               netdev_err(netdev, "No memory left for USB buffer\n");
                usb_free_urb(urb);
                goto nomem;
        }
@@ -809,7 +803,7 @@ static netdev_tx_t ems_usb_start_xmit(struct sk_buff *skb, struct net_device *ne
                usb_unanchor_urb(urb);
                usb_free_coherent(dev->udev, size, buf, urb->transfer_dma);
 
-               dev_warn(netdev->dev.parent, "couldn't find free context\n");
+               netdev_warn(netdev, "couldn't find free context\n");
 
                return NETDEV_TX_BUSY;
        }
@@ -840,7 +834,7 @@ static netdev_tx_t ems_usb_start_xmit(struct sk_buff *skb, struct net_device *ne
                if (err == -ENODEV) {
                        netif_device_detach(netdev);
                } else {
-                       dev_warn(netdev->dev.parent, "failed tx_urb %d\n", err);
+                       netdev_warn(netdev, "failed tx_urb %d\n", err);
 
                        stats->tx_dropped++;
                }
@@ -880,7 +874,7 @@ static int ems_usb_close(struct net_device *netdev)
 
        /* Set CAN controller to reset mode */
        if (ems_usb_write_mode(dev, SJA1000_MOD_RM))
-               dev_warn(netdev->dev.parent, "couldn't stop device");
+               netdev_warn(netdev, "couldn't stop device");
 
        close_candev(netdev);
 
@@ -917,7 +911,7 @@ static int ems_usb_set_mode(struct net_device *netdev, enum can_mode mode)
        switch (mode) {
        case CAN_MODE_START:
                if (ems_usb_write_mode(dev, SJA1000_MOD_NORMAL))
-                       dev_warn(netdev->dev.parent, "couldn't start device");
+                       netdev_warn(netdev, "couldn't start device");
 
                if (netif_queue_stopped(netdev))
                        netif_wake_queue(netdev);
@@ -942,8 +936,7 @@ static int ems_usb_set_bittiming(struct net_device *netdev)
        if (dev->can.ctrlmode & CAN_CTRLMODE_3_SAMPLES)
                btr1 |= 0x80;
 
-       dev_info(netdev->dev.parent, "setting BTR0=0x%02x BTR1=0x%02x\n",
-                btr0, btr1);
+       netdev_info(netdev, "setting BTR0=0x%02x BTR1=0x%02x\n", btr0, btr1);
 
        dev->active_params.msg.can_params.cc_params.sja1000.btr0 = btr0;
        dev->active_params.msg.can_params.cc_params.sja1000.btr1 = btr1;
@@ -1048,15 +1041,13 @@ static int ems_usb_probe(struct usb_interface *intf,
 
        err = ems_usb_command_msg(dev, &dev->active_params);
        if (err) {
-               dev_err(netdev->dev.parent,
-                       "couldn't initialize controller: %d\n", err);
+               netdev_err(netdev, "couldn't initialize controller: %d\n", err);
                goto cleanup_tx_msg_buffer;
        }
 
        err = register_candev(netdev);
        if (err) {
-               dev_err(netdev->dev.parent,
-                       "couldn't register CAN device: %d\n", err);
+               netdev_err(netdev, "couldn't register CAN device: %d\n", err);
                goto cleanup_tx_msg_buffer;
        }
 
index 9277463..09b1da5 100644 (file)
@@ -470,8 +470,7 @@ static void esd_usb2_write_bulk_callback(struct urb *urb)
                return;
 
        if (urb->status)
-               dev_info(netdev->dev.parent, "Tx URB aborted (%d)\n",
-                        urb->status);
+               netdev_info(netdev, "Tx URB aborted (%d)\n", urb->status);
 
        netdev->trans_start = jiffies;
 }
@@ -651,7 +650,7 @@ failed:
        if (err == -ENODEV)
                netif_device_detach(netdev);
 
-       dev_err(netdev->dev.parent, "couldn't start device: %d\n", err);
+       netdev_err(netdev, "couldn't start device: %d\n", err);
 
        return err;
 }
@@ -687,8 +686,7 @@ static int esd_usb2_open(struct net_device *netdev)
        /* finally start device */
        err = esd_usb2_start(priv);
        if (err) {
-               dev_warn(netdev->dev.parent,
-                        "couldn't start device: %d\n", err);
+               netdev_warn(netdev, "couldn't start device: %d\n", err);
                close_candev(netdev);
                return err;
        }
@@ -721,7 +719,7 @@ static netdev_tx_t esd_usb2_start_xmit(struct sk_buff *skb,
        /* create a URB, and a buffer for it, and copy the data to the URB */
        urb = usb_alloc_urb(0, GFP_ATOMIC);
        if (!urb) {
-               dev_err(netdev->dev.parent, "No memory left for URBs\n");
+               netdev_err(netdev, "No memory left for URBs\n");
                stats->tx_dropped++;
                dev_kfree_skb(skb);
                goto nourbmem;
@@ -730,7 +728,7 @@ static netdev_tx_t esd_usb2_start_xmit(struct sk_buff *skb,
        buf = usb_alloc_coherent(dev->udev, size, GFP_ATOMIC,
                                 &urb->transfer_dma);
        if (!buf) {
-               dev_err(netdev->dev.parent, "No memory left for USB buffer\n");
+               netdev_err(netdev, "No memory left for USB buffer\n");
                stats->tx_dropped++;
                dev_kfree_skb(skb);
                goto nobufmem;
@@ -766,7 +764,7 @@ static netdev_tx_t esd_usb2_start_xmit(struct sk_buff *skb,
         * This may never happen.
         */
        if (!context) {
-               dev_warn(netdev->dev.parent, "couldn't find free context\n");
+               netdev_warn(netdev, "couldn't find free context\n");
                ret = NETDEV_TX_BUSY;
                goto releasebuf;
        }
@@ -806,7 +804,7 @@ static netdev_tx_t esd_usb2_start_xmit(struct sk_buff *skb,
                if (err == -ENODEV)
                        netif_device_detach(netdev);
                else
-                       dev_warn(netdev->dev.parent, "failed tx_urb %d\n", err);
+                       netdev_warn(netdev, "failed tx_urb %d\n", err);
 
                goto releasebuf;
        }
@@ -845,7 +843,7 @@ static int esd_usb2_close(struct net_device *netdev)
        for (i = 0; i <= ESD_MAX_ID_SEGMENT; i++)
                msg.msg.filter.mask[i] = 0;
        if (esd_usb2_send_msg(priv->usb2, &msg) < 0)
-               dev_err(netdev->dev.parent, "sending idadd message failed\n");
+               netdev_err(netdev, "sending idadd message failed\n");
 
        /* set CAN controller to reset mode */
        msg.msg.hdr.len = 2;
@@ -854,7 +852,7 @@ static int esd_usb2_close(struct net_device *netdev)
        msg.msg.setbaud.rsvd = 0;
        msg.msg.setbaud.baud = cpu_to_le32(ESD_USB2_NO_BAUDRATE);
        if (esd_usb2_send_msg(priv->usb2, &msg) < 0)
-               dev_err(netdev->dev.parent, "sending setbaud message failed\n");
+               netdev_err(netdev, "sending setbaud message failed\n");
 
        priv->can.state = CAN_STATE_STOPPED;
 
@@ -910,7 +908,7 @@ static int esd_usb2_set_bittiming(struct net_device *netdev)
        msg.msg.setbaud.rsvd = 0;
        msg.msg.setbaud.baud = cpu_to_le32(canbtr);
 
-       dev_info(netdev->dev.parent, "setting BTR=%#x\n", canbtr);
+       netdev_info(netdev, "setting BTR=%#x\n", canbtr);
 
        return esd_usb2_send_msg(priv->usb2, &msg);
 }
@@ -988,15 +986,14 @@ static int esd_usb2_probe_one_net(struct usb_interface *intf, int index)
 
        err = register_candev(netdev);
        if (err) {
-               dev_err(&intf->dev,
-                       "couldn't register CAN device: %d\n", err);
+               dev_err(&intf->dev, "couldn't register CAN device: %d\n", err);
                free_candev(netdev);
                err = -ENOMEM;
                goto done;
        }
 
        dev->nets[index] = priv;
-       dev_info(netdev->dev.parent, "device %s registered\n", netdev->name);
+       netdev_info(netdev, "device %s registered\n", netdev->name);
 
 done:
        return err;
diff --git a/drivers/net/can/usb/peak_usb/Makefile b/drivers/net/can/usb/peak_usb/Makefile
new file mode 100644 (file)
index 0000000..1aefbc8
--- /dev/null
@@ -0,0 +1,2 @@
+obj-$(CONFIG_CAN_PEAK_USB) += peak_usb.o
+peak_usb-y = pcan_usb_core.o pcan_usb.o pcan_usb_pro.o
diff --git a/drivers/net/can/usb/peak_usb/pcan_usb.c b/drivers/net/can/usb/peak_usb/pcan_usb.c
new file mode 100644 (file)
index 0000000..8a7982e
--- /dev/null
@@ -0,0 +1,901 @@
+/*
+ * CAN driver for PEAK System PCAN-USB adapter
+ * Derived from the PCAN project file driver/src/pcan_usb.c
+ *
+ * Copyright (C) 2003-2010 PEAK System-Technik GmbH
+ * Copyright (C) 2011-2012 Stephane Grosjean <s.grosjean@peak-system.com>
+ *
+ * Many thanks to Klaus Hitschler <klaus.hitschler@gmx.de>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published
+ * by the Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ */
+#include <linux/netdevice.h>
+#include <linux/usb.h>
+#include <linux/module.h>
+
+#include <linux/can.h>
+#include <linux/can/dev.h>
+#include <linux/can/error.h>
+
+#include "pcan_usb_core.h"
+
+MODULE_SUPPORTED_DEVICE("PEAK-System PCAN-USB adapter");
+
+/* PCAN-USB Endpoints */
+#define PCAN_USB_EP_CMDOUT             1
+#define PCAN_USB_EP_CMDIN              (PCAN_USB_EP_CMDOUT | USB_DIR_IN)
+#define PCAN_USB_EP_MSGOUT             2
+#define PCAN_USB_EP_MSGIN              (PCAN_USB_EP_MSGOUT | USB_DIR_IN)
+
+/* PCAN-USB command struct */
+#define PCAN_USB_CMD_FUNC              0
+#define PCAN_USB_CMD_NUM               1
+#define PCAN_USB_CMD_ARGS              2
+#define PCAN_USB_CMD_ARGS_LEN          14
+#define PCAN_USB_CMD_LEN               (PCAN_USB_CMD_ARGS + \
+                                        PCAN_USB_CMD_ARGS_LEN)
+
+/* PCAN-USB command timeout (ms.) */
+#define PCAN_USB_COMMAND_TIMEOUT       1000
+
+/* PCAN-USB startup timeout (ms.) */
+#define PCAN_USB_STARTUP_TIMEOUT       10
+
+/* PCAN-USB rx/tx buffers size */
+#define PCAN_USB_RX_BUFFER_SIZE                64
+#define PCAN_USB_TX_BUFFER_SIZE                64
+
+#define PCAN_USB_MSG_HEADER_LEN                2
+
+/* PCAN-USB adapter internal clock (MHz) */
+#define PCAN_USB_CRYSTAL_HZ            16000000
+
+/* PCAN-USB USB message record status/len field */
+#define PCAN_USB_STATUSLEN_TIMESTAMP   (1 << 7)
+#define PCAN_USB_STATUSLEN_INTERNAL    (1 << 6)
+#define PCAN_USB_STATUSLEN_EXT_ID      (1 << 5)
+#define PCAN_USB_STATUSLEN_RTR         (1 << 4)
+#define PCAN_USB_STATUSLEN_DLC         (0xf)
+
+/* PCAN-USB error flags */
+#define PCAN_USB_ERROR_TXFULL          0x01
+#define PCAN_USB_ERROR_RXQOVR          0x02
+#define PCAN_USB_ERROR_BUS_LIGHT       0x04
+#define PCAN_USB_ERROR_BUS_HEAVY       0x08
+#define PCAN_USB_ERROR_BUS_OFF         0x10
+#define PCAN_USB_ERROR_RXQEMPTY                0x20
+#define PCAN_USB_ERROR_QOVR            0x40
+#define PCAN_USB_ERROR_TXQFULL         0x80
+
+/* SJA1000 modes */
+#define SJA1000_MODE_NORMAL            0x00
+#define SJA1000_MODE_INIT              0x01
+
+/*
+ * tick duration = 42.666 us =>
+ * (tick_number * 44739243) >> 20 ~ (tick_number * 42666) / 1000
+ * accuracy = 10^-7
+ */
+#define PCAN_USB_TS_DIV_SHIFTER                20
+#define PCAN_USB_TS_US_PER_TICK                44739243
+
+/* PCAN-USB messages record types */
+#define PCAN_USB_REC_ERROR             1
+#define PCAN_USB_REC_ANALOG            2
+#define PCAN_USB_REC_BUSLOAD           3
+#define PCAN_USB_REC_TS                        4
+#define PCAN_USB_REC_BUSEVT            5
+
+/* private to PCAN-USB adapter */
+struct pcan_usb {
+       struct peak_usb_device dev;
+       struct peak_time_ref time_ref;
+       struct timer_list restart_timer;
+};
+
+/* incoming message context for decoding */
+struct pcan_usb_msg_context {
+       u16 ts16;
+       u8 prev_ts8;
+       u8 *ptr;
+       u8 *end;
+       u8 rec_cnt;
+       u8 rec_idx;
+       u8 rec_data_idx;
+       struct net_device *netdev;
+       struct pcan_usb *pdev;
+};
+
+/*
+ * send a command
+ */
+static int pcan_usb_send_cmd(struct peak_usb_device *dev, u8 f, u8 n, u8 *p)
+{
+       int err;
+       int actual_length;
+
+       /* usb device unregistered? */
+       if (!(dev->state & PCAN_USB_STATE_CONNECTED))
+               return 0;
+
+       dev->cmd_buf[PCAN_USB_CMD_FUNC] = f;
+       dev->cmd_buf[PCAN_USB_CMD_NUM] = n;
+
+       if (p)
+               memcpy(dev->cmd_buf + PCAN_USB_CMD_ARGS,
+                       p, PCAN_USB_CMD_ARGS_LEN);
+
+       err = usb_bulk_msg(dev->udev,
+                       usb_sndbulkpipe(dev->udev, PCAN_USB_EP_CMDOUT),
+                       dev->cmd_buf, PCAN_USB_CMD_LEN, &actual_length,
+                       PCAN_USB_COMMAND_TIMEOUT);
+       if (err)
+               netdev_err(dev->netdev,
+                       "sending cmd f=0x%x n=0x%x failure: %d\n",
+                       f, n, err);
+       return err;
+}
+
+/*
+ * send a command then wait for its response
+ */
+static int pcan_usb_wait_rsp(struct peak_usb_device *dev, u8 f, u8 n, u8 *p)
+{
+       int err;
+       int actual_length;
+
+       /* usb device unregistered? */
+       if (!(dev->state & PCAN_USB_STATE_CONNECTED))
+               return 0;
+
+       /* first, send command */
+       err = pcan_usb_send_cmd(dev, f, n, NULL);
+       if (err)
+               return err;
+
+       err = usb_bulk_msg(dev->udev,
+               usb_rcvbulkpipe(dev->udev, PCAN_USB_EP_CMDIN),
+               dev->cmd_buf, PCAN_USB_CMD_LEN, &actual_length,
+               PCAN_USB_COMMAND_TIMEOUT);
+       if (err)
+               netdev_err(dev->netdev,
+                       "waiting rsp f=0x%x n=0x%x failure: %d\n", f, n, err);
+       else if (p)
+               memcpy(p, dev->cmd_buf + PCAN_USB_CMD_ARGS,
+                       PCAN_USB_CMD_ARGS_LEN);
+
+       return err;
+}
+
+static int pcan_usb_set_sja1000(struct peak_usb_device *dev, u8 mode)
+{
+       u8 args[PCAN_USB_CMD_ARGS_LEN] = {
+               [1] = mode,
+       };
+
+       return pcan_usb_send_cmd(dev, 9, 2, args);
+}
+
+static int pcan_usb_set_bus(struct peak_usb_device *dev, u8 onoff)
+{
+       u8 args[PCAN_USB_CMD_ARGS_LEN] = {
+               [0] = !!onoff,
+       };
+
+       return pcan_usb_send_cmd(dev, 3, 2, args);
+}
+
+static int pcan_usb_set_silent(struct peak_usb_device *dev, u8 onoff)
+{
+       u8 args[PCAN_USB_CMD_ARGS_LEN] = {
+               [0] = !!onoff,
+       };
+
+       return pcan_usb_send_cmd(dev, 3, 3, args);
+}
+
+static int pcan_usb_set_ext_vcc(struct peak_usb_device *dev, u8 onoff)
+{
+       u8 args[PCAN_USB_CMD_ARGS_LEN] = {
+               [0] = !!onoff,
+       };
+
+       return pcan_usb_send_cmd(dev, 10, 2, args);
+}
+
+/*
+ * set bittiming value to can
+ */
+static int pcan_usb_set_bittiming(struct peak_usb_device *dev,
+                                 struct can_bittiming *bt)
+{
+       u8 args[PCAN_USB_CMD_ARGS_LEN];
+       u8 btr0, btr1;
+
+       btr0 = ((bt->brp - 1) & 0x3f) | (((bt->sjw - 1) & 0x3) << 6);
+       btr1 = ((bt->prop_seg + bt->phase_seg1 - 1) & 0xf) |
+               (((bt->phase_seg2 - 1) & 0x7) << 4);
+       if (dev->can.ctrlmode & CAN_CTRLMODE_3_SAMPLES)
+               btr1 |= 0x80;
+
+       netdev_info(dev->netdev, "setting BTR0=0x%02x BTR1=0x%02x\n",
+               btr0, btr1);
+
+       args[0] = btr1;
+       args[1] = btr0;
+
+       return pcan_usb_send_cmd(dev, 1, 2, args);
+}
+
+/*
+ * init/reset can
+ */
+static int pcan_usb_write_mode(struct peak_usb_device *dev, u8 onoff)
+{
+       int err;
+
+       err = pcan_usb_set_bus(dev, onoff);
+       if (err)
+               return err;
+
+       if (!onoff) {
+               err = pcan_usb_set_sja1000(dev, SJA1000_MODE_INIT);
+       } else {
+               /* the PCAN-USB needs time to init */
+               set_current_state(TASK_INTERRUPTIBLE);
+               schedule_timeout(msecs_to_jiffies(PCAN_USB_STARTUP_TIMEOUT));
+       }
+
+       return err;
+}
+
+/*
+ * handle end of waiting for the device to reset
+ */
+static void pcan_usb_restart(unsigned long arg)
+{
+       /* notify candev and netdev */
+       peak_usb_restart_complete((struct peak_usb_device *)arg);
+}
+
+/*
+ * handle the submission of the restart urb
+ */
+static void pcan_usb_restart_pending(struct urb *urb)
+{
+       struct pcan_usb *pdev = urb->context;
+
+       /* the PCAN-USB needs time to restart */
+       mod_timer(&pdev->restart_timer,
+                       jiffies + msecs_to_jiffies(PCAN_USB_STARTUP_TIMEOUT));
+
+       /* can delete usb resources */
+       peak_usb_async_complete(urb);
+}
+
+/*
+ * handle asynchronous restart
+ */
+static int pcan_usb_restart_async(struct peak_usb_device *dev, struct urb *urb,
+                                 u8 *buf)
+{
+       struct pcan_usb *pdev = container_of(dev, struct pcan_usb, dev);
+
+       if (timer_pending(&pdev->restart_timer))
+               return -EBUSY;
+
+       /* set bus on */
+       buf[PCAN_USB_CMD_FUNC] = 3;
+       buf[PCAN_USB_CMD_NUM] = 2;
+       buf[PCAN_USB_CMD_ARGS] = 1;
+
+       usb_fill_bulk_urb(urb, dev->udev,
+                       usb_sndbulkpipe(dev->udev, PCAN_USB_EP_CMDOUT),
+                       buf, PCAN_USB_CMD_LEN,
+                       pcan_usb_restart_pending, pdev);
+
+       return usb_submit_urb(urb, GFP_ATOMIC);
+}
+
+/*
+ * read serial number from device
+ */
+static int pcan_usb_get_serial(struct peak_usb_device *dev, u32 *serial_number)
+{
+       u8 args[PCAN_USB_CMD_ARGS_LEN];
+       int err;
+
+       err = pcan_usb_wait_rsp(dev, 6, 1, args);
+       if (err) {
+               netdev_err(dev->netdev, "getting serial failure: %d\n", err);
+       } else if (serial_number) {
+               u32 tmp32;
+
+               memcpy(&tmp32, args, 4);
+               *serial_number = le32_to_cpu(tmp32);
+       }
+
+       return err;
+}
+
+/*
+ * read device id from device
+ */
+static int pcan_usb_get_device_id(struct peak_usb_device *dev, u32 *device_id)
+{
+       u8 args[PCAN_USB_CMD_ARGS_LEN];
+       int err;
+
+       err = pcan_usb_wait_rsp(dev, 4, 1, args);
+       if (err)
+               netdev_err(dev->netdev, "getting device id failure: %d\n", err);
+       else if (device_id)
+               *device_id = args[0];
+
+       return err;
+}
+
+/*
+ * update current time ref with received timestamp
+ */
+static int pcan_usb_update_ts(struct pcan_usb_msg_context *mc)
+{
+       u16 tmp16;
+
+       if ((mc->ptr+2) > mc->end)
+               return -EINVAL;
+
+       memcpy(&tmp16, mc->ptr, 2);
+
+       mc->ts16 = le16_to_cpu(tmp16);
+
+       if (mc->rec_idx > 0)
+               peak_usb_update_ts_now(&mc->pdev->time_ref, mc->ts16);
+       else
+               peak_usb_set_ts_now(&mc->pdev->time_ref, mc->ts16);
+
+       return 0;
+}
+
+/*
+ * decode received timestamp
+ */
+static int pcan_usb_decode_ts(struct pcan_usb_msg_context *mc, u8 first_packet)
+{
+       /* only 1st packet supplies a word timestamp */
+       if (first_packet) {
+               u16 tmp16;
+
+               if ((mc->ptr + 2) > mc->end)
+                       return -EINVAL;
+
+               memcpy(&tmp16, mc->ptr, 2);
+               mc->ptr += 2;
+
+               mc->ts16 = le16_to_cpu(tmp16);
+               mc->prev_ts8 = mc->ts16 & 0x00ff;
+       } else {
+               u8 ts8;
+
+               if ((mc->ptr + 1) > mc->end)
+                       return -EINVAL;
+
+               ts8 = *mc->ptr++;
+
+               if (ts8 < mc->prev_ts8)
+                       mc->ts16 += 0x100;
+
+               mc->ts16 &= 0xff00;
+               mc->ts16 |= ts8;
+               mc->prev_ts8 = ts8;
+       }
+
+       return 0;
+}
+
+static int pcan_usb_decode_error(struct pcan_usb_msg_context *mc, u8 n,
+                                u8 status_len)
+{
+       struct sk_buff *skb;
+       struct can_frame *cf;
+       struct timeval tv;
+       enum can_state new_state;
+
+       /* ignore this error until 1st ts received */
+       if (n == PCAN_USB_ERROR_QOVR)
+               if (!mc->pdev->time_ref.tick_count)
+                       return 0;
+
+       new_state = mc->pdev->dev.can.state;
+
+       switch (mc->pdev->dev.can.state) {
+       case CAN_STATE_ERROR_ACTIVE:
+               if (n & PCAN_USB_ERROR_BUS_LIGHT) {
+                       new_state = CAN_STATE_ERROR_WARNING;
+                       break;
+               }
+
+       case CAN_STATE_ERROR_WARNING:
+               if (n & PCAN_USB_ERROR_BUS_HEAVY) {
+                       new_state = CAN_STATE_ERROR_PASSIVE;
+                       break;
+               }
+               if (n & PCAN_USB_ERROR_BUS_OFF) {
+                       new_state = CAN_STATE_BUS_OFF;
+                       break;
+               }
+               if (n & (PCAN_USB_ERROR_RXQOVR | PCAN_USB_ERROR_QOVR)) {
+                       /*
+                        * trick to bypass next comparison and process other
+                        * errors
+                        */
+                       new_state = CAN_STATE_MAX;
+                       break;
+               }
+               if ((n & PCAN_USB_ERROR_BUS_LIGHT) == 0) {
+                       /* no error (back to active state) */
+                       mc->pdev->dev.can.state = CAN_STATE_ERROR_ACTIVE;
+                       return 0;
+               }
+               break;
+
+       case CAN_STATE_ERROR_PASSIVE:
+               if (n & PCAN_USB_ERROR_BUS_OFF) {
+                       new_state = CAN_STATE_BUS_OFF;
+                       break;
+               }
+               if (n & PCAN_USB_ERROR_BUS_LIGHT) {
+                       new_state = CAN_STATE_ERROR_WARNING;
+                       break;
+               }
+               if (n & (PCAN_USB_ERROR_RXQOVR | PCAN_USB_ERROR_QOVR)) {
+                       /*
+                        * trick to bypass next comparison and process other
+                        * errors
+                        */
+                       new_state = CAN_STATE_MAX;
+                       break;
+               }
+
+               if ((n & PCAN_USB_ERROR_BUS_HEAVY) == 0) {
+                       /* no error (back to active state) */
+                       mc->pdev->dev.can.state = CAN_STATE_ERROR_ACTIVE;
+                       return 0;
+               }
+               break;
+
+       default:
+               /* do nothing waiting for restart */
+               return 0;
+       }
+
+       /* donot post any error if current state didn't change */
+       if (mc->pdev->dev.can.state == new_state)
+               return 0;
+
+       /* allocate an skb to store the error frame */
+       skb = alloc_can_err_skb(mc->netdev, &cf);
+       if (!skb)
+               return -ENOMEM;
+
+       switch (new_state) {
+       case CAN_STATE_BUS_OFF:
+               cf->can_id |= CAN_ERR_BUSOFF;
+               can_bus_off(mc->netdev);
+               break;
+
+       case CAN_STATE_ERROR_PASSIVE:
+               cf->can_id |= CAN_ERR_CRTL;
+               cf->data[1] |= CAN_ERR_CRTL_TX_PASSIVE |
+                              CAN_ERR_CRTL_RX_PASSIVE;
+               mc->pdev->dev.can.can_stats.error_passive++;
+               break;
+
+       case CAN_STATE_ERROR_WARNING:
+               cf->can_id |= CAN_ERR_CRTL;
+               cf->data[1] |= CAN_ERR_CRTL_TX_WARNING |
+                              CAN_ERR_CRTL_RX_WARNING;
+               mc->pdev->dev.can.can_stats.error_warning++;
+               break;
+
+       default:
+               /* CAN_STATE_MAX (trick to handle other errors) */
+               cf->can_id |= CAN_ERR_CRTL;
+               cf->data[1] |= CAN_ERR_CRTL_RX_OVERFLOW;
+               mc->netdev->stats.rx_over_errors++;
+               mc->netdev->stats.rx_errors++;
+
+               new_state = mc->pdev->dev.can.state;
+               break;
+       }
+
+       mc->pdev->dev.can.state = new_state;
+
+       if (status_len & PCAN_USB_STATUSLEN_TIMESTAMP) {
+               peak_usb_get_ts_tv(&mc->pdev->time_ref, mc->ts16, &tv);
+               skb->tstamp = timeval_to_ktime(tv);
+       }
+
+       netif_rx(skb);
+       mc->netdev->stats.rx_packets++;
+       mc->netdev->stats.rx_bytes += cf->can_dlc;
+
+       return 0;
+}
+
+/*
+ * decode non-data usb message
+ */
+static int pcan_usb_decode_status(struct pcan_usb_msg_context *mc,
+                                 u8 status_len)
+{
+       u8 rec_len = status_len & PCAN_USB_STATUSLEN_DLC;
+       u8 f, n;
+       int err;
+
+       /* check whether function and number can be read */
+       if ((mc->ptr + 2) > mc->end)
+               return -EINVAL;
+
+       f = mc->ptr[PCAN_USB_CMD_FUNC];
+       n = mc->ptr[PCAN_USB_CMD_NUM];
+       mc->ptr += PCAN_USB_CMD_ARGS;
+
+       if (status_len & PCAN_USB_STATUSLEN_TIMESTAMP) {
+               int err = pcan_usb_decode_ts(mc, !mc->rec_idx);
+
+               if (err)
+                       return err;
+       }
+
+       switch (f) {
+       case PCAN_USB_REC_ERROR:
+               err = pcan_usb_decode_error(mc, n, status_len);
+               if (err)
+                       return err;
+               break;
+
+       case PCAN_USB_REC_ANALOG:
+               /* analog values (ignored) */
+               rec_len = 2;
+               break;
+
+       case PCAN_USB_REC_BUSLOAD:
+               /* bus load (ignored) */
+               rec_len = 1;
+               break;
+
+       case PCAN_USB_REC_TS:
+               /* only timestamp */
+               if (pcan_usb_update_ts(mc))
+                       return -EINVAL;
+               break;
+
+       case PCAN_USB_REC_BUSEVT:
+               /* error frame/bus event */
+               if (n & PCAN_USB_ERROR_TXQFULL)
+                       netdev_dbg(mc->netdev, "device Tx queue full)\n");
+               break;
+       default:
+               netdev_err(mc->netdev, "unexpected function %u\n", f);
+               break;
+       }
+
+       if ((mc->ptr + rec_len) > mc->end)
+               return -EINVAL;
+
+       mc->ptr += rec_len;
+
+       return 0;
+}
+
+/*
+ * decode data usb message
+ */
+static int pcan_usb_decode_data(struct pcan_usb_msg_context *mc, u8 status_len)
+{
+       u8 rec_len = status_len & PCAN_USB_STATUSLEN_DLC;
+       struct sk_buff *skb;
+       struct can_frame *cf;
+       struct timeval tv;
+
+       skb = alloc_can_skb(mc->netdev, &cf);
+       if (!skb)
+               return -ENOMEM;
+
+       if (status_len & PCAN_USB_STATUSLEN_EXT_ID) {
+               u32 tmp32;
+
+               if ((mc->ptr + 4) > mc->end)
+                       goto decode_failed;
+
+               memcpy(&tmp32, mc->ptr, 4);
+               mc->ptr += 4;
+
+               cf->can_id = le32_to_cpu(tmp32 >> 3) | CAN_EFF_FLAG;
+       } else {
+               u16 tmp16;
+
+               if ((mc->ptr + 2) > mc->end)
+                       goto decode_failed;
+
+               memcpy(&tmp16, mc->ptr, 2);
+               mc->ptr += 2;
+
+               cf->can_id = le16_to_cpu(tmp16 >> 5);
+       }
+
+       cf->can_dlc = get_can_dlc(rec_len);
+
+       /* first data packet timestamp is a word */
+       if (pcan_usb_decode_ts(mc, !mc->rec_data_idx))
+               goto decode_failed;
+
+       /* read data */
+       memset(cf->data, 0x0, sizeof(cf->data));
+       if (status_len & PCAN_USB_STATUSLEN_RTR) {
+               cf->can_id |= CAN_RTR_FLAG;
+       } else {
+               if ((mc->ptr + rec_len) > mc->end)
+                       goto decode_failed;
+
+               memcpy(cf->data, mc->ptr, rec_len);
+               mc->ptr += rec_len;
+       }
+
+       /* convert timestamp into kernel time */
+       peak_usb_get_ts_tv(&mc->pdev->time_ref, mc->ts16, &tv);
+       skb->tstamp = timeval_to_ktime(tv);
+
+       /* push the skb */
+       netif_rx(skb);
+
+       /* update statistics */
+       mc->netdev->stats.rx_packets++;
+       mc->netdev->stats.rx_bytes += cf->can_dlc;
+
+       return 0;
+
+decode_failed:
+       dev_kfree_skb(skb);
+       return -EINVAL;
+}
+
+/*
+ * process incoming message
+ */
+static int pcan_usb_decode_msg(struct peak_usb_device *dev, u8 *ibuf, u32 lbuf)
+{
+       struct pcan_usb_msg_context mc = {
+               .rec_cnt = ibuf[1],
+               .ptr = ibuf + PCAN_USB_MSG_HEADER_LEN,
+               .end = ibuf + lbuf,
+               .netdev = dev->netdev,
+               .pdev = container_of(dev, struct pcan_usb, dev),
+       };
+       int err;
+
+       for (err = 0; mc.rec_idx < mc.rec_cnt && !err; mc.rec_idx++) {
+               u8 sl = *mc.ptr++;
+
+               /* handle status and error frames here */
+               if (sl & PCAN_USB_STATUSLEN_INTERNAL) {
+                       err = pcan_usb_decode_status(&mc, sl);
+               /* handle normal can frames here */
+               } else {
+                       err = pcan_usb_decode_data(&mc, sl);
+                       mc.rec_data_idx++;
+               }
+       }
+
+       return err;
+}
+
+/*
+ * process any incoming buffer
+ */
+static int pcan_usb_decode_buf(struct peak_usb_device *dev, struct urb *urb)
+{
+       int err = 0;
+
+       if (urb->actual_length > PCAN_USB_MSG_HEADER_LEN) {
+               err = pcan_usb_decode_msg(dev, urb->transfer_buffer,
+                       urb->actual_length);
+
+       } else if (urb->actual_length > 0) {
+               netdev_err(dev->netdev, "usb message length error (%u)\n",
+                       urb->actual_length);
+               err = -EINVAL;
+       }
+
+       return err;
+}
+
+/*
+ * process outgoing packet
+ */
+static int pcan_usb_encode_msg(struct peak_usb_device *dev, struct sk_buff *skb,
+                              u8 *obuf, size_t *size)
+{
+       struct net_device *netdev = dev->netdev;
+       struct net_device_stats *stats = &netdev->stats;
+       struct can_frame *cf = (struct can_frame *)skb->data;
+       u8 *pc;
+
+       obuf[0] = 2;
+       obuf[1] = 1;
+
+       pc = obuf + PCAN_USB_MSG_HEADER_LEN;
+
+       /* status/len byte */
+       *pc = cf->can_dlc;
+       if (cf->can_id & CAN_RTR_FLAG)
+               *pc |= PCAN_USB_STATUSLEN_RTR;
+
+       /* can id */
+       if (cf->can_id & CAN_EFF_FLAG) {
+               __le32 tmp32 = cpu_to_le32(cf->can_id & CAN_ERR_MASK);
+
+               tmp32 <<= 3;
+               *pc |= PCAN_USB_STATUSLEN_EXT_ID;
+               memcpy(++pc, &tmp32, 4);
+               pc += 4;
+       } else {
+               __le16 tmp16 = cpu_to_le32(cf->can_id & CAN_ERR_MASK);
+
+               tmp16 <<= 5;
+               memcpy(++pc, &tmp16, 2);
+               pc += 2;
+       }
+
+       /* can data */
+       if (!(cf->can_id & CAN_RTR_FLAG)) {
+               memcpy(pc, cf->data, cf->can_dlc);
+               pc += cf->can_dlc;
+       }
+
+       obuf[(*size)-1] = (u8)(stats->tx_packets & 0xff);
+
+       return 0;
+}
+
+/*
+ * start interface
+ */
+static int pcan_usb_start(struct peak_usb_device *dev)
+{
+       struct pcan_usb *pdev = container_of(dev, struct pcan_usb, dev);
+
+       /* number of bits used in timestamps read from adapter struct */
+       peak_usb_init_time_ref(&pdev->time_ref, &pcan_usb);
+
+       /* if revision greater than 3, can put silent mode on/off */
+       if (dev->device_rev > 3) {
+               int err;
+
+               err = pcan_usb_set_silent(dev,
+                               dev->can.ctrlmode & CAN_CTRLMODE_LISTENONLY);
+               if (err)
+                       return err;
+       }
+
+       return pcan_usb_set_ext_vcc(dev, 0);
+}
+
+static int pcan_usb_init(struct peak_usb_device *dev)
+{
+       struct pcan_usb *pdev = container_of(dev, struct pcan_usb, dev);
+       u32 serial_number;
+       int err;
+
+       /* initialize a timer needed to wait for hardware restart */
+       init_timer(&pdev->restart_timer);
+       pdev->restart_timer.function = pcan_usb_restart;
+       pdev->restart_timer.data = (unsigned long)dev;
+
+       /*
+        * explicit use of dev_xxx() instead of netdev_xxx() here:
+        * information displayed are related to the device itself, not
+        * to the canx netdevice.
+        */
+       err = pcan_usb_get_serial(dev, &serial_number);
+       if (err) {
+               dev_err(dev->netdev->dev.parent,
+                       "unable to read %s serial number (err %d)\n",
+                       pcan_usb.name, err);
+               return err;
+       }
+
+       dev_info(dev->netdev->dev.parent,
+                "PEAK-System %s adapter hwrev %u serial %08X (%u channel)\n",
+                pcan_usb.name, dev->device_rev, serial_number,
+                pcan_usb.ctrl_count);
+
+       return 0;
+}
+
+/*
+ * probe function for new PCAN-USB usb interface
+ */
+static int pcan_usb_probe(struct usb_interface *intf)
+{
+       struct usb_host_interface *if_desc;
+       int i;
+
+       if_desc = intf->altsetting;
+
+       /* check interface endpoint addresses */
+       for (i = 0; i < if_desc->desc.bNumEndpoints; i++) {
+               struct usb_endpoint_descriptor *ep = &if_desc->endpoint[i].desc;
+
+               switch (ep->bEndpointAddress) {
+               case PCAN_USB_EP_CMDOUT:
+               case PCAN_USB_EP_CMDIN:
+               case PCAN_USB_EP_MSGOUT:
+               case PCAN_USB_EP_MSGIN:
+                       break;
+               default:
+                       return -ENODEV;
+               }
+       }
+
+       return 0;
+}
+
+/*
+ * describe the PCAN-USB adapter
+ */
+struct peak_usb_adapter pcan_usb = {
+       .name = "PCAN-USB",
+       .device_id = PCAN_USB_PRODUCT_ID,
+       .ctrl_count = 1,
+       .clock = {
+               .freq = PCAN_USB_CRYSTAL_HZ / 2 ,
+       },
+       .bittiming_const = {
+               .name = "pcan_usb",
+               .tseg1_min = 1,
+               .tseg1_max = 16,
+               .tseg2_min = 1,
+               .tseg2_max = 8,
+               .sjw_max = 4,
+               .brp_min = 1,
+               .brp_max = 64,
+               .brp_inc = 1,
+       },
+
+       /* size of device private data */
+       .sizeof_dev_private = sizeof(struct pcan_usb),
+
+       /* timestamps usage */
+       .ts_used_bits = 16,
+       .ts_period = 24575, /* calibration period in ts. */
+       .us_per_ts_scale = PCAN_USB_TS_US_PER_TICK, /* us=(ts*scale) */
+       .us_per_ts_shift = PCAN_USB_TS_DIV_SHIFTER, /*  >> shift     */
+
+       /* give here messages in/out endpoints */
+       .ep_msg_in = PCAN_USB_EP_MSGIN,
+       .ep_msg_out = {PCAN_USB_EP_MSGOUT},
+
+       /* size of rx/tx usb buffers */
+       .rx_buffer_size = PCAN_USB_RX_BUFFER_SIZE,
+       .tx_buffer_size = PCAN_USB_TX_BUFFER_SIZE,
+
+       /* device callbacks */
+       .intf_probe = pcan_usb_probe,
+       .dev_init = pcan_usb_init,
+       .dev_set_bus = pcan_usb_write_mode,
+       .dev_set_bittiming = pcan_usb_set_bittiming,
+       .dev_get_device_id = pcan_usb_get_device_id,
+       .dev_decode_buf = pcan_usb_decode_buf,
+       .dev_encode_msg = pcan_usb_encode_msg,
+       .dev_start = pcan_usb_start,
+       .dev_restart_async = pcan_usb_restart_async,
+};
diff --git a/drivers/net/can/usb/peak_usb/pcan_usb_core.c b/drivers/net/can/usb/peak_usb/pcan_usb_core.c
new file mode 100644 (file)
index 0000000..d2f91f7
--- /dev/null
@@ -0,0 +1,951 @@
+/*
+ * CAN driver for PEAK System USB adapters
+ * Derived from the PCAN project file driver/src/pcan_usb_core.c
+ *
+ * Copyright (C) 2003-2010 PEAK System-Technik GmbH
+ * Copyright (C) 2010-2012 Stephane Grosjean <s.grosjean@peak-system.com>
+ *
+ * Many thanks to Klaus Hitschler <klaus.hitschler@gmx.de>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published
+ * by the Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ */
+#include <linux/init.h>
+#include <linux/signal.h>
+#include <linux/slab.h>
+#include <linux/module.h>
+#include <linux/netdevice.h>
+#include <linux/usb.h>
+
+#include <linux/can.h>
+#include <linux/can/dev.h>
+#include <linux/can/error.h>
+
+#include "pcan_usb_core.h"
+
+MODULE_AUTHOR("Stephane Grosjean <s.grosjean@peak-system.com>");
+MODULE_DESCRIPTION("CAN driver for PEAK-System USB adapters");
+MODULE_LICENSE("GPL v2");
+
+/* Table of devices that work with this driver */
+static struct usb_device_id peak_usb_table[] = {
+       {USB_DEVICE(PCAN_USB_VENDOR_ID, PCAN_USB_PRODUCT_ID)},
+       {USB_DEVICE(PCAN_USB_VENDOR_ID, PCAN_USBPRO_PRODUCT_ID)},
+       {} /* Terminating entry */
+};
+
+MODULE_DEVICE_TABLE(usb, peak_usb_table);
+
+/* List of supported PCAN-USB adapters (NULL terminated list) */
+static struct peak_usb_adapter *peak_usb_adapters_list[] = {
+       &pcan_usb,
+       &pcan_usb_pro,
+       NULL,
+};
+
+/*
+ * dump memory
+ */
+#define DUMP_WIDTH     16
+void dump_mem(char *prompt, void *p, int l)
+{
+       pr_info("%s dumping %s (%d bytes):\n",
+               PCAN_USB_DRIVER_NAME, prompt ? prompt : "memory", l);
+       print_hex_dump(KERN_INFO, PCAN_USB_DRIVER_NAME " ", DUMP_PREFIX_NONE,
+                      DUMP_WIDTH, 1, p, l, false);
+}
+
+/*
+ * initialize a time_ref object with usb adapter own settings
+ */
+void peak_usb_init_time_ref(struct peak_time_ref *time_ref,
+                           struct peak_usb_adapter *adapter)
+{
+       if (time_ref) {
+               memset(time_ref, 0, sizeof(struct peak_time_ref));
+               time_ref->adapter = adapter;
+       }
+}
+
+static void peak_usb_add_us(struct timeval *tv, u32 delta_us)
+{
+       /* number of s. to add to final time */
+       u32 delta_s = delta_us / 1000000;
+
+       delta_us -= delta_s * 1000000;
+
+       tv->tv_usec += delta_us;
+       if (tv->tv_usec >= 1000000) {
+               tv->tv_usec -= 1000000;
+               delta_s++;
+       }
+       tv->tv_sec += delta_s;
+}
+
+/*
+ * sometimes, another now may be  more recent than current one...
+ */
+void peak_usb_update_ts_now(struct peak_time_ref *time_ref, u32 ts_now)
+{
+       time_ref->ts_dev_2 = ts_now;
+
+       /* should wait at least two passes before computing */
+       if (time_ref->tv_host.tv_sec > 0) {
+               u32 delta_ts = time_ref->ts_dev_2 - time_ref->ts_dev_1;
+
+               if (time_ref->ts_dev_2 < time_ref->ts_dev_1)
+                       delta_ts &= (1 << time_ref->adapter->ts_used_bits) - 1;
+
+               time_ref->ts_total += delta_ts;
+       }
+}
+
+/*
+ * register device timestamp as now
+ */
+void peak_usb_set_ts_now(struct peak_time_ref *time_ref, u32 ts_now)
+{
+       if (time_ref->tv_host_0.tv_sec == 0) {
+               /* use monotonic clock to correctly compute further deltas */
+               time_ref->tv_host_0 = ktime_to_timeval(ktime_get());
+               time_ref->tv_host.tv_sec = 0;
+       } else {
+               /*
+                * delta_us should not be >= 2^32 => delta_s should be < 4294
+                * handle 32-bits wrapping here: if count of s. reaches 4200,
+                * reset counters and change time base
+                */
+               if (time_ref->tv_host.tv_sec != 0) {
+                       u32 delta_s = time_ref->tv_host.tv_sec
+                                               - time_ref->tv_host_0.tv_sec;
+                       if (delta_s > 4200) {
+                               time_ref->tv_host_0 = time_ref->tv_host;
+                               time_ref->ts_total = 0;
+                       }
+               }
+
+               time_ref->tv_host = ktime_to_timeval(ktime_get());
+               time_ref->tick_count++;
+       }
+
+       time_ref->ts_dev_1 = time_ref->ts_dev_2;
+       peak_usb_update_ts_now(time_ref, ts_now);
+}
+
+/*
+ * compute timeval according to current ts and time_ref data
+ */
+void peak_usb_get_ts_tv(struct peak_time_ref *time_ref, u32 ts,
+                       struct timeval *tv)
+{
+       /* protect from getting timeval before setting now */
+       if (time_ref->tv_host.tv_sec > 0) {
+               u64 delta_us;
+
+               delta_us = ts - time_ref->ts_dev_2;
+               if (ts < time_ref->ts_dev_2)
+                       delta_us &= (1 << time_ref->adapter->ts_used_bits) - 1;
+
+               delta_us += time_ref->ts_total;
+
+               delta_us *= time_ref->adapter->us_per_ts_scale;
+               delta_us >>= time_ref->adapter->us_per_ts_shift;
+
+               *tv = time_ref->tv_host_0;
+               peak_usb_add_us(tv, (u32)delta_us);
+       } else {
+               *tv = ktime_to_timeval(ktime_get());
+       }
+}
+
+/*
+ * callback for bulk Rx urb
+ */
+static void peak_usb_read_bulk_callback(struct urb *urb)
+{
+       struct peak_usb_device *dev = urb->context;
+       struct net_device *netdev;
+       int err;
+
+       netdev = dev->netdev;
+
+       if (!netif_device_present(netdev))
+               return;
+
+       /* check reception status */
+       switch (urb->status) {
+       case 0:
+               /* success */
+               break;
+
+       case -EILSEQ:
+       case -ENOENT:
+       case -ECONNRESET:
+       case -ESHUTDOWN:
+               return;
+
+       default:
+               if (net_ratelimit())
+                       netdev_err(netdev,
+                                  "Rx urb aborted (%d)\n", urb->status);
+               goto resubmit_urb;
+       }
+
+       /* protect from any incoming empty msgs */
+       if ((urb->actual_length > 0) && (dev->adapter->dev_decode_buf)) {
+               /* handle these kinds of msgs only if _start callback called */
+               if (dev->state & PCAN_USB_STATE_STARTED) {
+                       err = dev->adapter->dev_decode_buf(dev, urb);
+                       if (err)
+                               dump_mem("received usb message",
+                                       urb->transfer_buffer,
+                                       urb->transfer_buffer_length);
+               }
+       }
+
+resubmit_urb:
+       usb_fill_bulk_urb(urb, dev->udev,
+               usb_rcvbulkpipe(dev->udev, dev->ep_msg_in),
+               urb->transfer_buffer, dev->adapter->rx_buffer_size,
+               peak_usb_read_bulk_callback, dev);
+
+       usb_anchor_urb(urb, &dev->rx_submitted);
+       err = usb_submit_urb(urb, GFP_ATOMIC);
+       if (!err)
+               return;
+
+       usb_unanchor_urb(urb);
+
+       if (err == -ENODEV)
+               netif_device_detach(netdev);
+       else
+               netdev_err(netdev, "failed resubmitting read bulk urb: %d\n",
+                          err);
+}
+
+/*
+ * callback for bulk Tx urb
+ */
+static void peak_usb_write_bulk_callback(struct urb *urb)
+{
+       struct peak_tx_urb_context *context = urb->context;
+       struct peak_usb_device *dev;
+       struct net_device *netdev;
+
+       BUG_ON(!context);
+
+       dev = context->dev;
+       netdev = dev->netdev;
+
+       atomic_dec(&dev->active_tx_urbs);
+
+       if (!netif_device_present(netdev))
+               return;
+
+       /* check tx status */
+       switch (urb->status) {
+       case 0:
+               /* transmission complete */
+               netdev->stats.tx_packets++;
+               netdev->stats.tx_bytes += context->dlc;
+
+               /* prevent tx timeout */
+               netdev->trans_start = jiffies;
+               break;
+
+       default:
+               if (net_ratelimit())
+                       netdev_err(netdev, "Tx urb aborted (%d)\n",
+                                  urb->status);
+       case -EPROTO:
+       case -ENOENT:
+       case -ECONNRESET:
+       case -ESHUTDOWN:
+
+               break;
+       }
+
+       /* should always release echo skb and corresponding context */
+       can_get_echo_skb(netdev, context->echo_index);
+       context->echo_index = PCAN_USB_MAX_TX_URBS;
+
+       /* do wakeup tx queue in case of success only */
+       if (!urb->status)
+               netif_wake_queue(netdev);
+}
+
+/*
+ * called by netdev to send one skb on the CAN interface.
+ */
+static netdev_tx_t peak_usb_ndo_start_xmit(struct sk_buff *skb,
+                                          struct net_device *netdev)
+{
+       struct peak_usb_device *dev = netdev_priv(netdev);
+       struct peak_tx_urb_context *context = NULL;
+       struct net_device_stats *stats = &netdev->stats;
+       struct can_frame *cf = (struct can_frame *)skb->data;
+       struct urb *urb;
+       u8 *obuf;
+       int i, err;
+       size_t size = dev->adapter->tx_buffer_size;
+
+       if (can_dropped_invalid_skb(netdev, skb))
+               return NETDEV_TX_OK;
+
+       for (i = 0; i < PCAN_USB_MAX_TX_URBS; i++)
+               if (dev->tx_contexts[i].echo_index == PCAN_USB_MAX_TX_URBS) {
+                       context = dev->tx_contexts + i;
+                       break;
+               }
+
+       if (!context) {
+               /* should not occur except during restart */
+               return NETDEV_TX_BUSY;
+       }
+
+       urb = context->urb;
+       obuf = urb->transfer_buffer;
+
+       err = dev->adapter->dev_encode_msg(dev, skb, obuf, &size);
+       if (err) {
+               if (net_ratelimit())
+                       netdev_err(netdev, "packet dropped\n");
+               dev_kfree_skb(skb);
+               stats->tx_dropped++;
+               return NETDEV_TX_OK;
+       }
+
+       context->echo_index = i;
+       context->dlc = cf->can_dlc;
+
+       usb_anchor_urb(urb, &dev->tx_submitted);
+
+       can_put_echo_skb(skb, netdev, context->echo_index);
+
+       atomic_inc(&dev->active_tx_urbs);
+
+       err = usb_submit_urb(urb, GFP_ATOMIC);
+       if (err) {
+               can_free_echo_skb(netdev, context->echo_index);
+
+               usb_unanchor_urb(urb);
+
+               /* this context is not used in fact */
+               context->echo_index = PCAN_USB_MAX_TX_URBS;
+
+               atomic_dec(&dev->active_tx_urbs);
+
+               switch (err) {
+               case -ENODEV:
+                       netif_device_detach(netdev);
+                       break;
+               default:
+                       netdev_warn(netdev, "tx urb submitting failed err=%d\n",
+                                   err);
+               case -ENOENT:
+                       /* cable unplugged */
+                       stats->tx_dropped++;
+               }
+       } else {
+               netdev->trans_start = jiffies;
+
+               /* slow down tx path */
+               if (atomic_read(&dev->active_tx_urbs) >= PCAN_USB_MAX_TX_URBS)
+                       netif_stop_queue(netdev);
+       }
+
+       return NETDEV_TX_OK;
+}
+
+/*
+ * start the CAN interface.
+ * Rx and Tx urbs are allocated here. Rx urbs are submitted here.
+ */
+static int peak_usb_start(struct peak_usb_device *dev)
+{
+       struct net_device *netdev = dev->netdev;
+       int err, i;
+
+       for (i = 0; i < PCAN_USB_MAX_RX_URBS; i++) {
+               struct urb *urb;
+               u8 *buf;
+
+               /* create a URB, and a buffer for it, to receive usb messages */
+               urb = usb_alloc_urb(0, GFP_KERNEL);
+               if (!urb) {
+                       netdev_err(netdev, "No memory left for URBs\n");
+                       err = -ENOMEM;
+                       break;
+               }
+
+               buf = kmalloc(dev->adapter->rx_buffer_size, GFP_KERNEL);
+               if (!buf) {
+                       netdev_err(netdev, "No memory left for USB buffer\n");
+                       usb_free_urb(urb);
+                       err = -ENOMEM;
+                       break;
+               }
+
+               usb_fill_bulk_urb(urb, dev->udev,
+                       usb_rcvbulkpipe(dev->udev, dev->ep_msg_in),
+                       buf, dev->adapter->rx_buffer_size,
+                       peak_usb_read_bulk_callback, dev);
+
+               /* ask last usb_free_urb() to also kfree() transfer_buffer */
+               urb->transfer_flags |= URB_FREE_BUFFER;
+               usb_anchor_urb(urb, &dev->rx_submitted);
+
+               err = usb_submit_urb(urb, GFP_KERNEL);
+               if (err) {
+                       if (err == -ENODEV)
+                               netif_device_detach(dev->netdev);
+
+                       usb_unanchor_urb(urb);
+                       kfree(buf);
+                       usb_free_urb(urb);
+                       break;
+               }
+
+               /* drop reference, USB core will take care of freeing it */
+               usb_free_urb(urb);
+       }
+
+       /* did we submit any URBs? Warn if we was not able to submit all urbs */
+       if (i < PCAN_USB_MAX_RX_URBS) {
+               if (i == 0) {
+                       netdev_err(netdev, "couldn't setup any rx URB\n");
+                       return err;
+               }
+
+               netdev_warn(netdev, "rx performance may be slow\n");
+       }
+
+       /* pre-alloc tx buffers and corresponding urbs */
+       for (i = 0; i < PCAN_USB_MAX_TX_URBS; i++) {
+               struct peak_tx_urb_context *context;
+               struct urb *urb;
+               u8 *buf;
+
+               /* create a URB and a buffer for it, to transmit usb messages */
+               urb = usb_alloc_urb(0, GFP_KERNEL);
+               if (!urb) {
+                       netdev_err(netdev, "No memory left for URBs\n");
+                       err = -ENOMEM;
+                       break;
+               }
+
+               buf = kmalloc(dev->adapter->tx_buffer_size, GFP_KERNEL);
+               if (!buf) {
+                       netdev_err(netdev, "No memory left for USB buffer\n");
+                       usb_free_urb(urb);
+                       err = -ENOMEM;
+                       break;
+               }
+
+               context = dev->tx_contexts + i;
+               context->dev = dev;
+               context->urb = urb;
+
+               usb_fill_bulk_urb(urb, dev->udev,
+                       usb_sndbulkpipe(dev->udev, dev->ep_msg_out),
+                       buf, dev->adapter->tx_buffer_size,
+                       peak_usb_write_bulk_callback, context);
+
+               /* ask last usb_free_urb() to also kfree() transfer_buffer */
+               urb->transfer_flags |= URB_FREE_BUFFER;
+       }
+
+       /* warn if we were not able to allocate enough tx contexts */
+       if (i < PCAN_USB_MAX_TX_URBS) {
+               if (i == 0) {
+                       netdev_err(netdev, "couldn't setup any tx URB\n");
+                       return err;
+               }
+
+               netdev_warn(netdev, "tx performance may be slow\n");
+       }
+
+       if (dev->adapter->dev_start) {
+               err = dev->adapter->dev_start(dev);
+               if (err)
+                       goto failed;
+       }
+
+       dev->state |= PCAN_USB_STATE_STARTED;
+
+       /* can set bus on now */
+       if (dev->adapter->dev_set_bus) {
+               err = dev->adapter->dev_set_bus(dev, 1);
+               if (err)
+                       goto failed;
+       }
+
+       dev->can.state = CAN_STATE_ERROR_ACTIVE;
+
+       return 0;
+
+failed:
+       if (err == -ENODEV)
+               netif_device_detach(dev->netdev);
+
+       netdev_warn(netdev, "couldn't submit control: %d\n", err);
+
+       return err;
+}
+
+/*
+ * called by netdev to open the corresponding CAN interface.
+ */
+static int peak_usb_ndo_open(struct net_device *netdev)
+{
+       struct peak_usb_device *dev = netdev_priv(netdev);
+       int err;
+
+       /* common open */
+       err = open_candev(netdev);
+       if (err)
+               return err;
+
+       /* finally start device */
+       err = peak_usb_start(dev);
+       if (err) {
+               netdev_err(netdev, "couldn't start device: %d\n", err);
+               close_candev(netdev);
+               return err;
+       }
+
+       dev->open_time = jiffies;
+       netif_start_queue(netdev);
+
+       return 0;
+}
+
+/*
+ * unlink in-flight Rx and Tx urbs and free their memory.
+ */
+static void peak_usb_unlink_all_urbs(struct peak_usb_device *dev)
+{
+       int i;
+
+       /* free all Rx (submitted) urbs */
+       usb_kill_anchored_urbs(&dev->rx_submitted);
+
+       /* free unsubmitted Tx urbs first */
+       for (i = 0; i < PCAN_USB_MAX_TX_URBS; i++) {
+               struct urb *urb = dev->tx_contexts[i].urb;
+
+               if (!urb ||
+                   dev->tx_contexts[i].echo_index != PCAN_USB_MAX_TX_URBS) {
+                       /*
+                        * this urb is already released or always submitted,
+                        * let usb core free by itself
+                        */
+                       continue;
+               }
+
+               usb_free_urb(urb);
+               dev->tx_contexts[i].urb = NULL;
+       }
+
+       /* then free all submitted Tx urbs */
+       usb_kill_anchored_urbs(&dev->tx_submitted);
+       atomic_set(&dev->active_tx_urbs, 0);
+}
+
+/*
+ * called by netdev to close the corresponding CAN interface.
+ */
+static int peak_usb_ndo_stop(struct net_device *netdev)
+{
+       struct peak_usb_device *dev = netdev_priv(netdev);
+
+       dev->state &= ~PCAN_USB_STATE_STARTED;
+       netif_stop_queue(netdev);
+
+       /* unlink all pending urbs and free used memory */
+       peak_usb_unlink_all_urbs(dev);
+
+       if (dev->adapter->dev_stop)
+               dev->adapter->dev_stop(dev);
+
+       close_candev(netdev);
+
+       dev->open_time = 0;
+       dev->can.state = CAN_STATE_STOPPED;
+
+       /* can set bus off now */
+       if (dev->adapter->dev_set_bus) {
+               int err = dev->adapter->dev_set_bus(dev, 0);
+               if (err)
+                       return err;
+       }
+
+       return 0;
+}
+
+/*
+ * handle end of waiting for the device to reset
+ */
+void peak_usb_restart_complete(struct peak_usb_device *dev)
+{
+       /* finally MUST update can state */
+       dev->can.state = CAN_STATE_ERROR_ACTIVE;
+
+       /* netdev queue can be awaken now */
+       netif_wake_queue(dev->netdev);
+}
+
+void peak_usb_async_complete(struct urb *urb)
+{
+       kfree(urb->transfer_buffer);
+       usb_free_urb(urb);
+}
+
+/*
+ * device (auto-)restart mechanism runs in a timer context =>
+ * MUST handle restart with asynchronous usb transfers
+ */
+static int peak_usb_restart(struct peak_usb_device *dev)
+{
+       struct urb *urb;
+       int err;
+       u8 *buf;
+
+       /*
+        * if device doesn't define any asynchronous restart handler, simply
+        * wake the netdev queue up
+        */
+       if (!dev->adapter->dev_restart_async) {
+               peak_usb_restart_complete(dev);
+               return 0;
+       }
+
+       /* first allocate a urb to handle the asynchronous steps */
+       urb = usb_alloc_urb(0, GFP_ATOMIC);
+       if (!urb) {
+               netdev_err(dev->netdev, "no memory left for urb\n");
+               return -ENOMEM;
+       }
+
+       /* also allocate enough space for the commands to send */
+       buf = kmalloc(PCAN_USB_MAX_CMD_LEN, GFP_ATOMIC);
+       if (!buf) {
+               netdev_err(dev->netdev, "no memory left for async cmd\n");
+               usb_free_urb(urb);
+               return -ENOMEM;
+       }
+
+       /* call the device specific handler for the restart */
+       err = dev->adapter->dev_restart_async(dev, urb, buf);
+       if (!err)
+               return 0;
+
+       kfree(buf);
+       usb_free_urb(urb);
+
+       return err;
+}
+
+/*
+ * candev callback used to change CAN mode.
+ * Warning: this is called from a timer context!
+ */
+static int peak_usb_set_mode(struct net_device *netdev, enum can_mode mode)
+{
+       struct peak_usb_device *dev = netdev_priv(netdev);
+       int err = 0;
+
+       if (!dev->open_time)
+               return -EINVAL;
+
+       switch (mode) {
+       case CAN_MODE_START:
+               err = peak_usb_restart(dev);
+               if (err)
+                       netdev_err(netdev, "couldn't start device (err %d)\n",
+                                  err);
+               break;
+
+       default:
+               return -EOPNOTSUPP;
+       }
+
+       return err;
+}
+
+/*
+ * candev callback used to set device bitrate.
+ */
+static int peak_usb_set_bittiming(struct net_device *netdev)
+{
+       struct peak_usb_device *dev = netdev_priv(netdev);
+       struct can_bittiming *bt = &dev->can.bittiming;
+
+       if (dev->adapter->dev_set_bittiming) {
+               int err = dev->adapter->dev_set_bittiming(dev, bt);
+
+               if (err)
+                       netdev_info(netdev, "couldn't set bitrate (err %d)\n",
+                               err);
+               return err;
+       }
+
+       return 0;
+}
+
+static const struct net_device_ops peak_usb_netdev_ops = {
+       .ndo_open = peak_usb_ndo_open,
+       .ndo_stop = peak_usb_ndo_stop,
+       .ndo_start_xmit = peak_usb_ndo_start_xmit,
+};
+
+/*
+ * create one device which is attached to CAN controller #ctrl_idx of the
+ * usb adapter.
+ */
+static int peak_usb_create_dev(struct peak_usb_adapter *peak_usb_adapter,
+                              struct usb_interface *intf, int ctrl_idx)
+{
+       struct usb_device *usb_dev = interface_to_usbdev(intf);
+       int sizeof_candev = peak_usb_adapter->sizeof_dev_private;
+       struct peak_usb_device *dev;
+       struct net_device *netdev;
+       int i, err;
+       u16 tmp16;
+
+       if (sizeof_candev < sizeof(struct peak_usb_device))
+               sizeof_candev = sizeof(struct peak_usb_device);
+
+       netdev = alloc_candev(sizeof_candev, PCAN_USB_MAX_TX_URBS);
+       if (!netdev) {
+               dev_err(&intf->dev, "%s: couldn't alloc candev\n",
+                       PCAN_USB_DRIVER_NAME);
+               return -ENOMEM;
+       }
+
+       dev = netdev_priv(netdev);
+
+       /* allocate a buffer large enough to send commands */
+       dev->cmd_buf = kmalloc(PCAN_USB_MAX_CMD_LEN, GFP_KERNEL);
+       if (!dev->cmd_buf) {
+               dev_err(&intf->dev, "%s: couldn't alloc cmd buffer\n",
+                       PCAN_USB_DRIVER_NAME);
+               err = -ENOMEM;
+               goto lbl_set_intf_data;
+       }
+
+       dev->udev = usb_dev;
+       dev->netdev = netdev;
+       dev->adapter = peak_usb_adapter;
+       dev->ctrl_idx = ctrl_idx;
+       dev->state = PCAN_USB_STATE_CONNECTED;
+
+       dev->ep_msg_in = peak_usb_adapter->ep_msg_in;
+       dev->ep_msg_out = peak_usb_adapter->ep_msg_out[ctrl_idx];
+
+       dev->can.clock = peak_usb_adapter->clock;
+       dev->can.bittiming_const = &peak_usb_adapter->bittiming_const;
+       dev->can.do_set_bittiming = peak_usb_set_bittiming;
+       dev->can.do_set_mode = peak_usb_set_mode;
+       dev->can.ctrlmode_supported = CAN_CTRLMODE_3_SAMPLES |
+                                     CAN_CTRLMODE_LISTENONLY;
+
+       netdev->netdev_ops = &peak_usb_netdev_ops;
+
+       netdev->flags |= IFF_ECHO; /* we support local echo */
+
+       init_usb_anchor(&dev->rx_submitted);
+
+       init_usb_anchor(&dev->tx_submitted);
+       atomic_set(&dev->active_tx_urbs, 0);
+
+       for (i = 0; i < PCAN_USB_MAX_TX_URBS; i++)
+               dev->tx_contexts[i].echo_index = PCAN_USB_MAX_TX_URBS;
+
+       dev->prev_siblings = usb_get_intfdata(intf);
+       usb_set_intfdata(intf, dev);
+
+       SET_NETDEV_DEV(netdev, &intf->dev);
+
+       err = register_candev(netdev);
+       if (err) {
+               dev_err(&intf->dev, "couldn't register CAN device: %d\n", err);
+               goto lbl_free_cmd_buf;
+       }
+
+       if (dev->prev_siblings)
+               (dev->prev_siblings)->next_siblings = dev;
+
+       /* keep hw revision into the netdevice */
+       tmp16 = le16_to_cpu(usb_dev->descriptor.bcdDevice);
+       dev->device_rev = tmp16 >> 8;
+
+       if (dev->adapter->dev_init) {
+               err = dev->adapter->dev_init(dev);
+               if (err)
+                       goto lbl_free_cmd_buf;
+       }
+
+       /* set bus off */
+       if (dev->adapter->dev_set_bus) {
+               err = dev->adapter->dev_set_bus(dev, 0);
+               if (err)
+                       goto lbl_free_cmd_buf;
+       }
+
+       /* get device number early */
+       if (dev->adapter->dev_get_device_id)
+               dev->adapter->dev_get_device_id(dev, &dev->device_number);
+
+       netdev_info(netdev, "attached to %s channel %u (device %u)\n",
+                       peak_usb_adapter->name, ctrl_idx, dev->device_number);
+
+       return 0;
+
+lbl_free_cmd_buf:
+       kfree(dev->cmd_buf);
+
+lbl_set_intf_data:
+       usb_set_intfdata(intf, dev->prev_siblings);
+       free_candev(netdev);
+
+       return err;
+}
+
+/*
+ * called by the usb core when the device is unplugged from the system
+ */
+static void peak_usb_disconnect(struct usb_interface *intf)
+{
+       struct peak_usb_device *dev;
+
+       /* unregister as many netdev devices as siblings */
+       for (dev = usb_get_intfdata(intf); dev; dev = dev->prev_siblings) {
+               struct net_device *netdev = dev->netdev;
+               char name[IFNAMSIZ];
+
+               dev->state &= ~PCAN_USB_STATE_CONNECTED;
+               strncpy(name, netdev->name, IFNAMSIZ);
+
+               unregister_netdev(netdev);
+               free_candev(netdev);
+
+               kfree(dev->cmd_buf);
+               dev->next_siblings = NULL;
+               if (dev->adapter->dev_free)
+                       dev->adapter->dev_free(dev);
+
+               dev_info(&intf->dev, "%s removed\n", name);
+       }
+
+       usb_set_intfdata(intf, NULL);
+}
+
+/*
+ * probe function for new PEAK-System devices
+ */
+static int peak_usb_probe(struct usb_interface *intf,
+                         const struct usb_device_id *id)
+{
+       struct usb_device *usb_dev = interface_to_usbdev(intf);
+       struct peak_usb_adapter *peak_usb_adapter, **pp;
+       int i, err = -ENOMEM;
+
+       usb_dev = interface_to_usbdev(intf);
+
+       /* get corresponding PCAN-USB adapter */
+       for (pp = peak_usb_adapters_list; *pp; pp++)
+               if ((*pp)->device_id == usb_dev->descriptor.idProduct)
+                       break;
+
+       peak_usb_adapter = *pp;
+       if (!peak_usb_adapter) {
+               /* should never come except device_id bad usage in this file */
+               pr_err("%s: didn't find device id. 0x%x in devices list\n",
+                       PCAN_USB_DRIVER_NAME, usb_dev->descriptor.idProduct);
+               return -ENODEV;
+       }
+
+       /* got corresponding adapter: check if it handles current interface */
+       if (peak_usb_adapter->intf_probe) {
+               err = peak_usb_adapter->intf_probe(intf);
+               if (err)
+                       return err;
+       }
+
+       for (i = 0; i < peak_usb_adapter->ctrl_count; i++) {
+               err = peak_usb_create_dev(peak_usb_adapter, intf, i);
+               if (err) {
+                       /* deregister already created devices */
+                       peak_usb_disconnect(intf);
+                       break;
+               }
+       }
+
+       return err;
+}
+
+/* usb specific object needed to register this driver with the usb subsystem */
+static struct usb_driver peak_usb_driver = {
+       .name = PCAN_USB_DRIVER_NAME,
+       .disconnect = peak_usb_disconnect,
+       .probe = peak_usb_probe,
+       .id_table = peak_usb_table,
+};
+
+static int __init peak_usb_init(void)
+{
+       int err;
+
+       /* register this driver with the USB subsystem */
+       err = usb_register(&peak_usb_driver);
+       if (err)
+               pr_err("%s: usb_register failed (err %d)\n",
+                       PCAN_USB_DRIVER_NAME, err);
+
+       return err;
+}
+
+static int peak_usb_do_device_exit(struct device *d, void *arg)
+{
+       struct usb_interface *intf = to_usb_interface(d);
+       struct peak_usb_device *dev;
+
+       /* stop as many netdev devices as siblings */
+       for (dev = usb_get_intfdata(intf); dev; dev = dev->prev_siblings) {
+               struct net_device *netdev = dev->netdev;
+
+               if (netif_device_present(netdev))
+                       if (dev->adapter->dev_exit)
+                               dev->adapter->dev_exit(dev);
+       }
+
+       return 0;
+}
+
+static void __exit peak_usb_exit(void)
+{
+       int err;
+
+       /* last chance do send any synchronous commands here */
+       err = driver_for_each_device(&peak_usb_driver.drvwrap.driver, NULL,
+                                    NULL, peak_usb_do_device_exit);
+       if (err)
+               pr_err("%s: failed to stop all can devices (err %d)\n",
+                       PCAN_USB_DRIVER_NAME, err);
+
+       /* deregister this driver with the USB subsystem */
+       usb_deregister(&peak_usb_driver);
+
+       pr_info("%s: PCAN-USB interfaces driver unloaded\n",
+               PCAN_USB_DRIVER_NAME);
+}
+
+module_init(peak_usb_init);
+module_exit(peak_usb_exit);
diff --git a/drivers/net/can/usb/peak_usb/pcan_usb_core.h b/drivers/net/can/usb/peak_usb/pcan_usb_core.h
new file mode 100644 (file)
index 0000000..a948c5a
--- /dev/null
@@ -0,0 +1,146 @@
+/*
+ * CAN driver for PEAK System USB adapters
+ * Derived from the PCAN project file driver/src/pcan_usb_core.c
+ *
+ * Copyright (C) 2003-2010 PEAK System-Technik GmbH
+ * Copyright (C) 2010-2012 Stephane Grosjean <s.grosjean@peak-system.com>
+ *
+ * Many thanks to Klaus Hitschler <klaus.hitschler@gmx.de>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published
+ * by the Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ */
+#ifndef PCAN_USB_CORE_H
+#define PCAN_USB_CORE_H
+
+/* PEAK-System vendor id. */
+#define PCAN_USB_VENDOR_ID             0x0c72
+
+/* supported device ids. */
+#define PCAN_USB_PRODUCT_ID            0x000c
+#define PCAN_USBPRO_PRODUCT_ID         0x000d
+
+#define PCAN_USB_DRIVER_NAME           "peak_usb"
+
+/* number of urbs that are submitted for rx/tx per channel */
+#define PCAN_USB_MAX_RX_URBS           4
+#define PCAN_USB_MAX_TX_URBS           10
+
+/* usb adapters maximum channels per usb interface */
+#define PCAN_USB_MAX_CHANNEL           2
+
+/* maximum length of the usb commands sent to/received from  the devices */
+#define PCAN_USB_MAX_CMD_LEN           32
+
+struct peak_usb_device;
+
+/* PEAK-System USB adapter descriptor */
+struct peak_usb_adapter {
+       char *name;
+       u32 device_id;
+       struct can_clock clock;
+       struct can_bittiming_const bittiming_const;
+       unsigned int ctrl_count;
+
+       int (*intf_probe)(struct usb_interface *intf);
+
+       int (*dev_init)(struct peak_usb_device *dev);
+       void (*dev_exit)(struct peak_usb_device *dev);
+       void (*dev_free)(struct peak_usb_device *dev);
+       int (*dev_open)(struct peak_usb_device *dev);
+       int (*dev_close)(struct peak_usb_device *dev);
+       int (*dev_set_bittiming)(struct peak_usb_device *dev,
+                                       struct can_bittiming *bt);
+       int (*dev_set_bus)(struct peak_usb_device *dev, u8 onoff);
+       int (*dev_get_device_id)(struct peak_usb_device *dev, u32 *device_id);
+       int (*dev_decode_buf)(struct peak_usb_device *dev, struct urb *urb);
+       int (*dev_encode_msg)(struct peak_usb_device *dev, struct sk_buff *skb,
+                                       u8 *obuf, size_t *size);
+       int (*dev_start)(struct peak_usb_device *dev);
+       int (*dev_stop)(struct peak_usb_device *dev);
+       int (*dev_restart_async)(struct peak_usb_device *dev, struct urb *urb,
+                                       u8 *buf);
+       u8 ep_msg_in;
+       u8 ep_msg_out[PCAN_USB_MAX_CHANNEL];
+       u8 ts_used_bits;
+       u32 ts_period;
+       u8 us_per_ts_shift;
+       u32 us_per_ts_scale;
+
+       int rx_buffer_size;
+       int tx_buffer_size;
+       int sizeof_dev_private;
+};
+
+extern struct peak_usb_adapter pcan_usb;
+extern struct peak_usb_adapter pcan_usb_pro;
+
+struct peak_time_ref {
+       struct timeval tv_host_0, tv_host;
+       u32 ts_dev_1, ts_dev_2;
+       u64 ts_total;
+       u32 tick_count;
+       struct peak_usb_adapter *adapter;
+};
+
+struct peak_tx_urb_context {
+       struct peak_usb_device *dev;
+       u32 echo_index;
+       u8 dlc;
+       struct urb *urb;
+};
+
+#define PCAN_USB_STATE_CONNECTED       0x00000001
+#define PCAN_USB_STATE_STARTED         0x00000002
+
+/* PEAK-System USB device */
+struct peak_usb_device {
+       struct can_priv can;
+       struct peak_usb_adapter *adapter;
+       unsigned int ctrl_idx;
+       int open_time;
+       u32 state;
+
+       struct sk_buff *echo_skb[PCAN_USB_MAX_TX_URBS];
+
+       struct usb_device *udev;
+       struct net_device *netdev;
+
+       atomic_t active_tx_urbs;
+       struct usb_anchor tx_submitted;
+       struct peak_tx_urb_context tx_contexts[PCAN_USB_MAX_TX_URBS];
+
+       u8 *cmd_buf;
+       struct usb_anchor rx_submitted;
+
+       u32 device_number;
+       u8 device_rev;
+
+       u8 ep_msg_in;
+       u8 ep_msg_out;
+
+       u16 bus_load;
+
+       struct peak_usb_device *prev_siblings;
+       struct peak_usb_device *next_siblings;
+};
+
+void dump_mem(char *prompt, void *p, int l);
+
+/* common timestamp management */
+void peak_usb_init_time_ref(struct peak_time_ref *time_ref,
+                           struct peak_usb_adapter *adapter);
+void peak_usb_update_ts_now(struct peak_time_ref *time_ref, u32 ts_now);
+void peak_usb_set_ts_now(struct peak_time_ref *time_ref, u32 ts_now);
+void peak_usb_get_ts_tv(struct peak_time_ref *time_ref, u32 ts,
+                       struct timeval *tv);
+
+void peak_usb_async_complete(struct urb *urb);
+void peak_usb_restart_complete(struct peak_usb_device *dev);
+#endif
diff --git a/drivers/net/can/usb/peak_usb/pcan_usb_pro.c b/drivers/net/can/usb/peak_usb/pcan_usb_pro.c
new file mode 100644 (file)
index 0000000..5234586
--- /dev/null
@@ -0,0 +1,1036 @@
+/*
+ * CAN driver for PEAK System PCAN-USB Pro adapter
+ * Derived from the PCAN project file driver/src/pcan_usbpro.c
+ *
+ * Copyright (C) 2003-2011 PEAK System-Technik GmbH
+ * Copyright (C) 2011-2012 Stephane Grosjean <s.grosjean@peak-system.com>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published
+ * by the Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ */
+#include <linux/netdevice.h>
+#include <linux/usb.h>
+#include <linux/module.h>
+
+#include <linux/can.h>
+#include <linux/can/dev.h>
+#include <linux/can/error.h>
+
+#include "pcan_usb_core.h"
+#include "pcan_usb_pro.h"
+
+MODULE_SUPPORTED_DEVICE("PEAK-System PCAN-USB Pro adapter");
+
+/* PCAN-USB Pro Endpoints */
+#define PCAN_USBPRO_EP_CMDOUT          1
+#define PCAN_USBPRO_EP_CMDIN           (PCAN_USBPRO_EP_CMDOUT | USB_DIR_IN)
+#define PCAN_USBPRO_EP_MSGOUT_0                2
+#define PCAN_USBPRO_EP_MSGIN           (PCAN_USBPRO_EP_MSGOUT_0 | USB_DIR_IN)
+#define PCAN_USBPRO_EP_MSGOUT_1                3
+#define PCAN_USBPRO_EP_UNUSED          (PCAN_USBPRO_EP_MSGOUT_1 | USB_DIR_IN)
+
+#define PCAN_USBPRO_CHANNEL_COUNT      2
+
+/* PCAN-USB Pro adapter internal clock (MHz) */
+#define PCAN_USBPRO_CRYSTAL_HZ         56000000
+
+/* PCAN-USB Pro command timeout (ms.) */
+#define PCAN_USBPRO_COMMAND_TIMEOUT    1000
+
+/* PCAN-USB Pro rx/tx buffers size */
+#define PCAN_USBPRO_RX_BUFFER_SIZE     1024
+#define PCAN_USBPRO_TX_BUFFER_SIZE     64
+
+#define PCAN_USBPRO_MSG_HEADER_LEN     4
+
+/* some commands responses need to be re-submitted */
+#define PCAN_USBPRO_RSP_SUBMIT_MAX     2
+
+#define PCAN_USBPRO_RTR                        0x01
+#define PCAN_USBPRO_EXT                        0x02
+
+#define PCAN_USBPRO_CMD_BUFFER_SIZE    512
+
+/* handle device specific info used by the netdevices */
+struct pcan_usb_pro_interface {
+       struct peak_usb_device *dev[PCAN_USBPRO_CHANNEL_COUNT];
+       struct peak_time_ref time_ref;
+       int cm_ignore_count;
+       int dev_opened_count;
+};
+
+/* device information */
+struct pcan_usb_pro_device {
+       struct peak_usb_device dev;
+       struct pcan_usb_pro_interface *usb_if;
+       u32 cached_ccbt;
+};
+
+/* internal structure used to handle messages sent to bulk urb */
+struct pcan_usb_pro_msg {
+       u8 *rec_ptr;
+       int rec_buffer_size;
+       int rec_buffer_len;
+       union {
+               u16 *rec_cnt_rd;
+               u32 *rec_cnt;
+               u8 *rec_buffer;
+       } u;
+};
+
+/* records sizes table indexed on message id. (8-bits value) */
+static u16 pcan_usb_pro_sizeof_rec[256] = {
+       [PCAN_USBPRO_SETBTR] = sizeof(struct pcan_usb_pro_btr),
+       [PCAN_USBPRO_SETBUSACT] = sizeof(struct pcan_usb_pro_busact),
+       [PCAN_USBPRO_SETSILENT] = sizeof(struct pcan_usb_pro_silent),
+       [PCAN_USBPRO_SETFILTR] = sizeof(struct pcan_usb_pro_filter),
+       [PCAN_USBPRO_SETTS] = sizeof(struct pcan_usb_pro_setts),
+       [PCAN_USBPRO_GETDEVID] = sizeof(struct pcan_usb_pro_devid),
+       [PCAN_USBPRO_SETLED] = sizeof(struct pcan_usb_pro_setled),
+       [PCAN_USBPRO_RXMSG8] = sizeof(struct pcan_usb_pro_rxmsg),
+       [PCAN_USBPRO_RXMSG4] = sizeof(struct pcan_usb_pro_rxmsg) - 4,
+       [PCAN_USBPRO_RXMSG0] = sizeof(struct pcan_usb_pro_rxmsg) - 8,
+       [PCAN_USBPRO_RXRTR] = sizeof(struct pcan_usb_pro_rxmsg) - 8,
+       [PCAN_USBPRO_RXSTATUS] = sizeof(struct pcan_usb_pro_rxstatus),
+       [PCAN_USBPRO_RXTS] = sizeof(struct pcan_usb_pro_rxts),
+       [PCAN_USBPRO_TXMSG8] = sizeof(struct pcan_usb_pro_txmsg),
+       [PCAN_USBPRO_TXMSG4] = sizeof(struct pcan_usb_pro_txmsg) - 4,
+       [PCAN_USBPRO_TXMSG0] = sizeof(struct pcan_usb_pro_txmsg) - 8,
+};
+
+/*
+ * initialize PCAN-USB Pro message data structure
+ */
+static u8 *pcan_msg_init(struct pcan_usb_pro_msg *pm, void *buffer_addr,
+                        int buffer_size)
+{
+       if (buffer_size < PCAN_USBPRO_MSG_HEADER_LEN)
+               return NULL;
+
+       pm->u.rec_buffer = (u8 *)buffer_addr;
+       pm->rec_buffer_size = pm->rec_buffer_len = buffer_size;
+       pm->rec_ptr = pm->u.rec_buffer + PCAN_USBPRO_MSG_HEADER_LEN;
+
+       return pm->rec_ptr;
+}
+
+static u8 *pcan_msg_init_empty(struct pcan_usb_pro_msg *pm,
+                              void *buffer_addr, int buffer_size)
+{
+       u8 *pr = pcan_msg_init(pm, buffer_addr, buffer_size);
+
+       if (pr) {
+               pm->rec_buffer_len = PCAN_USBPRO_MSG_HEADER_LEN;
+               *pm->u.rec_cnt = 0;
+       }
+       return pr;
+}
+
+/*
+ * add one record to a message being built
+ */
+static int pcan_msg_add_rec(struct pcan_usb_pro_msg *pm, u8 id, ...)
+{
+       int len, i;
+       u8 *pc;
+       va_list ap;
+
+       va_start(ap, id);
+
+       pc = pm->rec_ptr + 1;
+
+       i = 0;
+       switch (id) {
+       case PCAN_USBPRO_TXMSG8:
+               i += 4;
+       case PCAN_USBPRO_TXMSG4:
+               i += 4;
+       case PCAN_USBPRO_TXMSG0:
+               *pc++ = va_arg(ap, int);
+               *pc++ = va_arg(ap, int);
+               *pc++ = va_arg(ap, int);
+               *(u32 *)pc = cpu_to_le32(va_arg(ap, u32));
+               pc += 4;
+               memcpy(pc, va_arg(ap, int *), i);
+               pc += i;
+               break;
+
+       case PCAN_USBPRO_SETBTR:
+       case PCAN_USBPRO_GETDEVID:
+               *pc++ = va_arg(ap, int);
+               pc += 2;
+               *(u32 *)pc = cpu_to_le32(va_arg(ap, u32));
+               pc += 4;
+               break;
+
+       case PCAN_USBPRO_SETFILTR:
+       case PCAN_USBPRO_SETBUSACT:
+       case PCAN_USBPRO_SETSILENT:
+               *pc++ = va_arg(ap, int);
+               *(u16 *)pc = cpu_to_le16(va_arg(ap, int));
+               pc += 2;
+               break;
+
+       case PCAN_USBPRO_SETLED:
+               *pc++ = va_arg(ap, int);
+               *(u16 *)pc = cpu_to_le16(va_arg(ap, int));
+               pc += 2;
+               *(u32 *)pc = cpu_to_le32(va_arg(ap, u32));
+               pc += 4;
+               break;
+
+       case PCAN_USBPRO_SETTS:
+               pc++;
+               *(u16 *)pc = cpu_to_le16(va_arg(ap, int));
+               pc += 2;
+               break;
+
+       default:
+               pr_err("%s: %s(): unknown data type %02Xh (%d)\n",
+                       PCAN_USB_DRIVER_NAME, __func__, id, id);
+               pc--;
+               break;
+       }
+
+       len = pc - pm->rec_ptr;
+       if (len > 0) {
+               *pm->u.rec_cnt = cpu_to_le32(*pm->u.rec_cnt+1);
+               *pm->rec_ptr = id;
+
+               pm->rec_ptr = pc;
+               pm->rec_buffer_len += len;
+       }
+
+       va_end(ap);
+
+       return len;
+}
+
+/*
+ * send PCAN-USB Pro command synchronously
+ */
+static int pcan_usb_pro_send_cmd(struct peak_usb_device *dev,
+                                struct pcan_usb_pro_msg *pum)
+{
+       int actual_length;
+       int err;
+
+       /* usb device unregistered? */
+       if (!(dev->state & PCAN_USB_STATE_CONNECTED))
+               return 0;
+
+       err = usb_bulk_msg(dev->udev,
+               usb_sndbulkpipe(dev->udev, PCAN_USBPRO_EP_CMDOUT),
+               pum->u.rec_buffer, pum->rec_buffer_len,
+               &actual_length, PCAN_USBPRO_COMMAND_TIMEOUT);
+       if (err)
+               netdev_err(dev->netdev, "sending command failure: %d\n", err);
+
+       return err;
+}
+
+/*
+ * wait for PCAN-USB Pro command response
+ */
+static int pcan_usb_pro_wait_rsp(struct peak_usb_device *dev,
+                                struct pcan_usb_pro_msg *pum)
+{
+       u8 req_data_type, req_channel;
+       int actual_length;
+       int i, err = 0;
+
+       /* usb device unregistered? */
+       if (!(dev->state & PCAN_USB_STATE_CONNECTED))
+               return 0;
+
+       req_data_type = pum->u.rec_buffer[4];
+       req_channel = pum->u.rec_buffer[5];
+
+       *pum->u.rec_cnt = 0;
+       for (i = 0; !err && i < PCAN_USBPRO_RSP_SUBMIT_MAX; i++) {
+               struct pcan_usb_pro_msg rsp;
+               union pcan_usb_pro_rec *pr;
+               u32 r, rec_cnt;
+               u16 rec_len;
+               u8 *pc;
+
+               err = usb_bulk_msg(dev->udev,
+                       usb_rcvbulkpipe(dev->udev, PCAN_USBPRO_EP_CMDIN),
+                       pum->u.rec_buffer, pum->rec_buffer_len,
+                       &actual_length, PCAN_USBPRO_COMMAND_TIMEOUT);
+               if (err) {
+                       netdev_err(dev->netdev, "waiting rsp error %d\n", err);
+                       break;
+               }
+
+               if (actual_length == 0)
+                       continue;
+
+               err = -EBADMSG;
+               if (actual_length < PCAN_USBPRO_MSG_HEADER_LEN) {
+                       netdev_err(dev->netdev,
+                                  "got abnormal too small rsp (len=%d)\n",
+                                  actual_length);
+                       break;
+               }
+
+               pc = pcan_msg_init(&rsp, pum->u.rec_buffer,
+                       actual_length);
+
+               rec_cnt = le32_to_cpu(*rsp.u.rec_cnt);
+
+               /* loop on records stored into message */
+               for (r = 0; r < rec_cnt; r++) {
+                       pr = (union pcan_usb_pro_rec *)pc;
+                       rec_len = pcan_usb_pro_sizeof_rec[pr->data_type];
+                       if (!rec_len) {
+                               netdev_err(dev->netdev,
+                                          "got unprocessed record in msg\n");
+                               dump_mem("rcvd rsp msg", pum->u.rec_buffer,
+                                        actual_length);
+                               break;
+                       }
+
+                       /* check if response corresponds to request */
+                       if (pr->data_type != req_data_type)
+                               netdev_err(dev->netdev,
+                                          "got unwanted rsp %xh: ignored\n",
+                                          pr->data_type);
+
+                       /* check if channel in response corresponds too */
+                       else if ((req_channel != 0xff) && \
+                               (pr->bus_act.channel != req_channel))
+                               netdev_err(dev->netdev,
+                                       "got rsp %xh but on chan%u: ignored\n",
+                                       req_data_type, pr->bus_act.channel);
+
+                       /* got the response */
+                       else
+                               return 0;
+
+                       /* otherwise, go on with next record in message */
+                       pc += rec_len;
+               }
+       }
+
+       return (i >= PCAN_USBPRO_RSP_SUBMIT_MAX) ? -ERANGE : err;
+}
+
+static int pcan_usb_pro_send_req(struct peak_usb_device *dev, int req_id,
+                                int req_value, void *req_addr, int req_size)
+{
+       int err;
+       u8 req_type;
+       unsigned int p;
+
+       /* usb device unregistered? */
+       if (!(dev->state & PCAN_USB_STATE_CONNECTED))
+               return 0;
+
+       memset(req_addr, '\0', req_size);
+
+       req_type = USB_TYPE_VENDOR | USB_RECIP_OTHER;
+
+       switch (req_id) {
+       case PCAN_USBPRO_REQ_FCT:
+               p = usb_sndctrlpipe(dev->udev, 0);
+               break;
+
+       default:
+               p = usb_rcvctrlpipe(dev->udev, 0);
+               req_type |= USB_DIR_IN;
+               break;
+       }
+
+       err = usb_control_msg(dev->udev, p, req_id, req_type, req_value, 0,
+                             req_addr, req_size, 2 * USB_CTRL_GET_TIMEOUT);
+       if (err < 0) {
+               netdev_info(dev->netdev,
+                           "unable to request usb[type=%d value=%d] err=%d\n",
+                           req_id, req_value, err);
+               return err;
+       }
+
+       return 0;
+}
+
+static int pcan_usb_pro_set_ts(struct peak_usb_device *dev, u16 onoff)
+{
+       struct pcan_usb_pro_msg um;
+
+       pcan_msg_init_empty(&um, dev->cmd_buf, PCAN_USB_MAX_CMD_LEN);
+       pcan_msg_add_rec(&um, PCAN_USBPRO_SETTS, onoff);
+
+       return pcan_usb_pro_send_cmd(dev, &um);
+}
+
+static int pcan_usb_pro_set_bitrate(struct peak_usb_device *dev, u32 ccbt)
+{
+       struct pcan_usb_pro_device *pdev =
+                       container_of(dev, struct pcan_usb_pro_device, dev);
+       struct pcan_usb_pro_msg um;
+
+       pcan_msg_init_empty(&um, dev->cmd_buf, PCAN_USB_MAX_CMD_LEN);
+       pcan_msg_add_rec(&um, PCAN_USBPRO_SETBTR, dev->ctrl_idx, ccbt);
+
+       /* cache the CCBT value to reuse it before next buson */
+       pdev->cached_ccbt = ccbt;
+
+       return pcan_usb_pro_send_cmd(dev, &um);
+}
+
+static int pcan_usb_pro_set_bus(struct peak_usb_device *dev, u8 onoff)
+{
+       struct pcan_usb_pro_msg um;
+
+       /* if bus=on, be sure the bitrate being set before! */
+       if (onoff) {
+               struct pcan_usb_pro_device *pdev =
+                            container_of(dev, struct pcan_usb_pro_device, dev);
+
+               pcan_usb_pro_set_bitrate(dev, pdev->cached_ccbt);
+       }
+
+       pcan_msg_init_empty(&um, dev->cmd_buf, PCAN_USB_MAX_CMD_LEN);
+       pcan_msg_add_rec(&um, PCAN_USBPRO_SETBUSACT, dev->ctrl_idx, onoff);
+
+       return pcan_usb_pro_send_cmd(dev, &um);
+}
+
+static int pcan_usb_pro_set_silent(struct peak_usb_device *dev, u8 onoff)
+{
+       struct pcan_usb_pro_msg um;
+
+       pcan_msg_init_empty(&um, dev->cmd_buf, PCAN_USB_MAX_CMD_LEN);
+       pcan_msg_add_rec(&um, PCAN_USBPRO_SETSILENT, dev->ctrl_idx, onoff);
+
+       return pcan_usb_pro_send_cmd(dev, &um);
+}
+
+static int pcan_usb_pro_set_filter(struct peak_usb_device *dev, u16 filter_mode)
+{
+       struct pcan_usb_pro_msg um;
+
+       pcan_msg_init_empty(&um, dev->cmd_buf, PCAN_USB_MAX_CMD_LEN);
+       pcan_msg_add_rec(&um, PCAN_USBPRO_SETFILTR, dev->ctrl_idx, filter_mode);
+
+       return pcan_usb_pro_send_cmd(dev, &um);
+}
+
+static int pcan_usb_pro_set_led(struct peak_usb_device *dev, u8 mode,
+                               u32 timeout)
+{
+       struct pcan_usb_pro_msg um;
+
+       pcan_msg_init_empty(&um, dev->cmd_buf, PCAN_USB_MAX_CMD_LEN);
+       pcan_msg_add_rec(&um, PCAN_USBPRO_SETLED, dev->ctrl_idx, mode, timeout);
+
+       return pcan_usb_pro_send_cmd(dev, &um);
+}
+
+static int pcan_usb_pro_get_device_id(struct peak_usb_device *dev,
+                                     u32 *device_id)
+{
+       struct pcan_usb_pro_devid *pdn;
+       struct pcan_usb_pro_msg um;
+       int err;
+       u8 *pc;
+
+       pc = pcan_msg_init_empty(&um, dev->cmd_buf, PCAN_USB_MAX_CMD_LEN);
+       pcan_msg_add_rec(&um, PCAN_USBPRO_GETDEVID, dev->ctrl_idx);
+
+       err =  pcan_usb_pro_send_cmd(dev, &um);
+       if (err)
+               return err;
+
+       err = pcan_usb_pro_wait_rsp(dev, &um);
+       if (err)
+               return err;
+
+       pdn = (struct pcan_usb_pro_devid *)pc;
+       if (device_id)
+               *device_id = le32_to_cpu(pdn->serial_num);
+
+       return err;
+}
+
+static int pcan_usb_pro_set_bittiming(struct peak_usb_device *dev,
+                                     struct can_bittiming *bt)
+{
+       u32 ccbt;
+
+       ccbt = (dev->can.ctrlmode & CAN_CTRLMODE_3_SAMPLES) ? 0x00800000 : 0;
+       ccbt |= (bt->sjw - 1) << 24;
+       ccbt |= (bt->phase_seg2 - 1) << 20;
+       ccbt |= (bt->prop_seg + bt->phase_seg1 - 1) << 16; /* = tseg1 */
+       ccbt |= bt->brp - 1;
+
+       netdev_info(dev->netdev, "setting ccbt=0x%08x\n", ccbt);
+
+       return pcan_usb_pro_set_bitrate(dev, ccbt);
+}
+
+static void pcan_usb_pro_restart_complete(struct urb *urb)
+{
+       /* can delete usb resources */
+       peak_usb_async_complete(urb);
+
+       /* notify candev and netdev */
+       peak_usb_restart_complete(urb->context);
+}
+
+/*
+ * handle restart but in asynchronously way
+ */
+static int pcan_usb_pro_restart_async(struct peak_usb_device *dev,
+                                     struct urb *urb, u8 *buf)
+{
+       struct pcan_usb_pro_msg um;
+
+       pcan_msg_init_empty(&um, buf, PCAN_USB_MAX_CMD_LEN);
+       pcan_msg_add_rec(&um, PCAN_USBPRO_SETBUSACT, dev->ctrl_idx, 1);
+
+       usb_fill_bulk_urb(urb, dev->udev,
+                       usb_sndbulkpipe(dev->udev, PCAN_USBPRO_EP_CMDOUT),
+                       buf, PCAN_USB_MAX_CMD_LEN,
+                       pcan_usb_pro_restart_complete, dev);
+
+       return usb_submit_urb(urb, GFP_ATOMIC);
+}
+
+static void pcan_usb_pro_drv_loaded(struct peak_usb_device *dev, int loaded)
+{
+       u8 buffer[16];
+
+       buffer[0] = 0;
+       buffer[1] = !!loaded;
+
+       pcan_usb_pro_send_req(dev, PCAN_USBPRO_REQ_FCT,
+                             PCAN_USBPRO_FCT_DRVLD, buffer, sizeof(buffer));
+}
+
+static inline
+struct pcan_usb_pro_interface *pcan_usb_pro_dev_if(struct peak_usb_device *dev)
+{
+       struct pcan_usb_pro_device *pdev =
+                       container_of(dev, struct pcan_usb_pro_device, dev);
+       return pdev->usb_if;
+}
+
+static int pcan_usb_pro_handle_canmsg(struct pcan_usb_pro_interface *usb_if,
+                                     struct pcan_usb_pro_rxmsg *rx)
+{
+       const unsigned int ctrl_idx = (rx->len >> 4) & 0x0f;
+       struct peak_usb_device *dev = usb_if->dev[ctrl_idx];
+       struct net_device *netdev = dev->netdev;
+       struct can_frame *can_frame;
+       struct sk_buff *skb;
+       struct timeval tv;
+
+       skb = alloc_can_skb(netdev, &can_frame);
+       if (!skb)
+               return -ENOMEM;
+
+       can_frame->can_id = le32_to_cpu(rx->id);
+       can_frame->can_dlc = rx->len & 0x0f;
+
+       if (rx->flags & PCAN_USBPRO_EXT)
+               can_frame->can_id |= CAN_EFF_FLAG;
+
+       if (rx->flags & PCAN_USBPRO_RTR)
+               can_frame->can_id |= CAN_RTR_FLAG;
+       else
+               memcpy(can_frame->data, rx->data, can_frame->can_dlc);
+
+       peak_usb_get_ts_tv(&usb_if->time_ref, le32_to_cpu(rx->ts32), &tv);
+       skb->tstamp = timeval_to_ktime(tv);
+
+       netif_rx(skb);
+       netdev->stats.rx_packets++;
+       netdev->stats.rx_bytes += can_frame->can_dlc;
+
+       return 0;
+}
+
+static int pcan_usb_pro_handle_error(struct pcan_usb_pro_interface *usb_if,
+                                    struct pcan_usb_pro_rxstatus *er)
+{
+       const u32 raw_status = le32_to_cpu(er->status);
+       const unsigned int ctrl_idx = (er->channel >> 4) & 0x0f;
+       struct peak_usb_device *dev = usb_if->dev[ctrl_idx];
+       struct net_device *netdev = dev->netdev;
+       struct can_frame *can_frame;
+       enum can_state new_state = CAN_STATE_ERROR_ACTIVE;
+       u8 err_mask = 0;
+       struct sk_buff *skb;
+       struct timeval tv;
+
+       /* nothing should be sent while in BUS_OFF state */
+       if (dev->can.state == CAN_STATE_BUS_OFF)
+               return 0;
+
+       if (!raw_status) {
+               /* no error bit (back to active state) */
+               dev->can.state = CAN_STATE_ERROR_ACTIVE;
+               return 0;
+       }
+
+       if (raw_status & (PCAN_USBPRO_STATUS_OVERRUN |
+                         PCAN_USBPRO_STATUS_QOVERRUN)) {
+               /* trick to bypass next comparison and process other errors */
+               new_state = CAN_STATE_MAX;
+       }
+
+       if (raw_status & PCAN_USBPRO_STATUS_BUS) {
+               new_state = CAN_STATE_BUS_OFF;
+       } else if (raw_status & PCAN_USBPRO_STATUS_ERROR) {
+               u32 rx_err_cnt = (le32_to_cpu(er->err_frm) & 0x00ff0000) >> 16;
+               u32 tx_err_cnt = (le32_to_cpu(er->err_frm) & 0xff000000) >> 24;
+
+               if (rx_err_cnt > 127)
+                       err_mask |= CAN_ERR_CRTL_RX_PASSIVE;
+               else if (rx_err_cnt > 96)
+                       err_mask |= CAN_ERR_CRTL_RX_WARNING;
+
+               if (tx_err_cnt > 127)
+                       err_mask |= CAN_ERR_CRTL_TX_PASSIVE;
+               else if (tx_err_cnt > 96)
+                       err_mask |= CAN_ERR_CRTL_TX_WARNING;
+
+               if (err_mask & (CAN_ERR_CRTL_RX_WARNING |
+                               CAN_ERR_CRTL_TX_WARNING))
+                       new_state = CAN_STATE_ERROR_WARNING;
+               else if (err_mask & (CAN_ERR_CRTL_RX_PASSIVE |
+                                    CAN_ERR_CRTL_TX_PASSIVE))
+                       new_state = CAN_STATE_ERROR_PASSIVE;
+       }
+
+       /* donot post any error if current state didn't change */
+       if (dev->can.state == new_state)
+               return 0;
+
+       /* allocate an skb to store the error frame */
+       skb = alloc_can_err_skb(netdev, &can_frame);
+       if (!skb)
+               return -ENOMEM;
+
+       switch (new_state) {
+       case CAN_STATE_BUS_OFF:
+               can_frame->can_id |= CAN_ERR_BUSOFF;
+               can_bus_off(netdev);
+               break;
+
+       case CAN_STATE_ERROR_PASSIVE:
+               can_frame->can_id |= CAN_ERR_CRTL;
+               can_frame->data[1] |= err_mask;
+               dev->can.can_stats.error_passive++;
+               break;
+
+       case CAN_STATE_ERROR_WARNING:
+               can_frame->can_id |= CAN_ERR_CRTL;
+               can_frame->data[1] |= err_mask;
+               dev->can.can_stats.error_warning++;
+               break;
+
+       case CAN_STATE_ERROR_ACTIVE:
+               break;
+
+       default:
+               /* CAN_STATE_MAX (trick to handle other errors) */
+               if (raw_status & PCAN_USBPRO_STATUS_OVERRUN) {
+                       can_frame->can_id |= CAN_ERR_PROT;
+                       can_frame->data[2] |= CAN_ERR_PROT_OVERLOAD;
+                       netdev->stats.rx_over_errors++;
+                       netdev->stats.rx_errors++;
+               }
+
+               if (raw_status & PCAN_USBPRO_STATUS_QOVERRUN) {
+                       can_frame->can_id |= CAN_ERR_CRTL;
+                       can_frame->data[1] |= CAN_ERR_CRTL_RX_OVERFLOW;
+                       netdev->stats.rx_over_errors++;
+                       netdev->stats.rx_errors++;
+               }
+
+               new_state = CAN_STATE_ERROR_ACTIVE;
+               break;
+       }
+
+       dev->can.state = new_state;
+
+       peak_usb_get_ts_tv(&usb_if->time_ref, le32_to_cpu(er->ts32), &tv);
+       skb->tstamp = timeval_to_ktime(tv);
+       netif_rx(skb);
+       netdev->stats.rx_packets++;
+       netdev->stats.rx_bytes += can_frame->can_dlc;
+
+       return 0;
+}
+
+static void pcan_usb_pro_handle_ts(struct pcan_usb_pro_interface *usb_if,
+                                  struct pcan_usb_pro_rxts *ts)
+{
+       /* should wait until clock is stabilized */
+       if (usb_if->cm_ignore_count > 0)
+               usb_if->cm_ignore_count--;
+       else
+               peak_usb_set_ts_now(&usb_if->time_ref,
+                                   le32_to_cpu(ts->ts64[1]));
+}
+
+/*
+ * callback for bulk IN urb
+ */
+static int pcan_usb_pro_decode_buf(struct peak_usb_device *dev, struct urb *urb)
+{
+       struct pcan_usb_pro_interface *usb_if = pcan_usb_pro_dev_if(dev);
+       struct net_device *netdev = dev->netdev;
+       struct pcan_usb_pro_msg usb_msg;
+       u8 *rec_ptr, *msg_end;
+       u16 rec_cnt;
+       int err = 0;
+
+       rec_ptr = pcan_msg_init(&usb_msg, urb->transfer_buffer,
+                                       urb->actual_length);
+       if (!rec_ptr) {
+               netdev_err(netdev, "bad msg hdr len %d\n", urb->actual_length);
+               return -EINVAL;
+       }
+
+       /* loop reading all the records from the incoming message */
+       msg_end = urb->transfer_buffer + urb->actual_length;
+       rec_cnt = le16_to_cpu(*usb_msg.u.rec_cnt_rd);
+       for (; rec_cnt > 0; rec_cnt--) {
+               union pcan_usb_pro_rec *pr = (union pcan_usb_pro_rec *)rec_ptr;
+               u16 sizeof_rec = pcan_usb_pro_sizeof_rec[pr->data_type];
+
+               if (!sizeof_rec) {
+                       netdev_err(netdev,
+                                  "got unsupported rec in usb msg:\n");
+                       err = -ENOTSUPP;
+                       break;
+               }
+
+               /* check if the record goes out of current packet */
+               if (rec_ptr + sizeof_rec > msg_end) {
+                       netdev_err(netdev,
+                               "got frag rec: should inc usb rx buf size\n");
+                       err = -EBADMSG;
+                       break;
+               }
+
+               switch (pr->data_type) {
+               case PCAN_USBPRO_RXMSG8:
+               case PCAN_USBPRO_RXMSG4:
+               case PCAN_USBPRO_RXMSG0:
+               case PCAN_USBPRO_RXRTR:
+                       err = pcan_usb_pro_handle_canmsg(usb_if, &pr->rx_msg);
+                       if (err < 0)
+                               goto fail;
+                       break;
+
+               case PCAN_USBPRO_RXSTATUS:
+                       err = pcan_usb_pro_handle_error(usb_if, &pr->rx_status);
+                       if (err < 0)
+                               goto fail;
+                       break;
+
+               case PCAN_USBPRO_RXTS:
+                       pcan_usb_pro_handle_ts(usb_if, &pr->rx_ts);
+                       break;
+
+               default:
+                       netdev_err(netdev,
+                                  "unhandled rec type 0x%02x (%d): ignored\n",
+                                  pr->data_type, pr->data_type);
+                       break;
+               }
+
+               rec_ptr += sizeof_rec;
+       }
+
+fail:
+       if (err)
+               dump_mem("received msg",
+                        urb->transfer_buffer, urb->actual_length);
+
+       return err;
+}
+
+static int pcan_usb_pro_encode_msg(struct peak_usb_device *dev,
+                                  struct sk_buff *skb, u8 *obuf, size_t *size)
+{
+       struct can_frame *cf = (struct can_frame *)skb->data;
+       u8 data_type, len, flags;
+       struct pcan_usb_pro_msg usb_msg;
+
+       pcan_msg_init_empty(&usb_msg, obuf, *size);
+
+       if ((cf->can_id & CAN_RTR_FLAG) || (cf->can_dlc == 0))
+               data_type = PCAN_USBPRO_TXMSG0;
+       else if (cf->can_dlc <= 4)
+               data_type = PCAN_USBPRO_TXMSG4;
+       else
+               data_type = PCAN_USBPRO_TXMSG8;
+
+       len = (dev->ctrl_idx << 4) | (cf->can_dlc & 0x0f);
+
+       flags = 0;
+       if (cf->can_id & CAN_EFF_FLAG)
+               flags |= 0x02;
+       if (cf->can_id & CAN_RTR_FLAG)
+               flags |= 0x01;
+
+       pcan_msg_add_rec(&usb_msg, data_type, 0, flags, len, cf->can_id,
+                        cf->data);
+
+       *size = usb_msg.rec_buffer_len;
+
+       return 0;
+}
+
+static int pcan_usb_pro_start(struct peak_usb_device *dev)
+{
+       struct pcan_usb_pro_device *pdev =
+                       container_of(dev, struct pcan_usb_pro_device, dev);
+       int err;
+
+       err = pcan_usb_pro_set_silent(dev,
+                               dev->can.ctrlmode & CAN_CTRLMODE_LISTENONLY);
+       if (err)
+               return err;
+
+       /* filter mode: 0-> All OFF; 1->bypass */
+       err = pcan_usb_pro_set_filter(dev, 1);
+       if (err)
+               return err;
+
+       /* opening first device: */
+       if (pdev->usb_if->dev_opened_count == 0) {
+               /* reset time_ref */
+               peak_usb_init_time_ref(&pdev->usb_if->time_ref, &pcan_usb_pro);
+
+               /* ask device to send ts messages */
+               err = pcan_usb_pro_set_ts(dev, 1);
+       }
+
+       pdev->usb_if->dev_opened_count++;
+
+       return err;
+}
+
+/*
+ * stop interface
+ * (last chance before set bus off)
+ */
+static int pcan_usb_pro_stop(struct peak_usb_device *dev)
+{
+       struct pcan_usb_pro_device *pdev =
+                       container_of(dev, struct pcan_usb_pro_device, dev);
+
+       /* turn off ts msgs for that interface if no other dev opened */
+       if (pdev->usb_if->dev_opened_count == 1)
+               pcan_usb_pro_set_ts(dev, 0);
+
+       pdev->usb_if->dev_opened_count--;
+
+       return 0;
+}
+
+/*
+ * called when probing to initialize a device object.
+ */
+static int pcan_usb_pro_init(struct peak_usb_device *dev)
+{
+       struct pcan_usb_pro_interface *usb_if;
+       struct pcan_usb_pro_device *pdev =
+                       container_of(dev, struct pcan_usb_pro_device, dev);
+
+       /* do this for 1st channel only */
+       if (!dev->prev_siblings) {
+               struct pcan_usb_pro_fwinfo fi;
+               struct pcan_usb_pro_blinfo bi;
+               int err;
+
+               /* allocate netdevices common structure attached to first one */
+               usb_if = kzalloc(sizeof(struct pcan_usb_pro_interface),
+                                GFP_KERNEL);
+               if (!usb_if)
+                       return -ENOMEM;
+
+               /* number of ts msgs to ignore before taking one into account */
+               usb_if->cm_ignore_count = 5;
+
+               /*
+                * explicit use of dev_xxx() instead of netdev_xxx() here:
+                * information displayed are related to the device itself, not
+                * to the canx netdevices.
+                */
+               err = pcan_usb_pro_send_req(dev, PCAN_USBPRO_REQ_INFO,
+                                           PCAN_USBPRO_INFO_FW,
+                                           &fi, sizeof(fi));
+               if (err) {
+                       dev_err(dev->netdev->dev.parent,
+                               "unable to read %s firmware info (err %d)\n",
+                               pcan_usb_pro.name, err);
+                       return err;
+               }
+
+               err = pcan_usb_pro_send_req(dev, PCAN_USBPRO_REQ_INFO,
+                                           PCAN_USBPRO_INFO_BL,
+                                           &bi, sizeof(bi));
+               if (err) {
+                       dev_err(dev->netdev->dev.parent,
+                               "unable to read %s bootloader info (err %d)\n",
+                               pcan_usb_pro.name, err);
+                       return err;
+               }
+
+               dev_info(dev->netdev->dev.parent,
+                    "PEAK-System %s hwrev %u serial %08X.%08X (%u channels)\n",
+                    pcan_usb_pro.name,
+                    bi.hw_rev, bi.serial_num_hi, bi.serial_num_lo,
+                    pcan_usb_pro.ctrl_count);
+
+               /* tell the device the can driver is running */
+               pcan_usb_pro_drv_loaded(dev, 1);
+       } else {
+               usb_if = pcan_usb_pro_dev_if(dev->prev_siblings);
+       }
+
+       pdev->usb_if = usb_if;
+       usb_if->dev[dev->ctrl_idx] = dev;
+
+       /* set LED in default state (end of init phase) */
+       pcan_usb_pro_set_led(dev, 0, 1);
+
+       return 0;
+}
+
+static void pcan_usb_pro_exit(struct peak_usb_device *dev)
+{
+       struct pcan_usb_pro_device *pdev =
+                       container_of(dev, struct pcan_usb_pro_device, dev);
+
+       /*
+        * when rmmod called before unplug and if down, should reset things
+        * before leaving
+        */
+       if (dev->can.state != CAN_STATE_STOPPED) {
+               /* set bus off on the corresponding channel */
+               pcan_usb_pro_set_bus(dev, 0);
+       }
+
+       /* if channel #0 (only) */
+       if (dev->ctrl_idx == 0) {
+               /* turn off calibration message if any device were opened */
+               if (pdev->usb_if->dev_opened_count > 0)
+                       pcan_usb_pro_set_ts(dev, 0);
+
+               /* tell the PCAN-USB Pro device the driver is being unloaded */
+               pcan_usb_pro_drv_loaded(dev, 0);
+       }
+}
+
+/*
+ * called when PCAN-USB Pro adapter is unplugged
+ */
+static void pcan_usb_pro_free(struct peak_usb_device *dev)
+{
+       /* last device: can free pcan_usb_pro_interface object now */
+       if (!dev->prev_siblings && !dev->next_siblings)
+               kfree(pcan_usb_pro_dev_if(dev));
+}
+
+/*
+ * probe function for new PCAN-USB Pro usb interface
+ */
+static int pcan_usb_pro_probe(struct usb_interface *intf)
+{
+       struct usb_host_interface *if_desc;
+       int i;
+
+       if_desc = intf->altsetting;
+
+       /* check interface endpoint addresses */
+       for (i = 0; i < if_desc->desc.bNumEndpoints; i++) {
+               struct usb_endpoint_descriptor *ep = &if_desc->endpoint[i].desc;
+
+               /*
+                * below is the list of valid ep addreses. Any other ep address
+                * is considered as not-CAN interface address => no dev created
+                */
+               switch (ep->bEndpointAddress) {
+               case PCAN_USBPRO_EP_CMDOUT:
+               case PCAN_USBPRO_EP_CMDIN:
+               case PCAN_USBPRO_EP_MSGOUT_0:
+               case PCAN_USBPRO_EP_MSGOUT_1:
+               case PCAN_USBPRO_EP_MSGIN:
+               case PCAN_USBPRO_EP_UNUSED:
+                       break;
+               default:
+                       return -ENODEV;
+               }
+       }
+
+       return 0;
+}
+
+/*
+ * describe the PCAN-USB Pro adapter
+ */
+struct peak_usb_adapter pcan_usb_pro = {
+       .name = "PCAN-USB Pro",
+       .device_id = PCAN_USBPRO_PRODUCT_ID,
+       .ctrl_count = PCAN_USBPRO_CHANNEL_COUNT,
+       .clock = {
+               .freq = PCAN_USBPRO_CRYSTAL_HZ,
+       },
+       .bittiming_const = {
+               .name = "pcan_usb_pro",
+               .tseg1_min = 1,
+               .tseg1_max = 16,
+               .tseg2_min = 1,
+               .tseg2_max = 8,
+               .sjw_max = 4,
+               .brp_min = 1,
+               .brp_max = 1024,
+               .brp_inc = 1,
+       },
+
+       /* size of device private data */
+       .sizeof_dev_private = sizeof(struct pcan_usb_pro_device),
+
+       /* timestamps usage */
+       .ts_used_bits = 32,
+       .ts_period = 1000000, /* calibration period in ts. */
+       .us_per_ts_scale = 1, /* us = (ts * scale) >> shift */
+       .us_per_ts_shift = 0,
+
+       /* give here messages in/out endpoints */
+       .ep_msg_in = PCAN_USBPRO_EP_MSGIN,
+       .ep_msg_out = {PCAN_USBPRO_EP_MSGOUT_0, PCAN_USBPRO_EP_MSGOUT_1},
+
+       /* size of rx/tx usb buffers */
+       .rx_buffer_size = PCAN_USBPRO_RX_BUFFER_SIZE,
+       .tx_buffer_size = PCAN_USBPRO_TX_BUFFER_SIZE,
+
+       /* device callbacks */
+       .intf_probe = pcan_usb_pro_probe,
+       .dev_init = pcan_usb_pro_init,
+       .dev_exit = pcan_usb_pro_exit,
+       .dev_free = pcan_usb_pro_free,
+       .dev_set_bus = pcan_usb_pro_set_bus,
+       .dev_set_bittiming = pcan_usb_pro_set_bittiming,
+       .dev_get_device_id = pcan_usb_pro_get_device_id,
+       .dev_decode_buf = pcan_usb_pro_decode_buf,
+       .dev_encode_msg = pcan_usb_pro_encode_msg,
+       .dev_start = pcan_usb_pro_start,
+       .dev_stop = pcan_usb_pro_stop,
+       .dev_restart_async = pcan_usb_pro_restart_async,
+};
diff --git a/drivers/net/can/usb/peak_usb/pcan_usb_pro.h b/drivers/net/can/usb/peak_usb/pcan_usb_pro.h
new file mode 100644 (file)
index 0000000..a869918
--- /dev/null
@@ -0,0 +1,178 @@
+/*
+ * CAN driver for PEAK System PCAN-USB Pro adapter
+ * Derived from the PCAN project file driver/src/pcan_usbpro_fw.h
+ *
+ * Copyright (C) 2003-2011 PEAK System-Technik GmbH
+ * Copyright (C) 2011-2012 Stephane Grosjean <s.grosjean@peak-system.com>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published
+ * by the Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ */
+#ifndef PCAN_USB_PRO_H
+#define PCAN_USB_PRO_H
+
+/*
+ * USB Vendor request data types
+ */
+#define PCAN_USBPRO_REQ_INFO           0
+#define PCAN_USBPRO_REQ_FCT            2
+
+/* Vendor Request value for XXX_INFO */
+#define PCAN_USBPRO_INFO_BL            0
+#define PCAN_USBPRO_INFO_FW            1
+
+/* Vendor Request value for XXX_FCT */
+#define PCAN_USBPRO_FCT_DRVLD          5 /* tell device driver is loaded */
+
+/* PCAN_USBPRO_INFO_BL vendor request record type */
+struct __packed pcan_usb_pro_blinfo {
+       u32 ctrl_type;
+       u8  version[4];
+       u8  day;
+       u8  month;
+       u8  year;
+       u8  dummy;
+       u32 serial_num_hi;
+       u32 serial_num_lo;
+       u32 hw_type;
+       u32 hw_rev;
+};
+
+/* PCAN_USBPRO_INFO_FW vendor request record type */
+struct __packed pcan_usb_pro_fwinfo {
+       u32 ctrl_type;
+       u8  version[4];
+       u8  day;
+       u8  month;
+       u8  year;
+       u8  dummy;
+       u32 fw_type;
+};
+
+/*
+ * USB Command record types
+ */
+#define PCAN_USBPRO_SETBTR     0x02
+#define PCAN_USBPRO_SETBUSACT  0x04
+#define PCAN_USBPRO_SETSILENT  0x05
+#define PCAN_USBPRO_SETFILTR   0x0a
+#define PCAN_USBPRO_SETTS      0x10
+#define PCAN_USBPRO_GETDEVID   0x12
+#define PCAN_USBPRO_SETLED     0x1C
+#define PCAN_USBPRO_RXMSG8     0x80
+#define PCAN_USBPRO_RXMSG4     0x81
+#define PCAN_USBPRO_RXMSG0     0x82
+#define PCAN_USBPRO_RXRTR      0x83
+#define PCAN_USBPRO_RXSTATUS   0x84
+#define PCAN_USBPRO_RXTS       0x85
+#define PCAN_USBPRO_TXMSG8     0x41
+#define PCAN_USBPRO_TXMSG4     0x42
+#define PCAN_USBPRO_TXMSG0     0x43
+
+/* record structures */
+struct __packed pcan_usb_pro_btr {
+       u8  data_type;
+       u8  channel;
+       u16 dummy;
+       u32 CCBT;
+};
+
+struct __packed pcan_usb_pro_busact {
+       u8  data_type;
+       u8  channel;
+       u16 onoff;
+};
+
+struct __packed pcan_usb_pro_silent {
+       u8  data_type;
+       u8  channel;
+       u16 onoff;
+};
+
+struct __packed pcan_usb_pro_filter {
+       u8  data_type;
+       u8  dummy;
+       u16 filter_mode;
+};
+
+struct __packed pcan_usb_pro_setts {
+       u8  data_type;
+       u8  dummy;
+       u16 mode;
+};
+
+struct __packed pcan_usb_pro_devid {
+       u8  data_type;
+       u8  channel;
+       u16 dummy;
+       u32 serial_num;
+};
+
+struct __packed pcan_usb_pro_setled {
+       u8  data_type;
+       u8  channel;
+       u16 mode;
+       u32 timeout;
+};
+
+struct __packed pcan_usb_pro_rxmsg {
+       u8  data_type;
+       u8  client;
+       u8  flags;
+       u8  len;
+       u32 ts32;
+       u32 id;
+
+       u8  data[8];
+};
+
+#define PCAN_USBPRO_STATUS_ERROR       0x0001
+#define PCAN_USBPRO_STATUS_BUS         0x0002
+#define PCAN_USBPRO_STATUS_OVERRUN     0x0004
+#define PCAN_USBPRO_STATUS_QOVERRUN    0x0008
+
+struct __packed pcan_usb_pro_rxstatus {
+       u8  data_type;
+       u8  channel;
+       u16 status;
+       u32 ts32;
+       u32 err_frm;
+};
+
+struct __packed pcan_usb_pro_rxts {
+       u8  data_type;
+       u8  dummy[3];
+       u32 ts64[2];
+};
+
+struct __packed pcan_usb_pro_txmsg {
+       u8  data_type;
+       u8  client;
+       u8  flags;
+       u8  len;
+       u32 id;
+       u8  data[8];
+};
+
+union pcan_usb_pro_rec {
+       u8                              data_type;
+       struct pcan_usb_pro_btr         btr;
+       struct pcan_usb_pro_busact      bus_act;
+       struct pcan_usb_pro_silent      silent_mode;
+       struct pcan_usb_pro_filter      filter_mode;
+       struct pcan_usb_pro_setts       ts;
+       struct pcan_usb_pro_devid       dev_id;
+       struct pcan_usb_pro_setled      set_led;
+       struct pcan_usb_pro_rxmsg       rx_msg;
+       struct pcan_usb_pro_rxstatus    rx_status;
+       struct pcan_usb_pro_rxts        rx_ts;
+       struct pcan_usb_pro_txmsg       tx_msg;
+};
+
+#endif
index 087648e..d5c6d92 100644 (file)
@@ -47,6 +47,7 @@ static int dummy_set_address(struct net_device *dev, void *p)
        if (!is_valid_ether_addr(sa->sa_data))
                return -EADDRNOTAVAIL;
 
+       dev->addr_assign_type &= ~NET_ADDR_RANDOM;
        memcpy(dev->dev_addr, sa->sa_data, ETH_ALEN);
        return 0;
 }
@@ -135,7 +136,7 @@ static void dummy_setup(struct net_device *dev)
        dev->flags &= ~IFF_MULTICAST;
        dev->features   |= NETIF_F_SG | NETIF_F_FRAGLIST | NETIF_F_TSO;
        dev->features   |= NETIF_F_HW_CSUM | NETIF_F_HIGHDMA | NETIF_F_LLTX;
-       random_ether_addr(dev->dev_addr);
+       eth_hw_addr_random(dev);
 }
 
 static int dummy_validate(struct nlattr *tb[], struct nlattr *data[])
index 68da81d..bf73e1a 100644 (file)
@@ -702,7 +702,7 @@ static void el_receive(struct net_device *dev)
         */
 
        outb(AX_SYS, AX_CMD);
-       skb = dev_alloc_skb(pkt_len+2);
+       skb = netdev_alloc_skb(dev, pkt_len + 2);
 
        /*
         *      Start of frame
index 92053e6..41719da 100644 (file)
@@ -1066,7 +1066,7 @@ el3_rx(struct net_device *dev)
                        short pkt_len = rx_status & 0x7ff;
                        struct sk_buff *skb;
 
-                       skb = dev_alloc_skb(pkt_len+5);
+                       skb = netdev_alloc_skb(dev, pkt_len + 5);
                        if (el3_debug > 4)
                                pr_debug("Receiving packet size %d status %4.4x.\n",
                                           pkt_len, rx_status);
index f67a5d3..59e1e00 100644 (file)
@@ -826,11 +826,10 @@ static int corkscrew_open(struct net_device *dev)
                                vp->rx_ring[i].next = 0;
                        vp->rx_ring[i].status = 0;      /* Clear complete bit. */
                        vp->rx_ring[i].length = PKT_BUF_SZ | 0x80000000;
-                       skb = dev_alloc_skb(PKT_BUF_SZ);
+                       skb = netdev_alloc_skb(dev, PKT_BUF_SZ);
                        vp->rx_skbuff[i] = skb;
                        if (skb == NULL)
                                break;  /* Bad news!  */
-                       skb->dev = dev; /* Mark as being used by this device. */
                        skb_reserve(skb, 2);    /* Align IP on 16 byte boundaries */
                        vp->rx_ring[i].addr = isa_virt_to_bus(skb->data);
                }
@@ -1295,7 +1294,7 @@ static int corkscrew_rx(struct net_device *dev)
                        short pkt_len = rx_status & 0x1fff;
                        struct sk_buff *skb;
 
-                       skb = dev_alloc_skb(pkt_len + 5 + 2);
+                       skb = netdev_alloc_skb(dev, pkt_len + 5 + 2);
                        if (corkscrew_debug > 4)
                                pr_debug("Receiving packet size %d status %4.4x.\n",
                                     pkt_len, rx_status);
@@ -1368,7 +1367,7 @@ static int boomerang_rx(struct net_device *dev)
                        /* Check if the packet is long enough to just accept without
                           copying to a properly sized skbuff. */
                        if (pkt_len < rx_copybreak &&
-                           (skb = dev_alloc_skb(pkt_len + 4)) != NULL) {
+                           (skb = netdev_alloc_skb(dev, pkt_len + 4)) != NULL) {
                                skb_reserve(skb, 2);    /* Align IP on 16 byte boundaries */
                                /* 'skb_put()' points to the start of sk_buff data area. */
                                memcpy(skb_put(skb, pkt_len),
@@ -1403,10 +1402,9 @@ static int boomerang_rx(struct net_device *dev)
                struct sk_buff *skb;
                entry = vp->dirty_rx % RX_RING_SIZE;
                if (vp->rx_skbuff[entry] == NULL) {
-                       skb = dev_alloc_skb(PKT_BUF_SZ);
+                       skb = netdev_alloc_skb(dev, PKT_BUF_SZ);
                        if (skb == NULL)
                                break;  /* Bad news!  */
-                       skb->dev = dev; /* Mark as being used by this device. */
                        skb_reserve(skb, 2);    /* Align IP on 16 byte boundaries */
                        vp->rx_ring[entry].addr = isa_virt_to_bus(skb->data);
                        vp->rx_skbuff[entry] = skb;
index 9c01bc9..e61b2f8 100644 (file)
@@ -1012,7 +1012,7 @@ static int el3_rx(struct net_device *dev, int worklimit)
                        short pkt_len = rx_status & 0x7ff;
                        struct sk_buff *skb;
 
-                       skb = dev_alloc_skb(pkt_len+5);
+                       skb = netdev_alloc_skb(dev, pkt_len + 5);
 
                        pr_debug("  Receiving packet size %d status %4.4x.\n",
                                  pkt_len, rx_status);
index da410f0..b23253b 100644 (file)
@@ -819,7 +819,7 @@ static int el3_rx(struct net_device *dev)
            short pkt_len = rx_status & 0x7ff;
            struct sk_buff *skb;
 
-           skb = dev_alloc_skb(pkt_len+5);
+           skb = netdev_alloc_skb(dev, pkt_len + 5);
 
            netdev_dbg(dev, "    Receiving packet size %d status %4.4x.\n",
                       pkt_len, rx_status);
index f9b74c0..e463d10 100644 (file)
@@ -1121,10 +1121,9 @@ static int __devinit vortex_probe1(struct device *gendev,
 
        dev = alloc_etherdev(sizeof(*vp));
        retval = -ENOMEM;
-       if (!dev) {
-               pr_err(PFX "unable to allocate etherdev, aborting\n");
+       if (!dev)
                goto out;
-       }
+
        SET_NETDEV_DEV(dev, gendev);
        vp = netdev_priv(dev);
 
@@ -2500,7 +2499,7 @@ static int vortex_rx(struct net_device *dev)
                        int pkt_len = rx_status & 0x1fff;
                        struct sk_buff *skb;
 
-                       skb = dev_alloc_skb(pkt_len + 5);
+                       skb = netdev_alloc_skb(dev, pkt_len + 5);
                        if (vortex_debug > 4)
                                pr_debug("Receiving packet size %d status %4.4x.\n",
                                           pkt_len, rx_status);
@@ -2579,7 +2578,8 @@ boomerang_rx(struct net_device *dev)
 
                        /* Check if the packet is long enough to just accept without
                           copying to a properly sized skbuff. */
-                       if (pkt_len < rx_copybreak && (skb = dev_alloc_skb(pkt_len + 2)) != NULL) {
+                       if (pkt_len < rx_copybreak &&
+                           (skb = netdev_alloc_skb(dev, pkt_len + 2)) != NULL) {
                                skb_reserve(skb, 2);    /* Align IP on 16 byte boundaries */
                                pci_dma_sync_single_for_cpu(VORTEX_PCI(vp), dma, PKT_BUF_SZ, PCI_DMA_FROMDEVICE);
                                /* 'skb_put()' points to the start of sk_buff data area. */
index a8bb30c..bad4fa6 100644 (file)
@@ -97,7 +97,7 @@ config VORTEX
          available from <http://www.tldp.org/docs.html#howto>. More
          specific information is in
          <file:Documentation/networking/vortex.txt> and in the comments at
-         the beginning of <file:drivers/net/3c59x.c>.
+         the beginning of <file:drivers/net/ethernet/3com/3c59x.c>.
 
          To compile this support as a module, choose M here.
 
index 6d6bc75..1234a14 100644 (file)
@@ -966,18 +966,6 @@ typhoon_get_stats(struct net_device *dev)
        return stats;
 }
 
-static int
-typhoon_set_mac_address(struct net_device *dev, void *addr)
-{
-       struct sockaddr *saddr = (struct sockaddr *) addr;
-
-       if(netif_running(dev))
-               return -EBUSY;
-
-       memcpy(dev->dev_addr, saddr->sa_data, dev->addr_len);
-       return 0;
-}
-
 static void
 typhoon_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info)
 {
@@ -1607,7 +1595,7 @@ typhoon_alloc_rx_skb(struct typhoon *tp, u32 idx)
                                le32_to_cpu(indexes->rxBuffCleared))
                return -ENOMEM;
 
-       skb = dev_alloc_skb(PKT_BUF_SZ);
+       skb = netdev_alloc_skb(tp->dev, PKT_BUF_SZ);
        if(!skb)
                return -ENOMEM;
 
@@ -1618,7 +1606,6 @@ typhoon_alloc_rx_skb(struct typhoon *tp, u32 idx)
        skb_reserve(skb, 2);
 #endif
 
-       skb->dev = tp->dev;
        dma_addr = pci_map_single(tp->pdev, skb->data,
                                  PKT_BUF_SZ, PCI_DMA_FROMDEVICE);
 
@@ -1673,7 +1660,7 @@ typhoon_rx(struct typhoon *tp, struct basic_ring *rxRing, volatile __le32 * read
                pkt_len = le16_to_cpu(rx->frameLen);
 
                if(pkt_len < rx_copybreak &&
-                  (new_skb = dev_alloc_skb(pkt_len + 2)) != NULL) {
+                  (new_skb = netdev_alloc_skb(tp->dev, pkt_len + 2)) != NULL) {
                        skb_reserve(new_skb, 2);
                        pci_dma_sync_single_for_cpu(tp->pdev, dma_addr,
                                                    PKT_BUF_SZ,
@@ -2267,7 +2254,7 @@ static const struct net_device_ops typhoon_netdev_ops = {
        .ndo_tx_timeout         = typhoon_tx_timeout,
        .ndo_get_stats          = typhoon_get_stats,
        .ndo_validate_addr      = eth_validate_addr,
-       .ndo_set_mac_address    = typhoon_set_mac_address,
+       .ndo_set_mac_address    = eth_mac_addr,
        .ndo_change_mtu         = eth_change_mtu,
 };
 
index 0f92e35..c30adcc 100644 (file)
@@ -1,4 +1,4 @@
-/* drivers/net/ax88796.c
+/* drivers/net/ethernet/8390/ax88796.c
  *
  * Copyright 2005,2007 Simtec Electronics
  *     Ben Dooks <ben@simtec.co.uk>
index bba51cd..c5bd8eb 100644 (file)
@@ -192,7 +192,7 @@ static int get_prom(struct pcmcia_device *link)
     unsigned int ioaddr = dev->base_addr;
     int i, j;
 
-    /* This is based on drivers/net/ne.c */
+    /* This is based on drivers/net/ethernet/8390/ne.c */
     struct {
        u_char value, offset;
     } program_seq[] = {
@@ -1408,7 +1408,7 @@ static void ei_receive(struct net_device *dev)
                {
                        struct sk_buff *skb;
                        
-                       skb = dev_alloc_skb(pkt_len+2);
+                       skb = netdev_alloc_skb(dev, pkt_len + 2);
                        if (skb == NULL) 
                        {
                                if (ei_debug > 1)
index 05ae214..e77f624 100644 (file)
@@ -717,7 +717,7 @@ static void ei_receive(struct net_device *dev)
                } else if ((pkt_stat & 0x0F) == ENRSR_RXOK) {
                        struct sk_buff *skb;
 
-                       skb = dev_alloc_skb(pkt_len+2);
+                       skb = netdev_alloc_skb(dev, pkt_len + 2);
                        if (skb == NULL) {
                                if (ei_debug > 1)
                                        netdev_dbg(dev, "Couldn't allocate a sk_buff of size %d\n",
index 053b255..f2a4e5d 100644 (file)
@@ -326,7 +326,7 @@ static hw_info_t *get_prom(struct pcmcia_device *link)
     u_char prom[32];
     int i, j;
 
-    /* This is lifted straight from drivers/net/ne.c */
+    /* This is lifted straight from drivers/net/ethernet/8390/ne.c */
     struct {
        u_char value, offset;
     } program_seq[] = {
index cb4f38a..d896816 100644 (file)
@@ -686,10 +686,9 @@ static int __devinit starfire_init_one(struct pci_dev *pdev,
        }
 
        dev = alloc_etherdev(sizeof(*np));
-       if (!dev) {
-               printk(KERN_ERR DRV_NAME " %d: cannot alloc etherdev, aborting\n", card_idx);
+       if (!dev)
                return -ENOMEM;
-       }
+
        SET_NETDEV_DEV(dev, &pdev->dev);
 
        irq = pdev->irq;
@@ -1180,12 +1179,11 @@ static void init_ring(struct net_device *dev)
 
        /* Fill in the Rx buffers.  Handle allocation failure gracefully. */
        for (i = 0; i < RX_RING_SIZE; i++) {
-               struct sk_buff *skb = dev_alloc_skb(np->rx_buf_sz);
+               struct sk_buff *skb = netdev_alloc_skb(dev, np->rx_buf_sz);
                np->rx_info[i].skb = skb;
                if (skb == NULL)
                        break;
                np->rx_info[i].mapping = pci_map_single(np->pci_dev, skb->data, np->rx_buf_sz, PCI_DMA_FROMDEVICE);
-               skb->dev = dev;                 /* Mark as being used by this device. */
                /* Grrr, we cannot offset to correctly align the IP header. */
                np->rx_ring[i].rxaddr = cpu_to_dma(np->rx_info[i].mapping | RxDescValid);
        }
@@ -1473,7 +1471,7 @@ static int __netdev_rx(struct net_device *dev, int *quota)
                /* Check if the packet is long enough to accept without copying
                   to a minimally-sized skbuff. */
                if (pkt_len < rx_copybreak &&
-                   (skb = dev_alloc_skb(pkt_len + 2)) != NULL) {
+                   (skb = netdev_alloc_skb(dev, pkt_len + 2)) != NULL) {
                        skb_reserve(skb, 2);    /* 16 byte align the IP header */
                        pci_dma_sync_single_for_cpu(np->pci_dev,
                                                    np->rx_info[entry].mapping,
@@ -1597,13 +1595,12 @@ static void refill_rx_ring(struct net_device *dev)
        for (; np->cur_rx - np->dirty_rx > 0; np->dirty_rx++) {
                entry = np->dirty_rx % RX_RING_SIZE;
                if (np->rx_info[entry].skb == NULL) {
-                       skb = dev_alloc_skb(np->rx_buf_sz);
+                       skb = netdev_alloc_skb(dev, np->rx_buf_sz);
                        np->rx_info[entry].skb = skb;
                        if (skb == NULL)
                                break;  /* Better luck next round. */
                        np->rx_info[entry].mapping =
                                pci_map_single(np->pci_dev, skb->data, np->rx_buf_sz, PCI_DMA_FROMDEVICE);
-                       skb->dev = dev; /* Mark as being used by this device. */
                        np->rx_ring[entry].rxaddr =
                                cpu_to_dma(np->rx_info[entry].mapping | RxDescValid);
                }
index d812a10..ab4daec 100644 (file)
@@ -113,7 +113,7 @@ static void desc_list_free(void)
        }
 }
 
-static int desc_list_init(void)
+static int desc_list_init(struct net_device *dev)
 {
        int i;
        struct sk_buff *new_skb;
@@ -187,7 +187,7 @@ static int desc_list_init(void)
                struct dma_descriptor *b = &(r->desc_b);
 
                /* allocate a new skb for next time receive */
-               new_skb = dev_alloc_skb(PKT_BUF_SZ + NET_IP_ALIGN);
+               new_skb = netdev_alloc_skb(dev, PKT_BUF_SZ + NET_IP_ALIGN);
                if (!new_skb) {
                        pr_notice("init: low on mem - packet dropped\n");
                        goto init_error;
@@ -621,6 +621,7 @@ static int bfin_mac_set_mac_address(struct net_device *dev, void *p)
        if (netif_running(dev))
                return -EBUSY;
        memcpy(dev->dev_addr, addr->sa_data, dev->addr_len);
+       dev->addr_assign_type &= ~NET_ADDR_RANDOM;
        setup_mac_addr(dev->dev_addr);
        return 0;
 }
@@ -1090,7 +1091,7 @@ static void bfin_mac_rx(struct net_device *dev)
        /* allocate a new skb for next time receive */
        skb = current_rx_ptr->skb;
 
-       new_skb = dev_alloc_skb(PKT_BUF_SZ + NET_IP_ALIGN);
+       new_skb = netdev_alloc_skb(dev, PKT_BUF_SZ + NET_IP_ALIGN);
        if (!new_skb) {
                netdev_notice(dev, "rx: low on mem - packet dropped\n");
                dev->stats.rx_dropped++;
@@ -1397,7 +1398,7 @@ static int bfin_mac_open(struct net_device *dev)
        }
 
        /* initial rx and tx list */
-       ret = desc_list_init();
+       ret = desc_list_init(dev);
        if (ret)
                return ret;
 
@@ -1467,10 +1468,8 @@ static int __devinit bfin_mac_probe(struct platform_device *pdev)
        int rc;
 
        ndev = alloc_etherdev(sizeof(struct bfin_mac_local));
-       if (!ndev) {
-               dev_err(&pdev->dev, "Cannot allocate net device!\n");
+       if (!ndev)
                return -ENOMEM;
-       }
 
        SET_NETDEV_DEV(ndev, &pdev->dev);
        platform_set_drvdata(pdev, ndev);
@@ -1496,12 +1495,14 @@ static int __devinit bfin_mac_probe(struct platform_device *pdev)
         * Grab the MAC from the board somehow
         * this is done in the arch/blackfin/mach-bfxxx/boards/eth_mac.c
         */
-       if (!is_valid_ether_addr(ndev->dev_addr))
-               bfin_get_ether_addr(ndev->dev_addr);
-
-       /* If still not valid, get a random one */
-       if (!is_valid_ether_addr(ndev->dev_addr))
-               random_ether_addr(ndev->dev_addr);
+       if (!is_valid_ether_addr(ndev->dev_addr)) {
+               if (bfin_get_ether_addr(ndev->dev_addr) ||
+                    !is_valid_ether_addr(ndev->dev_addr)) {
+                       /* Still not valid, get a random one */
+                       netdev_warn(ndev, "Setting Ethernet MAC to a random one\n");
+                       eth_hw_addr_random(ndev);
+               }
+       }
 
        setup_mac_addr(ndev->dev_addr);
 
index f8559ac..960905c 100644 (file)
@@ -101,6 +101,6 @@ struct bfin_mac_local {
 #endif
 };
 
-extern void bfin_get_ether_addr(char *addr);
+extern int bfin_get_ether_addr(char *addr);
 
 #endif
index c885aa9..3485011 100644 (file)
@@ -785,7 +785,6 @@ static int greth_rx(struct net_device *dev, int limit)
 
                        } else {
                                skb_reserve(skb, NET_IP_ALIGN);
-                               skb->dev = dev;
 
                                dma_sync_single_for_cpu(greth->dev,
                                                        dma_addr,
@@ -1018,7 +1017,7 @@ static int greth_set_mac_add(struct net_device *dev, void *p)
        regs = (struct greth_regs *) greth->regs;
 
        if (!is_valid_ether_addr(addr->sa_data))
-               return -EINVAL;
+               return -EADDRNOTAVAIL;
 
        memcpy(dev->dev_addr, addr->sa_data, dev->addr_len);
        GRETH_REGSAVE(regs->esa_msb, dev->dev_addr[0] << 8 | dev->dev_addr[1]);
@@ -1422,7 +1421,7 @@ static int __devinit greth_of_probe(struct platform_device *ofdev)
        SET_NETDEV_DEV(dev, greth->dev);
 
        if (netif_msg_probe(greth))
-               dev_dbg(greth->dev, "reseting controller.\n");
+               dev_dbg(greth->dev, "resetting controller.\n");
 
        /* Reset the controller. */
        GRETH_REGSAVE(regs->control, GRETH_RESET);
index f872748..6c3b1c0 100644 (file)
@@ -463,11 +463,8 @@ static int __devinit acenic_probe_one(struct pci_dev *pdev,
        static int boards_found;
 
        dev = alloc_etherdev(sizeof(struct ace_private));
-       if (dev == NULL) {
-               printk(KERN_ERR "acenic: Unable to allocate "
-                      "net_device structure!\n");
+       if (dev == NULL)
                return -ENOMEM;
-       }
 
        SET_NETDEV_DEV(dev, &pdev->dev);
 
index 60b35fb..1b046f5 100644 (file)
@@ -316,7 +316,7 @@ static int lance_rx (struct net_device *dev)
                         if (bits & LE_R1_EOP) dev->stats.rx_errors++;
                 } else {
                        int len = (rd->mblength & 0xfff) - 4;
-                       struct sk_buff *skb = dev_alloc_skb (len+2);
+                       struct sk_buff *skb = netdev_alloc_skb(dev, len + 2);
 
                         if (!skb) {
                                 printk ("%s: Memory squeeze, deferring packet.\n",
index 238b537..8350f4b 100644 (file)
@@ -113,7 +113,7 @@ config DEPCA
          If you have a network (Ethernet) card of this type, say Y and read
          the Ethernet-HOWTO, available from
          <http://www.tldp.org/docs.html#howto> as well as
-         <file:drivers/net/depca.c>.
+         <file:drivers/net/ethernet/amd/depca.c>.
 
          To compile this driver as a module, choose M here. The module
          will be called depca.
index 825e5d4..689dfca 100644 (file)
@@ -290,7 +290,7 @@ static int lance_rx(struct net_device *dev)
                                dev->stats.rx_errors++;
                } else {
                        int len = (rd->mblength & 0xfff) - 4;
-                       struct sk_buff *skb = dev_alloc_skb(len + 2);
+                       struct sk_buff *skb = netdev_alloc_skb(dev, len + 2);
 
                        if (!skb) {
                                netdev_warn(dev, "Memory squeeze, deferring packet\n");
index 7d5ded8..cc7b9e4 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *  linux/drivers/net/am79c961.c
+ *  linux/drivers/net/ethernet/amd/am79c961a.c
  *
  *  by Russell King <rmk@arm.linux.org.uk> 1995-2001.
  *
@@ -516,7 +516,7 @@ am79c961_rx(struct net_device *dev, struct dev_priv *priv)
                }
 
                len = am_readword(dev, hdraddr + 6);
-               skb = dev_alloc_skb(len + 2);
+               skb = netdev_alloc_skb(dev, len + 2);
 
                if (skb) {
                        skb_reserve(skb, 2);
index fd634d3..9f384b7 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * linux/drivers/net/arm/am79c961a.h
+ * linux/drivers/net/ethernet/amd/am79c961a.h
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License version 2 as
index 33e0a8c..9f62504 100644 (file)
@@ -336,7 +336,8 @@ static int amd8111e_init_ring(struct net_device *dev)
        /* Allocating receive  skbs */
        for (i = 0; i < NUM_RX_BUFFERS; i++) {
 
-               if (!(lp->rx_skbuff[i] = dev_alloc_skb(lp->rx_buff_len))) {
+               lp->rx_skbuff[i] = netdev_alloc_skb(dev, lp->rx_buff_len);
+               if (!lp->rx_skbuff[i]) {
                                /* Release previos allocated skbs */
                                for(--i; i >= 0 ;i--)
                                        dev_kfree_skb(lp->rx_skbuff[i]);
@@ -768,7 +769,8 @@ static int amd8111e_rx_poll(struct napi_struct *napi, int budget)
                        }
                        if(--rx_pkt_limit < 0)
                                goto rx_not_empty;
-                       if(!(new_skb = dev_alloc_skb(lp->rx_buff_len))){
+                       new_skb = netdev_alloc_skb(dev, lp->rx_buff_len);
+                       if (!new_skb) {
                                /* if allocation fail,
                                   ignore that pkt and go to next one */
                                lp->rx_ring[rx_index].rx_flags &= RESET_RX_FLAGS;
@@ -1859,7 +1861,6 @@ static int __devinit amd8111e_probe_one(struct pci_dev *pdev,
 
        dev = alloc_etherdev(sizeof(struct amd8111e_priv));
        if (!dev) {
-               printk(KERN_ERR "amd8111e: Etherdev alloc failed, exiting.\n");
                err = -ENOMEM;
                goto err_free_reg;
        }
index eb18e1f..f4c228e 100644 (file)
@@ -191,7 +191,7 @@ static int ariadne_rx(struct net_device *dev)
                        short pkt_len = swapw(priv->rx_ring[entry]->RMD3);
                        struct sk_buff *skb;
 
-                       skb = dev_alloc_skb(pkt_len + 2);
+                       skb = netdev_alloc_skb(dev, pkt_len + 2);
                        if (skb == NULL) {
                                netdev_warn(dev, "Memory squeeze, deferring packet\n");
                                for (i = 0; i < RX_RING_SIZE; i++)
index 15bfa28..70ed79c 100644 (file)
@@ -997,7 +997,7 @@ static int lance_rx( struct net_device *dev )
                                dev->stats.rx_errors++;
                        }
                        else {
-                               skb = dev_alloc_skb( pkt_len+2 );
+                               skb = netdev_alloc_skb(dev, pkt_len + 2);
                                if (skb == NULL) {
                                        DPRINTK( 1, ( "%s: Memory squeeze, deferring packet.\n",
                                                                  dev->name ));
index 8b95dd3..397596b 100644 (file)
@@ -725,7 +725,7 @@ static int au1000_rx(struct net_device *dev)
                        /* good frame */
                        frmlen = (status & RX_FRAME_LEN_MASK);
                        frmlen -= 4; /* Remove FCS */
-                       skb = dev_alloc_skb(frmlen + 2);
+                       skb = netdev_alloc_skb(dev, frmlen + 2);
                        if (skb == NULL) {
                                netdev_err(dev, "Memory squeeze, dropping packet.\n");
                                dev->stats.rx_dropped++;
@@ -1077,7 +1077,6 @@ static int __devinit au1000_probe(struct platform_device *pdev)
 
        dev = alloc_etherdev(sizeof(struct au1000_private));
        if (!dev) {
-               dev_err(&pdev->dev, "alloc_etherdev failed\n");
                err = -ENOMEM;
                goto err_alloc;
        }
@@ -1130,9 +1129,6 @@ static int __devinit au1000_probe(struct platform_device *pdev)
 
        au1000_setup_hw_rings(aup, aup->macdma);
 
-       /* set a random MAC now in case platform_data doesn't provide one */
-       random_ether_addr(dev->dev_addr);
-
        writel(0, aup->enable);
        aup->mac_enabled = 0;
 
@@ -1142,8 +1138,12 @@ static int __devinit au1000_probe(struct platform_device *pdev)
                                        " PHY search on MAC0\n");
                aup->phy1_search_mac0 = 1;
        } else {
-               if (is_valid_ether_addr(pd->mac))
+               if (is_valid_ether_addr(pd->mac)) {
                        memcpy(dev->dev_addr, pd->mac, 6);
+               } else {
+                       /* Set a random MAC since no valid provided by platform_data. */
+                       eth_hw_addr_random(dev);
+               }
 
                aup->phy_static_config = pd->phy_static_config;
                aup->phy_search_highest_addr = pd->phy_search_highest_addr;
index 73f8d4f..7dc508e 100644 (file)
@@ -605,7 +605,7 @@ static int lance_rx(struct net_device *dev)
                                dev->stats.rx_errors++;
                } else {
                        len = (*rds_ptr(rd, mblength, lp->type) & 0xfff) - 4;
-                       skb = dev_alloc_skb(len + 2);
+                       skb = netdev_alloc_skb(dev, len + 2);
 
                        if (skb == 0) {
                                printk("%s: Memory squeeze, deferring packet.\n",
@@ -1052,8 +1052,6 @@ static int __devinit dec_lance_probe(struct device *bdev, const int type)
 
        dev = alloc_etherdev(sizeof(struct lance_private));
        if (!dev) {
-               printk(KERN_ERR "%s: Unable to allocate etherdev, aborting.\n",
-                       name);
                ret = -ENOMEM;
                goto err_out;
        }
index 681970c..86dd957 100644 (file)
@@ -1042,7 +1042,7 @@ static int depca_rx(struct net_device *dev)
                                short len, pkt_len = readw(&lp->rx_ring[entry].msg_length) - 4;
                                struct sk_buff *skb;
 
-                               skb = dev_alloc_skb(pkt_len + 2);
+                               skb = netdev_alloc_skb(dev, pkt_len + 2);
                                if (skb != NULL) {
                                        unsigned char *buf;
                                        skb_reserve(skb, 2);    /* 16 byte align the IP header */
index 86aa0d5..4e2d68a 100644 (file)
@@ -89,7 +89,6 @@ static int __devinit hplance_init_one(struct dio_dev *d,
 {
        struct net_device *dev;
        int err = -ENOMEM;
-       int i;
 
        dev = alloc_etherdev(sizeof(struct hplance_private));
        if (!dev)
@@ -107,13 +106,8 @@ static int __devinit hplance_init_one(struct dio_dev *d,
 
        dio_set_drvdata(d, dev);
 
-       printk(KERN_INFO "%s: %s; select code %d, addr %2.2x", dev->name, d->name, d->scode, dev->dev_addr[0]);
-
-       for (i=1; i<6; i++) {
-               printk(":%2.2x", dev->dev_addr[i]);
-       }
-
-       printk(", irq %d\n", d->ipl);
+       printk(KERN_INFO "%s: %s; select code %d, addr %pM, irq %d\n",
+              dev->name, d->name, d->scode, dev->dev_addr, d->ipl);
 
        return 0;
 
index 6e6aa72..013b651 100644 (file)
@@ -621,10 +621,8 @@ static void *ni65_alloc_mem(struct net_device *dev,char *what,int size,int type)
        }
        else {
                ret = ptr = kmalloc(T_BUF_SIZE,GFP_KERNEL | GFP_DMA);
-               if(!ret) {
-                       printk(KERN_WARNING "%s: unable to allocate %s memory.\n",dev->name,what);
+               if(!ret)
                        return NULL;
-               }
        }
        if( (u32) virt_to_phys(ptr+size) > 0x1000000) {
                printk(KERN_WARNING "%s: unable to allocate %s memory in lower 16MB!\n",dev->name,what);
@@ -1091,7 +1089,7 @@ static void ni65_recv_intr(struct net_device *dev,int csr0)
                        if (skb)
                                skb_reserve(skb,16);
 #else
-                       struct sk_buff *skb = dev_alloc_skb(len+2);
+                       struct sk_buff *skb = netdev_alloc_skb(dev, len + 2);
 #endif
                        if(skb)
                        {
index 6be0dd6..ebdb9e2 100644 (file)
@@ -1104,7 +1104,7 @@ static int mace_rx(struct net_device *dev, unsigned char RxCnt)
       pr_debug("    receiving packet size 0x%X rx_status"
            " 0x%X.\n", pkt_len, rx_status);
 
-      skb = dev_alloc_skb(pkt_len+2);
+      skb = netdev_alloc_skb(dev, pkt_len + 2);
 
       if (skb != NULL) {
        skb_reserve(skb, 2);
index 20e6dab..86b6d8e 100644 (file)
@@ -588,11 +588,11 @@ static void pcnet32_realloc_rx_ring(struct net_device *dev,
        /* now allocate any new buffers needed */
        for (; new < size; new++) {
                struct sk_buff *rx_skbuff;
-               new_skb_list[new] = dev_alloc_skb(PKT_BUF_SKB);
+               new_skb_list[new] = netdev_alloc_skb(dev, PKT_BUF_SKB);
                rx_skbuff = new_skb_list[new];
                if (!rx_skbuff) {
                        /* keep the original lists and buffers */
-                       netif_err(lp, drv, dev, "%s dev_alloc_skb failed\n",
+                       netif_err(lp, drv, dev, "%s netdev_alloc_skb failed\n",
                                  __func__);
                        goto free_all_new;
                }
@@ -909,7 +909,7 @@ static int pcnet32_loopback_test(struct net_device *dev, uint64_t * data1)
        /* Initialize Transmit buffers. */
        size = data_len + 15;
        for (x = 0; x < numbuffs; x++) {
-               skb = dev_alloc_skb(size);
+               skb = netdev_alloc_skb(dev, size);
                if (!skb) {
                        netif_printk(lp, hw, KERN_DEBUG, dev,
                                     "Cannot allocate skb at line: %d!\n",
@@ -1152,7 +1152,7 @@ static void pcnet32_rx_entry(struct net_device *dev,
        if (pkt_len > rx_copybreak) {
                struct sk_buff *newskb;
 
-               newskb = dev_alloc_skb(PKT_BUF_SKB);
+               newskb = netdev_alloc_skb(dev, PKT_BUF_SKB);
                if (newskb) {
                        skb_reserve(newskb, NET_IP_ALIGN);
                        skb = lp->rx_skbuff[entry];
@@ -1172,7 +1172,7 @@ static void pcnet32_rx_entry(struct net_device *dev,
                } else
                        skb = NULL;
        } else
-               skb = dev_alloc_skb(pkt_len + NET_IP_ALIGN);
+               skb = netdev_alloc_skb(dev, pkt_len + NET_IP_ALIGN);
 
        if (skb == NULL) {
                netif_err(lp, drv, dev, "Memory squeeze, dropping packet\n");
@@ -1649,8 +1649,6 @@ pcnet32_probe1(unsigned long ioaddr, int shared, struct pci_dev *pdev)
 
        dev = alloc_etherdev(sizeof(*lp));
        if (!dev) {
-               if (pcnet32_debug & NETIF_MSG_PROBE)
-                       pr_err("Memory allocation failed\n");
                ret = -ENOMEM;
                goto err_release_region;
        }
@@ -2273,11 +2271,11 @@ static int pcnet32_init_ring(struct net_device *dev)
        for (i = 0; i < lp->rx_ring_size; i++) {
                struct sk_buff *rx_skbuff = lp->rx_skbuff[i];
                if (rx_skbuff == NULL) {
-                       lp->rx_skbuff[i] = dev_alloc_skb(PKT_BUF_SKB);
+                       lp->rx_skbuff[i] = netdev_alloc_skb(dev, PKT_BUF_SKB);
                        rx_skbuff = lp->rx_skbuff[i];
                        if (!rx_skbuff) {
                                /* there is not much we can do at this point */
-                               netif_err(lp, drv, dev, "%s dev_alloc_skb failed\n",
+                               netif_err(lp, drv, dev, "%s netdev_alloc_skb failed\n",
                                          __func__);
                                return -1;
                        }
index 080b71f..74b3891 100644 (file)
@@ -810,7 +810,7 @@ static int lance_rx( struct net_device *dev )
                                dev->stats.rx_errors++;
                        }
                        else {
-                               skb = dev_alloc_skb( pkt_len+2 );
+                               skb = netdev_alloc_skb(dev, pkt_len + 2);
                                if (skb == NULL) {
                                        DPRINTK( 1, ( "%s: Memory squeeze, deferring packet.\n",
                                                      dev->name ));
index 7ea16d3..e3fe350 100644 (file)
@@ -534,7 +534,7 @@ static void lance_rx_dvma(struct net_device *dev)
                        if (bits & LE_R1_EOP) dev->stats.rx_errors++;
                } else {
                        len = (rd->mblength & 0xfff) - 4;
-                       skb = dev_alloc_skb(len + 2);
+                       skb = netdev_alloc_skb(dev, len + 2);
 
                        if (skb == NULL) {
                                printk(KERN_INFO "%s: Memory squeeze, deferring packet.\n",
@@ -706,7 +706,7 @@ static void lance_rx_pio(struct net_device *dev)
                        if (bits & LE_R1_EOP) dev->stats.rx_errors++;
                } else {
                        len = (sbus_readw(&rd->mblength) & 0xfff) - 4;
-                       skb = dev_alloc_skb(len + 2);
+                       skb = netdev_alloc_skb(dev, len + 2);
 
                        if (skb == NULL) {
                                printk(KERN_INFO "%s: Memory squeeze, deferring packet.\n",
index d070b22..855bdaf 100644 (file)
@@ -607,8 +607,9 @@ bmac_init_tx_ring(struct bmac_data *bp)
 }
 
 static int
-bmac_init_rx_ring(struct bmac_data *bp)
+bmac_init_rx_ring(struct net_device *dev)
 {
+       struct bmac_data *bp = netdev_priv(dev);
        volatile struct dbdma_regs __iomem *rd = bp->rx_dma;
        int i;
        struct sk_buff *skb;
@@ -618,7 +619,7 @@ bmac_init_rx_ring(struct bmac_data *bp)
               (N_RX_RING + 1) * sizeof(struct dbdma_cmd));
        for (i = 0; i < N_RX_RING; i++) {
                if ((skb = bp->rx_bufs[i]) == NULL) {
-                       bp->rx_bufs[i] = skb = dev_alloc_skb(RX_BUFLEN+2);
+                       bp->rx_bufs[i] = skb = netdev_alloc_skb(dev, RX_BUFLEN + 2);
                        if (skb != NULL)
                                skb_reserve(skb, 2);
                }
@@ -722,7 +723,7 @@ static irqreturn_t bmac_rxdma_intr(int irq, void *dev_id)
                        ++dev->stats.rx_dropped;
                }
                if ((skb = bp->rx_bufs[i]) == NULL) {
-                       bp->rx_bufs[i] = skb = dev_alloc_skb(RX_BUFLEN+2);
+                       bp->rx_bufs[i] = skb = netdev_alloc_skb(dev, RX_BUFLEN + 2);
                        if (skb != NULL)
                                skb_reserve(bp->rx_bufs[i], 2);
                }
@@ -1208,7 +1209,7 @@ static void bmac_reset_and_enable(struct net_device *dev)
        spin_lock_irqsave(&bp->lock, flags);
        bmac_enable_and_reset_chip(dev);
        bmac_init_tx_ring(bp);
-       bmac_init_rx_ring(bp);
+       bmac_init_rx_ring(dev);
        bmac_init_chip(dev);
        bmac_start_chip(dev);
        bmwrite(dev, INTDISABLE, EnableNormal);
@@ -1218,7 +1219,7 @@ static void bmac_reset_and_enable(struct net_device *dev)
         * It seems that the bmac can't receive until it's transmitted
         * a packet.  So we give it a dummy packet to transmit.
         */
-       skb = dev_alloc_skb(ETHERMINPACKET);
+       skb = netdev_alloc_skb(dev, ETHERMINPACKET);
        if (skb != NULL) {
                data = skb_put(skb, ETHERMINPACKET);
                memset(data, 0, ETHERMINPACKET);
@@ -1269,10 +1270,8 @@ static int __devinit bmac_probe(struct macio_dev *mdev, const struct of_device_i
        memcpy(addr, prop_addr, sizeof(addr));
 
        dev = alloc_etherdev(PRIV_BYTES);
-       if (!dev) {
-               printk(KERN_ERR "BMAC: alloc_etherdev failed, out of memory\n");
+       if (!dev)
                return -ENOMEM;
-       }
 
        bp = netdev_priv(dev);
        SET_NETDEV_DEV(dev, &mdev->ofdev.dev);
@@ -1660,10 +1659,8 @@ static int __init bmac_init(void)
 {
        if (bmac_emergency_rxbuf == NULL) {
                bmac_emergency_rxbuf = kmalloc(RX_BUFLEN, GFP_KERNEL);
-               if (bmac_emergency_rxbuf == NULL) {
-                       printk(KERN_ERR "BMAC: can't allocate emergency RX buffer\n");
+               if (bmac_emergency_rxbuf == NULL)
                        return -ENOMEM;
-               }
        }
 
        return macio_register_driver(&bmac_driver);
index bec87bd..e1df4b7 100644 (file)
@@ -136,10 +136,8 @@ static int __devinit mace_probe(struct macio_dev *mdev, const struct of_device_i
         */
        if (dummy_buf == NULL) {
                dummy_buf = kmalloc(RX_BUFLEN+2, GFP_KERNEL);
-               if (dummy_buf == NULL) {
-                       printk(KERN_ERR "MACE: couldn't allocate dummy buffer\n");
+               if (dummy_buf == NULL)
                        return -ENOMEM;
-               }
        }
 
        if (macio_request_resources(mdev, "mace")) {
@@ -149,7 +147,6 @@ static int __devinit mace_probe(struct macio_dev *mdev, const struct of_device_i
 
        dev = alloc_etherdev(PRIV_BYTES);
        if (!dev) {
-               printk(KERN_ERR "MACE: can't allocate ethernet device !\n");
                rc = -ENOMEM;
                goto err_release;
        }
@@ -447,7 +444,7 @@ static int mace_open(struct net_device *dev)
     memset((char *)mp->rx_cmds, 0, N_RX_RING * sizeof(struct dbdma_cmd));
     cp = mp->rx_cmds;
     for (i = 0; i < N_RX_RING - 1; ++i) {
-       skb = dev_alloc_skb(RX_BUFLEN + 2);
+       skb = netdev_alloc_skb(dev, RX_BUFLEN + 2);
        if (!skb) {
            data = dummy_buf;
        } else {
@@ -959,7 +956,7 @@ static irqreturn_t mace_rxdma_intr(int irq, void *dev_id)
        cp = mp->rx_cmds + i;
        skb = mp->rx_bufs[i];
        if (!skb) {
-           skb = dev_alloc_skb(RX_BUFLEN + 2);
+           skb = netdev_alloc_skb(dev, RX_BUFLEN + 2);
            if (skb) {
                skb_reserve(skb, 2);
                mp->rx_bufs[i] = skb;
index 7cf81bb..ab7ff86 100644 (file)
@@ -661,7 +661,7 @@ static void mace_dma_rx_frame(struct net_device *dev, struct mace_frame *mf)
        } else {
                unsigned int frame_length = mf->rcvcnt + ((frame_status & 0x0F) << 8 );
 
-               skb = dev_alloc_skb(frame_length + 2);
+               skb = netdev_alloc_skb(dev, frame_length + 2);
                if (!skb) {
                        dev->stats.rx_dropped++;
                        return;
index 23f2ab0..bd1667c 100644 (file)
@@ -224,7 +224,7 @@ int atl1c_read_mac_addr(struct atl1c_hw *hw)
                random_ether_addr(hw->perm_mac_addr);
 
        memcpy(hw->mac_addr, hw->perm_mac_addr, sizeof(hw->perm_mac_addr));
-       return 0;
+       return err;
 }
 
 /*
index 1ff3c6d..0f21a9b 100644 (file)
@@ -468,6 +468,7 @@ static int atl1c_set_mac_addr(struct net_device *netdev, void *p)
 
        memcpy(netdev->dev_addr, addr->sa_data, netdev->addr_len);
        memcpy(adapter->hw.mac_addr, addr->sa_data, netdev->addr_len);
+       netdev->addr_assign_type &= ~NET_ADDR_RANDOM;
 
        atl1c_hw_set_mac_addr(&adapter->hw);
 
@@ -1765,7 +1766,7 @@ static int atl1c_alloc_rx_buffer(struct atl1c_adapter *adapter, const int ringid
        while (next_info->flags & ATL1C_BUFFER_FREE) {
                rfd_desc = ATL1C_RFD_DESC(rfd_ring, rfd_next_to_use);
 
-               skb = dev_alloc_skb(adapter->rx_buffer_len);
+               skb = netdev_alloc_skb(adapter->netdev, adapter->rx_buffer_len);
                if (unlikely(!skb)) {
                        if (netif_msg_rx_err(adapter))
                                dev_warn(&pdev->dev, "alloc rx buffer failed\n");
@@ -2685,7 +2686,6 @@ static int __devinit atl1c_probe(struct pci_dev *pdev,
        netdev = alloc_etherdev(sizeof(struct atl1c_adapter));
        if (netdev == NULL) {
                err = -ENOMEM;
-               dev_err(&pdev->dev, "etherdev alloc failed\n");
                goto err_alloc_etherdev;
        }
 
@@ -2742,10 +2742,9 @@ static int __devinit atl1c_probe(struct pci_dev *pdev,
                err = -EIO;
                goto err_reset;
        }
-       if (atl1c_read_mac_addr(&adapter->hw) != 0) {
-               err = -EIO;
-               dev_err(&pdev->dev, "get mac address failed\n");
-               goto err_eeprom;
+       if (atl1c_read_mac_addr(&adapter->hw)) {
+               /* got a random MAC address, set NET_ADDR_RANDOM to netdev */
+               netdev->addr_assign_type |= NET_ADDR_RANDOM;
        }
        memcpy(netdev->dev_addr, adapter->hw.mac_addr, netdev->addr_len);
        memcpy(netdev->perm_addr, adapter->hw.mac_addr, netdev->addr_len);
@@ -2770,7 +2769,6 @@ static int __devinit atl1c_probe(struct pci_dev *pdev,
 err_reset:
 err_register:
 err_sw_init:
-err_eeprom:
        iounmap(adapter->hw.hw_addr);
 err_init_netdev:
 err_ioremap:
index c915c08..93ff2b2 100644 (file)
@@ -2300,7 +2300,6 @@ static int __devinit atl1e_probe(struct pci_dev *pdev,
        netdev = alloc_etherdev(sizeof(struct atl1e_adapter));
        if (netdev == NULL) {
                err = -ENOMEM;
-               dev_err(&pdev->dev, "etherdev alloc failed\n");
                goto err_alloc_etherdev;
        }
 
index 9bd2049..40ac414 100644 (file)
@@ -534,14 +534,17 @@ static int atl1_get_permanent_address(struct atl1_hw *hw)
  */
 static s32 atl1_read_mac_addr(struct atl1_hw *hw)
 {
+       s32 ret = 0;
        u16 i;
 
-       if (atl1_get_permanent_address(hw))
+       if (atl1_get_permanent_address(hw)) {
                random_ether_addr(hw->perm_mac_addr);
+               ret = 1;
+       }
 
        for (i = 0; i < ETH_ALEN; i++)
                hw->mac_addr[i] = hw->perm_mac_addr[i];
-       return 0;
+       return ret;
 }
 
 /*
@@ -3007,7 +3010,10 @@ static int __devinit atl1_probe(struct pci_dev *pdev,
        }
 
        /* copy the MAC address out of the EEPROM */
-       atl1_read_mac_addr(&adapter->hw);
+       if (atl1_read_mac_addr(&adapter->hw)) {
+               /* mark random mac */
+               netdev->addr_assign_type |= NET_ADDR_RANDOM;
+       }
        memcpy(netdev->dev_addr, adapter->hw.mac_addr, netdev->addr_len);
 
        if (!is_valid_ether_addr(netdev->dev_addr)) {
index 8ff7411..3cd8837 100644 (file)
@@ -84,6 +84,7 @@ static int atlx_set_mac(struct net_device *netdev, void *p)
 
        memcpy(netdev->dev_addr, addr->sa_data, netdev->addr_len);
        memcpy(adapter->hw.mac_addr, addr->sa_data, netdev->addr_len);
+       netdev->addr_assign_type &= ~NET_ADDR_RANDOM;
 
        atlx_set_mac_addr(&adapter->hw);
        return 0;
index cab8745..46b8b7d 100644 (file)
@@ -2138,7 +2138,6 @@ static int __devinit b44_init_one(struct ssb_device *sdev,
 
        dev = alloc_etherdev(sizeof(*bp));
        if (!dev) {
-               dev_err(sdev->dev, "Etherdev alloc failed, aborting\n");
                err = -ENOMEM;
                goto out;
        }
index 021fb81..8297e28 100644 (file)
@@ -2625,10 +2625,8 @@ bnx2_alloc_bad_rbuf(struct bnx2 *bp)
        u32 val;
 
        good_mbuf = kmalloc(512 * sizeof(u16), GFP_KERNEL);
-       if (good_mbuf == NULL) {
-               pr_err("Failed to allocate memory in %s\n", __func__);
+       if (good_mbuf == NULL)
                return -ENOMEM;
-       }
 
        REG_WR(bp, BNX2_MISC_ENABLE_SET_BITS,
                BNX2_MISC_ENABLE_SET_BITS_RX_MBUF_ENABLE);
@@ -6248,7 +6246,16 @@ static int
 bnx2_setup_int_mode(struct bnx2 *bp, int dis_msi)
 {
        int cpus = num_online_cpus();
-       int msix_vecs = min(cpus + 1, RX_MAX_RINGS);
+       int msix_vecs;
+
+       if (!bp->num_req_rx_rings)
+               msix_vecs = max(cpus + 1, bp->num_req_tx_rings);
+       else if (!bp->num_req_tx_rings)
+               msix_vecs = max(cpus, bp->num_req_rx_rings);
+       else
+               msix_vecs = max(bp->num_req_rx_rings, bp->num_req_tx_rings);
+
+       msix_vecs = min(msix_vecs, RX_MAX_RINGS);
 
        bp->irq_tbl[0].handler = bnx2_interrupt;
        strcpy(bp->irq_tbl[0].name, bp->dev->name);
@@ -6272,10 +6279,18 @@ bnx2_setup_int_mode(struct bnx2 *bp, int dis_msi)
                }
        }
 
-       bp->num_tx_rings = rounddown_pow_of_two(bp->irq_nvecs);
+       if (!bp->num_req_tx_rings)
+               bp->num_tx_rings = rounddown_pow_of_two(bp->irq_nvecs);
+       else
+               bp->num_tx_rings = min(bp->irq_nvecs, bp->num_req_tx_rings);
+
+       if (!bp->num_req_rx_rings)
+               bp->num_rx_rings = bp->irq_nvecs;
+       else
+               bp->num_rx_rings = min(bp->irq_nvecs, bp->num_req_rx_rings);
+
        netif_set_real_num_tx_queues(bp->dev, bp->num_tx_rings);
 
-       bp->num_rx_rings = bp->irq_nvecs;
        return netif_set_real_num_rx_queues(bp->dev, bp->num_rx_rings);
 }
 
@@ -6550,6 +6565,9 @@ bnx2_start_xmit(struct sk_buff *skb, struct net_device *dev)
        }
        txbd->tx_bd_vlan_tag_flags |= TX_BD_FLAGS_END;
 
+       /* Sync BD data before updating TX mailbox */
+       wmb();
+
        netdev_tx_sent_queue(txq, skb->len);
 
        prod = NEXT_TX_BD(prod);
@@ -7164,7 +7182,7 @@ bnx2_get_ringparam(struct net_device *dev, struct ethtool_ringparam *ering)
 }
 
 static int
-bnx2_change_ring_size(struct bnx2 *bp, u32 rx, u32 tx)
+bnx2_change_ring_size(struct bnx2 *bp, u32 rx, u32 tx, bool reset_irq)
 {
        if (netif_running(bp->dev)) {
                /* Reset will erase chipset stats; save them */
@@ -7172,7 +7190,12 @@ bnx2_change_ring_size(struct bnx2 *bp, u32 rx, u32 tx)
 
                bnx2_netif_stop(bp, true);
                bnx2_reset_chip(bp, BNX2_DRV_MSG_CODE_RESET);
-               __bnx2_free_irq(bp);
+               if (reset_irq) {
+                       bnx2_free_irq(bp);
+                       bnx2_del_napi(bp);
+               } else {
+                       __bnx2_free_irq(bp);
+               }
                bnx2_free_skbs(bp);
                bnx2_free_mem(bp);
        }
@@ -7181,9 +7204,16 @@ bnx2_change_ring_size(struct bnx2 *bp, u32 rx, u32 tx)
        bp->tx_ring_size = tx;
 
        if (netif_running(bp->dev)) {
-               int rc;
+               int rc = 0;
+
+               if (reset_irq) {
+                       rc = bnx2_setup_int_mode(bp, disable_msi);
+                       bnx2_init_napi(bp);
+               }
+
+               if (!rc)
+                       rc = bnx2_alloc_mem(bp);
 
-               rc = bnx2_alloc_mem(bp);
                if (!rc)
                        rc = bnx2_request_irq(bp);
 
@@ -7219,7 +7249,8 @@ bnx2_set_ringparam(struct net_device *dev, struct ethtool_ringparam *ering)
 
                return -EINVAL;
        }
-       rc = bnx2_change_ring_size(bp, ering->rx_pending, ering->tx_pending);
+       rc = bnx2_change_ring_size(bp, ering->rx_pending, ering->tx_pending,
+                                  false);
        return rc;
 }
 
@@ -7607,6 +7638,54 @@ bnx2_set_features(struct net_device *dev, netdev_features_t features)
        return 0;
 }
 
+static void bnx2_get_channels(struct net_device *dev,
+                             struct ethtool_channels *channels)
+{
+       struct bnx2 *bp = netdev_priv(dev);
+       u32 max_rx_rings = 1;
+       u32 max_tx_rings = 1;
+
+       if ((bp->flags & BNX2_FLAG_MSIX_CAP) && !disable_msi) {
+               max_rx_rings = RX_MAX_RINGS;
+               max_tx_rings = TX_MAX_RINGS;
+       }
+
+       channels->max_rx = max_rx_rings;
+       channels->max_tx = max_tx_rings;
+       channels->max_other = 0;
+       channels->max_combined = 0;
+       channels->rx_count = bp->num_rx_rings;
+       channels->tx_count = bp->num_tx_rings;
+       channels->other_count = 0;
+       channels->combined_count = 0;
+}
+
+static int bnx2_set_channels(struct net_device *dev,
+                             struct ethtool_channels *channels)
+{
+       struct bnx2 *bp = netdev_priv(dev);
+       u32 max_rx_rings = 1;
+       u32 max_tx_rings = 1;
+       int rc = 0;
+
+       if ((bp->flags & BNX2_FLAG_MSIX_CAP) && !disable_msi) {
+               max_rx_rings = RX_MAX_RINGS;
+               max_tx_rings = TX_MAX_RINGS;
+       }
+       if (channels->rx_count > max_rx_rings ||
+           channels->tx_count > max_tx_rings)
+               return -EINVAL;
+
+       bp->num_req_rx_rings = channels->rx_count;
+       bp->num_req_tx_rings = channels->tx_count;
+
+       if (netif_running(dev))
+               rc = bnx2_change_ring_size(bp, bp->rx_ring_size,
+                                          bp->tx_ring_size, true);
+
+       return rc;
+}
+
 static const struct ethtool_ops bnx2_ethtool_ops = {
        .get_settings           = bnx2_get_settings,
        .set_settings           = bnx2_set_settings,
@@ -7631,6 +7710,8 @@ static const struct ethtool_ops bnx2_ethtool_ops = {
        .set_phys_id            = bnx2_set_phys_id,
        .get_ethtool_stats      = bnx2_get_ethtool_stats,
        .get_sset_count         = bnx2_get_sset_count,
+       .get_channels           = bnx2_get_channels,
+       .set_channels           = bnx2_set_channels,
 };
 
 /* Called with rtnl_lock */
@@ -7692,7 +7773,7 @@ bnx2_change_mac_addr(struct net_device *dev, void *p)
        struct bnx2 *bp = netdev_priv(dev);
 
        if (!is_valid_ether_addr(addr->sa_data))
-               return -EINVAL;
+               return -EADDRNOTAVAIL;
 
        memcpy(dev->dev_addr, addr->sa_data, dev->addr_len);
        if (netif_running(dev))
@@ -7712,7 +7793,8 @@ bnx2_change_mtu(struct net_device *dev, int new_mtu)
                return -EINVAL;
 
        dev->mtu = new_mtu;
-       return bnx2_change_ring_size(bp, bp->rx_ring_size, bp->tx_ring_size);
+       return bnx2_change_ring_size(bp, bp->rx_ring_size, bp->tx_ring_size,
+                                    false);
 }
 
 #ifdef CONFIG_NET_POLL_CONTROLLER
index 1db2d51..dc06bda 100644 (file)
@@ -6933,6 +6933,9 @@ struct bnx2 {
        u8                      num_tx_rings;
        u8                      num_rx_rings;
 
+       int                     num_req_tx_rings;
+       int                     num_req_rx_rings;
+
        u32                     leds_save;
        u32                     idle_chk_status_idx;
 
index 8c73d34..c0cf313 100644 (file)
@@ -1,6 +1,6 @@
 /* bnx2x.h: Broadcom Everest network driver.
  *
- * Copyright (c) 2007-2011 Broadcom Corporation
+ * Copyright (c) 2007-2012 Broadcom Corporation
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -23,8 +23,8 @@
  * (you will need to reboot afterwards) */
 /* #define BNX2X_STOP_ON_ERROR */
 
-#define DRV_MODULE_VERSION      "1.70.35-0"
-#define DRV_MODULE_RELDATE      "2011/11/10"
+#define DRV_MODULE_VERSION      "1.72.10-0"
+#define DRV_MODULE_RELDATE      "2012/02/20"
 #define BNX2X_BC_VER            0x040200
 
 #if defined(CONFIG_DCB)
@@ -341,6 +341,7 @@ union db_prod {
 #define SGE_PAGE_SIZE          PAGE_SIZE
 #define SGE_PAGE_SHIFT         PAGE_SHIFT
 #define SGE_PAGE_ALIGN(addr)   PAGE_ALIGN((typeof(PAGE_SIZE))(addr))
+#define SGE_PAGES              (SGE_PAGE_SIZE * PAGES_PER_SGE)
 
 /* SGE ring related macros */
 #define NUM_RX_SGE_PAGES       2
@@ -445,6 +446,8 @@ struct bnx2x_agg_info {
        u16                     vlan_tag;
        u16                     len_on_bd;
        u32                     rxhash;
+       u16                     gro_size;
+       u16                     full_page;
 };
 
 #define Q_STATS_OFFSET32(stat_name) \
@@ -473,6 +476,11 @@ struct bnx2x_fp_txdata {
        int                     txq_index;
 };
 
+enum bnx2x_tpa_mode_t {
+       TPA_MODE_LRO,
+       TPA_MODE_GRO
+};
+
 struct bnx2x_fastpath {
        struct bnx2x            *bp; /* parent */
 
@@ -489,6 +497,8 @@ struct bnx2x_fastpath {
 
        dma_addr_t              status_blk_mapping;
 
+       enum bnx2x_tpa_mode_t   mode;
+
        u8                      max_cos; /* actual number of active tx coses */
        struct bnx2x_fp_txdata  txdata[BNX2X_MULTI_TX_COS];
 
@@ -540,6 +550,7 @@ struct bnx2x_fastpath {
        struct ustorm_per_queue_stats old_uclient;
        struct xstorm_per_queue_stats old_xclient;
        struct bnx2x_eth_q_stats eth_q_stats;
+       struct bnx2x_eth_q_stats_old eth_q_stats_old;
 
        /* The size is calculated using the following:
             sizeof name field from netdev structure +
@@ -1046,7 +1057,6 @@ struct bnx2x_slowpath {
        struct nig_stats                nig_stats;
        struct host_port_stats          port_stats;
        struct host_func_stats          func_stats;
-       struct host_func_stats          func_stats_base;
 
        u32                             wb_comp;
        u32                             wb_data[4];
@@ -1088,7 +1098,8 @@ enum bnx2x_recovery_state {
        BNX2X_RECOVERY_DONE,
        BNX2X_RECOVERY_INIT,
        BNX2X_RECOVERY_WAIT,
-       BNX2X_RECOVERY_FAILED
+       BNX2X_RECOVERY_FAILED,
+       BNX2X_RECOVERY_NIC_LOADING
 };
 
 /*
@@ -1198,6 +1209,9 @@ struct bnx2x {
 #define ETH_MIN_PACKET_SIZE            60
 #define ETH_MAX_PACKET_SIZE            1500
 #define ETH_MAX_JUMBO_PACKET_SIZE      9600
+/* TCP with Timestamp Option (32) + IPv6 (40) */
+#define ETH_MAX_TPA_HEADER_SIZE                72
+#define ETH_MIN_TPA_HEADER_SIZE                40
 
        /* Max supported alignment is 256 (8 shift) */
 #define BNX2X_RX_ALIGN_SHIFT           min(8, L1_CACHE_SHIFT)
@@ -1268,6 +1282,7 @@ struct bnx2x {
 #define NO_MCP_FLAG                    (1 << 9)
 
 #define BP_NOMCP(bp)                   (bp->flags & NO_MCP_FLAG)
+#define GRO_ENABLE_FLAG                        (1 << 10)
 #define MF_FUNC_DIS                    (1 << 11)
 #define OWN_CNIC_IRQ                   (1 << 12)
 #define NO_ISCSI_OOO_FLAG              (1 << 13)
@@ -1316,6 +1331,8 @@ struct bnx2x {
 
        u8                      wol;
 
+       bool                    gro_check;
+
        int                     rx_ring_size;
 
        u16                     tx_quick_cons_trip_int;
@@ -1461,6 +1478,10 @@ struct bnx2x {
 
        u16                     stats_counter;
        struct bnx2x_eth_stats  eth_stats;
+       struct bnx2x_eth_stats_old      eth_stats_old;
+       struct bnx2x_net_stats_old      net_stats_old;
+       struct bnx2x_fw_port_stats_old  fw_stats_old;
+       bool                    stats_init;
 
        struct z_stream_s       *strm;
        void                    *gunzip_buf;
@@ -2073,8 +2094,6 @@ static inline u32 reg_poll(struct bnx2x *bp, u32 reg, u32 expected, int ms,
 #define BNX2X_VPD_LEN                  128
 #define VENDOR_ID_LEN                  4
 
-int bnx2x_close(struct net_device *dev);
-
 /* Congestion management fairness mode */
 #define CMNG_FNS_NONE          0
 #define CMNG_FNS_MINMAX                1
index 7aee469..f82dfff 100644 (file)
@@ -1,6 +1,6 @@
 /* bnx2x_cmn.c: Broadcom Everest network driver.
  *
- * Copyright (c) 2007-2011 Broadcom Corporation
+ * Copyright (c) 2007-2012 Broadcom Corporation
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
 
 
 /**
- * bnx2x_bz_fp - zero content of the fastpath structure.
- *
- * @bp:                driver handle
- * @index:     fastpath index to be zeroed
- *
- * Makes sure the contents of the bp->fp[index].napi is kept
- * intact.
- */
-static inline void bnx2x_bz_fp(struct bnx2x *bp, int index)
-{
-       struct bnx2x_fastpath *fp = &bp->fp[index];
-       struct napi_struct orig_napi = fp->napi;
-       /* bzero bnx2x_fastpath contents */
-       memset(fp, 0, sizeof(*fp));
-
-       /* Restore the NAPI object as it has been already initialized */
-       fp->napi = orig_napi;
-
-       fp->bp = bp;
-       fp->index = index;
-       if (IS_ETH_FP(fp))
-               fp->max_cos = bp->max_cos;
-       else
-               /* Special queues support only one CoS */
-               fp->max_cos = 1;
-
-       /*
-        * set the tpa flag for each queue. The tpa flag determines the queue
-        * minimal size so it must be set prior to queue memory allocation
-        */
-       fp->disable_tpa = ((bp->flags & TPA_ENABLE_FLAG) == 0);
-
-#ifdef BCM_CNIC
-       /* We don't want TPA on an FCoE L2 ring */
-       if (IS_FCOE_FP(fp))
-               fp->disable_tpa = 1;
-#endif
-}
-
-/**
  * bnx2x_move_fp - move content of the fastpath structure.
  *
  * @bp:                driver handle
@@ -249,13 +209,11 @@ static inline void bnx2x_update_last_max_sge(struct bnx2x_fastpath *fp,
                fp->last_max_sge = idx;
 }
 
-static void bnx2x_update_sge_prod(struct bnx2x_fastpath *fp,
-                                 struct eth_fast_path_rx_cqe *fp_cqe)
+static inline void bnx2x_update_sge_prod(struct bnx2x_fastpath *fp,
+                                        u16 sge_len,
+                                        struct eth_end_agg_rx_cqe *cqe)
 {
        struct bnx2x *bp = fp->bp;
-       u16 sge_len = SGE_PAGE_ALIGN(le16_to_cpu(fp_cqe->pkt_len) -
-                                    le16_to_cpu(fp_cqe->len_on_bd)) >>
-                     SGE_PAGE_SHIFT;
        u16 last_max, last_elem, first_elem;
        u16 delta = 0;
        u16 i;
@@ -266,15 +224,15 @@ static void bnx2x_update_sge_prod(struct bnx2x_fastpath *fp,
        /* First mark all used pages */
        for (i = 0; i < sge_len; i++)
                BIT_VEC64_CLEAR_BIT(fp->sge_mask,
-                       RX_SGE(le16_to_cpu(fp_cqe->sgl_or_raw_data.sgl[i])));
+                       RX_SGE(le16_to_cpu(cqe->sgl_or_raw_data.sgl[i])));
 
        DP(NETIF_MSG_RX_STATUS, "fp_cqe->sgl[%d] = %d\n",
-          sge_len - 1, le16_to_cpu(fp_cqe->sgl_or_raw_data.sgl[sge_len - 1]));
+          sge_len - 1, le16_to_cpu(cqe->sgl_or_raw_data.sgl[sge_len - 1]));
 
        /* Here we assume that the last SGE index is the biggest */
        prefetch((void *)(fp->sge_mask));
        bnx2x_update_last_max_sge(fp,
-               le16_to_cpu(fp_cqe->sgl_or_raw_data.sgl[sge_len - 1]));
+               le16_to_cpu(cqe->sgl_or_raw_data.sgl[sge_len - 1]));
 
        last_max = RX_SGE(fp->last_max_sge);
        last_elem = last_max >> BIT_VEC64_ELEM_SHIFT;
@@ -368,6 +326,22 @@ static void bnx2x_tpa_start(struct bnx2x_fastpath *fp, u16 queue,
        tpa_info->len_on_bd = le16_to_cpu(cqe->len_on_bd);
        tpa_info->placement_offset = cqe->placement_offset;
        tpa_info->rxhash = bnx2x_get_rxhash(bp, cqe);
+       if (fp->mode == TPA_MODE_GRO) {
+               u16 gro_size = le16_to_cpu(cqe->pkt_len_or_gro_seg_len);
+               tpa_info->full_page =
+                       SGE_PAGE_SIZE * PAGES_PER_SGE / gro_size * gro_size;
+               /*
+                * FW 7.2.16 BUG workaround:
+                * if SGE size is (exactly) multiple gro_size
+                * fw will place one less frag on SGE.
+                * the calculation is done only for potentially
+                * dangerous MTUs.
+                */
+               if (unlikely(bp->gro_check))
+                       if (!(SGE_PAGE_SIZE * PAGES_PER_SGE % gro_size))
+                               tpa_info->full_page -= gro_size;
+               tpa_info->gro_size = gro_size;
+       }
 
 #ifdef BNX2X_STOP_ON_ERROR
        fp->tpa_queue_used |= (1 << queue);
@@ -424,25 +398,40 @@ static inline u16 bnx2x_set_lro_mss(struct bnx2x *bp, u16 parsing_flags,
 }
 
 static int bnx2x_fill_frag_skb(struct bnx2x *bp, struct bnx2x_fastpath *fp,
-                              u16 queue, struct sk_buff *skb,
+                              struct bnx2x_agg_info *tpa_info,
+                              u16 pages,
+                              struct sk_buff *skb,
                               struct eth_end_agg_rx_cqe *cqe,
                               u16 cqe_idx)
 {
        struct sw_rx_page *rx_pg, old_rx_pg;
-       u32 i, frag_len, frag_size, pages;
-       int err;
-       int j;
-       struct bnx2x_agg_info *tpa_info = &fp->tpa_info[queue];
+       u32 i, frag_len, frag_size;
+       int err, j, frag_id = 0;
        u16 len_on_bd = tpa_info->len_on_bd;
+       u16 full_page = 0, gro_size = 0;
 
        frag_size = le16_to_cpu(cqe->pkt_len) - len_on_bd;
-       pages = SGE_PAGE_ALIGN(frag_size) >> SGE_PAGE_SHIFT;
+
+       if (fp->mode == TPA_MODE_GRO) {
+               gro_size = tpa_info->gro_size;
+               full_page = tpa_info->full_page;
+       }
 
        /* This is needed in order to enable forwarding support */
-       if (frag_size)
+       if (frag_size) {
                skb_shinfo(skb)->gso_size = bnx2x_set_lro_mss(bp,
                                        tpa_info->parsing_flags, len_on_bd);
 
+               /* set for GRO */
+               if (fp->mode == TPA_MODE_GRO)
+                       skb_shinfo(skb)->gso_type =
+                           (GET_FLAG(tpa_info->parsing_flags,
+                                     PARSING_FLAGS_OVER_ETHERNET_PROTOCOL) ==
+                                               PRS_FLAG_OVERETH_IPV6) ?
+                               SKB_GSO_TCPV6 : SKB_GSO_TCPV4;
+       }
+
+
 #ifdef BNX2X_STOP_ON_ERROR
        if (pages > min_t(u32, 8, MAX_SKB_FRAGS)*SGE_PAGE_SIZE*PAGES_PER_SGE) {
                BNX2X_ERR("SGL length is too long: %d. CQE index is %d\n",
@@ -459,7 +448,12 @@ static int bnx2x_fill_frag_skb(struct bnx2x *bp, struct bnx2x_fastpath *fp,
 
                /* FW gives the indices of the SGE as if the ring is an array
                   (meaning that "next" element will consume 2 indices) */
-               frag_len = min(frag_size, (u32)(SGE_PAGE_SIZE*PAGES_PER_SGE));
+               if (fp->mode == TPA_MODE_GRO)
+                       frag_len = min_t(u32, frag_size, (u32)full_page);
+               else /* LRO */
+                       frag_len = min_t(u32, frag_size,
+                                        (u32)(SGE_PAGE_SIZE * PAGES_PER_SGE));
+
                rx_pg = &fp->rx_page_ring[sge_idx];
                old_rx_pg = *rx_pg;
 
@@ -475,9 +469,21 @@ static int bnx2x_fill_frag_skb(struct bnx2x *bp, struct bnx2x_fastpath *fp,
                dma_unmap_page(&bp->pdev->dev,
                               dma_unmap_addr(&old_rx_pg, mapping),
                               SGE_PAGE_SIZE*PAGES_PER_SGE, DMA_FROM_DEVICE);
-
                /* Add one frag and update the appropriate fields in the skb */
-               skb_fill_page_desc(skb, j, old_rx_pg.page, 0, frag_len);
+               if (fp->mode == TPA_MODE_LRO)
+                       skb_fill_page_desc(skb, j, old_rx_pg.page, 0, frag_len);
+               else { /* GRO */
+                       int rem;
+                       int offset = 0;
+                       for (rem = frag_len; rem > 0; rem -= gro_size) {
+                               int len = rem > gro_size ? gro_size : rem;
+                               skb_fill_page_desc(skb, frag_id++,
+                                                  old_rx_pg.page, offset, len);
+                               if (offset)
+                                       get_page(old_rx_pg.page);
+                               offset += len;
+                       }
+               }
 
                skb->data_len += frag_len;
                skb->truesize += SGE_PAGE_SIZE * PAGES_PER_SGE;
@@ -489,18 +495,17 @@ static int bnx2x_fill_frag_skb(struct bnx2x *bp, struct bnx2x_fastpath *fp,
        return 0;
 }
 
-static void bnx2x_tpa_stop(struct bnx2x *bp, struct bnx2x_fastpath *fp,
-                          u16 queue, struct eth_end_agg_rx_cqe *cqe,
-                          u16 cqe_idx)
+static inline void bnx2x_tpa_stop(struct bnx2x *bp, struct bnx2x_fastpath *fp,
+                                 struct bnx2x_agg_info *tpa_info,
+                                 u16 pages,
+                                 struct eth_end_agg_rx_cqe *cqe,
+                                 u16 cqe_idx)
 {
-       struct bnx2x_agg_info *tpa_info = &fp->tpa_info[queue];
        struct sw_rx_bd *rx_buf = &tpa_info->first_buf;
-       u32 pad = tpa_info->placement_offset;
+       u8 pad = tpa_info->placement_offset;
        u16 len = tpa_info->len_on_bd;
        struct sk_buff *skb = NULL;
-       u8 *data = rx_buf->data;
-       /* alloc new skb */
-       u8 *new_data;
+       u8 *new_data, *data = rx_buf->data;
        u8 old_tpa_state = tpa_info->tpa_state;
 
        tpa_info->tpa_state = BNX2X_TPA_STOP;
@@ -540,7 +545,8 @@ static void bnx2x_tpa_stop(struct bnx2x *bp, struct bnx2x_fastpath *fp,
                skb->protocol = eth_type_trans(skb, bp->dev);
                skb->ip_summed = CHECKSUM_UNNECESSARY;
 
-               if (!bnx2x_fill_frag_skb(bp, fp, queue, skb, cqe, cqe_idx)) {
+               if (!bnx2x_fill_frag_skb(bp, fp, tpa_info, pages,
+                                        skb, cqe, cqe_idx)) {
                        if (tpa_info->parsing_flags & PARSING_FLAGS_VLAN)
                                __vlan_hwaccel_put_tag(skb, tpa_info->vlan_tag);
                        napi_gro_receive(&fp->napi, skb);
@@ -605,7 +611,7 @@ int bnx2x_rx_int(struct bnx2x_fastpath *fp, int budget)
                struct eth_fast_path_rx_cqe *cqe_fp;
                u8 cqe_fp_flags;
                enum eth_rx_cqe_type cqe_fp_type;
-               u16 len, pad;
+               u16 len, pad, queue;
                u8 *data;
 
 #ifdef BNX2X_STOP_ON_ERROR
@@ -626,17 +632,21 @@ int bnx2x_rx_int(struct bnx2x_fastpath *fp, int budget)
                   "  queue %x  vlan %x  len %u\n", CQE_TYPE(cqe_fp_flags),
                   cqe_fp_flags, cqe_fp->status_flags,
                   le32_to_cpu(cqe_fp->rss_hash_result),
-                  le16_to_cpu(cqe_fp->vlan_tag), le16_to_cpu(cqe_fp->pkt_len));
+                  le16_to_cpu(cqe_fp->vlan_tag),
+                  le16_to_cpu(cqe_fp->pkt_len_or_gro_seg_len));
 
                /* is this a slowpath msg? */
                if (unlikely(CQE_TYPE_SLOW(cqe_fp_type))) {
                        bnx2x_sp_event(fp, cqe);
                        goto next_cqe;
                }
+
                rx_buf = &fp->rx_buf_ring[bd_cons];
                data = rx_buf->data;
 
                if (!CQE_TYPE_FAST(cqe_fp_type)) {
+                       struct bnx2x_agg_info *tpa_info;
+                       u16 frag_size, pages;
 #ifdef BNX2X_STOP_ON_ERROR
                        /* sanity check */
                        if (fp->disable_tpa &&
@@ -656,28 +666,38 @@ int bnx2x_rx_int(struct bnx2x_fastpath *fp, int budget)
                                bnx2x_tpa_start(fp, queue,
                                                bd_cons, bd_prod,
                                                cqe_fp);
+
                                goto next_rx;
-                       } else {
-                               u16 queue =
-                                       cqe->end_agg_cqe.queue_index;
-                               DP(NETIF_MSG_RX_STATUS,
-                                  "calling tpa_stop on queue %d\n",
-                                  queue);
 
-                               bnx2x_tpa_stop(bp, fp, queue,
-                                              &cqe->end_agg_cqe,
-                                              comp_ring_cons);
+                       }
+                       queue = cqe->end_agg_cqe.queue_index;
+                       tpa_info = &fp->tpa_info[queue];
+                       DP(NETIF_MSG_RX_STATUS,
+                          "calling tpa_stop on queue %d\n",
+                          queue);
+
+                       frag_size = le16_to_cpu(cqe->end_agg_cqe.pkt_len) -
+                                   tpa_info->len_on_bd;
+
+                       if (fp->mode == TPA_MODE_GRO)
+                               pages = (frag_size + tpa_info->full_page - 1) /
+                                        tpa_info->full_page;
+                       else
+                               pages = SGE_PAGE_ALIGN(frag_size) >>
+                                       SGE_PAGE_SHIFT;
+
+                       bnx2x_tpa_stop(bp, fp, tpa_info, pages,
+                                      &cqe->end_agg_cqe, comp_ring_cons);
 #ifdef BNX2X_STOP_ON_ERROR
-                               if (bp->panic)
-                                       return 0;
+                       if (bp->panic)
+                               return 0;
 #endif
 
-                               bnx2x_update_sge_prod(fp, cqe_fp);
-                               goto next_cqe;
-                       }
+                       bnx2x_update_sge_prod(fp, pages, &cqe->end_agg_cqe);
+                       goto next_cqe;
                }
                /* non TPA */
-               len = le16_to_cpu(cqe_fp->pkt_len);
+               len = le16_to_cpu(cqe_fp->pkt_len_or_gro_seg_len);
                pad = cqe_fp->placement_offset;
                dma_sync_single_for_cpu(&bp->pdev->dev,
                                        dma_unmap_addr(rx_buf, mapping),
@@ -1766,12 +1786,27 @@ int bnx2x_nic_load(struct bnx2x *bp, int load_mode)
 
        bnx2x_napi_enable(bp);
 
+       /* set pf load just before approaching the MCP */
+       bnx2x_set_pf_load(bp);
+
        /* Send LOAD_REQUEST command to MCP
         * Returns the type of LOAD command:
         * if it is the first port to be initialized
         * common blocks should be initialized, otherwise - not
         */
        if (!BP_NOMCP(bp)) {
+               /* init fw_seq */
+               bp->fw_seq =
+                       (SHMEM_RD(bp, func_mb[BP_FW_MB_IDX(bp)].drv_mb_header) &
+                        DRV_MSG_SEQ_NUMBER_MASK);
+               BNX2X_DEV_INFO("fw_seq 0x%08x\n", bp->fw_seq);
+
+               /* Get current FW pulse sequence */
+               bp->fw_drv_pulse_wr_seq =
+                       (SHMEM_RD(bp, func_mb[BP_FW_MB_IDX(bp)].drv_pulse_mb) &
+                        DRV_PULSE_SEQ_MASK);
+               BNX2X_DEV_INFO("drv_pulse 0x%x\n", bp->fw_drv_pulse_wr_seq);
+
                load_code = bnx2x_fw_command(bp, DRV_MSG_CODE_LOAD_REQ, 0);
                if (!load_code) {
                        BNX2X_ERR("MCP response failure, aborting\n");
@@ -1782,6 +1817,29 @@ int bnx2x_nic_load(struct bnx2x *bp, int load_mode)
                        rc = -EBUSY; /* other port in diagnostic mode */
                        LOAD_ERROR_EXIT(bp, load_error1);
                }
+               if (load_code != FW_MSG_CODE_DRV_LOAD_COMMON_CHIP &&
+                   load_code != FW_MSG_CODE_DRV_LOAD_COMMON) {
+                       /* build FW version dword */
+                       u32 my_fw = (BCM_5710_FW_MAJOR_VERSION) +
+                                       (BCM_5710_FW_MINOR_VERSION << 8) +
+                                       (BCM_5710_FW_REVISION_VERSION << 16) +
+                                       (BCM_5710_FW_ENGINEERING_VERSION << 24);
+
+                       /* read loaded FW from chip */
+                       u32 loaded_fw = REG_RD(bp, XSEM_REG_PRAM);
+
+                       DP(BNX2X_MSG_SP, "loaded fw %x, my fw %x",
+                          loaded_fw, my_fw);
+
+                       /* abort nic load if version mismatch */
+                       if (my_fw != loaded_fw) {
+                               BNX2X_ERR("bnx2x with FW %x already loaded, "
+                                         "which mismatches my %x FW. aborting",
+                                         loaded_fw, my_fw);
+                               rc = -EBUSY;
+                               LOAD_ERROR_EXIT(bp, load_error2);
+                       }
+               }
 
        } else {
                int path = BP_PATH(bp);
@@ -1948,7 +2006,6 @@ int bnx2x_nic_load(struct bnx2x *bp, int load_mode)
        if (bp->state == BNX2X_STATE_OPEN)
                bnx2x_cnic_notify(bp, CNIC_CTL_START_CMD);
 #endif
-       bnx2x_inc_load_cnt(bp);
 
        /* Wait for all pending SP commands to complete */
        if (!bnx2x_wait_sp_comp(bp, ~0x0UL)) {
@@ -1988,6 +2045,8 @@ load_error2:
        bp->port.pmf = 0;
 load_error1:
        bnx2x_napi_disable(bp);
+       /* clear pf_load status, as it was already set */
+       bnx2x_clear_pf_load(bp);
 load_error0:
        bnx2x_free_mem(bp);
 
@@ -2045,6 +2104,7 @@ int bnx2x_nic_unload(struct bnx2x *bp, int unload_mode)
        bnx2x_drv_pulse(bp);
 
        bnx2x_stats_handle(bp, STATS_EVENT_STOP);
+       bnx2x_save_statistics(bp);
 
        /* Cleanup the chip if needed */
        if (unload_mode != UNLOAD_RECOVERY)
@@ -2108,7 +2168,7 @@ int bnx2x_nic_unload(struct bnx2x *bp, int unload_mode)
        /* The last driver must disable a "close the gate" if there is no
         * parity attention or "process kill" pending.
         */
-       if (!bnx2x_dec_load_cnt(bp) && bnx2x_reset_is_done(bp, BP_PATH(bp)))
+       if (!bnx2x_clear_pf_load(bp) && bnx2x_reset_is_done(bp, BP_PATH(bp)))
                bnx2x_disable_close_the_gate(bp);
 
        return 0;
@@ -3007,6 +3067,7 @@ int bnx2x_change_mac_addr(struct net_device *dev, void *p)
                        return rc;
        }
 
+       dev->addr_assign_type &= ~NET_ADDR_RANDOM;
        memcpy(dev->dev_addr, addr->sa_data, dev->addr_len);
 
        if (netif_running(dev))
@@ -3122,9 +3183,16 @@ static int bnx2x_alloc_fp_mem_at(struct bnx2x *bp, int index)
        } else
 #endif
        if (!bp->rx_ring_size) {
+               u32 cfg = SHMEM_RD(bp,
+                            dev_info.port_hw_config[BP_PORT(bp)].default_cfg);
 
                rx_ring_size = MAX_RX_AVAIL/BNX2X_NUM_RX_QUEUES(bp);
 
+               /* Dercease ring size for 1G functions */
+               if ((cfg & PORT_HW_CFG_NET_SERDES_IF_MASK) ==
+                   PORT_HW_CFG_NET_SERDES_IF_SGMII)
+                       rx_ring_size /= 10;
+
                /* allocate at least number of buffers required by FW */
                rx_ring_size = max_t(int, bp->disable_tpa ? MIN_RX_SIZE_NONTPA :
                                     MIN_RX_SIZE_TPA, rx_ring_size);
@@ -3414,7 +3482,7 @@ int bnx2x_change_mtu(struct net_device *dev, int new_mtu)
        struct bnx2x *bp = netdev_priv(dev);
 
        if (bp->recovery_state != BNX2X_RECOVERY_DONE) {
-               pr_err("Handling parity error recovery. Try again later\n");
+               netdev_err(dev, "Handling parity error recovery. Try again later\n");
                return -EAGAIN;
        }
 
@@ -3428,17 +3496,21 @@ int bnx2x_change_mtu(struct net_device *dev, int new_mtu)
         */
        dev->mtu = new_mtu;
 
+       bp->gro_check = bnx2x_need_gro_check(new_mtu);
+
        return bnx2x_reload_if_running(dev);
 }
 
 netdev_features_t bnx2x_fix_features(struct net_device *dev,
-       netdev_features_t features)
+                                    netdev_features_t features)
 {
        struct bnx2x *bp = netdev_priv(dev);
 
        /* TPA requires Rx CSUM offloading */
-       if (!(features & NETIF_F_RXCSUM) || bp->disable_tpa)
+       if (!(features & NETIF_F_RXCSUM) || bp->disable_tpa) {
                features &= ~NETIF_F_LRO;
+               features &= ~NETIF_F_GRO;
+       }
 
        return features;
 }
@@ -3454,6 +3526,11 @@ int bnx2x_set_features(struct net_device *dev, netdev_features_t features)
        else
                flags &= ~TPA_ENABLE_FLAG;
 
+       if (features & NETIF_F_GRO)
+               flags |= GRO_ENABLE_FLAG;
+       else
+               flags &= ~GRO_ENABLE_FLAG;
+
        if (features & NETIF_F_LOOPBACK) {
                if (bp->link_params.loopback_mode != LOOPBACK_BMAC) {
                        bp->link_params.loopback_mode = LOOPBACK_BMAC;
@@ -3541,7 +3618,7 @@ int bnx2x_resume(struct pci_dev *pdev)
        bp = netdev_priv(dev);
 
        if (bp->recovery_state != BNX2X_RECOVERY_DONE) {
-               pr_err("Handling parity error recovery. Try again later\n");
+               netdev_err(dev, "Handling parity error recovery. Try again later\n");
                return -EAGAIN;
        }
 
@@ -3557,8 +3634,6 @@ int bnx2x_resume(struct pci_dev *pdev)
        bnx2x_set_power_state(bp, PCI_D0);
        netif_device_attach(dev);
 
-       /* Since the chip was reset, clear the FW sequence number */
-       bp->fw_seq = 0;
        rc = bnx2x_nic_load(bp, LOAD_OPEN);
 
        rtnl_unlock();
index bf27c54..33aa7de 100644 (file)
@@ -1,6 +1,6 @@
 /* bnx2x_cmn.h: Broadcom Everest network driver.
  *
- * Copyright (c) 2007-2011 Broadcom Corporation
+ * Copyright (c) 2007-2012 Broadcom Corporation
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -379,8 +379,8 @@ void bnx2x_set_q_rx_mode(struct bnx2x *bp, u8 cl_id,
                         unsigned long ramrod_flags);
 
 /* Parity errors related */
-void bnx2x_inc_load_cnt(struct bnx2x *bp);
-u32 bnx2x_dec_load_cnt(struct bnx2x *bp);
+void bnx2x_set_pf_load(struct bnx2x *bp);
+bool bnx2x_clear_pf_load(struct bnx2x *bp);
 bool bnx2x_chk_parity_attn(struct bnx2x *bp, bool *global, bool print);
 bool bnx2x_reset_is_done(struct bnx2x *bp, int engine);
 void bnx2x_set_reset_in_progress(struct bnx2x *bp);
@@ -534,8 +534,9 @@ int bnx2x_change_mtu(struct net_device *dev, int new_mtu);
  */
 int bnx2x_fcoe_get_wwn(struct net_device *dev, u64 *wwn, int type);
 #endif
+
 netdev_features_t bnx2x_fix_features(struct net_device *dev,
-       netdev_features_t features);
+                                    netdev_features_t features);
 int bnx2x_set_features(struct net_device *dev, netdev_features_t features);
 
 /**
@@ -614,8 +615,7 @@ static inline void bnx2x_igu_clear_sb_gen(struct bnx2x *bp, u8 func,
        u32 igu_addr_ctl = IGU_REG_COMMAND_REG_CTRL;
        u32 igu_addr_ack = IGU_REG_CSTORM_TYPE_0_SB_CLEANUP + (idu_sb_id/32)*4;
        u32 sb_bit =  1 << (idu_sb_id%32);
-       u32 func_encode = func |
-                       ((is_Pf == true ? 1 : 0) << IGU_FID_ENCODE_IS_PF_SHIFT);
+       u32 func_encode = func | (is_Pf ? 1 : 0) << IGU_FID_ENCODE_IS_PF_SHIFT;
        u32 addr_encode = IGU_CMD_E2_PROD_UPD_BASE + idu_sb_id;
 
        /* Not supported in BC mode */
@@ -984,10 +984,11 @@ static inline int bnx2x_func_start(struct bnx2x *bp)
        /* Function parameters */
        start_params->mf_mode = bp->mf_mode;
        start_params->sd_vlan_tag = bp->mf_ov;
-       if (CHIP_IS_E1x(bp))
-               start_params->network_cos_mode = OVERRIDE_COS;
-       else
+
+       if (CHIP_IS_E2(bp) || CHIP_IS_E3(bp))
                start_params->network_cos_mode = STATIC_COS;
+       else /* CHIP_IS_E1X */
+               start_params->network_cos_mode = FW_WRR;
 
        return bnx2x_func_state_change(bp, &func_params);
 }
@@ -1491,6 +1492,105 @@ static inline u16 bnx2x_extract_max_cfg(struct bnx2x *bp, u32 mf_cfg)
        return max_cfg;
 }
 
+/* checks if HW supports GRO for given MTU */
+static inline bool bnx2x_mtu_allows_gro(int mtu)
+{
+       /* gro frags per page */
+       int fpp = SGE_PAGE_SIZE / (mtu - ETH_MAX_TPA_HEADER_SIZE);
+
+       /*
+        * 1. number of frags should not grow above MAX_SKB_FRAGS
+        * 2. frag must fit the page
+        */
+       return mtu <= SGE_PAGE_SIZE && (U_ETH_SGL_SIZE * fpp) <= MAX_SKB_FRAGS;
+}
+
+static inline bool bnx2x_need_gro_check(int mtu)
+{
+       return (SGE_PAGES / (mtu - ETH_MAX_TPA_HEADER_SIZE - 1)) !=
+               (SGE_PAGES / (mtu - ETH_MIN_TPA_HEADER_SIZE + 1));
+}
+
+/**
+ * bnx2x_bz_fp - zero content of the fastpath structure.
+ *
+ * @bp:                driver handle
+ * @index:     fastpath index to be zeroed
+ *
+ * Makes sure the contents of the bp->fp[index].napi is kept
+ * intact.
+ */
+static inline void bnx2x_bz_fp(struct bnx2x *bp, int index)
+{
+       struct bnx2x_fastpath *fp = &bp->fp[index];
+       struct napi_struct orig_napi = fp->napi;
+       /* bzero bnx2x_fastpath contents */
+       if (bp->stats_init)
+               memset(fp, 0, sizeof(*fp));
+       else {
+               /* Keep Queue statistics */
+               struct bnx2x_eth_q_stats *tmp_eth_q_stats;
+               struct bnx2x_eth_q_stats_old *tmp_eth_q_stats_old;
+
+               tmp_eth_q_stats = kzalloc(sizeof(struct bnx2x_eth_q_stats),
+                                         GFP_KERNEL);
+               if (tmp_eth_q_stats)
+                       memcpy(tmp_eth_q_stats, &fp->eth_q_stats,
+                              sizeof(struct bnx2x_eth_q_stats));
+
+               tmp_eth_q_stats_old =
+                       kzalloc(sizeof(struct bnx2x_eth_q_stats_old),
+                               GFP_KERNEL);
+               if (tmp_eth_q_stats_old)
+                       memcpy(tmp_eth_q_stats_old, &fp->eth_q_stats_old,
+                              sizeof(struct bnx2x_eth_q_stats_old));
+
+               memset(fp, 0, sizeof(*fp));
+
+               if (tmp_eth_q_stats) {
+                       memcpy(&fp->eth_q_stats, tmp_eth_q_stats,
+                                  sizeof(struct bnx2x_eth_q_stats));
+                       kfree(tmp_eth_q_stats);
+               }
+
+               if (tmp_eth_q_stats_old) {
+                       memcpy(&fp->eth_q_stats_old, tmp_eth_q_stats_old,
+                              sizeof(struct bnx2x_eth_q_stats_old));
+                       kfree(tmp_eth_q_stats_old);
+               }
+
+       }
+
+       /* Restore the NAPI object as it has been already initialized */
+       fp->napi = orig_napi;
+
+       fp->bp = bp;
+       fp->index = index;
+       if (IS_ETH_FP(fp))
+               fp->max_cos = bp->max_cos;
+       else
+               /* Special queues support only one CoS */
+               fp->max_cos = 1;
+
+       /*
+        * set the tpa flag for each queue. The tpa flag determines the queue
+        * minimal size so it must be set prior to queue memory allocation
+        */
+       fp->disable_tpa = !(bp->flags & TPA_ENABLE_FLAG ||
+                                 (bp->flags & GRO_ENABLE_FLAG &&
+                                  bnx2x_mtu_allows_gro(bp->dev->mtu)));
+       if (bp->flags & TPA_ENABLE_FLAG)
+               fp->mode = TPA_MODE_LRO;
+       else if (bp->flags & GRO_ENABLE_FLAG)
+               fp->mode = TPA_MODE_GRO;
+
+#ifdef BCM_CNIC
+       /* We don't want TPA on an FCoE L2 ring */
+       if (IS_FCOE_FP(fp))
+               fp->disable_tpa = 1;
+#endif
+}
+
 /**
  * bnx2x_get_iscsi_info - update iSCSI params according to licensing info.
  *
@@ -1539,7 +1639,7 @@ static inline void bnx2x_update_drv_flags(struct bnx2x *bp, u32 flags, u32 set)
 {
        if (SHMEM2_HAS(bp, drv_flags)) {
                u32 drv_flags;
-               bnx2x_acquire_hw_lock(bp, HW_LOCK_DRV_FLAGS);
+               bnx2x_acquire_hw_lock(bp, HW_LOCK_RESOURCE_DRV_FLAGS);
                drv_flags = SHMEM2_RD(bp, drv_flags);
 
                if (set)
@@ -1549,7 +1649,7 @@ static inline void bnx2x_update_drv_flags(struct bnx2x *bp, u32 flags, u32 set)
 
                SHMEM2_WR(bp, drv_flags, drv_flags);
                DP(NETIF_MSG_HW, "drv_flags 0x%08x\n", drv_flags);
-               bnx2x_release_hw_lock(bp, HW_LOCK_DRV_FLAGS);
+               bnx2x_release_hw_lock(bp, HW_LOCK_RESOURCE_DRV_FLAGS);
        }
 }
 
index 5051cf3..9a4ed05 100644 (file)
@@ -1,6 +1,6 @@
 /* bnx2x_dcb.c: Broadcom Everest network driver.
  *
- * Copyright 2009-2011 Broadcom Corporation
+ * Copyright 2009-2012 Broadcom Corporation
  *
  * Unless you and Broadcom execute a separate written software license
  * agreement governing use of this software, this software is licensed to you
@@ -2142,7 +2142,7 @@ static u8 bnx2x_dcbnl_get_cap(struct net_device *netdev, int capid, u8 *cap)
        return rval;
 }
 
-static u8 bnx2x_dcbnl_get_numtcs(struct net_device *netdev, int tcid, u8 *num)
+static int bnx2x_dcbnl_get_numtcs(struct net_device *netdev, int tcid, u8 *num)
 {
        struct bnx2x *bp = netdev_priv(netdev);
        u8 rval = 0;
@@ -2169,7 +2169,7 @@ static u8 bnx2x_dcbnl_get_numtcs(struct net_device *netdev, int tcid, u8 *num)
        return rval;
 }
 
-static u8 bnx2x_dcbnl_set_numtcs(struct net_device *netdev, int tcid, u8 num)
+static int bnx2x_dcbnl_set_numtcs(struct net_device *netdev, int tcid, u8 num)
 {
        struct bnx2x *bp = netdev_priv(netdev);
        DP(NETIF_MSG_LINK, "num tcs = %d; Not supported\n", num);
index 2ab9254..06c7a04 100644 (file)
@@ -1,6 +1,6 @@
 /* bnx2x_dcb.h: Broadcom Everest network driver.
  *
- * Copyright 2009-2011 Broadcom Corporation
+ * Copyright 2009-2012 Broadcom Corporation
  *
  * Unless you and Broadcom execute a separate written software license
  * agreement governing use of this software, this software is licensed to you
index b983825..3e4cff9 100644 (file)
@@ -1,6 +1,6 @@
 /* bnx2x_dump.h: Broadcom Everest network driver.
  *
- * Copyright (c) 2011 Broadcom Corporation
+ * Copyright (c) 2012 Broadcom Corporation
  *
  * Unless you and Broadcom execute a separate written software license
  * agreement governing use of this software, this software is licensed to you
index 31a8b38..9c24d53 100644 (file)
@@ -1,6 +1,6 @@
 /* bnx2x_ethtool.c: Broadcom Everest network driver.
  *
- * Copyright (c) 2007-2011 Broadcom Corporation
+ * Copyright (c) 2007-2012 Broadcom Corporation
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -175,7 +175,11 @@ static const struct {
        { STATS_OFFSET32(total_tpa_aggregated_frames_hi),
                        8, STATS_FLAGS_FUNC, "tpa_aggregated_frames"},
        { STATS_OFFSET32(total_tpa_bytes_hi),
-                       8, STATS_FLAGS_FUNC, "tpa_bytes"}
+                       8, STATS_FLAGS_FUNC, "tpa_bytes"},
+       { STATS_OFFSET32(recoverable_error),
+                       4, STATS_FLAGS_FUNC, "recoverable_errors" },
+       { STATS_OFFSET32(unrecoverable_error),
+                       4, STATS_FLAGS_FUNC, "unrecoverable_errors" },
 };
 
 #define BNX2X_NUM_STATS                ARRAY_SIZE(bnx2x_stats_arr)
@@ -242,6 +246,34 @@ static int bnx2x_get_settings(struct net_device *dev, struct ethtool_cmd *cmd)
        else
                cmd->autoneg = AUTONEG_DISABLE;
 
+       /* Publish LP advertised speeds and FC */
+       if (bp->link_vars.link_status & LINK_STATUS_AUTO_NEGOTIATE_COMPLETE) {
+               u32 status = bp->link_vars.link_status;
+
+               cmd->lp_advertising |= ADVERTISED_Autoneg;
+               if (status & LINK_STATUS_LINK_PARTNER_SYMMETRIC_PAUSE)
+                       cmd->lp_advertising |= ADVERTISED_Pause;
+               if (status & LINK_STATUS_LINK_PARTNER_ASYMMETRIC_PAUSE)
+                       cmd->lp_advertising |= ADVERTISED_Asym_Pause;
+
+               if (status & LINK_STATUS_LINK_PARTNER_10THD_CAPABLE)
+                       cmd->lp_advertising |= ADVERTISED_10baseT_Half;
+               if (status & LINK_STATUS_LINK_PARTNER_10TFD_CAPABLE)
+                       cmd->lp_advertising |= ADVERTISED_10baseT_Full;
+               if (status & LINK_STATUS_LINK_PARTNER_100TXHD_CAPABLE)
+                       cmd->lp_advertising |= ADVERTISED_100baseT_Half;
+               if (status & LINK_STATUS_LINK_PARTNER_100TXFD_CAPABLE)
+                       cmd->lp_advertising |= ADVERTISED_100baseT_Full;
+               if (status & LINK_STATUS_LINK_PARTNER_1000THD_CAPABLE)
+                       cmd->lp_advertising |= ADVERTISED_1000baseT_Half;
+               if (status & LINK_STATUS_LINK_PARTNER_1000TFD_CAPABLE)
+                       cmd->lp_advertising |= ADVERTISED_1000baseT_Full;
+               if (status & LINK_STATUS_LINK_PARTNER_2500XFD_CAPABLE)
+                       cmd->lp_advertising |= ADVERTISED_2500baseX_Full;
+               if (status & LINK_STATUS_LINK_PARTNER_10GXFD_CAPABLE)
+                       cmd->lp_advertising |= ADVERTISED_10000baseT_Full;
+       }
+
        cmd->maxtxpkt = 0;
        cmd->maxrxpkt = 0;
 
@@ -774,14 +806,8 @@ static void bnx2x_get_drvinfo(struct net_device *dev,
        strlcpy(info->version, DRV_MODULE_VERSION, sizeof(info->version));
 
        phy_fw_ver[0] = '\0';
-       if (bp->port.pmf) {
-               bnx2x_acquire_phy_lock(bp);
-               bnx2x_get_ext_phy_fw_version(&bp->link_params,
-                                            (bp->state != BNX2X_STATE_CLOSED),
-                                            phy_fw_ver, PHY_FW_VER_LEN);
-               bnx2x_release_phy_lock(bp);
-       }
-
+       bnx2x_get_ext_phy_fw_version(&bp->link_params,
+                                    phy_fw_ver, PHY_FW_VER_LEN);
        strlcpy(info->fw_version, bp->fw_ver, sizeof(info->fw_version));
        snprintf(info->fw_version + strlen(bp->fw_ver), 32 - strlen(bp->fw_ver),
                 "bc %d.%d.%d%s%s",
@@ -882,11 +908,27 @@ static int bnx2x_get_eeprom_len(struct net_device *dev)
        return bp->common.flash_size;
 }
 
+/* Per pf misc lock must be aquired before the per port mcp lock. Otherwise, had
+ * we done things the other way around, if two pfs from the same port would
+ * attempt to access nvram at the same time, we could run into a scenario such
+ * as:
+ * pf A takes the port lock.
+ * pf B succeeds in taking the same lock since they are from the same port.
+ * pf A takes the per pf misc lock. Performs eeprom access.
+ * pf A finishes. Unlocks the per pf misc lock.
+ * Pf B takes the lock and proceeds to perform it's own access.
+ * pf A unlocks the per port lock, while pf B is still working (!).
+ * mcp takes the per port lock and corrupts pf B's access (and/or has it's own
+ * acess corrupted by pf B).*
+ */
 static int bnx2x_acquire_nvram_lock(struct bnx2x *bp)
 {
        int port = BP_PORT(bp);
        int count, i;
-       u32 val = 0;
+       u32 val;
+
+       /* acquire HW lock: protect against other PFs in PF Direct Assignment */
+       bnx2x_acquire_hw_lock(bp, HW_LOCK_RESOURCE_NVRAM);
 
        /* adjust timeout for emulation/FPGA */
        count = BNX2X_NVRAM_TIMEOUT_COUNT;
@@ -917,7 +959,7 @@ static int bnx2x_release_nvram_lock(struct bnx2x *bp)
 {
        int port = BP_PORT(bp);
        int count, i;
-       u32 val = 0;
+       u32 val;
 
        /* adjust timeout for emulation/FPGA */
        count = BNX2X_NVRAM_TIMEOUT_COUNT;
@@ -941,6 +983,8 @@ static int bnx2x_release_nvram_lock(struct bnx2x *bp)
                return -EBUSY;
        }
 
+       /* release HW lock: protect against other PFs in PF Direct Assignment */
+       bnx2x_release_hw_lock(bp, HW_LOCK_RESOURCE_NVRAM);
        return 0;
 }
 
@@ -1370,7 +1414,8 @@ static int bnx2x_set_ringparam(struct net_device *dev,
        struct bnx2x *bp = netdev_priv(dev);
 
        if (bp->recovery_state != BNX2X_RECOVERY_DONE) {
-               pr_err("Handling parity error recovery. Try again later\n");
+               netdev_err(dev, "Handling parity error recovery. "
+                               "Try again later\n");
                return -EAGAIN;
        }
 
@@ -1392,12 +1437,19 @@ static void bnx2x_get_pauseparam(struct net_device *dev,
 {
        struct bnx2x *bp = netdev_priv(dev);
        int cfg_idx = bnx2x_get_link_cfg_idx(bp);
+       int cfg_reg;
+
        epause->autoneg = (bp->link_params.req_flow_ctrl[cfg_idx] ==
                           BNX2X_FLOW_CTRL_AUTO);
 
-       epause->rx_pause = ((bp->link_vars.flow_ctrl & BNX2X_FLOW_CTRL_RX) ==
+       if (!epause->autoneg)
+               cfg_reg = bp->link_vars.flow_ctrl;
+       else
+               cfg_reg = bp->link_params.req_fc_auto_adv;
+
+       epause->rx_pause = ((cfg_reg & BNX2X_FLOW_CTRL_RX) ==
                            BNX2X_FLOW_CTRL_RX);
-       epause->tx_pause = ((bp->link_vars.flow_ctrl & BNX2X_FLOW_CTRL_TX) ==
+       epause->tx_pause = ((cfg_reg & BNX2X_FLOW_CTRL_TX) ==
                            BNX2X_FLOW_CTRL_TX);
 
        DP(NETIF_MSG_LINK, "ethtool_pauseparam: cmd %d\n"
@@ -1879,7 +1931,7 @@ static int bnx2x_run_loopback(struct bnx2x *bp, int loopback_mode)
        if (!CQE_TYPE_FAST(cqe_fp_type) || (cqe_fp_flags & ETH_RX_ERROR_FALGS))
                goto test_loopback_rx_exit;
 
-       len = le16_to_cpu(cqe->fast_path_cqe.pkt_len);
+       len = le16_to_cpu(cqe->fast_path_cqe.pkt_len_or_gro_seg_len);
        if (len != pkt_size)
                goto test_loopback_rx_exit;
 
@@ -1958,14 +2010,22 @@ static int bnx2x_test_nvram(struct bnx2x *bp)
                { 0x708,  0x70 }, /* manuf_key_info */
                {     0,     0 }
        };
-       __be32 buf[0x350 / 4];
-       u8 *data = (u8 *)buf;
+       __be32 *buf;
+       u8 *data;
        int i, rc;
        u32 magic, crc;
 
        if (BP_NOMCP(bp))
                return 0;
 
+       buf = kmalloc(0x350, GFP_KERNEL);
+       if (!buf) {
+               DP(NETIF_MSG_PROBE, "kmalloc failed\n");
+               rc = -ENOMEM;
+               goto test_nvram_exit;
+       }
+       data = (u8 *)buf;
+
        rc = bnx2x_nvram_read(bp, 0, data, 4);
        if (rc) {
                DP(NETIF_MSG_PROBE, "magic value read (rc %d)\n", rc);
@@ -1999,6 +2059,7 @@ static int bnx2x_test_nvram(struct bnx2x *bp)
        }
 
 test_nvram_exit:
+       kfree(buf);
        return rc;
 }
 
@@ -2024,7 +2085,8 @@ static void bnx2x_self_test(struct net_device *dev,
        struct bnx2x *bp = netdev_priv(dev);
        u8 is_serdes;
        if (bp->recovery_state != BNX2X_RECOVERY_DONE) {
-               pr_err("Handling parity error recovery. Try again later\n");
+               netdev_err(bp->dev, "Handling parity error recovery. "
+                                   "Try again later\n");
                etest->flags |= ETH_TEST_FL_FAILED;
                return;
        }
index 998652a..e5c5982 100644 (file)
@@ -1,6 +1,6 @@
 /* bnx2x_fw_defs.h: Broadcom Everest network driver.
  *
- * Copyright (c) 2007-2011 Broadcom Corporation
+ * Copyright (c) 2007-2012 Broadcom Corporation
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index f4a07fb..4bed52b 100644 (file)
@@ -1,6 +1,6 @@
 /* bnx2x_fw_file_hdr.h: FW binary file header structure.
  *
- * Copyright (c) 2007-2011 Broadcom Corporation
+ * Copyright (c) 2007-2012 Broadcom Corporation
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 3e30c86..a1413ad 100644 (file)
@@ -1,6 +1,6 @@
 /* bnx2x_hsi.h: Broadcom Everest network driver.
  *
- * Copyright (c) 2007-2011 Broadcom Corporation
+ * Copyright (c) 2007-2012 Broadcom Corporation
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -34,9 +34,10 @@ struct license_key {
 };
 
 
-#define PORT_0              0
-#define PORT_1              1
-#define PORT_MAX            2
+#define PORT_0                 0
+#define PORT_1                 1
+#define PORT_MAX               2
+#define NVM_PATH_MAX           2
 
 /****************************************************************************
  * Shared HW configuration                                                  *
@@ -618,12 +619,6 @@ struct port_hw_cfg {                   /* port 0: 0x12c  port 1: 0x2bc */
        #define PORT_HW_CFG_ENABLE_CMS_DISABLED                      0x00000000
        #define PORT_HW_CFG_ENABLE_CMS_ENABLED                       0x00200000
 
-       /*  Enable RJ45 magjack pair swapping on 10GBase-T PHY, 84833 only */
-       #define PORT_HW_CFG_RJ45_PR_SWP_MASK                0x00400000
-       #define PORT_HW_CFG_RJ45_PR_SWP_SHIFT                        22
-       #define PORT_HW_CFG_RJ45_PR_SWP_DISABLED                     0x00000000
-       #define PORT_HW_CFG_RJ45_PR_SWP_ENABLED                      0x00400000
-
        /*  Determine the Serdes electrical interface   */
        #define PORT_HW_CFG_NET_SERDES_IF_MASK              0x0F000000
        #define PORT_HW_CFG_NET_SERDES_IF_SHIFT                      24
@@ -898,11 +893,6 @@ struct port_feat_cfg {                 /* port 0: 0x454  port 1: 0x4c8 */
                #define PORT_FEAT_CFG_DCBX_DISABLED                  0x00000000
                #define PORT_FEAT_CFG_DCBX_ENABLED                   0x00000100
 
-       #define PORT_FEAT_CFG_AUTOGREEN_MASK                0x00000200
-       #define PORT_FEAT_CFG_AUTOGREEN_SHIFT                        9
-       #define PORT_FEAT_CFG_AUTOGREEN_DISABLED                     0x00000000
-       #define PORT_FEAT_CFG_AUTOGREEN_ENABLED                      0x00000200
-
        #define PORT_FEATURE_EN_SIZE_MASK                   0x0f000000
        #define PORT_FEATURE_EN_SIZE_SHIFT                           24
        #define PORT_FEATURE_WOL_ENABLED                             0x01000000
@@ -1139,9 +1129,6 @@ struct shm_dev_info {                             /* size */
 
 #define FW_ACK_NUM_OF_POLL  (FW_ACK_TIME_OUT_MS/FW_ACK_POLL_TIME_MS)
 
-/* LED Blink rate that will achieve ~15.9Hz */
-#define LED_BLINK_RATE_VAL      480
-
 /****************************************************************************
  * Driver <-> FW Mailbox                                                    *
  ****************************************************************************/
@@ -1407,7 +1394,7 @@ struct port_mf_cfg {
        #define PORT_MF_CFG_E1HOV_TAG_SHIFT             0
        #define PORT_MF_CFG_E1HOV_TAG_DEFAULT         PORT_MF_CFG_E1HOV_TAG_MASK
 
-       u32 reserved[3];
+       u32 reserved[1];
 
 };
 
@@ -1493,7 +1480,8 @@ struct func_ext_cfg {
 struct mf_cfg {
 
        struct shared_mf_cfg    shared_mf_config;       /* 0x4 */
-       struct port_mf_cfg  port_mf_config[PORT_MAX];   /* 0x10 * 2 = 0x20 */
+                                                       /* 0x8*2*2=0x20 */
+       struct port_mf_cfg  port_mf_config[NVM_PATH_MAX][PORT_MAX];
        /* for all chips, there are 8 mf functions */
        struct func_mf_cfg  func_mf_config[E1H_FUNC_MAX]; /* 0x18 * 8 = 0xc0 */
        /*
@@ -2002,6 +1990,7 @@ struct shmem2_region {
 #define DRV_INFO_CONTROL_VER_SHIFT         0
 #define DRV_INFO_CONTROL_OP_CODE_MASK      0x0000ff00
 #define DRV_INFO_CONTROL_OP_CODE_SHIFT     8
+       u32 ibft_host_addr; /* initialized by option ROM */
 };
 
 
@@ -2700,8 +2689,8 @@ union drv_info_to_mcp {
        struct iscsi_stats_info iscsi_stat;
 };
 #define BCM_5710_FW_MAJOR_VERSION                      7
-#define BCM_5710_FW_MINOR_VERSION                      0
-#define BCM_5710_FW_REVISION_VERSION           29
+#define BCM_5710_FW_MINOR_VERSION                      2
+#define BCM_5710_FW_REVISION_VERSION           16
 #define BCM_5710_FW_ENGINEERING_VERSION                0
 #define BCM_5710_FW_COMPILE_FLAGS                      1
 
@@ -3308,8 +3297,10 @@ struct client_init_rx_data {
 #define CLIENT_INIT_RX_DATA_TPA_EN_IPV4_SHIFT 0
 #define CLIENT_INIT_RX_DATA_TPA_EN_IPV6 (0x1<<1)
 #define CLIENT_INIT_RX_DATA_TPA_EN_IPV6_SHIFT 1
-#define CLIENT_INIT_RX_DATA_RESERVED5 (0x3F<<2)
-#define CLIENT_INIT_RX_DATA_RESERVED5_SHIFT 2
+#define CLIENT_INIT_RX_DATA_TPA_MODE (0x1<<2)
+#define CLIENT_INIT_RX_DATA_TPA_MODE_SHIFT 2
+#define CLIENT_INIT_RX_DATA_RESERVED5 (0x1F<<3)
+#define CLIENT_INIT_RX_DATA_RESERVED5_SHIFT 3
        u8 vmqueue_mode_en_flg;
        u8 extra_data_over_sgl_en_flg;
        u8 cache_line_alignment_log_size;
@@ -3324,7 +3315,7 @@ struct client_init_rx_data {
        u8 outer_vlan_removal_enable_flg;
        u8 status_block_id;
        u8 rx_sb_index_number;
-       u8 reserved0;
+       u8 dont_verify_rings_pause_thr_flg;
        u8 max_tpa_queues;
        u8 silent_vlan_removal_flg;
        __le16 max_bytes_on_bd;
@@ -3657,7 +3648,7 @@ struct eth_fast_path_rx_cqe {
        u8 placement_offset;
        __le32 rss_hash_result;
        __le16 vlan_tag;
-       __le16 pkt_len;
+       __le16 pkt_len_or_gro_seg_len;
        __le16 len_on_bd;
        struct parsing_flags pars_flags;
        union eth_sgl_or_raw_data sgl_or_raw_data;
@@ -4215,6 +4206,15 @@ enum set_mac_action_type {
 
 
 /*
+ * Ethernet TPA Modes
+ */
+enum tpa_mode {
+       TPA_LRO,
+       TPA_GRO,
+       MAX_TPA_MODE};
+
+
+/*
  * tpa update ramrod data
  */
 struct tpa_update_ramrod_data {
@@ -4224,7 +4224,8 @@ struct tpa_update_ramrod_data {
        u8 max_tpa_queues;
        u8 max_sges_for_packet;
        u8 complete_on_both_clients;
-       __le16 reserved1;
+       u8 dont_verify_rings_pause_thr_flg;
+       u8 tpa_mode;
        __le16 sge_buff_size;
        __le16 max_agg_size;
        __le32 sge_page_base_lo;
@@ -4447,13 +4448,13 @@ enum common_spqe_cmd_id {
        RAMROD_CMD_ID_COMMON_UNUSED,
        RAMROD_CMD_ID_COMMON_FUNCTION_START,
        RAMROD_CMD_ID_COMMON_FUNCTION_STOP,
+       RAMROD_CMD_ID_COMMON_FUNCTION_UPDATE,
        RAMROD_CMD_ID_COMMON_CFC_DEL,
        RAMROD_CMD_ID_COMMON_CFC_DEL_WB,
        RAMROD_CMD_ID_COMMON_STAT_QUERY,
        RAMROD_CMD_ID_COMMON_STOP_TRAFFIC,
        RAMROD_CMD_ID_COMMON_START_TRAFFIC,
        RAMROD_CMD_ID_COMMON_RESERVED1,
-       RAMROD_CMD_ID_COMMON_RESERVED2,
        MAX_COMMON_SPQE_CMD_ID
 };
 
@@ -4733,8 +4734,8 @@ enum event_ring_opcode {
        EVENT_RING_OPCODE_MALICIOUS_VF,
        EVENT_RING_OPCODE_FORWARD_SETUP,
        EVENT_RING_OPCODE_RSS_UPDATE_RULES,
+       EVENT_RING_OPCODE_FUNCTION_UPDATE,
        EVENT_RING_OPCODE_RESERVED1,
-       EVENT_RING_OPCODE_RESERVED2,
        EVENT_RING_OPCODE_SET_MAC,
        EVENT_RING_OPCODE_CLASSIFICATION_RULES,
        EVENT_RING_OPCODE_FILTERS_RULES,
index 4d748e7..29f5c3c 100644 (file)
@@ -1,7 +1,7 @@
 /* bnx2x_init.h: Broadcom Everest network driver.
  *               Structures and macroes needed during the initialization.
  *
- * Copyright (c) 2007-2011 Broadcom Corporation
+ * Copyright (c) 2007-2012 Broadcom Corporation
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 7ec1724..fe66d90 100644 (file)
@@ -2,7 +2,7 @@
  *               Static functions needed during the initialization.
  *               This file is "included" in bnx2x_main.c.
  *
- * Copyright (c) 2007-2011 Broadcom Corporation
+ * Copyright (c) 2007-2012 Broadcom Corporation
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -69,12 +69,12 @@ static void bnx2x_write_big_buf(struct bnx2x *bp, u32 addr, u32 len,
 {
        if (bp->dmae_ready)
                bnx2x_write_dmae_phys_len(bp, GUNZIP_PHYS(bp), addr, len);
-       else if (wb)
-               /*
-                * Wide bus registers with no dmae need to be written
-                * using indirect write.
-                */
+
+       /* in E1 chips BIOS initiated ZLR may interrupt widebus writes */
+       else if (wb && CHIP_IS_E1(bp))
                bnx2x_init_ind_wr(bp, addr, GUNZIP_BUF(bp), len);
+
+       /* in later chips PXP root complex handles BIOS ZLR w/o interrupting */
        else
                bnx2x_init_str_wr(bp, addr, GUNZIP_BUF(bp), len);
 }
@@ -99,8 +99,14 @@ static void bnx2x_write_big_buf_wb(struct bnx2x *bp, u32 addr, u32 len)
 {
        if (bp->dmae_ready)
                bnx2x_write_dmae_phys_len(bp, GUNZIP_PHYS(bp), addr, len);
-       else
+
+       /* in E1 chips BIOS initiated ZLR may interrupt widebus writes */
+       else if (CHIP_IS_E1(bp))
                bnx2x_init_ind_wr(bp, addr, GUNZIP_BUF(bp), len);
+
+       /* in later chips PXP root complex handles BIOS ZLR w/o interrupting */
+       else
+               bnx2x_init_str_wr(bp, addr, GUNZIP_BUF(bp), len);
 }
 
 static void bnx2x_init_wr_64(struct bnx2x *bp, u32 addr,
@@ -177,8 +183,14 @@ static void bnx2x_init_wr_wb(struct bnx2x *bp, u32 addr,
 {
        if (bp->dmae_ready)
                VIRT_WR_DMAE_LEN(bp, data, addr, len, 0);
-       else
+
+       /* in E1 chips BIOS initiated ZLR may interrupt widebus writes */
+       else if (CHIP_IS_E1(bp))
                bnx2x_init_ind_wr(bp, addr, data, len);
+
+       /* in later chips PXP root complex handles BIOS ZLR w/o interrupting */
+       else
+               bnx2x_init_str_wr(bp, addr, data, len);
 }
 
 static void bnx2x_wr_64(struct bnx2x *bp, u32 reg, u32 val_lo,
@@ -840,25 +852,15 @@ static void bnx2x_qm_init_cid_count(struct bnx2x *bp, int qm_cid_count,
        }
 }
 
-static void bnx2x_qm_set_ptr_table(struct bnx2x *bp, int qm_cid_count)
+static void bnx2x_qm_set_ptr_table(struct bnx2x *bp, int qm_cid_count,
+                                  u32 base_reg, u32 reg)
 {
        int i;
-       u32 wb_data[2];
-
-       wb_data[0] = wb_data[1] = 0;
-
+       u32 wb_data[2] = {0, 0};
        for (i = 0; i < 4 * QM_QUEUES_PER_FUNC; i++) {
-               REG_WR(bp, QM_REG_BASEADDR + i*4,
+               REG_WR(bp, base_reg + i*4,
                       qm_cid_count * 4 * (i % QM_QUEUES_PER_FUNC));
-               bnx2x_init_ind_wr(bp, QM_REG_PTRTBL + i*8,
-                                 wb_data, 2);
-
-               if (CHIP_IS_E1H(bp)) {
-                       REG_WR(bp, QM_REG_BASEADDR_EXT_A + i*4,
-                              qm_cid_count * 4 * (i % QM_QUEUES_PER_FUNC));
-                       bnx2x_init_ind_wr(bp, QM_REG_PTRTBL_EXT_A + i*8,
-                                         wb_data, 2);
-               }
+               bnx2x_init_wr_wb(bp, reg + i*8,  wb_data, 2);
        }
 }
 
@@ -873,7 +875,12 @@ static void bnx2x_qm_init_ptr_table(struct bnx2x *bp, int qm_cid_count,
        case INITOP_INIT:
                /* set in the init-value array */
        case INITOP_SET:
-               bnx2x_qm_set_ptr_table(bp, qm_cid_count);
+               bnx2x_qm_set_ptr_table(bp, qm_cid_count,
+                                      QM_REG_BASEADDR, QM_REG_PTRTBL);
+               if (CHIP_IS_E1H(bp))
+                       bnx2x_qm_set_ptr_table(bp, qm_cid_count,
+                                              QM_REG_BASEADDR_EXT_A,
+                                              QM_REG_PTRTBL_EXT_A);
                break;
        case INITOP_CLEAR:
                break;
index 2091e5d..beb4cdb 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright 2008-2011 Broadcom Corporation
+/* Copyright 2008-2012 Broadcom Corporation
  *
  * Unless you and Broadcom execute a separate written software license
  * agreement governing use of this software, this software is licensed to you
@@ -1612,6 +1612,9 @@ static void bnx2x_umac_enable(struct link_params *params,
        if (!(vars->flow_ctrl & BNX2X_FLOW_CTRL_RX))
                val |= UMAC_COMMAND_CONFIG_REG_PAUSE_IGNORE;
 
+       if (vars->duplex == DUPLEX_HALF)
+               val |= UMAC_COMMAND_CONFIG_REG_HD_ENA;
+
        REG_WR(bp, umac_base + UMAC_REG_COMMAND_CONFIG, val);
        udelay(50);
 
@@ -3635,45 +3638,50 @@ static void bnx2x_pause_resolve(struct link_vars *vars, u32 pause_result)
                vars->link_status |= LINK_STATUS_LINK_PARTNER_ASYMMETRIC_PAUSE;
 }
 
-static u8 bnx2x_ext_phy_resolve_fc(struct bnx2x_phy *phy,
-                                  struct link_params *params,
-                                  struct link_vars *vars)
+static void bnx2x_ext_phy_update_adv_fc(struct bnx2x_phy *phy,
+                                       struct link_params *params,
+                                       struct link_vars *vars)
 {
-       struct bnx2x *bp = params->bp;
        u16 ld_pause;           /* local */
        u16 lp_pause;           /* link partner */
        u16 pause_result;
-       u8 ret = 0;
-       /* read twice */
+       struct bnx2x *bp = params->bp;
+       if (phy->type == PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM54618SE) {
+               bnx2x_cl22_read(bp, phy, 0x4, &ld_pause);
+               bnx2x_cl22_read(bp, phy, 0x5, &lp_pause);
+       } else {
+               bnx2x_cl45_read(bp, phy,
+                               MDIO_AN_DEVAD,
+                               MDIO_AN_REG_ADV_PAUSE, &ld_pause);
+               bnx2x_cl45_read(bp, phy,
+                               MDIO_AN_DEVAD,
+                               MDIO_AN_REG_LP_AUTO_NEG, &lp_pause);
+       }
+       pause_result = (ld_pause &
+                       MDIO_AN_REG_ADV_PAUSE_MASK) >> 8;
+       pause_result |= (lp_pause &
+                        MDIO_AN_REG_ADV_PAUSE_MASK) >> 10;
+       DP(NETIF_MSG_LINK, "Ext PHY pause result 0x%x\n", pause_result);
+       bnx2x_pause_resolve(vars, pause_result);
 
+}
+static u8 bnx2x_ext_phy_resolve_fc(struct bnx2x_phy *phy,
+                                  struct link_params *params,
+                                  struct link_vars *vars)
+{
+       u8 ret = 0;
        vars->flow_ctrl = BNX2X_FLOW_CTRL_NONE;
-
-       if (phy->req_flow_ctrl != BNX2X_FLOW_CTRL_AUTO)
+       if (phy->req_flow_ctrl != BNX2X_FLOW_CTRL_AUTO) {
+               /* Update the advertised flow-controled of LD/LP in AN */
+               if (phy->req_line_speed == SPEED_AUTO_NEG)
+                       bnx2x_ext_phy_update_adv_fc(phy, params, vars);
+               /* But set the flow-control result as the requested one */
                vars->flow_ctrl = phy->req_flow_ctrl;
-       else if (phy->req_line_speed != SPEED_AUTO_NEG)
+       } else if (phy->req_line_speed != SPEED_AUTO_NEG)
                vars->flow_ctrl = params->req_fc_auto_adv;
        else if (vars->link_status & LINK_STATUS_AUTO_NEGOTIATE_COMPLETE) {
                ret = 1;
-               if (phy->type == PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM54618SE) {
-                       bnx2x_cl22_read(bp, phy,
-                                       0x4, &ld_pause);
-                       bnx2x_cl22_read(bp, phy,
-                                       0x5, &lp_pause);
-               } else {
-                       bnx2x_cl45_read(bp, phy,
-                                       MDIO_AN_DEVAD,
-                                       MDIO_AN_REG_ADV_PAUSE, &ld_pause);
-                       bnx2x_cl45_read(bp, phy,
-                                       MDIO_AN_DEVAD,
-                                       MDIO_AN_REG_LP_AUTO_NEG, &lp_pause);
-               }
-               pause_result = (ld_pause &
-                               MDIO_AN_REG_ADV_PAUSE_MASK) >> 8;
-               pause_result |= (lp_pause &
-                                MDIO_AN_REG_ADV_PAUSE_MASK) >> 10;
-               DP(NETIF_MSG_LINK, "Ext PHY pause result 0x%x\n",
-                  pause_result);
-               bnx2x_pause_resolve(vars, pause_result);
+               bnx2x_ext_phy_update_adv_fc(phy, params, vars);
        }
        return ret;
 }
@@ -3785,7 +3793,7 @@ static void bnx2x_warpcore_enable_AN_KR(struct bnx2x_phy *phy,
 
        /* Enable Autoneg */
        bnx2x_cl45_write(bp, phy, MDIO_AN_DEVAD,
-                        MDIO_WC_REG_IEEE0BLK_MIICNTL, 0x1000);
+                        MDIO_WC_REG_IEEE0BLK_MIICNTL, 0x1200);
 
 }
 
@@ -5216,22 +5224,69 @@ static int bnx2x_direct_parallel_detect_used(struct bnx2x_phy *phy,
        return 0;
 }
 
+static void bnx2x_update_adv_fc(struct bnx2x_phy *phy,
+                               struct link_params *params,
+                               struct link_vars *vars,
+                               u32 gp_status)
+{
+       u16 ld_pause;   /* local driver */
+       u16 lp_pause;   /* link partner */
+       u16 pause_result;
+       struct bnx2x *bp = params->bp;
+       if ((gp_status &
+            (MDIO_GP_STATUS_TOP_AN_STATUS1_CL73_AUTONEG_COMPLETE |
+             MDIO_GP_STATUS_TOP_AN_STATUS1_CL73_MR_LP_NP_AN_ABLE)) ==
+           (MDIO_GP_STATUS_TOP_AN_STATUS1_CL73_AUTONEG_COMPLETE |
+            MDIO_GP_STATUS_TOP_AN_STATUS1_CL73_MR_LP_NP_AN_ABLE)) {
+
+               CL22_RD_OVER_CL45(bp, phy,
+                                 MDIO_REG_BANK_CL73_IEEEB1,
+                                 MDIO_CL73_IEEEB1_AN_ADV1,
+                                 &ld_pause);
+               CL22_RD_OVER_CL45(bp, phy,
+                                 MDIO_REG_BANK_CL73_IEEEB1,
+                                 MDIO_CL73_IEEEB1_AN_LP_ADV1,
+                                 &lp_pause);
+               pause_result = (ld_pause &
+                               MDIO_CL73_IEEEB1_AN_ADV1_PAUSE_MASK) >> 8;
+               pause_result |= (lp_pause &
+                                MDIO_CL73_IEEEB1_AN_LP_ADV1_PAUSE_MASK) >> 10;
+               DP(NETIF_MSG_LINK, "pause_result CL73 0x%x\n", pause_result);
+       } else {
+               CL22_RD_OVER_CL45(bp, phy,
+                                 MDIO_REG_BANK_COMBO_IEEE0,
+                                 MDIO_COMBO_IEEE0_AUTO_NEG_ADV,
+                                 &ld_pause);
+               CL22_RD_OVER_CL45(bp, phy,
+                       MDIO_REG_BANK_COMBO_IEEE0,
+                       MDIO_COMBO_IEEE0_AUTO_NEG_LINK_PARTNER_ABILITY1,
+                       &lp_pause);
+               pause_result = (ld_pause &
+                               MDIO_COMBO_IEEE0_AUTO_NEG_ADV_PAUSE_MASK)>>5;
+               pause_result |= (lp_pause &
+                                MDIO_COMBO_IEEE0_AUTO_NEG_ADV_PAUSE_MASK)>>7;
+               DP(NETIF_MSG_LINK, "pause_result CL37 0x%x\n", pause_result);
+       }
+       bnx2x_pause_resolve(vars, pause_result);
+
+}
+
 static void bnx2x_flow_ctrl_resolve(struct bnx2x_phy *phy,
                                    struct link_params *params,
                                    struct link_vars *vars,
                                    u32 gp_status)
 {
        struct bnx2x *bp = params->bp;
-       u16 ld_pause;   /* local driver */
-       u16 lp_pause;   /* link partner */
-       u16 pause_result;
-
        vars->flow_ctrl = BNX2X_FLOW_CTRL_NONE;
 
        /* resolve from gp_status in case of AN complete and not sgmii */
-       if (phy->req_flow_ctrl != BNX2X_FLOW_CTRL_AUTO)
+       if (phy->req_flow_ctrl != BNX2X_FLOW_CTRL_AUTO) {
+               /* Update the advertised flow-controled of LD/LP in AN */
+               if (phy->req_line_speed == SPEED_AUTO_NEG)
+                       bnx2x_update_adv_fc(phy, params, vars, gp_status);
+               /* But set the flow-control result as the requested one */
                vars->flow_ctrl = phy->req_flow_ctrl;
-       else if (phy->req_line_speed != SPEED_AUTO_NEG)
+       } else if (phy->req_line_speed != SPEED_AUTO_NEG)
                vars->flow_ctrl = params->req_fc_auto_adv;
        else if ((gp_status & MDIO_AN_CL73_OR_37_COMPLETE) &&
                 (!(vars->phy_flags & PHY_SGMII_FLAG))) {
@@ -5239,45 +5294,7 @@ static void bnx2x_flow_ctrl_resolve(struct bnx2x_phy *phy,
                        vars->flow_ctrl = params->req_fc_auto_adv;
                        return;
                }
-               if ((gp_status &
-                   (MDIO_GP_STATUS_TOP_AN_STATUS1_CL73_AUTONEG_COMPLETE |
-                    MDIO_GP_STATUS_TOP_AN_STATUS1_CL73_MR_LP_NP_AN_ABLE)) ==
-                   (MDIO_GP_STATUS_TOP_AN_STATUS1_CL73_AUTONEG_COMPLETE |
-                    MDIO_GP_STATUS_TOP_AN_STATUS1_CL73_MR_LP_NP_AN_ABLE)) {
-
-                       CL22_RD_OVER_CL45(bp, phy,
-                                         MDIO_REG_BANK_CL73_IEEEB1,
-                                         MDIO_CL73_IEEEB1_AN_ADV1,
-                                         &ld_pause);
-                       CL22_RD_OVER_CL45(bp, phy,
-                                         MDIO_REG_BANK_CL73_IEEEB1,
-                                         MDIO_CL73_IEEEB1_AN_LP_ADV1,
-                                         &lp_pause);
-                       pause_result = (ld_pause &
-                                       MDIO_CL73_IEEEB1_AN_ADV1_PAUSE_MASK)
-                                       >> 8;
-                       pause_result |= (lp_pause &
-                                       MDIO_CL73_IEEEB1_AN_LP_ADV1_PAUSE_MASK)
-                                       >> 10;
-                       DP(NETIF_MSG_LINK, "pause_result CL73 0x%x\n",
-                                pause_result);
-               } else {
-                       CL22_RD_OVER_CL45(bp, phy,
-                                         MDIO_REG_BANK_COMBO_IEEE0,
-                                         MDIO_COMBO_IEEE0_AUTO_NEG_ADV,
-                                         &ld_pause);
-                       CL22_RD_OVER_CL45(bp, phy,
-                               MDIO_REG_BANK_COMBO_IEEE0,
-                               MDIO_COMBO_IEEE0_AUTO_NEG_LINK_PARTNER_ABILITY1,
-                               &lp_pause);
-                       pause_result = (ld_pause &
-                               MDIO_COMBO_IEEE0_AUTO_NEG_ADV_PAUSE_MASK)>>5;
-                       pause_result |= (lp_pause &
-                               MDIO_COMBO_IEEE0_AUTO_NEG_ADV_PAUSE_MASK)>>7;
-                       DP(NETIF_MSG_LINK, "pause_result CL37 0x%x\n",
-                                pause_result);
-               }
-               bnx2x_pause_resolve(vars, pause_result);
+               bnx2x_update_adv_fc(phy, params, vars, gp_status);
        }
        DP(NETIF_MSG_LINK, "flow_ctrl 0x%x\n", vars->flow_ctrl);
 }
@@ -5496,6 +5513,33 @@ static int bnx2x_link_settings_status(struct bnx2x_phy *phy,
                }
        }
 
+       /* Read LP advertised speeds*/
+       if (SINGLE_MEDIA_DIRECT(params) &&
+           (vars->link_status & LINK_STATUS_AUTO_NEGOTIATE_COMPLETE)) {
+               u16 val;
+
+               CL22_RD_OVER_CL45(bp, phy, MDIO_REG_BANK_CL73_IEEEB1,
+                                 MDIO_CL73_IEEEB1_AN_LP_ADV2, &val);
+
+               if (val & MDIO_CL73_IEEEB1_AN_ADV2_ADVR_1000M_KX)
+                       vars->link_status |=
+                               LINK_STATUS_LINK_PARTNER_1000TFD_CAPABLE;
+               if (val & (MDIO_CL73_IEEEB1_AN_ADV2_ADVR_10G_KX4 |
+                          MDIO_CL73_IEEEB1_AN_ADV2_ADVR_10G_KR))
+                       vars->link_status |=
+                               LINK_STATUS_LINK_PARTNER_10GXFD_CAPABLE;
+
+               CL22_RD_OVER_CL45(bp, phy, MDIO_REG_BANK_OVER_1G,
+                                 MDIO_OVER_1G_LP_UP1, &val);
+
+               if (val & MDIO_OVER_1G_UP1_2_5G)
+                       vars->link_status |=
+                               LINK_STATUS_LINK_PARTNER_2500XFD_CAPABLE;
+               if (val & (MDIO_OVER_1G_UP1_10G | MDIO_OVER_1G_UP1_10GH))
+                       vars->link_status |=
+                               LINK_STATUS_LINK_PARTNER_10GXFD_CAPABLE;
+       }
+
        DP(NETIF_MSG_LINK, "duplex %x  flow_ctrl 0x%x link_status 0x%x\n",
                   vars->duplex, vars->flow_ctrl, vars->link_status);
        return rc;
@@ -5553,6 +5597,34 @@ static int bnx2x_warpcore_read_status(struct bnx2x_phy *phy,
                }
        }
 
+       if ((vars->link_status & LINK_STATUS_AUTO_NEGOTIATE_COMPLETE) &&
+           SINGLE_MEDIA_DIRECT(params)) {
+               u16 val;
+
+               bnx2x_cl45_read(bp, phy, MDIO_AN_DEVAD,
+                               MDIO_AN_REG_LP_AUTO_NEG2, &val);
+
+               if (val & MDIO_CL73_IEEEB1_AN_ADV2_ADVR_1000M_KX)
+                       vars->link_status |=
+                               LINK_STATUS_LINK_PARTNER_1000TFD_CAPABLE;
+               if (val & (MDIO_CL73_IEEEB1_AN_ADV2_ADVR_10G_KX4 |
+                          MDIO_CL73_IEEEB1_AN_ADV2_ADVR_10G_KR))
+                       vars->link_status |=
+                               LINK_STATUS_LINK_PARTNER_10GXFD_CAPABLE;
+
+               bnx2x_cl45_read(bp, phy, MDIO_WC_DEVAD,
+                               MDIO_WC_REG_DIGITAL3_LP_UP1, &val);
+
+               if (val & MDIO_OVER_1G_UP1_2_5G)
+                       vars->link_status |=
+                               LINK_STATUS_LINK_PARTNER_2500XFD_CAPABLE;
+               if (val & (MDIO_OVER_1G_UP1_10G | MDIO_OVER_1G_UP1_10GH))
+                       vars->link_status |=
+                               LINK_STATUS_LINK_PARTNER_10GXFD_CAPABLE;
+
+       }
+
+
        if (lane < 2) {
                bnx2x_cl45_read(bp, phy, MDIO_WC_DEVAD,
                                MDIO_WC_REG_GP2_STATUS_GP_2_2, &gp_speed);
@@ -5970,8 +6042,8 @@ static int bnx2x_null_format_ver(u32 spirom_ver, u8 *str, u16 *len)
        return 0;
 }
 
-int bnx2x_get_ext_phy_fw_version(struct link_params *params, u8 driver_loaded,
-                                u8 *version, u16 len)
+int bnx2x_get_ext_phy_fw_version(struct link_params *params, u8 *version,
+                                u16 len)
 {
        struct bnx2x *bp;
        u32 spirom_ver = 0;
@@ -6418,7 +6490,9 @@ static int bnx2x_update_link_down(struct link_params *params,
                               LINK_STATUS_AUTO_NEGOTIATE_COMPLETE |
                               LINK_STATUS_RX_FLOW_CONTROL_FLAG_MASK |
                               LINK_STATUS_TX_FLOW_CONTROL_FLAG_MASK |
-                              LINK_STATUS_PARALLEL_DETECTION_FLAG_MASK);
+                              LINK_STATUS_PARALLEL_DETECTION_FLAG_MASK |
+                              LINK_STATUS_LINK_PARTNER_SYMMETRIC_PAUSE |
+                              LINK_STATUS_LINK_PARTNER_ASYMMETRIC_PAUSE);
        vars->line_speed = 0;
        bnx2x_update_mng(params, vars->link_status);
 
@@ -7367,6 +7441,19 @@ static u8 bnx2x_8073_read_status(struct bnx2x_phy *phy,
                bnx2x_8073_resolve_fc(phy, params, vars);
                vars->duplex = DUPLEX_FULL;
        }
+
+       if (vars->link_status & LINK_STATUS_AUTO_NEGOTIATE_COMPLETE) {
+               bnx2x_cl45_read(bp, phy, MDIO_AN_DEVAD,
+                               MDIO_AN_REG_LP_AUTO_NEG2, &val1);
+
+               if (val1 & (1<<5))
+                       vars->link_status |=
+                               LINK_STATUS_LINK_PARTNER_1000TFD_CAPABLE;
+               if (val1 & (1<<7))
+                       vars->link_status |=
+                               LINK_STATUS_LINK_PARTNER_10GXFD_CAPABLE;
+       }
+
        return link_up;
 }
 
@@ -9405,13 +9492,8 @@ static int bnx2x_848xx_cmn_config_init(struct bnx2x_phy *phy,
 {
        struct bnx2x *bp = params->bp;
        u16 autoneg_val, an_1000_val, an_10_100_val, an_10g_val;
-       u16 tmp_req_line_speed;
 
-       tmp_req_line_speed = phy->req_line_speed;
-       if (phy->type == PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM84833) {
-               if (phy->req_line_speed == SPEED_10000)
-                       phy->req_line_speed = SPEED_AUTO_NEG;
-       } else {
+       if (phy->type != PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM84833) {
                /* Save spirom version */
                bnx2x_save_848xx_spirom_version(phy, bp, params->port);
        }
@@ -9555,8 +9637,6 @@ static int bnx2x_848xx_cmn_config_init(struct bnx2x_phy *phy,
                                 MDIO_AN_REG_8481_10GBASE_T_AN_CTRL,
                                 1);
 
-       phy->req_line_speed = tmp_req_line_speed;
-
        return 0;
 }
 
@@ -9948,6 +10028,42 @@ static u8 bnx2x_848xx_read_status(struct bnx2x_phy *phy,
                DP(NETIF_MSG_LINK, "BCM84823: link speed is %d\n",
                           vars->line_speed);
                bnx2x_ext_phy_resolve_fc(phy, params, vars);
+
+               /* Read LP advertised speeds */
+               bnx2x_cl45_read(bp, phy, MDIO_AN_DEVAD,
+                               MDIO_AN_REG_CL37_FC_LP, &val);
+               if (val & (1<<5))
+                       vars->link_status |=
+                               LINK_STATUS_LINK_PARTNER_10THD_CAPABLE;
+               if (val & (1<<6))
+                       vars->link_status |=
+                               LINK_STATUS_LINK_PARTNER_10TFD_CAPABLE;
+               if (val & (1<<7))
+                       vars->link_status |=
+                               LINK_STATUS_LINK_PARTNER_100TXHD_CAPABLE;
+               if (val & (1<<8))
+                       vars->link_status |=
+                               LINK_STATUS_LINK_PARTNER_100TXFD_CAPABLE;
+               if (val & (1<<9))
+                       vars->link_status |=
+                               LINK_STATUS_LINK_PARTNER_100T4_CAPABLE;
+
+               bnx2x_cl45_read(bp, phy, MDIO_AN_DEVAD,
+                               MDIO_AN_REG_1000T_STATUS, &val);
+
+               if (val & (1<<10))
+                       vars->link_status |=
+                               LINK_STATUS_LINK_PARTNER_1000THD_CAPABLE;
+               if (val & (1<<11))
+                       vars->link_status |=
+                               LINK_STATUS_LINK_PARTNER_1000TFD_CAPABLE;
+
+               bnx2x_cl45_read(bp, phy, MDIO_AN_DEVAD,
+                               MDIO_AN_REG_MASTER_STATUS, &val);
+
+               if (val & (1<<11))
+                       vars->link_status |=
+                               LINK_STATUS_LINK_PARTNER_10GXFD_CAPABLE;
        }
 
        return link_up;
@@ -10571,6 +10687,35 @@ static u8 bnx2x_54618se_read_status(struct bnx2x_phy *phy,
                }
 
                bnx2x_ext_phy_resolve_fc(phy, params, vars);
+
+               if (vars->link_status & LINK_STATUS_AUTO_NEGOTIATE_COMPLETE) {
+                       /* report LP advertised speeds */
+                       bnx2x_cl22_read(bp, phy, 0x5, &val);
+
+                       if (val & (1<<5))
+                               vars->link_status |=
+                                 LINK_STATUS_LINK_PARTNER_10THD_CAPABLE;
+                       if (val & (1<<6))
+                               vars->link_status |=
+                                 LINK_STATUS_LINK_PARTNER_10TFD_CAPABLE;
+                       if (val & (1<<7))
+                               vars->link_status |=
+                                 LINK_STATUS_LINK_PARTNER_100TXHD_CAPABLE;
+                       if (val & (1<<8))
+                               vars->link_status |=
+                                 LINK_STATUS_LINK_PARTNER_100TXFD_CAPABLE;
+                       if (val & (1<<9))
+                               vars->link_status |=
+                                 LINK_STATUS_LINK_PARTNER_100T4_CAPABLE;
+
+                       bnx2x_cl22_read(bp, phy, 0xa, &val);
+                       if (val & (1<<10))
+                               vars->link_status |=
+                                 LINK_STATUS_LINK_PARTNER_1000THD_CAPABLE;
+                       if (val & (1<<11))
+                               vars->link_status |=
+                                 LINK_STATUS_LINK_PARTNER_1000TFD_CAPABLE;
+               }
        }
        return link_up;
 }
@@ -10699,6 +10844,11 @@ static u8 bnx2x_7101_read_status(struct bnx2x_phy *phy,
                           val2, (val2 & (1<<14)));
                bnx2x_ext_phy_10G_an_resolve(bp, phy, vars);
                bnx2x_ext_phy_resolve_fc(phy, params, vars);
+
+               /* read LP advertised speeds */
+               if (val2 & (1<<11))
+                       vars->link_status |=
+                               LINK_STATUS_LINK_PARTNER_10GXFD_CAPABLE;
        }
        return link_up;
 }
index e02a68a..7ba557a 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright 2008-2011 Broadcom Corporation
+/* Copyright 2008-2012 Broadcom Corporation
  *
  * Unless you and Broadcom execute a separate written software license
  * agreement governing use of this software, this software is licensed to you
@@ -337,8 +337,8 @@ int bnx2x_phy_write(struct link_params *params, u8 phy_addr,
 void bnx2x_link_status_update(struct link_params *input,
                            struct link_vars *output);
 /* returns string representing the fw_version of the external phy */
-int bnx2x_get_ext_phy_fw_version(struct link_params *params, u8 driver_loaded,
-                                u8 *version, u16 len);
+int bnx2x_get_ext_phy_fw_version(struct link_params *params, u8 *version,
+                                u16 len);
 
 /* Set/Unset the led
    Basically, the CLC takes care of the led for the link, but in case one needs
index 2545213..b4afef6 100644 (file)
@@ -1,6 +1,6 @@
 /* bnx2x_main.c: Broadcom Everest network driver.
  *
- * Copyright (c) 2007-2011 Broadcom Corporation
+ * Copyright (c) 2007-2012 Broadcom Corporation
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -464,7 +464,9 @@ static int bnx2x_issue_dmae_with_comp(struct bnx2x *bp,
        while ((*wb_comp & ~DMAE_PCI_ERR_FLAG) != DMAE_COMP_VAL) {
                DP(BNX2X_MSG_OFF, "wb_comp 0x%08x\n", *wb_comp);
 
-               if (!cnt) {
+               if (!cnt ||
+                   (bp->recovery_state != BNX2X_RECOVERY_DONE &&
+                    bp->recovery_state != BNX2X_RECOVERY_NIC_LOADING)) {
                        BNX2X_ERR("DMAE timeout!\n");
                        rc = DMAE_TIMEOUT;
                        goto unlock;
@@ -494,9 +496,13 @@ void bnx2x_write_dmae(struct bnx2x *bp, dma_addr_t dma_addr, u32 dst_addr,
        if (!bp->dmae_ready) {
                u32 *data = bnx2x_sp(bp, wb_data[0]);
 
-               DP(BNX2X_MSG_OFF, "DMAE is not ready (dst_addr %08x  len32 %d)"
-                  "  using indirect\n", dst_addr, len32);
-               bnx2x_init_ind_wr(bp, dst_addr, data, len32);
+               DP(BNX2X_MSG_OFF,
+                  "DMAE is not ready (dst_addr %08x len32 %d) using indirect\n",
+                  dst_addr, len32);
+               if (CHIP_IS_E1(bp))
+                       bnx2x_init_ind_wr(bp, dst_addr, data, len32);
+               else
+                       bnx2x_init_str_wr(bp, dst_addr, data, len32);
                return;
        }
 
@@ -524,10 +530,16 @@ void bnx2x_read_dmae(struct bnx2x *bp, u32 src_addr, u32 len32)
                u32 *data = bnx2x_sp(bp, wb_data[0]);
                int i;
 
-               DP(BNX2X_MSG_OFF, "DMAE is not ready (src_addr %08x  len32 %d)"
-                  "  using indirect\n", src_addr, len32);
-               for (i = 0; i < len32; i++)
-                       data[i] = bnx2x_reg_rd_ind(bp, src_addr + i*4);
+               if (CHIP_IS_E1(bp)) {
+                       DP(BNX2X_MSG_OFF,
+                          "DMAE is not ready (src_addr %08x len32 %d) using indirect\n",
+                          src_addr, len32);
+                       for (i = 0; i < len32; i++)
+                               data[i] = bnx2x_reg_rd_ind(bp, src_addr + i*4);
+               } else
+                       for (i = 0; i < len32; i++)
+                               data[i] = REG_RD(bp, src_addr + i*4);
+
                return;
        }
 
@@ -768,6 +780,7 @@ void bnx2x_panic_dump(struct bnx2x *bp)
 #endif
 
        bp->stats_state = STATS_STATE_DISABLED;
+       bp->eth_stats.unrecoverable_error++;
        DP(BNX2X_MSG_STATS, "stats_state - DISABLED\n");
 
        BNX2X_ERR("begin crash dump -----------------\n");
@@ -1003,8 +1016,8 @@ void bnx2x_panic_dump(struct bnx2x *bp)
  * initialization.
  */
 #define FLR_WAIT_USEC          10000   /* 10 miliseconds */
-#define FLR_WAIT_INTERAVAL     50      /* usec */
-#define        FLR_POLL_CNT            (FLR_WAIT_USEC/FLR_WAIT_INTERAVAL) /* 200 */
+#define FLR_WAIT_INTERVAL      50      /* usec */
+#define        FLR_POLL_CNT            (FLR_WAIT_USEC/FLR_WAIT_INTERVAL) /* 200 */
 
 struct pbf_pN_buf_regs {
        int pN;
@@ -1037,7 +1050,7 @@ static void bnx2x_pbf_pN_buf_flushed(struct bnx2x *bp,
        while ((crd != init_crd) && ((u32)SUB_S32(crd_freed, crd_freed_start) <
               (init_crd - crd_start))) {
                if (cur_cnt--) {
-                       udelay(FLR_WAIT_INTERAVAL);
+                       udelay(FLR_WAIT_INTERVAL);
                        crd = REG_RD(bp, regs->crd);
                        crd_freed = REG_RD(bp, regs->crd_freed);
                } else {
@@ -1051,7 +1064,7 @@ static void bnx2x_pbf_pN_buf_flushed(struct bnx2x *bp,
                }
        }
        DP(BNX2X_MSG_SP, "Waited %d*%d usec for PBF tx buffer[%d]\n",
-          poll_count-cur_cnt, FLR_WAIT_INTERAVAL, regs->pN);
+          poll_count-cur_cnt, FLR_WAIT_INTERVAL, regs->pN);
 }
 
 static void bnx2x_pbf_pN_cmd_flushed(struct bnx2x *bp,
@@ -1069,7 +1082,7 @@ static void bnx2x_pbf_pN_cmd_flushed(struct bnx2x *bp,
 
        while (occup && ((u32)SUB_S32(freed, freed_start) < to_free)) {
                if (cur_cnt--) {
-                       udelay(FLR_WAIT_INTERAVAL);
+                       udelay(FLR_WAIT_INTERVAL);
                        occup = REG_RD(bp, regs->lines_occup);
                        freed = REG_RD(bp, regs->lines_freed);
                } else {
@@ -1083,7 +1096,7 @@ static void bnx2x_pbf_pN_cmd_flushed(struct bnx2x *bp,
                }
        }
        DP(BNX2X_MSG_SP, "Waited %d*%d usec for PBF cmd queue[%d]\n",
-          poll_count-cur_cnt, FLR_WAIT_INTERAVAL, regs->pN);
+          poll_count-cur_cnt, FLR_WAIT_INTERVAL, regs->pN);
 }
 
 static inline u32 bnx2x_flr_clnup_reg_poll(struct bnx2x *bp, u32 reg,
@@ -1093,7 +1106,7 @@ static inline u32 bnx2x_flr_clnup_reg_poll(struct bnx2x *bp, u32 reg,
        u32 val;
 
        while ((val = REG_RD(bp, reg)) != expected && cur_cnt--)
-               udelay(FLR_WAIT_INTERAVAL);
+               udelay(FLR_WAIT_INTERVAL);
 
        return val;
 }
@@ -1206,7 +1219,7 @@ static inline int bnx2x_send_final_clnup(struct bnx2x *bp, u8 clnup_func,
        int ret = 0;
 
        if (REG_RD(bp, comp_addr)) {
-               BNX2X_ERR("Cleanup complete is not 0\n");
+               BNX2X_ERR("Cleanup complete was not 0 before sending\n");
                return 1;
        }
 
@@ -1215,7 +1228,7 @@ static inline int bnx2x_send_final_clnup(struct bnx2x *bp, u8 clnup_func,
        op_gen.command |= OP_GEN_AGG_VECT(clnup_func);
        op_gen.command |= 1 << SDM_OP_GEN_AGG_VECT_IDX_VALID_SHIFT;
 
-       DP(BNX2X_MSG_SP, "FW Final cleanup\n");
+       DP(BNX2X_MSG_SP, "sending FW Final cleanup\n");
        REG_WR(bp, XSDM_REG_OPERATION_GEN, op_gen.command);
 
        if (bnx2x_flr_clnup_reg_poll(bp, comp_addr, 1, poll_cnt) != 1) {
@@ -1330,6 +1343,7 @@ static int bnx2x_pf_flr_clnup(struct bnx2x *bp)
        REG_WR(bp, PGLUE_B_REG_INTERNAL_PFID_ENABLE_TARGET_READ, 1);
 
        /* Poll HW usage counters */
+       DP(BNX2X_MSG_SP, "Polling usage counters\n");
        if (bnx2x_poll_hw_usage_counters(bp, poll_cnt))
                return -EBUSY;
 
@@ -2688,6 +2702,8 @@ static inline unsigned long bnx2x_get_q_flags(struct bnx2x *bp,
        if (!fp->disable_tpa) {
                __set_bit(BNX2X_Q_FLG_TPA, &flags);
                __set_bit(BNX2X_Q_FLG_TPA_IPV6, &flags);
+               if (fp->mode == TPA_MODE_GRO)
+                       __set_bit(BNX2X_Q_FLG_TPA_GRO, &flags);
        }
 
        if (leading) {
@@ -3709,11 +3725,11 @@ static inline void bnx2x_attn_int_deasserted3(struct bnx2x *bp, u32 attn)
  */
 void bnx2x_set_reset_global(struct bnx2x *bp)
 {
-       u32 val = REG_RD(bp, BNX2X_RECOVERY_GLOB_REG);
-
+       u32 val;
+       bnx2x_acquire_hw_lock(bp, HW_LOCK_RESOURCE_RECOVERY_REG);
+       val = REG_RD(bp, BNX2X_RECOVERY_GLOB_REG);
        REG_WR(bp, BNX2X_RECOVERY_GLOB_REG, val | BNX2X_GLOBAL_RESET_BIT);
-       barrier();
-       mmiowb();
+       bnx2x_release_hw_lock(bp, HW_LOCK_RESOURCE_RECOVERY_REG);
 }
 
 /*
@@ -3723,11 +3739,11 @@ void bnx2x_set_reset_global(struct bnx2x *bp)
  */
 static inline void bnx2x_clear_reset_global(struct bnx2x *bp)
 {
-       u32 val = REG_RD(bp, BNX2X_RECOVERY_GLOB_REG);
-
+       u32 val;
+       bnx2x_acquire_hw_lock(bp, HW_LOCK_RESOURCE_RECOVERY_REG);
+       val = REG_RD(bp, BNX2X_RECOVERY_GLOB_REG);
        REG_WR(bp, BNX2X_RECOVERY_GLOB_REG, val & (~BNX2X_GLOBAL_RESET_BIT));
-       barrier();
-       mmiowb();
+       bnx2x_release_hw_lock(bp, HW_LOCK_RESOURCE_RECOVERY_REG);
 }
 
 /*
@@ -3750,15 +3766,17 @@ static inline bool bnx2x_reset_is_global(struct bnx2x *bp)
  */
 static inline void bnx2x_set_reset_done(struct bnx2x *bp)
 {
-       u32 val = REG_RD(bp, BNX2X_RECOVERY_GLOB_REG);
+       u32 val;
        u32 bit = BP_PATH(bp) ?
                BNX2X_PATH1_RST_IN_PROG_BIT : BNX2X_PATH0_RST_IN_PROG_BIT;
+       bnx2x_acquire_hw_lock(bp, HW_LOCK_RESOURCE_RECOVERY_REG);
+       val = REG_RD(bp, BNX2X_RECOVERY_GLOB_REG);
 
        /* Clear the bit */
        val &= ~bit;
        REG_WR(bp, BNX2X_RECOVERY_GLOB_REG, val);
-       barrier();
-       mmiowb();
+
+       bnx2x_release_hw_lock(bp, HW_LOCK_RESOURCE_RECOVERY_REG);
 }
 
 /*
@@ -3768,15 +3786,16 @@ static inline void bnx2x_set_reset_done(struct bnx2x *bp)
  */
 void bnx2x_set_reset_in_progress(struct bnx2x *bp)
 {
-       u32 val = REG_RD(bp, BNX2X_RECOVERY_GLOB_REG);
+       u32 val;
        u32 bit = BP_PATH(bp) ?
                BNX2X_PATH1_RST_IN_PROG_BIT : BNX2X_PATH0_RST_IN_PROG_BIT;
+       bnx2x_acquire_hw_lock(bp, HW_LOCK_RESOURCE_RECOVERY_REG);
+       val = REG_RD(bp, BNX2X_RECOVERY_GLOB_REG);
 
        /* Set the bit */
        val |= bit;
        REG_WR(bp, BNX2X_RECOVERY_GLOB_REG, val);
-       barrier();
-       mmiowb();
+       bnx2x_release_hw_lock(bp, HW_LOCK_RESOURCE_RECOVERY_REG);
 }
 
 /*
@@ -3794,25 +3813,28 @@ bool bnx2x_reset_is_done(struct bnx2x *bp, int engine)
 }
 
 /*
- * Increment the load counter for the current engine.
+ * set pf load for the current pf.
  *
  * should be run under rtnl lock
  */
-void bnx2x_inc_load_cnt(struct bnx2x *bp)
+void bnx2x_set_pf_load(struct bnx2x *bp)
 {
-       u32 val1, val = REG_RD(bp, BNX2X_RECOVERY_GLOB_REG);
+       u32 val1, val;
        u32 mask = BP_PATH(bp) ? BNX2X_PATH1_LOAD_CNT_MASK :
                             BNX2X_PATH0_LOAD_CNT_MASK;
        u32 shift = BP_PATH(bp) ? BNX2X_PATH1_LOAD_CNT_SHIFT :
                             BNX2X_PATH0_LOAD_CNT_SHIFT;
 
+       bnx2x_acquire_hw_lock(bp, HW_LOCK_RESOURCE_RECOVERY_REG);
+       val = REG_RD(bp, BNX2X_RECOVERY_GLOB_REG);
+
        DP(NETIF_MSG_HW, "Old GEN_REG_VAL=0x%08x\n", val);
 
        /* get the current counter value */
        val1 = (val & mask) >> shift;
 
-       /* increment... */
-       val1++;
+       /* set bit of that PF */
+       val1 |= (1 << bp->pf_num);
 
        /* clear the old value */
        val &= ~mask;
@@ -3821,34 +3843,35 @@ void bnx2x_inc_load_cnt(struct bnx2x *bp)
        val |= ((val1 << shift) & mask);
 
        REG_WR(bp, BNX2X_RECOVERY_GLOB_REG, val);
-       barrier();
-       mmiowb();
+       bnx2x_release_hw_lock(bp, HW_LOCK_RESOURCE_RECOVERY_REG);
 }
 
 /**
- * bnx2x_dec_load_cnt - decrement the load counter
+ * bnx2x_clear_pf_load - clear pf load mark
  *
  * @bp:                driver handle
  *
  * Should be run under rtnl lock.
  * Decrements the load counter for the current engine. Returns
- * the new counter value.
+ * whether other functions are still loaded
  */
-u32 bnx2x_dec_load_cnt(struct bnx2x *bp)
+bool bnx2x_clear_pf_load(struct bnx2x *bp)
 {
-       u32 val1, val = REG_RD(bp, BNX2X_RECOVERY_GLOB_REG);
+       u32 val1, val;
        u32 mask = BP_PATH(bp) ? BNX2X_PATH1_LOAD_CNT_MASK :
                             BNX2X_PATH0_LOAD_CNT_MASK;
        u32 shift = BP_PATH(bp) ? BNX2X_PATH1_LOAD_CNT_SHIFT :
                             BNX2X_PATH0_LOAD_CNT_SHIFT;
 
+       bnx2x_acquire_hw_lock(bp, HW_LOCK_RESOURCE_RECOVERY_REG);
+       val = REG_RD(bp, BNX2X_RECOVERY_GLOB_REG);
        DP(NETIF_MSG_HW, "Old GEN_REG_VAL=0x%08x\n", val);
 
        /* get the current counter value */
        val1 = (val & mask) >> shift;
 
-       /* decrement... */
-       val1--;
+       /* clear bit of that PF */
+       val1 &= ~(1 << bp->pf_num);
 
        /* clear the old value */
        val &= ~mask;
@@ -3857,18 +3880,16 @@ u32 bnx2x_dec_load_cnt(struct bnx2x *bp)
        val |= ((val1 << shift) & mask);
 
        REG_WR(bp, BNX2X_RECOVERY_GLOB_REG, val);
-       barrier();
-       mmiowb();
-
-       return val1;
+       bnx2x_release_hw_lock(bp, HW_LOCK_RESOURCE_RECOVERY_REG);
+       return val1 != 0;
 }
 
 /*
- * Read the load counter for the current engine.
+ * Read the load status for the current engine.
  *
  * should be run under rtnl lock
  */
-static inline u32 bnx2x_get_load_cnt(struct bnx2x *bp, int engine)
+static inline bool bnx2x_get_load_status(struct bnx2x *bp, int engine)
 {
        u32 mask = (engine ? BNX2X_PATH1_LOAD_CNT_MASK :
                             BNX2X_PATH0_LOAD_CNT_MASK);
@@ -3880,23 +3901,23 @@ static inline u32 bnx2x_get_load_cnt(struct bnx2x *bp, int engine)
 
        val = (val & mask) >> shift;
 
-       DP(NETIF_MSG_HW, "load_cnt for engine %d = %d\n", engine, val);
+       DP(NETIF_MSG_HW, "load mask for engine %d = 0x%x\n", engine, val);
 
-       return val;
+       return val != 0;
 }
 
 /*
- * Reset the load counter for the current engine.
- *
- * should be run under rtnl lock
+ * Reset the load status for the current engine.
  */
-static inline void bnx2x_clear_load_cnt(struct bnx2x *bp)
+static inline void bnx2x_clear_load_status(struct bnx2x *bp)
 {
-       u32 val = REG_RD(bp, BNX2X_RECOVERY_GLOB_REG);
+       u32 val;
        u32 mask = (BP_PATH(bp) ? BNX2X_PATH1_LOAD_CNT_MASK :
-                            BNX2X_PATH0_LOAD_CNT_MASK);
-
+                   BNX2X_PATH0_LOAD_CNT_MASK);
+       bnx2x_acquire_hw_lock(bp, HW_LOCK_RESOURCE_RECOVERY_REG);
+       val = REG_RD(bp, BNX2X_RECOVERY_GLOB_REG);
        REG_WR(bp, BNX2X_RECOVERY_GLOB_REG, val & (~mask));
+       bnx2x_release_hw_lock(bp, HW_LOCK_RESOURCE_RECOVERY_REG);
 }
 
 static inline void _print_next_block(int idx, const char *blk)
@@ -5410,6 +5431,7 @@ static void bnx2x_init_eth_fp(struct bnx2x *bp, int fp_idx)
 
        /* init shortcut */
        fp->ustorm_rx_prods_offset = bnx2x_rx_ustorm_prods_offset(fp);
+
        /* Setup SB indicies */
        fp->rx_cons_sb = BNX2X_RX_SB_INDEX;
 
@@ -6674,13 +6696,16 @@ static int bnx2x_init_hw_func(struct bnx2x *bp)
        u16 cdu_ilt_start;
        u32 addr, val;
        u32 main_mem_base, main_mem_size, main_mem_prty_clr;
-       int i, main_mem_width;
+       int i, main_mem_width, rc;
 
        DP(BNX2X_MSG_MCP, "starting func init  func %d\n", func);
 
        /* FLR cleanup - hmmm */
-       if (!CHIP_IS_E1x(bp))
-               bnx2x_pf_flr_clnup(bp);
+       if (!CHIP_IS_E1x(bp)) {
+               rc = bnx2x_pf_flr_clnup(bp);
+               if (rc)
+                       return rc;
+       }
 
        /* set MSI reconfigure capability */
        if (bp->common.int_block == INT_BLOCK_HC) {
@@ -7089,6 +7114,11 @@ int bnx2x_alloc_mem(struct bnx2x *bp)
        BNX2X_PCI_ALLOC(bp->slowpath, &bp->slowpath_mapping,
                        sizeof(struct bnx2x_slowpath));
 
+#ifdef BCM_CNIC
+       /* write address to which L5 should insert its values */
+       bp->cnic_eth_dev.addr_drv_info_to_mcp = &bp->slowpath->drv_info_to_mcp;
+#endif
+
        /* Allocated memory for FW statistics  */
        if (bnx2x_alloc_fw_stats_mem(bp))
                goto alloc_mem_err;
@@ -8445,13 +8475,38 @@ int bnx2x_leader_reset(struct bnx2x *bp)
 {
        int rc = 0;
        bool global = bnx2x_reset_is_global(bp);
+       u32 load_code;
+
+       /* if not going to reset MCP - load "fake" driver to reset HW while
+        * driver is owner of the HW
+        */
+       if (!global && !BP_NOMCP(bp)) {
+               load_code = bnx2x_fw_command(bp, DRV_MSG_CODE_LOAD_REQ, 0);
+               if (!load_code) {
+                       BNX2X_ERR("MCP response failure, aborting\n");
+                       rc = -EAGAIN;
+                       goto exit_leader_reset;
+               }
+               if ((load_code != FW_MSG_CODE_DRV_LOAD_COMMON_CHIP) &&
+                   (load_code != FW_MSG_CODE_DRV_LOAD_COMMON)) {
+                       BNX2X_ERR("MCP unexpected resp, aborting\n");
+                       rc = -EAGAIN;
+                       goto exit_leader_reset2;
+               }
+               load_code = bnx2x_fw_command(bp, DRV_MSG_CODE_LOAD_DONE, 0);
+               if (!load_code) {
+                       BNX2X_ERR("MCP response failure, aborting\n");
+                       rc = -EAGAIN;
+                       goto exit_leader_reset2;
+               }
+       }
 
        /* Try to recover after the failure */
        if (bnx2x_process_kill(bp, global)) {
                netdev_err(bp->dev, "Something bad had happen on engine %d! "
                                    "Aii!\n", BP_PATH(bp));
                rc = -EAGAIN;
-               goto exit_leader_reset;
+               goto exit_leader_reset2;
        }
 
        /*
@@ -8462,6 +8517,12 @@ int bnx2x_leader_reset(struct bnx2x *bp)
        if (global)
                bnx2x_clear_reset_global(bp);
 
+exit_leader_reset2:
+       /* unload "fake driver" if it was loaded */
+       if (!global && !BP_NOMCP(bp)) {
+               bnx2x_fw_command(bp, DRV_MSG_CODE_UNLOAD_REQ_WOL_MCP, 0);
+               bnx2x_fw_command(bp, DRV_MSG_CODE_UNLOAD_DONE, 0);
+       }
 exit_leader_reset:
        bp->is_leader = 0;
        bnx2x_release_leader_lock(bp);
@@ -8498,13 +8559,16 @@ static inline void bnx2x_recovery_failed(struct bnx2x *bp)
 static void bnx2x_parity_recover(struct bnx2x *bp)
 {
        bool global = false;
+       u32 error_recovered, error_unrecovered;
+       bool is_parity;
 
        DP(NETIF_MSG_HW, "Handling parity\n");
        while (1) {
                switch (bp->recovery_state) {
                case BNX2X_RECOVERY_INIT:
                        DP(NETIF_MSG_HW, "State is BNX2X_RECOVERY_INIT\n");
-                       bnx2x_chk_parity_attn(bp, &global, false);
+                       is_parity = bnx2x_chk_parity_attn(bp, &global, false);
+                       WARN_ON(!is_parity);
 
                        /* Try to get a LEADER_LOCK HW lock */
                        if (bnx2x_trylock_leader_lock(bp)) {
@@ -8528,15 +8592,6 @@ static void bnx2x_parity_recover(struct bnx2x *bp)
 
                        bp->recovery_state = BNX2X_RECOVERY_WAIT;
 
-                       /*
-                        * Reset MCP command sequence number and MCP mail box
-                        * sequence as we are going to reset the MCP.
-                        */
-                       if (global) {
-                               bp->fw_seq = 0;
-                               bp->fw_drv_pulse_wr_seq = 0;
-                       }
-
                        /* Ensure "is_leader", MCP command sequence and
                         * "recovery_state" update values are seen on other
                         * CPUs.
@@ -8548,10 +8603,10 @@ static void bnx2x_parity_recover(struct bnx2x *bp)
                        DP(NETIF_MSG_HW, "State is BNX2X_RECOVERY_WAIT\n");
                        if (bp->is_leader) {
                                int other_engine = BP_PATH(bp) ? 0 : 1;
-                               u32 other_load_counter =
-                                       bnx2x_get_load_cnt(bp, other_engine);
-                               u32 load_counter =
-                                       bnx2x_get_load_cnt(bp, BP_PATH(bp));
+                               bool other_load_status =
+                                       bnx2x_get_load_status(bp, other_engine);
+                               bool load_status =
+                                       bnx2x_get_load_status(bp, BP_PATH(bp));
                                global = bnx2x_reset_is_global(bp);
 
                                /*
@@ -8562,8 +8617,8 @@ static void bnx2x_parity_recover(struct bnx2x *bp)
                                 * the the gates will remain closed for that
                                 * engine.
                                 */
-                               if (load_counter ||
-                                   (global && other_load_counter)) {
+                               if (load_status ||
+                                   (global && other_load_status)) {
                                        /* Wait until all other functions get
                                         * down.
                                         */
@@ -8620,13 +8675,34 @@ static void bnx2x_parity_recover(struct bnx2x *bp)
                                                return;
                                        }
 
-                                       if (bnx2x_nic_load(bp, LOAD_NORMAL))
-                                               bnx2x_recovery_failed(bp);
-                                       else {
+                                       error_recovered =
+                                         bp->eth_stats.recoverable_error;
+                                       error_unrecovered =
+                                         bp->eth_stats.unrecoverable_error;
+                                       bp->recovery_state =
+                                               BNX2X_RECOVERY_NIC_LOADING;
+                                       if (bnx2x_nic_load(bp, LOAD_NORMAL)) {
+                                               error_unrecovered++;
+                                               netdev_err(bp->dev,
+                                                          "Recovery failed. "
+                                                          "Power cycle "
+                                                          "needed\n");
+                                               /* Disconnect this device */
+                                               netif_device_detach(bp->dev);
+                                               /* Shut down the power */
+                                               bnx2x_set_power_state(
+                                                       bp, PCI_D3hot);
+                                               smp_mb();
+                                       } else {
                                                bp->recovery_state =
                                                        BNX2X_RECOVERY_DONE;
+                                               error_recovered++;
                                                smp_mb();
                                        }
+                                       bp->eth_stats.recoverable_error =
+                                               error_recovered;
+                                       bp->eth_stats.unrecoverable_error =
+                                               error_unrecovered;
 
                                        return;
                                }
@@ -8637,6 +8713,8 @@ static void bnx2x_parity_recover(struct bnx2x *bp)
        }
 }
 
+static int bnx2x_close(struct net_device *dev);
+
 /* bnx2x_nic_unload() flushes the bnx2x_wq, thus reset task is
  * scheduled on a general queue in order to prevent a dead lock.
  */
@@ -8782,11 +8860,13 @@ static void __devinit bnx2x_undi_unload(struct bnx2x *bp)
 {
        u32 val;
 
-       /* Check if there is any driver already loaded */
-       val = REG_RD(bp, MISC_REG_UNPREPARED);
-       if (val == 0x1) {
+       /* possibly another driver is trying to reset the chip */
+       bnx2x_acquire_hw_lock(bp, HW_LOCK_RESOURCE_RESET);
+
+       /* check if doorbell queue is reset */
+       if (REG_RD(bp, GRCBASE_MISC + MISC_REGISTERS_RESET_REG_1_SET)
+           & MISC_REGISTERS_RESET_REG_1_RST_DORQ) {
 
-               bnx2x_acquire_hw_lock(bp, HW_LOCK_RESOURCE_RESET);
                /*
                 * Check if it is the UNDI driver
                 * UNDI driver initializes CID offset for normal bell to 0x7
@@ -8874,14 +8954,11 @@ static void __devinit bnx2x_undi_unload(struct bnx2x *bp)
 
                        /* restore our func and fw_seq */
                        bp->pf_num = orig_pf_num;
-                       bp->fw_seq =
-                             (SHMEM_RD(bp, func_mb[bp->pf_num].drv_mb_header) &
-                               DRV_MSG_SEQ_NUMBER_MASK);
                }
-
-               /* now it's safe to release the lock */
-               bnx2x_release_hw_lock(bp, HW_LOCK_RESOURCE_RESET);
        }
+
+       /* now it's safe to release the lock */
+       bnx2x_release_hw_lock(bp, HW_LOCK_RESOURCE_RESET);
 }
 
 static void __devinit bnx2x_get_common_hwinfo(struct bnx2x *bp)
@@ -9212,6 +9289,11 @@ static void __devinit bnx2x_link_settings_requested(struct bnx2x *bp)
                                        SPEED_AUTO_NEG;
                                bp->port.advertising[idx] |=
                                        bp->port.supported[idx];
+                               if (bp->link_params.phy[EXT_PHY1].type ==
+                                   PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM84833)
+                                       bp->port.advertising[idx] |=
+                                       (SUPPORTED_100baseT_Half |
+                                        SUPPORTED_100baseT_Full);
                        } else {
                                /* force 10G, no AN */
                                bp->link_params.req_line_speed[idx] =
@@ -9592,7 +9674,7 @@ static void __devinit bnx2x_get_mac_hwinfo(struct bnx2x *bp)
 
        if (BP_NOMCP(bp)) {
                BNX2X_ERROR("warning: random MAC workaround active\n");
-               random_ether_addr(bp->dev->dev_addr);
+               eth_hw_addr_random(bp->dev);
        } else if (IS_MF(bp)) {
                val2 = MF_CFG_RD(bp, func_mf_config[func].mac_upper);
                val = MF_CFG_RD(bp, func_mf_config[func].mac_lower);
@@ -9902,16 +9984,6 @@ static int __devinit bnx2x_get_hwinfo(struct bnx2x *bp)
 
        bnx2x_get_cnic_info(bp);
 
-       /* Get current FW pulse sequence */
-       if (!BP_NOMCP(bp)) {
-               int mb_idx = BP_FW_MB_IDX(bp);
-
-               bp->fw_drv_pulse_wr_seq =
-                               (SHMEM_RD(bp, func_mb[mb_idx].drv_pulse_mb) &
-                                DRV_PULSE_SEQ_MASK);
-               BNX2X_DEV_INFO("drv_pulse 0x%x\n", bp->fw_drv_pulse_wr_seq);
-       }
-
        return rc;
 }
 
@@ -10080,14 +10152,6 @@ static int __devinit bnx2x_init_bp(struct bnx2x *bp)
        if (!BP_NOMCP(bp))
                bnx2x_undi_unload(bp);
 
-       /* init fw_seq after undi_unload! */
-       if (!BP_NOMCP(bp)) {
-               bp->fw_seq =
-                       (SHMEM_RD(bp, func_mb[BP_FW_MB_IDX(bp)].drv_mb_header) &
-                        DRV_MSG_SEQ_NUMBER_MASK);
-               BNX2X_DEV_INFO("fw_seq 0x%08x\n", bp->fw_seq);
-       }
-
        if (CHIP_REV_IS_FPGA(bp))
                dev_err(&bp->pdev->dev, "FPGA detected\n");
 
@@ -10105,10 +10169,10 @@ static int __devinit bnx2x_init_bp(struct bnx2x *bp)
 
        /* Set TPA flags */
        if (bp->disable_tpa) {
-               bp->flags &= ~TPA_ENABLE_FLAG;
+               bp->flags &= ~(TPA_ENABLE_FLAG | GRO_ENABLE_FLAG);
                bp->dev->features &= ~NETIF_F_LRO;
        } else {
-               bp->flags |= TPA_ENABLE_FLAG;
+               bp->flags |= (TPA_ENABLE_FLAG | GRO_ENABLE_FLAG);
                bp->dev->features |= NETIF_F_LRO;
        }
 
@@ -10150,6 +10214,8 @@ static int __devinit bnx2x_init_bp(struct bnx2x *bp)
        if (CHIP_IS_E3B0(bp))
                bp->max_cos = BNX2X_MULTI_TX_COS_E3B0;
 
+       bp->gro_check = bnx2x_need_gro_check(bp->dev->mtu);
+
        return rc;
 }
 
@@ -10168,14 +10234,16 @@ static int bnx2x_open(struct net_device *dev)
        struct bnx2x *bp = netdev_priv(dev);
        bool global = false;
        int other_engine = BP_PATH(bp) ? 0 : 1;
-       u32 other_load_counter, load_counter;
+       bool other_load_status, load_status;
+
+       bp->stats_init = true;
 
        netif_carrier_off(dev);
 
        bnx2x_set_power_state(bp, PCI_D0);
 
-       other_load_counter = bnx2x_get_load_cnt(bp, other_engine);
-       load_counter = bnx2x_get_load_cnt(bp, BP_PATH(bp));
+       other_load_status = bnx2x_get_load_status(bp, other_engine);
+       load_status = bnx2x_get_load_status(bp, BP_PATH(bp));
 
        /*
         * If parity had happen during the unload, then attentions
@@ -10201,8 +10269,8 @@ static int bnx2x_open(struct net_device *dev)
                         * global blocks only the first in the chip should try
                         * to recover.
                         */
-                       if ((!load_counter &&
-                            (!global || !other_load_counter)) &&
+                       if ((!load_status &&
+                            (!global || !other_load_status)) &&
                            bnx2x_trylock_leader_lock(bp) &&
                            !bnx2x_leader_reset(bp)) {
                                netdev_info(bp->dev, "Recovered in open\n");
@@ -10226,7 +10294,7 @@ static int bnx2x_open(struct net_device *dev)
 }
 
 /* called with rtnl_lock */
-int bnx2x_close(struct net_device *dev)
+static int bnx2x_close(struct net_device *dev)
 {
        struct bnx2x *bp = netdev_priv(dev);
 
@@ -10521,6 +10589,7 @@ static int __devinit bnx2x_init_dev(struct pci_dev *pdev,
 {
        struct bnx2x *bp;
        int rc;
+       u32 pci_cfg_dword;
        bool chip_is_e1x = (board_type == BCM57710 ||
                            board_type == BCM57711 ||
                            board_type == BCM57711E);
@@ -10531,7 +10600,6 @@ static int __devinit bnx2x_init_dev(struct pci_dev *pdev,
        bp->dev = dev;
        bp->pdev = pdev;
        bp->flags = 0;
-       bp->pf_num = PCI_FUNC(pdev->devfn);
 
        rc = pci_enable_device(pdev);
        if (rc) {
@@ -10598,6 +10666,21 @@ static int __devinit bnx2x_init_dev(struct pci_dev *pdev,
                goto err_out_release;
        }
 
+       /* In E1/E1H use pci device function given by kernel.
+        * In E2/E3 read physical function from ME register since these chips
+        * support Physical Device Assignment where kernel BDF maybe arbitrary
+        * (depending on hypervisor).
+        */
+       if (chip_is_e1x)
+               bp->pf_num = PCI_FUNC(pdev->devfn);
+       else {/* chip is E2/3*/
+               pci_read_config_dword(bp->pdev,
+                                     PCICFG_ME_REGISTER, &pci_cfg_dword);
+               bp->pf_num = (u8)((pci_cfg_dword & ME_REG_ABS_PF_NUM) >>
+                   ME_REG_ABS_PF_NUM_SHIFT);
+       }
+       DP(BNX2X_MSG_SP, "me reg PF num: %d\n", bp->pf_num);
+
        bnx2x_set_power_state(bp, PCI_D0);
 
        /* clean indirect addresses */
@@ -10627,7 +10710,7 @@ static int __devinit bnx2x_init_dev(struct pci_dev *pdev,
                REG_WR(bp, PGLUE_B_REG_INTERNAL_PFID_ENABLE_TARGET_READ, 1);
 
        /* Reset the load counter */
-       bnx2x_clear_load_cnt(bp);
+       bnx2x_clear_load_status(bp);
 
        dev->watchdog_timeo = TX_TIMEOUT;
 
@@ -10637,8 +10720,9 @@ static int __devinit bnx2x_init_dev(struct pci_dev *pdev,
        dev->priv_flags |= IFF_UNICAST_FLT;
 
        dev->hw_features = NETIF_F_SG | NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM |
-               NETIF_F_TSO | NETIF_F_TSO_ECN | NETIF_F_TSO6 | NETIF_F_LRO |
-               NETIF_F_RXCSUM | NETIF_F_RXHASH | NETIF_F_HW_VLAN_TX;
+               NETIF_F_TSO | NETIF_F_TSO_ECN | NETIF_F_TSO6 |
+               NETIF_F_RXCSUM | NETIF_F_LRO | NETIF_F_GRO |
+               NETIF_F_RXHASH | NETIF_F_HW_VLAN_TX;
 
        dev->vlan_features = NETIF_F_SG | NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM |
                NETIF_F_TSO | NETIF_F_TSO_ECN | NETIF_F_TSO6 | NETIF_F_HIGHDMA;
@@ -10814,10 +10898,8 @@ static inline void be16_to_cpu_n(const u8 *_source, u8 *_target, u32 n)
 do {                                                                   \
        u32 len = be32_to_cpu(fw_hdr->arr.len);                         \
        bp->arr = kmalloc(len, GFP_KERNEL);                             \
-       if (!bp->arr) {                                                 \
-               pr_err("Failed to allocate %d bytes for "#arr"\n", len); \
+       if (!bp->arr)                                                   \
                goto lbl;                                               \
-       }                                                               \
        func(bp->firmware->data + be32_to_cpu(fw_hdr->arr.offset),      \
             (u8 *)bp->arr, len);                                       \
 } while (0)
@@ -11055,10 +11137,8 @@ static int __devinit bnx2x_init_one(struct pci_dev *pdev,
 
        /* dev zeroed in init_etherdev */
        dev = alloc_etherdev_mqs(sizeof(*bp), tx_count, rx_count);
-       if (!dev) {
-               dev_err(&pdev->dev, "Cannot allocate net device\n");
+       if (!dev)
                return -ENOMEM;
-       }
 
        bp = netdev_priv(dev);
 
@@ -11264,29 +11344,11 @@ static void bnx2x_eeh_recover(struct bnx2x *bp)
 
        mutex_init(&bp->port.phy_mutex);
 
-       bp->common.shmem_base = REG_RD(bp, MISC_REG_SHARED_MEM_ADDR);
-       bp->link_params.shmem_base = bp->common.shmem_base;
-       BNX2X_DEV_INFO("shmem offset is 0x%x\n", bp->common.shmem_base);
-
-       if (!bp->common.shmem_base ||
-           (bp->common.shmem_base < 0xA0000) ||
-           (bp->common.shmem_base >= 0xC0000)) {
-               BNX2X_DEV_INFO("MCP not active\n");
-               bp->flags |= NO_MCP_FLAG;
-               return;
-       }
 
        val = SHMEM_RD(bp, validity_map[BP_PORT(bp)]);
        if ((val & (SHR_MEM_VALIDITY_DEV_INFO | SHR_MEM_VALIDITY_MB))
                != (SHR_MEM_VALIDITY_DEV_INFO | SHR_MEM_VALIDITY_MB))
                BNX2X_ERR("BAD MCP validity signature\n");
-
-       if (!BP_NOMCP(bp)) {
-               bp->fw_seq =
-                   (SHMEM_RD(bp, func_mb[BP_FW_MB_IDX(bp)].drv_mb_header) &
-                   DRV_MSG_SEQ_NUMBER_MASK);
-               BNX2X_DEV_INFO("fw_seq 0x%08x\n", bp->fw_seq);
-       }
 }
 
 /**
@@ -11542,6 +11604,13 @@ static int bnx2x_cnic_sp_queue(struct net_device *dev,
                return -EIO;
 #endif
 
+       if ((bp->recovery_state != BNX2X_RECOVERY_DONE) &&
+           (bp->recovery_state != BNX2X_RECOVERY_NIC_LOADING)) {
+               netdev_err(dev, "Handling parity error recovery. Try again "
+                               "later\n");
+               return -EAGAIN;
+       }
+
        spin_lock_bh(&bp->spq_lock);
 
        for (i = 0; i < count; i++) {
index dddbcf6..fd7fb45 100644 (file)
@@ -1,6 +1,6 @@
 /* bnx2x_reg.h: Broadcom Everest network driver.
  *
- * Copyright (c) 2007-2011 Broadcom Corporation
+ * Copyright (c) 2007-2012 Broadcom Corporation
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
    The fields are: [4:0] - tail pointer; 10:5] - Link List size; 15:11] -
    header pointer. */
 #define UCM_REG_XX_TABLE                                        0xe0300
+#define UMAC_COMMAND_CONFIG_REG_HD_ENA                          (0x1<<10)
 #define UMAC_COMMAND_CONFIG_REG_IGNORE_TX_PAUSE                         (0x1<<28)
 #define UMAC_COMMAND_CONFIG_REG_LOOP_ENA                        (0x1<<15)
 #define UMAC_COMMAND_CONFIG_REG_NO_LGTH_CHECK                   (0x1<<24)
 #define MISC_REGISTERS_GPIO_PORT_SHIFT                          4
 #define MISC_REGISTERS_GPIO_SET_POS                             8
 #define MISC_REGISTERS_RESET_REG_1_CLEAR                        0x588
+#define MISC_REGISTERS_RESET_REG_1_RST_DORQ                     (0x1<<19)
 #define MISC_REGISTERS_RESET_REG_1_RST_HC                       (0x1<<29)
 #define MISC_REGISTERS_RESET_REG_1_RST_NIG                      (0x1<<7)
 #define MISC_REGISTERS_RESET_REG_1_RST_PXP                      (0x1<<26)
 #define MISC_REGISTERS_SPIO_OUTPUT_HIGH                         1
 #define MISC_REGISTERS_SPIO_OUTPUT_LOW                          0
 #define MISC_REGISTERS_SPIO_SET_POS                             8
-#define HW_LOCK_DRV_FLAGS                                       10
 #define HW_LOCK_MAX_RESOURCE_VALUE                              31
+#define HW_LOCK_RESOURCE_DRV_FLAGS                              10
 #define HW_LOCK_RESOURCE_GPIO                                   1
 #define HW_LOCK_RESOURCE_MDIO                                   0
+#define HW_LOCK_RESOURCE_NVRAM                                  12
 #define HW_LOCK_RESOURCE_PORT0_ATT_MASK                                 3
 #define HW_LOCK_RESOURCE_RECOVERY_LEADER_0                      8
 #define HW_LOCK_RESOURCE_RECOVERY_LEADER_1                      9
-#define HW_LOCK_RESOURCE_SPIO                                   2
+#define HW_LOCK_RESOURCE_RECOVERY_REG                           11
 #define HW_LOCK_RESOURCE_RESET                                  5
+#define HW_LOCK_RESOURCE_SPIO                                   2
 #define AEU_INPUTS_ATTN_BITS_ATC_HW_INTERRUPT                   (0x1<<4)
 #define AEU_INPUTS_ATTN_BITS_ATC_PARITY_ERROR                   (0x1<<5)
 #define AEU_INPUTS_ATTN_BITS_BRB_PARITY_ERROR                   (0x1<<18)
 #define PCICFG_MSI_CONTROL_64_BIT_ADDR_CAP     (0x1<<23)
 #define PCICFG_MSI_CONTROL_MSI_PVMASK_CAPABLE  (0x1<<24)
 #define PCICFG_GRC_ADDRESS                             0x78
-#define PCICFG_GRC_DATA                                0x80
+#define PCICFG_GRC_DATA                                0x80
+#define PCICFG_ME_REGISTER                             0x98
 #define PCICFG_MSIX_CAP_ID_OFFSET                      0xa0
 #define PCICFG_MSIX_CONTROL_TABLE_SIZE         (0x7ff<<16)
 #define PCICFG_MSIX_CONTROL_RESERVED           (0x7<<27)
 #define MDIO_CL73_IEEEB1_AN_LP_ADV1_ASYMMETRIC         0x0800
 #define MDIO_CL73_IEEEB1_AN_LP_ADV1_PAUSE_BOTH         0x0C00
 #define MDIO_CL73_IEEEB1_AN_LP_ADV1_PAUSE_MASK         0x0C00
+#define MDIO_CL73_IEEEB1_AN_LP_ADV2                    0x04
 
 #define MDIO_REG_BANK_RX0                              0x80b0
 #define MDIO_RX0_RX_STATUS                             0x10
@@ -6794,14 +6800,16 @@ Theotherbitsarereservedandshouldbezero*/
 #define MDIO_AN_REG_ADV_PAUSE_MASK             0x0C00
 #define MDIO_AN_REG_ADV                0x0011
 #define MDIO_AN_REG_ADV2               0x0012
-#define MDIO_AN_REG_LP_AUTO_NEG        0x0013
+#define MDIO_AN_REG_LP_AUTO_NEG                0x0013
+#define MDIO_AN_REG_LP_AUTO_NEG2       0x0014
 #define MDIO_AN_REG_MASTER_STATUS      0x0021
 /*bcm*/
 #define MDIO_AN_REG_LINK_STATUS        0x8304
 #define MDIO_AN_REG_CL37_CL73          0x8370
 #define MDIO_AN_REG_CL37_AN            0xffe0
 #define MDIO_AN_REG_CL37_FC_LD         0xffe4
-#define MDIO_AN_REG_CL37_FC_LP         0xffe5
+#define                MDIO_AN_REG_CL37_FC_LP          0xffe5
+#define                MDIO_AN_REG_1000T_STATUS        0xffea
 
 #define MDIO_AN_REG_8073_2_5G          0x8329
 #define MDIO_AN_REG_8073_BAM           0x8350
@@ -6966,6 +6974,7 @@ Theotherbitsarereservedandshouldbezero*/
 #define MDIO_WC_REG_SERDESDIGITAL_MISC1                        0x8308
 #define MDIO_WC_REG_SERDESDIGITAL_MISC2                        0x8309
 #define MDIO_WC_REG_DIGITAL3_UP1                       0x8329
+#define MDIO_WC_REG_DIGITAL3_LP_UP1                     0x832c
 #define MDIO_WC_REG_DIGITAL4_MISC3                     0x833c
 #define MDIO_WC_REG_DIGITAL5_MISC6                     0x8345
 #define MDIO_WC_REG_DIGITAL5_MISC7                     0x8349
index cb6339c..adfae6b 100644 (file)
@@ -1,6 +1,6 @@
 /* bnx2x_sp.c: Broadcom Everest network driver.
  *
- * Copyright 2011 Broadcom Corporation
+ * Copyright (c) 2011-2012 Broadcom Corporation
  *
  * Unless you and Broadcom execute a separate written software license
  * agreement governing use of this software, this software is licensed to you
@@ -1836,6 +1836,7 @@ static int bnx2x_vlan_mac_del_all(struct bnx2x *bp,
                        rc = exeq->remove(bp, exeq->owner, exeq_pos);
                        if (rc) {
                                BNX2X_ERR("Failed to remove command\n");
+                               spin_unlock_bh(&exeq->lock);
                                return rc;
                        }
                        list_del(&exeq_pos->link);
@@ -4430,9 +4431,10 @@ static void bnx2x_q_fill_init_rx_data(struct bnx2x_queue_sp_obj *o,
                                struct client_init_rx_data *rx_data,
                                unsigned long *flags)
 {
-               /* Rx data */
        rx_data->tpa_en = test_bit(BNX2X_Q_FLG_TPA, flags) *
                                CLIENT_INIT_RX_DATA_TPA_EN_IPV4;
+       rx_data->tpa_en |= test_bit(BNX2X_Q_FLG_TPA_GRO, flags) *
+                               CLIENT_INIT_RX_DATA_TPA_MODE;
        rx_data->vmqueue_mode_en_flg = 0;
 
        rx_data->cache_line_alignment_log_size =
index 66da39f..685d42e 100644 (file)
@@ -1,6 +1,6 @@
 /* bnx2x_sp.h: Broadcom Everest network driver.
  *
- * Copyright 2011 Broadcom Corporation
+ * Copyright (c) 2011-2012 Broadcom Corporation
  *
  * Unless you and Broadcom execute a separate written software license
  * agreement governing use of this software, this software is licensed to you
@@ -774,6 +774,7 @@ enum bnx2x_queue_cmd {
 enum {
        BNX2X_Q_FLG_TPA,
        BNX2X_Q_FLG_TPA_IPV6,
+       BNX2X_Q_FLG_TPA_GRO,
        BNX2X_Q_FLG_STATS,
        BNX2X_Q_FLG_ZERO_STATS,
        BNX2X_Q_FLG_ACTIVE,
@@ -803,10 +804,10 @@ enum bnx2x_q_type {
 };
 
 #define BNX2X_PRIMARY_CID_INDEX                        0
-#define BNX2X_MULTI_TX_COS_E1X                 1
+#define BNX2X_MULTI_TX_COS_E1X                 3 /* QM only */
 #define BNX2X_MULTI_TX_COS_E2_E3A0             2
 #define BNX2X_MULTI_TX_COS_E3B0                        3
-#define BNX2X_MULTI_TX_COS                     BNX2X_MULTI_TX_COS_E3B0
+#define BNX2X_MULTI_TX_COS                     3 /* Maximum possible */
 
 
 struct bnx2x_queue_init_params {
index 1adef26..14c961b 100644 (file)
@@ -1,6 +1,6 @@
 /* bnx2x_stats.c: Broadcom Everest network driver.
  *
- * Copyright (c) 2007-2011 Broadcom Corporation
+ * Copyright (c) 2007-2012 Broadcom Corporation
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -161,7 +161,7 @@ static void bnx2x_stats_pmf_update(struct bnx2x *bp)
        u32 *stats_comp = bnx2x_sp(bp, stats_comp);
 
        /* sanity */
-       if (!IS_MF(bp) || !bp->port.pmf || !bp->port.port_stx) {
+       if (!bp->port.pmf || !bp->port.port_stx) {
                BNX2X_ERR("BUG!\n");
                return;
        }
@@ -638,31 +638,30 @@ static void bnx2x_mstat_stats_update(struct bnx2x *bp)
                        tx_stat_dot3statsinternalmactransmiterrors);
        ADD_STAT64(stats_tx.tx_gtufl, tx_stat_mac_ufl);
 
-       ADD_64(estats->etherstatspkts1024octetsto1522octets_hi,
-              new->stats_tx.tx_gt1518_hi,
-              estats->etherstatspkts1024octetsto1522octets_lo,
-              new->stats_tx.tx_gt1518_lo);
+       estats->etherstatspkts1024octetsto1522octets_hi =
+           pstats->mac_stx[1].tx_stat_etherstatspkts1024octetsto1522octets_hi;
+       estats->etherstatspkts1024octetsto1522octets_lo =
+           pstats->mac_stx[1].tx_stat_etherstatspkts1024octetsto1522octets_lo;
 
-       ADD_64(estats->etherstatspktsover1522octets_hi,
-              new->stats_tx.tx_gt2047_hi,
-              estats->etherstatspktsover1522octets_lo,
-              new->stats_tx.tx_gt2047_lo);
+       estats->etherstatspktsover1522octets_hi =
+           pstats->mac_stx[1].tx_stat_mac_2047_hi;
+       estats->etherstatspktsover1522octets_lo =
+           pstats->mac_stx[1].tx_stat_mac_2047_lo;
 
        ADD_64(estats->etherstatspktsover1522octets_hi,
-              new->stats_tx.tx_gt4095_hi,
+              pstats->mac_stx[1].tx_stat_mac_4095_hi,
               estats->etherstatspktsover1522octets_lo,
-              new->stats_tx.tx_gt4095_lo);
+              pstats->mac_stx[1].tx_stat_mac_4095_lo);
 
        ADD_64(estats->etherstatspktsover1522octets_hi,
-              new->stats_tx.tx_gt9216_hi,
+              pstats->mac_stx[1].tx_stat_mac_9216_hi,
               estats->etherstatspktsover1522octets_lo,
-              new->stats_tx.tx_gt9216_lo);
-
+              pstats->mac_stx[1].tx_stat_mac_9216_lo);
 
        ADD_64(estats->etherstatspktsover1522octets_hi,
-              new->stats_tx.tx_gt16383_hi,
+              pstats->mac_stx[1].tx_stat_mac_16383_hi,
               estats->etherstatspktsover1522octets_lo,
-              new->stats_tx.tx_gt16383_lo);
+              pstats->mac_stx[1].tx_stat_mac_16383_lo);
 
        estats->pause_frames_received_hi =
                                pstats->mac_stx[1].rx_stat_mac_xpf_hi;
@@ -817,6 +816,7 @@ static int bnx2x_storm_stats_update(struct bnx2x *bp)
                                &bp->fw_stats_data->pf.tstorm_pf_statistics;
        struct host_func_stats *fstats = bnx2x_sp(bp, func_stats);
        struct bnx2x_eth_stats *estats = &bp->eth_stats;
+       struct bnx2x_eth_stats_old *estats_old = &bp->eth_stats_old;
        struct stats_counter *counters = &bp->fw_stats_data->storm_counters;
        int i;
        u16 cur_stats_counter;
@@ -857,21 +857,8 @@ static int bnx2x_storm_stats_update(struct bnx2x *bp)
                return -EAGAIN;
        }
 
-       memcpy(&(fstats->total_bytes_received_hi),
-              &(bnx2x_sp(bp, func_stats_base)->total_bytes_received_hi),
-              sizeof(struct host_func_stats) - 2*sizeof(u32));
        estats->error_bytes_received_hi = 0;
        estats->error_bytes_received_lo = 0;
-       estats->etherstatsoverrsizepkts_hi = 0;
-       estats->etherstatsoverrsizepkts_lo = 0;
-       estats->no_buff_discard_hi = 0;
-       estats->no_buff_discard_lo = 0;
-       estats->total_tpa_aggregations_hi = 0;
-       estats->total_tpa_aggregations_lo = 0;
-       estats->total_tpa_aggregated_frames_hi = 0;
-       estats->total_tpa_aggregated_frames_lo = 0;
-       estats->total_tpa_bytes_hi = 0;
-       estats->total_tpa_bytes_lo = 0;
 
        for_each_eth_queue(bp, i) {
                struct bnx2x_fastpath *fp = &bp->fp[i];
@@ -888,6 +875,8 @@ static int bnx2x_storm_stats_update(struct bnx2x *bp)
                        xstorm_queue_statistics;
                struct xstorm_per_queue_stats *old_xclient = &fp->old_xclient;
                struct bnx2x_eth_q_stats *qstats = &fp->eth_q_stats;
+               struct bnx2x_eth_q_stats_old *qstats_old = &fp->eth_q_stats_old;
+
                u32 diff;
 
                DP(BNX2X_MSG_STATS, "queue[%d]: ucast_sent 0x%x, "
@@ -897,20 +886,12 @@ static int bnx2x_storm_stats_update(struct bnx2x *bp)
 
                DP(BNX2X_MSG_STATS, "---------------\n");
 
-               qstats->total_broadcast_bytes_received_hi =
-                       le32_to_cpu(tclient->rcv_bcast_bytes.hi);
-               qstats->total_broadcast_bytes_received_lo =
-                       le32_to_cpu(tclient->rcv_bcast_bytes.lo);
-
-               qstats->total_multicast_bytes_received_hi =
-                       le32_to_cpu(tclient->rcv_mcast_bytes.hi);
-               qstats->total_multicast_bytes_received_lo =
-                       le32_to_cpu(tclient->rcv_mcast_bytes.lo);
-
-               qstats->total_unicast_bytes_received_hi =
-                       le32_to_cpu(tclient->rcv_ucast_bytes.hi);
-               qstats->total_unicast_bytes_received_lo =
-                       le32_to_cpu(tclient->rcv_ucast_bytes.lo);
+               UPDATE_QSTAT(tclient->rcv_bcast_bytes,
+                            total_broadcast_bytes_received);
+               UPDATE_QSTAT(tclient->rcv_mcast_bytes,
+                            total_multicast_bytes_received);
+               UPDATE_QSTAT(tclient->rcv_ucast_bytes,
+                            total_unicast_bytes_received);
 
                /*
                 * sum to total_bytes_received all
@@ -943,9 +924,9 @@ static int bnx2x_storm_stats_update(struct bnx2x *bp)
                                        total_multicast_packets_received);
                UPDATE_EXTEND_TSTAT(rcv_bcast_pkts,
                                        total_broadcast_packets_received);
-               UPDATE_EXTEND_TSTAT(pkts_too_big_discard,
-                                       etherstatsoverrsizepkts);
-               UPDATE_EXTEND_TSTAT(no_buff_discard, no_buff_discard);
+               UPDATE_EXTEND_E_TSTAT(pkts_too_big_discard,
+                                     etherstatsoverrsizepkts);
+               UPDATE_EXTEND_E_TSTAT(no_buff_discard, no_buff_discard);
 
                SUB_EXTEND_USTAT(ucast_no_buff_pkts,
                                        total_unicast_packets_received);
@@ -953,24 +934,17 @@ static int bnx2x_storm_stats_update(struct bnx2x *bp)
                                        total_multicast_packets_received);
                SUB_EXTEND_USTAT(bcast_no_buff_pkts,
                                        total_broadcast_packets_received);
-               UPDATE_EXTEND_USTAT(ucast_no_buff_pkts, no_buff_discard);
-               UPDATE_EXTEND_USTAT(mcast_no_buff_pkts, no_buff_discard);
-               UPDATE_EXTEND_USTAT(bcast_no_buff_pkts, no_buff_discard);
-
-               qstats->total_broadcast_bytes_transmitted_hi =
-                       le32_to_cpu(xclient->bcast_bytes_sent.hi);
-               qstats->total_broadcast_bytes_transmitted_lo =
-                       le32_to_cpu(xclient->bcast_bytes_sent.lo);
-
-               qstats->total_multicast_bytes_transmitted_hi =
-                       le32_to_cpu(xclient->mcast_bytes_sent.hi);
-               qstats->total_multicast_bytes_transmitted_lo =
-                       le32_to_cpu(xclient->mcast_bytes_sent.lo);
-
-               qstats->total_unicast_bytes_transmitted_hi =
-                       le32_to_cpu(xclient->ucast_bytes_sent.hi);
-               qstats->total_unicast_bytes_transmitted_lo =
-                       le32_to_cpu(xclient->ucast_bytes_sent.lo);
+               UPDATE_EXTEND_E_USTAT(ucast_no_buff_pkts, no_buff_discard);
+               UPDATE_EXTEND_E_USTAT(mcast_no_buff_pkts, no_buff_discard);
+               UPDATE_EXTEND_E_USTAT(bcast_no_buff_pkts, no_buff_discard);
+
+               UPDATE_QSTAT(xclient->bcast_bytes_sent,
+                            total_broadcast_bytes_transmitted);
+               UPDATE_QSTAT(xclient->mcast_bytes_sent,
+                            total_multicast_bytes_transmitted);
+               UPDATE_QSTAT(xclient->ucast_bytes_sent,
+                            total_unicast_bytes_transmitted);
+
                /*
                 * sum to total_bytes_transmitted all
                 * unicast/multicast/broadcast
@@ -1006,110 +980,54 @@ static int bnx2x_storm_stats_update(struct bnx2x *bp)
                                    total_transmitted_dropped_packets_error);
 
                /* TPA aggregations completed */
-               UPDATE_EXTEND_USTAT(coalesced_events, total_tpa_aggregations);
+               UPDATE_EXTEND_E_USTAT(coalesced_events, total_tpa_aggregations);
                /* Number of network frames aggregated by TPA */
-               UPDATE_EXTEND_USTAT(coalesced_pkts,
-                                   total_tpa_aggregated_frames);
+               UPDATE_EXTEND_E_USTAT(coalesced_pkts,
+                                     total_tpa_aggregated_frames);
                /* Total number of bytes in completed TPA aggregations */
-               qstats->total_tpa_bytes_lo =
-                       le32_to_cpu(uclient->coalesced_bytes.lo);
-               qstats->total_tpa_bytes_hi =
-                       le32_to_cpu(uclient->coalesced_bytes.hi);
-
-               /* TPA stats per-function */
-               ADD_64(estats->total_tpa_aggregations_hi,
-                      qstats->total_tpa_aggregations_hi,
-                      estats->total_tpa_aggregations_lo,
-                      qstats->total_tpa_aggregations_lo);
-               ADD_64(estats->total_tpa_aggregated_frames_hi,
-                      qstats->total_tpa_aggregated_frames_hi,
-                      estats->total_tpa_aggregated_frames_lo,
-                      qstats->total_tpa_aggregated_frames_lo);
-               ADD_64(estats->total_tpa_bytes_hi,
-                      qstats->total_tpa_bytes_hi,
-                      estats->total_tpa_bytes_lo,
-                      qstats->total_tpa_bytes_lo);
-
-               ADD_64(fstats->total_bytes_received_hi,
-                      qstats->total_bytes_received_hi,
-                      fstats->total_bytes_received_lo,
-                      qstats->total_bytes_received_lo);
-               ADD_64(fstats->total_bytes_transmitted_hi,
-                      qstats->total_bytes_transmitted_hi,
-                      fstats->total_bytes_transmitted_lo,
-                      qstats->total_bytes_transmitted_lo);
-               ADD_64(fstats->total_unicast_packets_received_hi,
-                      qstats->total_unicast_packets_received_hi,
-                      fstats->total_unicast_packets_received_lo,
-                      qstats->total_unicast_packets_received_lo);
-               ADD_64(fstats->total_multicast_packets_received_hi,
-                      qstats->total_multicast_packets_received_hi,
-                      fstats->total_multicast_packets_received_lo,
-                      qstats->total_multicast_packets_received_lo);
-               ADD_64(fstats->total_broadcast_packets_received_hi,
-                      qstats->total_broadcast_packets_received_hi,
-                      fstats->total_broadcast_packets_received_lo,
-                      qstats->total_broadcast_packets_received_lo);
-               ADD_64(fstats->total_unicast_packets_transmitted_hi,
-                      qstats->total_unicast_packets_transmitted_hi,
-                      fstats->total_unicast_packets_transmitted_lo,
-                      qstats->total_unicast_packets_transmitted_lo);
-               ADD_64(fstats->total_multicast_packets_transmitted_hi,
-                      qstats->total_multicast_packets_transmitted_hi,
-                      fstats->total_multicast_packets_transmitted_lo,
-                      qstats->total_multicast_packets_transmitted_lo);
-               ADD_64(fstats->total_broadcast_packets_transmitted_hi,
-                      qstats->total_broadcast_packets_transmitted_hi,
-                      fstats->total_broadcast_packets_transmitted_lo,
-                      qstats->total_broadcast_packets_transmitted_lo);
-               ADD_64(fstats->valid_bytes_received_hi,
-                      qstats->valid_bytes_received_hi,
-                      fstats->valid_bytes_received_lo,
-                      qstats->valid_bytes_received_lo);
-
-               ADD_64(estats->etherstatsoverrsizepkts_hi,
-                      qstats->etherstatsoverrsizepkts_hi,
-                      estats->etherstatsoverrsizepkts_lo,
-                      qstats->etherstatsoverrsizepkts_lo);
-               ADD_64(estats->no_buff_discard_hi, qstats->no_buff_discard_hi,
-                      estats->no_buff_discard_lo, qstats->no_buff_discard_lo);
+               UPDATE_QSTAT(uclient->coalesced_bytes, total_tpa_bytes);
+
+               UPDATE_ESTAT_QSTAT_64(total_tpa_bytes);
+
+               UPDATE_FSTAT_QSTAT(total_bytes_received);
+               UPDATE_FSTAT_QSTAT(total_bytes_transmitted);
+               UPDATE_FSTAT_QSTAT(total_unicast_packets_received);
+               UPDATE_FSTAT_QSTAT(total_multicast_packets_received);
+               UPDATE_FSTAT_QSTAT(total_broadcast_packets_received);
+               UPDATE_FSTAT_QSTAT(total_unicast_packets_transmitted);
+               UPDATE_FSTAT_QSTAT(total_multicast_packets_transmitted);
+               UPDATE_FSTAT_QSTAT(total_broadcast_packets_transmitted);
+               UPDATE_FSTAT_QSTAT(valid_bytes_received);
        }
 
-       ADD_64(fstats->total_bytes_received_hi,
+       ADD_64(estats->total_bytes_received_hi,
               estats->rx_stat_ifhcinbadoctets_hi,
-              fstats->total_bytes_received_lo,
+              estats->total_bytes_received_lo,
               estats->rx_stat_ifhcinbadoctets_lo);
 
-       ADD_64(fstats->total_bytes_received_hi,
+       ADD_64(estats->total_bytes_received_hi,
               le32_to_cpu(tfunc->rcv_error_bytes.hi),
-              fstats->total_bytes_received_lo,
+              estats->total_bytes_received_lo,
               le32_to_cpu(tfunc->rcv_error_bytes.lo));
 
-       memcpy(estats, &(fstats->total_bytes_received_hi),
-              sizeof(struct host_func_stats) - 2*sizeof(u32));
-
        ADD_64(estats->error_bytes_received_hi,
               le32_to_cpu(tfunc->rcv_error_bytes.hi),
               estats->error_bytes_received_lo,
               le32_to_cpu(tfunc->rcv_error_bytes.lo));
 
-       ADD_64(estats->etherstatsoverrsizepkts_hi,
-              estats->rx_stat_dot3statsframestoolong_hi,
-              estats->etherstatsoverrsizepkts_lo,
-              estats->rx_stat_dot3statsframestoolong_lo);
+       UPDATE_ESTAT(etherstatsoverrsizepkts, rx_stat_dot3statsframestoolong);
+
        ADD_64(estats->error_bytes_received_hi,
               estats->rx_stat_ifhcinbadoctets_hi,
               estats->error_bytes_received_lo,
               estats->rx_stat_ifhcinbadoctets_lo);
 
        if (bp->port.pmf) {
-               estats->mac_filter_discard =
-                               le32_to_cpu(tport->mac_filter_discard);
-               estats->mf_tag_discard =
-                               le32_to_cpu(tport->mf_tag_discard);
-               estats->brb_truncate_discard =
-                               le32_to_cpu(tport->brb_truncate_discard);
-               estats->mac_discard = le32_to_cpu(tport->mac_discard);
+               struct bnx2x_fw_port_stats_old *fwstats = &bp->fw_stats_old;
+               UPDATE_FW_STAT(mac_filter_discard);
+               UPDATE_FW_STAT(mf_tag_discard);
+               UPDATE_FW_STAT(brb_truncate_discard);
+               UPDATE_FW_STAT(mac_discard);
        }
 
        fstats->host_func_stats_start = ++fstats->host_func_stats_end;
@@ -1143,7 +1061,7 @@ static void bnx2x_net_stats_update(struct bnx2x *bp)
        tmp = estats->mac_discard;
        for_each_rx_queue(bp, i)
                tmp += le32_to_cpu(bp->fp[i].old_tclient.checksum_discard);
-       nstats->rx_dropped = tmp;
+       nstats->rx_dropped = tmp + bp->net_stats_old.rx_dropped;
 
        nstats->tx_dropped = 0;
 
@@ -1191,17 +1109,15 @@ static void bnx2x_drv_stats_update(struct bnx2x *bp)
        struct bnx2x_eth_stats *estats = &bp->eth_stats;
        int i;
 
-       estats->driver_xoff = 0;
-       estats->rx_err_discard_pkt = 0;
-       estats->rx_skb_alloc_failed = 0;
-       estats->hw_csum_err = 0;
        for_each_queue(bp, i) {
                struct bnx2x_eth_q_stats *qstats = &bp->fp[i].eth_q_stats;
+               struct bnx2x_eth_q_stats_old *qstats_old =
+                                               &bp->fp[i].eth_q_stats_old;
 
-               estats->driver_xoff += qstats->driver_xoff;
-               estats->rx_err_discard_pkt += qstats->rx_err_discard_pkt;
-               estats->rx_skb_alloc_failed += qstats->rx_skb_alloc_failed;
-               estats->hw_csum_err += qstats->hw_csum_err;
+               UPDATE_ESTAT_QSTAT(driver_xoff);
+               UPDATE_ESTAT_QSTAT(rx_err_discard_pkt);
+               UPDATE_ESTAT_QSTAT(rx_skb_alloc_failed);
+               UPDATE_ESTAT_QSTAT(hw_csum_err);
        }
 }
 
@@ -1446,33 +1362,6 @@ static void bnx2x_port_stats_base_init(struct bnx2x *bp)
        bnx2x_stats_comp(bp);
 }
 
-static void bnx2x_func_stats_base_init(struct bnx2x *bp)
-{
-       int vn, vn_max = IS_MF(bp) ? BP_MAX_VN_NUM(bp) : E1VN_MAX;
-       u32 func_stx;
-
-       /* sanity */
-       if (!bp->port.pmf || !bp->func_stx) {
-               BNX2X_ERR("BUG!\n");
-               return;
-       }
-
-       /* save our func_stx */
-       func_stx = bp->func_stx;
-
-       for (vn = VN_0; vn < vn_max; vn++) {
-               int mb_idx = BP_FW_MB_IDX_VN(bp, vn);
-
-               bp->func_stx = SHMEM_RD(bp, func_mb[mb_idx].fw_mb_param);
-               bnx2x_func_stats_init(bp);
-               bnx2x_hw_stats_post(bp);
-               bnx2x_stats_comp(bp);
-       }
-
-       /* restore our func_stx */
-       bp->func_stx = func_stx;
-}
-
 static void bnx2x_func_stats_base_update(struct bnx2x *bp)
 {
        struct dmae_command *dmae = &bp->stats_dmae;
@@ -1491,8 +1380,8 @@ static void bnx2x_func_stats_base_update(struct bnx2x *bp)
                                         true, DMAE_COMP_PCI);
        dmae->src_addr_lo = bp->func_stx >> 2;
        dmae->src_addr_hi = 0;
-       dmae->dst_addr_lo = U64_LO(bnx2x_sp_mapping(bp, func_stats_base));
-       dmae->dst_addr_hi = U64_HI(bnx2x_sp_mapping(bp, func_stats_base));
+       dmae->dst_addr_lo = U64_LO(bnx2x_sp_mapping(bp, func_stats));
+       dmae->dst_addr_hi = U64_HI(bnx2x_sp_mapping(bp, func_stats));
        dmae->len = sizeof(struct host_func_stats) >> 2;
        dmae->comp_addr_lo = U64_LO(bnx2x_sp_mapping(bp, stats_comp));
        dmae->comp_addr_hi = U64_HI(bnx2x_sp_mapping(bp, stats_comp));
@@ -1653,6 +1542,10 @@ void bnx2x_stats_init(struct bnx2x *bp)
        DP(BNX2X_MSG_STATS, "port_stx 0x%x  func_stx 0x%x\n",
           bp->port.port_stx, bp->func_stx);
 
+       /* pmf should retrieve port statistics from SP on a non-init*/
+       if (!bp->stats_init && bp->port.pmf && bp->port.port_stx)
+               bnx2x_stats_handle(bp, STATS_EVENT_PMF);
+
        port = BP_PORT(bp);
        /* port stats */
        memset(&(bp->port.old_nig_stats), 0, sizeof(struct nig_stats));
@@ -1674,24 +1567,83 @@ void bnx2x_stats_init(struct bnx2x *bp)
                memset(&fp->old_tclient, 0, sizeof(fp->old_tclient));
                memset(&fp->old_uclient, 0, sizeof(fp->old_uclient));
                memset(&fp->old_xclient, 0, sizeof(fp->old_xclient));
-               memset(&fp->eth_q_stats, 0, sizeof(fp->eth_q_stats));
+               if (bp->stats_init) {
+                       memset(&fp->eth_q_stats, 0, sizeof(fp->eth_q_stats));
+                       memset(&fp->eth_q_stats_old, 0,
+                              sizeof(fp->eth_q_stats_old));
+               }
        }
 
        /* Prepare statistics ramrod data */
        bnx2x_prep_fw_stats_req(bp);
 
        memset(&bp->dev->stats, 0, sizeof(bp->dev->stats));
-       memset(&bp->eth_stats, 0, sizeof(bp->eth_stats));
+       if (bp->stats_init) {
+               memset(&bp->net_stats_old, 0, sizeof(bp->net_stats_old));
+               memset(&bp->fw_stats_old, 0, sizeof(bp->fw_stats_old));
+               memset(&bp->eth_stats_old, 0, sizeof(bp->eth_stats_old));
+               memset(&bp->eth_stats, 0, sizeof(bp->eth_stats));
 
-       bp->stats_state = STATS_STATE_DISABLED;
+               /* Clean SP from previous statistics */
+               if (bp->func_stx) {
+                       memset(bnx2x_sp(bp, func_stats), 0,
+                              sizeof(struct host_func_stats));
+                       bnx2x_func_stats_init(bp);
+                       bnx2x_hw_stats_post(bp);
+                       bnx2x_stats_comp(bp);
+               }
+       }
 
-       if (bp->port.pmf) {
-               if (bp->port.port_stx)
-                       bnx2x_port_stats_base_init(bp);
+       bp->stats_state = STATS_STATE_DISABLED;
 
-               if (bp->func_stx)
-                       bnx2x_func_stats_base_init(bp);
+       if (bp->port.pmf && bp->port.port_stx)
+               bnx2x_port_stats_base_init(bp);
 
-       } else if (bp->func_stx)
+       /* On a non-init, retrieve previous statistics from SP */
+       if (!bp->stats_init && bp->func_stx)
                bnx2x_func_stats_base_update(bp);
+
+       /* mark the end of statistics initializiation */
+       bp->stats_init = false;
+}
+
+void bnx2x_save_statistics(struct bnx2x *bp)
+{
+       int i;
+       struct net_device_stats *nstats = &bp->dev->stats;
+
+       /* save queue statistics */
+       for_each_eth_queue(bp, i) {
+               struct bnx2x_fastpath *fp = &bp->fp[i];
+               struct bnx2x_eth_q_stats *qstats = &fp->eth_q_stats;
+               struct bnx2x_eth_q_stats_old *qstats_old = &fp->eth_q_stats_old;
+
+               UPDATE_QSTAT_OLD(total_unicast_bytes_received_hi);
+               UPDATE_QSTAT_OLD(total_unicast_bytes_received_lo);
+               UPDATE_QSTAT_OLD(total_broadcast_bytes_received_hi);
+               UPDATE_QSTAT_OLD(total_broadcast_bytes_received_lo);
+               UPDATE_QSTAT_OLD(total_multicast_bytes_received_hi);
+               UPDATE_QSTAT_OLD(total_multicast_bytes_received_lo);
+               UPDATE_QSTAT_OLD(total_unicast_bytes_transmitted_hi);
+               UPDATE_QSTAT_OLD(total_unicast_bytes_transmitted_lo);
+               UPDATE_QSTAT_OLD(total_broadcast_bytes_transmitted_hi);
+               UPDATE_QSTAT_OLD(total_broadcast_bytes_transmitted_lo);
+               UPDATE_QSTAT_OLD(total_multicast_bytes_transmitted_hi);
+               UPDATE_QSTAT_OLD(total_multicast_bytes_transmitted_lo);
+               UPDATE_QSTAT_OLD(total_tpa_bytes_hi);
+               UPDATE_QSTAT_OLD(total_tpa_bytes_lo);
+       }
+
+       /* save net_device_stats statistics */
+       bp->net_stats_old.rx_dropped = nstats->rx_dropped;
+
+       /* store port firmware statistics */
+       if (bp->port.pmf && IS_MF(bp)) {
+               struct bnx2x_eth_stats *estats = &bp->eth_stats;
+               struct bnx2x_fw_port_stats_old *fwstats = &bp->fw_stats_old;
+               UPDATE_FW_STAT_OLD(mac_filter_discard);
+               UPDATE_FW_STAT_OLD(mf_tag_discard);
+               UPDATE_FW_STAT_OLD(brb_truncate_discard);
+               UPDATE_FW_STAT_OLD(mac_discard);
+       }
 }
index 683deb0..39ffd6d 100644 (file)
@@ -1,6 +1,6 @@
 /* bnx2x_stats.h: Broadcom Everest network driver.
  *
- * Copyright (c) 2007-2011 Broadcom Corporation
+ * Copyright (c) 2007-2012 Broadcom Corporation
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -199,6 +199,10 @@ struct bnx2x_eth_stats {
        u32 pfc_frames_received_lo;
        u32 pfc_frames_sent_hi;
        u32 pfc_frames_sent_lo;
+
+       /* Recovery */
+       u32 recoverable_error;
+       u32 unrecoverable_error;
 };
 
 
@@ -260,6 +264,69 @@ struct bnx2x_eth_q_stats {
        u32 total_tpa_bytes_lo;
 };
 
+struct bnx2x_eth_stats_old {
+       u32 rx_stat_dot3statsframestoolong_hi;
+       u32 rx_stat_dot3statsframestoolong_lo;
+};
+
+struct bnx2x_eth_q_stats_old {
+       /* Fields to perserve over fw reset*/
+       u32 total_unicast_bytes_received_hi;
+       u32 total_unicast_bytes_received_lo;
+       u32 total_broadcast_bytes_received_hi;
+       u32 total_broadcast_bytes_received_lo;
+       u32 total_multicast_bytes_received_hi;
+       u32 total_multicast_bytes_received_lo;
+       u32 total_unicast_bytes_transmitted_hi;
+       u32 total_unicast_bytes_transmitted_lo;
+       u32 total_broadcast_bytes_transmitted_hi;
+       u32 total_broadcast_bytes_transmitted_lo;
+       u32 total_multicast_bytes_transmitted_hi;
+       u32 total_multicast_bytes_transmitted_lo;
+       u32 total_tpa_bytes_hi;
+       u32 total_tpa_bytes_lo;
+
+       /* Fields to perserve last of */
+       u32 total_bytes_received_hi;
+       u32 total_bytes_received_lo;
+       u32 total_bytes_transmitted_hi;
+       u32 total_bytes_transmitted_lo;
+       u32 total_unicast_packets_received_hi;
+       u32 total_unicast_packets_received_lo;
+       u32 total_multicast_packets_received_hi;
+       u32 total_multicast_packets_received_lo;
+       u32 total_broadcast_packets_received_hi;
+       u32 total_broadcast_packets_received_lo;
+       u32 total_unicast_packets_transmitted_hi;
+       u32 total_unicast_packets_transmitted_lo;
+       u32 total_multicast_packets_transmitted_hi;
+       u32 total_multicast_packets_transmitted_lo;
+       u32 total_broadcast_packets_transmitted_hi;
+       u32 total_broadcast_packets_transmitted_lo;
+       u32 valid_bytes_received_hi;
+       u32 valid_bytes_received_lo;
+
+       u32 total_tpa_bytes_hi_old;
+       u32 total_tpa_bytes_lo_old;
+
+       u32 driver_xoff_old;
+       u32 rx_err_discard_pkt_old;
+       u32 rx_skb_alloc_failed_old;
+       u32 hw_csum_err_old;
+};
+
+struct bnx2x_net_stats_old {
+        u32 rx_dropped;
+};
+
+struct bnx2x_fw_port_stats_old {
+        u32 mac_filter_discard;
+        u32 mf_tag_discard;
+        u32 brb_truncate_discard;
+        u32 mac_discard;
+};
+
+
 /****************************************************************************
 * Macros
 ****************************************************************************/
@@ -344,11 +411,28 @@ struct bnx2x_eth_q_stats {
                ADD_EXTEND_64(qstats->t##_hi, qstats->t##_lo, diff); \
        } while (0)
 
+#define UPDATE_EXTEND_E_TSTAT(s, t) \
+       do { \
+               UPDATE_EXTEND_TSTAT(s, t); \
+               ADD_EXTEND_64(estats->t##_hi, estats->t##_lo, diff); \
+       } while (0)
+
 #define UPDATE_EXTEND_USTAT(s, t) \
        do { \
                diff = le32_to_cpu(uclient->s) - le32_to_cpu(old_uclient->s); \
                old_uclient->s = uclient->s; \
-               ADD_EXTEND_64(qstats->t##_hi, qstats->t##_lo, diff); \
+       } while (0)
+
+#define UPDATE_EXTEND_E_USTAT(s, t) \
+       do { \
+               UPDATE_EXTEND_USTAT(s, t); \
+               ADD_EXTEND_64(estats->t##_hi, estats->t##_lo, diff); \
+       } while (0)
+
+#define UPDATE_EXTEND_E_USTAT(s, t) \
+       do { \
+               UPDATE_EXTEND_USTAT(s, t); \
+               ADD_EXTEND_64(estats->t##_hi, estats->t##_lo, diff); \
        } while (0)
 
 #define UPDATE_EXTEND_XSTAT(s, t) \
@@ -358,6 +442,66 @@ struct bnx2x_eth_q_stats {
                ADD_EXTEND_64(qstats->t##_hi, qstats->t##_lo, diff); \
        } while (0)
 
+#define UPDATE_QSTAT(s, t) \
+       do { \
+               qstats->t##_hi = qstats_old->t##_hi + le32_to_cpu(s.hi); \
+               qstats->t##_lo = qstats_old->t##_lo + le32_to_cpu(s.lo); \
+       } while (0)
+
+#define UPDATE_QSTAT_OLD(f) \
+       do { \
+               qstats_old->f = qstats->f; \
+       } while (0)
+
+#define UPDATE_ESTAT_QSTAT_64(s) \
+       do { \
+               ADD_64(estats->s##_hi, qstats->s##_hi, \
+                      estats->s##_lo, qstats->s##_lo); \
+               SUB_64(estats->s##_hi, qstats_old->s##_hi_old, \
+                      estats->s##_lo, qstats_old->s##_lo_old); \
+               qstats_old->s##_hi_old = qstats->s##_hi; \
+               qstats_old->s##_lo_old = qstats->s##_lo; \
+       } while (0)
+
+#define UPDATE_ESTAT_QSTAT(s) \
+       do { \
+               estats->s += qstats->s; \
+               estats->s -= qstats_old->s##_old; \
+               qstats_old->s##_old = qstats->s; \
+       } while (0)
+
+#define UPDATE_FSTAT_QSTAT(s) \
+       do { \
+               ADD_64(fstats->s##_hi, qstats->s##_hi, \
+                      fstats->s##_lo, qstats->s##_lo); \
+               SUB_64(fstats->s##_hi, qstats_old->s##_hi, \
+                      fstats->s##_lo, qstats_old->s##_lo); \
+               estats->s##_hi = fstats->s##_hi; \
+               estats->s##_lo = fstats->s##_lo; \
+               qstats_old->s##_hi = qstats->s##_hi; \
+               qstats_old->s##_lo = qstats->s##_lo; \
+       } while (0)
+
+#define UPDATE_FW_STAT(s) \
+       do { \
+               estats->s = le32_to_cpu(tport->s) + fwstats->s; \
+       } while (0)
+
+#define UPDATE_FW_STAT_OLD(f) \
+       do { \
+               fwstats->f = estats->f; \
+       } while (0)
+
+#define UPDATE_ESTAT(s, t) \
+       do { \
+               SUB_64(estats->s##_hi, estats_old->t##_hi, \
+                      estats->s##_lo, estats_old->t##_lo); \
+               ADD_64(estats->s##_hi, estats->t##_hi, \
+                      estats->s##_lo, estats->t##_lo); \
+               estats_old->t##_hi = estats->t##_hi; \
+               estats_old->t##_lo = estats->t##_lo; \
+       } while (0)
+
 /* minuend -= subtrahend */
 #define SUB_64(m_hi, s_hi, m_lo, s_lo) \
        do { \
@@ -384,4 +528,10 @@ void bnx2x_stats_init(struct bnx2x *bp);
 
 void bnx2x_stats_handle(struct bnx2x *bp, enum bnx2x_stats_event event);
 
+/**
+ * bnx2x_save_statistics - save statistics when unloading.
+ *
+ * @bp:                driver handle
+ */
+void bnx2x_save_statistics(struct bnx2x *bp);
 #endif /* BNX2X_STATS_H */
index 818a573..7b65716 100644 (file)
@@ -1,6 +1,6 @@
 /* cnic.c: Broadcom CNIC core network driver.
  *
- * Copyright (c) 2006-2011 Broadcom Corporation
+ * Copyright (c) 2006-2012 Broadcom Corporation
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -380,6 +380,8 @@ static int cnic_iscsi_nl_msg_recv(struct cnic_dev *dev, u32 msg_type,
                if (cnic_in_use(csk) &&
                    test_bit(SK_F_CONNECT_START, &csk->flags)) {
 
+                       csk->vlan_id = path_resp->vlan_id;
+
                        memcpy(csk->ha, path_resp->mac_addr, 6);
                        if (test_bit(SK_F_IPV6, &csk->flags))
                                memcpy(&csk->src_ip[0], &path_resp->src.v6_addr,
@@ -2521,12 +2523,35 @@ static void cnic_bnx2x_kwqe_err(struct cnic_dev *dev, struct kwqe *kwqe)
        u32 cid;
        u32 opcode = KWQE_OPCODE(kwqe->kwqe_op_flag);
        u32 layer_code = kwqe->kwqe_op_flag & KWQE_LAYER_MASK;
+       u32 kcqe_op;
        int ulp_type;
 
        cid = kwqe->kwqe_info0;
        memset(&kcqe, 0, sizeof(kcqe));
 
-       if (layer_code == KWQE_FLAGS_LAYER_MASK_L5_ISCSI) {
+       if (layer_code == KWQE_FLAGS_LAYER_MASK_L5_FCOE) {
+               u32 l5_cid = 0;
+
+               ulp_type = CNIC_ULP_FCOE;
+               if (opcode == FCOE_KWQE_OPCODE_DISABLE_CONN) {
+                       struct fcoe_kwqe_conn_enable_disable *req;
+
+                       req = (struct fcoe_kwqe_conn_enable_disable *) kwqe;
+                       kcqe_op = FCOE_KCQE_OPCODE_DISABLE_CONN;
+                       cid = req->context_id;
+                       l5_cid = req->conn_id;
+               } else if (opcode == FCOE_KWQE_OPCODE_DESTROY) {
+                       kcqe_op = FCOE_KCQE_OPCODE_DESTROY_FUNC;
+               } else {
+                       return;
+               }
+               kcqe.kcqe_op_flag = kcqe_op << KCQE_FLAGS_OPCODE_SHIFT;
+               kcqe.kcqe_op_flag |= KCQE_FLAGS_LAYER_MASK_L5_FCOE;
+               kcqe.kcqe_info1 = FCOE_KCQE_COMPLETION_STATUS_NIC_ERROR;
+               kcqe.kcqe_info2 = cid;
+               kcqe.kcqe_info0 = l5_cid;
+
+       } else if (layer_code == KWQE_FLAGS_LAYER_MASK_L5_ISCSI) {
                ulp_type = CNIC_ULP_ISCSI;
                if (opcode == ISCSI_KWQE_OPCODE_UPDATE_CONN)
                        cid = kwqe->kwqe_info1;
@@ -2539,7 +2564,6 @@ static void cnic_bnx2x_kwqe_err(struct cnic_dev *dev, struct kwqe *kwqe)
 
        } else if (layer_code == KWQE_FLAGS_LAYER_MASK_L4) {
                struct l4_kcq *l4kcqe = (struct l4_kcq *) &kcqe;
-               u32 kcqe_op;
 
                ulp_type = CNIC_ULP_L4;
                if (opcode == L4_KWQE_OPCODE_VALUE_CONNECT1)
@@ -2686,9 +2710,17 @@ static int cnic_submit_bnx2x_fcoe_kwqes(struct cnic_dev *dev,
                                   opcode);
                        break;
                }
-               if (ret < 0)
+               if (ret < 0) {
                        netdev_err(dev->netdev, "KWQE(0x%x) failed\n",
                                   opcode);
+
+                       /* Possibly bnx2x parity error, send completion
+                        * to ulp drivers with error code to speed up
+                        * cleanup and reset recovery.
+                        */
+                       if (ret == -EIO || ret == -EAGAIN)
+                               cnic_bnx2x_kwqe_err(dev, kwqe);
+               }
                i += work;
        }
        return 0;
@@ -3901,6 +3933,8 @@ static void cnic_cm_process_kcqe(struct cnic_dev *dev, struct kcqe *kcqe)
        case L4_KCQE_OPCODE_VALUE_CONNECT_COMPLETE:
                if (l4kcqe->status == 0)
                        set_bit(SK_F_OFFLD_COMPLETE, &csk->flags);
+               else if (l4kcqe->status == L4_KCQE_COMPLETION_STATUS_NIC_ERROR)
+                       set_bit(SK_F_HW_ERR, &csk->flags);
 
                smp_mb__before_clear_bit();
                clear_bit(SK_F_OFFLD_SCHED, &csk->flags);
index 86936f6..06ca002 100644 (file)
@@ -1,7 +1,7 @@
 
 /* cnic.c: Broadcom CNIC core network driver.
  *
- * Copyright (c) 2006-2009 Broadcom Corporation
+ * Copyright (c) 2006-2012 Broadcom Corporation
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -69,6 +69,7 @@
 
 #define FCOE_KCQE_COMPLETION_STATUS_ERROR      (0x1)
 #define FCOE_KCQE_COMPLETION_STATUS_CTX_ALLOC_FAILURE  (0x3)
+#define FCOE_KCQE_COMPLETION_STATUS_NIC_ERROR  (0x5)
 
 /* KCQ (kernel completion queue) response op codes */
 #define L4_KCQE_OPCODE_VALUE_CLOSE_COMP             (53)
@@ -1392,9 +1393,9 @@ struct xstorm_fcoe_extra_ag_context_section {
 #define __XSTORM_FCOE_EXTRA_AG_CONTEXT_SECTION_RESERVED_DA_EXPIRATION_FLAG_SHIFT 7
 #endif
        u32 snd_nxt;
-       u32 tx_wnd;
-       u32 __reserved55;
-       u32 local_adv_wnd;
+       u32 __xfrqe_bd_addr_lo;
+       u32 __xfrqe_bd_addr_hi;
+       u32 __xfrqe_data1;
 #if defined(__BIG_ENDIAN)
        u8 __agg_val8_th;
        u8 __tx_dest;
@@ -1480,13 +1481,13 @@ struct xstorm_fcoe_extra_ag_context_section {
 #endif
        u32 __tcp_agg_vars6;
 #if defined(__BIG_ENDIAN)
-       u16 __agg_misc6;
+       u16 __xfrqe_mng;
        u16 __tcp_agg_vars7;
 #elif defined(__LITTLE_ENDIAN)
        u16 __tcp_agg_vars7;
-       u16 __agg_misc6;
+       u16 __xfrqe_mng;
 #endif
-       u32 __agg_val10;
+       u32 __xfrqe_data0;
        u32 __agg_val10_th;
 #if defined(__BIG_ENDIAN)
        u16 __reserved3;
@@ -1706,11 +1707,11 @@ struct xstorm_fcoe_ag_context {
 #define XSTORM_FCOE_AG_CONTEXT_AGG_MISC3 (0xFF<<24)
 #define XSTORM_FCOE_AG_CONTEXT_AGG_MISC3_SHIFT 24
 #if defined(__BIG_ENDIAN)
-       u16 agg_misc0;
+       u16 __cache_wqe_db;
        u16 sq_prod;
 #elif defined(__LITTLE_ENDIAN)
        u16 sq_prod;
-       u16 agg_misc0;
+       u16 __cache_wqe_db;
 #endif
 #if defined(__BIG_ENDIAN)
        u8 agg_val3;
@@ -3016,8 +3017,8 @@ struct fcoe_tce_tx_wr_rx_rd_const {
 #define FCOE_TCE_TX_WR_RX_RD_CONST_RSRV1_SHIFT 5
 #define FCOE_TCE_TX_WR_RX_RD_CONST_TX_SEQ_INIT (0x1<<6)
 #define FCOE_TCE_TX_WR_RX_RD_CONST_TX_SEQ_INIT_SHIFT 6
-#define FCOE_TCE_TX_WR_RX_RD_CONST_RSRV2 (0x1<<7)
-#define FCOE_TCE_TX_WR_RX_RD_CONST_RSRV2_SHIFT 7
+#define FCOE_TCE_TX_WR_RX_RD_CONST_TX_COMP_TRNS (0x1<<7)
+#define FCOE_TCE_TX_WR_RX_RD_CONST_TX_COMP_TRNS_SHIFT 7
        __le16 rsrv3;
        __le32 verify_tx_seq;
 };
@@ -4298,7 +4299,7 @@ struct xstorm_eth_context_section {
 #endif
 #if defined(__BIG_ENDIAN)
        u16 reserved_vlan_type;
-       u16 params;
+       u16 vlan_params;
 #define XSTORM_ETH_CONTEXT_SECTION_VLAN_ID (0xFFF<<0)
 #define XSTORM_ETH_CONTEXT_SECTION_VLAN_ID_SHIFT 0
 #define XSTORM_ETH_CONTEXT_SECTION_CFI (0x1<<12)
@@ -4306,7 +4307,7 @@ struct xstorm_eth_context_section {
 #define XSTORM_ETH_CONTEXT_SECTION_PRIORITY (0x7<<13)
 #define XSTORM_ETH_CONTEXT_SECTION_PRIORITY_SHIFT 13
 #elif defined(__LITTLE_ENDIAN)
-       u16 params;
+       u16 vlan_params;
 #define XSTORM_ETH_CONTEXT_SECTION_VLAN_ID (0xFFF<<0)
 #define XSTORM_ETH_CONTEXT_SECTION_VLAN_ID_SHIFT 0
 #define XSTORM_ETH_CONTEXT_SECTION_CFI (0x1<<12)
index 1517763..60deb84 100644 (file)
@@ -12,8 +12,8 @@
 #ifndef CNIC_IF_H
 #define CNIC_IF_H
 
-#define CNIC_MODULE_VERSION    "2.5.8"
-#define CNIC_MODULE_RELDATE    "Jan 3, 2012"
+#define CNIC_MODULE_VERSION    "2.5.9"
+#define CNIC_MODULE_RELDATE    "Feb 8, 2012"
 
 #define CNIC_ULP_RDMA          0
 #define CNIC_ULP_ISCSI         1
index 084904c..49e7a25 100644 (file)
@@ -2623,8 +2623,6 @@ static int __devinit sbmac_probe(struct platform_device *pldev)
         */
        dev = alloc_etherdev(sizeof(struct sbmac_softc));
        if (!dev) {
-               printk(KERN_ERR "%s: unable to allocate etherdev\n",
-                      dev_name(&pldev->dev));
                err = -ENOMEM;
                goto out_unmap;
        }
index 423d023..bc236b6 100644 (file)
@@ -4,7 +4,7 @@
  * Copyright (C) 2001, 2002, 2003, 2004 David S. Miller (davem@redhat.com)
  * Copyright (C) 2001, 2002, 2003 Jeff Garzik (jgarzik@pobox.com)
  * Copyright (C) 2004 Sun Microsystems Inc.
- * Copyright (C) 2005-2011 Broadcom Corporation.
+ * Copyright (C) 2005-2012 Broadcom Corporation.
  *
  * Firmware is:
  *     Derived from proprietary unpublished source code,
@@ -204,6 +204,7 @@ static inline void _tg3_flag_clear(enum TG3_FLAGS flag, unsigned long *bits)
 #define TG3_RAW_IP_ALIGN 2
 
 #define TG3_FW_UPDATE_TIMEOUT_SEC      5
+#define TG3_FW_UPDATE_FREQ_SEC         (TG3_FW_UPDATE_TIMEOUT_SEC / 2)
 
 #define FIRMWARE_TG3           "tigon/tg3.bin"
 #define FIRMWARE_TG3TSO                "tigon/tg3_tso.bin"
@@ -1453,33 +1454,23 @@ static void tg3_wait_for_event_ack(struct tg3 *tp)
 }
 
 /* tp->lock is held. */
-static void tg3_ump_link_report(struct tg3 *tp)
+static void tg3_phy_gather_ump_data(struct tg3 *tp, u32 *data)
 {
-       u32 reg;
-       u32 val;
-
-       if (!tg3_flag(tp, 5780_CLASS) || !tg3_flag(tp, ENABLE_ASF))
-               return;
-
-       tg3_wait_for_event_ack(tp);
-
-       tg3_write_mem(tp, NIC_SRAM_FW_CMD_MBOX, FWCMD_NICDRV_LINK_UPDATE);
-
-       tg3_write_mem(tp, NIC_SRAM_FW_CMD_LEN_MBOX, 14);
+       u32 reg, val;
 
        val = 0;
        if (!tg3_readphy(tp, MII_BMCR, &reg))
                val = reg << 16;
        if (!tg3_readphy(tp, MII_BMSR, &reg))
                val |= (reg & 0xffff);
-       tg3_write_mem(tp, NIC_SRAM_FW_CMD_DATA_MBOX, val);
+       *data++ = val;
 
        val = 0;
        if (!tg3_readphy(tp, MII_ADVERTISE, &reg))
                val = reg << 16;
        if (!tg3_readphy(tp, MII_LPA, &reg))
                val |= (reg & 0xffff);
-       tg3_write_mem(tp, NIC_SRAM_FW_CMD_DATA_MBOX + 4, val);
+       *data++ = val;
 
        val = 0;
        if (!(tp->phy_flags & TG3_PHYFLG_MII_SERDES)) {
@@ -1488,13 +1479,33 @@ static void tg3_ump_link_report(struct tg3 *tp)
                if (!tg3_readphy(tp, MII_STAT1000, &reg))
                        val |= (reg & 0xffff);
        }
-       tg3_write_mem(tp, NIC_SRAM_FW_CMD_DATA_MBOX + 8, val);
+       *data++ = val;
 
        if (!tg3_readphy(tp, MII_PHYADDR, &reg))
                val = reg << 16;
        else
                val = 0;
-       tg3_write_mem(tp, NIC_SRAM_FW_CMD_DATA_MBOX + 12, val);
+       *data++ = val;
+}
+
+/* tp->lock is held. */
+static void tg3_ump_link_report(struct tg3 *tp)
+{
+       u32 data[4];
+
+       if (!tg3_flag(tp, 5780_CLASS) || !tg3_flag(tp, ENABLE_ASF))
+               return;
+
+       tg3_phy_gather_ump_data(tp, data);
+
+       tg3_wait_for_event_ack(tp);
+
+       tg3_write_mem(tp, NIC_SRAM_FW_CMD_MBOX, FWCMD_NICDRV_LINK_UPDATE);
+       tg3_write_mem(tp, NIC_SRAM_FW_CMD_LEN_MBOX, 14);
+       tg3_write_mem(tp, NIC_SRAM_FW_CMD_DATA_MBOX + 0x0, data[0]);
+       tg3_write_mem(tp, NIC_SRAM_FW_CMD_DATA_MBOX + 0x4, data[1]);
+       tg3_write_mem(tp, NIC_SRAM_FW_CMD_DATA_MBOX + 0x8, data[2]);
+       tg3_write_mem(tp, NIC_SRAM_FW_CMD_DATA_MBOX + 0xc, data[3]);
 
        tg3_generate_fw_event(tp);
 }
@@ -1809,13 +1820,13 @@ static void tg3_adjust_link(struct net_device *dev)
                      (6 << TX_LENGTHS_IPG_SHIFT) |
                      (32 << TX_LENGTHS_SLOT_TIME_SHIFT)));
 
-       if ((phydev->link && tp->link_config.active_speed == SPEED_INVALID) ||
-           (!phydev->link && tp->link_config.active_speed != SPEED_INVALID) ||
+       if (phydev->link != tp->old_link ||
            phydev->speed != tp->link_config.active_speed ||
            phydev->duplex != tp->link_config.active_duplex ||
            oldflowctrl != tp->link_config.active_flowctrl)
                linkmesg = 1;
 
+       tp->old_link = phydev->link;
        tp->link_config.active_speed = phydev->speed;
        tp->link_config.active_duplex = phydev->duplex;
 
@@ -1884,10 +1895,10 @@ static void tg3_phy_start(struct tg3 *tp)
 
        if (tp->phy_flags & TG3_PHYFLG_IS_LOW_POWER) {
                tp->phy_flags &= ~TG3_PHYFLG_IS_LOW_POWER;
-               phydev->speed = tp->link_config.orig_speed;
-               phydev->duplex = tp->link_config.orig_duplex;
-               phydev->autoneg = tp->link_config.orig_autoneg;
-               phydev->advertising = tp->link_config.orig_advertising;
+               phydev->speed = tp->link_config.speed;
+               phydev->duplex = tp->link_config.duplex;
+               phydev->autoneg = tp->link_config.autoneg;
+               phydev->advertising = tp->link_config.advertising;
        }
 
        phy_start(phydev);
@@ -2709,9 +2720,6 @@ static int tg3_5700_link_polarity(struct tg3 *tp, u32 speed)
        return 0;
 }
 
-static int tg3_setup_phy(struct tg3 *, int);
-static int tg3_halt_cpu(struct tg3 *, u32);
-
 static void tg3_power_down_phy(struct tg3 *tp, bool do_low_power)
 {
        u32 val;
@@ -2978,177 +2986,430 @@ static int tg3_nvram_read_be32(struct tg3 *tp, u32 offset, __be32 *val)
        return res;
 }
 
-#define RX_CPU_SCRATCH_BASE    0x30000
-#define RX_CPU_SCRATCH_SIZE    0x04000
-#define TX_CPU_SCRATCH_BASE    0x34000
-#define TX_CPU_SCRATCH_SIZE    0x04000
-
-/* tp->lock is held. */
-static int tg3_halt_cpu(struct tg3 *tp, u32 offset)
+static int tg3_nvram_write_block_using_eeprom(struct tg3 *tp,
+                                   u32 offset, u32 len, u8 *buf)
 {
-       int i;
+       int i, j, rc = 0;
+       u32 val;
 
-       BUG_ON(offset == TX_CPU_BASE && tg3_flag(tp, 5705_PLUS));
+       for (i = 0; i < len; i += 4) {
+               u32 addr;
+               __be32 data;
 
-       if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) {
-               u32 val = tr32(GRC_VCPU_EXT_CTRL);
+               addr = offset + i;
 
-               tw32(GRC_VCPU_EXT_CTRL, val | GRC_VCPU_EXT_CTRL_HALT_CPU);
-               return 0;
-       }
-       if (offset == RX_CPU_BASE) {
-               for (i = 0; i < 10000; i++) {
-                       tw32(offset + CPU_STATE, 0xffffffff);
-                       tw32(offset + CPU_MODE,  CPU_MODE_HALT);
-                       if (tr32(offset + CPU_MODE) & CPU_MODE_HALT)
-                               break;
-               }
+               memcpy(&data, buf + i, 4);
 
-               tw32(offset + CPU_STATE, 0xffffffff);
-               tw32_f(offset + CPU_MODE,  CPU_MODE_HALT);
-               udelay(10);
-       } else {
-               for (i = 0; i < 10000; i++) {
-                       tw32(offset + CPU_STATE, 0xffffffff);
-                       tw32(offset + CPU_MODE,  CPU_MODE_HALT);
-                       if (tr32(offset + CPU_MODE) & CPU_MODE_HALT)
+               /*
+                * The SEEPROM interface expects the data to always be opposite
+                * the native endian format.  We accomplish this by reversing
+                * all the operations that would have been performed on the
+                * data from a call to tg3_nvram_read_be32().
+                */
+               tw32(GRC_EEPROM_DATA, swab32(be32_to_cpu(data)));
+
+               val = tr32(GRC_EEPROM_ADDR);
+               tw32(GRC_EEPROM_ADDR, val | EEPROM_ADDR_COMPLETE);
+
+               val &= ~(EEPROM_ADDR_ADDR_MASK | EEPROM_ADDR_DEVID_MASK |
+                       EEPROM_ADDR_READ);
+               tw32(GRC_EEPROM_ADDR, val |
+                       (0 << EEPROM_ADDR_DEVID_SHIFT) |
+                       (addr & EEPROM_ADDR_ADDR_MASK) |
+                       EEPROM_ADDR_START |
+                       EEPROM_ADDR_WRITE);
+
+               for (j = 0; j < 1000; j++) {
+                       val = tr32(GRC_EEPROM_ADDR);
+
+                       if (val & EEPROM_ADDR_COMPLETE)
                                break;
+                       msleep(1);
+               }
+               if (!(val & EEPROM_ADDR_COMPLETE)) {
+                       rc = -EBUSY;
+                       break;
                }
        }
 
-       if (i >= 10000) {
-               netdev_err(tp->dev, "%s timed out, %s CPU\n",
-                          __func__, offset == RX_CPU_BASE ? "RX" : "TX");
-               return -ENODEV;
-       }
-
-       /* Clear firmware's nvram arbitration. */
-       if (tg3_flag(tp, NVRAM))
-               tw32(NVRAM_SWARB, SWARB_REQ_CLR0);
-       return 0;
+       return rc;
 }
 
-struct fw_info {
-       unsigned int fw_base;
-       unsigned int fw_len;
-       const __be32 *fw_data;
-};
-
-/* tp->lock is held. */
-static int tg3_load_firmware_cpu(struct tg3 *tp, u32 cpu_base,
-                                u32 cpu_scratch_base, int cpu_scratch_size,
-                                struct fw_info *info)
+/* offset and length are dword aligned */
+static int tg3_nvram_write_block_unbuffered(struct tg3 *tp, u32 offset, u32 len,
+               u8 *buf)
 {
-       int err, lock_err, i;
-       void (*write_op)(struct tg3 *, u32, u32);
+       int ret = 0;
+       u32 pagesize = tp->nvram_pagesize;
+       u32 pagemask = pagesize - 1;
+       u32 nvram_cmd;
+       u8 *tmp;
 
-       if (cpu_base == TX_CPU_BASE && tg3_flag(tp, 5705_PLUS)) {
-               netdev_err(tp->dev,
-                          "%s: Trying to load TX cpu firmware which is 5705\n",
-                          __func__);
-               return -EINVAL;
-       }
+       tmp = kmalloc(pagesize, GFP_KERNEL);
+       if (tmp == NULL)
+               return -ENOMEM;
 
-       if (tg3_flag(tp, 5705_PLUS))
-               write_op = tg3_write_mem;
-       else
-               write_op = tg3_write_indirect_reg32;
+       while (len) {
+               int j;
+               u32 phy_addr, page_off, size;
 
-       /* It is possible that bootcode is still loading at this point.
-        * Get the nvram lock first before halting the cpu.
-        */
-       lock_err = tg3_nvram_lock(tp);
-       err = tg3_halt_cpu(tp, cpu_base);
-       if (!lock_err)
-               tg3_nvram_unlock(tp);
-       if (err)
-               goto out;
+               phy_addr = offset & ~pagemask;
 
-       for (i = 0; i < cpu_scratch_size; i += sizeof(u32))
-               write_op(tp, cpu_scratch_base + i, 0);
-       tw32(cpu_base + CPU_STATE, 0xffffffff);
-       tw32(cpu_base + CPU_MODE, tr32(cpu_base+CPU_MODE)|CPU_MODE_HALT);
-       for (i = 0; i < (info->fw_len / sizeof(u32)); i++)
-               write_op(tp, (cpu_scratch_base +
-                             (info->fw_base & 0xffff) +
-                             (i * sizeof(u32))),
-                             be32_to_cpu(info->fw_data[i]));
+               for (j = 0; j < pagesize; j += 4) {
+                       ret = tg3_nvram_read_be32(tp, phy_addr + j,
+                                                 (__be32 *) (tmp + j));
+                       if (ret)
+                               break;
+               }
+               if (ret)
+                       break;
 
-       err = 0;
+               page_off = offset & pagemask;
+               size = pagesize;
+               if (len < size)
+                       size = len;
 
-out:
-       return err;
-}
+               len -= size;
 
-/* tp->lock is held. */
-static int tg3_load_5701_a0_firmware_fix(struct tg3 *tp)
-{
-       struct fw_info info;
-       const __be32 *fw_data;
-       int err, i;
+               memcpy(tmp + page_off, buf, size);
 
-       fw_data = (void *)tp->fw->data;
+               offset = offset + (pagesize - page_off);
 
-       /* Firmware blob starts with version numbers, followed by
-          start address and length. We are setting complete length.
-          length = end_address_of_bss - start_address_of_text.
-          Remainder is the blob to be loaded contiguously
-          from start address. */
+               tg3_enable_nvram_access(tp);
 
-       info.fw_base = be32_to_cpu(fw_data[1]);
-       info.fw_len = tp->fw->size - 12;
-       info.fw_data = &fw_data[3];
+               /*
+                * Before we can erase the flash page, we need
+                * to issue a special "write enable" command.
+                */
+               nvram_cmd = NVRAM_CMD_WREN | NVRAM_CMD_GO | NVRAM_CMD_DONE;
 
-       err = tg3_load_firmware_cpu(tp, RX_CPU_BASE,
-                                   RX_CPU_SCRATCH_BASE, RX_CPU_SCRATCH_SIZE,
-                                   &info);
-       if (err)
-               return err;
+               if (tg3_nvram_exec_cmd(tp, nvram_cmd))
+                       break;
 
-       err = tg3_load_firmware_cpu(tp, TX_CPU_BASE,
-                                   TX_CPU_SCRATCH_BASE, TX_CPU_SCRATCH_SIZE,
-                                   &info);
-       if (err)
-               return err;
+               /* Erase the target page */
+               tw32(NVRAM_ADDR, phy_addr);
 
-       /* Now startup only the RX cpu. */
-       tw32(RX_CPU_BASE + CPU_STATE, 0xffffffff);
-       tw32_f(RX_CPU_BASE + CPU_PC, info.fw_base);
+               nvram_cmd = NVRAM_CMD_GO | NVRAM_CMD_DONE | NVRAM_CMD_WR |
+                       NVRAM_CMD_FIRST | NVRAM_CMD_LAST | NVRAM_CMD_ERASE;
 
-       for (i = 0; i < 5; i++) {
-               if (tr32(RX_CPU_BASE + CPU_PC) == info.fw_base)
+               if (tg3_nvram_exec_cmd(tp, nvram_cmd))
                        break;
-               tw32(RX_CPU_BASE + CPU_STATE, 0xffffffff);
-               tw32(RX_CPU_BASE + CPU_MODE,  CPU_MODE_HALT);
-               tw32_f(RX_CPU_BASE + CPU_PC, info.fw_base);
-               udelay(1000);
-       }
-       if (i >= 5) {
-               netdev_err(tp->dev, "%s fails to set RX CPU PC, is %08x "
-                          "should be %08x\n", __func__,
-                          tr32(RX_CPU_BASE + CPU_PC), info.fw_base);
-               return -ENODEV;
-       }
-       tw32(RX_CPU_BASE + CPU_STATE, 0xffffffff);
-       tw32_f(RX_CPU_BASE + CPU_MODE,  0x00000000);
 
-       return 0;
-}
+               /* Issue another write enable to start the write. */
+               nvram_cmd = NVRAM_CMD_WREN | NVRAM_CMD_GO | NVRAM_CMD_DONE;
 
-/* tp->lock is held. */
-static int tg3_load_tso_firmware(struct tg3 *tp)
-{
-       struct fw_info info;
-       const __be32 *fw_data;
-       unsigned long cpu_base, cpu_scratch_base, cpu_scratch_size;
-       int err, i;
+               if (tg3_nvram_exec_cmd(tp, nvram_cmd))
+                       break;
 
-       if (tg3_flag(tp, HW_TSO_1) ||
-           tg3_flag(tp, HW_TSO_2) ||
-           tg3_flag(tp, HW_TSO_3))
-               return 0;
+               for (j = 0; j < pagesize; j += 4) {
+                       __be32 data;
 
-       fw_data = (void *)tp->fw->data;
+                       data = *((__be32 *) (tmp + j));
+
+                       tw32(NVRAM_WRDATA, be32_to_cpu(data));
+
+                       tw32(NVRAM_ADDR, phy_addr + j);
+
+                       nvram_cmd = NVRAM_CMD_GO | NVRAM_CMD_DONE |
+                               NVRAM_CMD_WR;
+
+                       if (j == 0)
+                               nvram_cmd |= NVRAM_CMD_FIRST;
+                       else if (j == (pagesize - 4))
+                               nvram_cmd |= NVRAM_CMD_LAST;
+
+                       ret = tg3_nvram_exec_cmd(tp, nvram_cmd);
+                       if (ret)
+                               break;
+               }
+               if (ret)
+                       break;
+       }
+
+       nvram_cmd = NVRAM_CMD_WRDI | NVRAM_CMD_GO | NVRAM_CMD_DONE;
+       tg3_nvram_exec_cmd(tp, nvram_cmd);
+
+       kfree(tmp);
+
+       return ret;
+}
+
+/* offset and length are dword aligned */
+static int tg3_nvram_write_block_buffered(struct tg3 *tp, u32 offset, u32 len,
+               u8 *buf)
+{
+       int i, ret = 0;
+
+       for (i = 0; i < len; i += 4, offset += 4) {
+               u32 page_off, phy_addr, nvram_cmd;
+               __be32 data;
+
+               memcpy(&data, buf + i, 4);
+               tw32(NVRAM_WRDATA, be32_to_cpu(data));
+
+               page_off = offset % tp->nvram_pagesize;
+
+               phy_addr = tg3_nvram_phys_addr(tp, offset);
+
+               nvram_cmd = NVRAM_CMD_GO | NVRAM_CMD_DONE | NVRAM_CMD_WR;
+
+               if (page_off == 0 || i == 0)
+                       nvram_cmd |= NVRAM_CMD_FIRST;
+               if (page_off == (tp->nvram_pagesize - 4))
+                       nvram_cmd |= NVRAM_CMD_LAST;
+
+               if (i == (len - 4))
+                       nvram_cmd |= NVRAM_CMD_LAST;
+
+               if ((nvram_cmd & NVRAM_CMD_FIRST) ||
+                   !tg3_flag(tp, FLASH) ||
+                   !tg3_flag(tp, 57765_PLUS))
+                       tw32(NVRAM_ADDR, phy_addr);
+
+               if (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5752 &&
+                   !tg3_flag(tp, 5755_PLUS) &&
+                   (tp->nvram_jedecnum == JEDEC_ST) &&
+                   (nvram_cmd & NVRAM_CMD_FIRST)) {
+                       u32 cmd;
+
+                       cmd = NVRAM_CMD_WREN | NVRAM_CMD_GO | NVRAM_CMD_DONE;
+                       ret = tg3_nvram_exec_cmd(tp, cmd);
+                       if (ret)
+                               break;
+               }
+               if (!tg3_flag(tp, FLASH)) {
+                       /* We always do complete word writes to eeprom. */
+                       nvram_cmd |= (NVRAM_CMD_FIRST | NVRAM_CMD_LAST);
+               }
+
+               ret = tg3_nvram_exec_cmd(tp, nvram_cmd);
+               if (ret)
+                       break;
+       }
+       return ret;
+}
+
+/* offset and length are dword aligned */
+static int tg3_nvram_write_block(struct tg3 *tp, u32 offset, u32 len, u8 *buf)
+{
+       int ret;
+
+       if (tg3_flag(tp, EEPROM_WRITE_PROT)) {
+               tw32_f(GRC_LOCAL_CTRL, tp->grc_local_ctrl &
+                      ~GRC_LCLCTRL_GPIO_OUTPUT1);
+               udelay(40);
+       }
+
+       if (!tg3_flag(tp, NVRAM)) {
+               ret = tg3_nvram_write_block_using_eeprom(tp, offset, len, buf);
+       } else {
+               u32 grc_mode;
+
+               ret = tg3_nvram_lock(tp);
+               if (ret)
+                       return ret;
+
+               tg3_enable_nvram_access(tp);
+               if (tg3_flag(tp, 5750_PLUS) && !tg3_flag(tp, PROTECTED_NVRAM))
+                       tw32(NVRAM_WRITE1, 0x406);
+
+               grc_mode = tr32(GRC_MODE);
+               tw32(GRC_MODE, grc_mode | GRC_MODE_NVRAM_WR_ENABLE);
+
+               if (tg3_flag(tp, NVRAM_BUFFERED) || !tg3_flag(tp, FLASH)) {
+                       ret = tg3_nvram_write_block_buffered(tp, offset, len,
+                               buf);
+               } else {
+                       ret = tg3_nvram_write_block_unbuffered(tp, offset, len,
+                               buf);
+               }
+
+               grc_mode = tr32(GRC_MODE);
+               tw32(GRC_MODE, grc_mode & ~GRC_MODE_NVRAM_WR_ENABLE);
+
+               tg3_disable_nvram_access(tp);
+               tg3_nvram_unlock(tp);
+       }
+
+       if (tg3_flag(tp, EEPROM_WRITE_PROT)) {
+               tw32_f(GRC_LOCAL_CTRL, tp->grc_local_ctrl);
+               udelay(40);
+       }
+
+       return ret;
+}
+
+#define RX_CPU_SCRATCH_BASE    0x30000
+#define RX_CPU_SCRATCH_SIZE    0x04000
+#define TX_CPU_SCRATCH_BASE    0x34000
+#define TX_CPU_SCRATCH_SIZE    0x04000
+
+/* tp->lock is held. */
+static int tg3_halt_cpu(struct tg3 *tp, u32 offset)
+{
+       int i;
+
+       BUG_ON(offset == TX_CPU_BASE && tg3_flag(tp, 5705_PLUS));
+
+       if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) {
+               u32 val = tr32(GRC_VCPU_EXT_CTRL);
+
+               tw32(GRC_VCPU_EXT_CTRL, val | GRC_VCPU_EXT_CTRL_HALT_CPU);
+               return 0;
+       }
+       if (offset == RX_CPU_BASE) {
+               for (i = 0; i < 10000; i++) {
+                       tw32(offset + CPU_STATE, 0xffffffff);
+                       tw32(offset + CPU_MODE,  CPU_MODE_HALT);
+                       if (tr32(offset + CPU_MODE) & CPU_MODE_HALT)
+                               break;
+               }
+
+               tw32(offset + CPU_STATE, 0xffffffff);
+               tw32_f(offset + CPU_MODE,  CPU_MODE_HALT);
+               udelay(10);
+       } else {
+               for (i = 0; i < 10000; i++) {
+                       tw32(offset + CPU_STATE, 0xffffffff);
+                       tw32(offset + CPU_MODE,  CPU_MODE_HALT);
+                       if (tr32(offset + CPU_MODE) & CPU_MODE_HALT)
+                               break;
+               }
+       }
+
+       if (i >= 10000) {
+               netdev_err(tp->dev, "%s timed out, %s CPU\n",
+                          __func__, offset == RX_CPU_BASE ? "RX" : "TX");
+               return -ENODEV;
+       }
+
+       /* Clear firmware's nvram arbitration. */
+       if (tg3_flag(tp, NVRAM))
+               tw32(NVRAM_SWARB, SWARB_REQ_CLR0);
+       return 0;
+}
+
+struct fw_info {
+       unsigned int fw_base;
+       unsigned int fw_len;
+       const __be32 *fw_data;
+};
+
+/* tp->lock is held. */
+static int tg3_load_firmware_cpu(struct tg3 *tp, u32 cpu_base,
+                                u32 cpu_scratch_base, int cpu_scratch_size,
+                                struct fw_info *info)
+{
+       int err, lock_err, i;
+       void (*write_op)(struct tg3 *, u32, u32);
+
+       if (cpu_base == TX_CPU_BASE && tg3_flag(tp, 5705_PLUS)) {
+               netdev_err(tp->dev,
+                          "%s: Trying to load TX cpu firmware which is 5705\n",
+                          __func__);
+               return -EINVAL;
+       }
+
+       if (tg3_flag(tp, 5705_PLUS))
+               write_op = tg3_write_mem;
+       else
+               write_op = tg3_write_indirect_reg32;
+
+       /* It is possible that bootcode is still loading at this point.
+        * Get the nvram lock first before halting the cpu.
+        */
+       lock_err = tg3_nvram_lock(tp);
+       err = tg3_halt_cpu(tp, cpu_base);
+       if (!lock_err)
+               tg3_nvram_unlock(tp);
+       if (err)
+               goto out;
+
+       for (i = 0; i < cpu_scratch_size; i += sizeof(u32))
+               write_op(tp, cpu_scratch_base + i, 0);
+       tw32(cpu_base + CPU_STATE, 0xffffffff);
+       tw32(cpu_base + CPU_MODE, tr32(cpu_base+CPU_MODE)|CPU_MODE_HALT);
+       for (i = 0; i < (info->fw_len / sizeof(u32)); i++)
+               write_op(tp, (cpu_scratch_base +
+                             (info->fw_base & 0xffff) +
+                             (i * sizeof(u32))),
+                             be32_to_cpu(info->fw_data[i]));
+
+       err = 0;
+
+out:
+       return err;
+}
+
+/* tp->lock is held. */
+static int tg3_load_5701_a0_firmware_fix(struct tg3 *tp)
+{
+       struct fw_info info;
+       const __be32 *fw_data;
+       int err, i;
+
+       fw_data = (void *)tp->fw->data;
+
+       /* Firmware blob starts with version numbers, followed by
+          start address and length. We are setting complete length.
+          length = end_address_of_bss - start_address_of_text.
+          Remainder is the blob to be loaded contiguously
+          from start address. */
+
+       info.fw_base = be32_to_cpu(fw_data[1]);
+       info.fw_len = tp->fw->size - 12;
+       info.fw_data = &fw_data[3];
+
+       err = tg3_load_firmware_cpu(tp, RX_CPU_BASE,
+                                   RX_CPU_SCRATCH_BASE, RX_CPU_SCRATCH_SIZE,
+                                   &info);
+       if (err)
+               return err;
+
+       err = tg3_load_firmware_cpu(tp, TX_CPU_BASE,
+                                   TX_CPU_SCRATCH_BASE, TX_CPU_SCRATCH_SIZE,
+                                   &info);
+       if (err)
+               return err;
+
+       /* Now startup only the RX cpu. */
+       tw32(RX_CPU_BASE + CPU_STATE, 0xffffffff);
+       tw32_f(RX_CPU_BASE + CPU_PC, info.fw_base);
+
+       for (i = 0; i < 5; i++) {
+               if (tr32(RX_CPU_BASE + CPU_PC) == info.fw_base)
+                       break;
+               tw32(RX_CPU_BASE + CPU_STATE, 0xffffffff);
+               tw32(RX_CPU_BASE + CPU_MODE,  CPU_MODE_HALT);
+               tw32_f(RX_CPU_BASE + CPU_PC, info.fw_base);
+               udelay(1000);
+       }
+       if (i >= 5) {
+               netdev_err(tp->dev, "%s fails to set RX CPU PC, is %08x "
+                          "should be %08x\n", __func__,
+                          tr32(RX_CPU_BASE + CPU_PC), info.fw_base);
+               return -ENODEV;
+       }
+       tw32(RX_CPU_BASE + CPU_STATE, 0xffffffff);
+       tw32_f(RX_CPU_BASE + CPU_MODE,  0x00000000);
+
+       return 0;
+}
+
+/* tp->lock is held. */
+static int tg3_load_tso_firmware(struct tg3 *tp)
+{
+       struct fw_info info;
+       const __be32 *fw_data;
+       unsigned long cpu_base, cpu_scratch_base, cpu_scratch_size;
+       int err, i;
+
+       if (tg3_flag(tp, HW_TSO_1) ||
+           tg3_flag(tp, HW_TSO_2) ||
+           tg3_flag(tp, HW_TSO_3))
+               return 0;
+
+       fw_data = (void *)tp->fw->data;
 
        /* Firmware blob starts with version numbers, followed by
           start address and length. We are setting complete length.
@@ -3264,6 +3525,8 @@ static int tg3_power_up(struct tg3 *tp)
        return err;
 }
 
+static int tg3_setup_phy(struct tg3 *, int);
+
 static int tg3_power_down_prepare(struct tg3 *tp)
 {
        u32 misc_host_ctrl;
@@ -3302,10 +3565,10 @@ static int tg3_power_down_prepare(struct tg3 *tp)
 
                        tp->phy_flags |= TG3_PHYFLG_IS_LOW_POWER;
 
-                       tp->link_config.orig_speed = phydev->speed;
-                       tp->link_config.orig_duplex = phydev->duplex;
-                       tp->link_config.orig_autoneg = phydev->autoneg;
-                       tp->link_config.orig_advertising = phydev->advertising;
+                       tp->link_config.speed = phydev->speed;
+                       tp->link_config.duplex = phydev->duplex;
+                       tp->link_config.autoneg = phydev->autoneg;
+                       tp->link_config.advertising = phydev->advertising;
 
                        advertising = ADVERTISED_TP |
                                      ADVERTISED_Pause |
@@ -3338,19 +3601,11 @@ static int tg3_power_down_prepare(struct tg3 *tp)
        } else {
                do_low_power = true;
 
-               if (!(tp->phy_flags & TG3_PHYFLG_IS_LOW_POWER)) {
+               if (!(tp->phy_flags & TG3_PHYFLG_IS_LOW_POWER))
                        tp->phy_flags |= TG3_PHYFLG_IS_LOW_POWER;
-                       tp->link_config.orig_speed = tp->link_config.speed;
-                       tp->link_config.orig_duplex = tp->link_config.duplex;
-                       tp->link_config.orig_autoneg = tp->link_config.autoneg;
-               }
 
-               if (!(tp->phy_flags & TG3_PHYFLG_ANY_SERDES)) {
-                       tp->link_config.speed = SPEED_10;
-                       tp->link_config.duplex = DUPLEX_HALF;
-                       tp->link_config.autoneg = AUTONEG_ENABLE;
+               if (!(tp->phy_flags & TG3_PHYFLG_ANY_SERDES))
                        tg3_setup_phy(tp, 0);
-               }
        }
 
        if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) {
@@ -3559,8 +3814,8 @@ static void tg3_aux_stat_to_speed_duplex(struct tg3 *tp, u32 val, u16 *speed, u8
                                  DUPLEX_HALF;
                        break;
                }
-               *speed = SPEED_INVALID;
-               *duplex = DUPLEX_INVALID;
+               *speed = SPEED_UNKNOWN;
+               *duplex = DUPLEX_UNKNOWN;
                break;
        }
 }
@@ -3640,51 +3895,33 @@ done:
 
 static void tg3_phy_copper_begin(struct tg3 *tp)
 {
-       u32 new_adv;
-       int i;
+       if (tp->link_config.autoneg == AUTONEG_ENABLE ||
+           (tp->phy_flags & TG3_PHYFLG_IS_LOW_POWER)) {
+               u32 adv, fc;
 
-       if (tp->phy_flags & TG3_PHYFLG_IS_LOW_POWER) {
-               new_adv = ADVERTISED_10baseT_Half |
-                         ADVERTISED_10baseT_Full;
-               if (tg3_flag(tp, WOL_SPEED_100MB))
-                       new_adv |= ADVERTISED_100baseT_Half |
-                                  ADVERTISED_100baseT_Full;
-
-               tg3_phy_autoneg_cfg(tp, new_adv,
-                                   FLOW_CTRL_TX | FLOW_CTRL_RX);
-       } else if (tp->link_config.speed == SPEED_INVALID) {
-               if (tp->phy_flags & TG3_PHYFLG_10_100_ONLY)
-                       tp->link_config.advertising &=
-                               ~(ADVERTISED_1000baseT_Half |
-                                 ADVERTISED_1000baseT_Full);
+               if (tp->phy_flags & TG3_PHYFLG_IS_LOW_POWER) {
+                       adv = ADVERTISED_10baseT_Half |
+                             ADVERTISED_10baseT_Full;
+                       if (tg3_flag(tp, WOL_SPEED_100MB))
+                               adv |= ADVERTISED_100baseT_Half |
+                                      ADVERTISED_100baseT_Full;
 
-               tg3_phy_autoneg_cfg(tp, tp->link_config.advertising,
-                                   tp->link_config.flowctrl);
-       } else {
-               /* Asking for a specific link mode. */
-               if (tp->link_config.speed == SPEED_1000) {
-                       if (tp->link_config.duplex == DUPLEX_FULL)
-                               new_adv = ADVERTISED_1000baseT_Full;
-                       else
-                               new_adv = ADVERTISED_1000baseT_Half;
-               } else if (tp->link_config.speed == SPEED_100) {
-                       if (tp->link_config.duplex == DUPLEX_FULL)
-                               new_adv = ADVERTISED_100baseT_Full;
-                       else
-                               new_adv = ADVERTISED_100baseT_Half;
+                       fc = FLOW_CTRL_TX | FLOW_CTRL_RX;
                } else {
-                       if (tp->link_config.duplex == DUPLEX_FULL)
-                               new_adv = ADVERTISED_10baseT_Full;
-                       else
-                               new_adv = ADVERTISED_10baseT_Half;
+                       adv = tp->link_config.advertising;
+                       if (tp->phy_flags & TG3_PHYFLG_10_100_ONLY)
+                               adv &= ~(ADVERTISED_1000baseT_Half |
+                                        ADVERTISED_1000baseT_Full);
+
+                       fc = tp->link_config.flowctrl;
                }
 
-               tg3_phy_autoneg_cfg(tp, new_adv,
-                                   tp->link_config.flowctrl);
-       }
+               tg3_phy_autoneg_cfg(tp, adv, fc);
 
-       if (tp->link_config.autoneg == AUTONEG_DISABLE &&
-           tp->link_config.speed != SPEED_INVALID) {
+               tg3_writephy(tp, MII_BMCR,
+                            BMCR_ANENABLE | BMCR_ANRESTART);
+       } else {
+               int i;
                u32 bmcr, orig_bmcr;
 
                tp->link_config.active_speed = tp->link_config.speed;
@@ -3726,9 +3963,6 @@ static void tg3_phy_copper_begin(struct tg3 *tp)
                        tg3_writephy(tp, MII_BMCR, bmcr);
                        udelay(40);
                }
-       } else {
-               tg3_writephy(tp, MII_BMCR,
-                            BMCR_ANENABLE | BMCR_ANRESTART);
        }
 }
 
@@ -3778,7 +4012,16 @@ static bool tg3_phy_copper_an_config_ok(struct tg3 *tp, u32 *lcladv)
                if (tg3_readphy(tp, MII_CTRL1000, &tg3_ctrl))
                        return false;
 
-               tg3_ctrl &= (ADVERTISE_1000HALF | ADVERTISE_1000FULL);
+               if (tgtadv &&
+                   (tp->pci_chip_rev_id == CHIPREV_ID_5701_A0 ||
+                    tp->pci_chip_rev_id == CHIPREV_ID_5701_B0)) {
+                       tgtadv |= CTL1000_AS_MASTER | CTL1000_ENABLE_MASTER;
+                       tg3_ctrl &= (ADVERTISE_1000HALF | ADVERTISE_1000FULL |
+                                    CTL1000_AS_MASTER | CTL1000_ENABLE_MASTER);
+               } else {
+                       tg3_ctrl &= (ADVERTISE_1000HALF | ADVERTISE_1000FULL);
+               }
+
                if (tg3_ctrl != tgtadv)
                        return false;
        }
@@ -3909,8 +4152,8 @@ static int tg3_setup_copper_phy(struct tg3 *tp, int force_reset)
        }
 
        current_link_up = 0;
-       current_speed = SPEED_INVALID;
-       current_duplex = DUPLEX_INVALID;
+       current_speed = SPEED_UNKNOWN;
+       current_duplex = DUPLEX_UNKNOWN;
        tp->phy_flags &= ~TG3_PHYFLG_MDIX_STATE;
        tp->link_config.rmt_adv = 0;
 
@@ -4806,8 +5049,8 @@ static int tg3_setup_fiber_phy(struct tg3 *tp, int force_reset)
                                    LED_CTRL_LNKLED_OVERRIDE |
                                    LED_CTRL_1000MBPS_ON));
        } else {
-               tp->link_config.active_speed = SPEED_INVALID;
-               tp->link_config.active_duplex = DUPLEX_INVALID;
+               tp->link_config.active_speed = SPEED_UNKNOWN;
+               tp->link_config.active_duplex = DUPLEX_UNKNOWN;
                tw32(MAC_LED_CTRL, (tp->led_ctrl |
                                    LED_CTRL_LNKLED_OVERRIDE |
                                    LED_CTRL_TRAFFIC_OVERRIDE));
@@ -4855,8 +5098,8 @@ static int tg3_setup_fiber_mii_phy(struct tg3 *tp, int force_reset)
                tg3_phy_reset(tp);
 
        current_link_up = 0;
-       current_speed = SPEED_INVALID;
-       current_duplex = DUPLEX_INVALID;
+       current_speed = SPEED_UNKNOWN;
+       current_duplex = DUPLEX_UNKNOWN;
        tp->link_config.rmt_adv = 0;
 
        err |= tg3_readphy(tp, MII_BMSR, &bmsr);
@@ -5685,6 +5928,9 @@ next_pkt_nopost:
 
        /* Refill RX ring(s). */
        if (!tg3_flag(tp, ENABLE_RSS)) {
+               /* Sync BD data before updating mailbox */
+               wmb();
+
                if (work_mask & RXD_OPAQUE_RING_STD) {
                        tpr->rx_std_prod_idx = std_prod_idx &
                                               tp->rx_std_ring_mask;
@@ -5921,6 +6167,7 @@ static inline void tg3_reset_task_cancel(struct tg3 *tp)
 {
        cancel_work_sync(&tp->reset_task);
        tg3_flag_clear(tp, RESET_TASK_PENDING);
+       tg3_flag_clear(tp, TX_RECOVERY_PENDING);
 }
 
 static int tg3_poll_msix(struct napi_struct *napi, int budget)
@@ -6292,33 +6539,6 @@ static irqreturn_t tg3_test_isr(int irq, void *dev_id)
        return IRQ_RETVAL(0);
 }
 
-static int tg3_init_hw(struct tg3 *, int);
-static int tg3_halt(struct tg3 *, int, int);
-
-/* Restart hardware after configuration changes, self-test, etc.
- * Invoked with tp->lock held.
- */
-static int tg3_restart_hw(struct tg3 *tp, int reset_phy)
-       __releases(tp->lock)
-       __acquires(tp->lock)
-{
-       int err;
-
-       err = tg3_init_hw(tp, reset_phy);
-       if (err) {
-               netdev_err(tp->dev,
-                          "Failed to re-initialize device, aborting\n");
-               tg3_halt(tp, RESET_KIND_SHUTDOWN, 1);
-               tg3_full_unlock(tp);
-               del_timer_sync(&tp->timer);
-               tp->irq_sync = 0;
-               tg3_napi_enable(tp);
-               dev_close(tp->dev);
-               tg3_full_lock(tp, 0);
-       }
-       return err;
-}
-
 #ifdef CONFIG_NET_POLL_CONTROLLER
 static void tg3_poll_controller(struct net_device *dev)
 {
@@ -6330,50 +6550,6 @@ static void tg3_poll_controller(struct net_device *dev)
 }
 #endif
 
-static void tg3_reset_task(struct work_struct *work)
-{
-       struct tg3 *tp = container_of(work, struct tg3, reset_task);
-       int err;
-
-       tg3_full_lock(tp, 0);
-
-       if (!netif_running(tp->dev)) {
-               tg3_flag_clear(tp, RESET_TASK_PENDING);
-               tg3_full_unlock(tp);
-               return;
-       }
-
-       tg3_full_unlock(tp);
-
-       tg3_phy_stop(tp);
-
-       tg3_netif_stop(tp);
-
-       tg3_full_lock(tp, 1);
-
-       if (tg3_flag(tp, TX_RECOVERY_PENDING)) {
-               tp->write32_tx_mbox = tg3_write32_tx_mbox;
-               tp->write32_rx_mbox = tg3_write_flush_reg32;
-               tg3_flag_set(tp, MBOX_WRITE_REORDER);
-               tg3_flag_clear(tp, TX_RECOVERY_PENDING);
-       }
-
-       tg3_halt(tp, RESET_KIND_SHUTDOWN, 0);
-       err = tg3_init_hw(tp, 1);
-       if (err)
-               goto out;
-
-       tg3_netif_start(tp);
-
-out:
-       tg3_full_unlock(tp);
-
-       if (!err)
-               tg3_phy_start(tp);
-
-       tg3_flag_clear(tp, RESET_TASK_PENDING);
-}
-
 static void tg3_tx_timeout(struct net_device *dev)
 {
        struct tg3 *tp = netdev_priv(dev);
@@ -6745,7 +6921,6 @@ static netdev_tx_t tg3_start_xmit(struct sk_buff *skb, struct net_device *dev)
                          ((skb_shinfo(skb)->nr_frags == 0) ? TXD_FLAG_END : 0),
                            mss, vlan)) {
                would_hit_hwbug = 1;
-       /* Now loop through additional data fragments, and queue them. */
        } else if (skb_shinfo(skb)->nr_frags > 0) {
                u32 tmp_mss = mss;
 
@@ -6754,6 +6929,9 @@ static netdev_tx_t tg3_start_xmit(struct sk_buff *skb, struct net_device *dev)
                    !tg3_flag(tp, HW_TSO_3))
                        tmp_mss = 0;
 
+               /* Now loop through additional data
+                * fragments, and queue them.
+                */
                last = skb_shinfo(skb)->nr_frags - 1;
                for (i = 0; i <= last; i++) {
                        skb_frag_t *frag = &skb_shinfo(skb)->frags[i];
@@ -6795,6 +6973,9 @@ static netdev_tx_t tg3_start_xmit(struct sk_buff *skb, struct net_device *dev)
        skb_tx_timestamp(skb);
        netdev_sent_queue(tp->dev, skb->len);
 
+       /* Sync BD data before updating mailbox */
+       wmb();
+
        /* Packets are ready, update Tx producer idx local and on card. */
        tw32_tx_mbox(tnapi->prodmbox, entry);
 
@@ -6993,66 +7174,6 @@ static int tg3_set_features(struct net_device *dev, netdev_features_t features)
        return 0;
 }
 
-static inline void tg3_set_mtu(struct net_device *dev, struct tg3 *tp,
-                              int new_mtu)
-{
-       dev->mtu = new_mtu;
-
-       if (new_mtu > ETH_DATA_LEN) {
-               if (tg3_flag(tp, 5780_CLASS)) {
-                       netdev_update_features(dev);
-                       tg3_flag_clear(tp, TSO_CAPABLE);
-               } else {
-                       tg3_flag_set(tp, JUMBO_RING_ENABLE);
-               }
-       } else {
-               if (tg3_flag(tp, 5780_CLASS)) {
-                       tg3_flag_set(tp, TSO_CAPABLE);
-                       netdev_update_features(dev);
-               }
-               tg3_flag_clear(tp, JUMBO_RING_ENABLE);
-       }
-}
-
-static int tg3_change_mtu(struct net_device *dev, int new_mtu)
-{
-       struct tg3 *tp = netdev_priv(dev);
-       int err;
-
-       if (new_mtu < TG3_MIN_MTU || new_mtu > TG3_MAX_MTU(tp))
-               return -EINVAL;
-
-       if (!netif_running(dev)) {
-               /* We'll just catch it later when the
-                * device is up'd.
-                */
-               tg3_set_mtu(dev, tp, new_mtu);
-               return 0;
-       }
-
-       tg3_phy_stop(tp);
-
-       tg3_netif_stop(tp);
-
-       tg3_full_lock(tp, 1);
-
-       tg3_halt(tp, RESET_KIND_SHUTDOWN, 1);
-
-       tg3_set_mtu(dev, tp, new_mtu);
-
-       err = tg3_restart_hw(tp, 0);
-
-       if (!err)
-               tg3_netif_start(tp);
-
-       tg3_full_unlock(tp);
-
-       if (!err)
-               tg3_phy_start(tp);
-
-       return err;
-}
-
 static void tg3_rx_prodring_free(struct tg3 *tp,
                                 struct tg3_rx_prodring_set *tpr)
 {
@@ -7908,7 +8029,7 @@ static int tg3_halt(struct tg3 *tp, int kind, int silent)
 
        if (tp->hw_stats) {
                /* Save the stats across chip resets... */
-               tg3_get_nstats(tp, &tp->net_stats_prev),
+               tg3_get_nstats(tp, &tp->net_stats_prev);
                tg3_get_estats(tp, &tp->estats_prev);
 
                /* And make sure the next sample is new data */
@@ -7928,7 +8049,7 @@ static int tg3_set_mac_addr(struct net_device *dev, void *p)
        int err = 0, skip_mac_1 = 0;
 
        if (!is_valid_ether_addr(addr->sa_data))
-               return -EINVAL;
+               return -EADDRNOTAVAIL;
 
        memcpy(dev->dev_addr, addr->sa_data, dev->addr_len);
 
@@ -7976,7 +8097,6 @@ static void tg3_set_bdinfo(struct tg3 *tp, u32 bdinfo_addr,
                              nic_addr);
 }
 
-static void __tg3_set_rx_mode(struct net_device *);
 static void __tg3_set_coalesce(struct tg3 *tp, struct ethtool_coalesce *ec)
 {
        int i;
@@ -8213,6 +8333,93 @@ static void tg3_setup_rxbd_thresholds(struct tg3 *tp)
                tw32(JMB_REPLENISH_LWM, bdcache_maxcnt);
 }
 
+static inline u32 calc_crc(unsigned char *buf, int len)
+{
+       u32 reg;
+       u32 tmp;
+       int j, k;
+
+       reg = 0xffffffff;
+
+       for (j = 0; j < len; j++) {
+               reg ^= buf[j];
+
+               for (k = 0; k < 8; k++) {
+                       tmp = reg & 0x01;
+
+                       reg >>= 1;
+
+                       if (tmp)
+                               reg ^= 0xedb88320;
+               }
+       }
+
+       return ~reg;
+}
+
+static void tg3_set_multi(struct tg3 *tp, unsigned int accept_all)
+{
+       /* accept or reject all multicast frames */
+       tw32(MAC_HASH_REG_0, accept_all ? 0xffffffff : 0);
+       tw32(MAC_HASH_REG_1, accept_all ? 0xffffffff : 0);
+       tw32(MAC_HASH_REG_2, accept_all ? 0xffffffff : 0);
+       tw32(MAC_HASH_REG_3, accept_all ? 0xffffffff : 0);
+}
+
+static void __tg3_set_rx_mode(struct net_device *dev)
+{
+       struct tg3 *tp = netdev_priv(dev);
+       u32 rx_mode;
+
+       rx_mode = tp->rx_mode & ~(RX_MODE_PROMISC |
+                                 RX_MODE_KEEP_VLAN_TAG);
+
+#if !defined(CONFIG_VLAN_8021Q) && !defined(CONFIG_VLAN_8021Q_MODULE)
+       /* When ASF is in use, we always keep the RX_MODE_KEEP_VLAN_TAG
+        * flag clear.
+        */
+       if (!tg3_flag(tp, ENABLE_ASF))
+               rx_mode |= RX_MODE_KEEP_VLAN_TAG;
+#endif
+
+       if (dev->flags & IFF_PROMISC) {
+               /* Promiscuous mode. */
+               rx_mode |= RX_MODE_PROMISC;
+       } else if (dev->flags & IFF_ALLMULTI) {
+               /* Accept all multicast. */
+               tg3_set_multi(tp, 1);
+       } else if (netdev_mc_empty(dev)) {
+               /* Reject all multicast. */
+               tg3_set_multi(tp, 0);
+       } else {
+               /* Accept one or more multicast(s). */
+               struct netdev_hw_addr *ha;
+               u32 mc_filter[4] = { 0, };
+               u32 regidx;
+               u32 bit;
+               u32 crc;
+
+               netdev_for_each_mc_addr(ha, dev) {
+                       crc = calc_crc(ha->addr, ETH_ALEN);
+                       bit = ~crc & 0x7f;
+                       regidx = (bit & 0x60) >> 5;
+                       bit &= 0x1f;
+                       mc_filter[regidx] |= (1 << bit);
+               }
+
+               tw32(MAC_HASH_REG_0, mc_filter[0]);
+               tw32(MAC_HASH_REG_1, mc_filter[1]);
+               tw32(MAC_HASH_REG_2, mc_filter[2]);
+               tw32(MAC_HASH_REG_3, mc_filter[3]);
+       }
+
+       if (rx_mode != tp->rx_mode) {
+               tp->rx_mode = rx_mode;
+               tw32_f(MAC_RX_MODE, rx_mode);
+               udelay(10);
+       }
+}
+
 static void tg3_rss_init_dflt_indir_tbl(struct tg3 *tp)
 {
        int i;
@@ -8688,9 +8895,6 @@ static int tg3_reset_hw(struct tg3 *tp, int reset_phy)
        if (tg3_flag(tp, PCI_EXPRESS))
                rdmac_mode |= RDMAC_MODE_FIFO_LONG_BURST;
 
-       if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_57766)
-               rdmac_mode |= RDMAC_MODE_JMB_2K_MMRR;
-
        if (tg3_flag(tp, HW_TSO_1) ||
            tg3_flag(tp, HW_TSO_2) ||
            tg3_flag(tp, HW_TSO_3))
@@ -9037,12 +9241,8 @@ static int tg3_reset_hw(struct tg3 *tp, int reset_phy)
        }
 
        if (!tg3_flag(tp, USE_PHYLIB)) {
-               if (tp->phy_flags & TG3_PHYFLG_IS_LOW_POWER) {
+               if (tp->phy_flags & TG3_PHYFLG_IS_LOW_POWER)
                        tp->phy_flags &= ~TG3_PHYFLG_IS_LOW_POWER;
-                       tp->link_config.speed = tp->link_config.orig_speed;
-                       tp->link_config.duplex = tp->link_config.orig_duplex;
-                       tp->link_config.autoneg = tp->link_config.orig_autoneg;
-               }
 
                err = tg3_setup_phy(tp, 0);
                if (err)
@@ -9303,46 +9503,148 @@ static void tg3_timer(unsigned long __opaque)
                        tg3_serdes_parallel_detect(tp);
                }
 
-               tp->timer_counter = tp->timer_multiplier;
+               tp->timer_counter = tp->timer_multiplier;
+       }
+
+       /* Heartbeat is only sent once every 2 seconds.
+        *
+        * The heartbeat is to tell the ASF firmware that the host
+        * driver is still alive.  In the event that the OS crashes,
+        * ASF needs to reset the hardware to free up the FIFO space
+        * that may be filled with rx packets destined for the host.
+        * If the FIFO is full, ASF will no longer function properly.
+        *
+        * Unintended resets have been reported on real time kernels
+        * where the timer doesn't run on time.  Netpoll will also have
+        * same problem.
+        *
+        * The new FWCMD_NICDRV_ALIVE3 command tells the ASF firmware
+        * to check the ring condition when the heartbeat is expiring
+        * before doing the reset.  This will prevent most unintended
+        * resets.
+        */
+       if (!--tp->asf_counter) {
+               if (tg3_flag(tp, ENABLE_ASF) && !tg3_flag(tp, ENABLE_APE)) {
+                       tg3_wait_for_event_ack(tp);
+
+                       tg3_write_mem(tp, NIC_SRAM_FW_CMD_MBOX,
+                                     FWCMD_NICDRV_ALIVE3);
+                       tg3_write_mem(tp, NIC_SRAM_FW_CMD_LEN_MBOX, 4);
+                       tg3_write_mem(tp, NIC_SRAM_FW_CMD_DATA_MBOX,
+                                     TG3_FW_UPDATE_TIMEOUT_SEC);
+
+                       tg3_generate_fw_event(tp);
+               }
+               tp->asf_counter = tp->asf_multiplier;
+       }
+
+       spin_unlock(&tp->lock);
+
+restart_timer:
+       tp->timer.expires = jiffies + tp->timer_offset;
+       add_timer(&tp->timer);
+}
+
+static void __devinit tg3_timer_init(struct tg3 *tp)
+{
+       if (tg3_flag(tp, TAGGED_STATUS) &&
+           GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5717 &&
+           !tg3_flag(tp, 57765_CLASS))
+               tp->timer_offset = HZ;
+       else
+               tp->timer_offset = HZ / 10;
+
+       BUG_ON(tp->timer_offset > HZ);
+
+       tp->timer_multiplier = (HZ / tp->timer_offset);
+       tp->asf_multiplier = (HZ / tp->timer_offset) *
+                            TG3_FW_UPDATE_FREQ_SEC;
+
+       init_timer(&tp->timer);
+       tp->timer.data = (unsigned long) tp;
+       tp->timer.function = tg3_timer;
+}
+
+static void tg3_timer_start(struct tg3 *tp)
+{
+       tp->asf_counter   = tp->asf_multiplier;
+       tp->timer_counter = tp->timer_multiplier;
+
+       tp->timer.expires = jiffies + tp->timer_offset;
+       add_timer(&tp->timer);
+}
+
+static void tg3_timer_stop(struct tg3 *tp)
+{
+       del_timer_sync(&tp->timer);
+}
+
+/* Restart hardware after configuration changes, self-test, etc.
+ * Invoked with tp->lock held.
+ */
+static int tg3_restart_hw(struct tg3 *tp, int reset_phy)
+       __releases(tp->lock)
+       __acquires(tp->lock)
+{
+       int err;
+
+       err = tg3_init_hw(tp, reset_phy);
+       if (err) {
+               netdev_err(tp->dev,
+                          "Failed to re-initialize device, aborting\n");
+               tg3_halt(tp, RESET_KIND_SHUTDOWN, 1);
+               tg3_full_unlock(tp);
+               tg3_timer_stop(tp);
+               tp->irq_sync = 0;
+               tg3_napi_enable(tp);
+               dev_close(tp->dev);
+               tg3_full_lock(tp, 0);
+       }
+       return err;
+}
+
+static void tg3_reset_task(struct work_struct *work)
+{
+       struct tg3 *tp = container_of(work, struct tg3, reset_task);
+       int err;
+
+       tg3_full_lock(tp, 0);
+
+       if (!netif_running(tp->dev)) {
+               tg3_flag_clear(tp, RESET_TASK_PENDING);
+               tg3_full_unlock(tp);
+               return;
+       }
+
+       tg3_full_unlock(tp);
+
+       tg3_phy_stop(tp);
+
+       tg3_netif_stop(tp);
+
+       tg3_full_lock(tp, 1);
+
+       if (tg3_flag(tp, TX_RECOVERY_PENDING)) {
+               tp->write32_tx_mbox = tg3_write32_tx_mbox;
+               tp->write32_rx_mbox = tg3_write_flush_reg32;
+               tg3_flag_set(tp, MBOX_WRITE_REORDER);
+               tg3_flag_clear(tp, TX_RECOVERY_PENDING);
        }
 
-       /* Heartbeat is only sent once every 2 seconds.
-        *
-        * The heartbeat is to tell the ASF firmware that the host
-        * driver is still alive.  In the event that the OS crashes,
-        * ASF needs to reset the hardware to free up the FIFO space
-        * that may be filled with rx packets destined for the host.
-        * If the FIFO is full, ASF will no longer function properly.
-        *
-        * Unintended resets have been reported on real time kernels
-        * where the timer doesn't run on time.  Netpoll will also have
-        * same problem.
-        *
-        * The new FWCMD_NICDRV_ALIVE3 command tells the ASF firmware
-        * to check the ring condition when the heartbeat is expiring
-        * before doing the reset.  This will prevent most unintended
-        * resets.
-        */
-       if (!--tp->asf_counter) {
-               if (tg3_flag(tp, ENABLE_ASF) && !tg3_flag(tp, ENABLE_APE)) {
-                       tg3_wait_for_event_ack(tp);
+       tg3_halt(tp, RESET_KIND_SHUTDOWN, 0);
+       err = tg3_init_hw(tp, 1);
+       if (err)
+               goto out;
 
-                       tg3_write_mem(tp, NIC_SRAM_FW_CMD_MBOX,
-                                     FWCMD_NICDRV_ALIVE3);
-                       tg3_write_mem(tp, NIC_SRAM_FW_CMD_LEN_MBOX, 4);
-                       tg3_write_mem(tp, NIC_SRAM_FW_CMD_DATA_MBOX,
-                                     TG3_FW_UPDATE_TIMEOUT_SEC);
+       tg3_netif_start(tp);
 
-                       tg3_generate_fw_event(tp);
-               }
-               tp->asf_counter = tp->asf_multiplier;
-       }
+out:
+       tg3_full_unlock(tp);
 
-       spin_unlock(&tp->lock);
+       if (!err)
+               tg3_phy_start(tp);
 
-restart_timer:
-       tp->timer.expires = jiffies + tp->timer_offset;
-       add_timer(&tp->timer);
+       tg3_flag_clear(tp, RESET_TASK_PENDING);
 }
 
 static int tg3_request_irq(struct tg3 *tp, int irq_num)
@@ -9399,7 +9701,7 @@ static int tg3_test_interrupt(struct tg3 *tp)
        }
 
        err = request_irq(tnapi->irq_vec, tg3_test_isr,
-                         IRQF_SHARED | IRQF_SAMPLE_RANDOM, dev->name, tnapi);
+                         IRQF_SHARED, dev->name, tnapi);
        if (err)
                return err;
 
@@ -9710,24 +10012,6 @@ static int tg3_open(struct net_device *dev)
        if (err) {
                tg3_halt(tp, RESET_KIND_SHUTDOWN, 1);
                tg3_free_rings(tp);
-       } else {
-               if (tg3_flag(tp, TAGGED_STATUS) &&
-                   GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5717 &&
-                   !tg3_flag(tp, 57765_CLASS))
-                       tp->timer_offset = HZ;
-               else
-                       tp->timer_offset = HZ / 10;
-
-               BUG_ON(tp->timer_offset > HZ);
-               tp->timer_counter = tp->timer_multiplier =
-                       (HZ / tp->timer_offset);
-               tp->asf_counter = tp->asf_multiplier =
-                       ((HZ / tp->timer_offset) * 2);
-
-               init_timer(&tp->timer);
-               tp->timer.expires = jiffies + tp->timer_offset;
-               tp->timer.data = (unsigned long) tp;
-               tp->timer.function = tg3_timer;
        }
 
        tg3_full_unlock(tp);
@@ -9759,7 +10043,7 @@ static int tg3_open(struct net_device *dev)
 
        tg3_full_lock(tp, 0);
 
-       add_timer(&tp->timer);
+       tg3_timer_start(tp);
        tg3_flag_set(tp, INIT_COMPLETE);
        tg3_enable_ints(tp);
 
@@ -9804,7 +10088,7 @@ static int tg3_close(struct net_device *dev)
 
        netif_tx_stop_all_queues(dev);
 
-       del_timer_sync(&tp->timer);
+       tg3_timer_stop(tp);
 
        tg3_phy_stop(tp);
 
@@ -9878,9 +10162,6 @@ static void tg3_get_estats(struct tg3 *tp, struct tg3_ethtool_stats *estats)
        struct tg3_ethtool_stats *old_estats = &tp->estats_prev;
        struct tg3_hw_stats *hw_stats = tp->hw_stats;
 
-       if (!hw_stats)
-               return;
-
        ESTAT_ADD(rx_octets);
        ESTAT_ADD(rx_fragments);
        ESTAT_ADD(rx_ucast_packets);
@@ -10016,105 +10297,6 @@ static void tg3_get_nstats(struct tg3 *tp, struct rtnl_link_stats64 *stats)
        stats->tx_dropped = tp->tx_dropped;
 }
 
-static inline u32 calc_crc(unsigned char *buf, int len)
-{
-       u32 reg;
-       u32 tmp;
-       int j, k;
-
-       reg = 0xffffffff;
-
-       for (j = 0; j < len; j++) {
-               reg ^= buf[j];
-
-               for (k = 0; k < 8; k++) {
-                       tmp = reg & 0x01;
-
-                       reg >>= 1;
-
-                       if (tmp)
-                               reg ^= 0xedb88320;
-               }
-       }
-
-       return ~reg;
-}
-
-static void tg3_set_multi(struct tg3 *tp, unsigned int accept_all)
-{
-       /* accept or reject all multicast frames */
-       tw32(MAC_HASH_REG_0, accept_all ? 0xffffffff : 0);
-       tw32(MAC_HASH_REG_1, accept_all ? 0xffffffff : 0);
-       tw32(MAC_HASH_REG_2, accept_all ? 0xffffffff : 0);
-       tw32(MAC_HASH_REG_3, accept_all ? 0xffffffff : 0);
-}
-
-static void __tg3_set_rx_mode(struct net_device *dev)
-{
-       struct tg3 *tp = netdev_priv(dev);
-       u32 rx_mode;
-
-       rx_mode = tp->rx_mode & ~(RX_MODE_PROMISC |
-                                 RX_MODE_KEEP_VLAN_TAG);
-
-#if !defined(CONFIG_VLAN_8021Q) && !defined(CONFIG_VLAN_8021Q_MODULE)
-       /* When ASF is in use, we always keep the RX_MODE_KEEP_VLAN_TAG
-        * flag clear.
-        */
-       if (!tg3_flag(tp, ENABLE_ASF))
-               rx_mode |= RX_MODE_KEEP_VLAN_TAG;
-#endif
-
-       if (dev->flags & IFF_PROMISC) {
-               /* Promiscuous mode. */
-               rx_mode |= RX_MODE_PROMISC;
-       } else if (dev->flags & IFF_ALLMULTI) {
-               /* Accept all multicast. */
-               tg3_set_multi(tp, 1);
-       } else if (netdev_mc_empty(dev)) {
-               /* Reject all multicast. */
-               tg3_set_multi(tp, 0);
-       } else {
-               /* Accept one or more multicast(s). */
-               struct netdev_hw_addr *ha;
-               u32 mc_filter[4] = { 0, };
-               u32 regidx;
-               u32 bit;
-               u32 crc;
-
-               netdev_for_each_mc_addr(ha, dev) {
-                       crc = calc_crc(ha->addr, ETH_ALEN);
-                       bit = ~crc & 0x7f;
-                       regidx = (bit & 0x60) >> 5;
-                       bit &= 0x1f;
-                       mc_filter[regidx] |= (1 << bit);
-               }
-
-               tw32(MAC_HASH_REG_0, mc_filter[0]);
-               tw32(MAC_HASH_REG_1, mc_filter[1]);
-               tw32(MAC_HASH_REG_2, mc_filter[2]);
-               tw32(MAC_HASH_REG_3, mc_filter[3]);
-       }
-
-       if (rx_mode != tp->rx_mode) {
-               tp->rx_mode = rx_mode;
-               tw32_f(MAC_RX_MODE, rx_mode);
-               udelay(10);
-       }
-}
-
-static void tg3_set_rx_mode(struct net_device *dev)
-{
-       struct tg3 *tp = netdev_priv(dev);
-
-       if (!netif_running(dev))
-               return;
-
-       tg3_full_lock(tp, 0);
-       __tg3_set_rx_mode(dev);
-       tg3_full_unlock(tp);
-}
-
 static int tg3_get_regs_len(struct net_device *dev)
 {
        return TG3_REG_BLK_SIZE;
@@ -10209,8 +10391,6 @@ static int tg3_get_eeprom(struct net_device *dev, struct ethtool_eeprom *eeprom,
        return 0;
 }
 
-static int tg3_nvram_write_block(struct tg3 *tp, u32 offset, u32 len, u8 *buf);
-
 static int tg3_set_eeprom(struct net_device *dev, struct ethtool_eeprom *eeprom, u8 *data)
 {
        struct tg3 *tp = netdev_priv(dev);
@@ -10324,8 +10504,8 @@ static int tg3_get_settings(struct net_device *dev, struct ethtool_cmd *cmd)
                                cmd->eth_tp_mdix = ETH_TP_MDI;
                }
        } else {
-               ethtool_cmd_speed_set(cmd, SPEED_INVALID);
-               cmd->duplex = DUPLEX_INVALID;
+               ethtool_cmd_speed_set(cmd, SPEED_UNKNOWN);
+               cmd->duplex = DUPLEX_UNKNOWN;
                cmd->eth_tp_mdix = ETH_TP_MDI_INVALID;
        }
        cmd->phy_address = tp->phy_addr;
@@ -10407,18 +10587,14 @@ static int tg3_set_settings(struct net_device *dev, struct ethtool_cmd *cmd)
        if (cmd->autoneg == AUTONEG_ENABLE) {
                tp->link_config.advertising = (cmd->advertising |
                                              ADVERTISED_Autoneg);
-               tp->link_config.speed = SPEED_INVALID;
-               tp->link_config.duplex = DUPLEX_INVALID;
+               tp->link_config.speed = SPEED_UNKNOWN;
+               tp->link_config.duplex = DUPLEX_UNKNOWN;
        } else {
                tp->link_config.advertising = 0;
                tp->link_config.speed = speed;
                tp->link_config.duplex = cmd->duplex;
        }
 
-       tp->link_config.orig_speed = tp->link_config.speed;
-       tp->link_config.orig_duplex = tp->link_config.duplex;
-       tp->link_config.orig_autoneg = tp->link_config.autoneg;
-
        if (netif_running(dev))
                tg3_setup_phy(tp, 1);
 
@@ -10665,10 +10841,10 @@ static int tg3_set_pauseparam(struct net_device *dev, struct ethtool_pauseparam
                        if (!epause->autoneg)
                                tg3_setup_flow_control(tp, 0, 0);
                } else {
-                       tp->link_config.orig_advertising &=
+                       tp->link_config.advertising &=
                                        ~(ADVERTISED_Pause |
                                          ADVERTISED_Asym_Pause);
-                       tp->link_config.orig_advertising |= newadv;
+                       tp->link_config.advertising |= newadv;
                }
        } else {
                int irq_sync = 0;
@@ -10845,7 +11021,10 @@ static void tg3_get_ethtool_stats(struct net_device *dev,
 {
        struct tg3 *tp = netdev_priv(dev);
 
-       tg3_get_estats(tp, (struct tg3_ethtool_stats *)tmp_stats);
+       if (tp->hw_stats)
+               tg3_get_estats(tp, (struct tg3_ethtool_stats *)tmp_stats);
+       else
+               memset(tmp_stats, 0, sizeof(struct tg3_ethtool_stats));
 }
 
 static __be32 *tg3_vpd_readblock(struct tg3 *tp, u32 *vpdlen)
@@ -11554,6 +11733,10 @@ static int tg3_run_loopback(struct tg3 *tp, u32 pktsz, bool tso_loopback)
        } else {
                num_pkts = 1;
                data_off = ETH_HLEN;
+
+               if (tg3_flag(tp, USE_JUMBO_BDFLAG) &&
+                   tx_len > VLAN_ETH_FRAME_LEN)
+                       base_flags |= TXD_FLAG_JMB_PKT;
        }
 
        for (i = data_off; i < tx_len; i++)
@@ -11586,6 +11769,9 @@ static int tg3_run_loopback(struct tg3 *tp, u32 pktsz, bool tso_loopback)
 
        tnapi->tx_prod++;
 
+       /* Sync BD data before updating mailbox */
+       wmb();
+
        tw32_tx_mbox(tnapi->prodmbox, tnapi->tx_prod);
        tr32_mailbox(tnapi->prodmbox);
 
@@ -11684,6 +11870,10 @@ static int tg3_test_loopback(struct tg3 *tp, u64 *data, bool do_extlpbk)
 {
        int err = -EIO;
        u32 eee_cap;
+       u32 jmb_pkt_sz = 9000;
+
+       if (tp->dma_limit)
+               jmb_pkt_sz = tp->dma_limit - ETH_HLEN;
 
        eee_cap = tp->phy_flags & TG3_PHYFLG_EEE_CAP;
        tp->phy_flags &= ~TG3_PHYFLG_EEE_CAP;
@@ -11727,7 +11917,7 @@ static int tg3_test_loopback(struct tg3 *tp, u64 *data, bool do_extlpbk)
                        data[0] |= TG3_STD_LOOPBACK_FAILED;
 
                if (tg3_flag(tp, JUMBO_RING_ENABLE) &&
-                   tg3_run_loopback(tp, 9000 + ETH_HLEN, false))
+                   tg3_run_loopback(tp, jmb_pkt_sz + ETH_HLEN, false))
                        data[0] |= TG3_JMB_LOOPBACK_FAILED;
 
                tg3_mac_loopback(tp, false);
@@ -11752,7 +11942,7 @@ static int tg3_test_loopback(struct tg3 *tp, u64 *data, bool do_extlpbk)
                    tg3_run_loopback(tp, ETH_FRAME_LEN, true))
                        data[1] |= TG3_TSO_LOOPBACK_FAILED;
                if (tg3_flag(tp, JUMBO_RING_ENABLE) &&
-                   tg3_run_loopback(tp, 9000 + ETH_HLEN, false))
+                   tg3_run_loopback(tp, jmb_pkt_sz + ETH_HLEN, false))
                        data[1] |= TG3_JMB_LOOPBACK_FAILED;
 
                if (do_extlpbk) {
@@ -11770,7 +11960,7 @@ static int tg3_test_loopback(struct tg3 *tp, u64 *data, bool do_extlpbk)
                            tg3_run_loopback(tp, ETH_FRAME_LEN, true))
                                data[2] |= TG3_TSO_LOOPBACK_FAILED;
                        if (tg3_flag(tp, JUMBO_RING_ENABLE) &&
-                           tg3_run_loopback(tp, 9000 + ETH_HLEN, false))
+                           tg3_run_loopback(tp, jmb_pkt_sz + ETH_HLEN, false))
                                data[2] |= TG3_JMB_LOOPBACK_FAILED;
                }
 
@@ -12026,6 +12216,117 @@ static const struct ethtool_ops tg3_ethtool_ops = {
        .set_rxfh_indir         = tg3_set_rxfh_indir,
 };
 
+static struct rtnl_link_stats64 *tg3_get_stats64(struct net_device *dev,
+                                               struct rtnl_link_stats64 *stats)
+{
+       struct tg3 *tp = netdev_priv(dev);
+
+       if (!tp->hw_stats)
+               return &tp->net_stats_prev;
+
+       spin_lock_bh(&tp->lock);
+       tg3_get_nstats(tp, stats);
+       spin_unlock_bh(&tp->lock);
+
+       return stats;
+}
+
+static void tg3_set_rx_mode(struct net_device *dev)
+{
+       struct tg3 *tp = netdev_priv(dev);
+
+       if (!netif_running(dev))
+               return;
+
+       tg3_full_lock(tp, 0);
+       __tg3_set_rx_mode(dev);
+       tg3_full_unlock(tp);
+}
+
+static inline void tg3_set_mtu(struct net_device *dev, struct tg3 *tp,
+                              int new_mtu)
+{
+       dev->mtu = new_mtu;
+
+       if (new_mtu > ETH_DATA_LEN) {
+               if (tg3_flag(tp, 5780_CLASS)) {
+                       netdev_update_features(dev);
+                       tg3_flag_clear(tp, TSO_CAPABLE);
+               } else {
+                       tg3_flag_set(tp, JUMBO_RING_ENABLE);
+               }
+       } else {
+               if (tg3_flag(tp, 5780_CLASS)) {
+                       tg3_flag_set(tp, TSO_CAPABLE);
+                       netdev_update_features(dev);
+               }
+               tg3_flag_clear(tp, JUMBO_RING_ENABLE);
+       }
+}
+
+static int tg3_change_mtu(struct net_device *dev, int new_mtu)
+{
+       struct tg3 *tp = netdev_priv(dev);
+       int err, reset_phy = 0;
+
+       if (new_mtu < TG3_MIN_MTU || new_mtu > TG3_MAX_MTU(tp))
+               return -EINVAL;
+
+       if (!netif_running(dev)) {
+               /* We'll just catch it later when the
+                * device is up'd.
+                */
+               tg3_set_mtu(dev, tp, new_mtu);
+               return 0;
+       }
+
+       tg3_phy_stop(tp);
+
+       tg3_netif_stop(tp);
+
+       tg3_full_lock(tp, 1);
+
+       tg3_halt(tp, RESET_KIND_SHUTDOWN, 1);
+
+       tg3_set_mtu(dev, tp, new_mtu);
+
+       /* Reset PHY, otherwise the read DMA engine will be in a mode that
+        * breaks all requests to 256 bytes.
+        */
+       if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_57766)
+               reset_phy = 1;
+
+       err = tg3_restart_hw(tp, reset_phy);
+
+       if (!err)
+               tg3_netif_start(tp);
+
+       tg3_full_unlock(tp);
+
+       if (!err)
+               tg3_phy_start(tp);
+
+       return err;
+}
+
+static const struct net_device_ops tg3_netdev_ops = {
+       .ndo_open               = tg3_open,
+       .ndo_stop               = tg3_close,
+       .ndo_start_xmit         = tg3_start_xmit,
+       .ndo_get_stats64        = tg3_get_stats64,
+       .ndo_validate_addr      = eth_validate_addr,
+       .ndo_set_rx_mode        = tg3_set_rx_mode,
+       .ndo_set_mac_address    = tg3_set_mac_addr,
+       .ndo_do_ioctl           = tg3_ioctl,
+       .ndo_tx_timeout         = tg3_tx_timeout,
+       .ndo_change_mtu         = tg3_change_mtu,
+       .ndo_fix_features       = tg3_fix_features,
+       .ndo_set_features       = tg3_set_features,
+#ifdef CONFIG_NET_POLL_CONTROLLER
+       .ndo_poll_controller    = tg3_poll_controller,
+#endif
+};
+
 static void __devinit tg3_get_eeprom_size(struct tg3 *tp)
 {
        u32 cursize, val, magic;
@@ -12703,266 +13004,18 @@ static void __devinit tg3_nvram_init(struct tg3 *tp)
                else
                        tg3_get_nvram_info(tp);
 
-               if (tp->nvram_size == 0)
-                       tg3_get_nvram_size(tp);
-
-               tg3_disable_nvram_access(tp);
-               tg3_nvram_unlock(tp);
-
-       } else {
-               tg3_flag_clear(tp, NVRAM);
-               tg3_flag_clear(tp, NVRAM_BUFFERED);
-
-               tg3_get_eeprom_size(tp);
-       }
-}
-
-static int tg3_nvram_write_block_using_eeprom(struct tg3 *tp,
-                                   u32 offset, u32 len, u8 *buf)
-{
-       int i, j, rc = 0;
-       u32 val;
-
-       for (i = 0; i < len; i += 4) {
-               u32 addr;
-               __be32 data;
-
-               addr = offset + i;
-
-               memcpy(&data, buf + i, 4);
-
-               /*
-                * The SEEPROM interface expects the data to always be opposite
-                * the native endian format.  We accomplish this by reversing
-                * all the operations that would have been performed on the
-                * data from a call to tg3_nvram_read_be32().
-                */
-               tw32(GRC_EEPROM_DATA, swab32(be32_to_cpu(data)));
-
-               val = tr32(GRC_EEPROM_ADDR);
-               tw32(GRC_EEPROM_ADDR, val | EEPROM_ADDR_COMPLETE);
-
-               val &= ~(EEPROM_ADDR_ADDR_MASK | EEPROM_ADDR_DEVID_MASK |
-                       EEPROM_ADDR_READ);
-               tw32(GRC_EEPROM_ADDR, val |
-                       (0 << EEPROM_ADDR_DEVID_SHIFT) |
-                       (addr & EEPROM_ADDR_ADDR_MASK) |
-                       EEPROM_ADDR_START |
-                       EEPROM_ADDR_WRITE);
-
-               for (j = 0; j < 1000; j++) {
-                       val = tr32(GRC_EEPROM_ADDR);
-
-                       if (val & EEPROM_ADDR_COMPLETE)
-                               break;
-                       msleep(1);
-               }
-               if (!(val & EEPROM_ADDR_COMPLETE)) {
-                       rc = -EBUSY;
-                       break;
-               }
-       }
-
-       return rc;
-}
-
-/* offset and length are dword aligned */
-static int tg3_nvram_write_block_unbuffered(struct tg3 *tp, u32 offset, u32 len,
-               u8 *buf)
-{
-       int ret = 0;
-       u32 pagesize = tp->nvram_pagesize;
-       u32 pagemask = pagesize - 1;
-       u32 nvram_cmd;
-       u8 *tmp;
-
-       tmp = kmalloc(pagesize, GFP_KERNEL);
-       if (tmp == NULL)
-               return -ENOMEM;
-
-       while (len) {
-               int j;
-               u32 phy_addr, page_off, size;
-
-               phy_addr = offset & ~pagemask;
-
-               for (j = 0; j < pagesize; j += 4) {
-                       ret = tg3_nvram_read_be32(tp, phy_addr + j,
-                                                 (__be32 *) (tmp + j));
-                       if (ret)
-                               break;
-               }
-               if (ret)
-                       break;
-
-               page_off = offset & pagemask;
-               size = pagesize;
-               if (len < size)
-                       size = len;
-
-               len -= size;
-
-               memcpy(tmp + page_off, buf, size);
-
-               offset = offset + (pagesize - page_off);
-
-               tg3_enable_nvram_access(tp);
-
-               /*
-                * Before we can erase the flash page, we need
-                * to issue a special "write enable" command.
-                */
-               nvram_cmd = NVRAM_CMD_WREN | NVRAM_CMD_GO | NVRAM_CMD_DONE;
-
-               if (tg3_nvram_exec_cmd(tp, nvram_cmd))
-                       break;
-
-               /* Erase the target page */
-               tw32(NVRAM_ADDR, phy_addr);
-
-               nvram_cmd = NVRAM_CMD_GO | NVRAM_CMD_DONE | NVRAM_CMD_WR |
-                       NVRAM_CMD_FIRST | NVRAM_CMD_LAST | NVRAM_CMD_ERASE;
-
-               if (tg3_nvram_exec_cmd(tp, nvram_cmd))
-                       break;
-
-               /* Issue another write enable to start the write. */
-               nvram_cmd = NVRAM_CMD_WREN | NVRAM_CMD_GO | NVRAM_CMD_DONE;
-
-               if (tg3_nvram_exec_cmd(tp, nvram_cmd))
-                       break;
-
-               for (j = 0; j < pagesize; j += 4) {
-                       __be32 data;
-
-                       data = *((__be32 *) (tmp + j));
-
-                       tw32(NVRAM_WRDATA, be32_to_cpu(data));
-
-                       tw32(NVRAM_ADDR, phy_addr + j);
-
-                       nvram_cmd = NVRAM_CMD_GO | NVRAM_CMD_DONE |
-                               NVRAM_CMD_WR;
-
-                       if (j == 0)
-                               nvram_cmd |= NVRAM_CMD_FIRST;
-                       else if (j == (pagesize - 4))
-                               nvram_cmd |= NVRAM_CMD_LAST;
-
-                       if ((ret = tg3_nvram_exec_cmd(tp, nvram_cmd)))
-                               break;
-               }
-               if (ret)
-                       break;
-       }
-
-       nvram_cmd = NVRAM_CMD_WRDI | NVRAM_CMD_GO | NVRAM_CMD_DONE;
-       tg3_nvram_exec_cmd(tp, nvram_cmd);
-
-       kfree(tmp);
-
-       return ret;
-}
-
-/* offset and length are dword aligned */
-static int tg3_nvram_write_block_buffered(struct tg3 *tp, u32 offset, u32 len,
-               u8 *buf)
-{
-       int i, ret = 0;
-
-       for (i = 0; i < len; i += 4, offset += 4) {
-               u32 page_off, phy_addr, nvram_cmd;
-               __be32 data;
-
-               memcpy(&data, buf + i, 4);
-               tw32(NVRAM_WRDATA, be32_to_cpu(data));
-
-               page_off = offset % tp->nvram_pagesize;
-
-               phy_addr = tg3_nvram_phys_addr(tp, offset);
-
-               tw32(NVRAM_ADDR, phy_addr);
-
-               nvram_cmd = NVRAM_CMD_GO | NVRAM_CMD_DONE | NVRAM_CMD_WR;
-
-               if (page_off == 0 || i == 0)
-                       nvram_cmd |= NVRAM_CMD_FIRST;
-               if (page_off == (tp->nvram_pagesize - 4))
-                       nvram_cmd |= NVRAM_CMD_LAST;
-
-               if (i == (len - 4))
-                       nvram_cmd |= NVRAM_CMD_LAST;
-
-               if (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5752 &&
-                   !tg3_flag(tp, 5755_PLUS) &&
-                   (tp->nvram_jedecnum == JEDEC_ST) &&
-                   (nvram_cmd & NVRAM_CMD_FIRST)) {
-
-                       if ((ret = tg3_nvram_exec_cmd(tp,
-                               NVRAM_CMD_WREN | NVRAM_CMD_GO |
-                               NVRAM_CMD_DONE)))
-
-                               break;
-               }
-               if (!tg3_flag(tp, FLASH)) {
-                       /* We always do complete word writes to eeprom. */
-                       nvram_cmd |= (NVRAM_CMD_FIRST | NVRAM_CMD_LAST);
-               }
-
-               if ((ret = tg3_nvram_exec_cmd(tp, nvram_cmd)))
-                       break;
-       }
-       return ret;
-}
-
-/* offset and length are dword aligned */
-static int tg3_nvram_write_block(struct tg3 *tp, u32 offset, u32 len, u8 *buf)
-{
-       int ret;
-
-       if (tg3_flag(tp, EEPROM_WRITE_PROT)) {
-               tw32_f(GRC_LOCAL_CTRL, tp->grc_local_ctrl &
-                      ~GRC_LCLCTRL_GPIO_OUTPUT1);
-               udelay(40);
-       }
-
-       if (!tg3_flag(tp, NVRAM)) {
-               ret = tg3_nvram_write_block_using_eeprom(tp, offset, len, buf);
-       } else {
-               u32 grc_mode;
-
-               ret = tg3_nvram_lock(tp);
-               if (ret)
-                       return ret;
-
-               tg3_enable_nvram_access(tp);
-               if (tg3_flag(tp, 5750_PLUS) && !tg3_flag(tp, PROTECTED_NVRAM))
-                       tw32(NVRAM_WRITE1, 0x406);
-
-               grc_mode = tr32(GRC_MODE);
-               tw32(GRC_MODE, grc_mode | GRC_MODE_NVRAM_WR_ENABLE);
-
-               if (tg3_flag(tp, NVRAM_BUFFERED) || !tg3_flag(tp, FLASH)) {
-                       ret = tg3_nvram_write_block_buffered(tp, offset, len,
-                               buf);
-               } else {
-                       ret = tg3_nvram_write_block_unbuffered(tp, offset, len,
-                               buf);
-               }
-
-               grc_mode = tr32(GRC_MODE);
-               tw32(GRC_MODE, grc_mode & ~GRC_MODE_NVRAM_WR_ENABLE);
+               if (tp->nvram_size == 0)
+                       tg3_get_nvram_size(tp);
 
                tg3_disable_nvram_access(tp);
                tg3_nvram_unlock(tp);
-       }
 
-       if (tg3_flag(tp, EEPROM_WRITE_PROT)) {
-               tw32_f(GRC_LOCAL_CTRL, tp->grc_local_ctrl);
-               udelay(40);
-       }
+       } else {
+               tg3_flag_clear(tp, NVRAM);
+               tg3_flag_clear(tp, NVRAM_BUFFERED);
 
-       return ret;
+               tg3_get_eeprom_size(tp);
+       }
 }
 
 struct subsys_tbl_ent {
@@ -13315,14 +13368,13 @@ static void __devinit tg3_phy_init_link_config(struct tg3 *tp)
                adv |= ADVERTISED_FIBRE;
 
        tp->link_config.advertising = adv;
-       tp->link_config.speed = SPEED_INVALID;
-       tp->link_config.duplex = DUPLEX_INVALID;
+       tp->link_config.speed = SPEED_UNKNOWN;
+       tp->link_config.duplex = DUPLEX_UNKNOWN;
        tp->link_config.autoneg = AUTONEG_ENABLE;
-       tp->link_config.active_speed = SPEED_INVALID;
-       tp->link_config.active_duplex = DUPLEX_INVALID;
-       tp->link_config.orig_speed = SPEED_INVALID;
-       tp->link_config.orig_duplex = DUPLEX_INVALID;
-       tp->link_config.orig_autoneg = AUTONEG_INVALID;
+       tp->link_config.active_speed = SPEED_UNKNOWN;
+       tp->link_config.active_duplex = DUPLEX_UNKNOWN;
+
+       tp->old_link = -1;
 }
 
 static int __devinit tg3_phy_probe(struct tg3 *tp)
@@ -13819,8 +13871,6 @@ done:
        tp->fw_ver[TG3_VER_SIZE - 1] = 0;
 }
 
-static struct pci_dev * __devinit tg3_find_peer(struct tg3 *);
-
 static inline u32 tg3_rx_ret_ring_size(struct tg3 *tp)
 {
        if (tg3_flag(tp, LRG_PROD_RING_CAP))
@@ -13838,49 +13888,50 @@ static DEFINE_PCI_DEVICE_TABLE(tg3_write_reorder_chipsets) = {
        { },
 };
 
-static int __devinit tg3_get_invariants(struct tg3 *tp)
+static struct pci_dev * __devinit tg3_find_peer(struct tg3 *tp)
 {
-       u32 misc_ctrl_reg;
-       u32 pci_state_reg, grc_misc_cfg;
-       u32 val;
-       u16 pci_cmd;
-       int err;
+       struct pci_dev *peer;
+       unsigned int func, devnr = tp->pdev->devfn & ~7;
 
-       /* Force memory write invalidate off.  If we leave it on,
-        * then on 5700_BX chips we have to enable a workaround.
-        * The workaround is to set the TG3PCI_DMA_RW_CTRL boundary
-        * to match the cacheline size.  The Broadcom driver have this
-        * workaround but turns MWI off all the times so never uses
-        * it.  This seems to suggest that the workaround is insufficient.
+       for (func = 0; func < 8; func++) {
+               peer = pci_get_slot(tp->pdev->bus, devnr | func);
+               if (peer && peer != tp->pdev)
+                       break;
+               pci_dev_put(peer);
+       }
+       /* 5704 can be configured in single-port mode, set peer to
+        * tp->pdev in that case.
         */
-       pci_read_config_word(tp->pdev, PCI_COMMAND, &pci_cmd);
-       pci_cmd &= ~PCI_COMMAND_INVALIDATE;
-       pci_write_config_word(tp->pdev, PCI_COMMAND, pci_cmd);
+       if (!peer) {
+               peer = tp->pdev;
+               return peer;
+       }
 
-       /* Important! -- Make sure register accesses are byteswapped
-        * correctly.  Also, for those chips that require it, make
-        * sure that indirect register accesses are enabled before
-        * the first operation.
+       /*
+        * We don't need to keep the refcount elevated; there's no way
+        * to remove one half of this device without removing the other
         */
-       pci_read_config_dword(tp->pdev, TG3PCI_MISC_HOST_CTRL,
-                             &misc_ctrl_reg);
-       tp->misc_host_ctrl |= (misc_ctrl_reg &
-                              MISC_HOST_CTRL_CHIPREV);
-       pci_write_config_dword(tp->pdev, TG3PCI_MISC_HOST_CTRL,
-                              tp->misc_host_ctrl);
+       pci_dev_put(peer);
+
+       return peer;
+}
 
-       tp->pci_chip_rev_id = (misc_ctrl_reg >>
-                              MISC_HOST_CTRL_CHIPREV_SHIFT);
+static void __devinit tg3_detect_asic_rev(struct tg3 *tp, u32 misc_ctrl_reg)
+{
+       tp->pci_chip_rev_id = misc_ctrl_reg >> MISC_HOST_CTRL_CHIPREV_SHIFT;
        if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_USE_PROD_ID_REG) {
-               u32 prod_id_asic_rev;
+               u32 reg;
+
+               /* All devices that use the alternate
+                * ASIC REV location have a CPMU.
+                */
+               tg3_flag_set(tp, CPMU_PRESENT);
 
                if (tp->pdev->device == TG3PCI_DEVICE_TIGON3_5717 ||
                    tp->pdev->device == TG3PCI_DEVICE_TIGON3_5718 ||
                    tp->pdev->device == TG3PCI_DEVICE_TIGON3_5719 ||
                    tp->pdev->device == TG3PCI_DEVICE_TIGON3_5720)
-                       pci_read_config_dword(tp->pdev,
-                                             TG3PCI_GEN2_PRODID_ASICREV,
-                                             &prod_id_asic_rev);
+                       reg = TG3PCI_GEN2_PRODID_ASICREV;
                else if (tp->pdev->device == TG3PCI_DEVICE_TIGON3_57781 ||
                         tp->pdev->device == TG3PCI_DEVICE_TIGON3_57785 ||
                         tp->pdev->device == TG3PCI_DEVICE_TIGON3_57761 ||
@@ -13891,14 +13942,11 @@ static int __devinit tg3_get_invariants(struct tg3 *tp)
                         tp->pdev->device == TG3PCI_DEVICE_TIGON3_57766 ||
                         tp->pdev->device == TG3PCI_DEVICE_TIGON3_57782 ||
                         tp->pdev->device == TG3PCI_DEVICE_TIGON3_57786)
-                       pci_read_config_dword(tp->pdev,
-                                             TG3PCI_GEN15_PRODID_ASICREV,
-                                             &prod_id_asic_rev);
+                       reg = TG3PCI_GEN15_PRODID_ASICREV;
                else
-                       pci_read_config_dword(tp->pdev, TG3PCI_PRODID_ASICREV,
-                                             &prod_id_asic_rev);
+                       reg = TG3PCI_PRODID_ASICREV;
 
-               tp->pci_chip_rev_id = prod_id_asic_rev;
+               pci_read_config_dword(tp->pdev, reg, &tp->pci_chip_rev_id);
        }
 
        /* Wrong chip ID in 5752 A0. This code can be removed later
@@ -13907,6 +13955,77 @@ static int __devinit tg3_get_invariants(struct tg3 *tp)
        if (tp->pci_chip_rev_id == CHIPREV_ID_5752_A0_HW)
                tp->pci_chip_rev_id = CHIPREV_ID_5752_A0;
 
+       if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5717 ||
+           GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5719 ||
+           GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5720)
+               tg3_flag_set(tp, 5717_PLUS);
+
+       if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_57765 ||
+           GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_57766)
+               tg3_flag_set(tp, 57765_CLASS);
+
+       if (tg3_flag(tp, 57765_CLASS) || tg3_flag(tp, 5717_PLUS))
+               tg3_flag_set(tp, 57765_PLUS);
+
+       /* Intentionally exclude ASIC_REV_5906 */
+       if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5755 ||
+           GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5787 ||
+           GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5784 ||
+           GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5761 ||
+           GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5785 ||
+           GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_57780 ||
+           tg3_flag(tp, 57765_PLUS))
+               tg3_flag_set(tp, 5755_PLUS);
+
+       if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5780 ||
+           GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5714)
+               tg3_flag_set(tp, 5780_CLASS);
+
+       if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5750 ||
+           GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5752 ||
+           GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906 ||
+           tg3_flag(tp, 5755_PLUS) ||
+           tg3_flag(tp, 5780_CLASS))
+               tg3_flag_set(tp, 5750_PLUS);
+
+       if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705 ||
+           tg3_flag(tp, 5750_PLUS))
+               tg3_flag_set(tp, 5705_PLUS);
+}
+
+static int __devinit tg3_get_invariants(struct tg3 *tp)
+{
+       u32 misc_ctrl_reg;
+       u32 pci_state_reg, grc_misc_cfg;
+       u32 val;
+       u16 pci_cmd;
+       int err;
+
+       /* Force memory write invalidate off.  If we leave it on,
+        * then on 5700_BX chips we have to enable a workaround.
+        * The workaround is to set the TG3PCI_DMA_RW_CTRL boundary
+        * to match the cacheline size.  The Broadcom driver have this
+        * workaround but turns MWI off all the times so never uses
+        * it.  This seems to suggest that the workaround is insufficient.
+        */
+       pci_read_config_word(tp->pdev, PCI_COMMAND, &pci_cmd);
+       pci_cmd &= ~PCI_COMMAND_INVALIDATE;
+       pci_write_config_word(tp->pdev, PCI_COMMAND, pci_cmd);
+
+       /* Important! -- Make sure register accesses are byteswapped
+        * correctly.  Also, for those chips that require it, make
+        * sure that indirect register accesses are enabled before
+        * the first operation.
+        */
+       pci_read_config_dword(tp->pdev, TG3PCI_MISC_HOST_CTRL,
+                             &misc_ctrl_reg);
+       tp->misc_host_ctrl |= (misc_ctrl_reg &
+                              MISC_HOST_CTRL_CHIPREV);
+       pci_write_config_dword(tp->pdev, TG3PCI_MISC_HOST_CTRL,
+                              tp->misc_host_ctrl);
+
+       tg3_detect_asic_rev(tp, misc_ctrl_reg);
+
        /* If we have 5702/03 A1 or A2 on certain ICH chipsets,
         * we need to disable memory and use config. cycles
         * only to access all registers. The 5702/03 chips
@@ -14003,9 +14122,7 @@ static int __devinit tg3_get_invariants(struct tg3 *tp)
         * Any tg3 device found behind the bridge will also need the 40-bit
         * DMA workaround.
         */
-       if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5780 ||
-           GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5714) {
-               tg3_flag_set(tp, 5780_CLASS);
+       if (tg3_flag(tp, 5780_CLASS)) {
                tg3_flag_set(tp, 40BIT_DMA_BUG);
                tp->msi_cap = pci_find_capability(tp->pdev, PCI_CAP_ID_MSI);
        } else {
@@ -14031,39 +14148,6 @@ static int __devinit tg3_get_invariants(struct tg3 *tp)
            GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5714)
                tp->pdev_peer = tg3_find_peer(tp);
 
-       if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5717 ||
-           GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5719 ||
-           GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5720)
-               tg3_flag_set(tp, 5717_PLUS);
-
-       if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_57765 ||
-           GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_57766)
-               tg3_flag_set(tp, 57765_CLASS);
-
-       if (tg3_flag(tp, 57765_CLASS) || tg3_flag(tp, 5717_PLUS))
-               tg3_flag_set(tp, 57765_PLUS);
-
-       /* Intentionally exclude ASIC_REV_5906 */
-       if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5755 ||
-           GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5787 ||
-           GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5784 ||
-           GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5761 ||
-           GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5785 ||
-           GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_57780 ||
-           tg3_flag(tp, 57765_PLUS))
-               tg3_flag_set(tp, 5755_PLUS);
-
-       if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5750 ||
-           GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5752 ||
-           GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906 ||
-           tg3_flag(tp, 5755_PLUS) ||
-           tg3_flag(tp, 5780_CLASS))
-               tg3_flag_set(tp, 5750_PLUS);
-
-       if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705 ||
-           tg3_flag(tp, 5750_PLUS))
-               tg3_flag_set(tp, 5705_PLUS);
-
        /* Determine TSO capabilities */
        if (tp->pci_chip_rev_id == CHIPREV_ID_5719_A0)
                ; /* Do nothing. HW bug. */
@@ -14135,8 +14219,6 @@ static int __devinit tg3_get_invariants(struct tg3 *tp)
 
        if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5719)
                tp->dma_limit = TG3_TX_BD_DMA_MAX_4K;
-       else if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_57766)
-               tp->dma_limit = TG3_TX_BD_DMA_MAX_2K;
 
        if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5717 ||
            GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5719 ||
@@ -14160,12 +14242,6 @@ static int __devinit tg3_get_invariants(struct tg3 *tp)
 
                tg3_flag_set(tp, PCI_EXPRESS);
 
-               if (tp->pci_chip_rev_id == CHIPREV_ID_5719_A0) {
-                       int readrq = pcie_get_readrq(tp->pdev);
-                       if (readrq > 2048)
-                               pcie_set_readrq(tp->pdev, 2048);
-               }
-
                pci_read_config_word(tp->pdev,
                                     pci_pcie_cap(tp->pdev) + PCI_EXP_LNKCTL,
                                     &lnkctl);
@@ -14395,13 +14471,6 @@ static int __devinit tg3_get_invariants(struct tg3 *tp)
                tg3_ape_lock_init(tp);
        }
 
-       if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5784 ||
-           GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5761 ||
-           GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5785 ||
-           GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_57780 ||
-           tg3_flag(tp, 57765_PLUS))
-               tg3_flag_set(tp, CPMU_PRESENT);
-
        /* Set up tp->grc_local_ctrl before calling
         * tg3_pwrsrc_switch_to_vmain().  GPIO1 driven high
         * will bring 5700's external PHY out of reset.
@@ -15336,34 +15405,6 @@ static char * __devinit tg3_bus_string(struct tg3 *tp, char *str)
        return str;
 }
 
-static struct pci_dev * __devinit tg3_find_peer(struct tg3 *tp)
-{
-       struct pci_dev *peer;
-       unsigned int func, devnr = tp->pdev->devfn & ~7;
-
-       for (func = 0; func < 8; func++) {
-               peer = pci_get_slot(tp->pdev->bus, devnr | func);
-               if (peer && peer != tp->pdev)
-                       break;
-               pci_dev_put(peer);
-       }
-       /* 5704 can be configured in single-port mode, set peer to
-        * tp->pdev in that case.
-        */
-       if (!peer) {
-               peer = tp->pdev;
-               return peer;
-       }
-
-       /*
-        * We don't need to keep the refcount elevated; there's no way
-        * to remove one half of this device without removing the other
-        */
-       pci_dev_put(peer);
-
-       return peer;
-}
-
 static void __devinit tg3_init_coal(struct tg3 *tp)
 {
        struct ethtool_coalesce *ec = &tp->coal;
@@ -15395,39 +15436,6 @@ static void __devinit tg3_init_coal(struct tg3 *tp)
        }
 }
 
-static struct rtnl_link_stats64 *tg3_get_stats64(struct net_device *dev,
-                                               struct rtnl_link_stats64 *stats)
-{
-       struct tg3 *tp = netdev_priv(dev);
-
-       if (!tp->hw_stats)
-               return &tp->net_stats_prev;
-
-       spin_lock_bh(&tp->lock);
-       tg3_get_nstats(tp, stats);
-       spin_unlock_bh(&tp->lock);
-
-       return stats;
-}
-
-static const struct net_device_ops tg3_netdev_ops = {
-       .ndo_open               = tg3_open,
-       .ndo_stop               = tg3_close,
-       .ndo_start_xmit         = tg3_start_xmit,
-       .ndo_get_stats64        = tg3_get_stats64,
-       .ndo_validate_addr      = eth_validate_addr,
-       .ndo_set_rx_mode        = tg3_set_rx_mode,
-       .ndo_set_mac_address    = tg3_set_mac_addr,
-       .ndo_do_ioctl           = tg3_ioctl,
-       .ndo_tx_timeout         = tg3_tx_timeout,
-       .ndo_change_mtu         = tg3_change_mtu,
-       .ndo_fix_features       = tg3_fix_features,
-       .ndo_set_features       = tg3_set_features,
-#ifdef CONFIG_NET_POLL_CONTROLLER
-       .ndo_poll_controller    = tg3_poll_controller,
-#endif
-};
-
 static int __devinit tg3_init_one(struct pci_dev *pdev,
                                  const struct pci_device_id *ent)
 {
@@ -15472,7 +15480,6 @@ static int __devinit tg3_init_one(struct pci_dev *pdev,
 
        dev = alloc_etherdev_mq(sizeof(*tp), TG3_IRQ_MAX_VECS);
        if (!dev) {
-               dev_err(&pdev->dev, "Etherdev alloc failed, aborting\n");
                err = -ENOMEM;
                goto err_out_power_down;
        }
@@ -15729,6 +15736,8 @@ static int __devinit tg3_init_one(struct pci_dev *pdev,
                tg3_frob_aux_power(tp, false);
        }
 
+       tg3_timer_init(tp);
+
        err = register_netdev(dev);
        if (err) {
                dev_err(&pdev->dev, "Cannot register net device, aborting\n");
@@ -15854,7 +15863,7 @@ static int tg3_suspend(struct device *device)
        tg3_phy_stop(tp);
        tg3_netif_stop(tp);
 
-       del_timer_sync(&tp->timer);
+       tg3_timer_stop(tp);
 
        tg3_full_lock(tp, 1);
        tg3_disable_ints(tp);
@@ -15878,8 +15887,7 @@ static int tg3_suspend(struct device *device)
                if (err2)
                        goto out;
 
-               tp->timer.expires = jiffies + tp->timer_offset;
-               add_timer(&tp->timer);
+               tg3_timer_start(tp);
 
                netif_device_attach(dev);
                tg3_netif_start(tp);
@@ -15913,8 +15921,7 @@ static int tg3_resume(struct device *device)
        if (err)
                goto out;
 
-       tp->timer.expires = jiffies + tp->timer_offset;
-       add_timer(&tp->timer);
+       tg3_timer_start(tp);
 
        tg3_netif_start(tp);
 
@@ -15962,11 +15969,10 @@ static pci_ers_result_t tg3_io_error_detected(struct pci_dev *pdev,
 
        tg3_netif_stop(tp);
 
-       del_timer_sync(&tp->timer);
+       tg3_timer_stop(tp);
 
        /* Want to make sure that the reset task doesn't run */
        tg3_reset_task_cancel(tp);
-       tg3_flag_clear(tp, TX_RECOVERY_PENDING);
 
        netif_device_detach(netdev);
 
@@ -16059,8 +16065,7 @@ static void tg3_io_resume(struct pci_dev *pdev)
 
        netif_device_attach(netdev);
 
-       tp->timer.expires = jiffies + tp->timer_offset;
-       add_timer(&tp->timer);
+       tg3_timer_start(tp);
 
        tg3_netif_start(tp);
 
index aea8f72..66bcfca 100644 (file)
@@ -4,7 +4,7 @@
  * Copyright (C) 2001, 2002, 2003, 2004 David S. Miller (davem@redhat.com)
  * Copyright (C) 2001 Jeff Garzik (jgarzik@pobox.com)
  * Copyright (C) 2004 Sun Microsystems Inc.
- * Copyright (C) 2007-2011 Broadcom Corporation.
+ * Copyright (C) 2007-2012 Broadcom Corporation.
  */
 
 #ifndef _T3_H
@@ -2702,19 +2702,8 @@ struct tg3_link_config {
        u8                              active_flowctrl;
 
        u8                              active_duplex;
-#define SPEED_INVALID          0xffff
-#define DUPLEX_INVALID         0xff
-#define AUTONEG_INVALID                0xff
        u16                             active_speed;
        u32                             rmt_adv;
-
-       /* When we go in and out of low power mode we need
-        * to swap with this state.
-        */
-       u16                             orig_speed;
-       u8                              orig_duplex;
-       u8                              orig_autoneg;
-       u32                             orig_advertising;
 };
 
 struct tg3_bufmgr_config {
@@ -3075,6 +3064,7 @@ struct tg3 {
 
        struct mii_bus                  *mdio_bus;
        int                             mdio_irq[PHY_MAX_ADDR];
+       int                             old_link;
 
        u8                              phy_addr;
 
index 29f284f..689e5e1 100644 (file)
@@ -203,7 +203,7 @@ bfa_nw_cee_get_attr(struct bfa_cee *cee, struct bfa_cee_attr *attr,
        if (!bfa_nw_ioc_is_operational(cee->ioc))
                return BFA_STATUS_IOC_FAILURE;
 
-       if (cee->get_attr_pending == true)
+       if (cee->get_attr_pending)
                return  BFA_STATUS_DEVBUSY;
 
        cee->get_attr_pending = true;
@@ -272,7 +272,7 @@ bfa_cee_notify(void *arg, enum bfa_ioc_event event)
        switch (event) {
        case BFA_IOC_E_DISABLED:
        case BFA_IOC_E_FAILED:
-               if (cee->get_attr_pending == true) {
+               if (cee->get_attr_pending) {
                        cee->get_attr_status = BFA_STATUS_FAILED;
                        cee->get_attr_pending  = false;
                        if (cee->cbfn.get_attr_cbfn) {
@@ -281,7 +281,7 @@ bfa_cee_notify(void *arg, enum bfa_ioc_event event)
                                        BFA_STATUS_FAILED);
                        }
                }
-               if (cee->get_stats_pending == true) {
+               if (cee->get_stats_pending) {
                        cee->get_stats_status = BFA_STATUS_FAILED;
                        cee->get_stats_pending  = false;
                        if (cee->cbfn.get_stats_cbfn) {
@@ -290,7 +290,7 @@ bfa_cee_notify(void *arg, enum bfa_ioc_event event)
                                        BFA_STATUS_FAILED);
                        }
                }
-               if (cee->reset_stats_pending == true) {
+               if (cee->reset_stats_pending) {
                        cee->reset_stats_status = BFA_STATUS_FAILED;
                        cee->reset_stats_pending  = false;
                        if (cee->cbfn.reset_stats_cbfn) {
index 871c630..48f8773 100644 (file)
@@ -297,6 +297,7 @@ enum bfa_mode {
 #define BFA_FLASH_PART_ENTRY_SIZE      32      /* partition entry size */
 #define BFA_FLASH_PART_MAX             32      /* maximal # of partitions */
 #define BFA_TOTAL_FLASH_SIZE           0x400000
+#define BFA_FLASH_PART_FWIMG           2
 #define BFA_FLASH_PART_MFG             7
 
 /*
index abfad27..77977d7 100644 (file)
@@ -692,7 +692,7 @@ static void
 bfa_iocpf_sm_mismatch_entry(struct bfa_iocpf *iocpf)
 {
        /* Call only the first time sm enters fwmismatch state. */
-       if (iocpf->fw_mismatch_notified == false)
+       if (!iocpf->fw_mismatch_notified)
                bfa_ioc_pf_fwmismatch(iocpf->ioc);
 
        iocpf->fw_mismatch_notified = true;
index be7d91e..ff78f77 100644 (file)
@@ -3284,7 +3284,6 @@ bnad_pci_probe(struct pci_dev *pdev,
         */
        netdev = alloc_etherdev(sizeof(struct bnad));
        if (!netdev) {
-               dev_err(&pdev->dev, "netdev allocation failed\n");
                err = -ENOMEM;
                return err;
        }
index 592ad39..c9fdceb 100644 (file)
@@ -62,8 +62,6 @@ bnad_debugfs_open_fwtrc(struct inode *inode, struct file *file)
        if (!fw_debug->debug_buffer) {
                kfree(fw_debug);
                fw_debug = NULL;
-               pr_warn("bna %s: Failed to allocate fwtrc buffer\n",
-                       pci_name(bnad->pcidev));
                return -ENOMEM;
        }
 
@@ -105,8 +103,6 @@ bnad_debugfs_open_fwsave(struct inode *inode, struct file *file)
        if (!fw_debug->debug_buffer) {
                kfree(fw_debug);
                fw_debug = NULL;
-               pr_warn("bna %s: Failed to allocate fwsave buffer\n",
-                       pci_name(bnad->pcidev));
                return -ENOMEM;
        }
 
@@ -208,8 +204,6 @@ bnad_debugfs_open_drvinfo(struct inode *inode, struct file *file)
        if (!drv_info->debug_buffer) {
                kfree(drv_info);
                drv_info = NULL;
-               pr_warn("bna %s: Failed to allocate drv info buffer\n",
-                       pci_name(bnad->pcidev));
                return -ENOMEM;
        }
 
@@ -348,11 +342,8 @@ bnad_debugfs_write_regrd(struct file *file, const char __user *buf,
 
        /* Allocate memory to store the user space buf */
        kern_buf = kzalloc(nbytes, GFP_KERNEL);
-       if (!kern_buf) {
-               pr_warn("bna %s: Failed to allocate user buffer\n",
-                       pci_name(bnad->pcidev));
+       if (!kern_buf)
                return -ENOMEM;
-       }
 
        if (copy_from_user(kern_buf, (void  __user *)buf, nbytes)) {
                kfree(kern_buf);
@@ -373,11 +364,8 @@ bnad_debugfs_write_regrd(struct file *file, const char __user *buf,
        bnad->reglen = 0;
 
        bnad->regdata = kzalloc(len << 2, GFP_KERNEL);
-       if (!bnad->regdata) {
-               pr_warn("bna %s: Failed to allocate regrd buffer\n",
-                       pci_name(bnad->pcidev));
+       if (!bnad->regdata)
                return -ENOMEM;
-       }
 
        bnad->reglen = len << 2;
        rb = bfa_ioc_bar0(ioc);
@@ -421,11 +409,8 @@ bnad_debugfs_write_regwr(struct file *file, const char __user *buf,
 
        /* Allocate memory to store the user space buf */
        kern_buf = kzalloc(nbytes, GFP_KERNEL);
-       if (!kern_buf) {
-               pr_warn("bna %s: Failed to allocate user buffer\n",
-                       pci_name(bnad->pcidev));
+       if (!kern_buf)
                return -ENOMEM;
-       }
 
        if (copy_from_user(kern_buf, (void  __user *)buf, nbytes)) {
                kfree(kern_buf);
index 803ea32..ab753d7 100644 (file)
@@ -1070,6 +1070,47 @@ done:
        return ret;
 }
 
+static int
+bnad_flash_device(struct net_device *netdev, struct ethtool_flash *eflash)
+{
+       struct bnad *bnad = netdev_priv(netdev);
+       struct bnad_iocmd_comp fcomp;
+       const struct firmware *fw;
+       int ret = 0;
+
+       ret = request_firmware(&fw, eflash->data, &bnad->pcidev->dev);
+       if (ret) {
+               pr_err("BNA: Can't locate firmware %s\n", eflash->data);
+               goto out;
+       }
+
+       fcomp.bnad = bnad;
+       fcomp.comp_status = 0;
+
+       init_completion(&fcomp.comp);
+       spin_lock_irq(&bnad->bna_lock);
+       ret = bfa_nw_flash_update_part(&bnad->bna.flash, BFA_FLASH_PART_FWIMG,
+                               bnad->id, (u8 *)fw->data, fw->size, 0,
+                               bnad_cb_completion, &fcomp);
+       if (ret != BFA_STATUS_OK) {
+               pr_warn("BNA: Flash update failed with err: %d\n", ret);
+               ret = -EIO;
+               spin_unlock_irq(&bnad->bna_lock);
+               goto out;
+       }
+
+       spin_unlock_irq(&bnad->bna_lock);
+       wait_for_completion(&fcomp.comp);
+       if (fcomp.comp_status != BFA_STATUS_OK) {
+               ret = -EIO;
+               pr_warn("BNA: Firmware image update to flash failed with: %d\n",
+                       fcomp.comp_status);
+       }
+out:
+       release_firmware(fw);
+       return ret;
+}
+
 static const struct ethtool_ops bnad_ethtool_ops = {
        .get_settings = bnad_get_settings,
        .set_settings = bnad_set_settings,
@@ -1088,6 +1129,7 @@ static const struct ethtool_ops bnad_ethtool_ops = {
        .get_eeprom_len = bnad_get_eeprom_len,
        .get_eeprom = bnad_get_eeprom,
        .set_eeprom = bnad_set_eeprom,
+       .flash_device = bnad_flash_device,
 };
 
 void
index 1a5b6ef..9061170 100644 (file)
@@ -886,7 +886,7 @@ static void at91ether_rx(struct net_device *dev)
        while (dlist->descriptors[lp->rxBuffIndex].addr & EMAC_DESC_DONE) {
                p_recv = dlist->recv_buf[lp->rxBuffIndex];
                pktlen = dlist->descriptors[lp->rxBuffIndex].size & 0x7ff;      /* Length of frame including FCS */
-               skb = dev_alloc_skb(pktlen + 2);
+               skb = netdev_alloc_skb(dev, pktlen + 2);
                if (skb != NULL) {
                        skb_reserve(skb, 2);
                        memcpy(skb_put(skb, pktlen), p_recv, pktlen);
index 2320068..c4834c2 100644 (file)
@@ -87,7 +87,7 @@ static void __init macb_get_hwaddr(struct macb *bp)
                memcpy(bp->dev->dev_addr, addr, sizeof(addr));
        } else {
                netdev_info(bp->dev, "invalid hw address, using random\n");
-               random_ether_addr(bp->dev->dev_addr);
+               eth_hw_addr_random(bp->dev);
        }
 }
 
@@ -397,7 +397,7 @@ static int macb_rx_frame(struct macb *bp, unsigned int first_frag,
        netdev_dbg(bp->dev, "macb_rx_frame frags %u - %u (len %u)\n",
                   first_frag, last_frag, len);
 
-       skb = dev_alloc_skb(len + RX_OFFSET);
+       skb = netdev_alloc_skb(bp->dev, len + RX_OFFSET);
        if (!skb) {
                bp->stats.rx_dropped++;
                for (frag = first_frag; ; frag = NEXT_RX(frag)) {
@@ -1308,10 +1308,8 @@ static int __init macb_probe(struct platform_device *pdev)
 
        err = -ENOMEM;
        dev = alloc_etherdev(sizeof(*bp));
-       if (!dev) {
-               dev_err(&pdev->dev, "etherdev alloc failed, aborting.\n");
+       if (!dev)
                goto err_out;
-       }
 
        SET_NETDEV_DEV(dev, &pdev->dev);
 
index 1fce186..11f667f 100644 (file)
@@ -1012,7 +1012,7 @@ static int xgmac_open(struct net_device *dev)
         * address using the following linux command:
         *      ifconfig eth0 hw ether xx:xx:xx:xx:xx:xx  */
        if (!is_valid_ether_addr(dev->dev_addr)) {
-               random_ether_addr(dev->dev_addr);
+               eth_hw_addr_random(dev);
                netdev_dbg(priv->dev, "generated random MAC address %pM\n",
                        dev->dev_addr);
        }
@@ -1482,6 +1482,7 @@ static int xgmac_set_mac_address(struct net_device *dev, void *p)
        if (!is_valid_ether_addr(addr->sa_data))
                return -EADDRNOTAVAIL;
 
+       dev->addr_assign_type &= ~NET_ADDR_RANDOM;
        memcpy(dev->dev_addr, addr->sa_data, dev->addr_len);
 
        xgmac_set_mac_addr(ioaddr, dev->dev_addr, 0);
index 857cc25..63bfdd1 100644 (file)
@@ -2499,7 +2499,7 @@ static int cxgb_set_mac_addr(struct net_device *dev, void *p)
        struct sockaddr *addr = p;
 
        if (!is_valid_ether_addr(addr->sa_data))
-               return -EINVAL;
+               return -EADDRNOTAVAIL;
 
        memcpy(dev->dev_addr, addr->sa_data, dev->addr_len);
        t3_mac_set_address(&pi->mac, LAN_MAC_IDX, dev->dev_addr);
index 8bda06e..165bfb9 100644 (file)
 #define DRV_DESC "Chelsio T3 Network Driver"
 #define DRV_NAME "cxgb3"
 /* Driver version */
-#define DRV_VERSION "1.1.4-ko"
+#define DRV_VERSION "1.1.5-ko"
 
 /* Firmware version */
 #define FW_VERSION_MAJOR 7
-#define FW_VERSION_MINOR 10
+#define FW_VERSION_MINOR 12
 #define FW_VERSION_MICRO 0
 #endif                         /* __CHELSIO_VERSION_H */
index e83d12c..1d88942 100644 (file)
@@ -2809,7 +2809,7 @@ static int cxgb_set_mac_addr(struct net_device *dev, void *p)
        struct port_info *pi = netdev_priv(dev);
 
        if (!is_valid_ether_addr(addr->sa_data))
-               return -EINVAL;
+               return -EADDRNOTAVAIL;
 
        ret = t4_change_mac(pi->adapter, pi->adapter->fn, pi->viid,
                            pi->xact_addr_filt, addr->sa_data, true, true);
index e53365a..3f580c0 100644 (file)
@@ -1130,7 +1130,7 @@ static int cxgb4vf_set_mac_addr(struct net_device *dev, void *_addr)
        struct port_info *pi = netdev_priv(dev);
 
        if (!is_valid_ether_addr(addr->sa_data))
-               return -EINVAL;
+               return -EADDRNOTAVAIL;
 
        ret = t4vf_change_mac(pi->adapter, pi->viid, pi->xact_addr_filt,
                              addr->sa_data, true);
@@ -2596,8 +2596,6 @@ static int __devinit cxgb4vf_pci_probe(struct pci_dev *pdev,
                netdev = alloc_etherdev_mq(sizeof(struct port_info),
                                           MAX_PORT_QSETS);
                if (netdev == NULL) {
-                       dev_err(&pdev->dev, "cannot allocate netdev for"
-                               " port %d\n", port_id);
                        t4vf_free_vi(adapter, viid);
                        err = -ENOMEM;
                        goto err_free_dev;
index f328da2..d5ff936 100644 (file)
@@ -911,7 +911,7 @@ dma_rx(struct net_device *dev)
        }
 
        /* Malloc up new buffer. */
-       skb = dev_alloc_skb(length + 2);
+       skb = netdev_alloc_skb(dev, length + 2);
        if (skb == NULL) {
                if (net_debug)  /* I don't think we want to do this to a stressed system */
                        printk("%s: Memory squeeze, dropping packet.\n", dev->name);
@@ -1616,7 +1616,7 @@ net_rx(struct net_device *dev)
        }
 
        /* Malloc up new buffer. */
-       skb = dev_alloc_skb(length + 2);
+       skb = netdev_alloc_skb(dev, length + 2);
        if (skb == NULL) {
 #if 0          /* Again, this seems a cruel thing to do */
                printk(KERN_WARNING "%s: Memory squeeze, dropping packet.\n", dev->name);
index 4317af8..78c5521 100644 (file)
@@ -282,7 +282,7 @@ static int ep93xx_rx(struct net_device *dev, int processed, int budget)
                if (rstat0 & RSTAT0_CRCI)
                        length -= 4;
 
-               skb = dev_alloc_skb(length + 2);
+               skb = netdev_alloc_skb(dev, length + 2);
                if (likely(skb != NULL)) {
                        struct ep93xx_rdesc *rxd = &ep->descs->rdesc[entry];
                        skb_reserve(skb, 2);
@@ -859,7 +859,7 @@ static int ep93xx_eth_probe(struct platform_device *pdev)
        ep->mdc_divisor = 40;   /* Max HCLK 100 MHz, min MDIO clk 2.5 MHz.  */
 
        if (is_zero_ether_addr(dev->dev_addr))
-               random_ether_addr(dev->dev_addr);
+               eth_hw_addr_random(dev);
 
        err = register_netdev(dev);
        if (err) {
index 83781f3..932fdcc 100644 (file)
@@ -591,11 +591,15 @@ static void set_multicast_list(struct net_device *dev)
 
 static int set_mac_address(struct net_device *dev, void *addr)
 {
+       struct sockaddr *saddr = addr;
        int i;
-       printk("%s: Setting MAC address to ", dev->name);
-       for (i = 0; i < 6; i++)
-               printk(" %2.2x", dev->dev_addr[i] = ((unsigned char *)addr)[i]);
-       printk(".\n");
+
+       if (!is_valid_ether_addr(saddr->sa_data))
+               return -EADDRNOTAVAIL;
+
+       memcpy(dev->dev_addr, saddr->sa_data, ETH_ALEN);
+       printk("%s: Setting MAC address to %pM\n", dev->name, dev->dev_addr);
+
        /* set the Ethernet address */
        for (i=0; i < ETH_ALEN/2; i++)
                writereg(dev, PP_IA+i*2, dev->dev_addr[i*2] | (dev->dev_addr[i*2+1] << 8));
index c52295c..cf1fb4b 100644 (file)
 
 #define DRV_NAME               "enic"
 #define DRV_DESCRIPTION                "Cisco VIC Ethernet NIC Driver"
-#define DRV_VERSION            "2.1.1.31"
+#define DRV_VERSION            "2.1.1.38"
 #define DRV_COPYRIGHT          "Copyright 2008-2011 Cisco Systems, Inc"
 
 #define ENIC_BARS_MAX          6
 
 #define ENIC_WQ_MAX            1
-#define ENIC_RQ_MAX            1
+#define ENIC_RQ_MAX            8
 #define ENIC_CQ_MAX            (ENIC_WQ_MAX + ENIC_RQ_MAX)
 #define ENIC_INTR_MAX          (ENIC_CQ_MAX + 2)
 
index 0e4edd3..9080ed6 100644 (file)
@@ -865,6 +865,7 @@ static int enic_set_mac_addr(struct net_device *netdev, char *addr)
        }
 
        memcpy(netdev->dev_addr, addr, netdev->addr_len);
+       netdev->addr_assign_type &= ~NET_ADDR_RANDOM;
 
        return 0;
 }
@@ -1069,8 +1070,17 @@ static int enic_set_vf_mac(struct net_device *netdev, int vf, u8 *mac)
                return err;
 
        if (is_valid_ether_addr(mac)) {
-               memcpy(pp->vf_mac, mac, ETH_ALEN);
-               return 0;
+               if (vf == PORT_SELF_VF) {
+                       memcpy(pp->vf_mac, mac, ETH_ALEN);
+                       return 0;
+               } else {
+                       /*
+                        * For sriov vf's set the mac in hw
+                        */
+                       ENIC_DEVCMD_PROXY_BY_INDEX(vf, err, enic,
+                               vnic_dev_set_mac_addr, mac);
+                       return enic_dev_status_to_errno(err);
+               }
        } else
                return -EINVAL;
 }
@@ -1114,12 +1124,23 @@ static int enic_set_vf_port(struct net_device *netdev, int vf,
                        nla_data(port[IFLA_PORT_HOST_UUID]), PORT_UUID_MAX);
        }
 
-       /* Special case handling: mac came from IFLA_VF_MAC */
-       if (!is_zero_ether_addr(prev_pp.vf_mac))
-               memcpy(pp->mac_addr, prev_pp.vf_mac, ETH_ALEN);
+       if (vf == PORT_SELF_VF) {
+               /* Special case handling: mac came from IFLA_VF_MAC */
+               if (!is_zero_ether_addr(prev_pp.vf_mac))
+                       memcpy(pp->mac_addr, prev_pp.vf_mac, ETH_ALEN);
 
-       if (vf == PORT_SELF_VF && is_zero_ether_addr(netdev->dev_addr))
-               random_ether_addr(netdev->dev_addr);
+               if (is_zero_ether_addr(netdev->dev_addr))
+                       eth_hw_addr_random(netdev);
+       } else {
+               /* SR-IOV VF: get mac from adapter */
+               ENIC_DEVCMD_PROXY_BY_INDEX(vf, err, enic,
+                       vnic_dev_get_mac_addr, pp->mac_addr);
+               if (err) {
+                       netdev_err(netdev, "Error getting mac for vf %d\n", vf);
+                       memcpy(pp, &prev_pp, sizeof(*pp));
+                       return enic_dev_status_to_errno(err);
+               }
+       }
 
        err = enic_process_set_pp_request(enic, vf, &prev_pp, &restore_pp);
        if (err) {
@@ -1147,7 +1168,8 @@ static int enic_set_vf_port(struct net_device *netdev, int vf,
                }
        }
 
-       memset(pp->vf_mac, 0, ETH_ALEN);
+       if (vf == PORT_SELF_VF)
+               memset(pp->vf_mac, 0, ETH_ALEN);
 
        return err;
 }
@@ -2280,10 +2302,8 @@ static int __devinit enic_probe(struct pci_dev *pdev,
         */
 
        netdev = alloc_etherdev(sizeof(struct enic));
-       if (!netdev) {
-               pr_err("Etherdev alloc failed, aborting\n");
+       if (!netdev)
                return -ENOMEM;
-       }
 
        pci_set_drvdata(pdev, netdev);
 
@@ -2388,7 +2408,6 @@ static int __devinit enic_probe(struct pci_dev *pdev,
        /* Allocate structure for port profiles */
        enic->pp = kcalloc(num_pps, sizeof(*enic->pp), GFP_KERNEL);
        if (!enic->pp) {
-               pr_err("port profile alloc failed, aborting\n");
                err = -ENOMEM;
                goto err_out_disable_sriov_pp;
        }
@@ -2433,7 +2452,7 @@ static int __devinit enic_probe(struct pci_dev *pdev,
         * called later by an upper layer.
         */
 
-       if (!enic_is_dynamic(enic) && !enic_is_sriov_vf(enic)) {
+       if (!enic_is_dynamic(enic)) {
                err = vnic_dev_init(enic->vdev, 0);
                if (err) {
                        dev_err(dev, "vNIC dev init failed, aborting\n");
@@ -2466,11 +2485,6 @@ static int __devinit enic_probe(struct pci_dev *pdev,
        enic->port_mtu = enic->config.mtu;
        (void)enic_change_mtu(netdev, enic->port_mtu);
 
-#ifdef CONFIG_PCI_IOV
-       if (enic_is_sriov_vf(enic) && is_zero_ether_addr(enic->mac_addr))
-               random_ether_addr(enic->mac_addr);
-#endif
-
        err = enic_set_mac_addr(netdev, enic->mac_addr);
        if (err) {
                dev_err(dev, "Invalid MAC address, aborting\n");
index c347b62..dafea1e 100644 (file)
@@ -207,7 +207,7 @@ static int enic_pp_disassociate(struct enic *enic, int vf,
        if (!is_zero_ether_addr(pp->mac_addr))
                ENIC_DEVCMD_PROXY_BY_INDEX(vf, err, enic, vnic_dev_del_addr,
                        pp->mac_addr);
-       else if (!is_zero_ether_addr(netdev->dev_addr))
+       else if (vf == PORT_SELF_VF && !is_zero_ether_addr(netdev->dev_addr))
                ENIC_DEVCMD_PROXY_BY_INDEX(vf, err, enic, vnic_dev_del_addr,
                        netdev->dev_addr);
 
@@ -294,7 +294,7 @@ static int enic_pp_associate(struct enic *enic, int vf,
        if (!is_zero_ether_addr(pp->mac_addr))
                ENIC_DEVCMD_PROXY_BY_INDEX(vf, err, enic, vnic_dev_add_addr,
                        pp->mac_addr);
-       else if (!is_zero_ether_addr(netdev->dev_addr))
+       else if (vf == PORT_SELF_VF && !is_zero_ether_addr(netdev->dev_addr))
                ENIC_DEVCMD_PROXY_BY_INDEX(vf, err, enic, vnic_dev_add_addr,
                        netdev->dev_addr);
 
index 4a35367..31d6588 100644 (file)
@@ -44,7 +44,7 @@ int enic_get_vnic_config(struct enic *enic)
        struct vnic_enet_config *c = &enic->config;
        int err;
 
-       err = vnic_dev_mac_addr(enic->vdev, enic->mac_addr);
+       err = vnic_dev_get_mac_addr(enic->vdev, enic->mac_addr);
        if (err) {
                dev_err(enic_get_dev(enic),
                        "Error getting MAC addr, %d\n", err);
index 31e7f9b..605b222 100644 (file)
@@ -439,11 +439,12 @@ int vnic_dev_fw_info(struct vnic_dev *vdev,
                a1 = sizeof(struct vnic_devcmd_fw_info);
 
                /* only get fw_info once and cache it */
-               err = vnic_dev_cmd(vdev, CMD_MCPU_FW_INFO, &a0, &a1, wait);
-               if (err == ERR_ECMDUNKNOWN) {
+               if (vnic_dev_capable(vdev, CMD_MCPU_FW_INFO))
+                       err = vnic_dev_cmd(vdev, CMD_MCPU_FW_INFO,
+                               &a0, &a1, wait);
+               else
                        err = vnic_dev_cmd(vdev, CMD_MCPU_FW_INFO_OLD,
                                &a0, &a1, wait);
-               }
        }
 
        *fw_info = vdev->fw_info;
@@ -504,13 +505,11 @@ int vnic_dev_enable_wait(struct vnic_dev *vdev)
 {
        u64 a0 = 0, a1 = 0;
        int wait = 1000;
-       int err;
 
-       err = vnic_dev_cmd(vdev, CMD_ENABLE_WAIT, &a0, &a1, wait);
-       if (err == ERR_ECMDUNKNOWN)
+       if (vnic_dev_capable(vdev, CMD_ENABLE_WAIT))
+               return vnic_dev_cmd(vdev, CMD_ENABLE_WAIT, &a0, &a1, wait);
+       else
                return vnic_dev_cmd(vdev, CMD_ENABLE, &a0, &a1, wait);
-
-       return err;
 }
 
 int vnic_dev_disable(struct vnic_dev *vdev)
@@ -574,16 +573,15 @@ int vnic_dev_hang_reset(struct vnic_dev *vdev, int arg)
        int wait = 1000;
        int err;
 
-       err = vnic_dev_cmd(vdev, CMD_HANG_RESET, &a0, &a1, wait);
-       if (err == ERR_ECMDUNKNOWN) {
+       if (vnic_dev_capable(vdev, CMD_HANG_RESET)) {
+               return vnic_dev_cmd(vdev, CMD_HANG_RESET,
+                               &a0, &a1, wait);
+       } else {
                err = vnic_dev_soft_reset(vdev, arg);
                if (err)
                        return err;
-
                return vnic_dev_init(vdev, 0);
        }
-
-       return err;
 }
 
 int vnic_dev_hang_reset_done(struct vnic_dev *vdev, int *done)
@@ -594,11 +592,13 @@ int vnic_dev_hang_reset_done(struct vnic_dev *vdev, int *done)
 
        *done = 0;
 
-       err = vnic_dev_cmd(vdev, CMD_HANG_RESET_STATUS, &a0, &a1, wait);
-       if (err) {
-               if (err == ERR_ECMDUNKNOWN)
-                       return vnic_dev_soft_reset_done(vdev, done);
-               return err;
+       if (vnic_dev_capable(vdev, CMD_HANG_RESET_STATUS)) {
+               err = vnic_dev_cmd(vdev, CMD_HANG_RESET_STATUS,
+                               &a0, &a1, wait);
+               if (err)
+                       return err;
+       } else {
+               return vnic_dev_soft_reset_done(vdev, done);
        }
 
        *done = (a0 == 0);
@@ -613,7 +613,7 @@ int vnic_dev_hang_notify(struct vnic_dev *vdev)
        return vnic_dev_cmd(vdev, CMD_HANG_NOTIFY, &a0, &a1, wait);
 }
 
-int vnic_dev_mac_addr(struct vnic_dev *vdev, u8 *mac_addr)
+int vnic_dev_get_mac_addr(struct vnic_dev *vdev, u8 *mac_addr)
 {
        u64 a0, a1;
        int wait = 1000;
@@ -622,7 +622,7 @@ int vnic_dev_mac_addr(struct vnic_dev *vdev, u8 *mac_addr)
        for (i = 0; i < ETH_ALEN; i++)
                mac_addr[i] = 0;
 
-       err = vnic_dev_cmd(vdev, CMD_MAC_ADDR, &a0, &a1, wait);
+       err = vnic_dev_cmd(vdev, CMD_GET_MAC_ADDR, &a0, &a1, wait);
        if (err)
                return err;
 
@@ -691,13 +691,12 @@ int vnic_dev_set_ig_vlan_rewrite_mode(struct vnic_dev *vdev,
 {
        u64 a0 = ig_vlan_rewrite_mode, a1 = 0;
        int wait = 1000;
-       int err;
 
-       err = vnic_dev_cmd(vdev, CMD_IG_VLAN_REWRITE_MODE, &a0, &a1, wait);
-       if (err == ERR_ECMDUNKNOWN)
+       if (vnic_dev_capable(vdev, CMD_IG_VLAN_REWRITE_MODE))
+               return vnic_dev_cmd(vdev, CMD_IG_VLAN_REWRITE_MODE,
+                               &a0, &a1, wait);
+       else
                return 0;
-
-       return err;
 }
 
 static int vnic_dev_notify_setcmd(struct vnic_dev *vdev,
@@ -804,7 +803,7 @@ int vnic_dev_init(struct vnic_dev *vdev, int arg)
                        /* Emulate these for old CMD_INIT_v1 which
                         * didn't pass a0 so no CMD_INITF_*.
                         */
-                       vnic_dev_cmd(vdev, CMD_MAC_ADDR, &a0, &a1, wait);
+                       vnic_dev_cmd(vdev, CMD_GET_MAC_ADDR, &a0, &a1, wait);
                        vnic_dev_cmd(vdev, CMD_ADDR_ADD, &a0, &a1, wait);
                }
        }
@@ -835,7 +834,10 @@ int vnic_dev_intr_coal_timer_info(struct vnic_dev *vdev)
 
        memset(vdev->args, 0, sizeof(vdev->args));
 
-       err = _vnic_dev_cmd(vdev, CMD_INTR_COAL_CONVERT, wait);
+       if (vnic_dev_capable(vdev, CMD_INTR_COAL_CONVERT))
+               err = _vnic_dev_cmd(vdev, CMD_INTR_COAL_CONVERT, wait);
+       else
+               err = ERR_ECMDUNKNOWN;
 
        /* Use defaults when firmware doesn't support the devcmd at all or
         * supports it for only specific hardware
@@ -848,9 +850,11 @@ int vnic_dev_intr_coal_timer_info(struct vnic_dev *vdev)
                return 0;
        }
 
-       vdev->intr_coal_timer_info.mul = (u32) vdev->args[0];
-       vdev->intr_coal_timer_info.div = (u32) vdev->args[1];
-       vdev->intr_coal_timer_info.max_usec = (u32) vdev->args[2];
+       if (!err) {
+               vdev->intr_coal_timer_info.mul = (u32) vdev->args[0];
+               vdev->intr_coal_timer_info.div = (u32) vdev->args[1];
+               vdev->intr_coal_timer_info.max_usec = (u32) vdev->args[2];
+       }
 
        return err;
 }
@@ -1019,3 +1023,15 @@ int vnic_dev_deinit_done(struct vnic_dev *vdev, int *status)
 {
        return vnic_dev_cmd_status(vdev, CMD_DEINIT, status);
 }
+
+int vnic_dev_set_mac_addr(struct vnic_dev *vdev, u8 *mac_addr)
+{
+       u64 a0, a1;
+       int wait = 1000;
+       int i;
+
+       for (i = 0; i < ETH_ALEN; i++)
+               ((u8 *)&a0)[i] = mac_addr[i];
+
+       return vnic_dev_cmd(vdev, CMD_SET_MAC_ADDR, &a0, &a1, wait);
+}
index 6a138b6..f3d9b79 100644 (file)
@@ -97,7 +97,7 @@ int vnic_dev_packet_filter(struct vnic_dev *vdev, int directed, int multicast,
        int broadcast, int promisc, int allmulti);
 int vnic_dev_add_addr(struct vnic_dev *vdev, u8 *addr);
 int vnic_dev_del_addr(struct vnic_dev *vdev, u8 *addr);
-int vnic_dev_mac_addr(struct vnic_dev *vdev, u8 *mac_addr);
+int vnic_dev_get_mac_addr(struct vnic_dev *vdev, u8 *mac_addr);
 int vnic_dev_notify_set(struct vnic_dev *vdev, u16 intr);
 int vnic_dev_notify_unset(struct vnic_dev *vdev);
 int vnic_dev_link_status(struct vnic_dev *vdev);
@@ -131,5 +131,6 @@ int vnic_dev_init_prov2(struct vnic_dev *vdev, u8 *buf, u32 len);
 int vnic_dev_enable2(struct vnic_dev *vdev, int active);
 int vnic_dev_enable2_done(struct vnic_dev *vdev, int *status);
 int vnic_dev_deinit_done(struct vnic_dev *vdev, int *status);
+int vnic_dev_set_mac_addr(struct vnic_dev *vdev, u8 *mac_addr);
 
 #endif /* _VNIC_DEV_H_ */
index 8025e88..23d5552 100644 (file)
@@ -131,7 +131,7 @@ enum vnic_devcmd_cmd {
        CMD_HANG_NOTIFY         = _CMDC(_CMD_DIR_NONE, _CMD_VTYPE_ALL, 8),
 
        /* MAC address in (u48)a0 */
-       CMD_MAC_ADDR            = _CMDC(_CMD_DIR_READ,
+       CMD_GET_MAC_ADDR        = _CMDC(_CMD_DIR_READ,
                                        _CMD_VTYPE_ENET | _CMD_VTYPE_FC, 9),
 
        /* add addr from (u48)a0 */
@@ -337,6 +337,15 @@ enum vnic_devcmd_cmd {
         *      (u32)a2 = maximum timer value in usec
         */
        CMD_INTR_COAL_CONVERT = _CMDC(_CMD_DIR_READ, _CMD_VTYPE_ALL, 50),
+
+       /*
+        * cmd_set_mac_addr
+        *      set mac address
+        * in:
+        *   (u48)a0 = mac addr
+        *
+        */
+       CMD_SET_MAC_ADDR = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 55),
 };
 
 /* CMD_ENABLE2 flags */
index 34105e0..7e1488f 100644 (file)
@@ -38,10 +38,8 @@ static int vnic_rq_alloc_bufs(struct vnic_rq *rq)
 
        for (i = 0; i < blks; i++) {
                rq->bufs[i] = kzalloc(VNIC_RQ_BUF_BLK_SZ(count), GFP_ATOMIC);
-               if (!rq->bufs[i]) {
-                       pr_err("Failed to alloc rq_bufs\n");
+               if (!rq->bufs[i])
                        return -ENOMEM;
-               }
        }
 
        for (i = 0; i < blks; i++) {
index df61bd9..5e0d7a2 100644 (file)
@@ -38,10 +38,8 @@ static int vnic_wq_alloc_bufs(struct vnic_wq *wq)
 
        for (i = 0; i < blks; i++) {
                wq->bufs[i] = kzalloc(VNIC_WQ_BUF_BLK_SZ(count), GFP_ATOMIC);
-               if (!wq->bufs[i]) {
-                       pr_err("Failed to alloc wq_bufs\n");
+               if (!wq->bufs[i])
                        return -ENOMEM;
-               }
        }
 
        for (i = 0; i < blks; i++) {
index f801754..36499d5 100644 (file)
@@ -1028,7 +1028,7 @@ dm9000_rx(struct net_device *dev)
 
                /* Move data from DM9000 */
                if (GoodPacket &&
-                   ((skb = dev_alloc_skb(RxLen + 4)) != NULL)) {
+                   ((skb = netdev_alloc_skb(dev, RxLen + 4)) != NULL)) {
                        skb_reserve(skb, 2);
                        rdptr = (u8 *) skb_put(skb, RxLen - 4);
 
@@ -1373,10 +1373,8 @@ dm9000_probe(struct platform_device *pdev)
 
        /* Init network device */
        ndev = alloc_etherdev(sizeof(struct board_info));
-       if (!ndev) {
-               dev_err(&pdev->dev, "could not allocate device.\n");
+       if (!ndev)
                return -ENOMEM;
-       }
 
        SET_NETDEV_DEV(ndev, &pdev->dev);
 
@@ -1587,7 +1585,7 @@ dm9000_probe(struct platform_device *pdev)
                dev_warn(db->dev, "%s: Invalid ethernet MAC address. Please "
                         "set using ifconfig\n", ndev->name);
 
-               random_ether_addr(ndev->dev_addr);
+               eth_hw_addr_random(ndev);
                mac_src = "random";
        }
 
index f9df5e4..1879f84 100644 (file)
@@ -986,8 +986,10 @@ static int ewrk3_rx(struct net_device *dev)
                                                dev->stats.rx_fifo_errors++;
                                } else {
                                        struct sk_buff *skb;
+                                       skb = netdev_alloc_skb(dev,
+                                                       pkt_len + 2);
 
-                                       if ((skb = dev_alloc_skb(pkt_len + 2)) != NULL) {
+                                       if (skb != NULL) {
                                                unsigned char *p;
                                                skb_reserve(skb, 2);    /* Align to 16 bytes */
                                                p = skb_put(skb, pkt_len);
index 25b8dee..3698582 100644 (file)
@@ -1,5 +1,5 @@
 /*
-       drivers/net/tulip/21142.c
+       drivers/net/ethernet/dec/tulip/21142.c
 
        Copyright 2000,2001  The Linux Kernel Team
        Written/copyright 1994-2001 by Donald Becker.
index 1eb46a0..68f1c39 100644 (file)
@@ -439,7 +439,7 @@ static void de_rx (struct de_private *de)
                          rx_tail, status, len, copying_skb);
 
                buflen = copying_skb ? (len + RX_OFFSET) : de->rx_buf_sz;
-               copy_skb = dev_alloc_skb (buflen);
+               copy_skb = netdev_alloc_skb(de->dev, buflen);
                if (unlikely(!copy_skb)) {
                        de->net_stats.rx_dropped++;
                        drop = 1;
@@ -1283,12 +1283,10 @@ static int de_refill_rx (struct de_private *de)
        for (i = 0; i < DE_RX_RING_SIZE; i++) {
                struct sk_buff *skb;
 
-               skb = dev_alloc_skb(de->rx_buf_sz);
+               skb = netdev_alloc_skb(de->dev, de->rx_buf_sz);
                if (!skb)
                        goto err_out;
 
-               skb->dev = de->dev;
-
                de->rx_skb[i].mapping = pci_map_single(de->pdev,
                        skb->data, de->rx_buf_sz, PCI_DMA_FROMDEVICE);
                de->rx_skb[i].skb = skb;
index 4d71f5a..18b106c 100644 (file)
@@ -3598,7 +3598,7 @@ de4x5_alloc_rx_buff(struct net_device *dev, int index, int len)
     struct sk_buff *ret;
     u_long i=0, tmp;
 
-    p = dev_alloc_skb(IEEE802_3_SZ + DE4X5_ALIGN + 2);
+    p = netdev_alloc_skb(dev, IEEE802_3_SZ + DE4X5_ALIGN + 2);
     if (!p) return NULL;
 
     tmp = virt_to_bus(p->data);
@@ -3618,7 +3618,7 @@ de4x5_alloc_rx_buff(struct net_device *dev, int index, int len)
 #else
     if (lp->state != OPEN) return (struct sk_buff *)1; /* Fake out the open */
 
-    p = dev_alloc_skb(len + 2);
+    p = netdev_alloc_skb(dev, len + 2);
     if (!p) return NULL;
 
     skb_reserve(p, 2);                                /* Align */
@@ -5234,11 +5234,7 @@ de4x5_dbg_open(struct net_device *dev)
 
     if (de4x5_debug & DEBUG_OPEN) {
        printk("%s: de4x5 opening with irq %d\n",dev->name,dev->irq);
-       printk("\tphysical address: ");
-       for (i=0;i<6;i++) {
-           printk("%2.2x:",(short)dev->dev_addr[i]);
-       }
-       printk("\n");
+       printk("\tphysical address: %pM\n", dev->dev_addr);
        printk("Descriptor head addresses:\n");
        printk("\t0x%8.8lx  0x%8.8lx\n",(u_long)lp->rx_ring,(u_long)lp->tx_ring);
        printk("Descriptor addresses:\nRX: ");
index 51f7542..1eccf49 100644 (file)
@@ -325,8 +325,8 @@ static irqreturn_t dmfe_interrupt(int , void *);
 #ifdef CONFIG_NET_POLL_CONTROLLER
 static void poll_dmfe (struct net_device *dev);
 #endif
-static void dmfe_descriptor_init(struct dmfe_board_info *, unsigned long);
-static void allocate_rx_buffer(struct dmfe_board_info *);
+static void dmfe_descriptor_init(struct net_device *, unsigned long);
+static void allocate_rx_buffer(struct net_device *);
 static void update_cr6(u32, unsigned long);
 static void send_filter_frame(struct DEVICE *);
 static void dm9132_id_table(struct DEVICE *);
@@ -649,7 +649,7 @@ static void dmfe_init_dm910x(struct DEVICE *dev)
                db->op_mode = db->media_mode;   /* Force Mode */
 
        /* Initialize Transmit/Receive decriptor and CR3/4 */
-       dmfe_descriptor_init(db, ioaddr);
+       dmfe_descriptor_init(dev, ioaddr);
 
        /* Init CR6 to program DM910x operation */
        update_cr6(db->cr6_data, ioaddr);
@@ -828,7 +828,7 @@ static irqreturn_t dmfe_interrupt(int irq, void *dev_id)
 
        /* reallocate rx descriptor buffer */
        if (db->rx_avail_cnt<RX_DESC_CNT)
-               allocate_rx_buffer(db);
+               allocate_rx_buffer(dev);
 
        /* Free the transmitted descriptor */
        if ( db->cr5_data & 0x01)
@@ -1008,7 +1008,7 @@ static void dmfe_rx_packet(struct DEVICE *dev, struct dmfe_board_info * db)
                                        /* Good packet, send to upper layer */
                                        /* Shorst packet used new SKB */
                                        if ((rxlen < RX_COPY_SIZE) &&
-                                               ((newskb = dev_alloc_skb(rxlen + 2))
+                                               ((newskb = netdev_alloc_skb(dev, rxlen + 2))
                                                != NULL)) {
 
                                                skb = newskb;
@@ -1364,8 +1364,9 @@ static void dmfe_reuse_skb(struct dmfe_board_info *db, struct sk_buff * skb)
  *     Using Chain structure, and allocate Tx/Rx buffer
  */
 
-static void dmfe_descriptor_init(struct dmfe_board_info *db, unsigned long ioaddr)
+static void dmfe_descriptor_init(struct net_device *dev, unsigned long ioaddr)
 {
+       struct dmfe_board_info *db = netdev_priv(dev);
        struct tx_desc *tmp_tx;
        struct rx_desc *tmp_rx;
        unsigned char *tmp_buf;
@@ -1421,7 +1422,7 @@ static void dmfe_descriptor_init(struct dmfe_board_info *db, unsigned long ioadd
        tmp_rx->next_rx_desc = db->first_rx_desc;
 
        /* pre-allocate Rx buffer */
-       allocate_rx_buffer(db);
+       allocate_rx_buffer(dev);
 }
 
 
@@ -1551,15 +1552,16 @@ static void send_filter_frame(struct DEVICE *dev)
  *     As possible as allocate maxiumn Rx buffer
  */
 
-static void allocate_rx_buffer(struct dmfe_board_info *db)
+static void allocate_rx_buffer(struct net_device *dev)
 {
+       struct dmfe_board_info *db = netdev_priv(dev);
        struct rx_desc *rxptr;
        struct sk_buff *skb;
 
        rxptr = db->rx_insert_ptr;
 
        while(db->rx_avail_cnt < RX_DESC_CNT) {
-               if ( ( skb = dev_alloc_skb(RX_ALLOC_SIZE) ) == NULL )
+               if ( ( skb = netdev_alloc_skb(dev, RX_ALLOC_SIZE) ) == NULL )
                        break;
                rxptr->rx_skb_ptr = skb; /* FIXME (?) */
                rxptr->rdes2 = cpu_to_le32( pci_map_single(db->pdev, skb->data,
index 14d5b61..ed7d1dc 100644 (file)
@@ -1,5 +1,5 @@
 /*
-       drivers/net/tulip/eeprom.c
+       drivers/net/ethernet/dec/tulip/eeprom.c
 
        Copyright 2000,2001  The Linux Kernel Team
        Written/copyright 1994-2001 by Donald Becker.
index 4fb8c8c..28a5e42 100644 (file)
@@ -1,5 +1,5 @@
 /*
-       drivers/net/tulip/interrupt.c
+       drivers/net/ethernet/dec/tulip/interrupt.c
 
        Copyright 2000,2001  The Linux Kernel Team
        Written/copyright 1994-2001 by Donald Becker.
@@ -69,7 +69,8 @@ int tulip_refill_rx(struct net_device *dev)
                        struct sk_buff *skb;
                        dma_addr_t mapping;
 
-                       skb = tp->rx_buffers[entry].skb = dev_alloc_skb(PKT_BUF_SZ);
+                       skb = tp->rx_buffers[entry].skb =
+                               netdev_alloc_skb(dev, PKT_BUF_SZ);
                        if (skb == NULL)
                                break;
 
@@ -77,7 +78,6 @@ int tulip_refill_rx(struct net_device *dev)
                                                 PCI_DMA_FROMDEVICE);
                        tp->rx_buffers[entry].mapping = mapping;
 
-                       skb->dev = dev;                 /* Mark as being used by this device. */
                        tp->rx_ring[entry].buffer1 = cpu_to_le32(mapping);
                        refilled++;
                }
@@ -202,7 +202,7 @@ int tulip_poll(struct napi_struct *napi, int budget)
                                /* Check if the packet is long enough to accept without copying
                                   to a minimally-sized skbuff. */
                                if (pkt_len < tulip_rx_copybreak &&
-                                   (skb = dev_alloc_skb(pkt_len + 2)) != NULL) {
+                                   (skb = netdev_alloc_skb(dev, pkt_len + 2)) != NULL) {
                                        skb_reserve(skb, 2);    /* 16 byte align the IP header */
                                        pci_dma_sync_single_for_cpu(tp->pdev,
                                                                   tp->rx_buffers[entry].mapping,
@@ -428,7 +428,7 @@ static int tulip_rx(struct net_device *dev)
                        /* Check if the packet is long enough to accept without copying
                           to a minimally-sized skbuff. */
                        if (pkt_len < tulip_rx_copybreak &&
-                           (skb = dev_alloc_skb(pkt_len + 2)) != NULL) {
+                           (skb = netdev_alloc_skb(dev, pkt_len + 2)) != NULL) {
                                skb_reserve(skb, 2);    /* 16 byte align the IP header */
                                pci_dma_sync_single_for_cpu(tp->pdev,
                                                            tp->rx_buffers[entry].mapping,
index beeb17b..ae937c6 100644 (file)
@@ -1,5 +1,5 @@
 /*
-       drivers/net/tulip/media.c
+       drivers/net/ethernet/dec/tulip/media.c
 
        Copyright 2000,2001  The Linux Kernel Team
        Written/copyright 1994-2001 by Donald Becker.
index 9c16e4a..5364563 100644 (file)
@@ -1,5 +1,5 @@
 /*
-       drivers/net/tulip/pnic.c
+       drivers/net/ethernet/dec/tulip/pnic.c
 
        Copyright 2000,2001  The Linux Kernel Team
        Written/copyright 1994-2001 by Donald Becker.
index 04a7e47..5895fc4 100644 (file)
@@ -1,5 +1,5 @@
 /*
-       drivers/net/tulip/pnic2.c
+       drivers/net/ethernet/dec/tulip/pnic2.c
 
        Copyright 2000,2001  The Linux Kernel Team
        Written/copyright 1994-2001 by Donald Becker.
index 19078d2..768379b 100644 (file)
@@ -1,5 +1,5 @@
 /*
-       drivers/net/tulip/timer.c
+       drivers/net/ethernet/dec/tulip/timer.c
 
        Copyright 2000,2001  The Linux Kernel Team
        Written/copyright 1994-2001 by Donald Becker.
index fb3887c..38431a1 100644 (file)
@@ -1,5 +1,5 @@
 /*
-       drivers/net/tulip/tulip.h
+       drivers/net/ethernet/dec/tulip/tulip.h
 
        Copyright 2000,2001  The Linux Kernel Team
        Written/copyright 1994-2001 by Donald Becker.
index 4eb0d76..fea3641 100644 (file)
@@ -636,16 +636,15 @@ static void tulip_init_ring(struct net_device *dev)
                dma_addr_t mapping;
 
                /* Note the receive buffer must be longword aligned.
-                  dev_alloc_skb() provides 16 byte alignment.  But do *not*
+                  netdev_alloc_skb() provides 16 byte alignment.  But do *not*
                   use skb_reserve() to align the IP header! */
-               struct sk_buff *skb = dev_alloc_skb(PKT_BUF_SZ);
+               struct sk_buff *skb = netdev_alloc_skb(dev, PKT_BUF_SZ);
                tp->rx_buffers[i].skb = skb;
                if (skb == NULL)
                        break;
                mapping = pci_map_single(tp->pdev, skb->data,
                                         PKT_BUF_SZ, PCI_DMA_FROMDEVICE);
                tp->rx_buffers[i].mapping = mapping;
-               skb->dev = dev;                 /* Mark as being used by this device. */
                tp->rx_ring[i].status = cpu_to_le32(DescOwned); /* Owned by Tulip chip */
                tp->rx_ring[i].buffer1 = cpu_to_le32(mapping);
        }
@@ -1424,10 +1423,8 @@ static int __devinit tulip_init_one (struct pci_dev *pdev,
 
        /* alloc_etherdev ensures aligned and zeroed private structures */
        dev = alloc_etherdev (sizeof (*tp));
-       if (!dev) {
-               pr_err("ether device alloc failed, aborting\n");
+       if (!dev)
                return -ENOMEM;
-       }
 
        SET_NETDEV_DEV(dev, &pdev->dev);
        if (pci_resource_len (pdev, 0) < tulip_tbl[chip_idx].io_size) {
index 48b0b65..fc4001f 100644 (file)
@@ -232,8 +232,8 @@ static irqreturn_t uli526x_interrupt(int, void *);
 #ifdef CONFIG_NET_POLL_CONTROLLER
 static void uli526x_poll(struct net_device *dev);
 #endif
-static void uli526x_descriptor_init(struct uli526x_board_info *, unsigned long);
-static void allocate_rx_buffer(struct uli526x_board_info *);
+static void uli526x_descriptor_init(struct net_device *, unsigned long);
+static void allocate_rx_buffer(struct net_device *);
 static void update_cr6(u32, unsigned long);
 static void send_filter_frame(struct net_device *, int);
 static u16 phy_read(unsigned long, u8, u8, u32);
@@ -549,7 +549,7 @@ static void uli526x_init(struct net_device *dev)
                db->op_mode = db->media_mode;   /* Force Mode */
 
        /* Initialize Transmit/Receive decriptor and CR3/4 */
-       uli526x_descriptor_init(db, ioaddr);
+       uli526x_descriptor_init(dev, ioaddr);
 
        /* Init CR6 to program M526X operation */
        update_cr6(db->cr6_data, ioaddr);
@@ -711,7 +711,7 @@ static irqreturn_t uli526x_interrupt(int irq, void *dev_id)
 
        /* reallocate rx descriptor buffer */
        if (db->rx_avail_cnt<RX_DESC_CNT)
-               allocate_rx_buffer(db);
+               allocate_rx_buffer(dev);
 
        /* Free the transmitted descriptor */
        if ( db->cr5_data & 0x01)
@@ -844,7 +844,7 @@ static void uli526x_rx_packet(struct net_device *dev, struct uli526x_board_info
                                /* Good packet, send to upper layer */
                                /* Shorst packet used new SKB */
                                if ((rxlen < RX_COPY_SIZE) &&
-                                   (((new_skb = dev_alloc_skb(rxlen + 2)) != NULL))) {
+                                   (((new_skb = netdev_alloc_skb(dev, rxlen + 2)) != NULL))) {
                                        skb = new_skb;
                                        /* size less than COPY_SIZE, allocate a rxlen SKB */
                                        skb_reserve(skb, 2); /* 16byte align */
@@ -1289,8 +1289,9 @@ static void uli526x_reuse_skb(struct uli526x_board_info *db, struct sk_buff * sk
  *     Using Chain structure, and allocate Tx/Rx buffer
  */
 
-static void uli526x_descriptor_init(struct uli526x_board_info *db, unsigned long ioaddr)
+static void uli526x_descriptor_init(struct net_device *dev, unsigned long ioaddr)
 {
+       struct uli526x_board_info *db = netdev_priv(dev);
        struct tx_desc *tmp_tx;
        struct rx_desc *tmp_rx;
        unsigned char *tmp_buf;
@@ -1343,7 +1344,7 @@ static void uli526x_descriptor_init(struct uli526x_board_info *db, unsigned long
        tmp_rx->next_rx_desc = db->first_rx_desc;
 
        /* pre-allocate Rx buffer */
-       allocate_rx_buffer(db);
+       allocate_rx_buffer(dev);
 }
 
 
@@ -1433,15 +1434,17 @@ static void send_filter_frame(struct net_device *dev, int mc_cnt)
  *     As possible as allocate maxiumn Rx buffer
  */
 
-static void allocate_rx_buffer(struct uli526x_board_info *db)
+static void allocate_rx_buffer(struct net_device *dev)
 {
+       struct uli526x_board_info *db = netdev_priv(dev);
        struct rx_desc *rxptr;
        struct sk_buff *skb;
 
        rxptr = db->rx_insert_ptr;
 
        while(db->rx_avail_cnt < RX_DESC_CNT) {
-               if ( ( skb = dev_alloc_skb(RX_ALLOC_SIZE) ) == NULL )
+               skb = netdev_alloc_skb(dev, RX_ALLOC_SIZE);
+               if (skb == NULL)
                        break;
                rxptr->rx_skb_ptr = skb; /* FIXME (?) */
                rxptr->rdes2 = cpu_to_le32(pci_map_single(db->pdev,
index 52da7b2..2ac6fff 100644 (file)
@@ -815,7 +815,7 @@ static void init_rxtx_rings(struct net_device *dev)
 
        /* Fill in the Rx buffers.  Handle allocation failure gracefully. */
        for (i = 0; i < RX_RING_SIZE; i++) {
-               struct sk_buff *skb = dev_alloc_skb(np->rx_buf_sz);
+               struct sk_buff *skb = netdev_alloc_skb(dev, np->rx_buf_sz);
                np->rx_skbuff[i] = skb;
                if (skb == NULL)
                        break;
@@ -1231,7 +1231,7 @@ static int netdev_rx(struct net_device *dev)
                        /* Check if the packet is long enough to accept without copying
                           to a minimally-sized skbuff. */
                        if (pkt_len < rx_copybreak &&
-                           (skb = dev_alloc_skb(pkt_len + 2)) != NULL) {
+                           (skb = netdev_alloc_skb(dev, pkt_len + 2)) != NULL) {
                                skb_reserve(skb, 2);    /* 16 byte align the IP header */
                                pci_dma_sync_single_for_cpu(np->pci_dev,np->rx_addr[entry],
                                                            np->rx_skbuff[entry]->len,
@@ -1270,7 +1270,7 @@ static int netdev_rx(struct net_device *dev)
                struct sk_buff *skb;
                entry = np->dirty_rx % RX_RING_SIZE;
                if (np->rx_skbuff[entry] == NULL) {
-                       skb = dev_alloc_skb(np->rx_buf_sz);
+                       skb = netdev_alloc_skb(dev, np->rx_buf_sz);
                        np->rx_skbuff[entry] = skb;
                        if (skb == NULL)
                                break;                  /* Better luck next round. */
index 988b8eb..fdb329f 100644 (file)
@@ -222,10 +222,9 @@ static int __devinit xircom_probe(struct pci_dev *pdev, const struct pci_device_
           is available.
         */
        dev = alloc_etherdev(sizeof(struct xircom_private));
-       if (!dev) {
-               pr_err("%s: failed to allocate etherdev\n", __func__);
+       if (!dev)
                goto device_fail;
-       }
+
        private = netdev_priv(dev);
 
        /* Allocate the send/receive buffers */
@@ -1085,7 +1084,7 @@ investigate_read_descriptor(struct net_device *dev, struct xircom_private *card,
                        pkt_len = 1518;
                }
 
-               skb = dev_alloc_skb(pkt_len + 2);
+               skb = netdev_alloc_skb(dev, pkt_len + 2);
                if (skb == NULL) {
                        dev->stats.rx_dropped++;
                        goto out;
index c24fab1..682750c 100644 (file)
@@ -335,7 +335,7 @@ static void de600_rx_intr(struct net_device *dev)
                return;
        }
 
-       skb = dev_alloc_skb(size+2);
+       skb = netdev_alloc_skb(dev, size + 2);
        if (skb == NULL) {
                printk("%s: Couldn't allocate a sk_buff of size %d.\n", dev->name, size);
                return;
index 3b934ab..afc5aaa 100644 (file)
@@ -650,7 +650,7 @@ static int de620_rx_intr(struct net_device *dev)
                printk(KERN_WARNING "%s: Illegal packet size: %d!\n", dev->name, size);
        }
        else { /* Good packet? */
-               skb = dev_alloc_skb(size+2);
+               skb = netdev_alloc_skb(dev, size + 2);
                if (skb == NULL) { /* Yeah, but no place to put it... */
                        printk(KERN_WARNING "%s: Couldn't allocate a sk_buff of size %d.\n", dev->name, size);
                        dev->stats.rx_dropped++;
index 28a3a9b..d783f4f 100644 (file)
@@ -1020,11 +1020,11 @@ static void init_ring(struct net_device *dev)
 
        /* Fill in the Rx buffers.  Handle allocation failure gracefully. */
        for (i = 0; i < RX_RING_SIZE; i++) {
-               struct sk_buff *skb = dev_alloc_skb(np->rx_buf_sz + 2);
+               struct sk_buff *skb =
+                       netdev_alloc_skb(dev, np->rx_buf_sz + 2);
                np->rx_skbuff[i] = skb;
                if (skb == NULL)
                        break;
-               skb->dev = dev;         /* Mark as being used by this device. */
                skb_reserve(skb, 2);    /* 16 byte align the IP header. */
                np->rx_ring[i].frag[0].addr = cpu_to_le32(
                        dma_map_single(&np->pci_dev->dev, skb->data,
@@ -1358,7 +1358,7 @@ static void rx_poll(unsigned long data)
                        /* Check if the packet is long enough to accept without copying
                           to a minimally-sized skbuff. */
                        if (pkt_len < rx_copybreak &&
-                           (skb = dev_alloc_skb(pkt_len + 2)) != NULL) {
+                           (skb = netdev_alloc_skb(dev, pkt_len + 2)) != NULL) {
                                skb_reserve(skb, 2);    /* 16 byte align the IP header */
                                dma_sync_single_for_cpu(&np->pci_dev->dev,
                                                le32_to_cpu(desc->frag[0].addr),
@@ -1411,11 +1411,10 @@ static void refill_rx (struct net_device *dev)
                struct sk_buff *skb;
                entry = np->dirty_rx % RX_RING_SIZE;
                if (np->rx_skbuff[entry] == NULL) {
-                       skb = dev_alloc_skb(np->rx_buf_sz + 2);
+                       skb = netdev_alloc_skb(dev, np->rx_buf_sz + 2);
                        np->rx_skbuff[entry] = skb;
                        if (skb == NULL)
                                break;          /* Better luck next round. */
-                       skb->dev = dev;         /* Mark as being used by this device. */
                        skb_reserve(skb, 2);    /* Align IP on 16 byte boundaries */
                        np->rx_ring[entry].frag[0].addr = cpu_to_le32(
                                dma_map_single(&np->pci_dev->dev, skb->data,
@@ -1602,7 +1601,7 @@ static int sundance_set_mac_addr(struct net_device *dev, void *data)
        const struct sockaddr *addr = data;
 
        if (!is_valid_ether_addr(addr->sa_data))
-               return -EINVAL;
+               return -EADDRNOTAVAIL;
        memcpy(dev->dev_addr, addr->sa_data, ETH_ALEN);
        __set_mac_addr(dev);
 
index 925c9ba..b276469 100644 (file)
@@ -421,7 +421,7 @@ static int dnet_poll(struct napi_struct *napi, int budget)
                        printk(KERN_ERR "%s packet receive error %x\n",
                               __func__, cmd_word);
 
-               skb = dev_alloc_skb(pkt_len + 5);
+               skb = netdev_alloc_skb(dev, pkt_len + 5);
                if (skb != NULL) {
                        /* Align IP on 16 byte boundaries */
                        skb_reserve(skb, 2);
@@ -854,10 +854,8 @@ static int __devinit dnet_probe(struct platform_device *pdev)
 
        err = -ENOMEM;
        dev = alloc_etherdev(sizeof(*bp));
-       if (!dev) {
-               dev_err(&pdev->dev, "etherdev alloc failed, aborting.\n");
+       if (!dev)
                goto err_out_release_mem;
-       }
 
        /* TODO: Actually, we have some interesting features... */
        dev->features |= 0;
@@ -897,7 +895,7 @@ static int __devinit dnet_probe(struct platform_device *pdev)
 
        if (!is_valid_ether_addr(dev->dev_addr)) {
                /* choose a random ethernet address */
-               random_ether_addr(dev->dev_addr);
+               eth_hw_addr_random(dev);
                __dnet_set_hwaddr(bp);
        }
 
index cbdec25..ab24e46 100644 (file)
@@ -33,7 +33,7 @@
 
 #include "be_hw.h"
 
-#define DRV_VER                        "4.0.100u"
+#define DRV_VER                        "4.2.116u"
 #define DRV_NAME               "be2net"
 #define BE_NAME                        "ServerEngines BladeEngine2 10Gbps NIC"
 #define BE3_NAME               "ServerEngines BladeEngine3 10Gbps NIC"
@@ -74,11 +74,14 @@ static inline char *nic_name(struct pci_dev *pdev)
 
 /* Number of bytes of an RX frame that are copied to skb->data */
 #define BE_HDR_LEN             ((u16) 64)
+/* allocate extra space to allow tunneling decapsulation without head reallocation */
+#define BE_RX_SKB_ALLOC_SIZE (BE_HDR_LEN + 64)
+
 #define BE_MAX_JUMBO_FRAME_SIZE        9018
 #define BE_MIN_MTU             256
 
 #define BE_NUM_VLANS_SUPPORTED 64
-#define BE_MAX_EQD             96
+#define BE_MAX_EQD             96u
 #define        BE_MAX_TX_FRAG_COUNT    30
 
 #define EVNT_Q_LEN             1024
@@ -89,12 +92,16 @@ static inline char *nic_name(struct pci_dev *pdev)
 #define MCC_Q_LEN              128     /* total size not to exceed 8 pages */
 #define MCC_CQ_LEN             256
 
-#define MAX_RSS_QS             4       /* BE limit is 4 queues/port */
+#define BE3_MAX_RSS_QS         8
+#define BE2_MAX_RSS_QS         4
+#define MAX_RSS_QS             BE3_MAX_RSS_QS
 #define MAX_RX_QS              (MAX_RSS_QS + 1) /* RSS qs + 1 def Rx */
+
 #define MAX_TX_QS              8
-#define BE_MAX_MSIX_VECTORS    (MAX_RX_QS + 1)/* RX + TX */
+#define MAX_MSIX_VECTORS       MAX_RSS_QS
+#define BE_TX_BUDGET           256
 #define BE_NAPI_WEIGHT         64
-#define MAX_RX_POST            BE_NAPI_WEIGHT /* Frags posted at a time */
+#define MAX_RX_POST            BE_NAPI_WEIGHT /* Frags posted at a time */
 #define RX_FRAGS_REFILL_WM     (RX_Q_LEN - MAX_RX_POST)
 
 #define FW_VER_LEN             32
@@ -162,13 +169,16 @@ struct be_eq_obj {
 
        /* Adaptive interrupt coalescing (AIC) info */
        bool enable_aic;
-       u16 min_eqd;            /* in usecs */
-       u16 max_eqd;            /* in usecs */
-       u16 cur_eqd;            /* in usecs */
-       u8  eq_idx;
+       u32 min_eqd;            /* in usecs */
+       u32 max_eqd;            /* in usecs */
+       u32 eqd;                /* configured val when aic is off */
+       u32 cur_eqd;            /* in usecs */
 
+       u8 idx;                 /* array index */
+       u16 tx_budget;
        struct napi_struct napi;
-};
+       struct be_adapter *adapter;
+} ____cacheline_aligned_in_smp;
 
 struct be_mcc_obj {
        struct be_queue_info q;
@@ -194,7 +204,7 @@ struct be_tx_obj {
        /* Remember the skbs that were transmitted */
        struct sk_buff *sent_skb_list[TX_Q_LEN];
        struct be_tx_stats stats;
-};
+} ____cacheline_aligned_in_smp;
 
 /* Struct to remember the pages posted for rx frags */
 struct be_rx_page_info {
@@ -212,8 +222,6 @@ struct be_rx_stats {
        u32 rx_drops_no_skbs;   /* skb allocation errors */
        u32 rx_drops_no_frags;  /* HW has no fetched frags */
        u32 rx_post_fail;       /* page post alloc failures */
-       u32 rx_polls;           /* NAPI calls */
-       u32 rx_events;
        u32 rx_compl;
        u32 rx_mcast_pkts;
        u32 rx_compl_err;       /* completions with err set */
@@ -246,23 +254,19 @@ struct be_rx_obj {
        struct be_queue_info cq;
        struct be_rx_compl_info rxcp;
        struct be_rx_page_info page_info_tbl[RX_Q_LEN];
-       struct be_eq_obj rx_eq;
        struct be_rx_stats stats;
        u8 rss_id;
        bool rx_post_starved;   /* Zero rx frags have been posted to BE */
-       u32 cache_line_barrier[16];
-};
+} ____cacheline_aligned_in_smp;
 
 struct be_drv_stats {
        u32 be_on_die_temperature;
-       u32 tx_events;
        u32 eth_red_drops;
        u32 rx_drops_no_pbuf;
        u32 rx_drops_no_txpb;
        u32 rx_drops_no_erx_descr;
        u32 rx_drops_no_tpre_descr;
        u32 rx_drops_too_many_frags;
-       u32 rx_drops_invalid_ring;
        u32 forwarded_packets;
        u32 rx_drops_mtu;
        u32 rx_crc_errors;
@@ -273,7 +277,7 @@ struct be_drv_stats {
        u32 rx_in_range_errors;
        u32 rx_out_range_errors;
        u32 rx_frame_too_long;
-       u32 rx_address_match_errors;
+       u32 rx_address_mismatch_drops;
        u32 rx_dropped_too_small;
        u32 rx_dropped_too_short;
        u32 rx_dropped_header_too_small;
@@ -300,6 +304,7 @@ struct be_vf_cfg {
 };
 
 #define BE_FLAGS_LINK_STATUS_INIT              1
+#define BE_FLAGS_WORKER_SCHEDULED              (1 << 3)
 
 struct be_adapter {
        struct pci_dev *pdev;
@@ -318,20 +323,19 @@ struct be_adapter {
        spinlock_t mcc_lock;    /* For serializing mcc cmds to BE card */
        spinlock_t mcc_cq_lock;
 
-       struct msix_entry msix_entries[BE_MAX_MSIX_VECTORS];
        u32 num_msix_vec;
+       u32 num_evt_qs;
+       struct be_eq_obj eq_obj[MAX_MSIX_VECTORS];
+       struct msix_entry msix_entries[MAX_MSIX_VECTORS];
        bool isr_registered;
 
        /* TX Rings */
-       struct be_eq_obj tx_eq;
+       u32 num_tx_qs;
        struct be_tx_obj tx_obj[MAX_TX_QS];
-       u8 num_tx_qs;
-
-       u32 cache_line_break[8];
 
        /* Rx rings */
-       struct be_rx_obj rx_obj[MAX_RX_QS];
        u32 num_rx_qs;
+       struct be_rx_obj rx_obj[MAX_RX_QS];
        u32 big_page_size;      /* Compounded page size shared by rx wrbs */
 
        u8 eq_next_idx;
@@ -402,24 +406,34 @@ struct be_adapter {
 extern const struct ethtool_ops be_ethtool_ops;
 
 #define msix_enabled(adapter)          (adapter->num_msix_vec > 0)
-#define tx_stats(txo)                  (&txo->stats)
-#define rx_stats(rxo)                  (&rxo->stats)
+#define num_irqs(adapter)              (msix_enabled(adapter) ?        \
+                                               adapter->num_msix_vec : 1)
+#define tx_stats(txo)                  (&(txo)->stats)
+#define rx_stats(rxo)                  (&(rxo)->stats)
 
-#define BE_SET_NETDEV_OPS(netdev, ops) (netdev->netdev_ops = ops)
+/* The default RXQ is the last RXQ */
+#define default_rxo(adpt)              (&adpt->rx_obj[adpt->num_rx_qs - 1])
 
 #define for_all_rx_queues(adapter, rxo, i)                             \
        for (i = 0, rxo = &adapter->rx_obj[i]; i < adapter->num_rx_qs;  \
                i++, rxo++)
 
-/* Just skip the first default non-rss queue */
+/* Skip the default non-rss queue (last one)*/
 #define for_all_rss_queues(adapter, rxo, i)                            \
-       for (i = 0, rxo = &adapter->rx_obj[i+1]; i < (adapter->num_rx_qs - 1);\
+       for (i = 0, rxo = &adapter->rx_obj[i]; i < (adapter->num_rx_qs - 1);\
                i++, rxo++)
 
 #define for_all_tx_queues(adapter, txo, i)                             \
        for (i = 0, txo = &adapter->tx_obj[i]; i < adapter->num_tx_qs;  \
                i++, txo++)
 
+#define for_all_evt_queues(adapter, eqo, i)                            \
+       for (i = 0, eqo = &adapter->eq_obj[i]; i < adapter->num_evt_qs; \
+               i++, eqo++)
+
+#define is_mcc_eqo(eqo)                        (eqo->idx == 0)
+#define mcc_eqo(adapter)               (&adapter->eq_obj[0])
+
 #define PAGE_SHIFT_4K          12
 #define PAGE_SIZE_4K           (1 << PAGE_SHIFT_4K)
 
@@ -428,10 +442,6 @@ extern const struct ethtool_ops be_ethtool_ops;
                ((u32)((((size_t)(_address) & (PAGE_SIZE_4K - 1)) +     \
                        (size) + (PAGE_SIZE_4K - 1)) >> PAGE_SHIFT_4K))
 
-/* Byte offset into the page corresponding to given address */
-#define OFFSET_IN_PAGE(addr)                                           \
-                ((size_t)(addr) & (PAGE_SIZE_4K-1))
-
 /* Returns bit offset within a DWORD of a bitfield */
 #define AMAP_BIT_OFFSET(_struct, field)                                \
                (((size_t)&(((_struct *)0)->field))%32)
index 0fcb456..398fb5c 100644 (file)
@@ -235,10 +235,10 @@ void be_async_mcc_disable(struct be_adapter *adapter)
        adapter->mcc_obj.rearm_cq = false;
 }
 
-int be_process_mcc(struct be_adapter *adapter, int *status)
+int be_process_mcc(struct be_adapter *adapter)
 {
        struct be_mcc_compl *compl;
-       int num = 0;
+       int num = 0, status = 0;
        struct be_mcc_obj *mcc_obj = &adapter->mcc_obj;
 
        spin_lock_bh(&adapter->mcc_cq_lock);
@@ -252,32 +252,32 @@ int be_process_mcc(struct be_adapter *adapter, int *status)
                                be_async_grp5_evt_process(adapter,
                                compl->flags, compl);
                } else if (compl->flags & CQE_FLAGS_COMPLETED_MASK) {
-                               *status = be_mcc_compl_process(adapter, compl);
+                               status = be_mcc_compl_process(adapter, compl);
                                atomic_dec(&mcc_obj->q.used);
                }
                be_mcc_compl_use(compl);
                num++;
        }
 
+       if (num)
+               be_cq_notify(adapter, mcc_obj->cq.id, mcc_obj->rearm_cq, num);
+
        spin_unlock_bh(&adapter->mcc_cq_lock);
-       return num;
+       return status;
 }
 
 /* Wait till no more pending mcc requests are present */
 static int be_mcc_wait_compl(struct be_adapter *adapter)
 {
 #define mcc_timeout            120000 /* 12s timeout */
-       int i, num, status = 0;
+       int i, status = 0;
        struct be_mcc_obj *mcc_obj = &adapter->mcc_obj;
 
        for (i = 0; i < mcc_timeout; i++) {
                if (be_error(adapter))
                        return -EIO;
 
-               num = be_process_mcc(adapter, &status);
-               if (num)
-                       be_cq_notify(adapter, mcc_obj->cq.id,
-                               mcc_obj->rearm_cq, num);
+               status = be_process_mcc(adapter);
 
                if (atomic_read(&mcc_obj->q.used) == 0)
                        break;
@@ -726,9 +726,8 @@ err:
 }
 
 /* Uses Mbox */
-int be_cmd_cq_create(struct be_adapter *adapter,
-               struct be_queue_info *cq, struct be_queue_info *eq,
-               bool sol_evts, bool no_delay, int coalesce_wm)
+int be_cmd_cq_create(struct be_adapter *adapter, struct be_queue_info *cq,
+               struct be_queue_info *eq, bool no_delay, int coalesce_wm)
 {
        struct be_mcc_wrb *wrb;
        struct be_cmd_req_cq_create *req;
@@ -759,7 +758,6 @@ int be_cmd_cq_create(struct be_adapter *adapter,
                                                                ctxt, 1);
                AMAP_SET_BITS(struct amap_cq_context_lancer, eqid,
                                                                ctxt, eq->id);
-               AMAP_SET_BITS(struct amap_cq_context_lancer, armed, ctxt, 1);
        } else {
                AMAP_SET_BITS(struct amap_cq_context_be, coalescwm, ctxt,
                                                                coalesce_wm);
@@ -768,11 +766,8 @@ int be_cmd_cq_create(struct be_adapter *adapter,
                AMAP_SET_BITS(struct amap_cq_context_be, count, ctxt,
                                                __ilog2_u32(cq->len/256));
                AMAP_SET_BITS(struct amap_cq_context_be, valid, ctxt, 1);
-               AMAP_SET_BITS(struct amap_cq_context_be, solevent,
-                                                               ctxt, sol_evts);
                AMAP_SET_BITS(struct amap_cq_context_be, eventable, ctxt, 1);
                AMAP_SET_BITS(struct amap_cq_context_be, eqid, ctxt, eq->id);
-               AMAP_SET_BITS(struct amap_cq_context_be, armed, ctxt, 1);
        }
 
        be_dws_cpu_to_le(ctxt, sizeof(req->context));
@@ -973,7 +968,7 @@ err:
 /* Uses MCC */
 int be_cmd_rxq_create(struct be_adapter *adapter,
                struct be_queue_info *rxq, u16 cq_id, u16 frag_size,
-               u16 max_frame_size, u32 if_id, u32 rss, u8 *rss_id)
+               u32 if_id, u32 rss, u8 *rss_id)
 {
        struct be_mcc_wrb *wrb;
        struct be_cmd_req_eth_rx_create *req;
@@ -997,7 +992,7 @@ int be_cmd_rxq_create(struct be_adapter *adapter,
        req->num_pages = 2;
        be_cmd_page_addrs_prepare(req->pages, ARRAY_SIZE(req->pages), q_mem);
        req->interface_id = cpu_to_le32(if_id);
-       req->max_frame_size = cpu_to_le16(max_frame_size);
+       req->max_frame_size = cpu_to_le16(BE_MAX_JUMBO_FRAME_SIZE);
        req->rss_queue = cpu_to_le32(rss);
 
        status = be_mcc_notify_wait(adapter);
@@ -1257,11 +1252,13 @@ int be_cmd_link_status_query(struct be_adapter *adapter, u8 *mac_speed,
        }
        req = embedded_payload(wrb);
 
+       be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
+               OPCODE_COMMON_NTWK_LINK_STATUS_QUERY, sizeof(*req), wrb, NULL);
+
        if (adapter->generation == BE_GEN3 || lancer_chip(adapter))
                req->hdr.version = 1;
 
-       be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
-               OPCODE_COMMON_NTWK_LINK_STATUS_QUERY, sizeof(*req), wrb, NULL);
+       req->hdr.domain = dom;
 
        status = be_mcc_notify_wait(adapter);
        if (!status) {
@@ -1697,7 +1694,8 @@ int be_cmd_rss_config(struct be_adapter *adapter, u8 *rsstable, u16 table_size)
                OPCODE_ETH_RSS_CONFIG, sizeof(*req), wrb, NULL);
 
        req->if_id = cpu_to_le32(adapter->if_handle);
-       req->enable_rss = cpu_to_le16(RSS_ENABLE_TCP_IPV4 | RSS_ENABLE_IPV4);
+       req->enable_rss = cpu_to_le16(RSS_ENABLE_TCP_IPV4 | RSS_ENABLE_IPV4 |
+                                     RSS_ENABLE_TCP_IPV6 | RSS_ENABLE_IPV6);
        req->cpu_table_size_log2 = cpu_to_le16(fls(table_size) - 1);
        memcpy(req->cpu_table, rsstable, table_size);
        memcpy(req->hash, myhash, sizeof(myhash));
@@ -2298,52 +2296,81 @@ err:
 
 /* Uses synchronous MCCQ */
 int be_cmd_get_mac_from_list(struct be_adapter *adapter, u32 domain,
-                                                       u32 *pmac_id)
+                       bool *pmac_id_active, u32 *pmac_id, u8 *mac)
 {
        struct be_mcc_wrb *wrb;
        struct be_cmd_req_get_mac_list *req;
        int status;
        int mac_count;
+       struct be_dma_mem get_mac_list_cmd;
+       int i;
+
+       memset(&get_mac_list_cmd, 0, sizeof(struct be_dma_mem));
+       get_mac_list_cmd.size = sizeof(struct be_cmd_resp_get_mac_list);
+       get_mac_list_cmd.va = pci_alloc_consistent(adapter->pdev,
+                       get_mac_list_cmd.size,
+                       &get_mac_list_cmd.dma);
+
+       if (!get_mac_list_cmd.va) {
+               dev_err(&adapter->pdev->dev,
+                               "Memory allocation failure during GET_MAC_LIST\n");
+               return -ENOMEM;
+       }
 
        spin_lock_bh(&adapter->mcc_lock);
 
        wrb = wrb_from_mccq(adapter);
        if (!wrb) {
                status = -EBUSY;
-               goto err;
+               goto out;
        }
-       req = embedded_payload(wrb);
+
+       req = get_mac_list_cmd.va;
 
        be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
                                OPCODE_COMMON_GET_MAC_LIST, sizeof(*req),
-                               wrb, NULL);
+                               wrb, &get_mac_list_cmd);
 
        req->hdr.domain = domain;
+       req->mac_type = MAC_ADDRESS_TYPE_NETWORK;
+       req->perm_override = 1;
 
        status = be_mcc_notify_wait(adapter);
        if (!status) {
                struct be_cmd_resp_get_mac_list *resp =
-                                               embedded_payload(wrb);
-               int i;
-               u8 *ctxt = &resp->context[0][0];
-               status = -EIO;
-               mac_count = resp->mac_count;
-               be_dws_le_to_cpu(&resp->context, sizeof(resp->context));
+                                               get_mac_list_cmd.va;
+               mac_count = resp->true_mac_count + resp->pseudo_mac_count;
+               /* Mac list returned could contain one or more active mac_ids
+                * or one or more pseudo permanant mac addresses. If an active
+                * mac_id is present, return first active mac_id found
+                */
                for (i = 0; i < mac_count; i++) {
-                       if (!AMAP_GET_BITS(struct amap_get_mac_list_context,
-                                          act, ctxt)) {
-                               *pmac_id = AMAP_GET_BITS
-                                       (struct amap_get_mac_list_context,
-                                        macid, ctxt);
-                               status = 0;
-                               break;
+                       struct get_list_macaddr *mac_entry;
+                       u16 mac_addr_size;
+                       u32 mac_id;
+
+                       mac_entry = &resp->macaddr_list[i];
+                       mac_addr_size = le16_to_cpu(mac_entry->mac_addr_size);
+                       /* mac_id is a 32 bit value and mac_addr size
+                        * is 6 bytes
+                        */
+                       if (mac_addr_size == sizeof(u32)) {
+                               *pmac_id_active = true;
+                               mac_id = mac_entry->mac_addr_id.s_mac_id.mac_id;
+                               *pmac_id = le32_to_cpu(mac_id);
+                               goto out;
                        }
-                       ctxt += sizeof(struct amap_get_mac_list_context) / 8;
                }
+               /* If no active mac_id found, return first pseudo mac addr */
+               *pmac_id_active = false;
+               memcpy(mac, resp->macaddr_list[0].mac_addr_id.macaddr,
+                                                               ETH_ALEN);
        }
 
-err:
+out:
        spin_unlock_bh(&adapter->mcc_lock);
+       pci_free_consistent(adapter->pdev, get_mac_list_cmd.size,
+                       get_mac_list_cmd.va, get_mac_list_cmd.dma);
        return status;
 }
 
index dca8924..687c420 100644 (file)
@@ -592,8 +592,8 @@ struct be_port_rxf_stats_v0 {
        u32 rx_in_range_errors; /* dword 10*/
        u32 rx_out_range_errors;        /* dword 11*/
        u32 rx_frame_too_long;  /* dword 12*/
-       u32 rx_address_match_errors;    /* dword 13*/
-       u32 rx_vlan_mismatch;   /* dword 14*/
+       u32 rx_address_mismatch_drops;  /* dword 13*/
+       u32 rx_vlan_mismatch_drops;     /* dword 14*/
        u32 rx_dropped_too_small;       /* dword 15*/
        u32 rx_dropped_too_short;       /* dword 16*/
        u32 rx_dropped_header_too_small;        /* dword 17*/
@@ -799,8 +799,8 @@ struct lancer_pport_stats {
        u32 rx_control_frames_unknown_opcode_hi;
        u32 rx_in_range_errors;
        u32 rx_out_of_range_errors;
-       u32 rx_address_match_errors;
-       u32 rx_vlan_mismatch_errors;
+       u32 rx_address_mismatch_drops;
+       u32 rx_vlan_mismatch_drops;
        u32 rx_dropped_too_small;
        u32 rx_dropped_too_short;
        u32 rx_dropped_header_too_small;
@@ -1346,22 +1346,36 @@ struct be_cmd_resp_set_func_cap {
 
 /******************** GET/SET_MACLIST  **************************/
 #define BE_MAX_MAC                     64
-struct amap_get_mac_list_context {
-       u8 macid[31];
-       u8 act;
-} __packed;
-
 struct be_cmd_req_get_mac_list {
        struct be_cmd_req_hdr hdr;
-       u32 rsvd;
+       u8 mac_type;
+       u8 perm_override;
+       u16 iface_id;
+       u32 mac_id;
+       u32 rsvd[3];
+} __packed;
+
+struct get_list_macaddr {
+       u16 mac_addr_size;
+       union {
+               u8 macaddr[6];
+               struct {
+                       u8 rsvd[2];
+                       u32 mac_id;
+               } __packed s_mac_id;
+       } __packed mac_addr_id;
 } __packed;
 
 struct be_cmd_resp_get_mac_list {
        struct be_cmd_resp_hdr hdr;
-       u8 mac_count;
-       u8 rsvd1;
-       u16 rsvd2;
-       u8 context[sizeof(struct amap_get_mac_list_context) / 8][BE_MAX_MAC];
+       struct get_list_macaddr fd_macaddr; /* Factory default mac */
+       struct get_list_macaddr macid_macaddr; /* soft mac */
+       u8 true_mac_count;
+       u8 pseudo_mac_count;
+       u8 mac_list_size;
+       u8 rsvd;
+       /* perm override mac */
+       struct get_list_macaddr macaddr_list[BE_MAX_MAC];
 } __packed;
 
 struct be_cmd_req_set_mac_list {
@@ -1384,7 +1398,7 @@ struct be_port_rxf_stats_v1 {
        u32 rx_in_range_errors;
        u32 rx_out_range_errors;
        u32 rx_frame_too_long;
-       u32 rx_address_match_errors;
+       u32 rx_address_mismatch_drops;
        u32 rx_dropped_too_small;
        u32 rx_dropped_too_short;
        u32 rx_dropped_header_too_small;
@@ -1492,8 +1506,7 @@ extern int be_cmd_eq_create(struct be_adapter *adapter,
                        struct be_queue_info *eq, int eq_delay);
 extern int be_cmd_cq_create(struct be_adapter *adapter,
                        struct be_queue_info *cq, struct be_queue_info *eq,
-                       bool sol_evts, bool no_delay,
-                       int num_cqe_dma_coalesce);
+                       bool no_delay, int num_cqe_dma_coalesce);
 extern int be_cmd_mccq_create(struct be_adapter *adapter,
                        struct be_queue_info *mccq,
                        struct be_queue_info *cq);
@@ -1502,8 +1515,7 @@ extern int be_cmd_txq_create(struct be_adapter *adapter,
                        struct be_queue_info *cq);
 extern int be_cmd_rxq_create(struct be_adapter *adapter,
                        struct be_queue_info *rxq, u16 cq_id,
-                       u16 frag_size, u16 max_frame_size, u32 if_id,
-                       u32 rss, u8 *rss_id);
+                       u16 frag_size, u32 if_id, u32 rss, u8 *rss_id);
 extern int be_cmd_q_destroy(struct be_adapter *adapter, struct be_queue_info *q,
                        int type);
 extern int be_cmd_rxq_destroy(struct be_adapter *adapter,
@@ -1532,7 +1544,7 @@ extern int be_cmd_query_fw_cfg(struct be_adapter *adapter,
 extern int be_cmd_reset_function(struct be_adapter *adapter);
 extern int be_cmd_rss_config(struct be_adapter *adapter, u8 *rsstable,
                        u16 table_size);
-extern int be_process_mcc(struct be_adapter *adapter, int *status);
+extern int be_process_mcc(struct be_adapter *adapter);
 extern int be_cmd_set_beacon_state(struct be_adapter *adapter,
                        u8 port_num, u8 beacon, u8 status, u8 state);
 extern int be_cmd_get_beacon_state(struct be_adapter *adapter,
@@ -1575,7 +1587,7 @@ extern int be_cmd_req_native_mode(struct be_adapter *adapter);
 extern int be_cmd_get_reg_len(struct be_adapter *adapter, u32 *log_size);
 extern void be_cmd_get_regs(struct be_adapter *adapter, u32 buf_len, void *buf);
 extern int be_cmd_get_mac_from_list(struct be_adapter *adapter, u32 domain,
-                                                       u32 *pmac_id);
+                               bool *pmac_id_active, u32 *pmac_id, u8 *mac);
 extern int be_cmd_set_mac_list(struct be_adapter *adapter, u8 *mac_array,
                                                u8 mac_count, u32 domain);
 
index 802e5dd..30ce178 100644 (file)
@@ -37,20 +37,46 @@ enum {DRVSTAT_TX, DRVSTAT_RX, DRVSTAT};
                                        FIELDINFO(struct be_drv_stats, field)
 
 static const struct be_ethtool_stat et_stats[] = {
-       {DRVSTAT_INFO(tx_events)},
        {DRVSTAT_INFO(rx_crc_errors)},
        {DRVSTAT_INFO(rx_alignment_symbol_errors)},
        {DRVSTAT_INFO(rx_pause_frames)},
        {DRVSTAT_INFO(rx_control_frames)},
+       /* Received packets dropped when the Ethernet length field
+        * is not equal to the actual Ethernet data length.
+        */
        {DRVSTAT_INFO(rx_in_range_errors)},
+       /* Received packets dropped when their length field is >= 1501 bytes
+        * and <= 1535 bytes.
+        */
        {DRVSTAT_INFO(rx_out_range_errors)},
+       /* Received packets dropped when they are longer than 9216 bytes */
        {DRVSTAT_INFO(rx_frame_too_long)},
-       {DRVSTAT_INFO(rx_address_match_errors)},
+       /* Received packets dropped when they don't pass the unicast or
+        * multicast address filtering.
+        */
+       {DRVSTAT_INFO(rx_address_mismatch_drops)},
+       /* Received packets dropped when IP packet length field is less than
+        * the IP header length field.
+        */
        {DRVSTAT_INFO(rx_dropped_too_small)},
+       /* Received packets dropped when IP length field is greater than
+        * the actual packet length.
+        */
        {DRVSTAT_INFO(rx_dropped_too_short)},
+       /* Received packets dropped when the IP header length field is less
+        * than 5.
+        */
        {DRVSTAT_INFO(rx_dropped_header_too_small)},
+       /* Received packets dropped when the TCP header length field is less
+        * than 5 or the TCP header length + IP header length is more
+        * than IP packet length.
+        */
        {DRVSTAT_INFO(rx_dropped_tcp_length)},
        {DRVSTAT_INFO(rx_dropped_runt)},
+       /* Number of received packets dropped when a fifo for descriptors going
+        * into the packet demux block overflows. In normal operation, this
+        * fifo must never overflow.
+        */
        {DRVSTAT_INFO(rxpp_fifo_overflow_drop)},
        {DRVSTAT_INFO(rx_input_fifo_overflow_drop)},
        {DRVSTAT_INFO(rx_ip_checksum_errs)},
@@ -59,16 +85,35 @@ static const struct be_ethtool_stat et_stats[] = {
        {DRVSTAT_INFO(tx_pauseframes)},
        {DRVSTAT_INFO(tx_controlframes)},
        {DRVSTAT_INFO(rx_priority_pause_frames)},
+       /* Received packets dropped when an internal fifo going into
+        * main packet buffer tank (PMEM) overflows.
+        */
        {DRVSTAT_INFO(pmem_fifo_overflow_drop)},
        {DRVSTAT_INFO(jabber_events)},
+       /* Received packets dropped due to lack of available HW packet buffers
+        * used to temporarily hold the received packets.
+        */
        {DRVSTAT_INFO(rx_drops_no_pbuf)},
-       {DRVSTAT_INFO(rx_drops_no_txpb)},
+       /* Received packets dropped due to input receive buffer
+        * descriptor fifo overflowing.
+        */
        {DRVSTAT_INFO(rx_drops_no_erx_descr)},
+       /* Packets dropped because the internal FIFO to the offloaded TCP
+        * receive processing block is full. This could happen only for
+        * offloaded iSCSI or FCoE trarffic.
+        */
        {DRVSTAT_INFO(rx_drops_no_tpre_descr)},
+       /* Received packets dropped when they need more than 8
+        * receive buffers. This cannot happen as the driver configures
+        * 2048 byte receive buffers.
+        */
        {DRVSTAT_INFO(rx_drops_too_many_frags)},
-       {DRVSTAT_INFO(rx_drops_invalid_ring)},
        {DRVSTAT_INFO(forwarded_packets)},
+       /* Received packets dropped when the frame length
+        * is more than 9018 bytes
+        */
        {DRVSTAT_INFO(rx_drops_mtu)},
+       /* Number of packets dropped due to random early drop function */
        {DRVSTAT_INFO(eth_red_drops)},
        {DRVSTAT_INFO(be_on_die_temperature)}
 };
@@ -80,12 +125,17 @@ static const struct be_ethtool_stat et_stats[] = {
 static const struct be_ethtool_stat et_rx_stats[] = {
        {DRVSTAT_RX_INFO(rx_bytes)},/* If moving this member see above note */
        {DRVSTAT_RX_INFO(rx_pkts)}, /* If moving this member see above note */
-       {DRVSTAT_RX_INFO(rx_polls)},
-       {DRVSTAT_RX_INFO(rx_events)},
        {DRVSTAT_RX_INFO(rx_compl)},
        {DRVSTAT_RX_INFO(rx_mcast_pkts)},
+       /* Number of page allocation failures while posting receive buffers
+        * to HW.
+        */
        {DRVSTAT_RX_INFO(rx_post_fail)},
+       /* Recevied packets dropped due to skb allocation failure */
        {DRVSTAT_RX_INFO(rx_drops_no_skbs)},
+       /* Received packets dropped due to lack of available fetched buffers
+        * posted by the driver.
+        */
        {DRVSTAT_RX_INFO(rx_drops_no_frags)}
 };
 #define ETHTOOL_RXSTATS_NUM (ARRAY_SIZE(et_rx_stats))
@@ -97,9 +147,13 @@ static const struct be_ethtool_stat et_tx_stats[] = {
        {DRVSTAT_TX_INFO(tx_compl)}, /* If moving this member see above note */
        {DRVSTAT_TX_INFO(tx_bytes)},
        {DRVSTAT_TX_INFO(tx_pkts)},
+       /* Number of skbs queued for trasmission by the driver */
        {DRVSTAT_TX_INFO(tx_reqs)},
+       /* Number of TX work request blocks DMAed to HW */
        {DRVSTAT_TX_INFO(tx_wrbs)},
-       {DRVSTAT_TX_INFO(tx_compl)},
+       /* Number of times the TX queue was stopped due to lack
+        * of spaces in the TXQ.
+        */
        {DRVSTAT_TX_INFO(tx_stops)}
 };
 #define ETHTOOL_TXSTATS_NUM (ARRAY_SIZE(et_tx_stats))
@@ -232,86 +286,42 @@ be_get_regs(struct net_device *netdev, struct ethtool_regs *regs, void *buf)
        }
 }
 
-static int
-be_get_coalesce(struct net_device *netdev, struct ethtool_coalesce *coalesce)
+static int be_get_coalesce(struct net_device *netdev,
+                          struct ethtool_coalesce *et)
 {
        struct be_adapter *adapter = netdev_priv(netdev);
-       struct be_eq_obj *rx_eq = &adapter->rx_obj[0].rx_eq;
-       struct be_eq_obj *tx_eq = &adapter->tx_eq;
+       struct be_eq_obj *eqo = &adapter->eq_obj[0];
+
 
-       coalesce->rx_coalesce_usecs = rx_eq->cur_eqd;
-       coalesce->rx_coalesce_usecs_high = rx_eq->max_eqd;
-       coalesce->rx_coalesce_usecs_low = rx_eq->min_eqd;
+       et->rx_coalesce_usecs = eqo->cur_eqd;
+       et->rx_coalesce_usecs_high = eqo->max_eqd;
+       et->rx_coalesce_usecs_low = eqo->min_eqd;
 
-       coalesce->tx_coalesce_usecs = tx_eq->cur_eqd;
-       coalesce->tx_coalesce_usecs_high = tx_eq->max_eqd;
-       coalesce->tx_coalesce_usecs_low = tx_eq->min_eqd;
+       et->tx_coalesce_usecs = eqo->cur_eqd;
+       et->tx_coalesce_usecs_high = eqo->max_eqd;
+       et->tx_coalesce_usecs_low = eqo->min_eqd;
 
-       coalesce->use_adaptive_rx_coalesce = rx_eq->enable_aic;
-       coalesce->use_adaptive_tx_coalesce = tx_eq->enable_aic;
+       et->use_adaptive_rx_coalesce = eqo->enable_aic;
+       et->use_adaptive_tx_coalesce = eqo->enable_aic;
 
        return 0;
 }
 
-/*
- * This routine is used to set interrup coalescing delay
+/* TX attributes are ignored. Only RX attributes are considered
+ * eqd cmd is issued in the worker thread.
  */
-static int
-be_set_coalesce(struct net_device *netdev, struct ethtool_coalesce *coalesce)
+static int be_set_coalesce(struct net_device *netdev,
+                          struct ethtool_coalesce *et)
 {
        struct be_adapter *adapter = netdev_priv(netdev);
-       struct be_rx_obj *rxo;
-       struct be_eq_obj *rx_eq;
-       struct be_eq_obj *tx_eq = &adapter->tx_eq;
-       u32 rx_max, rx_min, rx_cur;
-       int status = 0, i;
-       u32 tx_cur;
-
-       if (coalesce->use_adaptive_tx_coalesce == 1)
-               return -EINVAL;
-
-       for_all_rx_queues(adapter, rxo, i) {
-               rx_eq = &rxo->rx_eq;
-
-               if (!rx_eq->enable_aic && coalesce->use_adaptive_rx_coalesce)
-                       rx_eq->cur_eqd = 0;
-               rx_eq->enable_aic = coalesce->use_adaptive_rx_coalesce;
-
-               rx_max = coalesce->rx_coalesce_usecs_high;
-               rx_min = coalesce->rx_coalesce_usecs_low;
-               rx_cur = coalesce->rx_coalesce_usecs;
-
-               if (rx_eq->enable_aic) {
-                       if (rx_max > BE_MAX_EQD)
-                               rx_max = BE_MAX_EQD;
-                       if (rx_min > rx_max)
-                               rx_min = rx_max;
-                       rx_eq->max_eqd = rx_max;
-                       rx_eq->min_eqd = rx_min;
-                       if (rx_eq->cur_eqd > rx_max)
-                               rx_eq->cur_eqd = rx_max;
-                       if (rx_eq->cur_eqd < rx_min)
-                               rx_eq->cur_eqd = rx_min;
-               } else {
-                       if (rx_cur > BE_MAX_EQD)
-                               rx_cur = BE_MAX_EQD;
-                       if (rx_eq->cur_eqd != rx_cur) {
-                               status = be_cmd_modify_eqd(adapter, rx_eq->q.id,
-                                               rx_cur);
-                               if (!status)
-                                       rx_eq->cur_eqd = rx_cur;
-                       }
-               }
-       }
-
-       tx_cur = coalesce->tx_coalesce_usecs;
-
-       if (tx_cur > BE_MAX_EQD)
-               tx_cur = BE_MAX_EQD;
-       if (tx_eq->cur_eqd != tx_cur) {
-               status = be_cmd_modify_eqd(adapter, tx_eq->q.id, tx_cur);
-               if (!status)
-                       tx_eq->cur_eqd = tx_cur;
+       struct be_eq_obj *eqo;
+       int i;
+
+       for_all_evt_queues(adapter, eqo, i) {
+               eqo->enable_aic = et->use_adaptive_rx_coalesce;
+               eqo->max_eqd = min(et->rx_coalesce_usecs_high, BE_MAX_EQD);
+               eqo->min_eqd = min(et->rx_coalesce_usecs_low, eqo->max_eqd);
+               eqo->eqd = et->rx_coalesce_usecs;
        }
 
        return 0;
index e703d64..e382278 100644 (file)
@@ -127,9 +127,11 @@ static inline bool be_is_mc(struct be_adapter *adapter) {
 static void be_queue_free(struct be_adapter *adapter, struct be_queue_info *q)
 {
        struct be_dma_mem *mem = &q->dma_mem;
-       if (mem->va)
+       if (mem->va) {
                dma_free_coherent(&adapter->pdev->dev, mem->size, mem->va,
                                  mem->dma);
+               mem->va = NULL;
+       }
 }
 
 static int be_queue_alloc(struct be_adapter *adapter, struct be_queue_info *q,
@@ -144,7 +146,7 @@ static int be_queue_alloc(struct be_adapter *adapter, struct be_queue_info *q,
        mem->va = dma_alloc_coherent(&adapter->pdev->dev, mem->size, &mem->dma,
                                     GFP_KERNEL);
        if (!mem->va)
-               return -1;
+               return -ENOMEM;
        memset(mem->va, 0, mem->size);
        return 0;
 }
@@ -286,7 +288,9 @@ static void populate_be2_stats(struct be_adapter *adapter)
        drvs->rx_input_fifo_overflow_drop = port_stats->rx_input_fifo_overflow;
        drvs->rx_dropped_header_too_small =
                port_stats->rx_dropped_header_too_small;
-       drvs->rx_address_match_errors = port_stats->rx_address_match_errors;
+       drvs->rx_address_mismatch_drops =
+                                       port_stats->rx_address_mismatch_drops +
+                                       port_stats->rx_vlan_mismatch_drops;
        drvs->rx_alignment_symbol_errors =
                port_stats->rx_alignment_symbol_errors;
 
@@ -298,9 +302,7 @@ static void populate_be2_stats(struct be_adapter *adapter)
        else
                drvs->jabber_events = rxf_stats->port0_jabber_events;
        drvs->rx_drops_no_pbuf = rxf_stats->rx_drops_no_pbuf;
-       drvs->rx_drops_no_txpb = rxf_stats->rx_drops_no_txpb;
        drvs->rx_drops_no_erx_descr = rxf_stats->rx_drops_no_erx_descr;
-       drvs->rx_drops_invalid_ring = rxf_stats->rx_drops_invalid_ring;
        drvs->forwarded_packets = rxf_stats->forwarded_packets;
        drvs->rx_drops_mtu = rxf_stats->rx_drops_mtu;
        drvs->rx_drops_no_tpre_descr = rxf_stats->rx_drops_no_tpre_descr;
@@ -337,7 +339,7 @@ static void populate_be3_stats(struct be_adapter *adapter)
                port_stats->rx_dropped_header_too_small;
        drvs->rx_input_fifo_overflow_drop =
                port_stats->rx_input_fifo_overflow_drop;
-       drvs->rx_address_match_errors = port_stats->rx_address_match_errors;
+       drvs->rx_address_mismatch_drops = port_stats->rx_address_mismatch_drops;
        drvs->rx_alignment_symbol_errors =
                port_stats->rx_alignment_symbol_errors;
        drvs->rxpp_fifo_overflow_drop = port_stats->rxpp_fifo_overflow_drop;
@@ -345,9 +347,7 @@ static void populate_be3_stats(struct be_adapter *adapter)
        drvs->tx_controlframes = port_stats->tx_controlframes;
        drvs->jabber_events = port_stats->jabber_events;
        drvs->rx_drops_no_pbuf = rxf_stats->rx_drops_no_pbuf;
-       drvs->rx_drops_no_txpb = rxf_stats->rx_drops_no_txpb;
        drvs->rx_drops_no_erx_descr = rxf_stats->rx_drops_no_erx_descr;
-       drvs->rx_drops_invalid_ring = rxf_stats->rx_drops_invalid_ring;
        drvs->forwarded_packets = rxf_stats->forwarded_packets;
        drvs->rx_drops_mtu = rxf_stats->rx_drops_mtu;
        drvs->rx_drops_no_tpre_descr = rxf_stats->rx_drops_no_tpre_descr;
@@ -380,13 +380,14 @@ static void populate_lancer_stats(struct be_adapter *adapter)
        drvs->rx_dropped_header_too_small =
                                pport_stats->rx_dropped_header_too_small;
        drvs->rx_input_fifo_overflow_drop = pport_stats->rx_fifo_overflow;
-       drvs->rx_address_match_errors = pport_stats->rx_address_match_errors;
+       drvs->rx_address_mismatch_drops =
+                                       pport_stats->rx_address_mismatch_drops +
+                                       pport_stats->rx_vlan_mismatch_drops;
        drvs->rx_alignment_symbol_errors = pport_stats->rx_symbol_errors_lo;
        drvs->rxpp_fifo_overflow_drop = pport_stats->rx_fifo_overflow;
        drvs->tx_pauseframes = pport_stats->tx_pause_frames_lo;
        drvs->tx_controlframes = pport_stats->tx_control_frames_lo;
        drvs->jabber_events = pport_stats->rx_jabbers;
-       drvs->rx_drops_invalid_ring = pport_stats->rx_drops_invalid_queue;
        drvs->forwarded_packets = pport_stats->num_forwards_lo;
        drvs->rx_drops_mtu = pport_stats->rx_drops_mtu_lo;
        drvs->rx_drops_too_many_frags =
@@ -997,18 +998,24 @@ static int be_set_vf_tx_rate(struct net_device *netdev,
        return status;
 }
 
-static void be_rx_eqd_update(struct be_adapter *adapter, struct be_rx_obj *rxo)
+static void be_eqd_update(struct be_adapter *adapter, struct be_eq_obj *eqo)
 {
-       struct be_eq_obj *rx_eq = &rxo->rx_eq;
-       struct be_rx_stats *stats = rx_stats(rxo);
+       struct be_rx_stats *stats = rx_stats(&adapter->rx_obj[eqo->idx]);
        ulong now = jiffies;
        ulong delta = now - stats->rx_jiffies;
        u64 pkts;
        unsigned int start, eqd;
 
-       if (!rx_eq->enable_aic)
+       if (!eqo->enable_aic) {
+               eqd = eqo->eqd;
+               goto modify_eqd;
+       }
+
+       if (eqo->idx >= adapter->num_rx_qs)
                return;
 
+       stats = rx_stats(&adapter->rx_obj[eqo->idx]);
+
        /* Wrapped around */
        if (time_before(now, stats->rx_jiffies)) {
                stats->rx_jiffies = now;
@@ -1027,17 +1034,16 @@ static void be_rx_eqd_update(struct be_adapter *adapter, struct be_rx_obj *rxo)
        stats->rx_pps = (unsigned long)(pkts - stats->rx_pkts_prev) / (delta / HZ);
        stats->rx_pkts_prev = pkts;
        stats->rx_jiffies = now;
-       eqd = stats->rx_pps / 110000;
-       eqd = eqd << 3;
-       if (eqd > rx_eq->max_eqd)
-               eqd = rx_eq->max_eqd;
-       if (eqd < rx_eq->min_eqd)
-               eqd = rx_eq->min_eqd;
+       eqd = (stats->rx_pps / 110000) << 3;
+       eqd = min(eqd, eqo->max_eqd);
+       eqd = max(eqd, eqo->min_eqd);
        if (eqd < 10)
                eqd = 0;
-       if (eqd != rx_eq->cur_eqd) {
-               be_cmd_modify_eqd(adapter, rx_eq->q.id, eqd);
-               rx_eq->cur_eqd = eqd;
+
+modify_eqd:
+       if (eqd != eqo->cur_eqd) {
+               be_cmd_modify_eqd(adapter, eqo->q.id, eqd);
+               eqo->cur_eqd = eqd;
        }
 }
 
@@ -1065,11 +1071,10 @@ static inline bool csum_passed(struct be_rx_compl_info *rxcp)
                                (rxcp->ip_csum || rxcp->ipv6);
 }
 
-static struct be_rx_page_info *
-get_rx_page_info(struct be_adapter *adapter,
-               struct be_rx_obj *rxo,
-               u16 frag_idx)
+static struct be_rx_page_info *get_rx_page_info(struct be_rx_obj *rxo,
+                                               u16 frag_idx)
 {
+       struct be_adapter *adapter = rxo->adapter;
        struct be_rx_page_info *rx_page_info;
        struct be_queue_info *rxq = &rxo->q;
 
@@ -1088,16 +1093,15 @@ get_rx_page_info(struct be_adapter *adapter,
 }
 
 /* Throwaway the data in the Rx completion */
-static void be_rx_compl_discard(struct be_adapter *adapter,
-               struct be_rx_obj *rxo,
-               struct be_rx_compl_info *rxcp)
+static void be_rx_compl_discard(struct be_rx_obj *rxo,
+                               struct be_rx_compl_info *rxcp)
 {
        struct be_queue_info *rxq = &rxo->q;
        struct be_rx_page_info *page_info;
        u16 i, num_rcvd = rxcp->num_rcvd;
 
        for (i = 0; i < num_rcvd; i++) {
-               page_info = get_rx_page_info(adapter, rxo, rxcp->rxq_idx);
+               page_info = get_rx_page_info(rxo, rxcp->rxq_idx);
                put_page(page_info->page);
                memset(page_info, 0, sizeof(*page_info));
                index_inc(&rxcp->rxq_idx, rxq->len);
@@ -1108,8 +1112,8 @@ static void be_rx_compl_discard(struct be_adapter *adapter,
  * skb_fill_rx_data forms a complete skb for an ether frame
  * indicated by rxcp.
  */
-static void skb_fill_rx_data(struct be_adapter *adapter, struct be_rx_obj *rxo,
-                       struct sk_buff *skb, struct be_rx_compl_info *rxcp)
+static void skb_fill_rx_data(struct be_rx_obj *rxo, struct sk_buff *skb,
+                            struct be_rx_compl_info *rxcp)
 {
        struct be_queue_info *rxq = &rxo->q;
        struct be_rx_page_info *page_info;
@@ -1117,7 +1121,7 @@ static void skb_fill_rx_data(struct be_adapter *adapter, struct be_rx_obj *rxo,
        u16 hdr_len, curr_frag_len, remaining;
        u8 *start;
 
-       page_info = get_rx_page_info(adapter, rxo, rxcp->rxq_idx);
+       page_info = get_rx_page_info(rxo, rxcp->rxq_idx);
        start = page_address(page_info->page) + page_info->page_offset;
        prefetch(start);
 
@@ -1154,7 +1158,7 @@ static void skb_fill_rx_data(struct be_adapter *adapter, struct be_rx_obj *rxo,
        index_inc(&rxcp->rxq_idx, rxq->len);
        remaining = rxcp->pkt_size - curr_frag_len;
        for (i = 1, j = 0; i < rxcp->num_rcvd; i++) {
-               page_info = get_rx_page_info(adapter, rxo, rxcp->rxq_idx);
+               page_info = get_rx_page_info(rxo, rxcp->rxq_idx);
                curr_frag_len = min(remaining, rx_frag_size);
 
                /* Coalesce all frags from the same physical page in one slot */
@@ -1182,21 +1186,21 @@ static void skb_fill_rx_data(struct be_adapter *adapter, struct be_rx_obj *rxo,
 }
 
 /* Process the RX completion indicated by rxcp when GRO is disabled */
-static void be_rx_compl_process(struct be_adapter *adapter,
-                       struct be_rx_obj *rxo,
-                       struct be_rx_compl_info *rxcp)
+static void be_rx_compl_process(struct be_rx_obj *rxo,
+                               struct be_rx_compl_info *rxcp)
 {
+       struct be_adapter *adapter = rxo->adapter;
        struct net_device *netdev = adapter->netdev;
        struct sk_buff *skb;
 
-       skb = netdev_alloc_skb_ip_align(netdev, BE_HDR_LEN);
+       skb = netdev_alloc_skb_ip_align(netdev, BE_RX_SKB_ALLOC_SIZE);
        if (unlikely(!skb)) {
                rx_stats(rxo)->rx_drops_no_skbs++;
-               be_rx_compl_discard(adapter, rxo, rxcp);
+               be_rx_compl_discard(rxo, rxcp);
                return;
        }
 
-       skb_fill_rx_data(adapter, rxo, skb, rxcp);
+       skb_fill_rx_data(rxo, skb, rxcp);
 
        if (likely((netdev->features & NETIF_F_RXCSUM) && csum_passed(rxcp)))
                skb->ip_summed = CHECKSUM_UNNECESSARY;
@@ -1204,7 +1208,7 @@ static void be_rx_compl_process(struct be_adapter *adapter,
                skb_checksum_none_assert(skb);
 
        skb->protocol = eth_type_trans(skb, netdev);
-       if (adapter->netdev->features & NETIF_F_RXHASH)
+       if (netdev->features & NETIF_F_RXHASH)
                skb->rxhash = rxcp->rss_hash;
 
 
@@ -1215,26 +1219,25 @@ static void be_rx_compl_process(struct be_adapter *adapter,
 }
 
 /* Process the RX completion indicated by rxcp when GRO is enabled */
-static void be_rx_compl_process_gro(struct be_adapter *adapter,
-               struct be_rx_obj *rxo,
-               struct be_rx_compl_info *rxcp)
+void be_rx_compl_process_gro(struct be_rx_obj *rxo, struct napi_struct *napi,
+                            struct be_rx_compl_info *rxcp)
 {
+       struct be_adapter *adapter = rxo->adapter;
        struct be_rx_page_info *page_info;
        struct sk_buff *skb = NULL;
        struct be_queue_info *rxq = &rxo->q;
-       struct be_eq_obj *eq_obj =  &rxo->rx_eq;
        u16 remaining, curr_frag_len;
        u16 i, j;
 
-       skb = napi_get_frags(&eq_obj->napi);
+       skb = napi_get_frags(napi);
        if (!skb) {
-               be_rx_compl_discard(adapter, rxo, rxcp);
+               be_rx_compl_discard(rxo, rxcp);
                return;
        }
 
        remaining = rxcp->pkt_size;
        for (i = 0, j = -1; i < rxcp->num_rcvd; i++) {
-               page_info = get_rx_page_info(adapter, rxo, rxcp->rxq_idx);
+               page_info = get_rx_page_info(rxo, rxcp->rxq_idx);
 
                curr_frag_len = min(remaining, rx_frag_size);
 
@@ -1267,12 +1270,11 @@ static void be_rx_compl_process_gro(struct be_adapter *adapter,
        if (rxcp->vlanf)
                __vlan_hwaccel_put_tag(skb, rxcp->vlan_tag);
 
-       napi_gro_frags(&eq_obj->napi);
+       napi_gro_frags(napi);
 }
 
-static void be_parse_rx_compl_v1(struct be_adapter *adapter,
-                               struct be_eth_rx_compl *compl,
-                               struct be_rx_compl_info *rxcp)
+static void be_parse_rx_compl_v1(struct be_eth_rx_compl *compl,
+                                struct be_rx_compl_info *rxcp)
 {
        rxcp->pkt_size =
                AMAP_GET_BITS(struct amap_eth_rx_compl_v1, pktsize, compl);
@@ -1303,9 +1305,8 @@ static void be_parse_rx_compl_v1(struct be_adapter *adapter,
        rxcp->port = AMAP_GET_BITS(struct amap_eth_rx_compl_v1, port, compl);
 }
 
-static void be_parse_rx_compl_v0(struct be_adapter *adapter,
-                               struct be_eth_rx_compl *compl,
-                               struct be_rx_compl_info *rxcp)
+static void be_parse_rx_compl_v0(struct be_eth_rx_compl *compl,
+                                struct be_rx_compl_info *rxcp)
 {
        rxcp->pkt_size =
                AMAP_GET_BITS(struct amap_eth_rx_compl_v0, pktsize, compl);
@@ -1351,9 +1352,9 @@ static struct be_rx_compl_info *be_rx_compl_get(struct be_rx_obj *rxo)
        be_dws_le_to_cpu(compl, sizeof(*compl));
 
        if (adapter->be3_native)
-               be_parse_rx_compl_v1(adapter, compl, rxcp);
+               be_parse_rx_compl_v1(compl, rxcp);
        else
-               be_parse_rx_compl_v0(adapter, compl, rxcp);
+               be_parse_rx_compl_v0(compl, rxcp);
 
        if (rxcp->vlanf) {
                /* vlanf could be wrongly set in some cards.
@@ -1392,7 +1393,6 @@ static inline struct page *be_alloc_pages(u32 size, gfp_t gfp)
 static void be_post_rx_frags(struct be_rx_obj *rxo, gfp_t gfp)
 {
        struct be_adapter *adapter = rxo->adapter;
-       struct be_rx_page_info *page_info_tbl = rxo->page_info_tbl;
        struct be_rx_page_info *page_info = NULL, *prev_page_info = NULL;
        struct be_queue_info *rxq = &rxo->q;
        struct page *pagep = NULL;
@@ -1434,7 +1434,7 @@ static void be_post_rx_frags(struct be_rx_obj *rxo, gfp_t gfp)
 
                prev_page_info = page_info;
                queue_head_inc(rxq);
-               page_info = &page_info_tbl[rxq->head];
+               page_info = &rxo->page_info_tbl[rxq->head];
        }
        if (pagep)
                prev_page_info->last_page_user = true;
@@ -1496,62 +1496,51 @@ static u16 be_tx_compl_process(struct be_adapter *adapter,
        return num_wrbs;
 }
 
-static inline struct be_eq_entry *event_get(struct be_eq_obj *eq_obj)
+/* Return the number of events in the event queue */
+static inline int events_get(struct be_eq_obj *eqo)
 {
-       struct be_eq_entry *eqe = queue_tail_node(&eq_obj->q);
+       struct be_eq_entry *eqe;
+       int num = 0;
 
-       if (!eqe->evt)
-               return NULL;
+       do {
+               eqe = queue_tail_node(&eqo->q);
+               if (eqe->evt == 0)
+                       break;
 
-       rmb();
-       eqe->evt = le32_to_cpu(eqe->evt);
-       queue_tail_inc(&eq_obj->q);
-       return eqe;
+               rmb();
+               eqe->evt = 0;
+               num++;
+               queue_tail_inc(&eqo->q);
+       } while (true);
+
+       return num;
 }
 
-static int event_handle(struct be_adapter *adapter,
-                       struct be_eq_obj *eq_obj,
-                       bool rearm)
+static int event_handle(struct be_eq_obj *eqo)
 {
-       struct be_eq_entry *eqe;
-       u16 num = 0;
-
-       while ((eqe = event_get(eq_obj)) != NULL) {
-               eqe->evt = 0;
-               num++;
-       }
+       bool rearm = false;
+       int num = events_get(eqo);
 
-       /* Deal with any spurious interrupts that come
-        * without events
-        */
+       /* Deal with any spurious interrupts that come without events */
        if (!num)
                rearm = true;
 
-       be_eq_notify(adapter, eq_obj->q.id, rearm, true, num);
+       be_eq_notify(eqo->adapter, eqo->q.id, rearm, true, num);
        if (num)
-               napi_schedule(&eq_obj->napi);
+               napi_schedule(&eqo->napi);
 
        return num;
 }
 
-/* Just read and notify events without processing them.
- * Used at the time of destroying event queues */
-static void be_eq_clean(struct be_adapter *adapter,
-                       struct be_eq_obj *eq_obj)
+/* Leaves the EQ is disarmed state */
+static void be_eq_clean(struct be_eq_obj *eqo)
 {
-       struct be_eq_entry *eqe;
-       u16 num = 0;
-
-       while ((eqe = event_get(eq_obj)) != NULL) {
-               eqe->evt = 0;
-               num++;
-       }
+       int num = events_get(eqo);
 
-       if (num)
-               be_eq_notify(adapter, eq_obj->q.id, false, true, num);
+       be_eq_notify(eqo->adapter, eqo->q.id, false, true, num);
 }
 
-static void be_rx_q_clean(struct be_adapter *adapter, struct be_rx_obj *rxo)
+static void be_rx_cq_clean(struct be_rx_obj *rxo)
 {
        struct be_rx_page_info *page_info;
        struct be_queue_info *rxq = &rxo->q;
@@ -1561,14 +1550,14 @@ static void be_rx_q_clean(struct be_adapter *adapter, struct be_rx_obj *rxo)
 
        /* First cleanup pending rx completions */
        while ((rxcp = be_rx_compl_get(rxo)) != NULL) {
-               be_rx_compl_discard(adapter, rxo, rxcp);
-               be_cq_notify(adapter, rx_cq->id, false, 1);
+               be_rx_compl_discard(rxo, rxcp);
+               be_cq_notify(rxo->adapter, rx_cq->id, false, 1);
        }
 
        /* Then free posted rx buffer that were not used */
        tail = (rxq->head + rxq->len - atomic_read(&rxq->used)) % rxq->len;
        for (; atomic_read(&rxq->used) > 0; index_inc(&tail, rxq->len)) {
-               page_info = get_rx_page_info(adapter, rxo, tail);
+               page_info = get_rx_page_info(rxo, tail);
                put_page(page_info->page);
                memset(page_info, 0, sizeof(*page_info));
        }
@@ -1576,54 +1565,106 @@ static void be_rx_q_clean(struct be_adapter *adapter, struct be_rx_obj *rxo)
        rxq->tail = rxq->head = 0;
 }
 
-static void be_tx_compl_clean(struct be_adapter *adapter,
-                               struct be_tx_obj *txo)
+static void be_tx_compl_clean(struct be_adapter *adapter)
 {
-       struct be_queue_info *tx_cq = &txo->cq;
-       struct be_queue_info *txq = &txo->q;
+       struct be_tx_obj *txo;
+       struct be_queue_info *txq;
        struct be_eth_tx_compl *txcp;
        u16 end_idx, cmpl = 0, timeo = 0, num_wrbs = 0;
-       struct sk_buff **sent_skbs = txo->sent_skb_list;
        struct sk_buff *sent_skb;
        bool dummy_wrb;
+       int i, pending_txqs;
 
        /* Wait for a max of 200ms for all the tx-completions to arrive. */
        do {
-               while ((txcp = be_tx_compl_get(tx_cq))) {
-                       end_idx = AMAP_GET_BITS(struct amap_eth_tx_compl,
-                                       wrb_index, txcp);
-                       num_wrbs += be_tx_compl_process(adapter, txo, end_idx);
-                       cmpl++;
-               }
-               if (cmpl) {
-                       be_cq_notify(adapter, tx_cq->id, false, cmpl);
-                       atomic_sub(num_wrbs, &txq->used);
-                       cmpl = 0;
-                       num_wrbs = 0;
+               pending_txqs = adapter->num_tx_qs;
+
+               for_all_tx_queues(adapter, txo, i) {
+                       txq = &txo->q;
+                       while ((txcp = be_tx_compl_get(&txo->cq))) {
+                               end_idx =
+                                       AMAP_GET_BITS(struct amap_eth_tx_compl,
+                                                     wrb_index, txcp);
+                               num_wrbs += be_tx_compl_process(adapter, txo,
+                                                               end_idx);
+                               cmpl++;
+                       }
+                       if (cmpl) {
+                               be_cq_notify(adapter, txo->cq.id, false, cmpl);
+                               atomic_sub(num_wrbs, &txq->used);
+                               cmpl = 0;
+                               num_wrbs = 0;
+                       }
+                       if (atomic_read(&txq->used) == 0)
+                               pending_txqs--;
                }
 
-               if (atomic_read(&txq->used) == 0 || ++timeo > 200)
+               if (pending_txqs == 0 || ++timeo > 200)
                        break;
 
                mdelay(1);
        } while (true);
 
-       if (atomic_read(&txq->used))
-               dev_err(&adapter->pdev->dev, "%d pending tx-completions\n",
-                       atomic_read(&txq->used));
+       for_all_tx_queues(adapter, txo, i) {
+               txq = &txo->q;
+               if (atomic_read(&txq->used))
+                       dev_err(&adapter->pdev->dev, "%d pending tx-compls\n",
+                               atomic_read(&txq->used));
+
+               /* free posted tx for which compls will never arrive */
+               while (atomic_read(&txq->used)) {
+                       sent_skb = txo->sent_skb_list[txq->tail];
+                       end_idx = txq->tail;
+                       num_wrbs = wrb_cnt_for_skb(adapter, sent_skb,
+                                                  &dummy_wrb);
+                       index_adv(&end_idx, num_wrbs - 1, txq->len);
+                       num_wrbs = be_tx_compl_process(adapter, txo, end_idx);
+                       atomic_sub(num_wrbs, &txq->used);
+               }
+       }
+}
 
-       /* free posted tx for which compls will never arrive */
-       while (atomic_read(&txq->used)) {
-               sent_skb = sent_skbs[txq->tail];
-               end_idx = txq->tail;
-               index_adv(&end_idx,
-                       wrb_cnt_for_skb(adapter, sent_skb, &dummy_wrb) - 1,
-                       txq->len);
-               num_wrbs = be_tx_compl_process(adapter, txo, end_idx);
-               atomic_sub(num_wrbs, &txq->used);
+static void be_evt_queues_destroy(struct be_adapter *adapter)
+{
+       struct be_eq_obj *eqo;
+       int i;
+
+       for_all_evt_queues(adapter, eqo, i) {
+               be_eq_clean(eqo);
+               if (eqo->q.created)
+                       be_cmd_q_destroy(adapter, &eqo->q, QTYPE_EQ);
+               be_queue_free(adapter, &eqo->q);
        }
 }
 
+static int be_evt_queues_create(struct be_adapter *adapter)
+{
+       struct be_queue_info *eq;
+       struct be_eq_obj *eqo;
+       int i, rc;
+
+       adapter->num_evt_qs = num_irqs(adapter);
+
+       for_all_evt_queues(adapter, eqo, i) {
+               eqo->adapter = adapter;
+               eqo->tx_budget = BE_TX_BUDGET;
+               eqo->idx = i;
+               eqo->max_eqd = BE_MAX_EQD;
+               eqo->enable_aic = true;
+
+               eq = &eqo->q;
+               rc = be_queue_alloc(adapter, eq, EVNT_Q_LEN,
+                                       sizeof(struct be_eq_entry));
+               if (rc)
+                       return rc;
+
+               rc = be_cmd_eq_create(adapter, eq, eqo->cur_eqd);
+               if (rc)
+                       return rc;
+       }
+       return 0;
+}
+
 static void be_mcc_queues_destroy(struct be_adapter *adapter)
 {
        struct be_queue_info *q;
@@ -1644,22 +1685,19 @@ static int be_mcc_queues_create(struct be_adapter *adapter)
 {
        struct be_queue_info *q, *cq;
 
-       /* Alloc MCC compl queue */
        cq = &adapter->mcc_obj.cq;
        if (be_queue_alloc(adapter, cq, MCC_CQ_LEN,
                        sizeof(struct be_mcc_compl)))
                goto err;
 
-       /* Ask BE to create MCC compl queue; share TX's eq */
-       if (be_cmd_cq_create(adapter, cq, &adapter->tx_eq.q, false, true, 0))
+       /* Use the default EQ for MCC completions */
+       if (be_cmd_cq_create(adapter, cq, &mcc_eqo(adapter)->q, true, 0))
                goto mcc_cq_free;
 
-       /* Alloc MCC queue */
        q = &adapter->mcc_obj.q;
        if (be_queue_alloc(adapter, q, MCC_Q_LEN, sizeof(struct be_mcc_wrb)))
                goto mcc_cq_destroy;
 
-       /* Ask BE to create MCC queue */
        if (be_cmd_mccq_create(adapter, q, cq))
                goto mcc_q_free;
 
@@ -1692,14 +1730,6 @@ static void be_tx_queues_destroy(struct be_adapter *adapter)
                        be_cmd_q_destroy(adapter, q, QTYPE_CQ);
                be_queue_free(adapter, q);
        }
-
-       /* Clear any residual events */
-       be_eq_clean(adapter, &adapter->tx_eq);
-
-       q = &adapter->tx_eq.q;
-       if (q->created)
-               be_cmd_q_destroy(adapter, q, QTYPE_EQ);
-       be_queue_free(adapter, q);
 }
 
 static int be_num_txqs_want(struct be_adapter *adapter)
@@ -1712,10 +1742,10 @@ static int be_num_txqs_want(struct be_adapter *adapter)
                return MAX_TX_QS;
 }
 
-/* One TX event queue is shared by all TX compl qs */
-static int be_tx_queues_create(struct be_adapter *adapter)
+static int be_tx_cqs_create(struct be_adapter *adapter)
 {
-       struct be_queue_info *eq, *q, *cq;
+       struct be_queue_info *cq, *eq;
+       int status;
        struct be_tx_obj *txo;
        u8 i;
 
@@ -1727,192 +1757,109 @@ static int be_tx_queues_create(struct be_adapter *adapter)
                rtnl_unlock();
        }
 
-       adapter->tx_eq.max_eqd = 0;
-       adapter->tx_eq.min_eqd = 0;
-       adapter->tx_eq.cur_eqd = 96;
-       adapter->tx_eq.enable_aic = false;
+       for_all_tx_queues(adapter, txo, i) {
+               cq = &txo->cq;
+               status = be_queue_alloc(adapter, cq, TX_CQ_LEN,
+                                       sizeof(struct be_eth_tx_compl));
+               if (status)
+                       return status;
 
-       eq = &adapter->tx_eq.q;
-       if (be_queue_alloc(adapter, eq, EVNT_Q_LEN,
-               sizeof(struct be_eq_entry)))
-               return -1;
+               /* If num_evt_qs is less than num_tx_qs, then more than
+                * one txq share an eq
+                */
+               eq = &adapter->eq_obj[i % adapter->num_evt_qs].q;
+               status = be_cmd_cq_create(adapter, cq, eq, false, 3);
+               if (status)
+                       return status;
+       }
+       return 0;
+}
 
-       if (be_cmd_eq_create(adapter, eq, adapter->tx_eq.cur_eqd))
-               goto err;
-       adapter->tx_eq.eq_idx = adapter->eq_next_idx++;
+static int be_tx_qs_create(struct be_adapter *adapter)
+{
+       struct be_tx_obj *txo;
+       int i, status;
 
        for_all_tx_queues(adapter, txo, i) {
-               cq = &txo->cq;
-               if (be_queue_alloc(adapter, cq, TX_CQ_LEN,
-                       sizeof(struct be_eth_tx_compl)))
-                       goto err;
-
-               if (be_cmd_cq_create(adapter, cq, eq, false, false, 3))
-                       goto err;
+               status = be_queue_alloc(adapter, &txo->q, TX_Q_LEN,
+                                       sizeof(struct be_eth_wrb));
+               if (status)
+                       return status;
 
-               q = &txo->q;
-               if (be_queue_alloc(adapter, q, TX_Q_LEN,
-                       sizeof(struct be_eth_wrb)))
-                       goto err;
+               status = be_cmd_txq_create(adapter, &txo->q, &txo->cq);
+               if (status)
+                       return status;
        }
-       return 0;
 
-err:
-       be_tx_queues_destroy(adapter);
-       return -1;
+       return 0;
 }
 
-static void be_rx_queues_destroy(struct be_adapter *adapter)
+static void be_rx_cqs_destroy(struct be_adapter *adapter)
 {
        struct be_queue_info *q;
        struct be_rx_obj *rxo;
        int i;
 
        for_all_rx_queues(adapter, rxo, i) {
-               be_queue_free(adapter, &rxo->q);
-
                q = &rxo->cq;
                if (q->created)
                        be_cmd_q_destroy(adapter, q, QTYPE_CQ);
                be_queue_free(adapter, q);
-
-               q = &rxo->rx_eq.q;
-               if (q->created)
-                       be_cmd_q_destroy(adapter, q, QTYPE_EQ);
-               be_queue_free(adapter, q);
-       }
-}
-
-static u32 be_num_rxqs_want(struct be_adapter *adapter)
-{
-       if ((adapter->function_caps & BE_FUNCTION_CAPS_RSS) &&
-            !sriov_enabled(adapter) && be_physfn(adapter)) {
-               return 1 + MAX_RSS_QS; /* one default non-RSS queue */
-       } else {
-               dev_warn(&adapter->pdev->dev,
-                       "No support for multiple RX queues\n");
-               return 1;
        }
 }
 
-static int be_rx_queues_create(struct be_adapter *adapter)
+static int be_rx_cqs_create(struct be_adapter *adapter)
 {
-       struct be_queue_info *eq, *q, *cq;
+       struct be_queue_info *eq, *cq;
        struct be_rx_obj *rxo;
        int rc, i;
 
-       adapter->num_rx_qs = min(be_num_rxqs_want(adapter),
-                               msix_enabled(adapter) ?
-                                       adapter->num_msix_vec - 1 : 1);
-       if (adapter->num_rx_qs != MAX_RX_QS)
-               dev_warn(&adapter->pdev->dev,
-                       "Can create only %d RX queues", adapter->num_rx_qs);
+       /* We'll create as many RSS rings as there are irqs.
+        * But when there's only one irq there's no use creating RSS rings
+        */
+       adapter->num_rx_qs = (num_irqs(adapter) > 1) ?
+                               num_irqs(adapter) + 1 : 1;
 
        adapter->big_page_size = (1 << get_order(rx_frag_size)) * PAGE_SIZE;
        for_all_rx_queues(adapter, rxo, i) {
                rxo->adapter = adapter;
-               rxo->rx_eq.max_eqd = BE_MAX_EQD;
-               rxo->rx_eq.enable_aic = true;
-
-               /* EQ */
-               eq = &rxo->rx_eq.q;
-               rc = be_queue_alloc(adapter, eq, EVNT_Q_LEN,
-                                       sizeof(struct be_eq_entry));
-               if (rc)
-                       goto err;
-
-               rc = be_cmd_eq_create(adapter, eq, rxo->rx_eq.cur_eqd);
-               if (rc)
-                       goto err;
-
-               rxo->rx_eq.eq_idx = adapter->eq_next_idx++;
-
-               /* CQ */
                cq = &rxo->cq;
                rc = be_queue_alloc(adapter, cq, RX_CQ_LEN,
                                sizeof(struct be_eth_rx_compl));
                if (rc)
-                       goto err;
-
-               rc = be_cmd_cq_create(adapter, cq, eq, false, false, 3);
-               if (rc)
-                       goto err;
+                       return rc;
 
-               /* Rx Q - will be created in be_open() */
-               q = &rxo->q;
-               rc = be_queue_alloc(adapter, q, RX_Q_LEN,
-                               sizeof(struct be_eth_rx_d));
+               eq = &adapter->eq_obj[i % adapter->num_evt_qs].q;
+               rc = be_cmd_cq_create(adapter, cq, eq, false, 3);
                if (rc)
-                       goto err;
-
+                       return rc;
        }
 
-       return 0;
-err:
-       be_rx_queues_destroy(adapter);
-       return -1;
-}
+       if (adapter->num_rx_qs != MAX_RX_QS)
+               dev_info(&adapter->pdev->dev,
+                       "Created only %d receive queues", adapter->num_rx_qs);
 
-static bool event_peek(struct be_eq_obj *eq_obj)
-{
-       struct be_eq_entry *eqe = queue_tail_node(&eq_obj->q);
-       if (!eqe->evt)
-               return false;
-       else
-               return true;
+       return 0;
 }
 
 static irqreturn_t be_intx(int irq, void *dev)
 {
        struct be_adapter *adapter = dev;
-       struct be_rx_obj *rxo;
-       int isr, i, tx = 0 , rx = 0;
-
-       if (lancer_chip(adapter)) {
-               if (event_peek(&adapter->tx_eq))
-                       tx = event_handle(adapter, &adapter->tx_eq, false);
-               for_all_rx_queues(adapter, rxo, i) {
-                       if (event_peek(&rxo->rx_eq))
-                               rx |= event_handle(adapter, &rxo->rx_eq, true);
-               }
-
-               if (!(tx || rx))
-                       return IRQ_NONE;
-
-       } else {
-               isr = ioread32(adapter->csr + CEV_ISR0_OFFSET +
-                       (adapter->tx_eq.q.id / 8) * CEV_ISR_SIZE);
-               if (!isr)
-                       return IRQ_NONE;
-
-               if ((1 << adapter->tx_eq.eq_idx & isr))
-                       event_handle(adapter, &adapter->tx_eq, false);
-
-               for_all_rx_queues(adapter, rxo, i) {
-                       if ((1 << rxo->rx_eq.eq_idx & isr))
-                               event_handle(adapter, &rxo->rx_eq, true);
-               }
-       }
+       int num_evts;
 
-       return IRQ_HANDLED;
-}
-
-static irqreturn_t be_msix_rx(int irq, void *dev)
-{
-       struct be_rx_obj *rxo = dev;
-       struct be_adapter *adapter = rxo->adapter;
-
-       event_handle(adapter, &rxo->rx_eq, true);
-
-       return IRQ_HANDLED;
+       /* With INTx only one EQ is used */
+       num_evts = event_handle(&adapter->eq_obj[0]);
+       if (num_evts)
+               return IRQ_HANDLED;
+       else
+               return IRQ_NONE;
 }
 
-static irqreturn_t be_msix_tx_mcc(int irq, void *dev)
+static irqreturn_t be_msix(int irq, void *dev)
 {
-       struct be_adapter *adapter = dev;
-
-       event_handle(adapter, &adapter->tx_eq, false);
+       struct be_eq_obj *eqo = dev;
 
+       event_handle(eqo);
        return IRQ_HANDLED;
 }
 
@@ -1921,16 +1868,14 @@ static inline bool do_gro(struct be_rx_compl_info *rxcp)
        return (rxcp->tcpf && !rxcp->err) ? true : false;
 }
 
-static int be_poll_rx(struct napi_struct *napi, int budget)
+static int be_process_rx(struct be_rx_obj *rxo, struct napi_struct *napi,
+                       int budget)
 {
-       struct be_eq_obj *rx_eq = container_of(napi, struct be_eq_obj, napi);
-       struct be_rx_obj *rxo = container_of(rx_eq, struct be_rx_obj, rx_eq);
        struct be_adapter *adapter = rxo->adapter;
        struct be_queue_info *rx_cq = &rxo->cq;
        struct be_rx_compl_info *rxcp;
        u32 work_done;
 
-       rx_stats(rxo)->rx_polls++;
        for (work_done = 0; work_done < budget; work_done++) {
                rxcp = be_rx_compl_get(rxo);
                if (!rxcp)
@@ -1942,7 +1887,7 @@ static int be_poll_rx(struct napi_struct *napi, int budget)
 
                /* Discard compl with partial DMA Lancer B0 */
                if (unlikely(!rxcp->pkt_size)) {
-                       be_rx_compl_discard(adapter, rxo, rxcp);
+                       be_rx_compl_discard(rxo, rxcp);
                        goto loop_continue;
                }
 
@@ -1951,94 +1896,96 @@ static int be_poll_rx(struct napi_struct *napi, int budget)
                 */
                if (unlikely(rxcp->port != adapter->port_num &&
                                !lancer_chip(adapter))) {
-                       be_rx_compl_discard(adapter, rxo, rxcp);
+                       be_rx_compl_discard(rxo, rxcp);
                        goto loop_continue;
                }
 
                if (do_gro(rxcp))
-                       be_rx_compl_process_gro(adapter, rxo, rxcp);
+                       be_rx_compl_process_gro(rxo, napi, rxcp);
                else
-                       be_rx_compl_process(adapter, rxo, rxcp);
+                       be_rx_compl_process(rxo, rxcp);
 loop_continue:
                be_rx_stats_update(rxo, rxcp);
        }
 
-       be_cq_notify(adapter, rx_cq->id, false, work_done);
+       if (work_done) {
+               be_cq_notify(adapter, rx_cq->id, true, work_done);
 
-       /* Refill the queue */
-       if (work_done && atomic_read(&rxo->q.used) < RX_FRAGS_REFILL_WM)
-               be_post_rx_frags(rxo, GFP_ATOMIC);
-
-       /* All consumed */
-       if (work_done < budget) {
-               napi_complete(napi);
-               /* Arm CQ */
-               be_cq_notify(adapter, rx_cq->id, true, 0);
+               if (atomic_read(&rxo->q.used) < RX_FRAGS_REFILL_WM)
+                       be_post_rx_frags(rxo, GFP_ATOMIC);
        }
+
        return work_done;
 }
 
-/* As TX and MCC share the same EQ check for both TX and MCC completions.
- * For TX/MCC we don't honour budget; consume everything
- */
-static int be_poll_tx_mcc(struct napi_struct *napi, int budget)
+static bool be_process_tx(struct be_adapter *adapter, struct be_tx_obj *txo,
+                         int budget, int idx)
 {
-       struct be_eq_obj *tx_eq = container_of(napi, struct be_eq_obj, napi);
-       struct be_adapter *adapter =
-               container_of(tx_eq, struct be_adapter, tx_eq);
-       struct be_mcc_obj *mcc_obj = &adapter->mcc_obj;
-       struct be_tx_obj *txo;
        struct be_eth_tx_compl *txcp;
-       int tx_compl, mcc_compl, status = 0;
-       u8 i;
-       u16 num_wrbs;
+       int num_wrbs = 0, work_done;
 
-       for_all_tx_queues(adapter, txo, i) {
-               tx_compl = 0;
-               num_wrbs = 0;
-               while ((txcp = be_tx_compl_get(&txo->cq))) {
-                       num_wrbs += be_tx_compl_process(adapter, txo,
+       for (work_done = 0; work_done < budget; work_done++) {
+               txcp = be_tx_compl_get(&txo->cq);
+               if (!txcp)
+                       break;
+               num_wrbs += be_tx_compl_process(adapter, txo,
                                AMAP_GET_BITS(struct amap_eth_tx_compl,
                                        wrb_index, txcp));
-                       tx_compl++;
-               }
-               if (tx_compl) {
-                       be_cq_notify(adapter, txo->cq.id, true, tx_compl);
+       }
 
-                       atomic_sub(num_wrbs, &txo->q.used);
+       if (work_done) {
+               be_cq_notify(adapter, txo->cq.id, true, work_done);
+               atomic_sub(num_wrbs, &txo->q.used);
 
-                       /* As Tx wrbs have been freed up, wake up netdev queue
-                        * if it was stopped due to lack of tx wrbs.  */
-                       if (__netif_subqueue_stopped(adapter->netdev, i) &&
-                               atomic_read(&txo->q.used) < txo->q.len / 2) {
-                               netif_wake_subqueue(adapter->netdev, i);
-                       }
-
-                       u64_stats_update_begin(&tx_stats(txo)->sync_compl);
-                       tx_stats(txo)->tx_compl += tx_compl;
-                       u64_stats_update_end(&tx_stats(txo)->sync_compl);
+               /* As Tx wrbs have been freed up, wake up netdev queue
+                * if it was stopped due to lack of tx wrbs.  */
+               if (__netif_subqueue_stopped(adapter->netdev, idx) &&
+                       atomic_read(&txo->q.used) < txo->q.len / 2) {
+                       netif_wake_subqueue(adapter->netdev, idx);
                }
+
+               u64_stats_update_begin(&tx_stats(txo)->sync_compl);
+               tx_stats(txo)->tx_compl += work_done;
+               u64_stats_update_end(&tx_stats(txo)->sync_compl);
        }
+       return (work_done < budget); /* Done */
+}
 
-       mcc_compl = be_process_mcc(adapter, &status);
+int be_poll(struct napi_struct *napi, int budget)
+{
+       struct be_eq_obj *eqo = container_of(napi, struct be_eq_obj, napi);
+       struct be_adapter *adapter = eqo->adapter;
+       int max_work = 0, work, i;
+       bool tx_done;
 
-       if (mcc_compl) {
-               be_cq_notify(adapter, mcc_obj->cq.id, true, mcc_compl);
+       /* Process all TXQs serviced by this EQ */
+       for (i = eqo->idx; i < adapter->num_tx_qs; i += adapter->num_evt_qs) {
+               tx_done = be_process_tx(adapter, &adapter->tx_obj[i],
+                                       eqo->tx_budget, i);
+               if (!tx_done)
+                       max_work = budget;
        }
 
-       napi_complete(napi);
+       /* This loop will iterate twice for EQ0 in which
+        * completions of the last RXQ (default one) are also processed
+        * For other EQs the loop iterates only once
+        */
+       for (i = eqo->idx; i < adapter->num_rx_qs; i += adapter->num_evt_qs) {
+               work = be_process_rx(&adapter->rx_obj[i], napi, budget);
+               max_work = max(work, max_work);
+       }
 
-       /* Arm CQ again to regenerate EQEs for Lancer in INTx mode */
-       if (lancer_chip(adapter) && !msix_enabled(adapter)) {
-               for_all_tx_queues(adapter, txo, i)
-                       be_cq_notify(adapter, txo->cq.id, true, 0);
+       if (is_mcc_eqo(eqo))
+               be_process_mcc(adapter);
 
-               be_cq_notify(adapter, mcc_obj->cq.id, true, 0);
+       if (max_work < budget) {
+               napi_complete(napi);
+               be_eq_notify(adapter, eqo->q.id, true, false, 0);
+       } else {
+               /* As we'll continue in polling mode, count and clear events */
+               be_eq_notify(adapter, eqo->q.id, false, false, events_get(eqo));
        }
-
-       be_eq_notify(adapter, tx_eq->q.id, true, false, 0);
-       adapter->drv_stats.tx_events++;
-       return 1;
+       return max_work;
 }
 
 void be_detect_dump_ue(struct be_adapter *adapter)
@@ -2113,12 +2060,24 @@ static void be_msix_disable(struct be_adapter *adapter)
        }
 }
 
+static uint be_num_rss_want(struct be_adapter *adapter)
+{
+       if ((adapter->function_caps & BE_FUNCTION_CAPS_RSS) &&
+            adapter->num_vfs == 0 && be_physfn(adapter) &&
+            !be_is_mc(adapter))
+               return (adapter->be3_native) ? BE3_MAX_RSS_QS : BE2_MAX_RSS_QS;
+       else
+               return 0;
+}
+
 static void be_msix_enable(struct be_adapter *adapter)
 {
-#define BE_MIN_MSIX_VECTORS    (1 + 1) /* Rx + Tx */
+#define BE_MIN_MSIX_VECTORS            1
        int i, status, num_vec;
 
-       num_vec = be_num_rxqs_want(adapter) + 1;
+       /* If RSS queues are not used, need a vec for default RX Q */
+       num_vec = min(be_num_rss_want(adapter), num_online_cpus());
+       num_vec = max(num_vec, BE_MIN_MSIX_VECTORS);
 
        for (i = 0; i < num_vec; i++)
                adapter->msix_entries[i].entry = i;
@@ -2186,60 +2145,31 @@ static void be_sriov_disable(struct be_adapter *adapter)
 }
 
 static inline int be_msix_vec_get(struct be_adapter *adapter,
-                                       struct be_eq_obj *eq_obj)
-{
-       return adapter->msix_entries[eq_obj->eq_idx].vector;
-}
-
-static int be_request_irq(struct be_adapter *adapter,
-               struct be_eq_obj *eq_obj,
-               void *handler, char *desc, void *context)
-{
-       struct net_device *netdev = adapter->netdev;
-       int vec;
-
-       sprintf(eq_obj->desc, "%s-%s", netdev->name, desc);
-       vec = be_msix_vec_get(adapter, eq_obj);
-       return request_irq(vec, handler, 0, eq_obj->desc, context);
-}
-
-static void be_free_irq(struct be_adapter *adapter, struct be_eq_obj *eq_obj,
-                       void *context)
+                               struct be_eq_obj *eqo)
 {
-       int vec = be_msix_vec_get(adapter, eq_obj);
-       free_irq(vec, context);
+       return adapter->msix_entries[eqo->idx].vector;
 }
 
 static int be_msix_register(struct be_adapter *adapter)
 {
-       struct be_rx_obj *rxo;
-       int status, i;
-       char qname[10];
-
-       status = be_request_irq(adapter, &adapter->tx_eq, be_msix_tx_mcc, "tx",
-                               adapter);
-       if (status)
-               goto err;
+       struct net_device *netdev = adapter->netdev;
+       struct be_eq_obj *eqo;
+       int status, i, vec;
 
-       for_all_rx_queues(adapter, rxo, i) {
-               sprintf(qname, "rxq%d", i);
-               status = be_request_irq(adapter, &rxo->rx_eq, be_msix_rx,
-                               qname, rxo);
+       for_all_evt_queues(adapter, eqo, i) {
+               sprintf(eqo->desc, "%s-q%d", netdev->name, i);
+               vec = be_msix_vec_get(adapter, eqo);
+               status = request_irq(vec, be_msix, 0, eqo->desc, eqo);
                if (status)
                        goto err_msix;
        }
 
        return 0;
-
 err_msix:
-       be_free_irq(adapter, &adapter->tx_eq, adapter);
-
-       for (i--, rxo = &adapter->rx_obj[i]; i >= 0; i--, rxo--)
-               be_free_irq(adapter, &rxo->rx_eq, rxo);
-
-err:
-       dev_warn(&adapter->pdev->dev,
-               "MSIX Request IRQ failed - err %d\n", status);
+       for (i--, eqo = &adapter->eq_obj[i]; i >= 0; i--, eqo--)
+               free_irq(be_msix_vec_get(adapter, eqo), eqo);
+       dev_warn(&adapter->pdev->dev, "MSIX Request IRQ failed - err %d\n",
+               status);
        be_msix_disable(adapter);
        return status;
 }
@@ -2275,7 +2205,7 @@ done:
 static void be_irq_unregister(struct be_adapter *adapter)
 {
        struct net_device *netdev = adapter->netdev;
-       struct be_rx_obj *rxo;
+       struct be_eq_obj *eqo;
        int i;
 
        if (!adapter->isr_registered)
@@ -2288,16 +2218,14 @@ static void be_irq_unregister(struct be_adapter *adapter)
        }
 
        /* MSIx */
-       be_free_irq(adapter, &adapter->tx_eq, adapter);
-
-       for_all_rx_queues(adapter, rxo, i)
-               be_free_irq(adapter, &rxo->rx_eq, rxo);
+       for_all_evt_queues(adapter, eqo, i)
+               free_irq(be_msix_vec_get(adapter, eqo), eqo);
 
 done:
        adapter->isr_registered = false;
 }
 
-static void be_rx_queues_clear(struct be_adapter *adapter)
+static void be_rx_qs_destroy(struct be_adapter *adapter)
 {
        struct be_queue_info *q;
        struct be_rx_obj *rxo;
@@ -2312,76 +2240,67 @@ static void be_rx_queues_clear(struct be_adapter *adapter)
                         * arrive
                         */
                        mdelay(1);
-                       be_rx_q_clean(adapter, rxo);
+                       be_rx_cq_clean(rxo);
                }
-
-               /* Clear any residual events */
-               q = &rxo->rx_eq.q;
-               if (q->created)
-                       be_eq_clean(adapter, &rxo->rx_eq);
+               be_queue_free(adapter, q);
        }
 }
 
 static int be_close(struct net_device *netdev)
 {
        struct be_adapter *adapter = netdev_priv(netdev);
-       struct be_rx_obj *rxo;
-       struct be_tx_obj *txo;
-       struct be_eq_obj *tx_eq = &adapter->tx_eq;
-       int vec, i;
+       struct be_eq_obj *eqo;
+       int i;
 
        be_async_mcc_disable(adapter);
 
        if (!lancer_chip(adapter))
                be_intr_set(adapter, false);
 
-       for_all_rx_queues(adapter, rxo, i)
-               napi_disable(&rxo->rx_eq.napi);
-
-       napi_disable(&tx_eq->napi);
-
-       if (lancer_chip(adapter)) {
-               be_cq_notify(adapter, adapter->mcc_obj.cq.id, false, 0);
-               for_all_rx_queues(adapter, rxo, i)
-                        be_cq_notify(adapter, rxo->cq.id, false, 0);
-               for_all_tx_queues(adapter, txo, i)
-                        be_cq_notify(adapter, txo->cq.id, false, 0);
+       for_all_evt_queues(adapter, eqo, i) {
+               napi_disable(&eqo->napi);
+               if (msix_enabled(adapter))
+                       synchronize_irq(be_msix_vec_get(adapter, eqo));
+               else
+                       synchronize_irq(netdev->irq);
+               be_eq_clean(eqo);
        }
 
-       if (msix_enabled(adapter)) {
-               vec = be_msix_vec_get(adapter, tx_eq);
-               synchronize_irq(vec);
-
-               for_all_rx_queues(adapter, rxo, i) {
-                       vec = be_msix_vec_get(adapter, &rxo->rx_eq);
-                       synchronize_irq(vec);
-               }
-       } else {
-               synchronize_irq(netdev->irq);
-       }
        be_irq_unregister(adapter);
 
        /* Wait for all pending tx completions to arrive so that
         * all tx skbs are freed.
         */
-       for_all_tx_queues(adapter, txo, i)
-               be_tx_compl_clean(adapter, txo);
+       be_tx_compl_clean(adapter);
 
-       be_rx_queues_clear(adapter);
+       be_rx_qs_destroy(adapter);
        return 0;
 }
 
-static int be_rx_queues_setup(struct be_adapter *adapter)
+static int be_rx_qs_create(struct be_adapter *adapter)
 {
        struct be_rx_obj *rxo;
        int rc, i, j;
        u8 rsstable[128];
 
        for_all_rx_queues(adapter, rxo, i) {
+               rc = be_queue_alloc(adapter, &rxo->q, RX_Q_LEN,
+                                   sizeof(struct be_eth_rx_d));
+               if (rc)
+                       return rc;
+       }
+
+       /* The FW would like the default RXQ to be created first */
+       rxo = default_rxo(adapter);
+       rc = be_cmd_rxq_create(adapter, &rxo->q, rxo->cq.id, rx_frag_size,
+                              adapter->if_handle, false, &rxo->rss_id);
+       if (rc)
+               return rc;
+
+       for_all_rss_queues(adapter, rxo, i) {
                rc = be_cmd_rxq_create(adapter, &rxo->q, rxo->cq.id,
-                       rx_frag_size, BE_MAX_JUMBO_FRAME_SIZE,
-                       adapter->if_handle,
-                       (i > 0) ? 1 : 0/* rss enable */, &rxo->rss_id);
+                                      rx_frag_size, adapter->if_handle,
+                                      true, &rxo->rss_id);
                if (rc)
                        return rc;
        }
@@ -2395,48 +2314,47 @@ static int be_rx_queues_setup(struct be_adapter *adapter)
                        }
                }
                rc = be_cmd_rss_config(adapter, rsstable, 128);
-
                if (rc)
                        return rc;
        }
 
        /* First time posting */
-       for_all_rx_queues(adapter, rxo, i) {
+       for_all_rx_queues(adapter, rxo, i)
                be_post_rx_frags(rxo, GFP_KERNEL);
-               napi_enable(&rxo->rx_eq.napi);
-       }
        return 0;
 }
 
 static int be_open(struct net_device *netdev)
 {
        struct be_adapter *adapter = netdev_priv(netdev);
-       struct be_eq_obj *tx_eq = &adapter->tx_eq;
+       struct be_eq_obj *eqo;
        struct be_rx_obj *rxo;
+       struct be_tx_obj *txo;
        u8 link_status;
        int status, i;
 
-       status = be_rx_queues_setup(adapter);
+       status = be_rx_qs_create(adapter);
        if (status)
                goto err;
 
-       napi_enable(&tx_eq->napi);
-
        be_irq_register(adapter);
 
        if (!lancer_chip(adapter))
                be_intr_set(adapter, true);
 
-       /* The evt queues are created in unarmed state; arm them */
-       for_all_rx_queues(adapter, rxo, i) {
-               be_eq_notify(adapter, rxo->rx_eq.q.id, true, false, 0);
+       for_all_rx_queues(adapter, rxo, i)
                be_cq_notify(adapter, rxo->cq.id, true, 0);
-       }
-       be_eq_notify(adapter, tx_eq->q.id, true, false, 0);
 
-       /* Now that interrupts are on we can process async mcc */
+       for_all_tx_queues(adapter, txo, i)
+               be_cq_notify(adapter, txo->cq.id, true, 0);
+
        be_async_mcc_enable(adapter);
 
+       for_all_evt_queues(adapter, eqo, i) {
+               napi_enable(&eqo->napi);
+               be_eq_notify(adapter, eqo->q.id, true, false, 0);
+       }
+
        status = be_cmd_link_status_query(adapter, NULL, NULL,
                                          &link_status, 0);
        if (!status)
@@ -2540,17 +2458,25 @@ static void be_vf_clear(struct be_adapter *adapter)
 
 static int be_clear(struct be_adapter *adapter)
 {
+       if (adapter->flags & BE_FLAGS_WORKER_SCHEDULED) {
+               cancel_delayed_work_sync(&adapter->work);
+               adapter->flags &= ~BE_FLAGS_WORKER_SCHEDULED;
+       }
+
        if (sriov_enabled(adapter))
                be_vf_clear(adapter);
 
        be_cmd_if_destroy(adapter, adapter->if_handle,  0);
 
        be_mcc_queues_destroy(adapter);
-       be_rx_queues_destroy(adapter);
+       be_rx_cqs_destroy(adapter);
        be_tx_queues_destroy(adapter);
+       be_evt_queues_destroy(adapter);
 
        /* tell fw we're done with firing cmds */
        be_cmd_fw_clean(adapter);
+
+       be_msix_disable(adapter);
        return 0;
 }
 
@@ -2609,19 +2535,28 @@ static void be_setup_init(struct be_adapter *adapter)
        adapter->eq_next_idx = 0;
 }
 
-static int be_configure_mac_from_list(struct be_adapter *adapter, u8 *mac)
+static int be_add_mac_from_list(struct be_adapter *adapter, u8 *mac)
 {
        u32 pmac_id;
-       int status = be_cmd_get_mac_from_list(adapter, 0, &pmac_id);
-       if (status != 0)
-               goto do_none;
-       status = be_cmd_mac_addr_query(adapter, mac,
-                       MAC_ADDRESS_TYPE_NETWORK,
-                       false, adapter->if_handle, pmac_id);
+       int status;
+       bool pmac_id_active;
+
+       status = be_cmd_get_mac_from_list(adapter, 0, &pmac_id_active,
+                                                       &pmac_id, mac);
        if (status != 0)
                goto do_none;
-       status = be_cmd_pmac_add(adapter, mac, adapter->if_handle,
-                       &adapter->pmac_id, 0);
+
+       if (pmac_id_active) {
+               status = be_cmd_mac_addr_query(adapter, mac,
+                               MAC_ADDRESS_TYPE_NETWORK,
+                               false, adapter->if_handle, pmac_id);
+
+               if (!status)
+                       adapter->pmac_id = pmac_id;
+       } else {
+               status = be_cmd_pmac_add(adapter, mac,
+                               adapter->if_handle, &adapter->pmac_id, 0);
+       }
 do_none:
        return status;
 }
@@ -2631,24 +2566,29 @@ static int be_setup(struct be_adapter *adapter)
        struct net_device *netdev = adapter->netdev;
        u32 cap_flags, en_flags;
        u32 tx_fc, rx_fc;
-       int status, i;
+       int status;
        u8 mac[ETH_ALEN];
-       struct be_tx_obj *txo;
 
        be_setup_init(adapter);
 
        be_cmd_req_native_mode(adapter);
 
-       status = be_tx_queues_create(adapter);
-       if (status != 0)
+       be_msix_enable(adapter);
+
+       status = be_evt_queues_create(adapter);
+       if (status)
                goto err;
 
-       status = be_rx_queues_create(adapter);
-       if (status != 0)
+       status = be_tx_cqs_create(adapter);
+       if (status)
+               goto err;
+
+       status = be_rx_cqs_create(adapter);
+       if (status)
                goto err;
 
        status = be_mcc_queues_create(adapter);
-       if (status != 0)
+       if (status)
                goto err;
 
        memset(mac, 0, ETH_ALEN);
@@ -2674,19 +2614,13 @@ static int be_setup(struct be_adapter *adapter)
        if (status != 0)
                goto err;
 
-        for_all_tx_queues(adapter, txo, i) {
-               status = be_cmd_txq_create(adapter, &txo->q, &txo->cq);
-               if (status)
-                       goto err;
-       }
-
         /* The VF's permanent mac queried from card is incorrect.
          * For BEx: Query the mac configued by the PF using if_handle
          * For Lancer: Get and use mac_list to obtain mac address.
          */
        if (!be_physfn(adapter)) {
                if (lancer_chip(adapter))
-                       status = be_configure_mac_from_list(adapter, mac);
+                       status = be_add_mac_from_list(adapter, mac);
                else
                        status = be_cmd_mac_addr_query(adapter, mac,
                                        MAC_ADDRESS_TYPE_NETWORK, false,
@@ -2697,6 +2631,10 @@ static int be_setup(struct be_adapter *adapter)
                }
        }
 
+       status = be_tx_qs_create(adapter);
+       if (status)
+               goto err;
+
        be_cmd_get_fw_ver(adapter, adapter->fw_ver, NULL);
 
        status = be_vid_config(adapter, false, 0);
@@ -2726,6 +2664,9 @@ static int be_setup(struct be_adapter *adapter)
                        goto err;
        }
 
+       schedule_delayed_work(&adapter->work, msecs_to_jiffies(1000));
+       adapter->flags |= BE_FLAGS_WORKER_SCHEDULED;
+
        return 0;
 err:
        be_clear(adapter);
@@ -2736,12 +2677,13 @@ err:
 static void be_netpoll(struct net_device *netdev)
 {
        struct be_adapter *adapter = netdev_priv(netdev);
-       struct be_rx_obj *rxo;
+       struct be_eq_obj *eqo;
        int i;
 
-       event_handle(adapter, &adapter->tx_eq, false);
-       for_all_rx_queues(adapter, rxo, i)
-               event_handle(adapter, &rxo->rx_eq, true);
+       for_all_evt_queues(adapter, eqo, i)
+               event_handle(eqo);
+
+       return;
 }
 #endif
 
@@ -3102,7 +3044,7 @@ static const struct net_device_ops be_netdev_ops = {
 static void be_netdev_init(struct net_device *netdev)
 {
        struct be_adapter *adapter = netdev_priv(netdev);
-       struct be_rx_obj *rxo;
+       struct be_eq_obj *eqo;
        int i;
 
        netdev->hw_features |= NETIF_F_SG | NETIF_F_TSO | NETIF_F_TSO6 |
@@ -3121,16 +3063,12 @@ static void be_netdev_init(struct net_device *netdev)
 
        netif_set_gso_max_size(netdev, 65535);
 
-       BE_SET_NETDEV_OPS(netdev, &be_netdev_ops);
+       netdev->netdev_ops = &be_netdev_ops;
 
        SET_ETHTOOL_OPS(netdev, &be_ethtool_ops);
 
-       for_all_rx_queues(adapter, rxo, i)
-               netif_napi_add(netdev, &rxo->rx_eq.napi, be_poll_rx,
-                               BE_NAPI_WEIGHT);
-
-       netif_napi_add(netdev, &adapter->tx_eq.napi, be_poll_tx_mcc,
-               BE_NAPI_WEIGHT);
+       for_all_evt_queues(adapter, eqo, i)
+               netif_napi_add(netdev, &eqo->napi, be_poll, BE_NAPI_WEIGHT);
 }
 
 static void be_unmap_pci_bars(struct be_adapter *adapter)
@@ -3289,8 +3227,6 @@ static void __devexit be_remove(struct pci_dev *pdev)
        if (!adapter)
                return;
 
-       cancel_delayed_work_sync(&adapter->work);
-
        unregister_netdev(adapter->netdev);
 
        be_clear(adapter);
@@ -3301,8 +3237,6 @@ static void __devexit be_remove(struct pci_dev *pdev)
 
        be_sriov_disable(adapter);
 
-       be_msix_disable(adapter);
-
        pci_set_drvdata(pdev, NULL);
        pci_release_regions(pdev);
        pci_disable_device(pdev);
@@ -3469,6 +3403,7 @@ static void be_worker(struct work_struct *work)
        struct be_adapter *adapter =
                container_of(work, struct be_adapter, work.work);
        struct be_rx_obj *rxo;
+       struct be_eq_obj *eqo;
        int i;
 
        if (lancer_chip(adapter))
@@ -3479,15 +3414,7 @@ static void be_worker(struct work_struct *work)
        /* when interrupts are not yet enabled, just reap any pending
        * mcc completions */
        if (!netif_running(adapter->netdev)) {
-               int mcc_compl, status = 0;
-
-               mcc_compl = be_process_mcc(adapter, &status);
-
-               if (mcc_compl) {
-                       struct be_mcc_obj *mcc_obj = &adapter->mcc_obj;
-                       be_cq_notify(adapter, mcc_obj->cq.id, false, mcc_compl);
-               }
-
+               be_process_mcc(adapter);
                goto reschedule;
        }
 
@@ -3500,14 +3427,15 @@ static void be_worker(struct work_struct *work)
        }
 
        for_all_rx_queues(adapter, rxo, i) {
-               be_rx_eqd_update(adapter, rxo);
-
                if (rxo->rx_post_starved) {
                        rxo->rx_post_starved = false;
                        be_post_rx_frags(rxo, GFP_KERNEL);
                }
        }
 
+       for_all_evt_queues(adapter, eqo, i)
+               be_eqd_update(adapter, eqo);
+
 reschedule:
        adapter->work_counter++;
        schedule_delayed_work(&adapter->work, msecs_to_jiffies(1000));
@@ -3593,6 +3521,12 @@ static int __devinit be_probe(struct pci_dev *pdev,
        if (status)
                goto ctrl_clean;
 
+       /* The INTR bit may be set in the card when probed by a kdump kernel
+        * after a crash.
+        */
+       if (!lancer_chip(adapter))
+               be_intr_set(adapter, false);
+
        status = be_stats_init(adapter);
        if (status)
                goto ctrl_clean;
@@ -3601,14 +3535,6 @@ static int __devinit be_probe(struct pci_dev *pdev,
        if (status)
                goto stats_clean;
 
-       /* The INTR bit may be set in the card when probed by a kdump kernel
-        * after a crash.
-        */
-       if (!lancer_chip(adapter))
-               be_intr_set(adapter, false);
-
-       be_msix_enable(adapter);
-
        INIT_DELAYED_WORK(&adapter->work, be_worker);
        adapter->rx_fc = adapter->tx_fc = true;
 
@@ -3621,9 +3547,9 @@ static int __devinit be_probe(struct pci_dev *pdev,
        if (status != 0)
                goto unsetup;
 
-       dev_info(&pdev->dev, "%s port %d\n", nic_name(pdev), adapter->port_num);
+       dev_info(&pdev->dev, "%s: %s port %d\n", netdev->name, nic_name(pdev),
+               adapter->port_num);
 
-       schedule_delayed_work(&adapter->work, msecs_to_jiffies(100));
        return 0;
 
 unsetup:
@@ -3653,7 +3579,6 @@ static int be_suspend(struct pci_dev *pdev, pm_message_t state)
        struct be_adapter *adapter = pci_get_drvdata(pdev);
        struct net_device *netdev =  adapter->netdev;
 
-       cancel_delayed_work_sync(&adapter->work);
        if (adapter->wol)
                be_setup_wol(adapter, true);
 
@@ -3665,7 +3590,6 @@ static int be_suspend(struct pci_dev *pdev, pm_message_t state)
        }
        be_clear(adapter);
 
-       be_msix_disable(adapter);
        pci_save_state(pdev);
        pci_disable_device(pdev);
        pci_set_power_state(pdev, pci_choose_state(pdev, state));
@@ -3687,7 +3611,6 @@ static int be_resume(struct pci_dev *pdev)
        pci_set_power_state(pdev, 0);
        pci_restore_state(pdev);
 
-       be_msix_enable(adapter);
        /* tell fw we're ready to fire cmds */
        status = be_cmd_fw_init(adapter);
        if (status)
@@ -3704,7 +3627,6 @@ static int be_resume(struct pci_dev *pdev)
        if (adapter->wol)
                be_setup_wol(adapter, false);
 
-       schedule_delayed_work(&adapter->work, msecs_to_jiffies(100));
        return 0;
 }
 
index 60f0e78..a381678 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * linux/drivers/net/ethoc.c
+ * linux/drivers/net/ethernet/ethoc.c
  *
  * Copyright (C) 2007-2008 Avionic Design Development GmbH
  * Copyright (C) 2008-2009 Avionic Design GmbH
@@ -776,10 +776,16 @@ static int ethoc_set_mac_address(struct net_device *dev, void *addr)
        struct ethoc *priv = netdev_priv(dev);
        u8 *mac = (u8 *)addr;
 
+       if (!is_valid_ether_addr(mac))
+               return -EADDRNOTAVAIL;
+
        ethoc_write(priv, MAC_ADDR0, (mac[2] << 24) | (mac[3] << 16) |
                                     (mac[4] <<  8) | (mac[5] <<  0));
        ethoc_write(priv, MAC_ADDR1, (mac[0] <<  8) | (mac[1] <<  0));
 
+       memcpy(dev->dev_addr, mac, ETH_ALEN);
+       dev->addr_assign_type &= ~NET_ADDR_RANDOM;
+
        return 0;
 }
 
@@ -909,11 +915,11 @@ static int __devinit ethoc_probe(struct platform_device *pdev)
        unsigned int phy;
        int num_bd;
        int ret = 0;
+       bool random_mac = false;
 
        /* allocate networking device */
        netdev = alloc_etherdev(sizeof(struct ethoc));
        if (!netdev) {
-               dev_err(&pdev->dev, "cannot allocate network device\n");
                ret = -ENOMEM;
                goto out;
        }
@@ -1050,10 +1056,19 @@ static int __devinit ethoc_probe(struct platform_device *pdev)
 
        /* Check the MAC again for validity, if it still isn't choose and
         * program a random one. */
-       if (!is_valid_ether_addr(netdev->dev_addr))
+       if (!is_valid_ether_addr(netdev->dev_addr)) {
                random_ether_addr(netdev->dev_addr);
+               random_mac = true;
+       }
+
+       ret = ethoc_set_mac_address(netdev, netdev->dev_addr);
+       if (ret) {
+               dev_err(&netdev->dev, "failed to set MAC address\n");
+               goto error;
+       }
 
-       ethoc_set_mac_address(netdev, netdev->dev_addr);
+       if (random_mac)
+               netdev->addr_assign_type |= NET_ADDR_RANDOM;
 
        /* register MII bus */
        priv->mdio = mdiobus_alloc();
index 47f85c3..16b0704 100644 (file)
@@ -1289,7 +1289,7 @@ static int ftgmac100_probe(struct platform_device *pdev)
        netdev_info(netdev, "irq %d, mapped at %p\n", priv->irq, priv->base);
 
        if (!is_valid_ether_addr(netdev->dev_addr)) {
-               random_ether_addr(netdev->dev_addr);
+               eth_hw_addr_random(netdev);
                netdev_info(netdev, "generated random MAC address %pM\n",
                            netdev->dev_addr);
        }
index bb336a0..829b109 100644 (file)
@@ -1133,7 +1133,7 @@ static int ftmac100_probe(struct platform_device *pdev)
        netdev_info(netdev, "irq %d, mapped at %p\n", priv->irq, priv->base);
 
        if (!is_valid_ether_addr(netdev->dev_addr)) {
-               random_ether_addr(netdev->dev_addr);
+               eth_hw_addr_random(netdev);
                netdev_info(netdev, "generated random MAC address %pM\n",
                            netdev->dev_addr);
        }
index c82d444..1637b98 100644 (file)
@@ -1070,14 +1070,13 @@ static void allocate_rx_buffers(struct net_device *dev)
        while (np->really_rx_count != RX_RING_SIZE) {
                struct sk_buff *skb;
 
-               skb = dev_alloc_skb(np->rx_buf_sz);
+               skb = netdev_alloc_skb(dev, np->rx_buf_sz);
                if (skb == NULL)
                        break;  /* Better luck next round. */
 
                while (np->lack_rxbuf->skbuff)
                        np->lack_rxbuf = np->lack_rxbuf->next_desc_logical;
 
-               skb->dev = dev; /* Mark as being used by this device. */
                np->lack_rxbuf->skbuff = skb;
                np->lack_rxbuf->buffer = pci_map_single(np->pci_dev, skb->data,
                        np->rx_buf_sz, PCI_DMA_FROMDEVICE);
@@ -1265,7 +1264,7 @@ static void init_ring(struct net_device *dev)
 
        /* allocate skb for rx buffers */
        for (i = 0; i < RX_RING_SIZE; i++) {
-               struct sk_buff *skb = dev_alloc_skb(np->rx_buf_sz);
+               struct sk_buff *skb = netdev_alloc_skb(dev, np->rx_buf_sz);
 
                if (skb == NULL) {
                        np->lack_rxbuf = &np->rx_ring[i];
@@ -1274,7 +1273,6 @@ static void init_ring(struct net_device *dev)
 
                ++np->really_rx_count;
                np->rx_ring[i].skbuff = skb;
-               skb->dev = dev; /* Mark as being used by this device. */
                np->rx_ring[i].buffer = pci_map_single(np->pci_dev, skb->data,
                        np->rx_buf_sz, PCI_DMA_FROMDEVICE);
                np->rx_ring[i].status = RXOWN;
@@ -1704,7 +1702,7 @@ static int netdev_rx(struct net_device *dev)
                        /* Check if the packet is long enough to accept without copying
                           to a minimally-sized skbuff. */
                        if (pkt_len < rx_copybreak &&
-                           (skb = dev_alloc_skb(pkt_len + 2)) != NULL) {
+                           (skb = netdev_alloc_skb(dev, pkt_len + 2)) != NULL) {
                                skb_reserve(skb, 2);    /* 16 byte align the IP header */
                                pci_dma_sync_single_for_cpu(np->pci_dev,
                                                            np->cur_rx->buffer,
index e92ef1b..a12b3f5 100644 (file)
@@ -711,7 +711,7 @@ fec_enet_rx(struct net_device *ndev)
                 * include that when passing upstream as it messes up
                 * bridging applications.
                 */
-               skb = dev_alloc_skb(pkt_len - 4 + NET_IP_ALIGN);
+               skb = netdev_alloc_skb(ndev, pkt_len - 4 + NET_IP_ALIGN);
 
                if (unlikely(!skb)) {
                        printk("%s: Memory squeeze, dropping packet.\n",
@@ -1210,7 +1210,7 @@ static int fec_enet_alloc_buffers(struct net_device *ndev)
 
        bdp = fep->rx_bd_base;
        for (i = 0; i < RX_RING_SIZE; i++) {
-               skb = dev_alloc_skb(FEC_ENET_RX_FRSIZE);
+               skb = netdev_alloc_skb(ndev, FEC_ENET_RX_FRSIZE);
                if (!skb) {
                        fec_enet_free_buffers(ndev);
                        return -ENOMEM;
@@ -1739,21 +1739,6 @@ static struct platform_driver fec_driver = {
        .remove = __devexit_p(fec_drv_remove),
 };
 
-static int __init
-fec_enet_module_init(void)
-{
-       printk(KERN_INFO "FEC Ethernet Driver\n");
-
-       return platform_driver_register(&fec_driver);
-}
-
-static void __exit
-fec_enet_cleanup(void)
-{
-       platform_driver_unregister(&fec_driver);
-}
-
-module_exit(fec_enet_cleanup);
-module_init(fec_enet_module_init);
+module_platform_driver(fec_driver);
 
 MODULE_LICENSE("GPL");
index 30745b5..7b34d8c 100644 (file)
@@ -160,7 +160,7 @@ static int mpc52xx_fec_alloc_rx_buffers(struct net_device *dev, struct bcom_task
        struct sk_buff *skb;
 
        while (!bcom_queue_full(rxtsk)) {
-               skb = dev_alloc_skb(FEC_RX_BUFFER_SIZE);
+               skb = netdev_alloc_skb(dev, FEC_RX_BUFFER_SIZE);
                if (!skb)
                        return -EAGAIN;
 
@@ -416,7 +416,7 @@ static irqreturn_t mpc52xx_fec_rx_interrupt(int irq, void *dev_id)
 
                /* skbs are allocated on open, so now we allocate a new one,
                 * and remove the old (with the packet) */
-               skb = dev_alloc_skb(FEC_RX_BUFFER_SIZE);
+               skb = netdev_alloc_skb(dev, FEC_RX_BUFFER_SIZE);
                if (!skb) {
                        /* Can't get a new one : reuse the same & drop pkt */
                        dev_notice(&dev->dev, "Low memory - dropped packet.\n");
index 41d2dff..10afa54 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * drivers/drivers/net/fec_mpc52xx/fec.h
+ * drivers/net/ethernet/freescale/fec_mpc52xx.h
  *
  * Driver for the MPC5200 Fast Ethernet Controller
  *
index 910a8e1..999638a 100644 (file)
@@ -154,7 +154,7 @@ static int fs_enet_rx_napi(struct napi_struct *napi, int budget)
 
                        if (pkt_len <= fpi->rx_copybreak) {
                                /* +2 to make IP header L1 cache aligned */
-                               skbn = dev_alloc_skb(pkt_len + 2);
+                               skbn = netdev_alloc_skb(dev, pkt_len + 2);
                                if (skbn != NULL) {
                                        skb_reserve(skbn, 2);   /* align IP header */
                                        skb_copy_from_linear_data(skb,
@@ -165,7 +165,7 @@ static int fs_enet_rx_napi(struct napi_struct *napi, int budget)
                                        skbn = skbt;
                                }
                        } else {
-                               skbn = dev_alloc_skb(ENET_RX_FRSIZE);
+                               skbn = netdev_alloc_skb(dev, ENET_RX_FRSIZE);
 
                                if (skbn)
                                        skb_align(skbn, ENET_RX_ALIGN);
@@ -286,7 +286,7 @@ static int fs_enet_rx_non_napi(struct net_device *dev)
 
                        if (pkt_len <= fpi->rx_copybreak) {
                                /* +2 to make IP header L1 cache aligned */
-                               skbn = dev_alloc_skb(pkt_len + 2);
+                               skbn = netdev_alloc_skb(dev, pkt_len + 2);
                                if (skbn != NULL) {
                                        skb_reserve(skbn, 2);   /* align IP header */
                                        skb_copy_from_linear_data(skb,
@@ -297,7 +297,7 @@ static int fs_enet_rx_non_napi(struct net_device *dev)
                                        skbn = skbt;
                                }
                        } else {
-                               skbn = dev_alloc_skb(ENET_RX_FRSIZE);
+                               skbn = netdev_alloc_skb(dev, ENET_RX_FRSIZE);
 
                                if (skbn)
                                        skb_align(skbn, ENET_RX_ALIGN);
@@ -504,7 +504,7 @@ void fs_init_bds(struct net_device *dev)
         * Initialize the receive buffer descriptors.
         */
        for (i = 0, bdp = fep->rx_bd_base; i < fep->rx_ring; i++, bdp++) {
-               skb = dev_alloc_skb(ENET_RX_FRSIZE);
+               skb = netdev_alloc_skb(dev, ENET_RX_FRSIZE);
                if (skb == NULL) {
                        dev_warn(fep->dev,
                                 "Memory squeeze, unable to allocate skb\n");
@@ -592,7 +592,7 @@ static struct sk_buff *tx_skb_align_workaround(struct net_device *dev,
        struct fs_enet_private *fep = netdev_priv(dev);
 
        /* Alloc new skb */
-       new_skb = dev_alloc_skb(skb->len + 4);
+       new_skb = netdev_alloc_skb(dev, skb->len + 4);
        if (!new_skb) {
                if (net_ratelimit()) {
                        dev_warn(fep->dev,
index 39d160d..adb0ae4 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * drivers/net/gianfar.c
+ * drivers/net/ethernet/freescale/gianfar.c
  *
  * Gianfar Ethernet Driver
  * This driver is designed for the non-CPM ethernet controllers
index 40c33a7..4fe0f34 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * drivers/net/gianfar.h
+ * drivers/net/ethernet/freescale/gianfar.h
  *
  * Gianfar Ethernet Driver
  * Driver for FEC on MPC8540 and TSEC on MPC8540/MPC8560
index 5a3b2e5..5a78d55 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *  drivers/net/gianfar_ethtool.c
+ *  drivers/net/ethernet/freescale/gianfar_ethtool.c
  *
  *  Gianfar Ethernet Driver
  *  Ethtool support for Gianfar Enet
index 64f4094..cd14a4d 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * drivers/net/gianfar_sysfs.c
+ * drivers/net/ethernet/freescale/gianfar_sysfs.c
  *
  * Gianfar Ethernet Driver
  * This driver is designed for the non-CPM ethernet controllers
index ba2dc08..4e3cd2f 100644 (file)
@@ -214,8 +214,9 @@ static struct sk_buff *get_new_skb(struct ucc_geth_private *ugeth,
 
        skb = __skb_dequeue(&ugeth->rx_recycle);
        if (!skb)
-               skb = dev_alloc_skb(ugeth->ug_info->uf_info.max_rx_buf_length +
-                                   UCC_GETH_RX_DATA_BUF_ALIGNMENT);
+               skb = netdev_alloc_skb(ugeth->ndev,
+                                     ugeth->ug_info->uf_info.max_rx_buf_length +
+                                     UCC_GETH_RX_DATA_BUF_ALIGNMENT);
        if (skb == NULL)
                return NULL;
 
@@ -227,8 +228,6 @@ static struct sk_buff *get_new_skb(struct ucc_geth_private *ugeth,
                    (((unsigned)skb->data) & (UCC_GETH_RX_DATA_BUF_ALIGNMENT -
                                              1)));
 
-       skb->dev = ugeth->ndev;
-
        out_be32(&((struct qe_bd __iomem *)bd)->buf,
                      dma_map_single(ugeth->dev,
                                     skb->data,
@@ -1857,11 +1856,93 @@ static int ugeth_82xx_filtering_clear_addr_in_paddr(struct ucc_geth_private *uge
        return hw_clear_addr_in_paddr(ugeth, paddr_num);/* clear in hardware */
 }
 
-static void ucc_geth_memclean(struct ucc_geth_private *ugeth)
+static void ucc_geth_free_rx(struct ucc_geth_private *ugeth)
+{
+       struct ucc_geth_info *ug_info;
+       struct ucc_fast_info *uf_info;
+       u16 i, j;
+       u8 __iomem *bd;
+
+
+       ug_info = ugeth->ug_info;
+       uf_info = &ug_info->uf_info;
+
+       for (i = 0; i < ugeth->ug_info->numQueuesRx; i++) {
+               if (ugeth->p_rx_bd_ring[i]) {
+                       /* Return existing data buffers in ring */
+                       bd = ugeth->p_rx_bd_ring[i];
+                       for (j = 0; j < ugeth->ug_info->bdRingLenRx[i]; j++) {
+                               if (ugeth->rx_skbuff[i][j]) {
+                                       dma_unmap_single(ugeth->dev,
+                                               in_be32(&((struct qe_bd __iomem *)bd)->buf),
+                                               ugeth->ug_info->
+                                               uf_info.max_rx_buf_length +
+                                               UCC_GETH_RX_DATA_BUF_ALIGNMENT,
+                                               DMA_FROM_DEVICE);
+                                       dev_kfree_skb_any(
+                                               ugeth->rx_skbuff[i][j]);
+                                       ugeth->rx_skbuff[i][j] = NULL;
+                               }
+                               bd += sizeof(struct qe_bd);
+                       }
+
+                       kfree(ugeth->rx_skbuff[i]);
+
+                       if (ugeth->ug_info->uf_info.bd_mem_part ==
+                           MEM_PART_SYSTEM)
+                               kfree((void *)ugeth->rx_bd_ring_offset[i]);
+                       else if (ugeth->ug_info->uf_info.bd_mem_part ==
+                                MEM_PART_MURAM)
+                               qe_muram_free(ugeth->rx_bd_ring_offset[i]);
+                       ugeth->p_rx_bd_ring[i] = NULL;
+               }
+       }
+
+}
+
+static void ucc_geth_free_tx(struct ucc_geth_private *ugeth)
 {
+       struct ucc_geth_info *ug_info;
+       struct ucc_fast_info *uf_info;
        u16 i, j;
        u8 __iomem *bd;
 
+       ug_info = ugeth->ug_info;
+       uf_info = &ug_info->uf_info;
+
+       for (i = 0; i < ugeth->ug_info->numQueuesTx; i++) {
+               bd = ugeth->p_tx_bd_ring[i];
+               if (!bd)
+                       continue;
+               for (j = 0; j < ugeth->ug_info->bdRingLenTx[i]; j++) {
+                       if (ugeth->tx_skbuff[i][j]) {
+                               dma_unmap_single(ugeth->dev,
+                                                in_be32(&((struct qe_bd __iomem *)bd)->buf),
+                                                (in_be32((u32 __iomem *)bd) &
+                                                 BD_LENGTH_MASK),
+                                                DMA_TO_DEVICE);
+                               dev_kfree_skb_any(ugeth->tx_skbuff[i][j]);
+                               ugeth->tx_skbuff[i][j] = NULL;
+                       }
+               }
+
+               kfree(ugeth->tx_skbuff[i]);
+
+               if (ugeth->p_tx_bd_ring[i]) {
+                       if (ugeth->ug_info->uf_info.bd_mem_part ==
+                           MEM_PART_SYSTEM)
+                               kfree((void *)ugeth->tx_bd_ring_offset[i]);
+                       else if (ugeth->ug_info->uf_info.bd_mem_part ==
+                                MEM_PART_MURAM)
+                               qe_muram_free(ugeth->tx_bd_ring_offset[i]);
+                       ugeth->p_tx_bd_ring[i] = NULL;
+               }
+       }
+
+}
+
+static void ucc_geth_memclean(struct ucc_geth_private *ugeth)
+{
        if (!ugeth)
                return;
 
@@ -1928,64 +2009,8 @@ static void ucc_geth_memclean(struct ucc_geth_private *ugeth)
                kfree(ugeth->p_init_enet_param_shadow);
                ugeth->p_init_enet_param_shadow = NULL;
        }
-       for (i = 0; i < ugeth->ug_info->numQueuesTx; i++) {
-               bd = ugeth->p_tx_bd_ring[i];
-               if (!bd)
-                       continue;
-               for (j = 0; j < ugeth->ug_info->bdRingLenTx[i]; j++) {
-                       if (ugeth->tx_skbuff[i][j]) {
-                               dma_unmap_single(ugeth->dev,
-                                                in_be32(&((struct qe_bd __iomem *)bd)->buf),
-                                                (in_be32((u32 __iomem *)bd) &
-                                                 BD_LENGTH_MASK),
-                                                DMA_TO_DEVICE);
-                               dev_kfree_skb_any(ugeth->tx_skbuff[i][j]);
-                               ugeth->tx_skbuff[i][j] = NULL;
-                       }
-               }
-
-               kfree(ugeth->tx_skbuff[i]);
-
-               if (ugeth->p_tx_bd_ring[i]) {
-                       if (ugeth->ug_info->uf_info.bd_mem_part ==
-                           MEM_PART_SYSTEM)
-                               kfree((void *)ugeth->tx_bd_ring_offset[i]);
-                       else if (ugeth->ug_info->uf_info.bd_mem_part ==
-                                MEM_PART_MURAM)
-                               qe_muram_free(ugeth->tx_bd_ring_offset[i]);
-                       ugeth->p_tx_bd_ring[i] = NULL;
-               }
-       }
-       for (i = 0; i < ugeth->ug_info->numQueuesRx; i++) {
-               if (ugeth->p_rx_bd_ring[i]) {
-                       /* Return existing data buffers in ring */
-                       bd = ugeth->p_rx_bd_ring[i];
-                       for (j = 0; j < ugeth->ug_info->bdRingLenRx[i]; j++) {
-                               if (ugeth->rx_skbuff[i][j]) {
-                                       dma_unmap_single(ugeth->dev,
-                                               in_be32(&((struct qe_bd __iomem *)bd)->buf),
-                                               ugeth->ug_info->
-                                               uf_info.max_rx_buf_length +
-                                               UCC_GETH_RX_DATA_BUF_ALIGNMENT,
-                                               DMA_FROM_DEVICE);
-                                       dev_kfree_skb_any(
-                                               ugeth->rx_skbuff[i][j]);
-                                       ugeth->rx_skbuff[i][j] = NULL;
-                               }
-                               bd += sizeof(struct qe_bd);
-                       }
-
-                       kfree(ugeth->rx_skbuff[i]);
-
-                       if (ugeth->ug_info->uf_info.bd_mem_part ==
-                           MEM_PART_SYSTEM)
-                               kfree((void *)ugeth->rx_bd_ring_offset[i]);
-                       else if (ugeth->ug_info->uf_info.bd_mem_part ==
-                                MEM_PART_MURAM)
-                               qe_muram_free(ugeth->rx_bd_ring_offset[i]);
-                       ugeth->p_rx_bd_ring[i] = NULL;
-               }
-       }
+       ucc_geth_free_tx(ugeth);
+       ucc_geth_free_rx(ugeth);
        while (!list_empty(&ugeth->group_hash_q))
                put_enet_addr_container(ENET_ADDR_CONT_ENTRY
                                        (dequeue(&ugeth->group_hash_q)));
@@ -2211,6 +2236,171 @@ static int ucc_struct_init(struct ucc_geth_private *ugeth)
        return 0;
 }
 
+static int ucc_geth_alloc_tx(struct ucc_geth_private *ugeth)
+{
+       struct ucc_geth_info *ug_info;
+       struct ucc_fast_info *uf_info;
+       int length;
+       u16 i, j;
+       u8 __iomem *bd;
+
+       ug_info = ugeth->ug_info;
+       uf_info = &ug_info->uf_info;
+
+       /* Allocate Tx bds */
+       for (j = 0; j < ug_info->numQueuesTx; j++) {
+               /* Allocate in multiple of
+                  UCC_GETH_TX_BD_RING_SIZE_MEMORY_ALIGNMENT,
+                  according to spec */
+               length = ((ug_info->bdRingLenTx[j] * sizeof(struct qe_bd))
+                         / UCC_GETH_TX_BD_RING_SIZE_MEMORY_ALIGNMENT)
+                   * UCC_GETH_TX_BD_RING_SIZE_MEMORY_ALIGNMENT;
+               if ((ug_info->bdRingLenTx[j] * sizeof(struct qe_bd)) %
+                   UCC_GETH_TX_BD_RING_SIZE_MEMORY_ALIGNMENT)
+                       length += UCC_GETH_TX_BD_RING_SIZE_MEMORY_ALIGNMENT;
+               if (uf_info->bd_mem_part == MEM_PART_SYSTEM) {
+                       u32 align = 4;
+                       if (UCC_GETH_TX_BD_RING_ALIGNMENT > 4)
+                               align = UCC_GETH_TX_BD_RING_ALIGNMENT;
+                       ugeth->tx_bd_ring_offset[j] =
+                               (u32) kmalloc((u32) (length + align), GFP_KERNEL);
+
+                       if (ugeth->tx_bd_ring_offset[j] != 0)
+                               ugeth->p_tx_bd_ring[j] =
+                                       (u8 __iomem *)((ugeth->tx_bd_ring_offset[j] +
+                                       align) & ~(align - 1));
+               } else if (uf_info->bd_mem_part == MEM_PART_MURAM) {
+                       ugeth->tx_bd_ring_offset[j] =
+                           qe_muram_alloc(length,
+                                          UCC_GETH_TX_BD_RING_ALIGNMENT);
+                       if (!IS_ERR_VALUE(ugeth->tx_bd_ring_offset[j]))
+                               ugeth->p_tx_bd_ring[j] =
+                                   (u8 __iomem *) qe_muram_addr(ugeth->
+                                                        tx_bd_ring_offset[j]);
+               }
+               if (!ugeth->p_tx_bd_ring[j]) {
+                       if (netif_msg_ifup(ugeth))
+                               ugeth_err
+                                   ("%s: Can not allocate memory for Tx bd rings.",
+                                    __func__);
+                       return -ENOMEM;
+               }
+               /* Zero unused end of bd ring, according to spec */
+               memset_io((void __iomem *)(ugeth->p_tx_bd_ring[j] +
+                      ug_info->bdRingLenTx[j] * sizeof(struct qe_bd)), 0,
+                      length - ug_info->bdRingLenTx[j] * sizeof(struct qe_bd));
+       }
+
+       /* Init Tx bds */
+       for (j = 0; j < ug_info->numQueuesTx; j++) {
+               /* Setup the skbuff rings */
+               ugeth->tx_skbuff[j] = kmalloc(sizeof(struct sk_buff *) *
+                                             ugeth->ug_info->bdRingLenTx[j],
+                                             GFP_KERNEL);
+
+               if (ugeth->tx_skbuff[j] == NULL) {
+                       if (netif_msg_ifup(ugeth))
+                               ugeth_err("%s: Could not allocate tx_skbuff",
+                                         __func__);
+                       return -ENOMEM;
+               }
+
+               for (i = 0; i < ugeth->ug_info->bdRingLenTx[j]; i++)
+                       ugeth->tx_skbuff[j][i] = NULL;
+
+               ugeth->skb_curtx[j] = ugeth->skb_dirtytx[j] = 0;
+               bd = ugeth->confBd[j] = ugeth->txBd[j] = ugeth->p_tx_bd_ring[j];
+               for (i = 0; i < ug_info->bdRingLenTx[j]; i++) {
+                       /* clear bd buffer */
+                       out_be32(&((struct qe_bd __iomem *)bd)->buf, 0);
+                       /* set bd status and length */
+                       out_be32((u32 __iomem *)bd, 0);
+                       bd += sizeof(struct qe_bd);
+               }
+               bd -= sizeof(struct qe_bd);
+               /* set bd status and length */
+               out_be32((u32 __iomem *)bd, T_W); /* for last BD set Wrap bit */
+       }
+
+       return 0;
+}
+
+static int ucc_geth_alloc_rx(struct ucc_geth_private *ugeth)
+{
+       struct ucc_geth_info *ug_info;
+       struct ucc_fast_info *uf_info;
+       int length;
+       u16 i, j;
+       u8 __iomem *bd;
+
+       ug_info = ugeth->ug_info;
+       uf_info = &ug_info->uf_info;
+
+       /* Allocate Rx bds */
+       for (j = 0; j < ug_info->numQueuesRx; j++) {
+               length = ug_info->bdRingLenRx[j] * sizeof(struct qe_bd);
+               if (uf_info->bd_mem_part == MEM_PART_SYSTEM) {
+                       u32 align = 4;
+                       if (UCC_GETH_RX_BD_RING_ALIGNMENT > 4)
+                               align = UCC_GETH_RX_BD_RING_ALIGNMENT;
+                       ugeth->rx_bd_ring_offset[j] =
+                               (u32) kmalloc((u32) (length + align), GFP_KERNEL);
+                       if (ugeth->rx_bd_ring_offset[j] != 0)
+                               ugeth->p_rx_bd_ring[j] =
+                                       (u8 __iomem *)((ugeth->rx_bd_ring_offset[j] +
+                                       align) & ~(align - 1));
+               } else if (uf_info->bd_mem_part == MEM_PART_MURAM) {
+                       ugeth->rx_bd_ring_offset[j] =
+                           qe_muram_alloc(length,
+                                          UCC_GETH_RX_BD_RING_ALIGNMENT);
+                       if (!IS_ERR_VALUE(ugeth->rx_bd_ring_offset[j]))
+                               ugeth->p_rx_bd_ring[j] =
+                                   (u8 __iomem *) qe_muram_addr(ugeth->
+                                                        rx_bd_ring_offset[j]);
+               }
+               if (!ugeth->p_rx_bd_ring[j]) {
+                       if (netif_msg_ifup(ugeth))
+                               ugeth_err
+                                   ("%s: Can not allocate memory for Rx bd rings.",
+                                    __func__);
+                       return -ENOMEM;
+               }
+       }
+
+       /* Init Rx bds */
+       for (j = 0; j < ug_info->numQueuesRx; j++) {
+               /* Setup the skbuff rings */
+               ugeth->rx_skbuff[j] = kmalloc(sizeof(struct sk_buff *) *
+                                             ugeth->ug_info->bdRingLenRx[j],
+                                             GFP_KERNEL);
+
+               if (ugeth->rx_skbuff[j] == NULL) {
+                       if (netif_msg_ifup(ugeth))
+                               ugeth_err("%s: Could not allocate rx_skbuff",
+                                         __func__);
+                       return -ENOMEM;
+               }
+
+               for (i = 0; i < ugeth->ug_info->bdRingLenRx[j]; i++)
+                       ugeth->rx_skbuff[j][i] = NULL;
+
+               ugeth->skb_currx[j] = 0;
+               bd = ugeth->rxBd[j] = ugeth->p_rx_bd_ring[j];
+               for (i = 0; i < ug_info->bdRingLenRx[j]; i++) {
+                       /* set bd status and length */
+                       out_be32((u32 __iomem *)bd, R_I);
+                       /* clear bd buffer */
+                       out_be32(&((struct qe_bd __iomem *)bd)->buf, 0);
+                       bd += sizeof(struct qe_bd);
+               }
+               bd -= sizeof(struct qe_bd);
+               /* set bd status and length */
+               out_be32((u32 __iomem *)bd, R_W); /* for last BD set Wrap bit */
+       }
+
+       return 0;
+}
+
 static int ucc_geth_startup(struct ucc_geth_private *ugeth)
 {
        struct ucc_geth_82xx_address_filtering_pram __iomem *p_82xx_addr_filt;
@@ -2223,11 +2413,10 @@ static int ucc_geth_startup(struct ucc_geth_private *ugeth)
        int ret_val = -EINVAL;
        u32 remoder = UCC_GETH_REMODER_INIT;
        u32 init_enet_pram_offset, cecr_subblock, command;
-       u32 ifstat, i, j, size, l2qt, l3qt, length;
+       u32 ifstat, i, j, size, l2qt, l3qt;
        u16 temoder = UCC_GETH_TEMODER_INIT;
        u16 test;
        u8 function_code = 0;
-       u8 __iomem *bd;
        u8 __iomem *endOfRing;
        u8 numThreadsRxNumerical, numThreadsTxNumerical;
 
@@ -2367,142 +2556,13 @@ static int ucc_geth_startup(struct ucc_geth_private *ugeth)
                                UCC_GETH_STATISTICS_GATHERING_MODE_HARDWARE),
                                0, &uf_regs->upsmr, &ug_regs->uescr);
 
-       /* Allocate Tx bds */
-       for (j = 0; j < ug_info->numQueuesTx; j++) {
-               /* Allocate in multiple of
-                  UCC_GETH_TX_BD_RING_SIZE_MEMORY_ALIGNMENT,
-                  according to spec */
-               length = ((ug_info->bdRingLenTx[j] * sizeof(struct qe_bd))
-                         / UCC_GETH_TX_BD_RING_SIZE_MEMORY_ALIGNMENT)
-                   * UCC_GETH_TX_BD_RING_SIZE_MEMORY_ALIGNMENT;
-               if ((ug_info->bdRingLenTx[j] * sizeof(struct qe_bd)) %
-                   UCC_GETH_TX_BD_RING_SIZE_MEMORY_ALIGNMENT)
-                       length += UCC_GETH_TX_BD_RING_SIZE_MEMORY_ALIGNMENT;
-               if (uf_info->bd_mem_part == MEM_PART_SYSTEM) {
-                       u32 align = 4;
-                       if (UCC_GETH_TX_BD_RING_ALIGNMENT > 4)
-                               align = UCC_GETH_TX_BD_RING_ALIGNMENT;
-                       ugeth->tx_bd_ring_offset[j] =
-                               (u32) kmalloc((u32) (length + align), GFP_KERNEL);
-
-                       if (ugeth->tx_bd_ring_offset[j] != 0)
-                               ugeth->p_tx_bd_ring[j] =
-                                       (u8 __iomem *)((ugeth->tx_bd_ring_offset[j] +
-                                       align) & ~(align - 1));
-               } else if (uf_info->bd_mem_part == MEM_PART_MURAM) {
-                       ugeth->tx_bd_ring_offset[j] =
-                           qe_muram_alloc(length,
-                                          UCC_GETH_TX_BD_RING_ALIGNMENT);
-                       if (!IS_ERR_VALUE(ugeth->tx_bd_ring_offset[j]))
-                               ugeth->p_tx_bd_ring[j] =
-                                   (u8 __iomem *) qe_muram_addr(ugeth->
-                                                        tx_bd_ring_offset[j]);
-               }
-               if (!ugeth->p_tx_bd_ring[j]) {
-                       if (netif_msg_ifup(ugeth))
-                               ugeth_err
-                                   ("%s: Can not allocate memory for Tx bd rings.",
-                                    __func__);
-                       return -ENOMEM;
-               }
-               /* Zero unused end of bd ring, according to spec */
-               memset_io((void __iomem *)(ugeth->p_tx_bd_ring[j] +
-                      ug_info->bdRingLenTx[j] * sizeof(struct qe_bd)), 0,
-                      length - ug_info->bdRingLenTx[j] * sizeof(struct qe_bd));
-       }
-
-       /* Allocate Rx bds */
-       for (j = 0; j < ug_info->numQueuesRx; j++) {
-               length = ug_info->bdRingLenRx[j] * sizeof(struct qe_bd);
-               if (uf_info->bd_mem_part == MEM_PART_SYSTEM) {
-                       u32 align = 4;
-                       if (UCC_GETH_RX_BD_RING_ALIGNMENT > 4)
-                               align = UCC_GETH_RX_BD_RING_ALIGNMENT;
-                       ugeth->rx_bd_ring_offset[j] =
-                               (u32) kmalloc((u32) (length + align), GFP_KERNEL);
-                       if (ugeth->rx_bd_ring_offset[j] != 0)
-                               ugeth->p_rx_bd_ring[j] =
-                                       (u8 __iomem *)((ugeth->rx_bd_ring_offset[j] +
-                                       align) & ~(align - 1));
-               } else if (uf_info->bd_mem_part == MEM_PART_MURAM) {
-                       ugeth->rx_bd_ring_offset[j] =
-                           qe_muram_alloc(length,
-                                          UCC_GETH_RX_BD_RING_ALIGNMENT);
-                       if (!IS_ERR_VALUE(ugeth->rx_bd_ring_offset[j]))
-                               ugeth->p_rx_bd_ring[j] =
-                                   (u8 __iomem *) qe_muram_addr(ugeth->
-                                                        rx_bd_ring_offset[j]);
-               }
-               if (!ugeth->p_rx_bd_ring[j]) {
-                       if (netif_msg_ifup(ugeth))
-                               ugeth_err
-                                   ("%s: Can not allocate memory for Rx bd rings.",
-                                    __func__);
-                       return -ENOMEM;
-               }
-       }
-
-       /* Init Tx bds */
-       for (j = 0; j < ug_info->numQueuesTx; j++) {
-               /* Setup the skbuff rings */
-               ugeth->tx_skbuff[j] = kmalloc(sizeof(struct sk_buff *) *
-                                             ugeth->ug_info->bdRingLenTx[j],
-                                             GFP_KERNEL);
-
-               if (ugeth->tx_skbuff[j] == NULL) {
-                       if (netif_msg_ifup(ugeth))
-                               ugeth_err("%s: Could not allocate tx_skbuff",
-                                         __func__);
-                       return -ENOMEM;
-               }
-
-               for (i = 0; i < ugeth->ug_info->bdRingLenTx[j]; i++)
-                       ugeth->tx_skbuff[j][i] = NULL;
-
-               ugeth->skb_curtx[j] = ugeth->skb_dirtytx[j] = 0;
-               bd = ugeth->confBd[j] = ugeth->txBd[j] = ugeth->p_tx_bd_ring[j];
-               for (i = 0; i < ug_info->bdRingLenTx[j]; i++) {
-                       /* clear bd buffer */
-                       out_be32(&((struct qe_bd __iomem *)bd)->buf, 0);
-                       /* set bd status and length */
-                       out_be32((u32 __iomem *)bd, 0);
-                       bd += sizeof(struct qe_bd);
-               }
-               bd -= sizeof(struct qe_bd);
-               /* set bd status and length */
-               out_be32((u32 __iomem *)bd, T_W); /* for last BD set Wrap bit */
-       }
-
-       /* Init Rx bds */
-       for (j = 0; j < ug_info->numQueuesRx; j++) {
-               /* Setup the skbuff rings */
-               ugeth->rx_skbuff[j] = kmalloc(sizeof(struct sk_buff *) *
-                                             ugeth->ug_info->bdRingLenRx[j],
-                                             GFP_KERNEL);
-
-               if (ugeth->rx_skbuff[j] == NULL) {
-                       if (netif_msg_ifup(ugeth))
-                               ugeth_err("%s: Could not allocate rx_skbuff",
-                                         __func__);
-                       return -ENOMEM;
-               }
-
-               for (i = 0; i < ugeth->ug_info->bdRingLenRx[j]; i++)
-                       ugeth->rx_skbuff[j][i] = NULL;
+       ret_val = ucc_geth_alloc_tx(ugeth);
+       if (ret_val != 0)
+               return ret_val;
 
-               ugeth->skb_currx[j] = 0;
-               bd = ugeth->rxBd[j] = ugeth->p_rx_bd_ring[j];
-               for (i = 0; i < ug_info->bdRingLenRx[j]; i++) {
-                       /* set bd status and length */
-                       out_be32((u32 __iomem *)bd, R_I);
-                       /* clear bd buffer */
-                       out_be32(&((struct qe_bd __iomem *)bd)->buf, 0);
-                       bd += sizeof(struct qe_bd);
-               }
-               bd -= sizeof(struct qe_bd);
-               /* set bd status and length */
-               out_be32((u32 __iomem *)bd, R_W); /* for last BD set Wrap bit */
-       }
+       ret_val = ucc_geth_alloc_rx(ugeth);
+       if (ret_val != 0)
+               return ret_val;
 
        /*
         * Global PRAM
index 7c6c908..586b46f 100644 (file)
@@ -757,7 +757,7 @@ net_rx(struct net_device *dev)
                                dev->stats.rx_errors++;
                                break;
                        }
-                       skb = dev_alloc_skb(pkt_len+3);
+                       skb = netdev_alloc_skb(dev, pkt_len + 3);
                        if (skb == NULL) {
                                printk("%s: Memory squeeze, dropping packet (len %d).\n",
                                           dev->name, pkt_len);
index b0e2313..c3f0178 100644 (file)
@@ -1164,7 +1164,7 @@ static void eth16i_rx(struct net_device *dev)
                else {   /* Ok so now we should have a good packet */
                        struct sk_buff *skb;
 
-                       skb = dev_alloc_skb(pkt_len + 3);
+                       skb = netdev_alloc_skb(dev, pkt_len + 3);
                        if( skb == NULL ) {
                                printk(KERN_WARNING "%s: Could'n allocate memory for packet (len %d)\n",
                                       dev->name, pkt_len);
index ee84b47..0230319 100644 (file)
@@ -1002,7 +1002,7 @@ static void fjn_rx(struct net_device *dev)
                dev->stats.rx_errors++;
                break;
            }
-           skb = dev_alloc_skb(pkt_len+2);
+           skb = netdev_alloc_skb(dev, pkt_len + 2);
            if (skb == NULL) {
                netdev_notice(dev, "Memory squeeze, dropping packet (len %d)\n",
                              pkt_len);
index 6a5ee07..d496673 100644 (file)
@@ -1274,7 +1274,7 @@ static int hp100_build_rx_pdl(hp100_ring_t * ringptr,
        /* Note: This depends on the alloc_skb functions allocating more
         * space than requested, i.e. aligning to 16bytes */
 
-       ringptr->skb = dev_alloc_skb(roundup(MAX_ETHER_SIZE + 2, 4));
+       ringptr->skb = netdev_alloc_skb(dev, roundup(MAX_ETHER_SIZE + 2, 4));
 
        if (NULL != ringptr->skb) {
                /*
@@ -1284,7 +1284,6 @@ static int hp100_build_rx_pdl(hp100_ring_t * ringptr,
                 */
                skb_reserve(ringptr->skb, 2);
 
-               ringptr->skb->dev = dev;
                ringptr->skb->data = (u_char *) skb_put(ringptr->skb, MAX_ETHER_SIZE);
 
                /* ringptr->pdl points to the beginning of the PDL, i.e. the PDH */
@@ -1817,7 +1816,7 @@ static void hp100_rx(struct net_device *dev)
 #endif
 
                /* Now we allocate the skb and transfer the data into it. */
-               skb = dev_alloc_skb(pkt_len+2);
+               skb = netdev_alloc_skb(dev, pkt_len + 2);
                if (skb == NULL) {      /* Not enough memory->drop packet */
 #ifdef HP100_DEBUG
                        printk("hp100: %s: rx: couldn't allocate a sk_buff of size %d\n",
@@ -2992,7 +2991,6 @@ static int __init hp100_isa_init(void)
        for (i = 0; i < HP100_DEVICES && hp100_port[i] != -1; ++i) {
                dev = alloc_etherdev(sizeof(struct hp100_private));
                if (!dev) {
-                       printk(KERN_WARNING "hp100: no memory for network device\n");
                        while (cards > 0)
                                cleanup_dev(hp100_devlist[--cards]);
 
index ba82a26..6a5c21b 100644 (file)
@@ -583,7 +583,7 @@ static void receive_packet(struct net_device *dev, int len)
        unsigned long flags;
 
        rlen = (len + 1) & ~1;
-       skb = dev_alloc_skb(rlen + 2);
+       skb = netdev_alloc_skb(dev, rlen + 2);
 
        if (!skb) {
                pr_warning("%s: memory squeeze, dropping packet\n", dev->name);
index 1e94555..ed6925f 100644 (file)
@@ -851,7 +851,7 @@ static void el16_rx(struct net_device *dev)
                        struct sk_buff *skb;
 
                        pkt_len &= 0x3fff;
-                       skb = dev_alloc_skb(pkt_len+2);
+                       skb = netdev_alloc_skb(dev, pkt_len + 2);
                        if (skb == NULL) {
                                pr_err("%s: Memory squeeze, dropping packet.\n",
                                       dev->name);
index d70d3df..8451ecd 100644 (file)
@@ -983,7 +983,7 @@ static void elmc_rcv_int(struct net_device *dev)
                        if ((totlen = rbd->status) & RBD_LAST) {        /* the first and the last buffer? */
                                totlen &= RBD_MASK;     /* length of this frame */
                                rbd->status = 0;
-                               skb = (struct sk_buff *) dev_alloc_skb(totlen + 2);
+                               skb = netdev_alloc_skb(dev, totlen + 2);
                                if (skb != NULL) {
                                        skb_reserve(skb, 2);    /* 16 byte alignment */
                                        skb_put(skb,totlen);
index 474b5e7..ef43f3e 100644 (file)
@@ -1169,7 +1169,7 @@ static void mc32_rx_ring(struct net_device *dev)
                        /* Try to save time by avoiding a copy on big frames */
 
                        if ((length > RX_COPYBREAK) &&
-                           ((newskb=dev_alloc_skb(1532)) != NULL))
+                           ((newskb = netdev_alloc_skb(dev, 1532)) != NULL))
                        {
                                skb=lp->rx_ring[rx_ring_tail].skb;
                                skb_put(skb, length);
@@ -1180,7 +1180,7 @@ static void mc32_rx_ring(struct net_device *dev)
                        }
                        else
                        {
-                               skb=dev_alloc_skb(length+2);
+                               skb = netdev_alloc_skb(dev, length + 2);
 
                                if(skb==NULL) {
                                        dev->stats.rx_dropped++;
index f2408a4..6aa927a 100644 (file)
@@ -549,14 +549,13 @@ static inline int init_rx_bufs(struct net_device *dev)
        /* First build the Receive Buffer Descriptor List */
 
        for (i = 0, rbd = lp->rbds; i < rx_ring_size; i++, rbd++) {
-               struct sk_buff *skb = dev_alloc_skb(PKT_BUF_SZ);
+               struct sk_buff *skb = netdev_alloc_skb(dev, PKT_BUF_SZ);
 
                if (skb == NULL) {
                        remove_rx_bufs(dev);
                        return -ENOMEM;
                }
 
-               skb->dev = dev;
                rbd->v_next = rbd+1;
                rbd->b_next = WSWAPrbd(virt_to_bus(rbd+1));
                rbd->b_addr = WSWAPrbd(virt_to_bus(rbd));
@@ -810,7 +809,7 @@ static inline int i596_rx(struct net_device *dev)
                                struct sk_buff *newskb;
 
                                /* Get fresh skbuff to replace filled one. */
-                               newskb = dev_alloc_skb(PKT_BUF_SZ);
+                               newskb = netdev_alloc_skb(dev, PKT_BUF_SZ);
                                if (newskb == NULL) {
                                        skb = NULL;     /* drop pkt */
                                        goto memory_squeeze;
@@ -819,7 +818,6 @@ static inline int i596_rx(struct net_device *dev)
                                skb_put(skb, pkt_len);
                                rx_in_place = 1;
                                rbd->skb = newskb;
-                               newskb->dev = dev;
                                rbd->v_data = newskb->data;
                                rbd->b_data = WSWAPchar(virt_to_bus(newskb->data));
 #ifdef __mc68000__
@@ -827,7 +825,7 @@ static inline int i596_rx(struct net_device *dev)
 #endif
                        }
                        else
-                               skb = dev_alloc_skb(pkt_len + 2);
+                               skb = netdev_alloc_skb(dev, pkt_len + 2);
 memory_squeeze:
                        if (skb == NULL) {
                                /* XXX tulip.c can defer packets here!! */
index 114cda7..7a4ad4a 100644 (file)
@@ -1563,7 +1563,7 @@ eepro_rx(struct net_device *dev)
 
                        dev->stats.rx_bytes+=rcv_size;
                        rcv_size &= 0x3fff;
-                       skb = dev_alloc_skb(rcv_size+5);
+                       skb = netdev_alloc_skb(dev, rcv_size + 5);
                        if (skb == NULL) {
                                printk(KERN_NOTICE "%s: Memory squeeze, dropping packet.\n", dev->name);
                                dev->stats.rx_dropped++;
index 3a9580f..3fc649e 100644 (file)
@@ -955,7 +955,7 @@ static void eexp_hw_rx_pio(struct net_device *dev)
                        {
                                struct sk_buff *skb;
                                pkt_len &= 0x3fff;
-                               skb = dev_alloc_skb(pkt_len+16);
+                               skb = netdev_alloc_skb(dev, pkt_len + 16);
                                if (skb == NULL)
                                {
                                        printk(KERN_WARNING "%s: Memory squeeze, dropping packet\n",dev->name);
index 42e90a9..406a12b 100644 (file)
@@ -867,7 +867,7 @@ ether1_recv_done (struct net_device *dev)
                        struct sk_buff *skb;
 
                        length = (length + 1) & ~1;
-                       skb = dev_alloc_skb (length + 2);
+                       skb = netdev_alloc_skb(dev, length + 2);
 
                        if (skb) {
                                skb_reserve (skb, 2);
index 414044b..6c2952c 100644 (file)
@@ -454,8 +454,6 @@ init_rx_bufs(struct net_device *dev, int num) {
                        }
 
                        rfd->rbd = rbd;
-               } else {
-                       printk("Could not kmalloc rbd\n");
                }
        }
        lp->rbd_tail->next = rfd->rbd;
@@ -658,7 +656,7 @@ i596_rx_one(struct net_device *dev, struct i596_private *lp,
        if (rfd->stat & RFD_STAT_OK) {
                /* a good frame */
                int pkt_len = (rfd->count & 0x3fff);
-               struct sk_buff *skb = dev_alloc_skb(pkt_len);
+               struct sk_buff *skb = netdev_alloc_skb(dev, pkt_len);
 
                (*frames)++;
 
index c089371..272976e 100644 (file)
@@ -964,7 +964,7 @@ static void ni52_rcv_int(struct net_device *dev)
                                /* the first and the last buffer? */
                                totlen &= RBD_MASK; /* length of this frame */
                                writew(0x00, &rbd->status);
-                               skb = (struct sk_buff *)dev_alloc_skb(totlen+2);
+                               skb = netdev_alloc_skb(dev, totlen + 2);
                                if (skb != NULL) {
                                        skb_reserve(skb, 2);
                                        skb_put(skb, totlen);
index 6ef5e11..cae17f4 100644 (file)
@@ -28,7 +28,6 @@ static int automatic_resume = 0; /* experimental .. better should be zero */
 static int rfdadd = 0; /* rfdadd=1 may be better for 8K MEM cards */
 static int fifo=0x8;   /* don't change */
 
-#include <linux/module.h>
 #include <linux/kernel.h>
 #include <linux/string.h>
 #include <linux/errno.h>
@@ -779,7 +778,7 @@ static void sun3_82586_rcv_int(struct net_device *dev)
                                {
                                        totlen &= RBD_MASK; /* length of this frame */
                                        rbd->status = 0;
-                                       skb = (struct sk_buff *) dev_alloc_skb(totlen+2);
+                                       skb = netdev_alloc_skb(dev, totlen + 2);
                                        if(skb != NULL)
                                        {
                                                skb_reserve(skb,2);
@@ -1151,28 +1150,6 @@ static void set_multicast_list(struct net_device *dev)
        netif_wake_queue(dev);
 }
 
-#ifdef MODULE
-#error This code is not currently supported as a module
-static struct net_device *dev_sun3_82586;
-
-int init_module(void)
-{
-       dev_sun3_82586 = sun3_82586_probe(-1);
-       if (IS_ERR(dev_sun3_82586))
-               return PTR_ERR(dev_sun3_82586);
-       return 0;
-}
-
-void cleanup_module(void)
-{
-       unsigned long ioaddr = dev_sun3_82586->base_addr;
-       unregister_netdev(dev_sun3_82586);
-       release_region(ioaddr, SUN3_82586_TOTAL_SIZE);
-       iounmap((void *)ioaddr);
-       free_netdev(dev_sun3_82586);
-}
-#endif /* MODULE */
-
 #if 0
 /*
  * DUMP .. we expect a not running CMD unit and enough space
@@ -1209,5 +1186,3 @@ void sun3_82586_dump(struct net_device *dev,void *ptr)
        printk("\n");
 }
 #endif
-
-MODULE_LICENSE("GPL");
index 962b4c4..a436497 100644 (file)
@@ -762,7 +762,7 @@ static void znet_rx(struct net_device *dev)
                        /* Malloc up new buffer. */
                        struct sk_buff *skb;
 
-                       skb = dev_alloc_skb(pkt_len);
+                       skb = netdev_alloc_skb(dev, pkt_len);
                        if (skb == NULL) {
                                if (znet_debug)
                                  printk(KERN_WARNING "%s: Memory squeeze, dropping packet.\n", dev->name);
index 6650068..b8e46cc 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *  linux/drivers/net/ehea/ehea.h
+ *  linux/drivers/net/ethernet/ibm/ehea/ehea.h
  *
  *  eHEA ethernet device driver for IBM eServer System p
  *
index 6bdd8e3..95837b9 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *  linux/drivers/net/ehea/ehea_ethtool.c
+ *  linux/drivers/net/ethernet/ibm/ehea/ehea_ethtool.c
  *
  *  eHEA ethernet device driver for IBM eServer System p
  *
index 1a2fe4d..180d412 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *  linux/drivers/net/ehea/ehea_hw.h
+ *  linux/drivers/net/ethernet/ibm/ehea/ehea_hw.h
  *
  *  eHEA ethernet device driver for IBM eServer System p
  *
index 5d5fb26..8b73dd4 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *  linux/drivers/net/ehea/ehea_main.c
+ *  linux/drivers/net/ethernet/ibm/ehea/ehea_main.c
  *
  *  eHEA ethernet device driver for IBM eServer System p
  *
@@ -2980,7 +2980,6 @@ static struct ehea_port *ehea_setup_single_port(struct ehea_adapter *adapter,
        dev = alloc_etherdev_mq(sizeof(struct ehea_port), EHEA_MAX_PORT_RES);
 
        if (!dev) {
-               pr_err("no mem for net_device\n");
                ret = -ENOMEM;
                goto out_err;
        }
index 0506967..30f9033 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *  linux/drivers/net/ehea/ehea_phyp.c
+ *  linux/drivers/net/ethernet/ibm/ehea/ehea_phyp.c
  *
  *  eHEA ethernet device driver for IBM eServer System p
  *
index 2f8174c..52c456e 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *  linux/drivers/net/ehea/ehea_phyp.h
+ *  linux/drivers/net/ethernet/ibm/ehea/ehea_phyp.h
  *
  *  eHEA ethernet device driver for IBM eServer System p
  *
index c25b05b..4fb47f1 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *  linux/drivers/net/ehea/ehea_qmr.c
+ *  linux/drivers/net/ethernet/ibm/ehea/ehea_qmr.c
  *
  *  eHEA ethernet device driver for IBM eServer System p
  *
index 337a47e..8e4a70c 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *  linux/drivers/net/ehea/ehea_qmr.h
+ *  linux/drivers/net/ethernet/ibm/ehea/ehea_qmr.h
  *
  *  eHEA ethernet device driver for IBM eServer System p
  *
index 2abce96..dac7ffb 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * drivers/net/ibm_newemac/core.c
+ * drivers/net/ethernet/ibm/emac/core.c
  *
  * Driver for PowerPC 4xx on-chip ethernet controller.
  *
@@ -2706,11 +2706,9 @@ static int __devinit emac_probe(struct platform_device *ofdev)
        /* Allocate our net_device structure */
        err = -ENOMEM;
        ndev = alloc_etherdev(sizeof(struct emac_instance));
-       if (!ndev) {
-               printk(KERN_ERR "%s: could not allocate ethernet device!\n",
-                      np->full_name);
+       if (!ndev)
                goto err_gone;
-       }
+
        dev = netdev_priv(ndev);
        dev->ndev = ndev;
        dev->ofdev = ofdev;
index fa3ec57..bade296 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * drivers/net/ibm_newemac/core.h
+ * drivers/net/ethernet/ibm/emac/core.h
  *
  * Driver for PowerPC 4xx on-chip ethernet controller.
  *
index 8c6c1e2..b16b482 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * drivers/net/ibm_newemac/debug.c
+ * drivers/net/ethernet/ibm/emac/debug.c
  *
  * Driver for PowerPC 4xx on-chip ethernet controller, debug print routines.
  *
index 90477fe..59a92d5 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * drivers/net/ibm_newemac/debug.h
+ * drivers/net/ethernet/ibm/emac/debug.h
  *
  * Driver for PowerPC 4xx on-chip ethernet controller, debug print routines.
  *
index 1568278..b44bd24 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * drivers/net/ibm_newemac/emac.h
+ * drivers/net/ethernet/ibm/emac/emac.h
  *
  * Register definitions for PowerPC 4xx on-chip ethernet contoller
  *
index f3c50b9..479e43e 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * drivers/net/ibm_newemac/mal.c
+ * drivers/net/ethernet/ibm/emac/mal.c
  *
  * Memory Access Layer (MAL) support
  *
index d06f985..e431a32 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * drivers/net/ibm_newemac/mal.h
+ * drivers/net/ethernet/ibm/emac/mal.h
  *
  * Memory Access Layer (MAL) support
  *
index ab4e596..d3b9d10 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * drivers/net/ibm_newemac/phy.c
+ * drivers/net/ethernet/ibm/emac/phy.c
  *
  * Driver for PowerPC 4xx on-chip ethernet controller, PHY support.
  * Borrowed from sungem_phy.c, though I only kept the generic MII
index 5d2bf4c..d7e41ec 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * drivers/net/ibm_newemac/phy.h
+ * drivers/net/ethernet/ibm/emac/phy.h
  *
  * Driver for PowerPC 4xx on-chip ethernet controller, PHY support
  *
index 4fa53f3..d312328 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * drivers/net/ibm_newemac/rgmii.c
+ * drivers/net/ethernet/ibm/emac/rgmii.c
  *
  * Driver for PowerPC 4xx on-chip ethernet controller, RGMII bridge support.
  *
@@ -237,11 +237,8 @@ static int __devinit rgmii_probe(struct platform_device *ofdev)
 
        rc = -ENOMEM;
        dev = kzalloc(sizeof(struct rgmii_instance), GFP_KERNEL);
-       if (dev == NULL) {
-               printk(KERN_ERR "%s: could not allocate RGMII device!\n",
-                      np->full_name);
+       if (dev == NULL)
                goto err_gone;
-       }
 
        mutex_init(&dev->lock);
        dev->ofdev = ofdev;
index 9296b6c..668bcee 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * drivers/net/ibm_newemac/rgmii.h
+ * drivers/net/ethernet/ibm/emac/rgmii.h
  *
  * Driver for PowerPC 4xx on-chip ethernet controller, RGMII bridge support.
  *
index 5f51bf7..872912e 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * drivers/net/ibm_newemac/tah.c
+ * drivers/net/ethernet/ibm/emac/tah.c
  *
  * Driver for PowerPC 4xx on-chip ethernet controller, TAH support.
  *
@@ -96,11 +96,8 @@ static int __devinit tah_probe(struct platform_device *ofdev)
 
        rc = -ENOMEM;
        dev = kzalloc(sizeof(struct tah_instance), GFP_KERNEL);
-       if (dev == NULL) {
-               printk(KERN_ERR "%s: could not allocate TAH device!\n",
-                      np->full_name);
+       if (dev == NULL)
                goto err_gone;
-       }
 
        mutex_init(&dev->lock);
        dev->ofdev = ofdev;
index 3437ab4..350b709 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * drivers/net/ibm_newemac/tah.h
+ * drivers/net/ethernet/ibm/emac/tah.h
  *
  * Driver for PowerPC 4xx on-chip ethernet controller, TAH support.
  *
index 97449e7..415e9b4 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * drivers/net/ibm_newemac/zmii.c
+ * drivers/net/ethernet/ibm/emac/zmii.c
  *
  * Driver for PowerPC 4xx on-chip ethernet controller, ZMII bridge support.
  *
@@ -240,11 +240,8 @@ static int __devinit zmii_probe(struct platform_device *ofdev)
 
        rc = -ENOMEM;
        dev = kzalloc(sizeof(struct zmii_instance), GFP_KERNEL);
-       if (dev == NULL) {
-               printk(KERN_ERR "%s: could not allocate ZMII device!\n",
-                      np->full_name);
+       if (dev == NULL)
                goto err_gone;
-       }
 
        mutex_init(&dev->lock);
        dev->ofdev = ofdev;
index ceaed82..455bfb0 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * drivers/net/ibm_newemac/zmii.h
+ * drivers/net/ethernet/ibm/emac/zmii.h
  *
  * Driver for PowerPC 4xx on-chip ethernet controller, ZMII bridge support.
  *
index acc31af..1cafa65 100644 (file)
@@ -1032,10 +1032,8 @@ static struct net_device *veth_probe_one(int vlan,
        }
 
        dev = alloc_etherdev(sizeof (struct veth_port));
-       if (! dev) {
-               veth_error("Unable to allocate net_device structure!\n");
+       if (!dev)
                return NULL;
-       }
 
        port = netdev_priv(dev);
 
index 075451d..1b563bb 100644 (file)
@@ -744,9 +744,6 @@ static int ipg_get_rxbuff(struct net_device *dev, int entry)
                return -ENOMEM;
        }
 
-       /* Associate the receive buffer with the IPG NIC. */
-       skb->dev = dev;
-
        /* Save the address of the sk_buff structure. */
        sp->rx_buff[entry] = skb;
 
@@ -2233,7 +2230,6 @@ static int __devinit ipg_probe(struct pci_dev *pdev,
         */
        dev = alloc_etherdev(sizeof(struct ipg_nic_private));
        if (!dev) {
-               pr_err("%s: alloc_etherdev failed\n", pci_name(pdev));
                rc = -ENOMEM;
                goto err_disable_0;
        }
index 9436397..e498eff 100644 (file)
@@ -412,6 +412,10 @@ enum cb_status {
        cb_ok       = 0x2000,
 };
 
+/**
+ * cb_command - Command Block flags
+ * @cb_tx_nc:  0: controler does CRC (normal),  1: CRC from skb memory
+ */
 enum cb_command {
        cb_nop    = 0x0000,
        cb_iaaddr = 0x0001,
@@ -421,6 +425,7 @@ enum cb_command {
        cb_ucode  = 0x0005,
        cb_dump   = 0x0006,
        cb_tx_sf  = 0x0008,
+       cb_tx_nc  = 0x0010,
        cb_cid    = 0x1f00,
        cb_i      = 0x2000,
        cb_s      = 0x4000,
@@ -457,7 +462,7 @@ struct config {
 /*5*/  u8 X(tx_dma_max_count:7, dma_max_count_enable:1);
 /*6*/  u8 X(X(X(X(X(X(X(late_scb_update:1, direct_rx_dma:1),
           tno_intr:1), cna_intr:1), standard_tcb:1), standard_stat_counter:1),
-          rx_discard_overruns:1), rx_save_bad_frames:1);
+          rx_save_overruns : 1), rx_save_bad_frames : 1);
 /*7*/  u8 X(X(X(X(X(rx_discard_short_frames:1, tx_underrun_retry:2),
           pad7:2), rx_extended_rfd:1), tx_two_frames_in_fifo:1),
           tx_dynamic_tbd:1);
@@ -617,6 +622,7 @@ struct nic {
        u32 rx_fc_pause;
        u32 rx_fc_unsupported;
        u32 rx_tco_frames;
+       u32 rx_short_frame_errors;
        u32 rx_over_length_errors;
 
        u16 eeprom_wc;
@@ -1075,7 +1081,7 @@ static void e100_get_defaults(struct nic *nic)
        /* Template for a freshly allocated RFD */
        nic->blank_rfd.command = 0;
        nic->blank_rfd.rbd = cpu_to_le32(0xFFFFFFFF);
-       nic->blank_rfd.size = cpu_to_le16(VLAN_ETH_FRAME_LEN);
+       nic->blank_rfd.size = cpu_to_le16(VLAN_ETH_FRAME_LEN + ETH_FCS_LEN);
 
        /* MII setup */
        nic->mii.phy_id_mask = 0x1F;
@@ -1089,6 +1095,7 @@ static void e100_configure(struct nic *nic, struct cb *cb, struct sk_buff *skb)
 {
        struct config *config = &cb->u.config;
        u8 *c = (u8 *)config;
+       struct net_device *netdev = nic->netdev;
 
        cb->command = cpu_to_le16(cb_config);
 
@@ -1132,6 +1139,9 @@ static void e100_configure(struct nic *nic, struct cb *cb, struct sk_buff *skb)
                config->promiscuous_mode = 0x1;         /* 1=on, 0=off */
        }
 
+       if (unlikely(netdev->features & NETIF_F_RXFCS))
+               config->rx_crc_transfer = 0x1;  /* 1=save, 0=discard */
+
        if (nic->flags & multicast_all)
                config->multicast_all = 0x1;            /* 1=accept, 0=no */
 
@@ -1156,6 +1166,12 @@ static void e100_configure(struct nic *nic, struct cb *cb, struct sk_buff *skb)
                }
        }
 
+       if (netdev->features & NETIF_F_RXALL) {
+               config->rx_save_overruns = 0x1; /* 1=save, 0=discard */
+               config->rx_save_bad_frames = 0x1;       /* 1=save, 0=discard */
+               config->rx_discard_short_frames = 0x0;  /* 1=discard, 0=save */
+       }
+
        netif_printk(nic, hw, KERN_DEBUG, nic->netdev,
                     "[00-07]=%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X\n",
                     c[0], c[1], c[2], c[3], c[4], c[5], c[6], c[7]);
@@ -1607,7 +1623,9 @@ static void e100_update_stats(struct nic *nic)
                ns->collisions += nic->tx_collisions;
                ns->tx_errors += le32_to_cpu(s->tx_max_collisions) +
                        le32_to_cpu(s->tx_lost_crs);
-               ns->rx_length_errors += le32_to_cpu(s->rx_short_frame_errors) +
+               nic->rx_short_frame_errors +=
+                       le32_to_cpu(s->rx_short_frame_errors);
+               ns->rx_length_errors = nic->rx_short_frame_errors +
                        nic->rx_over_length_errors;
                ns->rx_crc_errors += le32_to_cpu(s->rx_crc_errors);
                ns->rx_frame_errors += le32_to_cpu(s->rx_alignment_errors);
@@ -1720,6 +1738,16 @@ static void e100_xmit_prepare(struct nic *nic, struct cb *cb,
        struct sk_buff *skb)
 {
        cb->command = nic->tx_command;
+
+       /*
+        * Use the last 4 bytes of the SKB payload packet as the CRC, used for
+        * testing, ie sending frames with bad CRC.
+        */
+       if (unlikely(skb->no_fcs))
+               cb->command |= __constant_cpu_to_le16(cb_tx_nc);
+       else
+               cb->command &= ~__constant_cpu_to_le16(cb_tx_nc);
+
        /* interrupt every 16 packets regardless of delay */
        if ((nic->cbs_avail & ~15) == nic->cbs_avail)
                cb->command |= cpu_to_le16(cb_i);
@@ -1881,7 +1909,7 @@ static inline void e100_start_receiver(struct nic *nic, struct rx *rx)
        }
 }
 
-#define RFD_BUF_LEN (sizeof(struct rfd) + VLAN_ETH_FRAME_LEN)
+#define RFD_BUF_LEN (sizeof(struct rfd) + VLAN_ETH_FRAME_LEN + ETH_FCS_LEN)
 static int e100_rx_alloc_skb(struct nic *nic, struct rx *rx)
 {
        if (!(rx->skb = netdev_alloc_skb_ip_align(nic->netdev, RFD_BUF_LEN)))
@@ -1919,6 +1947,7 @@ static int e100_rx_indicate(struct nic *nic, struct rx *rx,
        struct sk_buff *skb = rx->skb;
        struct rfd *rfd = (struct rfd *)skb->data;
        u16 rfd_status, actual_size;
+       u16 fcs_pad = 0;
 
        if (unlikely(work_done && *work_done >= work_to_do))
                return -EAGAIN;
@@ -1951,6 +1980,8 @@ static int e100_rx_indicate(struct nic *nic, struct rx *rx,
        }
 
        /* Get actual data size */
+       if (unlikely(dev->features & NETIF_F_RXFCS))
+               fcs_pad = 4;
        actual_size = le16_to_cpu(rfd->actual_size) & 0x3FFF;
        if (unlikely(actual_size > RFD_BUF_LEN - sizeof(struct rfd)))
                actual_size = RFD_BUF_LEN - sizeof(struct rfd);
@@ -1977,16 +2008,27 @@ static int e100_rx_indicate(struct nic *nic, struct rx *rx,
        skb_put(skb, actual_size);
        skb->protocol = eth_type_trans(skb, nic->netdev);
 
+       /* If we are receiving all frames, then don't bother
+        * checking for errors.
+        */
+       if (unlikely(dev->features & NETIF_F_RXALL)) {
+               if (actual_size > ETH_DATA_LEN + VLAN_ETH_HLEN + fcs_pad)
+                       /* Received oversized frame, but keep it. */
+                       nic->rx_over_length_errors++;
+               goto process_skb;
+       }
+
        if (unlikely(!(rfd_status & cb_ok))) {
                /* Don't indicate if hardware indicates errors */
                dev_kfree_skb_any(skb);
-       } else if (actual_size > ETH_DATA_LEN + VLAN_ETH_HLEN) {
+       } else if (actual_size > ETH_DATA_LEN + VLAN_ETH_HLEN + fcs_pad) {
                /* Don't indicate oversized frames */
                nic->rx_over_length_errors++;
                dev_kfree_skb_any(skb);
        } else {
+process_skb:
                dev->stats.rx_packets++;
-               dev->stats.rx_bytes += actual_size;
+               dev->stats.rx_bytes += (actual_size - fcs_pad);
                netif_receive_skb(skb);
                if (work_done)
                        (*work_done)++;
@@ -2058,7 +2100,8 @@ static void e100_rx_clean(struct nic *nic, unsigned int *work_done,
                pci_dma_sync_single_for_device(nic->pdev,
                        old_before_last_rx->dma_addr, sizeof(struct rfd),
                        PCI_DMA_BIDIRECTIONAL);
-               old_before_last_rfd->size = cpu_to_le16(VLAN_ETH_FRAME_LEN);
+               old_before_last_rfd->size = cpu_to_le16(VLAN_ETH_FRAME_LEN
+                                                       + ETH_FCS_LEN);
                pci_dma_sync_single_for_device(nic->pdev,
                        old_before_last_rx->dma_addr, sizeof(struct rfd),
                        PCI_DMA_BIDIRECTIONAL);
@@ -2618,6 +2661,7 @@ static const char e100_gstrings_stats[][ETH_GSTRING_LEN] = {
        "tx_deferred", "tx_single_collisions", "tx_multi_collisions",
        "tx_flow_control_pause", "rx_flow_control_pause",
        "rx_flow_control_unsupported", "tx_tco_packets", "rx_tco_packets",
+       "rx_short_frame_errors", "rx_over_length_errors",
 };
 #define E100_NET_STATS_LEN     21
 #define E100_STATS_LEN ARRAY_SIZE(e100_gstrings_stats)
@@ -2651,6 +2695,8 @@ static void e100_get_ethtool_stats(struct net_device *netdev,
        data[i++] = nic->rx_fc_unsupported;
        data[i++] = nic->tx_tco_frames;
        data[i++] = nic->rx_tco_frames;
+       data[i++] = nic->rx_short_frame_errors;
+       data[i++] = nic->rx_over_length_errors;
 }
 
 static void e100_get_strings(struct net_device *netdev, u32 stringset, u8 *data)
@@ -2729,6 +2775,20 @@ static int e100_close(struct net_device *netdev)
        return 0;
 }
 
+static int e100_set_features(struct net_device *netdev,
+                            netdev_features_t features)
+{
+       struct nic *nic = netdev_priv(netdev);
+       netdev_features_t changed = features ^ netdev->features;
+
+       if (!(changed & (NETIF_F_RXFCS | NETIF_F_RXALL)))
+               return 0;
+
+       netdev->features = features;
+       e100_exec_cb(nic, NULL, e100_configure);
+       return 0;
+}
+
 static const struct net_device_ops e100_netdev_ops = {
        .ndo_open               = e100_open,
        .ndo_stop               = e100_close,
@@ -2742,6 +2802,7 @@ static const struct net_device_ops e100_netdev_ops = {
 #ifdef CONFIG_NET_POLL_CONTROLLER
        .ndo_poll_controller    = e100_netpoll,
 #endif
+       .ndo_set_features       = e100_set_features,
 };
 
 static int __devinit e100_probe(struct pci_dev *pdev,
@@ -2751,11 +2812,12 @@ static int __devinit e100_probe(struct pci_dev *pdev,
        struct nic *nic;
        int err;
 
-       if (!(netdev = alloc_etherdev(sizeof(struct nic)))) {
-               if (((1 << debug) - 1) & NETIF_MSG_PROBE)
-                       pr_err("Etherdev alloc failed, aborting\n");
+       if (!(netdev = alloc_etherdev(sizeof(struct nic))))
                return -ENOMEM;
-       }
+
+       netdev->hw_features |= NETIF_F_RXFCS;
+       netdev->priv_flags |= IFF_SUPP_NOFCS;
+       netdev->hw_features |= NETIF_F_RXALL;
 
        netdev->netdev_ops = &e100_netdev_ops;
        SET_ETHTOOL_OPS(netdev, &e100_ethtool_ops);
index 1e15969..2b6cd02 100644 (file)
@@ -254,6 +254,7 @@ struct e1000_adapter {
        atomic_t tx_fifo_stall;
        bool pcix_82544;
        bool detect_tx_hung;
+       bool dump_buffers;
 
        /* RX */
        bool (*clean_rx)(struct e1000_adapter *adapter,
index 36ee76b..c526279 100644 (file)
@@ -5253,6 +5253,78 @@ static s32 e1000_check_downshift(struct e1000_hw *hw)
        return E1000_SUCCESS;
 }
 
+static const u16 dsp_reg_array[IGP01E1000_PHY_CHANNEL_NUM] = {
+       IGP01E1000_PHY_AGC_PARAM_A,
+       IGP01E1000_PHY_AGC_PARAM_B,
+       IGP01E1000_PHY_AGC_PARAM_C,
+       IGP01E1000_PHY_AGC_PARAM_D
+};
+
+static s32 e1000_1000Mb_check_cable_length(struct e1000_hw *hw)
+{
+       u16 min_length, max_length;
+       u16 phy_data, i;
+       s32 ret_val;
+
+       ret_val = e1000_get_cable_length(hw, &min_length, &max_length);
+       if (ret_val)
+               return ret_val;
+
+       if (hw->dsp_config_state != e1000_dsp_config_enabled)
+               return 0;
+
+       if (min_length >= e1000_igp_cable_length_50) {
+               for (i = 0; i < IGP01E1000_PHY_CHANNEL_NUM; i++) {
+                       ret_val = e1000_read_phy_reg(hw, dsp_reg_array[i],
+                                                    &phy_data);
+                       if (ret_val)
+                               return ret_val;
+
+                       phy_data &= ~IGP01E1000_PHY_EDAC_MU_INDEX;
+
+                       ret_val = e1000_write_phy_reg(hw, dsp_reg_array[i],
+                                                     phy_data);
+                       if (ret_val)
+                               return ret_val;
+               }
+               hw->dsp_config_state = e1000_dsp_config_activated;
+       } else {
+               u16 ffe_idle_err_timeout = FFE_IDLE_ERR_COUNT_TIMEOUT_20;
+               u32 idle_errs = 0;
+
+               /* clear previous idle error counts */
+               ret_val = e1000_read_phy_reg(hw, PHY_1000T_STATUS, &phy_data);
+               if (ret_val)
+                       return ret_val;
+
+               for (i = 0; i < ffe_idle_err_timeout; i++) {
+                       udelay(1000);
+                       ret_val = e1000_read_phy_reg(hw, PHY_1000T_STATUS,
+                                                    &phy_data);
+                       if (ret_val)
+                               return ret_val;
+
+                       idle_errs += (phy_data & SR_1000T_IDLE_ERROR_CNT);
+                       if (idle_errs > SR_1000T_PHY_EXCESSIVE_IDLE_ERR_COUNT) {
+                               hw->ffe_config_state = e1000_ffe_config_active;
+
+                               ret_val = e1000_write_phy_reg(hw,
+                                             IGP01E1000_PHY_DSP_FFE,
+                                             IGP01E1000_PHY_DSP_FFE_CM_CP);
+                               if (ret_val)
+                                       return ret_val;
+                               break;
+                       }
+
+                       if (idle_errs)
+                               ffe_idle_err_timeout =
+                                           FFE_IDLE_ERR_COUNT_TIMEOUT_100;
+               }
+       }
+
+       return 0;
+}
+
 /**
  * e1000_config_dsp_after_link_change
  * @hw: Struct containing variables accessed by shared code
@@ -5269,13 +5341,6 @@ static s32 e1000_config_dsp_after_link_change(struct e1000_hw *hw, bool link_up)
 {
        s32 ret_val;
        u16 phy_data, phy_saved_data, speed, duplex, i;
-       static const u16 dsp_reg_array[IGP01E1000_PHY_CHANNEL_NUM] = {
-              IGP01E1000_PHY_AGC_PARAM_A,
-              IGP01E1000_PHY_AGC_PARAM_B,
-              IGP01E1000_PHY_AGC_PARAM_C,
-              IGP01E1000_PHY_AGC_PARAM_D
-       };
-       u16 min_length, max_length;
 
        e_dbg("e1000_config_dsp_after_link_change");
 
@@ -5290,84 +5355,9 @@ static s32 e1000_config_dsp_after_link_change(struct e1000_hw *hw, bool link_up)
                }
 
                if (speed == SPEED_1000) {
-
-                       ret_val =
-                           e1000_get_cable_length(hw, &min_length,
-                                                  &max_length);
+                       ret_val = e1000_1000Mb_check_cable_length(hw);
                        if (ret_val)
                                return ret_val;
-
-                       if ((hw->dsp_config_state == e1000_dsp_config_enabled)
-                           && min_length >= e1000_igp_cable_length_50) {
-
-                               for (i = 0; i < IGP01E1000_PHY_CHANNEL_NUM; i++) {
-                                       ret_val =
-                                           e1000_read_phy_reg(hw,
-                                                              dsp_reg_array[i],
-                                                              &phy_data);
-                                       if (ret_val)
-                                               return ret_val;
-
-                                       phy_data &=
-                                           ~IGP01E1000_PHY_EDAC_MU_INDEX;
-
-                                       ret_val =
-                                           e1000_write_phy_reg(hw,
-                                                               dsp_reg_array
-                                                               [i], phy_data);
-                                       if (ret_val)
-                                               return ret_val;
-                               }
-                               hw->dsp_config_state =
-                                   e1000_dsp_config_activated;
-                       }
-
-                       if ((hw->ffe_config_state == e1000_ffe_config_enabled)
-                           && (min_length < e1000_igp_cable_length_50)) {
-
-                               u16 ffe_idle_err_timeout =
-                                   FFE_IDLE_ERR_COUNT_TIMEOUT_20;
-                               u32 idle_errs = 0;
-
-                               /* clear previous idle error counts */
-                               ret_val =
-                                   e1000_read_phy_reg(hw, PHY_1000T_STATUS,
-                                                      &phy_data);
-                               if (ret_val)
-                                       return ret_val;
-
-                               for (i = 0; i < ffe_idle_err_timeout; i++) {
-                                       udelay(1000);
-                                       ret_val =
-                                           e1000_read_phy_reg(hw,
-                                                              PHY_1000T_STATUS,
-                                                              &phy_data);
-                                       if (ret_val)
-                                               return ret_val;
-
-                                       idle_errs +=
-                                           (phy_data &
-                                            SR_1000T_IDLE_ERROR_CNT);
-                                       if (idle_errs >
-                                           SR_1000T_PHY_EXCESSIVE_IDLE_ERR_COUNT)
-                                       {
-                                               hw->ffe_config_state =
-                                                   e1000_ffe_config_active;
-
-                                               ret_val =
-                                                   e1000_write_phy_reg(hw,
-                                                                       IGP01E1000_PHY_DSP_FFE,
-                                                                       IGP01E1000_PHY_DSP_FFE_CM_CP);
-                                               if (ret_val)
-                                                       return ret_val;
-                                               break;
-                                       }
-
-                                       if (idle_errs)
-                                               ffe_idle_err_timeout =
-                                                   FFE_IDLE_ERR_COUNT_TIMEOUT_100;
-                               }
-                       }
                }
        } else {
                if (hw->dsp_config_state == e1000_dsp_config_activated) {
index f6c4d7e..11578c8 100644 (file)
@@ -895,6 +895,11 @@ struct e1000_ffvt_entry {
 #define E1000_FCRTL    0x02160 /* Flow Control Receive Threshold Low - RW */
 #define E1000_FCRTH    0x02168 /* Flow Control Receive Threshold High - RW */
 #define E1000_PSRCTL   0x02170 /* Packet Split Receive Control - RW */
+#define E1000_RDFH     0x02410  /* RX Data FIFO Head - RW */
+#define E1000_RDFT     0x02418  /* RX Data FIFO Tail - RW */
+#define E1000_RDFHS    0x02420  /* RX Data FIFO Head Saved - RW */
+#define E1000_RDFTS    0x02428  /* RX Data FIFO Tail Saved - RW */
+#define E1000_RDFPC    0x02430  /* RX Data FIFO Packet Count - RW */
 #define E1000_RDBAL    0x02800 /* RX Descriptor Base Address Low - RW */
 #define E1000_RDBAH    0x02804 /* RX Descriptor Base Address High - RW */
 #define E1000_RDLEN    0x02808 /* RX Descriptor Length - RW */
@@ -1074,6 +1079,11 @@ struct e1000_ffvt_entry {
 #define E1000_82542_IMC      E1000_IMC
 #define E1000_82542_RCTL     E1000_RCTL
 #define E1000_82542_RDTR     0x00108
+#define E1000_82542_RDFH     E1000_RDFH
+#define E1000_82542_RDFT     E1000_RDFT
+#define E1000_82542_RDFHS    E1000_RDFHS
+#define E1000_82542_RDFTS    E1000_RDFTS
+#define E1000_82542_RDFPC    E1000_RDFPC
 #define E1000_82542_RDBAL    0x00110
 #define E1000_82542_RDBAH    0x00114
 #define E1000_82542_RDLEN    0x00118
index d94d64b..6419a88 100644 (file)
@@ -730,10 +730,8 @@ static void e1000_dump_eeprom(struct e1000_adapter *adapter)
        eeprom.offset = 0;
 
        data = kmalloc(eeprom.len, GFP_KERNEL);
-       if (!data) {
-               pr_err("Unable to allocate memory to dump EEPROM data\n");
+       if (!data)
                return;
-       }
 
        ops->get_eeprom(netdev, &eeprom, data);
 
@@ -1069,8 +1067,11 @@ static int __devinit e1000_probe(struct pci_dev *pdev,
           (hw->mac_type != e1000_82547))
                netdev->hw_features |= NETIF_F_TSO;
 
+       netdev->priv_flags |= IFF_SUPP_NOFCS;
+
        netdev->features |= netdev->hw_features;
        netdev->hw_features |= NETIF_F_RXCSUM;
+       netdev->hw_features |= NETIF_F_RXFCS;
 
        if (pci_using_dac) {
                netdev->features |= NETIF_F_HIGHDMA;
@@ -2694,6 +2695,7 @@ set_itr_now:
 #define E1000_TX_FLAGS_VLAN            0x00000002
 #define E1000_TX_FLAGS_TSO             0x00000004
 #define E1000_TX_FLAGS_IPV4            0x00000008
+#define E1000_TX_FLAGS_NO_FCS          0x00000010
 #define E1000_TX_FLAGS_VLAN_MASK       0xffff0000
 #define E1000_TX_FLAGS_VLAN_SHIFT      16
 
@@ -2995,6 +2997,9 @@ static void e1000_tx_queue(struct e1000_adapter *adapter,
                txd_upper |= (tx_flags & E1000_TX_FLAGS_VLAN_MASK);
        }
 
+       if (unlikely(tx_flags & E1000_TX_FLAGS_NO_FCS))
+               txd_lower &= ~(E1000_TXD_CMD_IFCS);
+
        i = tx_ring->next_to_use;
 
        while (count--) {
@@ -3009,6 +3014,10 @@ static void e1000_tx_queue(struct e1000_adapter *adapter,
 
        tx_desc->lower.data |= cpu_to_le32(adapter->txd_cmd);
 
+       /* txd_cmd re-enables FCS, so we'll re-disable it here as desired. */
+       if (unlikely(tx_flags & E1000_TX_FLAGS_NO_FCS))
+               tx_desc->lower.data &= ~(cpu_to_le32(E1000_TXD_CMD_IFCS));
+
        /* Force memory writes to complete before letting h/w
         * know there are new descriptors to fetch.  (Only
         * applicable for weak-ordered memory model archs,
@@ -3224,6 +3233,9 @@ static netdev_tx_t e1000_xmit_frame(struct sk_buff *skb,
        if (likely(skb->protocol == htons(ETH_P_IP)))
                tx_flags |= E1000_TX_FLAGS_IPV4;
 
+       if (unlikely(skb->no_fcs))
+               tx_flags |= E1000_TX_FLAGS_NO_FCS;
+
        count = e1000_tx_map(adapter, tx_ring, skb, first, max_per_txd,
                             nr_frags, mss);
 
@@ -3241,6 +3253,215 @@ static netdev_tx_t e1000_xmit_frame(struct sk_buff *skb,
        return NETDEV_TX_OK;
 }
 
+#define NUM_REGS 38 /* 1 based count */
+static void e1000_regdump(struct e1000_adapter *adapter)
+{
+       struct e1000_hw *hw = &adapter->hw;
+       u32 regs[NUM_REGS];
+       u32 *regs_buff = regs;
+       int i = 0;
+
+       static const char * const reg_name[] = {
+               "CTRL",  "STATUS",
+               "RCTL", "RDLEN", "RDH", "RDT", "RDTR",
+               "TCTL", "TDBAL", "TDBAH", "TDLEN", "TDH", "TDT",
+               "TIDV", "TXDCTL", "TADV", "TARC0",
+               "TDBAL1", "TDBAH1", "TDLEN1", "TDH1", "TDT1",
+               "TXDCTL1", "TARC1",
+               "CTRL_EXT", "ERT", "RDBAL", "RDBAH",
+               "TDFH", "TDFT", "TDFHS", "TDFTS", "TDFPC",
+               "RDFH", "RDFT", "RDFHS", "RDFTS", "RDFPC"
+       };
+
+       regs_buff[0]  = er32(CTRL);
+       regs_buff[1]  = er32(STATUS);
+
+       regs_buff[2]  = er32(RCTL);
+       regs_buff[3]  = er32(RDLEN);
+       regs_buff[4]  = er32(RDH);
+       regs_buff[5]  = er32(RDT);
+       regs_buff[6]  = er32(RDTR);
+
+       regs_buff[7]  = er32(TCTL);
+       regs_buff[8]  = er32(TDBAL);
+       regs_buff[9]  = er32(TDBAH);
+       regs_buff[10] = er32(TDLEN);
+       regs_buff[11] = er32(TDH);
+       regs_buff[12] = er32(TDT);
+       regs_buff[13] = er32(TIDV);
+       regs_buff[14] = er32(TXDCTL);
+       regs_buff[15] = er32(TADV);
+       regs_buff[16] = er32(TARC0);
+
+       regs_buff[17] = er32(TDBAL1);
+       regs_buff[18] = er32(TDBAH1);
+       regs_buff[19] = er32(TDLEN1);
+       regs_buff[20] = er32(TDH1);
+       regs_buff[21] = er32(TDT1);
+       regs_buff[22] = er32(TXDCTL1);
+       regs_buff[23] = er32(TARC1);
+       regs_buff[24] = er32(CTRL_EXT);
+       regs_buff[25] = er32(ERT);
+       regs_buff[26] = er32(RDBAL0);
+       regs_buff[27] = er32(RDBAH0);
+       regs_buff[28] = er32(TDFH);
+       regs_buff[29] = er32(TDFT);
+       regs_buff[30] = er32(TDFHS);
+       regs_buff[31] = er32(TDFTS);
+       regs_buff[32] = er32(TDFPC);
+       regs_buff[33] = er32(RDFH);
+       regs_buff[34] = er32(RDFT);
+       regs_buff[35] = er32(RDFHS);
+       regs_buff[36] = er32(RDFTS);
+       regs_buff[37] = er32(RDFPC);
+
+       pr_info("Register dump\n");
+       for (i = 0; i < NUM_REGS; i++)
+               pr_info("%-15s  %08x\n", reg_name[i], regs_buff[i]);
+}
+
+/*
+ * e1000_dump: Print registers, tx ring and rx ring
+ */
+static void e1000_dump(struct e1000_adapter *adapter)
+{
+       /* this code doesn't handle multiple rings */
+       struct e1000_tx_ring *tx_ring = adapter->tx_ring;
+       struct e1000_rx_ring *rx_ring = adapter->rx_ring;
+       int i;
+
+       if (!netif_msg_hw(adapter))
+               return;
+
+       /* Print Registers */
+       e1000_regdump(adapter);
+
+       /*
+        * transmit dump
+        */
+       pr_info("TX Desc ring0 dump\n");
+
+       /* Transmit Descriptor Formats - DEXT[29] is 0 (Legacy) or 1 (Extended)
+        *
+        * Legacy Transmit Descriptor
+        *   +--------------------------------------------------------------+
+        * 0 |         Buffer Address [63:0] (Reserved on Write Back)       |
+        *   +--------------------------------------------------------------+
+        * 8 | Special  |    CSS     | Status |  CMD    |  CSO   |  Length  |
+        *   +--------------------------------------------------------------+
+        *   63       48 47        36 35    32 31     24 23    16 15        0
+        *
+        * Extended Context Descriptor (DTYP=0x0) for TSO or checksum offload
+        *   63      48 47    40 39       32 31             16 15    8 7      0
+        *   +----------------------------------------------------------------+
+        * 0 |  TUCSE  | TUCS0  |   TUCSS   |     IPCSE       | IPCS0 | IPCSS |
+        *   +----------------------------------------------------------------+
+        * 8 |   MSS   | HDRLEN | RSV | STA | TUCMD | DTYP |      PAYLEN      |
+        *   +----------------------------------------------------------------+
+        *   63      48 47    40 39 36 35 32 31   24 23  20 19                0
+        *
+        * Extended Data Descriptor (DTYP=0x1)
+        *   +----------------------------------------------------------------+
+        * 0 |                     Buffer Address [63:0]                      |
+        *   +----------------------------------------------------------------+
+        * 8 | VLAN tag |  POPTS  | Rsvd | Status | Command | DTYP |  DTALEN  |
+        *   +----------------------------------------------------------------+
+        *   63       48 47     40 39  36 35    32 31     24 23  20 19        0
+        */
+       pr_info("Tc[desc]     [Ce CoCsIpceCoS] [MssHlRSCm0Plen] [bi->dma       ] leng  ntw timestmp         bi->skb\n");
+       pr_info("Td[desc]     [address 63:0  ] [VlaPoRSCm1Dlen] [bi->dma       ] leng  ntw timestmp         bi->skb\n");
+
+       if (!netif_msg_tx_done(adapter))
+               goto rx_ring_summary;
+
+       for (i = 0; tx_ring->desc && (i < tx_ring->count); i++) {
+               struct e1000_tx_desc *tx_desc = E1000_TX_DESC(*tx_ring, i);
+               struct e1000_buffer *buffer_info = &tx_ring->buffer_info[i];
+               struct my_u { u64 a; u64 b; };
+               struct my_u *u = (struct my_u *)tx_desc;
+               const char *type;
+
+               if (i == tx_ring->next_to_use && i == tx_ring->next_to_clean)
+                       type = "NTC/U";
+               else if (i == tx_ring->next_to_use)
+                       type = "NTU";
+               else if (i == tx_ring->next_to_clean)
+                       type = "NTC";
+               else
+                       type = "";
+
+               pr_info("T%c[0x%03X]    %016llX %016llX %016llX %04X  %3X %016llX %p %s\n",
+                       ((le64_to_cpu(u->b) & (1<<20)) ? 'd' : 'c'), i,
+                       le64_to_cpu(u->a), le64_to_cpu(u->b),
+                       (u64)buffer_info->dma, buffer_info->length,
+                       buffer_info->next_to_watch,
+                       (u64)buffer_info->time_stamp, buffer_info->skb, type);
+       }
+
+rx_ring_summary:
+       /*
+        * receive dump
+        */
+       pr_info("\nRX Desc ring dump\n");
+
+       /* Legacy Receive Descriptor Format
+        *
+        * +-----------------------------------------------------+
+        * |                Buffer Address [63:0]                |
+        * +-----------------------------------------------------+
+        * | VLAN Tag | Errors | Status 0 | Packet csum | Length |
+        * +-----------------------------------------------------+
+        * 63       48 47    40 39      32 31         16 15      0
+        */
+       pr_info("R[desc]      [address 63:0  ] [vl er S cks ln] [bi->dma       ] [bi->skb]\n");
+
+       if (!netif_msg_rx_status(adapter))
+               goto exit;
+
+       for (i = 0; rx_ring->desc && (i < rx_ring->count); i++) {
+               struct e1000_rx_desc *rx_desc = E1000_RX_DESC(*rx_ring, i);
+               struct e1000_buffer *buffer_info = &rx_ring->buffer_info[i];
+               struct my_u { u64 a; u64 b; };
+               struct my_u *u = (struct my_u *)rx_desc;
+               const char *type;
+
+               if (i == rx_ring->next_to_use)
+                       type = "NTU";
+               else if (i == rx_ring->next_to_clean)
+                       type = "NTC";
+               else
+                       type = "";
+
+               pr_info("R[0x%03X]     %016llX %016llX %016llX %p %s\n",
+                       i, le64_to_cpu(u->a), le64_to_cpu(u->b),
+                       (u64)buffer_info->dma, buffer_info->skb, type);
+       } /* for */
+
+       /* dump the descriptor caches */
+       /* rx */
+       pr_info("Rx descriptor cache in 64bit format\n");
+       for (i = 0x6000; i <= 0x63FF ; i += 0x10) {
+               pr_info("R%04X: %08X|%08X %08X|%08X\n",
+                       i,
+                       readl(adapter->hw.hw_addr + i+4),
+                       readl(adapter->hw.hw_addr + i),
+                       readl(adapter->hw.hw_addr + i+12),
+                       readl(adapter->hw.hw_addr + i+8));
+       }
+       /* tx */
+       pr_info("Tx descriptor cache in 64bit format\n");
+       for (i = 0x7000; i <= 0x73FF ; i += 0x10) {
+               pr_info("T%04X: %08X|%08X %08X|%08X\n",
+                       i,
+                       readl(adapter->hw.hw_addr + i+4),
+                       readl(adapter->hw.hw_addr + i),
+                       readl(adapter->hw.hw_addr + i+12),
+                       readl(adapter->hw.hw_addr + i+8));
+       }
+exit:
+       return;
+}
+
 /**
  * e1000_tx_timeout - Respond to a Tx Hang
  * @netdev: network interface device structure
@@ -3262,6 +3483,7 @@ static void e1000_reset_task(struct work_struct *work)
 
        if (test_bit(__E1000_DOWN, &adapter->flags))
                return;
+       e_err(drv, "Reset adapter\n");
        e1000_reinit_safe(adapter);
 }
 
@@ -3679,6 +3901,7 @@ static bool e1000_clean_tx_irq(struct e1000_adapter *adapter,
                                eop,
                                jiffies,
                                eop_desc->upper.fields.status);
+                       e1000_dump(adapter);
                        netif_stop_queue(netdev);
                }
        }
@@ -3902,10 +4125,9 @@ static bool e1000_clean_jumbo_rx_irq(struct e1000_adapter *adapter,
                                  ((u32)(rx_desc->errors) << 24),
                                  le16_to_cpu(rx_desc->csum), skb);
 
-               pskb_trim(skb, skb->len - 4);
-
-               /* probably a little skewed due to removing CRC */
-               total_rx_bytes += skb->len;
+               total_rx_bytes += (skb->len - 4); /* don't count FCS */
+               if (likely(!(netdev->features & NETIF_F_RXFCS)))
+                       pskb_trim(skb, skb->len - 4);
                total_rx_packets++;
 
                /* eth type trans needs skb->data to point to something */
@@ -4059,14 +4281,15 @@ static bool e1000_clean_rx_irq(struct e1000_adapter *adapter,
                        }
                }
 
-               /* adjust length to remove Ethernet CRC, this must be
-                * done after the TBI_ACCEPT workaround above */
-               length -= 4;
-
-               /* probably a little skewed due to removing CRC */
-               total_rx_bytes += length;
+               total_rx_bytes += (length - 4); /* don't count FCS */
                total_rx_packets++;
 
+               if (likely(!(netdev->features & NETIF_F_RXFCS)))
+                       /* adjust length to remove Ethernet CRC, this must be
+                        * done after the TBI_ACCEPT workaround above
+                        */
+                       length -= 4;
+
                e1000_check_copybreak(netdev, buffer_info, length, &skb);
 
                skb_put(skb, length);
index e1159e5..bac9dda 100644 (file)
@@ -1,7 +1,7 @@
 /*******************************************************************************
 
   Intel PRO/1000 Linux driver
-  Copyright(c) 1999 - 2011 Intel Corporation.
+  Copyright(c) 1999 - 2012 Intel Corporation.
 
   This program is free software; you can redistribute it and/or modify it
   under the terms and conditions of the GNU General Public License,
@@ -201,19 +201,23 @@ static s32 e1000_init_nvm_params_80003es2lan(struct e1000_hw *hw)
  *  e1000_init_mac_params_80003es2lan - Init ESB2 MAC func ptrs.
  *  @hw: pointer to the HW structure
  **/
-static s32 e1000_init_mac_params_80003es2lan(struct e1000_adapter *adapter)
+static s32 e1000_init_mac_params_80003es2lan(struct e1000_hw *hw)
 {
-       struct e1000_hw *hw = &adapter->hw;
        struct e1000_mac_info *mac = &hw->mac;
-       struct e1000_mac_operations *func = &mac->ops;
 
-       /* Set media type */
-       switch (adapter->pdev->device) {
+       /* Set media type and media-dependent function pointers */
+       switch (hw->adapter->pdev->device) {
        case E1000_DEV_ID_80003ES2LAN_SERDES_DPT:
                hw->phy.media_type = e1000_media_type_internal_serdes;
+               mac->ops.check_for_link = e1000e_check_for_serdes_link;
+               mac->ops.setup_physical_interface =
+                   e1000e_setup_fiber_serdes_link;
                break;
        default:
                hw->phy.media_type = e1000_media_type_copper;
+               mac->ops.check_for_link = e1000e_check_for_copper_link;
+               mac->ops.setup_physical_interface =
+                   e1000_setup_copper_link_80003es2lan;
                break;
        }
 
@@ -230,25 +234,6 @@ static s32 e1000_init_mac_params_80003es2lan(struct e1000_adapter *adapter)
        /* Adaptive IFS not supported */
        mac->adaptive_ifs = false;
 
-       /* check for link */
-       switch (hw->phy.media_type) {
-       case e1000_media_type_copper:
-               func->setup_physical_interface = e1000_setup_copper_link_80003es2lan;
-               func->check_for_link = e1000e_check_for_copper_link;
-               break;
-       case e1000_media_type_fiber:
-               func->setup_physical_interface = e1000e_setup_fiber_serdes_link;
-               func->check_for_link = e1000e_check_for_fiber_link;
-               break;
-       case e1000_media_type_internal_serdes:
-               func->setup_physical_interface = e1000e_setup_fiber_serdes_link;
-               func->check_for_link = e1000e_check_for_serdes_link;
-               break;
-       default:
-               return -E1000_ERR_CONFIG;
-               break;
-       }
-
        /* set lan id for port to determine which phy lock to use */
        hw->mac.ops.set_lan_id(hw);
 
@@ -260,7 +245,7 @@ static s32 e1000_get_variants_80003es2lan(struct e1000_adapter *adapter)
        struct e1000_hw *hw = &adapter->hw;
        s32 rc;
 
-       rc = e1000_init_mac_params_80003es2lan(adapter);
+       rc = e1000_init_mac_params_80003es2lan(hw);
        if (rc)
                return rc;
 
@@ -304,7 +289,7 @@ static void e1000_release_phy_80003es2lan(struct e1000_hw *hw)
 }
 
 /**
- *  e1000_acquire_mac_csr_80003es2lan - Acquire rights to access Kumeran register
+ *  e1000_acquire_mac_csr_80003es2lan - Acquire right to access Kumeran register
  *  @hw: pointer to the HW structure
  *
  *  Acquire the semaphore to access the Kumeran interface.
@@ -320,7 +305,7 @@ static s32 e1000_acquire_mac_csr_80003es2lan(struct e1000_hw *hw)
 }
 
 /**
- *  e1000_release_mac_csr_80003es2lan - Release rights to access Kumeran Register
+ *  e1000_release_mac_csr_80003es2lan - Release right to access Kumeran Register
  *  @hw: pointer to the HW structure
  *
  *  Release the semaphore used to access the Kumeran interface
@@ -473,7 +458,7 @@ static s32 e1000_read_phy_reg_gg82563_80003es2lan(struct e1000_hw *hw,
                return ret_val;
        }
 
-       if (hw->dev_spec.e80003es2lan.mdic_wa_enable == true) {
+       if (hw->dev_spec.e80003es2lan.mdic_wa_enable) {
                /*
                 * The "ready" bit in the MDIC register may be incorrectly set
                 * before the device has completed the "Page Select" MDI
@@ -485,9 +470,8 @@ static s32 e1000_read_phy_reg_gg82563_80003es2lan(struct e1000_hw *hw,
                ret_val = e1000e_read_phy_reg_mdic(hw, page_select, &temp);
 
                if (((u16)offset >> GG82563_PAGE_SHIFT) != temp) {
-                       ret_val = -E1000_ERR_PHY;
                        e1000_release_phy_80003es2lan(hw);
-                       return ret_val;
+                       return -E1000_ERR_PHY;
                }
 
                udelay(200);
@@ -545,7 +529,7 @@ static s32 e1000_write_phy_reg_gg82563_80003es2lan(struct e1000_hw *hw,
                return ret_val;
        }
 
-       if (hw->dev_spec.e80003es2lan.mdic_wa_enable == true) {
+       if (hw->dev_spec.e80003es2lan.mdic_wa_enable) {
                /*
                 * The "ready" bit in the MDIC register may be incorrectly set
                 * before the device has completed the "Page Select" MDI
@@ -667,8 +651,7 @@ static s32 e1000_phy_force_speed_duplex_80003es2lan(struct e1000_hw *hw)
        udelay(1);
 
        if (hw->phy.autoneg_wait_to_complete) {
-               e_dbg("Waiting for forced speed/duplex link "
-                        "on GG82563 phy.\n");
+               e_dbg("Waiting for forced speed/duplex link on GG82563 phy.\n");
 
                ret_val = e1000e_phy_has_link_generic(hw, PHY_FORCE_LIMIT,
                                                     100000, &link);
@@ -731,22 +714,19 @@ static s32 e1000_get_cable_length_80003es2lan(struct e1000_hw *hw)
 
        ret_val = e1e_rphy(hw, GG82563_PHY_DSP_DISTANCE, &phy_data);
        if (ret_val)
-               goto out;
+               return ret_val;
 
        index = phy_data & GG82563_DSPD_CABLE_LENGTH;
 
-       if (index >= GG82563_CABLE_LENGTH_TABLE_SIZE - 5) {
-               ret_val = -E1000_ERR_PHY;
-               goto out;
-       }
+       if (index >= GG82563_CABLE_LENGTH_TABLE_SIZE - 5)
+               return -E1000_ERR_PHY;
 
        phy->min_cable_length = e1000_gg82563_cable_length_table[index];
        phy->max_cable_length = e1000_gg82563_cable_length_table[index + 5];
 
        phy->cable_length = (phy->min_cable_length + phy->max_cable_length) / 2;
 
-out:
-       return ret_val;
+       return 0;
 }
 
 /**
@@ -820,9 +800,7 @@ static s32 e1000_reset_hw_80003es2lan(struct e1000_hw *hw)
        ew32(IMC, 0xffffffff);
        er32(ICR);
 
-       ret_val = e1000_check_alt_mac_addr_generic(hw);
-
-       return ret_val;
+       return e1000_check_alt_mac_addr_generic(hw);
 }
 
 /**
@@ -842,7 +820,7 @@ static s32 e1000_init_hw_80003es2lan(struct e1000_hw *hw)
        e1000_initialize_hw_bits_80003es2lan(hw);
 
        /* Initialize identification LED */
-       ret_val = e1000e_id_led_init(hw);
+       ret_val = mac->ops.id_led_init(hw);
        if (ret_val)
                e_dbg("Error initializing identification LED\n");
                /* This is not fatal and we should not stop init due to this */
@@ -860,7 +838,7 @@ static s32 e1000_init_hw_80003es2lan(struct e1000_hw *hw)
                E1000_WRITE_REG_ARRAY(hw, E1000_MTA, i, 0);
 
        /* Setup link and flow control */
-       ret_val = e1000e_setup_link(hw);
+       ret_val = mac->ops.setup_link(hw);
 
        /* Disable IBIST slave mode (far-end loopback) */
        e1000_read_kmrn_reg_80003es2lan(hw, E1000_KMRNCTRLSTA_INBAND_PARAM,
@@ -1078,7 +1056,7 @@ static s32 e1000_copper_link_setup_gg82563_80003es2lan(struct e1000_hw *hw)
         * firmware will have already initialized them.  We only initialize
         * them if the HW is not in IAMT mode.
         */
-       if (!e1000e_check_mng_mode(hw)) {
+       if (!hw->mac.ops.check_mng_mode(hw)) {
                /* Enable Electrical Idle on the PHY */
                data |= GG82563_PMCR_ENABLE_ELECTRICAL_IDLE;
                ret_val = e1e_wphy(hw, GG82563_PHY_PWR_MGMT_CTRL, data);
@@ -1163,9 +1141,7 @@ static s32 e1000_setup_copper_link_80003es2lan(struct e1000_hw *hw)
        if (ret_val)
                return ret_val;
 
-       ret_val = e1000e_setup_copper_link(hw);
-
-       return 0;
+       return e1000e_setup_copper_link(hw);
 }
 
 /**
@@ -1241,9 +1217,7 @@ static s32 e1000_cfg_kmrn_10_100_80003es2lan(struct e1000_hw *hw, u16 duplex)
        else
                reg_data &= ~GG82563_KMCR_PASS_FALSE_CARRIER;
 
-       ret_val = e1e_wphy(hw, GG82563_PHY_KMRN_MODE_CTRL, reg_data);
-
-       return 0;
+       return e1e_wphy(hw, GG82563_PHY_KMRN_MODE_CTRL, reg_data);
 }
 
 /**
@@ -1285,9 +1259,8 @@ static s32 e1000_cfg_kmrn_1000_80003es2lan(struct e1000_hw *hw)
        } while ((reg_data != reg_data2) && (i < GG82563_MAX_KMRN_RETRY));
 
        reg_data &= ~GG82563_KMCR_PASS_FALSE_CARRIER;
-       ret_val = e1e_wphy(hw, GG82563_PHY_KMRN_MODE_CTRL, reg_data);
 
-       return ret_val;
+       return e1e_wphy(hw, GG82563_PHY_KMRN_MODE_CTRL, reg_data);
 }
 
 /**
@@ -1372,12 +1345,9 @@ static s32 e1000_read_mac_addr_80003es2lan(struct e1000_hw *hw)
         */
        ret_val = e1000_check_alt_mac_addr_generic(hw);
        if (ret_val)
-               goto out;
-
-       ret_val = e1000_read_mac_addr_generic(hw);
+               return ret_val;
 
-out:
-       return ret_val;
+       return e1000_read_mac_addr_generic(hw);
 }
 
 /**
@@ -1443,7 +1413,7 @@ static void e1000_clear_hw_cntrs_80003es2lan(struct e1000_hw *hw)
 
 static const struct e1000_mac_operations es2_mac_ops = {
        .read_mac_addr          = e1000_read_mac_addr_80003es2lan,
-       .id_led_init            = e1000e_id_led_init,
+       .id_led_init            = e1000e_id_led_init_generic,
        .blink_led              = e1000e_blink_led_generic,
        .check_mng_mode         = e1000e_check_mng_mode_generic,
        /* check_for_link dependent on media type */
@@ -1459,9 +1429,10 @@ static const struct e1000_mac_operations es2_mac_ops = {
        .clear_vfta             = e1000_clear_vfta_generic,
        .reset_hw               = e1000_reset_hw_80003es2lan,
        .init_hw                = e1000_init_hw_80003es2lan,
-       .setup_link             = e1000e_setup_link,
+       .setup_link             = e1000e_setup_link_generic,
        /* setup_physical_interface dependent on media type */
        .setup_led              = e1000e_setup_led_generic,
+       .config_collision_dist  = e1000e_config_collision_dist_generic,
 };
 
 static const struct e1000_phy_operations es2_phy_ops = {
@@ -1486,6 +1457,7 @@ static const struct e1000_nvm_operations es2_nvm_ops = {
        .acquire                = e1000_acquire_nvm_80003es2lan,
        .read                   = e1000e_read_nvm_eerd,
        .release                = e1000_release_nvm_80003es2lan,
+       .reload                 = e1000e_reload_nvm_generic,
        .update                 = e1000e_update_nvm_checksum_generic,
        .valid_led_default      = e1000e_valid_led_default,
        .validate               = e1000e_validate_nvm_checksum_generic,
@@ -1502,8 +1474,7 @@ const struct e1000_info e1000_es2_info = {
                                  | FLAG_RX_NEEDS_RESTART /* errata */
                                  | FLAG_TARC_SET_BIT_ZERO /* errata */
                                  | FLAG_APME_CHECK_PORT_B
-                                 | FLAG_DISABLE_FC_PAUSE_TIME /* errata */
-                                 | FLAG_TIPG_MEDIUM_FOR_80003ESLAN,
+                                 | FLAG_DISABLE_FC_PAUSE_TIME, /* errata */
        .flags2                 = FLAG2_DMA_BURST,
        .pba                    = 38,
        .max_hw_frame_size      = DEFAULT_JUMBO,
index a3e65fd..b3fdc69 100644 (file)
@@ -1,7 +1,7 @@
 /*******************************************************************************
 
   Intel PRO/1000 Linux driver
-  Copyright(c) 1999 - 2011 Intel Corporation.
+  Copyright(c) 1999 - 2012 Intel Corporation.
 
   This program is free software; you can redistribute it and/or modify it
   under the terms and conditions of the GNU General Public License,
@@ -235,30 +235,42 @@ static s32 e1000_init_nvm_params_82571(struct e1000_hw *hw)
  *  e1000_init_mac_params_82571 - Init MAC func ptrs.
  *  @hw: pointer to the HW structure
  **/
-static s32 e1000_init_mac_params_82571(struct e1000_adapter *adapter)
+static s32 e1000_init_mac_params_82571(struct e1000_hw *hw)
 {
-       struct e1000_hw *hw = &adapter->hw;
        struct e1000_mac_info *mac = &hw->mac;
-       struct e1000_mac_operations *func = &mac->ops;
        u32 swsm = 0;
        u32 swsm2 = 0;
        bool force_clear_smbi = false;
 
-       /* Set media type */
-       switch (adapter->pdev->device) {
+       /* Set media type and media-dependent function pointers */
+       switch (hw->adapter->pdev->device) {
        case E1000_DEV_ID_82571EB_FIBER:
        case E1000_DEV_ID_82572EI_FIBER:
        case E1000_DEV_ID_82571EB_QUAD_FIBER:
                hw->phy.media_type = e1000_media_type_fiber;
+               mac->ops.setup_physical_interface =
+                   e1000_setup_fiber_serdes_link_82571;
+               mac->ops.check_for_link = e1000e_check_for_fiber_link;
+               mac->ops.get_link_up_info =
+                   e1000e_get_speed_and_duplex_fiber_serdes;
                break;
        case E1000_DEV_ID_82571EB_SERDES:
-       case E1000_DEV_ID_82572EI_SERDES:
        case E1000_DEV_ID_82571EB_SERDES_DUAL:
        case E1000_DEV_ID_82571EB_SERDES_QUAD:
+       case E1000_DEV_ID_82572EI_SERDES:
                hw->phy.media_type = e1000_media_type_internal_serdes;
+               mac->ops.setup_physical_interface =
+                   e1000_setup_fiber_serdes_link_82571;
+               mac->ops.check_for_link = e1000_check_for_serdes_link_82571;
+               mac->ops.get_link_up_info =
+                   e1000e_get_speed_and_duplex_fiber_serdes;
                break;
        default:
                hw->phy.media_type = e1000_media_type_copper;
+               mac->ops.setup_physical_interface =
+                   e1000_setup_copper_link_82571;
+               mac->ops.check_for_link = e1000e_check_for_copper_link;
+               mac->ops.get_link_up_info = e1000e_get_speed_and_duplex_copper;
                break;
        }
 
@@ -269,38 +281,13 @@ static s32 e1000_init_mac_params_82571(struct e1000_adapter *adapter)
        /* Adaptive IFS supported */
        mac->adaptive_ifs = true;
 
-       /* check for link */
-       switch (hw->phy.media_type) {
-       case e1000_media_type_copper:
-               func->setup_physical_interface = e1000_setup_copper_link_82571;
-               func->check_for_link = e1000e_check_for_copper_link;
-               func->get_link_up_info = e1000e_get_speed_and_duplex_copper;
-               break;
-       case e1000_media_type_fiber:
-               func->setup_physical_interface =
-                       e1000_setup_fiber_serdes_link_82571;
-               func->check_for_link = e1000e_check_for_fiber_link;
-               func->get_link_up_info =
-                       e1000e_get_speed_and_duplex_fiber_serdes;
-               break;
-       case e1000_media_type_internal_serdes:
-               func->setup_physical_interface =
-                       e1000_setup_fiber_serdes_link_82571;
-               func->check_for_link = e1000_check_for_serdes_link_82571;
-               func->get_link_up_info =
-                       e1000e_get_speed_and_duplex_fiber_serdes;
-               break;
-       default:
-               return -E1000_ERR_CONFIG;
-               break;
-       }
-
+       /* MAC-specific function pointers */
        switch (hw->mac.type) {
        case e1000_82573:
-               func->set_lan_id = e1000_set_lan_id_single_port;
-               func->check_mng_mode = e1000e_check_mng_mode_generic;
-               func->led_on = e1000e_led_on_generic;
-               func->blink_led = e1000e_blink_led_generic;
+               mac->ops.set_lan_id = e1000_set_lan_id_single_port;
+               mac->ops.check_mng_mode = e1000e_check_mng_mode_generic;
+               mac->ops.led_on = e1000e_led_on_generic;
+               mac->ops.blink_led = e1000e_blink_led_generic;
 
                /* FWSM register */
                mac->has_fwsm = true;
@@ -314,14 +301,14 @@ static s32 e1000_init_mac_params_82571(struct e1000_adapter *adapter)
                break;
        case e1000_82574:
        case e1000_82583:
-               func->set_lan_id = e1000_set_lan_id_single_port;
-               func->check_mng_mode = e1000_check_mng_mode_82574;
-               func->led_on = e1000_led_on_82574;
+               mac->ops.set_lan_id = e1000_set_lan_id_single_port;
+               mac->ops.check_mng_mode = e1000_check_mng_mode_82574;
+               mac->ops.led_on = e1000_led_on_82574;
                break;
        default:
-               func->check_mng_mode = e1000e_check_mng_mode_generic;
-               func->led_on = e1000e_led_on_generic;
-               func->blink_led = e1000e_blink_led_generic;
+               mac->ops.check_mng_mode = e1000e_check_mng_mode_generic;
+               mac->ops.led_on = e1000e_led_on_generic;
+               mac->ops.blink_led = e1000e_blink_led_generic;
 
                /* FWSM register */
                mac->has_fwsm = true;
@@ -342,11 +329,11 @@ static s32 e1000_init_mac_params_82571(struct e1000_adapter *adapter)
 
                if (!(swsm2 & E1000_SWSM2_LOCK)) {
                        /* Only do this for the first interface on this card */
-                       ew32(SWSM2,
-                           swsm2 | E1000_SWSM2_LOCK);
+                       ew32(SWSM2, swsm2 | E1000_SWSM2_LOCK);
                        force_clear_smbi = true;
-               } else
+               } else {
                        force_clear_smbi = false;
+               }
                break;
        default:
                force_clear_smbi = true;
@@ -383,7 +370,7 @@ static s32 e1000_get_variants_82571(struct e1000_adapter *adapter)
        int is_port_b = er32(STATUS) & E1000_STATUS_FUNC_1;
        s32 rc;
 
-       rc = e1000_init_mac_params_82571(adapter);
+       rc = e1000_init_mac_params_82571(hw);
        if (rc)
                return rc;
 
@@ -577,7 +564,6 @@ static void e1000_put_hw_semaphore_82571(struct e1000_hw *hw)
 static s32 e1000_get_hw_semaphore_82573(struct e1000_hw *hw)
 {
        u32 extcnf_ctrl;
-       s32 ret_val = 0;
        s32 i = 0;
 
        extcnf_ctrl = er32(EXTCNF_CTRL);
@@ -599,12 +585,10 @@ static s32 e1000_get_hw_semaphore_82573(struct e1000_hw *hw)
                /* Release semaphores */
                e1000_put_hw_semaphore_82573(hw);
                e_dbg("Driver can't access the PHY\n");
-               ret_val = -E1000_ERR_PHY;
-               goto out;
+               return -E1000_ERR_PHY;
        }
 
-out:
-       return ret_val;
+       return 0;
 }
 
 /**
@@ -809,7 +793,7 @@ static s32 e1000_update_nvm_checksum_82571(struct e1000_hw *hw)
         * otherwise, commit the checksum to the flash NVM.
         */
        if (hw->nvm.type != e1000_nvm_flash_hw)
-               return ret_val;
+               return 0;
 
        /* Check for pending operations. */
        for (i = 0; i < E1000_FLASH_UPDATES; i++) {
@@ -1134,7 +1118,7 @@ static s32 e1000_init_hw_82571(struct e1000_hw *hw)
        e1000_initialize_hw_bits_82571(hw);
 
        /* Initialize identification LED */
-       ret_val = e1000e_id_led_init(hw);
+       ret_val = mac->ops.id_led_init(hw);
        if (ret_val)
                e_dbg("Error initializing identification LED\n");
                /* This is not fatal and we should not stop init due to this */
@@ -1159,7 +1143,7 @@ static s32 e1000_init_hw_82571(struct e1000_hw *hw)
                E1000_WRITE_REG_ARRAY(hw, E1000_MTA, i, 0);
 
        /* Setup link and flow control */
-       ret_val = e1000_setup_link_82571(hw);
+       ret_val = mac->ops.setup_link(hw);
 
        /* Set the transmit descriptor write-back policy */
        reg_data = er32(TXDCTL(0));
@@ -1227,6 +1211,10 @@ static void e1000_initialize_hw_bits_82571(struct e1000_hw *hw)
        case e1000_82572:
                reg |= (1 << 23) | (1 << 24) | (1 << 25) | (1 << 26);
                break;
+       case e1000_82574:
+       case e1000_82583:
+               reg |= (1 << 26);
+               break;
        default:
                break;
        }
@@ -1281,18 +1269,16 @@ static void e1000_initialize_hw_bits_82571(struct e1000_hw *hw)
                reg |= E1000_PBA_ECC_CORR_EN;
                ew32(PBA_ECC, reg);
        }
+
        /*
         * Workaround for hardware errata.
         * Ensure that DMA Dynamic Clock gating is disabled on 82571 and 82572
         */
-
-        if ((hw->mac.type == e1000_82571) ||
-           (hw->mac.type == e1000_82572)) {
-                reg = er32(CTRL_EXT);
-                reg &= ~E1000_CTRL_EXT_DMA_DYN_CLK_EN;
-                ew32(CTRL_EXT, reg);
-        }
-
+       if ((hw->mac.type == e1000_82571) || (hw->mac.type == e1000_82572)) {
+               reg = er32(CTRL_EXT);
+               reg &= ~E1000_CTRL_EXT_DMA_DYN_CLK_EN;
+               ew32(CTRL_EXT, reg);
+       }
 
        /* PCI-Ex Control Registers */
        switch (hw->mac.type) {
@@ -1418,7 +1404,6 @@ bool e1000_check_phy_82574(struct e1000_hw *hw)
 {
        u16 status_1kbt = 0;
        u16 receive_errors = 0;
-       bool phy_hung = false;
        s32 ret_val = 0;
 
        /*
@@ -1426,19 +1411,18 @@ bool e1000_check_phy_82574(struct e1000_hw *hw)
         * read the Base1000T status register If both are max then PHY is hung.
         */
        ret_val = e1e_rphy(hw, E1000_RECEIVE_ERROR_COUNTER, &receive_errors);
-
        if (ret_val)
-               goto out;
+               return false;
        if (receive_errors == E1000_RECEIVE_ERROR_MAX)  {
                ret_val = e1e_rphy(hw, E1000_BASE1000T_STATUS, &status_1kbt);
                if (ret_val)
-                       goto out;
+                       return false;
                if ((status_1kbt & E1000_IDLE_ERROR_COUNT_MASK) ==
                    E1000_IDLE_ERROR_COUNT_MASK)
-                       phy_hung = true;
+                       return true;
        }
-out:
-       return phy_hung;
+
+       return false;
 }
 
 /**
@@ -1469,7 +1453,7 @@ static s32 e1000_setup_link_82571(struct e1000_hw *hw)
                break;
        }
 
-       return e1000e_setup_link(hw);
+       return e1000e_setup_link_generic(hw);
 }
 
 /**
@@ -1506,9 +1490,7 @@ static s32 e1000_setup_copper_link_82571(struct e1000_hw *hw)
        if (ret_val)
                return ret_val;
 
-       ret_val = e1000e_setup_copper_link(hw);
-
-       return ret_val;
+       return e1000e_setup_copper_link(hw);
 }
 
 /**
@@ -1842,9 +1824,9 @@ static s32 e1000_fix_nvm_checksum_82571(struct e1000_hw *hw)
  **/
 static s32 e1000_read_mac_addr_82571(struct e1000_hw *hw)
 {
-       s32 ret_val = 0;
-
        if (hw->mac.type == e1000_82571) {
+               s32 ret_val = 0;
+
                /*
                 * If there's an alternate MAC address place it in RAR0
                 * so that it will override the Si installed default perm
@@ -1852,13 +1834,10 @@ static s32 e1000_read_mac_addr_82571(struct e1000_hw *hw)
                 */
                ret_val = e1000_check_alt_mac_addr_generic(hw);
                if (ret_val)
-                       goto out;
+                       return ret_val;
        }
 
-       ret_val = e1000_read_mac_addr_generic(hw);
-
-out:
-       return ret_val;
+       return e1000_read_mac_addr_generic(hw);
 }
 
 /**
@@ -1873,7 +1852,7 @@ static void e1000_power_down_phy_copper_82571(struct e1000_hw *hw)
        struct e1000_phy_info *phy = &hw->phy;
        struct e1000_mac_info *mac = &hw->mac;
 
-       if (!(phy->ops.check_reset_block))
+       if (!phy->ops.check_reset_block)
                return;
 
        /* If the management interface is not enabled, then power down */
@@ -1930,7 +1909,7 @@ static void e1000_clear_hw_cntrs_82571(struct e1000_hw *hw)
 static const struct e1000_mac_operations e82571_mac_ops = {
        /* .check_mng_mode: mac type dependent */
        /* .check_for_link: media type dependent */
-       .id_led_init            = e1000e_id_led_init,
+       .id_led_init            = e1000e_id_led_init_generic,
        .cleanup_led            = e1000e_cleanup_led_generic,
        .clear_hw_cntrs         = e1000_clear_hw_cntrs_82571,
        .get_bus_info           = e1000e_get_bus_info_pcie,
@@ -1946,6 +1925,7 @@ static const struct e1000_mac_operations e82571_mac_ops = {
        .setup_link             = e1000_setup_link_82571,
        /* .setup_physical_interface: media type dependent */
        .setup_led              = e1000e_setup_led_generic,
+       .config_collision_dist  = e1000e_config_collision_dist_generic,
        .read_mac_addr          = e1000_read_mac_addr_82571,
 };
 
@@ -2007,6 +1987,7 @@ static const struct e1000_nvm_operations e82571_nvm_ops = {
        .acquire                = e1000_acquire_nvm_82571,
        .read                   = e1000e_read_nvm_eerd,
        .release                = e1000_release_nvm_82571,
+       .reload                 = e1000e_reload_nvm_generic,
        .update                 = e1000_update_nvm_checksum_82571,
        .valid_led_default      = e1000_valid_led_default_82571,
        .validate               = e1000_validate_nvm_checksum_82571,
index 948c05d..591b713 100644 (file)
@@ -1,7 +1,7 @@
 ################################################################################
 #
 # Intel PRO/1000 Linux driver
-# Copyright(c) 1999 - 2011 Intel Corporation.
+# Copyright(c) 1999 - 2012 Intel Corporation.
 #
 # This program is free software; you can redistribute it and/or modify it
 # under the terms and conditions of the GNU General Public License,
@@ -33,5 +33,6 @@
 obj-$(CONFIG_E1000E) += e1000e.o
 
 e1000e-objs := 82571.o ich8lan.o 80003es2lan.o \
-              lib.o phy.o param.o ethtool.o netdev.o
+              mac.o manage.o nvm.o phy.o \
+              param.o ethtool.o netdev.o
 
index c516a74..3a50259 100644 (file)
@@ -1,7 +1,7 @@
 /*******************************************************************************
 
   Intel PRO/1000 Linux driver
-  Copyright(c) 1999 - 2011 Intel Corporation.
+  Copyright(c) 1999 - 2012 Intel Corporation.
 
   This program is free software; you can redistribute it and/or modify it
   under the terms and conditions of the GNU General Public License,
     E1000_RXDEXT_STATERR_CXE |            \
     E1000_RXDEXT_STATERR_RXE)
 
+#define E1000_MRQC_RSS_FIELD_MASK              0xFFFF0000
+#define E1000_MRQC_RSS_FIELD_IPV4_TCP          0x00010000
+#define E1000_MRQC_RSS_FIELD_IPV4              0x00020000
+#define E1000_MRQC_RSS_FIELD_IPV6_TCP_EX       0x00040000
+#define E1000_MRQC_RSS_FIELD_IPV6              0x00100000
+#define E1000_MRQC_RSS_FIELD_IPV6_TCP          0x00200000
+
 #define E1000_RXDPS_HDRSTAT_HDRSP              0x00008000
 
 /* Management Control */
 #define E1000_RCTL_VFE            0x00040000    /* vlan filter enable */
 #define E1000_RCTL_CFIEN          0x00080000    /* canonical form enable */
 #define E1000_RCTL_CFI            0x00100000    /* canonical form indicator */
+#define E1000_RCTL_DPF            0x00400000    /* Discard Pause Frames */
 #define E1000_RCTL_PMCF           0x00800000    /* pass MAC control frames */
 #define E1000_RCTL_BSEX           0x02000000    /* Buffer size extension */
 #define E1000_RCTL_SECRC          0x04000000    /* Strip Ethernet CRC */
 /* Receive Checksum Control */
 #define E1000_RXCSUM_TUOFL     0x00000200   /* TCP / UDP checksum offload */
 #define E1000_RXCSUM_IPPCSE    0x00001000   /* IP payload checksum enable */
+#define E1000_RXCSUM_PCSD      0x00002000   /* packet checksum disabled */
 
 /* Header split receive */
 #define E1000_RFCTL_NFSW_DIS            0x00000040
index f478a22..86cdd47 100644 (file)
@@ -1,7 +1,7 @@
 /*******************************************************************************
 
   Intel PRO/1000 Linux driver
-  Copyright(c) 1999 - 2011 Intel Corporation.
+  Copyright(c) 1999 - 2012 Intel Corporation.
 
   This program is free software; you can redistribute it and/or modify it
   under the terms and conditions of the GNU General Public License,
@@ -234,6 +234,7 @@ struct e1000_buffer {
 };
 
 struct e1000_ring {
+       struct e1000_adapter *adapter;  /* back pointer to adapter */
        void *desc;                     /* pointer to ring memory  */
        dma_addr_t dma;                 /* phys address of ring    */
        unsigned int size;              /* length of ring in bytes */
@@ -242,8 +243,8 @@ struct e1000_ring {
        u16 next_to_use;
        u16 next_to_clean;
 
-       u16 head;
-       u16 tail;
+       void __iomem *head;
+       void __iomem *tail;
 
        /* array of buffer information structs */
        struct e1000_buffer *buffer_info;
@@ -251,7 +252,7 @@ struct e1000_ring {
        char name[IFNAMSIZ + 5];
        u32 ims_val;
        u32 itr_val;
-       u16 itr_register;
+       void __iomem *itr_register;
        int set_itr;
 
        struct sk_buff *rx_skb_top;
@@ -334,11 +335,10 @@ struct e1000_adapter {
        /*
         * Rx
         */
-       bool (*clean_rx) (struct e1000_adapter *adapter,
-                         int *work_done, int work_to_do)
-                                               ____cacheline_aligned_in_smp;
-       void (*alloc_rx_buf) (struct e1000_adapter *adapter,
-                             int cleaned_count, gfp_t gfp);
+       bool (*clean_rx) (struct e1000_ring *ring, int *work_done,
+                         int work_to_do) ____cacheline_aligned_in_smp;
+       void (*alloc_rx_buf) (struct e1000_ring *ring, int cleaned_count,
+                             gfp_t gfp);
        struct e1000_ring *rx_ring;
 
        u32 rx_int_delay;
@@ -398,6 +398,9 @@ struct e1000_adapter {
 
        bool idle_check;
        int phy_hang_count;
+
+       u16 tx_ring_count;
+       u16 rx_ring_count;
 };
 
 struct e1000_info {
@@ -417,7 +420,7 @@ struct e1000_info {
 #define FLAG_HAS_FLASH                    (1 << 1)
 #define FLAG_HAS_HW_VLAN_FILTER           (1 << 2)
 #define FLAG_HAS_WOL                      (1 << 3)
-#define FLAG_HAS_ERT                      (1 << 4)
+/* reserved bit4 */
 #define FLAG_HAS_CTRLEXT_ON_LOAD          (1 << 5)
 #define FLAG_HAS_SWSM_ON_LOAD             (1 << 6)
 #define FLAG_HAS_JUMBO_FRAMES             (1 << 7)
@@ -427,7 +430,7 @@ struct e1000_info {
 #define FLAG_HAS_SMART_POWER_DOWN         (1 << 11)
 #define FLAG_IS_QUAD_PORT_A               (1 << 12)
 #define FLAG_IS_QUAD_PORT                 (1 << 13)
-#define FLAG_TIPG_MEDIUM_FOR_80003ESLAN   (1 << 14)
+/* reserved bit14 */
 #define FLAG_APME_IN_WUC                  (1 << 15)
 #define FLAG_APME_IN_CTRL3                (1 << 16)
 #define FLAG_APME_CHECK_PORT_B            (1 << 17)
@@ -458,6 +461,7 @@ struct e1000_info {
 #define FLAG2_CHECK_PHY_HANG              (1 << 9)
 #define FLAG2_NO_DISABLE_RX               (1 << 10)
 #define FLAG2_PCIM2PCI_ARBITER_WA         (1 << 11)
+#define FLAG2_DFLT_CRC_STRIPPING          (1 << 12)
 
 #define E1000_RX_DESC_PS(R, i)     \
        (&(((union e1000_rx_desc_packet_split *)((R).desc))[i]))
@@ -492,10 +496,10 @@ extern void e1000e_down(struct e1000_adapter *adapter);
 extern void e1000e_reinit_locked(struct e1000_adapter *adapter);
 extern void e1000e_reset(struct e1000_adapter *adapter);
 extern void e1000e_power_up_phy(struct e1000_adapter *adapter);
-extern int e1000e_setup_rx_resources(struct e1000_adapter *adapter);
-extern int e1000e_setup_tx_resources(struct e1000_adapter *adapter);
-extern void e1000e_free_rx_resources(struct e1000_adapter *adapter);
-extern void e1000e_free_tx_resources(struct e1000_adapter *adapter);
+extern int e1000e_setup_rx_resources(struct e1000_ring *ring);
+extern int e1000e_setup_tx_resources(struct e1000_ring *ring);
+extern void e1000e_free_rx_resources(struct e1000_ring *ring);
+extern void e1000e_free_tx_resources(struct e1000_ring *ring);
 extern struct rtnl_link_stats64 *e1000e_get_stats64(struct net_device *netdev,
                                                     struct rtnl_link_stats64
                                                     *stats);
@@ -555,12 +559,12 @@ extern s32 e1000e_get_speed_and_duplex_copper(struct e1000_hw *hw, u16 *speed, u
 extern s32 e1000e_get_speed_and_duplex_fiber_serdes(struct e1000_hw *hw, u16 *speed, u16 *duplex);
 extern s32 e1000e_disable_pcie_master(struct e1000_hw *hw);
 extern s32 e1000e_get_auto_rd_done(struct e1000_hw *hw);
-extern s32 e1000e_id_led_init(struct e1000_hw *hw);
+extern s32 e1000e_id_led_init_generic(struct e1000_hw *hw);
 extern void e1000e_clear_hw_cntrs_base(struct e1000_hw *hw);
 extern s32 e1000e_setup_fiber_serdes_link(struct e1000_hw *hw);
 extern s32 e1000e_copper_link_setup_m88(struct e1000_hw *hw);
 extern s32 e1000e_copper_link_setup_igp(struct e1000_hw *hw);
-extern s32 e1000e_setup_link(struct e1000_hw *hw);
+extern s32 e1000e_setup_link_generic(struct e1000_hw *hw);
 extern void e1000_clear_vfta_generic(struct e1000_hw *hw);
 extern void e1000e_init_rx_addrs(struct e1000_hw *hw, u16 rar_count);
 extern void e1000e_update_mc_addr_list_generic(struct e1000_hw *hw,
@@ -571,7 +575,7 @@ extern s32 e1000e_set_fc_watermarks(struct e1000_hw *hw);
 extern void e1000e_set_pcie_no_snoop(struct e1000_hw *hw, u32 no_snoop);
 extern s32 e1000e_get_hw_semaphore(struct e1000_hw *hw);
 extern s32 e1000e_valid_led_default(struct e1000_hw *hw, u16 *data);
-extern void e1000e_config_collision_dist(struct e1000_hw *hw);
+extern void e1000e_config_collision_dist_generic(struct e1000_hw *hw);
 extern s32 e1000e_config_fc_after_link_up(struct e1000_hw *hw);
 extern s32 e1000e_force_mac_fc(struct e1000_hw *hw);
 extern s32 e1000e_blink_led_generic(struct e1000_hw *hw);
@@ -658,11 +662,6 @@ static inline s32 e1000_phy_hw_reset(struct e1000_hw *hw)
        return hw->phy.ops.reset(hw);
 }
 
-static inline s32 e1000_check_reset_block(struct e1000_hw *hw)
-{
-       return hw->phy.ops.check_reset_block(hw);
-}
-
 static inline s32 e1e_rphy(struct e1000_hw *hw, u32 offset, u16 *data)
 {
        return hw->phy.ops.read_reg(hw, offset, data);
@@ -685,7 +684,7 @@ extern s32 e1000e_poll_eerd_eewr_done(struct e1000_hw *hw, int ee_reg);
 extern s32 e1000e_read_nvm_eerd(struct e1000_hw *hw, u16 offset, u16 words, u16 *data);
 extern s32 e1000e_validate_nvm_checksum_generic(struct e1000_hw *hw);
 extern void e1000e_release_nvm(struct e1000_hw *hw);
-extern void e1000e_reload_nvm(struct e1000_hw *hw);
+extern void e1000e_reload_nvm_generic(struct e1000_hw *hw);
 extern s32 e1000_read_mac_addr_generic(struct e1000_hw *hw);
 
 static inline s32 e1000e_read_mac_addr(struct e1000_hw *hw)
@@ -721,11 +720,6 @@ static inline s32 e1000_get_phy_info(struct e1000_hw *hw)
        return hw->phy.ops.get_info(hw);
 }
 
-static inline s32 e1000e_check_mng_mode(struct e1000_hw *hw)
-{
-       return hw->mac.ops.check_mng_mode(hw);
-}
-
 extern bool e1000e_check_mng_mode_generic(struct e1000_hw *hw);
 extern bool e1000e_enable_tx_pkt_filtering(struct e1000_hw *hw);
 extern s32 e1000e_mng_write_dhcp_info(struct e1000_hw *hw, u8 *buffer, u16 length);
index fb2c28e..db35dd5 100644 (file)
@@ -1,7 +1,7 @@
 /*******************************************************************************
 
   Intel PRO/1000 Linux driver
-  Copyright(c) 1999 - 2011 Intel Corporation.
+  Copyright(c) 1999 - 2012 Intel Corporation.
 
   This program is free software; you can redistribute it and/or modify it
   under the terms and conditions of the GNU General Public License,
@@ -34,6 +34,7 @@
 #include <linux/pci.h>
 #include <linux/slab.h>
 #include <linux/delay.h>
+#include <linux/vmalloc.h>
 
 #include "e1000.h"
 
@@ -257,7 +258,7 @@ static int e1000_set_settings(struct net_device *netdev,
         * When SoL/IDER sessions are active, autoneg/speed/duplex
         * cannot be changed
         */
-       if (e1000_check_reset_block(hw)) {
+       if (hw->phy.ops.check_reset_block(hw)) {
                e_err("Cannot change link characteristics when SoL/IDER is "
                      "active.\n");
                return -EINVAL;
@@ -536,7 +537,7 @@ static int e1000_set_eeprom(struct net_device *netdev,
                ret_val = e1000_read_nvm(hw, first_word, 1, &eeprom_buff[0]);
                ptr++;
        }
-       if (((eeprom->offset + eeprom->len) & 1) && (ret_val == 0))
+       if (((eeprom->offset + eeprom->len) & 1) && (!ret_val))
                /* need read/modify/write of last changed EEPROM word */
                /* only the first byte of the word is being modified */
                ret_val = e1000_read_nvm(hw, last_word, 1,
@@ -552,7 +553,7 @@ static int e1000_set_eeprom(struct net_device *netdev,
        memcpy(ptr, bytes, eeprom->len);
 
        for (i = 0; i < last_word - first_word + 1; i++)
-               eeprom_buff[i] = cpu_to_le16(eeprom_buff[i]);
+               cpu_to_le16s(&eeprom_buff[i]);
 
        ret_val = e1000_write_nvm(hw, first_word,
                                  last_word - first_word + 1, eeprom_buff);
@@ -605,94 +606,112 @@ static void e1000_get_ringparam(struct net_device *netdev,
                                struct ethtool_ringparam *ring)
 {
        struct e1000_adapter *adapter = netdev_priv(netdev);
-       struct e1000_ring *tx_ring = adapter->tx_ring;
-       struct e1000_ring *rx_ring = adapter->rx_ring;
 
        ring->rx_max_pending = E1000_MAX_RXD;
        ring->tx_max_pending = E1000_MAX_TXD;
-       ring->rx_pending = rx_ring->count;
-       ring->tx_pending = tx_ring->count;
+       ring->rx_pending = adapter->rx_ring_count;
+       ring->tx_pending = adapter->tx_ring_count;
 }
 
 static int e1000_set_ringparam(struct net_device *netdev,
                               struct ethtool_ringparam *ring)
 {
        struct e1000_adapter *adapter = netdev_priv(netdev);
-       struct e1000_ring *tx_ring, *tx_old;
-       struct e1000_ring *rx_ring, *rx_old;
-       int err;
+       struct e1000_ring *temp_tx = NULL, *temp_rx = NULL;
+       int err = 0, size = sizeof(struct e1000_ring);
+       bool set_tx = false, set_rx = false;
+       u16 new_rx_count, new_tx_count;
 
        if ((ring->rx_mini_pending) || (ring->rx_jumbo_pending))
                return -EINVAL;
 
-       while (test_and_set_bit(__E1000_RESETTING, &adapter->state))
-               usleep_range(1000, 2000);
+       new_rx_count = clamp_t(u32, ring->rx_pending, E1000_MIN_RXD,
+                              E1000_MAX_RXD);
+       new_rx_count = ALIGN(new_rx_count, REQ_RX_DESCRIPTOR_MULTIPLE);
 
-       if (netif_running(adapter->netdev))
-               e1000e_down(adapter);
+       new_tx_count = clamp_t(u32, ring->tx_pending, E1000_MIN_TXD,
+                              E1000_MAX_TXD);
+       new_tx_count = ALIGN(new_tx_count, REQ_TX_DESCRIPTOR_MULTIPLE);
 
-       tx_old = adapter->tx_ring;
-       rx_old = adapter->rx_ring;
+       if ((new_tx_count == adapter->tx_ring_count) &&
+           (new_rx_count == adapter->rx_ring_count))
+               /* nothing to do */
+               return 0;
 
-       err = -ENOMEM;
-       tx_ring = kmemdup(tx_old, sizeof(struct e1000_ring), GFP_KERNEL);
-       if (!tx_ring)
-               goto err_alloc_tx;
+       while (test_and_set_bit(__E1000_RESETTING, &adapter->state))
+               usleep_range(1000, 2000);
 
-       rx_ring = kmemdup(rx_old, sizeof(struct e1000_ring), GFP_KERNEL);
-       if (!rx_ring)
-               goto err_alloc_rx;
+       if (!netif_running(adapter->netdev)) {
+               /* Set counts now and allocate resources during open() */
+               adapter->tx_ring->count = new_tx_count;
+               adapter->rx_ring->count = new_rx_count;
+               adapter->tx_ring_count = new_tx_count;
+               adapter->rx_ring_count = new_rx_count;
+               goto clear_reset;
+       }
 
-       adapter->tx_ring = tx_ring;
-       adapter->rx_ring = rx_ring;
+       set_tx = (new_tx_count != adapter->tx_ring_count);
+       set_rx = (new_rx_count != adapter->rx_ring_count);
 
-       rx_ring->count = max(ring->rx_pending, (u32)E1000_MIN_RXD);
-       rx_ring->count = min(rx_ring->count, (u32)(E1000_MAX_RXD));
-       rx_ring->count = ALIGN(rx_ring->count, REQ_RX_DESCRIPTOR_MULTIPLE);
+       /* Allocate temporary storage for ring updates */
+       if (set_tx) {
+               temp_tx = vmalloc(size);
+               if (!temp_tx) {
+                       err = -ENOMEM;
+                       goto free_temp;
+               }
+       }
+       if (set_rx) {
+               temp_rx = vmalloc(size);
+               if (!temp_rx) {
+                       err = -ENOMEM;
+                       goto free_temp;
+               }
+       }
 
-       tx_ring->count = max(ring->tx_pending, (u32)E1000_MIN_TXD);
-       tx_ring->count = min(tx_ring->count, (u32)(E1000_MAX_TXD));
-       tx_ring->count = ALIGN(tx_ring->count, REQ_TX_DESCRIPTOR_MULTIPLE);
+       e1000e_down(adapter);
 
-       if (netif_running(adapter->netdev)) {
-               /* Try to get new resources before deleting old */
-               err = e1000e_setup_rx_resources(adapter);
+       /*
+        * We can't just free everything and then setup again, because the
+        * ISRs in MSI-X mode get passed pointers to the Tx and Rx ring
+        * structs.  First, attempt to allocate new resources...
+        */
+       if (set_tx) {
+               memcpy(temp_tx, adapter->tx_ring, size);
+               temp_tx->count = new_tx_count;
+               err = e1000e_setup_tx_resources(temp_tx);
                if (err)
-                       goto err_setup_rx;
-               err = e1000e_setup_tx_resources(adapter);
+                       goto err_setup;
+       }
+       if (set_rx) {
+               memcpy(temp_rx, adapter->rx_ring, size);
+               temp_rx->count = new_rx_count;
+               err = e1000e_setup_rx_resources(temp_rx);
                if (err)
-                       goto err_setup_tx;
+                       goto err_setup_rx;
+       }
 
-               /*
-                * restore the old in order to free it,
-                * then add in the new
-                */
-               adapter->rx_ring = rx_old;
-               adapter->tx_ring = tx_old;
-               e1000e_free_rx_resources(adapter);
-               e1000e_free_tx_resources(adapter);
-               kfree(tx_old);
-               kfree(rx_old);
-               adapter->rx_ring = rx_ring;
-               adapter->tx_ring = tx_ring;
-               err = e1000e_up(adapter);
-               if (err)
-                       goto err_setup;
+       /* ...then free the old resources and copy back any new ring data */
+       if (set_tx) {
+               e1000e_free_tx_resources(adapter->tx_ring);
+               memcpy(adapter->tx_ring, temp_tx, size);
+               adapter->tx_ring_count = new_tx_count;
+       }
+       if (set_rx) {
+               e1000e_free_rx_resources(adapter->rx_ring);
+               memcpy(adapter->rx_ring, temp_rx, size);
+               adapter->rx_ring_count = new_rx_count;
        }
 
-       clear_bit(__E1000_RESETTING, &adapter->state);
-       return 0;
-err_setup_tx:
-       e1000e_free_rx_resources(adapter);
 err_setup_rx:
-       adapter->rx_ring = rx_old;
-       adapter->tx_ring = tx_old;
-       kfree(rx_ring);
-err_alloc_rx:
-       kfree(tx_ring);
-err_alloc_tx:
-       e1000e_up(adapter);
+       if (err && set_tx)
+               e1000e_free_tx_resources(temp_tx);
 err_setup:
+       e1000e_up(adapter);
+free_temp:
+       vfree(temp_tx);
+       vfree(temp_rx);
+clear_reset:
        clear_bit(__E1000_RESETTING, &adapter->state);
        return err;
 }
@@ -1069,7 +1088,7 @@ static int e1000_setup_desc_rings(struct e1000_adapter *adapter)
        tx_ring->buffer_info = kcalloc(tx_ring->count,
                                       sizeof(struct e1000_buffer),
                                       GFP_KERNEL);
-       if (!(tx_ring->buffer_info)) {
+       if (!tx_ring->buffer_info) {
                ret_val = 1;
                goto err_nomem;
        }
@@ -1131,7 +1150,7 @@ static int e1000_setup_desc_rings(struct e1000_adapter *adapter)
        rx_ring->buffer_info = kcalloc(rx_ring->count,
                                       sizeof(struct e1000_buffer),
                                       GFP_KERNEL);
-       if (!(rx_ring->buffer_info)) {
+       if (!rx_ring->buffer_info) {
                ret_val = 5;
                goto err_nomem;
        }
@@ -1579,11 +1598,13 @@ static int e1000_run_loopback_test(struct e1000_adapter *adapter)
 
 static int e1000_loopback_test(struct e1000_adapter *adapter, u64 *data)
 {
+       struct e1000_hw *hw = &adapter->hw;
+
        /*
         * PHY loopback cannot be performed if SoL/IDER
         * sessions are active
         */
-       if (e1000_check_reset_block(&adapter->hw)) {
+       if (hw->phy.ops.check_reset_block(hw)) {
                e_err("Cannot do PHY loopback test when SoL/IDER is active.\n");
                *data = 0;
                goto out;
@@ -1837,11 +1858,11 @@ static int e1000_set_phys_id(struct net_device *netdev,
                break;
 
        case ETHTOOL_ID_ON:
-               adapter->hw.mac.ops.led_on(&adapter->hw);
+               hw->mac.ops.led_on(hw);
                break;
 
        case ETHTOOL_ID_OFF:
-               adapter->hw.mac.ops.led_off(&adapter->hw);
+               hw->mac.ops.led_off(hw);
                break;
        }
        return 0;
@@ -1955,6 +1976,53 @@ static void e1000_get_strings(struct net_device *netdev, u32 stringset,
        }
 }
 
+static int e1000_get_rxnfc(struct net_device *netdev,
+                          struct ethtool_rxnfc *info, u32 *rule_locs)
+{
+       info->data = 0;
+
+       switch (info->cmd) {
+       case ETHTOOL_GRXFH: {
+               struct e1000_adapter *adapter = netdev_priv(netdev);
+               struct e1000_hw *hw = &adapter->hw;
+               u32 mrqc = er32(MRQC);
+
+               if (!(mrqc & E1000_MRQC_RSS_FIELD_MASK))
+                       return 0;
+
+               switch (info->flow_type) {
+               case TCP_V4_FLOW:
+                       if (mrqc & E1000_MRQC_RSS_FIELD_IPV4_TCP)
+                               info->data |= RXH_L4_B_0_1 | RXH_L4_B_2_3;
+                       /* fall through */
+               case UDP_V4_FLOW:
+               case SCTP_V4_FLOW:
+               case AH_ESP_V4_FLOW:
+               case IPV4_FLOW:
+                       if (mrqc & E1000_MRQC_RSS_FIELD_IPV4)
+                               info->data |= RXH_IP_SRC | RXH_IP_DST;
+                       break;
+               case TCP_V6_FLOW:
+                       if (mrqc & E1000_MRQC_RSS_FIELD_IPV6_TCP)
+                               info->data |= RXH_L4_B_0_1 | RXH_L4_B_2_3;
+                       /* fall through */
+               case UDP_V6_FLOW:
+               case SCTP_V6_FLOW:
+               case AH_ESP_V6_FLOW:
+               case IPV6_FLOW:
+                       if (mrqc & E1000_MRQC_RSS_FIELD_IPV6)
+                               info->data |= RXH_IP_SRC | RXH_IP_DST;
+                       break;
+               default:
+                       break;
+               }
+               return 0;
+       }
+       default:
+               return -EOPNOTSUPP;
+       }
+}
+
 static const struct ethtool_ops e1000_ethtool_ops = {
        .get_settings           = e1000_get_settings,
        .set_settings           = e1000_set_settings,
@@ -1981,6 +2049,7 @@ static const struct ethtool_ops e1000_ethtool_ops = {
        .get_sset_count         = e1000e_get_sset_count,
        .get_coalesce           = e1000_get_coalesce,
        .set_coalesce           = e1000_set_coalesce,
+       .get_rxnfc              = e1000_get_rxnfc,
 };
 
 void e1000e_set_ethtool_ops(struct net_device *netdev)
index 2967039..f82ecf5 100644 (file)
@@ -1,7 +1,7 @@
 /*******************************************************************************
 
   Intel PRO/1000 Linux driver
-  Copyright(c) 1999 - 2011 Intel Corporation.
+  Copyright(c) 1999 - 2012 Intel Corporation.
 
   This program is free software; you can redistribute it and/or modify it
   under the terms and conditions of the GNU General Public License,
@@ -204,6 +204,7 @@ enum e1e_registers {
        E1000_WUC      = 0x05800, /* Wakeup Control - RW */
        E1000_WUFC     = 0x05808, /* Wakeup Filter Control - RW */
        E1000_WUS      = 0x05810, /* Wakeup Status - RO */
+       E1000_MRQC     = 0x05818, /* Multiple Receive Control - RW */
        E1000_MANC     = 0x05820, /* Management Control - RW */
        E1000_FFLT     = 0x05F00, /* Flexible Filter Length Table - RW Array */
        E1000_HOST_IF  = 0x08800, /* Host Interface */
@@ -219,6 +220,10 @@ enum e1e_registers {
        E1000_SWSM      = 0x05B50, /* SW Semaphore */
        E1000_FWSM      = 0x05B54, /* FW Semaphore */
        E1000_SWSM2     = 0x05B58, /* Driver-only SW semaphore */
+       E1000_RETA_BASE = 0x05C00, /* Redirection Table - RW */
+#define E1000_RETA(_n) (E1000_RETA_BASE + ((_n) * 4))
+       E1000_RSSRK_BASE = 0x05C80, /* RSS Random Key - RW */
+#define E1000_RSSRK(_n)        (E1000_RSSRK_BASE + ((_n) * 4))
        E1000_FFLT_DBG  = 0x05F04, /* Debug Register */
        E1000_PCH_RAICC_BASE = 0x05F50, /* Receive Address Initial CRC */
 #define E1000_PCH_RAICC(_n)    (E1000_PCH_RAICC_BASE + ((_n) * 4))
@@ -776,6 +781,7 @@ struct e1000_mac_operations {
        s32  (*setup_physical_interface)(struct e1000_hw *);
        s32  (*setup_led)(struct e1000_hw *);
        void (*write_vfta)(struct e1000_hw *, u32, u32);
+       void (*config_collision_dist)(struct e1000_hw *);
        s32  (*read_mac_addr)(struct e1000_hw *);
 };
 
@@ -824,6 +830,7 @@ struct e1000_nvm_operations {
        s32  (*acquire)(struct e1000_hw *);
        s32  (*read)(struct e1000_hw *, u16, u16, u16 *);
        void (*release)(struct e1000_hw *);
+       void (*reload)(struct e1000_hw *);
        s32  (*update)(struct e1000_hw *);
        s32  (*valid_led_default)(struct e1000_hw *, u16 *);
        s32  (*validate)(struct e1000_hw *);
@@ -964,8 +971,8 @@ struct e1000_dev_spec_ich8lan {
 struct e1000_hw {
        struct e1000_adapter *adapter;
 
-       u8 __iomem *hw_addr;
-       u8 __iomem *flash_address;
+       void __iomem *hw_addr;
+       void __iomem *flash_address;
 
        struct e1000_mac_info  mac;
        struct e1000_fc_info   fc;
index e2a80a2..64c7644 100644 (file)
@@ -1,7 +1,7 @@
 /*******************************************************************************
 
   Intel PRO/1000 Linux driver
-  Copyright(c) 1999 - 2011 Intel Corporation.
+  Copyright(c) 1999 - 2012 Intel Corporation.
 
   This program is free software; you can redistribute it and/or modify it
   under the terms and conditions of the GNU General Public License,
 #define I82579_EMI_ADDR         0x10
 #define I82579_EMI_DATA         0x11
 #define I82579_LPI_UPDATE_TIMER 0x4805 /* in 40ns units + 40 ns base value */
+#define I82579_MSE_THRESHOLD    0x084F /* Mean Square Error Threshold */
+#define I82579_MSE_LINK_DOWN    0x2411 /* MSE count before dropping link */
 
 /* Strapping Option Register - RO */
 #define E1000_STRAP                     0x0000C
@@ -278,8 +280,8 @@ static inline void __ew32flash(struct e1000_hw *hw, unsigned long reg, u32 val)
 
 #define er16flash(reg)         __er16flash(hw, (reg))
 #define er32flash(reg)         __er32flash(hw, (reg))
-#define ew16flash(reg,val)     __ew16flash(hw, (reg), (val))
-#define ew32flash(reg,val)     __ew32flash(hw, (reg), (val))
+#define ew16flash(reg, val)    __ew16flash(hw, (reg), (val))
+#define ew32flash(reg, val)    __ew32flash(hw, (reg), (val))
 
 static void e1000_toggle_lanphypc_value_ich8lan(struct e1000_hw *hw)
 {
@@ -304,7 +306,6 @@ static void e1000_toggle_lanphypc_value_ich8lan(struct e1000_hw *hw)
 static s32 e1000_init_phy_params_pchlan(struct e1000_hw *hw)
 {
        struct e1000_phy_info *phy = &hw->phy;
-       u32 fwsm;
        s32 ret_val = 0;
 
        phy->addr                     = 1;
@@ -323,14 +324,14 @@ static s32 e1000_init_phy_params_pchlan(struct e1000_hw *hw)
        phy->ops.power_down           = e1000_power_down_phy_copper_ich8lan;
        phy->autoneg_mask             = AUTONEG_ADVERTISE_SPEED_DEFAULT;
 
-       /*
-        * The MAC-PHY interconnect may still be in SMBus mode
-        * after Sx->S0.  If the manageability engine (ME) is
-        * disabled, then toggle the LANPHYPC Value bit to force
-        * the interconnect to PCIe mode.
-        */
-       fwsm = er32(FWSM);
-       if (!(fwsm & E1000_ICH_FWSM_FW_VALID) && !e1000_check_reset_block(hw)) {
+       if (!hw->phy.ops.check_reset_block(hw)) {
+               u32 fwsm = er32(FWSM);
+
+               /*
+                * The MAC-PHY interconnect may still be in SMBus mode after
+                * Sx->S0.  If resetting the PHY is not blocked, toggle the
+                * LANPHYPC Value bit to force the interconnect to PCIe mode.
+                */
                e1000_toggle_lanphypc_value_ich8lan(hw);
                msleep(50);
 
@@ -338,25 +339,26 @@ static s32 e1000_init_phy_params_pchlan(struct e1000_hw *hw)
                 * Gate automatic PHY configuration by hardware on
                 * non-managed 82579
                 */
-               if (hw->mac.type == e1000_pch2lan)
+               if ((hw->mac.type == e1000_pch2lan) &&
+                   !(fwsm & E1000_ICH_FWSM_FW_VALID))
                        e1000_gate_hw_phy_config_ich8lan(hw, true);
-       }
 
-       /*
-        * Reset the PHY before any access to it.  Doing so, ensures that
-        * the PHY is in a known good state before we read/write PHY registers.
-        * The generic reset is sufficient here, because we haven't determined
-        * the PHY type yet.
-        */
-       ret_val = e1000e_phy_hw_reset_generic(hw);
-       if (ret_val)
-               goto out;
+               /*
+                * Reset the PHY before any access to it.  Doing so, ensures
+                * that the PHY is in a known good state before we read/write
+                * PHY registers.  The generic reset is sufficient here,
+                * because we haven't determined the PHY type yet.
+                */
+               ret_val = e1000e_phy_hw_reset_generic(hw);
+               if (ret_val)
+                       return ret_val;
 
-       /* Ungate automatic PHY configuration on non-managed 82579 */
-       if ((hw->mac.type == e1000_pch2lan) &&
-           !(fwsm & E1000_ICH_FWSM_FW_VALID)) {
-               usleep_range(10000, 20000);
-               e1000_gate_hw_phy_config_ich8lan(hw, false);
+               /* Ungate automatic PHY configuration on non-managed 82579 */
+               if ((hw->mac.type == e1000_pch2lan) &&
+                   !(fwsm & E1000_ICH_FWSM_FW_VALID)) {
+                       usleep_range(10000, 20000);
+                       e1000_gate_hw_phy_config_ich8lan(hw, false);
+               }
        }
 
        phy->id = e1000_phy_unknown;
@@ -364,7 +366,7 @@ static s32 e1000_init_phy_params_pchlan(struct e1000_hw *hw)
        default:
                ret_val = e1000e_get_phy_id(hw);
                if (ret_val)
-                       goto out;
+                       return ret_val;
                if ((phy->id != 0) && (phy->id != PHY_REVISION_MASK))
                        break;
                /* fall-through */
@@ -375,10 +377,10 @@ static s32 e1000_init_phy_params_pchlan(struct e1000_hw *hw)
                 */
                ret_val = e1000_set_mdio_slow_mode_hv(hw);
                if (ret_val)
-                       goto out;
+                       return ret_val;
                ret_val = e1000e_get_phy_id(hw);
                if (ret_val)
-                       goto out;
+                       return ret_val;
                break;
        }
        phy->type = e1000e_get_phy_type_from_id(phy->id);
@@ -404,7 +406,6 @@ static s32 e1000_init_phy_params_pchlan(struct e1000_hw *hw)
                break;
        }
 
-out:
        return ret_val;
 }
 
@@ -551,9 +552,8 @@ static s32 e1000_init_nvm_params_ich8lan(struct e1000_hw *hw)
  *  Initialize family-specific MAC parameters and function
  *  pointers.
  **/
-static s32 e1000_init_mac_params_ich8lan(struct e1000_adapter *adapter)
+static s32 e1000_init_mac_params_ich8lan(struct e1000_hw *hw)
 {
-       struct e1000_hw *hw = &adapter->hw;
        struct e1000_mac_info *mac = &hw->mac;
 
        /* Set media type function pointer */
@@ -580,7 +580,7 @@ static s32 e1000_init_mac_params_ich8lan(struct e1000_adapter *adapter)
                /* check management mode */
                mac->ops.check_mng_mode = e1000_check_mng_mode_ich8lan;
                /* ID LED init */
-               mac->ops.id_led_init = e1000e_id_led_init;
+               mac->ops.id_led_init = e1000e_id_led_init_generic;
                /* blink LED */
                mac->ops.blink_led = e1000e_blink_led_generic;
                /* setup LED */
@@ -634,20 +634,18 @@ static s32 e1000_set_eee_pchlan(struct e1000_hw *hw)
        u16 phy_reg;
 
        if (hw->phy.type != e1000_phy_82579)
-               goto out;
+               return 0;
 
        ret_val = e1e_rphy(hw, I82579_LPI_CTRL, &phy_reg);
        if (ret_val)
-               goto out;
+               return ret_val;
 
        if (hw->dev_spec.ich8lan.eee_disable)
                phy_reg &= ~I82579_LPI_CTRL_ENABLE_MASK;
        else
                phy_reg |= I82579_LPI_CTRL_ENABLE_MASK;
 
-       ret_val = e1e_wphy(hw, I82579_LPI_CTRL, phy_reg);
-out:
-       return ret_val;
+       return e1e_wphy(hw, I82579_LPI_CTRL, phy_reg);
 }
 
 /**
@@ -671,10 +669,8 @@ static s32 e1000_check_for_copper_link_ich8lan(struct e1000_hw *hw)
         * get_link_status flag is set upon receiving a Link Status
         * Change or Rx Sequence Error interrupt.
         */
-       if (!mac->get_link_status) {
-               ret_val = 0;
-               goto out;
-       }
+       if (!mac->get_link_status)
+               return 0;
 
        /*
         * First we want to see if the MII Status Register reports
@@ -683,16 +679,16 @@ static s32 e1000_check_for_copper_link_ich8lan(struct e1000_hw *hw)
         */
        ret_val = e1000e_phy_has_link_generic(hw, 1, 0, &link);
        if (ret_val)
-               goto out;
+               return ret_val;
 
        if (hw->mac.type == e1000_pchlan) {
                ret_val = e1000_k1_gig_workaround_hv(hw, link);
                if (ret_val)
-                       goto out;
+                       return ret_val;
        }
 
        if (!link)
-               goto out; /* No link detected */
+               return 0; /* No link detected */
 
        mac->get_link_status = false;
 
@@ -700,13 +696,13 @@ static s32 e1000_check_for_copper_link_ich8lan(struct e1000_hw *hw)
        case e1000_pch2lan:
                ret_val = e1000_k1_workaround_lv(hw);
                if (ret_val)
-                       goto out;
+                       return ret_val;
                /* fall-thru */
        case e1000_pchlan:
                if (hw->phy.type == e1000_phy_82578) {
                        ret_val = e1000_link_stall_workaround_hv(hw);
                        if (ret_val)
-                               goto out;
+                               return ret_val;
                }
 
                /*
@@ -736,23 +732,21 @@ static s32 e1000_check_for_copper_link_ich8lan(struct e1000_hw *hw)
        /* Enable/Disable EEE after link up */
        ret_val = e1000_set_eee_pchlan(hw);
        if (ret_val)
-               goto out;
+               return ret_val;
 
        /*
         * If we are forcing speed/duplex, then we simply return since
         * we have already determined whether we have link or not.
         */
-       if (!mac->autoneg) {
-               ret_val = -E1000_ERR_CONFIG;
-               goto out;
-       }
+       if (!mac->autoneg)
+               return -E1000_ERR_CONFIG;
 
        /*
         * Auto-Neg is enabled.  Auto Speed Detection takes care
         * of MAC speed/duplex configuration.  So we only need to
         * configure Collision Distance in the MAC.
         */
-       e1000e_config_collision_dist(hw);
+       mac->ops.config_collision_dist(hw);
 
        /*
         * Configure Flow Control now that Auto-Neg has completed.
@@ -764,7 +758,6 @@ static s32 e1000_check_for_copper_link_ich8lan(struct e1000_hw *hw)
        if (ret_val)
                e_dbg("Error configuring flow control\n");
 
-out:
        return ret_val;
 }
 
@@ -773,7 +766,7 @@ static s32 e1000_get_variants_ich8lan(struct e1000_adapter *adapter)
        struct e1000_hw *hw = &adapter->hw;
        s32 rc;
 
-       rc = e1000_init_mac_params_ich8lan(adapter);
+       rc = e1000_init_mac_params_ich8lan(hw);
        if (rc)
                return rc;
 
@@ -900,8 +893,7 @@ static s32 e1000_acquire_swflag_ich8lan(struct e1000_hw *hw)
        }
 
        if (!timeout) {
-               e_dbg("Failed to acquire the semaphore, FW or HW has it: "
-                     "FWSM=0x%8.8x EXTCNF_CTRL=0x%8.8x)\n",
+               e_dbg("Failed to acquire the semaphore, FW or HW has it: FWSM=0x%8.8x EXTCNF_CTRL=0x%8.8x)\n",
                      er32(FWSM), extcnf_ctrl);
                extcnf_ctrl &= ~E1000_EXTCNF_CTRL_SWFLAG;
                ew32(EXTCNF_CTRL, extcnf_ctrl);
@@ -1008,15 +1000,13 @@ static s32 e1000_write_smbus_addr(struct e1000_hw *hw)
 
        ret_val = e1000_read_phy_reg_hv_locked(hw, HV_SMB_ADDR, &phy_data);
        if (ret_val)
-               goto out;
+               return ret_val;
 
        phy_data &= ~HV_SMB_ADDR_MASK;
        phy_data |= (strap >> E1000_STRAP_SMBUS_ADDRESS_SHIFT);
        phy_data |= HV_SMB_ADDR_PEC_EN | HV_SMB_ADDR_VALID;
-       ret_val = e1000_write_phy_reg_hv_locked(hw, HV_SMB_ADDR, phy_data);
 
-out:
-       return ret_val;
+       return e1000_write_phy_reg_hv_locked(hw, HV_SMB_ADDR, phy_data);
 }
 
 /**
@@ -1065,7 +1055,7 @@ static s32 e1000_sw_lcd_config_ich8lan(struct e1000_hw *hw)
 
        data = er32(FEXTNVM);
        if (!(data & sw_cfg_mask))
-               goto out;
+               goto release;
 
        /*
         * Make sure HW does not configure LCD from PHY
@@ -1074,14 +1064,14 @@ static s32 e1000_sw_lcd_config_ich8lan(struct e1000_hw *hw)
        data = er32(EXTCNF_CTRL);
        if (!(hw->mac.type == e1000_pch2lan)) {
                if (data & E1000_EXTCNF_CTRL_LCD_WRITE_ENABLE)
-                       goto out;
+                       goto release;
        }
 
        cnf_size = er32(EXTCNF_SIZE);
        cnf_size &= E1000_EXTCNF_SIZE_EXT_PCIE_LENGTH_MASK;
        cnf_size >>= E1000_EXTCNF_SIZE_EXT_PCIE_LENGTH_SHIFT;
        if (!cnf_size)
-               goto out;
+               goto release;
 
        cnf_base_addr = data & E1000_EXTCNF_CTRL_EXT_CNF_POINTER_MASK;
        cnf_base_addr >>= E1000_EXTCNF_CTRL_EXT_CNF_POINTER_SHIFT;
@@ -1097,13 +1087,13 @@ static s32 e1000_sw_lcd_config_ich8lan(struct e1000_hw *hw)
                 */
                ret_val = e1000_write_smbus_addr(hw);
                if (ret_val)
-                       goto out;
+                       goto release;
 
                data = er32(LEDCTL);
                ret_val = e1000_write_phy_reg_hv_locked(hw, HV_LED_CONFIG,
                                                        (u16)data);
                if (ret_val)
-                       goto out;
+                       goto release;
        }
 
        /* Configure LCD from extended configuration region. */
@@ -1115,12 +1105,12 @@ static s32 e1000_sw_lcd_config_ich8lan(struct e1000_hw *hw)
                ret_val = e1000_read_nvm(hw, (word_addr + i * 2), 1,
                                         &reg_data);
                if (ret_val)
-                       goto out;
+                       goto release;
 
                ret_val = e1000_read_nvm(hw, (word_addr + i * 2 + 1),
                                         1, &reg_addr);
                if (ret_val)
-                       goto out;
+                       goto release;
 
                /* Save off the PHY page for future writes. */
                if (reg_addr == IGP01E1000_PHY_PAGE_SELECT) {
@@ -1134,10 +1124,10 @@ static s32 e1000_sw_lcd_config_ich8lan(struct e1000_hw *hw)
                ret_val = phy->ops.write_reg_locked(hw, (u32)reg_addr,
                                                    reg_data);
                if (ret_val)
-                       goto out;
+                       goto release;
        }
 
-out:
+release:
        hw->phy.ops.release(hw);
        return ret_val;
 }
@@ -1159,12 +1149,12 @@ static s32 e1000_k1_gig_workaround_hv(struct e1000_hw *hw, bool link)
        bool k1_enable = hw->dev_spec.ich8lan.nvm_k1_enabled;
 
        if (hw->mac.type != e1000_pchlan)
-               goto out;
+               return 0;
 
        /* Wrap the whole flow with the sw flag */
        ret_val = hw->phy.ops.acquire(hw);
        if (ret_val)
-               goto out;
+               return ret_val;
 
        /* Disable K1 when link is 1Gbps, otherwise use the NVM setting */
        if (link) {
@@ -1218,7 +1208,7 @@ static s32 e1000_k1_gig_workaround_hv(struct e1000_hw *hw, bool link)
 
 release:
        hw->phy.ops.release(hw);
-out:
+
        return ret_val;
 }
 
@@ -1240,22 +1230,20 @@ s32 e1000_configure_k1_ich8lan(struct e1000_hw *hw, bool k1_enable)
        u32 reg = 0;
        u16 kmrn_reg = 0;
 
-       ret_val = e1000e_read_kmrn_reg_locked(hw,
-                                            E1000_KMRNCTRLSTA_K1_CONFIG,
-                                            &kmrn_reg);
+       ret_val = e1000e_read_kmrn_reg_locked(hw, E1000_KMRNCTRLSTA_K1_CONFIG,
+                                             &kmrn_reg);
        if (ret_val)
-               goto out;
+               return ret_val;
 
        if (k1_enable)
                kmrn_reg |= E1000_KMRNCTRLSTA_K1_ENABLE;
        else
                kmrn_reg &= ~E1000_KMRNCTRLSTA_K1_ENABLE;
 
-       ret_val = e1000e_write_kmrn_reg_locked(hw,
-                                             E1000_KMRNCTRLSTA_K1_CONFIG,
-                                             kmrn_reg);
+       ret_val = e1000e_write_kmrn_reg_locked(hw, E1000_KMRNCTRLSTA_K1_CONFIG,
+                                              kmrn_reg);
        if (ret_val)
-               goto out;
+               return ret_val;
 
        udelay(20);
        ctrl_ext = er32(CTRL_EXT);
@@ -1273,8 +1261,7 @@ s32 e1000_configure_k1_ich8lan(struct e1000_hw *hw, bool k1_enable)
        e1e_flush();
        udelay(20);
 
-out:
-       return ret_val;
+       return 0;
 }
 
 /**
@@ -1302,18 +1289,18 @@ static s32 e1000_oem_bits_config_ich8lan(struct e1000_hw *hw, bool d0_state)
        if (!(hw->mac.type == e1000_pch2lan)) {
                mac_reg = er32(EXTCNF_CTRL);
                if (mac_reg & E1000_EXTCNF_CTRL_OEM_WRITE_ENABLE)
-                       goto out;
+                       goto release;
        }
 
        mac_reg = er32(FEXTNVM);
        if (!(mac_reg & E1000_FEXTNVM_SW_CONFIG_ICH8M))
-               goto out;
+               goto release;
 
        mac_reg = er32(PHY_CTRL);
 
        ret_val = hw->phy.ops.read_reg_locked(hw, HV_OEM_BITS, &oem_reg);
        if (ret_val)
-               goto out;
+               goto release;
 
        oem_reg &= ~(HV_OEM_BITS_GBE_DIS | HV_OEM_BITS_LPLU);
 
@@ -1325,7 +1312,7 @@ static s32 e1000_oem_bits_config_ich8lan(struct e1000_hw *hw, bool d0_state)
                        oem_reg |= HV_OEM_BITS_LPLU;
 
                /* Set Restart auto-neg to activate the bits */
-               if (!e1000_check_reset_block(hw))
+               if (!hw->phy.ops.check_reset_block(hw))
                        oem_reg |= HV_OEM_BITS_RESTART_AN;
        } else {
                if (mac_reg & (E1000_PHY_CTRL_GBE_DISABLE |
@@ -1339,7 +1326,7 @@ static s32 e1000_oem_bits_config_ich8lan(struct e1000_hw *hw, bool d0_state)
 
        ret_val = hw->phy.ops.write_reg_locked(hw, HV_OEM_BITS, oem_reg);
 
-out:
+release:
        hw->phy.ops.release(hw);
 
        return ret_val;
@@ -1376,13 +1363,13 @@ static s32 e1000_hv_phy_workarounds_ich8lan(struct e1000_hw *hw)
        u16 phy_data;
 
        if (hw->mac.type != e1000_pchlan)
-               return ret_val;
+               return 0;
 
        /* Set MDIO slow mode before any other MDIO access */
        if (hw->phy.type == e1000_phy_82577) {
                ret_val = e1000_set_mdio_slow_mode_hv(hw);
                if (ret_val)
-                       goto out;
+                       return ret_val;
        }
 
        if (((hw->phy.type == e1000_phy_82577) &&
@@ -1419,7 +1406,7 @@ static s32 e1000_hv_phy_workarounds_ich8lan(struct e1000_hw *hw)
        ret_val = e1000e_write_phy_reg_mdic(hw, IGP01E1000_PHY_PAGE_SELECT, 0);
        hw->phy.ops.release(hw);
        if (ret_val)
-               goto out;
+               return ret_val;
 
        /*
         * Configure the K1 Si workaround during phy reset assuming there is
@@ -1427,12 +1414,12 @@ static s32 e1000_hv_phy_workarounds_ich8lan(struct e1000_hw *hw)
         */
        ret_val = e1000_k1_gig_workaround_hv(hw, true);
        if (ret_val)
-               goto out;
+               return ret_val;
 
        /* Workaround for link disconnects on a busy hub in half duplex */
        ret_val = hw->phy.ops.acquire(hw);
        if (ret_val)
-               goto out;
+               return ret_val;
        ret_val = hw->phy.ops.read_reg_locked(hw, BM_PORT_GEN_CFG, &phy_data);
        if (ret_val)
                goto release;
@@ -1440,7 +1427,7 @@ static s32 e1000_hv_phy_workarounds_ich8lan(struct e1000_hw *hw)
                                               phy_data & 0x00FF);
 release:
        hw->phy.ops.release(hw);
-out:
+
        return ret_val;
 }
 
@@ -1497,13 +1484,13 @@ s32 e1000_lv_jumbo_workaround_ich8lan(struct e1000_hw *hw, bool enable)
        u16 i;
 
        if (hw->mac.type != e1000_pch2lan)
-               goto out;
+               return 0;
 
        /* disable Rx path while enabling/disabling workaround */
        e1e_rphy(hw, PHY_REG(769, 20), &phy_reg);
        ret_val = e1e_wphy(hw, PHY_REG(769, 20), phy_reg | (1 << 14));
        if (ret_val)
-               goto out;
+               return ret_val;
 
        if (enable) {
                /*
@@ -1545,24 +1532,24 @@ s32 e1000_lv_jumbo_workaround_ich8lan(struct e1000_hw *hw, bool enable)
                                                E1000_KMRNCTRLSTA_CTRL_OFFSET,
                                                &data);
                if (ret_val)
-                       goto out;
+                       return ret_val;
                ret_val = e1000e_write_kmrn_reg(hw,
                                                E1000_KMRNCTRLSTA_CTRL_OFFSET,
                                                data | (1 << 0));
                if (ret_val)
-                       goto out;
+                       return ret_val;
                ret_val = e1000e_read_kmrn_reg(hw,
                                                E1000_KMRNCTRLSTA_HD_CTRL,
                                                &data);
                if (ret_val)
-                       goto out;
+                       return ret_val;
                data &= ~(0xF << 8);
                data |= (0xB << 8);
                ret_val = e1000e_write_kmrn_reg(hw,
                                                E1000_KMRNCTRLSTA_HD_CTRL,
                                                data);
                if (ret_val)
-                       goto out;
+                       return ret_val;
 
                /* Enable jumbo frame workaround in the PHY */
                e1e_rphy(hw, PHY_REG(769, 23), &data);
@@ -1570,25 +1557,25 @@ s32 e1000_lv_jumbo_workaround_ich8lan(struct e1000_hw *hw, bool enable)
                data |= (0x37 << 5);
                ret_val = e1e_wphy(hw, PHY_REG(769, 23), data);
                if (ret_val)
-                       goto out;
+                       return ret_val;
                e1e_rphy(hw, PHY_REG(769, 16), &data);
                data &= ~(1 << 13);
                ret_val = e1e_wphy(hw, PHY_REG(769, 16), data);
                if (ret_val)
-                       goto out;
+                       return ret_val;
                e1e_rphy(hw, PHY_REG(776, 20), &data);
                data &= ~(0x3FF << 2);
                data |= (0x1A << 2);
                ret_val = e1e_wphy(hw, PHY_REG(776, 20), data);
                if (ret_val)
-                       goto out;
+                       return ret_val;
                ret_val = e1e_wphy(hw, PHY_REG(776, 23), 0xF100);
                if (ret_val)
-                       goto out;
+                       return ret_val;
                e1e_rphy(hw, HV_PM_CTRL, &data);
                ret_val = e1e_wphy(hw, HV_PM_CTRL, data | (1 << 10));
                if (ret_val)
-                       goto out;
+                       return ret_val;
        } else {
                /* Write MAC register values back to h/w defaults */
                mac_reg = er32(FFLT_DBG);
@@ -1603,56 +1590,53 @@ s32 e1000_lv_jumbo_workaround_ich8lan(struct e1000_hw *hw, bool enable)
                                                E1000_KMRNCTRLSTA_CTRL_OFFSET,
                                                &data);
                if (ret_val)
-                       goto out;
+                       return ret_val;
                ret_val = e1000e_write_kmrn_reg(hw,
                                                E1000_KMRNCTRLSTA_CTRL_OFFSET,
                                                data & ~(1 << 0));
                if (ret_val)
-                       goto out;
+                       return ret_val;
                ret_val = e1000e_read_kmrn_reg(hw,
                                                E1000_KMRNCTRLSTA_HD_CTRL,
                                                &data);
                if (ret_val)
-                       goto out;
+                       return ret_val;
                data &= ~(0xF << 8);
                data |= (0xB << 8);
                ret_val = e1000e_write_kmrn_reg(hw,
                                                E1000_KMRNCTRLSTA_HD_CTRL,
                                                data);
                if (ret_val)
-                       goto out;
+                       return ret_val;
 
                /* Write PHY register values back to h/w defaults */
                e1e_rphy(hw, PHY_REG(769, 23), &data);
                data &= ~(0x7F << 5);
                ret_val = e1e_wphy(hw, PHY_REG(769, 23), data);
                if (ret_val)
-                       goto out;
+                       return ret_val;
                e1e_rphy(hw, PHY_REG(769, 16), &data);
                data |= (1 << 13);
                ret_val = e1e_wphy(hw, PHY_REG(769, 16), data);
                if (ret_val)
-                       goto out;
+                       return ret_val;
                e1e_rphy(hw, PHY_REG(776, 20), &data);
                data &= ~(0x3FF << 2);
                data |= (0x8 << 2);
                ret_val = e1e_wphy(hw, PHY_REG(776, 20), data);
                if (ret_val)
-                       goto out;
+                       return ret_val;
                ret_val = e1e_wphy(hw, PHY_REG(776, 23), 0x7E00);
                if (ret_val)
-                       goto out;
+                       return ret_val;
                e1e_rphy(hw, HV_PM_CTRL, &data);
                ret_val = e1e_wphy(hw, HV_PM_CTRL, data & ~(1 << 10));
                if (ret_val)
-                       goto out;
+                       return ret_val;
        }
 
        /* re-enable Rx path after enabling/disabling workaround */
-       ret_val = e1e_wphy(hw, PHY_REG(769, 20), phy_reg & ~(1 << 14));
-
-out:
-       return ret_val;
+       return e1e_wphy(hw, PHY_REG(769, 20), phy_reg & ~(1 << 14));
 }
 
 /**
@@ -1664,12 +1648,31 @@ static s32 e1000_lv_phy_workarounds_ich8lan(struct e1000_hw *hw)
        s32 ret_val = 0;
 
        if (hw->mac.type != e1000_pch2lan)
-               goto out;
+               return 0;
 
        /* Set MDIO slow mode before any other MDIO access */
        ret_val = e1000_set_mdio_slow_mode_hv(hw);
 
-out:
+       ret_val = hw->phy.ops.acquire(hw);
+       if (ret_val)
+               return ret_val;
+       ret_val = hw->phy.ops.write_reg_locked(hw, I82579_EMI_ADDR,
+                                              I82579_MSE_THRESHOLD);
+       if (ret_val)
+               goto release;
+       /* set MSE higher to enable link to stay up when noise is high */
+       ret_val = hw->phy.ops.write_reg_locked(hw, I82579_EMI_DATA, 0x0034);
+       if (ret_val)
+               goto release;
+       ret_val = hw->phy.ops.write_reg_locked(hw, I82579_EMI_ADDR,
+                                              I82579_MSE_LINK_DOWN);
+       if (ret_val)
+               goto release;
+       /* drop link after 5 times MSE threshold was reached */
+       ret_val = hw->phy.ops.write_reg_locked(hw, I82579_EMI_DATA, 0x0005);
+release:
+       hw->phy.ops.release(hw);
+
        return ret_val;
 }
 
@@ -1687,12 +1690,12 @@ static s32 e1000_k1_workaround_lv(struct e1000_hw *hw)
        u16 phy_reg;
 
        if (hw->mac.type != e1000_pch2lan)
-               goto out;
+               return 0;
 
        /* Set K1 beacon duration based on 1Gbps speed or otherwise */
        ret_val = e1e_rphy(hw, HV_M_STATUS, &status_reg);
        if (ret_val)
-               goto out;
+               return ret_val;
 
        if ((status_reg & (HV_M_STATUS_LINK_UP | HV_M_STATUS_AUTONEG_COMPLETE))
            == (HV_M_STATUS_LINK_UP | HV_M_STATUS_AUTONEG_COMPLETE)) {
@@ -1701,7 +1704,7 @@ static s32 e1000_k1_workaround_lv(struct e1000_hw *hw)
 
                ret_val = e1e_rphy(hw, I82579_LPI_CTRL, &phy_reg);
                if (ret_val)
-                       goto out;
+                       return ret_val;
 
                if (status_reg & HV_M_STATUS_SPEED_1000) {
                        mac_reg |= E1000_FEXTNVM4_BEACON_DURATION_8USEC;
@@ -1714,7 +1717,6 @@ static s32 e1000_k1_workaround_lv(struct e1000_hw *hw)
                ret_val = e1e_wphy(hw, I82579_LPI_CTRL, phy_reg);
        }
 
-out:
        return ret_val;
 }
 
@@ -1741,7 +1743,6 @@ static void e1000_gate_hw_phy_config_ich8lan(struct e1000_hw *hw, bool gate)
                extcnf_ctrl &= ~E1000_EXTCNF_CTRL_GATE_PHY_CFG;
 
        ew32(EXTCNF_CTRL, extcnf_ctrl);
-       return;
 }
 
 /**
@@ -1785,8 +1786,8 @@ static s32 e1000_post_phy_reset_ich8lan(struct e1000_hw *hw)
        s32 ret_val = 0;
        u16 reg;
 
-       if (e1000_check_reset_block(hw))
-               goto out;
+       if (hw->phy.ops.check_reset_block(hw))
+               return 0;
 
        /* Allow time for h/w to get to quiescent state after reset */
        usleep_range(10000, 20000);
@@ -1796,12 +1797,12 @@ static s32 e1000_post_phy_reset_ich8lan(struct e1000_hw *hw)
        case e1000_pchlan:
                ret_val = e1000_hv_phy_workarounds_ich8lan(hw);
                if (ret_val)
-                       goto out;
+                       return ret_val;
                break;
        case e1000_pch2lan:
                ret_val = e1000_lv_phy_workarounds_ich8lan(hw);
                if (ret_val)
-                       goto out;
+                       return ret_val;
                break;
        default:
                break;
@@ -1817,7 +1818,7 @@ static s32 e1000_post_phy_reset_ich8lan(struct e1000_hw *hw)
        /* Configure the LCD with the extended configuration region in NVM */
        ret_val = e1000_sw_lcd_config_ich8lan(hw);
        if (ret_val)
-               goto out;
+               return ret_val;
 
        /* Configure the LCD with the OEM bits in NVM */
        ret_val = e1000_oem_bits_config_ich8lan(hw, true);
@@ -1832,18 +1833,16 @@ static s32 e1000_post_phy_reset_ich8lan(struct e1000_hw *hw)
                /* Set EEE LPI Update Timer to 200usec */
                ret_val = hw->phy.ops.acquire(hw);
                if (ret_val)
-                       goto out;
+                       return ret_val;
                ret_val = hw->phy.ops.write_reg_locked(hw, I82579_EMI_ADDR,
                                                       I82579_LPI_UPDATE_TIMER);
-               if (ret_val)
-                       goto release;
-               ret_val = hw->phy.ops.write_reg_locked(hw, I82579_EMI_DATA,
-                                                      0x1387);
-release:
+               if (!ret_val)
+                       ret_val = hw->phy.ops.write_reg_locked(hw,
+                                                              I82579_EMI_DATA,
+                                                              0x1387);
                hw->phy.ops.release(hw);
        }
 
-out:
        return ret_val;
 }
 
@@ -1866,12 +1865,9 @@ static s32 e1000_phy_hw_reset_ich8lan(struct e1000_hw *hw)
 
        ret_val = e1000e_phy_hw_reset_generic(hw);
        if (ret_val)
-               goto out;
-
-       ret_val = e1000_post_phy_reset_ich8lan(hw);
+               return ret_val;
 
-out:
-       return ret_val;
+       return e1000_post_phy_reset_ich8lan(hw);
 }
 
 /**
@@ -1892,18 +1888,17 @@ static s32 e1000_set_lplu_state_pchlan(struct e1000_hw *hw, bool active)
 
        ret_val = e1e_rphy(hw, HV_OEM_BITS, &oem_reg);
        if (ret_val)
-               goto out;
+               return ret_val;
 
        if (active)
                oem_reg |= HV_OEM_BITS_LPLU;
        else
                oem_reg &= ~HV_OEM_BITS_LPLU;
 
-       oem_reg |= HV_OEM_BITS_RESTART_AN;
-       ret_val = e1e_wphy(hw, HV_OEM_BITS, oem_reg);
+       if (!hw->phy.ops.check_reset_block(hw))
+               oem_reg |= HV_OEM_BITS_RESTART_AN;
 
-out:
-       return ret_val;
+       return e1e_wphy(hw, HV_OEM_BITS, oem_reg);
 }
 
 /**
@@ -1927,7 +1922,7 @@ static s32 e1000_set_d0_lplu_state_ich8lan(struct e1000_hw *hw, bool active)
        u16 data;
 
        if (phy->type == e1000_phy_ife)
-               return ret_val;
+               return 0;
 
        phy_ctrl = er32(PHY_CTRL);
 
@@ -2009,7 +2004,7 @@ static s32 e1000_set_d3_lplu_state_ich8lan(struct e1000_hw *hw, bool active)
 {
        struct e1000_phy_info *phy = &hw->phy;
        u32 phy_ctrl;
-       s32 ret_val;
+       s32 ret_val = 0;
        u16 data;
 
        phy_ctrl = er32(PHY_CTRL);
@@ -2075,7 +2070,7 @@ static s32 e1000_set_d3_lplu_state_ich8lan(struct e1000_hw *hw, bool active)
                ret_val = e1e_wphy(hw, IGP01E1000_PHY_PORT_CONFIG, data);
        }
 
-       return 0;
+       return ret_val;
 }
 
 /**
@@ -2093,7 +2088,7 @@ static s32 e1000_valid_nvm_bank_detect_ich8lan(struct e1000_hw *hw, u32 *bank)
        u32 bank1_offset = nvm->flash_bank_size * sizeof(u16);
        u32 act_offset = E1000_ICH_NVM_SIG_WORD * 2 + 1;
        u8 sig_byte = 0;
-       s32 ret_val = 0;
+       s32 ret_val;
 
        switch (hw->mac.type) {
        case e1000_ich8lan:
@@ -2108,8 +2103,7 @@ static s32 e1000_valid_nvm_bank_detect_ich8lan(struct e1000_hw *hw, u32 *bank)
 
                        return 0;
                }
-               e_dbg("Unable to determine valid NVM bank via EEC - "
-                      "reading flash signature\n");
+               e_dbg("Unable to determine valid NVM bank via EEC - reading flash signature\n");
                /* fall-thru */
        default:
                /* set bank to 0 in case flash read fails */
@@ -2141,8 +2135,6 @@ static s32 e1000_valid_nvm_bank_detect_ich8lan(struct e1000_hw *hw, u32 *bank)
                e_dbg("ERROR: No valid NVM bank present\n");
                return -E1000_ERR_NVM;
        }
-
-       return 0;
 }
 
 /**
@@ -2221,8 +2213,7 @@ static s32 e1000_flash_cycle_init_ich8lan(struct e1000_hw *hw)
 
        /* Check if the flash descriptor is valid */
        if (hsfsts.hsf_status.fldesvalid == 0) {
-               e_dbg("Flash descriptor invalid.  "
-                        "SW Sequencing must be used.\n");
+               e_dbg("Flash descriptor invalid.  SW Sequencing must be used.\n");
                return -E1000_ERR_NVM;
        }
 
@@ -2251,21 +2242,21 @@ static s32 e1000_flash_cycle_init_ich8lan(struct e1000_hw *hw)
                ew16flash(ICH_FLASH_HSFSTS, hsfsts.regval);
                ret_val = 0;
        } else {
-               s32 i = 0;
+               s32 i;
 
                /*
                 * Otherwise poll for sometime so the current
                 * cycle has a chance to end before giving up.
                 */
                for (i = 0; i < ICH_FLASH_READ_COMMAND_TIMEOUT; i++) {
-                       hsfsts.regval = __er16flash(hw, ICH_FLASH_HSFSTS);
+                       hsfsts.regval = er16flash(ICH_FLASH_HSFSTS);
                        if (hsfsts.hsf_status.flcinprog == 0) {
                                ret_val = 0;
                                break;
                        }
                        udelay(1);
                }
-               if (ret_val == 0) {
+               if (!ret_val) {
                        /*
                         * Successful in waiting for previous cycle to timeout,
                         * now set the Flash Cycle Done.
@@ -2291,7 +2282,6 @@ static s32 e1000_flash_cycle_ich8lan(struct e1000_hw *hw, u32 timeout)
 {
        union ich8_hws_flash_ctrl hsflctl;
        union ich8_hws_flash_status hsfsts;
-       s32 ret_val = -E1000_ERR_NVM;
        u32 i = 0;
 
        /* Start a cycle by writing 1 in Flash Cycle Go in Hw Flash Control */
@@ -2310,7 +2300,7 @@ static s32 e1000_flash_cycle_ich8lan(struct e1000_hw *hw, u32 timeout)
        if (hsfsts.hsf_status.flcdone == 1 && hsfsts.hsf_status.flcerr == 0)
                return 0;
 
-       return ret_val;
+       return -E1000_ERR_NVM;
 }
 
 /**
@@ -2383,7 +2373,7 @@ static s32 e1000_read_flash_data_ich8lan(struct e1000_hw *hw, u32 offset,
                udelay(1);
                /* Steps */
                ret_val = e1000_flash_cycle_init_ich8lan(hw);
-               if (ret_val != 0)
+               if (ret_val)
                        break;
 
                hsflctl.regval = er16flash(ICH_FLASH_HSFCTL);
@@ -2403,7 +2393,7 @@ static s32 e1000_read_flash_data_ich8lan(struct e1000_hw *hw, u32 offset,
                 * read in (shift in) the Flash Data0, the order is
                 * least significant byte first msb to lsb
                 */
-               if (ret_val == 0) {
+               if (!ret_val) {
                        flash_data = er32flash(ICH_FLASH_FDATA0);
                        if (size == 1)
                                *data = (u8)(flash_data & 0x000000FF);
@@ -2422,8 +2412,7 @@ static s32 e1000_read_flash_data_ich8lan(struct e1000_hw *hw, u32 offset,
                                /* Repeat for some time before giving up. */
                                continue;
                        } else if (hsfsts.hsf_status.flcdone == 0) {
-                               e_dbg("Timeout error - flash cycle "
-                                        "did not complete.\n");
+                               e_dbg("Timeout error - flash cycle did not complete.\n");
                                break;
                        }
                }
@@ -2618,7 +2607,7 @@ release:
         * until after the next adapter reset.
         */
        if (!ret_val) {
-               e1000e_reload_nvm(hw);
+               nvm->ops.reload(hw);
                usleep_range(10000, 20000);
        }
 
@@ -2774,8 +2763,7 @@ static s32 e1000_write_flash_data_ich8lan(struct e1000_hw *hw, u32 offset,
                        /* Repeat for some time before giving up. */
                        continue;
                if (hsfsts.hsf_status.flcdone == 0) {
-                       e_dbg("Timeout error - flash cycle "
-                                "did not complete.");
+                       e_dbg("Timeout error - flash cycle did not complete.\n");
                        break;
                }
        } while (count++ < ICH_FLASH_CYCLE_REPEAT_COUNT);
@@ -2917,7 +2905,7 @@ static s32 e1000_erase_flash_bank_ich8lan(struct e1000_hw *hw, u32 bank)
 
                        ret_val = e1000_flash_cycle_ich8lan(hw,
                                               ICH_FLASH_ERASE_COMMAND_TIMEOUT);
-                       if (ret_val == 0)
+                       if (!ret_val)
                                break;
 
                        /*
@@ -2972,7 +2960,7 @@ static s32 e1000_valid_led_default_ich8lan(struct e1000_hw *hw, u16 *data)
  *
  *  PCH also does not have an "always on" or "always off" mode which
  *  complicates the ID feature.  Instead of using the "on" mode to indicate
- *  in ledctl_mode2 the LEDs to use for ID (see e1000e_id_led_init()),
+ *  in ledctl_mode2 the LEDs to use for ID (see e1000e_id_led_init_generic()),
  *  use "link_up" mode.  The LEDs will still ID on request if there is no
  *  link based on logic in e1000_led_[on|off]_pchlan().
  **/
@@ -2987,7 +2975,7 @@ static s32 e1000_id_led_init_pchlan(struct e1000_hw *hw)
        /* Get default ID LED modes */
        ret_val = hw->nvm.ops.valid_led_default(hw, &data);
        if (ret_val)
-               goto out;
+               return ret_val;
 
        mac->ledctl_default = er32(LEDCTL);
        mac->ledctl_mode1 = mac->ledctl_default;
@@ -3032,8 +3020,7 @@ static s32 e1000_id_led_init_pchlan(struct e1000_hw *hw)
                }
        }
 
-out:
-       return ret_val;
+       return 0;
 }
 
 /**
@@ -3120,7 +3107,7 @@ static s32 e1000_reset_hw_ich8lan(struct e1000_hw *hw)
 
        ctrl = er32(CTRL);
 
-       if (!e1000_check_reset_block(hw)) {
+       if (!hw->phy.ops.check_reset_block(hw)) {
                /*
                 * Full-chip reset requires MAC and PHY reset at the same
                 * time to make sure the interface between MAC and the
@@ -3148,11 +3135,11 @@ static s32 e1000_reset_hw_ich8lan(struct e1000_hw *hw)
        if (ctrl & E1000_CTRL_PHY_RST) {
                ret_val = hw->phy.ops.get_cfg_done(hw);
                if (ret_val)
-                       goto out;
+                       return ret_val;
 
                ret_val = e1000_post_phy_reset_ich8lan(hw);
                if (ret_val)
-                       goto out;
+                       return ret_val;
        }
 
        /*
@@ -3170,8 +3157,7 @@ static s32 e1000_reset_hw_ich8lan(struct e1000_hw *hw)
        kab |= E1000_KABGTXD_BGSQLBIAS;
        ew32(KABGTXD, kab);
 
-out:
-       return ret_val;
+       return 0;
 }
 
 /**
@@ -3224,7 +3210,7 @@ static s32 e1000_init_hw_ich8lan(struct e1000_hw *hw)
        }
 
        /* Setup link and flow control */
-       ret_val = e1000_setup_link_ich8lan(hw);
+       ret_val = mac->ops.setup_link(hw);
 
        /* Set the transmit descriptor write-back policy for both queues */
        txdctl = er32(TXDCTL(0));
@@ -3262,7 +3248,7 @@ static s32 e1000_init_hw_ich8lan(struct e1000_hw *hw)
         */
        e1000_clear_hw_cntrs_ich8lan(hw);
 
-       return 0;
+       return ret_val;
 }
 /**
  *  e1000_initialize_hw_bits_ich8lan - Initialize required hardware bits
@@ -3339,7 +3325,7 @@ static s32 e1000_setup_link_ich8lan(struct e1000_hw *hw)
 {
        s32 ret_val;
 
-       if (e1000_check_reset_block(hw))
+       if (hw->phy.ops.check_reset_block(hw))
                return 0;
 
        /*
@@ -3365,7 +3351,7 @@ static s32 e1000_setup_link_ich8lan(struct e1000_hw *hw)
                hw->fc.current_mode);
 
        /* Continue to configure the copper link. */
-       ret_val = e1000_setup_copper_link_ich8lan(hw);
+       ret_val = hw->mac.ops.setup_physical_interface(hw);
        if (ret_val)
                return ret_val;
 
@@ -3465,6 +3451,7 @@ static s32 e1000_setup_copper_link_ich8lan(struct e1000_hw *hw)
        default:
                break;
        }
+
        return e1000e_setup_copper_link(hw);
 }
 
@@ -3566,7 +3553,7 @@ static s32 e1000_kmrn_lock_loss_workaround_ich8lan(struct e1000_hw *hw)
 }
 
 /**
- *  e1000_set_kmrn_lock_loss_workaround_ich8lan - Set Kumeran workaround state
+ *  e1000e_set_kmrn_lock_loss_workaround_ich8lan - Set Kumeran workaround state
  *  @hw: pointer to the HW structure
  *  @state: boolean value used to set the current Kumeran workaround state
  *
@@ -3676,9 +3663,10 @@ void e1000e_gig_downshift_workaround_ich8lan(struct e1000_hw *hw)
  *
  *  During S0 to Sx transition, it is possible the link remains at gig
  *  instead of negotiating to a lower speed.  Before going to Sx, set
- *  'LPLU Enabled' and 'Gig Disable' to force link speed negotiation
- *  to a lower speed.  For PCH and newer parts, the OEM bits PHY register
- *  (LED, GbE disable and LPLU configurations) also needs to be written.
+ *  'Gig Disable' to force link speed negotiation to a lower speed based on
+ *  the LPLU setting in the NVM or custom setting.  For PCH and newer parts,
+ *  the OEM bits PHY register (LED, GbE disable and LPLU configurations) also
+ *  needs to be written.
  **/
 void e1000_suspend_workarounds_ich8lan(struct e1000_hw *hw)
 {
@@ -3686,7 +3674,7 @@ void e1000_suspend_workarounds_ich8lan(struct e1000_hw *hw)
        s32 ret_val;
 
        phy_ctrl = er32(PHY_CTRL);
-       phy_ctrl |= E1000_PHY_CTRL_D0A_LPLU | E1000_PHY_CTRL_GBE_DISABLE;
+       phy_ctrl |= E1000_PHY_CTRL_GBE_DISABLE;
        ew32(PHY_CTRL, phy_ctrl);
 
        if (hw->mac.type == e1000_ich8lan)
@@ -3714,47 +3702,41 @@ void e1000_suspend_workarounds_ich8lan(struct e1000_hw *hw)
  **/
 void e1000_resume_workarounds_pchlan(struct e1000_hw *hw)
 {
-       u32 fwsm;
+       u16 phy_id1, phy_id2;
+       s32 ret_val;
 
-       if (hw->mac.type != e1000_pch2lan)
+       if ((hw->mac.type != e1000_pch2lan) ||
+           hw->phy.ops.check_reset_block(hw))
                return;
 
-       fwsm = er32(FWSM);
-       if (!(fwsm & E1000_ICH_FWSM_FW_VALID) || !e1000_check_reset_block(hw)) {
-               u16 phy_id1, phy_id2;
-               s32 ret_val;
-
-               ret_val = hw->phy.ops.acquire(hw);
-               if (ret_val) {
-                       e_dbg("Failed to acquire PHY semaphore in resume\n");
-                       return;
-               }
+       ret_val = hw->phy.ops.acquire(hw);
+       if (ret_val) {
+               e_dbg("Failed to acquire PHY semaphore in resume\n");
+               return;
+       }
 
-               /* Test access to the PHY registers by reading the ID regs */
-               ret_val = hw->phy.ops.read_reg_locked(hw, PHY_ID1, &phy_id1);
-               if (ret_val)
-                       goto release;
-               ret_val = hw->phy.ops.read_reg_locked(hw, PHY_ID2, &phy_id2);
-               if (ret_val)
-                       goto release;
+       /* Test access to the PHY registers by reading the ID regs */
+       ret_val = hw->phy.ops.read_reg_locked(hw, PHY_ID1, &phy_id1);
+       if (ret_val)
+               goto release;
+       ret_val = hw->phy.ops.read_reg_locked(hw, PHY_ID2, &phy_id2);
+       if (ret_val)
+               goto release;
 
-               if (hw->phy.id == ((u32)(phy_id1 << 16) |
-                                  (u32)(phy_id2 & PHY_REVISION_MASK)))
-                       goto release;
+       if (hw->phy.id == ((u32)(phy_id1 << 16) |
+                          (u32)(phy_id2 & PHY_REVISION_MASK)))
+               goto release;
 
-               e1000_toggle_lanphypc_value_ich8lan(hw);
+       e1000_toggle_lanphypc_value_ich8lan(hw);
 
-               hw->phy.ops.release(hw);
-               msleep(50);
-               e1000_phy_hw_reset(hw);
-               msleep(50);
-               return;
-       }
+       hw->phy.ops.release(hw);
+       msleep(50);
+       e1000_phy_hw_reset(hw);
+       msleep(50);
+       return;
 
 release:
        hw->phy.ops.release(hw);
-
-       return;
 }
 
 /**
@@ -4023,7 +4005,6 @@ release:
 }
 
 static const struct e1000_mac_operations ich8_mac_ops = {
-       .id_led_init            = e1000e_id_led_init,
        /* check_mng_mode dependent on mac type */
        .check_for_link         = e1000_check_for_copper_link_ich8lan,
        /* cleanup_led dependent on mac type */
@@ -4039,6 +4020,7 @@ static const struct e1000_mac_operations ich8_mac_ops = {
        .setup_link             = e1000_setup_link_ich8lan,
        .setup_physical_interface= e1000_setup_copper_link_ich8lan,
        /* id_led_init dependent on mac type */
+       .config_collision_dist  = e1000e_config_collision_dist_generic,
 };
 
 static const struct e1000_phy_operations ich8_phy_ops = {
@@ -4059,6 +4041,7 @@ static const struct e1000_nvm_operations ich8_nvm_ops = {
        .acquire                = e1000_acquire_nvm_ich8lan,
        .read                   = e1000_read_nvm_ich8lan,
        .release                = e1000_release_nvm_ich8lan,
+       .reload                 = e1000e_reload_nvm_generic,
        .update                 = e1000_update_nvm_checksum_ich8lan,
        .valid_led_default      = e1000_valid_led_default_ich8lan,
        .validate               = e1000_validate_nvm_checksum_ich8lan,
@@ -4088,10 +4071,9 @@ const struct e1000_info e1000_ich9_info = {
                                  | FLAG_HAS_WOL
                                  | FLAG_HAS_CTRLEXT_ON_LOAD
                                  | FLAG_HAS_AMT
-                                 | FLAG_HAS_ERT
                                  | FLAG_HAS_FLASH
                                  | FLAG_APME_IN_WUC,
-       .pba                    = 10,
+       .pba                    = 18,
        .max_hw_frame_size      = DEFAULT_JUMBO,
        .get_variants           = e1000_get_variants_ich8lan,
        .mac_ops                = &ich8_mac_ops,
@@ -4106,10 +4088,9 @@ const struct e1000_info e1000_ich10_info = {
                                  | FLAG_HAS_WOL
                                  | FLAG_HAS_CTRLEXT_ON_LOAD
                                  | FLAG_HAS_AMT
-                                 | FLAG_HAS_ERT
                                  | FLAG_HAS_FLASH
                                  | FLAG_APME_IN_WUC,
-       .pba                    = 10,
+       .pba                    = 18,
        .max_hw_frame_size      = DEFAULT_JUMBO,
        .get_variants           = e1000_get_variants_ich8lan,
        .mac_ops                = &ich8_mac_ops,
diff --git a/drivers/net/ethernet/intel/e1000e/lib.c b/drivers/net/ethernet/intel/e1000e/lib.c
deleted file mode 100644 (file)
index 0893ab1..0000000
+++ /dev/null
@@ -1,2693 +0,0 @@
-/*******************************************************************************
-
-  Intel PRO/1000 Linux driver
-  Copyright(c) 1999 - 2011 Intel Corporation.
-
-  This program is free software; you can redistribute it and/or modify it
-  under the terms and conditions of the GNU General Public License,
-  version 2, as published by the Free Software Foundation.
-
-  This program is distributed in the hope it will be useful, but WITHOUT
-  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
-  more details.
-
-  You should have received a copy of the GNU General Public License along with
-  this program; if not, write to the Free Software Foundation, Inc.,
-  51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
-
-  The full GNU General Public License is included in this distribution in
-  the file called "COPYING".
-
-  Contact Information:
-  Linux NICS <linux.nics@intel.com>
-  e1000-devel Mailing List <e1000-devel@lists.sourceforge.net>
-  Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
-
-*******************************************************************************/
-
-#include "e1000.h"
-
-enum e1000_mng_mode {
-       e1000_mng_mode_none = 0,
-       e1000_mng_mode_asf,
-       e1000_mng_mode_pt,
-       e1000_mng_mode_ipmi,
-       e1000_mng_mode_host_if_only
-};
-
-#define E1000_FACTPS_MNGCG             0x20000000
-
-/* Intel(R) Active Management Technology signature */
-#define E1000_IAMT_SIGNATURE           0x544D4149
-
-/**
- *  e1000e_get_bus_info_pcie - Get PCIe bus information
- *  @hw: pointer to the HW structure
- *
- *  Determines and stores the system bus information for a particular
- *  network interface.  The following bus information is determined and stored:
- *  bus speed, bus width, type (PCIe), and PCIe function.
- **/
-s32 e1000e_get_bus_info_pcie(struct e1000_hw *hw)
-{
-       struct e1000_mac_info *mac = &hw->mac;
-       struct e1000_bus_info *bus = &hw->bus;
-       struct e1000_adapter *adapter = hw->adapter;
-       u16 pcie_link_status, cap_offset;
-
-       cap_offset = adapter->pdev->pcie_cap;
-       if (!cap_offset) {
-               bus->width = e1000_bus_width_unknown;
-       } else {
-               pci_read_config_word(adapter->pdev,
-                                    cap_offset + PCIE_LINK_STATUS,
-                                    &pcie_link_status);
-               bus->width = (enum e1000_bus_width)((pcie_link_status &
-                                                    PCIE_LINK_WIDTH_MASK) >>
-                                                   PCIE_LINK_WIDTH_SHIFT);
-       }
-
-       mac->ops.set_lan_id(hw);
-
-       return 0;
-}
-
-/**
- *  e1000_set_lan_id_multi_port_pcie - Set LAN id for PCIe multiple port devices
- *
- *  @hw: pointer to the HW structure
- *
- *  Determines the LAN function id by reading memory-mapped registers
- *  and swaps the port value if requested.
- **/
-void e1000_set_lan_id_multi_port_pcie(struct e1000_hw *hw)
-{
-       struct e1000_bus_info *bus = &hw->bus;
-       u32 reg;
-
-       /*
-        * The status register reports the correct function number
-        * for the device regardless of function swap state.
-        */
-       reg = er32(STATUS);
-       bus->func = (reg & E1000_STATUS_FUNC_MASK) >> E1000_STATUS_FUNC_SHIFT;
-}
-
-/**
- *  e1000_set_lan_id_single_port - Set LAN id for a single port device
- *  @hw: pointer to the HW structure
- *
- *  Sets the LAN function id to zero for a single port device.
- **/
-void e1000_set_lan_id_single_port(struct e1000_hw *hw)
-{
-       struct e1000_bus_info *bus = &hw->bus;
-
-       bus->func = 0;
-}
-
-/**
- *  e1000_clear_vfta_generic - Clear VLAN filter table
- *  @hw: pointer to the HW structure
- *
- *  Clears the register array which contains the VLAN filter table by
- *  setting all the values to 0.
- **/
-void e1000_clear_vfta_generic(struct e1000_hw *hw)
-{
-       u32 offset;
-
-       for (offset = 0; offset < E1000_VLAN_FILTER_TBL_SIZE; offset++) {
-               E1000_WRITE_REG_ARRAY(hw, E1000_VFTA, offset, 0);
-               e1e_flush();
-       }
-}
-
-/**
- *  e1000_write_vfta_generic - Write value to VLAN filter table
- *  @hw: pointer to the HW structure
- *  @offset: register offset in VLAN filter table
- *  @value: register value written to VLAN filter table
- *
- *  Writes value at the given offset in the register array which stores
- *  the VLAN filter table.
- **/
-void e1000_write_vfta_generic(struct e1000_hw *hw, u32 offset, u32 value)
-{
-       E1000_WRITE_REG_ARRAY(hw, E1000_VFTA, offset, value);
-       e1e_flush();
-}
-
-/**
- *  e1000e_init_rx_addrs - Initialize receive address's
- *  @hw: pointer to the HW structure
- *  @rar_count: receive address registers
- *
- *  Setup the receive address registers by setting the base receive address
- *  register to the devices MAC address and clearing all the other receive
- *  address registers to 0.
- **/
-void e1000e_init_rx_addrs(struct e1000_hw *hw, u16 rar_count)
-{
-       u32 i;
-       u8 mac_addr[ETH_ALEN] = {0};
-
-       /* Setup the receive address */
-       e_dbg("Programming MAC Address into RAR[0]\n");
-
-       e1000e_rar_set(hw, hw->mac.addr, 0);
-
-       /* Zero out the other (rar_entry_count - 1) receive addresses */
-       e_dbg("Clearing RAR[1-%u]\n", rar_count-1);
-       for (i = 1; i < rar_count; i++)
-               e1000e_rar_set(hw, mac_addr, i);
-}
-
-/**
- *  e1000_check_alt_mac_addr_generic - Check for alternate MAC addr
- *  @hw: pointer to the HW structure
- *
- *  Checks the nvm for an alternate MAC address.  An alternate MAC address
- *  can be setup by pre-boot software and must be treated like a permanent
- *  address and must override the actual permanent MAC address. If an
- *  alternate MAC address is found it is programmed into RAR0, replacing
- *  the permanent address that was installed into RAR0 by the Si on reset.
- *  This function will return SUCCESS unless it encounters an error while
- *  reading the EEPROM.
- **/
-s32 e1000_check_alt_mac_addr_generic(struct e1000_hw *hw)
-{
-       u32 i;
-       s32 ret_val = 0;
-       u16 offset, nvm_alt_mac_addr_offset, nvm_data;
-       u8 alt_mac_addr[ETH_ALEN];
-
-       ret_val = e1000_read_nvm(hw, NVM_COMPAT, 1, &nvm_data);
-       if (ret_val)
-               goto out;
-
-       /* Check for LOM (vs. NIC) or one of two valid mezzanine cards */
-       if (!((nvm_data & NVM_COMPAT_LOM) ||
-             (hw->adapter->pdev->device == E1000_DEV_ID_82571EB_SERDES_DUAL) ||
-             (hw->adapter->pdev->device == E1000_DEV_ID_82571EB_SERDES_QUAD) ||
-             (hw->adapter->pdev->device == E1000_DEV_ID_82571EB_SERDES)))
-               goto out;
-
-       ret_val = e1000_read_nvm(hw, NVM_ALT_MAC_ADDR_PTR, 1,
-                                &nvm_alt_mac_addr_offset);
-       if (ret_val) {
-               e_dbg("NVM Read Error\n");
-               goto out;
-       }
-
-       if ((nvm_alt_mac_addr_offset == 0xFFFF) ||
-           (nvm_alt_mac_addr_offset == 0x0000))
-               /* There is no Alternate MAC Address */
-               goto out;
-
-       if (hw->bus.func == E1000_FUNC_1)
-               nvm_alt_mac_addr_offset += E1000_ALT_MAC_ADDRESS_OFFSET_LAN1;
-       for (i = 0; i < ETH_ALEN; i += 2) {
-               offset = nvm_alt_mac_addr_offset + (i >> 1);
-               ret_val = e1000_read_nvm(hw, offset, 1, &nvm_data);
-               if (ret_val) {
-                       e_dbg("NVM Read Error\n");
-                       goto out;
-               }
-
-               alt_mac_addr[i] = (u8)(nvm_data & 0xFF);
-               alt_mac_addr[i + 1] = (u8)(nvm_data >> 8);
-       }
-
-       /* if multicast bit is set, the alternate address will not be used */
-       if (is_multicast_ether_addr(alt_mac_addr)) {
-               e_dbg("Ignoring Alternate Mac Address with MC bit set\n");
-               goto out;
-       }
-
-       /*
-        * We have a valid alternate MAC address, and we want to treat it the
-        * same as the normal permanent MAC address stored by the HW into the
-        * RAR. Do this by mapping this address into RAR0.
-        */
-       e1000e_rar_set(hw, alt_mac_addr, 0);
-
-out:
-       return ret_val;
-}
-
-/**
- *  e1000e_rar_set - Set receive address register
- *  @hw: pointer to the HW structure
- *  @addr: pointer to the receive address
- *  @index: receive address array register
- *
- *  Sets the receive address array register at index to the address passed
- *  in by addr.
- **/
-void e1000e_rar_set(struct e1000_hw *hw, u8 *addr, u32 index)
-{
-       u32 rar_low, rar_high;
-
-       /*
-        * HW expects these in little endian so we reverse the byte order
-        * from network order (big endian) to little endian
-        */
-       rar_low = ((u32) addr[0] |
-                  ((u32) addr[1] << 8) |
-                   ((u32) addr[2] << 16) | ((u32) addr[3] << 24));
-
-       rar_high = ((u32) addr[4] | ((u32) addr[5] << 8));
-
-       /* If MAC address zero, no need to set the AV bit */
-       if (rar_low || rar_high)
-               rar_high |= E1000_RAH_AV;
-
-       /*
-        * Some bridges will combine consecutive 32-bit writes into
-        * a single burst write, which will malfunction on some parts.
-        * The flushes avoid this.
-        */
-       ew32(RAL(index), rar_low);
-       e1e_flush();
-       ew32(RAH(index), rar_high);
-       e1e_flush();
-}
-
-/**
- *  e1000_hash_mc_addr - Generate a multicast hash value
- *  @hw: pointer to the HW structure
- *  @mc_addr: pointer to a multicast address
- *
- *  Generates a multicast address hash value which is used to determine
- *  the multicast filter table array address and new table value.  See
- *  e1000_mta_set_generic()
- **/
-static u32 e1000_hash_mc_addr(struct e1000_hw *hw, u8 *mc_addr)
-{
-       u32 hash_value, hash_mask;
-       u8 bit_shift = 0;
-
-       /* Register count multiplied by bits per register */
-       hash_mask = (hw->mac.mta_reg_count * 32) - 1;
-
-       /*
-        * For a mc_filter_type of 0, bit_shift is the number of left-shifts
-        * where 0xFF would still fall within the hash mask.
-        */
-       while (hash_mask >> bit_shift != 0xFF)
-               bit_shift++;
-
-       /*
-        * The portion of the address that is used for the hash table
-        * is determined by the mc_filter_type setting.
-        * The algorithm is such that there is a total of 8 bits of shifting.
-        * The bit_shift for a mc_filter_type of 0 represents the number of
-        * left-shifts where the MSB of mc_addr[5] would still fall within
-        * the hash_mask.  Case 0 does this exactly.  Since there are a total
-        * of 8 bits of shifting, then mc_addr[4] will shift right the
-        * remaining number of bits. Thus 8 - bit_shift.  The rest of the
-        * cases are a variation of this algorithm...essentially raising the
-        * number of bits to shift mc_addr[5] left, while still keeping the
-        * 8-bit shifting total.
-        *
-        * For example, given the following Destination MAC Address and an
-        * mta register count of 128 (thus a 4096-bit vector and 0xFFF mask),
-        * we can see that the bit_shift for case 0 is 4.  These are the hash
-        * values resulting from each mc_filter_type...
-        * [0] [1] [2] [3] [4] [5]
-        * 01  AA  00  12  34  56
-        * LSB           MSB
-        *
-        * case 0: hash_value = ((0x34 >> 4) | (0x56 << 4)) & 0xFFF = 0x563
-        * case 1: hash_value = ((0x34 >> 3) | (0x56 << 5)) & 0xFFF = 0xAC6
-        * case 2: hash_value = ((0x34 >> 2) | (0x56 << 6)) & 0xFFF = 0x163
-        * case 3: hash_value = ((0x34 >> 0) | (0x56 << 8)) & 0xFFF = 0x634
-        */
-       switch (hw->mac.mc_filter_type) {
-       default:
-       case 0:
-               break;
-       case 1:
-               bit_shift += 1;
-               break;
-       case 2:
-               bit_shift += 2;
-               break;
-       case 3:
-               bit_shift += 4;
-               break;
-       }
-
-       hash_value = hash_mask & (((mc_addr[4] >> (8 - bit_shift)) |
-                                 (((u16) mc_addr[5]) << bit_shift)));
-
-       return hash_value;
-}
-
-/**
- *  e1000e_update_mc_addr_list_generic - Update Multicast addresses
- *  @hw: pointer to the HW structure
- *  @mc_addr_list: array of multicast addresses to program
- *  @mc_addr_count: number of multicast addresses to program
- *
- *  Updates entire Multicast Table Array.
- *  The caller must have a packed mc_addr_list of multicast addresses.
- **/
-void e1000e_update_mc_addr_list_generic(struct e1000_hw *hw,
-                                       u8 *mc_addr_list, u32 mc_addr_count)
-{
-       u32 hash_value, hash_bit, hash_reg;
-       int i;
-
-       /* clear mta_shadow */
-       memset(&hw->mac.mta_shadow, 0, sizeof(hw->mac.mta_shadow));
-
-       /* update mta_shadow from mc_addr_list */
-       for (i = 0; (u32) i < mc_addr_count; i++) {
-               hash_value = e1000_hash_mc_addr(hw, mc_addr_list);
-
-               hash_reg = (hash_value >> 5) & (hw->mac.mta_reg_count - 1);
-               hash_bit = hash_value & 0x1F;
-
-               hw->mac.mta_shadow[hash_reg] |= (1 << hash_bit);
-               mc_addr_list += (ETH_ALEN);
-       }
-
-       /* replace the entire MTA table */
-       for (i = hw->mac.mta_reg_count - 1; i >= 0; i--)
-               E1000_WRITE_REG_ARRAY(hw, E1000_MTA, i, hw->mac.mta_shadow[i]);
-       e1e_flush();
-}
-
-/**
- *  e1000e_clear_hw_cntrs_base - Clear base hardware counters
- *  @hw: pointer to the HW structure
- *
- *  Clears the base hardware counters by reading the counter registers.
- **/
-void e1000e_clear_hw_cntrs_base(struct e1000_hw *hw)
-{
-       er32(CRCERRS);
-       er32(SYMERRS);
-       er32(MPC);
-       er32(SCC);
-       er32(ECOL);
-       er32(MCC);
-       er32(LATECOL);
-       er32(COLC);
-       er32(DC);
-       er32(SEC);
-       er32(RLEC);
-       er32(XONRXC);
-       er32(XONTXC);
-       er32(XOFFRXC);
-       er32(XOFFTXC);
-       er32(FCRUC);
-       er32(GPRC);
-       er32(BPRC);
-       er32(MPRC);
-       er32(GPTC);
-       er32(GORCL);
-       er32(GORCH);
-       er32(GOTCL);
-       er32(GOTCH);
-       er32(RNBC);
-       er32(RUC);
-       er32(RFC);
-       er32(ROC);
-       er32(RJC);
-       er32(TORL);
-       er32(TORH);
-       er32(TOTL);
-       er32(TOTH);
-       er32(TPR);
-       er32(TPT);
-       er32(MPTC);
-       er32(BPTC);
-}
-
-/**
- *  e1000e_check_for_copper_link - Check for link (Copper)
- *  @hw: pointer to the HW structure
- *
- *  Checks to see of the link status of the hardware has changed.  If a
- *  change in link status has been detected, then we read the PHY registers
- *  to get the current speed/duplex if link exists.
- **/
-s32 e1000e_check_for_copper_link(struct e1000_hw *hw)
-{
-       struct e1000_mac_info *mac = &hw->mac;
-       s32 ret_val;
-       bool link;
-
-       /*
-        * We only want to go out to the PHY registers to see if Auto-Neg
-        * has completed and/or if our link status has changed.  The
-        * get_link_status flag is set upon receiving a Link Status
-        * Change or Rx Sequence Error interrupt.
-        */
-       if (!mac->get_link_status)
-               return 0;
-
-       /*
-        * First we want to see if the MII Status Register reports
-        * link.  If so, then we want to get the current speed/duplex
-        * of the PHY.
-        */
-       ret_val = e1000e_phy_has_link_generic(hw, 1, 0, &link);
-       if (ret_val)
-               return ret_val;
-
-       if (!link)
-               return ret_val; /* No link detected */
-
-       mac->get_link_status = false;
-
-       /*
-        * Check if there was DownShift, must be checked
-        * immediately after link-up
-        */
-       e1000e_check_downshift(hw);
-
-       /*
-        * If we are forcing speed/duplex, then we simply return since
-        * we have already determined whether we have link or not.
-        */
-       if (!mac->autoneg) {
-               ret_val = -E1000_ERR_CONFIG;
-               return ret_val;
-       }
-
-       /*
-        * Auto-Neg is enabled.  Auto Speed Detection takes care
-        * of MAC speed/duplex configuration.  So we only need to
-        * configure Collision Distance in the MAC.
-        */
-       e1000e_config_collision_dist(hw);
-
-       /*
-        * Configure Flow Control now that Auto-Neg has completed.
-        * First, we need to restore the desired flow control
-        * settings because we may have had to re-autoneg with a
-        * different link partner.
-        */
-       ret_val = e1000e_config_fc_after_link_up(hw);
-       if (ret_val)
-               e_dbg("Error configuring flow control\n");
-
-       return ret_val;
-}
-
-/**
- *  e1000e_check_for_fiber_link - Check for link (Fiber)
- *  @hw: pointer to the HW structure
- *
- *  Checks for link up on the hardware.  If link is not up and we have
- *  a signal, then we need to force link up.
- **/
-s32 e1000e_check_for_fiber_link(struct e1000_hw *hw)
-{
-       struct e1000_mac_info *mac = &hw->mac;
-       u32 rxcw;
-       u32 ctrl;
-       u32 status;
-       s32 ret_val;
-
-       ctrl = er32(CTRL);
-       status = er32(STATUS);
-       rxcw = er32(RXCW);
-
-       /*
-        * If we don't have link (auto-negotiation failed or link partner
-        * cannot auto-negotiate), the cable is plugged in (we have signal),
-        * and our link partner is not trying to auto-negotiate with us (we
-        * are receiving idles or data), we need to force link up. We also
-        * need to give auto-negotiation time to complete, in case the cable
-        * was just plugged in. The autoneg_failed flag does this.
-        */
-       /* (ctrl & E1000_CTRL_SWDPIN1) == 1 == have signal */
-       if ((ctrl & E1000_CTRL_SWDPIN1) && (!(status & E1000_STATUS_LU)) &&
-           (!(rxcw & E1000_RXCW_C))) {
-               if (mac->autoneg_failed == 0) {
-                       mac->autoneg_failed = 1;
-                       return 0;
-               }
-               e_dbg("NOT Rx'ing /C/, disable AutoNeg and force link.\n");
-
-               /* Disable auto-negotiation in the TXCW register */
-               ew32(TXCW, (mac->txcw & ~E1000_TXCW_ANE));
-
-               /* Force link-up and also force full-duplex. */
-               ctrl = er32(CTRL);
-               ctrl |= (E1000_CTRL_SLU | E1000_CTRL_FD);
-               ew32(CTRL, ctrl);
-
-               /* Configure Flow Control after forcing link up. */
-               ret_val = e1000e_config_fc_after_link_up(hw);
-               if (ret_val) {
-                       e_dbg("Error configuring flow control\n");
-                       return ret_val;
-               }
-       } else if ((ctrl & E1000_CTRL_SLU) && (rxcw & E1000_RXCW_C)) {
-               /*
-                * If we are forcing link and we are receiving /C/ ordered
-                * sets, re-enable auto-negotiation in the TXCW register
-                * and disable forced link in the Device Control register
-                * in an attempt to auto-negotiate with our link partner.
-                */
-               e_dbg("Rx'ing /C/, enable AutoNeg and stop forcing link.\n");
-               ew32(TXCW, mac->txcw);
-               ew32(CTRL, (ctrl & ~E1000_CTRL_SLU));
-
-               mac->serdes_has_link = true;
-       }
-
-       return 0;
-}
-
-/**
- *  e1000e_check_for_serdes_link - Check for link (Serdes)
- *  @hw: pointer to the HW structure
- *
- *  Checks for link up on the hardware.  If link is not up and we have
- *  a signal, then we need to force link up.
- **/
-s32 e1000e_check_for_serdes_link(struct e1000_hw *hw)
-{
-       struct e1000_mac_info *mac = &hw->mac;
-       u32 rxcw;
-       u32 ctrl;
-       u32 status;
-       s32 ret_val;
-
-       ctrl = er32(CTRL);
-       status = er32(STATUS);
-       rxcw = er32(RXCW);
-
-       /*
-        * If we don't have link (auto-negotiation failed or link partner
-        * cannot auto-negotiate), and our link partner is not trying to
-        * auto-negotiate with us (we are receiving idles or data),
-        * we need to force link up. We also need to give auto-negotiation
-        * time to complete.
-        */
-       /* (ctrl & E1000_CTRL_SWDPIN1) == 1 == have signal */
-       if ((!(status & E1000_STATUS_LU)) && (!(rxcw & E1000_RXCW_C))) {
-               if (mac->autoneg_failed == 0) {
-                       mac->autoneg_failed = 1;
-                       return 0;
-               }
-               e_dbg("NOT Rx'ing /C/, disable AutoNeg and force link.\n");
-
-               /* Disable auto-negotiation in the TXCW register */
-               ew32(TXCW, (mac->txcw & ~E1000_TXCW_ANE));
-
-               /* Force link-up and also force full-duplex. */
-               ctrl = er32(CTRL);
-               ctrl |= (E1000_CTRL_SLU | E1000_CTRL_FD);
-               ew32(CTRL, ctrl);
-
-               /* Configure Flow Control after forcing link up. */
-               ret_val = e1000e_config_fc_after_link_up(hw);
-               if (ret_val) {
-                       e_dbg("Error configuring flow control\n");
-                       return ret_val;
-               }
-       } else if ((ctrl & E1000_CTRL_SLU) && (rxcw & E1000_RXCW_C)) {
-               /*
-                * If we are forcing link and we are receiving /C/ ordered
-                * sets, re-enable auto-negotiation in the TXCW register
-                * and disable forced link in the Device Control register
-                * in an attempt to auto-negotiate with our link partner.
-                */
-               e_dbg("Rx'ing /C/, enable AutoNeg and stop forcing link.\n");
-               ew32(TXCW, mac->txcw);
-               ew32(CTRL, (ctrl & ~E1000_CTRL_SLU));
-
-               mac->serdes_has_link = true;
-       } else if (!(E1000_TXCW_ANE & er32(TXCW))) {
-               /*
-                * If we force link for non-auto-negotiation switch, check
-                * link status based on MAC synchronization for internal
-                * serdes media type.
-                */
-               /* SYNCH bit and IV bit are sticky. */
-               udelay(10);
-               rxcw = er32(RXCW);
-               if (rxcw & E1000_RXCW_SYNCH) {
-                       if (!(rxcw & E1000_RXCW_IV)) {
-                               mac->serdes_has_link = true;
-                               e_dbg("SERDES: Link up - forced.\n");
-                       }
-               } else {
-                       mac->serdes_has_link = false;
-                       e_dbg("SERDES: Link down - force failed.\n");
-               }
-       }
-
-       if (E1000_TXCW_ANE & er32(TXCW)) {
-               status = er32(STATUS);
-               if (status & E1000_STATUS_LU) {
-                       /* SYNCH bit and IV bit are sticky, so reread rxcw.  */
-                       udelay(10);
-                       rxcw = er32(RXCW);
-                       if (rxcw & E1000_RXCW_SYNCH) {
-                               if (!(rxcw & E1000_RXCW_IV)) {
-                                       mac->serdes_has_link = true;
-                                       e_dbg("SERDES: Link up - autoneg "
-                                          "completed successfully.\n");
-                               } else {
-                                       mac->serdes_has_link = false;
-                                       e_dbg("SERDES: Link down - invalid"
-                                          "codewords detected in autoneg.\n");
-                               }
-                       } else {
-                               mac->serdes_has_link = false;
-                               e_dbg("SERDES: Link down - no sync.\n");
-                       }
-               } else {
-                       mac->serdes_has_link = false;
-                       e_dbg("SERDES: Link down - autoneg failed\n");
-               }
-       }
-
-       return 0;
-}
-
-/**
- *  e1000_set_default_fc_generic - Set flow control default values
- *  @hw: pointer to the HW structure
- *
- *  Read the EEPROM for the default values for flow control and store the
- *  values.
- **/
-static s32 e1000_set_default_fc_generic(struct e1000_hw *hw)
-{
-       s32 ret_val;
-       u16 nvm_data;
-
-       /*
-        * Read and store word 0x0F of the EEPROM. This word contains bits
-        * that determine the hardware's default PAUSE (flow control) mode,
-        * a bit that determines whether the HW defaults to enabling or
-        * disabling auto-negotiation, and the direction of the
-        * SW defined pins. If there is no SW over-ride of the flow
-        * control setting, then the variable hw->fc will
-        * be initialized based on a value in the EEPROM.
-        */
-       ret_val = e1000_read_nvm(hw, NVM_INIT_CONTROL2_REG, 1, &nvm_data);
-
-       if (ret_val) {
-               e_dbg("NVM Read Error\n");
-               return ret_val;
-       }
-
-       if ((nvm_data & NVM_WORD0F_PAUSE_MASK) == 0)
-               hw->fc.requested_mode = e1000_fc_none;
-       else if ((nvm_data & NVM_WORD0F_PAUSE_MASK) ==
-                NVM_WORD0F_ASM_DIR)
-               hw->fc.requested_mode = e1000_fc_tx_pause;
-       else
-               hw->fc.requested_mode = e1000_fc_full;
-
-       return 0;
-}
-
-/**
- *  e1000e_setup_link - Setup flow control and link settings
- *  @hw: pointer to the HW structure
- *
- *  Determines which flow control settings to use, then configures flow
- *  control.  Calls the appropriate media-specific link configuration
- *  function.  Assuming the adapter has a valid link partner, a valid link
- *  should be established.  Assumes the hardware has previously been reset
- *  and the transmitter and receiver are not enabled.
- **/
-s32 e1000e_setup_link(struct e1000_hw *hw)
-{
-       struct e1000_mac_info *mac = &hw->mac;
-       s32 ret_val;
-
-       /*
-        * In the case of the phy reset being blocked, we already have a link.
-        * We do not need to set it up again.
-        */
-       if (e1000_check_reset_block(hw))
-               return 0;
-
-       /*
-        * If requested flow control is set to default, set flow control
-        * based on the EEPROM flow control settings.
-        */
-       if (hw->fc.requested_mode == e1000_fc_default) {
-               ret_val = e1000_set_default_fc_generic(hw);
-               if (ret_val)
-                       return ret_val;
-       }
-
-       /*
-        * Save off the requested flow control mode for use later.  Depending
-        * on the link partner's capabilities, we may or may not use this mode.
-        */
-       hw->fc.current_mode = hw->fc.requested_mode;
-
-       e_dbg("After fix-ups FlowControl is now = %x\n",
-               hw->fc.current_mode);
-
-       /* Call the necessary media_type subroutine to configure the link. */
-       ret_val = mac->ops.setup_physical_interface(hw);
-       if (ret_val)
-               return ret_val;
-
-       /*
-        * Initialize the flow control address, type, and PAUSE timer
-        * registers to their default values.  This is done even if flow
-        * control is disabled, because it does not hurt anything to
-        * initialize these registers.
-        */
-       e_dbg("Initializing the Flow Control address, type and timer regs\n");
-       ew32(FCT, FLOW_CONTROL_TYPE);
-       ew32(FCAH, FLOW_CONTROL_ADDRESS_HIGH);
-       ew32(FCAL, FLOW_CONTROL_ADDRESS_LOW);
-
-       ew32(FCTTV, hw->fc.pause_time);
-
-       return e1000e_set_fc_watermarks(hw);
-}
-
-/**
- *  e1000_commit_fc_settings_generic - Configure flow control
- *  @hw: pointer to the HW structure
- *
- *  Write the flow control settings to the Transmit Config Word Register (TXCW)
- *  base on the flow control settings in e1000_mac_info.
- **/
-static s32 e1000_commit_fc_settings_generic(struct e1000_hw *hw)
-{
-       struct e1000_mac_info *mac = &hw->mac;
-       u32 txcw;
-
-       /*
-        * Check for a software override of the flow control settings, and
-        * setup the device accordingly.  If auto-negotiation is enabled, then
-        * software will have to set the "PAUSE" bits to the correct value in
-        * the Transmit Config Word Register (TXCW) and re-start auto-
-        * negotiation.  However, if auto-negotiation is disabled, then
-        * software will have to manually configure the two flow control enable
-        * bits in the CTRL register.
-        *
-        * The possible values of the "fc" parameter are:
-        *      0:  Flow control is completely disabled
-        *      1:  Rx flow control is enabled (we can receive pause frames,
-        *          but not send pause frames).
-        *      2:  Tx flow control is enabled (we can send pause frames but we
-        *          do not support receiving pause frames).
-        *      3:  Both Rx and Tx flow control (symmetric) are enabled.
-        */
-       switch (hw->fc.current_mode) {
-       case e1000_fc_none:
-               /* Flow control completely disabled by a software over-ride. */
-               txcw = (E1000_TXCW_ANE | E1000_TXCW_FD);
-               break;
-       case e1000_fc_rx_pause:
-               /*
-                * Rx Flow control is enabled and Tx Flow control is disabled
-                * by a software over-ride. Since there really isn't a way to
-                * advertise that we are capable of Rx Pause ONLY, we will
-                * advertise that we support both symmetric and asymmetric Rx
-                * PAUSE.  Later, we will disable the adapter's ability to send
-                * PAUSE frames.
-                */
-               txcw = (E1000_TXCW_ANE | E1000_TXCW_FD | E1000_TXCW_PAUSE_MASK);
-               break;
-       case e1000_fc_tx_pause:
-               /*
-                * Tx Flow control is enabled, and Rx Flow control is disabled,
-                * by a software over-ride.
-                */
-               txcw = (E1000_TXCW_ANE | E1000_TXCW_FD | E1000_TXCW_ASM_DIR);
-               break;
-       case e1000_fc_full:
-               /*
-                * Flow control (both Rx and Tx) is enabled by a software
-                * over-ride.
-                */
-               txcw = (E1000_TXCW_ANE | E1000_TXCW_FD | E1000_TXCW_PAUSE_MASK);
-               break;
-       default:
-               e_dbg("Flow control param set incorrectly\n");
-               return -E1000_ERR_CONFIG;
-               break;
-       }
-
-       ew32(TXCW, txcw);
-       mac->txcw = txcw;
-
-       return 0;
-}
-
-/**
- *  e1000_poll_fiber_serdes_link_generic - Poll for link up
- *  @hw: pointer to the HW structure
- *
- *  Polls for link up by reading the status register, if link fails to come
- *  up with auto-negotiation, then the link is forced if a signal is detected.
- **/
-static s32 e1000_poll_fiber_serdes_link_generic(struct e1000_hw *hw)
-{
-       struct e1000_mac_info *mac = &hw->mac;
-       u32 i, status;
-       s32 ret_val;
-
-       /*
-        * If we have a signal (the cable is plugged in, or assumed true for
-        * serdes media) then poll for a "Link-Up" indication in the Device
-        * Status Register.  Time-out if a link isn't seen in 500 milliseconds
-        * seconds (Auto-negotiation should complete in less than 500
-        * milliseconds even if the other end is doing it in SW).
-        */
-       for (i = 0; i < FIBER_LINK_UP_LIMIT; i++) {
-               usleep_range(10000, 20000);
-               status = er32(STATUS);
-               if (status & E1000_STATUS_LU)
-                       break;
-       }
-       if (i == FIBER_LINK_UP_LIMIT) {
-               e_dbg("Never got a valid link from auto-neg!!!\n");
-               mac->autoneg_failed = 1;
-               /*
-                * AutoNeg failed to achieve a link, so we'll call
-                * mac->check_for_link. This routine will force the
-                * link up if we detect a signal. This will allow us to
-                * communicate with non-autonegotiating link partners.
-                */
-               ret_val = mac->ops.check_for_link(hw);
-               if (ret_val) {
-                       e_dbg("Error while checking for link\n");
-                       return ret_val;
-               }
-               mac->autoneg_failed = 0;
-       } else {
-               mac->autoneg_failed = 0;
-               e_dbg("Valid Link Found\n");
-       }
-
-       return 0;
-}
-
-/**
- *  e1000e_setup_fiber_serdes_link - Setup link for fiber/serdes
- *  @hw: pointer to the HW structure
- *
- *  Configures collision distance and flow control for fiber and serdes
- *  links.  Upon successful setup, poll for link.
- **/
-s32 e1000e_setup_fiber_serdes_link(struct e1000_hw *hw)
-{
-       u32 ctrl;
-       s32 ret_val;
-
-       ctrl = er32(CTRL);
-
-       /* Take the link out of reset */
-       ctrl &= ~E1000_CTRL_LRST;
-
-       e1000e_config_collision_dist(hw);
-
-       ret_val = e1000_commit_fc_settings_generic(hw);
-       if (ret_val)
-               return ret_val;
-
-       /*
-        * Since auto-negotiation is enabled, take the link out of reset (the
-        * link will be in reset, because we previously reset the chip). This
-        * will restart auto-negotiation.  If auto-negotiation is successful
-        * then the link-up status bit will be set and the flow control enable
-        * bits (RFCE and TFCE) will be set according to their negotiated value.
-        */
-       e_dbg("Auto-negotiation enabled\n");
-
-       ew32(CTRL, ctrl);
-       e1e_flush();
-       usleep_range(1000, 2000);
-
-       /*
-        * For these adapters, the SW definable pin 1 is set when the optics
-        * detect a signal.  If we have a signal, then poll for a "Link-Up"
-        * indication.
-        */
-       if (hw->phy.media_type == e1000_media_type_internal_serdes ||
-           (er32(CTRL) & E1000_CTRL_SWDPIN1)) {
-               ret_val = e1000_poll_fiber_serdes_link_generic(hw);
-       } else {
-               e_dbg("No signal detected\n");
-       }
-
-       return 0;
-}
-
-/**
- *  e1000e_config_collision_dist - Configure collision distance
- *  @hw: pointer to the HW structure
- *
- *  Configures the collision distance to the default value and is used
- *  during link setup. Currently no func pointer exists and all
- *  implementations are handled in the generic version of this function.
- **/
-void e1000e_config_collision_dist(struct e1000_hw *hw)
-{
-       u32 tctl;
-
-       tctl = er32(TCTL);
-
-       tctl &= ~E1000_TCTL_COLD;
-       tctl |= E1000_COLLISION_DISTANCE << E1000_COLD_SHIFT;
-
-       ew32(TCTL, tctl);
-       e1e_flush();
-}
-
-/**
- *  e1000e_set_fc_watermarks - Set flow control high/low watermarks
- *  @hw: pointer to the HW structure
- *
- *  Sets the flow control high/low threshold (watermark) registers.  If
- *  flow control XON frame transmission is enabled, then set XON frame
- *  transmission as well.
- **/
-s32 e1000e_set_fc_watermarks(struct e1000_hw *hw)
-{
-       u32 fcrtl = 0, fcrth = 0;
-
-       /*
-        * Set the flow control receive threshold registers.  Normally,
-        * these registers will be set to a default threshold that may be
-        * adjusted later by the driver's runtime code.  However, if the
-        * ability to transmit pause frames is not enabled, then these
-        * registers will be set to 0.
-        */
-       if (hw->fc.current_mode & e1000_fc_tx_pause) {
-               /*
-                * We need to set up the Receive Threshold high and low water
-                * marks as well as (optionally) enabling the transmission of
-                * XON frames.
-                */
-               fcrtl = hw->fc.low_water;
-               fcrtl |= E1000_FCRTL_XONE;
-               fcrth = hw->fc.high_water;
-       }
-       ew32(FCRTL, fcrtl);
-       ew32(FCRTH, fcrth);
-
-       return 0;
-}
-
-/**
- *  e1000e_force_mac_fc - Force the MAC's flow control settings
- *  @hw: pointer to the HW structure
- *
- *  Force the MAC's flow control settings.  Sets the TFCE and RFCE bits in the
- *  device control register to reflect the adapter settings.  TFCE and RFCE
- *  need to be explicitly set by software when a copper PHY is used because
- *  autonegotiation is managed by the PHY rather than the MAC.  Software must
- *  also configure these bits when link is forced on a fiber connection.
- **/
-s32 e1000e_force_mac_fc(struct e1000_hw *hw)
-{
-       u32 ctrl;
-
-       ctrl = er32(CTRL);
-
-       /*
-        * Because we didn't get link via the internal auto-negotiation
-        * mechanism (we either forced link or we got link via PHY
-        * auto-neg), we have to manually enable/disable transmit an
-        * receive flow control.
-        *
-        * The "Case" statement below enables/disable flow control
-        * according to the "hw->fc.current_mode" parameter.
-        *
-        * The possible values of the "fc" parameter are:
-        *      0:  Flow control is completely disabled
-        *      1:  Rx flow control is enabled (we can receive pause
-        *          frames but not send pause frames).
-        *      2:  Tx flow control is enabled (we can send pause frames
-        *          frames but we do not receive pause frames).
-        *      3:  Both Rx and Tx flow control (symmetric) is enabled.
-        *  other:  No other values should be possible at this point.
-        */
-       e_dbg("hw->fc.current_mode = %u\n", hw->fc.current_mode);
-
-       switch (hw->fc.current_mode) {
-       case e1000_fc_none:
-               ctrl &= (~(E1000_CTRL_TFCE | E1000_CTRL_RFCE));
-               break;
-       case e1000_fc_rx_pause:
-               ctrl &= (~E1000_CTRL_TFCE);
-               ctrl |= E1000_CTRL_RFCE;
-               break;
-       case e1000_fc_tx_pause:
-               ctrl &= (~E1000_CTRL_RFCE);
-               ctrl |= E1000_CTRL_TFCE;
-               break;
-       case e1000_fc_full:
-               ctrl |= (E1000_CTRL_TFCE | E1000_CTRL_RFCE);
-               break;
-       default:
-               e_dbg("Flow control param set incorrectly\n");
-               return -E1000_ERR_CONFIG;
-       }
-
-       ew32(CTRL, ctrl);
-
-       return 0;
-}
-
-/**
- *  e1000e_config_fc_after_link_up - Configures flow control after link
- *  @hw: pointer to the HW structure
- *
- *  Checks the status of auto-negotiation after link up to ensure that the
- *  speed and duplex were not forced.  If the link needed to be forced, then
- *  flow control needs to be forced also.  If auto-negotiation is enabled
- *  and did not fail, then we configure flow control based on our link
- *  partner.
- **/
-s32 e1000e_config_fc_after_link_up(struct e1000_hw *hw)
-{
-       struct e1000_mac_info *mac = &hw->mac;
-       s32 ret_val = 0;
-       u16 mii_status_reg, mii_nway_adv_reg, mii_nway_lp_ability_reg;
-       u16 speed, duplex;
-
-       /*
-        * Check for the case where we have fiber media and auto-neg failed
-        * so we had to force link.  In this case, we need to force the
-        * configuration of the MAC to match the "fc" parameter.
-        */
-       if (mac->autoneg_failed) {
-               if (hw->phy.media_type == e1000_media_type_fiber ||
-                   hw->phy.media_type == e1000_media_type_internal_serdes)
-                       ret_val = e1000e_force_mac_fc(hw);
-       } else {
-               if (hw->phy.media_type == e1000_media_type_copper)
-                       ret_val = e1000e_force_mac_fc(hw);
-       }
-
-       if (ret_val) {
-               e_dbg("Error forcing flow control settings\n");
-               return ret_val;
-       }
-
-       /*
-        * Check for the case where we have copper media and auto-neg is
-        * enabled.  In this case, we need to check and see if Auto-Neg
-        * has completed, and if so, how the PHY and link partner has
-        * flow control configured.
-        */
-       if ((hw->phy.media_type == e1000_media_type_copper) && mac->autoneg) {
-               /*
-                * Read the MII Status Register and check to see if AutoNeg
-                * has completed.  We read this twice because this reg has
-                * some "sticky" (latched) bits.
-                */
-               ret_val = e1e_rphy(hw, PHY_STATUS, &mii_status_reg);
-               if (ret_val)
-                       return ret_val;
-               ret_val = e1e_rphy(hw, PHY_STATUS, &mii_status_reg);
-               if (ret_val)
-                       return ret_val;
-
-               if (!(mii_status_reg & MII_SR_AUTONEG_COMPLETE)) {
-                       e_dbg("Copper PHY and Auto Neg "
-                                "has not completed.\n");
-                       return ret_val;
-               }
-
-               /*
-                * The AutoNeg process has completed, so we now need to
-                * read both the Auto Negotiation Advertisement
-                * Register (Address 4) and the Auto_Negotiation Base
-                * Page Ability Register (Address 5) to determine how
-                * flow control was negotiated.
-                */
-               ret_val = e1e_rphy(hw, PHY_AUTONEG_ADV, &mii_nway_adv_reg);
-               if (ret_val)
-                       return ret_val;
-               ret_val =
-                   e1e_rphy(hw, PHY_LP_ABILITY, &mii_nway_lp_ability_reg);
-               if (ret_val)
-                       return ret_val;
-
-               /*
-                * Two bits in the Auto Negotiation Advertisement Register
-                * (Address 4) and two bits in the Auto Negotiation Base
-                * Page Ability Register (Address 5) determine flow control
-                * for both the PHY and the link partner.  The following
-                * table, taken out of the IEEE 802.3ab/D6.0 dated March 25,
-                * 1999, describes these PAUSE resolution bits and how flow
-                * control is determined based upon these settings.
-                * NOTE:  DC = Don't Care
-                *
-                *   LOCAL DEVICE  |   LINK PARTNER
-                * PAUSE | ASM_DIR | PAUSE | ASM_DIR | NIC Resolution
-                *-------|---------|-------|---------|--------------------
-                *   0   |    0    |  DC   |   DC    | e1000_fc_none
-                *   0   |    1    |   0   |   DC    | e1000_fc_none
-                *   0   |    1    |   1   |    0    | e1000_fc_none
-                *   0   |    1    |   1   |    1    | e1000_fc_tx_pause
-                *   1   |    0    |   0   |   DC    | e1000_fc_none
-                *   1   |   DC    |   1   |   DC    | e1000_fc_full
-                *   1   |    1    |   0   |    0    | e1000_fc_none
-                *   1   |    1    |   0   |    1    | e1000_fc_rx_pause
-                *
-                * Are both PAUSE bits set to 1?  If so, this implies
-                * Symmetric Flow Control is enabled at both ends.  The
-                * ASM_DIR bits are irrelevant per the spec.
-                *
-                * For Symmetric Flow Control:
-                *
-                *   LOCAL DEVICE  |   LINK PARTNER
-                * PAUSE | ASM_DIR | PAUSE | ASM_DIR | Result
-                *-------|---------|-------|---------|--------------------
-                *   1   |   DC    |   1   |   DC    | E1000_fc_full
-                *
-                */
-               if ((mii_nway_adv_reg & NWAY_AR_PAUSE) &&
-                   (mii_nway_lp_ability_reg & NWAY_LPAR_PAUSE)) {
-                       /*
-                        * Now we need to check if the user selected Rx ONLY
-                        * of pause frames.  In this case, we had to advertise
-                        * FULL flow control because we could not advertise Rx
-                        * ONLY. Hence, we must now check to see if we need to
-                        * turn OFF the TRANSMISSION of PAUSE frames.
-                        */
-                       if (hw->fc.requested_mode == e1000_fc_full) {
-                               hw->fc.current_mode = e1000_fc_full;
-                               e_dbg("Flow Control = FULL.\r\n");
-                       } else {
-                               hw->fc.current_mode = e1000_fc_rx_pause;
-                               e_dbg("Flow Control = "
-                                     "Rx PAUSE frames only.\r\n");
-                       }
-               }
-               /*
-                * For receiving PAUSE frames ONLY.
-                *
-                *   LOCAL DEVICE  |   LINK PARTNER
-                * PAUSE | ASM_DIR | PAUSE | ASM_DIR | Result
-                *-------|---------|-------|---------|--------------------
-                *   0   |    1    |   1   |    1    | e1000_fc_tx_pause
-                */
-               else if (!(mii_nway_adv_reg & NWAY_AR_PAUSE) &&
-                         (mii_nway_adv_reg & NWAY_AR_ASM_DIR) &&
-                         (mii_nway_lp_ability_reg & NWAY_LPAR_PAUSE) &&
-                         (mii_nway_lp_ability_reg & NWAY_LPAR_ASM_DIR)) {
-                       hw->fc.current_mode = e1000_fc_tx_pause;
-                       e_dbg("Flow Control = Tx PAUSE frames only.\r\n");
-               }
-               /*
-                * For transmitting PAUSE frames ONLY.
-                *
-                *   LOCAL DEVICE  |   LINK PARTNER
-                * PAUSE | ASM_DIR | PAUSE | ASM_DIR | Result
-                *-------|---------|-------|---------|--------------------
-                *   1   |    1    |   0   |    1    | e1000_fc_rx_pause
-                */
-               else if ((mii_nway_adv_reg & NWAY_AR_PAUSE) &&
-                        (mii_nway_adv_reg & NWAY_AR_ASM_DIR) &&
-                        !(mii_nway_lp_ability_reg & NWAY_LPAR_PAUSE) &&
-                        (mii_nway_lp_ability_reg & NWAY_LPAR_ASM_DIR)) {
-                       hw->fc.current_mode = e1000_fc_rx_pause;
-                       e_dbg("Flow Control = Rx PAUSE frames only.\r\n");
-               } else {
-                       /*
-                        * Per the IEEE spec, at this point flow control
-                        * should be disabled.
-                        */
-                       hw->fc.current_mode = e1000_fc_none;
-                       e_dbg("Flow Control = NONE.\r\n");
-               }
-
-               /*
-                * Now we need to do one last check...  If we auto-
-                * negotiated to HALF DUPLEX, flow control should not be
-                * enabled per IEEE 802.3 spec.
-                */
-               ret_val = mac->ops.get_link_up_info(hw, &speed, &duplex);
-               if (ret_val) {
-                       e_dbg("Error getting link speed and duplex\n");
-                       return ret_val;
-               }
-
-               if (duplex == HALF_DUPLEX)
-                       hw->fc.current_mode = e1000_fc_none;
-
-               /*
-                * Now we call a subroutine to actually force the MAC
-                * controller to use the correct flow control settings.
-                */
-               ret_val = e1000e_force_mac_fc(hw);
-               if (ret_val) {
-                       e_dbg("Error forcing flow control settings\n");
-                       return ret_val;
-               }
-       }
-
-       return 0;
-}
-
-/**
- *  e1000e_get_speed_and_duplex_copper - Retrieve current speed/duplex
- *  @hw: pointer to the HW structure
- *  @speed: stores the current speed
- *  @duplex: stores the current duplex
- *
- *  Read the status register for the current speed/duplex and store the current
- *  speed and duplex for copper connections.
- **/
-s32 e1000e_get_speed_and_duplex_copper(struct e1000_hw *hw, u16 *speed, u16 *duplex)
-{
-       u32 status;
-
-       status = er32(STATUS);
-       if (status & E1000_STATUS_SPEED_1000)
-               *speed = SPEED_1000;
-       else if (status & E1000_STATUS_SPEED_100)
-               *speed = SPEED_100;
-       else
-               *speed = SPEED_10;
-
-       if (status & E1000_STATUS_FD)
-               *duplex = FULL_DUPLEX;
-       else
-               *duplex = HALF_DUPLEX;
-
-       e_dbg("%u Mbps, %s Duplex\n",
-             *speed == SPEED_1000 ? 1000 : *speed == SPEED_100 ? 100 : 10,
-             *duplex == FULL_DUPLEX ? "Full" : "Half");
-
-       return 0;
-}
-
-/**
- *  e1000e_get_speed_and_duplex_fiber_serdes - Retrieve current speed/duplex
- *  @hw: pointer to the HW structure
- *  @speed: stores the current speed
- *  @duplex: stores the current duplex
- *
- *  Sets the speed and duplex to gigabit full duplex (the only possible option)
- *  for fiber/serdes links.
- **/
-s32 e1000e_get_speed_and_duplex_fiber_serdes(struct e1000_hw *hw, u16 *speed, u16 *duplex)
-{
-       *speed = SPEED_1000;
-       *duplex = FULL_DUPLEX;
-
-       return 0;
-}
-
-/**
- *  e1000e_get_hw_semaphore - Acquire hardware semaphore
- *  @hw: pointer to the HW structure
- *
- *  Acquire the HW semaphore to access the PHY or NVM
- **/
-s32 e1000e_get_hw_semaphore(struct e1000_hw *hw)
-{
-       u32 swsm;
-       s32 timeout = hw->nvm.word_size + 1;
-       s32 i = 0;
-
-       /* Get the SW semaphore */
-       while (i < timeout) {
-               swsm = er32(SWSM);
-               if (!(swsm & E1000_SWSM_SMBI))
-                       break;
-
-               udelay(50);
-               i++;
-       }
-
-       if (i == timeout) {
-               e_dbg("Driver can't access device - SMBI bit is set.\n");
-               return -E1000_ERR_NVM;
-       }
-
-       /* Get the FW semaphore. */
-       for (i = 0; i < timeout; i++) {
-               swsm = er32(SWSM);
-               ew32(SWSM, swsm | E1000_SWSM_SWESMBI);
-
-               /* Semaphore acquired if bit latched */
-               if (er32(SWSM) & E1000_SWSM_SWESMBI)
-                       break;
-
-               udelay(50);
-       }
-
-       if (i == timeout) {
-               /* Release semaphores */
-               e1000e_put_hw_semaphore(hw);
-               e_dbg("Driver can't access the NVM\n");
-               return -E1000_ERR_NVM;
-       }
-
-       return 0;
-}
-
-/**
- *  e1000e_put_hw_semaphore - Release hardware semaphore
- *  @hw: pointer to the HW structure
- *
- *  Release hardware semaphore used to access the PHY or NVM
- **/
-void e1000e_put_hw_semaphore(struct e1000_hw *hw)
-{
-       u32 swsm;
-
-       swsm = er32(SWSM);
-       swsm &= ~(E1000_SWSM_SMBI | E1000_SWSM_SWESMBI);
-       ew32(SWSM, swsm);
-}
-
-/**
- *  e1000e_get_auto_rd_done - Check for auto read completion
- *  @hw: pointer to the HW structure
- *
- *  Check EEPROM for Auto Read done bit.
- **/
-s32 e1000e_get_auto_rd_done(struct e1000_hw *hw)
-{
-       s32 i = 0;
-
-       while (i < AUTO_READ_DONE_TIMEOUT) {
-               if (er32(EECD) & E1000_EECD_AUTO_RD)
-                       break;
-               usleep_range(1000, 2000);
-               i++;
-       }
-
-       if (i == AUTO_READ_DONE_TIMEOUT) {
-               e_dbg("Auto read by HW from NVM has not completed.\n");
-               return -E1000_ERR_RESET;
-       }
-
-       return 0;
-}
-
-/**
- *  e1000e_valid_led_default - Verify a valid default LED config
- *  @hw: pointer to the HW structure
- *  @data: pointer to the NVM (EEPROM)
- *
- *  Read the EEPROM for the current default LED configuration.  If the
- *  LED configuration is not valid, set to a valid LED configuration.
- **/
-s32 e1000e_valid_led_default(struct e1000_hw *hw, u16 *data)
-{
-       s32 ret_val;
-
-       ret_val = e1000_read_nvm(hw, NVM_ID_LED_SETTINGS, 1, data);
-       if (ret_val) {
-               e_dbg("NVM Read Error\n");
-               return ret_val;
-       }
-
-       if (*data == ID_LED_RESERVED_0000 || *data == ID_LED_RESERVED_FFFF)
-               *data = ID_LED_DEFAULT;
-
-       return 0;
-}
-
-/**
- *  e1000e_id_led_init -
- *  @hw: pointer to the HW structure
- *
- **/
-s32 e1000e_id_led_init(struct e1000_hw *hw)
-{
-       struct e1000_mac_info *mac = &hw->mac;
-       s32 ret_val;
-       const u32 ledctl_mask = 0x000000FF;
-       const u32 ledctl_on = E1000_LEDCTL_MODE_LED_ON;
-       const u32 ledctl_off = E1000_LEDCTL_MODE_LED_OFF;
-       u16 data, i, temp;
-       const u16 led_mask = 0x0F;
-
-       ret_val = hw->nvm.ops.valid_led_default(hw, &data);
-       if (ret_val)
-               return ret_val;
-
-       mac->ledctl_default = er32(LEDCTL);
-       mac->ledctl_mode1 = mac->ledctl_default;
-       mac->ledctl_mode2 = mac->ledctl_default;
-
-       for (i = 0; i < 4; i++) {
-               temp = (data >> (i << 2)) & led_mask;
-               switch (temp) {
-               case ID_LED_ON1_DEF2:
-               case ID_LED_ON1_ON2:
-               case ID_LED_ON1_OFF2:
-                       mac->ledctl_mode1 &= ~(ledctl_mask << (i << 3));
-                       mac->ledctl_mode1 |= ledctl_on << (i << 3);
-                       break;
-               case ID_LED_OFF1_DEF2:
-               case ID_LED_OFF1_ON2:
-               case ID_LED_OFF1_OFF2:
-                       mac->ledctl_mode1 &= ~(ledctl_mask << (i << 3));
-                       mac->ledctl_mode1 |= ledctl_off << (i << 3);
-                       break;
-               default:
-                       /* Do nothing */
-                       break;
-               }
-               switch (temp) {
-               case ID_LED_DEF1_ON2:
-               case ID_LED_ON1_ON2:
-               case ID_LED_OFF1_ON2:
-                       mac->ledctl_mode2 &= ~(ledctl_mask << (i << 3));
-                       mac->ledctl_mode2 |= ledctl_on << (i << 3);
-                       break;
-               case ID_LED_DEF1_OFF2:
-               case ID_LED_ON1_OFF2:
-               case ID_LED_OFF1_OFF2:
-                       mac->ledctl_mode2 &= ~(ledctl_mask << (i << 3));
-                       mac->ledctl_mode2 |= ledctl_off << (i << 3);
-                       break;
-               default:
-                       /* Do nothing */
-                       break;
-               }
-       }
-
-       return 0;
-}
-
-/**
- *  e1000e_setup_led_generic - Configures SW controllable LED
- *  @hw: pointer to the HW structure
- *
- *  This prepares the SW controllable LED for use and saves the current state
- *  of the LED so it can be later restored.
- **/
-s32 e1000e_setup_led_generic(struct e1000_hw *hw)
-{
-       u32 ledctl;
-
-       if (hw->mac.ops.setup_led != e1000e_setup_led_generic)
-               return -E1000_ERR_CONFIG;
-
-       if (hw->phy.media_type == e1000_media_type_fiber) {
-               ledctl = er32(LEDCTL);
-               hw->mac.ledctl_default = ledctl;
-               /* Turn off LED0 */
-               ledctl &= ~(E1000_LEDCTL_LED0_IVRT |
-                           E1000_LEDCTL_LED0_BLINK |
-                           E1000_LEDCTL_LED0_MODE_MASK);
-               ledctl |= (E1000_LEDCTL_MODE_LED_OFF <<
-                          E1000_LEDCTL_LED0_MODE_SHIFT);
-               ew32(LEDCTL, ledctl);
-       } else if (hw->phy.media_type == e1000_media_type_copper) {
-               ew32(LEDCTL, hw->mac.ledctl_mode1);
-       }
-
-       return 0;
-}
-
-/**
- *  e1000e_cleanup_led_generic - Set LED config to default operation
- *  @hw: pointer to the HW structure
- *
- *  Remove the current LED configuration and set the LED configuration
- *  to the default value, saved from the EEPROM.
- **/
-s32 e1000e_cleanup_led_generic(struct e1000_hw *hw)
-{
-       ew32(LEDCTL, hw->mac.ledctl_default);
-       return 0;
-}
-
-/**
- *  e1000e_blink_led_generic - Blink LED
- *  @hw: pointer to the HW structure
- *
- *  Blink the LEDs which are set to be on.
- **/
-s32 e1000e_blink_led_generic(struct e1000_hw *hw)
-{
-       u32 ledctl_blink = 0;
-       u32 i;
-
-       if (hw->phy.media_type == e1000_media_type_fiber) {
-               /* always blink LED0 for PCI-E fiber */
-               ledctl_blink = E1000_LEDCTL_LED0_BLINK |
-                    (E1000_LEDCTL_MODE_LED_ON << E1000_LEDCTL_LED0_MODE_SHIFT);
-       } else {
-               /*
-                * set the blink bit for each LED that's "on" (0x0E)
-                * in ledctl_mode2
-                */
-               ledctl_blink = hw->mac.ledctl_mode2;
-               for (i = 0; i < 4; i++)
-                       if (((hw->mac.ledctl_mode2 >> (i * 8)) & 0xFF) ==
-                           E1000_LEDCTL_MODE_LED_ON)
-                               ledctl_blink |= (E1000_LEDCTL_LED0_BLINK <<
-                                                (i * 8));
-       }
-
-       ew32(LEDCTL, ledctl_blink);
-
-       return 0;
-}
-
-/**
- *  e1000e_led_on_generic - Turn LED on
- *  @hw: pointer to the HW structure
- *
- *  Turn LED on.
- **/
-s32 e1000e_led_on_generic(struct e1000_hw *hw)
-{
-       u32 ctrl;
-
-       switch (hw->phy.media_type) {
-       case e1000_media_type_fiber:
-               ctrl = er32(CTRL);
-               ctrl &= ~E1000_CTRL_SWDPIN0;
-               ctrl |= E1000_CTRL_SWDPIO0;
-               ew32(CTRL, ctrl);
-               break;
-       case e1000_media_type_copper:
-               ew32(LEDCTL, hw->mac.ledctl_mode2);
-               break;
-       default:
-               break;
-       }
-
-       return 0;
-}
-
-/**
- *  e1000e_led_off_generic - Turn LED off
- *  @hw: pointer to the HW structure
- *
- *  Turn LED off.
- **/
-s32 e1000e_led_off_generic(struct e1000_hw *hw)
-{
-       u32 ctrl;
-
-       switch (hw->phy.media_type) {
-       case e1000_media_type_fiber:
-               ctrl = er32(CTRL);
-               ctrl |= E1000_CTRL_SWDPIN0;
-               ctrl |= E1000_CTRL_SWDPIO0;
-               ew32(CTRL, ctrl);
-               break;
-       case e1000_media_type_copper:
-               ew32(LEDCTL, hw->mac.ledctl_mode1);
-               break;
-       default:
-               break;
-       }
-
-       return 0;
-}
-
-/**
- *  e1000e_set_pcie_no_snoop - Set PCI-express capabilities
- *  @hw: pointer to the HW structure
- *  @no_snoop: bitmap of snoop events
- *
- *  Set the PCI-express register to snoop for events enabled in 'no_snoop'.
- **/
-void e1000e_set_pcie_no_snoop(struct e1000_hw *hw, u32 no_snoop)
-{
-       u32 gcr;
-
-       if (no_snoop) {
-               gcr = er32(GCR);
-               gcr &= ~(PCIE_NO_SNOOP_ALL);
-               gcr |= no_snoop;
-               ew32(GCR, gcr);
-       }
-}
-
-/**
- *  e1000e_disable_pcie_master - Disables PCI-express master access
- *  @hw: pointer to the HW structure
- *
- *  Returns 0 if successful, else returns -10
- *  (-E1000_ERR_MASTER_REQUESTS_PENDING) if master disable bit has not caused
- *  the master requests to be disabled.
- *
- *  Disables PCI-Express master access and verifies there are no pending
- *  requests.
- **/
-s32 e1000e_disable_pcie_master(struct e1000_hw *hw)
-{
-       u32 ctrl;
-       s32 timeout = MASTER_DISABLE_TIMEOUT;
-
-       ctrl = er32(CTRL);
-       ctrl |= E1000_CTRL_GIO_MASTER_DISABLE;
-       ew32(CTRL, ctrl);
-
-       while (timeout) {
-               if (!(er32(STATUS) &
-                     E1000_STATUS_GIO_MASTER_ENABLE))
-                       break;
-               udelay(100);
-               timeout--;
-       }
-
-       if (!timeout) {
-               e_dbg("Master requests are pending.\n");
-               return -E1000_ERR_MASTER_REQUESTS_PENDING;
-       }
-
-       return 0;
-}
-
-/**
- *  e1000e_reset_adaptive - Reset Adaptive Interframe Spacing
- *  @hw: pointer to the HW structure
- *
- *  Reset the Adaptive Interframe Spacing throttle to default values.
- **/
-void e1000e_reset_adaptive(struct e1000_hw *hw)
-{
-       struct e1000_mac_info *mac = &hw->mac;
-
-       if (!mac->adaptive_ifs) {
-               e_dbg("Not in Adaptive IFS mode!\n");
-               goto out;
-       }
-
-       mac->current_ifs_val = 0;
-       mac->ifs_min_val = IFS_MIN;
-       mac->ifs_max_val = IFS_MAX;
-       mac->ifs_step_size = IFS_STEP;
-       mac->ifs_ratio = IFS_RATIO;
-
-       mac->in_ifs_mode = false;
-       ew32(AIT, 0);
-out:
-       return;
-}
-
-/**
- *  e1000e_update_adaptive - Update Adaptive Interframe Spacing
- *  @hw: pointer to the HW structure
- *
- *  Update the Adaptive Interframe Spacing Throttle value based on the
- *  time between transmitted packets and time between collisions.
- **/
-void e1000e_update_adaptive(struct e1000_hw *hw)
-{
-       struct e1000_mac_info *mac = &hw->mac;
-
-       if (!mac->adaptive_ifs) {
-               e_dbg("Not in Adaptive IFS mode!\n");
-               goto out;
-       }
-
-       if ((mac->collision_delta * mac->ifs_ratio) > mac->tx_packet_delta) {
-               if (mac->tx_packet_delta > MIN_NUM_XMITS) {
-                       mac->in_ifs_mode = true;
-                       if (mac->current_ifs_val < mac->ifs_max_val) {
-                               if (!mac->current_ifs_val)
-                                       mac->current_ifs_val = mac->ifs_min_val;
-                               else
-                                       mac->current_ifs_val +=
-                                               mac->ifs_step_size;
-                               ew32(AIT, mac->current_ifs_val);
-                       }
-               }
-       } else {
-               if (mac->in_ifs_mode &&
-                   (mac->tx_packet_delta <= MIN_NUM_XMITS)) {
-                       mac->current_ifs_val = 0;
-                       mac->in_ifs_mode = false;
-                       ew32(AIT, 0);
-               }
-       }
-out:
-       return;
-}
-
-/**
- *  e1000_raise_eec_clk - Raise EEPROM clock
- *  @hw: pointer to the HW structure
- *  @eecd: pointer to the EEPROM
- *
- *  Enable/Raise the EEPROM clock bit.
- **/
-static void e1000_raise_eec_clk(struct e1000_hw *hw, u32 *eecd)
-{
-       *eecd = *eecd | E1000_EECD_SK;
-       ew32(EECD, *eecd);
-       e1e_flush();
-       udelay(hw->nvm.delay_usec);
-}
-
-/**
- *  e1000_lower_eec_clk - Lower EEPROM clock
- *  @hw: pointer to the HW structure
- *  @eecd: pointer to the EEPROM
- *
- *  Clear/Lower the EEPROM clock bit.
- **/
-static void e1000_lower_eec_clk(struct e1000_hw *hw, u32 *eecd)
-{
-       *eecd = *eecd & ~E1000_EECD_SK;
-       ew32(EECD, *eecd);
-       e1e_flush();
-       udelay(hw->nvm.delay_usec);
-}
-
-/**
- *  e1000_shift_out_eec_bits - Shift data bits our to the EEPROM
- *  @hw: pointer to the HW structure
- *  @data: data to send to the EEPROM
- *  @count: number of bits to shift out
- *
- *  We need to shift 'count' bits out to the EEPROM.  So, the value in the
- *  "data" parameter will be shifted out to the EEPROM one bit at a time.
- *  In order to do this, "data" must be broken down into bits.
- **/
-static void e1000_shift_out_eec_bits(struct e1000_hw *hw, u16 data, u16 count)
-{
-       struct e1000_nvm_info *nvm = &hw->nvm;
-       u32 eecd = er32(EECD);
-       u32 mask;
-
-       mask = 0x01 << (count - 1);
-       if (nvm->type == e1000_nvm_eeprom_spi)
-               eecd |= E1000_EECD_DO;
-
-       do {
-               eecd &= ~E1000_EECD_DI;
-
-               if (data & mask)
-                       eecd |= E1000_EECD_DI;
-
-               ew32(EECD, eecd);
-               e1e_flush();
-
-               udelay(nvm->delay_usec);
-
-               e1000_raise_eec_clk(hw, &eecd);
-               e1000_lower_eec_clk(hw, &eecd);
-
-               mask >>= 1;
-       } while (mask);
-
-       eecd &= ~E1000_EECD_DI;
-       ew32(EECD, eecd);
-}
-
-/**
- *  e1000_shift_in_eec_bits - Shift data bits in from the EEPROM
- *  @hw: pointer to the HW structure
- *  @count: number of bits to shift in
- *
- *  In order to read a register from the EEPROM, we need to shift 'count' bits
- *  in from the EEPROM.  Bits are "shifted in" by raising the clock input to
- *  the EEPROM (setting the SK bit), and then reading the value of the data out
- *  "DO" bit.  During this "shifting in" process the data in "DI" bit should
- *  always be clear.
- **/
-static u16 e1000_shift_in_eec_bits(struct e1000_hw *hw, u16 count)
-{
-       u32 eecd;
-       u32 i;
-       u16 data;
-
-       eecd = er32(EECD);
-
-       eecd &= ~(E1000_EECD_DO | E1000_EECD_DI);
-       data = 0;
-
-       for (i = 0; i < count; i++) {
-               data <<= 1;
-               e1000_raise_eec_clk(hw, &eecd);
-
-               eecd = er32(EECD);
-
-               eecd &= ~E1000_EECD_DI;
-               if (eecd & E1000_EECD_DO)
-                       data |= 1;
-
-               e1000_lower_eec_clk(hw, &eecd);
-       }
-
-       return data;
-}
-
-/**
- *  e1000e_poll_eerd_eewr_done - Poll for EEPROM read/write completion
- *  @hw: pointer to the HW structure
- *  @ee_reg: EEPROM flag for polling
- *
- *  Polls the EEPROM status bit for either read or write completion based
- *  upon the value of 'ee_reg'.
- **/
-s32 e1000e_poll_eerd_eewr_done(struct e1000_hw *hw, int ee_reg)
-{
-       u32 attempts = 100000;
-       u32 i, reg = 0;
-
-       for (i = 0; i < attempts; i++) {
-               if (ee_reg == E1000_NVM_POLL_READ)
-                       reg = er32(EERD);
-               else
-                       reg = er32(EEWR);
-
-               if (reg & E1000_NVM_RW_REG_DONE)
-                       return 0;
-
-               udelay(5);
-       }
-
-       return -E1000_ERR_NVM;
-}
-
-/**
- *  e1000e_acquire_nvm - Generic request for access to EEPROM
- *  @hw: pointer to the HW structure
- *
- *  Set the EEPROM access request bit and wait for EEPROM access grant bit.
- *  Return successful if access grant bit set, else clear the request for
- *  EEPROM access and return -E1000_ERR_NVM (-1).
- **/
-s32 e1000e_acquire_nvm(struct e1000_hw *hw)
-{
-       u32 eecd = er32(EECD);
-       s32 timeout = E1000_NVM_GRANT_ATTEMPTS;
-
-       ew32(EECD, eecd | E1000_EECD_REQ);
-       eecd = er32(EECD);
-
-       while (timeout) {
-               if (eecd & E1000_EECD_GNT)
-                       break;
-               udelay(5);
-               eecd = er32(EECD);
-               timeout--;
-       }
-
-       if (!timeout) {
-               eecd &= ~E1000_EECD_REQ;
-               ew32(EECD, eecd);
-               e_dbg("Could not acquire NVM grant\n");
-               return -E1000_ERR_NVM;
-       }
-
-       return 0;
-}
-
-/**
- *  e1000_standby_nvm - Return EEPROM to standby state
- *  @hw: pointer to the HW structure
- *
- *  Return the EEPROM to a standby state.
- **/
-static void e1000_standby_nvm(struct e1000_hw *hw)
-{
-       struct e1000_nvm_info *nvm = &hw->nvm;
-       u32 eecd = er32(EECD);
-
-       if (nvm->type == e1000_nvm_eeprom_spi) {
-               /* Toggle CS to flush commands */
-               eecd |= E1000_EECD_CS;
-               ew32(EECD, eecd);
-               e1e_flush();
-               udelay(nvm->delay_usec);
-               eecd &= ~E1000_EECD_CS;
-               ew32(EECD, eecd);
-               e1e_flush();
-               udelay(nvm->delay_usec);
-       }
-}
-
-/**
- *  e1000_stop_nvm - Terminate EEPROM command
- *  @hw: pointer to the HW structure
- *
- *  Terminates the current command by inverting the EEPROM's chip select pin.
- **/
-static void e1000_stop_nvm(struct e1000_hw *hw)
-{
-       u32 eecd;
-
-       eecd = er32(EECD);
-       if (hw->nvm.type == e1000_nvm_eeprom_spi) {
-               /* Pull CS high */
-               eecd |= E1000_EECD_CS;
-               e1000_lower_eec_clk(hw, &eecd);
-       }
-}
-
-/**
- *  e1000e_release_nvm - Release exclusive access to EEPROM
- *  @hw: pointer to the HW structure
- *
- *  Stop any current commands to the EEPROM and clear the EEPROM request bit.
- **/
-void e1000e_release_nvm(struct e1000_hw *hw)
-{
-       u32 eecd;
-
-       e1000_stop_nvm(hw);
-
-       eecd = er32(EECD);
-       eecd &= ~E1000_EECD_REQ;
-       ew32(EECD, eecd);
-}
-
-/**
- *  e1000_ready_nvm_eeprom - Prepares EEPROM for read/write
- *  @hw: pointer to the HW structure
- *
- *  Setups the EEPROM for reading and writing.
- **/
-static s32 e1000_ready_nvm_eeprom(struct e1000_hw *hw)
-{
-       struct e1000_nvm_info *nvm = &hw->nvm;
-       u32 eecd = er32(EECD);
-       u8 spi_stat_reg;
-
-       if (nvm->type == e1000_nvm_eeprom_spi) {
-               u16 timeout = NVM_MAX_RETRY_SPI;
-
-               /* Clear SK and CS */
-               eecd &= ~(E1000_EECD_CS | E1000_EECD_SK);
-               ew32(EECD, eecd);
-               e1e_flush();
-               udelay(1);
-
-               /*
-                * Read "Status Register" repeatedly until the LSB is cleared.
-                * The EEPROM will signal that the command has been completed
-                * by clearing bit 0 of the internal status register.  If it's
-                * not cleared within 'timeout', then error out.
-                */
-               while (timeout) {
-                       e1000_shift_out_eec_bits(hw, NVM_RDSR_OPCODE_SPI,
-                                                hw->nvm.opcode_bits);
-                       spi_stat_reg = (u8)e1000_shift_in_eec_bits(hw, 8);
-                       if (!(spi_stat_reg & NVM_STATUS_RDY_SPI))
-                               break;
-
-                       udelay(5);
-                       e1000_standby_nvm(hw);
-                       timeout--;
-               }
-
-               if (!timeout) {
-                       e_dbg("SPI NVM Status error\n");
-                       return -E1000_ERR_NVM;
-               }
-       }
-
-       return 0;
-}
-
-/**
- *  e1000e_read_nvm_eerd - Reads EEPROM using EERD register
- *  @hw: pointer to the HW structure
- *  @offset: offset of word in the EEPROM to read
- *  @words: number of words to read
- *  @data: word read from the EEPROM
- *
- *  Reads a 16 bit word from the EEPROM using the EERD register.
- **/
-s32 e1000e_read_nvm_eerd(struct e1000_hw *hw, u16 offset, u16 words, u16 *data)
-{
-       struct e1000_nvm_info *nvm = &hw->nvm;
-       u32 i, eerd = 0;
-       s32 ret_val = 0;
-
-       /*
-        * A check for invalid values:  offset too large, too many words,
-        * too many words for the offset, and not enough words.
-        */
-       if ((offset >= nvm->word_size) || (words > (nvm->word_size - offset)) ||
-           (words == 0)) {
-               e_dbg("nvm parameter(s) out of bounds\n");
-               return -E1000_ERR_NVM;
-       }
-
-       for (i = 0; i < words; i++) {
-               eerd = ((offset+i) << E1000_NVM_RW_ADDR_SHIFT) +
-                      E1000_NVM_RW_REG_START;
-
-               ew32(EERD, eerd);
-               ret_val = e1000e_poll_eerd_eewr_done(hw, E1000_NVM_POLL_READ);
-               if (ret_val)
-                       break;
-
-               data[i] = (er32(EERD) >> E1000_NVM_RW_REG_DATA);
-       }
-
-       return ret_val;
-}
-
-/**
- *  e1000e_write_nvm_spi - Write to EEPROM using SPI
- *  @hw: pointer to the HW structure
- *  @offset: offset within the EEPROM to be written to
- *  @words: number of words to write
- *  @data: 16 bit word(s) to be written to the EEPROM
- *
- *  Writes data to EEPROM at offset using SPI interface.
- *
- *  If e1000e_update_nvm_checksum is not called after this function , the
- *  EEPROM will most likely contain an invalid checksum.
- **/
-s32 e1000e_write_nvm_spi(struct e1000_hw *hw, u16 offset, u16 words, u16 *data)
-{
-       struct e1000_nvm_info *nvm = &hw->nvm;
-       s32 ret_val;
-       u16 widx = 0;
-
-       /*
-        * A check for invalid values:  offset too large, too many words,
-        * and not enough words.
-        */
-       if ((offset >= nvm->word_size) || (words > (nvm->word_size - offset)) ||
-           (words == 0)) {
-               e_dbg("nvm parameter(s) out of bounds\n");
-               return -E1000_ERR_NVM;
-       }
-
-       ret_val = nvm->ops.acquire(hw);
-       if (ret_val)
-               return ret_val;
-
-       while (widx < words) {
-               u8 write_opcode = NVM_WRITE_OPCODE_SPI;
-
-               ret_val = e1000_ready_nvm_eeprom(hw);
-               if (ret_val) {
-                       nvm->ops.release(hw);
-                       return ret_val;
-               }
-
-               e1000_standby_nvm(hw);
-
-               /* Send the WRITE ENABLE command (8 bit opcode) */
-               e1000_shift_out_eec_bits(hw, NVM_WREN_OPCODE_SPI,
-                                        nvm->opcode_bits);
-
-               e1000_standby_nvm(hw);
-
-               /*
-                * Some SPI eeproms use the 8th address bit embedded in the
-                * opcode
-                */
-               if ((nvm->address_bits == 8) && (offset >= 128))
-                       write_opcode |= NVM_A8_OPCODE_SPI;
-
-               /* Send the Write command (8-bit opcode + addr) */
-               e1000_shift_out_eec_bits(hw, write_opcode, nvm->opcode_bits);
-               e1000_shift_out_eec_bits(hw, (u16)((offset + widx) * 2),
-                                        nvm->address_bits);
-
-               /* Loop to allow for up to whole page write of eeprom */
-               while (widx < words) {
-                       u16 word_out = data[widx];
-                       word_out = (word_out >> 8) | (word_out << 8);
-                       e1000_shift_out_eec_bits(hw, word_out, 16);
-                       widx++;
-
-                       if ((((offset + widx) * 2) % nvm->page_size) == 0) {
-                               e1000_standby_nvm(hw);
-                               break;
-                       }
-               }
-       }
-
-       usleep_range(10000, 20000);
-       nvm->ops.release(hw);
-       return 0;
-}
-
-/**
- *  e1000_read_pba_string_generic - Read device part number
- *  @hw: pointer to the HW structure
- *  @pba_num: pointer to device part number
- *  @pba_num_size: size of part number buffer
- *
- *  Reads the product board assembly (PBA) number from the EEPROM and stores
- *  the value in pba_num.
- **/
-s32 e1000_read_pba_string_generic(struct e1000_hw *hw, u8 *pba_num,
-                                 u32 pba_num_size)
-{
-       s32 ret_val;
-       u16 nvm_data;
-       u16 pba_ptr;
-       u16 offset;
-       u16 length;
-
-       if (pba_num == NULL) {
-               e_dbg("PBA string buffer was null\n");
-               ret_val = E1000_ERR_INVALID_ARGUMENT;
-               goto out;
-       }
-
-       ret_val = e1000_read_nvm(hw, NVM_PBA_OFFSET_0, 1, &nvm_data);
-       if (ret_val) {
-               e_dbg("NVM Read Error\n");
-               goto out;
-       }
-
-       ret_val = e1000_read_nvm(hw, NVM_PBA_OFFSET_1, 1, &pba_ptr);
-       if (ret_val) {
-               e_dbg("NVM Read Error\n");
-               goto out;
-       }
-
-       /*
-        * if nvm_data is not ptr guard the PBA must be in legacy format which
-        * means pba_ptr is actually our second data word for the PBA number
-        * and we can decode it into an ascii string
-        */
-       if (nvm_data != NVM_PBA_PTR_GUARD) {
-               e_dbg("NVM PBA number is not stored as string\n");
-
-               /* we will need 11 characters to store the PBA */
-               if (pba_num_size < 11) {
-                       e_dbg("PBA string buffer too small\n");
-                       return E1000_ERR_NO_SPACE;
-               }
-
-               /* extract hex string from data and pba_ptr */
-               pba_num[0] = (nvm_data >> 12) & 0xF;
-               pba_num[1] = (nvm_data >> 8) & 0xF;
-               pba_num[2] = (nvm_data >> 4) & 0xF;
-               pba_num[3] = nvm_data & 0xF;
-               pba_num[4] = (pba_ptr >> 12) & 0xF;
-               pba_num[5] = (pba_ptr >> 8) & 0xF;
-               pba_num[6] = '-';
-               pba_num[7] = 0;
-               pba_num[8] = (pba_ptr >> 4) & 0xF;
-               pba_num[9] = pba_ptr & 0xF;
-
-               /* put a null character on the end of our string */
-               pba_num[10] = '\0';
-
-               /* switch all the data but the '-' to hex char */
-               for (offset = 0; offset < 10; offset++) {
-                       if (pba_num[offset] < 0xA)
-                               pba_num[offset] += '0';
-                       else if (pba_num[offset] < 0x10)
-                               pba_num[offset] += 'A' - 0xA;
-               }
-
-               goto out;
-       }
-
-       ret_val = e1000_read_nvm(hw, pba_ptr, 1, &length);
-       if (ret_val) {
-               e_dbg("NVM Read Error\n");
-               goto out;
-       }
-
-       if (length == 0xFFFF || length == 0) {
-               e_dbg("NVM PBA number section invalid length\n");
-               ret_val = E1000_ERR_NVM_PBA_SECTION;
-               goto out;
-       }
-       /* check if pba_num buffer is big enough */
-       if (pba_num_size < (((u32)length * 2) - 1)) {
-               e_dbg("PBA string buffer too small\n");
-               ret_val = E1000_ERR_NO_SPACE;
-               goto out;
-       }
-
-       /* trim pba length from start of string */
-       pba_ptr++;
-       length--;
-
-       for (offset = 0; offset < length; offset++) {
-               ret_val = e1000_read_nvm(hw, pba_ptr + offset, 1, &nvm_data);
-               if (ret_val) {
-                       e_dbg("NVM Read Error\n");
-                       goto out;
-               }
-               pba_num[offset * 2] = (u8)(nvm_data >> 8);
-               pba_num[(offset * 2) + 1] = (u8)(nvm_data & 0xFF);
-       }
-       pba_num[offset * 2] = '\0';
-
-out:
-       return ret_val;
-}
-
-/**
- *  e1000_read_mac_addr_generic - Read device MAC address
- *  @hw: pointer to the HW structure
- *
- *  Reads the device MAC address from the EEPROM and stores the value.
- *  Since devices with two ports use the same EEPROM, we increment the
- *  last bit in the MAC address for the second port.
- **/
-s32 e1000_read_mac_addr_generic(struct e1000_hw *hw)
-{
-       u32 rar_high;
-       u32 rar_low;
-       u16 i;
-
-       rar_high = er32(RAH(0));
-       rar_low = er32(RAL(0));
-
-       for (i = 0; i < E1000_RAL_MAC_ADDR_LEN; i++)
-               hw->mac.perm_addr[i] = (u8)(rar_low >> (i*8));
-
-       for (i = 0; i < E1000_RAH_MAC_ADDR_LEN; i++)
-               hw->mac.perm_addr[i+4] = (u8)(rar_high >> (i*8));
-
-       for (i = 0; i < ETH_ALEN; i++)
-               hw->mac.addr[i] = hw->mac.perm_addr[i];
-
-       return 0;
-}
-
-/**
- *  e1000e_validate_nvm_checksum_generic - Validate EEPROM checksum
- *  @hw: pointer to the HW structure
- *
- *  Calculates the EEPROM checksum by reading/adding each word of the EEPROM
- *  and then verifies that the sum of the EEPROM is equal to 0xBABA.
- **/
-s32 e1000e_validate_nvm_checksum_generic(struct e1000_hw *hw)
-{
-       s32 ret_val;
-       u16 checksum = 0;
-       u16 i, nvm_data;
-
-       for (i = 0; i < (NVM_CHECKSUM_REG + 1); i++) {
-               ret_val = e1000_read_nvm(hw, i, 1, &nvm_data);
-               if (ret_val) {
-                       e_dbg("NVM Read Error\n");
-                       return ret_val;
-               }
-               checksum += nvm_data;
-       }
-
-       if (checksum != (u16) NVM_SUM) {
-               e_dbg("NVM Checksum Invalid\n");
-               return -E1000_ERR_NVM;
-       }
-
-       return 0;
-}
-
-/**
- *  e1000e_update_nvm_checksum_generic - Update EEPROM checksum
- *  @hw: pointer to the HW structure
- *
- *  Updates the EEPROM checksum by reading/adding each word of the EEPROM
- *  up to the checksum.  Then calculates the EEPROM checksum and writes the
- *  value to the EEPROM.
- **/
-s32 e1000e_update_nvm_checksum_generic(struct e1000_hw *hw)
-{
-       s32 ret_val;
-       u16 checksum = 0;
-       u16 i, nvm_data;
-
-       for (i = 0; i < NVM_CHECKSUM_REG; i++) {
-               ret_val = e1000_read_nvm(hw, i, 1, &nvm_data);
-               if (ret_val) {
-                       e_dbg("NVM Read Error while updating checksum.\n");
-                       return ret_val;
-               }
-               checksum += nvm_data;
-       }
-       checksum = (u16) NVM_SUM - checksum;
-       ret_val = e1000_write_nvm(hw, NVM_CHECKSUM_REG, 1, &checksum);
-       if (ret_val)
-               e_dbg("NVM Write Error while updating checksum.\n");
-
-       return ret_val;
-}
-
-/**
- *  e1000e_reload_nvm - Reloads EEPROM
- *  @hw: pointer to the HW structure
- *
- *  Reloads the EEPROM by setting the "Reinitialize from EEPROM" bit in the
- *  extended control register.
- **/
-void e1000e_reload_nvm(struct e1000_hw *hw)
-{
-       u32 ctrl_ext;
-
-       udelay(10);
-       ctrl_ext = er32(CTRL_EXT);
-       ctrl_ext |= E1000_CTRL_EXT_EE_RST;
-       ew32(CTRL_EXT, ctrl_ext);
-       e1e_flush();
-}
-
-/**
- *  e1000_calculate_checksum - Calculate checksum for buffer
- *  @buffer: pointer to EEPROM
- *  @length: size of EEPROM to calculate a checksum for
- *
- *  Calculates the checksum for some buffer on a specified length.  The
- *  checksum calculated is returned.
- **/
-static u8 e1000_calculate_checksum(u8 *buffer, u32 length)
-{
-       u32 i;
-       u8  sum = 0;
-
-       if (!buffer)
-               return 0;
-
-       for (i = 0; i < length; i++)
-               sum += buffer[i];
-
-       return (u8) (0 - sum);
-}
-
-/**
- *  e1000_mng_enable_host_if - Checks host interface is enabled
- *  @hw: pointer to the HW structure
- *
- *  Returns E1000_success upon success, else E1000_ERR_HOST_INTERFACE_COMMAND
- *
- *  This function checks whether the HOST IF is enabled for command operation
- *  and also checks whether the previous command is completed.  It busy waits
- *  in case of previous command is not completed.
- **/
-static s32 e1000_mng_enable_host_if(struct e1000_hw *hw)
-{
-       u32 hicr;
-       u8 i;
-
-       if (!(hw->mac.arc_subsystem_valid)) {
-               e_dbg("ARC subsystem not valid.\n");
-               return -E1000_ERR_HOST_INTERFACE_COMMAND;
-       }
-
-       /* Check that the host interface is enabled. */
-       hicr = er32(HICR);
-       if ((hicr & E1000_HICR_EN) == 0) {
-               e_dbg("E1000_HOST_EN bit disabled.\n");
-               return -E1000_ERR_HOST_INTERFACE_COMMAND;
-       }
-       /* check the previous command is completed */
-       for (i = 0; i < E1000_MNG_DHCP_COMMAND_TIMEOUT; i++) {
-               hicr = er32(HICR);
-               if (!(hicr & E1000_HICR_C))
-                       break;
-               mdelay(1);
-       }
-
-       if (i == E1000_MNG_DHCP_COMMAND_TIMEOUT) {
-               e_dbg("Previous command timeout failed .\n");
-               return -E1000_ERR_HOST_INTERFACE_COMMAND;
-       }
-
-       return 0;
-}
-
-/**
- *  e1000e_check_mng_mode_generic - check management mode
- *  @hw: pointer to the HW structure
- *
- *  Reads the firmware semaphore register and returns true (>0) if
- *  manageability is enabled, else false (0).
- **/
-bool e1000e_check_mng_mode_generic(struct e1000_hw *hw)
-{
-       u32 fwsm = er32(FWSM);
-
-       return (fwsm & E1000_FWSM_MODE_MASK) ==
-               (E1000_MNG_IAMT_MODE << E1000_FWSM_MODE_SHIFT);
-}
-
-/**
- *  e1000e_enable_tx_pkt_filtering - Enable packet filtering on Tx
- *  @hw: pointer to the HW structure
- *
- *  Enables packet filtering on transmit packets if manageability is enabled
- *  and host interface is enabled.
- **/
-bool e1000e_enable_tx_pkt_filtering(struct e1000_hw *hw)
-{
-       struct e1000_host_mng_dhcp_cookie *hdr = &hw->mng_cookie;
-       u32 *buffer = (u32 *)&hw->mng_cookie;
-       u32 offset;
-       s32 ret_val, hdr_csum, csum;
-       u8 i, len;
-
-       hw->mac.tx_pkt_filtering = true;
-
-       /* No manageability, no filtering */
-       if (!e1000e_check_mng_mode(hw)) {
-               hw->mac.tx_pkt_filtering = false;
-               goto out;
-       }
-
-       /*
-        * If we can't read from the host interface for whatever
-        * reason, disable filtering.
-        */
-       ret_val = e1000_mng_enable_host_if(hw);
-       if (ret_val) {
-               hw->mac.tx_pkt_filtering = false;
-               goto out;
-       }
-
-       /* Read in the header.  Length and offset are in dwords. */
-       len    = E1000_MNG_DHCP_COOKIE_LENGTH >> 2;
-       offset = E1000_MNG_DHCP_COOKIE_OFFSET >> 2;
-       for (i = 0; i < len; i++)
-               *(buffer + i) = E1000_READ_REG_ARRAY(hw, E1000_HOST_IF, offset + i);
-       hdr_csum = hdr->checksum;
-       hdr->checksum = 0;
-       csum = e1000_calculate_checksum((u8 *)hdr,
-                                       E1000_MNG_DHCP_COOKIE_LENGTH);
-       /*
-        * If either the checksums or signature don't match, then
-        * the cookie area isn't considered valid, in which case we
-        * take the safe route of assuming Tx filtering is enabled.
-        */
-       if ((hdr_csum != csum) || (hdr->signature != E1000_IAMT_SIGNATURE)) {
-               hw->mac.tx_pkt_filtering = true;
-               goto out;
-       }
-
-       /* Cookie area is valid, make the final check for filtering. */
-       if (!(hdr->status & E1000_MNG_DHCP_COOKIE_STATUS_PARSING)) {
-               hw->mac.tx_pkt_filtering = false;
-               goto out;
-       }
-
-out:
-       return hw->mac.tx_pkt_filtering;
-}
-
-/**
- *  e1000_mng_write_cmd_header - Writes manageability command header
- *  @hw: pointer to the HW structure
- *  @hdr: pointer to the host interface command header
- *
- *  Writes the command header after does the checksum calculation.
- **/
-static s32 e1000_mng_write_cmd_header(struct e1000_hw *hw,
-                                 struct e1000_host_mng_command_header *hdr)
-{
-       u16 i, length = sizeof(struct e1000_host_mng_command_header);
-
-       /* Write the whole command header structure with new checksum. */
-
-       hdr->checksum = e1000_calculate_checksum((u8 *)hdr, length);
-
-       length >>= 2;
-       /* Write the relevant command block into the ram area. */
-       for (i = 0; i < length; i++) {
-               E1000_WRITE_REG_ARRAY(hw, E1000_HOST_IF, i,
-                                           *((u32 *) hdr + i));
-               e1e_flush();
-       }
-
-       return 0;
-}
-
-/**
- *  e1000_mng_host_if_write - Write to the manageability host interface
- *  @hw: pointer to the HW structure
- *  @buffer: pointer to the host interface buffer
- *  @length: size of the buffer
- *  @offset: location in the buffer to write to
- *  @sum: sum of the data (not checksum)
- *
- *  This function writes the buffer content at the offset given on the host if.
- *  It also does alignment considerations to do the writes in most efficient
- *  way.  Also fills up the sum of the buffer in *buffer parameter.
- **/
-static s32 e1000_mng_host_if_write(struct e1000_hw *hw, u8 *buffer,
-                                  u16 length, u16 offset, u8 *sum)
-{
-       u8 *tmp;
-       u8 *bufptr = buffer;
-       u32 data = 0;
-       u16 remaining, i, j, prev_bytes;
-
-       /* sum = only sum of the data and it is not checksum */
-
-       if (length == 0 || offset + length > E1000_HI_MAX_MNG_DATA_LENGTH)
-               return -E1000_ERR_PARAM;
-
-       tmp = (u8 *)&data;
-       prev_bytes = offset & 0x3;
-       offset >>= 2;
-
-       if (prev_bytes) {
-               data = E1000_READ_REG_ARRAY(hw, E1000_HOST_IF, offset);
-               for (j = prev_bytes; j < sizeof(u32); j++) {
-                       *(tmp + j) = *bufptr++;
-                       *sum += *(tmp + j);
-               }
-               E1000_WRITE_REG_ARRAY(hw, E1000_HOST_IF, offset, data);
-               length -= j - prev_bytes;
-               offset++;
-       }
-
-       remaining = length & 0x3;
-       length -= remaining;
-
-       /* Calculate length in DWORDs */
-       length >>= 2;
-
-       /*
-        * The device driver writes the relevant command block into the
-        * ram area.
-        */
-       for (i = 0; i < length; i++) {
-               for (j = 0; j < sizeof(u32); j++) {
-                       *(tmp + j) = *bufptr++;
-                       *sum += *(tmp + j);
-               }
-
-               E1000_WRITE_REG_ARRAY(hw, E1000_HOST_IF, offset + i, data);
-       }
-       if (remaining) {
-               for (j = 0; j < sizeof(u32); j++) {
-                       if (j < remaining)
-                               *(tmp + j) = *bufptr++;
-                       else
-                               *(tmp + j) = 0;
-
-                       *sum += *(tmp + j);
-               }
-               E1000_WRITE_REG_ARRAY(hw, E1000_HOST_IF, offset + i, data);
-       }
-
-       return 0;
-}
-
-/**
- *  e1000e_mng_write_dhcp_info - Writes DHCP info to host interface
- *  @hw: pointer to the HW structure
- *  @buffer: pointer to the host interface
- *  @length: size of the buffer
- *
- *  Writes the DHCP information to the host interface.
- **/
-s32 e1000e_mng_write_dhcp_info(struct e1000_hw *hw, u8 *buffer, u16 length)
-{
-       struct e1000_host_mng_command_header hdr;
-       s32 ret_val;
-       u32 hicr;
-
-       hdr.command_id = E1000_MNG_DHCP_TX_PAYLOAD_CMD;
-       hdr.command_length = length;
-       hdr.reserved1 = 0;
-       hdr.reserved2 = 0;
-       hdr.checksum = 0;
-
-       /* Enable the host interface */
-       ret_val = e1000_mng_enable_host_if(hw);
-       if (ret_val)
-               return ret_val;
-
-       /* Populate the host interface with the contents of "buffer". */
-       ret_val = e1000_mng_host_if_write(hw, buffer, length,
-                                         sizeof(hdr), &(hdr.checksum));
-       if (ret_val)
-               return ret_val;
-
-       /* Write the manageability command header */
-       ret_val = e1000_mng_write_cmd_header(hw, &hdr);
-       if (ret_val)
-               return ret_val;
-
-       /* Tell the ARC a new command is pending. */
-       hicr = er32(HICR);
-       ew32(HICR, hicr | E1000_HICR_C);
-
-       return 0;
-}
-
-/**
- *  e1000e_enable_mng_pass_thru - Check if management passthrough is needed
- *  @hw: pointer to the HW structure
- *
- *  Verifies the hardware needs to leave interface enabled so that frames can
- *  be directed to and from the management interface.
- **/
-bool e1000e_enable_mng_pass_thru(struct e1000_hw *hw)
-{
-       u32 manc;
-       u32 fwsm, factps;
-       bool ret_val = false;
-
-       manc = er32(MANC);
-
-       if (!(manc & E1000_MANC_RCV_TCO_EN))
-               goto out;
-
-       if (hw->mac.has_fwsm) {
-               fwsm = er32(FWSM);
-               factps = er32(FACTPS);
-
-               if (!(factps & E1000_FACTPS_MNGCG) &&
-                   ((fwsm & E1000_FWSM_MODE_MASK) ==
-                    (e1000_mng_mode_pt << E1000_FWSM_MODE_SHIFT))) {
-                       ret_val = true;
-                       goto out;
-               }
-       } else if ((hw->mac.type == e1000_82574) ||
-                  (hw->mac.type == e1000_82583)) {
-               u16 data;
-
-               factps = er32(FACTPS);
-               e1000_read_nvm(hw, NVM_INIT_CONTROL2_REG, 1, &data);
-
-               if (!(factps & E1000_FACTPS_MNGCG) &&
-                   ((data & E1000_NVM_INIT_CTRL2_MNGM) ==
-                    (e1000_mng_mode_pt << 13))) {
-                       ret_val = true;
-                       goto out;
-               }
-       } else if ((manc & E1000_MANC_SMBUS_EN) &&
-                   !(manc & E1000_MANC_ASF_EN)) {
-                       ret_val = true;
-                       goto out;
-       }
-
-out:
-       return ret_val;
-}
diff --git a/drivers/net/ethernet/intel/e1000e/mac.c b/drivers/net/ethernet/intel/e1000e/mac.c
new file mode 100644 (file)
index 0000000..decad98
--- /dev/null
@@ -0,0 +1,1709 @@
+/*******************************************************************************
+
+  Intel PRO/1000 Linux driver
+  Copyright(c) 1999 - 2012 Intel Corporation.
+
+  This program is free software; you can redistribute it and/or modify it
+  under the terms and conditions of the GNU General Public License,
+  version 2, as published by the Free Software Foundation.
+
+  This program is distributed in the hope it will be useful, but WITHOUT
+  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+  more details.
+
+  You should have received a copy of the GNU General Public License along with
+  this program; if not, write to the Free Software Foundation, Inc.,
+  51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
+
+  The full GNU General Public License is included in this distribution in
+  the file called "COPYING".
+
+  Contact Information:
+  Linux NICS <linux.nics@intel.com>
+  e1000-devel Mailing List <e1000-devel@lists.sourceforge.net>
+  Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
+
+*******************************************************************************/
+
+#include "e1000.h"
+
+/**
+ *  e1000e_get_bus_info_pcie - Get PCIe bus information
+ *  @hw: pointer to the HW structure
+ *
+ *  Determines and stores the system bus information for a particular
+ *  network interface.  The following bus information is determined and stored:
+ *  bus speed, bus width, type (PCIe), and PCIe function.
+ **/
+s32 e1000e_get_bus_info_pcie(struct e1000_hw *hw)
+{
+       struct e1000_mac_info *mac = &hw->mac;
+       struct e1000_bus_info *bus = &hw->bus;
+       struct e1000_adapter *adapter = hw->adapter;
+       u16 pcie_link_status, cap_offset;
+
+       cap_offset = adapter->pdev->pcie_cap;
+       if (!cap_offset) {
+               bus->width = e1000_bus_width_unknown;
+       } else {
+               pci_read_config_word(adapter->pdev,
+                                    cap_offset + PCIE_LINK_STATUS,
+                                    &pcie_link_status);
+               bus->width = (enum e1000_bus_width)((pcie_link_status &
+                                                    PCIE_LINK_WIDTH_MASK) >>
+                                                   PCIE_LINK_WIDTH_SHIFT);
+       }
+
+       mac->ops.set_lan_id(hw);
+
+       return 0;
+}
+
+/**
+ *  e1000_set_lan_id_multi_port_pcie - Set LAN id for PCIe multiple port devices
+ *
+ *  @hw: pointer to the HW structure
+ *
+ *  Determines the LAN function id by reading memory-mapped registers
+ *  and swaps the port value if requested.
+ **/
+void e1000_set_lan_id_multi_port_pcie(struct e1000_hw *hw)
+{
+       struct e1000_bus_info *bus = &hw->bus;
+       u32 reg;
+
+       /*
+        * The status register reports the correct function number
+        * for the device regardless of function swap state.
+        */
+       reg = er32(STATUS);
+       bus->func = (reg & E1000_STATUS_FUNC_MASK) >> E1000_STATUS_FUNC_SHIFT;
+}
+
+/**
+ *  e1000_set_lan_id_single_port - Set LAN id for a single port device
+ *  @hw: pointer to the HW structure
+ *
+ *  Sets the LAN function id to zero for a single port device.
+ **/
+void e1000_set_lan_id_single_port(struct e1000_hw *hw)
+{
+       struct e1000_bus_info *bus = &hw->bus;
+
+       bus->func = 0;
+}
+
+/**
+ *  e1000_clear_vfta_generic - Clear VLAN filter table
+ *  @hw: pointer to the HW structure
+ *
+ *  Clears the register array which contains the VLAN filter table by
+ *  setting all the values to 0.
+ **/
+void e1000_clear_vfta_generic(struct e1000_hw *hw)
+{
+       u32 offset;
+
+       for (offset = 0; offset < E1000_VLAN_FILTER_TBL_SIZE; offset++) {
+               E1000_WRITE_REG_ARRAY(hw, E1000_VFTA, offset, 0);
+               e1e_flush();
+       }
+}
+
+/**
+ *  e1000_write_vfta_generic - Write value to VLAN filter table
+ *  @hw: pointer to the HW structure
+ *  @offset: register offset in VLAN filter table
+ *  @value: register value written to VLAN filter table
+ *
+ *  Writes value at the given offset in the register array which stores
+ *  the VLAN filter table.
+ **/
+void e1000_write_vfta_generic(struct e1000_hw *hw, u32 offset, u32 value)
+{
+       E1000_WRITE_REG_ARRAY(hw, E1000_VFTA, offset, value);
+       e1e_flush();
+}
+
+/**
+ *  e1000e_init_rx_addrs - Initialize receive address's
+ *  @hw: pointer to the HW structure
+ *  @rar_count: receive address registers
+ *
+ *  Setup the receive address registers by setting the base receive address
+ *  register to the devices MAC address and clearing all the other receive
+ *  address registers to 0.
+ **/
+void e1000e_init_rx_addrs(struct e1000_hw *hw, u16 rar_count)
+{
+       u32 i;
+       u8 mac_addr[ETH_ALEN] = { 0 };
+
+       /* Setup the receive address */
+       e_dbg("Programming MAC Address into RAR[0]\n");
+
+       e1000e_rar_set(hw, hw->mac.addr, 0);
+
+       /* Zero out the other (rar_entry_count - 1) receive addresses */
+       e_dbg("Clearing RAR[1-%u]\n", rar_count - 1);
+       for (i = 1; i < rar_count; i++)
+               e1000e_rar_set(hw, mac_addr, i);
+}
+
+/**
+ *  e1000_check_alt_mac_addr_generic - Check for alternate MAC addr
+ *  @hw: pointer to the HW structure
+ *
+ *  Checks the nvm for an alternate MAC address.  An alternate MAC address
+ *  can be setup by pre-boot software and must be treated like a permanent
+ *  address and must override the actual permanent MAC address. If an
+ *  alternate MAC address is found it is programmed into RAR0, replacing
+ *  the permanent address that was installed into RAR0 by the Si on reset.
+ *  This function will return SUCCESS unless it encounters an error while
+ *  reading the EEPROM.
+ **/
+s32 e1000_check_alt_mac_addr_generic(struct e1000_hw *hw)
+{
+       u32 i;
+       s32 ret_val = 0;
+       u16 offset, nvm_alt_mac_addr_offset, nvm_data;
+       u8 alt_mac_addr[ETH_ALEN];
+
+       ret_val = e1000_read_nvm(hw, NVM_COMPAT, 1, &nvm_data);
+       if (ret_val)
+               return ret_val;
+
+       /* not supported on 82573 */
+       if (hw->mac.type == e1000_82573)
+               return 0;
+
+       ret_val = e1000_read_nvm(hw, NVM_ALT_MAC_ADDR_PTR, 1,
+                                &nvm_alt_mac_addr_offset);
+       if (ret_val) {
+               e_dbg("NVM Read Error\n");
+               return ret_val;
+       }
+
+       if ((nvm_alt_mac_addr_offset == 0xFFFF) ||
+           (nvm_alt_mac_addr_offset == 0x0000))
+               /* There is no Alternate MAC Address */
+               return 0;
+
+       if (hw->bus.func == E1000_FUNC_1)
+               nvm_alt_mac_addr_offset += E1000_ALT_MAC_ADDRESS_OFFSET_LAN1;
+       for (i = 0; i < ETH_ALEN; i += 2) {
+               offset = nvm_alt_mac_addr_offset + (i >> 1);
+               ret_val = e1000_read_nvm(hw, offset, 1, &nvm_data);
+               if (ret_val) {
+                       e_dbg("NVM Read Error\n");
+                       return ret_val;
+               }
+
+               alt_mac_addr[i] = (u8)(nvm_data & 0xFF);
+               alt_mac_addr[i + 1] = (u8)(nvm_data >> 8);
+       }
+
+       /* if multicast bit is set, the alternate address will not be used */
+       if (is_multicast_ether_addr(alt_mac_addr)) {
+               e_dbg("Ignoring Alternate Mac Address with MC bit set\n");
+               return 0;
+       }
+
+       /*
+        * We have a valid alternate MAC address, and we want to treat it the
+        * same as the normal permanent MAC address stored by the HW into the
+        * RAR. Do this by mapping this address into RAR0.
+        */
+       e1000e_rar_set(hw, alt_mac_addr, 0);
+
+       return 0;
+}
+
+/**
+ *  e1000e_rar_set - Set receive address register
+ *  @hw: pointer to the HW structure
+ *  @addr: pointer to the receive address
+ *  @index: receive address array register
+ *
+ *  Sets the receive address array register at index to the address passed
+ *  in by addr.
+ **/
+void e1000e_rar_set(struct e1000_hw *hw, u8 *addr, u32 index)
+{
+       u32 rar_low, rar_high;
+
+       /*
+        * HW expects these in little endian so we reverse the byte order
+        * from network order (big endian) to little endian
+        */
+       rar_low = ((u32)addr[0] | ((u32)addr[1] << 8) |
+                  ((u32)addr[2] << 16) | ((u32)addr[3] << 24));
+
+       rar_high = ((u32)addr[4] | ((u32)addr[5] << 8));
+
+       /* If MAC address zero, no need to set the AV bit */
+       if (rar_low || rar_high)
+               rar_high |= E1000_RAH_AV;
+
+       /*
+        * Some bridges will combine consecutive 32-bit writes into
+        * a single burst write, which will malfunction on some parts.
+        * The flushes avoid this.
+        */
+       ew32(RAL(index), rar_low);
+       e1e_flush();
+       ew32(RAH(index), rar_high);
+       e1e_flush();
+}
+
+/**
+ *  e1000_hash_mc_addr - Generate a multicast hash value
+ *  @hw: pointer to the HW structure
+ *  @mc_addr: pointer to a multicast address
+ *
+ *  Generates a multicast address hash value which is used to determine
+ *  the multicast filter table array address and new table value.
+ **/
+static u32 e1000_hash_mc_addr(struct e1000_hw *hw, u8 *mc_addr)
+{
+       u32 hash_value, hash_mask;
+       u8 bit_shift = 0;
+
+       /* Register count multiplied by bits per register */
+       hash_mask = (hw->mac.mta_reg_count * 32) - 1;
+
+       /*
+        * For a mc_filter_type of 0, bit_shift is the number of left-shifts
+        * where 0xFF would still fall within the hash mask.
+        */
+       while (hash_mask >> bit_shift != 0xFF)
+               bit_shift++;
+
+       /*
+        * The portion of the address that is used for the hash table
+        * is determined by the mc_filter_type setting.
+        * The algorithm is such that there is a total of 8 bits of shifting.
+        * The bit_shift for a mc_filter_type of 0 represents the number of
+        * left-shifts where the MSB of mc_addr[5] would still fall within
+        * the hash_mask.  Case 0 does this exactly.  Since there are a total
+        * of 8 bits of shifting, then mc_addr[4] will shift right the
+        * remaining number of bits. Thus 8 - bit_shift.  The rest of the
+        * cases are a variation of this algorithm...essentially raising the
+        * number of bits to shift mc_addr[5] left, while still keeping the
+        * 8-bit shifting total.
+        *
+        * For example, given the following Destination MAC Address and an
+        * mta register count of 128 (thus a 4096-bit vector and 0xFFF mask),
+        * we can see that the bit_shift for case 0 is 4.  These are the hash
+        * values resulting from each mc_filter_type...
+        * [0] [1] [2] [3] [4] [5]
+        * 01  AA  00  12  34  56
+        * LSB           MSB
+        *
+        * case 0: hash_value = ((0x34 >> 4) | (0x56 << 4)) & 0xFFF = 0x563
+        * case 1: hash_value = ((0x34 >> 3) | (0x56 << 5)) & 0xFFF = 0xAC6
+        * case 2: hash_value = ((0x34 >> 2) | (0x56 << 6)) & 0xFFF = 0x163
+        * case 3: hash_value = ((0x34 >> 0) | (0x56 << 8)) & 0xFFF = 0x634
+        */
+       switch (hw->mac.mc_filter_type) {
+       default:
+       case 0:
+               break;
+       case 1:
+               bit_shift += 1;
+               break;
+       case 2:
+               bit_shift += 2;
+               break;
+       case 3:
+               bit_shift += 4;
+               break;
+       }
+
+       hash_value = hash_mask & (((mc_addr[4] >> (8 - bit_shift)) |
+                                  (((u16)mc_addr[5]) << bit_shift)));
+
+       return hash_value;
+}
+
+/**
+ *  e1000e_update_mc_addr_list_generic - Update Multicast addresses
+ *  @hw: pointer to the HW structure
+ *  @mc_addr_list: array of multicast addresses to program
+ *  @mc_addr_count: number of multicast addresses to program
+ *
+ *  Updates entire Multicast Table Array.
+ *  The caller must have a packed mc_addr_list of multicast addresses.
+ **/
+void e1000e_update_mc_addr_list_generic(struct e1000_hw *hw,
+                                       u8 *mc_addr_list, u32 mc_addr_count)
+{
+       u32 hash_value, hash_bit, hash_reg;
+       int i;
+
+       /* clear mta_shadow */
+       memset(&hw->mac.mta_shadow, 0, sizeof(hw->mac.mta_shadow));
+
+       /* update mta_shadow from mc_addr_list */
+       for (i = 0; (u32)i < mc_addr_count; i++) {
+               hash_value = e1000_hash_mc_addr(hw, mc_addr_list);
+
+               hash_reg = (hash_value >> 5) & (hw->mac.mta_reg_count - 1);
+               hash_bit = hash_value & 0x1F;
+
+               hw->mac.mta_shadow[hash_reg] |= (1 << hash_bit);
+               mc_addr_list += (ETH_ALEN);
+       }
+
+       /* replace the entire MTA table */
+       for (i = hw->mac.mta_reg_count - 1; i >= 0; i--)
+               E1000_WRITE_REG_ARRAY(hw, E1000_MTA, i, hw->mac.mta_shadow[i]);
+       e1e_flush();
+}
+
+/**
+ *  e1000e_clear_hw_cntrs_base - Clear base hardware counters
+ *  @hw: pointer to the HW structure
+ *
+ *  Clears the base hardware counters by reading the counter registers.
+ **/
+void e1000e_clear_hw_cntrs_base(struct e1000_hw *hw)
+{
+       er32(CRCERRS);
+       er32(SYMERRS);
+       er32(MPC);
+       er32(SCC);
+       er32(ECOL);
+       er32(MCC);
+       er32(LATECOL);
+       er32(COLC);
+       er32(DC);
+       er32(SEC);
+       er32(RLEC);
+       er32(XONRXC);
+       er32(XONTXC);
+       er32(XOFFRXC);
+       er32(XOFFTXC);
+       er32(FCRUC);
+       er32(GPRC);
+       er32(BPRC);
+       er32(MPRC);
+       er32(GPTC);
+       er32(GORCL);
+       er32(GORCH);
+       er32(GOTCL);
+       er32(GOTCH);
+       er32(RNBC);
+       er32(RUC);
+       er32(RFC);
+       er32(ROC);
+       er32(RJC);
+       er32(TORL);
+       er32(TORH);
+       er32(TOTL);
+       er32(TOTH);
+       er32(TPR);
+       er32(TPT);
+       er32(MPTC);
+       er32(BPTC);
+}
+
+/**
+ *  e1000e_check_for_copper_link - Check for link (Copper)
+ *  @hw: pointer to the HW structure
+ *
+ *  Checks to see of the link status of the hardware has changed.  If a
+ *  change in link status has been detected, then we read the PHY registers
+ *  to get the current speed/duplex if link exists.
+ **/
+s32 e1000e_check_for_copper_link(struct e1000_hw *hw)
+{
+       struct e1000_mac_info *mac = &hw->mac;
+       s32 ret_val;
+       bool link;
+
+       /*
+        * We only want to go out to the PHY registers to see if Auto-Neg
+        * has completed and/or if our link status has changed.  The
+        * get_link_status flag is set upon receiving a Link Status
+        * Change or Rx Sequence Error interrupt.
+        */
+       if (!mac->get_link_status)
+               return 0;
+
+       /*
+        * First we want to see if the MII Status Register reports
+        * link.  If so, then we want to get the current speed/duplex
+        * of the PHY.
+        */
+       ret_val = e1000e_phy_has_link_generic(hw, 1, 0, &link);
+       if (ret_val)
+               return ret_val;
+
+       if (!link)
+               return 0;       /* No link detected */
+
+       mac->get_link_status = false;
+
+       /*
+        * Check if there was DownShift, must be checked
+        * immediately after link-up
+        */
+       e1000e_check_downshift(hw);
+
+       /*
+        * If we are forcing speed/duplex, then we simply return since
+        * we have already determined whether we have link or not.
+        */
+       if (!mac->autoneg)
+               return -E1000_ERR_CONFIG;
+
+       /*
+        * Auto-Neg is enabled.  Auto Speed Detection takes care
+        * of MAC speed/duplex configuration.  So we only need to
+        * configure Collision Distance in the MAC.
+        */
+       mac->ops.config_collision_dist(hw);
+
+       /*
+        * Configure Flow Control now that Auto-Neg has completed.
+        * First, we need to restore the desired flow control
+        * settings because we may have had to re-autoneg with a
+        * different link partner.
+        */
+       ret_val = e1000e_config_fc_after_link_up(hw);
+       if (ret_val)
+               e_dbg("Error configuring flow control\n");
+
+       return ret_val;
+}
+
+/**
+ *  e1000e_check_for_fiber_link - Check for link (Fiber)
+ *  @hw: pointer to the HW structure
+ *
+ *  Checks for link up on the hardware.  If link is not up and we have
+ *  a signal, then we need to force link up.
+ **/
+s32 e1000e_check_for_fiber_link(struct e1000_hw *hw)
+{
+       struct e1000_mac_info *mac = &hw->mac;
+       u32 rxcw;
+       u32 ctrl;
+       u32 status;
+       s32 ret_val;
+
+       ctrl = er32(CTRL);
+       status = er32(STATUS);
+       rxcw = er32(RXCW);
+
+       /*
+        * If we don't have link (auto-negotiation failed or link partner
+        * cannot auto-negotiate), the cable is plugged in (we have signal),
+        * and our link partner is not trying to auto-negotiate with us (we
+        * are receiving idles or data), we need to force link up. We also
+        * need to give auto-negotiation time to complete, in case the cable
+        * was just plugged in. The autoneg_failed flag does this.
+        */
+       /* (ctrl & E1000_CTRL_SWDPIN1) == 1 == have signal */
+       if ((ctrl & E1000_CTRL_SWDPIN1) && !(status & E1000_STATUS_LU) &&
+           !(rxcw & E1000_RXCW_C)) {
+               if (!mac->autoneg_failed) {
+                       mac->autoneg_failed = true;
+                       return 0;
+               }
+               e_dbg("NOT Rx'ing /C/, disable AutoNeg and force link.\n");
+
+               /* Disable auto-negotiation in the TXCW register */
+               ew32(TXCW, (mac->txcw & ~E1000_TXCW_ANE));
+
+               /* Force link-up and also force full-duplex. */
+               ctrl = er32(CTRL);
+               ctrl |= (E1000_CTRL_SLU | E1000_CTRL_FD);
+               ew32(CTRL, ctrl);
+
+               /* Configure Flow Control after forcing link up. */
+               ret_val = e1000e_config_fc_after_link_up(hw);
+               if (ret_val) {
+                       e_dbg("Error configuring flow control\n");
+                       return ret_val;
+               }
+       } else if ((ctrl & E1000_CTRL_SLU) && (rxcw & E1000_RXCW_C)) {
+               /*
+                * If we are forcing link and we are receiving /C/ ordered
+                * sets, re-enable auto-negotiation in the TXCW register
+                * and disable forced link in the Device Control register
+                * in an attempt to auto-negotiate with our link partner.
+                */
+               e_dbg("Rx'ing /C/, enable AutoNeg and stop forcing link.\n");
+               ew32(TXCW, mac->txcw);
+               ew32(CTRL, (ctrl & ~E1000_CTRL_SLU));
+
+               mac->serdes_has_link = true;
+       }
+
+       return 0;
+}
+
+/**
+ *  e1000e_check_for_serdes_link - Check for link (Serdes)
+ *  @hw: pointer to the HW structure
+ *
+ *  Checks for link up on the hardware.  If link is not up and we have
+ *  a signal, then we need to force link up.
+ **/
+s32 e1000e_check_for_serdes_link(struct e1000_hw *hw)
+{
+       struct e1000_mac_info *mac = &hw->mac;
+       u32 rxcw;
+       u32 ctrl;
+       u32 status;
+       s32 ret_val;
+
+       ctrl = er32(CTRL);
+       status = er32(STATUS);
+       rxcw = er32(RXCW);
+
+       /*
+        * If we don't have link (auto-negotiation failed or link partner
+        * cannot auto-negotiate), and our link partner is not trying to
+        * auto-negotiate with us (we are receiving idles or data),
+        * we need to force link up. We also need to give auto-negotiation
+        * time to complete.
+        */
+       /* (ctrl & E1000_CTRL_SWDPIN1) == 1 == have signal */
+       if (!(status & E1000_STATUS_LU) && !(rxcw & E1000_RXCW_C)) {
+               if (!mac->autoneg_failed) {
+                       mac->autoneg_failed = true;
+                       return 0;
+               }
+               e_dbg("NOT Rx'ing /C/, disable AutoNeg and force link.\n");
+
+               /* Disable auto-negotiation in the TXCW register */
+               ew32(TXCW, (mac->txcw & ~E1000_TXCW_ANE));
+
+               /* Force link-up and also force full-duplex. */
+               ctrl = er32(CTRL);
+               ctrl |= (E1000_CTRL_SLU | E1000_CTRL_FD);
+               ew32(CTRL, ctrl);
+
+               /* Configure Flow Control after forcing link up. */
+               ret_val = e1000e_config_fc_after_link_up(hw);
+               if (ret_val) {
+                       e_dbg("Error configuring flow control\n");
+                       return ret_val;
+               }
+       } else if ((ctrl & E1000_CTRL_SLU) && (rxcw & E1000_RXCW_C)) {
+               /*
+                * If we are forcing link and we are receiving /C/ ordered
+                * sets, re-enable auto-negotiation in the TXCW register
+                * and disable forced link in the Device Control register
+                * in an attempt to auto-negotiate with our link partner.
+                */
+               e_dbg("Rx'ing /C/, enable AutoNeg and stop forcing link.\n");
+               ew32(TXCW, mac->txcw);
+               ew32(CTRL, (ctrl & ~E1000_CTRL_SLU));
+
+               mac->serdes_has_link = true;
+       } else if (!(E1000_TXCW_ANE & er32(TXCW))) {
+               /*
+                * If we force link for non-auto-negotiation switch, check
+                * link status based on MAC synchronization for internal
+                * serdes media type.
+                */
+               /* SYNCH bit and IV bit are sticky. */
+               udelay(10);
+               rxcw = er32(RXCW);
+               if (rxcw & E1000_RXCW_SYNCH) {
+                       if (!(rxcw & E1000_RXCW_IV)) {
+                               mac->serdes_has_link = true;
+                               e_dbg("SERDES: Link up - forced.\n");
+                       }
+               } else {
+                       mac->serdes_has_link = false;
+                       e_dbg("SERDES: Link down - force failed.\n");
+               }
+       }
+
+       if (E1000_TXCW_ANE & er32(TXCW)) {
+               status = er32(STATUS);
+               if (status & E1000_STATUS_LU) {
+                       /* SYNCH bit and IV bit are sticky, so reread rxcw. */
+                       udelay(10);
+                       rxcw = er32(RXCW);
+                       if (rxcw & E1000_RXCW_SYNCH) {
+                               if (!(rxcw & E1000_RXCW_IV)) {
+                                       mac->serdes_has_link = true;
+                                       e_dbg("SERDES: Link up - autoneg completed successfully.\n");
+                               } else {
+                                       mac->serdes_has_link = false;
+                                       e_dbg("SERDES: Link down - invalid codewords detected in autoneg.\n");
+                               }
+                       } else {
+                               mac->serdes_has_link = false;
+                               e_dbg("SERDES: Link down - no sync.\n");
+                       }
+               } else {
+                       mac->serdes_has_link = false;
+                       e_dbg("SERDES: Link down - autoneg failed\n");
+               }
+       }
+
+       return 0;
+}
+
+/**
+ *  e1000_set_default_fc_generic - Set flow control default values
+ *  @hw: pointer to the HW structure
+ *
+ *  Read the EEPROM for the default values for flow control and store the
+ *  values.
+ **/
+static s32 e1000_set_default_fc_generic(struct e1000_hw *hw)
+{
+       s32 ret_val;
+       u16 nvm_data;
+
+       /*
+        * Read and store word 0x0F of the EEPROM. This word contains bits
+        * that determine the hardware's default PAUSE (flow control) mode,
+        * a bit that determines whether the HW defaults to enabling or
+        * disabling auto-negotiation, and the direction of the
+        * SW defined pins. If there is no SW over-ride of the flow
+        * control setting, then the variable hw->fc will
+        * be initialized based on a value in the EEPROM.
+        */
+       ret_val = e1000_read_nvm(hw, NVM_INIT_CONTROL2_REG, 1, &nvm_data);
+
+       if (ret_val) {
+               e_dbg("NVM Read Error\n");
+               return ret_val;
+       }
+
+       if ((nvm_data & NVM_WORD0F_PAUSE_MASK) == 0)
+               hw->fc.requested_mode = e1000_fc_none;
+       else if ((nvm_data & NVM_WORD0F_PAUSE_MASK) == NVM_WORD0F_ASM_DIR)
+               hw->fc.requested_mode = e1000_fc_tx_pause;
+       else
+               hw->fc.requested_mode = e1000_fc_full;
+
+       return 0;
+}
+
+/**
+ *  e1000e_setup_link_generic - Setup flow control and link settings
+ *  @hw: pointer to the HW structure
+ *
+ *  Determines which flow control settings to use, then configures flow
+ *  control.  Calls the appropriate media-specific link configuration
+ *  function.  Assuming the adapter has a valid link partner, a valid link
+ *  should be established.  Assumes the hardware has previously been reset
+ *  and the transmitter and receiver are not enabled.
+ **/
+s32 e1000e_setup_link_generic(struct e1000_hw *hw)
+{
+       s32 ret_val;
+
+       /*
+        * In the case of the phy reset being blocked, we already have a link.
+        * We do not need to set it up again.
+        */
+       if (hw->phy.ops.check_reset_block(hw))
+               return 0;
+
+       /*
+        * If requested flow control is set to default, set flow control
+        * based on the EEPROM flow control settings.
+        */
+       if (hw->fc.requested_mode == e1000_fc_default) {
+               ret_val = e1000_set_default_fc_generic(hw);
+               if (ret_val)
+                       return ret_val;
+       }
+
+       /*
+        * Save off the requested flow control mode for use later.  Depending
+        * on the link partner's capabilities, we may or may not use this mode.
+        */
+       hw->fc.current_mode = hw->fc.requested_mode;
+
+       e_dbg("After fix-ups FlowControl is now = %x\n", hw->fc.current_mode);
+
+       /* Call the necessary media_type subroutine to configure the link. */
+       ret_val = hw->mac.ops.setup_physical_interface(hw);
+       if (ret_val)
+               return ret_val;
+
+       /*
+        * Initialize the flow control address, type, and PAUSE timer
+        * registers to their default values.  This is done even if flow
+        * control is disabled, because it does not hurt anything to
+        * initialize these registers.
+        */
+       e_dbg("Initializing the Flow Control address, type and timer regs\n");
+       ew32(FCT, FLOW_CONTROL_TYPE);
+       ew32(FCAH, FLOW_CONTROL_ADDRESS_HIGH);
+       ew32(FCAL, FLOW_CONTROL_ADDRESS_LOW);
+
+       ew32(FCTTV, hw->fc.pause_time);
+
+       return e1000e_set_fc_watermarks(hw);
+}
+
+/**
+ *  e1000_commit_fc_settings_generic - Configure flow control
+ *  @hw: pointer to the HW structure
+ *
+ *  Write the flow control settings to the Transmit Config Word Register (TXCW)
+ *  base on the flow control settings in e1000_mac_info.
+ **/
+static s32 e1000_commit_fc_settings_generic(struct e1000_hw *hw)
+{
+       struct e1000_mac_info *mac = &hw->mac;
+       u32 txcw;
+
+       /*
+        * Check for a software override of the flow control settings, and
+        * setup the device accordingly.  If auto-negotiation is enabled, then
+        * software will have to set the "PAUSE" bits to the correct value in
+        * the Transmit Config Word Register (TXCW) and re-start auto-
+        * negotiation.  However, if auto-negotiation is disabled, then
+        * software will have to manually configure the two flow control enable
+        * bits in the CTRL register.
+        *
+        * The possible values of the "fc" parameter are:
+        *      0:  Flow control is completely disabled
+        *      1:  Rx flow control is enabled (we can receive pause frames,
+        *          but not send pause frames).
+        *      2:  Tx flow control is enabled (we can send pause frames but we
+        *          do not support receiving pause frames).
+        *      3:  Both Rx and Tx flow control (symmetric) are enabled.
+        */
+       switch (hw->fc.current_mode) {
+       case e1000_fc_none:
+               /* Flow control completely disabled by a software over-ride. */
+               txcw = (E1000_TXCW_ANE | E1000_TXCW_FD);
+               break;
+       case e1000_fc_rx_pause:
+               /*
+                * Rx Flow control is enabled and Tx Flow control is disabled
+                * by a software over-ride. Since there really isn't a way to
+                * advertise that we are capable of Rx Pause ONLY, we will
+                * advertise that we support both symmetric and asymmetric Rx
+                * PAUSE.  Later, we will disable the adapter's ability to send
+                * PAUSE frames.
+                */
+               txcw = (E1000_TXCW_ANE | E1000_TXCW_FD | E1000_TXCW_PAUSE_MASK);
+               break;
+       case e1000_fc_tx_pause:
+               /*
+                * Tx Flow control is enabled, and Rx Flow control is disabled,
+                * by a software over-ride.
+                */
+               txcw = (E1000_TXCW_ANE | E1000_TXCW_FD | E1000_TXCW_ASM_DIR);
+               break;
+       case e1000_fc_full:
+               /*
+                * Flow control (both Rx and Tx) is enabled by a software
+                * over-ride.
+                */
+               txcw = (E1000_TXCW_ANE | E1000_TXCW_FD | E1000_TXCW_PAUSE_MASK);
+               break;
+       default:
+               e_dbg("Flow control param set incorrectly\n");
+               return -E1000_ERR_CONFIG;
+               break;
+       }
+
+       ew32(TXCW, txcw);
+       mac->txcw = txcw;
+
+       return 0;
+}
+
+/**
+ *  e1000_poll_fiber_serdes_link_generic - Poll for link up
+ *  @hw: pointer to the HW structure
+ *
+ *  Polls for link up by reading the status register, if link fails to come
+ *  up with auto-negotiation, then the link is forced if a signal is detected.
+ **/
+static s32 e1000_poll_fiber_serdes_link_generic(struct e1000_hw *hw)
+{
+       struct e1000_mac_info *mac = &hw->mac;
+       u32 i, status;
+       s32 ret_val;
+
+       /*
+        * If we have a signal (the cable is plugged in, or assumed true for
+        * serdes media) then poll for a "Link-Up" indication in the Device
+        * Status Register.  Time-out if a link isn't seen in 500 milliseconds
+        * seconds (Auto-negotiation should complete in less than 500
+        * milliseconds even if the other end is doing it in SW).
+        */
+       for (i = 0; i < FIBER_LINK_UP_LIMIT; i++) {
+               usleep_range(10000, 20000);
+               status = er32(STATUS);
+               if (status & E1000_STATUS_LU)
+                       break;
+       }
+       if (i == FIBER_LINK_UP_LIMIT) {
+               e_dbg("Never got a valid link from auto-neg!!!\n");
+               mac->autoneg_failed = true;
+               /*
+                * AutoNeg failed to achieve a link, so we'll call
+                * mac->check_for_link. This routine will force the
+                * link up if we detect a signal. This will allow us to
+                * communicate with non-autonegotiating link partners.
+                */
+               ret_val = mac->ops.check_for_link(hw);
+               if (ret_val) {
+                       e_dbg("Error while checking for link\n");
+                       return ret_val;
+               }
+               mac->autoneg_failed = false;
+       } else {
+               mac->autoneg_failed = false;
+               e_dbg("Valid Link Found\n");
+       }
+
+       return 0;
+}
+
+/**
+ *  e1000e_setup_fiber_serdes_link - Setup link for fiber/serdes
+ *  @hw: pointer to the HW structure
+ *
+ *  Configures collision distance and flow control for fiber and serdes
+ *  links.  Upon successful setup, poll for link.
+ **/
+s32 e1000e_setup_fiber_serdes_link(struct e1000_hw *hw)
+{
+       u32 ctrl;
+       s32 ret_val;
+
+       ctrl = er32(CTRL);
+
+       /* Take the link out of reset */
+       ctrl &= ~E1000_CTRL_LRST;
+
+       hw->mac.ops.config_collision_dist(hw);
+
+       ret_val = e1000_commit_fc_settings_generic(hw);
+       if (ret_val)
+               return ret_val;
+
+       /*
+        * Since auto-negotiation is enabled, take the link out of reset (the
+        * link will be in reset, because we previously reset the chip). This
+        * will restart auto-negotiation.  If auto-negotiation is successful
+        * then the link-up status bit will be set and the flow control enable
+        * bits (RFCE and TFCE) will be set according to their negotiated value.
+        */
+       e_dbg("Auto-negotiation enabled\n");
+
+       ew32(CTRL, ctrl);
+       e1e_flush();
+       usleep_range(1000, 2000);
+
+       /*
+        * For these adapters, the SW definable pin 1 is set when the optics
+        * detect a signal.  If we have a signal, then poll for a "Link-Up"
+        * indication.
+        */
+       if (hw->phy.media_type == e1000_media_type_internal_serdes ||
+           (er32(CTRL) & E1000_CTRL_SWDPIN1)) {
+               ret_val = e1000_poll_fiber_serdes_link_generic(hw);
+       } else {
+               e_dbg("No signal detected\n");
+       }
+
+       return ret_val;
+}
+
+/**
+ *  e1000e_config_collision_dist_generic - Configure collision distance
+ *  @hw: pointer to the HW structure
+ *
+ *  Configures the collision distance to the default value and is used
+ *  during link setup.
+ **/
+void e1000e_config_collision_dist_generic(struct e1000_hw *hw)
+{
+       u32 tctl;
+
+       tctl = er32(TCTL);
+
+       tctl &= ~E1000_TCTL_COLD;
+       tctl |= E1000_COLLISION_DISTANCE << E1000_COLD_SHIFT;
+
+       ew32(TCTL, tctl);
+       e1e_flush();
+}
+
+/**
+ *  e1000e_set_fc_watermarks - Set flow control high/low watermarks
+ *  @hw: pointer to the HW structure
+ *
+ *  Sets the flow control high/low threshold (watermark) registers.  If
+ *  flow control XON frame transmission is enabled, then set XON frame
+ *  transmission as well.
+ **/
+s32 e1000e_set_fc_watermarks(struct e1000_hw *hw)
+{
+       u32 fcrtl = 0, fcrth = 0;
+
+       /*
+        * Set the flow control receive threshold registers.  Normally,
+        * these registers will be set to a default threshold that may be
+        * adjusted later by the driver's runtime code.  However, if the
+        * ability to transmit pause frames is not enabled, then these
+        * registers will be set to 0.
+        */
+       if (hw->fc.current_mode & e1000_fc_tx_pause) {
+               /*
+                * We need to set up the Receive Threshold high and low water
+                * marks as well as (optionally) enabling the transmission of
+                * XON frames.
+                */
+               fcrtl = hw->fc.low_water;
+               if (hw->fc.send_xon)
+                       fcrtl |= E1000_FCRTL_XONE;
+
+               fcrth = hw->fc.high_water;
+       }
+       ew32(FCRTL, fcrtl);
+       ew32(FCRTH, fcrth);
+
+       return 0;
+}
+
+/**
+ *  e1000e_force_mac_fc - Force the MAC's flow control settings
+ *  @hw: pointer to the HW structure
+ *
+ *  Force the MAC's flow control settings.  Sets the TFCE and RFCE bits in the
+ *  device control register to reflect the adapter settings.  TFCE and RFCE
+ *  need to be explicitly set by software when a copper PHY is used because
+ *  autonegotiation is managed by the PHY rather than the MAC.  Software must
+ *  also configure these bits when link is forced on a fiber connection.
+ **/
+s32 e1000e_force_mac_fc(struct e1000_hw *hw)
+{
+       u32 ctrl;
+
+       ctrl = er32(CTRL);
+
+       /*
+        * Because we didn't get link via the internal auto-negotiation
+        * mechanism (we either forced link or we got link via PHY
+        * auto-neg), we have to manually enable/disable transmit an
+        * receive flow control.
+        *
+        * The "Case" statement below enables/disable flow control
+        * according to the "hw->fc.current_mode" parameter.
+        *
+        * The possible values of the "fc" parameter are:
+        *      0:  Flow control is completely disabled
+        *      1:  Rx flow control is enabled (we can receive pause
+        *          frames but not send pause frames).
+        *      2:  Tx flow control is enabled (we can send pause frames
+        *          frames but we do not receive pause frames).
+        *      3:  Both Rx and Tx flow control (symmetric) is enabled.
+        *  other:  No other values should be possible at this point.
+        */
+       e_dbg("hw->fc.current_mode = %u\n", hw->fc.current_mode);
+
+       switch (hw->fc.current_mode) {
+       case e1000_fc_none:
+               ctrl &= (~(E1000_CTRL_TFCE | E1000_CTRL_RFCE));
+               break;
+       case e1000_fc_rx_pause:
+               ctrl &= (~E1000_CTRL_TFCE);
+               ctrl |= E1000_CTRL_RFCE;
+               break;
+       case e1000_fc_tx_pause:
+               ctrl &= (~E1000_CTRL_RFCE);
+               ctrl |= E1000_CTRL_TFCE;
+               break;
+       case e1000_fc_full:
+               ctrl |= (E1000_CTRL_TFCE | E1000_CTRL_RFCE);
+               break;
+       default:
+               e_dbg("Flow control param set incorrectly\n");
+               return -E1000_ERR_CONFIG;
+       }
+
+       ew32(CTRL, ctrl);
+
+       return 0;
+}
+
+/**
+ *  e1000e_config_fc_after_link_up - Configures flow control after link
+ *  @hw: pointer to the HW structure
+ *
+ *  Checks the status of auto-negotiation after link up to ensure that the
+ *  speed and duplex were not forced.  If the link needed to be forced, then
+ *  flow control needs to be forced also.  If auto-negotiation is enabled
+ *  and did not fail, then we configure flow control based on our link
+ *  partner.
+ **/
+s32 e1000e_config_fc_after_link_up(struct e1000_hw *hw)
+{
+       struct e1000_mac_info *mac = &hw->mac;
+       s32 ret_val = 0;
+       u16 mii_status_reg, mii_nway_adv_reg, mii_nway_lp_ability_reg;
+       u16 speed, duplex;
+
+       /*
+        * Check for the case where we have fiber media and auto-neg failed
+        * so we had to force link.  In this case, we need to force the
+        * configuration of the MAC to match the "fc" parameter.
+        */
+       if (mac->autoneg_failed) {
+               if (hw->phy.media_type == e1000_media_type_fiber ||
+                   hw->phy.media_type == e1000_media_type_internal_serdes)
+                       ret_val = e1000e_force_mac_fc(hw);
+       } else {
+               if (hw->phy.media_type == e1000_media_type_copper)
+                       ret_val = e1000e_force_mac_fc(hw);
+       }
+
+       if (ret_val) {
+               e_dbg("Error forcing flow control settings\n");
+               return ret_val;
+       }
+
+       /*
+        * Check for the case where we have copper media and auto-neg is
+        * enabled.  In this case, we need to check and see if Auto-Neg
+        * has completed, and if so, how the PHY and link partner has
+        * flow control configured.
+        */
+       if ((hw->phy.media_type == e1000_media_type_copper) && mac->autoneg) {
+               /*
+                * Read the MII Status Register and check to see if AutoNeg
+                * has completed.  We read this twice because this reg has
+                * some "sticky" (latched) bits.
+                */
+               ret_val = e1e_rphy(hw, PHY_STATUS, &mii_status_reg);
+               if (ret_val)
+                       return ret_val;
+               ret_val = e1e_rphy(hw, PHY_STATUS, &mii_status_reg);
+               if (ret_val)
+                       return ret_val;
+
+               if (!(mii_status_reg & MII_SR_AUTONEG_COMPLETE)) {
+                       e_dbg("Copper PHY and Auto Neg has not completed.\n");
+                       return ret_val;
+               }
+
+               /*
+                * The AutoNeg process has completed, so we now need to
+                * read both the Auto Negotiation Advertisement
+                * Register (Address 4) and the Auto_Negotiation Base
+                * Page Ability Register (Address 5) to determine how
+                * flow control was negotiated.
+                */
+               ret_val = e1e_rphy(hw, PHY_AUTONEG_ADV, &mii_nway_adv_reg);
+               if (ret_val)
+                       return ret_val;
+               ret_val =
+                   e1e_rphy(hw, PHY_LP_ABILITY, &mii_nway_lp_ability_reg);
+               if (ret_val)
+                       return ret_val;
+
+               /*
+                * Two bits in the Auto Negotiation Advertisement Register
+                * (Address 4) and two bits in the Auto Negotiation Base
+                * Page Ability Register (Address 5) determine flow control
+                * for both the PHY and the link partner.  The following
+                * table, taken out of the IEEE 802.3ab/D6.0 dated March 25,
+                * 1999, describes these PAUSE resolution bits and how flow
+                * control is determined based upon these settings.
+                * NOTE:  DC = Don't Care
+                *
+                *   LOCAL DEVICE  |   LINK PARTNER
+                * PAUSE | ASM_DIR | PAUSE | ASM_DIR | NIC Resolution
+                *-------|---------|-------|---------|--------------------
+                *   0   |    0    |  DC   |   DC    | e1000_fc_none
+                *   0   |    1    |   0   |   DC    | e1000_fc_none
+                *   0   |    1    |   1   |    0    | e1000_fc_none
+                *   0   |    1    |   1   |    1    | e1000_fc_tx_pause
+                *   1   |    0    |   0   |   DC    | e1000_fc_none
+                *   1   |   DC    |   1   |   DC    | e1000_fc_full
+                *   1   |    1    |   0   |    0    | e1000_fc_none
+                *   1   |    1    |   0   |    1    | e1000_fc_rx_pause
+                *
+                * Are both PAUSE bits set to 1?  If so, this implies
+                * Symmetric Flow Control is enabled at both ends.  The
+                * ASM_DIR bits are irrelevant per the spec.
+                *
+                * For Symmetric Flow Control:
+                *
+                *   LOCAL DEVICE  |   LINK PARTNER
+                * PAUSE | ASM_DIR | PAUSE | ASM_DIR | Result
+                *-------|---------|-------|---------|--------------------
+                *   1   |   DC    |   1   |   DC    | E1000_fc_full
+                *
+                */
+               if ((mii_nway_adv_reg & NWAY_AR_PAUSE) &&
+                   (mii_nway_lp_ability_reg & NWAY_LPAR_PAUSE)) {
+                       /*
+                        * Now we need to check if the user selected Rx ONLY
+                        * of pause frames.  In this case, we had to advertise
+                        * FULL flow control because we could not advertise Rx
+                        * ONLY. Hence, we must now check to see if we need to
+                        * turn OFF the TRANSMISSION of PAUSE frames.
+                        */
+                       if (hw->fc.requested_mode == e1000_fc_full) {
+                               hw->fc.current_mode = e1000_fc_full;
+                               e_dbg("Flow Control = FULL.\n");
+                       } else {
+                               hw->fc.current_mode = e1000_fc_rx_pause;
+                               e_dbg("Flow Control = Rx PAUSE frames only.\n");
+                       }
+               }
+               /*
+                * For receiving PAUSE frames ONLY.
+                *
+                *   LOCAL DEVICE  |   LINK PARTNER
+                * PAUSE | ASM_DIR | PAUSE | ASM_DIR | Result
+                *-------|---------|-------|---------|--------------------
+                *   0   |    1    |   1   |    1    | e1000_fc_tx_pause
+                */
+               else if (!(mii_nway_adv_reg & NWAY_AR_PAUSE) &&
+                        (mii_nway_adv_reg & NWAY_AR_ASM_DIR) &&
+                        (mii_nway_lp_ability_reg & NWAY_LPAR_PAUSE) &&
+                        (mii_nway_lp_ability_reg & NWAY_LPAR_ASM_DIR)) {
+                       hw->fc.current_mode = e1000_fc_tx_pause;
+                       e_dbg("Flow Control = Tx PAUSE frames only.\n");
+               }
+               /*
+                * For transmitting PAUSE frames ONLY.
+                *
+                *   LOCAL DEVICE  |   LINK PARTNER
+                * PAUSE | ASM_DIR | PAUSE | ASM_DIR | Result
+                *-------|---------|-------|---------|--------------------
+                *   1   |    1    |   0   |    1    | e1000_fc_rx_pause
+                */
+               else if ((mii_nway_adv_reg & NWAY_AR_PAUSE) &&
+                        (mii_nway_adv_reg & NWAY_AR_ASM_DIR) &&
+                        !(mii_nway_lp_ability_reg & NWAY_LPAR_PAUSE) &&
+                        (mii_nway_lp_ability_reg & NWAY_LPAR_ASM_DIR)) {
+                       hw->fc.current_mode = e1000_fc_rx_pause;
+                       e_dbg("Flow Control = Rx PAUSE frames only.\n");
+               } else {
+                       /*
+                        * Per the IEEE spec, at this point flow control
+                        * should be disabled.
+                        */
+                       hw->fc.current_mode = e1000_fc_none;
+                       e_dbg("Flow Control = NONE.\n");
+               }
+
+               /*
+                * Now we need to do one last check...  If we auto-
+                * negotiated to HALF DUPLEX, flow control should not be
+                * enabled per IEEE 802.3 spec.
+                */
+               ret_val = mac->ops.get_link_up_info(hw, &speed, &duplex);
+               if (ret_val) {
+                       e_dbg("Error getting link speed and duplex\n");
+                       return ret_val;
+               }
+
+               if (duplex == HALF_DUPLEX)
+                       hw->fc.current_mode = e1000_fc_none;
+
+               /*
+                * Now we call a subroutine to actually force the MAC
+                * controller to use the correct flow control settings.
+                */
+               ret_val = e1000e_force_mac_fc(hw);
+               if (ret_val) {
+                       e_dbg("Error forcing flow control settings\n");
+                       return ret_val;
+               }
+       }
+
+       return 0;
+}
+
+/**
+ *  e1000e_get_speed_and_duplex_copper - Retrieve current speed/duplex
+ *  @hw: pointer to the HW structure
+ *  @speed: stores the current speed
+ *  @duplex: stores the current duplex
+ *
+ *  Read the status register for the current speed/duplex and store the current
+ *  speed and duplex for copper connections.
+ **/
+s32 e1000e_get_speed_and_duplex_copper(struct e1000_hw *hw, u16 *speed,
+                                      u16 *duplex)
+{
+       u32 status;
+
+       status = er32(STATUS);
+       if (status & E1000_STATUS_SPEED_1000)
+               *speed = SPEED_1000;
+       else if (status & E1000_STATUS_SPEED_100)
+               *speed = SPEED_100;
+       else
+               *speed = SPEED_10;
+
+       if (status & E1000_STATUS_FD)
+               *duplex = FULL_DUPLEX;
+       else
+               *duplex = HALF_DUPLEX;
+
+       e_dbg("%u Mbps, %s Duplex\n",
+             *speed == SPEED_1000 ? 1000 : *speed == SPEED_100 ? 100 : 10,
+             *duplex == FULL_DUPLEX ? "Full" : "Half");
+
+       return 0;
+}
+
+/**
+ *  e1000e_get_speed_and_duplex_fiber_serdes - Retrieve current speed/duplex
+ *  @hw: pointer to the HW structure
+ *  @speed: stores the current speed
+ *  @duplex: stores the current duplex
+ *
+ *  Sets the speed and duplex to gigabit full duplex (the only possible option)
+ *  for fiber/serdes links.
+ **/
+s32 e1000e_get_speed_and_duplex_fiber_serdes(struct e1000_hw *hw, u16 *speed,
+                                            u16 *duplex)
+{
+       *speed = SPEED_1000;
+       *duplex = FULL_DUPLEX;
+
+       return 0;
+}
+
+/**
+ *  e1000e_get_hw_semaphore - Acquire hardware semaphore
+ *  @hw: pointer to the HW structure
+ *
+ *  Acquire the HW semaphore to access the PHY or NVM
+ **/
+s32 e1000e_get_hw_semaphore(struct e1000_hw *hw)
+{
+       u32 swsm;
+       s32 timeout = hw->nvm.word_size + 1;
+       s32 i = 0;
+
+       /* Get the SW semaphore */
+       while (i < timeout) {
+               swsm = er32(SWSM);
+               if (!(swsm & E1000_SWSM_SMBI))
+                       break;
+
+               udelay(50);
+               i++;
+       }
+
+       if (i == timeout) {
+               e_dbg("Driver can't access device - SMBI bit is set.\n");
+               return -E1000_ERR_NVM;
+       }
+
+       /* Get the FW semaphore. */
+       for (i = 0; i < timeout; i++) {
+               swsm = er32(SWSM);
+               ew32(SWSM, swsm | E1000_SWSM_SWESMBI);
+
+               /* Semaphore acquired if bit latched */
+               if (er32(SWSM) & E1000_SWSM_SWESMBI)
+                       break;
+
+               udelay(50);
+       }
+
+       if (i == timeout) {
+               /* Release semaphores */
+               e1000e_put_hw_semaphore(hw);
+               e_dbg("Driver can't access the NVM\n");
+               return -E1000_ERR_NVM;
+       }
+
+       return 0;
+}
+
+/**
+ *  e1000e_put_hw_semaphore - Release hardware semaphore
+ *  @hw: pointer to the HW structure
+ *
+ *  Release hardware semaphore used to access the PHY or NVM
+ **/
+void e1000e_put_hw_semaphore(struct e1000_hw *hw)
+{
+       u32 swsm;
+
+       swsm = er32(SWSM);
+       swsm &= ~(E1000_SWSM_SMBI | E1000_SWSM_SWESMBI);
+       ew32(SWSM, swsm);
+}
+
+/**
+ *  e1000e_get_auto_rd_done - Check for auto read completion
+ *  @hw: pointer to the HW structure
+ *
+ *  Check EEPROM for Auto Read done bit.
+ **/
+s32 e1000e_get_auto_rd_done(struct e1000_hw *hw)
+{
+       s32 i = 0;
+
+       while (i < AUTO_READ_DONE_TIMEOUT) {
+               if (er32(EECD) & E1000_EECD_AUTO_RD)
+                       break;
+               usleep_range(1000, 2000);
+               i++;
+       }
+
+       if (i == AUTO_READ_DONE_TIMEOUT) {
+               e_dbg("Auto read by HW from NVM has not completed.\n");
+               return -E1000_ERR_RESET;
+       }
+
+       return 0;
+}
+
+/**
+ *  e1000e_valid_led_default - Verify a valid default LED config
+ *  @hw: pointer to the HW structure
+ *  @data: pointer to the NVM (EEPROM)
+ *
+ *  Read the EEPROM for the current default LED configuration.  If the
+ *  LED configuration is not valid, set to a valid LED configuration.
+ **/
+s32 e1000e_valid_led_default(struct e1000_hw *hw, u16 *data)
+{
+       s32 ret_val;
+
+       ret_val = e1000_read_nvm(hw, NVM_ID_LED_SETTINGS, 1, data);
+       if (ret_val) {
+               e_dbg("NVM Read Error\n");
+               return ret_val;
+       }
+
+       if (*data == ID_LED_RESERVED_0000 || *data == ID_LED_RESERVED_FFFF)
+               *data = ID_LED_DEFAULT;
+
+       return 0;
+}
+
+/**
+ *  e1000e_id_led_init_generic -
+ *  @hw: pointer to the HW structure
+ *
+ **/
+s32 e1000e_id_led_init_generic(struct e1000_hw *hw)
+{
+       struct e1000_mac_info *mac = &hw->mac;
+       s32 ret_val;
+       const u32 ledctl_mask = 0x000000FF;
+       const u32 ledctl_on = E1000_LEDCTL_MODE_LED_ON;
+       const u32 ledctl_off = E1000_LEDCTL_MODE_LED_OFF;
+       u16 data, i, temp;
+       const u16 led_mask = 0x0F;
+
+       ret_val = hw->nvm.ops.valid_led_default(hw, &data);
+       if (ret_val)
+               return ret_val;
+
+       mac->ledctl_default = er32(LEDCTL);
+       mac->ledctl_mode1 = mac->ledctl_default;
+       mac->ledctl_mode2 = mac->ledctl_default;
+
+       for (i = 0; i < 4; i++) {
+               temp = (data >> (i << 2)) & led_mask;
+               switch (temp) {
+               case ID_LED_ON1_DEF2:
+               case ID_LED_ON1_ON2:
+               case ID_LED_ON1_OFF2:
+                       mac->ledctl_mode1 &= ~(ledctl_mask << (i << 3));
+                       mac->ledctl_mode1 |= ledctl_on << (i << 3);
+                       break;
+               case ID_LED_OFF1_DEF2:
+               case ID_LED_OFF1_ON2:
+               case ID_LED_OFF1_OFF2:
+                       mac->ledctl_mode1 &= ~(ledctl_mask << (i << 3));
+                       mac->ledctl_mode1 |= ledctl_off << (i << 3);
+                       break;
+               default:
+                       /* Do nothing */
+                       break;
+               }
+               switch (temp) {
+               case ID_LED_DEF1_ON2:
+               case ID_LED_ON1_ON2:
+               case ID_LED_OFF1_ON2:
+                       mac->ledctl_mode2 &= ~(ledctl_mask << (i << 3));
+                       mac->ledctl_mode2 |= ledctl_on << (i << 3);
+                       break;
+               case ID_LED_DEF1_OFF2:
+               case ID_LED_ON1_OFF2:
+               case ID_LED_OFF1_OFF2:
+                       mac->ledctl_mode2 &= ~(ledctl_mask << (i << 3));
+                       mac->ledctl_mode2 |= ledctl_off << (i << 3);
+                       break;
+               default:
+                       /* Do nothing */
+                       break;
+               }
+       }
+
+       return 0;
+}
+
+/**
+ *  e1000e_setup_led_generic - Configures SW controllable LED
+ *  @hw: pointer to the HW structure
+ *
+ *  This prepares the SW controllable LED for use and saves the current state
+ *  of the LED so it can be later restored.
+ **/
+s32 e1000e_setup_led_generic(struct e1000_hw *hw)
+{
+       u32 ledctl;
+
+       if (hw->mac.ops.setup_led != e1000e_setup_led_generic)
+               return -E1000_ERR_CONFIG;
+
+       if (hw->phy.media_type == e1000_media_type_fiber) {
+               ledctl = er32(LEDCTL);
+               hw->mac.ledctl_default = ledctl;
+               /* Turn off LED0 */
+               ledctl &= ~(E1000_LEDCTL_LED0_IVRT | E1000_LEDCTL_LED0_BLINK |
+                           E1000_LEDCTL_LED0_MODE_MASK);
+               ledctl |= (E1000_LEDCTL_MODE_LED_OFF <<
+                          E1000_LEDCTL_LED0_MODE_SHIFT);
+               ew32(LEDCTL, ledctl);
+       } else if (hw->phy.media_type == e1000_media_type_copper) {
+               ew32(LEDCTL, hw->mac.ledctl_mode1);
+       }
+
+       return 0;
+}
+
+/**
+ *  e1000e_cleanup_led_generic - Set LED config to default operation
+ *  @hw: pointer to the HW structure
+ *
+ *  Remove the current LED configuration and set the LED configuration
+ *  to the default value, saved from the EEPROM.
+ **/
+s32 e1000e_cleanup_led_generic(struct e1000_hw *hw)
+{
+       ew32(LEDCTL, hw->mac.ledctl_default);
+       return 0;
+}
+
+/**
+ *  e1000e_blink_led_generic - Blink LED
+ *  @hw: pointer to the HW structure
+ *
+ *  Blink the LEDs which are set to be on.
+ **/
+s32 e1000e_blink_led_generic(struct e1000_hw *hw)
+{
+       u32 ledctl_blink = 0;
+       u32 i;
+
+       if (hw->phy.media_type == e1000_media_type_fiber) {
+               /* always blink LED0 for PCI-E fiber */
+               ledctl_blink = E1000_LEDCTL_LED0_BLINK |
+                   (E1000_LEDCTL_MODE_LED_ON << E1000_LEDCTL_LED0_MODE_SHIFT);
+       } else {
+               /*
+                * set the blink bit for each LED that's "on" (0x0E)
+                * in ledctl_mode2
+                */
+               ledctl_blink = hw->mac.ledctl_mode2;
+               for (i = 0; i < 4; i++)
+                       if (((hw->mac.ledctl_mode2 >> (i * 8)) & 0xFF) ==
+                           E1000_LEDCTL_MODE_LED_ON)
+                               ledctl_blink |= (E1000_LEDCTL_LED0_BLINK <<
+                                                (i * 8));
+       }
+
+       ew32(LEDCTL, ledctl_blink);
+
+       return 0;
+}
+
+/**
+ *  e1000e_led_on_generic - Turn LED on
+ *  @hw: pointer to the HW structure
+ *
+ *  Turn LED on.
+ **/
+s32 e1000e_led_on_generic(struct e1000_hw *hw)
+{
+       u32 ctrl;
+
+       switch (hw->phy.media_type) {
+       case e1000_media_type_fiber:
+               ctrl = er32(CTRL);
+               ctrl &= ~E1000_CTRL_SWDPIN0;
+               ctrl |= E1000_CTRL_SWDPIO0;
+               ew32(CTRL, ctrl);
+               break;
+       case e1000_media_type_copper:
+               ew32(LEDCTL, hw->mac.ledctl_mode2);
+               break;
+       default:
+               break;
+       }
+
+       return 0;
+}
+
+/**
+ *  e1000e_led_off_generic - Turn LED off
+ *  @hw: pointer to the HW structure
+ *
+ *  Turn LED off.
+ **/
+s32 e1000e_led_off_generic(struct e1000_hw *hw)
+{
+       u32 ctrl;
+
+       switch (hw->phy.media_type) {
+       case e1000_media_type_fiber:
+               ctrl = er32(CTRL);
+               ctrl |= E1000_CTRL_SWDPIN0;
+               ctrl |= E1000_CTRL_SWDPIO0;
+               ew32(CTRL, ctrl);
+               break;
+       case e1000_media_type_copper:
+               ew32(LEDCTL, hw->mac.ledctl_mode1);
+               break;
+       default:
+               break;
+       }
+
+       return 0;
+}
+
+/**
+ *  e1000e_set_pcie_no_snoop - Set PCI-express capabilities
+ *  @hw: pointer to the HW structure
+ *  @no_snoop: bitmap of snoop events
+ *
+ *  Set the PCI-express register to snoop for events enabled in 'no_snoop'.
+ **/
+void e1000e_set_pcie_no_snoop(struct e1000_hw *hw, u32 no_snoop)
+{
+       u32 gcr;
+
+       if (no_snoop) {
+               gcr = er32(GCR);
+               gcr &= ~(PCIE_NO_SNOOP_ALL);
+               gcr |= no_snoop;
+               ew32(GCR, gcr);
+       }
+}
+
+/**
+ *  e1000e_disable_pcie_master - Disables PCI-express master access
+ *  @hw: pointer to the HW structure
+ *
+ *  Returns 0 if successful, else returns -10
+ *  (-E1000_ERR_MASTER_REQUESTS_PENDING) if master disable bit has not caused
+ *  the master requests to be disabled.
+ *
+ *  Disables PCI-Express master access and verifies there are no pending
+ *  requests.
+ **/
+s32 e1000e_disable_pcie_master(struct e1000_hw *hw)
+{
+       u32 ctrl;
+       s32 timeout = MASTER_DISABLE_TIMEOUT;
+
+       ctrl = er32(CTRL);
+       ctrl |= E1000_CTRL_GIO_MASTER_DISABLE;
+       ew32(CTRL, ctrl);
+
+       while (timeout) {
+               if (!(er32(STATUS) & E1000_STATUS_GIO_MASTER_ENABLE))
+                       break;
+               udelay(100);
+               timeout--;
+       }
+
+       if (!timeout) {
+               e_dbg("Master requests are pending.\n");
+               return -E1000_ERR_MASTER_REQUESTS_PENDING;
+       }
+
+       return 0;
+}
+
+/**
+ *  e1000e_reset_adaptive - Reset Adaptive Interframe Spacing
+ *  @hw: pointer to the HW structure
+ *
+ *  Reset the Adaptive Interframe Spacing throttle to default values.
+ **/
+void e1000e_reset_adaptive(struct e1000_hw *hw)
+{
+       struct e1000_mac_info *mac = &hw->mac;
+
+       if (!mac->adaptive_ifs) {
+               e_dbg("Not in Adaptive IFS mode!\n");
+               return;
+       }
+
+       mac->current_ifs_val = 0;
+       mac->ifs_min_val = IFS_MIN;
+       mac->ifs_max_val = IFS_MAX;
+       mac->ifs_step_size = IFS_STEP;
+       mac->ifs_ratio = IFS_RATIO;
+
+       mac->in_ifs_mode = false;
+       ew32(AIT, 0);
+}
+
+/**
+ *  e1000e_update_adaptive - Update Adaptive Interframe Spacing
+ *  @hw: pointer to the HW structure
+ *
+ *  Update the Adaptive Interframe Spacing Throttle value based on the
+ *  time between transmitted packets and time between collisions.
+ **/
+void e1000e_update_adaptive(struct e1000_hw *hw)
+{
+       struct e1000_mac_info *mac = &hw->mac;
+
+       if (!mac->adaptive_ifs) {
+               e_dbg("Not in Adaptive IFS mode!\n");
+               return;
+       }
+
+       if ((mac->collision_delta * mac->ifs_ratio) > mac->tx_packet_delta) {
+               if (mac->tx_packet_delta > MIN_NUM_XMITS) {
+                       mac->in_ifs_mode = true;
+                       if (mac->current_ifs_val < mac->ifs_max_val) {
+                               if (!mac->current_ifs_val)
+                                       mac->current_ifs_val = mac->ifs_min_val;
+                               else
+                                       mac->current_ifs_val +=
+                                           mac->ifs_step_size;
+                               ew32(AIT, mac->current_ifs_val);
+                       }
+               }
+       } else {
+               if (mac->in_ifs_mode &&
+                   (mac->tx_packet_delta <= MIN_NUM_XMITS)) {
+                       mac->current_ifs_val = 0;
+                       mac->in_ifs_mode = false;
+                       ew32(AIT, 0);
+               }
+       }
+}
diff --git a/drivers/net/ethernet/intel/e1000e/manage.c b/drivers/net/ethernet/intel/e1000e/manage.c
new file mode 100644 (file)
index 0000000..473f8e7
--- /dev/null
@@ -0,0 +1,367 @@
+/*******************************************************************************
+
+  Intel PRO/1000 Linux driver
+  Copyright(c) 1999 - 2012 Intel Corporation.
+
+  This program is free software; you can redistribute it and/or modify it
+  under the terms and conditions of the GNU General Public License,
+  version 2, as published by the Free Software Foundation.
+
+  This program is distributed in the hope it will be useful, but WITHOUT
+  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+  more details.
+
+  You should have received a copy of the GNU General Public License along with
+  this program; if not, write to the Free Software Foundation, Inc.,
+  51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
+
+  The full GNU General Public License is included in this distribution in
+  the file called "COPYING".
+
+  Contact Information:
+  Linux NICS <linux.nics@intel.com>
+  e1000-devel Mailing List <e1000-devel@lists.sourceforge.net>
+  Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
+
+*******************************************************************************/
+
+#include "e1000.h"
+
+enum e1000_mng_mode {
+       e1000_mng_mode_none = 0,
+       e1000_mng_mode_asf,
+       e1000_mng_mode_pt,
+       e1000_mng_mode_ipmi,
+       e1000_mng_mode_host_if_only
+};
+
+#define E1000_FACTPS_MNGCG             0x20000000
+
+/* Intel(R) Active Management Technology signature */
+#define E1000_IAMT_SIGNATURE           0x544D4149
+
+/**
+ *  e1000_calculate_checksum - Calculate checksum for buffer
+ *  @buffer: pointer to EEPROM
+ *  @length: size of EEPROM to calculate a checksum for
+ *
+ *  Calculates the checksum for some buffer on a specified length.  The
+ *  checksum calculated is returned.
+ **/
+static u8 e1000_calculate_checksum(u8 *buffer, u32 length)
+{
+       u32 i;
+       u8 sum = 0;
+
+       if (!buffer)
+               return 0;
+
+       for (i = 0; i < length; i++)
+               sum += buffer[i];
+
+       return (u8)(0 - sum);
+}
+
+/**
+ *  e1000_mng_enable_host_if - Checks host interface is enabled
+ *  @hw: pointer to the HW structure
+ *
+ *  Returns E1000_success upon success, else E1000_ERR_HOST_INTERFACE_COMMAND
+ *
+ *  This function checks whether the HOST IF is enabled for command operation
+ *  and also checks whether the previous command is completed.  It busy waits
+ *  in case of previous command is not completed.
+ **/
+static s32 e1000_mng_enable_host_if(struct e1000_hw *hw)
+{
+       u32 hicr;
+       u8 i;
+
+       if (!hw->mac.arc_subsystem_valid) {
+               e_dbg("ARC subsystem not valid.\n");
+               return -E1000_ERR_HOST_INTERFACE_COMMAND;
+       }
+
+       /* Check that the host interface is enabled. */
+       hicr = er32(HICR);
+       if ((hicr & E1000_HICR_EN) == 0) {
+               e_dbg("E1000_HOST_EN bit disabled.\n");
+               return -E1000_ERR_HOST_INTERFACE_COMMAND;
+       }
+       /* check the previous command is completed */
+       for (i = 0; i < E1000_MNG_DHCP_COMMAND_TIMEOUT; i++) {
+               hicr = er32(HICR);
+               if (!(hicr & E1000_HICR_C))
+                       break;
+               mdelay(1);
+       }
+
+       if (i == E1000_MNG_DHCP_COMMAND_TIMEOUT) {
+               e_dbg("Previous command timeout failed .\n");
+               return -E1000_ERR_HOST_INTERFACE_COMMAND;
+       }
+
+       return 0;
+}
+
+/**
+ *  e1000e_check_mng_mode_generic - Generic check management mode
+ *  @hw: pointer to the HW structure
+ *
+ *  Reads the firmware semaphore register and returns true (>0) if
+ *  manageability is enabled, else false (0).
+ **/
+bool e1000e_check_mng_mode_generic(struct e1000_hw *hw)
+{
+       u32 fwsm = er32(FWSM);
+
+       return (fwsm & E1000_FWSM_MODE_MASK) ==
+           (E1000_MNG_IAMT_MODE << E1000_FWSM_MODE_SHIFT);
+}
+
+/**
+ *  e1000e_enable_tx_pkt_filtering - Enable packet filtering on Tx
+ *  @hw: pointer to the HW structure
+ *
+ *  Enables packet filtering on transmit packets if manageability is enabled
+ *  and host interface is enabled.
+ **/
+bool e1000e_enable_tx_pkt_filtering(struct e1000_hw *hw)
+{
+       struct e1000_host_mng_dhcp_cookie *hdr = &hw->mng_cookie;
+       u32 *buffer = (u32 *)&hw->mng_cookie;
+       u32 offset;
+       s32 ret_val, hdr_csum, csum;
+       u8 i, len;
+
+       hw->mac.tx_pkt_filtering = true;
+
+       /* No manageability, no filtering */
+       if (!hw->mac.ops.check_mng_mode(hw)) {
+               hw->mac.tx_pkt_filtering = false;
+               return hw->mac.tx_pkt_filtering;
+       }
+
+       /*
+        * If we can't read from the host interface for whatever
+        * reason, disable filtering.
+        */
+       ret_val = e1000_mng_enable_host_if(hw);
+       if (ret_val) {
+               hw->mac.tx_pkt_filtering = false;
+               return hw->mac.tx_pkt_filtering;
+       }
+
+       /* Read in the header.  Length and offset are in dwords. */
+       len = E1000_MNG_DHCP_COOKIE_LENGTH >> 2;
+       offset = E1000_MNG_DHCP_COOKIE_OFFSET >> 2;
+       for (i = 0; i < len; i++)
+               *(buffer + i) = E1000_READ_REG_ARRAY(hw, E1000_HOST_IF,
+                                                    offset + i);
+       hdr_csum = hdr->checksum;
+       hdr->checksum = 0;
+       csum = e1000_calculate_checksum((u8 *)hdr,
+                                       E1000_MNG_DHCP_COOKIE_LENGTH);
+       /*
+        * If either the checksums or signature don't match, then
+        * the cookie area isn't considered valid, in which case we
+        * take the safe route of assuming Tx filtering is enabled.
+        */
+       if ((hdr_csum != csum) || (hdr->signature != E1000_IAMT_SIGNATURE)) {
+               hw->mac.tx_pkt_filtering = true;
+               return hw->mac.tx_pkt_filtering;
+       }
+
+       /* Cookie area is valid, make the final check for filtering. */
+       if (!(hdr->status & E1000_MNG_DHCP_COOKIE_STATUS_PARSING))
+               hw->mac.tx_pkt_filtering = false;
+
+       return hw->mac.tx_pkt_filtering;
+}
+
+/**
+ *  e1000_mng_write_cmd_header - Writes manageability command header
+ *  @hw: pointer to the HW structure
+ *  @hdr: pointer to the host interface command header
+ *
+ *  Writes the command header after does the checksum calculation.
+ **/
+static s32 e1000_mng_write_cmd_header(struct e1000_hw *hw,
+                                     struct e1000_host_mng_command_header *hdr)
+{
+       u16 i, length = sizeof(struct e1000_host_mng_command_header);
+
+       /* Write the whole command header structure with new checksum. */
+
+       hdr->checksum = e1000_calculate_checksum((u8 *)hdr, length);
+
+       length >>= 2;
+       /* Write the relevant command block into the ram area. */
+       for (i = 0; i < length; i++) {
+               E1000_WRITE_REG_ARRAY(hw, E1000_HOST_IF, i, *((u32 *)hdr + i));
+               e1e_flush();
+       }
+
+       return 0;
+}
+
+/**
+ *  e1000_mng_host_if_write - Write to the manageability host interface
+ *  @hw: pointer to the HW structure
+ *  @buffer: pointer to the host interface buffer
+ *  @length: size of the buffer
+ *  @offset: location in the buffer to write to
+ *  @sum: sum of the data (not checksum)
+ *
+ *  This function writes the buffer content at the offset given on the host if.
+ *  It also does alignment considerations to do the writes in most efficient
+ *  way.  Also fills up the sum of the buffer in *buffer parameter.
+ **/
+static s32 e1000_mng_host_if_write(struct e1000_hw *hw, u8 *buffer,
+                                  u16 length, u16 offset, u8 *sum)
+{
+       u8 *tmp;
+       u8 *bufptr = buffer;
+       u32 data = 0;
+       u16 remaining, i, j, prev_bytes;
+
+       /* sum = only sum of the data and it is not checksum */
+
+       if (length == 0 || offset + length > E1000_HI_MAX_MNG_DATA_LENGTH)
+               return -E1000_ERR_PARAM;
+
+       tmp = (u8 *)&data;
+       prev_bytes = offset & 0x3;
+       offset >>= 2;
+
+       if (prev_bytes) {
+               data = E1000_READ_REG_ARRAY(hw, E1000_HOST_IF, offset);
+               for (j = prev_bytes; j < sizeof(u32); j++) {
+                       *(tmp + j) = *bufptr++;
+                       *sum += *(tmp + j);
+               }
+               E1000_WRITE_REG_ARRAY(hw, E1000_HOST_IF, offset, data);
+               length -= j - prev_bytes;
+               offset++;
+       }
+
+       remaining = length & 0x3;
+       length -= remaining;
+
+       /* Calculate length in DWORDs */
+       length >>= 2;
+
+       /*
+        * The device driver writes the relevant command block into the
+        * ram area.
+        */
+       for (i = 0; i < length; i++) {
+               for (j = 0; j < sizeof(u32); j++) {
+                       *(tmp + j) = *bufptr++;
+                       *sum += *(tmp + j);
+               }
+
+               E1000_WRITE_REG_ARRAY(hw, E1000_HOST_IF, offset + i, data);
+       }
+       if (remaining) {
+               for (j = 0; j < sizeof(u32); j++) {
+                       if (j < remaining)
+                               *(tmp + j) = *bufptr++;
+                       else
+                               *(tmp + j) = 0;
+
+                       *sum += *(tmp + j);
+               }
+               E1000_WRITE_REG_ARRAY(hw, E1000_HOST_IF, offset + i, data);
+       }
+
+       return 0;
+}
+
+/**
+ *  e1000e_mng_write_dhcp_info - Writes DHCP info to host interface
+ *  @hw: pointer to the HW structure
+ *  @buffer: pointer to the host interface
+ *  @length: size of the buffer
+ *
+ *  Writes the DHCP information to the host interface.
+ **/
+s32 e1000e_mng_write_dhcp_info(struct e1000_hw *hw, u8 *buffer, u16 length)
+{
+       struct e1000_host_mng_command_header hdr;
+       s32 ret_val;
+       u32 hicr;
+
+       hdr.command_id = E1000_MNG_DHCP_TX_PAYLOAD_CMD;
+       hdr.command_length = length;
+       hdr.reserved1 = 0;
+       hdr.reserved2 = 0;
+       hdr.checksum = 0;
+
+       /* Enable the host interface */
+       ret_val = e1000_mng_enable_host_if(hw);
+       if (ret_val)
+               return ret_val;
+
+       /* Populate the host interface with the contents of "buffer". */
+       ret_val = e1000_mng_host_if_write(hw, buffer, length,
+                                         sizeof(hdr), &(hdr.checksum));
+       if (ret_val)
+               return ret_val;
+
+       /* Write the manageability command header */
+       ret_val = e1000_mng_write_cmd_header(hw, &hdr);
+       if (ret_val)
+               return ret_val;
+
+       /* Tell the ARC a new command is pending. */
+       hicr = er32(HICR);
+       ew32(HICR, hicr | E1000_HICR_C);
+
+       return 0;
+}
+
+/**
+ *  e1000e_enable_mng_pass_thru - Check if management passthrough is needed
+ *  @hw: pointer to the HW structure
+ *
+ *  Verifies the hardware needs to leave interface enabled so that frames can
+ *  be directed to and from the management interface.
+ **/
+bool e1000e_enable_mng_pass_thru(struct e1000_hw *hw)
+{
+       u32 manc;
+       u32 fwsm, factps;
+
+       manc = er32(MANC);
+
+       if (!(manc & E1000_MANC_RCV_TCO_EN))
+               return false;
+
+       if (hw->mac.has_fwsm) {
+               fwsm = er32(FWSM);
+               factps = er32(FACTPS);
+
+               if (!(factps & E1000_FACTPS_MNGCG) &&
+                   ((fwsm & E1000_FWSM_MODE_MASK) ==
+                    (e1000_mng_mode_pt << E1000_FWSM_MODE_SHIFT)))
+                       return true;
+       } else if ((hw->mac.type == e1000_82574) ||
+                  (hw->mac.type == e1000_82583)) {
+               u16 data;
+
+               factps = er32(FACTPS);
+               e1000_read_nvm(hw, NVM_INIT_CONTROL2_REG, 1, &data);
+
+               if (!(factps & E1000_FACTPS_MNGCG) &&
+                   ((data & E1000_NVM_INIT_CTRL2_MNGM) ==
+                    (e1000_mng_mode_pt << 13)))
+                       return true;
+       } else if ((manc & E1000_MANC_SMBUS_EN) &&
+                  !(manc & E1000_MANC_ASF_EN)) {
+               return true;
+       }
+
+       return false;
+}
index 3911401..a9a4ea2 100644 (file)
@@ -1,7 +1,7 @@
 /*******************************************************************************
 
   Intel PRO/1000 Linux driver
-  Copyright(c) 1999 - 2011 Intel Corporation.
+  Copyright(c) 1999 - 2012 Intel Corporation.
 
   This program is free software; you can redistribute it and/or modify it
   under the terms and conditions of the GNU General Public License,
@@ -56,7 +56,7 @@
 
 #define DRV_EXTRAVERSION "-k"
 
-#define DRV_VERSION "1.5.1" DRV_EXTRAVERSION
+#define DRV_VERSION "1.9.5" DRV_EXTRAVERSION
 char e1000e_driver_name[] = "e1000e";
 const char e1000e_driver_version[] = DRV_VERSION;
 
@@ -137,7 +137,7 @@ static const struct e1000_reg_info e1000_reg_info_tbl[] = {
        {E1000_TDFPC, "TDFPC"},
 
        /* List Terminator */
-       {}
+       {0, NULL}
 };
 
 /*
@@ -183,18 +183,18 @@ static void e1000e_dump(struct e1000_adapter *adapter)
        struct e1000_ring *tx_ring = adapter->tx_ring;
        struct e1000_tx_desc *tx_desc;
        struct my_u0 {
-               u64 a;
-               u64 b;
+               __le64 a;
+               __le64 b;
        } *u0;
        struct e1000_buffer *buffer_info;
        struct e1000_ring *rx_ring = adapter->rx_ring;
        union e1000_rx_desc_packet_split *rx_desc_ps;
        union e1000_rx_desc_extended *rx_desc;
        struct my_u1 {
-               u64 a;
-               u64 b;
-               u64 c;
-               u64 d;
+               __le64 a;
+               __le64 b;
+               __le64 c;
+               __le64 d;
        } *u1;
        u32 staterr;
        int i = 0;
@@ -221,7 +221,7 @@ static void e1000e_dump(struct e1000_adapter *adapter)
 
        /* Print Tx Ring Summary */
        if (!netdev || !netif_running(netdev))
-               goto exit;
+               return;
 
        dev_info(&adapter->pdev->dev, "Tx Ring Summary\n");
        pr_info("Queue [NTU] [NTC] [bi(ntc)->dma  ] leng ntw timestamp\n");
@@ -308,7 +308,7 @@ rx_ring_summary:
 
        /* Print Rx Ring */
        if (!netif_msg_rx_status(adapter))
-               goto exit;
+               return;
 
        dev_info(&adapter->pdev->dev, "Rx Ring Dump\n");
        switch (adapter->rx_ps_pages) {
@@ -449,9 +449,6 @@ rx_ring_summary:
                        }
                }
        }
-
-exit:
-       return;
 }
 
 /**
@@ -487,22 +484,27 @@ static void e1000_receive_skb(struct e1000_adapter *adapter,
 
 /**
  * e1000_rx_checksum - Receive Checksum Offload
- * @adapter:     board private structure
- * @status_err:  receive descriptor status and error fields
- * @csum:      receive descriptor csum field
- * @sk_buff:     socket buffer with received data
+ * @adapter: board private structure
+ * @status_err: receive descriptor status and error fields
+ * @csum: receive descriptor csum field
+ * @sk_buff: socket buffer with received data
  **/
 static void e1000_rx_checksum(struct e1000_adapter *adapter, u32 status_err,
-                             u32 csum, struct sk_buff *skb)
+                             __le16 csum, struct sk_buff *skb)
 {
        u16 status = (u16)status_err;
        u8 errors = (u8)(status_err >> 24);
 
        skb_checksum_none_assert(skb);
 
+       /* Rx checksum disabled */
+       if (!(adapter->netdev->features & NETIF_F_RXCSUM))
+               return;
+
        /* Ignore Checksum bit is set */
        if (status & E1000_RXD_STAT_IXSM)
                return;
+
        /* TCP/UDP checksum error bit is set */
        if (errors & E1000_RXD_ERR_TCPE) {
                /* let the stack verify checksum errors */
@@ -524,7 +526,7 @@ static void e1000_rx_checksum(struct e1000_adapter *adapter, u32 status_err,
                 * Hardware complements the payload checksum, so we undo it
                 * and then put the value in host order for further stack use.
                 */
-               __sum16 sum = (__force __sum16)htons(csum);
+               __sum16 sum = (__force __sum16)swab16((__force u16)csum);
                skb->csum = csum_unfold(~sum);
                skb->ip_summed = CHECKSUM_COMPLETE;
        }
@@ -545,7 +547,7 @@ static void e1000_rx_checksum(struct e1000_adapter *adapter, u32 status_err,
  * which has bit 24 set while ME is accessing Host CSR registers, wait
  * if it is set and try again a number of times.
  **/
-static inline s32 e1000e_update_tail_wa(struct e1000_hw *hw, u8 __iomem * tail,
+static inline s32 e1000e_update_tail_wa(struct e1000_hw *hw, void __iomem *tail,
                                        unsigned int i)
 {
        unsigned int j = 0;
@@ -562,12 +564,12 @@ static inline s32 e1000e_update_tail_wa(struct e1000_hw *hw, u8 __iomem * tail,
        return 0;
 }
 
-static void e1000e_update_rdt_wa(struct e1000_adapter *adapter, unsigned int i)
+static void e1000e_update_rdt_wa(struct e1000_ring *rx_ring, unsigned int i)
 {
-       u8 __iomem *tail = (adapter->hw.hw_addr + adapter->rx_ring->tail);
+       struct e1000_adapter *adapter = rx_ring->adapter;
        struct e1000_hw *hw = &adapter->hw;
 
-       if (e1000e_update_tail_wa(hw, tail, i)) {
+       if (e1000e_update_tail_wa(hw, rx_ring->tail, i)) {
                u32 rctl = er32(RCTL);
                ew32(RCTL, rctl & ~E1000_RCTL_EN);
                e_err("ME firmware caused invalid RDT - resetting\n");
@@ -575,12 +577,12 @@ static void e1000e_update_rdt_wa(struct e1000_adapter *adapter, unsigned int i)
        }
 }
 
-static void e1000e_update_tdt_wa(struct e1000_adapter *adapter, unsigned int i)
+static void e1000e_update_tdt_wa(struct e1000_ring *tx_ring, unsigned int i)
 {
-       u8 __iomem *tail = (adapter->hw.hw_addr + adapter->tx_ring->tail);
+       struct e1000_adapter *adapter = tx_ring->adapter;
        struct e1000_hw *hw = &adapter->hw;
 
-       if (e1000e_update_tail_wa(hw, tail, i)) {
+       if (e1000e_update_tail_wa(hw, tx_ring->tail, i)) {
                u32 tctl = er32(TCTL);
                ew32(TCTL, tctl & ~E1000_TCTL_EN);
                e_err("ME firmware caused invalid TDT - resetting\n");
@@ -590,14 +592,14 @@ static void e1000e_update_tdt_wa(struct e1000_adapter *adapter, unsigned int i)
 
 /**
  * e1000_alloc_rx_buffers - Replace used receive buffers
- * @adapter: address of board private structure
+ * @rx_ring: Rx descriptor ring
  **/
-static void e1000_alloc_rx_buffers(struct e1000_adapter *adapter,
+static void e1000_alloc_rx_buffers(struct e1000_ring *rx_ring,
                                   int cleaned_count, gfp_t gfp)
 {
+       struct e1000_adapter *adapter = rx_ring->adapter;
        struct net_device *netdev = adapter->netdev;
        struct pci_dev *pdev = adapter->pdev;
-       struct e1000_ring *rx_ring = adapter->rx_ring;
        union e1000_rx_desc_extended *rx_desc;
        struct e1000_buffer *buffer_info;
        struct sk_buff *skb;
@@ -644,9 +646,9 @@ map_skb:
                         */
                        wmb();
                        if (adapter->flags2 & FLAG2_PCIM2PCI_ARBITER_WA)
-                               e1000e_update_rdt_wa(adapter, i);
+                               e1000e_update_rdt_wa(rx_ring, i);
                        else
-                               writel(i, adapter->hw.hw_addr + rx_ring->tail);
+                               writel(i, rx_ring->tail);
                }
                i++;
                if (i == rx_ring->count)
@@ -659,15 +661,15 @@ map_skb:
 
 /**
  * e1000_alloc_rx_buffers_ps - Replace used receive buffers; packet split
- * @adapter: address of board private structure
+ * @rx_ring: Rx descriptor ring
  **/
-static void e1000_alloc_rx_buffers_ps(struct e1000_adapter *adapter,
+static void e1000_alloc_rx_buffers_ps(struct e1000_ring *rx_ring,
                                      int cleaned_count, gfp_t gfp)
 {
+       struct e1000_adapter *adapter = rx_ring->adapter;
        struct net_device *netdev = adapter->netdev;
        struct pci_dev *pdev = adapter->pdev;
        union e1000_rx_desc_packet_split *rx_desc;
-       struct e1000_ring *rx_ring = adapter->rx_ring;
        struct e1000_buffer *buffer_info;
        struct e1000_ps_page *ps_page;
        struct sk_buff *skb;
@@ -747,10 +749,9 @@ static void e1000_alloc_rx_buffers_ps(struct e1000_adapter *adapter,
                         */
                        wmb();
                        if (adapter->flags2 & FLAG2_PCIM2PCI_ARBITER_WA)
-                               e1000e_update_rdt_wa(adapter, i << 1);
+                               e1000e_update_rdt_wa(rx_ring, i << 1);
                        else
-                               writel(i << 1,
-                                      adapter->hw.hw_addr + rx_ring->tail);
+                               writel(i << 1, rx_ring->tail);
                }
 
                i++;
@@ -765,17 +766,17 @@ no_buffers:
 
 /**
  * e1000_alloc_jumbo_rx_buffers - Replace used jumbo receive buffers
- * @adapter: address of board private structure
+ * @rx_ring: Rx descriptor ring
  * @cleaned_count: number of buffers to allocate this pass
  **/
 
-static void e1000_alloc_jumbo_rx_buffers(struct e1000_adapter *adapter,
+static void e1000_alloc_jumbo_rx_buffers(struct e1000_ring *rx_ring,
                                         int cleaned_count, gfp_t gfp)
 {
+       struct e1000_adapter *adapter = rx_ring->adapter;
        struct net_device *netdev = adapter->netdev;
        struct pci_dev *pdev = adapter->pdev;
        union e1000_rx_desc_extended *rx_desc;
-       struct e1000_ring *rx_ring = adapter->rx_ring;
        struct e1000_buffer *buffer_info;
        struct sk_buff *skb;
        unsigned int i;
@@ -834,26 +835,33 @@ check_page:
                 * such as IA-64). */
                wmb();
                if (adapter->flags2 & FLAG2_PCIM2PCI_ARBITER_WA)
-                       e1000e_update_rdt_wa(adapter, i);
+                       e1000e_update_rdt_wa(rx_ring, i);
                else
-                       writel(i, adapter->hw.hw_addr + rx_ring->tail);
+                       writel(i, rx_ring->tail);
        }
 }
 
+static inline void e1000_rx_hash(struct net_device *netdev, __le32 rss,
+                                struct sk_buff *skb)
+{
+       if (netdev->features & NETIF_F_RXHASH)
+               skb->rxhash = le32_to_cpu(rss);
+}
+
 /**
- * e1000_clean_rx_irq - Send received data up the network stack; legacy
- * @adapter: board private structure
+ * e1000_clean_rx_irq - Send received data up the network stack
+ * @rx_ring: Rx descriptor ring
  *
  * the return value indicates whether actual cleaning was done, there
  * is no guarantee that everything was cleaned
  **/
-static bool e1000_clean_rx_irq(struct e1000_adapter *adapter,
-                              int *work_done, int work_to_do)
+static bool e1000_clean_rx_irq(struct e1000_ring *rx_ring, int *work_done,
+                              int work_to_do)
 {
+       struct e1000_adapter *adapter = rx_ring->adapter;
        struct net_device *netdev = adapter->netdev;
        struct pci_dev *pdev = adapter->pdev;
        struct e1000_hw *hw = &adapter->hw;
-       struct e1000_ring *rx_ring = adapter->rx_ring;
        union e1000_rx_desc_extended *rx_desc, *next_rxd;
        struct e1000_buffer *buffer_info, *next_buffer;
        u32 length, staterr;
@@ -918,15 +926,24 @@ static bool e1000_clean_rx_irq(struct e1000_adapter *adapter,
                        goto next_desc;
                }
 
-               if (staterr & E1000_RXDEXT_ERR_FRAME_ERR_MASK) {
+               if (unlikely((staterr & E1000_RXDEXT_ERR_FRAME_ERR_MASK) &&
+                            !(netdev->features & NETIF_F_RXALL))) {
                        /* recycle */
                        buffer_info->skb = skb;
                        goto next_desc;
                }
 
                /* adjust length to remove Ethernet CRC */
-               if (!(adapter->flags2 & FLAG2_CRC_STRIPPING))
-                       length -= 4;
+               if (!(adapter->flags2 & FLAG2_CRC_STRIPPING)) {
+                       /* If configured to store CRC, don't subtract FCS,
+                        * but keep the FCS bytes out of the total_rx_bytes
+                        * counter
+                        */
+                       if (netdev->features & NETIF_F_RXFCS)
+                               total_rx_bytes -= 4;
+                       else
+                               length -= 4;
+               }
 
                total_rx_bytes += length;
                total_rx_packets++;
@@ -957,8 +974,9 @@ static bool e1000_clean_rx_irq(struct e1000_adapter *adapter,
 
                /* Receive Checksum Offload */
                e1000_rx_checksum(adapter, staterr,
-                                 le16_to_cpu(rx_desc->wb.lower.hi_dword.
-                                             csum_ip.csum), skb);
+                                 rx_desc->wb.lower.hi_dword.csum_ip.csum, skb);
+
+               e1000_rx_hash(netdev, rx_desc->wb.lower.hi_dword.rss, skb);
 
                e1000_receive_skb(adapter, netdev, skb, staterr,
                                  rx_desc->wb.upper.vlan);
@@ -968,7 +986,7 @@ next_desc:
 
                /* return some buffers to hardware, one at a time is too slow */
                if (cleaned_count >= E1000_RX_BUFFER_WRITE) {
-                       adapter->alloc_rx_buf(adapter, cleaned_count,
+                       adapter->alloc_rx_buf(rx_ring, cleaned_count,
                                              GFP_ATOMIC);
                        cleaned_count = 0;
                }
@@ -983,16 +1001,18 @@ next_desc:
 
        cleaned_count = e1000_desc_unused(rx_ring);
        if (cleaned_count)
-               adapter->alloc_rx_buf(adapter, cleaned_count, GFP_ATOMIC);
+               adapter->alloc_rx_buf(rx_ring, cleaned_count, GFP_ATOMIC);
 
        adapter->total_rx_bytes += total_rx_bytes;
        adapter->total_rx_packets += total_rx_packets;
        return cleaned;
 }
 
-static void e1000_put_txbuf(struct e1000_adapter *adapter,
-                            struct e1000_buffer *buffer_info)
+static void e1000_put_txbuf(struct e1000_ring *tx_ring,
+                           struct e1000_buffer *buffer_info)
 {
+       struct e1000_adapter *adapter = tx_ring->adapter;
+
        if (buffer_info->dma) {
                if (buffer_info->mapped_as_page)
                        dma_unmap_page(&adapter->pdev->dev, buffer_info->dma,
@@ -1063,8 +1083,8 @@ static void e1000_print_hw_hang(struct work_struct *work)
              "PHY 1000BASE-T Status  <%x>\n"
              "PHY Extended Status    <%x>\n"
              "PCI Status             <%x>\n",
-             readl(adapter->hw.hw_addr + tx_ring->head),
-             readl(adapter->hw.hw_addr + tx_ring->tail),
+             readl(tx_ring->head),
+             readl(tx_ring->tail),
              tx_ring->next_to_use,
              tx_ring->next_to_clean,
              tx_ring->buffer_info[eop].time_stamp,
@@ -1080,16 +1100,16 @@ static void e1000_print_hw_hang(struct work_struct *work)
 
 /**
  * e1000_clean_tx_irq - Reclaim resources after transmit completes
- * @adapter: board private structure
+ * @tx_ring: Tx descriptor ring
  *
  * the return value indicates whether actual cleaning was done, there
  * is no guarantee that everything was cleaned
  **/
-static bool e1000_clean_tx_irq(struct e1000_adapter *adapter)
+static bool e1000_clean_tx_irq(struct e1000_ring *tx_ring)
 {
+       struct e1000_adapter *adapter = tx_ring->adapter;
        struct net_device *netdev = adapter->netdev;
        struct e1000_hw *hw = &adapter->hw;
-       struct e1000_ring *tx_ring = adapter->tx_ring;
        struct e1000_tx_desc *tx_desc, *eop_desc;
        struct e1000_buffer *buffer_info;
        unsigned int i, eop;
@@ -1119,7 +1139,7 @@ static bool e1000_clean_tx_irq(struct e1000_adapter *adapter)
                                }
                        }
 
-                       e1000_put_txbuf(adapter, buffer_info);
+                       e1000_put_txbuf(tx_ring, buffer_info);
                        tx_desc->upper.data = 0;
 
                        i++;
@@ -1173,19 +1193,19 @@ static bool e1000_clean_tx_irq(struct e1000_adapter *adapter)
 
 /**
  * e1000_clean_rx_irq_ps - Send received data up the network stack; packet split
- * @adapter: board private structure
+ * @rx_ring: Rx descriptor ring
  *
  * the return value indicates whether actual cleaning was done, there
  * is no guarantee that everything was cleaned
  **/
-static bool e1000_clean_rx_irq_ps(struct e1000_adapter *adapter,
-                                 int *work_done, int work_to_do)
+static bool e1000_clean_rx_irq_ps(struct e1000_ring *rx_ring, int *work_done,
+                                 int work_to_do)
 {
+       struct e1000_adapter *adapter = rx_ring->adapter;
        struct e1000_hw *hw = &adapter->hw;
        union e1000_rx_desc_packet_split *rx_desc, *next_rxd;
        struct net_device *netdev = adapter->netdev;
        struct pci_dev *pdev = adapter->pdev;
-       struct e1000_ring *rx_ring = adapter->rx_ring;
        struct e1000_buffer *buffer_info, *next_buffer;
        struct e1000_ps_page *ps_page;
        struct sk_buff *skb;
@@ -1236,7 +1256,8 @@ static bool e1000_clean_rx_irq_ps(struct e1000_adapter *adapter,
                        goto next_desc;
                }
 
-               if (staterr & E1000_RXDEXT_ERR_FRAME_ERR_MASK) {
+               if (unlikely((staterr & E1000_RXDEXT_ERR_FRAME_ERR_MASK) &&
+                            !(netdev->features & NETIF_F_RXALL))) {
                        dev_kfree_skb_irq(skb);
                        goto next_desc;
                }
@@ -1253,43 +1274,51 @@ static bool e1000_clean_rx_irq_ps(struct e1000_adapter *adapter,
                skb_put(skb, length);
 
                {
-               /*
-                * this looks ugly, but it seems compiler issues make it
-                * more efficient than reusing j
-                */
-               int l1 = le16_to_cpu(rx_desc->wb.upper.length[0]);
-
-               /*
-                * page alloc/put takes too long and effects small packet
-                * throughput, so unsplit small packets and save the alloc/put
-                * only valid in softirq (napi) context to call kmap_*
-                */
-               if (l1 && (l1 <= copybreak) &&
-                   ((length + l1) <= adapter->rx_ps_bsize0)) {
-                       u8 *vaddr;
-
-                       ps_page = &buffer_info->ps_pages[0];
+                       /*
+                        * this looks ugly, but it seems compiler issues make
+                        * it more efficient than reusing j
+                        */
+                       int l1 = le16_to_cpu(rx_desc->wb.upper.length[0]);
 
                        /*
-                        * there is no documentation about how to call
-                        * kmap_atomic, so we can't hold the mapping
-                        * very long
+                        * page alloc/put takes too long and effects small
+                        * packet throughput, so unsplit small packets and
+                        * save the alloc/put only valid in softirq (napi)
+                        * context to call kmap_*
                         */
-                       dma_sync_single_for_cpu(&pdev->dev, ps_page->dma,
-                                               PAGE_SIZE, DMA_FROM_DEVICE);
-                       vaddr = kmap_atomic(ps_page->page, KM_SKB_DATA_SOFTIRQ);
-                       memcpy(skb_tail_pointer(skb), vaddr, l1);
-                       kunmap_atomic(vaddr, KM_SKB_DATA_SOFTIRQ);
-                       dma_sync_single_for_device(&pdev->dev, ps_page->dma,
-                                                  PAGE_SIZE, DMA_FROM_DEVICE);
-
-                       /* remove the CRC */
-                       if (!(adapter->flags2 & FLAG2_CRC_STRIPPING))
-                               l1 -= 4;
-
-                       skb_put(skb, l1);
-                       goto copydone;
-               } /* if */
+                       if (l1 && (l1 <= copybreak) &&
+                           ((length + l1) <= adapter->rx_ps_bsize0)) {
+                               u8 *vaddr;
+
+                               ps_page = &buffer_info->ps_pages[0];
+
+                               /*
+                                * there is no documentation about how to call
+                                * kmap_atomic, so we can't hold the mapping
+                                * very long
+                                */
+                               dma_sync_single_for_cpu(&pdev->dev,
+                                                       ps_page->dma,
+                                                       PAGE_SIZE,
+                                                       DMA_FROM_DEVICE);
+                               vaddr = kmap_atomic(ps_page->page,
+                                                   KM_SKB_DATA_SOFTIRQ);
+                               memcpy(skb_tail_pointer(skb), vaddr, l1);
+                               kunmap_atomic(vaddr, KM_SKB_DATA_SOFTIRQ);
+                               dma_sync_single_for_device(&pdev->dev,
+                                                          ps_page->dma,
+                                                          PAGE_SIZE,
+                                                          DMA_FROM_DEVICE);
+
+                               /* remove the CRC */
+                               if (!(adapter->flags2 & FLAG2_CRC_STRIPPING)) {
+                                       if (!(netdev->features & NETIF_F_RXFCS))
+                                               l1 -= 4;
+                               }
+
+                               skb_put(skb, l1);
+                               goto copydone;
+                       } /* if */
                }
 
                for (j = 0; j < PS_PAGE_BUFFERS; j++) {
@@ -1311,15 +1340,19 @@ static bool e1000_clean_rx_irq_ps(struct e1000_adapter *adapter,
                /* strip the ethernet crc, problem is we're using pages now so
                 * this whole operation can get a little cpu intensive
                 */
-               if (!(adapter->flags2 & FLAG2_CRC_STRIPPING))
-                       pskb_trim(skb, skb->len - 4);
+               if (!(adapter->flags2 & FLAG2_CRC_STRIPPING)) {
+                       if (!(netdev->features & NETIF_F_RXFCS))
+                               pskb_trim(skb, skb->len - 4);
+               }
 
 copydone:
                total_rx_bytes += skb->len;
                total_rx_packets++;
 
-               e1000_rx_checksum(adapter, staterr, le16_to_cpu(
-                       rx_desc->wb.lower.hi_dword.csum_ip.csum), skb);
+               e1000_rx_checksum(adapter, staterr,
+                                 rx_desc->wb.lower.hi_dword.csum_ip.csum, skb);
+
+               e1000_rx_hash(netdev, rx_desc->wb.lower.hi_dword.rss, skb);
 
                if (rx_desc->wb.upper.header_status &
                           cpu_to_le16(E1000_RXDPS_HDRSTAT_HDRSP))
@@ -1334,7 +1367,7 @@ next_desc:
 
                /* return some buffers to hardware, one at a time is too slow */
                if (cleaned_count >= E1000_RX_BUFFER_WRITE) {
-                       adapter->alloc_rx_buf(adapter, cleaned_count,
+                       adapter->alloc_rx_buf(rx_ring, cleaned_count,
                                              GFP_ATOMIC);
                        cleaned_count = 0;
                }
@@ -1349,7 +1382,7 @@ next_desc:
 
        cleaned_count = e1000_desc_unused(rx_ring);
        if (cleaned_count)
-               adapter->alloc_rx_buf(adapter, cleaned_count, GFP_ATOMIC);
+               adapter->alloc_rx_buf(rx_ring, cleaned_count, GFP_ATOMIC);
 
        adapter->total_rx_bytes += total_rx_bytes;
        adapter->total_rx_packets += total_rx_packets;
@@ -1375,13 +1408,12 @@ static void e1000_consume_page(struct e1000_buffer *bi, struct sk_buff *skb,
  * the return value indicates whether actual cleaning was done, there
  * is no guarantee that everything was cleaned
  **/
-
-static bool e1000_clean_jumbo_rx_irq(struct e1000_adapter *adapter,
-                                     int *work_done, int work_to_do)
+static bool e1000_clean_jumbo_rx_irq(struct e1000_ring *rx_ring, int *work_done,
+                                    int work_to_do)
 {
+       struct e1000_adapter *adapter = rx_ring->adapter;
        struct net_device *netdev = adapter->netdev;
        struct pci_dev *pdev = adapter->pdev;
-       struct e1000_ring *rx_ring = adapter->rx_ring;
        union e1000_rx_desc_extended *rx_desc, *next_rxd;
        struct e1000_buffer *buffer_info, *next_buffer;
        u32 length, staterr;
@@ -1424,7 +1456,8 @@ static bool e1000_clean_jumbo_rx_irq(struct e1000_adapter *adapter,
 
                /* errors is only valid for DD + EOP descriptors */
                if (unlikely((staterr & E1000_RXD_STAT_EOP) &&
-                            (staterr & E1000_RXDEXT_ERR_FRAME_ERR_MASK))) {
+                            ((staterr & E1000_RXDEXT_ERR_FRAME_ERR_MASK) &&
+                             !(netdev->features & NETIF_F_RXALL)))) {
                        /* recycle both page and skb */
                        buffer_info->skb = skb;
                        /* an error means any chain goes out the window too */
@@ -1491,8 +1524,9 @@ static bool e1000_clean_jumbo_rx_irq(struct e1000_adapter *adapter,
 
                /* Receive Checksum Offload XXX recompute due to CRC strip? */
                e1000_rx_checksum(adapter, staterr,
-                                 le16_to_cpu(rx_desc->wb.lower.hi_dword.
-                                             csum_ip.csum), skb);
+                                 rx_desc->wb.lower.hi_dword.csum_ip.csum, skb);
+
+               e1000_rx_hash(netdev, rx_desc->wb.lower.hi_dword.rss, skb);
 
                /* probably a little skewed due to removing CRC */
                total_rx_bytes += skb->len;
@@ -1513,7 +1547,7 @@ next_desc:
 
                /* return some buffers to hardware, one at a time is too slow */
                if (unlikely(cleaned_count >= E1000_RX_BUFFER_WRITE)) {
-                       adapter->alloc_rx_buf(adapter, cleaned_count,
+                       adapter->alloc_rx_buf(rx_ring, cleaned_count,
                                              GFP_ATOMIC);
                        cleaned_count = 0;
                }
@@ -1528,7 +1562,7 @@ next_desc:
 
        cleaned_count = e1000_desc_unused(rx_ring);
        if (cleaned_count)
-               adapter->alloc_rx_buf(adapter, cleaned_count, GFP_ATOMIC);
+               adapter->alloc_rx_buf(rx_ring, cleaned_count, GFP_ATOMIC);
 
        adapter->total_rx_bytes += total_rx_bytes;
        adapter->total_rx_packets += total_rx_packets;
@@ -1537,11 +1571,11 @@ next_desc:
 
 /**
  * e1000_clean_rx_ring - Free Rx Buffers per Queue
- * @adapter: board private structure
+ * @rx_ring: Rx descriptor ring
  **/
-static void e1000_clean_rx_ring(struct e1000_adapter *adapter)
+static void e1000_clean_rx_ring(struct e1000_ring *rx_ring)
 {
-       struct e1000_ring *rx_ring = adapter->rx_ring;
+       struct e1000_adapter *adapter = rx_ring->adapter;
        struct e1000_buffer *buffer_info;
        struct e1000_ps_page *ps_page;
        struct pci_dev *pdev = adapter->pdev;
@@ -1601,8 +1635,8 @@ static void e1000_clean_rx_ring(struct e1000_adapter *adapter)
        rx_ring->next_to_use = 0;
        adapter->flags2 &= ~FLAG2_IS_DISCARDING;
 
-       writel(0, adapter->hw.hw_addr + rx_ring->head);
-       writel(0, adapter->hw.hw_addr + rx_ring->tail);
+       writel(0, rx_ring->head);
+       writel(0, rx_ring->tail);
 }
 
 static void e1000e_downshift_workaround(struct work_struct *work)
@@ -1633,7 +1667,7 @@ static irqreturn_t e1000_intr_msi(int irq, void *data)
         */
 
        if (icr & E1000_ICR_LSC) {
-               hw->mac.get_link_status = 1;
+               hw->mac.get_link_status = true;
                /*
                 * ICH8 workaround-- Call gig speed drop workaround on cable
                 * disconnect (LSC) before accessing any PHY registers
@@ -1699,7 +1733,7 @@ static irqreturn_t e1000_intr(int irq, void *data)
         */
 
        if (icr & E1000_ICR_LSC) {
-               hw->mac.get_link_status = 1;
+               hw->mac.get_link_status = true;
                /*
                 * ICH8 workaround-- Call gig speed drop workaround on cable
                 * disconnect (LSC) before accessing any PHY registers
@@ -1756,7 +1790,7 @@ static irqreturn_t e1000_msix_other(int irq, void *data)
        if (icr & E1000_ICR_OTHER) {
                if (!(icr & E1000_ICR_LSC))
                        goto no_link_interrupt;
-               hw->mac.get_link_status = 1;
+               hw->mac.get_link_status = true;
                /* guard against interrupt when we're going down */
                if (!test_bit(__E1000_DOWN, &adapter->state))
                        mod_timer(&adapter->watchdog_timer, jiffies + 1);
@@ -1781,7 +1815,7 @@ static irqreturn_t e1000_intr_msix_tx(int irq, void *data)
        adapter->total_tx_bytes = 0;
        adapter->total_tx_packets = 0;
 
-       if (!e1000_clean_tx_irq(adapter))
+       if (!e1000_clean_tx_irq(tx_ring))
                /* Ring was not completely cleaned, so fire another interrupt */
                ew32(ICS, tx_ring->ims_val);
 
@@ -1792,14 +1826,15 @@ static irqreturn_t e1000_intr_msix_rx(int irq, void *data)
 {
        struct net_device *netdev = data;
        struct e1000_adapter *adapter = netdev_priv(netdev);
+       struct e1000_ring *rx_ring = adapter->rx_ring;
 
        /* Write the ITR value calculated at the end of the
         * previous interrupt.
         */
-       if (adapter->rx_ring->set_itr) {
-               writel(1000000000 / (adapter->rx_ring->itr_val * 256),
-                      adapter->hw.hw_addr + adapter->rx_ring->itr_register);
-               adapter->rx_ring->set_itr = 0;
+       if (rx_ring->set_itr) {
+               writel(1000000000 / (rx_ring->itr_val * 256),
+                      rx_ring->itr_register);
+               rx_ring->set_itr = 0;
        }
 
        if (napi_schedule_prep(&adapter->napi)) {
@@ -1839,9 +1874,9 @@ static void e1000_configure_msix(struct e1000_adapter *adapter)
        adapter->eiac_mask |= rx_ring->ims_val;
        if (rx_ring->itr_val)
                writel(1000000000 / (rx_ring->itr_val * 256),
-                      hw->hw_addr + rx_ring->itr_register);
+                      rx_ring->itr_register);
        else
-               writel(1, hw->hw_addr + rx_ring->itr_register);
+               writel(1, rx_ring->itr_register);
        ivar = E1000_IVAR_INT_ALLOC_VALID | vector;
 
        /* Configure Tx vector */
@@ -1849,9 +1884,9 @@ static void e1000_configure_msix(struct e1000_adapter *adapter)
        vector++;
        if (tx_ring->itr_val)
                writel(1000000000 / (tx_ring->itr_val * 256),
-                      hw->hw_addr + tx_ring->itr_register);
+                      tx_ring->itr_register);
        else
-               writel(1, hw->hw_addr + tx_ring->itr_register);
+               writel(1, tx_ring->itr_register);
        adapter->eiac_mask |= tx_ring->ims_val;
        ivar |= ((E1000_IVAR_INT_ALLOC_VALID | vector) << 8);
 
@@ -1965,8 +2000,9 @@ static int e1000_request_msix(struct e1000_adapter *adapter)
                          e1000_intr_msix_rx, 0, adapter->rx_ring->name,
                          netdev);
        if (err)
-               goto out;
-       adapter->rx_ring->itr_register = E1000_EITR_82574(vector);
+               return err;
+       adapter->rx_ring->itr_register = adapter->hw.hw_addr +
+           E1000_EITR_82574(vector);
        adapter->rx_ring->itr_val = adapter->itr;
        vector++;
 
@@ -1980,20 +2016,20 @@ static int e1000_request_msix(struct e1000_adapter *adapter)
                          e1000_intr_msix_tx, 0, adapter->tx_ring->name,
                          netdev);
        if (err)
-               goto out;
-       adapter->tx_ring->itr_register = E1000_EITR_82574(vector);
+               return err;
+       adapter->tx_ring->itr_register = adapter->hw.hw_addr +
+           E1000_EITR_82574(vector);
        adapter->tx_ring->itr_val = adapter->itr;
        vector++;
 
        err = request_irq(adapter->msix_entries[vector].vector,
                          e1000_msix_other, 0, netdev->name, netdev);
        if (err)
-               goto out;
+               return err;
 
        e1000_configure_msix(adapter);
+
        return 0;
-out:
-       return err;
 }
 
 /**
@@ -2162,13 +2198,13 @@ static int e1000_alloc_ring_dma(struct e1000_adapter *adapter,
 
 /**
  * e1000e_setup_tx_resources - allocate Tx resources (Descriptors)
- * @adapter: board private structure
+ * @tx_ring: Tx descriptor ring
  *
  * Return 0 on success, negative on failure
  **/
-int e1000e_setup_tx_resources(struct e1000_adapter *adapter)
+int e1000e_setup_tx_resources(struct e1000_ring *tx_ring)
 {
-       struct e1000_ring *tx_ring = adapter->tx_ring;
+       struct e1000_adapter *adapter = tx_ring->adapter;
        int err = -ENOMEM, size;
 
        size = sizeof(struct e1000_buffer) * tx_ring->count;
@@ -2196,13 +2232,13 @@ err:
 
 /**
  * e1000e_setup_rx_resources - allocate Rx resources (Descriptors)
- * @adapter: board private structure
+ * @rx_ring: Rx descriptor ring
  *
  * Returns 0 on success, negative on failure
  **/
-int e1000e_setup_rx_resources(struct e1000_adapter *adapter)
+int e1000e_setup_rx_resources(struct e1000_ring *rx_ring)
 {
-       struct e1000_ring *rx_ring = adapter->rx_ring;
+       struct e1000_adapter *adapter = rx_ring->adapter;
        struct e1000_buffer *buffer_info;
        int i, size, desc_len, err = -ENOMEM;
 
@@ -2249,18 +2285,18 @@ err:
 
 /**
  * e1000_clean_tx_ring - Free Tx Buffers
- * @adapter: board private structure
+ * @tx_ring: Tx descriptor ring
  **/
-static void e1000_clean_tx_ring(struct e1000_adapter *adapter)
+static void e1000_clean_tx_ring(struct e1000_ring *tx_ring)
 {
-       struct e1000_ring *tx_ring = adapter->tx_ring;
+       struct e1000_adapter *adapter = tx_ring->adapter;
        struct e1000_buffer *buffer_info;
        unsigned long size;
        unsigned int i;
 
        for (i = 0; i < tx_ring->count; i++) {
                buffer_info = &tx_ring->buffer_info[i];
-               e1000_put_txbuf(adapter, buffer_info);
+               e1000_put_txbuf(tx_ring, buffer_info);
        }
 
        netdev_reset_queue(adapter->netdev);
@@ -2272,22 +2308,22 @@ static void e1000_clean_tx_ring(struct e1000_adapter *adapter)
        tx_ring->next_to_use = 0;
        tx_ring->next_to_clean = 0;
 
-       writel(0, adapter->hw.hw_addr + tx_ring->head);
-       writel(0, adapter->hw.hw_addr + tx_ring->tail);
+       writel(0, tx_ring->head);
+       writel(0, tx_ring->tail);
 }
 
 /**
  * e1000e_free_tx_resources - Free Tx Resources per Queue
- * @adapter: board private structure
+ * @tx_ring: Tx descriptor ring
  *
  * Free all transmit software resources
  **/
-void e1000e_free_tx_resources(struct e1000_adapter *adapter)
+void e1000e_free_tx_resources(struct e1000_ring *tx_ring)
 {
+       struct e1000_adapter *adapter = tx_ring->adapter;
        struct pci_dev *pdev = adapter->pdev;
-       struct e1000_ring *tx_ring = adapter->tx_ring;
 
-       e1000_clean_tx_ring(adapter);
+       e1000_clean_tx_ring(tx_ring);
 
        vfree(tx_ring->buffer_info);
        tx_ring->buffer_info = NULL;
@@ -2299,18 +2335,17 @@ void e1000e_free_tx_resources(struct e1000_adapter *adapter)
 
 /**
  * e1000e_free_rx_resources - Free Rx Resources
- * @adapter: board private structure
+ * @rx_ring: Rx descriptor ring
  *
  * Free all receive software resources
  **/
-
-void e1000e_free_rx_resources(struct e1000_adapter *adapter)
+void e1000e_free_rx_resources(struct e1000_ring *rx_ring)
 {
+       struct e1000_adapter *adapter = rx_ring->adapter;
        struct pci_dev *pdev = adapter->pdev;
-       struct e1000_ring *rx_ring = adapter->rx_ring;
        int i;
 
-       e1000_clean_rx_ring(adapter);
+       e1000_clean_rx_ring(rx_ring);
 
        for (i = 0; i < rx_ring->count; i++)
                kfree(rx_ring->buffer_info[i].ps_pages);
@@ -2346,7 +2381,7 @@ static unsigned int e1000_update_itr(struct e1000_adapter *adapter,
        unsigned int retval = itr_setting;
 
        if (packets == 0)
-               goto update_itr_done;
+               return itr_setting;
 
        switch (itr_setting) {
        case lowest_latency:
@@ -2381,7 +2416,6 @@ static unsigned int e1000_update_itr(struct e1000_adapter *adapter,
                break;
        }
 
-update_itr_done:
        return retval;
 }
 
@@ -2464,13 +2498,19 @@ set_itr_now:
  **/
 static int __devinit e1000_alloc_queues(struct e1000_adapter *adapter)
 {
-       adapter->tx_ring = kzalloc(sizeof(struct e1000_ring), GFP_KERNEL);
+       int size = sizeof(struct e1000_ring);
+
+       adapter->tx_ring = kzalloc(size, GFP_KERNEL);
        if (!adapter->tx_ring)
                goto err;
+       adapter->tx_ring->count = adapter->tx_ring_count;
+       adapter->tx_ring->adapter = adapter;
 
-       adapter->rx_ring = kzalloc(sizeof(struct e1000_ring), GFP_KERNEL);
+       adapter->rx_ring = kzalloc(size, GFP_KERNEL);
        if (!adapter->rx_ring)
                goto err;
+       adapter->rx_ring->count = adapter->rx_ring_count;
+       adapter->rx_ring->adapter = adapter;
 
        return 0;
 err:
@@ -2498,10 +2538,10 @@ static int e1000_clean(struct napi_struct *napi, int budget)
            !(adapter->rx_ring->ims_val & adapter->tx_ring->ims_val))
                goto clean_rx;
 
-       tx_cleaned = e1000_clean_tx_irq(adapter);
+       tx_cleaned = e1000_clean_tx_irq(adapter->tx_ring);
 
 clean_rx:
-       adapter->clean_rx(adapter, &work_done, budget);
+       adapter->clean_rx(adapter->rx_ring, &work_done, budget);
 
        if (!tx_cleaned)
                work_done = budget;
@@ -2746,8 +2786,7 @@ static void e1000_configure_tx(struct e1000_adapter *adapter)
        struct e1000_hw *hw = &adapter->hw;
        struct e1000_ring *tx_ring = adapter->tx_ring;
        u64 tdba;
-       u32 tdlen, tctl, tipg, tarc;
-       u32 ipgr1, ipgr2;
+       u32 tdlen, tarc;
 
        /* Setup the HW Tx Head and Tail descriptor pointers */
        tdba = tx_ring->dma;
@@ -2757,20 +2796,8 @@ static void e1000_configure_tx(struct e1000_adapter *adapter)
        ew32(TDLEN, tdlen);
        ew32(TDH, 0);
        ew32(TDT, 0);
-       tx_ring->head = E1000_TDH;
-       tx_ring->tail = E1000_TDT;
-
-       /* Set the default values for the Tx Inter Packet Gap timer */
-       tipg = DEFAULT_82543_TIPG_IPGT_COPPER;          /*  8  */
-       ipgr1 = DEFAULT_82543_TIPG_IPGR1;               /*  8  */
-       ipgr2 = DEFAULT_82543_TIPG_IPGR2;               /*  6  */
-
-       if (adapter->flags & FLAG_TIPG_MEDIUM_FOR_80003ESLAN)
-               ipgr2 = DEFAULT_80003ES2LAN_TIPG_IPGR2; /*  7  */
-
-       tipg |= ipgr1 << E1000_TIPG_IPGR1_SHIFT;
-       tipg |= ipgr2 << E1000_TIPG_IPGR2_SHIFT;
-       ew32(TIPG, tipg);
+       tx_ring->head = adapter->hw.hw_addr + E1000_TDH;
+       tx_ring->tail = adapter->hw.hw_addr + E1000_TDT;
 
        /* Set the Tx Interrupt Delay register */
        ew32(TIDV, adapter->tx_int_delay);
@@ -2793,15 +2820,9 @@ static void e1000_configure_tx(struct e1000_adapter *adapter)
                 */
                txdctl |= E1000_TXDCTL_DMA_BURST_ENABLE;
                ew32(TXDCTL(0), txdctl);
-               /* erratum work around: set txdctl the same for both queues */
-               ew32(TXDCTL(1), txdctl);
        }
-
-       /* Program the Transmit Control Register */
-       tctl = er32(TCTL);
-       tctl &= ~E1000_TCTL_CT;
-       tctl |= E1000_TCTL_PSP | E1000_TCTL_RTLC |
-               (E1000_COLLISION_THRESHOLD << E1000_CT_SHIFT);
+       /* erratum work around: set txdctl the same for both queues */
+       ew32(TXDCTL(1), er32(TXDCTL(0)));
 
        if (adapter->flags & FLAG_TARC_SPEED_MODE_BIT) {
                tarc = er32(TARC(0));
@@ -2834,9 +2855,7 @@ static void e1000_configure_tx(struct e1000_adapter *adapter)
        /* enable Report Status bit */
        adapter->txd_cmd |= E1000_TXD_CMD_RS;
 
-       ew32(TCTL, tctl);
-
-       e1000e_config_collision_dist(hw);
+       hw->mac.ops.config_collision_dist(hw);
 }
 
 /**
@@ -2944,8 +2963,7 @@ static void e1000_setup_rctl(struct e1000_adapter *adapter)
         * per packet.
         */
        pages = PAGE_USE_COUNT(adapter->netdev->mtu);
-       if (!(adapter->flags & FLAG_HAS_ERT) && (pages <= 3) &&
-           (PAGE_SIZE <= 16384) && (rctl & E1000_RCTL_LPE))
+       if ((pages <= 3) && (PAGE_SIZE <= 16384) && (rctl & E1000_RCTL_LPE))
                adapter->rx_ps_pages = pages;
        else
                adapter->rx_ps_pages = 0;
@@ -2982,6 +3000,22 @@ static void e1000_setup_rctl(struct e1000_adapter *adapter)
                ew32(PSRCTL, psrctl);
        }
 
+       /* This is useful for sniffing bad packets. */
+       if (adapter->netdev->features & NETIF_F_RXALL) {
+               /* UPE and MPE will be handled by normal PROMISC logic
+                * in e1000e_set_rx_mode */
+               rctl |= (E1000_RCTL_SBP | /* Receive bad packets */
+                        E1000_RCTL_BAM | /* RX All Bcast Pkts */
+                        E1000_RCTL_PMCF); /* RX All MAC Ctrl Pkts */
+
+               rctl &= ~(E1000_RCTL_VFE | /* Disable VLAN filter */
+                         E1000_RCTL_DPF | /* Allow filtered pause */
+                         E1000_RCTL_CFIEN); /* Dis VLAN CFIEN Filter */
+               /* Do not mess with E1000_CTRL_VME, it affects transmit as well,
+                * and that breaks VLANs.
+                */
+       }
+
        ew32(RFCTL, rfctl);
        ew32(RCTL, rctl);
        /* just started the receive unit, no need to restart */
@@ -3072,8 +3106,8 @@ static void e1000_configure_rx(struct e1000_adapter *adapter)
        ew32(RDLEN, rdlen);
        ew32(RDH, 0);
        ew32(RDT, 0);
-       rx_ring->head = E1000_RDH;
-       rx_ring->tail = E1000_RDT;
+       rx_ring->head = adapter->hw.hw_addr + E1000_RDH;
+       rx_ring->tail = adapter->hw.hw_addr + E1000_RDT;
 
        /* Enable Receive Checksum Offload for TCP and UDP */
        rxcsum = er32(RXCSUM);
@@ -3092,23 +3126,14 @@ static void e1000_configure_rx(struct e1000_adapter *adapter)
        }
        ew32(RXCSUM, rxcsum);
 
-       /*
-        * Enable early receives on supported devices, only takes effect when
-        * packet size is equal or larger than the specified value (in 8 byte
-        * units), e.g. using jumbo frames when setting to E1000_ERT_2048
-        */
-       if ((adapter->flags & FLAG_HAS_ERT) ||
-           (adapter->hw.mac.type == e1000_pch2lan)) {
+       if (adapter->hw.mac.type == e1000_pch2lan) {
+               /*
+                * With jumbo frames, excessive C-state transition
+                * latencies result in dropped transactions.
+                */
                if (adapter->netdev->mtu > ETH_DATA_LEN) {
                        u32 rxdctl = er32(RXDCTL(0));
                        ew32(RXDCTL(0), rxdctl | 0x3);
-                       if (adapter->flags & FLAG_HAS_ERT)
-                               ew32(ERT, E1000_ERT_2048 | (1 << 13));
-                       /*
-                        * With jumbo frames and early-receive enabled,
-                        * excessive C-state transition latencies result in
-                        * dropped transactions.
-                        */
                        pm_qos_update_request(&adapter->netdev->pm_qos_req, 55);
                } else {
                        pm_qos_update_request(&adapter->netdev->pm_qos_req,
@@ -3237,6 +3262,7 @@ static void e1000e_set_rx_mode(struct net_device *netdev)
                e1000e_vlan_filter_disable(adapter);
        } else {
                int count;
+
                if (netdev->flags & IFF_ALLMULTI) {
                        rctl |= E1000_RCTL_MPE;
                } else {
@@ -3268,22 +3294,62 @@ static void e1000e_set_rx_mode(struct net_device *netdev)
                e1000e_vlan_strip_disable(adapter);
 }
 
+static void e1000e_setup_rss_hash(struct e1000_adapter *adapter)
+{
+       struct e1000_hw *hw = &adapter->hw;
+       u32 mrqc, rxcsum;
+       int i;
+       static const u32 rsskey[10] = {
+               0xda565a6d, 0xc20e5b25, 0x3d256741, 0xb08fa343, 0xcb2bcad0,
+               0xb4307bae, 0xa32dcb77, 0x0cf23080, 0x3bb7426a, 0xfa01acbe
+       };
+
+       /* Fill out hash function seed */
+       for (i = 0; i < 10; i++)
+               ew32(RSSRK(i), rsskey[i]);
+
+       /* Direct all traffic to queue 0 */
+       for (i = 0; i < 32; i++)
+               ew32(RETA(i), 0);
+
+       /*
+        * Disable raw packet checksumming so that RSS hash is placed in
+        * descriptor on writeback.
+        */
+       rxcsum = er32(RXCSUM);
+       rxcsum |= E1000_RXCSUM_PCSD;
+
+       ew32(RXCSUM, rxcsum);
+
+       mrqc = (E1000_MRQC_RSS_FIELD_IPV4 |
+               E1000_MRQC_RSS_FIELD_IPV4_TCP |
+               E1000_MRQC_RSS_FIELD_IPV6 |
+               E1000_MRQC_RSS_FIELD_IPV6_TCP |
+               E1000_MRQC_RSS_FIELD_IPV6_TCP_EX);
+
+       ew32(MRQC, mrqc);
+}
+
 /**
  * e1000_configure - configure the hardware for Rx and Tx
  * @adapter: private board structure
  **/
 static void e1000_configure(struct e1000_adapter *adapter)
 {
+       struct e1000_ring *rx_ring = adapter->rx_ring;
+
        e1000e_set_rx_mode(adapter->netdev);
 
        e1000_restore_vlan(adapter);
        e1000_init_manageability_pt(adapter);
 
        e1000_configure_tx(adapter);
+
+       if (adapter->netdev->features & NETIF_F_RXHASH)
+               e1000e_setup_rss_hash(adapter);
        e1000_setup_rctl(adapter);
        e1000_configure_rx(adapter);
-       adapter->alloc_rx_buf(adapter, e1000_desc_unused(adapter->rx_ring),
-                             GFP_KERNEL);
+       adapter->alloc_rx_buf(rx_ring, e1000_desc_unused(rx_ring), GFP_KERNEL);
 }
 
 /**
@@ -3379,9 +3445,7 @@ void e1000e_reset(struct e1000_adapter *adapter)
                         * if short on Rx space, Rx wins and must trump Tx
                         * adjustment or use Early Receive if available
                         */
-                       if ((pba < min_rx_space) &&
-                           (!(adapter->flags & FLAG_HAS_ERT)))
-                               /* ERT enabled in e1000_configure_rx */
+                       if (pba < min_rx_space)
                                pba = min_rx_space;
                }
 
@@ -3395,26 +3459,29 @@ void e1000e_reset(struct e1000_adapter *adapter)
         * (or the size used for early receive) above it in the Rx FIFO.
         * Set it to the lower of:
         * - 90% of the Rx FIFO size, and
-        * - the full Rx FIFO size minus the early receive size (for parts
-        *   with ERT support assuming ERT set to E1000_ERT_2048), or
         * - the full Rx FIFO size minus one full frame
         */
        if (adapter->flags & FLAG_DISABLE_FC_PAUSE_TIME)
                fc->pause_time = 0xFFFF;
        else
                fc->pause_time = E1000_FC_PAUSE_TIME;
-       fc->send_xon = 1;
+       fc->send_xon = true;
        fc->current_mode = fc->requested_mode;
 
        switch (hw->mac.type) {
+       case e1000_ich9lan:
+       case e1000_ich10lan:
+               if (adapter->netdev->mtu > ETH_DATA_LEN) {
+                       pba = 14;
+                       ew32(PBA, pba);
+                       fc->high_water = 0x2800;
+                       fc->low_water = fc->high_water - 8;
+                       break;
+               }
+               /* fall-through */
        default:
-               if ((adapter->flags & FLAG_HAS_ERT) &&
-                   (adapter->netdev->mtu > ETH_DATA_LEN))
-                       hwm = min(((pba << 10) * 9 / 10),
-                                 ((pba << 10) - (E1000_ERT_2048 << 3)));
-               else
-                       hwm = min(((pba << 10) * 9 / 10),
-                                 ((pba << 10) - adapter->max_frame_size));
+               hwm = min(((pba << 10) * 9 / 10),
+                         ((pba << 10) - adapter->max_frame_size));
 
                fc->high_water = hwm & E1000_FCRTH_RTH; /* 8-byte granularity */
                fc->low_water = fc->high_water - 8;
@@ -3447,11 +3514,10 @@ void e1000e_reset(struct e1000_adapter *adapter)
 
        /*
         * Disable Adaptive Interrupt Moderation if 2 full packets cannot
-        * fit in receive buffer and early-receive not supported.
+        * fit in receive buffer.
         */
        if (adapter->itr_setting & 0x3) {
-               if (((adapter->max_frame_size * 2) > (pba << 10)) &&
-                   !(adapter->flags & FLAG_HAS_ERT)) {
+               if ((adapter->max_frame_size * 2) > (pba << 10)) {
                        if (!(adapter->flags2 & FLAG2_DISABLE_AIM)) {
                                dev_info(&adapter->pdev->dev,
                                        "Interrupt Throttle Rate turned off\n");
@@ -3593,8 +3659,8 @@ void e1000e_down(struct e1000_adapter *adapter)
        spin_unlock(&adapter->stats64_lock);
 
        e1000e_flush_descriptors(adapter);
-       e1000_clean_tx_ring(adapter);
-       e1000_clean_rx_ring(adapter);
+       e1000_clean_tx_ring(adapter->tx_ring);
+       e1000_clean_rx_ring(adapter->rx_ring);
 
        adapter->link_speed = 0;
        adapter->link_duplex = 0;
@@ -3634,6 +3700,8 @@ static int __devinit e1000_sw_init(struct e1000_adapter *adapter)
        adapter->rx_ps_bsize0 = 128;
        adapter->max_frame_size = netdev->mtu + ETH_HLEN + ETH_FCS_LEN;
        adapter->min_frame_size = ETH_ZLEN + ETH_FCS_LEN;
+       adapter->tx_ring_count = E1000_DEFAULT_TXD;
+       adapter->rx_ring_count = E1000_DEFAULT_RXD;
 
        spin_lock_init(&adapter->stats64_lock);
 
@@ -3721,8 +3789,9 @@ static int e1000_test_msi_interrupt(struct e1000_adapter *adapter)
        if (adapter->flags & FLAG_MSI_TEST_FAILED) {
                adapter->int_mode = E1000E_INT_MODE_LEGACY;
                e_info("MSI interrupt test failed, using legacy interrupt.\n");
-       } else
+       } else {
                e_dbg("MSI interrupt test succeeded!\n");
+       }
 
        free_irq(adapter->pdev->irq, netdev);
        pci_disable_msi(adapter->pdev);
@@ -3792,12 +3861,12 @@ static int e1000_open(struct net_device *netdev)
        netif_carrier_off(netdev);
 
        /* allocate transmit descriptors */
-       err = e1000e_setup_tx_resources(adapter);
+       err = e1000e_setup_tx_resources(adapter->tx_ring);
        if (err)
                goto err_setup_tx;
 
        /* allocate receive descriptors */
-       err = e1000e_setup_rx_resources(adapter);
+       err = e1000e_setup_rx_resources(adapter->rx_ring);
        if (err)
                goto err_setup_rx;
 
@@ -3817,9 +3886,8 @@ static int e1000_open(struct net_device *netdev)
             E1000_MNG_DHCP_COOKIE_STATUS_VLAN))
                e1000_update_mng_vlan(adapter);
 
-       /* DMA latency requirement to workaround early-receive/jumbo issue */
-       if ((adapter->flags & FLAG_HAS_ERT) ||
-           (adapter->hw.mac.type == e1000_pch2lan))
+       /* DMA latency requirement to workaround jumbo issue */
+       if (adapter->hw.mac.type == e1000_pch2lan)
                pm_qos_add_request(&adapter->netdev->pm_qos_req,
                                   PM_QOS_CPU_DMA_LATENCY,
                                   PM_QOS_DEFAULT_VALUE);
@@ -3873,9 +3941,9 @@ static int e1000_open(struct net_device *netdev)
 err_req_irq:
        e1000e_release_hw_control(adapter);
        e1000_power_down_phy(adapter);
-       e1000e_free_rx_resources(adapter);
+       e1000e_free_rx_resources(adapter->rx_ring);
 err_setup_rx:
-       e1000e_free_tx_resources(adapter);
+       e1000e_free_tx_resources(adapter->tx_ring);
 err_setup_tx:
        e1000e_reset(adapter);
        pm_runtime_put_sync(&pdev->dev);
@@ -3911,8 +3979,8 @@ static int e1000_close(struct net_device *netdev)
        }
        e1000_power_down_phy(adapter);
 
-       e1000e_free_tx_resources(adapter);
-       e1000e_free_rx_resources(adapter);
+       e1000e_free_tx_resources(adapter->tx_ring);
+       e1000e_free_rx_resources(adapter->rx_ring);
 
        /*
         * kill manageability vlan ID if supported, but not if a vlan with
@@ -3930,8 +3998,7 @@ static int e1000_close(struct net_device *netdev)
            !test_bit(__E1000_TESTING, &adapter->state))
                e1000e_release_hw_control(adapter);
 
-       if ((adapter->flags & FLAG_HAS_ERT) ||
-           (adapter->hw.mac.type == e1000_pch2lan))
+       if (adapter->hw.mac.type == e1000_pch2lan)
                pm_qos_remove_request(&adapter->netdev->pm_qos_req);
 
        pm_runtime_put_sync(&pdev->dev);
@@ -4566,13 +4633,12 @@ link_up:
 #define E1000_TX_FLAGS_VLAN            0x00000002
 #define E1000_TX_FLAGS_TSO             0x00000004
 #define E1000_TX_FLAGS_IPV4            0x00000008
+#define E1000_TX_FLAGS_NO_FCS          0x00000010
 #define E1000_TX_FLAGS_VLAN_MASK       0xffff0000
 #define E1000_TX_FLAGS_VLAN_SHIFT      16
 
-static int e1000_tso(struct e1000_adapter *adapter,
-                    struct sk_buff *skb)
+static int e1000_tso(struct e1000_ring *tx_ring, struct sk_buff *skb)
 {
-       struct e1000_ring *tx_ring = adapter->tx_ring;
        struct e1000_context_desc *context_desc;
        struct e1000_buffer *buffer_info;
        unsigned int i;
@@ -4641,9 +4707,9 @@ static int e1000_tso(struct e1000_adapter *adapter,
        return 1;
 }
 
-static bool e1000_tx_csum(struct e1000_adapter *adapter, struct sk_buff *skb)
+static bool e1000_tx_csum(struct e1000_ring *tx_ring, struct sk_buff *skb)
 {
-       struct e1000_ring *tx_ring = adapter->tx_ring;
+       struct e1000_adapter *adapter = tx_ring->adapter;
        struct e1000_context_desc *context_desc;
        struct e1000_buffer *buffer_info;
        unsigned int i;
@@ -4704,12 +4770,11 @@ static bool e1000_tx_csum(struct e1000_adapter *adapter, struct sk_buff *skb)
 #define E1000_MAX_PER_TXD      8192
 #define E1000_MAX_TXD_PWR      12
 
-static int e1000_tx_map(struct e1000_adapter *adapter,
-                       struct sk_buff *skb, unsigned int first,
-                       unsigned int max_per_txd, unsigned int nr_frags,
-                       unsigned int mss)
+static int e1000_tx_map(struct e1000_ring *tx_ring, struct sk_buff *skb,
+                       unsigned int first, unsigned int max_per_txd,
+                       unsigned int nr_frags, unsigned int mss)
 {
-       struct e1000_ring *tx_ring = adapter->tx_ring;
+       struct e1000_adapter *adapter = tx_ring->adapter;
        struct pci_dev *pdev = adapter->pdev;
        struct e1000_buffer *buffer_info;
        unsigned int len = skb_headlen(skb);
@@ -4795,16 +4860,15 @@ dma_error:
                        i += tx_ring->count;
                i--;
                buffer_info = &tx_ring->buffer_info[i];
-               e1000_put_txbuf(adapter, buffer_info);
+               e1000_put_txbuf(tx_ring, buffer_info);
        }
 
        return 0;
 }
 
-static void e1000_tx_queue(struct e1000_adapter *adapter,
-                          int tx_flags, int count)
+static void e1000_tx_queue(struct e1000_ring *tx_ring, int tx_flags, int count)
 {
-       struct e1000_ring *tx_ring = adapter->tx_ring;
+       struct e1000_adapter *adapter = tx_ring->adapter;
        struct e1000_tx_desc *tx_desc = NULL;
        struct e1000_buffer *buffer_info;
        u32 txd_upper = 0, txd_lower = E1000_TXD_CMD_IFCS;
@@ -4829,6 +4893,9 @@ static void e1000_tx_queue(struct e1000_adapter *adapter,
                txd_upper |= (tx_flags & E1000_TX_FLAGS_VLAN_MASK);
        }
 
+       if (unlikely(tx_flags & E1000_TX_FLAGS_NO_FCS))
+               txd_lower &= ~(E1000_TXD_CMD_IFCS);
+
        i = tx_ring->next_to_use;
 
        do {
@@ -4846,6 +4913,10 @@ static void e1000_tx_queue(struct e1000_adapter *adapter,
 
        tx_desc->lower.data |= cpu_to_le32(adapter->txd_cmd);
 
+       /* txd_cmd re-enables FCS, so we'll re-disable it here as desired. */
+       if (unlikely(tx_flags & E1000_TX_FLAGS_NO_FCS))
+               tx_desc->lower.data &= ~(cpu_to_le32(E1000_TXD_CMD_IFCS));
+
        /*
         * Force memory writes to complete before letting h/w
         * know there are new descriptors to fetch.  (Only
@@ -4857,9 +4928,9 @@ static void e1000_tx_queue(struct e1000_adapter *adapter,
        tx_ring->next_to_use = i;
 
        if (adapter->flags2 & FLAG2_PCIM2PCI_ARBITER_WA)
-               e1000e_update_tdt_wa(adapter, i);
+               e1000e_update_tdt_wa(tx_ring, i);
        else
-               writel(i, adapter->hw.hw_addr + tx_ring->tail);
+               writel(i, tx_ring->tail);
 
        /*
         * we need this if more than one processor can write to our tail
@@ -4907,11 +4978,11 @@ static int e1000_transfer_dhcp_info(struct e1000_adapter *adapter,
        return 0;
 }
 
-static int __e1000_maybe_stop_tx(struct net_device *netdev, int size)
+static int __e1000_maybe_stop_tx(struct e1000_ring *tx_ring, int size)
 {
-       struct e1000_adapter *adapter = netdev_priv(netdev);
+       struct e1000_adapter *adapter = tx_ring->adapter;
 
-       netif_stop_queue(netdev);
+       netif_stop_queue(adapter->netdev);
        /*
         * Herbert's original patch had:
         *  smp_mb__after_netif_stop_queue();
@@ -4923,25 +4994,23 @@ static int __e1000_maybe_stop_tx(struct net_device *netdev, int size)
         * We need to check again in a case another CPU has just
         * made room available.
         */
-       if (e1000_desc_unused(adapter->tx_ring) < size)
+       if (e1000_desc_unused(tx_ring) < size)
                return -EBUSY;
 
        /* A reprieve! */
-       netif_start_queue(netdev);
+       netif_start_queue(adapter->netdev);
        ++adapter->restart_queue;
        return 0;
 }
 
-static int e1000_maybe_stop_tx(struct net_device *netdev, int size)
+static int e1000_maybe_stop_tx(struct e1000_ring *tx_ring, int size)
 {
-       struct e1000_adapter *adapter = netdev_priv(netdev);
-
-       if (e1000_desc_unused(adapter->tx_ring) >= size)
+       if (e1000_desc_unused(tx_ring) >= size)
                return 0;
-       return __e1000_maybe_stop_tx(netdev, size);
+       return __e1000_maybe_stop_tx(tx_ring, size);
 }
 
-#define TXD_USE_COUNT(S, X) (((S) >> (X)) + 1 )
+#define TXD_USE_COUNT(S, X) (((S) >> (X)) + 1)
 static netdev_tx_t e1000_xmit_frame(struct sk_buff *skb,
                                    struct net_device *netdev)
 {
@@ -4995,7 +5064,7 @@ static netdev_tx_t e1000_xmit_frame(struct sk_buff *skb,
                if (skb->data_len && (hdr_len == len)) {
                        unsigned int pull_size;
 
-                       pull_size = min((unsigned int)4, skb->data_len);
+                       pull_size = min_t(unsigned int, 4, skb->data_len);
                        if (!__pskb_pull_tail(skb, pull_size)) {
                                e_err("__pskb_pull_tail failed.\n");
                                dev_kfree_skb_any(skb);
@@ -5024,7 +5093,7 @@ static netdev_tx_t e1000_xmit_frame(struct sk_buff *skb,
         * need: count + 2 desc gap to keep tail from touching
         * head, otherwise try next time
         */
-       if (e1000_maybe_stop_tx(netdev, count + 2))
+       if (e1000_maybe_stop_tx(tx_ring, count + 2))
                return NETDEV_TX_BUSY;
 
        if (vlan_tx_tag_present(skb)) {
@@ -5034,7 +5103,7 @@ static netdev_tx_t e1000_xmit_frame(struct sk_buff *skb,
 
        first = tx_ring->next_to_use;
 
-       tso = e1000_tso(adapter, skb);
+       tso = e1000_tso(tx_ring, skb);
        if (tso < 0) {
                dev_kfree_skb_any(skb);
                return NETDEV_TX_OK;
@@ -5042,7 +5111,7 @@ static netdev_tx_t e1000_xmit_frame(struct sk_buff *skb,
 
        if (tso)
                tx_flags |= E1000_TX_FLAGS_TSO;
-       else if (e1000_tx_csum(adapter, skb))
+       else if (e1000_tx_csum(tx_ring, skb))
                tx_flags |= E1000_TX_FLAGS_CSUM;
 
        /*
@@ -5053,13 +5122,16 @@ static netdev_tx_t e1000_xmit_frame(struct sk_buff *skb,
        if (skb->protocol == htons(ETH_P_IP))
                tx_flags |= E1000_TX_FLAGS_IPV4;
 
+       if (unlikely(skb->no_fcs))
+               tx_flags |= E1000_TX_FLAGS_NO_FCS;
+
        /* if count is 0 then mapping error has occurred */
-       count = e1000_tx_map(adapter, skb, first, max_per_txd, nr_frags, mss);
+       count = e1000_tx_map(tx_ring, skb, first, max_per_txd, nr_frags, mss);
        if (count) {
                netdev_sent_queue(netdev, skb->len);
-               e1000_tx_queue(adapter, tx_flags, count);
+               e1000_tx_queue(tx_ring, tx_flags, count);
                /* Make sure there is space in the ring for the next send. */
-               e1000_maybe_stop_tx(netdev, MAX_SKB_FRAGS + 2);
+               e1000_maybe_stop_tx(tx_ring, MAX_SKB_FRAGS + 2);
 
        } else {
                dev_kfree_skb_any(skb);
@@ -5165,10 +5237,22 @@ static int e1000_change_mtu(struct net_device *netdev, int new_mtu)
        int max_frame = new_mtu + ETH_HLEN + ETH_FCS_LEN;
 
        /* Jumbo frame support */
-       if ((max_frame > ETH_FRAME_LEN + ETH_FCS_LEN) &&
-           !(adapter->flags & FLAG_HAS_JUMBO_FRAMES)) {
-               e_err("Jumbo Frames not supported.\n");
-               return -EINVAL;
+       if (max_frame > ETH_FRAME_LEN + ETH_FCS_LEN) {
+               if (!(adapter->flags & FLAG_HAS_JUMBO_FRAMES)) {
+                       e_err("Jumbo Frames not supported.\n");
+                       return -EINVAL;
+               }
+
+               /*
+                * IP payload checksum (enabled with jumbos/packet-split when
+                * Rx checksum is enabled) and generation of RSS hash is
+                * mutually exclusive in the hardware.
+                */
+               if ((netdev->features & NETIF_F_RXCSUM) &&
+                   (netdev->features & NETIF_F_RXHASH)) {
+                       e_err("Jumbo frames cannot be enabled when both receive checksum offload and receive hashing are enabled.  Disable one of the receive offload features before enabling jumbos.\n");
+                       return -EINVAL;
+               }
        }
 
        /* Supported frame sizes */
@@ -5322,7 +5406,7 @@ static int e1000_init_phy_wakeup(struct e1000_adapter *adapter, u32 wufc)
        /* Enable access to wakeup registers on and set page to BM_WUC_PAGE */
        retval = e1000_enable_phy_wakeup_reg_access_bm(hw, &wuc_enable);
        if (retval)
-               goto out;
+               goto release;
 
        /* copy MAC MTA to PHY MTA - only needed for pchlan */
        for (i = 0; i < adapter->hw.mac.mta_reg_count; i++) {
@@ -5366,7 +5450,7 @@ static int e1000_init_phy_wakeup(struct e1000_adapter *adapter, u32 wufc)
        retval = e1000_disable_phy_wakeup_reg_access_bm(hw, &wuc_enable);
        if (retval)
                e_err("Could not set PHY Host Wakeup bit\n");
-out:
+release:
        hw->phy.ops.release(hw);
 
        return retval;
@@ -5908,7 +5992,7 @@ static void e1000_print_device_info(struct e1000_adapter *adapter)
        ret_val = e1000_read_pba_string_generic(hw, pba_str,
                                                E1000_PBANUM_LENGTH);
        if (ret_val)
-               strncpy((char *)pba_str, "Unknown", sizeof(pba_str) - 1);
+               strlcpy((char *)pba_str, "Unknown", sizeof(pba_str));
        e_info("MAC: %d, PHY: %d, PBA No: %s\n",
               hw->mac.type, hw->phy.type, pba_str);
 }
@@ -5923,7 +6007,8 @@ static void e1000_eeprom_checks(struct e1000_adapter *adapter)
                return;
 
        ret_val = e1000_read_nvm(hw, NVM_INIT_CONTROL2_REG, 1, &buf);
-       if (!ret_val && (!(le16_to_cpu(buf) & (1 << 0)))) {
+       le16_to_cpus(&buf);
+       if (!ret_val && (!(buf & (1 << 0)))) {
                /* Deep Smart Power Down (DSPD) */
                dev_warn(&adapter->pdev->dev,
                         "Warning: detected DSPD enabled in EEPROM\n");
@@ -5931,7 +6016,7 @@ static void e1000_eeprom_checks(struct e1000_adapter *adapter)
 }
 
 static int e1000_set_features(struct net_device *netdev,
-       netdev_features_t features)
+                             netdev_features_t features)
 {
        struct e1000_adapter *adapter = netdev_priv(netdev);
        netdev_features_t changed = features ^ netdev->features;
@@ -5940,9 +6025,37 @@ static int e1000_set_features(struct net_device *netdev,
                adapter->flags |= FLAG_TSO_FORCE;
 
        if (!(changed & (NETIF_F_HW_VLAN_RX | NETIF_F_HW_VLAN_TX |
-                        NETIF_F_RXCSUM)))
+                        NETIF_F_RXCSUM | NETIF_F_RXHASH | NETIF_F_RXFCS |
+                        NETIF_F_RXALL)))
                return 0;
 
+       /*
+        * IP payload checksum (enabled with jumbos/packet-split when Rx
+        * checksum is enabled) and generation of RSS hash is mutually
+        * exclusive in the hardware.
+        */
+       if (adapter->rx_ps_pages &&
+           (features & NETIF_F_RXCSUM) && (features & NETIF_F_RXHASH)) {
+               e_err("Enabling both receive checksum offload and receive hashing is not possible with jumbo frames.  Disable jumbos or enable only one of the receive offload features.\n");
+               return -EINVAL;
+       }
+
+       if (changed & NETIF_F_RXFCS) {
+               if (features & NETIF_F_RXFCS) {
+                       adapter->flags2 &= ~FLAG2_CRC_STRIPPING;
+               } else {
+                       /* We need to take it back to defaults, which might mean
+                        * stripping is still disabled at the adapter level.
+                        */
+                       if (adapter->flags2 & FLAG2_DFLT_CRC_STRIPPING)
+                               adapter->flags2 |= FLAG2_CRC_STRIPPING;
+                       else
+                               adapter->flags2 &= ~FLAG2_CRC_STRIPPING;
+               }
+       }
+
+       netdev->features = features;
+
        if (netif_running(netdev))
                e1000e_reinit_locked(adapter);
        else
@@ -5991,7 +6104,6 @@ static int __devinit e1000_probe(struct pci_dev *pdev,
        const struct e1000_info *ei = e1000_info_tbl[ent->driver_data];
        resource_size_t mmio_start, mmio_len;
        resource_size_t flash_start, flash_len;
-
        static int cards_found;
        u16 aspm_disable_flag = 0;
        int i, err, pci_using_dac;
@@ -6087,7 +6199,7 @@ static int __devinit e1000_probe(struct pci_dev *pdev,
        e1000e_set_ethtool_ops(netdev);
        netdev->watchdog_timeo          = 5 * HZ;
        netif_napi_add(netdev, &adapter->napi, e1000_clean, 64);
-       strncpy(netdev->name, pci_name(pdev), sizeof(netdev->name) - 1);
+       strlcpy(netdev->name, pci_name(pdev), sizeof(netdev->name));
 
        netdev->mem_start = mmio_start;
        netdev->mem_end = mmio_start + mmio_len;
@@ -6124,7 +6236,7 @@ static int __devinit e1000_probe(struct pci_dev *pdev,
                adapter->hw.phy.ms_type = e1000_ms_hw_default;
        }
 
-       if (e1000_check_reset_block(&adapter->hw))
+       if (hw->phy.ops.check_reset_block(hw))
                e_info("PHY reset is blocked due to SOL/IDER session.\n");
 
        /* Set initial default active device features */
@@ -6133,11 +6245,15 @@ static int __devinit e1000_probe(struct pci_dev *pdev,
                            NETIF_F_HW_VLAN_TX |
                            NETIF_F_TSO |
                            NETIF_F_TSO6 |
+                           NETIF_F_RXHASH |
                            NETIF_F_RXCSUM |
                            NETIF_F_HW_CSUM);
 
        /* Set user-changeable features (subset of all device features) */
        netdev->hw_features = netdev->features;
+       netdev->hw_features |= NETIF_F_RXFCS;
+       netdev->priv_flags |= IFF_SUPP_NOFCS;
+       netdev->hw_features |= NETIF_F_RXALL;
 
        if (adapter->flags & FLAG_HAS_HW_VLAN_FILTER)
                netdev->features |= NETIF_F_HW_VLAN_FILTER;
@@ -6231,11 +6347,11 @@ static int __devinit e1000_probe(struct pci_dev *pdev,
        } else if (adapter->flags & FLAG_APME_IN_CTRL3) {
                if (adapter->flags & FLAG_APME_CHECK_PORT_B &&
                    (adapter->hw.bus.func == 1))
-                       e1000_read_nvm(&adapter->hw,
-                               NVM_INIT_CONTROL3_PORT_B, 1, &eeprom_data);
+                       e1000_read_nvm(&adapter->hw, NVM_INIT_CONTROL3_PORT_B,
+                                      1, &eeprom_data);
                else
-                       e1000_read_nvm(&adapter->hw,
-                               NVM_INIT_CONTROL3_PORT_A, 1, &eeprom_data);
+                       e1000_read_nvm(&adapter->hw, NVM_INIT_CONTROL3_PORT_A,
+                                      1, &eeprom_data);
        }
 
        /* fetch WoL from EEPROM */
@@ -6268,7 +6384,7 @@ static int __devinit e1000_probe(struct pci_dev *pdev,
        if (!(adapter->flags & FLAG_HAS_AMT))
                e1000e_get_hw_control(adapter);
 
-       strncpy(netdev->name, "eth%d", sizeof(netdev->name) - 1);
+       strlcpy(netdev->name, "eth%d", sizeof(netdev->name));
        err = register_netdev(netdev);
        if (err)
                goto err_register;
@@ -6287,7 +6403,7 @@ err_register:
        if (!(adapter->flags & FLAG_HAS_AMT))
                e1000e_release_hw_control(adapter);
 err_eeprom:
-       if (!e1000_check_reset_block(&adapter->hw))
+       if (!hw->phy.ops.check_reset_block(hw))
                e1000_phy_hw_reset(&adapter->hw);
 err_hw_init:
        kfree(adapter->tx_ring);
@@ -6449,7 +6565,7 @@ static DEFINE_PCI_DEVICE_TABLE(e1000_pci_tbl) = {
        { PCI_VDEVICE(INTEL, E1000_DEV_ID_PCH2_LV_LM), board_pch2lan },
        { PCI_VDEVICE(INTEL, E1000_DEV_ID_PCH2_LV_V), board_pch2lan },
 
-       { }     /* terminate list */
+       { 0, 0, 0, 0, 0, 0, 0 } /* terminate list */
 };
 MODULE_DEVICE_TABLE(pci, e1000_pci_tbl);
 
@@ -6468,7 +6584,9 @@ static struct pci_driver e1000_driver = {
        .probe    = e1000_probe,
        .remove   = __devexit_p(e1000_remove),
 #ifdef CONFIG_PM
-       .driver.pm = &e1000_pm_ops,
+       .driver   = {
+               .pm = &e1000_pm_ops,
+       },
 #endif
        .shutdown = e1000_shutdown,
        .err_handler = &e1000_err_handler
@@ -6485,7 +6603,7 @@ static int __init e1000_init_module(void)
        int ret;
        pr_info("Intel(R) PRO/1000 Network Driver - %s\n",
                e1000e_driver_version);
-       pr_info("Copyright(c) 1999 - 2011 Intel Corporation.\n");
+       pr_info("Copyright(c) 1999 - 2012 Intel Corporation.\n");
        ret = pci_register_driver(&e1000_driver);
 
        return ret;
@@ -6510,4 +6628,4 @@ MODULE_DESCRIPTION("Intel(R) PRO/1000 Network Driver");
 MODULE_LICENSE("GPL");
 MODULE_VERSION(DRV_VERSION);
 
-/* e1000_main.c */
+/* netdev.c */
diff --git a/drivers/net/ethernet/intel/e1000e/nvm.c b/drivers/net/ethernet/intel/e1000e/nvm.c
new file mode 100644 (file)
index 0000000..a969f1a
--- /dev/null
@@ -0,0 +1,643 @@
+/*******************************************************************************
+
+  Intel PRO/1000 Linux driver
+  Copyright(c) 1999 - 2012 Intel Corporation.
+
+  This program is free software; you can redistribute it and/or modify it
+  under the terms and conditions of the GNU General Public License,
+  version 2, as published by the Free Software Foundation.
+
+  This program is distributed in the hope it will be useful, but WITHOUT
+  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+  more details.
+
+  You should have received a copy of the GNU General Public License along with
+  this program; if not, write to the Free Software Foundation, Inc.,
+  51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
+
+  The full GNU General Public License is included in this distribution in
+  the file called "COPYING".
+
+  Contact Information:
+  Linux NICS <linux.nics@intel.com>
+  e1000-devel Mailing List <e1000-devel@lists.sourceforge.net>
+  Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
+
+*******************************************************************************/
+
+#include "e1000.h"
+
+/**
+ *  e1000_raise_eec_clk - Raise EEPROM clock
+ *  @hw: pointer to the HW structure
+ *  @eecd: pointer to the EEPROM
+ *
+ *  Enable/Raise the EEPROM clock bit.
+ **/
+static void e1000_raise_eec_clk(struct e1000_hw *hw, u32 *eecd)
+{
+       *eecd = *eecd | E1000_EECD_SK;
+       ew32(EECD, *eecd);
+       e1e_flush();
+       udelay(hw->nvm.delay_usec);
+}
+
+/**
+ *  e1000_lower_eec_clk - Lower EEPROM clock
+ *  @hw: pointer to the HW structure
+ *  @eecd: pointer to the EEPROM
+ *
+ *  Clear/Lower the EEPROM clock bit.
+ **/
+static void e1000_lower_eec_clk(struct e1000_hw *hw, u32 *eecd)
+{
+       *eecd = *eecd & ~E1000_EECD_SK;
+       ew32(EECD, *eecd);
+       e1e_flush();
+       udelay(hw->nvm.delay_usec);
+}
+
+/**
+ *  e1000_shift_out_eec_bits - Shift data bits our to the EEPROM
+ *  @hw: pointer to the HW structure
+ *  @data: data to send to the EEPROM
+ *  @count: number of bits to shift out
+ *
+ *  We need to shift 'count' bits out to the EEPROM.  So, the value in the
+ *  "data" parameter will be shifted out to the EEPROM one bit at a time.
+ *  In order to do this, "data" must be broken down into bits.
+ **/
+static void e1000_shift_out_eec_bits(struct e1000_hw *hw, u16 data, u16 count)
+{
+       struct e1000_nvm_info *nvm = &hw->nvm;
+       u32 eecd = er32(EECD);
+       u32 mask;
+
+       mask = 0x01 << (count - 1);
+       if (nvm->type == e1000_nvm_eeprom_spi)
+               eecd |= E1000_EECD_DO;
+
+       do {
+               eecd &= ~E1000_EECD_DI;
+
+               if (data & mask)
+                       eecd |= E1000_EECD_DI;
+
+               ew32(EECD, eecd);
+               e1e_flush();
+
+               udelay(nvm->delay_usec);
+
+               e1000_raise_eec_clk(hw, &eecd);
+               e1000_lower_eec_clk(hw, &eecd);
+
+               mask >>= 1;
+       } while (mask);
+
+       eecd &= ~E1000_EECD_DI;
+       ew32(EECD, eecd);
+}
+
+/**
+ *  e1000_shift_in_eec_bits - Shift data bits in from the EEPROM
+ *  @hw: pointer to the HW structure
+ *  @count: number of bits to shift in
+ *
+ *  In order to read a register from the EEPROM, we need to shift 'count' bits
+ *  in from the EEPROM.  Bits are "shifted in" by raising the clock input to
+ *  the EEPROM (setting the SK bit), and then reading the value of the data out
+ *  "DO" bit.  During this "shifting in" process the data in "DI" bit should
+ *  always be clear.
+ **/
+static u16 e1000_shift_in_eec_bits(struct e1000_hw *hw, u16 count)
+{
+       u32 eecd;
+       u32 i;
+       u16 data;
+
+       eecd = er32(EECD);
+
+       eecd &= ~(E1000_EECD_DO | E1000_EECD_DI);
+       data = 0;
+
+       for (i = 0; i < count; i++) {
+               data <<= 1;
+               e1000_raise_eec_clk(hw, &eecd);
+
+               eecd = er32(EECD);
+
+               eecd &= ~E1000_EECD_DI;
+               if (eecd & E1000_EECD_DO)
+                       data |= 1;
+
+               e1000_lower_eec_clk(hw, &eecd);
+       }
+
+       return data;
+}
+
+/**
+ *  e1000e_poll_eerd_eewr_done - Poll for EEPROM read/write completion
+ *  @hw: pointer to the HW structure
+ *  @ee_reg: EEPROM flag for polling
+ *
+ *  Polls the EEPROM status bit for either read or write completion based
+ *  upon the value of 'ee_reg'.
+ **/
+s32 e1000e_poll_eerd_eewr_done(struct e1000_hw *hw, int ee_reg)
+{
+       u32 attempts = 100000;
+       u32 i, reg = 0;
+
+       for (i = 0; i < attempts; i++) {
+               if (ee_reg == E1000_NVM_POLL_READ)
+                       reg = er32(EERD);
+               else
+                       reg = er32(EEWR);
+
+               if (reg & E1000_NVM_RW_REG_DONE)
+                       return 0;
+
+               udelay(5);
+       }
+
+       return -E1000_ERR_NVM;
+}
+
+/**
+ *  e1000e_acquire_nvm - Generic request for access to EEPROM
+ *  @hw: pointer to the HW structure
+ *
+ *  Set the EEPROM access request bit and wait for EEPROM access grant bit.
+ *  Return successful if access grant bit set, else clear the request for
+ *  EEPROM access and return -E1000_ERR_NVM (-1).
+ **/
+s32 e1000e_acquire_nvm(struct e1000_hw *hw)
+{
+       u32 eecd = er32(EECD);
+       s32 timeout = E1000_NVM_GRANT_ATTEMPTS;
+
+       ew32(EECD, eecd | E1000_EECD_REQ);
+       eecd = er32(EECD);
+
+       while (timeout) {
+               if (eecd & E1000_EECD_GNT)
+                       break;
+               udelay(5);
+               eecd = er32(EECD);
+               timeout--;
+       }
+
+       if (!timeout) {
+               eecd &= ~E1000_EECD_REQ;
+               ew32(EECD, eecd);
+               e_dbg("Could not acquire NVM grant\n");
+               return -E1000_ERR_NVM;
+       }
+
+       return 0;
+}
+
+/**
+ *  e1000_standby_nvm - Return EEPROM to standby state
+ *  @hw: pointer to the HW structure
+ *
+ *  Return the EEPROM to a standby state.
+ **/
+static void e1000_standby_nvm(struct e1000_hw *hw)
+{
+       struct e1000_nvm_info *nvm = &hw->nvm;
+       u32 eecd = er32(EECD);
+
+       if (nvm->type == e1000_nvm_eeprom_spi) {
+               /* Toggle CS to flush commands */
+               eecd |= E1000_EECD_CS;
+               ew32(EECD, eecd);
+               e1e_flush();
+               udelay(nvm->delay_usec);
+               eecd &= ~E1000_EECD_CS;
+               ew32(EECD, eecd);
+               e1e_flush();
+               udelay(nvm->delay_usec);
+       }
+}
+
+/**
+ *  e1000_stop_nvm - Terminate EEPROM command
+ *  @hw: pointer to the HW structure
+ *
+ *  Terminates the current command by inverting the EEPROM's chip select pin.
+ **/
+static void e1000_stop_nvm(struct e1000_hw *hw)
+{
+       u32 eecd;
+
+       eecd = er32(EECD);
+       if (hw->nvm.type == e1000_nvm_eeprom_spi) {
+               /* Pull CS high */
+               eecd |= E1000_EECD_CS;
+               e1000_lower_eec_clk(hw, &eecd);
+       }
+}
+
+/**
+ *  e1000e_release_nvm - Release exclusive access to EEPROM
+ *  @hw: pointer to the HW structure
+ *
+ *  Stop any current commands to the EEPROM and clear the EEPROM request bit.
+ **/
+void e1000e_release_nvm(struct e1000_hw *hw)
+{
+       u32 eecd;
+
+       e1000_stop_nvm(hw);
+
+       eecd = er32(EECD);
+       eecd &= ~E1000_EECD_REQ;
+       ew32(EECD, eecd);
+}
+
+/**
+ *  e1000_ready_nvm_eeprom - Prepares EEPROM for read/write
+ *  @hw: pointer to the HW structure
+ *
+ *  Setups the EEPROM for reading and writing.
+ **/
+static s32 e1000_ready_nvm_eeprom(struct e1000_hw *hw)
+{
+       struct e1000_nvm_info *nvm = &hw->nvm;
+       u32 eecd = er32(EECD);
+       u8 spi_stat_reg;
+
+       if (nvm->type == e1000_nvm_eeprom_spi) {
+               u16 timeout = NVM_MAX_RETRY_SPI;
+
+               /* Clear SK and CS */
+               eecd &= ~(E1000_EECD_CS | E1000_EECD_SK);
+               ew32(EECD, eecd);
+               e1e_flush();
+               udelay(1);
+
+               /*
+                * Read "Status Register" repeatedly until the LSB is cleared.
+                * The EEPROM will signal that the command has been completed
+                * by clearing bit 0 of the internal status register.  If it's
+                * not cleared within 'timeout', then error out.
+                */
+               while (timeout) {
+                       e1000_shift_out_eec_bits(hw, NVM_RDSR_OPCODE_SPI,
+                                                hw->nvm.opcode_bits);
+                       spi_stat_reg = (u8)e1000_shift_in_eec_bits(hw, 8);
+                       if (!(spi_stat_reg & NVM_STATUS_RDY_SPI))
+                               break;
+
+                       udelay(5);
+                       e1000_standby_nvm(hw);
+                       timeout--;
+               }
+
+               if (!timeout) {
+                       e_dbg("SPI NVM Status error\n");
+                       return -E1000_ERR_NVM;
+               }
+       }
+
+       return 0;
+}
+
+/**
+ *  e1000e_read_nvm_eerd - Reads EEPROM using EERD register
+ *  @hw: pointer to the HW structure
+ *  @offset: offset of word in the EEPROM to read
+ *  @words: number of words to read
+ *  @data: word read from the EEPROM
+ *
+ *  Reads a 16 bit word from the EEPROM using the EERD register.
+ **/
+s32 e1000e_read_nvm_eerd(struct e1000_hw *hw, u16 offset, u16 words, u16 *data)
+{
+       struct e1000_nvm_info *nvm = &hw->nvm;
+       u32 i, eerd = 0;
+       s32 ret_val = 0;
+
+       /*
+        * A check for invalid values:  offset too large, too many words,
+        * too many words for the offset, and not enough words.
+        */
+       if ((offset >= nvm->word_size) || (words > (nvm->word_size - offset)) ||
+           (words == 0)) {
+               e_dbg("nvm parameter(s) out of bounds\n");
+               return -E1000_ERR_NVM;
+       }
+
+       for (i = 0; i < words; i++) {
+               eerd = ((offset + i) << E1000_NVM_RW_ADDR_SHIFT) +
+                   E1000_NVM_RW_REG_START;
+
+               ew32(EERD, eerd);
+               ret_val = e1000e_poll_eerd_eewr_done(hw, E1000_NVM_POLL_READ);
+               if (ret_val)
+                       break;
+
+               data[i] = (er32(EERD) >> E1000_NVM_RW_REG_DATA);
+       }
+
+       return ret_val;
+}
+
+/**
+ *  e1000e_write_nvm_spi - Write to EEPROM using SPI
+ *  @hw: pointer to the HW structure
+ *  @offset: offset within the EEPROM to be written to
+ *  @words: number of words to write
+ *  @data: 16 bit word(s) to be written to the EEPROM
+ *
+ *  Writes data to EEPROM at offset using SPI interface.
+ *
+ *  If e1000e_update_nvm_checksum is not called after this function , the
+ *  EEPROM will most likely contain an invalid checksum.
+ **/
+s32 e1000e_write_nvm_spi(struct e1000_hw *hw, u16 offset, u16 words, u16 *data)
+{
+       struct e1000_nvm_info *nvm = &hw->nvm;
+       s32 ret_val;
+       u16 widx = 0;
+
+       /*
+        * A check for invalid values:  offset too large, too many words,
+        * and not enough words.
+        */
+       if ((offset >= nvm->word_size) || (words > (nvm->word_size - offset)) ||
+           (words == 0)) {
+               e_dbg("nvm parameter(s) out of bounds\n");
+               return -E1000_ERR_NVM;
+       }
+
+       ret_val = nvm->ops.acquire(hw);
+       if (ret_val)
+               return ret_val;
+
+       while (widx < words) {
+               u8 write_opcode = NVM_WRITE_OPCODE_SPI;
+
+               ret_val = e1000_ready_nvm_eeprom(hw);
+               if (ret_val)
+                       goto release;
+
+               e1000_standby_nvm(hw);
+
+               /* Send the WRITE ENABLE command (8 bit opcode) */
+               e1000_shift_out_eec_bits(hw, NVM_WREN_OPCODE_SPI,
+                                        nvm->opcode_bits);
+
+               e1000_standby_nvm(hw);
+
+               /*
+                * Some SPI eeproms use the 8th address bit embedded in the
+                * opcode
+                */
+               if ((nvm->address_bits == 8) && (offset >= 128))
+                       write_opcode |= NVM_A8_OPCODE_SPI;
+
+               /* Send the Write command (8-bit opcode + addr) */
+               e1000_shift_out_eec_bits(hw, write_opcode, nvm->opcode_bits);
+               e1000_shift_out_eec_bits(hw, (u16)((offset + widx) * 2),
+                                        nvm->address_bits);
+
+               /* Loop to allow for up to whole page write of eeprom */
+               while (widx < words) {
+                       u16 word_out = data[widx];
+                       word_out = (word_out >> 8) | (word_out << 8);
+                       e1000_shift_out_eec_bits(hw, word_out, 16);
+                       widx++;
+
+                       if ((((offset + widx) * 2) % nvm->page_size) == 0) {
+                               e1000_standby_nvm(hw);
+                               break;
+                       }
+               }
+       }
+
+       usleep_range(10000, 20000);
+release:
+       nvm->ops.release(hw);
+
+       return ret_val;
+}
+
+/**
+ *  e1000_read_pba_string_generic - Read device part number
+ *  @hw: pointer to the HW structure
+ *  @pba_num: pointer to device part number
+ *  @pba_num_size: size of part number buffer
+ *
+ *  Reads the product board assembly (PBA) number from the EEPROM and stores
+ *  the value in pba_num.
+ **/
+s32 e1000_read_pba_string_generic(struct e1000_hw *hw, u8 *pba_num,
+                                 u32 pba_num_size)
+{
+       s32 ret_val;
+       u16 nvm_data;
+       u16 pba_ptr;
+       u16 offset;
+       u16 length;
+
+       if (pba_num == NULL) {
+               e_dbg("PBA string buffer was null\n");
+               return -E1000_ERR_INVALID_ARGUMENT;
+       }
+
+       ret_val = e1000_read_nvm(hw, NVM_PBA_OFFSET_0, 1, &nvm_data);
+       if (ret_val) {
+               e_dbg("NVM Read Error\n");
+               return ret_val;
+       }
+
+       ret_val = e1000_read_nvm(hw, NVM_PBA_OFFSET_1, 1, &pba_ptr);
+       if (ret_val) {
+               e_dbg("NVM Read Error\n");
+               return ret_val;
+       }
+
+       /*
+        * if nvm_data is not ptr guard the PBA must be in legacy format which
+        * means pba_ptr is actually our second data word for the PBA number
+        * and we can decode it into an ascii string
+        */
+       if (nvm_data != NVM_PBA_PTR_GUARD) {
+               e_dbg("NVM PBA number is not stored as string\n");
+
+               /* we will need 11 characters to store the PBA */
+               if (pba_num_size < 11) {
+                       e_dbg("PBA string buffer too small\n");
+                       return E1000_ERR_NO_SPACE;
+               }
+
+               /* extract hex string from data and pba_ptr */
+               pba_num[0] = (nvm_data >> 12) & 0xF;
+               pba_num[1] = (nvm_data >> 8) & 0xF;
+               pba_num[2] = (nvm_data >> 4) & 0xF;
+               pba_num[3] = nvm_data & 0xF;
+               pba_num[4] = (pba_ptr >> 12) & 0xF;
+               pba_num[5] = (pba_ptr >> 8) & 0xF;
+               pba_num[6] = '-';
+               pba_num[7] = 0;
+               pba_num[8] = (pba_ptr >> 4) & 0xF;
+               pba_num[9] = pba_ptr & 0xF;
+
+               /* put a null character on the end of our string */
+               pba_num[10] = '\0';
+
+               /* switch all the data but the '-' to hex char */
+               for (offset = 0; offset < 10; offset++) {
+                       if (pba_num[offset] < 0xA)
+                               pba_num[offset] += '0';
+                       else if (pba_num[offset] < 0x10)
+                               pba_num[offset] += 'A' - 0xA;
+               }
+
+               return 0;
+       }
+
+       ret_val = e1000_read_nvm(hw, pba_ptr, 1, &length);
+       if (ret_val) {
+               e_dbg("NVM Read Error\n");
+               return ret_val;
+       }
+
+       if (length == 0xFFFF || length == 0) {
+               e_dbg("NVM PBA number section invalid length\n");
+               return -E1000_ERR_NVM_PBA_SECTION;
+       }
+       /* check if pba_num buffer is big enough */
+       if (pba_num_size < (((u32)length * 2) - 1)) {
+               e_dbg("PBA string buffer too small\n");
+               return -E1000_ERR_NO_SPACE;
+       }
+
+       /* trim pba length from start of string */
+       pba_ptr++;
+       length--;
+
+       for (offset = 0; offset < length; offset++) {
+               ret_val = e1000_read_nvm(hw, pba_ptr + offset, 1, &nvm_data);
+               if (ret_val) {
+                       e_dbg("NVM Read Error\n");
+                       return ret_val;
+               }
+               pba_num[offset * 2] = (u8)(nvm_data >> 8);
+               pba_num[(offset * 2) + 1] = (u8)(nvm_data & 0xFF);
+       }
+       pba_num[offset * 2] = '\0';
+
+       return 0;
+}
+
+/**
+ *  e1000_read_mac_addr_generic - Read device MAC address
+ *  @hw: pointer to the HW structure
+ *
+ *  Reads the device MAC address from the EEPROM and stores the value.
+ *  Since devices with two ports use the same EEPROM, we increment the
+ *  last bit in the MAC address for the second port.
+ **/
+s32 e1000_read_mac_addr_generic(struct e1000_hw *hw)
+{
+       u32 rar_high;
+       u32 rar_low;
+       u16 i;
+
+       rar_high = er32(RAH(0));
+       rar_low = er32(RAL(0));
+
+       for (i = 0; i < E1000_RAL_MAC_ADDR_LEN; i++)
+               hw->mac.perm_addr[i] = (u8)(rar_low >> (i * 8));
+
+       for (i = 0; i < E1000_RAH_MAC_ADDR_LEN; i++)
+               hw->mac.perm_addr[i + 4] = (u8)(rar_high >> (i * 8));
+
+       for (i = 0; i < ETH_ALEN; i++)
+               hw->mac.addr[i] = hw->mac.perm_addr[i];
+
+       return 0;
+}
+
+/**
+ *  e1000e_validate_nvm_checksum_generic - Validate EEPROM checksum
+ *  @hw: pointer to the HW structure
+ *
+ *  Calculates the EEPROM checksum by reading/adding each word of the EEPROM
+ *  and then verifies that the sum of the EEPROM is equal to 0xBABA.
+ **/
+s32 e1000e_validate_nvm_checksum_generic(struct e1000_hw *hw)
+{
+       s32 ret_val;
+       u16 checksum = 0;
+       u16 i, nvm_data;
+
+       for (i = 0; i < (NVM_CHECKSUM_REG + 1); i++) {
+               ret_val = e1000_read_nvm(hw, i, 1, &nvm_data);
+               if (ret_val) {
+                       e_dbg("NVM Read Error\n");
+                       return ret_val;
+               }
+               checksum += nvm_data;
+       }
+
+       if (checksum != (u16)NVM_SUM) {
+               e_dbg("NVM Checksum Invalid\n");
+               return -E1000_ERR_NVM;
+       }
+
+       return 0;
+}
+
+/**
+ *  e1000e_update_nvm_checksum_generic - Update EEPROM checksum
+ *  @hw: pointer to the HW structure
+ *
+ *  Updates the EEPROM checksum by reading/adding each word of the EEPROM
+ *  up to the checksum.  Then calculates the EEPROM checksum and writes the
+ *  value to the EEPROM.
+ **/
+s32 e1000e_update_nvm_checksum_generic(struct e1000_hw *hw)
+{
+       s32 ret_val;
+       u16 checksum = 0;
+       u16 i, nvm_data;
+
+       for (i = 0; i < NVM_CHECKSUM_REG; i++) {
+               ret_val = e1000_read_nvm(hw, i, 1, &nvm_data);
+               if (ret_val) {
+                       e_dbg("NVM Read Error while updating checksum.\n");
+                       return ret_val;
+               }
+               checksum += nvm_data;
+       }
+       checksum = (u16)NVM_SUM - checksum;
+       ret_val = e1000_write_nvm(hw, NVM_CHECKSUM_REG, 1, &checksum);
+       if (ret_val)
+               e_dbg("NVM Write Error while updating checksum.\n");
+
+       return ret_val;
+}
+
+/**
+ *  e1000e_reload_nvm_generic - Reloads EEPROM
+ *  @hw: pointer to the HW structure
+ *
+ *  Reloads the EEPROM by setting the "Reinitialize from EEPROM" bit in the
+ *  extended control register.
+ **/
+void e1000e_reload_nvm_generic(struct e1000_hw *hw)
+{
+       u32 ctrl_ext;
+
+       udelay(10);
+       ctrl_ext = er32(CTRL_EXT);
+       ctrl_ext |= E1000_CTRL_EXT_EE_RST;
+       ew32(CTRL_EXT, ctrl_ext);
+       e1e_flush();
+}
index 20e93b0..ff796e4 100644 (file)
@@ -1,7 +1,7 @@
 /*******************************************************************************
 
   Intel PRO/1000 Linux driver
-  Copyright(c) 1999 - 2011 Intel Corporation.
+  Copyright(c) 1999 - 2012 Intel Corporation.
 
   This program is free software; you can redistribute it and/or modify it
   under the terms and conditions of the GNU General Public License,
@@ -113,11 +113,20 @@ E1000_PARAM(InterruptThrottleRate, "Interrupt Throttling Rate");
 #define MAX_ITR 100000
 #define MIN_ITR 100
 
-/* IntMode (Interrupt Mode)
+/*
+ * IntMode (Interrupt Mode)
+ *
+ * Valid Range: varies depending on kernel configuration & hardware support
+ *
+ * legacy=0, MSI=1, MSI-X=2
  *
- * Valid Range: 0 - 2
+ * When MSI/MSI-X support is enabled in kernel-
+ *   Default Value: 2 (MSI-X) when supported by hardware, 1 (MSI) otherwise
+ * When MSI/MSI-X support is not enabled in kernel-
+ *   Default Value: 0 (legacy)
  *
- * Default Value: 2 (MSI-X)
+ * When a mode is specified that is not allowed/supported, it will be
+ * demoted to the most advanced interrupt mode available.
  */
 E1000_PARAM(IntMode, "Interrupt Mode");
 #define MAX_INTMODE    2
@@ -388,12 +397,33 @@ void __devinit e1000e_check_options(struct e1000_adapter *adapter)
                static struct e1000_option opt = {
                        .type = range_option,
                        .name = "Interrupt Mode",
-                       .err  = "defaulting to 2 (MSI-X)",
-                       .def  = E1000E_INT_MODE_MSIX,
-                       .arg  = { .r = { .min = MIN_INTMODE,
-                                        .max = MAX_INTMODE } }
+#ifndef CONFIG_PCI_MSI
+                       .err  = "defaulting to 0 (legacy)",
+                       .def  = E1000E_INT_MODE_LEGACY,
+                       .arg  = { .r = { .min = 0,
+                                        .max = 0 } }
+#endif
                };
 
+#ifdef CONFIG_PCI_MSI
+               if (adapter->flags & FLAG_HAS_MSIX) {
+                       opt.err = kstrdup("defaulting to 2 (MSI-X)",
+                                         GFP_KERNEL);
+                       opt.def = E1000E_INT_MODE_MSIX;
+                       opt.arg.r.max = E1000E_INT_MODE_MSIX;
+               } else {
+                       opt.err = kstrdup("defaulting to 1 (MSI)", GFP_KERNEL);
+                       opt.def = E1000E_INT_MODE_MSI;
+                       opt.arg.r.max = E1000E_INT_MODE_MSI;
+               }
+
+               if (!opt.err) {
+                       dev_err(&adapter->pdev->dev,
+                               "Failed to allocate memory\n");
+                       return;
+               }
+#endif
+
                if (num_IntMode > bd) {
                        unsigned int int_mode = IntMode[bd];
                        e1000_validate_option(&int_mode, &opt, adapter);
@@ -401,6 +431,10 @@ void __devinit e1000e_check_options(struct e1000_adapter *adapter)
                } else {
                        adapter->int_mode = opt.def;
                }
+
+#ifdef CONFIG_PCI_MSI
+               kfree(opt.err);
+#endif
        }
        { /* Smart Power Down */
                static const struct e1000_option opt = {
@@ -429,10 +463,13 @@ void __devinit e1000e_check_options(struct e1000_adapter *adapter)
                if (num_CrcStripping > bd) {
                        unsigned int crc_stripping = CrcStripping[bd];
                        e1000_validate_option(&crc_stripping, &opt, adapter);
-                       if (crc_stripping == OPTION_ENABLED)
+                       if (crc_stripping == OPTION_ENABLED) {
                                adapter->flags2 |= FLAG2_CRC_STRIPPING;
+                               adapter->flags2 |= FLAG2_DFLT_CRC_STRIPPING;
+                       }
                } else {
                        adapter->flags2 |= FLAG2_CRC_STRIPPING;
+                       adapter->flags2 |= FLAG2_DFLT_CRC_STRIPPING;
                }
        }
        { /* Kumeran Lock Loss Workaround */
index 8666476..35b4557 100644 (file)
@@ -1,7 +1,7 @@
 /*******************************************************************************
 
   Intel PRO/1000 Linux driver
-  Copyright(c) 1999 - 2011 Intel Corporation.
+  Copyright(c) 1999 - 2012 Intel Corporation.
 
   This program is free software; you can redistribute it and/or modify it
   under the terms and conditions of the GNU General Public License,
@@ -26,8 +26,6 @@
 
 *******************************************************************************/
 
-#include <linux/delay.h>
-
 #include "e1000.h"
 
 static s32 e1000_get_phy_cfg_done(struct e1000_hw *hw);
@@ -132,30 +130,30 @@ s32 e1000e_get_phy_id(struct e1000_hw *hw)
        u16 phy_id;
        u16 retry_count = 0;
 
-       if (!(phy->ops.read_reg))
-               goto out;
+       if (!phy->ops.read_reg)
+               return 0;
 
        while (retry_count < 2) {
                ret_val = e1e_rphy(hw, PHY_ID1, &phy_id);
                if (ret_val)
-                       goto out;
+                       return ret_val;
 
                phy->id = (u32)(phy_id << 16);
                udelay(20);
                ret_val = e1e_rphy(hw, PHY_ID2, &phy_id);
                if (ret_val)
-                       goto out;
+                       return ret_val;
 
                phy->id |= (u32)(phy_id & PHY_REVISION_MASK);
                phy->revision = (u32)(phy_id & ~PHY_REVISION_MASK);
 
                if (phy->id != 0 && phy->id != PHY_REVISION_MASK)
-                       goto out;
+                       return 0;
 
                retry_count++;
        }
-out:
-       return ret_val;
+
+       return 0;
 }
 
 /**
@@ -382,29 +380,25 @@ static s32 __e1000e_read_phy_reg_igp(struct e1000_hw *hw, u32 offset, u16 *data,
        s32 ret_val = 0;
 
        if (!locked) {
-               if (!(hw->phy.ops.acquire))
-                       goto out;
+               if (!hw->phy.ops.acquire)
+                       return 0;
 
                ret_val = hw->phy.ops.acquire(hw);
                if (ret_val)
-                       goto out;
+                       return ret_val;
        }
 
-       if (offset > MAX_PHY_MULTI_PAGE_REG) {
+       if (offset > MAX_PHY_MULTI_PAGE_REG)
                ret_val = e1000e_write_phy_reg_mdic(hw,
                                                    IGP01E1000_PHY_PAGE_SELECT,
                                                    (u16)offset);
-               if (ret_val)
-                       goto release;
-       }
-
-       ret_val = e1000e_read_phy_reg_mdic(hw, MAX_PHY_REG_ADDRESS & offset,
-                                         data);
-
-release:
+       if (!ret_val)
+               ret_val = e1000e_read_phy_reg_mdic(hw,
+                                                  MAX_PHY_REG_ADDRESS & offset,
+                                                  data);
        if (!locked)
                hw->phy.ops.release(hw);
-out:
+
        return ret_val;
 }
 
@@ -453,30 +447,25 @@ static s32 __e1000e_write_phy_reg_igp(struct e1000_hw *hw, u32 offset, u16 data,
        s32 ret_val = 0;
 
        if (!locked) {
-               if (!(hw->phy.ops.acquire))
-                       goto out;
+               if (!hw->phy.ops.acquire)
+                       return 0;
 
                ret_val = hw->phy.ops.acquire(hw);
                if (ret_val)
-                       goto out;
+                       return ret_val;
        }
 
-       if (offset > MAX_PHY_MULTI_PAGE_REG) {
+       if (offset > MAX_PHY_MULTI_PAGE_REG)
                ret_val = e1000e_write_phy_reg_mdic(hw,
                                                    IGP01E1000_PHY_PAGE_SELECT,
                                                    (u16)offset);
-               if (ret_val)
-                       goto release;
-       }
-
-       ret_val = e1000e_write_phy_reg_mdic(hw, MAX_PHY_REG_ADDRESS & offset,
-                                           data);
-
-release:
+       if (!ret_val)
+               ret_val = e1000e_write_phy_reg_mdic(hw, MAX_PHY_REG_ADDRESS &
+                                                       offset,
+                                                   data);
        if (!locked)
                hw->phy.ops.release(hw);
 
-out:
        return ret_val;
 }
 
@@ -523,15 +512,16 @@ static s32 __e1000_read_kmrn_reg(struct e1000_hw *hw, u32 offset, u16 *data,
                                  bool locked)
 {
        u32 kmrnctrlsta;
-       s32 ret_val = 0;
 
        if (!locked) {
-               if (!(hw->phy.ops.acquire))
-                       goto out;
+               s32 ret_val = 0;
+
+               if (!hw->phy.ops.acquire)
+                       return 0;
 
                ret_val = hw->phy.ops.acquire(hw);
                if (ret_val)
-                       goto out;
+                       return ret_val;
        }
 
        kmrnctrlsta = ((offset << E1000_KMRNCTRLSTA_OFFSET_SHIFT) &
@@ -547,8 +537,7 @@ static s32 __e1000_read_kmrn_reg(struct e1000_hw *hw, u32 offset, u16 *data,
        if (!locked)
                hw->phy.ops.release(hw);
 
-out:
-       return ret_val;
+       return 0;
 }
 
 /**
@@ -596,15 +585,16 @@ static s32 __e1000_write_kmrn_reg(struct e1000_hw *hw, u32 offset, u16 data,
                                   bool locked)
 {
        u32 kmrnctrlsta;
-       s32 ret_val = 0;
 
        if (!locked) {
-               if (!(hw->phy.ops.acquire))
-                       goto out;
+               s32 ret_val = 0;
+
+               if (!hw->phy.ops.acquire)
+                       return 0;
 
                ret_val = hw->phy.ops.acquire(hw);
                if (ret_val)
-                       goto out;
+                       return ret_val;
        }
 
        kmrnctrlsta = ((offset << E1000_KMRNCTRLSTA_OFFSET_SHIFT) &
@@ -617,8 +607,7 @@ static s32 __e1000_write_kmrn_reg(struct e1000_hw *hw, u32 offset, u16 data,
        if (!locked)
                hw->phy.ops.release(hw);
 
-out:
-       return ret_val;
+       return 0;
 }
 
 /**
@@ -663,17 +652,14 @@ s32 e1000_copper_link_setup_82577(struct e1000_hw *hw)
        /* Enable CRS on Tx. This must be set for half-duplex operation. */
        ret_val = e1e_rphy(hw, I82577_CFG_REG, &phy_data);
        if (ret_val)
-               goto out;
+               return ret_val;
 
        phy_data |= I82577_CFG_ASSERT_CRS_ON_TX;
 
        /* Enable downshift */
        phy_data |= I82577_CFG_ENABLE_DOWNSHIFT;
 
-       ret_val = e1e_wphy(hw, I82577_CFG_REG, phy_data);
-
-out:
-       return ret_val;
+       return e1e_wphy(hw, I82577_CFG_REG, phy_data);
 }
 
 /**
@@ -1019,12 +1005,12 @@ static s32 e1000_phy_setup_autoneg(struct e1000_hw *hw)
         * The possible values of the "fc" parameter are:
         *      0:  Flow control is completely disabled
         *      1:  Rx flow control is enabled (we can receive pause frames
-        *        but not send pause frames).
+        *          but not send pause frames).
         *      2:  Tx flow control is enabled (we can send pause frames
-        *        but we do not support receiving pause frames).
+        *          but we do not support receiving pause frames).
         *      3:  Both Rx and Tx flow control (symmetric) are enabled.
         *  other:  No software override.  The flow control configuration
-        *        in the EEPROM is used.
+        *          in the EEPROM is used.
         */
        switch (hw->fc.current_mode) {
        case e1000_fc_none:
@@ -1064,8 +1050,7 @@ static s32 e1000_phy_setup_autoneg(struct e1000_hw *hw)
                break;
        default:
                e_dbg("Flow control param set incorrectly\n");
-               ret_val = -E1000_ERR_CONFIG;
-               return ret_val;
+               return -E1000_ERR_CONFIG;
        }
 
        ret_val = e1e_wphy(hw, PHY_AUTONEG_ADV, mii_autoneg_adv_reg);
@@ -1136,13 +1121,12 @@ static s32 e1000_copper_link_autoneg(struct e1000_hw *hw)
        if (phy->autoneg_wait_to_complete) {
                ret_val = e1000_wait_autoneg(hw);
                if (ret_val) {
-                       e_dbg("Error while waiting for "
-                                "autoneg to complete\n");
+                       e_dbg("Error while waiting for autoneg to complete\n");
                        return ret_val;
                }
        }
 
-       hw->mac.get_link_status = 1;
+       hw->mac.get_link_status = true;
 
        return ret_val;
 }
@@ -1186,16 +1170,14 @@ s32 e1000e_setup_copper_link(struct e1000_hw *hw)
         * Check link status. Wait up to 100 microseconds for link to become
         * valid.
         */
-       ret_val = e1000e_phy_has_link_generic(hw,
-                                            COPPER_LINK_UP_LIMIT,
-                                            10,
-                                            &link);
+       ret_val = e1000e_phy_has_link_generic(hw, COPPER_LINK_UP_LIMIT, 10,
+                                             &link);
        if (ret_val)
                return ret_val;
 
        if (link) {
                e_dbg("Valid link established!!!\n");
-               e1000e_config_collision_dist(hw);
+               hw->mac.ops.config_collision_dist(hw);
                ret_val = e1000e_config_fc_after_link_up(hw);
        } else {
                e_dbg("Unable to establish link!!!\n");
@@ -1251,10 +1233,8 @@ s32 e1000e_phy_force_speed_duplex_igp(struct e1000_hw *hw)
        if (phy->autoneg_wait_to_complete) {
                e_dbg("Waiting for forced speed/duplex link on IGP phy.\n");
 
-               ret_val = e1000e_phy_has_link_generic(hw,
-                                                    PHY_FORCE_LIMIT,
-                                                    100000,
-                                                    &link);
+               ret_val = e1000e_phy_has_link_generic(hw, PHY_FORCE_LIMIT,
+                                                     100000, &link);
                if (ret_val)
                        return ret_val;
 
@@ -1262,12 +1242,8 @@ s32 e1000e_phy_force_speed_duplex_igp(struct e1000_hw *hw)
                        e_dbg("Link taking longer than expected.\n");
 
                /* Try once more */
-               ret_val = e1000e_phy_has_link_generic(hw,
-                                                    PHY_FORCE_LIMIT,
-                                                    100000,
-                                                    &link);
-               if (ret_val)
-                       return ret_val;
+               ret_val = e1000e_phy_has_link_generic(hw, PHY_FORCE_LIMIT,
+                                                     100000, &link);
        }
 
        return ret_val;
@@ -1401,25 +1377,25 @@ s32 e1000_phy_force_speed_duplex_ife(struct e1000_hw *hw)
 
        ret_val = e1e_rphy(hw, PHY_CONTROL, &data);
        if (ret_val)
-               goto out;
+               return ret_val;
 
        e1000e_phy_force_speed_duplex_setup(hw, &data);
 
        ret_val = e1e_wphy(hw, PHY_CONTROL, data);
        if (ret_val)
-               goto out;
+               return ret_val;
 
        /* Disable MDI-X support for 10/100 */
        ret_val = e1e_rphy(hw, IFE_PHY_MDIX_CONTROL, &data);
        if (ret_val)
-               goto out;
+               return ret_val;
 
        data &= ~IFE_PMC_AUTO_MDIX;
        data &= ~IFE_PMC_FORCE_MDIX;
 
        ret_val = e1e_wphy(hw, IFE_PHY_MDIX_CONTROL, data);
        if (ret_val)
-               goto out;
+               return ret_val;
 
        e_dbg("IFE PMC: %X\n", data);
 
@@ -1428,27 +1404,22 @@ s32 e1000_phy_force_speed_duplex_ife(struct e1000_hw *hw)
        if (phy->autoneg_wait_to_complete) {
                e_dbg("Waiting for forced speed/duplex link on IFE phy.\n");
 
-               ret_val = e1000e_phy_has_link_generic(hw,
-                                                    PHY_FORCE_LIMIT,
-                                                    100000,
-                                                    &link);
+               ret_val = e1000e_phy_has_link_generic(hw, PHY_FORCE_LIMIT,
+                                                     100000, &link);
                if (ret_val)
-                       goto out;
+                       return ret_val;
 
                if (!link)
                        e_dbg("Link taking longer than expected.\n");
 
                /* Try once more */
-               ret_val = e1000e_phy_has_link_generic(hw,
-                                                    PHY_FORCE_LIMIT,
-                                                    100000,
-                                                    &link);
+               ret_val = e1000e_phy_has_link_generic(hw, PHY_FORCE_LIMIT,
+                                                     100000, &link);
                if (ret_val)
-                       goto out;
+                       return ret_val;
        }
 
-out:
-       return ret_val;
+       return 0;
 }
 
 /**
@@ -1506,7 +1477,7 @@ void e1000e_phy_force_speed_duplex_setup(struct e1000_hw *hw, u16 *phy_ctrl)
                e_dbg("Forcing 10mb\n");
        }
 
-       e1000e_config_collision_dist(hw);
+       hw->mac.ops.config_collision_dist(hw);
 
        ew32(CTRL, ctrl);
 }
@@ -1833,22 +1804,20 @@ s32 e1000e_get_cable_length_m88(struct e1000_hw *hw)
 
        ret_val = e1e_rphy(hw, M88E1000_PHY_SPEC_STATUS, &phy_data);
        if (ret_val)
-               goto out;
+               return ret_val;
 
        index = (phy_data & M88E1000_PSSR_CABLE_LENGTH) >>
                M88E1000_PSSR_CABLE_LENGTH_SHIFT;
-       if (index >= M88E1000_CABLE_LENGTH_TABLE_SIZE - 1) {
-               ret_val = -E1000_ERR_PHY;
-               goto out;
-       }
+
+       if (index >= M88E1000_CABLE_LENGTH_TABLE_SIZE - 1)
+               return -E1000_ERR_PHY;
 
        phy->min_cable_length = e1000_m88_cable_length_table[index];
        phy->max_cable_length = e1000_m88_cable_length_table[index + 1];
 
        phy->cable_length = (phy->min_cable_length + phy->max_cable_length) / 2;
 
-out:
-       return ret_val;
+       return 0;
 }
 
 /**
@@ -1918,7 +1887,7 @@ s32 e1000e_get_cable_length_igp_2(struct e1000_hw *hw)
 
        phy->cable_length = (phy->min_cable_length + phy->max_cable_length) / 2;
 
-       return ret_val;
+       return 0;
 }
 
 /**
@@ -2073,24 +2042,23 @@ s32 e1000_get_phy_info_ife(struct e1000_hw *hw)
 
        ret_val = e1000e_phy_has_link_generic(hw, 1, 0, &link);
        if (ret_val)
-               goto out;
+               return ret_val;
 
        if (!link) {
                e_dbg("Phy info is only valid if link is up\n");
-               ret_val = -E1000_ERR_CONFIG;
-               goto out;
+               return -E1000_ERR_CONFIG;
        }
 
        ret_val = e1e_rphy(hw, IFE_PHY_SPECIAL_CONTROL, &data);
        if (ret_val)
-               goto out;
+               return ret_val;
        phy->polarity_correction = (data & IFE_PSC_AUTO_POLARITY_DISABLE)
                                   ? false : true;
 
        if (phy->polarity_correction) {
                ret_val = e1000_check_polarity_ife(hw);
                if (ret_val)
-                       goto out;
+                       return ret_val;
        } else {
                /* Polarity is forced */
                phy->cable_polarity = (data & IFE_PSC_FORCE_POLARITY)
@@ -2100,7 +2068,7 @@ s32 e1000_get_phy_info_ife(struct e1000_hw *hw)
 
        ret_val = e1e_rphy(hw, IFE_PHY_MDIX_CONTROL, &data);
        if (ret_val)
-               goto out;
+               return ret_val;
 
        phy->is_mdix = (data & IFE_PMC_MDIX_STATUS) ? true : false;
 
@@ -2109,8 +2077,7 @@ s32 e1000_get_phy_info_ife(struct e1000_hw *hw)
        phy->local_rx = e1000_1000t_rx_status_undefined;
        phy->remote_rx = e1000_1000t_rx_status_undefined;
 
-out:
-       return ret_val;
+       return 0;
 }
 
 /**
@@ -2154,7 +2121,7 @@ s32 e1000e_phy_hw_reset_generic(struct e1000_hw *hw)
        s32 ret_val;
        u32 ctrl;
 
-       ret_val = e1000_check_reset_block(hw);
+       ret_val = phy->ops.check_reset_block(hw);
        if (ret_val)
                return 0;
 
@@ -2188,6 +2155,7 @@ s32 e1000e_phy_hw_reset_generic(struct e1000_hw *hw)
 s32 e1000e_get_cfg_done(struct e1000_hw *hw)
 {
        mdelay(10);
+
        return 0;
 }
 
@@ -2369,7 +2337,6 @@ enum e1000_phy_type e1000e_get_phy_type_from_id(u32 phy_id)
  **/
 s32 e1000e_determine_phy_address(struct e1000_hw *hw)
 {
-       s32 ret_val = -E1000_ERR_PHY_TYPE;
        u32 phy_addr = 0;
        u32 i;
        enum e1000_phy_type phy_type = e1000_phy_unknown;
@@ -2388,17 +2355,15 @@ s32 e1000e_determine_phy_address(struct e1000_hw *hw)
                         * If phy_type is valid, break - we found our
                         * PHY address
                         */
-                       if (phy_type  != e1000_phy_unknown) {
-                               ret_val = 0;
-                               goto out;
-                       }
+                       if (phy_type  != e1000_phy_unknown)
+                               return 0;
+
                        usleep_range(1000, 2000);
                        i++;
                } while (i < 10);
        }
 
-out:
-       return ret_val;
+       return -E1000_ERR_PHY_TYPE;
 }
 
 /**
@@ -2439,7 +2404,7 @@ s32 e1000e_write_phy_reg_bm(struct e1000_hw *hw, u32 offset, u16 data)
        if (page == BM_WUC_PAGE) {
                ret_val = e1000_access_phy_wakeup_reg_bm(hw, offset, &data,
                                                         false, false);
-               goto out;
+               goto release;
        }
 
        hw->phy.addr = e1000_get_phy_addr_for_bm_page(page, offset);
@@ -2464,13 +2429,13 @@ s32 e1000e_write_phy_reg_bm(struct e1000_hw *hw, u32 offset, u16 data)
                ret_val = e1000e_write_phy_reg_mdic(hw, page_select,
                                                    (page << page_shift));
                if (ret_val)
-                       goto out;
+                       goto release;
        }
 
        ret_val = e1000e_write_phy_reg_mdic(hw, MAX_PHY_REG_ADDRESS & offset,
                                            data);
 
-out:
+release:
        hw->phy.ops.release(hw);
        return ret_val;
 }
@@ -2498,7 +2463,7 @@ s32 e1000e_read_phy_reg_bm(struct e1000_hw *hw, u32 offset, u16 *data)
        if (page == BM_WUC_PAGE) {
                ret_val = e1000_access_phy_wakeup_reg_bm(hw, offset, data,
                                                         true, false);
-               goto out;
+               goto release;
        }
 
        hw->phy.addr = e1000_get_phy_addr_for_bm_page(page, offset);
@@ -2523,12 +2488,12 @@ s32 e1000e_read_phy_reg_bm(struct e1000_hw *hw, u32 offset, u16 *data)
                ret_val = e1000e_write_phy_reg_mdic(hw, page_select,
                                                    (page << page_shift));
                if (ret_val)
-                       goto out;
+                       goto release;
        }
 
        ret_val = e1000e_read_phy_reg_mdic(hw, MAX_PHY_REG_ADDRESS & offset,
                                           data);
-out:
+release:
        hw->phy.ops.release(hw);
        return ret_val;
 }
@@ -2556,7 +2521,7 @@ s32 e1000e_read_phy_reg_bm2(struct e1000_hw *hw, u32 offset, u16 *data)
        if (page == BM_WUC_PAGE) {
                ret_val = e1000_access_phy_wakeup_reg_bm(hw, offset, data,
                                                         true, false);
-               goto out;
+               goto release;
        }
 
        hw->phy.addr = 1;
@@ -2568,12 +2533,12 @@ s32 e1000e_read_phy_reg_bm2(struct e1000_hw *hw, u32 offset, u16 *data)
                                                    page);
 
                if (ret_val)
-                       goto out;
+                       goto release;
        }
 
        ret_val = e1000e_read_phy_reg_mdic(hw, MAX_PHY_REG_ADDRESS & offset,
                                           data);
-out:
+release:
        hw->phy.ops.release(hw);
        return ret_val;
 }
@@ -2600,7 +2565,7 @@ s32 e1000e_write_phy_reg_bm2(struct e1000_hw *hw, u32 offset, u16 data)
        if (page == BM_WUC_PAGE) {
                ret_val = e1000_access_phy_wakeup_reg_bm(hw, offset, &data,
                                                         false, false);
-               goto out;
+               goto release;
        }
 
        hw->phy.addr = 1;
@@ -2611,13 +2576,13 @@ s32 e1000e_write_phy_reg_bm2(struct e1000_hw *hw, u32 offset, u16 data)
                                                    page);
 
                if (ret_val)
-                       goto out;
+                       goto release;
        }
 
        ret_val = e1000e_write_phy_reg_mdic(hw, MAX_PHY_REG_ADDRESS & offset,
                                            data);
 
-out:
+release:
        hw->phy.ops.release(hw);
        return ret_val;
 }
@@ -2642,14 +2607,14 @@ s32 e1000_enable_phy_wakeup_reg_access_bm(struct e1000_hw *hw, u16 *phy_reg)
        ret_val = e1000_set_page_igp(hw, (BM_PORT_CTRL_PAGE << IGP_PAGE_SHIFT));
        if (ret_val) {
                e_dbg("Could not set Port Control page\n");
-               goto out;
+               return ret_val;
        }
 
        ret_val = e1000e_read_phy_reg_mdic(hw, BM_WUC_ENABLE_REG, phy_reg);
        if (ret_val) {
                e_dbg("Could not read PHY register %d.%d\n",
                      BM_PORT_CTRL_PAGE, BM_WUC_ENABLE_REG);
-               goto out;
+               return ret_val;
        }
 
        /*
@@ -2664,15 +2629,14 @@ s32 e1000_enable_phy_wakeup_reg_access_bm(struct e1000_hw *hw, u16 *phy_reg)
        if (ret_val) {
                e_dbg("Could not write PHY register %d.%d\n",
                      BM_PORT_CTRL_PAGE, BM_WUC_ENABLE_REG);
-               goto out;
+               return ret_val;
        }
 
-       /* Select Host Wakeup Registers page */
-       ret_val = e1000_set_page_igp(hw, (BM_WUC_PAGE << IGP_PAGE_SHIFT));
-
-       /* caller now able to write registers on the Wakeup registers page */
-out:
-       return ret_val;
+       /*
+        * Select Host Wakeup Registers page - caller now able to write
+        * registers on the Wakeup registers page
+        */
+       return e1000_set_page_igp(hw, (BM_WUC_PAGE << IGP_PAGE_SHIFT));
 }
 
 /**
@@ -2694,7 +2658,7 @@ s32 e1000_disable_phy_wakeup_reg_access_bm(struct e1000_hw *hw, u16 *phy_reg)
        ret_val = e1000_set_page_igp(hw, (BM_PORT_CTRL_PAGE << IGP_PAGE_SHIFT));
        if (ret_val) {
                e_dbg("Could not set Port Control page\n");
-               goto out;
+               return ret_val;
        }
 
        /* Restore 769.17 to its original value */
@@ -2702,7 +2666,7 @@ s32 e1000_disable_phy_wakeup_reg_access_bm(struct e1000_hw *hw, u16 *phy_reg)
        if (ret_val)
                e_dbg("Could not restore PHY register %d.%d\n",
                      BM_PORT_CTRL_PAGE, BM_WUC_ENABLE_REG);
-out:
+
        return ret_val;
 }
 
@@ -2750,7 +2714,7 @@ static s32 e1000_access_phy_wakeup_reg_bm(struct e1000_hw *hw, u32 offset,
                ret_val = e1000_enable_phy_wakeup_reg_access_bm(hw, &phy_reg);
                if (ret_val) {
                        e_dbg("Could not enable PHY wakeup reg access\n");
-                       goto out;
+                       return ret_val;
                }
        }
 
@@ -2760,7 +2724,7 @@ static s32 e1000_access_phy_wakeup_reg_bm(struct e1000_hw *hw, u32 offset,
        ret_val = e1000e_write_phy_reg_mdic(hw, BM_WUC_ADDRESS_OPCODE, reg);
        if (ret_val) {
                e_dbg("Could not write address opcode to page %d\n", page);
-               goto out;
+               return ret_val;
        }
 
        if (read) {
@@ -2775,13 +2739,12 @@ static s32 e1000_access_phy_wakeup_reg_bm(struct e1000_hw *hw, u32 offset,
 
        if (ret_val) {
                e_dbg("Could not access PHY reg %d.%d\n", page, reg);
-               goto out;
+               return ret_val;
        }
 
        if (!page_set)
                ret_val = e1000_disable_phy_wakeup_reg_access_bm(hw, &phy_reg);
 
-out:
        return ret_val;
 }
 
@@ -3137,7 +3100,7 @@ static s32 e1000_access_phy_debug_regs_hv(struct e1000_hw *hw, u32 offset,
        ret_val = e1000e_write_phy_reg_mdic(hw, addr_reg, (u16)offset & 0x3F);
        if (ret_val) {
                e_dbg("Could not write the Address Offset port register\n");
-               goto out;
+               return ret_val;
        }
 
        /* Read or write the data value next */
@@ -3146,12 +3109,9 @@ static s32 e1000_access_phy_debug_regs_hv(struct e1000_hw *hw, u32 offset,
        else
                ret_val = e1000e_write_phy_reg_mdic(hw, data_reg, *data);
 
-       if (ret_val) {
+       if (ret_val)
                e_dbg("Could not access the Data port register\n");
-               goto out;
-       }
 
-out:
        return ret_val;
 }
 
@@ -3172,39 +3132,34 @@ s32 e1000_link_stall_workaround_hv(struct e1000_hw *hw)
        u16 data;
 
        if (hw->phy.type != e1000_phy_82578)
-               goto out;
+               return 0;
 
        /* Do not apply workaround if in PHY loopback bit 14 set */
        e1e_rphy(hw, PHY_CONTROL, &data);
        if (data & PHY_CONTROL_LB)
-               goto out;
+               return 0;
 
        /* check if link is up and at 1Gbps */
        ret_val = e1e_rphy(hw, BM_CS_STATUS, &data);
        if (ret_val)
-               goto out;
+               return ret_val;
 
-       data &= BM_CS_STATUS_LINK_UP |
-               BM_CS_STATUS_RESOLVED |
-               BM_CS_STATUS_SPEED_MASK;
+       data &= BM_CS_STATUS_LINK_UP | BM_CS_STATUS_RESOLVED |
+               BM_CS_STATUS_SPEED_MASK;
 
-       if (data != (BM_CS_STATUS_LINK_UP |
-                    BM_CS_STATUS_RESOLVED |
-                    BM_CS_STATUS_SPEED_1000))
-               goto out;
+       if (data != (BM_CS_STATUS_LINK_UP | BM_CS_STATUS_RESOLVED |
+                    BM_CS_STATUS_SPEED_1000))
+               return 0;
 
-       mdelay(200);
+       msleep(200);
 
        /* flush the packets in the fifo buffer */
        ret_val = e1e_wphy(hw, HV_MUX_DATA_CTRL, HV_MUX_DATA_CTRL_GEN_TO_MAC |
                           HV_MUX_DATA_CTRL_FORCE_SPEED);
        if (ret_val)
-               goto out;
-
-       ret_val = e1e_wphy(hw, HV_MUX_DATA_CTRL, HV_MUX_DATA_CTRL_GEN_TO_MAC);
+               return ret_val;
 
-out:
-       return ret_val;
+       return e1e_wphy(hw, HV_MUX_DATA_CTRL, HV_MUX_DATA_CTRL_GEN_TO_MAC);
 }
 
 /**
@@ -3246,39 +3201,32 @@ s32 e1000_phy_force_speed_duplex_82577(struct e1000_hw *hw)
 
        ret_val = e1e_rphy(hw, PHY_CONTROL, &phy_data);
        if (ret_val)
-               goto out;
+               return ret_val;
 
        e1000e_phy_force_speed_duplex_setup(hw, &phy_data);
 
        ret_val = e1e_wphy(hw, PHY_CONTROL, phy_data);
        if (ret_val)
-               goto out;
+               return ret_val;
 
        udelay(1);
 
        if (phy->autoneg_wait_to_complete) {
                e_dbg("Waiting for forced speed/duplex link on 82577 phy\n");
 
-               ret_val = e1000e_phy_has_link_generic(hw,
-                                                    PHY_FORCE_LIMIT,
-                                                    100000,
-                                                    &link);
+               ret_val = e1000e_phy_has_link_generic(hw, PHY_FORCE_LIMIT,
+                                                     100000, &link);
                if (ret_val)
-                       goto out;
+                       return ret_val;
 
                if (!link)
                        e_dbg("Link taking longer than expected.\n");
 
                /* Try once more */
-               ret_val = e1000e_phy_has_link_generic(hw,
-                                                    PHY_FORCE_LIMIT,
-                                                    100000,
-                                                    &link);
-               if (ret_val)
-                       goto out;
+               ret_val = e1000e_phy_has_link_generic(hw, PHY_FORCE_LIMIT,
+                                                     100000, &link);
        }
 
-out:
        return ret_val;
 }
 
@@ -3300,23 +3248,22 @@ s32 e1000_get_phy_info_82577(struct e1000_hw *hw)
 
        ret_val = e1000e_phy_has_link_generic(hw, 1, 0, &link);
        if (ret_val)
-               goto out;
+               return ret_val;
 
        if (!link) {
                e_dbg("Phy info is only valid if link is up\n");
-               ret_val = -E1000_ERR_CONFIG;
-               goto out;
+               return -E1000_ERR_CONFIG;
        }
 
        phy->polarity_correction = true;
 
        ret_val = e1000_check_polarity_82577(hw);
        if (ret_val)
-               goto out;
+               return ret_val;
 
        ret_val = e1e_rphy(hw, I82577_PHY_STATUS_2, &data);
        if (ret_val)
-               goto out;
+               return ret_val;
 
        phy->is_mdix = (data & I82577_PHY_STATUS2_MDIX) ? true : false;
 
@@ -3324,11 +3271,11 @@ s32 e1000_get_phy_info_82577(struct e1000_hw *hw)
            I82577_PHY_STATUS2_SPEED_1000MBPS) {
                ret_val = hw->phy.ops.get_cable_length(hw);
                if (ret_val)
-                       goto out;
+                       return ret_val;
 
                ret_val = e1e_rphy(hw, PHY_1000T_STATUS, &data);
                if (ret_val)
-                       goto out;
+                       return ret_val;
 
                phy->local_rx = (data & SR_1000T_LOCAL_RX_STATUS)
                                ? e1000_1000t_rx_status_ok
@@ -3343,8 +3290,7 @@ s32 e1000_get_phy_info_82577(struct e1000_hw *hw)
                phy->remote_rx = e1000_1000t_rx_status_undefined;
        }
 
-out:
-       return ret_val;
+       return 0;
 }
 
 /**
@@ -3362,7 +3308,7 @@ s32 e1000_get_cable_length_82577(struct e1000_hw *hw)
 
        ret_val = e1e_rphy(hw, I82577_PHY_DIAG_STATUS, &phy_data);
        if (ret_val)
-               goto out;
+               return ret_val;
 
        length = (phy_data & I82577_DSTATUS_CABLE_LENGTH) >>
                 I82577_DSTATUS_CABLE_LENGTH_SHIFT;
@@ -3372,6 +3318,5 @@ s32 e1000_get_cable_length_82577(struct e1000_hw *hw)
 
        phy->cable_length = length;
 
-out:
-       return ret_val;
+       return 0;
 }
index 94be6c3..fda8247 100644 (file)
@@ -173,7 +173,9 @@ static int igb_check_vf_assignment(struct igb_adapter *adapter);
 #endif
 
 #ifdef CONFIG_PM
+#ifdef CONFIG_PM_SLEEP
 static int igb_suspend(struct device *);
+#endif
 static int igb_resume(struct device *);
 #ifdef CONFIG_PM_RUNTIME
 static int igb_runtime_suspend(struct device *dev);
@@ -6710,6 +6712,7 @@ static int __igb_shutdown(struct pci_dev *pdev, bool *enable_wake,
 }
 
 #ifdef CONFIG_PM
+#ifdef CONFIG_PM_SLEEP
 static int igb_suspend(struct device *dev)
 {
        int retval;
@@ -6729,6 +6732,7 @@ static int igb_suspend(struct device *dev)
 
        return 0;
 }
+#endif /* CONFIG_PM_SLEEP */
 
 static int igb_resume(struct device *dev)
 {
index db7dce2..8ce6706 100644 (file)
@@ -343,10 +343,10 @@ static int igbvf_get_coalesce(struct net_device *netdev,
 {
        struct igbvf_adapter *adapter = netdev_priv(netdev);
 
-       if (adapter->itr_setting <= 3)
-               ec->rx_coalesce_usecs = adapter->itr_setting;
+       if (adapter->requested_itr <= 3)
+               ec->rx_coalesce_usecs = adapter->requested_itr;
        else
-               ec->rx_coalesce_usecs = adapter->itr_setting >> 2;
+               ec->rx_coalesce_usecs = adapter->current_itr >> 2;
 
        return 0;
 }
@@ -365,15 +365,16 @@ static int igbvf_set_coalesce(struct net_device *netdev,
 
        /* convert to rate of irq's per second */
        if (ec->rx_coalesce_usecs && ec->rx_coalesce_usecs <= 3) {
-               adapter->itr = IGBVF_START_ITR;
-               adapter->itr_setting = ec->rx_coalesce_usecs;
+               adapter->current_itr = IGBVF_START_ITR;
+               adapter->requested_itr = ec->rx_coalesce_usecs;
        } else {
-               adapter->itr = ec->rx_coalesce_usecs << 2;
-               adapter->itr_setting = adapter->itr;
+               adapter->current_itr = ec->rx_coalesce_usecs << 2;
+               adapter->requested_itr = 1000000000 /
+                                       (adapter->current_itr * 256);
        }
 
-       writel(adapter->itr,
-              hw->hw_addr + adapter->rx_ring[0].itr_register);
+       writel(adapter->current_itr,
+              hw->hw_addr + adapter->rx_ring->itr_register);
 
        return 0;
 }
index 2c6d87e..a895e2f 100644 (file)
@@ -43,7 +43,18 @@ struct igbvf_info;
 struct igbvf_adapter;
 
 /* Interrupt defines */
-#define IGBVF_START_ITR                 648 /* ~6000 ints/sec */
+#define IGBVF_START_ITR                    488 /* ~8000 ints/sec */
+#define IGBVF_4K_ITR                       980
+#define IGBVF_20K_ITR                      196
+#define IGBVF_70K_ITR                       56
+
+enum latency_range {
+       lowest_latency = 0,
+       low_latency = 1,
+       bulk_latency = 2,
+       latency_invalid = 255
+};
+
 
 /* Interrupt modes, as used by the IntMode parameter */
 #define IGBVF_INT_MODE_LEGACY           0
@@ -155,6 +166,7 @@ struct igbvf_ring {
        char name[IFNAMSIZ + 5];
        u32 eims_value;
        u32 itr_val;
+       enum latency_range itr_range;
        u16 itr_register;
        int set_itr;
 
@@ -187,10 +199,8 @@ struct igbvf_adapter {
        unsigned long state;
 
        /* Interrupt Throttle Rate */
-       u32 itr;
-       u32 itr_setting;
-       u16 tx_itr;
-       u16 rx_itr;
+       u32 requested_itr; /* ints/sec or adaptive */
+       u32 current_itr; /* Actual ITR register value, not ints/sec */
 
        /*
         * Tx
@@ -299,13 +309,6 @@ enum igbvf_state_t {
        __IGBVF_DOWN
 };
 
-enum latency_range {
-       lowest_latency = 0,
-       low_latency = 1,
-       bulk_latency = 2,
-       latency_invalid = 255
-};
-
 extern char igbvf_driver_name[];
 extern const char igbvf_driver_version[];
 
index 4e9141c..217c143 100644 (file)
@@ -632,14 +632,13 @@ void igbvf_free_rx_resources(struct igbvf_ring *rx_ring)
  *      traffic pattern.  Constants in this function were computed
  *      based on theoretical maximum wire speed and thresholds were set based
  *      on testing data as well as attempting to minimize response time
- *      while increasing bulk throughput.  This functionality is controlled
- *      by the InterruptThrottleRate module parameter.
+ *      while increasing bulk throughput.
  **/
-static unsigned int igbvf_update_itr(struct igbvf_adapter *adapter,
-                                     u16 itr_setting, int packets,
-                                     int bytes)
+static enum latency_range igbvf_update_itr(struct igbvf_adapter *adapter,
+                                          enum latency_range itr_setting,
+                                          int packets, int bytes)
 {
-       unsigned int retval = itr_setting;
+       enum latency_range retval = itr_setting;
 
        if (packets == 0)
                goto update_itr_done;
@@ -675,65 +674,87 @@ static unsigned int igbvf_update_itr(struct igbvf_adapter *adapter,
                        retval = low_latency;
                }
                break;
+       default:
+               break;
        }
 
 update_itr_done:
        return retval;
 }
 
-static void igbvf_set_itr(struct igbvf_adapter *adapter)
+static int igbvf_range_to_itr(enum latency_range current_range)
 {
-       struct e1000_hw *hw = &adapter->hw;
-       u16 current_itr;
-       u32 new_itr = adapter->itr;
-
-       adapter->tx_itr = igbvf_update_itr(adapter, adapter->tx_itr,
-                                          adapter->total_tx_packets,
-                                          adapter->total_tx_bytes);
-       /* conservative mode (itr 3) eliminates the lowest_latency setting */
-       if (adapter->itr_setting == 3 && adapter->tx_itr == lowest_latency)
-               adapter->tx_itr = low_latency;
-
-       adapter->rx_itr = igbvf_update_itr(adapter, adapter->rx_itr,
-                                          adapter->total_rx_packets,
-                                          adapter->total_rx_bytes);
-       /* conservative mode (itr 3) eliminates the lowest_latency setting */
-       if (adapter->itr_setting == 3 && adapter->rx_itr == lowest_latency)
-               adapter->rx_itr = low_latency;
-
-       current_itr = max(adapter->rx_itr, adapter->tx_itr);
+       int new_itr;
 
-       switch (current_itr) {
+       switch (current_range) {
        /* counts and packets in update_itr are dependent on these numbers */
        case lowest_latency:
-               new_itr = 70000;
+               new_itr = IGBVF_70K_ITR;
                break;
        case low_latency:
-               new_itr = 20000; /* aka hwitr = ~200 */
+               new_itr = IGBVF_20K_ITR;
                break;
        case bulk_latency:
-               new_itr = 4000;
+               new_itr = IGBVF_4K_ITR;
                break;
        default:
+               new_itr = IGBVF_START_ITR;
                break;
        }
+       return new_itr;
+}
+
+static void igbvf_set_itr(struct igbvf_adapter *adapter)
+{
+       u32 new_itr;
+
+       adapter->tx_ring->itr_range =
+                       igbvf_update_itr(adapter,
+                                        adapter->tx_ring->itr_val,
+                                        adapter->total_tx_packets,
+                                        adapter->total_tx_bytes);
+
+       /* conservative mode (itr 3) eliminates the lowest_latency setting */
+       if (adapter->requested_itr == 3 &&
+           adapter->tx_ring->itr_range == lowest_latency)
+               adapter->tx_ring->itr_range = low_latency;
+
+       new_itr = igbvf_range_to_itr(adapter->tx_ring->itr_range);
+
 
-       if (new_itr != adapter->itr) {
+       if (new_itr != adapter->tx_ring->itr_val) {
+               u32 current_itr = adapter->tx_ring->itr_val;
                /*
                 * this attempts to bias the interrupt rate towards Bulk
                 * by adding intermediate steps when interrupt rate is
                 * increasing
                 */
-               new_itr = new_itr > adapter->itr ?
-                            min(adapter->itr + (new_itr >> 2), new_itr) :
-                            new_itr;
-               adapter->itr = new_itr;
-               adapter->rx_ring->itr_val = 1952;
-
-               if (adapter->msix_entries)
-                       adapter->rx_ring->set_itr = 1;
-               else
-                       ew32(ITR, 1952);
+               new_itr = new_itr > current_itr ?
+                            min(current_itr + (new_itr >> 2), new_itr) :
+                            new_itr;
+               adapter->tx_ring->itr_val = new_itr;
+
+               adapter->tx_ring->set_itr = 1;
+       }
+
+       adapter->rx_ring->itr_range =
+                       igbvf_update_itr(adapter, adapter->rx_ring->itr_val,
+                                        adapter->total_rx_packets,
+                                        adapter->total_rx_bytes);
+       if (adapter->requested_itr == 3 &&
+           adapter->rx_ring->itr_range == lowest_latency)
+               adapter->rx_ring->itr_range = low_latency;
+
+       new_itr = igbvf_range_to_itr(adapter->rx_ring->itr_range);
+
+       if (new_itr != adapter->rx_ring->itr_val) {
+               u32 current_itr = adapter->rx_ring->itr_val;
+               new_itr = new_itr > current_itr ?
+                            min(current_itr + (new_itr >> 2), new_itr) :
+                            new_itr;
+               adapter->rx_ring->itr_val = new_itr;
+
+               adapter->rx_ring->set_itr = 1;
        }
 }
 
@@ -835,6 +856,11 @@ static irqreturn_t igbvf_intr_msix_tx(int irq, void *data)
        struct e1000_hw *hw = &adapter->hw;
        struct igbvf_ring *tx_ring = adapter->tx_ring;
 
+       if (tx_ring->set_itr) {
+               writel(tx_ring->itr_val,
+                      adapter->hw.hw_addr + tx_ring->itr_register);
+               adapter->tx_ring->set_itr = 0;
+       }
 
        adapter->total_tx_bytes = 0;
        adapter->total_tx_packets = 0;
@@ -937,19 +963,10 @@ static void igbvf_configure_msix(struct igbvf_adapter *adapter)
 
        igbvf_assign_vector(adapter, IGBVF_NO_QUEUE, 0, vector++);
        adapter->eims_enable_mask |= tx_ring->eims_value;
-       if (tx_ring->itr_val)
-               writel(tx_ring->itr_val,
-                      hw->hw_addr + tx_ring->itr_register);
-       else
-               writel(1952, hw->hw_addr + tx_ring->itr_register);
-
+       writel(tx_ring->itr_val, hw->hw_addr + tx_ring->itr_register);
        igbvf_assign_vector(adapter, 0, IGBVF_NO_QUEUE, vector++);
        adapter->eims_enable_mask |= rx_ring->eims_value;
-       if (rx_ring->itr_val)
-               writel(rx_ring->itr_val,
-                      hw->hw_addr + rx_ring->itr_register);
-       else
-               writel(1952, hw->hw_addr + rx_ring->itr_register);
+       writel(rx_ring->itr_val, hw->hw_addr + rx_ring->itr_register);
 
        /* set vector for other causes, i.e. link changes */
 
@@ -1027,7 +1044,7 @@ static int igbvf_request_msix(struct igbvf_adapter *adapter)
                goto out;
 
        adapter->tx_ring->itr_register = E1000_EITR(vector);
-       adapter->tx_ring->itr_val = 1952;
+       adapter->tx_ring->itr_val = adapter->current_itr;
        vector++;
 
        err = request_irq(adapter->msix_entries[vector].vector,
@@ -1037,7 +1054,7 @@ static int igbvf_request_msix(struct igbvf_adapter *adapter)
                goto out;
 
        adapter->rx_ring->itr_register = E1000_EITR(vector);
-       adapter->rx_ring->itr_val = 1952;
+       adapter->rx_ring->itr_val = adapter->current_itr;
        vector++;
 
        err = request_irq(adapter->msix_entries[vector].vector,
@@ -1151,7 +1168,7 @@ static int igbvf_poll(struct napi_struct *napi, int budget)
        if (work_done < budget) {
                napi_complete(napi);
 
-               if (adapter->itr_setting & 3)
+               if (adapter->requested_itr & 3)
                        igbvf_set_itr(adapter);
 
                if (!test_bit(__IGBVF_DOWN, &adapter->state))
@@ -1521,8 +1538,8 @@ static int __devinit igbvf_sw_init(struct igbvf_adapter *adapter)
        adapter->tx_abs_int_delay = 32;
        adapter->rx_int_delay = 0;
        adapter->rx_abs_int_delay = 8;
-       adapter->itr_setting = 3;
-       adapter->itr = 20000;
+       adapter->requested_itr = 3;
+       adapter->current_itr = IGBVF_START_ITR;
 
        /* Set various function pointers */
        adapter->ei->init_ops(&adapter->hw);
@@ -1695,6 +1712,7 @@ static int igbvf_set_mac(struct net_device *netdev, void *p)
                return -EADDRNOTAVAIL;
 
        memcpy(netdev->dev_addr, addr->sa_data, netdev->addr_len);
+       netdev->addr_assign_type &= ~NET_ADDR_RANDOM;
 
        return 0;
 }
@@ -2695,18 +2713,19 @@ static int __devinit igbvf_probe(struct pci_dev *pdev,
                dev_info(&pdev->dev,
                         "PF still in reset state, assigning new address."
                         " Is the PF interface up?\n");
-               dev_hw_addr_random(adapter->netdev, hw->mac.addr);
+               eth_hw_addr_random(netdev);
+               memcpy(adapter->hw.mac.addr, netdev->dev_addr,
+                       netdev->addr_len);
        } else {
                err = hw->mac.ops.read_mac_addr(hw);
                if (err) {
                        dev_err(&pdev->dev, "Error reading MAC address\n");
                        goto err_hw_init;
                }
+               memcpy(netdev->dev_addr, adapter->hw.mac.addr,
+                       netdev->addr_len);
        }
 
-       memcpy(netdev->dev_addr, adapter->hw.mac.addr, netdev->addr_len);
-       memcpy(netdev->perm_addr, adapter->hw.mac.addr, netdev->addr_len);
-
        if (!is_valid_ether_addr(netdev->perm_addr)) {
                dev_err(&pdev->dev, "Invalid MAC Address: %pM\n",
                        netdev->dev_addr);
@@ -2714,6 +2733,8 @@ static int __devinit igbvf_probe(struct pci_dev *pdev,
                goto err_hw_init;
        }
 
+       memcpy(netdev->perm_addr, adapter->hw.mac.addr, netdev->addr_len);
+
        setup_timer(&adapter->watchdog_timer, &igbvf_watchdog,
                    (unsigned long) adapter);
 
index 2ed925f..eca216b 100644 (file)
@@ -533,10 +533,8 @@ __le16
 ixgb_get_eeprom_word(struct ixgb_hw *hw, u16 index)
 {
 
-       if ((index < IXGB_EEPROM_SIZE) &&
-               (ixgb_check_and_get_eeprom_data(hw) == true)) {
-          return hw->eeprom[index];
-       }
+       if (index < IXGB_EEPROM_SIZE && ixgb_check_and_get_eeprom_data(hw))
+               return hw->eeprom[index];
 
        return 0;
 }
@@ -558,7 +556,7 @@ ixgb_get_ee_mac_addr(struct ixgb_hw *hw,
 
        ENTER();
 
-       if (ixgb_check_and_get_eeprom_data(hw) == true) {
+       if (ixgb_check_and_get_eeprom_data(hw)) {
                for (i = 0; i < ETH_ALEN; i++) {
                        mac_addr[i] = ee_map->mac_addr[i];
                }
@@ -578,7 +576,7 @@ ixgb_get_ee_mac_addr(struct ixgb_hw *hw,
 u32
 ixgb_get_ee_pba_number(struct ixgb_hw *hw)
 {
-       if (ixgb_check_and_get_eeprom_data(hw) == true)
+       if (ixgb_check_and_get_eeprom_data(hw))
                return le16_to_cpu(hw->eeprom[EEPROM_PBA_1_2_REG])
                        | (le16_to_cpu(hw->eeprom[EEPROM_PBA_3_4_REG])<<16);
 
@@ -599,7 +597,7 @@ ixgb_get_ee_device_id(struct ixgb_hw *hw)
 {
        struct ixgb_ee_map_type *ee_map = (struct ixgb_ee_map_type *)hw->eeprom;
 
-       if (ixgb_check_and_get_eeprom_data(hw) == true)
+       if (ixgb_check_and_get_eeprom_data(hw))
                return le16_to_cpu(ee_map->device_id);
 
        return 0;
index 9bd5faf..0024788 100644 (file)
@@ -1136,10 +1136,8 @@ ixgb_set_multi(struct net_device *netdev)
                u8 *mta = kmalloc(IXGB_MAX_NUM_MULTICAST_ADDRESSES *
                              ETH_ALEN, GFP_ATOMIC);
                u8 *addr;
-               if (!mta) {
-                       pr_err("allocation of multicast memory failed\n");
+               if (!mta)
                        goto alloc_failed;
-               }
 
                IXGB_WRITE_REG(hw, RCTL, rctl);
 
index e6aeb64..2807a25 100644 (file)
@@ -190,6 +190,7 @@ struct ixgbe_rx_queue_stats {
        u64 non_eop_descs;
        u64 alloc_rx_page_failed;
        u64 alloc_rx_buff_failed;
+       u64 csum_err;
 };
 
 enum ixbge_ring_state_t {
@@ -198,6 +199,7 @@ enum ixbge_ring_state_t {
        __IXGBE_HANG_CHECK_ARMED,
        __IXGBE_RX_PS_ENABLED,
        __IXGBE_RX_RSC_ENABLED,
+       __IXGBE_RX_CSUM_UDP_ZERO_ERR,
 };
 
 #define ring_is_ps_enabled(ring) \
@@ -329,6 +331,13 @@ struct ixgbe_q_vector {
 #define IXGBE_10K_ITR          400
 #define IXGBE_8K_ITR           500
 
+/* ixgbe_test_staterr - tests bits in Rx descriptor status and error fields */
+static inline __le32 ixgbe_test_staterr(union ixgbe_adv_rx_desc *rx_desc,
+                                       const u32 stat_err_bits)
+{
+       return rx_desc->wb.upper.status_error & cpu_to_le32(stat_err_bits);
+}
+
 static inline u16 ixgbe_desc_unused(struct ixgbe_ring *ring)
 {
        u16 ntc = ring->next_to_clean;
@@ -337,11 +346,11 @@ static inline u16 ixgbe_desc_unused(struct ixgbe_ring *ring)
        return ((ntc > ntu) ? 0 : ring->count) + ntc - ntu - 1;
 }
 
-#define IXGBE_RX_DESC_ADV(R, i)            \
+#define IXGBE_RX_DESC(R, i)        \
        (&(((union ixgbe_adv_rx_desc *)((R)->desc))[i]))
-#define IXGBE_TX_DESC_ADV(R, i)            \
+#define IXGBE_TX_DESC(R, i)        \
        (&(((union ixgbe_adv_tx_desc *)((R)->desc))[i]))
-#define IXGBE_TX_CTXTDESC_ADV(R, i)        \
+#define IXGBE_TX_CTXTDESC(R, i)            \
        (&(((struct ixgbe_adv_tx_context_desc *)((R)->desc))[i]))
 
 #define IXGBE_MAX_JUMBO_FRAME_SIZE        16128
@@ -372,7 +381,6 @@ struct ixgbe_adapter {
         * thus the additional *_CAPABLE flags.
         */
        u32 flags;
-#define IXGBE_FLAG_RX_CSUM_ENABLED              (u32)(1)
 #define IXGBE_FLAG_MSI_CAPABLE                  (u32)(1 << 1)
 #define IXGBE_FLAG_MSI_ENABLED                  (u32)(1 << 2)
 #define IXGBE_FLAG_MSIX_CAPABLE                 (u32)(1 << 3)
@@ -535,12 +543,16 @@ enum ixbge_state_t {
        __IXGBE_IN_SFP_INIT,
 };
 
-struct ixgbe_rsc_cb {
+struct ixgbe_cb {
+       union {                         /* Union defining head/tail partner */
+               struct sk_buff *head;
+               struct sk_buff *tail;
+       };
        dma_addr_t dma;
-       u16 skb_cnt;
+       u16 append_cnt;
        bool delay_unmap;
 };
-#define IXGBE_RSC_CB(skb) ((struct ixgbe_rsc_cb *)(skb)->cb)
+#define IXGBE_CB(skb) ((struct ixgbe_cb *)(skb)->cb)
 
 enum ixgbe_boards {
        board_82598,
@@ -614,8 +626,7 @@ extern int ixgbe_fso(struct ixgbe_ring *tx_ring, struct sk_buff *skb,
 extern void ixgbe_cleanup_fcoe(struct ixgbe_adapter *adapter);
 extern int ixgbe_fcoe_ddp(struct ixgbe_adapter *adapter,
                          union ixgbe_adv_rx_desc *rx_desc,
-                         struct sk_buff *skb,
-                         u32 staterr);
+                         struct sk_buff *skb);
 extern int ixgbe_fcoe_ddp_get(struct net_device *netdev, u16 xid,
                               struct scatterlist *sgl, unsigned int sgc);
 extern int ixgbe_fcoe_ddp_target(struct net_device *netdev, u16 xid,
index b406c36..752dbe6 100644 (file)
@@ -617,7 +617,7 @@ static s32 ixgbe_check_mac_link_82598(struct ixgbe_hw *hw,
                                *link_up = false;
                }
 
-               if (*link_up == false)
+               if (!*link_up)
                        goto out;
        }
 
@@ -645,7 +645,7 @@ static s32 ixgbe_check_mac_link_82598(struct ixgbe_hw *hw,
        else
                *speed = IXGBE_LINK_SPEED_1GB_FULL;
 
-       if ((hw->device_id == IXGBE_DEV_ID_82598AT2) && (*link_up == true) &&
+       if ((hw->device_id == IXGBE_DEV_ID_82598AT2) && *link_up &&
            (ixgbe_validate_link_ready(hw) != 0))
                *link_up = false;
 
index 383b941..87f6b4f 100644 (file)
@@ -3336,7 +3336,7 @@ static u8 ixgbe_calculate_checksum(u8 *buffer, u32 length)
  *  @hw: pointer to the HW structure
  *  @buffer: contains the command to write and where the return status will
  *           be placed
- *  @lenght: lenght of buffer, must be multiple of 4 bytes
+ *  @length: length of buffer, must be multiple of 4 bytes
  *
  *  Communicates with the manageability block.  On success return 0
  *  else return IXGBE_ERR_HOST_INTERFACE_COMMAND.
index 79a92fe..dde65f9 100644 (file)
@@ -111,7 +111,7 @@ static u8 ixgbe_dcbnl_get_state(struct net_device *netdev)
 
 static u8 ixgbe_dcbnl_set_state(struct net_device *netdev, u8 state)
 {
-       u8 err = 0;
+       int err = 0;
        u8 prio_tc[MAX_USER_PRIORITY] = {0};
        int i;
        struct ixgbe_adapter *adapter = netdev_priv(netdev);
@@ -122,7 +122,7 @@ static u8 ixgbe_dcbnl_set_state(struct net_device *netdev, u8 state)
 
        /* verify there is something to do, if not then exit */
        if (!!state != !(adapter->flags & IXGBE_FLAG_DCB_ENABLED))
-               return err;
+               goto out;
 
        if (state > 0) {
                err = ixgbe_setup_tc(netdev, adapter->dcb_cfg.num_tcs.pg_tcs);
@@ -131,10 +131,14 @@ static u8 ixgbe_dcbnl_set_state(struct net_device *netdev, u8 state)
                err = ixgbe_setup_tc(netdev, 0);
        }
 
+       if (err)
+               goto out;
+
        for (i = 0; i < IEEE_8021QAZ_MAX_TCS; i++)
                netdev_set_prio_tc_map(netdev, i, prio_tc[i]);
 
-       return err;
+out:
+       return err ? 1 : 0;
 }
 
 static void ixgbe_dcbnl_get_perm_hw_addr(struct net_device *netdev,
@@ -486,7 +490,7 @@ static u8 ixgbe_dcbnl_getcap(struct net_device *netdev, int capid, u8 *cap)
        return 0;
 }
 
-static u8 ixgbe_dcbnl_getnumtcs(struct net_device *netdev, int tcid, u8 *num)
+static int ixgbe_dcbnl_getnumtcs(struct net_device *netdev, int tcid, u8 *num)
 {
        struct ixgbe_adapter *adapter = netdev_priv(netdev);
        u8 rval = 0;
@@ -510,7 +514,7 @@ static u8 ixgbe_dcbnl_getnumtcs(struct net_device *netdev, int tcid, u8 *num)
        return rval;
 }
 
-static u8 ixgbe_dcbnl_setnumtcs(struct net_device *netdev, int tcid, u8 num)
+static int ixgbe_dcbnl_setnumtcs(struct net_device *netdev, int tcid, u8 num)
 {
        return -EINVAL;
 }
@@ -581,7 +585,7 @@ static int ixgbe_dcbnl_ieee_setets(struct net_device *dev,
 {
        struct ixgbe_adapter *adapter = netdev_priv(dev);
        int max_frame = dev->mtu + ETH_HLEN + ETH_FCS_LEN;
-       int i;
+       int i, err = 0;
        __u8 max_tc = 0;
 
        if (!(adapter->dcbx_cap & DCB_CAP_DCBX_VER_IEEE))
@@ -608,12 +612,17 @@ static int ixgbe_dcbnl_ieee_setets(struct net_device *dev,
                return -EINVAL;
 
        if (max_tc != netdev_get_num_tc(dev))
-               ixgbe_setup_tc(dev, max_tc);
+               err = ixgbe_setup_tc(dev, max_tc);
+
+       if (err)
+               goto err_out;
 
        for (i = 0; i < IEEE_8021QAZ_MAX_TCS; i++)
                netdev_set_prio_tc_map(dev, i, ets->prio_tc[i]);
 
-       return ixgbe_dcb_hw_ets(&adapter->hw, ets, max_frame);
+       err = ixgbe_dcb_hw_ets(&adapter->hw, ets, max_frame);
+err_out:
+       return err;
 }
 
 static int ixgbe_dcbnl_ieee_getpfc(struct net_device *dev,
@@ -726,6 +735,7 @@ static u8 ixgbe_dcbnl_setdcbx(struct net_device *dev, u8 mode)
        struct ixgbe_adapter *adapter = netdev_priv(dev);
        struct ieee_ets ets = {0};
        struct ieee_pfc pfc = {0};
+       int err = 0;
 
        /* no support for LLD_MANAGED modes or CEE+IEEE */
        if ((mode & DCB_CAP_DCBX_LLD_MANAGED) ||
@@ -756,10 +766,10 @@ static u8 ixgbe_dcbnl_setdcbx(struct net_device *dev, u8 mode)
                 */
                ixgbe_dcbnl_ieee_setets(dev, &ets);
                ixgbe_dcbnl_ieee_setpfc(dev, &pfc);
-               ixgbe_setup_tc(dev, 0);
+               err = ixgbe_setup_tc(dev, 0);
        }
 
-       return 0;
+       return err ? 1 : 0;
 }
 
 const struct dcbnl_rtnl_ops dcbnl_ops = {
index a629754..8e2e473 100644 (file)
@@ -1739,7 +1739,7 @@ static u16 ixgbe_clean_test_rings(struct ixgbe_ring *rx_ring,
        /* initialize next to clean and descriptor values */
        rx_ntc = rx_ring->next_to_clean;
        tx_ntc = tx_ring->next_to_clean;
-       rx_desc = IXGBE_RX_DESC_ADV(rx_ring, rx_ntc);
+       rx_desc = IXGBE_RX_DESC(rx_ring, rx_ntc);
        staterr = le32_to_cpu(rx_desc->wb.upper.status_error);
 
        while (staterr & IXGBE_RXD_STAT_DD) {
@@ -1770,7 +1770,7 @@ static u16 ixgbe_clean_test_rings(struct ixgbe_ring *rx_ring,
                        tx_ntc = 0;
 
                /* fetch next descriptor */
-               rx_desc = IXGBE_RX_DESC_ADV(rx_ring, rx_ntc);
+               rx_desc = IXGBE_RX_DESC(rx_ring, rx_ntc);
                staterr = le32_to_cpu(rx_desc->wb.upper.status_error);
        }
 
index 4bc7942..da7da75 100644 (file)
@@ -357,22 +357,20 @@ int ixgbe_fcoe_ddp_target(struct net_device *netdev, u16 xid,
  */
 int ixgbe_fcoe_ddp(struct ixgbe_adapter *adapter,
                   union ixgbe_adv_rx_desc *rx_desc,
-                  struct sk_buff *skb,
-                  u32 staterr)
+                  struct sk_buff *skb)
 {
-       u16 xid;
-       u32 fctl;
-       u32 fceofe, fcerr, fcstat;
        int rc = -EINVAL;
        struct ixgbe_fcoe *fcoe;
        struct ixgbe_fcoe_ddp *ddp;
        struct fc_frame_header *fh;
        struct fcoe_crc_eof *crc;
+       __le32 fcerr = ixgbe_test_staterr(rx_desc, IXGBE_RXDADV_ERR_FCERR);
+       __le32 ddp_err;
+       u32 fctl;
+       u16 xid;
 
-       fcerr = (staterr & IXGBE_RXDADV_ERR_FCERR);
-       fceofe = (staterr & IXGBE_RXDADV_ERR_FCEOFE);
-       if (fcerr == IXGBE_FCERR_BADCRC)
-               skb_checksum_none_assert(skb);
+       if (fcerr == cpu_to_le32(IXGBE_FCERR_BADCRC))
+               skb->ip_summed = CHECKSUM_NONE;
        else
                skb->ip_summed = CHECKSUM_UNNECESSARY;
 
@@ -382,6 +380,7 @@ int ixgbe_fcoe_ddp(struct ixgbe_adapter *adapter,
        else
                fh = (struct fc_frame_header *)(skb->data +
                        sizeof(struct fcoe_hdr));
+
        fctl = ntoh24(fh->fh_f_ctl);
        if (fctl & FC_FC_EX_CTX)
                xid =  be16_to_cpu(fh->fh_ox_id);
@@ -396,27 +395,39 @@ int ixgbe_fcoe_ddp(struct ixgbe_adapter *adapter,
        if (!ddp->udl)
                goto ddp_out;
 
-       if (fcerr | fceofe)
+       ddp_err = ixgbe_test_staterr(rx_desc, IXGBE_RXDADV_ERR_FCEOFE |
+                                             IXGBE_RXDADV_ERR_FCERR);
+       if (ddp_err)
                goto ddp_out;
 
-       fcstat = (staterr & IXGBE_RXDADV_STAT_FCSTAT);
-       if (fcstat) {
+       switch (ixgbe_test_staterr(rx_desc, IXGBE_RXDADV_STAT_FCSTAT)) {
+       /* return 0 to bypass going to ULD for DDPed data */
+       case __constant_cpu_to_le32(IXGBE_RXDADV_STAT_FCSTAT_DDP):
                /* update length of DDPed data */
                ddp->len = le32_to_cpu(rx_desc->wb.lower.hi_dword.rss);
-               /* unmap the sg list when FCP_RSP is received */
-               if (fcstat == IXGBE_RXDADV_STAT_FCSTAT_FCPRSP) {
-                       pci_unmap_sg(adapter->pdev, ddp->sgl,
-                                    ddp->sgc, DMA_FROM_DEVICE);
-                       ddp->err = (fcerr | fceofe);
-                       ddp->sgl = NULL;
-                       ddp->sgc = 0;
-               }
-               /* return 0 to bypass going to ULD for DDPed data */
-               if (fcstat == IXGBE_RXDADV_STAT_FCSTAT_DDP)
-                       rc = 0;
-               else if (ddp->len)
+               rc = 0;
+               break;
+       /* unmap the sg list when FCPRSP is received */
+       case __constant_cpu_to_le32(IXGBE_RXDADV_STAT_FCSTAT_FCPRSP):
+               pci_unmap_sg(adapter->pdev, ddp->sgl,
+                            ddp->sgc, DMA_FROM_DEVICE);
+               ddp->err = ddp_err;
+               ddp->sgl = NULL;
+               ddp->sgc = 0;
+               /* fall through */
+       /* if DDP length is present pass it through to ULD */
+       case __constant_cpu_to_le32(IXGBE_RXDADV_STAT_FCSTAT_NODDP):
+               /* update length of DDPed data */
+               ddp->len = le32_to_cpu(rx_desc->wb.lower.hi_dword.rss);
+               if (ddp->len)
                        rc = ddp->len;
+               break;
+       /* no match will return as an error */
+       case __constant_cpu_to_le32(IXGBE_RXDADV_STAT_FCSTAT_NOMTCH):
+       default:
+               break;
        }
+
        /* In target mode, check the last data frame of the sequence.
         * For DDP in target mode, data is already DDPed but the header
         * indication of the last data frame ould allow is to tell if we
index 3dc6cef..23a4665 100644 (file)
@@ -131,6 +131,11 @@ MODULE_PARM_DESC(max_vfs,
                 "Maximum number of virtual functions to allocate per physical function");
 #endif /* CONFIG_PCI_IOV */
 
+static unsigned int allow_unsupported_sfp;
+module_param(allow_unsupported_sfp, uint, 0);
+MODULE_PARM_DESC(allow_unsupported_sfp,
+                "Allow unsupported and untested SFP+ modules on 82599-based adapters");
+
 MODULE_AUTHOR("Intel Corporation, <linux.nics@intel.com>");
 MODULE_DESCRIPTION("Intel(R) 10 Gigabit PCI Express Network Driver");
 MODULE_LICENSE("GPL");
@@ -361,7 +366,7 @@ static void ixgbe_dump(struct ixgbe_adapter *adapter)
                        "leng  ntw timestamp        bi->skb\n");
 
                for (i = 0; tx_ring->desc && (i < tx_ring->count); i++) {
-                       tx_desc = IXGBE_TX_DESC_ADV(tx_ring, i);
+                       tx_desc = IXGBE_TX_DESC(tx_ring, i);
                        tx_buffer_info = &tx_ring->tx_buffer_info[i];
                        u0 = (struct my_u0 *)tx_desc;
                        pr_info("T [0x%03X]    %016llX %016llX %016llX"
@@ -442,7 +447,7 @@ rx_ring_summary:
 
                for (i = 0; i < rx_ring->count; i++) {
                        rx_buffer_info = &rx_ring->rx_buffer_info[i];
-                       rx_desc = IXGBE_RX_DESC_ADV(rx_ring, i);
+                       rx_desc = IXGBE_RX_DESC(rx_ring, i);
                        u0 = (struct my_u0 *)rx_desc;
                        staterr = le32_to_cpu(rx_desc->wb.upper.status_error);
                        if (staterr & IXGBE_RXD_STAT_DD) {
@@ -749,7 +754,7 @@ static bool ixgbe_clean_tx_irq(struct ixgbe_q_vector *q_vector,
        u16 i = tx_ring->next_to_clean;
 
        tx_buffer = &tx_ring->tx_buffer_info[i];
-       tx_desc = IXGBE_TX_DESC_ADV(tx_ring, i);
+       tx_desc = IXGBE_TX_DESC(tx_ring, i);
 
        for (; budget; budget--) {
                union ixgbe_adv_tx_desc *eop_desc = tx_buffer->next_to_watch;
@@ -790,7 +795,7 @@ static bool ixgbe_clean_tx_irq(struct ixgbe_q_vector *q_vector,
                                i = 0;
 
                                tx_buffer = tx_ring->tx_buffer_info;
-                               tx_desc = IXGBE_TX_DESC_ADV(tx_ring, 0);
+                               tx_desc = IXGBE_TX_DESC(tx_ring, 0);
                        }
 
                } while (eop_desc);
@@ -807,7 +812,7 @@ static bool ixgbe_clean_tx_irq(struct ixgbe_q_vector *q_vector,
        if (check_for_tx_hang(tx_ring) && ixgbe_check_tx_hang(tx_ring)) {
                /* schedule immediate reset if we believe we hung */
                struct ixgbe_hw *hw = &adapter->hw;
-               tx_desc = IXGBE_TX_DESC_ADV(tx_ring, i);
+               tx_desc = IXGBE_TX_DESC(tx_ring, i);
                e_err(drv, "Detected Tx Unit Hang\n"
                        "  Tx Queue             <%d>\n"
                        "  TDH, TDT             <%x>, <%x>\n"
@@ -986,10 +991,12 @@ static int __ixgbe_notify_dca(struct device *dev, void *data)
 }
 #endif /* CONFIG_IXGBE_DCA */
 
-static inline void ixgbe_rx_hash(union ixgbe_adv_rx_desc *rx_desc,
+static inline void ixgbe_rx_hash(struct ixgbe_ring *ring,
+                                union ixgbe_adv_rx_desc *rx_desc,
                                 struct sk_buff *skb)
 {
-       skb->rxhash = le32_to_cpu(rx_desc->wb.lower.hi_dword.rss);
+       if (ring->netdev->features & NETIF_F_RXHASH)
+               skb->rxhash = le32_to_cpu(rx_desc->wb.lower.hi_dword.rss);
 }
 
 /**
@@ -1011,72 +1018,43 @@ static inline bool ixgbe_rx_is_fcoe(struct ixgbe_adapter *adapter,
 }
 
 /**
- * ixgbe_receive_skb - Send a completed packet up the stack
- * @adapter: board private structure
- * @skb: packet to send up
- * @status: hardware indication of status of receive
- * @rx_ring: rx descriptor ring (for a specific queue) to setup
- * @rx_desc: rx descriptor
- **/
-static void ixgbe_receive_skb(struct ixgbe_q_vector *q_vector,
-                             struct sk_buff *skb, u8 status,
-                             struct ixgbe_ring *ring,
-                             union ixgbe_adv_rx_desc *rx_desc)
-{
-       struct ixgbe_adapter *adapter = q_vector->adapter;
-       struct napi_struct *napi = &q_vector->napi;
-       bool is_vlan = (status & IXGBE_RXD_STAT_VP);
-       u16 tag = le16_to_cpu(rx_desc->wb.upper.vlan);
-
-       if (is_vlan && (tag & VLAN_VID_MASK))
-               __vlan_hwaccel_put_tag(skb, tag);
-
-       if (!(adapter->flags & IXGBE_FLAG_IN_NETPOLL))
-               napi_gro_receive(napi, skb);
-       else
-               netif_rx(skb);
-}
-
-/**
  * ixgbe_rx_checksum - indicate in skb if hw indicated a good cksum
- * @adapter: address of board private structure
- * @status_err: hardware indication of status of receive
+ * @ring: structure containing ring specific data
+ * @rx_desc: current Rx descriptor being processed
  * @skb: skb currently being received and modified
- * @status_err: status error value of last descriptor in packet
  **/
-static inline void ixgbe_rx_checksum(struct ixgbe_adapter *adapter,
+static inline void ixgbe_rx_checksum(struct ixgbe_ring *ring,
                                     union ixgbe_adv_rx_desc *rx_desc,
-                                    struct sk_buff *skb,
-                                    u32 status_err)
+                                    struct sk_buff *skb)
 {
-       skb->ip_summed = CHECKSUM_NONE;
+       skb_checksum_none_assert(skb);
 
        /* Rx csum disabled */
-       if (!(adapter->flags & IXGBE_FLAG_RX_CSUM_ENABLED))
+       if (!(ring->netdev->features & NETIF_F_RXCSUM))
                return;
 
        /* if IP and error */
-       if ((status_err & IXGBE_RXD_STAT_IPCS) &&
-           (status_err & IXGBE_RXDADV_ERR_IPE)) {
-               adapter->hw_csum_rx_error++;
+       if (ixgbe_test_staterr(rx_desc, IXGBE_RXD_STAT_IPCS) &&
+           ixgbe_test_staterr(rx_desc, IXGBE_RXDADV_ERR_IPE)) {
+               ring->rx_stats.csum_err++;
                return;
        }
 
-       if (!(status_err & IXGBE_RXD_STAT_L4CS))
+       if (!ixgbe_test_staterr(rx_desc, IXGBE_RXD_STAT_L4CS))
                return;
 
-       if (status_err & IXGBE_RXDADV_ERR_TCPE) {
+       if (ixgbe_test_staterr(rx_desc, IXGBE_RXDADV_ERR_TCPE)) {
                u16 pkt_info = rx_desc->wb.lower.lo_dword.hs_rss.pkt_info;
 
                /*
                 * 82599 errata, UDP frames with a 0 checksum can be marked as
                 * checksum errors.
                 */
-               if ((pkt_info & IXGBE_RXDADV_PKTTYPE_UDP) &&
-                   (adapter->hw.mac.type == ixgbe_mac_82599EB))
+               if ((pkt_info & cpu_to_le16(IXGBE_RXDADV_PKTTYPE_UDP)) &&
+                   test_bit(__IXGBE_RX_CSUM_UDP_ZERO_ERR, &ring->state))
                        return;
 
-               adapter->hw_csum_rx_error++;
+               ring->rx_stats.csum_err++;
                return;
        }
 
@@ -1086,6 +1064,7 @@ static inline void ixgbe_rx_checksum(struct ixgbe_adapter *adapter,
 
 static inline void ixgbe_release_rx_desc(struct ixgbe_ring *rx_ring, u32 val)
 {
+       rx_ring->next_to_use = val;
        /*
         * Force memory writes to complete before letting h/w
         * know there are new descriptors to fetch.  (Only
@@ -1096,8 +1075,72 @@ static inline void ixgbe_release_rx_desc(struct ixgbe_ring *rx_ring, u32 val)
        writel(val, rx_ring->tail);
 }
 
+static bool ixgbe_alloc_mapped_skb(struct ixgbe_ring *rx_ring,
+                                  struct ixgbe_rx_buffer *bi)
+{
+       struct sk_buff *skb = bi->skb;
+       dma_addr_t dma = bi->dma;
+
+       if (dma)
+               return true;
+
+       if (likely(!skb)) {
+               skb = netdev_alloc_skb_ip_align(rx_ring->netdev,
+                                               rx_ring->rx_buf_len);
+               bi->skb = skb;
+               if (!skb) {
+                       rx_ring->rx_stats.alloc_rx_buff_failed++;
+                       return false;
+               }
+       }
+
+       dma = dma_map_single(rx_ring->dev, skb->data,
+                            rx_ring->rx_buf_len, DMA_FROM_DEVICE);
+
+       if (dma_mapping_error(rx_ring->dev, dma)) {
+               rx_ring->rx_stats.alloc_rx_buff_failed++;
+               return false;
+       }
+
+       bi->dma = dma;
+       return true;
+}
+
+static bool ixgbe_alloc_mapped_page(struct ixgbe_ring *rx_ring,
+                                   struct ixgbe_rx_buffer *bi)
+{
+       struct page *page = bi->page;
+       dma_addr_t page_dma = bi->page_dma;
+       unsigned int page_offset = bi->page_offset ^ (PAGE_SIZE / 2);
+
+       if (page_dma)
+               return true;
+
+       if (!page) {
+               page = alloc_page(GFP_ATOMIC | __GFP_COLD);
+               bi->page = page;
+               if (unlikely(!page)) {
+                       rx_ring->rx_stats.alloc_rx_page_failed++;
+                       return false;
+               }
+       }
+
+       page_dma = dma_map_page(rx_ring->dev, page,
+                               page_offset, PAGE_SIZE / 2,
+                               DMA_FROM_DEVICE);
+
+       if (dma_mapping_error(rx_ring->dev, page_dma)) {
+               rx_ring->rx_stats.alloc_rx_page_failed++;
+               return false;
+       }
+
+       bi->page_dma = page_dma;
+       bi->page_offset = page_offset;
+       return true;
+}
+
 /**
- * ixgbe_alloc_rx_buffers - Replace used receive buffers; packet split
+ * ixgbe_alloc_rx_buffers - Replace used receive buffers
  * @rx_ring: ring to place buffers on
  * @cleaned_count: number of buffers to replace
  **/
@@ -1105,86 +1148,50 @@ void ixgbe_alloc_rx_buffers(struct ixgbe_ring *rx_ring, u16 cleaned_count)
 {
        union ixgbe_adv_rx_desc *rx_desc;
        struct ixgbe_rx_buffer *bi;
-       struct sk_buff *skb;
        u16 i = rx_ring->next_to_use;
 
-       /* do nothing if no valid netdev defined */
-       if (!rx_ring->netdev)
+       /* nothing to do or no valid netdev defined */
+       if (!cleaned_count || !rx_ring->netdev)
                return;
 
-       while (cleaned_count--) {
-               rx_desc = IXGBE_RX_DESC_ADV(rx_ring, i);
-               bi = &rx_ring->rx_buffer_info[i];
-               skb = bi->skb;
-
-               if (!skb) {
-                       skb = netdev_alloc_skb_ip_align(rx_ring->netdev,
-                                                       rx_ring->rx_buf_len);
-                       if (!skb) {
-                               rx_ring->rx_stats.alloc_rx_buff_failed++;
-                               goto no_buffers;
-                       }
-                       /* initialize queue mapping */
-                       skb_record_rx_queue(skb, rx_ring->queue_index);
-                       bi->skb = skb;
-               }
+       rx_desc = IXGBE_RX_DESC(rx_ring, i);
+       bi = &rx_ring->rx_buffer_info[i];
+       i -= rx_ring->count;
 
-               if (!bi->dma) {
-                       bi->dma = dma_map_single(rx_ring->dev,
-                                                skb->data,
-                                                rx_ring->rx_buf_len,
-                                                DMA_FROM_DEVICE);
-                       if (dma_mapping_error(rx_ring->dev, bi->dma)) {
-                               rx_ring->rx_stats.alloc_rx_buff_failed++;
-                               bi->dma = 0;
-                               goto no_buffers;
-                       }
-               }
+       while (cleaned_count--) {
+               if (!ixgbe_alloc_mapped_skb(rx_ring, bi))
+                       break;
 
+               /* Refresh the desc even if buffer_addrs didn't change
+                * because each write-back erases this info. */
                if (ring_is_ps_enabled(rx_ring)) {
-                       if (!bi->page) {
-                               bi->page = alloc_page(GFP_ATOMIC | __GFP_COLD);
-                               if (!bi->page) {
-                                       rx_ring->rx_stats.alloc_rx_page_failed++;
-                                       goto no_buffers;
-                               }
-                       }
+                       rx_desc->read.hdr_addr = cpu_to_le64(bi->dma);
 
-                       if (!bi->page_dma) {
-                               /* use a half page if we're re-using */
-                               bi->page_offset ^= PAGE_SIZE / 2;
-                               bi->page_dma = dma_map_page(rx_ring->dev,
-                                                           bi->page,
-                                                           bi->page_offset,
-                                                           PAGE_SIZE / 2,
-                                                           DMA_FROM_DEVICE);
-                               if (dma_mapping_error(rx_ring->dev,
-                                                     bi->page_dma)) {
-                                       rx_ring->rx_stats.alloc_rx_page_failed++;
-                                       bi->page_dma = 0;
-                                       goto no_buffers;
-                               }
-                       }
+                       if (!ixgbe_alloc_mapped_page(rx_ring, bi))
+                               break;
 
-                       /* Refresh the desc even if buffer_addrs didn't change
-                        * because each write-back erases this info. */
                        rx_desc->read.pkt_addr = cpu_to_le64(bi->page_dma);
-                       rx_desc->read.hdr_addr = cpu_to_le64(bi->dma);
                } else {
                        rx_desc->read.pkt_addr = cpu_to_le64(bi->dma);
-                       rx_desc->read.hdr_addr = 0;
                }
 
+               rx_desc++;
+               bi++;
                i++;
-               if (i == rx_ring->count)
-                       i = 0;
+               if (unlikely(!i)) {
+                       rx_desc = IXGBE_RX_DESC(rx_ring, 0);
+                       bi = rx_ring->rx_buffer_info;
+                       i -= rx_ring->count;
+               }
+
+               /* clear the hdr_addr for the next_to_use descriptor */
+               rx_desc->read.hdr_addr = 0;
        }
 
-no_buffers:
-       if (rx_ring->next_to_use != i) {
-               rx_ring->next_to_use = i;
+       i += rx_ring->count;
+
+       if (rx_ring->next_to_use != i)
                ixgbe_release_rx_desc(rx_ring, i);
-       }
 }
 
 static inline u16 ixgbe_get_hlen(union ixgbe_adv_rx_desc *rx_desc)
@@ -1202,65 +1209,283 @@ static inline u16 ixgbe_get_hlen(union ixgbe_adv_rx_desc *rx_desc)
 }
 
 /**
- * ixgbe_transform_rsc_queue - change rsc queue into a full packet
- * @skb: pointer to the last skb in the rsc queue
+ * ixgbe_merge_active_tail - merge active tail into lro skb
+ * @tail: pointer to active tail in frag_list
+ *
+ * This function merges the length and data of an active tail into the
+ * skb containing the frag_list.  It resets the tail's pointer to the head,
+ * but it leaves the heads pointer to tail intact.
+ **/
+static inline struct sk_buff *ixgbe_merge_active_tail(struct sk_buff *tail)
+{
+       struct sk_buff *head = IXGBE_CB(tail)->head;
+
+       if (!head)
+               return tail;
+
+       head->len += tail->len;
+       head->data_len += tail->len;
+       head->truesize += tail->len;
+
+       IXGBE_CB(tail)->head = NULL;
+
+       return head;
+}
+
+/**
+ * ixgbe_add_active_tail - adds an active tail into the skb frag_list
+ * @head: pointer to the start of the skb
+ * @tail: pointer to active tail to add to frag_list
  *
- * This function changes a queue full of hw rsc buffers into a completed
- * packet.  It uses the ->prev pointers to find the first packet and then
- * turns it into the frag list owner.
+ * This function adds an active tail to the end of the frag list.  This tail
+ * will still be receiving data so we cannot yet ad it's stats to the main
+ * skb.  That is done via ixgbe_merge_active_tail.
  **/
-static inline struct sk_buff *ixgbe_transform_rsc_queue(struct sk_buff *skb)
+static inline void ixgbe_add_active_tail(struct sk_buff *head,
+                                        struct sk_buff *tail)
 {
-       unsigned int frag_list_size = 0;
-       unsigned int skb_cnt = 1;
+       struct sk_buff *old_tail = IXGBE_CB(head)->tail;
 
-       while (skb->prev) {
-               struct sk_buff *prev = skb->prev;
-               frag_list_size += skb->len;
-               skb->prev = NULL;
-               skb = prev;
-               skb_cnt++;
+       if (old_tail) {
+               ixgbe_merge_active_tail(old_tail);
+               old_tail->next = tail;
+       } else {
+               skb_shinfo(head)->frag_list = tail;
        }
 
-       skb_shinfo(skb)->frag_list = skb->next;
-       skb->next = NULL;
-       skb->len += frag_list_size;
-       skb->data_len += frag_list_size;
-       skb->truesize += frag_list_size;
-       IXGBE_RSC_CB(skb)->skb_cnt = skb_cnt;
+       IXGBE_CB(tail)->head = head;
+       IXGBE_CB(head)->tail = tail;
+}
+
+/**
+ * ixgbe_close_active_frag_list - cleanup pointers on a frag_list skb
+ * @head: pointer to head of an active frag list
+ *
+ * This function will clear the frag_tail_tracker pointer on an active
+ * frag_list and returns true if the pointer was actually set
+ **/
+static inline bool ixgbe_close_active_frag_list(struct sk_buff *head)
+{
+       struct sk_buff *tail = IXGBE_CB(head)->tail;
+
+       if (!tail)
+               return false;
+
+       ixgbe_merge_active_tail(tail);
+
+       IXGBE_CB(head)->tail = NULL;
 
-       return skb;
+       return true;
 }
 
-static inline bool ixgbe_get_rsc_state(union ixgbe_adv_rx_desc *rx_desc)
+/**
+ * ixgbe_get_headlen - determine size of header for RSC/LRO/GRO/FCOE
+ * @data: pointer to the start of the headers
+ * @max_len: total length of section to find headers in
+ *
+ * This function is meant to determine the length of headers that will
+ * be recognized by hardware for LRO, GRO, and RSC offloads.  The main
+ * motivation of doing this is to only perform one pull for IPv4 TCP
+ * packets so that we can do basic things like calculating the gso_size
+ * based on the average data per packet.
+ **/
+static unsigned int ixgbe_get_headlen(unsigned char *data,
+                                     unsigned int max_len)
 {
-       return !!(le32_to_cpu(rx_desc->wb.lower.lo_dword.data) &
-               IXGBE_RXDADV_RSCCNT_MASK);
+       union {
+               unsigned char *network;
+               /* l2 headers */
+               struct ethhdr *eth;
+               struct vlan_hdr *vlan;
+               /* l3 headers */
+               struct iphdr *ipv4;
+       } hdr;
+       __be16 protocol;
+       u8 nexthdr = 0; /* default to not TCP */
+       u8 hlen;
+
+       /* this should never happen, but better safe than sorry */
+       if (max_len < ETH_HLEN)
+               return max_len;
+
+       /* initialize network frame pointer */
+       hdr.network = data;
+
+       /* set first protocol and move network header forward */
+       protocol = hdr.eth->h_proto;
+       hdr.network += ETH_HLEN;
+
+       /* handle any vlan tag if present */
+       if (protocol == __constant_htons(ETH_P_8021Q)) {
+               if ((hdr.network - data) > (max_len - VLAN_HLEN))
+                       return max_len;
+
+               protocol = hdr.vlan->h_vlan_encapsulated_proto;
+               hdr.network += VLAN_HLEN;
+       }
+
+       /* handle L3 protocols */
+       if (protocol == __constant_htons(ETH_P_IP)) {
+               if ((hdr.network - data) > (max_len - sizeof(struct iphdr)))
+                       return max_len;
+
+               /* access ihl as a u8 to avoid unaligned access on ia64 */
+               hlen = (hdr.network[0] & 0x0F) << 2;
+
+               /* verify hlen meets minimum size requirements */
+               if (hlen < sizeof(struct iphdr))
+                       return hdr.network - data;
+
+               /* record next protocol */
+               nexthdr = hdr.ipv4->protocol;
+               hdr.network += hlen;
+#ifdef CONFIG_FCOE
+       } else if (protocol == __constant_htons(ETH_P_FCOE)) {
+               if ((hdr.network - data) > (max_len - FCOE_HEADER_LEN))
+                       return max_len;
+               hdr.network += FCOE_HEADER_LEN;
+#endif
+       } else {
+               return hdr.network - data;
+       }
+
+       /* finally sort out TCP */
+       if (nexthdr == IPPROTO_TCP) {
+               if ((hdr.network - data) > (max_len - sizeof(struct tcphdr)))
+                       return max_len;
+
+               /* access doff as a u8 to avoid unaligned access on ia64 */
+               hlen = (hdr.network[12] & 0xF0) >> 2;
+
+               /* verify hlen meets minimum size requirements */
+               if (hlen < sizeof(struct tcphdr))
+                       return hdr.network - data;
+
+               hdr.network += hlen;
+       }
+
+       /*
+        * If everything has gone correctly hdr.network should be the
+        * data section of the packet and will be the end of the header.
+        * If not then it probably represents the end of the last recognized
+        * header.
+        */
+       if ((hdr.network - data) < max_len)
+               return hdr.network - data;
+       else
+               return max_len;
+}
+
+static void ixgbe_get_rsc_cnt(struct ixgbe_ring *rx_ring,
+                             union ixgbe_adv_rx_desc *rx_desc,
+                             struct sk_buff *skb)
+{
+       __le32 rsc_enabled;
+       u32 rsc_cnt;
+
+       if (!ring_is_rsc_enabled(rx_ring))
+               return;
+
+       rsc_enabled = rx_desc->wb.lower.lo_dword.data &
+                     cpu_to_le32(IXGBE_RXDADV_RSCCNT_MASK);
+
+       /* If this is an RSC frame rsc_cnt should be non-zero */
+       if (!rsc_enabled)
+               return;
+
+       rsc_cnt = le32_to_cpu(rsc_enabled);
+       rsc_cnt >>= IXGBE_RXDADV_RSCCNT_SHIFT;
+
+       IXGBE_CB(skb)->append_cnt += rsc_cnt - 1;
+}
+
+static void ixgbe_set_rsc_gso_size(struct ixgbe_ring *ring,
+                                  struct sk_buff *skb)
+{
+       u16 hdr_len = ixgbe_get_headlen(skb->data, skb_headlen(skb));
+
+       /* set gso_size to avoid messing up TCP MSS */
+       skb_shinfo(skb)->gso_size = DIV_ROUND_UP((skb->len - hdr_len),
+                                                IXGBE_CB(skb)->append_cnt);
+}
+
+static void ixgbe_update_rsc_stats(struct ixgbe_ring *rx_ring,
+                                  struct sk_buff *skb)
+{
+       /* if append_cnt is 0 then frame is not RSC */
+       if (!IXGBE_CB(skb)->append_cnt)
+               return;
+
+       rx_ring->rx_stats.rsc_count += IXGBE_CB(skb)->append_cnt;
+       rx_ring->rx_stats.rsc_flush++;
+
+       ixgbe_set_rsc_gso_size(rx_ring, skb);
+
+       /* gso_size is computed using append_cnt so always clear it last */
+       IXGBE_CB(skb)->append_cnt = 0;
+}
+
+/**
+ * ixgbe_process_skb_fields - Populate skb header fields from Rx descriptor
+ * @rx_ring: rx descriptor ring packet is being transacted on
+ * @rx_desc: pointer to the EOP Rx descriptor
+ * @skb: pointer to current skb being populated
+ *
+ * This function checks the ring, descriptor, and packet information in
+ * order to populate the hash, checksum, VLAN, timestamp, protocol, and
+ * other fields within the skb.
+ **/
+static void ixgbe_process_skb_fields(struct ixgbe_ring *rx_ring,
+                                    union ixgbe_adv_rx_desc *rx_desc,
+                                    struct sk_buff *skb)
+{
+       ixgbe_update_rsc_stats(rx_ring, skb);
+
+       ixgbe_rx_hash(rx_ring, rx_desc, skb);
+
+       ixgbe_rx_checksum(rx_ring, rx_desc, skb);
+
+       if (ixgbe_test_staterr(rx_desc, IXGBE_RXD_STAT_VP)) {
+               u16 vid = le16_to_cpu(rx_desc->wb.upper.vlan);
+               __vlan_hwaccel_put_tag(skb, vid);
+       }
+
+       skb_record_rx_queue(skb, rx_ring->queue_index);
+
+       skb->protocol = eth_type_trans(skb, rx_ring->netdev);
+}
+
+static void ixgbe_rx_skb(struct ixgbe_q_vector *q_vector,
+                        struct sk_buff *skb)
+{
+       struct ixgbe_adapter *adapter = q_vector->adapter;
+
+       if (!(adapter->flags & IXGBE_FLAG_IN_NETPOLL))
+               napi_gro_receive(&q_vector->napi, skb);
+       else
+               netif_rx(skb);
 }
 
 static bool ixgbe_clean_rx_irq(struct ixgbe_q_vector *q_vector,
                               struct ixgbe_ring *rx_ring,
                               int budget)
 {
-       struct ixgbe_adapter *adapter = q_vector->adapter;
        union ixgbe_adv_rx_desc *rx_desc, *next_rxd;
-       struct ixgbe_rx_buffer *rx_buffer_info, *next_buffer;
+       struct ixgbe_rx_buffer *rx_buffer_info;
        struct sk_buff *skb;
        unsigned int total_rx_bytes = 0, total_rx_packets = 0;
        const int current_node = numa_node_id();
 #ifdef IXGBE_FCOE
+       struct ixgbe_adapter *adapter = q_vector->adapter;
        int ddp_bytes = 0;
 #endif /* IXGBE_FCOE */
-       u32 staterr;
        u16 i;
        u16 cleaned_count = 0;
-       bool pkt_is_rsc = false;
 
        i = rx_ring->next_to_clean;
-       rx_desc = IXGBE_RX_DESC_ADV(rx_ring, i);
-       staterr = le32_to_cpu(rx_desc->wb.upper.status_error);
+       rx_desc = IXGBE_RX_DESC(rx_ring, i);
 
-       while (staterr & IXGBE_RXD_STAT_DD) {
+       while (ixgbe_test_staterr(rx_desc, IXGBE_RXD_STAT_DD)) {
                u32 upper_len = 0;
 
                rmb(); /* read descriptor and rx_buffer_info after status DD */
@@ -1271,32 +1496,9 @@ static bool ixgbe_clean_rx_irq(struct ixgbe_q_vector *q_vector,
                rx_buffer_info->skb = NULL;
                prefetch(skb->data);
 
-               if (ring_is_rsc_enabled(rx_ring))
-                       pkt_is_rsc = ixgbe_get_rsc_state(rx_desc);
-
                /* linear means we are building an skb from multiple pages */
                if (!skb_is_nonlinear(skb)) {
                        u16 hlen;
-                       if (pkt_is_rsc &&
-                           !(staterr & IXGBE_RXD_STAT_EOP) &&
-                           !skb->prev) {
-                               /*
-                                * When HWRSC is enabled, delay unmapping
-                                * of the first packet. It carries the
-                                * header information, HW may still
-                                * access the header after the writeback.
-                                * Only unmap it when EOP is reached
-                                */
-                               IXGBE_RSC_CB(skb)->delay_unmap = true;
-                               IXGBE_RSC_CB(skb)->dma = rx_buffer_info->dma;
-                       } else {
-                               dma_unmap_single(rx_ring->dev,
-                                                rx_buffer_info->dma,
-                                                rx_ring->rx_buf_len,
-                                                DMA_FROM_DEVICE);
-                       }
-                       rx_buffer_info->dma = 0;
-
                        if (ring_is_ps_enabled(rx_ring)) {
                                hlen = ixgbe_get_hlen(rx_desc);
                                upper_len = le16_to_cpu(rx_desc->wb.upper.length);
@@ -1305,6 +1507,23 @@ static bool ixgbe_clean_rx_irq(struct ixgbe_q_vector *q_vector,
                        }
 
                        skb_put(skb, hlen);
+
+                       /*
+                        * Delay unmapping of the first packet. It carries the
+                        * header information, HW may still access the header
+                        * after writeback.  Only unmap it when EOP is reached
+                        */
+                       if (!IXGBE_CB(skb)->head) {
+                               IXGBE_CB(skb)->delay_unmap = true;
+                               IXGBE_CB(skb)->dma = rx_buffer_info->dma;
+                       } else {
+                               skb = ixgbe_merge_active_tail(skb);
+                               dma_unmap_single(rx_ring->dev,
+                                                rx_buffer_info->dma,
+                                                rx_ring->rx_buf_len,
+                                                DMA_FROM_DEVICE);
+                       }
+                       rx_buffer_info->dma = 0;
                } else {
                        /* assume packet split since header is unmapped */
                        upper_len = le16_to_cpu(rx_desc->wb.upper.length);
@@ -1332,98 +1551,86 @@ static bool ixgbe_clean_rx_irq(struct ixgbe_q_vector *q_vector,
                        skb->truesize += PAGE_SIZE / 2;
                }
 
+               ixgbe_get_rsc_cnt(rx_ring, rx_desc, skb);
+
                i++;
                if (i == rx_ring->count)
                        i = 0;
 
-               next_rxd = IXGBE_RX_DESC_ADV(rx_ring, i);
+               next_rxd = IXGBE_RX_DESC(rx_ring, i);
                prefetch(next_rxd);
                cleaned_count++;
 
-               if (pkt_is_rsc) {
-                       u32 nextp = (staterr & IXGBE_RXDADV_NEXTP_MASK) >>
-                                    IXGBE_RXDADV_NEXTP_SHIFT;
+               if ((!ixgbe_test_staterr(rx_desc, IXGBE_RXD_STAT_EOP))) {
+                       struct ixgbe_rx_buffer *next_buffer;
+                       u32 nextp;
+
+                       if (IXGBE_CB(skb)->append_cnt) {
+                               nextp = le32_to_cpu(
+                                               rx_desc->wb.upper.status_error);
+                               nextp >>= IXGBE_RXDADV_NEXTP_SHIFT;
+                       } else {
+                               nextp = i;
+                       }
+
                        next_buffer = &rx_ring->rx_buffer_info[nextp];
-               } else {
-                       next_buffer = &rx_ring->rx_buffer_info[i];
-               }
 
-               if (!(staterr & IXGBE_RXD_STAT_EOP)) {
                        if (ring_is_ps_enabled(rx_ring)) {
                                rx_buffer_info->skb = next_buffer->skb;
                                rx_buffer_info->dma = next_buffer->dma;
                                next_buffer->skb = skb;
                                next_buffer->dma = 0;
                        } else {
-                               skb->next = next_buffer->skb;
-                               skb->next->prev = skb;
+                               struct sk_buff *next_skb = next_buffer->skb;
+                               ixgbe_add_active_tail(skb, next_skb);
+                               IXGBE_CB(next_skb)->head = skb;
                        }
                        rx_ring->rx_stats.non_eop_descs++;
                        goto next_desc;
                }
 
-               if (skb->prev) {
-                       skb = ixgbe_transform_rsc_queue(skb);
-                       /* if we got here without RSC the packet is invalid */
-                       if (!pkt_is_rsc) {
-                               __pskb_trim(skb, 0);
-                               rx_buffer_info->skb = skb;
-                               goto next_desc;
-                       }
-               }
+               dma_unmap_single(rx_ring->dev,
+                                IXGBE_CB(skb)->dma,
+                                rx_ring->rx_buf_len,
+                                DMA_FROM_DEVICE);
+               IXGBE_CB(skb)->dma = 0;
+               IXGBE_CB(skb)->delay_unmap = false;
 
-               if (ring_is_rsc_enabled(rx_ring)) {
-                       if (IXGBE_RSC_CB(skb)->delay_unmap) {
-                               dma_unmap_single(rx_ring->dev,
-                                                IXGBE_RSC_CB(skb)->dma,
-                                                rx_ring->rx_buf_len,
-                                                DMA_FROM_DEVICE);
-                               IXGBE_RSC_CB(skb)->dma = 0;
-                               IXGBE_RSC_CB(skb)->delay_unmap = false;
-                       }
-               }
-               if (pkt_is_rsc) {
-                       if (ring_is_ps_enabled(rx_ring))
-                               rx_ring->rx_stats.rsc_count +=
-                                       skb_shinfo(skb)->nr_frags;
-                       else
-                               rx_ring->rx_stats.rsc_count +=
-                                       IXGBE_RSC_CB(skb)->skb_cnt;
-                       rx_ring->rx_stats.rsc_flush++;
+               if (ixgbe_close_active_frag_list(skb) &&
+                   !IXGBE_CB(skb)->append_cnt) {
+                       /* if we got here without RSC the packet is invalid */
+                       dev_kfree_skb_any(skb);
+                       goto next_desc;
                }
 
                /* ERR_MASK will only have valid bits if EOP set */
-               if (unlikely(staterr & IXGBE_RXDADV_ERR_FRAME_ERR_MASK)) {
+               if (unlikely(ixgbe_test_staterr(rx_desc,
+                                           IXGBE_RXDADV_ERR_FRAME_ERR_MASK))) {
                        dev_kfree_skb_any(skb);
                        goto next_desc;
                }
 
-               ixgbe_rx_checksum(adapter, rx_desc, skb, staterr);
-               if (adapter->netdev->features & NETIF_F_RXHASH)
-                       ixgbe_rx_hash(rx_desc, skb);
-
                /* probably a little skewed due to removing CRC */
                total_rx_bytes += skb->len;
                total_rx_packets++;
 
-               skb->protocol = eth_type_trans(skb, rx_ring->netdev);
+               /* populate checksum, timestamp, VLAN, and protocol */
+               ixgbe_process_skb_fields(rx_ring, rx_desc, skb);
+
 #ifdef IXGBE_FCOE
                /* if ddp, not passing to ULD unless for FCP_RSP or error */
                if (ixgbe_rx_is_fcoe(adapter, rx_desc)) {
-                       ddp_bytes = ixgbe_fcoe_ddp(adapter, rx_desc, skb,
-                                                  staterr);
+                       ddp_bytes = ixgbe_fcoe_ddp(adapter, rx_desc, skb);
                        if (!ddp_bytes) {
                                dev_kfree_skb_any(skb);
                                goto next_desc;
                        }
                }
 #endif /* IXGBE_FCOE */
-               ixgbe_receive_skb(q_vector, skb, staterr, rx_ring, rx_desc);
+               ixgbe_rx_skb(q_vector, skb);
 
                budget--;
 next_desc:
-               rx_desc->wb.upper.status_error = 0;
-
                if (!budget)
                        break;
 
@@ -1435,7 +1642,6 @@ next_desc:
 
                /* use prefetched values */
                rx_desc = next_rxd;
-               staterr = le32_to_cpu(rx_desc->wb.upper.status_error);
        }
 
        rx_ring->next_to_clean = i;
@@ -2153,7 +2359,7 @@ static irqreturn_t ixgbe_intr(int irq, void *data)
        u32 eicr;
 
        /*
-        * Workaround for silicon errata on 82598.  Mask the interrupts
+        * Workaround for silicon errata #26 on 82598.  Mask the interrupt
         * before the read of EICR.
         */
        IXGBE_WRITE_REG(hw, IXGBE_EIMC, IXGBE_IRQ_CLEAR_MASK);
@@ -3876,19 +4082,18 @@ static void ixgbe_clean_rx_ring(struct ixgbe_ring *rx_ring)
                if (rx_buffer_info->skb) {
                        struct sk_buff *skb = rx_buffer_info->skb;
                        rx_buffer_info->skb = NULL;
-                       do {
-                               struct sk_buff *this = skb;
-                               if (IXGBE_RSC_CB(this)->delay_unmap) {
-                                       dma_unmap_single(dev,
-                                                        IXGBE_RSC_CB(this)->dma,
-                                                        rx_ring->rx_buf_len,
-                                                        DMA_FROM_DEVICE);
-                                       IXGBE_RSC_CB(this)->dma = 0;
-                                       IXGBE_RSC_CB(skb)->delay_unmap = false;
-                               }
-                               skb = skb->prev;
-                               dev_kfree_skb(this);
-                       } while (skb);
+                       /* We need to clean up RSC frag lists */
+                       skb = ixgbe_merge_active_tail(skb);
+                       ixgbe_close_active_frag_list(skb);
+                       if (IXGBE_CB(skb)->delay_unmap) {
+                               dma_unmap_single(dev,
+                                                IXGBE_CB(skb)->dma,
+                                                rx_ring->rx_buf_len,
+                                                DMA_FROM_DEVICE);
+                               IXGBE_CB(skb)->dma = 0;
+                               IXGBE_CB(skb)->delay_unmap = false;
+                       }
+                       dev_kfree_skb(skb);
                }
                if (!rx_buffer_info->page)
                        continue;
@@ -4176,7 +4381,11 @@ static inline bool ixgbe_set_fdir_queues(struct ixgbe_adapter *adapter)
        f_fdir->indices = min((int)num_online_cpus(), f_fdir->indices);
        f_fdir->mask = 0;
 
-       /* Flow Director must have RSS enabled */
+       /*
+        * Use RSS in addition to Flow Director to ensure the best
+        * distribution of flows across cores, even when an FDIR flow
+        * isn't matched.
+        */
        if ((adapter->flags & IXGBE_FLAG_RSS_ENABLED) &&
            (adapter->flags & IXGBE_FLAG_FDIR_HASH_CAPABLE)) {
                adapter->num_tx_queues = f_fdir->indices;
@@ -4353,7 +4562,8 @@ static void ixgbe_acquire_msix_vectors(struct ixgbe_adapter *adapter,
         */
        vector_threshold = MIN_MSIX_COUNT;
 
-       /* The more we get, the more we will assign to Tx/Rx Cleanup
+       /*
+        * The more we get, the more we will assign to Tx/Rx Cleanup
         * for the separate queues...where Rx Cleanup >= Tx Cleanup.
         * Right now, we simply care about how many we'll get; we'll
         * set them up later while requesting irq's.
@@ -4661,6 +4871,13 @@ static int ixgbe_alloc_queues(struct ixgbe_adapter *adapter)
                ring->dev = &adapter->pdev->dev;
                ring->netdev = adapter->netdev;
 
+               /*
+                * 82599 errata, UDP frames with a 0 checksum can be marked as
+                * checksum errors.
+                */
+               if (adapter->hw.mac.type == ixgbe_mac_82599EB)
+                       set_bit(__IXGBE_RX_CSUM_UDP_ZERO_ERR, &ring->state);
+
                adapter->rx_ring[rx] = ring;
        }
 
@@ -5065,9 +5282,6 @@ static int __devinit ixgbe_sw_init(struct ixgbe_adapter *adapter)
                return -EIO;
        }
 
-       /* enable rx csum by default */
-       adapter->flags |= IXGBE_FLAG_RX_CSUM_ENABLED;
-
        /* get assigned NUMA node */
        adapter->node = dev_to_node(&pdev->dev);
 
@@ -5558,7 +5772,7 @@ void ixgbe_update_stats(struct ixgbe_adapter *adapter)
        u32 i, missed_rx = 0, mpc, bprc, lxon, lxoff, xon_off_tot;
        u64 non_eop_descs = 0, restart_queue = 0, tx_busy = 0;
        u64 alloc_rx_page_failed = 0, alloc_rx_buff_failed = 0;
-       u64 bytes = 0, packets = 0;
+       u64 bytes = 0, packets = 0, hw_csum_rx_error = 0;
 #ifdef IXGBE_FCOE
        struct ixgbe_fcoe *fcoe = &adapter->fcoe;
        unsigned int cpu;
@@ -5588,12 +5802,14 @@ void ixgbe_update_stats(struct ixgbe_adapter *adapter)
                non_eop_descs += rx_ring->rx_stats.non_eop_descs;
                alloc_rx_page_failed += rx_ring->rx_stats.alloc_rx_page_failed;
                alloc_rx_buff_failed += rx_ring->rx_stats.alloc_rx_buff_failed;
+               hw_csum_rx_error += rx_ring->rx_stats.csum_err;
                bytes += rx_ring->stats.bytes;
                packets += rx_ring->stats.packets;
        }
        adapter->non_eop_descs = non_eop_descs;
        adapter->alloc_rx_page_failed = alloc_rx_page_failed;
        adapter->alloc_rx_buff_failed = alloc_rx_buff_failed;
+       adapter->hw_csum_rx_error = hw_csum_rx_error;
        netdev->stats.rx_bytes = bytes;
        netdev->stats.rx_packets = packets;
 
@@ -6279,7 +6495,7 @@ void ixgbe_tx_ctxtdesc(struct ixgbe_ring *tx_ring, u32 vlan_macip_lens,
        struct ixgbe_adv_tx_context_desc *context_desc;
        u16 i = tx_ring->next_to_use;
 
-       context_desc = IXGBE_TX_CTXTDESC_ADV(tx_ring, i);
+       context_desc = IXGBE_TX_CTXTDESC(tx_ring, i);
 
        i++;
        tx_ring->next_to_use = (i < tx_ring->count) ? i : 0;
@@ -6512,7 +6728,7 @@ static void ixgbe_tx_map(struct ixgbe_ring *tx_ring,
        cmd_type = ixgbe_tx_cmd_type(tx_flags);
        olinfo_status = ixgbe_tx_olinfo_status(tx_flags, paylen);
 
-       tx_desc = IXGBE_TX_DESC_ADV(tx_ring, i);
+       tx_desc = IXGBE_TX_DESC(tx_ring, i);
 
        for (;;) {
                while (size > IXGBE_MAX_DATA_PER_TXD) {
@@ -6527,7 +6743,7 @@ static void ixgbe_tx_map(struct ixgbe_ring *tx_ring,
                        tx_desc++;
                        i++;
                        if (i == tx_ring->count) {
-                               tx_desc = IXGBE_TX_DESC_ADV(tx_ring, 0);
+                               tx_desc = IXGBE_TX_DESC(tx_ring, 0);
                                i = 0;
                        }
                }
@@ -6563,7 +6779,7 @@ static void ixgbe_tx_map(struct ixgbe_ring *tx_ring,
                tx_desc++;
                i++;
                if (i == tx_ring->count) {
-                       tx_desc = IXGBE_TX_DESC_ADV(tx_ring, 0);
+                       tx_desc = IXGBE_TX_DESC(tx_ring, 0);
                        i = 0;
                }
        }
@@ -6785,7 +7001,7 @@ netdev_tx_t ixgbe_xmit_frame_ring(struct sk_buff *skb,
 
        /*
         * need: 1 descriptor per page * PAGE_SIZE/IXGBE_MAX_DATA_PER_TXD,
-        *       + 1 desc for skb_head_len/IXGBE_MAX_DATA_PER_TXD,
+        *       + 1 desc for skb_headlen/IXGBE_MAX_DATA_PER_TXD,
         *       + 2 desc gap to keep tail from touching head,
         *       + 1 desc for context descriptor,
         * otherwise try next time
@@ -6801,11 +7017,6 @@ netdev_tx_t ixgbe_xmit_frame_ring(struct sk_buff *skb,
                return NETDEV_TX_BUSY;
        }
 
-#ifdef CONFIG_PCI_IOV
-       if (adapter->flags & IXGBE_FLAG_SRIOV_ENABLED)
-               tx_flags |= IXGBE_TX_FLAGS_TXSW;
-
-#endif
        /* if we have a HW VLAN tag being added default to the HW one */
        if (vlan_tx_tag_present(skb)) {
                tx_flags |= vlan_tx_tag_get(skb) << IXGBE_TX_FLAGS_VLAN_SHIFT;
@@ -6818,10 +7029,20 @@ netdev_tx_t ixgbe_xmit_frame_ring(struct sk_buff *skb,
                        goto out_drop;
 
                protocol = vhdr->h_vlan_encapsulated_proto;
-               tx_flags |= ntohs(vhdr->h_vlan_TCI) << IXGBE_TX_FLAGS_VLAN_SHIFT;
+               tx_flags |= ntohs(vhdr->h_vlan_TCI) <<
+                                 IXGBE_TX_FLAGS_VLAN_SHIFT;
                tx_flags |= IXGBE_TX_FLAGS_SW_VLAN;
        }
 
+#ifdef CONFIG_PCI_IOV
+       /*
+        * Use the l2switch_enable flag - would be false if the DMA
+        * Tx switch had been disabled.
+        */
+       if (adapter->flags & IXGBE_FLAG_SRIOV_ENABLED)
+               tx_flags |= IXGBE_TX_FLAGS_TXSW;
+
+#endif
        /* DCB maps skb priorities 0-7 onto 3 bit PCP of VLAN tag. */
        if ((adapter->flags & IXGBE_FLAG_DCB_ENABLED) &&
            ((tx_flags & (IXGBE_TX_FLAGS_HW_VLAN | IXGBE_TX_FLAGS_SW_VLAN)) ||
@@ -7222,12 +7443,6 @@ static int ixgbe_set_features(struct net_device *netdev,
        struct ixgbe_adapter *adapter = netdev_priv(netdev);
        bool need_reset = false;
 
-       /* If Rx checksum is disabled, then RSC/LRO should also be disabled */
-       if (!(data & NETIF_F_RXCSUM))
-               adapter->flags &= ~IXGBE_FLAG_RX_CSUM_ENABLED;
-       else
-               adapter->flags |= IXGBE_FLAG_RX_CSUM_ENABLED;
-
        /* Make sure RSC matches LRO, reset if change */
        if (!!(data & NETIF_F_LRO) !=
             !!(adapter->flags2 & IXGBE_FLAG2_RSC_ENABLED)) {
@@ -7493,6 +7708,9 @@ static int __devinit ixgbe_probe(struct pci_dev *pdev,
                        e_crit(probe, "Fan has stopped, replace the adapter\n");
        }
 
+       if (allow_unsupported_sfp)
+               hw->allow_unsupported_sfp = allow_unsupported_sfp;
+
        /* reset_hw fills in the perm_addr as well */
        hw->phy.reset_if_overtemp = true;
        err = hw->mac.ops.reset_hw(hw);
index b917735..bf9f82f 100644 (file)
@@ -834,6 +834,7 @@ out:
  **/
 s32 ixgbe_identify_sfp_module_generic(struct ixgbe_hw *hw)
 {
+       struct ixgbe_adapter *adapter = hw->back;
        s32 status = IXGBE_ERR_PHY_ADDR_INVALID;
        u32 vendor_oui = 0;
        enum ixgbe_sfp_type stored_sfp_type = hw->phy.sfp_type;
@@ -1068,9 +1069,16 @@ s32 ixgbe_identify_sfp_module_generic(struct ixgbe_hw *hw)
                        if (hw->phy.type == ixgbe_phy_sfp_intel) {
                                status = 0;
                        } else {
-                               hw_dbg(hw, "SFP+ module not supported\n");
-                               hw->phy.type = ixgbe_phy_sfp_unsupported;
-                               status = IXGBE_ERR_SFP_NOT_SUPPORTED;
+                               if (hw->allow_unsupported_sfp) {
+                                       e_warn(drv, "WARNING: Intel (R) Network Connections are quality tested using Intel (R) Ethernet Optics.  Using untested modules is not supported and may cause unstable operation or damage to the module or the adapter.  Intel Corporation is not responsible for any harm caused by using untested modules.");
+                                       status = 0;
+                               } else {
+                                       hw_dbg(hw,
+                                              "SFP+ module not supported\n");
+                                       hw->phy.type =
+                                               ixgbe_phy_sfp_unsupported;
+                                       status = IXGBE_ERR_SFP_NOT_SUPPORTED;
+                               }
                        }
                } else {
                        status = 0;
index b01ecb4..88a58cb 100644 (file)
@@ -258,7 +258,7 @@ static void ixgbe_restore_vf_macvlans(struct ixgbe_adapter *adapter)
 
        list_for_each(pos, &adapter->vf_mvs.l) {
                entry = list_entry(pos, struct vf_macvlans, l);
-               if (entry->free == false)
+               if (!entry->free)
                        hw->mac.ops.set_rar(hw, entry->rar_entry,
                                            entry->vf_macvlan,
                                            entry->vf, IXGBE_RAH_AV);
index 9b95bef..4c06029 100644 (file)
@@ -2892,6 +2892,7 @@ struct ixgbe_hw {
        u8                              revision_id;
        bool                            adapter_stopped;
        bool                            force_full_reset;
+       bool                            allow_unsupported_sfp;
 };
 
 struct ixgbe_info {
index f838a2b..5e9f05f 100644 (file)
@@ -760,7 +760,7 @@ static s32 ixgbe_blink_led_start_X540(struct ixgbe_hw *hw, u32 index)
         * This will be reversed when we stop the blinking.
         */
        hw->mac.ops.check_link(hw, &speed, &link_up, false);
-       if (link_up == false) {
+       if (!link_up) {
                macc_reg = IXGBE_READ_REG(hw, IXGBE_MACC);
                macc_reg |= IXGBE_MACC_FLU | IXGBE_MACC_FSV_10G | IXGBE_MACC_FS;
                IXGBE_WRITE_REG(hw, IXGBE_MACC, macc_reg);
index e51d552..581c659 100644 (file)
@@ -2199,13 +2199,17 @@ static int __devinit ixgbevf_sw_init(struct ixgbevf_adapter *adapter)
        if (err) {
                dev_info(&pdev->dev,
                         "PF still in reset state, assigning new address\n");
-               dev_hw_addr_random(adapter->netdev, hw->mac.addr);
+               eth_hw_addr_random(adapter->netdev);
+               memcpy(adapter->hw.mac.addr, adapter->netdev->dev_addr,
+                       adapter->netdev->addr_len);
        } else {
                err = hw->mac.ops.init_hw(hw);
                if (err) {
                        pr_err("init_shared_code failed: %d\n", err);
                        goto out;
                }
+               memcpy(adapter->netdev->dev_addr, adapter->hw.mac.addr,
+                       adapter->netdev->addr_len);
        }
 
        /* Enable dynamic interrupt throttling rates */
@@ -2224,6 +2228,7 @@ static int __devinit ixgbevf_sw_init(struct ixgbevf_adapter *adapter)
        adapter->flags |= IXGBE_FLAG_RX_CSUM_ENABLED;
 
        set_bit(__IXGBEVF_DOWN, &adapter->state);
+       return 0;
 
 out:
        return err;
@@ -2521,12 +2526,8 @@ int ixgbevf_setup_rx_resources(struct ixgbevf_adapter *adapter,
 
        size = sizeof(struct ixgbevf_rx_buffer) * rx_ring->count;
        rx_ring->rx_buffer_info = vzalloc(size);
-       if (!rx_ring->rx_buffer_info) {
-               hw_dbg(&adapter->hw,
-                      "Unable to vmalloc buffer memory for "
-                      "the receive descriptor ring\n");
+       if (!rx_ring->rx_buffer_info)
                goto alloc_failed;
-       }
 
        /* Round up to nearest 4K */
        rx_ring->size = rx_ring->count * sizeof(union ixgbe_adv_rx_desc);
@@ -3398,6 +3399,17 @@ static int __devinit ixgbevf_probe(struct pci_dev *pdev,
 
        /* setup the private structure */
        err = ixgbevf_sw_init(adapter);
+       if (err)
+               goto err_sw_init;
+
+       /* The HW MAC address was set and/or determined in sw_init */
+       memcpy(netdev->perm_addr, adapter->hw.mac.addr, netdev->addr_len);
+
+       if (!is_valid_ether_addr(netdev->dev_addr)) {
+               pr_err("invalid MAC address\n");
+               err = -EIO;
+               goto err_sw_init;
+       }
 
        netdev->hw_features = NETIF_F_SG |
                           NETIF_F_IP_CSUM |
@@ -3422,16 +3434,6 @@ static int __devinit ixgbevf_probe(struct pci_dev *pdev,
 
        netdev->priv_flags |= IFF_UNICAST_FLT;
 
-       /* The HW MAC address was set and/or determined in sw_init */
-       memcpy(netdev->dev_addr, adapter->hw.mac.addr, netdev->addr_len);
-       memcpy(netdev->perm_addr, adapter->hw.mac.addr, netdev->addr_len);
-
-       if (!is_valid_ether_addr(netdev->dev_addr)) {
-               pr_err("invalid MAC address\n");
-               err = -EIO;
-               goto err_sw_init;
-       }
-
        init_timer(&adapter->watchdog_timer);
        adapter->watchdog_timer.function = ixgbevf_watchdog;
        adapter->watchdog_timer.data = (unsigned long)adapter;
@@ -3460,13 +3462,7 @@ static int __devinit ixgbevf_probe(struct pci_dev *pdev,
        ixgbevf_init_last_counter_stats(adapter);
 
        /* print the MAC address */
-       hw_dbg(hw, "%2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x\n",
-              netdev->dev_addr[0],
-              netdev->dev_addr[1],
-              netdev->dev_addr[2],
-              netdev->dev_addr[3],
-              netdev->dev_addr[4],
-              netdev->dev_addr[5]);
+       hw_dbg(hw, "%pM\n", netdev->dev_addr);
 
        hw_dbg(hw, "MAC: %d\n", hw->mac.type);
 
index 55cbf65..4ea6580 100644 (file)
@@ -2991,7 +2991,6 @@ jme_init_one(struct pci_dev *pdev,
         */
        netdev = alloc_etherdev(sizeof(*jme));
        if (!netdev) {
-               pr_err("Cannot allocate netdev structure\n");
                rc = -ENOMEM;
                goto err_out_release_regions;
        }
index 6ad094f..f30db1c 100644 (file)
@@ -1108,10 +1108,9 @@ static int korina_probe(struct platform_device *pdev)
        int rc;
 
        dev = alloc_etherdev(sizeof(struct korina_private));
-       if (!dev) {
-               printk(KERN_ERR DRV_NAME ": alloc_etherdev failed\n");
+       if (!dev)
                return -ENOMEM;
-       }
+
        SET_NETDEV_DEV(dev, &pdev->dev);
        lp = netdev_priv(dev);
 
@@ -1150,7 +1149,6 @@ static int korina_probe(struct platform_device *pdev)
 
        lp->td_ring = kmalloc(TD_RING_SIZE + RD_RING_SIZE, GFP_KERNEL);
        if (!lp->td_ring) {
-               printk(KERN_ERR DRV_NAME ": cannot allocate descriptors\n");
                rc = -ENXIO;
                goto probe_err_td_ring;
        }
index 85e2c6c..5dc9cbd 100644 (file)
@@ -114,7 +114,7 @@ struct ltq_etop_priv {
 static int
 ltq_etop_alloc_skb(struct ltq_etop_chan *ch)
 {
-       ch->skb[ch->dma.desc] = dev_alloc_skb(MAX_DMA_DATA_LEN);
+       ch->skb[ch->dma.desc] = netdev_alloc_skb(ch->netdev, MAX_DMA_DATA_LEN);
        if (!ch->skb[ch->dma.desc])
                return -ENOMEM;
        ch->dma.desc_base[ch->dma.desc].addr = dma_map_single(NULL,
@@ -634,6 +634,7 @@ ltq_etop_init(struct net_device *dev)
        struct ltq_etop_priv *priv = netdev_priv(dev);
        struct sockaddr mac;
        int err;
+       bool random_mac = false;
 
        ether_setup(dev);
        dev->watchdog_timeo = 10 * HZ;
@@ -646,11 +647,17 @@ ltq_etop_init(struct net_device *dev)
        if (!is_valid_ether_addr(mac.sa_data)) {
                pr_warn("etop: invalid MAC, using random\n");
                random_ether_addr(mac.sa_data);
+               random_mac = true;
        }
 
        err = ltq_etop_set_mac_address(dev, &mac);
        if (err)
                goto err_netdev;
+
+       /* Set addr_assign_type here, ltq_etop_set_mac_address would reset it. */
+       if (random_mac)
+               dev->addr_assign_type |= NET_ADDR_RANDOM;
+
        ltq_etop_set_multicast_list(dev);
        err = ltq_etop_mdio_init(dev);
        if (err)
@@ -731,6 +738,10 @@ ltq_etop_probe(struct platform_device *pdev)
        }
 
        dev = alloc_etherdev_mq(sizeof(struct ltq_etop_priv), 4);
+       if (!dev) {
+               err = -ENOMEM;
+               goto err_out;
+       }
        strcpy(dev->name, "eth%d");
        dev->netdev_ops = &ltq_eth_netdev_ops;
        dev->ethtool_ops = &ltq_etop_ethtool_ops;
@@ -792,7 +803,7 @@ init_ltq_etop(void)
        int ret = platform_driver_probe(&ltq_mii_driver, ltq_etop_probe);
 
        if (ret)
-               pr_err("ltq_etop: Error registering platfom driver!");
+               pr_err("ltq_etop: Error registering platform driver!");
        return ret;
 }
 
index 9edecfa..75af1af 100644 (file)
@@ -667,7 +667,7 @@ static int rxq_refill(struct rx_queue *rxq, int budget)
 
                skb = __skb_dequeue(&mp->rx_recycle);
                if (skb == NULL)
-                       skb = dev_alloc_skb(mp->skb_size);
+                       skb = netdev_alloc_skb(mp->dev, mp->skb_size);
 
                if (skb == NULL) {
                        mp->oom = 1;
@@ -1832,7 +1832,7 @@ static int mv643xx_eth_set_mac_address(struct net_device *dev, void *addr)
        struct sockaddr *sa = addr;
 
        if (!is_valid_ether_addr(sa->sa_data))
-               return -EINVAL;
+               return -EADDRNOTAVAIL;
 
        memcpy(dev->dev_addr, sa->sa_data, ETH_ALEN);
 
index 953ba58..3a7df05 100644 (file)
@@ -350,7 +350,7 @@ static void rxq_refill(struct net_device *dev)
        while (pep->rx_desc_count < pep->rx_ring_size) {
                int size;
 
-               skb = dev_alloc_skb(pep->skb_size);
+               skb = netdev_alloc_skb(dev, pep->skb_size);
                if (!skb)
                        break;
                if (SKB_DMA_REALIGN)
@@ -627,8 +627,9 @@ static int pxa168_eth_set_mac_address(struct net_device *dev, void *addr)
        unsigned char oldMac[ETH_ALEN];
 
        if (!is_valid_ether_addr(sa->sa_data))
-               return -EINVAL;
+               return -EADDRNOTAVAIL;
        memcpy(oldMac, dev->dev_addr, ETH_ALEN);
+       dev->addr_assign_type &= ~NET_ADDR_RANDOM;
        memcpy(dev->dev_addr, sa->sa_data, ETH_ALEN);
        netif_addr_lock_bh(dev);
        update_hash_table_mac_address(pep, oldMac, dev->dev_addr);
@@ -1017,10 +1018,9 @@ static int rxq_init(struct net_device *dev)
        /* Allocate RX skb rings */
        pep->rx_skb = kmalloc(sizeof(*pep->rx_skb) * pep->rx_ring_size,
                             GFP_KERNEL);
-       if (!pep->rx_skb) {
-               printk(KERN_ERR "%s: Cannot alloc RX skb ring\n", dev->name);
+       if (!pep->rx_skb)
                return -ENOMEM;
-       }
+
        /* Allocate RX ring */
        pep->rx_desc_count = 0;
        size = pep->rx_ring_size * sizeof(struct rx_desc);
@@ -1081,10 +1081,9 @@ static int txq_init(struct net_device *dev)
 
        pep->tx_skb = kmalloc(sizeof(*pep->tx_skb) * pep->tx_ring_size,
                             GFP_KERNEL);
-       if (!pep->tx_skb) {
-               printk(KERN_ERR "%s: Cannot alloc TX skb ring\n", dev->name);
+       if (!pep->tx_skb)
                return -ENOMEM;
-       }
+
        /* Allocate TX ring */
        pep->tx_desc_count = 0;
        size = pep->tx_ring_size * sizeof(struct tx_desc);
@@ -1522,7 +1521,7 @@ static int pxa168_eth_probe(struct platform_device *pdev)
        INIT_WORK(&pep->tx_timeout_task, pxa168_eth_tx_timeout_task);
 
        printk(KERN_INFO "%s:Using random mac address\n", DRIVER_NAME);
-       random_ether_addr(dev->dev_addr);
+       eth_hw_addr_random(dev);
 
        pep->pd = pdev->dev.platform_data;
        pep->rx_ring_size = NUM_RX_DESCS;
index 33947ac..5a30bf8 100644 (file)
@@ -3807,10 +3807,8 @@ static struct net_device *skge_devinit(struct skge_hw *hw, int port,
        struct skge_port *skge;
        struct net_device *dev = alloc_etherdev(sizeof(*skge));
 
-       if (!dev) {
-               dev_err(&hw->pdev->dev, "etherdev alloc failed\n");
+       if (!dev)
                return NULL;
-       }
 
        SET_NETDEV_DEV(dev, &hw->pdev->dev);
        dev->netdev_ops = &skge_netdev_ops;
index 760c2b1..82c2c86 100644 (file)
@@ -4700,10 +4700,8 @@ static __devinit struct net_device *sky2_init_netdev(struct sky2_hw *hw,
        struct sky2_port *sky2;
        struct net_device *dev = alloc_etherdev(sizeof(*sky2));
 
-       if (!dev) {
-               dev_err(&hw->pdev->dev, "etherdev alloc failed\n");
+       if (!dev)
                return NULL;
-       }
 
        SET_NETDEV_DEV(dev, &hw->pdev->dev);
        dev->irq = hw->pdev->irq;
index eaf09d4..48d5c48 100644 (file)
@@ -1314,7 +1314,7 @@ static void mlx4_master_do_cmd(struct mlx4_dev *dev, int slave, u8 cmd,
                down(&priv->cmd.slave_sem);
                if (mlx4_master_process_vhcr(dev, slave, NULL)) {
                        mlx4_err(dev, "Failed processing vhcr for slave:%d,"
-                                " reseting slave.\n", slave);
+                                " resetting slave.\n", slave);
                        up(&priv->cmd.slave_sem);
                        goto reset_slave;
                }
index 149e60d..9fe4f94 100644 (file)
@@ -1048,10 +1048,8 @@ int mlx4_en_init_netdev(struct mlx4_en_dev *mdev, int port,
 
        dev = alloc_etherdev_mqs(sizeof(struct mlx4_en_priv),
            prof->tx_ring_num, prof->rx_ring_num);
-       if (dev == NULL) {
-               mlx4_err(mdev, "Net device allocation failed\n");
+       if (dev == NULL)
                return -ENOMEM;
-       }
 
        SET_NETDEV_DEV(dev, &mdev->dev->pdev->dev);
        dev->dev_id =  port - 1;
index d4ad8c2..d703ef2 100644 (file)
@@ -285,10 +285,9 @@ int mlx4_en_create_rx_ring(struct mlx4_en_priv *priv,
        tmp = size * roundup_pow_of_two(MLX4_EN_MAX_RX_FRAGS *
                                        sizeof(struct skb_frag_struct));
        ring->rx_info = vmalloc(tmp);
-       if (!ring->rx_info) {
-               en_err(priv, "Failed allocating rx_info ring\n");
+       if (!ring->rx_info)
                return -ENOMEM;
-       }
+
        en_dbg(DRV, priv, "Allocated rx_info ring at addr:%p size:%d\n",
                 ring->rx_info, tmp);
 
@@ -468,12 +467,11 @@ static struct sk_buff *mlx4_en_rx_skb(struct mlx4_en_priv *priv,
        int used_frags;
        dma_addr_t dma;
 
-       skb = dev_alloc_skb(SMALL_PACKET_SIZE + NET_IP_ALIGN);
+       skb = netdev_alloc_skb(priv->dev, SMALL_PACKET_SIZE + NET_IP_ALIGN);
        if (!skb) {
                en_dbg(RX_ERR, priv, "Failed allocating skb\n");
                return NULL;
        }
-       skb->dev = priv->dev;
        skb_reserve(skb, NET_IP_ALIGN);
        skb->len = length;
 
index 9ef9038..50b3fa5 100644 (file)
@@ -71,16 +71,14 @@ int mlx4_en_create_tx_ring(struct mlx4_en_priv *priv,
 
        tmp = size * sizeof(struct mlx4_en_tx_info);
        ring->tx_info = vmalloc(tmp);
-       if (!ring->tx_info) {
-               en_err(priv, "Failed allocating tx_info ring\n");
+       if (!ring->tx_info)
                return -ENOMEM;
-       }
+
        en_dbg(DRV, priv, "Allocated tx_info ring at addr:%p size:%d\n",
                 ring->tx_info, tmp);
 
        ring->bounce_buf = kmalloc(MAX_DESC_SIZE, GFP_KERNEL);
        if (!ring->bounce_buf) {
-               en_err(priv, "Failed allocating bounce buffer\n");
                err = -ENOMEM;
                goto err_tx;
        }
@@ -603,8 +601,6 @@ netdev_tx_t mlx4_en_xmit(struct sk_buff *skb, struct net_device *dev)
        struct skb_frag_struct *frag;
        struct mlx4_en_tx_info *tx_info;
        struct ethhdr *ethh;
-       u64 mac;
-       u32 mac_l, mac_h;
        int tx_ind = 0;
        int nr_txbb;
        int desc_size;
@@ -689,16 +685,9 @@ netdev_tx_t mlx4_en_xmit(struct sk_buff *skb, struct net_device *dev)
        }
 
        /* Copy dst mac address to wqe */
-       skb_reset_mac_header(skb);
-       ethh = eth_hdr(skb);
-       if (ethh && ethh->h_dest) {
-               mac = mlx4_en_mac_to_u64(ethh->h_dest);
-               mac_h = (u32) ((mac & 0xffff00000000ULL) >> 16);
-               mac_l = (u32) (mac & 0xffffffff);
-               tx_desc->ctrl.srcrb_flags |= cpu_to_be32(mac_h);
-               tx_desc->ctrl.imm = cpu_to_be32(mac_l);
-       }
-
+       ethh = (struct ethhdr *)skb->data;
+       tx_desc->ctrl.srcrb_flags16[0] = get_unaligned((__be16 *)ethh->h_dest);
+       tx_desc->ctrl.imm = get_unaligned((__be32 *)(ethh->h_dest + 2));
        /* Handle LSO (TSO) packets */
        if (lso_header_size) {
                /* Mark opcode as LSO */
index d498f04..5f15014 100644 (file)
@@ -1545,13 +1545,11 @@ static int mlx4_init_steering(struct mlx4_dev *dev)
        if (!priv->steer)
                return -ENOMEM;
 
-       for (i = 0; i < num_entries; i++) {
+       for (i = 0; i < num_entries; i++)
                for (j = 0; j < MLX4_NUM_STEERS; j++) {
                        INIT_LIST_HEAD(&priv->steer[i].promisc_qps[j]);
                        INIT_LIST_HEAD(&priv->steer[i].steer_entries[j]);
                }
-               INIT_LIST_HEAD(&priv->steer[i].high_prios);
-       }
        return 0;
 }
 
index ca574d8..4799e82 100644 (file)
@@ -562,14 +562,14 @@ out_mutex:
  */
 static int find_entry(struct mlx4_dev *dev, u8 port,
                      u8 *gid, enum mlx4_protocol prot,
-                     enum mlx4_steer_type steer,
                      struct mlx4_cmd_mailbox *mgm_mailbox,
-                     u16 *hash, int *prev, int *index)
+                     int *prev, int *index)
 {
        struct mlx4_cmd_mailbox *mailbox;
        struct mlx4_mgm *mgm = mgm_mailbox->buf;
        u8 *mgid;
        int err;
+       u16 hash;
        u8 op_mod = (prot == MLX4_PROT_ETH) ?
                !!(dev->caps.flags & MLX4_DEV_CAP_FLAG_VEP_MC_STEER) : 0;
 
@@ -580,15 +580,15 @@ static int find_entry(struct mlx4_dev *dev, u8 port,
 
        memcpy(mgid, gid, 16);
 
-       err = mlx4_GID_HASH(dev, mailbox, hash, op_mod);
+       err = mlx4_GID_HASH(dev, mailbox, &hash, op_mod);
        mlx4_free_cmd_mailbox(dev, mailbox);
        if (err)
                return err;
 
        if (0)
-               mlx4_dbg(dev, "Hash for %pI6 is %04x\n", gid, *hash);
+               mlx4_dbg(dev, "Hash for %pI6 is %04x\n", gid, hash);
 
-       *index = *hash;
+       *index = hash;
        *prev  = -1;
 
        do {
@@ -597,7 +597,7 @@ static int find_entry(struct mlx4_dev *dev, u8 port,
                        return err;
 
                if (!(be32_to_cpu(mgm->members_count) & 0xffffff)) {
-                       if (*index != *hash) {
+                       if (*index != hash) {
                                mlx4_err(dev, "Found zero MGID in AMGM.\n");
                                err = -EINVAL;
                        }
@@ -624,7 +624,6 @@ int mlx4_qp_attach_common(struct mlx4_dev *dev, struct mlx4_qp *qp, u8 gid[16],
        struct mlx4_cmd_mailbox *mailbox;
        struct mlx4_mgm *mgm;
        u32 members_count;
-       u16 hash;
        int index, prev;
        int link = 0;
        int i;
@@ -638,8 +637,8 @@ int mlx4_qp_attach_common(struct mlx4_dev *dev, struct mlx4_qp *qp, u8 gid[16],
        mgm = mailbox->buf;
 
        mutex_lock(&priv->mcg_table.mutex);
-       err = find_entry(dev, port, gid, prot, steer,
-                        mailbox, &hash, &prev, &index);
+       err = find_entry(dev, port, gid, prot,
+                        mailbox, &prev, &index);
        if (err)
                goto out;
 
@@ -733,7 +732,6 @@ int mlx4_qp_detach_common(struct mlx4_dev *dev, struct mlx4_qp *qp, u8 gid[16],
        struct mlx4_cmd_mailbox *mailbox;
        struct mlx4_mgm *mgm;
        u32 members_count;
-       u16 hash;
        int prev, index;
        int i, loc;
        int err;
@@ -747,8 +745,8 @@ int mlx4_qp_detach_common(struct mlx4_dev *dev, struct mlx4_qp *qp, u8 gid[16],
 
        mutex_lock(&priv->mcg_table.mutex);
 
-       err = find_entry(dev, port, gid, prot, steer,
-                        mailbox, &hash, &prev, &index);
+       err = find_entry(dev, port, gid, prot,
+                        mailbox, &prev, &index);
        if (err)
                goto out;
 
@@ -872,44 +870,36 @@ static int mlx4_QP_ATTACH(struct mlx4_dev *dev, struct mlx4_qp *qp,
 int mlx4_multicast_attach(struct mlx4_dev *dev, struct mlx4_qp *qp, u8 gid[16],
                          int block_mcast_loopback, enum mlx4_protocol prot)
 {
-       enum mlx4_steer_type steer;
-
-       steer = (is_valid_ether_addr(&gid[10])) ? MLX4_UC_STEER : MLX4_MC_STEER;
-
        if (prot == MLX4_PROT_ETH &&
                        !(dev->caps.flags & MLX4_DEV_CAP_FLAG_VEP_MC_STEER))
                return 0;
 
        if (prot == MLX4_PROT_ETH)
-               gid[7] |= (steer << 1);
+               gid[7] |= (MLX4_MC_STEER << 1);
 
        if (mlx4_is_mfunc(dev))
                return mlx4_QP_ATTACH(dev, qp, gid, 1,
                                        block_mcast_loopback, prot);
 
        return mlx4_qp_attach_common(dev, qp, gid, block_mcast_loopback,
-                                       prot, steer);
+                                       prot, MLX4_MC_STEER);
 }
 EXPORT_SYMBOL_GPL(mlx4_multicast_attach);
 
 int mlx4_multicast_detach(struct mlx4_dev *dev, struct mlx4_qp *qp, u8 gid[16],
                          enum mlx4_protocol prot)
 {
-       enum mlx4_steer_type steer;
-
-       steer = (is_valid_ether_addr(&gid[10])) ? MLX4_UC_STEER : MLX4_MC_STEER;
-
        if (prot == MLX4_PROT_ETH &&
                        !(dev->caps.flags & MLX4_DEV_CAP_FLAG_VEP_MC_STEER))
                return 0;
 
        if (prot == MLX4_PROT_ETH)
-               gid[7] |= (steer << 1);
+               gid[7] |= (MLX4_MC_STEER << 1);
 
        if (mlx4_is_mfunc(dev))
                return mlx4_QP_ATTACH(dev, qp, gid, 0, 0, prot);
 
-       return mlx4_qp_detach_common(dev, qp, gid, prot, steer);
+       return mlx4_qp_detach_common(dev, qp, gid, prot, MLX4_MC_STEER);
 }
 EXPORT_SYMBOL_GPL(mlx4_multicast_detach);
 
index 28f8251..5da51b9 100644 (file)
@@ -703,7 +703,6 @@ struct mlx4_msix_ctl {
 struct mlx4_steer {
        struct list_head promisc_qps[MLX4_NUM_STEERS];
        struct list_head steer_entries[MLX4_NUM_STEERS];
-       struct list_head high_prios;
 };
 
 struct mlx4_priv {
index f44ae55..575839d 100644 (file)
@@ -87,7 +87,6 @@ static int mlx4_uc_steer_add(struct mlx4_dev *dev, u8 port, u64 mac, int *qpn)
        mac = cpu_to_be64(mac << 16);
        memcpy(&gid[10], &mac, ETH_ALEN);
        gid[5] = port;
-       gid[7] = MLX4_UC_STEER << 1;
 
        err = mlx4_unicast_attach(dev, &qp, gid, 0, MLX4_PROT_ETH);
        if (err)
@@ -107,7 +106,6 @@ static void mlx4_uc_steer_release(struct mlx4_dev *dev, u8 port,
        mac = cpu_to_be64(mac << 16);
        memcpy(&gid[10], &mac, ETH_ALEN);
        gid[5] = port;
-       gid[7] = MLX4_UC_STEER << 1;
 
        mlx4_unicast_detach(dev, &qp, gid, MLX4_PROT_ETH);
 }
index ab81c0d..dccae1d 100644 (file)
@@ -278,7 +278,8 @@ ks8695_refill_rxbuffers(struct ks8695_priv *ksp)
 
        for (buff_n = 0; buff_n < MAX_RX_DESC; ++buff_n) {
                if (!ksp->rx_buffers[buff_n].skb) {
-                       struct sk_buff *skb = dev_alloc_skb(MAX_RXBUF_SIZE);
+                       struct sk_buff *skb =
+                               netdev_alloc_skb(ksp->ndev, MAX_RXBUF_SIZE);
                        dma_addr_t mapping;
 
                        ksp->rx_buffers[buff_n].skb = skb;
@@ -299,7 +300,6 @@ ks8695_refill_rxbuffers(struct ks8695_priv *ksp)
                                break;
                        }
                        ksp->rx_buffers[buff_n].dma_ptr = mapping;
-                       skb->dev = ksp->ndev;
                        ksp->rx_buffers[buff_n].length = MAX_RXBUF_SIZE;
 
                        /* Record this into the DMA ring */
@@ -1362,10 +1362,8 @@ ks8695_probe(struct platform_device *pdev)
 
        /* Initialise a net_device */
        ndev = alloc_etherdev(sizeof(struct ks8695_priv));
-       if (!ndev) {
-               dev_err(&pdev->dev, "could not allocate device.\n");
+       if (!ndev)
                return -ENOMEM;
-       }
 
        SET_NETDEV_DEV(ndev, &pdev->dev);
 
index 0a85690..0686b93 100644 (file)
@@ -1080,6 +1080,7 @@ static int ks8842_set_mac(struct net_device *netdev, void *p)
        if (!is_valid_ether_addr(addr->sa_data))
                return -EADDRNOTAVAIL;
 
+       netdev->addr_assign_type &= ~NET_ADDR_RANDOM;
        memcpy(netdev->dev_addr, mac, netdev->addr_len);
 
        ks8842_write_mac_addr(adapter, mac);
@@ -1211,7 +1212,7 @@ static int __devinit ks8842_probe(struct platform_device *pdev)
                ks8842_read_mac_addr(adapter, netdev->dev_addr);
 
                if (!is_valid_ether_addr(netdev->dev_addr))
-                       random_ether_addr(netdev->dev_addr);
+                       eth_hw_addr_random(netdev);
        }
 
        id = ks8842_read16(adapter, 32, REG_SW_ID_AND_ENABLE);
index 0c3e400..c722aa6 100644 (file)
@@ -1,4 +1,4 @@
-/* drivers/net/ks8851.c
+/* drivers/net/ethernet/micrel/ks8851.c
  *
  * Copyright 2009 Simtec Electronics
  *     http://www.simtec.co.uk/
@@ -439,13 +439,13 @@ static void ks8851_init_mac(struct ks8851_net *ks)
                                dev->dev_addr);
        }
 
-       random_ether_addr(dev->dev_addr);
+       eth_hw_addr_random(dev);
        ks8851_write_mac_addr(dev);
 }
 
 /**
  * ks8851_irq - device interrupt handler
- * @irq: Interrupt number passed from the IRQ hnalder.
+ * @irq: Interrupt number passed from the IRQ handler.
  * @pw: The private word passed to register_irq(), our struct ks8851_net.
  *
  * Disable the interrupt from happening again until we've processed the
@@ -1050,6 +1050,7 @@ static int ks8851_set_mac_address(struct net_device *dev, void *addr)
        if (!is_valid_ether_addr(sa->sa_data))
                return -EADDRNOTAVAIL;
 
+       dev->addr_assign_type &= ~NET_ADDR_RANDOM;
        memcpy(dev->dev_addr, sa->sa_data, ETH_ALEN);
        return ks8851_write_mac_addr(dev);
 }
@@ -1419,10 +1420,8 @@ static int __devinit ks8851_probe(struct spi_device *spi)
        int ret;
 
        ndev = alloc_etherdev(sizeof(struct ks8851_net));
-       if (!ndev) {
-               dev_err(&spi->dev, "failed to alloc ethernet device\n");
+       if (!ndev)
                return -ENOMEM;
-       }
 
        spi->bits_per_word = 8;
 
index b0fae86..852256e 100644 (file)
@@ -1,4 +1,4 @@
-/* drivers/net/ks8851.h
+/* drivers/net/ethernet/micrel/ks8851.h
  *
  * Copyright 2009 Simtec Electronics
  *      Ben Dooks <ben@simtec.co.uk>
index 2784bc7..b8104d9 100644 (file)
@@ -1,5 +1,5 @@
 /**
- * drivers/net/ks8851_mll.c
+ * drivers/net/ethernet/micrel/ks8851_mll.c
  * Copyright (c) 2009 Micrel Inc.
  *
  * This program is free software; you can redistribute it and/or modify
@@ -794,7 +794,7 @@ static void ks_rcv(struct ks_net *ks, struct net_device *netdev)
 
        frame_hdr = ks->frame_head_info;
        while (ks->frame_cnt--) {
-               skb = dev_alloc_skb(frame_hdr->len + 16);
+               skb = netdev_alloc_skb(netdev, frame_hdr->len + 16);
                if (likely(skb && (frame_hdr->sts & RXFSHR_RXFV) &&
                        (frame_hdr->len < RX_BUF_SIZE) && frame_hdr->len)) {
                        skb_reserve(skb, 2);
@@ -837,7 +837,7 @@ static void ks_update_link_status(struct net_device *netdev, struct ks_net *ks)
 
 /**
  * ks_irq - device interrupt handler
- * @irq: Interrupt number passed from the IRQ hnalder.
+ * @irq: Interrupt number passed from the IRQ handler.
  * @pw: The private word passed to register_irq(), our struct ks_net.
  *
  * This is the handler invoked to find out what happened
@@ -1239,6 +1239,7 @@ static int ks_set_mac_address(struct net_device *netdev, void *paddr)
        struct sockaddr *addr = paddr;
        u8 *da;
 
+       netdev->addr_assign_type &= ~NET_ADDR_RANDOM;
        memcpy(netdev->dev_addr, addr->sa_data, netdev->addr_len);
 
        da = (u8 *)netdev->dev_addr;
@@ -1499,10 +1500,8 @@ static int ks_hw_init(struct ks_net *ks)
        ks->mcast_lst_size = 0;
 
        ks->frame_head_info = kmalloc(MHEADER_SIZE, GFP_KERNEL);
-       if (!ks->frame_head_info) {
-               pr_err("Error: Fail to allocate frame memory\n");
+       if (!ks->frame_head_info)
                return false;
-       }
 
        ks_set_mac(ks, KS_DEFAULT_MAC_ADDRESS);
        return true;
index e52cd31..ef723b1 100644 (file)
@@ -1,5 +1,5 @@
 /**
- * drivers/net/ksx884x.c - Micrel KSZ8841/2 PCI Ethernet driver
+ * drivers/net/ethernet/micrel/ksx884x.c - Micrel KSZ8841/2 PCI Ethernet driver
  *
  * Copyright (c) 2009-2010 Micrel, Inc.
  *     Tristram Ha <Tristram.Ha@micrel.com>
@@ -4863,7 +4863,7 @@ static netdev_tx_t netdev_tx(struct sk_buff *skb, struct net_device *dev)
                                memset(&skb->data[skb->len], 0, 50 - skb->len);
                                skb->len = 50;
                        } else {
-                               skb = dev_alloc_skb(50);
+                               skb = netdev_alloc_skb(dev, 50);
                                if (!skb)
                                        return NETDEV_TX_BUSY;
                                memcpy(skb->data, org_skb->data, org_skb->len);
@@ -4885,7 +4885,7 @@ static netdev_tx_t netdev_tx(struct sk_buff *skb, struct net_device *dev)
                                (ETH_P_IPV6 == htons(skb->protocol)))) {
                        struct sk_buff *org_skb = skb;
 
-                       skb = dev_alloc_skb(org_skb->len);
+                       skb = netdev_alloc_skb(dev, org_skb->len);
                        if (!skb) {
                                rc = NETDEV_TX_BUSY;
                                goto unlock;
@@ -5019,7 +5019,7 @@ static inline int rx_proc(struct net_device *dev, struct ksz_hw* hw,
 
        do {
                /* skb->data != skb->head */
-               skb = dev_alloc_skb(packet_len + 2);
+               skb = netdev_alloc_skb(dev, packet_len + 2);
                if (!skb) {
                        dev->stats.rx_dropped++;
                        return -ENOMEM;
index 50055e0..6118bda 100644 (file)
@@ -527,6 +527,7 @@ static int enc28j60_set_mac_address(struct net_device *dev, void *addr)
        if (!is_valid_ether_addr(address->sa_data))
                return -EADDRNOTAVAIL;
 
+       dev->addr_assign_type &= ~NET_ADDR_RANDOM;
        memcpy(dev->dev_addr, address->sa_data, dev->addr_len);
        return enc28j60_set_hw_macaddr(dev);
 }
@@ -954,14 +955,13 @@ static void enc28j60_hw_rx(struct net_device *ndev)
                if (len > MAX_FRAMELEN)
                        ndev->stats.rx_over_errors++;
        } else {
-               skb = dev_alloc_skb(len + NET_IP_ALIGN);
+               skb = netdev_alloc_skb(ndev, len + NET_IP_ALIGN);
                if (!skb) {
                        if (netif_msg_rx_err(priv))
                                dev_err(&ndev->dev,
                                        "out of memory for Rx'd frame\n");
                        ndev->stats.rx_dropped++;
                } else {
-                       skb->dev = ndev;
                        skb_reserve(skb, NET_IP_ALIGN);
                        /* copy the packet from the receive buffer */
                        enc28j60_mem_read(priv,
@@ -1553,9 +1553,6 @@ static int __devinit enc28j60_probe(struct spi_device *spi)
 
        dev = alloc_etherdev(sizeof(struct enc28j60_net));
        if (!dev) {
-               if (netif_msg_drv(&debug))
-                       dev_err(&spi->dev, DRV_NAME
-                               ": unable to alloc new ethernet\n");
                ret = -ENOMEM;
                goto error_alloc;
        }
@@ -1579,7 +1576,7 @@ static int __devinit enc28j60_probe(struct spi_device *spi)
                ret = -EIO;
                goto error_irq;
        }
-       random_ether_addr(dev->dev_addr);
+       eth_hw_addr_random(dev);
        enc28j60_set_hw_macaddr(dev);
 
        /* Board setup must set the relevant edge trigger type;
index d05b0c9..db5285b 100644 (file)
@@ -152,7 +152,7 @@ static inline ssize_t mipsnet_get_fromdev(struct net_device *dev, size_t len)
        if (!len)
                return len;
 
-       skb = dev_alloc_skb(len + NET_IP_ALIGN);
+       skb = netdev_alloc_skb(dev, len + NET_IP_ALIGN);
        if (!skb) {
                dev->stats.rx_dropped++;
                return -ENOMEM;
@@ -281,7 +281,7 @@ static int __devinit mipsnet_probe(struct platform_device *dev)
         * Lacking any better mechanism to allocate a MAC address we use a
         * random one ...
         */
-       random_ether_addr(netdev->dev_addr);
+       eth_hw_addr_random(netdev);
 
        err = register_netdev(netdev);
        if (err) {
index 20b72ec..27273ae 100644 (file)
@@ -3910,10 +3910,8 @@ static int myri10ge_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
        static int board_number;
 
        netdev = alloc_etherdev_mq(sizeof(*mgp), MYRI10GE_MAX_SLICES);
-       if (netdev == NULL) {
-               dev_err(dev, "Could not allocate ethernet device\n");
+       if (netdev == NULL)
                return -ENOMEM;
-       }
 
        SET_NETDEV_DEV(netdev, &pdev->dev);
 
index 999407f..3f94ddb 100644 (file)
@@ -589,7 +589,7 @@ static void irqrx_handler(struct net_device *dev)
 
                        /* fetch buffer */
 
-                       skb = dev_alloc_skb(rda.length + 2);
+                       skb = netdev_alloc_skb(dev, rda.length + 2);
                        if (skb == NULL)
                                dev->stats.rx_dropped++;
                        else {
index f1b8556..e640e23 100644 (file)
@@ -307,7 +307,7 @@ static void __devinit mac_onboard_sonic_ethernet_addr(struct net_device *dev)
 
        printk(KERN_WARNING "macsonic: MAC address in CAM entry 15 "
                            "seems invalid, will use a random MAC\n");
-       random_ether_addr(dev->dev_addr);
+       eth_hw_addr_random(dev);
 }
 
 static int __devinit mac_onboard_sonic_probe(struct net_device *dev)
index ac7b16b..d38e48d 100644 (file)
@@ -1934,11 +1934,10 @@ static void refill_rx(struct net_device *dev)
                int entry = np->dirty_rx % RX_RING_SIZE;
                if (np->rx_skbuff[entry] == NULL) {
                        unsigned int buflen = np->rx_buf_sz+NATSEMI_PADDING;
-                       skb = dev_alloc_skb(buflen);
+                       skb = netdev_alloc_skb(dev, buflen);
                        np->rx_skbuff[entry] = skb;
                        if (skb == NULL)
                                break; /* Better luck next round. */
-                       skb->dev = dev; /* Mark as being used by this device. */
                        np->rx_dma[entry] = pci_map_single(np->pci_dev,
                                skb->data, buflen, PCI_DMA_FROMDEVICE);
                        np->rx_ring[entry].addr = cpu_to_le32(np->rx_dma[entry]);
@@ -2344,7 +2343,7 @@ static void netdev_rx(struct net_device *dev, int *work_done, int work_to_do)
                        /* Check if the packet is long enough to accept
                         * without copying to a minimally-sized skbuff. */
                        if (pkt_len < rx_copybreak &&
-                           (skb = dev_alloc_skb(pkt_len + RX_OFFSET)) != NULL) {
+                           (skb = netdev_alloc_skb(dev, pkt_len + RX_OFFSET)) != NULL) {
                                /* 16 byte align the IP header */
                                skb_reserve(skb, RX_OFFSET);
                                pci_dma_sync_single_for_cpu(np->pci_dev,
index 26e25d7..46795e4 100644 (file)
@@ -51,7 +51,7 @@ static int sonic_open(struct net_device *dev)
                printk("sonic_open: initializing sonic driver.\n");
 
        for (i = 0; i < SONIC_NUM_RRS; i++) {
-               struct sk_buff *skb = dev_alloc_skb(SONIC_RBSIZE + 2);
+               struct sk_buff *skb = netdev_alloc_skb(dev, SONIC_RBSIZE + 2);
                if (skb == NULL) {
                        while(i > 0) { /* free any that were allocated successfully */
                                i--;
@@ -422,7 +422,7 @@ static void sonic_rx(struct net_device *dev)
                status = sonic_rda_get(dev, entry, SONIC_RD_STATUS);
                if (status & SONIC_RCR_PRX) {
                        /* Malloc up new buffer. */
-                       new_skb = dev_alloc_skb(SONIC_RBSIZE + 2);
+                       new_skb = netdev_alloc_skb(dev, SONIC_RBSIZE + 2);
                        if (new_skb == NULL) {
                                printk(KERN_ERR "%s: Memory squeeze, dropping packet.\n", dev->name);
                                lp->stats.rx_dropped++;
index 97f63e1..22a8de0 100644 (file)
@@ -2524,7 +2524,7 @@ static int fill_rx_buffers(struct s2io_nic *nic, struct ring_info *ring,
                        size = ring->mtu + ALIGN_SIZE + BUF0_LEN + 4;
 
                /* allocate skb */
-               skb = dev_alloc_skb(size);
+               skb = netdev_alloc_skb(nic->dev, size);
                if (!skb) {
                        DBG_PRINT(INFO_DBG, "%s: Could not allocate skb\n",
                                  ring->dev->name);
@@ -5248,7 +5248,7 @@ static int s2io_set_mac_addr(struct net_device *dev, void *p)
        struct sockaddr *addr = p;
 
        if (!is_valid_ether_addr(addr->sa_data))
-               return -EINVAL;
+               return -EADDRNOTAVAIL;
 
        memcpy(dev->dev_addr, addr->sa_data, dev->addr_len);
 
@@ -6820,7 +6820,7 @@ static int set_rxd_buffer_pointer(struct s2io_nic *sp, struct RxD_t *rxdp,
                         */
                        rxdp1->Buffer0_ptr = *temp0;
                } else {
-                       *skb = dev_alloc_skb(size);
+                       *skb = netdev_alloc_skb(dev, size);
                        if (!(*skb)) {
                                DBG_PRINT(INFO_DBG,
                                          "%s: Out of memory to allocate %s\n",
@@ -6849,7 +6849,7 @@ static int set_rxd_buffer_pointer(struct s2io_nic *sp, struct RxD_t *rxdp,
                        rxdp3->Buffer0_ptr = *temp0;
                        rxdp3->Buffer1_ptr = *temp1;
                } else {
-                       *skb = dev_alloc_skb(size);
+                       *skb = netdev_alloc_skb(dev, size);
                        if (!(*skb)) {
                                DBG_PRINT(INFO_DBG,
                                          "%s: Out of memory to allocate %s\n",
@@ -7760,7 +7760,6 @@ s2io_init_nic(struct pci_dev *pdev, const struct pci_device_id *pre)
        else
                dev = alloc_etherdev(sizeof(struct s2io_nic));
        if (dev == NULL) {
-               DBG_PRINT(ERR_DBG, "Device allocation failed\n");
                pci_disable_device(pdev);
                pci_release_regions(pdev);
                return -ENODEV;
index 8d288af..9d11ab7 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * drivers/net/netx-eth.c
+ * drivers/net/ethernet/netx-eth.c
  *
  * Copyright (c) 2005 Sascha Hauer <s.hauer@pengutronix.de>, Pengutronix
  *
@@ -150,7 +150,7 @@ static void netx_eth_receive(struct net_device *ndev)
        seg = (val & FIFO_PTR_SEGMENT_MASK) >> FIFO_PTR_SEGMENT_SHIFT;
        len = (val & FIFO_PTR_FRAMELEN_MASK) >> FIFO_PTR_FRAMELEN_SHIFT;
 
-       skb = dev_alloc_skb(len);
+       skb = netdev_alloc_skb(ndev, len);
        if (unlikely(skb == NULL)) {
                printk(KERN_NOTICE "%s: Low memory, packet dropped.\n",
                        ndev->name);
@@ -383,7 +383,6 @@ static int netx_eth_drv_probe(struct platform_device *pdev)
 
        ndev = alloc_etherdev(sizeof (struct netx_eth_priv));
        if (!ndev) {
-               printk("%s: could not allocate device.\n", CARDNAME);
                ret = -ENOMEM;
                goto exit;
        }
index b75a049..6893a65 100644 (file)
@@ -735,7 +735,7 @@ static void netdev_rx(struct net_device *dev)
 
                if (status & RXDS_RXGD) {
                        data = ether->rdesc->recv_buf[ether->cur_rx];
-                       skb = dev_alloc_skb(length+2);
+                       skb = netdev_alloc_skb(dev, length + 2);
                        if (!skb) {
                                dev_err(&pdev->dev, "get skb buffer error\n");
                                ether->stats.rx_dropped++;
index 4c4e7f4..8561dd2 100644 (file)
@@ -1815,7 +1815,7 @@ static int nv_alloc_rx(struct net_device *dev)
                less_rx = np->last_rx.orig;
 
        while (np->put_rx.orig != less_rx) {
-               struct sk_buff *skb = dev_alloc_skb(np->rx_buf_sz + NV_RX_ALLOC_PAD);
+               struct sk_buff *skb = netdev_alloc_skb(dev, np->rx_buf_sz + NV_RX_ALLOC_PAD);
                if (skb) {
                        np->put_rx_ctx->skb = skb;
                        np->put_rx_ctx->dma = pci_map_single(np->pci_dev,
@@ -1850,7 +1850,7 @@ static int nv_alloc_rx_optimized(struct net_device *dev)
                less_rx = np->last_rx.ex;
 
        while (np->put_rx.ex != less_rx) {
-               struct sk_buff *skb = dev_alloc_skb(np->rx_buf_sz + NV_RX_ALLOC_PAD);
+               struct sk_buff *skb = netdev_alloc_skb(dev, np->rx_buf_sz + NV_RX_ALLOC_PAD);
                if (skb) {
                        np->put_rx_ctx->skb = skb;
                        np->put_rx_ctx->dma = pci_map_single(np->pci_dev,
@@ -3022,6 +3022,7 @@ static int nv_set_mac_address(struct net_device *dev, void *addr)
 
        /* synchronized against open : rtnl_lock() held by caller */
        memcpy(dev->dev_addr, macaddr->sa_data, ETH_ALEN);
+       dev->addr_assign_type &= ~NET_ADDR_RANDOM;
 
        if (netif_running(dev)) {
                netif_tx_lock_bh(dev);
@@ -4993,9 +4994,9 @@ static int nv_loopback_test(struct net_device *dev)
 
        /* setup packet for tx */
        pkt_len = ETH_DATA_LEN;
-       tx_skb = dev_alloc_skb(pkt_len);
+       tx_skb = netdev_alloc_skb(dev, pkt_len);
        if (!tx_skb) {
-               netdev_err(dev, "dev_alloc_skb() failed during loopback test\n");
+               netdev_err(dev, "netdev_alloc_skb() failed during loopback test\n");
                ret = 0;
                goto out;
        }
@@ -5741,7 +5742,7 @@ static int __devinit nv_probe(struct pci_dev *pci_dev, const struct pci_device_i
                dev_err(&pci_dev->dev,
                        "Invalid MAC address detected: %pM - Please complain to your hardware vendor.\n",
                        dev->dev_addr);
-               random_ether_addr(dev->dev_addr);
+               eth_hw_addr_random(dev);
                dev_err(&pci_dev->dev,
                        "Using random MAC address: %pM\n", dev->dev_addr);
        }
index 3ead111..69a6654 100644 (file)
@@ -1224,7 +1224,7 @@ static irqreturn_t pch_gbe_intr(int irq, void *data)
 
        /* When request status is Receive interruption */
        if ((int_st & (PCH_GBE_INT_RX_DMA_CMPLT | PCH_GBE_INT_TX_CMPLT)) ||
-           (adapter->rx_stop_flag == true)) {
+           (adapter->rx_stop_flag)) {
                if (likely(napi_schedule_prep(&adapter->napi))) {
                        /* Enable only Rx Descriptor empty */
                        atomic_inc(&adapter->irq_sem);
@@ -1587,10 +1587,8 @@ int pch_gbe_setup_tx_resources(struct pch_gbe_adapter *adapter,
 
        size = (int)sizeof(struct pch_gbe_buffer) * tx_ring->count;
        tx_ring->buffer_info = vzalloc(size);
-       if (!tx_ring->buffer_info) {
-               pr_err("Unable to allocate memory for the buffer information\n");
+       if (!tx_ring->buffer_info)
                return -ENOMEM;
-       }
 
        tx_ring->size = tx_ring->count * (int)sizeof(struct pch_gbe_tx_desc);
 
@@ -1636,10 +1634,9 @@ int pch_gbe_setup_rx_resources(struct pch_gbe_adapter *adapter,
 
        size = (int)sizeof(struct pch_gbe_buffer) * rx_ring->count;
        rx_ring->buffer_info = vzalloc(size);
-       if (!rx_ring->buffer_info) {
-               pr_err("Unable to allocate memory for the receive descriptor ring\n");
+       if (!rx_ring->buffer_info)
                return -ENOMEM;
-       }
+
        rx_ring->size = rx_ring->count * (int)sizeof(struct pch_gbe_rx_desc);
        rx_ring->desc = dma_alloc_coherent(&pdev->dev, rx_ring->size,
                                           &rx_ring->dma, GFP_KERNEL);
@@ -2422,8 +2419,6 @@ static int pch_gbe_probe(struct pci_dev *pdev,
        netdev = alloc_etherdev((int)sizeof(struct pch_gbe_adapter));
        if (!netdev) {
                ret = -ENOMEM;
-               dev_err(&pdev->dev,
-                       "ERR: Can't allocate and set up an Ethernet device\n");
                goto err_release_pci;
        }
        SET_NETDEV_DEV(netdev, &pdev->dev);
index 3458df3..0d29f5f 100644 (file)
@@ -1188,11 +1188,10 @@ static void hamachi_init_ring(struct net_device *dev)
        }
        /* Fill in the Rx buffers.  Handle allocation failure gracefully. */
        for (i = 0; i < RX_RING_SIZE; i++) {
-               struct sk_buff *skb = dev_alloc_skb(hmp->rx_buf_sz + 2);
+               struct sk_buff *skb = netdev_alloc_skb(dev, hmp->rx_buf_sz + 2);
                hmp->rx_skbuff[i] = skb;
                if (skb == NULL)
                        break;
-               skb->dev = dev;         /* Mark as being used by this device. */
                skb_reserve(skb, 2); /* 16 byte align the IP header. */
                 hmp->rx_ring[i].addr = cpu_to_leXX(pci_map_single(hmp->pci_dev,
                        skb->data, hmp->rx_buf_sz, PCI_DMA_FROMDEVICE));
@@ -1488,7 +1487,7 @@ static int hamachi_rx(struct net_device *dev)
                        /* Check if the packet is long enough to accept without copying
                           to a minimally-sized skbuff. */
                        if (pkt_len < rx_copybreak &&
-                           (skb = dev_alloc_skb(pkt_len + 2)) != NULL) {
+                           (skb = netdev_alloc_skb(dev, pkt_len + 2)) != NULL) {
 #ifdef RX_CHECKSUM
                                printk(KERN_ERR "%s: rx_copybreak non-zero "
                                  "not good with RX_CHECKSUM\n", dev->name);
@@ -1591,12 +1590,11 @@ static int hamachi_rx(struct net_device *dev)
                entry = hmp->dirty_rx % RX_RING_SIZE;
                desc = &(hmp->rx_ring[entry]);
                if (hmp->rx_skbuff[entry] == NULL) {
-                       struct sk_buff *skb = dev_alloc_skb(hmp->rx_buf_sz + 2);
+                       struct sk_buff *skb = netdev_alloc_skb(dev, hmp->rx_buf_sz + 2);
 
                        hmp->rx_skbuff[entry] = skb;
                        if (skb == NULL)
                                break;          /* Better luck next round. */
-                       skb->dev = dev;         /* Mark as being used by this device. */
                        skb_reserve(skb, 2);    /* Align IP on 16 byte boundaries */
                        desc->addr = cpu_to_leXX(pci_map_single(hmp->pci_dev,
                                skb->data, hmp->rx_buf_sz, PCI_DMA_FROMDEVICE));
index db44e9a..7757b80 100644 (file)
@@ -397,10 +397,9 @@ static int __devinit yellowfin_init_one(struct pci_dev *pdev,
        if (i) return i;
 
        dev = alloc_etherdev(sizeof(*np));
-       if (!dev) {
-               pr_err("cannot allocate ethernet device\n");
+       if (!dev)
                return -ENOMEM;
-       }
+
        SET_NETDEV_DEV(dev, &pdev->dev);
 
        np = netdev_priv(dev);
@@ -744,11 +743,10 @@ static int yellowfin_init_ring(struct net_device *dev)
        }
 
        for (i = 0; i < RX_RING_SIZE; i++) {
-               struct sk_buff *skb = dev_alloc_skb(yp->rx_buf_sz + 2);
+               struct sk_buff *skb = netdev_alloc_skb(dev, yp->rx_buf_sz + 2);
                yp->rx_skbuff[i] = skb;
                if (skb == NULL)
                        break;
-               skb->dev = dev;         /* Mark as being used by this device. */
                skb_reserve(skb, 2);    /* 16 byte align the IP header. */
                yp->rx_ring[i].addr = cpu_to_le32(pci_map_single(yp->pci_dev,
                        skb->data, yp->rx_buf_sz, PCI_DMA_FROMDEVICE));
@@ -1134,7 +1132,7 @@ static int yellowfin_rx(struct net_device *dev)
                                        PCI_DMA_FROMDEVICE);
                                yp->rx_skbuff[entry] = NULL;
                        } else {
-                               skb = dev_alloc_skb(pkt_len + 2);
+                               skb = netdev_alloc_skb(dev, pkt_len + 2);
                                if (skb == NULL)
                                        break;
                                skb_reserve(skb, 2);    /* 16 byte align the IP header */
@@ -1157,11 +1155,10 @@ static int yellowfin_rx(struct net_device *dev)
        for (; yp->cur_rx - yp->dirty_rx > 0; yp->dirty_rx++) {
                entry = yp->dirty_rx % RX_RING_SIZE;
                if (yp->rx_skbuff[entry] == NULL) {
-                       struct sk_buff *skb = dev_alloc_skb(yp->rx_buf_sz + 2);
+                       struct sk_buff *skb = netdev_alloc_skb(dev, yp->rx_buf_sz + 2);
                        if (skb == NULL)
                                break;                          /* Better luck next round. */
                        yp->rx_skbuff[entry] = skb;
-                       skb->dev = dev; /* Mark as being used by this device. */
                        skb_reserve(skb, 2);    /* Align IP on 16 byte boundaries */
                        yp->rx_ring[entry].addr = cpu_to_le32(pci_map_single(yp->pci_dev,
                                skb->data, yp->rx_buf_sz, PCI_DMA_FROMDEVICE));
index 49b549f..ddc95b0 100644 (file)
@@ -238,7 +238,7 @@ static int pasemi_mac_set_mac_addr(struct net_device *dev, void *p)
        unsigned int adr0, adr1;
 
        if (!is_valid_ether_addr(addr->sa_data))
-               return -EINVAL;
+               return -EADDRNOTAVAIL;
 
        memcpy(dev->dev_addr, addr->sa_data, dev->addr_len);
 
@@ -643,7 +643,7 @@ static void pasemi_mac_replenish_rx_ring(const struct net_device *dev,
                /* Entry in use? */
                WARN_ON(*buff);
 
-               skb = dev_alloc_skb(mac->bufsz);
+               skb = netdev_alloc_skb(dev, mac->bufsz);
                skb_reserve(skb, LOCAL_SKB_ALIGN);
 
                if (unlikely(!skb))
@@ -1740,8 +1740,6 @@ pasemi_mac_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 
        dev = alloc_etherdev(sizeof(struct pasemi_mac));
        if (dev == NULL) {
-               dev_err(&pdev->dev,
-                       "pasemi_mac: Could not allocate ethernet device.\n");
                err = -ENOMEM;
                goto out_disable_device;
        }
index a876dff..2eeac32 100644 (file)
@@ -53,8 +53,8 @@
 
 #define _NETXEN_NIC_LINUX_MAJOR 4
 #define _NETXEN_NIC_LINUX_MINOR 0
-#define _NETXEN_NIC_LINUX_SUBVERSION 77
-#define NETXEN_NIC_LINUX_VERSIONID  "4.0.77"
+#define _NETXEN_NIC_LINUX_SUBVERSION 78
+#define NETXEN_NIC_LINUX_VERSIONID  "4.0.78"
 
 #define NETXEN_VERSION_CODE(a, b, c)   (((a) << 24) + ((b) << 16) + (c))
 #define _major(v)      (((v) >> 24) & 0xff)
@@ -686,6 +686,18 @@ struct netxen_recv_context {
        dma_addr_t phys_addr;
 };
 
+struct _cdrp_cmd {
+       u32 cmd;
+       u32 arg1;
+       u32 arg2;
+       u32 arg3;
+};
+
+struct netxen_cmd_args {
+       struct _cdrp_cmd req;
+       struct _cdrp_cmd rsp;
+};
+
 /* New HW context creation */
 
 #define NX_OS_CRB_RETRY_COUNT  4000
@@ -1142,6 +1154,7 @@ typedef struct {
 #define NETXEN_NIC_LRO_DISABLED                0x00
 #define NETXEN_NIC_BRIDGE_ENABLED       0X10
 #define NETXEN_NIC_DIAG_ENABLED                0x20
+#define NETXEN_FW_RESET_OWNER           0x40
 #define NETXEN_IS_MSI_FAMILY(adapter) \
        ((adapter)->flags & (NETXEN_NIC_MSI_ENABLED | NETXEN_NIC_MSIX_ENABLED))
 
@@ -1159,6 +1172,419 @@ typedef struct {
 #define __NX_DEV_UP                    1
 #define __NX_RESETTING                 2
 
+/* Mini Coredump FW supported version */
+#define NX_MD_SUPPORT_MAJOR            4
+#define NX_MD_SUPPORT_MINOR            0
+#define NX_MD_SUPPORT_SUBVERSION       579
+
+#define LSW(x)  ((uint16_t)(x))
+#define LSD(x)  ((uint32_t)((uint64_t)(x)))
+#define MSD(x)  ((uint32_t)((((uint64_t)(x)) >> 16) >> 16))
+
+/* Mini Coredump mask level */
+#define        NX_DUMP_MASK_MIN        0x03
+#define        NX_DUMP_MASK_DEF        0x1f
+#define        NX_DUMP_MASK_MAX        0xff
+
+/* Mini Coredump CDRP commands */
+#define NX_CDRP_CMD_TEMP_SIZE           0x0000002f
+#define NX_CDRP_CMD_GET_TEMP_HDR        0x00000030
+
+
+#define NX_DUMP_STATE_ARRAY_LEN                16
+#define NX_DUMP_CAP_SIZE_ARRAY_LEN     8
+
+/* Mini Coredump sysfs entries flags*/
+#define NX_FORCE_FW_DUMP_KEY           0xdeadfeed
+#define NX_ENABLE_FW_DUMP               0xaddfeed
+#define NX_DISABLE_FW_DUMP              0xbadfeed
+#define NX_FORCE_FW_RESET               0xdeaddead
+
+
+/* Flash read/write address */
+#define NX_FW_DUMP_REG1         0x00130060
+#define NX_FW_DUMP_REG2         0x001e0000
+#define NX_FLASH_SEM2_LK        0x0013C010
+#define NX_FLASH_SEM2_ULK       0x0013C014
+#define NX_FLASH_LOCK_ID        0x001B2100
+#define FLASH_ROM_WINDOW        0x42110030
+#define FLASH_ROM_DATA          0x42150000
+
+/* Mini Coredump register read/write routine */
+#define NX_RD_DUMP_REG(addr, bar0, data) do {                   \
+       writel((addr & 0xFFFF0000), (void __iomem *) (bar0 +            \
+               NX_FW_DUMP_REG1));                                      \
+       readl((void __iomem *) (bar0 + NX_FW_DUMP_REG1));               \
+       *data = readl((void __iomem *) (bar0 + NX_FW_DUMP_REG2 +        \
+               LSW(addr)));                                            \
+} while (0)
+
+#define NX_WR_DUMP_REG(addr, bar0, data) do {                   \
+       writel((addr & 0xFFFF0000), (void __iomem *) (bar0 +            \
+               NX_FW_DUMP_REG1));                                      \
+       readl((void __iomem *) (bar0 + NX_FW_DUMP_REG1));                \
+       writel(data, (void __iomem *) (bar0 + NX_FW_DUMP_REG2 + LSW(addr)));\
+       readl((void __iomem *) (bar0 + NX_FW_DUMP_REG2 + LSW(addr)));  \
+} while (0)
+
+
+/*
+Entry Type Defines
+*/
+
+#define RDNOP  0
+#define RDCRB  1
+#define RDMUX  2
+#define QUEUE  3
+#define BOARD  4
+#define RDSRE  5
+#define RDOCM  6
+#define PREGS  7
+#define L1DTG  8
+#define L1ITG  9
+#define CACHE  10
+
+#define L1DAT  11
+#define L1INS  12
+#define RDSTK  13
+#define RDCON  14
+
+#define L2DTG  21
+#define L2ITG  22
+#define L2DAT  23
+#define L2INS  24
+#define RDOC3  25
+
+#define MEMBK  32
+
+#define RDROM  71
+#define RDMEM  72
+#define RDMN   73
+
+#define INFOR  81
+#define CNTRL  98
+
+#define TLHDR  99
+#define RDEND  255
+
+#define PRIMQ  103
+#define SQG2Q  104
+#define SQG3Q  105
+
+/*
+* Opcodes for Control Entries.
+* These Flags are bit fields.
+*/
+#define NX_DUMP_WCRB           0x01
+#define NX_DUMP_RWCRB          0x02
+#define NX_DUMP_ANDCRB         0x04
+#define NX_DUMP_ORCRB          0x08
+#define NX_DUMP_POLLCRB                0x10
+#define NX_DUMP_RD_SAVE                0x20
+#define NX_DUMP_WRT_SAVED      0x40
+#define NX_DUMP_MOD_SAVE_ST    0x80
+
+/* Driver Flags */
+#define NX_DUMP_SKIP           0x80    /*  driver skipped this entry  */
+#define NX_DUMP_SIZE_ERR 0x40  /*entry size vs capture size mismatch*/
+
+#define NX_PCI_READ_32(ADDR)                   readl((ADDR))
+#define NX_PCI_WRITE_32(DATA, ADDR)    writel(DATA, (ADDR))
+
+
+
+struct netxen_minidump {
+       u32 pos;                        /* position in the dump buffer */
+       u8  fw_supports_md;             /* FW supports Mini cordump */
+       u8  has_valid_dump;             /* indicates valid dump */
+       u8  md_capture_mask;            /* driver capture mask */
+       u8  md_enabled;                 /* Turn Mini Coredump on/off */
+       u32 md_dump_size;               /* Total FW Mini Coredump size */
+       u32 md_capture_size;            /* FW dump capture size */
+       u32 md_template_size;           /* FW template size */
+       u32 md_template_ver;            /* FW template version */
+       u64 md_timestamp;               /* FW Mini dump timestamp */
+       void *md_template;              /* FW template will be stored */
+       void *md_capture_buff;          /* FW dump will be stored */
+};
+
+
+
+struct netxen_minidump_template_hdr {
+       u32 entry_type;
+       u32 first_entry_offset;
+       u32 size_of_template;
+       u32 capture_mask;
+       u32 num_of_entries;
+       u32 version;
+       u32 driver_timestamp;
+       u32 checksum;
+       u32 driver_capture_mask;
+       u32 driver_info_word2;
+       u32 driver_info_word3;
+       u32 driver_info_word4;
+       u32 saved_state_array[NX_DUMP_STATE_ARRAY_LEN];
+       u32 capture_size_array[NX_DUMP_CAP_SIZE_ARRAY_LEN];
+       u32 rsvd[0];
+};
+
+/* Common Entry Header:  Common to All Entry Types */
+/*
+ * Driver Code is for driver to write some info about the entry.
+ * Currently not used.
+ */
+
+struct netxen_common_entry_hdr {
+       u32 entry_type;
+       u32 entry_size;
+       u32 entry_capture_size;
+       union {
+               struct {
+                       u8 entry_capture_mask;
+                       u8 entry_code;
+                       u8 driver_code;
+                       u8 driver_flags;
+               };
+               u32 entry_ctrl_word;
+       };
+};
+
+
+/* Generic Entry Including Header */
+struct netxen_minidump_entry {
+       struct netxen_common_entry_hdr hdr;
+       u32 entry_data00;
+       u32 entry_data01;
+       u32 entry_data02;
+       u32 entry_data03;
+       u32 entry_data04;
+       u32 entry_data05;
+       u32 entry_data06;
+       u32 entry_data07;
+};
+
+/* Read ROM Header */
+struct netxen_minidump_entry_rdrom {
+       struct netxen_common_entry_hdr h;
+       union {
+               struct {
+                       u32 select_addr_reg;
+               };
+               u32 rsvd_0;
+       };
+       union {
+               struct {
+                       u8 addr_stride;
+                       u8 addr_cnt;
+                       u16 data_size;
+               };
+               u32 rsvd_1;
+       };
+       union {
+               struct {
+                       u32 op_count;
+               };
+               u32 rsvd_2;
+       };
+       union {
+               struct {
+                       u32 read_addr_reg;
+               };
+               u32 rsvd_3;
+       };
+       union {
+               struct {
+                       u32 write_mask;
+               };
+               u32 rsvd_4;
+       };
+       union {
+               struct {
+                       u32 read_mask;
+               };
+               u32 rsvd_5;
+       };
+       u32 read_addr;
+       u32 read_data_size;
+};
+
+
+/* Read CRB and Control Entry Header */
+struct netxen_minidump_entry_crb {
+       struct netxen_common_entry_hdr h;
+       u32 addr;
+       union {
+               struct {
+                       u8 addr_stride;
+                       u8 state_index_a;
+                       u16 poll_timeout;
+                       };
+               u32 addr_cntrl;
+       };
+       u32 data_size;
+       u32 op_count;
+       union {
+               struct {
+                       u8 opcode;
+                       u8 state_index_v;
+                       u8 shl;
+                       u8 shr;
+                       };
+               u32 control_value;
+       };
+       u32 value_1;
+       u32 value_2;
+       u32 value_3;
+};
+
+/* Read Memory and MN Header */
+struct netxen_minidump_entry_rdmem {
+       struct netxen_common_entry_hdr h;
+       union {
+               struct {
+                       u32 select_addr_reg;
+               };
+               u32 rsvd_0;
+       };
+       union {
+               struct {
+                       u8 addr_stride;
+                       u8 addr_cnt;
+                       u16 data_size;
+               };
+               u32 rsvd_1;
+       };
+       union {
+               struct {
+                       u32 op_count;
+               };
+               u32 rsvd_2;
+       };
+       union {
+               struct {
+                       u32 read_addr_reg;
+               };
+               u32 rsvd_3;
+       };
+       union {
+               struct {
+                       u32 cntrl_addr_reg;
+               };
+               u32 rsvd_4;
+       };
+       union {
+               struct {
+                       u8 wr_byte0;
+                       u8 wr_byte1;
+                       u8 poll_mask;
+                       u8 poll_cnt;
+               };
+               u32 rsvd_5;
+       };
+       u32 read_addr;
+       u32 read_data_size;
+};
+
+/* Read Cache L1 and L2 Header */
+struct netxen_minidump_entry_cache {
+       struct netxen_common_entry_hdr h;
+       u32 tag_reg_addr;
+       union {
+               struct {
+                       u16 tag_value_stride;
+                       u16 init_tag_value;
+               };
+               u32 select_addr_cntrl;
+       };
+       u32 data_size;
+       u32 op_count;
+       u32 control_addr;
+       union {
+               struct {
+                       u16 write_value;
+                       u8 poll_mask;
+                       u8 poll_wait;
+               };
+               u32 control_value;
+       };
+       u32 read_addr;
+       union {
+               struct {
+                       u8 read_addr_stride;
+                       u8 read_addr_cnt;
+                       u16 rsvd_1;
+               };
+               u32 read_addr_cntrl;
+       };
+};
+
+/* Read OCM Header */
+struct netxen_minidump_entry_rdocm {
+       struct netxen_common_entry_hdr h;
+       u32 rsvd_0;
+       union {
+               struct {
+                       u32 rsvd_1;
+               };
+               u32 select_addr_cntrl;
+       };
+       u32 data_size;
+       u32 op_count;
+       u32 rsvd_2;
+       u32 rsvd_3;
+       u32 read_addr;
+       union {
+               struct {
+                       u32 read_addr_stride;
+               };
+               u32 read_addr_cntrl;
+       };
+};
+
+/* Read MUX Header */
+struct netxen_minidump_entry_mux {
+       struct netxen_common_entry_hdr h;
+       u32 select_addr;
+       union {
+               struct {
+                       u32 rsvd_0;
+               };
+               u32 select_addr_cntrl;
+       };
+       u32 data_size;
+       u32 op_count;
+       u32 select_value;
+       u32 select_value_stride;
+       u32 read_addr;
+       u32 rsvd_1;
+};
+
+/* Read Queue Header */
+struct netxen_minidump_entry_queue {
+       struct netxen_common_entry_hdr h;
+       u32 select_addr;
+       union {
+               struct {
+                       u16 queue_id_stride;
+                       u16 rsvd_0;
+               };
+               u32 select_addr_cntrl;
+       };
+       u32 data_size;
+       u32 op_count;
+       u32 rsvd_1;
+       u32 rsvd_2;
+       u32 read_addr;
+       union {
+               struct {
+                       u8 read_addr_stride;
+                       u8 read_addr_cnt;
+                       u16 rsvd_3;
+               };
+               u32 read_addr_cntrl;
+       };
+};
+
 struct netxen_dummy_dma {
        void *addr;
        dma_addr_t phys_addr;
@@ -1263,6 +1689,8 @@ struct netxen_adapter {
        __le32 file_prd_off;    /*File fw product offset*/
        u32 fw_version;
        const struct firmware *fw;
+       struct netxen_minidump mdump;   /* mdump ptr */
+       int fw_mdump_rdy;       /* for mdump ready */
 };
 
 int nx_fw_cmd_query_phy(struct netxen_adapter *adapter, u32 reg, u32 *val);
@@ -1365,13 +1793,16 @@ int netxen_nic_change_mtu(struct net_device *netdev, int new_mtu);
 int netxen_config_hw_lro(struct netxen_adapter *adapter, int enable);
 int netxen_config_bridged_mode(struct netxen_adapter *adapter, int enable);
 int netxen_send_lro_cleanup(struct netxen_adapter *adapter);
-
+int netxen_setup_minidump(struct netxen_adapter *adapter);
+void netxen_dump_fw(struct netxen_adapter *adapter);
 void netxen_nic_update_cmd_producer(struct netxen_adapter *adapter,
                struct nx_host_tx_ring *tx_ring);
 
 /* Functions from netxen_nic_main.c */
 int netxen_nic_reset_context(struct netxen_adapter *);
 
+int nx_dev_request_reset(struct netxen_adapter *adapter);
+
 /*
  * NetXen Board information
  */
index a925392..f3c0057 100644 (file)
@@ -48,28 +48,27 @@ netxen_poll_rsp(struct netxen_adapter *adapter)
 }
 
 static u32
-netxen_issue_cmd(struct netxen_adapter *adapter,
-       u32 pci_fn, u32 version, u32 arg1, u32 arg2, u32 arg3, u32 cmd)
+netxen_issue_cmd(struct netxen_adapter *adapter, struct netxen_cmd_args *cmd)
 {
        u32 rsp;
        u32 signature = 0;
        u32 rcode = NX_RCODE_SUCCESS;
 
-       signature = NX_CDRP_SIGNATURE_MAKE(pci_fn, version);
-
+       signature = NX_CDRP_SIGNATURE_MAKE(adapter->ahw.pci_func,
+                                               NXHAL_VERSION);
        /* Acquire semaphore before accessing CRB */
        if (netxen_api_lock(adapter))
                return NX_RCODE_TIMEOUT;
 
        NXWR32(adapter, NX_SIGN_CRB_OFFSET, signature);
 
-       NXWR32(adapter, NX_ARG1_CRB_OFFSET, arg1);
+       NXWR32(adapter, NX_ARG1_CRB_OFFSET, cmd->req.arg1);
 
-       NXWR32(adapter, NX_ARG2_CRB_OFFSET, arg2);
+       NXWR32(adapter, NX_ARG2_CRB_OFFSET, cmd->req.arg2);
 
-       NXWR32(adapter, NX_ARG3_CRB_OFFSET, arg3);
+       NXWR32(adapter, NX_ARG3_CRB_OFFSET, cmd->req.arg3);
 
-       NXWR32(adapter, NX_CDRP_CRB_OFFSET, NX_CDRP_FORM_CMD(cmd));
+       NXWR32(adapter, NX_CDRP_CRB_OFFSET, NX_CDRP_FORM_CMD(cmd->req.cmd));
 
        rsp = netxen_poll_rsp(adapter);
 
@@ -83,28 +82,179 @@ netxen_issue_cmd(struct netxen_adapter *adapter,
 
                printk(KERN_ERR "%s: failed card response code:0x%x\n",
                                netxen_nic_driver_name, rcode);
+       } else if (rsp == NX_CDRP_RSP_OK) {
+               cmd->rsp.cmd = NX_RCODE_SUCCESS;
+               if (cmd->rsp.arg2)
+                       cmd->rsp.arg2 = NXRD32(adapter, NX_ARG2_CRB_OFFSET);
+               if (cmd->rsp.arg3)
+                       cmd->rsp.arg3 = NXRD32(adapter, NX_ARG3_CRB_OFFSET);
        }
 
+       if (cmd->rsp.arg1)
+               cmd->rsp.arg1 = NXRD32(adapter, NX_ARG1_CRB_OFFSET);
        /* Release semaphore */
        netxen_api_unlock(adapter);
 
        return rcode;
 }
 
+static int
+netxen_get_minidump_template_size(struct netxen_adapter *adapter)
+{
+       struct netxen_cmd_args cmd;
+       memset(&cmd, 0, sizeof(cmd));
+       cmd.req.cmd = NX_CDRP_CMD_TEMP_SIZE;
+       memset(&cmd.rsp, 1, sizeof(struct _cdrp_cmd));
+       netxen_issue_cmd(adapter, &cmd);
+       if (cmd.rsp.cmd != NX_RCODE_SUCCESS) {
+               dev_info(&adapter->pdev->dev,
+                       "Can't get template size %d\n", cmd.rsp.cmd);
+               return -EIO;
+       }
+       adapter->mdump.md_template_size = cmd.rsp.arg2;
+       adapter->mdump.md_template_ver = cmd.rsp.arg3;
+       return 0;
+}
+
+static int
+netxen_get_minidump_template(struct netxen_adapter *adapter)
+{
+       dma_addr_t md_template_addr;
+       void *addr;
+       u32 size;
+       struct netxen_cmd_args cmd;
+       size = adapter->mdump.md_template_size;
+
+       if (size == 0) {
+               dev_err(&adapter->pdev->dev, "Can not capture Minidump "
+                       "template. Invalid template size.\n");
+               return NX_RCODE_INVALID_ARGS;
+       }
+
+       addr = pci_alloc_consistent(adapter->pdev, size, &md_template_addr);
+
+       if (!addr) {
+               dev_err(&adapter->pdev->dev, "Unable to allocate dmable memory for template.\n");
+               return -ENOMEM;
+       }
+
+       memset(addr, 0, size);
+       memset(&cmd, 0, sizeof(cmd));
+       memset(&cmd.rsp, 1, sizeof(struct _cdrp_cmd));
+       cmd.req.cmd = NX_CDRP_CMD_GET_TEMP_HDR;
+       cmd.req.arg1 = LSD(md_template_addr);
+       cmd.req.arg2 = MSD(md_template_addr);
+       cmd.req.arg3 |= size;
+       netxen_issue_cmd(adapter, &cmd);
+
+       if ((cmd.rsp.cmd == NX_RCODE_SUCCESS) && (size == cmd.rsp.arg2)) {
+               memcpy(adapter->mdump.md_template, addr, size);
+       } else {
+               dev_err(&adapter->pdev->dev, "Failed to get minidump template, "
+                       "err_code : %d, requested_size : %d, actual_size : %d\n ",
+                       cmd.rsp.cmd, size, cmd.rsp.arg2);
+       }
+       pci_free_consistent(adapter->pdev, size, addr, md_template_addr);
+       return 0;
+}
+
+static u32
+netxen_check_template_checksum(struct netxen_adapter *adapter)
+{
+       u64 sum =  0 ;
+       u32 *buff = adapter->mdump.md_template;
+       int count =  adapter->mdump.md_template_size/sizeof(uint32_t) ;
+
+       while (count-- > 0)
+               sum += *buff++ ;
+       while (sum >> 32)
+               sum = (sum & 0xFFFFFFFF) +  (sum >> 32) ;
+
+       return ~sum;
+}
+
+int
+netxen_setup_minidump(struct netxen_adapter *adapter)
+{
+       int err = 0, i;
+       u32 *template, *tmp_buf;
+       struct netxen_minidump_template_hdr *hdr;
+       err = netxen_get_minidump_template_size(adapter);
+       if (err) {
+               adapter->mdump.fw_supports_md = 0;
+               if ((err == NX_RCODE_CMD_INVALID) ||
+                       (err == NX_RCODE_CMD_NOT_IMPL)) {
+                       dev_info(&adapter->pdev->dev,
+                               "Flashed firmware version does not support minidump, "
+                               "minimum version required is [ %u.%u.%u ].\n ",
+                               NX_MD_SUPPORT_MAJOR, NX_MD_SUPPORT_MINOR,
+                               NX_MD_SUPPORT_SUBVERSION);
+               }
+               return err;
+       }
+
+       if (!adapter->mdump.md_template_size) {
+               dev_err(&adapter->pdev->dev, "Error : Invalid template size "
+               ",should be non-zero.\n");
+               return -EIO;
+       }
+       adapter->mdump.md_template =
+               kmalloc(adapter->mdump.md_template_size, GFP_KERNEL);
+
+       if (!adapter->mdump.md_template) {
+               dev_err(&adapter->pdev->dev, "Unable to allocate memory "
+                       "for minidump template.\n");
+               return -ENOMEM;
+       }
+
+       err = netxen_get_minidump_template(adapter);
+       if (err) {
+               if (err == NX_RCODE_CMD_NOT_IMPL)
+                       adapter->mdump.fw_supports_md = 0;
+               goto free_template;
+       }
+
+       if (netxen_check_template_checksum(adapter)) {
+               dev_err(&adapter->pdev->dev, "Minidump template checksum Error\n");
+               err = -EIO;
+               goto free_template;
+       }
+
+       adapter->mdump.md_capture_mask = NX_DUMP_MASK_DEF;
+       tmp_buf = (u32 *) adapter->mdump.md_template;
+       template = (u32 *) adapter->mdump.md_template;
+       for (i = 0; i < adapter->mdump.md_template_size/sizeof(u32); i++)
+               *template++ = __le32_to_cpu(*tmp_buf++);
+       hdr = (struct netxen_minidump_template_hdr *)
+                               adapter->mdump.md_template;
+       adapter->mdump.md_capture_buff = NULL;
+       adapter->mdump.fw_supports_md = 1;
+       adapter->mdump.md_enabled = 1;
+
+       return err;
+
+free_template:
+       kfree(adapter->mdump.md_template);
+       adapter->mdump.md_template = NULL;
+       return err;
+}
+
+
 int
 nx_fw_cmd_set_mtu(struct netxen_adapter *adapter, int mtu)
 {
        u32 rcode = NX_RCODE_SUCCESS;
        struct netxen_recv_context *recv_ctx = &adapter->recv_ctx;
+       struct netxen_cmd_args cmd;
+
+       memset(&cmd, 0, sizeof(cmd));
+       cmd.req.cmd = NX_CDRP_CMD_SET_MTU;
+       cmd.req.arg1 = recv_ctx->context_id;
+       cmd.req.arg2 = mtu;
+       cmd.req.arg3 = 0;
 
        if (recv_ctx->state == NX_HOST_CTX_STATE_ACTIVE)
-               rcode = netxen_issue_cmd(adapter,
-                               adapter->ahw.pci_func,
-                               NXHAL_VERSION,
-                               recv_ctx->context_id,
-                               mtu,
-                               0,
-                               NX_CDRP_CMD_SET_MTU);
+               netxen_issue_cmd(adapter, &cmd);
 
        if (rcode != NX_RCODE_SUCCESS)
                return -EIO;
@@ -116,15 +266,14 @@ int
 nx_fw_cmd_set_gbe_port(struct netxen_adapter *adapter,
                        u32 speed, u32 duplex, u32 autoneg)
 {
-
-       return netxen_issue_cmd(adapter,
-                               adapter->ahw.pci_func,
-                               NXHAL_VERSION,
-                               speed,
-                               duplex,
-                               autoneg,
-                               NX_CDRP_CMD_CONFIG_GBE_PORT);
-
+       struct netxen_cmd_args cmd;
+
+       memset(&cmd, 0, sizeof(cmd));
+       cmd.req.cmd = NX_CDRP_CMD_CONFIG_GBE_PORT;
+       cmd.req.arg1 = speed;
+       cmd.req.arg2 = duplex;
+       cmd.req.arg3 = autoneg;
+       return netxen_issue_cmd(adapter, &cmd);
 }
 
 static int
@@ -139,6 +288,7 @@ nx_fw_cmd_create_rx_ctx(struct netxen_adapter *adapter)
        nx_cardrsp_sds_ring_t *prsp_sds;
        struct nx_host_rds_ring *rds_ring;
        struct nx_host_sds_ring *sds_ring;
+       struct netxen_cmd_args cmd;
 
        dma_addr_t hostrq_phys_addr, cardrsp_phys_addr;
        u64 phys_addr;
@@ -218,13 +368,12 @@ nx_fw_cmd_create_rx_ctx(struct netxen_adapter *adapter)
        }
 
        phys_addr = hostrq_phys_addr;
-       err = netxen_issue_cmd(adapter,
-                       adapter->ahw.pci_func,
-                       NXHAL_VERSION,
-                       (u32)(phys_addr >> 32),
-                       (u32)(phys_addr & 0xffffffff),
-                       rq_size,
-                       NX_CDRP_CMD_CREATE_RX_CTX);
+       memset(&cmd, 0, sizeof(cmd));
+       cmd.req.arg1 = (u32)(phys_addr >> 32);
+       cmd.req.arg2 = (u32)(phys_addr & 0xffffffff);
+       cmd.req.arg3 = rq_size;
+       cmd.req.cmd = NX_CDRP_CMD_CREATE_RX_CTX;
+       err = netxen_issue_cmd(adapter, &cmd);
        if (err) {
                printk(KERN_WARNING
                        "Failed to create rx ctx in firmware%d\n", err);
@@ -273,15 +422,15 @@ static void
 nx_fw_cmd_destroy_rx_ctx(struct netxen_adapter *adapter)
 {
        struct netxen_recv_context *recv_ctx = &adapter->recv_ctx;
+       struct netxen_cmd_args cmd;
 
-       if (netxen_issue_cmd(adapter,
-                       adapter->ahw.pci_func,
-                       NXHAL_VERSION,
-                       recv_ctx->context_id,
-                       NX_DESTROY_CTX_RESET,
-                       0,
-                       NX_CDRP_CMD_DESTROY_RX_CTX)) {
+       memset(&cmd, 0, sizeof(cmd));
+       cmd.req.arg1 = recv_ctx->context_id;
+       cmd.req.arg2 = NX_DESTROY_CTX_RESET;
+       cmd.req.arg3 = 0;
+       cmd.req.cmd = NX_CDRP_CMD_DESTROY_RX_CTX;
 
+       if (netxen_issue_cmd(adapter, &cmd)) {
                printk(KERN_WARNING
                        "%s: Failed to destroy rx ctx in firmware\n",
                        netxen_nic_driver_name);
@@ -302,6 +451,7 @@ nx_fw_cmd_create_tx_ctx(struct netxen_adapter *adapter)
        dma_addr_t      rq_phys_addr, rsp_phys_addr;
        struct nx_host_tx_ring *tx_ring = adapter->tx_ring;
        struct netxen_recv_context *recv_ctx = &adapter->recv_ctx;
+       struct netxen_cmd_args cmd;
 
        rq_size = SIZEOF_HOSTRQ_TX(nx_hostrq_tx_ctx_t);
        rq_addr = pci_alloc_consistent(adapter->pdev,
@@ -345,13 +495,12 @@ nx_fw_cmd_create_tx_ctx(struct netxen_adapter *adapter)
        prq_cds->ring_size = cpu_to_le32(tx_ring->num_desc);
 
        phys_addr = rq_phys_addr;
-       err = netxen_issue_cmd(adapter,
-                       adapter->ahw.pci_func,
-                       NXHAL_VERSION,
-                       (u32)(phys_addr >> 32),
-                       ((u32)phys_addr & 0xffffffff),
-                       rq_size,
-                       NX_CDRP_CMD_CREATE_TX_CTX);
+       memset(&cmd, 0, sizeof(cmd));
+       cmd.req.arg1 = (u32)(phys_addr >> 32);
+       cmd.req.arg2 = ((u32)phys_addr & 0xffffffff);
+       cmd.req.arg3 = rq_size;
+       cmd.req.cmd = NX_CDRP_CMD_CREATE_TX_CTX;
+       err = netxen_issue_cmd(adapter, &cmd);
 
        if (err == NX_RCODE_SUCCESS) {
                temp = le32_to_cpu(prsp->cds_ring.host_producer_crb);
@@ -380,14 +529,14 @@ out_free_rq:
 static void
 nx_fw_cmd_destroy_tx_ctx(struct netxen_adapter *adapter)
 {
-       if (netxen_issue_cmd(adapter,
-                       adapter->ahw.pci_func,
-                       NXHAL_VERSION,
-                       adapter->tx_context_id,
-                       NX_DESTROY_CTX_RESET,
-                       0,
-                       NX_CDRP_CMD_DESTROY_TX_CTX)) {
-
+       struct netxen_cmd_args cmd;
+
+       memset(&cmd, 0, sizeof(cmd));
+       cmd.req.arg1 = adapter->tx_context_id;
+       cmd.req.arg2 = NX_DESTROY_CTX_RESET;
+       cmd.req.arg3 = 0;
+       cmd.req.cmd = NX_CDRP_CMD_DESTROY_TX_CTX;
+       if (netxen_issue_cmd(adapter, &cmd)) {
                printk(KERN_WARNING
                        "%s: Failed to destroy tx ctx in firmware\n",
                        netxen_nic_driver_name);
@@ -398,34 +547,37 @@ int
 nx_fw_cmd_query_phy(struct netxen_adapter *adapter, u32 reg, u32 *val)
 {
        u32 rcode;
-
-       rcode = netxen_issue_cmd(adapter,
-                       adapter->ahw.pci_func,
-                       NXHAL_VERSION,
-                       reg,
-                       0,
-                       0,
-                       NX_CDRP_CMD_READ_PHY);
-
+       struct netxen_cmd_args cmd;
+
+       memset(&cmd, 0, sizeof(cmd));
+       cmd.req.arg1 = reg;
+       cmd.req.arg2 = 0;
+       cmd.req.arg3 = 0;
+       cmd.req.cmd = NX_CDRP_CMD_READ_PHY;
+       cmd.rsp.arg1 = 1;
+       rcode = netxen_issue_cmd(adapter, &cmd);
        if (rcode != NX_RCODE_SUCCESS)
                return -EIO;
 
-       return NXRD32(adapter, NX_ARG1_CRB_OFFSET);
+       if (val == NULL)
+               return -EIO;
+
+       *val = cmd.rsp.arg1;
+       return 0;
 }
 
 int
 nx_fw_cmd_set_phy(struct netxen_adapter *adapter, u32 reg, u32 val)
 {
        u32 rcode;
-
-       rcode = netxen_issue_cmd(adapter,
-                       adapter->ahw.pci_func,
-                       NXHAL_VERSION,
-                       reg,
-                       val,
-                       0,
-                       NX_CDRP_CMD_WRITE_PHY);
-
+       struct netxen_cmd_args cmd;
+
+       memset(&cmd, 0, sizeof(cmd));
+       cmd.req.arg1 = reg;
+       cmd.req.arg2 = val;
+       cmd.req.arg3 = 0;
+       cmd.req.cmd = NX_CDRP_CMD_WRITE_PHY;
+       rcode = netxen_issue_cmd(adapter, &cmd);
        if (rcode != NX_RCODE_SUCCESS)
                return -EIO;
 
index 8a37198..8c39299 100644 (file)
@@ -248,6 +248,11 @@ skip:
                }
        }
 
+       if (!netif_running(dev) || !adapter->ahw.linkup) {
+               ecmd->duplex = DUPLEX_UNKNOWN;
+               ethtool_cmd_speed_set(ecmd, SPEED_UNKNOWN);
+       }
+
        return 0;
 }
 
@@ -812,6 +817,107 @@ static int netxen_get_intr_coalesce(struct net_device *netdev,
        return 0;
 }
 
+static int
+netxen_get_dump_flag(struct net_device *netdev, struct ethtool_dump *dump)
+{
+       struct netxen_adapter *adapter = netdev_priv(netdev);
+       struct netxen_minidump *mdump = &adapter->mdump;
+       if (adapter->fw_mdump_rdy)
+               dump->len = mdump->md_dump_size;
+       else
+               dump->len = 0;
+       dump->flag = mdump->md_capture_mask;
+       dump->version = adapter->fw_version;
+       return 0;
+}
+
+static int
+netxen_set_dump(struct net_device *netdev, struct ethtool_dump *val)
+{
+       int ret = 0;
+       struct netxen_adapter *adapter = netdev_priv(netdev);
+       struct netxen_minidump *mdump = &adapter->mdump;
+
+       switch (val->flag) {
+       case NX_FORCE_FW_DUMP_KEY:
+               if (!mdump->md_enabled)
+                       mdump->md_enabled = 1;
+               if (adapter->fw_mdump_rdy) {
+                       netdev_info(netdev, "Previous dump not cleared, not forcing dump\n");
+                       return ret;
+               }
+               netdev_info(netdev, "Forcing a fw dump\n");
+               nx_dev_request_reset(adapter);
+               break;
+       case NX_DISABLE_FW_DUMP:
+               if (mdump->md_enabled) {
+                       netdev_info(netdev, "Disabling FW Dump\n");
+                       mdump->md_enabled = 0;
+               }
+               break;
+       case NX_ENABLE_FW_DUMP:
+               if (!mdump->md_enabled) {
+                       netdev_info(netdev, "Enabling FW dump\n");
+                       mdump->md_enabled = 1;
+               }
+               break;
+       case NX_FORCE_FW_RESET:
+               netdev_info(netdev, "Forcing FW reset\n");
+               nx_dev_request_reset(adapter);
+               adapter->flags &= ~NETXEN_FW_RESET_OWNER;
+               break;
+       default:
+               if (val->flag <= NX_DUMP_MASK_MAX &&
+                       val->flag >= NX_DUMP_MASK_MIN) {
+                       mdump->md_capture_mask = val->flag & 0xff;
+                       netdev_info(netdev, "Driver mask changed to: 0x%x\n",
+                                       mdump->md_capture_mask);
+                       break;
+               }
+               netdev_info(netdev,
+                       "Invalid dump level: 0x%x\n", val->flag);
+               return -EINVAL;
+       }
+
+       return ret;
+}
+
+static int
+netxen_get_dump_data(struct net_device *netdev, struct ethtool_dump *dump,
+                       void *buffer)
+{
+       int i, copy_sz;
+       u32 *hdr_ptr, *data;
+       struct netxen_adapter *adapter = netdev_priv(netdev);
+       struct netxen_minidump *mdump = &adapter->mdump;
+
+
+       if (!adapter->fw_mdump_rdy) {
+               netdev_info(netdev, "Dump not available\n");
+               return -EINVAL;
+       }
+       /* Copy template header first */
+       copy_sz = mdump->md_template_size;
+       hdr_ptr = (u32 *) mdump->md_template;
+       data = buffer;
+       for (i = 0; i < copy_sz/sizeof(u32); i++)
+               *data++ = cpu_to_le32(*hdr_ptr++);
+
+       /* Copy captured dump data */
+       memcpy(buffer + copy_sz,
+               mdump->md_capture_buff + mdump->md_template_size,
+                       mdump->md_capture_size);
+       dump->len = copy_sz + mdump->md_capture_size;
+       dump->flag = mdump->md_capture_mask;
+
+       /* Free dump area once data has been captured */
+       vfree(mdump->md_capture_buff);
+       mdump->md_capture_buff = NULL;
+       adapter->fw_mdump_rdy = 0;
+       netdev_info(netdev, "extracted the fw dump Successfully\n");
+       return 0;
+}
+
 const struct ethtool_ops netxen_nic_ethtool_ops = {
        .get_settings = netxen_nic_get_settings,
        .set_settings = netxen_nic_set_settings,
@@ -833,4 +939,7 @@ const struct ethtool_ops netxen_nic_ethtool_ops = {
        .get_sset_count = netxen_get_sset_count,
        .get_coalesce = netxen_get_intr_coalesce,
        .set_coalesce = netxen_set_intr_coalesce,
+       .get_dump_flag = netxen_get_dump_flag,
+       .get_dump_data = netxen_get_dump_data,
+       .set_dump = netxen_set_dump,
 };
index dc1967c..b1a897c 100644 (file)
@@ -969,6 +969,7 @@ enum {
 #define NX_RCODE_FATAL_ERROR           0x80000000
 #define NX_FWERROR_PEGNUM(code)                ((code) & 0xff)
 #define NX_FWERROR_CODE(code)          ((code >> 8) & 0xfffff)
+#define NX_FWERROR_PEGSTAT1(code)      ((code >> 8) & 0x1fffff)
 
 #define FW_POLL_DELAY                  (2 * HZ)
 #define FW_FAIL_THRESH                 3
index 3f89e57..6f37470 100644 (file)
@@ -46,7 +46,6 @@ static void netxen_nic_io_write_128M(struct netxen_adapter *adapter,
                void __iomem *addr, u32 data);
 static u32 netxen_nic_io_read_128M(struct netxen_adapter *adapter,
                void __iomem *addr);
-
 #ifndef readq
 static inline u64 readq(void __iomem *addr)
 {
@@ -1974,3 +1973,631 @@ netxen_nic_wol_supported(struct netxen_adapter *adapter)
 
        return 0;
 }
+
+static u32 netxen_md_cntrl(struct netxen_adapter *adapter,
+                       struct netxen_minidump_template_hdr *template_hdr,
+                       struct netxen_minidump_entry_crb *crtEntry)
+{
+       int loop_cnt, i, rv = 0, timeout_flag;
+       u32 op_count, stride;
+       u32 opcode, read_value, addr;
+       unsigned long timeout, timeout_jiffies;
+       addr = crtEntry->addr;
+       op_count = crtEntry->op_count;
+       stride = crtEntry->addr_stride;
+
+       for (loop_cnt = 0; loop_cnt < op_count; loop_cnt++) {
+               for (i = 0; i < sizeof(crtEntry->opcode) * 8; i++) {
+                       opcode = (crtEntry->opcode & (0x1 << i));
+                       if (opcode) {
+                               switch (opcode) {
+                               case NX_DUMP_WCRB:
+                                       NX_WR_DUMP_REG(addr,
+                                               adapter->ahw.pci_base0,
+                                                       crtEntry->value_1);
+                                       break;
+                               case NX_DUMP_RWCRB:
+                                       NX_RD_DUMP_REG(addr,
+                                               adapter->ahw.pci_base0,
+                                                               &read_value);
+                                       NX_WR_DUMP_REG(addr,
+                                               adapter->ahw.pci_base0,
+                                                               read_value);
+                                       break;
+                               case NX_DUMP_ANDCRB:
+                                       NX_RD_DUMP_REG(addr,
+                                               adapter->ahw.pci_base0,
+                                                               &read_value);
+                                       read_value &= crtEntry->value_2;
+                                       NX_WR_DUMP_REG(addr,
+                                               adapter->ahw.pci_base0,
+                                                               read_value);
+                                       break;
+                               case NX_DUMP_ORCRB:
+                                       NX_RD_DUMP_REG(addr,
+                                               adapter->ahw.pci_base0,
+                                                               &read_value);
+                                       read_value |= crtEntry->value_3;
+                                       NX_WR_DUMP_REG(addr,
+                                               adapter->ahw.pci_base0,
+                                                               read_value);
+                                       break;
+                               case NX_DUMP_POLLCRB:
+                                       timeout = crtEntry->poll_timeout;
+                                       NX_RD_DUMP_REG(addr,
+                                               adapter->ahw.pci_base0,
+                                                               &read_value);
+                                       timeout_jiffies =
+                                       msecs_to_jiffies(timeout) + jiffies;
+                                       for (timeout_flag = 0;
+                                               !timeout_flag
+                                       && ((read_value & crtEntry->value_2)
+                                       != crtEntry->value_1);) {
+                                               if (time_after(jiffies,
+                                                       timeout_jiffies))
+                                                       timeout_flag = 1;
+                                       NX_RD_DUMP_REG(addr,
+                                                       adapter->ahw.pci_base0,
+                                                               &read_value);
+                                       }
+
+                                       if (timeout_flag) {
+                                               dev_err(&adapter->pdev->dev, "%s : "
+                                                       "Timeout in poll_crb control operation.\n"
+                                                               , __func__);
+                                               return -1;
+                                       }
+                                       break;
+                               case NX_DUMP_RD_SAVE:
+                                       /* Decide which address to use */
+                                       if (crtEntry->state_index_a)
+                                               addr =
+                                               template_hdr->saved_state_array
+                                               [crtEntry->state_index_a];
+                                       NX_RD_DUMP_REG(addr,
+                                               adapter->ahw.pci_base0,
+                                                               &read_value);
+                                       template_hdr->saved_state_array
+                                       [crtEntry->state_index_v]
+                                               = read_value;
+                                       break;
+                               case NX_DUMP_WRT_SAVED:
+                                       /* Decide which value to use */
+                                       if (crtEntry->state_index_v)
+                                               read_value =
+                                               template_hdr->saved_state_array
+                                               [crtEntry->state_index_v];
+                                       else
+                                               read_value = crtEntry->value_1;
+
+                                       /* Decide which address to use */
+                                       if (crtEntry->state_index_a)
+                                               addr =
+                                               template_hdr->saved_state_array
+                                               [crtEntry->state_index_a];
+
+                                       NX_WR_DUMP_REG(addr,
+                                               adapter->ahw.pci_base0,
+                                                               read_value);
+                                       break;
+                               case NX_DUMP_MOD_SAVE_ST:
+                                       read_value =
+                                       template_hdr->saved_state_array
+                                               [crtEntry->state_index_v];
+                                       read_value <<= crtEntry->shl;
+                                       read_value >>= crtEntry->shr;
+                                       if (crtEntry->value_2)
+                                               read_value &=
+                                               crtEntry->value_2;
+                                       read_value |= crtEntry->value_3;
+                                       read_value += crtEntry->value_1;
+                                       /* Write value back to state area.*/
+                                       template_hdr->saved_state_array
+                                               [crtEntry->state_index_v]
+                                                       = read_value;
+                                       break;
+                               default:
+                                       rv = 1;
+                                       break;
+                               }
+                       }
+               }
+               addr = addr + stride;
+       }
+       return rv;
+}
+
+/* Read memory or MN */
+static u32
+netxen_md_rdmem(struct netxen_adapter *adapter,
+               struct netxen_minidump_entry_rdmem
+                       *memEntry, u64 *data_buff)
+{
+       u64 addr, value = 0;
+       int i = 0, loop_cnt;
+
+       addr = (u64)memEntry->read_addr;
+       loop_cnt = memEntry->read_data_size;    /* This is size in bytes */
+       loop_cnt /= sizeof(value);
+
+       for (i = 0; i < loop_cnt; i++) {
+               if (netxen_nic_pci_mem_read_2M(adapter, addr, &value))
+                       goto out;
+               *data_buff++ = value;
+               addr += sizeof(value);
+       }
+out:
+       return i * sizeof(value);
+}
+
+/* Read CRB operation */
+static u32 netxen_md_rd_crb(struct netxen_adapter *adapter,
+                       struct netxen_minidump_entry_crb
+                               *crbEntry, u32 *data_buff)
+{
+       int loop_cnt;
+       u32 op_count, addr, stride, value;
+
+       addr = crbEntry->addr;
+       op_count = crbEntry->op_count;
+       stride = crbEntry->addr_stride;
+
+       for (loop_cnt = 0; loop_cnt < op_count; loop_cnt++) {
+               NX_RD_DUMP_REG(addr, adapter->ahw.pci_base0, &value);
+               *data_buff++ = addr;
+               *data_buff++ = value;
+               addr = addr + stride;
+       }
+       return loop_cnt * (2 * sizeof(u32));
+}
+
+/* Read ROM */
+static u32
+netxen_md_rdrom(struct netxen_adapter *adapter,
+                       struct netxen_minidump_entry_rdrom
+                               *romEntry, u32 *data_buff)
+{
+       int i, count = 0;
+       u32 size, lck_val;
+       u32 val;
+       u32 fl_addr, waddr, raddr;
+       fl_addr = romEntry->read_addr;
+       size = romEntry->read_data_size/4;
+lock_try:
+       lck_val = readl((void __iomem *)(adapter->ahw.pci_base0 +
+                                                       NX_FLASH_SEM2_LK));
+       if (!lck_val && count < MAX_CTL_CHECK) {
+               msleep(20);
+               count++;
+               goto lock_try;
+       }
+       writel(adapter->ahw.pci_func, (void __iomem *)(adapter->ahw.pci_base0 +
+                                                       NX_FLASH_LOCK_ID));
+       for (i = 0; i < size; i++) {
+               waddr = fl_addr & 0xFFFF0000;
+               NX_WR_DUMP_REG(FLASH_ROM_WINDOW, adapter->ahw.pci_base0, waddr);
+               raddr = FLASH_ROM_DATA + (fl_addr & 0x0000FFFF);
+               NX_RD_DUMP_REG(raddr, adapter->ahw.pci_base0, &val);
+               *data_buff++ = cpu_to_le32(val);
+               fl_addr += sizeof(val);
+       }
+       readl((void __iomem *)(adapter->ahw.pci_base0 + NX_FLASH_SEM2_ULK));
+       return romEntry->read_data_size;
+}
+
+/* Handle L2 Cache */
+static u32
+netxen_md_L2Cache(struct netxen_adapter *adapter,
+                               struct netxen_minidump_entry_cache
+                                       *cacheEntry, u32 *data_buff)
+{
+       int loop_cnt, i, k, timeout_flag = 0;
+       u32 addr, read_addr, read_value, cntrl_addr, tag_reg_addr;
+       u32 tag_value, read_cnt;
+       u8 cntl_value_w, cntl_value_r;
+       unsigned long timeout, timeout_jiffies;
+
+       loop_cnt = cacheEntry->op_count;
+       read_addr = cacheEntry->read_addr;
+       cntrl_addr = cacheEntry->control_addr;
+       cntl_value_w = (u32) cacheEntry->write_value;
+       tag_reg_addr = cacheEntry->tag_reg_addr;
+       tag_value = cacheEntry->init_tag_value;
+       read_cnt = cacheEntry->read_addr_cnt;
+
+       for (i = 0; i < loop_cnt; i++) {
+               NX_WR_DUMP_REG(tag_reg_addr, adapter->ahw.pci_base0, tag_value);
+               if (cntl_value_w)
+                       NX_WR_DUMP_REG(cntrl_addr, adapter->ahw.pci_base0,
+                                       (u32)cntl_value_w);
+               if (cacheEntry->poll_mask) {
+                       timeout = cacheEntry->poll_wait;
+                       NX_RD_DUMP_REG(cntrl_addr, adapter->ahw.pci_base0,
+                                                       &cntl_value_r);
+                       timeout_jiffies = msecs_to_jiffies(timeout) + jiffies;
+                       for (timeout_flag = 0; !timeout_flag &&
+                       ((cntl_value_r & cacheEntry->poll_mask) != 0);) {
+                               if (time_after(jiffies, timeout_jiffies))
+                                       timeout_flag = 1;
+                               NX_RD_DUMP_REG(cntrl_addr,
+                                       adapter->ahw.pci_base0,
+                                                       &cntl_value_r);
+                       }
+                       if (timeout_flag) {
+                               dev_err(&adapter->pdev->dev,
+                                               "Timeout in processing L2 Tag poll.\n");
+                               return -1;
+                       }
+               }
+               addr = read_addr;
+               for (k = 0; k < read_cnt; k++) {
+                       NX_RD_DUMP_REG(addr, adapter->ahw.pci_base0,
+                                       &read_value);
+                       *data_buff++ = read_value;
+                       addr += cacheEntry->read_addr_stride;
+               }
+               tag_value += cacheEntry->tag_value_stride;
+       }
+       return read_cnt * loop_cnt * sizeof(read_value);
+}
+
+
+/* Handle L1 Cache */
+static u32 netxen_md_L1Cache(struct netxen_adapter *adapter,
+                               struct netxen_minidump_entry_cache
+                                       *cacheEntry, u32 *data_buff)
+{
+       int i, k, loop_cnt;
+       u32 addr, read_addr, read_value, cntrl_addr, tag_reg_addr;
+       u32 tag_value, read_cnt;
+       u8 cntl_value_w;
+
+       loop_cnt = cacheEntry->op_count;
+       read_addr = cacheEntry->read_addr;
+       cntrl_addr = cacheEntry->control_addr;
+       cntl_value_w = (u32) cacheEntry->write_value;
+       tag_reg_addr = cacheEntry->tag_reg_addr;
+       tag_value = cacheEntry->init_tag_value;
+       read_cnt = cacheEntry->read_addr_cnt;
+
+       for (i = 0; i < loop_cnt; i++) {
+               NX_WR_DUMP_REG(tag_reg_addr, adapter->ahw.pci_base0, tag_value);
+               NX_WR_DUMP_REG(cntrl_addr, adapter->ahw.pci_base0,
+                                               (u32) cntl_value_w);
+               addr = read_addr;
+               for (k = 0; k < read_cnt; k++) {
+                       NX_RD_DUMP_REG(addr,
+                               adapter->ahw.pci_base0,
+                                               &read_value);
+                       *data_buff++ = read_value;
+                       addr += cacheEntry->read_addr_stride;
+               }
+               tag_value += cacheEntry->tag_value_stride;
+       }
+       return read_cnt * loop_cnt * sizeof(read_value);
+}
+
+/* Reading OCM memory */
+static u32
+netxen_md_rdocm(struct netxen_adapter *adapter,
+                               struct netxen_minidump_entry_rdocm
+                                       *ocmEntry, u32 *data_buff)
+{
+       int i, loop_cnt;
+       u32 value;
+       void __iomem *addr;
+       addr = (ocmEntry->read_addr + adapter->ahw.pci_base0);
+       loop_cnt = ocmEntry->op_count;
+
+       for (i = 0; i < loop_cnt; i++) {
+               value = readl(addr);
+               *data_buff++ = value;
+               addr += ocmEntry->read_addr_stride;
+       }
+       return i * sizeof(u32);
+}
+
+/* Read MUX data */
+static u32
+netxen_md_rdmux(struct netxen_adapter *adapter, struct netxen_minidump_entry_mux
+                                       *muxEntry, u32 *data_buff)
+{
+       int loop_cnt = 0;
+       u32 read_addr, read_value, select_addr, sel_value;
+
+       read_addr = muxEntry->read_addr;
+       sel_value = muxEntry->select_value;
+       select_addr = muxEntry->select_addr;
+
+       for (loop_cnt = 0; loop_cnt < muxEntry->op_count; loop_cnt++) {
+               NX_WR_DUMP_REG(select_addr, adapter->ahw.pci_base0, sel_value);
+               NX_RD_DUMP_REG(read_addr, adapter->ahw.pci_base0, &read_value);
+               *data_buff++ = sel_value;
+               *data_buff++ = read_value;
+               sel_value += muxEntry->select_value_stride;
+       }
+       return loop_cnt * (2 * sizeof(u32));
+}
+
+/* Handling Queue State Reads */
+static u32
+netxen_md_rdqueue(struct netxen_adapter *adapter,
+                               struct netxen_minidump_entry_queue
+                                       *queueEntry, u32 *data_buff)
+{
+       int loop_cnt, k;
+       u32 queue_id, read_addr, read_value, read_stride, select_addr, read_cnt;
+
+       read_cnt = queueEntry->read_addr_cnt;
+       read_stride = queueEntry->read_addr_stride;
+       select_addr = queueEntry->select_addr;
+
+       for (loop_cnt = 0, queue_id = 0; loop_cnt < queueEntry->op_count;
+                                loop_cnt++) {
+               NX_WR_DUMP_REG(select_addr, adapter->ahw.pci_base0, queue_id);
+               read_addr = queueEntry->read_addr;
+               for (k = 0; k < read_cnt; k--) {
+                       NX_RD_DUMP_REG(read_addr, adapter->ahw.pci_base0,
+                                                       &read_value);
+                       *data_buff++ = read_value;
+                       read_addr += read_stride;
+               }
+               queue_id += queueEntry->queue_id_stride;
+       }
+       return loop_cnt * (read_cnt * sizeof(read_value));
+}
+
+
+/*
+* We catch an error where driver does not read
+* as much data as we expect from the entry.
+*/
+
+static int netxen_md_entry_err_chk(struct netxen_adapter *adapter,
+                               struct netxen_minidump_entry *entry, int esize)
+{
+       if (esize < 0) {
+               entry->hdr.driver_flags |= NX_DUMP_SKIP;
+               return esize;
+       }
+       if (esize != entry->hdr.entry_capture_size) {
+               entry->hdr.entry_capture_size = esize;
+               entry->hdr.driver_flags |= NX_DUMP_SIZE_ERR;
+               dev_info(&adapter->pdev->dev,
+                       "Invalidate dump, Type:%d\tMask:%d\tSize:%dCap_size:%d\n",
+                       entry->hdr.entry_type, entry->hdr.entry_capture_mask,
+                       esize, entry->hdr.entry_capture_size);
+               dev_info(&adapter->pdev->dev, "Aborting further dump capture\n");
+       }
+       return 0;
+}
+
+static int netxen_parse_md_template(struct netxen_adapter *adapter)
+{
+       int num_of_entries, buff_level, e_cnt, esize;
+       int end_cnt = 0, rv = 0, sane_start = 0, sane_end = 0;
+       char *dbuff;
+       void *template_buff = adapter->mdump.md_template;
+       char *dump_buff = adapter->mdump.md_capture_buff;
+       int capture_mask = adapter->mdump.md_capture_mask;
+       struct netxen_minidump_template_hdr *template_hdr;
+       struct netxen_minidump_entry *entry;
+
+       if ((capture_mask & 0x3) != 0x3) {
+               dev_err(&adapter->pdev->dev, "Capture mask %02x below minimum needed "
+                       "for valid firmware dump\n", capture_mask);
+               return -EINVAL;
+       }
+       template_hdr = (struct netxen_minidump_template_hdr *) template_buff;
+       num_of_entries = template_hdr->num_of_entries;
+       entry = (struct netxen_minidump_entry *) ((char *) template_buff +
+                               template_hdr->first_entry_offset);
+       memcpy(dump_buff, template_buff, adapter->mdump.md_template_size);
+       dump_buff = dump_buff + adapter->mdump.md_template_size;
+
+       if (template_hdr->entry_type == TLHDR)
+               sane_start = 1;
+
+       for (e_cnt = 0, buff_level = 0; e_cnt < num_of_entries; e_cnt++) {
+               if (!(entry->hdr.entry_capture_mask & capture_mask)) {
+                       entry->hdr.driver_flags |= NX_DUMP_SKIP;
+                       entry = (struct netxen_minidump_entry *)
+                               ((char *) entry + entry->hdr.entry_size);
+                       continue;
+               }
+               switch (entry->hdr.entry_type) {
+               case RDNOP:
+                       entry->hdr.driver_flags |= NX_DUMP_SKIP;
+                       break;
+               case RDEND:
+                       entry->hdr.driver_flags |= NX_DUMP_SKIP;
+                       if (!sane_end)
+                               end_cnt = e_cnt;
+                       sane_end += 1;
+                       break;
+               case CNTRL:
+                       rv = netxen_md_cntrl(adapter,
+                               template_hdr, (void *)entry);
+                       if (rv)
+                               entry->hdr.driver_flags |= NX_DUMP_SKIP;
+                       break;
+               case RDCRB:
+                       dbuff = dump_buff + buff_level;
+                       esize = netxen_md_rd_crb(adapter,
+                                       (void *) entry, (void *) dbuff);
+                       rv = netxen_md_entry_err_chk
+                               (adapter, entry, esize);
+                       if (rv < 0)
+                               break;
+                       buff_level += esize;
+                       break;
+               case RDMN:
+               case RDMEM:
+                       dbuff = dump_buff + buff_level;
+                       esize = netxen_md_rdmem(adapter,
+                               (void *) entry, (void *) dbuff);
+                       rv = netxen_md_entry_err_chk
+                               (adapter, entry, esize);
+                       if (rv < 0)
+                               break;
+                       buff_level += esize;
+                       break;
+               case BOARD:
+               case RDROM:
+                       dbuff = dump_buff + buff_level;
+                       esize = netxen_md_rdrom(adapter,
+                               (void *) entry, (void *) dbuff);
+                       rv = netxen_md_entry_err_chk
+                               (adapter, entry, esize);
+                       if (rv < 0)
+                               break;
+                       buff_level += esize;
+                       break;
+               case L2ITG:
+               case L2DTG:
+               case L2DAT:
+               case L2INS:
+                       dbuff = dump_buff + buff_level;
+                       esize = netxen_md_L2Cache(adapter,
+                               (void *) entry, (void *) dbuff);
+                       rv = netxen_md_entry_err_chk
+                               (adapter, entry, esize);
+                       if (rv < 0)
+                               break;
+                       buff_level += esize;
+                       break;
+               case L1DAT:
+               case L1INS:
+                       dbuff = dump_buff + buff_level;
+                       esize = netxen_md_L1Cache(adapter,
+                               (void *) entry, (void *) dbuff);
+                       rv = netxen_md_entry_err_chk
+                               (adapter, entry, esize);
+                       if (rv < 0)
+                               break;
+                       buff_level += esize;
+                       break;
+               case RDOCM:
+                       dbuff = dump_buff + buff_level;
+                       esize = netxen_md_rdocm(adapter,
+                               (void *) entry, (void *) dbuff);
+                       rv = netxen_md_entry_err_chk
+                               (adapter, entry, esize);
+                       if (rv < 0)
+                               break;
+                       buff_level += esize;
+                       break;
+               case RDMUX:
+                       dbuff = dump_buff + buff_level;
+                       esize = netxen_md_rdmux(adapter,
+                               (void *) entry, (void *) dbuff);
+                       rv = netxen_md_entry_err_chk
+                               (adapter, entry, esize);
+                       if (rv < 0)
+                               break;
+                       buff_level += esize;
+                       break;
+               case QUEUE:
+                       dbuff = dump_buff + buff_level;
+                       esize = netxen_md_rdqueue(adapter,
+                               (void *) entry, (void *) dbuff);
+                       rv = netxen_md_entry_err_chk
+                               (adapter, entry, esize);
+                       if (rv  < 0)
+                               break;
+                       buff_level += esize;
+                       break;
+               default:
+                       entry->hdr.driver_flags |= NX_DUMP_SKIP;
+                       break;
+               }
+               /* Next entry in the template */
+               entry = (struct netxen_minidump_entry *)
+                       ((char *) entry + entry->hdr.entry_size);
+       }
+       if (!sane_start || sane_end > 1) {
+               dev_err(&adapter->pdev->dev,
+                               "Firmware minidump template configuration error.\n");
+       }
+       return 0;
+}
+
+static int
+netxen_collect_minidump(struct netxen_adapter *adapter)
+{
+       int ret = 0;
+       struct netxen_minidump_template_hdr *hdr;
+       struct timespec val;
+       hdr = (struct netxen_minidump_template_hdr *)
+                               adapter->mdump.md_template;
+       hdr->driver_capture_mask = adapter->mdump.md_capture_mask;
+       jiffies_to_timespec(jiffies, &val);
+       hdr->driver_timestamp = (u32) val.tv_sec;
+       hdr->driver_info_word2 = adapter->fw_version;
+       hdr->driver_info_word3 = NXRD32(adapter, CRB_DRIVER_VERSION);
+       ret = netxen_parse_md_template(adapter);
+       if (ret)
+               return ret;
+
+       return ret;
+}
+
+
+void
+netxen_dump_fw(struct netxen_adapter *adapter)
+{
+       struct netxen_minidump_template_hdr *hdr;
+       int i, k, data_size = 0;
+       u32 capture_mask;
+       hdr = (struct netxen_minidump_template_hdr *)
+                               adapter->mdump.md_template;
+       capture_mask = adapter->mdump.md_capture_mask;
+
+       for (i = 0x2, k = 1; (i & NX_DUMP_MASK_MAX); i <<= 1, k++) {
+               if (i & capture_mask)
+                       data_size += hdr->capture_size_array[k];
+       }
+       if (!data_size) {
+               dev_err(&adapter->pdev->dev,
+                               "Invalid cap sizes for capture_mask=0x%x\n",
+                       adapter->mdump.md_capture_mask);
+               return;
+       }
+       adapter->mdump.md_capture_size = data_size;
+       adapter->mdump.md_dump_size = adapter->mdump.md_template_size +
+                                       adapter->mdump.md_capture_size;
+       if (!adapter->mdump.md_capture_buff) {
+               adapter->mdump.md_capture_buff =
+                               vmalloc(adapter->mdump.md_dump_size);
+               if (!adapter->mdump.md_capture_buff) {
+                       dev_info(&adapter->pdev->dev,
+                               "Unable to allocate memory for minidump "
+                               "capture_buffer(%d bytes).\n",
+                                       adapter->mdump.md_dump_size);
+                       return;
+               }
+               memset(adapter->mdump.md_capture_buff, 0,
+                               adapter->mdump.md_dump_size);
+               if (netxen_collect_minidump(adapter)) {
+                       adapter->mdump.has_valid_dump = 0;
+                       adapter->mdump.md_dump_size = 0;
+                       vfree(adapter->mdump.md_capture_buff);
+                       adapter->mdump.md_capture_buff = NULL;
+                       dev_err(&adapter->pdev->dev,
+                               "Error in collecting firmware minidump.\n");
+               } else {
+                       adapter->mdump.md_timestamp = jiffies;
+                       adapter->mdump.has_valid_dump = 1;
+                       adapter->fw_mdump_rdy = 1;
+                       dev_info(&adapter->pdev->dev, "%s Successfully "
+                               "collected fw dump.\n", adapter->netdev->name);
+               }
+
+       } else {
+               dev_info(&adapter->pdev->dev,
+                                       "Cannot overwrite previously collected "
+                                                       "firmware minidump.\n");
+               adapter->fw_mdump_rdy = 1;
+               return;
+       }
+}
index a8259cc..718b274 100644 (file)
@@ -280,13 +280,10 @@ int netxen_alloc_sw_resources(struct netxen_adapter *adapter)
 
                }
                rds_ring->rx_buf_arr = vzalloc(RCV_BUFF_RINGSIZE(rds_ring));
-               if (rds_ring->rx_buf_arr == NULL) {
-                       printk(KERN_ERR "%s: Failed to allocate "
-                               "rx buffer ring %d\n",
-                               netdev->name, ring);
+               if (rds_ring->rx_buf_arr == NULL)
                        /* free whatever was already allocated */
                        goto err_out;
-               }
+
                INIT_LIST_HEAD(&rds_ring->free_list);
                /*
                 * Now go through all of them, set reference handles
@@ -449,7 +446,7 @@ int netxen_pinit_from_rom(struct netxen_adapter *adapter)
 
        /* resetall */
        netxen_rom_lock(adapter);
-       NXWR32(adapter, NETXEN_ROMUSB_GLB_SW_RESET, 0xffffffff);
+       NXWR32(adapter, NETXEN_ROMUSB_GLB_SW_RESET, 0xfeffffff);
        netxen_rom_unlock(adapter);
 
        if (NX_IS_REVISION_P3(adapter->ahw.revision_id)) {
@@ -480,11 +477,8 @@ int netxen_pinit_from_rom(struct netxen_adapter *adapter)
        }
 
        buf = kcalloc(n, sizeof(struct crb_addr_pair), GFP_KERNEL);
-       if (buf == NULL) {
-               printk("%s: netxen_pinit_from_rom: Unable to calloc memory.\n",
-                               netxen_nic_driver_name);
+       if (buf == NULL)
                return -ENOMEM;
-       }
 
        for (i = 0; i < n; i++) {
                if (netxen_rom_fast_read(adapter, 8*i + 4*offset, &val) != 0 ||
@@ -1353,7 +1347,6 @@ int netxen_phantom_init(struct netxen_adapter *adapter, int pegtune_val)
 
        do {
                val = NXRD32(adapter, CRB_CMDPEG_STATE);
-
                switch (val) {
                case PHAN_INITIALIZE_COMPLETE:
                case PHAN_INITIALIZE_ACK:
@@ -1494,7 +1487,7 @@ netxen_alloc_rx_skb(struct netxen_adapter *adapter,
        dma_addr_t dma;
        struct pci_dev *pdev = adapter->pdev;
 
-       buffer->skb = dev_alloc_skb(rds_ring->skb_size);
+       buffer->skb = netdev_alloc_skb(adapter->netdev, rds_ring->skb_size);
        if (!buffer->skb)
                return 1;
 
index 7dd9a4b..7648995 100644 (file)
@@ -82,7 +82,6 @@ static void netxen_create_sysfs_entries(struct netxen_adapter *adapter);
 static void netxen_remove_sysfs_entries(struct netxen_adapter *adapter);
 static void netxen_create_diag_entries(struct netxen_adapter *adapter);
 static void netxen_remove_diag_entries(struct netxen_adapter *adapter);
-
 static int nx_dev_request_aer(struct netxen_adapter *adapter);
 static int nx_decr_dev_ref_cnt(struct netxen_adapter *adapter);
 static int netxen_can_start_firmware(struct netxen_adapter *adapter);
@@ -519,7 +518,7 @@ static int netxen_nic_set_mac(struct net_device *netdev, void *p)
        struct sockaddr *addr = p;
 
        if (!is_valid_ether_addr(addr->sa_data))
-               return -EINVAL;
+               return -EADDRNOTAVAIL;
 
        if (netif_running(netdev)) {
                netif_device_detach(netdev);
@@ -802,10 +801,10 @@ err_out:
 static void
 netxen_check_options(struct netxen_adapter *adapter)
 {
-       u32 fw_major, fw_minor, fw_build;
+       u32 fw_major, fw_minor, fw_build, prev_fw_version;
        char brd_name[NETXEN_MAX_SHORT_NAME];
        char serial_num[32];
-       int i, offset, val;
+       int i, offset, val, err;
        int *ptr32;
        struct pci_dev *pdev = adapter->pdev;
 
@@ -826,9 +825,22 @@ netxen_check_options(struct netxen_adapter *adapter)
        fw_major = NXRD32(adapter, NETXEN_FW_VERSION_MAJOR);
        fw_minor = NXRD32(adapter, NETXEN_FW_VERSION_MINOR);
        fw_build = NXRD32(adapter, NETXEN_FW_VERSION_SUB);
-
+       prev_fw_version = adapter->fw_version;
        adapter->fw_version = NETXEN_VERSION_CODE(fw_major, fw_minor, fw_build);
 
+       /* Get FW Mini Coredump template and store it */
+        if (NX_IS_REVISION_P3(adapter->ahw.revision_id)) {
+               if (adapter->mdump.md_template == NULL ||
+                               adapter->fw_version > prev_fw_version) {
+                       kfree(adapter->mdump.md_template);
+                       adapter->mdump.md_template = NULL;
+                       err = netxen_setup_minidump(adapter);
+                       if (err)
+                               dev_err(&adapter->pdev->dev,
+                               "Failed to setup minidump rcode = %d\n", err);
+               }
+       }
+
        if (adapter->portnum == 0) {
                get_brd_name_by_type(adapter->ahw.board_type, brd_name);
 
@@ -909,7 +921,12 @@ netxen_start_firmware(struct netxen_adapter *adapter)
        if (err)
                return err;
 
-       if (!netxen_can_start_firmware(adapter))
+       err = netxen_can_start_firmware(adapter);
+
+       if (err < 0)
+               return err;
+
+       if (!err)
                goto wait_init;
 
        first_boot = NXRD32(adapter, NETXEN_CAM_RAM(0x1fc));
@@ -1403,7 +1420,6 @@ netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 
        netdev = alloc_etherdev(sizeof(struct netxen_adapter));
        if(!netdev) {
-               dev_err(&pdev->dev, "failed to allocate net_device\n");
                err = -ENOMEM;
                goto err_out_free_res;
        }
@@ -1529,6 +1545,18 @@ err_out_disable_pdev:
        return err;
 }
 
+static
+void netxen_cleanup_minidump(struct netxen_adapter *adapter)
+{
+       kfree(adapter->mdump.md_template);
+       adapter->mdump.md_template = NULL;
+
+       if (adapter->mdump.md_capture_buff) {
+               vfree(adapter->mdump.md_capture_buff);
+               adapter->mdump.md_capture_buff = NULL;
+       }
+}
+
 static void __devexit netxen_nic_remove(struct pci_dev *pdev)
 {
        struct netxen_adapter *adapter;
@@ -1564,8 +1592,10 @@ static void __devexit netxen_nic_remove(struct pci_dev *pdev)
 
        netxen_release_firmware(adapter);
 
-       if (NX_IS_REVISION_P3(pdev->revision))
+       if (NX_IS_REVISION_P3(pdev->revision)) {
+               netxen_cleanup_minidump(adapter);
                pci_disable_pcie_error_reporting(pdev);
+       }
 
        pci_release_regions(pdev);
        pci_disable_device(pdev);
@@ -2317,7 +2347,7 @@ nx_incr_dev_ref_cnt(struct netxen_adapter *adapter)
 static int
 nx_decr_dev_ref_cnt(struct netxen_adapter *adapter)
 {
-       int count;
+       int count, state;
        if (netxen_api_lock(adapter))
                return -EIO;
 
@@ -2325,8 +2355,9 @@ nx_decr_dev_ref_cnt(struct netxen_adapter *adapter)
        WARN_ON(count == 0);
 
        NXWR32(adapter, NX_CRB_DEV_REF_COUNT, --count);
+       state = NXRD32(adapter, NX_CRB_DEV_STATE);
 
-       if (count == 0)
+       if (count == 0 && state != NX_DEV_FAILED)
                NXWR32(adapter, NX_CRB_DEV_STATE, NX_DEV_COLD);
 
        netxen_api_unlock(adapter);
@@ -2355,7 +2386,7 @@ nx_dev_request_aer(struct netxen_adapter *adapter)
        return ret;
 }
 
-static int
+int
 nx_dev_request_reset(struct netxen_adapter *adapter)
 {
        u32 state;
@@ -2366,10 +2397,11 @@ nx_dev_request_reset(struct netxen_adapter *adapter)
 
        state = NXRD32(adapter, NX_CRB_DEV_STATE);
 
-       if (state == NX_DEV_NEED_RESET)
+       if (state == NX_DEV_NEED_RESET || state == NX_DEV_FAILED)
                ret = 0;
        else if (state != NX_DEV_INITALIZING && state != NX_DEV_NEED_AER) {
                NXWR32(adapter, NX_CRB_DEV_STATE, NX_DEV_NEED_RESET);
+               adapter->flags |= NETXEN_FW_RESET_OWNER;
                ret = 0;
        }
 
@@ -2384,8 +2416,10 @@ netxen_can_start_firmware(struct netxen_adapter *adapter)
        int count;
        int can_start = 0;
 
-       if (netxen_api_lock(adapter))
-               return 0;
+       if (netxen_api_lock(adapter)) {
+               nx_incr_dev_ref_cnt(adapter);
+               return -1;
+       }
 
        count = NXRD32(adapter, NX_CRB_DEV_REF_COUNT);
 
@@ -2457,8 +2491,31 @@ netxen_fwinit_work(struct work_struct *work)
        struct netxen_adapter *adapter = container_of(work,
                                struct netxen_adapter, fw_work.work);
        int dev_state;
-
+       int count;
        dev_state = NXRD32(adapter, NX_CRB_DEV_STATE);
+       if (adapter->flags & NETXEN_FW_RESET_OWNER) {
+               count = NXRD32(adapter, NX_CRB_DEV_REF_COUNT);
+               WARN_ON(count == 0);
+               if (count == 1) {
+                       if (adapter->mdump.md_enabled) {
+                               rtnl_lock();
+                               netxen_dump_fw(adapter);
+                               rtnl_unlock();
+                       }
+                       adapter->flags &= ~NETXEN_FW_RESET_OWNER;
+                       if (netxen_api_lock(adapter)) {
+                               clear_bit(__NX_RESETTING, &adapter->state);
+                               NXWR32(adapter, NX_CRB_DEV_STATE,
+                                               NX_DEV_FAILED);
+                               return;
+                       }
+                       count = NXRD32(adapter, NX_CRB_DEV_REF_COUNT);
+                       NXWR32(adapter, NX_CRB_DEV_REF_COUNT, --count);
+                       NXWR32(adapter, NX_CRB_DEV_STATE, NX_DEV_COLD);
+                       dev_state = NX_DEV_COLD;
+                       netxen_api_unlock(adapter);
+               }
+       }
 
        switch (dev_state) {
        case NX_DEV_COLD:
@@ -2471,11 +2528,9 @@ netxen_fwinit_work(struct work_struct *work)
 
        case NX_DEV_NEED_RESET:
        case NX_DEV_INITALIZING:
-               if (++adapter->fw_wait_cnt < FW_POLL_THRESH) {
                        netxen_schedule_work(adapter,
                                        netxen_fwinit_work, 2 * FW_POLL_DELAY);
                        return;
-               }
 
        case NX_DEV_FAILED:
        default:
@@ -2483,6 +2538,15 @@ netxen_fwinit_work(struct work_struct *work)
                break;
        }
 
+       if (netxen_api_lock(adapter)) {
+               clear_bit(__NX_RESETTING, &adapter->state);
+               return;
+       }
+       NXWR32(adapter, NX_CRB_DEV_STATE, NX_DEV_FAILED);
+       netxen_api_unlock(adapter);
+       dev_err(&adapter->pdev->dev, "%s: Device initialization Failed\n",
+                               adapter->netdev->name);
+
        clear_bit(__NX_RESETTING, &adapter->state);
 }
 
@@ -2492,7 +2556,7 @@ netxen_detach_work(struct work_struct *work)
        struct netxen_adapter *adapter = container_of(work,
                                struct netxen_adapter, fw_work.work);
        struct net_device *netdev = adapter->netdev;
-       int ref_cnt, delay;
+       int ref_cnt = 0, delay;
        u32 status;
 
        netif_device_detach(netdev);
@@ -2511,7 +2575,8 @@ netxen_detach_work(struct work_struct *work)
        if (adapter->temp == NX_TEMP_PANIC)
                goto err_ret;
 
-       ref_cnt = nx_decr_dev_ref_cnt(adapter);
+       if (!(adapter->flags & NETXEN_FW_RESET_OWNER))
+               ref_cnt = nx_decr_dev_ref_cnt(adapter);
 
        if (ref_cnt == -EIO)
                goto err_ret;
@@ -2531,6 +2596,7 @@ static int
 netxen_check_health(struct netxen_adapter *adapter)
 {
        u32 state, heartbit;
+       u32 peg_status;
        struct net_device *netdev = adapter->netdev;
 
        state = NXRD32(adapter, NX_CRB_DEV_STATE);
@@ -2551,7 +2617,7 @@ netxen_check_health(struct netxen_adapter *adapter)
         * Send request to destroy context in case of tx timeout only
         * and doesn't required in case of Fw hang
         */
-       if (state == NX_DEV_NEED_RESET) {
+       if (state == NX_DEV_NEED_RESET || state == NX_DEV_FAILED) {
                adapter->need_fw_reset = 1;
                if (NX_IS_REVISION_P2(adapter->ahw.revision_id))
                        goto detach;
@@ -2577,8 +2643,24 @@ netxen_check_health(struct netxen_adapter *adapter)
 
        clear_bit(__NX_FW_ATTACHED, &adapter->state);
 
-       dev_info(&netdev->dev, "firmware hang detected\n");
-
+       dev_err(&netdev->dev, "firmware hang detected\n");
+       peg_status = NXRD32(adapter, NETXEN_PEG_HALT_STATUS1);
+       dev_err(&adapter->pdev->dev, "Dumping hw/fw registers\n"
+                       "PEG_HALT_STATUS1: 0x%x, PEG_HALT_STATUS2: 0x%x,\n"
+                       "PEG_NET_0_PC: 0x%x, PEG_NET_1_PC: 0x%x,\n"
+                       "PEG_NET_2_PC: 0x%x, PEG_NET_3_PC: 0x%x,\n"
+                       "PEG_NET_4_PC: 0x%x\n",
+                       peg_status,
+                       NXRD32(adapter, NETXEN_PEG_HALT_STATUS2),
+                       NXRD32(adapter, NETXEN_CRB_PEG_NET_0 + 0x3c),
+                       NXRD32(adapter, NETXEN_CRB_PEG_NET_1 + 0x3c),
+                       NXRD32(adapter, NETXEN_CRB_PEG_NET_2 + 0x3c),
+                       NXRD32(adapter, NETXEN_CRB_PEG_NET_3 + 0x3c),
+                       NXRD32(adapter, NETXEN_CRB_PEG_NET_4 + 0x3c));
+       if (NX_FWERROR_PEGSTAT1(peg_status) == 0x67)
+               dev_err(&adapter->pdev->dev,
+                       "Firmware aborted with error code 0x00006700. "
+                               "Device is being reset.\n");
 detach:
        if ((auto_fw_reset == AUTO_FW_RESET_ENABLED) &&
                        !test_and_set_bit(__NX_RESETTING, &adapter->state))
@@ -2848,13 +2930,12 @@ static struct bin_attribute bin_attr_mem = {
 static void
 netxen_create_sysfs_entries(struct netxen_adapter *adapter)
 {
-       struct net_device *netdev = adapter->netdev;
-       struct device *dev = &netdev->dev;
+       struct device *dev = &adapter->pdev->dev;
 
        if (adapter->capabilities & NX_FW_CAPABILITY_BDG) {
                /* bridged_mode control */
                if (device_create_file(dev, &dev_attr_bridged_mode)) {
-                       dev_warn(&netdev->dev,
+                       dev_warn(dev,
                                "failed to create bridged_mode sysfs entry\n");
                }
        }
@@ -2863,8 +2944,7 @@ netxen_create_sysfs_entries(struct netxen_adapter *adapter)
 static void
 netxen_remove_sysfs_entries(struct netxen_adapter *adapter)
 {
-       struct net_device *netdev = adapter->netdev;
-       struct device *dev = &netdev->dev;
+       struct device *dev = &adapter->pdev->dev;
 
        if (adapter->capabilities & NX_FW_CAPABILITY_BDG)
                device_remove_file(dev, &dev_attr_bridged_mode);
index e61560e..8da3e41 100644 (file)
@@ -3804,7 +3804,6 @@ static int __devinit ql3xxx_probe(struct pci_dev *pdev,
 
        ndev = alloc_etherdev(sizeof(struct ql3_adapter));
        if (!ndev) {
-               pr_err("%s could not alloc etherdev\n", pci_name(pdev));
                err = -ENOMEM;
                goto err_out_free_regions;
        }
index 60976fc..2b5af22 100644 (file)
@@ -37,7 +37,7 @@
 #define _QLCNIC_LINUX_MAJOR 5
 #define _QLCNIC_LINUX_MINOR 0
 #define _QLCNIC_LINUX_SUBVERSION 25
-#define QLCNIC_LINUX_VERSIONID  "5.0.25"
+#define QLCNIC_LINUX_VERSIONID  "5.0.26"
 #define QLCNIC_DRV_IDC_VER  0x01
 #define QLCNIC_DRIVER_VERSION  ((_QLCNIC_LINUX_MAJOR << 16) |\
                 (_QLCNIC_LINUX_MINOR << 8) | (_QLCNIC_LINUX_SUBVERSION))
index cc228cf..89ddf7f 100644 (file)
@@ -155,7 +155,6 @@ qlcnic_get_settings(struct net_device *dev, struct ethtool_cmd *ecmd)
 {
        struct qlcnic_adapter *adapter = netdev_priv(dev);
        int check_sfp_module = 0;
-       u16 pcifn = adapter->ahw->pci_func;
 
        /* read which mode */
        if (adapter->ahw->port_type == QLCNIC_GBE) {
@@ -194,10 +193,8 @@ qlcnic_get_settings(struct net_device *dev, struct ethtool_cmd *ecmd)
                        goto skip;
                }
 
-               val = QLCRD32(adapter, P3P_LINK_SPEED_REG(pcifn));
-               ethtool_cmd_speed_set(ecmd, P3P_LINK_SPEED_MHZ *
-                                     P3P_LINK_SPEED_VAL(pcifn, val));
-               ecmd->duplex = DUPLEX_FULL;
+               ethtool_cmd_speed_set(ecmd, SPEED_UNKNOWN);
+               ecmd->duplex = DUPLEX_UNKNOWN;
                ecmd->autoneg = AUTONEG_DISABLE;
        } else
                return -EIO;
@@ -722,7 +719,7 @@ static int qlcnic_do_lb_test(struct qlcnic_adapter *adapter, u8 mode)
        int i, loop, cnt = 0;
 
        for (i = 0; i < QLCNIC_NUM_ILB_PKT; i++) {
-               skb = dev_alloc_skb(QLCNIC_ILB_PKT_SIZE);
+               skb = netdev_alloc_skb(adapter->netdev, QLCNIC_ILB_PKT_SIZE);
                qlcnic_create_loopback_buff(skb->data, adapter->mac_addr);
                skb_put(skb, QLCNIC_ILB_PKT_SIZE);
 
@@ -1155,7 +1152,6 @@ qlcnic_get_dump_data(struct net_device *netdev, struct ethtool_dump *dump,
 
        if (!fw_dump->clr) {
                netdev_info(netdev, "Dump not available\n");
-               qlcnic_api_unlock(adapter);
                return -EINVAL;
        }
        /* Copy template header first */
@@ -1174,7 +1170,7 @@ qlcnic_get_dump_data(struct net_device *netdev, struct ethtool_dump *dump,
        vfree(fw_dump->data);
        fw_dump->data = NULL;
        fw_dump->clr = 0;
-
+       netdev_info(netdev, "extracted the FW dump Successfully\n");
        return 0;
 }
 
@@ -1192,7 +1188,7 @@ qlcnic_set_dump(struct net_device *netdev, struct ethtool_dump *val)
                        return ret;
                }
                if (fw_dump->clr) {
-                       dev_info(&adapter->pdev->dev,
+                       netdev_info(netdev,
                        "Previous dump not cleared, not forcing dump\n");
                        return ret;
                }
index 3866958..d32cf0d 100644 (file)
@@ -1369,7 +1369,13 @@ qlcnic_handle_linkevent(struct qlcnic_adapter *adapter,
 
        adapter->module_type = module;
        adapter->link_autoneg = autoneg;
-       adapter->link_speed = link_speed;
+
+       if (link_status) {
+               adapter->link_speed = link_speed;
+       } else {
+               adapter->link_speed = SPEED_UNKNOWN;
+               adapter->link_duplex = DUPLEX_UNKNOWN;
+       }
 }
 
 static void
@@ -1434,7 +1440,7 @@ qlcnic_alloc_rx_skb(struct qlcnic_adapter *adapter,
        dma_addr_t dma;
        struct pci_dev *pdev = adapter->pdev;
 
-       skb = dev_alloc_skb(rds_ring->skb_size);
+       skb = netdev_alloc_skb(adapter->netdev, rds_ring->skb_size);
        if (!skb) {
                adapter->stats.skb_alloc_failure++;
                return -ENOMEM;
index 69b8e4e..81bb1a6 100644 (file)
@@ -301,7 +301,7 @@ static int qlcnic_set_mac(struct net_device *netdev, void *p)
                return -EOPNOTSUPP;
 
        if (!is_valid_ether_addr(addr->sa_data))
-               return -EINVAL;
+               return -EADDRNOTAVAIL;
 
        if (test_bit(__QLCNIC_DEV_UP, &adapter->state)) {
                netif_device_detach(netdev);
@@ -1576,7 +1576,6 @@ qlcnic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 
        netdev = alloc_etherdev(sizeof(struct qlcnic_adapter));
        if (!netdev) {
-               dev_err(&pdev->dev, "failed to allocate net_device\n");
                err = -ENOMEM;
                goto err_out_free_res;
        }
@@ -3000,8 +2999,18 @@ qlcnic_set_npar_non_operational(struct qlcnic_adapter *adapter)
 void
 qlcnic_dev_request_reset(struct qlcnic_adapter *adapter)
 {
-       u32 state;
-
+       u32 state, xg_val = 0, gb_val = 0;
+
+       qlcnic_xg_set_xg0_mask(xg_val);
+       qlcnic_xg_set_xg1_mask(xg_val);
+       QLCWR32(adapter, QLCNIC_NIU_XG_PAUSE_CTL, xg_val);
+       qlcnic_gb_set_gb0_mask(gb_val);
+       qlcnic_gb_set_gb1_mask(gb_val);
+       qlcnic_gb_set_gb2_mask(gb_val);
+       qlcnic_gb_set_gb3_mask(gb_val);
+       QLCWR32(adapter, QLCNIC_NIU_GB_PAUSE_CTL, gb_val);
+       dev_info(&adapter->pdev->dev, "Pause control frames disabled"
+                               " on all ports\n");
        adapter->need_fw_reset = 1;
        if (qlcnic_api_lock(adapter))
                return;
@@ -3150,7 +3159,7 @@ qlcnic_check_health(struct qlcnic_adapter *adapter)
                        QLCRD32(adapter, QLCNIC_CRB_PEG_NET_3 + 0x3c),
                        QLCRD32(adapter, QLCNIC_CRB_PEG_NET_4 + 0x3c));
        peg_status = QLCRD32(adapter, QLCNIC_PEG_HALT_STATUS1);
-       if (LSW(MSB(peg_status)) == 0x67)
+       if (QLCNIC_FWERROR_CODE(peg_status) == 0x67)
                dev_err(&adapter->pdev->dev,
                        "Firmware aborted with error code 0x00006700. "
                                "Device is being reset.\n");
index b8478aa..5a639df 100644 (file)
@@ -18,7 +18,7 @@
  */
 #define DRV_NAME       "qlge"
 #define DRV_STRING     "QLogic 10 Gigabit PCI-E Ethernet Driver "
-#define DRV_VERSION    "v1.00.00.29.00.00-01"
+#define DRV_VERSION    "v1.00.00.30.00.00-01"
 
 #define WQ_ADDR_ALIGN  0x3     /* 4 byte alignment */
 
index fca804f..58185b6 100644 (file)
@@ -1824,10 +1824,8 @@ void ql_dump_hw_cb(struct ql_adapter *qdev, int size, u32 bit, u16 q_id)
        pr_err("%s: Enter\n", __func__);
 
        ptr = kmalloc(size, GFP_ATOMIC);
-       if (ptr == NULL) {
-               pr_err("%s: Couldn't allocate a buffer\n", __func__);
+       if (ptr == NULL)
                return;
-       }
 
        if (ql_write_cfg(qdev, ptr, size, bit, q_id)) {
                pr_err("%s: Failed to upload control block!\n", __func__);
index b548987..49343ec 100644 (file)
@@ -375,13 +375,6 @@ static int ql_set_mac_addr_reg(struct ql_adapter *qdev, u8 *addr, u32 type,
                        u32 lower =
                            (addr[2] << 24) | (addr[3] << 16) | (addr[4] << 8) |
                            (addr[5]);
-
-                       netif_printk(qdev, ifup, KERN_DEBUG, qdev->ndev,
-                                    "Adding %s address %pM at index %d in the CAM.\n",
-                                    type == MAC_ADDR_TYPE_MULTI_MAC ?
-                                    "MULTICAST" : "UNICAST",
-                                    addr, index);
-
                        status =
                            ql_wait_reg_rdy(qdev,
                                MAC_ADDR_IDX, MAC_ADDR_MW, 0);
@@ -430,12 +423,6 @@ static int ql_set_mac_addr_reg(struct ql_adapter *qdev, u8 *addr, u32 type,
                         * addressing. It's either MAC_ADDR_E on or off.
                         * That's bit-27 we're talking about.
                         */
-                       netif_info(qdev, ifup, qdev->ndev,
-                                  "%s VLAN ID %d %s the CAM.\n",
-                                  enable_bit ? "Adding" : "Removing",
-                                  index,
-                                  enable_bit ? "to" : "from");
-
                        status =
                            ql_wait_reg_rdy(qdev,
                                MAC_ADDR_IDX, MAC_ADDR_MW, 0);
@@ -535,28 +522,6 @@ static int ql_set_routing_reg(struct ql_adapter *qdev, u32 index, u32 mask,
        int status = -EINVAL; /* Return error if no mask match. */
        u32 value = 0;
 
-       netif_printk(qdev, ifup, KERN_DEBUG, qdev->ndev,
-                    "%s %s mask %s the routing reg.\n",
-                    enable ? "Adding" : "Removing",
-                    index == RT_IDX_ALL_ERR_SLOT ? "MAC ERROR/ALL ERROR" :
-                    index == RT_IDX_IP_CSUM_ERR_SLOT ? "IP CSUM ERROR" :
-                    index == RT_IDX_TCP_UDP_CSUM_ERR_SLOT ? "TCP/UDP CSUM ERROR" :
-                    index == RT_IDX_BCAST_SLOT ? "BROADCAST" :
-                    index == RT_IDX_MCAST_MATCH_SLOT ? "MULTICAST MATCH" :
-                    index == RT_IDX_ALLMULTI_SLOT ? "ALL MULTICAST MATCH" :
-                    index == RT_IDX_UNUSED6_SLOT ? "UNUSED6" :
-                    index == RT_IDX_UNUSED7_SLOT ? "UNUSED7" :
-                    index == RT_IDX_RSS_MATCH_SLOT ? "RSS ALL/IPV4 MATCH" :
-                    index == RT_IDX_RSS_IPV6_SLOT ? "RSS IPV6" :
-                    index == RT_IDX_RSS_TCP4_SLOT ? "RSS TCP4" :
-                    index == RT_IDX_RSS_TCP6_SLOT ? "RSS TCP6" :
-                    index == RT_IDX_CAM_HIT_SLOT ? "CAM HIT" :
-                    index == RT_IDX_UNUSED013 ? "UNUSED13" :
-                    index == RT_IDX_UNUSED014 ? "UNUSED14" :
-                    index == RT_IDX_PROMISCUOUS_SLOT ? "PROMISCUOUS" :
-                    "(Bad index != RT_IDX)",
-                    enable ? "to" : "from");
-
        switch (mask) {
        case RT_IDX_CAM_HIT:
                {
@@ -1178,14 +1143,16 @@ static void ql_update_lbq(struct ql_adapter *qdev, struct rx_ring *rx_ring)
        int i;
 
        while (rx_ring->lbq_free_cnt > 32) {
-               for (i = 0; i < 16; i++) {
+               for (i = (rx_ring->lbq_clean_idx % 16); i < 16; i++) {
                        netif_printk(qdev, rx_status, KERN_DEBUG, qdev->ndev,
                                     "lbq: try cleaning clean_idx = %d.\n",
                                     clean_idx);
                        lbq_desc = &rx_ring->lbq[clean_idx];
                        if (ql_get_next_chunk(qdev, rx_ring, lbq_desc)) {
+                               rx_ring->lbq_clean_idx = clean_idx;
                                netif_err(qdev, ifup, qdev->ndev,
-                                         "Could not get a page chunk.\n");
+                                               "Could not get a page chunk, i=%d, clean_idx =%d .\n",
+                                               i, clean_idx);
                                return;
                        }
 
@@ -1230,7 +1197,7 @@ static void ql_update_sbq(struct ql_adapter *qdev, struct rx_ring *rx_ring)
        int i;
 
        while (rx_ring->sbq_free_cnt > 16) {
-               for (i = 0; i < 16; i++) {
+               for (i = (rx_ring->sbq_clean_idx % 16); i < 16; i++) {
                        sbq_desc = &rx_ring->sbq[clean_idx];
                        netif_printk(qdev, rx_status, KERN_DEBUG, qdev->ndev,
                                     "sbq: try cleaning clean_idx = %d.\n",
@@ -1576,13 +1543,14 @@ static void ql_process_mac_rx_page(struct ql_adapter *qdev,
                } else if ((ib_mac_rsp->flags2 & IB_MAC_IOCB_RSP_U) &&
                                (ib_mac_rsp->flags3 & IB_MAC_IOCB_RSP_V4)) {
                        /* Unfragmented ipv4 UDP frame. */
-                       struct iphdr *iph = (struct iphdr *) skb->data;
+                       struct iphdr *iph =
+                               (struct iphdr *) ((u8 *)addr + ETH_HLEN);
                        if (!(iph->frag_off &
                                cpu_to_be16(IP_MF|IP_OFFSET))) {
                                skb->ip_summed = CHECKSUM_UNNECESSARY;
                                netif_printk(qdev, rx_status, KERN_DEBUG,
                                             qdev->ndev,
-                                            "TCP checksum done!\n");
+                                            "UDP checksum done!\n");
                        }
                }
        }
@@ -1690,7 +1658,7 @@ static void ql_process_mac_rx_skb(struct ql_adapter *qdev,
                                skb->ip_summed = CHECKSUM_UNNECESSARY;
                                netif_printk(qdev, rx_status, KERN_DEBUG,
                                             qdev->ndev,
-                                            "TCP checksum done!\n");
+                                            "UDP checksum done!\n");
                        }
                }
        }
@@ -2312,13 +2280,9 @@ static void qlge_vlan_mode(struct net_device *ndev, netdev_features_t features)
        struct ql_adapter *qdev = netdev_priv(ndev);
 
        if (features & NETIF_F_HW_VLAN_RX) {
-               netif_printk(qdev, ifup, KERN_DEBUG, ndev,
-                            "Turning on VLAN in NIC_RCV_CFG.\n");
                ql_write32(qdev, NIC_RCV_CFG, NIC_RCV_CFG_VLAN_MASK |
                                 NIC_RCV_CFG_VLAN_MATCH_AND_NON);
        } else {
-               netif_printk(qdev, ifup, KERN_DEBUG, ndev,
-                            "Turning off VLAN in NIC_RCV_CFG.\n");
                ql_write32(qdev, NIC_RCV_CFG, NIC_RCV_CFG_VLAN_MASK);
        }
 }
@@ -3183,8 +3147,6 @@ static int ql_start_rx_ring(struct ql_adapter *qdev, struct rx_ring *rx_ring)
                netif_printk(qdev, ifup, KERN_DEBUG, qdev->ndev,
                             "Invalid rx_ring->type = %d.\n", rx_ring->type);
        }
-       netif_printk(qdev, ifup, KERN_DEBUG, qdev->ndev,
-                    "Initializing rx work queue.\n");
        err = ql_write_cfg(qdev, cqicb, sizeof(struct cqicb),
                           CFG_LCQ, rx_ring->cq_id);
        if (err) {
@@ -3237,8 +3199,6 @@ static int ql_start_tx_ring(struct ql_adapter *qdev, struct tx_ring *tx_ring)
                netif_err(qdev, ifup, qdev->ndev, "Failed to load tx_ring.\n");
                return err;
        }
-       netif_printk(qdev, ifup, KERN_DEBUG, qdev->ndev,
-                    "Successfully loaded WQICB.\n");
        return err;
 }
 
@@ -3488,12 +3448,8 @@ static void ql_free_irq(struct ql_adapter *qdev)
                        if (test_bit(QL_MSIX_ENABLED, &qdev->flags)) {
                                free_irq(qdev->msi_x_entry[i].vector,
                                         &qdev->rx_ring[i]);
-                               netif_printk(qdev, ifdown, KERN_DEBUG, qdev->ndev,
-                                            "freeing msix interrupt %d.\n", i);
                        } else {
                                free_irq(qdev->pdev->irq, &qdev->rx_ring[0]);
-                               netif_printk(qdev, ifdown, KERN_DEBUG, qdev->ndev,
-                                            "freeing msi interrupt %d.\n", i);
                        }
                }
        }
@@ -3522,17 +3478,6 @@ static int ql_request_irq(struct ql_adapter *qdev)
                                          "Failed request for MSIX interrupt %d.\n",
                                          i);
                                goto err_irq;
-                       } else {
-                               netif_printk(qdev, ifup, KERN_DEBUG, qdev->ndev,
-                                            "Hooked intr %d, queue type %s, with name %s.\n",
-                                            i,
-                                            qdev->rx_ring[i].type == DEFAULT_Q ?
-                                            "DEFAULT_Q" :
-                                            qdev->rx_ring[i].type == TX_Q ?
-                                            "TX_Q" :
-                                            qdev->rx_ring[i].type == RX_Q ?
-                                            "RX_Q" : "",
-                                            intr_context->name);
                        }
                } else {
                        netif_printk(qdev, ifup, KERN_DEBUG, qdev->ndev,
@@ -3602,15 +3547,11 @@ static int ql_start_rss(struct ql_adapter *qdev)
        memcpy((void *)&ricb->ipv6_hash_key[0], init_hash_seed, 40);
        memcpy((void *)&ricb->ipv4_hash_key[0], init_hash_seed, 16);
 
-       netif_printk(qdev, ifup, KERN_DEBUG, qdev->ndev, "Initializing RSS.\n");
-
        status = ql_write_cfg(qdev, ricb, sizeof(*ricb), CFG_LR, 0);
        if (status) {
                netif_err(qdev, ifup, qdev->ndev, "Failed to load RICB.\n");
                return status;
        }
-       netif_printk(qdev, ifup, KERN_DEBUG, qdev->ndev,
-                    "Successfully loaded RICB.\n");
        return status;
 }
 
@@ -3817,11 +3758,8 @@ static int ql_adapter_initialize(struct ql_adapter *qdev)
        }
 
        /* Start NAPI for the RSS queues. */
-       for (i = 0; i < qdev->rss_ring_count; i++) {
-               netif_printk(qdev, ifup, KERN_DEBUG, qdev->ndev,
-                            "Enabling NAPI for rx_ring[%d].\n", i);
+       for (i = 0; i < qdev->rss_ring_count; i++)
                napi_enable(&qdev->rx_ring[i].napi);
-       }
 
        return status;
 }
@@ -4121,10 +4059,6 @@ static int ql_configure_rings(struct ql_adapter *qdev)
                        rx_ring->lbq_size =
                            rx_ring->lbq_len * sizeof(__le64);
                        rx_ring->lbq_buf_size = (u16)lbq_buf_len;
-                       netif_printk(qdev, ifup, KERN_DEBUG, qdev->ndev,
-                                    "lbq_buf_size %d, order = %d\n",
-                                    rx_ring->lbq_buf_size,
-                                    qdev->lbq_buf_order);
                        rx_ring->sbq_len = NUM_SMALL_BUFFERS;
                        rx_ring->sbq_size =
                            rx_ring->sbq_len * sizeof(__le64);
index 072810d..8079822 100644 (file)
@@ -552,7 +552,7 @@ static void ni5010_rx(struct net_device *dev)
        }
 
        /* Malloc up new buffer. */
-       skb = dev_alloc_skb(i_pkt_size + 3);
+       skb = netdev_alloc_skb(dev, i_pkt_size + 3);
        if (skb == NULL) {
                printk(KERN_WARNING "%s: Memory squeeze, dropping packet.\n", dev->name);
                dev->stats.rx_dropped++;
index cb0eca8..b96e192 100644 (file)
@@ -1107,7 +1107,6 @@ static int __devinit r6040_init_one(struct pci_dev *pdev,
 
        dev = alloc_etherdev(sizeof(struct r6040_private));
        if (!dev) {
-               dev_err(&pdev->dev, "Failed to allocate etherdev\n");
                err = -ENOMEM;
                goto err_out;
        }
@@ -1152,7 +1151,7 @@ static int __devinit r6040_init_one(struct pci_dev *pdev,
        if (!(adrp[0] || adrp[1] || adrp[2])) {
                netdev_warn(dev, "MAC address not initialized, "
                                        "generating random\n");
-               random_ether_addr(dev->dev_addr);
+               eth_hw_addr_random(dev);
        }
 
        /* Link new device into r6040_root_dev */
index a8779be..abd6aca 100644 (file)
@@ -754,10 +754,9 @@ static __devinit struct net_device * rtl8139_init_board (struct pci_dev *pdev)
 
        /* dev and priv zeroed in alloc_etherdev */
        dev = alloc_etherdev (sizeof (*tp));
-       if (dev == NULL) {
-               dev_err(&pdev->dev, "Unable to alloc new net device\n");
+       if (dev == NULL)
                return ERR_PTR(-ENOMEM);
-       }
+
        SET_NETDEV_DEV(dev, &pdev->dev);
 
        tp = netdev_priv(dev);
@@ -908,6 +907,33 @@ err_out:
        return ERR_PTR(rc);
 }
 
+static int rtl8139_set_features(struct net_device *dev, netdev_features_t features)
+{
+       struct rtl8139_private *tp = netdev_priv(dev);
+       unsigned long flags;
+       netdev_features_t changed = features ^ dev->features;
+       void __iomem *ioaddr = tp->mmio_addr;
+
+       if (!(changed & (NETIF_F_RXALL)))
+               return 0;
+
+       spin_lock_irqsave(&tp->lock, flags);
+
+       if (changed & NETIF_F_RXALL) {
+               int rx_mode = tp->rx_config;
+               if (features & NETIF_F_RXALL)
+                       rx_mode |= (AcceptErr | AcceptRunt);
+               else
+                       rx_mode &= ~(AcceptErr | AcceptRunt);
+               tp->rx_config = rtl8139_rx_config | rx_mode;
+               RTL_W32_F(RxConfig, tp->rx_config);
+       }
+
+       spin_unlock_irqrestore(&tp->lock, flags);
+
+       return 0;
+}
+
 static const struct net_device_ops rtl8139_netdev_ops = {
        .ndo_open               = rtl8139_open,
        .ndo_stop               = rtl8139_close,
@@ -922,6 +948,7 @@ static const struct net_device_ops rtl8139_netdev_ops = {
 #ifdef CONFIG_NET_POLL_CONTROLLER
        .ndo_poll_controller    = rtl8139_poll_controller,
 #endif
+       .ndo_set_features       = rtl8139_set_features,
 };
 
 static int __devinit rtl8139_init_one (struct pci_dev *pdev,
@@ -995,6 +1022,9 @@ static int __devinit rtl8139_init_one (struct pci_dev *pdev,
        dev->features |= NETIF_F_SG | NETIF_F_HW_CSUM | NETIF_F_HIGHDMA;
        dev->vlan_features = dev->features;
 
+       dev->hw_features |= NETIF_F_RXALL;
+       dev->hw_features |= NETIF_F_RXFCS;
+
        dev->irq = pdev->irq;
 
        /* tp zeroed and aligned in alloc_etherdev */
@@ -1941,7 +1971,10 @@ static int rtl8139_rx(struct net_device *dev, struct rtl8139_private *tp,
                /* read size+status of next frame from DMA ring buffer */
                rx_status = le32_to_cpu (*(__le32 *) (rx_ring + ring_offset));
                rx_size = rx_status >> 16;
-               pkt_size = rx_size - 4;
+               if (likely(!(dev->features & NETIF_F_RXFCS)))
+                       pkt_size = rx_size - 4;
+               else
+                       pkt_size = rx_size;
 
                netif_dbg(tp, rx_status, dev, "%s() status %04x, size %04x, cur %04x\n",
                          __func__, rx_status, rx_size, cur_rx);
@@ -1979,11 +2012,30 @@ no_early_rx:
                if (unlikely((rx_size > (MAX_ETH_FRAME_SIZE+4)) ||
                             (rx_size < 8) ||
                             (!(rx_status & RxStatusOK)))) {
+                       if ((dev->features & NETIF_F_RXALL) &&
+                           (rx_size <= (MAX_ETH_FRAME_SIZE + 4)) &&
+                           (rx_size >= 8) &&
+                           (!(rx_status & RxStatusOK))) {
+                               /* Length is at least mostly OK, but pkt has
+                                * error.  I'm hoping we can handle some of these
+                                * errors without resetting the chip. --Ben
+                                */
+                               dev->stats.rx_errors++;
+                               if (rx_status & RxCRCErr) {
+                                       dev->stats.rx_crc_errors++;
+                                       goto keep_pkt;
+                               }
+                               if (rx_status & RxRunt) {
+                                       dev->stats.rx_length_errors++;
+                                       goto keep_pkt;
+                               }
+                       }
                        rtl8139_rx_err (rx_status, dev, tp, ioaddr);
                        received = -1;
                        goto out;
                }
 
+keep_pkt:
                /* Malloc up new buffer, compatible with net-2e. */
                /* Omit the four octet CRC from the length. */
 
@@ -2516,6 +2568,9 @@ static void __set_rx_mode (struct net_device *dev)
                }
        }
 
+       if (dev->features & NETIF_F_RXALL)
+               rx_mode |= (AcceptErr | AcceptRunt);
+
        /* We can safely update without stopping the chip. */
        tmp = rtl8139_rx_config | rx_mode;
        if (tp->rx_config != tmp) {
index 0578859..5821966 100644 (file)
@@ -24,11 +24,11 @@ config ATP
        select CRC32
        ---help---
          This is a network (Ethernet) device which attaches to your parallel
-         port. Read <file:drivers/net/atp.c> as well as the Ethernet-HOWTO,
-         available from <http://www.tldp.org/docs.html#howto>, if you
-         want to use this.  If you intend to use this driver, you should have
-         said N to the "Parallel printer support", because the two drivers
-         don't like each other.
+         port. Read <file:drivers/net/ethernet/realtek/atp.c> as well as the
+         Ethernet-HOWTO, available from <http://www.tldp.org/docs.html#howto>,
+         if you want to use this.  If you intend to use this driver, you
+         should have said N to the "Parallel printer support", because the two
+         drivers don't like each other.
 
          To compile this driver as a module, choose M here: the module
          will be called atp.
index e3f57fd..46c1932 100644 (file)
@@ -783,7 +783,7 @@ static void net_rx(struct net_device *dev)
                int pkt_len = (rx_head.rx_count & 0x7ff) - 4;
                struct sk_buff *skb;
 
-               skb = dev_alloc_skb(pkt_len + 2);
+               skb = netdev_alloc_skb(dev, pkt_len + 2);
                if (skb == NULL) {
                        printk(KERN_ERR "%s: Memory squeeze, dropping packet.\n",
                                   dev->name);
index 1adf177..817302c 100644 (file)
@@ -667,12 +667,25 @@ struct rtl8169_counters {
        __le16  tx_underun;
 };
 
+enum rtl_flag {
+       RTL_FLAG_TASK_ENABLED,
+       RTL_FLAG_TASK_SLOW_PENDING,
+       RTL_FLAG_TASK_RESET_PENDING,
+       RTL_FLAG_TASK_PHY_PENDING,
+       RTL_FLAG_MAX
+};
+
+struct rtl8169_stats {
+       u64                     packets;
+       u64                     bytes;
+       struct u64_stats_sync   syncp;
+};
+
 struct rtl8169_private {
        void __iomem *mmio_addr;        /* memory map physical address */
        struct pci_dev *pci_dev;
        struct net_device *dev;
        struct napi_struct napi;
-       spinlock_t lock;
        u32 msg_enable;
        u16 txd_version;
        u16 mac_version;
@@ -680,6 +693,8 @@ struct rtl8169_private {
        u32 cur_tx; /* Index into the Tx descriptor buffer of next Rx pkt. */
        u32 dirty_rx;
        u32 dirty_tx;
+       struct rtl8169_stats rx_stats;
+       struct rtl8169_stats tx_stats;
        struct TxDesc *TxDescArray;     /* 256-aligned Tx descriptor ring */
        struct RxDesc *RxDescArray;     /* 256-aligned Rx descriptor ring */
        dma_addr_t TxPhyAddr;
@@ -688,9 +703,8 @@ struct rtl8169_private {
        struct ring_info tx_skb[NUM_TX_DESC];   /* Tx data buffers */
        struct timer_list timer;
        u16 cp_cmd;
-       u16 intr_event;
-       u16 napi_event;
-       u16 intr_mask;
+
+       u16 event_slow;
 
        struct mdio_ops {
                void (*write)(void __iomem *, int, int);
@@ -714,7 +728,13 @@ struct rtl8169_private {
        unsigned int (*phy_reset_pending)(struct rtl8169_private *tp);
        unsigned int (*link_ok)(void __iomem *);
        int (*do_ioctl)(struct rtl8169_private *tp, struct mii_ioctl_data *data, int cmd);
-       struct delayed_work task;
+
+       struct {
+               DECLARE_BITMAP(flags, RTL_FLAG_MAX);
+               struct mutex mutex;
+               struct work_struct work;
+       } wk;
+
        unsigned features;
 
        struct mii_if_info mii;
@@ -763,14 +783,23 @@ static void rtl_hw_start(struct net_device *dev);
 static int rtl8169_close(struct net_device *dev);
 static void rtl_set_rx_mode(struct net_device *dev);
 static void rtl8169_tx_timeout(struct net_device *dev);
-static struct net_device_stats *rtl8169_get_stats(struct net_device *dev);
-static int rtl8169_rx_interrupt(struct net_device *, struct rtl8169_private *,
-                               void __iomem *, u32 budget);
+static struct rtnl_link_stats64 *rtl8169_get_stats64(struct net_device *dev,
+                                                   struct rtnl_link_stats64
+                                                   *stats);
 static int rtl8169_change_mtu(struct net_device *dev, int new_mtu);
-static void rtl8169_down(struct net_device *dev);
 static void rtl8169_rx_clear(struct rtl8169_private *tp);
 static int rtl8169_poll(struct napi_struct *napi, int budget);
 
+static void rtl_lock_work(struct rtl8169_private *tp)
+{
+       mutex_lock(&tp->wk.mutex);
+}
+
+static void rtl_unlock_work(struct rtl8169_private *tp)
+{
+       mutex_unlock(&tp->wk.mutex);
+}
+
 static void rtl_tx_performance_tweak(struct pci_dev *pdev, u16 force)
 {
        int cap = pci_pcie_cap(pdev);
@@ -1180,12 +1209,51 @@ static u8 rtl8168d_efuse_read(void __iomem *ioaddr, int reg_addr)
        return value;
 }
 
+static u16 rtl_get_events(struct rtl8169_private *tp)
+{
+       void __iomem *ioaddr = tp->mmio_addr;
+
+       return RTL_R16(IntrStatus);
+}
+
+static void rtl_ack_events(struct rtl8169_private *tp, u16 bits)
+{
+       void __iomem *ioaddr = tp->mmio_addr;
+
+       RTL_W16(IntrStatus, bits);
+       mmiowb();
+}
+
+static void rtl_irq_disable(struct rtl8169_private *tp)
+{
+       void __iomem *ioaddr = tp->mmio_addr;
+
+       RTL_W16(IntrMask, 0);
+       mmiowb();
+}
+
+static void rtl_irq_enable(struct rtl8169_private *tp, u16 bits)
+{
+       void __iomem *ioaddr = tp->mmio_addr;
+
+       RTL_W16(IntrMask, bits);
+}
+
+#define RTL_EVENT_NAPI_RX      (RxOK | RxErr)
+#define RTL_EVENT_NAPI_TX      (TxOK | TxErr)
+#define RTL_EVENT_NAPI         (RTL_EVENT_NAPI_RX | RTL_EVENT_NAPI_TX)
+
+static void rtl_irq_enable_all(struct rtl8169_private *tp)
+{
+       rtl_irq_enable(tp, RTL_EVENT_NAPI | tp->event_slow);
+}
+
 static void rtl8169_irq_mask_and_ack(struct rtl8169_private *tp)
 {
        void __iomem *ioaddr = tp->mmio_addr;
 
-       RTL_W16(IntrMask, 0x0000);
-       RTL_W16(IntrStatus, tp->intr_event);
+       rtl_irq_disable(tp);
+       rtl_ack_events(tp, RTL_EVENT_NAPI | tp->event_slow);
        RTL_R8(ChipCmd);
 }
 
@@ -1276,9 +1344,6 @@ static void __rtl8169_check_link_status(struct net_device *dev,
                                        struct rtl8169_private *tp,
                                        void __iomem *ioaddr, bool pm)
 {
-       unsigned long flags;
-
-       spin_lock_irqsave(&tp->lock, flags);
        if (tp->link_ok(ioaddr)) {
                rtl_link_chg_patch(tp);
                /* This is to cancel a scheduled suspend if there's one. */
@@ -1293,7 +1358,6 @@ static void __rtl8169_check_link_status(struct net_device *dev,
                if (pm)
                        pm_schedule_suspend(&tp->pci_dev->dev, 5000);
        }
-       spin_unlock_irqrestore(&tp->lock, flags);
 }
 
 static void rtl8169_check_link_status(struct net_device *dev,
@@ -1336,12 +1400,12 @@ static void rtl8169_get_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
 {
        struct rtl8169_private *tp = netdev_priv(dev);
 
-       spin_lock_irq(&tp->lock);
+       rtl_lock_work(tp);
 
        wol->supported = WAKE_ANY;
        wol->wolopts = __rtl8169_get_wol(tp);
 
-       spin_unlock_irq(&tp->lock);
+       rtl_unlock_work(tp);
 }
 
 static void __rtl8169_set_wol(struct rtl8169_private *tp, u32 wolopts)
@@ -1378,14 +1442,15 @@ static int rtl8169_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
 {
        struct rtl8169_private *tp = netdev_priv(dev);
 
-       spin_lock_irq(&tp->lock);
+       rtl_lock_work(tp);
 
        if (wol->wolopts)
                tp->features |= RTL_FEATURE_WOL;
        else
                tp->features &= ~RTL_FEATURE_WOL;
        __rtl8169_set_wol(tp, wol->wolopts);
-       spin_unlock_irq(&tp->lock);
+
+       rtl_unlock_work(tp);
 
        device_set_wakeup_enable(&tp->pci_dev->dev, wol->wolopts);
 
@@ -1540,15 +1605,14 @@ out:
 static int rtl8169_set_settings(struct net_device *dev, struct ethtool_cmd *cmd)
 {
        struct rtl8169_private *tp = netdev_priv(dev);
-       unsigned long flags;
        int ret;
 
        del_timer_sync(&tp->timer);
 
-       spin_lock_irqsave(&tp->lock, flags);
+       rtl_lock_work(tp);
        ret = rtl8169_set_speed(dev, cmd->autoneg, ethtool_cmd_speed(cmd),
                                cmd->duplex, cmd->advertising);
-       spin_unlock_irqrestore(&tp->lock, flags);
+       rtl_unlock_work(tp);
 
        return ret;
 }
@@ -1568,33 +1632,51 @@ static netdev_features_t rtl8169_fix_features(struct net_device *dev,
        return features;
 }
 
-static int rtl8169_set_features(struct net_device *dev,
-       netdev_features_t features)
+static void __rtl8169_set_features(struct net_device *dev,
+                                  netdev_features_t features)
 {
        struct rtl8169_private *tp = netdev_priv(dev);
+       netdev_features_t changed = features ^ dev->features;
        void __iomem *ioaddr = tp->mmio_addr;
-       unsigned long flags;
 
-       spin_lock_irqsave(&tp->lock, flags);
+       if (!(changed & (NETIF_F_RXALL | NETIF_F_RXCSUM | NETIF_F_HW_VLAN_RX)))
+               return;
+
+       if (changed & (NETIF_F_RXCSUM | NETIF_F_HW_VLAN_RX)) {
+               if (features & NETIF_F_RXCSUM)
+                       tp->cp_cmd |= RxChkSum;
+               else
+                       tp->cp_cmd &= ~RxChkSum;
 
-       if (features & NETIF_F_RXCSUM)
-               tp->cp_cmd |= RxChkSum;
-       else
-               tp->cp_cmd &= ~RxChkSum;
+               if (dev->features & NETIF_F_HW_VLAN_RX)
+                       tp->cp_cmd |= RxVlan;
+               else
+                       tp->cp_cmd &= ~RxVlan;
 
-       if (dev->features & NETIF_F_HW_VLAN_RX)
-               tp->cp_cmd |= RxVlan;
-       else
-               tp->cp_cmd &= ~RxVlan;
+               RTL_W16(CPlusCmd, tp->cp_cmd);
+               RTL_R16(CPlusCmd);
+       }
+       if (changed & NETIF_F_RXALL) {
+               int tmp = (RTL_R32(RxConfig) & ~(AcceptErr | AcceptRunt));
+               if (features & NETIF_F_RXALL)
+                       tmp |= (AcceptErr | AcceptRunt);
+               RTL_W32(RxConfig, tmp);
+       }
+}
 
-       RTL_W16(CPlusCmd, tp->cp_cmd);
-       RTL_R16(CPlusCmd);
+static int rtl8169_set_features(struct net_device *dev,
+                               netdev_features_t features)
+{
+       struct rtl8169_private *tp = netdev_priv(dev);
 
-       spin_unlock_irqrestore(&tp->lock, flags);
+       rtl_lock_work(tp);
+       __rtl8169_set_features(dev, features);
+       rtl_unlock_work(tp);
 
        return 0;
 }
 
+
 static inline u32 rtl8169_tx_vlan_tag(struct rtl8169_private *tp,
                                      struct sk_buff *skb)
 {
@@ -1643,14 +1725,12 @@ static int rtl8169_gset_xmii(struct net_device *dev, struct ethtool_cmd *cmd)
 static int rtl8169_get_settings(struct net_device *dev, struct ethtool_cmd *cmd)
 {
        struct rtl8169_private *tp = netdev_priv(dev);
-       unsigned long flags;
        int rc;
 
-       spin_lock_irqsave(&tp->lock, flags);
-
+       rtl_lock_work(tp);
        rc = tp->get_settings(dev, cmd);
+       rtl_unlock_work(tp);
 
-       spin_unlock_irqrestore(&tp->lock, flags);
        return rc;
 }
 
@@ -1658,14 +1738,13 @@ static void rtl8169_get_regs(struct net_device *dev, struct ethtool_regs *regs,
                             void *p)
 {
        struct rtl8169_private *tp = netdev_priv(dev);
-       unsigned long flags;
 
        if (regs->len > R8169_REGS_SIZE)
                regs->len = R8169_REGS_SIZE;
 
-       spin_lock_irqsave(&tp->lock, flags);
+       rtl_lock_work(tp);
        memcpy_fromio(p, tp->mmio_addr, regs->len);
-       spin_unlock_irqrestore(&tp->lock, flags);
+       rtl_unlock_work(tp);
 }
 
 static u32 rtl8169_get_msglevel(struct net_device *dev)
@@ -3182,18 +3261,14 @@ static void rtl_hw_phy_config(struct net_device *dev)
        }
 }
 
-static void rtl8169_phy_timer(unsigned long __opaque)
+static void rtl_phy_work(struct rtl8169_private *tp)
 {
-       struct net_device *dev = (struct net_device *)__opaque;
-       struct rtl8169_private *tp = netdev_priv(dev);
        struct timer_list *timer = &tp->timer;
        void __iomem *ioaddr = tp->mmio_addr;
        unsigned long timeout = RTL8169_PHY_TIMEOUT;
 
        assert(tp->mac_version > RTL_GIGA_MAC_VER_01);
 
-       spin_lock_irq(&tp->lock);
-
        if (tp->phy_reset_pending(tp)) {
                /*
                 * A busy loop could burn quite a few cycles on nowadays CPU.
@@ -3204,32 +3279,36 @@ static void rtl8169_phy_timer(unsigned long __opaque)
        }
 
        if (tp->link_ok(ioaddr))
-               goto out_unlock;
+               return;
 
-       netif_warn(tp, link, dev, "PHY reset until link up\n");
+       netif_warn(tp, link, tp->dev, "PHY reset until link up\n");
 
        tp->phy_reset_enable(tp);
 
 out_mod_timer:
        mod_timer(timer, jiffies + timeout);
-out_unlock:
-       spin_unlock_irq(&tp->lock);
+}
+
+static void rtl_schedule_task(struct rtl8169_private *tp, enum rtl_flag flag)
+{
+       if (!test_and_set_bit(flag, tp->wk.flags))
+               schedule_work(&tp->wk.work);
+}
+
+static void rtl8169_phy_timer(unsigned long __opaque)
+{
+       struct net_device *dev = (struct net_device *)__opaque;
+       struct rtl8169_private *tp = netdev_priv(dev);
+
+       rtl_schedule_task(tp, RTL_FLAG_TASK_PHY_PENDING);
 }
 
 #ifdef CONFIG_NET_POLL_CONTROLLER
-/*
- * Polling 'interrupt' - used by things like netconsole to send skbs
- * without having to re-enable interrupts. It's not called while
- * the interrupt routine is executing.
- */
 static void rtl8169_netpoll(struct net_device *dev)
 {
        struct rtl8169_private *tp = netdev_priv(dev);
-       struct pci_dev *pdev = tp->pci_dev;
 
-       disable_irq(pdev->irq);
-       rtl8169_interrupt(pdev->irq, dev);
-       enable_irq(pdev->irq);
+       rtl8169_interrupt(tp->pci_dev->irq, dev);
 }
 #endif
 
@@ -3310,7 +3389,7 @@ static void rtl_rar_set(struct rtl8169_private *tp, u8 *addr)
        low  = addr[0] | (addr[1] << 8) | (addr[2] << 16) | (addr[3] << 24);
        high = addr[4] | (addr[5] << 8);
 
-       spin_lock_irq(&tp->lock);
+       rtl_lock_work(tp);
 
        RTL_W8(Cfg9346, Cfg9346_Unlock);
 
@@ -3334,7 +3413,7 @@ static void rtl_rar_set(struct rtl8169_private *tp, u8 *addr)
 
        RTL_W8(Cfg9346, Cfg9346_Lock);
 
-       spin_unlock_irq(&tp->lock);
+       rtl_unlock_work(tp);
 }
 
 static int rtl_set_mac_address(struct net_device *dev, void *p)
@@ -3388,8 +3467,7 @@ static const struct rtl_cfg_info {
        void (*hw_start)(struct net_device *);
        unsigned int region;
        unsigned int align;
-       u16 intr_event;
-       u16 napi_event;
+       u16 event_slow;
        unsigned features;
        u8 default_ver;
 } rtl_cfg_infos [] = {
@@ -3397,9 +3475,7 @@ static const struct rtl_cfg_info {
                .hw_start       = rtl_hw_start_8169,
                .region         = 1,
                .align          = 0,
-               .intr_event     = SYSErr | LinkChg | RxOverflow |
-                                 RxFIFOOver | TxErr | TxOK | RxOK | RxErr,
-               .napi_event     = RxFIFOOver | TxErr | TxOK | RxOK | RxOverflow,
+               .event_slow     = SYSErr | LinkChg | RxOverflow | RxFIFOOver,
                .features       = RTL_FEATURE_GMII,
                .default_ver    = RTL_GIGA_MAC_VER_01,
        },
@@ -3407,9 +3483,7 @@ static const struct rtl_cfg_info {
                .hw_start       = rtl_hw_start_8168,
                .region         = 2,
                .align          = 8,
-               .intr_event     = SYSErr | LinkChg | RxOverflow |
-                                 TxErr | TxOK | RxOK | RxErr,
-               .napi_event     = TxErr | TxOK | RxOK | RxOverflow,
+               .event_slow     = SYSErr | LinkChg | RxOverflow,
                .features       = RTL_FEATURE_GMII | RTL_FEATURE_MSI,
                .default_ver    = RTL_GIGA_MAC_VER_11,
        },
@@ -3417,9 +3491,8 @@ static const struct rtl_cfg_info {
                .hw_start       = rtl_hw_start_8101,
                .region         = 2,
                .align          = 8,
-               .intr_event     = SYSErr | LinkChg | RxOverflow | PCSTimeout |
-                                 RxFIFOOver | TxErr | TxOK | RxOK | RxErr,
-               .napi_event     = RxFIFOOver | TxErr | TxOK | RxOK | RxOverflow,
+               .event_slow     = SYSErr | LinkChg | RxOverflow | RxFIFOOver |
+                                 PCSTimeout,
                .features       = RTL_FEATURE_MSI,
                .default_ver    = RTL_GIGA_MAC_VER_13,
        }
@@ -3458,7 +3531,7 @@ static void rtl_disable_msi(struct pci_dev *pdev, struct rtl8169_private *tp)
 static const struct net_device_ops rtl8169_netdev_ops = {
        .ndo_open               = rtl8169_open,
        .ndo_stop               = rtl8169_close,
-       .ndo_get_stats          = rtl8169_get_stats,
+       .ndo_get_stats64        = rtl8169_get_stats64,
        .ndo_start_xmit         = rtl8169_start_xmit,
        .ndo_tx_timeout         = rtl8169_tx_timeout,
        .ndo_validate_addr      = eth_validate_addr,
@@ -3832,23 +3905,21 @@ static void r8168dp_hw_jumbo_disable(struct rtl8169_private *tp)
 static void r8168e_hw_jumbo_enable(struct rtl8169_private *tp)
 {
        void __iomem *ioaddr = tp->mmio_addr;
-       struct pci_dev *pdev = tp->pci_dev;
 
        RTL_W8(MaxTxPacketSize, 0x3f);
        RTL_W8(Config3, RTL_R8(Config3) | Jumbo_En0);
        RTL_W8(Config4, RTL_R8(Config4) | 0x01);
-       pci_write_config_byte(pdev, 0x79, 0x20);
+       rtl_tx_performance_tweak(tp->pci_dev, 0x2 << MAX_READ_REQUEST_SHIFT);
 }
 
 static void r8168e_hw_jumbo_disable(struct rtl8169_private *tp)
 {
        void __iomem *ioaddr = tp->mmio_addr;
-       struct pci_dev *pdev = tp->pci_dev;
 
        RTL_W8(MaxTxPacketSize, 0x0c);
        RTL_W8(Config3, RTL_R8(Config3) & ~Jumbo_En0);
        RTL_W8(Config4, RTL_R8(Config4) & ~0x01);
-       pci_write_config_byte(pdev, 0x79, 0x50);
+       rtl_tx_performance_tweak(tp->pci_dev, 0x5 << MAX_READ_REQUEST_SHIFT);
 }
 
 static void r8168b_0_hw_jumbo_enable(struct rtl8169_private *tp)
@@ -3966,8 +4037,6 @@ rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
 
        dev = alloc_etherdev(sizeof (*tp));
        if (!dev) {
-               if (netif_msg_drv(&debug))
-                       dev_err(&pdev->dev, "unable to alloc new ethernet\n");
                rc = -ENOMEM;
                goto out;
        }
@@ -4056,11 +4125,11 @@ rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
 
        rtl_init_rxcfg(tp);
 
-       RTL_W16(IntrMask, 0x0000);
+       rtl_irq_disable(tp);
 
        rtl_hw_reset(tp);
 
-       RTL_W16(IntrStatus, 0xffff);
+       rtl_ack_events(tp, 0xffff);
 
        pci_set_master(pdev);
 
@@ -4106,7 +4175,7 @@ rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
                tp->do_ioctl = rtl_xmii_ioctl;
        }
 
-       spin_lock_init(&tp->lock);
+       mutex_init(&tp->wk.mutex);
 
        /* Get MAC address */
        for (i = 0; i < ETH_ALEN; i++)
@@ -4134,10 +4203,11 @@ rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
                /* 8110SCd requires hardware Rx VLAN - disallow toggling */
                dev->hw_features &= ~NETIF_F_HW_VLAN_RX;
 
-       tp->intr_mask = 0xffff;
+       dev->hw_features |= NETIF_F_RXALL;
+       dev->hw_features |= NETIF_F_RXFCS;
+
        tp->hw_start = cfg->hw_start;
-       tp->intr_event = cfg->intr_event;
-       tp->napi_event = cfg->napi_event;
+       tp->event_slow = cfg->event_slow;
 
        tp->opts1_mask = (tp->mac_version != RTL_GIGA_MAC_VER_01) ?
                ~(RxBOVF | RxFOVF) : ~0;
@@ -4204,7 +4274,7 @@ static void __devexit rtl8169_remove_one(struct pci_dev *pdev)
                rtl8168_driver_stop(tp);
        }
 
-       cancel_delayed_work_sync(&tp->task);
+       cancel_work_sync(&tp->wk.work);
 
        unregister_netdev(dev);
 
@@ -4265,6 +4335,8 @@ static void rtl_request_firmware(struct rtl8169_private *tp)
                rtl_request_uncached_firmware(tp);
 }
 
+static void rtl_task(struct work_struct *);
+
 static int rtl8169_open(struct net_device *dev)
 {
        struct rtl8169_private *tp = netdev_priv(dev);
@@ -4292,7 +4364,7 @@ static int rtl8169_open(struct net_device *dev)
        if (retval < 0)
                goto err_free_rx_1;
 
-       INIT_DELAYED_WORK(&tp->task, NULL);
+       INIT_WORK(&tp->wk.work, rtl_task);
 
        smp_mb();
 
@@ -4304,16 +4376,24 @@ static int rtl8169_open(struct net_device *dev)
        if (retval < 0)
                goto err_release_fw_2;
 
+       rtl_lock_work(tp);
+
+       set_bit(RTL_FLAG_TASK_ENABLED, tp->wk.flags);
+
        napi_enable(&tp->napi);
 
        rtl8169_init_phy(dev, tp);
 
-       rtl8169_set_features(dev, dev->features);
+       __rtl8169_set_features(dev, dev->features);
 
        rtl_pll_power_up(tp);
 
        rtl_hw_start(dev);
 
+       netif_start_queue(dev);
+
+       rtl_unlock_work(tp);
+
        tp->saved_wolopts = 0;
        pm_runtime_put_noidle(&pdev->dev);
 
@@ -4387,7 +4467,7 @@ static void rtl_hw_start(struct net_device *dev)
 
        tp->hw_start(dev);
 
-       netif_start_queue(dev);
+       rtl_irq_enable_all(tp);
 }
 
 static void rtl_set_rx_tx_desc_registers(struct rtl8169_private *tp,
@@ -4514,9 +4594,6 @@ static void rtl_hw_start_8169(struct net_device *dev)
 
        /* no early-rx interrupts */
        RTL_W16(MultiIntr, RTL_R16(MultiIntr) & 0xF000);
-
-       /* Enable all known interrupts by setting the interrupt mask. */
-       RTL_W16(IntrMask, tp->intr_event);
 }
 
 static void rtl_csi_access_enable(void __iomem *ioaddr, u32 bits)
@@ -4896,8 +4973,8 @@ static void rtl_hw_start_8168(struct net_device *dev)
 
        /* Work around for RxFIFO overflow. */
        if (tp->mac_version == RTL_GIGA_MAC_VER_11) {
-               tp->intr_event |= RxFIFOOver | PCSTimeout;
-               tp->intr_event &= ~RxOverflow;
+               tp->event_slow |= RxFIFOOver | PCSTimeout;
+               tp->event_slow &= ~RxOverflow;
        }
 
        rtl_set_rx_tx_desc_registers(tp, ioaddr);
@@ -4985,8 +5062,6 @@ static void rtl_hw_start_8168(struct net_device *dev)
        RTL_W8(Cfg9346, Cfg9346_Lock);
 
        RTL_W16(MultiIntr, RTL_R16(MultiIntr) & 0xF000);
-
-       RTL_W16(IntrMask, tp->intr_event);
 }
 
 #define R810X_CPCMD_QUIRK_MASK (\
@@ -5085,10 +5160,8 @@ static void rtl_hw_start_8101(struct net_device *dev)
        void __iomem *ioaddr = tp->mmio_addr;
        struct pci_dev *pdev = tp->pci_dev;
 
-       if (tp->mac_version >= RTL_GIGA_MAC_VER_30) {
-               tp->intr_event &= ~RxFIFOOver;
-               tp->napi_event &= ~RxFIFOOver;
-       }
+       if (tp->mac_version >= RTL_GIGA_MAC_VER_30)
+               tp->event_slow &= ~RxFIFOOver;
 
        if (tp->mac_version == RTL_GIGA_MAC_VER_13 ||
            tp->mac_version == RTL_GIGA_MAC_VER_16) {
@@ -5144,8 +5217,6 @@ static void rtl_hw_start_8101(struct net_device *dev)
        rtl_set_rx_mode(dev);
 
        RTL_W16(MultiIntr, RTL_R16(MultiIntr) & 0xf000);
-
-       RTL_W16(IntrMask, tp->intr_event);
 }
 
 static int rtl8169_change_mtu(struct net_device *dev, int new_mtu)
@@ -5336,94 +5407,37 @@ static void rtl8169_tx_clear(struct rtl8169_private *tp)
 {
        rtl8169_tx_clear_range(tp, tp->dirty_tx, NUM_TX_DESC);
        tp->cur_tx = tp->dirty_tx = 0;
+       netdev_reset_queue(tp->dev);
 }
 
-static void rtl8169_schedule_work(struct net_device *dev, work_func_t task)
-{
-       struct rtl8169_private *tp = netdev_priv(dev);
-
-       PREPARE_DELAYED_WORK(&tp->task, task);
-       schedule_delayed_work(&tp->task, 4);
-}
-
-static void rtl8169_wait_for_quiescence(struct net_device *dev)
-{
-       struct rtl8169_private *tp = netdev_priv(dev);
-       void __iomem *ioaddr = tp->mmio_addr;
-
-       synchronize_irq(dev->irq);
-
-       /* Wait for any pending NAPI task to complete */
-       napi_disable(&tp->napi);
-
-       rtl8169_irq_mask_and_ack(tp);
-
-       tp->intr_mask = 0xffff;
-       RTL_W16(IntrMask, tp->intr_event);
-       napi_enable(&tp->napi);
-}
-
-static void rtl8169_reinit_task(struct work_struct *work)
-{
-       struct rtl8169_private *tp =
-               container_of(work, struct rtl8169_private, task.work);
-       struct net_device *dev = tp->dev;
-       int ret;
-
-       rtnl_lock();
-
-       if (!netif_running(dev))
-               goto out_unlock;
-
-       rtl8169_wait_for_quiescence(dev);
-       rtl8169_close(dev);
-
-       ret = rtl8169_open(dev);
-       if (unlikely(ret < 0)) {
-               if (net_ratelimit())
-                       netif_err(tp, drv, dev,
-                                 "reinit failure (status = %d). Rescheduling\n",
-                                 ret);
-               rtl8169_schedule_work(dev, rtl8169_reinit_task);
-       }
-
-out_unlock:
-       rtnl_unlock();
-}
-
-static void rtl8169_reset_task(struct work_struct *work)
+static void rtl_reset_work(struct rtl8169_private *tp)
 {
-       struct rtl8169_private *tp =
-               container_of(work, struct rtl8169_private, task.work);
        struct net_device *dev = tp->dev;
        int i;
 
-       rtnl_lock();
-
-       if (!netif_running(dev))
-               goto out_unlock;
+       napi_disable(&tp->napi);
+       netif_stop_queue(dev);
+       synchronize_sched();
 
        rtl8169_hw_reset(tp);
 
-       rtl8169_wait_for_quiescence(dev);
-
        for (i = 0; i < NUM_RX_DESC; i++)
                rtl8169_mark_to_asic(tp->RxDescArray + i, rx_buf_sz);
 
        rtl8169_tx_clear(tp);
        rtl8169_init_ring_indexes(tp);
 
+       napi_enable(&tp->napi);
        rtl_hw_start(dev);
        netif_wake_queue(dev);
        rtl8169_check_link_status(dev, tp, tp->mmio_addr);
-
-out_unlock:
-       rtnl_unlock();
 }
 
 static void rtl8169_tx_timeout(struct net_device *dev)
 {
-       rtl8169_schedule_work(dev, rtl8169_reset_task);
+       struct rtl8169_private *tp = netdev_priv(dev);
+
+       rtl_schedule_task(tp, RTL_FLAG_TASK_RESET_PENDING);
 }
 
 static int rtl8169_xmit_frags(struct rtl8169_private *tp, struct sk_buff *skb,
@@ -5548,6 +5562,8 @@ static netdev_tx_t rtl8169_start_xmit(struct sk_buff *skb,
 
        txd->opts2 = cpu_to_le32(opts[1]);
 
+       netdev_sent_queue(dev, skb->len);
+
        wmb();
 
        /* Anti gcc 2.95.3 bugware (sic) */
@@ -5560,9 +5576,22 @@ static netdev_tx_t rtl8169_start_xmit(struct sk_buff *skb,
 
        RTL_W8(TxPoll, NPQ);
 
+       mmiowb();
+
        if (TX_BUFFS_AVAIL(tp) < MAX_SKB_FRAGS) {
+               /* Avoid wrongly optimistic queue wake-up: rtl_tx thread must
+                * not miss a ring update when it notices a stopped queue.
+                */
+               smp_wmb();
                netif_stop_queue(dev);
-               smp_rmb();
+               /* Sync with rtl_tx:
+                * - publish queue status and cur_tx ring index (write barrier)
+                * - refresh dirty_tx ring index (read barrier).
+                * May the current thread have a pessimistic view of the ring
+                * status and forget to wake up queue, a racing rtl_tx thread
+                * can't.
+                */
+               smp_mb();
                if (TX_BUFFS_AVAIL(tp) >= MAX_SKB_FRAGS)
                        netif_wake_queue(dev);
        }
@@ -5626,14 +5655,19 @@ static void rtl8169_pcierr_interrupt(struct net_device *dev)
 
        rtl8169_hw_reset(tp);
 
-       rtl8169_schedule_work(dev, rtl8169_reinit_task);
+       rtl_schedule_task(tp, RTL_FLAG_TASK_RESET_PENDING);
 }
 
-static void rtl8169_tx_interrupt(struct net_device *dev,
-                                struct rtl8169_private *tp,
-                                void __iomem *ioaddr)
+struct rtl_txc {
+       int packets;
+       int bytes;
+};
+
+static void rtl_tx(struct net_device *dev, struct rtl8169_private *tp)
 {
+       struct rtl8169_stats *tx_stats = &tp->tx_stats;
        unsigned int dirty_tx, tx_left;
+       struct rtl_txc txc = { 0, 0 };
 
        dirty_tx = tp->dirty_tx;
        smp_rmb();
@@ -5652,18 +5686,34 @@ static void rtl8169_tx_interrupt(struct net_device *dev,
                rtl8169_unmap_tx_skb(&tp->pci_dev->dev, tx_skb,
                                     tp->TxDescArray + entry);
                if (status & LastFrag) {
-                       dev->stats.tx_packets++;
-                       dev->stats.tx_bytes += tx_skb->skb->len;
-                       dev_kfree_skb(tx_skb->skb);
+                       struct sk_buff *skb = tx_skb->skb;
+
+                       txc.packets++;
+                       txc.bytes += skb->len;
+                       dev_kfree_skb(skb);
                        tx_skb->skb = NULL;
                }
                dirty_tx++;
                tx_left--;
        }
 
+       u64_stats_update_begin(&tx_stats->syncp);
+       tx_stats->packets += txc.packets;
+       tx_stats->bytes += txc.bytes;
+       u64_stats_update_end(&tx_stats->syncp);
+
+       netdev_completed_queue(dev, txc.packets, txc.bytes);
+
        if (tp->dirty_tx != dirty_tx) {
                tp->dirty_tx = dirty_tx;
-               smp_wmb();
+               /* Sync with rtl8169_start_xmit:
+                * - publish dirty_tx ring index (write barrier)
+                * - refresh cur_tx ring index and queue status (read barrier)
+                * May the current thread miss the stopped queue condition,
+                * a racing xmit thread can only have a right view of the
+                * ring status.
+                */
+               smp_mb();
                if (netif_queue_stopped(dev) &&
                    (TX_BUFFS_AVAIL(tp) >= MAX_SKB_FRAGS)) {
                        netif_wake_queue(dev);
@@ -5674,9 +5724,11 @@ static void rtl8169_tx_interrupt(struct net_device *dev,
                 * of start_xmit activity is detected (if it is not detected,
                 * it is slow enough). -- FR
                 */
-               smp_rmb();
-               if (tp->cur_tx != dirty_tx)
+               if (tp->cur_tx != dirty_tx) {
+                       void __iomem *ioaddr = tp->mmio_addr;
+
                        RTL_W8(TxPoll, NPQ);
+               }
        }
 }
 
@@ -5715,9 +5767,7 @@ static struct sk_buff *rtl8169_try_rx_copy(void *data,
        return skb;
 }
 
-static int rtl8169_rx_interrupt(struct net_device *dev,
-                               struct rtl8169_private *tp,
-                               void __iomem *ioaddr, u32 budget)
+static int rtl_rx(struct net_device *dev, struct rtl8169_private *tp, u32 budget)
 {
        unsigned int cur_rx, rx_left;
        unsigned int count;
@@ -5745,14 +5795,26 @@ static int rtl8169_rx_interrupt(struct net_device *dev,
                        if (status & RxCRC)
                                dev->stats.rx_crc_errors++;
                        if (status & RxFOVF) {
-                               rtl8169_schedule_work(dev, rtl8169_reset_task);
+                               rtl_schedule_task(tp, RTL_FLAG_TASK_RESET_PENDING);
                                dev->stats.rx_fifo_errors++;
                        }
+                       if ((status & (RxRUNT | RxCRC)) &&
+                           !(status & (RxRWT | RxFOVF)) &&
+                           (dev->features & NETIF_F_RXALL))
+                               goto process_pkt;
+
                        rtl8169_mark_to_asic(desc, rx_buf_sz);
                } else {
                        struct sk_buff *skb;
-                       dma_addr_t addr = le64_to_cpu(desc->addr);
-                       int pkt_size = (status & 0x00003fff) - 4;
+                       dma_addr_t addr;
+                       int pkt_size;
+
+process_pkt:
+                       addr = le64_to_cpu(desc->addr);
+                       if (likely(!(dev->features & NETIF_F_RXFCS)))
+                               pkt_size = (status & 0x00003fff) - 4;
+                       else
+                               pkt_size = status & 0x00003fff;
 
                        /*
                         * The driver does not support incoming fragmented
@@ -5782,8 +5844,10 @@ static int rtl8169_rx_interrupt(struct net_device *dev,
 
                        napi_gro_receive(&tp->napi, skb);
 
-                       dev->stats.rx_bytes += pkt_size;
-                       dev->stats.rx_packets++;
+                       u64_stats_update_begin(&tp->rx_stats.syncp);
+                       tp->rx_stats.packets++;
+                       tp->rx_stats.bytes += pkt_size;
+                       u64_stats_update_end(&tp->rx_stats.syncp);
                }
 
                /* Work around for AMD plateform. */
@@ -5806,101 +5870,120 @@ static irqreturn_t rtl8169_interrupt(int irq, void *dev_instance)
 {
        struct net_device *dev = dev_instance;
        struct rtl8169_private *tp = netdev_priv(dev);
-       void __iomem *ioaddr = tp->mmio_addr;
        int handled = 0;
-       int status;
+       u16 status;
 
-       /* loop handling interrupts until we have no new ones or
-        * we hit a invalid/hotplug case.
-        */
-       status = RTL_R16(IntrStatus);
-       while (status && status != 0xffff) {
-               status &= tp->intr_event;
-               if (!status)
-                       break;
+       status = rtl_get_events(tp);
+       if (status && status != 0xffff) {
+               status &= RTL_EVENT_NAPI | tp->event_slow;
+               if (status) {
+                       handled = 1;
 
-               handled = 1;
+                       rtl_irq_disable(tp);
+                       napi_schedule(&tp->napi);
+               }
+       }
+       return IRQ_RETVAL(handled);
+}
 
-               /* Handle all of the error cases first. These will reset
-                * the chip, so just exit the loop.
-                */
-               if (unlikely(!netif_running(dev))) {
-                       rtl8169_hw_reset(tp);
+/*
+ * Workqueue context.
+ */
+static void rtl_slow_event_work(struct rtl8169_private *tp)
+{
+       struct net_device *dev = tp->dev;
+       u16 status;
+
+       status = rtl_get_events(tp) & tp->event_slow;
+       rtl_ack_events(tp, status);
+
+       if (unlikely(status & RxFIFOOver)) {
+               switch (tp->mac_version) {
+               /* Work around for rx fifo overflow */
+               case RTL_GIGA_MAC_VER_11:
+                       netif_stop_queue(dev);
+                       /* XXX - Hack alert. See rtl_task(). */
+                       set_bit(RTL_FLAG_TASK_RESET_PENDING, tp->wk.flags);
+               default:
                        break;
                }
+       }
 
-               if (unlikely(status & RxFIFOOver)) {
-                       switch (tp->mac_version) {
-                       /* Work around for rx fifo overflow */
-                       case RTL_GIGA_MAC_VER_11:
-                               netif_stop_queue(dev);
-                               rtl8169_tx_timeout(dev);
-                               goto done;
-                       default:
-                               break;
-                       }
-               }
+       if (unlikely(status & SYSErr))
+               rtl8169_pcierr_interrupt(dev);
 
-               if (unlikely(status & SYSErr)) {
-                       rtl8169_pcierr_interrupt(dev);
-                       break;
-               }
+       if (status & LinkChg)
+               __rtl8169_check_link_status(dev, tp, tp->mmio_addr, true);
 
-               if (status & LinkChg)
-                       __rtl8169_check_link_status(dev, tp, ioaddr, true);
+       napi_disable(&tp->napi);
+       rtl_irq_disable(tp);
 
-               /* We need to see the lastest version of tp->intr_mask to
-                * avoid ignoring an MSI interrupt and having to wait for
-                * another event which may never come.
-                */
-               smp_rmb();
-               if (status & tp->intr_mask & tp->napi_event) {
-                       RTL_W16(IntrMask, tp->intr_event & ~tp->napi_event);
-                       tp->intr_mask = ~tp->napi_event;
+       napi_enable(&tp->napi);
+       napi_schedule(&tp->napi);
+}
 
-                       if (likely(napi_schedule_prep(&tp->napi)))
-                               __napi_schedule(&tp->napi);
-                       else
-                               netif_info(tp, intr, dev,
-                                          "interrupt %04x in poll\n", status);
-               }
+static void rtl_task(struct work_struct *work)
+{
+       static const struct {
+               int bitnr;
+               void (*action)(struct rtl8169_private *);
+       } rtl_work[] = {
+               /* XXX - keep rtl_slow_event_work() as first element. */
+               { RTL_FLAG_TASK_SLOW_PENDING,   rtl_slow_event_work },
+               { RTL_FLAG_TASK_RESET_PENDING,  rtl_reset_work },
+               { RTL_FLAG_TASK_PHY_PENDING,    rtl_phy_work }
+       };
+       struct rtl8169_private *tp =
+               container_of(work, struct rtl8169_private, wk.work);
+       struct net_device *dev = tp->dev;
+       int i;
 
-               /* We only get a new MSI interrupt when all active irq
-                * sources on the chip have been acknowledged. So, ack
-                * everything we've seen and check if new sources have become
-                * active to avoid blocking all interrupts from the chip.
-                */
-               RTL_W16(IntrStatus,
-                       (status & RxFIFOOver) ? (status | RxOverflow) : status);
-               status = RTL_R16(IntrStatus);
+       rtl_lock_work(tp);
+
+       if (!netif_running(dev) ||
+           !test_bit(RTL_FLAG_TASK_ENABLED, tp->wk.flags))
+               goto out_unlock;
+
+       for (i = 0; i < ARRAY_SIZE(rtl_work); i++) {
+               bool pending;
+
+               pending = test_and_clear_bit(rtl_work[i].bitnr, tp->wk.flags);
+               if (pending)
+                       rtl_work[i].action(tp);
        }
-done:
-       return IRQ_RETVAL(handled);
+
+out_unlock:
+       rtl_unlock_work(tp);
 }
 
 static int rtl8169_poll(struct napi_struct *napi, int budget)
 {
        struct rtl8169_private *tp = container_of(napi, struct rtl8169_private, napi);
        struct net_device *dev = tp->dev;
-       void __iomem *ioaddr = tp->mmio_addr;
-       int work_done;
+       u16 enable_mask = RTL_EVENT_NAPI | tp->event_slow;
+       int work_done= 0;
+       u16 status;
+
+       status = rtl_get_events(tp);
+       rtl_ack_events(tp, status & ~tp->event_slow);
+
+       if (status & RTL_EVENT_NAPI_RX)
+               work_done = rtl_rx(dev, tp, (u32) budget);
+
+       if (status & RTL_EVENT_NAPI_TX)
+               rtl_tx(dev, tp);
 
-       work_done = rtl8169_rx_interrupt(dev, tp, ioaddr, (u32) budget);
-       rtl8169_tx_interrupt(dev, tp, ioaddr);
+       if (status & tp->event_slow) {
+               enable_mask &= ~tp->event_slow;
+
+               rtl_schedule_task(tp, RTL_FLAG_TASK_SLOW_PENDING);
+       }
 
        if (work_done < budget) {
                napi_complete(napi);
 
-               /* We need for force the visibility of tp->intr_mask
-                * for other CPUs, as we can loose an MSI interrupt
-                * and potentially wait for a retransmit timeout if we don't.
-                * The posted write to IntrMask is safe, as it will
-                * eventually make it to the chip and we won't loose anything
-                * until it does.
-                */
-               tp->intr_mask = 0xffff;
-               wmb();
-               RTL_W16(IntrMask, tp->intr_event);
+               rtl_irq_enable(tp, enable_mask);
+               mmiowb();
        }
 
        return work_done;
@@ -5924,26 +6007,19 @@ static void rtl8169_down(struct net_device *dev)
 
        del_timer_sync(&tp->timer);
 
-       netif_stop_queue(dev);
-
        napi_disable(&tp->napi);
-
-       spin_lock_irq(&tp->lock);
+       netif_stop_queue(dev);
 
        rtl8169_hw_reset(tp);
        /*
         * At this point device interrupts can not be enabled in any function,
-        * as netif_running is not true (rtl8169_interrupt, rtl8169_reset_task,
-        * rtl8169_reinit_task) and napi is disabled (rtl8169_poll).
+        * as netif_running is not true (rtl8169_interrupt, rtl8169_reset_task)
+        * and napi is disabled (rtl8169_poll).
         */
        rtl8169_rx_missed(dev, ioaddr);
 
-       spin_unlock_irq(&tp->lock);
-
-       synchronize_irq(dev->irq);
-
        /* Give a racing hard_start_xmit a few cycles to complete. */
-       synchronize_sched();  /* FIXME: should this be synchronize_irq()? */
+       synchronize_sched();
 
        rtl8169_tx_clear(tp);
 
@@ -5962,7 +6038,11 @@ static int rtl8169_close(struct net_device *dev)
        /* Update counters before going down */
        rtl8169_update_counters(dev);
 
+       rtl_lock_work(tp);
+       clear_bit(RTL_FLAG_TASK_ENABLED, tp->wk.flags);
+
        rtl8169_down(dev);
+       rtl_unlock_work(tp);
 
        free_irq(dev->irq, dev);
 
@@ -5982,7 +6062,6 @@ static void rtl_set_rx_mode(struct net_device *dev)
 {
        struct rtl8169_private *tp = netdev_priv(dev);
        void __iomem *ioaddr = tp->mmio_addr;
-       unsigned long flags;
        u32 mc_filter[2];       /* Multicast hash filter */
        int rx_mode;
        u32 tmp = 0;
@@ -6011,7 +6090,8 @@ static void rtl_set_rx_mode(struct net_device *dev)
                }
        }
 
-       spin_lock_irqsave(&tp->lock, flags);
+       if (dev->features & NETIF_F_RXALL)
+               rx_mode |= (AcceptErr | AcceptRunt);
 
        tmp = (RTL_R32(RxConfig) & ~RX_CONFIG_ACCEPT_MASK) | rx_mode;
 
@@ -6026,29 +6106,40 @@ static void rtl_set_rx_mode(struct net_device *dev)
        RTL_W32(MAR0 + 0, mc_filter[0]);
 
        RTL_W32(RxConfig, tmp);
-
-       spin_unlock_irqrestore(&tp->lock, flags);
 }
 
-/**
- *  rtl8169_get_stats - Get rtl8169 read/write statistics
- *  @dev: The Ethernet Device to get statistics for
- *
- *  Get TX/RX statistics for rtl8169
- */
-static struct net_device_stats *rtl8169_get_stats(struct net_device *dev)
+static struct rtnl_link_stats64 *
+rtl8169_get_stats64(struct net_device *dev, struct rtnl_link_stats64 *stats)
 {
        struct rtl8169_private *tp = netdev_priv(dev);
        void __iomem *ioaddr = tp->mmio_addr;
-       unsigned long flags;
+       unsigned int start;
 
-       if (netif_running(dev)) {
-               spin_lock_irqsave(&tp->lock, flags);
+       if (netif_running(dev))
                rtl8169_rx_missed(dev, ioaddr);
-               spin_unlock_irqrestore(&tp->lock, flags);
-       }
 
-       return &dev->stats;
+       do {
+               start = u64_stats_fetch_begin_bh(&tp->rx_stats.syncp);
+               stats->rx_packets = tp->rx_stats.packets;
+               stats->rx_bytes = tp->rx_stats.bytes;
+       } while (u64_stats_fetch_retry_bh(&tp->rx_stats.syncp, start));
+
+
+       do {
+               start = u64_stats_fetch_begin_bh(&tp->tx_stats.syncp);
+               stats->tx_packets = tp->tx_stats.packets;
+               stats->tx_bytes = tp->tx_stats.bytes;
+       } while (u64_stats_fetch_retry_bh(&tp->tx_stats.syncp, start));
+
+       stats->rx_dropped       = dev->stats.rx_dropped;
+       stats->tx_dropped       = dev->stats.tx_dropped;
+       stats->rx_length_errors = dev->stats.rx_length_errors;
+       stats->rx_errors        = dev->stats.rx_errors;
+       stats->rx_crc_errors    = dev->stats.rx_crc_errors;
+       stats->rx_fifo_errors   = dev->stats.rx_fifo_errors;
+       stats->rx_missed_errors = dev->stats.rx_missed_errors;
+
+       return stats;
 }
 
 static void rtl8169_net_suspend(struct net_device *dev)
@@ -6058,10 +6149,15 @@ static void rtl8169_net_suspend(struct net_device *dev)
        if (!netif_running(dev))
                return;
 
-       rtl_pll_power_down(tp);
-
        netif_device_detach(dev);
        netif_stop_queue(dev);
+
+       rtl_lock_work(tp);
+       napi_disable(&tp->napi);
+       clear_bit(RTL_FLAG_TASK_ENABLED, tp->wk.flags);
+       rtl_unlock_work(tp);
+
+       rtl_pll_power_down(tp);
 }
 
 #ifdef CONFIG_PM
@@ -6084,7 +6180,9 @@ static void __rtl8169_resume(struct net_device *dev)
 
        rtl_pll_power_up(tp);
 
-       rtl8169_schedule_work(dev, rtl8169_reset_task);
+       set_bit(RTL_FLAG_TASK_ENABLED, tp->wk.flags);
+
+       rtl_schedule_task(tp, RTL_FLAG_TASK_RESET_PENDING);
 }
 
 static int rtl8169_resume(struct device *device)
@@ -6110,10 +6208,10 @@ static int rtl8169_runtime_suspend(struct device *device)
        if (!tp->TxDescArray)
                return 0;
 
-       spin_lock_irq(&tp->lock);
+       rtl_lock_work(tp);
        tp->saved_wolopts = __rtl8169_get_wol(tp);
        __rtl8169_set_wol(tp, WAKE_ANY);
-       spin_unlock_irq(&tp->lock);
+       rtl_unlock_work(tp);
 
        rtl8169_net_suspend(dev);
 
@@ -6129,10 +6227,10 @@ static int rtl8169_runtime_resume(struct device *device)
        if (!tp->TxDescArray)
                return 0;
 
-       spin_lock_irq(&tp->lock);
+       rtl_lock_work(tp);
        __rtl8169_set_wol(tp, tp->saved_wolopts);
        tp->saved_wolopts = 0;
-       spin_unlock_irq(&tp->lock);
+       rtl_unlock_work(tp);
 
        rtl8169_init_phy(dev, tp);
 
@@ -6200,12 +6298,8 @@ static void rtl_shutdown(struct pci_dev *pdev)
        /* Restore original MAC address */
        rtl_rar_set(tp, dev->perm_addr);
 
-       spin_lock_irq(&tp->lock);
-
        rtl8169_hw_reset(tp);
 
-       spin_unlock_irq(&tp->lock);
-
        if (system_state == SYSTEM_POWER_OFF) {
                if (__rtl8169_get_wol(tp) & WAKE_ANY) {
                        rtl_wol_suspend_quirk(tp);
index 87b6501..8615961 100644 (file)
@@ -34,7 +34,6 @@
 #include <linux/phy.h>
 #include <linux/cache.h>
 #include <linux/io.h>
-#include <linux/interrupt.h>
 #include <linux/pm_runtime.h>
 #include <linux/slab.h>
 #include <linux/ethtool.h>
@@ -269,6 +268,7 @@ static struct sh_eth_cpu_data sh_eth_my_cpu_data_giga = {
        .rpadir_value   = 2 << 16,
        .no_trimd       = 1,
        .no_ade         = 1,
+       .tsu            = 1,
 };
 
 static struct sh_eth_cpu_data *sh_eth_get_cpu_data(struct sh_eth_private *mdp)
@@ -654,13 +654,12 @@ static void sh_eth_ring_format(struct net_device *ndev)
        for (i = 0; i < RX_RING_SIZE; i++) {
                /* skb */
                mdp->rx_skbuff[i] = NULL;
-               skb = dev_alloc_skb(mdp->rx_buf_sz);
+               skb = netdev_alloc_skb(ndev, mdp->rx_buf_sz);
                mdp->rx_skbuff[i] = skb;
                if (skb == NULL)
                        break;
-               dma_map_single(&ndev->dev, skb->tail, mdp->rx_buf_sz,
+               dma_map_single(&ndev->dev, skb->data, mdp->rx_buf_sz,
                                DMA_FROM_DEVICE);
-               skb->dev = ndev; /* Mark as being used by this device. */
                sh_eth_set_receive_align(skb);
 
                /* RX descriptor */
@@ -883,8 +882,8 @@ static int sh_eth_txfree(struct net_device *ndev)
                if (entry >= TX_RING_SIZE - 1)
                        txdesc->status |= cpu_to_edmac(mdp, TD_TDLE);
 
-               mdp->stats.tx_packets++;
-               mdp->stats.tx_bytes += txdesc->buffer_length;
+               ndev->stats.tx_packets++;
+               ndev->stats.tx_bytes += txdesc->buffer_length;
        }
        return freeNum;
 }
@@ -910,23 +909,23 @@ static int sh_eth_rx(struct net_device *ndev)
                        break;
 
                if (!(desc_status & RDFEND))
-                       mdp->stats.rx_length_errors++;
+                       ndev->stats.rx_length_errors++;
 
                if (desc_status & (RD_RFS1 | RD_RFS2 | RD_RFS3 | RD_RFS4 |
                                   RD_RFS5 | RD_RFS6 | RD_RFS10)) {
-                       mdp->stats.rx_errors++;
+                       ndev->stats.rx_errors++;
                        if (desc_status & RD_RFS1)
-                               mdp->stats.rx_crc_errors++;
+                               ndev->stats.rx_crc_errors++;
                        if (desc_status & RD_RFS2)
-                               mdp->stats.rx_frame_errors++;
+                               ndev->stats.rx_frame_errors++;
                        if (desc_status & RD_RFS3)
-                               mdp->stats.rx_length_errors++;
+                               ndev->stats.rx_length_errors++;
                        if (desc_status & RD_RFS4)
-                               mdp->stats.rx_length_errors++;
+                               ndev->stats.rx_length_errors++;
                        if (desc_status & RD_RFS6)
-                               mdp->stats.rx_missed_errors++;
+                               ndev->stats.rx_missed_errors++;
                        if (desc_status & RD_RFS10)
-                               mdp->stats.rx_over_errors++;
+                               ndev->stats.rx_over_errors++;
                } else {
                        if (!mdp->cd->hw_swap)
                                sh_eth_soft_swap(
@@ -939,8 +938,8 @@ static int sh_eth_rx(struct net_device *ndev)
                        skb_put(skb, pkt_len);
                        skb->protocol = eth_type_trans(skb, ndev);
                        netif_rx(skb);
-                       mdp->stats.rx_packets++;
-                       mdp->stats.rx_bytes += pkt_len;
+                       ndev->stats.rx_packets++;
+                       ndev->stats.rx_bytes += pkt_len;
                }
                rxdesc->status |= cpu_to_edmac(mdp, RD_RACT);
                entry = (++mdp->cur_rx) % RX_RING_SIZE;
@@ -955,13 +954,12 @@ static int sh_eth_rx(struct net_device *ndev)
                rxdesc->buffer_length = ALIGN(mdp->rx_buf_sz, 16);
 
                if (mdp->rx_skbuff[entry] == NULL) {
-                       skb = dev_alloc_skb(mdp->rx_buf_sz);
+                       skb = netdev_alloc_skb(ndev, mdp->rx_buf_sz);
                        mdp->rx_skbuff[entry] = skb;
                        if (skb == NULL)
                                break;  /* Better luck next round. */
-                       dma_map_single(&ndev->dev, skb->tail, mdp->rx_buf_sz,
+                       dma_map_single(&ndev->dev, skb->data, mdp->rx_buf_sz,
                                        DMA_FROM_DEVICE);
-                       skb->dev = ndev;
                        sh_eth_set_receive_align(skb);
 
                        skb_checksum_none_assert(skb);
@@ -1009,7 +1007,7 @@ static void sh_eth_error(struct net_device *ndev, int intr_status)
                felic_stat = sh_eth_read(ndev, ECSR);
                sh_eth_write(ndev, felic_stat, ECSR);   /* clear int */
                if (felic_stat & ECSR_ICD)
-                       mdp->stats.tx_carrier_errors++;
+                       ndev->stats.tx_carrier_errors++;
                if (felic_stat & ECSR_LCHNG) {
                        /* Link Changed */
                        if (mdp->cd->no_psr || mdp->no_ether_link) {
@@ -1042,7 +1040,7 @@ static void sh_eth_error(struct net_device *ndev, int intr_status)
        if (intr_status & EESR_TWB) {
                /* Write buck end. unused write back interrupt */
                if (intr_status & EESR_TABT)    /* Transmit Abort int */
-                       mdp->stats.tx_aborted_errors++;
+                       ndev->stats.tx_aborted_errors++;
                        if (netif_msg_tx_err(mdp))
                                dev_err(&ndev->dev, "Transmit Abort\n");
        }
@@ -1051,7 +1049,7 @@ static void sh_eth_error(struct net_device *ndev, int intr_status)
                /* Receive Abort int */
                if (intr_status & EESR_RFRMER) {
                        /* Receive Frame Overflow int */
-                       mdp->stats.rx_frame_errors++;
+                       ndev->stats.rx_frame_errors++;
                        if (netif_msg_rx_err(mdp))
                                dev_err(&ndev->dev, "Receive Abort\n");
                }
@@ -1059,21 +1057,21 @@ static void sh_eth_error(struct net_device *ndev, int intr_status)
 
        if (intr_status & EESR_TDE) {
                /* Transmit Descriptor Empty int */
-               mdp->stats.tx_fifo_errors++;
+               ndev->stats.tx_fifo_errors++;
                if (netif_msg_tx_err(mdp))
                        dev_err(&ndev->dev, "Transmit Descriptor Empty\n");
        }
 
        if (intr_status & EESR_TFE) {
                /* FIFO under flow */
-               mdp->stats.tx_fifo_errors++;
+               ndev->stats.tx_fifo_errors++;
                if (netif_msg_tx_err(mdp))
                        dev_err(&ndev->dev, "Transmit FIFO Under flow\n");
        }
 
        if (intr_status & EESR_RDE) {
                /* Receive Descriptor Empty int */
-               mdp->stats.rx_over_errors++;
+               ndev->stats.rx_over_errors++;
 
                if (sh_eth_read(ndev, EDRRR) ^ EDRRR_R)
                        sh_eth_write(ndev, EDRRR_R, EDRRR);
@@ -1083,14 +1081,14 @@ static void sh_eth_error(struct net_device *ndev, int intr_status)
 
        if (intr_status & EESR_RFE) {
                /* Receive FIFO Overflow int */
-               mdp->stats.rx_fifo_errors++;
+               ndev->stats.rx_fifo_errors++;
                if (netif_msg_rx_err(mdp))
                        dev_err(&ndev->dev, "Receive FIFO Overflow\n");
        }
 
        if (!mdp->cd->no_ade && (intr_status & EESR_ADE)) {
                /* Address Error */
-               mdp->stats.tx_fifo_errors++;
+               ndev->stats.tx_fifo_errors++;
                if (netif_msg_tx_err(mdp))
                        dev_err(&ndev->dev, "Address Error\n");
        }
@@ -1447,7 +1445,7 @@ static void sh_eth_tx_timeout(struct net_device *ndev)
               " resetting...\n", ndev->name, (int)sh_eth_read(ndev, EESR));
 
        /* tx_errors count up */
-       mdp->stats.tx_errors++;
+       ndev->stats.tx_errors++;
 
        /* timer off */
        del_timer_sync(&mdp->timer);
@@ -1569,27 +1567,27 @@ static struct net_device_stats *sh_eth_get_stats(struct net_device *ndev)
 
        pm_runtime_get_sync(&mdp->pdev->dev);
 
-       mdp->stats.tx_dropped += sh_eth_read(ndev, TROCR);
+       ndev->stats.tx_dropped += sh_eth_read(ndev, TROCR);
        sh_eth_write(ndev, 0, TROCR);   /* (write clear) */
-       mdp->stats.collisions += sh_eth_read(ndev, CDCR);
+       ndev->stats.collisions += sh_eth_read(ndev, CDCR);
        sh_eth_write(ndev, 0, CDCR);    /* (write clear) */
-       mdp->stats.tx_carrier_errors += sh_eth_read(ndev, LCCR);
+       ndev->stats.tx_carrier_errors += sh_eth_read(ndev, LCCR);
        sh_eth_write(ndev, 0, LCCR);    /* (write clear) */
        if (sh_eth_is_gether(mdp)) {
-               mdp->stats.tx_carrier_errors += sh_eth_read(ndev, CERCR);
+               ndev->stats.tx_carrier_errors += sh_eth_read(ndev, CERCR);
                sh_eth_write(ndev, 0, CERCR);   /* (write clear) */
-               mdp->stats.tx_carrier_errors += sh_eth_read(ndev, CEECR);
+               ndev->stats.tx_carrier_errors += sh_eth_read(ndev, CEECR);
                sh_eth_write(ndev, 0, CEECR);   /* (write clear) */
        } else {
-               mdp->stats.tx_carrier_errors += sh_eth_read(ndev, CNDCR);
+               ndev->stats.tx_carrier_errors += sh_eth_read(ndev, CNDCR);
                sh_eth_write(ndev, 0, CNDCR);   /* (write clear) */
        }
        pm_runtime_put_sync(&mdp->pdev->dev);
 
-       return &mdp->stats;
+       return &ndev->stats;
 }
 
-/* ioctl to device funciotn*/
+/* ioctl to device function */
 static int sh_eth_do_ioctl(struct net_device *ndev, struct ifreq *rq,
                                int cmd)
 {
@@ -1606,18 +1604,345 @@ static int sh_eth_do_ioctl(struct net_device *ndev, struct ifreq *rq,
 }
 
 #if defined(SH_ETH_HAS_TSU)
+/* For TSU_POSTn. Please refer to the manual about this (strange) bitfields */
+static void *sh_eth_tsu_get_post_reg_offset(struct sh_eth_private *mdp,
+                                           int entry)
+{
+       return sh_eth_tsu_get_offset(mdp, TSU_POST1) + (entry / 8 * 4);
+}
+
+static u32 sh_eth_tsu_get_post_mask(int entry)
+{
+       return 0x0f << (28 - ((entry % 8) * 4));
+}
+
+static u32 sh_eth_tsu_get_post_bit(struct sh_eth_private *mdp, int entry)
+{
+       return (0x08 >> (mdp->port << 1)) << (28 - ((entry % 8) * 4));
+}
+
+static void sh_eth_tsu_enable_cam_entry_post(struct net_device *ndev,
+                                            int entry)
+{
+       struct sh_eth_private *mdp = netdev_priv(ndev);
+       u32 tmp;
+       void *reg_offset;
+
+       reg_offset = sh_eth_tsu_get_post_reg_offset(mdp, entry);
+       tmp = ioread32(reg_offset);
+       iowrite32(tmp | sh_eth_tsu_get_post_bit(mdp, entry), reg_offset);
+}
+
+static bool sh_eth_tsu_disable_cam_entry_post(struct net_device *ndev,
+                                             int entry)
+{
+       struct sh_eth_private *mdp = netdev_priv(ndev);
+       u32 post_mask, ref_mask, tmp;
+       void *reg_offset;
+
+       reg_offset = sh_eth_tsu_get_post_reg_offset(mdp, entry);
+       post_mask = sh_eth_tsu_get_post_mask(entry);
+       ref_mask = sh_eth_tsu_get_post_bit(mdp, entry) & ~post_mask;
+
+       tmp = ioread32(reg_offset);
+       iowrite32(tmp & ~post_mask, reg_offset);
+
+       /* If other port enables, the function returns "true" */
+       return tmp & ref_mask;
+}
+
+static int sh_eth_tsu_busy(struct net_device *ndev)
+{
+       int timeout = SH_ETH_TSU_TIMEOUT_MS * 100;
+       struct sh_eth_private *mdp = netdev_priv(ndev);
+
+       while ((sh_eth_tsu_read(mdp, TSU_ADSBSY) & TSU_ADSBSY_0)) {
+               udelay(10);
+               timeout--;
+               if (timeout <= 0) {
+                       dev_err(&ndev->dev, "%s: timeout\n", __func__);
+                       return -ETIMEDOUT;
+               }
+       }
+
+       return 0;
+}
+
+static int sh_eth_tsu_write_entry(struct net_device *ndev, void *reg,
+                                 const u8 *addr)
+{
+       u32 val;
+
+       val = addr[0] << 24 | addr[1] << 16 | addr[2] << 8 | addr[3];
+       iowrite32(val, reg);
+       if (sh_eth_tsu_busy(ndev) < 0)
+               return -EBUSY;
+
+       val = addr[4] << 8 | addr[5];
+       iowrite32(val, reg + 4);
+       if (sh_eth_tsu_busy(ndev) < 0)
+               return -EBUSY;
+
+       return 0;
+}
+
+static void sh_eth_tsu_read_entry(void *reg, u8 *addr)
+{
+       u32 val;
+
+       val = ioread32(reg);
+       addr[0] = (val >> 24) & 0xff;
+       addr[1] = (val >> 16) & 0xff;
+       addr[2] = (val >> 8) & 0xff;
+       addr[3] = val & 0xff;
+       val = ioread32(reg + 4);
+       addr[4] = (val >> 8) & 0xff;
+       addr[5] = val & 0xff;
+}
+
+
+static int sh_eth_tsu_find_entry(struct net_device *ndev, const u8 *addr)
+{
+       struct sh_eth_private *mdp = netdev_priv(ndev);
+       void *reg_offset = sh_eth_tsu_get_offset(mdp, TSU_ADRH0);
+       int i;
+       u8 c_addr[ETH_ALEN];
+
+       for (i = 0; i < SH_ETH_TSU_CAM_ENTRIES; i++, reg_offset += 8) {
+               sh_eth_tsu_read_entry(reg_offset, c_addr);
+               if (memcmp(addr, c_addr, ETH_ALEN) == 0)
+                       return i;
+       }
+
+       return -ENOENT;
+}
+
+static int sh_eth_tsu_find_empty(struct net_device *ndev)
+{
+       u8 blank[ETH_ALEN];
+       int entry;
+
+       memset(blank, 0, sizeof(blank));
+       entry = sh_eth_tsu_find_entry(ndev, blank);
+       return (entry < 0) ? -ENOMEM : entry;
+}
+
+static int sh_eth_tsu_disable_cam_entry_table(struct net_device *ndev,
+                                             int entry)
+{
+       struct sh_eth_private *mdp = netdev_priv(ndev);
+       void *reg_offset = sh_eth_tsu_get_offset(mdp, TSU_ADRH0);
+       int ret;
+       u8 blank[ETH_ALEN];
+
+       sh_eth_tsu_write(mdp, sh_eth_tsu_read(mdp, TSU_TEN) &
+                        ~(1 << (31 - entry)), TSU_TEN);
+
+       memset(blank, 0, sizeof(blank));
+       ret = sh_eth_tsu_write_entry(ndev, reg_offset + entry * 8, blank);
+       if (ret < 0)
+               return ret;
+       return 0;
+}
+
+static int sh_eth_tsu_add_entry(struct net_device *ndev, const u8 *addr)
+{
+       struct sh_eth_private *mdp = netdev_priv(ndev);
+       void *reg_offset = sh_eth_tsu_get_offset(mdp, TSU_ADRH0);
+       int i, ret;
+
+       if (!mdp->cd->tsu)
+               return 0;
+
+       i = sh_eth_tsu_find_entry(ndev, addr);
+       if (i < 0) {
+               /* No entry found, create one */
+               i = sh_eth_tsu_find_empty(ndev);
+               if (i < 0)
+                       return -ENOMEM;
+               ret = sh_eth_tsu_write_entry(ndev, reg_offset + i * 8, addr);
+               if (ret < 0)
+                       return ret;
+
+               /* Enable the entry */
+               sh_eth_tsu_write(mdp, sh_eth_tsu_read(mdp, TSU_TEN) |
+                                (1 << (31 - i)), TSU_TEN);
+       }
+
+       /* Entry found or created, enable POST */
+       sh_eth_tsu_enable_cam_entry_post(ndev, i);
+
+       return 0;
+}
+
+static int sh_eth_tsu_del_entry(struct net_device *ndev, const u8 *addr)
+{
+       struct sh_eth_private *mdp = netdev_priv(ndev);
+       int i, ret;
+
+       if (!mdp->cd->tsu)
+               return 0;
+
+       i = sh_eth_tsu_find_entry(ndev, addr);
+       if (i) {
+               /* Entry found */
+               if (sh_eth_tsu_disable_cam_entry_post(ndev, i))
+                       goto done;
+
+               /* Disable the entry if both ports was disabled */
+               ret = sh_eth_tsu_disable_cam_entry_table(ndev, i);
+               if (ret < 0)
+                       return ret;
+       }
+done:
+       return 0;
+}
+
+static int sh_eth_tsu_purge_all(struct net_device *ndev)
+{
+       struct sh_eth_private *mdp = netdev_priv(ndev);
+       int i, ret;
+
+       if (unlikely(!mdp->cd->tsu))
+               return 0;
+
+       for (i = 0; i < SH_ETH_TSU_CAM_ENTRIES; i++) {
+               if (sh_eth_tsu_disable_cam_entry_post(ndev, i))
+                       continue;
+
+               /* Disable the entry if both ports was disabled */
+               ret = sh_eth_tsu_disable_cam_entry_table(ndev, i);
+               if (ret < 0)
+                       return ret;
+       }
+
+       return 0;
+}
+
+static void sh_eth_tsu_purge_mcast(struct net_device *ndev)
+{
+       struct sh_eth_private *mdp = netdev_priv(ndev);
+       u8 addr[ETH_ALEN];
+       void *reg_offset = sh_eth_tsu_get_offset(mdp, TSU_ADRH0);
+       int i;
+
+       if (unlikely(!mdp->cd->tsu))
+               return;
+
+       for (i = 0; i < SH_ETH_TSU_CAM_ENTRIES; i++, reg_offset += 8) {
+               sh_eth_tsu_read_entry(reg_offset, addr);
+               if (is_multicast_ether_addr(addr))
+                       sh_eth_tsu_del_entry(ndev, addr);
+       }
+}
+
 /* Multicast reception directions set */
 static void sh_eth_set_multicast_list(struct net_device *ndev)
 {
+       struct sh_eth_private *mdp = netdev_priv(ndev);
+       u32 ecmr_bits;
+       int mcast_all = 0;
+       unsigned long flags;
+
+       spin_lock_irqsave(&mdp->lock, flags);
+       /*
+        * Initial condition is MCT = 1, PRM = 0.
+        * Depending on ndev->flags, set PRM or clear MCT
+        */
+       ecmr_bits = (sh_eth_read(ndev, ECMR) & ~ECMR_PRM) | ECMR_MCT;
+
+       if (!(ndev->flags & IFF_MULTICAST)) {
+               sh_eth_tsu_purge_mcast(ndev);
+               mcast_all = 1;
+       }
+       if (ndev->flags & IFF_ALLMULTI) {
+               sh_eth_tsu_purge_mcast(ndev);
+               ecmr_bits &= ~ECMR_MCT;
+               mcast_all = 1;
+       }
+
        if (ndev->flags & IFF_PROMISC) {
-               /* Set promiscuous. */
-               sh_eth_write(ndev, (sh_eth_read(ndev, ECMR) & ~ECMR_MCT) |
-                               ECMR_PRM, ECMR);
+               sh_eth_tsu_purge_all(ndev);
+               ecmr_bits = (ecmr_bits & ~ECMR_MCT) | ECMR_PRM;
+       } else if (mdp->cd->tsu) {
+               struct netdev_hw_addr *ha;
+               netdev_for_each_mc_addr(ha, ndev) {
+                       if (mcast_all && is_multicast_ether_addr(ha->addr))
+                               continue;
+
+                       if (sh_eth_tsu_add_entry(ndev, ha->addr) < 0) {
+                               if (!mcast_all) {
+                                       sh_eth_tsu_purge_mcast(ndev);
+                                       ecmr_bits &= ~ECMR_MCT;
+                                       mcast_all = 1;
+                               }
+                       }
+               }
        } else {
                /* Normal, unicast/broadcast-only mode. */
-               sh_eth_write(ndev, (sh_eth_read(ndev, ECMR) & ~ECMR_PRM) |
-                               ECMR_MCT, ECMR);
+               ecmr_bits = (ecmr_bits & ~ECMR_PRM) | ECMR_MCT;
        }
+
+       /* update the ethernet mode */
+       sh_eth_write(ndev, ecmr_bits, ECMR);
+
+       spin_unlock_irqrestore(&mdp->lock, flags);
+}
+
+static int sh_eth_get_vtag_index(struct sh_eth_private *mdp)
+{
+       if (!mdp->port)
+               return TSU_VTAG0;
+       else
+               return TSU_VTAG1;
+}
+
+static int sh_eth_vlan_rx_add_vid(struct net_device *ndev, u16 vid)
+{
+       struct sh_eth_private *mdp = netdev_priv(ndev);
+       int vtag_reg_index = sh_eth_get_vtag_index(mdp);
+
+       if (unlikely(!mdp->cd->tsu))
+               return -EPERM;
+
+       /* No filtering if vid = 0 */
+       if (!vid)
+               return 0;
+
+       mdp->vlan_num_ids++;
+
+       /*
+        * The controller has one VLAN tag HW filter. So, if the filter is
+        * already enabled, the driver disables it and the filte
+        */
+       if (mdp->vlan_num_ids > 1) {
+               /* disable VLAN filter */
+               sh_eth_tsu_write(mdp, 0, vtag_reg_index);
+               return 0;
+       }
+
+       sh_eth_tsu_write(mdp, TSU_VTAG_ENABLE | (vid & TSU_VTAG_VID_MASK),
+                        vtag_reg_index);
+
+       return 0;
+}
+
+static int sh_eth_vlan_rx_kill_vid(struct net_device *ndev, u16 vid)
+{
+       struct sh_eth_private *mdp = netdev_priv(ndev);
+       int vtag_reg_index = sh_eth_get_vtag_index(mdp);
+
+       if (unlikely(!mdp->cd->tsu))
+               return -EPERM;
+
+       /* No filtering if vid = 0 */
+       if (!vid)
+               return 0;
+
+       mdp->vlan_num_ids--;
+       sh_eth_tsu_write(mdp, 0, vtag_reg_index);
+
+       return 0;
 }
 #endif /* SH_ETH_HAS_TSU */
 
@@ -1768,6 +2093,8 @@ static const struct net_device_ops sh_eth_netdev_ops = {
        .ndo_get_stats          = sh_eth_get_stats,
 #if defined(SH_ETH_HAS_TSU)
        .ndo_set_rx_mode        = sh_eth_set_multicast_list,
+       .ndo_vlan_rx_add_vid    = sh_eth_vlan_rx_add_vid,
+       .ndo_vlan_rx_kill_vid   = sh_eth_vlan_rx_kill_vid,
 #endif
        .ndo_tx_timeout         = sh_eth_tx_timeout,
        .ndo_do_ioctl           = sh_eth_do_ioctl,
@@ -1794,7 +2121,6 @@ static int sh_eth_drv_probe(struct platform_device *pdev)
 
        ndev = alloc_etherdev(sizeof(struct sh_eth_private));
        if (!ndev) {
-               dev_err(&pdev->dev, "Could not allocate device.\n");
                ret = -ENOMEM;
                goto out;
        }
@@ -1862,18 +2188,22 @@ static int sh_eth_drv_probe(struct platform_device *pdev)
        /* read and set MAC address */
        read_mac_address(ndev, pd->mac_addr);
 
-       /* First device only init */
-       if (!devno) {
-               if (mdp->cd->tsu) {
-                       struct resource *rtsu;
-                       rtsu = platform_get_resource(pdev, IORESOURCE_MEM, 1);
-                       if (!rtsu) {
-                               dev_err(&pdev->dev, "Not found TSU resource\n");
-                               goto out_release;
-                       }
-                       mdp->tsu_addr = ioremap(rtsu->start,
-                                               resource_size(rtsu));
+       /* ioremap the TSU registers */
+       if (mdp->cd->tsu) {
+               struct resource *rtsu;
+               rtsu = platform_get_resource(pdev, IORESOURCE_MEM, 1);
+               if (!rtsu) {
+                       dev_err(&pdev->dev, "Not found TSU resource\n");
+                       goto out_release;
                }
+               mdp->tsu_addr = ioremap(rtsu->start,
+                                       resource_size(rtsu));
+               mdp->port = devno % 2;
+               ndev->features = NETIF_F_HW_VLAN_FILTER;
+       }
+
+       /* initialize first or needed device */
+       if (!devno || pd->needs_init) {
                if (mdp->cd->chip_reset)
                        mdp->cd->chip_reset(ndev);
 
@@ -1922,7 +2252,8 @@ static int sh_eth_drv_remove(struct platform_device *pdev)
        struct net_device *ndev = platform_get_drvdata(pdev);
        struct sh_eth_private *mdp = netdev_priv(ndev);
 
-       iounmap(mdp->tsu_addr);
+       if (mdp->cd->tsu)
+               iounmap(mdp->tsu_addr);
        sh_mdio_release(ndev);
        unregister_netdev(ndev);
        pm_runtime_disable(&pdev->dev);
index cdbd844..57dc262 100644 (file)
@@ -29,6 +29,8 @@
 #define RX_RING_SIZE   64      /* Rx ring size */
 #define ETHERSMALL             60
 #define PKT_BUF_SZ             1538
+#define SH_ETH_TSU_TIMEOUT_MS  500
+#define SH_ETH_TSU_CAM_ENTRIES 32
 
 enum {
        /* E-DMAC registers */
@@ -677,6 +679,10 @@ enum TSU_FWSLC_BIT {
        TSU_FWSLC_CAMSEL11 = 0x0002, TSU_FWSLC_CAMSEL10 = 0x0001,
 };
 
+/* TSU_VTAGn */
+#define TSU_VTAG_ENABLE                0x80000000
+#define TSU_VTAG_VID_MASK      0x00000fff
+
 /*
  * The sh ether Tx buffer descriptors.
  * This structure should be 20 bytes.
@@ -759,7 +765,6 @@ struct sh_eth_private {
        struct sh_eth_txdesc *tx_ring;
        struct sk_buff **rx_skbuff;
        struct sk_buff **tx_skbuff;
-       struct net_device_stats stats;
        struct timer_list timer;
        spinlock_t lock;
        u32 cur_rx, dirty_rx;   /* Producer/consumer ring indices */
@@ -779,6 +784,8 @@ struct sh_eth_private {
        char post_rx;           /* POST receive */
        char post_fw;           /* POST forward */
        struct net_device_stats tsu_stats;      /* TSU forward status */
+       int port;               /* for TSU */
+       int vlan_num_ids;       /* for VLAN tag filter */
 
        unsigned no_ether_link:1;
        unsigned ether_link_active_low:1;
@@ -812,6 +819,12 @@ static inline unsigned long sh_eth_read(struct net_device *ndev,
        return ioread32(mdp->addr + mdp->reg_offset[enum_index]);
 }
 
+static inline void *sh_eth_tsu_get_offset(struct sh_eth_private *mdp,
+                                         int enum_index)
+{
+       return mdp->tsu_addr + mdp->reg_offset[enum_index];
+}
+
 static inline void sh_eth_tsu_write(struct sh_eth_private *mdp,
                                unsigned long data, int enum_index)
 {
index 22e9c01..1895605 100644 (file)
@@ -370,12 +370,13 @@ struct s6gmac {
        } link;
 };
 
-static void s6gmac_rx_fillfifo(struct s6gmac *pd)
+static void s6gmac_rx_fillfifo(struct net_device *dev)
 {
+       struct s6gmac *pd = netdev_priv(dev);
        struct sk_buff *skb;
        while ((((u8)(pd->rx_skb_i - pd->rx_skb_o)) < S6_NUM_RX_SKB) &&
               (!s6dmac_fifo_full(pd->rx_dma, pd->rx_chan)) &&
-              (skb = dev_alloc_skb(S6_MAX_FRLEN + 2))) {
+              (skb = netdev_alloc_skb(dev, S6_MAX_FRLEN + 2))) {
                pd->rx_skb[(pd->rx_skb_i++) % S6_NUM_RX_SKB] = skb;
                s6dmac_put_fifo_cache(pd->rx_dma, pd->rx_chan,
                        pd->io, (u32)skb->data, S6_MAX_FRLEN);
@@ -514,7 +515,7 @@ static irqreturn_t s6gmac_interrupt(int irq, void *dev_id)
        spin_lock(&pd->lock);
        if (s6dmac_termcnt_irq(pd->rx_dma, pd->rx_chan))
                s6gmac_rx_interrupt(dev);
-       s6gmac_rx_fillfifo(pd);
+       s6gmac_rx_fillfifo(dev);
        if (s6dmac_termcnt_irq(pd->tx_dma, pd->tx_chan))
                s6gmac_tx_interrupt(dev);
        s6gmac_stats_interrupt(pd, 0);
@@ -894,7 +895,7 @@ static int s6gmac_open(struct net_device *dev)
        s6gmac_init_device(dev);
        s6gmac_init_stats(dev);
        s6gmac_init_dmac(dev);
-       s6gmac_rx_fillfifo(pd);
+       s6gmac_rx_fillfifo(dev);
        s6dmac_enable_chan(pd->rx_dma, pd->rx_chan,
                2, 1, 0, 1, 0, 0, 0, 7, -1, 2, 0, 1);
        s6dmac_enable_chan(pd->tx_dma, pd->tx_chan,
@@ -960,11 +961,11 @@ static int __devinit s6gmac_probe(struct platform_device *pdev)
        int res;
        unsigned long i;
        struct mii_bus *mb;
+
        dev = alloc_etherdev(sizeof(*pd));
-       if (!dev) {
-               printk(KERN_ERR DRV_PRMT "etherdev alloc failed, aborting.\n");
+       if (!dev)
                return -ENOMEM;
-       }
+
        dev->open = s6gmac_open;
        dev->stop = s6gmac_stop;
        dev->hard_start_xmit = s6gmac_tx;
index 893c880..7b819bd 100644 (file)
@@ -643,7 +643,7 @@ if (next_ptr < RX_START || next_ptr >= RX_END) {
                        if (next_ptr <= this_ptr)
                                length += RX_END - RX_START;
 
-                       skb = dev_alloc_skb(length + 2);
+                       skb = netdev_alloc_skb(dev, length + 2);
                        if (skb) {
                                unsigned char *buf;
 
index 6056145..7989907 100644 (file)
@@ -548,7 +548,7 @@ static void seeq8005_rx(struct net_device *dev)
                        struct sk_buff *skb;
                        unsigned char *buf;
 
-                       skb = dev_alloc_skb(pkt_len);
+                       skb = netdev_alloc_skb(dev, pkt_len);
                        if (skb == NULL) {
                                printk("%s: Memory squeeze, dropping packet.\n", dev->name);
                                dev->stats.rx_dropped++;
index f955a19..bb8c822 100644 (file)
@@ -733,7 +733,6 @@ static int __devinit sgiseeq_probe(struct platform_device *pdev)
 
        dev = alloc_etherdev(sizeof (struct sgiseeq_private));
        if (!dev) {
-               printk(KERN_ERR "Sgiseeq: Etherdev alloc failed, aborting.\n");
                err = -ENOMEM;
                goto err_out;
        }
index 5d18841..fb3cbc2 100644 (file)
@@ -16,6 +16,21 @@ config SFC_MTD
        depends on SFC && MTD && !(SFC=y && MTD=m)
        default y
        ---help---
-         This exposes the on-board flash memory as MTD devices (e.g.
-         /dev/mtd1).  This makes it possible to upload new firmware
-         to the NIC.
+         This exposes the on-board flash and/or EEPROM as MTD devices
+         (e.g. /dev/mtd1).  This is required to update the firmware or
+         the boot configuration under Linux.
+config SFC_MCDI_MON
+       bool "Solarflare SFC9000-family hwmon support"
+       depends on SFC && HWMON && !(SFC=y && HWMON=m)
+       default y
+       ----help---
+         This exposes the on-board firmware-managed sensors as a
+         hardware monitor device.
+config SFC_SRIOV
+       bool "Solarflare SFC9000-family SR-IOV support"
+       depends on SFC && PCI_IOV
+       default y
+       ---help---
+         This enables support for the SFC9000 I/O Virtualization
+         features, allowing accelerated network performance in
+         virtualized environments.
index ab31c71..ea1f8db 100644 (file)
@@ -2,7 +2,8 @@ sfc-y                   += efx.o nic.o falcon.o siena.o tx.o rx.o filter.o \
                           falcon_xmac.o mcdi_mac.o \
                           selftest.o ethtool.o qt202x_phy.o mdio_10g.o \
                           tenxpress.o txc43128_phy.o falcon_boards.o \
-                          mcdi.o mcdi_phy.o
+                          mcdi.o mcdi_phy.o mcdi_mon.o
 sfc-$(CONFIG_SFC_MTD)  += mtd.o
+sfc-$(CONFIG_SFC_SRIOV)        += siena_sriov.o
 
 obj-$(CONFIG_SFC)      += sfc.o
index 098ac2a..b26a954 100644 (file)
@@ -448,40 +448,40 @@ typedef union efx_oword {
        EFX_INSERT32(min, max, low, high, EFX_MASK32(high + 1 - low))
 
 #define EFX_SET_OWORD64(oword, low, high, value) do {                  \
-       (oword).u64[0] = (((oword).u64[0]                               \
+       (oword).u64[0] = (((oword).u64[0]                               \
                           & ~EFX_INPLACE_MASK64(0,  63, low, high))    \
                          | EFX_INSERT64(0,  63, low, high, value));    \
-       (oword).u64[1] = (((oword).u64[1]                               \
+       (oword).u64[1] = (((oword).u64[1]                               \
                           & ~EFX_INPLACE_MASK64(64, 127, low, high))   \
                          | EFX_INSERT64(64, 127, low, high, value));   \
        } while (0)
 
 #define EFX_SET_QWORD64(qword, low, high, value) do {                  \
-       (qword).u64[0] = (((qword).u64[0]                               \
+       (qword).u64[0] = (((qword).u64[0]                               \
                           & ~EFX_INPLACE_MASK64(0, 63, low, high))     \
                          | EFX_INSERT64(0, 63, low, high, value));     \
        } while (0)
 
 #define EFX_SET_OWORD32(oword, low, high, value) do {                  \
-       (oword).u32[0] = (((oword).u32[0]                               \
+       (oword).u32[0] = (((oword).u32[0]                               \
                           & ~EFX_INPLACE_MASK32(0, 31, low, high))     \
                          | EFX_INSERT32(0, 31, low, high, value));     \
-       (oword).u32[1] = (((oword).u32[1]                               \
+       (oword).u32[1] = (((oword).u32[1]                               \
                           & ~EFX_INPLACE_MASK32(32, 63, low, high))    \
                          | EFX_INSERT32(32, 63, low, high, value));    \
-       (oword).u32[2] = (((oword).u32[2]                               \
+       (oword).u32[2] = (((oword).u32[2]                               \
                           & ~EFX_INPLACE_MASK32(64, 95, low, high))    \
                          | EFX_INSERT32(64, 95, low, high, value));    \
-       (oword).u32[3] = (((oword).u32[3]                               \
+       (oword).u32[3] = (((oword).u32[3]                               \
                           & ~EFX_INPLACE_MASK32(96, 127, low, high))   \
                          | EFX_INSERT32(96, 127, low, high, value));   \
        } while (0)
 
 #define EFX_SET_QWORD32(qword, low, high, value) do {                  \
-       (qword).u32[0] = (((qword).u32[0]                               \
+       (qword).u32[0] = (((qword).u32[0]                               \
                           & ~EFX_INPLACE_MASK32(0, 31, low, high))     \
                          | EFX_INSERT32(0, 31, low, high, value));     \
-       (qword).u32[1] = (((qword).u32[1]                               \
+       (qword).u32[1] = (((qword).u32[1]                               \
                           & ~EFX_INPLACE_MASK32(32, 63, low, high))    \
                          | EFX_INSERT32(32, 63, low, high, value));    \
        } while (0)
@@ -531,8 +531,8 @@ typedef union efx_oword {
 
 
 /* Static initialiser */
-#define EFX_OWORD32(a, b, c, d)                                                \
-       { .u32 = { cpu_to_le32(a), cpu_to_le32(b), \
+#define EFX_OWORD32(a, b, c, d)                                \
+       { .u32 = { cpu_to_le32(a), cpu_to_le32(b),      \
                   cpu_to_le32(c), cpu_to_le32(d) } }
 
 #endif /* EFX_BITFIELD_H */
index e43702f..1908ba7 100644 (file)
 
 /* Loopback mode names (see LOOPBACK_MODE()) */
 const unsigned int efx_loopback_mode_max = LOOPBACK_MAX;
-const char *efx_loopback_mode_names[] = {
+const char *const efx_loopback_mode_names[] = {
        [LOOPBACK_NONE]         = "NONE",
        [LOOPBACK_DATA]         = "DATAPATH",
        [LOOPBACK_GMAC]         = "GMAC",
        [LOOPBACK_XGMII]        = "XGMII",
        [LOOPBACK_XGXS]         = "XGXS",
-       [LOOPBACK_XAUI]         = "XAUI",
-       [LOOPBACK_GMII]         = "GMII",
-       [LOOPBACK_SGMII]        = "SGMII",
+       [LOOPBACK_XAUI]         = "XAUI",
+       [LOOPBACK_GMII]         = "GMII",
+       [LOOPBACK_SGMII]        = "SGMII",
        [LOOPBACK_XGBR]         = "XGBR",
        [LOOPBACK_XFI]          = "XFI",
        [LOOPBACK_XAUI_FAR]     = "XAUI_FAR",
@@ -55,21 +55,21 @@ const char *efx_loopback_mode_names[] = {
        [LOOPBACK_XFI_FAR]      = "XFI_FAR",
        [LOOPBACK_GPHY]         = "GPHY",
        [LOOPBACK_PHYXS]        = "PHYXS",
-       [LOOPBACK_PCS]          = "PCS",
-       [LOOPBACK_PMAPMD]       = "PMA/PMD",
+       [LOOPBACK_PCS]          = "PCS",
+       [LOOPBACK_PMAPMD]       = "PMA/PMD",
        [LOOPBACK_XPORT]        = "XPORT",
        [LOOPBACK_XGMII_WS]     = "XGMII_WS",
-       [LOOPBACK_XAUI_WS]      = "XAUI_WS",
+       [LOOPBACK_XAUI_WS]      = "XAUI_WS",
        [LOOPBACK_XAUI_WS_FAR]  = "XAUI_WS_FAR",
        [LOOPBACK_XAUI_WS_NEAR] = "XAUI_WS_NEAR",
-       [LOOPBACK_GMII_WS]      = "GMII_WS",
+       [LOOPBACK_GMII_WS]      = "GMII_WS",
        [LOOPBACK_XFI_WS]       = "XFI_WS",
        [LOOPBACK_XFI_WS_FAR]   = "XFI_WS_FAR",
-       [LOOPBACK_PHYXS_WS]     = "PHYXS_WS",
+       [LOOPBACK_PHYXS_WS]     = "PHYXS_WS",
 };
 
 const unsigned int efx_reset_type_max = RESET_TYPE_MAX;
-const char *efx_reset_type_names[] = {
+const char *const efx_reset_type_names[] = {
        [RESET_TYPE_INVISIBLE]     = "INVISIBLE",
        [RESET_TYPE_ALL]           = "ALL",
        [RESET_TYPE_WORLD]         = "WORLD",
@@ -122,15 +122,6 @@ static int napi_weight = 64;
  */
 static unsigned int efx_monitor_interval = 1 * HZ;
 
-/* This controls whether or not the driver will initialise devices
- * with invalid MAC addresses stored in the EEPROM or flash.  If true,
- * such devices will be initialised with a random locally-generated
- * MAC address.  This allows for loading the sfc_mtd driver to
- * reprogram the flash, even if the flash contents (including the MAC
- * address) have previously been erased.
- */
-static unsigned int allow_bad_hwaddr;
-
 /* Initial interrupt moderation settings.  They can be modified after
  * module load with ethtool.
  *
@@ -162,7 +153,7 @@ static unsigned int interrupt_mode;
  * interrupt handling.
  *
  * Cards without MSI-X will only target one CPU via legacy or MSI interrupt.
- * The default (0) means to assign an interrupt to each package (level II cache)
+ * The default (0) means to assign an interrupt to each core.
  */
 static unsigned int rss_cpus;
 module_param(rss_cpus, uint, 0444);
@@ -195,9 +186,13 @@ MODULE_PARM_DESC(debug, "Bitmapped debugging message enable value");
  *
  *************************************************************************/
 
+static void efx_start_interrupts(struct efx_nic *efx, bool may_keep_eventq);
+static void efx_stop_interrupts(struct efx_nic *efx, bool may_keep_eventq);
+static void efx_remove_channel(struct efx_channel *channel);
 static void efx_remove_channels(struct efx_nic *efx);
+static const struct efx_channel_type efx_default_channel_type;
 static void efx_remove_port(struct efx_nic *efx);
-static void efx_init_napi(struct efx_nic *efx);
+static void efx_init_napi_channel(struct efx_channel *channel);
 static void efx_fini_napi(struct efx_nic *efx);
 static void efx_fini_napi_channel(struct efx_channel *channel);
 static void efx_fini_struct(struct efx_nic *efx);
@@ -226,27 +221,27 @@ static void efx_stop_all(struct efx_nic *efx);
  */
 static int efx_process_channel(struct efx_channel *channel, int budget)
 {
-       struct efx_nic *efx = channel->efx;
        int spent;
 
-       if (unlikely(efx->reset_pending || !channel->enabled))
+       if (unlikely(!channel->enabled))
                return 0;
 
        spent = efx_nic_process_eventq(channel, budget);
-       if (spent == 0)
-               return 0;
-
-       /* Deliver last RX packet. */
-       if (channel->rx_pkt) {
-               __efx_rx_packet(channel, channel->rx_pkt,
-                               channel->rx_pkt_csummed);
-               channel->rx_pkt = NULL;
+       if (spent && efx_channel_has_rx_queue(channel)) {
+               struct efx_rx_queue *rx_queue =
+                       efx_channel_get_rx_queue(channel);
+
+               /* Deliver last RX packet. */
+               if (channel->rx_pkt) {
+                       __efx_rx_packet(channel, channel->rx_pkt);
+                       channel->rx_pkt = NULL;
+               }
+               if (rx_queue->enabled) {
+                       efx_rx_strategy(channel);
+                       efx_fast_push_rx_descriptors(rx_queue);
+               }
        }
 
-       efx_rx_strategy(channel);
-
-       efx_fast_push_rx_descriptors(efx_channel_get_rx_queue(channel));
-
        return spent;
 }
 
@@ -286,7 +281,7 @@ static int efx_poll(struct napi_struct *napi, int budget)
        spent = efx_process_channel(channel, budget);
 
        if (spent < budget) {
-               if (channel->channel < efx->n_rx_channels &&
+               if (efx_channel_has_rx_queue(channel) &&
                    efx->irq_rx_adaptive &&
                    unlikely(++channel->irq_count == 1000)) {
                        if (unlikely(channel->irq_mod_score <
@@ -373,7 +368,7 @@ static int efx_probe_eventq(struct efx_channel *channel)
        struct efx_nic *efx = channel->efx;
        unsigned long entries;
 
-       netif_dbg(channel->efx, probe, channel->efx->net_dev,
+       netif_dbg(efx, probe, efx->net_dev,
                  "chan %d create event queue\n", channel->channel);
 
        /* Build an event queue with room for one event per tx and rx buffer,
@@ -396,6 +391,34 @@ static void efx_init_eventq(struct efx_channel *channel)
        efx_nic_init_eventq(channel);
 }
 
+/* Enable event queue processing and NAPI */
+static void efx_start_eventq(struct efx_channel *channel)
+{
+       netif_dbg(channel->efx, ifup, channel->efx->net_dev,
+                 "chan %d start event queue\n", channel->channel);
+
+       /* The interrupt handler for this channel may set work_pending
+        * as soon as we enable it.  Make sure it's cleared before
+        * then.  Similarly, make sure it sees the enabled flag set.
+        */
+       channel->work_pending = false;
+       channel->enabled = true;
+       smp_wmb();
+
+       napi_enable(&channel->napi_str);
+       efx_nic_eventq_read_ack(channel);
+}
+
+/* Disable event queue processing and NAPI */
+static void efx_stop_eventq(struct efx_channel *channel)
+{
+       if (!channel->enabled)
+               return;
+
+       napi_disable(&channel->napi_str);
+       channel->enabled = false;
+}
+
 static void efx_fini_eventq(struct efx_channel *channel)
 {
        netif_dbg(channel->efx, drv, channel->efx->net_dev,
@@ -418,8 +441,7 @@ static void efx_remove_eventq(struct efx_channel *channel)
  *
  *************************************************************************/
 
-/* Allocate and initialise a channel structure, optionally copying
- * parameters (but not resources) from an old channel structure. */
+/* Allocate and initialise a channel structure. */
 static struct efx_channel *
 efx_alloc_channel(struct efx_nic *efx, int i, struct efx_channel *old_channel)
 {
@@ -428,45 +450,60 @@ efx_alloc_channel(struct efx_nic *efx, int i, struct efx_channel *old_channel)
        struct efx_tx_queue *tx_queue;
        int j;
 
-       if (old_channel) {
-               channel = kmalloc(sizeof(*channel), GFP_KERNEL);
-               if (!channel)
-                       return NULL;
+       channel = kzalloc(sizeof(*channel), GFP_KERNEL);
+       if (!channel)
+               return NULL;
 
-               *channel = *old_channel;
+       channel->efx = efx;
+       channel->channel = i;
+       channel->type = &efx_default_channel_type;
 
-               channel->napi_dev = NULL;
-               memset(&channel->eventq, 0, sizeof(channel->eventq));
+       for (j = 0; j < EFX_TXQ_TYPES; j++) {
+               tx_queue = &channel->tx_queue[j];
+               tx_queue->efx = efx;
+               tx_queue->queue = i * EFX_TXQ_TYPES + j;
+               tx_queue->channel = channel;
+       }
 
-               rx_queue = &channel->rx_queue;
-               rx_queue->buffer = NULL;
-               memset(&rx_queue->rxd, 0, sizeof(rx_queue->rxd));
+       rx_queue = &channel->rx_queue;
+       rx_queue->efx = efx;
+       setup_timer(&rx_queue->slow_fill, efx_rx_slow_fill,
+                   (unsigned long)rx_queue);
 
-               for (j = 0; j < EFX_TXQ_TYPES; j++) {
-                       tx_queue = &channel->tx_queue[j];
-                       if (tx_queue->channel)
-                               tx_queue->channel = channel;
-                       tx_queue->buffer = NULL;
-                       memset(&tx_queue->txd, 0, sizeof(tx_queue->txd));
-               }
-       } else {
-               channel = kzalloc(sizeof(*channel), GFP_KERNEL);
-               if (!channel)
-                       return NULL;
+       return channel;
+}
+
+/* Allocate and initialise a channel structure, copying parameters
+ * (but not resources) from an old channel structure.
+ */
+static struct efx_channel *
+efx_copy_channel(const struct efx_channel *old_channel)
+{
+       struct efx_channel *channel;
+       struct efx_rx_queue *rx_queue;
+       struct efx_tx_queue *tx_queue;
+       int j;
+
+       channel = kmalloc(sizeof(*channel), GFP_KERNEL);
+       if (!channel)
+               return NULL;
 
-               channel->efx = efx;
-               channel->channel = i;
+       *channel = *old_channel;
 
-               for (j = 0; j < EFX_TXQ_TYPES; j++) {
-                       tx_queue = &channel->tx_queue[j];
-                       tx_queue->efx = efx;
-                       tx_queue->queue = i * EFX_TXQ_TYPES + j;
+       channel->napi_dev = NULL;
+       memset(&channel->eventq, 0, sizeof(channel->eventq));
+
+       for (j = 0; j < EFX_TXQ_TYPES; j++) {
+               tx_queue = &channel->tx_queue[j];
+               if (tx_queue->channel)
                        tx_queue->channel = channel;
-               }
+               tx_queue->buffer = NULL;
+               memset(&tx_queue->txd, 0, sizeof(tx_queue->txd));
        }
 
        rx_queue = &channel->rx_queue;
-       rx_queue->efx = efx;
+       rx_queue->buffer = NULL;
+       memset(&rx_queue->rxd, 0, sizeof(rx_queue->rxd));
        setup_timer(&rx_queue->slow_fill, efx_rx_slow_fill,
                    (unsigned long)rx_queue);
 
@@ -482,57 +519,62 @@ static int efx_probe_channel(struct efx_channel *channel)
        netif_dbg(channel->efx, probe, channel->efx->net_dev,
                  "creating channel %d\n", channel->channel);
 
+       rc = channel->type->pre_probe(channel);
+       if (rc)
+               goto fail;
+
        rc = efx_probe_eventq(channel);
        if (rc)
-               goto fail1;
+               goto fail;
 
        efx_for_each_channel_tx_queue(tx_queue, channel) {
                rc = efx_probe_tx_queue(tx_queue);
                if (rc)
-                       goto fail2;
+                       goto fail;
        }
 
        efx_for_each_channel_rx_queue(rx_queue, channel) {
                rc = efx_probe_rx_queue(rx_queue);
                if (rc)
-                       goto fail3;
+                       goto fail;
        }
 
        channel->n_rx_frm_trunc = 0;
 
        return 0;
 
- fail3:
-       efx_for_each_channel_rx_queue(rx_queue, channel)
-               efx_remove_rx_queue(rx_queue);
- fail2:
-       efx_for_each_channel_tx_queue(tx_queue, channel)
-               efx_remove_tx_queue(tx_queue);
- fail1:
+fail:
+       efx_remove_channel(channel);
        return rc;
 }
 
+static void
+efx_get_channel_name(struct efx_channel *channel, char *buf, size_t len)
+{
+       struct efx_nic *efx = channel->efx;
+       const char *type;
+       int number;
+
+       number = channel->channel;
+       if (efx->tx_channel_offset == 0) {
+               type = "";
+       } else if (channel->channel < efx->tx_channel_offset) {
+               type = "-rx";
+       } else {
+               type = "-tx";
+               number -= efx->tx_channel_offset;
+       }
+       snprintf(buf, len, "%s%s-%d", efx->name, type, number);
+}
 
 static void efx_set_channel_names(struct efx_nic *efx)
 {
        struct efx_channel *channel;
-       const char *type = "";
-       int number;
 
-       efx_for_each_channel(channel, efx) {
-               number = channel->channel;
-               if (efx->n_channels > efx->n_rx_channels) {
-                       if (channel->channel < efx->n_rx_channels) {
-                               type = "-rx";
-                       } else {
-                               type = "-tx";
-                               number -= efx->n_rx_channels;
-                       }
-               }
-               snprintf(efx->channel_name[channel->channel],
-                        sizeof(efx->channel_name[0]),
-                        "%s%s-%d", efx->name, type, number);
-       }
+       efx_for_each_channel(channel, efx)
+               channel->type->get_name(channel,
+                                       efx->channel_name[channel->channel],
+                                       sizeof(efx->channel_name[0]));
 }
 
 static int efx_probe_channels(struct efx_nic *efx)
@@ -543,7 +585,12 @@ static int efx_probe_channels(struct efx_nic *efx)
        /* Restart special buffer allocation */
        efx->next_buffer_table = 0;
 
-       efx_for_each_channel(channel, efx) {
+       /* Probe channels in reverse, so that any 'extra' channels
+        * use the start of the buffer table. This allows the traffic
+        * channels to be resized without moving them or wasting the
+        * entries before them.
+        */
+       efx_for_each_channel_rev(channel, efx) {
                rc = efx_probe_channel(channel);
                if (rc) {
                        netif_err(efx, probe, efx->net_dev,
@@ -565,7 +612,7 @@ fail:
  * to propagate configuration changes (mtu, checksum offload), or
  * to clear hardware error conditions
  */
-static void efx_init_channels(struct efx_nic *efx)
+static void efx_start_datapath(struct efx_nic *efx)
 {
        struct efx_tx_queue *tx_queue;
        struct efx_rx_queue *rx_queue;
@@ -584,68 +631,26 @@ static void efx_init_channels(struct efx_nic *efx)
 
        /* Initialise the channels */
        efx_for_each_channel(channel, efx) {
-               netif_dbg(channel->efx, drv, channel->efx->net_dev,
-                         "init chan %d\n", channel->channel);
-
-               efx_init_eventq(channel);
-
                efx_for_each_channel_tx_queue(tx_queue, channel)
                        efx_init_tx_queue(tx_queue);
 
                /* The rx buffer allocation strategy is MTU dependent */
                efx_rx_strategy(channel);
 
-               efx_for_each_channel_rx_queue(rx_queue, channel)
+               efx_for_each_channel_rx_queue(rx_queue, channel) {
                        efx_init_rx_queue(rx_queue);
+                       efx_nic_generate_fill_event(rx_queue);
+               }
 
                WARN_ON(channel->rx_pkt != NULL);
                efx_rx_strategy(channel);
        }
-}
-
-/* This enables event queue processing and packet transmission.
- *
- * Note that this function is not allowed to fail, since that would
- * introduce too much complexity into the suspend/resume path.
- */
-static void efx_start_channel(struct efx_channel *channel)
-{
-       struct efx_rx_queue *rx_queue;
 
-       netif_dbg(channel->efx, ifup, channel->efx->net_dev,
-                 "starting chan %d\n", channel->channel);
-
-       /* The interrupt handler for this channel may set work_pending
-        * as soon as we enable it.  Make sure it's cleared before
-        * then.  Similarly, make sure it sees the enabled flag set. */
-       channel->work_pending = false;
-       channel->enabled = true;
-       smp_wmb();
-
-       /* Fill the queues before enabling NAPI */
-       efx_for_each_channel_rx_queue(rx_queue, channel)
-               efx_fast_push_rx_descriptors(rx_queue);
-
-       napi_enable(&channel->napi_str);
-}
-
-/* This disables event queue processing and packet transmission.
- * This function does not guarantee that all queue processing
- * (e.g. RX refill) is complete.
- */
-static void efx_stop_channel(struct efx_channel *channel)
-{
-       if (!channel->enabled)
-               return;
-
-       netif_dbg(channel->efx, ifdown, channel->efx->net_dev,
-                 "stop chan %d\n", channel->channel);
-
-       channel->enabled = false;
-       napi_disable(&channel->napi_str);
+       if (netif_device_present(efx->net_dev))
+               netif_tx_wake_all_queues(efx->net_dev);
 }
 
-static void efx_fini_channels(struct efx_nic *efx)
+static void efx_stop_datapath(struct efx_nic *efx)
 {
        struct efx_channel *channel;
        struct efx_tx_queue *tx_queue;
@@ -672,14 +677,21 @@ static void efx_fini_channels(struct efx_nic *efx)
        }
 
        efx_for_each_channel(channel, efx) {
-               netif_dbg(channel->efx, drv, channel->efx->net_dev,
-                         "shut down chan %d\n", channel->channel);
+               /* RX packet processing is pipelined, so wait for the
+                * NAPI handler to complete.  At least event queue 0
+                * might be kept active by non-data events, so don't
+                * use napi_synchronize() but actually disable NAPI
+                * temporarily.
+                */
+               if (efx_channel_has_rx_queue(channel)) {
+                       efx_stop_eventq(channel);
+                       efx_start_eventq(channel);
+               }
 
                efx_for_each_channel_rx_queue(rx_queue, channel)
                        efx_fini_rx_queue(rx_queue);
                efx_for_each_possible_channel_tx_queue(tx_queue, channel)
                        efx_fini_tx_queue(tx_queue);
-               efx_fini_eventq(channel);
        }
 }
 
@@ -711,16 +723,40 @@ efx_realloc_channels(struct efx_nic *efx, u32 rxq_entries, u32 txq_entries)
 {
        struct efx_channel *other_channel[EFX_MAX_CHANNELS], *channel;
        u32 old_rxq_entries, old_txq_entries;
-       unsigned i;
-       int rc;
+       unsigned i, next_buffer_table = 0;
+       int rc = 0;
+
+       /* Not all channels should be reallocated. We must avoid
+        * reallocating their buffer table entries.
+        */
+       efx_for_each_channel(channel, efx) {
+               struct efx_rx_queue *rx_queue;
+               struct efx_tx_queue *tx_queue;
+
+               if (channel->type->copy)
+                       continue;
+               next_buffer_table = max(next_buffer_table,
+                                       channel->eventq.index +
+                                       channel->eventq.entries);
+               efx_for_each_channel_rx_queue(rx_queue, channel)
+                       next_buffer_table = max(next_buffer_table,
+                                               rx_queue->rxd.index +
+                                               rx_queue->rxd.entries);
+               efx_for_each_channel_tx_queue(tx_queue, channel)
+                       next_buffer_table = max(next_buffer_table,
+                                               tx_queue->txd.index +
+                                               tx_queue->txd.entries);
+       }
 
        efx_stop_all(efx);
-       efx_fini_channels(efx);
+       efx_stop_interrupts(efx, true);
 
-       /* Clone channels */
+       /* Clone channels (where possible) */
        memset(other_channel, 0, sizeof(other_channel));
        for (i = 0; i < efx->n_channels; i++) {
-               channel = efx_alloc_channel(efx, i, efx->channel[i]);
+               channel = efx->channel[i];
+               if (channel->type->copy)
+                       channel = channel->type->copy(channel);
                if (!channel) {
                        rc = -ENOMEM;
                        goto out;
@@ -739,23 +775,31 @@ efx_realloc_channels(struct efx_nic *efx, u32 rxq_entries, u32 txq_entries)
                other_channel[i] = channel;
        }
 
-       rc = efx_probe_channels(efx);
-       if (rc)
-               goto rollback;
+       /* Restart buffer table allocation */
+       efx->next_buffer_table = next_buffer_table;
 
-       efx_init_napi(efx);
-
-       /* Destroy old channels */
        for (i = 0; i < efx->n_channels; i++) {
-               efx_fini_napi_channel(other_channel[i]);
-               efx_remove_channel(other_channel[i]);
+               channel = efx->channel[i];
+               if (!channel->type->copy)
+                       continue;
+               rc = efx_probe_channel(channel);
+               if (rc)
+                       goto rollback;
+               efx_init_napi_channel(efx->channel[i]);
        }
+
 out:
-       /* Free unused channel structures */
-       for (i = 0; i < efx->n_channels; i++)
-               kfree(other_channel[i]);
+       /* Destroy unused channel structures */
+       for (i = 0; i < efx->n_channels; i++) {
+               channel = other_channel[i];
+               if (channel && channel->type->copy) {
+                       efx_fini_napi_channel(channel);
+                       efx_remove_channel(channel);
+                       kfree(channel);
+               }
+       }
 
-       efx_init_channels(efx);
+       efx_start_interrupts(efx, true);
        efx_start_all(efx);
        return rc;
 
@@ -776,6 +820,18 @@ void efx_schedule_slow_fill(struct efx_rx_queue *rx_queue)
        mod_timer(&rx_queue->slow_fill, jiffies + msecs_to_jiffies(100));
 }
 
+static const struct efx_channel_type efx_default_channel_type = {
+       .pre_probe              = efx_channel_dummy_op_int,
+       .get_name               = efx_get_channel_name,
+       .copy                   = efx_copy_channel,
+       .keep_eventq            = false,
+};
+
+int efx_channel_dummy_op_int(struct efx_channel *channel)
+{
+       return 0;
+}
+
 /**************************************************************************
  *
  * Port handling
@@ -807,16 +863,14 @@ void efx_link_status_changed(struct efx_nic *efx)
        }
 
        /* Status message for kernel log */
-       if (link_state->up) {
+       if (link_state->up)
                netif_info(efx, link, efx->net_dev,
                           "link up at %uMbps %s-duplex (MTU %d)%s\n",
                           link_state->speed, link_state->fd ? "full" : "half",
                           efx->net_dev->mtu,
                           (efx->promiscuous ? " [PROMISC]" : ""));
-       } else {
+       else
                netif_info(efx, link, efx->net_dev, "link down\n");
-       }
-
 }
 
 void efx_link_set_advertising(struct efx_nic *efx, u32 advertising)
@@ -863,11 +917,9 @@ int __efx_reconfigure_port(struct efx_nic *efx)
 
        WARN_ON(!mutex_is_locked(&efx->mac_lock));
 
-       /* Serialise the promiscuous flag with efx_set_multicast_list. */
-       if (efx_dev_registered(efx)) {
-               netif_addr_lock_bh(efx->net_dev);
-               netif_addr_unlock_bh(efx->net_dev);
-       }
+       /* Serialise the promiscuous flag with efx_set_rx_mode. */
+       netif_addr_lock_bh(efx->net_dev);
+       netif_addr_unlock_bh(efx->net_dev);
 
        /* Disable PHY transmit in mac level loopbacks */
        phy_mode = efx->phy_mode;
@@ -907,16 +959,13 @@ static void efx_mac_work(struct work_struct *data)
        struct efx_nic *efx = container_of(data, struct efx_nic, mac_work);
 
        mutex_lock(&efx->mac_lock);
-       if (efx->port_enabled) {
-               efx->type->push_multicast_hash(efx);
-               efx->mac_op->reconfigure(efx);
-       }
+       if (efx->port_enabled)
+               efx->type->reconfigure_mac(efx);
        mutex_unlock(&efx->mac_lock);
 }
 
 static int efx_probe_port(struct efx_nic *efx)
 {
-       unsigned char *perm_addr;
        int rc;
 
        netif_dbg(efx, probe, efx->net_dev, "create port\n");
@@ -929,28 +978,10 @@ static int efx_probe_port(struct efx_nic *efx)
        if (rc)
                return rc;
 
-       /* Sanity check MAC address */
-       perm_addr = efx->net_dev->perm_addr;
-       if (is_valid_ether_addr(perm_addr)) {
-               memcpy(efx->net_dev->dev_addr, perm_addr, ETH_ALEN);
-       } else {
-               netif_err(efx, probe, efx->net_dev, "invalid MAC address %pM\n",
-                         perm_addr);
-               if (!allow_bad_hwaddr) {
-                       rc = -EINVAL;
-                       goto err;
-               }
-               random_ether_addr(efx->net_dev->dev_addr);
-               netif_info(efx, probe, efx->net_dev,
-                          "using locally-generated MAC %pM\n",
-                          efx->net_dev->dev_addr);
-       }
+       /* Initialise MAC address to permanent address */
+       memcpy(efx->net_dev->dev_addr, efx->net_dev->perm_addr, ETH_ALEN);
 
        return 0;
-
- err:
-       efx->type->remove_port(efx);
-       return rc;
 }
 
 static int efx_init_port(struct efx_nic *efx)
@@ -969,7 +1000,7 @@ static int efx_init_port(struct efx_nic *efx)
 
        /* Reconfigure the MAC before creating dma queues (required for
         * Falcon/A1 where RX_INGR_EN/TX_DRAIN_EN isn't supported) */
-       efx->mac_op->reconfigure(efx);
+       efx->type->reconfigure_mac(efx);
 
        /* Ensure the PHY advertises the correct flow control settings */
        rc = efx->phy_op->reconfigure(efx);
@@ -996,8 +1027,7 @@ static void efx_start_port(struct efx_nic *efx)
 
        /* efx_mac_work() might have been scheduled after efx_stop_port(),
         * and then cancelled by efx_flush_all() */
-       efx->type->push_multicast_hash(efx);
-       efx->mac_op->reconfigure(efx);
+       efx->type->reconfigure_mac(efx);
 
        mutex_unlock(&efx->mac_lock);
 }
@@ -1012,10 +1042,8 @@ static void efx_stop_port(struct efx_nic *efx)
        mutex_unlock(&efx->mac_lock);
 
        /* Serialise against efx_set_multicast_list() */
-       if (efx_dev_registered(efx)) {
-               netif_addr_lock_bh(efx->net_dev);
-               netif_addr_unlock_bh(efx->net_dev);
-       }
+       netif_addr_lock_bh(efx->net_dev);
+       netif_addr_unlock_bh(efx->net_dev);
 }
 
 static void efx_fini_port(struct efx_nic *efx)
@@ -1069,9 +1097,11 @@ static int efx_init_io(struct efx_nic *efx)
         * masks event though they reject 46 bit masks.
         */
        while (dma_mask > 0x7fffffffUL) {
-               if (pci_dma_supported(pci_dev, dma_mask) &&
-                   ((rc = pci_set_dma_mask(pci_dev, dma_mask)) == 0))
-                       break;
+               if (pci_dma_supported(pci_dev, dma_mask)) {
+                       rc = pci_set_dma_mask(pci_dev, dma_mask);
+                       if (rc == 0)
+                               break;
+               }
                dma_mask >>= 1;
        }
        if (rc) {
@@ -1144,33 +1174,46 @@ static void efx_fini_io(struct efx_nic *efx)
        pci_disable_device(efx->pci_dev);
 }
 
-/* Get number of channels wanted.  Each channel will have its own IRQ,
- * 1 RX queue and/or 2 TX queues. */
-static int efx_wanted_channels(void)
+static unsigned int efx_wanted_parallelism(struct efx_nic *efx)
 {
-       cpumask_var_t core_mask;
-       int count;
+       cpumask_var_t thread_mask;
+       unsigned int count;
        int cpu;
 
-       if (rss_cpus)
-               return rss_cpus;
+       if (rss_cpus) {
+               count = rss_cpus;
+       } else {
+               if (unlikely(!zalloc_cpumask_var(&thread_mask, GFP_KERNEL))) {
+                       netif_warn(efx, probe, efx->net_dev,
+                                  "RSS disabled due to allocation failure\n");
+                       return 1;
+               }
+
+               count = 0;
+               for_each_online_cpu(cpu) {
+                       if (!cpumask_test_cpu(cpu, thread_mask)) {
+                               ++count;
+                               cpumask_or(thread_mask, thread_mask,
+                                          topology_thread_cpumask(cpu));
+                       }
+               }
 
-       if (unlikely(!zalloc_cpumask_var(&core_mask, GFP_KERNEL))) {
-               printk(KERN_WARNING
-                      "sfc: RSS disabled due to allocation failure\n");
-               return 1;
+               free_cpumask_var(thread_mask);
        }
 
-       count = 0;
-       for_each_online_cpu(cpu) {
-               if (!cpumask_test_cpu(cpu, core_mask)) {
-                       ++count;
-                       cpumask_or(core_mask, core_mask,
-                                  topology_core_cpumask(cpu));
-               }
+       /* If RSS is requested for the PF *and* VFs then we can't write RSS
+        * table entries that are inaccessible to VFs
+        */
+       if (efx_sriov_wanted(efx) && efx_vf_size(efx) > 1 &&
+           count > efx_vf_size(efx)) {
+               netif_warn(efx, probe, efx->net_dev,
+                          "Reducing number of RSS channels from %u to %u for "
+                          "VF support. Increase vf-msix-limit to use more "
+                          "channels on the PF.\n",
+                          count, efx_vf_size(efx));
+               count = efx_vf_size(efx);
        }
 
-       free_cpumask_var(core_mask);
        return count;
 }
 
@@ -1178,7 +1221,8 @@ static int
 efx_init_rx_cpu_rmap(struct efx_nic *efx, struct msix_entry *xentries)
 {
 #ifdef CONFIG_RFS_ACCEL
-       int i, rc;
+       unsigned int i;
+       int rc;
 
        efx->net_dev->rx_cpu_rmap = alloc_irq_cpu_rmap(efx->n_rx_channels);
        if (!efx->net_dev->rx_cpu_rmap)
@@ -1201,17 +1245,24 @@ efx_init_rx_cpu_rmap(struct efx_nic *efx, struct msix_entry *xentries)
  */
 static int efx_probe_interrupts(struct efx_nic *efx)
 {
-       int max_channels =
-               min_t(int, efx->type->phys_addr_channels, EFX_MAX_CHANNELS);
-       int rc, i;
+       unsigned int max_channels =
+               min(efx->type->phys_addr_channels, EFX_MAX_CHANNELS);
+       unsigned int extra_channels = 0;
+       unsigned int i, j;
+       int rc;
+
+       for (i = 0; i < EFX_MAX_EXTRA_CHANNELS; i++)
+               if (efx->extra_channel_type[i])
+                       ++extra_channels;
 
        if (efx->interrupt_mode == EFX_INT_MODE_MSIX) {
                struct msix_entry xentries[EFX_MAX_CHANNELS];
-               int n_channels;
+               unsigned int n_channels;
 
-               n_channels = efx_wanted_channels();
+               n_channels = efx_wanted_parallelism(efx);
                if (separate_tx_channels)
                        n_channels *= 2;
+               n_channels += extra_channels;
                n_channels = min(n_channels, max_channels);
 
                for (i = 0; i < n_channels; i++)
@@ -1220,7 +1271,7 @@ static int efx_probe_interrupts(struct efx_nic *efx)
                if (rc > 0) {
                        netif_err(efx, drv, efx->net_dev,
                                  "WARNING: Insufficient MSI-X vectors"
-                                 " available (%d < %d).\n", rc, n_channels);
+                                 " available (%d < %u).\n", rc, n_channels);
                        netif_err(efx, drv, efx->net_dev,
                                  "WARNING: Performance may be reduced.\n");
                        EFX_BUG_ON_PARANOID(rc >= n_channels);
@@ -1231,22 +1282,23 @@ static int efx_probe_interrupts(struct efx_nic *efx)
 
                if (rc == 0) {
                        efx->n_channels = n_channels;
+                       if (n_channels > extra_channels)
+                               n_channels -= extra_channels;
                        if (separate_tx_channels) {
-                               efx->n_tx_channels =
-                                       max(efx->n_channels / 2, 1U);
-                               efx->n_rx_channels =
-                                       max(efx->n_channels -
-                                           efx->n_tx_channels, 1U);
+                               efx->n_tx_channels = max(n_channels / 2, 1U);
+                               efx->n_rx_channels = max(n_channels -
+                                                        efx->n_tx_channels,
+                                                        1U);
                        } else {
-                               efx->n_tx_channels = efx->n_channels;
-                               efx->n_rx_channels = efx->n_channels;
+                               efx->n_tx_channels = n_channels;
+                               efx->n_rx_channels = n_channels;
                        }
                        rc = efx_init_rx_cpu_rmap(efx, xentries);
                        if (rc) {
                                pci_disable_msix(efx->pci_dev);
                                return rc;
                        }
-                       for (i = 0; i < n_channels; i++)
+                       for (i = 0; i < efx->n_channels; i++)
                                efx_get_channel(efx, i)->irq =
                                        xentries[i].vector;
                } else {
@@ -1280,9 +1332,68 @@ static int efx_probe_interrupts(struct efx_nic *efx)
                efx->legacy_irq = efx->pci_dev->irq;
        }
 
+       /* Assign extra channels if possible */
+       j = efx->n_channels;
+       for (i = 0; i < EFX_MAX_EXTRA_CHANNELS; i++) {
+               if (!efx->extra_channel_type[i])
+                       continue;
+               if (efx->interrupt_mode != EFX_INT_MODE_MSIX ||
+                   efx->n_channels <= extra_channels) {
+                       efx->extra_channel_type[i]->handle_no_channel(efx);
+               } else {
+                       --j;
+                       efx_get_channel(efx, j)->type =
+                               efx->extra_channel_type[i];
+               }
+       }
+
+       /* RSS might be usable on VFs even if it is disabled on the PF */
+       efx->rss_spread = (efx->n_rx_channels > 1 ?
+                          efx->n_rx_channels : efx_vf_size(efx));
+
        return 0;
 }
 
+/* Enable interrupts, then probe and start the event queues */
+static void efx_start_interrupts(struct efx_nic *efx, bool may_keep_eventq)
+{
+       struct efx_channel *channel;
+
+       if (efx->legacy_irq)
+               efx->legacy_irq_enabled = true;
+       efx_nic_enable_interrupts(efx);
+
+       efx_for_each_channel(channel, efx) {
+               if (!channel->type->keep_eventq || !may_keep_eventq)
+                       efx_init_eventq(channel);
+               efx_start_eventq(channel);
+       }
+
+       efx_mcdi_mode_event(efx);
+}
+
+static void efx_stop_interrupts(struct efx_nic *efx, bool may_keep_eventq)
+{
+       struct efx_channel *channel;
+
+       efx_mcdi_mode_poll(efx);
+
+       efx_nic_disable_interrupts(efx);
+       if (efx->legacy_irq) {
+               synchronize_irq(efx->legacy_irq);
+               efx->legacy_irq_enabled = false;
+       }
+
+       efx_for_each_channel(channel, efx) {
+               if (channel->irq)
+                       synchronize_irq(channel->irq);
+
+               efx_stop_eventq(channel);
+               if (!channel->type->keep_eventq || !may_keep_eventq)
+                       efx_fini_eventq(channel);
+       }
+}
+
 static void efx_remove_interrupts(struct efx_nic *efx)
 {
        struct efx_channel *channel;
@@ -1333,11 +1444,13 @@ static int efx_probe_nic(struct efx_nic *efx)
        if (rc)
                goto fail;
 
+       efx->type->dimension_resources(efx);
+
        if (efx->n_channels > 1)
                get_random_bytes(&efx->rx_hash_key, sizeof(efx->rx_hash_key));
        for (i = 0; i < ARRAY_SIZE(efx->rx_indir_table); i++)
                efx->rx_indir_table[i] =
-                       ethtool_rxfh_indir_default(i, efx->n_rx_channels);
+                       ethtool_rxfh_indir_default(i, efx->rss_spread);
 
        efx_set_channels(efx);
        netif_set_real_num_tx_queues(efx->net_dev, efx->n_tx_channels);
@@ -1385,21 +1498,22 @@ static int efx_probe_all(struct efx_nic *efx)
        }
 
        efx->rxq_entries = efx->txq_entries = EFX_DEFAULT_DMAQ_SIZE;
-       rc = efx_probe_channels(efx);
-       if (rc)
-               goto fail3;
 
        rc = efx_probe_filters(efx);
        if (rc) {
                netif_err(efx, probe, efx->net_dev,
                          "failed to create filter tables\n");
-               goto fail4;
+               goto fail3;
        }
 
+       rc = efx_probe_channels(efx);
+       if (rc)
+               goto fail4;
+
        return 0;
 
  fail4:
-       efx_remove_channels(efx);
+       efx_remove_filters(efx);
  fail3:
        efx_remove_port(efx);
  fail2:
@@ -1408,15 +1522,13 @@ static int efx_probe_all(struct efx_nic *efx)
        return rc;
 }
 
-/* Called after previous invocation(s) of efx_stop_all, restarts the
- * port, kernel transmit queue, NAPI processing and hardware interrupts,
- * and ensures that the port is scheduled to be reconfigured.
- * This function is safe to call multiple times when the NIC is in any
- * state. */
+/* Called after previous invocation(s) of efx_stop_all, restarts the port,
+ * kernel transmit queues and NAPI processing, and ensures that the port is
+ * scheduled to be reconfigured. This function is safe to call multiple
+ * times when the NIC is in any state.
+ */
 static void efx_start_all(struct efx_nic *efx)
 {
-       struct efx_channel *channel;
-
        EFX_ASSERT_RESET_SERIALISED(efx);
 
        /* Check that it is appropriate to restart the interface. All
@@ -1425,31 +1537,11 @@ static void efx_start_all(struct efx_nic *efx)
                return;
        if ((efx->state != STATE_RUNNING) && (efx->state != STATE_INIT))
                return;
-       if (efx_dev_registered(efx) && !netif_running(efx->net_dev))
+       if (!netif_running(efx->net_dev))
                return;
 
-       /* Mark the port as enabled so port reconfigurations can start, then
-        * restart the transmit interface early so the watchdog timer stops */
        efx_start_port(efx);
-
-       if (efx_dev_registered(efx) && netif_device_present(efx->net_dev))
-               netif_tx_wake_all_queues(efx->net_dev);
-
-       efx_for_each_channel(channel, efx)
-               efx_start_channel(channel);
-
-       if (efx->legacy_irq)
-               efx->legacy_irq_enabled = true;
-       efx_nic_enable_interrupts(efx);
-
-       /* Switch to event based MCDI completions after enabling interrupts.
-        * If a reset has been scheduled, then we need to stay in polled mode.
-        * Rather than serialising efx_mcdi_mode_event() [which sleeps] and
-        * reset_pending [modified from an atomic context], we instead guarantee
-        * that efx_mcdi_mode_poll() isn't reverted erroneously */
-       efx_mcdi_mode_event(efx);
-       if (efx->reset_pending)
-               efx_mcdi_mode_poll(efx);
+       efx_start_datapath(efx);
 
        /* Start the hardware monitor if there is one. Otherwise (we're link
         * event driven), we have to poll the PHY because after an event queue
@@ -1485,8 +1577,6 @@ static void efx_flush_all(struct efx_nic *efx)
  * taking locks. */
 static void efx_stop_all(struct efx_nic *efx)
 {
-       struct efx_channel *channel;
-
        EFX_ASSERT_RESET_SERIALISED(efx);
 
        /* port_enabled can be read safely under the rtnl lock */
@@ -1494,28 +1584,6 @@ static void efx_stop_all(struct efx_nic *efx)
                return;
 
        efx->type->stop_stats(efx);
-
-       /* Switch to MCDI polling on Siena before disabling interrupts */
-       efx_mcdi_mode_poll(efx);
-
-       /* Disable interrupts and wait for ISR to complete */
-       efx_nic_disable_interrupts(efx);
-       if (efx->legacy_irq) {
-               synchronize_irq(efx->legacy_irq);
-               efx->legacy_irq_enabled = false;
-       }
-       efx_for_each_channel(channel, efx) {
-               if (channel->irq)
-                       synchronize_irq(channel->irq);
-       }
-
-       /* Stop all NAPI processing and synchronous rx refills */
-       efx_for_each_channel(channel, efx)
-               efx_stop_channel(channel);
-
-       /* Stop all asynchronous port reconfigurations. Since all
-        * event processing has already been stopped, there is no
-        * window to loose phy events */
        efx_stop_port(efx);
 
        /* Flush efx_mac_work(), refill_workqueue, monitor_work */
@@ -1523,17 +1591,15 @@ static void efx_stop_all(struct efx_nic *efx)
 
        /* Stop the kernel transmit interface late, so the watchdog
         * timer isn't ticking over the flush */
-       if (efx_dev_registered(efx)) {
-               netif_tx_stop_all_queues(efx->net_dev);
-               netif_tx_lock_bh(efx->net_dev);
-               netif_tx_unlock_bh(efx->net_dev);
-       }
+       netif_tx_disable(efx->net_dev);
+
+       efx_stop_datapath(efx);
 }
 
 static void efx_remove_all(struct efx_nic *efx)
 {
-       efx_remove_filters(efx);
        efx_remove_channels(efx);
+       efx_remove_filters(efx);
        efx_remove_port(efx);
        efx_remove_nic(efx);
 }
@@ -1544,13 +1610,13 @@ static void efx_remove_all(struct efx_nic *efx)
  *
  **************************************************************************/
 
-static unsigned int irq_mod_ticks(unsigned int usecs, unsigned int resolution)
+static unsigned int irq_mod_ticks(unsigned int usecs, unsigned int quantum_ns)
 {
        if (usecs == 0)
                return 0;
-       if (usecs < resolution)
+       if (usecs * 1000 < quantum_ns)
                return 1; /* never round down to 0 */
-       return usecs / resolution;
+       return usecs * 1000 / quantum_ns;
 }
 
 /* Set interrupt moderation parameters */
@@ -1559,14 +1625,20 @@ int efx_init_irq_moderation(struct efx_nic *efx, unsigned int tx_usecs,
                            bool rx_may_override_tx)
 {
        struct efx_channel *channel;
-       unsigned tx_ticks = irq_mod_ticks(tx_usecs, EFX_IRQ_MOD_RESOLUTION);
-       unsigned rx_ticks = irq_mod_ticks(rx_usecs, EFX_IRQ_MOD_RESOLUTION);
+       unsigned int irq_mod_max = DIV_ROUND_UP(efx->type->timer_period_max *
+                                               efx->timer_quantum_ns,
+                                               1000);
+       unsigned int tx_ticks;
+       unsigned int rx_ticks;
 
        EFX_ASSERT_RESET_SERIALISED(efx);
 
-       if (tx_ticks > EFX_IRQ_MOD_MAX || rx_ticks > EFX_IRQ_MOD_MAX)
+       if (tx_usecs > irq_mod_max || rx_usecs > irq_mod_max)
                return -EINVAL;
 
+       tx_ticks = irq_mod_ticks(tx_usecs, efx->timer_quantum_ns);
+       rx_ticks = irq_mod_ticks(rx_usecs, efx->timer_quantum_ns);
+
        if (tx_ticks != rx_ticks && efx->tx_channel_offset == 0 &&
            !rx_may_override_tx) {
                netif_err(efx, drv, efx->net_dev, "Channels are shared. "
@@ -1589,8 +1661,14 @@ int efx_init_irq_moderation(struct efx_nic *efx, unsigned int tx_usecs,
 void efx_get_irq_moderation(struct efx_nic *efx, unsigned int *tx_usecs,
                            unsigned int *rx_usecs, bool *rx_adaptive)
 {
+       /* We must round up when converting ticks to microseconds
+        * because we round down when converting the other way.
+        */
+
        *rx_adaptive = efx->irq_rx_adaptive;
-       *rx_usecs = efx->irq_rx_moderation * EFX_IRQ_MOD_RESOLUTION;
+       *rx_usecs = DIV_ROUND_UP(efx->irq_rx_moderation *
+                                efx->timer_quantum_ns,
+                                1000);
 
        /* If channels are shared between RX and TX, so is IRQ
         * moderation.  Otherwise, IRQ moderation is the same for all
@@ -1599,9 +1677,10 @@ void efx_get_irq_moderation(struct efx_nic *efx, unsigned int *tx_usecs,
        if (efx->tx_channel_offset == 0)
                *tx_usecs = *rx_usecs;
        else
-               *tx_usecs =
+               *tx_usecs = DIV_ROUND_UP(
                        efx->channel[efx->tx_channel_offset]->irq_moderation *
-                       EFX_IRQ_MOD_RESOLUTION;
+                       efx->timer_quantum_ns,
+                       1000);
 }
 
 /**************************************************************************
@@ -1664,15 +1743,21 @@ static int efx_ioctl(struct net_device *net_dev, struct ifreq *ifr, int cmd)
  *
  **************************************************************************/
 
+static void efx_init_napi_channel(struct efx_channel *channel)
+{
+       struct efx_nic *efx = channel->efx;
+
+       channel->napi_dev = efx->net_dev;
+       netif_napi_add(channel->napi_dev, &channel->napi_str,
+                      efx_poll, napi_weight);
+}
+
 static void efx_init_napi(struct efx_nic *efx)
 {
        struct efx_channel *channel;
 
-       efx_for_each_channel(channel, efx) {
-               channel->napi_dev = efx->net_dev;
-               netif_napi_add(channel->napi_dev, &channel->napi_str,
-                              efx_poll, napi_weight);
-       }
+       efx_for_each_channel(channel, efx)
+               efx_init_napi_channel(channel);
 }
 
 static void efx_fini_napi_channel(struct efx_channel *channel)
@@ -1757,22 +1842,21 @@ static int efx_net_stop(struct net_device *net_dev)
        if (efx->state != STATE_DISABLED) {
                /* Stop the device and flush all the channels */
                efx_stop_all(efx);
-               efx_fini_channels(efx);
-               efx_init_channels(efx);
        }
 
        return 0;
 }
 
 /* Context: process, dev_base_lock or RTNL held, non-blocking. */
-static struct rtnl_link_stats64 *efx_net_stats(struct net_device *net_dev, struct rtnl_link_stats64 *stats)
+static struct rtnl_link_stats64 *efx_net_stats(struct net_device *net_dev,
+                                              struct rtnl_link_stats64 *stats)
 {
        struct efx_nic *efx = netdev_priv(net_dev);
        struct efx_mac_stats *mac_stats = &efx->mac_stats;
 
        spin_lock_bh(&efx->stats_lock);
+
        efx->type->update_stats(efx);
-       spin_unlock_bh(&efx->stats_lock);
 
        stats->rx_packets = mac_stats->rx_packets;
        stats->tx_packets = mac_stats->tx_packets;
@@ -1796,6 +1880,8 @@ static struct rtnl_link_stats64 *efx_net_stats(struct net_device *net_dev, struc
        stats->tx_errors = (stats->tx_window_errors +
                            mac_stats->tx_bad);
 
+       spin_unlock_bh(&efx->stats_lock);
+
        return stats;
 }
 
@@ -1816,7 +1902,6 @@ static void efx_watchdog(struct net_device *net_dev)
 static int efx_change_mtu(struct net_device *net_dev, int new_mtu)
 {
        struct efx_nic *efx = netdev_priv(net_dev);
-       int rc = 0;
 
        EFX_ASSERT_RESET_SERIALISED(efx);
 
@@ -1827,19 +1912,15 @@ static int efx_change_mtu(struct net_device *net_dev, int new_mtu)
 
        netif_dbg(efx, drv, efx->net_dev, "changing MTU to %d\n", new_mtu);
 
-       efx_fini_channels(efx);
-
        mutex_lock(&efx->mac_lock);
        /* Reconfigure the MAC before enabling the dma queues so that
         * the RX buffers don't overflow */
        net_dev->mtu = new_mtu;
-       efx->mac_op->reconfigure(efx);
+       efx->type->reconfigure_mac(efx);
        mutex_unlock(&efx->mac_lock);
 
-       efx_init_channels(efx);
-
        efx_start_all(efx);
-       return rc;
+       return 0;
 }
 
 static int efx_set_mac_address(struct net_device *net_dev, void *data)
@@ -1854,21 +1935,22 @@ static int efx_set_mac_address(struct net_device *net_dev, void *data)
                netif_err(efx, drv, efx->net_dev,
                          "invalid ethernet MAC address requested: %pM\n",
                          new_addr);
-               return -EINVAL;
+               return -EADDRNOTAVAIL;
        }
 
        memcpy(net_dev->dev_addr, new_addr, net_dev->addr_len);
+       efx_sriov_mac_address_changed(efx);
 
        /* Reconfigure the MAC */
        mutex_lock(&efx->mac_lock);
-       efx->mac_op->reconfigure(efx);
+       efx->type->reconfigure_mac(efx);
        mutex_unlock(&efx->mac_lock);
 
        return 0;
 }
 
 /* Context: netif_addr_lock held, BHs disabled. */
-static void efx_set_multicast_list(struct net_device *net_dev)
+static void efx_set_rx_mode(struct net_device *net_dev)
 {
        struct efx_nic *efx = netdev_priv(net_dev);
        struct netdev_hw_addr *ha;
@@ -1922,8 +2004,14 @@ static const struct net_device_ops efx_netdev_ops = {
        .ndo_do_ioctl           = efx_ioctl,
        .ndo_change_mtu         = efx_change_mtu,
        .ndo_set_mac_address    = efx_set_mac_address,
-       .ndo_set_rx_mode        = efx_set_multicast_list,
+       .ndo_set_rx_mode        = efx_set_rx_mode,
        .ndo_set_features       = efx_set_features,
+#ifdef CONFIG_SFC_SRIOV
+       .ndo_set_vf_mac         = efx_sriov_set_vf_mac,
+       .ndo_set_vf_vlan        = efx_sriov_set_vf_vlan,
+       .ndo_set_vf_spoofchk    = efx_sriov_set_vf_spoofchk,
+       .ndo_get_vf_config      = efx_sriov_get_vf_config,
+#endif
 #ifdef CONFIG_NET_POLL_CONTROLLER
        .ndo_poll_controller = efx_netpoll,
 #endif
@@ -1975,10 +2063,6 @@ static int efx_register_netdev(struct efx_nic *efx)
        net_dev->netdev_ops = &efx_netdev_ops;
        SET_ETHTOOL_OPS(net_dev, &efx_ethtool_ops);
 
-       /* Clear MAC statistics */
-       efx->mac_op->update_stats(efx);
-       memset(&efx->mac_stats, 0, sizeof(efx->mac_stats));
-
        rtnl_lock();
 
        rc = dev_alloc_name(net_dev, net_dev->name);
@@ -1997,7 +2081,7 @@ static int efx_register_netdev(struct efx_nic *efx)
        }
 
        /* Always start with carrier off; PHY events will detect the link */
-       netif_carrier_off(efx->net_dev);
+       netif_carrier_off(net_dev);
 
        rtnl_unlock();
 
@@ -2038,11 +2122,9 @@ static void efx_unregister_netdev(struct efx_nic *efx)
                        efx_release_tx_buffers(tx_queue);
        }
 
-       if (efx_dev_registered(efx)) {
-               strlcpy(efx->name, pci_name(efx->pci_dev), sizeof(efx->name));
-               device_remove_file(&efx->pci_dev->dev, &dev_attr_phy_type);
-               unregister_netdev(efx->net_dev);
-       }
+       strlcpy(efx->name, pci_name(efx->pci_dev), sizeof(efx->name));
+       device_remove_file(&efx->pci_dev->dev, &dev_attr_phy_type);
+       unregister_netdev(efx->net_dev);
 }
 
 /**************************************************************************
@@ -2060,7 +2142,7 @@ void efx_reset_down(struct efx_nic *efx, enum reset_type method)
        efx_stop_all(efx);
        mutex_lock(&efx->mac_lock);
 
-       efx_fini_channels(efx);
+       efx_stop_interrupts(efx, false);
        if (efx->port_initialized && method != RESET_TYPE_INVISIBLE)
                efx->phy_op->fini(efx);
        efx->type->fini(efx);
@@ -2095,10 +2177,11 @@ int efx_reset_up(struct efx_nic *efx, enum reset_type method, bool ok)
                                  "could not restore PHY settings\n");
        }
 
-       efx->mac_op->reconfigure(efx);
+       efx->type->reconfigure_mac(efx);
 
-       efx_init_channels(efx);
+       efx_start_interrupts(efx, false);
        efx_restore_filters(efx);
+       efx_sriov_reset(efx);
 
        mutex_unlock(&efx->mac_lock);
 
@@ -2300,10 +2383,10 @@ static int efx_init_struct(struct efx_nic *efx, const struct efx_nic_type *type,
        efx->net_dev = net_dev;
        spin_lock_init(&efx->stats_lock);
        mutex_init(&efx->mac_lock);
-       efx->mac_op = type->default_mac_ops;
        efx->phy_op = &efx_dummy_phy_operations;
        efx->mdio.dev = net_dev;
        INIT_WORK(&efx->mac_work, efx_mac_work);
+       init_waitqueue_head(&efx->flush_wq);
 
        for (i = 0; i < EFX_MAX_CHANNELS; i++) {
                efx->channel[i] = efx_alloc_channel(efx, i, NULL);
@@ -2361,8 +2444,8 @@ static void efx_pci_remove_main(struct efx_nic *efx)
        free_irq_cpu_rmap(efx->net_dev->rx_cpu_rmap);
        efx->net_dev->rx_cpu_rmap = NULL;
 #endif
+       efx_stop_interrupts(efx, false);
        efx_nic_fini_interrupt(efx);
-       efx_fini_channels(efx);
        efx_fini_port(efx);
        efx->type->fini(efx);
        efx_fini_napi(efx);
@@ -2388,6 +2471,8 @@ static void efx_pci_remove(struct pci_dev *pci_dev)
        /* Allow any queued efx_resets() to complete */
        rtnl_unlock();
 
+       efx_stop_interrupts(efx, false);
+       efx_sriov_fini(efx);
        efx_unregister_netdev(efx);
 
        efx_mtd_remove(efx);
@@ -2436,16 +2521,14 @@ static int efx_pci_probe_main(struct efx_nic *efx)
                goto fail4;
        }
 
-       efx_init_channels(efx);
-
        rc = efx_nic_init_interrupt(efx);
        if (rc)
                goto fail5;
+       efx_start_interrupts(efx, false);
 
        return 0;
 
  fail5:
-       efx_fini_channels(efx);
        efx_fini_port(efx);
  fail4:
        efx->type->fini(efx);
@@ -2459,7 +2542,7 @@ static int efx_pci_probe_main(struct efx_nic *efx)
 /* NIC initialisation
  *
  * This is called at module load (or hotplug insertion,
- * theoretically).  It sets up PCI mappings, tests and resets the NIC,
+ * theoretically).  It sets up PCI mappings, resets the NIC,
  * sets up and registers the network devices with the kernel and hooks
  * the interrupt service routine.  It does not prepare the device for
  * transmission; this is left to the first time one of the network
@@ -2471,7 +2554,7 @@ static int __devinit efx_pci_probe(struct pci_dev *pci_dev,
        const struct efx_nic_type *type = (const struct efx_nic_type *) entry->driver_data;
        struct net_device *net_dev;
        struct efx_nic *efx;
-       int i, rc;
+       int rc;
 
        /* Allocate and initialise a struct net_device and struct efx_nic */
        net_dev = alloc_etherdev_mqs(sizeof(*efx), EFX_MAX_CORE_TX_QUEUES,
@@ -2504,39 +2587,22 @@ static int __devinit efx_pci_probe(struct pci_dev *pci_dev,
        if (rc)
                goto fail2;
 
-       /* No serialisation is required with the reset path because
-        * we're in STATE_INIT. */
-       for (i = 0; i < 5; i++) {
-               rc = efx_pci_probe_main(efx);
-
-               /* Serialise against efx_reset(). No more resets will be
-                * scheduled since efx_stop_all() has been called, and we
-                * have not and never have been registered with either
-                * the rtnetlink or driverlink layers. */
-               cancel_work_sync(&efx->reset_work);
+       rc = efx_pci_probe_main(efx);
 
-               if (rc == 0) {
-                       if (efx->reset_pending) {
-                               /* If there was a scheduled reset during
-                                * probe, the NIC is probably hosed anyway */
-                               efx_pci_remove_main(efx);
-                               rc = -EIO;
-                       } else {
-                               break;
-                       }
-               }
-
-               /* Retry if a recoverably reset event has been scheduled */
-               if (efx->reset_pending &
-                   ~(1 << RESET_TYPE_INVISIBLE | 1 << RESET_TYPE_ALL) ||
-                   !efx->reset_pending)
-                       goto fail3;
+       /* Serialise against efx_reset(). No more resets will be
+        * scheduled since efx_stop_all() has been called, and we have
+        * not and never have been registered.
+        */
+       cancel_work_sync(&efx->reset_work);
 
-               efx->reset_pending = 0;
-       }
+       if (rc)
+               goto fail3;
 
-       if (rc) {
-               netif_err(efx, probe, efx->net_dev, "Could not reset NIC\n");
+       /* If there was a scheduled reset during probe, the NIC is
+        * probably hosed anyway.
+        */
+       if (efx->reset_pending) {
+               rc = -EIO;
                goto fail4;
        }
 
@@ -2546,18 +2612,27 @@ static int __devinit efx_pci_probe(struct pci_dev *pci_dev,
 
        rc = efx_register_netdev(efx);
        if (rc)
-               goto fail5;
+               goto fail4;
+
+       rc = efx_sriov_init(efx);
+       if (rc)
+               netif_err(efx, probe, efx->net_dev,
+                         "SR-IOV can't be enabled rc %d\n", rc);
 
        netif_dbg(efx, probe, efx->net_dev, "initialisation successful\n");
 
+       /* Try to create MTDs, but allow this to fail */
        rtnl_lock();
-       efx_mtd_probe(efx); /* allowed to fail */
+       rc = efx_mtd_probe(efx);
        rtnl_unlock();
+       if (rc)
+               netif_warn(efx, probe, efx->net_dev,
+                          "failed to create MTDs (%d)\n", rc);
+
        return 0;
 
- fail5:
-       efx_pci_remove_main(efx);
  fail4:
+       efx_pci_remove_main(efx);
  fail3:
        efx_fini_io(efx);
  fail2:
@@ -2578,7 +2653,7 @@ static int efx_pm_freeze(struct device *dev)
        netif_device_detach(efx->net_dev);
 
        efx_stop_all(efx);
-       efx_fini_channels(efx);
+       efx_stop_interrupts(efx, false);
 
        return 0;
 }
@@ -2589,7 +2664,7 @@ static int efx_pm_thaw(struct device *dev)
 
        efx->state = STATE_INIT;
 
-       efx_init_channels(efx);
+       efx_start_interrupts(efx, false);
 
        mutex_lock(&efx->mac_lock);
        efx->phy_op->reconfigure(efx);
@@ -2658,7 +2733,7 @@ static int efx_pm_suspend(struct device *dev)
        return rc;
 }
 
-static struct dev_pm_ops efx_pm_ops = {
+static const struct dev_pm_ops efx_pm_ops = {
        .suspend        = efx_pm_suspend,
        .resume         = efx_pm_resume,
        .freeze         = efx_pm_freeze,
@@ -2695,6 +2770,10 @@ static int __init efx_init_module(void)
        if (rc)
                goto err_notifier;
 
+       rc = efx_init_sriov();
+       if (rc)
+               goto err_sriov;
+
        reset_workqueue = create_singlethread_workqueue("sfc_reset");
        if (!reset_workqueue) {
                rc = -ENOMEM;
@@ -2710,6 +2789,8 @@ static int __init efx_init_module(void)
  err_pci:
        destroy_workqueue(reset_workqueue);
  err_reset:
+       efx_fini_sriov();
+ err_sriov:
        unregister_netdevice_notifier(&efx_netdev_notifier);
  err_notifier:
        return rc;
@@ -2721,6 +2802,7 @@ static void __exit efx_exit_module(void)
 
        pci_unregister_driver(&efx_pci_driver);
        destroy_workqueue(reset_workqueue);
+       efx_fini_sriov();
        unregister_netdevice_notifier(&efx_netdev_notifier);
 
 }
index a3541ac..4debfe0 100644 (file)
@@ -40,9 +40,9 @@ extern void efx_rx_strategy(struct efx_channel *channel);
 extern void efx_fast_push_rx_descriptors(struct efx_rx_queue *rx_queue);
 extern void efx_rx_slow_fill(unsigned long context);
 extern void __efx_rx_packet(struct efx_channel *channel,
-                           struct efx_rx_buffer *rx_buf, bool checksummed);
+                           struct efx_rx_buffer *rx_buf);
 extern void efx_rx_packet(struct efx_rx_queue *rx_queue, unsigned int index,
-                         unsigned int len, bool checksummed, bool discard);
+                         unsigned int len, u16 flags);
 extern void efx_schedule_slow_fill(struct efx_rx_queue *rx_queue);
 
 #define EFX_MAX_DMAQ_SIZE 4096UL
@@ -95,6 +95,7 @@ static inline void efx_filter_rfs_expire(struct efx_channel *channel) {}
 #endif
 
 /* Channels */
+extern int efx_channel_dummy_op_int(struct efx_channel *channel);
 extern void efx_process_channel_now(struct efx_channel *channel);
 extern int
 efx_realloc_channels(struct efx_nic *efx, u32 rxq_entries, u32 txq_entries);
@@ -145,6 +146,12 @@ static inline void efx_schedule_channel(struct efx_channel *channel)
        napi_schedule(&channel->napi_str);
 }
 
+static inline void efx_schedule_channel_irq(struct efx_channel *channel)
+{
+       channel->last_irq_cpu = raw_smp_processor_id();
+       efx_schedule_channel(channel);
+}
+
 extern void efx_link_status_changed(struct efx_nic *efx);
 extern void efx_link_set_advertising(struct efx_nic *efx, u32);
 extern void efx_link_set_wanted_fc(struct efx_nic *efx, u8);
index 29b2ebf..f22f45f 100644 (file)
@@ -52,11 +52,6 @@ static u64 efx_get_uint_stat(void *field)
        return *(unsigned int *)field;
 }
 
-static u64 efx_get_ulong_stat(void *field)
-{
-       return *(unsigned long *)field;
-}
-
 static u64 efx_get_u64_stat(void *field)
 {
        return *(u64 *) field;
@@ -67,12 +62,8 @@ static u64 efx_get_atomic_stat(void *field)
        return atomic_read((atomic_t *) field);
 }
 
-#define EFX_ETHTOOL_ULONG_MAC_STAT(field)                      \
-       EFX_ETHTOOL_STAT(field, mac_stats, field,               \
-                         unsigned long, efx_get_ulong_stat)
-
 #define EFX_ETHTOOL_U64_MAC_STAT(field)                                \
-       EFX_ETHTOOL_STAT(field, mac_stats, field,               \
+       EFX_ETHTOOL_STAT(field, mac_stats, field,               \
                          u64, efx_get_u64_stat)
 
 #define EFX_ETHTOOL_UINT_NIC_STAT(name)                                \
@@ -91,36 +82,36 @@ static u64 efx_get_atomic_stat(void *field)
        EFX_ETHTOOL_STAT(tx_##field, tx_queue, field,           \
                         unsigned int, efx_get_uint_stat)
 
-static struct efx_ethtool_stat efx_ethtool_stats[] = {
+static const struct efx_ethtool_stat efx_ethtool_stats[] = {
        EFX_ETHTOOL_U64_MAC_STAT(tx_bytes),
        EFX_ETHTOOL_U64_MAC_STAT(tx_good_bytes),
        EFX_ETHTOOL_U64_MAC_STAT(tx_bad_bytes),
-       EFX_ETHTOOL_ULONG_MAC_STAT(tx_packets),
-       EFX_ETHTOOL_ULONG_MAC_STAT(tx_bad),
-       EFX_ETHTOOL_ULONG_MAC_STAT(tx_pause),
-       EFX_ETHTOOL_ULONG_MAC_STAT(tx_control),
-       EFX_ETHTOOL_ULONG_MAC_STAT(tx_unicast),
-       EFX_ETHTOOL_ULONG_MAC_STAT(tx_multicast),
-       EFX_ETHTOOL_ULONG_MAC_STAT(tx_broadcast),
-       EFX_ETHTOOL_ULONG_MAC_STAT(tx_lt64),
-       EFX_ETHTOOL_ULONG_MAC_STAT(tx_64),
-       EFX_ETHTOOL_ULONG_MAC_STAT(tx_65_to_127),
-       EFX_ETHTOOL_ULONG_MAC_STAT(tx_128_to_255),
-       EFX_ETHTOOL_ULONG_MAC_STAT(tx_256_to_511),
-       EFX_ETHTOOL_ULONG_MAC_STAT(tx_512_to_1023),
-       EFX_ETHTOOL_ULONG_MAC_STAT(tx_1024_to_15xx),
-       EFX_ETHTOOL_ULONG_MAC_STAT(tx_15xx_to_jumbo),
-       EFX_ETHTOOL_ULONG_MAC_STAT(tx_gtjumbo),
-       EFX_ETHTOOL_ULONG_MAC_STAT(tx_collision),
-       EFX_ETHTOOL_ULONG_MAC_STAT(tx_single_collision),
-       EFX_ETHTOOL_ULONG_MAC_STAT(tx_multiple_collision),
-       EFX_ETHTOOL_ULONG_MAC_STAT(tx_excessive_collision),
-       EFX_ETHTOOL_ULONG_MAC_STAT(tx_deferred),
-       EFX_ETHTOOL_ULONG_MAC_STAT(tx_late_collision),
-       EFX_ETHTOOL_ULONG_MAC_STAT(tx_excessive_deferred),
-       EFX_ETHTOOL_ULONG_MAC_STAT(tx_non_tcpudp),
-       EFX_ETHTOOL_ULONG_MAC_STAT(tx_mac_src_error),
-       EFX_ETHTOOL_ULONG_MAC_STAT(tx_ip_src_error),
+       EFX_ETHTOOL_U64_MAC_STAT(tx_packets),
+       EFX_ETHTOOL_U64_MAC_STAT(tx_bad),
+       EFX_ETHTOOL_U64_MAC_STAT(tx_pause),
+       EFX_ETHTOOL_U64_MAC_STAT(tx_control),
+       EFX_ETHTOOL_U64_MAC_STAT(tx_unicast),
+       EFX_ETHTOOL_U64_MAC_STAT(tx_multicast),
+       EFX_ETHTOOL_U64_MAC_STAT(tx_broadcast),
+       EFX_ETHTOOL_U64_MAC_STAT(tx_lt64),
+       EFX_ETHTOOL_U64_MAC_STAT(tx_64),
+       EFX_ETHTOOL_U64_MAC_STAT(tx_65_to_127),
+       EFX_ETHTOOL_U64_MAC_STAT(tx_128_to_255),
+       EFX_ETHTOOL_U64_MAC_STAT(tx_256_to_511),
+       EFX_ETHTOOL_U64_MAC_STAT(tx_512_to_1023),
+       EFX_ETHTOOL_U64_MAC_STAT(tx_1024_to_15xx),
+       EFX_ETHTOOL_U64_MAC_STAT(tx_15xx_to_jumbo),
+       EFX_ETHTOOL_U64_MAC_STAT(tx_gtjumbo),
+       EFX_ETHTOOL_U64_MAC_STAT(tx_collision),
+       EFX_ETHTOOL_U64_MAC_STAT(tx_single_collision),
+       EFX_ETHTOOL_U64_MAC_STAT(tx_multiple_collision),
+       EFX_ETHTOOL_U64_MAC_STAT(tx_excessive_collision),
+       EFX_ETHTOOL_U64_MAC_STAT(tx_deferred),
+       EFX_ETHTOOL_U64_MAC_STAT(tx_late_collision),
+       EFX_ETHTOOL_U64_MAC_STAT(tx_excessive_deferred),
+       EFX_ETHTOOL_U64_MAC_STAT(tx_non_tcpudp),
+       EFX_ETHTOOL_U64_MAC_STAT(tx_mac_src_error),
+       EFX_ETHTOOL_U64_MAC_STAT(tx_ip_src_error),
        EFX_ETHTOOL_UINT_TXQ_STAT(tso_bursts),
        EFX_ETHTOOL_UINT_TXQ_STAT(tso_long_headers),
        EFX_ETHTOOL_UINT_TXQ_STAT(tso_packets),
@@ -128,34 +119,34 @@ static struct efx_ethtool_stat efx_ethtool_stats[] = {
        EFX_ETHTOOL_U64_MAC_STAT(rx_bytes),
        EFX_ETHTOOL_U64_MAC_STAT(rx_good_bytes),
        EFX_ETHTOOL_U64_MAC_STAT(rx_bad_bytes),
-       EFX_ETHTOOL_ULONG_MAC_STAT(rx_packets),
-       EFX_ETHTOOL_ULONG_MAC_STAT(rx_good),
-       EFX_ETHTOOL_ULONG_MAC_STAT(rx_bad),
-       EFX_ETHTOOL_ULONG_MAC_STAT(rx_pause),
-       EFX_ETHTOOL_ULONG_MAC_STAT(rx_control),
-       EFX_ETHTOOL_ULONG_MAC_STAT(rx_unicast),
-       EFX_ETHTOOL_ULONG_MAC_STAT(rx_multicast),
-       EFX_ETHTOOL_ULONG_MAC_STAT(rx_broadcast),
-       EFX_ETHTOOL_ULONG_MAC_STAT(rx_lt64),
-       EFX_ETHTOOL_ULONG_MAC_STAT(rx_64),
-       EFX_ETHTOOL_ULONG_MAC_STAT(rx_65_to_127),
-       EFX_ETHTOOL_ULONG_MAC_STAT(rx_128_to_255),
-       EFX_ETHTOOL_ULONG_MAC_STAT(rx_256_to_511),
-       EFX_ETHTOOL_ULONG_MAC_STAT(rx_512_to_1023),
-       EFX_ETHTOOL_ULONG_MAC_STAT(rx_1024_to_15xx),
-       EFX_ETHTOOL_ULONG_MAC_STAT(rx_15xx_to_jumbo),
-       EFX_ETHTOOL_ULONG_MAC_STAT(rx_gtjumbo),
-       EFX_ETHTOOL_ULONG_MAC_STAT(rx_bad_lt64),
-       EFX_ETHTOOL_ULONG_MAC_STAT(rx_bad_64_to_15xx),
-       EFX_ETHTOOL_ULONG_MAC_STAT(rx_bad_15xx_to_jumbo),
-       EFX_ETHTOOL_ULONG_MAC_STAT(rx_bad_gtjumbo),
-       EFX_ETHTOOL_ULONG_MAC_STAT(rx_overflow),
-       EFX_ETHTOOL_ULONG_MAC_STAT(rx_missed),
-       EFX_ETHTOOL_ULONG_MAC_STAT(rx_false_carrier),
-       EFX_ETHTOOL_ULONG_MAC_STAT(rx_symbol_error),
-       EFX_ETHTOOL_ULONG_MAC_STAT(rx_align_error),
-       EFX_ETHTOOL_ULONG_MAC_STAT(rx_length_error),
-       EFX_ETHTOOL_ULONG_MAC_STAT(rx_internal_error),
+       EFX_ETHTOOL_U64_MAC_STAT(rx_packets),
+       EFX_ETHTOOL_U64_MAC_STAT(rx_good),
+       EFX_ETHTOOL_U64_MAC_STAT(rx_bad),
+       EFX_ETHTOOL_U64_MAC_STAT(rx_pause),
+       EFX_ETHTOOL_U64_MAC_STAT(rx_control),
+       EFX_ETHTOOL_U64_MAC_STAT(rx_unicast),
+       EFX_ETHTOOL_U64_MAC_STAT(rx_multicast),
+       EFX_ETHTOOL_U64_MAC_STAT(rx_broadcast),
+       EFX_ETHTOOL_U64_MAC_STAT(rx_lt64),
+       EFX_ETHTOOL_U64_MAC_STAT(rx_64),
+       EFX_ETHTOOL_U64_MAC_STAT(rx_65_to_127),
+       EFX_ETHTOOL_U64_MAC_STAT(rx_128_to_255),
+       EFX_ETHTOOL_U64_MAC_STAT(rx_256_to_511),
+       EFX_ETHTOOL_U64_MAC_STAT(rx_512_to_1023),
+       EFX_ETHTOOL_U64_MAC_STAT(rx_1024_to_15xx),
+       EFX_ETHTOOL_U64_MAC_STAT(rx_15xx_to_jumbo),
+       EFX_ETHTOOL_U64_MAC_STAT(rx_gtjumbo),
+       EFX_ETHTOOL_U64_MAC_STAT(rx_bad_lt64),
+       EFX_ETHTOOL_U64_MAC_STAT(rx_bad_64_to_15xx),
+       EFX_ETHTOOL_U64_MAC_STAT(rx_bad_15xx_to_jumbo),
+       EFX_ETHTOOL_U64_MAC_STAT(rx_bad_gtjumbo),
+       EFX_ETHTOOL_U64_MAC_STAT(rx_overflow),
+       EFX_ETHTOOL_U64_MAC_STAT(rx_missed),
+       EFX_ETHTOOL_U64_MAC_STAT(rx_false_carrier),
+       EFX_ETHTOOL_U64_MAC_STAT(rx_symbol_error),
+       EFX_ETHTOOL_U64_MAC_STAT(rx_align_error),
+       EFX_ETHTOOL_U64_MAC_STAT(rx_length_error),
+       EFX_ETHTOOL_U64_MAC_STAT(rx_internal_error),
        EFX_ETHTOOL_UINT_NIC_STAT(rx_nodesc_drop_cnt),
        EFX_ETHTOOL_ATOMIC_NIC_ERROR_STAT(rx_reset),
        EFX_ETHTOOL_UINT_CHANNEL_STAT(rx_tobe_disc),
@@ -404,10 +395,6 @@ static int efx_ethtool_fill_self_tests(struct efx_nic *efx,
                              &tests->eventq_int[channel->channel],
                              EFX_CHANNEL_NAME(channel),
                              "eventq.int", NULL);
-               efx_fill_test(n++, strings, data,
-                             &tests->eventq_poll[channel->channel],
-                             EFX_CHANNEL_NAME(channel),
-                             "eventq.poll", NULL);
        }
 
        efx_fill_test(n++, strings, data, &tests->registers,
@@ -486,16 +473,17 @@ static void efx_ethtool_get_stats(struct net_device *net_dev,
 {
        struct efx_nic *efx = netdev_priv(net_dev);
        struct efx_mac_stats *mac_stats = &efx->mac_stats;
-       struct efx_ethtool_stat *stat;
+       const struct efx_ethtool_stat *stat;
        struct efx_channel *channel;
        struct efx_tx_queue *tx_queue;
-       struct rtnl_link_stats64 temp;
        int i;
 
        EFX_BUG_ON_PARANOID(stats->n_stats != EFX_ETHTOOL_NUM_STATS);
 
+       spin_lock_bh(&efx->stats_lock);
+
        /* Update MAC and NIC statistics */
-       dev_get_stats(net_dev, &temp);
+       efx->type->update_stats(efx);
 
        /* Fill detailed statistics buffer */
        for (i = 0; i < EFX_ETHTOOL_NUM_STATS; i++) {
@@ -525,6 +513,8 @@ static void efx_ethtool_get_stats(struct net_device *net_dev,
                        break;
                }
        }
+
+       spin_unlock_bh(&efx->stats_lock);
 }
 
 static void efx_ethtool_self_test(struct net_device *net_dev,
@@ -747,7 +737,7 @@ static int efx_ethtool_set_pauseparam(struct net_device *net_dev,
                        /* Recover by resetting the EM block */
                        falcon_stop_nic_stats(efx);
                        falcon_drain_tx_fifo(efx);
-                       efx->mac_op->reconfigure(efx);
+                       falcon_reconfigure_xmac(efx);
                        falcon_start_nic_stats(efx);
                } else {
                        /* Schedule a reset to recover */
@@ -772,7 +762,7 @@ static int efx_ethtool_set_pauseparam(struct net_device *net_dev,
        /* Reconfigure the MAC. The PHY *may* generate a link state change event
         * if the user just changed the advertised capabilities, but there's no
         * harm doing this twice */
-       efx->mac_op->reconfigure(efx);
+       efx->type->reconfigure_mac(efx);
 
 out:
        mutex_unlock(&efx->mac_lock);
@@ -818,11 +808,16 @@ static int efx_ethtool_reset(struct net_device *net_dev, u32 *flags)
        return efx_reset(efx, rc);
 }
 
+/* MAC address mask including only MC flag */
+static const u8 mac_addr_mc_mask[ETH_ALEN] = { 0x01, 0, 0, 0, 0, 0 };
+
 static int efx_ethtool_get_class_rule(struct efx_nic *efx,
                                      struct ethtool_rx_flow_spec *rule)
 {
        struct ethtool_tcpip4_spec *ip_entry = &rule->h_u.tcp_ip4_spec;
        struct ethtool_tcpip4_spec *ip_mask = &rule->m_u.tcp_ip4_spec;
+       struct ethhdr *mac_entry = &rule->h_u.ether_spec;
+       struct ethhdr *mac_mask = &rule->m_u.ether_spec;
        struct efx_filter_spec spec;
        u16 vid;
        u8 proto;
@@ -838,11 +833,18 @@ static int efx_ethtool_get_class_rule(struct efx_nic *efx,
        else
                rule->ring_cookie = spec.dmaq_id;
 
-       rc = efx_filter_get_eth_local(&spec, &vid,
-                                     rule->h_u.ether_spec.h_dest);
+       if (spec.type == EFX_FILTER_MC_DEF || spec.type == EFX_FILTER_UC_DEF) {
+               rule->flow_type = ETHER_FLOW;
+               memcpy(mac_mask->h_dest, mac_addr_mc_mask, ETH_ALEN);
+               if (spec.type == EFX_FILTER_MC_DEF)
+                       memcpy(mac_entry->h_dest, mac_addr_mc_mask, ETH_ALEN);
+               return 0;
+       }
+
+       rc = efx_filter_get_eth_local(&spec, &vid, mac_entry->h_dest);
        if (rc == 0) {
                rule->flow_type = ETHER_FLOW;
-               memset(rule->m_u.ether_spec.h_dest, ~0, ETH_ALEN);
+               memset(mac_mask->h_dest, ~0, ETH_ALEN);
                if (vid != EFX_FILTER_VID_UNSPEC) {
                        rule->flow_type |= FLOW_EXT;
                        rule->h_ext.vlan_tci = htons(vid);
@@ -1011,27 +1013,40 @@ static int efx_ethtool_set_class_rule(struct efx_nic *efx,
        }
 
        case ETHER_FLOW | FLOW_EXT:
-               /* Must match all or none of VID */
-               if (rule->m_ext.vlan_tci != htons(0xfff) &&
-                   rule->m_ext.vlan_tci != 0)
-                       return -EINVAL;
-       case ETHER_FLOW:
-               /* Must match all of destination */
-               if (!is_broadcast_ether_addr(mac_mask->h_dest))
-                       return -EINVAL;
-               /* and nothing else */
+       case ETHER_FLOW: {
+               u16 vlan_tag_mask = (rule->flow_type & FLOW_EXT ?
+                                    ntohs(rule->m_ext.vlan_tci) : 0);
+
+               /* Must not match on source address or Ethertype */
                if (!is_zero_ether_addr(mac_mask->h_source) ||
                    mac_mask->h_proto)
                        return -EINVAL;
 
-               rc = efx_filter_set_eth_local(
-                       &spec,
-                       (rule->flow_type & FLOW_EXT && rule->m_ext.vlan_tci) ?
-                       ntohs(rule->h_ext.vlan_tci) : EFX_FILTER_VID_UNSPEC,
-                       mac_entry->h_dest);
+               /* Is it a default UC or MC filter? */
+               if (!compare_ether_addr(mac_mask->h_dest, mac_addr_mc_mask) &&
+                   vlan_tag_mask == 0) {
+                       if (is_multicast_ether_addr(mac_entry->h_dest))
+                               rc = efx_filter_set_mc_def(&spec);
+                       else
+                               rc = efx_filter_set_uc_def(&spec);
+               }
+               /* Otherwise, it must match all of destination and all
+                * or none of VID.
+                */
+               else if (is_broadcast_ether_addr(mac_mask->h_dest) &&
+                        (vlan_tag_mask == 0xfff || vlan_tag_mask == 0)) {
+                       rc = efx_filter_set_eth_local(
+                               &spec,
+                               vlan_tag_mask ?
+                               ntohs(rule->h_ext.vlan_tci) : EFX_FILTER_VID_UNSPEC,
+                               mac_entry->h_dest);
+               } else {
+                       rc = -EINVAL;
+               }
                if (rc)
                        return rc;
                break;
+       }
 
        default:
                return -EINVAL;
@@ -1070,7 +1085,8 @@ static u32 efx_ethtool_get_rxfh_indir_size(struct net_device *net_dev)
 {
        struct efx_nic *efx = netdev_priv(net_dev);
 
-       return (efx_nic_rev(efx) < EFX_REV_FALCON_B0 ?
+       return ((efx_nic_rev(efx) < EFX_REV_FALCON_B0 ||
+                efx->n_rx_channels == 1) ?
                0 : ARRAY_SIZE(efx->rx_indir_table));
 }
 
index 8ae1ebd..3a1ca2b 100644 (file)
@@ -19,7 +19,6 @@
 #include "net_driver.h"
 #include "bitfield.h"
 #include "efx.h"
-#include "mac.h"
 #include "spi.h"
 #include "nic.h"
 #include "regs.h"
@@ -89,7 +88,7 @@ static int falcon_getscl(void *data)
        return EFX_OWORD_FIELD(reg, FRF_AB_GPIO0_IN);
 }
 
-static struct i2c_algo_bit_data falcon_i2c_bit_operations = {
+static const struct i2c_algo_bit_data falcon_i2c_bit_operations = {
        .setsda         = falcon_setsda,
        .setscl         = falcon_setscl,
        .getsda         = falcon_getsda,
@@ -104,8 +103,6 @@ static void falcon_push_irq_moderation(struct efx_channel *channel)
        efx_dword_t timer_cmd;
        struct efx_nic *efx = channel->efx;
 
-       BUILD_BUG_ON(EFX_IRQ_MOD_MAX > (1 << FRF_AB_TC_TIMER_VAL_WIDTH));
-
        /* Set timer register */
        if (channel->irq_moderation) {
                EFX_POPULATE_DWORD_2(timer_cmd,
@@ -177,27 +174,24 @@ irqreturn_t falcon_legacy_interrupt_a1(int irq, void *dev_id)
                   "IRQ %d on CPU %d status " EFX_OWORD_FMT "\n",
                   irq, raw_smp_processor_id(), EFX_OWORD_VAL(*int_ker));
 
+       /* Check to see if we have a serious error condition */
+       syserr = EFX_OWORD_FIELD(*int_ker, FSF_AZ_NET_IVEC_FATAL_INT);
+       if (unlikely(syserr))
+               return efx_nic_fatal_interrupt(efx);
+
        /* Determine interrupting queues, clear interrupt status
         * register and acknowledge the device interrupt.
         */
        BUILD_BUG_ON(FSF_AZ_NET_IVEC_INT_Q_WIDTH > EFX_MAX_CHANNELS);
        queues = EFX_OWORD_FIELD(*int_ker, FSF_AZ_NET_IVEC_INT_Q);
-
-       /* Check to see if we have a serious error condition */
-       if (queues & (1U << efx->fatal_irq_level)) {
-               syserr = EFX_OWORD_FIELD(*int_ker, FSF_AZ_NET_IVEC_FATAL_INT);
-               if (unlikely(syserr))
-                       return efx_nic_fatal_interrupt(efx);
-       }
-
        EFX_ZERO_OWORD(*int_ker);
        wmb(); /* Ensure the vector is cleared before interrupt ack */
        falcon_irq_ack_a1(efx);
 
        if (queues & 1)
-               efx_schedule_channel(efx_get_channel(efx, 0));
+               efx_schedule_channel_irq(efx_get_channel(efx, 0));
        if (queues & 2)
-               efx_schedule_channel(efx_get_channel(efx, 1));
+               efx_schedule_channel_irq(efx_get_channel(efx, 1));
        return IRQ_HANDLED;
 }
 /**************************************************************************
@@ -613,7 +607,7 @@ static void falcon_stats_complete(struct efx_nic *efx)
        nic_data->stats_pending = false;
        if (*nic_data->stats_dma_done == FALCON_STATS_DONE) {
                rmb(); /* read the done flag before the stats */
-               efx->mac_op->update_stats(efx);
+               falcon_update_stats_xmac(efx);
        } else {
                netif_err(efx, hw, efx->net_dev,
                          "timed out waiting for statistics\n");
@@ -670,7 +664,7 @@ static int falcon_reconfigure_port(struct efx_nic *efx)
        falcon_reset_macs(efx);
 
        efx->phy_op->reconfigure(efx);
-       rc = efx->mac_op->reconfigure(efx);
+       rc = falcon_reconfigure_xmac(efx);
        BUG_ON(rc);
 
        falcon_start_nic_stats(efx);
@@ -1218,7 +1212,7 @@ static void falcon_monitor(struct efx_nic *efx)
                falcon_deconfigure_mac_wrapper(efx);
 
                falcon_reset_macs(efx);
-               rc = efx->mac_op->reconfigure(efx);
+               rc = falcon_reconfigure_xmac(efx);
                BUG_ON(rc);
 
                falcon_start_nic_stats(efx);
@@ -1339,6 +1333,12 @@ out:
        return rc;
 }
 
+static void falcon_dimension_resources(struct efx_nic *efx)
+{
+       efx->rx_dc_base = 0x20000;
+       efx->tx_dc_base = 0x26000;
+}
+
 /* Probe all SPI devices on the NIC */
 static void falcon_probe_spi_devices(struct efx_nic *efx)
 {
@@ -1472,6 +1472,8 @@ static int falcon_probe_nic(struct efx_nic *efx)
                goto fail5;
        }
 
+       efx->timer_quantum_ns = 4968; /* 621 cycles */
+
        /* Initialise I2C adapter */
        board = falcon_board(efx);
        board->i2c_adap.owner = THIS_MODULE;
@@ -1676,7 +1678,7 @@ static void falcon_update_nic_stats(struct efx_nic *efx)
            *nic_data->stats_dma_done == FALCON_STATS_DONE) {
                nic_data->stats_pending = false;
                rmb(); /* read the done flag before the stats */
-               efx->mac_op->update_stats(efx);
+               falcon_update_stats_xmac(efx);
        }
 }
 
@@ -1753,6 +1755,7 @@ const struct efx_nic_type falcon_a1_nic_type = {
        .probe = falcon_probe_nic,
        .remove = falcon_remove_nic,
        .init = falcon_init_nic,
+       .dimension_resources = falcon_dimension_resources,
        .fini = efx_port_dummy_op_void,
        .monitor = falcon_monitor,
        .map_reset_reason = falcon_map_reset_reason,
@@ -1767,13 +1770,13 @@ const struct efx_nic_type falcon_a1_nic_type = {
        .stop_stats = falcon_stop_nic_stats,
        .set_id_led = falcon_set_id_led,
        .push_irq_moderation = falcon_push_irq_moderation,
-       .push_multicast_hash = falcon_push_multicast_hash,
        .reconfigure_port = falcon_reconfigure_port,
+       .reconfigure_mac = falcon_reconfigure_xmac,
+       .check_mac_fault = falcon_xmac_check_fault,
        .get_wol = falcon_get_wol,
        .set_wol = falcon_set_wol,
        .resume_wol = efx_port_dummy_op_void,
        .test_nvram = falcon_test_nvram,
-       .default_mac_ops = &falcon_xmac_operations,
 
        .revision = EFX_REV_FALCON_A1,
        .mem_map_size = 0x20000,
@@ -1786,8 +1789,7 @@ const struct efx_nic_type falcon_a1_nic_type = {
        .rx_buffer_padding = 0x24,
        .max_interrupt_mode = EFX_INT_MODE_MSI,
        .phys_addr_channels = 4,
-       .tx_dc_base = 0x130000,
-       .rx_dc_base = 0x100000,
+       .timer_period_max =  1 << FRF_AB_TC_TIMER_VAL_WIDTH,
        .offload_features = NETIF_F_IP_CSUM,
 };
 
@@ -1795,6 +1797,7 @@ const struct efx_nic_type falcon_b0_nic_type = {
        .probe = falcon_probe_nic,
        .remove = falcon_remove_nic,
        .init = falcon_init_nic,
+       .dimension_resources = falcon_dimension_resources,
        .fini = efx_port_dummy_op_void,
        .monitor = falcon_monitor,
        .map_reset_reason = falcon_map_reset_reason,
@@ -1809,14 +1812,14 @@ const struct efx_nic_type falcon_b0_nic_type = {
        .stop_stats = falcon_stop_nic_stats,
        .set_id_led = falcon_set_id_led,
        .push_irq_moderation = falcon_push_irq_moderation,
-       .push_multicast_hash = falcon_push_multicast_hash,
        .reconfigure_port = falcon_reconfigure_port,
+       .reconfigure_mac = falcon_reconfigure_xmac,
+       .check_mac_fault = falcon_xmac_check_fault,
        .get_wol = falcon_get_wol,
        .set_wol = falcon_set_wol,
        .resume_wol = efx_port_dummy_op_void,
        .test_registers = falcon_b0_test_registers,
        .test_nvram = falcon_test_nvram,
-       .default_mac_ops = &falcon_xmac_operations,
 
        .revision = EFX_REV_FALCON_B0,
        /* Map everything up to and including the RSS indirection
@@ -1837,8 +1840,7 @@ const struct efx_nic_type falcon_b0_nic_type = {
        .phys_addr_channels = 32, /* Hardware limit is 64, but the legacy
                                   * interrupt handler only supports 32
                                   * channels */
-       .tx_dc_base = 0x130000,
-       .rx_dc_base = 0x100000,
+       .timer_period_max =  1 << FRF_AB_TC_TIMER_VAL_WIDTH,
        .offload_features = NETIF_F_IP_CSUM | NETIF_F_RXHASH | NETIF_F_NTUPLE,
 };
 
index 6cc16b8..2084cc6 100644 (file)
@@ -87,7 +87,7 @@ static const u8 falcon_lm87_common_regs[] = {
        0
 };
 
-static int efx_init_lm87(struct efx_nic *efx, struct i2c_board_info *info,
+static int efx_init_lm87(struct efx_nic *efx, const struct i2c_board_info *info,
                         const u8 *reg_values)
 {
        struct falcon_board *board = falcon_board(efx);
@@ -179,7 +179,7 @@ static int efx_check_lm87(struct efx_nic *efx, unsigned mask)
 #else /* !CONFIG_SENSORS_LM87 */
 
 static inline int
-efx_init_lm87(struct efx_nic *efx, struct i2c_board_info *info,
+efx_init_lm87(struct efx_nic *efx, const struct i2c_board_info *info,
              const u8 *reg_values)
 {
        return 0;
@@ -442,7 +442,7 @@ static int sfe4001_check_hw(struct efx_nic *efx)
        return (status < 0) ? -EIO : -ERANGE;
 }
 
-static struct i2c_board_info sfe4001_hwmon_info = {
+static const struct i2c_board_info sfe4001_hwmon_info = {
        I2C_BOARD_INFO("max6647", 0x4e),
 };
 
@@ -522,7 +522,7 @@ static const u8 sfe4002_lm87_regs[] = {
        0
 };
 
-static struct i2c_board_info sfe4002_hwmon_info = {
+static const struct i2c_board_info sfe4002_hwmon_info = {
        I2C_BOARD_INFO("lm87", 0x2e),
        .platform_data  = &sfe4002_lm87_channel,
 };
@@ -591,7 +591,7 @@ static const u8 sfn4112f_lm87_regs[] = {
        0
 };
 
-static struct i2c_board_info sfn4112f_hwmon_info = {
+static const struct i2c_board_info sfn4112f_hwmon_info = {
        I2C_BOARD_INFO("lm87", 0x2e),
        .platform_data  = &sfn4112f_lm87_channel,
 };
@@ -653,7 +653,7 @@ static const u8 sfe4003_lm87_regs[] = {
        0
 };
 
-static struct i2c_board_info sfe4003_hwmon_info = {
+static const struct i2c_board_info sfe4003_hwmon_info = {
        I2C_BOARD_INFO("lm87", 0x2e),
        .platform_data  = &sfe4003_lm87_channel,
 };
index 9516452..6106ef1 100644 (file)
@@ -14,7 +14,6 @@
 #include "nic.h"
 #include "regs.h"
 #include "io.h"
-#include "mac.h"
 #include "mdio_10g.h"
 #include "workarounds.h"
 
@@ -139,7 +138,7 @@ static bool falcon_xmac_link_ok(struct efx_nic *efx)
        return (efx->loopback_mode == LOOPBACK_XGMII ||
                falcon_xgxs_link_ok(efx)) &&
                (!(efx->mdio.mmds & (1 << MDIO_MMD_PHYXS)) ||
-                LOOPBACK_INTERNAL(efx) || 
+                LOOPBACK_INTERNAL(efx) ||
                 efx_mdio_phyxgxs_lane_sync(efx));
 }
 
@@ -270,12 +269,12 @@ static bool falcon_xmac_link_ok_retry(struct efx_nic *efx, int tries)
        return mac_up;
 }
 
-static bool falcon_xmac_check_fault(struct efx_nic *efx)
+bool falcon_xmac_check_fault(struct efx_nic *efx)
 {
        return !falcon_xmac_link_ok_retry(efx, 5);
 }
 
-static int falcon_reconfigure_xmac(struct efx_nic *efx)
+int falcon_reconfigure_xmac(struct efx_nic *efx)
 {
        struct falcon_nic_data *nic_data = efx->nic_data;
 
@@ -290,7 +289,7 @@ static int falcon_reconfigure_xmac(struct efx_nic *efx)
        return 0;
 }
 
-static void falcon_update_stats_xmac(struct efx_nic *efx)
+void falcon_update_stats_xmac(struct efx_nic *efx)
 {
        struct efx_mac_stats *mac_stats = &efx->mac_stats;
 
@@ -361,9 +360,3 @@ void falcon_poll_xmac(struct efx_nic *efx)
        nic_data->xmac_poll_required = !falcon_xmac_link_ok_retry(efx, 1);
        falcon_ack_status_intr(efx);
 }
-
-const struct efx_mac_operations falcon_xmac_operations = {
-       .reconfigure    = falcon_reconfigure_xmac,
-       .update_stats   = falcon_update_stats_xmac,
-       .check_fault    = falcon_xmac_check_fault,
-};
index 1fbbbee..fea7f73 100644 (file)
 enum efx_filter_table_id {
        EFX_FILTER_TABLE_RX_IP = 0,
        EFX_FILTER_TABLE_RX_MAC,
+       EFX_FILTER_TABLE_RX_DEF,
+       EFX_FILTER_TABLE_TX_MAC,
        EFX_FILTER_TABLE_COUNT,
 };
 
+enum efx_filter_index {
+       EFX_FILTER_INDEX_UC_DEF,
+       EFX_FILTER_INDEX_MC_DEF,
+       EFX_FILTER_SIZE_RX_DEF,
+};
+
 struct efx_filter_table {
        enum efx_filter_table_id id;
        u32             offset;         /* address of table relative to BAR */
@@ -90,8 +98,9 @@ efx_filter_spec_table_id(const struct efx_filter_spec *spec)
        BUILD_BUG_ON(EFX_FILTER_TABLE_RX_IP != (EFX_FILTER_UDP_WILD >> 2));
        BUILD_BUG_ON(EFX_FILTER_TABLE_RX_MAC != (EFX_FILTER_MAC_FULL >> 2));
        BUILD_BUG_ON(EFX_FILTER_TABLE_RX_MAC != (EFX_FILTER_MAC_WILD >> 2));
+       BUILD_BUG_ON(EFX_FILTER_TABLE_TX_MAC != EFX_FILTER_TABLE_RX_MAC + 2);
        EFX_BUG_ON_PARANOID(spec->type == EFX_FILTER_UNSPEC);
-       return spec->type >> 2;
+       return (spec->type >> 2) + ((spec->flags & EFX_FILTER_FLAG_TX) ? 2 : 0);
 }
 
 static struct efx_filter_table *
@@ -109,7 +118,7 @@ static void efx_filter_table_reset_search_depth(struct efx_filter_table *table)
        memset(table->search_depth, 0, sizeof(table->search_depth));
 }
 
-static void efx_filter_push_rx_limits(struct efx_nic *efx)
+static void efx_filter_push_rx_config(struct efx_nic *efx)
 {
        struct efx_filter_state *state = efx->filter_state;
        struct efx_filter_table *table;
@@ -143,9 +152,58 @@ static void efx_filter_push_rx_limits(struct efx_nic *efx)
                        FILTER_CTL_SRCH_FUDGE_WILD);
        }
 
+       table = &state->table[EFX_FILTER_TABLE_RX_DEF];
+       if (table->size) {
+               EFX_SET_OWORD_FIELD(
+                       filter_ctl, FRF_CZ_UNICAST_NOMATCH_Q_ID,
+                       table->spec[EFX_FILTER_INDEX_UC_DEF].dmaq_id);
+               EFX_SET_OWORD_FIELD(
+                       filter_ctl, FRF_CZ_UNICAST_NOMATCH_RSS_ENABLED,
+                       !!(table->spec[EFX_FILTER_INDEX_UC_DEF].flags &
+                          EFX_FILTER_FLAG_RX_RSS));
+               EFX_SET_OWORD_FIELD(
+                       filter_ctl, FRF_CZ_UNICAST_NOMATCH_IP_OVERRIDE,
+                       !!(table->spec[EFX_FILTER_INDEX_UC_DEF].flags &
+                          EFX_FILTER_FLAG_RX_OVERRIDE_IP));
+               EFX_SET_OWORD_FIELD(
+                       filter_ctl, FRF_CZ_MULTICAST_NOMATCH_Q_ID,
+                       table->spec[EFX_FILTER_INDEX_MC_DEF].dmaq_id);
+               EFX_SET_OWORD_FIELD(
+                       filter_ctl, FRF_CZ_MULTICAST_NOMATCH_RSS_ENABLED,
+                       !!(table->spec[EFX_FILTER_INDEX_MC_DEF].flags &
+                          EFX_FILTER_FLAG_RX_RSS));
+               EFX_SET_OWORD_FIELD(
+                       filter_ctl, FRF_CZ_MULTICAST_NOMATCH_IP_OVERRIDE,
+                       !!(table->spec[EFX_FILTER_INDEX_MC_DEF].flags &
+                          EFX_FILTER_FLAG_RX_OVERRIDE_IP));
+       }
+
        efx_writeo(efx, &filter_ctl, FR_BZ_RX_FILTER_CTL);
 }
 
+static void efx_filter_push_tx_limits(struct efx_nic *efx)
+{
+       struct efx_filter_state *state = efx->filter_state;
+       struct efx_filter_table *table;
+       efx_oword_t tx_cfg;
+
+       efx_reado(efx, &tx_cfg, FR_AZ_TX_CFG);
+
+       table = &state->table[EFX_FILTER_TABLE_TX_MAC];
+       if (table->size) {
+               EFX_SET_OWORD_FIELD(
+                       tx_cfg, FRF_CZ_TX_ETH_FILTER_FULL_SEARCH_RANGE,
+                       table->search_depth[EFX_FILTER_MAC_FULL] +
+                       FILTER_CTL_SRCH_FUDGE_FULL);
+               EFX_SET_OWORD_FIELD(
+                       tx_cfg, FRF_CZ_TX_ETH_FILTER_WILD_SEARCH_RANGE,
+                       table->search_depth[EFX_FILTER_MAC_WILD] +
+                       FILTER_CTL_SRCH_FUDGE_WILD);
+       }
+
+       efx_writeo(efx, &tx_cfg, FR_AZ_TX_CFG);
+}
+
 static inline void __efx_filter_set_ipv4(struct efx_filter_spec *spec,
                                         __be32 host1, __be16 port1,
                                         __be32 host2, __be16 port2)
@@ -300,7 +358,8 @@ int efx_filter_get_ipv4_full(const struct efx_filter_spec *spec,
 int efx_filter_set_eth_local(struct efx_filter_spec *spec,
                             u16 vid, const u8 *addr)
 {
-       EFX_BUG_ON_PARANOID(!(spec->flags & EFX_FILTER_FLAG_RX));
+       EFX_BUG_ON_PARANOID(!(spec->flags &
+                             (EFX_FILTER_FLAG_RX | EFX_FILTER_FLAG_TX)));
 
        /* This cannot currently be combined with other filtering */
        if (spec->type != EFX_FILTER_UNSPEC)
@@ -319,6 +378,52 @@ int efx_filter_set_eth_local(struct efx_filter_spec *spec,
        return 0;
 }
 
+/**
+ * efx_filter_set_uc_def - specify matching otherwise-unmatched unicast
+ * @spec: Specification to initialise
+ */
+int efx_filter_set_uc_def(struct efx_filter_spec *spec)
+{
+       EFX_BUG_ON_PARANOID(!(spec->flags &
+                             (EFX_FILTER_FLAG_RX | EFX_FILTER_FLAG_TX)));
+
+       if (spec->type != EFX_FILTER_UNSPEC)
+               return -EINVAL;
+
+       spec->type = EFX_FILTER_UC_DEF;
+       memset(spec->data, 0, sizeof(spec->data)); /* ensure equality */
+       return 0;
+}
+
+/**
+ * efx_filter_set_mc_def - specify matching otherwise-unmatched multicast
+ * @spec: Specification to initialise
+ */
+int efx_filter_set_mc_def(struct efx_filter_spec *spec)
+{
+       EFX_BUG_ON_PARANOID(!(spec->flags &
+                             (EFX_FILTER_FLAG_RX | EFX_FILTER_FLAG_TX)));
+
+       if (spec->type != EFX_FILTER_UNSPEC)
+               return -EINVAL;
+
+       spec->type = EFX_FILTER_MC_DEF;
+       memset(spec->data, 0, sizeof(spec->data)); /* ensure equality */
+       return 0;
+}
+
+static void efx_filter_reset_rx_def(struct efx_nic *efx, unsigned filter_idx)
+{
+       struct efx_filter_state *state = efx->filter_state;
+       struct efx_filter_table *table = &state->table[EFX_FILTER_TABLE_RX_DEF];
+       struct efx_filter_spec *spec = &table->spec[filter_idx];
+
+       efx_filter_init_rx(spec, EFX_FILTER_PRI_MANUAL,
+                          EFX_FILTER_FLAG_RX_RSS, 0);
+       spec->type = EFX_FILTER_UC_DEF + filter_idx;
+       table->used_bitmap[0] |= 1 << filter_idx;
+}
+
 int efx_filter_get_eth_local(const struct efx_filter_spec *spec,
                             u16 *vid, u8 *addr)
 {
@@ -366,6 +471,13 @@ static u32 efx_filter_build(efx_oword_t *filter, struct efx_filter_spec *spec)
                break;
        }
 
+       case EFX_FILTER_TABLE_RX_DEF:
+               /* One filter spec per type */
+               BUILD_BUG_ON(EFX_FILTER_INDEX_UC_DEF != 0);
+               BUILD_BUG_ON(EFX_FILTER_INDEX_MC_DEF !=
+                            EFX_FILTER_MC_DEF - EFX_FILTER_UC_DEF);
+               return spec->type - EFX_FILTER_UC_DEF;
+
        case EFX_FILTER_TABLE_RX_MAC: {
                bool is_wild = spec->type == EFX_FILTER_MAC_WILD;
                EFX_POPULATE_OWORD_8(
@@ -385,6 +497,18 @@ static u32 efx_filter_build(efx_oword_t *filter, struct efx_filter_spec *spec)
                break;
        }
 
+       case EFX_FILTER_TABLE_TX_MAC: {
+               bool is_wild = spec->type == EFX_FILTER_MAC_WILD;
+               EFX_POPULATE_OWORD_5(*filter,
+                                    FRF_CZ_TMFT_TXQ_ID, spec->dmaq_id,
+                                    FRF_CZ_TMFT_WILDCARD_MATCH, is_wild,
+                                    FRF_CZ_TMFT_SRC_MAC_HI, spec->data[2],
+                                    FRF_CZ_TMFT_SRC_MAC_LO, spec->data[1],
+                                    FRF_CZ_TMFT_VLAN_ID, spec->data[0]);
+               data3 = is_wild | spec->dmaq_id << 1;
+               break;
+       }
+
        default:
                BUG();
        }
@@ -399,6 +523,10 @@ static bool efx_filter_equal(const struct efx_filter_spec *left,
            memcmp(left->data, right->data, sizeof(left->data)))
                return false;
 
+       if (left->flags & EFX_FILTER_FLAG_TX &&
+           left->dmaq_id != right->dmaq_id)
+               return false;
+
        return true;
 }
 
@@ -448,23 +576,40 @@ static int efx_filter_search(struct efx_filter_table *table,
  * MAC filters without overriding behaviour.
  */
 
+#define EFX_FILTER_MATCH_PRI_RX_MAC_OVERRIDE_IP        0
+#define EFX_FILTER_MATCH_PRI_RX_DEF_OVERRIDE_IP        1
+#define EFX_FILTER_MATCH_PRI_NORMAL_BASE       2
+
 #define EFX_FILTER_INDEX_WIDTH 13
 #define EFX_FILTER_INDEX_MASK  ((1 << EFX_FILTER_INDEX_WIDTH) - 1)
 
 static inline u32 efx_filter_make_id(enum efx_filter_table_id table_id,
                                     unsigned int index, u8 flags)
 {
-       return (table_id == EFX_FILTER_TABLE_RX_MAC &&
-               flags & EFX_FILTER_FLAG_RX_OVERRIDE_IP) ?
-               index :
-               (table_id + 1) << EFX_FILTER_INDEX_WIDTH | index;
+       unsigned int match_pri = EFX_FILTER_MATCH_PRI_NORMAL_BASE + table_id;
+
+       if (flags & EFX_FILTER_FLAG_RX_OVERRIDE_IP) {
+               if (table_id == EFX_FILTER_TABLE_RX_MAC)
+                       match_pri = EFX_FILTER_MATCH_PRI_RX_MAC_OVERRIDE_IP;
+               else if (table_id == EFX_FILTER_TABLE_RX_DEF)
+                       match_pri = EFX_FILTER_MATCH_PRI_RX_DEF_OVERRIDE_IP;
+       }
+
+       return match_pri << EFX_FILTER_INDEX_WIDTH | index;
 }
 
 static inline enum efx_filter_table_id efx_filter_id_table_id(u32 id)
 {
-       return (id <= EFX_FILTER_INDEX_MASK) ?
-               EFX_FILTER_TABLE_RX_MAC :
-               (id >> EFX_FILTER_INDEX_WIDTH) - 1;
+       unsigned int match_pri = id >> EFX_FILTER_INDEX_WIDTH;
+
+       switch (match_pri) {
+       case EFX_FILTER_MATCH_PRI_RX_MAC_OVERRIDE_IP:
+               return EFX_FILTER_TABLE_RX_MAC;
+       case EFX_FILTER_MATCH_PRI_RX_DEF_OVERRIDE_IP:
+               return EFX_FILTER_TABLE_RX_DEF;
+       default:
+               return match_pri - EFX_FILTER_MATCH_PRI_NORMAL_BASE;
+       }
 }
 
 static inline unsigned int efx_filter_id_index(u32 id)
@@ -474,23 +619,30 @@ static inline unsigned int efx_filter_id_index(u32 id)
 
 static inline u8 efx_filter_id_flags(u32 id)
 {
-       return (id <= EFX_FILTER_INDEX_MASK) ?
-               EFX_FILTER_FLAG_RX | EFX_FILTER_FLAG_RX_OVERRIDE_IP :
-               EFX_FILTER_FLAG_RX;
+       unsigned int match_pri = id >> EFX_FILTER_INDEX_WIDTH;
+
+       if (match_pri < EFX_FILTER_MATCH_PRI_NORMAL_BASE)
+               return EFX_FILTER_FLAG_RX | EFX_FILTER_FLAG_RX_OVERRIDE_IP;
+       else if (match_pri <=
+                EFX_FILTER_MATCH_PRI_NORMAL_BASE + EFX_FILTER_TABLE_RX_DEF)
+               return EFX_FILTER_FLAG_RX;
+       else
+               return EFX_FILTER_FLAG_TX;
 }
 
 u32 efx_filter_get_rx_id_limit(struct efx_nic *efx)
 {
        struct efx_filter_state *state = efx->filter_state;
+       unsigned int table_id = EFX_FILTER_TABLE_RX_DEF;
 
-       if (state->table[EFX_FILTER_TABLE_RX_MAC].size != 0)
-               return ((EFX_FILTER_TABLE_RX_MAC + 1) << EFX_FILTER_INDEX_WIDTH)
-                       + state->table[EFX_FILTER_TABLE_RX_MAC].size;
-       else if (state->table[EFX_FILTER_TABLE_RX_IP].size != 0)
-               return ((EFX_FILTER_TABLE_RX_IP + 1) << EFX_FILTER_INDEX_WIDTH)
-                       + state->table[EFX_FILTER_TABLE_RX_IP].size;
-       else
-               return 0;
+       do {
+               if (state->table[table_id].size != 0)
+                       return ((EFX_FILTER_MATCH_PRI_NORMAL_BASE + table_id)
+                               << EFX_FILTER_INDEX_WIDTH) +
+                               state->table[table_id].size;
+       } while (table_id--);
+
+       return 0;
 }
 
 /**
@@ -548,12 +700,20 @@ s32 efx_filter_insert_filter(struct efx_nic *efx, struct efx_filter_spec *spec,
        }
        *saved_spec = *spec;
 
-       if (table->search_depth[spec->type] < depth) {
-               table->search_depth[spec->type] = depth;
-               efx_filter_push_rx_limits(efx);
-       }
+       if (table->id == EFX_FILTER_TABLE_RX_DEF) {
+               efx_filter_push_rx_config(efx);
+       } else {
+               if (table->search_depth[spec->type] < depth) {
+                       table->search_depth[spec->type] = depth;
+                       if (spec->flags & EFX_FILTER_FLAG_TX)
+                               efx_filter_push_tx_limits(efx);
+                       else
+                               efx_filter_push_rx_config(efx);
+               }
 
-       efx_writeo(efx, &filter, table->offset + table->step * filter_idx);
+               efx_writeo(efx, &filter,
+                          table->offset + table->step * filter_idx);
+       }
 
        netif_vdbg(efx, hw, efx->net_dev,
                   "%s: filter type %d index %d rxq %u set",
@@ -571,7 +731,11 @@ static void efx_filter_table_clear_entry(struct efx_nic *efx,
 {
        static efx_oword_t filter;
 
-       if (test_bit(filter_idx, table->used_bitmap)) {
+       if (table->id == EFX_FILTER_TABLE_RX_DEF) {
+               /* RX default filters must always exist */
+               efx_filter_reset_rx_def(efx, filter_idx);
+               efx_filter_push_rx_config(efx);
+       } else if (test_bit(filter_idx, table->used_bitmap)) {
                __clear_bit(filter_idx, table->used_bitmap);
                --table->used;
                memset(&table->spec[filter_idx], 0, sizeof(table->spec[0]));
@@ -617,7 +781,8 @@ int efx_filter_remove_id_safe(struct efx_nic *efx,
        spin_lock_bh(&state->lock);
 
        if (test_bit(filter_idx, table->used_bitmap) &&
-           spec->priority == priority && spec->flags == filter_flags) {
+           spec->priority == priority &&
+           !((spec->flags ^ filter_flags) & EFX_FILTER_FLAG_RX_OVERRIDE_IP)) {
                efx_filter_table_clear_entry(efx, table, filter_idx);
                if (table->used == 0)
                        efx_filter_table_reset_search_depth(table);
@@ -668,7 +833,8 @@ int efx_filter_get_filter_safe(struct efx_nic *efx,
        spin_lock_bh(&state->lock);
 
        if (test_bit(filter_idx, table->used_bitmap) &&
-           spec->priority == priority && spec->flags == filter_flags) {
+           spec->priority == priority &&
+           !((spec->flags ^ filter_flags) & EFX_FILTER_FLAG_RX_OVERRIDE_IP)) {
                *spec_buf = *spec;
                rc = 0;
        } else {
@@ -722,7 +888,7 @@ u32 efx_filter_count_rx_used(struct efx_nic *efx,
        spin_lock_bh(&state->lock);
 
        for (table_id = EFX_FILTER_TABLE_RX_IP;
-            table_id <= EFX_FILTER_TABLE_RX_MAC;
+            table_id <= EFX_FILTER_TABLE_RX_DEF;
             table_id++) {
                table = &state->table[table_id];
                for (filter_idx = 0; filter_idx < table->size; filter_idx++) {
@@ -750,7 +916,7 @@ s32 efx_filter_get_rx_ids(struct efx_nic *efx,
        spin_lock_bh(&state->lock);
 
        for (table_id = EFX_FILTER_TABLE_RX_IP;
-            table_id <= EFX_FILTER_TABLE_RX_MAC;
+            table_id <= EFX_FILTER_TABLE_RX_DEF;
             table_id++) {
                table = &state->table[table_id];
                for (filter_idx = 0; filter_idx < table->size; filter_idx++) {
@@ -785,6 +951,11 @@ void efx_restore_filters(struct efx_nic *efx)
 
        for (table_id = 0; table_id < EFX_FILTER_TABLE_COUNT; table_id++) {
                table = &state->table[table_id];
+
+               /* Check whether this is a regular register table */
+               if (table->step == 0)
+                       continue;
+
                for (filter_idx = 0; filter_idx < table->size; filter_idx++) {
                        if (!test_bit(filter_idx, table->used_bitmap))
                                continue;
@@ -794,7 +965,8 @@ void efx_restore_filters(struct efx_nic *efx)
                }
        }
 
-       efx_filter_push_rx_limits(efx);
+       efx_filter_push_rx_config(efx);
+       efx_filter_push_tx_limits(efx);
 
        spin_unlock_bh(&state->lock);
 }
@@ -833,6 +1005,16 @@ int efx_probe_filters(struct efx_nic *efx)
                table->offset = FR_CZ_RX_MAC_FILTER_TBL0;
                table->size = FR_CZ_RX_MAC_FILTER_TBL0_ROWS;
                table->step = FR_CZ_RX_MAC_FILTER_TBL0_STEP;
+
+               table = &state->table[EFX_FILTER_TABLE_RX_DEF];
+               table->id = EFX_FILTER_TABLE_RX_DEF;
+               table->size = EFX_FILTER_SIZE_RX_DEF;
+
+               table = &state->table[EFX_FILTER_TABLE_TX_MAC];
+               table->id = EFX_FILTER_TABLE_TX_MAC;
+               table->offset = FR_CZ_TX_MAC_FILTER_TBL0;
+               table->size = FR_CZ_TX_MAC_FILTER_TBL0_ROWS;
+               table->step = FR_CZ_TX_MAC_FILTER_TBL0_STEP;
        }
 
        for (table_id = 0; table_id < EFX_FILTER_TABLE_COUNT; table_id++) {
@@ -849,6 +1031,15 @@ int efx_probe_filters(struct efx_nic *efx)
                        goto fail;
        }
 
+       if (state->table[EFX_FILTER_TABLE_RX_DEF].size) {
+               /* RX default filters must always exist */
+               unsigned i;
+               for (i = 0; i < EFX_FILTER_SIZE_RX_DEF; i++)
+                       efx_filter_reset_rx_def(efx, i);
+       }
+
+       efx_filter_push_rx_config(efx);
+
        return 0;
 
 fail:
index 3d4108c..3c77802 100644 (file)
@@ -20,6 +20,8 @@
  * @EFX_FILTER_UDP_WILD: Matching UDP/IPv4 destination (host, port)
  * @EFX_FILTER_MAC_FULL: Matching Ethernet destination MAC address, VID
  * @EFX_FILTER_MAC_WILD: Matching Ethernet destination MAC address
+ * @EFX_FILTER_UC_DEF: Matching all otherwise unmatched unicast
+ * @EFX_FILTER_MC_DEF: Matching all otherwise unmatched multicast
  * @EFX_FILTER_UNSPEC: Match type is unspecified
  *
  * Falcon NICs only support the TCP/IPv4 and UDP/IPv4 filter types.
@@ -31,6 +33,8 @@ enum efx_filter_type {
        EFX_FILTER_UDP_WILD,
        EFX_FILTER_MAC_FULL = 4,
        EFX_FILTER_MAC_WILD,
+       EFX_FILTER_UC_DEF = 8,
+       EFX_FILTER_MC_DEF,
        EFX_FILTER_TYPE_COUNT,          /* number of specific types */
        EFX_FILTER_UNSPEC = 0xf,
 };
@@ -39,7 +43,8 @@ enum efx_filter_type {
  * enum efx_filter_priority - priority of a hardware filter specification
  * @EFX_FILTER_PRI_HINT: Performance hint
  * @EFX_FILTER_PRI_MANUAL: Manually configured filter
- * @EFX_FILTER_PRI_REQUIRED: Required for correct behaviour
+ * @EFX_FILTER_PRI_REQUIRED: Required for correct behaviour (user-level
+ *     networking and SR-IOV)
  */
 enum efx_filter_priority {
        EFX_FILTER_PRI_HINT = 0,
@@ -60,12 +65,14 @@ enum efx_filter_priority {
  *     any IP filter that matches the same packet.  By default, IP
  *     filters take precedence.
  * @EFX_FILTER_FLAG_RX: Filter is for RX
+ * @EFX_FILTER_FLAG_TX: Filter is for TX
  */
 enum efx_filter_flags {
        EFX_FILTER_FLAG_RX_RSS = 0x01,
        EFX_FILTER_FLAG_RX_SCATTER = 0x02,
        EFX_FILTER_FLAG_RX_OVERRIDE_IP = 0x04,
        EFX_FILTER_FLAG_RX = 0x08,
+       EFX_FILTER_FLAG_TX = 0x10,
 };
 
 /**
@@ -103,6 +110,15 @@ static inline void efx_filter_init_rx(struct efx_filter_spec *spec,
        spec->dmaq_id = rxq_id;
 }
 
+static inline void efx_filter_init_tx(struct efx_filter_spec *spec,
+                                     unsigned txq_id)
+{
+       spec->type = EFX_FILTER_UNSPEC;
+       spec->priority = EFX_FILTER_PRI_REQUIRED;
+       spec->flags = EFX_FILTER_FLAG_TX;
+       spec->dmaq_id = txq_id;
+}
+
 extern int efx_filter_set_ipv4_local(struct efx_filter_spec *spec, u8 proto,
                                     __be32 host, __be16 port);
 extern int efx_filter_get_ipv4_local(const struct efx_filter_spec *spec,
@@ -117,6 +133,8 @@ extern int efx_filter_set_eth_local(struct efx_filter_spec *spec,
                                    u16 vid, const u8 *addr);
 extern int efx_filter_get_eth_local(const struct efx_filter_spec *spec,
                                    u16 *vid, u8 *addr);
+extern int efx_filter_set_uc_def(struct efx_filter_spec *spec);
+extern int efx_filter_set_mc_def(struct efx_filter_spec *spec);
 enum {
        EFX_FILTER_VID_UNSPEC = 0xffff,
 };
diff --git a/drivers/net/ethernet/sfc/mac.h b/drivers/net/ethernet/sfc/mac.h
deleted file mode 100644 (file)
index d6a255d..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-/****************************************************************************
- * Driver for Solarflare Solarstorm network controllers and boards
- * Copyright 2005-2006 Fen Systems Ltd.
- * Copyright 2006-2009 Solarflare Communications Inc.
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 as published
- * by the Free Software Foundation, incorporated herein by reference.
- */
-
-#ifndef EFX_MAC_H
-#define EFX_MAC_H
-
-#include "net_driver.h"
-
-extern const struct efx_mac_operations falcon_xmac_operations;
-extern const struct efx_mac_operations efx_mcdi_mac_operations;
-extern int efx_mcdi_mac_stats(struct efx_nic *efx, dma_addr_t dma_addr,
-                             u32 dma_len, int enable, int clear);
-
-#endif
index 81a4253..17b6463 100644 (file)
  **************************************************************************
  */
 
-/* Software-defined structure to the shared-memory */
-#define CMD_NOTIFY_PORT0 0
-#define CMD_NOTIFY_PORT1 4
-#define CMD_PDU_PORT0    0x008
-#define CMD_PDU_PORT1    0x108
-#define REBOOT_FLAG_PORT0 0x3f8
-#define REBOOT_FLAG_PORT1 0x3fc
-
 #define MCDI_RPC_TIMEOUT       10 /*seconds */
 
 #define MCDI_PDU(efx)                                                  \
-       (efx_port_num(efx) ? CMD_PDU_PORT1 : CMD_PDU_PORT0)
+       (efx_port_num(efx) ? MC_SMEM_P1_PDU_OFST : MC_SMEM_P0_PDU_OFST)
 #define MCDI_DOORBELL(efx)                                             \
-       (efx_port_num(efx) ? CMD_NOTIFY_PORT1 : CMD_NOTIFY_PORT0)
-#define MCDI_REBOOT_FLAG(efx)                                          \
-       (efx_port_num(efx) ? REBOOT_FLAG_PORT1 : REBOOT_FLAG_PORT0)
+       (efx_port_num(efx) ? MC_SMEM_P1_DOORBELL_OFST : MC_SMEM_P0_DOORBELL_OFST)
+#define MCDI_STATUS(efx)                                               \
+       (efx_port_num(efx) ? MC_SMEM_P1_STATUS_OFST : MC_SMEM_P0_STATUS_OFST)
+
+/* A reboot/assertion causes the MCDI status word to be set after the
+ * command word is set or a REBOOT event is sent. If we notice a reboot
+ * via these mechanisms then wait 10ms for the status word to be set. */
+#define MCDI_STATUS_DELAY_US           100
+#define MCDI_STATUS_DELAY_COUNT                100
+#define MCDI_STATUS_SLEEP_MS                                           \
+       (MCDI_STATUS_DELAY_US * MCDI_STATUS_DELAY_COUNT / 1000)
 
 #define SEQ_MASK                                                       \
        EFX_MASK32(EFX_WIDTH(MCDI_HEADER_SEQ))
@@ -77,7 +77,7 @@ static void efx_mcdi_copyin(struct efx_nic *efx, unsigned cmd,
        u32 xflags, seqno;
 
        BUG_ON(atomic_read(&mcdi->state) == MCDI_STATE_QUIESCENT);
-       BUG_ON(inlen & 3 || inlen >= 0x100);
+       BUG_ON(inlen & 3 || inlen >= MC_SMEM_PDU_LEN);
 
        seqno = mcdi->seqno & SEQ_MASK;
        xflags = 0;
@@ -111,7 +111,7 @@ static void efx_mcdi_copyout(struct efx_nic *efx, u8 *outbuf, size_t outlen)
        int i;
 
        BUG_ON(atomic_read(&mcdi->state) == MCDI_STATE_QUIESCENT);
-       BUG_ON(outlen & 3 || outlen >= 0x100);
+       BUG_ON(outlen & 3 || outlen >= MC_SMEM_PDU_LEN);
 
        for (i = 0; i < outlen; i += 4)
                *((__le32 *)(outbuf + i)) = _efx_readd(efx, pdu + 4 + i);
@@ -210,7 +210,7 @@ out:
 /* Test and clear MC-rebooted flag for this port/function */
 int efx_mcdi_poll_reboot(struct efx_nic *efx)
 {
-       unsigned int addr = FR_CZ_MC_TREG_SMEM + MCDI_REBOOT_FLAG(efx);
+       unsigned int addr = FR_CZ_MC_TREG_SMEM + MCDI_STATUS(efx);
        efx_dword_t reg;
        uint32_t value;
 
@@ -384,6 +384,11 @@ int efx_mcdi_rpc(struct efx_nic *efx, unsigned cmd,
                        netif_dbg(efx, hw, efx->net_dev,
                                  "MC command 0x%x inlen %d failed rc=%d\n",
                                  cmd, (int)inlen, -rc);
+
+               if (rc == -EIO || rc == -EINTR) {
+                       msleep(MCDI_STATUS_SLEEP_MS);
+                       efx_mcdi_poll_reboot(efx);
+               }
        }
 
        efx_mcdi_release(mcdi);
@@ -465,10 +470,20 @@ static void efx_mcdi_ev_death(struct efx_nic *efx, int rc)
                        mcdi->resplen = 0;
                        ++mcdi->credits;
                }
-       } else
+       } else {
+               int count;
+
                /* Nobody was waiting for an MCDI request, so trigger a reset */
                efx_schedule_reset(efx, RESET_TYPE_MC_FAILURE);
 
+               /* Consume the status word since efx_mcdi_rpc_finish() won't */
+               for (count = 0; count < MCDI_STATUS_DELAY_COUNT; ++count) {
+                       if (efx_mcdi_poll_reboot(efx))
+                               break;
+                       udelay(MCDI_STATUS_DELAY_US);
+               }
+       }
+
        spin_unlock(&mcdi->iface_lock);
 }
 
@@ -502,49 +517,6 @@ static void efx_mcdi_process_link_change(struct efx_nic *efx, efx_qword_t *ev)
        efx_link_status_changed(efx);
 }
 
-static const char *sensor_names[] = {
-       [MC_CMD_SENSOR_CONTROLLER_TEMP] = "Controller temp. sensor",
-       [MC_CMD_SENSOR_PHY_COMMON_TEMP] = "PHY shared temp. sensor",
-       [MC_CMD_SENSOR_CONTROLLER_COOLING] = "Controller cooling",
-       [MC_CMD_SENSOR_PHY0_TEMP] = "PHY 0 temp. sensor",
-       [MC_CMD_SENSOR_PHY0_COOLING] = "PHY 0 cooling",
-       [MC_CMD_SENSOR_PHY1_TEMP] = "PHY 1 temp. sensor",
-       [MC_CMD_SENSOR_PHY1_COOLING] = "PHY 1 cooling",
-       [MC_CMD_SENSOR_IN_1V0] = "1.0V supply sensor",
-       [MC_CMD_SENSOR_IN_1V2] = "1.2V supply sensor",
-       [MC_CMD_SENSOR_IN_1V8] = "1.8V supply sensor",
-       [MC_CMD_SENSOR_IN_2V5] = "2.5V supply sensor",
-       [MC_CMD_SENSOR_IN_3V3] = "3.3V supply sensor",
-       [MC_CMD_SENSOR_IN_12V0] = "12V supply sensor"
-};
-
-static const char *sensor_status_names[] = {
-       [MC_CMD_SENSOR_STATE_OK] = "OK",
-       [MC_CMD_SENSOR_STATE_WARNING] = "Warning",
-       [MC_CMD_SENSOR_STATE_FATAL] = "Fatal",
-       [MC_CMD_SENSOR_STATE_BROKEN] = "Device failure",
-};
-
-static void efx_mcdi_sensor_event(struct efx_nic *efx, efx_qword_t *ev)
-{
-       unsigned int monitor, state, value;
-       const char *name, *state_txt;
-       monitor = EFX_QWORD_FIELD(*ev, MCDI_EVENT_SENSOREVT_MONITOR);
-       state = EFX_QWORD_FIELD(*ev, MCDI_EVENT_SENSOREVT_STATE);
-       value = EFX_QWORD_FIELD(*ev, MCDI_EVENT_SENSOREVT_VALUE);
-       /* Deal gracefully with the board having more drivers than we
-        * know about, but do not expect new sensor states. */
-       name = (monitor >= ARRAY_SIZE(sensor_names))
-                                   ? "No sensor name available" :
-                                   sensor_names[monitor];
-       EFX_BUG_ON_PARANOID(state >= ARRAY_SIZE(sensor_status_names));
-       state_txt = sensor_status_names[state];
-
-       netif_err(efx, hw, efx->net_dev,
-                 "Sensor %d (%s) reports condition '%s' for raw value %d\n",
-                 monitor, name, state_txt, value);
-}
-
 /* Called from  falcon_process_eventq for MCDI events */
 void efx_mcdi_process_event(struct efx_channel *channel,
                            efx_qword_t *event)
@@ -588,6 +560,9 @@ void efx_mcdi_process_event(struct efx_channel *channel,
        case MCDI_EVENT_CODE_MAC_STATS_DMA:
                /* MAC stats are gather lazily.  We can ignore this. */
                break;
+       case MCDI_EVENT_CODE_FLR:
+               efx_sriov_flr(efx, MCDI_EVENT_FIELD(*event, FLR_VF));
+               break;
 
        default:
                netif_err(efx, hw, efx->net_dev, "Unknown MCDI event 0x%x\n",
@@ -604,7 +579,7 @@ void efx_mcdi_process_event(struct efx_channel *channel,
 
 void efx_mcdi_print_fwver(struct efx_nic *efx, char *buf, size_t len)
 {
-       u8 outbuf[ALIGN(MC_CMD_GET_VERSION_V1_OUT_LEN, 4)];
+       u8 outbuf[ALIGN(MC_CMD_GET_VERSION_OUT_LEN, 4)];
        size_t outlength;
        const __le16 *ver_words;
        int rc;
@@ -616,7 +591,7 @@ void efx_mcdi_print_fwver(struct efx_nic *efx, char *buf, size_t len)
        if (rc)
                goto fail;
 
-       if (outlength < MC_CMD_GET_VERSION_V1_OUT_LEN) {
+       if (outlength < MC_CMD_GET_VERSION_OUT_LEN) {
                rc = -EIO;
                goto fail;
        }
@@ -663,9 +638,9 @@ fail:
 }
 
 int efx_mcdi_get_board_cfg(struct efx_nic *efx, u8 *mac_address,
-                          u16 *fw_subtype_list)
+                          u16 *fw_subtype_list, u32 *capabilities)
 {
-       uint8_t outbuf[MC_CMD_GET_BOARD_CFG_OUT_LEN];
+       uint8_t outbuf[MC_CMD_GET_BOARD_CFG_OUT_LENMIN];
        size_t outlen;
        int port_num = efx_port_num(efx);
        int offset;
@@ -678,7 +653,7 @@ int efx_mcdi_get_board_cfg(struct efx_nic *efx, u8 *mac_address,
        if (rc)
                goto fail;
 
-       if (outlen < MC_CMD_GET_BOARD_CFG_OUT_LEN) {
+       if (outlen < MC_CMD_GET_BOARD_CFG_OUT_LENMIN) {
                rc = -EIO;
                goto fail;
        }
@@ -691,7 +666,16 @@ int efx_mcdi_get_board_cfg(struct efx_nic *efx, u8 *mac_address,
        if (fw_subtype_list)
                memcpy(fw_subtype_list,
                       outbuf + MC_CMD_GET_BOARD_CFG_OUT_FW_SUBTYPE_LIST_OFST,
-                      MC_CMD_GET_BOARD_CFG_OUT_FW_SUBTYPE_LIST_LEN);
+                      MC_CMD_GET_BOARD_CFG_OUT_FW_SUBTYPE_LIST_MINNUM *
+                      sizeof(fw_subtype_list[0]));
+       if (capabilities) {
+               if (port_num)
+                       *capabilities = MCDI_DWORD(outbuf,
+                                       GET_BOARD_CFG_OUT_CAPABILITIES_PORT1);
+               else
+                       *capabilities = MCDI_DWORD(outbuf,
+                                       GET_BOARD_CFG_OUT_CAPABILITIES_PORT0);
+       }
 
        return 0;
 
@@ -779,7 +763,7 @@ int efx_mcdi_nvram_info(struct efx_nic *efx, unsigned int type,
        *size_out = MCDI_DWORD(outbuf, NVRAM_INFO_OUT_SIZE);
        *erase_size_out = MCDI_DWORD(outbuf, NVRAM_INFO_OUT_ERASESIZE);
        *protected_out = !!(MCDI_DWORD(outbuf, NVRAM_INFO_OUT_FLAGS) &
-                               (1 << MC_CMD_NVRAM_PROTECTED_LBN));
+                               (1 << MC_CMD_NVRAM_INFO_OUT_PROTECTED_LBN));
        return 0;
 
 fail:
@@ -1060,7 +1044,7 @@ void efx_mcdi_set_id_led(struct efx_nic *efx, enum efx_led_mode mode)
 
 int efx_mcdi_reset_port(struct efx_nic *efx)
 {
-       int rc = efx_mcdi_rpc(efx, MC_CMD_PORT_RESET, NULL, 0, NULL, 0, NULL);
+       int rc = efx_mcdi_rpc(efx, MC_CMD_ENTITY_RESET, NULL, 0, NULL, 0, NULL);
        if (rc)
                netif_err(efx, hw, efx->net_dev, "%s: failed rc=%d\n",
                          __func__, rc);
@@ -1173,6 +1157,37 @@ fail:
        return rc;
 }
 
+int efx_mcdi_flush_rxqs(struct efx_nic *efx)
+{
+       struct efx_channel *channel;
+       struct efx_rx_queue *rx_queue;
+       __le32 *qid;
+       int rc, count;
+
+       qid = kmalloc(EFX_MAX_CHANNELS * sizeof(*qid), GFP_KERNEL);
+       if (qid == NULL)
+               return -ENOMEM;
+
+       count = 0;
+       efx_for_each_channel(channel, efx) {
+               efx_for_each_channel_rx_queue(rx_queue, channel) {
+                       if (rx_queue->flush_pending) {
+                               rx_queue->flush_pending = false;
+                               atomic_dec(&efx->rxq_flush_pending);
+                               qid[count++] = cpu_to_le32(
+                                       efx_rx_queue_index(rx_queue));
+                       }
+               }
+       }
+
+       rc = efx_mcdi_rpc(efx, MC_CMD_FLUSH_RX_QUEUES, (u8 *)qid,
+                         count * sizeof(*qid), NULL, 0, NULL);
+       WARN_ON(rc > 0);
+
+       kfree(qid);
+
+       return rc;
+}
 
 int efx_mcdi_wol_filter_reset(struct efx_nic *efx)
 {
index aced2a7..0bdf3e3 100644 (file)
@@ -56,6 +56,15 @@ struct efx_mcdi_iface {
        size_t resplen;
 };
 
+struct efx_mcdi_mon {
+       struct efx_buffer dma_buf;
+       struct mutex update_lock;
+       unsigned long last_update;
+       struct device *device;
+       struct efx_mcdi_mon_attribute *attrs;
+       unsigned int n_attrs;
+};
+
 extern void efx_mcdi_init(struct efx_nic *efx);
 
 extern int efx_mcdi_rpc(struct efx_nic *efx, unsigned cmd, const u8 *inbuf,
@@ -68,6 +77,7 @@ extern void efx_mcdi_mode_event(struct efx_nic *efx);
 
 extern void efx_mcdi_process_event(struct efx_channel *channel,
                                   efx_qword_t *event);
+extern void efx_mcdi_sensor_event(struct efx_nic *efx, efx_qword_t *ev);
 
 #define MCDI_PTR2(_buf, _ofst)                                         \
        (((u8 *)_buf) + _ofst)
@@ -83,6 +93,10 @@ extern void efx_mcdi_process_event(struct efx_channel *channel,
 
 #define MCDI_PTR(_buf, _ofst)                                          \
        MCDI_PTR2(_buf, MC_CMD_ ## _ofst ## _OFST)
+#define MCDI_ARRAY_PTR(_buf, _field, _type, _index)                    \
+       MCDI_PTR2(_buf,                                                 \
+                 MC_CMD_ ## _field ## _OFST +                          \
+                 (_index) * MC_CMD_ ## _type ## _TYPEDEF_LEN)
 #define MCDI_SET_DWORD(_buf, _ofst, _value)                            \
        MCDI_SET_DWORD2(_buf, MC_CMD_ ## _ofst ## _OFST, _value)
 #define MCDI_DWORD(_buf, _ofst)                                                \
@@ -92,12 +106,18 @@ extern void efx_mcdi_process_event(struct efx_channel *channel,
 
 #define MCDI_EVENT_FIELD(_ev, _field)                  \
        EFX_QWORD_FIELD(_ev, MCDI_EVENT_ ## _field)
+#define MCDI_ARRAY_FIELD(_buf, _field1, _type, _index, _field2)                \
+       EFX_DWORD_FIELD(                                                \
+               *((efx_dword_t *)                                       \
+                 (MCDI_ARRAY_PTR(_buf, _field1, _type, _index) +       \
+                  (MC_CMD_ ## _type ## _TYPEDEF_ ## _field2 ## _OFST & ~3))), \
+               MC_CMD_ ## _type ## _TYPEDEF_ ## _field2)
 
 extern void efx_mcdi_print_fwver(struct efx_nic *efx, char *buf, size_t len);
 extern int efx_mcdi_drv_attach(struct efx_nic *efx, bool driver_operating,
                               bool *was_attached_out);
 extern int efx_mcdi_get_board_cfg(struct efx_nic *efx, u8 *mac_address,
-                                 u16 *fw_subtype_list);
+                                 u16 *fw_subtype_list, u32 *capabilities);
 extern int efx_mcdi_log_ctrl(struct efx_nic *efx, bool evq, bool uart,
                             u32 dest_evq);
 extern int efx_mcdi_nvram_types(struct efx_nic *efx, u32 *nvram_types_out);
@@ -126,5 +146,19 @@ extern int efx_mcdi_wol_filter_set_magic(struct efx_nic *efx,
 extern int efx_mcdi_wol_filter_get_magic(struct efx_nic *efx, int *id_out);
 extern int efx_mcdi_wol_filter_remove(struct efx_nic *efx, int id);
 extern int efx_mcdi_wol_filter_reset(struct efx_nic *efx);
+extern int efx_mcdi_flush_rxqs(struct efx_nic *efx);
+extern int efx_mcdi_set_mac(struct efx_nic *efx);
+extern int efx_mcdi_mac_stats(struct efx_nic *efx, dma_addr_t dma_addr,
+                             u32 dma_len, int enable, int clear);
+extern int efx_mcdi_mac_reconfigure(struct efx_nic *efx);
+extern bool efx_mcdi_mac_check_fault(struct efx_nic *efx);
+
+#ifdef CONFIG_SFC_MCDI_MON
+extern int efx_mcdi_mon_probe(struct efx_nic *efx);
+extern void efx_mcdi_mon_remove(struct efx_nic *efx);
+#else
+static inline int efx_mcdi_mon_probe(struct efx_nic *efx) { return 0; }
+static inline void efx_mcdi_mon_remove(struct efx_nic *efx) {}
+#endif
 
 #endif /* EFX_MCDI_H */
index 50c2077..1003f30 100644 (file)
@@ -9,11 +9,10 @@
 
 #include "net_driver.h"
 #include "efx.h"
-#include "mac.h"
 #include "mcdi.h"
 #include "mcdi_pcol.h"
 
-static int efx_mcdi_set_mac(struct efx_nic *efx)
+int efx_mcdi_set_mac(struct efx_nic *efx)
 {
        u32 reject, fcntl;
        u8 cmdbytes[MC_CMD_SET_MAC_IN_LEN];
@@ -45,6 +44,8 @@ static int efx_mcdi_set_mac(struct efx_nic *efx)
        }
        if (efx->wanted_fc & EFX_FC_AUTO)
                fcntl = MC_CMD_FCNTL_AUTO;
+       if (efx->fc_disable)
+               fcntl = MC_CMD_FCNTL_OFF;
 
        MCDI_SET_DWORD(cmdbytes, SET_MAC_IN_FCNTL, fcntl);
 
@@ -52,7 +53,7 @@ static int efx_mcdi_set_mac(struct efx_nic *efx)
                            NULL, 0, NULL);
 }
 
-static int efx_mcdi_get_mac_faults(struct efx_nic *efx, u32 *faults)
+bool efx_mcdi_mac_check_fault(struct efx_nic *efx)
 {
        u8 outbuf[MC_CMD_GET_LINK_OUT_LEN];
        size_t outlength;
@@ -62,16 +63,13 @@ static int efx_mcdi_get_mac_faults(struct efx_nic *efx, u32 *faults)
 
        rc = efx_mcdi_rpc(efx, MC_CMD_GET_LINK, NULL, 0,
                          outbuf, sizeof(outbuf), &outlength);
-       if (rc)
-               goto fail;
-
-       *faults = MCDI_DWORD(outbuf, GET_LINK_OUT_MAC_FAULT);
-       return 0;
+       if (rc) {
+               netif_err(efx, hw, efx->net_dev, "%s: failed rc=%d\n",
+                         __func__, rc);
+               return true;
+       }
 
-fail:
-       netif_err(efx, hw, efx->net_dev, "%s: failed rc=%d\n",
-                 __func__, rc);
-       return rc;
+       return MCDI_DWORD(outbuf, GET_LINK_OUT_MAC_FAULT) != 0;
 }
 
 int efx_mcdi_mac_stats(struct efx_nic *efx, dma_addr_t dma_addr,
@@ -84,7 +82,7 @@ int efx_mcdi_mac_stats(struct efx_nic *efx, dma_addr_t dma_addr,
        u32 addr_hi;
        u32 addr_lo;
 
-       BUILD_BUG_ON(MC_CMD_MAC_STATS_OUT_LEN != 0);
+       BUILD_BUG_ON(MC_CMD_MAC_STATS_OUT_DMA_LEN != 0);
 
        addr_lo = ((u64)dma_addr) >> 0;
        addr_hi = ((u64)dma_addr) >> 32;
@@ -93,13 +91,13 @@ int efx_mcdi_mac_stats(struct efx_nic *efx, dma_addr_t dma_addr,
        MCDI_SET_DWORD(inbuf, MAC_STATS_IN_DMA_ADDR_HI, addr_hi);
        cmd_ptr = (efx_dword_t *)MCDI_PTR(inbuf, MAC_STATS_IN_CMD);
        EFX_POPULATE_DWORD_7(*cmd_ptr,
-                            MC_CMD_MAC_STATS_CMD_DMA, !!enable,
-                            MC_CMD_MAC_STATS_CMD_CLEAR, clear,
-                            MC_CMD_MAC_STATS_CMD_PERIODIC_CHANGE, 1,
-                            MC_CMD_MAC_STATS_CMD_PERIODIC_ENABLE, !!enable,
-                            MC_CMD_MAC_STATS_CMD_PERIODIC_CLEAR, 0,
-                            MC_CMD_MAC_STATS_CMD_PERIODIC_NOEVENT, 1,
-                            MC_CMD_MAC_STATS_CMD_PERIOD_MS, period);
+                            MC_CMD_MAC_STATS_IN_DMA, !!enable,
+                            MC_CMD_MAC_STATS_IN_CLEAR, clear,
+                            MC_CMD_MAC_STATS_IN_PERIODIC_CHANGE, 1,
+                            MC_CMD_MAC_STATS_IN_PERIODIC_ENABLE, !!enable,
+                            MC_CMD_MAC_STATS_IN_PERIODIC_CLEAR, 0,
+                            MC_CMD_MAC_STATS_IN_PERIODIC_NOEVENT, 1,
+                            MC_CMD_MAC_STATS_IN_PERIOD_MS, period);
        MCDI_SET_DWORD(inbuf, MAC_STATS_IN_DMA_LEN, dma_len);
 
        rc = efx_mcdi_rpc(efx, MC_CMD_MAC_STATS, inbuf, sizeof(inbuf),
@@ -115,31 +113,18 @@ fail:
        return rc;
 }
 
-static int efx_mcdi_mac_reconfigure(struct efx_nic *efx)
+int efx_mcdi_mac_reconfigure(struct efx_nic *efx)
 {
        int rc;
 
+       WARN_ON(!mutex_is_locked(&efx->mac_lock));
+
        rc = efx_mcdi_set_mac(efx);
        if (rc != 0)
                return rc;
 
-       /* Restore the multicast hash registers. */
-       efx->type->push_multicast_hash(efx);
-
-       return 0;
-}
-
-
-static bool efx_mcdi_mac_check_fault(struct efx_nic *efx)
-{
-       u32 faults;
-       int rc = efx_mcdi_get_mac_faults(efx, &faults);
-       return (rc != 0) || (faults != 0);
+       return efx_mcdi_rpc(efx, MC_CMD_SET_MCAST_HASH,
+                           efx->multicast_hash.byte,
+                           sizeof(efx->multicast_hash),
+                           NULL, 0, NULL);
 }
-
-
-const struct efx_mac_operations efx_mcdi_mac_operations = {
-       .reconfigure    = efx_mcdi_mac_reconfigure,
-       .update_stats   = efx_port_dummy_op_void,
-       .check_fault    = efx_mcdi_mac_check_fault,
-};
diff --git a/drivers/net/ethernet/sfc/mcdi_mon.c b/drivers/net/ethernet/sfc/mcdi_mon.c
new file mode 100644 (file)
index 0000000..fb7f65b
--- /dev/null
@@ -0,0 +1,415 @@
+/****************************************************************************
+ * Driver for Solarflare Solarstorm network controllers and boards
+ * Copyright 2011 Solarflare Communications Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 as published
+ * by the Free Software Foundation, incorporated herein by reference.
+ */
+
+#include <linux/bitops.h>
+#include <linux/slab.h>
+#include <linux/hwmon.h>
+#include <linux/stat.h>
+
+#include "net_driver.h"
+#include "mcdi.h"
+#include "mcdi_pcol.h"
+#include "nic.h"
+
+enum efx_hwmon_type {
+       EFX_HWMON_UNKNOWN,
+       EFX_HWMON_TEMP,         /* temperature */
+       EFX_HWMON_COOL,         /* cooling device, probably a heatsink */
+       EFX_HWMON_IN            /* input voltage */
+};
+
+static const struct {
+       const char *label;
+       enum efx_hwmon_type hwmon_type;
+       int port;
+} efx_mcdi_sensor_type[MC_CMD_SENSOR_ENTRY_MAXNUM] = {
+#define SENSOR(name, label, hwmon_type, port)                  \
+       [MC_CMD_SENSOR_##name] = { label, hwmon_type, port }
+       SENSOR(CONTROLLER_TEMP,    "Controller temp.",     EFX_HWMON_TEMP, -1),
+       SENSOR(PHY_COMMON_TEMP,    "PHY temp.",            EFX_HWMON_TEMP, -1),
+       SENSOR(CONTROLLER_COOLING, "Controller cooling",   EFX_HWMON_COOL, -1),
+       SENSOR(PHY0_TEMP,          "PHY temp.",            EFX_HWMON_TEMP, 0),
+       SENSOR(PHY0_COOLING,       "PHY cooling",          EFX_HWMON_COOL, 0),
+       SENSOR(PHY1_TEMP,          "PHY temp.",            EFX_HWMON_TEMP, 1),
+       SENSOR(PHY1_COOLING,       "PHY cooling",          EFX_HWMON_COOL, 1),
+       SENSOR(IN_1V0,             "1.0V supply",          EFX_HWMON_IN,   -1),
+       SENSOR(IN_1V2,             "1.2V supply",          EFX_HWMON_IN,   -1),
+       SENSOR(IN_1V8,             "1.8V supply",          EFX_HWMON_IN,   -1),
+       SENSOR(IN_2V5,             "2.5V supply",          EFX_HWMON_IN,   -1),
+       SENSOR(IN_3V3,             "3.3V supply",          EFX_HWMON_IN,   -1),
+       SENSOR(IN_12V0,            "12.0V supply",         EFX_HWMON_IN,   -1),
+       SENSOR(IN_1V2A,            "1.2V analogue supply", EFX_HWMON_IN,   -1),
+       SENSOR(IN_VREF,            "ref. voltage",         EFX_HWMON_IN,   -1),
+#undef SENSOR
+};
+
+static const char *const sensor_status_names[] = {
+       [MC_CMD_SENSOR_STATE_OK] = "OK",
+       [MC_CMD_SENSOR_STATE_WARNING] = "Warning",
+       [MC_CMD_SENSOR_STATE_FATAL] = "Fatal",
+       [MC_CMD_SENSOR_STATE_BROKEN] = "Device failure",
+};
+
+void efx_mcdi_sensor_event(struct efx_nic *efx, efx_qword_t *ev)
+{
+       unsigned int type, state, value;
+       const char *name = NULL, *state_txt;
+
+       type = EFX_QWORD_FIELD(*ev, MCDI_EVENT_SENSOREVT_MONITOR);
+       state = EFX_QWORD_FIELD(*ev, MCDI_EVENT_SENSOREVT_STATE);
+       value = EFX_QWORD_FIELD(*ev, MCDI_EVENT_SENSOREVT_VALUE);
+
+       /* Deal gracefully with the board having more drivers than we
+        * know about, but do not expect new sensor states. */
+       if (type < ARRAY_SIZE(efx_mcdi_sensor_type))
+               name = efx_mcdi_sensor_type[type].label;
+       if (!name)
+               name = "No sensor name available";
+       EFX_BUG_ON_PARANOID(state >= ARRAY_SIZE(sensor_status_names));
+       state_txt = sensor_status_names[state];
+
+       netif_err(efx, hw, efx->net_dev,
+                 "Sensor %d (%s) reports condition '%s' for raw value %d\n",
+                 type, name, state_txt, value);
+}
+
+#ifdef CONFIG_SFC_MCDI_MON
+
+struct efx_mcdi_mon_attribute {
+       struct device_attribute dev_attr;
+       unsigned int index;
+       unsigned int type;
+       unsigned int limit_value;
+       char name[12];
+};
+
+static int efx_mcdi_mon_update(struct efx_nic *efx)
+{
+       struct efx_mcdi_mon *hwmon = efx_mcdi_mon(efx);
+       u8 inbuf[MC_CMD_READ_SENSORS_IN_LEN];
+       int rc;
+
+       MCDI_SET_DWORD(inbuf, READ_SENSORS_IN_DMA_ADDR_LO,
+                      hwmon->dma_buf.dma_addr & 0xffffffff);
+       MCDI_SET_DWORD(inbuf, READ_SENSORS_IN_DMA_ADDR_HI,
+                      (u64)hwmon->dma_buf.dma_addr >> 32);
+
+       rc = efx_mcdi_rpc(efx, MC_CMD_READ_SENSORS,
+                         inbuf, sizeof(inbuf), NULL, 0, NULL);
+       if (rc == 0)
+               hwmon->last_update = jiffies;
+       return rc;
+}
+
+static ssize_t efx_mcdi_mon_show_name(struct device *dev,
+                                     struct device_attribute *attr,
+                                     char *buf)
+{
+       return sprintf(buf, "%s\n", KBUILD_MODNAME);
+}
+
+static int efx_mcdi_mon_get_entry(struct device *dev, unsigned int index,
+                                 efx_dword_t *entry)
+{
+       struct efx_nic *efx = dev_get_drvdata(dev);
+       struct efx_mcdi_mon *hwmon = efx_mcdi_mon(efx);
+       int rc;
+
+       BUILD_BUG_ON(MC_CMD_READ_SENSORS_OUT_LEN != 0);
+
+       mutex_lock(&hwmon->update_lock);
+
+       /* Use cached value if last update was < 1 s ago */
+       if (time_before(jiffies, hwmon->last_update + HZ))
+               rc = 0;
+       else
+               rc = efx_mcdi_mon_update(efx);
+
+       /* Copy out the requested entry */
+       *entry = ((efx_dword_t *)hwmon->dma_buf.addr)[index];
+
+       mutex_unlock(&hwmon->update_lock);
+
+       return rc;
+}
+
+static ssize_t efx_mcdi_mon_show_value(struct device *dev,
+                                      struct device_attribute *attr,
+                                      char *buf)
+{
+       struct efx_mcdi_mon_attribute *mon_attr =
+               container_of(attr, struct efx_mcdi_mon_attribute, dev_attr);
+       efx_dword_t entry;
+       unsigned int value;
+       int rc;
+
+       rc = efx_mcdi_mon_get_entry(dev, mon_attr->index, &entry);
+       if (rc)
+               return rc;
+
+       value = EFX_DWORD_FIELD(entry, MC_CMD_SENSOR_VALUE_ENTRY_TYPEDEF_VALUE);
+
+       /* Convert temperature from degrees to milli-degrees Celsius */
+       if (efx_mcdi_sensor_type[mon_attr->type].hwmon_type == EFX_HWMON_TEMP)
+               value *= 1000;
+
+       return sprintf(buf, "%u\n", value);
+}
+
+static ssize_t efx_mcdi_mon_show_limit(struct device *dev,
+                                      struct device_attribute *attr,
+                                      char *buf)
+{
+       struct efx_mcdi_mon_attribute *mon_attr =
+               container_of(attr, struct efx_mcdi_mon_attribute, dev_attr);
+       unsigned int value;
+
+       value = mon_attr->limit_value;
+
+       /* Convert temperature from degrees to milli-degrees Celsius */
+       if (efx_mcdi_sensor_type[mon_attr->type].hwmon_type == EFX_HWMON_TEMP)
+               value *= 1000;
+
+       return sprintf(buf, "%u\n", value);
+}
+
+static ssize_t efx_mcdi_mon_show_alarm(struct device *dev,
+                                      struct device_attribute *attr,
+                                      char *buf)
+{
+       struct efx_mcdi_mon_attribute *mon_attr =
+               container_of(attr, struct efx_mcdi_mon_attribute, dev_attr);
+       efx_dword_t entry;
+       int state;
+       int rc;
+
+       rc = efx_mcdi_mon_get_entry(dev, mon_attr->index, &entry);
+       if (rc)
+               return rc;
+
+       state = EFX_DWORD_FIELD(entry, MC_CMD_SENSOR_VALUE_ENTRY_TYPEDEF_STATE);
+       return sprintf(buf, "%d\n", state != MC_CMD_SENSOR_STATE_OK);
+}
+
+static ssize_t efx_mcdi_mon_show_label(struct device *dev,
+                                      struct device_attribute *attr,
+                                      char *buf)
+{
+       struct efx_mcdi_mon_attribute *mon_attr =
+               container_of(attr, struct efx_mcdi_mon_attribute, dev_attr);
+       return sprintf(buf, "%s\n",
+                      efx_mcdi_sensor_type[mon_attr->type].label);
+}
+
+static int
+efx_mcdi_mon_add_attr(struct efx_nic *efx, const char *name,
+                     ssize_t (*reader)(struct device *,
+                                       struct device_attribute *, char *),
+                     unsigned int index, unsigned int type,
+                     unsigned int limit_value)
+{
+       struct efx_mcdi_mon *hwmon = efx_mcdi_mon(efx);
+       struct efx_mcdi_mon_attribute *attr = &hwmon->attrs[hwmon->n_attrs];
+       int rc;
+
+       strlcpy(attr->name, name, sizeof(attr->name));
+       attr->index = index;
+       attr->type = type;
+       attr->limit_value = limit_value;
+       attr->dev_attr.attr.name = attr->name;
+       attr->dev_attr.attr.mode = S_IRUGO;
+       attr->dev_attr.show = reader;
+       rc = device_create_file(&efx->pci_dev->dev, &attr->dev_attr);
+       if (rc == 0)
+               ++hwmon->n_attrs;
+       return rc;
+}
+
+int efx_mcdi_mon_probe(struct efx_nic *efx)
+{
+       struct efx_mcdi_mon *hwmon = efx_mcdi_mon(efx);
+       unsigned int n_attrs, n_temp = 0, n_cool = 0, n_in = 0;
+       u8 outbuf[MC_CMD_SENSOR_INFO_OUT_LENMAX];
+       size_t outlen;
+       char name[12];
+       u32 mask;
+       int rc, i, type;
+
+       BUILD_BUG_ON(MC_CMD_SENSOR_INFO_IN_LEN != 0);
+
+       rc = efx_mcdi_rpc(efx, MC_CMD_SENSOR_INFO, NULL, 0,
+                         outbuf, sizeof(outbuf), &outlen);
+       if (rc)
+               return rc;
+       if (outlen < MC_CMD_SENSOR_INFO_OUT_LENMIN)
+               return -EIO;
+
+       /* Find out which sensors are present.  Don't create a device
+        * if there are none.
+        */
+       mask = MCDI_DWORD(outbuf, SENSOR_INFO_OUT_MASK);
+       if (mask == 0)
+               return 0;
+
+       /* Check again for short response */
+       if (outlen < MC_CMD_SENSOR_INFO_OUT_LEN(hweight32(mask)))
+               return -EIO;
+
+       rc = efx_nic_alloc_buffer(efx, &hwmon->dma_buf,
+                                 4 * MC_CMD_SENSOR_ENTRY_MAXNUM);
+       if (rc)
+               return rc;
+
+       mutex_init(&hwmon->update_lock);
+       efx_mcdi_mon_update(efx);
+
+       /* Allocate space for the maximum possible number of
+        * attributes for this set of sensors: name of the driver plus
+        * value, min, max, crit, alarm and label for each sensor.
+        */
+       n_attrs = 1 + 6 * hweight32(mask);
+       hwmon->attrs = kcalloc(n_attrs, sizeof(*hwmon->attrs), GFP_KERNEL);
+       if (!hwmon->attrs) {
+               rc = -ENOMEM;
+               goto fail;
+       }
+
+       hwmon->device = hwmon_device_register(&efx->pci_dev->dev);
+       if (IS_ERR(hwmon->device)) {
+               rc = PTR_ERR(hwmon->device);
+               goto fail;
+       }
+
+       rc = efx_mcdi_mon_add_attr(efx, "name", efx_mcdi_mon_show_name, 0, 0, 0);
+       if (rc)
+               goto fail;
+
+       for (i = 0, type = -1; ; i++) {
+               const char *hwmon_prefix;
+               unsigned hwmon_index;
+               u16 min1, max1, min2, max2;
+
+               /* Find next sensor type or exit if there is none */
+               type++;
+               while (!(mask & (1 << type))) {
+                       type++;
+                       if (type == 32)
+                               return 0;
+               }
+
+               /* Skip sensors specific to a different port */
+               if (efx_mcdi_sensor_type[type].hwmon_type != EFX_HWMON_UNKNOWN &&
+                   efx_mcdi_sensor_type[type].port >= 0 &&
+                   efx_mcdi_sensor_type[type].port != efx_port_num(efx))
+                       continue;
+
+               switch (efx_mcdi_sensor_type[type].hwmon_type) {
+               case EFX_HWMON_TEMP:
+                       hwmon_prefix = "temp";
+                       hwmon_index = ++n_temp; /* 1-based */
+                       break;
+               case EFX_HWMON_COOL:
+                       /* This is likely to be a heatsink, but there
+                        * is no convention for representing cooling
+                        * devices other than fans.
+                        */
+                       hwmon_prefix = "fan";
+                       hwmon_index = ++n_cool; /* 1-based */
+                       break;
+               default:
+                       hwmon_prefix = "in";
+                       hwmon_index = n_in++; /* 0-based */
+                       break;
+               }
+
+               min1 = MCDI_ARRAY_FIELD(outbuf, SENSOR_ENTRY,
+                                       SENSOR_INFO_ENTRY, i, MIN1);
+               max1 = MCDI_ARRAY_FIELD(outbuf, SENSOR_ENTRY,
+                                       SENSOR_INFO_ENTRY, i, MAX1);
+               min2 = MCDI_ARRAY_FIELD(outbuf, SENSOR_ENTRY,
+                                       SENSOR_INFO_ENTRY, i, MIN2);
+               max2 = MCDI_ARRAY_FIELD(outbuf, SENSOR_ENTRY,
+                                       SENSOR_INFO_ENTRY, i, MAX2);
+
+               if (min1 != max1) {
+                       snprintf(name, sizeof(name), "%s%u_input",
+                                hwmon_prefix, hwmon_index);
+                       rc = efx_mcdi_mon_add_attr(
+                               efx, name, efx_mcdi_mon_show_value, i, type, 0);
+                       if (rc)
+                               goto fail;
+
+                       snprintf(name, sizeof(name), "%s%u_min",
+                                hwmon_prefix, hwmon_index);
+                       rc = efx_mcdi_mon_add_attr(
+                               efx, name, efx_mcdi_mon_show_limit,
+                               i, type, min1);
+                       if (rc)
+                               goto fail;
+
+                       snprintf(name, sizeof(name), "%s%u_max",
+                                hwmon_prefix, hwmon_index);
+                       rc = efx_mcdi_mon_add_attr(
+                               efx, name, efx_mcdi_mon_show_limit,
+                               i, type, max1);
+                       if (rc)
+                               goto fail;
+
+                       if (min2 != max2) {
+                               /* Assume max2 is critical value.
+                                * But we have no good way to expose min2.
+                                */
+                               snprintf(name, sizeof(name), "%s%u_crit",
+                                        hwmon_prefix, hwmon_index);
+                               rc = efx_mcdi_mon_add_attr(
+                                       efx, name, efx_mcdi_mon_show_limit,
+                                       i, type, max2);
+                               if (rc)
+                                       goto fail;
+                       }
+               }
+
+               snprintf(name, sizeof(name), "%s%u_alarm",
+                        hwmon_prefix, hwmon_index);
+               rc = efx_mcdi_mon_add_attr(
+                       efx, name, efx_mcdi_mon_show_alarm, i, type, 0);
+               if (rc)
+                       goto fail;
+
+               if (efx_mcdi_sensor_type[type].label) {
+                       snprintf(name, sizeof(name), "%s%u_label",
+                                hwmon_prefix, hwmon_index);
+                       rc = efx_mcdi_mon_add_attr(
+                               efx, name, efx_mcdi_mon_show_label, i, type, 0);
+                       if (rc)
+                               goto fail;
+               }
+       }
+
+fail:
+       efx_mcdi_mon_remove(efx);
+       return rc;
+}
+
+void efx_mcdi_mon_remove(struct efx_nic *efx)
+{
+       struct siena_nic_data *nic_data = efx->nic_data;
+       struct efx_mcdi_mon *hwmon = &nic_data->hwmon;
+       unsigned int i;
+
+       for (i = 0; i < hwmon->n_attrs; i++)
+               device_remove_file(&efx->pci_dev->dev,
+                                  &hwmon->attrs[i].dev_attr);
+       kfree(hwmon->attrs);
+       if (hwmon->device)
+               hwmon_device_unregister(hwmon->device);
+       efx_nic_free_buffer(efx, &hwmon->dma_buf);
+}
+
+#endif /* CONFIG_SFC_MCDI_MON */
index 41fe06f..0310b9f 100644 (file)
 /* The Scheduler has started. */
 #define MC_FW_STATE_SCHED (8)
 
+/* Siena MC shared memmory offsets */
+/* The 'doorbell' addresses are hard-wired to alert the MC when written */
+#define        MC_SMEM_P0_DOORBELL_OFST        0x000
+#define        MC_SMEM_P1_DOORBELL_OFST        0x004
+/* The rest of these are firmware-defined */
+#define        MC_SMEM_P0_PDU_OFST             0x008
+#define        MC_SMEM_P1_PDU_OFST             0x108
+#define        MC_SMEM_PDU_LEN                 0x100
+#define        MC_SMEM_P0_PTP_TIME_OFST        0x7f0
+#define        MC_SMEM_P0_STATUS_OFST          0x7f8
+#define        MC_SMEM_P1_STATUS_OFST          0x7fc
+
 /* Values to be written to the per-port status dword in shared
  * memory on reboot and assert */
 #define MC_STATUS_DWORD_REBOOT (0xb007b007)
@@ -34,6 +46,8 @@
  */
 #define MCDI_PCOL_VERSION 1
 
+/* Unused commands: 0x23, 0x27, 0x30, 0x31 */
+
 /**
  * MCDI version 1
  *
  */
 #define FSE_AZ_EV_CODE_MCDI_EVRESPONSE 0xc
 
-#define MCDI_EVENT_DATA_LBN 0
-#define MCDI_EVENT_DATA_WIDTH 32
-#define MCDI_EVENT_CONT_LBN 32
-#define MCDI_EVENT_CONT_WIDTH 1
-#define MCDI_EVENT_LEVEL_LBN 33
-#define MCDI_EVENT_LEVEL_WIDTH 3
-#define MCDI_EVENT_LEVEL_INFO (0)
-#define MCDI_EVENT_LEVEL_WARN (1)
-#define MCDI_EVENT_LEVEL_ERR (2)
-#define MCDI_EVENT_LEVEL_FATAL (3)
-#define MCDI_EVENT_SRC_LBN 36
-#define MCDI_EVENT_SRC_WIDTH 8
-#define MCDI_EVENT_CODE_LBN 44
-#define MCDI_EVENT_CODE_WIDTH 8
-#define MCDI_EVENT_CODE_BADSSERT (1)
-#define MCDI_EVENT_CODE_PMNOTICE (2)
-#define MCDI_EVENT_CODE_CMDDONE (3)
-#define  MCDI_EVENT_CMDDONE_SEQ_LBN 0
-#define  MCDI_EVENT_CMDDONE_SEQ_WIDTH 8
-#define  MCDI_EVENT_CMDDONE_DATALEN_LBN 8
-#define  MCDI_EVENT_CMDDONE_DATALEN_WIDTH 8
-#define  MCDI_EVENT_CMDDONE_ERRNO_LBN 16
-#define  MCDI_EVENT_CMDDONE_ERRNO_WIDTH 8
-#define MCDI_EVENT_CODE_LINKCHANGE (4)
-#define  MCDI_EVENT_LINKCHANGE_LP_CAP_LBN 0
-#define  MCDI_EVENT_LINKCHANGE_LP_CAP_WIDTH 16
-#define  MCDI_EVENT_LINKCHANGE_SPEED_LBN 16
-#define  MCDI_EVENT_LINKCHANGE_SPEED_WIDTH 4
-#define  MCDI_EVENT_LINKCHANGE_SPEED_100M 1
-#define  MCDI_EVENT_LINKCHANGE_SPEED_1G 2
-#define  MCDI_EVENT_LINKCHANGE_SPEED_10G 3
-#define  MCDI_EVENT_LINKCHANGE_FCNTL_LBN 20
-#define  MCDI_EVENT_LINKCHANGE_FCNTL_WIDTH 4
-#define  MCDI_EVENT_LINKCHANGE_LINK_FLAGS_LBN 24
-#define  MCDI_EVENT_LINKCHANGE_LINK_FLAGS_WIDTH 8
-#define MCDI_EVENT_CODE_SENSOREVT (5)
-#define  MCDI_EVENT_SENSOREVT_MONITOR_LBN 0
-#define  MCDI_EVENT_SENSOREVT_MONITOR_WIDTH 8
-#define  MCDI_EVENT_SENSOREVT_STATE_LBN 8
-#define  MCDI_EVENT_SENSOREVT_STATE_WIDTH 8
-#define  MCDI_EVENT_SENSOREVT_VALUE_LBN 16
-#define  MCDI_EVENT_SENSOREVT_VALUE_WIDTH 16
-#define MCDI_EVENT_CODE_SCHEDERR (6)
-#define MCDI_EVENT_CODE_REBOOT (7)
-#define MCDI_EVENT_CODE_MAC_STATS_DMA (8)
-#define  MCDI_EVENT_MAC_STATS_DMA_GENERATION_LBN 0
-#define  MCDI_EVENT_MAC_STATS_DMA_GENERATION_WIDTH 32
 
 /* Non-existent command target */
 #define MC_CMD_ERR_ENOENT 2
 
 #define MC_CMD_ERR_CODE_OFST 0
 
+/* We define 8 "escape" commands to allow
+   for command number space extension */
+
+#define MC_CMD_CMD_SPACE_ESCAPE_0            0x78
+#define MC_CMD_CMD_SPACE_ESCAPE_1            0x79
+#define MC_CMD_CMD_SPACE_ESCAPE_2            0x7A
+#define MC_CMD_CMD_SPACE_ESCAPE_3            0x7B
+#define MC_CMD_CMD_SPACE_ESCAPE_4            0x7C
+#define MC_CMD_CMD_SPACE_ESCAPE_5            0x7D
+#define MC_CMD_CMD_SPACE_ESCAPE_6            0x7E
+#define MC_CMD_CMD_SPACE_ESCAPE_7            0x7F
+
+/* Vectors in the boot ROM */
+/* Point to the copycode entry point. */
+#define MC_BOOTROM_COPYCODE_VEC (0x7f4)
+/* Points to the recovery mode entry point. */
+#define MC_BOOTROM_NOFLASH_VEC (0x7f8)
 
-/* MC_CMD_READ32: (debug, variadic out)
- * Read multiple 32byte words from MC memory
- */
-#define MC_CMD_READ32 0x01
-#define MC_CMD_READ32_IN_LEN 8
-#define MC_CMD_READ32_IN_ADDR_OFST 0
-#define MC_CMD_READ32_IN_NUMWORDS_OFST 4
-#define MC_CMD_READ32_OUT_LEN(_numwords) \
-       (4 * (_numwords))
-#define MC_CMD_READ32_OUT_BUFFER_OFST 0
-
-/* MC_CMD_WRITE32: (debug, variadic in)
- * Write multiple 32byte words to MC memory
- */
-#define MC_CMD_WRITE32 0x02
-#define MC_CMD_WRITE32_IN_LEN(_numwords) (((_numwords) * 4) + 4)
-#define MC_CMD_WRITE32_IN_ADDR_OFST 0
-#define MC_CMD_WRITE32_IN_BUFFER_OFST 4
-#define MC_CMD_WRITE32_OUT_LEN 0
-
-/* MC_CMD_COPYCODE: (debug)
- * Copy MC code between two locations and jump
- */
-#define MC_CMD_COPYCODE 0x03
-#define MC_CMD_COPYCODE_IN_LEN 16
-#define MC_CMD_COPYCODE_IN_SRC_ADDR_OFST 0
-#define MC_CMD_COPYCODE_IN_DEST_ADDR_OFST 4
-#define MC_CMD_COPYCODE_IN_NUMWORDS_OFST 8
-#define MC_CMD_COPYCODE_IN_JUMP_OFST 12
-/* Control should return to the caller rather than jumping */
-#define MC_CMD_COPYCODE_JUMP_NONE 1
-#define MC_CMD_COPYCODE_OUT_LEN 0
-
-/* MC_CMD_SET_FUNC: (debug)
- * Select function for function-specific commands.
- */
-#define MC_CMD_SET_FUNC 0x04
-#define MC_CMD_SET_FUNC_IN_LEN 4
-#define MC_CMD_SET_FUNC_IN_FUNC_OFST 0
-#define MC_CMD_SET_FUNC_OUT_LEN 0
-
-/* MC_CMD_GET_BOOT_STATUS:
- * Get the instruction address from which the MC booted.
- */
-#define MC_CMD_GET_BOOT_STATUS 0x05
-#define MC_CMD_GET_BOOT_STATUS_IN_LEN 0
-#define MC_CMD_GET_BOOT_STATUS_OUT_LEN 8
-#define MC_CMD_GET_BOOT_STATUS_OUT_BOOT_OFFSET_OFST 0
-#define MC_CMD_GET_BOOT_STATUS_OUT_FLAGS_OFST 4
-/* Reboot caused by watchdog */
-#define MC_CMD_GET_BOOT_STATUS_FLAGS_WATCHDOG_LBN   (0)
-#define MC_CMD_GET_BOOT_STATUS_FLAGS_WATCHDOG_WIDTH (1)
-/* MC booted from primary flash partition */
-#define MC_CMD_GET_BOOT_STATUS_FLAGS_PRIMARY_LBN    (1)
-#define MC_CMD_GET_BOOT_STATUS_FLAGS_PRIMARY_WIDTH  (1)
-/* MC booted from backup flash partition */
-#define MC_CMD_GET_BOOT_STATUS_FLAGS_BACKUP_LBN     (2)
-#define MC_CMD_GET_BOOT_STATUS_FLAGS_BACKUP_WIDTH   (1)
-
-/* MC_CMD_GET_ASSERTS: (debug, variadic out)
- * Get (and optionally clear) the current assertion status.
- *
- * Only OUT.GLOBAL_FLAGS is guaranteed to exist in the completion
- * payload. The other fields will only be present if
- * OUT.GLOBAL_FLAGS != NO_FAILS
- */
-#define MC_CMD_GET_ASSERTS 0x06
-#define MC_CMD_GET_ASSERTS_IN_LEN 4
-#define MC_CMD_GET_ASSERTS_IN_CLEAR_OFST 0
-#define MC_CMD_GET_ASSERTS_OUT_LEN 140
-/* Assertion status flag */
-#define MC_CMD_GET_ASSERTS_OUT_GLOBAL_FLAGS_OFST 0
-/*! No assertions have failed. */
-#define MC_CMD_GET_ASSERTS_FLAGS_NO_FAILS 1
-/*! A system-level assertion has failed. */
-#define MC_CMD_GET_ASSERTS_FLAGS_SYS_FAIL 2
-/*! A thread-level assertion has failed. */
-#define MC_CMD_GET_ASSERTS_FLAGS_THR_FAIL 3
-/*! The system was reset by the watchdog. */
-#define MC_CMD_GET_ASSERTS_FLAGS_WDOG_FIRED 4
-/* Failing PC value */
-#define MC_CMD_GET_ASSERTS_OUT_SAVED_PC_OFFS_OFST 4
-/* Saved GP regs */
-#define MC_CMD_GET_ASSERTS_OUT_GP_REGS_OFFS_OFST 8
-#define MC_CMD_GET_ASSERTS_OUT_GP_REGS_LEN 124
-/* Failing thread address */
-#define MC_CMD_GET_ASSERTS_OUT_THREAD_OFFS_OFST 132
-
-/* MC_CMD_LOG_CTRL:
- * Determine the output stream for various events and messages
- */
-#define MC_CMD_LOG_CTRL 0x07
-#define MC_CMD_LOG_CTRL_IN_LEN 8
-#define MC_CMD_LOG_CTRL_IN_LOG_DEST_OFST 0
-#define MC_CMD_LOG_CTRL_IN_LOG_DEST_UART (1)
-#define MC_CMD_LOG_CTRL_IN_LOG_DEST_EVQ (2)
-#define MC_CMD_LOG_CTRL_IN_LOG_DEST_EVQ_OFST 4
-#define MC_CMD_LOG_CTRL_OUT_LEN 0
-
-/* MC_CMD_GET_VERSION:
- * Get version information about the MC firmware
- */
-#define MC_CMD_GET_VERSION 0x08
-#define MC_CMD_GET_VERSION_IN_LEN 0
-#define MC_CMD_GET_VERSION_V0_OUT_LEN 4
-#define MC_CMD_GET_VERSION_V1_OUT_LEN 32
-#define MC_CMD_GET_VERSION_OUT_FIRMWARE_OFST 0
-/* Reserved version number to indicate "any" version. */
-#define MC_CMD_GET_VERSION_OUT_FIRMWARE_ANY 0xffffffff
-/* The version response of a boot ROM awaiting rescue */
-#define MC_CMD_GET_VERSION_OUT_FIRMWARE_BOOTROM 0xb0070000
-#define MC_CMD_GET_VERSION_V1_OUT_PCOL_OFST 4
-/* 128bit mask of functions supported by the current firmware */
-#define MC_CMD_GET_VERSION_V1_OUT_SUPPORTED_FUNCS_OFST 8
 /* The command set exported by the boot ROM (MCDI v0) */
 #define MC_CMD_GET_VERSION_V0_SUPPORTED_FUNCS {                \
        (1 << MC_CMD_READ32)    |                       \
        (1 << MC_CMD_COPYCODE)  |                       \
        (1 << MC_CMD_GET_VERSION),                      \
        0, 0, 0 }
-#define MC_CMD_GET_VERSION_OUT_VERSION_OFST 24
 
-/* Vectors in the boot ROM */
-/* Point to the copycode entry point. */
-#define MC_BOOTROM_COPYCODE_VEC (0x7f4)
-/* Points to the recovery mode entry point. */
-#define MC_BOOTROM_NOFLASH_VEC (0x7f8)
+#define MC_CMD_SENSOR_INFO_OUT_OFFSET_OFST(_x)         \
+       (MC_CMD_SENSOR_ENTRY_OFST + (_x))
+
+#define MC_CMD_DBI_WRITE_IN_ADDRESS_OFST(n)            \
+       (MC_CMD_DBI_WRITE_IN_DBIWROP_OFST +             \
+        MC_CMD_DBIWROP_TYPEDEF_ADDRESS_OFST +          \
+        (n) * MC_CMD_DBIWROP_TYPEDEF_LEN)
+
+#define MC_CMD_DBI_WRITE_IN_BYTE_MASK_OFST(n)          \
+       (MC_CMD_DBI_WRITE_IN_DBIWROP_OFST +             \
+        MC_CMD_DBIWROP_TYPEDEF_BYTE_MASK_OFST +        \
+        (n) * MC_CMD_DBIWROP_TYPEDEF_LEN)
+
+#define MC_CMD_DBI_WRITE_IN_VALUE_OFST(n)              \
+       (MC_CMD_DBI_WRITE_IN_DBIWROP_OFST +             \
+        MC_CMD_DBIWROP_TYPEDEF_VALUE_OFST +            \
+        (n) * MC_CMD_DBIWROP_TYPEDEF_LEN)
+
+
+/* MCDI_EVENT structuredef */
+#define    MCDI_EVENT_LEN 8
+#define       MCDI_EVENT_CONT_LBN 32
+#define       MCDI_EVENT_CONT_WIDTH 1
+#define       MCDI_EVENT_LEVEL_LBN 33
+#define       MCDI_EVENT_LEVEL_WIDTH 3
+#define          MCDI_EVENT_LEVEL_INFO  0x0 /* enum */
+#define          MCDI_EVENT_LEVEL_WARN 0x1 /* enum */
+#define          MCDI_EVENT_LEVEL_ERR 0x2 /* enum */
+#define          MCDI_EVENT_LEVEL_FATAL 0x3 /* enum */
+#define       MCDI_EVENT_DATA_OFST 0
+#define        MCDI_EVENT_CMDDONE_SEQ_LBN 0
+#define        MCDI_EVENT_CMDDONE_SEQ_WIDTH 8
+#define        MCDI_EVENT_CMDDONE_DATALEN_LBN 8
+#define        MCDI_EVENT_CMDDONE_DATALEN_WIDTH 8
+#define        MCDI_EVENT_CMDDONE_ERRNO_LBN 16
+#define        MCDI_EVENT_CMDDONE_ERRNO_WIDTH 8
+#define        MCDI_EVENT_LINKCHANGE_LP_CAP_LBN 0
+#define        MCDI_EVENT_LINKCHANGE_LP_CAP_WIDTH 16
+#define        MCDI_EVENT_LINKCHANGE_SPEED_LBN 16
+#define        MCDI_EVENT_LINKCHANGE_SPEED_WIDTH 4
+#define          MCDI_EVENT_LINKCHANGE_SPEED_100M  0x1 /* enum */
+#define          MCDI_EVENT_LINKCHANGE_SPEED_1G  0x2 /* enum */
+#define          MCDI_EVENT_LINKCHANGE_SPEED_10G  0x3 /* enum */
+#define        MCDI_EVENT_LINKCHANGE_FCNTL_LBN 20
+#define        MCDI_EVENT_LINKCHANGE_FCNTL_WIDTH 4
+#define        MCDI_EVENT_LINKCHANGE_LINK_FLAGS_LBN 24
+#define        MCDI_EVENT_LINKCHANGE_LINK_FLAGS_WIDTH 8
+#define        MCDI_EVENT_SENSOREVT_MONITOR_LBN 0
+#define        MCDI_EVENT_SENSOREVT_MONITOR_WIDTH 8
+#define        MCDI_EVENT_SENSOREVT_STATE_LBN 8
+#define        MCDI_EVENT_SENSOREVT_STATE_WIDTH 8
+#define        MCDI_EVENT_SENSOREVT_VALUE_LBN 16
+#define        MCDI_EVENT_SENSOREVT_VALUE_WIDTH 16
+#define        MCDI_EVENT_FWALERT_DATA_LBN 8
+#define        MCDI_EVENT_FWALERT_DATA_WIDTH 24
+#define        MCDI_EVENT_FWALERT_REASON_LBN 0
+#define        MCDI_EVENT_FWALERT_REASON_WIDTH 8
+#define          MCDI_EVENT_FWALERT_REASON_SRAM_ACCESS 0x1 /* enum */
+#define        MCDI_EVENT_FLR_VF_LBN 0
+#define        MCDI_EVENT_FLR_VF_WIDTH 8
+#define        MCDI_EVENT_TX_ERR_TXQ_LBN 0
+#define        MCDI_EVENT_TX_ERR_TXQ_WIDTH 12
+#define        MCDI_EVENT_TX_ERR_TYPE_LBN 12
+#define        MCDI_EVENT_TX_ERR_TYPE_WIDTH 4
+#define          MCDI_EVENT_TX_ERR_DL_FAIL 0x1 /* enum */
+#define          MCDI_EVENT_TX_ERR_NO_EOP 0x2 /* enum */
+#define          MCDI_EVENT_TX_ERR_2BIG 0x3 /* enum */
+#define        MCDI_EVENT_TX_ERR_INFO_LBN 16
+#define        MCDI_EVENT_TX_ERR_INFO_WIDTH 16
+#define        MCDI_EVENT_TX_FLUSH_TXQ_LBN 0
+#define        MCDI_EVENT_TX_FLUSH_TXQ_WIDTH 12
+#define        MCDI_EVENT_PTP_ERR_TYPE_LBN 0
+#define        MCDI_EVENT_PTP_ERR_TYPE_WIDTH 8
+#define          MCDI_EVENT_PTP_ERR_PLL_LOST 0x1 /* enum */
+#define          MCDI_EVENT_PTP_ERR_FILTER 0x2 /* enum */
+#define          MCDI_EVENT_PTP_ERR_FIFO 0x3 /* enum */
+#define          MCDI_EVENT_PTP_ERR_QUEUE 0x4 /* enum */
+#define       MCDI_EVENT_DATA_LBN 0
+#define       MCDI_EVENT_DATA_WIDTH 32
+#define       MCDI_EVENT_SRC_LBN 36
+#define       MCDI_EVENT_SRC_WIDTH 8
+#define       MCDI_EVENT_EV_CODE_LBN 60
+#define       MCDI_EVENT_EV_CODE_WIDTH 4
+#define       MCDI_EVENT_CODE_LBN 44
+#define       MCDI_EVENT_CODE_WIDTH 8
+#define          MCDI_EVENT_CODE_BADSSERT 0x1 /* enum */
+#define          MCDI_EVENT_CODE_PMNOTICE 0x2 /* enum */
+#define          MCDI_EVENT_CODE_CMDDONE 0x3 /* enum */
+#define          MCDI_EVENT_CODE_LINKCHANGE 0x4 /* enum */
+#define          MCDI_EVENT_CODE_SENSOREVT 0x5 /* enum */
+#define          MCDI_EVENT_CODE_SCHEDERR 0x6 /* enum */
+#define          MCDI_EVENT_CODE_REBOOT 0x7 /* enum */
+#define          MCDI_EVENT_CODE_MAC_STATS_DMA 0x8 /* enum */
+#define          MCDI_EVENT_CODE_FWALERT 0x9 /* enum */
+#define          MCDI_EVENT_CODE_FLR 0xa /* enum */
+#define          MCDI_EVENT_CODE_TX_ERR 0xb /* enum */
+#define          MCDI_EVENT_CODE_TX_FLUSH  0xc /* enum */
+#define          MCDI_EVENT_CODE_PTP_RX  0xd /* enum */
+#define          MCDI_EVENT_CODE_PTP_FAULT  0xe /* enum */
+#define       MCDI_EVENT_CMDDONE_DATA_OFST 0
+#define       MCDI_EVENT_CMDDONE_DATA_LBN 0
+#define       MCDI_EVENT_CMDDONE_DATA_WIDTH 32
+#define       MCDI_EVENT_LINKCHANGE_DATA_OFST 0
+#define       MCDI_EVENT_LINKCHANGE_DATA_LBN 0
+#define       MCDI_EVENT_LINKCHANGE_DATA_WIDTH 32
+#define       MCDI_EVENT_SENSOREVT_DATA_OFST 0
+#define       MCDI_EVENT_SENSOREVT_DATA_LBN 0
+#define       MCDI_EVENT_SENSOREVT_DATA_WIDTH 32
+#define       MCDI_EVENT_MAC_STATS_DMA_GENERATION_OFST 0
+#define       MCDI_EVENT_MAC_STATS_DMA_GENERATION_LBN 0
+#define       MCDI_EVENT_MAC_STATS_DMA_GENERATION_WIDTH 32
+#define       MCDI_EVENT_TX_ERR_DATA_OFST 0
+#define       MCDI_EVENT_TX_ERR_DATA_LBN 0
+#define       MCDI_EVENT_TX_ERR_DATA_WIDTH 32
+#define       MCDI_EVENT_PTP_SECONDS_OFST 0
+#define       MCDI_EVENT_PTP_SECONDS_LBN 0
+#define       MCDI_EVENT_PTP_SECONDS_WIDTH 32
+#define       MCDI_EVENT_PTP_NANOSECONDS_OFST 0
+#define       MCDI_EVENT_PTP_NANOSECONDS_LBN 0
+#define       MCDI_EVENT_PTP_NANOSECONDS_WIDTH 32
+#define       MCDI_EVENT_PTP_UUID_OFST 0
+#define       MCDI_EVENT_PTP_UUID_LBN 0
+#define       MCDI_EVENT_PTP_UUID_WIDTH 32
+
+
+/***********************************/
+/* MC_CMD_READ32
+ * Read multiple 32byte words from MC memory.
+ */
+#define MC_CMD_READ32 0x1
+
+/* MC_CMD_READ32_IN msgrequest */
+#define    MC_CMD_READ32_IN_LEN 8
+#define       MC_CMD_READ32_IN_ADDR_OFST 0
+#define       MC_CMD_READ32_IN_NUMWORDS_OFST 4
+
+/* MC_CMD_READ32_OUT msgresponse */
+#define    MC_CMD_READ32_OUT_LENMIN 4
+#define    MC_CMD_READ32_OUT_LENMAX 252
+#define    MC_CMD_READ32_OUT_LEN(num) (0+4*(num))
+#define       MC_CMD_READ32_OUT_BUFFER_OFST 0
+#define       MC_CMD_READ32_OUT_BUFFER_LEN 4
+#define       MC_CMD_READ32_OUT_BUFFER_MINNUM 1
+#define       MC_CMD_READ32_OUT_BUFFER_MAXNUM 63
+
+
+/***********************************/
+/* MC_CMD_WRITE32
+ * Write multiple 32byte words to MC memory.
+ */
+#define MC_CMD_WRITE32 0x2
+
+/* MC_CMD_WRITE32_IN msgrequest */
+#define    MC_CMD_WRITE32_IN_LENMIN 8
+#define    MC_CMD_WRITE32_IN_LENMAX 252
+#define    MC_CMD_WRITE32_IN_LEN(num) (4+4*(num))
+#define       MC_CMD_WRITE32_IN_ADDR_OFST 0
+#define       MC_CMD_WRITE32_IN_BUFFER_OFST 4
+#define       MC_CMD_WRITE32_IN_BUFFER_LEN 4
+#define       MC_CMD_WRITE32_IN_BUFFER_MINNUM 1
+#define       MC_CMD_WRITE32_IN_BUFFER_MAXNUM 62
+
+/* MC_CMD_WRITE32_OUT msgresponse */
+#define    MC_CMD_WRITE32_OUT_LEN 0
+
+
+/***********************************/
+/* MC_CMD_COPYCODE
+ * Copy MC code between two locations and jump.
+ */
+#define MC_CMD_COPYCODE 0x3
+
+/* MC_CMD_COPYCODE_IN msgrequest */
+#define    MC_CMD_COPYCODE_IN_LEN 16
+#define       MC_CMD_COPYCODE_IN_SRC_ADDR_OFST 0
+#define       MC_CMD_COPYCODE_IN_DEST_ADDR_OFST 4
+#define       MC_CMD_COPYCODE_IN_NUMWORDS_OFST 8
+#define       MC_CMD_COPYCODE_IN_JUMP_OFST 12
+#define          MC_CMD_COPYCODE_JUMP_NONE 0x1 /* enum */
+
+/* MC_CMD_COPYCODE_OUT msgresponse */
+#define    MC_CMD_COPYCODE_OUT_LEN 0
+
+
+/***********************************/
+/* MC_CMD_SET_FUNC
+ */
+#define MC_CMD_SET_FUNC 0x4
+
+/* MC_CMD_SET_FUNC_IN msgrequest */
+#define    MC_CMD_SET_FUNC_IN_LEN 4
+#define       MC_CMD_SET_FUNC_IN_FUNC_OFST 0
+
+/* MC_CMD_SET_FUNC_OUT msgresponse */
+#define    MC_CMD_SET_FUNC_OUT_LEN 0
+
+
+/***********************************/
+/* MC_CMD_GET_BOOT_STATUS
+ */
+#define MC_CMD_GET_BOOT_STATUS 0x5
+
+/* MC_CMD_GET_BOOT_STATUS_IN msgrequest */
+#define    MC_CMD_GET_BOOT_STATUS_IN_LEN 0
+
+/* MC_CMD_GET_BOOT_STATUS_OUT msgresponse */
+#define    MC_CMD_GET_BOOT_STATUS_OUT_LEN 8
+#define       MC_CMD_GET_BOOT_STATUS_OUT_BOOT_OFFSET_OFST 0
+#define       MC_CMD_GET_BOOT_STATUS_OUT_FLAGS_OFST 4
+#define        MC_CMD_GET_BOOT_STATUS_OUT_FLAGS_WATCHDOG_LBN 0
+#define        MC_CMD_GET_BOOT_STATUS_OUT_FLAGS_WATCHDOG_WIDTH 1
+#define        MC_CMD_GET_BOOT_STATUS_OUT_FLAGS_PRIMARY_LBN 1
+#define        MC_CMD_GET_BOOT_STATUS_OUT_FLAGS_PRIMARY_WIDTH 1
+#define        MC_CMD_GET_BOOT_STATUS_OUT_FLAGS_BACKUP_LBN 2
+#define        MC_CMD_GET_BOOT_STATUS_OUT_FLAGS_BACKUP_WIDTH 1
 
-/* Test execution limits */
-#define MC_TESTEXEC_VARIANT_COUNT 16
-#define MC_TESTEXEC_RESULT_COUNT 7
 
-/* MC_CMD_SET_TESTVARS: (debug, variadic in)
- * Write variant words for test.
- *
- * The user supplies a bitmap of the variants they wish to set.
- * They must ensure that IN.LEN >= 4 + 4 * ffs(BITMAP)
- */
-#define MC_CMD_SET_TESTVARS 0x09
-#define MC_CMD_SET_TESTVARS_IN_LEN(_numwords)  \
-  (4 + 4*(_numwords))
-#define MC_CMD_SET_TESTVARS_IN_ARGS_BITMAP_OFST 0
-/* Up to MC_TESTEXEC_VARIANT_COUNT of 32byte words start here */
-#define MC_CMD_SET_TESTVARS_IN_ARGS_BUFFER_OFST 4
-#define MC_CMD_SET_TESTVARS_OUT_LEN 0
-
-/* MC_CMD_GET_TESTRCS: (debug, variadic out)
- * Return result words from test.
- */
-#define MC_CMD_GET_TESTRCS 0x0a
-#define MC_CMD_GET_TESTRCS_IN_LEN 4
-#define MC_CMD_GET_TESTRCS_IN_NUMWORDS_OFST 0
-#define MC_CMD_GET_TESTRCS_OUT_LEN(_numwords) \
-       (4 * (_numwords))
-#define MC_CMD_GET_TESTRCS_OUT_BUFFER_OFST 0
-
-/* MC_CMD_RUN_TEST: (debug)
- * Run the test exported by this firmware image
- */
-#define MC_CMD_RUN_TEST 0x0b
-#define MC_CMD_RUN_TEST_IN_LEN 0
-#define MC_CMD_RUN_TEST_OUT_LEN 0
-
-/* MC_CMD_CSR_READ32: (debug, variadic out)
- * Read 32bit words from the indirect memory map
- */
-#define MC_CMD_CSR_READ32 0x0c
-#define MC_CMD_CSR_READ32_IN_LEN 12
-#define MC_CMD_CSR_READ32_IN_ADDR_OFST 0
-#define MC_CMD_CSR_READ32_IN_STEP_OFST 4
-#define MC_CMD_CSR_READ32_IN_NUMWORDS_OFST 8
-#define MC_CMD_CSR_READ32_OUT_LEN(_numwords)   \
-       (((_numwords) * 4) + 4)
-/* IN.NUMWORDS of 32bit words start here */
-#define MC_CMD_CSR_READ32_OUT_BUFFER_OFST 0
-#define MC_CMD_CSR_READ32_OUT_IREG_STATUS_OFST(_numwords)      \
-       ((_numwords) * 4)
-
-/* MC_CMD_CSR_WRITE32: (debug, variadic in)
- * Write 32bit dwords to the indirect memory map
- */
-#define MC_CMD_CSR_WRITE32 0x0d
-#define MC_CMD_CSR_WRITE32_IN_LEN(_numwords)   \
-       (((_numwords) * 4) + 8)
-#define MC_CMD_CSR_WRITE32_IN_ADDR_OFST 0
-#define MC_CMD_CSR_WRITE32_IN_STEP_OFST 4
-/* Multiple 32bit words of data to write start here */
-#define MC_CMD_CSR_WRITE32_IN_BUFFER_OFST 8
-#define MC_CMD_CSR_WRITE32_OUT_LEN 4
-#define MC_CMD_CSR_WRITE32_OUT_STATUS_OFST 0
-
-/* MC_CMD_JTAG_WORK: (debug, fpga only)
- * Process JTAG work buffer for RBF acceleration.
- *
- *  Host: bit count, (up to) 32 words of data to clock out to JTAG
- *   (bits 1,0=TMS,TDO for first bit; bits 3,2=TMS,TDO for second bit, etc.)
- *  MC: bit count, (up to) 32 words of data clocked in from JTAG
- *   (bit 0=TDI for first bit, bit 1=TDI for second bit, etc.; [31:16] unused)
+/***********************************/
+/* MC_CMD_GET_ASSERTS
+ * Get and clear any assertion status.
  */
-#define MC_CMD_JTAG_WORK 0x0e
+#define MC_CMD_GET_ASSERTS 0x6
 
-/* MC_CMD_STACKINFO: (debug, variadic out)
- * Get stack information
- *
- * Host: nothing
- * MC: (thread ptr, stack size, free space) for each thread in system
- */
-#define MC_CMD_STACKINFO 0x0f
+/* MC_CMD_GET_ASSERTS_IN msgrequest */
+#define    MC_CMD_GET_ASSERTS_IN_LEN 4
+#define       MC_CMD_GET_ASSERTS_IN_CLEAR_OFST 0
+
+/* MC_CMD_GET_ASSERTS_OUT msgresponse */
+#define    MC_CMD_GET_ASSERTS_OUT_LEN 140
+#define       MC_CMD_GET_ASSERTS_OUT_GLOBAL_FLAGS_OFST 0
+#define          MC_CMD_GET_ASSERTS_FLAGS_NO_FAILS 0x1 /* enum */
+#define          MC_CMD_GET_ASSERTS_FLAGS_SYS_FAIL 0x2 /* enum */
+#define          MC_CMD_GET_ASSERTS_FLAGS_THR_FAIL 0x3 /* enum */
+#define          MC_CMD_GET_ASSERTS_FLAGS_WDOG_FIRED 0x4 /* enum */
+#define       MC_CMD_GET_ASSERTS_OUT_SAVED_PC_OFFS_OFST 4
+#define       MC_CMD_GET_ASSERTS_OUT_GP_REGS_OFFS_OFST 8
+#define       MC_CMD_GET_ASSERTS_OUT_GP_REGS_OFFS_LEN 4
+#define       MC_CMD_GET_ASSERTS_OUT_GP_REGS_OFFS_NUM 31
+#define       MC_CMD_GET_ASSERTS_OUT_THREAD_OFFS_OFST 132
+#define       MC_CMD_GET_ASSERTS_OUT_RESERVED_OFST 136
 
-/* MC_CMD_MDIO_READ:
- * MDIO register read
+
+/***********************************/
+/* MC_CMD_LOG_CTRL
+ * Configure the output stream for various events and messages.
+ */
+#define MC_CMD_LOG_CTRL 0x7
+
+/* MC_CMD_LOG_CTRL_IN msgrequest */
+#define    MC_CMD_LOG_CTRL_IN_LEN 8
+#define       MC_CMD_LOG_CTRL_IN_LOG_DEST_OFST 0
+#define          MC_CMD_LOG_CTRL_IN_LOG_DEST_UART 0x1 /* enum */
+#define          MC_CMD_LOG_CTRL_IN_LOG_DEST_EVQ 0x2 /* enum */
+#define       MC_CMD_LOG_CTRL_IN_LOG_DEST_EVQ_OFST 4
+
+/* MC_CMD_LOG_CTRL_OUT msgresponse */
+#define    MC_CMD_LOG_CTRL_OUT_LEN 0
+
+
+/***********************************/
+/* MC_CMD_GET_VERSION
+ * Get version information about the MC firmware.
+ */
+#define MC_CMD_GET_VERSION 0x8
+
+/* MC_CMD_GET_VERSION_IN msgrequest */
+#define    MC_CMD_GET_VERSION_IN_LEN 0
+
+/* MC_CMD_GET_VERSION_V0_OUT msgresponse */
+#define    MC_CMD_GET_VERSION_V0_OUT_LEN 4
+#define       MC_CMD_GET_VERSION_OUT_FIRMWARE_OFST 0
+#define          MC_CMD_GET_VERSION_OUT_FIRMWARE_ANY 0xffffffff /* enum */
+#define          MC_CMD_GET_VERSION_OUT_FIRMWARE_BOOTROM 0xb0070000 /* enum */
+
+/* MC_CMD_GET_VERSION_OUT msgresponse */
+#define    MC_CMD_GET_VERSION_OUT_LEN 32
+/*            MC_CMD_GET_VERSION_OUT_FIRMWARE_OFST 0 */
+/*            Enum values, see field(s): */
+/*               MC_CMD_GET_VERSION_V0_OUT/MC_CMD_GET_VERSION_OUT_FIRMWARE */
+#define       MC_CMD_GET_VERSION_OUT_PCOL_OFST 4
+#define       MC_CMD_GET_VERSION_OUT_SUPPORTED_FUNCS_OFST 8
+#define       MC_CMD_GET_VERSION_OUT_SUPPORTED_FUNCS_LEN 16
+#define       MC_CMD_GET_VERSION_OUT_VERSION_OFST 24
+#define       MC_CMD_GET_VERSION_OUT_VERSION_LEN 8
+#define       MC_CMD_GET_VERSION_OUT_VERSION_LO_OFST 24
+#define       MC_CMD_GET_VERSION_OUT_VERSION_HI_OFST 28
+
+
+/***********************************/
+/* MC_CMD_GET_FPGAREG
+ * Read multiple bytes from PTP FPGA.
+ */
+#define MC_CMD_GET_FPGAREG 0x9
+
+/* MC_CMD_GET_FPGAREG_IN msgrequest */
+#define    MC_CMD_GET_FPGAREG_IN_LEN 8
+#define       MC_CMD_GET_FPGAREG_IN_ADDR_OFST 0
+#define       MC_CMD_GET_FPGAREG_IN_NUMBYTES_OFST 4
+
+/* MC_CMD_GET_FPGAREG_OUT msgresponse */
+#define    MC_CMD_GET_FPGAREG_OUT_LENMIN 1
+#define    MC_CMD_GET_FPGAREG_OUT_LENMAX 255
+#define    MC_CMD_GET_FPGAREG_OUT_LEN(num) (0+1*(num))
+#define       MC_CMD_GET_FPGAREG_OUT_BUFFER_OFST 0
+#define       MC_CMD_GET_FPGAREG_OUT_BUFFER_LEN 1
+#define       MC_CMD_GET_FPGAREG_OUT_BUFFER_MINNUM 1
+#define       MC_CMD_GET_FPGAREG_OUT_BUFFER_MAXNUM 255
+
+
+/***********************************/
+/* MC_CMD_PUT_FPGAREG
+ * Write multiple bytes to PTP FPGA.
+ */
+#define MC_CMD_PUT_FPGAREG 0xa
+
+/* MC_CMD_PUT_FPGAREG_IN msgrequest */
+#define    MC_CMD_PUT_FPGAREG_IN_LENMIN 5
+#define    MC_CMD_PUT_FPGAREG_IN_LENMAX 255
+#define    MC_CMD_PUT_FPGAREG_IN_LEN(num) (4+1*(num))
+#define       MC_CMD_PUT_FPGAREG_IN_ADDR_OFST 0
+#define       MC_CMD_PUT_FPGAREG_IN_BUFFER_OFST 4
+#define       MC_CMD_PUT_FPGAREG_IN_BUFFER_LEN 1
+#define       MC_CMD_PUT_FPGAREG_IN_BUFFER_MINNUM 1
+#define       MC_CMD_PUT_FPGAREG_IN_BUFFER_MAXNUM 251
+
+/* MC_CMD_PUT_FPGAREG_OUT msgresponse */
+#define    MC_CMD_PUT_FPGAREG_OUT_LEN 0
+
+
+/***********************************/
+/* MC_CMD_PTP
+ * Perform PTP operation
+ */
+#define MC_CMD_PTP 0xb
+
+/* MC_CMD_PTP_IN msgrequest */
+#define    MC_CMD_PTP_IN_LEN 1
+#define       MC_CMD_PTP_IN_OP_OFST 0
+#define       MC_CMD_PTP_IN_OP_LEN 1
+#define          MC_CMD_PTP_OP_ENABLE 0x1 /* enum */
+#define          MC_CMD_PTP_OP_DISABLE 0x2 /* enum */
+#define          MC_CMD_PTP_OP_TRANSMIT 0x3 /* enum */
+#define          MC_CMD_PTP_OP_READ_NIC_TIME 0x4 /* enum */
+#define          MC_CMD_PTP_OP_STATUS 0x5 /* enum */
+#define          MC_CMD_PTP_OP_ADJUST 0x6 /* enum */
+#define          MC_CMD_PTP_OP_SYNCHRONIZE 0x7 /* enum */
+#define          MC_CMD_PTP_OP_MANFTEST_BASIC 0x8 /* enum */
+#define          MC_CMD_PTP_OP_MANFTEST_PACKET 0x9 /* enum */
+#define          MC_CMD_PTP_OP_RESET_STATS 0xa /* enum */
+#define          MC_CMD_PTP_OP_DEBUG 0xb /* enum */
+#define          MC_CMD_PTP_OP_MAX 0xc /* enum */
+
+/* MC_CMD_PTP_IN_ENABLE msgrequest */
+#define    MC_CMD_PTP_IN_ENABLE_LEN 16
+#define       MC_CMD_PTP_IN_CMD_OFST 0
+#define       MC_CMD_PTP_IN_PERIPH_ID_OFST 4
+#define       MC_CMD_PTP_IN_ENABLE_QUEUE_OFST 8
+#define       MC_CMD_PTP_IN_ENABLE_MODE_OFST 12
+#define          MC_CMD_PTP_MODE_V1 0x0 /* enum */
+#define          MC_CMD_PTP_MODE_V1_VLAN 0x1 /* enum */
+#define          MC_CMD_PTP_MODE_V2 0x2 /* enum */
+#define          MC_CMD_PTP_MODE_V2_VLAN 0x3 /* enum */
+
+/* MC_CMD_PTP_IN_DISABLE msgrequest */
+#define    MC_CMD_PTP_IN_DISABLE_LEN 8
+/*            MC_CMD_PTP_IN_CMD_OFST 0 */
+/*            MC_CMD_PTP_IN_PERIPH_ID_OFST 4 */
+
+/* MC_CMD_PTP_IN_TRANSMIT msgrequest */
+#define    MC_CMD_PTP_IN_TRANSMIT_LENMIN 13
+#define    MC_CMD_PTP_IN_TRANSMIT_LENMAX 255
+#define    MC_CMD_PTP_IN_TRANSMIT_LEN(num) (12+1*(num))
+/*            MC_CMD_PTP_IN_CMD_OFST 0 */
+/*            MC_CMD_PTP_IN_PERIPH_ID_OFST 4 */
+#define       MC_CMD_PTP_IN_TRANSMIT_LENGTH_OFST 8
+#define       MC_CMD_PTP_IN_TRANSMIT_PACKET_OFST 12
+#define       MC_CMD_PTP_IN_TRANSMIT_PACKET_LEN 1
+#define       MC_CMD_PTP_IN_TRANSMIT_PACKET_MINNUM 1
+#define       MC_CMD_PTP_IN_TRANSMIT_PACKET_MAXNUM 243
+
+/* MC_CMD_PTP_IN_READ_NIC_TIME msgrequest */
+#define    MC_CMD_PTP_IN_READ_NIC_TIME_LEN 8
+/*            MC_CMD_PTP_IN_CMD_OFST 0 */
+/*            MC_CMD_PTP_IN_PERIPH_ID_OFST 4 */
+
+/* MC_CMD_PTP_IN_STATUS msgrequest */
+#define    MC_CMD_PTP_IN_STATUS_LEN 8
+/*            MC_CMD_PTP_IN_CMD_OFST 0 */
+/*            MC_CMD_PTP_IN_PERIPH_ID_OFST 4 */
+
+/* MC_CMD_PTP_IN_ADJUST msgrequest */
+#define    MC_CMD_PTP_IN_ADJUST_LEN 24
+/*            MC_CMD_PTP_IN_CMD_OFST 0 */
+/*            MC_CMD_PTP_IN_PERIPH_ID_OFST 4 */
+#define       MC_CMD_PTP_IN_ADJUST_FREQ_OFST 8
+#define       MC_CMD_PTP_IN_ADJUST_FREQ_LEN 8
+#define       MC_CMD_PTP_IN_ADJUST_FREQ_LO_OFST 8
+#define       MC_CMD_PTP_IN_ADJUST_FREQ_HI_OFST 12
+#define          MC_CMD_PTP_IN_ADJUST_BITS 0x28 /* enum */
+#define       MC_CMD_PTP_IN_ADJUST_SECONDS_OFST 16
+#define       MC_CMD_PTP_IN_ADJUST_NANOSECONDS_OFST 20
+
+/* MC_CMD_PTP_IN_SYNCHRONIZE msgrequest */
+#define    MC_CMD_PTP_IN_SYNCHRONIZE_LEN 20
+/*            MC_CMD_PTP_IN_CMD_OFST 0 */
+/*            MC_CMD_PTP_IN_PERIPH_ID_OFST 4 */
+#define       MC_CMD_PTP_IN_SYNCHRONIZE_NUMTIMESETS_OFST 8
+#define       MC_CMD_PTP_IN_SYNCHRONIZE_START_ADDR_OFST 12
+#define       MC_CMD_PTP_IN_SYNCHRONIZE_START_ADDR_LEN 8
+#define       MC_CMD_PTP_IN_SYNCHRONIZE_START_ADDR_LO_OFST 12
+#define       MC_CMD_PTP_IN_SYNCHRONIZE_START_ADDR_HI_OFST 16
+
+/* MC_CMD_PTP_IN_MANFTEST_BASIC msgrequest */
+#define    MC_CMD_PTP_IN_MANFTEST_BASIC_LEN 8
+/*            MC_CMD_PTP_IN_CMD_OFST 0 */
+/*            MC_CMD_PTP_IN_PERIPH_ID_OFST 4 */
+
+/* MC_CMD_PTP_IN_MANFTEST_PACKET msgrequest */
+#define    MC_CMD_PTP_IN_MANFTEST_PACKET_LEN 12
+/*            MC_CMD_PTP_IN_CMD_OFST 0 */
+/*            MC_CMD_PTP_IN_PERIPH_ID_OFST 4 */
+#define       MC_CMD_PTP_IN_MANFTEST_PACKET_TEST_ENABLE_OFST 8
+
+/* MC_CMD_PTP_IN_RESET_STATS msgrequest */
+#define    MC_CMD_PTP_IN_RESET_STATS_LEN 8
+/*            MC_CMD_PTP_IN_CMD_OFST 0 */
+/*            MC_CMD_PTP_IN_PERIPH_ID_OFST 4 */
+
+/* MC_CMD_PTP_IN_DEBUG msgrequest */
+#define    MC_CMD_PTP_IN_DEBUG_LEN 12
+/*            MC_CMD_PTP_IN_CMD_OFST 0 */
+/*            MC_CMD_PTP_IN_PERIPH_ID_OFST 4 */
+#define       MC_CMD_PTP_IN_DEBUG_DEBUG_PARAM_OFST 8
+
+/* MC_CMD_PTP_OUT msgresponse */
+#define    MC_CMD_PTP_OUT_LEN 0
+
+/* MC_CMD_PTP_OUT_TRANSMIT msgresponse */
+#define    MC_CMD_PTP_OUT_TRANSMIT_LEN 8
+#define       MC_CMD_PTP_OUT_TRANSMIT_SECONDS_OFST 0
+#define       MC_CMD_PTP_OUT_TRANSMIT_NANOSECONDS_OFST 4
+
+/* MC_CMD_PTP_OUT_READ_NIC_TIME msgresponse */
+#define    MC_CMD_PTP_OUT_READ_NIC_TIME_LEN 8
+#define       MC_CMD_PTP_OUT_READ_NIC_TIME_SECONDS_OFST 0
+#define       MC_CMD_PTP_OUT_READ_NIC_TIME_NANOSECONDS_OFST 4
+
+/* MC_CMD_PTP_OUT_STATUS msgresponse */
+#define    MC_CMD_PTP_OUT_STATUS_LEN 64
+#define       MC_CMD_PTP_OUT_STATUS_CLOCK_FREQ_OFST 0
+#define       MC_CMD_PTP_OUT_STATUS_STATS_TX_OFST 4
+#define       MC_CMD_PTP_OUT_STATUS_STATS_RX_OFST 8
+#define       MC_CMD_PTP_OUT_STATUS_STATS_TS_OFST 12
+#define       MC_CMD_PTP_OUT_STATUS_STATS_FM_OFST 16
+#define       MC_CMD_PTP_OUT_STATUS_STATS_NFM_OFST 20
+#define       MC_CMD_PTP_OUT_STATUS_STATS_PPS_OFLOW_OFST 24
+#define       MC_CMD_PTP_OUT_STATUS_STATS_PPS_BAD_OFST 28
+#define       MC_CMD_PTP_OUT_STATUS_STATS_PPS_PER_MIN_OFST 32
+#define       MC_CMD_PTP_OUT_STATUS_STATS_PPS_PER_MAX_OFST 36
+#define       MC_CMD_PTP_OUT_STATUS_STATS_PPS_PER_LAST_OFST 40
+#define       MC_CMD_PTP_OUT_STATUS_STATS_PPS_PER_MEAN_OFST 44
+#define       MC_CMD_PTP_OUT_STATUS_STATS_PPS_OFF_MIN_OFST 48
+#define       MC_CMD_PTP_OUT_STATUS_STATS_PPS_OFF_MAX_OFST 52
+#define       MC_CMD_PTP_OUT_STATUS_STATS_PPS_OFF_LAST_OFST 56
+#define       MC_CMD_PTP_OUT_STATUS_STATS_PPS_OFF_MEAN_OFST 60
+
+/* MC_CMD_PTP_OUT_SYNCHRONIZE msgresponse */
+#define    MC_CMD_PTP_OUT_SYNCHRONIZE_LENMIN 20
+#define    MC_CMD_PTP_OUT_SYNCHRONIZE_LENMAX 240
+#define    MC_CMD_PTP_OUT_SYNCHRONIZE_LEN(num) (0+20*(num))
+#define       MC_CMD_PTP_OUT_SYNCHRONIZE_TIMESET_OFST 0
+#define       MC_CMD_PTP_OUT_SYNCHRONIZE_TIMESET_LEN 20
+#define       MC_CMD_PTP_OUT_SYNCHRONIZE_TIMESET_MINNUM 1
+#define       MC_CMD_PTP_OUT_SYNCHRONIZE_TIMESET_MAXNUM 12
+#define       MC_CMD_PTP_OUT_SYNCHRONIZE_HOSTSTART_OFST 0
+#define       MC_CMD_PTP_OUT_SYNCHRONIZE_SECONDS_OFST 4
+#define       MC_CMD_PTP_OUT_SYNCHRONIZE_NANOSECONDS_OFST 8
+#define       MC_CMD_PTP_OUT_SYNCHRONIZE_HOSTEND_OFST 12
+#define       MC_CMD_PTP_OUT_SYNCHRONIZE_WAITNS_OFST 16
+
+/* MC_CMD_PTP_OUT_MANFTEST_BASIC msgresponse */
+#define    MC_CMD_PTP_OUT_MANFTEST_BASIC_LEN 8
+#define       MC_CMD_PTP_OUT_MANFTEST_BASIC_TEST_RESULT_OFST 0
+#define          MC_CMD_PTP_MANF_SUCCESS 0x0 /* enum */
+#define          MC_CMD_PTP_MANF_FPGA_LOAD 0x1 /* enum */
+#define          MC_CMD_PTP_MANF_FPGA_VERSION 0x2 /* enum */
+#define          MC_CMD_PTP_MANF_FPGA_REGISTERS 0x3 /* enum */
+#define          MC_CMD_PTP_MANF_OSCILLATOR 0x4 /* enum */
+#define          MC_CMD_PTP_MANF_TIMESTAMPS 0x5 /* enum */
+#define          MC_CMD_PTP_MANF_PACKET_COUNT 0x6 /* enum */
+#define          MC_CMD_PTP_MANF_FILTER_COUNT 0x7 /* enum */
+#define          MC_CMD_PTP_MANF_PACKET_ENOUGH 0x8 /* enum */
+#define          MC_CMD_PTP_MANF_GPIO_TRIGGER 0x9 /* enum */
+#define       MC_CMD_PTP_OUT_MANFTEST_BASIC_TEST_EXTOSC_OFST 4
+
+/* MC_CMD_PTP_OUT_MANFTEST_PACKET msgresponse */
+#define    MC_CMD_PTP_OUT_MANFTEST_PACKET_LEN 12
+#define       MC_CMD_PTP_OUT_MANFTEST_PACKET_TEST_RESULT_OFST 0
+#define       MC_CMD_PTP_OUT_MANFTEST_PACKET_TEST_FPGACOUNT_OFST 4
+#define       MC_CMD_PTP_OUT_MANFTEST_PACKET_TEST_FILTERCOUNT_OFST 8
+
+
+/***********************************/
+/* MC_CMD_CSR_READ32
+ * Read 32bit words from the indirect memory map.
+ */
+#define MC_CMD_CSR_READ32 0xc
+
+/* MC_CMD_CSR_READ32_IN msgrequest */
+#define    MC_CMD_CSR_READ32_IN_LEN 12
+#define       MC_CMD_CSR_READ32_IN_ADDR_OFST 0
+#define       MC_CMD_CSR_READ32_IN_STEP_OFST 4
+#define       MC_CMD_CSR_READ32_IN_NUMWORDS_OFST 8
+
+/* MC_CMD_CSR_READ32_OUT msgresponse */
+#define    MC_CMD_CSR_READ32_OUT_LENMIN 4
+#define    MC_CMD_CSR_READ32_OUT_LENMAX 252
+#define    MC_CMD_CSR_READ32_OUT_LEN(num) (0+4*(num))
+#define       MC_CMD_CSR_READ32_OUT_BUFFER_OFST 0
+#define       MC_CMD_CSR_READ32_OUT_BUFFER_LEN 4
+#define       MC_CMD_CSR_READ32_OUT_BUFFER_MINNUM 1
+#define       MC_CMD_CSR_READ32_OUT_BUFFER_MAXNUM 63
+
+
+/***********************************/
+/* MC_CMD_CSR_WRITE32
+ * Write 32bit dwords to the indirect memory map.
+ */
+#define MC_CMD_CSR_WRITE32 0xd
+
+/* MC_CMD_CSR_WRITE32_IN msgrequest */
+#define    MC_CMD_CSR_WRITE32_IN_LENMIN 12
+#define    MC_CMD_CSR_WRITE32_IN_LENMAX 252
+#define    MC_CMD_CSR_WRITE32_IN_LEN(num) (8+4*(num))
+#define       MC_CMD_CSR_WRITE32_IN_ADDR_OFST 0
+#define       MC_CMD_CSR_WRITE32_IN_STEP_OFST 4
+#define       MC_CMD_CSR_WRITE32_IN_BUFFER_OFST 8
+#define       MC_CMD_CSR_WRITE32_IN_BUFFER_LEN 4
+#define       MC_CMD_CSR_WRITE32_IN_BUFFER_MINNUM 1
+#define       MC_CMD_CSR_WRITE32_IN_BUFFER_MAXNUM 61
+
+/* MC_CMD_CSR_WRITE32_OUT msgresponse */
+#define    MC_CMD_CSR_WRITE32_OUT_LEN 4
+#define       MC_CMD_CSR_WRITE32_OUT_STATUS_OFST 0
+
+
+/***********************************/
+/* MC_CMD_STACKINFO
+ * Get stack information.
+ */
+#define MC_CMD_STACKINFO 0xf
+
+/* MC_CMD_STACKINFO_IN msgrequest */
+#define    MC_CMD_STACKINFO_IN_LEN 0
+
+/* MC_CMD_STACKINFO_OUT msgresponse */
+#define    MC_CMD_STACKINFO_OUT_LENMIN 12
+#define    MC_CMD_STACKINFO_OUT_LENMAX 252
+#define    MC_CMD_STACKINFO_OUT_LEN(num) (0+12*(num))
+#define       MC_CMD_STACKINFO_OUT_THREAD_INFO_OFST 0
+#define       MC_CMD_STACKINFO_OUT_THREAD_INFO_LEN 12
+#define       MC_CMD_STACKINFO_OUT_THREAD_INFO_MINNUM 1
+#define       MC_CMD_STACKINFO_OUT_THREAD_INFO_MAXNUM 21
+
+
+/***********************************/
+/* MC_CMD_MDIO_READ
+ * MDIO register read.
  */
 #define MC_CMD_MDIO_READ 0x10
-#define MC_CMD_MDIO_READ_IN_LEN 16
-#define MC_CMD_MDIO_READ_IN_BUS_OFST 0
-#define MC_CMD_MDIO_READ_IN_PRTAD_OFST 4
-#define MC_CMD_MDIO_READ_IN_DEVAD_OFST 8
-#define MC_CMD_MDIO_READ_IN_ADDR_OFST 12
-#define MC_CMD_MDIO_READ_OUT_LEN 8
-#define MC_CMD_MDIO_READ_OUT_VALUE_OFST 0
-#define MC_CMD_MDIO_READ_OUT_STATUS_OFST 4
-
-/* MC_CMD_MDIO_WRITE:
- * MDIO register write
- */
-#define MC_CMD_MDIO_WRITE 0x11
-#define MC_CMD_MDIO_WRITE_IN_LEN 20
-#define MC_CMD_MDIO_WRITE_IN_BUS_OFST 0
-#define MC_CMD_MDIO_WRITE_IN_PRTAD_OFST 4
-#define MC_CMD_MDIO_WRITE_IN_DEVAD_OFST 8
-#define MC_CMD_MDIO_WRITE_IN_ADDR_OFST 12
-#define MC_CMD_MDIO_WRITE_IN_VALUE_OFST 16
-#define MC_CMD_MDIO_WRITE_OUT_LEN 4
-#define MC_CMD_MDIO_WRITE_OUT_STATUS_OFST 0
 
-/* By default all the MCDI MDIO operations perform clause45 mode.
- * If you want to use clause22 then set DEVAD = MC_CMD_MDIO_CLAUSE22.
- */
-#define MC_CMD_MDIO_CLAUSE22 32
+/* MC_CMD_MDIO_READ_IN msgrequest */
+#define    MC_CMD_MDIO_READ_IN_LEN 16
+#define       MC_CMD_MDIO_READ_IN_BUS_OFST 0
+#define          MC_CMD_MDIO_BUS_INTERNAL 0x0 /* enum */
+#define          MC_CMD_MDIO_BUS_EXTERNAL 0x1 /* enum */
+#define       MC_CMD_MDIO_READ_IN_PRTAD_OFST 4
+#define       MC_CMD_MDIO_READ_IN_DEVAD_OFST 8
+#define          MC_CMD_MDIO_CLAUSE22 0x20 /* enum */
+#define       MC_CMD_MDIO_READ_IN_ADDR_OFST 12
 
-/* There are two MDIO buses: one for the internal PHY, and one for external
- * devices.
- */
-#define MC_CMD_MDIO_BUS_INTERNAL 0
-#define MC_CMD_MDIO_BUS_EXTERNAL 1
+/* MC_CMD_MDIO_READ_OUT msgresponse */
+#define    MC_CMD_MDIO_READ_OUT_LEN 8
+#define       MC_CMD_MDIO_READ_OUT_VALUE_OFST 0
+#define       MC_CMD_MDIO_READ_OUT_STATUS_OFST 4
+#define          MC_CMD_MDIO_STATUS_GOOD 0x8 /* enum */
 
-/* The MDIO commands return the raw status bits from the MDIO block.  A "good"
- * transaction should have the DONE bit set and all other bits clear.
+
+/***********************************/
+/* MC_CMD_MDIO_WRITE
+ * MDIO register write.
  */
-#define MC_CMD_MDIO_STATUS_GOOD 0x08
+#define MC_CMD_MDIO_WRITE 0x11
 
+/* MC_CMD_MDIO_WRITE_IN msgrequest */
+#define    MC_CMD_MDIO_WRITE_IN_LEN 20
+#define       MC_CMD_MDIO_WRITE_IN_BUS_OFST 0
+/*               MC_CMD_MDIO_BUS_INTERNAL 0x0 */
+/*               MC_CMD_MDIO_BUS_EXTERNAL 0x1 */
+#define       MC_CMD_MDIO_WRITE_IN_PRTAD_OFST 4
+#define       MC_CMD_MDIO_WRITE_IN_DEVAD_OFST 8
+/*               MC_CMD_MDIO_CLAUSE22 0x20 */
+#define       MC_CMD_MDIO_WRITE_IN_ADDR_OFST 12
+#define       MC_CMD_MDIO_WRITE_IN_VALUE_OFST 16
 
-/* MC_CMD_DBI_WRITE: (debug)
- * Write DBI register(s)
- *
- * Host: address, byte-enables (and VF selection, and cs2 flag),
- *       value [,address ...]
- * MC: nothing
+/* MC_CMD_MDIO_WRITE_OUT msgresponse */
+#define    MC_CMD_MDIO_WRITE_OUT_LEN 4
+#define       MC_CMD_MDIO_WRITE_OUT_STATUS_OFST 0
+/*               MC_CMD_MDIO_STATUS_GOOD 0x8 */
+
+
+/***********************************/
+/* MC_CMD_DBI_WRITE
+ * Write DBI register(s).
  */
 #define MC_CMD_DBI_WRITE 0x12
-#define MC_CMD_DBI_WRITE_IN_LEN(_numwords)             \
-       (12 * (_numwords))
-#define MC_CMD_DBI_WRITE_IN_ADDRESS_OFST(_word)                \
-       (((_word) * 12) + 0)
-#define MC_CMD_DBI_WRITE_IN_BYTE_MASK_OFST(_word)      \
-       (((_word) * 12) + 4)
-#define MC_CMD_DBI_WRITE_IN_VALUE_OFST(_word)          \
-       (((_word) * 12) + 8)
-#define MC_CMD_DBI_WRITE_OUT_LEN 0
-
-/* MC_CMD_DBI_READ: (debug)
- * Read DBI register(s)
- *
- * Host: address, [,address ...]
- * MC: value [,value ...]
- * (note: this does not support reading from VFs, but is retained for backwards
- * compatibility; see MC_CMD_DBI_READX below)
- */
-#define MC_CMD_DBI_READ 0x13
-#define MC_CMD_DBI_READ_IN_LEN(_numwords)              \
-       (4 * (_numwords))
-#define MC_CMD_DBI_READ_OUT_LEN(_numwords)             \
-       (4 * (_numwords))
-
-/* MC_CMD_PORT_READ32: (debug)
+
+/* MC_CMD_DBI_WRITE_IN msgrequest */
+#define    MC_CMD_DBI_WRITE_IN_LENMIN 12
+#define    MC_CMD_DBI_WRITE_IN_LENMAX 252
+#define    MC_CMD_DBI_WRITE_IN_LEN(num) (0+12*(num))
+#define       MC_CMD_DBI_WRITE_IN_DBIWROP_OFST 0
+#define       MC_CMD_DBI_WRITE_IN_DBIWROP_LEN 12
+#define       MC_CMD_DBI_WRITE_IN_DBIWROP_MINNUM 1
+#define       MC_CMD_DBI_WRITE_IN_DBIWROP_MAXNUM 21
+
+/* MC_CMD_DBI_WRITE_OUT msgresponse */
+#define    MC_CMD_DBI_WRITE_OUT_LEN 0
+
+/* MC_CMD_DBIWROP_TYPEDEF structuredef */
+#define    MC_CMD_DBIWROP_TYPEDEF_LEN 12
+#define       MC_CMD_DBIWROP_TYPEDEF_ADDRESS_OFST 0
+#define       MC_CMD_DBIWROP_TYPEDEF_ADDRESS_LBN 0
+#define       MC_CMD_DBIWROP_TYPEDEF_ADDRESS_WIDTH 32
+#define       MC_CMD_DBIWROP_TYPEDEF_BYTE_MASK_OFST 4
+#define       MC_CMD_DBIWROP_TYPEDEF_BYTE_MASK_LBN 32
+#define       MC_CMD_DBIWROP_TYPEDEF_BYTE_MASK_WIDTH 32
+#define       MC_CMD_DBIWROP_TYPEDEF_VALUE_OFST 8
+#define       MC_CMD_DBIWROP_TYPEDEF_VALUE_LBN 64
+#define       MC_CMD_DBIWROP_TYPEDEF_VALUE_WIDTH 32
+
+
+/***********************************/
+/* MC_CMD_PORT_READ32
  * Read a 32-bit register from the indirect port register map.
- *
- * The port to access is implied by the Shared memory channel used.
  */
 #define MC_CMD_PORT_READ32 0x14
-#define MC_CMD_PORT_READ32_IN_LEN 4
-#define MC_CMD_PORT_READ32_IN_ADDR_OFST 0
-#define MC_CMD_PORT_READ32_OUT_LEN 8
-#define MC_CMD_PORT_READ32_OUT_VALUE_OFST 0
-#define MC_CMD_PORT_READ32_OUT_STATUS_OFST 4
 
-/* MC_CMD_PORT_WRITE32: (debug)
+/* MC_CMD_PORT_READ32_IN msgrequest */
+#define    MC_CMD_PORT_READ32_IN_LEN 4
+#define       MC_CMD_PORT_READ32_IN_ADDR_OFST 0
+
+/* MC_CMD_PORT_READ32_OUT msgresponse */
+#define    MC_CMD_PORT_READ32_OUT_LEN 8
+#define       MC_CMD_PORT_READ32_OUT_VALUE_OFST 0
+#define       MC_CMD_PORT_READ32_OUT_STATUS_OFST 4
+
+
+/***********************************/
+/* MC_CMD_PORT_WRITE32
  * Write a 32-bit register to the indirect port register map.
- *
- * The port to access is implied by the Shared memory channel used.
  */
 #define MC_CMD_PORT_WRITE32 0x15
-#define MC_CMD_PORT_WRITE32_IN_LEN 8
-#define MC_CMD_PORT_WRITE32_IN_ADDR_OFST 0
-#define MC_CMD_PORT_WRITE32_IN_VALUE_OFST 4
-#define MC_CMD_PORT_WRITE32_OUT_LEN 4
-#define MC_CMD_PORT_WRITE32_OUT_STATUS_OFST 0
-
-/* MC_CMD_PORT_READ128: (debug)
- * Read a 128-bit register from indirect port register map
- *
- * The port to access is implied by the Shared memory channel used.
+
+/* MC_CMD_PORT_WRITE32_IN msgrequest */
+#define    MC_CMD_PORT_WRITE32_IN_LEN 8
+#define       MC_CMD_PORT_WRITE32_IN_ADDR_OFST 0
+#define       MC_CMD_PORT_WRITE32_IN_VALUE_OFST 4
+
+/* MC_CMD_PORT_WRITE32_OUT msgresponse */
+#define    MC_CMD_PORT_WRITE32_OUT_LEN 4
+#define       MC_CMD_PORT_WRITE32_OUT_STATUS_OFST 0
+
+
+/***********************************/
+/* MC_CMD_PORT_READ128
+ * Read a 128-bit register from the indirect port register map.
  */
 #define MC_CMD_PORT_READ128 0x16
-#define MC_CMD_PORT_READ128_IN_LEN 4
-#define MC_CMD_PORT_READ128_IN_ADDR_OFST 0
-#define MC_CMD_PORT_READ128_OUT_LEN 20
-#define MC_CMD_PORT_READ128_OUT_VALUE_OFST 0
-#define MC_CMD_PORT_READ128_OUT_STATUS_OFST 16
-
-/* MC_CMD_PORT_WRITE128: (debug)
- * Write a 128-bit register to indirect port register map.
- *
- * The port to access is implied by the Shared memory channel used.
+
+/* MC_CMD_PORT_READ128_IN msgrequest */
+#define    MC_CMD_PORT_READ128_IN_LEN 4
+#define       MC_CMD_PORT_READ128_IN_ADDR_OFST 0
+
+/* MC_CMD_PORT_READ128_OUT msgresponse */
+#define    MC_CMD_PORT_READ128_OUT_LEN 20
+#define       MC_CMD_PORT_READ128_OUT_VALUE_OFST 0
+#define       MC_CMD_PORT_READ128_OUT_VALUE_LEN 16
+#define       MC_CMD_PORT_READ128_OUT_STATUS_OFST 16
+
+
+/***********************************/
+/* MC_CMD_PORT_WRITE128
+ * Write a 128-bit register to the indirect port register map.
  */
 #define MC_CMD_PORT_WRITE128 0x17
-#define MC_CMD_PORT_WRITE128_IN_LEN 20
-#define MC_CMD_PORT_WRITE128_IN_ADDR_OFST 0
-#define MC_CMD_PORT_WRITE128_IN_VALUE_OFST 4
-#define MC_CMD_PORT_WRITE128_OUT_LEN 4
-#define MC_CMD_PORT_WRITE128_OUT_STATUS_OFST 0
-
-/* MC_CMD_GET_BOARD_CFG:
- * Returns the MC firmware configuration structure
- *
- * The FW_SUBTYPE_LIST contains a 16-bit value for each of the 12 types of
- * NVRAM area.  The values are defined in the firmware/mc/platform/<xxx>.c file
- * for a specific board type, but otherwise have no meaning to the MC; they
- * are used by the driver to manage selection of appropriate firmware updates.
+
+/* MC_CMD_PORT_WRITE128_IN msgrequest */
+#define    MC_CMD_PORT_WRITE128_IN_LEN 20
+#define       MC_CMD_PORT_WRITE128_IN_ADDR_OFST 0
+#define       MC_CMD_PORT_WRITE128_IN_VALUE_OFST 4
+#define       MC_CMD_PORT_WRITE128_IN_VALUE_LEN 16
+
+/* MC_CMD_PORT_WRITE128_OUT msgresponse */
+#define    MC_CMD_PORT_WRITE128_OUT_LEN 4
+#define       MC_CMD_PORT_WRITE128_OUT_STATUS_OFST 0
+
+
+/***********************************/
+/* MC_CMD_GET_BOARD_CFG
+ * Returns the MC firmware configuration structure.
  */
 #define MC_CMD_GET_BOARD_CFG 0x18
-#define MC_CMD_GET_BOARD_CFG_IN_LEN 0
-#define MC_CMD_GET_BOARD_CFG_OUT_LEN 96
-#define MC_CMD_GET_BOARD_CFG_OUT_BOARD_TYPE_OFST 0
-#define MC_CMD_GET_BOARD_CFG_OUT_BOARD_NAME_OFST 4
-#define MC_CMD_GET_BOARD_CFG_OUT_BOARD_NAME_LEN 32
-#define MC_CMD_GET_BOARD_CFG_OUT_CAPABILITIES_PORT0_OFST 36
-#define MC_CMD_GET_BOARD_CFG_OUT_CAPABILITIES_PORT1_OFST 40
-#define MC_CMD_GET_BOARD_CFG_OUT_MAC_ADDR_BASE_PORT0_OFST 44
-#define MC_CMD_GET_BOARD_CFG_OUT_MAC_ADDR_BASE_PORT0_LEN 6
-#define MC_CMD_GET_BOARD_CFG_OUT_MAC_ADDR_BASE_PORT1_OFST 50
-#define MC_CMD_GET_BOARD_CFG_OUT_MAC_ADDR_BASE_PORT1_LEN 6
-#define MC_CMD_GET_BOARD_CFG_OUT_MAC_COUNT_PORT0_OFST 56
-#define MC_CMD_GET_BOARD_CFG_OUT_MAC_COUNT_PORT1_OFST 60
-#define MC_CMD_GET_BOARD_CFG_OUT_MAC_STRIDE_PORT0_OFST 64
-#define MC_CMD_GET_BOARD_CFG_OUT_MAC_STRIDE_PORT1_OFST 68
-#define MC_CMD_GET_BOARD_CFG_OUT_FW_SUBTYPE_LIST_OFST 72
-#define MC_CMD_GET_BOARD_CFG_OUT_FW_SUBTYPE_LIST_LEN 24
-
-/* MC_CMD_DBI_READX: (debug)
- * Read DBI register(s) -- extended functionality
- *
- * Host: vf selection, address, [,vf selection ...]
- * MC: value [,value ...]
+
+/* MC_CMD_GET_BOARD_CFG_IN msgrequest */
+#define    MC_CMD_GET_BOARD_CFG_IN_LEN 0
+
+/* MC_CMD_GET_BOARD_CFG_OUT msgresponse */
+#define    MC_CMD_GET_BOARD_CFG_OUT_LENMIN 96
+#define    MC_CMD_GET_BOARD_CFG_OUT_LENMAX 136
+#define    MC_CMD_GET_BOARD_CFG_OUT_LEN(num) (72+2*(num))
+#define       MC_CMD_GET_BOARD_CFG_OUT_BOARD_TYPE_OFST 0
+#define       MC_CMD_GET_BOARD_CFG_OUT_BOARD_NAME_OFST 4
+#define       MC_CMD_GET_BOARD_CFG_OUT_BOARD_NAME_LEN 32
+#define       MC_CMD_GET_BOARD_CFG_OUT_CAPABILITIES_PORT0_OFST 36
+#define          MC_CMD_CAPABILITIES_SMALL_BUF_TBL_LBN 0x0 /* enum */
+#define          MC_CMD_CAPABILITIES_SMALL_BUF_TBL_WIDTH 0x1 /* enum */
+#define          MC_CMD_CAPABILITIES_TURBO_LBN 0x1 /* enum */
+#define          MC_CMD_CAPABILITIES_TURBO_WIDTH 0x1 /* enum */
+#define          MC_CMD_CAPABILITIES_TURBO_ACTIVE_LBN 0x2 /* enum */
+#define          MC_CMD_CAPABILITIES_TURBO_ACTIVE_WIDTH 0x1 /* enum */
+#define          MC_CMD_CAPABILITIES_PTP_LBN 0x3 /* enum */
+#define          MC_CMD_CAPABILITIES_PTP_WIDTH 0x1 /* enum */
+#define       MC_CMD_GET_BOARD_CFG_OUT_CAPABILITIES_PORT1_OFST 40
+/*            Enum values, see field(s): */
+/*               CAPABILITIES_PORT0 */
+#define       MC_CMD_GET_BOARD_CFG_OUT_MAC_ADDR_BASE_PORT0_OFST 44
+#define       MC_CMD_GET_BOARD_CFG_OUT_MAC_ADDR_BASE_PORT0_LEN 6
+#define       MC_CMD_GET_BOARD_CFG_OUT_MAC_ADDR_BASE_PORT1_OFST 50
+#define       MC_CMD_GET_BOARD_CFG_OUT_MAC_ADDR_BASE_PORT1_LEN 6
+#define       MC_CMD_GET_BOARD_CFG_OUT_MAC_COUNT_PORT0_OFST 56
+#define       MC_CMD_GET_BOARD_CFG_OUT_MAC_COUNT_PORT1_OFST 60
+#define       MC_CMD_GET_BOARD_CFG_OUT_MAC_STRIDE_PORT0_OFST 64
+#define       MC_CMD_GET_BOARD_CFG_OUT_MAC_STRIDE_PORT1_OFST 68
+#define       MC_CMD_GET_BOARD_CFG_OUT_FW_SUBTYPE_LIST_OFST 72
+#define       MC_CMD_GET_BOARD_CFG_OUT_FW_SUBTYPE_LIST_LEN 2
+#define       MC_CMD_GET_BOARD_CFG_OUT_FW_SUBTYPE_LIST_MINNUM 12
+#define       MC_CMD_GET_BOARD_CFG_OUT_FW_SUBTYPE_LIST_MAXNUM 32
+
+
+/***********************************/
+/* MC_CMD_DBI_READX
+ * Read DBI register(s).
  */
 #define MC_CMD_DBI_READX 0x19
-#define MC_CMD_DBI_READX_IN_LEN(_numwords)     \
-  (8*(_numwords))
-#define MC_CMD_DBI_READX_OUT_LEN(_numwords)    \
-  (4*(_numwords))
 
-/* MC_CMD_SET_RAND_SEED:
- * Set the 16byte seed for the MC pseudo-random generator
+/* MC_CMD_DBI_READX_IN msgrequest */
+#define    MC_CMD_DBI_READX_IN_LENMIN 8
+#define    MC_CMD_DBI_READX_IN_LENMAX 248
+#define    MC_CMD_DBI_READX_IN_LEN(num) (0+8*(num))
+#define       MC_CMD_DBI_READX_IN_DBIRDOP_OFST 0
+#define       MC_CMD_DBI_READX_IN_DBIRDOP_LEN 8
+#define       MC_CMD_DBI_READX_IN_DBIRDOP_LO_OFST 0
+#define       MC_CMD_DBI_READX_IN_DBIRDOP_HI_OFST 4
+#define       MC_CMD_DBI_READX_IN_DBIRDOP_MINNUM 1
+#define       MC_CMD_DBI_READX_IN_DBIRDOP_MAXNUM 31
+
+/* MC_CMD_DBI_READX_OUT msgresponse */
+#define    MC_CMD_DBI_READX_OUT_LENMIN 4
+#define    MC_CMD_DBI_READX_OUT_LENMAX 252
+#define    MC_CMD_DBI_READX_OUT_LEN(num) (0+4*(num))
+#define       MC_CMD_DBI_READX_OUT_VALUE_OFST 0
+#define       MC_CMD_DBI_READX_OUT_VALUE_LEN 4
+#define       MC_CMD_DBI_READX_OUT_VALUE_MINNUM 1
+#define       MC_CMD_DBI_READX_OUT_VALUE_MAXNUM 63
+
+
+/***********************************/
+/* MC_CMD_SET_RAND_SEED
+ * Set the 16byte seed for the MC pseudo-random generator.
  */
 #define MC_CMD_SET_RAND_SEED 0x1a
-#define MC_CMD_SET_RAND_SEED_IN_LEN 16
-#define MC_CMD_SET_RAND_SEED_IN_SEED_OFST 0
-#define MC_CMD_SET_RAND_SEED_OUT_LEN 0
 
-/* MC_CMD_LTSSM_HIST: (debug)
- * Retrieve the history of the LTSSM, if the build supports it.
- *
- * Host: nothing
- * MC: variable number of LTSSM values, as bytes
- * The history is read-to-clear.
+/* MC_CMD_SET_RAND_SEED_IN msgrequest */
+#define    MC_CMD_SET_RAND_SEED_IN_LEN 16
+#define       MC_CMD_SET_RAND_SEED_IN_SEED_OFST 0
+#define       MC_CMD_SET_RAND_SEED_IN_SEED_LEN 16
+
+/* MC_CMD_SET_RAND_SEED_OUT msgresponse */
+#define    MC_CMD_SET_RAND_SEED_OUT_LEN 0
+
+
+/***********************************/
+/* MC_CMD_LTSSM_HIST
+ * Retrieve the history of the PCIE LTSSM.
  */
 #define MC_CMD_LTSSM_HIST 0x1b
 
-/* MC_CMD_DRV_ATTACH:
- * Inform MCPU that this port is managed on the host (i.e. driver active)
+/* MC_CMD_LTSSM_HIST_IN msgrequest */
+#define    MC_CMD_LTSSM_HIST_IN_LEN 0
+
+/* MC_CMD_LTSSM_HIST_OUT msgresponse */
+#define    MC_CMD_LTSSM_HIST_OUT_LENMIN 0
+#define    MC_CMD_LTSSM_HIST_OUT_LENMAX 252
+#define    MC_CMD_LTSSM_HIST_OUT_LEN(num) (0+4*(num))
+#define       MC_CMD_LTSSM_HIST_OUT_DATA_OFST 0
+#define       MC_CMD_LTSSM_HIST_OUT_DATA_LEN 4
+#define       MC_CMD_LTSSM_HIST_OUT_DATA_MINNUM 0
+#define       MC_CMD_LTSSM_HIST_OUT_DATA_MAXNUM 63
+
+
+/***********************************/
+/* MC_CMD_DRV_ATTACH
+ * Inform MCPU that this port is managed on the host.
  */
 #define MC_CMD_DRV_ATTACH 0x1c
-#define MC_CMD_DRV_ATTACH_IN_LEN 8
-#define MC_CMD_DRV_ATTACH_IN_NEW_STATE_OFST 0
-#define MC_CMD_DRV_ATTACH_IN_UPDATE_OFST 4
-#define MC_CMD_DRV_ATTACH_OUT_LEN 4
-#define MC_CMD_DRV_ATTACH_OUT_OLD_STATE_OFST 0
 
-/* MC_CMD_NCSI_PROD: (debug)
- * Trigger an NC-SI event (and possibly an AEN in response)
+/* MC_CMD_DRV_ATTACH_IN msgrequest */
+#define    MC_CMD_DRV_ATTACH_IN_LEN 8
+#define       MC_CMD_DRV_ATTACH_IN_NEW_STATE_OFST 0
+#define       MC_CMD_DRV_ATTACH_IN_UPDATE_OFST 4
+
+/* MC_CMD_DRV_ATTACH_OUT msgresponse */
+#define    MC_CMD_DRV_ATTACH_OUT_LEN 4
+#define       MC_CMD_DRV_ATTACH_OUT_OLD_STATE_OFST 0
+
+
+/***********************************/
+/* MC_CMD_NCSI_PROD
+ * Trigger an NC-SI event.
  */
 #define MC_CMD_NCSI_PROD 0x1d
-#define MC_CMD_NCSI_PROD_IN_LEN 4
-#define MC_CMD_NCSI_PROD_IN_EVENTS_OFST 0
-#define MC_CMD_NCSI_PROD_LINKCHANGE_LBN 0
-#define MC_CMD_NCSI_PROD_LINKCHANGE_WIDTH 1
-#define MC_CMD_NCSI_PROD_RESET_LBN 1
-#define MC_CMD_NCSI_PROD_RESET_WIDTH 1
-#define MC_CMD_NCSI_PROD_DRVATTACH_LBN 2
-#define MC_CMD_NCSI_PROD_DRVATTACH_WIDTH 1
-#define MC_CMD_NCSI_PROD_OUT_LEN 0
-
-/* Enumeration */
-#define MC_CMD_NCSI_PROD_LINKCHANGE 0
-#define MC_CMD_NCSI_PROD_RESET 1
-#define MC_CMD_NCSI_PROD_DRVATTACH 2
-
-/* MC_CMD_DEVEL: (debug)
- * Reserved for development
- */
-#define MC_CMD_DEVEL 0x1e
-
-/* MC_CMD_SHMUART: (debug)
+
+/* MC_CMD_NCSI_PROD_IN msgrequest */
+#define    MC_CMD_NCSI_PROD_IN_LEN 4
+#define       MC_CMD_NCSI_PROD_IN_EVENTS_OFST 0
+#define          MC_CMD_NCSI_PROD_LINKCHANGE 0x0 /* enum */
+#define          MC_CMD_NCSI_PROD_RESET 0x1 /* enum */
+#define          MC_CMD_NCSI_PROD_DRVATTACH 0x2 /* enum */
+#define        MC_CMD_NCSI_PROD_IN_LINKCHANGE_LBN 0
+#define        MC_CMD_NCSI_PROD_IN_LINKCHANGE_WIDTH 1
+#define        MC_CMD_NCSI_PROD_IN_RESET_LBN 1
+#define        MC_CMD_NCSI_PROD_IN_RESET_WIDTH 1
+#define        MC_CMD_NCSI_PROD_IN_DRVATTACH_LBN 2
+#define        MC_CMD_NCSI_PROD_IN_DRVATTACH_WIDTH 1
+
+/* MC_CMD_NCSI_PROD_OUT msgresponse */
+#define    MC_CMD_NCSI_PROD_OUT_LEN 0
+
+
+/***********************************/
+/* MC_CMD_SHMUART
  * Route UART output to circular buffer in shared memory instead.
  */
 #define MC_CMD_SHMUART 0x1f
-#define MC_CMD_SHMUART_IN_FLAG_OFST 0
-#define MC_CMD_SHMUART_IN_LEN 4
-#define MC_CMD_SHMUART_OUT_LEN 0
 
-/* MC_CMD_PORT_RESET:
- * Generic per-port reset. There is no equivalent for per-board reset.
- *
- * Locks required: None
- * Return code: 0, ETIME
- */
-#define MC_CMD_PORT_RESET 0x20
-#define MC_CMD_PORT_RESET_IN_LEN 0
-#define MC_CMD_PORT_RESET_OUT_LEN 0
-
-/* MC_CMD_RESOURCE_LOCK:
- * Generic resource lock/unlock interface.
- *
- * Locks required: None
- * Return code: 0,
- *              EBUSY (if trylock is contended by other port),
- *              EDEADLK (if trylock is already acquired by this port)
- *              EINVAL (if unlock doesn't own the lock)
- */
-#define MC_CMD_RESOURCE_LOCK 0x21
-#define MC_CMD_RESOURCE_LOCK_IN_LEN 8
-#define MC_CMD_RESOURCE_LOCK_IN_ACTION_OFST 0
-#define MC_CMD_RESOURCE_LOCK_ACTION_TRYLOCK 1
-#define MC_CMD_RESOURCE_LOCK_ACTION_UNLOCK 0
-#define MC_CMD_RESOURCE_LOCK_IN_RESOURCE_OFST 4
-#define MC_CMD_RESOURCE_LOCK_I2C 2
-#define MC_CMD_RESOURCE_LOCK_PHY 3
-#define MC_CMD_RESOURCE_LOCK_OUT_LEN 0
-
-/* MC_CMD_SPI_COMMAND: (variadic in, variadic out)
- * Read/Write to/from the SPI device.
- *
- * Locks required: SPI_LOCK
- * Return code: 0, ETIME, EINVAL, EACCES (if SPI_LOCK is not held)
- */
-#define MC_CMD_SPI_COMMAND 0x22
-#define MC_CMD_SPI_COMMAND_IN_LEN(_write_bytes)        (12 + (_write_bytes))
-#define MC_CMD_SPI_COMMAND_IN_ARGS_OFST 0
-#define MC_CMD_SPI_COMMAND_IN_ARGS_ADDRESS_OFST 0
-#define MC_CMD_SPI_COMMAND_IN_ARGS_READ_BYTES_OFST 4
-#define MC_CMD_SPI_COMMAND_IN_ARGS_CHIP_SELECT_OFST 8
-/* Data to write here */
-#define MC_CMD_SPI_COMMAND_IN_WRITE_BUFFER_OFST 12
-#define MC_CMD_SPI_COMMAND_OUT_LEN(_read_bytes) (_read_bytes)
-/* Data read here */
-#define MC_CMD_SPI_COMMAND_OUT_READ_BUFFER_OFST 0
-
-/* MC_CMD_I2C_READ_WRITE: (variadic in, variadic out)
- * Read/Write to/from the I2C bus.
- *
- * Locks required: I2C_LOCK
- * Return code: 0, ETIME, EINVAL, EACCES (if I2C_LOCK is not held)
- */
-#define MC_CMD_I2C_RW 0x23
-#define MC_CMD_I2C_RW_IN_LEN(_write_bytes) (8 + (_write_bytes))
-#define MC_CMD_I2C_RW_IN_ARGS_OFST 0
-#define MC_CMD_I2C_RW_IN_ARGS_ADDR_OFST 0
-#define MC_CMD_I2C_RW_IN_ARGS_READ_BYTES_OFST 4
-/* Data to write here */
-#define MC_CMD_I2C_RW_IN_WRITE_BUFFER_OFSET 8
-#define MC_CMD_I2C_RW_OUT_LEN(_read_bytes) (_read_bytes)
-/* Data read here */
-#define MC_CMD_I2C_RW_OUT_READ_BUFFER_OFST 0
-
-/* Generic phy capability bitmask */
-#define MC_CMD_PHY_CAP_10HDX_LBN 1
-#define MC_CMD_PHY_CAP_10HDX_WIDTH 1
-#define MC_CMD_PHY_CAP_10FDX_LBN 2
-#define MC_CMD_PHY_CAP_10FDX_WIDTH 1
-#define MC_CMD_PHY_CAP_100HDX_LBN 3
-#define MC_CMD_PHY_CAP_100HDX_WIDTH 1
-#define MC_CMD_PHY_CAP_100FDX_LBN 4
-#define MC_CMD_PHY_CAP_100FDX_WIDTH 1
-#define MC_CMD_PHY_CAP_1000HDX_LBN 5
-#define MC_CMD_PHY_CAP_1000HDX_WIDTH 1
-#define MC_CMD_PHY_CAP_1000FDX_LBN 6
-#define MC_CMD_PHY_CAP_1000FDX_WIDTH 1
-#define MC_CMD_PHY_CAP_10000FDX_LBN 7
-#define MC_CMD_PHY_CAP_10000FDX_WIDTH 1
-#define MC_CMD_PHY_CAP_PAUSE_LBN 8
-#define MC_CMD_PHY_CAP_PAUSE_WIDTH 1
-#define MC_CMD_PHY_CAP_ASYM_LBN 9
-#define MC_CMD_PHY_CAP_ASYM_WIDTH 1
-#define MC_CMD_PHY_CAP_AN_LBN 10
-#define MC_CMD_PHY_CAP_AN_WIDTH 1
-
-/* Generic loopback enumeration */
-#define MC_CMD_LOOPBACK_NONE 0
-#define MC_CMD_LOOPBACK_DATA 1
-#define MC_CMD_LOOPBACK_GMAC 2
-#define MC_CMD_LOOPBACK_XGMII 3
-#define MC_CMD_LOOPBACK_XGXS 4
-#define MC_CMD_LOOPBACK_XAUI 5
-#define MC_CMD_LOOPBACK_GMII 6
-#define MC_CMD_LOOPBACK_SGMII 7
-#define MC_CMD_LOOPBACK_XGBR 8
-#define MC_CMD_LOOPBACK_XFI 9
-#define MC_CMD_LOOPBACK_XAUI_FAR 10
-#define MC_CMD_LOOPBACK_GMII_FAR 11
-#define MC_CMD_LOOPBACK_SGMII_FAR 12
-#define MC_CMD_LOOPBACK_XFI_FAR 13
-#define MC_CMD_LOOPBACK_GPHY 14
-#define MC_CMD_LOOPBACK_PHYXS 15
-#define MC_CMD_LOOPBACK_PCS 16
-#define MC_CMD_LOOPBACK_PMAPMD 17
-#define MC_CMD_LOOPBACK_XPORT 18
-#define MC_CMD_LOOPBACK_XGMII_WS 19
-#define MC_CMD_LOOPBACK_XAUI_WS 20
-#define MC_CMD_LOOPBACK_XAUI_WS_FAR 21
-#define MC_CMD_LOOPBACK_XAUI_WS_NEAR 22
-#define MC_CMD_LOOPBACK_GMII_WS 23
-#define MC_CMD_LOOPBACK_XFI_WS 24
-#define MC_CMD_LOOPBACK_XFI_WS_FAR 25
-#define MC_CMD_LOOPBACK_PHYXS_WS 26
-
-/* Generic PHY statistics enumeration */
-#define MC_CMD_OUI 0
-#define MC_CMD_PMA_PMD_LINK_UP 1
-#define MC_CMD_PMA_PMD_RX_FAULT 2
-#define MC_CMD_PMA_PMD_TX_FAULT 3
-#define MC_CMD_PMA_PMD_SIGNAL 4
-#define MC_CMD_PMA_PMD_SNR_A 5
-#define MC_CMD_PMA_PMD_SNR_B 6
-#define MC_CMD_PMA_PMD_SNR_C 7
-#define MC_CMD_PMA_PMD_SNR_D 8
-#define MC_CMD_PCS_LINK_UP 9
-#define MC_CMD_PCS_RX_FAULT 10
-#define MC_CMD_PCS_TX_FAULT 11
-#define MC_CMD_PCS_BER 12
-#define MC_CMD_PCS_BLOCK_ERRORS 13
-#define MC_CMD_PHYXS_LINK_UP 14
-#define MC_CMD_PHYXS_RX_FAULT 15
-#define MC_CMD_PHYXS_TX_FAULT 16
-#define MC_CMD_PHYXS_ALIGN 17
-#define MC_CMD_PHYXS_SYNC 18
-#define MC_CMD_AN_LINK_UP 19
-#define MC_CMD_AN_COMPLETE 20
-#define MC_CMD_AN_10GBT_STATUS 21
-#define MC_CMD_CL22_LINK_UP 22
-#define MC_CMD_PHY_NSTATS 23
-
-/* MC_CMD_GET_PHY_CFG:
- * Report PHY configuration.  This guarantees to succeed even if the PHY is in
- * a "zombie" state.
- *
- * Locks required: None
- * Return code: 0
+/* MC_CMD_SHMUART_IN msgrequest */
+#define    MC_CMD_SHMUART_IN_LEN 4
+#define       MC_CMD_SHMUART_IN_FLAG_OFST 0
+
+/* MC_CMD_SHMUART_OUT msgresponse */
+#define    MC_CMD_SHMUART_OUT_LEN 0
+
+
+/***********************************/
+/* MC_CMD_ENTITY_RESET
+ * Generic per-port reset.
+ */
+#define MC_CMD_ENTITY_RESET 0x20
+
+/* MC_CMD_ENTITY_RESET_IN msgrequest */
+#define    MC_CMD_ENTITY_RESET_IN_LEN 4
+#define       MC_CMD_ENTITY_RESET_IN_FLAG_OFST 0
+#define        MC_CMD_ENTITY_RESET_IN_FUNCTION_RESOURCE_RESET_LBN 0
+#define        MC_CMD_ENTITY_RESET_IN_FUNCTION_RESOURCE_RESET_WIDTH 1
+
+/* MC_CMD_ENTITY_RESET_OUT msgresponse */
+#define    MC_CMD_ENTITY_RESET_OUT_LEN 0
+
+
+/***********************************/
+/* MC_CMD_PCIE_CREDITS
+ * Read instantaneous and minimum flow control thresholds.
+ */
+#define MC_CMD_PCIE_CREDITS 0x21
+
+/* MC_CMD_PCIE_CREDITS_IN msgrequest */
+#define    MC_CMD_PCIE_CREDITS_IN_LEN 8
+#define       MC_CMD_PCIE_CREDITS_IN_POLL_PERIOD_OFST 0
+#define       MC_CMD_PCIE_CREDITS_IN_WIPE_OFST 4
+
+/* MC_CMD_PCIE_CREDITS_OUT msgresponse */
+#define    MC_CMD_PCIE_CREDITS_OUT_LEN 16
+#define       MC_CMD_PCIE_CREDITS_OUT_CURRENT_P_HDR_OFST 0
+#define       MC_CMD_PCIE_CREDITS_OUT_CURRENT_P_HDR_LEN 2
+#define       MC_CMD_PCIE_CREDITS_OUT_CURRENT_P_DATA_OFST 2
+#define       MC_CMD_PCIE_CREDITS_OUT_CURRENT_P_DATA_LEN 2
+#define       MC_CMD_PCIE_CREDITS_OUT_CURRENT_NP_HDR_OFST 4
+#define       MC_CMD_PCIE_CREDITS_OUT_CURRENT_NP_HDR_LEN 2
+#define       MC_CMD_PCIE_CREDITS_OUT_CURRENT_NP_DATA_OFST 6
+#define       MC_CMD_PCIE_CREDITS_OUT_CURRENT_NP_DATA_LEN 2
+#define       MC_CMD_PCIE_CREDITS_OUT_MINIMUM_P_HDR_OFST 8
+#define       MC_CMD_PCIE_CREDITS_OUT_MINIMUM_P_HDR_LEN 2
+#define       MC_CMD_PCIE_CREDITS_OUT_MINIMUM_P_DATA_OFST 10
+#define       MC_CMD_PCIE_CREDITS_OUT_MINIMUM_P_DATA_LEN 2
+#define       MC_CMD_PCIE_CREDITS_OUT_MINIMUM_NP_HDR_OFST 12
+#define       MC_CMD_PCIE_CREDITS_OUT_MINIMUM_NP_HDR_LEN 2
+#define       MC_CMD_PCIE_CREDITS_OUT_MINIMUM_NP_DATA_OFST 14
+#define       MC_CMD_PCIE_CREDITS_OUT_MINIMUM_NP_DATA_LEN 2
+
+
+/***********************************/
+/* MC_CMD_RXD_MONITOR
+ * Get histogram of RX queue fill level.
+ */
+#define MC_CMD_RXD_MONITOR 0x22
+
+/* MC_CMD_RXD_MONITOR_IN msgrequest */
+#define    MC_CMD_RXD_MONITOR_IN_LEN 12
+#define       MC_CMD_RXD_MONITOR_IN_QID_OFST 0
+#define       MC_CMD_RXD_MONITOR_IN_POLL_PERIOD_OFST 4
+#define       MC_CMD_RXD_MONITOR_IN_WIPE_OFST 8
+
+/* MC_CMD_RXD_MONITOR_OUT msgresponse */
+#define    MC_CMD_RXD_MONITOR_OUT_LEN 80
+#define       MC_CMD_RXD_MONITOR_OUT_QID_OFST 0
+#define       MC_CMD_RXD_MONITOR_OUT_RING_FILL_OFST 4
+#define       MC_CMD_RXD_MONITOR_OUT_CACHE_FILL_OFST 8
+#define       MC_CMD_RXD_MONITOR_OUT_RING_LT_1_OFST 12
+#define       MC_CMD_RXD_MONITOR_OUT_RING_LT_2_OFST 16
+#define       MC_CMD_RXD_MONITOR_OUT_RING_LT_4_OFST 20
+#define       MC_CMD_RXD_MONITOR_OUT_RING_LT_8_OFST 24
+#define       MC_CMD_RXD_MONITOR_OUT_RING_LT_16_OFST 28
+#define       MC_CMD_RXD_MONITOR_OUT_RING_LT_32_OFST 32
+#define       MC_CMD_RXD_MONITOR_OUT_RING_LT_64_OFST 36
+#define       MC_CMD_RXD_MONITOR_OUT_RING_LT_128_OFST 40
+#define       MC_CMD_RXD_MONITOR_OUT_RING_LT_256_OFST 44
+#define       MC_CMD_RXD_MONITOR_OUT_RING_GE_256_OFST 48
+#define       MC_CMD_RXD_MONITOR_OUT_CACHE_LT_1_OFST 52
+#define       MC_CMD_RXD_MONITOR_OUT_CACHE_LT_2_OFST 56
+#define       MC_CMD_RXD_MONITOR_OUT_CACHE_LT_4_OFST 60
+#define       MC_CMD_RXD_MONITOR_OUT_CACHE_LT_8_OFST 64
+#define       MC_CMD_RXD_MONITOR_OUT_CACHE_LT_16_OFST 68
+#define       MC_CMD_RXD_MONITOR_OUT_CACHE_LT_32_OFST 72
+#define       MC_CMD_RXD_MONITOR_OUT_CACHE_GE_32_OFST 76
+
+
+/***********************************/
+/* MC_CMD_PUTS
+ * puts(3) implementation over MCDI
+ */
+#define MC_CMD_PUTS 0x23
+
+/* MC_CMD_PUTS_IN msgrequest */
+#define    MC_CMD_PUTS_IN_LENMIN 13
+#define    MC_CMD_PUTS_IN_LENMAX 255
+#define    MC_CMD_PUTS_IN_LEN(num) (12+1*(num))
+#define       MC_CMD_PUTS_IN_DEST_OFST 0
+#define        MC_CMD_PUTS_IN_UART_LBN 0
+#define        MC_CMD_PUTS_IN_UART_WIDTH 1
+#define        MC_CMD_PUTS_IN_PORT_LBN 1
+#define        MC_CMD_PUTS_IN_PORT_WIDTH 1
+#define       MC_CMD_PUTS_IN_DHOST_OFST 4
+#define       MC_CMD_PUTS_IN_DHOST_LEN 6
+#define       MC_CMD_PUTS_IN_STRING_OFST 12
+#define       MC_CMD_PUTS_IN_STRING_LEN 1
+#define       MC_CMD_PUTS_IN_STRING_MINNUM 1
+#define       MC_CMD_PUTS_IN_STRING_MAXNUM 243
+
+/* MC_CMD_PUTS_OUT msgresponse */
+#define    MC_CMD_PUTS_OUT_LEN 0
+
+
+/***********************************/
+/* MC_CMD_GET_PHY_CFG
+ * Report PHY configuration.
  */
 #define MC_CMD_GET_PHY_CFG 0x24
 
-#define MC_CMD_GET_PHY_CFG_IN_LEN 0
-#define MC_CMD_GET_PHY_CFG_OUT_LEN 72
-
-#define MC_CMD_GET_PHY_CFG_OUT_FLAGS_OFST 0
-#define MC_CMD_GET_PHY_CFG_PRESENT_LBN 0
-#define MC_CMD_GET_PHY_CFG_PRESENT_WIDTH 1
-#define MC_CMD_GET_PHY_CFG_BIST_CABLE_SHORT_LBN 1
-#define MC_CMD_GET_PHY_CFG_BIST_CABLE_SHORT_WIDTH 1
-#define MC_CMD_GET_PHY_CFG_BIST_CABLE_LONG_LBN 2
-#define MC_CMD_GET_PHY_CFG_BIST_CABLE_LONG_WIDTH 1
-#define MC_CMD_GET_PHY_CFG_LOWPOWER_LBN 3
-#define MC_CMD_GET_PHY_CFG_LOWPOWER_WIDTH 1
-#define MC_CMD_GET_PHY_CFG_POWEROFF_LBN 4
-#define MC_CMD_GET_PHY_CFG_POWEROFF_WIDTH 1
-#define MC_CMD_GET_PHY_CFG_TXDIS_LBN 5
-#define MC_CMD_GET_PHY_CFG_TXDIS_WIDTH 1
-#define MC_CMD_GET_PHY_CFG_BIST_LBN 6
-#define MC_CMD_GET_PHY_CFG_BIST_WIDTH 1
-#define MC_CMD_GET_PHY_CFG_OUT_TYPE_OFST 4
-/* Bitmask of supported capabilities */
-#define MC_CMD_GET_PHY_CFG_OUT_SUPPORTED_CAP_OFST 8
-#define MC_CMD_GET_PHY_CFG_OUT_CHANNEL_OFST 12
-#define MC_CMD_GET_PHY_CFG_OUT_PRT_OFST 16
-/* PHY statistics bitmap */
-#define MC_CMD_GET_PHY_CFG_OUT_STATS_MASK_OFST 20
-/* PHY type/name string */
-#define MC_CMD_GET_PHY_CFG_OUT_NAME_OFST 24
-#define MC_CMD_GET_PHY_CFG_OUT_NAME_LEN 20
-#define MC_CMD_GET_PHY_CFG_OUT_MEDIA_TYPE_OFST 44
-#define MC_CMD_MEDIA_XAUI 1
-#define MC_CMD_MEDIA_CX4 2
-#define MC_CMD_MEDIA_KX4 3
-#define MC_CMD_MEDIA_XFP 4
-#define MC_CMD_MEDIA_SFP_PLUS 5
-#define MC_CMD_MEDIA_BASE_T 6
-/* MDIO "MMDS" supported */
-#define MC_CMD_GET_PHY_CFG_OUT_MMD_MASK_OFST 48
-/* Native clause 22 */
-#define MC_CMD_MMD_CLAUSE22  0
-#define MC_CMD_MMD_CLAUSE45_PMAPMD 1
-#define MC_CMD_MMD_CLAUSE45_WIS 2
-#define MC_CMD_MMD_CLAUSE45_PCS 3
-#define MC_CMD_MMD_CLAUSE45_PHYXS 4
-#define MC_CMD_MMD_CLAUSE45_DTEXS 5
-#define MC_CMD_MMD_CLAUSE45_TC 6
-#define MC_CMD_MMD_CLAUSE45_AN 7
-/* Clause22 proxied over clause45 by PHY */
-#define MC_CMD_MMD_CLAUSE45_C22EXT 29
-#define MC_CMD_MMD_CLAUSE45_VEND1 30
-#define MC_CMD_MMD_CLAUSE45_VEND2 31
-/* PHY stepping version */
-#define MC_CMD_GET_PHY_CFG_OUT_REVISION_OFST 52
-#define MC_CMD_GET_PHY_CFG_OUT_REVISION_LEN 20
-
-/* MC_CMD_START_BIST:
+/* MC_CMD_GET_PHY_CFG_IN msgrequest */
+#define    MC_CMD_GET_PHY_CFG_IN_LEN 0
+
+/* MC_CMD_GET_PHY_CFG_OUT msgresponse */
+#define    MC_CMD_GET_PHY_CFG_OUT_LEN 72
+#define       MC_CMD_GET_PHY_CFG_OUT_FLAGS_OFST 0
+#define        MC_CMD_GET_PHY_CFG_OUT_PRESENT_LBN 0
+#define        MC_CMD_GET_PHY_CFG_OUT_PRESENT_WIDTH 1
+#define        MC_CMD_GET_PHY_CFG_OUT_BIST_CABLE_SHORT_LBN 1
+#define        MC_CMD_GET_PHY_CFG_OUT_BIST_CABLE_SHORT_WIDTH 1
+#define        MC_CMD_GET_PHY_CFG_OUT_BIST_CABLE_LONG_LBN 2
+#define        MC_CMD_GET_PHY_CFG_OUT_BIST_CABLE_LONG_WIDTH 1
+#define        MC_CMD_GET_PHY_CFG_OUT_LOWPOWER_LBN 3
+#define        MC_CMD_GET_PHY_CFG_OUT_LOWPOWER_WIDTH 1
+#define        MC_CMD_GET_PHY_CFG_OUT_POWEROFF_LBN 4
+#define        MC_CMD_GET_PHY_CFG_OUT_POWEROFF_WIDTH 1
+#define        MC_CMD_GET_PHY_CFG_OUT_TXDIS_LBN 5
+#define        MC_CMD_GET_PHY_CFG_OUT_TXDIS_WIDTH 1
+#define        MC_CMD_GET_PHY_CFG_OUT_BIST_LBN 6
+#define        MC_CMD_GET_PHY_CFG_OUT_BIST_WIDTH 1
+#define       MC_CMD_GET_PHY_CFG_OUT_TYPE_OFST 4
+#define       MC_CMD_GET_PHY_CFG_OUT_SUPPORTED_CAP_OFST 8
+#define        MC_CMD_PHY_CAP_10HDX_LBN 1
+#define        MC_CMD_PHY_CAP_10HDX_WIDTH 1
+#define        MC_CMD_PHY_CAP_10FDX_LBN 2
+#define        MC_CMD_PHY_CAP_10FDX_WIDTH 1
+#define        MC_CMD_PHY_CAP_100HDX_LBN 3
+#define        MC_CMD_PHY_CAP_100HDX_WIDTH 1
+#define        MC_CMD_PHY_CAP_100FDX_LBN 4
+#define        MC_CMD_PHY_CAP_100FDX_WIDTH 1
+#define        MC_CMD_PHY_CAP_1000HDX_LBN 5
+#define        MC_CMD_PHY_CAP_1000HDX_WIDTH 1
+#define        MC_CMD_PHY_CAP_1000FDX_LBN 6
+#define        MC_CMD_PHY_CAP_1000FDX_WIDTH 1
+#define        MC_CMD_PHY_CAP_10000FDX_LBN 7
+#define        MC_CMD_PHY_CAP_10000FDX_WIDTH 1
+#define        MC_CMD_PHY_CAP_PAUSE_LBN 8
+#define        MC_CMD_PHY_CAP_PAUSE_WIDTH 1
+#define        MC_CMD_PHY_CAP_ASYM_LBN 9
+#define        MC_CMD_PHY_CAP_ASYM_WIDTH 1
+#define        MC_CMD_PHY_CAP_AN_LBN 10
+#define        MC_CMD_PHY_CAP_AN_WIDTH 1
+#define       MC_CMD_GET_PHY_CFG_OUT_CHANNEL_OFST 12
+#define       MC_CMD_GET_PHY_CFG_OUT_PRT_OFST 16
+#define       MC_CMD_GET_PHY_CFG_OUT_STATS_MASK_OFST 20
+#define       MC_CMD_GET_PHY_CFG_OUT_NAME_OFST 24
+#define       MC_CMD_GET_PHY_CFG_OUT_NAME_LEN 20
+#define       MC_CMD_GET_PHY_CFG_OUT_MEDIA_TYPE_OFST 44
+#define          MC_CMD_MEDIA_XAUI 0x1 /* enum */
+#define          MC_CMD_MEDIA_CX4 0x2 /* enum */
+#define          MC_CMD_MEDIA_KX4 0x3 /* enum */
+#define          MC_CMD_MEDIA_XFP 0x4 /* enum */
+#define          MC_CMD_MEDIA_SFP_PLUS 0x5 /* enum */
+#define          MC_CMD_MEDIA_BASE_T 0x6 /* enum */
+#define       MC_CMD_GET_PHY_CFG_OUT_MMD_MASK_OFST 48
+#define          MC_CMD_MMD_CLAUSE22 0x0 /* enum */
+#define          MC_CMD_MMD_CLAUSE45_PMAPMD 0x1 /* enum */
+#define          MC_CMD_MMD_CLAUSE45_WIS 0x2 /* enum */
+#define          MC_CMD_MMD_CLAUSE45_PCS 0x3 /* enum */
+#define          MC_CMD_MMD_CLAUSE45_PHYXS 0x4 /* enum */
+#define          MC_CMD_MMD_CLAUSE45_DTEXS 0x5 /* enum */
+#define          MC_CMD_MMD_CLAUSE45_TC 0x6 /* enum */
+#define          MC_CMD_MMD_CLAUSE45_AN 0x7 /* enum */
+#define          MC_CMD_MMD_CLAUSE45_C22EXT 0x1d /* enum */
+#define          MC_CMD_MMD_CLAUSE45_VEND1 0x1e /* enum */
+#define          MC_CMD_MMD_CLAUSE45_VEND2 0x1f /* enum */
+#define       MC_CMD_GET_PHY_CFG_OUT_REVISION_OFST 52
+#define       MC_CMD_GET_PHY_CFG_OUT_REVISION_LEN 20
+
+
+/***********************************/
+/* MC_CMD_START_BIST
  * Start a BIST test on the PHY.
- *
- * Locks required: PHY_LOCK if doing a  PHY BIST
- * Return code: 0, EINVAL, EACCES (if PHY_LOCK is not held)
  */
 #define MC_CMD_START_BIST 0x25
-#define MC_CMD_START_BIST_IN_LEN 4
-#define MC_CMD_START_BIST_IN_TYPE_OFST 0
-#define MC_CMD_START_BIST_OUT_LEN 0
-
-/* Run the PHY's short cable BIST */
-#define MC_CMD_PHY_BIST_CABLE_SHORT  1
-/* Run the PHY's long cable BIST */
-#define MC_CMD_PHY_BIST_CABLE_LONG   2
-/* Run BIST on the currently selected BPX Serdes (XAUI or XFI) */
-#define MC_CMD_BPX_SERDES_BIST 3
-/* Run the MC loopback tests */
-#define MC_CMD_MC_LOOPBACK_BIST 4
-/* Run the PHY's standard BIST */
-#define MC_CMD_PHY_BIST 5
-
-/* MC_CMD_POLL_PHY_BIST: (variadic output)
- * Poll for BIST completion
- *
- * Returns a single status code, and optionally some PHY specific
- * bist output. The driver should only consume the BIST output
- * after validating OUTLEN and PHY_CFG.PHY_TYPE.
- *
- * If a driver can't successfully parse the BIST output, it should
- * still respect the pass/Fail in OUT.RESULT
- *
- * Locks required: PHY_LOCK if doing a  PHY BIST
- * Return code: 0, EACCES (if PHY_LOCK is not held)
+
+/* MC_CMD_START_BIST_IN msgrequest */
+#define    MC_CMD_START_BIST_IN_LEN 4
+#define       MC_CMD_START_BIST_IN_TYPE_OFST 0
+#define          MC_CMD_PHY_BIST_CABLE_SHORT 0x1 /* enum */
+#define          MC_CMD_PHY_BIST_CABLE_LONG 0x2 /* enum */
+#define          MC_CMD_BPX_SERDES_BIST 0x3 /* enum */
+#define          MC_CMD_MC_LOOPBACK_BIST 0x4 /* enum */
+#define          MC_CMD_PHY_BIST 0x5 /* enum */
+
+/* MC_CMD_START_BIST_OUT msgresponse */
+#define    MC_CMD_START_BIST_OUT_LEN 0
+
+
+/***********************************/
+/* MC_CMD_POLL_BIST
+ * Poll for BIST completion.
  */
 #define MC_CMD_POLL_BIST 0x26
-#define MC_CMD_POLL_BIST_IN_LEN 0
-#define MC_CMD_POLL_BIST_OUT_LEN UNKNOWN
-#define MC_CMD_POLL_BIST_OUT_SFT9001_LEN 36
-#define MC_CMD_POLL_BIST_OUT_MRSFP_LEN 8
-#define MC_CMD_POLL_BIST_OUT_RESULT_OFST 0
-#define MC_CMD_POLL_BIST_RUNNING 1
-#define MC_CMD_POLL_BIST_PASSED 2
-#define MC_CMD_POLL_BIST_FAILED 3
-#define MC_CMD_POLL_BIST_TIMEOUT 4
-/* Generic: */
-#define MC_CMD_POLL_BIST_OUT_PRIVATE_OFST 4
-/* SFT9001-specific: */
-#define MC_CMD_POLL_BIST_OUT_SFT9001_CABLE_LENGTH_A_OFST 4
-#define MC_CMD_POLL_BIST_OUT_SFT9001_CABLE_LENGTH_B_OFST 8
-#define MC_CMD_POLL_BIST_OUT_SFT9001_CABLE_LENGTH_C_OFST 12
-#define MC_CMD_POLL_BIST_OUT_SFT9001_CABLE_LENGTH_D_OFST 16
-#define MC_CMD_POLL_BIST_OUT_SFT9001_CABLE_STATUS_A_OFST 20
-#define MC_CMD_POLL_BIST_OUT_SFT9001_CABLE_STATUS_B_OFST 24
-#define MC_CMD_POLL_BIST_OUT_SFT9001_CABLE_STATUS_C_OFST 28
-#define MC_CMD_POLL_BIST_OUT_SFT9001_CABLE_STATUS_D_OFST 32
-#define MC_CMD_POLL_BIST_SFT9001_PAIR_OK 1
-#define MC_CMD_POLL_BIST_SFT9001_PAIR_OPEN 2
-#define MC_CMD_POLL_BIST_SFT9001_INTRA_PAIR_SHORT 3
-#define MC_CMD_POLL_BIST_SFT9001_INTER_PAIR_SHORT 4
-#define MC_CMD_POLL_BIST_SFT9001_PAIR_BUSY 9
-/* mrsfp "PHY" driver: */
-#define MC_CMD_POLL_BIST_OUT_MRSFP_TEST_OFST 4
-#define MC_CMD_POLL_BIST_MRSFP_TEST_COMPLETE 0
-#define MC_CMD_POLL_BIST_MRSFP_TEST_BUS_SWITCH_OFF_I2C_WRITE 1
-#define MC_CMD_POLL_BIST_MRSFP_TEST_BUS_SWITCH_OFF_I2C_NO_ACCESS_IO_EXP 2
-#define MC_CMD_POLL_BIST_MRSFP_TEST_BUS_SWITCH_OFF_I2C_NO_ACCESS_MODULE 3
-#define MC_CMD_POLL_BIST_MRSFP_TEST_IO_EXP_I2C_CONFIGURE 4
-#define MC_CMD_POLL_BIST_MRSFP_TEST_BUS_SWITCH_I2C_NO_CROSSTALK 5
-#define MC_CMD_POLL_BIST_MRSFP_TEST_MODULE_PRESENCE 6
-#define MC_CMD_POLL_BIST_MRSFP_TEST_MODULE_ID_I2C_ACCESS 7
-#define MC_CMD_POLL_BIST_MRSFP_TEST_MODULE_ID_SANE_VALUE 8
-
-/* MC_CMD_PHY_SPI: (variadic in, variadic out)
- * Read/Write/Erase the PHY SPI device
- *
- * Locks required: PHY_LOCK
- * Return code: 0, ETIME, EINVAL, EACCES (if PHY_LOCK is not held)
- */
-#define MC_CMD_PHY_SPI 0x27
-#define MC_CMD_PHY_SPI_IN_LEN(_write_bytes) (12 + (_write_bytes))
-#define MC_CMD_PHY_SPI_IN_ARGS_OFST 0
-#define MC_CMD_PHY_SPI_IN_ARGS_ADDR_OFST 0
-#define MC_CMD_PHY_SPI_IN_ARGS_READ_BYTES_OFST 4
-#define MC_CMD_PHY_SPI_IN_ARGS_ERASE_ALL_OFST 8
-/* Data to write here */
-#define MC_CMD_PHY_SPI_IN_WRITE_BUFFER_OFSET 12
-#define MC_CMD_PHY_SPI_OUT_LEN(_read_bytes) (_read_bytes)
-/* Data read here */
-#define MC_CMD_PHY_SPI_OUT_READ_BUFFER_OFST 0
-
-
-/* MC_CMD_GET_LOOPBACK_MODES:
- * Returns a bitmask of loopback modes evailable at each speed.
- *
- * Locks required: None
- * Return code: 0
+
+/* MC_CMD_POLL_BIST_IN msgrequest */
+#define    MC_CMD_POLL_BIST_IN_LEN 0
+
+/* MC_CMD_POLL_BIST_OUT msgresponse */
+#define    MC_CMD_POLL_BIST_OUT_LEN 8
+#define       MC_CMD_POLL_BIST_OUT_RESULT_OFST 0
+#define          MC_CMD_POLL_BIST_RUNNING 0x1 /* enum */
+#define          MC_CMD_POLL_BIST_PASSED 0x2 /* enum */
+#define          MC_CMD_POLL_BIST_FAILED 0x3 /* enum */
+#define          MC_CMD_POLL_BIST_TIMEOUT 0x4 /* enum */
+#define       MC_CMD_POLL_BIST_OUT_PRIVATE_OFST 4
+
+/* MC_CMD_POLL_BIST_OUT_SFT9001 msgresponse */
+#define    MC_CMD_POLL_BIST_OUT_SFT9001_LEN 36
+/*            MC_CMD_POLL_BIST_OUT_RESULT_OFST 0 */
+/*            Enum values, see field(s): */
+/*               MC_CMD_POLL_BIST_OUT/MC_CMD_POLL_BIST_OUT_RESULT */
+#define       MC_CMD_POLL_BIST_OUT_SFT9001_CABLE_LENGTH_A_OFST 4
+#define       MC_CMD_POLL_BIST_OUT_SFT9001_CABLE_LENGTH_B_OFST 8
+#define       MC_CMD_POLL_BIST_OUT_SFT9001_CABLE_LENGTH_C_OFST 12
+#define       MC_CMD_POLL_BIST_OUT_SFT9001_CABLE_LENGTH_D_OFST 16
+#define       MC_CMD_POLL_BIST_OUT_SFT9001_CABLE_STATUS_A_OFST 20
+#define          MC_CMD_POLL_BIST_SFT9001_PAIR_OK 0x1 /* enum */
+#define          MC_CMD_POLL_BIST_SFT9001_PAIR_OPEN 0x2 /* enum */
+#define          MC_CMD_POLL_BIST_SFT9001_INTRA_PAIR_SHORT 0x3 /* enum */
+#define          MC_CMD_POLL_BIST_SFT9001_INTER_PAIR_SHORT 0x4 /* enum */
+#define          MC_CMD_POLL_BIST_SFT9001_PAIR_BUSY 0x9 /* enum */
+#define       MC_CMD_POLL_BIST_OUT_SFT9001_CABLE_STATUS_B_OFST 24
+/*            Enum values, see field(s): */
+/*               CABLE_STATUS_A */
+#define       MC_CMD_POLL_BIST_OUT_SFT9001_CABLE_STATUS_C_OFST 28
+/*            Enum values, see field(s): */
+/*               CABLE_STATUS_A */
+#define       MC_CMD_POLL_BIST_OUT_SFT9001_CABLE_STATUS_D_OFST 32
+/*            Enum values, see field(s): */
+/*               CABLE_STATUS_A */
+
+/* MC_CMD_POLL_BIST_OUT_MRSFP msgresponse */
+#define    MC_CMD_POLL_BIST_OUT_MRSFP_LEN 8
+/*            MC_CMD_POLL_BIST_OUT_RESULT_OFST 0 */
+/*            Enum values, see field(s): */
+/*               MC_CMD_POLL_BIST_OUT/MC_CMD_POLL_BIST_OUT_RESULT */
+#define       MC_CMD_POLL_BIST_OUT_MRSFP_TEST_OFST 4
+#define          MC_CMD_POLL_BIST_MRSFP_TEST_COMPLETE 0x0 /* enum */
+#define          MC_CMD_POLL_BIST_MRSFP_TEST_BUS_SWITCH_OFF_I2C_WRITE 0x1 /* enum */
+#define          MC_CMD_POLL_BIST_MRSFP_TEST_BUS_SWITCH_OFF_I2C_NO_ACCESS_IO_EXP 0x2 /* enum */
+#define          MC_CMD_POLL_BIST_MRSFP_TEST_BUS_SWITCH_OFF_I2C_NO_ACCESS_MODULE 0x3 /* enum */
+#define          MC_CMD_POLL_BIST_MRSFP_TEST_IO_EXP_I2C_CONFIGURE 0x4 /* enum */
+#define          MC_CMD_POLL_BIST_MRSFP_TEST_BUS_SWITCH_I2C_NO_CROSSTALK 0x5 /* enum */
+#define          MC_CMD_POLL_BIST_MRSFP_TEST_MODULE_PRESENCE 0x6 /* enum */
+#define          MC_CMD_POLL_BIST_MRSFP_TEST_MODULE_ID_I2C_ACCESS 0x7 /* enum */
+#define          MC_CMD_POLL_BIST_MRSFP_TEST_MODULE_ID_SANE_VALUE 0x8 /* enum */
+
+
+/***********************************/
+/* MC_CMD_FLUSH_RX_QUEUES
+ * Flush receive queue(s).
+ */
+#define MC_CMD_FLUSH_RX_QUEUES 0x27
+
+/* MC_CMD_FLUSH_RX_QUEUES_IN msgrequest */
+#define    MC_CMD_FLUSH_RX_QUEUES_IN_LENMIN 4
+#define    MC_CMD_FLUSH_RX_QUEUES_IN_LENMAX 252
+#define    MC_CMD_FLUSH_RX_QUEUES_IN_LEN(num) (0+4*(num))
+#define       MC_CMD_FLUSH_RX_QUEUES_IN_QID_OFST_OFST 0
+#define       MC_CMD_FLUSH_RX_QUEUES_IN_QID_OFST_LEN 4
+#define       MC_CMD_FLUSH_RX_QUEUES_IN_QID_OFST_MINNUM 1
+#define       MC_CMD_FLUSH_RX_QUEUES_IN_QID_OFST_MAXNUM 63
+
+/* MC_CMD_FLUSH_RX_QUEUES_OUT msgresponse */
+#define    MC_CMD_FLUSH_RX_QUEUES_OUT_LEN 0
+
+
+/***********************************/
+/* MC_CMD_GET_LOOPBACK_MODES
+ * Get port's loopback modes.
  */
 #define MC_CMD_GET_LOOPBACK_MODES 0x28
-#define MC_CMD_GET_LOOPBACK_MODES_IN_LEN 0
-#define MC_CMD_GET_LOOPBACK_MODES_OUT_LEN 32
-#define MC_CMD_GET_LOOPBACK_MODES_100M_OFST 0
-#define MC_CMD_GET_LOOPBACK_MODES_1G_OFST 8
-#define MC_CMD_GET_LOOPBACK_MODES_10G_OFST 16
-#define MC_CMD_GET_LOOPBACK_MODES_SUGGESTED_OFST 24
-
-/* Flow control enumeration */
-#define MC_CMD_FCNTL_OFF 0
-#define MC_CMD_FCNTL_RESPOND 1
-#define MC_CMD_FCNTL_BIDIR 2
-/* Auto - Use what the link has autonegotiated
- *      - The driver should modify the advertised capabilities via SET_LINK.CAP
- *        to control the negotiated flow control mode.
- *      - Can only be set if the PHY supports PAUSE+ASYM capabilities
- *      - Never returned by GET_LINK as the value programmed into the MAC
- */
-#define MC_CMD_FCNTL_AUTO 3
-
-/* Generic mac fault bitmask */
-#define MC_CMD_MAC_FAULT_XGMII_LOCAL_LBN 0
-#define MC_CMD_MAC_FAULT_XGMII_LOCAL_WIDTH 1
-#define MC_CMD_MAC_FAULT_XGMII_REMOTE_LBN 1
-#define MC_CMD_MAC_FAULT_XGMII_REMOTE_WIDTH 1
-#define MC_CMD_MAC_FAULT_SGMII_REMOTE_LBN 2
-#define MC_CMD_MAC_FAULT_SGMII_REMOTE_WIDTH 1
-
-/* MC_CMD_GET_LINK:
- * Read the unified MAC/PHY link state
- *
- * Locks required: None
- * Return code: 0, ETIME
+
+/* MC_CMD_GET_LOOPBACK_MODES_IN msgrequest */
+#define    MC_CMD_GET_LOOPBACK_MODES_IN_LEN 0
+
+/* MC_CMD_GET_LOOPBACK_MODES_OUT msgresponse */
+#define    MC_CMD_GET_LOOPBACK_MODES_OUT_LEN 32
+#define       MC_CMD_GET_LOOPBACK_MODES_OUT_100M_OFST 0
+#define       MC_CMD_GET_LOOPBACK_MODES_OUT_100M_LEN 8
+#define       MC_CMD_GET_LOOPBACK_MODES_OUT_100M_LO_OFST 0
+#define       MC_CMD_GET_LOOPBACK_MODES_OUT_100M_HI_OFST 4
+#define          MC_CMD_LOOPBACK_NONE  0x0 /* enum */
+#define          MC_CMD_LOOPBACK_DATA  0x1 /* enum */
+#define          MC_CMD_LOOPBACK_GMAC  0x2 /* enum */
+#define          MC_CMD_LOOPBACK_XGMII 0x3 /* enum */
+#define          MC_CMD_LOOPBACK_XGXS  0x4 /* enum */
+#define          MC_CMD_LOOPBACK_XAUI  0x5 /* enum */
+#define          MC_CMD_LOOPBACK_GMII  0x6 /* enum */
+#define          MC_CMD_LOOPBACK_SGMII  0x7 /* enum */
+#define          MC_CMD_LOOPBACK_XGBR  0x8 /* enum */
+#define          MC_CMD_LOOPBACK_XFI  0x9 /* enum */
+#define          MC_CMD_LOOPBACK_XAUI_FAR  0xa /* enum */
+#define          MC_CMD_LOOPBACK_GMII_FAR  0xb /* enum */
+#define          MC_CMD_LOOPBACK_SGMII_FAR  0xc /* enum */
+#define          MC_CMD_LOOPBACK_XFI_FAR  0xd /* enum */
+#define          MC_CMD_LOOPBACK_GPHY  0xe /* enum */
+#define          MC_CMD_LOOPBACK_PHYXS  0xf /* enum */
+#define          MC_CMD_LOOPBACK_PCS  0x10 /* enum */
+#define          MC_CMD_LOOPBACK_PMAPMD  0x11 /* enum */
+#define          MC_CMD_LOOPBACK_XPORT  0x12 /* enum */
+#define          MC_CMD_LOOPBACK_XGMII_WS  0x13 /* enum */
+#define          MC_CMD_LOOPBACK_XAUI_WS  0x14 /* enum */
+#define          MC_CMD_LOOPBACK_XAUI_WS_FAR  0x15 /* enum */
+#define          MC_CMD_LOOPBACK_XAUI_WS_NEAR  0x16 /* enum */
+#define          MC_CMD_LOOPBACK_GMII_WS  0x17 /* enum */
+#define          MC_CMD_LOOPBACK_XFI_WS  0x18 /* enum */
+#define          MC_CMD_LOOPBACK_XFI_WS_FAR  0x19 /* enum */
+#define          MC_CMD_LOOPBACK_PHYXS_WS  0x1a /* enum */
+#define       MC_CMD_GET_LOOPBACK_MODES_OUT_1G_OFST 8
+#define       MC_CMD_GET_LOOPBACK_MODES_OUT_1G_LEN 8
+#define       MC_CMD_GET_LOOPBACK_MODES_OUT_1G_LO_OFST 8
+#define       MC_CMD_GET_LOOPBACK_MODES_OUT_1G_HI_OFST 12
+/*            Enum values, see field(s): */
+/*               100M */
+#define       MC_CMD_GET_LOOPBACK_MODES_OUT_10G_OFST 16
+#define       MC_CMD_GET_LOOPBACK_MODES_OUT_10G_LEN 8
+#define       MC_CMD_GET_LOOPBACK_MODES_OUT_10G_LO_OFST 16
+#define       MC_CMD_GET_LOOPBACK_MODES_OUT_10G_HI_OFST 20
+/*            Enum values, see field(s): */
+/*               100M */
+#define       MC_CMD_GET_LOOPBACK_MODES_OUT_SUGGESTED_OFST 24
+#define       MC_CMD_GET_LOOPBACK_MODES_OUT_SUGGESTED_LEN 8
+#define       MC_CMD_GET_LOOPBACK_MODES_OUT_SUGGESTED_LO_OFST 24
+#define       MC_CMD_GET_LOOPBACK_MODES_OUT_SUGGESTED_HI_OFST 28
+/*            Enum values, see field(s): */
+/*               100M */
+
+
+/***********************************/
+/* MC_CMD_GET_LINK
+ * Read the unified MAC/PHY link state.
  */
 #define MC_CMD_GET_LINK 0x29
-#define MC_CMD_GET_LINK_IN_LEN 0
-#define MC_CMD_GET_LINK_OUT_LEN 28
-/* near-side and link-partner advertised capabilities */
-#define MC_CMD_GET_LINK_OUT_CAP_OFST 0
-#define MC_CMD_GET_LINK_OUT_LP_CAP_OFST 4
-/* Autonegotiated speed in mbit/s. The link may still be down
- * even if this reads non-zero */
-#define MC_CMD_GET_LINK_OUT_LINK_SPEED_OFST 8
-#define MC_CMD_GET_LINK_OUT_LOOPBACK_MODE_OFST 12
-#define MC_CMD_GET_LINK_OUT_FLAGS_OFST 16
-/* Whether we have overall link up */
-#define MC_CMD_GET_LINK_LINK_UP_LBN 0
-#define MC_CMD_GET_LINK_LINK_UP_WIDTH 1
-#define MC_CMD_GET_LINK_FULL_DUPLEX_LBN 1
-#define MC_CMD_GET_LINK_FULL_DUPLEX_WIDTH 1
-/* Whether we have link at the layers provided by the BPX */
-#define MC_CMD_GET_LINK_BPX_LINK_LBN 2
-#define MC_CMD_GET_LINK_BPX_LINK_WIDTH 1
-/* Whether the PHY has external link */
-#define MC_CMD_GET_LINK_PHY_LINK_LBN 3
-#define MC_CMD_GET_LINK_PHY_LINK_WIDTH 1
-#define MC_CMD_GET_LINK_OUT_FCNTL_OFST 20
-#define MC_CMD_GET_LINK_OUT_MAC_FAULT_OFST 24
-
-/* MC_CMD_SET_LINK:
- * Write the unified MAC/PHY link configuration
- *
- * A loopback speed of "0" is supported, and means
- * (choose any available speed)
- *
- * Locks required: None
- * Return code: 0, EINVAL, ETIME
+
+/* MC_CMD_GET_LINK_IN msgrequest */
+#define    MC_CMD_GET_LINK_IN_LEN 0
+
+/* MC_CMD_GET_LINK_OUT msgresponse */
+#define    MC_CMD_GET_LINK_OUT_LEN 28
+#define       MC_CMD_GET_LINK_OUT_CAP_OFST 0
+#define       MC_CMD_GET_LINK_OUT_LP_CAP_OFST 4
+#define       MC_CMD_GET_LINK_OUT_LINK_SPEED_OFST 8
+#define       MC_CMD_GET_LINK_OUT_LOOPBACK_MODE_OFST 12
+/*            Enum values, see field(s): */
+/*               MC_CMD_GET_LOOPBACK_MODES/MC_CMD_GET_LOOPBACK_MODES_OUT/100M */
+#define       MC_CMD_GET_LINK_OUT_FLAGS_OFST 16
+#define        MC_CMD_GET_LINK_OUT_LINK_UP_LBN 0
+#define        MC_CMD_GET_LINK_OUT_LINK_UP_WIDTH 1
+#define        MC_CMD_GET_LINK_OUT_FULL_DUPLEX_LBN 1
+#define        MC_CMD_GET_LINK_OUT_FULL_DUPLEX_WIDTH 1
+#define        MC_CMD_GET_LINK_OUT_BPX_LINK_LBN 2
+#define        MC_CMD_GET_LINK_OUT_BPX_LINK_WIDTH 1
+#define        MC_CMD_GET_LINK_OUT_PHY_LINK_LBN 3
+#define        MC_CMD_GET_LINK_OUT_PHY_LINK_WIDTH 1
+#define       MC_CMD_GET_LINK_OUT_FCNTL_OFST 20
+#define          MC_CMD_FCNTL_OFF 0x0 /* enum */
+#define          MC_CMD_FCNTL_RESPOND 0x1 /* enum */
+#define          MC_CMD_FCNTL_BIDIR 0x2 /* enum */
+#define       MC_CMD_GET_LINK_OUT_MAC_FAULT_OFST 24
+#define        MC_CMD_MAC_FAULT_XGMII_LOCAL_LBN 0
+#define        MC_CMD_MAC_FAULT_XGMII_LOCAL_WIDTH 1
+#define        MC_CMD_MAC_FAULT_XGMII_REMOTE_LBN 1
+#define        MC_CMD_MAC_FAULT_XGMII_REMOTE_WIDTH 1
+#define        MC_CMD_MAC_FAULT_SGMII_REMOTE_LBN 2
+#define        MC_CMD_MAC_FAULT_SGMII_REMOTE_WIDTH 1
+#define        MC_CMD_MAC_FAULT_PENDING_RECONFIG_LBN 3
+#define        MC_CMD_MAC_FAULT_PENDING_RECONFIG_WIDTH 1
+
+
+/***********************************/
+/* MC_CMD_SET_LINK
+ * Write the unified MAC/PHY link configuration.
  */
 #define MC_CMD_SET_LINK 0x2a
-#define MC_CMD_SET_LINK_IN_LEN 16
-#define MC_CMD_SET_LINK_IN_CAP_OFST 0
-#define MC_CMD_SET_LINK_IN_FLAGS_OFST 4
-#define MC_CMD_SET_LINK_LOWPOWER_LBN 0
-#define MC_CMD_SET_LINK_LOWPOWER_WIDTH 1
-#define MC_CMD_SET_LINK_POWEROFF_LBN 1
-#define MC_CMD_SET_LINK_POWEROFF_WIDTH 1
-#define MC_CMD_SET_LINK_TXDIS_LBN 2
-#define MC_CMD_SET_LINK_TXDIS_WIDTH 1
-#define MC_CMD_SET_LINK_IN_LOOPBACK_MODE_OFST 8
-#define MC_CMD_SET_LINK_IN_LOOPBACK_SPEED_OFST 12
-#define MC_CMD_SET_LINK_OUT_LEN 0
-
-/* MC_CMD_SET_ID_LED:
- * Set indentification LED state
- *
- * Locks required: None
- * Return code: 0, EINVAL
+
+/* MC_CMD_SET_LINK_IN msgrequest */
+#define    MC_CMD_SET_LINK_IN_LEN 16
+#define       MC_CMD_SET_LINK_IN_CAP_OFST 0
+#define       MC_CMD_SET_LINK_IN_FLAGS_OFST 4
+#define        MC_CMD_SET_LINK_IN_LOWPOWER_LBN 0
+#define        MC_CMD_SET_LINK_IN_LOWPOWER_WIDTH 1
+#define        MC_CMD_SET_LINK_IN_POWEROFF_LBN 1
+#define        MC_CMD_SET_LINK_IN_POWEROFF_WIDTH 1
+#define        MC_CMD_SET_LINK_IN_TXDIS_LBN 2
+#define        MC_CMD_SET_LINK_IN_TXDIS_WIDTH 1
+#define       MC_CMD_SET_LINK_IN_LOOPBACK_MODE_OFST 8
+/*            Enum values, see field(s): */
+/*               MC_CMD_GET_LOOPBACK_MODES/MC_CMD_GET_LOOPBACK_MODES_OUT/100M */
+#define       MC_CMD_SET_LINK_IN_LOOPBACK_SPEED_OFST 12
+
+/* MC_CMD_SET_LINK_OUT msgresponse */
+#define    MC_CMD_SET_LINK_OUT_LEN 0
+
+
+/***********************************/
+/* MC_CMD_SET_ID_LED
+ * Set indentification LED state.
  */
 #define MC_CMD_SET_ID_LED 0x2b
-#define MC_CMD_SET_ID_LED_IN_LEN 4
-#define MC_CMD_SET_ID_LED_IN_STATE_OFST 0
-#define  MC_CMD_LED_OFF 0
-#define  MC_CMD_LED_ON 1
-#define  MC_CMD_LED_DEFAULT 2
-#define MC_CMD_SET_ID_LED_OUT_LEN 0
-
-/* MC_CMD_SET_MAC:
- * Set MAC configuration
- *
- * The MTU is the MTU programmed directly into the XMAC/GMAC
- * (inclusive of EtherII, VLAN, bug16011 padding)
- *
- * Locks required: None
- * Return code: 0, EINVAL
+
+/* MC_CMD_SET_ID_LED_IN msgrequest */
+#define    MC_CMD_SET_ID_LED_IN_LEN 4
+#define       MC_CMD_SET_ID_LED_IN_STATE_OFST 0
+#define          MC_CMD_LED_OFF  0x0 /* enum */
+#define          MC_CMD_LED_ON  0x1 /* enum */
+#define          MC_CMD_LED_DEFAULT  0x2 /* enum */
+
+/* MC_CMD_SET_ID_LED_OUT msgresponse */
+#define    MC_CMD_SET_ID_LED_OUT_LEN 0
+
+
+/***********************************/
+/* MC_CMD_SET_MAC
+ * Set MAC configuration.
  */
 #define MC_CMD_SET_MAC 0x2c
-#define MC_CMD_SET_MAC_IN_LEN 24
-#define MC_CMD_SET_MAC_IN_MTU_OFST 0
-#define MC_CMD_SET_MAC_IN_DRAIN_OFST 4
-#define MC_CMD_SET_MAC_IN_ADDR_OFST 8
-#define MC_CMD_SET_MAC_IN_REJECT_OFST 16
-#define MC_CMD_SET_MAC_IN_REJECT_UNCST_LBN 0
-#define MC_CMD_SET_MAC_IN_REJECT_UNCST_WIDTH 1
-#define MC_CMD_SET_MAC_IN_REJECT_BRDCST_LBN 1
-#define MC_CMD_SET_MAC_IN_REJECT_BRDCST_WIDTH 1
-#define MC_CMD_SET_MAC_IN_FCNTL_OFST 20
-#define MC_CMD_SET_MAC_OUT_LEN 0
-
-/* MC_CMD_PHY_STATS:
- * Get generic PHY statistics
- *
- * This call returns the statistics for a generic PHY in a sparse
- * array (indexed by the enumerate). Each value is represented by
- * a 32bit number.
- *
- * If the DMA_ADDR is 0, then no DMA is performed, and the statistics
- * may be read directly out of shared memory. If DMA_ADDR != 0, then
- * the statistics are dmad to that (page-aligned location)
- *
- * Locks required: None
- * Returns: 0, ETIME
- * Response methods: shared memory, event
+
+/* MC_CMD_SET_MAC_IN msgrequest */
+#define    MC_CMD_SET_MAC_IN_LEN 24
+#define       MC_CMD_SET_MAC_IN_MTU_OFST 0
+#define       MC_CMD_SET_MAC_IN_DRAIN_OFST 4
+#define       MC_CMD_SET_MAC_IN_ADDR_OFST 8
+#define       MC_CMD_SET_MAC_IN_ADDR_LEN 8
+#define       MC_CMD_SET_MAC_IN_ADDR_LO_OFST 8
+#define       MC_CMD_SET_MAC_IN_ADDR_HI_OFST 12
+#define       MC_CMD_SET_MAC_IN_REJECT_OFST 16
+#define        MC_CMD_SET_MAC_IN_REJECT_UNCST_LBN 0
+#define        MC_CMD_SET_MAC_IN_REJECT_UNCST_WIDTH 1
+#define        MC_CMD_SET_MAC_IN_REJECT_BRDCST_LBN 1
+#define        MC_CMD_SET_MAC_IN_REJECT_BRDCST_WIDTH 1
+#define       MC_CMD_SET_MAC_IN_FCNTL_OFST 20
+/*               MC_CMD_FCNTL_OFF 0x0 */
+/*               MC_CMD_FCNTL_RESPOND 0x1 */
+/*               MC_CMD_FCNTL_BIDIR 0x2 */
+#define          MC_CMD_FCNTL_AUTO 0x3 /* enum */
+
+/* MC_CMD_SET_MAC_OUT msgresponse */
+#define    MC_CMD_SET_MAC_OUT_LEN 0
+
+
+/***********************************/
+/* MC_CMD_PHY_STATS
+ * Get generic PHY statistics.
  */
 #define MC_CMD_PHY_STATS 0x2d
-#define MC_CMD_PHY_STATS_IN_LEN 8
-#define MC_CMD_PHY_STATS_IN_DMA_ADDR_LO_OFST 0
-#define MC_CMD_PHY_STATS_IN_DMA_ADDR_HI_OFST 4
-#define MC_CMD_PHY_STATS_OUT_DMA_LEN 0
-#define MC_CMD_PHY_STATS_OUT_NO_DMA_LEN (MC_CMD_PHY_NSTATS * 4)
-
-/* Unified MAC statistics enumeration */
-#define MC_CMD_MAC_GENERATION_START 0
-#define MC_CMD_MAC_TX_PKTS 1
-#define MC_CMD_MAC_TX_PAUSE_PKTS 2
-#define MC_CMD_MAC_TX_CONTROL_PKTS 3
-#define MC_CMD_MAC_TX_UNICAST_PKTS 4
-#define MC_CMD_MAC_TX_MULTICAST_PKTS 5
-#define MC_CMD_MAC_TX_BROADCAST_PKTS 6
-#define MC_CMD_MAC_TX_BYTES 7
-#define MC_CMD_MAC_TX_BAD_BYTES 8
-#define MC_CMD_MAC_TX_LT64_PKTS 9
-#define MC_CMD_MAC_TX_64_PKTS 10
-#define MC_CMD_MAC_TX_65_TO_127_PKTS 11
-#define MC_CMD_MAC_TX_128_TO_255_PKTS 12
-#define MC_CMD_MAC_TX_256_TO_511_PKTS 13
-#define MC_CMD_MAC_TX_512_TO_1023_PKTS 14
-#define MC_CMD_MAC_TX_1024_TO_15XX_PKTS 15
-#define MC_CMD_MAC_TX_15XX_TO_JUMBO_PKTS 16
-#define MC_CMD_MAC_TX_GTJUMBO_PKTS 17
-#define MC_CMD_MAC_TX_BAD_FCS_PKTS 18
-#define MC_CMD_MAC_TX_SINGLE_COLLISION_PKTS 19
-#define MC_CMD_MAC_TX_MULTIPLE_COLLISION_PKTS 20
-#define MC_CMD_MAC_TX_EXCESSIVE_COLLISION_PKTS 21
-#define MC_CMD_MAC_TX_LATE_COLLISION_PKTS 22
-#define MC_CMD_MAC_TX_DEFERRED_PKTS 23
-#define MC_CMD_MAC_TX_EXCESSIVE_DEFERRED_PKTS 24
-#define MC_CMD_MAC_TX_NON_TCPUDP_PKTS 25
-#define MC_CMD_MAC_TX_MAC_SRC_ERR_PKTS 26
-#define MC_CMD_MAC_TX_IP_SRC_ERR_PKTS 27
-#define MC_CMD_MAC_RX_PKTS 28
-#define MC_CMD_MAC_RX_PAUSE_PKTS 29
-#define MC_CMD_MAC_RX_GOOD_PKTS 30
-#define MC_CMD_MAC_RX_CONTROL_PKTS 31
-#define MC_CMD_MAC_RX_UNICAST_PKTS 32
-#define MC_CMD_MAC_RX_MULTICAST_PKTS 33
-#define MC_CMD_MAC_RX_BROADCAST_PKTS 34
-#define MC_CMD_MAC_RX_BYTES 35
-#define MC_CMD_MAC_RX_BAD_BYTES 36
-#define MC_CMD_MAC_RX_64_PKTS 37
-#define MC_CMD_MAC_RX_65_TO_127_PKTS 38
-#define MC_CMD_MAC_RX_128_TO_255_PKTS 39
-#define MC_CMD_MAC_RX_256_TO_511_PKTS 40
-#define MC_CMD_MAC_RX_512_TO_1023_PKTS 41
-#define MC_CMD_MAC_RX_1024_TO_15XX_PKTS 42
-#define MC_CMD_MAC_RX_15XX_TO_JUMBO_PKTS 43
-#define MC_CMD_MAC_RX_GTJUMBO_PKTS 44
-#define MC_CMD_MAC_RX_UNDERSIZE_PKTS 45
-#define MC_CMD_MAC_RX_BAD_FCS_PKTS 46
-#define MC_CMD_MAC_RX_OVERFLOW_PKTS 47
-#define MC_CMD_MAC_RX_FALSE_CARRIER_PKTS 48
-#define MC_CMD_MAC_RX_SYMBOL_ERROR_PKTS 49
-#define MC_CMD_MAC_RX_ALIGN_ERROR_PKTS 50
-#define MC_CMD_MAC_RX_LENGTH_ERROR_PKTS 51
-#define MC_CMD_MAC_RX_INTERNAL_ERROR_PKTS 52
-#define MC_CMD_MAC_RX_JABBER_PKTS 53
-#define MC_CMD_MAC_RX_NODESC_DROPS 54
-#define MC_CMD_MAC_RX_LANES01_CHAR_ERR 55
-#define MC_CMD_MAC_RX_LANES23_CHAR_ERR 56
-#define MC_CMD_MAC_RX_LANES01_DISP_ERR 57
-#define MC_CMD_MAC_RX_LANES23_DISP_ERR 58
-#define MC_CMD_MAC_RX_MATCH_FAULT 59
-#define MC_CMD_GMAC_DMABUF_START 64
-#define MC_CMD_GMAC_DMABUF_END   95
-/* Insert new members here. */
-#define MC_CMD_MAC_GENERATION_END 96
-#define MC_CMD_MAC_NSTATS (MC_CMD_MAC_GENERATION_END+1)
-
-/* MC_CMD_MAC_STATS:
- * Get unified GMAC/XMAC statistics
- *
- * This call returns unified statistics maintained by the MC as it
- * switches between the GMAC and XMAC. The MC will write out all
- * supported stats.  The driver should zero initialise the buffer to
- * guarantee consistent results.
- *
- * Locks required: None
- * Returns: 0
- * Response methods: shared memory, event
- */
-#define MC_CMD_MAC_STATS 0x2e
-#define MC_CMD_MAC_STATS_IN_LEN 16
-#define MC_CMD_MAC_STATS_IN_DMA_ADDR_LO_OFST 0
-#define MC_CMD_MAC_STATS_IN_DMA_ADDR_HI_OFST 4
-#define MC_CMD_MAC_STATS_IN_CMD_OFST 8
-#define MC_CMD_MAC_STATS_CMD_DMA_LBN 0
-#define MC_CMD_MAC_STATS_CMD_DMA_WIDTH 1
-#define MC_CMD_MAC_STATS_CMD_CLEAR_LBN 1
-#define MC_CMD_MAC_STATS_CMD_CLEAR_WIDTH 1
-#define MC_CMD_MAC_STATS_CMD_PERIODIC_CHANGE_LBN 2
-#define MC_CMD_MAC_STATS_CMD_PERIODIC_CHANGE_WIDTH 1
-/* Remaining PERIOD* fields only relevant when PERIODIC_CHANGE is set */
-#define MC_CMD_MAC_STATS_CMD_PERIODIC_ENABLE_LBN 3
-#define MC_CMD_MAC_STATS_CMD_PERIODIC_ENABLE_WIDTH 1
-#define MC_CMD_MAC_STATS_CMD_PERIODIC_CLEAR_LBN 4
-#define MC_CMD_MAC_STATS_CMD_PERIODIC_CLEAR_WIDTH 1
-#define MC_CMD_MAC_STATS_CMD_PERIODIC_NOEVENT_LBN 5
-#define MC_CMD_MAC_STATS_CMD_PERIODIC_NOEVENT_WIDTH 1
-#define MC_CMD_MAC_STATS_CMD_PERIOD_MS_LBN 16
-#define MC_CMD_MAC_STATS_CMD_PERIOD_MS_WIDTH 16
-#define MC_CMD_MAC_STATS_IN_DMA_LEN_OFST 12
-
-#define MC_CMD_MAC_STATS_OUT_LEN 0
-
-/* Callisto flags */
-#define MC_CMD_SFT9001_ROBUST_LBN 0
-#define MC_CMD_SFT9001_ROBUST_WIDTH 1
-#define MC_CMD_SFT9001_SHORT_REACH_LBN 1
-#define MC_CMD_SFT9001_SHORT_REACH_WIDTH 1
-
-/* MC_CMD_SFT9001_GET:
- * Read current callisto specific setting
- *
- * Locks required: None
- * Returns: 0, ETIME
- */
-#define MC_CMD_SFT9001_GET 0x30
-#define MC_CMD_SFT9001_GET_IN_LEN 0
-#define MC_CMD_SFT9001_GET_OUT_LEN 4
-#define MC_CMD_SFT9001_GET_OUT_FLAGS_OFST 0
 
-/* MC_CMD_SFT9001_SET:
- * Write current callisto specific setting
- *
- * Locks required: None
- * Returns: 0, ETIME, EINVAL
+/* MC_CMD_PHY_STATS_IN msgrequest */
+#define    MC_CMD_PHY_STATS_IN_LEN 8
+#define       MC_CMD_PHY_STATS_IN_DMA_ADDR_OFST 0
+#define       MC_CMD_PHY_STATS_IN_DMA_ADDR_LEN 8
+#define       MC_CMD_PHY_STATS_IN_DMA_ADDR_LO_OFST 0
+#define       MC_CMD_PHY_STATS_IN_DMA_ADDR_HI_OFST 4
+
+/* MC_CMD_PHY_STATS_OUT_DMA msgresponse */
+#define    MC_CMD_PHY_STATS_OUT_DMA_LEN 0
+
+/* MC_CMD_PHY_STATS_OUT_NO_DMA msgresponse */
+#define    MC_CMD_PHY_STATS_OUT_NO_DMA_LEN (((MC_CMD_PHY_NSTATS*32))>>3)
+#define       MC_CMD_PHY_STATS_OUT_NO_DMA_STATISTICS_OFST 0
+#define       MC_CMD_PHY_STATS_OUT_NO_DMA_STATISTICS_LEN 4
+#define       MC_CMD_PHY_STATS_OUT_NO_DMA_STATISTICS_NUM MC_CMD_PHY_NSTATS
+#define          MC_CMD_OUI  0x0 /* enum */
+#define          MC_CMD_PMA_PMD_LINK_UP  0x1 /* enum */
+#define          MC_CMD_PMA_PMD_RX_FAULT  0x2 /* enum */
+#define          MC_CMD_PMA_PMD_TX_FAULT  0x3 /* enum */
+#define          MC_CMD_PMA_PMD_SIGNAL  0x4 /* enum */
+#define          MC_CMD_PMA_PMD_SNR_A  0x5 /* enum */
+#define          MC_CMD_PMA_PMD_SNR_B  0x6 /* enum */
+#define          MC_CMD_PMA_PMD_SNR_C  0x7 /* enum */
+#define          MC_CMD_PMA_PMD_SNR_D  0x8 /* enum */
+#define          MC_CMD_PCS_LINK_UP  0x9 /* enum */
+#define          MC_CMD_PCS_RX_FAULT  0xa /* enum */
+#define          MC_CMD_PCS_TX_FAULT  0xb /* enum */
+#define          MC_CMD_PCS_BER  0xc /* enum */
+#define          MC_CMD_PCS_BLOCK_ERRORS  0xd /* enum */
+#define          MC_CMD_PHYXS_LINK_UP  0xe /* enum */
+#define          MC_CMD_PHYXS_RX_FAULT  0xf /* enum */
+#define          MC_CMD_PHYXS_TX_FAULT  0x10 /* enum */
+#define          MC_CMD_PHYXS_ALIGN  0x11 /* enum */
+#define          MC_CMD_PHYXS_SYNC  0x12 /* enum */
+#define          MC_CMD_AN_LINK_UP  0x13 /* enum */
+#define          MC_CMD_AN_COMPLETE  0x14 /* enum */
+#define          MC_CMD_AN_10GBT_STATUS  0x15 /* enum */
+#define          MC_CMD_CL22_LINK_UP  0x16 /* enum */
+#define          MC_CMD_PHY_NSTATS  0x17 /* enum */
+
+
+/***********************************/
+/* MC_CMD_MAC_STATS
+ * Get generic MAC statistics.
  */
-#define MC_CMD_SFT9001_SET 0x31
-#define MC_CMD_SFT9001_SET_IN_LEN 4
-#define MC_CMD_SFT9001_SET_IN_FLAGS_OFST 0
-#define MC_CMD_SFT9001_SET_OUT_LEN 0
-
+#define MC_CMD_MAC_STATS 0x2e
 
-/* MC_CMD_WOL_FILTER_SET:
- * Set a WoL filter
- *
- * Locks required: None
- * Returns: 0, EBUSY, EINVAL, ENOSYS
+/* MC_CMD_MAC_STATS_IN msgrequest */
+#define    MC_CMD_MAC_STATS_IN_LEN 16
+#define       MC_CMD_MAC_STATS_IN_DMA_ADDR_OFST 0
+#define       MC_CMD_MAC_STATS_IN_DMA_ADDR_LEN 8
+#define       MC_CMD_MAC_STATS_IN_DMA_ADDR_LO_OFST 0
+#define       MC_CMD_MAC_STATS_IN_DMA_ADDR_HI_OFST 4
+#define       MC_CMD_MAC_STATS_IN_CMD_OFST 8
+#define        MC_CMD_MAC_STATS_IN_DMA_LBN 0
+#define        MC_CMD_MAC_STATS_IN_DMA_WIDTH 1
+#define        MC_CMD_MAC_STATS_IN_CLEAR_LBN 1
+#define        MC_CMD_MAC_STATS_IN_CLEAR_WIDTH 1
+#define        MC_CMD_MAC_STATS_IN_PERIODIC_CHANGE_LBN 2
+#define        MC_CMD_MAC_STATS_IN_PERIODIC_CHANGE_WIDTH 1
+#define        MC_CMD_MAC_STATS_IN_PERIODIC_ENABLE_LBN 3
+#define        MC_CMD_MAC_STATS_IN_PERIODIC_ENABLE_WIDTH 1
+#define        MC_CMD_MAC_STATS_IN_PERIODIC_CLEAR_LBN 4
+#define        MC_CMD_MAC_STATS_IN_PERIODIC_CLEAR_WIDTH 1
+#define        MC_CMD_MAC_STATS_IN_PERIODIC_NOEVENT_LBN 5
+#define        MC_CMD_MAC_STATS_IN_PERIODIC_NOEVENT_WIDTH 1
+#define        MC_CMD_MAC_STATS_IN_PERIOD_MS_LBN 16
+#define        MC_CMD_MAC_STATS_IN_PERIOD_MS_WIDTH 16
+#define       MC_CMD_MAC_STATS_IN_DMA_LEN_OFST 12
+
+/* MC_CMD_MAC_STATS_OUT_DMA msgresponse */
+#define    MC_CMD_MAC_STATS_OUT_DMA_LEN 0
+
+/* MC_CMD_MAC_STATS_OUT_NO_DMA msgresponse */
+#define    MC_CMD_MAC_STATS_OUT_NO_DMA_LEN (((MC_CMD_MAC_NSTATS*64))>>3)
+#define       MC_CMD_MAC_STATS_OUT_NO_DMA_STATISTICS_OFST 0
+#define       MC_CMD_MAC_STATS_OUT_NO_DMA_STATISTICS_LEN 8
+#define       MC_CMD_MAC_STATS_OUT_NO_DMA_STATISTICS_LO_OFST 0
+#define       MC_CMD_MAC_STATS_OUT_NO_DMA_STATISTICS_HI_OFST 4
+#define       MC_CMD_MAC_STATS_OUT_NO_DMA_STATISTICS_NUM MC_CMD_MAC_NSTATS
+#define          MC_CMD_MAC_GENERATION_START  0x0 /* enum */
+#define          MC_CMD_MAC_TX_PKTS  0x1 /* enum */
+#define          MC_CMD_MAC_TX_PAUSE_PKTS  0x2 /* enum */
+#define          MC_CMD_MAC_TX_CONTROL_PKTS  0x3 /* enum */
+#define          MC_CMD_MAC_TX_UNICAST_PKTS  0x4 /* enum */
+#define          MC_CMD_MAC_TX_MULTICAST_PKTS  0x5 /* enum */
+#define          MC_CMD_MAC_TX_BROADCAST_PKTS  0x6 /* enum */
+#define          MC_CMD_MAC_TX_BYTES  0x7 /* enum */
+#define          MC_CMD_MAC_TX_BAD_BYTES  0x8 /* enum */
+#define          MC_CMD_MAC_TX_LT64_PKTS  0x9 /* enum */
+#define          MC_CMD_MAC_TX_64_PKTS  0xa /* enum */
+#define          MC_CMD_MAC_TX_65_TO_127_PKTS  0xb /* enum */
+#define          MC_CMD_MAC_TX_128_TO_255_PKTS  0xc /* enum */
+#define          MC_CMD_MAC_TX_256_TO_511_PKTS  0xd /* enum */
+#define          MC_CMD_MAC_TX_512_TO_1023_PKTS  0xe /* enum */
+#define          MC_CMD_MAC_TX_1024_TO_15XX_PKTS  0xf /* enum */
+#define          MC_CMD_MAC_TX_15XX_TO_JUMBO_PKTS  0x10 /* enum */
+#define          MC_CMD_MAC_TX_GTJUMBO_PKTS  0x11 /* enum */
+#define          MC_CMD_MAC_TX_BAD_FCS_PKTS  0x12 /* enum */
+#define          MC_CMD_MAC_TX_SINGLE_COLLISION_PKTS  0x13 /* enum */
+#define          MC_CMD_MAC_TX_MULTIPLE_COLLISION_PKTS  0x14 /* enum */
+#define          MC_CMD_MAC_TX_EXCESSIVE_COLLISION_PKTS  0x15 /* enum */
+#define          MC_CMD_MAC_TX_LATE_COLLISION_PKTS  0x16 /* enum */
+#define          MC_CMD_MAC_TX_DEFERRED_PKTS  0x17 /* enum */
+#define          MC_CMD_MAC_TX_EXCESSIVE_DEFERRED_PKTS  0x18 /* enum */
+#define          MC_CMD_MAC_TX_NON_TCPUDP_PKTS  0x19 /* enum */
+#define          MC_CMD_MAC_TX_MAC_SRC_ERR_PKTS  0x1a /* enum */
+#define          MC_CMD_MAC_TX_IP_SRC_ERR_PKTS  0x1b /* enum */
+#define          MC_CMD_MAC_RX_PKTS  0x1c /* enum */
+#define          MC_CMD_MAC_RX_PAUSE_PKTS  0x1d /* enum */
+#define          MC_CMD_MAC_RX_GOOD_PKTS  0x1e /* enum */
+#define          MC_CMD_MAC_RX_CONTROL_PKTS  0x1f /* enum */
+#define          MC_CMD_MAC_RX_UNICAST_PKTS  0x20 /* enum */
+#define          MC_CMD_MAC_RX_MULTICAST_PKTS  0x21 /* enum */
+#define          MC_CMD_MAC_RX_BROADCAST_PKTS  0x22 /* enum */
+#define          MC_CMD_MAC_RX_BYTES  0x23 /* enum */
+#define          MC_CMD_MAC_RX_BAD_BYTES  0x24 /* enum */
+#define          MC_CMD_MAC_RX_64_PKTS  0x25 /* enum */
+#define          MC_CMD_MAC_RX_65_TO_127_PKTS  0x26 /* enum */
+#define          MC_CMD_MAC_RX_128_TO_255_PKTS  0x27 /* enum */
+#define          MC_CMD_MAC_RX_256_TO_511_PKTS  0x28 /* enum */
+#define          MC_CMD_MAC_RX_512_TO_1023_PKTS  0x29 /* enum */
+#define          MC_CMD_MAC_RX_1024_TO_15XX_PKTS  0x2a /* enum */
+#define          MC_CMD_MAC_RX_15XX_TO_JUMBO_PKTS  0x2b /* enum */
+#define          MC_CMD_MAC_RX_GTJUMBO_PKTS  0x2c /* enum */
+#define          MC_CMD_MAC_RX_UNDERSIZE_PKTS  0x2d /* enum */
+#define          MC_CMD_MAC_RX_BAD_FCS_PKTS  0x2e /* enum */
+#define          MC_CMD_MAC_RX_OVERFLOW_PKTS  0x2f /* enum */
+#define          MC_CMD_MAC_RX_FALSE_CARRIER_PKTS  0x30 /* enum */
+#define          MC_CMD_MAC_RX_SYMBOL_ERROR_PKTS  0x31 /* enum */
+#define          MC_CMD_MAC_RX_ALIGN_ERROR_PKTS  0x32 /* enum */
+#define          MC_CMD_MAC_RX_LENGTH_ERROR_PKTS  0x33 /* enum */
+#define          MC_CMD_MAC_RX_INTERNAL_ERROR_PKTS  0x34 /* enum */
+#define          MC_CMD_MAC_RX_JABBER_PKTS  0x35 /* enum */
+#define          MC_CMD_MAC_RX_NODESC_DROPS  0x36 /* enum */
+#define          MC_CMD_MAC_RX_LANES01_CHAR_ERR  0x37 /* enum */
+#define          MC_CMD_MAC_RX_LANES23_CHAR_ERR  0x38 /* enum */
+#define          MC_CMD_MAC_RX_LANES01_DISP_ERR  0x39 /* enum */
+#define          MC_CMD_MAC_RX_LANES23_DISP_ERR  0x3a /* enum */
+#define          MC_CMD_MAC_RX_MATCH_FAULT  0x3b /* enum */
+#define          MC_CMD_GMAC_DMABUF_START  0x40 /* enum */
+#define          MC_CMD_GMAC_DMABUF_END    0x5f /* enum */
+#define          MC_CMD_MAC_GENERATION_END 0x60 /* enum */
+#define          MC_CMD_MAC_NSTATS  0x61 /* enum */
+
+
+/***********************************/
+/* MC_CMD_SRIOV
+ * to be documented
+ */
+#define MC_CMD_SRIOV 0x30
+
+/* MC_CMD_SRIOV_IN msgrequest */
+#define    MC_CMD_SRIOV_IN_LEN 12
+#define       MC_CMD_SRIOV_IN_ENABLE_OFST 0
+#define       MC_CMD_SRIOV_IN_VI_BASE_OFST 4
+#define       MC_CMD_SRIOV_IN_VF_COUNT_OFST 8
+
+/* MC_CMD_SRIOV_OUT msgresponse */
+#define    MC_CMD_SRIOV_OUT_LEN 8
+#define       MC_CMD_SRIOV_OUT_VI_SCALE_OFST 0
+#define       MC_CMD_SRIOV_OUT_VF_TOTAL_OFST 4
+
+/* MC_CMD_MEMCPY_RECORD_TYPEDEF structuredef */
+#define    MC_CMD_MEMCPY_RECORD_TYPEDEF_LEN 32
+#define       MC_CMD_MEMCPY_RECORD_TYPEDEF_NUM_RECORDS_OFST 0
+#define       MC_CMD_MEMCPY_RECORD_TYPEDEF_NUM_RECORDS_LBN 0
+#define       MC_CMD_MEMCPY_RECORD_TYPEDEF_NUM_RECORDS_WIDTH 32
+#define       MC_CMD_MEMCPY_RECORD_TYPEDEF_TO_RID_OFST 4
+#define       MC_CMD_MEMCPY_RECORD_TYPEDEF_TO_RID_LBN 32
+#define       MC_CMD_MEMCPY_RECORD_TYPEDEF_TO_RID_WIDTH 32
+#define       MC_CMD_MEMCPY_RECORD_TYPEDEF_TO_ADDR_OFST 8
+#define       MC_CMD_MEMCPY_RECORD_TYPEDEF_TO_ADDR_LEN 8
+#define       MC_CMD_MEMCPY_RECORD_TYPEDEF_TO_ADDR_LO_OFST 8
+#define       MC_CMD_MEMCPY_RECORD_TYPEDEF_TO_ADDR_HI_OFST 12
+#define       MC_CMD_MEMCPY_RECORD_TYPEDEF_TO_ADDR_LBN 64
+#define       MC_CMD_MEMCPY_RECORD_TYPEDEF_TO_ADDR_WIDTH 64
+#define       MC_CMD_MEMCPY_RECORD_TYPEDEF_FROM_RID_OFST 16
+#define          MC_CMD_MEMCPY_RECORD_TYPEDEF_RID_INLINE 0x100 /* enum */
+#define       MC_CMD_MEMCPY_RECORD_TYPEDEF_FROM_RID_LBN 128
+#define       MC_CMD_MEMCPY_RECORD_TYPEDEF_FROM_RID_WIDTH 32
+#define       MC_CMD_MEMCPY_RECORD_TYPEDEF_FROM_ADDR_OFST 20
+#define       MC_CMD_MEMCPY_RECORD_TYPEDEF_FROM_ADDR_LEN 8
+#define       MC_CMD_MEMCPY_RECORD_TYPEDEF_FROM_ADDR_LO_OFST 20
+#define       MC_CMD_MEMCPY_RECORD_TYPEDEF_FROM_ADDR_HI_OFST 24
+#define       MC_CMD_MEMCPY_RECORD_TYPEDEF_FROM_ADDR_LBN 160
+#define       MC_CMD_MEMCPY_RECORD_TYPEDEF_FROM_ADDR_WIDTH 64
+#define       MC_CMD_MEMCPY_RECORD_TYPEDEF_LENGTH_OFST 28
+#define       MC_CMD_MEMCPY_RECORD_TYPEDEF_LENGTH_LBN 224
+#define       MC_CMD_MEMCPY_RECORD_TYPEDEF_LENGTH_WIDTH 32
+
+
+/***********************************/
+/* MC_CMD_MEMCPY
+ * Perform memory copy operation.
+ */
+#define MC_CMD_MEMCPY 0x31
+
+/* MC_CMD_MEMCPY_IN msgrequest */
+#define    MC_CMD_MEMCPY_IN_LENMIN 32
+#define    MC_CMD_MEMCPY_IN_LENMAX 224
+#define    MC_CMD_MEMCPY_IN_LEN(num) (0+32*(num))
+#define       MC_CMD_MEMCPY_IN_RECORD_OFST 0
+#define       MC_CMD_MEMCPY_IN_RECORD_LEN 32
+#define       MC_CMD_MEMCPY_IN_RECORD_MINNUM 1
+#define       MC_CMD_MEMCPY_IN_RECORD_MAXNUM 7
+
+/* MC_CMD_MEMCPY_OUT msgresponse */
+#define    MC_CMD_MEMCPY_OUT_LEN 0
+
+
+/***********************************/
+/* MC_CMD_WOL_FILTER_SET
+ * Set a WoL filter.
  */
 #define MC_CMD_WOL_FILTER_SET 0x32
-#define MC_CMD_WOL_FILTER_SET_IN_LEN 192 /* 190 rounded up to a word */
-#define MC_CMD_WOL_FILTER_SET_IN_FILTER_MODE_OFST 0
-#define MC_CMD_WOL_FILTER_SET_IN_WOL_TYPE_OFST 4
-
-/* There is a union at offset 8, following defines overlap due to
- * this */
-#define MC_CMD_WOL_FILTER_SET_IN_DATA_OFST 8
-
-#define MC_CMD_WOL_FILTER_SET_IN_MAGIC_MAC_OFST                \
-       MC_CMD_WOL_FILTER_SET_IN_DATA_OFST
-
-#define MC_CMD_WOL_FILTER_SET_IN_IPV4_SYN_SRC_IP_OFST   \
-       MC_CMD_WOL_FILTER_SET_IN_DATA_OFST
-#define MC_CMD_WOL_FILTER_SET_IN_IPV4_SYN_DST_IP_OFST   \
-       (MC_CMD_WOL_FILTER_SET_IN_DATA_OFST + 4)
-#define MC_CMD_WOL_FILTER_SET_IN_IPV4_SYN_SRC_PORT_OFST \
-       (MC_CMD_WOL_FILTER_SET_IN_DATA_OFST + 8)
-#define MC_CMD_WOL_FILTER_SET_IN_IPV4_SYN_DST_PORT_OFST \
-       (MC_CMD_WOL_FILTER_SET_IN_DATA_OFST + 10)
-
-#define MC_CMD_WOL_FILTER_SET_IN_IPV6_SYN_SRC_IP_OFST   \
-       MC_CMD_WOL_FILTER_SET_IN_DATA_OFST
-#define MC_CMD_WOL_FILTER_SET_IN_IPV6_SYN_DST_IP_OFST   \
-       (MC_CMD_WOL_FILTER_SET_IN_DATA_OFST + 16)
-#define MC_CMD_WOL_FILTER_SET_IN_IPV6_SYN_SRC_PORT_OFST \
-       (MC_CMD_WOL_FILTER_SET_IN_DATA_OFST + 32)
-#define MC_CMD_WOL_FILTER_SET_IN_IPV6_SYN_DST_PORT_OFST \
-       (MC_CMD_WOL_FILTER_SET_IN_DATA_OFST + 34)
-
-#define MC_CMD_WOL_FILTER_SET_IN_BITMAP_MASK_OFST      \
-       MC_CMD_WOL_FILTER_SET_IN_DATA_OFST
-#define MC_CMD_WOL_FILTER_SET_IN_BITMAP_OFST           \
-       (MC_CMD_WOL_FILTER_SET_IN_DATA_OFST + 48)
-#define MC_CMD_WOL_FILTER_SET_IN_BITMAP_LEN_OFST       \
-       (MC_CMD_WOL_FILTER_SET_IN_DATA_OFST + 176)
-#define MC_CMD_WOL_FILTER_SET_IN_BITMAP_LAYER3_OFST    \
-       (MC_CMD_WOL_FILTER_SET_IN_DATA_OFST + 177)
-#define MC_CMD_WOL_FILTER_SET_IN_BITMAP_LAYER4_OFST    \
-       (MC_CMD_WOL_FILTER_SET_IN_DATA_OFST + 178)
-
-#define MC_CMD_WOL_FILTER_SET_IN_LINK_MASK_OFST        \
-       MC_CMD_WOL_FILTER_SET_IN_DATA_OFST
-#define MC_CMD_WOL_FILTER_SET_IN_LINK_UP_LBN   0
-#define MC_CMD_WOL_FILTER_SET_IN_LINK_UP_WIDTH 1
-#define MC_CMD_WOL_FILTER_SET_IN_LINK_DOWN_LBN 1
-#define MC_CMD_WOL_FILTER_SET_IN_LINK_DOWN_WIDTH 1
-
-#define MC_CMD_WOL_FILTER_SET_OUT_LEN 4
-#define MC_CMD_WOL_FILTER_SET_OUT_FILTER_ID_OFST 0
-
-/* WOL Filter types enumeration */
-#define MC_CMD_WOL_TYPE_MAGIC      0x0
-                        /* unused 0x1 */
-#define MC_CMD_WOL_TYPE_WIN_MAGIC  0x2
-#define MC_CMD_WOL_TYPE_IPV4_SYN   0x3
-#define MC_CMD_WOL_TYPE_IPV6_SYN   0x4
-#define MC_CMD_WOL_TYPE_BITMAP     0x5
-#define MC_CMD_WOL_TYPE_LINK       0x6
-#define MC_CMD_WOL_TYPE_MAX        0x7
-
-#define MC_CMD_FILTER_MODE_SIMPLE     0x0
-#define MC_CMD_FILTER_MODE_STRUCTURED 0xffffffff
-
-/* MC_CMD_WOL_FILTER_REMOVE:
- * Remove a WoL filter
- *
- * Locks required: None
- * Returns: 0, EINVAL, ENOSYS
+
+/* MC_CMD_WOL_FILTER_SET_IN msgrequest */
+#define    MC_CMD_WOL_FILTER_SET_IN_LEN 192
+#define       MC_CMD_WOL_FILTER_SET_IN_FILTER_MODE_OFST 0
+#define          MC_CMD_FILTER_MODE_SIMPLE    0x0 /* enum */
+#define          MC_CMD_FILTER_MODE_STRUCTURED 0xffffffff /* enum */
+#define       MC_CMD_WOL_FILTER_SET_IN_WOL_TYPE_OFST 4
+#define          MC_CMD_WOL_TYPE_MAGIC      0x0 /* enum */
+#define          MC_CMD_WOL_TYPE_WIN_MAGIC 0x2 /* enum */
+#define          MC_CMD_WOL_TYPE_IPV4_SYN   0x3 /* enum */
+#define          MC_CMD_WOL_TYPE_IPV6_SYN   0x4 /* enum */
+#define          MC_CMD_WOL_TYPE_BITMAP     0x5 /* enum */
+#define          MC_CMD_WOL_TYPE_LINK       0x6 /* enum */
+#define          MC_CMD_WOL_TYPE_MAX        0x7 /* enum */
+#define       MC_CMD_WOL_FILTER_SET_IN_DATA_OFST 8
+#define       MC_CMD_WOL_FILTER_SET_IN_DATA_LEN 4
+#define       MC_CMD_WOL_FILTER_SET_IN_DATA_NUM 46
+
+/* MC_CMD_WOL_FILTER_SET_IN_MAGIC msgrequest */
+#define    MC_CMD_WOL_FILTER_SET_IN_MAGIC_LEN 16
+/*            MC_CMD_WOL_FILTER_SET_IN_FILTER_MODE_OFST 0 */
+/*            MC_CMD_WOL_FILTER_SET_IN_WOL_TYPE_OFST 4 */
+#define       MC_CMD_WOL_FILTER_SET_IN_MAGIC_MAC_OFST 8
+#define       MC_CMD_WOL_FILTER_SET_IN_MAGIC_MAC_LEN 8
+#define       MC_CMD_WOL_FILTER_SET_IN_MAGIC_MAC_LO_OFST 8
+#define       MC_CMD_WOL_FILTER_SET_IN_MAGIC_MAC_HI_OFST 12
+
+/* MC_CMD_WOL_FILTER_SET_IN_IPV4_SYN msgrequest */
+#define    MC_CMD_WOL_FILTER_SET_IN_IPV4_SYN_LEN 20
+/*            MC_CMD_WOL_FILTER_SET_IN_FILTER_MODE_OFST 0 */
+/*            MC_CMD_WOL_FILTER_SET_IN_WOL_TYPE_OFST 4 */
+#define       MC_CMD_WOL_FILTER_SET_IN_IPV4_SYN_SRC_IP_OFST 8
+#define       MC_CMD_WOL_FILTER_SET_IN_IPV4_SYN_DST_IP_OFST 12
+#define       MC_CMD_WOL_FILTER_SET_IN_IPV4_SYN_SRC_PORT_OFST 16
+#define       MC_CMD_WOL_FILTER_SET_IN_IPV4_SYN_SRC_PORT_LEN 2
+#define       MC_CMD_WOL_FILTER_SET_IN_IPV4_SYN_DST_PORT_OFST 18
+#define       MC_CMD_WOL_FILTER_SET_IN_IPV4_SYN_DST_PORT_LEN 2
+
+/* MC_CMD_WOL_FILTER_SET_IN_IPV6_SYN msgrequest */
+#define    MC_CMD_WOL_FILTER_SET_IN_IPV6_SYN_LEN 44
+/*            MC_CMD_WOL_FILTER_SET_IN_FILTER_MODE_OFST 0 */
+/*            MC_CMD_WOL_FILTER_SET_IN_WOL_TYPE_OFST 4 */
+#define       MC_CMD_WOL_FILTER_SET_IN_IPV6_SYN_SRC_IP_OFST 8
+#define       MC_CMD_WOL_FILTER_SET_IN_IPV6_SYN_SRC_IP_LEN 16
+#define       MC_CMD_WOL_FILTER_SET_IN_IPV6_SYN_DST_IP_OFST 24
+#define       MC_CMD_WOL_FILTER_SET_IN_IPV6_SYN_DST_IP_LEN 16
+#define       MC_CMD_WOL_FILTER_SET_IN_IPV6_SYN_SRC_PORT_OFST 40
+#define       MC_CMD_WOL_FILTER_SET_IN_IPV6_SYN_SRC_PORT_LEN 2
+#define       MC_CMD_WOL_FILTER_SET_IN_IPV6_SYN_DST_PORT_OFST 42
+#define       MC_CMD_WOL_FILTER_SET_IN_IPV6_SYN_DST_PORT_LEN 2
+
+/* MC_CMD_WOL_FILTER_SET_IN_BITMAP msgrequest */
+#define    MC_CMD_WOL_FILTER_SET_IN_BITMAP_LEN 187
+/*            MC_CMD_WOL_FILTER_SET_IN_FILTER_MODE_OFST 0 */
+/*            MC_CMD_WOL_FILTER_SET_IN_WOL_TYPE_OFST 4 */
+#define       MC_CMD_WOL_FILTER_SET_IN_BITMAP_MASK_OFST 8
+#define       MC_CMD_WOL_FILTER_SET_IN_BITMAP_MASK_LEN 48
+#define       MC_CMD_WOL_FILTER_SET_IN_BITMAP_BITMAP_OFST 56
+#define       MC_CMD_WOL_FILTER_SET_IN_BITMAP_BITMAP_LEN 128
+#define       MC_CMD_WOL_FILTER_SET_IN_BITMAP_LEN_OFST 184
+#define       MC_CMD_WOL_FILTER_SET_IN_BITMAP_LEN_LEN 1
+#define       MC_CMD_WOL_FILTER_SET_IN_BITMAP_LAYER3_OFST 185
+#define       MC_CMD_WOL_FILTER_SET_IN_BITMAP_LAYER3_LEN 1
+#define       MC_CMD_WOL_FILTER_SET_IN_BITMAP_LAYER4_OFST 186
+#define       MC_CMD_WOL_FILTER_SET_IN_BITMAP_LAYER4_LEN 1
+
+/* MC_CMD_WOL_FILTER_SET_IN_LINK msgrequest */
+#define    MC_CMD_WOL_FILTER_SET_IN_LINK_LEN 12
+/*            MC_CMD_WOL_FILTER_SET_IN_FILTER_MODE_OFST 0 */
+/*            MC_CMD_WOL_FILTER_SET_IN_WOL_TYPE_OFST 4 */
+#define       MC_CMD_WOL_FILTER_SET_IN_LINK_MASK_OFST 8
+#define        MC_CMD_WOL_FILTER_SET_IN_LINK_UP_LBN 0
+#define        MC_CMD_WOL_FILTER_SET_IN_LINK_UP_WIDTH 1
+#define        MC_CMD_WOL_FILTER_SET_IN_LINK_DOWN_LBN 1
+#define        MC_CMD_WOL_FILTER_SET_IN_LINK_DOWN_WIDTH 1
+
+/* MC_CMD_WOL_FILTER_SET_OUT msgresponse */
+#define    MC_CMD_WOL_FILTER_SET_OUT_LEN 4
+#define       MC_CMD_WOL_FILTER_SET_OUT_FILTER_ID_OFST 0
+
+
+/***********************************/
+/* MC_CMD_WOL_FILTER_REMOVE
+ * Remove a WoL filter.
  */
 #define MC_CMD_WOL_FILTER_REMOVE 0x33
-#define MC_CMD_WOL_FILTER_REMOVE_IN_LEN 4
-#define MC_CMD_WOL_FILTER_REMOVE_IN_FILTER_ID_OFST 0
-#define MC_CMD_WOL_FILTER_REMOVE_OUT_LEN 0
 
+/* MC_CMD_WOL_FILTER_REMOVE_IN msgrequest */
+#define    MC_CMD_WOL_FILTER_REMOVE_IN_LEN 4
+#define       MC_CMD_WOL_FILTER_REMOVE_IN_FILTER_ID_OFST 0
 
-/* MC_CMD_WOL_FILTER_RESET:
- * Reset (i.e. remove all) WoL filters
- *
- * Locks required: None
- * Returns: 0, ENOSYS
+/* MC_CMD_WOL_FILTER_REMOVE_OUT msgresponse */
+#define    MC_CMD_WOL_FILTER_REMOVE_OUT_LEN 0
+
+
+/***********************************/
+/* MC_CMD_WOL_FILTER_RESET
+ * Reset (i.e. remove all) WoL filters.
  */
 #define MC_CMD_WOL_FILTER_RESET 0x34
-#define MC_CMD_WOL_FILTER_RESET_IN_LEN 0
-#define MC_CMD_WOL_FILTER_RESET_OUT_LEN 0
 
-/* MC_CMD_SET_MCAST_HASH:
- * Set the MCASH hash value without otherwise
- * reconfiguring the MAC
+/* MC_CMD_WOL_FILTER_RESET_IN msgrequest */
+#define    MC_CMD_WOL_FILTER_RESET_IN_LEN 4
+#define       MC_CMD_WOL_FILTER_RESET_IN_MASK_OFST 0
+#define          MC_CMD_WOL_FILTER_RESET_IN_WAKE_FILTERS 0x1 /* enum */
+#define          MC_CMD_WOL_FILTER_RESET_IN_LIGHTSOUT_OFFLOADS 0x2 /* enum */
+
+/* MC_CMD_WOL_FILTER_RESET_OUT msgresponse */
+#define    MC_CMD_WOL_FILTER_RESET_OUT_LEN 0
+
+
+/***********************************/
+/* MC_CMD_SET_MCAST_HASH
+ * Set the MCASH hash value.
  */
 #define MC_CMD_SET_MCAST_HASH 0x35
-#define MC_CMD_SET_MCAST_HASH_IN_LEN 32
-#define MC_CMD_SET_MCAST_HASH_IN_HASH0_OFST 0
-#define MC_CMD_SET_MCAST_HASH_IN_HASH1_OFST 16
-#define MC_CMD_SET_MCAST_HASH_OUT_LEN 0
 
-/* MC_CMD_NVRAM_TYPES:
- * Return bitfield indicating available types of virtual NVRAM partitions
- *
- * Locks required: none
- * Returns: 0
+/* MC_CMD_SET_MCAST_HASH_IN msgrequest */
+#define    MC_CMD_SET_MCAST_HASH_IN_LEN 32
+#define       MC_CMD_SET_MCAST_HASH_IN_HASH0_OFST 0
+#define       MC_CMD_SET_MCAST_HASH_IN_HASH0_LEN 16
+#define       MC_CMD_SET_MCAST_HASH_IN_HASH1_OFST 16
+#define       MC_CMD_SET_MCAST_HASH_IN_HASH1_LEN 16
+
+/* MC_CMD_SET_MCAST_HASH_OUT msgresponse */
+#define    MC_CMD_SET_MCAST_HASH_OUT_LEN 0
+
+
+/***********************************/
+/* MC_CMD_NVRAM_TYPES
+ * Get virtual NVRAM partitions information.
  */
 #define MC_CMD_NVRAM_TYPES 0x36
-#define MC_CMD_NVRAM_TYPES_IN_LEN 0
-#define MC_CMD_NVRAM_TYPES_OUT_LEN 4
-#define MC_CMD_NVRAM_TYPES_OUT_TYPES_OFST 0
-
-/* Supported NVRAM types */
-#define MC_CMD_NVRAM_TYPE_DISABLED_CALLISTO 0
-#define MC_CMD_NVRAM_TYPE_MC_FW 1
-#define MC_CMD_NVRAM_TYPE_MC_FW_BACKUP 2
-#define MC_CMD_NVRAM_TYPE_STATIC_CFG_PORT0 3
-#define MC_CMD_NVRAM_TYPE_STATIC_CFG_PORT1 4
-#define MC_CMD_NVRAM_TYPE_DYNAMIC_CFG_PORT0 5
-#define MC_CMD_NVRAM_TYPE_DYNAMIC_CFG_PORT1 6
-#define MC_CMD_NVRAM_TYPE_EXP_ROM 7
-#define MC_CMD_NVRAM_TYPE_EXP_ROM_CFG_PORT0 8
-#define MC_CMD_NVRAM_TYPE_EXP_ROM_CFG_PORT1 9
-#define MC_CMD_NVRAM_TYPE_PHY_PORT0 10
-#define MC_CMD_NVRAM_TYPE_PHY_PORT1 11
-#define MC_CMD_NVRAM_TYPE_LOG 12
-
-/* MC_CMD_NVRAM_INFO:
- * Read info about a virtual NVRAM partition
- *
- * Locks required: none
- * Returns: 0, EINVAL (bad type)
+
+/* MC_CMD_NVRAM_TYPES_IN msgrequest */
+#define    MC_CMD_NVRAM_TYPES_IN_LEN 0
+
+/* MC_CMD_NVRAM_TYPES_OUT msgresponse */
+#define    MC_CMD_NVRAM_TYPES_OUT_LEN 4
+#define       MC_CMD_NVRAM_TYPES_OUT_TYPES_OFST 0
+#define          MC_CMD_NVRAM_TYPE_DISABLED_CALLISTO 0x0 /* enum */
+#define          MC_CMD_NVRAM_TYPE_MC_FW 0x1 /* enum */
+#define          MC_CMD_NVRAM_TYPE_MC_FW_BACKUP 0x2 /* enum */
+#define          MC_CMD_NVRAM_TYPE_STATIC_CFG_PORT0 0x3 /* enum */
+#define          MC_CMD_NVRAM_TYPE_STATIC_CFG_PORT1 0x4 /* enum */
+#define          MC_CMD_NVRAM_TYPE_DYNAMIC_CFG_PORT0 0x5 /* enum */
+#define          MC_CMD_NVRAM_TYPE_DYNAMIC_CFG_PORT1 0x6 /* enum */
+#define          MC_CMD_NVRAM_TYPE_EXP_ROM 0x7 /* enum */
+#define          MC_CMD_NVRAM_TYPE_EXP_ROM_CFG_PORT0 0x8 /* enum */
+#define          MC_CMD_NVRAM_TYPE_EXP_ROM_CFG_PORT1 0x9 /* enum */
+#define          MC_CMD_NVRAM_TYPE_PHY_PORT0 0xa /* enum */
+#define          MC_CMD_NVRAM_TYPE_PHY_PORT1 0xb /* enum */
+#define          MC_CMD_NVRAM_TYPE_LOG 0xc /* enum */
+#define          MC_CMD_NVRAM_TYPE_FPGA 0xd /* enum */
+
+
+/***********************************/
+/* MC_CMD_NVRAM_INFO
+ * Read info about a virtual NVRAM partition.
  */
 #define MC_CMD_NVRAM_INFO 0x37
-#define MC_CMD_NVRAM_INFO_IN_LEN 4
-#define MC_CMD_NVRAM_INFO_IN_TYPE_OFST 0
-#define MC_CMD_NVRAM_INFO_OUT_LEN 24
-#define MC_CMD_NVRAM_INFO_OUT_TYPE_OFST 0
-#define MC_CMD_NVRAM_INFO_OUT_SIZE_OFST 4
-#define MC_CMD_NVRAM_INFO_OUT_ERASESIZE_OFST 8
-#define MC_CMD_NVRAM_INFO_OUT_FLAGS_OFST 12
-#define   MC_CMD_NVRAM_PROTECTED_LBN 0
-#define   MC_CMD_NVRAM_PROTECTED_WIDTH 1
-#define MC_CMD_NVRAM_INFO_OUT_PHYSDEV_OFST 16
-#define MC_CMD_NVRAM_INFO_OUT_PHYSADDR_OFST 20
-
-/* MC_CMD_NVRAM_UPDATE_START:
- * Start a group of update operations on a virtual NVRAM partition
- *
- * Locks required: PHY_LOCK if type==*PHY*
- * Returns: 0, EINVAL (bad type), EACCES (if PHY_LOCK required and not held)
+
+/* MC_CMD_NVRAM_INFO_IN msgrequest */
+#define    MC_CMD_NVRAM_INFO_IN_LEN 4
+#define       MC_CMD_NVRAM_INFO_IN_TYPE_OFST 0
+/*            Enum values, see field(s): */
+/*               MC_CMD_NVRAM_TYPES/MC_CMD_NVRAM_TYPES_OUT/TYPES */
+
+/* MC_CMD_NVRAM_INFO_OUT msgresponse */
+#define    MC_CMD_NVRAM_INFO_OUT_LEN 24
+#define       MC_CMD_NVRAM_INFO_OUT_TYPE_OFST 0
+/*            Enum values, see field(s): */
+/*               MC_CMD_NVRAM_TYPES/MC_CMD_NVRAM_TYPES_OUT/TYPES */
+#define       MC_CMD_NVRAM_INFO_OUT_SIZE_OFST 4
+#define       MC_CMD_NVRAM_INFO_OUT_ERASESIZE_OFST 8
+#define       MC_CMD_NVRAM_INFO_OUT_FLAGS_OFST 12
+#define        MC_CMD_NVRAM_INFO_OUT_PROTECTED_LBN 0
+#define        MC_CMD_NVRAM_INFO_OUT_PROTECTED_WIDTH 1
+#define       MC_CMD_NVRAM_INFO_OUT_PHYSDEV_OFST 16
+#define       MC_CMD_NVRAM_INFO_OUT_PHYSADDR_OFST 20
+
+
+/***********************************/
+/* MC_CMD_NVRAM_UPDATE_START
+ * Start a group of update operations on a virtual NVRAM partition.
  */
 #define MC_CMD_NVRAM_UPDATE_START 0x38
-#define MC_CMD_NVRAM_UPDATE_START_IN_LEN 4
-#define MC_CMD_NVRAM_UPDATE_START_IN_TYPE_OFST 0
-#define MC_CMD_NVRAM_UPDATE_START_OUT_LEN 0
 
-/* MC_CMD_NVRAM_READ:
- * Read data from a virtual NVRAM partition
- *
- * Locks required: PHY_LOCK if type==*PHY*
- * Returns: 0, EINVAL (bad type/offset/length), EACCES (if PHY_LOCK required and not held)
+/* MC_CMD_NVRAM_UPDATE_START_IN msgrequest */
+#define    MC_CMD_NVRAM_UPDATE_START_IN_LEN 4
+#define       MC_CMD_NVRAM_UPDATE_START_IN_TYPE_OFST 0
+/*            Enum values, see field(s): */
+/*               MC_CMD_NVRAM_TYPES/MC_CMD_NVRAM_TYPES_OUT/TYPES */
+
+/* MC_CMD_NVRAM_UPDATE_START_OUT msgresponse */
+#define    MC_CMD_NVRAM_UPDATE_START_OUT_LEN 0
+
+
+/***********************************/
+/* MC_CMD_NVRAM_READ
+ * Read data from a virtual NVRAM partition.
  */
 #define MC_CMD_NVRAM_READ 0x39
-#define MC_CMD_NVRAM_READ_IN_LEN 12
-#define MC_CMD_NVRAM_READ_IN_TYPE_OFST 0
-#define MC_CMD_NVRAM_READ_IN_OFFSET_OFST 4
-#define MC_CMD_NVRAM_READ_IN_LENGTH_OFST 8
-#define MC_CMD_NVRAM_READ_OUT_LEN(_read_bytes) (_read_bytes)
-#define MC_CMD_NVRAM_READ_OUT_READ_BUFFER_OFST 0
-
-/* MC_CMD_NVRAM_WRITE:
- * Write data to a virtual NVRAM partition
- *
- * Locks required: PHY_LOCK if type==*PHY*
- * Returns: 0, EINVAL (bad type/offset/length), EACCES (if PHY_LOCK required and not held)
+
+/* MC_CMD_NVRAM_READ_IN msgrequest */
+#define    MC_CMD_NVRAM_READ_IN_LEN 12
+#define       MC_CMD_NVRAM_READ_IN_TYPE_OFST 0
+/*            Enum values, see field(s): */
+/*               MC_CMD_NVRAM_TYPES/MC_CMD_NVRAM_TYPES_OUT/TYPES */
+#define       MC_CMD_NVRAM_READ_IN_OFFSET_OFST 4
+#define       MC_CMD_NVRAM_READ_IN_LENGTH_OFST 8
+
+/* MC_CMD_NVRAM_READ_OUT msgresponse */
+#define    MC_CMD_NVRAM_READ_OUT_LENMIN 1
+#define    MC_CMD_NVRAM_READ_OUT_LENMAX 255
+#define    MC_CMD_NVRAM_READ_OUT_LEN(num) (0+1*(num))
+#define       MC_CMD_NVRAM_READ_OUT_READ_BUFFER_OFST 0
+#define       MC_CMD_NVRAM_READ_OUT_READ_BUFFER_LEN 1
+#define       MC_CMD_NVRAM_READ_OUT_READ_BUFFER_MINNUM 1
+#define       MC_CMD_NVRAM_READ_OUT_READ_BUFFER_MAXNUM 255
+
+
+/***********************************/
+/* MC_CMD_NVRAM_WRITE
+ * Write data to a virtual NVRAM partition.
  */
 #define MC_CMD_NVRAM_WRITE 0x3a
-#define MC_CMD_NVRAM_WRITE_IN_TYPE_OFST 0
-#define MC_CMD_NVRAM_WRITE_IN_OFFSET_OFST 4
-#define MC_CMD_NVRAM_WRITE_IN_LENGTH_OFST 8
-#define MC_CMD_NVRAM_WRITE_IN_WRITE_BUFFER_OFST 12
-#define MC_CMD_NVRAM_WRITE_IN_LEN(_write_bytes) (12 + _write_bytes)
-#define MC_CMD_NVRAM_WRITE_OUT_LEN 0
-
-/* MC_CMD_NVRAM_ERASE:
- * Erase sector(s) from a virtual NVRAM partition
- *
- * Locks required: PHY_LOCK if type==*PHY*
- * Returns: 0, EINVAL (bad type/offset/length), EACCES (if PHY_LOCK required and not held)
+
+/* MC_CMD_NVRAM_WRITE_IN msgrequest */
+#define    MC_CMD_NVRAM_WRITE_IN_LENMIN 13
+#define    MC_CMD_NVRAM_WRITE_IN_LENMAX 255
+#define    MC_CMD_NVRAM_WRITE_IN_LEN(num) (12+1*(num))
+#define       MC_CMD_NVRAM_WRITE_IN_TYPE_OFST 0
+/*            Enum values, see field(s): */
+/*               MC_CMD_NVRAM_TYPES/MC_CMD_NVRAM_TYPES_OUT/TYPES */
+#define       MC_CMD_NVRAM_WRITE_IN_OFFSET_OFST 4
+#define       MC_CMD_NVRAM_WRITE_IN_LENGTH_OFST 8
+#define       MC_CMD_NVRAM_WRITE_IN_WRITE_BUFFER_OFST 12
+#define       MC_CMD_NVRAM_WRITE_IN_WRITE_BUFFER_LEN 1
+#define       MC_CMD_NVRAM_WRITE_IN_WRITE_BUFFER_MINNUM 1
+#define       MC_CMD_NVRAM_WRITE_IN_WRITE_BUFFER_MAXNUM 243
+
+/* MC_CMD_NVRAM_WRITE_OUT msgresponse */
+#define    MC_CMD_NVRAM_WRITE_OUT_LEN 0
+
+
+/***********************************/
+/* MC_CMD_NVRAM_ERASE
+ * Erase sector(s) from a virtual NVRAM partition.
  */
 #define MC_CMD_NVRAM_ERASE 0x3b
-#define MC_CMD_NVRAM_ERASE_IN_LEN 12
-#define MC_CMD_NVRAM_ERASE_IN_TYPE_OFST 0
-#define MC_CMD_NVRAM_ERASE_IN_OFFSET_OFST 4
-#define MC_CMD_NVRAM_ERASE_IN_LENGTH_OFST 8
-#define MC_CMD_NVRAM_ERASE_OUT_LEN 0
-
-/* MC_CMD_NVRAM_UPDATE_FINISH:
- * Finish a group of update operations on a virtual NVRAM partition
- *
- * Locks required: PHY_LOCK if type==*PHY*
- * Returns: 0, EINVAL (bad type/offset/length), EACCES (if PHY_LOCK required and not held)
+
+/* MC_CMD_NVRAM_ERASE_IN msgrequest */
+#define    MC_CMD_NVRAM_ERASE_IN_LEN 12
+#define       MC_CMD_NVRAM_ERASE_IN_TYPE_OFST 0
+/*            Enum values, see field(s): */
+/*               MC_CMD_NVRAM_TYPES/MC_CMD_NVRAM_TYPES_OUT/TYPES */
+#define       MC_CMD_NVRAM_ERASE_IN_OFFSET_OFST 4
+#define       MC_CMD_NVRAM_ERASE_IN_LENGTH_OFST 8
+
+/* MC_CMD_NVRAM_ERASE_OUT msgresponse */
+#define    MC_CMD_NVRAM_ERASE_OUT_LEN 0
+
+
+/***********************************/
+/* MC_CMD_NVRAM_UPDATE_FINISH
+ * Finish a group of update operations on a virtual NVRAM partition.
  */
 #define MC_CMD_NVRAM_UPDATE_FINISH 0x3c
-#define MC_CMD_NVRAM_UPDATE_FINISH_IN_LEN 8
-#define MC_CMD_NVRAM_UPDATE_FINISH_IN_TYPE_OFST 0
-#define MC_CMD_NVRAM_UPDATE_FINISH_IN_REBOOT_OFST 4
-#define MC_CMD_NVRAM_UPDATE_FINISH_OUT_LEN 0
 
-/* MC_CMD_REBOOT:
+/* MC_CMD_NVRAM_UPDATE_FINISH_IN msgrequest */
+#define    MC_CMD_NVRAM_UPDATE_FINISH_IN_LEN 8
+#define       MC_CMD_NVRAM_UPDATE_FINISH_IN_TYPE_OFST 0
+/*            Enum values, see field(s): */
+/*               MC_CMD_NVRAM_TYPES/MC_CMD_NVRAM_TYPES_OUT/TYPES */
+#define       MC_CMD_NVRAM_UPDATE_FINISH_IN_REBOOT_OFST 4
+
+/* MC_CMD_NVRAM_UPDATE_FINISH_OUT msgresponse */
+#define    MC_CMD_NVRAM_UPDATE_FINISH_OUT_LEN 0
+
+
+/***********************************/
+/* MC_CMD_REBOOT
  * Reboot the MC.
- *
- * The AFTER_ASSERTION flag is intended to be used when the driver notices
- * an assertion failure (at which point it is expected to perform a complete
- * tear down and reinitialise), to allow both ports to reset the MC once
- * in an atomic fashion.
- *
- * Production mc firmwares are generally compiled with REBOOT_ON_ASSERT=1,
- * which means that they will automatically reboot out of the assertion
- * handler, so this is in practise an optional operation. It is still
- * recommended that drivers execute this to support custom firmwares
- * with REBOOT_ON_ASSERT=0.
- *
- * Locks required: NONE
- * Returns: Nothing. You get back a response with ERR=1, DATALEN=0
  */
 #define MC_CMD_REBOOT 0x3d
-#define MC_CMD_REBOOT_IN_LEN 4
-#define MC_CMD_REBOOT_IN_FLAGS_OFST 0
-#define MC_CMD_REBOOT_FLAGS_AFTER_ASSERTION 1
-#define MC_CMD_REBOOT_OUT_LEN 0
 
-/* MC_CMD_SCHEDINFO:
- * Request scheduler info. from the MC.
- *
- * Locks required: NONE
- * Returns: An array of (timeslice,maximum overrun), one for each thread,
- * in ascending order of thread address.s
+/* MC_CMD_REBOOT_IN msgrequest */
+#define    MC_CMD_REBOOT_IN_LEN 4
+#define       MC_CMD_REBOOT_IN_FLAGS_OFST 0
+#define          MC_CMD_REBOOT_FLAGS_AFTER_ASSERTION 0x1 /* enum */
+
+/* MC_CMD_REBOOT_OUT msgresponse */
+#define    MC_CMD_REBOOT_OUT_LEN 0
+
+
+/***********************************/
+/* MC_CMD_SCHEDINFO
+ * Request scheduler info.
  */
 #define MC_CMD_SCHEDINFO 0x3e
-#define MC_CMD_SCHEDINFO_IN_LEN 0
 
+/* MC_CMD_SCHEDINFO_IN msgrequest */
+#define    MC_CMD_SCHEDINFO_IN_LEN 0
 
-/* MC_CMD_SET_REBOOT_MODE: (debug)
- * Set the mode for the next MC reboot.
- *
- * Locks required: NONE
- *
- * Sets the reboot mode to the specified value.  Returns the old mode.
+/* MC_CMD_SCHEDINFO_OUT msgresponse */
+#define    MC_CMD_SCHEDINFO_OUT_LENMIN 4
+#define    MC_CMD_SCHEDINFO_OUT_LENMAX 252
+#define    MC_CMD_SCHEDINFO_OUT_LEN(num) (0+4*(num))
+#define       MC_CMD_SCHEDINFO_OUT_DATA_OFST 0
+#define       MC_CMD_SCHEDINFO_OUT_DATA_LEN 4
+#define       MC_CMD_SCHEDINFO_OUT_DATA_MINNUM 1
+#define       MC_CMD_SCHEDINFO_OUT_DATA_MAXNUM 63
+
+
+/***********************************/
+/* MC_CMD_REBOOT_MODE
  */
 #define MC_CMD_REBOOT_MODE 0x3f
-#define MC_CMD_REBOOT_MODE_IN_LEN 4
-#define MC_CMD_REBOOT_MODE_IN_VALUE_OFST 0
-#define MC_CMD_REBOOT_MODE_OUT_LEN 4
-#define MC_CMD_REBOOT_MODE_OUT_VALUE_OFST 0
-#define   MC_CMD_REBOOT_MODE_NORMAL 0
-#define   MC_CMD_REBOOT_MODE_SNAPPER 3
-
-/* MC_CMD_DEBUG_LOG:
- * Null request/response command (debug)
- * - sequence number is always zero
- * - only supported on the UART interface
- * (the same set of bytes is delivered as an
- * event over PCI)
- */
-#define MC_CMD_DEBUG_LOG 0x40
-#define MC_CMD_DEBUG_LOG_IN_LEN 0
-#define MC_CMD_DEBUG_LOG_OUT_LEN 0
-
-/* Generic sensor enumeration. Note that a dual port NIC
- * will EITHER expose PHY_COMMON_TEMP OR PHY0_TEMP and
- * PHY1_TEMP depending on whether there is a single sensor
- * in the vicinity of the two port, or one per port.
- */
-#define MC_CMD_SENSOR_CONTROLLER_TEMP 0                /* degC */
-#define MC_CMD_SENSOR_PHY_COMMON_TEMP 1                /* degC */
-#define MC_CMD_SENSOR_CONTROLLER_COOLING 2     /* bool */
-#define MC_CMD_SENSOR_PHY0_TEMP 3              /* degC */
-#define MC_CMD_SENSOR_PHY0_COOLING 4           /* bool */
-#define MC_CMD_SENSOR_PHY1_TEMP 5              /* degC */
-#define MC_CMD_SENSOR_PHY1_COOLING 6           /* bool */
-#define MC_CMD_SENSOR_IN_1V0 7                 /* mV */
-#define MC_CMD_SENSOR_IN_1V2 8                 /* mV */
-#define MC_CMD_SENSOR_IN_1V8 9                 /* mV */
-#define MC_CMD_SENSOR_IN_2V5 10                        /* mV */
-#define MC_CMD_SENSOR_IN_3V3 11                        /* mV */
-#define MC_CMD_SENSOR_IN_12V0 12               /* mV */
-
-
-/* Sensor state */
-#define MC_CMD_SENSOR_STATE_OK 0
-#define MC_CMD_SENSOR_STATE_WARNING 1
-#define MC_CMD_SENSOR_STATE_FATAL 2
-#define MC_CMD_SENSOR_STATE_BROKEN 3
-
-/* MC_CMD_SENSOR_INFO:
+
+/* MC_CMD_REBOOT_MODE_IN msgrequest */
+#define    MC_CMD_REBOOT_MODE_IN_LEN 4
+#define       MC_CMD_REBOOT_MODE_IN_VALUE_OFST 0
+#define          MC_CMD_REBOOT_MODE_NORMAL 0x0 /* enum */
+#define          MC_CMD_REBOOT_MODE_SNAPPER 0x3 /* enum */
+
+/* MC_CMD_REBOOT_MODE_OUT msgresponse */
+#define    MC_CMD_REBOOT_MODE_OUT_LEN 4
+#define       MC_CMD_REBOOT_MODE_OUT_VALUE_OFST 0
+
+
+/***********************************/
+/* MC_CMD_SENSOR_INFO
  * Returns information about every available sensor.
- *
- * Each sensor has a single (16bit) value, and a corresponding state.
- * The mapping between value and sensor is nominally determined by the
- * MC, but in practise is implemented as zero (BROKEN), one (TEMPERATURE),
- * or two (VOLTAGE) ranges per sensor per state.
- *
- * This call returns a mask (32bit) of the sensors that are supported
- * by this platform, then an array (indexed by MC_CMD_SENSOR) of byte
- * offsets to the per-sensor arrays. Each sensor array has four 16bit
- * numbers, min1, max1, min2, max2.
- *
- * Locks required: None
- * Returns: 0
  */
 #define MC_CMD_SENSOR_INFO 0x41
-#define MC_CMD_SENSOR_INFO_IN_LEN 0
-#define MC_CMD_SENSOR_INFO_OUT_MASK_OFST 0
-#define MC_CMD_SENSOR_INFO_OUT_OFFSET_OFST(_x) \
-       (4 + (_x))
-#define MC_CMD_SENSOR_INFO_OUT_MIN1_OFST(_ofst) \
-       ((_ofst) + 0)
-#define MC_CMD_SENSOR_INFO_OUT_MAX1_OFST(_ofst) \
-       ((_ofst) + 2)
-#define MC_CMD_SENSOR_INFO_OUT_MIN2_OFST(_ofst) \
-       ((_ofst) + 4)
-#define MC_CMD_SENSOR_INFO_OUT_MAX2_OFST(_ofst) \
-       ((_ofst) + 6)
 
+/* MC_CMD_SENSOR_INFO_IN msgrequest */
+#define    MC_CMD_SENSOR_INFO_IN_LEN 0
+
+/* MC_CMD_SENSOR_INFO_OUT msgresponse */
+#define    MC_CMD_SENSOR_INFO_OUT_LENMIN 12
+#define    MC_CMD_SENSOR_INFO_OUT_LENMAX 252
+#define    MC_CMD_SENSOR_INFO_OUT_LEN(num) (4+8*(num))
+#define       MC_CMD_SENSOR_INFO_OUT_MASK_OFST 0
+#define          MC_CMD_SENSOR_CONTROLLER_TEMP  0x0 /* enum */
+#define          MC_CMD_SENSOR_PHY_COMMON_TEMP  0x1 /* enum */
+#define          MC_CMD_SENSOR_CONTROLLER_COOLING  0x2 /* enum */
+#define          MC_CMD_SENSOR_PHY0_TEMP  0x3 /* enum */
+#define          MC_CMD_SENSOR_PHY0_COOLING  0x4 /* enum */
+#define          MC_CMD_SENSOR_PHY1_TEMP  0x5 /* enum */
+#define          MC_CMD_SENSOR_PHY1_COOLING  0x6 /* enum */
+#define          MC_CMD_SENSOR_IN_1V0  0x7 /* enum */
+#define          MC_CMD_SENSOR_IN_1V2  0x8 /* enum */
+#define          MC_CMD_SENSOR_IN_1V8  0x9 /* enum */
+#define          MC_CMD_SENSOR_IN_2V5  0xa /* enum */
+#define          MC_CMD_SENSOR_IN_3V3  0xb /* enum */
+#define          MC_CMD_SENSOR_IN_12V0  0xc /* enum */
+#define          MC_CMD_SENSOR_IN_1V2A  0xd /* enum */
+#define          MC_CMD_SENSOR_IN_VREF  0xe /* enum */
+#define       MC_CMD_SENSOR_ENTRY_OFST 4
+#define       MC_CMD_SENSOR_ENTRY_LEN 8
+#define       MC_CMD_SENSOR_ENTRY_LO_OFST 4
+#define       MC_CMD_SENSOR_ENTRY_HI_OFST 8
+#define       MC_CMD_SENSOR_ENTRY_MINNUM 1
+#define       MC_CMD_SENSOR_ENTRY_MAXNUM 31
+
+/* MC_CMD_SENSOR_INFO_ENTRY_TYPEDEF structuredef */
+#define    MC_CMD_SENSOR_INFO_ENTRY_TYPEDEF_LEN 8
+#define       MC_CMD_SENSOR_INFO_ENTRY_TYPEDEF_MIN1_OFST 0
+#define       MC_CMD_SENSOR_INFO_ENTRY_TYPEDEF_MIN1_LEN 2
+#define       MC_CMD_SENSOR_INFO_ENTRY_TYPEDEF_MIN1_LBN 0
+#define       MC_CMD_SENSOR_INFO_ENTRY_TYPEDEF_MIN1_WIDTH 16
+#define       MC_CMD_SENSOR_INFO_ENTRY_TYPEDEF_MAX1_OFST 2
+#define       MC_CMD_SENSOR_INFO_ENTRY_TYPEDEF_MAX1_LEN 2
+#define       MC_CMD_SENSOR_INFO_ENTRY_TYPEDEF_MAX1_LBN 16
+#define       MC_CMD_SENSOR_INFO_ENTRY_TYPEDEF_MAX1_WIDTH 16
+#define       MC_CMD_SENSOR_INFO_ENTRY_TYPEDEF_MIN2_OFST 4
+#define       MC_CMD_SENSOR_INFO_ENTRY_TYPEDEF_MIN2_LEN 2
+#define       MC_CMD_SENSOR_INFO_ENTRY_TYPEDEF_MIN2_LBN 32
+#define       MC_CMD_SENSOR_INFO_ENTRY_TYPEDEF_MIN2_WIDTH 16
+#define       MC_CMD_SENSOR_INFO_ENTRY_TYPEDEF_MAX2_OFST 6
+#define       MC_CMD_SENSOR_INFO_ENTRY_TYPEDEF_MAX2_LEN 2
+#define       MC_CMD_SENSOR_INFO_ENTRY_TYPEDEF_MAX2_LBN 48
+#define       MC_CMD_SENSOR_INFO_ENTRY_TYPEDEF_MAX2_WIDTH 16
+
+
+/***********************************/
 /* MC_CMD_READ_SENSORS
- * Returns the current reading from each sensor
- *
- * Returns a sparse array of sensor readings (indexed by the sensor
- * type) into host memory.  Each array element is a dword.
- *
- * The MC will send a SENSOREVT event every time any sensor changes state. The
- * driver is responsible for ensuring that it doesn't miss any events. The board
- * will function normally if all sensors are in STATE_OK or state_WARNING.
- * Otherwise the board should not be expected to function.
+ * Returns the current reading from each sensor.
  */
 #define MC_CMD_READ_SENSORS 0x42
-#define MC_CMD_READ_SENSORS_IN_LEN 8
-#define MC_CMD_READ_SENSORS_IN_DMA_ADDR_LO_OFST 0
-#define MC_CMD_READ_SENSORS_IN_DMA_ADDR_HI_OFST 4
-#define MC_CMD_READ_SENSORS_OUT_LEN 0
 
-/* Sensor reading fields */
-#define MC_CMD_READ_SENSOR_VALUE_LBN 0
-#define MC_CMD_READ_SENSOR_VALUE_WIDTH 16
-#define MC_CMD_READ_SENSOR_STATE_LBN 16
-#define MC_CMD_READ_SENSOR_STATE_WIDTH 8
-
-
-/* MC_CMD_GET_PHY_STATE:
- * Report current state of PHY.  A "zombie" PHY is a PHY that has failed to
- * boot (e.g. due to missing or corrupted firmware).
- *
- * Locks required: None
- * Return code: 0
+/* MC_CMD_READ_SENSORS_IN msgrequest */
+#define    MC_CMD_READ_SENSORS_IN_LEN 8
+#define       MC_CMD_READ_SENSORS_IN_DMA_ADDR_OFST 0
+#define       MC_CMD_READ_SENSORS_IN_DMA_ADDR_LEN 8
+#define       MC_CMD_READ_SENSORS_IN_DMA_ADDR_LO_OFST 0
+#define       MC_CMD_READ_SENSORS_IN_DMA_ADDR_HI_OFST 4
+
+/* MC_CMD_READ_SENSORS_OUT msgresponse */
+#define    MC_CMD_READ_SENSORS_OUT_LEN 0
+
+/* MC_CMD_SENSOR_VALUE_ENTRY_TYPEDEF structuredef */
+#define    MC_CMD_SENSOR_VALUE_ENTRY_TYPEDEF_LEN 3
+#define       MC_CMD_SENSOR_VALUE_ENTRY_TYPEDEF_VALUE_OFST 0
+#define       MC_CMD_SENSOR_VALUE_ENTRY_TYPEDEF_VALUE_LEN 2
+#define       MC_CMD_SENSOR_VALUE_ENTRY_TYPEDEF_VALUE_LBN 0
+#define       MC_CMD_SENSOR_VALUE_ENTRY_TYPEDEF_VALUE_WIDTH 16
+#define       MC_CMD_SENSOR_VALUE_ENTRY_TYPEDEF_STATE_OFST 2
+#define       MC_CMD_SENSOR_VALUE_ENTRY_TYPEDEF_STATE_LEN 1
+#define          MC_CMD_SENSOR_STATE_OK  0x0 /* enum */
+#define          MC_CMD_SENSOR_STATE_WARNING  0x1 /* enum */
+#define          MC_CMD_SENSOR_STATE_FATAL  0x2 /* enum */
+#define          MC_CMD_SENSOR_STATE_BROKEN  0x3 /* enum */
+#define       MC_CMD_SENSOR_VALUE_ENTRY_TYPEDEF_STATE_LBN 16
+#define       MC_CMD_SENSOR_VALUE_ENTRY_TYPEDEF_STATE_WIDTH 8
+
+
+/***********************************/
+/* MC_CMD_GET_PHY_STATE
+ * Report current state of PHY.
  */
 #define MC_CMD_GET_PHY_STATE 0x43
 
-#define MC_CMD_GET_PHY_STATE_IN_LEN 0
-#define MC_CMD_GET_PHY_STATE_OUT_LEN 4
-#define MC_CMD_GET_PHY_STATE_STATE_OFST 0
-/* PHY state enumeration: */
-#define MC_CMD_PHY_STATE_OK 1
-#define MC_CMD_PHY_STATE_ZOMBIE 2
+/* MC_CMD_GET_PHY_STATE_IN msgrequest */
+#define    MC_CMD_GET_PHY_STATE_IN_LEN 0
 
+/* MC_CMD_GET_PHY_STATE_OUT msgresponse */
+#define    MC_CMD_GET_PHY_STATE_OUT_LEN 4
+#define       MC_CMD_GET_PHY_STATE_OUT_STATE_OFST 0
+#define          MC_CMD_PHY_STATE_OK 0x1 /* enum */
+#define          MC_CMD_PHY_STATE_ZOMBIE 0x2 /* enum */
 
-/* 802.1Qbb control. 8 Tx queues that map to priorities 0 - 7. Use all 1s to
- * disable 802.Qbb for a given priority. */
+
+/***********************************/
+/* MC_CMD_SETUP_8021QBB
+ * 802.1Qbb control.
+ */
 #define MC_CMD_SETUP_8021QBB 0x44
-#define MC_CMD_SETUP_8021QBB_IN_LEN 32
-#define MC_CMD_SETUP_8021QBB_OUT_LEN 0
-#define MC_CMD_SETUP_8021QBB_IN_TXQS_OFFST 0
 
+/* MC_CMD_SETUP_8021QBB_IN msgrequest */
+#define    MC_CMD_SETUP_8021QBB_IN_LEN 32
+#define       MC_CMD_SETUP_8021QBB_IN_TXQS_OFST 0
+#define       MC_CMD_SETUP_8021QBB_IN_TXQS_LEN 32
 
-/* MC_CMD_WOL_FILTER_GET:
- * Retrieve ID of any WoL filters
- *
- * Locks required: None
- * Returns: 0, ENOSYS
- */
-#define MC_CMD_WOL_FILTER_GET 0x45
-#define MC_CMD_WOL_FILTER_GET_IN_LEN 0
-#define MC_CMD_WOL_FILTER_GET_OUT_LEN 4
-#define MC_CMD_WOL_FILTER_GET_OUT_FILTER_ID_OFST 0
+/* MC_CMD_SETUP_8021QBB_OUT msgresponse */
+#define    MC_CMD_SETUP_8021QBB_OUT_LEN 0
 
 
-/* MC_CMD_ADD_LIGHTSOUT_OFFLOAD:
- * Offload a protocol to NIC for lights-out state
- *
- * Locks required: None
- * Returns: 0, ENOSYS
+/***********************************/
+/* MC_CMD_WOL_FILTER_GET
+ * Retrieve ID of any WoL filters.
  */
-#define MC_CMD_ADD_LIGHTSOUT_OFFLOAD 0x46
+#define MC_CMD_WOL_FILTER_GET 0x45
 
-#define MC_CMD_ADD_LIGHTSOUT_OFFLOAD_IN_LEN 16
-#define MC_CMD_ADD_LIGHTSOUT_OFFLOAD_IN_PROTOCOL_OFST 0
+/* MC_CMD_WOL_FILTER_GET_IN msgrequest */
+#define    MC_CMD_WOL_FILTER_GET_IN_LEN 0
 
-/* There is a union at offset 4, following defines overlap due to
- * this */
-#define MC_CMD_ADD_LIGHTSOUT_OFFLOAD_IN_DATA_OFST 4
-#define MC_CMD_ADD_LIGHTSOUT_OFFLOAD_IN_ARPMAC_OFST 4
-#define MC_CMD_ADD_LIGHTSOUT_OFFLOAD_IN_ARPIP_OFST 10
-#define MC_CMD_ADD_LIGHTSOUT_OFFLOAD_IN_NSMAC_OFST 4
-#define MC_CMD_ADD_LIGHTSOUT_OFFLOAD_IN_NSSNIPV6_OFST 10
-#define MC_CMD_ADD_LIGHTSOUT_OFFLOAD_IN_NSIPV6_OFST 26
+/* MC_CMD_WOL_FILTER_GET_OUT msgresponse */
+#define    MC_CMD_WOL_FILTER_GET_OUT_LEN 4
+#define       MC_CMD_WOL_FILTER_GET_OUT_FILTER_ID_OFST 0
 
-#define MC_CMD_ADD_LIGHTSOUT_OFFLOAD_OUT_LEN 4
-#define MC_CMD_ADD_LIGHTSOUT_OFFLOAD_OUT_FILTER_ID_OFST 0
 
+/***********************************/
+/* MC_CMD_ADD_LIGHTSOUT_OFFLOAD
+ * Add a protocol offload to NIC for lights-out state.
+ */
+#define MC_CMD_ADD_LIGHTSOUT_OFFLOAD 0x46
 
-/* MC_CMD_REMOVE_LIGHTSOUT_PROTOCOL_OFFLOAD:
- * Offload a protocol to NIC for lights-out state
- *
- * Locks required: None
- * Returns: 0, ENOSYS
+/* MC_CMD_ADD_LIGHTSOUT_OFFLOAD_IN msgrequest */
+#define    MC_CMD_ADD_LIGHTSOUT_OFFLOAD_IN_LENMIN 8
+#define    MC_CMD_ADD_LIGHTSOUT_OFFLOAD_IN_LENMAX 252
+#define    MC_CMD_ADD_LIGHTSOUT_OFFLOAD_IN_LEN(num) (4+4*(num))
+#define       MC_CMD_ADD_LIGHTSOUT_OFFLOAD_IN_PROTOCOL_OFST 0
+#define          MC_CMD_LIGHTSOUT_OFFLOAD_PROTOCOL_ARP 0x1 /* enum */
+#define          MC_CMD_LIGHTSOUT_OFFLOAD_PROTOCOL_NS  0x2 /* enum */
+#define       MC_CMD_ADD_LIGHTSOUT_OFFLOAD_IN_DATA_OFST 4
+#define       MC_CMD_ADD_LIGHTSOUT_OFFLOAD_IN_DATA_LEN 4
+#define       MC_CMD_ADD_LIGHTSOUT_OFFLOAD_IN_DATA_MINNUM 1
+#define       MC_CMD_ADD_LIGHTSOUT_OFFLOAD_IN_DATA_MAXNUM 62
+
+/* MC_CMD_ADD_LIGHTSOUT_OFFLOAD_IN_ARP msgrequest */
+#define    MC_CMD_ADD_LIGHTSOUT_OFFLOAD_IN_ARP_LEN 14
+/*            MC_CMD_ADD_LIGHTSOUT_OFFLOAD_IN_PROTOCOL_OFST 0 */
+#define       MC_CMD_ADD_LIGHTSOUT_OFFLOAD_IN_ARP_MAC_OFST 4
+#define       MC_CMD_ADD_LIGHTSOUT_OFFLOAD_IN_ARP_MAC_LEN 6
+#define       MC_CMD_ADD_LIGHTSOUT_OFFLOAD_IN_ARP_IP_OFST 10
+
+/* MC_CMD_ADD_LIGHTSOUT_OFFLOAD_IN_NS msgrequest */
+#define    MC_CMD_ADD_LIGHTSOUT_OFFLOAD_IN_NS_LEN 42
+/*            MC_CMD_ADD_LIGHTSOUT_OFFLOAD_IN_PROTOCOL_OFST 0 */
+#define       MC_CMD_ADD_LIGHTSOUT_OFFLOAD_IN_NS_MAC_OFST 4
+#define       MC_CMD_ADD_LIGHTSOUT_OFFLOAD_IN_NS_MAC_LEN 6
+#define       MC_CMD_ADD_LIGHTSOUT_OFFLOAD_IN_NS_SNIPV6_OFST 10
+#define       MC_CMD_ADD_LIGHTSOUT_OFFLOAD_IN_NS_SNIPV6_LEN 16
+#define       MC_CMD_ADD_LIGHTSOUT_OFFLOAD_IN_NS_IPV6_OFST 26
+#define       MC_CMD_ADD_LIGHTSOUT_OFFLOAD_IN_NS_IPV6_LEN 16
+
+/* MC_CMD_ADD_LIGHTSOUT_OFFLOAD_OUT msgresponse */
+#define    MC_CMD_ADD_LIGHTSOUT_OFFLOAD_OUT_LEN 4
+#define       MC_CMD_ADD_LIGHTSOUT_OFFLOAD_OUT_FILTER_ID_OFST 0
+
+
+/***********************************/
+/* MC_CMD_REMOVE_LIGHTSOUT_OFFLOAD
+ * Remove a protocol offload from NIC for lights-out state.
  */
 #define MC_CMD_REMOVE_LIGHTSOUT_OFFLOAD 0x47
-#define MC_CMD_REMOVE_LIGHTSOUT_OFFLOAD_IN_LEN 8
-#define MC_CMD_REMOVE_LIGHTSOUT_OFFLOAD_OUT_LEN 0
 
-#define MC_CMD_REMOVE_LIGHTSOUT_OFFLOAD_IN_PROTOCOL_OFST 0
-#define MC_CMD_REMOVE_LIGHTSOUT_OFFLOAD_IN_FILTER_ID_OFST 4
+/* MC_CMD_REMOVE_LIGHTSOUT_OFFLOAD_IN msgrequest */
+#define    MC_CMD_REMOVE_LIGHTSOUT_OFFLOAD_IN_LEN 8
+#define       MC_CMD_REMOVE_LIGHTSOUT_OFFLOAD_IN_PROTOCOL_OFST 0
+#define       MC_CMD_REMOVE_LIGHTSOUT_OFFLOAD_IN_FILTER_ID_OFST 4
 
-/* Lights-out offload protocols enumeration */
-#define MC_CMD_LIGHTSOUT_OFFLOAD_PROTOCOL_ARP 0x1
-#define MC_CMD_LIGHTSOUT_OFFLOAD_PROTOCOL_NS  0x2
+/* MC_CMD_REMOVE_LIGHTSOUT_OFFLOAD_OUT msgresponse */
+#define    MC_CMD_REMOVE_LIGHTSOUT_OFFLOAD_OUT_LEN 0
 
 
-/* MC_CMD_MAC_RESET_RESTORE:
- * Restore MAC after block reset
- *
- * Locks required: None
- * Returns: 0
+/***********************************/
+/* MC_CMD_MAC_RESET_RESTORE
+ * Restore MAC after block reset.
  */
-
 #define MC_CMD_MAC_RESET_RESTORE 0x48
-#define MC_CMD_MAC_RESET_RESTORE_IN_LEN 0
-#define MC_CMD_MAC_RESET_RESTORE_OUT_LEN 0
 
+/* MC_CMD_MAC_RESET_RESTORE_IN msgrequest */
+#define    MC_CMD_MAC_RESET_RESTORE_IN_LEN 0
+
+/* MC_CMD_MAC_RESET_RESTORE_OUT msgresponse */
+#define    MC_CMD_MAC_RESET_RESTORE_OUT_LEN 0
 
-/* MC_CMD_TEST_ASSERT:
- * Deliberately trigger an assert-detonation in the firmware for testing
- * purposes (i.e. to allow tests that the driver copes gracefully).
- *
- * Locks required: None
- * Returns: 0
- */
 
+/***********************************/
+/* MC_CMD_TESTASSERT
+ */
 #define MC_CMD_TESTASSERT 0x49
-#define MC_CMD_TESTASSERT_IN_LEN 0
-#define MC_CMD_TESTASSERT_OUT_LEN 0
 
-/* MC_CMD_WORKAROUND 0x4a
- *
- * Enable/Disable a given workaround. The mcfw will return EINVAL if it
- * doesn't understand the given workaround number - which should not
- * be treated as a hard error by client code.
- *
- * This op does not imply any semantics about each workaround, that's between
- * the driver and the mcfw on a per-workaround basis.
- *
- * Locks required: None
- * Returns: 0, EINVAL
+/* MC_CMD_TESTASSERT_IN msgrequest */
+#define    MC_CMD_TESTASSERT_IN_LEN 0
+
+/* MC_CMD_TESTASSERT_OUT msgresponse */
+#define    MC_CMD_TESTASSERT_OUT_LEN 0
+
+
+/***********************************/
+/* MC_CMD_WORKAROUND
+ * Enable/Disable a given workaround.
  */
 #define MC_CMD_WORKAROUND 0x4a
-#define MC_CMD_WORKAROUND_IN_LEN 8
-#define MC_CMD_WORKAROUND_IN_TYPE_OFST 0
-#define MC_CMD_WORKAROUND_BUG17230 1
-#define MC_CMD_WORKAROUND_IN_ENABLED_OFST 4
-#define MC_CMD_WORKAROUND_OUT_LEN 0
-
-/* MC_CMD_GET_PHY_MEDIA_INFO:
- * Read media-specific data from PHY (e.g. SFP/SFP+ module ID information for
- * SFP+ PHYs).
- *
- * The "media type" can be found via GET_PHY_CFG (GET_PHY_CFG_OUT_MEDIA_TYPE);
- * the valid "page number" input values, and the output data, are interpreted
- * on a per-type basis.
- *
- * For SFP+: PAGE=0 or 1 returns a 128-byte block read from module I2C address
- *           0xA0 offset 0 or 0x80.
- * Anything else: currently undefined.
- *
- * Locks required: None
- * Return code: 0
+
+/* MC_CMD_WORKAROUND_IN msgrequest */
+#define    MC_CMD_WORKAROUND_IN_LEN 8
+#define       MC_CMD_WORKAROUND_IN_TYPE_OFST 0
+#define          MC_CMD_WORKAROUND_BUG17230 0x1 /* enum */
+#define       MC_CMD_WORKAROUND_IN_ENABLED_OFST 4
+
+/* MC_CMD_WORKAROUND_OUT msgresponse */
+#define    MC_CMD_WORKAROUND_OUT_LEN 0
+
+
+/***********************************/
+/* MC_CMD_GET_PHY_MEDIA_INFO
+ * Read media-specific data from PHY.
  */
 #define MC_CMD_GET_PHY_MEDIA_INFO 0x4b
-#define MC_CMD_GET_PHY_MEDIA_INFO_IN_LEN 4
-#define MC_CMD_GET_PHY_MEDIA_INFO_IN_PAGE_OFST 0
-#define MC_CMD_GET_PHY_MEDIA_INFO_OUT_LEN(_num_bytes) (4 + (_num_bytes))
-#define MC_CMD_GET_PHY_MEDIA_INFO_OUT_DATALEN_OFST 0
-#define MC_CMD_GET_PHY_MEDIA_INFO_OUT_DATA_OFST 4
-
-/* MC_CMD_NVRAM_TEST:
- * Test a particular NVRAM partition for valid contents (where "valid"
- * depends on the type of partition).
- *
- * Locks required: None
- * Return code: 0
+
+/* MC_CMD_GET_PHY_MEDIA_INFO_IN msgrequest */
+#define    MC_CMD_GET_PHY_MEDIA_INFO_IN_LEN 4
+#define       MC_CMD_GET_PHY_MEDIA_INFO_IN_PAGE_OFST 0
+
+/* MC_CMD_GET_PHY_MEDIA_INFO_OUT msgresponse */
+#define    MC_CMD_GET_PHY_MEDIA_INFO_OUT_LENMIN 5
+#define    MC_CMD_GET_PHY_MEDIA_INFO_OUT_LENMAX 255
+#define    MC_CMD_GET_PHY_MEDIA_INFO_OUT_LEN(num) (4+1*(num))
+#define       MC_CMD_GET_PHY_MEDIA_INFO_OUT_DATALEN_OFST 0
+#define       MC_CMD_GET_PHY_MEDIA_INFO_OUT_DATA_OFST 4
+#define       MC_CMD_GET_PHY_MEDIA_INFO_OUT_DATA_LEN 1
+#define       MC_CMD_GET_PHY_MEDIA_INFO_OUT_DATA_MINNUM 1
+#define       MC_CMD_GET_PHY_MEDIA_INFO_OUT_DATA_MAXNUM 251
+
+
+/***********************************/
+/* MC_CMD_NVRAM_TEST
+ * Test a particular NVRAM partition.
  */
 #define MC_CMD_NVRAM_TEST 0x4c
-#define MC_CMD_NVRAM_TEST_IN_LEN 4
-#define MC_CMD_NVRAM_TEST_IN_TYPE_OFST 0
-#define MC_CMD_NVRAM_TEST_OUT_LEN 4
-#define MC_CMD_NVRAM_TEST_OUT_RESULT_OFST 0
-#define MC_CMD_NVRAM_TEST_PASS 0
-#define MC_CMD_NVRAM_TEST_FAIL 1
-#define MC_CMD_NVRAM_TEST_NOTSUPP 2
-
-/* MC_CMD_MRSFP_TWEAK: (debug)
- * Read status and/or set parameters for the "mrsfp" driver in mr_rusty builds.
- * I2C I/O expander bits are always read; if equaliser parameters are supplied,
- * they are configured first.
- *
- * Locks required: None
- * Return code: 0, EINVAL
+
+/* MC_CMD_NVRAM_TEST_IN msgrequest */
+#define    MC_CMD_NVRAM_TEST_IN_LEN 4
+#define       MC_CMD_NVRAM_TEST_IN_TYPE_OFST 0
+/*            Enum values, see field(s): */
+/*               MC_CMD_NVRAM_TYPES/MC_CMD_NVRAM_TYPES_OUT/TYPES */
+
+/* MC_CMD_NVRAM_TEST_OUT msgresponse */
+#define    MC_CMD_NVRAM_TEST_OUT_LEN 4
+#define       MC_CMD_NVRAM_TEST_OUT_RESULT_OFST 0
+#define          MC_CMD_NVRAM_TEST_PASS 0x0 /* enum */
+#define          MC_CMD_NVRAM_TEST_FAIL 0x1 /* enum */
+#define          MC_CMD_NVRAM_TEST_NOTSUPP 0x2 /* enum */
+
+
+/***********************************/
+/* MC_CMD_MRSFP_TWEAK
+ * Read status and/or set parameters for the 'mrsfp' driver.
  */
 #define MC_CMD_MRSFP_TWEAK 0x4d
-#define MC_CMD_MRSFP_TWEAK_IN_LEN_READ_ONLY 0
-#define MC_CMD_MRSFP_TWEAK_IN_LEN_EQ_CONFIG 16
-#define MC_CMD_MRSFP_TWEAK_IN_TXEQ_LEVEL_OFST 0    /* 0-6 low->high de-emph. */
-#define MC_CMD_MRSFP_TWEAK_IN_TXEQ_DT_CFG_OFST 4   /* 0-8 low->high ref.V */
-#define MC_CMD_MRSFP_TWEAK_IN_RXEQ_BOOST_OFST 8    /* 0-8 low->high boost */
-#define MC_CMD_MRSFP_TWEAK_IN_RXEQ_DT_CFG_OFST 12  /* 0-8 low->high ref.V */
-#define MC_CMD_MRSFP_TWEAK_OUT_LEN 12
-#define MC_CMD_MRSFP_TWEAK_OUT_IOEXP_INPUTS_OFST 0     /* input bits */
-#define MC_CMD_MRSFP_TWEAK_OUT_IOEXP_OUTPUTS_OFST 4    /* output bits */
-#define MC_CMD_MRSFP_TWEAK_OUT_IOEXP_DIRECTION_OFST 8  /* dirs: 0=out, 1=in */
-
-/* MC_CMD_TEST_HACK: (debug (unsurprisingly))
-  * Change bits of network port state for test purposes in ways that would never be
-  * useful in normal operation and so need a special command to change. */
-#define MC_CMD_TEST_HACK 0x2f
-#define MC_CMD_TEST_HACK_IN_LEN 8
-#define MC_CMD_TEST_HACK_IN_TXPAD_OFST 0
-#define   MC_CMD_TEST_HACK_IN_TXPAD_AUTO  0 /* Let the MC manage things */
-#define   MC_CMD_TEST_HACK_IN_TXPAD_ON    1 /* Force on */
-#define   MC_CMD_TEST_HACK_IN_TXPAD_OFF   2 /* Force on */
-#define MC_CMD_TEST_HACK_IN_IPG_OFST   4 /* Takes a value in bits */
-#define   MC_CMD_TEST_HACK_IN_IPG_AUTO    0 /* The MC picks the value */
-#define MC_CMD_TEST_HACK_OUT_LEN 0
-
-/* MC_CMD_SENSOR_SET_LIMS: (debug) (mostly) adjust the sensor limits. This
- * is a warranty-voiding operation.
-  *
- * IN: sensor identifier (one of the enumeration starting with MC_CMD_SENSOR_CONTROLLER_TEMP
- * followed by 4 32-bit values: min(warning) max(warning), min(fatal), max(fatal). Which
- * of these limits are meaningful and what their interpretation is is sensor-specific.
- *
- * OUT: nothing
- *
- * Returns: ENOENT if the sensor specified does not exist, EINVAL if the limits are
-  * out of range.
+
+/* MC_CMD_MRSFP_TWEAK_IN_EQ_CONFIG msgrequest */
+#define    MC_CMD_MRSFP_TWEAK_IN_EQ_CONFIG_LEN 16
+#define       MC_CMD_MRSFP_TWEAK_IN_EQ_CONFIG_TXEQ_LEVEL_OFST 0
+#define       MC_CMD_MRSFP_TWEAK_IN_EQ_CONFIG_TXEQ_DT_CFG_OFST 4
+#define       MC_CMD_MRSFP_TWEAK_IN_EQ_CONFIG_RXEQ_BOOST_OFST 8
+#define       MC_CMD_MRSFP_TWEAK_IN_EQ_CONFIG_RXEQ_DT_CFG_OFST 12
+
+/* MC_CMD_MRSFP_TWEAK_IN_READ_ONLY msgrequest */
+#define    MC_CMD_MRSFP_TWEAK_IN_READ_ONLY_LEN 0
+
+/* MC_CMD_MRSFP_TWEAK_OUT msgresponse */
+#define    MC_CMD_MRSFP_TWEAK_OUT_LEN 12
+#define       MC_CMD_MRSFP_TWEAK_OUT_IOEXP_INPUTS_OFST 0
+#define       MC_CMD_MRSFP_TWEAK_OUT_IOEXP_OUTPUTS_OFST 4
+#define       MC_CMD_MRSFP_TWEAK_OUT_IOEXP_DIRECTION_OFST 8
+#define          MC_CMD_MRSFP_TWEAK_OUT_IOEXP_DIRECTION_OUT 0x0 /* enum */
+#define          MC_CMD_MRSFP_TWEAK_OUT_IOEXP_DIRECTION_IN 0x1 /* enum */
+
+
+/***********************************/
+/* MC_CMD_SENSOR_SET_LIMS
+ * Adjusts the sensor limits.
  */
 #define MC_CMD_SENSOR_SET_LIMS 0x4e
-#define MC_CMD_SENSOR_SET_LIMS_IN_LEN 20
-#define MC_CMD_SENSOR_SET_LIMS_IN_SENSOR_OFST 0
-#define MC_CMD_SENSOR_SET_LIMS_IN_LOW0_OFST 4
-#define MC_CMD_SENSOR_SET_LIMS_IN_HI0_OFST  8
-#define MC_CMD_SENSOR_SET_LIMS_IN_LOW1_OFST 12
-#define MC_CMD_SENSOR_SET_LIMS_IN_HI1_OFST  16
-
-/* Do NOT add new commands beyond 0x4f as part of 3.0 : 0x50 - 0x7f will be
- * used for post-3.0 extensions. If you run out of space, look for gaps or
- * commands that are unused in the existing range. */
+
+/* MC_CMD_SENSOR_SET_LIMS_IN msgrequest */
+#define    MC_CMD_SENSOR_SET_LIMS_IN_LEN 20
+#define       MC_CMD_SENSOR_SET_LIMS_IN_SENSOR_OFST 0
+/*            Enum values, see field(s): */
+/*               MC_CMD_SENSOR_INFO/MC_CMD_SENSOR_INFO_OUT/MASK */
+#define       MC_CMD_SENSOR_SET_LIMS_IN_LOW0_OFST 4
+#define       MC_CMD_SENSOR_SET_LIMS_IN_HI0_OFST 8
+#define       MC_CMD_SENSOR_SET_LIMS_IN_LOW1_OFST 12
+#define       MC_CMD_SENSOR_SET_LIMS_IN_HI1_OFST 16
+
+/* MC_CMD_SENSOR_SET_LIMS_OUT msgresponse */
+#define    MC_CMD_SENSOR_SET_LIMS_OUT_LEN 0
+
+
+/***********************************/
+/* MC_CMD_GET_RESOURCE_LIMITS
+ */
+#define MC_CMD_GET_RESOURCE_LIMITS 0x4f
+
+/* MC_CMD_GET_RESOURCE_LIMITS_IN msgrequest */
+#define    MC_CMD_GET_RESOURCE_LIMITS_IN_LEN 0
+
+/* MC_CMD_GET_RESOURCE_LIMITS_OUT msgresponse */
+#define    MC_CMD_GET_RESOURCE_LIMITS_OUT_LEN 16
+#define       MC_CMD_GET_RESOURCE_LIMITS_OUT_BUFTBL_OFST 0
+#define       MC_CMD_GET_RESOURCE_LIMITS_OUT_EVQ_OFST 4
+#define       MC_CMD_GET_RESOURCE_LIMITS_OUT_RXQ_OFST 8
+#define       MC_CMD_GET_RESOURCE_LIMITS_OUT_TXQ_OFST 12
+
+/* MC_CMD_RESOURCE_SPECIFIER enum */
+#define          MC_CMD_RESOURCE_INSTANCE_ANY 0xffffffff /* enum */
+#define          MC_CMD_RESOURCE_INSTANCE_NONE 0xfffffffe /* enum */
+
 
 #endif /* MCDI_PCOL_H */
index 6c63ab0..7bcad89 100644 (file)
@@ -116,7 +116,7 @@ static int efx_mcdi_loopback_modes(struct efx_nic *efx, u64 *loopback_modes)
                goto fail;
        }
 
-       *loopback_modes = MCDI_QWORD(outbuf, GET_LOOPBACK_MODES_SUGGESTED);
+       *loopback_modes = MCDI_QWORD(outbuf, GET_LOOPBACK_MODES_OUT_SUGGESTED);
 
        return 0;
 
@@ -264,22 +264,22 @@ static u32 efx_get_mcdi_phy_flags(struct efx_nic *efx)
 
        /* TODO: Advertise the capabilities supported by this PHY */
        supported = 0;
-       if (phy_cfg->flags & (1 << MC_CMD_GET_PHY_CFG_TXDIS_LBN))
+       if (phy_cfg->flags & (1 << MC_CMD_GET_PHY_CFG_OUT_TXDIS_LBN))
                supported |= PHY_MODE_TX_DISABLED;
-       if (phy_cfg->flags & (1 << MC_CMD_GET_PHY_CFG_LOWPOWER_LBN))
+       if (phy_cfg->flags & (1 << MC_CMD_GET_PHY_CFG_OUT_LOWPOWER_LBN))
                supported |= PHY_MODE_LOW_POWER;
-       if (phy_cfg->flags & (1 << MC_CMD_GET_PHY_CFG_POWEROFF_LBN))
+       if (phy_cfg->flags & (1 << MC_CMD_GET_PHY_CFG_OUT_POWEROFF_LBN))
                supported |= PHY_MODE_OFF;
 
        mode = efx->phy_mode & supported;
 
        flags = 0;
        if (mode & PHY_MODE_TX_DISABLED)
-               flags |= (1 << MC_CMD_SET_LINK_TXDIS_LBN);
+               flags |= (1 << MC_CMD_SET_LINK_IN_TXDIS_LBN);
        if (mode & PHY_MODE_LOW_POWER)
-               flags |= (1 << MC_CMD_SET_LINK_LOWPOWER_LBN);
+               flags |= (1 << MC_CMD_SET_LINK_IN_LOWPOWER_LBN);
        if (mode & PHY_MODE_OFF)
-               flags |= (1 << MC_CMD_SET_LINK_POWEROFF_LBN);
+               flags |= (1 << MC_CMD_SET_LINK_IN_POWEROFF_LBN);
 
        return flags;
 }
@@ -436,8 +436,8 @@ void efx_mcdi_phy_decode_link(struct efx_nic *efx,
                break;
        }
 
-       link_state->up = !!(flags & (1 << MC_CMD_GET_LINK_LINK_UP_LBN));
-       link_state->fd = !!(flags & (1 << MC_CMD_GET_LINK_FULL_DUPLEX_LBN));
+       link_state->up = !!(flags & (1 << MC_CMD_GET_LINK_OUT_LINK_UP_LBN));
+       link_state->fd = !!(flags & (1 << MC_CMD_GET_LINK_OUT_FULL_DUPLEX_LBN));
        link_state->speed = speed;
 }
 
@@ -592,7 +592,7 @@ static int efx_mcdi_phy_test_alive(struct efx_nic *efx)
 
        if (outlen < MC_CMD_GET_PHY_STATE_OUT_LEN)
                return -EIO;
-       if (MCDI_DWORD(outbuf, GET_PHY_STATE_STATE) != MC_CMD_PHY_STATE_OK)
+       if (MCDI_DWORD(outbuf, GET_PHY_STATE_OUT_STATE) != MC_CMD_PHY_STATE_OK)
                return -EINVAL;
 
        return 0;
@@ -680,7 +680,7 @@ static int efx_mcdi_phy_run_tests(struct efx_nic *efx, int *results,
        u32 mode;
        int rc;
 
-       if (phy_cfg->flags & (1 << MC_CMD_GET_PHY_CFG_BIST_LBN)) {
+       if (phy_cfg->flags & (1 << MC_CMD_GET_PHY_CFG_OUT_BIST_LBN)) {
                rc = efx_mcdi_bist(efx, MC_CMD_PHY_BIST, results);
                if (rc < 0)
                        return rc;
@@ -691,15 +691,15 @@ static int efx_mcdi_phy_run_tests(struct efx_nic *efx, int *results,
        /* If we support both LONG and SHORT, then run each in response to
         * break or not. Otherwise, run the one we support */
        mode = 0;
-       if (phy_cfg->flags & (1 << MC_CMD_GET_PHY_CFG_BIST_CABLE_SHORT_LBN)) {
+       if (phy_cfg->flags & (1 << MC_CMD_GET_PHY_CFG_OUT_BIST_CABLE_SHORT_LBN)) {
                if ((flags & ETH_TEST_FL_OFFLINE) &&
                    (phy_cfg->flags &
-                    (1 << MC_CMD_GET_PHY_CFG_BIST_CABLE_LONG_LBN)))
+                    (1 << MC_CMD_GET_PHY_CFG_OUT_BIST_CABLE_LONG_LBN)))
                        mode = MC_CMD_PHY_BIST_CABLE_LONG;
                else
                        mode = MC_CMD_PHY_BIST_CABLE_SHORT;
        } else if (phy_cfg->flags &
-                  (1 << MC_CMD_GET_PHY_CFG_BIST_CABLE_LONG_LBN))
+                  (1 << MC_CMD_GET_PHY_CFG_OUT_BIST_CABLE_LONG_LBN))
                mode = MC_CMD_PHY_BIST_CABLE_LONG;
 
        if (mode != 0) {
@@ -717,14 +717,14 @@ static const char *efx_mcdi_phy_test_name(struct efx_nic *efx,
 {
        struct efx_mcdi_phy_data *phy_cfg = efx->phy_data;
 
-       if (phy_cfg->flags & (1 << MC_CMD_GET_PHY_CFG_BIST_LBN)) {
+       if (phy_cfg->flags & (1 << MC_CMD_GET_PHY_CFG_OUT_BIST_LBN)) {
                if (index == 0)
                        return "bist";
                --index;
        }
 
-       if (phy_cfg->flags & ((1 << MC_CMD_GET_PHY_CFG_BIST_CABLE_SHORT_LBN) |
-                             (1 << MC_CMD_GET_PHY_CFG_BIST_CABLE_LONG_LBN))) {
+       if (phy_cfg->flags & ((1 << MC_CMD_GET_PHY_CFG_OUT_BIST_CABLE_SHORT_LBN) |
+                             (1 << MC_CMD_GET_PHY_CFG_OUT_BIST_CABLE_LONG_LBN))) {
                if (index == 0)
                        return "cable";
                --index;
@@ -741,7 +741,7 @@ static const char *efx_mcdi_phy_test_name(struct efx_nic *efx,
 
 const struct efx_phy_operations efx_mcdi_phy_ops = {
        .probe          = efx_mcdi_phy_probe,
-       .init           = efx_port_dummy_op_int,
+       .init           = efx_port_dummy_op_int,
        .reconfigure    = efx_mcdi_phy_reconfigure,
        .poll           = efx_mcdi_phy_poll,
        .fini           = efx_port_dummy_op_void,
index 7ab385c..9acfd66 100644 (file)
@@ -228,7 +228,7 @@ void efx_mdio_set_mmds_lpower(struct efx_nic *efx,
 /**
  * efx_mdio_set_settings - Set (some of) the PHY settings over MDIO.
  * @efx:               Efx NIC
- * @ecmd:              New settings
+ * @ecmd:              New settings
  */
 int efx_mdio_set_settings(struct efx_nic *efx, struct ethtool_cmd *ecmd)
 {
index bc9dcd6..26b3c23 100644 (file)
@@ -280,7 +280,7 @@ fail:
                --part;
                efx_mtd_remove_partition(part);
        }
-       /* mtd_device_register() returns 1 if the MTD table is full */
+       /* Failure is unlikely here, but probably means we're out of memory */
        return -ENOMEM;
 }
 
@@ -382,7 +382,7 @@ static int falcon_mtd_sync(struct mtd_info *mtd)
        return rc;
 }
 
-static struct efx_mtd_ops falcon_mtd_ops = {
+static const struct efx_mtd_ops falcon_mtd_ops = {
        .read   = falcon_mtd_read,
        .erase  = falcon_mtd_erase,
        .write  = falcon_mtd_write,
@@ -560,7 +560,7 @@ static int siena_mtd_sync(struct mtd_info *mtd)
        return rc;
 }
 
-static struct efx_mtd_ops siena_mtd_ops = {
+static const struct efx_mtd_ops siena_mtd_ops = {
        .read   = siena_mtd_read,
        .erase  = siena_mtd_erase,
        .write  = siena_mtd_write,
@@ -572,7 +572,7 @@ struct siena_nvram_type_info {
        const char *name;
 };
 
-static struct siena_nvram_type_info siena_nvram_types[] = {
+static const struct siena_nvram_type_info siena_nvram_types[] = {
        [MC_CMD_NVRAM_TYPE_DISABLED_CALLISTO]   = { 0, "sfc_dummy_phy" },
        [MC_CMD_NVRAM_TYPE_MC_FW]               = { 0, "sfc_mcfw" },
        [MC_CMD_NVRAM_TYPE_MC_FW_BACKUP]        = { 0, "sfc_mcfw_backup" },
@@ -593,7 +593,7 @@ static int siena_mtd_probe_partition(struct efx_nic *efx,
                                     unsigned int type)
 {
        struct efx_mtd_partition *part = &efx_mtd->part[part_id];
-       struct siena_nvram_type_info *info;
+       const struct siena_nvram_type_info *info;
        size_t size, erase_size;
        bool protected;
        int rc;
@@ -627,11 +627,10 @@ static int siena_mtd_get_fw_subtypes(struct efx_nic *efx,
                                     struct efx_mtd *efx_mtd)
 {
        struct efx_mtd_partition *part;
-       uint16_t fw_subtype_list[MC_CMD_GET_BOARD_CFG_OUT_FW_SUBTYPE_LIST_LEN /
-                                sizeof(uint16_t)];
+       uint16_t fw_subtype_list[MC_CMD_GET_BOARD_CFG_OUT_FW_SUBTYPE_LIST_MINNUM];
        int rc;
 
-       rc = efx_mcdi_get_board_cfg(efx, NULL, fw_subtype_list);
+       rc = efx_mcdi_get_board_cfg(efx, NULL, fw_subtype_list, NULL);
        if (rc)
                return rc;
 
index c49502b..0b95505 100644 (file)
 #ifndef EFX_NET_DRIVER_H
 #define EFX_NET_DRIVER_H
 
-#if defined(EFX_ENABLE_DEBUG) && !defined(DEBUG)
-#define DEBUG
-#endif
-
 #include <linux/netdevice.h>
 #include <linux/etherdevice.h>
 #include <linux/ethtool.h>
@@ -28,6 +24,7 @@
 #include <linux/device.h>
 #include <linux/highmem.h>
 #include <linux/workqueue.h>
+#include <linux/mutex.h>
 #include <linux/vmalloc.h>
 #include <linux/i2c.h>
 
@@ -42,7 +39,7 @@
 
 #define EFX_DRIVER_VERSION     "3.1"
 
-#ifdef EFX_ENABLE_DEBUG
+#ifdef DEBUG
 #define EFX_BUG_ON_PARANOID(x) BUG_ON(x)
 #define EFX_WARN_ON_PARANOID(x) WARN_ON(x)
 #else
  *
  **************************************************************************/
 
-#define EFX_MAX_CHANNELS 32
+#define EFX_MAX_CHANNELS 32U
 #define EFX_MAX_RX_QUEUES EFX_MAX_CHANNELS
+#define EFX_EXTRA_CHANNEL_IOV  0
+#define EFX_MAX_EXTRA_CHANNELS 1U
 
 /* Checksum generation is a per-queue option in hardware, so each
  * queue visible to the networking core is backed by two hardware TX
@@ -85,15 +84,8 @@ struct efx_special_buffer {
        void *addr;
        dma_addr_t dma_addr;
        unsigned int len;
-       int index;
-       int entries;
-};
-
-enum efx_flush_state {
-       FLUSH_NONE,
-       FLUSH_PENDING,
-       FLUSH_FAILED,
-       FLUSH_DONE,
+       unsigned int index;
+       unsigned int entries;
 };
 
 /**
@@ -142,7 +134,6 @@ struct efx_tx_buffer {
  * @txd: The hardware descriptor ring
  * @ptr_mask: The size of the ring minus 1.
  * @initialised: Has hardware queue been initialised?
- * @flushed: Used when handling queue flushing
  * @read_count: Current read pointer.
  *     This is the number of buffers that have been removed from both rings.
  * @old_write_count: The value of @write_count when last checked.
@@ -185,7 +176,6 @@ struct efx_tx_queue {
        struct efx_special_buffer txd;
        unsigned int ptr_mask;
        bool initialised;
-       enum efx_flush_state flushed;
 
        /* Members used mainly on the completion path */
        unsigned int read_count ____cacheline_aligned_in_smp;
@@ -209,12 +199,12 @@ struct efx_tx_queue {
 /**
  * struct efx_rx_buffer - An Efx RX data buffer
  * @dma_addr: DMA base address of the buffer
- * @skb: The associated socket buffer, if any.
- *     If both this and page are %NULL, the buffer slot is currently free.
- * @page: The associated page buffer, if any.
- *     If both this and skb are %NULL, the buffer slot is currently free.
+ * @skb: The associated socket buffer. Valid iff !(@flags & %EFX_RX_BUF_PAGE).
+ *     Will be %NULL if the buffer slot is currently free.
+ * @page: The associated page buffer. Valif iff @flags & %EFX_RX_BUF_PAGE.
+ *     Will be %NULL if the buffer slot is currently free.
  * @len: Buffer length, in bytes.
- * @is_page: Indicates if @page is valid. If false, @skb is valid.
+ * @flags: Flags for buffer and packet state.
  */
 struct efx_rx_buffer {
        dma_addr_t dma_addr;
@@ -223,8 +213,11 @@ struct efx_rx_buffer {
                struct page *page;
        } u;
        unsigned int len;
-       bool is_page;
+       u16 flags;
 };
+#define EFX_RX_BUF_PAGE                0x0001
+#define EFX_RX_PKT_CSUMMED     0x0002
+#define EFX_RX_PKT_DISCARD     0x0004
 
 /**
  * struct efx_rx_page_state - Page-based rx buffer state
@@ -250,6 +243,9 @@ struct efx_rx_page_state {
  * @buffer: The software buffer ring
  * @rxd: The hardware descriptor ring
  * @ptr_mask: The size of the ring minus 1.
+ * @enabled: Receive queue enabled indicator.
+ * @flush_pending: Set when a RX flush is pending. Has the same lifetime as
+ *     @rxq_flush_pending.
  * @added_count: Number of buffers added to the receive queue.
  * @notified_count: Number of buffers given to NIC (<= @added_count).
  * @removed_count: Number of buffers removed from the receive queue.
@@ -264,13 +260,14 @@ struct efx_rx_page_state {
  * @alloc_page_count: RX allocation strategy counter.
  * @alloc_skb_count: RX allocation strategy counter.
  * @slow_fill: Timer used to defer efx_nic_generate_fill_event().
- * @flushed: Use when handling queue flushing
  */
 struct efx_rx_queue {
        struct efx_nic *efx;
        struct efx_rx_buffer *buffer;
        struct efx_special_buffer rxd;
        unsigned int ptr_mask;
+       bool enabled;
+       bool flush_pending;
 
        int added_count;
        int notified_count;
@@ -284,8 +281,6 @@ struct efx_rx_queue {
        unsigned int alloc_skb_count;
        struct timer_list slow_fill;
        unsigned int slow_fill_count;
-
-       enum efx_flush_state flushed;
 };
 
 /**
@@ -319,6 +314,7 @@ enum efx_rx_alloc_method {
  *
  * @efx: Associated Efx NIC
  * @channel: Channel instance number
+ * @type: Channel type definition
  * @enabled: Channel enabled indicator
  * @irq: IRQ number (MSI and MSI-X only)
  * @irq_moderation: IRQ moderation value (in hardware ticks)
@@ -329,6 +325,7 @@ enum efx_rx_alloc_method {
  * @eventq_mask: Event queue pointer mask
  * @eventq_read_ptr: Event queue read pointer
  * @last_eventq_read_ptr: Last event queue read pointer value.
+ * @last_irq_cpu: Last CPU to handle interrupt for this channel
  * @irq_count: Number of IRQs since last adaptive moderation decision
  * @irq_mod_score: IRQ moderation score
  * @rx_alloc_level: Watermark based heuristic counter for pushing descriptors
@@ -348,6 +345,7 @@ enum efx_rx_alloc_method {
 struct efx_channel {
        struct efx_nic *efx;
        int channel;
+       const struct efx_channel_type *type;
        bool enabled;
        int irq;
        unsigned int irq_moderation;
@@ -359,6 +357,7 @@ struct efx_channel {
        unsigned int eventq_read_ptr;
        unsigned int last_eventq_read_ptr;
 
+       int last_irq_cpu;
        unsigned int irq_count;
        unsigned int irq_mod_score;
 #ifdef CONFIG_RFS_ACCEL
@@ -380,12 +379,31 @@ struct efx_channel {
         * access with prefetches.
         */
        struct efx_rx_buffer *rx_pkt;
-       bool rx_pkt_csummed;
 
        struct efx_rx_queue rx_queue;
        struct efx_tx_queue tx_queue[EFX_TXQ_TYPES];
 };
 
+/**
+ * struct efx_channel_type - distinguishes traffic and extra channels
+ * @handle_no_channel: Handle failure to allocate an extra channel
+ * @pre_probe: Set up extra state prior to initialisation
+ * @post_remove: Tear down extra state after finalisation, if allocated.
+ *     May be called on channels that have not been probed.
+ * @get_name: Generate the channel's name (used for its IRQ handler)
+ * @copy: Copy the channel state prior to reallocation.  May be %NULL if
+ *     reallocation is not supported.
+ * @keep_eventq: Flag for whether event queue should be kept initialised
+ *     while the device is stopped
+ */
+struct efx_channel_type {
+       void (*handle_no_channel)(struct efx_nic *);
+       int (*pre_probe)(struct efx_channel *);
+       void (*get_name)(struct efx_channel *, char *buf, size_t len);
+       struct efx_channel *(*copy)(const struct efx_channel *);
+       bool keep_eventq;
+};
+
 enum efx_led_mode {
        EFX_LED_OFF     = 0,
        EFX_LED_ON      = 1,
@@ -395,12 +413,12 @@ enum efx_led_mode {
 #define STRING_TABLE_LOOKUP(val, member) \
        ((val) < member ## _max) ? member ## _names[val] : "(invalid)"
 
-extern const char *efx_loopback_mode_names[];
+extern const char *const efx_loopback_mode_names[];
 extern const unsigned int efx_loopback_mode_max;
 #define LOOPBACK_MODE(efx) \
        STRING_TABLE_LOOKUP((efx)->loopback_mode, efx_loopback_mode)
 
-extern const char *efx_reset_type_names[];
+extern const char *const efx_reset_type_names[];
 extern const unsigned int efx_reset_type_max;
 #define RESET_TYPE(type) \
        STRING_TABLE_LOOKUP(type, efx_reset_type)
@@ -474,18 +492,6 @@ static inline bool efx_link_state_equal(const struct efx_link_state *left,
 }
 
 /**
- * struct efx_mac_operations - Efx MAC operations table
- * @reconfigure: Reconfigure MAC. Serialised by the mac_lock
- * @update_stats: Update statistics
- * @check_fault: Check fault state. True if fault present.
- */
-struct efx_mac_operations {
-       int (*reconfigure) (struct efx_nic *efx);
-       void (*update_stats) (struct efx_nic *efx);
-       bool (*check_fault)(struct efx_nic *efx);
-};
-
-/**
  * struct efx_phy_operations - Efx PHY operations table
  * @probe: Probe PHY and initialise efx->mdio.mode_support, efx->mdio.mmds,
  *     efx->loopback_modes.
@@ -552,64 +558,64 @@ struct efx_mac_stats {
        u64 tx_bytes;
        u64 tx_good_bytes;
        u64 tx_bad_bytes;
-       unsigned long tx_packets;
-       unsigned long tx_bad;
-       unsigned long tx_pause;
-       unsigned long tx_control;
-       unsigned long tx_unicast;
-       unsigned long tx_multicast;
-       unsigned long tx_broadcast;
-       unsigned long tx_lt64;
-       unsigned long tx_64;
-       unsigned long tx_65_to_127;
-       unsigned long tx_128_to_255;
-       unsigned long tx_256_to_511;
-       unsigned long tx_512_to_1023;
-       unsigned long tx_1024_to_15xx;
-       unsigned long tx_15xx_to_jumbo;
-       unsigned long tx_gtjumbo;
-       unsigned long tx_collision;
-       unsigned long tx_single_collision;
-       unsigned long tx_multiple_collision;
-       unsigned long tx_excessive_collision;
-       unsigned long tx_deferred;
-       unsigned long tx_late_collision;
-       unsigned long tx_excessive_deferred;
-       unsigned long tx_non_tcpudp;
-       unsigned long tx_mac_src_error;
-       unsigned long tx_ip_src_error;
+       u64 tx_packets;
+       u64 tx_bad;
+       u64 tx_pause;
+       u64 tx_control;
+       u64 tx_unicast;
+       u64 tx_multicast;
+       u64 tx_broadcast;
+       u64 tx_lt64;
+       u64 tx_64;
+       u64 tx_65_to_127;
+       u64 tx_128_to_255;
+       u64 tx_256_to_511;
+       u64 tx_512_to_1023;
+       u64 tx_1024_to_15xx;
+       u64 tx_15xx_to_jumbo;
+       u64 tx_gtjumbo;
+       u64 tx_collision;
+       u64 tx_single_collision;
+       u64 tx_multiple_collision;
+       u64 tx_excessive_collision;
+       u64 tx_deferred;
+       u64 tx_late_collision;
+       u64 tx_excessive_deferred;
+       u64 tx_non_tcpudp;
+       u64 tx_mac_src_error;
+       u64 tx_ip_src_error;
        u64 rx_bytes;
        u64 rx_good_bytes;
        u64 rx_bad_bytes;
-       unsigned long rx_packets;
-       unsigned long rx_good;
-       unsigned long rx_bad;
-       unsigned long rx_pause;
-       unsigned long rx_control;
-       unsigned long rx_unicast;
-       unsigned long rx_multicast;
-       unsigned long rx_broadcast;
-       unsigned long rx_lt64;
-       unsigned long rx_64;
-       unsigned long rx_65_to_127;
-       unsigned long rx_128_to_255;
-       unsigned long rx_256_to_511;
-       unsigned long rx_512_to_1023;
-       unsigned long rx_1024_to_15xx;
-       unsigned long rx_15xx_to_jumbo;
-       unsigned long rx_gtjumbo;
-       unsigned long rx_bad_lt64;
-       unsigned long rx_bad_64_to_15xx;
-       unsigned long rx_bad_15xx_to_jumbo;
-       unsigned long rx_bad_gtjumbo;
-       unsigned long rx_overflow;
-       unsigned long rx_missed;
-       unsigned long rx_false_carrier;
-       unsigned long rx_symbol_error;
-       unsigned long rx_align_error;
-       unsigned long rx_length_error;
-       unsigned long rx_internal_error;
-       unsigned long rx_good_lt64;
+       u64 rx_packets;
+       u64 rx_good;
+       u64 rx_bad;
+       u64 rx_pause;
+       u64 rx_control;
+       u64 rx_unicast;
+       u64 rx_multicast;
+       u64 rx_broadcast;
+       u64 rx_lt64;
+       u64 rx_64;
+       u64 rx_65_to_127;
+       u64 rx_128_to_255;
+       u64 rx_256_to_511;
+       u64 rx_512_to_1023;
+       u64 rx_1024_to_15xx;
+       u64 rx_15xx_to_jumbo;
+       u64 rx_gtjumbo;
+       u64 rx_bad_lt64;
+       u64 rx_bad_64_to_15xx;
+       u64 rx_bad_15xx_to_jumbo;
+       u64 rx_bad_gtjumbo;
+       u64 rx_overflow;
+       u64 rx_missed;
+       u64 rx_false_carrier;
+       u64 rx_symbol_error;
+       u64 rx_align_error;
+       u64 rx_length_error;
+       u64 rx_internal_error;
+       u64 rx_good_lt64;
 };
 
 /* Number of bits used in a multicast filter hash address */
@@ -625,6 +631,8 @@ union efx_multicast_hash {
 };
 
 struct efx_filter_state;
+struct efx_vf;
+struct vfdi_status;
 
 /**
  * struct efx_nic - an Efx NIC
@@ -640,6 +648,7 @@ struct efx_filter_state;
  * @membase_phys: Memory BAR value as physical address
  * @membase: Memory BAR value
  * @interrupt_mode: Interrupt mode
+ * @timer_quantum_ns: Interrupt timer quantum, in nanoseconds
  * @irq_rx_adaptive: Adaptive IRQ moderation enabled for RX event queues
  * @irq_rx_moderation: IRQ moderation time for RX event queues
  * @msg_enable: Log message enable flags
@@ -649,8 +658,13 @@ struct efx_filter_state;
  * @rx_queue: RX DMA queues
  * @channel: Channels
  * @channel_name: Names for channels and their IRQs
+ * @extra_channel_types: Types of extra (non-traffic) channels that
+ *     should be allocated for this NIC
  * @rxq_entries: Size of receive queues requested by user.
  * @txq_entries: Size of transmit queues requested by user.
+ * @tx_dc_base: Base qword address in SRAM of TX queue descriptor caches
+ * @rx_dc_base: Base qword address in SRAM of RX queue descriptor caches
+ * @sram_lim_qw: Qword address limit of SRAM
  * @next_buffer_table: First available buffer table id
  * @n_channels: Number of channels in use
  * @n_rx_channels: Number of channels used for RX (= number of RX queues)
@@ -663,7 +677,7 @@ struct efx_filter_state;
  * @int_error_expire: Time at which error count will be expired
  * @irq_status: Interrupt status buffer
  * @irq_zero_count: Number of legacy IRQs seen with queue flags == 0
- * @fatal_irq_level: IRQ level (bit number) used for serious errors
+ * @irq_level: IRQ level/index for IRQs not triggered by an event queue
  * @mtd_list: List of MTDs attached to the NIC
  * @nic_data: Hardware dependent state
  * @mac_lock: MAC access lock. Protects @port_enabled, @phy_mode,
@@ -676,7 +690,6 @@ struct efx_filter_state;
  * @port_initialized: Port initialized?
  * @net_dev: Operating system network device. Consider holding the rtnl lock
  * @stats_buffer: DMA buffer for statistics
- * @mac_op: MAC interface
  * @phy_type: PHY type
  * @phy_op: PHY interface
  * @phy_data: PHY private data (including PHY-specific stats)
@@ -689,21 +702,42 @@ struct efx_filter_state;
  * @promiscuous: Promiscuous flag. Protected by netif_tx_lock.
  * @multicast_hash: Multicast hash table
  * @wanted_fc: Wanted flow control flags
+ * @fc_disable: When non-zero flow control is disabled. Typically used to
+ *     ensure that network back pressure doesn't delay dma queue flushes.
+ *     Serialised by the rtnl lock.
  * @mac_work: Work item for changing MAC promiscuity and multicast hash
  * @loopback_mode: Loopback status
  * @loopback_modes: Supported loopback mode bitmask
  * @loopback_selftest: Offline self-test private state
+ * @drain_pending: Count of RX and TX queues that haven't been flushed and drained.
+ * @rxq_flush_pending: Count of number of receive queues that need to be flushed.
+ *     Decremented when the efx_flush_rx_queue() is called.
+ * @rxq_flush_outstanding: Count of number of RX flushes started but not yet
+ *     completed (either success or failure). Not used when MCDI is used to
+ *     flush receive queues.
+ * @flush_wq: wait queue used by efx_nic_flush_queues() to wait for flush completions.
+ * @vf: Array of &struct efx_vf objects.
+ * @vf_count: Number of VFs intended to be enabled.
+ * @vf_init_count: Number of VFs that have been fully initialised.
+ * @vi_scale: log2 number of vnics per VF.
+ * @vf_buftbl_base: The zeroth buffer table index used to back VF queues.
+ * @vfdi_status: Common VFDI status page to be dmad to VF address space.
+ * @local_addr_list: List of local addresses. Protected by %local_lock.
+ * @local_page_list: List of DMA addressable pages used to broadcast
+ *     %local_addr_list. Protected by %local_lock.
+ * @local_lock: Mutex protecting %local_addr_list and %local_page_list.
+ * @peer_work: Work item to broadcast peer addresses to VMs.
  * @monitor_work: Hardware monitor workitem
  * @biu_lock: BIU (bus interface unit) lock
- * @last_irq_cpu: Last CPU to handle interrupt.
- *     This register is written with the SMP processor ID whenever an
- *     interrupt is handled.  It is used by efx_nic_test_interrupt()
- *     to verify that an interrupt has occurred.
+ * @last_irq_cpu: Last CPU to handle a possible test interrupt.  This
+ *     field is used by efx_test_interrupts() to verify that an
+ *     interrupt has occurred.
  * @n_rx_nodesc_drop_cnt: RX no descriptor drop count
  * @mac_stats: MAC statistics. These include all statistics the MACs
  *     can provide.  Generic code converts these into a standard
  *     &struct net_device_stats.
  * @stats_lock: Statistics update lock. Serialises statistics fetches
+ *     and access to @mac_stats.
  *
  * This is stored in the private area of the &struct net_device.
  */
@@ -722,6 +756,7 @@ struct efx_nic {
        void __iomem *membase;
 
        enum efx_int_mode interrupt_mode;
+       unsigned int timer_quantum_ns;
        bool irq_rx_adaptive;
        unsigned int irq_rx_moderation;
        u32 msg_enable;
@@ -731,12 +766,18 @@ struct efx_nic {
 
        struct efx_channel *channel[EFX_MAX_CHANNELS];
        char channel_name[EFX_MAX_CHANNELS][IFNAMSIZ + 6];
+       const struct efx_channel_type *
+       extra_channel_type[EFX_MAX_EXTRA_CHANNELS];
 
        unsigned rxq_entries;
        unsigned txq_entries;
+       unsigned tx_dc_base;
+       unsigned rx_dc_base;
+       unsigned sram_lim_qw;
        unsigned next_buffer_table;
        unsigned n_channels;
        unsigned n_rx_channels;
+       unsigned rss_spread;
        unsigned tx_channel_offset;
        unsigned n_tx_channels;
        unsigned int rx_buffer_len;
@@ -749,7 +790,7 @@ struct efx_nic {
 
        struct efx_buffer irq_status;
        unsigned irq_zero_count;
-       unsigned fatal_irq_level;
+       unsigned irq_level;
 
 #ifdef CONFIG_SFC_MTD
        struct list_head mtd_list;
@@ -766,8 +807,6 @@ struct efx_nic {
 
        struct efx_buffer stats_buffer;
 
-       const struct efx_mac_operations *mac_op;
-
        unsigned int phy_type;
        const struct efx_phy_operations *phy_op;
        void *phy_data;
@@ -782,6 +821,7 @@ struct efx_nic {
        bool promiscuous;
        union efx_multicast_hash multicast_hash;
        u8 wanted_fc;
+       unsigned fc_disable;
 
        atomic_t rx_reset;
        enum efx_loopback_mode loopback_mode;
@@ -791,11 +831,30 @@ struct efx_nic {
 
        struct efx_filter_state *filter_state;
 
+       atomic_t drain_pending;
+       atomic_t rxq_flush_pending;
+       atomic_t rxq_flush_outstanding;
+       wait_queue_head_t flush_wq;
+
+#ifdef CONFIG_SFC_SRIOV
+       struct efx_channel *vfdi_channel;
+       struct efx_vf *vf;
+       unsigned vf_count;
+       unsigned vf_init_count;
+       unsigned vi_scale;
+       unsigned vf_buftbl_base;
+       struct efx_buffer vfdi_status;
+       struct list_head local_addr_list;
+       struct list_head local_page_list;
+       struct mutex local_lock;
+       struct work_struct peer_work;
+#endif
+
        /* The following fields may be written more often */
 
        struct delayed_work monitor_work ____cacheline_aligned_in_smp;
        spinlock_t biu_lock;
-       volatile signed int last_irq_cpu;
+       int last_irq_cpu;
        unsigned n_rx_nodesc_drop_cnt;
        struct efx_mac_stats mac_stats;
        spinlock_t stats_lock;
@@ -806,15 +865,6 @@ static inline int efx_dev_registered(struct efx_nic *efx)
        return efx->net_dev->reg_state == NETREG_REGISTERED;
 }
 
-/* Net device name, for inclusion in log messages if it has been registered.
- * Use efx->name not efx->net_dev->name so that races with (un)registration
- * are harmless.
- */
-static inline const char *efx_dev_name(struct efx_nic *efx)
-{
-       return efx_dev_registered(efx) ? efx->name : "";
-}
-
 static inline unsigned int efx_port_num(struct efx_nic *efx)
 {
        return efx->net_dev->dev_id;
@@ -825,6 +875,8 @@ static inline unsigned int efx_port_num(struct efx_nic *efx)
  * @probe: Probe the controller
  * @remove: Free resources allocated by probe()
  * @init: Initialise the controller
+ * @dimension_resources: Dimension controller resources (buffer table,
+ *     and VIs once the available interrupt resources are clear)
  * @fini: Shut down the controller
  * @monitor: Periodic function for polling link state and hardware monitor
  * @map_reset_reason: Map ethtool reset reason to a reset method
@@ -840,14 +892,15 @@ static inline unsigned int efx_port_num(struct efx_nic *efx)
  * @stop_stats: Stop the regular fetching of statistics
  * @set_id_led: Set state of identifying LED or revert to automatic function
  * @push_irq_moderation: Apply interrupt moderation value
- * @push_multicast_hash: Apply multicast hash table
  * @reconfigure_port: Push loopback/power/txdis changes to the MAC and PHY
+ * @reconfigure_mac: Push MAC address, MTU, flow control and filter settings
+ *     to the hardware.  Serialised by the mac_lock.
+ * @check_mac_fault: Check MAC fault state. True if fault present.
  * @get_wol: Get WoL configuration from driver state
  * @set_wol: Push WoL configuration to the NIC
  * @resume_wol: Synchronise WoL state between driver and MC (e.g. after resume)
  * @test_registers: Test read/write functionality of control registers
  * @test_nvram: Test validity of NVRAM contents
- * @default_mac_ops: efx_mac_operations to set at startup
  * @revision: Hardware architecture revision
  * @mem_map_size: Memory BAR mapped size
  * @txd_ptr_tbl_base: TX descriptor ring base address
@@ -862,8 +915,7 @@ static inline unsigned int efx_port_num(struct efx_nic *efx)
  *     from &enum efx_init_mode.
  * @phys_addr_channels: Number of channels with physically addressed
  *     descriptors
- * @tx_dc_base: Base address in SRAM of TX queue descriptor caches
- * @rx_dc_base: Base address in SRAM of RX queue descriptor caches
+ * @timer_period_max: Maximum period of interrupt timer (in ticks)
  * @offload_features: net_device feature flags for protocol offload
  *     features implemented in hardware
  */
@@ -871,6 +923,7 @@ struct efx_nic_type {
        int (*probe)(struct efx_nic *efx);
        void (*remove)(struct efx_nic *efx);
        int (*init)(struct efx_nic *efx);
+       void (*dimension_resources)(struct efx_nic *efx);
        void (*fini)(struct efx_nic *efx);
        void (*monitor)(struct efx_nic *efx);
        enum reset_type (*map_reset_reason)(enum reset_type reason);
@@ -885,14 +938,14 @@ struct efx_nic_type {
        void (*stop_stats)(struct efx_nic *efx);
        void (*set_id_led)(struct efx_nic *efx, enum efx_led_mode mode);
        void (*push_irq_moderation)(struct efx_channel *channel);
-       void (*push_multicast_hash)(struct efx_nic *efx);
        int (*reconfigure_port)(struct efx_nic *efx);
+       int (*reconfigure_mac)(struct efx_nic *efx);
+       bool (*check_mac_fault)(struct efx_nic *efx);
        void (*get_wol)(struct efx_nic *efx, struct ethtool_wolinfo *wol);
        int (*set_wol)(struct efx_nic *efx, u32 type);
        void (*resume_wol)(struct efx_nic *efx);
        int (*test_registers)(struct efx_nic *efx);
        int (*test_nvram)(struct efx_nic *efx);
-       const struct efx_mac_operations *default_mac_ops;
 
        int revision;
        unsigned int mem_map_size;
@@ -906,8 +959,7 @@ struct efx_nic_type {
        unsigned int rx_buffer_padding;
        unsigned int max_interrupt_mode;
        unsigned int phys_addr_channels;
-       unsigned int tx_dc_base;
-       unsigned int rx_dc_base;
+       unsigned int timer_period_max;
        netdev_features_t offload_features;
 };
 
@@ -931,6 +983,13 @@ efx_get_channel(struct efx_nic *efx, unsigned index)
             _channel = (_channel->channel + 1 < (_efx)->n_channels) ?  \
                     (_efx)->channel[_channel->channel + 1] : NULL)
 
+/* Iterate over all used channels in reverse */
+#define efx_for_each_channel_rev(_channel, _efx)                       \
+       for (_channel = (_efx)->channel[(_efx)->n_channels - 1];        \
+            _channel;                                                  \
+            _channel = _channel->channel ?                             \
+                    (_efx)->channel[_channel->channel - 1] : NULL)
+
 static inline struct efx_tx_queue *
 efx_get_tx_queue(struct efx_nic *efx, unsigned index, unsigned type)
 {
@@ -971,16 +1030,12 @@ static inline bool efx_tx_queue_used(struct efx_tx_queue *tx_queue)
 
 /* Iterate over all possible TX queues belonging to a channel */
 #define efx_for_each_possible_channel_tx_queue(_tx_queue, _channel)    \
-       for (_tx_queue = (_channel)->tx_queue;                          \
-            _tx_queue < (_channel)->tx_queue + EFX_TXQ_TYPES;          \
-            _tx_queue++)
-
-static inline struct efx_rx_queue *
-efx_get_rx_queue(struct efx_nic *efx, unsigned index)
-{
-       EFX_BUG_ON_PARANOID(index >= efx->n_rx_channels);
-       return &efx->channel[index]->rx_queue;
-}
+       if (!efx_channel_has_tx_queues(_channel))                       \
+               ;                                                       \
+       else                                                            \
+               for (_tx_queue = (_channel)->tx_queue;                  \
+                    _tx_queue < (_channel)->tx_queue + EFX_TXQ_TYPES;  \
+                    _tx_queue++)
 
 static inline bool efx_channel_has_rx_queue(struct efx_channel *channel)
 {
index 3edfbaf..2bf4283 100644 (file)
 #define EFX_INT_ERROR_EXPIRE 3600
 #define EFX_MAX_INT_ERRORS 5
 
-/* We poll for events every FLUSH_INTERVAL ms, and check FLUSH_POLL_COUNT times
- */
-#define EFX_FLUSH_INTERVAL 10
-#define EFX_FLUSH_POLL_COUNT 100
-
-/* Size and alignment of special buffers (4KB) */
-#define EFX_BUF_SIZE 4096
-
 /* Depth of RX flush request fifo */
 #define EFX_RX_FLUSH_COUNT 4
 
-/* Generated event code for efx_generate_test_event() */
-#define EFX_CHANNEL_MAGIC_TEST(_channel)       \
-       (0x00010100 + (_channel)->channel)
-
-/* Generated event code for efx_generate_fill_event() */
-#define EFX_CHANNEL_MAGIC_FILL(_channel)       \
-       (0x00010200 + (_channel)->channel)
+/* Driver generated events */
+#define _EFX_CHANNEL_MAGIC_TEST                0x000101
+#define _EFX_CHANNEL_MAGIC_FILL                0x000102
+#define _EFX_CHANNEL_MAGIC_RX_DRAIN    0x000103
+#define _EFX_CHANNEL_MAGIC_TX_DRAIN    0x000104
+
+#define _EFX_CHANNEL_MAGIC(_code, _data)       ((_code) << 8 | (_data))
+#define _EFX_CHANNEL_MAGIC_CODE(_magic)                ((_magic) >> 8)
+
+#define EFX_CHANNEL_MAGIC_TEST(_channel)                               \
+       _EFX_CHANNEL_MAGIC(_EFX_CHANNEL_MAGIC_TEST, (_channel)->channel)
+#define EFX_CHANNEL_MAGIC_FILL(_rx_queue)                              \
+       _EFX_CHANNEL_MAGIC(_EFX_CHANNEL_MAGIC_FILL,                     \
+                          efx_rx_queue_index(_rx_queue))
+#define EFX_CHANNEL_MAGIC_RX_DRAIN(_rx_queue)                          \
+       _EFX_CHANNEL_MAGIC(_EFX_CHANNEL_MAGIC_RX_DRAIN,                 \
+                          efx_rx_queue_index(_rx_queue))
+#define EFX_CHANNEL_MAGIC_TX_DRAIN(_tx_queue)                          \
+       _EFX_CHANNEL_MAGIC(_EFX_CHANNEL_MAGIC_TX_DRAIN,                 \
+                          (_tx_queue)->queue)
 
 /**************************************************************************
  *
@@ -187,7 +192,7 @@ static void
 efx_init_special_buffer(struct efx_nic *efx, struct efx_special_buffer *buffer)
 {
        efx_qword_t buf_desc;
-       int index;
+       unsigned int index;
        dma_addr_t dma_addr;
        int i;
 
@@ -196,7 +201,7 @@ efx_init_special_buffer(struct efx_nic *efx, struct efx_special_buffer *buffer)
        /* Write buffer descriptors to NIC */
        for (i = 0; i < buffer->entries; i++) {
                index = buffer->index + i;
-               dma_addr = buffer->dma_addr + (i * 4096);
+               dma_addr = buffer->dma_addr + (i * EFX_BUF_SIZE);
                netif_dbg(efx, probe, efx->net_dev,
                          "mapping special buffer %d at %llx\n",
                          index, (unsigned long long)dma_addr);
@@ -259,6 +264,10 @@ static int efx_alloc_special_buffer(struct efx_nic *efx,
        /* Select new buffer ID */
        buffer->index = efx->next_buffer_table;
        efx->next_buffer_table += buffer->entries;
+#ifdef CONFIG_SFC_SRIOV
+       BUG_ON(efx_sriov_enabled(efx) &&
+              efx->vf_buftbl_base < efx->next_buffer_table);
+#endif
 
        netif_dbg(efx, probe, efx->net_dev,
                  "allocating special buffers %d-%d at %llx+%x "
@@ -430,8 +439,6 @@ void efx_nic_init_tx(struct efx_tx_queue *tx_queue)
        struct efx_nic *efx = tx_queue->efx;
        efx_oword_t reg;
 
-       tx_queue->flushed = FLUSH_NONE;
-
        /* Pin TX descriptor ring */
        efx_init_special_buffer(efx, &tx_queue->txd);
 
@@ -488,9 +495,6 @@ static void efx_flush_tx_queue(struct efx_tx_queue *tx_queue)
        struct efx_nic *efx = tx_queue->efx;
        efx_oword_t tx_flush_descq;
 
-       tx_queue->flushed = FLUSH_PENDING;
-
-       /* Post a flush command */
        EFX_POPULATE_OWORD_2(tx_flush_descq,
                             FRF_AZ_TX_FLUSH_DESCQ_CMD, 1,
                             FRF_AZ_TX_FLUSH_DESCQ, tx_queue->queue);
@@ -502,9 +506,6 @@ void efx_nic_fini_tx(struct efx_tx_queue *tx_queue)
        struct efx_nic *efx = tx_queue->efx;
        efx_oword_t tx_desc_ptr;
 
-       /* The queue should have been flushed */
-       WARN_ON(tx_queue->flushed != FLUSH_DONE);
-
        /* Remove TX descriptor ring from card */
        EFX_ZERO_OWORD(tx_desc_ptr);
        efx_writeo_table(efx, &tx_desc_ptr, efx->type->txd_ptr_tbl_base,
@@ -595,8 +596,6 @@ void efx_nic_init_rx(struct efx_rx_queue *rx_queue)
                  efx_rx_queue_index(rx_queue), rx_queue->rxd.index,
                  rx_queue->rxd.index + rx_queue->rxd.entries - 1);
 
-       rx_queue->flushed = FLUSH_NONE;
-
        /* Pin RX descriptor ring */
        efx_init_special_buffer(efx, &rx_queue->rxd);
 
@@ -625,9 +624,6 @@ static void efx_flush_rx_queue(struct efx_rx_queue *rx_queue)
        struct efx_nic *efx = rx_queue->efx;
        efx_oword_t rx_flush_descq;
 
-       rx_queue->flushed = FLUSH_PENDING;
-
-       /* Post a flush command */
        EFX_POPULATE_OWORD_2(rx_flush_descq,
                             FRF_AZ_RX_FLUSH_DESCQ_CMD, 1,
                             FRF_AZ_RX_FLUSH_DESCQ,
@@ -640,9 +636,6 @@ void efx_nic_fini_rx(struct efx_rx_queue *rx_queue)
        efx_oword_t rx_desc_ptr;
        struct efx_nic *efx = rx_queue->efx;
 
-       /* The queue should already have been flushed */
-       WARN_ON(rx_queue->flushed != FLUSH_DONE);
-
        /* Remove RX descriptor ring from card */
        EFX_ZERO_OWORD(rx_desc_ptr);
        efx_writeo_table(efx, &rx_desc_ptr, efx->type->rxd_ptr_tbl_base,
@@ -660,6 +653,103 @@ void efx_nic_remove_rx(struct efx_rx_queue *rx_queue)
 
 /**************************************************************************
  *
+ * Flush handling
+ *
+ **************************************************************************/
+
+/* efx_nic_flush_queues() must be woken up when all flushes are completed,
+ * or more RX flushes can be kicked off.
+ */
+static bool efx_flush_wake(struct efx_nic *efx)
+{
+       /* Ensure that all updates are visible to efx_nic_flush_queues() */
+       smp_mb();
+
+       return (atomic_read(&efx->drain_pending) == 0 ||
+               (atomic_read(&efx->rxq_flush_outstanding) < EFX_RX_FLUSH_COUNT
+                && atomic_read(&efx->rxq_flush_pending) > 0));
+}
+
+/* Flush all the transmit queues, and continue flushing receive queues until
+ * they're all flushed. Wait for the DRAIN events to be recieved so that there
+ * are no more RX and TX events left on any channel. */
+int efx_nic_flush_queues(struct efx_nic *efx)
+{
+       unsigned timeout = msecs_to_jiffies(5000); /* 5s for all flushes and drains */
+       struct efx_channel *channel;
+       struct efx_rx_queue *rx_queue;
+       struct efx_tx_queue *tx_queue;
+       int rc = 0;
+
+       efx->fc_disable++;
+       efx->type->prepare_flush(efx);
+
+       efx_for_each_channel(channel, efx) {
+               efx_for_each_channel_tx_queue(tx_queue, channel) {
+                       atomic_inc(&efx->drain_pending);
+                       efx_flush_tx_queue(tx_queue);
+               }
+               efx_for_each_channel_rx_queue(rx_queue, channel) {
+                       atomic_inc(&efx->drain_pending);
+                       rx_queue->flush_pending = true;
+                       atomic_inc(&efx->rxq_flush_pending);
+               }
+       }
+
+       while (timeout && atomic_read(&efx->drain_pending) > 0) {
+               /* If SRIOV is enabled, then offload receive queue flushing to
+                * the firmware (though we will still have to poll for
+                * completion). If that fails, fall back to the old scheme.
+                */
+               if (efx_sriov_enabled(efx)) {
+                       rc = efx_mcdi_flush_rxqs(efx);
+                       if (!rc)
+                               goto wait;
+               }
+
+               /* The hardware supports four concurrent rx flushes, each of
+                * which may need to be retried if there is an outstanding
+                * descriptor fetch
+                */
+               efx_for_each_channel(channel, efx) {
+                       efx_for_each_channel_rx_queue(rx_queue, channel) {
+                               if (atomic_read(&efx->rxq_flush_outstanding) >=
+                                   EFX_RX_FLUSH_COUNT)
+                                       break;
+
+                               if (rx_queue->flush_pending) {
+                                       rx_queue->flush_pending = false;
+                                       atomic_dec(&efx->rxq_flush_pending);
+                                       atomic_inc(&efx->rxq_flush_outstanding);
+                                       efx_flush_rx_queue(rx_queue);
+                               }
+                       }
+               }
+
+       wait:
+               timeout = wait_event_timeout(efx->flush_wq, efx_flush_wake(efx),
+                                            timeout);
+       }
+
+       if (atomic_read(&efx->drain_pending)) {
+               netif_err(efx, hw, efx->net_dev, "failed to flush %d queues "
+                         "(rx %d+%d)\n", atomic_read(&efx->drain_pending),
+                         atomic_read(&efx->rxq_flush_outstanding),
+                         atomic_read(&efx->rxq_flush_pending));
+               rc = -ETIMEDOUT;
+
+               atomic_set(&efx->drain_pending, 0);
+               atomic_set(&efx->rxq_flush_pending, 0);
+               atomic_set(&efx->rxq_flush_outstanding, 0);
+       }
+
+       efx->fc_disable--;
+
+       return rc;
+}
+
+/**************************************************************************
+ *
  * Event queue processing
  * Event queues are processed by per-channel tasklets.
  *
@@ -682,7 +772,8 @@ void efx_nic_eventq_read_ack(struct efx_channel *channel)
 }
 
 /* Use HW to insert a SW defined event */
-static void efx_generate_event(struct efx_channel *channel, efx_qword_t *event)
+void efx_generate_event(struct efx_nic *efx, unsigned int evq,
+                       efx_qword_t *event)
 {
        efx_oword_t drv_ev_reg;
 
@@ -692,8 +783,18 @@ static void efx_generate_event(struct efx_channel *channel, efx_qword_t *event)
        drv_ev_reg.u32[1] = event->u32[1];
        drv_ev_reg.u32[2] = 0;
        drv_ev_reg.u32[3] = 0;
-       EFX_SET_OWORD_FIELD(drv_ev_reg, FRF_AZ_DRV_EV_QID, channel->channel);
-       efx_writeo(channel->efx, &drv_ev_reg, FR_AZ_DRV_EV);
+       EFX_SET_OWORD_FIELD(drv_ev_reg, FRF_AZ_DRV_EV_QID, evq);
+       efx_writeo(efx, &drv_ev_reg, FR_AZ_DRV_EV);
+}
+
+static void efx_magic_event(struct efx_channel *channel, u32 magic)
+{
+       efx_qword_t event;
+
+       EFX_POPULATE_QWORD_2(event, FSF_AZ_EV_CODE,
+                            FSE_AZ_EV_CODE_DRV_GEN_EV,
+                            FSF_AZ_DRV_GEN_EV_MAGIC, magic);
+       efx_generate_event(channel->efx, channel->channel, &event);
 }
 
 /* Handle a transmit completion event
@@ -710,6 +811,9 @@ efx_handle_tx_event(struct efx_channel *channel, efx_qword_t *event)
        struct efx_nic *efx = channel->efx;
        int tx_packets = 0;
 
+       if (unlikely(ACCESS_ONCE(efx->reset_pending)))
+               return 0;
+
        if (likely(EFX_QWORD_FIELD(*event, FSF_AZ_TX_EV_COMP))) {
                /* Transmit completion */
                tx_ev_desc_ptr = EFX_QWORD_FIELD(*event, FSF_AZ_TX_EV_DESC_PTR);
@@ -726,11 +830,9 @@ efx_handle_tx_event(struct efx_channel *channel, efx_qword_t *event)
                tx_queue = efx_channel_get_tx_queue(
                        channel, tx_ev_q_label % EFX_TXQ_TYPES);
 
-               if (efx_dev_registered(efx))
-                       netif_tx_lock(efx->net_dev);
+               netif_tx_lock(efx->net_dev);
                efx_notify_tx_desc(tx_queue);
-               if (efx_dev_registered(efx))
-                       netif_tx_unlock(efx->net_dev);
+               netif_tx_unlock(efx->net_dev);
        } else if (EFX_QWORD_FIELD(*event, FSF_AZ_TX_EV_PKT_ERR) &&
                   EFX_WORKAROUND_10727(efx)) {
                efx_schedule_reset(efx, RESET_TYPE_TX_DESC_FETCH);
@@ -745,10 +847,8 @@ efx_handle_tx_event(struct efx_channel *channel, efx_qword_t *event)
 }
 
 /* Detect errors included in the rx_evt_pkt_ok bit. */
-static void efx_handle_rx_not_ok(struct efx_rx_queue *rx_queue,
-                                const efx_qword_t *event,
-                                bool *rx_ev_pkt_ok,
-                                bool *discard)
+static u16 efx_handle_rx_not_ok(struct efx_rx_queue *rx_queue,
+                               const efx_qword_t *event)
 {
        struct efx_channel *channel = efx_rx_queue_channel(rx_queue);
        struct efx_nic *efx = rx_queue->efx;
@@ -793,15 +893,11 @@ static void efx_handle_rx_not_ok(struct efx_rx_queue *rx_queue,
                        ++channel->n_rx_tcp_udp_chksum_err;
        }
 
-       /* The frame must be discarded if any of these are true. */
-       *discard = (rx_ev_eth_crc_err | rx_ev_frm_trunc | rx_ev_drib_nib |
-                   rx_ev_tobe_disc | rx_ev_pause_frm);
-
        /* TOBE_DISC is expected on unicast mismatches; don't print out an
         * error message.  FRM_TRUNC indicates RXDP dropped the packet due
         * to a FIFO overflow.
         */
-#ifdef EFX_ENABLE_DEBUG
+#ifdef DEBUG
        if (rx_ev_other_err && net_ratelimit()) {
                netif_dbg(efx, rx_err, efx->net_dev,
                          " RX queue %d unexpected RX event "
@@ -819,6 +915,11 @@ static void efx_handle_rx_not_ok(struct efx_rx_queue *rx_queue,
                          rx_ev_pause_frm ? " [PAUSE]" : "");
        }
 #endif
+
+       /* The frame must be discarded if any of these are true. */
+       return (rx_ev_eth_crc_err | rx_ev_frm_trunc | rx_ev_drib_nib |
+               rx_ev_tobe_disc | rx_ev_pause_frm) ?
+               EFX_RX_PKT_DISCARD : 0;
 }
 
 /* Handle receive events that are not in-order. */
@@ -851,8 +952,13 @@ efx_handle_rx_event(struct efx_channel *channel, const efx_qword_t *event)
        unsigned int rx_ev_desc_ptr, rx_ev_byte_cnt;
        unsigned int rx_ev_hdr_type, rx_ev_mcast_pkt;
        unsigned expected_ptr;
-       bool rx_ev_pkt_ok, discard = false, checksummed;
+       bool rx_ev_pkt_ok;
+       u16 flags;
        struct efx_rx_queue *rx_queue;
+       struct efx_nic *efx = channel->efx;
+
+       if (unlikely(ACCESS_ONCE(efx->reset_pending)))
+               return;
 
        /* Basic packet information */
        rx_ev_byte_cnt = EFX_QWORD_FIELD(*event, FSF_AZ_RX_EV_BYTE_CNT);
@@ -874,12 +980,11 @@ efx_handle_rx_event(struct efx_channel *channel, const efx_qword_t *event)
                /* If packet is marked as OK and packet type is TCP/IP or
                 * UDP/IP, then we can rely on the hardware checksum.
                 */
-               checksummed =
-                       rx_ev_hdr_type == FSE_CZ_RX_EV_HDR_TYPE_IPV4V6_TCP ||
-                       rx_ev_hdr_type == FSE_CZ_RX_EV_HDR_TYPE_IPV4V6_UDP;
+               flags = (rx_ev_hdr_type == FSE_CZ_RX_EV_HDR_TYPE_IPV4V6_TCP ||
+                        rx_ev_hdr_type == FSE_CZ_RX_EV_HDR_TYPE_IPV4V6_UDP) ?
+                       EFX_RX_PKT_CSUMMED : 0;
        } else {
-               efx_handle_rx_not_ok(rx_queue, event, &rx_ev_pkt_ok, &discard);
-               checksummed = false;
+               flags = efx_handle_rx_not_ok(rx_queue, event);
        }
 
        /* Detect multicast packets that didn't match the filter */
@@ -890,35 +995,111 @@ efx_handle_rx_event(struct efx_channel *channel, const efx_qword_t *event)
 
                if (unlikely(!rx_ev_mcast_hash_match)) {
                        ++channel->n_rx_mcast_mismatch;
-                       discard = true;
+                       flags |= EFX_RX_PKT_DISCARD;
                }
        }
 
        channel->irq_mod_score += 2;
 
        /* Handle received packet */
-       efx_rx_packet(rx_queue, rx_ev_desc_ptr, rx_ev_byte_cnt,
-                     checksummed, discard);
+       efx_rx_packet(rx_queue, rx_ev_desc_ptr, rx_ev_byte_cnt, flags);
+}
+
+/* If this flush done event corresponds to a &struct efx_tx_queue, then
+ * send an %EFX_CHANNEL_MAGIC_TX_DRAIN event to drain the event queue
+ * of all transmit completions.
+ */
+static void
+efx_handle_tx_flush_done(struct efx_nic *efx, efx_qword_t *event)
+{
+       struct efx_tx_queue *tx_queue;
+       int qid;
+
+       qid = EFX_QWORD_FIELD(*event, FSF_AZ_DRIVER_EV_SUBDATA);
+       if (qid < EFX_TXQ_TYPES * efx->n_tx_channels) {
+               tx_queue = efx_get_tx_queue(efx, qid / EFX_TXQ_TYPES,
+                                           qid % EFX_TXQ_TYPES);
+
+               efx_magic_event(tx_queue->channel,
+                               EFX_CHANNEL_MAGIC_TX_DRAIN(tx_queue));
+       }
+}
+
+/* If this flush done event corresponds to a &struct efx_rx_queue: If the flush
+ * was succesful then send an %EFX_CHANNEL_MAGIC_RX_DRAIN, otherwise add
+ * the RX queue back to the mask of RX queues in need of flushing.
+ */
+static void
+efx_handle_rx_flush_done(struct efx_nic *efx, efx_qword_t *event)
+{
+       struct efx_channel *channel;
+       struct efx_rx_queue *rx_queue;
+       int qid;
+       bool failed;
+
+       qid = EFX_QWORD_FIELD(*event, FSF_AZ_DRIVER_EV_RX_DESCQ_ID);
+       failed = EFX_QWORD_FIELD(*event, FSF_AZ_DRIVER_EV_RX_FLUSH_FAIL);
+       if (qid >= efx->n_channels)
+               return;
+       channel = efx_get_channel(efx, qid);
+       if (!efx_channel_has_rx_queue(channel))
+               return;
+       rx_queue = efx_channel_get_rx_queue(channel);
+
+       if (failed) {
+               netif_info(efx, hw, efx->net_dev,
+                          "RXQ %d flush retry\n", qid);
+               rx_queue->flush_pending = true;
+               atomic_inc(&efx->rxq_flush_pending);
+       } else {
+               efx_magic_event(efx_rx_queue_channel(rx_queue),
+                               EFX_CHANNEL_MAGIC_RX_DRAIN(rx_queue));
+       }
+       atomic_dec(&efx->rxq_flush_outstanding);
+       if (efx_flush_wake(efx))
+               wake_up(&efx->flush_wq);
+}
+
+static void
+efx_handle_drain_event(struct efx_channel *channel)
+{
+       struct efx_nic *efx = channel->efx;
+
+       WARN_ON(atomic_read(&efx->drain_pending) == 0);
+       atomic_dec(&efx->drain_pending);
+       if (efx_flush_wake(efx))
+               wake_up(&efx->flush_wq);
 }
 
 static void
 efx_handle_generated_event(struct efx_channel *channel, efx_qword_t *event)
 {
        struct efx_nic *efx = channel->efx;
-       unsigned code;
+       struct efx_rx_queue *rx_queue =
+               efx_channel_has_rx_queue(channel) ?
+               efx_channel_get_rx_queue(channel) : NULL;
+       unsigned magic, code;
 
-       code = EFX_QWORD_FIELD(*event, FSF_AZ_DRV_GEN_EV_MAGIC);
-       if (code == EFX_CHANNEL_MAGIC_TEST(channel))
-               ; /* ignore */
-       else if (code == EFX_CHANNEL_MAGIC_FILL(channel))
+       magic = EFX_QWORD_FIELD(*event, FSF_AZ_DRV_GEN_EV_MAGIC);
+       code = _EFX_CHANNEL_MAGIC_CODE(magic);
+
+       if (magic == EFX_CHANNEL_MAGIC_TEST(channel)) {
+               /* ignore */
+       } else if (rx_queue && magic == EFX_CHANNEL_MAGIC_FILL(rx_queue)) {
                /* The queue must be empty, so we won't receive any rx
                 * events, so efx_process_channel() won't refill the
                 * queue. Refill it here */
-               efx_fast_push_rx_descriptors(efx_channel_get_rx_queue(channel));
-       else
+               efx_fast_push_rx_descriptors(rx_queue);
+       } else if (rx_queue && magic == EFX_CHANNEL_MAGIC_RX_DRAIN(rx_queue)) {
+               rx_queue->enabled = false;
+               efx_handle_drain_event(channel);
+       } else if (code == _EFX_CHANNEL_MAGIC_TX_DRAIN) {
+               efx_handle_drain_event(channel);
+       } else {
                netif_dbg(efx, hw, efx->net_dev, "channel %d received "
                          "generated event "EFX_QWORD_FMT"\n",
                          channel->channel, EFX_QWORD_VAL(*event));
+       }
 }
 
 static void
@@ -935,10 +1116,14 @@ efx_handle_driver_event(struct efx_channel *channel, efx_qword_t *event)
        case FSE_AZ_TX_DESCQ_FLS_DONE_EV:
                netif_vdbg(efx, hw, efx->net_dev, "channel %d TXQ %d flushed\n",
                           channel->channel, ev_sub_data);
+               efx_handle_tx_flush_done(efx, event);
+               efx_sriov_tx_flush_done(efx, event);
                break;
        case FSE_AZ_RX_DESCQ_FLS_DONE_EV:
                netif_vdbg(efx, hw, efx->net_dev, "channel %d RXQ %d flushed\n",
                           channel->channel, ev_sub_data);
+               efx_handle_rx_flush_done(efx, event);
+               efx_sriov_rx_flush_done(efx, event);
                break;
        case FSE_AZ_EVQ_INIT_DONE_EV:
                netif_dbg(efx, hw, efx->net_dev,
@@ -970,16 +1155,24 @@ efx_handle_driver_event(struct efx_channel *channel, efx_qword_t *event)
                                   RESET_TYPE_DISABLE);
                break;
        case FSE_BZ_RX_DSC_ERROR_EV:
-               netif_err(efx, rx_err, efx->net_dev,
-                         "RX DMA Q %d reports descriptor fetch error."
-                         " RX Q %d is disabled.\n", ev_sub_data, ev_sub_data);
-               efx_schedule_reset(efx, RESET_TYPE_RX_DESC_FETCH);
+               if (ev_sub_data < EFX_VI_BASE) {
+                       netif_err(efx, rx_err, efx->net_dev,
+                                 "RX DMA Q %d reports descriptor fetch error."
+                                 " RX Q %d is disabled.\n", ev_sub_data,
+                                 ev_sub_data);
+                       efx_schedule_reset(efx, RESET_TYPE_RX_DESC_FETCH);
+               } else
+                       efx_sriov_desc_fetch_err(efx, ev_sub_data);
                break;
        case FSE_BZ_TX_DSC_ERROR_EV:
-               netif_err(efx, tx_err, efx->net_dev,
-                         "TX DMA Q %d reports descriptor fetch error."
-                         " TX Q %d is disabled.\n", ev_sub_data, ev_sub_data);
-               efx_schedule_reset(efx, RESET_TYPE_TX_DESC_FETCH);
+               if (ev_sub_data < EFX_VI_BASE) {
+                       netif_err(efx, tx_err, efx->net_dev,
+                                 "TX DMA Q %d reports descriptor fetch error."
+                                 " TX Q %d is disabled.\n", ev_sub_data,
+                                 ev_sub_data);
+                       efx_schedule_reset(efx, RESET_TYPE_TX_DESC_FETCH);
+               } else
+                       efx_sriov_desc_fetch_err(efx, ev_sub_data);
                break;
        default:
                netif_vdbg(efx, hw, efx->net_dev,
@@ -1039,6 +1232,9 @@ int efx_nic_process_eventq(struct efx_channel *channel, int budget)
                case FSE_AZ_EV_CODE_DRIVER_EV:
                        efx_handle_driver_event(channel, &event);
                        break;
+               case FSE_CZ_EV_CODE_USER_EV:
+                       efx_sriov_event(channel, &event);
+                       break;
                case FSE_CZ_EV_CODE_MCDI_EV:
                        efx_mcdi_process_event(channel, &event);
                        break;
@@ -1139,161 +1335,13 @@ void efx_nic_remove_eventq(struct efx_channel *channel)
 
 void efx_nic_generate_test_event(struct efx_channel *channel)
 {
-       unsigned int magic = EFX_CHANNEL_MAGIC_TEST(channel);
-       efx_qword_t test_event;
-
-       EFX_POPULATE_QWORD_2(test_event, FSF_AZ_EV_CODE,
-                            FSE_AZ_EV_CODE_DRV_GEN_EV,
-                            FSF_AZ_DRV_GEN_EV_MAGIC, magic);
-       efx_generate_event(channel, &test_event);
+       efx_magic_event(channel, EFX_CHANNEL_MAGIC_TEST(channel));
 }
 
-void efx_nic_generate_fill_event(struct efx_channel *channel)
+void efx_nic_generate_fill_event(struct efx_rx_queue *rx_queue)
 {
-       unsigned int magic = EFX_CHANNEL_MAGIC_FILL(channel);
-       efx_qword_t test_event;
-
-       EFX_POPULATE_QWORD_2(test_event, FSF_AZ_EV_CODE,
-                            FSE_AZ_EV_CODE_DRV_GEN_EV,
-                            FSF_AZ_DRV_GEN_EV_MAGIC, magic);
-       efx_generate_event(channel, &test_event);
-}
-
-/**************************************************************************
- *
- * Flush handling
- *
- **************************************************************************/
-
-
-static void efx_poll_flush_events(struct efx_nic *efx)
-{
-       struct efx_channel *channel = efx_get_channel(efx, 0);
-       struct efx_tx_queue *tx_queue;
-       struct efx_rx_queue *rx_queue;
-       unsigned int read_ptr = channel->eventq_read_ptr;
-       unsigned int end_ptr = read_ptr + channel->eventq_mask - 1;
-
-       do {
-               efx_qword_t *event = efx_event(channel, read_ptr);
-               int ev_code, ev_sub_code, ev_queue;
-               bool ev_failed;
-
-               if (!efx_event_present(event))
-                       break;
-
-               ev_code = EFX_QWORD_FIELD(*event, FSF_AZ_EV_CODE);
-               ev_sub_code = EFX_QWORD_FIELD(*event,
-                                             FSF_AZ_DRIVER_EV_SUBCODE);
-               if (ev_code == FSE_AZ_EV_CODE_DRIVER_EV &&
-                   ev_sub_code == FSE_AZ_TX_DESCQ_FLS_DONE_EV) {
-                       ev_queue = EFX_QWORD_FIELD(*event,
-                                                  FSF_AZ_DRIVER_EV_SUBDATA);
-                       if (ev_queue < EFX_TXQ_TYPES * efx->n_tx_channels) {
-                               tx_queue = efx_get_tx_queue(
-                                       efx, ev_queue / EFX_TXQ_TYPES,
-                                       ev_queue % EFX_TXQ_TYPES);
-                               tx_queue->flushed = FLUSH_DONE;
-                       }
-               } else if (ev_code == FSE_AZ_EV_CODE_DRIVER_EV &&
-                          ev_sub_code == FSE_AZ_RX_DESCQ_FLS_DONE_EV) {
-                       ev_queue = EFX_QWORD_FIELD(
-                               *event, FSF_AZ_DRIVER_EV_RX_DESCQ_ID);
-                       ev_failed = EFX_QWORD_FIELD(
-                               *event, FSF_AZ_DRIVER_EV_RX_FLUSH_FAIL);
-                       if (ev_queue < efx->n_rx_channels) {
-                               rx_queue = efx_get_rx_queue(efx, ev_queue);
-                               rx_queue->flushed =
-                                       ev_failed ? FLUSH_FAILED : FLUSH_DONE;
-                       }
-               }
-
-               /* We're about to destroy the queue anyway, so
-                * it's ok to throw away every non-flush event */
-               EFX_SET_QWORD(*event);
-
-               ++read_ptr;
-       } while (read_ptr != end_ptr);
-
-       channel->eventq_read_ptr = read_ptr;
-}
-
-/* Handle tx and rx flushes at the same time, since they run in
- * parallel in the hardware and there's no reason for us to
- * serialise them */
-int efx_nic_flush_queues(struct efx_nic *efx)
-{
-       struct efx_channel *channel;
-       struct efx_rx_queue *rx_queue;
-       struct efx_tx_queue *tx_queue;
-       int i, tx_pending, rx_pending;
-
-       /* If necessary prepare the hardware for flushing */
-       efx->type->prepare_flush(efx);
-
-       /* Flush all tx queues in parallel */
-       efx_for_each_channel(channel, efx) {
-               efx_for_each_possible_channel_tx_queue(tx_queue, channel) {
-                       if (tx_queue->initialised)
-                               efx_flush_tx_queue(tx_queue);
-               }
-       }
-
-       /* The hardware supports four concurrent rx flushes, each of which may
-        * need to be retried if there is an outstanding descriptor fetch */
-       for (i = 0; i < EFX_FLUSH_POLL_COUNT; ++i) {
-               rx_pending = tx_pending = 0;
-               efx_for_each_channel(channel, efx) {
-                       efx_for_each_channel_rx_queue(rx_queue, channel) {
-                               if (rx_queue->flushed == FLUSH_PENDING)
-                                       ++rx_pending;
-                       }
-               }
-               efx_for_each_channel(channel, efx) {
-                       efx_for_each_channel_rx_queue(rx_queue, channel) {
-                               if (rx_pending == EFX_RX_FLUSH_COUNT)
-                                       break;
-                               if (rx_queue->flushed == FLUSH_FAILED ||
-                                   rx_queue->flushed == FLUSH_NONE) {
-                                       efx_flush_rx_queue(rx_queue);
-                                       ++rx_pending;
-                               }
-                       }
-                       efx_for_each_possible_channel_tx_queue(tx_queue, channel) {
-                               if (tx_queue->initialised &&
-                                   tx_queue->flushed != FLUSH_DONE)
-                                       ++tx_pending;
-                       }
-               }
-
-               if (rx_pending == 0 && tx_pending == 0)
-                       return 0;
-
-               msleep(EFX_FLUSH_INTERVAL);
-               efx_poll_flush_events(efx);
-       }
-
-       /* Mark the queues as all flushed. We're going to return failure
-        * leading to a reset, or fake up success anyway */
-       efx_for_each_channel(channel, efx) {
-               efx_for_each_possible_channel_tx_queue(tx_queue, channel) {
-                       if (tx_queue->initialised &&
-                           tx_queue->flushed != FLUSH_DONE)
-                               netif_err(efx, hw, efx->net_dev,
-                                         "tx queue %d flush command timed out\n",
-                                         tx_queue->queue);
-                       tx_queue->flushed = FLUSH_DONE;
-               }
-               efx_for_each_channel_rx_queue(rx_queue, channel) {
-                       if (rx_queue->flushed != FLUSH_DONE)
-                               netif_err(efx, hw, efx->net_dev,
-                                         "rx queue %d flush command timed out\n",
-                                         efx_rx_queue_index(rx_queue));
-                       rx_queue->flushed = FLUSH_DONE;
-               }
-       }
-
-       return -ETIMEDOUT;
+       efx_magic_event(efx_rx_queue_channel(rx_queue),
+                       EFX_CHANNEL_MAGIC_FILL(rx_queue));
 }
 
 /**************************************************************************
@@ -1311,7 +1359,7 @@ static inline void efx_nic_interrupts(struct efx_nic *efx,
        efx_oword_t int_en_reg_ker;
 
        EFX_POPULATE_OWORD_3(int_en_reg_ker,
-                            FRF_AZ_KER_INT_LEVE_SEL, efx->fatal_irq_level,
+                            FRF_AZ_KER_INT_LEVE_SEL, efx->irq_level,
                             FRF_AZ_KER_INT_KER, force,
                             FRF_AZ_DRV_INT_EN_KER, enabled);
        efx_writeo(efx, &int_en_reg_ker, FR_AZ_INT_EN_KER);
@@ -1319,18 +1367,10 @@ static inline void efx_nic_interrupts(struct efx_nic *efx,
 
 void efx_nic_enable_interrupts(struct efx_nic *efx)
 {
-       struct efx_channel *channel;
-
        EFX_ZERO_OWORD(*((efx_oword_t *) efx->irq_status.addr));
        wmb(); /* Ensure interrupt vector is clear before interrupts enabled */
 
-       /* Enable interrupts */
        efx_nic_interrupts(efx, true, false);
-
-       /* Force processing of all the channels to get the EVQ RPTRs up to
-          date */
-       efx_for_each_channel(channel, efx)
-               efx_schedule_channel(channel);
 }
 
 void efx_nic_disable_interrupts(struct efx_nic *efx)
@@ -1427,11 +1467,12 @@ static irqreturn_t efx_legacy_interrupt(int irq, void *dev_id)
        efx_readd(efx, &reg, FR_BZ_INT_ISR0);
        queues = EFX_EXTRACT_DWORD(reg, 0, 31);
 
-       /* Check to see if we have a serious error condition */
-       if (queues & (1U << efx->fatal_irq_level)) {
+       /* Handle non-event-queue sources */
+       if (queues & (1U << efx->irq_level)) {
                syserr = EFX_OWORD_FIELD(*int_ker, FSF_AZ_NET_IVEC_FATAL_INT);
                if (unlikely(syserr))
                        return efx_nic_fatal_interrupt(efx);
+               efx->last_irq_cpu = raw_smp_processor_id();
        }
 
        if (queues != 0) {
@@ -1441,7 +1482,7 @@ static irqreturn_t efx_legacy_interrupt(int irq, void *dev_id)
                /* Schedule processing of any interrupting queues */
                efx_for_each_channel(channel, efx) {
                        if (queues & 1)
-                               efx_schedule_channel(channel);
+                               efx_schedule_channel_irq(channel);
                        queues >>= 1;
                }
                result = IRQ_HANDLED;
@@ -1458,18 +1499,16 @@ static irqreturn_t efx_legacy_interrupt(int irq, void *dev_id)
                efx_for_each_channel(channel, efx) {
                        event = efx_event(channel, channel->eventq_read_ptr);
                        if (efx_event_present(event))
-                               efx_schedule_channel(channel);
+                               efx_schedule_channel_irq(channel);
                        else
                                efx_nic_eventq_read_ack(channel);
                }
        }
 
-       if (result == IRQ_HANDLED) {
-               efx->last_irq_cpu = raw_smp_processor_id();
+       if (result == IRQ_HANDLED)
                netif_vdbg(efx, intr, efx->net_dev,
                           "IRQ %d on CPU %d status " EFX_DWORD_FMT "\n",
                           irq, raw_smp_processor_id(), EFX_DWORD_VAL(reg));
-       }
 
        return result;
 }
@@ -1488,20 +1527,20 @@ static irqreturn_t efx_msi_interrupt(int irq, void *dev_id)
        efx_oword_t *int_ker = efx->irq_status.addr;
        int syserr;
 
-       efx->last_irq_cpu = raw_smp_processor_id();
        netif_vdbg(efx, intr, efx->net_dev,
                   "IRQ %d on CPU %d status " EFX_OWORD_FMT "\n",
                   irq, raw_smp_processor_id(), EFX_OWORD_VAL(*int_ker));
 
-       /* Check to see if we have a serious error condition */
-       if (channel->channel == efx->fatal_irq_level) {
+       /* Handle non-event-queue sources */
+       if (channel->channel == efx->irq_level) {
                syserr = EFX_OWORD_FIELD(*int_ker, FSF_AZ_NET_IVEC_FATAL_INT);
                if (unlikely(syserr))
                        return efx_nic_fatal_interrupt(efx);
+               efx->last_irq_cpu = raw_smp_processor_id();
        }
 
        /* Schedule processing of the channel */
-       efx_schedule_channel(channel);
+       efx_schedule_channel_irq(channel);
 
        return IRQ_HANDLED;
 }
@@ -1598,6 +1637,58 @@ void efx_nic_fini_interrupt(struct efx_nic *efx)
                free_irq(efx->legacy_irq, efx);
 }
 
+/* Looks at available SRAM resources and works out how many queues we
+ * can support, and where things like descriptor caches should live.
+ *
+ * SRAM is split up as follows:
+ * 0                          buftbl entries for channels
+ * efx->vf_buftbl_base        buftbl entries for SR-IOV
+ * efx->rx_dc_base            RX descriptor caches
+ * efx->tx_dc_base            TX descriptor caches
+ */
+void efx_nic_dimension_resources(struct efx_nic *efx, unsigned sram_lim_qw)
+{
+       unsigned vi_count, buftbl_min;
+
+       /* Account for the buffer table entries backing the datapath channels
+        * and the descriptor caches for those channels.
+        */
+       buftbl_min = ((efx->n_rx_channels * EFX_MAX_DMAQ_SIZE +
+                      efx->n_tx_channels * EFX_TXQ_TYPES * EFX_MAX_DMAQ_SIZE +
+                      efx->n_channels * EFX_MAX_EVQ_SIZE)
+                     * sizeof(efx_qword_t) / EFX_BUF_SIZE);
+       vi_count = max(efx->n_channels, efx->n_tx_channels * EFX_TXQ_TYPES);
+
+#ifdef CONFIG_SFC_SRIOV
+       if (efx_sriov_wanted(efx)) {
+               unsigned vi_dc_entries, buftbl_free, entries_per_vf, vf_limit;
+
+               efx->vf_buftbl_base = buftbl_min;
+
+               vi_dc_entries = RX_DC_ENTRIES + TX_DC_ENTRIES;
+               vi_count = max(vi_count, EFX_VI_BASE);
+               buftbl_free = (sram_lim_qw - buftbl_min -
+                              vi_count * vi_dc_entries);
+
+               entries_per_vf = ((vi_dc_entries + EFX_VF_BUFTBL_PER_VI) *
+                                 efx_vf_size(efx));
+               vf_limit = min(buftbl_free / entries_per_vf,
+                              (1024U - EFX_VI_BASE) >> efx->vi_scale);
+
+               if (efx->vf_count > vf_limit) {
+                       netif_err(efx, probe, efx->net_dev,
+                                 "Reducing VF count from from %d to %d\n",
+                                 efx->vf_count, vf_limit);
+                       efx->vf_count = vf_limit;
+               }
+               vi_count += efx->vf_count * efx_vf_size(efx);
+       }
+#endif
+
+       efx->tx_dc_base = sram_lim_qw - vi_count * TX_DC_ENTRIES;
+       efx->rx_dc_base = efx->tx_dc_base - vi_count * RX_DC_ENTRIES;
+}
+
 u32 efx_nic_fpga_ver(struct efx_nic *efx)
 {
        efx_oword_t altera_build;
@@ -1610,11 +1701,9 @@ void efx_nic_init_common(struct efx_nic *efx)
        efx_oword_t temp;
 
        /* Set positions of descriptor caches in SRAM. */
-       EFX_POPULATE_OWORD_1(temp, FRF_AZ_SRM_TX_DC_BASE_ADR,
-                            efx->type->tx_dc_base / 8);
+       EFX_POPULATE_OWORD_1(temp, FRF_AZ_SRM_TX_DC_BASE_ADR, efx->tx_dc_base);
        efx_writeo(efx, &temp, FR_AZ_SRM_TX_DC_CFG);
-       EFX_POPULATE_OWORD_1(temp, FRF_AZ_SRM_RX_DC_BASE_ADR,
-                            efx->type->rx_dc_base / 8);
+       EFX_POPULATE_OWORD_1(temp, FRF_AZ_SRM_RX_DC_BASE_ADR, efx->rx_dc_base);
        efx_writeo(efx, &temp, FR_AZ_SRM_RX_DC_CFG);
 
        /* Set TX descriptor cache size. */
@@ -1640,10 +1729,10 @@ void efx_nic_init_common(struct efx_nic *efx)
 
        if (EFX_WORKAROUND_17213(efx) && !EFX_INT_MODE_USE_MSI(efx))
                /* Use an interrupt level unused by event queues */
-               efx->fatal_irq_level = 0x1f;
+               efx->irq_level = 0x1f;
        else
                /* Use a valid MSI-X vector */
-               efx->fatal_irq_level = 0;
+               efx->irq_level = 0;
 
        /* Enable all the genuinely fatal interrupts.  (They are still
         * masked by the overall interrupt mask, controlled by
@@ -1837,7 +1926,7 @@ struct efx_nic_reg_table {
        REGISTER_REVISION_ ## min_rev, REGISTER_REVISION_ ## max_rev,   \
        step, rows                                                      \
 }
-#define REGISTER_TABLE(name, min_rev, max_rev)                                 \
+#define REGISTER_TABLE(name, min_rev, max_rev)                         \
        REGISTER_TABLE_DIMENSIONS(                                      \
                name, FR_ ## min_rev ## max_rev ## _ ## name,           \
                min_rev, max_rev,                                       \
index 5fb24d3..246c414 100644 (file)
@@ -65,6 +65,11 @@ enum {
 #define FALCON_GMAC_LOOPBACKS                  \
        (1 << LOOPBACK_GMAC)
 
+/* Alignment of PCIe DMA boundaries (4KB) */
+#define EFX_PAGE_SIZE  4096
+/* Size and alignment of buffer table entries (same) */
+#define EFX_BUF_SIZE   EFX_PAGE_SIZE
+
 /**
  * struct falcon_board_type - board operations and type information
  * @id: Board type id, as found in NVRAM
@@ -144,12 +149,115 @@ static inline struct falcon_board *falcon_board(struct efx_nic *efx)
  * struct siena_nic_data - Siena NIC state
  * @mcdi: Management-Controller-to-Driver Interface
  * @wol_filter_id: Wake-on-LAN packet filter id
+ * @hwmon: Hardware monitor state
  */
 struct siena_nic_data {
        struct efx_mcdi_iface mcdi;
        int wol_filter_id;
+#ifdef CONFIG_SFC_MCDI_MON
+       struct efx_mcdi_mon hwmon;
+#endif
 };
 
+#ifdef CONFIG_SFC_MCDI_MON
+static inline struct efx_mcdi_mon *efx_mcdi_mon(struct efx_nic *efx)
+{
+       struct siena_nic_data *nic_data;
+       EFX_BUG_ON_PARANOID(efx_nic_rev(efx) < EFX_REV_SIENA_A0);
+       nic_data = efx->nic_data;
+       return &nic_data->hwmon;
+}
+#endif
+
+/*
+ * On the SFC9000 family each port is associated with 1 PCI physical
+ * function (PF) handled by sfc and a configurable number of virtual
+ * functions (VFs) that may be handled by some other driver, often in
+ * a VM guest.  The queue pointer registers are mapped in both PF and
+ * VF BARs such that an 8K region provides access to a single RX, TX
+ * and event queue (collectively a Virtual Interface, VI or VNIC).
+ *
+ * The PF has access to all 1024 VIs while VFs are mapped to VIs
+ * according to VI_BASE and VI_SCALE: VF i has access to VIs numbered
+ * in range [VI_BASE + i << VI_SCALE, VI_BASE + i + 1 << VI_SCALE).
+ * The number of VIs and the VI_SCALE value are configurable but must
+ * be established at boot time by firmware.
+ */
+
+/* Maximum VI_SCALE parameter supported by Siena */
+#define EFX_VI_SCALE_MAX 6
+/* Base VI to use for SR-IOV. Must be aligned to (1 << EFX_VI_SCALE_MAX),
+ * so this is the smallest allowed value. */
+#define EFX_VI_BASE 128U
+/* Maximum number of VFs allowed */
+#define EFX_VF_COUNT_MAX 127
+/* Limit EVQs on VFs to be only 8k to reduce buffer table reservation */
+#define EFX_MAX_VF_EVQ_SIZE 8192UL
+/* The number of buffer table entries reserved for each VI on a VF */
+#define EFX_VF_BUFTBL_PER_VI                                   \
+       ((EFX_MAX_VF_EVQ_SIZE + 2 * EFX_MAX_DMAQ_SIZE) *        \
+        sizeof(efx_qword_t) / EFX_BUF_SIZE)
+
+#ifdef CONFIG_SFC_SRIOV
+
+static inline bool efx_sriov_wanted(struct efx_nic *efx)
+{
+       return efx->vf_count != 0;
+}
+static inline bool efx_sriov_enabled(struct efx_nic *efx)
+{
+       return efx->vf_init_count != 0;
+}
+static inline unsigned int efx_vf_size(struct efx_nic *efx)
+{
+       return 1 << efx->vi_scale;
+}
+
+extern int efx_init_sriov(void);
+extern void efx_sriov_probe(struct efx_nic *efx);
+extern int efx_sriov_init(struct efx_nic *efx);
+extern void efx_sriov_mac_address_changed(struct efx_nic *efx);
+extern void efx_sriov_tx_flush_done(struct efx_nic *efx, efx_qword_t *event);
+extern void efx_sriov_rx_flush_done(struct efx_nic *efx, efx_qword_t *event);
+extern void efx_sriov_event(struct efx_channel *channel, efx_qword_t *event);
+extern void efx_sriov_desc_fetch_err(struct efx_nic *efx, unsigned dmaq);
+extern void efx_sriov_flr(struct efx_nic *efx, unsigned flr);
+extern void efx_sriov_reset(struct efx_nic *efx);
+extern void efx_sriov_fini(struct efx_nic *efx);
+extern void efx_fini_sriov(void);
+
+#else
+
+static inline bool efx_sriov_wanted(struct efx_nic *efx) { return false; }
+static inline bool efx_sriov_enabled(struct efx_nic *efx) { return false; }
+static inline unsigned int efx_vf_size(struct efx_nic *efx) { return 0; }
+
+static inline int efx_init_sriov(void) { return 0; }
+static inline void efx_sriov_probe(struct efx_nic *efx) {}
+static inline int efx_sriov_init(struct efx_nic *efx) { return -EOPNOTSUPP; }
+static inline void efx_sriov_mac_address_changed(struct efx_nic *efx) {}
+static inline void efx_sriov_tx_flush_done(struct efx_nic *efx,
+                                          efx_qword_t *event) {}
+static inline void efx_sriov_rx_flush_done(struct efx_nic *efx,
+                                          efx_qword_t *event) {}
+static inline void efx_sriov_event(struct efx_channel *channel,
+                                  efx_qword_t *event) {}
+static inline void efx_sriov_desc_fetch_err(struct efx_nic *efx, unsigned dmaq) {}
+static inline void efx_sriov_flr(struct efx_nic *efx, unsigned flr) {}
+static inline void efx_sriov_reset(struct efx_nic *efx) {}
+static inline void efx_sriov_fini(struct efx_nic *efx) {}
+static inline void efx_fini_sriov(void) {}
+
+#endif
+
+extern int efx_sriov_set_vf_mac(struct net_device *dev, int vf, u8 *mac);
+extern int efx_sriov_set_vf_vlan(struct net_device *dev, int vf,
+                                u16 vlan, u8 qos);
+extern int efx_sriov_get_vf_config(struct net_device *dev, int vf,
+                                  struct ifla_vf_info *ivf);
+extern int efx_sriov_set_vf_spoofchk(struct net_device *net_dev, int vf,
+                                    bool spoofchk);
+
 extern const struct efx_nic_type falcon_a1_nic_type;
 extern const struct efx_nic_type falcon_b0_nic_type;
 extern const struct efx_nic_type siena_a0_nic_type;
@@ -176,6 +284,7 @@ extern void efx_nic_init_rx(struct efx_rx_queue *rx_queue);
 extern void efx_nic_fini_rx(struct efx_rx_queue *rx_queue);
 extern void efx_nic_remove_rx(struct efx_rx_queue *rx_queue);
 extern void efx_nic_notify_rx_desc(struct efx_rx_queue *rx_queue);
+extern void efx_nic_generate_fill_event(struct efx_rx_queue *rx_queue);
 
 /* Event data path */
 extern int efx_nic_probe_eventq(struct efx_channel *channel);
@@ -189,12 +298,14 @@ extern bool efx_nic_event_present(struct efx_channel *channel);
 /* MAC/PHY */
 extern void falcon_drain_tx_fifo(struct efx_nic *efx);
 extern void falcon_reconfigure_mac_wrapper(struct efx_nic *efx);
+extern bool falcon_xmac_check_fault(struct efx_nic *efx);
+extern int falcon_reconfigure_xmac(struct efx_nic *efx);
+extern void falcon_update_stats_xmac(struct efx_nic *efx);
 
 /* Interrupts and test events */
 extern int efx_nic_init_interrupt(struct efx_nic *efx);
 extern void efx_nic_enable_interrupts(struct efx_nic *efx);
 extern void efx_nic_generate_test_event(struct efx_channel *channel);
-extern void efx_nic_generate_fill_event(struct efx_channel *channel);
 extern void efx_nic_generate_interrupt(struct efx_nic *efx);
 extern void efx_nic_disable_interrupts(struct efx_nic *efx);
 extern void efx_nic_fini_interrupt(struct efx_nic *efx);
@@ -202,15 +313,14 @@ extern irqreturn_t efx_nic_fatal_interrupt(struct efx_nic *efx);
 extern irqreturn_t falcon_legacy_interrupt_a1(int irq, void *dev_id);
 extern void falcon_irq_ack_a1(struct efx_nic *efx);
 
-#define EFX_IRQ_MOD_RESOLUTION 5
-#define EFX_IRQ_MOD_MAX                0x1000
-
 /* Global Resources */
 extern int efx_nic_flush_queues(struct efx_nic *efx);
 extern void falcon_start_nic_stats(struct efx_nic *efx);
 extern void falcon_stop_nic_stats(struct efx_nic *efx);
 extern void falcon_setup_xaui(struct efx_nic *efx);
 extern int falcon_reset_xaui(struct efx_nic *efx);
+extern void
+efx_nic_dimension_resources(struct efx_nic *efx, unsigned sram_lim_qw);
 extern void efx_nic_init_common(struct efx_nic *efx);
 extern void efx_nic_push_rx_indir_table(struct efx_nic *efx);
 
@@ -264,8 +374,8 @@ extern void efx_nic_get_regs(struct efx_nic *efx, void *buf);
 #define MAC_DATA_LBN 0
 #define MAC_DATA_WIDTH 32
 
-extern void efx_nic_generate_event(struct efx_channel *channel,
-                                  efx_qword_t *event);
+extern void efx_generate_event(struct efx_nic *efx, unsigned int evq,
+                              efx_qword_t *event);
 
 extern void falcon_poll_xmac(struct efx_nic *efx);
 
index 7ad97e3..8a7caf8 100644 (file)
@@ -47,7 +47,7 @@
 #define PMA_PMD_FTX_STATIC_LBN 13
 #define PMA_PMD_VEND1_REG      0xc001
 #define PMA_PMD_VEND1_LBTXD_LBN        15
-#define PCS_VEND1_REG          0xc000
+#define PCS_VEND1_REG          0xc000
 #define PCS_VEND1_LBTXD_LBN    5
 
 void falcon_qt202x_set_led(struct efx_nic *p, int led, int mode)
@@ -453,9 +453,9 @@ const struct efx_phy_operations falcon_qt202x_phy_ops = {
        .probe           = qt202x_phy_probe,
        .init            = qt202x_phy_init,
        .reconfigure     = qt202x_phy_reconfigure,
-       .poll            = qt202x_phy_poll,
+       .poll            = qt202x_phy_poll,
        .fini            = efx_port_dummy_op_void,
-       .remove          = qt202x_phy_remove,
+       .remove          = qt202x_phy_remove,
        .get_settings    = qt202x_phy_get_settings,
        .set_settings    = efx_mdio_set_settings,
        .test_alive      = efx_mdio_test_alive,
index cc2c86b..ade4c4d 100644 (file)
 #define        FRF_CZ_RMFT_RXQ_ID_WIDTH 12
 #define        FRF_CZ_RMFT_WILDCARD_MATCH_LBN 60
 #define        FRF_CZ_RMFT_WILDCARD_MATCH_WIDTH 1
-#define        FRF_CZ_RMFT_DEST_MAC_LBN 16
-#define        FRF_CZ_RMFT_DEST_MAC_WIDTH 44
+#define        FRF_CZ_RMFT_DEST_MAC_LBN 12
+#define        FRF_CZ_RMFT_DEST_MAC_WIDTH 48
 #define        FRF_CZ_RMFT_VLAN_ID_LBN 0
 #define        FRF_CZ_RMFT_VLAN_ID_WIDTH 12
 
 #define        FRF_CZ_TMFT_TXQ_ID_WIDTH 12
 #define        FRF_CZ_TMFT_WILDCARD_MATCH_LBN 60
 #define        FRF_CZ_TMFT_WILDCARD_MATCH_WIDTH 1
-#define        FRF_CZ_TMFT_SRC_MAC_LBN 16
-#define        FRF_CZ_TMFT_SRC_MAC_WIDTH 44
+#define        FRF_CZ_TMFT_SRC_MAC_LBN 12
+#define        FRF_CZ_TMFT_SRC_MAC_WIDTH 48
 #define        FRF_CZ_TMFT_VLAN_ID_LBN 0
 #define        FRF_CZ_TMFT_VLAN_ID_WIDTH 12
 
 
 /* RX_MAC_FILTER_TBL0 */
 /* RMFT_DEST_MAC is wider than 32 bits */
-#define FRF_CZ_RMFT_DEST_MAC_LO_LBN 12
+#define FRF_CZ_RMFT_DEST_MAC_LO_LBN FRF_CZ_RMFT_DEST_MAC_LBN
 #define FRF_CZ_RMFT_DEST_MAC_LO_WIDTH 32
-#define FRF_CZ_RMFT_DEST_MAC_HI_LBN 44
-#define FRF_CZ_RMFT_DEST_MAC_HI_WIDTH 16
+#define FRF_CZ_RMFT_DEST_MAC_HI_LBN (FRF_CZ_RMFT_DEST_MAC_LBN + 32)
+#define FRF_CZ_RMFT_DEST_MAC_HI_WIDTH (FRF_CZ_RMFT_DEST_MAC_WIDTH - 32)
 
 /* TX_MAC_FILTER_TBL0 */
 /* TMFT_SRC_MAC is wider than 32 bits */
-#define FRF_CZ_TMFT_SRC_MAC_LO_LBN 12
+#define FRF_CZ_TMFT_SRC_MAC_LO_LBN FRF_CZ_TMFT_SRC_MAC_LBN
 #define FRF_CZ_TMFT_SRC_MAC_LO_WIDTH 32
-#define FRF_CZ_TMFT_SRC_MAC_HI_LBN 44
-#define FRF_CZ_TMFT_SRC_MAC_HI_WIDTH 16
+#define FRF_CZ_TMFT_SRC_MAC_HI_LBN (FRF_CZ_TMFT_SRC_MAC_LBN + 32)
+#define FRF_CZ_TMFT_SRC_MAC_HI_WIDTH (FRF_CZ_TMFT_SRC_MAC_WIDTH - 32)
 
 /* TX_PACE_TBL */
 /* Values >20 are documented as reserved, but will result in a queue going
index fc52fca..1ba290d 100644 (file)
@@ -98,8 +98,8 @@ static inline unsigned int efx_rx_buf_offset(struct efx_nic *efx,
        /* Offset is always within one page, so we don't need to consider
         * the page order.
         */
-       return (((__force unsigned long) buf->dma_addr & (PAGE_SIZE - 1)) +
-               efx->type->rx_buffer_hash_size);
+       return ((unsigned int) buf->dma_addr & (PAGE_SIZE - 1)) +
+               efx->type->rx_buffer_hash_size;
 }
 static inline unsigned int efx_rx_buf_size(struct efx_nic *efx)
 {
@@ -108,11 +108,10 @@ static inline unsigned int efx_rx_buf_size(struct efx_nic *efx)
 
 static u8 *efx_rx_buf_eh(struct efx_nic *efx, struct efx_rx_buffer *buf)
 {
-       if (buf->is_page)
+       if (buf->flags & EFX_RX_BUF_PAGE)
                return page_address(buf->u.page) + efx_rx_buf_offset(efx, buf);
        else
-               return ((u8 *)buf->u.skb->data +
-                       efx->type->rx_buffer_hash_size);
+               return (u8 *)buf->u.skb->data + efx->type->rx_buffer_hash_size;
 }
 
 static inline u32 efx_rx_buf_hash(const u8 *eh)
@@ -122,10 +121,10 @@ static inline u32 efx_rx_buf_hash(const u8 *eh)
        return __le32_to_cpup((const __le32 *)(eh - 4));
 #else
        const u8 *data = eh - 4;
-       return ((u32)data[0]       |
-               (u32)data[1] << 8  |
-               (u32)data[2] << 16 |
-               (u32)data[3] << 24);
+       return (u32)data[0]       |
+              (u32)data[1] << 8  |
+              (u32)data[2] << 16 |
+              (u32)data[3] << 24;
 #endif
 }
 
@@ -159,7 +158,7 @@ static int efx_init_rx_buffers_skb(struct efx_rx_queue *rx_queue)
                /* Adjust the SKB for padding */
                skb_reserve(skb, NET_IP_ALIGN);
                rx_buf->len = skb_len - NET_IP_ALIGN;
-               rx_buf->is_page = false;
+               rx_buf->flags = 0;
 
                rx_buf->dma_addr = pci_map_single(efx->pci_dev,
                                                  skb->data, rx_buf->len,
@@ -227,7 +226,7 @@ static int efx_init_rx_buffers_page(struct efx_rx_queue *rx_queue)
                rx_buf->dma_addr = dma_addr + EFX_PAGE_IP_ALIGN;
                rx_buf->u.page = page;
                rx_buf->len = efx->rx_buffer_len - EFX_PAGE_IP_ALIGN;
-               rx_buf->is_page = true;
+               rx_buf->flags = EFX_RX_BUF_PAGE;
                ++rx_queue->added_count;
                ++rx_queue->alloc_page_count;
                ++state->refcnt;
@@ -248,7 +247,7 @@ static int efx_init_rx_buffers_page(struct efx_rx_queue *rx_queue)
 static void efx_unmap_rx_buffer(struct efx_nic *efx,
                                struct efx_rx_buffer *rx_buf)
 {
-       if (rx_buf->is_page && rx_buf->u.page) {
+       if ((rx_buf->flags & EFX_RX_BUF_PAGE) && rx_buf->u.page) {
                struct efx_rx_page_state *state;
 
                state = page_address(rx_buf->u.page);
@@ -258,7 +257,7 @@ static void efx_unmap_rx_buffer(struct efx_nic *efx,
                                       efx_rx_buf_size(efx),
                                       PCI_DMA_FROMDEVICE);
                }
-       } else if (!rx_buf->is_page && rx_buf->u.skb) {
+       } else if (!(rx_buf->flags & EFX_RX_BUF_PAGE) && rx_buf->u.skb) {
                pci_unmap_single(efx->pci_dev, rx_buf->dma_addr,
                                 rx_buf->len, PCI_DMA_FROMDEVICE);
        }
@@ -267,10 +266,10 @@ static void efx_unmap_rx_buffer(struct efx_nic *efx,
 static void efx_free_rx_buffer(struct efx_nic *efx,
                               struct efx_rx_buffer *rx_buf)
 {
-       if (rx_buf->is_page && rx_buf->u.page) {
+       if ((rx_buf->flags & EFX_RX_BUF_PAGE) && rx_buf->u.page) {
                __free_pages(rx_buf->u.page, efx->rx_buffer_order);
                rx_buf->u.page = NULL;
-       } else if (!rx_buf->is_page && rx_buf->u.skb) {
+       } else if (!(rx_buf->flags & EFX_RX_BUF_PAGE) && rx_buf->u.skb) {
                dev_kfree_skb_any(rx_buf->u.skb);
                rx_buf->u.skb = NULL;
        }
@@ -310,7 +309,7 @@ static void efx_resurrect_rx_buffer(struct efx_rx_queue *rx_queue,
        new_buf->dma_addr = rx_buf->dma_addr ^ (PAGE_SIZE >> 1);
        new_buf->u.page = rx_buf->u.page;
        new_buf->len = rx_buf->len;
-       new_buf->is_page = true;
+       new_buf->flags = EFX_RX_BUF_PAGE;
        ++rx_queue->added_count;
 }
 
@@ -324,7 +323,10 @@ static void efx_recycle_rx_buffer(struct efx_channel *channel,
        struct efx_rx_buffer *new_buf;
        unsigned index;
 
-       if (rx_buf->is_page && efx->rx_buffer_len <= EFX_RX_HALF_PAGE &&
+       rx_buf->flags &= EFX_RX_BUF_PAGE;
+
+       if ((rx_buf->flags & EFX_RX_BUF_PAGE) &&
+           efx->rx_buffer_len <= EFX_RX_HALF_PAGE &&
            page_count(rx_buf->u.page) == 1)
                efx_resurrect_rx_buffer(rx_queue, rx_buf);
 
@@ -402,17 +404,15 @@ void efx_fast_push_rx_descriptors(struct efx_rx_queue *rx_queue)
 void efx_rx_slow_fill(unsigned long context)
 {
        struct efx_rx_queue *rx_queue = (struct efx_rx_queue *)context;
-       struct efx_channel *channel = efx_rx_queue_channel(rx_queue);
 
        /* Post an event to cause NAPI to run and refill the queue */
-       efx_nic_generate_fill_event(channel);
+       efx_nic_generate_fill_event(rx_queue);
        ++rx_queue->slow_fill_count;
 }
 
 static void efx_rx_packet__check_len(struct efx_rx_queue *rx_queue,
                                     struct efx_rx_buffer *rx_buf,
-                                    int len, bool *discard,
-                                    bool *leak_packet)
+                                    int len, bool *leak_packet)
 {
        struct efx_nic *efx = rx_queue->efx;
        unsigned max_len = rx_buf->len - efx->type->rx_buffer_padding;
@@ -423,7 +423,7 @@ static void efx_rx_packet__check_len(struct efx_rx_queue *rx_queue,
        /* The packet must be discarded, but this is only a fatal error
         * if the caller indicated it was
         */
-       *discard = true;
+       rx_buf->flags |= EFX_RX_PKT_DISCARD;
 
        if ((len > rx_buf->len) && EFX_WORKAROUND_8071(efx)) {
                if (net_ratelimit())
@@ -436,7 +436,7 @@ static void efx_rx_packet__check_len(struct efx_rx_queue *rx_queue,
                 * data at the end of the skb will be trashed. So
                 * we have no choice but to leak the fragment.
                 */
-               *leak_packet = !rx_buf->is_page;
+               *leak_packet = !(rx_buf->flags & EFX_RX_BUF_PAGE);
                efx_schedule_reset(efx, RESET_TYPE_RX_RECOVERY);
        } else {
                if (net_ratelimit())
@@ -456,13 +456,13 @@ static void efx_rx_packet__check_len(struct efx_rx_queue *rx_queue,
  */
 static void efx_rx_packet_gro(struct efx_channel *channel,
                              struct efx_rx_buffer *rx_buf,
-                             const u8 *eh, bool checksummed)
+                             const u8 *eh)
 {
        struct napi_struct *napi = &channel->napi_str;
        gro_result_t gro_result;
 
        /* Pass the skb/page into the GRO engine */
-       if (rx_buf->is_page) {
+       if (rx_buf->flags & EFX_RX_BUF_PAGE) {
                struct efx_nic *efx = channel->efx;
                struct page *page = rx_buf->u.page;
                struct sk_buff *skb;
@@ -484,8 +484,8 @@ static void efx_rx_packet_gro(struct efx_channel *channel,
                skb->len = rx_buf->len;
                skb->data_len = rx_buf->len;
                skb->truesize += rx_buf->len;
-               skb->ip_summed =
-                       checksummed ? CHECKSUM_UNNECESSARY : CHECKSUM_NONE;
+               skb->ip_summed = ((rx_buf->flags & EFX_RX_PKT_CSUMMED) ?
+                                 CHECKSUM_UNNECESSARY : CHECKSUM_NONE);
 
                skb_record_rx_queue(skb, channel->channel);
 
@@ -493,7 +493,7 @@ static void efx_rx_packet_gro(struct efx_channel *channel,
        } else {
                struct sk_buff *skb = rx_buf->u.skb;
 
-               EFX_BUG_ON_PARANOID(!checksummed);
+               EFX_BUG_ON_PARANOID(!(rx_buf->flags & EFX_RX_PKT_CSUMMED));
                rx_buf->u.skb = NULL;
                skb->ip_summed = CHECKSUM_UNNECESSARY;
 
@@ -509,7 +509,7 @@ static void efx_rx_packet_gro(struct efx_channel *channel,
 }
 
 void efx_rx_packet(struct efx_rx_queue *rx_queue, unsigned int index,
-                  unsigned int len, bool checksummed, bool discard)
+                  unsigned int len, u16 flags)
 {
        struct efx_nic *efx = rx_queue->efx;
        struct efx_channel *channel = efx_rx_queue_channel(rx_queue);
@@ -517,6 +517,7 @@ void efx_rx_packet(struct efx_rx_queue *rx_queue, unsigned int index,
        bool leak_packet = false;
 
        rx_buf = efx_rx_buffer(rx_queue, index);
+       rx_buf->flags |= flags;
 
        /* This allows the refill path to post another buffer.
         * EFX_RXD_HEAD_ROOM ensures that the slot we are using
@@ -525,18 +526,17 @@ void efx_rx_packet(struct efx_rx_queue *rx_queue, unsigned int index,
        rx_queue->removed_count++;
 
        /* Validate the length encoded in the event vs the descriptor pushed */
-       efx_rx_packet__check_len(rx_queue, rx_buf, len,
-                                &discard, &leak_packet);
+       efx_rx_packet__check_len(rx_queue, rx_buf, len, &leak_packet);
 
        netif_vdbg(efx, rx_status, efx->net_dev,
                   "RX queue %d received id %x at %llx+%x %s%s\n",
                   efx_rx_queue_index(rx_queue), index,
                   (unsigned long long)rx_buf->dma_addr, len,
-                  (checksummed ? " [SUMMED]" : ""),
-                  (discard ? " [DISCARD]" : ""));
+                  (rx_buf->flags & EFX_RX_PKT_CSUMMED) ? " [SUMMED]" : "",
+                  (rx_buf->flags & EFX_RX_PKT_DISCARD) ? " [DISCARD]" : "");
 
        /* Discard packet, if instructed to do so */
-       if (unlikely(discard)) {
+       if (unlikely(rx_buf->flags & EFX_RX_PKT_DISCARD)) {
                if (unlikely(leak_packet))
                        channel->n_skbuff_leaks++;
                else
@@ -563,18 +563,33 @@ void efx_rx_packet(struct efx_rx_queue *rx_queue, unsigned int index,
        rx_buf->len = len - efx->type->rx_buffer_hash_size;
 out:
        if (channel->rx_pkt)
-               __efx_rx_packet(channel,
-                               channel->rx_pkt, channel->rx_pkt_csummed);
+               __efx_rx_packet(channel, channel->rx_pkt);
        channel->rx_pkt = rx_buf;
-       channel->rx_pkt_csummed = checksummed;
+}
+
+static void efx_rx_deliver(struct efx_channel *channel,
+                          struct efx_rx_buffer *rx_buf)
+{
+       struct sk_buff *skb;
+
+       /* We now own the SKB */
+       skb = rx_buf->u.skb;
+       rx_buf->u.skb = NULL;
+
+       /* Set the SKB flags */
+       skb_checksum_none_assert(skb);
+
+       /* Pass the packet up */
+       netif_receive_skb(skb);
+
+       /* Update allocation strategy method */
+       channel->rx_alloc_level += RX_ALLOC_FACTOR_SKB;
 }
 
 /* Handle a received packet.  Second half: Touches packet payload. */
-void __efx_rx_packet(struct efx_channel *channel,
-                    struct efx_rx_buffer *rx_buf, bool checksummed)
+void __efx_rx_packet(struct efx_channel *channel, struct efx_rx_buffer *rx_buf)
 {
        struct efx_nic *efx = channel->efx;
-       struct sk_buff *skb;
        u8 *eh = efx_rx_buf_eh(efx, rx_buf);
 
        /* If we're in loopback test, then pass the packet directly to the
@@ -586,8 +601,8 @@ void __efx_rx_packet(struct efx_channel *channel,
                return;
        }
 
-       if (!rx_buf->is_page) {
-               skb = rx_buf->u.skb;
+       if (!(rx_buf->flags & EFX_RX_BUF_PAGE)) {
+               struct sk_buff *skb = rx_buf->u.skb;
 
                prefetch(skb_shinfo(skb));
 
@@ -605,25 +620,12 @@ void __efx_rx_packet(struct efx_channel *channel,
        }
 
        if (unlikely(!(efx->net_dev->features & NETIF_F_RXCSUM)))
-               checksummed = false;
-
-       if (likely(checksummed || rx_buf->is_page)) {
-               efx_rx_packet_gro(channel, rx_buf, eh, checksummed);
-               return;
-       }
+               rx_buf->flags &= ~EFX_RX_PKT_CSUMMED;
 
-       /* We now own the SKB */
-       skb = rx_buf->u.skb;
-       rx_buf->u.skb = NULL;
-
-       /* Set the SKB flags */
-       skb_checksum_none_assert(skb);
-
-       /* Pass the packet up */
-       netif_receive_skb(skb);
-
-       /* Update allocation strategy method */
-       channel->rx_alloc_level += RX_ALLOC_FACTOR_SKB;
+       if (likely(rx_buf->flags & (EFX_RX_BUF_PAGE | EFX_RX_PKT_CSUMMED)))
+               efx_rx_packet_gro(channel, rx_buf, eh);
+       else
+               efx_rx_deliver(channel, rx_buf);
 }
 
 void efx_rx_strategy(struct efx_channel *channel)
@@ -703,6 +705,7 @@ void efx_init_rx_queue(struct efx_rx_queue *rx_queue)
        rx_queue->fast_fill_limit = limit;
 
        /* Set up RX descriptor ring */
+       rx_queue->enabled = true;
        efx_nic_init_rx(rx_queue);
 }
 
@@ -714,6 +717,9 @@ void efx_fini_rx_queue(struct efx_rx_queue *rx_queue)
        netif_dbg(rx_queue->efx, drv, rx_queue->efx->net_dev,
                  "shutting down RX queue %d\n", efx_rx_queue_index(rx_queue));
 
+       /* A flush failure might have left rx_queue->enabled */
+       rx_queue->enabled = false;
+
        del_timer_sync(&rx_queue->slow_fill);
        efx_nic_fini_rx(rx_queue);
 
index 52edd24..febe2a9 100644 (file)
@@ -19,7 +19,6 @@
 #include <linux/udp.h>
 #include <linux/rtnetlink.h>
 #include <linux/slab.h>
-#include <asm/io.h>
 #include "net_driver.h"
 #include "efx.h"
 #include "nic.h"
@@ -50,7 +49,7 @@ static const char payload_msg[] =
 
 /* Interrupt mode names */
 static const unsigned int efx_interrupt_mode_max = EFX_INT_MODE_MAX;
-static const char *efx_interrupt_mode_names[] = {
+static const char *const efx_interrupt_mode_names[] = {
        [EFX_INT_MODE_MSIX]   = "MSI-X",
        [EFX_INT_MODE_MSI]    = "MSI",
        [EFX_INT_MODE_LEGACY] = "legacy",
@@ -131,6 +130,8 @@ static int efx_test_chip(struct efx_nic *efx, struct efx_self_tests *tests)
 static int efx_test_interrupts(struct efx_nic *efx,
                               struct efx_self_tests *tests)
 {
+       int cpu;
+
        netif_dbg(efx, drv, efx->net_dev, "testing interrupts\n");
        tests->interrupt = -1;
 
@@ -143,7 +144,8 @@ static int efx_test_interrupts(struct efx_nic *efx,
        /* Wait for arrival of test interrupt. */
        netif_dbg(efx, drv, efx->net_dev, "waiting for test interrupt\n");
        schedule_timeout_uninterruptible(HZ / 10);
-       if (efx->last_irq_cpu >= 0)
+       cpu = ACCESS_ONCE(efx->last_irq_cpu);
+       if (cpu >= 0)
                goto success;
 
        netif_err(efx, drv, efx->net_dev, "timed out waiting for interrupt\n");
@@ -151,8 +153,7 @@ static int efx_test_interrupts(struct efx_nic *efx,
 
  success:
        netif_dbg(efx, drv, efx->net_dev, "%s test interrupt seen on CPU%d\n",
-                 INT_MODE(efx),
-               efx->last_irq_cpu);
+                 INT_MODE(efx), cpu);
        tests->interrupt = 1;
        return 0;
 }
@@ -162,56 +163,57 @@ static int efx_test_eventq_irq(struct efx_channel *channel,
                               struct efx_self_tests *tests)
 {
        struct efx_nic *efx = channel->efx;
-       unsigned int read_ptr, count;
-
-       tests->eventq_dma[channel->channel] = -1;
-       tests->eventq_int[channel->channel] = -1;
-       tests->eventq_poll[channel->channel] = -1;
+       unsigned int read_ptr;
+       bool napi_ran, dma_seen, int_seen;
 
        read_ptr = channel->eventq_read_ptr;
-       channel->efx->last_irq_cpu = -1;
+       channel->last_irq_cpu = -1;
        smp_wmb();
 
        efx_nic_generate_test_event(channel);
 
-       /* Wait for arrival of interrupt */
-       count = 0;
-       do {
-               schedule_timeout_uninterruptible(HZ / 100);
-
-               if (ACCESS_ONCE(channel->eventq_read_ptr) != read_ptr)
-                       goto eventq_ok;
-       } while (++count < 2);
-
-       netif_err(efx, drv, efx->net_dev,
-                 "channel %d timed out waiting for event queue\n",
-                 channel->channel);
-
-       /* See if interrupt arrived */
-       if (channel->efx->last_irq_cpu >= 0) {
-               netif_err(efx, drv, efx->net_dev,
-                         "channel %d saw interrupt on CPU%d "
-                         "during event queue test\n", channel->channel,
-                         raw_smp_processor_id());
-               tests->eventq_int[channel->channel] = 1;
+       /* Wait for arrival of interrupt.  NAPI processing may or may
+        * not complete in time, but we can cope in any case.
+        */
+       msleep(10);
+       napi_disable(&channel->napi_str);
+       if (channel->eventq_read_ptr != read_ptr) {
+               napi_ran = true;
+               dma_seen = true;
+               int_seen = true;
+       } else {
+               napi_ran = false;
+               dma_seen = efx_nic_event_present(channel);
+               int_seen = ACCESS_ONCE(channel->last_irq_cpu) >= 0;
        }
+       napi_enable(&channel->napi_str);
+       efx_nic_eventq_read_ack(channel);
+
+       tests->eventq_dma[channel->channel] = dma_seen ? 1 : -1;
+       tests->eventq_int[channel->channel] = int_seen ? 1 : -1;
 
-       /* Check to see if event was received even if interrupt wasn't */
-       if (efx_nic_event_present(channel)) {
+       if (dma_seen && int_seen) {
+               netif_dbg(efx, drv, efx->net_dev,
+                         "channel %d event queue passed (with%s NAPI)\n",
+                         channel->channel, napi_ran ? "" : "out");
+               return 0;
+       } else {
+               /* Report failure and whether either interrupt or DMA worked */
                netif_err(efx, drv, efx->net_dev,
-                         "channel %d event was generated, but "
-                         "failed to trigger an interrupt\n", channel->channel);
-               tests->eventq_dma[channel->channel] = 1;
+                         "channel %d timed out waiting for event queue\n",
+                         channel->channel);
+               if (int_seen)
+                       netif_err(efx, drv, efx->net_dev,
+                                 "channel %d saw interrupt "
+                                 "during event queue test\n",
+                                 channel->channel);
+               if (dma_seen)
+                       netif_err(efx, drv, efx->net_dev,
+                                 "channel %d event was generated, but "
+                                 "failed to trigger an interrupt\n",
+                                 channel->channel);
+               return -ETIMEDOUT;
        }
-
-       return -ETIMEDOUT;
- eventq_ok:
-       netif_dbg(efx, drv, efx->net_dev, "channel %d event queue passed\n",
-                 channel->channel);
-       tests->eventq_dma[channel->channel] = 1;
-       tests->eventq_int[channel->channel] = 1;
-       tests->eventq_poll[channel->channel] = 1;
-       return 0;
 }
 
 static int efx_test_phy(struct efx_nic *efx, struct efx_self_tests *tests,
@@ -316,7 +318,7 @@ void efx_loopback_rx_packet(struct efx_nic *efx,
        return;
 
  err:
-#ifdef EFX_ENABLE_DEBUG
+#ifdef DEBUG
        if (atomic_read(&state->rx_bad) == 0) {
                netif_err(efx, drv, efx->net_dev, "received packet:\n");
                print_hex_dump(KERN_ERR, "", DUMP_PREFIX_OFFSET, 0x10, 1,
@@ -395,11 +397,9 @@ static int efx_begin_loopback(struct efx_tx_queue *tx_queue)
                 * interrupt handler. */
                smp_wmb();
 
-               if (efx_dev_registered(efx))
-                       netif_tx_lock_bh(efx->net_dev);
+               netif_tx_lock_bh(efx->net_dev);
                rc = efx_enqueue_skb(tx_queue, skb);
-               if (efx_dev_registered(efx))
-                       netif_tx_unlock_bh(efx->net_dev);
+               netif_tx_unlock_bh(efx->net_dev);
 
                if (rc != NETDEV_TX_OK) {
                        netif_err(efx, drv, efx->net_dev,
@@ -440,20 +440,18 @@ static int efx_end_loopback(struct efx_tx_queue *tx_queue,
        int tx_done = 0, rx_good, rx_bad;
        int i, rc = 0;
 
-       if (efx_dev_registered(efx))
-               netif_tx_lock_bh(efx->net_dev);
+       netif_tx_lock_bh(efx->net_dev);
 
        /* Count the number of tx completions, and decrement the refcnt. Any
         * skbs not already completed will be free'd when the queue is flushed */
-       for (i=0; i < state->packet_count; i++) {
+       for (i = 0; i < state->packet_count; i++) {
                skb = state->skbs[i];
                if (skb && !skb_shared(skb))
                        ++tx_done;
                dev_kfree_skb_any(skb);
        }
 
-       if (efx_dev_registered(efx))
-               netif_tx_unlock_bh(efx->net_dev);
+       netif_tx_unlock_bh(efx->net_dev);
 
        /* Check TX completion and received packet counts */
        rx_good = atomic_read(&state->rx_good);
@@ -570,7 +568,7 @@ static int efx_wait_for_link(struct efx_nic *efx)
                mutex_lock(&efx->mac_lock);
                link_up = link_state->up;
                if (link_up)
-                       link_up = !efx->mac_op->check_fault(efx);
+                       link_up = !efx->type->check_mac_fault(efx);
                mutex_unlock(&efx->mac_lock);
 
                if (link_up) {
index dba5456..87abe2a 100644 (file)
@@ -37,7 +37,6 @@ struct efx_self_tests {
        int interrupt;
        int eventq_dma[EFX_MAX_CHANNELS];
        int eventq_int[EFX_MAX_CHANNELS];
-       int eventq_poll[EFX_MAX_CHANNELS];
        /* offline tests */
        int registers;
        int phy_ext[EFX_MAX_PHY_TESTS];
index 4d5d619..7bea790 100644 (file)
@@ -18,7 +18,6 @@
 #include "bitfield.h"
 #include "efx.h"
 #include "nic.h"
-#include "mac.h"
 #include "spi.h"
 #include "regs.h"
 #include "io.h"
@@ -36,8 +35,6 @@ static void siena_push_irq_moderation(struct efx_channel *channel)
 {
        efx_dword_t timer_cmd;
 
-       BUILD_BUG_ON(EFX_IRQ_MOD_MAX > (1 << FRF_CZ_TC_TIMER_VAL_WIDTH));
-
        if (channel->irq_moderation)
                EFX_POPULATE_DWORD_2(timer_cmd,
                                     FRF_CZ_TC_TIMER_MODE,
@@ -53,15 +50,6 @@ static void siena_push_irq_moderation(struct efx_channel *channel)
                               channel->channel);
 }
 
-static void siena_push_multicast_hash(struct efx_nic *efx)
-{
-       WARN_ON(!mutex_is_locked(&efx->mac_lock));
-
-       efx_mcdi_rpc(efx, MC_CMD_SET_MCAST_HASH,
-                    efx->multicast_hash.byte, sizeof(efx->multicast_hash),
-                    NULL, 0, NULL);
-}
-
 static int siena_mdio_write(struct net_device *net_dev,
                            int prtad, int devad, u16 addr, u16 value)
 {
@@ -226,7 +214,24 @@ static int siena_reset_hw(struct efx_nic *efx, enum reset_type method)
 
 static int siena_probe_nvconfig(struct efx_nic *efx)
 {
-       return efx_mcdi_get_board_cfg(efx, efx->net_dev->perm_addr, NULL);
+       u32 caps = 0;
+       int rc;
+
+       rc = efx_mcdi_get_board_cfg(efx, efx->net_dev->perm_addr, NULL, &caps);
+
+       efx->timer_quantum_ns =
+               (caps & (1 << MC_CMD_CAPABILITIES_TURBO_ACTIVE_LBN)) ?
+               3072 : 6144; /* 768 cycles */
+       return rc;
+}
+
+static void siena_dimension_resources(struct efx_nic *efx)
+{
+       /* Each port has a small block of internal SRAM dedicated to
+        * the buffer table and descriptor caches.  In theory we can
+        * map both blocks to one port, but we don't.
+        */
+       efx_nic_dimension_resources(efx, FR_CZ_BUF_FULL_TBL_ROWS / 2);
 }
 
 static int siena_probe_nic(struct efx_nic *efx)
@@ -304,6 +309,12 @@ static int siena_probe_nic(struct efx_nic *efx)
                goto fail5;
        }
 
+       rc = efx_mcdi_mon_probe(efx);
+       if (rc)
+               goto fail5;
+
+       efx_sriov_probe(efx);
+
        return 0;
 
 fail5:
@@ -391,6 +402,8 @@ static int siena_init_nic(struct efx_nic *efx)
 
 static void siena_remove_nic(struct efx_nic *efx)
 {
+       efx_mcdi_mon_remove(efx);
+
        efx_nic_free_buffer(efx, &efx->irq_status);
 
        siena_reset_hw(efx, RESET_TYPE_ALL);
@@ -617,6 +630,7 @@ const struct efx_nic_type siena_a0_nic_type = {
        .probe = siena_probe_nic,
        .remove = siena_remove_nic,
        .init = siena_init_nic,
+       .dimension_resources = siena_dimension_resources,
        .fini = efx_port_dummy_op_void,
        .monitor = NULL,
        .map_reset_reason = siena_map_reset_reason,
@@ -630,14 +644,14 @@ const struct efx_nic_type siena_a0_nic_type = {
        .stop_stats = siena_stop_nic_stats,
        .set_id_led = efx_mcdi_set_id_led,
        .push_irq_moderation = siena_push_irq_moderation,
-       .push_multicast_hash = siena_push_multicast_hash,
+       .reconfigure_mac = efx_mcdi_mac_reconfigure,
+       .check_mac_fault = efx_mcdi_mac_check_fault,
        .reconfigure_port = efx_mcdi_phy_reconfigure,
        .get_wol = siena_get_wol,
        .set_wol = siena_set_wol,
        .resume_wol = siena_init_wol,
        .test_registers = siena_test_registers,
        .test_nvram = efx_mcdi_nvram_test_all,
-       .default_mac_ops = &efx_mcdi_mac_operations,
 
        .revision = EFX_REV_SIENA_A0,
        .mem_map_size = (FR_CZ_MC_TREG_SMEM +
@@ -654,8 +668,7 @@ const struct efx_nic_type siena_a0_nic_type = {
        .phys_addr_channels = 32, /* Hardware limit is 64, but the legacy
                                   * interrupt handler only supports 32
                                   * channels */
-       .tx_dc_base = 0x88000,
-       .rx_dc_base = 0x68000,
+       .timer_period_max = 1 << FRF_CZ_TC_TIMER_VAL_WIDTH,
        .offload_features = (NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM |
                             NETIF_F_RXHASH | NETIF_F_NTUPLE),
 };
diff --git a/drivers/net/ethernet/sfc/siena_sriov.c b/drivers/net/ethernet/sfc/siena_sriov.c
new file mode 100644 (file)
index 0000000..80976e8
--- /dev/null
@@ -0,0 +1,1643 @@
+/****************************************************************************
+ * Driver for Solarflare Solarstorm network controllers and boards
+ * Copyright 2010-2011 Solarflare Communications Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 as published
+ * by the Free Software Foundation, incorporated herein by reference.
+ */
+#include <linux/pci.h>
+#include <linux/module.h>
+#include "net_driver.h"
+#include "efx.h"
+#include "nic.h"
+#include "io.h"
+#include "mcdi.h"
+#include "filter.h"
+#include "mcdi_pcol.h"
+#include "regs.h"
+#include "vfdi.h"
+
+/* Number of longs required to track all the VIs in a VF */
+#define VI_MASK_LENGTH BITS_TO_LONGS(1 << EFX_VI_SCALE_MAX)
+
+/**
+ * enum efx_vf_tx_filter_mode - TX MAC filtering behaviour
+ * @VF_TX_FILTER_OFF: Disabled
+ * @VF_TX_FILTER_AUTO: Enabled if MAC address assigned to VF and only
+ *     2 TX queues allowed per VF.
+ * @VF_TX_FILTER_ON: Enabled
+ */
+enum efx_vf_tx_filter_mode {
+       VF_TX_FILTER_OFF,
+       VF_TX_FILTER_AUTO,
+       VF_TX_FILTER_ON,
+};
+
+/**
+ * struct efx_vf - Back-end resource and protocol state for a PCI VF
+ * @efx: The Efx NIC owning this VF
+ * @pci_rid: The PCI requester ID for this VF
+ * @pci_name: The PCI name (formatted address) of this VF
+ * @index: Index of VF within its port and PF.
+ * @req: VFDI incoming request work item. Incoming USR_EV events are received
+ *     by the NAPI handler, but must be handled by executing MCDI requests
+ *     inside a work item.
+ * @req_addr: VFDI incoming request DMA address (in VF's PCI address space).
+ * @req_type: Expected next incoming (from VF) %VFDI_EV_TYPE member.
+ * @req_seqno: Expected next incoming (from VF) %VFDI_EV_SEQ member.
+ * @msg_seqno: Next %VFDI_EV_SEQ member to reply to VF. Protected by
+ *     @status_lock
+ * @busy: VFDI request queued to be processed or being processed. Receiving
+ *     a VFDI request when @busy is set is an error condition.
+ * @buf: Incoming VFDI requests are DMA from the VF into this buffer.
+ * @buftbl_base: Buffer table entries for this VF start at this index.
+ * @rx_filtering: Receive filtering has been requested by the VF driver.
+ * @rx_filter_flags: The flags sent in the %VFDI_OP_INSERT_FILTER request.
+ * @rx_filter_qid: VF relative qid for RX filter requested by VF.
+ * @rx_filter_id: Receive MAC filter ID. Only one filter per VF is supported.
+ * @tx_filter_mode: Transmit MAC filtering mode.
+ * @tx_filter_id: Transmit MAC filter ID.
+ * @addr: The MAC address and outer vlan tag of the VF.
+ * @status_addr: VF DMA address of page for &struct vfdi_status updates.
+ * @status_lock: Mutex protecting @msg_seqno, @status_addr, @addr,
+ *     @peer_page_addrs and @peer_page_count from simultaneous
+ *     updates by the VM and consumption by
+ *     efx_sriov_update_vf_addr()
+ * @peer_page_addrs: Pointer to an array of guest pages for local addresses.
+ * @peer_page_count: Number of entries in @peer_page_count.
+ * @evq0_addrs: Array of guest pages backing evq0.
+ * @evq0_count: Number of entries in @evq0_addrs.
+ * @flush_waitq: wait queue used by %VFDI_OP_FINI_ALL_QUEUES handler
+ *     to wait for flush completions.
+ * @txq_lock: Mutex for TX queue allocation.
+ * @txq_mask: Mask of initialized transmit queues.
+ * @txq_count: Number of initialized transmit queues.
+ * @rxq_mask: Mask of initialized receive queues.
+ * @rxq_count: Number of initialized receive queues.
+ * @rxq_retry_mask: Mask or receive queues that need to be flushed again
+ *     due to flush failure.
+ * @rxq_retry_count: Number of receive queues in @rxq_retry_mask.
+ * @reset_work: Work item to schedule a VF reset.
+ */
+struct efx_vf {
+       struct efx_nic *efx;
+       unsigned int pci_rid;
+       char pci_name[13]; /* dddd:bb:dd.f */
+       unsigned int index;
+       struct work_struct req;
+       u64 req_addr;
+       int req_type;
+       unsigned req_seqno;
+       unsigned msg_seqno;
+       bool busy;
+       struct efx_buffer buf;
+       unsigned buftbl_base;
+       bool rx_filtering;
+       enum efx_filter_flags rx_filter_flags;
+       unsigned rx_filter_qid;
+       int rx_filter_id;
+       enum efx_vf_tx_filter_mode tx_filter_mode;
+       int tx_filter_id;
+       struct vfdi_endpoint addr;
+       u64 status_addr;
+       struct mutex status_lock;
+       u64 *peer_page_addrs;
+       unsigned peer_page_count;
+       u64 evq0_addrs[EFX_MAX_VF_EVQ_SIZE * sizeof(efx_qword_t) /
+                      EFX_BUF_SIZE];
+       unsigned evq0_count;
+       wait_queue_head_t flush_waitq;
+       struct mutex txq_lock;
+       unsigned long txq_mask[VI_MASK_LENGTH];
+       unsigned txq_count;
+       unsigned long rxq_mask[VI_MASK_LENGTH];
+       unsigned rxq_count;
+       unsigned long rxq_retry_mask[VI_MASK_LENGTH];
+       atomic_t rxq_retry_count;
+       struct work_struct reset_work;
+};
+
+struct efx_memcpy_req {
+       unsigned int from_rid;
+       void *from_buf;
+       u64 from_addr;
+       unsigned int to_rid;
+       u64 to_addr;
+       unsigned length;
+};
+
+/**
+ * struct efx_local_addr - A MAC address on the vswitch without a VF.
+ *
+ * Siena does not have a switch, so VFs can't transmit data to each
+ * other. Instead the VFs must be made aware of the local addresses
+ * on the vswitch, so that they can arrange for an alternative
+ * software datapath to be used.
+ *
+ * @link: List head for insertion into efx->local_addr_list.
+ * @addr: Ethernet address
+ */
+struct efx_local_addr {
+       struct list_head link;
+       u8 addr[ETH_ALEN];
+};
+
+/**
+ * struct efx_endpoint_page - Page of vfdi_endpoint structures
+ *
+ * @link: List head for insertion into efx->local_page_list.
+ * @ptr: Pointer to page.
+ * @addr: DMA address of page.
+ */
+struct efx_endpoint_page {
+       struct list_head link;
+       void *ptr;
+       dma_addr_t addr;
+};
+
+/* Buffer table entries are reserved txq0,rxq0,evq0,txq1,rxq1,evq1 */
+#define EFX_BUFTBL_TXQ_BASE(_vf, _qid)                                 \
+       ((_vf)->buftbl_base + EFX_VF_BUFTBL_PER_VI * (_qid))
+#define EFX_BUFTBL_RXQ_BASE(_vf, _qid)                                 \
+       (EFX_BUFTBL_TXQ_BASE(_vf, _qid) +                               \
+        (EFX_MAX_DMAQ_SIZE * sizeof(efx_qword_t) / EFX_BUF_SIZE))
+#define EFX_BUFTBL_EVQ_BASE(_vf, _qid)                                 \
+       (EFX_BUFTBL_TXQ_BASE(_vf, _qid) +                               \
+        (2 * EFX_MAX_DMAQ_SIZE * sizeof(efx_qword_t) / EFX_BUF_SIZE))
+
+#define EFX_FIELD_MASK(_field)                 \
+       ((1 << _field ## _WIDTH) - 1)
+
+/* VFs can only use this many transmit channels */
+static unsigned int vf_max_tx_channels = 2;
+module_param(vf_max_tx_channels, uint, 0444);
+MODULE_PARM_DESC(vf_max_tx_channels,
+                "Limit the number of TX channels VFs can use");
+
+static int max_vfs = -1;
+module_param(max_vfs, int, 0444);
+MODULE_PARM_DESC(max_vfs,
+                "Reduce the number of VFs initialized by the driver");
+
+/* Workqueue used by VFDI communication.  We can't use the global
+ * workqueue because it may be running the VF driver's probe()
+ * routine, which will be blocked there waiting for a VFDI response.
+ */
+static struct workqueue_struct *vfdi_workqueue;
+
+static unsigned abs_index(struct efx_vf *vf, unsigned index)
+{
+       return EFX_VI_BASE + vf->index * efx_vf_size(vf->efx) + index;
+}
+
+static int efx_sriov_cmd(struct efx_nic *efx, bool enable,
+                        unsigned *vi_scale_out, unsigned *vf_total_out)
+{
+       u8 inbuf[MC_CMD_SRIOV_IN_LEN];
+       u8 outbuf[MC_CMD_SRIOV_OUT_LEN];
+       unsigned vi_scale, vf_total;
+       size_t outlen;
+       int rc;
+
+       MCDI_SET_DWORD(inbuf, SRIOV_IN_ENABLE, enable ? 1 : 0);
+       MCDI_SET_DWORD(inbuf, SRIOV_IN_VI_BASE, EFX_VI_BASE);
+       MCDI_SET_DWORD(inbuf, SRIOV_IN_VF_COUNT, efx->vf_count);
+
+       rc = efx_mcdi_rpc(efx, MC_CMD_SRIOV, inbuf, MC_CMD_SRIOV_IN_LEN,
+                         outbuf, MC_CMD_SRIOV_OUT_LEN, &outlen);
+       if (rc)
+               return rc;
+       if (outlen < MC_CMD_SRIOV_OUT_LEN)
+               return -EIO;
+
+       vf_total = MCDI_DWORD(outbuf, SRIOV_OUT_VF_TOTAL);
+       vi_scale = MCDI_DWORD(outbuf, SRIOV_OUT_VI_SCALE);
+       if (vi_scale > EFX_VI_SCALE_MAX)
+               return -EOPNOTSUPP;
+
+       if (vi_scale_out)
+               *vi_scale_out = vi_scale;
+       if (vf_total_out)
+               *vf_total_out = vf_total;
+
+       return 0;
+}
+
+static void efx_sriov_usrev(struct efx_nic *efx, bool enabled)
+{
+       efx_oword_t reg;
+
+       EFX_POPULATE_OWORD_2(reg,
+                            FRF_CZ_USREV_DIS, enabled ? 0 : 1,
+                            FRF_CZ_DFLT_EVQ, efx->vfdi_channel->channel);
+       efx_writeo(efx, &reg, FR_CZ_USR_EV_CFG);
+}
+
+static int efx_sriov_memcpy(struct efx_nic *efx, struct efx_memcpy_req *req,
+                           unsigned int count)
+{
+       u8 *inbuf, *record;
+       unsigned int used;
+       u32 from_rid, from_hi, from_lo;
+       int rc;
+
+       mb();   /* Finish writing source/reading dest before DMA starts */
+
+       used = MC_CMD_MEMCPY_IN_LEN(count);
+       if (WARN_ON(used > MCDI_CTL_SDU_LEN_MAX))
+               return -ENOBUFS;
+
+       /* Allocate room for the largest request */
+       inbuf = kzalloc(MCDI_CTL_SDU_LEN_MAX, GFP_KERNEL);
+       if (inbuf == NULL)
+               return -ENOMEM;
+
+       record = inbuf;
+       MCDI_SET_DWORD(record, MEMCPY_IN_RECORD, count);
+       while (count-- > 0) {
+               MCDI_SET_DWORD(record, MEMCPY_RECORD_TYPEDEF_TO_RID,
+                              req->to_rid);
+               MCDI_SET_DWORD(record, MEMCPY_RECORD_TYPEDEF_TO_ADDR_LO,
+                              (u32)req->to_addr);
+               MCDI_SET_DWORD(record, MEMCPY_RECORD_TYPEDEF_TO_ADDR_HI,
+                              (u32)(req->to_addr >> 32));
+               if (req->from_buf == NULL) {
+                       from_rid = req->from_rid;
+                       from_lo = (u32)req->from_addr;
+                       from_hi = (u32)(req->from_addr >> 32);
+               } else {
+                       if (WARN_ON(used + req->length > MCDI_CTL_SDU_LEN_MAX)) {
+                               rc = -ENOBUFS;
+                               goto out;
+                       }
+
+                       from_rid = MC_CMD_MEMCPY_RECORD_TYPEDEF_RID_INLINE;
+                       from_lo = used;
+                       from_hi = 0;
+                       memcpy(inbuf + used, req->from_buf, req->length);
+                       used += req->length;
+               }
+
+               MCDI_SET_DWORD(record, MEMCPY_RECORD_TYPEDEF_FROM_RID, from_rid);
+               MCDI_SET_DWORD(record, MEMCPY_RECORD_TYPEDEF_FROM_ADDR_LO,
+                              from_lo);
+               MCDI_SET_DWORD(record, MEMCPY_RECORD_TYPEDEF_FROM_ADDR_HI,
+                              from_hi);
+               MCDI_SET_DWORD(record, MEMCPY_RECORD_TYPEDEF_LENGTH,
+                              req->length);
+
+               ++req;
+               record += MC_CMD_MEMCPY_IN_RECORD_LEN;
+       }
+
+       rc = efx_mcdi_rpc(efx, MC_CMD_MEMCPY, inbuf, used, NULL, 0, NULL);
+out:
+       kfree(inbuf);
+
+       mb();   /* Don't write source/read dest before DMA is complete */
+
+       return rc;
+}
+
+/* The TX filter is entirely controlled by this driver, and is modified
+ * underneath the feet of the VF
+ */
+static void efx_sriov_reset_tx_filter(struct efx_vf *vf)
+{
+       struct efx_nic *efx = vf->efx;
+       struct efx_filter_spec filter;
+       u16 vlan;
+       int rc;
+
+       if (vf->tx_filter_id != -1) {
+               efx_filter_remove_id_safe(efx, EFX_FILTER_PRI_REQUIRED,
+                                         vf->tx_filter_id);
+               netif_dbg(efx, hw, efx->net_dev, "Removed vf %s tx filter %d\n",
+                         vf->pci_name, vf->tx_filter_id);
+               vf->tx_filter_id = -1;
+       }
+
+       if (is_zero_ether_addr(vf->addr.mac_addr))
+               return;
+
+       /* Turn on TX filtering automatically if not explicitly
+        * enabled or disabled.
+        */
+       if (vf->tx_filter_mode == VF_TX_FILTER_AUTO && vf_max_tx_channels <= 2)
+               vf->tx_filter_mode = VF_TX_FILTER_ON;
+
+       vlan = ntohs(vf->addr.tci) & VLAN_VID_MASK;
+       efx_filter_init_tx(&filter, abs_index(vf, 0));
+       rc = efx_filter_set_eth_local(&filter,
+                                     vlan ? vlan : EFX_FILTER_VID_UNSPEC,
+                                     vf->addr.mac_addr);
+       BUG_ON(rc);
+
+       rc = efx_filter_insert_filter(efx, &filter, true);
+       if (rc < 0) {
+               netif_warn(efx, hw, efx->net_dev,
+                          "Unable to migrate tx filter for vf %s\n",
+                          vf->pci_name);
+       } else {
+               netif_dbg(efx, hw, efx->net_dev, "Inserted vf %s tx filter %d\n",
+                         vf->pci_name, rc);
+               vf->tx_filter_id = rc;
+       }
+}
+
+/* The RX filter is managed here on behalf of the VF driver */
+static void efx_sriov_reset_rx_filter(struct efx_vf *vf)
+{
+       struct efx_nic *efx = vf->efx;
+       struct efx_filter_spec filter;
+       u16 vlan;
+       int rc;
+
+       if (vf->rx_filter_id != -1) {
+               efx_filter_remove_id_safe(efx, EFX_FILTER_PRI_REQUIRED,
+                                         vf->rx_filter_id);
+               netif_dbg(efx, hw, efx->net_dev, "Removed vf %s rx filter %d\n",
+                         vf->pci_name, vf->rx_filter_id);
+               vf->rx_filter_id = -1;
+       }
+
+       if (!vf->rx_filtering || is_zero_ether_addr(vf->addr.mac_addr))
+               return;
+
+       vlan = ntohs(vf->addr.tci) & VLAN_VID_MASK;
+       efx_filter_init_rx(&filter, EFX_FILTER_PRI_REQUIRED,
+                          vf->rx_filter_flags,
+                          abs_index(vf, vf->rx_filter_qid));
+       rc = efx_filter_set_eth_local(&filter,
+                                     vlan ? vlan : EFX_FILTER_VID_UNSPEC,
+                                     vf->addr.mac_addr);
+       BUG_ON(rc);
+
+       rc = efx_filter_insert_filter(efx, &filter, true);
+       if (rc < 0) {
+               netif_warn(efx, hw, efx->net_dev,
+                          "Unable to insert rx filter for vf %s\n",
+                          vf->pci_name);
+       } else {
+               netif_dbg(efx, hw, efx->net_dev, "Inserted vf %s rx filter %d\n",
+                         vf->pci_name, rc);
+               vf->rx_filter_id = rc;
+       }
+}
+
+static void __efx_sriov_update_vf_addr(struct efx_vf *vf)
+{
+       efx_sriov_reset_tx_filter(vf);
+       efx_sriov_reset_rx_filter(vf);
+       queue_work(vfdi_workqueue, &vf->efx->peer_work);
+}
+
+/* Push the peer list to this VF. The caller must hold status_lock to interlock
+ * with VFDI requests, and they must be serialised against manipulation of
+ * local_page_list, either by acquiring local_lock or by running from
+ * efx_sriov_peer_work()
+ */
+static void __efx_sriov_push_vf_status(struct efx_vf *vf)
+{
+       struct efx_nic *efx = vf->efx;
+       struct vfdi_status *status = efx->vfdi_status.addr;
+       struct efx_memcpy_req copy[4];
+       struct efx_endpoint_page *epp;
+       unsigned int pos, count;
+       unsigned data_offset;
+       efx_qword_t event;
+
+       WARN_ON(!mutex_is_locked(&vf->status_lock));
+       WARN_ON(!vf->status_addr);
+
+       status->local = vf->addr;
+       status->generation_end = ++status->generation_start;
+
+       memset(copy, '\0', sizeof(copy));
+       /* Write generation_start */
+       copy[0].from_buf = &status->generation_start;
+       copy[0].to_rid = vf->pci_rid;
+       copy[0].to_addr = vf->status_addr + offsetof(struct vfdi_status,
+                                                    generation_start);
+       copy[0].length = sizeof(status->generation_start);
+       /* DMA the rest of the structure (excluding the generations). This
+        * assumes that the non-generation portion of vfdi_status is in
+        * one chunk starting at the version member.
+        */
+       data_offset = offsetof(struct vfdi_status, version);
+       copy[1].from_rid = efx->pci_dev->devfn;
+       copy[1].from_addr = efx->vfdi_status.dma_addr + data_offset;
+       copy[1].to_rid = vf->pci_rid;
+       copy[1].to_addr = vf->status_addr + data_offset;
+       copy[1].length =  status->length - data_offset;
+
+       /* Copy the peer pages */
+       pos = 2;
+       count = 0;
+       list_for_each_entry(epp, &efx->local_page_list, link) {
+               if (count == vf->peer_page_count) {
+                       /* The VF driver will know they need to provide more
+                        * pages because peer_addr_count is too large.
+                        */
+                       break;
+               }
+               copy[pos].from_buf = NULL;
+               copy[pos].from_rid = efx->pci_dev->devfn;
+               copy[pos].from_addr = epp->addr;
+               copy[pos].to_rid = vf->pci_rid;
+               copy[pos].to_addr = vf->peer_page_addrs[count];
+               copy[pos].length = EFX_PAGE_SIZE;
+
+               if (++pos == ARRAY_SIZE(copy)) {
+                       efx_sriov_memcpy(efx, copy, ARRAY_SIZE(copy));
+                       pos = 0;
+               }
+               ++count;
+       }
+
+       /* Write generation_end */
+       copy[pos].from_buf = &status->generation_end;
+       copy[pos].to_rid = vf->pci_rid;
+       copy[pos].to_addr = vf->status_addr + offsetof(struct vfdi_status,
+                                                      generation_end);
+       copy[pos].length = sizeof(status->generation_end);
+       efx_sriov_memcpy(efx, copy, pos + 1);
+
+       /* Notify the guest */
+       EFX_POPULATE_QWORD_3(event,
+                            FSF_AZ_EV_CODE, FSE_CZ_EV_CODE_USER_EV,
+                            VFDI_EV_SEQ, (vf->msg_seqno & 0xff),
+                            VFDI_EV_TYPE, VFDI_EV_TYPE_STATUS);
+       ++vf->msg_seqno;
+       efx_generate_event(efx, EFX_VI_BASE + vf->index * efx_vf_size(efx),
+                             &event);
+}
+
+static void efx_sriov_bufs(struct efx_nic *efx, unsigned offset,
+                          u64 *addr, unsigned count)
+{
+       efx_qword_t buf;
+       unsigned pos;
+
+       for (pos = 0; pos < count; ++pos) {
+               EFX_POPULATE_QWORD_3(buf,
+                                    FRF_AZ_BUF_ADR_REGION, 0,
+                                    FRF_AZ_BUF_ADR_FBUF,
+                                    addr ? addr[pos] >> 12 : 0,
+                                    FRF_AZ_BUF_OWNER_ID_FBUF, 0);
+               efx_sram_writeq(efx, efx->membase + FR_BZ_BUF_FULL_TBL,
+                               &buf, offset + pos);
+       }
+}
+
+static bool bad_vf_index(struct efx_nic *efx, unsigned index)
+{
+       return index >= efx_vf_size(efx);
+}
+
+static bool bad_buf_count(unsigned buf_count, unsigned max_entry_count)
+{
+       unsigned max_buf_count = max_entry_count *
+               sizeof(efx_qword_t) / EFX_BUF_SIZE;
+
+       return ((buf_count & (buf_count - 1)) || buf_count > max_buf_count);
+}
+
+/* Check that VI specified by per-port index belongs to a VF.
+ * Optionally set VF index and VI index within the VF.
+ */
+static bool map_vi_index(struct efx_nic *efx, unsigned abs_index,
+                        struct efx_vf **vf_out, unsigned *rel_index_out)
+{
+       unsigned vf_i;
+
+       if (abs_index < EFX_VI_BASE)
+               return true;
+       vf_i = (abs_index - EFX_VI_BASE) * efx_vf_size(efx);
+       if (vf_i >= efx->vf_init_count)
+               return true;
+
+       if (vf_out)
+               *vf_out = efx->vf + vf_i;
+       if (rel_index_out)
+               *rel_index_out = abs_index % efx_vf_size(efx);
+       return false;
+}
+
+static int efx_vfdi_init_evq(struct efx_vf *vf)
+{
+       struct efx_nic *efx = vf->efx;
+       struct vfdi_req *req = vf->buf.addr;
+       unsigned vf_evq = req->u.init_evq.index;
+       unsigned buf_count = req->u.init_evq.buf_count;
+       unsigned abs_evq = abs_index(vf, vf_evq);
+       unsigned buftbl = EFX_BUFTBL_EVQ_BASE(vf, vf_evq);
+       efx_oword_t reg;
+
+       if (bad_vf_index(efx, vf_evq) ||
+           bad_buf_count(buf_count, EFX_MAX_VF_EVQ_SIZE)) {
+               if (net_ratelimit())
+                       netif_err(efx, hw, efx->net_dev,
+                                 "ERROR: Invalid INIT_EVQ from %s: evq %d bufs %d\n",
+                                 vf->pci_name, vf_evq, buf_count);
+               return VFDI_RC_EINVAL;
+       }
+
+       efx_sriov_bufs(efx, buftbl, req->u.init_evq.addr, buf_count);
+
+       EFX_POPULATE_OWORD_3(reg,
+                            FRF_CZ_TIMER_Q_EN, 1,
+                            FRF_CZ_HOST_NOTIFY_MODE, 0,
+                            FRF_CZ_TIMER_MODE, FFE_CZ_TIMER_MODE_DIS);
+       efx_writeo_table(efx, &reg, FR_BZ_TIMER_TBL, abs_evq);
+       EFX_POPULATE_OWORD_3(reg,
+                            FRF_AZ_EVQ_EN, 1,
+                            FRF_AZ_EVQ_SIZE, __ffs(buf_count),
+                            FRF_AZ_EVQ_BUF_BASE_ID, buftbl);
+       efx_writeo_table(efx, &reg, FR_BZ_EVQ_PTR_TBL, abs_evq);
+
+       if (vf_evq == 0) {
+               memcpy(vf->evq0_addrs, req->u.init_evq.addr,
+                      buf_count * sizeof(u64));
+               vf->evq0_count = buf_count;
+       }
+
+       return VFDI_RC_SUCCESS;
+}
+
+static int efx_vfdi_init_rxq(struct efx_vf *vf)
+{
+       struct efx_nic *efx = vf->efx;
+       struct vfdi_req *req = vf->buf.addr;
+       unsigned vf_rxq = req->u.init_rxq.index;
+       unsigned vf_evq = req->u.init_rxq.evq;
+       unsigned buf_count = req->u.init_rxq.buf_count;
+       unsigned buftbl = EFX_BUFTBL_RXQ_BASE(vf, vf_rxq);
+       unsigned label;
+       efx_oword_t reg;
+
+       if (bad_vf_index(efx, vf_evq) || bad_vf_index(efx, vf_rxq) ||
+           bad_buf_count(buf_count, EFX_MAX_DMAQ_SIZE)) {
+               if (net_ratelimit())
+                       netif_err(efx, hw, efx->net_dev,
+                                 "ERROR: Invalid INIT_RXQ from %s: rxq %d evq %d "
+                                 "buf_count %d\n", vf->pci_name, vf_rxq,
+                                 vf_evq, buf_count);
+               return VFDI_RC_EINVAL;
+       }
+       if (__test_and_set_bit(req->u.init_rxq.index, vf->rxq_mask))
+               ++vf->rxq_count;
+       efx_sriov_bufs(efx, buftbl, req->u.init_rxq.addr, buf_count);
+
+       label = req->u.init_rxq.label & EFX_FIELD_MASK(FRF_AZ_RX_DESCQ_LABEL);
+       EFX_POPULATE_OWORD_6(reg,
+                            FRF_AZ_RX_DESCQ_BUF_BASE_ID, buftbl,
+                            FRF_AZ_RX_DESCQ_EVQ_ID, abs_index(vf, vf_evq),
+                            FRF_AZ_RX_DESCQ_LABEL, label,
+                            FRF_AZ_RX_DESCQ_SIZE, __ffs(buf_count),
+                            FRF_AZ_RX_DESCQ_JUMBO,
+                            !!(req->u.init_rxq.flags &
+                               VFDI_RXQ_FLAG_SCATTER_EN),
+                            FRF_AZ_RX_DESCQ_EN, 1);
+       efx_writeo_table(efx, &reg, FR_BZ_RX_DESC_PTR_TBL,
+                        abs_index(vf, vf_rxq));
+
+       return VFDI_RC_SUCCESS;
+}
+
+static int efx_vfdi_init_txq(struct efx_vf *vf)
+{
+       struct efx_nic *efx = vf->efx;
+       struct vfdi_req *req = vf->buf.addr;
+       unsigned vf_txq = req->u.init_txq.index;
+       unsigned vf_evq = req->u.init_txq.evq;
+       unsigned buf_count = req->u.init_txq.buf_count;
+       unsigned buftbl = EFX_BUFTBL_TXQ_BASE(vf, vf_txq);
+       unsigned label, eth_filt_en;
+       efx_oword_t reg;
+
+       if (bad_vf_index(efx, vf_evq) || bad_vf_index(efx, vf_txq) ||
+           vf_txq >= vf_max_tx_channels ||
+           bad_buf_count(buf_count, EFX_MAX_DMAQ_SIZE)) {
+               if (net_ratelimit())
+                       netif_err(efx, hw, efx->net_dev,
+                                 "ERROR: Invalid INIT_TXQ from %s: txq %d evq %d "
+                                 "buf_count %d\n", vf->pci_name, vf_txq,
+                                 vf_evq, buf_count);
+               return VFDI_RC_EINVAL;
+       }
+
+       mutex_lock(&vf->txq_lock);
+       if (__test_and_set_bit(req->u.init_txq.index, vf->txq_mask))
+               ++vf->txq_count;
+       mutex_unlock(&vf->txq_lock);
+       efx_sriov_bufs(efx, buftbl, req->u.init_txq.addr, buf_count);
+
+       eth_filt_en = vf->tx_filter_mode == VF_TX_FILTER_ON;
+
+       label = req->u.init_txq.label & EFX_FIELD_MASK(FRF_AZ_TX_DESCQ_LABEL);
+       EFX_POPULATE_OWORD_8(reg,
+                            FRF_CZ_TX_DPT_Q_MASK_WIDTH, min(efx->vi_scale, 1U),
+                            FRF_CZ_TX_DPT_ETH_FILT_EN, eth_filt_en,
+                            FRF_AZ_TX_DESCQ_EN, 1,
+                            FRF_AZ_TX_DESCQ_BUF_BASE_ID, buftbl,
+                            FRF_AZ_TX_DESCQ_EVQ_ID, abs_index(vf, vf_evq),
+                            FRF_AZ_TX_DESCQ_LABEL, label,
+                            FRF_AZ_TX_DESCQ_SIZE, __ffs(buf_count),
+                            FRF_BZ_TX_NON_IP_DROP_DIS, 1);
+       efx_writeo_table(efx, &reg, FR_BZ_TX_DESC_PTR_TBL,
+                        abs_index(vf, vf_txq));
+
+       return VFDI_RC_SUCCESS;
+}
+
+/* Returns true when efx_vfdi_fini_all_queues should wake */
+static bool efx_vfdi_flush_wake(struct efx_vf *vf)
+{
+       /* Ensure that all updates are visible to efx_vfdi_fini_all_queues() */
+       smp_mb();
+
+       return (!vf->txq_count && !vf->rxq_count) ||
+               atomic_read(&vf->rxq_retry_count);
+}
+
+static void efx_vfdi_flush_clear(struct efx_vf *vf)
+{
+       memset(vf->txq_mask, 0, sizeof(vf->txq_mask));
+       vf->txq_count = 0;
+       memset(vf->rxq_mask, 0, sizeof(vf->rxq_mask));
+       vf->rxq_count = 0;
+       memset(vf->rxq_retry_mask, 0, sizeof(vf->rxq_retry_mask));
+       atomic_set(&vf->rxq_retry_count, 0);
+}
+
+static int efx_vfdi_fini_all_queues(struct efx_vf *vf)
+{
+       struct efx_nic *efx = vf->efx;
+       efx_oword_t reg;
+       unsigned count = efx_vf_size(efx);
+       unsigned vf_offset = EFX_VI_BASE + vf->index * efx_vf_size(efx);
+       unsigned timeout = HZ;
+       unsigned index, rxqs_count;
+       __le32 *rxqs;
+       int rc;
+
+       rxqs = kmalloc(count * sizeof(*rxqs), GFP_KERNEL);
+       if (rxqs == NULL)
+               return VFDI_RC_ENOMEM;
+
+       rtnl_lock();
+       if (efx->fc_disable++ == 0)
+               efx_mcdi_set_mac(efx);
+       rtnl_unlock();
+
+       /* Flush all the initialized queues */
+       rxqs_count = 0;
+       for (index = 0; index < count; ++index) {
+               if (test_bit(index, vf->txq_mask)) {
+                       EFX_POPULATE_OWORD_2(reg,
+                                            FRF_AZ_TX_FLUSH_DESCQ_CMD, 1,
+                                            FRF_AZ_TX_FLUSH_DESCQ,
+                                            vf_offset + index);
+                       efx_writeo(efx, &reg, FR_AZ_TX_FLUSH_DESCQ);
+               }
+               if (test_bit(index, vf->rxq_mask))
+                       rxqs[rxqs_count++] = cpu_to_le32(vf_offset + index);
+       }
+
+       atomic_set(&vf->rxq_retry_count, 0);
+       while (timeout && (vf->rxq_count || vf->txq_count)) {
+               rc = efx_mcdi_rpc(efx, MC_CMD_FLUSH_RX_QUEUES, (u8 *)rxqs,
+                                 rxqs_count * sizeof(*rxqs), NULL, 0, NULL);
+               WARN_ON(rc < 0);
+
+               timeout = wait_event_timeout(vf->flush_waitq,
+                                            efx_vfdi_flush_wake(vf),
+                                            timeout);
+               rxqs_count = 0;
+               for (index = 0; index < count; ++index) {
+                       if (test_and_clear_bit(index, vf->rxq_retry_mask)) {
+                               atomic_dec(&vf->rxq_retry_count);
+                               rxqs[rxqs_count++] =
+                                       cpu_to_le32(vf_offset + index);
+                       }
+               }
+       }
+
+       rtnl_lock();
+       if (--efx->fc_disable == 0)
+               efx_mcdi_set_mac(efx);
+       rtnl_unlock();
+
+       /* Irrespective of success/failure, fini the queues */
+       EFX_ZERO_OWORD(reg);
+       for (index = 0; index < count; ++index) {
+               efx_writeo_table(efx, &reg, FR_BZ_RX_DESC_PTR_TBL,
+                                vf_offset + index);
+               efx_writeo_table(efx, &reg, FR_BZ_TX_DESC_PTR_TBL,
+                                vf_offset + index);
+               efx_writeo_table(efx, &reg, FR_BZ_EVQ_PTR_TBL,
+                                vf_offset + index);
+               efx_writeo_table(efx, &reg, FR_BZ_TIMER_TBL,
+                                vf_offset + index);
+       }
+       efx_sriov_bufs(efx, vf->buftbl_base, NULL,
+                      EFX_VF_BUFTBL_PER_VI * efx_vf_size(efx));
+       kfree(rxqs);
+       efx_vfdi_flush_clear(vf);
+
+       vf->evq0_count = 0;
+
+       return timeout ? 0 : VFDI_RC_ETIMEDOUT;
+}
+
+static int efx_vfdi_insert_filter(struct efx_vf *vf)
+{
+       struct efx_nic *efx = vf->efx;
+       struct vfdi_req *req = vf->buf.addr;
+       unsigned vf_rxq = req->u.mac_filter.rxq;
+       unsigned flags;
+
+       if (bad_vf_index(efx, vf_rxq) || vf->rx_filtering) {
+               if (net_ratelimit())
+                       netif_err(efx, hw, efx->net_dev,
+                                 "ERROR: Invalid INSERT_FILTER from %s: rxq %d "
+                                 "flags 0x%x\n", vf->pci_name, vf_rxq,
+                                 req->u.mac_filter.flags);
+               return VFDI_RC_EINVAL;
+       }
+
+       flags = 0;
+       if (req->u.mac_filter.flags & VFDI_MAC_FILTER_FLAG_RSS)
+               flags |= EFX_FILTER_FLAG_RX_RSS;
+       if (req->u.mac_filter.flags & VFDI_MAC_FILTER_FLAG_SCATTER)
+               flags |= EFX_FILTER_FLAG_RX_SCATTER;
+       vf->rx_filter_flags = flags;
+       vf->rx_filter_qid = vf_rxq;
+       vf->rx_filtering = true;
+
+       efx_sriov_reset_rx_filter(vf);
+       queue_work(vfdi_workqueue, &efx->peer_work);
+
+       return VFDI_RC_SUCCESS;
+}
+
+static int efx_vfdi_remove_all_filters(struct efx_vf *vf)
+{
+       vf->rx_filtering = false;
+       efx_sriov_reset_rx_filter(vf);
+       queue_work(vfdi_workqueue, &vf->efx->peer_work);
+
+       return VFDI_RC_SUCCESS;
+}
+
+static int efx_vfdi_set_status_page(struct efx_vf *vf)
+{
+       struct efx_nic *efx = vf->efx;
+       struct vfdi_req *req = vf->buf.addr;
+       u64 page_count = req->u.set_status_page.peer_page_count;
+       u64 max_page_count =
+               (EFX_PAGE_SIZE -
+                offsetof(struct vfdi_req, u.set_status_page.peer_page_addr[0]))
+               / sizeof(req->u.set_status_page.peer_page_addr[0]);
+
+       if (!req->u.set_status_page.dma_addr || page_count > max_page_count) {
+               if (net_ratelimit())
+                       netif_err(efx, hw, efx->net_dev,
+                                 "ERROR: Invalid SET_STATUS_PAGE from %s\n",
+                                 vf->pci_name);
+               return VFDI_RC_EINVAL;
+       }
+
+       mutex_lock(&efx->local_lock);
+       mutex_lock(&vf->status_lock);
+       vf->status_addr = req->u.set_status_page.dma_addr;
+
+       kfree(vf->peer_page_addrs);
+       vf->peer_page_addrs = NULL;
+       vf->peer_page_count = 0;
+
+       if (page_count) {
+               vf->peer_page_addrs = kcalloc(page_count, sizeof(u64),
+                                             GFP_KERNEL);
+               if (vf->peer_page_addrs) {
+                       memcpy(vf->peer_page_addrs,
+                              req->u.set_status_page.peer_page_addr,
+                              page_count * sizeof(u64));
+                       vf->peer_page_count = page_count;
+               }
+       }
+
+       __efx_sriov_push_vf_status(vf);
+       mutex_unlock(&vf->status_lock);
+       mutex_unlock(&efx->local_lock);
+
+       return VFDI_RC_SUCCESS;
+}
+
+static int efx_vfdi_clear_status_page(struct efx_vf *vf)
+{
+       mutex_lock(&vf->status_lock);
+       vf->status_addr = 0;
+       mutex_unlock(&vf->status_lock);
+
+       return VFDI_RC_SUCCESS;
+}
+
+typedef int (*efx_vfdi_op_t)(struct efx_vf *vf);
+
+static const efx_vfdi_op_t vfdi_ops[VFDI_OP_LIMIT] = {
+       [VFDI_OP_INIT_EVQ] = efx_vfdi_init_evq,
+       [VFDI_OP_INIT_TXQ] = efx_vfdi_init_txq,
+       [VFDI_OP_INIT_RXQ] = efx_vfdi_init_rxq,
+       [VFDI_OP_FINI_ALL_QUEUES] = efx_vfdi_fini_all_queues,
+       [VFDI_OP_INSERT_FILTER] = efx_vfdi_insert_filter,
+       [VFDI_OP_REMOVE_ALL_FILTERS] = efx_vfdi_remove_all_filters,
+       [VFDI_OP_SET_STATUS_PAGE] = efx_vfdi_set_status_page,
+       [VFDI_OP_CLEAR_STATUS_PAGE] = efx_vfdi_clear_status_page,
+};
+
+static void efx_sriov_vfdi(struct work_struct *work)
+{
+       struct efx_vf *vf = container_of(work, struct efx_vf, req);
+       struct efx_nic *efx = vf->efx;
+       struct vfdi_req *req = vf->buf.addr;
+       struct efx_memcpy_req copy[2];
+       int rc;
+
+       /* Copy this page into the local address space */
+       memset(copy, '\0', sizeof(copy));
+       copy[0].from_rid = vf->pci_rid;
+       copy[0].from_addr = vf->req_addr;
+       copy[0].to_rid = efx->pci_dev->devfn;
+       copy[0].to_addr = vf->buf.dma_addr;
+       copy[0].length = EFX_PAGE_SIZE;
+       rc = efx_sriov_memcpy(efx, copy, 1);
+       if (rc) {
+               /* If we can't get the request, we can't reply to the caller */
+               if (net_ratelimit())
+                       netif_err(efx, hw, efx->net_dev,
+                                 "ERROR: Unable to fetch VFDI request from %s rc %d\n",
+                                 vf->pci_name, -rc);
+               vf->busy = false;
+               return;
+       }
+
+       if (req->op < VFDI_OP_LIMIT && vfdi_ops[req->op] != NULL) {
+               rc = vfdi_ops[req->op](vf);
+               if (rc == 0) {
+                       netif_dbg(efx, hw, efx->net_dev,
+                                 "vfdi request %d from %s ok\n",
+                                 req->op, vf->pci_name);
+               }
+       } else {
+               netif_dbg(efx, hw, efx->net_dev,
+                         "ERROR: Unrecognised request %d from VF %s addr "
+                         "%llx\n", req->op, vf->pci_name,
+                         (unsigned long long)vf->req_addr);
+               rc = VFDI_RC_EOPNOTSUPP;
+       }
+
+       /* Allow subsequent VF requests */
+       vf->busy = false;
+       smp_wmb();
+
+       /* Respond to the request */
+       req->rc = rc;
+       req->op = VFDI_OP_RESPONSE;
+
+       memset(copy, '\0', sizeof(copy));
+       copy[0].from_buf = &req->rc;
+       copy[0].to_rid = vf->pci_rid;
+       copy[0].to_addr = vf->req_addr + offsetof(struct vfdi_req, rc);
+       copy[0].length = sizeof(req->rc);
+       copy[1].from_buf = &req->op;
+       copy[1].to_rid = vf->pci_rid;
+       copy[1].to_addr = vf->req_addr + offsetof(struct vfdi_req, op);
+       copy[1].length = sizeof(req->op);
+
+       (void) efx_sriov_memcpy(efx, copy, ARRAY_SIZE(copy));
+}
+
+
+
+/* After a reset the event queues inside the guests no longer exist. Fill the
+ * event ring in guest memory with VFDI reset events, then (re-initialise) the
+ * event queue to raise an interrupt. The guest driver will then recover.
+ */
+static void efx_sriov_reset_vf(struct efx_vf *vf, struct efx_buffer *buffer)
+{
+       struct efx_nic *efx = vf->efx;
+       struct efx_memcpy_req copy_req[4];
+       efx_qword_t event;
+       unsigned int pos, count, k, buftbl, abs_evq;
+       efx_oword_t reg;
+       efx_dword_t ptr;
+       int rc;
+
+       BUG_ON(buffer->len != EFX_PAGE_SIZE);
+
+       if (!vf->evq0_count)
+               return;
+       BUG_ON(vf->evq0_count & (vf->evq0_count - 1));
+
+       mutex_lock(&vf->status_lock);
+       EFX_POPULATE_QWORD_3(event,
+                            FSF_AZ_EV_CODE, FSE_CZ_EV_CODE_USER_EV,
+                            VFDI_EV_SEQ, vf->msg_seqno,
+                            VFDI_EV_TYPE, VFDI_EV_TYPE_RESET);
+       vf->msg_seqno++;
+       for (pos = 0; pos < EFX_PAGE_SIZE; pos += sizeof(event))
+               memcpy(buffer->addr + pos, &event, sizeof(event));
+
+       for (pos = 0; pos < vf->evq0_count; pos += count) {
+               count = min_t(unsigned, vf->evq0_count - pos,
+                             ARRAY_SIZE(copy_req));
+               for (k = 0; k < count; k++) {
+                       copy_req[k].from_buf = NULL;
+                       copy_req[k].from_rid = efx->pci_dev->devfn;
+                       copy_req[k].from_addr = buffer->dma_addr;
+                       copy_req[k].to_rid = vf->pci_rid;
+                       copy_req[k].to_addr = vf->evq0_addrs[pos + k];
+                       copy_req[k].length = EFX_PAGE_SIZE;
+               }
+               rc = efx_sriov_memcpy(efx, copy_req, count);
+               if (rc) {
+                       if (net_ratelimit())
+                               netif_err(efx, hw, efx->net_dev,
+                                         "ERROR: Unable to notify %s of reset"
+                                         ": %d\n", vf->pci_name, -rc);
+                       break;
+               }
+       }
+
+       /* Reinitialise, arm and trigger evq0 */
+       abs_evq = abs_index(vf, 0);
+       buftbl = EFX_BUFTBL_EVQ_BASE(vf, 0);
+       efx_sriov_bufs(efx, buftbl, vf->evq0_addrs, vf->evq0_count);
+
+       EFX_POPULATE_OWORD_3(reg,
+                            FRF_CZ_TIMER_Q_EN, 1,
+                            FRF_CZ_HOST_NOTIFY_MODE, 0,
+                            FRF_CZ_TIMER_MODE, FFE_CZ_TIMER_MODE_DIS);
+       efx_writeo_table(efx, &reg, FR_BZ_TIMER_TBL, abs_evq);
+       EFX_POPULATE_OWORD_3(reg,
+                            FRF_AZ_EVQ_EN, 1,
+                            FRF_AZ_EVQ_SIZE, __ffs(vf->evq0_count),
+                            FRF_AZ_EVQ_BUF_BASE_ID, buftbl);
+       efx_writeo_table(efx, &reg, FR_BZ_EVQ_PTR_TBL, abs_evq);
+       EFX_POPULATE_DWORD_1(ptr, FRF_AZ_EVQ_RPTR, 0);
+       efx_writed_table(efx, &ptr, FR_BZ_EVQ_RPTR, abs_evq);
+
+       mutex_unlock(&vf->status_lock);
+}
+
+static void efx_sriov_reset_vf_work(struct work_struct *work)
+{
+       struct efx_vf *vf = container_of(work, struct efx_vf, req);
+       struct efx_nic *efx = vf->efx;
+       struct efx_buffer buf;
+
+       if (!efx_nic_alloc_buffer(efx, &buf, EFX_PAGE_SIZE)) {
+               efx_sriov_reset_vf(vf, &buf);
+               efx_nic_free_buffer(efx, &buf);
+       }
+}
+
+static void efx_sriov_handle_no_channel(struct efx_nic *efx)
+{
+       netif_err(efx, drv, efx->net_dev,
+                 "ERROR: IOV requires MSI-X and 1 additional interrupt"
+                 "vector. IOV disabled\n");
+       efx->vf_count = 0;
+}
+
+static int efx_sriov_probe_channel(struct efx_channel *channel)
+{
+       channel->efx->vfdi_channel = channel;
+       return 0;
+}
+
+static void
+efx_sriov_get_channel_name(struct efx_channel *channel, char *buf, size_t len)
+{
+       snprintf(buf, len, "%s-iov", channel->efx->name);
+}
+
+static const struct efx_channel_type efx_sriov_channel_type = {
+       .handle_no_channel      = efx_sriov_handle_no_channel,
+       .pre_probe              = efx_sriov_probe_channel,
+       .get_name               = efx_sriov_get_channel_name,
+       /* no copy operation; channel must not be reallocated */
+       .keep_eventq            = true,
+};
+
+void efx_sriov_probe(struct efx_nic *efx)
+{
+       unsigned count;
+
+       if (!max_vfs)
+               return;
+
+       if (efx_sriov_cmd(efx, false, &efx->vi_scale, &count))
+               return;
+       if (count > 0 && count > max_vfs)
+               count = max_vfs;
+
+       /* efx_nic_dimension_resources() will reduce vf_count as appopriate */
+       efx->vf_count = count;
+
+       efx->extra_channel_type[EFX_EXTRA_CHANNEL_IOV] = &efx_sriov_channel_type;
+}
+
+/* Copy the list of individual addresses into the vfdi_status.peers
+ * array and auxillary pages, protected by %local_lock. Drop that lock
+ * and then broadcast the address list to every VF.
+ */
+static void efx_sriov_peer_work(struct work_struct *data)
+{
+       struct efx_nic *efx = container_of(data, struct efx_nic, peer_work);
+       struct vfdi_status *vfdi_status = efx->vfdi_status.addr;
+       struct efx_vf *vf;
+       struct efx_local_addr *local_addr;
+       struct vfdi_endpoint *peer;
+       struct efx_endpoint_page *epp;
+       struct list_head pages;
+       unsigned int peer_space;
+       unsigned int peer_count;
+       unsigned int pos;
+
+       mutex_lock(&efx->local_lock);
+
+       /* Move the existing peer pages off %local_page_list */
+       INIT_LIST_HEAD(&pages);
+       list_splice_tail_init(&efx->local_page_list, &pages);
+
+       /* Populate the VF addresses starting from entry 1 (entry 0 is
+        * the PF address)
+        */
+       peer = vfdi_status->peers + 1;
+       peer_space = ARRAY_SIZE(vfdi_status->peers) - 1;
+       peer_count = 1;
+       for (pos = 0; pos < efx->vf_count; ++pos) {
+               vf = efx->vf + pos;
+
+               mutex_lock(&vf->status_lock);
+               if (vf->rx_filtering && !is_zero_ether_addr(vf->addr.mac_addr)) {
+                       *peer++ = vf->addr;
+                       ++peer_count;
+                       --peer_space;
+                       BUG_ON(peer_space == 0);
+               }
+               mutex_unlock(&vf->status_lock);
+       }
+
+       /* Fill the remaining addresses */
+       list_for_each_entry(local_addr, &efx->local_addr_list, link) {
+               memcpy(peer->mac_addr, local_addr->addr, ETH_ALEN);
+               peer->tci = 0;
+               ++peer;
+               ++peer_count;
+               if (--peer_space == 0) {
+                       if (list_empty(&pages)) {
+                               epp = kmalloc(sizeof(*epp), GFP_KERNEL);
+                               if (!epp)
+                                       break;
+                               epp->ptr = dma_alloc_coherent(
+                                       &efx->pci_dev->dev, EFX_PAGE_SIZE,
+                                       &epp->addr, GFP_KERNEL);
+                               if (!epp->ptr) {
+                                       kfree(epp);
+                                       break;
+                               }
+                       } else {
+                               epp = list_first_entry(
+                                       &pages, struct efx_endpoint_page, link);
+                               list_del(&epp->link);
+                       }
+
+                       list_add_tail(&epp->link, &efx->local_page_list);
+                       peer = (struct vfdi_endpoint *)epp->ptr;
+                       peer_space = EFX_PAGE_SIZE / sizeof(struct vfdi_endpoint);
+               }
+       }
+       vfdi_status->peer_count = peer_count;
+       mutex_unlock(&efx->local_lock);
+
+       /* Free any now unused endpoint pages */
+       while (!list_empty(&pages)) {
+               epp = list_first_entry(
+                       &pages, struct efx_endpoint_page, link);
+               list_del(&epp->link);
+               dma_free_coherent(&efx->pci_dev->dev, EFX_PAGE_SIZE,
+                                 epp->ptr, epp->addr);
+               kfree(epp);
+       }
+
+       /* Finally, push the pages */
+       for (pos = 0; pos < efx->vf_count; ++pos) {
+               vf = efx->vf + pos;
+
+               mutex_lock(&vf->status_lock);
+               if (vf->status_addr)
+                       __efx_sriov_push_vf_status(vf);
+               mutex_unlock(&vf->status_lock);
+       }
+}
+
+static void efx_sriov_free_local(struct efx_nic *efx)
+{
+       struct efx_local_addr *local_addr;
+       struct efx_endpoint_page *epp;
+
+       while (!list_empty(&efx->local_addr_list)) {
+               local_addr = list_first_entry(&efx->local_addr_list,
+                                             struct efx_local_addr, link);
+               list_del(&local_addr->link);
+               kfree(local_addr);
+       }
+
+       while (!list_empty(&efx->local_page_list)) {
+               epp = list_first_entry(&efx->local_page_list,
+                                      struct efx_endpoint_page, link);
+               list_del(&epp->link);
+               dma_free_coherent(&efx->pci_dev->dev, EFX_PAGE_SIZE,
+                                 epp->ptr, epp->addr);
+               kfree(epp);
+       }
+}
+
+static int efx_sriov_vf_alloc(struct efx_nic *efx)
+{
+       unsigned index;
+       struct efx_vf *vf;
+
+       efx->vf = kzalloc(sizeof(struct efx_vf) * efx->vf_count, GFP_KERNEL);
+       if (!efx->vf)
+               return -ENOMEM;
+
+       for (index = 0; index < efx->vf_count; ++index) {
+               vf = efx->vf + index;
+
+               vf->efx = efx;
+               vf->index = index;
+               vf->rx_filter_id = -1;
+               vf->tx_filter_mode = VF_TX_FILTER_AUTO;
+               vf->tx_filter_id = -1;
+               INIT_WORK(&vf->req, efx_sriov_vfdi);
+               INIT_WORK(&vf->reset_work, efx_sriov_reset_vf_work);
+               init_waitqueue_head(&vf->flush_waitq);
+               mutex_init(&vf->status_lock);
+               mutex_init(&vf->txq_lock);
+       }
+
+       return 0;
+}
+
+static void efx_sriov_vfs_fini(struct efx_nic *efx)
+{
+       struct efx_vf *vf;
+       unsigned int pos;
+
+       for (pos = 0; pos < efx->vf_count; ++pos) {
+               vf = efx->vf + pos;
+
+               efx_nic_free_buffer(efx, &vf->buf);
+               kfree(vf->peer_page_addrs);
+               vf->peer_page_addrs = NULL;
+               vf->peer_page_count = 0;
+
+               vf->evq0_count = 0;
+       }
+}
+
+static int efx_sriov_vfs_init(struct efx_nic *efx)
+{
+       struct pci_dev *pci_dev = efx->pci_dev;
+       unsigned index, devfn, sriov, buftbl_base;
+       u16 offset, stride;
+       struct efx_vf *vf;
+       int rc;
+
+       sriov = pci_find_ext_capability(pci_dev, PCI_EXT_CAP_ID_SRIOV);
+       if (!sriov)
+               return -ENOENT;
+
+       pci_read_config_word(pci_dev, sriov + PCI_SRIOV_VF_OFFSET, &offset);
+       pci_read_config_word(pci_dev, sriov + PCI_SRIOV_VF_STRIDE, &stride);
+
+       buftbl_base = efx->vf_buftbl_base;
+       devfn = pci_dev->devfn + offset;
+       for (index = 0; index < efx->vf_count; ++index) {
+               vf = efx->vf + index;
+
+               /* Reserve buffer entries */
+               vf->buftbl_base = buftbl_base;
+               buftbl_base += EFX_VF_BUFTBL_PER_VI * efx_vf_size(efx);
+
+               vf->pci_rid = devfn;
+               snprintf(vf->pci_name, sizeof(vf->pci_name),
+                        "%04x:%02x:%02x.%d",
+                        pci_domain_nr(pci_dev->bus), pci_dev->bus->number,
+                        PCI_SLOT(devfn), PCI_FUNC(devfn));
+
+               rc = efx_nic_alloc_buffer(efx, &vf->buf, EFX_PAGE_SIZE);
+               if (rc)
+                       goto fail;
+
+               devfn += stride;
+       }
+
+       return 0;
+
+fail:
+       efx_sriov_vfs_fini(efx);
+       return rc;
+}
+
+int efx_sriov_init(struct efx_nic *efx)
+{
+       struct net_device *net_dev = efx->net_dev;
+       struct vfdi_status *vfdi_status;
+       int rc;
+
+       /* Ensure there's room for vf_channel */
+       BUILD_BUG_ON(EFX_MAX_CHANNELS + 1 >= EFX_VI_BASE);
+       /* Ensure that VI_BASE is aligned on VI_SCALE */
+       BUILD_BUG_ON(EFX_VI_BASE & ((1 << EFX_VI_SCALE_MAX) - 1));
+
+       if (efx->vf_count == 0)
+               return 0;
+
+       rc = efx_sriov_cmd(efx, true, NULL, NULL);
+       if (rc)
+               goto fail_cmd;
+
+       rc = efx_nic_alloc_buffer(efx, &efx->vfdi_status, sizeof(*vfdi_status));
+       if (rc)
+               goto fail_status;
+       vfdi_status = efx->vfdi_status.addr;
+       memset(vfdi_status, 0, sizeof(*vfdi_status));
+       vfdi_status->version = 1;
+       vfdi_status->length = sizeof(*vfdi_status);
+       vfdi_status->max_tx_channels = vf_max_tx_channels;
+       vfdi_status->vi_scale = efx->vi_scale;
+       vfdi_status->rss_rxq_count = efx->rss_spread;
+       vfdi_status->peer_count = 1 + efx->vf_count;
+       vfdi_status->timer_quantum_ns = efx->timer_quantum_ns;
+
+       rc = efx_sriov_vf_alloc(efx);
+       if (rc)
+               goto fail_alloc;
+
+       mutex_init(&efx->local_lock);
+       INIT_WORK(&efx->peer_work, efx_sriov_peer_work);
+       INIT_LIST_HEAD(&efx->local_addr_list);
+       INIT_LIST_HEAD(&efx->local_page_list);
+
+       rc = efx_sriov_vfs_init(efx);
+       if (rc)
+               goto fail_vfs;
+
+       rtnl_lock();
+       memcpy(vfdi_status->peers[0].mac_addr,
+              net_dev->dev_addr, ETH_ALEN);
+       efx->vf_init_count = efx->vf_count;
+       rtnl_unlock();
+
+       efx_sriov_usrev(efx, true);
+
+       /* At this point we must be ready to accept VFDI requests */
+
+       rc = pci_enable_sriov(efx->pci_dev, efx->vf_count);
+       if (rc)
+               goto fail_pci;
+
+       netif_info(efx, probe, net_dev,
+                  "enabled SR-IOV for %d VFs, %d VI per VF\n",
+                  efx->vf_count, efx_vf_size(efx));
+       return 0;
+
+fail_pci:
+       efx_sriov_usrev(efx, false);
+       rtnl_lock();
+       efx->vf_init_count = 0;
+       rtnl_unlock();
+       efx_sriov_vfs_fini(efx);
+fail_vfs:
+       cancel_work_sync(&efx->peer_work);
+       efx_sriov_free_local(efx);
+       kfree(efx->vf);
+fail_alloc:
+       efx_nic_free_buffer(efx, &efx->vfdi_status);
+fail_status:
+       efx_sriov_cmd(efx, false, NULL, NULL);
+fail_cmd:
+       return rc;
+}
+
+void efx_sriov_fini(struct efx_nic *efx)
+{
+       struct efx_vf *vf;
+       unsigned int pos;
+
+       if (efx->vf_init_count == 0)
+               return;
+
+       /* Disable all interfaces to reconfiguration */
+       BUG_ON(efx->vfdi_channel->enabled);
+       efx_sriov_usrev(efx, false);
+       rtnl_lock();
+       efx->vf_init_count = 0;
+       rtnl_unlock();
+
+       /* Flush all reconfiguration work */
+       for (pos = 0; pos < efx->vf_count; ++pos) {
+               vf = efx->vf + pos;
+               cancel_work_sync(&vf->req);
+               cancel_work_sync(&vf->reset_work);
+       }
+       cancel_work_sync(&efx->peer_work);
+
+       pci_disable_sriov(efx->pci_dev);
+
+       /* Tear down back-end state */
+       efx_sriov_vfs_fini(efx);
+       efx_sriov_free_local(efx);
+       kfree(efx->vf);
+       efx_nic_free_buffer(efx, &efx->vfdi_status);
+       efx_sriov_cmd(efx, false, NULL, NULL);
+}
+
+void efx_sriov_event(struct efx_channel *channel, efx_qword_t *event)
+{
+       struct efx_nic *efx = channel->efx;
+       struct efx_vf *vf;
+       unsigned qid, seq, type, data;
+
+       qid = EFX_QWORD_FIELD(*event, FSF_CZ_USER_QID);
+
+       /* USR_EV_REG_VALUE is dword0, so access the VFDI_EV fields directly */
+       BUILD_BUG_ON(FSF_CZ_USER_EV_REG_VALUE_LBN != 0);
+       seq = EFX_QWORD_FIELD(*event, VFDI_EV_SEQ);
+       type = EFX_QWORD_FIELD(*event, VFDI_EV_TYPE);
+       data = EFX_QWORD_FIELD(*event, VFDI_EV_DATA);
+
+       netif_vdbg(efx, hw, efx->net_dev,
+                  "USR_EV event from qid %d seq 0x%x type %d data 0x%x\n",
+                  qid, seq, type, data);
+
+       if (map_vi_index(efx, qid, &vf, NULL))
+               return;
+       if (vf->busy)
+               goto error;
+
+       if (type == VFDI_EV_TYPE_REQ_WORD0) {
+               /* Resynchronise */
+               vf->req_type = VFDI_EV_TYPE_REQ_WORD0;
+               vf->req_seqno = seq + 1;
+               vf->req_addr = 0;
+       } else if (seq != (vf->req_seqno++ & 0xff) || type != vf->req_type)
+               goto error;
+
+       switch (vf->req_type) {
+       case VFDI_EV_TYPE_REQ_WORD0:
+       case VFDI_EV_TYPE_REQ_WORD1:
+       case VFDI_EV_TYPE_REQ_WORD2:
+               vf->req_addr |= (u64)data << (vf->req_type << 4);
+               ++vf->req_type;
+               return;
+
+       case VFDI_EV_TYPE_REQ_WORD3:
+               vf->req_addr |= (u64)data << 48;
+               vf->req_type = VFDI_EV_TYPE_REQ_WORD0;
+               vf->busy = true;
+               queue_work(vfdi_workqueue, &vf->req);
+               return;
+       }
+
+error:
+       if (net_ratelimit())
+               netif_err(efx, hw, efx->net_dev,
+                         "ERROR: Screaming VFDI request from %s\n",
+                         vf->pci_name);
+       /* Reset the request and sequence number */
+       vf->req_type = VFDI_EV_TYPE_REQ_WORD0;
+       vf->req_seqno = seq + 1;
+}
+
+void efx_sriov_flr(struct efx_nic *efx, unsigned vf_i)
+{
+       struct efx_vf *vf;
+
+       if (vf_i > efx->vf_init_count)
+               return;
+       vf = efx->vf + vf_i;
+       netif_info(efx, hw, efx->net_dev,
+                  "FLR on VF %s\n", vf->pci_name);
+
+       vf->status_addr = 0;
+       efx_vfdi_remove_all_filters(vf);
+       efx_vfdi_flush_clear(vf);
+
+       vf->evq0_count = 0;
+}
+
+void efx_sriov_mac_address_changed(struct efx_nic *efx)
+{
+       struct vfdi_status *vfdi_status = efx->vfdi_status.addr;
+
+       if (!efx->vf_init_count)
+               return;
+       memcpy(vfdi_status->peers[0].mac_addr,
+              efx->net_dev->dev_addr, ETH_ALEN);
+       queue_work(vfdi_workqueue, &efx->peer_work);
+}
+
+void efx_sriov_tx_flush_done(struct efx_nic *efx, efx_qword_t *event)
+{
+       struct efx_vf *vf;
+       unsigned queue, qid;
+
+       queue = EFX_QWORD_FIELD(*event,  FSF_AZ_DRIVER_EV_SUBDATA);
+       if (map_vi_index(efx, queue, &vf, &qid))
+               return;
+       /* Ignore flush completions triggered by an FLR */
+       if (!test_bit(qid, vf->txq_mask))
+               return;
+
+       __clear_bit(qid, vf->txq_mask);
+       --vf->txq_count;
+
+       if (efx_vfdi_flush_wake(vf))
+               wake_up(&vf->flush_waitq);
+}
+
+void efx_sriov_rx_flush_done(struct efx_nic *efx, efx_qword_t *event)
+{
+       struct efx_vf *vf;
+       unsigned ev_failed, queue, qid;
+
+       queue = EFX_QWORD_FIELD(*event, FSF_AZ_DRIVER_EV_RX_DESCQ_ID);
+       ev_failed = EFX_QWORD_FIELD(*event,
+                                   FSF_AZ_DRIVER_EV_RX_FLUSH_FAIL);
+       if (map_vi_index(efx, queue, &vf, &qid))
+               return;
+       if (!test_bit(qid, vf->rxq_mask))
+               return;
+
+       if (ev_failed) {
+               set_bit(qid, vf->rxq_retry_mask);
+               atomic_inc(&vf->rxq_retry_count);
+       } else {
+               __clear_bit(qid, vf->rxq_mask);
+               --vf->rxq_count;
+       }
+       if (efx_vfdi_flush_wake(vf))
+               wake_up(&vf->flush_waitq);
+}
+
+/* Called from napi. Schedule the reset work item */
+void efx_sriov_desc_fetch_err(struct efx_nic *efx, unsigned dmaq)
+{
+       struct efx_vf *vf;
+       unsigned int rel;
+
+       if (map_vi_index(efx, dmaq, &vf, &rel))
+               return;
+
+       if (net_ratelimit())
+               netif_err(efx, hw, efx->net_dev,
+                         "VF %d DMA Q %d reports descriptor fetch error.\n",
+                         vf->index, rel);
+       queue_work(vfdi_workqueue, &vf->reset_work);
+}
+
+/* Reset all VFs */
+void efx_sriov_reset(struct efx_nic *efx)
+{
+       unsigned int vf_i;
+       struct efx_buffer buf;
+       struct efx_vf *vf;
+
+       ASSERT_RTNL();
+
+       if (efx->vf_init_count == 0)
+               return;
+
+       efx_sriov_usrev(efx, true);
+       (void)efx_sriov_cmd(efx, true, NULL, NULL);
+
+       if (efx_nic_alloc_buffer(efx, &buf, EFX_PAGE_SIZE))
+               return;
+
+       for (vf_i = 0; vf_i < efx->vf_init_count; ++vf_i) {
+               vf = efx->vf + vf_i;
+               efx_sriov_reset_vf(vf, &buf);
+       }
+
+       efx_nic_free_buffer(efx, &buf);
+}
+
+int efx_init_sriov(void)
+{
+       /* A single threaded workqueue is sufficient. efx_sriov_vfdi() and
+        * efx_sriov_peer_work() spend almost all their time sleeping for
+        * MCDI to complete anyway
+        */
+       vfdi_workqueue = create_singlethread_workqueue("sfc_vfdi");
+       if (!vfdi_workqueue)
+               return -ENOMEM;
+
+       return 0;
+}
+
+void efx_fini_sriov(void)
+{
+       destroy_workqueue(vfdi_workqueue);
+}
+
+int efx_sriov_set_vf_mac(struct net_device *net_dev, int vf_i, u8 *mac)
+{
+       struct efx_nic *efx = netdev_priv(net_dev);
+       struct efx_vf *vf;
+
+       if (vf_i >= efx->vf_init_count)
+               return -EINVAL;
+       vf = efx->vf + vf_i;
+
+       mutex_lock(&vf->status_lock);
+       memcpy(vf->addr.mac_addr, mac, ETH_ALEN);
+       __efx_sriov_update_vf_addr(vf);
+       mutex_unlock(&vf->status_lock);
+
+       return 0;
+}
+
+int efx_sriov_set_vf_vlan(struct net_device *net_dev, int vf_i,
+                         u16 vlan, u8 qos)
+{
+       struct efx_nic *efx = netdev_priv(net_dev);
+       struct efx_vf *vf;
+       u16 tci;
+
+       if (vf_i >= efx->vf_init_count)
+               return -EINVAL;
+       vf = efx->vf + vf_i;
+
+       mutex_lock(&vf->status_lock);
+       tci = (vlan & VLAN_VID_MASK) | ((qos & 0x7) << VLAN_PRIO_SHIFT);
+       vf->addr.tci = htons(tci);
+       __efx_sriov_update_vf_addr(vf);
+       mutex_unlock(&vf->status_lock);
+
+       return 0;
+}
+
+int efx_sriov_set_vf_spoofchk(struct net_device *net_dev, int vf_i,
+                             bool spoofchk)
+{
+       struct efx_nic *efx = netdev_priv(net_dev);
+       struct efx_vf *vf;
+       int rc;
+
+       if (vf_i >= efx->vf_init_count)
+               return -EINVAL;
+       vf = efx->vf + vf_i;
+
+       mutex_lock(&vf->txq_lock);
+       if (vf->txq_count == 0) {
+               vf->tx_filter_mode =
+                       spoofchk ? VF_TX_FILTER_ON : VF_TX_FILTER_OFF;
+               rc = 0;
+       } else {
+               /* This cannot be changed while TX queues are running */
+               rc = -EBUSY;
+       }
+       mutex_unlock(&vf->txq_lock);
+       return rc;
+}
+
+int efx_sriov_get_vf_config(struct net_device *net_dev, int vf_i,
+                           struct ifla_vf_info *ivi)
+{
+       struct efx_nic *efx = netdev_priv(net_dev);
+       struct efx_vf *vf;
+       u16 tci;
+
+       if (vf_i >= efx->vf_init_count)
+               return -EINVAL;
+       vf = efx->vf + vf_i;
+
+       ivi->vf = vf_i;
+       memcpy(ivi->mac, vf->addr.mac_addr, ETH_ALEN);
+       ivi->tx_rate = 0;
+       tci = ntohs(vf->addr.tci);
+       ivi->vlan = tci & VLAN_VID_MASK;
+       ivi->qos = (tci >> VLAN_PRIO_SHIFT) & 0x7;
+       ivi->spoofchk = vf->tx_filter_mode == VF_TX_FILTER_ON;
+
+       return 0;
+}
+
index 71f2e3e..5431a1b 100644 (file)
@@ -68,7 +68,7 @@ static inline bool efx_spi_present(const struct efx_spi_device *spi)
 
 int falcon_spi_cmd(struct efx_nic *efx,
                   const struct efx_spi_device *spi, unsigned int command,
-                  int address, const void* in, void *out, size_t len);
+                  int address, const void *in, void *out, size_t len);
 int falcon_spi_wait_write(struct efx_nic *efx,
                          const struct efx_spi_device *spi);
 int falcon_spi_read(struct efx_nic *efx,
index 7b0fd89..d37cb50 100644 (file)
 #define GPHY_XCONTROL_REG      49152
 #define GPHY_ISOLATE_LBN       10
 #define GPHY_ISOLATE_WIDTH     1
-#define GPHY_DUPLEX_LBN                8
+#define GPHY_DUPLEX_LBN                8
 #define GPHY_DUPLEX_WIDTH      1
 #define GPHY_LOOPBACK_NEAR_LBN 14
 #define GPHY_LOOPBACK_NEAR_WIDTH 1
index 72f0fbc..94d0365 100644 (file)
@@ -110,7 +110,7 @@ efx_max_tx_len(struct efx_nic *efx, dma_addr_t dma_addr)
         * little benefit from using descriptors that cross those
         * boundaries and we keep things simple by not doing so.
         */
-       unsigned len = (~dma_addr & 0xfff) + 1;
+       unsigned len = (~dma_addr & (EFX_PAGE_SIZE - 1)) + 1;
 
        /* Work around hardware bug for unaligned buffers. */
        if (EFX_WORKAROUND_5391(efx) && (dma_addr & 0xf))
@@ -339,7 +339,7 @@ static void efx_dequeue_buffers(struct efx_tx_queue *tx_queue,
  * OS to free the skb.
  */
 netdev_tx_t efx_hard_start_xmit(struct sk_buff *skb,
-                                     struct net_device *net_dev)
+                               struct net_device *net_dev)
 {
        struct efx_nic *efx = netdev_priv(net_dev);
        struct efx_tx_queue *tx_queue;
@@ -446,10 +446,8 @@ void efx_xmit_done(struct efx_tx_queue *tx_queue, unsigned int index)
            likely(efx->port_enabled) &&
            likely(netif_device_present(efx->net_dev))) {
                fill_level = tx_queue->insert_count - tx_queue->read_count;
-               if (fill_level < EFX_TXQ_THRESHOLD(efx)) {
-                       EFX_BUG_ON_PARANOID(!efx_dev_registered(efx));
+               if (fill_level < EFX_TXQ_THRESHOLD(efx))
                        netif_tx_wake_queue(tx_queue->core_txq);
-               }
        }
 
        /* Check whether the hardware queue is now empty */
index 7c21b33..29bb3f9 100644 (file)
@@ -512,7 +512,7 @@ static bool txc43128_phy_poll(struct efx_nic *efx)
        return efx->link_state.up != was_up;
 }
 
-static const char *txc43128_test_names[] = {
+static const char *const txc43128_test_names[] = {
        "bist"
 };
 
diff --git a/drivers/net/ethernet/sfc/vfdi.h b/drivers/net/ethernet/sfc/vfdi.h
new file mode 100644 (file)
index 0000000..225557c
--- /dev/null
@@ -0,0 +1,255 @@
+/****************************************************************************
+ * Driver for Solarflare Solarstorm network controllers and boards
+ * Copyright 2010-2012 Solarflare Communications Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 as published
+ * by the Free Software Foundation, incorporated herein by reference.
+ */
+#ifndef _VFDI_H
+#define _VFDI_H
+
+/**
+ * DOC: Virtual Function Driver Interface
+ *
+ * This file contains software structures used to form a two way
+ * communication channel between the VF driver and the PF driver,
+ * named Virtual Function Driver Interface (VFDI).
+ *
+ * For the purposes of VFDI, a page is a memory region with size and
+ * alignment of 4K.  All addresses are DMA addresses to be used within
+ * the domain of the relevant VF.
+ *
+ * The only hardware-defined channels for a VF driver to communicate
+ * with the PF driver are the event mailboxes (%FR_CZ_USR_EV
+ * registers).  Writing to these registers generates an event with
+ * EV_CODE = EV_CODE_USR_EV, USER_QID set to the index of the mailbox
+ * and USER_EV_REG_VALUE set to the value written.  The PF driver may
+ * direct or disable delivery of these events by setting
+ * %FR_CZ_USR_EV_CFG.
+ *
+ * The PF driver can send arbitrary events to arbitrary event queues.
+ * However, for consistency, VFDI events from the PF are defined to
+ * follow the same form and be sent to the first event queue assigned
+ * to the VF while that queue is enabled by the VF driver.
+ *
+ * The general form of the variable bits of VFDI events is:
+ *
+ *       0             16                       24   31
+ *      | DATA        | TYPE                   | SEQ   |
+ *
+ * SEQ is a sequence number which should be incremented by 1 (modulo
+ * 256) for each event.  The sequence numbers used in each direction
+ * are independent.
+ *
+ * The VF submits requests of type &struct vfdi_req by sending the
+ * address of the request (ADDR) in a series of 4 events:
+ *
+ *       0             16                       24   31
+ *      | ADDR[0:15]  | VFDI_EV_TYPE_REQ_WORD0 | SEQ   |
+ *      | ADDR[16:31] | VFDI_EV_TYPE_REQ_WORD1 | SEQ+1 |
+ *      | ADDR[32:47] | VFDI_EV_TYPE_REQ_WORD2 | SEQ+2 |
+ *      | ADDR[48:63] | VFDI_EV_TYPE_REQ_WORD3 | SEQ+3 |
+ *
+ * The address must be page-aligned.  After receiving such a valid
+ * series of events, the PF driver will attempt to read the request
+ * and write a response to the same address.  In case of an invalid
+ * sequence of events or a DMA error, there will be no response.
+ *
+ * The VF driver may request that the PF driver writes status
+ * information into its domain asynchronously.  After writing the
+ * status, the PF driver will send an event of the form:
+ *
+ *       0             16                       24   31
+ *      | reserved    | VFDI_EV_TYPE_STATUS    | SEQ   |
+ *
+ * In case the VF must be reset for any reason, the PF driver will
+ * send an event of the form:
+ *
+ *       0             16                       24   31
+ *      | reserved    | VFDI_EV_TYPE_RESET     | SEQ   |
+ *
+ * It is then the responsibility of the VF driver to request
+ * reinitialisation of its queues.
+ */
+#define VFDI_EV_SEQ_LBN 24
+#define VFDI_EV_SEQ_WIDTH 8
+#define VFDI_EV_TYPE_LBN 16
+#define VFDI_EV_TYPE_WIDTH 8
+#define VFDI_EV_TYPE_REQ_WORD0 0
+#define VFDI_EV_TYPE_REQ_WORD1 1
+#define VFDI_EV_TYPE_REQ_WORD2 2
+#define VFDI_EV_TYPE_REQ_WORD3 3
+#define VFDI_EV_TYPE_STATUS 4
+#define VFDI_EV_TYPE_RESET 5
+#define VFDI_EV_DATA_LBN 0
+#define VFDI_EV_DATA_WIDTH 16
+
+struct vfdi_endpoint {
+       u8 mac_addr[ETH_ALEN];
+       __be16 tci;
+};
+
+/**
+ * enum vfdi_op - VFDI operation enumeration
+ * @VFDI_OP_RESPONSE: Indicates a response to the request.
+ * @VFDI_OP_INIT_EVQ: Initialize SRAM entries and initialize an EVQ.
+ * @VFDI_OP_INIT_RXQ: Initialize SRAM entries and initialize an RXQ.
+ * @VFDI_OP_INIT_TXQ: Initialize SRAM entries and initialize a TXQ.
+ * @VFDI_OP_FINI_ALL_QUEUES: Flush all queues, finalize all queues, then
+ *     finalize the SRAM entries.
+ * @VFDI_OP_INSERT_FILTER: Insert a MAC filter targetting the given RXQ.
+ * @VFDI_OP_REMOVE_ALL_FILTERS: Remove all filters.
+ * @VFDI_OP_SET_STATUS_PAGE: Set the DMA page(s) used for status updates
+ *     from PF and write the initial status.
+ * @VFDI_OP_CLEAR_STATUS_PAGE: Clear the DMA page(s) used for status
+ *     updates from PF.
+ */
+enum vfdi_op {
+       VFDI_OP_RESPONSE = 0,
+       VFDI_OP_INIT_EVQ = 1,
+       VFDI_OP_INIT_RXQ = 2,
+       VFDI_OP_INIT_TXQ = 3,
+       VFDI_OP_FINI_ALL_QUEUES = 4,
+       VFDI_OP_INSERT_FILTER = 5,
+       VFDI_OP_REMOVE_ALL_FILTERS = 6,
+       VFDI_OP_SET_STATUS_PAGE = 7,
+       VFDI_OP_CLEAR_STATUS_PAGE = 8,
+       VFDI_OP_LIMIT,
+};
+
+/* Response codes for VFDI operations. Other values may be used in future. */
+#define VFDI_RC_SUCCESS                0
+#define VFDI_RC_ENOMEM         (-12)
+#define VFDI_RC_EINVAL         (-22)
+#define VFDI_RC_EOPNOTSUPP     (-95)
+#define VFDI_RC_ETIMEDOUT      (-110)
+
+/**
+ * struct vfdi_req - Request from VF driver to PF driver
+ * @op: Operation code or response indicator, taken from &enum vfdi_op.
+ * @rc: Response code.  Set to 0 on success or a negative error code on failure.
+ * @u.init_evq.index: Index of event queue to create.
+ * @u.init_evq.buf_count: Number of 4k buffers backing event queue.
+ * @u.init_evq.addr: Array of length %u.init_evq.buf_count containing DMA
+ *     address of each page backing the event queue.
+ * @u.init_rxq.index: Index of receive queue to create.
+ * @u.init_rxq.buf_count: Number of 4k buffers backing receive queue.
+ * @u.init_rxq.evq: Instance of event queue to target receive events at.
+ * @u.init_rxq.label: Label used in receive events.
+ * @u.init_rxq.flags: Unused.
+ * @u.init_rxq.addr: Array of length %u.init_rxq.buf_count containing DMA
+ *     address of each page backing the receive queue.
+ * @u.init_txq.index: Index of transmit queue to create.
+ * @u.init_txq.buf_count: Number of 4k buffers backing transmit queue.
+ * @u.init_txq.evq: Instance of event queue to target transmit completion
+ *     events at.
+ * @u.init_txq.label: Label used in transmit completion events.
+ * @u.init_txq.flags: Checksum offload flags.
+ * @u.init_txq.addr: Array of length %u.init_txq.buf_count containing DMA
+ *     address of each page backing the transmit queue.
+ * @u.mac_filter.rxq: Insert MAC filter at VF local address/VLAN targetting
+ *     all traffic at this receive queue.
+ * @u.mac_filter.flags: MAC filter flags.
+ * @u.set_status_page.dma_addr: Base address for the &struct vfdi_status.
+ *     This address must be page-aligned and the PF may write up to a
+ *     whole page (allowing for extension of the structure).
+ * @u.set_status_page.peer_page_count: Number of additional pages the VF
+ *     has provided into which peer addresses may be DMAd.
+ * @u.set_status_page.peer_page_addr: Array of DMA addresses of pages.
+ *     If the number of peers exceeds 256, then the VF must provide
+ *     additional pages in this array. The PF will then DMA up to
+ *     512 vfdi_endpoint structures into each page.  These addresses
+ *     must be page-aligned.
+ */
+struct vfdi_req {
+       u32 op;
+       u32 reserved1;
+       s32 rc;
+       u32 reserved2;
+       union {
+               struct {
+                       u32 index;
+                       u32 buf_count;
+                       u64 addr[];
+               } init_evq;
+               struct {
+                       u32 index;
+                       u32 buf_count;
+                       u32 evq;
+                       u32 label;
+                       u32 flags;
+#define VFDI_RXQ_FLAG_SCATTER_EN 1
+                       u32 reserved;
+                       u64 addr[];
+               } init_rxq;
+               struct {
+                       u32 index;
+                       u32 buf_count;
+                       u32 evq;
+                       u32 label;
+                       u32 flags;
+#define VFDI_TXQ_FLAG_IP_CSUM_DIS 1
+#define VFDI_TXQ_FLAG_TCPUDP_CSUM_DIS 2
+                       u32 reserved;
+                       u64 addr[];
+               } init_txq;
+               struct {
+                       u32 rxq;
+                       u32 flags;
+#define VFDI_MAC_FILTER_FLAG_RSS 1
+#define VFDI_MAC_FILTER_FLAG_SCATTER 2
+               } mac_filter;
+               struct {
+                       u64 dma_addr;
+                       u64 peer_page_count;
+                       u64 peer_page_addr[];
+               } set_status_page;
+       } u;
+};
+
+/**
+ * struct vfdi_status - Status provided by PF driver to VF driver
+ * @generation_start: A generation count DMA'd to VF *before* the
+ *     rest of the structure.
+ * @generation_end: A generation count DMA'd to VF *after* the
+ *     rest of the structure.
+ * @version: Version of this structure; currently set to 1.  Later
+ *     versions must either be layout-compatible or only be sent to VFs
+ *     that specifically request them.
+ * @length: Total length of this structure including embedded tables
+ * @vi_scale: log2 the number of VIs available on this VF. This quantity
+ *     is used by the hardware for register decoding.
+ * @max_tx_channels: The maximum number of transmit queues the VF can use.
+ * @rss_rxq_count: The number of receive queues present in the shared RSS
+ *     indirection table.
+ * @peer_count: Total number of peers in the complete peer list. If larger
+ *     than ARRAY_SIZE(%peers), then the VF must provide sufficient
+ *     additional pages each of which is filled with vfdi_endpoint structures.
+ * @local: The MAC address and outer VLAN tag of *this* VF
+ * @peers: Table of peer addresses.  The @tci fields in these structures
+ *     are currently unused and must be ignored.  Additional peers are
+ *     written into any additional pages provided by the VF.
+ * @timer_quantum_ns: Timer quantum (nominal period between timer ticks)
+ *     for interrupt moderation timers, in nanoseconds. This member is only
+ *     present if @length is sufficiently large.
+ */
+struct vfdi_status {
+       u32 generation_start;
+       u32 generation_end;
+       u32 version;
+       u32 length;
+       u8 vi_scale;
+       u8 max_tx_channels;
+       u8 rss_rxq_count;
+       u8 reserved1;
+       u16 peer_count;
+       u16 reserved2;
+       struct vfdi_endpoint local;
+       struct vfdi_endpoint peers[256];
+
+       /* Members below here extend version 1 of this structure */
+       u32 timer_quantum_ns;
+};
+
+#endif
index 5b118cd..a9deda8 100644 (file)
@@ -1462,8 +1462,6 @@ static struct net_device * __devinit sis190_init_board(struct pci_dev *pdev)
 
        dev = alloc_etherdev(sizeof(*tp));
        if (!dev) {
-               if (netif_msg_drv(&debug))
-                       pr_err("unable to alloc new ethernet\n");
                rc = -ENOMEM;
                goto err_out_0;
        }
index c8efc70..5ccf02e 100644 (file)
@@ -527,7 +527,7 @@ static int __devinit sis900_probe(struct pci_dev *pci_dev,
                ret = sis900_get_mac_addr(pci_dev, net_dev);
 
        if (!ret || !is_valid_ether_addr(net_dev->dev_addr)) {
-               random_ether_addr(net_dev->dev_addr);
+               eth_hw_addr_random(net_dev);
                printk(KERN_WARNING "%s: Unreadable or invalid MAC address,"
                                "using random generated one\n", dev_name);
        }
@@ -619,7 +619,6 @@ static int __devinit sis900_mii_probe(struct net_device * net_dev)
                }
 
                if ((mii_phy = kmalloc(sizeof(struct mii_phy), GFP_KERNEL)) == NULL) {
-                       printk(KERN_WARNING "Cannot allocate mem for struct mii_phy\n");
                        mii_phy = sis_priv->first_mii;
                        while (mii_phy) {
                                struct mii_phy *phy;
@@ -1167,7 +1166,7 @@ sis900_init_rx_ring(struct net_device *net_dev)
        for (i = 0; i < NUM_RX_DESC; i++) {
                struct sk_buff *skb;
 
-               if ((skb = dev_alloc_skb(RX_BUF_SIZE)) == NULL) {
+               if ((skb = netdev_alloc_skb(net_dev, RX_BUF_SIZE)) == NULL) {
                        /* not enough memory for skbuff, this makes a "hole"
                           on the buffer ring, it is not clear how the
                           hardware will react to this kind of degenerated
@@ -1770,7 +1769,7 @@ static int sis900_rx(struct net_device *net_dev)
 
                        /* refill the Rx buffer, what if there is not enough
                         * memory for new socket buffer ?? */
-                       if ((skb = dev_alloc_skb(RX_BUF_SIZE)) == NULL) {
+                       if ((skb = netdev_alloc_skb(net_dev, RX_BUF_SIZE)) == NULL) {
                                /*
                                 * Not enough memory to refill the buffer
                                 * so we need to recycle the old one so
@@ -1828,7 +1827,7 @@ refill_rx_ring:
                entry = sis_priv->dirty_rx % NUM_RX_DESC;
 
                if (sis_priv->rx_skbuff[entry] == NULL) {
-                       if ((skb = dev_alloc_skb(RX_BUF_SIZE)) == NULL) {
+                       if ((skb = netdev_alloc_skb(net_dev, RX_BUF_SIZE)) == NULL) {
                                /* not enough memory for skbuff, this makes a
                                 * "hole" on the buffer ring, it is not clear
                                 * how the hardware will react to this kind
index 2c077ce..2a662e6 100644 (file)
@@ -363,10 +363,9 @@ static int __devinit epic_init_one (struct pci_dev *pdev,
        ret = -ENOMEM;
 
        dev = alloc_etherdev(sizeof (*ep));
-       if (!dev) {
-               dev_err(&pdev->dev, "no memory for eth device\n");
+       if (!dev)
                goto err_out_free_res;
-       }
+
        SET_NETDEV_DEV(dev, &pdev->dev);
 
 #ifdef USE_IO_OPS
@@ -935,7 +934,7 @@ static void epic_init_ring(struct net_device *dev)
 
        /* Fill in the Rx buffers.  Handle allocation failure gracefully. */
        for (i = 0; i < RX_RING_SIZE; i++) {
-               struct sk_buff *skb = dev_alloc_skb(ep->rx_buf_sz + 2);
+               struct sk_buff *skb = netdev_alloc_skb(dev, ep->rx_buf_sz + 2);
                ep->rx_skbuff[i] = skb;
                if (skb == NULL)
                        break;
@@ -1200,7 +1199,7 @@ static int epic_rx(struct net_device *dev, int budget)
                        /* Check if the packet is long enough to accept without copying
                           to a minimally-sized skbuff. */
                        if (pkt_len < rx_copybreak &&
-                           (skb = dev_alloc_skb(pkt_len + 2)) != NULL) {
+                           (skb = netdev_alloc_skb(dev, pkt_len + 2)) != NULL) {
                                skb_reserve(skb, 2);    /* 16 byte align the IP header */
                                pci_dma_sync_single_for_cpu(ep->pci_dev,
                                                            ep->rx_ring[entry].bufaddr,
@@ -1233,7 +1232,7 @@ static int epic_rx(struct net_device *dev, int budget)
                entry = ep->dirty_rx % RX_RING_SIZE;
                if (ep->rx_skbuff[entry] == NULL) {
                        struct sk_buff *skb;
-                       skb = ep->rx_skbuff[entry] = dev_alloc_skb(ep->rx_buf_sz + 2);
+                       skb = ep->rx_skbuff[entry] = netdev_alloc_skb(dev, ep->rx_buf_sz + 2);
                        if (skb == NULL)
                                break;
                        skb_reserve(skb, 2);    /* Align IP on 16 byte boundaries */
index 313ba3b..8814b2f 100644 (file)
@@ -401,7 +401,7 @@ static inline void   smc911x_rcv(struct net_device *dev)
        } else {
                /* Receive a valid packet */
                /* Alloc a buffer with extra room for DMA alignment */
-               skb=dev_alloc_skb(pkt_len+32);
+               skb = netdev_alloc_skb(dev, pkt_len+32);
                if (unlikely(skb == NULL)) {
                        PRINTK( "%s: Low memory, rcvd packet dropped.\n",
                                dev->name);
@@ -2065,7 +2065,6 @@ static int __devinit smc911x_drv_probe(struct platform_device *pdev)
 
        ndev = alloc_etherdev(sizeof(struct smc911x_local));
        if (!ndev) {
-               printk("%s: could not allocate device.\n", CARDNAME);
                ret = -ENOMEM;
                goto release_1;
        }
index 4e45094..50823da 100644 (file)
@@ -1222,7 +1222,7 @@ static void smc_rcv(struct net_device *dev)
                if ( status & RS_MULTICAST )
                        dev->stats.multicast++;
 
-               skb = dev_alloc_skb( packet_length + 5);
+               skb = netdev_alloc_skb(dev, packet_length + 5);
 
                if ( skb == NULL ) {
                        printk(KERN_NOTICE CARDNAME ": Low memory, packet dropped.\n");
index ada927a..d12e48a 100644 (file)
@@ -1500,7 +1500,7 @@ static void smc_rx(struct net_device *dev)
        struct sk_buff *skb;
        
        /* Note: packet_length adds 5 or 6 extra bytes here! */
-       skb = dev_alloc_skb(packet_length+2);
+       skb = netdev_alloc_skb(dev, packet_length+2);
        
        if (skb == NULL) {
            pr_debug("%s: Low memory, packet dropped.\n", dev->name);
index 64ad3ed..1dc4fad 100644 (file)
@@ -463,7 +463,7 @@ static inline void  smc_rcv(struct net_device *dev)
                 * multiple of 4 bytes on 32 bit buses.
                 * Hence packet_len - 6 + 2 + 2 + 2.
                 */
-               skb = dev_alloc_skb(packet_len);
+               skb = netdev_alloc_skb(dev, packet_len);
                if (unlikely(skb == NULL)) {
                        printk(KERN_NOTICE "%s: Low memory, packet dropped.\n",
                                dev->name);
@@ -2223,7 +2223,6 @@ static int __devinit smc_drv_probe(struct platform_device *pdev)
 
        ndev = alloc_etherdev(sizeof(struct smc_local));
        if (!ndev) {
-               printk("%s: could not allocate device.\n", CARDNAME);
                ret = -ENOMEM;
                goto out;
        }
index 24d2df0..4a69710 100644 (file)
@@ -1833,6 +1833,7 @@ static int smsc911x_set_mac_address(struct net_device *dev, void *p)
        if (!is_valid_ether_addr(addr->sa_data))
                return -EADDRNOTAVAIL;
 
+       dev->addr_assign_type &= ~NET_ADDR_RANDOM;
        memcpy(dev->dev_addr, addr->sa_data, ETH_ALEN);
 
        spin_lock_irq(&pdata->mac_lock);
@@ -2374,7 +2375,6 @@ static int __devinit smsc911x_drv_probe(struct platform_device *pdev)
 
        dev = alloc_etherdev(sizeof(struct smsc911x_data));
        if (!dev) {
-               pr_warn("Could not allocate device\n");
                retval = -ENOMEM;
                goto out_release_io_1;
        }
@@ -2486,7 +2486,7 @@ static int __devinit smsc911x_drv_probe(struct platform_device *pdev)
                                   "Mac Address is read from LAN911x EEPROM");
                } else {
                        /* eeprom values are invalid, generate random MAC */
-                       random_ether_addr(dev->dev_addr);
+                       eth_hw_addr_random(dev);
                        smsc911x_set_hw_mac_address(pdata, dev->dev_addr);
                        SMSC_TRACE(pdata, probe,
                                   "MAC Address is set to random_ether_addr");
index a9efbdf..3838647 100644 (file)
@@ -509,10 +509,9 @@ static void smsc9420_check_mac_address(struct net_device *dev)
                        smsc_dbg(PROBE, "Mac Address is read from EEPROM");
                } else {
                        /* eeprom values are invalid, generate random MAC */
-                       random_ether_addr(dev->dev_addr);
+                       eth_hw_addr_random(dev);
                        smsc9420_set_mac_address(dev);
-                       smsc_dbg(PROBE,
-                               "MAC Address is set to random_ether_addr");
+                       smsc_dbg(PROBE, "MAC Address is set to random");
                }
        }
 }
@@ -850,8 +849,6 @@ static int smsc9420_alloc_rx_buffer(struct smsc9420_pdata *pd, int index)
                return -ENOMEM;
        }
 
-       skb->dev = pd->dev;
-
        mapping = pci_map_single(pd->pdev, skb_tail_pointer(skb),
                                 PKT_BUF_SZ, PCI_DMA_FROMDEVICE);
        if (pci_dma_mapping_error(pd->pdev, mapping)) {
@@ -1598,10 +1595,8 @@ smsc9420_probe(struct pci_dev *pdev, const struct pci_device_id *id)
        pci_set_master(pdev);
 
        dev = alloc_etherdev(sizeof(*pd));
-       if (!dev) {
-               printk(KERN_ERR "ether device alloc failed\n");
+       if (!dev)
                goto out_disable_pci_device_1;
-       }
 
        SET_NETDEV_DEV(dev, &pdev->dev);
 
index 6ee593a..e85ffbd 100644 (file)
@@ -878,7 +878,7 @@ static void stmmac_check_ether_addr(struct stmmac_priv *priv)
                                             priv->dev->base_addr,
                                             priv->dev->dev_addr, 0);
                if  (!is_valid_ether_addr(priv->dev->dev_addr))
-                       random_ether_addr(priv->dev->dev_addr);
+                       eth_hw_addr_random(priv->dev);
        }
        pr_warning("%s: device MAC address %pM\n", priv->dev->name,
                                                   priv->dev->dev_addr);
@@ -910,10 +910,9 @@ static int stmmac_open(struct net_device *dev)
 
 #ifdef CONFIG_STMMAC_TIMER
        priv->tm = kzalloc(sizeof(struct stmmac_timer *), GFP_KERNEL);
-       if (unlikely(priv->tm == NULL)) {
-               pr_err("%s: ERROR: timer memory alloc failed\n", __func__);
+       if (unlikely(priv->tm == NULL))
                return -ENOMEM;
-       }
+
        priv->tm->freq = tmrate;
 
        /* Test if the external timer can be actually used.
@@ -1801,10 +1800,8 @@ struct stmmac_priv *stmmac_dvr_probe(struct device *device,
        struct stmmac_priv *priv;
 
        ndev = alloc_etherdev(sizeof(struct stmmac_priv));
-       if (!ndev) {
-               pr_err("%s: ERROR: allocating the device\n", __func__);
+       if (!ndev)
                return NULL;
-       }
 
        SET_NETDEV_DEV(ndev, device);
 
index 50ad5b8..da66ed7 100644 (file)
@@ -85,7 +85,7 @@ static int __devinit stmmac_pci_probe(struct pci_dev *pdev,
                        continue;
                addr = pci_iomap(pdev, i, 0);
                if (addr == NULL) {
-                       pr_err("%s: ERROR: cannot map regiser memory, aborting",
+                       pr_err("%s: ERROR: cannot map register memory, aborting",
                               __func__);
                        ret = -EIO;
                        goto err_out_map_failed;
index f10665f..b36edbd 100644 (file)
@@ -835,7 +835,6 @@ static int cas_saturn_firmware_init(struct cas *cp)
        cp->fw_data = vmalloc(cp->fw_size);
        if (!cp->fw_data) {
                err = -ENOMEM;
-               pr_err("\"%s\" Failed %d\n", fw_name, err);
                goto out;
        }
        memcpy(cp->fw_data, &fw->data[2], cp->fw_size);
@@ -1975,7 +1974,7 @@ static int cas_rx_process_pkt(struct cas *cp, struct cas_rx_comp *rxc,
        else
                alloclen = max(hlen, RX_COPY_MIN);
 
-       skb = dev_alloc_skb(alloclen + swivel + cp->crc_size);
+       skb = netdev_alloc_skb(cp->dev, alloclen + swivel + cp->crc_size);
        if (skb == NULL)
                return -1;
 
@@ -4947,7 +4946,6 @@ static int __devinit cas_init_one(struct pci_dev *pdev,
 
        dev = alloc_etherdev(sizeof(*cp));
        if (!dev) {
-               dev_err(&pdev->dev, "Etherdev alloc failed, aborting\n");
                err = -ENOMEM;
                goto err_out_disable_pdev;
        }
index cf43393..c99b3b0 100644 (file)
@@ -6412,7 +6412,7 @@ static int niu_set_mac_addr(struct net_device *dev, void *p)
        unsigned long flags;
 
        if (!is_valid_ether_addr(addr->sa_data))
-               return -EINVAL;
+               return -EADDRNOTAVAIL;
 
        memcpy(dev->dev_addr, addr->sa_data, ETH_ALEN);
 
@@ -9685,10 +9685,8 @@ static struct net_device * __devinit niu_alloc_and_init(
        struct niu *np;
 
        dev = alloc_etherdev_mq(sizeof(struct niu), NIU_NUM_TXCHAN);
-       if (!dev) {
-               dev_err(gen_dev, "Etherdev alloc failed, aborting\n");
+       if (!dev)
                return NULL;
-       }
 
        SET_NETDEV_DEV(dev, gen_dev);
 
index 220f724..f359863 100644 (file)
@@ -853,7 +853,7 @@ static void bigmac_rx(struct bigmac *bp)
                        /* Trim the original skb for the netif. */
                        skb_trim(skb, len);
                } else {
-                       struct sk_buff *copy_skb = dev_alloc_skb(len + 2);
+                       struct sk_buff *copy_skb = netdev_alloc_skb(bp->dev, len + 2);
 
                        if (copy_skb == NULL) {
                                drops++;
index 31441a8..ba04159 100644 (file)
@@ -2885,7 +2885,6 @@ static int __devinit gem_init_one(struct pci_dev *pdev,
 
        dev = alloc_etherdev(sizeof(*gp));
        if (!dev) {
-               pr_err("Etherdev alloc failed, aborting\n");
                err = -ENOMEM;
                goto err_disable_device;
        }
index 09c5186..8b627e2 100644 (file)
@@ -2043,7 +2043,7 @@ static void happy_meal_rx(struct happy_meal *hp, struct net_device *dev)
                        /* Trim the original skb for the netif. */
                        skb_trim(skb, len);
                } else {
-                       struct sk_buff *copy_skb = dev_alloc_skb(len + 2);
+                       struct sk_buff *copy_skb = netdev_alloc_skb(dev, len + 2);
 
                        if (copy_skb == NULL) {
                                drops++;
index b28f743..139d6b4 100644 (file)
@@ -435,7 +435,7 @@ static void qe_rx(struct sunqe *qep)
                        dev->stats.rx_length_errors++;
                        dev->stats.rx_dropped++;
                } else {
-                       skb = dev_alloc_skb(len + 2);
+                       skb = netdev_alloc_skb(dev, len + 2);
                        if (skb == NULL) {
                                drops++;
                                dev->stats.rx_dropped++;
@@ -907,14 +907,8 @@ static int __devinit qec_ether_init(struct platform_device *op)
 
        dev_set_drvdata(&op->dev, qe);
 
-       printk(KERN_INFO "%s: qe channel[%d] ", dev->name, qe->channel);
-       for (i = 0; i < 6; i++)
-               printk ("%2.2x%c",
-                       dev->dev_addr[i],
-                       i == 5 ? ' ': ':');
-       printk("\n");
-
-
+       printk(KERN_INFO "%s: qe channel[%d] %pM\n", dev->name, qe->channel,
+              dev->dev_addr);
        return 0;
 
 fail:
index 8c6c059..92a037a 100644 (file)
@@ -949,10 +949,9 @@ static int __devinit vnet_port_alloc_tx_bufs(struct vnet_port *port)
                int map_len = (ETH_FRAME_LEN + 7) & ~7;
 
                err = -ENOMEM;
-               if (!buf) {
-                       pr_err("TX buffer allocation failure\n");
+               if (!buf)
                        goto err_out;
-               }
+
                err = -EFAULT;
                if ((unsigned long)buf & (8UL - 1)) {
                        pr_err("TX buffer misaligned\n");
@@ -1027,10 +1026,8 @@ static struct vnet * __devinit vnet_new(const u64 *local_mac)
        int err, i;
 
        dev = alloc_etherdev(sizeof(*vp));
-       if (!dev) {
-               pr_err("Etherdev alloc failed, aborting\n");
+       if (!dev)
                return ERR_PTR(-ENOMEM);
-       }
 
        for (i = 0; i < ETH_ALEN; i++)
                dev->dev_addr[i] = (*local_mac >> (5 - i) * 8) & 0xff;
@@ -1165,10 +1162,8 @@ static int __devinit vnet_port_probe(struct vio_dev *vdev,
 
        port = kzalloc(sizeof(*port), GFP_KERNEL);
        err = -ENOMEM;
-       if (!port) {
-               pr_err("Cannot allocate vnet_port\n");
+       if (!port)
                goto err_out_put_mdesc;
-       }
 
        for (i = 0; i < ETH_ALEN; i++)
                port->raddr[i] = (*rmac >> (5 - i) * 8) & 0xff;
index 4b19e9b..ad973ff 100644 (file)
@@ -1089,12 +1089,11 @@ static void bdx_rx_alloc_skbs(struct bdx_priv *priv, struct rxf_fifo *f)
        ENTER;
        dno = bdx_rxdb_available(db) - 1;
        while (dno > 0) {
-               skb = dev_alloc_skb(f->m.pktsz + NET_IP_ALIGN);
+               skb = netdev_alloc_skb(priv->ndev, f->m.pktsz + NET_IP_ALIGN);
                if (!skb) {
-                       pr_err("NO MEM: dev_alloc_skb failed\n");
+                       pr_err("NO MEM: netdev_alloc_skb failed\n");
                        break;
                }
-               skb->dev = priv->ndev;
                skb_reserve(skb, NET_IP_ALIGN);
 
                idx = bdx_rxdb_alloc_elem(db);
@@ -1258,7 +1257,7 @@ static int bdx_rx_receive(struct bdx_priv *priv, struct rxd_fifo *f, int budget)
                skb = dm->skb;
 
                if (len < BDX_COPYBREAK &&
-                   (skb2 = dev_alloc_skb(len + NET_IP_ALIGN))) {
+                   (skb2 = netdev_alloc_skb(priv->ndev, len + NET_IP_ALIGN))) {
                        skb_reserve(skb2, NET_IP_ALIGN);
                        /*skb_put(skb2, len); */
                        pci_dma_sync_single_for_cpu(priv->pdev,
@@ -1978,7 +1977,6 @@ bdx_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
                ndev = alloc_etherdev(sizeof(struct bdx_priv));
                if (!ndev) {
                        err = -ENOMEM;
-                       pr_err("alloc_etherdev failed\n");
                        goto err_out_iomap;
                }
 
index cbc8df7..860c252 100644 (file)
@@ -1143,11 +1143,8 @@ static int __devinit cpmac_probe(struct platform_device *pdev)
        }
 
        dev = alloc_etherdev_mq(sizeof(*priv), CPMAC_QUEUES);
-
-       if (!dev) {
-               printk(KERN_ERR "cpmac: Unable to allocate net_device\n");
+       if (!dev)
                return -ENOMEM;
-       }
 
        platform_set_drvdata(pdev, dev);
        priv = netdev_priv(dev);
index c97d2f5..3455876 100644 (file)
@@ -822,7 +822,7 @@ int cpdma_chan_stop(struct cpdma_chan *chan)
        dma_reg_write(ctlr, chan->int_clear, chan->mask);
 
        /* trigger teardown */
-       dma_reg_write(ctlr, chan->td, chan->chan_num);
+       dma_reg_write(ctlr, chan->td, chan_linear(chan));
 
        /* wait for teardown complete */
        timeout = jiffies + HZ/10;      /* 100 msec */
index 4b2f545..174a334 100644 (file)
@@ -992,10 +992,9 @@ static irqreturn_t emac_irq(int irq, void *dev_id)
 
 static struct sk_buff *emac_rx_alloc(struct emac_priv *priv)
 {
-       struct sk_buff *skb = dev_alloc_skb(priv->rx_buf_size);
+       struct sk_buff *skb = netdev_alloc_skb(priv->ndev, priv->rx_buf_size);
        if (WARN_ON(!skb))
                return NULL;
-       skb->dev = priv->ndev;
        skb_reserve(skb, NET_IP_ALIGN);
        return skb;
 }
@@ -1257,15 +1256,15 @@ static int emac_dev_setmac_addr(struct net_device *ndev, void *addr)
        struct sockaddr *sa = addr;
 
        if (!is_valid_ether_addr(sa->sa_data))
-               return -EINVAL;
+               return -EADDRNOTAVAIL;
 
        /* Store mac addr in priv and rx channel and set it in EMAC hw */
        memcpy(priv->mac_addr, sa->sa_data, ndev->addr_len);
        memcpy(ndev->dev_addr, sa->sa_data, ndev->addr_len);
+       ndev->addr_assign_type &= ~NET_ADDR_RANDOM;
 
        /* MAC address is configured only after the interface is enabled. */
        if (netif_running(ndev)) {
-               memcpy(priv->mac_addr, sa->sa_data, ndev->addr_len);
                emac_setmac(priv, EMAC_DEF_RX_CH, priv->mac_addr);
        }
 
@@ -1792,7 +1791,6 @@ static int __devinit davinci_emac_probe(struct platform_device *pdev)
 
        ndev = alloc_etherdev(sizeof(struct emac_priv));
        if (!ndev) {
-               dev_err(&pdev->dev, "error allocating net_device\n");
                rc = -ENOMEM;
                goto free_clk;
        }
@@ -1900,7 +1898,8 @@ static int __devinit davinci_emac_probe(struct platform_device *pdev)
 
        if (!is_valid_ether_addr(priv->mac_addr)) {
                /* Use random MAC if none passed */
-               random_ether_addr(priv->mac_addr);
+               eth_hw_addr_random(ndev);
+               memcpy(priv->mac_addr, ndev->dev_addr, ndev->addr_len);
                dev_warn(&pdev->dev, "using random MAC addr: %pM\n",
                                                        priv->mac_addr);
        }
index af8b8fc..2757c7d 100644 (file)
@@ -53,7 +53,7 @@ struct davinci_mdio_regs {
        u32     control;
 #define CONTROL_IDLE           BIT(31)
 #define CONTROL_ENABLE         BIT(30)
-#define CONTROL_MAX_DIV                (0xff)
+#define CONTROL_MAX_DIV                (0xffff)
 
        u32     alive;
        u32     link;
index 9c0dd6b..817ad3b 100644 (file)
@@ -486,7 +486,6 @@ static int __devinit tlan_probe1(struct pci_dev *pdev,
 
        dev = alloc_etherdev(sizeof(struct tlan_priv));
        if (dev == NULL) {
-               pr_err("Could not allocate memory for device\n");
                rc = -ENOMEM;
                goto err_out_regions;
        }
index d9951af..261356c 100644 (file)
@@ -419,7 +419,7 @@ static bool tile_net_provide_needed_buffer(struct tile_net_cpu *info,
 #endif
 
        /* Avoid "false sharing" with last cache line. */
-       /* ISSUE: This is already done by "dev_alloc_skb()". */
+       /* ISSUE: This is already done by "netdev_alloc_skb()". */
        unsigned int len =
                 (((small ? LIPP_SMALL_PACKET_SIZE : large_size) +
                   CHIP_L2_LINE_SIZE() - 1) & -CHIP_L2_LINE_SIZE());
@@ -433,7 +433,7 @@ static bool tile_net_provide_needed_buffer(struct tile_net_cpu *info,
        struct sk_buff **skb_ptr;
 
        /* Request 96 extra bytes for alignment purposes. */
-       skb = dev_alloc_skb(len + padding);
+       skb = netdev_alloc_skb(info->napi->dev, len + padding);
        if (skb == NULL)
                return false;
 
@@ -2186,10 +2186,11 @@ static int tile_net_set_mac_address(struct net_device *dev, void *p)
        struct sockaddr *addr = p;
 
        if (!is_valid_ether_addr(addr->sa_data))
-               return -EINVAL;
+               return -EADDRNOTAVAIL;
 
        /* ISSUE: Note that "dev_addr" is now a pointer. */
        memcpy(dev->dev_addr, addr->sa_data, dev->addr_len);
+       dev->addr_assign_type &= ~NET_ADDR_RANDOM;
 
        return 0;
 }
@@ -2254,7 +2255,7 @@ static int tile_net_get_mac(struct net_device *dev)
                 * can't get its MAC address, we are most likely running
                 * the simulator, so let's generate a random MAC address.
                 */
-               random_ether_addr(dev->dev_addr);
+               eth_hw_addr_random(dev);
        }
 
        return 0;
index fd4ed7f..5c14f82 100644 (file)
@@ -1621,10 +1621,9 @@ static void gelic_wl_scan_complete_event(struct gelic_wl_info *wl)
                kfree(target->hwinfo);
                target->hwinfo = kzalloc(be16_to_cpu(scan_info->size),
                                         GFP_KERNEL);
-               if (!target->hwinfo) {
-                       pr_info("%s: kzalloc failed\n", __func__);
+               if (!target->hwinfo)
                        continue;
-               }
+
                /* copy hw scan info */
                memcpy(target->hwinfo, scan_info, scan_info->size);
                target->essid_len = strnlen(scan_info->essid,
index 71b785c..651a70c 100644 (file)
@@ -453,7 +453,7 @@ static struct sk_buff *alloc_rxbuf_skb(struct net_device *dev,
                                       dma_addr_t *dma_handle)
 {
        struct sk_buff *skb;
-       skb = dev_alloc_skb(RX_BUF_SIZE);
+       skb = netdev_alloc_skb(dev, RX_BUF_SIZE);
        if (!skb)
                return NULL;
        *dma_handle = pci_map_single(hwdev, skb->data, RX_BUF_SIZE,
@@ -808,10 +808,9 @@ static int __devinit tc35815_init_one(struct pci_dev *pdev,
 
        /* dev zeroed in alloc_etherdev */
        dev = alloc_etherdev(sizeof(*lp));
-       if (dev == NULL) {
-               dev_err(&pdev->dev, "unable to alloc new ethernet\n");
+       if (dev == NULL)
                return -ENOMEM;
-       }
+
        SET_NETDEV_DEV(dev, &pdev->dev);
        lp = netdev_priv(dev);
        lp->dev = dev;
@@ -850,7 +849,7 @@ static int __devinit tc35815_init_one(struct pci_dev *pdev,
        /* Retrieve the ethernet address. */
        if (tc35815_init_dev_addr(dev)) {
                dev_warn(&pdev->dev, "not valid ether addr\n");
-               random_ether_addr(dev->dev_addr);
+               eth_hw_addr_random(dev);
        }
 
        rc = register_netdev(dev);
index 164fb77..840e0e9 100644 (file)
@@ -1148,7 +1148,7 @@ static int tsi108_set_mac(struct net_device *dev, void *addr)
        int i;
 
        if (!is_valid_ether_addr(addr))
-               return -EINVAL;
+               return -EADDRNOTAVAIL;
 
        for (i = 0; i < 6; i++)
                /* +2 is for the offset of the HW addr type */
@@ -1582,10 +1582,8 @@ tsi108_init_one(struct platform_device *pdev)
        /* Create an ethernet device instance */
 
        dev = alloc_etherdev(sizeof(struct tsi108_prv_data));
-       if (!dev) {
-               printk("tsi108_eth: Could not allocate a device structure\n");
+       if (!dev)
                return -ENOMEM;
-       }
 
        printk("tsi108_eth%d: probe...\n", pdev->id);
        data = netdev_priv(dev);
index 10b18eb..39b8cf3 100644 (file)
@@ -927,7 +927,6 @@ static int __devinit rhine_init_one(struct pci_dev *pdev,
        dev = alloc_etherdev(sizeof(struct rhine_private));
        if (!dev) {
                rc = -ENOMEM;
-               dev_err(&pdev->dev, "alloc_etherdev failed\n");
                goto err_out;
        }
        SET_NETDEV_DEV(dev, &pdev->dev);
@@ -984,7 +983,7 @@ static int __devinit rhine_init_one(struct pci_dev *pdev,
        if (!is_valid_ether_addr(dev->dev_addr)) {
                /* Report it and use a random ethernet address instead */
                netdev_err(dev, "Invalid MAC address: %pM\n", dev->dev_addr);
-               random_ether_addr(dev->dev_addr);
+               eth_hw_addr_random(dev);
                netdev_info(dev, "Using random MAC address: %pM\n",
                            dev->dev_addr);
        }
@@ -1156,7 +1155,6 @@ static void alloc_rbufs(struct net_device *dev)
                rp->rx_skbuff[i] = skb;
                if (skb == NULL)
                        break;
-               skb->dev = dev;                 /* Mark as being used by this device. */
 
                rp->rx_skbuff_dma[i] =
                        pci_map_single(rp->pdev, skb->data, rp->rx_buf_sz,
@@ -1941,7 +1939,6 @@ static int rhine_rx(struct net_device *dev, int limit)
                        rp->rx_skbuff[entry] = skb;
                        if (skb == NULL)
                                break;  /* Better luck next round. */
-                       skb->dev = dev; /* Mark as being used by this device. */
                        rp->rx_skbuff_dma[entry] =
                                pci_map_single(rp->pdev, skb->data,
                                               rp->rx_buf_sz,
index cb35b14..8a5d7c1 100644 (file)
@@ -1509,7 +1509,7 @@ static int velocity_alloc_rx_buf(struct velocity_info *vptr, int idx)
        struct rx_desc *rd = &(vptr->rx.ring[idx]);
        struct velocity_rd_info *rd_info = &(vptr->rx.info[idx]);
 
-       rd_info->skb = dev_alloc_skb(vptr->rx.buf_sz + 64);
+       rd_info->skb = netdev_alloc_skb(vptr->dev, vptr->rx.buf_sz + 64);
        if (rd_info->skb == NULL)
                return -ENOMEM;
 
@@ -2730,10 +2730,8 @@ static int __devinit velocity_found1(struct pci_dev *pdev, const struct pci_devi
        }
 
        dev = alloc_etherdev(sizeof(struct velocity_info));
-       if (!dev) {
-               dev_err(&pdev->dev, "allocate net device failed.\n");
+       if (!dev)
                goto out;
-       }
 
        /* Chain it all together */
 
index d5a8260..5778a4a 100644 (file)
@@ -25,6 +25,14 @@ config XILINX_EMACLITE
        ---help---
          This driver supports the 10/100 Ethernet Lite from Xilinx.
 
+config XILINX_AXI_EMAC
+       tristate "Xilinx 10/100/1000 AXI Ethernet support"
+       depends on (PPC32 || MICROBLAZE)
+       select PHYLIB
+       ---help---
+         This driver supports the 10/100/1000 Ethernet from Xilinx for the
+         AXI bus interface used in Xilinx Virtex FPGAs.
+
 config XILINX_LL_TEMAC
        tristate "Xilinx LL TEMAC (LocalLink Tri-mode Ethernet MAC) driver"
        depends on (PPC || MICROBLAZE)
index 5feac73..214205e 100644 (file)
@@ -5,3 +5,5 @@
 ll_temac-objs := ll_temac_main.o ll_temac_mdio.o
 obj-$(CONFIG_XILINX_LL_TEMAC) += ll_temac.o
 obj-$(CONFIG_XILINX_EMACLITE) += xilinx_emaclite.o
+xilinx_emac-objs := xilinx_axienet_main.o xilinx_axienet_mdio.o
+obj-$(CONFIG_XILINX_AXI_EMAC) += xilinx_emac.o
index f21addb..d21591a 100644 (file)
@@ -327,7 +327,9 @@ static int temac_set_mac_address(struct net_device *ndev, void *address)
                memcpy(ndev->dev_addr, address, ETH_ALEN);
 
        if (!is_valid_ether_addr(ndev->dev_addr))
-               random_ether_addr(ndev->dev_addr);
+               eth_hw_addr_random(ndev);
+       else
+               ndev->addr_assign_type &= ~NET_ADDR_RANDOM;
 
        /* set up unicast MAC address filter set its mac address */
        mutex_lock(&lp->indirect_mutex);
@@ -1011,10 +1013,9 @@ static int __devinit temac_of_probe(struct platform_device *op)
 
        /* Init network device structure */
        ndev = alloc_etherdev(sizeof(*lp));
-       if (!ndev) {
-               dev_err(&op->dev, "could not allocate device.\n");
+       if (!ndev)
                return -ENOMEM;
-       }
+
        ether_setup(ndev);
        dev_set_drvdata(&op->dev, ndev);
        SET_NETDEV_DEV(ndev, &op->dev);
diff --git a/drivers/net/ethernet/xilinx/xilinx_axienet.h b/drivers/net/ethernet/xilinx/xilinx_axienet.h
new file mode 100644 (file)
index 0000000..cc83af0
--- /dev/null
@@ -0,0 +1,508 @@
+/*
+ * Definitions for Xilinx Axi Ethernet device driver.
+ *
+ * Copyright (c) 2009 Secret Lab Technologies, Ltd.
+ * Copyright (c) 2010 Xilinx, Inc. All rights reserved.
+ * Copyright (c) 2012 Daniel Borkmann, <daniel.borkmann@tik.ee.ethz.ch>
+ * Copyright (c) 2012 Ariane Keller, <ariane.keller@tik.ee.ethz.ch>
+ */
+
+#ifndef XILINX_AXIENET_H
+#define XILINX_AXIENET_H
+
+#include <linux/netdevice.h>
+#include <linux/spinlock.h>
+#include <linux/interrupt.h>
+
+/* Packet size info */
+#define XAE_HDR_SIZE                   14 /* Size of Ethernet header */
+#define XAE_HDR_VLAN_SIZE              18 /* Size of an Ethernet hdr + VLAN */
+#define XAE_TRL_SIZE                    4 /* Size of Ethernet trailer (FCS) */
+#define XAE_MTU                              1500 /* Max MTU of an Ethernet frame */
+#define XAE_JUMBO_MTU                9000 /* Max MTU of a jumbo Eth. frame */
+
+#define XAE_MAX_FRAME_SIZE      (XAE_MTU + XAE_HDR_SIZE + XAE_TRL_SIZE)
+#define XAE_MAX_VLAN_FRAME_SIZE  (XAE_MTU + XAE_HDR_VLAN_SIZE + XAE_TRL_SIZE)
+#define XAE_MAX_JUMBO_FRAME_SIZE (XAE_JUMBO_MTU + XAE_HDR_SIZE + XAE_TRL_SIZE)
+
+/* Configuration options */
+
+/* Accept all incoming packets. Default: disabled (cleared) */
+#define XAE_OPTION_PROMISC                     (1 << 0)
+
+/* Jumbo frame support for Tx & Rx. Default: disabled (cleared) */
+#define XAE_OPTION_JUMBO                       (1 << 1)
+
+/* VLAN Rx & Tx frame support. Default: disabled (cleared) */
+#define XAE_OPTION_VLAN                                (1 << 2)
+
+/* Enable recognition of flow control frames on Rx. Default: enabled (set) */
+#define XAE_OPTION_FLOW_CONTROL                        (1 << 4)
+
+/* Strip FCS and PAD from incoming frames. Note: PAD from VLAN frames is not
+ * stripped. Default: disabled (set) */
+#define XAE_OPTION_FCS_STRIP                   (1 << 5)
+
+/* Generate FCS field and add PAD automatically for outgoing frames.
+ * Default: enabled (set) */
+#define XAE_OPTION_FCS_INSERT                  (1 << 6)
+
+/* Enable Length/Type error checking for incoming frames. When this option is
+ * set, the MAC will filter frames that have a mismatched type/length field
+ * and if XAE_OPTION_REPORT_RXERR is set, the user is notified when these
+ * types of frames are encountered. When this option is cleared, the MAC will
+ * allow these types of frames to be received. Default: enabled (set) */
+#define XAE_OPTION_LENTYPE_ERR                 (1 << 7)
+
+/* Enable the transmitter. Default: enabled (set) */
+#define XAE_OPTION_TXEN                                (1 << 11)
+
+/*  Enable the receiver. Default: enabled (set) */
+#define XAE_OPTION_RXEN                                (1 << 12)
+
+/*  Default options set when device is initialized or reset */
+#define XAE_OPTION_DEFAULTS                               \
+                               (XAE_OPTION_TXEN |         \
+                                XAE_OPTION_FLOW_CONTROL | \
+                                XAE_OPTION_RXEN)
+
+/* Axi DMA Register definitions */
+
+#define XAXIDMA_TX_CR_OFFSET   0x00000000 /* Channel control */
+#define XAXIDMA_TX_SR_OFFSET   0x00000004 /* Status */
+#define XAXIDMA_TX_CDESC_OFFSET        0x00000008 /* Current descriptor pointer */
+#define XAXIDMA_TX_TDESC_OFFSET        0x00000010 /* Tail descriptor pointer */
+
+#define XAXIDMA_RX_CR_OFFSET   0x00000030 /* Channel control */
+#define XAXIDMA_RX_SR_OFFSET   0x00000034 /* Status */
+#define XAXIDMA_RX_CDESC_OFFSET        0x00000038 /* Current descriptor pointer */
+#define XAXIDMA_RX_TDESC_OFFSET        0x00000040 /* Tail descriptor pointer */
+
+#define XAXIDMA_CR_RUNSTOP_MASK        0x00000001 /* Start/stop DMA channel */
+#define XAXIDMA_CR_RESET_MASK  0x00000004 /* Reset DMA engine */
+
+#define XAXIDMA_BD_NDESC_OFFSET                0x00 /* Next descriptor pointer */
+#define XAXIDMA_BD_BUFA_OFFSET         0x08 /* Buffer address */
+#define XAXIDMA_BD_CTRL_LEN_OFFSET     0x18 /* Control/buffer length */
+#define XAXIDMA_BD_STS_OFFSET          0x1C /* Status */
+#define XAXIDMA_BD_USR0_OFFSET         0x20 /* User IP specific word0 */
+#define XAXIDMA_BD_USR1_OFFSET         0x24 /* User IP specific word1 */
+#define XAXIDMA_BD_USR2_OFFSET         0x28 /* User IP specific word2 */
+#define XAXIDMA_BD_USR3_OFFSET         0x2C /* User IP specific word3 */
+#define XAXIDMA_BD_USR4_OFFSET         0x30 /* User IP specific word4 */
+#define XAXIDMA_BD_ID_OFFSET           0x34 /* Sw ID */
+#define XAXIDMA_BD_HAS_STSCNTRL_OFFSET 0x38 /* Whether has stscntrl strm */
+#define XAXIDMA_BD_HAS_DRE_OFFSET      0x3C /* Whether has DRE */
+
+#define XAXIDMA_BD_HAS_DRE_SHIFT       8 /* Whether has DRE shift */
+#define XAXIDMA_BD_HAS_DRE_MASK                0xF00 /* Whether has DRE mask */
+#define XAXIDMA_BD_WORDLEN_MASK                0xFF /* Whether has DRE mask */
+
+#define XAXIDMA_BD_CTRL_LENGTH_MASK    0x007FFFFF /* Requested len */
+#define XAXIDMA_BD_CTRL_TXSOF_MASK     0x08000000 /* First tx packet */
+#define XAXIDMA_BD_CTRL_TXEOF_MASK     0x04000000 /* Last tx packet */
+#define XAXIDMA_BD_CTRL_ALL_MASK       0x0C000000 /* All control bits */
+
+#define XAXIDMA_DELAY_MASK             0xFF000000 /* Delay timeout counter */
+#define XAXIDMA_COALESCE_MASK          0x00FF0000 /* Coalesce counter */
+
+#define XAXIDMA_DELAY_SHIFT            24
+#define XAXIDMA_COALESCE_SHIFT         16
+
+#define XAXIDMA_IRQ_IOC_MASK           0x00001000 /* Completion intr */
+#define XAXIDMA_IRQ_DELAY_MASK         0x00002000 /* Delay interrupt */
+#define XAXIDMA_IRQ_ERROR_MASK         0x00004000 /* Error interrupt */
+#define XAXIDMA_IRQ_ALL_MASK           0x00007000 /* All interrupts */
+
+/* Default TX/RX Threshold and waitbound values for SGDMA mode */
+#define XAXIDMA_DFT_TX_THRESHOLD       24
+#define XAXIDMA_DFT_TX_WAITBOUND       254
+#define XAXIDMA_DFT_RX_THRESHOLD       24
+#define XAXIDMA_DFT_RX_WAITBOUND       254
+
+#define XAXIDMA_BD_CTRL_TXSOF_MASK     0x08000000 /* First tx packet */
+#define XAXIDMA_BD_CTRL_TXEOF_MASK     0x04000000 /* Last tx packet */
+#define XAXIDMA_BD_CTRL_ALL_MASK       0x0C000000 /* All control bits */
+
+#define XAXIDMA_BD_STS_ACTUAL_LEN_MASK 0x007FFFFF /* Actual len */
+#define XAXIDMA_BD_STS_COMPLETE_MASK   0x80000000 /* Completed */
+#define XAXIDMA_BD_STS_DEC_ERR_MASK    0x40000000 /* Decode error */
+#define XAXIDMA_BD_STS_SLV_ERR_MASK    0x20000000 /* Slave error */
+#define XAXIDMA_BD_STS_INT_ERR_MASK    0x10000000 /* Internal err */
+#define XAXIDMA_BD_STS_ALL_ERR_MASK    0x70000000 /* All errors */
+#define XAXIDMA_BD_STS_RXSOF_MASK      0x08000000 /* First rx pkt */
+#define XAXIDMA_BD_STS_RXEOF_MASK      0x04000000 /* Last rx pkt */
+#define XAXIDMA_BD_STS_ALL_MASK                0xFC000000 /* All status bits */
+
+#define XAXIDMA_BD_MINIMUM_ALIGNMENT   0x40
+
+/* Axi Ethernet registers definition */
+#define XAE_RAF_OFFSET         0x00000000 /* Reset and Address filter */
+#define XAE_TPF_OFFSET         0x00000004 /* Tx Pause Frame */
+#define XAE_IFGP_OFFSET                0x00000008 /* Tx Inter-frame gap adjustment*/
+#define XAE_IS_OFFSET          0x0000000C /* Interrupt status */
+#define XAE_IP_OFFSET          0x00000010 /* Interrupt pending */
+#define XAE_IE_OFFSET          0x00000014 /* Interrupt enable */
+#define XAE_TTAG_OFFSET                0x00000018 /* Tx VLAN TAG */
+#define XAE_RTAG_OFFSET                0x0000001C /* Rx VLAN TAG */
+#define XAE_UAWL_OFFSET                0x00000020 /* Unicast address word lower */
+#define XAE_UAWU_OFFSET                0x00000024 /* Unicast address word upper */
+#define XAE_TPID0_OFFSET       0x00000028 /* VLAN TPID0 register */
+#define XAE_TPID1_OFFSET       0x0000002C /* VLAN TPID1 register */
+#define XAE_PPST_OFFSET                0x00000030 /* PCS PMA Soft Temac Status Reg */
+#define XAE_RCW0_OFFSET                0x00000400 /* Rx Configuration Word 0 */
+#define XAE_RCW1_OFFSET                0x00000404 /* Rx Configuration Word 1 */
+#define XAE_TC_OFFSET          0x00000408 /* Tx Configuration */
+#define XAE_FCC_OFFSET         0x0000040C /* Flow Control Configuration */
+#define XAE_EMMC_OFFSET                0x00000410 /* EMAC mode configuration */
+#define XAE_PHYC_OFFSET                0x00000414 /* RGMII/SGMII configuration */
+#define XAE_MDIO_MC_OFFSET     0x00000500 /* MII Management Config */
+#define XAE_MDIO_MCR_OFFSET    0x00000504 /* MII Management Control */
+#define XAE_MDIO_MWD_OFFSET    0x00000508 /* MII Management Write Data */
+#define XAE_MDIO_MRD_OFFSET    0x0000050C /* MII Management Read Data */
+#define XAE_MDIO_MIS_OFFSET    0x00000600 /* MII Management Interrupt Status */
+#define XAE_MDIO_MIP_OFFSET    0x00000620 /* MII Mgmt Interrupt Pending
+                                           * register offset */
+#define XAE_MDIO_MIE_OFFSET    0x00000640 /* MII Management Interrupt Enable
+                                           * register offset */
+#define XAE_MDIO_MIC_OFFSET    0x00000660 /* MII Management Interrupt Clear
+                                           * register offset. */
+#define XAE_UAW0_OFFSET                0x00000700 /* Unicast address word 0 */
+#define XAE_UAW1_OFFSET                0x00000704 /* Unicast address word 1 */
+#define XAE_FMI_OFFSET         0x00000708 /* Filter Mask Index */
+#define XAE_AF0_OFFSET         0x00000710 /* Address Filter 0 */
+#define XAE_AF1_OFFSET         0x00000714 /* Address Filter 1 */
+
+#define XAE_TX_VLAN_DATA_OFFSET 0x00004000 /* TX VLAN data table address */
+#define XAE_RX_VLAN_DATA_OFFSET 0x00008000 /* RX VLAN data table address */
+#define XAE_MCAST_TABLE_OFFSET 0x00020000 /* Multicast table address */
+
+/* Bit Masks for Axi Ethernet RAF register */
+#define XAE_RAF_MCSTREJ_MASK           0x00000002 /* Reject receive multicast
+                                                   * destination address */
+#define XAE_RAF_BCSTREJ_MASK           0x00000004 /* Reject receive broadcast
+                                                   * destination address */
+#define XAE_RAF_TXVTAGMODE_MASK                0x00000018 /* Tx VLAN TAG mode */
+#define XAE_RAF_RXVTAGMODE_MASK                0x00000060 /* Rx VLAN TAG mode */
+#define XAE_RAF_TXVSTRPMODE_MASK       0x00000180 /* Tx VLAN STRIP mode */
+#define XAE_RAF_RXVSTRPMODE_MASK       0x00000600 /* Rx VLAN STRIP mode */
+#define XAE_RAF_NEWFNCENBL_MASK                0x00000800 /* New function mode */
+#define XAE_RAF_EMULTIFLTRENBL_MASK    0x00001000 /* Exteneded Multicast
+                                                   * Filtering mode
+                                                   */
+#define XAE_RAF_STATSRST_MASK          0x00002000 /* Stats. Counter Reset */
+#define XAE_RAF_RXBADFRMEN_MASK                0x00004000 /* Recv Bad Frame Enable */
+#define XAE_RAF_TXVTAGMODE_SHIFT       3 /* Tx Tag mode shift bits */
+#define XAE_RAF_RXVTAGMODE_SHIFT       5 /* Rx Tag mode shift bits */
+#define XAE_RAF_TXVSTRPMODE_SHIFT      7 /* Tx strip mode shift bits*/
+#define XAE_RAF_RXVSTRPMODE_SHIFT      9 /* Rx Strip mode shift bits*/
+
+/* Bit Masks for Axi Ethernet TPF and IFGP registers */
+#define XAE_TPF_TPFV_MASK              0x0000FFFF /* Tx pause frame value */
+#define XAE_IFGP0_IFGP_MASK            0x0000007F /* Transmit inter-frame
+                                                   * gap adjustment value */
+
+/* Bit Masks for Axi Ethernet IS, IE and IP registers, Same masks apply
+ * for all 3 registers. */
+#define XAE_INT_HARDACSCMPLT_MASK      0x00000001 /* Hard register access
+                                                   * complete */
+#define XAE_INT_AUTONEG_MASK           0x00000002 /* Auto negotiation
+                                                   * complete */
+#define XAE_INT_RXCMPIT_MASK           0x00000004 /* Rx complete */
+#define XAE_INT_RXRJECT_MASK           0x00000008 /* Rx frame rejected */
+#define XAE_INT_RXFIFOOVR_MASK         0x00000010 /* Rx fifo overrun */
+#define XAE_INT_TXCMPIT_MASK           0x00000020 /* Tx complete */
+#define XAE_INT_RXDCMLOCK_MASK         0x00000040 /* Rx Dcm Lock */
+#define XAE_INT_MGTRDY_MASK            0x00000080 /* MGT clock Lock */
+#define XAE_INT_PHYRSTCMPLT_MASK       0x00000100 /* Phy Reset complete */
+#define XAE_INT_ALL_MASK               0x0000003F /* All the ints */
+
+#define XAE_INT_RECV_ERROR_MASK                                \
+       (XAE_INT_RXRJECT_MASK | XAE_INT_RXFIFOOVR_MASK) /* INT bits that
+                                                        * indicate receive
+                                                        * errors */
+
+/* Bit masks for Axi Ethernet VLAN TPID Word 0 register */
+#define XAE_TPID_0_MASK                0x0000FFFF /* TPID 0 */
+#define XAE_TPID_1_MASK                0xFFFF0000 /* TPID 1 */
+
+/* Bit masks for Axi Ethernet VLAN TPID Word 1 register */
+#define XAE_TPID_2_MASK                0x0000FFFF /* TPID 0 */
+#define XAE_TPID_3_MASK                0xFFFF0000 /* TPID 1 */
+
+/* Bit masks for Axi Ethernet RCW1 register */
+#define XAE_RCW1_RST_MASK      0x80000000 /* Reset */
+#define XAE_RCW1_JUM_MASK      0x40000000 /* Jumbo frame enable */
+#define XAE_RCW1_FCS_MASK      0x20000000 /* In-Band FCS enable
+                                           * (FCS not stripped) */
+#define XAE_RCW1_RX_MASK       0x10000000 /* Receiver enable */
+#define XAE_RCW1_VLAN_MASK     0x08000000 /* VLAN frame enable */
+#define XAE_RCW1_LT_DIS_MASK   0x02000000 /* Length/type field valid check
+                                           * disable */
+#define XAE_RCW1_CL_DIS_MASK   0x01000000 /* Control frame Length check
+                                           * disable */
+#define XAE_RCW1_PAUSEADDR_MASK 0x0000FFFF /* Pause frame source address
+                                           * bits [47:32]. Bits [31:0] are
+                                           * stored in register RCW0 */
+
+/* Bit masks for Axi Ethernet TC register */
+#define XAE_TC_RST_MASK                0x80000000 /* Reset */
+#define XAE_TC_JUM_MASK                0x40000000 /* Jumbo frame enable */
+#define XAE_TC_FCS_MASK                0x20000000 /* In-Band FCS enable
+                                           * (FCS not generated) */
+#define XAE_TC_TX_MASK         0x10000000 /* Transmitter enable */
+#define XAE_TC_VLAN_MASK       0x08000000 /* VLAN frame enable */
+#define XAE_TC_IFG_MASK                0x02000000 /* Inter-frame gap adjustment
+                                           * enable */
+
+/* Bit masks for Axi Ethernet FCC register */
+#define XAE_FCC_FCRX_MASK      0x20000000 /* Rx flow control enable */
+#define XAE_FCC_FCTX_MASK      0x40000000 /* Tx flow control enable */
+
+/* Bit masks for Axi Ethernet EMMC register */
+#define XAE_EMMC_LINKSPEED_MASK        0xC0000000 /* Link speed */
+#define XAE_EMMC_RGMII_MASK    0x20000000 /* RGMII mode enable */
+#define XAE_EMMC_SGMII_MASK    0x10000000 /* SGMII mode enable */
+#define XAE_EMMC_GPCS_MASK     0x08000000 /* 1000BaseX mode enable */
+#define XAE_EMMC_HOST_MASK     0x04000000 /* Host interface enable */
+#define XAE_EMMC_TX16BIT       0x02000000 /* 16 bit Tx client enable */
+#define XAE_EMMC_RX16BIT       0x01000000 /* 16 bit Rx client enable */
+#define XAE_EMMC_LINKSPD_10    0x00000000 /* Link Speed mask for 10 Mbit */
+#define XAE_EMMC_LINKSPD_100   0x40000000 /* Link Speed mask for 100 Mbit */
+#define XAE_EMMC_LINKSPD_1000  0x80000000 /* Link Speed mask for 1000 Mbit */
+
+/* Bit masks for Axi Ethernet PHYC register */
+#define XAE_PHYC_SGMIILINKSPEED_MASK   0xC0000000 /* SGMII link speed mask*/
+#define XAE_PHYC_RGMIILINKSPEED_MASK   0x0000000C /* RGMII link speed */
+#define XAE_PHYC_RGMIIHD_MASK          0x00000002 /* RGMII Half-duplex */
+#define XAE_PHYC_RGMIILINK_MASK                0x00000001 /* RGMII link status */
+#define XAE_PHYC_RGLINKSPD_10          0x00000000 /* RGMII link 10 Mbit */
+#define XAE_PHYC_RGLINKSPD_100         0x00000004 /* RGMII link 100 Mbit */
+#define XAE_PHYC_RGLINKSPD_1000                0x00000008 /* RGMII link 1000 Mbit */
+#define XAE_PHYC_SGLINKSPD_10          0x00000000 /* SGMII link 10 Mbit */
+#define XAE_PHYC_SGLINKSPD_100         0x40000000 /* SGMII link 100 Mbit */
+#define XAE_PHYC_SGLINKSPD_1000                0x80000000 /* SGMII link 1000 Mbit */
+
+/* Bit masks for Axi Ethernet MDIO interface MC register */
+#define XAE_MDIO_MC_MDIOEN_MASK                0x00000040 /* MII management enable */
+#define XAE_MDIO_MC_CLOCK_DIVIDE_MAX   0x3F       /* Maximum MDIO divisor */
+
+/* Bit masks for Axi Ethernet MDIO interface MCR register */
+#define XAE_MDIO_MCR_PHYAD_MASK                0x1F000000 /* Phy Address Mask */
+#define XAE_MDIO_MCR_PHYAD_SHIFT       24         /* Phy Address Shift */
+#define XAE_MDIO_MCR_REGAD_MASK                0x001F0000 /* Reg Address Mask */
+#define XAE_MDIO_MCR_REGAD_SHIFT       16         /* Reg Address Shift */
+#define XAE_MDIO_MCR_OP_MASK           0x0000C000 /* Operation Code Mask */
+#define XAE_MDIO_MCR_OP_SHIFT          13         /* Operation Code Shift */
+#define XAE_MDIO_MCR_OP_READ_MASK      0x00008000 /* Op Code Read Mask */
+#define XAE_MDIO_MCR_OP_WRITE_MASK     0x00004000 /* Op Code Write Mask */
+#define XAE_MDIO_MCR_INITIATE_MASK     0x00000800 /* Ready Mask */
+#define XAE_MDIO_MCR_READY_MASK                0x00000080 /* Ready Mask */
+
+/* Bit masks for Axi Ethernet MDIO interface MIS, MIP, MIE, MIC registers */
+#define XAE_MDIO_INT_MIIM_RDY_MASK     0x00000001 /* MIIM Interrupt */
+
+/* Bit masks for Axi Ethernet UAW1 register */
+#define XAE_UAW1_UNICASTADDR_MASK      0x0000FFFF /* Station address bits
+                                                   * [47:32]; Station address
+                                                   * bits [31:0] are stored in
+                                                   * register UAW0 */
+
+/* Bit masks for Axi Ethernet FMI register */
+#define XAE_FMI_PM_MASK                        0x80000000 /* Promis. mode enable */
+#define XAE_FMI_IND_MASK               0x00000003 /* Index Mask */
+
+#define XAE_MDIO_DIV_DFT               29 /* Default MDIO clock divisor */
+
+/* Defines for different options for C_PHY_TYPE parameter in Axi Ethernet IP */
+#define XAE_PHY_TYPE_MII               0
+#define XAE_PHY_TYPE_GMII              1
+#define XAE_PHY_TYPE_RGMII_1_3         2
+#define XAE_PHY_TYPE_RGMII_2_0         3
+#define XAE_PHY_TYPE_SGMII             4
+#define XAE_PHY_TYPE_1000BASE_X                5
+
+#define XAE_MULTICAST_CAM_TABLE_NUM    4 /* Total number of entries in the
+                                          * hardware multicast table. */
+
+/* Axi Ethernet Synthesis features */
+#define XAE_FEATURE_PARTIAL_RX_CSUM    (1 << 0)
+#define XAE_FEATURE_PARTIAL_TX_CSUM    (1 << 1)
+#define XAE_FEATURE_FULL_RX_CSUM       (1 << 2)
+#define XAE_FEATURE_FULL_TX_CSUM       (1 << 3)
+
+#define XAE_NO_CSUM_OFFLOAD            0
+
+#define XAE_FULL_CSUM_STATUS_MASK      0x00000038
+#define XAE_IP_UDP_CSUM_VALIDATED      0x00000003
+#define XAE_IP_TCP_CSUM_VALIDATED      0x00000002
+
+#define DELAY_OF_ONE_MILLISEC          1000
+
+/**
+ * struct axidma_bd - Axi Dma buffer descriptor layout
+ * @next:         MM2S/S2MM Next Descriptor Pointer
+ * @reserved1:    Reserved and not used
+ * @phys:         MM2S/S2MM Buffer Address
+ * @reserved2:    Reserved and not used
+ * @reserved3:    Reserved and not used
+ * @reserved4:    Reserved and not used
+ * @cntrl:        MM2S/S2MM Control value
+ * @status:       MM2S/S2MM Status value
+ * @app0:         MM2S/S2MM User Application Field 0.
+ * @app1:         MM2S/S2MM User Application Field 1.
+ * @app2:         MM2S/S2MM User Application Field 2.
+ * @app3:         MM2S/S2MM User Application Field 3.
+ * @app4:         MM2S/S2MM User Application Field 4.
+ * @sw_id_offset: MM2S/S2MM Sw ID
+ * @reserved5:    Reserved and not used
+ * @reserved6:    Reserved and not used
+ */
+struct axidma_bd {
+       u32 next;       /* Physical address of next buffer descriptor */
+       u32 reserved1;
+       u32 phys;
+       u32 reserved2;
+       u32 reserved3;
+       u32 reserved4;
+       u32 cntrl;
+       u32 status;
+       u32 app0;
+       u32 app1;       /* TX start << 16 | insert */
+       u32 app2;       /* TX csum seed */
+       u32 app3;
+       u32 app4;
+       u32 sw_id_offset;
+       u32 reserved5;
+       u32 reserved6;
+};
+
+/**
+ * struct axienet_local - axienet private per device data
+ * @ndev:      Pointer for net_device to which it will be attached.
+ * @dev:       Pointer to device structure
+ * @phy_dev:   Pointer to PHY device structure attached to the axienet_local
+ * @phy_node:  Pointer to device node structure
+ * @mii_bus:   Pointer to MII bus structure
+ * @mdio_irqs: IRQs table for MDIO bus required in mii_bus structure
+ * @regs:      Base address for the axienet_local device address space
+ * @dma_regs:  Base address for the axidma device address space
+ * @dma_err_tasklet: Tasklet structure to process Axi DMA errors
+ * @tx_irq:    Axidma TX IRQ number
+ * @rx_irq:    Axidma RX IRQ number
+ * @temac_type:        axienet type to identify between soft and hard temac
+ * @phy_type:  Phy type to identify between MII/GMII/RGMII/SGMII/1000 Base-X
+ * @options:   AxiEthernet option word
+ * @last_link: Phy link state in which the PHY was negotiated earlier
+ * @features:  Stores the extended features supported by the axienet hw
+ * @tx_bd_v:   Virtual address of the TX buffer descriptor ring
+ * @tx_bd_p:   Physical address(start address) of the TX buffer descr. ring
+ * @rx_bd_v:   Virtual address of the RX buffer descriptor ring
+ * @rx_bd_p:   Physical address(start address) of the RX buffer descr. ring
+ * @tx_bd_ci:  Stores the index of the Tx buffer descriptor in the ring being
+ *             accessed currently. Used while alloc. BDs before a TX starts
+ * @tx_bd_tail:        Stores the index of the Tx buffer descriptor in the ring being
+ *             accessed currently. Used while processing BDs after the TX
+ *             completed.
+ * @rx_bd_ci:  Stores the index of the Rx buffer descriptor in the ring being
+ *             accessed currently.
+ * @max_frm_size: Stores the maximum size of the frame that can be that
+ *               Txed/Rxed in the existing hardware. If jumbo option is
+ *               supported, the maximum frame size would be 9k. Else it is
+ *               1522 bytes (assuming support for basic VLAN)
+ * @jumbo_support: Stores hardware configuration for jumbo support. If hardware
+ *                can handle jumbo packets, this entry will be 1, else 0.
+ */
+struct axienet_local {
+       struct net_device *ndev;
+       struct device *dev;
+
+       /* Connection to PHY device */
+       struct phy_device *phy_dev;     /* Pointer to PHY device */
+       struct device_node *phy_node;
+
+       /* MDIO bus data */
+       struct mii_bus *mii_bus;        /* MII bus reference */
+       int mdio_irqs[PHY_MAX_ADDR];    /* IRQs table for MDIO bus */
+
+       /* IO registers, dma functions and IRQs */
+       void __iomem *regs;
+       void __iomem *dma_regs;
+
+       struct tasklet_struct dma_err_tasklet;
+
+       int tx_irq;
+       int rx_irq;
+       u32 temac_type;
+       u32 phy_type;
+
+       u32 options;                    /* Current options word */
+       u32 last_link;
+       u32 features;
+
+       /* Buffer descriptors */
+       struct axidma_bd *tx_bd_v;
+       dma_addr_t tx_bd_p;
+       struct axidma_bd *rx_bd_v;
+       dma_addr_t rx_bd_p;
+       u32 tx_bd_ci;
+       u32 tx_bd_tail;
+       u32 rx_bd_ci;
+
+       u32 max_frm_size;
+       u32 jumbo_support;
+
+       int csum_offload_on_tx_path;
+       int csum_offload_on_rx_path;
+
+       u32 coalesce_count_rx;
+       u32 coalesce_count_tx;
+};
+
+/**
+ * struct axiethernet_option - Used to set axi ethernet hardware options
+ * @opt:       Option to be set.
+ * @reg:       Register offset to be written for setting the option
+ * @m_or:      Mask to be ORed for setting the option in the register
+ */
+struct axienet_option {
+       u32 opt;
+       u32 reg;
+       u32 m_or;
+};
+
+/**
+ * axienet_ior - Memory mapped Axi Ethernet register read
+ * @lp:         Pointer to axienet local structure
+ * @offset:     Address offset from the base address of Axi Ethernet core
+ *
+ * returns: The contents of the Axi Ethernet register
+ *
+ * This function returns the contents of the corresponding register.
+ */
+static inline u32 axienet_ior(struct axienet_local *lp, off_t offset)
+{
+       return in_be32(lp->regs + offset);
+}
+
+/**
+ * axienet_iow - Memory mapped Axi Ethernet register write
+ * @lp:         Pointer to axienet local structure
+ * @offset:     Address offset from the base address of Axi Ethernet core
+ * @value:      Value to be written into the Axi Ethernet register
+ *
+ * This function writes the desired value into the corresponding Axi Ethernet
+ * register.
+ */
+static inline void axienet_iow(struct axienet_local *lp, off_t offset,
+                              u32 value)
+{
+       out_be32((lp->regs + offset), value);
+}
+
+/* Function prototypes visible in xilinx_axienet_mdio.c for other files */
+int axienet_mdio_setup(struct axienet_local *lp, struct device_node *np);
+int axienet_mdio_wait_until_ready(struct axienet_local *lp);
+void axienet_mdio_teardown(struct axienet_local *lp);
+
+#endif /* XILINX_AXI_ENET_H */
diff --git a/drivers/net/ethernet/xilinx/xilinx_axienet_main.c b/drivers/net/ethernet/xilinx/xilinx_axienet_main.c
new file mode 100644 (file)
index 0000000..2fcbeba
--- /dev/null
@@ -0,0 +1,1669 @@
+/*
+ * Xilinx Axi Ethernet device driver
+ *
+ * Copyright (c) 2008 Nissin Systems Co., Ltd.,  Yoshio Kashiwagi
+ * Copyright (c) 2005-2008 DLA Systems,  David H. Lynch Jr. <dhlii@dlasys.net>
+ * Copyright (c) 2008-2009 Secret Lab Technologies Ltd.
+ * Copyright (c) 2010 Xilinx, Inc. All rights reserved.
+ * Copyright (c) 2012 Daniel Borkmann, <daniel.borkmann@tik.ee.ethz.ch>
+ * Copyright (c) 2012 Ariane Keller, <ariane.keller@tik.ee.ethz.ch>
+ *
+ * This is a driver for the Xilinx Axi Ethernet which is used in the Virtex6
+ * and Spartan6.
+ *
+ * TODO:
+ *  - Add Axi Fifo support.
+ *  - Factor out Axi DMA code into separate driver.
+ *  - Test and fix basic multicast filtering.
+ *  - Add support for extended multicast filtering.
+ *  - Test basic VLAN support.
+ *  - Add support for extended VLAN support.
+ */
+
+#include <linux/delay.h>
+#include <linux/etherdevice.h>
+#include <linux/init.h>
+#include <linux/module.h>
+#include <linux/netdevice.h>
+#include <linux/of_mdio.h>
+#include <linux/of_platform.h>
+#include <linux/of_address.h>
+#include <linux/skbuff.h>
+#include <linux/spinlock.h>
+#include <linux/phy.h>
+#include <linux/mii.h>
+#include <linux/ethtool.h>
+
+#include "xilinx_axienet.h"
+
+/* Descriptors defines for Tx and Rx DMA - 2^n for the best performance */
+#define TX_BD_NUM              64
+#define RX_BD_NUM              128
+
+/* Must be shorter than length of ethtool_drvinfo.driver field to fit */
+#define DRIVER_NAME            "xaxienet"
+#define DRIVER_DESCRIPTION     "Xilinx Axi Ethernet driver"
+#define DRIVER_VERSION         "1.00a"
+
+#define AXIENET_REGS_N         32
+
+/* Match table for of_platform binding */
+static struct of_device_id axienet_of_match[] __devinitdata = {
+       { .compatible = "xlnx,axi-ethernet-1.00.a", },
+       { .compatible = "xlnx,axi-ethernet-1.01.a", },
+       { .compatible = "xlnx,axi-ethernet-2.01.a", },
+       {},
+};
+
+MODULE_DEVICE_TABLE(of, axienet_of_match);
+
+/* Option table for setting up Axi Ethernet hardware options */
+static struct axienet_option axienet_options[] = {
+       /* Turn on jumbo packet support for both Rx and Tx */
+       {
+               .opt = XAE_OPTION_JUMBO,
+               .reg = XAE_TC_OFFSET,
+               .m_or = XAE_TC_JUM_MASK,
+       }, {
+               .opt = XAE_OPTION_JUMBO,
+               .reg = XAE_RCW1_OFFSET,
+               .m_or = XAE_RCW1_JUM_MASK,
+       }, { /* Turn on VLAN packet support for both Rx and Tx */
+               .opt = XAE_OPTION_VLAN,
+               .reg = XAE_TC_OFFSET,
+               .m_or = XAE_TC_VLAN_MASK,
+       }, {
+               .opt = XAE_OPTION_VLAN,
+               .reg = XAE_RCW1_OFFSET,
+               .m_or = XAE_RCW1_VLAN_MASK,
+       }, { /* Turn on FCS stripping on receive packets */
+               .opt = XAE_OPTION_FCS_STRIP,
+               .reg = XAE_RCW1_OFFSET,
+               .m_or = XAE_RCW1_FCS_MASK,
+       }, { /* Turn on FCS insertion on transmit packets */
+               .opt = XAE_OPTION_FCS_INSERT,
+               .reg = XAE_TC_OFFSET,
+               .m_or = XAE_TC_FCS_MASK,
+       }, { /* Turn off length/type field checking on receive packets */
+               .opt = XAE_OPTION_LENTYPE_ERR,
+               .reg = XAE_RCW1_OFFSET,
+               .m_or = XAE_RCW1_LT_DIS_MASK,
+       }, { /* Turn on Rx flow control */
+               .opt = XAE_OPTION_FLOW_CONTROL,
+               .reg = XAE_FCC_OFFSET,
+               .m_or = XAE_FCC_FCRX_MASK,
+       }, { /* Turn on Tx flow control */
+               .opt = XAE_OPTION_FLOW_CONTROL,
+               .reg = XAE_FCC_OFFSET,
+               .m_or = XAE_FCC_FCTX_MASK,
+       }, { /* Turn on promiscuous frame filtering */
+               .opt = XAE_OPTION_PROMISC,
+               .reg = XAE_FMI_OFFSET,
+               .m_or = XAE_FMI_PM_MASK,
+       }, { /* Enable transmitter */
+               .opt = XAE_OPTION_TXEN,
+               .reg = XAE_TC_OFFSET,
+               .m_or = XAE_TC_TX_MASK,
+       }, { /* Enable receiver */
+               .opt = XAE_OPTION_RXEN,
+               .reg = XAE_RCW1_OFFSET,
+               .m_or = XAE_RCW1_RX_MASK,
+       },
+       {}
+};
+
+/**
+ * axienet_dma_in32 - Memory mapped Axi DMA register read
+ * @lp:                Pointer to axienet local structure
+ * @reg:       Address offset from the base address of the Axi DMA core
+ *
+ * returns: The contents of the Axi DMA register
+ *
+ * This function returns the contents of the corresponding Axi DMA register.
+ */
+static inline u32 axienet_dma_in32(struct axienet_local *lp, off_t reg)
+{
+       return in_be32(lp->dma_regs + reg);
+}
+
+/**
+ * axienet_dma_out32 - Memory mapped Axi DMA register write.
+ * @lp:                Pointer to axienet local structure
+ * @reg:       Address offset from the base address of the Axi DMA core
+ * @value:     Value to be written into the Axi DMA register
+ *
+ * This function writes the desired value into the corresponding Axi DMA
+ * register.
+ */
+static inline void axienet_dma_out32(struct axienet_local *lp,
+                                    off_t reg, u32 value)
+{
+       out_be32((lp->dma_regs + reg), value);
+}
+
+/**
+ * axienet_dma_bd_release - Release buffer descriptor rings
+ * @ndev:      Pointer to the net_device structure
+ *
+ * This function is used to release the descriptors allocated in
+ * axienet_dma_bd_init. axienet_dma_bd_release is called when Axi Ethernet
+ * driver stop api is called.
+ */
+static void axienet_dma_bd_release(struct net_device *ndev)
+{
+       int i;
+       struct axienet_local *lp = netdev_priv(ndev);
+
+       for (i = 0; i < RX_BD_NUM; i++) {
+               dma_unmap_single(ndev->dev.parent, lp->rx_bd_v[i].phys,
+                                lp->max_frm_size, DMA_FROM_DEVICE);
+               dev_kfree_skb((struct sk_buff *)
+                             (lp->rx_bd_v[i].sw_id_offset));
+       }
+
+       if (lp->rx_bd_v) {
+               dma_free_coherent(ndev->dev.parent,
+                                 sizeof(*lp->rx_bd_v) * RX_BD_NUM,
+                                 lp->rx_bd_v,
+                                 lp->rx_bd_p);
+       }
+       if (lp->tx_bd_v) {
+               dma_free_coherent(ndev->dev.parent,
+                                 sizeof(*lp->tx_bd_v) * TX_BD_NUM,
+                                 lp->tx_bd_v,
+                                 lp->tx_bd_p);
+       }
+}
+
+/**
+ * axienet_dma_bd_init - Setup buffer descriptor rings for Axi DMA
+ * @ndev:      Pointer to the net_device structure
+ *
+ * returns: 0, on success
+ *         -ENOMEM, on failure
+ *
+ * This function is called to initialize the Rx and Tx DMA descriptor
+ * rings. This initializes the descriptors with required default values
+ * and is called when Axi Ethernet driver reset is called.
+ */
+static int axienet_dma_bd_init(struct net_device *ndev)
+{
+       u32 cr;
+       int i;
+       struct sk_buff *skb;
+       struct axienet_local *lp = netdev_priv(ndev);
+
+       /* Reset the indexes which are used for accessing the BDs */
+       lp->tx_bd_ci = 0;
+       lp->tx_bd_tail = 0;
+       lp->rx_bd_ci = 0;
+
+       /*
+        * Allocate the Tx and Rx buffer descriptors.
+        */
+       lp->tx_bd_v = dma_alloc_coherent(ndev->dev.parent,
+                                        sizeof(*lp->tx_bd_v) * TX_BD_NUM,
+                                        &lp->tx_bd_p,
+                                        GFP_KERNEL);
+       if (!lp->tx_bd_v) {
+               dev_err(&ndev->dev, "unable to allocate DMA Tx buffer "
+                       "descriptors");
+               goto out;
+       }
+
+       lp->rx_bd_v = dma_alloc_coherent(ndev->dev.parent,
+                                        sizeof(*lp->rx_bd_v) * RX_BD_NUM,
+                                        &lp->rx_bd_p,
+                                        GFP_KERNEL);
+       if (!lp->rx_bd_v) {
+               dev_err(&ndev->dev, "unable to allocate DMA Rx buffer "
+                       "descriptors");
+               goto out;
+       }
+
+       memset(lp->tx_bd_v, 0, sizeof(*lp->tx_bd_v) * TX_BD_NUM);
+       for (i = 0; i < TX_BD_NUM; i++) {
+               lp->tx_bd_v[i].next = lp->tx_bd_p +
+                                     sizeof(*lp->tx_bd_v) *
+                                     ((i + 1) % TX_BD_NUM);
+       }
+
+       memset(lp->rx_bd_v, 0, sizeof(*lp->rx_bd_v) * RX_BD_NUM);
+       for (i = 0; i < RX_BD_NUM; i++) {
+               lp->rx_bd_v[i].next = lp->rx_bd_p +
+                                     sizeof(*lp->rx_bd_v) *
+                                     ((i + 1) % RX_BD_NUM);
+
+               skb = netdev_alloc_skb_ip_align(ndev, lp->max_frm_size);
+               if (!skb) {
+                       dev_err(&ndev->dev, "alloc_skb error %d\n", i);
+                       goto out;
+               }
+
+               lp->rx_bd_v[i].sw_id_offset = (u32) skb;
+               lp->rx_bd_v[i].phys = dma_map_single(ndev->dev.parent,
+                                                    skb->data,
+                                                    lp->max_frm_size,
+                                                    DMA_FROM_DEVICE);
+               lp->rx_bd_v[i].cntrl = lp->max_frm_size;
+       }
+
+       /* Start updating the Rx channel control register */
+       cr = axienet_dma_in32(lp, XAXIDMA_RX_CR_OFFSET);
+       /* Update the interrupt coalesce count */
+       cr = ((cr & ~XAXIDMA_COALESCE_MASK) |
+             ((lp->coalesce_count_rx) << XAXIDMA_COALESCE_SHIFT));
+       /* Update the delay timer count */
+       cr = ((cr & ~XAXIDMA_DELAY_MASK) |
+             (XAXIDMA_DFT_RX_WAITBOUND << XAXIDMA_DELAY_SHIFT));
+       /* Enable coalesce, delay timer and error interrupts */
+       cr |= XAXIDMA_IRQ_ALL_MASK;
+       /* Write to the Rx channel control register */
+       axienet_dma_out32(lp, XAXIDMA_RX_CR_OFFSET, cr);
+
+       /* Start updating the Tx channel control register */
+       cr = axienet_dma_in32(lp, XAXIDMA_TX_CR_OFFSET);
+       /* Update the interrupt coalesce count */
+       cr = (((cr & ~XAXIDMA_COALESCE_MASK)) |
+             ((lp->coalesce_count_tx) << XAXIDMA_COALESCE_SHIFT));
+       /* Update the delay timer count */
+       cr = (((cr & ~XAXIDMA_DELAY_MASK)) |
+             (XAXIDMA_DFT_TX_WAITBOUND << XAXIDMA_DELAY_SHIFT));
+       /* Enable coalesce, delay timer and error interrupts */
+       cr |= XAXIDMA_IRQ_ALL_MASK;
+       /* Write to the Tx channel control register */
+       axienet_dma_out32(lp, XAXIDMA_TX_CR_OFFSET, cr);
+
+       /* Populate the tail pointer and bring the Rx Axi DMA engine out of
+        * halted state. This will make the Rx side ready for reception.*/
+       axienet_dma_out32(lp, XAXIDMA_RX_CDESC_OFFSET, lp->rx_bd_p);
+       cr = axienet_dma_in32(lp, XAXIDMA_RX_CR_OFFSET);
+       axienet_dma_out32(lp, XAXIDMA_RX_CR_OFFSET,
+                         cr | XAXIDMA_CR_RUNSTOP_MASK);
+       axienet_dma_out32(lp, XAXIDMA_RX_TDESC_OFFSET, lp->rx_bd_p +
+                         (sizeof(*lp->rx_bd_v) * (RX_BD_NUM - 1)));
+
+       /* Write to the RS (Run-stop) bit in the Tx channel control register.
+        * Tx channel is now ready to run. But only after we write to the
+        * tail pointer register that the Tx channel will start transmitting */
+       axienet_dma_out32(lp, XAXIDMA_TX_CDESC_OFFSET, lp->tx_bd_p);
+       cr = axienet_dma_in32(lp, XAXIDMA_TX_CR_OFFSET);
+       axienet_dma_out32(lp, XAXIDMA_TX_CR_OFFSET,
+                         cr | XAXIDMA_CR_RUNSTOP_MASK);
+
+       return 0;
+out:
+       axienet_dma_bd_release(ndev);
+       return -ENOMEM;
+}
+
+/**
+ * axienet_set_mac_address - Write the MAC address
+ * @ndev:      Pointer to the net_device structure
+ * @address:   6 byte Address to be written as MAC address
+ *
+ * This function is called to initialize the MAC address of the Axi Ethernet
+ * core. It writes to the UAW0 and UAW1 registers of the core.
+ */
+static void axienet_set_mac_address(struct net_device *ndev, void *address)
+{
+       struct axienet_local *lp = netdev_priv(ndev);
+
+       if (address)
+               memcpy(ndev->dev_addr, address, ETH_ALEN);
+       if (!is_valid_ether_addr(ndev->dev_addr))
+               random_ether_addr(ndev->dev_addr);
+
+       /* Set up unicast MAC address filter set its mac address */
+       axienet_iow(lp, XAE_UAW0_OFFSET,
+                   (ndev->dev_addr[0]) |
+                   (ndev->dev_addr[1] << 8) |
+                   (ndev->dev_addr[2] << 16) |
+                   (ndev->dev_addr[3] << 24));
+       axienet_iow(lp, XAE_UAW1_OFFSET,
+                   (((axienet_ior(lp, XAE_UAW1_OFFSET)) &
+                     ~XAE_UAW1_UNICASTADDR_MASK) |
+                    (ndev->dev_addr[4] |
+                    (ndev->dev_addr[5] << 8))));
+}
+
+/**
+ * netdev_set_mac_address - Write the MAC address (from outside the driver)
+ * @ndev:      Pointer to the net_device structure
+ * @p:         6 byte Address to be written as MAC address
+ *
+ * returns: 0 for all conditions. Presently, there is no failure case.
+ *
+ * This function is called to initialize the MAC address of the Axi Ethernet
+ * core. It calls the core specific axienet_set_mac_address. This is the
+ * function that goes into net_device_ops structure entry ndo_set_mac_address.
+ */
+static int netdev_set_mac_address(struct net_device *ndev, void *p)
+{
+       struct sockaddr *addr = p;
+       axienet_set_mac_address(ndev, addr->sa_data);
+       return 0;
+}
+
+/**
+ * axienet_set_multicast_list - Prepare the multicast table
+ * @ndev:      Pointer to the net_device structure
+ *
+ * This function is called to initialize the multicast table during
+ * initialization. The Axi Ethernet basic multicast support has a four-entry
+ * multicast table which is initialized here. Additionally this function
+ * goes into the net_device_ops structure entry ndo_set_multicast_list. This
+ * means whenever the multicast table entries need to be updated this
+ * function gets called.
+ */
+static void axienet_set_multicast_list(struct net_device *ndev)
+{
+       int i;
+       u32 reg, af0reg, af1reg;
+       struct axienet_local *lp = netdev_priv(ndev);
+
+       if (ndev->flags & (IFF_ALLMULTI | IFF_PROMISC) ||
+           netdev_mc_count(ndev) > XAE_MULTICAST_CAM_TABLE_NUM) {
+               /* We must make the kernel realize we had to move into
+                * promiscuous mode. If it was a promiscuous mode request
+                * the flag is already set. If not we set it. */
+               ndev->flags |= IFF_PROMISC;
+               reg = axienet_ior(lp, XAE_FMI_OFFSET);
+               reg |= XAE_FMI_PM_MASK;
+               axienet_iow(lp, XAE_FMI_OFFSET, reg);
+               dev_info(&ndev->dev, "Promiscuous mode enabled.\n");
+       } else if (!netdev_mc_empty(ndev)) {
+               struct netdev_hw_addr *ha;
+
+               i = 0;
+               netdev_for_each_mc_addr(ha, ndev) {
+                       if (i >= XAE_MULTICAST_CAM_TABLE_NUM)
+                               break;
+
+                       af0reg = (ha->addr[0]);
+                       af0reg |= (ha->addr[1] << 8);
+                       af0reg |= (ha->addr[2] << 16);
+                       af0reg |= (ha->addr[3] << 24);
+
+                       af1reg = (ha->addr[4]);
+                       af1reg |= (ha->addr[5] << 8);
+
+                       reg = axienet_ior(lp, XAE_FMI_OFFSET) & 0xFFFFFF00;
+                       reg |= i;
+
+                       axienet_iow(lp, XAE_FMI_OFFSET, reg);
+                       axienet_iow(lp, XAE_AF0_OFFSET, af0reg);
+                       axienet_iow(lp, XAE_AF1_OFFSET, af1reg);
+                       i++;
+               }
+       } else {
+               reg = axienet_ior(lp, XAE_FMI_OFFSET);
+               reg &= ~XAE_FMI_PM_MASK;
+
+               axienet_iow(lp, XAE_FMI_OFFSET, reg);
+
+               for (i = 0; i < XAE_MULTICAST_CAM_TABLE_NUM; i++) {
+                       reg = axienet_ior(lp, XAE_FMI_OFFSET) & 0xFFFFFF00;
+                       reg |= i;
+
+                       axienet_iow(lp, XAE_FMI_OFFSET, reg);
+                       axienet_iow(lp, XAE_AF0_OFFSET, 0);
+                       axienet_iow(lp, XAE_AF1_OFFSET, 0);
+               }
+
+               dev_info(&ndev->dev, "Promiscuous mode disabled.\n");
+       }
+}
+
+/**
+ * axienet_setoptions - Set an Axi Ethernet option
+ * @ndev:      Pointer to the net_device structure
+ * @options:   Option to be enabled/disabled
+ *
+ * The Axi Ethernet core has multiple features which can be selectively turned
+ * on or off. The typical options could be jumbo frame option, basic VLAN
+ * option, promiscuous mode option etc. This function is used to set or clear
+ * these options in the Axi Ethernet hardware. This is done through
+ * axienet_option structure .
+ */
+static void axienet_setoptions(struct net_device *ndev, u32 options)
+{
+       int reg;
+       struct axienet_local *lp = netdev_priv(ndev);
+       struct axienet_option *tp = &axienet_options[0];
+
+       while (tp->opt) {
+               reg = ((axienet_ior(lp, tp->reg)) & ~(tp->m_or));
+               if (options & tp->opt)
+                       reg |= tp->m_or;
+               axienet_iow(lp, tp->reg, reg);
+               tp++;
+       }
+
+       lp->options |= options;
+}
+
+static void __axienet_device_reset(struct axienet_local *lp,
+                                  struct device *dev, off_t offset)
+{
+       u32 timeout;
+       /* Reset Axi DMA. This would reset Axi Ethernet core as well. The reset
+        * process of Axi DMA takes a while to complete as all pending
+        * commands/transfers will be flushed or completed during this
+        * reset process. */
+       axienet_dma_out32(lp, offset, XAXIDMA_CR_RESET_MASK);
+       timeout = DELAY_OF_ONE_MILLISEC;
+       while (axienet_dma_in32(lp, offset) & XAXIDMA_CR_RESET_MASK) {
+               udelay(1);
+               if (--timeout == 0) {
+                       dev_err(dev, "axienet_device_reset DMA "
+                               "reset timeout!\n");
+                       break;
+               }
+       }
+}
+
+/**
+ * axienet_device_reset - Reset and initialize the Axi Ethernet hardware.
+ * @ndev:      Pointer to the net_device structure
+ *
+ * This function is called to reset and initialize the Axi Ethernet core. This
+ * is typically called during initialization. It does a reset of the Axi DMA
+ * Rx/Tx channels and initializes the Axi DMA BDs. Since Axi DMA reset lines
+ * areconnected to Axi Ethernet reset lines, this in turn resets the Axi
+ * Ethernet core. No separate hardware reset is done for the Axi Ethernet
+ * core.
+ */
+static void axienet_device_reset(struct net_device *ndev)
+{
+       u32 axienet_status;
+       struct axienet_local *lp = netdev_priv(ndev);
+
+       __axienet_device_reset(lp, &ndev->dev, XAXIDMA_TX_CR_OFFSET);
+       __axienet_device_reset(lp, &ndev->dev, XAXIDMA_RX_CR_OFFSET);
+
+       lp->max_frm_size = XAE_MAX_VLAN_FRAME_SIZE;
+       lp->options &= (~XAE_OPTION_JUMBO);
+
+       if ((ndev->mtu > XAE_MTU) &&
+           (ndev->mtu <= XAE_JUMBO_MTU) &&
+           (lp->jumbo_support)) {
+               lp->max_frm_size = ndev->mtu + XAE_HDR_VLAN_SIZE +
+                                  XAE_TRL_SIZE;
+               lp->options |= XAE_OPTION_JUMBO;
+       }
+
+       if (axienet_dma_bd_init(ndev)) {
+               dev_err(&ndev->dev, "axienet_device_reset descriptor "
+                       "allocation failed\n");
+       }
+
+       axienet_status = axienet_ior(lp, XAE_RCW1_OFFSET);
+       axienet_status &= ~XAE_RCW1_RX_MASK;
+       axienet_iow(lp, XAE_RCW1_OFFSET, axienet_status);
+
+       axienet_status = axienet_ior(lp, XAE_IP_OFFSET);
+       if (axienet_status & XAE_INT_RXRJECT_MASK)
+               axienet_iow(lp, XAE_IS_OFFSET, XAE_INT_RXRJECT_MASK);
+
+       axienet_iow(lp, XAE_FCC_OFFSET, XAE_FCC_FCRX_MASK);
+
+       /* Sync default options with HW but leave receiver and
+        * transmitter disabled.*/
+       axienet_setoptions(ndev, lp->options &
+                          ~(XAE_OPTION_TXEN | XAE_OPTION_RXEN));
+       axienet_set_mac_address(ndev, NULL);
+       axienet_set_multicast_list(ndev);
+       axienet_setoptions(ndev, lp->options);
+
+       ndev->trans_start = jiffies;
+}
+
+/**
+ * axienet_adjust_link - Adjust the PHY link speed/duplex.
+ * @ndev:      Pointer to the net_device structure
+ *
+ * This function is called to change the speed and duplex setting after
+ * auto negotiation is done by the PHY. This is the function that gets
+ * registered with the PHY interface through the "of_phy_connect" call.
+ */
+static void axienet_adjust_link(struct net_device *ndev)
+{
+       u32 emmc_reg;
+       u32 link_state;
+       u32 setspeed = 1;
+       struct axienet_local *lp = netdev_priv(ndev);
+       struct phy_device *phy = lp->phy_dev;
+
+       link_state = phy->speed | (phy->duplex << 1) | phy->link;
+       if (lp->last_link != link_state) {
+               if ((phy->speed == SPEED_10) || (phy->speed == SPEED_100)) {
+                       if (lp->phy_type == XAE_PHY_TYPE_1000BASE_X)
+                               setspeed = 0;
+               } else {
+                       if ((phy->speed == SPEED_1000) &&
+                           (lp->phy_type == XAE_PHY_TYPE_MII))
+                               setspeed = 0;
+               }
+
+               if (setspeed == 1) {
+                       emmc_reg = axienet_ior(lp, XAE_EMMC_OFFSET);
+                       emmc_reg &= ~XAE_EMMC_LINKSPEED_MASK;
+
+                       switch (phy->speed) {
+                       case SPEED_1000:
+                               emmc_reg |= XAE_EMMC_LINKSPD_1000;
+                               break;
+                       case SPEED_100:
+                               emmc_reg |= XAE_EMMC_LINKSPD_100;
+                               break;
+                       case SPEED_10:
+                               emmc_reg |= XAE_EMMC_LINKSPD_10;
+                               break;
+                       default:
+                               dev_err(&ndev->dev, "Speed other than 10, 100 "
+                                       "or 1Gbps is not supported\n");
+                               break;
+                       }
+
+                       axienet_iow(lp, XAE_EMMC_OFFSET, emmc_reg);
+                       lp->last_link = link_state;
+                       phy_print_status(phy);
+               } else {
+                       dev_err(&ndev->dev, "Error setting Axi Ethernet "
+                               "mac speed\n");
+               }
+       }
+}
+
+/**
+ * axienet_start_xmit_done - Invoked once a transmit is completed by the
+ * Axi DMA Tx channel.
+ * @ndev:      Pointer to the net_device structure
+ *
+ * This function is invoked from the Axi DMA Tx isr to notify the completion
+ * of transmit operation. It clears fields in the corresponding Tx BDs and
+ * unmaps the corresponding buffer so that CPU can regain ownership of the
+ * buffer. It finally invokes "netif_wake_queue" to restart transmission if
+ * required.
+ */
+static void axienet_start_xmit_done(struct net_device *ndev)
+{
+       u32 size = 0;
+       u32 packets = 0;
+       struct axienet_local *lp = netdev_priv(ndev);
+       struct axidma_bd *cur_p;
+       unsigned int status = 0;
+
+       cur_p = &lp->tx_bd_v[lp->tx_bd_ci];
+       status = cur_p->status;
+       while (status & XAXIDMA_BD_STS_COMPLETE_MASK) {
+               dma_unmap_single(ndev->dev.parent, cur_p->phys,
+                               (cur_p->cntrl & XAXIDMA_BD_CTRL_LENGTH_MASK),
+                               DMA_TO_DEVICE);
+               if (cur_p->app4)
+                       dev_kfree_skb_irq((struct sk_buff *)cur_p->app4);
+               /*cur_p->phys = 0;*/
+               cur_p->app0 = 0;
+               cur_p->app1 = 0;
+               cur_p->app2 = 0;
+               cur_p->app4 = 0;
+               cur_p->status = 0;
+
+               size += status & XAXIDMA_BD_STS_ACTUAL_LEN_MASK;
+               packets++;
+
+               lp->tx_bd_ci = ++lp->tx_bd_ci % TX_BD_NUM;
+               cur_p = &lp->tx_bd_v[lp->tx_bd_ci];
+               status = cur_p->status;
+       }
+
+       ndev->stats.tx_packets += packets;
+       ndev->stats.tx_bytes += size;
+       netif_wake_queue(ndev);
+}
+
+/**
+ * axienet_check_tx_bd_space - Checks if a BD/group of BDs are currently busy
+ * @lp:                Pointer to the axienet_local structure
+ * @num_frag:  The number of BDs to check for
+ *
+ * returns: 0, on success
+ *         NETDEV_TX_BUSY, if any of the descriptors are not free
+ *
+ * This function is invoked before BDs are allocated and transmission starts.
+ * This function returns 0 if a BD or group of BDs can be allocated for
+ * transmission. If the BD or any of the BDs are not free the function
+ * returns a busy status. This is invoked from axienet_start_xmit.
+ */
+static inline int axienet_check_tx_bd_space(struct axienet_local *lp,
+                                           int num_frag)
+{
+       struct axidma_bd *cur_p;
+       cur_p = &lp->tx_bd_v[(lp->tx_bd_tail + num_frag) % TX_BD_NUM];
+       if (cur_p->status & XAXIDMA_BD_STS_ALL_MASK)
+               return NETDEV_TX_BUSY;
+       return 0;
+}
+
+/**
+ * axienet_start_xmit - Starts the transmission.
+ * @skb:       sk_buff pointer that contains data to be Txed.
+ * @ndev:      Pointer to net_device structure.
+ *
+ * returns: NETDEV_TX_OK, on success
+ *         NETDEV_TX_BUSY, if any of the descriptors are not free
+ *
+ * This function is invoked from upper layers to initiate transmission. The
+ * function uses the next available free BDs and populates their fields to
+ * start the transmission. Additionally if checksum offloading is supported,
+ * it populates AXI Stream Control fields with appropriate values.
+ */
+static int axienet_start_xmit(struct sk_buff *skb, struct net_device *ndev)
+{
+       u32 ii;
+       u32 num_frag;
+       u32 csum_start_off;
+       u32 csum_index_off;
+       skb_frag_t *frag;
+       dma_addr_t tail_p;
+       struct axienet_local *lp = netdev_priv(ndev);
+       struct axidma_bd *cur_p;
+
+       num_frag = skb_shinfo(skb)->nr_frags;
+       cur_p = &lp->tx_bd_v[lp->tx_bd_tail];
+
+       if (axienet_check_tx_bd_space(lp, num_frag)) {
+               if (!netif_queue_stopped(ndev))
+                       netif_stop_queue(ndev);
+               return NETDEV_TX_BUSY;
+       }
+
+       if (skb->ip_summed == CHECKSUM_PARTIAL) {
+               if (lp->features & XAE_FEATURE_FULL_TX_CSUM) {
+                       /* Tx Full Checksum Offload Enabled */
+                       cur_p->app0 |= 2;
+               } else if (lp->features & XAE_FEATURE_PARTIAL_RX_CSUM) {
+                       csum_start_off = skb_transport_offset(skb);
+                       csum_index_off = csum_start_off + skb->csum_offset;
+                       /* Tx Partial Checksum Offload Enabled */
+                       cur_p->app0 |= 1;
+                       cur_p->app1 = (csum_start_off << 16) | csum_index_off;
+               }
+       } else if (skb->ip_summed == CHECKSUM_UNNECESSARY) {
+               cur_p->app0 |= 2; /* Tx Full Checksum Offload Enabled */
+       }
+
+       cur_p->cntrl = skb_headlen(skb) | XAXIDMA_BD_CTRL_TXSOF_MASK;
+       cur_p->phys = dma_map_single(ndev->dev.parent, skb->data,
+                                    skb_headlen(skb), DMA_TO_DEVICE);
+
+       for (ii = 0; ii < num_frag; ii++) {
+               lp->tx_bd_tail = ++lp->tx_bd_tail % TX_BD_NUM;
+               cur_p = &lp->tx_bd_v[lp->tx_bd_tail];
+               frag = &skb_shinfo(skb)->frags[ii];
+               cur_p->phys = dma_map_single(ndev->dev.parent,
+                                            skb_frag_address(frag),
+                                            skb_frag_size(frag),
+                                            DMA_TO_DEVICE);
+               cur_p->cntrl = skb_frag_size(frag);
+       }
+
+       cur_p->cntrl |= XAXIDMA_BD_CTRL_TXEOF_MASK;
+       cur_p->app4 = (unsigned long)skb;
+
+       tail_p = lp->tx_bd_p + sizeof(*lp->tx_bd_v) * lp->tx_bd_tail;
+       /* Start the transfer */
+       axienet_dma_out32(lp, XAXIDMA_TX_TDESC_OFFSET, tail_p);
+       lp->tx_bd_tail = ++lp->tx_bd_tail % TX_BD_NUM;
+
+       return NETDEV_TX_OK;
+}
+
+/**
+ * axienet_recv - Is called from Axi DMA Rx Isr to complete the received
+ *               BD processing.
+ * @ndev:      Pointer to net_device structure.
+ *
+ * This function is invoked from the Axi DMA Rx isr to process the Rx BDs. It
+ * does minimal processing and invokes "netif_rx" to complete further
+ * processing.
+ */
+static void axienet_recv(struct net_device *ndev)
+{
+       u32 length;
+       u32 csumstatus;
+       u32 size = 0;
+       u32 packets = 0;
+       dma_addr_t tail_p;
+       struct axienet_local *lp = netdev_priv(ndev);
+       struct sk_buff *skb, *new_skb;
+       struct axidma_bd *cur_p;
+
+       tail_p = lp->rx_bd_p + sizeof(*lp->rx_bd_v) * lp->rx_bd_ci;
+       cur_p = &lp->rx_bd_v[lp->rx_bd_ci];
+
+       while ((cur_p->status & XAXIDMA_BD_STS_COMPLETE_MASK)) {
+               skb = (struct sk_buff *) (cur_p->sw_id_offset);
+               length = cur_p->app4 & 0x0000FFFF;
+
+               dma_unmap_single(ndev->dev.parent, cur_p->phys,
+                                lp->max_frm_size,
+                                DMA_FROM_DEVICE);
+
+               skb_put(skb, length);
+               skb->protocol = eth_type_trans(skb, ndev);
+               /*skb_checksum_none_assert(skb);*/
+               skb->ip_summed = CHECKSUM_NONE;
+
+               /* if we're doing Rx csum offload, set it up */
+               if (lp->features & XAE_FEATURE_FULL_RX_CSUM) {
+                       csumstatus = (cur_p->app2 &
+                                     XAE_FULL_CSUM_STATUS_MASK) >> 3;
+                       if ((csumstatus == XAE_IP_TCP_CSUM_VALIDATED) ||
+                           (csumstatus == XAE_IP_UDP_CSUM_VALIDATED)) {
+                               skb->ip_summed = CHECKSUM_UNNECESSARY;
+                       }
+               } else if ((lp->features & XAE_FEATURE_PARTIAL_RX_CSUM) != 0 &&
+                          skb->protocol == __constant_htons(ETH_P_IP) &&
+                          skb->len > 64) {
+                       skb->csum = be32_to_cpu(cur_p->app3 & 0xFFFF);
+                       skb->ip_summed = CHECKSUM_COMPLETE;
+               }
+
+               netif_rx(skb);
+
+               size += length;
+               packets++;
+
+               new_skb = netdev_alloc_skb_ip_align(ndev, lp->max_frm_size);
+               if (!new_skb) {
+                       dev_err(&ndev->dev, "no memory for new sk_buff\n");
+                       return;
+               }
+               cur_p->phys = dma_map_single(ndev->dev.parent, new_skb->data,
+                                            lp->max_frm_size,
+                                            DMA_FROM_DEVICE);
+               cur_p->cntrl = lp->max_frm_size;
+               cur_p->status = 0;
+               cur_p->sw_id_offset = (u32) new_skb;
+
+               lp->rx_bd_ci = ++lp->rx_bd_ci % RX_BD_NUM;
+               cur_p = &lp->rx_bd_v[lp->rx_bd_ci];
+       }
+
+       ndev->stats.rx_packets += packets;
+       ndev->stats.rx_bytes += size;
+
+       axienet_dma_out32(lp, XAXIDMA_RX_TDESC_OFFSET, tail_p);
+}
+
+/**
+ * axienet_tx_irq - Tx Done Isr.
+ * @irq:       irq number
+ * @_ndev:     net_device pointer
+ *
+ * returns: IRQ_HANDLED for all cases.
+ *
+ * This is the Axi DMA Tx done Isr. It invokes "axienet_start_xmit_done"
+ * to complete the BD processing.
+ */
+static irqreturn_t axienet_tx_irq(int irq, void *_ndev)
+{
+       u32 cr;
+       unsigned int status;
+       struct net_device *ndev = _ndev;
+       struct axienet_local *lp = netdev_priv(ndev);
+
+       status = axienet_dma_in32(lp, XAXIDMA_TX_SR_OFFSET);
+       if (status & (XAXIDMA_IRQ_IOC_MASK | XAXIDMA_IRQ_DELAY_MASK)) {
+               axienet_start_xmit_done(lp->ndev);
+               goto out;
+       }
+       if (!(status & XAXIDMA_IRQ_ALL_MASK))
+               dev_err(&ndev->dev, "No interrupts asserted in Tx path");
+       if (status & XAXIDMA_IRQ_ERROR_MASK) {
+               dev_err(&ndev->dev, "DMA Tx error 0x%x\n", status);
+               dev_err(&ndev->dev, "Current BD is at: 0x%x\n",
+                       (lp->tx_bd_v[lp->tx_bd_ci]).phys);
+
+               cr = axienet_dma_in32(lp, XAXIDMA_TX_CR_OFFSET);
+               /* Disable coalesce, delay timer and error interrupts */
+               cr &= (~XAXIDMA_IRQ_ALL_MASK);
+               /* Write to the Tx channel control register */
+               axienet_dma_out32(lp, XAXIDMA_TX_CR_OFFSET, cr);
+
+               cr = axienet_dma_in32(lp, XAXIDMA_RX_CR_OFFSET);
+               /* Disable coalesce, delay timer and error interrupts */
+               cr &= (~XAXIDMA_IRQ_ALL_MASK);
+               /* Write to the Rx channel control register */
+               axienet_dma_out32(lp, XAXIDMA_RX_CR_OFFSET, cr);
+
+               tasklet_schedule(&lp->dma_err_tasklet);
+       }
+out:
+       axienet_dma_out32(lp, XAXIDMA_TX_SR_OFFSET, status);
+       return IRQ_HANDLED;
+}
+
+/**
+ * axienet_rx_irq - Rx Isr.
+ * @irq:       irq number
+ * @_ndev:     net_device pointer
+ *
+ * returns: IRQ_HANDLED for all cases.
+ *
+ * This is the Axi DMA Rx Isr. It invokes "axienet_recv" to complete the BD
+ * processing.
+ */
+static irqreturn_t axienet_rx_irq(int irq, void *_ndev)
+{
+       u32 cr;
+       unsigned int status;
+       struct net_device *ndev = _ndev;
+       struct axienet_local *lp = netdev_priv(ndev);
+
+       status = axienet_dma_in32(lp, XAXIDMA_RX_SR_OFFSET);
+       if (status & (XAXIDMA_IRQ_IOC_MASK | XAXIDMA_IRQ_DELAY_MASK)) {
+               axienet_recv(lp->ndev);
+               goto out;
+       }
+       if (!(status & XAXIDMA_IRQ_ALL_MASK))
+               dev_err(&ndev->dev, "No interrupts asserted in Rx path");
+       if (status & XAXIDMA_IRQ_ERROR_MASK) {
+               dev_err(&ndev->dev, "DMA Rx error 0x%x\n", status);
+               dev_err(&ndev->dev, "Current BD is at: 0x%x\n",
+                       (lp->rx_bd_v[lp->rx_bd_ci]).phys);
+
+               cr = axienet_dma_in32(lp, XAXIDMA_TX_CR_OFFSET);
+               /* Disable coalesce, delay timer and error interrupts */
+               cr &= (~XAXIDMA_IRQ_ALL_MASK);
+               /* Finally write to the Tx channel control register */
+               axienet_dma_out32(lp, XAXIDMA_TX_CR_OFFSET, cr);
+
+               cr = axienet_dma_in32(lp, XAXIDMA_RX_CR_OFFSET);
+               /* Disable coalesce, delay timer and error interrupts */
+               cr &= (~XAXIDMA_IRQ_ALL_MASK);
+               /* write to the Rx channel control register */
+               axienet_dma_out32(lp, XAXIDMA_RX_CR_OFFSET, cr);
+
+               tasklet_schedule(&lp->dma_err_tasklet);
+       }
+out:
+       axienet_dma_out32(lp, XAXIDMA_RX_SR_OFFSET, status);
+       return IRQ_HANDLED;
+}
+
+/**
+ * axienet_open - Driver open routine.
+ * @ndev:      Pointer to net_device structure
+ *
+ * returns: 0, on success.
+ *         -ENODEV, if PHY cannot be connected to
+ *         non-zero error value on failure
+ *
+ * This is the driver open routine. It calls phy_start to start the PHY device.
+ * It also allocates interrupt service routines, enables the interrupt lines
+ * and ISR handling. Axi Ethernet core is reset through Axi DMA core. Buffer
+ * descriptors are initialized.
+ */
+static int axienet_open(struct net_device *ndev)
+{
+       int ret, mdio_mcreg;
+       struct axienet_local *lp = netdev_priv(ndev);
+
+       dev_dbg(&ndev->dev, "axienet_open()\n");
+
+       mdio_mcreg = axienet_ior(lp, XAE_MDIO_MC_OFFSET);
+       ret = axienet_mdio_wait_until_ready(lp);
+       if (ret < 0)
+               return ret;
+       /* Disable the MDIO interface till Axi Ethernet Reset is completed.
+        * When we do an Axi Ethernet reset, it resets the complete core
+        * including the MDIO. If MDIO is not disabled when the reset
+        * process is started, MDIO will be broken afterwards. */
+       axienet_iow(lp, XAE_MDIO_MC_OFFSET,
+                   (mdio_mcreg & (~XAE_MDIO_MC_MDIOEN_MASK)));
+       axienet_device_reset(ndev);
+       /* Enable the MDIO */
+       axienet_iow(lp, XAE_MDIO_MC_OFFSET, mdio_mcreg);
+       ret = axienet_mdio_wait_until_ready(lp);
+       if (ret < 0)
+               return ret;
+
+       if (lp->phy_node) {
+               lp->phy_dev = of_phy_connect(lp->ndev, lp->phy_node,
+                                            axienet_adjust_link, 0,
+                                            PHY_INTERFACE_MODE_GMII);
+               if (!lp->phy_dev) {
+                       dev_err(lp->dev, "of_phy_connect() failed\n");
+                       return -ENODEV;
+               }
+               phy_start(lp->phy_dev);
+       }
+
+       /* Enable interrupts for Axi DMA Tx */
+       ret = request_irq(lp->tx_irq, axienet_tx_irq, 0, ndev->name, ndev);
+       if (ret)
+               goto err_tx_irq;
+       /* Enable interrupts for Axi DMA Rx */
+       ret = request_irq(lp->rx_irq, axienet_rx_irq, 0, ndev->name, ndev);
+       if (ret)
+               goto err_rx_irq;
+       /* Enable tasklets for Axi DMA error handling */
+       tasklet_enable(&lp->dma_err_tasklet);
+       return 0;
+
+err_rx_irq:
+       free_irq(lp->tx_irq, ndev);
+err_tx_irq:
+       if (lp->phy_dev)
+               phy_disconnect(lp->phy_dev);
+       lp->phy_dev = NULL;
+       dev_err(lp->dev, "request_irq() failed\n");
+       return ret;
+}
+
+/**
+ * axienet_stop - Driver stop routine.
+ * @ndev:      Pointer to net_device structure
+ *
+ * returns: 0, on success.
+ *
+ * This is the driver stop routine. It calls phy_disconnect to stop the PHY
+ * device. It also removes the interrupt handlers and disables the interrupts.
+ * The Axi DMA Tx/Rx BDs are released.
+ */
+static int axienet_stop(struct net_device *ndev)
+{
+       u32 cr;
+       struct axienet_local *lp = netdev_priv(ndev);
+
+       dev_dbg(&ndev->dev, "axienet_close()\n");
+
+       cr = axienet_dma_in32(lp, XAXIDMA_RX_CR_OFFSET);
+       axienet_dma_out32(lp, XAXIDMA_RX_CR_OFFSET,
+                         cr & (~XAXIDMA_CR_RUNSTOP_MASK));
+       cr = axienet_dma_in32(lp, XAXIDMA_TX_CR_OFFSET);
+       axienet_dma_out32(lp, XAXIDMA_TX_CR_OFFSET,
+                         cr & (~XAXIDMA_CR_RUNSTOP_MASK));
+       axienet_setoptions(ndev, lp->options &
+                          ~(XAE_OPTION_TXEN | XAE_OPTION_RXEN));
+
+       tasklet_disable(&lp->dma_err_tasklet);
+
+       free_irq(lp->tx_irq, ndev);
+       free_irq(lp->rx_irq, ndev);
+
+       if (lp->phy_dev)
+               phy_disconnect(lp->phy_dev);
+       lp->phy_dev = NULL;
+
+       axienet_dma_bd_release(ndev);
+       return 0;
+}
+
+/**
+ * axienet_change_mtu - Driver change mtu routine.
+ * @ndev:      Pointer to net_device structure
+ * @new_mtu:   New mtu value to be applied
+ *
+ * returns: Always returns 0 (success).
+ *
+ * This is the change mtu driver routine. It checks if the Axi Ethernet
+ * hardware supports jumbo frames before changing the mtu. This can be
+ * called only when the device is not up.
+ */
+static int axienet_change_mtu(struct net_device *ndev, int new_mtu)
+{
+       struct axienet_local *lp = netdev_priv(ndev);
+
+       if (netif_running(ndev))
+               return -EBUSY;
+       if (lp->jumbo_support) {
+               if ((new_mtu > XAE_JUMBO_MTU) || (new_mtu < 64))
+                       return -EINVAL;
+               ndev->mtu = new_mtu;
+       } else {
+               if ((new_mtu > XAE_MTU) || (new_mtu < 64))
+                       return -EINVAL;
+               ndev->mtu = new_mtu;
+       }
+
+       return 0;
+}
+
+#ifdef CONFIG_NET_POLL_CONTROLLER
+/**
+ * axienet_poll_controller - Axi Ethernet poll mechanism.
+ * @ndev:      Pointer to net_device structure
+ *
+ * This implements Rx/Tx ISR poll mechanisms. The interrupts are disabled prior
+ * to polling the ISRs and are enabled back after the polling is done.
+ */
+static void axienet_poll_controller(struct net_device *ndev)
+{
+       struct axienet_local *lp = netdev_priv(ndev);
+       disable_irq(lp->tx_irq);
+       disable_irq(lp->rx_irq);
+       axienet_rx_irq(lp->tx_irq, ndev);
+       axienet_tx_irq(lp->rx_irq, ndev);
+       enable_irq(lp->tx_irq);
+       enable_irq(lp->rx_irq);
+}
+#endif
+
+static const struct net_device_ops axienet_netdev_ops = {
+       .ndo_open = axienet_open,
+       .ndo_stop = axienet_stop,
+       .ndo_start_xmit = axienet_start_xmit,
+       .ndo_change_mtu = axienet_change_mtu,
+       .ndo_set_mac_address = netdev_set_mac_address,
+       .ndo_validate_addr = eth_validate_addr,
+       .ndo_set_rx_mode = axienet_set_multicast_list,
+#ifdef CONFIG_NET_POLL_CONTROLLER
+       .ndo_poll_controller = axienet_poll_controller,
+#endif
+};
+
+/**
+ * axienet_ethtools_get_settings - Get Axi Ethernet settings related to PHY.
+ * @ndev:      Pointer to net_device structure
+ * @ecmd:      Pointer to ethtool_cmd structure
+ *
+ * This implements ethtool command for getting PHY settings. If PHY could
+ * not be found, the function returns -ENODEV. This function calls the
+ * relevant PHY ethtool API to get the PHY settings.
+ * Issue "ethtool ethX" under linux prompt to execute this function.
+ */
+static int axienet_ethtools_get_settings(struct net_device *ndev,
+                                        struct ethtool_cmd *ecmd)
+{
+       struct axienet_local *lp = netdev_priv(ndev);
+       struct phy_device *phydev = lp->phy_dev;
+       if (!phydev)
+               return -ENODEV;
+       return phy_ethtool_gset(phydev, ecmd);
+}
+
+/**
+ * axienet_ethtools_set_settings - Set PHY settings as passed in the argument.
+ * @ndev:      Pointer to net_device structure
+ * @ecmd:      Pointer to ethtool_cmd structure
+ *
+ * This implements ethtool command for setting various PHY settings. If PHY
+ * could not be found, the function returns -ENODEV. This function calls the
+ * relevant PHY ethtool API to set the PHY.
+ * Issue e.g. "ethtool -s ethX speed 1000" under linux prompt to execute this
+ * function.
+ */
+static int axienet_ethtools_set_settings(struct net_device *ndev,
+                                        struct ethtool_cmd *ecmd)
+{
+       struct axienet_local *lp = netdev_priv(ndev);
+       struct phy_device *phydev = lp->phy_dev;
+       if (!phydev)
+               return -ENODEV;
+       return phy_ethtool_sset(phydev, ecmd);
+}
+
+/**
+ * axienet_ethtools_get_drvinfo - Get various Axi Ethernet driver information.
+ * @ndev:      Pointer to net_device structure
+ * @ed:                Pointer to ethtool_drvinfo structure
+ *
+ * This implements ethtool command for getting the driver information.
+ * Issue "ethtool -i ethX" under linux prompt to execute this function.
+ */
+static void axienet_ethtools_get_drvinfo(struct net_device *ndev,
+                                        struct ethtool_drvinfo *ed)
+{
+       memset(ed, 0, sizeof(struct ethtool_drvinfo));
+       strcpy(ed->driver, DRIVER_NAME);
+       strcpy(ed->version, DRIVER_VERSION);
+       ed->regdump_len = sizeof(u32) * AXIENET_REGS_N;
+}
+
+/**
+ * axienet_ethtools_get_regs_len - Get the total regs length present in the
+ *                                AxiEthernet core.
+ * @ndev:      Pointer to net_device structure
+ *
+ * This implements ethtool command for getting the total register length
+ * information.
+ */
+static int axienet_ethtools_get_regs_len(struct net_device *ndev)
+{
+       return sizeof(u32) * AXIENET_REGS_N;
+}
+
+/**
+ * axienet_ethtools_get_regs - Dump the contents of all registers present
+ *                            in AxiEthernet core.
+ * @ndev:      Pointer to net_device structure
+ * @regs:      Pointer to ethtool_regs structure
+ * @ret:       Void pointer used to return the contents of the registers.
+ *
+ * This implements ethtool command for getting the Axi Ethernet register dump.
+ * Issue "ethtool -d ethX" to execute this function.
+ */
+static void axienet_ethtools_get_regs(struct net_device *ndev,
+                                     struct ethtool_regs *regs, void *ret)
+{
+       u32 *data = (u32 *) ret;
+       size_t len = sizeof(u32) * AXIENET_REGS_N;
+       struct axienet_local *lp = netdev_priv(ndev);
+
+       regs->version = 0;
+       regs->len = len;
+
+       memset(data, 0, len);
+       data[0] = axienet_ior(lp, XAE_RAF_OFFSET);
+       data[1] = axienet_ior(lp, XAE_TPF_OFFSET);
+       data[2] = axienet_ior(lp, XAE_IFGP_OFFSET);
+       data[3] = axienet_ior(lp, XAE_IS_OFFSET);
+       data[4] = axienet_ior(lp, XAE_IP_OFFSET);
+       data[5] = axienet_ior(lp, XAE_IE_OFFSET);
+       data[6] = axienet_ior(lp, XAE_TTAG_OFFSET);
+       data[7] = axienet_ior(lp, XAE_RTAG_OFFSET);
+       data[8] = axienet_ior(lp, XAE_UAWL_OFFSET);
+       data[9] = axienet_ior(lp, XAE_UAWU_OFFSET);
+       data[10] = axienet_ior(lp, XAE_TPID0_OFFSET);
+       data[11] = axienet_ior(lp, XAE_TPID1_OFFSET);
+       data[12] = axienet_ior(lp, XAE_PPST_OFFSET);
+       data[13] = axienet_ior(lp, XAE_RCW0_OFFSET);
+       data[14] = axienet_ior(lp, XAE_RCW1_OFFSET);
+       data[15] = axienet_ior(lp, XAE_TC_OFFSET);
+       data[16] = axienet_ior(lp, XAE_FCC_OFFSET);
+       data[17] = axienet_ior(lp, XAE_EMMC_OFFSET);
+       data[18] = axienet_ior(lp, XAE_PHYC_OFFSET);
+       data[19] = axienet_ior(lp, XAE_MDIO_MC_OFFSET);
+       data[20] = axienet_ior(lp, XAE_MDIO_MCR_OFFSET);
+       data[21] = axienet_ior(lp, XAE_MDIO_MWD_OFFSET);
+       data[22] = axienet_ior(lp, XAE_MDIO_MRD_OFFSET);
+       data[23] = axienet_ior(lp, XAE_MDIO_MIS_OFFSET);
+       data[24] = axienet_ior(lp, XAE_MDIO_MIP_OFFSET);
+       data[25] = axienet_ior(lp, XAE_MDIO_MIE_OFFSET);
+       data[26] = axienet_ior(lp, XAE_MDIO_MIC_OFFSET);
+       data[27] = axienet_ior(lp, XAE_UAW0_OFFSET);
+       data[28] = axienet_ior(lp, XAE_UAW1_OFFSET);
+       data[29] = axienet_ior(lp, XAE_FMI_OFFSET);
+       data[30] = axienet_ior(lp, XAE_AF0_OFFSET);
+       data[31] = axienet_ior(lp, XAE_AF1_OFFSET);
+}
+
+/**
+ * axienet_ethtools_get_pauseparam - Get the pause parameter setting for
+ *                                  Tx and Rx paths.
+ * @ndev:      Pointer to net_device structure
+ * @epauseparm:        Pointer to ethtool_pauseparam structure.
+ *
+ * This implements ethtool command for getting axi ethernet pause frame
+ * setting. Issue "ethtool -a ethX" to execute this function.
+ */
+static void
+axienet_ethtools_get_pauseparam(struct net_device *ndev,
+                               struct ethtool_pauseparam *epauseparm)
+{
+       u32 regval;
+       struct axienet_local *lp = netdev_priv(ndev);
+       epauseparm->autoneg  = 0;
+       regval = axienet_ior(lp, XAE_FCC_OFFSET);
+       epauseparm->tx_pause = regval & XAE_FCC_FCTX_MASK;
+       epauseparm->rx_pause = regval & XAE_FCC_FCRX_MASK;
+}
+
+/**
+ * axienet_ethtools_set_pauseparam - Set device pause parameter(flow control)
+ *                                  settings.
+ * @ndev:      Pointer to net_device structure
+ * @epauseparam:Pointer to ethtool_pauseparam structure
+ *
+ * This implements ethtool command for enabling flow control on Rx and Tx
+ * paths. Issue "ethtool -A ethX tx on|off" under linux prompt to execute this
+ * function.
+ */
+static int
+axienet_ethtools_set_pauseparam(struct net_device *ndev,
+                               struct ethtool_pauseparam *epauseparm)
+{
+       u32 regval = 0;
+       struct axienet_local *lp = netdev_priv(ndev);
+
+       if (netif_running(ndev)) {
+               printk(KERN_ERR "%s: Please stop netif before applying "
+                      "configruation\n", ndev->name);
+               return -EFAULT;
+       }
+
+       regval = axienet_ior(lp, XAE_FCC_OFFSET);
+       if (epauseparm->tx_pause)
+               regval |= XAE_FCC_FCTX_MASK;
+       else
+               regval &= ~XAE_FCC_FCTX_MASK;
+       if (epauseparm->rx_pause)
+               regval |= XAE_FCC_FCRX_MASK;
+       else
+               regval &= ~XAE_FCC_FCRX_MASK;
+       axienet_iow(lp, XAE_FCC_OFFSET, regval);
+
+       return 0;
+}
+
+/**
+ * axienet_ethtools_get_coalesce - Get DMA interrupt coalescing count.
+ * @ndev:      Pointer to net_device structure
+ * @ecoalesce: Pointer to ethtool_coalesce structure
+ *
+ * This implements ethtool command for getting the DMA interrupt coalescing
+ * count on Tx and Rx paths. Issue "ethtool -c ethX" under linux prompt to
+ * execute this function.
+ */
+static int axienet_ethtools_get_coalesce(struct net_device *ndev,
+                                        struct ethtool_coalesce *ecoalesce)
+{
+       u32 regval = 0;
+       struct axienet_local *lp = netdev_priv(ndev);
+       regval = axienet_dma_in32(lp, XAXIDMA_RX_CR_OFFSET);
+       ecoalesce->rx_max_coalesced_frames = (regval & XAXIDMA_COALESCE_MASK)
+                                            >> XAXIDMA_COALESCE_SHIFT;
+       regval = axienet_dma_in32(lp, XAXIDMA_TX_CR_OFFSET);
+       ecoalesce->tx_max_coalesced_frames = (regval & XAXIDMA_COALESCE_MASK)
+                                            >> XAXIDMA_COALESCE_SHIFT;
+       return 0;
+}
+
+/**
+ * axienet_ethtools_set_coalesce - Set DMA interrupt coalescing count.
+ * @ndev:      Pointer to net_device structure
+ * @ecoalesce: Pointer to ethtool_coalesce structure
+ *
+ * This implements ethtool command for setting the DMA interrupt coalescing
+ * count on Tx and Rx paths. Issue "ethtool -C ethX rx-frames 5" under linux
+ * prompt to execute this function.
+ */
+static int axienet_ethtools_set_coalesce(struct net_device *ndev,
+                                        struct ethtool_coalesce *ecoalesce)
+{
+       struct axienet_local *lp = netdev_priv(ndev);
+
+       if (netif_running(ndev)) {
+               printk(KERN_ERR "%s: Please stop netif before applying "
+                      "configruation\n", ndev->name);
+               return -EFAULT;
+       }
+
+       if ((ecoalesce->rx_coalesce_usecs) ||
+           (ecoalesce->rx_coalesce_usecs_irq) ||
+           (ecoalesce->rx_max_coalesced_frames_irq) ||
+           (ecoalesce->tx_coalesce_usecs) ||
+           (ecoalesce->tx_coalesce_usecs_irq) ||
+           (ecoalesce->tx_max_coalesced_frames_irq) ||
+           (ecoalesce->stats_block_coalesce_usecs) ||
+           (ecoalesce->use_adaptive_rx_coalesce) ||
+           (ecoalesce->use_adaptive_tx_coalesce) ||
+           (ecoalesce->pkt_rate_low) ||
+           (ecoalesce->rx_coalesce_usecs_low) ||
+           (ecoalesce->rx_max_coalesced_frames_low) ||
+           (ecoalesce->tx_coalesce_usecs_low) ||
+           (ecoalesce->tx_max_coalesced_frames_low) ||
+           (ecoalesce->pkt_rate_high) ||
+           (ecoalesce->rx_coalesce_usecs_high) ||
+           (ecoalesce->rx_max_coalesced_frames_high) ||
+           (ecoalesce->tx_coalesce_usecs_high) ||
+           (ecoalesce->tx_max_coalesced_frames_high) ||
+           (ecoalesce->rate_sample_interval))
+               return -EOPNOTSUPP;
+       if (ecoalesce->rx_max_coalesced_frames)
+               lp->coalesce_count_rx = ecoalesce->rx_max_coalesced_frames;
+       if (ecoalesce->tx_max_coalesced_frames)
+               lp->coalesce_count_tx = ecoalesce->tx_max_coalesced_frames;
+
+       return 0;
+}
+
+static struct ethtool_ops axienet_ethtool_ops = {
+       .get_settings   = axienet_ethtools_get_settings,
+       .set_settings   = axienet_ethtools_set_settings,
+       .get_drvinfo    = axienet_ethtools_get_drvinfo,
+       .get_regs_len   = axienet_ethtools_get_regs_len,
+       .get_regs       = axienet_ethtools_get_regs,
+       .get_link       = ethtool_op_get_link,
+       .get_pauseparam = axienet_ethtools_get_pauseparam,
+       .set_pauseparam = axienet_ethtools_set_pauseparam,
+       .get_coalesce   = axienet_ethtools_get_coalesce,
+       .set_coalesce   = axienet_ethtools_set_coalesce,
+};
+
+/**
+ * axienet_dma_err_handler - Tasklet handler for Axi DMA Error
+ * @data:      Data passed
+ *
+ * Resets the Axi DMA and Axi Ethernet devices, and reconfigures the
+ * Tx/Rx BDs.
+ */
+static void axienet_dma_err_handler(unsigned long data)
+{
+       u32 axienet_status;
+       u32 cr, i;
+       int mdio_mcreg;
+       struct axienet_local *lp = (struct axienet_local *) data;
+       struct net_device *ndev = lp->ndev;
+       struct axidma_bd *cur_p;
+
+       axienet_setoptions(ndev, lp->options &
+                          ~(XAE_OPTION_TXEN | XAE_OPTION_RXEN));
+       mdio_mcreg = axienet_ior(lp, XAE_MDIO_MC_OFFSET);
+       axienet_mdio_wait_until_ready(lp);
+       /* Disable the MDIO interface till Axi Ethernet Reset is completed.
+        * When we do an Axi Ethernet reset, it resets the complete core
+        * including the MDIO. So if MDIO is not disabled when the reset
+        * process is started, MDIO will be broken afterwards. */
+       axienet_iow(lp, XAE_MDIO_MC_OFFSET, (mdio_mcreg &
+                   ~XAE_MDIO_MC_MDIOEN_MASK));
+
+       __axienet_device_reset(lp, &ndev->dev, XAXIDMA_TX_CR_OFFSET);
+       __axienet_device_reset(lp, &ndev->dev, XAXIDMA_RX_CR_OFFSET);
+
+       axienet_iow(lp, XAE_MDIO_MC_OFFSET, mdio_mcreg);
+       axienet_mdio_wait_until_ready(lp);
+
+       for (i = 0; i < TX_BD_NUM; i++) {
+               cur_p = &lp->tx_bd_v[i];
+               if (cur_p->phys)
+                       dma_unmap_single(ndev->dev.parent, cur_p->phys,
+                                        (cur_p->cntrl &
+                                         XAXIDMA_BD_CTRL_LENGTH_MASK),
+                                        DMA_TO_DEVICE);
+               if (cur_p->app4)
+                       dev_kfree_skb_irq((struct sk_buff *) cur_p->app4);
+               cur_p->phys = 0;
+               cur_p->cntrl = 0;
+               cur_p->status = 0;
+               cur_p->app0 = 0;
+               cur_p->app1 = 0;
+               cur_p->app2 = 0;
+               cur_p->app3 = 0;
+               cur_p->app4 = 0;
+               cur_p->sw_id_offset = 0;
+       }
+
+       for (i = 0; i < RX_BD_NUM; i++) {
+               cur_p = &lp->rx_bd_v[i];
+               cur_p->status = 0;
+               cur_p->app0 = 0;
+               cur_p->app1 = 0;
+               cur_p->app2 = 0;
+               cur_p->app3 = 0;
+               cur_p->app4 = 0;
+       }
+
+       lp->tx_bd_ci = 0;
+       lp->tx_bd_tail = 0;
+       lp->rx_bd_ci = 0;
+
+       /* Start updating the Rx channel control register */
+       cr = axienet_dma_in32(lp, XAXIDMA_RX_CR_OFFSET);
+       /* Update the interrupt coalesce count */
+       cr = ((cr & ~XAXIDMA_COALESCE_MASK) |
+             (XAXIDMA_DFT_RX_THRESHOLD << XAXIDMA_COALESCE_SHIFT));
+       /* Update the delay timer count */
+       cr = ((cr & ~XAXIDMA_DELAY_MASK) |
+             (XAXIDMA_DFT_RX_WAITBOUND << XAXIDMA_DELAY_SHIFT));
+       /* Enable coalesce, delay timer and error interrupts */
+       cr |= XAXIDMA_IRQ_ALL_MASK;
+       /* Finally write to the Rx channel control register */
+       axienet_dma_out32(lp, XAXIDMA_RX_CR_OFFSET, cr);
+
+       /* Start updating the Tx channel control register */
+       cr = axienet_dma_in32(lp, XAXIDMA_TX_CR_OFFSET);
+       /* Update the interrupt coalesce count */
+       cr = (((cr & ~XAXIDMA_COALESCE_MASK)) |
+             (XAXIDMA_DFT_TX_THRESHOLD << XAXIDMA_COALESCE_SHIFT));
+       /* Update the delay timer count */
+       cr = (((cr & ~XAXIDMA_DELAY_MASK)) |
+             (XAXIDMA_DFT_TX_WAITBOUND << XAXIDMA_DELAY_SHIFT));
+       /* Enable coalesce, delay timer and error interrupts */
+       cr |= XAXIDMA_IRQ_ALL_MASK;
+       /* Finally write to the Tx channel control register */
+       axienet_dma_out32(lp, XAXIDMA_TX_CR_OFFSET, cr);
+
+       /* Populate the tail pointer and bring the Rx Axi DMA engine out of
+        * halted state. This will make the Rx side ready for reception.*/
+       axienet_dma_out32(lp, XAXIDMA_RX_CDESC_OFFSET, lp->rx_bd_p);
+       cr = axienet_dma_in32(lp, XAXIDMA_RX_CR_OFFSET);
+       axienet_dma_out32(lp, XAXIDMA_RX_CR_OFFSET,
+                         cr | XAXIDMA_CR_RUNSTOP_MASK);
+       axienet_dma_out32(lp, XAXIDMA_RX_TDESC_OFFSET, lp->rx_bd_p +
+                         (sizeof(*lp->rx_bd_v) * (RX_BD_NUM - 1)));
+
+       /* Write to the RS (Run-stop) bit in the Tx channel control register.
+        * Tx channel is now ready to run. But only after we write to the
+        * tail pointer register that the Tx channel will start transmitting */
+       axienet_dma_out32(lp, XAXIDMA_TX_CDESC_OFFSET, lp->tx_bd_p);
+       cr = axienet_dma_in32(lp, XAXIDMA_TX_CR_OFFSET);
+       axienet_dma_out32(lp, XAXIDMA_TX_CR_OFFSET,
+                         cr | XAXIDMA_CR_RUNSTOP_MASK);
+
+       axienet_status = axienet_ior(lp, XAE_RCW1_OFFSET);
+       axienet_status &= ~XAE_RCW1_RX_MASK;
+       axienet_iow(lp, XAE_RCW1_OFFSET, axienet_status);
+
+       axienet_status = axienet_ior(lp, XAE_IP_OFFSET);
+       if (axienet_status & XAE_INT_RXRJECT_MASK)
+               axienet_iow(lp, XAE_IS_OFFSET, XAE_INT_RXRJECT_MASK);
+       axienet_iow(lp, XAE_FCC_OFFSET, XAE_FCC_FCRX_MASK);
+
+       /* Sync default options with HW but leave receiver and
+        * transmitter disabled.*/
+       axienet_setoptions(ndev, lp->options &
+                          ~(XAE_OPTION_TXEN | XAE_OPTION_RXEN));
+       axienet_set_mac_address(ndev, NULL);
+       axienet_set_multicast_list(ndev);
+       axienet_setoptions(ndev, lp->options);
+}
+
+/**
+ * axienet_of_probe - Axi Ethernet probe function.
+ * @op:                Pointer to platform device structure.
+ * @match:     Pointer to device id structure
+ *
+ * returns: 0, on success
+ *         Non-zero error value on failure.
+ *
+ * This is the probe routine for Axi Ethernet driver. This is called before
+ * any other driver routines are invoked. It allocates and sets up the Ethernet
+ * device. Parses through device tree and populates fields of
+ * axienet_local. It registers the Ethernet device.
+ */
+static int __devinit axienet_of_probe(struct platform_device *op)
+{
+       __be32 *p;
+       int size, ret = 0;
+       struct device_node *np;
+       struct axienet_local *lp;
+       struct net_device *ndev;
+       const void *addr;
+
+       ndev = alloc_etherdev(sizeof(*lp));
+       if (!ndev)
+               return -ENOMEM;
+
+       ether_setup(ndev);
+       dev_set_drvdata(&op->dev, ndev);
+
+       SET_NETDEV_DEV(ndev, &op->dev);
+       ndev->flags &= ~IFF_MULTICAST;  /* clear multicast */
+       ndev->features = NETIF_F_SG | NETIF_F_FRAGLIST;
+       ndev->netdev_ops = &axienet_netdev_ops;
+       ndev->ethtool_ops = &axienet_ethtool_ops;
+
+       lp = netdev_priv(ndev);
+       lp->ndev = ndev;
+       lp->dev = &op->dev;
+       lp->options = XAE_OPTION_DEFAULTS;
+       /* Map device registers */
+       lp->regs = of_iomap(op->dev.of_node, 0);
+       if (!lp->regs) {
+               dev_err(&op->dev, "could not map Axi Ethernet regs.\n");
+               goto nodev;
+       }
+       /* Setup checksum offload, but default to off if not specified */
+       lp->features = 0;
+
+       p = (__be32 *) of_get_property(op->dev.of_node, "xlnx,txcsum", NULL);
+       if (p) {
+               switch (be32_to_cpup(p)) {
+               case 1:
+                       lp->csum_offload_on_tx_path =
+                               XAE_FEATURE_PARTIAL_TX_CSUM;
+                       lp->features |= XAE_FEATURE_PARTIAL_TX_CSUM;
+                       /* Can checksum TCP/UDP over IPv4. */
+                       ndev->features |= NETIF_F_IP_CSUM;
+                       break;
+               case 2:
+                       lp->csum_offload_on_tx_path =
+                               XAE_FEATURE_FULL_TX_CSUM;
+                       lp->features |= XAE_FEATURE_FULL_TX_CSUM;
+                       /* Can checksum TCP/UDP over IPv4. */
+                       ndev->features |= NETIF_F_IP_CSUM;
+                       break;
+               default:
+                       lp->csum_offload_on_tx_path = XAE_NO_CSUM_OFFLOAD;
+               }
+       }
+       p = (__be32 *) of_get_property(op->dev.of_node, "xlnx,rxcsum", NULL);
+       if (p) {
+               switch (be32_to_cpup(p)) {
+               case 1:
+                       lp->csum_offload_on_rx_path =
+                               XAE_FEATURE_PARTIAL_RX_CSUM;
+                       lp->features |= XAE_FEATURE_PARTIAL_RX_CSUM;
+                       break;
+               case 2:
+                       lp->csum_offload_on_rx_path =
+                               XAE_FEATURE_FULL_RX_CSUM;
+                       lp->features |= XAE_FEATURE_FULL_RX_CSUM;
+                       break;
+               default:
+                       lp->csum_offload_on_rx_path = XAE_NO_CSUM_OFFLOAD;
+               }
+       }
+       /* For supporting jumbo frames, the Axi Ethernet hardware must have
+        * a larger Rx/Tx Memory. Typically, the size must be more than or
+        * equal to 16384 bytes, so that we can enable jumbo option and start
+        * supporting jumbo frames. Here we check for memory allocated for
+        * Rx/Tx in the hardware from the device-tree and accordingly set
+        * flags. */
+       p = (__be32 *) of_get_property(op->dev.of_node, "xlnx,rxmem", NULL);
+       if (p) {
+               if ((be32_to_cpup(p)) >= 0x4000)
+                       lp->jumbo_support = 1;
+       }
+       p = (__be32 *) of_get_property(op->dev.of_node, "xlnx,temac-type",
+                                      NULL);
+       if (p)
+               lp->temac_type = be32_to_cpup(p);
+       p = (__be32 *) of_get_property(op->dev.of_node, "xlnx,phy-type", NULL);
+       if (p)
+               lp->phy_type = be32_to_cpup(p);
+
+       /* Find the DMA node, map the DMA registers, and decode the DMA IRQs */
+       np = of_parse_phandle(op->dev.of_node, "axistream-connected", 0);
+       if (!np) {
+               dev_err(&op->dev, "could not find DMA node\n");
+               goto err_iounmap;
+       }
+       lp->dma_regs = of_iomap(np, 0);
+       if (lp->dma_regs) {
+               dev_dbg(&op->dev, "MEM base: %p\n", lp->dma_regs);
+       } else {
+               dev_err(&op->dev, "unable to map DMA registers\n");
+               of_node_put(np);
+       }
+       lp->rx_irq = irq_of_parse_and_map(np, 1);
+       lp->tx_irq = irq_of_parse_and_map(np, 0);
+       of_node_put(np);
+       if ((lp->rx_irq == NO_IRQ) || (lp->tx_irq == NO_IRQ)) {
+               dev_err(&op->dev, "could not determine irqs\n");
+               ret = -ENOMEM;
+               goto err_iounmap_2;
+       }
+
+       /* Retrieve the MAC address */
+       addr = of_get_property(op->dev.of_node, "local-mac-address", &size);
+       if ((!addr) || (size != 6)) {
+               dev_err(&op->dev, "could not find MAC address\n");
+               ret = -ENODEV;
+               goto err_iounmap_2;
+       }
+       axienet_set_mac_address(ndev, (void *) addr);
+
+       lp->coalesce_count_rx = XAXIDMA_DFT_RX_THRESHOLD;
+       lp->coalesce_count_tx = XAXIDMA_DFT_TX_THRESHOLD;
+
+       lp->phy_node = of_parse_phandle(op->dev.of_node, "phy-handle", 0);
+       ret = axienet_mdio_setup(lp, op->dev.of_node);
+       if (ret)
+               dev_warn(&op->dev, "error registering MDIO bus\n");
+
+       ret = register_netdev(lp->ndev);
+       if (ret) {
+               dev_err(lp->dev, "register_netdev() error (%i)\n", ret);
+               goto err_iounmap_2;
+       }
+
+       tasklet_init(&lp->dma_err_tasklet, axienet_dma_err_handler,
+                    (unsigned long) lp);
+       tasklet_disable(&lp->dma_err_tasklet);
+
+       return 0;
+
+err_iounmap_2:
+       if (lp->dma_regs)
+               iounmap(lp->dma_regs);
+err_iounmap:
+       iounmap(lp->regs);
+nodev:
+       free_netdev(ndev);
+       ndev = NULL;
+       return ret;
+}
+
+static int __devexit axienet_of_remove(struct platform_device *op)
+{
+       struct net_device *ndev = dev_get_drvdata(&op->dev);
+       struct axienet_local *lp = netdev_priv(ndev);
+
+       axienet_mdio_teardown(lp);
+       unregister_netdev(ndev);
+
+       if (lp->phy_node)
+               of_node_put(lp->phy_node);
+       lp->phy_node = NULL;
+
+       dev_set_drvdata(&op->dev, NULL);
+
+       iounmap(lp->regs);
+       if (lp->dma_regs)
+               iounmap(lp->dma_regs);
+       free_netdev(ndev);
+
+       return 0;
+}
+
+static struct platform_driver axienet_of_driver = {
+       .probe = axienet_of_probe,
+       .remove = __devexit_p(axienet_of_remove),
+       .driver = {
+                .owner = THIS_MODULE,
+                .name = "xilinx_axienet",
+                .of_match_table = axienet_of_match,
+       },
+};
+
+module_platform_driver(axienet_of_driver);
+
+MODULE_DESCRIPTION("Xilinx Axi Ethernet driver");
+MODULE_AUTHOR("Xilinx");
+MODULE_LICENSE("GPL");
diff --git a/drivers/net/ethernet/xilinx/xilinx_axienet_mdio.c b/drivers/net/ethernet/xilinx/xilinx_axienet_mdio.c
new file mode 100644 (file)
index 0000000..d70b6e7
--- /dev/null
@@ -0,0 +1,238 @@
+/*
+ * MDIO bus driver for the Xilinx Axi Ethernet device
+ *
+ * Copyright (c) 2009 Secret Lab Technologies, Ltd.
+ * Copyright (c) 2010 Xilinx, Inc. All rights reserved.
+ * Copyright (c) 2012 Daniel Borkmann, <daniel.borkmann@tik.ee.ethz.ch>
+ * Copyright (c) 2012 Ariane Keller, <ariane.keller@tik.ee.ethz.ch>
+ */
+
+#include <linux/of_address.h>
+#include <linux/of_mdio.h>
+#include <linux/jiffies.h>
+
+#include "xilinx_axienet.h"
+
+#define MAX_MDIO_FREQ          2500000 /* 2.5 MHz */
+#define DEFAULT_CLOCK_DIVISOR  XAE_MDIO_DIV_DFT
+
+/* Wait till MDIO interface is ready to accept a new transaction.*/
+int axienet_mdio_wait_until_ready(struct axienet_local *lp)
+{
+       long end = jiffies + 2;
+       while (!(axienet_ior(lp, XAE_MDIO_MCR_OFFSET) &
+                XAE_MDIO_MCR_READY_MASK)) {
+               if (end - jiffies <= 0) {
+                       WARN_ON(1);
+                       return -ETIMEDOUT;
+               }
+               udelay(1);
+       }
+       return 0;
+}
+
+/**
+ * axienet_mdio_read - MDIO interface read function
+ * @bus:       Pointer to mii bus structure
+ * @phy_id:    Address of the PHY device
+ * @reg:       PHY register to read
+ *
+ * returns:    The register contents on success, -ETIMEDOUT on a timeout
+ *
+ * Reads the contents of the requested register from the requested PHY
+ * address by first writing the details into MCR register. After a while
+ * the register MRD is read to obtain the PHY register content.
+ */
+static int axienet_mdio_read(struct mii_bus *bus, int phy_id, int reg)
+{
+       u32 rc;
+       int ret;
+       struct axienet_local *lp = bus->priv;
+
+       ret = axienet_mdio_wait_until_ready(lp);
+       if (ret < 0)
+               return ret;
+
+       axienet_iow(lp, XAE_MDIO_MCR_OFFSET,
+                   (((phy_id << XAE_MDIO_MCR_PHYAD_SHIFT) &
+                     XAE_MDIO_MCR_PHYAD_MASK) |
+                    ((reg << XAE_MDIO_MCR_REGAD_SHIFT) &
+                     XAE_MDIO_MCR_REGAD_MASK) |
+                    XAE_MDIO_MCR_INITIATE_MASK |
+                    XAE_MDIO_MCR_OP_READ_MASK));
+
+       ret = axienet_mdio_wait_until_ready(lp);
+       if (ret < 0)
+               return ret;
+
+       rc = axienet_ior(lp, XAE_MDIO_MRD_OFFSET) & 0x0000FFFF;
+
+       dev_dbg(lp->dev, "axienet_mdio_read(phy_id=%i, reg=%x) == %x\n",
+               phy_id, reg, rc);
+
+       return rc;
+}
+
+/**
+ * axienet_mdio_write - MDIO interface write function
+ * @bus:       Pointer to mii bus structure
+ * @phy_id:    Address of the PHY device
+ * @reg:       PHY register to write to
+ * @val:       Value to be written into the register
+ *
+ * returns:    0 on success, -ETIMEDOUT on a timeout
+ *
+ * Writes the value to the requested register by first writing the value
+ * into MWD register. The the MCR register is then appropriately setup
+ * to finish the write operation.
+ */
+static int axienet_mdio_write(struct mii_bus *bus, int phy_id, int reg,
+                             u16 val)
+{
+       int ret;
+       struct axienet_local *lp = bus->priv;
+
+       dev_dbg(lp->dev, "axienet_mdio_write(phy_id=%i, reg=%x, val=%x)\n",
+               phy_id, reg, val);
+
+       ret = axienet_mdio_wait_until_ready(lp);
+       if (ret < 0)
+               return ret;
+
+       axienet_iow(lp, XAE_MDIO_MWD_OFFSET, (u32) val);
+       axienet_iow(lp, XAE_MDIO_MCR_OFFSET,
+                   (((phy_id << XAE_MDIO_MCR_PHYAD_SHIFT) &
+                     XAE_MDIO_MCR_PHYAD_MASK) |
+                    ((reg << XAE_MDIO_MCR_REGAD_SHIFT) &
+                     XAE_MDIO_MCR_REGAD_MASK) |
+                    XAE_MDIO_MCR_INITIATE_MASK |
+                    XAE_MDIO_MCR_OP_WRITE_MASK));
+
+       ret = axienet_mdio_wait_until_ready(lp);
+       if (ret < 0)
+               return ret;
+       return 0;
+}
+
+/**
+ * axienet_mdio_setup - MDIO setup function
+ * @lp:                Pointer to axienet local data structure.
+ * @np:                Pointer to device node
+ *
+ * returns:    0 on success, -ETIMEDOUT on a timeout, -ENOMEM when
+ *             mdiobus_alloc (to allocate memory for mii bus structure) fails.
+ *
+ * Sets up the MDIO interface by initializing the MDIO clock and enabling the
+ * MDIO interface in hardware. Register the MDIO interface.
+ **/
+int axienet_mdio_setup(struct axienet_local *lp, struct device_node *np)
+{
+       int ret;
+       u32 clk_div, host_clock;
+       u32 *property_p;
+       struct mii_bus *bus;
+       struct resource res;
+       struct device_node *np1;
+
+       /* clk_div can be calculated by deriving it from the equation:
+        * fMDIO = fHOST / ((1 + clk_div) * 2)
+        *
+        * Where fMDIO <= 2500000, so we get:
+        * fHOST / ((1 + clk_div) * 2) <= 2500000
+        *
+        * Then we get:
+        * 1 / ((1 + clk_div) * 2) <= (2500000 / fHOST)
+        *
+        * Then we get:
+        * 1 / (1 + clk_div) <= ((2500000 * 2) / fHOST)
+        *
+        * Then we get:
+        * 1 / (1 + clk_div) <= (5000000 / fHOST)
+        *
+        * So:
+        * (1 + clk_div) >= (fHOST / 5000000)
+        *
+        * And finally:
+        * clk_div >= (fHOST / 5000000) - 1
+        *
+        * fHOST can be read from the flattened device tree as property
+        * "clock-frequency" from the CPU
+        */
+
+       np1 = of_find_node_by_name(NULL, "cpu");
+       if (!np1) {
+               printk(KERN_WARNING "%s(): Could not find CPU device node.",
+                      __func__);
+               printk(KERN_WARNING "Setting MDIO clock divisor to "
+                      "default %d\n", DEFAULT_CLOCK_DIVISOR);
+               clk_div = DEFAULT_CLOCK_DIVISOR;
+               goto issue;
+       }
+       property_p = (u32 *) of_get_property(np1, "clock-frequency", NULL);
+       if (!property_p) {
+               printk(KERN_WARNING "%s(): Could not find CPU property: "
+                      "clock-frequency.", __func__);
+               printk(KERN_WARNING "Setting MDIO clock divisor to "
+                      "default %d\n", DEFAULT_CLOCK_DIVISOR);
+               clk_div = DEFAULT_CLOCK_DIVISOR;
+               goto issue;
+       }
+
+       host_clock = be32_to_cpup(property_p);
+       clk_div = (host_clock / (MAX_MDIO_FREQ * 2)) - 1;
+       /* If there is any remainder from the division of
+        * fHOST / (MAX_MDIO_FREQ * 2), then we need to add
+        * 1 to the clock divisor or we will surely be above 2.5 MHz */
+       if (host_clock % (MAX_MDIO_FREQ * 2))
+               clk_div++;
+
+       printk(KERN_DEBUG "%s(): Setting MDIO clock divisor to %u based "
+              "on %u Hz host clock.\n", __func__, clk_div, host_clock);
+
+       of_node_put(np1);
+issue:
+       axienet_iow(lp, XAE_MDIO_MC_OFFSET,
+                   (((u32) clk_div) | XAE_MDIO_MC_MDIOEN_MASK));
+
+       ret = axienet_mdio_wait_until_ready(lp);
+       if (ret < 0)
+               return ret;
+
+       bus = mdiobus_alloc();
+       if (!bus)
+               return -ENOMEM;
+
+       np1 = of_get_parent(lp->phy_node);
+       of_address_to_resource(np1, 0, &res);
+       snprintf(bus->id, MII_BUS_ID_SIZE, "%.8llx",
+                (unsigned long long) res.start);
+
+       bus->priv = lp;
+       bus->name = "Xilinx Axi Ethernet MDIO";
+       bus->read = axienet_mdio_read;
+       bus->write = axienet_mdio_write;
+       bus->parent = lp->dev;
+       bus->irq = lp->mdio_irqs; /* preallocated IRQ table */
+       lp->mii_bus = bus;
+
+       ret = of_mdiobus_register(bus, np1);
+       if (ret) {
+               mdiobus_free(bus);
+               return ret;
+       }
+       return 0;
+}
+
+/**
+ * axienet_mdio_teardown - MDIO remove function
+ * @lp:                Pointer to axienet local data structure.
+ *
+ * Unregisters the MDIO and frees any associate memory for mii bus.
+ */
+void axienet_mdio_teardown(struct axienet_local *lp)
+{
+       mdiobus_unregister(lp->mii_bus);
+       kfree(lp->mii_bus->irq);
+       mdiobus_free(lp->mii_bus);
+       lp->mii_bus = NULL;
+}
index 79013e5..77cfe51 100644 (file)
@@ -613,7 +613,7 @@ static void xemaclite_rx_handler(struct net_device *dev)
        u32 len;
 
        len = ETH_FRAME_LEN + ETH_FCS_LEN;
-       skb = dev_alloc_skb(len + ALIGNMENT);
+       skb = netdev_alloc_skb(dev, len + ALIGNMENT);
        if (!skb) {
                /* Couldn't get memory. */
                dev->stats.rx_dropped++;
@@ -1136,10 +1136,8 @@ static int __devinit xemaclite_of_probe(struct platform_device *ofdev)
 
        /* Create an ethernet device instance */
        ndev = alloc_etherdev(sizeof(struct net_local));
-       if (!ndev) {
-               dev_err(dev, "Could not allocate network device\n");
+       if (!ndev)
                return -ENOMEM;
-       }
 
        dev_set_drvdata(dev, ndev);
        SET_NETDEV_DEV(ndev, &ofdev->dev);
index 33979c3..5c69c6f 100644 (file)
@@ -1039,7 +1039,8 @@ xirc2ps_interrupt(int irq, void *dev_id)
 
            pr_debug("rsr=%#02x packet_length=%u\n", rsr, pktlen);
 
-           skb = dev_alloc_skb(pktlen+3); /* 1 extra so we can use insw */
+           /* 1 extra so we can use insw */
+           skb = netdev_alloc_skb(dev, pktlen + 3);
            if (!skb) {
                pr_notice("low memory, packet dropped (size=%u)\n", pktlen);
                dev->stats.rx_dropped++;
index e122493..4500837 100644 (file)
@@ -398,11 +398,8 @@ int ixpdev_init(int __nds_count, struct net_device **__nds,
        }
 
        for (i = 0; i < nds_count; i++) {
-               printk(KERN_INFO "%s: IXP2000 MSF ethernet (port %d), "
-                       "%.2x:%.2x:%.2x:%.2x:%.2x:%.2x.\n", nds[i]->name, i,
-                       nds[i]->dev_addr[0], nds[i]->dev_addr[1],
-                       nds[i]->dev_addr[2], nds[i]->dev_addr[3],
-                       nds[i]->dev_addr[4], nds[i]->dev_addr[5]);
+               printk(KERN_INFO "%s: IXP2000 MSF ethernet (port %d), %pM.\n",
+                                nds[i]->name, i, nds[i]->dev_addr);
        }
 
        return 0;
index 9537aaa..49b8b58 100644 (file)
@@ -1162,7 +1162,7 @@ static void baycom_probe(struct net_device *dev)
 /*
  * command line settable parameters
  */
-static const char *mode[NR_PORTS] = { "", };
+static char *mode[NR_PORTS] = { "", };
 static int iobase[NR_PORTS] = { 0x378, };
 
 module_param_array(mode, charp, NULL, 0);
index 279d229..f1aea0c 100644 (file)
@@ -477,7 +477,7 @@ static int baycom_ioctl(struct net_device *dev, struct ifreq *ifr,
 /*
  * command line settable parameters
  */
-static const char *mode[NR_PORTS] = { "picpar", };
+static char *mode[NR_PORTS] = { "picpar", };
 static int iobase[NR_PORTS] = { 0x378, };
 
 module_param_array(mode, charp, NULL, 0);
index 96a98d2..6963277 100644 (file)
@@ -403,7 +403,6 @@ static unsigned char *add_mcs(unsigned char *bits, int bitrate,
 
        /* Allocate a new mcs */
        if ((p = kmalloc(sizeof(struct yam_mcs), GFP_KERNEL)) == NULL) {
-               printk(KERN_WARNING "YAM: no memory to allocate mcs\n");
                release_firmware(fw);
                return NULL;
        }
index e68c941..2a51363 100644 (file)
@@ -1600,12 +1600,8 @@ static int rr_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
                }
 
                image = kmalloc(EEPROM_WORDS * sizeof(u32), GFP_KERNEL);
-               if (!image){
-                       printk(KERN_ERR "%s: Unable to allocate memory "
-                              "for EEPROM image\n", dev->name);
+               if (!image)
                        return -ENOMEM;
-               }
-
 
                if (rrpriv->fw_running){
                        printk("%s: Firmware already running\n", dev->name);
@@ -1637,8 +1633,6 @@ static int rr_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
                image = kmalloc(EEPROM_WORDS * sizeof(u32), GFP_KERNEL);
                oldimage = kmalloc(EEPROM_WORDS * sizeof(u32), GFP_KERNEL);
                if (!image || !oldimage) {
-                       printk(KERN_ERR "%s: Unable to allocate memory "
-                              "for EEPROM image\n", dev->name);
                        error = -ENOMEM;
                        goto wf_out;
                }
index 466c58a..0ae7a1a 100644 (file)
@@ -267,13 +267,10 @@ void netvsc_linkstatus_callback(struct hv_device *device_obj,
 int netvsc_recv_callback(struct hv_device *device_obj,
                                struct hv_netvsc_packet *packet)
 {
-       struct net_device *net = dev_get_drvdata(&device_obj->device);
+       struct net_device *net;
        struct sk_buff *skb;
-       struct netvsc_device *net_device;
-
-       net_device = hv_get_drvdata(device_obj);
-       net = net_device->ndev;
 
+       net = ((struct netvsc_device *)hv_get_drvdata(device_obj))->ndev;
        if (!net) {
                netdev_err(net, "got receive callback but net device"
                        " not initialized yet\n");
index 133b7fb..136efd8 100644 (file)
@@ -758,66 +758,64 @@ int rndis_filter_open(struct hv_device *dev)
 
 int rndis_filter_close(struct hv_device *dev)
 {
-       struct netvsc_device *netDevice = hv_get_drvdata(dev);
+       struct netvsc_device *nvdev = hv_get_drvdata(dev);
 
-       if (!netDevice)
+       if (!nvdev)
                return -EINVAL;
 
-       return rndis_filter_close_device(netDevice->extension);
+       return rndis_filter_close_device(nvdev->extension);
 }
 
 int rndis_filter_send(struct hv_device *dev,
                             struct hv_netvsc_packet *pkt)
 {
        int ret;
-       struct rndis_filter_packet *filterPacket;
-       struct rndis_message *rndisMessage;
-       struct rndis_packet *rndisPacket;
-       u32 rndisMessageSize;
+       struct rndis_filter_packet *filter_pkt;
+       struct rndis_message *rndis_msg;
+       struct rndis_packet *rndis_pkt;
+       u32 rndis_msg_size;
 
        /* Add the rndis header */
-       filterPacket = (struct rndis_filter_packet *)pkt->extension;
-
-       memset(filterPacket, 0, sizeof(struct rndis_filter_packet));
+       filter_pkt = (struct rndis_filter_packet *)pkt->extension;
 
-       rndisMessage = &filterPacket->msg;
-       rndisMessageSize = RNDIS_MESSAGE_SIZE(struct rndis_packet);
+       rndis_msg = &filter_pkt->msg;
+       rndis_msg_size = RNDIS_MESSAGE_SIZE(struct rndis_packet);
 
-       rndisMessage->ndis_msg_type = REMOTE_NDIS_PACKET_MSG;
-       rndisMessage->msg_len = pkt->total_data_buflen +
-                                     rndisMessageSize;
+       rndis_msg->ndis_msg_type = REMOTE_NDIS_PACKET_MSG;
+       rndis_msg->msg_len = pkt->total_data_buflen +
+                                     rndis_msg_size;
 
-       rndisPacket = &rndisMessage->msg.pkt;
-       rndisPacket->data_offset = sizeof(struct rndis_packet);
-       rndisPacket->data_len = pkt->total_data_buflen;
+       rndis_pkt = &rndis_msg->msg.pkt;
+       rndis_pkt->data_offset = sizeof(struct rndis_packet);
+       rndis_pkt->data_len = pkt->total_data_buflen;
 
        pkt->is_data_pkt = true;
-       pkt->page_buf[0].pfn = virt_to_phys(rndisMessage) >> PAGE_SHIFT;
+       pkt->page_buf[0].pfn = virt_to_phys(rndis_msg) >> PAGE_SHIFT;
        pkt->page_buf[0].offset =
-                       (unsigned long)rndisMessage & (PAGE_SIZE-1);
-       pkt->page_buf[0].len = rndisMessageSize;
+                       (unsigned long)rndis_msg & (PAGE_SIZE-1);
+       pkt->page_buf[0].len = rndis_msg_size;
 
        /* Add one page_buf if the rndis msg goes beyond page boundary */
-       if (pkt->page_buf[0].offset + rndisMessageSize > PAGE_SIZE) {
+       if (pkt->page_buf[0].offset + rndis_msg_size > PAGE_SIZE) {
                int i;
                for (i = pkt->page_buf_cnt; i > 1; i--)
                        pkt->page_buf[i] = pkt->page_buf[i-1];
                pkt->page_buf_cnt++;
                pkt->page_buf[0].len = PAGE_SIZE - pkt->page_buf[0].offset;
                pkt->page_buf[1].pfn = virt_to_phys((void *)((ulong)
-                       rndisMessage + pkt->page_buf[0].len)) >> PAGE_SHIFT;
+                       rndis_msg + pkt->page_buf[0].len)) >> PAGE_SHIFT;
                pkt->page_buf[1].offset = 0;
-               pkt->page_buf[1].len = rndisMessageSize - pkt->page_buf[0].len;
+               pkt->page_buf[1].len = rndis_msg_size - pkt->page_buf[0].len;
        }
 
        /* Save the packet send completion and context */
-       filterPacket->completion = pkt->completion.send.send_completion;
-       filterPacket->completion_ctx =
+       filter_pkt->completion = pkt->completion.send.send_completion;
+       filter_pkt->completion_ctx =
                                pkt->completion.send.send_completion_ctx;
 
        /* Use ours */
        pkt->completion.send.send_completion = rndis_filter_send_completion;
-       pkt->completion.send.send_completion_ctx = filterPacket;
+       pkt->completion.send.send_completion_ctx = filter_pkt;
 
        ret = netvsc_send(dev, pkt);
        if (ret != 0) {
@@ -826,9 +824,9 @@ int rndis_filter_send(struct hv_device *dev,
                 * above
                 */
                pkt->completion.send.send_completion =
-                               filterPacket->completion;
+                               filter_pkt->completion;
                pkt->completion.send.send_completion_ctx =
-                               filterPacket->completion_ctx;
+                               filter_pkt->completion_ctx;
        }
 
        return ret;
@@ -836,10 +834,10 @@ int rndis_filter_send(struct hv_device *dev,
 
 static void rndis_filter_send_completion(void *ctx)
 {
-       struct rndis_filter_packet *filterPacket = ctx;
+       struct rndis_filter_packet *filter_pkt = ctx;
 
        /* Pass it back to the original handler */
-       filterPacket->completion(filterPacket->completion_ctx);
+       filter_pkt->completion(filter_pkt->completion_ctx);
 }
 
 
index e05b645..344dceb 100644 (file)
@@ -184,7 +184,7 @@ static void ifb_setup(struct net_device *dev)
        dev->flags |= IFF_NOARP;
        dev->flags &= ~IFF_MULTICAST;
        dev->priv_flags &= ~(IFF_XMIT_DST_RELEASE | IFF_TX_SKB_SHARING);
-       random_ether_addr(dev->dev_addr);
+       eth_hw_addr_random(dev);
 }
 
 static netdev_tx_t ifb_xmit(struct sk_buff *skb, struct net_device *dev)
index 64f403d..617a446 100644 (file)
@@ -1608,7 +1608,6 @@ toshoboe_open (struct pci_dev *pci_dev, const struct pci_device_id *pdid)
   self->ringbuf = kmalloc(OBOE_RING_LEN << 1, GFP_KERNEL);
   if (!self->ringbuf)
     {
-      printk (KERN_ERR DRIVER_NAME ": can't allocate DMA buffers\n");
       err = -ENOMEM;
       goto freeregion;
     }
@@ -1647,7 +1646,6 @@ toshoboe_open (struct pci_dev *pci_dev, const struct pci_device_id *pdid)
 
   if (!ok)
     {
-      printk (KERN_ERR DRIVER_NAME ": can't allocate rx/tx buffers\n");
       err = -ENOMEM;
       goto freebufs;
     }
index 9ea9921..f975afd 100644 (file)
@@ -372,6 +372,7 @@ static int macvlan_set_mac_address(struct net_device *dev, void *p)
 
        if (!(dev->flags & IFF_UP)) {
                /* Just copy in the new address */
+               dev->addr_assign_type &= ~NET_ADDR_RANDOM;
                memcpy(dev->dev_addr, addr->sa_data, ETH_ALEN);
        } else {
                /* Rehash and update the device filters */
@@ -687,7 +688,7 @@ int macvlan_common_newlink(struct net *src_net, struct net_device *dev,
                return -EINVAL;
 
        if (!tb[IFLA_ADDRESS])
-               random_ether_addr(dev->dev_addr);
+               eth_hw_addr_random(dev);
 
        if (!macvlan_port_exists(lowerdev)) {
                err = macvlan_port_create(lowerdev);
index 16fbb11..8403316 100644 (file)
@@ -190,6 +190,9 @@ void mdio45_ethtool_gset_npage(const struct mdio_if_info *mdio,
        int reg;
        u32 speed;
 
+       BUILD_BUG_ON(MDIO_SUPPORTS_C22 != ETH_MDIO_SUPPORTS_C22);
+       BUILD_BUG_ON(MDIO_SUPPORTS_C45 != ETH_MDIO_SUPPORTS_C45);
+
        ecmd->transceiver = XCVR_INTERNAL;
        ecmd->phy_address = mdio->prtad;
        ecmd->mdio_support =
index c70c233..4a99c39 100644 (file)
@@ -31,7 +31,7 @@
 #include <linux/module.h>
 #include <linux/netdevice.h>
 #include <linux/ethtool.h>
-#include <linux/mdio.h>
+#include <linux/mii.h>
 
 static u32 mii_get_an(struct mii_if_info *mii, u16 addr)
 {
@@ -74,7 +74,7 @@ int mii_ethtool_gset(struct mii_if_info *mii, struct ethtool_cmd *ecmd)
 
        /* this isn't fully supported at higher layers */
        ecmd->phy_address = mii->phy_id;
-       ecmd->mdio_support = MDIO_SUPPORTS_C22;
+       ecmd->mdio_support = ETH_MDIO_SUPPORTS_C22;
 
        ecmd->advertising = ADVERTISED_TP | ADVERTISED_MII;
 
index e888202..f9347ea 100644 (file)
@@ -169,10 +169,8 @@ static struct netconsole_target *alloc_param_target(char *target_config)
         * Note that these targets get their config_item fields zeroed-out.
         */
        nt = kzalloc(sizeof(*nt), GFP_KERNEL);
-       if (!nt) {
-               printk(KERN_ERR "netconsole: failed to allocate memory\n");
+       if (!nt)
                goto fail;
-       }
 
        nt->np.name = "netconsole";
        strlcpy(nt->np.dev_name, "eth0", IFNAMSIZ);
@@ -551,10 +549,8 @@ static struct config_item *make_netconsole_target(struct config_group *group,
         * Target is disabled at creation (enabled == 0).
         */
        nt = kzalloc(sizeof(*nt), GFP_KERNEL);
-       if (!nt) {
-               printk(KERN_ERR "netconsole: failed to allocate memory\n");
+       if (!nt)
                return ERR_PTR(-ENOMEM);
-       }
 
        nt->np.name = "netconsole";
        strlcpy(nt->np.dev_name, "eth0", IFNAMSIZ);
index e8be47d..60338ff 100644 (file)
@@ -355,8 +355,7 @@ static void bcm54xx_adjust_rxrefclk(struct phy_device *phydev)
                }
        }
 
-       if (clk125en == false ||
-           (phydev->dev_flags & PHY_BRCM_AUTO_PWRDWN_ENABLE))
+       if (!clk125en || (phydev->dev_flags & PHY_BRCM_AUTO_PWRDWN_ENABLE))
                val &= ~BCM54XX_SHD_SCR3_DLLAPD_DIS;
        else
                val |= BCM54XX_SHD_SCR3_DLLAPD_DIS;
@@ -373,8 +372,7 @@ static void bcm54xx_adjust_rxrefclk(struct phy_device *phydev)
 
        orig = val;
 
-       if (clk125en == false ||
-           (phydev->dev_flags & PHY_BRCM_AUTO_PWRDWN_ENABLE))
+       if (!clk125en || (phydev->dev_flags & PHY_BRCM_AUTO_PWRDWN_ENABLE))
                val |= BCM54XX_SHD_APD_EN;
        else
                val &= ~BCM54XX_SHD_APD_EN;
index a9e9ca8..1a5a316 100644 (file)
@@ -1260,10 +1260,8 @@ static void plip_attach (struct parport *port)
 
                sprintf(name, "plip%d", unit);
                dev = alloc_etherdev(sizeof(struct net_local));
-               if (!dev) {
-                       printk(KERN_ERR "plip: memory squeeze\n");
+               if (!dev)
                        return;
-               }
 
                strcpy(dev->name, name);
 
index c6ba643..af95a98 100644 (file)
@@ -26,7 +26,7 @@
 #include <linux/poll.h>
 #include <linux/crc-ccitt.h>
 #include <linux/ppp_defs.h>
-#include <linux/if_ppp.h>
+#include <linux/ppp-ioctl.h>
 #include <linux/ppp_channel.h>
 #include <linux/spinlock.h>
 #include <linux/init.h>
index 1dbdf82..602c625 100644 (file)
@@ -1,34 +1,12 @@
 /*
- *  ==FILEVERSION 980319==
- *
  * ppp_deflate.c - interface the zlib procedures for Deflate compression
  * and decompression (as used by gzip) to the PPP code.
- * This version is for use with Linux kernel 1.3.X.
- *
- * Copyright (c) 1994 The Australian National University.
- * All rights reserved.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation is hereby granted, provided that the above copyright
- * notice appears in all copies.  This software is provided without any
- * warranty, express or implied. The Australian National University
- * makes no representations about the suitability of this software for
- * any purpose.
- *
- * IN NO EVENT SHALL THE AUSTRALIAN NATIONAL UNIVERSITY BE LIABLE TO ANY
- * PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF
- * THE AUSTRALIAN NATIONAL UNIVERSITY HAS BEEN ADVISED OF THE POSSIBILITY
- * OF SUCH DAMAGE.
  *
- * THE AUSTRALIAN NATIONAL UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES,
- * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- * AND FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE AUSTRALIAN NATIONAL UNIVERSITY HAS NO
- * OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS,
- * OR MODIFICATIONS.
+ * Copyright 1994-1998 Paul Mackerras.
  *
- * From: deflate.c,v 1.1 1996/01/18 03:17:48 paulus Exp
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU General Public License
+ *  version 2 as published by the Free Software Foundation.
  */
 
 #include <linux/module.h>
index 486b404..159da29 100644 (file)
@@ -32,7 +32,7 @@
 #include <linux/poll.h>
 #include <linux/ppp_defs.h>
 #include <linux/filter.h>
-#include <linux/if_ppp.h>
+#include <linux/ppp-ioctl.h>
 #include <linux/ppp_channel.h>
 #include <linux/ppp-comp.h>
 #include <linux/skbuff.h>
@@ -1031,7 +1031,7 @@ static void ppp_setup(struct net_device *dev)
 {
        dev->netdev_ops = &ppp_netdev_ops;
        dev->hard_header_len = PPP_HDRLEN;
-       dev->mtu = PPP_MTU;
+       dev->mtu = PPP_MRU;
        dev->addr_len = 0;
        dev->tx_queue_len = 3;
        dev->type = ARPHRD_PPP;
@@ -2136,7 +2136,7 @@ ppp_mp_reconstruct(struct ppp *ppp)
 
                                skb->len += p->len;
                                skb->data_len += p->len;
-                               skb->truesize += p->len;
+                               skb->truesize += p->truesize;
 
                                if (p == tail)
                                        break;
index 736a39e..55e466c 100644 (file)
@@ -39,7 +39,7 @@
 #include <linux/netdevice.h>
 #include <linux/poll.h>
 #include <linux/ppp_defs.h>
-#include <linux/if_ppp.h>
+#include <linux/ppp-ioctl.h>
 #include <linux/ppp_channel.h>
 #include <linux/spinlock.h>
 #include <linux/completion.h>
index bc9a4bb..2fa1a9b 100644 (file)
@@ -72,7 +72,7 @@
 #include <linux/if_pppox.h>
 #include <linux/ppp_channel.h>
 #include <linux/ppp_defs.h>
-#include <linux/if_ppp.h>
+#include <linux/ppp-ioctl.h>
 #include <linux/notifier.h>
 #include <linux/file.h>
 #include <linux/proc_fs.h>
index 8c0d170..2940e9f 100644 (file)
@@ -28,7 +28,7 @@
 #include <linux/init.h>
 #include <linux/if_pppox.h>
 #include <linux/ppp_defs.h>
-#include <linux/if_ppp.h>
+#include <linux/ppp-ioctl.h>
 #include <linux/ppp_channel.h>
 #include <linux/kmod.h>
 
index df884dd..885dbdd 100644 (file)
@@ -23,7 +23,7 @@
 #include <linux/ppp_channel.h>
 #include <linux/ppp_defs.h>
 #include <linux/if_pppox.h>
-#include <linux/if_ppp.h>
+#include <linux/ppp-ioctl.h>
 #include <linux/notifier.h>
 #include <linux/file.h>
 #include <linux/in.h>
@@ -481,7 +481,7 @@ static int pptp_connect(struct socket *sock, struct sockaddr *uservaddr,
 
        po->chan.mtu = dst_mtu(&rt->dst);
        if (!po->chan.mtu)
-               po->chan.mtu = PPP_MTU;
+               po->chan.mtu = PPP_MRU;
        ip_rt_put(rt);
        po->chan.mtu -= PPTP_HEADER_OVERHEAD;
 
@@ -670,10 +670,8 @@ static int __init pptp_init_module(void)
        pr_info("PPTP driver version " PPTP_DRIVER_VERSION "\n");
 
        callid_sock = vzalloc((MAX_CALLID + 1) * sizeof(void *));
-       if (!callid_sock) {
-               pr_err("PPTP: cann't allocate memory\n");
+       if (!callid_sock)
                return -ENOMEM;
-       }
 
        err = gre_add_protocol(&gre_pptp_protocol, GREPROTO_PPTP);
        if (err) {
index 7145714..a57f057 100644 (file)
@@ -497,8 +497,6 @@ static int rionet_probe(struct rio_dev *rdev, const struct rio_device_id *id)
        /* Allocate our net_device structure */
        ndev = alloc_etherdev(sizeof(struct rionet_private));
        if (ndev == NULL) {
-               printk(KERN_INFO "%s: could not allocate ethernet device.\n",
-                      DRV_NAME);
                rc = -ENOMEM;
                goto out;
        }
index ba08341..69345df 100644 (file)
@@ -1296,10 +1296,8 @@ static int __init slip_init(void)
 
        slip_devs = kzalloc(sizeof(struct net_device *)*slip_maxdev,
                                                                GFP_KERNEL);
-       if (!slip_devs) {
-               printk(KERN_ERR "SLIP: Can't allocate slip devices array.\n");
+       if (!slip_devs)
                return -ENOMEM;
-       }
 
        /* Fill in our line protocol discipline, and register it */
        status = tty_register_ldisc(N_SLIP, &sl_ldisc);
index 6b678f3..8f81805 100644 (file)
@@ -868,6 +868,7 @@ static int team_set_mac_address(struct net_device *dev, void *p)
        struct team_port *port;
        struct sockaddr *addr = p;
 
+       dev->addr_assign_type &= ~NET_ADDR_RANDOM;
        memcpy(dev->dev_addr, addr->sa_data, ETH_ALEN);
        rcu_read_lock();
        list_for_each_entry_rcu(port, &team->port_list, list)
@@ -1087,7 +1088,7 @@ static int team_newlink(struct net *src_net, struct net_device *dev,
        int err;
 
        if (tb[IFLA_ADDRESS] == NULL)
-               random_ether_addr(dev->dev_addr);
+               eth_hw_addr_random(dev);
 
        err = register_netdevice(dev);
        if (err)
index ef9fdf3..d7c292a 100644 (file)
@@ -674,15 +674,11 @@ static int xl_open(struct net_device *dev)
        /* These MUST be on 8 byte boundaries */
        xl_priv->xl_tx_ring = kzalloc((sizeof(struct xl_tx_desc) * XL_TX_RING_SIZE) + 7, GFP_DMA | GFP_KERNEL);
        if (xl_priv->xl_tx_ring == NULL) {
-               printk(KERN_WARNING "%s: Not enough memory to allocate tx buffers.\n",
-                                    dev->name);
                free_irq(dev->irq,dev);
                return -ENOMEM;
        }
        xl_priv->xl_rx_ring = kzalloc((sizeof(struct xl_rx_desc) * XL_RX_RING_SIZE) +7, GFP_DMA | GFP_KERNEL);
        if (xl_priv->xl_rx_ring == NULL) {
-               printk(KERN_WARNING "%s: Not enough memory to allocate rx buffers.\n",
-                                    dev->name);
                free_irq(dev->irq,dev);
                kfree(xl_priv->xl_tx_ring);
                return -ENOMEM;
index 6153cfd..1cdc034 100644 (file)
@@ -171,7 +171,6 @@ static int __devinit madgemc_probe(struct device *device)
 
        card = kmalloc(sizeof(struct card_info), GFP_KERNEL);
        if (card==NULL) {
-               printk("madgemc: unable to allocate card struct\n");
                ret = -ENOMEM;
                goto getout1;
        }
index 65e9cf3..102f896 100644 (file)
@@ -1525,10 +1525,8 @@ static void tms380tr_chk_outstanding_cmds(struct net_device *dev)
        /* Check if adapter is opened, avoiding COMMAND_REJECT
         * interrupt by the adapter!
         */
-       if(tp->AdapterOpenFlag == 0)
-       {
-               if(tp->CMDqueue & OC_OPEN)
-               {
+       if (tp->AdapterOpenFlag == 0) {
+               if (tp->CMDqueue & OC_OPEN) {
                        /* Execute OPEN command */
                        tp->CMDqueue ^= OC_OPEN;
 
@@ -1536,21 +1534,17 @@ static void tms380tr_chk_outstanding_cmds(struct net_device *dev)
                        tp->scb.Parm[0] = LOWORD(Addr);
                        tp->scb.Parm[1] = HIWORD(Addr);
                        tp->scb.CMD = OPEN;
-               }
-               else
+               } else
                        /* No OPEN command queued, but adapter closed. Note:
                         * We'll try to re-open the adapter in DriverPoll()
                         */
                        return;         /* No adapter command issued */
-       }
-       else
-       {
+       } else {
                /* Adapter is open; evaluate command queue: try to execute
                 * outstanding commands (depending on priority!) CLOSE
                 * command queued
                 */
-               if(tp->CMDqueue & OC_CLOSE)
-               {
+               if (tp->CMDqueue & OC_CLOSE) {
                        tp->CMDqueue ^= OC_CLOSE;
                        tp->AdapterOpenFlag = 0;
                        tp->scb.Parm[0] = 0; /* Parm[0], Parm[1] are ignored */
@@ -1560,109 +1554,70 @@ static void tms380tr_chk_outstanding_cmds(struct net_device *dev)
                                tp->CMDqueue |= OC_OPEN; /* re-open adapter */
                        else
                                tp->CMDqueue = 0;       /* no more commands */
-               }
-               else
-               {
-                       if(tp->CMDqueue & OC_RECEIVE)
-                       {
-                               tp->CMDqueue ^= OC_RECEIVE;
-                               Addr = htonl(((char *)tp->RplHead - (char *)tp) + tp->dmabuffer);
-                               tp->scb.Parm[0] = LOWORD(Addr);
-                               tp->scb.Parm[1] = HIWORD(Addr);
-                               tp->scb.CMD = RECEIVE;
-                       }
-                       else
-                       {
-                               if(tp->CMDqueue & OC_TRANSMIT_HALT)
-                               {
-                                       /* NOTE: TRANSMIT.HALT must be checked 
-                                        * before TRANSMIT.
-                                        */
-                                       tp->CMDqueue ^= OC_TRANSMIT_HALT;
-                                       tp->scb.CMD = TRANSMIT_HALT;
-
-                                       /* Parm[0] and Parm[1] are ignored
-                                        * but should be set to zero!
-                                        */
-                                       tp->scb.Parm[0] = 0;
-                                       tp->scb.Parm[1] = 0;
-                               }
-                               else
-                               {
-                                       if(tp->CMDqueue & OC_TRANSMIT)
-                                       {
-                                               /* NOTE: TRANSMIT must be 
-                                                * checked after TRANSMIT.HALT
-                                                */
-                                               if(tp->TransmitCommandActive)
-                                               {
-                                                       if(!tp->TransmitHaltScheduled)
-                                                       {
-                                                               tp->TransmitHaltScheduled = 1;
-                                                               tms380tr_exec_cmd(dev, OC_TRANSMIT_HALT) ;
-                                                       }
-                                                       tp->TransmitCommandActive = 0;
-                                                       return;
-                                               }
-
-                                               tp->CMDqueue ^= OC_TRANSMIT;
-                                               tms380tr_cancel_tx_queue(tp);
-                                               Addr = htonl(((char *)tp->TplBusy - (char *)tp) + tp->dmabuffer);
-                                               tp->scb.Parm[0] = LOWORD(Addr);
-                                               tp->scb.Parm[1] = HIWORD(Addr);
-                                               tp->scb.CMD = TRANSMIT;
-                                               tp->TransmitCommandActive = 1;
-                                       }
-                                       else
-                                       {
-                                               if(tp->CMDqueue & OC_MODIFY_OPEN_PARMS)
-                                               {
-                                                       tp->CMDqueue ^= OC_MODIFY_OPEN_PARMS;
-                                                       tp->scb.Parm[0] = tp->ocpl.OPENOptions; /* new OPEN options*/
-                                                       tp->scb.Parm[0] |= ENABLE_FULL_DUPLEX_SELECTION;
-                                                       tp->scb.Parm[1] = 0; /* is ignored but should be zero */
-                                                       tp->scb.CMD = MODIFY_OPEN_PARMS;
-                                               }
-                                               else
-                                               {
-                                                       if(tp->CMDqueue & OC_SET_FUNCT_ADDR)
-                                                       {
-                                                               tp->CMDqueue ^= OC_SET_FUNCT_ADDR;
-                                                               tp->scb.Parm[0] = LOWORD(tp->ocpl.FunctAddr);
-                                                               tp->scb.Parm[1] = HIWORD(tp->ocpl.FunctAddr);
-                                                               tp->scb.CMD = SET_FUNCT_ADDR;
-                                                       }
-                                                       else
-                                                       {
-                                                               if(tp->CMDqueue & OC_SET_GROUP_ADDR)
-                                                               {
-                                                                       tp->CMDqueue ^= OC_SET_GROUP_ADDR;
-                                                                       tp->scb.Parm[0] = LOWORD(tp->ocpl.GroupAddr);
-                                                                       tp->scb.Parm[1] = HIWORD(tp->ocpl.GroupAddr);
-                                                                       tp->scb.CMD = SET_GROUP_ADDR;
-                                                               }
-                                                               else
-                                                               {
-                                                                       if(tp->CMDqueue & OC_READ_ERROR_LOG)
-                                                                       {
-                                                                               tp->CMDqueue ^= OC_READ_ERROR_LOG;
-                                                                               Addr = htonl(((char *)&tp->errorlogtable - (char *)tp) + tp->dmabuffer);
-                                                                               tp->scb.Parm[0] = LOWORD(Addr);
-                                                                               tp->scb.Parm[1] = HIWORD(Addr);
-                                                                               tp->scb.CMD = READ_ERROR_LOG;
-                                                                       }
-                                                                       else
-                                                                       {
-                                                                               printk(KERN_WARNING "CheckForOutstandingCommand: unknown Command\n");
-                                                                               tp->CMDqueue = 0;
-                                                                               return;
-                                                                       }
-                                                               }
-                                                       }
-                                               }
-                                       }
+               } else if (tp->CMDqueue & OC_RECEIVE) {
+                       tp->CMDqueue ^= OC_RECEIVE;
+                       Addr = htonl(((char *)tp->RplHead - (char *)tp) + tp->dmabuffer);
+                       tp->scb.Parm[0] = LOWORD(Addr);
+                       tp->scb.Parm[1] = HIWORD(Addr);
+                       tp->scb.CMD = RECEIVE;
+               } else if (tp->CMDqueue & OC_TRANSMIT_HALT) {
+                       /* NOTE: TRANSMIT.HALT must be checked
+                        * before TRANSMIT.
+                        */
+                       tp->CMDqueue ^= OC_TRANSMIT_HALT;
+                       tp->scb.CMD = TRANSMIT_HALT;
+
+                       /* Parm[0] and Parm[1] are ignored
+                        * but should be set to zero!
+                        */
+                       tp->scb.Parm[0] = 0;
+                       tp->scb.Parm[1] = 0;
+               } else if (tp->CMDqueue & OC_TRANSMIT) {
+                       /* NOTE: TRANSMIT must be
+                        * checked after TRANSMIT.HALT
+                        */
+                       if (tp->TransmitCommandActive) {
+                               if (!tp->TransmitHaltScheduled) {
+                                       tp->TransmitHaltScheduled = 1;
+                                       tms380tr_exec_cmd(dev, OC_TRANSMIT_HALT);
                                }
+                               tp->TransmitCommandActive = 0;
+                               return;
                        }
+
+                       tp->CMDqueue ^= OC_TRANSMIT;
+                       tms380tr_cancel_tx_queue(tp);
+                       Addr = htonl(((char *)tp->TplBusy - (char *)tp) + tp->dmabuffer);
+                       tp->scb.Parm[0] = LOWORD(Addr);
+                       tp->scb.Parm[1] = HIWORD(Addr);
+                       tp->scb.CMD = TRANSMIT;
+                       tp->TransmitCommandActive = 1;
+               } else if (tp->CMDqueue & OC_MODIFY_OPEN_PARMS) {
+                       tp->CMDqueue ^= OC_MODIFY_OPEN_PARMS;
+                       tp->scb.Parm[0] = tp->ocpl.OPENOptions; /* new OPEN options*/
+                       tp->scb.Parm[0] |= ENABLE_FULL_DUPLEX_SELECTION;
+                       tp->scb.Parm[1] = 0; /* is ignored but should be zero */
+                       tp->scb.CMD = MODIFY_OPEN_PARMS;
+               } else if (tp->CMDqueue & OC_SET_FUNCT_ADDR) {
+                       tp->CMDqueue ^= OC_SET_FUNCT_ADDR;
+                       tp->scb.Parm[0] = LOWORD(tp->ocpl.FunctAddr);
+                       tp->scb.Parm[1] = HIWORD(tp->ocpl.FunctAddr);
+                       tp->scb.CMD = SET_FUNCT_ADDR;
+               } else if (tp->CMDqueue & OC_SET_GROUP_ADDR) {
+                       tp->CMDqueue ^= OC_SET_GROUP_ADDR;
+                       tp->scb.Parm[0] = LOWORD(tp->ocpl.GroupAddr);
+                       tp->scb.Parm[1] = HIWORD(tp->ocpl.GroupAddr);
+                       tp->scb.CMD = SET_GROUP_ADDR;
+               } else if (tp->CMDqueue & OC_READ_ERROR_LOG) {
+                       tp->CMDqueue ^= OC_READ_ERROR_LOG;
+                       Addr = htonl(((char *)&tp->errorlogtable - (char *)tp) + tp->dmabuffer);
+                       tp->scb.Parm[0] = LOWORD(Addr);
+                       tp->scb.Parm[1] = HIWORD(Addr);
+                       tp->scb.CMD = READ_ERROR_LOG;
+               } else {
+                       printk(KERN_WARNING "CheckForOutstandingCommand: unknown Command\n");
+                       tp->CMDqueue = 0;
+                       return;
                }
        }
 
index 93c5d72..2c5d349 100644 (file)
@@ -531,7 +531,7 @@ static void tun_net_init(struct net_device *dev)
                ether_setup(dev);
                dev->priv_flags &= ~IFF_TX_SKB_SHARING;
 
-               random_ether_addr(dev->dev_addr);
+               eth_hw_addr_random(dev);
 
                dev->tx_queue_len = TUN_READQ_SIZE;  /* We prefer our own queue length */
                break;
index 2335761..4bad899 100644 (file)
@@ -398,6 +398,27 @@ config USB_NET_KALMIA
          To compile this driver as a module, choose M here: the
          module will be called kalmia.
 
+config USB_NET_QMI_WWAN
+       tristate "QMI WWAN driver for Qualcomm MSM based 3G and LTE modems"
+       depends on USB_USBNET
+       help
+         Support WWAN LTE/3G devices based on Qualcomm Mobile Data Modem
+         (MDM) chipsets.  Examples of such devices are
+           * Huawei E392/E398
+
+         This driver will only drive the ethernet part of the chips.
+         The devices require additional configuration to be usable.
+         Multiple management interfaces with linux drivers are
+         available:
+
+           * option: AT commands on /dev/ttyUSBx
+           * cdc-wdm: Qualcomm MSM Interface (QMI) protocol on /dev/cdc-wdmx
+
+         A modem manager with support for QMI is recommended.
+
+         To compile this driver as a module, choose M here: the
+         module will be called qmi_wwan.
+
 config USB_HSO
        tristate "Option USB High Speed Mobile Devices"
        depends on USB && RFKILL
@@ -461,4 +482,5 @@ config USB_VL600
 
          http://ubuntuforums.org/showpost.php?p=10589647&postcount=17
 
+
 endmenu
index c203fa2..a2e2d72 100644 (file)
@@ -29,4 +29,5 @@ obj-$(CONFIG_USB_SIERRA_NET)  += sierra_net.o
 obj-$(CONFIG_USB_NET_CX82310_ETH)      += cx82310_eth.o
 obj-$(CONFIG_USB_NET_CDC_NCM)  += cdc_ncm.o
 obj-$(CONFIG_USB_VL600)                += lg-vl600.o
+obj-$(CONFIG_USB_NET_QMI_WWAN) += qmi_wwan.o
 
index 3a539a9..81f86b8 100644 (file)
@@ -579,11 +579,7 @@ advance:
        if (temp)
                goto error2;
 
-       dev_info(&dev->udev->dev, "MAC-Address: "
-                               "0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x\n",
-                               dev->net->dev_addr[0], dev->net->dev_addr[1],
-                               dev->net->dev_addr[2], dev->net->dev_addr[3],
-                               dev->net->dev_addr[4], dev->net->dev_addr[5]);
+       dev_info(&dev->udev->dev, "MAC-Address: %pM\n", dev->net->dev_addr);
 
        dev->in = usb_rcvbulkpipe(dev->udev,
                ctx->in_ep->desc.bEndpointAddress & USB_ENDPOINT_NUMBER_MASK);
index d034d9c..df2a2cf 100644 (file)
@@ -1098,13 +1098,7 @@ err_fw:
        dev_info(&intf->dev, "Statistics collection: %x\n", kaweth->configuration.statistics_mask);
        dev_info(&intf->dev, "Multicast filter limit: %x\n", kaweth->configuration.max_multicast_filters & ((1 << 15) - 1));
        dev_info(&intf->dev, "MTU: %d\n", le16_to_cpu(kaweth->configuration.segment_size));
-       dev_info(&intf->dev, "Read MAC address %2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x\n",
-                (int)kaweth->configuration.hw_addr[0],
-                (int)kaweth->configuration.hw_addr[1],
-                (int)kaweth->configuration.hw_addr[2],
-                (int)kaweth->configuration.hw_addr[3],
-                (int)kaweth->configuration.hw_addr[4],
-                (int)kaweth->configuration.hw_addr[5]);
+       dev_info(&intf->dev, "Read MAC address %pM\n", kaweth->configuration.hw_addr);
 
        if(!memcmp(&kaweth->configuration.hw_addr,
                    &bcast_addr,
index a29aa9c..c434b6b 100644 (file)
@@ -239,7 +239,7 @@ static int mcs7830_set_mac_address(struct net_device *netdev, void *p)
                return -EBUSY;
 
        if (!is_valid_ether_addr(addr->sa_data))
-               return -EINVAL;
+               return -EADDRNOTAVAIL;
 
        ret = mcs7830_hif_set_mac_address(dev, addr->sa_data);
 
index 5d99b8c..7523930 100644 (file)
@@ -1332,10 +1332,8 @@ static int pegasus_probe(struct usb_interface *intf,
        usb_get_dev(dev);
 
        net = alloc_etherdev(sizeof(struct pegasus));
-       if (!net) {
-               dev_err(&intf->dev, "can't allocate %s\n", "device");
+       if (!net)
                goto out;
-       }
 
        pegasus = netdev_priv(net);
        pegasus->dev_index = dev_index;
diff --git a/drivers/net/usb/qmi_wwan.c b/drivers/net/usb/qmi_wwan.c
new file mode 100644 (file)
index 0000000..739e6de
--- /dev/null
@@ -0,0 +1,228 @@
+/*
+ * Copyright (c) 2012  Bjørn Mork <bjorn@mork.no>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * version 2 as published by the Free Software Foundation.
+ */
+
+#include <linux/module.h>
+#include <linux/netdevice.h>
+#include <linux/ethtool.h>
+#include <linux/mii.h>
+#include <linux/usb.h>
+#include <linux/usb/cdc.h>
+#include <linux/usb/usbnet.h>
+
+/* The name of the CDC Device Management driver */
+#define DM_DRIVER "cdc_wdm"
+
+/*
+ * This driver supports wwan (3G/LTE/?) devices using a vendor
+ * specific management protocol called Qualcomm MSM Interface (QMI) -
+ * in addition to the more common AT commands over serial interface
+ * management
+ *
+ * QMI is wrapped in CDC, using CDC encapsulated commands on the
+ * control ("master") interface of a two-interface CDC Union
+ * resembling standard CDC ECM.  The devices do not use the control
+ * interface for any other CDC messages.  Most likely because the
+ * management protocol is used in place of the standard CDC
+ * notifications NOTIFY_NETWORK_CONNECTION and NOTIFY_SPEED_CHANGE
+ *
+ * Handling a protocol like QMI is out of the scope for any driver.
+ * It can be exported as a character device using the cdc-wdm driver,
+ * which will enable userspace applications ("modem managers") to
+ * handle it.  This may be required to use the network interface
+ * provided by the driver.
+ *
+ * These devices may alternatively/additionally be configured using AT
+ * commands on any of the serial interfaces driven by the option driver
+ *
+ * This driver binds only to the data ("slave") interface to enable
+ * the cdc-wdm driver to bind to the control interface.  It still
+ * parses the CDC functional descriptors on the control interface to
+ *  a) verify that this is indeed a handled interface (CDC Union
+ *     header lists it as slave)
+ *  b) get MAC address and other ethernet config from the CDC Ethernet
+ *     header
+ *  c) enable user bind requests against the control interface, which
+ *     is the common way to bind to CDC Ethernet Control Model type
+ *     interfaces
+ *  d) provide a hint to the user about which interface is the
+ *     corresponding management interface
+ */
+
+static int qmi_wwan_bind(struct usbnet *dev, struct usb_interface *intf)
+{
+       int status = -1;
+       struct usb_interface *control = NULL;
+       u8 *buf = intf->cur_altsetting->extra;
+       int len = intf->cur_altsetting->extralen;
+       struct usb_interface_descriptor *desc = &intf->cur_altsetting->desc;
+       struct usb_cdc_union_desc *cdc_union = NULL;
+       struct usb_cdc_ether_desc *cdc_ether = NULL;
+       u32 required = 1 << USB_CDC_HEADER_TYPE | 1 << USB_CDC_UNION_TYPE;
+       u32 found = 0;
+
+       /*
+        * assume a data interface has no additional descriptors and
+        * that the control and data interface are numbered
+        * consecutively - this holds for the Huawei device at least
+        */
+       if (len == 0 && desc->bInterfaceNumber > 0) {
+               control = usb_ifnum_to_if(dev->udev, desc->bInterfaceNumber - 1);
+               if (!control)
+                       goto err;
+
+               buf = control->cur_altsetting->extra;
+               len = control->cur_altsetting->extralen;
+               dev_dbg(&intf->dev, "guessing \"control\" => %s, \"data\" => this\n",
+                       dev_name(&control->dev));
+       }
+
+       while (len > 3) {
+               struct usb_descriptor_header *h = (void *)buf;
+
+               /* ignore any misplaced descriptors */
+               if (h->bDescriptorType != USB_DT_CS_INTERFACE)
+                       goto next_desc;
+
+               /* buf[2] is CDC descriptor subtype */
+               switch (buf[2]) {
+               case USB_CDC_HEADER_TYPE:
+                       if (found & 1 << USB_CDC_HEADER_TYPE) {
+                               dev_dbg(&intf->dev, "extra CDC header\n");
+                               goto err;
+                       }
+                       if (h->bLength != sizeof(struct usb_cdc_header_desc)) {
+                               dev_dbg(&intf->dev, "CDC header len %u\n", h->bLength);
+                               goto err;
+                       }
+                       break;
+               case USB_CDC_UNION_TYPE:
+                       if (found & 1 << USB_CDC_UNION_TYPE) {
+                               dev_dbg(&intf->dev, "extra CDC union\n");
+                               goto err;
+                       }
+                       if (h->bLength != sizeof(struct usb_cdc_union_desc)) {
+                               dev_dbg(&intf->dev, "CDC union len %u\n", h->bLength);
+                               goto err;
+                       }
+                       cdc_union = (struct usb_cdc_union_desc *)buf;
+                       break;
+               case USB_CDC_ETHERNET_TYPE:
+                       if (found & 1 << USB_CDC_ETHERNET_TYPE) {
+                               dev_dbg(&intf->dev, "extra CDC ether\n");
+                               goto err;
+                       }
+                       if (h->bLength != sizeof(struct usb_cdc_ether_desc)) {
+                               dev_dbg(&intf->dev, "CDC ether len %u\n",  h->bLength);
+                               goto err;
+                       }
+                       cdc_ether = (struct usb_cdc_ether_desc *)buf;
+                       break;
+               }
+
+               /*
+                * Remember which CDC functional descriptors we've seen.  Works
+                * for all types we care about, of which USB_CDC_ETHERNET_TYPE
+                * (0x0f) is the highest numbered
+                */
+               if (buf[2] < 32)
+                       found |= 1 << buf[2];
+
+next_desc:
+               len -= h->bLength;
+               buf += h->bLength;
+       }
+
+       /* did we find all the required ones? */
+       if ((found & required) != required) {
+               dev_err(&intf->dev, "CDC functional descriptors missing\n");
+               goto err;
+       }
+
+       /* give the user a helpful hint if trying to bind to the wrong interface */
+       if (cdc_union && desc->bInterfaceNumber == cdc_union->bMasterInterface0) {
+               dev_err(&intf->dev, "leaving \"control\" interface for " DM_DRIVER " - try binding to %s instead!\n",
+                       dev_name(&usb_ifnum_to_if(dev->udev, cdc_union->bSlaveInterface0)->dev));
+               goto err;
+       }
+
+       /* errors aren't fatal - we can live with the dynamic address */
+       if (cdc_ether) {
+               dev->hard_mtu = le16_to_cpu(cdc_ether->wMaxSegmentSize);
+               usbnet_get_ethernet_addr(dev, cdc_ether->iMACAddress);
+       }
+
+       /* success! point the user to the management interface */
+       if (control)
+               dev_info(&intf->dev, "Use \"" DM_DRIVER "\" for QMI interface %s\n",
+                       dev_name(&control->dev));
+
+       /* XXX: add a sysfs symlink somewhere to help management applications find it? */
+
+       /* collect bulk endpoints now that we know intf == "data" interface */
+       status = usbnet_get_endpoints(dev, intf);
+
+err:
+       return status;
+}
+
+/* stolen from cdc_ether.c */
+static int qmi_wwan_manage_power(struct usbnet *dev, int on)
+{
+       dev->intf->needs_remote_wakeup = on;
+       return 0;
+}
+
+static const struct driver_info        qmi_wwan_info = {
+       .description    = "QMI speaking wwan device",
+       .flags          = FLAG_WWAN,
+       .bind           = qmi_wwan_bind,
+       .manage_power   = qmi_wwan_manage_power,
+};
+
+#define HUAWEI_VENDOR_ID       0x12D1
+
+static const struct usb_device_id products[] = {
+{
+       /* Huawei E392, E398 and possibly others sharing both device id and more... */
+       .match_flags        = USB_DEVICE_ID_MATCH_VENDOR | USB_DEVICE_ID_MATCH_INT_INFO,
+       .idVendor           = HUAWEI_VENDOR_ID,
+       .bInterfaceClass    = USB_CLASS_VENDOR_SPEC,
+       .bInterfaceSubClass = 1,
+       .bInterfaceProtocol = 8, /* NOTE: This is the *slave* interface of the CDC Union! */
+       .driver_info        = (unsigned long)&qmi_wwan_info,
+}, {
+},     /* END */
+};
+MODULE_DEVICE_TABLE(usb, products);
+
+static struct usb_driver qmi_wwan_driver = {
+       .name                 = "qmi_wwan",
+       .id_table             = products,
+       .probe                = usbnet_probe,
+       .disconnect           = usbnet_disconnect,
+       .suspend              = usbnet_suspend,
+       .resume               = usbnet_resume,
+       .reset_resume         = usbnet_resume,
+       .supports_autosuspend = 1,
+};
+
+static int __init qmi_wwan_init(void)
+{
+       return usb_register(&qmi_wwan_driver);
+}
+module_init(qmi_wwan_init);
+
+static void __exit qmi_wwan_exit(void)
+{
+       usb_deregister(&qmi_wwan_driver);
+}
+module_exit(qmi_wwan_exit);
+
+MODULE_AUTHOR("Bjørn Mork <bjorn@mork.no>");
+MODULE_DESCRIPTION("Qualcomm MSM Interface (QMI) WWAN driver");
+MODULE_LICENSE("GPL");
index 0710b4c..6dda2fe 100644 (file)
@@ -894,10 +894,8 @@ static int rtl8150_probe(struct usb_interface *intf,
        struct net_device *netdev;
 
        netdev = alloc_etherdev(sizeof(rtl8150_t));
-       if (!netdev) {
-               err("Out of memory");
+       if (!netdev)
                return -ENOMEM;
-       }
 
        dev = netdev_priv(netdev);
 
index 3b017bb..187d01c 100644 (file)
@@ -615,7 +615,7 @@ static void smsc75xx_init_mac_address(struct usbnet *dev)
        }
 
        /* no eeprom, or eeprom values are invalid. generate random MAC */
-       random_ether_addr(dev->net->dev_addr);
+       eth_hw_addr_random(dev->net);
        netif_dbg(dev, ifup, dev->net, "MAC address set to random_ether_addr");
 }
 
index d45520e..5f19f84 100644 (file)
@@ -614,7 +614,7 @@ static void smsc95xx_init_mac_address(struct usbnet *dev)
        }
 
        /* no eeprom, or eeprom values are invalid. generate random MAC */
-       random_ether_addr(dev->net->dev_addr);
+       eth_hw_addr_random(dev->net);
        netif_dbg(dev, ifup, dev->net, "MAC address set to random_ether_addr\n");
 }
 
index fae0fbd..b924f46 100644 (file)
@@ -1334,10 +1334,8 @@ usbnet_probe (struct usb_interface *udev, const struct usb_device_id *prod)
 
        // set up our own records
        net = alloc_etherdev(sizeof(*dev));
-       if (!net) {
-               dbg ("can't kmalloc dev");
+       if (!net)
                goto out;
-       }
 
        /* netdev_printk() needs this so do it as early as possible */
        SET_NETDEV_DEV(net, &udev->dev);
index 4a34028..5852361 100644 (file)
@@ -346,7 +346,7 @@ static int veth_newlink(struct net *src_net, struct net_device *dev,
        }
 
        if (tbp[IFLA_ADDRESS] == NULL)
-               random_ether_addr(peer->dev_addr);
+               eth_hw_addr_random(peer);
 
        err = register_netdevice(peer);
        put_net(net);
@@ -368,7 +368,7 @@ static int veth_newlink(struct net *src_net, struct net_device *dev,
         */
 
        if (tb[IFLA_ADDRESS] == NULL)
-               random_ether_addr(dev->dev_addr);
+               eth_hw_addr_random(dev);
 
        if (tb[IFLA_IFNAME])
                nla_strlcpy(dev->name, tb[IFLA_IFNAME], IFNAMSIZ);
index 4880aa8..019da01 100644 (file)
@@ -255,7 +255,7 @@ static int receive_mergeable(struct virtnet_info *vi, struct sk_buff *skb)
 static void receive_buf(struct net_device *dev, void *buf, unsigned int len)
 {
        struct virtnet_info *vi = netdev_priv(dev);
-       struct virtnet_stats __percpu *stats = this_cpu_ptr(vi->stats);
+       struct virtnet_stats *stats = this_cpu_ptr(vi->stats);
        struct sk_buff *skb;
        struct page *page;
        struct skb_vnet_hdr *hdr;
@@ -549,7 +549,7 @@ static unsigned int free_old_xmit_skbs(struct virtnet_info *vi)
 {
        struct sk_buff *skb;
        unsigned int len, tot_sgs = 0;
-       struct virtnet_stats __percpu *stats = this_cpu_ptr(vi->stats);
+       struct virtnet_stats *stats = this_cpu_ptr(vi->stats);
 
        while ((skb = virtqueue_get_buf(vi->svq, &len)) != NULL) {
                pr_debug("Sent skb %p\n", skb);
@@ -688,8 +688,7 @@ static struct rtnl_link_stats64 *virtnet_stats(struct net_device *dev,
        unsigned int start;
 
        for_each_possible_cpu(cpu) {
-               struct virtnet_stats __percpu *stats
-                       = per_cpu_ptr(vi->stats, cpu);
+               struct virtnet_stats *stats = per_cpu_ptr(vi->stats, cpu);
                u64 tpackets, tbytes, rpackets, rbytes;
 
                do {
@@ -1061,7 +1060,7 @@ static int virtnet_probe(struct virtio_device *vdev)
        if (virtio_config_val_len(vdev, VIRTIO_NET_F_MAC,
                                  offsetof(struct virtio_net_config, mac),
                                  dev->dev_addr, dev->addr_len) < 0)
-               random_ether_addr(dev->dev_addr);
+               eth_hw_addr_random(dev);
 
        /* Set up our device-specific information */
        vi = netdev_priv(dev);
index 756c0f5..3f04ba0 100644 (file)
@@ -537,11 +537,8 @@ vmxnet3_tq_create(struct vmxnet3_tx_queue *tq,
 
        tq->buf_info = kcalloc(tq->tx_ring.size, sizeof(tq->buf_info[0]),
                               GFP_KERNEL);
-       if (!tq->buf_info) {
-               printk(KERN_ERR "%s: failed to allocate tx bufinfo\n",
-                      adapter->netdev->name);
+       if (!tq->buf_info)
                goto err;
-       }
 
        return 0;
 
@@ -636,7 +633,7 @@ vmxnet3_rq_alloc_rx_buf(struct vmxnet3_rx_queue *rq, u32 ring_idx,
 
        dev_dbg(&adapter->netdev->dev,
                "alloc_rx_buf: %d allocated, next2fill %u, next2comp "
-               "%u, uncommited %u\n", num_allocated, ring->next2fill,
+               "%u, uncommitted %u\n", num_allocated, ring->next2fill,
                ring->next2comp, rq->uncommitted[ring_idx]);
 
        /* so that the device can distinguish a full ring and an empty ring */
@@ -816,22 +813,19 @@ vmxnet3_parse_and_copy_hdr(struct sk_buff *skb, struct vmxnet3_tx_queue *tq,
 
        if (ctx->mss) { /* TSO */
                ctx->eth_ip_hdr_size = skb_transport_offset(skb);
-               ctx->l4_hdr_size = ((struct tcphdr *)
-                                  skb_transport_header(skb))->doff * 4;
+               ctx->l4_hdr_size = tcp_hdrlen(skb);
                ctx->copy_size = ctx->eth_ip_hdr_size + ctx->l4_hdr_size;
        } else {
                if (skb->ip_summed == CHECKSUM_PARTIAL) {
                        ctx->eth_ip_hdr_size = skb_checksum_start_offset(skb);
 
                        if (ctx->ipv4) {
-                               struct iphdr *iph = (struct iphdr *)
-                                                   skb_network_header(skb);
+                               const struct iphdr *iph = ip_hdr(skb);
+
                                if (iph->protocol == IPPROTO_TCP)
-                                       ctx->l4_hdr_size = ((struct tcphdr *)
-                                          skb_transport_header(skb))->doff * 4;
+                                       ctx->l4_hdr_size = tcp_hdrlen(skb);
                                else if (iph->protocol == IPPROTO_UDP)
-                                       ctx->l4_hdr_size =
-                                                       sizeof(struct udphdr);
+                                       ctx->l4_hdr_size = sizeof(struct udphdr);
                                else
                                        ctx->l4_hdr_size = 0;
                        } else {
@@ -876,14 +870,17 @@ static void
 vmxnet3_prepare_tso(struct sk_buff *skb,
                    struct vmxnet3_tx_ctx *ctx)
 {
-       struct tcphdr *tcph = (struct tcphdr *)skb_transport_header(skb);
+       struct tcphdr *tcph = tcp_hdr(skb);
+
        if (ctx->ipv4) {
-               struct iphdr *iph = (struct iphdr *)skb_network_header(skb);
+               struct iphdr *iph = ip_hdr(skb);
+
                iph->check = 0;
                tcph->check = ~csum_tcpudp_magic(iph->saddr, iph->daddr, 0,
                                                 IPPROTO_TCP, 0);
        } else {
-               struct ipv6hdr *iph = (struct ipv6hdr *)skb_network_header(skb);
+               struct ipv6hdr *iph = ipv6_hdr(skb);
+
                tcph->check = ~csum_ipv6_magic(&iph->saddr, &iph->daddr, 0,
                                               IPPROTO_TCP, 0);
        }
@@ -1514,11 +1511,9 @@ vmxnet3_rq_create(struct vmxnet3_rx_queue *rq, struct vmxnet3_adapter *adapter)
        sz = sizeof(struct vmxnet3_rx_buf_info) * (rq->rx_ring[0].size +
                                                   rq->rx_ring[1].size);
        bi = kzalloc(sz, GFP_KERNEL);
-       if (!bi) {
-               printk(KERN_ERR "%s: failed to allocate rx bufinfo\n",
-                      adapter->netdev->name);
+       if (!bi)
                goto err;
-       }
+
        rq->buf_info[0] = bi;
        rq->buf_info[1] = bi + rq->rx_ring[0].size;
 
@@ -2704,8 +2699,8 @@ vmxnet3_acquire_msix_vectors(struct vmxnet3_adapter *adapter,
                        adapter->intr.num_intrs = vectors;
                        return 0;
                } else if (err < 0) {
-                       printk(KERN_ERR "Failed to enable MSI-X for %s, error"
-                              " %d\n", adapter->netdev->name, err);
+                       netdev_err(adapter->netdev,
+                                  "Failed to enable MSI-X, error: %d\n", err);
                        vectors = 0;
                } else if (err < vector_threshold) {
                        break;
@@ -2713,15 +2708,15 @@ vmxnet3_acquire_msix_vectors(struct vmxnet3_adapter *adapter,
                        /* If fails to enable required number of MSI-x vectors
                         * try enabling minimum number of vectors required.
                         */
+                       netdev_err(adapter->netdev,
+                                  "Failed to enable %d MSI-X, trying %d instead\n",
+                                   vectors, vector_threshold);
                        vectors = vector_threshold;
-                       printk(KERN_ERR "Failed to enable %d MSI-X for %s, try"
-                              " %d instead\n", vectors, adapter->netdev->name,
-                              vector_threshold);
                }
        }
 
-       printk(KERN_INFO "Number of MSI-X interrupts which can be allocatedi"
-              " are lower than min threshold required.\n");
+       netdev_info(adapter->netdev,
+                   "Number of MSI-X interrupts which can be allocated are lower than min threshold required.\n");
        return err;
 }
 
@@ -2787,8 +2782,9 @@ vmxnet3_alloc_intr_resources(struct vmxnet3_adapter *adapter)
                        return;
 
                /* If we cannot allocate MSIx vectors use only one rx queue */
-               printk(KERN_INFO "Failed to enable MSI-X for %s, error %d."
-                      "#rx queues : 1, try MSI\n", adapter->netdev->name, err);
+               netdev_info(adapter->netdev,
+                           "Failed to enable MSI-X, error %d . Limiting #rx queues to 1, try MSI.\n",
+                           err);
 
                adapter->intr.type = VMXNET3_IT_MSI;
        }
@@ -2918,11 +2914,8 @@ vmxnet3_probe_device(struct pci_dev *pdev,
        printk(KERN_INFO "# of Tx queues : %d, # of Rx queues : %d\n",
               num_tx_queues, num_rx_queues);
 
-       if (!netdev) {
-               printk(KERN_ERR "Failed to alloc ethernet device for adapter "
-                       "%s\n", pci_name(pdev));
+       if (!netdev)
                return -ENOMEM;
-       }
 
        pci_set_drvdata(pdev, netdev);
        adapter = netdev_priv(netdev);
@@ -2959,8 +2952,6 @@ vmxnet3_probe_device(struct pci_dev *pdev,
 
        adapter->pm_conf = kmalloc(sizeof(struct Vmxnet3_PMConf), GFP_KERNEL);
        if (adapter->pm_conf == NULL) {
-               printk(KERN_ERR "Failed to allocate memory for %s\n",
-                       pci_name(pdev));
                err = -ENOMEM;
                goto err_alloc_pm;
        }
@@ -2969,8 +2960,6 @@ vmxnet3_probe_device(struct pci_dev *pdev,
 
        adapter->rss_conf = kmalloc(sizeof(struct UPT1_RSSConf), GFP_KERNEL);
        if (adapter->rss_conf == NULL) {
-               printk(KERN_ERR "Failed to allocate memory for %s\n",
-                      pci_name(pdev));
                err = -ENOMEM;
                goto err_alloc_rss;
        }
index 54f995f..09a5075 100644 (file)
@@ -325,10 +325,8 @@ static int __init c101_run(unsigned long irq, unsigned long winbase)
        }
 
        card = kzalloc(sizeof(card_t), GFP_KERNEL);
-       if (card == NULL) {
-               pr_err("unable to allocate memory\n");
+       if (card == NULL)
                return -ENOBUFS;
-       }
 
        card->dev = alloc_hdlcdev(card);
        if (!card->dev) {
index 058e169..fe8d060 100644 (file)
@@ -903,10 +903,8 @@ static int dscc4_found1(struct pci_dev *pdev, void __iomem *ioaddr)
        int i, ret = -ENOMEM;
 
        root = kcalloc(dev_per_card, sizeof(*root), GFP_KERNEL);
-       if (!root) {
-               pr_err("can't allocate data\n");
+       if (!root)
                goto err_out;
-       }
 
        for (i = 0; i < dev_per_card; i++) {
                root[i].dev = alloc_hdlcdev(root + i);
@@ -915,10 +913,8 @@ static int dscc4_found1(struct pci_dev *pdev, void __iomem *ioaddr)
        }
 
        ppriv = kzalloc(sizeof(*ppriv), GFP_KERNEL);
-       if (!ppriv) {
-               pr_err("can't allocate private data\n");
+       if (!ppriv)
                goto err_free_dev;
-       }
 
        ppriv->root = root;
        spin_lock_init(&ppriv->lock);
index eb20281..7c6cb4f 100644 (file)
@@ -1087,7 +1087,7 @@ static int fr_add_pvc(struct net_device *frad, unsigned int dlci, int type)
        }
 
        if (type == ARPHRD_ETHER)
-               random_ether_addr(dev->dev_addr);
+               eth_hw_addr_random(dev);
        else {
                *(__be16*)dev->dev_addr = htons(dlci);
                dlci_to_q922(dev->broadcast, dlci);
index 05c9b0b..3ab72b3 100644 (file)
@@ -101,7 +101,7 @@ static int raw_eth_ioctl(struct net_device *dev, struct ifreq *ifr)
                old_qlen = dev->tx_queue_len;
                ether_setup(dev);
                dev->tx_queue_len = old_qlen;
-               random_ether_addr(dev->dev_addr);
+               eth_hw_addr_random(dev);
                netif_dormant_off(dev);
                return 0;
        }
index b7f2358..76a8a4a 100644 (file)
@@ -497,7 +497,6 @@ int lmc_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) /*fold00*/
 
                     data = kmalloc(xc.len, GFP_KERNEL);
                     if (!data) {
-                            printk(KERN_WARNING "%s: Failed to allocate memory for copy\n", dev->name);
                             ret = -ENOMEM;
                             break;
                     }
index 5129ad5..315bf09 100644 (file)
@@ -358,10 +358,8 @@ static int __init n2_run(unsigned long io, unsigned long irq,
        }
 
        card = kzalloc(sizeof(card_t), GFP_KERNEL);
-       if (card == NULL) {
-               pr_err("unable to allocate memory\n");
+       if (card == NULL)
                return -ENOBUFS;
-       }
 
        card->ports[0].dev = alloc_hdlcdev(&card->ports[0]);
        card->ports[1].dev = alloc_hdlcdev(&card->ports[1]);
index c49c1b3..5fe246e 100644 (file)
@@ -320,7 +320,6 @@ static int __devinit pc300_pci_init_one(struct pci_dev *pdev,
 
        card = kzalloc(sizeof(card_t), GFP_KERNEL);
        if (card == NULL) {
-               pr_err("unable to allocate memory\n");
                pci_release_regions(pdev);
                pci_disable_device(pdev);
                return -ENOBUFS;
index 1ce2116..9659fca 100644 (file)
@@ -299,7 +299,6 @@ static int __devinit pci200_pci_init_one(struct pci_dev *pdev,
 
        card = kzalloc(sizeof(card_t), GFP_KERNEL);
        if (card == NULL) {
-               pr_err("unable to allocate memory\n");
                pci_release_regions(pdev);
                pci_disable_device(pdev);
                return -ENOBUFS;
index 44b7071..feb7541 100644 (file)
@@ -604,7 +604,6 @@ static int __devinit wanxl_pci_init_one(struct pci_dev *pdev,
        alloc_size = sizeof(card_t) + ports * sizeof(port_t);
        card = kzalloc(alloc_size, GFP_KERNEL);
        if (card == NULL) {
-               pr_err("%s: unable to allocate memory\n", pci_name(pdev));
                pci_release_regions(pdev);
                pci_disable_device(pdev);
                return -ENOBUFS;
index 8a10bb7..e862369 100644 (file)
@@ -786,10 +786,8 @@ static int __init init_x25_asy(void)
 
        x25_asy_devs = kcalloc(x25_asy_maxdev, sizeof(struct net_device *),
                                GFP_KERNEL);
-       if (!x25_asy_devs) {
-               pr_warn("Can't allocate x25_asy_ctrls[] array! Uaargh! (-> No X.25 available)\n");
+       if (!x25_asy_devs)
                return -ENOMEM;
-       }
 
        return tty_register_ldisc(N_X25, &x25_ldisc);
 }
index ee7ea57..8faa129 100644 (file)
@@ -140,23 +140,23 @@ static int ath_ahb_probe(struct platform_device *pdev)
 
        if (bcfg->devid >= AR5K_SREV_AR2315_R6) {
                /* Enable WMAC AHB arbitration */
-               reg = __raw_readl((void __iomem *) AR5K_AR2315_AHB_ARB_CTL);
+               reg = ioread32((void __iomem *) AR5K_AR2315_AHB_ARB_CTL);
                reg |= AR5K_AR2315_AHB_ARB_CTL_WLAN;
-               __raw_writel(reg, (void __iomem *) AR5K_AR2315_AHB_ARB_CTL);
+               iowrite32(reg, (void __iomem *) AR5K_AR2315_AHB_ARB_CTL);
 
                /* Enable global WMAC swapping */
-               reg = __raw_readl((void __iomem *) AR5K_AR2315_BYTESWAP);
+               reg = ioread32((void __iomem *) AR5K_AR2315_BYTESWAP);
                reg |= AR5K_AR2315_BYTESWAP_WMAC;
-               __raw_writel(reg, (void __iomem *) AR5K_AR2315_BYTESWAP);
+               iowrite32(reg, (void __iomem *) AR5K_AR2315_BYTESWAP);
        } else {
                /* Enable WMAC DMA access (assuming 5312 or 231x*/
                /* TODO: check other platforms */
-               reg = __raw_readl((void __iomem *) AR5K_AR5312_ENABLE);
+               reg = ioread32((void __iomem *) AR5K_AR5312_ENABLE);
                if (to_platform_device(ah->dev)->id == 0)
                        reg |= AR5K_AR5312_ENABLE_WLAN0;
                else
                        reg |= AR5K_AR5312_ENABLE_WLAN1;
-               __raw_writel(reg, (void __iomem *) AR5K_AR5312_ENABLE);
+               iowrite32(reg, (void __iomem *) AR5K_AR5312_ENABLE);
 
                /*
                 * On a dual-band AR5312, the multiband radio is only
@@ -203,17 +203,17 @@ static int ath_ahb_remove(struct platform_device *pdev)
 
        if (bcfg->devid >= AR5K_SREV_AR2315_R6) {
                /* Disable WMAC AHB arbitration */
-               reg = __raw_readl((void __iomem *) AR5K_AR2315_AHB_ARB_CTL);
+               reg = ioread32((void __iomem *) AR5K_AR2315_AHB_ARB_CTL);
                reg &= ~AR5K_AR2315_AHB_ARB_CTL_WLAN;
-               __raw_writel(reg, (void __iomem *) AR5K_AR2315_AHB_ARB_CTL);
+               iowrite32(reg, (void __iomem *) AR5K_AR2315_AHB_ARB_CTL);
        } else {
                /*Stop DMA access */
-               reg = __raw_readl((void __iomem *) AR5K_AR5312_ENABLE);
+               reg = ioread32((void __iomem *) AR5K_AR5312_ENABLE);
                if (to_platform_device(ah->dev)->id == 0)
                        reg &= ~AR5K_AR5312_ENABLE_WLAN0;
                else
                        reg &= ~AR5K_AR5312_ENABLE_WLAN1;
-               __raw_writel(reg, (void __iomem *) AR5K_AR5312_ENABLE);
+               iowrite32(reg, (void __iomem *) AR5K_AR5312_ENABLE);
        }
 
        ath5k_deinit_ah(ah);
index bf67416..35e9370 100644 (file)
@@ -257,7 +257,7 @@ ath5k_ani_raise_immunity(struct ath5k_hw *ah, struct ath5k_ani_state *as,
                                  "beacon RSSI high");
                /* only OFDM: beacon RSSI is high, we can disable ODFM weak
                 * signal detection */
-               if (ofdm_trigger && as->ofdm_weak_sig == true) {
+               if (ofdm_trigger && as->ofdm_weak_sig) {
                        ath5k_ani_set_ofdm_weak_signal_detection(ah, false);
                        ath5k_ani_set_spur_immunity_level(ah, 0);
                        return;
@@ -272,7 +272,7 @@ ath5k_ani_raise_immunity(struct ath5k_hw *ah, struct ath5k_ani_state *as,
                 * but can raise firstep level */
                ATH5K_DBG_UNLIMIT(ah, ATH5K_DEBUG_ANI,
                                  "beacon RSSI mid");
-               if (ofdm_trigger && as->ofdm_weak_sig == false)
+               if (ofdm_trigger && !as->ofdm_weak_sig)
                        ath5k_ani_set_ofdm_weak_signal_detection(ah, true);
                if (as->firstep_level < ATH5K_ANI_MAX_FIRSTEP_LVL)
                        ath5k_ani_set_firstep_level(ah, as->firstep_level + 1);
@@ -282,7 +282,7 @@ ath5k_ani_raise_immunity(struct ath5k_hw *ah, struct ath5k_ani_state *as,
                 * detect and zero firstep level to maximize CCK sensitivity */
                ATH5K_DBG_UNLIMIT(ah, ATH5K_DEBUG_ANI,
                                  "beacon RSSI low, 2GHz");
-               if (ofdm_trigger && as->ofdm_weak_sig == true)
+               if (ofdm_trigger && as->ofdm_weak_sig)
                        ath5k_ani_set_ofdm_weak_signal_detection(ah, false);
                if (as->firstep_level > 0)
                        ath5k_ani_set_firstep_level(ah, 0);
@@ -326,7 +326,7 @@ ath5k_ani_lower_immunity(struct ath5k_hw *ah, struct ath5k_ani_state *as)
                } else if (rssi > ATH5K_ANI_RSSI_THR_LOW) {
                        /* beacon RSSI is mid-range: turn on ODFM weak signal
                         * detection and next, lower firstep level */
-                       if (as->ofdm_weak_sig == false) {
+                       if (!as->ofdm_weak_sig) {
                                ath5k_ani_set_ofdm_weak_signal_detection(ah,
                                                                         true);
                                return;
index c2b2518..6640326 100644 (file)
@@ -1656,12 +1656,12 @@ static inline void __iomem *ath5k_ahb_reg(struct ath5k_hw *ah, u16 reg)
 
 static inline u32 ath5k_hw_reg_read(struct ath5k_hw *ah, u16 reg)
 {
-       return __raw_readl(ath5k_ahb_reg(ah, reg));
+       return ioread32(ath5k_ahb_reg(ah, reg));
 }
 
 static inline void ath5k_hw_reg_write(struct ath5k_hw *ah, u32 val, u16 reg)
 {
-       __raw_writel(val, ath5k_ahb_reg(ah, reg));
+       iowrite32(val, ath5k_ahb_reg(ah, reg));
 }
 
 #else
index d366dad..a339693 100644 (file)
@@ -80,7 +80,7 @@ static bool modparam_fastchanswitch;
 module_param_named(fastchanswitch, modparam_fastchanswitch, bool, S_IRUGO);
 MODULE_PARM_DESC(fastchanswitch, "Enable fast channel switching for AR2413/AR5413 radios.");
 
-static int ath5k_modparam_no_hw_rfkill_switch;
+static bool ath5k_modparam_no_hw_rfkill_switch;
 module_param_named(no_hw_rfkill_switch, ath5k_modparam_no_hw_rfkill_switch,
                                                                bool, S_IRUGO);
 MODULE_PARM_DESC(no_hw_rfkill_switch, "Ignore the GPIO RFKill switch state");
@@ -2442,6 +2442,9 @@ ath5k_init_ah(struct ath5k_hw *ah, const struct ath_bus_ops *bus_ops)
                BIT(NL80211_IFTYPE_ADHOC) |
                BIT(NL80211_IFTYPE_MESH_POINT);
 
+       /* SW support for IBSS_RSN is provided by mac80211 */
+       hw->wiphy->flags |= WIPHY_FLAG_IBSS_RSN;
+
        /* both antennas can be configured as RX or TX */
        hw->wiphy->available_antennas_tx = 0x3;
        hw->wiphy->available_antennas_rx = 0x3;
index 6ed4c07..af4c7ec 100644 (file)
@@ -483,6 +483,14 @@ ath5k_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
        if (ath5k_modparam_nohwcrypt)
                return -EOPNOTSUPP;
 
+       if (vif->type == NL80211_IFTYPE_ADHOC &&
+           (key->cipher == WLAN_CIPHER_SUITE_TKIP ||
+            key->cipher == WLAN_CIPHER_SUITE_CCMP) &&
+           !(key->flags & IEEE80211_KEY_FLAG_PAIRWISE)) {
+               /* don't program group keys when using IBSS_RSN */
+               return -EOPNOTSUPP;
+       }
+
        switch (key->cipher) {
        case WLAN_CIPHER_SUITE_WEP40:
        case WLAN_CIPHER_SUITE_WEP104:
index 250db40..200f165 100644 (file)
@@ -473,14 +473,14 @@ ath5k_hw_wisoc_reset(struct ath5k_hw *ah, u32 flags)
        }
 
        /* Put BB/MAC into reset */
-       regval = __raw_readl(reg);
-       __raw_writel(regval | val, reg);
-       regval = __raw_readl(reg);
+       regval = ioread32(reg);
+       iowrite32(regval | val, reg);
+       regval = ioread32(reg);
        usleep_range(100, 150);
 
        /* Bring BB/MAC out of reset */
-       __raw_writel(regval & ~val, reg);
-       regval = __raw_readl(reg);
+       iowrite32(regval & ~val, reg);
+       regval = ioread32(reg);
 
        /*
         * Reset configuration register (for hw byte-swap). Note that this
index 3d5f8be..d755a5e 100644 (file)
@@ -1,12 +1,29 @@
 config ATH6KL
-       tristate "Atheros ath6kl support"
+       tristate "Atheros mobile chipsets support"
+
+config ATH6KL_SDIO
+       tristate "Atheros ath6kl SDIO support"
+       depends on ATH6KL
        depends on MMC
        depends on CFG80211
        ---help---
          This module adds support for wireless adapters based on
-         Atheros AR6003 chipset running over SDIO. If you choose to
-         build it as a module, it will be called ath6kl. Pls note
-         that AR6002 and AR6001 are not supported by this driver.
+         Atheros AR6003 and AR6004 chipsets running over SDIO. If you
+         choose to build it as a module, it will be called ath6kl_sdio.
+         Please note that AR6002 and AR6001 are not supported by this
+         driver.
+
+config ATH6KL_USB
+       tristate "Atheros ath6kl USB support"
+       depends on ATH6KL
+       depends on USB
+       depends on CFG80211
+       depends on EXPERIMENTAL
+       ---help---
+         This module adds support for wireless adapters based on
+         Atheros AR6004 chipset running over USB. This is still under
+         implementation and it isn't functional. If you choose to
+         build it as a module, it will be called ath6kl_usb.
 
 config ATH6KL_DEBUG
        bool "Atheros ath6kl debugging"
index 7070693..9ba42fa 100644 (file)
 # Author(s): ="Atheros"
 #------------------------------------------------------------------------------
 
-obj-$(CONFIG_ATH6KL) := ath6kl.o
-ath6kl-y += debug.o
-ath6kl-y += hif.o
-ath6kl-y += htc.o
-ath6kl-y += bmi.o
-ath6kl-y += cfg80211.o
-ath6kl-y += init.o
-ath6kl-y += main.o
-ath6kl-y += txrx.o
-ath6kl-y += wmi.o
-ath6kl-y += sdio.o
-ath6kl-$(CONFIG_NL80211_TESTMODE) += testmode.o
+obj-$(CONFIG_ATH6KL) += ath6kl_core.o
+ath6kl_core-y += debug.o
+ath6kl_core-y += hif.o
+ath6kl_core-y += htc.o
+ath6kl_core-y += bmi.o
+ath6kl_core-y += cfg80211.o
+ath6kl_core-y += init.o
+ath6kl_core-y += main.o
+ath6kl_core-y += txrx.o
+ath6kl_core-y += wmi.o
+ath6kl_core-y += core.o
+ath6kl_core-$(CONFIG_NL80211_TESTMODE) += testmode.o
 
-ccflags-y += -D__CHECK_ENDIAN__
+obj-$(CONFIG_ATH6KL_SDIO) += ath6kl_sdio.o
+ath6kl_sdio-y += sdio.o
+
+obj-$(CONFIG_ATH6KL_USB) += ath6kl_usb.o
+ath6kl_usb-y += usb.o
index bce3575..aef00d5 100644 (file)
@@ -57,8 +57,14 @@ int ath6kl_bmi_get_target_info(struct ath6kl *ar,
                return ret;
        }
 
-       ret = ath6kl_hif_bmi_read(ar, (u8 *)&targ_info->version,
-                                 sizeof(targ_info->version));
+       if (ar->hif_type == ATH6KL_HIF_TYPE_USB) {
+               ret = ath6kl_hif_bmi_read(ar, (u8 *)targ_info,
+                                         sizeof(*targ_info));
+       } else {
+               ret = ath6kl_hif_bmi_read(ar, (u8 *)&targ_info->version,
+                               sizeof(targ_info->version));
+       }
+
        if (ret) {
                ath6kl_err("Unable to recv target info: %d\n", ret);
                return ret;
index 6c59a21..5370333 100644 (file)
@@ -15,6 +15,8 @@
  */
 
 #include <linux/moduleparam.h>
+#include <linux/inetdevice.h>
+#include <linux/export.h>
 
 #include "core.h"
 #include "cfg80211.h"
 #include "hif-ops.h"
 #include "testmode.h"
 
-static unsigned int ath6kl_p2p;
-
-module_param(ath6kl_p2p, uint, 0644);
-
 #define RATETAB_ENT(_rate, _rateid, _flags) {   \
        .bitrate    = (_rate),                  \
        .flags      = (_flags),                 \
@@ -196,7 +194,7 @@ static int ath6kl_set_auth_type(struct ath6kl_vif *vif,
                break;
 
        default:
-               ath6kl_err("%s: 0x%x not spported\n", __func__, auth_type);
+               ath6kl_err("%s: 0x%x not supported\n", __func__, auth_type);
                return -ENOTSUPP;
        }
 
@@ -461,13 +459,13 @@ static int ath6kl_cfg80211_connect(struct wiphy *wiphy, struct net_device *dev,
                }
        }
 
-       if (sme->ie && (sme->ie_len > 0)) {
-               status = ath6kl_set_assoc_req_ies(vif, sme->ie, sme->ie_len);
-               if (status) {
-                       up(&ar->sem);
-                       return status;
-               }
-       } else
+       status = ath6kl_set_assoc_req_ies(vif, sme->ie, sme->ie_len);
+       if (status) {
+               up(&ar->sem);
+               return status;
+       }
+
+       if (sme->ie == NULL || sme->ie_len == 0)
                ar->connect_ctrl_flags &= ~CONNECT_WPS_FLAG;
 
        if (test_bit(CONNECTED, &vif->flags) &&
@@ -523,8 +521,7 @@ static int ath6kl_cfg80211_connect(struct wiphy *wiphy, struct net_device *dev,
            (vif->prwise_crypto == WEP_CRYPT)) {
                struct ath6kl_key *key = NULL;
 
-               if (sme->key_idx < WMI_MIN_KEY_INDEX ||
-                   sme->key_idx > WMI_MAX_KEY_INDEX) {
+               if (sme->key_idx > WMI_MAX_KEY_INDEX) {
                        ath6kl_err("key index %d out of bounds\n",
                                   sme->key_idx);
                        up(&ar->sem);
@@ -605,11 +602,13 @@ static int ath6kl_cfg80211_connect(struct wiphy *wiphy, struct net_device *dev,
        return 0;
 }
 
-static int ath6kl_add_bss_if_needed(struct ath6kl_vif *vif,
-                                   enum network_type nw_type,
-                                   const u8 *bssid,
-                                   struct ieee80211_channel *chan,
-                                   const u8 *beacon_ie, size_t beacon_ie_len)
+static struct cfg80211_bss *
+ath6kl_add_bss_if_needed(struct ath6kl_vif *vif,
+                        enum network_type nw_type,
+                        const u8 *bssid,
+                        struct ieee80211_channel *chan,
+                        const u8 *beacon_ie,
+                        size_t beacon_ie_len)
 {
        struct ath6kl *ar = vif->ar;
        struct cfg80211_bss *bss;
@@ -638,7 +637,7 @@ static int ath6kl_add_bss_if_needed(struct ath6kl_vif *vif,
                 */
                ie = kmalloc(2 + vif->ssid_len + beacon_ie_len, GFP_KERNEL);
                if (ie == NULL)
-                       return -ENOMEM;
+                       return NULL;
                ie[0] = WLAN_EID_SSID;
                ie[1] = vif->ssid_len;
                memcpy(ie + 2, vif->ssid, vif->ssid_len);
@@ -652,15 +651,9 @@ static int ath6kl_add_bss_if_needed(struct ath6kl_vif *vif,
                                   "cfg80211\n", bssid);
                kfree(ie);
        } else
-               ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "cfg80211 already has a bss "
-                          "entry\n");
-
-       if (bss == NULL)
-               return -ENOMEM;
+               ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "cfg80211 already has a bss\n");
 
-       cfg80211_put_bss(bss);
-
-       return 0;
+       return bss;
 }
 
 void ath6kl_cfg80211_connect_event(struct ath6kl_vif *vif, u16 channel,
@@ -672,6 +665,7 @@ void ath6kl_cfg80211_connect_event(struct ath6kl_vif *vif, u16 channel,
 {
        struct ieee80211_channel *chan;
        struct ath6kl *ar = vif->ar;
+       struct cfg80211_bss *bss;
 
        /* capinfo + listen interval */
        u8 assoc_req_ie_offset = sizeof(u16) + sizeof(u16);
@@ -712,8 +706,9 @@ void ath6kl_cfg80211_connect_event(struct ath6kl_vif *vif, u16 channel,
 
        chan = ieee80211_get_channel(ar->wiphy, (int) channel);
 
-       if (ath6kl_add_bss_if_needed(vif, nw_type, bssid, chan, assoc_info,
-                                    beacon_ie_len) < 0) {
+       bss = ath6kl_add_bss_if_needed(vif, nw_type, bssid, chan,
+                                      assoc_info, beacon_ie_len);
+       if (!bss) {
                ath6kl_err("could not add cfg80211 bss entry\n");
                return;
        }
@@ -722,6 +717,7 @@ void ath6kl_cfg80211_connect_event(struct ath6kl_vif *vif, u16 channel,
                ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "ad-hoc %s selected\n",
                           nw_type & ADHOC_CREATOR ? "creator" : "joiner");
                cfg80211_ibss_joined(vif->ndev, bssid, GFP_KERNEL);
+               cfg80211_put_bss(bss);
                return;
        }
 
@@ -732,11 +728,11 @@ void ath6kl_cfg80211_connect_event(struct ath6kl_vif *vif, u16 channel,
                                        assoc_req_ie, assoc_req_len,
                                        assoc_resp_ie, assoc_resp_len,
                                        WLAN_STATUS_SUCCESS, GFP_KERNEL);
+               cfg80211_put_bss(bss);
        } else if (vif->sme_state == SME_CONNECTED) {
                /* inform roam event to cfg80211 */
-               cfg80211_roamed(vif->ndev, chan, bssid,
-                               assoc_req_ie, assoc_req_len,
-                               assoc_resp_ie, assoc_resp_len, GFP_KERNEL);
+               cfg80211_roamed_bss(vif->ndev, bss, assoc_req_ie, assoc_req_len,
+                                   assoc_resp_ie, assoc_resp_len, GFP_KERNEL);
        }
 }
 
@@ -984,6 +980,7 @@ static int ath6kl_cfg80211_add_key(struct wiphy *wiphy, struct net_device *ndev,
        struct ath6kl *ar = ath6kl_priv(ndev);
        struct ath6kl_vif *vif = netdev_priv(ndev);
        struct ath6kl_key *key = NULL;
+       int seq_len;
        u8 key_usage;
        u8 key_type;
 
@@ -997,7 +994,7 @@ static int ath6kl_cfg80211_add_key(struct wiphy *wiphy, struct net_device *ndev,
                                              params->key);
        }
 
-       if (key_index < WMI_MIN_KEY_INDEX || key_index > WMI_MAX_KEY_INDEX) {
+       if (key_index > WMI_MAX_KEY_INDEX) {
                ath6kl_dbg(ATH6KL_DBG_WLAN_CFG,
                           "%s: key index %d out of bounds\n", __func__,
                           key_index);
@@ -1012,23 +1009,21 @@ static int ath6kl_cfg80211_add_key(struct wiphy *wiphy, struct net_device *ndev,
        else
                key_usage = GROUP_USAGE;
 
-       if (params) {
-               int seq_len = params->seq_len;
-               if (params->cipher == WLAN_CIPHER_SUITE_SMS4 &&
-                   seq_len > ATH6KL_KEY_SEQ_LEN) {
-                       /* Only first half of the WPI PN is configured */
-                       seq_len = ATH6KL_KEY_SEQ_LEN;
-               }
-               if (params->key_len > WLAN_MAX_KEY_LEN ||
-                   seq_len > sizeof(key->seq))
-                       return -EINVAL;
-
-               key->key_len = params->key_len;
-               memcpy(key->key, params->key, key->key_len);
-               key->seq_len = seq_len;
-               memcpy(key->seq, params->seq, key->seq_len);
-               key->cipher = params->cipher;
+       seq_len = params->seq_len;
+       if (params->cipher == WLAN_CIPHER_SUITE_SMS4 &&
+           seq_len > ATH6KL_KEY_SEQ_LEN) {
+               /* Only first half of the WPI PN is configured */
+               seq_len = ATH6KL_KEY_SEQ_LEN;
        }
+       if (params->key_len > WLAN_MAX_KEY_LEN ||
+           seq_len > sizeof(key->seq))
+               return -EINVAL;
+
+       key->key_len = params->key_len;
+       memcpy(key->key, params->key, key->key_len);
+       key->seq_len = seq_len;
+       memcpy(key->seq, params->seq, key->seq_len);
+       key->cipher = params->cipher;
 
        switch (key->cipher) {
        case WLAN_CIPHER_SUITE_WEP40:
@@ -1115,7 +1110,7 @@ static int ath6kl_cfg80211_del_key(struct wiphy *wiphy, struct net_device *ndev,
        if (!ath6kl_cfg80211_ready(vif))
                return -EIO;
 
-       if (key_index < WMI_MIN_KEY_INDEX || key_index > WMI_MAX_KEY_INDEX) {
+       if (key_index > WMI_MAX_KEY_INDEX) {
                ath6kl_dbg(ATH6KL_DBG_WLAN_CFG,
                           "%s: key index %d out of bounds\n", __func__,
                           key_index);
@@ -1148,7 +1143,7 @@ static int ath6kl_cfg80211_get_key(struct wiphy *wiphy, struct net_device *ndev,
        if (!ath6kl_cfg80211_ready(vif))
                return -EIO;
 
-       if (key_index < WMI_MIN_KEY_INDEX || key_index > WMI_MAX_KEY_INDEX) {
+       if (key_index > WMI_MAX_KEY_INDEX) {
                ath6kl_dbg(ATH6KL_DBG_WLAN_CFG,
                           "%s: key index %d out of bounds\n", __func__,
                           key_index);
@@ -1184,7 +1179,7 @@ static int ath6kl_cfg80211_set_default_key(struct wiphy *wiphy,
        if (!ath6kl_cfg80211_ready(vif))
                return -EIO;
 
-       if (key_index < WMI_MIN_KEY_INDEX || key_index > WMI_MAX_KEY_INDEX) {
+       if (key_index > WMI_MAX_KEY_INDEX) {
                ath6kl_dbg(ATH6KL_DBG_WLAN_CFG,
                           "%s: key index %d out of bounds\n",
                           __func__, key_index);
@@ -1403,7 +1398,7 @@ static int ath6kl_cfg80211_del_iface(struct wiphy *wiphy,
 
        ath6kl_cleanup_vif(vif, test_bit(WMI_READY, &ar->flag));
 
-       ath6kl_deinit_if_data(vif);
+       ath6kl_cfg80211_vif_cleanup(vif);
 
        return 0;
 }
@@ -1728,29 +1723,14 @@ static int ath6kl_flush_pmksa(struct wiphy *wiphy, struct net_device *netdev)
        return 0;
 }
 
-static int ath6kl_wow_suspend(struct ath6kl *ar, struct cfg80211_wowlan *wow)
+static int ath6kl_wow_usr(struct ath6kl *ar, struct ath6kl_vif *vif,
+                         struct cfg80211_wowlan *wow, u32 *filter)
 {
-       struct ath6kl_vif *vif;
-       int ret, pos, left;
-       u32 filter = 0;
-       u16 i;
+       int ret, pos;
        u8 mask[WOW_MASK_SIZE];
+       u16 i;
 
-       vif = ath6kl_vif_first(ar);
-       if (!vif)
-               return -EIO;
-
-       if (!ath6kl_cfg80211_ready(vif))
-               return -EIO;
-
-       if (!test_bit(CONNECTED, &vif->flags))
-               return -EINVAL;
-
-       /* Clear existing WOW patterns */
-       for (i = 0; i < WOW_MAX_FILTERS_PER_LIST; i++)
-               ath6kl_wmi_del_wow_pattern_cmd(ar->wmi, vif->fw_vif_idx,
-                                              WOW_LIST_ID, i);
-       /* Configure new WOW patterns */
+       /* Configure the patterns that we received from the user. */
        for (i = 0; i < wow->n_patterns; i++) {
 
                /*
@@ -1773,29 +1753,221 @@ static int ath6kl_wow_suspend(struct ath6kl *ar, struct cfg80211_wowlan *wow)
                 * matched from the first byte of received pkt in the firmware.
                 */
                ret = ath6kl_wmi_add_wow_pattern_cmd(ar->wmi,
-                                       vif->fw_vif_idx, WOW_LIST_ID,
-                                       wow->patterns[i].pattern_len,
-                                       0 /* pattern offset */,
-                                       wow->patterns[i].pattern, mask);
+                               vif->fw_vif_idx, WOW_LIST_ID,
+                               wow->patterns[i].pattern_len,
+                               0 /* pattern offset */,
+                               wow->patterns[i].pattern, mask);
                if (ret)
                        return ret;
        }
 
        if (wow->disconnect)
-               filter |= WOW_FILTER_OPTION_NWK_DISASSOC;
+               *filter |= WOW_FILTER_OPTION_NWK_DISASSOC;
 
        if (wow->magic_pkt)
-               filter |= WOW_FILTER_OPTION_MAGIC_PACKET;
+               *filter |= WOW_FILTER_OPTION_MAGIC_PACKET;
 
        if (wow->gtk_rekey_failure)
-               filter |= WOW_FILTER_OPTION_GTK_ERROR;
+               *filter |= WOW_FILTER_OPTION_GTK_ERROR;
 
        if (wow->eap_identity_req)
-               filter |= WOW_FILTER_OPTION_EAP_REQ;
+               *filter |= WOW_FILTER_OPTION_EAP_REQ;
 
        if (wow->four_way_handshake)
-               filter |= WOW_FILTER_OPTION_8021X_4WAYHS;
+               *filter |= WOW_FILTER_OPTION_8021X_4WAYHS;
 
+       return 0;
+}
+
+static int ath6kl_wow_ap(struct ath6kl *ar, struct ath6kl_vif *vif)
+{
+       static const u8 unicst_pattern[] = { 0x00, 0x00, 0x00,
+               0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+               0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+               0x00, 0x08 };
+       static const u8 unicst_mask[] = { 0x01, 0x00, 0x00,
+               0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+               0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+               0x00, 0x7f };
+       u8 unicst_offset = 0;
+       static const u8 arp_pattern[] = { 0x08, 0x06 };
+       static const u8 arp_mask[] = { 0xff, 0xff };
+       u8 arp_offset = 20;
+       static const u8 discvr_pattern[] = { 0xe0, 0x00, 0x00, 0xf8 };
+       static const u8 discvr_mask[] = { 0xf0, 0x00, 0x00, 0xf8 };
+       u8 discvr_offset = 38;
+       static const u8 dhcp_pattern[] = { 0xff, 0xff, 0xff, 0xff,
+               0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+               0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00,
+               0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+               0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+               0x00, 0x00, 0x00, 0x00, 0x00, 0x43 /* port 67 */ };
+       static const u8 dhcp_mask[] = { 0xff, 0xff, 0xff, 0xff,
+               0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+               0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff,
+               0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+               0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+               0x00, 0x00, 0x00, 0x00, 0xff, 0xff /* port 67 */ };
+       u8 dhcp_offset = 0;
+       int ret;
+
+       /* Setup unicast IP, EAPOL-like and ARP pkt pattern */
+       ret = ath6kl_wmi_add_wow_pattern_cmd(ar->wmi,
+                       vif->fw_vif_idx, WOW_LIST_ID,
+                       sizeof(unicst_pattern), unicst_offset,
+                       unicst_pattern, unicst_mask);
+       if (ret) {
+               ath6kl_err("failed to add WOW unicast IP pattern\n");
+               return ret;
+       }
+
+       /* Setup all ARP pkt pattern */
+       ret = ath6kl_wmi_add_wow_pattern_cmd(ar->wmi,
+                       vif->fw_vif_idx, WOW_LIST_ID,
+                       sizeof(arp_pattern), arp_offset,
+                       arp_pattern, arp_mask);
+       if (ret) {
+               ath6kl_err("failed to add WOW ARP pattern\n");
+               return ret;
+       }
+
+       /*
+        * Setup multicast pattern for mDNS 224.0.0.251,
+        * SSDP 239.255.255.250 and LLMNR  224.0.0.252
+        */
+       ret = ath6kl_wmi_add_wow_pattern_cmd(ar->wmi,
+                       vif->fw_vif_idx, WOW_LIST_ID,
+                       sizeof(discvr_pattern), discvr_offset,
+                       discvr_pattern, discvr_mask);
+       if (ret) {
+               ath6kl_err("failed to add WOW mDNS/SSDP/LLMNR pattern\n");
+               return ret;
+       }
+
+       /* Setup all DHCP broadcast pkt pattern */
+       ret = ath6kl_wmi_add_wow_pattern_cmd(ar->wmi,
+                       vif->fw_vif_idx, WOW_LIST_ID,
+                       sizeof(dhcp_pattern), dhcp_offset,
+                       dhcp_pattern, dhcp_mask);
+       if (ret) {
+               ath6kl_err("failed to add WOW DHCP broadcast pattern\n");
+               return ret;
+       }
+
+       return 0;
+}
+
+static int ath6kl_wow_sta(struct ath6kl *ar, struct ath6kl_vif *vif)
+{
+       struct net_device *ndev = vif->ndev;
+       static const u8 discvr_pattern[] = { 0xe0, 0x00, 0x00, 0xf8 };
+       static const u8 discvr_mask[] = { 0xf0, 0x00, 0x00, 0xf8 };
+       u8 discvr_offset = 38;
+       u8 mac_mask[ETH_ALEN];
+       int ret;
+
+       /* Setup unicast pkt pattern */
+       memset(mac_mask, 0xff, ETH_ALEN);
+       ret = ath6kl_wmi_add_wow_pattern_cmd(ar->wmi,
+                               vif->fw_vif_idx, WOW_LIST_ID,
+                               ETH_ALEN, 0, ndev->dev_addr,
+                               mac_mask);
+       if (ret) {
+               ath6kl_err("failed to add WOW unicast pattern\n");
+               return ret;
+       }
+
+       /*
+        * Setup multicast pattern for mDNS 224.0.0.251,
+        * SSDP 239.255.255.250 and LLMNR 224.0.0.252
+        */
+       if ((ndev->flags & IFF_ALLMULTI) ||
+           (ndev->flags & IFF_MULTICAST && netdev_mc_count(ndev) > 0)) {
+               ret = ath6kl_wmi_add_wow_pattern_cmd(ar->wmi,
+                               vif->fw_vif_idx, WOW_LIST_ID,
+                               sizeof(discvr_pattern), discvr_offset,
+                               discvr_pattern, discvr_mask);
+               if (ret) {
+                       ath6kl_err("failed to add WOW mDNS/SSDP/LLMNR "
+                                  "pattern\n");
+                       return ret;
+               }
+       }
+
+       return 0;
+}
+
+static int ath6kl_wow_suspend(struct ath6kl *ar, struct cfg80211_wowlan *wow)
+{
+       struct in_device *in_dev;
+       struct in_ifaddr *ifa;
+       struct ath6kl_vif *vif;
+       int ret, left;
+       u32 filter = 0;
+       u16 i;
+       u8 index = 0;
+       __be32 ips[MAX_IP_ADDRS];
+
+       vif = ath6kl_vif_first(ar);
+       if (!vif)
+               return -EIO;
+
+       if (!ath6kl_cfg80211_ready(vif))
+               return -EIO;
+
+       if (!test_bit(CONNECTED, &vif->flags))
+               return -ENOTCONN;
+
+       if (wow && (wow->n_patterns > WOW_MAX_FILTERS_PER_LIST))
+               return -EINVAL;
+
+       /* Clear existing WOW patterns */
+       for (i = 0; i < WOW_MAX_FILTERS_PER_LIST; i++)
+               ath6kl_wmi_del_wow_pattern_cmd(ar->wmi, vif->fw_vif_idx,
+                                              WOW_LIST_ID, i);
+
+       /*
+        * Skip the default WOW pattern configuration
+        * if the driver receives any WOW patterns from
+        * the user.
+        */
+       if (wow)
+               ret = ath6kl_wow_usr(ar, vif, wow, &filter);
+       else if (vif->nw_type == AP_NETWORK)
+               ret = ath6kl_wow_ap(ar, vif);
+       else
+               ret = ath6kl_wow_sta(ar, vif);
+
+       if (ret)
+               return ret;
+
+       /* Setup own IP addr for ARP agent. */
+       in_dev = __in_dev_get_rtnl(vif->ndev);
+       if (!in_dev)
+               goto skip_arp;
+
+       ifa = in_dev->ifa_list;
+       memset(&ips, 0, sizeof(ips));
+
+       /* Configure IP addr only if IP address count < MAX_IP_ADDRS */
+       while (index < MAX_IP_ADDRS && ifa) {
+               ips[index] = ifa->ifa_local;
+               ifa = ifa->ifa_next;
+               index++;
+       }
+
+       if (ifa) {
+               ath6kl_err("total IP addr count is exceeding fw limit\n");
+               return -EINVAL;
+       }
+
+       ret = ath6kl_wmi_set_ip_cmd(ar->wmi, vif->fw_vif_idx, ips[0], ips[1]);
+       if (ret) {
+               ath6kl_err("fail to setup ip for arp agent\n");
+               return ret;
+       }
+
+skip_arp:
        ret = ath6kl_wmi_set_wow_mode_cmd(ar->wmi, vif->fw_vif_idx,
                                          ATH6KL_WOW_MODE_ENABLE,
                                          filter,
@@ -1803,11 +1975,26 @@ static int ath6kl_wow_suspend(struct ath6kl *ar, struct cfg80211_wowlan *wow)
        if (ret)
                return ret;
 
+       clear_bit(HOST_SLEEP_MODE_CMD_PROCESSED, &vif->flags);
+
        ret = ath6kl_wmi_set_host_sleep_mode_cmd(ar->wmi, vif->fw_vif_idx,
                                                 ATH6KL_HOST_MODE_ASLEEP);
        if (ret)
                return ret;
 
+       left = wait_event_interruptible_timeout(ar->event_wq,
+                       test_bit(HOST_SLEEP_MODE_CMD_PROCESSED, &vif->flags),
+                       WMI_TIMEOUT);
+       if (left == 0) {
+               ath6kl_warn("timeout, didn't get host sleep cmd "
+                           "processed event\n");
+               ret = -ETIMEDOUT;
+       } else if (left < 0) {
+               ath6kl_warn("error while waiting for host sleep cmd "
+                           "processed event %d\n", left);
+               ret = left;
+       }
+
        if (ar->tx_pending[ar->ctrl_ep]) {
                left = wait_event_interruptible_timeout(ar->event_wq,
                                ar->tx_pending[ar->ctrl_ep] == 0, WMI_TIMEOUT);
@@ -1911,6 +2098,7 @@ int ath6kl_cfg80211_suspend(struct ath6kl *ar,
 
        return 0;
 }
+EXPORT_SYMBOL(ath6kl_cfg80211_suspend);
 
 int ath6kl_cfg80211_resume(struct ath6kl *ar)
 {
@@ -1962,6 +2150,7 @@ int ath6kl_cfg80211_resume(struct ath6kl *ar)
 
        return 0;
 }
+EXPORT_SYMBOL(ath6kl_cfg80211_resume);
 
 #ifdef CONFIG_PM
 
@@ -2014,7 +2203,18 @@ static int ath6kl_set_channel(struct wiphy *wiphy, struct net_device *dev,
                              struct ieee80211_channel *chan,
                              enum nl80211_channel_type channel_type)
 {
-       struct ath6kl_vif *vif = netdev_priv(dev);
+       struct ath6kl_vif *vif;
+
+       /*
+        * 'dev' could be NULL if a channel change is required for the hardware
+        * device itself, instead of a particular VIF.
+        *
+        * FIXME: To be handled properly when monitor mode is supported.
+        */
+       if (!dev)
+               return -EBUSY;
+
+       vif = netdev_priv(dev);
 
        if (!ath6kl_cfg80211_ready(vif))
                return -EIO;
@@ -2069,25 +2269,11 @@ static int ath6kl_set_ap_probe_resp_ies(struct ath6kl_vif *vif,
        return ret;
 }
 
-static int ath6kl_ap_beacon(struct wiphy *wiphy, struct net_device *dev,
-                           struct beacon_parameters *info, bool add)
+static int ath6kl_set_ies(struct ath6kl_vif *vif,
+                         struct cfg80211_beacon_data *info)
 {
-       struct ath6kl *ar = ath6kl_priv(dev);
-       struct ath6kl_vif *vif = netdev_priv(dev);
-       struct ieee80211_mgmt *mgmt;
-       u8 *ies;
-       int ies_len;
-       struct wmi_connect_cmd p;
+       struct ath6kl *ar = vif->ar;
        int res;
-       int i, ret;
-
-       ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "%s: add=%d\n", __func__, add);
-
-       if (!ath6kl_cfg80211_ready(vif))
-               return -EIO;
-
-       if (vif->next_mode != AP_NETWORK)
-               return -EOPNOTSUPP;
 
        if (info->beacon_ies) {
                res = ath6kl_wmi_set_appie_cmd(ar->wmi, vif->fw_vif_idx,
@@ -2097,12 +2283,14 @@ static int ath6kl_ap_beacon(struct wiphy *wiphy, struct net_device *dev,
                if (res)
                        return res;
        }
+
        if (info->proberesp_ies) {
                res = ath6kl_set_ap_probe_resp_ies(vif, info->proberesp_ies,
                                                   info->proberesp_ies_len);
                if (res)
                        return res;
        }
+
        if (info->assocresp_ies) {
                res = ath6kl_wmi_set_appie_cmd(ar->wmi, vif->fw_vif_idx,
                                               WMI_FRAME_ASSOC_RESP,
@@ -2112,8 +2300,30 @@ static int ath6kl_ap_beacon(struct wiphy *wiphy, struct net_device *dev,
                        return res;
        }
 
-       if (!add)
-               return 0;
+       return 0;
+}
+
+static int ath6kl_start_ap(struct wiphy *wiphy, struct net_device *dev,
+                          struct cfg80211_ap_settings *info)
+{
+       struct ath6kl *ar = ath6kl_priv(dev);
+       struct ath6kl_vif *vif = netdev_priv(dev);
+       struct ieee80211_mgmt *mgmt;
+       u8 *ies;
+       int ies_len;
+       struct wmi_connect_cmd p;
+       int res;
+       int i, ret;
+
+       ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "%s:\n", __func__);
+
+       if (!ath6kl_cfg80211_ready(vif))
+               return -EIO;
+
+       if (vif->next_mode != AP_NETWORK)
+               return -EOPNOTSUPP;
+
+       res = ath6kl_set_ies(vif, &info->beacon);
 
        ar->ap_mode_bkey.valid = false;
 
@@ -2122,13 +2332,13 @@ static int ath6kl_ap_beacon(struct wiphy *wiphy, struct net_device *dev,
         * info->dtim_period
         */
 
-       if (info->head == NULL)
+       if (info->beacon.head == NULL)
                return -EINVAL;
-       mgmt = (struct ieee80211_mgmt *) info->head;
+       mgmt = (struct ieee80211_mgmt *) info->beacon.head;
        ies = mgmt->u.beacon.variable;
-       if (ies > info->head + info->head_len)
+       if (ies > info->beacon.head + info->beacon.head_len)
                return -EINVAL;
-       ies_len = info->head + info->head_len - ies;
+       ies_len = info->beacon.head + info->beacon.head_len - ies;
 
        if (info->ssid == NULL)
                return -EINVAL;
@@ -2214,6 +2424,11 @@ static int ath6kl_ap_beacon(struct wiphy *wiphy, struct net_device *dev,
        p.dot11_auth_mode = vif->dot11_auth_mode;
        p.ch = cpu_to_le16(vif->next_chan);
 
+       /* Enable uAPSD support by default */
+       res = ath6kl_wmi_ap_set_apsd(ar->wmi, vif->fw_vif_idx, true);
+       if (res < 0)
+               return res;
+
        if (vif->wdev.iftype == NL80211_IFTYPE_P2P_GO) {
                p.nw_subtype = SUBTYPE_P2PGO;
        } else {
@@ -2231,19 +2446,21 @@ static int ath6kl_ap_beacon(struct wiphy *wiphy, struct net_device *dev,
        return 0;
 }
 
-static int ath6kl_add_beacon(struct wiphy *wiphy, struct net_device *dev,
-                            struct beacon_parameters *info)
+static int ath6kl_change_beacon(struct wiphy *wiphy, struct net_device *dev,
+                               struct cfg80211_beacon_data *beacon)
 {
-       return ath6kl_ap_beacon(wiphy, dev, info, true);
-}
+       struct ath6kl_vif *vif = netdev_priv(dev);
 
-static int ath6kl_set_beacon(struct wiphy *wiphy, struct net_device *dev,
-                            struct beacon_parameters *info)
-{
-       return ath6kl_ap_beacon(wiphy, dev, info, false);
+       if (!ath6kl_cfg80211_ready(vif))
+               return -EIO;
+
+       if (vif->next_mode != AP_NETWORK)
+               return -EOPNOTSUPP;
+
+       return ath6kl_set_ies(vif, beacon);
 }
 
-static int ath6kl_del_beacon(struct wiphy *wiphy, struct net_device *dev)
+static int ath6kl_stop_ap(struct wiphy *wiphy, struct net_device *dev)
 {
        struct ath6kl *ar = ath6kl_priv(dev);
        struct ath6kl_vif *vif = netdev_priv(dev);
@@ -2259,6 +2476,19 @@ static int ath6kl_del_beacon(struct wiphy *wiphy, struct net_device *dev)
        return 0;
 }
 
+static const u8 bcast_addr[ETH_ALEN] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
+
+static int ath6kl_del_station(struct wiphy *wiphy, struct net_device *dev,
+                             u8 *mac)
+{
+       struct ath6kl *ar = ath6kl_priv(dev);
+       struct ath6kl_vif *vif = netdev_priv(dev);
+       const u8 *addr = mac ? mac : bcast_addr;
+
+       return ath6kl_wmi_ap_set_mlme(ar->wmi, vif->fw_vif_idx, WMI_AP_DEAUTH,
+                                     addr, WLAN_REASON_PREV_AUTH_NOT_VALID);
+}
+
 static int ath6kl_change_station(struct wiphy *wiphy, struct net_device *dev,
                                 u8 *mac, struct station_parameters *params)
 {
@@ -2518,6 +2748,12 @@ ath6kl_mgmt_stypes[NUM_NL80211_IFTYPES] = {
                .rx = BIT(IEEE80211_STYPE_ACTION >> 4) |
                BIT(IEEE80211_STYPE_PROBE_REQ >> 4)
        },
+       [NL80211_IFTYPE_AP] = {
+               .tx = BIT(IEEE80211_STYPE_ACTION >> 4) |
+               BIT(IEEE80211_STYPE_PROBE_RESP >> 4),
+               .rx = BIT(IEEE80211_STYPE_ACTION >> 4) |
+               BIT(IEEE80211_STYPE_PROBE_REQ >> 4)
+       },
        [NL80211_IFTYPE_P2P_CLIENT] = {
                .tx = BIT(IEEE80211_STYPE_ACTION >> 4) |
                BIT(IEEE80211_STYPE_PROBE_RESP >> 4),
@@ -2559,9 +2795,10 @@ static struct cfg80211_ops ath6kl_cfg80211_ops = {
        .resume = __ath6kl_cfg80211_resume,
 #endif
        .set_channel = ath6kl_set_channel,
-       .add_beacon = ath6kl_add_beacon,
-       .set_beacon = ath6kl_set_beacon,
-       .del_beacon = ath6kl_del_beacon,
+       .start_ap = ath6kl_start_ap,
+       .change_beacon = ath6kl_change_beacon,
+       .stop_ap = ath6kl_stop_ap,
+       .del_station = ath6kl_del_station,
        .change_station = ath6kl_change_station,
        .remain_on_channel = ath6kl_remain_on_channel,
        .cancel_remain_on_channel = ath6kl_cancel_remain_on_channel,
@@ -2629,122 +2866,9 @@ void ath6kl_cfg80211_stop_all(struct ath6kl *ar)
                ath6kl_cfg80211_stop(vif);
 }
 
-struct ath6kl *ath6kl_core_alloc(struct device *dev)
-{
-       struct ath6kl *ar;
-       struct wiphy *wiphy;
-       u8 ctr;
-
-       /* create a new wiphy for use with cfg80211 */
-       wiphy = wiphy_new(&ath6kl_cfg80211_ops, sizeof(struct ath6kl));
-
-       if (!wiphy) {
-               ath6kl_err("couldn't allocate wiphy device\n");
-               return NULL;
-       }
-
-       ar = wiphy_priv(wiphy);
-       ar->p2p = !!ath6kl_p2p;
-       ar->wiphy = wiphy;
-       ar->dev = dev;
-
-       ar->vif_max = 1;
-
-       ar->max_norm_iface = 1;
-
-       spin_lock_init(&ar->lock);
-       spin_lock_init(&ar->mcastpsq_lock);
-       spin_lock_init(&ar->list_lock);
-
-       init_waitqueue_head(&ar->event_wq);
-       sema_init(&ar->sem, 1);
-
-       INIT_LIST_HEAD(&ar->amsdu_rx_buffer_queue);
-       INIT_LIST_HEAD(&ar->vif_list);
-
-       clear_bit(WMI_ENABLED, &ar->flag);
-       clear_bit(SKIP_SCAN, &ar->flag);
-       clear_bit(DESTROY_IN_PROGRESS, &ar->flag);
-
-       ar->listen_intvl_t = A_DEFAULT_LISTEN_INTERVAL;
-       ar->listen_intvl_b = 0;
-       ar->tx_pwr = 0;
-
-       ar->intra_bss = 1;
-       ar->lrssi_roam_threshold = DEF_LRSSI_ROAM_THRESHOLD;
-
-       ar->state = ATH6KL_STATE_OFF;
-
-       memset((u8 *)ar->sta_list, 0,
-              AP_MAX_NUM_STA * sizeof(struct ath6kl_sta));
-
-       /* Init the PS queues */
-       for (ctr = 0; ctr < AP_MAX_NUM_STA; ctr++) {
-               spin_lock_init(&ar->sta_list[ctr].psq_lock);
-               skb_queue_head_init(&ar->sta_list[ctr].psq);
-       }
-
-       skb_queue_head_init(&ar->mcastpsq);
-
-       memcpy(ar->ap_country_code, DEF_AP_COUNTRY_CODE, 3);
-
-       return ar;
-}
-
-int ath6kl_register_ieee80211_hw(struct ath6kl *ar)
-{
-       struct wiphy *wiphy = ar->wiphy;
-       int ret;
-
-       wiphy->mgmt_stypes = ath6kl_mgmt_stypes;
-
-       wiphy->max_remain_on_channel_duration = 5000;
-
-       /* set device pointer for wiphy */
-       set_wiphy_dev(wiphy, ar->dev);
-
-       wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) |
-                                BIT(NL80211_IFTYPE_ADHOC) |
-                                BIT(NL80211_IFTYPE_AP);
-       if (ar->p2p) {
-               wiphy->interface_modes |= BIT(NL80211_IFTYPE_P2P_GO) |
-                                         BIT(NL80211_IFTYPE_P2P_CLIENT);
-       }
-
-       /* max num of ssids that can be probed during scanning */
-       wiphy->max_scan_ssids = MAX_PROBED_SSID_INDEX;
-       wiphy->max_scan_ie_len = 1000; /* FIX: what is correct limit? */
-       wiphy->bands[IEEE80211_BAND_2GHZ] = &ath6kl_band_2ghz;
-       wiphy->bands[IEEE80211_BAND_5GHZ] = &ath6kl_band_5ghz;
-       wiphy->signal_type = CFG80211_SIGNAL_TYPE_MBM;
-
-       wiphy->cipher_suites = cipher_suites;
-       wiphy->n_cipher_suites = ARRAY_SIZE(cipher_suites);
-
-       wiphy->wowlan.flags = WIPHY_WOWLAN_MAGIC_PKT |
-                             WIPHY_WOWLAN_DISCONNECT |
-                             WIPHY_WOWLAN_GTK_REKEY_FAILURE  |
-                             WIPHY_WOWLAN_SUPPORTS_GTK_REKEY |
-                             WIPHY_WOWLAN_EAP_IDENTITY_REQ   |
-                             WIPHY_WOWLAN_4WAY_HANDSHAKE;
-       wiphy->wowlan.n_patterns = WOW_MAX_FILTERS_PER_LIST;
-       wiphy->wowlan.pattern_min_len = 1;
-       wiphy->wowlan.pattern_max_len = WOW_PATTERN_SIZE;
-
-       wiphy->max_sched_scan_ssids = 10;
-
-       ret = wiphy_register(wiphy);
-       if (ret < 0) {
-               ath6kl_err("couldn't register wiphy device\n");
-               return ret;
-       }
-
-       return 0;
-}
-
-static int ath6kl_init_if_data(struct ath6kl_vif *vif)
+static int ath6kl_cfg80211_vif_init(struct ath6kl_vif *vif)
 {
-       vif->aggr_cntxt = aggr_init(vif->ndev);
+       vif->aggr_cntxt = aggr_init(vif);
        if (!vif->aggr_cntxt) {
                ath6kl_err("failed to initialize aggr\n");
                return -ENOMEM;
@@ -2758,12 +2882,15 @@ static int ath6kl_init_if_data(struct ath6kl_vif *vif)
        set_bit(WMM_ENABLED, &vif->flags);
        spin_lock_init(&vif->if_lock);
 
+       INIT_LIST_HEAD(&vif->mc_filter);
+
        return 0;
 }
 
-void ath6kl_deinit_if_data(struct ath6kl_vif *vif)
+void ath6kl_cfg80211_vif_cleanup(struct ath6kl_vif *vif)
 {
        struct ath6kl *ar = vif->ar;
+       struct ath6kl_mc_filter *mc_filter, *tmp;
 
        aggr_module_destroy(vif->aggr_cntxt);
 
@@ -2772,6 +2899,11 @@ void ath6kl_deinit_if_data(struct ath6kl_vif *vif)
        if (vif->nw_type == ADHOC_NETWORK)
                ar->ibss_if_active = false;
 
+       list_for_each_entry_safe(mc_filter, tmp, &vif->mc_filter, list) {
+               list_del(&mc_filter->list);
+               kfree(mc_filter);
+       }
+
        unregister_netdevice(vif->ndev);
 
        ar->num_vif--;
@@ -2808,8 +2940,7 @@ struct net_device *ath6kl_interface_add(struct ath6kl *ar, char *name,
 
        ath6kl_init_control_info(vif);
 
-       /* TODO: Pass interface specific pointer instead of ar */
-       if (ath6kl_init_if_data(vif))
+       if (ath6kl_cfg80211_vif_init(vif))
                goto err;
 
        if (register_netdevice(ndev))
@@ -2836,8 +2967,89 @@ err:
        return NULL;
 }
 
-void ath6kl_deinit_ieee80211_hw(struct ath6kl *ar)
+int ath6kl_cfg80211_init(struct ath6kl *ar)
+{
+       struct wiphy *wiphy = ar->wiphy;
+       int ret;
+
+       wiphy->mgmt_stypes = ath6kl_mgmt_stypes;
+
+       wiphy->max_remain_on_channel_duration = 5000;
+
+       /* set device pointer for wiphy */
+       set_wiphy_dev(wiphy, ar->dev);
+
+       wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) |
+                                BIT(NL80211_IFTYPE_ADHOC) |
+                                BIT(NL80211_IFTYPE_AP);
+       if (ar->p2p) {
+               wiphy->interface_modes |= BIT(NL80211_IFTYPE_P2P_GO) |
+                                         BIT(NL80211_IFTYPE_P2P_CLIENT);
+       }
+
+       /* max num of ssids that can be probed during scanning */
+       wiphy->max_scan_ssids = MAX_PROBED_SSID_INDEX;
+       wiphy->max_scan_ie_len = 1000; /* FIX: what is correct limit? */
+       wiphy->bands[IEEE80211_BAND_2GHZ] = &ath6kl_band_2ghz;
+       wiphy->bands[IEEE80211_BAND_5GHZ] = &ath6kl_band_5ghz;
+       wiphy->signal_type = CFG80211_SIGNAL_TYPE_MBM;
+
+       wiphy->cipher_suites = cipher_suites;
+       wiphy->n_cipher_suites = ARRAY_SIZE(cipher_suites);
+
+       wiphy->wowlan.flags = WIPHY_WOWLAN_MAGIC_PKT |
+                             WIPHY_WOWLAN_DISCONNECT |
+                             WIPHY_WOWLAN_GTK_REKEY_FAILURE  |
+                             WIPHY_WOWLAN_SUPPORTS_GTK_REKEY |
+                             WIPHY_WOWLAN_EAP_IDENTITY_REQ   |
+                             WIPHY_WOWLAN_4WAY_HANDSHAKE;
+       wiphy->wowlan.n_patterns = WOW_MAX_FILTERS_PER_LIST;
+       wiphy->wowlan.pattern_min_len = 1;
+       wiphy->wowlan.pattern_max_len = WOW_PATTERN_SIZE;
+
+       wiphy->max_sched_scan_ssids = 10;
+
+       ret = wiphy_register(wiphy);
+       if (ret < 0) {
+               ath6kl_err("couldn't register wiphy device\n");
+               return ret;
+       }
+
+       return 0;
+}
+
+void ath6kl_cfg80211_cleanup(struct ath6kl *ar)
 {
        wiphy_unregister(ar->wiphy);
+}
+
+struct ath6kl *ath6kl_cfg80211_create(void)
+{
+       struct ath6kl *ar;
+       struct wiphy *wiphy;
+
+       /* create a new wiphy for use with cfg80211 */
+       wiphy = wiphy_new(&ath6kl_cfg80211_ops, sizeof(struct ath6kl));
+
+       if (!wiphy) {
+               ath6kl_err("couldn't allocate wiphy device\n");
+               return NULL;
+       }
+
+       ar = wiphy_priv(wiphy);
+       ar->wiphy = wiphy;
+
+       return ar;
+}
+
+/* Note: ar variable must not be accessed after calling this! */
+void ath6kl_cfg80211_destroy(struct ath6kl *ar)
+{
+       int i;
+
+       for (i = 0; i < AP_MAX_NUM_STA; i++)
+               kfree(ar->sta_list[i].aggr_conn);
+
        wiphy_free(ar->wiphy);
 }
+
index 81f20a5..3c693b7 100644 (file)
@@ -27,10 +27,6 @@ enum ath6kl_cfg_suspend_mode {
 struct net_device *ath6kl_interface_add(struct ath6kl *ar, char *name,
                                        enum nl80211_iftype type,
                                        u8 fw_vif_idx, u8 nw_type);
-int ath6kl_register_ieee80211_hw(struct ath6kl *ar);
-struct ath6kl *ath6kl_core_alloc(struct device *dev);
-void ath6kl_deinit_ieee80211_hw(struct ath6kl *ar);
-
 void ath6kl_cfg80211_scan_complete_event(struct ath6kl_vif *vif, bool aborted);
 
 void ath6kl_cfg80211_connect_event(struct ath6kl_vif *vif, u16 channel,
@@ -53,7 +49,15 @@ int ath6kl_cfg80211_suspend(struct ath6kl *ar,
 
 int ath6kl_cfg80211_resume(struct ath6kl *ar);
 
+void ath6kl_cfg80211_vif_cleanup(struct ath6kl_vif *vif);
+
 void ath6kl_cfg80211_stop(struct ath6kl_vif *vif);
 void ath6kl_cfg80211_stop_all(struct ath6kl *ar);
 
+int ath6kl_cfg80211_init(struct ath6kl *ar);
+void ath6kl_cfg80211_cleanup(struct ath6kl *ar);
+
+struct ath6kl *ath6kl_cfg80211_create(void);
+void ath6kl_cfg80211_destroy(struct ath6kl *ar);
+
 #endif /* ATH6KL_CFG80211_H */
index bfd6597..f89f1e1 100644 (file)
@@ -79,8 +79,5 @@ struct ath6kl;
 enum htc_credit_dist_reason;
 struct ath6kl_htc_credit_info;
 
-struct ath6kl *ath6kl_core_alloc(struct device *sdev);
-int ath6kl_core_init(struct ath6kl *ar);
-void ath6kl_core_cleanup(struct ath6kl *ar);
 struct sk_buff *ath6kl_buf_alloc(int size);
 #endif /* COMMON_H */
diff --git a/drivers/net/wireless/ath/ath6kl/core.c b/drivers/net/wireless/ath/ath6kl/core.c
new file mode 100644 (file)
index 0000000..722ca59
--- /dev/null
@@ -0,0 +1,316 @@
+/*
+ * Copyright (c) 2004-2011 Atheros Communications Inc.
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include "core.h"
+
+#include <linux/module.h>
+#include <linux/moduleparam.h>
+#include <linux/export.h>
+
+#include "debug.h"
+#include "hif-ops.h"
+#include "cfg80211.h"
+
+unsigned int debug_mask;
+static unsigned int suspend_mode;
+static unsigned int uart_debug;
+static unsigned int ath6kl_p2p;
+static unsigned int testmode;
+
+module_param(debug_mask, uint, 0644);
+module_param(suspend_mode, uint, 0644);
+module_param(uart_debug, uint, 0644);
+module_param(ath6kl_p2p, uint, 0644);
+module_param(testmode, uint, 0644);
+
+int ath6kl_core_init(struct ath6kl *ar)
+{
+       struct ath6kl_bmi_target_info targ_info;
+       struct net_device *ndev;
+       int ret = 0, i;
+
+       ar->ath6kl_wq = create_singlethread_workqueue("ath6kl");
+       if (!ar->ath6kl_wq)
+               return -ENOMEM;
+
+       ret = ath6kl_bmi_init(ar);
+       if (ret)
+               goto err_wq;
+
+       /*
+        * Turn on power to get hardware (target) version and leave power
+        * on delibrately as we will boot the hardware anyway within few
+        * seconds.
+        */
+       ret = ath6kl_hif_power_on(ar);
+       if (ret)
+               goto err_bmi_cleanup;
+
+       ret = ath6kl_bmi_get_target_info(ar, &targ_info);
+       if (ret)
+               goto err_power_off;
+
+       ar->version.target_ver = le32_to_cpu(targ_info.version);
+       ar->target_type = le32_to_cpu(targ_info.type);
+       ar->wiphy->hw_version = le32_to_cpu(targ_info.version);
+
+       ret = ath6kl_init_hw_params(ar);
+       if (ret)
+               goto err_power_off;
+
+       ar->htc_target = ath6kl_htc_create(ar);
+
+       if (!ar->htc_target) {
+               ret = -ENOMEM;
+               goto err_power_off;
+       }
+
+       ar->testmode = testmode;
+
+       ret = ath6kl_init_fetch_firmwares(ar);
+       if (ret)
+               goto err_htc_cleanup;
+
+       /* FIXME: we should free all firmwares in the error cases below */
+
+       /* Indicate that WMI is enabled (although not ready yet) */
+       set_bit(WMI_ENABLED, &ar->flag);
+       ar->wmi = ath6kl_wmi_init(ar);
+       if (!ar->wmi) {
+               ath6kl_err("failed to initialize wmi\n");
+               ret = -EIO;
+               goto err_htc_cleanup;
+       }
+
+       ath6kl_dbg(ATH6KL_DBG_TRC, "%s: got wmi @ 0x%p.\n", __func__, ar->wmi);
+
+       ret = ath6kl_cfg80211_init(ar);
+       if (ret)
+               goto err_node_cleanup;
+
+       ret = ath6kl_debug_init(ar);
+       if (ret) {
+               wiphy_unregister(ar->wiphy);
+               goto err_node_cleanup;
+       }
+
+       for (i = 0; i < ar->vif_max; i++)
+               ar->avail_idx_map |= BIT(i);
+
+       rtnl_lock();
+
+       /* Add an initial station interface */
+       ndev = ath6kl_interface_add(ar, "wlan%d", NL80211_IFTYPE_STATION, 0,
+                                   INFRA_NETWORK);
+
+       rtnl_unlock();
+
+       if (!ndev) {
+               ath6kl_err("Failed to instantiate a network device\n");
+               ret = -ENOMEM;
+               wiphy_unregister(ar->wiphy);
+               goto err_debug_init;
+       }
+
+
+       ath6kl_dbg(ATH6KL_DBG_TRC, "%s: name=%s dev=0x%p, ar=0x%p\n",
+                       __func__, ndev->name, ndev, ar);
+
+       /* setup access class priority mappings */
+       ar->ac_stream_pri_map[WMM_AC_BK] = 0; /* lowest  */
+       ar->ac_stream_pri_map[WMM_AC_BE] = 1;
+       ar->ac_stream_pri_map[WMM_AC_VI] = 2;
+       ar->ac_stream_pri_map[WMM_AC_VO] = 3; /* highest */
+
+       /* give our connected endpoints some buffers */
+       ath6kl_rx_refill(ar->htc_target, ar->ctrl_ep);
+       ath6kl_rx_refill(ar->htc_target, ar->ac2ep_map[WMM_AC_BE]);
+
+       /* allocate some buffers that handle larger AMSDU frames */
+       ath6kl_refill_amsdu_rxbufs(ar, ATH6KL_MAX_AMSDU_RX_BUFFERS);
+
+       ath6kl_cookie_init(ar);
+
+       ar->conf_flags = ATH6KL_CONF_IGNORE_ERP_BARKER |
+                        ATH6KL_CONF_ENABLE_11N | ATH6KL_CONF_ENABLE_TX_BURST;
+
+       if (suspend_mode &&
+               suspend_mode >= WLAN_POWER_STATE_CUT_PWR &&
+               suspend_mode <= WLAN_POWER_STATE_WOW)
+               ar->suspend_mode = suspend_mode;
+       else
+               ar->suspend_mode = 0;
+
+       if (uart_debug)
+               ar->conf_flags |= ATH6KL_CONF_UART_DEBUG;
+
+       ar->wiphy->flags |= WIPHY_FLAG_SUPPORTS_FW_ROAM |
+                           WIPHY_FLAG_HAVE_AP_SME |
+                           WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL |
+                           WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD;
+
+       if (test_bit(ATH6KL_FW_CAPABILITY_SCHED_SCAN, ar->fw_capabilities))
+               ar->wiphy->flags |= WIPHY_FLAG_SUPPORTS_SCHED_SCAN;
+
+       ar->wiphy->probe_resp_offload =
+               NL80211_PROBE_RESP_OFFLOAD_SUPPORT_WPS |
+               NL80211_PROBE_RESP_OFFLOAD_SUPPORT_WPS2 |
+               NL80211_PROBE_RESP_OFFLOAD_SUPPORT_P2P |
+               NL80211_PROBE_RESP_OFFLOAD_SUPPORT_80211U;
+
+       set_bit(FIRST_BOOT, &ar->flag);
+
+       ndev->hw_features |= NETIF_F_IP_CSUM | NETIF_F_RXCSUM;
+
+       ret = ath6kl_init_hw_start(ar);
+       if (ret) {
+               ath6kl_err("Failed to start hardware: %d\n", ret);
+               goto err_rxbuf_cleanup;
+       }
+
+       /*
+        * Set mac address which is received in ready event
+        * FIXME: Move to ath6kl_interface_add()
+        */
+       memcpy(ndev->dev_addr, ar->mac_addr, ETH_ALEN);
+
+       return ret;
+
+err_rxbuf_cleanup:
+       ath6kl_htc_flush_rx_buf(ar->htc_target);
+       ath6kl_cleanup_amsdu_rxbufs(ar);
+       rtnl_lock();
+       ath6kl_cfg80211_vif_cleanup(netdev_priv(ndev));
+       rtnl_unlock();
+       wiphy_unregister(ar->wiphy);
+err_debug_init:
+       ath6kl_debug_cleanup(ar);
+err_node_cleanup:
+       ath6kl_wmi_shutdown(ar->wmi);
+       clear_bit(WMI_ENABLED, &ar->flag);
+       ar->wmi = NULL;
+err_htc_cleanup:
+       ath6kl_htc_cleanup(ar->htc_target);
+err_power_off:
+       ath6kl_hif_power_off(ar);
+err_bmi_cleanup:
+       ath6kl_bmi_cleanup(ar);
+err_wq:
+       destroy_workqueue(ar->ath6kl_wq);
+
+       return ret;
+}
+EXPORT_SYMBOL(ath6kl_core_init);
+
+struct ath6kl *ath6kl_core_create(struct device *dev)
+{
+       struct ath6kl *ar;
+       u8 ctr;
+
+       ar = ath6kl_cfg80211_create();
+       if (!ar)
+               return NULL;
+
+       ar->p2p = !!ath6kl_p2p;
+       ar->dev = dev;
+
+       ar->vif_max = 1;
+
+       ar->max_norm_iface = 1;
+
+       spin_lock_init(&ar->lock);
+       spin_lock_init(&ar->mcastpsq_lock);
+       spin_lock_init(&ar->list_lock);
+
+       init_waitqueue_head(&ar->event_wq);
+       sema_init(&ar->sem, 1);
+
+       INIT_LIST_HEAD(&ar->amsdu_rx_buffer_queue);
+       INIT_LIST_HEAD(&ar->vif_list);
+
+       clear_bit(WMI_ENABLED, &ar->flag);
+       clear_bit(SKIP_SCAN, &ar->flag);
+       clear_bit(DESTROY_IN_PROGRESS, &ar->flag);
+
+       ar->listen_intvl_b = A_DEFAULT_LISTEN_INTERVAL;
+       ar->tx_pwr = 0;
+
+       ar->intra_bss = 1;
+       ar->lrssi_roam_threshold = DEF_LRSSI_ROAM_THRESHOLD;
+
+       ar->state = ATH6KL_STATE_OFF;
+
+       memset((u8 *)ar->sta_list, 0,
+              AP_MAX_NUM_STA * sizeof(struct ath6kl_sta));
+
+       /* Init the PS queues */
+       for (ctr = 0; ctr < AP_MAX_NUM_STA; ctr++) {
+               spin_lock_init(&ar->sta_list[ctr].psq_lock);
+               skb_queue_head_init(&ar->sta_list[ctr].psq);
+               skb_queue_head_init(&ar->sta_list[ctr].apsdq);
+               ar->sta_list[ctr].aggr_conn =
+                       kzalloc(sizeof(struct aggr_info_conn), GFP_KERNEL);
+               if (!ar->sta_list[ctr].aggr_conn) {
+                       ath6kl_err("Failed to allocate memory for sta aggregation information\n");
+                       ath6kl_core_destroy(ar);
+                       return NULL;
+               }
+       }
+
+       skb_queue_head_init(&ar->mcastpsq);
+
+       memcpy(ar->ap_country_code, DEF_AP_COUNTRY_CODE, 3);
+
+       return ar;
+}
+EXPORT_SYMBOL(ath6kl_core_create);
+
+void ath6kl_core_cleanup(struct ath6kl *ar)
+{
+       ath6kl_hif_power_off(ar);
+
+       destroy_workqueue(ar->ath6kl_wq);
+
+       if (ar->htc_target)
+               ath6kl_htc_cleanup(ar->htc_target);
+
+       ath6kl_cookie_cleanup(ar);
+
+       ath6kl_cleanup_amsdu_rxbufs(ar);
+
+       ath6kl_bmi_cleanup(ar);
+
+       ath6kl_debug_cleanup(ar);
+
+       kfree(ar->fw_board);
+       kfree(ar->fw_otp);
+       kfree(ar->fw);
+       kfree(ar->fw_patch);
+       kfree(ar->fw_testscript);
+
+       ath6kl_cfg80211_cleanup(ar);
+}
+EXPORT_SYMBOL(ath6kl_core_cleanup);
+
+void ath6kl_core_destroy(struct ath6kl *ar)
+{
+       ath6kl_cfg80211_destroy(ar);
+}
+EXPORT_SYMBOL(ath6kl_core_destroy);
+
+MODULE_AUTHOR("Qualcomm Atheros");
+MODULE_DESCRIPTION("Core module for AR600x SDIO and USB devices.");
+MODULE_LICENSE("Dual BSD/GPL");
index c863a28..c4d66e0 100644 (file)
 #define ATH6KL_MAX_ENDPOINTS   4
 #define MAX_NODE_NUM           15
 
+#define ATH6KL_APSD_ALL_FRAME          0xFFFF
+#define ATH6KL_APSD_NUM_OF_AC          0x4
+#define ATH6KL_APSD_FRAME_MASK         0xF
+
 /* Extra bytes for htc header alignment */
 #define ATH6KL_HTC_ALIGN_BYTES 3
 
@@ -55,7 +59,7 @@
 #define MAX_DEFAULT_SEND_QUEUE_DEPTH      (MAX_DEF_COOKIE_NUM / WMM_NUM_AC)
 
 #define DISCON_TIMER_INTVAL               10000  /* in msec */
-#define A_DEFAULT_LISTEN_INTERVAL         100
+#define A_DEFAULT_LISTEN_INTERVAL         1      /* beacon intervals */
 #define A_MAX_WOW_LISTEN_INTERVAL         1000
 
 /* includes also the null byte */
@@ -97,45 +101,49 @@ struct ath6kl_fw_ie {
        u8 data[0];
 };
 
+#define ATH6KL_FW_API2_FILE "fw-2.bin"
+#define ATH6KL_FW_API3_FILE "fw-3.bin"
+
 /* AR6003 1.0 definitions */
 #define AR6003_HW_1_0_VERSION                 0x300002ba
 
 /* AR6003 2.0 definitions */
 #define AR6003_HW_2_0_VERSION                 0x30000384
 #define AR6003_HW_2_0_PATCH_DOWNLOAD_ADDRESS  0x57e910
-#define AR6003_HW_2_0_OTP_FILE "ath6k/AR6003/hw2.0/otp.bin.z77"
-#define AR6003_HW_2_0_FIRMWARE_FILE "ath6k/AR6003/hw2.0/athwlan.bin.z77"
-#define AR6003_HW_2_0_TCMD_FIRMWARE_FILE "ath6k/AR6003/hw2.0/athtcmd_ram.bin"
-#define AR6003_HW_2_0_PATCH_FILE "ath6k/AR6003/hw2.0/data.patch.bin"
-#define AR6003_HW_2_0_FIRMWARE_2_FILE "ath6k/AR6003/hw2.0/fw-2.bin"
+#define AR6003_HW_2_0_FW_DIR                   "ath6k/AR6003/hw2.0"
+#define AR6003_HW_2_0_OTP_FILE                 "otp.bin.z77"
+#define AR6003_HW_2_0_FIRMWARE_FILE            "athwlan.bin.z77"
+#define AR6003_HW_2_0_TCMD_FIRMWARE_FILE       "athtcmd_ram.bin"
+#define AR6003_HW_2_0_PATCH_FILE               "data.patch.bin"
 #define AR6003_HW_2_0_BOARD_DATA_FILE "ath6k/AR6003/hw2.0/bdata.bin"
 #define AR6003_HW_2_0_DEFAULT_BOARD_DATA_FILE \
                        "ath6k/AR6003/hw2.0/bdata.SD31.bin"
 
 /* AR6003 3.0 definitions */
 #define AR6003_HW_2_1_1_VERSION                 0x30000582
-#define AR6003_HW_2_1_1_OTP_FILE "ath6k/AR6003/hw2.1.1/otp.bin"
-#define AR6003_HW_2_1_1_FIRMWARE_FILE "ath6k/AR6003/hw2.1.1/athwlan.bin"
-#define AR6003_HW_2_1_1_TCMD_FIRMWARE_FILE \
-                       "ath6k/AR6003/hw2.1.1/athtcmd_ram.bin"
-#define AR6003_HW_2_1_1_PATCH_FILE "ath6k/AR6003/hw2.1.1/data.patch.bin"
-#define AR6003_HW_2_1_1_FIRMWARE_2_FILE "ath6k/AR6003/hw2.1.1/fw-2.bin"
+#define AR6003_HW_2_1_1_FW_DIR                 "ath6k/AR6003/hw2.1.1"
+#define AR6003_HW_2_1_1_OTP_FILE               "otp.bin"
+#define AR6003_HW_2_1_1_FIRMWARE_FILE          "athwlan.bin"
+#define AR6003_HW_2_1_1_TCMD_FIRMWARE_FILE     "athtcmd_ram.bin"
+#define AR6003_HW_2_1_1_UTF_FIRMWARE_FILE      "utf.bin"
+#define AR6003_HW_2_1_1_TESTSCRIPT_FILE        "nullTestFlow.bin"
+#define AR6003_HW_2_1_1_PATCH_FILE             "data.patch.bin"
 #define AR6003_HW_2_1_1_BOARD_DATA_FILE "ath6k/AR6003/hw2.1.1/bdata.bin"
 #define AR6003_HW_2_1_1_DEFAULT_BOARD_DATA_FILE        \
                        "ath6k/AR6003/hw2.1.1/bdata.SD31.bin"
 
 /* AR6004 1.0 definitions */
 #define AR6004_HW_1_0_VERSION                 0x30000623
-#define AR6004_HW_1_0_FIRMWARE_2_FILE         "ath6k/AR6004/hw1.0/fw-2.bin"
-#define AR6004_HW_1_0_FIRMWARE_FILE           "ath6k/AR6004/hw1.0/fw.ram.bin"
+#define AR6004_HW_1_0_FW_DIR                   "ath6k/AR6004/hw1.0"
+#define AR6004_HW_1_0_FIRMWARE_FILE            "fw.ram.bin"
 #define AR6004_HW_1_0_BOARD_DATA_FILE         "ath6k/AR6004/hw1.0/bdata.bin"
 #define AR6004_HW_1_0_DEFAULT_BOARD_DATA_FILE \
        "ath6k/AR6004/hw1.0/bdata.DB132.bin"
 
 /* AR6004 1.1 definitions */
 #define AR6004_HW_1_1_VERSION                 0x30000001
-#define AR6004_HW_1_1_FIRMWARE_2_FILE         "ath6k/AR6004/hw1.1/fw-2.bin"
-#define AR6004_HW_1_1_FIRMWARE_FILE           "ath6k/AR6004/hw1.1/fw.ram.bin"
+#define AR6004_HW_1_1_FW_DIR                   "ath6k/AR6004/hw1.1"
+#define AR6004_HW_1_1_FIRMWARE_FILE            "fw.ram.bin"
 #define AR6004_HW_1_1_BOARD_DATA_FILE         "ath6k/AR6004/hw1.1/bdata.bin"
 #define AR6004_HW_1_1_DEFAULT_BOARD_DATA_FILE \
        "ath6k/AR6004/hw1.1/bdata.DB132.bin"
@@ -144,6 +152,8 @@ struct ath6kl_fw_ie {
 #define STA_PS_AWAKE           BIT(0)
 #define        STA_PS_SLEEP            BIT(1)
 #define        STA_PS_POLLED           BIT(2)
+#define STA_PS_APSD_TRIGGER     BIT(3)
+#define STA_PS_APSD_EOSP        BIT(4)
 
 /* HTC TX packet tagging definitions */
 #define ATH6KL_CONTROL_PKT_TAG    HTC_TX_PACKET_TAG_USER_DEFINED
@@ -186,7 +196,7 @@ struct ath6kl_fw_ie {
 #define ATH6KL_CONF_IGNORE_PS_FAIL_EVT_IN_SCAN  BIT(1)
 #define ATH6KL_CONF_ENABLE_11N                 BIT(2)
 #define ATH6KL_CONF_ENABLE_TX_BURST            BIT(3)
-#define ATH6KL_CONF_SUSPEND_CUTPOWER           BIT(4)
+#define ATH6KL_CONF_UART_DEBUG                 BIT(4)
 
 enum wlan_low_pwr_state {
        WLAN_POWER_STATE_ON,
@@ -231,14 +241,19 @@ struct rxtid_stats {
        u32 num_bar;
 };
 
-struct aggr_info {
+struct aggr_info_conn {
        u8 aggr_sz;
        u8 timer_scheduled;
        struct timer_list timer;
        struct net_device *dev;
        struct rxtid rx_tid[NUM_OF_TIDS];
-       struct sk_buff_head free_q;
        struct rxtid_stats stat[NUM_OF_TIDS];
+       struct aggr_info *aggr_info;
+};
+
+struct aggr_info {
+       struct aggr_info_conn *aggr_conn;
+       struct sk_buff_head rx_amsdu_freeq;
 };
 
 struct ath6kl_wep_key {
@@ -280,6 +295,9 @@ struct ath6kl_sta {
        u8 wpa_ie[ATH6KL_MAX_IE];
        struct sk_buff_head psq;
        spinlock_t psq_lock;
+       u8 apsd_info;
+       struct sk_buff_head apsdq;
+       struct aggr_info_conn *aggr_conn;
 };
 
 struct ath6kl_version {
@@ -408,6 +426,13 @@ enum ath6kl_hif_type {
        ATH6KL_HIF_TYPE_USB,
 };
 
+/* Max number of filters that hw supports */
+#define ATH6K_MAX_MC_FILTERS_PER_LIST 7
+struct ath6kl_mc_filter {
+       struct list_head list;
+       char hw_addr[ATH6KL_MCAST_FILTER_MAC_ADDR_SIZE];
+};
+
 /*
  * Driver's maximum limit, note that some firmwares support only one vif
  * and the runtime (current) limit must be checked from ar->vif_max.
@@ -426,6 +451,7 @@ enum ath6kl_vif_state {
        DTIM_PERIOD_AVAIL,
        WLAN_ENABLED,
        STATS_UPDATE_PEND,
+       HOST_SLEEP_MODE_CMD_PROCESSED,
 };
 
 struct ath6kl_vif {
@@ -471,6 +497,8 @@ struct ath6kl_vif {
        u8 assoc_bss_dtim_period;
        struct net_device_stats net_stats;
        struct target_stats target_stats;
+
+       struct list_head mc_filter;
 };
 
 #define WOW_LIST_ID            0
@@ -504,6 +532,7 @@ struct ath6kl {
        struct wiphy *wiphy;
 
        enum ath6kl_state state;
+       unsigned int testmode;
 
        struct ath6kl_bmi bmi;
        const struct ath6kl_hif_ops *hif_ops;
@@ -523,7 +552,6 @@ struct ath6kl {
        spinlock_t lock;
        struct semaphore sem;
        u16 listen_intvl_b;
-       u16 listen_intvl_t;
        u8 lrssi_roam_threshold;
        struct ath6kl_version version;
        u32 target_type;
@@ -574,17 +602,24 @@ struct ath6kl {
                u32 board_addr;
                u32 refclk_hz;
                u32 uarttx_pin;
+               u32 testscript_addr;
+
+               struct ath6kl_hw_fw {
+                       const char *dir;
+                       const char *otp;
+                       const char *fw;
+                       const char *tcmd;
+                       const char *patch;
+                       const char *utf;
+                       const char *testscript;
+               } fw;
 
-               const char *fw_otp;
-               const char *fw;
-               const char *fw_tcmd;
-               const char *fw_patch;
-               const char *fw_api2;
                const char *fw_board;
                const char *fw_default_board;
        } hw;
 
        u16 conf_flags;
+       u16 suspend_mode;
        wait_queue_head_t event_wq;
        struct ath6kl_mbox_info mbox_info;
 
@@ -603,6 +638,10 @@ struct ath6kl {
        u8 *fw_patch;
        size_t fw_patch_len;
 
+       u8 *fw_testscript;
+       size_t fw_testscript_len;
+
+       unsigned int fw_api;
        unsigned long fw_capabilities[ATH6KL_CAPABILITY_LEN];
 
        struct workqueue_struct *ath6kl_wq;
@@ -676,7 +715,9 @@ struct ath6kl_cookie *ath6kl_alloc_cookie(struct ath6kl *ar);
 void ath6kl_free_cookie(struct ath6kl *ar, struct ath6kl_cookie *cookie);
 int ath6kl_data_tx(struct sk_buff *skb, struct net_device *dev);
 
-struct aggr_info *aggr_init(struct net_device *dev);
+struct aggr_info *aggr_init(struct ath6kl_vif *vif);
+void aggr_conn_init(struct ath6kl_vif *vif, struct aggr_info *aggr_info,
+                   struct aggr_info_conn *aggr_conn);
 void ath6kl_rx_refill(struct htc_target *target,
                      enum htc_endpoint_id endpoint);
 void ath6kl_refill_amsdu_rxbufs(struct ath6kl *ar, int count);
@@ -684,7 +725,7 @@ struct htc_packet *ath6kl_alloc_amsdu_rxbuf(struct htc_target *target,
                                            enum htc_endpoint_id endpoint,
                                            int len);
 void aggr_module_destroy(struct aggr_info *aggr_info);
-void aggr_reset_state(struct aggr_info *aggr_info);
+void aggr_reset_state(struct aggr_info_conn *aggr_conn);
 
 struct ath6kl_sta *ath6kl_find_sta(struct ath6kl_vif *vif, u8 * node_addr);
 struct ath6kl_sta *ath6kl_find_sta_by_aid(struct ath6kl *ar, u8 aid);
@@ -700,7 +741,7 @@ void ath6kl_connect_event(struct ath6kl_vif *vif, u16 channel,
 void ath6kl_connect_ap_mode_bss(struct ath6kl_vif *vif, u16 channel);
 void ath6kl_connect_ap_mode_sta(struct ath6kl_vif *vif, u16 aid, u8 *mac_addr,
                                u8 keymgmt, u8 ucipher, u8 auth,
-                               u8 assoc_req_len, u8 *assoc_info);
+                               u8 assoc_req_len, u8 *assoc_info, u8 apsd_info);
 void ath6kl_disconnect_event(struct ath6kl_vif *vif, u8 reason,
                             u8 *bssid, u8 assoc_resp_len,
                             u8 *assoc_info, u16 prot_reason_status);
@@ -723,12 +764,18 @@ void ath6kl_wakeup_event(void *dev);
 void ath6kl_reset_device(struct ath6kl *ar, u32 target_type,
                         bool wait_fot_compltn, bool cold_reset);
 void ath6kl_init_control_info(struct ath6kl_vif *vif);
-void ath6kl_deinit_if_data(struct ath6kl_vif *vif);
-void ath6kl_core_free(struct ath6kl *ar);
 struct ath6kl_vif *ath6kl_vif_first(struct ath6kl *ar);
 void ath6kl_cleanup_vif(struct ath6kl_vif *vif, bool wmi_ready);
 int ath6kl_init_hw_start(struct ath6kl *ar);
 int ath6kl_init_hw_stop(struct ath6kl *ar);
+int ath6kl_init_fetch_firmwares(struct ath6kl *ar);
+int ath6kl_init_hw_params(struct ath6kl *ar);
+
 void ath6kl_check_wow_status(struct ath6kl *ar);
 
+struct ath6kl *ath6kl_core_create(struct device *dev);
+int ath6kl_core_init(struct ath6kl *ar);
+void ath6kl_core_cleanup(struct ath6kl *ar);
+void ath6kl_core_destroy(struct ath6kl *ar);
+
 #endif /* CORE_H */
index eb808b4..d832058 100644 (file)
@@ -54,9 +54,42 @@ int ath6kl_printk(const char *level, const char *fmt, ...)
 
        return rtn;
 }
+EXPORT_SYMBOL(ath6kl_printk);
 
 #ifdef CONFIG_ATH6KL_DEBUG
 
+void ath6kl_dbg(enum ATH6K_DEBUG_MASK mask, const char *fmt, ...)
+{
+       struct va_format vaf;
+       va_list args;
+
+       if (!(debug_mask & mask))
+               return;
+
+       va_start(args, fmt);
+
+       vaf.fmt = fmt;
+       vaf.va = &args;
+
+       ath6kl_printk(KERN_DEBUG, "%pV", &vaf);
+
+       va_end(args);
+}
+EXPORT_SYMBOL(ath6kl_dbg);
+
+void ath6kl_dbg_dump(enum ATH6K_DEBUG_MASK mask,
+                    const char *msg, const char *prefix,
+                    const void *buf, size_t len)
+{
+       if (debug_mask & mask) {
+               if (msg)
+                       ath6kl_dbg(mask, "%s\n", msg);
+
+               print_hex_dump_bytes(prefix, DUMP_PREFIX_OFFSET, buf, len);
+       }
+}
+EXPORT_SYMBOL(ath6kl_dbg_dump);
+
 #define REG_OUTPUT_LEN_PER_LINE        25
 #define REGTYPE_STR_LEN                100
 
@@ -82,31 +115,31 @@ void ath6kl_dump_registers(struct ath6kl_device *dev,
                           struct ath6kl_irq_enable_reg *irq_enable_reg)
 {
 
-       ath6kl_dbg(ATH6KL_DBG_ANY, ("<------- Register Table -------->\n"));
+       ath6kl_dbg(ATH6KL_DBG_IRQ, ("<------- Register Table -------->\n"));
 
        if (irq_proc_reg != NULL) {
-               ath6kl_dbg(ATH6KL_DBG_ANY,
+               ath6kl_dbg(ATH6KL_DBG_IRQ,
                        "Host Int status:           0x%x\n",
                        irq_proc_reg->host_int_status);
-               ath6kl_dbg(ATH6KL_DBG_ANY,
+               ath6kl_dbg(ATH6KL_DBG_IRQ,
                           "CPU Int status:            0x%x\n",
                        irq_proc_reg->cpu_int_status);
-               ath6kl_dbg(ATH6KL_DBG_ANY,
+               ath6kl_dbg(ATH6KL_DBG_IRQ,
                           "Error Int status:          0x%x\n",
                        irq_proc_reg->error_int_status);
-               ath6kl_dbg(ATH6KL_DBG_ANY,
+               ath6kl_dbg(ATH6KL_DBG_IRQ,
                           "Counter Int status:        0x%x\n",
                        irq_proc_reg->counter_int_status);
-               ath6kl_dbg(ATH6KL_DBG_ANY,
+               ath6kl_dbg(ATH6KL_DBG_IRQ,
                           "Mbox Frame:                0x%x\n",
                        irq_proc_reg->mbox_frame);
-               ath6kl_dbg(ATH6KL_DBG_ANY,
+               ath6kl_dbg(ATH6KL_DBG_IRQ,
                           "Rx Lookahead Valid:        0x%x\n",
                        irq_proc_reg->rx_lkahd_valid);
-               ath6kl_dbg(ATH6KL_DBG_ANY,
+               ath6kl_dbg(ATH6KL_DBG_IRQ,
                           "Rx Lookahead 0:            0x%x\n",
                        irq_proc_reg->rx_lkahd[0]);
-               ath6kl_dbg(ATH6KL_DBG_ANY,
+               ath6kl_dbg(ATH6KL_DBG_IRQ,
                           "Rx Lookahead 1:            0x%x\n",
                        irq_proc_reg->rx_lkahd[1]);
 
@@ -115,16 +148,16 @@ void ath6kl_dump_registers(struct ath6kl_device *dev,
                         * If the target supports GMBOX hardware, dump some
                         * additional state.
                         */
-                       ath6kl_dbg(ATH6KL_DBG_ANY,
+                       ath6kl_dbg(ATH6KL_DBG_IRQ,
                                "GMBOX Host Int status 2:   0x%x\n",
                                irq_proc_reg->host_int_status2);
-                       ath6kl_dbg(ATH6KL_DBG_ANY,
+                       ath6kl_dbg(ATH6KL_DBG_IRQ,
                                "GMBOX RX Avail:            0x%x\n",
                                irq_proc_reg->gmbox_rx_avail);
-                       ath6kl_dbg(ATH6KL_DBG_ANY,
+                       ath6kl_dbg(ATH6KL_DBG_IRQ,
                                "GMBOX lookahead alias 0:   0x%x\n",
                                irq_proc_reg->rx_gmbox_lkahd_alias[0]);
-                       ath6kl_dbg(ATH6KL_DBG_ANY,
+                       ath6kl_dbg(ATH6KL_DBG_IRQ,
                                "GMBOX lookahead alias 1:   0x%x\n",
                                irq_proc_reg->rx_gmbox_lkahd_alias[1]);
                }
@@ -132,13 +165,13 @@ void ath6kl_dump_registers(struct ath6kl_device *dev,
        }
 
        if (irq_enable_reg != NULL) {
-               ath6kl_dbg(ATH6KL_DBG_ANY,
+               ath6kl_dbg(ATH6KL_DBG_IRQ,
                        "Int status Enable:         0x%x\n",
                        irq_enable_reg->int_status_en);
-               ath6kl_dbg(ATH6KL_DBG_ANY, "Counter Int status Enable: 0x%x\n",
+               ath6kl_dbg(ATH6KL_DBG_IRQ, "Counter Int status Enable: 0x%x\n",
                        irq_enable_reg->cntr_int_status_en);
        }
-       ath6kl_dbg(ATH6KL_DBG_ANY, "<------------------------------->\n");
+       ath6kl_dbg(ATH6KL_DBG_IRQ, "<------------------------------->\n");
 }
 
 static void dump_cred_dist(struct htc_endpoint_credit_dist *ep_dist)
@@ -175,9 +208,6 @@ void dump_cred_dist_stats(struct htc_target *target)
 {
        struct htc_endpoint_credit_dist *ep_list;
 
-       if (!AR_DBG_LVL_CHECK(ATH6KL_DBG_CREDIT))
-               return;
-
        list_for_each_entry(ep_list, &target->cred_dist_list, list)
                dump_cred_dist(ep_list);
 
@@ -1411,6 +1441,8 @@ static ssize_t ath6kl_create_qos_write(struct file *file,
                return -EINVAL;
        pstream.medium_time = cpu_to_le32(val32);
 
+       pstream.nominal_phy = le32_to_cpu(pstream.min_phy_rate) / 1000000;
+
        ath6kl_wmi_create_pstream_cmd(ar->wmi, vif->fw_vif_idx, &pstream);
 
        return count;
@@ -1505,57 +1537,46 @@ static const struct file_operations fops_bgscan_int = {
 };
 
 static ssize_t ath6kl_listen_int_write(struct file *file,
-                                               const char __user *user_buf,
-                                               size_t count, loff_t *ppos)
+                                      const char __user *user_buf,
+                                      size_t count, loff_t *ppos)
 {
        struct ath6kl *ar = file->private_data;
-       u16 listen_int_t, listen_int_b;
+       struct ath6kl_vif *vif;
+       u16 listen_interval;
        char buf[32];
-       char *sptr, *token;
        ssize_t len;
 
+       vif = ath6kl_vif_first(ar);
+       if (!vif)
+               return -EIO;
+
        len = min(count, sizeof(buf) - 1);
        if (copy_from_user(buf, user_buf, len))
                return -EFAULT;
 
        buf[len] = '\0';
-       sptr = buf;
-
-       token = strsep(&sptr, " ");
-       if (!token)
-               return -EINVAL;
-
-       if (kstrtou16(token, 0, &listen_int_t))
-               return -EINVAL;
-
-       if (kstrtou16(sptr, 0, &listen_int_b))
-               return -EINVAL;
-
-       if ((listen_int_t < 15) || (listen_int_t > 5000))
+       if (kstrtou16(buf, 0, &listen_interval))
                return -EINVAL;
 
-       if ((listen_int_b < 1) || (listen_int_b > 50))
+       if ((listen_interval < 1) || (listen_interval > 50))
                return -EINVAL;
 
-       ar->listen_intvl_t = listen_int_t;
-       ar->listen_intvl_b = listen_int_b;
-
-       ath6kl_wmi_listeninterval_cmd(ar->wmi, 0, ar->listen_intvl_t,
+       ar->listen_intvl_b = listen_interval;
+       ath6kl_wmi_listeninterval_cmd(ar->wmi, vif->fw_vif_idx, 0,
                                      ar->listen_intvl_b);
 
        return count;
 }
 
 static ssize_t ath6kl_listen_int_read(struct file *file,
-                                               char __user *user_buf,
-                                               size_t count, loff_t *ppos)
+                                     char __user *user_buf,
+                                     size_t count, loff_t *ppos)
 {
        struct ath6kl *ar = file->private_data;
        char buf[32];
        int len;
 
-       len = scnprintf(buf, sizeof(buf), "%u %u\n", ar->listen_intvl_t,
-                                       ar->listen_intvl_b);
+       len = scnprintf(buf, sizeof(buf), "%u\n", ar->listen_intvl_b);
 
        return simple_read_from_buffer(user_buf, count, ppos, buf, len);
 }
@@ -1710,6 +1731,9 @@ int ath6kl_debug_init(struct ath6kl *ar)
        debugfs_create_file("bgscan_interval", S_IWUSR,
                                ar->debugfs_phy, ar, &fops_bgscan_int);
 
+       debugfs_create_file("listen_interval", S_IRUSR | S_IWUSR,
+                           ar->debugfs_phy, ar, &fops_listen_int);
+
        debugfs_create_file("power_params", S_IWUSR, ar->debugfs_phy, ar,
                                                &fops_power_params);
 
index 9853c9c..c4be6e5 100644 (file)
@@ -41,6 +41,7 @@ enum ATH6K_DEBUG_MASK {
        ATH6KL_DBG_BOOT         = BIT(18),    /* driver init and fw boot */
        ATH6KL_DBG_WMI_DUMP     = BIT(19),
        ATH6KL_DBG_SUSPEND      = BIT(20),
+       ATH6KL_DBG_USB          = BIT(21),
        ATH6KL_DBG_ANY          = 0xffffffff  /* enable all logs */
 };
 
@@ -55,35 +56,16 @@ int ath6kl_printk(const char *level, const char *fmt, ...);
 #define ath6kl_warn(fmt, ...)                                  \
        ath6kl_printk(KERN_WARNING, fmt, ##__VA_ARGS__)
 
-#define AR_DBG_LVL_CHECK(mask) (debug_mask & mask)
-
 enum ath6kl_war {
        ATH6KL_WAR_INVALID_RATE,
 };
 
 #ifdef CONFIG_ATH6KL_DEBUG
-#define ath6kl_dbg(mask, fmt, ...)                                     \
-       ({                                                              \
-        int rtn;                                                       \
-        if (debug_mask & mask)                                         \
-               rtn = ath6kl_printk(KERN_DEBUG, fmt, ##__VA_ARGS__);    \
-        else                                                           \
-               rtn = 0;                                                \
-                                                                       \
-        rtn;                                                           \
-        })
 
-static inline void ath6kl_dbg_dump(enum ATH6K_DEBUG_MASK mask,
-                                  const char *msg, const char *prefix,
-                                  const void *buf, size_t len)
-{
-       if (debug_mask & mask) {
-               if (msg)
-                       ath6kl_dbg(mask, "%s\n", msg);
-
-               print_hex_dump_bytes(prefix, DUMP_PREFIX_OFFSET, buf, len);
-       }
-}
+void ath6kl_dbg(enum ATH6K_DEBUG_MASK mask, const char *fmt, ...);
+void ath6kl_dbg_dump(enum ATH6K_DEBUG_MASK mask,
+                    const char *msg, const char *prefix,
+                    const void *buf, size_t len);
 
 void ath6kl_dump_registers(struct ath6kl_device *dev,
                           struct ath6kl_irq_proc_registers *irq_proc_reg,
index e57da35..e911737 100644 (file)
@@ -15,6 +15,8 @@
  */
 #include "hif.h"
 
+#include <linux/export.h>
+
 #include "core.h"
 #include "target.h"
 #include "hif-ops.h"
@@ -59,6 +61,8 @@ int ath6kl_hif_rw_comp_handler(void *context, int status)
 
        return 0;
 }
+EXPORT_SYMBOL(ath6kl_hif_rw_comp_handler);
+
 #define REG_DUMP_COUNT_AR6003   60
 #define REGISTER_DUMP_LEN_MAX   60
 
@@ -429,9 +433,8 @@ static int proc_pending_irqs(struct ath6kl_device *dev, bool *done)
                if (status)
                        goto out;
 
-               if (AR_DBG_LVL_CHECK(ATH6KL_DBG_IRQ))
-                       ath6kl_dump_registers(dev, &dev->irq_proc_reg,
-                                        &dev->irq_en_reg);
+               ath6kl_dump_registers(dev, &dev->irq_proc_reg,
+                                     &dev->irq_en_reg);
 
                /* Update only those registers that are enabled */
                host_int_status = dev->irq_proc_reg.host_int_status &
@@ -561,6 +564,7 @@ int ath6kl_hif_intr_bh_handler(struct ath6kl *ar)
 
        return status;
 }
+EXPORT_SYMBOL(ath6kl_hif_intr_bh_handler);
 
 static int ath6kl_hif_enable_intrs(struct ath6kl_device *dev)
 {
@@ -689,6 +693,11 @@ int ath6kl_hif_setup(struct ath6kl_device *dev)
        ath6kl_dbg(ATH6KL_DBG_HIF, "hif block size %d mbox addr 0x%x\n",
                   dev->htc_cnxt->block_sz, dev->ar->mbox_info.htc_addr);
 
+       /* usb doesn't support enabling interrupts */
+       /* FIXME: remove check once USB support is implemented */
+       if (dev->ar->hif_type == ATH6KL_HIF_TYPE_USB)
+               return 0;
+
        status = ath6kl_hif_disable_intrs(dev);
 
 fail_setup:
index f3b63ca..2d72190 100644 (file)
@@ -2062,6 +2062,7 @@ int ath6kl_htc_rxmsg_pending_handler(struct htc_target *target,
        enum htc_endpoint_id id;
        int n_fetched = 0;
 
+       INIT_LIST_HEAD(&comp_pktq);
        *num_pkts = 0;
 
        /*
@@ -2543,6 +2544,12 @@ int ath6kl_htc_wait_target(struct htc_target *target)
        struct htc_service_connect_resp resp;
        int status;
 
+       /* FIXME: remove once USB support is implemented */
+       if (target->dev->ar->hif_type == ATH6KL_HIF_TYPE_USB) {
+               ath6kl_err("HTC doesn't support USB yet. Patience!\n");
+               return -EOPNOTSUPP;
+       }
+
        /* we should be getting 1 control message that the target is ready */
        packet = htc_wait_for_ctrl_msg(target);
 
@@ -2772,7 +2779,9 @@ void ath6kl_htc_cleanup(struct htc_target *target)
 {
        struct htc_packet *packet, *tmp_packet;
 
-       ath6kl_hif_cleanup_scatter(target->dev->ar);
+       /* FIXME: remove check once USB support is implemented */
+       if (target->dev->ar->hif_type != ATH6KL_HIF_TYPE_USB)
+               ath6kl_hif_cleanup_scatter(target->dev->ar);
 
        list_for_each_entry_safe(packet, tmp_packet,
                        &target->free_ctrl_txbuf, list) {
index 7f55be3..0d76c37 100644 (file)
 
 #include <linux/moduleparam.h>
 #include <linux/errno.h>
+#include <linux/export.h>
 #include <linux/of.h>
 #include <linux/mmc/sdio_func.h>
+
 #include "core.h"
 #include "cfg80211.h"
 #include "target.h"
 #include "debug.h"
 #include "hif-ops.h"
 
-unsigned int debug_mask;
-static unsigned int testmode;
-static bool suspend_cutpower;
-
-module_param(debug_mask, uint, 0644);
-module_param(testmode, uint, 0644);
-module_param(suspend_cutpower, bool, 0444);
-
 static const struct ath6kl_hw hw_list[] = {
        {
                .id                             = AR6003_HW_2_0_VERSION,
@@ -47,11 +41,14 @@ static const struct ath6kl_hw hw_list[] = {
                /* hw2.0 needs override address hardcoded */
                .app_start_override_addr        = 0x944C00,
 
-               .fw_otp                 = AR6003_HW_2_0_OTP_FILE,
-               .fw                     = AR6003_HW_2_0_FIRMWARE_FILE,
-               .fw_tcmd                = AR6003_HW_2_0_TCMD_FIRMWARE_FILE,
-               .fw_patch               = AR6003_HW_2_0_PATCH_FILE,
-               .fw_api2                = AR6003_HW_2_0_FIRMWARE_2_FILE,
+               .fw = {
+                       .dir            = AR6003_HW_2_0_FW_DIR,
+                       .otp            = AR6003_HW_2_0_OTP_FILE,
+                       .fw             = AR6003_HW_2_0_FIRMWARE_FILE,
+                       .tcmd           = AR6003_HW_2_0_TCMD_FIRMWARE_FILE,
+                       .patch          = AR6003_HW_2_0_PATCH_FILE,
+               },
+
                .fw_board               = AR6003_HW_2_0_BOARD_DATA_FILE,
                .fw_default_board       = AR6003_HW_2_0_DEFAULT_BOARD_DATA_FILE,
        },
@@ -64,12 +61,18 @@ static const struct ath6kl_hw hw_list[] = {
                .reserved_ram_size              = 512,
                .refclk_hz                      = 26000000,
                .uarttx_pin                     = 8,
+               .testscript_addr                = 0x57ef74,
+
+               .fw = {
+                       .dir            = AR6003_HW_2_1_1_FW_DIR,
+                       .otp            = AR6003_HW_2_1_1_OTP_FILE,
+                       .fw             = AR6003_HW_2_1_1_FIRMWARE_FILE,
+                       .tcmd           = AR6003_HW_2_1_1_TCMD_FIRMWARE_FILE,
+                       .patch          = AR6003_HW_2_1_1_PATCH_FILE,
+                       .utf            = AR6003_HW_2_1_1_UTF_FIRMWARE_FILE,
+                       .testscript     = AR6003_HW_2_1_1_TESTSCRIPT_FILE,
+               },
 
-               .fw_otp                 = AR6003_HW_2_1_1_OTP_FILE,
-               .fw                     = AR6003_HW_2_1_1_FIRMWARE_FILE,
-               .fw_tcmd                = AR6003_HW_2_1_1_TCMD_FIRMWARE_FILE,
-               .fw_patch               = AR6003_HW_2_1_1_PATCH_FILE,
-               .fw_api2                = AR6003_HW_2_1_1_FIRMWARE_2_FILE,
                .fw_board               = AR6003_HW_2_1_1_BOARD_DATA_FILE,
                .fw_default_board       = AR6003_HW_2_1_1_DEFAULT_BOARD_DATA_FILE,
        },
@@ -84,8 +87,11 @@ static const struct ath6kl_hw hw_list[] = {
                .refclk_hz                      = 26000000,
                .uarttx_pin                     = 11,
 
-               .fw                     = AR6004_HW_1_0_FIRMWARE_FILE,
-               .fw_api2                = AR6004_HW_1_0_FIRMWARE_2_FILE,
+               .fw = {
+                       .dir            = AR6004_HW_1_0_FW_DIR,
+                       .fw             = AR6004_HW_1_0_FIRMWARE_FILE,
+               },
+
                .fw_board               = AR6004_HW_1_0_BOARD_DATA_FILE,
                .fw_default_board       = AR6004_HW_1_0_DEFAULT_BOARD_DATA_FILE,
        },
@@ -100,8 +106,11 @@ static const struct ath6kl_hw hw_list[] = {
                .refclk_hz                      = 40000000,
                .uarttx_pin                     = 11,
 
-               .fw                     = AR6004_HW_1_1_FIRMWARE_FILE,
-               .fw_api2                = AR6004_HW_1_1_FIRMWARE_2_FILE,
+               .fw = {
+                       .dir            = AR6004_HW_1_1_FW_DIR,
+                       .fw             = AR6004_HW_1_1_FIRMWARE_FILE,
+               },
+
                .fw_board               = AR6004_HW_1_1_BOARD_DATA_FILE,
                .fw_default_board       = AR6004_HW_1_1_DEFAULT_BOARD_DATA_FILE,
        },
@@ -452,6 +461,13 @@ int ath6kl_configure_target(struct ath6kl *ar)
        u8 fw_iftype, fw_mode = 0, fw_submode = 0;
        int i, status;
 
+       param = !!(ar->conf_flags & ATH6KL_CONF_UART_DEBUG);
+       if (ath6kl_bmi_write(ar, ath6kl_get_hi_item_addr(ar,
+                            HI_ITEM(hi_serial_enable)), (u8 *)&param, 4)) {
+               ath6kl_err("bmi_write_memory for uart debug failed\n");
+               return -EIO;
+       }
+
        /*
         * Note: Even though the firmware interface type is
         * chosen as BSS_STA for all three interfaces, can
@@ -573,36 +589,6 @@ int ath6kl_configure_target(struct ath6kl *ar)
        return 0;
 }
 
-void ath6kl_core_free(struct ath6kl *ar)
-{
-       wiphy_free(ar->wiphy);
-}
-
-void ath6kl_core_cleanup(struct ath6kl *ar)
-{
-       ath6kl_hif_power_off(ar);
-
-       destroy_workqueue(ar->ath6kl_wq);
-
-       if (ar->htc_target)
-               ath6kl_htc_cleanup(ar->htc_target);
-
-       ath6kl_cookie_cleanup(ar);
-
-       ath6kl_cleanup_amsdu_rxbufs(ar);
-
-       ath6kl_bmi_cleanup(ar);
-
-       ath6kl_debug_cleanup(ar);
-
-       kfree(ar->fw_board);
-       kfree(ar->fw_otp);
-       kfree(ar->fw);
-       kfree(ar->fw_patch);
-
-       ath6kl_deinit_ieee80211_hw(ar);
-}
-
 /* firmware upload */
 static int ath6kl_get_fw(struct ath6kl *ar, const char *filename,
                         u8 **fw, size_t *fw_len)
@@ -626,21 +612,6 @@ static int ath6kl_get_fw(struct ath6kl *ar, const char *filename,
 }
 
 #ifdef CONFIG_OF
-static const char *get_target_ver_dir(const struct ath6kl *ar)
-{
-       switch (ar->version.target_ver) {
-       case AR6003_HW_1_0_VERSION:
-               return "ath6k/AR6003/hw1.0";
-       case AR6003_HW_2_0_VERSION:
-               return "ath6k/AR6003/hw2.0";
-       case AR6003_HW_2_1_1_VERSION:
-               return "ath6k/AR6003/hw2.1.1";
-       }
-       ath6kl_warn("%s: unsupported target version 0x%x.\n", __func__,
-                   ar->version.target_ver);
-       return NULL;
-}
-
 /*
  * Check the device tree for a board-id and use it to construct
  * the pathname to the firmware file.  Used (for now) to find a
@@ -663,7 +634,7 @@ static bool check_device_tree(struct ath6kl *ar)
                        continue;
                }
                snprintf(board_filename, sizeof(board_filename),
-                        "%s/bdata.%s.bin", get_target_ver_dir(ar), board_id);
+                        "%s/bdata.%s.bin", ar->hw.fw.dir, board_id);
 
                ret = ath6kl_get_fw(ar, board_filename, &ar->fw_board,
                                    &ar->fw_board_len);
@@ -730,19 +701,20 @@ static int ath6kl_fetch_board_file(struct ath6kl *ar)
 
 static int ath6kl_fetch_otp_file(struct ath6kl *ar)
 {
-       const char *filename;
+       char filename[100];
        int ret;
 
        if (ar->fw_otp != NULL)
                return 0;
 
-       if (ar->hw.fw_otp == NULL) {
+       if (ar->hw.fw.otp == NULL) {
                ath6kl_dbg(ATH6KL_DBG_BOOT,
                           "no OTP file configured for this hw\n");
                return 0;
        }
 
-       filename = ar->hw.fw_otp;
+       snprintf(filename, sizeof(filename), "%s/%s",
+                ar->hw.fw.dir, ar->hw.fw.otp);
 
        ret = ath6kl_get_fw(ar, filename, &ar->fw_otp,
                            &ar->fw_otp_len);
@@ -755,33 +727,61 @@ static int ath6kl_fetch_otp_file(struct ath6kl *ar)
        return 0;
 }
 
-static int ath6kl_fetch_fw_file(struct ath6kl *ar)
+static int ath6kl_fetch_testmode_file(struct ath6kl *ar)
 {
-       const char *filename;
+       char filename[100];
        int ret;
 
-       if (ar->fw != NULL)
+       if (ar->testmode == 0)
                return 0;
 
-       if (testmode) {
-               if (ar->hw.fw_tcmd == NULL) {
-                       ath6kl_warn("testmode not supported\n");
+       ath6kl_dbg(ATH6KL_DBG_BOOT, "testmode %d\n", ar->testmode);
+
+       if (ar->testmode == 2) {
+               if (ar->hw.fw.utf == NULL) {
+                       ath6kl_warn("testmode 2 not supported\n");
+                       return -EOPNOTSUPP;
+               }
+
+               snprintf(filename, sizeof(filename), "%s/%s",
+                        ar->hw.fw.dir, ar->hw.fw.utf);
+       } else {
+               if (ar->hw.fw.tcmd == NULL) {
+                       ath6kl_warn("testmode 1 not supported\n");
                        return -EOPNOTSUPP;
                }
 
-               filename = ar->hw.fw_tcmd;
+               snprintf(filename, sizeof(filename), "%s/%s",
+                        ar->hw.fw.dir, ar->hw.fw.tcmd);
+       }
 
-               set_bit(TESTMODE, &ar->flag);
+       set_bit(TESTMODE, &ar->flag);
 
-               goto get_fw;
+       ret = ath6kl_get_fw(ar, filename, &ar->fw, &ar->fw_len);
+       if (ret) {
+               ath6kl_err("Failed to get testmode %d firmware file %s: %d\n",
+                          ar->testmode, filename, ret);
+               return ret;
        }
 
-       if (WARN_ON(ar->hw.fw == NULL))
+       return 0;
+}
+
+static int ath6kl_fetch_fw_file(struct ath6kl *ar)
+{
+       char filename[100];
+       int ret;
+
+       if (ar->fw != NULL)
+               return 0;
+
+       /* FIXME: remove WARN_ON() as we won't support FW API 1 for long */
+       if (WARN_ON(ar->hw.fw.fw == NULL))
                return -EINVAL;
 
-       filename = ar->hw.fw;
+       snprintf(filename, sizeof(filename), "%s/%s",
+                ar->hw.fw.dir, ar->hw.fw.fw);
 
-get_fw:
        ret = ath6kl_get_fw(ar, filename, &ar->fw, &ar->fw_len);
        if (ret) {
                ath6kl_err("Failed to get firmware file %s: %d\n",
@@ -794,16 +794,17 @@ get_fw:
 
 static int ath6kl_fetch_patch_file(struct ath6kl *ar)
 {
-       const char *filename;
+       char filename[100];
        int ret;
 
        if (ar->fw_patch != NULL)
                return 0;
 
-       if (ar->hw.fw_patch == NULL)
+       if (ar->hw.fw.patch == NULL)
                return 0;
 
-       filename = ar->hw.fw_patch;
+       snprintf(filename, sizeof(filename), "%s/%s",
+                ar->hw.fw.dir, ar->hw.fw.patch);
 
        ret = ath6kl_get_fw(ar, filename, &ar->fw_patch,
                            &ar->fw_patch_len);
@@ -816,6 +817,34 @@ static int ath6kl_fetch_patch_file(struct ath6kl *ar)
        return 0;
 }
 
+static int ath6kl_fetch_testscript_file(struct ath6kl *ar)
+{
+       char filename[100];
+       int ret;
+
+       if (ar->testmode != 2)
+               return 0;
+
+       if (ar->fw_testscript != NULL)
+               return 0;
+
+       if (ar->hw.fw.testscript == NULL)
+               return 0;
+
+       snprintf(filename, sizeof(filename), "%s/%s",
+               ar->hw.fw.dir, ar->hw.fw.testscript);
+
+       ret = ath6kl_get_fw(ar, filename, &ar->fw_testscript,
+                               &ar->fw_testscript_len);
+       if (ret) {
+               ath6kl_err("Failed to get testscript file %s: %d\n",
+                       filename, ret);
+               return ret;
+       }
+
+       return 0;
+}
+
 static int ath6kl_fetch_fw_api1(struct ath6kl *ar)
 {
        int ret;
@@ -832,23 +861,24 @@ static int ath6kl_fetch_fw_api1(struct ath6kl *ar)
        if (ret)
                return ret;
 
+       ret = ath6kl_fetch_testscript_file(ar);
+       if (ret)
+               return ret;
+
        return 0;
 }
 
-static int ath6kl_fetch_fw_api2(struct ath6kl *ar)
+static int ath6kl_fetch_fw_apin(struct ath6kl *ar, const char *name)
 {
        size_t magic_len, len, ie_len;
        const struct firmware *fw;
        struct ath6kl_fw_ie *hdr;
-       const char *filename;
+       char filename[100];
        const u8 *data;
        int ret, ie_id, i, index, bit;
        __le32 *val;
 
-       if (ar->hw.fw_api2 == NULL)
-               return -EOPNOTSUPP;
-
-       filename = ar->hw.fw_api2;
+       snprintf(filename, sizeof(filename), "%s/%s", ar->hw.fw.dir, name);
 
        ret = request_firmware(&fw, filename, ar->dev);
        if (ret)
@@ -907,6 +937,10 @@ static int ath6kl_fetch_fw_api2(struct ath6kl *ar)
                        ath6kl_dbg(ATH6KL_DBG_BOOT, "found fw image ie (%zd B)\n",
                                ie_len);
 
+                       /* in testmode we already might have a fw file */
+                       if (ar->fw != NULL)
+                               break;
+
                        ar->fw = kmemdup(data, ie_len, GFP_KERNEL);
 
                        if (ar->fw == NULL) {
@@ -1010,7 +1044,7 @@ out:
        return ret;
 }
 
-static int ath6kl_fetch_firmwares(struct ath6kl *ar)
+int ath6kl_init_fetch_firmwares(struct ath6kl *ar)
 {
        int ret;
 
@@ -1018,17 +1052,30 @@ static int ath6kl_fetch_firmwares(struct ath6kl *ar)
        if (ret)
                return ret;
 
-       ret = ath6kl_fetch_fw_api2(ar);
+       ret = ath6kl_fetch_testmode_file(ar);
+       if (ret)
+               return ret;
+
+       ret = ath6kl_fetch_fw_apin(ar, ATH6KL_FW_API3_FILE);
        if (ret == 0) {
-               ath6kl_dbg(ATH6KL_DBG_BOOT, "using fw api 2\n");
-               return 0;
+               ar->fw_api = 3;
+               goto out;
+       }
+
+       ret = ath6kl_fetch_fw_apin(ar, ATH6KL_FW_API2_FILE);
+       if (ret == 0) {
+               ar->fw_api = 2;
+               goto out;
        }
 
        ret = ath6kl_fetch_fw_api1(ar);
        if (ret)
                return ret;
 
-       ath6kl_dbg(ATH6KL_DBG_BOOT, "using fw api 1\n");
+       ar->fw_api = 1;
+
+out:
+       ath6kl_dbg(ATH6KL_DBG_BOOT, "using fw api %d\n", ar->fw_api);
 
        return 0;
 }
@@ -1249,6 +1296,50 @@ static int ath6kl_upload_patch(struct ath6kl *ar)
        return 0;
 }
 
+static int ath6kl_upload_testscript(struct ath6kl *ar)
+{
+       u32 address, param;
+       int ret;
+
+       if (ar->testmode != 2)
+               return 0;
+
+       if (ar->fw_testscript == NULL)
+               return 0;
+
+       address = ar->hw.testscript_addr;
+
+       ath6kl_dbg(ATH6KL_DBG_BOOT, "writing testscript to 0x%x (%zd B)\n",
+               address, ar->fw_testscript_len);
+
+       ret = ath6kl_bmi_write(ar, address, ar->fw_testscript,
+               ar->fw_testscript_len);
+       if (ret) {
+               ath6kl_err("Failed to write testscript file: %d\n", ret);
+               return ret;
+       }
+
+       param = address;
+       ath6kl_bmi_write(ar,
+                       ath6kl_get_hi_item_addr(ar,
+                       HI_ITEM(hi_ota_testscript)),
+                       (unsigned char *) &param, 4);
+
+       param = 4096;
+       ath6kl_bmi_write(ar,
+                       ath6kl_get_hi_item_addr(ar,
+                       HI_ITEM(hi_end_ram_reserve_sz)),
+                       (unsigned char *) &param, 4);
+
+       param = 1;
+       ath6kl_bmi_write(ar,
+                       ath6kl_get_hi_item_addr(ar,
+                       HI_ITEM(hi_test_apps_related)),
+                       (unsigned char *) &param, 4);
+
+       return 0;
+}
+
 static int ath6kl_init_upload(struct ath6kl *ar)
 {
        u32 param, options, sleep, address;
@@ -1357,6 +1448,11 @@ static int ath6kl_init_upload(struct ath6kl *ar)
        if (status)
                return status;
 
+       /* Download the test script */
+       status = ath6kl_upload_testscript(ar);
+       if (status)
+               return status;
+
        /* Restore system sleep */
        address = RTC_BASE_ADDRESS + SYSTEM_SLEEP_ADDRESS;
        status = ath6kl_bmi_reg_write(ar, address, sleep);
@@ -1372,9 +1468,9 @@ static int ath6kl_init_upload(struct ath6kl *ar)
        return status;
 }
 
-static int ath6kl_init_hw_params(struct ath6kl *ar)
+int ath6kl_init_hw_params(struct ath6kl *ar)
 {
-       const struct ath6kl_hw *hw;
+       const struct ath6kl_hw *uninitialized_var(hw);
        int i;
 
        for (i = 0; i < ARRAY_SIZE(hw_list); i++) {
@@ -1481,10 +1577,11 @@ int ath6kl_init_hw_start(struct ath6kl *ar)
 
 
        if (test_and_clear_bit(FIRST_BOOT, &ar->flag)) {
-               ath6kl_info("%s %s fw %s%s\n",
+               ath6kl_info("%s %s fw %s api %d%s\n",
                            ar->hw.name,
                            ath6kl_init_get_hif_name(ar->hif_type),
                            ar->wiphy->fw_version,
+                           ar->fw_api,
                            test_bit(TESTMODE, &ar->flag) ? " testmode" : "");
        }
 
@@ -1549,173 +1646,7 @@ int ath6kl_init_hw_stop(struct ath6kl *ar)
        return 0;
 }
 
-int ath6kl_core_init(struct ath6kl *ar)
-{
-       struct ath6kl_bmi_target_info targ_info;
-       struct net_device *ndev;
-       int ret = 0, i;
-
-       ar->ath6kl_wq = create_singlethread_workqueue("ath6kl");
-       if (!ar->ath6kl_wq)
-               return -ENOMEM;
-
-       ret = ath6kl_bmi_init(ar);
-       if (ret)
-               goto err_wq;
-
-       /*
-        * Turn on power to get hardware (target) version and leave power
-        * on delibrately as we will boot the hardware anyway within few
-        * seconds.
-        */
-       ret = ath6kl_hif_power_on(ar);
-       if (ret)
-               goto err_bmi_cleanup;
-
-       ret = ath6kl_bmi_get_target_info(ar, &targ_info);
-       if (ret)
-               goto err_power_off;
-
-       ar->version.target_ver = le32_to_cpu(targ_info.version);
-       ar->target_type = le32_to_cpu(targ_info.type);
-       ar->wiphy->hw_version = le32_to_cpu(targ_info.version);
-
-       ret = ath6kl_init_hw_params(ar);
-       if (ret)
-               goto err_power_off;
-
-       ar->htc_target = ath6kl_htc_create(ar);
-
-       if (!ar->htc_target) {
-               ret = -ENOMEM;
-               goto err_power_off;
-       }
-
-       ret = ath6kl_fetch_firmwares(ar);
-       if (ret)
-               goto err_htc_cleanup;
-
-       /* FIXME: we should free all firmwares in the error cases below */
-
-       /* Indicate that WMI is enabled (although not ready yet) */
-       set_bit(WMI_ENABLED, &ar->flag);
-       ar->wmi = ath6kl_wmi_init(ar);
-       if (!ar->wmi) {
-               ath6kl_err("failed to initialize wmi\n");
-               ret = -EIO;
-               goto err_htc_cleanup;
-       }
-
-       ath6kl_dbg(ATH6KL_DBG_TRC, "%s: got wmi @ 0x%p.\n", __func__, ar->wmi);
-
-       ret = ath6kl_register_ieee80211_hw(ar);
-       if (ret)
-               goto err_node_cleanup;
-
-       ret = ath6kl_debug_init(ar);
-       if (ret) {
-               wiphy_unregister(ar->wiphy);
-               goto err_node_cleanup;
-       }
-
-       for (i = 0; i < ar->vif_max; i++)
-               ar->avail_idx_map |= BIT(i);
-
-       rtnl_lock();
-
-       /* Add an initial station interface */
-       ndev = ath6kl_interface_add(ar, "wlan%d", NL80211_IFTYPE_STATION, 0,
-                                   INFRA_NETWORK);
-
-       rtnl_unlock();
-
-       if (!ndev) {
-               ath6kl_err("Failed to instantiate a network device\n");
-               ret = -ENOMEM;
-               wiphy_unregister(ar->wiphy);
-               goto err_debug_init;
-       }
-
-
-       ath6kl_dbg(ATH6KL_DBG_TRC, "%s: name=%s dev=0x%p, ar=0x%p\n",
-                       __func__, ndev->name, ndev, ar);
-
-       /* setup access class priority mappings */
-       ar->ac_stream_pri_map[WMM_AC_BK] = 0; /* lowest  */
-       ar->ac_stream_pri_map[WMM_AC_BE] = 1;
-       ar->ac_stream_pri_map[WMM_AC_VI] = 2;
-       ar->ac_stream_pri_map[WMM_AC_VO] = 3; /* highest */
-
-       /* give our connected endpoints some buffers */
-       ath6kl_rx_refill(ar->htc_target, ar->ctrl_ep);
-       ath6kl_rx_refill(ar->htc_target, ar->ac2ep_map[WMM_AC_BE]);
-
-       /* allocate some buffers that handle larger AMSDU frames */
-       ath6kl_refill_amsdu_rxbufs(ar, ATH6KL_MAX_AMSDU_RX_BUFFERS);
-
-       ath6kl_cookie_init(ar);
-
-       ar->conf_flags = ATH6KL_CONF_IGNORE_ERP_BARKER |
-                        ATH6KL_CONF_ENABLE_11N | ATH6KL_CONF_ENABLE_TX_BURST;
-
-       if (suspend_cutpower)
-               ar->conf_flags |= ATH6KL_CONF_SUSPEND_CUTPOWER;
-
-       ar->wiphy->flags |= WIPHY_FLAG_SUPPORTS_FW_ROAM |
-                           WIPHY_FLAG_HAVE_AP_SME |
-                           WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL |
-                           WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD;
-
-       if (test_bit(ATH6KL_FW_CAPABILITY_SCHED_SCAN, ar->fw_capabilities))
-               ar->wiphy->flags |= WIPHY_FLAG_SUPPORTS_SCHED_SCAN;
-
-       ar->wiphy->probe_resp_offload =
-               NL80211_PROBE_RESP_OFFLOAD_SUPPORT_WPS |
-               NL80211_PROBE_RESP_OFFLOAD_SUPPORT_WPS2 |
-               NL80211_PROBE_RESP_OFFLOAD_SUPPORT_P2P |
-               NL80211_PROBE_RESP_OFFLOAD_SUPPORT_80211U;
-
-       set_bit(FIRST_BOOT, &ar->flag);
-
-       ret = ath6kl_init_hw_start(ar);
-       if (ret) {
-               ath6kl_err("Failed to start hardware: %d\n", ret);
-               goto err_rxbuf_cleanup;
-       }
-
-       /*
-        * Set mac address which is received in ready event
-        * FIXME: Move to ath6kl_interface_add()
-        */
-       memcpy(ndev->dev_addr, ar->mac_addr, ETH_ALEN);
-
-       return ret;
-
-err_rxbuf_cleanup:
-       ath6kl_htc_flush_rx_buf(ar->htc_target);
-       ath6kl_cleanup_amsdu_rxbufs(ar);
-       rtnl_lock();
-       ath6kl_deinit_if_data(netdev_priv(ndev));
-       rtnl_unlock();
-       wiphy_unregister(ar->wiphy);
-err_debug_init:
-       ath6kl_debug_cleanup(ar);
-err_node_cleanup:
-       ath6kl_wmi_shutdown(ar->wmi);
-       clear_bit(WMI_ENABLED, &ar->flag);
-       ar->wmi = NULL;
-err_htc_cleanup:
-       ath6kl_htc_cleanup(ar->htc_target);
-err_power_off:
-       ath6kl_hif_power_off(ar);
-err_bmi_cleanup:
-       ath6kl_bmi_cleanup(ar);
-err_wq:
-       destroy_workqueue(ar->ath6kl_wq);
-
-       return ret;
-}
-
+/* FIXME: move this to cfg80211.c and rename to ath6kl_cfg80211_vif_stop() */
 void ath6kl_cleanup_vif(struct ath6kl_vif *vif, bool wmi_ready)
 {
        static u8 bcast_mac[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
@@ -1747,6 +1678,7 @@ void ath6kl_cleanup_vif(struct ath6kl_vif *vif, bool wmi_ready)
 void ath6kl_stop_txrx(struct ath6kl *ar)
 {
        struct ath6kl_vif *vif, *tmp_vif;
+       int i;
 
        set_bit(DESTROY_IN_PROGRESS, &ar->flag);
 
@@ -1755,13 +1687,16 @@ void ath6kl_stop_txrx(struct ath6kl *ar)
                return;
        }
 
+       for (i = 0; i < AP_MAX_NUM_STA; i++)
+               aggr_reset_state(ar->sta_list[i].aggr_conn);
+
        spin_lock_bh(&ar->list_lock);
        list_for_each_entry_safe(vif, tmp_vif, &ar->vif_list, list) {
                list_del(&vif->list);
                spin_unlock_bh(&ar->list_lock);
                ath6kl_cleanup_vif(vif, test_bit(WMI_READY, &ar->flag));
                rtnl_lock();
-               ath6kl_deinit_if_data(vif);
+               ath6kl_cfg80211_vif_cleanup(vif);
                rtnl_unlock();
                spin_lock_bh(&ar->list_lock);
        }
@@ -1796,3 +1731,4 @@ void ath6kl_stop_txrx(struct ath6kl *ar)
 
        clear_bit(WLAN_ENABLED, &ar->flag);
 }
+EXPORT_SYMBOL(ath6kl_stop_txrx);
index eea3c74..b96d01a 100644 (file)
@@ -52,9 +52,11 @@ struct ath6kl_sta *ath6kl_find_sta_by_aid(struct ath6kl *ar, u8 aid)
        return conn;
 }
 
-static void ath6kl_add_new_sta(struct ath6kl *ar, u8 *mac, u16 aid, u8 *wpaie,
-                       u8 ielen, u8 keymgmt, u8 ucipher, u8 auth)
+static void ath6kl_add_new_sta(struct ath6kl_vif *vif, u8 *mac, u16 aid,
+                              u8 *wpaie, size_t ielen, u8 keymgmt,
+                              u8 ucipher, u8 auth, u8 apsd_info)
 {
+       struct ath6kl *ar = vif->ar;
        struct ath6kl_sta *sta;
        u8 free_slot;
 
@@ -68,9 +70,11 @@ static void ath6kl_add_new_sta(struct ath6kl *ar, u8 *mac, u16 aid, u8 *wpaie,
        sta->keymgmt = keymgmt;
        sta->ucipher = ucipher;
        sta->auth = auth;
+       sta->apsd_info = apsd_info;
 
        ar->sta_list_index = ar->sta_list_index | (1 << free_slot);
        ar->ap_stats.sta[free_slot].aid = cpu_to_le32(aid);
+       aggr_conn_init(vif, vif->aggr_cntxt, sta->aggr_conn);
 }
 
 static void ath6kl_sta_cleanup(struct ath6kl *ar, u8 i)
@@ -80,6 +84,7 @@ static void ath6kl_sta_cleanup(struct ath6kl *ar, u8 i)
        /* empty the queued pkts in the PS queue if any */
        spin_lock_bh(&sta->psq_lock);
        skb_queue_purge(&sta->psq);
+       skb_queue_purge(&sta->apsdq);
        spin_unlock_bh(&sta->psq_lock);
 
        memset(&ar->ap_stats.sta[sta->aid - 1], 0,
@@ -90,7 +95,7 @@ static void ath6kl_sta_cleanup(struct ath6kl *ar, u8 i)
        sta->sta_flags = 0;
 
        ar->sta_list_index = ar->sta_list_index & ~(1 << i);
-
+       aggr_reset_state(sta->aggr_conn);
 }
 
 static u8 ath6kl_remove_sta(struct ath6kl *ar, u8 *mac, u16 reason)
@@ -252,7 +257,7 @@ int ath6kl_read_fwlogs(struct ath6kl *ar)
        struct ath6kl_dbglog_hdr debug_hdr;
        struct ath6kl_dbglog_buf debug_buf;
        u32 address, length, dropped, firstbuf, debug_hdr_addr;
-       int ret = 0, loop;
+       int ret, loop;
        u8 *buf;
 
        buf = kmalloc(ATH6KL_FWLOG_PAYLOAD_SIZE, GFP_KERNEL);
@@ -347,9 +352,6 @@ void ath6kl_reset_device(struct ath6kl *ar, u32 target_type,
        case TARGET_TYPE_AR6004:
                address = AR6004_RESET_CONTROL_ADDRESS;
                break;
-       default:
-               address = AR6003_RESET_CONTROL_ADDRESS;
-               break;
        }
 
        status = ath6kl_diag_write32(ar, address, data);
@@ -363,7 +365,7 @@ static void ath6kl_install_static_wep_keys(struct ath6kl_vif *vif)
        u8 index;
        u8 keyusage;
 
-       for (index = WMI_MIN_KEY_INDEX; index <= WMI_MAX_KEY_INDEX; index++) {
+       for (index = 0; index <= WMI_MAX_KEY_INDEX; index++) {
                if (vif->wep_key_list[index].key_len) {
                        keyusage = GROUP_USAGE;
                        if (index == vif->def_txkey_index)
@@ -428,9 +430,8 @@ void ath6kl_connect_ap_mode_bss(struct ath6kl_vif *vif, u16 channel)
 
 void ath6kl_connect_ap_mode_sta(struct ath6kl_vif *vif, u16 aid, u8 *mac_addr,
                                u8 keymgmt, u8 ucipher, u8 auth,
-                               u8 assoc_req_len, u8 *assoc_info)
+                               u8 assoc_req_len, u8 *assoc_info, u8 apsd_info)
 {
-       struct ath6kl *ar = vif->ar;
        u8 *ies = NULL, *wpa_ie = NULL, *pos;
        size_t ies_len = 0;
        struct station_info sinfo;
@@ -484,9 +485,9 @@ void ath6kl_connect_ap_mode_sta(struct ath6kl_vif *vif, u16 aid, u8 *mac_addr,
                pos += 2 + pos[1];
        }
 
-       ath6kl_add_new_sta(ar, mac_addr, aid, wpa_ie,
+       ath6kl_add_new_sta(vif, mac_addr, aid, wpa_ie,
                           wpa_ie ? 2 + wpa_ie[1] : 0,
-                          keymgmt, ucipher, auth);
+                          keymgmt, ucipher, auth, apsd_info);
 
        /* send event to application */
        memset(&sinfo, 0, sizeof(sinfo));
@@ -587,10 +588,11 @@ void ath6kl_connect_event(struct ath6kl_vif *vif, u16 channel, u8 *bssid,
        memcpy(vif->bssid, bssid, sizeof(vif->bssid));
        vif->bss_ch = channel;
 
-       if ((vif->nw_type == INFRA_NETWORK))
+       if ((vif->nw_type == INFRA_NETWORK)) {
+               ar->listen_intvl_b = listen_int;
                ath6kl_wmi_listeninterval_cmd(ar->wmi, vif->fw_vif_idx,
-                                             ar->listen_intvl_t,
-                                             ar->listen_intvl_b);
+                                             0, ar->listen_intvl_b);
+       }
 
        netif_wake_queue(vif->ndev);
 
@@ -601,7 +603,7 @@ void ath6kl_connect_event(struct ath6kl_vif *vif, u16 channel, u8 *bssid,
        netif_carrier_on(vif->ndev);
        spin_unlock_bh(&vif->if_lock);
 
-       aggr_reset_state(vif->aggr_cntxt);
+       aggr_reset_state(vif->aggr_cntxt->aggr_conn);
        vif->reconnect_flag = 0;
 
        if ((vif->nw_type == ADHOC_NETWORK) && ar->ibss_ps_enable) {
@@ -923,7 +925,7 @@ void ath6kl_disconnect_event(struct ath6kl_vif *vif, u8 reason, u8 *bssid,
                                       assoc_resp_len, assoc_info,
                                       prot_reason_status);
 
-       aggr_reset_state(vif->aggr_cntxt);
+       aggr_reset_state(vif->aggr_cntxt->aggr_conn);
 
        del_timer(&vif->disconnect_timer);
 
@@ -1020,11 +1022,155 @@ static struct net_device_stats *ath6kl_get_stats(struct net_device *dev)
        return &vif->net_stats;
 }
 
-static struct net_device_ops ath6kl_netdev_ops = {
+static int ath6kl_set_features(struct net_device *dev,
+                              netdev_features_t features)
+{
+       struct ath6kl_vif *vif = netdev_priv(dev);
+       struct ath6kl *ar = vif->ar;
+       int err = 0;
+
+       if ((features & NETIF_F_RXCSUM) &&
+           (ar->rx_meta_ver != WMI_META_VERSION_2)) {
+               ar->rx_meta_ver = WMI_META_VERSION_2;
+               err = ath6kl_wmi_set_rx_frame_format_cmd(ar->wmi,
+                                                        vif->fw_vif_idx,
+                                                        ar->rx_meta_ver, 0, 0);
+               if (err) {
+                       dev->features = features & ~NETIF_F_RXCSUM;
+                       return err;
+               }
+       } else if (!(features & NETIF_F_RXCSUM) &&
+                  (ar->rx_meta_ver == WMI_META_VERSION_2)) {
+               ar->rx_meta_ver = 0;
+               err = ath6kl_wmi_set_rx_frame_format_cmd(ar->wmi,
+                                                        vif->fw_vif_idx,
+                                                        ar->rx_meta_ver, 0, 0);
+               if (err) {
+                       dev->features = features | NETIF_F_RXCSUM;
+                       return err;
+               }
+
+       }
+
+       return err;
+}
+
+static void ath6kl_set_multicast_list(struct net_device *ndev)
+{
+       struct ath6kl_vif *vif = netdev_priv(ndev);
+       bool mc_all_on = false, mc_all_off = false;
+       int mc_count = netdev_mc_count(ndev);
+       struct netdev_hw_addr *ha;
+       bool found;
+       struct ath6kl_mc_filter *mc_filter, *tmp;
+       struct list_head mc_filter_new;
+       int ret;
+
+       if (!test_bit(WMI_READY, &vif->ar->flag) ||
+           !test_bit(WLAN_ENABLED, &vif->flags))
+               return;
+
+       mc_all_on = !!(ndev->flags & IFF_PROMISC) ||
+                   !!(ndev->flags & IFF_ALLMULTI) ||
+                   !!(mc_count > ATH6K_MAX_MC_FILTERS_PER_LIST);
+
+       mc_all_off = !(ndev->flags & IFF_MULTICAST) || mc_count == 0;
+
+       if (mc_all_on || mc_all_off) {
+               /* Enable/disable all multicast */
+               ath6kl_dbg(ATH6KL_DBG_TRC, "%s multicast filter\n",
+                         mc_all_on ? "enabling" : "disabling");
+               ret = ath6kl_wmi_mcast_filter_cmd(vif->ar->wmi, vif->fw_vif_idx,
+                                                 mc_all_on);
+               if (ret)
+                       ath6kl_warn("Failed to %s multicast receive\n",
+                                   mc_all_on ? "enable" : "disable");
+               return;
+       }
+
+       list_for_each_entry_safe(mc_filter, tmp, &vif->mc_filter, list) {
+               found = false;
+               netdev_for_each_mc_addr(ha, ndev) {
+                       if (memcmp(ha->addr, mc_filter->hw_addr,
+                           ATH6KL_MCAST_FILTER_MAC_ADDR_SIZE) == 0) {
+                               found = true;
+                               break;
+                       }
+               }
+
+               if (!found) {
+                       /*
+                        * Delete the filter which was previously set
+                        * but not in the new request.
+                        */
+                       ath6kl_dbg(ATH6KL_DBG_TRC,
+                                  "Removing %pM from multicast filter\n",
+                                  mc_filter->hw_addr);
+                       ret = ath6kl_wmi_add_del_mcast_filter_cmd(vif->ar->wmi,
+                                       vif->fw_vif_idx, mc_filter->hw_addr,
+                                       false);
+                       if (ret) {
+                               ath6kl_warn("Failed to remove multicast filter:%pM\n",
+                                            mc_filter->hw_addr);
+                               return;
+                       }
+
+                       list_del(&mc_filter->list);
+                       kfree(mc_filter);
+               }
+       }
+
+       INIT_LIST_HEAD(&mc_filter_new);
+
+       netdev_for_each_mc_addr(ha, ndev) {
+               found = false;
+               list_for_each_entry(mc_filter, &vif->mc_filter, list) {
+                       if (memcmp(ha->addr, mc_filter->hw_addr,
+                           ATH6KL_MCAST_FILTER_MAC_ADDR_SIZE) == 0) {
+                               found = true;
+                               break;
+                       }
+               }
+
+               if (!found) {
+                       mc_filter = kzalloc(sizeof(struct ath6kl_mc_filter),
+                                           GFP_ATOMIC);
+                       if (!mc_filter) {
+                               WARN_ON(1);
+                               goto out;
+                       }
+
+                       memcpy(mc_filter->hw_addr, ha->addr,
+                              ATH6KL_MCAST_FILTER_MAC_ADDR_SIZE);
+                       /* Set the multicast filter */
+                       ath6kl_dbg(ATH6KL_DBG_TRC,
+                                  "Adding %pM to multicast filter list\n",
+                                  mc_filter->hw_addr);
+                       ret = ath6kl_wmi_add_del_mcast_filter_cmd(vif->ar->wmi,
+                                       vif->fw_vif_idx, mc_filter->hw_addr,
+                                       true);
+                       if (ret) {
+                               ath6kl_warn("Failed to add multicast filter :%pM\n",
+                                            mc_filter->hw_addr);
+                               kfree(mc_filter);
+                               goto out;
+                       }
+
+                       list_add_tail(&mc_filter->list, &mc_filter_new);
+               }
+       }
+
+out:
+       list_splice_tail(&mc_filter_new, &vif->mc_filter);
+}
+
+static const struct net_device_ops ath6kl_netdev_ops = {
        .ndo_open               = ath6kl_open,
        .ndo_stop               = ath6kl_close,
        .ndo_start_xmit         = ath6kl_data_tx,
        .ndo_get_stats          = ath6kl_get_stats,
+       .ndo_set_features       = ath6kl_set_features,
+       .ndo_set_rx_mode        = ath6kl_set_multicast_list,
 };
 
 void init_netdev(struct net_device *dev)
index 9475e2d..4febee7 100644 (file)
@@ -49,11 +49,13 @@ struct ath6kl_sdio {
        /* scatter request list head */
        struct list_head scat_req;
 
+       /* Avoids disabling irq while the interrupts being handled */
+       struct mutex mtx_irq;
+
        spinlock_t scat_lock;
        bool scatter_enabled;
 
        bool is_disabled;
-       atomic_t irq_handling;
        const struct sdio_device_id *id;
        struct work_struct wr_async_work;
        struct list_head wr_asyncq;
@@ -460,8 +462,7 @@ static void ath6kl_sdio_irq_handler(struct sdio_func *func)
        ath6kl_dbg(ATH6KL_DBG_SDIO, "irq\n");
 
        ar_sdio = sdio_get_drvdata(func);
-       atomic_set(&ar_sdio->irq_handling, 1);
-
+       mutex_lock(&ar_sdio->mtx_irq);
        /*
         * Release the host during interrups so we can pick it back up when
         * we process commands.
@@ -470,7 +471,7 @@ static void ath6kl_sdio_irq_handler(struct sdio_func *func)
 
        status = ath6kl_hif_intr_bh_handler(ar_sdio->ar);
        sdio_claim_host(ar_sdio->func);
-       atomic_set(&ar_sdio->irq_handling, 0);
+       mutex_unlock(&ar_sdio->mtx_irq);
        WARN_ON(status && status != -ECANCELED);
 }
 
@@ -578,17 +579,14 @@ static void ath6kl_sdio_irq_disable(struct ath6kl *ar)
 
        sdio_claim_host(ar_sdio->func);
 
-       /* Mask our function IRQ */
-       while (atomic_read(&ar_sdio->irq_handling)) {
-               sdio_release_host(ar_sdio->func);
-               schedule_timeout(HZ / 10);
-               sdio_claim_host(ar_sdio->func);
-       }
+       mutex_lock(&ar_sdio->mtx_irq);
 
        ret = sdio_release_irq(ar_sdio->func);
        if (ret)
                ath6kl_err("Failed to release sdio irq: %d\n", ret);
 
+       mutex_unlock(&ar_sdio->mtx_irq);
+
        sdio_release_host(ar_sdio->func);
 }
 
@@ -772,7 +770,6 @@ static int ath6kl_sdio_config(struct ath6kl *ar)
        if (ret) {
                ath6kl_err("Set sdio block size %d failed: %d)\n",
                           HIF_MBOX_BLOCK_SIZE, ret);
-               sdio_release_host(func);
                goto out;
        }
 
@@ -782,7 +779,7 @@ out:
        return ret;
 }
 
-static int ath6kl_sdio_suspend(struct ath6kl *ar, struct cfg80211_wowlan *wow)
+static int ath6kl_set_sdio_pm_caps(struct ath6kl *ar)
 {
        struct ath6kl_sdio *ar_sdio = ath6kl_sdio_priv(ar);
        struct sdio_func *func = ar_sdio->func;
@@ -793,60 +790,95 @@ static int ath6kl_sdio_suspend(struct ath6kl *ar, struct cfg80211_wowlan *wow)
 
        ath6kl_dbg(ATH6KL_DBG_SUSPEND, "sdio suspend pm_caps 0x%x\n", flags);
 
-       if (!(flags & MMC_PM_KEEP_POWER) ||
-           (ar->conf_flags & ATH6KL_CONF_SUSPEND_CUTPOWER)) {
-               /* as host doesn't support keep power we need to cut power */
-               return ath6kl_cfg80211_suspend(ar, ATH6KL_CFG_SUSPEND_CUTPOWER,
-                                              NULL);
-       }
+       if (!(flags & MMC_PM_WAKE_SDIO_IRQ) ||
+           !(flags & MMC_PM_KEEP_POWER))
+               return -EINVAL;
 
        ret = sdio_set_host_pm_flags(func, MMC_PM_KEEP_POWER);
        if (ret) {
-               printk(KERN_ERR "ath6kl: set sdio pm flags failed: %d\n",
-                      ret);
+               ath6kl_err("set sdio keep pwr flag failed: %d\n", ret);
                return ret;
        }
 
-       if (!(flags & MMC_PM_WAKE_SDIO_IRQ))
-               goto deepsleep;
-
        /* sdio irq wakes up host */
+       ret = sdio_set_host_pm_flags(func, MMC_PM_WAKE_SDIO_IRQ);
+       if (ret)
+               ath6kl_err("set sdio wake irq flag failed: %d\n", ret);
+
+       return ret;
+}
+
+static int ath6kl_sdio_suspend(struct ath6kl *ar, struct cfg80211_wowlan *wow)
+{
+       struct ath6kl_sdio *ar_sdio = ath6kl_sdio_priv(ar);
+       struct sdio_func *func = ar_sdio->func;
+       mmc_pm_flag_t flags;
+       int ret;
 
        if (ar->state == ATH6KL_STATE_SCHED_SCAN) {
+               ath6kl_dbg(ATH6KL_DBG_SUSPEND, "sched scan is in progress\n");
+
+               ret = ath6kl_set_sdio_pm_caps(ar);
+               if (ret)
+                       goto cut_pwr;
+
                ret =  ath6kl_cfg80211_suspend(ar,
                                               ATH6KL_CFG_SUSPEND_SCHED_SCAN,
                                               NULL);
-               if (ret) {
-                       ath6kl_warn("Schedule scan suspend failed: %d", ret);
-                       return ret;
-               }
+               if (ret)
+                       goto cut_pwr;
+
+               return 0;
+       }
+
+       if (ar->suspend_mode == WLAN_POWER_STATE_WOW ||
+           (!ar->suspend_mode && wow)) {
 
-               ret = sdio_set_host_pm_flags(func, MMC_PM_WAKE_SDIO_IRQ);
+               ret = ath6kl_set_sdio_pm_caps(ar);
                if (ret)
-                       ath6kl_warn("set sdio wake irq flag failed: %d\n", ret);
+                       goto cut_pwr;
 
-               return ret;
+               ret = ath6kl_cfg80211_suspend(ar, ATH6KL_CFG_SUSPEND_WOW, wow);
+               if (ret)
+                       goto cut_pwr;
+
+               return 0;
        }
 
-       if (wow) {
+       if (ar->suspend_mode == WLAN_POWER_STATE_DEEP_SLEEP ||
+           !ar->suspend_mode) {
+
+               flags = sdio_get_host_pm_caps(func);
+               if (!(flags & MMC_PM_KEEP_POWER))
+                       goto cut_pwr;
+
+               ret = sdio_set_host_pm_flags(func, MMC_PM_KEEP_POWER);
+               if (ret)
+                       goto cut_pwr;
+
                /*
-                * The host sdio controller is capable of keep power and
-                * sdio irq wake up at this point. It's fine to continue
-                * wow suspend operation.
+                * Workaround to support Deep Sleep with MSM, set the host pm
+                * flag as MMC_PM_WAKE_SDIO_IRQ to allow SDCC deiver to disable
+                * the sdc2_clock and internally allows MSM to enter
+                * TCXO shutdown properly.
                 */
-               ret = ath6kl_cfg80211_suspend(ar, ATH6KL_CFG_SUSPEND_WOW, wow);
-               if (ret)
-                       return ret;
+               if ((flags & MMC_PM_WAKE_SDIO_IRQ)) {
+                       ret = sdio_set_host_pm_flags(func,
+                                               MMC_PM_WAKE_SDIO_IRQ);
+                       if (ret)
+                               goto cut_pwr;
+               }
 
-               ret = sdio_set_host_pm_flags(func, MMC_PM_WAKE_SDIO_IRQ);
+               ret = ath6kl_cfg80211_suspend(ar, ATH6KL_CFG_SUSPEND_DEEPSLEEP,
+                                             NULL);
                if (ret)
-                       ath6kl_err("set sdio wake irq flag failed: %d\n", ret);
+                       goto cut_pwr;
 
-               return ret;
+               return 0;
        }
 
-deepsleep:
-       return ath6kl_cfg80211_suspend(ar, ATH6KL_CFG_SUSPEND_DEEPSLEEP, NULL);
+cut_pwr:
+       return ath6kl_cfg80211_suspend(ar, ATH6KL_CFG_SUSPEND_CUTPOWER, NULL);
 }
 
 static int ath6kl_sdio_resume(struct ath6kl *ar)
@@ -1253,6 +1285,7 @@ static int ath6kl_sdio_probe(struct sdio_func *func,
        spin_lock_init(&ar_sdio->scat_lock);
        spin_lock_init(&ar_sdio->wr_async_lock);
        mutex_init(&ar_sdio->dma_buffer_mutex);
+       mutex_init(&ar_sdio->mtx_irq);
 
        INIT_LIST_HEAD(&ar_sdio->scat_req);
        INIT_LIST_HEAD(&ar_sdio->bus_req_freeq);
@@ -1263,7 +1296,7 @@ static int ath6kl_sdio_probe(struct sdio_func *func,
        for (count = 0; count < BUS_REQUEST_MAX_NUM; count++)
                ath6kl_sdio_free_bus_req(ar_sdio, &ar_sdio->bus_req[count]);
 
-       ar = ath6kl_core_alloc(&ar_sdio->func->dev);
+       ar = ath6kl_core_create(&ar_sdio->func->dev);
        if (!ar) {
                ath6kl_err("Failed to alloc ath6kl core\n");
                ret = -ENOMEM;
@@ -1293,7 +1326,7 @@ static int ath6kl_sdio_probe(struct sdio_func *func,
        return ret;
 
 err_core_alloc:
-       ath6kl_core_free(ar_sdio->ar);
+       ath6kl_core_destroy(ar_sdio->ar);
 err_dma:
        kfree(ar_sdio->dma_buffer);
 err_hif:
@@ -1316,6 +1349,7 @@ static void ath6kl_sdio_remove(struct sdio_func *func)
        cancel_work_sync(&ar_sdio->wr_async_work);
 
        ath6kl_core_cleanup(ar_sdio->ar);
+       ath6kl_core_destroy(ar_sdio->ar);
 
        kfree(ar_sdio->dma_buffer);
        kfree(ar_sdio);
@@ -1332,7 +1366,7 @@ static const struct sdio_device_id ath6kl_sdio_devices[] = {
 MODULE_DEVICE_TABLE(sdio, ath6kl_sdio_devices);
 
 static struct sdio_driver ath6kl_sdio_driver = {
-       .name = "ath6kl",
+       .name = "ath6kl_sdio",
        .id_table = ath6kl_sdio_devices,
        .probe = ath6kl_sdio_probe,
        .remove = ath6kl_sdio_remove,
@@ -1362,19 +1396,19 @@ MODULE_AUTHOR("Atheros Communications, Inc.");
 MODULE_DESCRIPTION("Driver support for Atheros AR600x SDIO devices");
 MODULE_LICENSE("Dual BSD/GPL");
 
-MODULE_FIRMWARE(AR6003_HW_2_0_OTP_FILE);
-MODULE_FIRMWARE(AR6003_HW_2_0_FIRMWARE_FILE);
-MODULE_FIRMWARE(AR6003_HW_2_0_PATCH_FILE);
+MODULE_FIRMWARE(AR6003_HW_2_0_FW_DIR "/" AR6003_HW_2_0_OTP_FILE);
+MODULE_FIRMWARE(AR6003_HW_2_0_FW_DIR "/" AR6003_HW_2_0_FIRMWARE_FILE);
+MODULE_FIRMWARE(AR6003_HW_2_0_FW_DIR "/" AR6003_HW_2_0_PATCH_FILE);
 MODULE_FIRMWARE(AR6003_HW_2_0_BOARD_DATA_FILE);
 MODULE_FIRMWARE(AR6003_HW_2_0_DEFAULT_BOARD_DATA_FILE);
-MODULE_FIRMWARE(AR6003_HW_2_1_1_OTP_FILE);
-MODULE_FIRMWARE(AR6003_HW_2_1_1_FIRMWARE_FILE);
-MODULE_FIRMWARE(AR6003_HW_2_1_1_PATCH_FILE);
+MODULE_FIRMWARE(AR6003_HW_2_1_1_FW_DIR "/" AR6003_HW_2_1_1_OTP_FILE);
+MODULE_FIRMWARE(AR6003_HW_2_1_1_FW_DIR "/" AR6003_HW_2_1_1_FIRMWARE_FILE);
+MODULE_FIRMWARE(AR6003_HW_2_1_1_FW_DIR "/" AR6003_HW_2_1_1_PATCH_FILE);
 MODULE_FIRMWARE(AR6003_HW_2_1_1_BOARD_DATA_FILE);
 MODULE_FIRMWARE(AR6003_HW_2_1_1_DEFAULT_BOARD_DATA_FILE);
-MODULE_FIRMWARE(AR6004_HW_1_0_FIRMWARE_FILE);
+MODULE_FIRMWARE(AR6004_HW_1_0_FW_DIR "/" AR6004_HW_1_0_FIRMWARE_FILE);
 MODULE_FIRMWARE(AR6004_HW_1_0_BOARD_DATA_FILE);
 MODULE_FIRMWARE(AR6004_HW_1_0_DEFAULT_BOARD_DATA_FILE);
-MODULE_FIRMWARE(AR6004_HW_1_1_FIRMWARE_FILE);
+MODULE_FIRMWARE(AR6004_HW_1_1_FW_DIR "/" AR6004_HW_1_1_FIRMWARE_FILE);
 MODULE_FIRMWARE(AR6004_HW_1_1_BOARD_DATA_FILE);
 MODULE_FIRMWARE(AR6004_HW_1_1_DEFAULT_BOARD_DATA_FILE);
index 381eb66..f0cd61d 100644 (file)
@@ -15,6 +15,7 @@
  */
 
 #include "testmode.h"
+#include "debug.h"
 
 #include <net/netlink.h>
 
@@ -30,7 +31,7 @@ enum ath6kl_tm_attr {
 
 enum ath6kl_tm_cmd {
        ATH6KL_TM_CMD_TCMD              = 0,
-       ATH6KL_TM_CMD_RX_REPORT         = 1,
+       ATH6KL_TM_CMD_RX_REPORT         = 1,    /* not used anymore */
 };
 
 #define ATH6KL_TM_DATA_MAX_LEN         5000
@@ -41,84 +42,33 @@ static const struct nla_policy ath6kl_tm_policy[ATH6KL_TM_ATTR_MAX + 1] = {
                                            .len = ATH6KL_TM_DATA_MAX_LEN },
 };
 
-void ath6kl_tm_rx_report_event(struct ath6kl *ar, void *buf, size_t buf_len)
+void ath6kl_tm_rx_event(struct ath6kl *ar, void *buf, size_t buf_len)
 {
-       if (down_interruptible(&ar->sem))
-               return;
-
-       kfree(ar->tm.rx_report);
-
-       ar->tm.rx_report = kmemdup(buf, buf_len, GFP_KERNEL);
-       ar->tm.rx_report_len = buf_len;
-
-       up(&ar->sem);
-
-       wake_up(&ar->event_wq);
-}
-
-static int ath6kl_tm_rx_report(struct ath6kl *ar, void *buf, size_t buf_len,
-                              struct sk_buff *skb)
-{
-       int ret = 0;
-       long left;
-
-       if (down_interruptible(&ar->sem))
-               return -ERESTARTSYS;
-
-       if (!test_bit(WMI_READY, &ar->flag)) {
-               ret = -EIO;
-               goto out;
-       }
-
-       if (test_bit(DESTROY_IN_PROGRESS, &ar->flag)) {
-               ret = -EBUSY;
-               goto out;
-       }
-
-       if (ath6kl_wmi_test_cmd(ar->wmi, buf, buf_len) < 0) {
-               up(&ar->sem);
-               return -EIO;
-       }
-
-       left = wait_event_interruptible_timeout(ar->event_wq,
-                                               ar->tm.rx_report != NULL,
-                                               WMI_TIMEOUT);
+       struct sk_buff *skb;
 
-       if (left == 0) {
-               ret = -ETIMEDOUT;
-               goto out;
-       } else if (left < 0) {
-               ret = left;
-               goto out;
-       }
+       if (!buf || buf_len == 0)
+               return;
 
-       if (ar->tm.rx_report == NULL || ar->tm.rx_report_len == 0) {
-               ret = -EINVAL;
-               goto out;
+       skb = cfg80211_testmode_alloc_event_skb(ar->wiphy, buf_len, GFP_KERNEL);
+       if (!skb) {
+               ath6kl_warn("failed to allocate testmode rx skb!\n");
+               return;
        }
-
-       NLA_PUT(skb, ATH6KL_TM_ATTR_DATA, ar->tm.rx_report_len,
-               ar->tm.rx_report);
-
-       kfree(ar->tm.rx_report);
-       ar->tm.rx_report = NULL;
-
-out:
-       up(&ar->sem);
-
-       return ret;
+       NLA_PUT_U32(skb, ATH6KL_TM_ATTR_CMD, ATH6KL_TM_CMD_TCMD);
+       NLA_PUT(skb, ATH6KL_TM_ATTR_DATA, buf_len, buf);
+       cfg80211_testmode_event(skb, GFP_KERNEL);
+       return;
 
 nla_put_failure:
-       ret = -ENOBUFS;
-       goto out;
+       kfree_skb(skb);
+       ath6kl_warn("nla_put failed on testmode rx skb!\n");
 }
 
 int ath6kl_tm_cmd(struct wiphy *wiphy, void *data, int len)
 {
        struct ath6kl *ar = wiphy_priv(wiphy);
        struct nlattr *tb[ATH6KL_TM_ATTR_MAX + 1];
-       int err, buf_len, reply_len;
-       struct sk_buff *skb;
+       int err, buf_len;
        void *buf;
 
        err = nla_parse(tb, ATH6KL_TM_ATTR_MAX, data, len,
@@ -143,24 +93,6 @@ int ath6kl_tm_cmd(struct wiphy *wiphy, void *data, int len)
 
                break;
        case ATH6KL_TM_CMD_RX_REPORT:
-               if (!tb[ATH6KL_TM_ATTR_DATA])
-                       return -EINVAL;
-
-               buf = nla_data(tb[ATH6KL_TM_ATTR_DATA]);
-               buf_len = nla_len(tb[ATH6KL_TM_ATTR_DATA]);
-
-               reply_len = nla_total_size(ATH6KL_TM_DATA_MAX_LEN);
-               skb = cfg80211_testmode_alloc_reply_skb(wiphy, reply_len);
-               if (!skb)
-                       return -ENOMEM;
-
-               err = ath6kl_tm_rx_report(ar, buf, buf_len, skb);
-               if (err < 0) {
-                       kfree_skb(skb);
-                       return err;
-               }
-
-               return cfg80211_testmode_reply(skb);
        default:
                return -EOPNOTSUPP;
        }
index 43dffcc..7fd47a6 100644 (file)
 
 #ifdef CONFIG_NL80211_TESTMODE
 
-void ath6kl_tm_rx_report_event(struct ath6kl *ar, void *buf, size_t buf_len);
+void ath6kl_tm_rx_event(struct ath6kl *ar, void *buf, size_t buf_len);
 int ath6kl_tm_cmd(struct wiphy *wiphy, void *data, int len);
 
 #else
 
-static inline void ath6kl_tm_rx_report_event(struct ath6kl *ar, void *buf,
-                                            size_t buf_len)
+static inline void ath6kl_tm_rx_event(struct ath6kl *ar, void *buf,
+                                     size_t buf_len)
 {
 }
 
index 506a303..a3dc694 100644 (file)
 #include "core.h"
 #include "debug.h"
 
+/*
+ * tid - tid_mux0..tid_mux3
+ * aid - tid_mux4..tid_mux7
+ */
+#define ATH6KL_TID_MASK 0xf
+#define ATH6KL_AID_SHIFT 4
+
+static inline u8 ath6kl_get_tid(u8 tid_mux)
+{
+       return tid_mux & ATH6KL_TID_MASK;
+}
+
+static inline u8 ath6kl_get_aid(u8 tid_mux)
+{
+       return tid_mux >> ATH6KL_AID_SHIFT;
+}
+
 static u8 ath6kl_ibss_map_epid(struct sk_buff *skb, struct net_device *dev,
                               u32 *map_no)
 {
@@ -77,12 +94,118 @@ static u8 ath6kl_ibss_map_epid(struct sk_buff *skb, struct net_device *dev,
        return ar->node_map[ep_map].ep_id;
 }
 
+static bool ath6kl_process_uapsdq(struct ath6kl_sta *conn,
+                               struct ath6kl_vif *vif,
+                               struct sk_buff *skb,
+                               u32 *flags)
+{
+       struct ath6kl *ar = vif->ar;
+       bool is_apsdq_empty = false;
+       struct ethhdr *datap = (struct ethhdr *) skb->data;
+       u8 up = 0, traffic_class, *ip_hdr;
+       u16 ether_type;
+       struct ath6kl_llc_snap_hdr *llc_hdr;
+
+       if (conn->sta_flags & STA_PS_APSD_TRIGGER) {
+               /*
+                * This tx is because of a uAPSD trigger, determine
+                * more and EOSP bit. Set EOSP if queue is empty
+                * or sufficient frames are delivered for this trigger.
+                */
+               spin_lock_bh(&conn->psq_lock);
+               if (!skb_queue_empty(&conn->apsdq))
+                       *flags |= WMI_DATA_HDR_FLAGS_MORE;
+               else if (conn->sta_flags & STA_PS_APSD_EOSP)
+                       *flags |= WMI_DATA_HDR_FLAGS_EOSP;
+               *flags |= WMI_DATA_HDR_FLAGS_UAPSD;
+               spin_unlock_bh(&conn->psq_lock);
+               return false;
+       } else if (!conn->apsd_info)
+               return false;
+
+       if (test_bit(WMM_ENABLED, &vif->flags)) {
+               ether_type = be16_to_cpu(datap->h_proto);
+               if (is_ethertype(ether_type)) {
+                       /* packet is in DIX format  */
+                       ip_hdr = (u8 *)(datap + 1);
+               } else {
+                       /* packet is in 802.3 format */
+                       llc_hdr = (struct ath6kl_llc_snap_hdr *)
+                                                       (datap + 1);
+                       ether_type = be16_to_cpu(llc_hdr->eth_type);
+                       ip_hdr = (u8 *)(llc_hdr + 1);
+               }
+
+               if (ether_type == IP_ETHERTYPE)
+                       up = ath6kl_wmi_determine_user_priority(
+                                                       ip_hdr, 0);
+       }
+
+       traffic_class = ath6kl_wmi_get_traffic_class(up);
+
+       if ((conn->apsd_info & (1 << traffic_class)) == 0)
+               return false;
+
+       /* Queue the frames if the STA is sleeping */
+       spin_lock_bh(&conn->psq_lock);
+       is_apsdq_empty = skb_queue_empty(&conn->apsdq);
+       skb_queue_tail(&conn->apsdq, skb);
+       spin_unlock_bh(&conn->psq_lock);
+
+       /*
+        * If this is the first pkt getting queued
+        * for this STA, update the PVB for this STA
+        */
+       if (is_apsdq_empty) {
+               ath6kl_wmi_set_apsd_bfrd_traf(ar->wmi,
+                               vif->fw_vif_idx,
+                               conn->aid, 1, 0);
+       }
+       *flags |= WMI_DATA_HDR_FLAGS_UAPSD;
+
+       return true;
+}
+
+static bool ath6kl_process_psq(struct ath6kl_sta *conn,
+                               struct ath6kl_vif *vif,
+                               struct sk_buff *skb,
+                               u32 *flags)
+{
+       bool is_psq_empty = false;
+       struct ath6kl *ar = vif->ar;
+
+       if (conn->sta_flags & STA_PS_POLLED) {
+               spin_lock_bh(&conn->psq_lock);
+               if (!skb_queue_empty(&conn->psq))
+                       *flags |= WMI_DATA_HDR_FLAGS_MORE;
+               spin_unlock_bh(&conn->psq_lock);
+               return false;
+       }
+
+       /* Queue the frames if the STA is sleeping */
+       spin_lock_bh(&conn->psq_lock);
+       is_psq_empty = skb_queue_empty(&conn->psq);
+       skb_queue_tail(&conn->psq, skb);
+       spin_unlock_bh(&conn->psq_lock);
+
+       /*
+        * If this is the first pkt getting queued
+        * for this STA, update the PVB for this
+        * STA.
+        */
+       if (is_psq_empty)
+               ath6kl_wmi_set_pvb_cmd(ar->wmi,
+                                      vif->fw_vif_idx,
+                                      conn->aid, 1);
+       return true;
+}
+
 static bool ath6kl_powersave_ap(struct ath6kl_vif *vif, struct sk_buff *skb,
-                               bool *more_data)
+                               u32 *flags)
 {
        struct ethhdr *datap = (struct ethhdr *) skb->data;
        struct ath6kl_sta *conn = NULL;
-       bool ps_queued = false, is_psq_empty = false;
+       bool ps_queued = false;
        struct ath6kl *ar = vif->ar;
 
        if (is_multicast_ether_addr(datap->h_dest)) {
@@ -128,7 +251,7 @@ static bool ath6kl_powersave_ap(struct ath6kl_vif *vif, struct sk_buff *skb,
                                 */
                                spin_lock_bh(&ar->mcastpsq_lock);
                                if (!skb_queue_empty(&ar->mcastpsq))
-                                       *more_data = true;
+                                       *flags |= WMI_DATA_HDR_FLAGS_MORE;
                                spin_unlock_bh(&ar->mcastpsq_lock);
                        }
                }
@@ -142,37 +265,13 @@ static bool ath6kl_powersave_ap(struct ath6kl_vif *vif, struct sk_buff *skb,
                }
 
                if (conn->sta_flags & STA_PS_SLEEP) {
-                       if (!(conn->sta_flags & STA_PS_POLLED)) {
-                               /* Queue the frames if the STA is sleeping */
-                               spin_lock_bh(&conn->psq_lock);
-                               is_psq_empty = skb_queue_empty(&conn->psq);
-                               skb_queue_tail(&conn->psq, skb);
-                               spin_unlock_bh(&conn->psq_lock);
-
-                               /*
-                                * If this is the first pkt getting queued
-                                * for this STA, update the PVB for this
-                                * STA.
-                                */
-                               if (is_psq_empty)
-                                       ath6kl_wmi_set_pvb_cmd(ar->wmi,
-                                                              vif->fw_vif_idx,
-                                                              conn->aid, 1);
-
-                               ps_queued = true;
-                       } else {
-                               /*
-                                * This tx is because of a PsPoll.
-                                * Determine if MoreData bit has to be set.
-                                */
-                               spin_lock_bh(&conn->psq_lock);
-                               if (!skb_queue_empty(&conn->psq))
-                                       *more_data = true;
-                               spin_unlock_bh(&conn->psq_lock);
-                       }
+                       ps_queued = ath6kl_process_uapsdq(conn,
+                                               vif, skb, flags);
+                       if (!(*flags & WMI_DATA_HDR_FLAGS_UAPSD))
+                               ps_queued = ath6kl_process_psq(conn,
+                                               vif, skb, flags);
                }
        }
-
        return ps_queued;
 }
 
@@ -242,8 +341,13 @@ int ath6kl_data_tx(struct sk_buff *skb, struct net_device *dev)
        u32 map_no = 0;
        u16 htc_tag = ATH6KL_DATA_PKT_TAG;
        u8 ac = 99 ; /* initialize to unmapped ac */
-       bool chk_adhoc_ps_mapping = false, more_data = false;
+       bool chk_adhoc_ps_mapping = false;
        int ret;
+       struct wmi_tx_meta_v2 meta_v2;
+       void *meta;
+       u8 csum_start = 0, csum_dest = 0, csum = skb->ip_summed;
+       u8 meta_ver = 0;
+       u32 flags = 0;
 
        ath6kl_dbg(ATH6KL_DBG_WLAN_TX,
                   "%s: skb=0x%p, data=0x%p, len=0x%x\n", __func__,
@@ -260,11 +364,19 @@ int ath6kl_data_tx(struct sk_buff *skb, struct net_device *dev)
 
        /* AP mode Power saving processing */
        if (vif->nw_type == AP_NETWORK) {
-               if (ath6kl_powersave_ap(vif, skb, &more_data))
+               if (ath6kl_powersave_ap(vif, skb, &flags))
                        return 0;
        }
 
        if (test_bit(WMI_ENABLED, &ar->flag)) {
+               if ((dev->features & NETIF_F_IP_CSUM) &&
+                               (csum == CHECKSUM_PARTIAL)) {
+                       csum_start = skb->csum_start -
+                                       (skb_network_header(skb) - skb->head) +
+                                       sizeof(struct ath6kl_llc_snap_hdr);
+                       csum_dest = skb->csum_offset + csum_start;
+               }
+
                if (skb_headroom(skb) < dev->needed_headroom) {
                        struct sk_buff *tmp_skb = skb;
 
@@ -281,10 +393,28 @@ int ath6kl_data_tx(struct sk_buff *skb, struct net_device *dev)
                        goto fail_tx;
                }
 
-               if (ath6kl_wmi_data_hdr_add(ar->wmi, skb, DATA_MSGTYPE,
-                                           more_data, 0, 0, NULL,
-                                           vif->fw_vif_idx)) {
-                       ath6kl_err("wmi_data_hdr_add failed\n");
+               if ((dev->features & NETIF_F_IP_CSUM) &&
+                               (csum == CHECKSUM_PARTIAL)) {
+                       meta_v2.csum_start = csum_start;
+                       meta_v2.csum_dest = csum_dest;
+
+                       /* instruct target to calculate checksum */
+                       meta_v2.csum_flags = WMI_META_V2_FLAG_CSUM_OFFLOAD;
+                       meta_ver = WMI_META_VERSION_2;
+                       meta = &meta_v2;
+               } else {
+                       meta_ver = 0;
+                       meta = NULL;
+               }
+
+               ret = ath6kl_wmi_data_hdr_add(ar->wmi, skb,
+                               DATA_MSGTYPE, flags, 0,
+                               meta_ver,
+                               meta, vif->fw_vif_idx);
+
+               if (ret) {
+                       ath6kl_warn("failed to add wmi data header:%d\n"
+                               , ret);
                        goto fail_tx;
                }
 
@@ -449,9 +579,7 @@ enum htc_send_full_action ath6kl_tx_queue_full(struct htc_target *target,
                 * WMI queue with too many commands the only exception to
                 * this is during testing using endpointping.
                 */
-               spin_lock_bh(&ar->lock);
                set_bit(WMI_CTRL_EP_FULL, &ar->flag);
-               spin_unlock_bh(&ar->lock);
                ath6kl_err("wmi ctrl ep is full\n");
                return action;
        }
@@ -479,9 +607,7 @@ enum htc_send_full_action ath6kl_tx_queue_full(struct htc_target *target,
                    action != HTC_SEND_FULL_DROP) {
                        spin_unlock_bh(&ar->list_lock);
 
-                       spin_lock_bh(&vif->if_lock);
                        set_bit(NETQ_STOPPED, &vif->flags);
-                       spin_unlock_bh(&vif->if_lock);
                        netif_stop_queue(vif->ndev);
 
                        return action;
@@ -710,10 +836,12 @@ static struct sk_buff *aggr_get_free_skb(struct aggr_info *p_aggr)
 {
        struct sk_buff *skb = NULL;
 
-       if (skb_queue_len(&p_aggr->free_q) < (AGGR_NUM_OF_FREE_NETBUFS >> 2))
-               ath6kl_alloc_netbufs(&p_aggr->free_q, AGGR_NUM_OF_FREE_NETBUFS);
+       if (skb_queue_len(&p_aggr->rx_amsdu_freeq) <
+           (AGGR_NUM_OF_FREE_NETBUFS >> 2))
+               ath6kl_alloc_netbufs(&p_aggr->rx_amsdu_freeq,
+                                    AGGR_NUM_OF_FREE_NETBUFS);
 
-       skb = skb_dequeue(&p_aggr->free_q);
+       skb = skb_dequeue(&p_aggr->rx_amsdu_freeq);
 
        return skb;
 }
@@ -881,7 +1009,7 @@ static void aggr_slice_amsdu(struct aggr_info *p_aggr,
        dev_kfree_skb(skb);
 }
 
-static void aggr_deque_frms(struct aggr_info *p_aggr, u8 tid,
+static void aggr_deque_frms(struct aggr_info_conn *agg_conn, u8 tid,
                            u16 seq_no, u8 order)
 {
        struct sk_buff *skb;
@@ -890,11 +1018,8 @@ static void aggr_deque_frms(struct aggr_info *p_aggr, u8 tid,
        u16 idx, idx_end, seq_end;
        struct rxtid_stats *stats;
 
-       if (!p_aggr)
-               return;
-
-       rxtid = &p_aggr->rx_tid[tid];
-       stats = &p_aggr->stat[tid];
+       rxtid = &agg_conn->rx_tid[tid];
+       stats = &agg_conn->stat[tid];
 
        idx = AGGR_WIN_IDX(rxtid->seq_next, rxtid->hold_q_sz);
 
@@ -923,7 +1048,8 @@ static void aggr_deque_frms(struct aggr_info *p_aggr, u8 tid,
 
                if (node->skb) {
                        if (node->is_amsdu)
-                               aggr_slice_amsdu(p_aggr, rxtid, node->skb);
+                               aggr_slice_amsdu(agg_conn->aggr_info, rxtid,
+                                                node->skb);
                        else
                                skb_queue_tail(&rxtid->q, node->skb);
                        node->skb = NULL;
@@ -939,10 +1065,10 @@ static void aggr_deque_frms(struct aggr_info *p_aggr, u8 tid,
        stats->num_delivered += skb_queue_len(&rxtid->q);
 
        while ((skb = skb_dequeue(&rxtid->q)))
-               ath6kl_deliver_frames_to_nw_stack(p_aggr->dev, skb);
+               ath6kl_deliver_frames_to_nw_stack(agg_conn->dev, skb);
 }
 
-static bool aggr_process_recv_frm(struct aggr_info *agg_info, u8 tid,
+static bool aggr_process_recv_frm(struct aggr_info_conn *agg_conn, u8 tid,
                                  u16 seq_no,
                                  bool is_amsdu, struct sk_buff *frame)
 {
@@ -954,18 +1080,18 @@ static bool aggr_process_recv_frm(struct aggr_info *agg_info, u8 tid,
        bool is_queued = false;
        u16 extended_end;
 
-       rxtid = &agg_info->rx_tid[tid];
-       stats = &agg_info->stat[tid];
+       rxtid = &agg_conn->rx_tid[tid];
+       stats = &agg_conn->stat[tid];
 
        stats->num_into_aggr++;
 
        if (!rxtid->aggr) {
                if (is_amsdu) {
-                       aggr_slice_amsdu(agg_info, rxtid, frame);
+                       aggr_slice_amsdu(agg_conn->aggr_info, rxtid, frame);
                        is_queued = true;
                        stats->num_amsdu++;
                        while ((skb = skb_dequeue(&rxtid->q)))
-                               ath6kl_deliver_frames_to_nw_stack(agg_info->dev,
+                               ath6kl_deliver_frames_to_nw_stack(agg_conn->dev,
                                                                  skb);
                }
                return is_queued;
@@ -985,7 +1111,7 @@ static bool aggr_process_recv_frm(struct aggr_info *agg_info, u8 tid,
                     (cur < end || cur > extended_end)) ||
                    ((end > extended_end) && (cur > extended_end) &&
                     (cur < end))) {
-                       aggr_deque_frms(agg_info, tid, 0, 0);
+                       aggr_deque_frms(agg_conn, tid, 0, 0);
                        if (cur >= rxtid->hold_q_sz - 1)
                                rxtid->seq_next = cur - (rxtid->hold_q_sz - 1);
                        else
@@ -1002,7 +1128,7 @@ static bool aggr_process_recv_frm(struct aggr_info *agg_info, u8 tid,
                                st = ATH6KL_MAX_SEQ_NO -
                                        (rxtid->hold_q_sz - 2 - cur);
 
-                       aggr_deque_frms(agg_info, tid, st, 0);
+                       aggr_deque_frms(agg_conn, tid, st, 0);
                }
 
                stats->num_oow++;
@@ -1041,9 +1167,9 @@ static bool aggr_process_recv_frm(struct aggr_info *agg_info, u8 tid,
 
        spin_unlock_bh(&rxtid->lock);
 
-       aggr_deque_frms(agg_info, tid, 0, 1);
+       aggr_deque_frms(agg_conn, tid, 0, 1);
 
-       if (agg_info->timer_scheduled)
+       if (agg_conn->timer_scheduled)
                rxtid->progress = true;
        else
                for (idx = 0 ; idx < rxtid->hold_q_sz; idx++) {
@@ -1054,8 +1180,8 @@ static bool aggr_process_recv_frm(struct aggr_info *agg_info, u8 tid,
                                 * the frame doesn't remain stuck
                                 * forever.
                                 */
-                               agg_info->timer_scheduled = true;
-                               mod_timer(&agg_info->timer,
+                               agg_conn->timer_scheduled = true;
+                               mod_timer(&agg_conn->timer,
                                          (jiffies +
                                           HZ * (AGGR_RX_TIMEOUT) / 1000));
                                rxtid->progress = false;
@@ -1067,6 +1193,76 @@ static bool aggr_process_recv_frm(struct aggr_info *agg_info, u8 tid,
        return is_queued;
 }
 
+static void ath6kl_uapsd_trigger_frame_rx(struct ath6kl_vif *vif,
+                                                struct ath6kl_sta *conn)
+{
+       struct ath6kl *ar = vif->ar;
+       bool is_apsdq_empty, is_apsdq_empty_at_start;
+       u32 num_frames_to_deliver, flags;
+       struct sk_buff *skb = NULL;
+
+       /*
+        * If the APSD q for this STA is not empty, dequeue and
+        * send a pkt from the head of the q. Also update the
+        * More data bit in the WMI_DATA_HDR if there are
+        * more pkts for this STA in the APSD q.
+        * If there are no more pkts for this STA,
+        * update the APSD bitmap for this STA.
+        */
+
+       num_frames_to_deliver = (conn->apsd_info >> ATH6KL_APSD_NUM_OF_AC) &
+                                                   ATH6KL_APSD_FRAME_MASK;
+       /*
+        * Number of frames to send in a service period is
+        * indicated by the station
+        * in the QOS_INFO of the association request
+        * If it is zero, send all frames
+        */
+       if (!num_frames_to_deliver)
+               num_frames_to_deliver = ATH6KL_APSD_ALL_FRAME;
+
+       spin_lock_bh(&conn->psq_lock);
+       is_apsdq_empty = skb_queue_empty(&conn->apsdq);
+       spin_unlock_bh(&conn->psq_lock);
+       is_apsdq_empty_at_start = is_apsdq_empty;
+
+       while ((!is_apsdq_empty) && (num_frames_to_deliver)) {
+
+               spin_lock_bh(&conn->psq_lock);
+               skb = skb_dequeue(&conn->apsdq);
+               is_apsdq_empty = skb_queue_empty(&conn->apsdq);
+               spin_unlock_bh(&conn->psq_lock);
+
+               /*
+                * Set the STA flag to Trigger delivery,
+                * so that the frame will go out
+                */
+               conn->sta_flags |= STA_PS_APSD_TRIGGER;
+               num_frames_to_deliver--;
+
+               /* Last frame in the service period, set EOSP or queue empty */
+               if ((is_apsdq_empty) || (!num_frames_to_deliver))
+                       conn->sta_flags |= STA_PS_APSD_EOSP;
+
+               ath6kl_data_tx(skb, vif->ndev);
+               conn->sta_flags &= ~(STA_PS_APSD_TRIGGER);
+               conn->sta_flags &= ~(STA_PS_APSD_EOSP);
+       }
+
+       if (is_apsdq_empty) {
+               if (is_apsdq_empty_at_start)
+                       flags = WMI_AP_APSD_NO_DELIVERY_FRAMES;
+               else
+                       flags = 0;
+
+               ath6kl_wmi_set_apsd_bfrd_traf(ar->wmi,
+                               vif->fw_vif_idx,
+                               conn->aid, 0, flags);
+       }
+
+       return;
+}
+
 void ath6kl_rx(struct htc_target *target, struct htc_packet *packet)
 {
        struct ath6kl *ar = target->dev->ar;
@@ -1078,10 +1274,12 @@ void ath6kl_rx(struct htc_target *target, struct htc_packet *packet)
        int status = packet->status;
        enum htc_endpoint_id ept = packet->endpoint;
        bool is_amsdu, prev_ps, ps_state = false;
+       bool trig_state = false;
        struct ath6kl_sta *conn = NULL;
        struct sk_buff *skb1 = NULL;
        struct ethhdr *datap = NULL;
        struct ath6kl_vif *vif;
+       struct aggr_info_conn *aggr_conn;
        u16 seq_no, offset;
        u8 tid, if_idx;
 
@@ -1171,6 +1369,7 @@ void ath6kl_rx(struct htc_target *target, struct htc_packet *packet)
                              WMI_DATA_HDR_PS_MASK);
 
                offset = sizeof(struct wmi_data_hdr);
+               trig_state = !!(le16_to_cpu(dhdr->info3) & WMI_DATA_HDR_TRIG);
 
                switch (meta_type) {
                case 0:
@@ -1209,18 +1408,36 @@ void ath6kl_rx(struct htc_target *target, struct htc_packet *packet)
                else
                        conn->sta_flags &= ~STA_PS_SLEEP;
 
+               /* Accept trigger only when the station is in sleep */
+               if ((conn->sta_flags & STA_PS_SLEEP) && trig_state)
+                       ath6kl_uapsd_trigger_frame_rx(vif, conn);
+
                if (prev_ps ^ !!(conn->sta_flags & STA_PS_SLEEP)) {
                        if (!(conn->sta_flags & STA_PS_SLEEP)) {
                                struct sk_buff *skbuff = NULL;
+                               bool is_apsdq_empty;
 
                                spin_lock_bh(&conn->psq_lock);
-                               while ((skbuff = skb_dequeue(&conn->psq))
-                                      != NULL) {
+                               while ((skbuff = skb_dequeue(&conn->psq))) {
+                                       spin_unlock_bh(&conn->psq_lock);
+                                       ath6kl_data_tx(skbuff, vif->ndev);
+                                       spin_lock_bh(&conn->psq_lock);
+                               }
+
+                               is_apsdq_empty = skb_queue_empty(&conn->apsdq);
+                               while ((skbuff = skb_dequeue(&conn->apsdq))) {
                                        spin_unlock_bh(&conn->psq_lock);
                                        ath6kl_data_tx(skbuff, vif->ndev);
                                        spin_lock_bh(&conn->psq_lock);
                                }
                                spin_unlock_bh(&conn->psq_lock);
+
+                               if (!is_apsdq_empty)
+                                       ath6kl_wmi_set_apsd_bfrd_traf(
+                                                       ar->wmi,
+                                                       vif->fw_vif_idx,
+                                                       conn->aid, 0, 0);
+
                                /* Clear the PVB for this STA */
                                ath6kl_wmi_set_pvb_cmd(ar->wmi, vif->fw_vif_idx,
                                                       conn->aid, 0);
@@ -1314,11 +1531,21 @@ void ath6kl_rx(struct htc_target *target, struct htc_packet *packet)
 
        datap = (struct ethhdr *) skb->data;
 
-       if (is_unicast_ether_addr(datap->h_dest) &&
-           aggr_process_recv_frm(vif->aggr_cntxt, tid, seq_no,
-                                 is_amsdu, skb))
-               /* aggregation code will handle the skb */
-               return;
+       if (is_unicast_ether_addr(datap->h_dest)) {
+               if (vif->nw_type == AP_NETWORK) {
+                       conn = ath6kl_find_sta(vif, datap->h_source);
+                       if (!conn)
+                               return;
+                       aggr_conn = conn->aggr_conn;
+               } else
+                       aggr_conn = vif->aggr_cntxt->aggr_conn;
+
+               if (aggr_process_recv_frm(aggr_conn, tid, seq_no,
+                   is_amsdu, skb)) {
+                       /* aggregation code will handle the skb */
+                       return;
+               }
+       }
 
        ath6kl_deliver_frames_to_nw_stack(vif->ndev, skb);
 }
@@ -1326,13 +1553,13 @@ void ath6kl_rx(struct htc_target *target, struct htc_packet *packet)
 static void aggr_timeout(unsigned long arg)
 {
        u8 i, j;
-       struct aggr_info *p_aggr = (struct aggr_info *) arg;
+       struct aggr_info_conn *aggr_conn = (struct aggr_info_conn *) arg;
        struct rxtid *rxtid;
        struct rxtid_stats *stats;
 
        for (i = 0; i < NUM_OF_TIDS; i++) {
-               rxtid = &p_aggr->rx_tid[i];
-               stats = &p_aggr->stat[i];
+               rxtid = &aggr_conn->rx_tid[i];
+               stats = &aggr_conn->stat[i];
 
                if (!rxtid->aggr || !rxtid->timer_mon || rxtid->progress)
                        continue;
@@ -1343,18 +1570,18 @@ static void aggr_timeout(unsigned long arg)
                           rxtid->seq_next,
                           ((rxtid->seq_next + rxtid->hold_q_sz-1) &
                            ATH6KL_MAX_SEQ_NO));
-               aggr_deque_frms(p_aggr, i, 0, 0);
+               aggr_deque_frms(aggr_conn, i, 0, 0);
        }
 
-       p_aggr->timer_scheduled = false;
+       aggr_conn->timer_scheduled = false;
 
        for (i = 0; i < NUM_OF_TIDS; i++) {
-               rxtid = &p_aggr->rx_tid[i];
+               rxtid = &aggr_conn->rx_tid[i];
 
                if (rxtid->aggr && rxtid->hold_q) {
                        for (j = 0; j < rxtid->hold_q_sz; j++) {
                                if (rxtid->hold_q[j].skb) {
-                                       p_aggr->timer_scheduled = true;
+                                       aggr_conn->timer_scheduled = true;
                                        rxtid->timer_mon = true;
                                        rxtid->progress = false;
                                        break;
@@ -1366,24 +1593,24 @@ static void aggr_timeout(unsigned long arg)
                }
        }
 
-       if (p_aggr->timer_scheduled)
-               mod_timer(&p_aggr->timer,
+       if (aggr_conn->timer_scheduled)
+               mod_timer(&aggr_conn->timer,
                          jiffies + msecs_to_jiffies(AGGR_RX_TIMEOUT));
 }
 
-static void aggr_delete_tid_state(struct aggr_info *p_aggr, u8 tid)
+static void aggr_delete_tid_state(struct aggr_info_conn *aggr_conn, u8 tid)
 {
        struct rxtid *rxtid;
        struct rxtid_stats *stats;
 
-       if (!p_aggr || tid >= NUM_OF_TIDS)
+       if (!aggr_conn || tid >= NUM_OF_TIDS)
                return;
 
-       rxtid = &p_aggr->rx_tid[tid];
-       stats = &p_aggr->stat[tid];
+       rxtid = &aggr_conn->rx_tid[tid];
+       stats = &aggr_conn->stat[tid];
 
        if (rxtid->aggr)
-               aggr_deque_frms(p_aggr, tid, 0, 0);
+               aggr_deque_frms(aggr_conn, tid, 0, 0);
 
        rxtid->aggr = false;
        rxtid->progress = false;
@@ -1398,26 +1625,40 @@ static void aggr_delete_tid_state(struct aggr_info *p_aggr, u8 tid)
        memset(stats, 0, sizeof(struct rxtid_stats));
 }
 
-void aggr_recv_addba_req_evt(struct ath6kl_vif *vif, u8 tid, u16 seq_no,
+void aggr_recv_addba_req_evt(struct ath6kl_vif *vif, u8 tid_mux, u16 seq_no,
                             u8 win_sz)
 {
-       struct aggr_info *p_aggr = vif->aggr_cntxt;
+       struct ath6kl_sta *sta;
+       struct aggr_info_conn *aggr_conn = NULL;
        struct rxtid *rxtid;
        struct rxtid_stats *stats;
        u16 hold_q_size;
+       u8 tid, aid;
 
-       if (!p_aggr)
+       if (vif->nw_type == AP_NETWORK) {
+               aid = ath6kl_get_aid(tid_mux);
+               sta = ath6kl_find_sta_by_aid(vif->ar, aid);
+               if (sta)
+                       aggr_conn = sta->aggr_conn;
+       } else
+               aggr_conn = vif->aggr_cntxt->aggr_conn;
+
+       if (!aggr_conn)
+               return;
+
+       tid = ath6kl_get_tid(tid_mux);
+       if (tid >= NUM_OF_TIDS)
                return;
 
-       rxtid = &p_aggr->rx_tid[tid];
-       stats = &p_aggr->stat[tid];
+       rxtid = &aggr_conn->rx_tid[tid];
+       stats = &aggr_conn->stat[tid];
 
        if (win_sz < AGGR_WIN_SZ_MIN || win_sz > AGGR_WIN_SZ_MAX)
                ath6kl_dbg(ATH6KL_DBG_WLAN_RX, "%s: win_sz %d, tid %d\n",
                           __func__, win_sz, tid);
 
        if (rxtid->aggr)
-               aggr_delete_tid_state(p_aggr, tid);
+               aggr_delete_tid_state(aggr_conn, tid);
 
        rxtid->seq_next = seq_no;
        hold_q_size = TID_WINDOW_SZ(win_sz) * sizeof(struct skb_hold_q);
@@ -1433,31 +1674,23 @@ void aggr_recv_addba_req_evt(struct ath6kl_vif *vif, u8 tid, u16 seq_no,
        rxtid->aggr = true;
 }
 
-struct aggr_info *aggr_init(struct net_device *dev)
+void aggr_conn_init(struct ath6kl_vif *vif, struct aggr_info *aggr_info,
+                   struct aggr_info_conn *aggr_conn)
 {
-       struct aggr_info *p_aggr = NULL;
        struct rxtid *rxtid;
        u8 i;
 
-       p_aggr = kzalloc(sizeof(struct aggr_info), GFP_KERNEL);
-       if (!p_aggr) {
-               ath6kl_err("failed to alloc memory for aggr_node\n");
-               return NULL;
-       }
-
-       p_aggr->aggr_sz = AGGR_SZ_DEFAULT;
-       p_aggr->dev = dev;
-       init_timer(&p_aggr->timer);
-       p_aggr->timer.function = aggr_timeout;
-       p_aggr->timer.data = (unsigned long) p_aggr;
+       aggr_conn->aggr_sz = AGGR_SZ_DEFAULT;
+       aggr_conn->dev = vif->ndev;
+       init_timer(&aggr_conn->timer);
+       aggr_conn->timer.function = aggr_timeout;
+       aggr_conn->timer.data = (unsigned long) aggr_conn;
+       aggr_conn->aggr_info = aggr_info;
 
-       p_aggr->timer_scheduled = false;
-       skb_queue_head_init(&p_aggr->free_q);
-
-       ath6kl_alloc_netbufs(&p_aggr->free_q, AGGR_NUM_OF_FREE_NETBUFS);
+       aggr_conn->timer_scheduled = false;
 
        for (i = 0; i < NUM_OF_TIDS; i++) {
-               rxtid = &p_aggr->rx_tid[i];
+               rxtid = &aggr_conn->rx_tid[i];
                rxtid->aggr = false;
                rxtid->progress = false;
                rxtid->timer_mon = false;
@@ -1465,29 +1698,75 @@ struct aggr_info *aggr_init(struct net_device *dev)
                spin_lock_init(&rxtid->lock);
        }
 
+}
+
+struct aggr_info *aggr_init(struct ath6kl_vif *vif)
+{
+       struct aggr_info *p_aggr = NULL;
+
+       p_aggr = kzalloc(sizeof(struct aggr_info), GFP_KERNEL);
+       if (!p_aggr) {
+               ath6kl_err("failed to alloc memory for aggr_node\n");
+               return NULL;
+       }
+
+       p_aggr->aggr_conn = kzalloc(sizeof(struct aggr_info_conn), GFP_KERNEL);
+       if (!p_aggr->aggr_conn) {
+               ath6kl_err("failed to alloc memory for connection specific aggr info\n");
+               kfree(p_aggr);
+               return NULL;
+       }
+
+       aggr_conn_init(vif, p_aggr, p_aggr->aggr_conn);
+
+       skb_queue_head_init(&p_aggr->rx_amsdu_freeq);
+       ath6kl_alloc_netbufs(&p_aggr->rx_amsdu_freeq, AGGR_NUM_OF_FREE_NETBUFS);
+
        return p_aggr;
 }
 
-void aggr_recv_delba_req_evt(struct ath6kl_vif *vif, u8 tid)
+void aggr_recv_delba_req_evt(struct ath6kl_vif *vif, u8 tid_mux)
 {
-       struct aggr_info *p_aggr = vif->aggr_cntxt;
+       struct ath6kl_sta *sta;
        struct rxtid *rxtid;
+       struct aggr_info_conn *aggr_conn = NULL;
+       u8 tid, aid;
+
+       if (vif->nw_type == AP_NETWORK) {
+               aid = ath6kl_get_aid(tid_mux);
+               sta = ath6kl_find_sta_by_aid(vif->ar, aid);
+               if (sta)
+                       aggr_conn = sta->aggr_conn;
+       } else
+               aggr_conn = vif->aggr_cntxt->aggr_conn;
+
+       if (!aggr_conn)
+               return;
 
-       if (!p_aggr)
+       tid = ath6kl_get_tid(tid_mux);
+       if (tid >= NUM_OF_TIDS)
                return;
 
-       rxtid = &p_aggr->rx_tid[tid];
+       rxtid = &aggr_conn->rx_tid[tid];
 
        if (rxtid->aggr)
-               aggr_delete_tid_state(p_aggr, tid);
+               aggr_delete_tid_state(aggr_conn, tid);
 }
 
-void aggr_reset_state(struct aggr_info *aggr_info)
+void aggr_reset_state(struct aggr_info_conn *aggr_conn)
 {
        u8 tid;
 
+       if (!aggr_conn)
+               return;
+
+       if (aggr_conn->timer_scheduled) {
+               del_timer(&aggr_conn->timer);
+               aggr_conn->timer_scheduled = false;
+       }
+
        for (tid = 0; tid < NUM_OF_TIDS; tid++)
-               aggr_delete_tid_state(aggr_info, tid);
+               aggr_delete_tid_state(aggr_conn, tid);
 }
 
 /* clean up our amsdu buffer list */
@@ -1514,28 +1793,11 @@ void ath6kl_cleanup_amsdu_rxbufs(struct ath6kl *ar)
 
 void aggr_module_destroy(struct aggr_info *aggr_info)
 {
-       struct rxtid *rxtid;
-       u8 i, k;
-
        if (!aggr_info)
                return;
 
-       if (aggr_info->timer_scheduled) {
-               del_timer(&aggr_info->timer);
-               aggr_info->timer_scheduled = false;
-       }
-
-       for (i = 0; i < NUM_OF_TIDS; i++) {
-               rxtid = &aggr_info->rx_tid[i];
-               if (rxtid->hold_q) {
-                       for (k = 0; k < rxtid->hold_q_sz; k++)
-                               dev_kfree_skb(rxtid->hold_q[k].skb);
-                       kfree(rxtid->hold_q);
-               }
-
-               skb_queue_purge(&rxtid->q);
-       }
-
-       skb_queue_purge(&aggr_info->free_q);
+       aggr_reset_state(aggr_info->aggr_conn);
+       skb_queue_purge(&aggr_info->rx_amsdu_freeq);
+       kfree(aggr_info->aggr_conn);
        kfree(aggr_info);
 }
diff --git a/drivers/net/wireless/ath/ath6kl/usb.c b/drivers/net/wireless/ath/ath6kl/usb.c
new file mode 100644 (file)
index 0000000..c72567c
--- /dev/null
@@ -0,0 +1,431 @@
+/*
+ * Copyright (c) 2007-2011 Atheros Communications Inc.
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include <linux/module.h>
+#include <linux/usb.h>
+
+#include "debug.h"
+#include "core.h"
+
+/* usb device object */
+struct ath6kl_usb {
+       struct usb_device *udev;
+       struct usb_interface *interface;
+       u8 *diag_cmd_buffer;
+       u8 *diag_resp_buffer;
+       struct ath6kl *ar;
+};
+
+/* diagnostic command defnitions */
+#define ATH6KL_USB_CONTROL_REQ_SEND_BMI_CMD        1
+#define ATH6KL_USB_CONTROL_REQ_RECV_BMI_RESP       2
+#define ATH6KL_USB_CONTROL_REQ_DIAG_CMD            3
+#define ATH6KL_USB_CONTROL_REQ_DIAG_RESP           4
+
+#define ATH6KL_USB_CTRL_DIAG_CC_READ               0
+#define ATH6KL_USB_CTRL_DIAG_CC_WRITE              1
+
+struct ath6kl_usb_ctrl_diag_cmd_write {
+       __le32 cmd;
+       __le32 address;
+       __le32 value;
+       __le32 _pad[1];
+} __packed;
+
+struct ath6kl_usb_ctrl_diag_cmd_read {
+       __le32 cmd;
+       __le32 address;
+} __packed;
+
+struct ath6kl_usb_ctrl_diag_resp_read {
+       __le32 value;
+} __packed;
+
+#define ATH6KL_USB_MAX_DIAG_CMD (sizeof(struct ath6kl_usb_ctrl_diag_cmd_write))
+#define ATH6KL_USB_MAX_DIAG_RESP (sizeof(struct ath6kl_usb_ctrl_diag_resp_read))
+
+static void ath6kl_usb_destroy(struct ath6kl_usb *ar_usb)
+{
+       usb_set_intfdata(ar_usb->interface, NULL);
+
+       kfree(ar_usb->diag_cmd_buffer);
+       kfree(ar_usb->diag_resp_buffer);
+
+       kfree(ar_usb);
+}
+
+static struct ath6kl_usb *ath6kl_usb_create(struct usb_interface *interface)
+{
+       struct ath6kl_usb *ar_usb = NULL;
+       struct usb_device *dev = interface_to_usbdev(interface);
+       int status = 0;
+
+       ar_usb = kzalloc(sizeof(struct ath6kl_usb), GFP_KERNEL);
+       if (ar_usb == NULL)
+               goto fail_ath6kl_usb_create;
+
+       memset(ar_usb, 0, sizeof(struct ath6kl_usb));
+       usb_set_intfdata(interface, ar_usb);
+       ar_usb->udev = dev;
+       ar_usb->interface = interface;
+
+       ar_usb->diag_cmd_buffer = kzalloc(ATH6KL_USB_MAX_DIAG_CMD, GFP_KERNEL);
+       if (ar_usb->diag_cmd_buffer == NULL) {
+               status = -ENOMEM;
+               goto fail_ath6kl_usb_create;
+       }
+
+       ar_usb->diag_resp_buffer = kzalloc(ATH6KL_USB_MAX_DIAG_RESP,
+                                          GFP_KERNEL);
+       if (ar_usb->diag_resp_buffer == NULL) {
+               status = -ENOMEM;
+               goto fail_ath6kl_usb_create;
+       }
+
+fail_ath6kl_usb_create:
+       if (status != 0) {
+               ath6kl_usb_destroy(ar_usb);
+               ar_usb = NULL;
+       }
+       return ar_usb;
+}
+
+static void ath6kl_usb_device_detached(struct usb_interface *interface)
+{
+       struct ath6kl_usb *ar_usb;
+
+       ar_usb = usb_get_intfdata(interface);
+       if (ar_usb == NULL)
+               return;
+
+       ath6kl_stop_txrx(ar_usb->ar);
+
+       ath6kl_core_cleanup(ar_usb->ar);
+
+       ath6kl_usb_destroy(ar_usb);
+}
+
+static int ath6kl_usb_submit_ctrl_out(struct ath6kl_usb *ar_usb,
+                                  u8 req, u16 value, u16 index, void *data,
+                                  u32 size)
+{
+       u8 *buf = NULL;
+       int ret;
+
+       if (size > 0) {
+               buf = kmalloc(size, GFP_KERNEL);
+               if (buf == NULL)
+                       return -ENOMEM;
+
+               memcpy(buf, data, size);
+       }
+
+       /* note: if successful returns number of bytes transfered */
+       ret = usb_control_msg(ar_usb->udev,
+                             usb_sndctrlpipe(ar_usb->udev, 0),
+                             req,
+                             USB_DIR_OUT | USB_TYPE_VENDOR |
+                             USB_RECIP_DEVICE, value, index, buf,
+                             size, 1000);
+
+       if (ret < 0) {
+               ath6kl_dbg(ATH6KL_DBG_USB, "%s failed,result = %d\n",
+                          __func__, ret);
+       }
+
+       kfree(buf);
+
+       return 0;
+}
+
+static int ath6kl_usb_submit_ctrl_in(struct ath6kl_usb *ar_usb,
+                                 u8 req, u16 value, u16 index, void *data,
+                                 u32 size)
+{
+       u8 *buf = NULL;
+       int ret;
+
+       if (size > 0) {
+               buf = kmalloc(size, GFP_KERNEL);
+               if (buf == NULL)
+                       return -ENOMEM;
+       }
+
+       /* note: if successful returns number of bytes transfered */
+       ret = usb_control_msg(ar_usb->udev,
+                                usb_rcvctrlpipe(ar_usb->udev, 0),
+                                req,
+                                USB_DIR_IN | USB_TYPE_VENDOR |
+                                USB_RECIP_DEVICE, value, index, buf,
+                                size, 2 * HZ);
+
+       if (ret < 0) {
+               ath6kl_dbg(ATH6KL_DBG_USB, "%s failed,result = %d\n",
+                          __func__, ret);
+       }
+
+       memcpy((u8 *) data, buf, size);
+
+       kfree(buf);
+
+       return 0;
+}
+
+static int ath6kl_usb_ctrl_msg_exchange(struct ath6kl_usb *ar_usb,
+                                    u8 req_val, u8 *req_buf, u32 req_len,
+                                    u8 resp_val, u8 *resp_buf, u32 *resp_len)
+{
+       int ret;
+
+       /* send command */
+       ret = ath6kl_usb_submit_ctrl_out(ar_usb, req_val, 0, 0,
+                                        req_buf, req_len);
+
+       if (ret != 0)
+               return ret;
+
+       if (resp_buf == NULL) {
+               /* no expected response */
+               return ret;
+       }
+
+       /* get response */
+       ret = ath6kl_usb_submit_ctrl_in(ar_usb, resp_val, 0, 0,
+                                       resp_buf, *resp_len);
+
+       return ret;
+}
+
+static int ath6kl_usb_diag_read32(struct ath6kl *ar, u32 address, u32 *data)
+{
+       struct ath6kl_usb *ar_usb = ar->hif_priv;
+       struct ath6kl_usb_ctrl_diag_resp_read *resp;
+       struct ath6kl_usb_ctrl_diag_cmd_read *cmd;
+       u32 resp_len;
+       int ret;
+
+       cmd = (struct ath6kl_usb_ctrl_diag_cmd_read *) ar_usb->diag_cmd_buffer;
+
+       memset(cmd, 0, sizeof(*cmd));
+       cmd->cmd = ATH6KL_USB_CTRL_DIAG_CC_READ;
+       cmd->address = cpu_to_le32(address);
+       resp_len = sizeof(*resp);
+
+       ret = ath6kl_usb_ctrl_msg_exchange(ar_usb,
+                               ATH6KL_USB_CONTROL_REQ_DIAG_CMD,
+                               (u8 *) cmd,
+                               sizeof(struct ath6kl_usb_ctrl_diag_cmd_write),
+                               ATH6KL_USB_CONTROL_REQ_DIAG_RESP,
+                               ar_usb->diag_resp_buffer, &resp_len);
+
+       if (ret)
+               return ret;
+
+       resp = (struct ath6kl_usb_ctrl_diag_resp_read *)
+               ar_usb->diag_resp_buffer;
+
+       *data = le32_to_cpu(resp->value);
+
+       return ret;
+}
+
+static int ath6kl_usb_diag_write32(struct ath6kl *ar, u32 address, __le32 data)
+{
+       struct ath6kl_usb *ar_usb = ar->hif_priv;
+       struct ath6kl_usb_ctrl_diag_cmd_write *cmd;
+
+       cmd = (struct ath6kl_usb_ctrl_diag_cmd_write *) ar_usb->diag_cmd_buffer;
+
+       memset(cmd, 0, sizeof(struct ath6kl_usb_ctrl_diag_cmd_write));
+       cmd->cmd = cpu_to_le32(ATH6KL_USB_CTRL_DIAG_CC_WRITE);
+       cmd->address = cpu_to_le32(address);
+       cmd->value = data;
+
+       return ath6kl_usb_ctrl_msg_exchange(ar_usb,
+                                           ATH6KL_USB_CONTROL_REQ_DIAG_CMD,
+                                           (u8 *) cmd,
+                                           sizeof(*cmd),
+                                           0, NULL, NULL);
+
+}
+
+static int ath6kl_usb_bmi_read(struct ath6kl *ar, u8 *buf, u32 len)
+{
+       struct ath6kl_usb *ar_usb = ar->hif_priv;
+       int ret;
+
+       /* get response */
+       ret = ath6kl_usb_submit_ctrl_in(ar_usb,
+                                       ATH6KL_USB_CONTROL_REQ_RECV_BMI_RESP,
+                                       0, 0, buf, len);
+       if (ret != 0) {
+               ath6kl_err("Unable to read the bmi data from the device: %d\n",
+                          ret);
+               return ret;
+       }
+
+       return 0;
+}
+
+static int ath6kl_usb_bmi_write(struct ath6kl *ar, u8 *buf, u32 len)
+{
+       struct ath6kl_usb *ar_usb = ar->hif_priv;
+       int ret;
+
+       /* send command */
+       ret = ath6kl_usb_submit_ctrl_out(ar_usb,
+                                        ATH6KL_USB_CONTROL_REQ_SEND_BMI_CMD,
+                                        0, 0, buf, len);
+       if (ret != 0) {
+               ath6kl_err("unable to send the bmi data to the device: %d\n",
+                          ret);
+               return ret;
+       }
+
+       return 0;
+}
+
+static int ath6kl_usb_power_on(struct ath6kl *ar)
+{
+       return 0;
+}
+
+static int ath6kl_usb_power_off(struct ath6kl *ar)
+{
+       return 0;
+}
+
+static const struct ath6kl_hif_ops ath6kl_usb_ops = {
+       .diag_read32 = ath6kl_usb_diag_read32,
+       .diag_write32 = ath6kl_usb_diag_write32,
+       .bmi_read = ath6kl_usb_bmi_read,
+       .bmi_write = ath6kl_usb_bmi_write,
+       .power_on = ath6kl_usb_power_on,
+       .power_off = ath6kl_usb_power_off,
+};
+
+/* ath6kl usb driver registered functions */
+static int ath6kl_usb_probe(struct usb_interface *interface,
+                           const struct usb_device_id *id)
+{
+       struct usb_device *dev = interface_to_usbdev(interface);
+       struct ath6kl *ar;
+       struct ath6kl_usb *ar_usb = NULL;
+       int vendor_id, product_id;
+       int ret = 0;
+
+       usb_get_dev(dev);
+
+       vendor_id = le16_to_cpu(dev->descriptor.idVendor);
+       product_id = le16_to_cpu(dev->descriptor.idProduct);
+
+       ath6kl_dbg(ATH6KL_DBG_USB, "vendor_id = %04x\n", vendor_id);
+       ath6kl_dbg(ATH6KL_DBG_USB, "product_id = %04x\n", product_id);
+
+       if (interface->cur_altsetting)
+               ath6kl_dbg(ATH6KL_DBG_USB, "USB Interface %d\n",
+                          interface->cur_altsetting->desc.bInterfaceNumber);
+
+
+       if (dev->speed == USB_SPEED_HIGH)
+               ath6kl_dbg(ATH6KL_DBG_USB, "USB 2.0 Host\n");
+       else
+               ath6kl_dbg(ATH6KL_DBG_USB, "USB 1.1 Host\n");
+
+       ar_usb = ath6kl_usb_create(interface);
+
+       if (ar_usb == NULL) {
+               ret = -ENOMEM;
+               goto err_usb_put;
+       }
+
+       ar = ath6kl_core_create(&ar_usb->udev->dev);
+       if (ar == NULL) {
+               ath6kl_err("Failed to alloc ath6kl core\n");
+               ret = -ENOMEM;
+               goto err_usb_destroy;
+       }
+
+       ar->hif_priv = ar_usb;
+       ar->hif_type = ATH6KL_HIF_TYPE_USB;
+       ar->hif_ops = &ath6kl_usb_ops;
+       ar->mbox_info.block_size = 16;
+       ar->bmi.max_data_size = 252;
+
+       ar_usb->ar = ar;
+
+       ret = ath6kl_core_init(ar);
+       if (ret) {
+               ath6kl_err("Failed to init ath6kl core: %d\n", ret);
+               goto err_core_free;
+       }
+
+       return ret;
+
+err_core_free:
+       ath6kl_core_destroy(ar);
+err_usb_destroy:
+       ath6kl_usb_destroy(ar_usb);
+err_usb_put:
+       usb_put_dev(dev);
+
+       return ret;
+}
+
+static void ath6kl_usb_remove(struct usb_interface *interface)
+{
+       usb_put_dev(interface_to_usbdev(interface));
+       ath6kl_usb_device_detached(interface);
+}
+
+/* table of devices that work with this driver */
+static struct usb_device_id ath6kl_usb_ids[] = {
+       {USB_DEVICE(0x0cf3, 0x9374)},
+       { /* Terminating entry */ },
+};
+
+MODULE_DEVICE_TABLE(usb, ath6kl_usb_ids);
+
+static struct usb_driver ath6kl_usb_driver = {
+       .name = "ath6kl_usb",
+       .probe = ath6kl_usb_probe,
+       .disconnect = ath6kl_usb_remove,
+       .id_table = ath6kl_usb_ids,
+};
+
+static int ath6kl_usb_init(void)
+{
+       usb_register(&ath6kl_usb_driver);
+       return 0;
+}
+
+static void ath6kl_usb_exit(void)
+{
+       usb_deregister(&ath6kl_usb_driver);
+}
+
+module_init(ath6kl_usb_init);
+module_exit(ath6kl_usb_exit);
+
+MODULE_AUTHOR("Atheros Communications, Inc.");
+MODULE_DESCRIPTION("Driver support for Atheros AR600x USB devices");
+MODULE_LICENSE("Dual BSD/GPL");
+MODULE_FIRMWARE(AR6004_HW_1_0_FIRMWARE_FILE);
+MODULE_FIRMWARE(AR6004_HW_1_0_BOARD_DATA_FILE);
+MODULE_FIRMWARE(AR6004_HW_1_0_DEFAULT_BOARD_DATA_FILE);
+MODULE_FIRMWARE(AR6004_HW_1_1_FIRMWARE_FILE);
+MODULE_FIRMWARE(AR6004_HW_1_1_BOARD_DATA_FILE);
+MODULE_FIRMWARE(AR6004_HW_1_1_DEFAULT_BOARD_DATA_FILE);
index f6f2aa2..18fa9aa 100644 (file)
@@ -180,7 +180,7 @@ static int ath6kl_wmi_meta_add(struct wmi *wmi, struct sk_buff *skb,
 }
 
 int ath6kl_wmi_data_hdr_add(struct wmi *wmi, struct sk_buff *skb,
-                           u8 msg_type, bool more_data,
+                           u8 msg_type, u32 flags,
                            enum wmi_data_hdr_data_type data_type,
                            u8 meta_ver, void *tx_meta_info, u8 if_idx)
 {
@@ -204,17 +204,19 @@ int ath6kl_wmi_data_hdr_add(struct wmi *wmi, struct sk_buff *skb,
        data_hdr->info = msg_type << WMI_DATA_HDR_MSG_TYPE_SHIFT;
        data_hdr->info |= data_type << WMI_DATA_HDR_DATA_TYPE_SHIFT;
 
-       if (more_data)
-               data_hdr->info |=
-                   WMI_DATA_HDR_MORE_MASK << WMI_DATA_HDR_MORE_SHIFT;
+       if (flags & WMI_DATA_HDR_FLAGS_MORE)
+               data_hdr->info |= WMI_DATA_HDR_MORE;
 
-       data_hdr->info2 = cpu_to_le16(meta_ver << WMI_DATA_HDR_META_SHIFT);
-       data_hdr->info3 = cpu_to_le16(if_idx & WMI_DATA_HDR_IF_IDX_MASK);
+       if (flags & WMI_DATA_HDR_FLAGS_EOSP)
+               data_hdr->info3 |= cpu_to_le16(WMI_DATA_HDR_EOSP);
+
+       data_hdr->info2 |= cpu_to_le16(meta_ver << WMI_DATA_HDR_META_SHIFT);
+       data_hdr->info3 |= cpu_to_le16(if_idx & WMI_DATA_HDR_IF_IDX_MASK);
 
        return 0;
 }
 
-static u8 ath6kl_wmi_determine_user_priority(u8 *pkt, u32 layer2_pri)
+u8 ath6kl_wmi_determine_user_priority(u8 *pkt, u32 layer2_pri)
 {
        struct iphdr *ip_hdr = (struct iphdr *) pkt;
        u8 ip_pri;
@@ -236,6 +238,11 @@ static u8 ath6kl_wmi_determine_user_priority(u8 *pkt, u32 layer2_pri)
                return ip_pri;
 }
 
+u8 ath6kl_wmi_get_traffic_class(u8 user_priority)
+{
+       return  up_to_ac[user_priority & 0x7];
+}
+
 int ath6kl_wmi_implicit_create_pstream(struct wmi *wmi, u8 if_idx,
                                       struct sk_buff *skb,
                                       u32 layer2_priority, bool wmm_enabled,
@@ -419,9 +426,6 @@ static int ath6kl_wmi_tx_complete_event_rx(u8 *datap, int len)
        ath6kl_dbg(ATH6KL_DBG_WMI, "comp: %d %d %d\n",
                   evt->num_msg, evt->msg_len, evt->msg_type);
 
-       if (!AR_DBG_LVL_CHECK(ATH6KL_DBG_WMI))
-               return 0;
-
        for (index = 0; index < evt->num_msg; index++) {
                size = sizeof(struct wmi_tx_complete_event) +
                    (index * sizeof(struct tx_complete_msg_v1));
@@ -786,12 +790,14 @@ static int ath6kl_wmi_connect_event_rx(struct wmi *wmi, u8 *datap, int len,
                                   ev->u.ap_sta.keymgmt,
                                   le16_to_cpu(ev->u.ap_sta.cipher),
                                   ev->u.ap_sta.apsd_info);
+
                        ath6kl_connect_ap_mode_sta(
                                vif, ev->u.ap_sta.aid, ev->u.ap_sta.mac_addr,
                                ev->u.ap_sta.keymgmt,
                                le16_to_cpu(ev->u.ap_sta.cipher),
                                ev->u.ap_sta.auth, ev->assoc_req_len,
-                               ev->assoc_info + ev->beacon_ie_len);
+                               ev->assoc_info + ev->beacon_ie_len,
+                               ev->u.ap_sta.apsd_info);
                }
                return 0;
        }
@@ -1145,9 +1151,9 @@ static int ath6kl_wmi_bitrate_reply_rx(struct wmi *wmi, u8 *datap, int len)
        return 0;
 }
 
-static int ath6kl_wmi_tcmd_test_report_rx(struct wmi *wmi, u8 *datap, int len)
+static int ath6kl_wmi_test_rx(struct wmi *wmi, u8 *datap, int len)
 {
-       ath6kl_tm_rx_report_event(wmi->parent_dev, datap, len);
+       ath6kl_tm_rx_event(wmi->parent_dev, datap, len);
 
        return 0;
 }
@@ -2479,15 +2485,16 @@ int ath6kl_wmi_delete_pstream_cmd(struct wmi *wmi, u8 if_idx, u8 traffic_class,
        return ret;
 }
 
-int ath6kl_wmi_set_ip_cmd(struct wmi *wmi, struct wmi_set_ip_cmd *ip_cmd)
+int ath6kl_wmi_set_ip_cmd(struct wmi *wmi, u8 if_idx,
+                         __be32 ips0, __be32 ips1)
 {
        struct sk_buff *skb;
        struct wmi_set_ip_cmd *cmd;
        int ret;
 
        /* Multicast address are not valid */
-       if ((*((u8 *) &ip_cmd->ips[0]) >= 0xE0) ||
-           (*((u8 *) &ip_cmd->ips[1]) >= 0xE0))
+       if (ipv4_is_multicast(ips0) ||
+           ipv4_is_multicast(ips1))
                return -EINVAL;
 
        skb = ath6kl_wmi_get_new_buf(sizeof(struct wmi_set_ip_cmd));
@@ -2495,9 +2502,10 @@ int ath6kl_wmi_set_ip_cmd(struct wmi *wmi, struct wmi_set_ip_cmd *ip_cmd)
                return -ENOMEM;
 
        cmd = (struct wmi_set_ip_cmd *) skb->data;
-       memcpy(cmd, ip_cmd, sizeof(struct wmi_set_ip_cmd));
+       cmd->ips[0] = ips0;
+       cmd->ips[1] = ips1;
 
-       ret = ath6kl_wmi_cmd_send(wmi, 0, skb, WMI_SET_IP_CMDID,
+       ret = ath6kl_wmi_cmd_send(wmi, if_idx, skb, WMI_SET_IP_CMDID,
                                  NO_SYNC_WMIFLAG);
        return ret;
 }
@@ -2582,6 +2590,18 @@ int ath6kl_wmi_set_host_sleep_mode_cmd(struct wmi *wmi, u8 if_idx,
        return ret;
 }
 
+/* This command has zero length payload */
+static int ath6kl_wmi_host_sleep_mode_cmd_prcd_evt_rx(struct wmi *wmi,
+                                                     struct ath6kl_vif *vif)
+{
+       struct ath6kl *ar = wmi->parent_dev;
+
+       set_bit(HOST_SLEEP_MODE_CMD_PROCESSED, &vif->flags);
+       wake_up(&ar->event_wq);
+
+       return 0;
+}
+
 int ath6kl_wmi_set_wow_mode_cmd(struct wmi *wmi, u8 if_idx,
                                enum ath6kl_wow_mode wow_mode,
                                u32 filter, u16 host_req_delay)
@@ -2612,7 +2632,8 @@ int ath6kl_wmi_set_wow_mode_cmd(struct wmi *wmi, u8 if_idx,
 
 int ath6kl_wmi_add_wow_pattern_cmd(struct wmi *wmi, u8 if_idx,
                                   u8 list_id, u8 filter_size,
-                                  u8 filter_offset, u8 *filter, u8 *mask)
+                                  u8 filter_offset, const u8 *filter,
+                                  const u8 *mask)
 {
        struct sk_buff *skb;
        struct wmi_add_wow_pattern_cmd *cmd;
@@ -2853,6 +2874,51 @@ int ath6kl_wmi_test_cmd(struct wmi *wmi, void *buf, size_t len)
        return ret;
 }
 
+int ath6kl_wmi_mcast_filter_cmd(struct wmi *wmi, u8 if_idx, bool mc_all_on)
+{
+       struct sk_buff *skb;
+       struct wmi_mcast_filter_cmd *cmd;
+       int ret;
+
+       skb = ath6kl_wmi_get_new_buf(sizeof(*cmd));
+       if (!skb)
+               return -ENOMEM;
+
+       cmd = (struct wmi_mcast_filter_cmd *) skb->data;
+       cmd->mcast_all_enable = mc_all_on;
+
+       ret = ath6kl_wmi_cmd_send(wmi, if_idx, skb, WMI_MCAST_FILTER_CMDID,
+                                 NO_SYNC_WMIFLAG);
+       return ret;
+}
+
+int ath6kl_wmi_add_del_mcast_filter_cmd(struct wmi *wmi, u8 if_idx,
+                                       u8 *filter, bool add_filter)
+{
+       struct sk_buff *skb;
+       struct wmi_mcast_filter_add_del_cmd *cmd;
+       int ret;
+
+       if ((filter[0] != 0x33 || filter[1] != 0x33) &&
+           (filter[0] != 0x01 || filter[1] != 0x00 ||
+           filter[2] != 0x5e || filter[3] > 0x7f)) {
+               ath6kl_warn("invalid multicast filter address\n");
+               return -EINVAL;
+       }
+
+       skb = ath6kl_wmi_get_new_buf(sizeof(*cmd));
+       if (!skb)
+               return -ENOMEM;
+
+       cmd = (struct wmi_mcast_filter_add_del_cmd *) skb->data;
+       memcpy(cmd->mcast_mac, filter, ATH6KL_MCAST_FILTER_MAC_ADDR_SIZE);
+       ret = ath6kl_wmi_cmd_send(wmi, if_idx, skb,
+                                 add_filter ? WMI_SET_MCAST_FILTER_CMDID :
+                                 WMI_DEL_MCAST_FILTER_CMDID,
+                                 NO_SYNC_WMIFLAG);
+
+       return ret;
+}
 
 s32 ath6kl_wmi_get_rate(s8 rate_index)
 {
@@ -2946,6 +3012,43 @@ int ath6kl_wmi_ap_set_mlme(struct wmi *wmip, u8 if_idx, u8 cmd, const u8 *mac,
                                   NO_SYNC_WMIFLAG);
 }
 
+/* This command will be used to enable/disable AP uAPSD feature */
+int ath6kl_wmi_ap_set_apsd(struct wmi *wmi, u8 if_idx, u8 enable)
+{
+       struct wmi_ap_set_apsd_cmd *cmd;
+       struct sk_buff *skb;
+
+       skb = ath6kl_wmi_get_new_buf(sizeof(*cmd));
+       if (!skb)
+               return -ENOMEM;
+
+       cmd = (struct wmi_ap_set_apsd_cmd *)skb->data;
+       cmd->enable = enable;
+
+       return ath6kl_wmi_cmd_send(wmi, if_idx, skb, WMI_AP_SET_APSD_CMDID,
+                                  NO_SYNC_WMIFLAG);
+}
+
+int ath6kl_wmi_set_apsd_bfrd_traf(struct wmi *wmi, u8 if_idx,
+                                            u16 aid, u16 bitmap, u32 flags)
+{
+       struct wmi_ap_apsd_buffered_traffic_cmd *cmd;
+       struct sk_buff *skb;
+
+       skb = ath6kl_wmi_get_new_buf(sizeof(*cmd));
+       if (!skb)
+               return -ENOMEM;
+
+       cmd = (struct wmi_ap_apsd_buffered_traffic_cmd *)skb->data;
+       cmd->aid = cpu_to_le16(aid);
+       cmd->bitmap = cpu_to_le16(bitmap);
+       cmd->flags = cpu_to_le32(flags);
+
+       return ath6kl_wmi_cmd_send(wmi, if_idx, skb,
+                                  WMI_AP_APSD_BUFFERED_TRAFFIC_CMDID,
+                                  NO_SYNC_WMIFLAG);
+}
+
 static int ath6kl_wmi_pspoll_event_rx(struct wmi *wmi, u8 *datap, int len,
                                      struct ath6kl_vif *vif)
 {
@@ -3400,7 +3503,7 @@ int ath6kl_wmi_control_rx(struct wmi *wmi, struct sk_buff *skb)
                break;
        case WMI_TEST_EVENTID:
                ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_TEST_EVENTID\n");
-               ret = ath6kl_wmi_tcmd_test_report_rx(wmi, datap, len);
+               ret = ath6kl_wmi_test_rx(wmi, datap, len);
                break;
        case WMI_GET_FIXRATES_CMDID:
                ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_GET_FIXRATES_CMDID\n");
@@ -3465,6 +3568,11 @@ int ath6kl_wmi_control_rx(struct wmi *wmi, struct sk_buff *skb)
                ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_TX_COMPLETE_EVENTID\n");
                ret = ath6kl_wmi_tx_complete_event_rx(datap, len);
                break;
+       case WMI_SET_HOST_SLEEP_MODE_CMD_PROCESSED_EVENTID:
+               ath6kl_dbg(ATH6KL_DBG_WMI,
+                          "WMI_SET_HOST_SLEEP_MODE_CMD_PROCESSED_EVENTID");
+               ret = ath6kl_wmi_host_sleep_mode_cmd_prcd_evt_rx(wmi, vif);
+               break;
        case WMI_REMAIN_ON_CHNL_EVENTID:
                ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_REMAIN_ON_CHNL_EVENTID\n");
                ret = ath6kl_wmi_remain_on_chnl_event_rx(wmi, datap, len, vif);
index 42ac311..e791986 100644 (file)
@@ -149,8 +149,7 @@ enum wmi_msg_type {
 #define WMI_DATA_HDR_PS_MASK        0x1
 #define WMI_DATA_HDR_PS_SHIFT       5
 
-#define WMI_DATA_HDR_MORE_MASK      0x1
-#define WMI_DATA_HDR_MORE_SHIFT     5
+#define WMI_DATA_HDR_MORE      0x20
 
 enum wmi_data_hdr_data_type {
        WMI_DATA_HDR_DATA_TYPE_802_3 = 0,
@@ -160,6 +159,13 @@ enum wmi_data_hdr_data_type {
        WMI_DATA_HDR_DATA_TYPE_ACL,
 };
 
+/* Bitmap of data header flags */
+enum wmi_data_hdr_flags {
+       WMI_DATA_HDR_FLAGS_MORE = 0x1,
+       WMI_DATA_HDR_FLAGS_EOSP = 0x2,
+       WMI_DATA_HDR_FLAGS_UAPSD = 0x4,
+};
+
 #define WMI_DATA_HDR_DATA_TYPE_MASK     0x3
 #define WMI_DATA_HDR_DATA_TYPE_SHIFT    6
 
@@ -173,8 +179,12 @@ enum wmi_data_hdr_data_type {
 #define WMI_DATA_HDR_META_MASK      0x7
 #define WMI_DATA_HDR_META_SHIFT     13
 
+/* Macros for operating on WMI_DATA_HDR (info3) field */
 #define WMI_DATA_HDR_IF_IDX_MASK    0xF
 
+#define WMI_DATA_HDR_TRIG          0x10
+#define WMI_DATA_HDR_EOSP          0x10
+
 struct wmi_data_hdr {
        s8 rssi;
 
@@ -203,7 +213,8 @@ struct wmi_data_hdr {
        /*
         * usage of info3, 16-bit:
         * b3:b0        - Interface index
-        * b15:b4       - Reserved
+        * b4           - uAPSD trigger in rx & EOSP in tx
+        * b15:b5       - Reserved
         */
        __le16 info3;
 } __packed;
@@ -257,6 +268,9 @@ static inline u8 wmi_data_hdr_get_if_idx(struct wmi_data_hdr *dhdr)
 #define WMI_META_VERSION_1     0x01
 #define WMI_META_VERSION_2     0x02
 
+/* Flag to signal to FW to calculate TCP checksum */
+#define WMI_META_V2_FLAG_CSUM_OFFLOAD 0x01
+
 struct wmi_tx_meta_v1 {
        /* packet ID to identify the tx request */
        u8 pkt_id;
@@ -646,7 +660,6 @@ enum auth_mode {
        WPA2_AUTH_CCKM = 0x40,
 };
 
-#define WMI_MIN_KEY_INDEX   0
 #define WMI_MAX_KEY_INDEX   3
 
 #define WMI_MAX_KEY_LEN     32
@@ -1237,6 +1250,15 @@ enum target_event_report_config {
        NO_DISCONN_EVT_IN_RECONN
 };
 
+struct wmi_mcast_filter_cmd {
+       u8 mcast_all_enable;
+} __packed;
+
+#define ATH6KL_MCAST_FILTER_MAC_ADDR_SIZE 6
+struct wmi_mcast_filter_add_del_cmd {
+       u8 mcast_mac[ATH6KL_MCAST_FILTER_MAC_ADDR_SIZE];
+} __packed;
+
 /* Command Replies */
 
 /* WMI_GET_CHANNEL_LIST_CMDID reply */
@@ -1335,6 +1357,8 @@ enum wmi_event_id {
        WMI_P2P_START_SDPD_EVENTID,
        WMI_P2P_SDPD_RX_EVENTID,
 
+       WMI_SET_HOST_SLEEP_MODE_CMD_PROCESSED_EVENTID = 0x1047,
+
        WMI_THIN_RESERVED_START_EVENTID = 0x8000,
        /* Events in this range are reserved for thinmode */
        WMI_THIN_RESERVED_END_EVENTID = 0x8fff,
@@ -1903,7 +1927,7 @@ struct wow_filter {
 
 struct wmi_set_ip_cmd {
        /* IP in network byte order */
-       __le32 ips[MAX_IP_ADDRS];
+       __be32 ips[MAX_IP_ADDRS];
 } __packed;
 
 enum ath6kl_wow_filters {
@@ -2105,6 +2129,19 @@ struct wmi_rx_frame_format_cmd {
 } __packed;
 
 /* AP mode events */
+struct wmi_ap_set_apsd_cmd {
+       u8 enable;
+} __packed;
+
+enum wmi_ap_apsd_buffered_traffic_flags {
+       WMI_AP_APSD_NO_DELIVERY_FRAMES =  0x1,
+};
+
+struct wmi_ap_apsd_buffered_traffic_cmd {
+       __le16 aid;
+       __le16 bitmap;
+       __le32 flags;
+} __packed;
 
 /* WMI_PS_POLL_EVENT */
 struct wmi_pspoll_event {
@@ -2321,7 +2358,7 @@ enum htc_endpoint_id ath6kl_wmi_get_control_ep(struct wmi *wmi);
 void ath6kl_wmi_set_control_ep(struct wmi *wmi, enum htc_endpoint_id ep_id);
 int ath6kl_wmi_dix_2_dot3(struct wmi *wmi, struct sk_buff *skb);
 int ath6kl_wmi_data_hdr_add(struct wmi *wmi, struct sk_buff *skb,
-                           u8 msg_type, bool more_data,
+                           u8 msg_type, u32 flags,
                            enum wmi_data_hdr_data_type data_type,
                            u8 meta_ver, void *tx_meta_info, u8 if_idx);
 
@@ -2417,7 +2454,8 @@ int ath6kl_wmi_test_cmd(struct wmi *wmi, void *buf, size_t len);
 
 s32 ath6kl_wmi_get_rate(s8 rate_index);
 
-int ath6kl_wmi_set_ip_cmd(struct wmi *wmi, struct wmi_set_ip_cmd *ip_cmd);
+int ath6kl_wmi_set_ip_cmd(struct wmi *wmi, u8 if_idx,
+                         __be32 ips0, __be32 ips1);
 int ath6kl_wmi_set_host_sleep_mode_cmd(struct wmi *wmi, u8 if_idx,
                                       enum ath6kl_host_mode host_mode);
 int ath6kl_wmi_set_wow_mode_cmd(struct wmi *wmi, u8 if_idx,
@@ -2425,13 +2463,26 @@ int ath6kl_wmi_set_wow_mode_cmd(struct wmi *wmi, u8 if_idx,
                                u32 filter, u16 host_req_delay);
 int ath6kl_wmi_add_wow_pattern_cmd(struct wmi *wmi, u8 if_idx,
                                   u8 list_id, u8 filter_size,
-                                  u8 filter_offset, u8 *filter, u8 *mask);
+                                  u8 filter_offset, const u8 *filter,
+                                  const u8 *mask);
 int ath6kl_wmi_del_wow_pattern_cmd(struct wmi *wmi, u8 if_idx,
                                   u16 list_id, u16 filter_id);
 int ath6kl_wmi_set_roam_lrssi_cmd(struct wmi *wmi, u8 lrssi);
 int ath6kl_wmi_force_roam_cmd(struct wmi *wmi, const u8 *bssid);
 int ath6kl_wmi_set_roam_mode_cmd(struct wmi *wmi, enum wmi_roam_mode mode);
+int ath6kl_wmi_mcast_filter_cmd(struct wmi *wmi, u8 if_idx, bool mc_all_on);
+int ath6kl_wmi_add_del_mcast_filter_cmd(struct wmi *wmi, u8 if_idx,
+                                       u8 *filter, bool add_filter);
+/* AP mode uAPSD */
+int ath6kl_wmi_ap_set_apsd(struct wmi *wmi, u8 if_idx, u8 enable);
+
+int ath6kl_wmi_set_apsd_bfrd_traf(struct wmi *wmi,
+                                               u8 if_idx, u16 aid,
+                                               u16 bitmap, u32 flags);
+
+u8 ath6kl_wmi_get_traffic_class(u8 user_priority);
 
+u8 ath6kl_wmi_determine_user_priority(u8 *pkt, u32 layer2_pri);
 /* AP mode */
 int ath6kl_wmi_ap_profile_commit(struct wmi *wmip, u8 if_idx,
                                 struct wmi_connect_cmd *p);
index dc6be4a..595a272 100644 (file)
@@ -6,6 +6,14 @@ config ATH9K_DFS_DEBUGFS
        def_bool y
        depends on ATH9K_DEBUGFS && ATH9K_DFS_CERTIFIED
 
+config ATH9K_BTCOEX_SUPPORT
+       bool "Atheros bluetooth coexistence support"
+       depends on (ATH9K || ATH9K_HTC)
+       default y
+       ---help---
+         Say Y, if you want to use the ath9k/ath9k_htc radios together with
+         Bluetooth modules in the same system.
+
 config ATH9K
        tristate "Atheros 802.11n wireless cards support"
        depends on MAC80211
@@ -81,14 +89,6 @@ config ATH9K_RATE_CONTROL
          Say Y, if you want to use the ath9k specific rate control
          module instead of minstrel_ht.
 
-config ATH9K_BTCOEX_SUPPORT
-       bool "Atheros ath9k bluetooth coexistence support"
-       depends on ATH9K
-       default y
-       ---help---
-         Say Y, if you want to use the ath9k radios together with
-         Bluetooth modules in the same system.
-
 config ATH9K_HTC
        tristate "Atheros HTC based wireless cards support"
        depends on USB && MAC80211
index da02242..27d95fe 100644 (file)
@@ -3,9 +3,9 @@ ath9k-y +=      beacon.o \
                init.o \
                main.o \
                recv.o \
-               xmit.o \
-               mci.o \
+               xmit.o
 
+ath9k-$(CONFIG_ATH9K_BTCOEX_SUPPORT) += mci.o
 ath9k-$(CONFIG_ATH9K_RATE_CONTROL) += rc.o
 ath9k-$(CONFIG_ATH9K_PCI) += pci.o
 ath9k-$(CONFIG_ATH9K_AHB) += ahb.o
@@ -31,14 +31,14 @@ ath9k_hw-y:=        \
                eeprom_4k.o \
                eeprom_9287.o \
                ani.o \
-               btcoex.o \
                mac.o \
                ar9002_mac.o \
                ar9003_mac.o \
                ar9003_eeprom.o \
-               ar9003_paprd.o \
-               ar9003_mci.o
+               ar9003_paprd.o
 
+ath9k_hw-$(CONFIG_ATH9K_BTCOEX_SUPPORT) += btcoex.o \
+                                          ar9003_mci.o
 obj-$(CONFIG_ATH9K_HW) += ath9k_hw.o
 
 obj-$(CONFIG_ATH9K_COMMON) += ath9k_common.o
index bc56f57..7e0ea4e 100644 (file)
@@ -407,20 +407,20 @@ static void ath9k_hw_ani_lower_immunity_old(struct ath_hw *ah)
                        if (aniState->ofdmWeakSigDetectOff) {
                                if (ath9k_hw_ani_control(ah,
                                         ATH9K_ANI_OFDM_WEAK_SIGNAL_DETECTION,
-                                        true) == true)
+                                        true))
                                        return;
                        }
                        if (aniState->firstepLevel > 0) {
                                if (ath9k_hw_ani_control(ah,
                                         ATH9K_ANI_FIRSTEP_LEVEL,
-                                        aniState->firstepLevel - 1) == true)
+                                        aniState->firstepLevel - 1))
                                        return;
                        }
                } else {
                        if (aniState->firstepLevel > 0) {
                                if (ath9k_hw_ani_control(ah,
                                         ATH9K_ANI_FIRSTEP_LEVEL,
-                                        aniState->firstepLevel - 1) == true)
+                                        aniState->firstepLevel - 1))
                                        return;
                        }
                }
index e8bdc75..ea4a230 100644 (file)
@@ -459,97 +459,6 @@ static const u32 ar5416Common_9100[][2] = {
        {0x0000a3e0, 0x000001ce},
 };
 
-static const u32 ar5416Bank0_9100[][2] = {
-       /* Addr      allmodes  */
-       {0x000098b0, 0x1e5795e5},
-       {0x000098e0, 0x02008020},
-};
-
-static const u32 ar5416BB_RfGain_9100[][3] = {
-       /* Addr      5G_HT20     5G_HT40   */
-       {0x00009a00, 0x00000000, 0x00000000},
-       {0x00009a04, 0x00000040, 0x00000040},
-       {0x00009a08, 0x00000080, 0x00000080},
-       {0x00009a0c, 0x000001a1, 0x00000141},
-       {0x00009a10, 0x000001e1, 0x00000181},
-       {0x00009a14, 0x00000021, 0x000001c1},
-       {0x00009a18, 0x00000061, 0x00000001},
-       {0x00009a1c, 0x00000168, 0x00000041},
-       {0x00009a20, 0x000001a8, 0x000001a8},
-       {0x00009a24, 0x000001e8, 0x000001e8},
-       {0x00009a28, 0x00000028, 0x00000028},
-       {0x00009a2c, 0x00000068, 0x00000068},
-       {0x00009a30, 0x00000189, 0x000000a8},
-       {0x00009a34, 0x000001c9, 0x00000169},
-       {0x00009a38, 0x00000009, 0x000001a9},
-       {0x00009a3c, 0x00000049, 0x000001e9},
-       {0x00009a40, 0x00000089, 0x00000029},
-       {0x00009a44, 0x00000170, 0x00000069},
-       {0x00009a48, 0x000001b0, 0x00000190},
-       {0x00009a4c, 0x000001f0, 0x000001d0},
-       {0x00009a50, 0x00000030, 0x00000010},
-       {0x00009a54, 0x00000070, 0x00000050},
-       {0x00009a58, 0x00000191, 0x00000090},
-       {0x00009a5c, 0x000001d1, 0x00000151},
-       {0x00009a60, 0x00000011, 0x00000191},
-       {0x00009a64, 0x00000051, 0x000001d1},
-       {0x00009a68, 0x00000091, 0x00000011},
-       {0x00009a6c, 0x000001b8, 0x00000051},
-       {0x00009a70, 0x000001f8, 0x00000198},
-       {0x00009a74, 0x00000038, 0x000001d8},
-       {0x00009a78, 0x00000078, 0x00000018},
-       {0x00009a7c, 0x00000199, 0x00000058},
-       {0x00009a80, 0x000001d9, 0x00000098},
-       {0x00009a84, 0x00000019, 0x00000159},
-       {0x00009a88, 0x00000059, 0x00000199},
-       {0x00009a8c, 0x00000099, 0x000001d9},
-       {0x00009a90, 0x000000d9, 0x00000019},
-       {0x00009a94, 0x000000f9, 0x00000059},
-       {0x00009a98, 0x000000f9, 0x00000099},
-       {0x00009a9c, 0x000000f9, 0x000000d9},
-       {0x00009aa0, 0x000000f9, 0x000000f9},
-       {0x00009aa4, 0x000000f9, 0x000000f9},
-       {0x00009aa8, 0x000000f9, 0x000000f9},
-       {0x00009aac, 0x000000f9, 0x000000f9},
-       {0x00009ab0, 0x000000f9, 0x000000f9},
-       {0x00009ab4, 0x000000f9, 0x000000f9},
-       {0x00009ab8, 0x000000f9, 0x000000f9},
-       {0x00009abc, 0x000000f9, 0x000000f9},
-       {0x00009ac0, 0x000000f9, 0x000000f9},
-       {0x00009ac4, 0x000000f9, 0x000000f9},
-       {0x00009ac8, 0x000000f9, 0x000000f9},
-       {0x00009acc, 0x000000f9, 0x000000f9},
-       {0x00009ad0, 0x000000f9, 0x000000f9},
-       {0x00009ad4, 0x000000f9, 0x000000f9},
-       {0x00009ad8, 0x000000f9, 0x000000f9},
-       {0x00009adc, 0x000000f9, 0x000000f9},
-       {0x00009ae0, 0x000000f9, 0x000000f9},
-       {0x00009ae4, 0x000000f9, 0x000000f9},
-       {0x00009ae8, 0x000000f9, 0x000000f9},
-       {0x00009aec, 0x000000f9, 0x000000f9},
-       {0x00009af0, 0x000000f9, 0x000000f9},
-       {0x00009af4, 0x000000f9, 0x000000f9},
-       {0x00009af8, 0x000000f9, 0x000000f9},
-       {0x00009afc, 0x000000f9, 0x000000f9},
-};
-
-static const u32 ar5416Bank1_9100[][2] = {
-       /* Addr      allmodes  */
-       {0x000098b0, 0x02108421},
-       {0x000098ec, 0x00000008},
-};
-
-static const u32 ar5416Bank2_9100[][2] = {
-       /* Addr      allmodes  */
-       {0x000098b0, 0x0e73ff17},
-       {0x000098e0, 0x00000420},
-};
-
-static const u32 ar5416Bank3_9100[][3] = {
-       /* Addr      5G_HT20     5G_HT40   */
-       {0x000098f0, 0x01400018, 0x01c00018},
-};
-
 static const u32 ar5416Bank6_9100[][3] = {
        /* Addr      5G_HT20     5G_HT40   */
        {0x0000989c, 0x00000000, 0x00000000},
@@ -624,13 +533,6 @@ static const u32 ar5416Bank6TPC_9100[][3] = {
        {0x000098d0, 0x0000000f, 0x0010000f},
 };
 
-static const u32 ar5416Bank7_9100[][2] = {
-       /* Addr      allmodes  */
-       {0x0000989c, 0x00000500},
-       {0x0000989c, 0x00000800},
-       {0x000098cc, 0x0000000e},
-};
-
 static const u32 ar5416Addac_9100[][2] = {
        /* Addr      allmodes  */
        {0x0000989c, 0x00000000},
@@ -1113,178 +1015,6 @@ static const u32 ar5416Common_9160[][2] = {
        {0x0000a3e0, 0x000001ce},
 };
 
-static const u32 ar5416Bank0_9160[][2] = {
-       /* Addr      allmodes  */
-       {0x000098b0, 0x1e5795e5},
-       {0x000098e0, 0x02008020},
-};
-
-static const u32 ar5416BB_RfGain_9160[][3] = {
-       /* Addr      5G_HT20     5G_HT40   */
-       {0x00009a00, 0x00000000, 0x00000000},
-       {0x00009a04, 0x00000040, 0x00000040},
-       {0x00009a08, 0x00000080, 0x00000080},
-       {0x00009a0c, 0x000001a1, 0x00000141},
-       {0x00009a10, 0x000001e1, 0x00000181},
-       {0x00009a14, 0x00000021, 0x000001c1},
-       {0x00009a18, 0x00000061, 0x00000001},
-       {0x00009a1c, 0x00000168, 0x00000041},
-       {0x00009a20, 0x000001a8, 0x000001a8},
-       {0x00009a24, 0x000001e8, 0x000001e8},
-       {0x00009a28, 0x00000028, 0x00000028},
-       {0x00009a2c, 0x00000068, 0x00000068},
-       {0x00009a30, 0x00000189, 0x000000a8},
-       {0x00009a34, 0x000001c9, 0x00000169},
-       {0x00009a38, 0x00000009, 0x000001a9},
-       {0x00009a3c, 0x00000049, 0x000001e9},
-       {0x00009a40, 0x00000089, 0x00000029},
-       {0x00009a44, 0x00000170, 0x00000069},
-       {0x00009a48, 0x000001b0, 0x00000190},
-       {0x00009a4c, 0x000001f0, 0x000001d0},
-       {0x00009a50, 0x00000030, 0x00000010},
-       {0x00009a54, 0x00000070, 0x00000050},
-       {0x00009a58, 0x00000191, 0x00000090},
-       {0x00009a5c, 0x000001d1, 0x00000151},
-       {0x00009a60, 0x00000011, 0x00000191},
-       {0x00009a64, 0x00000051, 0x000001d1},
-       {0x00009a68, 0x00000091, 0x00000011},
-       {0x00009a6c, 0x000001b8, 0x00000051},
-       {0x00009a70, 0x000001f8, 0x00000198},
-       {0x00009a74, 0x00000038, 0x000001d8},
-       {0x00009a78, 0x00000078, 0x00000018},
-       {0x00009a7c, 0x00000199, 0x00000058},
-       {0x00009a80, 0x000001d9, 0x00000098},
-       {0x00009a84, 0x00000019, 0x00000159},
-       {0x00009a88, 0x00000059, 0x00000199},
-       {0x00009a8c, 0x00000099, 0x000001d9},
-       {0x00009a90, 0x000000d9, 0x00000019},
-       {0x00009a94, 0x000000f9, 0x00000059},
-       {0x00009a98, 0x000000f9, 0x00000099},
-       {0x00009a9c, 0x000000f9, 0x000000d9},
-       {0x00009aa0, 0x000000f9, 0x000000f9},
-       {0x00009aa4, 0x000000f9, 0x000000f9},
-       {0x00009aa8, 0x000000f9, 0x000000f9},
-       {0x00009aac, 0x000000f9, 0x000000f9},
-       {0x00009ab0, 0x000000f9, 0x000000f9},
-       {0x00009ab4, 0x000000f9, 0x000000f9},
-       {0x00009ab8, 0x000000f9, 0x000000f9},
-       {0x00009abc, 0x000000f9, 0x000000f9},
-       {0x00009ac0, 0x000000f9, 0x000000f9},
-       {0x00009ac4, 0x000000f9, 0x000000f9},
-       {0x00009ac8, 0x000000f9, 0x000000f9},
-       {0x00009acc, 0x000000f9, 0x000000f9},
-       {0x00009ad0, 0x000000f9, 0x000000f9},
-       {0x00009ad4, 0x000000f9, 0x000000f9},
-       {0x00009ad8, 0x000000f9, 0x000000f9},
-       {0x00009adc, 0x000000f9, 0x000000f9},
-       {0x00009ae0, 0x000000f9, 0x000000f9},
-       {0x00009ae4, 0x000000f9, 0x000000f9},
-       {0x00009ae8, 0x000000f9, 0x000000f9},
-       {0x00009aec, 0x000000f9, 0x000000f9},
-       {0x00009af0, 0x000000f9, 0x000000f9},
-       {0x00009af4, 0x000000f9, 0x000000f9},
-       {0x00009af8, 0x000000f9, 0x000000f9},
-       {0x00009afc, 0x000000f9, 0x000000f9},
-};
-
-static const u32 ar5416Bank1_9160[][2] = {
-       /* Addr      allmodes  */
-       {0x000098b0, 0x02108421},
-       {0x000098ec, 0x00000008},
-};
-
-static const u32 ar5416Bank2_9160[][2] = {
-       /* Addr      allmodes  */
-       {0x000098b0, 0x0e73ff17},
-       {0x000098e0, 0x00000420},
-};
-
-static const u32 ar5416Bank3_9160[][3] = {
-       /* Addr      5G_HT20     5G_HT40   */
-       {0x000098f0, 0x01400018, 0x01c00018},
-};
-
-static const u32 ar5416Bank6_9160[][3] = {
-       /* Addr      5G_HT20     5G_HT40   */
-       {0x0000989c, 0x00000000, 0x00000000},
-       {0x0000989c, 0x00000000, 0x00000000},
-       {0x0000989c, 0x00000000, 0x00000000},
-       {0x0000989c, 0x00e00000, 0x00e00000},
-       {0x0000989c, 0x005e0000, 0x005e0000},
-       {0x0000989c, 0x00120000, 0x00120000},
-       {0x0000989c, 0x00620000, 0x00620000},
-       {0x0000989c, 0x00020000, 0x00020000},
-       {0x0000989c, 0x00ff0000, 0x00ff0000},
-       {0x0000989c, 0x00ff0000, 0x00ff0000},
-       {0x0000989c, 0x00ff0000, 0x00ff0000},
-       {0x0000989c, 0x40ff0000, 0x40ff0000},
-       {0x0000989c, 0x005f0000, 0x005f0000},
-       {0x0000989c, 0x00870000, 0x00870000},
-       {0x0000989c, 0x00f90000, 0x00f90000},
-       {0x0000989c, 0x007b0000, 0x007b0000},
-       {0x0000989c, 0x00ff0000, 0x00ff0000},
-       {0x0000989c, 0x00f50000, 0x00f50000},
-       {0x0000989c, 0x00dc0000, 0x00dc0000},
-       {0x0000989c, 0x00110000, 0x00110000},
-       {0x0000989c, 0x006100a8, 0x006100a8},
-       {0x0000989c, 0x004210a2, 0x004210a2},
-       {0x0000989c, 0x0014008f, 0x0014008f},
-       {0x0000989c, 0x00c40003, 0x00c40003},
-       {0x0000989c, 0x003000f2, 0x003000f2},
-       {0x0000989c, 0x00440016, 0x00440016},
-       {0x0000989c, 0x00410040, 0x00410040},
-       {0x0000989c, 0x0001805e, 0x0001805e},
-       {0x0000989c, 0x0000c0ab, 0x0000c0ab},
-       {0x0000989c, 0x000000f1, 0x000000f1},
-       {0x0000989c, 0x00002081, 0x00002081},
-       {0x0000989c, 0x000000d4, 0x000000d4},
-       {0x000098d0, 0x0000000f, 0x0010000f},
-};
-
-static const u32 ar5416Bank6TPC_9160[][3] = {
-       /* Addr      5G_HT20     5G_HT40   */
-       {0x0000989c, 0x00000000, 0x00000000},
-       {0x0000989c, 0x00000000, 0x00000000},
-       {0x0000989c, 0x00000000, 0x00000000},
-       {0x0000989c, 0x00e00000, 0x00e00000},
-       {0x0000989c, 0x005e0000, 0x005e0000},
-       {0x0000989c, 0x00120000, 0x00120000},
-       {0x0000989c, 0x00620000, 0x00620000},
-       {0x0000989c, 0x00020000, 0x00020000},
-       {0x0000989c, 0x00ff0000, 0x00ff0000},
-       {0x0000989c, 0x00ff0000, 0x00ff0000},
-       {0x0000989c, 0x00ff0000, 0x00ff0000},
-       {0x0000989c, 0x40ff0000, 0x40ff0000},
-       {0x0000989c, 0x005f0000, 0x005f0000},
-       {0x0000989c, 0x00870000, 0x00870000},
-       {0x0000989c, 0x00f90000, 0x00f90000},
-       {0x0000989c, 0x007b0000, 0x007b0000},
-       {0x0000989c, 0x00ff0000, 0x00ff0000},
-       {0x0000989c, 0x00f50000, 0x00f50000},
-       {0x0000989c, 0x00dc0000, 0x00dc0000},
-       {0x0000989c, 0x00110000, 0x00110000},
-       {0x0000989c, 0x006100a8, 0x006100a8},
-       {0x0000989c, 0x00423022, 0x00423022},
-       {0x0000989c, 0x2014008f, 0x2014008f},
-       {0x0000989c, 0x00c40002, 0x00c40002},
-       {0x0000989c, 0x003000f2, 0x003000f2},
-       {0x0000989c, 0x00440016, 0x00440016},
-       {0x0000989c, 0x00410040, 0x00410040},
-       {0x0000989c, 0x0001805e, 0x0001805e},
-       {0x0000989c, 0x0000c0ab, 0x0000c0ab},
-       {0x0000989c, 0x000000e1, 0x000000e1},
-       {0x0000989c, 0x00007080, 0x00007080},
-       {0x0000989c, 0x000000d4, 0x000000d4},
-       {0x000098d0, 0x0000000f, 0x0010000f},
-};
-
-static const u32 ar5416Bank7_9160[][2] = {
-       /* Addr      allmodes  */
-       {0x0000989c, 0x00000500},
-       {0x0000989c, 0x00000800},
-       {0x000098cc, 0x0000000e},
-};
-
 static const u32 ar5416Addac_9160[][2] = {
        /* Addr      allmodes  */
        {0x0000989c, 0x00000000},
index d190411..e3f2689 100644 (file)
@@ -35,11 +35,11 @@ static void ar9002_hw_init_mode_regs(struct ath_hw *ah)
                INIT_INI_ARRAY(&ah->iniCommon, ar9271Common_9271,
                               ARRAY_SIZE(ar9271Common_9271), 2);
                INIT_INI_ARRAY(&ah->iniCommon_normal_cck_fir_coeff_9271,
-                              ar9271Common_normal_cck_fir_coeff_9271,
-                              ARRAY_SIZE(ar9271Common_normal_cck_fir_coeff_9271), 2);
+                              ar9287Common_normal_cck_fir_coeff_9287_1_1,
+                              ARRAY_SIZE(ar9287Common_normal_cck_fir_coeff_9287_1_1), 2);
                INIT_INI_ARRAY(&ah->iniCommon_japan_2484_cck_fir_coeff_9271,
-                              ar9271Common_japan_2484_cck_fir_coeff_9271,
-                              ARRAY_SIZE(ar9271Common_japan_2484_cck_fir_coeff_9271), 2);
+                              ar9287Common_japan_2484_cck_fir_coeff_9287_1_1,
+                              ARRAY_SIZE(ar9287Common_japan_2484_cck_fir_coeff_9287_1_1), 2);
                INIT_INI_ARRAY(&ah->iniModes_9271_1_0_only,
                               ar9271Modes_9271_1_0_only,
                               ARRAY_SIZE(ar9271Modes_9271_1_0_only), 5);
@@ -54,53 +54,31 @@ static void ar9002_hw_init_mode_regs(struct ath_hw *ah)
                return;
        }
 
+       if (ah->config.pcie_clock_req)
+               INIT_INI_ARRAY(&ah->iniPcieSerdes,
+                          ar9280PciePhy_clkreq_off_L1_9280,
+                          ARRAY_SIZE(ar9280PciePhy_clkreq_off_L1_9280), 2);
+       else
+               INIT_INI_ARRAY(&ah->iniPcieSerdes,
+                          ar9280PciePhy_clkreq_always_on_L1_9280,
+                          ARRAY_SIZE(ar9280PciePhy_clkreq_always_on_L1_9280), 2);
+
        if (AR_SREV_9287_11_OR_LATER(ah)) {
                INIT_INI_ARRAY(&ah->iniModes, ar9287Modes_9287_1_1,
                                ARRAY_SIZE(ar9287Modes_9287_1_1), 5);
                INIT_INI_ARRAY(&ah->iniCommon, ar9287Common_9287_1_1,
                                ARRAY_SIZE(ar9287Common_9287_1_1), 2);
-               if (ah->config.pcie_clock_req)
-                       INIT_INI_ARRAY(&ah->iniPcieSerdes,
-                       ar9287PciePhy_clkreq_off_L1_9287_1_1,
-                       ARRAY_SIZE(ar9287PciePhy_clkreq_off_L1_9287_1_1), 2);
-               else
-                       INIT_INI_ARRAY(&ah->iniPcieSerdes,
-                       ar9287PciePhy_clkreq_always_on_L1_9287_1_1,
-                       ARRAY_SIZE(ar9287PciePhy_clkreq_always_on_L1_9287_1_1),
-                                       2);
        } else if (AR_SREV_9285_12_OR_LATER(ah)) {
-
-
                INIT_INI_ARRAY(&ah->iniModes, ar9285Modes_9285_1_2,
                               ARRAY_SIZE(ar9285Modes_9285_1_2), 5);
                INIT_INI_ARRAY(&ah->iniCommon, ar9285Common_9285_1_2,
                               ARRAY_SIZE(ar9285Common_9285_1_2), 2);
-
-               if (ah->config.pcie_clock_req) {
-                       INIT_INI_ARRAY(&ah->iniPcieSerdes,
-                       ar9285PciePhy_clkreq_off_L1_9285_1_2,
-                       ARRAY_SIZE(ar9285PciePhy_clkreq_off_L1_9285_1_2), 2);
-               } else {
-                       INIT_INI_ARRAY(&ah->iniPcieSerdes,
-                       ar9285PciePhy_clkreq_always_on_L1_9285_1_2,
-                       ARRAY_SIZE(ar9285PciePhy_clkreq_always_on_L1_9285_1_2),
-                                 2);
-               }
        } else if (AR_SREV_9280_20_OR_LATER(ah)) {
                INIT_INI_ARRAY(&ah->iniModes, ar9280Modes_9280_2,
                               ARRAY_SIZE(ar9280Modes_9280_2), 5);
                INIT_INI_ARRAY(&ah->iniCommon, ar9280Common_9280_2,
                               ARRAY_SIZE(ar9280Common_9280_2), 2);
 
-               if (ah->config.pcie_clock_req) {
-                       INIT_INI_ARRAY(&ah->iniPcieSerdes,
-                              ar9280PciePhy_clkreq_off_L1_9280,
-                              ARRAY_SIZE(ar9280PciePhy_clkreq_off_L1_9280), 2);
-               } else {
-                       INIT_INI_ARRAY(&ah->iniPcieSerdes,
-                              ar9280PciePhy_clkreq_always_on_L1_9280,
-                              ARRAY_SIZE(ar9280PciePhy_clkreq_always_on_L1_9280), 2);
-               }
                INIT_INI_ARRAY(&ah->iniModesAdditional,
                               ar9280Modes_fast_clock_9280_2,
                               ARRAY_SIZE(ar9280Modes_fast_clock_9280_2), 3);
@@ -109,22 +87,6 @@ static void ar9002_hw_init_mode_regs(struct ath_hw *ah)
                               ARRAY_SIZE(ar5416Modes_9160), 5);
                INIT_INI_ARRAY(&ah->iniCommon, ar5416Common_9160,
                               ARRAY_SIZE(ar5416Common_9160), 2);
-               INIT_INI_ARRAY(&ah->iniBank0, ar5416Bank0_9160,
-                              ARRAY_SIZE(ar5416Bank0_9160), 2);
-               INIT_INI_ARRAY(&ah->iniBB_RfGain, ar5416BB_RfGain_9160,
-                              ARRAY_SIZE(ar5416BB_RfGain_9160), 3);
-               INIT_INI_ARRAY(&ah->iniBank1, ar5416Bank1_9160,
-                              ARRAY_SIZE(ar5416Bank1_9160), 2);
-               INIT_INI_ARRAY(&ah->iniBank2, ar5416Bank2_9160,
-                              ARRAY_SIZE(ar5416Bank2_9160), 2);
-               INIT_INI_ARRAY(&ah->iniBank3, ar5416Bank3_9160,
-                              ARRAY_SIZE(ar5416Bank3_9160), 3);
-               INIT_INI_ARRAY(&ah->iniBank6, ar5416Bank6_9160,
-                              ARRAY_SIZE(ar5416Bank6_9160), 3);
-               INIT_INI_ARRAY(&ah->iniBank6TPC, ar5416Bank6TPC_9160,
-                              ARRAY_SIZE(ar5416Bank6TPC_9160), 3);
-               INIT_INI_ARRAY(&ah->iniBank7, ar5416Bank7_9160,
-                              ARRAY_SIZE(ar5416Bank7_9160), 2);
                if (AR_SREV_9160_11(ah)) {
                        INIT_INI_ARRAY(&ah->iniAddac,
                                       ar5416Addac_9160_1_1,
@@ -138,22 +100,8 @@ static void ar9002_hw_init_mode_regs(struct ath_hw *ah)
                               ARRAY_SIZE(ar5416Modes_9100), 5);
                INIT_INI_ARRAY(&ah->iniCommon, ar5416Common_9100,
                               ARRAY_SIZE(ar5416Common_9100), 2);
-               INIT_INI_ARRAY(&ah->iniBank0, ar5416Bank0_9100,
-                              ARRAY_SIZE(ar5416Bank0_9100), 2);
-               INIT_INI_ARRAY(&ah->iniBB_RfGain, ar5416BB_RfGain_9100,
-                              ARRAY_SIZE(ar5416BB_RfGain_9100), 3);
-               INIT_INI_ARRAY(&ah->iniBank1, ar5416Bank1_9100,
-                              ARRAY_SIZE(ar5416Bank1_9100), 2);
-               INIT_INI_ARRAY(&ah->iniBank2, ar5416Bank2_9100,
-                              ARRAY_SIZE(ar5416Bank2_9100), 2);
-               INIT_INI_ARRAY(&ah->iniBank3, ar5416Bank3_9100,
-                              ARRAY_SIZE(ar5416Bank3_9100), 3);
                INIT_INI_ARRAY(&ah->iniBank6, ar5416Bank6_9100,
                               ARRAY_SIZE(ar5416Bank6_9100), 3);
-               INIT_INI_ARRAY(&ah->iniBank6TPC, ar5416Bank6TPC_9100,
-                              ARRAY_SIZE(ar5416Bank6TPC_9100), 3);
-               INIT_INI_ARRAY(&ah->iniBank7, ar5416Bank7_9100,
-                              ARRAY_SIZE(ar5416Bank7_9100), 2);
                INIT_INI_ARRAY(&ah->iniAddac, ar5416Addac_9100,
                               ARRAY_SIZE(ar5416Addac_9100), 2);
        } else {
@@ -161,24 +109,37 @@ static void ar9002_hw_init_mode_regs(struct ath_hw *ah)
                               ARRAY_SIZE(ar5416Modes), 5);
                INIT_INI_ARRAY(&ah->iniCommon, ar5416Common,
                               ARRAY_SIZE(ar5416Common), 2);
-               INIT_INI_ARRAY(&ah->iniBank0, ar5416Bank0,
-                              ARRAY_SIZE(ar5416Bank0), 2);
+               INIT_INI_ARRAY(&ah->iniBank6TPC, ar5416Bank6TPC,
+                              ARRAY_SIZE(ar5416Bank6TPC), 3);
+               INIT_INI_ARRAY(&ah->iniAddac, ar5416Addac,
+                              ARRAY_SIZE(ar5416Addac), 2);
+       }
+
+       if (!AR_SREV_9280_20_OR_LATER(ah)) {
+               /* Common for AR5416, AR913x, AR9160 */
                INIT_INI_ARRAY(&ah->iniBB_RfGain, ar5416BB_RfGain,
                               ARRAY_SIZE(ar5416BB_RfGain), 3);
+
+               INIT_INI_ARRAY(&ah->iniBank0, ar5416Bank0,
+                              ARRAY_SIZE(ar5416Bank0), 2);
                INIT_INI_ARRAY(&ah->iniBank1, ar5416Bank1,
                               ARRAY_SIZE(ar5416Bank1), 2);
                INIT_INI_ARRAY(&ah->iniBank2, ar5416Bank2,
                               ARRAY_SIZE(ar5416Bank2), 2);
                INIT_INI_ARRAY(&ah->iniBank3, ar5416Bank3,
                               ARRAY_SIZE(ar5416Bank3), 3);
-               INIT_INI_ARRAY(&ah->iniBank6, ar5416Bank6,
-                              ARRAY_SIZE(ar5416Bank6), 3);
-               INIT_INI_ARRAY(&ah->iniBank6TPC, ar5416Bank6TPC,
-                              ARRAY_SIZE(ar5416Bank6TPC), 3);
                INIT_INI_ARRAY(&ah->iniBank7, ar5416Bank7,
                               ARRAY_SIZE(ar5416Bank7), 2);
-               INIT_INI_ARRAY(&ah->iniAddac, ar5416Addac,
-                              ARRAY_SIZE(ar5416Addac), 2);
+
+               /* Common for AR5416, AR9160 */
+               if (!AR_SREV_9100(ah))
+                       INIT_INI_ARRAY(&ah->iniBank6, ar5416Bank6,
+                                      ARRAY_SIZE(ar5416Bank6), 3);
+
+               /* Common for AR913x, AR9160 */
+               if (!AR_SREV_5416(ah))
+                       INIT_INI_ARRAY(&ah->iniBank6TPC, ar5416Bank6TPC_9100,
+                                      ARRAY_SIZE(ar5416Bank6TPC_9100), 3);
        }
 
        /* iniAddac needs to be modified for these chips */
index 863db32..d571c32 100644 (file)
@@ -925,34 +925,6 @@ static const u32 ar9280PciePhy_clkreq_always_on_L1_9280[][2] = {
        {0x00004044, 0x00000000},
 };
 
-static const u32 ar9285PciePhy_clkreq_always_on_L1_9285[][2] = {
-       /* Addr      allmodes  */
-       {0x00004040, 0x9248fd00},
-       {0x00004040, 0x24924924},
-       {0x00004040, 0xa8000019},
-       {0x00004040, 0x13160820},
-       {0x00004040, 0xe5980560},
-       {0x00004040, 0xc01dcffd},
-       {0x00004040, 0x1aaabe41},
-       {0x00004040, 0xbe105554},
-       {0x00004040, 0x00043007},
-       {0x00004044, 0x00000000},
-};
-
-static const u32 ar9285PciePhy_clkreq_off_L1_9285[][2] = {
-       /* Addr      allmodes  */
-       {0x00004040, 0x9248fd00},
-       {0x00004040, 0x24924924},
-       {0x00004040, 0xa8000019},
-       {0x00004040, 0x13160820},
-       {0x00004040, 0xe5980560},
-       {0x00004040, 0xc01dcffc},
-       {0x00004040, 0x1aaabe41},
-       {0x00004040, 0xbe105554},
-       {0x00004040, 0x00043007},
-       {0x00004044, 0x00000000},
-};
-
 static const u32 ar9285Modes_9285_1_2[][5] = {
        /* Addr      5G_HT20     5G_HT40     2G_HT40     2G_HT20   */
        {0x00001030, 0x00000230, 0x00000460, 0x000002c0, 0x00000160},
@@ -1743,34 +1715,6 @@ static const u32 ar9285Modes_XE2_0_high_power[][5] = {
        {0x0000a3e0, 0x000000e7, 0x000000e7, 0x000000e7, 0x000000e7},
 };
 
-static const u32 ar9285PciePhy_clkreq_always_on_L1_9285_1_2[][2] = {
-       /* Addr      allmodes  */
-       {0x00004040, 0x9248fd00},
-       {0x00004040, 0x24924924},
-       {0x00004040, 0xa8000019},
-       {0x00004040, 0x13160820},
-       {0x00004040, 0xe5980560},
-       {0x00004040, 0xc01dcffd},
-       {0x00004040, 0x1aaabe41},
-       {0x00004040, 0xbe105554},
-       {0x00004040, 0x00043007},
-       {0x00004044, 0x00000000},
-};
-
-static const u32 ar9285PciePhy_clkreq_off_L1_9285_1_2[][2] = {
-       /* Addr      allmodes  */
-       {0x00004040, 0x9248fd00},
-       {0x00004040, 0x24924924},
-       {0x00004040, 0xa8000019},
-       {0x00004040, 0x13160820},
-       {0x00004040, 0xe5980560},
-       {0x00004040, 0xc01dcffc},
-       {0x00004040, 0x1aaabe41},
-       {0x00004040, 0xbe105554},
-       {0x00004040, 0x00043007},
-       {0x00004044, 0x00000000},
-};
-
 static const u32 ar9287Modes_9287_1_1[][5] = {
        /* Addr      5G_HT20     5G_HT40     2G_HT40     2G_HT20   */
        {0x00001030, 0x00000000, 0x00000000, 0x000002c0, 0x00000160},
@@ -2512,34 +2456,6 @@ static const u32 ar9287Modes_rx_gain_9287_1_1[][5] = {
        {0x0000a848, 0x00000000, 0x00000000, 0x00001067, 0x00001067},
 };
 
-static const u32 ar9287PciePhy_clkreq_always_on_L1_9287_1_1[][2] = {
-       /* Addr      allmodes  */
-       {0x00004040, 0x9248fd00},
-       {0x00004040, 0x24924924},
-       {0x00004040, 0xa8000019},
-       {0x00004040, 0x13160820},
-       {0x00004040, 0xe5980560},
-       {0x00004040, 0xc01dcffd},
-       {0x00004040, 0x1aaabe41},
-       {0x00004040, 0xbe105554},
-       {0x00004040, 0x00043007},
-       {0x00004044, 0x00000000},
-};
-
-static const u32 ar9287PciePhy_clkreq_off_L1_9287_1_1[][2] = {
-       /* Addr      allmodes  */
-       {0x00004040, 0x9248fd00},
-       {0x00004040, 0x24924924},
-       {0x00004040, 0xa8000019},
-       {0x00004040, 0x13160820},
-       {0x00004040, 0xe5980560},
-       {0x00004040, 0xc01dcffc},
-       {0x00004040, 0x1aaabe41},
-       {0x00004040, 0xbe105554},
-       {0x00004040, 0x00043007},
-       {0x00004044, 0x00000000},
-};
-
 static const u32 ar9271Modes_9271[][5] = {
        /* Addr      5G_HT20     5G_HT40     2G_HT40     2G_HT20   */
        {0x00001030, 0x00000230, 0x00000460, 0x000002c0, 0x00000160},
@@ -3176,20 +3092,6 @@ static const u32 ar9271Common_9271[][2] = {
        {0x0000d384, 0xf3307ff0},
 };
 
-static const u32 ar9271Common_normal_cck_fir_coeff_9271[][2] = {
-       /* Addr      allmodes  */
-       {0x0000a1f4, 0x00fffeff},
-       {0x0000a1f8, 0x00f5f9ff},
-       {0x0000a1fc, 0xb79f6427},
-};
-
-static const u32 ar9271Common_japan_2484_cck_fir_coeff_9271[][2] = {
-       /* Addr      allmodes  */
-       {0x0000a1f4, 0x00000000},
-       {0x0000a1f8, 0xefff0301},
-       {0x0000a1fc, 0xca9228ee},
-};
-
 static const u32 ar9271Modes_9271_1_0_only[][5] = {
        /* Addr      5G_HT20     5G_HT40     2G_HT40     2G_HT20   */
        {0x00009910, 0x30002311, 0x30002311, 0x30002311, 0x30002311},
index 8e70f0b..63089cc 100644 (file)
@@ -925,7 +925,6 @@ static bool ar9003_hw_init_cal(struct ath_hw *ah,
 {
        struct ath_common *common = ath9k_hw_common(ah);
        struct ath9k_hw_cal_data *caldata = ah->caldata;
-       struct ath9k_hw_mci *mci_hw = &ah->btcoex_hw.mci;
        bool txiqcal_done = false, txclcal_done = false;
        bool is_reusable = true, status = true;
        bool run_rtt_cal = false, run_agc_cal;
@@ -998,30 +997,8 @@ static bool ar9003_hw_init_cal(struct ath_hw *ah,
        } else if (caldata && !caldata->done_txiqcal_once)
                run_agc_cal = true;
 
-       if (mci && IS_CHAN_2GHZ(chan) &&
-           (mci_hw->bt_state  == MCI_BT_AWAKE) &&
-           run_agc_cal &&
-           !(mci_hw->config & ATH_MCI_CONFIG_DISABLE_MCI_CAL)) {
-
-               u32 pld[4] = {0, 0, 0, 0};
-
-               /* send CAL_REQ only when BT is AWAKE. */
-               ath_dbg(common, MCI, "MCI send WLAN_CAL_REQ 0x%x\n",
-                       mci_hw->wlan_cal_seq);
-               MCI_GPM_SET_CAL_TYPE(pld, MCI_GPM_WLAN_CAL_REQ);
-               pld[MCI_GPM_WLAN_CAL_W_SEQUENCE] = mci_hw->wlan_cal_seq++;
-               ar9003_mci_send_message(ah, MCI_GPM, 0, pld, 16, true, false);
-
-               /* Wait BT_CAL_GRANT for 50ms */
-               ath_dbg(common, MCI, "MCI wait for BT_CAL_GRANT\n");
-
-               if (ar9003_mci_wait_for_gpm(ah, MCI_GPM_BT_CAL_GRANT, 0, 50000))
-                       ath_dbg(common, MCI, "MCI got BT_CAL_GRANT\n");
-               else {
-                       is_reusable = false;
-                       ath_dbg(common, MCI, "\nMCI BT is not responding\n");
-               }
-       }
+       if (mci && IS_CHAN_2GHZ(chan) && run_agc_cal)
+               ar9003_mci_init_cal_req(ah, &is_reusable);
 
        txiqcal_done = ar9003_hw_tx_iq_cal_run(ah);
        REG_WRITE(ah, AR_PHY_ACTIVE, AR_PHY_ACTIVE_DIS);
@@ -1041,19 +1018,8 @@ skip_tx_iqcal:
                                       0, AH_WAIT_TIMEOUT);
        }
 
-       if (mci && IS_CHAN_2GHZ(chan) &&
-           (mci_hw->bt_state  == MCI_BT_AWAKE) &&
-           run_agc_cal &&
-           !(mci_hw->config & ATH_MCI_CONFIG_DISABLE_MCI_CAL)) {
-
-               u32 pld[4] = {0, 0, 0, 0};
-
-               ath_dbg(common, MCI, "MCI Send WLAN_CAL_DONE 0x%x\n",
-                       mci_hw->wlan_cal_done);
-               MCI_GPM_SET_CAL_TYPE(pld, MCI_GPM_WLAN_CAL_DONE);
-               pld[MCI_GPM_WLAN_CAL_W_SEQUENCE] = mci_hw->wlan_cal_done++;
-               ar9003_mci_send_message(ah, MCI_GPM, 0, pld, 16, true, false);
-       }
+       if (mci && IS_CHAN_2GHZ(chan) && run_agc_cal)
+               ar9003_mci_init_cal_done(ah);
 
        if (rtt && !run_rtt_cal) {
                agc_ctrl |= agc_supp_cals;
index 9fbcbdd..6bb4db0 100644 (file)
@@ -3603,10 +3603,6 @@ static void ar9003_hw_ant_ctrl_apply(struct ath_hw *ah, bool is2ghz)
        u32 value = ar9003_hw_ant_ctrl_common_get(ah, is2ghz);
 
        if (AR_SREV_9462(ah)) {
-               if (AR_SREV_9462_10(ah)) {
-                       value &= ~AR_SWITCH_TABLE_COM_SPDT;
-                       value |= 0x00100000;
-               }
                REG_RMW_FIELD(ah, AR_PHY_SWITCH_COM,
                                AR_SWITCH_TABLE_COM_AR9462_ALL, value);
        } else
index fb937ba..7b4aa00 100644 (file)
@@ -22,7 +22,6 @@
 #include "ar9330_1p1_initvals.h"
 #include "ar9330_1p2_initvals.h"
 #include "ar9580_1p0_initvals.h"
-#include "ar9462_1p0_initvals.h"
 #include "ar9462_2p0_initvals.h"
 
 /* General hardware code for the AR9003 hadware family */
@@ -264,63 +263,6 @@ static void ar9003_hw_init_mode_regs(struct ath_hw *ah)
                                ar9485_1_1_pcie_phy_clkreq_disable_L1,
                                ARRAY_SIZE(ar9485_1_1_pcie_phy_clkreq_disable_L1),
                                2);
-       } else if (AR_SREV_9462_10(ah)) {
-               INIT_INI_ARRAY(&ah->iniMac[ATH_INI_PRE], NULL, 0, 0);
-               INIT_INI_ARRAY(&ah->iniMac[ATH_INI_CORE], ar9462_1p0_mac_core,
-                               ARRAY_SIZE(ar9462_1p0_mac_core), 2);
-               INIT_INI_ARRAY(&ah->iniMac[ATH_INI_POST],
-                               ar9462_1p0_mac_postamble,
-                               ARRAY_SIZE(ar9462_1p0_mac_postamble),
-                               5);
-
-               INIT_INI_ARRAY(&ah->iniBB[ATH_INI_PRE], NULL, 0, 0);
-               INIT_INI_ARRAY(&ah->iniBB[ATH_INI_CORE],
-                               ar9462_1p0_baseband_core,
-                               ARRAY_SIZE(ar9462_1p0_baseband_core),
-                               2);
-               INIT_INI_ARRAY(&ah->iniBB[ATH_INI_POST],
-                               ar9462_1p0_baseband_postamble,
-                               ARRAY_SIZE(ar9462_1p0_baseband_postamble), 5);
-
-               INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_PRE], NULL, 0, 0);
-               INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_CORE],
-                               ar9462_1p0_radio_core,
-                               ARRAY_SIZE(ar9462_1p0_radio_core), 2);
-               INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_POST],
-                               ar9462_1p0_radio_postamble,
-                               ARRAY_SIZE(ar9462_1p0_radio_postamble), 5);
-
-               INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_PRE],
-                               ar9462_1p0_soc_preamble,
-                               ARRAY_SIZE(ar9462_1p0_soc_preamble), 2);
-               INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_CORE], NULL, 0, 0);
-               INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_POST],
-                               ar9462_1p0_soc_postamble,
-                               ARRAY_SIZE(ar9462_1p0_soc_postamble), 5);
-
-               INIT_INI_ARRAY(&ah->iniModesRxGain,
-                               ar9462_common_rx_gain_table_1p0,
-                               ARRAY_SIZE(ar9462_common_rx_gain_table_1p0), 2);
-
-               /* Awake -> Sleep Setting */
-               INIT_INI_ARRAY(&ah->iniPcieSerdes,
-                       ar9462_pcie_phy_clkreq_disable_L1_1p0,
-                       ARRAY_SIZE(ar9462_pcie_phy_clkreq_disable_L1_1p0),
-                       2);
-
-               /* Sleep -> Awake Setting */
-               INIT_INI_ARRAY(&ah->iniPcieSerdesLowPower,
-                       ar9462_pcie_phy_clkreq_disable_L1_1p0,
-                       ARRAY_SIZE(ar9462_pcie_phy_clkreq_disable_L1_1p0),
-                       2);
-
-               INIT_INI_ARRAY(&ah->iniModesAdditional,
-                               ar9462_modes_fast_clock_1p0,
-                               ARRAY_SIZE(ar9462_modes_fast_clock_1p0), 3);
-               INIT_INI_ARRAY(&ah->iniCckfirJapan2484,
-                               AR9462_BB_CTX_COEFJ(1p0),
-                               ARRAY_SIZE(AR9462_BB_CTX_COEFJ(1p0)), 2);
-
        } else if (AR_SREV_9462_20(ah)) {
 
                INIT_INI_ARRAY(&ah->iniMac[ATH_INI_PRE], NULL, 0, 0);
@@ -537,11 +479,6 @@ static void ar9003_tx_gain_table_mode0(struct ath_hw *ah)
                        ar9580_1p0_lowest_ob_db_tx_gain_table,
                        ARRAY_SIZE(ar9580_1p0_lowest_ob_db_tx_gain_table),
                        5);
-       else if (AR_SREV_9462_10(ah))
-               INIT_INI_ARRAY(&ah->iniModesTxGain,
-                       ar9462_modes_low_ob_db_tx_gain_table_1p0,
-                       ARRAY_SIZE(ar9462_modes_low_ob_db_tx_gain_table_1p0),
-                       5);
        else if (AR_SREV_9462_20(ah))
                INIT_INI_ARRAY(&ah->iniModesTxGain,
                        ar9462_modes_low_ob_db_tx_gain_table_2p0,
@@ -581,11 +518,6 @@ static void ar9003_tx_gain_table_mode1(struct ath_hw *ah)
                        ar9580_1p0_high_ob_db_tx_gain_table,
                        ARRAY_SIZE(ar9580_1p0_high_ob_db_tx_gain_table),
                        5);
-       else if (AR_SREV_9462_10(ah))
-               INIT_INI_ARRAY(&ah->iniModesTxGain,
-                       ar9462_modes_high_ob_db_tx_gain_table_1p0,
-                       ARRAY_SIZE(ar9462_modes_high_ob_db_tx_gain_table_1p0),
-                       5);
        else if (AR_SREV_9462_20(ah))
                INIT_INI_ARRAY(&ah->iniModesTxGain,
                        ar9462_modes_high_ob_db_tx_gain_table_2p0,
@@ -712,11 +644,6 @@ static void ar9003_rx_gain_table_mode0(struct ath_hw *ah)
                                ar9580_1p0_rx_gain_table,
                                ARRAY_SIZE(ar9580_1p0_rx_gain_table),
                                2);
-       else if (AR_SREV_9462_10(ah))
-               INIT_INI_ARRAY(&ah->iniModesRxGain,
-                               ar9462_common_rx_gain_table_1p0,
-                               ARRAY_SIZE(ar9462_common_rx_gain_table_1p0),
-                               2);
        else if (AR_SREV_9462_20(ah))
                INIT_INI_ARRAY(&ah->iniModesRxGain,
                                ar9462_common_rx_gain_table_2p0,
@@ -751,11 +678,6 @@ static void ar9003_rx_gain_table_mode1(struct ath_hw *ah)
                        ar9485Common_wo_xlna_rx_gain_1_1,
                        ARRAY_SIZE(ar9485Common_wo_xlna_rx_gain_1_1),
                        2);
-       else if (AR_SREV_9462_10(ah))
-               INIT_INI_ARRAY(&ah->iniModesRxGain,
-                       ar9462_common_wo_xlna_rx_gain_table_1p0,
-                       ARRAY_SIZE(ar9462_common_wo_xlna_rx_gain_table_1p0),
-                       2);
        else if (AR_SREV_9462_20(ah))
                INIT_INI_ARRAY(&ah->iniModesRxGain,
                        ar9462_common_wo_xlna_rx_gain_table_2p0,
@@ -775,14 +697,10 @@ static void ar9003_rx_gain_table_mode1(struct ath_hw *ah)
 
 static void ar9003_rx_gain_table_mode2(struct ath_hw *ah)
 {
-       if (AR_SREV_9462_10(ah))
-               INIT_INI_ARRAY(&ah->iniModesRxGain,
-                       ar9462_common_mixed_rx_gain_table_1p0,
-                       ARRAY_SIZE(ar9462_common_mixed_rx_gain_table_1p0), 2);
-       else if (AR_SREV_9462_20(ah))
+       if (AR_SREV_9462_20(ah))
                INIT_INI_ARRAY(&ah->iniModesRxGain,
-                       ar9462_common_mixed_rx_gain_table_2p0,
-                       ARRAY_SIZE(ar9462_common_mixed_rx_gain_table_2p0), 2);
+                              ar9462_common_mixed_rx_gain_table_2p0,
+                              ARRAY_SIZE(ar9462_common_mixed_rx_gain_table_2p0), 2);
 }
 
 static void ar9003_rx_gain_table_apply(struct ath_hw *ah)
index 09b8c9d..8d1bca0 100644 (file)
@@ -16,6 +16,7 @@
 #include <linux/export.h>
 #include "hw.h"
 #include "ar9003_mac.h"
+#include "ar9003_mci.h"
 
 static void ar9003_hw_rx_enable(struct ath_hw *hw)
 {
@@ -28,11 +29,14 @@ ar9003_set_txdesc(struct ath_hw *ah, void *ds, struct ath_tx_info *i)
        struct ar9003_txc *ads = ds;
        int checksum = 0;
        u32 val, ctl12, ctl17;
+       u8 desc_len;
+
+       desc_len = (AR_SREV_9462(ah) ? 0x18 : 0x17);
 
        val = (ATHEROS_VENDOR_ID << AR_DescId_S) |
              (1 << AR_TxRxDesc_S) |
              (1 << AR_CtrlStat_S) |
-             (i->qcu << AR_TxQcuNum_S) | 0x17;
+             (i->qcu << AR_TxQcuNum_S) | desc_len;
 
        checksum += val;
        ACCESS_ONCE(ads->info) = val;
@@ -81,6 +85,7 @@ ar9003_set_txdesc(struct ath_hw *ah, void *ds, struct ath_tx_info *i)
        ads->ctl20 = 0;
        ads->ctl21 = 0;
        ads->ctl22 = 0;
+       ads->ctl23 = 0;
 
        ctl17 = SM(i->keytype, AR_EncrType);
        if (!i->is_first) {
@@ -176,7 +181,6 @@ static bool ar9003_hw_get_isr(struct ath_hw *ah, enum ath9k_int *masked)
        u32 mask2 = 0;
        struct ath9k_hw_capabilities *pCap = &ah->caps;
        struct ath_common *common = ath9k_hw_common(ah);
-       struct ath9k_hw_mci *mci = &ah->btcoex_hw.mci;
        u32 sync_cause = 0, async_cause;
 
        async_cause = REG_READ(ah, AR_INTR_ASYNC_CAUSE);
@@ -298,32 +302,8 @@ static bool ar9003_hw_get_isr(struct ath_hw *ah, enum ath9k_int *masked)
                        ar9003_hw_bb_watchdog_read(ah);
        }
 
-       if (async_cause & AR_INTR_ASYNC_MASK_MCI) {
-               u32 raw_intr, rx_msg_intr;
-
-               rx_msg_intr = REG_READ(ah, AR_MCI_INTERRUPT_RX_MSG_RAW);
-               raw_intr = REG_READ(ah, AR_MCI_INTERRUPT_RAW);
-
-               if ((raw_intr == 0xdeadbeef) || (rx_msg_intr == 0xdeadbeef))
-                       ath_dbg(common, MCI,
-                               "MCI gets 0xdeadbeef during MCI int processing new raw_intr=0x%08x, new rx_msg_raw=0x%08x, raw_intr=0x%08x, rx_msg_raw=0x%08x\n",
-                               raw_intr, rx_msg_intr, mci->raw_intr,
-                               mci->rx_msg_intr);
-               else {
-                       mci->rx_msg_intr |= rx_msg_intr;
-                       mci->raw_intr |= raw_intr;
-                       *masked |= ATH9K_INT_MCI;
-
-                       if (rx_msg_intr & AR_MCI_INTERRUPT_RX_MSG_CONT_INFO)
-                               mci->cont_status =
-                                       REG_READ(ah, AR_MCI_CONT_STATUS);
-
-                       REG_WRITE(ah, AR_MCI_INTERRUPT_RX_MSG_RAW, rx_msg_intr);
-                       REG_WRITE(ah, AR_MCI_INTERRUPT_RAW, raw_intr);
-                       ath_dbg(common, MCI, "AR_INTR_SYNC_MCI\n");
-
-               }
-       }
+       if (async_cause & AR_INTR_ASYNC_MASK_MCI)
+               ar9003_mci_get_isr(ah, masked);
 
        if (sync_cause) {
                if (sync_cause & AR_INTR_SYNC_RADM_CPL_TIMEOUT) {
@@ -530,7 +510,11 @@ int ath9k_hw_process_rxdesc_edma(struct ath_hw *ah, struct ath_rx_status *rxs,
                 */
                if (rxsp->status11 & AR_CRCErr)
                        rxs->rs_status |= ATH9K_RXERR_CRC;
-               else if (rxsp->status11 & AR_PHYErr) {
+               else if (rxsp->status11 & AR_DecryptCRCErr)
+                       rxs->rs_status |= ATH9K_RXERR_DECRYPT;
+               else if (rxsp->status11 & AR_MichaelErr)
+                       rxs->rs_status |= ATH9K_RXERR_MIC;
+               if (rxsp->status11 & AR_PHYErr) {
                        phyerr = MS(rxsp->status11, AR_PHYErrCode);
                        /*
                         * If we reach a point here where AR_PostDelimCRCErr is
@@ -552,11 +536,7 @@ int ath9k_hw_process_rxdesc_edma(struct ath_hw *ah, struct ath_rx_status *rxs,
                                rxs->rs_status |= ATH9K_RXERR_PHY;
                                rxs->rs_phyerr = phyerr;
                        }
-
-               } else if (rxsp->status11 & AR_DecryptCRCErr)
-                       rxs->rs_status |= ATH9K_RXERR_DECRYPT;
-               else if (rxsp->status11 & AR_MichaelErr)
-                       rxs->rs_status |= ATH9K_RXERR_MIC;
+               };
        }
 
        if (rxsp->status11 & AR_KeyMiss)
index e203b51..cbf60b0 100644 (file)
@@ -92,7 +92,8 @@ struct ar9003_txc {
        u32 ctl20;  /* DMA control 20 */
        u32 ctl21;  /* DMA control 21 */
        u32 ctl22;  /* DMA control 22 */
-       u32 pad[9]; /* pad to cache line (128 bytes/32 dwords) */
+       u32 ctl23;  /* DMA control 23 */
+       u32 pad[8]; /* pad to cache line (128 bytes/32 dwords) */
 } __packed __aligned(4);
 
 struct ar9003_txs {
index 709520c..3cac293 100644 (file)
 
 #include <linux/export.h>
 #include "hw.h"
+#include "hw-ops.h"
 #include "ar9003_phy.h"
 #include "ar9003_mci.h"
 
 static void ar9003_mci_reset_req_wakeup(struct ath_hw *ah)
 {
-       if (!AR_SREV_9462_20(ah))
-               return;
-
        REG_RMW_FIELD(ah, AR_MCI_COMMAND2,
                      AR_MCI_COMMAND2_RESET_REQ_WAKEUP, 1);
        udelay(1);
@@ -37,13 +35,10 @@ static int ar9003_mci_wait_for_interrupt(struct ath_hw *ah, u32 address,
        struct ath_common *common = ath9k_hw_common(ah);
 
        while (time_out) {
-
                if (REG_READ(ah, address) & bit_position) {
-
                        REG_WRITE(ah, address, bit_position);
 
                        if (address == AR_MCI_INTERRUPT_RX_MSG_RAW) {
-
                                if (bit_position &
                                    AR_MCI_INTERRUPT_RX_MSG_REQ_WAKE)
                                        ar9003_mci_reset_req_wakeup(ah);
@@ -81,25 +76,19 @@ static int ar9003_mci_wait_for_interrupt(struct ath_hw *ah, u32 address,
        return time_out;
 }
 
-void ar9003_mci_remote_reset(struct ath_hw *ah, bool wait_done)
+static void ar9003_mci_remote_reset(struct ath_hw *ah, bool wait_done)
 {
        u32 payload[4] = { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffff00};
 
-       if (!ATH9K_HW_CAP_MCI)
-               return;
-
        ar9003_mci_send_message(ah, MCI_REMOTE_RESET, 0, payload, 16,
                                wait_done, false);
        udelay(5);
 }
 
-void ar9003_mci_send_lna_transfer(struct ath_hw *ah, bool wait_done)
+static void ar9003_mci_send_lna_transfer(struct ath_hw *ah, bool wait_done)
 {
        u32 payload = 0x00000000;
 
-       if (!ATH9K_HW_CAP_MCI)
-               return;
-
        ar9003_mci_send_message(ah, MCI_LNA_TRANS, 0, &payload, 1,
                                wait_done, false);
 }
@@ -111,11 +100,8 @@ static void ar9003_mci_send_req_wake(struct ath_hw *ah, bool wait_done)
        udelay(5);
 }
 
-void ar9003_mci_send_sys_waking(struct ath_hw *ah, bool wait_done)
+static void ar9003_mci_send_sys_waking(struct ath_hw *ah, bool wait_done)
 {
-       if (!ATH9K_HW_CAP_MCI)
-               return;
-
        ar9003_mci_send_message(ah, MCI_SYS_WAKING, MCI_FLAG_DISABLE_TIMESTAMP,
                                NULL, 0, wait_done, false);
 }
@@ -138,30 +124,27 @@ static void ar9003_mci_send_sys_sleeping(struct ath_hw *ah, bool wait_done)
 static void ar9003_mci_send_coex_version_query(struct ath_hw *ah,
                                               bool wait_done)
 {
-       struct ath_common *common = ath9k_hw_common(ah);
        struct ath9k_hw_mci *mci = &ah->btcoex_hw.mci;
        u32 payload[4] = {0, 0, 0, 0};
 
        if (!mci->bt_version_known &&
-                       (mci->bt_state != MCI_BT_SLEEP)) {
-               ath_dbg(common, MCI, "MCI Send Coex version query\n");
+           (mci->bt_state != MCI_BT_SLEEP)) {
                MCI_GPM_SET_TYPE_OPCODE(payload,
-                               MCI_GPM_COEX_AGENT, MCI_GPM_COEX_VERSION_QUERY);
+                                       MCI_GPM_COEX_AGENT,
+                                       MCI_GPM_COEX_VERSION_QUERY);
                ar9003_mci_send_message(ah, MCI_GPM, 0, payload, 16,
-                               wait_done, true);
+                                       wait_done, true);
        }
 }
 
 static void ar9003_mci_send_coex_version_response(struct ath_hw *ah,
-                                                    bool wait_done)
+                                                 bool wait_done)
 {
-       struct ath_common *common = ath9k_hw_common(ah);
        struct ath9k_hw_mci *mci = &ah->btcoex_hw.mci;
        u32 payload[4] = {0, 0, 0, 0};
 
-       ath_dbg(common, MCI, "MCI Send Coex version response\n");
        MCI_GPM_SET_TYPE_OPCODE(payload, MCI_GPM_COEX_AGENT,
-                       MCI_GPM_COEX_VERSION_RESPONSE);
+                               MCI_GPM_COEX_VERSION_RESPONSE);
        *(((u8 *)payload) + MCI_GPM_COEX_B_MAJOR_VERSION) =
                mci->wlan_ver_major;
        *(((u8 *)payload) + MCI_GPM_COEX_B_MINOR_VERSION) =
@@ -170,15 +153,16 @@ static void ar9003_mci_send_coex_version_response(struct ath_hw *ah,
 }
 
 static void ar9003_mci_send_coex_wlan_channels(struct ath_hw *ah,
-                                                 bool wait_done)
+                                              bool wait_done)
 {
        struct ath9k_hw_mci *mci = &ah->btcoex_hw.mci;
        u32 *payload = &mci->wlan_channels[0];
 
        if ((mci->wlan_channels_update == true) &&
-                       (mci->bt_state != MCI_BT_SLEEP)) {
+           (mci->bt_state != MCI_BT_SLEEP)) {
                MCI_GPM_SET_TYPE_OPCODE(payload,
-               MCI_GPM_COEX_AGENT, MCI_GPM_COEX_WLAN_CHANNELS);
+                                       MCI_GPM_COEX_AGENT,
+                                       MCI_GPM_COEX_WLAN_CHANNELS);
                ar9003_mci_send_message(ah, MCI_GPM, 0, payload, 16,
                                        wait_done, true);
                MCI_GPM_SET_TYPE_OPCODE(payload, 0xff, 0xff);
@@ -188,7 +172,6 @@ static void ar9003_mci_send_coex_wlan_channels(struct ath_hw *ah,
 static void ar9003_mci_send_coex_bt_status_query(struct ath_hw *ah,
                                                bool wait_done, u8 query_type)
 {
-       struct ath_common *common = ath9k_hw_common(ah);
        struct ath9k_hw_mci *mci = &ah->btcoex_hw.mci;
        u32 payload[4] = {0, 0, 0, 0};
        bool query_btinfo = !!(query_type & (MCI_GPM_COEX_QUERY_BT_ALL_INFO |
@@ -196,25 +179,19 @@ static void ar9003_mci_send_coex_bt_status_query(struct ath_hw *ah,
 
        if (mci->bt_state != MCI_BT_SLEEP) {
 
-               ath_dbg(common, MCI, "MCI Send Coex BT Status Query 0x%02X\n",
-                       query_type);
-
-               MCI_GPM_SET_TYPE_OPCODE(payload,
-                               MCI_GPM_COEX_AGENT, MCI_GPM_COEX_STATUS_QUERY);
+               MCI_GPM_SET_TYPE_OPCODE(payload, MCI_GPM_COEX_AGENT,
+                                       MCI_GPM_COEX_STATUS_QUERY);
 
                *(((u8 *)payload) + MCI_GPM_COEX_B_BT_BITMAP) = query_type;
+
                /*
                 * If bt_status_query message is  not sent successfully,
                 * then need_flush_btinfo should be set again.
                 */
                if (!ar9003_mci_send_message(ah, MCI_GPM, 0, payload, 16,
                                             wait_done, true)) {
-                       if (query_btinfo) {
+                       if (query_btinfo)
                                mci->need_flush_btinfo = true;
-
-                               ath_dbg(common, MCI,
-                                       "MCI send bt_status_query fail, set flush flag again\n");
-                       }
                }
 
                if (query_btinfo)
@@ -222,21 +199,14 @@ static void ar9003_mci_send_coex_bt_status_query(struct ath_hw *ah,
        }
 }
 
-void ar9003_mci_send_coex_halt_bt_gpm(struct ath_hw *ah, bool halt,
-                                     bool wait_done)
+static void ar9003_mci_send_coex_halt_bt_gpm(struct ath_hw *ah, bool halt,
+                                            bool wait_done)
 {
-       struct ath_common *common = ath9k_hw_common(ah);
        struct ath9k_hw_mci *mci = &ah->btcoex_hw.mci;
        u32 payload[4] = {0, 0, 0, 0};
 
-       if (!ATH9K_HW_CAP_MCI)
-               return;
-
-       ath_dbg(common, MCI, "MCI Send Coex %s BT GPM\n",
-               (halt) ? "halt" : "unhalt");
-
-       MCI_GPM_SET_TYPE_OPCODE(payload,
-                               MCI_GPM_COEX_AGENT, MCI_GPM_COEX_HALT_BT_GPM);
+       MCI_GPM_SET_TYPE_OPCODE(payload, MCI_GPM_COEX_AGENT,
+                               MCI_GPM_COEX_HALT_BT_GPM);
 
        if (halt) {
                mci->query_bt = true;
@@ -252,7 +222,6 @@ void ar9003_mci_send_coex_halt_bt_gpm(struct ath_hw *ah, bool halt,
        ar9003_mci_send_message(ah, MCI_GPM, 0, payload, 16, wait_done, true);
 }
 
-
 static void ar9003_mci_prep_interface(struct ath_hw *ah)
 {
        struct ath_common *common = ath9k_hw_common(ah);
@@ -269,30 +238,14 @@ static void ar9003_mci_prep_interface(struct ath_hw *ah)
        REG_WRITE(ah, AR_MCI_INTERRUPT_RAW,
                  REG_READ(ah, AR_MCI_INTERRUPT_RAW));
 
-       /* Remote Reset */
-       ath_dbg(common, MCI, "MCI Reset sequence start\n");
-       ath_dbg(common, MCI, "MCI send REMOTE_RESET\n");
        ar9003_mci_remote_reset(ah, true);
-
-       /*
-        * This delay is required for the reset delay worst case value 255 in
-        * MCI_COMMAND2 register
-        */
-
-       if (AR_SREV_9462_10(ah))
-               udelay(252);
-
-       ath_dbg(common, MCI, "MCI Send REQ_WAKE to remoter(BT)\n");
        ar9003_mci_send_req_wake(ah, true);
 
        if (ar9003_mci_wait_for_interrupt(ah, AR_MCI_INTERRUPT_RX_MSG_RAW,
-                               AR_MCI_INTERRUPT_RX_MSG_SYS_WAKING, 500)) {
+                                 AR_MCI_INTERRUPT_RX_MSG_SYS_WAKING, 500)) {
 
-               ath_dbg(common, MCI, "MCI SYS_WAKING from remote(BT)\n");
                mci->bt_state = MCI_BT_AWAKE;
 
-               if (AR_SREV_9462_10(ah))
-                       udelay(10);
                /*
                 * we don't need to send more remote_reset at this moment.
                 * If BT receive first remote_reset, then BT HW will
@@ -309,11 +262,6 @@ static void ar9003_mci_prep_interface(struct ath_hw *ah)
                 * Similarly, if in any case, WLAN can receive BT's sys_waking,
                 * that means WLAN's RX is also fine.
                 */
-
-               /* Send SYS_WAKING to BT */
-
-               ath_dbg(common, MCI, "MCI send SW SYS_WAKING to remote BT\n");
-
                ar9003_mci_send_sys_waking(ah, true);
                udelay(10);
 
@@ -321,7 +269,6 @@ static void ar9003_mci_prep_interface(struct ath_hw *ah)
                 * Set BT priority interrupt value to be 0xff to
                 * avoid having too many BT PRIORITY interrupts.
                 */
-
                REG_WRITE(ah, AR_MCI_BT_PRI0, 0xFFFFFFFF);
                REG_WRITE(ah, AR_MCI_BT_PRI1, 0xFFFFFFFF);
                REG_WRITE(ah, AR_MCI_BT_PRI2, 0xFFFFFFFF);
@@ -339,77 +286,70 @@ static void ar9003_mci_prep_interface(struct ath_hw *ah)
                REG_WRITE(ah, AR_MCI_INTERRUPT_RAW,
                          AR_MCI_INTERRUPT_BT_PRI);
 
-               if (AR_SREV_9462_10(ah) || mci->is_2g) {
-                       /* Send LNA_TRANS */
-                       ath_dbg(common, MCI, "MCI send LNA_TRANS to BT\n");
+               if (mci->is_2g) {
                        ar9003_mci_send_lna_transfer(ah, true);
                        udelay(5);
                }
 
-               if (AR_SREV_9462_10(ah) || (mci->is_2g &&
-                                           !mci->update_2g5g)) {
+               if ((mci->is_2g && !mci->update_2g5g)) {
                        if (ar9003_mci_wait_for_interrupt(ah,
-                               AR_MCI_INTERRUPT_RX_MSG_RAW,
-                               AR_MCI_INTERRUPT_RX_MSG_LNA_INFO,
-                               mci_timeout))
+                                         AR_MCI_INTERRUPT_RX_MSG_RAW,
+                                         AR_MCI_INTERRUPT_RX_MSG_LNA_INFO,
+                                         mci_timeout))
                                ath_dbg(common, MCI,
                                        "MCI WLAN has control over the LNA & BT obeys it\n");
                        else
                                ath_dbg(common, MCI,
                                        "MCI BT didn't respond to LNA_TRANS\n");
                }
-
-               if (AR_SREV_9462_10(ah)) {
-                       /* Send another remote_reset to deassert BT clk_req. */
-                       ath_dbg(common, MCI,
-                               "MCI another remote_reset to deassert clk_req\n");
-                       ar9003_mci_remote_reset(ah, true);
-                       udelay(252);
-               }
        }
 
        /* Clear the extra redundant SYS_WAKING from BT */
        if ((mci->bt_state == MCI_BT_AWAKE) &&
                (REG_READ_FIELD(ah, AR_MCI_INTERRUPT_RX_MSG_RAW,
                                AR_MCI_INTERRUPT_RX_MSG_SYS_WAKING)) &&
-               (REG_READ_FIELD(ah, AR_MCI_INTERRUPT_RX_MSG_RAW,
-                               AR_MCI_INTERRUPT_RX_MSG_SYS_SLEEPING) == 0)) {
-
-                       REG_WRITE(ah, AR_MCI_INTERRUPT_RX_MSG_RAW,
-                                 AR_MCI_INTERRUPT_RX_MSG_SYS_WAKING);
-                       REG_WRITE(ah, AR_MCI_INTERRUPT_RAW,
-                                 AR_MCI_INTERRUPT_REMOTE_SLEEP_UPDATE);
+           (REG_READ_FIELD(ah, AR_MCI_INTERRUPT_RX_MSG_RAW,
+                           AR_MCI_INTERRUPT_RX_MSG_SYS_SLEEPING) == 0)) {
+               REG_WRITE(ah, AR_MCI_INTERRUPT_RX_MSG_RAW,
+                         AR_MCI_INTERRUPT_RX_MSG_SYS_WAKING);
+               REG_WRITE(ah, AR_MCI_INTERRUPT_RAW,
+                         AR_MCI_INTERRUPT_REMOTE_SLEEP_UPDATE);
        }
 
        REG_WRITE(ah, AR_MCI_INTERRUPT_EN, saved_mci_int_en);
 }
 
-void ar9003_mci_disable_interrupt(struct ath_hw *ah)
+void ar9003_mci_set_full_sleep(struct ath_hw *ah)
 {
-       if (!ATH9K_HW_CAP_MCI)
-               return;
+       struct ath9k_hw_mci *mci = &ah->btcoex_hw.mci;
+
+       if (ar9003_mci_state(ah, MCI_STATE_ENABLE, NULL) &&
+           (mci->bt_state != MCI_BT_SLEEP) &&
+           !mci->halted_bt_gpm) {
+               ar9003_mci_send_coex_halt_bt_gpm(ah, true, true);
+       }
+
+       mci->ready = false;
+       REG_WRITE(ah, AR_RTC_KEEP_AWAKE, 0x2);
+}
 
+static void ar9003_mci_disable_interrupt(struct ath_hw *ah)
+{
        REG_WRITE(ah, AR_MCI_INTERRUPT_EN, 0);
        REG_WRITE(ah, AR_MCI_INTERRUPT_RX_MSG_EN, 0);
 }
 
-void ar9003_mci_enable_interrupt(struct ath_hw *ah)
+static void ar9003_mci_enable_interrupt(struct ath_hw *ah)
 {
-       if (!ATH9K_HW_CAP_MCI)
-               return;
-
        REG_WRITE(ah, AR_MCI_INTERRUPT_EN, AR_MCI_INTERRUPT_DEFAULT);
        REG_WRITE(ah, AR_MCI_INTERRUPT_RX_MSG_EN,
                  AR_MCI_INTERRUPT_RX_MSG_DEFAULT);
 }
 
-bool ar9003_mci_check_int(struct ath_hw *ah, u32 ints)
+static bool ar9003_mci_check_int(struct ath_hw *ah, u32 ints)
 {
        u32 intr;
 
-       if (!ATH9K_HW_CAP_MCI)
-               return false;
-
        intr = REG_READ(ah, AR_MCI_INTERRUPT_RX_MSG_RAW);
        return ((intr & ints) == ints);
 }
@@ -419,9 +359,6 @@ void ar9003_mci_get_interrupt(struct ath_hw *ah, u32 *raw_intr,
 {
        struct ath9k_hw_mci *mci = &ah->btcoex_hw.mci;
 
-       if (!ATH9K_HW_CAP_MCI)
-               return;
-
        *raw_intr = mci->raw_intr;
        *rx_msg_intr = mci->rx_msg_intr;
 
@@ -431,12 +368,34 @@ void ar9003_mci_get_interrupt(struct ath_hw *ah, u32 *raw_intr,
 }
 EXPORT_SYMBOL(ar9003_mci_get_interrupt);
 
-void ar9003_mci_2g5g_changed(struct ath_hw *ah, bool is_2g)
+void ar9003_mci_get_isr(struct ath_hw *ah, enum ath9k_int *masked)
 {
+       struct ath_common *common = ath9k_hw_common(ah);
        struct ath9k_hw_mci *mci = &ah->btcoex_hw.mci;
+       u32 raw_intr, rx_msg_intr;
 
-       if (!ATH9K_HW_CAP_MCI)
-               return;
+       rx_msg_intr = REG_READ(ah, AR_MCI_INTERRUPT_RX_MSG_RAW);
+       raw_intr = REG_READ(ah, AR_MCI_INTERRUPT_RAW);
+
+       if ((raw_intr == 0xdeadbeef) || (rx_msg_intr == 0xdeadbeef)) {
+               ath_dbg(common, MCI,
+                       "MCI gets 0xdeadbeef during int processing\n");
+       } else {
+               mci->rx_msg_intr |= rx_msg_intr;
+               mci->raw_intr |= raw_intr;
+               *masked |= ATH9K_INT_MCI;
+
+               if (rx_msg_intr & AR_MCI_INTERRUPT_RX_MSG_CONT_INFO)
+                       mci->cont_status = REG_READ(ah, AR_MCI_CONT_STATUS);
+
+               REG_WRITE(ah, AR_MCI_INTERRUPT_RX_MSG_RAW, rx_msg_intr);
+               REG_WRITE(ah, AR_MCI_INTERRUPT_RAW, raw_intr);
+       }
+}
+
+static void ar9003_mci_2g5g_changed(struct ath_hw *ah, bool is_2g)
+{
+       struct ath9k_hw_mci *mci = &ah->btcoex_hw.mci;
 
        if (!mci->update_2g5g &&
            (mci->is_2g != is_2g))
@@ -447,7 +406,6 @@ void ar9003_mci_2g5g_changed(struct ath_hw *ah, bool is_2g)
 
 static bool ar9003_mci_is_gpm_valid(struct ath_hw *ah, u32 msg_index)
 {
-       struct ath_common *common = ath9k_hw_common(ah);
        struct ath9k_hw_mci *mci = &ah->btcoex_hw.mci;
        u32 *payload;
        u32 recv_type, offset;
@@ -460,10 +418,8 @@ static bool ar9003_mci_is_gpm_valid(struct ath_hw *ah, u32 msg_index)
        payload = (u32 *)(mci->gpm_buf + offset);
        recv_type = MCI_GPM_TYPE(payload);
 
-       if (recv_type == MCI_GPM_RSVD_PATTERN) {
-               ath_dbg(common, MCI, "MCI Skip RSVD GPM\n");
+       if (recv_type == MCI_GPM_RSVD_PATTERN)
                return false;
-       }
 
        return true;
 }
@@ -471,42 +427,31 @@ static bool ar9003_mci_is_gpm_valid(struct ath_hw *ah, u32 msg_index)
 static void ar9003_mci_observation_set_up(struct ath_hw *ah)
 {
        struct ath9k_hw_mci *mci = &ah->btcoex_hw.mci;
-       if (mci->config & ATH_MCI_CONFIG_MCI_OBS_MCI) {
 
-               ath9k_hw_cfg_output(ah, 3,
-                                       AR_GPIO_OUTPUT_MUX_AS_MCI_WLAN_DATA);
+       if (mci->config & ATH_MCI_CONFIG_MCI_OBS_MCI) {
+               ath9k_hw_cfg_output(ah, 3, AR_GPIO_OUTPUT_MUX_AS_MCI_WLAN_DATA);
                ath9k_hw_cfg_output(ah, 2, AR_GPIO_OUTPUT_MUX_AS_MCI_WLAN_CLK);
                ath9k_hw_cfg_output(ah, 1, AR_GPIO_OUTPUT_MUX_AS_MCI_BT_DATA);
                ath9k_hw_cfg_output(ah, 0, AR_GPIO_OUTPUT_MUX_AS_MCI_BT_CLK);
-
        } else if (mci->config & ATH_MCI_CONFIG_MCI_OBS_TXRX) {
-
                ath9k_hw_cfg_output(ah, 3, AR_GPIO_OUTPUT_MUX_AS_WL_IN_TX);
                ath9k_hw_cfg_output(ah, 2, AR_GPIO_OUTPUT_MUX_AS_WL_IN_RX);
                ath9k_hw_cfg_output(ah, 1, AR_GPIO_OUTPUT_MUX_AS_BT_IN_TX);
                ath9k_hw_cfg_output(ah, 0, AR_GPIO_OUTPUT_MUX_AS_BT_IN_RX);
                ath9k_hw_cfg_output(ah, 5, AR_GPIO_OUTPUT_MUX_AS_OUTPUT);
-
        } else if (mci->config & ATH_MCI_CONFIG_MCI_OBS_BT) {
-
                ath9k_hw_cfg_output(ah, 3, AR_GPIO_OUTPUT_MUX_AS_BT_IN_TX);
                ath9k_hw_cfg_output(ah, 2, AR_GPIO_OUTPUT_MUX_AS_BT_IN_RX);
                ath9k_hw_cfg_output(ah, 1, AR_GPIO_OUTPUT_MUX_AS_MCI_BT_DATA);
                ath9k_hw_cfg_output(ah, 0, AR_GPIO_OUTPUT_MUX_AS_MCI_BT_CLK);
-
        } else
                return;
 
        REG_SET_BIT(ah, AR_GPIO_INPUT_EN_VAL, AR_GPIO_JTAG_DISABLE);
 
-       if (AR_SREV_9462_20_OR_LATER(ah)) {
-               REG_RMW_FIELD(ah, AR_PHY_GLB_CONTROL,
-                             AR_GLB_DS_JTAG_DISABLE, 1);
-               REG_RMW_FIELD(ah, AR_PHY_GLB_CONTROL,
-                             AR_GLB_WLAN_UART_INTF_EN, 0);
-               REG_SET_BIT(ah, AR_GLB_GPIO_CONTROL,
-                           ATH_MCI_CONFIG_MCI_OBS_GPIO);
-       }
+       REG_RMW_FIELD(ah, AR_PHY_GLB_CONTROL, AR_GLB_DS_JTAG_DISABLE, 1);
+       REG_RMW_FIELD(ah, AR_PHY_GLB_CONTROL, AR_GLB_WLAN_UART_INTF_EN, 0);
+       REG_SET_BIT(ah, AR_GLB_GPIO_CONTROL, ATH_MCI_CONFIG_MCI_OBS_GPIO);
 
        REG_RMW_FIELD(ah, AR_BTCOEX_CTRL2, AR_BTCOEX_CTRL2_GPIO_OBS_SEL, 0);
        REG_RMW_FIELD(ah, AR_BTCOEX_CTRL2, AR_BTCOEX_CTRL2_MAC_BB_OBS_SEL, 1);
@@ -520,13 +465,12 @@ static void ar9003_mci_observation_set_up(struct ath_hw *ah)
 }
 
 static bool ar9003_mci_send_coex_bt_flags(struct ath_hw *ah, bool wait_done,
-                                               u8 opcode, u32 bt_flags)
+                                         u8 opcode, u32 bt_flags)
 {
-       struct ath_common *common = ath9k_hw_common(ah);
        u32 pld[4] = {0, 0, 0, 0};
 
-       MCI_GPM_SET_TYPE_OPCODE(pld,
-                       MCI_GPM_COEX_AGENT, MCI_GPM_COEX_BT_UPDATE_FLAGS);
+       MCI_GPM_SET_TYPE_OPCODE(pld, MCI_GPM_COEX_AGENT,
+                               MCI_GPM_COEX_BT_UPDATE_FLAGS);
 
        *(((u8 *)pld) + MCI_GPM_COEX_B_BT_FLAGS_OP)  = opcode;
        *(((u8 *)pld) + MCI_GPM_COEX_W_BT_FLAGS + 0) = bt_flags & 0xFF;
@@ -534,222 +478,473 @@ static bool ar9003_mci_send_coex_bt_flags(struct ath_hw *ah, bool wait_done,
        *(((u8 *)pld) + MCI_GPM_COEX_W_BT_FLAGS + 2) = (bt_flags >> 16) & 0xFF;
        *(((u8 *)pld) + MCI_GPM_COEX_W_BT_FLAGS + 3) = (bt_flags >> 24) & 0xFF;
 
-       ath_dbg(common, MCI,
-               "MCI BT_MCI_FLAGS: Send Coex BT Update Flags %s 0x%08x\n",
-               opcode == MCI_GPM_COEX_BT_FLAGS_READ ? "READ" :
-               opcode == MCI_GPM_COEX_BT_FLAGS_SET ? "SET" : "CLEAR",
-               bt_flags);
-
        return ar9003_mci_send_message(ah, MCI_GPM, 0, pld, 16,
-                                                       wait_done, true);
+                                      wait_done, true);
 }
 
-void ar9003_mci_reset(struct ath_hw *ah, bool en_int, bool is_2g,
-                     bool is_full_sleep)
+static void ar9003_mci_sync_bt_state(struct ath_hw *ah)
 {
-       struct ath_common *common = ath9k_hw_common(ah);
        struct ath9k_hw_mci *mci = &ah->btcoex_hw.mci;
-       u32 regval, thresh;
-
-       if (!ATH9K_HW_CAP_MCI)
-               return;
-
-       ath_dbg(common, MCI, "MCI full_sleep = %d, is_2g = %d\n",
-               is_full_sleep, is_2g);
-
-       /*
-        * GPM buffer and scheduling message buffer are not allocated
-        */
-
-       if (!mci->gpm_addr && !mci->sched_addr) {
-               ath_dbg(common, MCI,
-                       "MCI GPM and schedule buffers are not allocated\n");
-               return;
-       }
-
-       if (REG_READ(ah, AR_BTCOEX_CTRL) == 0xdeadbeef) {
-               ath_dbg(common, MCI, "MCI it's deadbeef, quit mci_reset\n");
-               return;
-       }
-
-       /* Program MCI DMA related registers */
-       REG_WRITE(ah, AR_MCI_GPM_0, mci->gpm_addr);
-       REG_WRITE(ah, AR_MCI_GPM_1, mci->gpm_len);
-       REG_WRITE(ah, AR_MCI_SCHD_TABLE_0, mci->sched_addr);
-
-       /*
-       * To avoid MCI state machine be affected by incoming remote MCI msgs,
-       * MCI mode will be enabled later, right before reset the MCI TX and RX.
-       */
-
-       regval = SM(1, AR_BTCOEX_CTRL_AR9462_MODE) |
-                SM(1, AR_BTCOEX_CTRL_WBTIMER_EN) |
-                SM(1, AR_BTCOEX_CTRL_PA_SHARED) |
-                SM(1, AR_BTCOEX_CTRL_LNA_SHARED) |
-                SM(2, AR_BTCOEX_CTRL_NUM_ANTENNAS) |
-                SM(3, AR_BTCOEX_CTRL_RX_CHAIN_MASK) |
-                SM(0, AR_BTCOEX_CTRL_1_CHAIN_ACK) |
-                SM(0, AR_BTCOEX_CTRL_1_CHAIN_BCN) |
-                SM(0, AR_BTCOEX_CTRL_ONE_STEP_LOOK_AHEAD_EN);
-
-       if (is_2g && (AR_SREV_9462_20(ah)) &&
-               !(mci->config & ATH_MCI_CONFIG_DISABLE_OSLA)) {
-
-               regval |= SM(1, AR_BTCOEX_CTRL_ONE_STEP_LOOK_AHEAD_EN);
-               ath_dbg(common, MCI, "MCI sched one step look ahead\n");
-
-               if (!(mci->config &
-                     ATH_MCI_CONFIG_DISABLE_AGGR_THRESH)) {
-
-                       thresh = MS(mci->config,
-                                   ATH_MCI_CONFIG_AGGR_THRESH);
-                       thresh &= 7;
-                       regval |= SM(1,
-                                    AR_BTCOEX_CTRL_TIME_TO_NEXT_BT_THRESH_EN);
-                       regval |= SM(thresh, AR_BTCOEX_CTRL_AGGR_THRESH);
-
-                       REG_RMW_FIELD(ah, AR_MCI_SCHD_TABLE_2,
-                                     AR_MCI_SCHD_TABLE_2_HW_BASED, 1);
-                       REG_RMW_FIELD(ah, AR_MCI_SCHD_TABLE_2,
-                                     AR_MCI_SCHD_TABLE_2_MEM_BASED, 1);
-
-               } else
-                       ath_dbg(common, MCI, "MCI sched aggr thresh: off\n");
-       } else
-               ath_dbg(common, MCI, "MCI SCHED one step look ahead off\n");
-
-       if (AR_SREV_9462_10(ah))
-               regval |= SM(1, AR_BTCOEX_CTRL_SPDT_ENABLE_10);
-
-       REG_WRITE(ah, AR_BTCOEX_CTRL, regval);
-
-       if (AR_SREV_9462_20(ah)) {
-               REG_SET_BIT(ah, AR_PHY_GLB_CONTROL,
-                           AR_BTCOEX_CTRL_SPDT_ENABLE);
-               REG_RMW_FIELD(ah, AR_BTCOEX_CTRL3,
-                             AR_BTCOEX_CTRL3_CONT_INFO_TIMEOUT, 20);
-       }
-
-       REG_RMW_FIELD(ah, AR_BTCOEX_CTRL2, AR_BTCOEX_CTRL2_RX_DEWEIGHT, 1);
-       REG_RMW_FIELD(ah, AR_PCU_MISC, AR_PCU_BT_ANT_PREVENT_RX, 0);
+       u32 cur_bt_state;
 
-       thresh = MS(mci->config, ATH_MCI_CONFIG_CLK_DIV);
-       REG_RMW_FIELD(ah, AR_MCI_TX_CTRL, AR_MCI_TX_CTRL_CLK_DIV, thresh);
-       REG_SET_BIT(ah, AR_BTCOEX_CTRL, AR_BTCOEX_CTRL_MCI_MODE_EN);
+       cur_bt_state = ar9003_mci_state(ah, MCI_STATE_REMOTE_SLEEP, NULL);
 
-       /* Resetting the Rx and Tx paths of MCI */
-       regval = REG_READ(ah, AR_MCI_COMMAND2);
-       regval |= SM(1, AR_MCI_COMMAND2_RESET_TX);
-       REG_WRITE(ah, AR_MCI_COMMAND2, regval);
+       if (mci->bt_state != cur_bt_state)
+               mci->bt_state = cur_bt_state;
 
-       udelay(1);
+       if (mci->bt_state != MCI_BT_SLEEP) {
 
-       regval &= ~SM(1, AR_MCI_COMMAND2_RESET_TX);
-       REG_WRITE(ah, AR_MCI_COMMAND2, regval);
+               ar9003_mci_send_coex_version_query(ah, true);
+               ar9003_mci_send_coex_wlan_channels(ah, true);
 
-       if (is_full_sleep) {
-               ar9003_mci_mute_bt(ah);
-               udelay(100);
+               if (mci->unhalt_bt_gpm == true)
+                       ar9003_mci_send_coex_halt_bt_gpm(ah, false, true);
        }
-
-       regval |= SM(1, AR_MCI_COMMAND2_RESET_RX);
-       REG_WRITE(ah, AR_MCI_COMMAND2, regval);
-       udelay(1);
-       regval &= ~SM(1, AR_MCI_COMMAND2_RESET_RX);
-       REG_WRITE(ah, AR_MCI_COMMAND2, regval);
-
-       ar9003_mci_state(ah, MCI_STATE_INIT_GPM_OFFSET, NULL);
-       REG_WRITE(ah, AR_MCI_MSG_ATTRIBUTES_TABLE,
-                 (SM(0xe801, AR_MCI_MSG_ATTRIBUTES_TABLE_INVALID_HDR) |
-                  SM(0x0000, AR_MCI_MSG_ATTRIBUTES_TABLE_CHECKSUM)));
-
-       REG_CLR_BIT(ah, AR_MCI_TX_CTRL,
-                       AR_MCI_TX_CTRL_DISABLE_LNA_UPDATE);
-
-       if (AR_SREV_9462_20_OR_LATER(ah))
-               ar9003_mci_observation_set_up(ah);
-
-       mci->ready = true;
-       ar9003_mci_prep_interface(ah);
-
-       if (en_int)
-               ar9003_mci_enable_interrupt(ah);
 }
 
-void ar9003_mci_mute_bt(struct ath_hw *ah)
+void ar9003_mci_check_bt(struct ath_hw *ah)
 {
-       struct ath_common *common = ath9k_hw_common(ah);
+       struct ath9k_hw_mci *mci_hw = &ah->btcoex_hw.mci;
 
-       if (!ATH9K_HW_CAP_MCI)
+       if (!mci_hw->ready)
                return;
 
-       /* disable all MCI messages */
-       REG_WRITE(ah, AR_MCI_MSG_ATTRIBUTES_TABLE, 0xffff0000);
-       REG_WRITE(ah, AR_BTCOEX_WL_WEIGHTS0, 0xffffffff);
-       REG_WRITE(ah, AR_BTCOEX_WL_WEIGHTS1, 0xffffffff);
-       REG_WRITE(ah, AR_BTCOEX_WL_WEIGHTS2, 0xffffffff);
-       REG_WRITE(ah, AR_BTCOEX_WL_WEIGHTS3, 0xffffffff);
-       REG_SET_BIT(ah, AR_MCI_TX_CTRL, AR_MCI_TX_CTRL_DISABLE_LNA_UPDATE);
-
-       /* wait pending HW messages to flush out */
-       udelay(10);
-
        /*
-        * Send LNA_TAKE and SYS_SLEEPING when
-        * 1. reset not after resuming from full sleep
-        * 2. before reset MCI RX, to quiet BT and avoid MCI RX misalignment
+        * check BT state again to make
+        * sure it's not changed.
         */
+       ar9003_mci_sync_bt_state(ah);
+       ar9003_mci_2g5g_switch(ah, true);
 
-       ath_dbg(common, MCI, "MCI Send LNA take\n");
-       ar9003_mci_send_lna_take(ah, true);
-
-       udelay(5);
-
-       ath_dbg(common, MCI, "MCI Send sys sleeping\n");
-       ar9003_mci_send_sys_sleeping(ah, true);
+       if ((mci_hw->bt_state == MCI_BT_AWAKE) &&
+           (mci_hw->query_bt == true)) {
+               mci_hw->need_flush_btinfo = true;
+       }
 }
 
-void ar9003_mci_sync_bt_state(struct ath_hw *ah)
+static void ar9003_mci_process_gpm_extra(struct ath_hw *ah, u8 gpm_type,
+                                        u8 gpm_opcode, u32 *p_gpm)
 {
        struct ath_common *common = ath9k_hw_common(ah);
        struct ath9k_hw_mci *mci = &ah->btcoex_hw.mci;
-       u32 cur_bt_state;
+       u8 *p_data = (u8 *) p_gpm;
 
-       if (!ATH9K_HW_CAP_MCI)
+       if (gpm_type != MCI_GPM_COEX_AGENT)
                return;
 
-       cur_bt_state = ar9003_mci_state(ah, MCI_STATE_REMOTE_SLEEP, NULL);
-
-       if (mci->bt_state != cur_bt_state) {
+       switch (gpm_opcode) {
+       case MCI_GPM_COEX_VERSION_QUERY:
+               ath_dbg(common, MCI, "MCI Recv GPM COEX Version Query\n");
+               ar9003_mci_send_coex_version_response(ah, true);
+               break;
+       case MCI_GPM_COEX_VERSION_RESPONSE:
+               ath_dbg(common, MCI, "MCI Recv GPM COEX Version Response\n");
+               mci->bt_ver_major =
+                       *(p_data + MCI_GPM_COEX_B_MAJOR_VERSION);
+               mci->bt_ver_minor =
+                       *(p_data + MCI_GPM_COEX_B_MINOR_VERSION);
+               mci->bt_version_known = true;
+               ath_dbg(common, MCI, "MCI BT Coex version: %d.%d\n",
+                       mci->bt_ver_major, mci->bt_ver_minor);
+               break;
+       case MCI_GPM_COEX_STATUS_QUERY:
                ath_dbg(common, MCI,
-                       "MCI BT state mismatches. old: %d, new: %d\n",
-                       mci->bt_state, cur_bt_state);
-               mci->bt_state = cur_bt_state;
-       }
-
-       if (mci->bt_state != MCI_BT_SLEEP) {
-
-               ar9003_mci_send_coex_version_query(ah, true);
+                       "MCI Recv GPM COEX Status Query = 0x%02X\n",
+                       *(p_data + MCI_GPM_COEX_B_WLAN_BITMAP));
+               mci->wlan_channels_update = true;
                ar9003_mci_send_coex_wlan_channels(ah, true);
-
-               if (mci->unhalt_bt_gpm == true) {
-                       ath_dbg(common, MCI, "MCI unhalt BT GPM\n");
-                       ar9003_mci_send_coex_halt_bt_gpm(ah, false, true);
-               }
+               break;
+       case MCI_GPM_COEX_BT_PROFILE_INFO:
+               mci->query_bt = true;
+               ath_dbg(common, MCI, "MCI Recv GPM COEX BT_Profile_Info\n");
+               break;
+       case MCI_GPM_COEX_BT_STATUS_UPDATE:
+               mci->query_bt = true;
+               ath_dbg(common, MCI,
+                       "MCI Recv GPM COEX BT_Status_Update SEQ=%d (drop&query)\n",
+                       *(p_gpm + 3));
+               break;
+       default:
+               break;
        }
 }
 
-static void ar9003_mci_send_2g5g_status(struct ath_hw *ah, bool wait_done)
+static u32 ar9003_mci_wait_for_gpm(struct ath_hw *ah, u8 gpm_type,
+                                  u8 gpm_opcode, int time_out)
 {
        struct ath_common *common = ath9k_hw_common(ah);
        struct ath9k_hw_mci *mci = &ah->btcoex_hw.mci;
-       u32 new_flags, to_set, to_clear;
+       u32 *p_gpm = NULL, mismatch = 0, more_data;
+       u32 offset;
+       u8 recv_type = 0, recv_opcode = 0;
+       bool b_is_bt_cal_done = (gpm_type == MCI_GPM_BT_CAL_DONE);
 
-       if (AR_SREV_9462_20(ah) &&
-           mci->update_2g5g &&
-           (mci->bt_state != MCI_BT_SLEEP)) {
+       more_data = time_out ? MCI_GPM_NOMORE : MCI_GPM_MORE;
 
-               if (mci->is_2g) {
+       while (time_out > 0) {
+               if (p_gpm) {
+                       MCI_GPM_RECYCLE(p_gpm);
+                       p_gpm = NULL;
+               }
+
+               if (more_data != MCI_GPM_MORE)
+                       time_out = ar9003_mci_wait_for_interrupt(ah,
+                                       AR_MCI_INTERRUPT_RX_MSG_RAW,
+                                       AR_MCI_INTERRUPT_RX_MSG_GPM,
+                                       time_out);
+
+               if (!time_out)
+                       break;
+
+               offset = ar9003_mci_state(ah, MCI_STATE_NEXT_GPM_OFFSET,
+                                         &more_data);
+
+               if (offset == MCI_GPM_INVALID)
+                       continue;
+
+               p_gpm = (u32 *) (mci->gpm_buf + offset);
+               recv_type = MCI_GPM_TYPE(p_gpm);
+               recv_opcode = MCI_GPM_OPCODE(p_gpm);
+
+               if (MCI_GPM_IS_CAL_TYPE(recv_type)) {
+                       if (recv_type == gpm_type) {
+                               if ((gpm_type == MCI_GPM_BT_CAL_DONE) &&
+                                   !b_is_bt_cal_done) {
+                                       gpm_type = MCI_GPM_BT_CAL_GRANT;
+                                       continue;
+                               }
+                               break;
+                       }
+               } else if ((recv_type == gpm_type) && (recv_opcode == gpm_opcode)) {
+                       break;
+               }
+
+               /*
+                * check if it's cal_grant
+                *
+                * When we're waiting for cal_grant in reset routine,
+                * it's possible that BT sends out cal_request at the
+                * same time. Since BT's calibration doesn't happen
+                * that often, we'll let BT completes calibration then
+                * we continue to wait for cal_grant from BT.
+                * Orginal: Wait BT_CAL_GRANT.
+                * New: Receive BT_CAL_REQ -> send WLAN_CAL_GRANT->wait
+                * BT_CAL_DONE -> Wait BT_CAL_GRANT.
+                */
+
+               if ((gpm_type == MCI_GPM_BT_CAL_GRANT) &&
+                   (recv_type == MCI_GPM_BT_CAL_REQ)) {
+
+                       u32 payload[4] = {0, 0, 0, 0};
+
+                       gpm_type = MCI_GPM_BT_CAL_DONE;
+                       MCI_GPM_SET_CAL_TYPE(payload,
+                                            MCI_GPM_WLAN_CAL_GRANT);
+                       ar9003_mci_send_message(ah, MCI_GPM, 0, payload, 16,
+                                               false, false);
+                       continue;
+               } else {
+                       ath_dbg(common, MCI, "MCI GPM subtype not match 0x%x\n",
+                               *(p_gpm + 1));
+                       mismatch++;
+                       ar9003_mci_process_gpm_extra(ah, recv_type,
+                                                    recv_opcode, p_gpm);
+               }
+       }
+
+       if (p_gpm) {
+               MCI_GPM_RECYCLE(p_gpm);
+               p_gpm = NULL;
+       }
+
+       if (time_out <= 0)
+               time_out = 0;
+
+       while (more_data == MCI_GPM_MORE) {
+               offset = ar9003_mci_state(ah, MCI_STATE_NEXT_GPM_OFFSET,
+                                         &more_data);
+               if (offset == MCI_GPM_INVALID)
+                       break;
+
+               p_gpm = (u32 *) (mci->gpm_buf + offset);
+               recv_type = MCI_GPM_TYPE(p_gpm);
+               recv_opcode = MCI_GPM_OPCODE(p_gpm);
+
+               if (!MCI_GPM_IS_CAL_TYPE(recv_type))
+                       ar9003_mci_process_gpm_extra(ah, recv_type,
+                                                    recv_opcode, p_gpm);
+
+               MCI_GPM_RECYCLE(p_gpm);
+       }
+
+       return time_out;
+}
+
+bool ar9003_mci_start_reset(struct ath_hw *ah, struct ath9k_channel *chan)
+{
+       struct ath_common *common = ath9k_hw_common(ah);
+       struct ath9k_hw_mci *mci_hw = &ah->btcoex_hw.mci;
+       u32 payload[4] = {0, 0, 0, 0};
+
+       ar9003_mci_2g5g_changed(ah, IS_CHAN_2GHZ(chan));
+
+       if (mci_hw->bt_state != MCI_BT_CAL_START)
+               return false;
+
+       mci_hw->bt_state = MCI_BT_CAL;
+
+       /*
+        * MCI FIX: disable mci interrupt here. This is to avoid
+        * SW_MSG_DONE or RX_MSG bits to trigger MCI_INT and
+        * lead to mci_intr reentry.
+        */
+       ar9003_mci_disable_interrupt(ah);
+
+       MCI_GPM_SET_CAL_TYPE(payload, MCI_GPM_WLAN_CAL_GRANT);
+       ar9003_mci_send_message(ah, MCI_GPM, 0, payload,
+                               16, true, false);
+
+       /* Wait BT calibration to be completed for 25ms */
+
+       if (ar9003_mci_wait_for_gpm(ah, MCI_GPM_BT_CAL_DONE,
+                                   0, 25000))
+               ath_dbg(common, MCI, "MCI BT_CAL_DONE received\n");
+       else
+               ath_dbg(common, MCI,
+                       "MCI BT_CAL_DONE not received\n");
+
+       mci_hw->bt_state = MCI_BT_AWAKE;
+       /* MCI FIX: enable mci interrupt here */
+       ar9003_mci_enable_interrupt(ah);
+
+       return true;
+}
+
+int ar9003_mci_end_reset(struct ath_hw *ah, struct ath9k_channel *chan,
+                        struct ath9k_hw_cal_data *caldata)
+{
+       struct ath9k_hw_mci *mci_hw = &ah->btcoex_hw.mci;
+
+       if (!mci_hw->ready)
+               return 0;
+
+       if (!IS_CHAN_2GHZ(chan) || (mci_hw->bt_state != MCI_BT_SLEEP))
+               goto exit;
+
+       if (ar9003_mci_check_int(ah, AR_MCI_INTERRUPT_RX_MSG_REMOTE_RESET) ||
+           ar9003_mci_check_int(ah, AR_MCI_INTERRUPT_RX_MSG_REQ_WAKE)) {
+
+               /*
+                * BT is sleeping. Check if BT wakes up during
+                * WLAN calibration. If BT wakes up during
+                * WLAN calibration, need to go through all
+                * message exchanges again and recal.
+                */
+               REG_WRITE(ah, AR_MCI_INTERRUPT_RX_MSG_RAW,
+                         AR_MCI_INTERRUPT_RX_MSG_REMOTE_RESET |
+                         AR_MCI_INTERRUPT_RX_MSG_REQ_WAKE);
+
+               ar9003_mci_remote_reset(ah, true);
+               ar9003_mci_send_sys_waking(ah, true);
+               udelay(1);
+
+               if (IS_CHAN_2GHZ(chan))
+                       ar9003_mci_send_lna_transfer(ah, true);
+
+               mci_hw->bt_state = MCI_BT_AWAKE;
+
+               if (caldata) {
+                       caldata->done_txiqcal_once = false;
+                       caldata->done_txclcal_once = false;
+                       caldata->rtt_hist.num_readings = 0;
+               }
+
+               if (!ath9k_hw_init_cal(ah, chan))
+                       return -EIO;
+
+       }
+exit:
+       ar9003_mci_enable_interrupt(ah);
+       return 0;
+}
+
+static void ar9003_mci_mute_bt(struct ath_hw *ah)
+{
+       /* disable all MCI messages */
+       REG_WRITE(ah, AR_MCI_MSG_ATTRIBUTES_TABLE, 0xffff0000);
+       REG_WRITE(ah, AR_BTCOEX_WL_WEIGHTS0, 0xffffffff);
+       REG_WRITE(ah, AR_BTCOEX_WL_WEIGHTS1, 0xffffffff);
+       REG_WRITE(ah, AR_BTCOEX_WL_WEIGHTS2, 0xffffffff);
+       REG_WRITE(ah, AR_BTCOEX_WL_WEIGHTS3, 0xffffffff);
+       REG_SET_BIT(ah, AR_MCI_TX_CTRL, AR_MCI_TX_CTRL_DISABLE_LNA_UPDATE);
+
+       /* wait pending HW messages to flush out */
+       udelay(10);
+
+       /*
+        * Send LNA_TAKE and SYS_SLEEPING when
+        * 1. reset not after resuming from full sleep
+        * 2. before reset MCI RX, to quiet BT and avoid MCI RX misalignment
+        */
+       ar9003_mci_send_lna_take(ah, true);
+
+       udelay(5);
+
+       ar9003_mci_send_sys_sleeping(ah, true);
+}
+
+static void ar9003_mci_osla_setup(struct ath_hw *ah, bool enable)
+{
+       struct ath9k_hw_mci *mci = &ah->btcoex_hw.mci;
+       u32 thresh;
+
+       if (enable) {
+               REG_RMW_FIELD(ah, AR_MCI_SCHD_TABLE_2,
+                             AR_MCI_SCHD_TABLE_2_HW_BASED, 1);
+               REG_RMW_FIELD(ah, AR_MCI_SCHD_TABLE_2,
+                             AR_MCI_SCHD_TABLE_2_MEM_BASED, 1);
+
+               if (!(mci->config & ATH_MCI_CONFIG_DISABLE_AGGR_THRESH)) {
+                       thresh = MS(mci->config, ATH_MCI_CONFIG_AGGR_THRESH);
+                       REG_RMW_FIELD(ah, AR_BTCOEX_CTRL,
+                                     AR_BTCOEX_CTRL_AGGR_THRESH, thresh);
+                       REG_RMW_FIELD(ah, AR_BTCOEX_CTRL,
+                                     AR_BTCOEX_CTRL_TIME_TO_NEXT_BT_THRESH_EN, 1);
+               } else {
+                       REG_RMW_FIELD(ah, AR_BTCOEX_CTRL,
+                                     AR_BTCOEX_CTRL_TIME_TO_NEXT_BT_THRESH_EN, 0);
+               }
+
+               REG_RMW_FIELD(ah, AR_BTCOEX_CTRL,
+                             AR_BTCOEX_CTRL_ONE_STEP_LOOK_AHEAD_EN, 1);
+       } else {
+               REG_CLR_BIT(ah, AR_BTCOEX_CTRL,
+                           AR_BTCOEX_CTRL_ONE_STEP_LOOK_AHEAD_EN);
+       }
+}
+
+void ar9003_mci_reset(struct ath_hw *ah, bool en_int, bool is_2g,
+                     bool is_full_sleep)
+{
+       struct ath_common *common = ath9k_hw_common(ah);
+       struct ath9k_hw_mci *mci = &ah->btcoex_hw.mci;
+       u32 regval;
+
+       ath_dbg(common, MCI, "MCI Reset (full_sleep = %d, is_2g = %d)\n",
+               is_full_sleep, is_2g);
+
+       if (!mci->gpm_addr && !mci->sched_addr) {
+               ath_dbg(common, MCI,
+                       "MCI GPM and schedule buffers are not allocated\n");
+               return;
+       }
+
+       if (REG_READ(ah, AR_BTCOEX_CTRL) == 0xdeadbeef) {
+               ath_dbg(common, MCI, "BTCOEX control register is dead\n");
+               return;
+       }
+
+       /* Program MCI DMA related registers */
+       REG_WRITE(ah, AR_MCI_GPM_0, mci->gpm_addr);
+       REG_WRITE(ah, AR_MCI_GPM_1, mci->gpm_len);
+       REG_WRITE(ah, AR_MCI_SCHD_TABLE_0, mci->sched_addr);
+
+       /*
+       * To avoid MCI state machine be affected by incoming remote MCI msgs,
+       * MCI mode will be enabled later, right before reset the MCI TX and RX.
+       */
+
+       regval = SM(1, AR_BTCOEX_CTRL_AR9462_MODE) |
+                SM(1, AR_BTCOEX_CTRL_WBTIMER_EN) |
+                SM(1, AR_BTCOEX_CTRL_PA_SHARED) |
+                SM(1, AR_BTCOEX_CTRL_LNA_SHARED) |
+                SM(2, AR_BTCOEX_CTRL_NUM_ANTENNAS) |
+                SM(3, AR_BTCOEX_CTRL_RX_CHAIN_MASK) |
+                SM(0, AR_BTCOEX_CTRL_1_CHAIN_ACK) |
+                SM(0, AR_BTCOEX_CTRL_1_CHAIN_BCN) |
+                SM(0, AR_BTCOEX_CTRL_ONE_STEP_LOOK_AHEAD_EN);
+
+       REG_WRITE(ah, AR_BTCOEX_CTRL, regval);
+
+       if (is_2g && !(mci->config & ATH_MCI_CONFIG_DISABLE_OSLA))
+               ar9003_mci_osla_setup(ah, true);
+       else
+               ar9003_mci_osla_setup(ah, false);
+
+       REG_SET_BIT(ah, AR_PHY_GLB_CONTROL,
+                   AR_BTCOEX_CTRL_SPDT_ENABLE);
+       REG_RMW_FIELD(ah, AR_BTCOEX_CTRL3,
+                     AR_BTCOEX_CTRL3_CONT_INFO_TIMEOUT, 20);
+
+       REG_RMW_FIELD(ah, AR_BTCOEX_CTRL2, AR_BTCOEX_CTRL2_RX_DEWEIGHT, 1);
+       REG_RMW_FIELD(ah, AR_PCU_MISC, AR_PCU_BT_ANT_PREVENT_RX, 0);
+
+       regval = MS(mci->config, ATH_MCI_CONFIG_CLK_DIV);
+       REG_RMW_FIELD(ah, AR_MCI_TX_CTRL, AR_MCI_TX_CTRL_CLK_DIV, regval);
+       REG_SET_BIT(ah, AR_BTCOEX_CTRL, AR_BTCOEX_CTRL_MCI_MODE_EN);
+
+       /* Resetting the Rx and Tx paths of MCI */
+       regval = REG_READ(ah, AR_MCI_COMMAND2);
+       regval |= SM(1, AR_MCI_COMMAND2_RESET_TX);
+       REG_WRITE(ah, AR_MCI_COMMAND2, regval);
+
+       udelay(1);
+
+       regval &= ~SM(1, AR_MCI_COMMAND2_RESET_TX);
+       REG_WRITE(ah, AR_MCI_COMMAND2, regval);
+
+       if (is_full_sleep) {
+               ar9003_mci_mute_bt(ah);
+               udelay(100);
+       }
+
+       regval |= SM(1, AR_MCI_COMMAND2_RESET_RX);
+       REG_WRITE(ah, AR_MCI_COMMAND2, regval);
+       udelay(1);
+       regval &= ~SM(1, AR_MCI_COMMAND2_RESET_RX);
+       REG_WRITE(ah, AR_MCI_COMMAND2, regval);
+
+       ar9003_mci_state(ah, MCI_STATE_INIT_GPM_OFFSET, NULL);
+
+       REG_WRITE(ah, AR_MCI_MSG_ATTRIBUTES_TABLE,
+                 (SM(0xe801, AR_MCI_MSG_ATTRIBUTES_TABLE_INVALID_HDR) |
+                  SM(0x0000, AR_MCI_MSG_ATTRIBUTES_TABLE_CHECKSUM)));
+
+       REG_CLR_BIT(ah, AR_MCI_TX_CTRL,
+                   AR_MCI_TX_CTRL_DISABLE_LNA_UPDATE);
+
+       ar9003_mci_observation_set_up(ah);
+
+       mci->ready = true;
+       ar9003_mci_prep_interface(ah);
+
+       if (en_int)
+               ar9003_mci_enable_interrupt(ah);
+}
+
+void ar9003_mci_stop_bt(struct ath_hw *ah, bool save_fullsleep)
+{
+       struct ath9k_hw_mci *mci_hw = &ah->btcoex_hw.mci;
+
+       ar9003_mci_disable_interrupt(ah);
+
+       if (mci_hw->ready && !save_fullsleep) {
+               ar9003_mci_mute_bt(ah);
+               udelay(20);
+               REG_WRITE(ah, AR_BTCOEX_CTRL, 0);
+       }
+
+       mci_hw->bt_state = MCI_BT_SLEEP;
+       mci_hw->ready = false;
+}
+
+static void ar9003_mci_send_2g5g_status(struct ath_hw *ah, bool wait_done)
+{
+       struct ath9k_hw_mci *mci = &ah->btcoex_hw.mci;
+       u32 new_flags, to_set, to_clear;
+
+       if (mci->update_2g5g && (mci->bt_state != MCI_BT_SLEEP)) {
+               if (mci->is_2g) {
                        new_flags = MCI_2G_FLAGS;
                        to_clear = MCI_2G_FLAGS_CLEAR_MASK;
                        to_set = MCI_2G_FLAGS_SET_MASK;
@@ -759,44 +954,23 @@ static void ar9003_mci_send_2g5g_status(struct ath_hw *ah, bool wait_done)
                        to_set = MCI_5G_FLAGS_SET_MASK;
                }
 
-               ath_dbg(common, MCI,
-                       "MCI BT_MCI_FLAGS: %s 0x%08x clr=0x%08x, set=0x%08x\n",
-               mci->is_2g ? "2G" : "5G", new_flags, to_clear, to_set);
-
                if (to_clear)
                        ar9003_mci_send_coex_bt_flags(ah, wait_done,
-                                       MCI_GPM_COEX_BT_FLAGS_CLEAR, to_clear);
-
+                                             MCI_GPM_COEX_BT_FLAGS_CLEAR,
+                                             to_clear);
                if (to_set)
                        ar9003_mci_send_coex_bt_flags(ah, wait_done,
-                                       MCI_GPM_COEX_BT_FLAGS_SET, to_set);
+                                             MCI_GPM_COEX_BT_FLAGS_SET,
+                                             to_set);
        }
-
-       if (AR_SREV_9462_10(ah) && (mci->bt_state != MCI_BT_SLEEP))
-               mci->update_2g5g = false;
 }
 
 static void ar9003_mci_queue_unsent_gpm(struct ath_hw *ah, u8 header,
                                        u32 *payload, bool queue)
 {
-       struct ath_common *common = ath9k_hw_common(ah);
        struct ath9k_hw_mci *mci = &ah->btcoex_hw.mci;
        u8 type, opcode;
 
-       if (queue) {
-
-               if (payload)
-                       ath_dbg(common, MCI,
-                               "MCI ERROR: Send fail: %02x: %02x %02x %02x\n",
-                               header,
-                               *(((u8 *)payload) + 4),
-                               *(((u8 *)payload) + 5),
-                               *(((u8 *)payload) + 6));
-               else
-                       ath_dbg(common, MCI, "MCI ERROR: Send fail: %02x\n",
-                               header);
-       }
-
        /* check if the message is to be queued */
        if (header != MCI_GPM)
                return;
@@ -809,64 +983,29 @@ static void ar9003_mci_queue_unsent_gpm(struct ath_hw *ah, u8 header,
 
        switch (opcode) {
        case MCI_GPM_COEX_BT_UPDATE_FLAGS:
-
-               if (AR_SREV_9462_10(ah))
-                       break;
-
                if (*(((u8 *)payload) + MCI_GPM_COEX_B_BT_FLAGS_OP) ==
-                               MCI_GPM_COEX_BT_FLAGS_READ)
+                   MCI_GPM_COEX_BT_FLAGS_READ)
                        break;
 
                mci->update_2g5g = queue;
 
-               if (queue)
-                       ath_dbg(common, MCI,
-                               "MCI BT_MCI_FLAGS: 2G5G status <queued> %s\n",
-                               mci->is_2g ? "2G" : "5G");
-               else
-                       ath_dbg(common, MCI,
-                               "MCI BT_MCI_FLAGS: 2G5G status <sent> %s\n",
-                               mci->is_2g ? "2G" : "5G");
-
                break;
-
        case MCI_GPM_COEX_WLAN_CHANNELS:
-
                mci->wlan_channels_update = queue;
-               if (queue)
-                       ath_dbg(common, MCI, "MCI WLAN channel map <queued>\n");
-               else
-                       ath_dbg(common, MCI, "MCI WLAN channel map <sent>\n");
                break;
-
        case MCI_GPM_COEX_HALT_BT_GPM:
-
                if (*(((u8 *)payload) + MCI_GPM_COEX_B_HALT_STATE) ==
-                               MCI_GPM_COEX_BT_GPM_UNHALT) {
-
+                   MCI_GPM_COEX_BT_GPM_UNHALT) {
                        mci->unhalt_bt_gpm = queue;
 
-                       if (queue)
-                               ath_dbg(common, MCI,
-                                       "MCI UNHALT BT GPM <queued>\n");
-                       else {
+                       if (!queue)
                                mci->halted_bt_gpm = false;
-                               ath_dbg(common, MCI,
-                                       "MCI UNHALT BT GPM <sent>\n");
-                       }
                }
 
                if (*(((u8 *)payload) + MCI_GPM_COEX_B_HALT_STATE) ==
                                MCI_GPM_COEX_BT_GPM_HALT) {
 
                        mci->halted_bt_gpm = !queue;
-
-                       if (queue)
-                               ath_dbg(common, MCI,
-                                       "MCI HALT BT GPM <not sent>\n");
-                       else
-                               ath_dbg(common, MCI,
-                                       "MCI UNHALT BT GPM <sent>\n");
                }
 
                break;
@@ -877,46 +1016,33 @@ static void ar9003_mci_queue_unsent_gpm(struct ath_hw *ah, u8 header,
 
 void ar9003_mci_2g5g_switch(struct ath_hw *ah, bool wait_done)
 {
-       struct ath_common *common = ath9k_hw_common(ah);
        struct ath9k_hw_mci *mci = &ah->btcoex_hw.mci;
 
-       if (!ATH9K_HW_CAP_MCI)
-               return;
-
        if (mci->update_2g5g) {
                if (mci->is_2g) {
-
                        ar9003_mci_send_2g5g_status(ah, true);
-                       ath_dbg(common, MCI, "MCI Send LNA trans\n");
                        ar9003_mci_send_lna_transfer(ah, true);
                        udelay(5);
 
                        REG_CLR_BIT(ah, AR_MCI_TX_CTRL,
                                    AR_MCI_TX_CTRL_DISABLE_LNA_UPDATE);
+                       REG_CLR_BIT(ah, AR_PHY_GLB_CONTROL,
+                                   AR_BTCOEX_CTRL_BT_OWN_SPDT_CTRL);
 
-                       if (AR_SREV_9462_20(ah)) {
-                               REG_CLR_BIT(ah, AR_PHY_GLB_CONTROL,
-                                           AR_BTCOEX_CTRL_BT_OWN_SPDT_CTRL);
-                               if (!(mci->config &
-                                     ATH_MCI_CONFIG_DISABLE_OSLA)) {
-                                       REG_SET_BIT(ah, AR_BTCOEX_CTRL,
-                                       AR_BTCOEX_CTRL_ONE_STEP_LOOK_AHEAD_EN);
-                               }
+                       if (!(mci->config & ATH_MCI_CONFIG_DISABLE_OSLA)) {
+                               REG_SET_BIT(ah, AR_BTCOEX_CTRL,
+                                           AR_BTCOEX_CTRL_ONE_STEP_LOOK_AHEAD_EN);
                        }
                } else {
-                       ath_dbg(common, MCI, "MCI Send LNA take\n");
                        ar9003_mci_send_lna_take(ah, true);
                        udelay(5);
 
                        REG_SET_BIT(ah, AR_MCI_TX_CTRL,
                                    AR_MCI_TX_CTRL_DISABLE_LNA_UPDATE);
-
-                       if (AR_SREV_9462_20(ah)) {
-                               REG_SET_BIT(ah, AR_PHY_GLB_CONTROL,
-                                           AR_BTCOEX_CTRL_BT_OWN_SPDT_CTRL);
-                               REG_CLR_BIT(ah, AR_BTCOEX_CTRL,
-                                       AR_BTCOEX_CTRL_ONE_STEP_LOOK_AHEAD_EN);
-                       }
+                       REG_SET_BIT(ah, AR_PHY_GLB_CONTROL,
+                                   AR_BTCOEX_CTRL_BT_OWN_SPDT_CTRL);
+                       REG_CLR_BIT(ah, AR_BTCOEX_CTRL,
+                                   AR_BTCOEX_CTRL_ONE_STEP_LOOK_AHEAD_EN);
 
                        ar9003_mci_send_2g5g_status(ah, true);
                }
@@ -934,28 +1060,19 @@ bool ar9003_mci_send_message(struct ath_hw *ah, u8 header, u32 flag,
        u32 saved_mci_int_en;
        int i;
 
-       if (!ATH9K_HW_CAP_MCI)
-               return false;
-
        saved_mci_int_en = REG_READ(ah, AR_MCI_INTERRUPT_EN);
        regval = REG_READ(ah, AR_BTCOEX_CTRL);
 
        if ((regval == 0xdeadbeef) || !(regval & AR_BTCOEX_CTRL_MCI_MODE_EN)) {
-
                ath_dbg(common, MCI,
                        "MCI Not sending 0x%x. MCI is not enabled. full_sleep = %d\n",
-                       header,
-                       (ah->power_mode == ATH9K_PM_FULL_SLEEP) ? 1 : 0);
-
+                       header, (ah->power_mode == ATH9K_PM_FULL_SLEEP) ? 1 : 0);
                ar9003_mci_queue_unsent_gpm(ah, header, payload, true);
                return false;
-
        } else if (check_bt && (mci->bt_state == MCI_BT_SLEEP)) {
-
                ath_dbg(common, MCI,
                        "MCI Don't send message 0x%x. BT is in sleep state\n",
                        header);
-
                ar9003_mci_queue_unsent_gpm(ah, header, payload, true);
                return false;
        }
@@ -983,7 +1100,7 @@ bool ar9003_mci_send_message(struct ath_hw *ah, u8 header, u32 flag,
 
        if (wait_done &&
            !(ar9003_mci_wait_for_interrupt(ah, AR_MCI_INTERRUPT_RAW,
-                                       AR_MCI_INTERRUPT_SW_MSG_DONE, 500)))
+                                           AR_MCI_INTERRUPT_SW_MSG_DONE, 500)))
                ar9003_mci_queue_unsent_gpm(ah, header, payload, true);
        else {
                ar9003_mci_queue_unsent_gpm(ah, header, payload, false);
@@ -997,220 +1114,64 @@ bool ar9003_mci_send_message(struct ath_hw *ah, u8 header, u32 flag,
 }
 EXPORT_SYMBOL(ar9003_mci_send_message);
 
-void ar9003_mci_setup(struct ath_hw *ah, u32 gpm_addr, void *gpm_buf,
-                     u16 len, u32 sched_addr)
+void ar9003_mci_init_cal_req(struct ath_hw *ah, bool *is_reusable)
 {
-       struct ath9k_hw_mci *mci = &ah->btcoex_hw.mci;
-       void *sched_buf = (void *)((char *) gpm_buf + (sched_addr - gpm_addr));
+       struct ath_common *common = ath9k_hw_common(ah);
+       struct ath9k_hw_mci *mci_hw = &ah->btcoex_hw.mci;
+       u32 pld[4] = {0, 0, 0, 0};
 
-       if (!ATH9K_HW_CAP_MCI)
+       if ((mci_hw->bt_state != MCI_BT_AWAKE) ||
+           (mci_hw->config & ATH_MCI_CONFIG_DISABLE_MCI_CAL))
                return;
 
-       mci->gpm_addr = gpm_addr;
-       mci->gpm_buf = gpm_buf;
-       mci->gpm_len = len;
-       mci->sched_addr = sched_addr;
-       mci->sched_buf = sched_buf;
+       MCI_GPM_SET_CAL_TYPE(pld, MCI_GPM_WLAN_CAL_REQ);
+       pld[MCI_GPM_WLAN_CAL_W_SEQUENCE] = mci_hw->wlan_cal_seq++;
 
-       ar9003_mci_reset(ah, true, true, true);
+       ar9003_mci_send_message(ah, MCI_GPM, 0, pld, 16, true, false);
+
+       if (ar9003_mci_wait_for_gpm(ah, MCI_GPM_BT_CAL_GRANT, 0, 50000)) {
+               ath_dbg(common, MCI, "MCI BT_CAL_GRANT received\n");
+       } else {
+               is_reusable = false;
+               ath_dbg(common, MCI, "MCI BT_CAL_GRANT not received\n");
+       }
 }
-EXPORT_SYMBOL(ar9003_mci_setup);
 
-void ar9003_mci_cleanup(struct ath_hw *ah)
+void ar9003_mci_init_cal_done(struct ath_hw *ah)
 {
-       struct ath_common *common = ath9k_hw_common(ah);
+       struct ath9k_hw_mci *mci_hw = &ah->btcoex_hw.mci;
+       u32 pld[4] = {0, 0, 0, 0};
 
-       if (!ATH9K_HW_CAP_MCI)
+       if ((mci_hw->bt_state != MCI_BT_AWAKE) ||
+           (mci_hw->config & ATH_MCI_CONFIG_DISABLE_MCI_CAL))
                return;
 
-       /* Turn off MCI and Jupiter mode. */
-       REG_WRITE(ah, AR_BTCOEX_CTRL, 0x00);
-       ath_dbg(common, MCI, "MCI ar9003_mci_cleanup\n");
-       ar9003_mci_disable_interrupt(ah);
+       MCI_GPM_SET_CAL_TYPE(pld, MCI_GPM_WLAN_CAL_DONE);
+       pld[MCI_GPM_WLAN_CAL_W_SEQUENCE] = mci_hw->wlan_cal_done++;
+       ar9003_mci_send_message(ah, MCI_GPM, 0, pld, 16, true, false);
 }
-EXPORT_SYMBOL(ar9003_mci_cleanup);
 
-static void ar9003_mci_process_gpm_extra(struct ath_hw *ah, u8 gpm_type,
-                                        u8 gpm_opcode, u32 *p_gpm)
+void ar9003_mci_setup(struct ath_hw *ah, u32 gpm_addr, void *gpm_buf,
+                     u16 len, u32 sched_addr)
 {
-       struct ath_common *common = ath9k_hw_common(ah);
        struct ath9k_hw_mci *mci = &ah->btcoex_hw.mci;
-       u8 *p_data = (u8 *) p_gpm;
 
-       if (gpm_type != MCI_GPM_COEX_AGENT)
-               return;
+       mci->gpm_addr = gpm_addr;
+       mci->gpm_buf = gpm_buf;
+       mci->gpm_len = len;
+       mci->sched_addr = sched_addr;
 
-       switch (gpm_opcode) {
-       case MCI_GPM_COEX_VERSION_QUERY:
-               ath_dbg(common, MCI, "MCI Recv GPM COEX Version Query\n");
-               ar9003_mci_send_coex_version_response(ah, true);
-               break;
-       case MCI_GPM_COEX_VERSION_RESPONSE:
-               ath_dbg(common, MCI, "MCI Recv GPM COEX Version Response\n");
-               mci->bt_ver_major =
-                       *(p_data + MCI_GPM_COEX_B_MAJOR_VERSION);
-               mci->bt_ver_minor =
-                       *(p_data + MCI_GPM_COEX_B_MINOR_VERSION);
-               mci->bt_version_known = true;
-               ath_dbg(common, MCI, "MCI BT Coex version: %d.%d\n",
-                       mci->bt_ver_major, mci->bt_ver_minor);
-               break;
-       case MCI_GPM_COEX_STATUS_QUERY:
-               ath_dbg(common, MCI,
-                       "MCI Recv GPM COEX Status Query = 0x%02X\n",
-                       *(p_data + MCI_GPM_COEX_B_WLAN_BITMAP));
-               mci->wlan_channels_update = true;
-               ar9003_mci_send_coex_wlan_channels(ah, true);
-               break;
-       case MCI_GPM_COEX_BT_PROFILE_INFO:
-               mci->query_bt = true;
-               ath_dbg(common, MCI, "MCI Recv GPM COEX BT_Profile_Info\n");
-               break;
-       case MCI_GPM_COEX_BT_STATUS_UPDATE:
-               mci->query_bt = true;
-               ath_dbg(common, MCI,
-                       "MCI Recv GPM COEX BT_Status_Update SEQ=%d (drop&query)\n",
-                       *(p_gpm + 3));
-               break;
-       default:
-               break;
-       }
+       ar9003_mci_reset(ah, true, true, true);
 }
+EXPORT_SYMBOL(ar9003_mci_setup);
 
-u32 ar9003_mci_wait_for_gpm(struct ath_hw *ah, u8 gpm_type,
-                           u8 gpm_opcode, int time_out)
+void ar9003_mci_cleanup(struct ath_hw *ah)
 {
-       struct ath_common *common = ath9k_hw_common(ah);
-       struct ath9k_hw_mci *mci = &ah->btcoex_hw.mci;
-       u32 *p_gpm = NULL, mismatch = 0, more_data;
-       u32 offset;
-       u8 recv_type = 0, recv_opcode = 0;
-       bool b_is_bt_cal_done = (gpm_type == MCI_GPM_BT_CAL_DONE);
-
-       if (!ATH9K_HW_CAP_MCI)
-               return 0;
-
-       more_data = time_out ? MCI_GPM_NOMORE : MCI_GPM_MORE;
-
-       while (time_out > 0) {
-               if (p_gpm) {
-                       MCI_GPM_RECYCLE(p_gpm);
-                       p_gpm = NULL;
-               }
-
-               if (more_data != MCI_GPM_MORE)
-                       time_out = ar9003_mci_wait_for_interrupt(ah,
-                                       AR_MCI_INTERRUPT_RX_MSG_RAW,
-                                       AR_MCI_INTERRUPT_RX_MSG_GPM,
-                                       time_out);
-
-               if (!time_out)
-                       break;
-
-               offset = ar9003_mci_state(ah,
-                               MCI_STATE_NEXT_GPM_OFFSET, &more_data);
-
-               if (offset == MCI_GPM_INVALID)
-                       continue;
-
-               p_gpm = (u32 *) (mci->gpm_buf + offset);
-               recv_type = MCI_GPM_TYPE(p_gpm);
-               recv_opcode = MCI_GPM_OPCODE(p_gpm);
-
-               if (MCI_GPM_IS_CAL_TYPE(recv_type)) {
-
-                       if (recv_type == gpm_type) {
-
-                               if ((gpm_type == MCI_GPM_BT_CAL_DONE) &&
-                                   !b_is_bt_cal_done) {
-                                       gpm_type = MCI_GPM_BT_CAL_GRANT;
-                                       ath_dbg(common, MCI,
-                                               "MCI Recv BT_CAL_DONE wait BT_CAL_GRANT\n");
-                                       continue;
-                               }
-
-                               break;
-                       }
-               } else if ((recv_type == gpm_type) &&
-                          (recv_opcode == gpm_opcode))
-                       break;
-
-               /* not expected message */
-
-               /*
-                * check if it's cal_grant
-                *
-                * When we're waiting for cal_grant in reset routine,
-                * it's possible that BT sends out cal_request at the
-                * same time. Since BT's calibration doesn't happen
-                * that often, we'll let BT completes calibration then
-                * we continue to wait for cal_grant from BT.
-                * Orginal: Wait BT_CAL_GRANT.
-                * New: Receive BT_CAL_REQ -> send WLAN_CAL_GRANT->wait
-                * BT_CAL_DONE -> Wait BT_CAL_GRANT.
-                */
-
-               if ((gpm_type == MCI_GPM_BT_CAL_GRANT) &&
-                   (recv_type == MCI_GPM_BT_CAL_REQ)) {
-
-                       u32 payload[4] = {0, 0, 0, 0};
-
-                       gpm_type = MCI_GPM_BT_CAL_DONE;
-                       ath_dbg(common, MCI,
-                               "MCI Rcv BT_CAL_REQ, send WLAN_CAL_GRANT\n");
-
-                       MCI_GPM_SET_CAL_TYPE(payload,
-                                       MCI_GPM_WLAN_CAL_GRANT);
-
-                       ar9003_mci_send_message(ah, MCI_GPM, 0, payload, 16,
-                                               false, false);
-
-                       ath_dbg(common, MCI, "MCI now wait for BT_CAL_DONE\n");
-
-                       continue;
-               } else {
-                       ath_dbg(common, MCI, "MCI GPM subtype not match 0x%x\n",
-                               *(p_gpm + 1));
-                       mismatch++;
-                       ar9003_mci_process_gpm_extra(ah, recv_type,
-                                       recv_opcode, p_gpm);
-               }
-       }
-       if (p_gpm) {
-               MCI_GPM_RECYCLE(p_gpm);
-               p_gpm = NULL;
-       }
-
-       if (time_out <= 0) {
-               time_out = 0;
-               ath_dbg(common, MCI,
-                       "MCI GPM received timeout, mismatch = %d\n", mismatch);
-       } else
-               ath_dbg(common, MCI, "MCI Receive GPM type=0x%x, code=0x%x\n",
-                       gpm_type, gpm_opcode);
-
-       while (more_data == MCI_GPM_MORE) {
-
-               ath_dbg(common, MCI, "MCI discard remaining GPM\n");
-               offset = ar9003_mci_state(ah, MCI_STATE_NEXT_GPM_OFFSET,
-                                         &more_data);
-
-               if (offset == MCI_GPM_INVALID)
-                       break;
-
-               p_gpm = (u32 *) (mci->gpm_buf + offset);
-               recv_type = MCI_GPM_TYPE(p_gpm);
-               recv_opcode = MCI_GPM_OPCODE(p_gpm);
-
-               if (!MCI_GPM_IS_CAL_TYPE(recv_type))
-                       ar9003_mci_process_gpm_extra(ah, recv_type,
-                                                    recv_opcode, p_gpm);
-
-               MCI_GPM_RECYCLE(p_gpm);
-       }
-
-       return time_out;
+       /* Turn off MCI and Jupiter mode. */
+       REG_WRITE(ah, AR_BTCOEX_CTRL, 0x00);
+       ar9003_mci_disable_interrupt(ah);
 }
+EXPORT_SYMBOL(ar9003_mci_cleanup);
 
 u32 ar9003_mci_state(struct ath_hw *ah, u32 state_type, u32 *p_data)
 {
@@ -1219,13 +1180,9 @@ u32 ar9003_mci_state(struct ath_hw *ah, u32 state_type, u32 *p_data)
        u32 value = 0, more_gpm = 0, gpm_ptr;
        u8 query_type;
 
-       if (!ATH9K_HW_CAP_MCI)
-               return 0;
-
        switch (state_type) {
        case MCI_STATE_ENABLE:
                if (mci->ready) {
-
                        value = REG_READ(ah, AR_BTCOEX_CTRL);
 
                        if ((value == 0xdeadbeef) || (value == 0xffffffff))
@@ -1235,7 +1192,6 @@ u32 ar9003_mci_state(struct ath_hw *ah, u32 state_type, u32 *p_data)
                break;
        case MCI_STATE_INIT_GPM_OFFSET:
                value = MS(REG_READ(ah, AR_MCI_GPM_1), AR_MCI_GPM_WRITE_PTR);
-               ath_dbg(common, MCI, "MCI GPM initial WRITE_PTR=%d\n", value);
                mci->gpm_idx = value;
                break;
        case MCI_STATE_NEXT_GPM_OFFSET:
@@ -1258,32 +1214,21 @@ u32 ar9003_mci_state(struct ath_hw *ah, u32 state_type, u32 *p_data)
                if (value == 0)
                        value = mci->gpm_len - 1;
                else if (value >= mci->gpm_len) {
-                       if (value != 0xFFFF) {
+                       if (value != 0xFFFF)
                                value = 0;
-                               ath_dbg(common, MCI,
-                                       "MCI GPM offset out of range\n");
-                       }
-               } else
+               } else {
                        value--;
+               }
 
                if (value == 0xFFFF) {
                        value = MCI_GPM_INVALID;
                        more_gpm = MCI_GPM_NOMORE;
-                       ath_dbg(common, MCI,
-                               "MCI GPM ptr invalid @ptr=%d, offset=%d, more=GPM_NOMORE\n",
-                               gpm_ptr, value);
                } else if (state_type == MCI_STATE_NEXT_GPM_OFFSET) {
-
                        if (gpm_ptr == mci->gpm_idx) {
                                value = MCI_GPM_INVALID;
                                more_gpm = MCI_GPM_NOMORE;
-
-                               ath_dbg(common, MCI,
-                                       "MCI GPM message not available @ptr=%d, @offset=%d, more=GPM_NOMORE\n",
-                                       gpm_ptr, value);
                        } else {
                                for (;;) {
-
                                        u32 temp_index;
 
                                        /* skip reserved GPM if any */
@@ -1300,13 +1245,8 @@ u32 ar9003_mci_state(struct ath_hw *ah, u32 state_type, u32 *p_data)
                                            mci->gpm_len)
                                                mci->gpm_idx = 0;
 
-                                       ath_dbg(common, MCI,
-                                               "MCI GPM message got ptr=%d, @offset=%d, more=%d\n",
-                                               gpm_ptr, temp_index,
-                                               (more_gpm == MCI_GPM_MORE));
-
                                        if (ar9003_mci_is_gpm_valid(ah,
-                                                               temp_index)) {
+                                                                   temp_index)) {
                                                value = temp_index;
                                                break;
                                        }
@@ -1331,79 +1271,59 @@ u32 ar9003_mci_state(struct ath_hw *ah, u32 state_type, u32 *p_data)
                /* Make it in bytes */
                value <<= 4;
                break;
-
        case MCI_STATE_REMOTE_SLEEP:
                value = MS(REG_READ(ah, AR_MCI_RX_STATUS),
                           AR_MCI_RX_REMOTE_SLEEP) ?
                        MCI_BT_SLEEP : MCI_BT_AWAKE;
                break;
-
        case MCI_STATE_CONT_RSSI_POWER:
                value = MS(mci->cont_status, AR_MCI_CONT_RSSI_POWER);
-                       break;
-
+               break;
        case MCI_STATE_CONT_PRIORITY:
                value = MS(mci->cont_status, AR_MCI_CONT_RRIORITY);
                break;
-
        case MCI_STATE_CONT_TXRX:
                value = MS(mci->cont_status, AR_MCI_CONT_TXRX);
                break;
-
        case MCI_STATE_BT:
                value = mci->bt_state;
                break;
-
        case MCI_STATE_SET_BT_SLEEP:
                mci->bt_state = MCI_BT_SLEEP;
                break;
-
        case MCI_STATE_SET_BT_AWAKE:
                mci->bt_state = MCI_BT_AWAKE;
                ar9003_mci_send_coex_version_query(ah, true);
                ar9003_mci_send_coex_wlan_channels(ah, true);
 
-               if (mci->unhalt_bt_gpm) {
-
-                       ath_dbg(common, MCI, "MCI unhalt BT GPM\n");
+               if (mci->unhalt_bt_gpm)
                        ar9003_mci_send_coex_halt_bt_gpm(ah, false, true);
-               }
 
                ar9003_mci_2g5g_switch(ah, true);
                break;
-
        case MCI_STATE_SET_BT_CAL_START:
                mci->bt_state = MCI_BT_CAL_START;
                break;
-
        case MCI_STATE_SET_BT_CAL:
                mci->bt_state = MCI_BT_CAL;
                break;
-
        case MCI_STATE_RESET_REQ_WAKE:
                ar9003_mci_reset_req_wakeup(ah);
                mci->update_2g5g = true;
 
-               if ((AR_SREV_9462_20_OR_LATER(ah)) &&
-                   (mci->config & ATH_MCI_CONFIG_MCI_OBS_MASK)) {
+               if (mci->config & ATH_MCI_CONFIG_MCI_OBS_MASK) {
                        /* Check if we still have control of the GPIOs */
                        if ((REG_READ(ah, AR_GLB_GPIO_CONTROL) &
-                                     ATH_MCI_CONFIG_MCI_OBS_GPIO) !=
-                                       ATH_MCI_CONFIG_MCI_OBS_GPIO) {
-
-                               ath_dbg(common, MCI,
-                                       "MCI reconfigure observation\n");
+                            ATH_MCI_CONFIG_MCI_OBS_GPIO) !=
+                           ATH_MCI_CONFIG_MCI_OBS_GPIO) {
                                ar9003_mci_observation_set_up(ah);
                        }
                }
                break;
-
        case MCI_STATE_SEND_WLAN_COEX_VERSION:
                ar9003_mci_send_coex_version_response(ah, true);
                break;
-
        case MCI_STATE_SET_BT_COEX_VERSION:
-
                if (!p_data)
                        ath_dbg(common, MCI,
                                "MCI Set BT Coex version with NULL data!!\n");
@@ -1415,7 +1335,6 @@ u32 ar9003_mci_state(struct ath_hw *ah, u32 state_type, u32 *p_data)
                                mci->bt_ver_major, mci->bt_ver_minor);
                }
                break;
-
        case MCI_STATE_SEND_WLAN_CHANNELS:
                if (p_data) {
                        if (((mci->wlan_channels[1] & 0xffff0000) ==
@@ -1432,19 +1351,13 @@ u32 ar9003_mci_state(struct ath_hw *ah, u32 state_type, u32 *p_data)
                mci->wlan_channels_update = true;
                ar9003_mci_send_coex_wlan_channels(ah, true);
                break;
-
        case MCI_STATE_SEND_VERSION_QUERY:
                ar9003_mci_send_coex_version_query(ah, true);
                break;
-
        case MCI_STATE_SEND_STATUS_QUERY:
-               query_type = (AR_SREV_9462_10(ah)) ?
-                               MCI_GPM_COEX_QUERY_BT_ALL_INFO :
-                               MCI_GPM_COEX_QUERY_BT_TOPOLOGY;
-
+               query_type = MCI_GPM_COEX_QUERY_BT_TOPOLOGY;
                ar9003_mci_send_coex_bt_status_query(ah, true, query_type);
                break;
-
        case MCI_STATE_NEED_FLUSH_BT_INFO:
                        /*
                         * btcoex_hw.mci.unhalt_bt_gpm means whether it's
@@ -1464,28 +1377,21 @@ u32 ar9003_mci_state(struct ath_hw *ah, u32 state_type, u32 *p_data)
                                mci->need_flush_btinfo =
                                        (*p_data != 0) ? true : false;
                        break;
-
        case MCI_STATE_RECOVER_RX:
-
-               ath_dbg(common, MCI, "MCI hw RECOVER_RX\n");
                ar9003_mci_prep_interface(ah);
                mci->query_bt = true;
                mci->need_flush_btinfo = true;
                ar9003_mci_send_coex_wlan_channels(ah, true);
                ar9003_mci_2g5g_switch(ah, true);
                break;
-
        case MCI_STATE_NEED_FTP_STOMP:
                value = !(mci->config & ATH_MCI_CONFIG_DISABLE_FTP_STOMP);
                break;
-
        case MCI_STATE_NEED_TUNING:
                value = !(mci->config & ATH_MCI_CONFIG_DISABLE_TUNING);
                break;
-
        default:
                break;
-
        }
 
        return value;
index 798da11..4842f6c 100644 (file)
@@ -99,4 +99,237 @@ enum mci_gpm_coex_bt_update_flags_op {
                                         ATH_MCI_CONFIG_MCI_OBS_BT)
 #define ATH_MCI_CONFIG_MCI_OBS_GPIO     0x0000002F
 
+enum mci_message_header {              /* length of payload */
+       MCI_LNA_CTRL     = 0x10,        /* len = 0 */
+       MCI_CONT_NACK    = 0x20,        /* len = 0 */
+       MCI_CONT_INFO    = 0x30,        /* len = 4 */
+       MCI_CONT_RST     = 0x40,        /* len = 0 */
+       MCI_SCHD_INFO    = 0x50,        /* len = 16 */
+       MCI_CPU_INT      = 0x60,        /* len = 4 */
+       MCI_SYS_WAKING   = 0x70,        /* len = 0 */
+       MCI_GPM          = 0x80,        /* len = 16 */
+       MCI_LNA_INFO     = 0x90,        /* len = 1 */
+       MCI_LNA_STATE    = 0x94,
+       MCI_LNA_TAKE     = 0x98,
+       MCI_LNA_TRANS    = 0x9c,
+       MCI_SYS_SLEEPING = 0xa0,        /* len = 0 */
+       MCI_REQ_WAKE     = 0xc0,        /* len = 0 */
+       MCI_DEBUG_16     = 0xfe,        /* len = 2 */
+       MCI_REMOTE_RESET = 0xff         /* len = 16 */
+};
+
+enum ath_mci_gpm_coex_profile_type {
+       MCI_GPM_COEX_PROFILE_UNKNOWN,
+       MCI_GPM_COEX_PROFILE_RFCOMM,
+       MCI_GPM_COEX_PROFILE_A2DP,
+       MCI_GPM_COEX_PROFILE_HID,
+       MCI_GPM_COEX_PROFILE_BNEP,
+       MCI_GPM_COEX_PROFILE_VOICE,
+       MCI_GPM_COEX_PROFILE_MAX
+};
+
+/* MCI GPM/Coex opcode/type definitions */
+enum {
+       MCI_GPM_COEX_W_GPM_PAYLOAD      = 1,
+       MCI_GPM_COEX_B_GPM_TYPE         = 4,
+       MCI_GPM_COEX_B_GPM_OPCODE       = 5,
+       /* MCI_GPM_WLAN_CAL_REQ, MCI_GPM_WLAN_CAL_DONE */
+       MCI_GPM_WLAN_CAL_W_SEQUENCE     = 2,
+
+       /* MCI_GPM_COEX_VERSION_QUERY */
+       /* MCI_GPM_COEX_VERSION_RESPONSE */
+       MCI_GPM_COEX_B_MAJOR_VERSION    = 6,
+       MCI_GPM_COEX_B_MINOR_VERSION    = 7,
+       /* MCI_GPM_COEX_STATUS_QUERY */
+       MCI_GPM_COEX_B_BT_BITMAP        = 6,
+       MCI_GPM_COEX_B_WLAN_BITMAP      = 7,
+       /* MCI_GPM_COEX_HALT_BT_GPM */
+       MCI_GPM_COEX_B_HALT_STATE       = 6,
+       /* MCI_GPM_COEX_WLAN_CHANNELS */
+       MCI_GPM_COEX_B_CHANNEL_MAP      = 6,
+       /* MCI_GPM_COEX_BT_PROFILE_INFO */
+       MCI_GPM_COEX_B_PROFILE_TYPE     = 6,
+       MCI_GPM_COEX_B_PROFILE_LINKID   = 7,
+       MCI_GPM_COEX_B_PROFILE_STATE    = 8,
+       MCI_GPM_COEX_B_PROFILE_ROLE     = 9,
+       MCI_GPM_COEX_B_PROFILE_RATE     = 10,
+       MCI_GPM_COEX_B_PROFILE_VOTYPE   = 11,
+       MCI_GPM_COEX_H_PROFILE_T        = 12,
+       MCI_GPM_COEX_B_PROFILE_W        = 14,
+       MCI_GPM_COEX_B_PROFILE_A        = 15,
+       /* MCI_GPM_COEX_BT_STATUS_UPDATE */
+       MCI_GPM_COEX_B_STATUS_TYPE      = 6,
+       MCI_GPM_COEX_B_STATUS_LINKID    = 7,
+       MCI_GPM_COEX_B_STATUS_STATE     = 8,
+       /* MCI_GPM_COEX_BT_UPDATE_FLAGS */
+       MCI_GPM_COEX_W_BT_FLAGS         = 6,
+       MCI_GPM_COEX_B_BT_FLAGS_OP      = 10
+};
+
+enum mci_gpm_subtype {
+       MCI_GPM_BT_CAL_REQ      = 0,
+       MCI_GPM_BT_CAL_GRANT    = 1,
+       MCI_GPM_BT_CAL_DONE     = 2,
+       MCI_GPM_WLAN_CAL_REQ    = 3,
+       MCI_GPM_WLAN_CAL_GRANT  = 4,
+       MCI_GPM_WLAN_CAL_DONE   = 5,
+       MCI_GPM_COEX_AGENT      = 0x0c,
+       MCI_GPM_RSVD_PATTERN    = 0xfe,
+       MCI_GPM_RSVD_PATTERN32  = 0xfefefefe,
+       MCI_GPM_BT_DEBUG        = 0xff
+};
+
+enum mci_bt_state {
+       MCI_BT_SLEEP,
+       MCI_BT_AWAKE,
+       MCI_BT_CAL_START,
+       MCI_BT_CAL
+};
+
+/* Type of state query */
+enum mci_state_type {
+       MCI_STATE_ENABLE,
+       MCI_STATE_INIT_GPM_OFFSET,
+       MCI_STATE_NEXT_GPM_OFFSET,
+       MCI_STATE_LAST_GPM_OFFSET,
+       MCI_STATE_BT,
+       MCI_STATE_SET_BT_SLEEP,
+       MCI_STATE_SET_BT_AWAKE,
+       MCI_STATE_SET_BT_CAL_START,
+       MCI_STATE_SET_BT_CAL,
+       MCI_STATE_LAST_SCHD_MSG_OFFSET,
+       MCI_STATE_REMOTE_SLEEP,
+       MCI_STATE_CONT_RSSI_POWER,
+       MCI_STATE_CONT_PRIORITY,
+       MCI_STATE_CONT_TXRX,
+       MCI_STATE_RESET_REQ_WAKE,
+       MCI_STATE_SEND_WLAN_COEX_VERSION,
+       MCI_STATE_SET_BT_COEX_VERSION,
+       MCI_STATE_SEND_WLAN_CHANNELS,
+       MCI_STATE_SEND_VERSION_QUERY,
+       MCI_STATE_SEND_STATUS_QUERY,
+       MCI_STATE_NEED_FLUSH_BT_INFO,
+       MCI_STATE_SET_CONCUR_TX_PRI,
+       MCI_STATE_RECOVER_RX,
+       MCI_STATE_NEED_FTP_STOMP,
+       MCI_STATE_NEED_TUNING,
+       MCI_STATE_DEBUG,
+       MCI_STATE_MAX
+};
+
+enum mci_gpm_coex_opcode {
+       MCI_GPM_COEX_VERSION_QUERY,
+       MCI_GPM_COEX_VERSION_RESPONSE,
+       MCI_GPM_COEX_STATUS_QUERY,
+       MCI_GPM_COEX_HALT_BT_GPM,
+       MCI_GPM_COEX_WLAN_CHANNELS,
+       MCI_GPM_COEX_BT_PROFILE_INFO,
+       MCI_GPM_COEX_BT_STATUS_UPDATE,
+       MCI_GPM_COEX_BT_UPDATE_FLAGS
+};
+
+#define MCI_GPM_NOMORE  0
+#define MCI_GPM_MORE    1
+#define MCI_GPM_INVALID 0xffffffff
+
+#define MCI_GPM_RECYCLE(_p_gpm)        do {                      \
+       *(((u32 *)_p_gpm) + MCI_GPM_COEX_W_GPM_PAYLOAD) = \
+                               MCI_GPM_RSVD_PATTERN32;   \
+} while (0)
+
+#define MCI_GPM_TYPE(_p_gpm)   \
+       (*(((u8 *)(_p_gpm)) + MCI_GPM_COEX_B_GPM_TYPE) & 0xff)
+
+#define MCI_GPM_OPCODE(_p_gpm) \
+       (*(((u8 *)(_p_gpm)) + MCI_GPM_COEX_B_GPM_OPCODE) & 0xff)
+
+#define MCI_GPM_SET_CAL_TYPE(_p_gpm, _cal_type)        do {                       \
+       *(((u8 *)(_p_gpm)) + MCI_GPM_COEX_B_GPM_TYPE) = (_cal_type) & 0xff;\
+} while (0)
+
+#define MCI_GPM_SET_TYPE_OPCODE(_p_gpm, _type, _opcode) do {              \
+       *(((u8 *)(_p_gpm)) + MCI_GPM_COEX_B_GPM_TYPE) = (_type) & 0xff;    \
+       *(((u8 *)(_p_gpm)) + MCI_GPM_COEX_B_GPM_OPCODE) = (_opcode) & 0xff;\
+} while (0)
+
+#define MCI_GPM_IS_CAL_TYPE(_type) ((_type) <= MCI_GPM_WLAN_CAL_DONE)
+
+/*
+ * Functions that are available to the MCI driver core.
+ */
+bool ar9003_mci_send_message(struct ath_hw *ah, u8 header, u32 flag,
+                            u32 *payload, u8 len, bool wait_done,
+                            bool check_bt);
+u32 ar9003_mci_state(struct ath_hw *ah, u32 state_type, u32 *p_data);
+void ar9003_mci_setup(struct ath_hw *ah, u32 gpm_addr, void *gpm_buf,
+                     u16 len, u32 sched_addr);
+void ar9003_mci_cleanup(struct ath_hw *ah);
+void ar9003_mci_get_interrupt(struct ath_hw *ah, u32 *raw_intr,
+                             u32 *rx_msg_intr);
+
+/*
+ * These functions are used by ath9k_hw.
+ */
+
+#ifdef CONFIG_ATH9K_BTCOEX_SUPPORT
+
+static inline bool ar9003_mci_is_ready(struct ath_hw *ah)
+{
+       return ah->btcoex_hw.mci.ready;
+}
+void ar9003_mci_stop_bt(struct ath_hw *ah, bool save_fullsleep);
+void ar9003_mci_init_cal_req(struct ath_hw *ah, bool *is_reusable);
+void ar9003_mci_init_cal_done(struct ath_hw *ah);
+void ar9003_mci_set_full_sleep(struct ath_hw *ah);
+void ar9003_mci_2g5g_switch(struct ath_hw *ah, bool wait_done);
+void ar9003_mci_check_bt(struct ath_hw *ah);
+bool ar9003_mci_start_reset(struct ath_hw *ah, struct ath9k_channel *chan);
+int ar9003_mci_end_reset(struct ath_hw *ah, struct ath9k_channel *chan,
+                        struct ath9k_hw_cal_data *caldata);
+void ar9003_mci_reset(struct ath_hw *ah, bool en_int, bool is_2g,
+                     bool is_full_sleep);
+void ar9003_mci_get_isr(struct ath_hw *ah, enum ath9k_int *masked);
+
+#else
+
+static inline bool ar9003_mci_is_ready(struct ath_hw *ah)
+{
+       return false;
+}
+static inline void ar9003_mci_stop_bt(struct ath_hw *ah, bool save_fullsleep)
+{
+}
+static inline void ar9003_mci_init_cal_req(struct ath_hw *ah, bool *is_reusable)
+{
+}
+static inline void ar9003_mci_init_cal_done(struct ath_hw *ah)
+{
+}
+static inline void ar9003_mci_set_full_sleep(struct ath_hw *ah)
+{
+}
+static inline void ar9003_mci_2g5g_switch(struct ath_hw *ah, bool wait_done)
+{
+}
+static inline void ar9003_mci_check_bt(struct ath_hw *ah)
+{
+}
+static inline bool ar9003_mci_start_reset(struct ath_hw *ah, struct ath9k_channel *chan)
+{
+       return false;
+}
+static inline int ar9003_mci_end_reset(struct ath_hw *ah, struct ath9k_channel *chan,
+                                      struct ath9k_hw_cal_data *caldata)
+{
+       return 0;
+}
+static inline void ar9003_mci_reset(struct ath_hw *ah, bool en_int, bool is_2g,
+                                   bool is_full_sleep)
+{
+}
+static inline void ar9003_mci_get_isr(struct ath_hw *ah, enum ath9k_int *masked)
+{
+}
+#endif /* CONFIG_ATH9K_BTCOEX_SUPPORT */
+
 #endif
index 2b0bfb8..70e27d2 100644 (file)
@@ -1099,13 +1099,20 @@ static void ar9003_hw_set_nf_limits(struct ath_hw *ah)
 {
        ah->nf_2g.max = AR_PHY_CCA_MAX_GOOD_VAL_9300_2GHZ;
        ah->nf_2g.min = AR_PHY_CCA_MIN_GOOD_VAL_9300_2GHZ;
-       if (AR_SREV_9330(ah))
-               ah->nf_2g.nominal = AR_PHY_CCA_NOM_VAL_9330_2GHZ;
-       else
-               ah->nf_2g.nominal = AR_PHY_CCA_NOM_VAL_9300_2GHZ;
+       ah->nf_2g.nominal = AR_PHY_CCA_NOM_VAL_9300_2GHZ;
        ah->nf_5g.max = AR_PHY_CCA_MAX_GOOD_VAL_9300_5GHZ;
        ah->nf_5g.min = AR_PHY_CCA_MIN_GOOD_VAL_9300_5GHZ;
        ah->nf_5g.nominal = AR_PHY_CCA_NOM_VAL_9300_5GHZ;
+
+       if (AR_SREV_9330(ah))
+               ah->nf_2g.nominal = AR_PHY_CCA_NOM_VAL_9330_2GHZ;
+
+       if (AR_SREV_9462(ah)) {
+               ah->nf_2g.min = AR_PHY_CCA_MIN_GOOD_VAL_9462_2GHZ;
+               ah->nf_2g.nominal = AR_PHY_CCA_NOM_VAL_9462_2GHZ;
+               ah->nf_5g.min = AR_PHY_CCA_MIN_GOOD_VAL_9462_5GHZ;
+               ah->nf_5g.nominal = AR_PHY_CCA_NOM_VAL_9462_5GHZ;
+       }
 }
 
 /*
index ed64114..d834d97 100644 (file)
 
 #define AR_PHY_RX_OCGAIN        (AR_AGC_BASE + 0x200)
 
-#define AR_PHY_CCA_NOM_VAL_9300_2GHZ          (AR_SREV_9462(ah) ? -127 : -110)
-#define AR_PHY_CCA_NOM_VAL_9300_5GHZ          (AR_SREV_9462(ah) ? -127 : -115)
-#define AR_PHY_CCA_MIN_GOOD_VAL_9300_2GHZ     (AR_SREV_9462(ah) ? -127 : -125)
-#define AR_PHY_CCA_MIN_GOOD_VAL_9300_5GHZ     (AR_SREV_9462(ah) ? -127 : -125)
+#define AR_PHY_CCA_NOM_VAL_9300_2GHZ          -110
+#define AR_PHY_CCA_NOM_VAL_9300_5GHZ          -115
+#define AR_PHY_CCA_MIN_GOOD_VAL_9300_2GHZ     -125
+#define AR_PHY_CCA_MIN_GOOD_VAL_9300_5GHZ     -125
 #define AR_PHY_CCA_MAX_GOOD_VAL_9300_2GHZ     -95
 #define AR_PHY_CCA_MAX_GOOD_VAL_9300_5GHZ     -100
 
+#define AR_PHY_CCA_NOM_VAL_9462_2GHZ          -127
+#define AR_PHY_CCA_MIN_GOOD_VAL_9462_2GHZ     -127
+#define AR_PHY_CCA_NOM_VAL_9462_5GHZ          -127
+#define AR_PHY_CCA_MIN_GOOD_VAL_9462_5GHZ     -127
+
 #define AR_PHY_CCA_NOM_VAL_9330_2GHZ          -118
 
 /*
 #define AR_PHY_AIC_CTRL_1_B0   (AR_SM_BASE + 0x4b4)
 #define AR_PHY_AIC_CTRL_2_B0   (AR_SM_BASE + 0x4b8)
 #define AR_PHY_AIC_CTRL_3_B0   (AR_SM_BASE + 0x4bc)
-#define AR_PHY_AIC_STAT_0_B0   (AR_SM_BASE + (AR_SREV_9462_10(ah) ? \
-                                       0x4c0 : 0x4c4))
-#define AR_PHY_AIC_STAT_1_B0   (AR_SM_BASE + (AR_SREV_9462_10(ah) ? \
-                                       0x4c4 : 0x4c8))
+#define AR_PHY_AIC_STAT_0_B0   (AR_SM_BASE + 0x4c4))
+#define AR_PHY_AIC_STAT_1_B0   (AR_SM_BASE + 0x4c8))
 #define AR_PHY_AIC_CTRL_4_B0   (AR_SM_BASE + 0x4c0)
 #define AR_PHY_AIC_STAT_2_B0   (AR_SM_BASE + 0x4cc)
 
 #define AR_PHY_65NM_CH0_SYNTH4      0x1608c
-#define AR_PHY_SYNTH4_LONG_SHIFT_SELECT   0x00000002
-#define AR_PHY_SYNTH4_LONG_SHIFT_SELECT_S 1
+#define AR_PHY_SYNTH4_LONG_SHIFT_SELECT   (AR_SREV_9462(ah) ? 0x00000001 : 0x00000002)
+#define AR_PHY_SYNTH4_LONG_SHIFT_SELECT_S (AR_SREV_9462(ah) ? 0 : 1)
 #define AR_PHY_65NM_CH0_SYNTH7      0x16098
 #define AR_PHY_65NM_CH0_BIAS1       0x160c0
 #define AR_PHY_65NM_CH0_BIAS2       0x160c4
diff --git a/drivers/net/wireless/ath/ath9k/ar9462_1p0_initvals.h b/drivers/net/wireless/ath/ath9k/ar9462_1p0_initvals.h
deleted file mode 100644 (file)
index 5c55ae3..0000000
+++ /dev/null
@@ -1,1833 +0,0 @@
-/*
- * Copyright (c) 2010 Atheros Communications Inc.
- *
- * Permission to use, copy, modify, and/or distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-
-#ifndef INITVALS_9462_1P0_H
-#define INITVALS_9462_1P0_H
-
-/* AR9462 1.0 */
-
-static const u32 ar9462_1p0_mac_core[][2] = {
-       /* Addr      allmodes  */
-       {0x00000008, 0x00000000},
-       {0x00000030, 0x00060085},
-       {0x00000034, 0x00000005},
-       {0x00000040, 0x00000000},
-       {0x00000044, 0x00000000},
-       {0x00000048, 0x00000008},
-       {0x0000004c, 0x00000010},
-       {0x00000050, 0x00000000},
-       {0x00001040, 0x002ffc0f},
-       {0x00001044, 0x002ffc0f},
-       {0x00001048, 0x002ffc0f},
-       {0x0000104c, 0x002ffc0f},
-       {0x00001050, 0x002ffc0f},
-       {0x00001054, 0x002ffc0f},
-       {0x00001058, 0x002ffc0f},
-       {0x0000105c, 0x002ffc0f},
-       {0x00001060, 0x002ffc0f},
-       {0x00001064, 0x002ffc0f},
-       {0x000010f0, 0x00000100},
-       {0x00001270, 0x00000000},
-       {0x000012b0, 0x00000000},
-       {0x000012f0, 0x00000000},
-       {0x0000143c, 0x00000000},
-       {0x0000147c, 0x00000000},
-       {0x00001810, 0x0f000003},
-       {0x00008000, 0x00000000},
-       {0x00008004, 0x00000000},
-       {0x00008008, 0x00000000},
-       {0x0000800c, 0x00000000},
-       {0x00008018, 0x00000000},
-       {0x00008020, 0x00000000},
-       {0x00008038, 0x00000000},
-       {0x0000803c, 0x00080000},
-       {0x00008040, 0x00000000},
-       {0x00008044, 0x00000000},
-       {0x00008048, 0x00000000},
-       {0x0000804c, 0xffffffff},
-       {0x00008050, 0xffffffff},
-       {0x00008054, 0x00000000},
-       {0x00008058, 0x00000000},
-       {0x0000805c, 0x000fc78f},
-       {0x00008060, 0x0000000f},
-       {0x00008064, 0x00000000},
-       {0x00008070, 0x00000310},
-       {0x00008074, 0x00000020},
-       {0x00008078, 0x00000000},
-       {0x0000809c, 0x0000000f},
-       {0x000080a0, 0x00000000},
-       {0x000080a4, 0x02ff0000},
-       {0x000080a8, 0x0e070605},
-       {0x000080ac, 0x0000000d},
-       {0x000080b0, 0x00000000},
-       {0x000080b4, 0x00000000},
-       {0x000080b8, 0x00000000},
-       {0x000080bc, 0x00000000},
-       {0x000080c0, 0x2a800000},
-       {0x000080c4, 0x06900168},
-       {0x000080c8, 0x13881c20},
-       {0x000080cc, 0x01f40000},
-       {0x000080d0, 0x00252500},
-       {0x000080d4, 0x00a00005},
-       {0x000080d8, 0x00400002},
-       {0x000080dc, 0x00000000},
-       {0x000080e0, 0xffffffff},
-       {0x000080e4, 0x0000ffff},
-       {0x000080e8, 0x3f3f3f3f},
-       {0x000080ec, 0x00000000},
-       {0x000080f0, 0x00000000},
-       {0x000080f4, 0x00000000},
-       {0x000080fc, 0x00020000},
-       {0x00008100, 0x00000000},
-       {0x00008108, 0x00000052},
-       {0x0000810c, 0x00000000},
-       {0x00008110, 0x00000000},
-       {0x00008114, 0x000007ff},
-       {0x00008118, 0x000000aa},
-       {0x0000811c, 0x00003210},
-       {0x00008124, 0x00000000},
-       {0x00008128, 0x00000000},
-       {0x0000812c, 0x00000000},
-       {0x00008130, 0x00000000},
-       {0x00008134, 0x00000000},
-       {0x00008138, 0x00000000},
-       {0x0000813c, 0x0000ffff},
-       {0x00008144, 0xffffffff},
-       {0x00008168, 0x00000000},
-       {0x0000816c, 0x00000000},
-       {0x00008170, 0x18486e00},
-       {0x00008174, 0x33332210},
-       {0x00008178, 0x00000000},
-       {0x0000817c, 0x00020000},
-       {0x000081c4, 0x33332210},
-       {0x000081c8, 0x00000000},
-       {0x000081cc, 0x00000000},
-       {0x000081d4, 0x00000000},
-       {0x000081ec, 0x00000000},
-       {0x000081f0, 0x00000000},
-       {0x000081f4, 0x00000000},
-       {0x000081f8, 0x00000000},
-       {0x000081fc, 0x00000000},
-       {0x00008240, 0x00100000},
-       {0x00008244, 0x0010f400},
-       {0x00008248, 0x00000800},
-       {0x0000824c, 0x0001e800},
-       {0x00008250, 0x00000000},
-       {0x00008254, 0x00000000},
-       {0x00008258, 0x00000000},
-       {0x0000825c, 0x40000000},
-       {0x00008260, 0x00080922},
-       {0x00008264, 0x99c00010},
-       {0x00008268, 0xffffffff},
-       {0x0000826c, 0x0000ffff},
-       {0x00008270, 0x00000000},
-       {0x00008274, 0x40000000},
-       {0x00008278, 0x003e4180},
-       {0x0000827c, 0x00000004},
-       {0x00008284, 0x0000002c},
-       {0x00008288, 0x0000002c},
-       {0x0000828c, 0x000000ff},
-       {0x00008294, 0x00000000},
-       {0x00008298, 0x00000000},
-       {0x0000829c, 0x00000000},
-       {0x00008300, 0x00000140},
-       {0x00008314, 0x00000000},
-       {0x0000831c, 0x0000010d},
-       {0x00008328, 0x00000000},
-       {0x0000832c, 0x0000001f},
-       {0x00008330, 0x00000302},
-       {0x00008334, 0x00000700},
-       {0x00008338, 0xffff0000},
-       {0x0000833c, 0x02400000},
-       {0x00008340, 0x000107ff},
-       {0x00008344, 0xaa48105b},
-       {0x00008348, 0x008f0000},
-       {0x0000835c, 0x00000000},
-       {0x00008360, 0xffffffff},
-       {0x00008364, 0xffffffff},
-       {0x00008368, 0x00000000},
-       {0x00008370, 0x00000000},
-       {0x00008374, 0x000000ff},
-       {0x00008378, 0x00000000},
-       {0x0000837c, 0x00000000},
-       {0x00008380, 0xffffffff},
-       {0x00008384, 0xffffffff},
-       {0x00008390, 0xffffffff},
-       {0x00008394, 0xffffffff},
-       {0x00008398, 0x00000000},
-       {0x0000839c, 0x00000000},
-       {0x000083a4, 0x0000fa14},
-       {0x000083a8, 0x000f0c00},
-       {0x000083ac, 0x33332210},
-       {0x000083b0, 0x33332210},
-       {0x000083b4, 0x33332210},
-       {0x000083b8, 0x33332210},
-       {0x000083bc, 0x00000000},
-       {0x000083c0, 0x00000000},
-       {0x000083c4, 0x00000000},
-       {0x000083c8, 0x00000000},
-       {0x000083cc, 0x00000200},
-       {0x000083d0, 0x000301ff},
-};
-
-static const u32 ar9462_1p0_baseband_core_txfir_coeff_japan_2484[][2] = {
-       /* Addr      allmodes  */
-       {0x0000a398, 0x00000000},
-       {0x0000a39c, 0x6f7f0301},
-       {0x0000a3a0, 0xca9228ee},
-};
-
-static const u32 ar9462_1p0_sys3ant[][2] = {
-       /* Addr      allmodes  */
-       {0x00063280, 0x00040807},
-       {0x00063284, 0x104ccccc},
-};
-
-static const u32 ar9462_pcie_phy_clkreq_enable_L1_1p0[][2] = {
-       /* Addr      allmodes  */
-       {0x00018c00, 0x10053e5e},
-       {0x00018c04, 0x000801d8},
-       {0x00018c08, 0x0000580c},
-};
-
-static const u32 ar9462_1p0_mac_core_emulation[][2] = {
-       /* Addr      allmodes  */
-       {0x00000030, 0x00060085},
-       {0x00000044, 0x00000008},
-       {0x0000805c, 0xffffc7ff},
-       {0x00008344, 0xaa4a105b},
-};
-
-static const u32 ar9462_common_rx_gain_table_ar9280_2p0_1p0[][2] = {
-       /* Addr      allmodes  */
-       {0x0000a000, 0x02000101},
-       {0x0000a004, 0x02000102},
-       {0x0000a008, 0x02000103},
-       {0x0000a00c, 0x02000104},
-       {0x0000a010, 0x02000200},
-       {0x0000a014, 0x02000201},
-       {0x0000a018, 0x02000202},
-       {0x0000a01c, 0x02000203},
-       {0x0000a020, 0x02000204},
-       {0x0000a024, 0x02000205},
-       {0x0000a028, 0x02000208},
-       {0x0000a02c, 0x02000302},
-       {0x0000a030, 0x02000303},
-       {0x0000a034, 0x02000304},
-       {0x0000a038, 0x02000400},
-       {0x0000a03c, 0x02010300},
-       {0x0000a040, 0x02010301},
-       {0x0000a044, 0x02010302},
-       {0x0000a048, 0x02000500},
-       {0x0000a04c, 0x02010400},
-       {0x0000a050, 0x02020300},
-       {0x0000a054, 0x02020301},
-       {0x0000a058, 0x02020302},
-       {0x0000a05c, 0x02020303},
-       {0x0000a060, 0x02020400},
-       {0x0000a064, 0x02030300},
-       {0x0000a068, 0x02030301},
-       {0x0000a06c, 0x02030302},
-       {0x0000a070, 0x02030303},
-       {0x0000a074, 0x02030400},
-       {0x0000a078, 0x02040300},
-       {0x0000a07c, 0x02040301},
-       {0x0000a080, 0x02040302},
-       {0x0000a084, 0x02040303},
-       {0x0000a088, 0x02030500},
-       {0x0000a08c, 0x02040400},
-       {0x0000a090, 0x02050203},
-       {0x0000a094, 0x02050204},
-       {0x0000a098, 0x02050205},
-       {0x0000a09c, 0x02040500},
-       {0x0000a0a0, 0x02050301},
-       {0x0000a0a4, 0x02050302},
-       {0x0000a0a8, 0x02050303},
-       {0x0000a0ac, 0x02050400},
-       {0x0000a0b0, 0x02050401},
-       {0x0000a0b4, 0x02050402},
-       {0x0000a0b8, 0x02050403},
-       {0x0000a0bc, 0x02050500},
-       {0x0000a0c0, 0x02050501},
-       {0x0000a0c4, 0x02050502},
-       {0x0000a0c8, 0x02050503},
-       {0x0000a0cc, 0x02050504},
-       {0x0000a0d0, 0x02050600},
-       {0x0000a0d4, 0x02050601},
-       {0x0000a0d8, 0x02050602},
-       {0x0000a0dc, 0x02050603},
-       {0x0000a0e0, 0x02050604},
-       {0x0000a0e4, 0x02050700},
-       {0x0000a0e8, 0x02050701},
-       {0x0000a0ec, 0x02050702},
-       {0x0000a0f0, 0x02050703},
-       {0x0000a0f4, 0x02050704},
-       {0x0000a0f8, 0x02050705},
-       {0x0000a0fc, 0x02050708},
-       {0x0000a100, 0x02050709},
-       {0x0000a104, 0x0205070a},
-       {0x0000a108, 0x0205070b},
-       {0x0000a10c, 0x0205070c},
-       {0x0000a110, 0x0205070d},
-       {0x0000a114, 0x02050710},
-       {0x0000a118, 0x02050711},
-       {0x0000a11c, 0x02050712},
-       {0x0000a120, 0x02050713},
-       {0x0000a124, 0x02050714},
-       {0x0000a128, 0x02050715},
-       {0x0000a12c, 0x02050730},
-       {0x0000a130, 0x02050731},
-       {0x0000a134, 0x02050732},
-       {0x0000a138, 0x02050733},
-       {0x0000a13c, 0x02050734},
-       {0x0000a140, 0x02050735},
-       {0x0000a144, 0x02050750},
-       {0x0000a148, 0x02050751},
-       {0x0000a14c, 0x02050752},
-       {0x0000a150, 0x02050753},
-       {0x0000a154, 0x02050754},
-       {0x0000a158, 0x02050755},
-       {0x0000a15c, 0x02050770},
-       {0x0000a160, 0x02050771},
-       {0x0000a164, 0x02050772},
-       {0x0000a168, 0x02050773},
-       {0x0000a16c, 0x02050774},
-       {0x0000a170, 0x02050775},
-       {0x0000a174, 0x00000776},
-       {0x0000a178, 0x00000776},
-       {0x0000a17c, 0x00000776},
-       {0x0000a180, 0x00000776},
-       {0x0000a184, 0x00000776},
-       {0x0000a188, 0x00000776},
-       {0x0000a18c, 0x00000776},
-       {0x0000a190, 0x00000776},
-       {0x0000a194, 0x00000776},
-       {0x0000a198, 0x00000776},
-       {0x0000a19c, 0x00000776},
-       {0x0000a1a0, 0x00000776},
-       {0x0000a1a4, 0x00000776},
-       {0x0000a1a8, 0x00000776},
-       {0x0000a1ac, 0x00000776},
-       {0x0000a1b0, 0x00000776},
-       {0x0000a1b4, 0x00000776},
-       {0x0000a1b8, 0x00000776},
-       {0x0000a1bc, 0x00000776},
-       {0x0000a1c0, 0x00000776},
-       {0x0000a1c4, 0x00000776},
-       {0x0000a1c8, 0x00000776},
-       {0x0000a1cc, 0x00000776},
-       {0x0000a1d0, 0x00000776},
-       {0x0000a1d4, 0x00000776},
-       {0x0000a1d8, 0x00000776},
-       {0x0000a1dc, 0x00000776},
-       {0x0000a1e0, 0x00000776},
-       {0x0000a1e4, 0x00000776},
-       {0x0000a1e8, 0x00000776},
-       {0x0000a1ec, 0x00000776},
-       {0x0000a1f0, 0x00000776},
-       {0x0000a1f4, 0x00000776},
-       {0x0000a1f8, 0x00000776},
-       {0x0000a1fc, 0x00000776},
-       {0x0000b000, 0x02000101},
-       {0x0000b004, 0x02000102},
-       {0x0000b008, 0x02000103},
-       {0x0000b00c, 0x02000104},
-       {0x0000b010, 0x02000200},
-       {0x0000b014, 0x02000201},
-       {0x0000b018, 0x02000202},
-       {0x0000b01c, 0x02000203},
-       {0x0000b020, 0x02000204},
-       {0x0000b024, 0x02000205},
-       {0x0000b028, 0x02000208},
-       {0x0000b02c, 0x02000302},
-       {0x0000b030, 0x02000303},
-       {0x0000b034, 0x02000304},
-       {0x0000b038, 0x02000400},
-       {0x0000b03c, 0x02010300},
-       {0x0000b040, 0x02010301},
-       {0x0000b044, 0x02010302},
-       {0x0000b048, 0x02000500},
-       {0x0000b04c, 0x02010400},
-       {0x0000b050, 0x02020300},
-       {0x0000b054, 0x02020301},
-       {0x0000b058, 0x02020302},
-       {0x0000b05c, 0x02020303},
-       {0x0000b060, 0x02020400},
-       {0x0000b064, 0x02030300},
-       {0x0000b068, 0x02030301},
-       {0x0000b06c, 0x02030302},
-       {0x0000b070, 0x02030303},
-       {0x0000b074, 0x02030400},
-       {0x0000b078, 0x02040300},
-       {0x0000b07c, 0x02040301},
-       {0x0000b080, 0x02040302},
-       {0x0000b084, 0x02040303},
-       {0x0000b088, 0x02030500},
-       {0x0000b08c, 0x02040400},
-       {0x0000b090, 0x02050203},
-       {0x0000b094, 0x02050204},
-       {0x0000b098, 0x02050205},
-       {0x0000b09c, 0x02040500},
-       {0x0000b0a0, 0x02050301},
-       {0x0000b0a4, 0x02050302},
-       {0x0000b0a8, 0x02050303},
-       {0x0000b0ac, 0x02050400},
-       {0x0000b0b0, 0x02050401},
-       {0x0000b0b4, 0x02050402},
-       {0x0000b0b8, 0x02050403},
-       {0x0000b0bc, 0x02050500},
-       {0x0000b0c0, 0x02050501},
-       {0x0000b0c4, 0x02050502},
-       {0x0000b0c8, 0x02050503},
-       {0x0000b0cc, 0x02050504},
-       {0x0000b0d0, 0x02050600},
-       {0x0000b0d4, 0x02050601},
-       {0x0000b0d8, 0x02050602},
-       {0x0000b0dc, 0x02050603},
-       {0x0000b0e0, 0x02050604},
-       {0x0000b0e4, 0x02050700},
-       {0x0000b0e8, 0x02050701},
-       {0x0000b0ec, 0x02050702},
-       {0x0000b0f0, 0x02050703},
-       {0x0000b0f4, 0x02050704},
-       {0x0000b0f8, 0x02050705},
-       {0x0000b0fc, 0x02050708},
-       {0x0000b100, 0x02050709},
-       {0x0000b104, 0x0205070a},
-       {0x0000b108, 0x0205070b},
-       {0x0000b10c, 0x0205070c},
-       {0x0000b110, 0x0205070d},
-       {0x0000b114, 0x02050710},
-       {0x0000b118, 0x02050711},
-       {0x0000b11c, 0x02050712},
-       {0x0000b120, 0x02050713},
-       {0x0000b124, 0x02050714},
-       {0x0000b128, 0x02050715},
-       {0x0000b12c, 0x02050730},
-       {0x0000b130, 0x02050731},
-       {0x0000b134, 0x02050732},
-       {0x0000b138, 0x02050733},
-       {0x0000b13c, 0x02050734},
-       {0x0000b140, 0x02050735},
-       {0x0000b144, 0x02050750},
-       {0x0000b148, 0x02050751},
-       {0x0000b14c, 0x02050752},
-       {0x0000b150, 0x02050753},
-       {0x0000b154, 0x02050754},
-       {0x0000b158, 0x02050755},
-       {0x0000b15c, 0x02050770},
-       {0x0000b160, 0x02050771},
-       {0x0000b164, 0x02050772},
-       {0x0000b168, 0x02050773},
-       {0x0000b16c, 0x02050774},
-       {0x0000b170, 0x02050775},
-       {0x0000b174, 0x00000776},
-       {0x0000b178, 0x00000776},
-       {0x0000b17c, 0x00000776},
-       {0x0000b180, 0x00000776},
-       {0x0000b184, 0x00000776},
-       {0x0000b188, 0x00000776},
-       {0x0000b18c, 0x00000776},
-       {0x0000b190, 0x00000776},
-       {0x0000b194, 0x00000776},
-       {0x0000b198, 0x00000776},
-       {0x0000b19c, 0x00000776},
-       {0x0000b1a0, 0x00000776},
-       {0x0000b1a4, 0x00000776},
-       {0x0000b1a8, 0x00000776},
-       {0x0000b1ac, 0x00000776},
-       {0x0000b1b0, 0x00000776},
-       {0x0000b1b4, 0x00000776},
-       {0x0000b1b8, 0x00000776},
-       {0x0000b1bc, 0x00000776},
-       {0x0000b1c0, 0x00000776},
-       {0x0000b1c4, 0x00000776},
-       {0x0000b1c8, 0x00000776},
-       {0x0000b1cc, 0x00000776},
-       {0x0000b1d0, 0x00000776},
-       {0x0000b1d4, 0x00000776},
-       {0x0000b1d8, 0x00000776},
-       {0x0000b1dc, 0x00000776},
-       {0x0000b1e0, 0x00000776},
-       {0x0000b1e4, 0x00000776},
-       {0x0000b1e8, 0x00000776},
-       {0x0000b1ec, 0x00000776},
-       {0x0000b1f0, 0x00000776},
-       {0x0000b1f4, 0x00000776},
-       {0x0000b1f8, 0x00000776},
-       {0x0000b1fc, 0x00000776},
-};
-
-static const u32 ar9200_ar9280_2p0_radio_core_1p0[][2] = {
-       /* Addr      allmodes  */
-       {0x00007800, 0x00040000},
-       {0x00007804, 0xdb005012},
-       {0x00007808, 0x04924914},
-       {0x0000780c, 0x21084210},
-       {0x00007810, 0x6d801300},
-       {0x00007814, 0x0019beff},
-       {0x00007818, 0x07e41000},
-       {0x0000781c, 0x00392000},
-       {0x00007820, 0x92592480},
-       {0x00007824, 0x00040000},
-       {0x00007828, 0xdb005012},
-       {0x0000782c, 0x04924914},
-       {0x00007830, 0x21084210},
-       {0x00007834, 0x6d801300},
-       {0x00007838, 0x0019beff},
-       {0x0000783c, 0x07e40000},
-       {0x00007840, 0x00392000},
-       {0x00007844, 0x92592480},
-       {0x00007848, 0x00100000},
-       {0x0000784c, 0x773f0567},
-       {0x00007850, 0x54214514},
-       {0x00007854, 0x12035828},
-       {0x00007858, 0x92592692},
-       {0x0000785c, 0x00000000},
-       {0x00007860, 0x56400000},
-       {0x00007864, 0x0a8e370e},
-       {0x00007868, 0xc0102850},
-       {0x0000786c, 0x812d4000},
-       {0x00007870, 0x807ec400},
-       {0x00007874, 0x001b6db0},
-       {0x00007878, 0x00376b63},
-       {0x0000787c, 0x06db6db6},
-       {0x00007880, 0x006d8000},
-       {0x00007884, 0xffeffffe},
-       {0x00007888, 0xffeffffe},
-       {0x0000788c, 0x00010000},
-       {0x00007890, 0x02060aeb},
-       {0x00007894, 0x5a108000},
-};
-
-static const u32 ar9462_1p0_baseband_postamble_emulation[][5] = {
-       /* Addr      5G_HT20     5G_HT40     2G_HT40     2G_HT20   */
-       {0x00009e18, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
-       {0x00009e3c, 0xcf946221, 0xcf946221, 0xcf946221, 0xcf946221},
-       {0x00009e44, 0x005c0000, 0x005c0000, 0x005c0000, 0x005c0000},
-       {0x0000a258, 0x02020200, 0x02020200, 0x02020200, 0x02020200},
-       {0x0000a25c, 0x00000e0e, 0x00000e0e, 0x00000e0e, 0x00000e0e},
-       {0x0000a28c, 0x00011111, 0x00011111, 0x00011111, 0x00011111},
-       {0x0000a2c4, 0x00148d18, 0x00148d18, 0x00148d20, 0x00148d20},
-       {0x0000a2d8, 0xf999a800, 0xf999a800, 0xf999a80c, 0xf999a80c},
-       {0x0000a50c, 0x0000c00a, 0x0000c00a, 0x0000c00a, 0x0000c00a},
-       {0x0000a538, 0x00038e8c, 0x00038e8c, 0x00038e8c, 0x00038e8c},
-       {0x0000a53c, 0x0003cecc, 0x0003cecc, 0x0003cecc, 0x0003cecc},
-       {0x0000a540, 0x00040ed4, 0x00040ed4, 0x00040ed4, 0x00040ed4},
-       {0x0000a544, 0x00044edc, 0x00044edc, 0x00044edc, 0x00044edc},
-       {0x0000a548, 0x00048ede, 0x00048ede, 0x00048ede, 0x00048ede},
-       {0x0000a54c, 0x0004cf1e, 0x0004cf1e, 0x0004cf1e, 0x0004cf1e},
-       {0x0000a550, 0x00050f5e, 0x00050f5e, 0x00050f5e, 0x00050f5e},
-       {0x0000a554, 0x00054f9e, 0x00054f9e, 0x00054f9e, 0x00054f9e},
-       {0x0000ae18, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
-};
-
-static const u32 ar9462_pcie_phy_pll_on_clkreq_disable_L1_1p0[][2] = {
-       /* Addr      allmodes  */
-       {0x00018c00, 0x10012e5e},
-       {0x00018c04, 0x000801d8},
-       {0x00018c08, 0x0000580c},
-};
-
-static const u32 ar9462_common_rx_gain_table_1p0[][2] = {
-       /* Addr      allmodes  */
-       {0x0000a000, 0x00010000},
-       {0x0000a004, 0x00030002},
-       {0x0000a008, 0x00050004},
-       {0x0000a00c, 0x00810080},
-       {0x0000a010, 0x00830082},
-       {0x0000a014, 0x01810180},
-       {0x0000a018, 0x01830182},
-       {0x0000a01c, 0x01850184},
-       {0x0000a020, 0x01890188},
-       {0x0000a024, 0x018b018a},
-       {0x0000a028, 0x018d018c},
-       {0x0000a02c, 0x01910190},
-       {0x0000a030, 0x01930192},
-       {0x0000a034, 0x01950194},
-       {0x0000a038, 0x038a0196},
-       {0x0000a03c, 0x038c038b},
-       {0x0000a040, 0x0390038d},
-       {0x0000a044, 0x03920391},
-       {0x0000a048, 0x03940393},
-       {0x0000a04c, 0x03960395},
-       {0x0000a050, 0x00000000},
-       {0x0000a054, 0x00000000},
-       {0x0000a058, 0x00000000},
-       {0x0000a05c, 0x00000000},
-       {0x0000a060, 0x00000000},
-       {0x0000a064, 0x00000000},
-       {0x0000a068, 0x00000000},
-       {0x0000a06c, 0x00000000},
-       {0x0000a070, 0x00000000},
-       {0x0000a074, 0x00000000},
-       {0x0000a078, 0x00000000},
-       {0x0000a07c, 0x00000000},
-       {0x0000a080, 0x22222229},
-       {0x0000a084, 0x1d1d1d1d},
-       {0x0000a088, 0x1d1d1d1d},
-       {0x0000a08c, 0x1d1d1d1d},
-       {0x0000a090, 0x171d1d1d},
-       {0x0000a094, 0x11111717},
-       {0x0000a098, 0x00030311},
-       {0x0000a09c, 0x00000000},
-       {0x0000a0a0, 0x00000000},
-       {0x0000a0a4, 0x00000000},
-       {0x0000a0a8, 0x00000000},
-       {0x0000a0ac, 0x00000000},
-       {0x0000a0b0, 0x00000000},
-       {0x0000a0b4, 0x00000000},
-       {0x0000a0b8, 0x00000000},
-       {0x0000a0bc, 0x00000000},
-       {0x0000a0c0, 0x001f0000},
-       {0x0000a0c4, 0x01000101},
-       {0x0000a0c8, 0x011e011f},
-       {0x0000a0cc, 0x011c011d},
-       {0x0000a0d0, 0x02030204},
-       {0x0000a0d4, 0x02010202},
-       {0x0000a0d8, 0x021f0200},
-       {0x0000a0dc, 0x0302021e},
-       {0x0000a0e0, 0x03000301},
-       {0x0000a0e4, 0x031e031f},
-       {0x0000a0e8, 0x0402031d},
-       {0x0000a0ec, 0x04000401},
-       {0x0000a0f0, 0x041e041f},
-       {0x0000a0f4, 0x0502041d},
-       {0x0000a0f8, 0x05000501},
-       {0x0000a0fc, 0x051e051f},
-       {0x0000a100, 0x06010602},
-       {0x0000a104, 0x061f0600},
-       {0x0000a108, 0x061d061e},
-       {0x0000a10c, 0x07020703},
-       {0x0000a110, 0x07000701},
-       {0x0000a114, 0x00000000},
-       {0x0000a118, 0x00000000},
-       {0x0000a11c, 0x00000000},
-       {0x0000a120, 0x00000000},
-       {0x0000a124, 0x00000000},
-       {0x0000a128, 0x00000000},
-       {0x0000a12c, 0x00000000},
-       {0x0000a130, 0x00000000},
-       {0x0000a134, 0x00000000},
-       {0x0000a138, 0x00000000},
-       {0x0000a13c, 0x00000000},
-       {0x0000a140, 0x001f0000},
-       {0x0000a144, 0x01000101},
-       {0x0000a148, 0x011e011f},
-       {0x0000a14c, 0x011c011d},
-       {0x0000a150, 0x02030204},
-       {0x0000a154, 0x02010202},
-       {0x0000a158, 0x021f0200},
-       {0x0000a15c, 0x0302021e},
-       {0x0000a160, 0x03000301},
-       {0x0000a164, 0x031e031f},
-       {0x0000a168, 0x0402031d},
-       {0x0000a16c, 0x04000401},
-       {0x0000a170, 0x041e041f},
-       {0x0000a174, 0x0502041d},
-       {0x0000a178, 0x05000501},
-       {0x0000a17c, 0x051e051f},
-       {0x0000a180, 0x06010602},
-       {0x0000a184, 0x061f0600},
-       {0x0000a188, 0x061d061e},
-       {0x0000a18c, 0x07020703},
-       {0x0000a190, 0x07000701},
-       {0x0000a194, 0x00000000},
-       {0x0000a198, 0x00000000},
-       {0x0000a19c, 0x00000000},
-       {0x0000a1a0, 0x00000000},
-       {0x0000a1a4, 0x00000000},
-       {0x0000a1a8, 0x00000000},
-       {0x0000a1ac, 0x00000000},
-       {0x0000a1b0, 0x00000000},
-       {0x0000a1b4, 0x00000000},
-       {0x0000a1b8, 0x00000000},
-       {0x0000a1bc, 0x00000000},
-       {0x0000a1c0, 0x00000000},
-       {0x0000a1c4, 0x00000000},
-       {0x0000a1c8, 0x00000000},
-       {0x0000a1cc, 0x00000000},
-       {0x0000a1d0, 0x00000000},
-       {0x0000a1d4, 0x00000000},
-       {0x0000a1d8, 0x00000000},
-       {0x0000a1dc, 0x00000000},
-       {0x0000a1e0, 0x00000000},
-       {0x0000a1e4, 0x00000000},
-       {0x0000a1e8, 0x00000000},
-       {0x0000a1ec, 0x00000000},
-       {0x0000a1f0, 0x00000396},
-       {0x0000a1f4, 0x00000396},
-       {0x0000a1f8, 0x00000396},
-       {0x0000a1fc, 0x00000196},
-       {0x0000b000, 0x00010000},
-       {0x0000b004, 0x00030002},
-       {0x0000b008, 0x00050004},
-       {0x0000b00c, 0x00810080},
-       {0x0000b010, 0x00830082},
-       {0x0000b014, 0x01810180},
-       {0x0000b018, 0x01830182},
-       {0x0000b01c, 0x01850184},
-       {0x0000b020, 0x02810280},
-       {0x0000b024, 0x02830282},
-       {0x0000b028, 0x02850284},
-       {0x0000b02c, 0x02890288},
-       {0x0000b030, 0x028b028a},
-       {0x0000b034, 0x0388028c},
-       {0x0000b038, 0x038a0389},
-       {0x0000b03c, 0x038c038b},
-       {0x0000b040, 0x0390038d},
-       {0x0000b044, 0x03920391},
-       {0x0000b048, 0x03940393},
-       {0x0000b04c, 0x03960395},
-       {0x0000b050, 0x00000000},
-       {0x0000b054, 0x00000000},
-       {0x0000b058, 0x00000000},
-       {0x0000b05c, 0x00000000},
-       {0x0000b060, 0x00000000},
-       {0x0000b064, 0x00000000},
-       {0x0000b068, 0x00000000},
-       {0x0000b06c, 0x00000000},
-       {0x0000b070, 0x00000000},
-       {0x0000b074, 0x00000000},
-       {0x0000b078, 0x00000000},
-       {0x0000b07c, 0x00000000},
-       {0x0000b080, 0x2a2d2f32},
-       {0x0000b084, 0x21232328},
-       {0x0000b088, 0x19191c1e},
-       {0x0000b08c, 0x12141417},
-       {0x0000b090, 0x07070e0e},
-       {0x0000b094, 0x03030305},
-       {0x0000b098, 0x00000003},
-       {0x0000b09c, 0x00000000},
-       {0x0000b0a0, 0x00000000},
-       {0x0000b0a4, 0x00000000},
-       {0x0000b0a8, 0x00000000},
-       {0x0000b0ac, 0x00000000},
-       {0x0000b0b0, 0x00000000},
-       {0x0000b0b4, 0x00000000},
-       {0x0000b0b8, 0x00000000},
-       {0x0000b0bc, 0x00000000},
-       {0x0000b0c0, 0x003f0020},
-       {0x0000b0c4, 0x00400041},
-       {0x0000b0c8, 0x0140005f},
-       {0x0000b0cc, 0x0160015f},
-       {0x0000b0d0, 0x017e017f},
-       {0x0000b0d4, 0x02410242},
-       {0x0000b0d8, 0x025f0240},
-       {0x0000b0dc, 0x027f0260},
-       {0x0000b0e0, 0x0341027e},
-       {0x0000b0e4, 0x035f0340},
-       {0x0000b0e8, 0x037f0360},
-       {0x0000b0ec, 0x04400441},
-       {0x0000b0f0, 0x0460045f},
-       {0x0000b0f4, 0x0541047f},
-       {0x0000b0f8, 0x055f0540},
-       {0x0000b0fc, 0x057f0560},
-       {0x0000b100, 0x06400641},
-       {0x0000b104, 0x0660065f},
-       {0x0000b108, 0x067e067f},
-       {0x0000b10c, 0x07410742},
-       {0x0000b110, 0x075f0740},
-       {0x0000b114, 0x077f0760},
-       {0x0000b118, 0x07800781},
-       {0x0000b11c, 0x07a0079f},
-       {0x0000b120, 0x07c107bf},
-       {0x0000b124, 0x000007c0},
-       {0x0000b128, 0x00000000},
-       {0x0000b12c, 0x00000000},
-       {0x0000b130, 0x00000000},
-       {0x0000b134, 0x00000000},
-       {0x0000b138, 0x00000000},
-       {0x0000b13c, 0x00000000},
-       {0x0000b140, 0x003f0020},
-       {0x0000b144, 0x00400041},
-       {0x0000b148, 0x0140005f},
-       {0x0000b14c, 0x0160015f},
-       {0x0000b150, 0x017e017f},
-       {0x0000b154, 0x02410242},
-       {0x0000b158, 0x025f0240},
-       {0x0000b15c, 0x027f0260},
-       {0x0000b160, 0x0341027e},
-       {0x0000b164, 0x035f0340},
-       {0x0000b168, 0x037f0360},
-       {0x0000b16c, 0x04400441},
-       {0x0000b170, 0x0460045f},
-       {0x0000b174, 0x0541047f},
-       {0x0000b178, 0x055f0540},
-       {0x0000b17c, 0x057f0560},
-       {0x0000b180, 0x06400641},
-       {0x0000b184, 0x0660065f},
-       {0x0000b188, 0x067e067f},
-       {0x0000b18c, 0x07410742},
-       {0x0000b190, 0x075f0740},
-       {0x0000b194, 0x077f0760},
-       {0x0000b198, 0x07800781},
-       {0x0000b19c, 0x07a0079f},
-       {0x0000b1a0, 0x07c107bf},
-       {0x0000b1a4, 0x000007c0},
-       {0x0000b1a8, 0x00000000},
-       {0x0000b1ac, 0x00000000},
-       {0x0000b1b0, 0x00000000},
-       {0x0000b1b4, 0x00000000},
-       {0x0000b1b8, 0x00000000},
-       {0x0000b1bc, 0x00000000},
-       {0x0000b1c0, 0x00000000},
-       {0x0000b1c4, 0x00000000},
-       {0x0000b1c8, 0x00000000},
-       {0x0000b1cc, 0x00000000},
-       {0x0000b1d0, 0x00000000},
-       {0x0000b1d4, 0x00000000},
-       {0x0000b1d8, 0x00000000},
-       {0x0000b1dc, 0x00000000},
-       {0x0000b1e0, 0x00000000},
-       {0x0000b1e4, 0x00000000},
-       {0x0000b1e8, 0x00000000},
-       {0x0000b1ec, 0x00000000},
-       {0x0000b1f0, 0x00000396},
-       {0x0000b1f4, 0x00000396},
-       {0x0000b1f8, 0x00000396},
-       {0x0000b1fc, 0x00000196},
-};
-
-static const u32 ar9462_modes_high_ob_db_tx_gain_table_1p0[][5] = {
-       /* Addr      5G_HT20     5G_HT40     2G_HT40     2G_HT20   */
-       {0x0000a2dc, 0x01feee00, 0x01feee00, 0x03aaa352, 0x03aaa352},
-       {0x0000a2e0, 0x0000f000, 0x0000f000, 0x03ccc584, 0x03ccc584},
-       {0x0000a2e4, 0x01ff0000, 0x01ff0000, 0x03f0f800, 0x03f0f800},
-       {0x0000a2e8, 0x00000000, 0x00000000, 0x03ff0000, 0x03ff0000},
-       {0x0000a410, 0x000050d9, 0x000050d9, 0x000050d9, 0x000050d9},
-       {0x0000a500, 0x00002220, 0x00002220, 0x00000000, 0x00000000},
-       {0x0000a504, 0x06002223, 0x06002223, 0x04000002, 0x04000002},
-       {0x0000a508, 0x0a022220, 0x0a022220, 0x08000004, 0x08000004},
-       {0x0000a50c, 0x0f022223, 0x0f022223, 0x0b000200, 0x0b000200},
-       {0x0000a510, 0x14022620, 0x14022620, 0x0f000202, 0x0f000202},
-       {0x0000a514, 0x18022622, 0x18022622, 0x11000400, 0x11000400},
-       {0x0000a518, 0x1b022822, 0x1b022822, 0x15000402, 0x15000402},
-       {0x0000a51c, 0x20022842, 0x20022842, 0x19000404, 0x19000404},
-       {0x0000a520, 0x22022c41, 0x22022c41, 0x1b000603, 0x1b000603},
-       {0x0000a524, 0x28023042, 0x28023042, 0x1f000a02, 0x1f000a02},
-       {0x0000a528, 0x2c023044, 0x2c023044, 0x23000a04, 0x23000a04},
-       {0x0000a52c, 0x2f023644, 0x2f023644, 0x26000a20, 0x26000a20},
-       {0x0000a530, 0x34025643, 0x34025643, 0x2a000e20, 0x2a000e20},
-       {0x0000a534, 0x38025a44, 0x38025a44, 0x2e000e22, 0x2e000e22},
-       {0x0000a538, 0x3b025e45, 0x3b025e45, 0x31000e24, 0x31000e24},
-       {0x0000a53c, 0x41025e4a, 0x41025e4a, 0x34001640, 0x34001640},
-       {0x0000a540, 0x48025e6c, 0x48025e6c, 0x38001660, 0x38001660},
-       {0x0000a544, 0x4e025e8e, 0x4e025e8e, 0x3b001861, 0x3b001861},
-       {0x0000a548, 0x53025eb2, 0x53025eb2, 0x3e001a81, 0x3e001a81},
-       {0x0000a54c, 0x59025eb2, 0x59025eb2, 0x42001a83, 0x42001a83},
-       {0x0000a550, 0x5f025ef6, 0x5f025ef6, 0x44001c84, 0x44001c84},
-       {0x0000a554, 0x62025f56, 0x62025f56, 0x48001ce3, 0x48001ce3},
-       {0x0000a558, 0x66027f56, 0x66027f56, 0x4c001ce5, 0x4c001ce5},
-       {0x0000a55c, 0x6a029f56, 0x6a029f56, 0x50001ce9, 0x50001ce9},
-       {0x0000a560, 0x70049f56, 0x70049f56, 0x54001ceb, 0x54001ceb},
-       {0x0000a564, 0x7504ff56, 0x7504ff56, 0x56001eec, 0x56001eec},
-       {0x0000a568, 0x7504ff56, 0x7504ff56, 0x56001eec, 0x56001eec},
-       {0x0000a56c, 0x7504ff56, 0x7504ff56, 0x56001eec, 0x56001eec},
-       {0x0000a570, 0x7504ff56, 0x7504ff56, 0x56001eec, 0x56001eec},
-       {0x0000a574, 0x7504ff56, 0x7504ff56, 0x56001eec, 0x56001eec},
-       {0x0000a578, 0x7504ff56, 0x7504ff56, 0x56001eec, 0x56001eec},
-       {0x0000a57c, 0x7504ff56, 0x7504ff56, 0x56001eec, 0x56001eec},
-       {0x0000a600, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
-       {0x0000a604, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
-       {0x0000a608, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
-       {0x0000a60c, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
-       {0x0000a610, 0x00804000, 0x00804000, 0x00000000, 0x00000000},
-       {0x0000a614, 0x00804201, 0x00804201, 0x01404000, 0x01404000},
-       {0x0000a618, 0x0280c802, 0x0280c802, 0x01404501, 0x01404501},
-       {0x0000a61c, 0x0280ca03, 0x0280ca03, 0x02008501, 0x02008501},
-       {0x0000a620, 0x04c15104, 0x04c15104, 0x0280ca03, 0x0280ca03},
-       {0x0000a624, 0x04c15305, 0x04c15305, 0x03010c04, 0x03010c04},
-       {0x0000a628, 0x04c15305, 0x04c15305, 0x04014c04, 0x04014c04},
-       {0x0000a62c, 0x04c15305, 0x04c15305, 0x04015005, 0x04015005},
-       {0x0000a630, 0x04c15305, 0x04c15305, 0x04015005, 0x04015005},
-       {0x0000a634, 0x04c15305, 0x04c15305, 0x04015005, 0x04015005},
-       {0x0000a638, 0x04c15305, 0x04c15305, 0x04015005, 0x04015005},
-       {0x0000a63c, 0x04c15305, 0x04c15305, 0x04015005, 0x04015005},
-       {0x0000b2dc, 0x01feee00, 0x01feee00, 0x03aaa352, 0x03aaa352},
-       {0x0000b2e0, 0x0000f000, 0x0000f000, 0x03ccc584, 0x03ccc584},
-       {0x0000b2e4, 0x01ff0000, 0x01ff0000, 0x03f0f800, 0x03f0f800},
-       {0x0000b2e8, 0x00000000, 0x00000000, 0x03ff0000, 0x03ff0000},
-       {0x00016044, 0x056d82e4, 0x056d82e4, 0x056d82e4, 0x056d82e4},
-       {0x00016048, 0x8db49060, 0x8db49060, 0x8db49060, 0x8db49060},
-       {0x00016444, 0x056d82e4, 0x056d82e4, 0x056d82e4, 0x056d82e4},
-       {0x00016448, 0x8db49000, 0x8db49000, 0x8db49000, 0x8db49000},
-};
-
-static const u32 ar9462_common_wo_xlna_rx_gain_table_1p0[][2] = {
-       /* Addr      allmodes  */
-       {0x0000a000, 0x00010000},
-       {0x0000a004, 0x00030002},
-       {0x0000a008, 0x00050004},
-       {0x0000a00c, 0x00810080},
-       {0x0000a010, 0x00830082},
-       {0x0000a014, 0x01810180},
-       {0x0000a018, 0x01830182},
-       {0x0000a01c, 0x01850184},
-       {0x0000a020, 0x01890188},
-       {0x0000a024, 0x018b018a},
-       {0x0000a028, 0x018d018c},
-       {0x0000a02c, 0x03820190},
-       {0x0000a030, 0x03840383},
-       {0x0000a034, 0x03880385},
-       {0x0000a038, 0x038a0389},
-       {0x0000a03c, 0x038c038b},
-       {0x0000a040, 0x0390038d},
-       {0x0000a044, 0x03920391},
-       {0x0000a048, 0x03940393},
-       {0x0000a04c, 0x03960395},
-       {0x0000a050, 0x00000000},
-       {0x0000a054, 0x00000000},
-       {0x0000a058, 0x00000000},
-       {0x0000a05c, 0x00000000},
-       {0x0000a060, 0x00000000},
-       {0x0000a064, 0x00000000},
-       {0x0000a068, 0x00000000},
-       {0x0000a06c, 0x00000000},
-       {0x0000a070, 0x00000000},
-       {0x0000a074, 0x00000000},
-       {0x0000a078, 0x00000000},
-       {0x0000a07c, 0x00000000},
-       {0x0000a080, 0x29292929},
-       {0x0000a084, 0x29292929},
-       {0x0000a088, 0x29292929},
-       {0x0000a08c, 0x29292929},
-       {0x0000a090, 0x22292929},
-       {0x0000a094, 0x1d1d2222},
-       {0x0000a098, 0x0c111117},
-       {0x0000a09c, 0x00030303},
-       {0x0000a0a0, 0x00000000},
-       {0x0000a0a4, 0x00000000},
-       {0x0000a0a8, 0x00000000},
-       {0x0000a0ac, 0x00000000},
-       {0x0000a0b0, 0x00000000},
-       {0x0000a0b4, 0x00000000},
-       {0x0000a0b8, 0x00000000},
-       {0x0000a0bc, 0x00000000},
-       {0x0000a0c0, 0x001f0000},
-       {0x0000a0c4, 0x01000101},
-       {0x0000a0c8, 0x011e011f},
-       {0x0000a0cc, 0x011c011d},
-       {0x0000a0d0, 0x02030204},
-       {0x0000a0d4, 0x02010202},
-       {0x0000a0d8, 0x021f0200},
-       {0x0000a0dc, 0x0302021e},
-       {0x0000a0e0, 0x03000301},
-       {0x0000a0e4, 0x031e031f},
-       {0x0000a0e8, 0x0402031d},
-       {0x0000a0ec, 0x04000401},
-       {0x0000a0f0, 0x041e041f},
-       {0x0000a0f4, 0x0502041d},
-       {0x0000a0f8, 0x05000501},
-       {0x0000a0fc, 0x051e051f},
-       {0x0000a100, 0x06010602},
-       {0x0000a104, 0x061f0600},
-       {0x0000a108, 0x061d061e},
-       {0x0000a10c, 0x07020703},
-       {0x0000a110, 0x07000701},
-       {0x0000a114, 0x00000000},
-       {0x0000a118, 0x00000000},
-       {0x0000a11c, 0x00000000},
-       {0x0000a120, 0x00000000},
-       {0x0000a124, 0x00000000},
-       {0x0000a128, 0x00000000},
-       {0x0000a12c, 0x00000000},
-       {0x0000a130, 0x00000000},
-       {0x0000a134, 0x00000000},
-       {0x0000a138, 0x00000000},
-       {0x0000a13c, 0x00000000},
-       {0x0000a140, 0x001f0000},
-       {0x0000a144, 0x01000101},
-       {0x0000a148, 0x011e011f},
-       {0x0000a14c, 0x011c011d},
-       {0x0000a150, 0x02030204},
-       {0x0000a154, 0x02010202},
-       {0x0000a158, 0x021f0200},
-       {0x0000a15c, 0x0302021e},
-       {0x0000a160, 0x03000301},
-       {0x0000a164, 0x031e031f},
-       {0x0000a168, 0x0402031d},
-       {0x0000a16c, 0x04000401},
-       {0x0000a170, 0x041e041f},
-       {0x0000a174, 0x0502041d},
-       {0x0000a178, 0x05000501},
-       {0x0000a17c, 0x051e051f},
-       {0x0000a180, 0x06010602},
-       {0x0000a184, 0x061f0600},
-       {0x0000a188, 0x061d061e},
-       {0x0000a18c, 0x07020703},
-       {0x0000a190, 0x07000701},
-       {0x0000a194, 0x00000000},
-       {0x0000a198, 0x00000000},
-       {0x0000a19c, 0x00000000},
-       {0x0000a1a0, 0x00000000},
-       {0x0000a1a4, 0x00000000},
-       {0x0000a1a8, 0x00000000},
-       {0x0000a1ac, 0x00000000},
-       {0x0000a1b0, 0x00000000},
-       {0x0000a1b4, 0x00000000},
-       {0x0000a1b8, 0x00000000},
-       {0x0000a1bc, 0x00000000},
-       {0x0000a1c0, 0x00000000},
-       {0x0000a1c4, 0x00000000},
-       {0x0000a1c8, 0x00000000},
-       {0x0000a1cc, 0x00000000},
-       {0x0000a1d0, 0x00000000},
-       {0x0000a1d4, 0x00000000},
-       {0x0000a1d8, 0x00000000},
-       {0x0000a1dc, 0x00000000},
-       {0x0000a1e0, 0x00000000},
-       {0x0000a1e4, 0x00000000},
-       {0x0000a1e8, 0x00000000},
-       {0x0000a1ec, 0x00000000},
-       {0x0000a1f0, 0x00000396},
-       {0x0000a1f4, 0x00000396},
-       {0x0000a1f8, 0x00000396},
-       {0x0000a1fc, 0x00000196},
-       {0x0000b000, 0x00010000},
-       {0x0000b004, 0x00030002},
-       {0x0000b008, 0x00050004},
-       {0x0000b00c, 0x00810080},
-       {0x0000b010, 0x00830082},
-       {0x0000b014, 0x01810180},
-       {0x0000b018, 0x01830182},
-       {0x0000b01c, 0x01850184},
-       {0x0000b020, 0x02810280},
-       {0x0000b024, 0x02830282},
-       {0x0000b028, 0x02850284},
-       {0x0000b02c, 0x02890288},
-       {0x0000b030, 0x028b028a},
-       {0x0000b034, 0x0388028c},
-       {0x0000b038, 0x038a0389},
-       {0x0000b03c, 0x038c038b},
-       {0x0000b040, 0x0390038d},
-       {0x0000b044, 0x03920391},
-       {0x0000b048, 0x03940393},
-       {0x0000b04c, 0x03960395},
-       {0x0000b050, 0x00000000},
-       {0x0000b054, 0x00000000},
-       {0x0000b058, 0x00000000},
-       {0x0000b05c, 0x00000000},
-       {0x0000b060, 0x00000000},
-       {0x0000b064, 0x00000000},
-       {0x0000b068, 0x00000000},
-       {0x0000b06c, 0x00000000},
-       {0x0000b070, 0x00000000},
-       {0x0000b074, 0x00000000},
-       {0x0000b078, 0x00000000},
-       {0x0000b07c, 0x00000000},
-       {0x0000b080, 0x32323232},
-       {0x0000b084, 0x2f2f3232},
-       {0x0000b088, 0x23282a2d},
-       {0x0000b08c, 0x1c1e2123},
-       {0x0000b090, 0x14171919},
-       {0x0000b094, 0x0e0e1214},
-       {0x0000b098, 0x03050707},
-       {0x0000b09c, 0x00030303},
-       {0x0000b0a0, 0x00000000},
-       {0x0000b0a4, 0x00000000},
-       {0x0000b0a8, 0x00000000},
-       {0x0000b0ac, 0x00000000},
-       {0x0000b0b0, 0x00000000},
-       {0x0000b0b4, 0x00000000},
-       {0x0000b0b8, 0x00000000},
-       {0x0000b0bc, 0x00000000},
-       {0x0000b0c0, 0x003f0020},
-       {0x0000b0c4, 0x00400041},
-       {0x0000b0c8, 0x0140005f},
-       {0x0000b0cc, 0x0160015f},
-       {0x0000b0d0, 0x017e017f},
-       {0x0000b0d4, 0x02410242},
-       {0x0000b0d8, 0x025f0240},
-       {0x0000b0dc, 0x027f0260},
-       {0x0000b0e0, 0x0341027e},
-       {0x0000b0e4, 0x035f0340},
-       {0x0000b0e8, 0x037f0360},
-       {0x0000b0ec, 0x04400441},
-       {0x0000b0f0, 0x0460045f},
-       {0x0000b0f4, 0x0541047f},
-       {0x0000b0f8, 0x055f0540},
-       {0x0000b0fc, 0x057f0560},
-       {0x0000b100, 0x06400641},
-       {0x0000b104, 0x0660065f},
-       {0x0000b108, 0x067e067f},
-       {0x0000b10c, 0x07410742},
-       {0x0000b110, 0x075f0740},
-       {0x0000b114, 0x077f0760},
-       {0x0000b118, 0x07800781},
-       {0x0000b11c, 0x07a0079f},
-       {0x0000b120, 0x07c107bf},
-       {0x0000b124, 0x000007c0},
-       {0x0000b128, 0x00000000},
-       {0x0000b12c, 0x00000000},
-       {0x0000b130, 0x00000000},
-       {0x0000b134, 0x00000000},
-       {0x0000b138, 0x00000000},
-       {0x0000b13c, 0x00000000},
-       {0x0000b140, 0x003f0020},
-       {0x0000b144, 0x00400041},
-       {0x0000b148, 0x0140005f},
-       {0x0000b14c, 0x0160015f},
-       {0x0000b150, 0x017e017f},
-       {0x0000b154, 0x02410242},
-       {0x0000b158, 0x025f0240},
-       {0x0000b15c, 0x027f0260},
-       {0x0000b160, 0x0341027e},
-       {0x0000b164, 0x035f0340},
-       {0x0000b168, 0x037f0360},
-       {0x0000b16c, 0x04400441},
-       {0x0000b170, 0x0460045f},
-       {0x0000b174, 0x0541047f},
-       {0x0000b178, 0x055f0540},
-       {0x0000b17c, 0x057f0560},
-       {0x0000b180, 0x06400641},
-       {0x0000b184, 0x0660065f},
-       {0x0000b188, 0x067e067f},
-       {0x0000b18c, 0x07410742},
-       {0x0000b190, 0x075f0740},
-       {0x0000b194, 0x077f0760},
-       {0x0000b198, 0x07800781},
-       {0x0000b19c, 0x07a0079f},
-       {0x0000b1a0, 0x07c107bf},
-       {0x0000b1a4, 0x000007c0},
-       {0x0000b1a8, 0x00000000},
-       {0x0000b1ac, 0x00000000},
-       {0x0000b1b0, 0x00000000},
-       {0x0000b1b4, 0x00000000},
-       {0x0000b1b8, 0x00000000},
-       {0x0000b1bc, 0x00000000},
-       {0x0000b1c0, 0x00000000},
-       {0x0000b1c4, 0x00000000},
-       {0x0000b1c8, 0x00000000},
-       {0x0000b1cc, 0x00000000},
-       {0x0000b1d0, 0x00000000},
-       {0x0000b1d4, 0x00000000},
-       {0x0000b1d8, 0x00000000},
-       {0x0000b1dc, 0x00000000},
-       {0x0000b1e0, 0x00000000},
-       {0x0000b1e4, 0x00000000},
-       {0x0000b1e8, 0x00000000},
-       {0x0000b1ec, 0x00000000},
-       {0x0000b1f0, 0x00000396},
-       {0x0000b1f4, 0x00000396},
-       {0x0000b1f8, 0x00000396},
-       {0x0000b1fc, 0x00000196},
-};
-
-static const u32 ar9462_1p0_mac_postamble[][5] = {
-       /* Addr      5G_HT20     5G_HT40     2G_HT40     2G_HT20   */
-       {0x00001030, 0x00000230, 0x00000460, 0x000002c0, 0x00000160},
-       {0x00001070, 0x00000168, 0x000002d0, 0x00000318, 0x0000018c},
-       {0x000010b0, 0x00000e60, 0x00001cc0, 0x00007c70, 0x00003e38},
-       {0x00008014, 0x03e803e8, 0x07d007d0, 0x10801600, 0x08400b00},
-       {0x0000801c, 0x128d8027, 0x128d804f, 0x12e00057, 0x12e0002b},
-       {0x00008120, 0x08f04800, 0x08f04800, 0x08f04810, 0x08f04810},
-       {0x000081d0, 0x00003210, 0x00003210, 0x0000320a, 0x0000320a},
-       {0x00008318, 0x00003e80, 0x00007d00, 0x00006880, 0x00003440},
-};
-
-static const u32 ar9462_1p0_mac_postamble_emulation[][5] = {
-       /* Addr      5G_HT20     5G_HT40     2G_HT40     2G_HT20   */
-       {0x00008014, 0x10f810f8, 0x10f810f8, 0x10f810f8, 0x10f810f8},
-       {0x0000801c, 0x0e8d8017, 0x0e8d8017, 0x0e8d8017, 0x0e8d8017},
-};
-
-static const u32 ar9462_1p0_tx_gain_table_baseband_postamble_emulation[][5] = {
-       /* Addr      5G_HT20     5G_HT40     2G_HT40     2G_HT20   */
-       {0x0000a410, 0x000000d5, 0x000000d5, 0x000000d5, 0x000000d5},
-       {0x0000a500, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
-       {0x0000a504, 0x00004002, 0x00004002, 0x00004002, 0x00004002},
-       {0x0000a508, 0x00008004, 0x00008004, 0x00008004, 0x00008004},
-       {0x0000a510, 0x0001000c, 0x0001000c, 0x0001000c, 0x0001000c},
-       {0x0000a514, 0x0001420b, 0x0001420b, 0x0001420b, 0x0001420b},
-       {0x0000a518, 0x0001824a, 0x0001824a, 0x0001824a, 0x0001824a},
-       {0x0000a51c, 0x0001c44a, 0x0001c44a, 0x0001c44a, 0x0001c44a},
-       {0x0000a520, 0x0002064a, 0x0002064a, 0x0002064a, 0x0002064a},
-       {0x0000a524, 0x0002484a, 0x0002484a, 0x0002484a, 0x0002484a},
-       {0x0000a528, 0x00028a4a, 0x00028a4a, 0x00028a4a, 0x00028a4a},
-       {0x0000a52c, 0x0002cc4a, 0x0002cc4a, 0x0002cc4a, 0x0002cc4a},
-       {0x0000a530, 0x00030e4a, 0x00030e4a, 0x00030e4a, 0x00030e4a},
-       {0x0000a534, 0x00034e8a, 0x00034e8a, 0x00034e8a, 0x00034e8a},
-};
-
-static const u32 ar9462_1p0_radio_postamble[][5] = {
-       /* Addr      5G_HT20     5G_HT40     2G_HT40     2G_HT20   */
-       {0x0001609c, 0x0b8ee524, 0x0b8ee524, 0x0b8ee524, 0x0b8ee524},
-       {0x000160ac, 0xa4646c08, 0xa4646c08, 0x24646c08, 0x24646c08},
-       {0x000160b0, 0x01d67f70, 0x01d67f70, 0x01d67f70, 0x01d67f70},
-       {0x0001610c, 0x48000000, 0x40000000, 0x40000000, 0x40000000},
-       {0x00016140, 0x10804008, 0x10804008, 0x50804008, 0x50804008},
-       {0x0001650c, 0x48000000, 0x40000000, 0x40000000, 0x40000000},
-       {0x00016540, 0x10804008, 0x10804008, 0x50804008, 0x50804008},
-};
-
-static const u32 ar9462_1p0_soc_postamble_emulation[][5] = {
-       /* Addr      5G_HT20     5G_HT40     2G_HT40     2G_HT20   */
-       {0x00007010, 0x00001133, 0x00001133, 0x00001133, 0x00001133},
-};
-
-static const u32 ar9462_1p0_baseband_core[][2] = {
-       /* Addr      allmodes  */
-       {0x00009800, 0xafe68e30},
-       {0x00009804, 0xfd14e000},
-       {0x00009808, 0x9c0a9f6b},
-       {0x0000980c, 0x04900000},
-       {0x00009814, 0x9280c00a},
-       {0x00009818, 0x00000000},
-       {0x0000981c, 0x00020028},
-       {0x00009834, 0x6400a290},
-       {0x00009838, 0x0108ecff},
-       {0x0000983c, 0x0d000600},
-       {0x00009880, 0x201fff00},
-       {0x00009884, 0x00001042},
-       {0x000098a4, 0x00200400},
-       {0x000098b0, 0x32840bbe},
-       {0x000098d0, 0x004b6a8e},
-       {0x000098d4, 0x00000820},
-       {0x000098dc, 0x00000000},
-       {0x000098e4, 0x01ffffff},
-       {0x000098e8, 0x01ffffff},
-       {0x000098ec, 0x01ffffff},
-       {0x000098f0, 0x00000000},
-       {0x000098f4, 0x00000000},
-       {0x00009c04, 0xff55ff55},
-       {0x00009c08, 0x0320ff55},
-       {0x00009c0c, 0x00000000},
-       {0x00009c10, 0x00000000},
-       {0x00009c14, 0x00046384},
-       {0x00009c18, 0x05b6b440},
-       {0x00009c1c, 0x00b6b440},
-       {0x00009d00, 0xc080a333},
-       {0x00009d04, 0x40206c10},
-       {0x00009d08, 0x009c4060},
-       {0x00009d0c, 0x9883800a},
-       {0x00009d10, 0x01834061},
-       {0x00009d14, 0x00c0040b},
-       {0x00009d18, 0x00000000},
-       {0x00009e08, 0x0038230c},
-       {0x00009e24, 0x990bb514},
-       {0x00009e28, 0x0c6f0000},
-       {0x00009e30, 0x06336f77},
-       {0x00009e34, 0x6af6532f},
-       {0x00009e38, 0x0cc80c00},
-       {0x00009e40, 0x0d261820},
-       {0x00009e4c, 0x00001004},
-       {0x00009e50, 0x00ff03f1},
-       {0x00009e54, 0x64c355c7},
-       {0x00009e58, 0xfd897735},
-       {0x00009e5c, 0xe9198724},
-       {0x00009fc0, 0x803e4788},
-       {0x00009fc4, 0x0001efb5},
-       {0x00009fcc, 0x40000014},
-       {0x00009fd0, 0x01193b93},
-       {0x0000a20c, 0x00000000},
-       {0x0000a220, 0x00000000},
-       {0x0000a224, 0x00000000},
-       {0x0000a228, 0x10002310},
-       {0x0000a23c, 0x00000000},
-       {0x0000a244, 0x0c000000},
-       {0x0000a2a0, 0x00000001},
-       {0x0000a2c0, 0x00000001},
-       {0x0000a2c8, 0x00000000},
-       {0x0000a2cc, 0x18c43433},
-       {0x0000a2d4, 0x00000000},
-       {0x0000a2ec, 0x00000000},
-       {0x0000a2f0, 0x00000000},
-       {0x0000a2f4, 0x00000000},
-       {0x0000a2f8, 0x00000000},
-       {0x0000a344, 0x00000000},
-       {0x0000a34c, 0x00000000},
-       {0x0000a350, 0x0000a000},
-       {0x0000a364, 0x00000000},
-       {0x0000a370, 0x00000000},
-       {0x0000a390, 0x00000001},
-       {0x0000a394, 0x00000444},
-       {0x0000a398, 0x001f0e0f},
-       {0x0000a39c, 0x0075393f},
-       {0x0000a3a0, 0xb79f6427},
-       {0x0000a3a4, 0x00000000},
-       {0x0000a3a8, 0xaaaaaaaa},
-       {0x0000a3ac, 0x3c466478},
-       {0x0000a3c0, 0x20202020},
-       {0x0000a3c4, 0x22222220},
-       {0x0000a3c8, 0x20200020},
-       {0x0000a3cc, 0x20202020},
-       {0x0000a3d0, 0x20202020},
-       {0x0000a3d4, 0x20202020},
-       {0x0000a3d8, 0x20202020},
-       {0x0000a3dc, 0x20202020},
-       {0x0000a3e0, 0x20202020},
-       {0x0000a3e4, 0x20202020},
-       {0x0000a3e8, 0x20202020},
-       {0x0000a3ec, 0x20202020},
-       {0x0000a3f0, 0x00000000},
-       {0x0000a3f4, 0x00000006},
-       {0x0000a3f8, 0x0c9bd380},
-       {0x0000a3fc, 0x000f0f01},
-       {0x0000a400, 0x8fa91f01},
-       {0x0000a404, 0x00000000},
-       {0x0000a408, 0x0e79e5c6},
-       {0x0000a40c, 0x00820820},
-       {0x0000a414, 0x1ce739ce},
-       {0x0000a418, 0x2d001dce},
-       {0x0000a41c, 0x1ce739ce},
-       {0x0000a420, 0x000001ce},
-       {0x0000a424, 0x1ce739ce},
-       {0x0000a428, 0x000001ce},
-       {0x0000a42c, 0x1ce739ce},
-       {0x0000a430, 0x1ce739ce},
-       {0x0000a434, 0x00000000},
-       {0x0000a438, 0x00001801},
-       {0x0000a43c, 0x00100000},
-       {0x0000a440, 0x00000000},
-       {0x0000a444, 0x00000000},
-       {0x0000a448, 0x05000080},
-       {0x0000a44c, 0x00000001},
-       {0x0000a450, 0x00010000},
-       {0x0000a458, 0x00000000},
-       {0x0000a644, 0xbfad9d74},
-       {0x0000a648, 0x0048060a},
-       {0x0000a64c, 0x00003c37},
-       {0x0000a670, 0x03020100},
-       {0x0000a674, 0x09080504},
-       {0x0000a678, 0x0d0c0b0a},
-       {0x0000a67c, 0x13121110},
-       {0x0000a680, 0x31301514},
-       {0x0000a684, 0x35343332},
-       {0x0000a688, 0x00000036},
-       {0x0000a690, 0x00000838},
-       {0x0000a6b0, 0x0000000a},
-       {0x0000a6b4, 0x28f12c01},
-       {0x0000a7c0, 0x00000000},
-       {0x0000a7c4, 0xfffffffc},
-       {0x0000a7c8, 0x00000000},
-       {0x0000a7cc, 0x00000000},
-       {0x0000a7d0, 0x00000000},
-       {0x0000a7d4, 0x00000004},
-       {0x0000a7dc, 0x00000001},
-       {0x0000a8d0, 0x004b6a8e},
-       {0x0000a8d4, 0x00000820},
-       {0x0000a8dc, 0x00000000},
-       {0x0000a8f0, 0x00000000},
-       {0x0000a8f4, 0x00000000},
-       {0x0000b2d0, 0x00000080},
-       {0x0000b2d4, 0x00000000},
-       {0x0000b2ec, 0x00000000},
-       {0x0000b2f0, 0x00000000},
-       {0x0000b2f4, 0x00000000},
-       {0x0000b2f8, 0x00000000},
-       {0x0000b408, 0x0e79e5c0},
-       {0x0000b40c, 0x00820820},
-       {0x0000b420, 0x00000000},
-       {0x0000b6b0, 0x0000000a},
-       {0x0000b6b4, 0x00c00001},
-};
-
-static const u32 ar9462_1p0_baseband_postamble[][5] = {
-       /* Addr      5G_HT20     5G_HT40     2G_HT40     2G_HT20   */
-       {0x00009810, 0xd00a8005, 0xd00a8005, 0xd00a8011, 0xd00a8011},
-       {0x00009820, 0x206a022e, 0x206a022e, 0x206a012e, 0x206a012e},
-       {0x00009824, 0x5ac640d0, 0x5ac640d0, 0x5ac640d0, 0x5ac640d0},
-       {0x00009828, 0x06903081, 0x06903081, 0x06903881, 0x06903881},
-       {0x0000982c, 0x05eea6d4, 0x05eea6d4, 0x05eea6d4, 0x05eea6d4},
-       {0x00009830, 0x0000059c, 0x0000059c, 0x0000119c, 0x0000119c},
-       {0x00009c00, 0x000000c4, 0x000000c4, 0x000000c4, 0x000000c4},
-       {0x00009e00, 0x0372111a, 0x0372111a, 0x037216a0, 0x037216a0},
-       {0x00009e04, 0x001c2020, 0x001c2020, 0x001c2020, 0x001c2020},
-       {0x00009e0c, 0x6c4000e2, 0x6d4000e2, 0x6d4000e2, 0x6c4000e2},
-       {0x00009e10, 0x7ec88d2e, 0x7ec88d2e, 0x7ec84d2e, 0x7ec84d2e},
-       {0x00009e14, 0x37b95d5e, 0x37b9605e, 0x3379605e, 0x33795d5e},
-       {0x00009e18, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
-       {0x00009e1c, 0x0001cf9c, 0x0001cf9c, 0x00021f9c, 0x00021f9c},
-       {0x00009e20, 0x000003b5, 0x000003b5, 0x000003ce, 0x000003ce},
-       {0x00009e2c, 0x0000001c, 0x0000001c, 0x00000021, 0x00000021},
-       {0x00009e3c, 0xcf946220, 0xcf946220, 0xcfd5c782, 0xcfd5c782},
-       {0x00009e44, 0x02321e27, 0x02321e27, 0x02291e27, 0x02291e27},
-       {0x00009e48, 0x5030201a, 0x5030201a, 0x50302012, 0x50302012},
-       {0x00009fc8, 0x0003f000, 0x0003f000, 0x0001a000, 0x0001a000},
-       {0x0000a204, 0x0131b7c0, 0x0131b7c4, 0x0131b7c4, 0x0131b7c0},
-       {0x0000a208, 0x00000104, 0x00000104, 0x00000004, 0x00000004},
-       {0x0000a22c, 0x01026a2f, 0x01026a27, 0x01026a2f, 0x01026a2f},
-       {0x0000a230, 0x0000400a, 0x00004014, 0x00004016, 0x0000400b},
-       {0x0000a234, 0x00000fff, 0x10000fff, 0x10000fff, 0x00000fff},
-       {0x0000a238, 0xffb81018, 0xffb81018, 0xffb81018, 0xffb81018},
-       {0x0000a250, 0x00000000, 0x00000000, 0x00000210, 0x00000108},
-       {0x0000a254, 0x000007d0, 0x00000fa0, 0x00001130, 0x00000898},
-       {0x0000a258, 0x02020002, 0x02020002, 0x02020002, 0x02020002},
-       {0x0000a25c, 0x01000e0e, 0x01000e0e, 0x01000e0e, 0x01000e0e},
-       {0x0000a260, 0x0a021501, 0x0a021501, 0x3a021501, 0x3a021501},
-       {0x0000a264, 0x00000e0e, 0x00000e0e, 0x00000e0e, 0x00000e0e},
-       {0x0000a280, 0x00000007, 0x00000007, 0x0000000b, 0x0000000b},
-       {0x0000a284, 0x00000000, 0x00000000, 0x00000150, 0x00000150},
-       {0x0000a288, 0x00000110, 0x00000110, 0x00100110, 0x00100110},
-       {0x0000a28c, 0x00022222, 0x00022222, 0x00022222, 0x00022222},
-       {0x0000a2c4, 0x00158d18, 0x00158d18, 0x00158d18, 0x00158d18},
-       {0x0000a2d0, 0x00041981, 0x00041981, 0x00041981, 0x00041982},
-       {0x0000a2d8, 0x7999a83b, 0x7999a83b, 0x7999a83b, 0x7999a83b},
-       {0x0000a358, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
-       {0x0000a830, 0x0000019c, 0x0000019c, 0x0000019c, 0x0000019c},
-       {0x0000ae04, 0x001c0000, 0x001c0000, 0x001c0000, 0x00100000},
-       {0x0000ae18, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
-       {0x0000ae1c, 0x0000019c, 0x0000019c, 0x0000019c, 0x0000019c},
-       {0x0000ae20, 0x000001b5, 0x000001b5, 0x000001ce, 0x000001ce},
-       {0x0000b284, 0x00000000, 0x00000000, 0x00000550, 0x00000550},
-};
-
-static const u32 ar9462_modes_fast_clock_1p0[][3] = {
-       /* Addr      5G_HT20     5G_HT40   */
-       {0x00001030, 0x00000268, 0x000004d0},
-       {0x00001070, 0x0000018c, 0x00000318},
-       {0x000010b0, 0x00000fd0, 0x00001fa0},
-       {0x00008014, 0x044c044c, 0x08980898},
-       {0x0000801c, 0x148ec02b, 0x148ec057},
-       {0x00008318, 0x000044c0, 0x00008980},
-       {0x00009e00, 0x0372131c, 0x0372131c},
-       {0x0000a230, 0x0000400b, 0x00004016},
-       {0x0000a254, 0x00000898, 0x00001130},
-};
-
-static const u32 ar9462_modes_low_ob_db_tx_gain_table_1p0[][5] = {
-       /* Addr      5G_HT20     5G_HT40     2G_HT40     2G_HT20   */
-       {0x0000a2dc, 0x0380c7fc, 0x0380c7fc, 0x03aaa352, 0x03aaa352},
-       {0x0000a2e0, 0x0000f800, 0x0000f800, 0x03ccc584, 0x03ccc584},
-       {0x0000a2e4, 0x03ff0000, 0x03ff0000, 0x03f0f800, 0x03f0f800},
-       {0x0000a2e8, 0x00000000, 0x00000000, 0x03ff0000, 0x03ff0000},
-       {0x0000a410, 0x000050d9, 0x000050d9, 0x000050d9, 0x000050d9},
-       {0x0000a500, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
-       {0x0000a504, 0x06000003, 0x06000003, 0x04000002, 0x04000002},
-       {0x0000a508, 0x0a000020, 0x0a000020, 0x08000004, 0x08000004},
-       {0x0000a50c, 0x10000023, 0x10000023, 0x0b000200, 0x0b000200},
-       {0x0000a510, 0x16000220, 0x16000220, 0x0f000202, 0x0f000202},
-       {0x0000a514, 0x1c000223, 0x1c000223, 0x12000400, 0x12000400},
-       {0x0000a518, 0x21020220, 0x21020220, 0x16000402, 0x16000402},
-       {0x0000a51c, 0x27020223, 0x27020223, 0x19000404, 0x19000404},
-       {0x0000a520, 0x2b022220, 0x2b022220, 0x1c000603, 0x1c000603},
-       {0x0000a524, 0x2f022222, 0x2f022222, 0x21000a02, 0x21000a02},
-       {0x0000a528, 0x34022225, 0x34022225, 0x25000a04, 0x25000a04},
-       {0x0000a52c, 0x3a02222a, 0x3a02222a, 0x28000a20, 0x28000a20},
-       {0x0000a530, 0x3e02222c, 0x3e02222c, 0x2c000e20, 0x2c000e20},
-       {0x0000a534, 0x4202242a, 0x4202242a, 0x30000e22, 0x30000e22},
-       {0x0000a538, 0x4702244a, 0x4702244a, 0x34000e24, 0x34000e24},
-       {0x0000a53c, 0x4b02244c, 0x4b02244c, 0x38001640, 0x38001640},
-       {0x0000a540, 0x4e02246c, 0x4e02246c, 0x3c001660, 0x3c001660},
-       {0x0000a544, 0x5302266c, 0x5302266c, 0x3f001861, 0x3f001861},
-       {0x0000a548, 0x5702286c, 0x5702286c, 0x43001a81, 0x43001a81},
-       {0x0000a54c, 0x5c04286b, 0x5c04286b, 0x47001a83, 0x47001a83},
-       {0x0000a550, 0x61042a6c, 0x61042a6c, 0x4a001c84, 0x4a001c84},
-       {0x0000a554, 0x66062a6c, 0x66062a6c, 0x4e001ce3, 0x4e001ce3},
-       {0x0000a558, 0x6b062e6c, 0x6b062e6c, 0x52001ce5, 0x52001ce5},
-       {0x0000a55c, 0x7006308c, 0x7006308c, 0x56001ce9, 0x56001ce9},
-       {0x0000a560, 0x730a308a, 0x730a308a, 0x5a001ceb, 0x5a001ceb},
-       {0x0000a564, 0x770a308c, 0x770a308c, 0x5d001eec, 0x5d001eec},
-       {0x0000a568, 0x770a308c, 0x770a308c, 0x5d001eec, 0x5d001eec},
-       {0x0000a56c, 0x770a308c, 0x770a308c, 0x5d001eec, 0x5d001eec},
-       {0x0000a570, 0x770a308c, 0x770a308c, 0x5d001eec, 0x5d001eec},
-       {0x0000a574, 0x770a308c, 0x770a308c, 0x5d001eec, 0x5d001eec},
-       {0x0000a578, 0x770a308c, 0x770a308c, 0x5d001eec, 0x5d001eec},
-       {0x0000a57c, 0x770a308c, 0x770a308c, 0x5d001eec, 0x5d001eec},
-       {0x0000a600, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
-       {0x0000a604, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
-       {0x0000a608, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
-       {0x0000a60c, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
-       {0x0000a610, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
-       {0x0000a614, 0x01404000, 0x01404000, 0x01404000, 0x01404000},
-       {0x0000a618, 0x01404501, 0x01404501, 0x01404501, 0x01404501},
-       {0x0000a61c, 0x02008802, 0x02008802, 0x02008501, 0x02008501},
-       {0x0000a620, 0x0300cc03, 0x0300cc03, 0x0280ca03, 0x0280ca03},
-       {0x0000a624, 0x0300cc03, 0x0300cc03, 0x03010c04, 0x03010c04},
-       {0x0000a628, 0x0300cc03, 0x0300cc03, 0x04014c04, 0x04014c04},
-       {0x0000a62c, 0x03810c03, 0x03810c03, 0x04015005, 0x04015005},
-       {0x0000a630, 0x03810e04, 0x03810e04, 0x04015005, 0x04015005},
-       {0x0000a634, 0x03810e04, 0x03810e04, 0x04015005, 0x04015005},
-       {0x0000a638, 0x03810e04, 0x03810e04, 0x04015005, 0x04015005},
-       {0x0000a63c, 0x03810e04, 0x03810e04, 0x04015005, 0x04015005},
-       {0x0000b2dc, 0x0380c7fc, 0x0380c7fc, 0x03aaa352, 0x03aaa352},
-       {0x0000b2e0, 0x0000f800, 0x0000f800, 0x03ccc584, 0x03ccc584},
-       {0x0000b2e4, 0x03ff0000, 0x03ff0000, 0x03f0f800, 0x03f0f800},
-       {0x0000b2e8, 0x00000000, 0x00000000, 0x03ff0000, 0x03ff0000},
-       {0x00016044, 0x012482d4, 0x012482d4, 0x012482d4, 0x012482d4},
-       {0x00016048, 0x64992060, 0x64992060, 0x64992060, 0x64992060},
-       {0x00016444, 0x012482d4, 0x012482d4, 0x012482d4, 0x012482d4},
-       {0x00016448, 0x64992000, 0x64992000, 0x64992000, 0x64992000},
-};
-
-static const u32 ar9462_1p0_soc_postamble[][5] = {
-       /* Addr      5G_HT20     5G_HT40     2G_HT40     2G_HT20   */
-       {0x00007010, 0x00002233, 0x00002233, 0x00002233, 0x00002233},
-};
-
-static const u32 ar9462_common_mixed_rx_gain_table_1p0[][2] = {
-       /* Addr      allmodes  */
-       {0x0000a000, 0x00010000},
-       {0x0000a004, 0x00030002},
-       {0x0000a008, 0x00050004},
-       {0x0000a00c, 0x00810080},
-       {0x0000a010, 0x00830082},
-       {0x0000a014, 0x01810180},
-       {0x0000a018, 0x01830182},
-       {0x0000a01c, 0x01850184},
-       {0x0000a020, 0x01890188},
-       {0x0000a024, 0x018b018a},
-       {0x0000a028, 0x018d018c},
-       {0x0000a02c, 0x03820190},
-       {0x0000a030, 0x03840383},
-       {0x0000a034, 0x03880385},
-       {0x0000a038, 0x038a0389},
-       {0x0000a03c, 0x038c038b},
-       {0x0000a040, 0x0390038d},
-       {0x0000a044, 0x03920391},
-       {0x0000a048, 0x03940393},
-       {0x0000a04c, 0x03960395},
-       {0x0000a050, 0x00000000},
-       {0x0000a054, 0x00000000},
-       {0x0000a058, 0x00000000},
-       {0x0000a05c, 0x00000000},
-       {0x0000a060, 0x00000000},
-       {0x0000a064, 0x00000000},
-       {0x0000a068, 0x00000000},
-       {0x0000a06c, 0x00000000},
-       {0x0000a070, 0x00000000},
-       {0x0000a074, 0x00000000},
-       {0x0000a078, 0x00000000},
-       {0x0000a07c, 0x00000000},
-       {0x0000a080, 0x29292929},
-       {0x0000a084, 0x29292929},
-       {0x0000a088, 0x29292929},
-       {0x0000a08c, 0x29292929},
-       {0x0000a090, 0x22292929},
-       {0x0000a094, 0x1d1d2222},
-       {0x0000a098, 0x0c111117},
-       {0x0000a09c, 0x00030303},
-       {0x0000a0a0, 0x00000000},
-       {0x0000a0a4, 0x00000000},
-       {0x0000a0a8, 0x00000000},
-       {0x0000a0ac, 0x00000000},
-       {0x0000a0b0, 0x00000000},
-       {0x0000a0b4, 0x00000000},
-       {0x0000a0b8, 0x00000000},
-       {0x0000a0bc, 0x00000000},
-       {0x0000a0c0, 0x001f0000},
-       {0x0000a0c4, 0x01000101},
-       {0x0000a0c8, 0x011e011f},
-       {0x0000a0cc, 0x011c011d},
-       {0x0000a0d0, 0x02030204},
-       {0x0000a0d4, 0x02010202},
-       {0x0000a0d8, 0x021f0200},
-       {0x0000a0dc, 0x0302021e},
-       {0x0000a0e0, 0x03000301},
-       {0x0000a0e4, 0x031e031f},
-       {0x0000a0e8, 0x0402031d},
-       {0x0000a0ec, 0x04000401},
-       {0x0000a0f0, 0x041e041f},
-       {0x0000a0f4, 0x0502041d},
-       {0x0000a0f8, 0x05000501},
-       {0x0000a0fc, 0x051e051f},
-       {0x0000a100, 0x06010602},
-       {0x0000a104, 0x061f0600},
-       {0x0000a108, 0x061d061e},
-       {0x0000a10c, 0x07020703},
-       {0x0000a110, 0x07000701},
-       {0x0000a114, 0x00000000},
-       {0x0000a118, 0x00000000},
-       {0x0000a11c, 0x00000000},
-       {0x0000a120, 0x00000000},
-       {0x0000a124, 0x00000000},
-       {0x0000a128, 0x00000000},
-       {0x0000a12c, 0x00000000},
-       {0x0000a130, 0x00000000},
-       {0x0000a134, 0x00000000},
-       {0x0000a138, 0x00000000},
-       {0x0000a13c, 0x00000000},
-       {0x0000a140, 0x001f0000},
-       {0x0000a144, 0x01000101},
-       {0x0000a148, 0x011e011f},
-       {0x0000a14c, 0x011c011d},
-       {0x0000a150, 0x02030204},
-       {0x0000a154, 0x02010202},
-       {0x0000a158, 0x021f0200},
-       {0x0000a15c, 0x0302021e},
-       {0x0000a160, 0x03000301},
-       {0x0000a164, 0x031e031f},
-       {0x0000a168, 0x0402031d},
-       {0x0000a16c, 0x04000401},
-       {0x0000a170, 0x041e041f},
-       {0x0000a174, 0x0502041d},
-       {0x0000a178, 0x05000501},
-       {0x0000a17c, 0x051e051f},
-       {0x0000a180, 0x06010602},
-       {0x0000a184, 0x061f0600},
-       {0x0000a188, 0x061d061e},
-       {0x0000a18c, 0x07020703},
-       {0x0000a190, 0x07000701},
-       {0x0000a194, 0x00000000},
-       {0x0000a198, 0x00000000},
-       {0x0000a19c, 0x00000000},
-       {0x0000a1a0, 0x00000000},
-       {0x0000a1a4, 0x00000000},
-       {0x0000a1a8, 0x00000000},
-       {0x0000a1ac, 0x00000000},
-       {0x0000a1b0, 0x00000000},
-       {0x0000a1b4, 0x00000000},
-       {0x0000a1b8, 0x00000000},
-       {0x0000a1bc, 0x00000000},
-       {0x0000a1c0, 0x00000000},
-       {0x0000a1c4, 0x00000000},
-       {0x0000a1c8, 0x00000000},
-       {0x0000a1cc, 0x00000000},
-       {0x0000a1d0, 0x00000000},
-       {0x0000a1d4, 0x00000000},
-       {0x0000a1d8, 0x00000000},
-       {0x0000a1dc, 0x00000000},
-       {0x0000a1e0, 0x00000000},
-       {0x0000a1e4, 0x00000000},
-       {0x0000a1e8, 0x00000000},
-       {0x0000a1ec, 0x00000000},
-       {0x0000a1f0, 0x00000396},
-       {0x0000a1f4, 0x00000396},
-       {0x0000a1f8, 0x00000396},
-       {0x0000a1fc, 0x00000196},
-       {0x0000b000, 0x00010000},
-       {0x0000b004, 0x00030002},
-       {0x0000b008, 0x00050004},
-       {0x0000b00c, 0x00810080},
-       {0x0000b010, 0x00830082},
-       {0x0000b014, 0x01810180},
-       {0x0000b018, 0x01830182},
-       {0x0000b01c, 0x01850184},
-       {0x0000b020, 0x02810280},
-       {0x0000b024, 0x02830282},
-       {0x0000b028, 0x02850284},
-       {0x0000b02c, 0x02890288},
-       {0x0000b030, 0x028b028a},
-       {0x0000b034, 0x0388028c},
-       {0x0000b038, 0x038a0389},
-       {0x0000b03c, 0x038c038b},
-       {0x0000b040, 0x0390038d},
-       {0x0000b044, 0x03920391},
-       {0x0000b048, 0x03940393},
-       {0x0000b04c, 0x03960395},
-       {0x0000b050, 0x00000000},
-       {0x0000b054, 0x00000000},
-       {0x0000b058, 0x00000000},
-       {0x0000b05c, 0x00000000},
-       {0x0000b060, 0x00000000},
-       {0x0000b064, 0x00000000},
-       {0x0000b068, 0x00000000},
-       {0x0000b06c, 0x00000000},
-       {0x0000b070, 0x00000000},
-       {0x0000b074, 0x00000000},
-       {0x0000b078, 0x00000000},
-       {0x0000b07c, 0x00000000},
-       {0x0000b080, 0x2a2d2f32},
-       {0x0000b084, 0x21232328},
-       {0x0000b088, 0x19191c1e},
-       {0x0000b08c, 0x12141417},
-       {0x0000b090, 0x07070e0e},
-       {0x0000b094, 0x03030305},
-       {0x0000b098, 0x00000003},
-       {0x0000b09c, 0x00000000},
-       {0x0000b0a0, 0x00000000},
-       {0x0000b0a4, 0x00000000},
-       {0x0000b0a8, 0x00000000},
-       {0x0000b0ac, 0x00000000},
-       {0x0000b0b0, 0x00000000},
-       {0x0000b0b4, 0x00000000},
-       {0x0000b0b8, 0x00000000},
-       {0x0000b0bc, 0x00000000},
-       {0x0000b0c0, 0x003f0020},
-       {0x0000b0c4, 0x00400041},
-       {0x0000b0c8, 0x0140005f},
-       {0x0000b0cc, 0x0160015f},
-       {0x0000b0d0, 0x017e017f},
-       {0x0000b0d4, 0x02410242},
-       {0x0000b0d8, 0x025f0240},
-       {0x0000b0dc, 0x027f0260},
-       {0x0000b0e0, 0x0341027e},
-       {0x0000b0e4, 0x035f0340},
-       {0x0000b0e8, 0x037f0360},
-       {0x0000b0ec, 0x04400441},
-       {0x0000b0f0, 0x0460045f},
-       {0x0000b0f4, 0x0541047f},
-       {0x0000b0f8, 0x055f0540},
-       {0x0000b0fc, 0x057f0560},
-       {0x0000b100, 0x06400641},
-       {0x0000b104, 0x0660065f},
-       {0x0000b108, 0x067e067f},
-       {0x0000b10c, 0x07410742},
-       {0x0000b110, 0x075f0740},
-       {0x0000b114, 0x077f0760},
-       {0x0000b118, 0x07800781},
-       {0x0000b11c, 0x07a0079f},
-       {0x0000b120, 0x07c107bf},
-       {0x0000b124, 0x000007c0},
-       {0x0000b128, 0x00000000},
-       {0x0000b12c, 0x00000000},
-       {0x0000b130, 0x00000000},
-       {0x0000b134, 0x00000000},
-       {0x0000b138, 0x00000000},
-       {0x0000b13c, 0x00000000},
-       {0x0000b140, 0x003f0020},
-       {0x0000b144, 0x00400041},
-       {0x0000b148, 0x0140005f},
-       {0x0000b14c, 0x0160015f},
-       {0x0000b150, 0x017e017f},
-       {0x0000b154, 0x02410242},
-       {0x0000b158, 0x025f0240},
-       {0x0000b15c, 0x027f0260},
-       {0x0000b160, 0x0341027e},
-       {0x0000b164, 0x035f0340},
-       {0x0000b168, 0x037f0360},
-       {0x0000b16c, 0x04400441},
-       {0x0000b170, 0x0460045f},
-       {0x0000b174, 0x0541047f},
-       {0x0000b178, 0x055f0540},
-       {0x0000b17c, 0x057f0560},
-       {0x0000b180, 0x06400641},
-       {0x0000b184, 0x0660065f},
-       {0x0000b188, 0x067e067f},
-       {0x0000b18c, 0x07410742},
-       {0x0000b190, 0x075f0740},
-       {0x0000b194, 0x077f0760},
-       {0x0000b198, 0x07800781},
-       {0x0000b19c, 0x07a0079f},
-       {0x0000b1a0, 0x07c107bf},
-       {0x0000b1a4, 0x000007c0},
-       {0x0000b1a8, 0x00000000},
-       {0x0000b1ac, 0x00000000},
-       {0x0000b1b0, 0x00000000},
-       {0x0000b1b4, 0x00000000},
-       {0x0000b1b8, 0x00000000},
-       {0x0000b1bc, 0x00000000},
-       {0x0000b1c0, 0x00000000},
-       {0x0000b1c4, 0x00000000},
-       {0x0000b1c8, 0x00000000},
-       {0x0000b1cc, 0x00000000},
-       {0x0000b1d0, 0x00000000},
-       {0x0000b1d4, 0x00000000},
-       {0x0000b1d8, 0x00000000},
-       {0x0000b1dc, 0x00000000},
-       {0x0000b1e0, 0x00000000},
-       {0x0000b1e4, 0x00000000},
-       {0x0000b1e8, 0x00000000},
-       {0x0000b1ec, 0x00000000},
-       {0x0000b1f0, 0x00000396},
-       {0x0000b1f4, 0x00000396},
-       {0x0000b1f8, 0x00000396},
-       {0x0000b1fc, 0x00000196},
-};
-
-static const u32 ar9462_pcie_phy_clkreq_disable_L1_1p0[][2] = {
-       /* Addr      allmodes  */
-       {0x00018c00, 0x10013e5e},
-       {0x00018c04, 0x000801d8},
-       {0x00018c08, 0x0000580c},
-};
-
-static const u32 ar9462_1p0_baseband_core_emulation[][2] = {
-       /* Addr      allmodes  */
-       {0x00009800, 0xafa68e30},
-       {0x00009884, 0x00002842},
-       {0x00009c04, 0xff55ff55},
-       {0x00009c08, 0x0320ff55},
-       {0x00009e50, 0x00000000},
-       {0x00009fcc, 0x00000014},
-       {0x0000a344, 0x00000010},
-       {0x0000a398, 0x00000000},
-       {0x0000a39c, 0x71733d01},
-       {0x0000a3a0, 0xd0ad5c12},
-       {0x0000a3c0, 0x22222220},
-       {0x0000a3c4, 0x22222222},
-       {0x0000a404, 0x00418a11},
-       {0x0000a418, 0x050001ce},
-       {0x0000a438, 0x00001800},
-       {0x0000a458, 0x01444452},
-       {0x0000a644, 0x3fad9d74},
-       {0x0000a690, 0x00000038},
-};
-
-static const u32 ar9462_1p0_radio_core[][2] = {
-       /* Addr      allmodes  */
-       {0x00016000, 0x36db6db6},
-       {0x00016004, 0x6db6db40},
-       {0x00016008, 0x73f00000},
-       {0x0001600c, 0x00000000},
-       {0x00016010, 0x6d820001},
-       {0x00016040, 0x7f80fff8},
-       {0x0001604c, 0x2699e04f},
-       {0x00016050, 0x6db6db6c},
-       {0x00016054, 0x6db60000},
-       {0x00016058, 0x6c200000},
-       {0x00016080, 0x00040000},
-       {0x00016084, 0x9a68048c},
-       {0x00016088, 0x54214514},
-       {0x0001608c, 0x12030409},
-       {0x00016090, 0x24926490},
-       {0x00016098, 0xd2888888},
-       {0x000160a0, 0x0a108ffe},
-       {0x000160a4, 0x812fc490},
-       {0x000160a8, 0x423c8000},
-       {0x000160b4, 0x92000000},
-       {0x000160b8, 0x0285dddc},
-       {0x000160bc, 0x02908888},
-       {0x000160c0, 0x00adb6d0},
-       {0x000160c4, 0x6db6db60},
-       {0x000160c8, 0x6db6db6c},
-       {0x000160cc, 0x0de6c1b0},
-       {0x00016100, 0x3fffbe04},
-       {0x00016104, 0xfff80000},
-       {0x00016108, 0x00200400},
-       {0x00016110, 0x00000000},
-       {0x00016144, 0x02084080},
-       {0x00016148, 0x000080c0},
-       {0x00016280, 0x050a0001},
-       {0x00016284, 0x3d841400},
-       {0x00016288, 0x00000000},
-       {0x0001628c, 0xe3000000},
-       {0x00016290, 0xa1005080},
-       {0x00016294, 0x00000020},
-       {0x00016298, 0x50a02900},
-       {0x00016340, 0x121e4276},
-       {0x00016344, 0x00300000},
-       {0x00016400, 0x36db6db6},
-       {0x00016404, 0x6db6db40},
-       {0x00016408, 0x73f00000},
-       {0x0001640c, 0x00000000},
-       {0x00016410, 0x6c800001},
-       {0x00016440, 0x7f80fff8},
-       {0x0001644c, 0x4699e04f},
-       {0x00016450, 0x6db6db6c},
-       {0x00016454, 0x6db60000},
-       {0x00016500, 0x3fffbe04},
-       {0x00016504, 0xfff80000},
-       {0x00016508, 0x00200400},
-       {0x00016510, 0x00000000},
-       {0x00016544, 0x02084080},
-       {0x00016548, 0x000080c0},
-};
-
-static const u32 ar9462_1p0_soc_preamble[][2] = {
-       /* Addr      allmodes  */
-       {0x00007020, 0x00000000},
-       {0x00007034, 0x00000002},
-       {0x00007038, 0x000004c2},
-};
-
-static const u32 ar9462_1p0_sys2ant[][2] = {
-       /* Addr      allmodes  */
-       {0x00063120, 0x00801980},
-};
-
-#endif /* INITVALS_9462_1P0_H */
index dc2054f..b6ba1e8 100644 (file)
@@ -98,14 +98,6 @@ static const u32 ar9462_2p0_baseband_postamble[][5] = {
        {0x0000b284, 0x00000000, 0x00000000, 0x00000550, 0x00000550},
 };
 
-static const u32 ar9462_2p0_mac_core_emulation[][2] = {
-       /* Addr      allmodes  */
-       {0x00000030, 0x000e0085},
-       {0x00000044, 0x00000008},
-       {0x0000805c, 0xffffc7ff},
-       {0x00008344, 0xaa4a105b},
-};
-
 static const u32 ar9462_common_rx_gain_table_2p0[][2] = {
        /* Addr      allmodes  */
        {0x0000a000, 0x00010000},
@@ -380,349 +372,6 @@ static const u32 ar9462_pciephy_pll_on_clkreq_disable_L1_2p0[][2] = {
        {0x00018c08, 0x0003580c},
 };
 
-static const u32 ar9462_2p0_sys3ant[][2] = {
-       /* Addr      allmodes  */
-       {0x00063280, 0x00040807},
-       {0x00063284, 0x104ccccc},
-};
-
-static const u32 ar9462_common_rx_gain_table_ar9280_2p0[][2] = {
-       /* Addr      allmodes  */
-       {0x0000a000, 0x02000101},
-       {0x0000a004, 0x02000102},
-       {0x0000a008, 0x02000103},
-       {0x0000a00c, 0x02000104},
-       {0x0000a010, 0x02000200},
-       {0x0000a014, 0x02000201},
-       {0x0000a018, 0x02000202},
-       {0x0000a01c, 0x02000203},
-       {0x0000a020, 0x02000204},
-       {0x0000a024, 0x02000205},
-       {0x0000a028, 0x02000208},
-       {0x0000a02c, 0x02000302},
-       {0x0000a030, 0x02000303},
-       {0x0000a034, 0x02000304},
-       {0x0000a038, 0x02000400},
-       {0x0000a03c, 0x02010300},
-       {0x0000a040, 0x02010301},
-       {0x0000a044, 0x02010302},
-       {0x0000a048, 0x02000500},
-       {0x0000a04c, 0x02010400},
-       {0x0000a050, 0x02020300},
-       {0x0000a054, 0x02020301},
-       {0x0000a058, 0x02020302},
-       {0x0000a05c, 0x02020303},
-       {0x0000a060, 0x02020400},
-       {0x0000a064, 0x02030300},
-       {0x0000a068, 0x02030301},
-       {0x0000a06c, 0x02030302},
-       {0x0000a070, 0x02030303},
-       {0x0000a074, 0x02030400},
-       {0x0000a078, 0x02040300},
-       {0x0000a07c, 0x02040301},
-       {0x0000a080, 0x02040302},
-       {0x0000a084, 0x02040303},
-       {0x0000a088, 0x02030500},
-       {0x0000a08c, 0x02040400},
-       {0x0000a090, 0x02050203},
-       {0x0000a094, 0x02050204},
-       {0x0000a098, 0x02050205},
-       {0x0000a09c, 0x02040500},
-       {0x0000a0a0, 0x02050301},
-       {0x0000a0a4, 0x02050302},
-       {0x0000a0a8, 0x02050303},
-       {0x0000a0ac, 0x02050400},
-       {0x0000a0b0, 0x02050401},
-       {0x0000a0b4, 0x02050402},
-       {0x0000a0b8, 0x02050403},
-       {0x0000a0bc, 0x02050500},
-       {0x0000a0c0, 0x02050501},
-       {0x0000a0c4, 0x02050502},
-       {0x0000a0c8, 0x02050503},
-       {0x0000a0cc, 0x02050504},
-       {0x0000a0d0, 0x02050600},
-       {0x0000a0d4, 0x02050601},
-       {0x0000a0d8, 0x02050602},
-       {0x0000a0dc, 0x02050603},
-       {0x0000a0e0, 0x02050604},
-       {0x0000a0e4, 0x02050700},
-       {0x0000a0e8, 0x02050701},
-       {0x0000a0ec, 0x02050702},
-       {0x0000a0f0, 0x02050703},
-       {0x0000a0f4, 0x02050704},
-       {0x0000a0f8, 0x02050705},
-       {0x0000a0fc, 0x02050708},
-       {0x0000a100, 0x02050709},
-       {0x0000a104, 0x0205070a},
-       {0x0000a108, 0x0205070b},
-       {0x0000a10c, 0x0205070c},
-       {0x0000a110, 0x0205070d},
-       {0x0000a114, 0x02050710},
-       {0x0000a118, 0x02050711},
-       {0x0000a11c, 0x02050712},
-       {0x0000a120, 0x02050713},
-       {0x0000a124, 0x02050714},
-       {0x0000a128, 0x02050715},
-       {0x0000a12c, 0x02050730},
-       {0x0000a130, 0x02050731},
-       {0x0000a134, 0x02050732},
-       {0x0000a138, 0x02050733},
-       {0x0000a13c, 0x02050734},
-       {0x0000a140, 0x02050735},
-       {0x0000a144, 0x02050750},
-       {0x0000a148, 0x02050751},
-       {0x0000a14c, 0x02050752},
-       {0x0000a150, 0x02050753},
-       {0x0000a154, 0x02050754},
-       {0x0000a158, 0x02050755},
-       {0x0000a15c, 0x02050770},
-       {0x0000a160, 0x02050771},
-       {0x0000a164, 0x02050772},
-       {0x0000a168, 0x02050773},
-       {0x0000a16c, 0x02050774},
-       {0x0000a170, 0x02050775},
-       {0x0000a174, 0x00000776},
-       {0x0000a178, 0x00000776},
-       {0x0000a17c, 0x00000776},
-       {0x0000a180, 0x00000776},
-       {0x0000a184, 0x00000776},
-       {0x0000a188, 0x00000776},
-       {0x0000a18c, 0x00000776},
-       {0x0000a190, 0x00000776},
-       {0x0000a194, 0x00000776},
-       {0x0000a198, 0x00000776},
-       {0x0000a19c, 0x00000776},
-       {0x0000a1a0, 0x00000776},
-       {0x0000a1a4, 0x00000776},
-       {0x0000a1a8, 0x00000776},
-       {0x0000a1ac, 0x00000776},
-       {0x0000a1b0, 0x00000776},
-       {0x0000a1b4, 0x00000776},
-       {0x0000a1b8, 0x00000776},
-       {0x0000a1bc, 0x00000776},
-       {0x0000a1c0, 0x00000776},
-       {0x0000a1c4, 0x00000776},
-       {0x0000a1c8, 0x00000776},
-       {0x0000a1cc, 0x00000776},
-       {0x0000a1d0, 0x00000776},
-       {0x0000a1d4, 0x00000776},
-       {0x0000a1d8, 0x00000776},
-       {0x0000a1dc, 0x00000776},
-       {0x0000a1e0, 0x00000776},
-       {0x0000a1e4, 0x00000776},
-       {0x0000a1e8, 0x00000776},
-       {0x0000a1ec, 0x00000776},
-       {0x0000a1f0, 0x00000776},
-       {0x0000a1f4, 0x00000776},
-       {0x0000a1f8, 0x00000776},
-       {0x0000a1fc, 0x00000776},
-       {0x0000b000, 0x02000101},
-       {0x0000b004, 0x02000102},
-       {0x0000b008, 0x02000103},
-       {0x0000b00c, 0x02000104},
-       {0x0000b010, 0x02000200},
-       {0x0000b014, 0x02000201},
-       {0x0000b018, 0x02000202},
-       {0x0000b01c, 0x02000203},
-       {0x0000b020, 0x02000204},
-       {0x0000b024, 0x02000205},
-       {0x0000b028, 0x02000208},
-       {0x0000b02c, 0x02000302},
-       {0x0000b030, 0x02000303},
-       {0x0000b034, 0x02000304},
-       {0x0000b038, 0x02000400},
-       {0x0000b03c, 0x02010300},
-       {0x0000b040, 0x02010301},
-       {0x0000b044, 0x02010302},
-       {0x0000b048, 0x02000500},
-       {0x0000b04c, 0x02010400},
-       {0x0000b050, 0x02020300},
-       {0x0000b054, 0x02020301},
-       {0x0000b058, 0x02020302},
-       {0x0000b05c, 0x02020303},
-       {0x0000b060, 0x02020400},
-       {0x0000b064, 0x02030300},
-       {0x0000b068, 0x02030301},
-       {0x0000b06c, 0x02030302},
-       {0x0000b070, 0x02030303},
-       {0x0000b074, 0x02030400},
-       {0x0000b078, 0x02040300},
-       {0x0000b07c, 0x02040301},
-       {0x0000b080, 0x02040302},
-       {0x0000b084, 0x02040303},
-       {0x0000b088, 0x02030500},
-       {0x0000b08c, 0x02040400},
-       {0x0000b090, 0x02050203},
-       {0x0000b094, 0x02050204},
-       {0x0000b098, 0x02050205},
-       {0x0000b09c, 0x02040500},
-       {0x0000b0a0, 0x02050301},
-       {0x0000b0a4, 0x02050302},
-       {0x0000b0a8, 0x02050303},
-       {0x0000b0ac, 0x02050400},
-       {0x0000b0b0, 0x02050401},
-       {0x0000b0b4, 0x02050402},
-       {0x0000b0b8, 0x02050403},
-       {0x0000b0bc, 0x02050500},
-       {0x0000b0c0, 0x02050501},
-       {0x0000b0c4, 0x02050502},
-       {0x0000b0c8, 0x02050503},
-       {0x0000b0cc, 0x02050504},
-       {0x0000b0d0, 0x02050600},
-       {0x0000b0d4, 0x02050601},
-       {0x0000b0d8, 0x02050602},
-       {0x0000b0dc, 0x02050603},
-       {0x0000b0e0, 0x02050604},
-       {0x0000b0e4, 0x02050700},
-       {0x0000b0e8, 0x02050701},
-       {0x0000b0ec, 0x02050702},
-       {0x0000b0f0, 0x02050703},
-       {0x0000b0f4, 0x02050704},
-       {0x0000b0f8, 0x02050705},
-       {0x0000b0fc, 0x02050708},
-       {0x0000b100, 0x02050709},
-       {0x0000b104, 0x0205070a},
-       {0x0000b108, 0x0205070b},
-       {0x0000b10c, 0x0205070c},
-       {0x0000b110, 0x0205070d},
-       {0x0000b114, 0x02050710},
-       {0x0000b118, 0x02050711},
-       {0x0000b11c, 0x02050712},
-       {0x0000b120, 0x02050713},
-       {0x0000b124, 0x02050714},
-       {0x0000b128, 0x02050715},
-       {0x0000b12c, 0x02050730},
-       {0x0000b130, 0x02050731},
-       {0x0000b134, 0x02050732},
-       {0x0000b138, 0x02050733},
-       {0x0000b13c, 0x02050734},
-       {0x0000b140, 0x02050735},
-       {0x0000b144, 0x02050750},
-       {0x0000b148, 0x02050751},
-       {0x0000b14c, 0x02050752},
-       {0x0000b150, 0x02050753},
-       {0x0000b154, 0x02050754},
-       {0x0000b158, 0x02050755},
-       {0x0000b15c, 0x02050770},
-       {0x0000b160, 0x02050771},
-       {0x0000b164, 0x02050772},
-       {0x0000b168, 0x02050773},
-       {0x0000b16c, 0x02050774},
-       {0x0000b170, 0x02050775},
-       {0x0000b174, 0x00000776},
-       {0x0000b178, 0x00000776},
-       {0x0000b17c, 0x00000776},
-       {0x0000b180, 0x00000776},
-       {0x0000b184, 0x00000776},
-       {0x0000b188, 0x00000776},
-       {0x0000b18c, 0x00000776},
-       {0x0000b190, 0x00000776},
-       {0x0000b194, 0x00000776},
-       {0x0000b198, 0x00000776},
-       {0x0000b19c, 0x00000776},
-       {0x0000b1a0, 0x00000776},
-       {0x0000b1a4, 0x00000776},
-       {0x0000b1a8, 0x00000776},
-       {0x0000b1ac, 0x00000776},
-       {0x0000b1b0, 0x00000776},
-       {0x0000b1b4, 0x00000776},
-       {0x0000b1b8, 0x00000776},
-       {0x0000b1bc, 0x00000776},
-       {0x0000b1c0, 0x00000776},
-       {0x0000b1c4, 0x00000776},
-       {0x0000b1c8, 0x00000776},
-       {0x0000b1cc, 0x00000776},
-       {0x0000b1d0, 0x00000776},
-       {0x0000b1d4, 0x00000776},
-       {0x0000b1d8, 0x00000776},
-       {0x0000b1dc, 0x00000776},
-       {0x0000b1e0, 0x00000776},
-       {0x0000b1e4, 0x00000776},
-       {0x0000b1e8, 0x00000776},
-       {0x0000b1ec, 0x00000776},
-       {0x0000b1f0, 0x00000776},
-       {0x0000b1f4, 0x00000776},
-       {0x0000b1f8, 0x00000776},
-       {0x0000b1fc, 0x00000776},
-};
-
-static const u32 ar9200_ar9280_2p0_radio_core[][2] = {
-       /* Addr      allmodes  */
-       {0x00007800, 0x00040000},
-       {0x00007804, 0xdb005012},
-       {0x00007808, 0x04924914},
-       {0x0000780c, 0x21084210},
-       {0x00007810, 0x6d801300},
-       {0x00007814, 0x0019beff},
-       {0x00007818, 0x07e41000},
-       {0x0000781c, 0x00392000},
-       {0x00007820, 0x92592480},
-       {0x00007824, 0x00040000},
-       {0x00007828, 0xdb005012},
-       {0x0000782c, 0x04924914},
-       {0x00007830, 0x21084210},
-       {0x00007834, 0x6d801300},
-       {0x00007838, 0x0019beff},
-       {0x0000783c, 0x07e40000},
-       {0x00007840, 0x00392000},
-       {0x00007844, 0x92592480},
-       {0x00007848, 0x00100000},
-       {0x0000784c, 0x773f0567},
-       {0x00007850, 0x54214514},
-       {0x00007854, 0x12035828},
-       {0x00007858, 0x92592692},
-       {0x0000785c, 0x00000000},
-       {0x00007860, 0x56400000},
-       {0x00007864, 0x0a8e370e},
-       {0x00007868, 0xc0102850},
-       {0x0000786c, 0x812d4000},
-       {0x00007870, 0x807ec400},
-       {0x00007874, 0x001b6db0},
-       {0x00007878, 0x00376b63},
-       {0x0000787c, 0x06db6db6},
-       {0x00007880, 0x006d8000},
-       {0x00007884, 0xffeffffe},
-       {0x00007888, 0xffeffffe},
-       {0x0000788c, 0x00010000},
-       {0x00007890, 0x02060aeb},
-       {0x00007894, 0x5a108000},
-};
-
-static const u32 ar9462_2p0_mac_postamble_emulation[][5] = {
-       /* Addr      5G_HT20     5G_HT40     2G_HT40     2G_HT20   */
-       {0x00008014, 0x10f810f8, 0x10f810f8, 0x10f810f8, 0x10f810f8},
-       {0x0000801c, 0x0e8d8017, 0x0e8d8017, 0x0e8d8017, 0x0e8d8017},
-};
-
-static const u32 ar9462_2p0_radio_postamble_sys3ant[][5] = {
-       /* Addr      5G_HT20     5G_HT40     2G_HT40     2G_HT20   */
-       {0x000160ac, 0xa4646c08, 0xa4646c08, 0x24645808, 0x24645808},
-       {0x00016140, 0x10804008, 0x10804008, 0x50804008, 0x50804008},
-       {0x00016540, 0x10804008, 0x10804008, 0x50804008, 0x50804008},
-};
-
-static const u32 ar9462_2p0_baseband_postamble_emulation[][5] = {
-       /* Addr      5G_HT20     5G_HT40     2G_HT40     2G_HT20   */
-       {0x00009e18, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
-       {0x00009e3c, 0xcf946221, 0xcf946221, 0xcf946221, 0xcf946221},
-       {0x00009e44, 0xfc5c0000, 0xfc5c0000, 0xfc5c0000, 0xfc5c0000},
-       {0x0000a258, 0x02020200, 0x02020200, 0x02020200, 0x02020200},
-       {0x0000a25c, 0x00000e0e, 0x00000e0e, 0x00000e0e, 0x00000e0e},
-       {0x0000a28c, 0x00011111, 0x00011111, 0x00011111, 0x00011111},
-       {0x0000a2c4, 0x00148d18, 0x00148d18, 0x00148d20, 0x00148d20},
-       {0x0000a2d8, 0xf999a800, 0xf999a800, 0xf999a80c, 0xf999a80c},
-       {0x0000a50c, 0x0000c00a, 0x0000c00a, 0x0000c00a, 0x0000c00a},
-       {0x0000a538, 0x00038e8c, 0x00038e8c, 0x00038e8c, 0x00038e8c},
-       {0x0000a53c, 0x0003cecc, 0x0003cecc, 0x0003cecc, 0x0003cecc},
-       {0x0000a540, 0x00040ed4, 0x00040ed4, 0x00040ed4, 0x00040ed4},
-       {0x0000a544, 0x00044edc, 0x00044edc, 0x00044edc, 0x00044edc},
-       {0x0000a548, 0x00048ede, 0x00048ede, 0x00048ede, 0x00048ede},
-       {0x0000a54c, 0x0004cf1e, 0x0004cf1e, 0x0004cf1e, 0x0004cf1e},
-       {0x0000a550, 0x00050f5e, 0x00050f5e, 0x00050f5e, 0x00050f5e},
-       {0x0000a554, 0x00054f9e, 0x00054f9e, 0x00054f9e, 0x00054f9e},
-       {0x0000ae18, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
-};
-
 static const u32 ar9462_2p0_radio_postamble_sys2ant[][5] = {
        /* Addr      5G_HT20     5G_HT40     2G_HT40     2G_HT20   */
        {0x000160ac, 0xa4646c08, 0xa4646c08, 0x24645808, 0x24645808},
@@ -1356,24 +1005,6 @@ static const u32 ar9462_2p0_radio_core[][2] = {
        {0x00016548, 0x000080c0},
 };
 
-static const u32 ar9462_2p0_tx_gain_table_baseband_postamble_emulation[][5] = {
-       /* Addr      5G_HT20     5G_HT40     2G_HT40     2G_HT20   */
-       {0x0000a410, 0x000000d5, 0x000000d5, 0x000000d5, 0x000000d5},
-       {0x0000a500, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
-       {0x0000a504, 0x00004002, 0x00004002, 0x00004002, 0x00004002},
-       {0x0000a508, 0x00008004, 0x00008004, 0x00008004, 0x00008004},
-       {0x0000a510, 0x0001000c, 0x0001000c, 0x0001000c, 0x0001000c},
-       {0x0000a514, 0x0001420b, 0x0001420b, 0x0001420b, 0x0001420b},
-       {0x0000a518, 0x0001824a, 0x0001824a, 0x0001824a, 0x0001824a},
-       {0x0000a51c, 0x0001c44a, 0x0001c44a, 0x0001c44a, 0x0001c44a},
-       {0x0000a520, 0x0002064a, 0x0002064a, 0x0002064a, 0x0002064a},
-       {0x0000a524, 0x0002484a, 0x0002484a, 0x0002484a, 0x0002484a},
-       {0x0000a528, 0x00028a4a, 0x00028a4a, 0x00028a4a, 0x00028a4a},
-       {0x0000a52c, 0x0002cc4a, 0x0002cc4a, 0x0002cc4a, 0x0002cc4a},
-       {0x0000a530, 0x00030e4a, 0x00030e4a, 0x00030e4a, 0x00030e4a},
-       {0x0000a534, 0x00034e8a, 0x00034e8a, 0x00034e8a, 0x00034e8a},
-};
-
 static const u32 ar9462_2p0_soc_preamble[][2] = {
        /* Addr      allmodes  */
        {0x00007020, 0x00000000},
@@ -1381,11 +1012,6 @@ static const u32 ar9462_2p0_soc_preamble[][2] = {
        {0x00007038, 0x000004c2},
 };
 
-static const u32 ar9462_2p0_sys2ant[][2] = {
-       /* Addr      allmodes  */
-       {0x00063120, 0x00801980},
-};
-
 static const u32 ar9462_2p0_mac_core[][2] = {
        /* Addr      allmodes  */
        {0x00000008, 0x00000000},
@@ -1822,75 +1448,6 @@ static const u32 ar9462_common_mixed_rx_gain_table_2p0[][2] = {
        {0x0000b1fc, 0x00000196},
 };
 
-static const u32 ar9462_modes_green_ob_db_tx_gain_table_2p0[][5] = {
-       /* Addr      5G_HT20     5G_HT40     2G_HT40     2G_HT20   */
-       {0x000098bc, 0x00000003, 0x00000003, 0x00000003, 0x00000003},
-       {0x0000a2dc, 0x01feee00, 0x01feee00, 0x03aaa352, 0x03aaa352},
-       {0x0000a2e0, 0x0000f000, 0x0000f000, 0x03ccc584, 0x03ccc584},
-       {0x0000a2e4, 0x01ff0000, 0x01ff0000, 0x03f0f800, 0x03f0f800},
-       {0x0000a2e8, 0x00000000, 0x00000000, 0x03ff0000, 0x03ff0000},
-       {0x0000a410, 0x000050d9, 0x000050d9, 0x000050d9, 0x000050d9},
-       {0x0000a458, 0x80000000, 0x80000000, 0x80000000, 0x80000000},
-       {0x0000a500, 0x00002220, 0x00002220, 0x00000000, 0x00000000},
-       {0x0000a504, 0x06002223, 0x06002223, 0x04000002, 0x04000002},
-       {0x0000a508, 0x0a022220, 0x0a022220, 0x08000004, 0x08000004},
-       {0x0000a50c, 0x0f022223, 0x0f022223, 0x0b000200, 0x0b000200},
-       {0x0000a510, 0x14022620, 0x14022620, 0x0f000202, 0x0f000202},
-       {0x0000a514, 0x18022622, 0x18022622, 0x11000400, 0x11000400},
-       {0x0000a518, 0x1b022822, 0x1b022822, 0x15000402, 0x15000402},
-       {0x0000a51c, 0x20022842, 0x20022842, 0x19000404, 0x19000404},
-       {0x0000a520, 0x22022c41, 0x22022c41, 0x1b000603, 0x1b000603},
-       {0x0000a524, 0x28023042, 0x28023042, 0x1f000a02, 0x1f000a02},
-       {0x0000a528, 0x2c023044, 0x2c023044, 0x23000a04, 0x23000a04},
-       {0x0000a52c, 0x2f023644, 0x2f023644, 0x26000a20, 0x26000a20},
-       {0x0000a530, 0x34025643, 0x34025643, 0x2a000e20, 0x2a000e20},
-       {0x0000a534, 0x38025a44, 0x38025a44, 0x2e000e22, 0x2e000e22},
-       {0x0000a538, 0x3b025e45, 0x3b025e45, 0x31000e24, 0x31000e24},
-       {0x0000a53c, 0x41025e4a, 0x41025e4a, 0x34001640, 0x34001640},
-       {0x0000a540, 0x48025e6c, 0x48025e6c, 0x38001660, 0x38001660},
-       {0x0000a544, 0x4e025e8e, 0x4e025e8e, 0x3b001861, 0x3b001861},
-       {0x0000a548, 0x53025eb2, 0x53025eb2, 0x3e001a81, 0x3e001a81},
-       {0x0000a54c, 0x59025eb6, 0x59025eb6, 0x42001a83, 0x42001a83},
-       {0x0000a550, 0x5d025ef6, 0x5d025ef6, 0x44001c84, 0x44001c84},
-       {0x0000a554, 0x62025f56, 0x62025f56, 0x48001ce3, 0x48001ce3},
-       {0x0000a558, 0x66027f56, 0x66027f56, 0x4c001ce5, 0x4c001ce5},
-       {0x0000a55c, 0x6a029f56, 0x6a029f56, 0x50001ce9, 0x50001ce9},
-       {0x0000a560, 0x70049f56, 0x70049f56, 0x54001ceb, 0x54001ceb},
-       {0x0000a564, 0x7504ff56, 0x7504ff56, 0x56001eec, 0x56001eec},
-       {0x0000a568, 0x7504ff56, 0x7504ff56, 0x56001eec, 0x56001eec},
-       {0x0000a56c, 0x7504ff56, 0x7504ff56, 0x56001eec, 0x56001eec},
-       {0x0000a570, 0x7504ff56, 0x7504ff56, 0x56001eec, 0x56001eec},
-       {0x0000a574, 0x7504ff56, 0x7504ff56, 0x56001eec, 0x56001eec},
-       {0x0000a578, 0x7504ff56, 0x7504ff56, 0x56001eec, 0x56001eec},
-       {0x0000a57c, 0x7504ff56, 0x7504ff56, 0x56001eec, 0x56001eec},
-       {0x0000a600, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
-       {0x0000a604, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
-       {0x0000a608, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
-       {0x0000a60c, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
-       {0x0000a610, 0x00804000, 0x00804000, 0x00000000, 0x00000000},
-       {0x0000a614, 0x00804201, 0x00804201, 0x01404000, 0x01404000},
-       {0x0000a618, 0x0280c802, 0x0280c802, 0x01404501, 0x01404501},
-       {0x0000a61c, 0x0280ca03, 0x0280ca03, 0x02008501, 0x02008501},
-       {0x0000a620, 0x04c15104, 0x04c15104, 0x0280ca03, 0x0280ca03},
-       {0x0000a624, 0x04c15305, 0x04c15305, 0x03010c04, 0x03010c04},
-       {0x0000a628, 0x04c15305, 0x04c15305, 0x04014c04, 0x04014c04},
-       {0x0000a62c, 0x04c15305, 0x04c15305, 0x04015005, 0x04015005},
-       {0x0000a630, 0x04c15305, 0x04c15305, 0x04015005, 0x04015005},
-       {0x0000a634, 0x04c15305, 0x04c15305, 0x04015005, 0x04015005},
-       {0x0000a638, 0x04c15305, 0x04c15305, 0x04015005, 0x04015005},
-       {0x0000a63c, 0x04c15305, 0x04c15305, 0x04015005, 0x04015005},
-       {0x0000b2dc, 0x01feee00, 0x01feee00, 0x03aaa352, 0x03aaa352},
-       {0x0000b2e0, 0x0000f000, 0x0000f000, 0x03ccc584, 0x03ccc584},
-       {0x0000b2e4, 0x01ff0000, 0x01ff0000, 0x03f0f800, 0x03f0f800},
-       {0x0000b2e8, 0x00000000, 0x00000000, 0x03ff0000, 0x03ff0000},
-       {0x00016044, 0x056d82e4, 0x056d82e4, 0x056d82e4, 0x056d82e4},
-       {0x00016048, 0x8db49060, 0x8db49060, 0x8db49060, 0x8db49060},
-       {0x00016054, 0x6db60180, 0x6db60180, 0x6db60180, 0x6db60180},
-       {0x00016444, 0x056d82e4, 0x056d82e4, 0x056d82e4, 0x056d82e4},
-       {0x00016448, 0x8db49000, 0x8db49000, 0x8db49000, 0x8db49000},
-       {0x00016454, 0x6db60180, 0x6db60180, 0x6db60180, 0x6db60180},
-};
-
 static const u32 ar9462_2p0_BTCOEX_MAX_TXPWR_table[][2] = {
        /* Addr      allmodes  */
        {0x000018c0, 0x10101010},
@@ -1903,26 +1460,4 @@ static const u32 ar9462_2p0_BTCOEX_MAX_TXPWR_table[][2] = {
        {0x000018dc, 0x10101010},
 };
 
-static const u32 ar9462_2p0_baseband_core_emulation[][2] = {
-       /* Addr      allmodes  */
-       {0x00009800, 0xafa68e30},
-       {0x00009884, 0x00002842},
-       {0x00009c04, 0xff55ff55},
-       {0x00009c08, 0x0320ff55},
-       {0x00009e50, 0x00000000},
-       {0x00009fcc, 0x00000014},
-       {0x0000a344, 0x00000010},
-       {0x0000a398, 0x00000000},
-       {0x0000a39c, 0x71733d01},
-       {0x0000a3a0, 0xd0ad5c12},
-       {0x0000a3c0, 0x22222220},
-       {0x0000a3c4, 0x22222222},
-       {0x0000a404, 0x00418a11},
-       {0x0000a418, 0x050001ce},
-       {0x0000a438, 0x00001800},
-       {0x0000a458, 0x01444452},
-       {0x0000a644, 0x3fad9d74},
-       {0x0000a690, 0x00000038},
-};
-
 #endif /* INITVALS_9462_2P0_H */
index 171ccf7..c2ccba6 100644 (file)
@@ -454,9 +454,39 @@ struct ath_btcoex {
        struct ath_mci_profile mci;
 };
 
-int ath_init_btcoex_timer(struct ath_softc *sc);
+#ifdef CONFIG_ATH9K_BTCOEX_SUPPORT
+int ath9k_init_btcoex(struct ath_softc *sc);
+void ath9k_deinit_btcoex(struct ath_softc *sc);
+void ath9k_start_btcoex(struct ath_softc *sc);
+void ath9k_stop_btcoex(struct ath_softc *sc);
 void ath9k_btcoex_timer_resume(struct ath_softc *sc);
 void ath9k_btcoex_timer_pause(struct ath_softc *sc);
+void ath9k_btcoex_handle_interrupt(struct ath_softc *sc, u32 status);
+u16 ath9k_btcoex_aggr_limit(struct ath_softc *sc, u32 max_4ms_framelen);
+#else
+static inline int ath9k_init_btcoex(struct ath_softc *sc)
+{
+       return 0;
+}
+static inline void ath9k_deinit_btcoex(struct ath_softc *sc)
+{
+}
+static inline void ath9k_start_btcoex(struct ath_softc *sc)
+{
+}
+static inline void ath9k_stop_btcoex(struct ath_softc *sc)
+{
+}
+static inline void ath9k_btcoex_handle_interrupt(struct ath_softc *sc,
+                                                u32 status)
+{
+}
+static inline u16 ath9k_btcoex_aggr_limit(struct ath_softc *sc,
+                                         u32 max_4ms_framelen)
+{
+       return 0;
+}
+#endif /* CONFIG_ATH9K_BTCOEX_SUPPORT */
 
 /********************/
 /*   LED Control    */
@@ -650,8 +680,11 @@ struct ath_softc {
        struct ath_beacon_config cur_beacon_conf;
        struct delayed_work tx_complete_work;
        struct delayed_work hw_pll_work;
+
+#ifdef CONFIG_ATH9K_BTCOEX_SUPPORT
        struct ath_btcoex btcoex;
        struct ath_mci_coex mci_coex;
+#endif
 
        struct ath_descdma txsdma;
 
index a6712a9..ec32719 100644 (file)
@@ -68,9 +68,6 @@ void ath9k_hw_init_btcoex_hw(struct ath_hw *ah, int qnum)
        u32 i, idx;
        bool rxclear_polarity = ath_bt_config.bt_rxclear_polarity;
 
-       if (ath9k_hw_get_btcoex_scheme(ah) == ATH_BTCOEX_CFG_NONE)
-               return;
-
        if (AR_SREV_9300_20_OR_LATER(ah))
                rxclear_polarity = !ath_bt_config.bt_rxclear_polarity;
 
@@ -98,12 +95,43 @@ void ath9k_hw_init_btcoex_hw(struct ath_hw *ah, int qnum)
 }
 EXPORT_SYMBOL(ath9k_hw_init_btcoex_hw);
 
-void ath9k_hw_btcoex_init_2wire(struct ath_hw *ah)
+void ath9k_hw_btcoex_init_scheme(struct ath_hw *ah)
 {
+       struct ath_common *common = ath9k_hw_common(ah);
        struct ath_btcoex_hw *btcoex_hw = &ah->btcoex_hw;
 
-       if (ath9k_hw_get_btcoex_scheme(ah) == ATH_BTCOEX_CFG_NONE)
+       /*
+        * Check if BTCOEX is globally disabled.
+        */
+       if (!common->btcoex_enabled) {
+               btcoex_hw->scheme = ATH_BTCOEX_CFG_NONE;
                return;
+       }
+
+       if (AR_SREV_9462(ah)) {
+               btcoex_hw->scheme = ATH_BTCOEX_CFG_MCI;
+       } else if (AR_SREV_9300_20_OR_LATER(ah)) {
+               btcoex_hw->scheme = ATH_BTCOEX_CFG_3WIRE;
+               btcoex_hw->btactive_gpio = ATH_BTACTIVE_GPIO_9300;
+               btcoex_hw->wlanactive_gpio = ATH_WLANACTIVE_GPIO_9300;
+               btcoex_hw->btpriority_gpio = ATH_BTPRIORITY_GPIO_9300;
+       } else if (AR_SREV_9280_20_OR_LATER(ah)) {
+               btcoex_hw->btactive_gpio = ATH_BTACTIVE_GPIO_9280;
+               btcoex_hw->wlanactive_gpio = ATH_WLANACTIVE_GPIO_9280;
+
+               if (AR_SREV_9285(ah)) {
+                       btcoex_hw->scheme = ATH_BTCOEX_CFG_3WIRE;
+                       btcoex_hw->btpriority_gpio = ATH_BTPRIORITY_GPIO_9285;
+               } else {
+                       btcoex_hw->scheme = ATH_BTCOEX_CFG_2WIRE;
+               }
+       }
+}
+EXPORT_SYMBOL(ath9k_hw_btcoex_init_scheme);
+
+void ath9k_hw_btcoex_init_2wire(struct ath_hw *ah)
+{
+       struct ath_btcoex_hw *btcoex_hw = &ah->btcoex_hw;
 
        /* connect bt_active to baseband */
        REG_CLR_BIT(ah, AR_GPIO_INPUT_EN_VAL,
@@ -127,9 +155,6 @@ void ath9k_hw_btcoex_init_3wire(struct ath_hw *ah)
 {
        struct ath_btcoex_hw *btcoex_hw = &ah->btcoex_hw;
 
-       if (ath9k_hw_get_btcoex_scheme(ah) == ATH_BTCOEX_CFG_NONE)
-               return;
-
        /* btcoex 3-wire */
        REG_SET_BIT(ah, AR_GPIO_INPUT_EN_VAL,
                        (AR_GPIO_INPUT_EN_VAL_BT_PRIORITY_BB |
@@ -152,13 +177,34 @@ void ath9k_hw_btcoex_init_3wire(struct ath_hw *ah)
 }
 EXPORT_SYMBOL(ath9k_hw_btcoex_init_3wire);
 
+void ath9k_hw_btcoex_init_mci(struct ath_hw *ah)
+{
+       ah->btcoex_hw.mci.ready = false;
+       ah->btcoex_hw.mci.bt_state = 0;
+       ah->btcoex_hw.mci.bt_ver_major = 3;
+       ah->btcoex_hw.mci.bt_ver_minor = 0;
+       ah->btcoex_hw.mci.bt_version_known = false;
+       ah->btcoex_hw.mci.update_2g5g = true;
+       ah->btcoex_hw.mci.is_2g = true;
+       ah->btcoex_hw.mci.wlan_channels_update = false;
+       ah->btcoex_hw.mci.wlan_channels[0] = 0x00000000;
+       ah->btcoex_hw.mci.wlan_channels[1] = 0xffffffff;
+       ah->btcoex_hw.mci.wlan_channels[2] = 0xffffffff;
+       ah->btcoex_hw.mci.wlan_channels[3] = 0x7fffffff;
+       ah->btcoex_hw.mci.query_bt = true;
+       ah->btcoex_hw.mci.unhalt_bt_gpm = true;
+       ah->btcoex_hw.mci.halted_bt_gpm = false;
+       ah->btcoex_hw.mci.need_flush_btinfo = false;
+       ah->btcoex_hw.mci.wlan_cal_seq = 0;
+       ah->btcoex_hw.mci.wlan_cal_done = 0;
+       ah->btcoex_hw.mci.config = 0x2201;
+}
+EXPORT_SYMBOL(ath9k_hw_btcoex_init_mci);
+
 static void ath9k_hw_btcoex_enable_2wire(struct ath_hw *ah)
 {
        struct ath_btcoex_hw *btcoex_hw = &ah->btcoex_hw;
 
-       if (ath9k_hw_get_btcoex_scheme(ah) == ATH_BTCOEX_CFG_NONE)
-               return;
-
        /* Configure the desired GPIO port for TX_FRAME output */
        ath9k_hw_cfg_output(ah, btcoex_hw->wlanactive_gpio,
                            AR_GPIO_OUTPUT_MUX_AS_TX_FRAME);
@@ -170,9 +216,6 @@ void ath9k_hw_btcoex_set_weight(struct ath_hw *ah,
 {
        struct ath_btcoex_hw *btcoex_hw = &ah->btcoex_hw;
 
-       if (ath9k_hw_get_btcoex_scheme(ah) == ATH_BTCOEX_CFG_NONE)
-               return;
-
        btcoex_hw->bt_coex_weights = SM(bt_weight, AR_BTCOEX_BT_WGHT) |
                                     SM(wlan_weight, AR_BTCOEX_WL_WGHT);
 }
@@ -261,9 +304,6 @@ void ath9k_hw_btcoex_disable(struct ath_hw *ah)
        struct ath_btcoex_hw *btcoex_hw = &ah->btcoex_hw;
        int i;
 
-       if (ath9k_hw_get_btcoex_scheme(ah) == ATH_BTCOEX_CFG_NONE)
-               return;
-
        btcoex_hw->enabled = false;
        if (btcoex_hw->scheme == ATH_BTCOEX_CFG_MCI) {
                ath9k_hw_btcoex_bt_stomp(ah, ATH_BTCOEX_STOMP_NONE);
@@ -312,9 +352,6 @@ static void ar9003_btcoex_bt_stomp(struct ath_hw *ah,
 void ath9k_hw_btcoex_bt_stomp(struct ath_hw *ah,
                              enum ath_stomp_type stomp_type)
 {
-       if (ath9k_hw_get_btcoex_scheme(ah) == ATH_BTCOEX_CFG_NONE)
-               return;
-
        if (AR_SREV_9300_20_OR_LATER(ah)) {
                ar9003_btcoex_bt_stomp(ah, stomp_type);
                return;
index 278361c..8f93aef 100644 (file)
@@ -67,7 +67,6 @@ struct ath9k_hw_mci {
        u32 wlan_cal_done;
        u32 config;
        u8 *gpm_buf;
-       u8 *sched_buf;
        bool ready;
        bool update_2g5g;
        bool is_2g;
@@ -98,13 +97,14 @@ struct ath_btcoex_hw {
        u32 wlan_weight[AR9300_NUM_WLAN_WEIGHTS];
 };
 
+void ath9k_hw_btcoex_init_scheme(struct ath_hw *ah);
 void ath9k_hw_btcoex_init_2wire(struct ath_hw *ah);
 void ath9k_hw_btcoex_init_3wire(struct ath_hw *ah);
+void ath9k_hw_btcoex_init_mci(struct ath_hw *ah);
 void ath9k_hw_init_btcoex_hw(struct ath_hw *ah, int qnum);
 void ath9k_hw_btcoex_set_weight(struct ath_hw *ah,
                                u32 bt_weight,
                                u32 wlan_weight);
-void ath9k_hw_btcoex_enable(struct ath_hw *ah);
 void ath9k_hw_btcoex_disable(struct ath_hw *ah);
 void ath9k_hw_btcoex_bt_stomp(struct ath_hw *ah,
                              enum ath_stomp_type stomp_type);
index 68d972b..228c181 100644 (file)
@@ -451,109 +451,6 @@ static const struct file_operations fops_interrupt = {
        .llseek = default_llseek,
 };
 
-static const char *channel_type_str(enum nl80211_channel_type t)
-{
-       switch (t) {
-       case NL80211_CHAN_NO_HT:
-               return "no ht";
-       case NL80211_CHAN_HT20:
-               return "ht20";
-       case NL80211_CHAN_HT40MINUS:
-               return "ht40-";
-       case NL80211_CHAN_HT40PLUS:
-               return "ht40+";
-       default:
-               return "???";
-       }
-}
-
-static ssize_t read_file_wiphy(struct file *file, char __user *user_buf,
-                              size_t count, loff_t *ppos)
-{
-       struct ath_softc *sc = file->private_data;
-       struct ieee80211_channel *chan = sc->hw->conf.channel;
-       struct ieee80211_conf *conf = &(sc->hw->conf);
-       char buf[512];
-       unsigned int len = 0;
-       u8 addr[ETH_ALEN];
-       u32 tmp;
-
-       len += snprintf(buf + len, sizeof(buf) - len,
-                       "%s (chan=%d  center-freq: %d MHz  channel-type: %d (%s))\n",
-                       wiphy_name(sc->hw->wiphy),
-                       ieee80211_frequency_to_channel(chan->center_freq),
-                       chan->center_freq,
-                       conf->channel_type,
-                       channel_type_str(conf->channel_type));
-
-       ath9k_ps_wakeup(sc);
-       put_unaligned_le32(REG_READ_D(sc->sc_ah, AR_STA_ID0), addr);
-       put_unaligned_le16(REG_READ_D(sc->sc_ah, AR_STA_ID1) & 0xffff, addr + 4);
-       len += snprintf(buf + len, sizeof(buf) - len,
-                       "addr: %pM\n", addr);
-       put_unaligned_le32(REG_READ_D(sc->sc_ah, AR_BSSMSKL), addr);
-       put_unaligned_le16(REG_READ_D(sc->sc_ah, AR_BSSMSKU) & 0xffff, addr + 4);
-       len += snprintf(buf + len, sizeof(buf) - len,
-                       "addrmask: %pM\n", addr);
-       tmp = ath9k_hw_getrxfilter(sc->sc_ah);
-       ath9k_ps_restore(sc);
-       len += snprintf(buf + len, sizeof(buf) - len,
-                       "rfilt: 0x%x", tmp);
-       if (tmp & ATH9K_RX_FILTER_UCAST)
-               len += snprintf(buf + len, sizeof(buf) - len, " UCAST");
-       if (tmp & ATH9K_RX_FILTER_MCAST)
-               len += snprintf(buf + len, sizeof(buf) - len, " MCAST");
-       if (tmp & ATH9K_RX_FILTER_BCAST)
-               len += snprintf(buf + len, sizeof(buf) - len, " BCAST");
-       if (tmp & ATH9K_RX_FILTER_CONTROL)
-               len += snprintf(buf + len, sizeof(buf) - len, " CONTROL");
-       if (tmp & ATH9K_RX_FILTER_BEACON)
-               len += snprintf(buf + len, sizeof(buf) - len, " BEACON");
-       if (tmp & ATH9K_RX_FILTER_PROM)
-               len += snprintf(buf + len, sizeof(buf) - len, " PROM");
-       if (tmp & ATH9K_RX_FILTER_PROBEREQ)
-               len += snprintf(buf + len, sizeof(buf) - len, " PROBEREQ");
-       if (tmp & ATH9K_RX_FILTER_PHYERR)
-               len += snprintf(buf + len, sizeof(buf) - len, " PHYERR");
-       if (tmp & ATH9K_RX_FILTER_MYBEACON)
-               len += snprintf(buf + len, sizeof(buf) - len, " MYBEACON");
-       if (tmp & ATH9K_RX_FILTER_COMP_BAR)
-               len += snprintf(buf + len, sizeof(buf) - len, " COMP_BAR");
-       if (tmp & ATH9K_RX_FILTER_PSPOLL)
-               len += snprintf(buf + len, sizeof(buf) - len, " PSPOLL");
-       if (tmp & ATH9K_RX_FILTER_PHYRADAR)
-               len += snprintf(buf + len, sizeof(buf) - len, " PHYRADAR");
-       if (tmp & ATH9K_RX_FILTER_MCAST_BCAST_ALL)
-               len += snprintf(buf + len, sizeof(buf) - len, " MCAST_BCAST_ALL");
-
-       len += snprintf(buf + len, sizeof(buf) - len,
-                      "\n\nReset causes:\n"
-                      "  baseband hang: %d\n"
-                      "  baseband watchdog: %d\n"
-                      "  fatal hardware error interrupt: %d\n"
-                      "  tx hardware error: %d\n"
-                      "  tx path hang: %d\n"
-                      "  pll rx hang: %d\n",
-                      sc->debug.stats.reset[RESET_TYPE_BB_HANG],
-                      sc->debug.stats.reset[RESET_TYPE_BB_WATCHDOG],
-                      sc->debug.stats.reset[RESET_TYPE_FATAL_INT],
-                      sc->debug.stats.reset[RESET_TYPE_TX_ERROR],
-                      sc->debug.stats.reset[RESET_TYPE_TX_HANG],
-                      sc->debug.stats.reset[RESET_TYPE_PLL_HANG]);
-
-       if (len > sizeof(buf))
-               len = sizeof(buf);
-
-       return simple_read_from_buffer(user_buf, count, ppos, buf, len);
-}
-
-static const struct file_operations fops_wiphy = {
-       .read = read_file_wiphy,
-       .open = ath9k_debugfs_open,
-       .owner = THIS_MODULE,
-       .llseek = default_llseek,
-};
-
 #define PR_QNUM(_n) sc->tx.txq_map[_n]->axq_qnum
 #define PR(str, elem)                                                  \
        do {                                                            \
@@ -763,87 +660,128 @@ static ssize_t read_file_misc(struct file *file, char __user *user_buf,
 {
        struct ath_softc *sc = file->private_data;
        struct ath_common *common = ath9k_hw_common(sc->sc_ah);
-       struct ath_hw *ah = sc->sc_ah;
        struct ieee80211_hw *hw = sc->hw;
-       char *buf;
-       unsigned int len = 0, size = 8000;
+       struct ath9k_vif_iter_data iter_data;
+       char buf[512];
+       unsigned int len = 0;
        ssize_t retval = 0;
        unsigned int reg;
-       struct ath9k_vif_iter_data iter_data;
+       u32 rxfilter;
 
-       ath9k_calculate_iter_data(hw, NULL, &iter_data);
-       
-       buf = kzalloc(size, GFP_KERNEL);
-       if (buf == NULL)
-               return -ENOMEM;
+       len += snprintf(buf + len, sizeof(buf) - len,
+                       "BSSID: %pM\n", common->curbssid);
+       len += snprintf(buf + len, sizeof(buf) - len,
+                       "BSSID-MASK: %pM\n", common->bssidmask);
+       len += snprintf(buf + len, sizeof(buf) - len,
+                       "OPMODE: %s\n", ath_opmode_to_string(sc->sc_ah->opmode));
 
        ath9k_ps_wakeup(sc);
-       len += snprintf(buf + len, size - len,
-                       "curbssid: %pM\n"
-                       "OP-Mode: %s(%i)\n"
-                       "Beacon-Timer-Register: 0x%x\n",
-                       common->curbssid,
-                       ath_opmode_to_string(sc->sc_ah->opmode),
-                       (int)(sc->sc_ah->opmode),
-                       REG_READ(ah, AR_BEACON_PERIOD));
-
-       reg = REG_READ(ah, AR_TIMER_MODE);
+       rxfilter = ath9k_hw_getrxfilter(sc->sc_ah);
        ath9k_ps_restore(sc);
-       len += snprintf(buf + len, size - len, "Timer-Mode-Register: 0x%x (",
-                       reg);
-       if (reg & AR_TBTT_TIMER_EN)
-               len += snprintf(buf + len, size - len, "TBTT ");
-       if (reg & AR_DBA_TIMER_EN)
-               len += snprintf(buf + len, size - len, "DBA ");
-       if (reg & AR_SWBA_TIMER_EN)
-               len += snprintf(buf + len, size - len, "SWBA ");
-       if (reg & AR_HCF_TIMER_EN)
-               len += snprintf(buf + len, size - len, "HCF ");
-       if (reg & AR_TIM_TIMER_EN)
-               len += snprintf(buf + len, size - len, "TIM ");
-       if (reg & AR_DTIM_TIMER_EN)
-               len += snprintf(buf + len, size - len, "DTIM ");
-       len += snprintf(buf + len, size - len, ")\n");
+
+       len += snprintf(buf + len, sizeof(buf) - len,
+                       "RXFILTER: 0x%x", rxfilter);
+
+       if (rxfilter & ATH9K_RX_FILTER_UCAST)
+               len += snprintf(buf + len, sizeof(buf) - len, " UCAST");
+       if (rxfilter & ATH9K_RX_FILTER_MCAST)
+               len += snprintf(buf + len, sizeof(buf) - len, " MCAST");
+       if (rxfilter & ATH9K_RX_FILTER_BCAST)
+               len += snprintf(buf + len, sizeof(buf) - len, " BCAST");
+       if (rxfilter & ATH9K_RX_FILTER_CONTROL)
+               len += snprintf(buf + len, sizeof(buf) - len, " CONTROL");
+       if (rxfilter & ATH9K_RX_FILTER_BEACON)
+               len += snprintf(buf + len, sizeof(buf) - len, " BEACON");
+       if (rxfilter & ATH9K_RX_FILTER_PROM)
+               len += snprintf(buf + len, sizeof(buf) - len, " PROM");
+       if (rxfilter & ATH9K_RX_FILTER_PROBEREQ)
+               len += snprintf(buf + len, sizeof(buf) - len, " PROBEREQ");
+       if (rxfilter & ATH9K_RX_FILTER_PHYERR)
+               len += snprintf(buf + len, sizeof(buf) - len, " PHYERR");
+       if (rxfilter & ATH9K_RX_FILTER_MYBEACON)
+               len += snprintf(buf + len, sizeof(buf) - len, " MYBEACON");
+       if (rxfilter & ATH9K_RX_FILTER_COMP_BAR)
+               len += snprintf(buf + len, sizeof(buf) - len, " COMP_BAR");
+       if (rxfilter & ATH9K_RX_FILTER_PSPOLL)
+               len += snprintf(buf + len, sizeof(buf) - len, " PSPOLL");
+       if (rxfilter & ATH9K_RX_FILTER_PHYRADAR)
+               len += snprintf(buf + len, sizeof(buf) - len, " PHYRADAR");
+       if (rxfilter & ATH9K_RX_FILTER_MCAST_BCAST_ALL)
+               len += snprintf(buf + len, sizeof(buf) - len, " MCAST_BCAST_ALL");
+       if (rxfilter & ATH9K_RX_FILTER_CONTROL_WRAPPER)
+               len += snprintf(buf + len, sizeof(buf) - len, " CONTROL_WRAPPER");
+
+       len += snprintf(buf + len, sizeof(buf) - len, "\n");
 
        reg = sc->sc_ah->imask;
-       len += snprintf(buf + len, size - len, "imask: 0x%x (", reg);
+
+       len += snprintf(buf + len, sizeof(buf) - len, "INTERRUPT-MASK: 0x%x", reg);
+
        if (reg & ATH9K_INT_SWBA)
-               len += snprintf(buf + len, size - len, "SWBA ");
+               len += snprintf(buf + len, sizeof(buf) - len, " SWBA");
        if (reg & ATH9K_INT_BMISS)
-               len += snprintf(buf + len, size - len, "BMISS ");
+               len += snprintf(buf + len, sizeof(buf) - len, " BMISS");
        if (reg & ATH9K_INT_CST)
-               len += snprintf(buf + len, size - len, "CST ");
+               len += snprintf(buf + len, sizeof(buf) - len, " CST");
        if (reg & ATH9K_INT_RX)
-               len += snprintf(buf + len, size - len, "RX ");
+               len += snprintf(buf + len, sizeof(buf) - len, " RX");
        if (reg & ATH9K_INT_RXHP)
-               len += snprintf(buf + len, size - len, "RXHP ");
+               len += snprintf(buf + len, sizeof(buf) - len, " RXHP");
        if (reg & ATH9K_INT_RXLP)
-               len += snprintf(buf + len, size - len, "RXLP ");
+               len += snprintf(buf + len, sizeof(buf) - len, " RXLP");
        if (reg & ATH9K_INT_BB_WATCHDOG)
-               len += snprintf(buf + len, size - len, "BB_WATCHDOG ");
-       /* there are other IRQs if one wanted to add them. */
-       len += snprintf(buf + len, size - len, ")\n");
+               len += snprintf(buf + len, sizeof(buf) - len, " BB_WATCHDOG");
 
-       len += snprintf(buf + len, size - len,
-                       "VIF Counts: AP: %i STA: %i MESH: %i WDS: %i"
-                       " ADHOC: %i OTHER: %i nvifs: %hi beacon-vifs: %hi\n",
+       len += snprintf(buf + len, sizeof(buf) - len, "\n");
+
+       ath9k_calculate_iter_data(hw, NULL, &iter_data);
+
+       len += snprintf(buf + len, sizeof(buf) - len,
+                       "VIF-COUNTS: AP: %i STA: %i MESH: %i WDS: %i"
+                       " ADHOC: %i OTHER: %i TOTAL: %hi BEACON-VIF: %hi\n",
                        iter_data.naps, iter_data.nstations, iter_data.nmeshes,
                        iter_data.nwds, iter_data.nadhocs, iter_data.nothers,
                        sc->nvifs, sc->nbcnvifs);
 
-       len += snprintf(buf + len, size - len,
-                       "Calculated-BSSID-Mask: %pM\n",
-                       iter_data.mask);
-
-       if (len > size)
-               len = size;
+       if (len > sizeof(buf))
+               len = sizeof(buf);
 
        retval = simple_read_from_buffer(user_buf, count, ppos, buf, len);
-       kfree(buf);
-
        return retval;
 }
 
+static ssize_t read_file_reset(struct file *file, char __user *user_buf,
+                              size_t count, loff_t *ppos)
+{
+       struct ath_softc *sc = file->private_data;
+       char buf[512];
+       unsigned int len = 0;
+
+       len += snprintf(buf + len, sizeof(buf) - len,
+                       "%17s: %2d\n", "Baseband Hang",
+                       sc->debug.stats.reset[RESET_TYPE_BB_HANG]);
+       len += snprintf(buf + len, sizeof(buf) - len,
+                       "%17s: %2d\n", "Baseband Watchdog",
+                       sc->debug.stats.reset[RESET_TYPE_BB_WATCHDOG]);
+       len += snprintf(buf + len, sizeof(buf) - len,
+                       "%17s: %2d\n", "Fatal HW Error",
+                       sc->debug.stats.reset[RESET_TYPE_FATAL_INT]);
+       len += snprintf(buf + len, sizeof(buf) - len,
+                       "%17s: %2d\n", "TX HW error",
+                       sc->debug.stats.reset[RESET_TYPE_TX_ERROR]);
+       len += snprintf(buf + len, sizeof(buf) - len,
+                       "%17s: %2d\n", "TX Path Hang",
+                       sc->debug.stats.reset[RESET_TYPE_TX_HANG]);
+       len += snprintf(buf + len, sizeof(buf) - len,
+                       "%17s: %2d\n", "PLL RX Hang",
+                       sc->debug.stats.reset[RESET_TYPE_PLL_HANG]);
+
+       if (len > sizeof(buf))
+               len = sizeof(buf);
+
+       return simple_read_from_buffer(user_buf, count, ppos, buf, len);
+}
+
 void ath_debug_stat_tx(struct ath_softc *sc, struct ath_buf *bf,
                       struct ath_tx_status *ts, struct ath_txq *txq,
                       unsigned int flags)
@@ -931,16 +869,23 @@ static const struct file_operations fops_misc = {
        .llseek = default_llseek,
 };
 
+static const struct file_operations fops_reset = {
+       .read = read_file_reset,
+       .open = ath9k_debugfs_open,
+       .owner = THIS_MODULE,
+       .llseek = default_llseek,
+};
+
 static ssize_t read_file_recv(struct file *file, char __user *user_buf,
                              size_t count, loff_t *ppos)
 {
 #define PHY_ERR(s, p) \
-       len += snprintf(buf + len, size - len, "%18s : %10u\n", s, \
+       len += snprintf(buf + len, size - len, "%22s : %10u\n", s, \
                        sc->debug.stats.rxstats.phy_err_stats[p]);
 
        struct ath_softc *sc = file->private_data;
        char *buf;
-       unsigned int len = 0, size = 1400;
+       unsigned int len = 0, size = 1600;
        ssize_t retval = 0;
 
        buf = kzalloc(size, GFP_KERNEL);
@@ -948,87 +893,80 @@ static ssize_t read_file_recv(struct file *file, char __user *user_buf,
                return -ENOMEM;
 
        len += snprintf(buf + len, size - len,
-                       "%18s : %10u\n", "CRC ERR",
+                       "%22s : %10u\n", "CRC ERR",
                        sc->debug.stats.rxstats.crc_err);
        len += snprintf(buf + len, size - len,
-                       "%18s : %10u\n", "DECRYPT CRC ERR",
+                       "%22s : %10u\n", "DECRYPT CRC ERR",
                        sc->debug.stats.rxstats.decrypt_crc_err);
        len += snprintf(buf + len, size - len,
-                       "%18s : %10u\n", "PHY ERR",
+                       "%22s : %10u\n", "PHY ERR",
                        sc->debug.stats.rxstats.phy_err);
        len += snprintf(buf + len, size - len,
-                       "%18s : %10u\n", "MIC ERR",
+                       "%22s : %10u\n", "MIC ERR",
                        sc->debug.stats.rxstats.mic_err);
        len += snprintf(buf + len, size - len,
-                       "%18s : %10u\n", "PRE-DELIM CRC ERR",
+                       "%22s : %10u\n", "PRE-DELIM CRC ERR",
                        sc->debug.stats.rxstats.pre_delim_crc_err);
        len += snprintf(buf + len, size - len,
-                       "%18s : %10u\n", "POST-DELIM CRC ERR",
+                       "%22s : %10u\n", "POST-DELIM CRC ERR",
                        sc->debug.stats.rxstats.post_delim_crc_err);
        len += snprintf(buf + len, size - len,
-                       "%18s : %10u\n", "DECRYPT BUSY ERR",
+                       "%22s : %10u\n", "DECRYPT BUSY ERR",
                        sc->debug.stats.rxstats.decrypt_busy_err);
 
+       PHY_ERR("UNDERRUN ERR", ATH9K_PHYERR_UNDERRUN);
+       PHY_ERR("TIMING ERR", ATH9K_PHYERR_TIMING);
+       PHY_ERR("PARITY ERR", ATH9K_PHYERR_PARITY);
+       PHY_ERR("RATE ERR", ATH9K_PHYERR_RATE);
+       PHY_ERR("LENGTH ERR", ATH9K_PHYERR_LENGTH);
+       PHY_ERR("RADAR ERR", ATH9K_PHYERR_RADAR);
+       PHY_ERR("SERVICE ERR", ATH9K_PHYERR_SERVICE);
+       PHY_ERR("TOR ERR", ATH9K_PHYERR_TOR);
+       PHY_ERR("OFDM-TIMING ERR", ATH9K_PHYERR_OFDM_TIMING);
+       PHY_ERR("OFDM-SIGNAL-PARITY ERR", ATH9K_PHYERR_OFDM_SIGNAL_PARITY);
+       PHY_ERR("OFDM-RATE ERR", ATH9K_PHYERR_OFDM_RATE_ILLEGAL);
+       PHY_ERR("OFDM-LENGTH ERR", ATH9K_PHYERR_OFDM_LENGTH_ILLEGAL);
+       PHY_ERR("OFDM-POWER-DROP ERR", ATH9K_PHYERR_OFDM_POWER_DROP);
+       PHY_ERR("OFDM-SERVICE ERR", ATH9K_PHYERR_OFDM_SERVICE);
+       PHY_ERR("OFDM-RESTART ERR", ATH9K_PHYERR_OFDM_RESTART);
+       PHY_ERR("FALSE-RADAR-EXT ERR", ATH9K_PHYERR_FALSE_RADAR_EXT);
+       PHY_ERR("CCK-TIMING ERR", ATH9K_PHYERR_CCK_TIMING);
+       PHY_ERR("CCK-HEADER-CRC ERR", ATH9K_PHYERR_CCK_HEADER_CRC);
+       PHY_ERR("CCK-RATE ERR", ATH9K_PHYERR_CCK_RATE_ILLEGAL);
+       PHY_ERR("CCK-SERVICE ERR", ATH9K_PHYERR_CCK_SERVICE);
+       PHY_ERR("CCK-RESTART ERR", ATH9K_PHYERR_CCK_RESTART);
+       PHY_ERR("CCK-LENGTH ERR", ATH9K_PHYERR_CCK_LENGTH_ILLEGAL);
+       PHY_ERR("CCK-POWER-DROP ERR", ATH9K_PHYERR_CCK_POWER_DROP);
+       PHY_ERR("HT-CRC ERR", ATH9K_PHYERR_HT_CRC_ERROR);
+       PHY_ERR("HT-LENGTH ERR", ATH9K_PHYERR_HT_LENGTH_ILLEGAL);
+       PHY_ERR("HT-RATE ERR", ATH9K_PHYERR_HT_RATE_ILLEGAL);
+
        len += snprintf(buf + len, size - len,
-                       "%18s : %10d\n", "RSSI-CTL0",
+                       "%22s : %10d\n", "RSSI-CTL0",
                        sc->debug.stats.rxstats.rs_rssi_ctl0);
-
        len += snprintf(buf + len, size - len,
-                       "%18s : %10d\n", "RSSI-CTL1",
+                       "%22s : %10d\n", "RSSI-CTL1",
                        sc->debug.stats.rxstats.rs_rssi_ctl1);
-
        len += snprintf(buf + len, size - len,
-                       "%18s : %10d\n", "RSSI-CTL2",
+                       "%22s : %10d\n", "RSSI-CTL2",
                        sc->debug.stats.rxstats.rs_rssi_ctl2);
-
        len += snprintf(buf + len, size - len,
-                       "%18s : %10d\n", "RSSI-EXT0",
+                       "%22s : %10d\n", "RSSI-EXT0",
                        sc->debug.stats.rxstats.rs_rssi_ext0);
-
        len += snprintf(buf + len, size - len,
-                       "%18s : %10d\n", "RSSI-EXT1",
+                       "%22s : %10d\n", "RSSI-EXT1",
                        sc->debug.stats.rxstats.rs_rssi_ext1);
-
        len += snprintf(buf + len, size - len,
-                       "%18s : %10d\n", "RSSI-EXT2",
+                       "%22s : %10d\n", "RSSI-EXT2",
                        sc->debug.stats.rxstats.rs_rssi_ext2);
-
        len += snprintf(buf + len, size - len,
-                       "%18s : %10d\n", "Rx Antenna",
+                       "%22s : %10d\n", "Rx Antenna",
                        sc->debug.stats.rxstats.rs_antenna);
-
-       PHY_ERR("UNDERRUN", ATH9K_PHYERR_UNDERRUN);
-       PHY_ERR("TIMING", ATH9K_PHYERR_TIMING);
-       PHY_ERR("PARITY", ATH9K_PHYERR_PARITY);
-       PHY_ERR("RATE", ATH9K_PHYERR_RATE);
-       PHY_ERR("LENGTH", ATH9K_PHYERR_LENGTH);
-       PHY_ERR("RADAR", ATH9K_PHYERR_RADAR);
-       PHY_ERR("SERVICE", ATH9K_PHYERR_SERVICE);
-       PHY_ERR("TOR", ATH9K_PHYERR_TOR);
-       PHY_ERR("OFDM-TIMING", ATH9K_PHYERR_OFDM_TIMING);
-       PHY_ERR("OFDM-SIGNAL-PARITY", ATH9K_PHYERR_OFDM_SIGNAL_PARITY);
-       PHY_ERR("OFDM-RATE", ATH9K_PHYERR_OFDM_RATE_ILLEGAL);
-       PHY_ERR("OFDM-LENGTH", ATH9K_PHYERR_OFDM_LENGTH_ILLEGAL);
-       PHY_ERR("OFDM-POWER-DROP", ATH9K_PHYERR_OFDM_POWER_DROP);
-       PHY_ERR("OFDM-SERVICE", ATH9K_PHYERR_OFDM_SERVICE);
-       PHY_ERR("OFDM-RESTART", ATH9K_PHYERR_OFDM_RESTART);
-       PHY_ERR("FALSE-RADAR-EXT", ATH9K_PHYERR_FALSE_RADAR_EXT);
-       PHY_ERR("CCK-TIMING", ATH9K_PHYERR_CCK_TIMING);
-       PHY_ERR("CCK-HEADER-CRC", ATH9K_PHYERR_CCK_HEADER_CRC);
-       PHY_ERR("CCK-RATE", ATH9K_PHYERR_CCK_RATE_ILLEGAL);
-       PHY_ERR("CCK-SERVICE", ATH9K_PHYERR_CCK_SERVICE);
-       PHY_ERR("CCK-RESTART", ATH9K_PHYERR_CCK_RESTART);
-       PHY_ERR("CCK-LENGTH", ATH9K_PHYERR_CCK_LENGTH_ILLEGAL);
-       PHY_ERR("CCK-POWER-DROP", ATH9K_PHYERR_CCK_POWER_DROP);
-       PHY_ERR("HT-CRC", ATH9K_PHYERR_HT_CRC_ERROR);
-       PHY_ERR("HT-LENGTH", ATH9K_PHYERR_HT_LENGTH_ILLEGAL);
-       PHY_ERR("HT-RATE", ATH9K_PHYERR_HT_RATE_ILLEGAL);
-
        len += snprintf(buf + len, size - len,
-                       "%18s : %10u\n", "RX-Pkts-All",
+                       "%22s : %10u\n", "RX-Pkts-All",
                        sc->debug.stats.rxstats.rx_pkts_all);
        len += snprintf(buf + len, size - len,
-                       "%18s : %10u\n", "RX-Bytes-All",
+                       "%22s : %10u\n", "RX-Bytes-All",
                        sc->debug.stats.rxstats.rx_bytes_all);
 
        if (len > size)
@@ -1049,8 +987,6 @@ void ath_debug_stat_rx(struct ath_softc *sc, struct ath_rx_status *rs)
 #define RX_SAMP_DBG(c) (sc->debug.bb_mac_samp[sc->debug.sampidx].rs\
                        [sc->debug.rsidx].c)
 
-       u32 phyerr;
-
        RX_STAT_INC(rx_pkts_all);
        sc->debug.stats.rxstats.rx_bytes_all += rs->rs_datalen;
 
@@ -1069,8 +1005,8 @@ void ath_debug_stat_rx(struct ath_softc *sc, struct ath_rx_status *rs)
 
        if (rs->rs_status & ATH9K_RXERR_PHY) {
                RX_STAT_INC(phy_err);
-               phyerr = rs->rs_phyerr & 0x24;
-               RX_PHY_ERR_INC(phyerr);
+               if (rs->rs_phyerr < ATH9K_PHYERR_MAX)
+                       RX_PHY_ERR_INC(rs->rs_phyerr);
        }
 
        sc->debug.stats.rxstats.rs_rssi_ctl0 = rs->rs_rssi_ctl0;
@@ -1637,14 +1573,14 @@ int ath9k_init_debug(struct ath_hw *ah)
                            &fops_dma);
        debugfs_create_file("interrupt", S_IRUSR, sc->debug.debugfs_phy, sc,
                            &fops_interrupt);
-       debugfs_create_file("wiphy", S_IRUSR | S_IWUSR, sc->debug.debugfs_phy,
-                           sc, &fops_wiphy);
        debugfs_create_file("xmit", S_IRUSR, sc->debug.debugfs_phy, sc,
                            &fops_xmit);
        debugfs_create_file("stations", S_IRUSR, sc->debug.debugfs_phy, sc,
                            &fops_stations);
        debugfs_create_file("misc", S_IRUSR, sc->debug.debugfs_phy, sc,
                            &fops_misc);
+       debugfs_create_file("reset", S_IRUSR, sc->debug.debugfs_phy, sc,
+                           &fops_reset);
        debugfs_create_file("recv", S_IRUSR, sc->debug.debugfs_phy, sc,
                            &fops_recv);
        debugfs_create_file("rx_chainmask", S_IRUSR | S_IWUSR,
@@ -1677,10 +1613,5 @@ int ath9k_init_debug(struct ath_hw *ah)
        debugfs_create_u32("gpio_val", S_IRUSR | S_IWUSR,
                           sc->debug.debugfs_phy, &sc->sc_ah->gpio_val);
 
-       sc->debug.regidx = 0;
-       memset(&sc->debug.bb_mac_samp, 0, sizeof(sc->debug.bb_mac_samp));
-       sc->debug.sampidx = 0;
-       sc->debug.tsidx = 0;
-       sc->debug.rsidx = 0;
        return 0;
 }
index 597c84e..63e4c4b 100644 (file)
@@ -110,6 +110,8 @@ void ath_start_rfkill_poll(struct ath_softc *sc)
                wiphy_rfkill_start_polling(sc->hw->wiphy);
 }
 
+#ifdef CONFIG_ATH9K_BTCOEX_SUPPORT
+
 /******************/
 /*     BTCOEX     */
 /******************/
@@ -245,13 +247,10 @@ static void ath_btcoex_no_stomp_timer(void *arg)
        ath9k_ps_restore(sc);
 }
 
-int ath_init_btcoex_timer(struct ath_softc *sc)
+static int ath_init_btcoex_timer(struct ath_softc *sc)
 {
        struct ath_btcoex *btcoex = &sc->btcoex;
 
-       if (ath9k_hw_get_btcoex_scheme(sc->sc_ah) == ATH_BTCOEX_CFG_NONE)
-               return 0;
-
        btcoex->btcoex_period = ATH_BTCOEX_DEF_BT_PERIOD * 1000;
        btcoex->btcoex_no_stomp = (100 - ATH_BTCOEX_DEF_DUTY_CYCLE) *
                btcoex->btcoex_period / 100;
@@ -284,9 +283,6 @@ void ath9k_btcoex_timer_resume(struct ath_softc *sc)
 
        ath_dbg(ath9k_hw_common(ah), BTCOEX, "Starting btcoex timers\n");
 
-       if (ath9k_hw_get_btcoex_scheme(ah) == ATH_BTCOEX_CFG_NONE)
-               return;
-
        /* make sure duty cycle timer is also stopped when resuming */
        if (btcoex->hw_timer_enabled)
                ath9k_gen_timer_stop(sc->sc_ah, btcoex->no_stomp_timer);
@@ -307,9 +303,6 @@ void ath9k_btcoex_timer_pause(struct ath_softc *sc)
        struct ath_btcoex *btcoex = &sc->btcoex;
        struct ath_hw *ah = sc->sc_ah;
 
-       if (ath9k_hw_get_btcoex_scheme(ah) == ATH_BTCOEX_CFG_NONE)
-               return;
-
        del_timer_sync(&btcoex->period_timer);
 
        if (btcoex->hw_timer_enabled)
@@ -317,3 +310,113 @@ void ath9k_btcoex_timer_pause(struct ath_softc *sc)
 
        btcoex->hw_timer_enabled = false;
 }
+
+u16 ath9k_btcoex_aggr_limit(struct ath_softc *sc, u32 max_4ms_framelen)
+{
+       struct ath_mci_profile *mci = &sc->btcoex.mci;
+       u16 aggr_limit = 0;
+
+       if ((sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_MCI) && mci->aggr_limit)
+               aggr_limit = (max_4ms_framelen * mci->aggr_limit) >> 4;
+       else if (sc->sc_flags & SC_OP_BT_PRIORITY_DETECTED)
+               aggr_limit = min((max_4ms_framelen * 3) / 8,
+                                (u32)ATH_AMPDU_LIMIT_MAX);
+
+       return aggr_limit;
+}
+
+void ath9k_btcoex_handle_interrupt(struct ath_softc *sc, u32 status)
+{
+       struct ath_hw *ah = sc->sc_ah;
+
+       if (ath9k_hw_get_btcoex_scheme(ah) == ATH_BTCOEX_CFG_3WIRE)
+               if (status & ATH9K_INT_GENTIMER)
+                       ath_gen_timer_isr(sc->sc_ah);
+
+       if (status & ATH9K_INT_MCI)
+               ath_mci_intr(sc);
+}
+
+void ath9k_start_btcoex(struct ath_softc *sc)
+{
+       struct ath_hw *ah = sc->sc_ah;
+
+       if ((ath9k_hw_get_btcoex_scheme(ah) != ATH_BTCOEX_CFG_NONE) &&
+           !ah->btcoex_hw.enabled) {
+               if (!(sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_MCI))
+                       ath9k_hw_btcoex_set_weight(ah, AR_BT_COEX_WGHT,
+                                                  AR_STOMP_LOW_WLAN_WGHT);
+               ath9k_hw_btcoex_enable(ah);
+
+               if (ath9k_hw_get_btcoex_scheme(ah) == ATH_BTCOEX_CFG_3WIRE)
+                       ath9k_btcoex_timer_resume(sc);
+       }
+}
+
+void ath9k_stop_btcoex(struct ath_softc *sc)
+{
+       struct ath_hw *ah = sc->sc_ah;
+
+       if (ah->btcoex_hw.enabled &&
+           ath9k_hw_get_btcoex_scheme(ah) != ATH_BTCOEX_CFG_NONE) {
+               ath9k_hw_btcoex_disable(ah);
+               if (ath9k_hw_get_btcoex_scheme(ah) == ATH_BTCOEX_CFG_3WIRE)
+                       ath9k_btcoex_timer_pause(sc);
+               ath_mci_flush_profile(&sc->btcoex.mci);
+       }
+}
+
+void ath9k_deinit_btcoex(struct ath_softc *sc)
+{
+        if ((sc->btcoex.no_stomp_timer) &&
+           ath9k_hw_get_btcoex_scheme(sc->sc_ah) == ATH_BTCOEX_CFG_3WIRE)
+               ath_gen_timer_free(sc->sc_ah, sc->btcoex.no_stomp_timer);
+
+       if (ath9k_hw_get_btcoex_scheme(sc->sc_ah) == ATH_BTCOEX_CFG_MCI)
+               ath_mci_cleanup(sc);
+}
+
+int ath9k_init_btcoex(struct ath_softc *sc)
+{
+       struct ath_txq *txq;
+       struct ath_hw *ah = sc->sc_ah;
+       int r;
+
+       ath9k_hw_btcoex_init_scheme(ah);
+
+       switch (ath9k_hw_get_btcoex_scheme(sc->sc_ah)) {
+       case ATH_BTCOEX_CFG_NONE:
+               break;
+       case ATH_BTCOEX_CFG_2WIRE:
+               ath9k_hw_btcoex_init_2wire(sc->sc_ah);
+               break;
+       case ATH_BTCOEX_CFG_3WIRE:
+               ath9k_hw_btcoex_init_3wire(sc->sc_ah);
+               r = ath_init_btcoex_timer(sc);
+               if (r)
+                       return -1;
+               txq = sc->tx.txq_map[WME_AC_BE];
+               ath9k_hw_init_btcoex_hw(sc->sc_ah, txq->axq_qnum);
+               sc->btcoex.bt_stomp_type = ATH_BTCOEX_STOMP_LOW;
+               break;
+       case ATH_BTCOEX_CFG_MCI:
+               sc->btcoex.bt_stomp_type = ATH_BTCOEX_STOMP_LOW;
+               sc->btcoex.duty_cycle = ATH_BTCOEX_DEF_DUTY_CYCLE;
+               INIT_LIST_HEAD(&sc->btcoex.mci.info);
+
+               r = ath_mci_setup(sc);
+               if (r)
+                       return r;
+
+               ath9k_hw_btcoex_init_mci(ah);
+
+               break;
+       default:
+               WARN_ON(1);
+               break;
+       }
+
+       return 0;
+}
+
+#endif /* CONFIG_ATH9K_BTCOEX_SUPPORT */
index 77c8ded..424aabb 100644 (file)
@@ -968,8 +968,7 @@ static void ath9k_hif_usb_dealloc_urbs(struct hif_device_usb *hif_dev)
        ath9k_hif_usb_dealloc_rx_urbs(hif_dev);
 }
 
-static int ath9k_hif_usb_download_fw(struct hif_device_usb *hif_dev,
-                                    u32 drv_info)
+static int ath9k_hif_usb_download_fw(struct hif_device_usb *hif_dev)
 {
        int transfer, err;
        const void *data = hif_dev->firmware->data;
@@ -982,7 +981,7 @@ static int ath9k_hif_usb_download_fw(struct hif_device_usb *hif_dev,
                return -ENOMEM;
 
        while (len) {
-               transfer = min_t(int, len, 4096);
+               transfer = min_t(size_t, len, 4096);
                memcpy(buf, data, transfer);
 
                err = usb_control_msg(hif_dev->udev,
@@ -1000,7 +999,7 @@ static int ath9k_hif_usb_download_fw(struct hif_device_usb *hif_dev,
        }
        kfree(buf);
 
-       if (IS_AR7010_DEVICE(drv_info))
+       if (IS_AR7010_DEVICE(hif_dev->usb_device_id->driver_info))
                firm_offset = AR7010_FIRMWARE_TEXT;
        else
                firm_offset = AR9271_FIRMWARE_TEXT;
@@ -1021,28 +1020,18 @@ static int ath9k_hif_usb_download_fw(struct hif_device_usb *hif_dev,
        return 0;
 }
 
-static int ath9k_hif_usb_dev_init(struct hif_device_usb *hif_dev, u32 drv_info)
+static int ath9k_hif_usb_dev_init(struct hif_device_usb *hif_dev)
 {
-       int ret, idx;
        struct usb_host_interface *alt = &hif_dev->interface->altsetting[0];
        struct usb_endpoint_descriptor *endp;
+       int ret, idx;
 
-       /* Request firmware */
-       ret = request_firmware(&hif_dev->firmware, hif_dev->fw_name,
-                              &hif_dev->udev->dev);
-       if (ret) {
-               dev_err(&hif_dev->udev->dev,
-                       "ath9k_htc: Firmware - %s not found\n", hif_dev->fw_name);
-               goto err_fw_req;
-       }
-
-       /* Download firmware */
-       ret = ath9k_hif_usb_download_fw(hif_dev, drv_info);
+       ret = ath9k_hif_usb_download_fw(hif_dev);
        if (ret) {
                dev_err(&hif_dev->udev->dev,
                        "ath9k_htc: Firmware - %s download failed\n",
                        hif_dev->fw_name);
-               goto err_fw_download;
+               return ret;
        }
 
        /* On downloading the firmware to the target, the USB descriptor of EP4
@@ -1064,23 +1053,84 @@ static int ath9k_hif_usb_dev_init(struct hif_device_usb *hif_dev, u32 drv_info)
        if (ret) {
                dev_err(&hif_dev->udev->dev,
                        "ath9k_htc: Unable to allocate URBs\n");
-               goto err_fw_download;
+               return ret;
        }
 
        return 0;
-
-err_fw_download:
-       release_firmware(hif_dev->firmware);
-err_fw_req:
-       hif_dev->firmware = NULL;
-       return ret;
 }
 
 static void ath9k_hif_usb_dev_deinit(struct hif_device_usb *hif_dev)
 {
        ath9k_hif_usb_dealloc_urbs(hif_dev);
-       if (hif_dev->firmware)
-               release_firmware(hif_dev->firmware);
+}
+
+/*
+ * If initialization fails or the FW cannot be retrieved,
+ * detach the device.
+ */
+static void ath9k_hif_usb_firmware_fail(struct hif_device_usb *hif_dev)
+{
+       struct device *parent = hif_dev->udev->dev.parent;
+
+       complete(&hif_dev->fw_done);
+
+       if (parent)
+               device_lock(parent);
+
+       device_release_driver(&hif_dev->udev->dev);
+
+       if (parent)
+               device_unlock(parent);
+}
+
+static void ath9k_hif_usb_firmware_cb(const struct firmware *fw, void *context)
+{
+       struct hif_device_usb *hif_dev = context;
+       int ret;
+
+       if (!fw) {
+               dev_err(&hif_dev->udev->dev,
+                       "ath9k_htc: Failed to get firmware %s\n",
+                       hif_dev->fw_name);
+               goto err_fw;
+       }
+
+       hif_dev->htc_handle = ath9k_htc_hw_alloc(hif_dev, &hif_usb,
+                                                &hif_dev->udev->dev);
+       if (hif_dev->htc_handle == NULL) {
+               goto err_fw;
+       }
+
+       hif_dev->firmware = fw;
+
+       /* Proceed with initialization */
+
+       ret = ath9k_hif_usb_dev_init(hif_dev);
+       if (ret)
+               goto err_dev_init;
+
+       ret = ath9k_htc_hw_init(hif_dev->htc_handle,
+                               &hif_dev->interface->dev,
+                               hif_dev->usb_device_id->idProduct,
+                               hif_dev->udev->product,
+                               hif_dev->usb_device_id->driver_info);
+       if (ret) {
+               ret = -EINVAL;
+               goto err_htc_hw_init;
+       }
+
+       complete(&hif_dev->fw_done);
+
+       return;
+
+err_htc_hw_init:
+       ath9k_hif_usb_dev_deinit(hif_dev);
+err_dev_init:
+       ath9k_htc_hw_free(hif_dev->htc_handle);
+       release_firmware(fw);
+       hif_dev->firmware = NULL;
+err_fw:
+       ath9k_hif_usb_firmware_fail(hif_dev);
 }
 
 /*
@@ -1155,20 +1205,16 @@ static int ath9k_hif_usb_probe(struct usb_interface *interface,
        }
 
        usb_get_dev(udev);
+
        hif_dev->udev = udev;
        hif_dev->interface = interface;
-       hif_dev->device_id = id->idProduct;
+       hif_dev->usb_device_id = id;
 #ifdef CONFIG_PM
        udev->reset_resume = 1;
 #endif
        usb_set_intfdata(interface, hif_dev);
 
-       hif_dev->htc_handle = ath9k_htc_hw_alloc(hif_dev, &hif_usb,
-                                                &hif_dev->udev->dev);
-       if (hif_dev->htc_handle == NULL) {
-               ret = -ENOMEM;
-               goto err_htc_hw_alloc;
-       }
+       init_completion(&hif_dev->fw_done);
 
        /* Find out which firmware to load */
 
@@ -1177,29 +1223,22 @@ static int ath9k_hif_usb_probe(struct usb_interface *interface,
        else
                hif_dev->fw_name = FIRMWARE_AR9271;
 
-       ret = ath9k_hif_usb_dev_init(hif_dev, id->driver_info);
-       if (ret) {
-               ret = -EINVAL;
-               goto err_hif_init_usb;
-       }
-
-       ret = ath9k_htc_hw_init(hif_dev->htc_handle,
-                               &interface->dev, hif_dev->device_id,
-                               hif_dev->udev->product, id->driver_info);
+       ret = request_firmware_nowait(THIS_MODULE, true, hif_dev->fw_name,
+                                     &hif_dev->udev->dev, GFP_KERNEL,
+                                     hif_dev, ath9k_hif_usb_firmware_cb);
        if (ret) {
-               ret = -EINVAL;
-               goto err_htc_hw_init;
+               dev_err(&hif_dev->udev->dev,
+                       "ath9k_htc: Async request for firmware %s failed\n",
+                       hif_dev->fw_name);
+               goto err_fw_req;
        }
 
-       dev_info(&hif_dev->udev->dev, "ath9k_htc: USB layer initialized\n");
+       dev_info(&hif_dev->udev->dev, "ath9k_htc: Firmware %s requested\n",
+                hif_dev->fw_name);
 
        return 0;
 
-err_htc_hw_init:
-       ath9k_hif_usb_dev_deinit(hif_dev);
-err_hif_init_usb:
-       ath9k_htc_hw_free(hif_dev->htc_handle);
-err_htc_hw_alloc:
+err_fw_req:
        usb_set_intfdata(interface, NULL);
        kfree(hif_dev);
        usb_put_dev(udev);
@@ -1234,9 +1273,15 @@ static void ath9k_hif_usb_disconnect(struct usb_interface *interface)
        if (!hif_dev)
                return;
 
-       ath9k_htc_hw_deinit(hif_dev->htc_handle, unplugged);
-       ath9k_htc_hw_free(hif_dev->htc_handle);
-       ath9k_hif_usb_dev_deinit(hif_dev);
+       wait_for_completion(&hif_dev->fw_done);
+
+       if (hif_dev->firmware) {
+               ath9k_htc_hw_deinit(hif_dev->htc_handle, unplugged);
+               ath9k_htc_hw_free(hif_dev->htc_handle);
+               ath9k_hif_usb_dev_deinit(hif_dev);
+               release_firmware(hif_dev->firmware);
+       }
+
        usb_set_intfdata(interface, NULL);
 
        if (!unplugged && (hif_dev->flags & HIF_USB_START))
@@ -1276,8 +1321,7 @@ static int ath9k_hif_usb_resume(struct usb_interface *interface)
                return ret;
 
        if (hif_dev->firmware) {
-               ret = ath9k_hif_usb_download_fw(hif_dev,
-                               htc_handle->drv_priv->ah->hw_version.usbdev);
+               ret = ath9k_hif_usb_download_fw(hif_dev);
                if (ret)
                        goto fail_resume;
        } else {
index 794f630..487ff65 100644 (file)
@@ -87,10 +87,11 @@ struct cmd_buf {
 #define HIF_USB_START BIT(0)
 
 struct hif_device_usb {
-       u16 device_id;
        struct usb_device *udev;
        struct usb_interface *interface;
+       const struct usb_device_id *usb_device_id;
        const struct firmware *firmware;
+       struct completion fw_done;
        struct htc_target *htc_handle;
        struct hif_usb_tx tx;
        struct usb_anchor regout_submitted;
index da55967..1357952 100644 (file)
@@ -400,9 +400,21 @@ struct ath_btcoex {
        u32 btscan_no_stomp;
 };
 
-void ath_htc_init_btcoex_work(struct ath9k_htc_priv *priv);
-void ath_htc_resume_btcoex_work(struct ath9k_htc_priv *priv);
-void ath_htc_cancel_btcoex_work(struct ath9k_htc_priv *priv);
+#ifdef CONFIG_ATH9K_BTCOEX_SUPPORT
+void ath9k_htc_init_btcoex(struct ath9k_htc_priv *priv, char *product);
+void ath9k_htc_start_btcoex(struct ath9k_htc_priv *priv);
+void ath9k_htc_stop_btcoex(struct ath9k_htc_priv *priv);
+#else
+static inline void ath9k_htc_init_btcoex(struct ath9k_htc_priv *priv, char *product)
+{
+}
+static inline void ath9k_htc_start_btcoex(struct ath9k_htc_priv *priv)
+{
+}
+static inline void ath9k_htc_stop_btcoex(struct ath9k_htc_priv *priv)
+{
+}
+#endif /* CONFIG_ATH9K_BTCOEX_SUPPORT */
 
 #define OP_INVALID                BIT(0)
 #define OP_SCANNING               BIT(1)
@@ -483,7 +495,10 @@ struct ath9k_htc_priv {
        int cabq;
        int hwq_map[WME_NUM_AC];
 
+#ifdef CONFIG_ATH9K_BTCOEX_SUPPORT
        struct ath_btcoex btcoex;
+#endif
+
        struct delayed_work coex_period_work;
        struct delayed_work duty_cycle_work;
 #ifdef CONFIG_ATH9K_HTC_DEBUGFS
index 6506e1f..1c10e2e 100644 (file)
 /*     BTCOEX     */
 /******************/
 
+#define ATH_HTC_BTCOEX_PRODUCT_ID "wb193"
+
+#ifdef CONFIG_ATH9K_BTCOEX_SUPPORT
+
 /*
  * Detects if there is any priority bt traffic
  */
@@ -111,13 +115,10 @@ static void ath_btcoex_duty_cycle_work(struct work_struct *work)
        ath9k_hw_btcoex_enable(priv->ah);
 }
 
-void ath_htc_init_btcoex_work(struct ath9k_htc_priv *priv)
+static void ath_htc_init_btcoex_work(struct ath9k_htc_priv *priv)
 {
        struct ath_btcoex *btcoex = &priv->btcoex;
 
-       if (ath9k_hw_get_btcoex_scheme(priv->ah) == ATH_BTCOEX_CFG_NONE)
-               return;
-
        btcoex->btcoex_period = ATH_BTCOEX_DEF_BT_PERIOD;
        btcoex->btcoex_no_stomp = (100 - ATH_BTCOEX_DEF_DUTY_CYCLE) *
                btcoex->btcoex_period / 100;
@@ -131,14 +132,11 @@ void ath_htc_init_btcoex_work(struct ath9k_htc_priv *priv)
  * (Re)start btcoex work
  */
 
-void ath_htc_resume_btcoex_work(struct ath9k_htc_priv *priv)
+static void ath_htc_resume_btcoex_work(struct ath9k_htc_priv *priv)
 {
        struct ath_btcoex *btcoex = &priv->btcoex;
        struct ath_hw *ah = priv->ah;
 
-       if (ath9k_hw_get_btcoex_scheme(ah) == ATH_BTCOEX_CFG_NONE)
-               return;
-
        ath_dbg(ath9k_hw_common(ah), BTCOEX, "Starting btcoex work\n");
 
        btcoex->bt_priority_cnt = 0;
@@ -151,15 +149,66 @@ void ath_htc_resume_btcoex_work(struct ath9k_htc_priv *priv)
 /*
  * Cancel btcoex and bt duty cycle work.
  */
-void ath_htc_cancel_btcoex_work(struct ath9k_htc_priv *priv)
+static void ath_htc_cancel_btcoex_work(struct ath9k_htc_priv *priv)
 {
-       if (ath9k_hw_get_btcoex_scheme(priv->ah) == ATH_BTCOEX_CFG_NONE)
-               return;
-
        cancel_delayed_work_sync(&priv->coex_period_work);
        cancel_delayed_work_sync(&priv->duty_cycle_work);
 }
 
+void ath9k_htc_start_btcoex(struct ath9k_htc_priv *priv)
+{
+       struct ath_hw *ah = priv->ah;
+
+       if (ath9k_hw_get_btcoex_scheme(ah) == ATH_BTCOEX_CFG_3WIRE) {
+               ath9k_hw_btcoex_set_weight(ah, AR_BT_COEX_WGHT,
+                                          AR_STOMP_LOW_WLAN_WGHT);
+               ath9k_hw_btcoex_enable(ah);
+               ath_htc_resume_btcoex_work(priv);
+       }
+}
+
+void ath9k_htc_stop_btcoex(struct ath9k_htc_priv *priv)
+{
+       struct ath_hw *ah = priv->ah;
+
+       if (ah->btcoex_hw.enabled &&
+           ath9k_hw_get_btcoex_scheme(ah) != ATH_BTCOEX_CFG_NONE) {
+               ath9k_hw_btcoex_disable(ah);
+               if (ah->btcoex_hw.scheme == ATH_BTCOEX_CFG_3WIRE)
+                       ath_htc_cancel_btcoex_work(priv);
+       }
+}
+
+void ath9k_htc_init_btcoex(struct ath9k_htc_priv *priv, char *product)
+{
+       struct ath_hw *ah = priv->ah;
+       int qnum;
+
+       if (product && strncmp(product, ATH_HTC_BTCOEX_PRODUCT_ID, 5) == 0) {
+               ah->btcoex_hw.scheme = ATH_BTCOEX_CFG_3WIRE;
+       }
+
+       switch (ath9k_hw_get_btcoex_scheme(priv->ah)) {
+       case ATH_BTCOEX_CFG_NONE:
+               break;
+       case ATH_BTCOEX_CFG_3WIRE:
+               priv->ah->btcoex_hw.btactive_gpio = 7;
+               priv->ah->btcoex_hw.btpriority_gpio = 6;
+               priv->ah->btcoex_hw.wlanactive_gpio = 8;
+               priv->btcoex.bt_stomp_type = ATH_BTCOEX_STOMP_LOW;
+               ath9k_hw_btcoex_init_3wire(priv->ah);
+               ath_htc_init_btcoex_work(priv);
+               qnum = priv->hwq_map[WME_AC_BE];
+               ath9k_hw_init_btcoex_hw(priv->ah, qnum);
+               break;
+       default:
+               WARN_ON(1);
+               break;
+       }
+}
+
+#endif /* CONFIG_ATH9K_BTCOEX_SUPPORT */
+
 /*******/
 /* LED */
 /*******/
index 9be10a2..de5ee15 100644 (file)
@@ -41,8 +41,6 @@ MODULE_PARM_DESC(nohwcrypt, "Disable hardware encryption");
        .max_power = 20, \
 }
 
-#define ATH_HTC_BTCOEX_PRODUCT_ID "wb193"
-
 static struct ieee80211_channel ath9k_2ghz_channels[] = {
        CHAN2G(2412, 0), /* Channel 1 */
        CHAN2G(2417, 1), /* Channel 2 */
@@ -603,29 +601,6 @@ static void ath9k_init_misc(struct ath9k_htc_priv *priv)
        priv->ah->opmode = NL80211_IFTYPE_STATION;
 }
 
-static void ath9k_init_btcoex(struct ath9k_htc_priv *priv)
-{
-       int qnum;
-
-       switch (ath9k_hw_get_btcoex_scheme(priv->ah)) {
-       case ATH_BTCOEX_CFG_NONE:
-               break;
-       case ATH_BTCOEX_CFG_3WIRE:
-               priv->ah->btcoex_hw.btactive_gpio = 7;
-               priv->ah->btcoex_hw.btpriority_gpio = 6;
-               priv->ah->btcoex_hw.wlanactive_gpio = 8;
-               priv->btcoex.bt_stomp_type = ATH_BTCOEX_STOMP_LOW;
-               ath9k_hw_btcoex_init_3wire(priv->ah);
-               ath_htc_init_btcoex_work(priv);
-               qnum = priv->hwq_map[WME_AC_BE];
-               ath9k_hw_init_btcoex_hw(priv->ah, qnum);
-               break;
-       default:
-               WARN_ON(1);
-               break;
-       }
-}
-
 static int ath9k_init_priv(struct ath9k_htc_priv *priv,
                           u16 devid, char *product,
                           u32 drv_info)
@@ -698,12 +673,7 @@ static int ath9k_init_priv(struct ath9k_htc_priv *priv,
        ath9k_cmn_init_crypto(ah);
        ath9k_init_channels_rates(priv);
        ath9k_init_misc(priv);
-
-       if (product && strncmp(product, ATH_HTC_BTCOEX_PRODUCT_ID, 5) == 0) {
-               ah->btcoex_hw.scheme = ATH_BTCOEX_CFG_3WIRE;
-               if (ath9k_hw_get_btcoex_scheme(ah) != ATH_BTCOEX_CFG_NONE)
-                       ath9k_init_btcoex(priv);
-       }
+       ath9k_htc_init_btcoex(priv, product);
 
        return 0;
 
@@ -741,6 +711,8 @@ static void ath9k_set_hw_capab(struct ath9k_htc_priv *priv,
 
        hw->wiphy->flags &= ~WIPHY_FLAG_PS_ON_BY_DEFAULT;
 
+       hw->wiphy->flags |= WIPHY_FLAG_IBSS_RSN;
+
        hw->queues = 4;
        hw->channel_change_time = 5000;
        hw->max_listen_interval = 10;
index ef4c606..2a29a7c 100644 (file)
@@ -957,12 +957,8 @@ static int ath9k_htc_start(struct ieee80211_hw *hw)
        mod_timer(&priv->tx.cleanup_timer,
                  jiffies + msecs_to_jiffies(ATH9K_HTC_TX_CLEANUP_INTERVAL));
 
-       if (ath9k_hw_get_btcoex_scheme(ah) == ATH_BTCOEX_CFG_3WIRE) {
-               ath9k_hw_btcoex_set_weight(ah, AR_BT_COEX_WGHT,
-                                          AR_STOMP_LOW_WLAN_WGHT);
-               ath9k_hw_btcoex_enable(ah);
-               ath_htc_resume_btcoex_work(priv);
-       }
+       ath9k_htc_start_btcoex(priv);
+
        mutex_unlock(&priv->mutex);
 
        return ret;
@@ -1009,12 +1005,7 @@ static void ath9k_htc_stop(struct ieee80211_hw *hw)
 
        mutex_lock(&priv->mutex);
 
-       if (ah->btcoex_hw.enabled &&
-           ath9k_hw_get_btcoex_scheme(ah) != ATH_BTCOEX_CFG_NONE) {
-               ath9k_hw_btcoex_disable(ah);
-               if (ah->btcoex_hw.scheme == ATH_BTCOEX_CFG_3WIRE)
-                       ath_htc_cancel_btcoex_work(priv);
-       }
+       ath9k_htc_stop_btcoex(priv);
 
        /* Remove a monitor interface if it's present. */
        if (priv->ah->is_monitoring)
@@ -1409,6 +1400,21 @@ static int ath9k_htc_set_key(struct ieee80211_hw *hw,
        if (htc_modparam_nohwcrypt)
                return -ENOSPC;
 
+       if ((vif->type == NL80211_IFTYPE_ADHOC ||
+            vif->type == NL80211_IFTYPE_MESH_POINT) &&
+           (key->cipher == WLAN_CIPHER_SUITE_TKIP ||
+            key->cipher == WLAN_CIPHER_SUITE_CCMP) &&
+           !(key->flags & IEEE80211_KEY_FLAG_PAIRWISE)) {
+               /*
+                * For now, disable hw crypto for the RSN IBSS group keys. This
+                * could be optimized in the future to use a modified key cache
+                * design to support per-STA RX GTK, but until that gets
+                * implemented, use of software crypto for group addressed
+                * frames is a acceptable to allow RSN IBSS to be used.
+                */
+               return -EOPNOTSUPP;
+       }
+
        mutex_lock(&priv->mutex);
        ath_dbg(common, CONFIG, "Set HW Key\n");
        ath9k_htc_ps_wakeup(priv);
index 1b90ed8..c25226a 100644 (file)
@@ -431,11 +431,8 @@ struct htc_target *ath9k_htc_hw_alloc(void *hif_handle,
        struct htc_target *target;
 
        target = kzalloc(sizeof(struct htc_target), GFP_KERNEL);
-       if (!target) {
-               printk(KERN_ERR "Unable to allocate memory for"
-                       "target device\n");
+       if (!target)
                return NULL;
-       }
 
        init_completion(&target->target_wait);
        init_completion(&target->cmd_wait);
index c4ad0b0..265bf77 100644 (file)
@@ -24,7 +24,7 @@
 static inline void ath9k_hw_configpcipowersave(struct ath_hw *ah,
                                               bool power_off)
 {
-       if (ah->aspm_enabled != true)
+       if (!ah->aspm_enabled)
                return;
 
        ath9k_hw_ops(ah)->config_pci_powersave(ah, power_off);
index 87db1ee..5c57568 100644 (file)
@@ -23,6 +23,7 @@
 #include "hw-ops.h"
 #include "rc.h"
 #include "ar9003_mac.h"
+#include "ar9003_mci.h"
 
 static bool ath9k_hw_set_reset_reg(struct ath_hw *ah, u32 type);
 
@@ -1518,61 +1519,22 @@ int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan,
                   struct ath9k_hw_cal_data *caldata, bool bChannelChange)
 {
        struct ath_common *common = ath9k_hw_common(ah);
-       struct ath9k_hw_mci *mci_hw = &ah->btcoex_hw.mci;
        u32 saveLedState;
        struct ath9k_channel *curchan = ah->curchan;
        u32 saveDefAntenna;
        u32 macStaId1;
        u64 tsf = 0;
        int i, r;
-       bool allow_fbs = false;
+       bool allow_fbs = false, start_mci_reset = false;
        bool mci = !!(ah->caps.hw_caps & ATH9K_HW_CAP_MCI);
        bool save_fullsleep = ah->chip_fullsleep;
 
        if (mci) {
-
-               ar9003_mci_2g5g_changed(ah, IS_CHAN_2GHZ(chan));
-
-               if (mci_hw->bt_state == MCI_BT_CAL_START) {
-                       u32 payload[4] = {0, 0, 0, 0};
-
-                       ath_dbg(common, MCI, "MCI stop rx for BT CAL\n");
-
-                       mci_hw->bt_state = MCI_BT_CAL;
-
-                       /*
-                        * MCI FIX: disable mci interrupt here. This is to avoid
-                        * SW_MSG_DONE or RX_MSG bits to trigger MCI_INT and
-                        * lead to mci_intr reentry.
-                        */
-
-                       ar9003_mci_disable_interrupt(ah);
-
-                       ath_dbg(common, MCI, "send WLAN_CAL_GRANT\n");
-                       MCI_GPM_SET_CAL_TYPE(payload, MCI_GPM_WLAN_CAL_GRANT);
-                       ar9003_mci_send_message(ah, MCI_GPM, 0, payload,
-                                               16, true, false);
-
-                       ath_dbg(common, MCI, "\nMCI BT is calibrating\n");
-
-                       /* Wait BT calibration to be completed for 25ms */
-
-                       if (ar9003_mci_wait_for_gpm(ah, MCI_GPM_BT_CAL_DONE,
-                                                                 0, 25000))
-                               ath_dbg(common, MCI,
-                                       "MCI got BT_CAL_DONE\n");
-                       else
-                               ath_dbg(common, MCI,
-                                       "MCI ### BT cal takes to long, force bt_state to be bt_awake\n");
-                       mci_hw->bt_state = MCI_BT_AWAKE;
-                       /* MCI FIX: enable mci interrupt here */
-                       ar9003_mci_enable_interrupt(ah);
-
-                       return true;
-               }
+               start_mci_reset = ar9003_mci_start_reset(ah, chan);
+               if (start_mci_reset)
+                       return 0;
        }
 
-
        if (!ath9k_hw_setpower(ah, ATH9K_PM_AWAKE))
                return -EIO;
 
@@ -1600,7 +1562,7 @@ int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan,
                allow_fbs = true;
 
        if (bChannelChange &&
-           (ah->chip_fullsleep != true) &&
+           (!ah->chip_fullsleep) &&
            (ah->curchan != NULL) &&
            (chan->channel != ah->curchan->channel) &&
            (allow_fbs ||
@@ -1609,7 +1571,7 @@ int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan,
                if (ath9k_hw_channel_change(ah, chan)) {
                        ath9k_hw_loadnf(ah, ah->curchan);
                        ath9k_hw_start_nfcal(ah, true);
-                       if (mci && mci_hw->ready)
+                       if (mci && ar9003_mci_is_ready(ah))
                                ar9003_mci_2g5g_switch(ah, true);
 
                        if (AR_SREV_9271(ah))
@@ -1618,19 +1580,8 @@ int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan,
                }
        }
 
-       if (mci) {
-               ar9003_mci_disable_interrupt(ah);
-
-               if (mci_hw->ready && !save_fullsleep) {
-                       ar9003_mci_mute_bt(ah);
-                       udelay(20);
-                       REG_WRITE(ah, AR_BTCOEX_CTRL, 0);
-               }
-
-               mci_hw->bt_state = MCI_BT_SLEEP;
-               mci_hw->ready = false;
-       }
-
+       if (mci)
+               ar9003_mci_stop_bt(ah, save_fullsleep);
 
        saveDefAntenna = REG_READ(ah, AR_DEF_ANTENNA);
        if (saveDefAntenna == 0)
@@ -1807,53 +1758,8 @@ int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan,
        ath9k_hw_loadnf(ah, chan);
        ath9k_hw_start_nfcal(ah, true);
 
-       if (mci && mci_hw->ready) {
-
-               if (IS_CHAN_2GHZ(chan) &&
-                   (mci_hw->bt_state == MCI_BT_SLEEP)) {
-
-                       if (ar9003_mci_check_int(ah,
-                           AR_MCI_INTERRUPT_RX_MSG_REMOTE_RESET) ||
-                           ar9003_mci_check_int(ah,
-                           AR_MCI_INTERRUPT_RX_MSG_REQ_WAKE)) {
-
-                               /*
-                                * BT is sleeping. Check if BT wakes up during
-                                * WLAN calibration. If BT wakes up during
-                                * WLAN calibration, need to go through all
-                                * message exchanges again and recal.
-                                */
-
-                               ath_dbg(common, MCI,
-                                       "MCI BT wakes up during WLAN calibration\n");
-
-                               REG_WRITE(ah, AR_MCI_INTERRUPT_RX_MSG_RAW,
-                                         AR_MCI_INTERRUPT_RX_MSG_REMOTE_RESET |
-                                         AR_MCI_INTERRUPT_RX_MSG_REQ_WAKE);
-                               ath_dbg(common, MCI, "MCI send REMOTE_RESET\n");
-                               ar9003_mci_remote_reset(ah, true);
-                               ar9003_mci_send_sys_waking(ah, true);
-                               udelay(1);
-                               if (IS_CHAN_2GHZ(chan))
-                                       ar9003_mci_send_lna_transfer(ah, true);
-
-                               mci_hw->bt_state = MCI_BT_AWAKE;
-
-                               ath_dbg(common, MCI, "MCI re-cal\n");
-
-                               if (caldata) {
-                                       caldata->done_txiqcal_once = false;
-                                       caldata->done_txclcal_once = false;
-                                       caldata->rtt_hist.num_readings = 0;
-                               }
-
-                               if (!ath9k_hw_init_cal(ah, chan))
-                                       return -EIO;
-
-                       }
-               }
-               ar9003_mci_enable_interrupt(ah);
-       }
+       if (mci && ar9003_mci_end_reset(ah, chan, caldata))
+               return -EIO;
 
        ENABLE_REGWRITE_BUFFER(ah);
 
@@ -1894,24 +1800,11 @@ int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan,
 #endif
        }
 
-       if (ah->btcoex_hw.enabled &&
-           ath9k_hw_get_btcoex_scheme(ah) != ATH_BTCOEX_CFG_NONE)
+       if (ath9k_hw_btcoex_is_enabled(ah))
                ath9k_hw_btcoex_enable(ah);
 
-       if (mci && mci_hw->ready) {
-               /*
-                * check BT state again to make
-                * sure it's not changed.
-                */
-
-               ar9003_mci_sync_bt_state(ah);
-               ar9003_mci_2g5g_switch(ah, true);
-
-               if ((mci_hw->bt_state == MCI_BT_AWAKE) &&
-                               (mci_hw->query_bt == true)) {
-                       mci_hw->need_flush_btinfo = true;
-               }
-       }
+       if (mci)
+               ar9003_mci_check_bt(ah);
 
        if (AR_SREV_9300_20_OR_LATER(ah)) {
                ar9003_hw_bb_watchdog_config(ah);
@@ -1962,8 +1855,7 @@ static void ath9k_set_power_sleep(struct ath_hw *ah, int setChip)
                        REG_WRITE(ah, AR_RC, AR_RC_AHB | AR_RC_HOSTIF);
 
                /* Shutdown chip. Active low */
-               if (!AR_SREV_5416(ah) &&
-                               !AR_SREV_9271(ah) && !AR_SREV_9462_10(ah)) {
+               if (!AR_SREV_5416(ah) && !AR_SREV_9271(ah)) {
                        REG_CLR_BIT(ah, AR_RTC_RESET, AR_RTC_RESET_EN);
                        udelay(2);
                }
@@ -2038,8 +1930,7 @@ static bool ath9k_hw_set_power_awake(struct ath_hw *ah, int setChip)
        if (setChip) {
                if ((REG_READ(ah, AR_RTC_STATUS) &
                     AR_RTC_STATUS_M) == AR_RTC_STATUS_SHUTDOWN) {
-                       if (ath9k_hw_set_reset_reg(ah,
-                                          ATH9K_RESET_POWER_ON) != true) {
+                       if (!ath9k_hw_set_reset_reg(ah, ATH9K_RESET_POWER_ON)) {
                                return false;
                        }
                        if (!AR_SREV_9300_20_OR_LATER(ah))
@@ -2077,7 +1968,6 @@ static bool ath9k_hw_set_power_awake(struct ath_hw *ah, int setChip)
 bool ath9k_hw_setpower(struct ath_hw *ah, enum ath9k_power_mode mode)
 {
        struct ath_common *common = ath9k_hw_common(ah);
-       struct ath9k_hw_mci *mci = &ah->btcoex_hw.mci;
        int status = true, setChip = true;
        static const char *modes[] = {
                "AWAKE",
@@ -2101,20 +1991,8 @@ bool ath9k_hw_setpower(struct ath_hw *ah, enum ath9k_power_mode mode)
 
                break;
        case ATH9K_PM_FULL_SLEEP:
-
-               if (ah->caps.hw_caps & ATH9K_HW_CAP_MCI) {
-                       if (ar9003_mci_state(ah, MCI_STATE_ENABLE, NULL) &&
-                               (mci->bt_state != MCI_BT_SLEEP) &&
-                               !mci->halted_bt_gpm) {
-                               ath_dbg(common, MCI,
-                                       "MCI halt BT GPM (full_sleep)\n");
-                               ar9003_mci_send_coex_halt_bt_gpm(ah,
-                                                                true, true);
-                       }
-
-                       mci->ready = false;
-                       REG_WRITE(ah, AR_RTC_KEEP_AWAKE, 0x2);
-               }
+               if (ah->caps.hw_caps & ATH9K_HW_CAP_MCI)
+                       ar9003_mci_set_full_sleep(ah);
 
                ath9k_set_power_sleep(ah, setChip);
                ah->chip_fullsleep = true;
@@ -2304,7 +2182,6 @@ int ath9k_hw_fill_cap_info(struct ath_hw *ah)
        struct ath9k_hw_capabilities *pCap = &ah->caps;
        struct ath_regulatory *regulatory = ath9k_hw_regulatory(ah);
        struct ath_common *common = ath9k_hw_common(ah);
-       struct ath_btcoex_hw *btcoex_hw = &ah->btcoex_hw;
        unsigned int chip_chainmask;
 
        u16 eeval;
@@ -2423,30 +2300,6 @@ int ath9k_hw_fill_cap_info(struct ath_hw *ah)
        else
                pCap->hw_caps |= ATH9K_HW_CAP_4KB_SPLITTRANS;
 
-       if (common->btcoex_enabled) {
-               if (AR_SREV_9462(ah))
-                       btcoex_hw->scheme = ATH_BTCOEX_CFG_MCI;
-               else if (AR_SREV_9300_20_OR_LATER(ah)) {
-                       btcoex_hw->scheme = ATH_BTCOEX_CFG_3WIRE;
-                       btcoex_hw->btactive_gpio = ATH_BTACTIVE_GPIO_9300;
-                       btcoex_hw->wlanactive_gpio = ATH_WLANACTIVE_GPIO_9300;
-                       btcoex_hw->btpriority_gpio = ATH_BTPRIORITY_GPIO_9300;
-               } else if (AR_SREV_9280_20_OR_LATER(ah)) {
-                       btcoex_hw->btactive_gpio = ATH_BTACTIVE_GPIO_9280;
-                       btcoex_hw->wlanactive_gpio = ATH_WLANACTIVE_GPIO_9280;
-
-                       if (AR_SREV_9285(ah)) {
-                               btcoex_hw->scheme = ATH_BTCOEX_CFG_3WIRE;
-                               btcoex_hw->btpriority_gpio =
-                                               ATH_BTPRIORITY_GPIO_9285;
-                       } else {
-                               btcoex_hw->scheme = ATH_BTCOEX_CFG_2WIRE;
-                       }
-               }
-       } else {
-               btcoex_hw->scheme = ATH_BTCOEX_CFG_NONE;
-       }
-
        if (AR_SREV_9300_20_OR_LATER(ah)) {
                pCap->hw_caps |= ATH9K_HW_CAP_EDMA | ATH9K_HW_CAP_FASTCLOCK;
                if (!AR_SREV_9330(ah) && !AR_SREV_9485(ah))
index c8261d4..1707137 100644 (file)
@@ -209,11 +209,7 @@ enum ath9k_hw_caps {
        ATH9K_HW_CAP_5GHZ                       = BIT(12),
        ATH9K_HW_CAP_APM                        = BIT(13),
        ATH9K_HW_CAP_RTT                        = BIT(14),
-#ifdef CONFIG_ATH9K_BTCOEX_SUPPORT
        ATH9K_HW_CAP_MCI                        = BIT(15),
-#else
-       ATH9K_HW_CAP_MCI                        = 0,
-#endif
        ATH9K_HW_CAP_DFS                        = BIT(16),
 };
 
@@ -432,161 +428,6 @@ enum ath9k_rx_qtype {
        ATH9K_RX_QUEUE_MAX,
 };
 
-enum mci_message_header {              /* length of payload */
-       MCI_LNA_CTRL     = 0x10,        /* len = 0 */
-       MCI_CONT_NACK    = 0x20,        /* len = 0 */
-       MCI_CONT_INFO    = 0x30,        /* len = 4 */
-       MCI_CONT_RST     = 0x40,        /* len = 0 */
-       MCI_SCHD_INFO    = 0x50,        /* len = 16 */
-       MCI_CPU_INT      = 0x60,        /* len = 4 */
-       MCI_SYS_WAKING   = 0x70,        /* len = 0 */
-       MCI_GPM          = 0x80,        /* len = 16 */
-       MCI_LNA_INFO     = 0x90,        /* len = 1 */
-       MCI_LNA_STATE    = 0x94,
-       MCI_LNA_TAKE     = 0x98,
-       MCI_LNA_TRANS    = 0x9c,
-       MCI_SYS_SLEEPING = 0xa0,        /* len = 0 */
-       MCI_REQ_WAKE     = 0xc0,        /* len = 0 */
-       MCI_DEBUG_16     = 0xfe,        /* len = 2 */
-       MCI_REMOTE_RESET = 0xff         /* len = 16 */
-};
-
-enum ath_mci_gpm_coex_profile_type {
-       MCI_GPM_COEX_PROFILE_UNKNOWN,
-       MCI_GPM_COEX_PROFILE_RFCOMM,
-       MCI_GPM_COEX_PROFILE_A2DP,
-       MCI_GPM_COEX_PROFILE_HID,
-       MCI_GPM_COEX_PROFILE_BNEP,
-       MCI_GPM_COEX_PROFILE_VOICE,
-       MCI_GPM_COEX_PROFILE_MAX
-};
-
-/* MCI GPM/Coex opcode/type definitions */
-enum {
-       MCI_GPM_COEX_W_GPM_PAYLOAD      = 1,
-       MCI_GPM_COEX_B_GPM_TYPE         = 4,
-       MCI_GPM_COEX_B_GPM_OPCODE       = 5,
-       /* MCI_GPM_WLAN_CAL_REQ, MCI_GPM_WLAN_CAL_DONE */
-       MCI_GPM_WLAN_CAL_W_SEQUENCE     = 2,
-
-       /* MCI_GPM_COEX_VERSION_QUERY */
-       /* MCI_GPM_COEX_VERSION_RESPONSE */
-       MCI_GPM_COEX_B_MAJOR_VERSION    = 6,
-       MCI_GPM_COEX_B_MINOR_VERSION    = 7,
-       /* MCI_GPM_COEX_STATUS_QUERY */
-       MCI_GPM_COEX_B_BT_BITMAP        = 6,
-       MCI_GPM_COEX_B_WLAN_BITMAP      = 7,
-       /* MCI_GPM_COEX_HALT_BT_GPM */
-       MCI_GPM_COEX_B_HALT_STATE       = 6,
-       /* MCI_GPM_COEX_WLAN_CHANNELS */
-       MCI_GPM_COEX_B_CHANNEL_MAP      = 6,
-       /* MCI_GPM_COEX_BT_PROFILE_INFO */
-       MCI_GPM_COEX_B_PROFILE_TYPE     = 6,
-       MCI_GPM_COEX_B_PROFILE_LINKID   = 7,
-       MCI_GPM_COEX_B_PROFILE_STATE    = 8,
-       MCI_GPM_COEX_B_PROFILE_ROLE     = 9,
-       MCI_GPM_COEX_B_PROFILE_RATE     = 10,
-       MCI_GPM_COEX_B_PROFILE_VOTYPE   = 11,
-       MCI_GPM_COEX_H_PROFILE_T        = 12,
-       MCI_GPM_COEX_B_PROFILE_W        = 14,
-       MCI_GPM_COEX_B_PROFILE_A        = 15,
-       /* MCI_GPM_COEX_BT_STATUS_UPDATE */
-       MCI_GPM_COEX_B_STATUS_TYPE      = 6,
-       MCI_GPM_COEX_B_STATUS_LINKID    = 7,
-       MCI_GPM_COEX_B_STATUS_STATE     = 8,
-       /* MCI_GPM_COEX_BT_UPDATE_FLAGS */
-       MCI_GPM_COEX_W_BT_FLAGS         = 6,
-       MCI_GPM_COEX_B_BT_FLAGS_OP      = 10
-};
-
-enum mci_gpm_subtype {
-       MCI_GPM_BT_CAL_REQ      = 0,
-       MCI_GPM_BT_CAL_GRANT    = 1,
-       MCI_GPM_BT_CAL_DONE     = 2,
-       MCI_GPM_WLAN_CAL_REQ    = 3,
-       MCI_GPM_WLAN_CAL_GRANT  = 4,
-       MCI_GPM_WLAN_CAL_DONE   = 5,
-       MCI_GPM_COEX_AGENT      = 0x0c,
-       MCI_GPM_RSVD_PATTERN    = 0xfe,
-       MCI_GPM_RSVD_PATTERN32  = 0xfefefefe,
-       MCI_GPM_BT_DEBUG        = 0xff
-};
-
-enum mci_bt_state {
-       MCI_BT_SLEEP,
-       MCI_BT_AWAKE,
-       MCI_BT_CAL_START,
-       MCI_BT_CAL
-};
-
-/* Type of state query */
-enum mci_state_type {
-       MCI_STATE_ENABLE,
-       MCI_STATE_INIT_GPM_OFFSET,
-       MCI_STATE_NEXT_GPM_OFFSET,
-       MCI_STATE_LAST_GPM_OFFSET,
-       MCI_STATE_BT,
-       MCI_STATE_SET_BT_SLEEP,
-       MCI_STATE_SET_BT_AWAKE,
-       MCI_STATE_SET_BT_CAL_START,
-       MCI_STATE_SET_BT_CAL,
-       MCI_STATE_LAST_SCHD_MSG_OFFSET,
-       MCI_STATE_REMOTE_SLEEP,
-       MCI_STATE_CONT_RSSI_POWER,
-       MCI_STATE_CONT_PRIORITY,
-       MCI_STATE_CONT_TXRX,
-       MCI_STATE_RESET_REQ_WAKE,
-       MCI_STATE_SEND_WLAN_COEX_VERSION,
-       MCI_STATE_SET_BT_COEX_VERSION,
-       MCI_STATE_SEND_WLAN_CHANNELS,
-       MCI_STATE_SEND_VERSION_QUERY,
-       MCI_STATE_SEND_STATUS_QUERY,
-       MCI_STATE_NEED_FLUSH_BT_INFO,
-       MCI_STATE_SET_CONCUR_TX_PRI,
-       MCI_STATE_RECOVER_RX,
-       MCI_STATE_NEED_FTP_STOMP,
-       MCI_STATE_NEED_TUNING,
-       MCI_STATE_DEBUG,
-       MCI_STATE_MAX
-};
-
-enum mci_gpm_coex_opcode {
-       MCI_GPM_COEX_VERSION_QUERY,
-       MCI_GPM_COEX_VERSION_RESPONSE,
-       MCI_GPM_COEX_STATUS_QUERY,
-       MCI_GPM_COEX_HALT_BT_GPM,
-       MCI_GPM_COEX_WLAN_CHANNELS,
-       MCI_GPM_COEX_BT_PROFILE_INFO,
-       MCI_GPM_COEX_BT_STATUS_UPDATE,
-       MCI_GPM_COEX_BT_UPDATE_FLAGS
-};
-
-#define MCI_GPM_NOMORE  0
-#define MCI_GPM_MORE    1
-#define MCI_GPM_INVALID 0xffffffff
-
-#define MCI_GPM_RECYCLE(_p_gpm)        do {                      \
-       *(((u32 *)_p_gpm) + MCI_GPM_COEX_W_GPM_PAYLOAD) = \
-                               MCI_GPM_RSVD_PATTERN32;   \
-} while (0)
-
-#define MCI_GPM_TYPE(_p_gpm)   \
-       (*(((u8 *)(_p_gpm)) + MCI_GPM_COEX_B_GPM_TYPE) & 0xff)
-
-#define MCI_GPM_OPCODE(_p_gpm) \
-       (*(((u8 *)(_p_gpm)) + MCI_GPM_COEX_B_GPM_OPCODE) & 0xff)
-
-#define MCI_GPM_SET_CAL_TYPE(_p_gpm, _cal_type)        do {                       \
-       *(((u8 *)(_p_gpm)) + MCI_GPM_COEX_B_GPM_TYPE) = (_cal_type) & 0xff;\
-} while (0)
-
-#define MCI_GPM_SET_TYPE_OPCODE(_p_gpm, _type, _opcode) do {              \
-       *(((u8 *)(_p_gpm)) + MCI_GPM_COEX_B_GPM_TYPE) = (_type) & 0xff;    \
-       *(((u8 *)(_p_gpm)) + MCI_GPM_COEX_B_GPM_OPCODE) = (_opcode) & 0xff;\
-} while (0)
-
-#define MCI_GPM_IS_CAL_TYPE(_type) ((_type) <= MCI_GPM_WLAN_CAL_DONE)
-
 struct ath9k_beacon_state {
        u32 bs_nexttbtt;
        u32 bs_nextdtim;
@@ -956,8 +797,9 @@ struct ath_hw {
        int firpwr[5];
        enum ath9k_ani_cmd ani_function;
 
-       /* Bluetooth coexistance */
+#ifdef CONFIG_ATH9K_BTCOEX_SUPPORT
        struct ath_btcoex_hw btcoex_hw;
+#endif
 
        u32 intr_txqs;
        u8 txchainmask;
@@ -1205,41 +1047,31 @@ void ath9k_ani_reset(struct ath_hw *ah, bool is_scanning);
 void ath9k_hw_proc_mib_event(struct ath_hw *ah);
 void ath9k_hw_ani_monitor(struct ath_hw *ah, struct ath9k_channel *chan);
 
-bool ar9003_mci_send_message(struct ath_hw *ah, u8 header, u32 flag,
-                            u32 *payload, u8 len, bool wait_done,
-                            bool check_bt);
-void ar9003_mci_mute_bt(struct ath_hw *ah);
-u32 ar9003_mci_state(struct ath_hw *ah, u32 state_type, u32 *p_data);
-void ar9003_mci_setup(struct ath_hw *ah, u32 gpm_addr, void *gpm_buf,
-                     u16 len, u32 sched_addr);
-void ar9003_mci_cleanup(struct ath_hw *ah);
-void ar9003_mci_send_coex_halt_bt_gpm(struct ath_hw *ah, bool halt,
-                                     bool wait_done);
-u32 ar9003_mci_wait_for_gpm(struct ath_hw *ah, u8 gpm_type,
-                           u8 gpm_opcode, int time_out);
-void ar9003_mci_2g5g_changed(struct ath_hw *ah, bool is_2g);
-void ar9003_mci_disable_interrupt(struct ath_hw *ah);
-void ar9003_mci_enable_interrupt(struct ath_hw *ah);
-void ar9003_mci_2g5g_switch(struct ath_hw *ah, bool wait_done);
-void ar9003_mci_reset(struct ath_hw *ah, bool en_int, bool is_2g,
-                     bool is_full_sleep);
-bool ar9003_mci_check_int(struct ath_hw *ah, u32 ints);
-void ar9003_mci_remote_reset(struct ath_hw *ah, bool wait_done);
-void ar9003_mci_send_sys_waking(struct ath_hw *ah, bool wait_done);
-void ar9003_mci_send_lna_transfer(struct ath_hw *ah, bool wait_done);
-void ar9003_mci_sync_bt_state(struct ath_hw *ah);
-void ar9003_mci_get_interrupt(struct ath_hw *ah, u32 *raw_intr,
-                             u32 *rx_msg_intr);
-
 #ifdef CONFIG_ATH9K_BTCOEX_SUPPORT
+static inline bool ath9k_hw_btcoex_is_enabled(struct ath_hw *ah)
+{
+       return ah->btcoex_hw.enabled;
+}
+void ath9k_hw_btcoex_enable(struct ath_hw *ah);
 static inline enum ath_btcoex_scheme
 ath9k_hw_get_btcoex_scheme(struct ath_hw *ah)
 {
        return ah->btcoex_hw.scheme;
 }
 #else
-#define ath9k_hw_get_btcoex_scheme(...) ATH_BTCOEX_CFG_NONE
-#endif
+static inline bool ath9k_hw_btcoex_is_enabled(struct ath_hw *ah)
+{
+       return false;
+}
+static inline void ath9k_hw_btcoex_enable(struct ath_hw *ah)
+{
+}
+static inline enum ath_btcoex_scheme
+ath9k_hw_get_btcoex_scheme(struct ath_hw *ah)
+{
+       return ATH_BTCOEX_CFG_NONE;
+}
+#endif /* CONFIG_ATH9K_BTCOEX_SUPPORT */
 
 #define ATH9K_CLOCK_RATE_CCK           22
 #define ATH9K_CLOCK_RATE_5GHZ_OFDM     40
index 53a005d..d8b0596 100644 (file)
@@ -419,66 +419,6 @@ fail:
        return error;
 }
 
-static int ath9k_init_btcoex(struct ath_softc *sc)
-{
-       struct ath_txq *txq;
-       struct ath_hw *ah = sc->sc_ah;
-       int r;
-
-       switch (ath9k_hw_get_btcoex_scheme(sc->sc_ah)) {
-       case ATH_BTCOEX_CFG_NONE:
-               break;
-       case ATH_BTCOEX_CFG_2WIRE:
-               ath9k_hw_btcoex_init_2wire(sc->sc_ah);
-               break;
-       case ATH_BTCOEX_CFG_3WIRE:
-               ath9k_hw_btcoex_init_3wire(sc->sc_ah);
-               r = ath_init_btcoex_timer(sc);
-               if (r)
-                       return -1;
-               txq = sc->tx.txq_map[WME_AC_BE];
-               ath9k_hw_init_btcoex_hw(sc->sc_ah, txq->axq_qnum);
-               sc->btcoex.bt_stomp_type = ATH_BTCOEX_STOMP_LOW;
-               break;
-       case ATH_BTCOEX_CFG_MCI:
-               sc->btcoex.bt_stomp_type = ATH_BTCOEX_STOMP_LOW;
-               sc->btcoex.duty_cycle = ATH_BTCOEX_DEF_DUTY_CYCLE;
-               INIT_LIST_HEAD(&sc->btcoex.mci.info);
-
-               r = ath_mci_setup(sc);
-               if (r)
-                       return r;
-
-               if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_MCI) {
-                       ah->btcoex_hw.mci.ready = false;
-                       ah->btcoex_hw.mci.bt_state = 0;
-                       ah->btcoex_hw.mci.bt_ver_major = 3;
-                       ah->btcoex_hw.mci.bt_ver_minor = 0;
-                       ah->btcoex_hw.mci.bt_version_known = false;
-                       ah->btcoex_hw.mci.update_2g5g = true;
-                       ah->btcoex_hw.mci.is_2g = true;
-                       ah->btcoex_hw.mci.wlan_channels_update = false;
-                       ah->btcoex_hw.mci.wlan_channels[0] = 0x00000000;
-                       ah->btcoex_hw.mci.wlan_channels[1] = 0xffffffff;
-                       ah->btcoex_hw.mci.wlan_channels[2] = 0xffffffff;
-                       ah->btcoex_hw.mci.wlan_channels[3] = 0x7fffffff;
-                       ah->btcoex_hw.mci.query_bt = true;
-                       ah->btcoex_hw.mci.unhalt_bt_gpm = true;
-                       ah->btcoex_hw.mci.halted_bt_gpm = false;
-                       ah->btcoex_hw.mci.need_flush_btinfo = false;
-                       ah->btcoex_hw.mci.wlan_cal_seq = 0;
-                       ah->btcoex_hw.mci.wlan_cal_done = 0;
-                       ah->btcoex_hw.mci.config = 0x2201;
-               }
-               break;
-       default:
-               WARN_ON(1);
-               break;
-       }
-
-       return 0;
-}
-
 static int ath9k_init_queues(struct ath_softc *sc)
 {
        int i = 0;
@@ -880,12 +820,7 @@ static void ath9k_deinit_softc(struct ath_softc *sc)
        if (sc->sbands[IEEE80211_BAND_5GHZ].channels)
                kfree(sc->sbands[IEEE80211_BAND_5GHZ].channels);
 
-        if ((sc->btcoex.no_stomp_timer) &&
-           ath9k_hw_get_btcoex_scheme(sc->sc_ah) == ATH_BTCOEX_CFG_3WIRE)
-               ath_gen_timer_free(sc->sc_ah, sc->btcoex.no_stomp_timer);
-
-       if (ath9k_hw_get_btcoex_scheme(sc->sc_ah) == ATH_BTCOEX_CFG_MCI)
-               ath_mci_cleanup(sc);
+       ath9k_deinit_btcoex(sc);
 
        for (i = 0; i < ATH9K_NUM_TX_QUEUES; i++)
                if (ATH_TXQ_SETUP(sc, i))
index 4a00806..02e95c8 100644 (file)
@@ -340,9 +340,7 @@ static int ath_reset_internal(struct ath_softc *sc, struct ath9k_channel *hchan,
                fastcc = false;
 
        ath_dbg(common, CONFIG, "Reset to %u MHz, HT40: %d fastcc: %d\n",
-               hchan->channel, !!(hchan->channelFlags & (CHANNEL_HT40MINUS |
-                                                         CHANNEL_HT40PLUS)),
-               fastcc);
+               hchan->channel, IS_CHAN_HT40(hchan), fastcc);
 
        r = ath9k_hw_reset(ah, hchan, caldata, fastcc);
        if (r) {
@@ -373,12 +371,8 @@ static int ath_set_channel(struct ath_softc *sc, struct ieee80211_hw *hw,
        if (sc->sc_flags & SC_OP_INVALID)
                return -EIO;
 
-       ath9k_ps_wakeup(sc);
-
        r = ath_reset_internal(sc, hchan, false);
 
-       ath9k_ps_restore(sc);
-
        return r;
 }
 
@@ -741,12 +735,7 @@ void ath9k_tasklet(unsigned long data)
                        ath_tx_tasklet(sc);
        }
 
-       if (ath9k_hw_get_btcoex_scheme(ah) == ATH_BTCOEX_CFG_3WIRE)
-               if (status & ATH9K_INT_GENTIMER)
-                       ath_gen_timer_isr(sc->sc_ah);
-
-       if ((status & ATH9K_INT_MCI) && ATH9K_HW_CAP_MCI)
-               ath_mci_intr(sc);
+       ath9k_btcoex_handle_interrupt(sc, status);
 
 out:
        /* re-enable hardware interrupt */
@@ -1081,16 +1070,7 @@ static int ath9k_start(struct ieee80211_hw *hw)
 
        spin_unlock_bh(&sc->sc_pcu_lock);
 
-       if ((ath9k_hw_get_btcoex_scheme(ah) != ATH_BTCOEX_CFG_NONE) &&
-           !ah->btcoex_hw.enabled) {
-               if (!(sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_MCI))
-                       ath9k_hw_btcoex_set_weight(ah, AR_BT_COEX_WGHT,
-                                                  AR_STOMP_LOW_WLAN_WGHT);
-               ath9k_hw_btcoex_enable(ah);
-
-               if (ath9k_hw_get_btcoex_scheme(ah) == ATH_BTCOEX_CFG_3WIRE)
-                       ath9k_btcoex_timer_resume(sc);
-       }
+       ath9k_start_btcoex(sc);
 
        if (ah->caps.pcie_lcr_extsync_en && common->bus_ops->extn_synch_en)
                common->bus_ops->extn_synch_en(common);
@@ -1191,13 +1171,7 @@ static void ath9k_stop(struct ieee80211_hw *hw)
        /* Ensure HW is awake when we try to shut it down. */
        ath9k_ps_wakeup(sc);
 
-       if (ah->btcoex_hw.enabled &&
-           ath9k_hw_get_btcoex_scheme(ah) != ATH_BTCOEX_CFG_NONE) {
-               ath9k_hw_btcoex_disable(ah);
-               if (ath9k_hw_get_btcoex_scheme(ah) == ATH_BTCOEX_CFG_3WIRE)
-                       ath9k_btcoex_timer_pause(sc);
-               ath_mci_flush_profile(&sc->btcoex.mci);
-       }
+       ath9k_stop_btcoex(sc);
 
        spin_lock_bh(&sc->sc_pcu_lock);
 
@@ -1589,12 +1563,6 @@ static int ath9k_config(struct ieee80211_hw *hw, u32 changed)
        ath9k_ps_wakeup(sc);
        mutex_lock(&sc->mutex);
 
-       /*
-        * Leave this as the first check because we need to turn on the
-        * radio if it was disabled before prior to processing the rest
-        * of the changes. Likewise we must only disable the radio towards
-        * the end.
-        */
        if (changed & IEEE80211_CONF_CHANGE_IDLE) {
                sc->ps_idle = !!(conf->flags & IEEE80211_CONF_IDLE);
                if (sc->ps_idle)
index 05c23ea..29fe52d 100644 (file)
@@ -42,24 +42,18 @@ static bool ath_mci_add_profile(struct ath_common *common,
        struct ath_mci_profile_info *entry;
 
        if ((mci->num_sco == ATH_MCI_MAX_SCO_PROFILE) &&
-           (info->type == MCI_GPM_COEX_PROFILE_VOICE)) {
-               ath_dbg(common, MCI,
-                       "Too many SCO profile, failed to add new profile\n");
+           (info->type == MCI_GPM_COEX_PROFILE_VOICE))
                return false;
-       }
 
        if (((NUM_PROF(mci) - mci->num_sco) == ATH_MCI_MAX_ACL_PROFILE) &&
-           (info->type != MCI_GPM_COEX_PROFILE_VOICE)) {
-               ath_dbg(common, MCI,
-                       "Too many ACL profile, failed to add new profile\n");
+           (info->type != MCI_GPM_COEX_PROFILE_VOICE))
                return false;
-       }
 
        entry = ath_mci_find_profile(mci, info);
 
-       if (entry)
+       if (entry) {
                memcpy(entry, info, 10);
-       else {
+       } else {
                entry = kzalloc(sizeof(*entry), GFP_KERNEL);
                if (!entry)
                        return false;
@@ -68,6 +62,7 @@ static bool ath_mci_add_profile(struct ath_common *common,
                INC_PROF(mci, info);
                list_add_tail(&info->list, &mci->info);
        }
+
        return true;
 }
 
@@ -79,10 +74,9 @@ static void ath_mci_del_profile(struct ath_common *common,
 
        entry = ath_mci_find_profile(mci, info);
 
-       if (!entry) {
-               ath_dbg(common, MCI, "Profile to be deleted not found\n");
+       if (!entry)
                return;
-       }
+
        DEC_PROF(mci, entry);
        list_del(&entry->list);
        kfree(entry);
@@ -177,13 +171,12 @@ static void ath_mci_update_scheme(struct ath_softc *sc)
 
        btcoex->btcoex_period *= 1000;
        btcoex->btcoex_no_stomp =  btcoex->btcoex_period *
-                                       (100 - btcoex->duty_cycle) / 100;
+               (100 - btcoex->duty_cycle) / 100;
 
        ath9k_hw_btcoex_enable(sc->sc_ah);
        ath9k_btcoex_timer_resume(sc);
 }
 
-
 static void ath_mci_cal_msg(struct ath_softc *sc, u8 opcode, u8 *rx_payload)
 {
        struct ath_hw *ah = sc->sc_ah;
@@ -192,42 +185,24 @@ static void ath_mci_cal_msg(struct ath_softc *sc, u8 opcode, u8 *rx_payload)
 
        switch (opcode) {
        case MCI_GPM_BT_CAL_REQ:
-
-               ath_dbg(common, MCI, "MCI received BT_CAL_REQ\n");
-
                if (ar9003_mci_state(ah, MCI_STATE_BT, NULL) == MCI_BT_AWAKE) {
                        ar9003_mci_state(ah, MCI_STATE_SET_BT_CAL_START, NULL);
                        ieee80211_queue_work(sc->hw, &sc->hw_reset_work);
-               } else
-                       ath_dbg(common, MCI, "MCI State mismatches: %d\n",
+               } else {
+                       ath_dbg(common, MCI, "MCI State mismatch: %d\n",
                                ar9003_mci_state(ah, MCI_STATE_BT, NULL));
-
+               }
                break;
-
        case MCI_GPM_BT_CAL_DONE:
-
-               ath_dbg(common, MCI, "MCI received BT_CAL_DONE\n");
-
-               if (ar9003_mci_state(ah, MCI_STATE_BT, NULL) == MCI_BT_CAL)
-                       ath_dbg(common, MCI, "MCI error illegal!\n");
-               else
-                       ath_dbg(common, MCI, "MCI BT not in CAL state\n");
-
+               ar9003_mci_state(ah, MCI_STATE_BT, NULL);
                break;
-
        case MCI_GPM_BT_CAL_GRANT:
-
-               ath_dbg(common, MCI, "MCI received BT_CAL_GRANT\n");
-
-               /* Send WLAN_CAL_DONE for now */
-               ath_dbg(common, MCI, "MCI send WLAN_CAL_DONE\n");
                MCI_GPM_SET_CAL_TYPE(payload, MCI_GPM_WLAN_CAL_DONE);
                ar9003_mci_send_message(sc->sc_ah, MCI_GPM, 0, payload,
                                        16, false, true);
                break;
-
        default:
-               ath_dbg(common, MCI, "MCI Unknown GPM CAL message\n");
+               ath_dbg(common, MCI, "Unknown GPM CAL message\n");
                break;
        }
 }
@@ -247,6 +222,7 @@ static void ath_mci_process_profile(struct ath_softc *sc,
 
        btcoex->btcoex_period = ATH_MCI_DEF_BT_PERIOD;
        mci->aggr_limit = mci->num_sco ? 6 : 0;
+
        if (NUM_PROF(mci)) {
                btcoex->bt_stomp_type = ATH_BTCOEX_STOMP_LOW;
                btcoex->duty_cycle = ath_mci_duty_cycle[NUM_PROF(mci)];
@@ -262,31 +238,24 @@ static void ath_mci_process_profile(struct ath_softc *sc,
 static void ath_mci_process_status(struct ath_softc *sc,
                                   struct ath_mci_profile_status *status)
 {
-       struct ath_common *common = ath9k_hw_common(sc->sc_ah);
        struct ath_btcoex *btcoex = &sc->btcoex;
        struct ath_mci_profile *mci = &btcoex->mci;
        struct ath_mci_profile_info info;
        int i = 0, old_num_mgmt = mci->num_mgmt;
 
        /* Link status type are not handled */
-       if (status->is_link) {
-               ath_dbg(common, MCI, "Skip link type status update\n");
+       if (status->is_link)
                return;
-       }
 
        memset(&info, 0, sizeof(struct ath_mci_profile_info));
 
        info.conn_handle = status->conn_handle;
-       if (ath_mci_find_profile(mci, &info)) {
-               ath_dbg(common, MCI,
-                       "Skip non link state update for existing profile %d\n",
-                       status->conn_handle);
+       if (ath_mci_find_profile(mci, &info))
                return;
-       }
-       if (status->conn_handle >= ATH_MCI_MAX_PROFILE) {
-               ath_dbg(common, MCI, "Ignore too many non-link update\n");
+
+       if (status->conn_handle >= ATH_MCI_MAX_PROFILE)
                return;
-       }
+
        if (status->is_critical)
                __set_bit(status->conn_handle, mci->status);
        else
@@ -314,43 +283,28 @@ static void ath_mci_msg(struct ath_softc *sc, u8 opcode, u8 *rx_payload)
        u32 seq_num;
 
        switch (opcode) {
-
        case MCI_GPM_COEX_VERSION_QUERY:
-               ath_dbg(common, MCI, "MCI Recv GPM COEX Version Query\n");
-               version = ar9003_mci_state(ah,
-                               MCI_STATE_SEND_WLAN_COEX_VERSION, NULL);
+               version = ar9003_mci_state(ah, MCI_STATE_SEND_WLAN_COEX_VERSION,
+                                          NULL);
                break;
-
        case MCI_GPM_COEX_VERSION_RESPONSE:
-               ath_dbg(common, MCI, "MCI Recv GPM COEX Version Response\n");
                major = *(rx_payload + MCI_GPM_COEX_B_MAJOR_VERSION);
                minor = *(rx_payload + MCI_GPM_COEX_B_MINOR_VERSION);
-               ath_dbg(common, MCI, "MCI BT Coex version: %d.%d\n",
-                       major, minor);
                version = (major << 8) + minor;
-               version = ar9003_mci_state(ah,
-                         MCI_STATE_SET_BT_COEX_VERSION, &version);
+               version = ar9003_mci_state(ah, MCI_STATE_SET_BT_COEX_VERSION,
+                                          &version);
                break;
-
        case MCI_GPM_COEX_STATUS_QUERY:
-               ath_dbg(common, MCI,
-                       "MCI Recv GPM COEX Status Query = 0x%02x\n",
-                       *(rx_payload + MCI_GPM_COEX_B_WLAN_BITMAP));
-               ar9003_mci_state(ah,
-               MCI_STATE_SEND_WLAN_CHANNELS, NULL);
+               ar9003_mci_state(ah, MCI_STATE_SEND_WLAN_CHANNELS, NULL);
                break;
-
        case MCI_GPM_COEX_BT_PROFILE_INFO:
-               ath_dbg(common, MCI, "MCI Recv GPM Coex BT profile info\n");
                memcpy(&profile_info,
                       (rx_payload + MCI_GPM_COEX_B_PROFILE_TYPE), 10);
 
-               if ((profile_info.type == MCI_GPM_COEX_PROFILE_UNKNOWN)
-                   || (profile_info.type >=
-                                           MCI_GPM_COEX_PROFILE_MAX)) {
-
+               if ((profile_info.type == MCI_GPM_COEX_PROFILE_UNKNOWN) ||
+                   (profile_info.type >= MCI_GPM_COEX_PROFILE_MAX)) {
                        ath_dbg(common, MCI,
-                               "illegal profile type = %d, state = %d\n",
+                               "Illegal profile type = %d, state = %d\n",
                                profile_info.type,
                                profile_info.start);
                        break;
@@ -358,7 +312,6 @@ static void ath_mci_msg(struct ath_softc *sc, u8 opcode, u8 *rx_payload)
 
                ath_mci_process_profile(sc, &profile_info);
                break;
-
        case MCI_GPM_COEX_BT_STATUS_UPDATE:
                profile_status.is_link = *(rx_payload +
                                           MCI_GPM_COEX_B_STATUS_TYPE);
@@ -369,98 +322,66 @@ static void ath_mci_msg(struct ath_softc *sc, u8 opcode, u8 *rx_payload)
 
                seq_num = *((u32 *)(rx_payload + 12));
                ath_dbg(common, MCI,
-                       "MCI Recv GPM COEX BT_Status_Update: is_link=%d, linkId=%d, state=%d, SEQ=%d\n",
+                       "BT_Status_Update: is_link=%d, linkId=%d, state=%d, SEQ=%d\n",
                        profile_status.is_link, profile_status.conn_handle,
                        profile_status.is_critical, seq_num);
 
                ath_mci_process_status(sc, &profile_status);
                break;
-
        default:
-               ath_dbg(common, MCI, "MCI Unknown GPM COEX message = 0x%02x\n",
-                       opcode);
+               ath_dbg(common, MCI, "Unknown GPM COEX message = 0x%02x\n", opcode);
                break;
        }
 }
 
-static int ath_mci_buf_alloc(struct ath_softc *sc, struct ath_mci_buf *buf)
-{
-       int error = 0;
-
-       buf->bf_addr = dma_alloc_coherent(sc->dev, buf->bf_len,
-                                         &buf->bf_paddr, GFP_KERNEL);
-
-       if (buf->bf_addr == NULL) {
-               error = -ENOMEM;
-               goto fail;
-       }
-
-       return 0;
-
-fail:
-       memset(buf, 0, sizeof(*buf));
-       return error;
-}
-
-static void ath_mci_buf_free(struct ath_softc *sc, struct ath_mci_buf *buf)
-{
-       if (buf->bf_addr) {
-               dma_free_coherent(sc->dev, buf->bf_len, buf->bf_addr,
-                                                       buf->bf_paddr);
-               memset(buf, 0, sizeof(*buf));
-       }
-}
-
 int ath_mci_setup(struct ath_softc *sc)
 {
        struct ath_common *common = ath9k_hw_common(sc->sc_ah);
        struct ath_mci_coex *mci = &sc->mci_coex;
-       int error = 0;
-
-       if (!ATH9K_HW_CAP_MCI)
-               return 0;
+       struct ath_mci_buf *buf = &mci->sched_buf;
 
-       mci->sched_buf.bf_len = ATH_MCI_SCHED_BUF_SIZE + ATH_MCI_GPM_BUF_SIZE;
+       buf->bf_addr = dma_alloc_coherent(sc->dev,
+                                 ATH_MCI_SCHED_BUF_SIZE + ATH_MCI_GPM_BUF_SIZE,
+                                 &buf->bf_paddr, GFP_KERNEL);
 
-       if (ath_mci_buf_alloc(sc, &mci->sched_buf)) {
+       if (buf->bf_addr == NULL) {
                ath_dbg(common, FATAL, "MCI buffer alloc failed\n");
-               error = -ENOMEM;
-               goto fail;
+               return -ENOMEM;
        }
 
-       mci->sched_buf.bf_len = ATH_MCI_SCHED_BUF_SIZE;
+       memset(buf->bf_addr, MCI_GPM_RSVD_PATTERN,
+              ATH_MCI_SCHED_BUF_SIZE + ATH_MCI_GPM_BUF_SIZE);
 
-       memset(mci->sched_buf.bf_addr, MCI_GPM_RSVD_PATTERN,
-                                               mci->sched_buf.bf_len);
+       mci->sched_buf.bf_len = ATH_MCI_SCHED_BUF_SIZE;
 
        mci->gpm_buf.bf_len = ATH_MCI_GPM_BUF_SIZE;
-       mci->gpm_buf.bf_addr = (u8 *)mci->sched_buf.bf_addr +
-                                                       mci->sched_buf.bf_len;
+       mci->gpm_buf.bf_addr = (u8 *)mci->sched_buf.bf_addr + mci->sched_buf.bf_len;
        mci->gpm_buf.bf_paddr = mci->sched_buf.bf_paddr + mci->sched_buf.bf_len;
 
-       /* initialize the buffer */
-       memset(mci->gpm_buf.bf_addr, MCI_GPM_RSVD_PATTERN, mci->gpm_buf.bf_len);
-
        ar9003_mci_setup(sc->sc_ah, mci->gpm_buf.bf_paddr,
                         mci->gpm_buf.bf_addr, (mci->gpm_buf.bf_len >> 4),
                         mci->sched_buf.bf_paddr);
-fail:
-       return error;
+
+       ath_dbg(common, MCI, "MCI Initialized\n");
+
+       return 0;
 }
 
 void ath_mci_cleanup(struct ath_softc *sc)
 {
+       struct ath_common *common = ath9k_hw_common(sc->sc_ah);
        struct ath_hw *ah = sc->sc_ah;
        struct ath_mci_coex *mci = &sc->mci_coex;
+       struct ath_mci_buf *buf = &mci->sched_buf;
 
-       if (!ATH9K_HW_CAP_MCI)
-               return;
+       if (buf->bf_addr)
+               dma_free_coherent(sc->dev,
+                                 ATH_MCI_SCHED_BUF_SIZE + ATH_MCI_GPM_BUF_SIZE,
+                                 buf->bf_addr, buf->bf_paddr);
 
-       /*
-        * both schedule and gpm buffers will be released
-        */
-       ath_mci_buf_free(sc, &mci->sched_buf);
        ar9003_mci_cleanup(ah);
+
+       ath_dbg(common, MCI, "MCI De-Initialized\n");
 }
 
 void ath_mci_intr(struct ath_softc *sc)
@@ -474,19 +395,10 @@ void ath_mci_intr(struct ath_softc *sc)
        u32 more_data = MCI_GPM_MORE;
        bool skip_gpm = false;
 
-       if (!ATH9K_HW_CAP_MCI)
-               return;
-
        ar9003_mci_get_interrupt(sc->sc_ah, &mci_int, &mci_int_rxmsg);
 
        if (ar9003_mci_state(ah, MCI_STATE_ENABLE, NULL) == 0) {
-
-               ar9003_mci_state(sc->sc_ah, MCI_STATE_INIT_GPM_OFFSET, NULL);
-               ath_dbg(common, MCI, "MCI interrupt but MCI disabled\n");
-
-               ath_dbg(common, MCI,
-                       "MCI interrupt: intr = 0x%x, intr_rxmsg = 0x%x\n",
-                       mci_int, mci_int_rxmsg);
+               ar9003_mci_state(ah, MCI_STATE_INIT_GPM_OFFSET, NULL);
                return;
        }
 
@@ -499,11 +411,8 @@ void ath_mci_intr(struct ath_softc *sc)
                 * only when BT wake up. Now they are always sent, as a
                 * recovery method to reset BT MCI's RX alignment.
                 */
-               ath_dbg(common, MCI, "MCI interrupt send REMOTE_RESET\n");
-
                ar9003_mci_send_message(ah, MCI_REMOTE_RESET, 0,
                                        payload, 16, true, false);
-               ath_dbg(common, MCI, "MCI interrupt send SYS_WAKING\n");
                ar9003_mci_send_message(ah, MCI_SYS_WAKING, 0,
                                        NULL, 0, true, false);
 
@@ -513,74 +422,51 @@ void ath_mci_intr(struct ath_softc *sc)
                /*
                 * always do this for recovery and 2G/5G toggling and LNA_TRANS
                 */
-               ath_dbg(common, MCI, "MCI Set BT state to AWAKE\n");
                ar9003_mci_state(ah, MCI_STATE_SET_BT_AWAKE, NULL);
        }
 
-       /* Processing SYS_WAKING/SYS_SLEEPING */
        if (mci_int_rxmsg & AR_MCI_INTERRUPT_RX_MSG_SYS_WAKING) {
                mci_int_rxmsg &= ~AR_MCI_INTERRUPT_RX_MSG_SYS_WAKING;
 
                if (ar9003_mci_state(ah, MCI_STATE_BT, NULL) == MCI_BT_SLEEP) {
-
-                       if (ar9003_mci_state(ah, MCI_STATE_REMOTE_SLEEP, NULL)
-                                       == MCI_BT_SLEEP)
-                               ath_dbg(common, MCI,
-                                       "MCI BT stays in sleep mode\n");
-                       else {
-                               ath_dbg(common, MCI,
-                                       "MCI Set BT state to AWAKE\n");
-                               ar9003_mci_state(ah,
-                                                MCI_STATE_SET_BT_AWAKE, NULL);
-                       }
-               } else
-                       ath_dbg(common, MCI, "MCI BT stays in AWAKE mode\n");
+                       if (ar9003_mci_state(ah, MCI_STATE_REMOTE_SLEEP, NULL) !=
+                           MCI_BT_SLEEP)
+                               ar9003_mci_state(ah, MCI_STATE_SET_BT_AWAKE,
+                                                NULL);
+               }
        }
 
        if (mci_int_rxmsg & AR_MCI_INTERRUPT_RX_MSG_SYS_SLEEPING) {
-
                mci_int_rxmsg &= ~AR_MCI_INTERRUPT_RX_MSG_SYS_SLEEPING;
 
                if (ar9003_mci_state(ah, MCI_STATE_BT, NULL) == MCI_BT_AWAKE) {
-
-                       if (ar9003_mci_state(ah, MCI_STATE_REMOTE_SLEEP, NULL)
-                                       == MCI_BT_AWAKE)
-                               ath_dbg(common, MCI,
-                                       "MCI BT stays in AWAKE mode\n");
-                       else {
-                               ath_dbg(common, MCI,
-                                       "MCI SetBT state to SLEEP\n");
+                       if (ar9003_mci_state(ah, MCI_STATE_REMOTE_SLEEP, NULL) !=
+                           MCI_BT_AWAKE)
                                ar9003_mci_state(ah, MCI_STATE_SET_BT_SLEEP,
                                                 NULL);
-                       }
-               } else
-                       ath_dbg(common, MCI, "MCI BT stays in SLEEP mode\n");
+               }
        }
 
        if ((mci_int & AR_MCI_INTERRUPT_RX_INVALID_HDR) ||
            (mci_int & AR_MCI_INTERRUPT_CONT_INFO_TIMEOUT)) {
-
-               ath_dbg(common, MCI, "MCI RX broken, skip GPM msgs\n");
                ar9003_mci_state(ah, MCI_STATE_RECOVER_RX, NULL);
                skip_gpm = true;
        }
 
        if (mci_int_rxmsg & AR_MCI_INTERRUPT_RX_MSG_SCHD_INFO) {
-
                mci_int_rxmsg &= ~AR_MCI_INTERRUPT_RX_MSG_SCHD_INFO;
                offset = ar9003_mci_state(ah, MCI_STATE_LAST_SCHD_MSG_OFFSET,
                                          NULL);
        }
 
        if (mci_int_rxmsg & AR_MCI_INTERRUPT_RX_MSG_GPM) {
-
                mci_int_rxmsg &= ~AR_MCI_INTERRUPT_RX_MSG_GPM;
 
                while (more_data == MCI_GPM_MORE) {
 
                        pgpm = mci->gpm_buf.bf_addr;
-                       offset = ar9003_mci_state(ah,
-                                       MCI_STATE_NEXT_GPM_OFFSET, &more_data);
+                       offset = ar9003_mci_state(ah, MCI_STATE_NEXT_GPM_OFFSET,
+                                                 &more_data);
 
                        if (offset == MCI_GPM_INVALID)
                                break;
@@ -591,44 +477,38 @@ void ath_mci_intr(struct ath_softc *sc)
                         * The first dword is timer.
                         * The real data starts from 2nd dword.
                         */
-
                        subtype = MCI_GPM_TYPE(pgpm);
                        opcode = MCI_GPM_OPCODE(pgpm);
 
-                       if (!skip_gpm) {
-
-                               if (MCI_GPM_IS_CAL_TYPE(subtype))
-                                       ath_mci_cal_msg(sc, subtype,
-                                                       (u8 *) pgpm);
-                               else {
-                                       switch (subtype) {
-                                       case MCI_GPM_COEX_AGENT:
-                                               ath_mci_msg(sc, opcode,
-                                                           (u8 *) pgpm);
-                                               break;
-                                       default:
-                                               break;
-                                       }
+                       if (skip_gpm)
+                               goto recycle;
+
+                       if (MCI_GPM_IS_CAL_TYPE(subtype)) {
+                               ath_mci_cal_msg(sc, subtype, (u8 *)pgpm);
+                       } else {
+                               switch (subtype) {
+                               case MCI_GPM_COEX_AGENT:
+                                       ath_mci_msg(sc, opcode, (u8 *)pgpm);
+                                       break;
+                               default:
+                                       break;
                                }
                        }
+               recycle:
                        MCI_GPM_RECYCLE(pgpm);
                }
        }
 
        if (mci_int_rxmsg & AR_MCI_INTERRUPT_RX_HW_MSG_MASK) {
-
                if (mci_int_rxmsg & AR_MCI_INTERRUPT_RX_MSG_LNA_CONTROL)
                        mci_int_rxmsg &= ~AR_MCI_INTERRUPT_RX_MSG_LNA_CONTROL;
 
-               if (mci_int_rxmsg & AR_MCI_INTERRUPT_RX_MSG_LNA_INFO) {
+               if (mci_int_rxmsg & AR_MCI_INTERRUPT_RX_MSG_LNA_INFO)
                        mci_int_rxmsg &= ~AR_MCI_INTERRUPT_RX_MSG_LNA_INFO;
-                       ath_dbg(common, MCI, "MCI LNA_INFO\n");
-               }
 
                if (mci_int_rxmsg & AR_MCI_INTERRUPT_RX_MSG_CONT_INFO) {
-
                        int value_dbm = ar9003_mci_state(ah,
-                                       MCI_STATE_CONT_RSSI_POWER, NULL);
+                                                MCI_STATE_CONT_RSSI_POWER, NULL);
 
                        mci_int_rxmsg &= ~AR_MCI_INTERRUPT_RX_MSG_CONT_INFO;
 
@@ -636,33 +516,25 @@ void ath_mci_intr(struct ath_softc *sc)
                                ath_dbg(common, MCI,
                                        "MCI CONT_INFO: (tx) pri = %d, pwr = %d dBm\n",
                                        ar9003_mci_state(ah,
-                                               MCI_STATE_CONT_PRIORITY, NULL),
+                                                MCI_STATE_CONT_PRIORITY, NULL),
                                        value_dbm);
                        else
                                ath_dbg(common, MCI,
                                        "MCI CONT_INFO: (rx) pri = %d,pwr = %d dBm\n",
                                        ar9003_mci_state(ah,
-                                               MCI_STATE_CONT_PRIORITY, NULL),
+                                                MCI_STATE_CONT_PRIORITY, NULL),
                                        value_dbm);
                }
 
-               if (mci_int_rxmsg & AR_MCI_INTERRUPT_RX_MSG_CONT_NACK) {
+               if (mci_int_rxmsg & AR_MCI_INTERRUPT_RX_MSG_CONT_NACK)
                        mci_int_rxmsg &= ~AR_MCI_INTERRUPT_RX_MSG_CONT_NACK;
-                       ath_dbg(common, MCI, "MCI CONT_NACK\n");
-               }
 
-               if (mci_int_rxmsg & AR_MCI_INTERRUPT_RX_MSG_CONT_RST) {
+               if (mci_int_rxmsg & AR_MCI_INTERRUPT_RX_MSG_CONT_RST)
                        mci_int_rxmsg &= ~AR_MCI_INTERRUPT_RX_MSG_CONT_RST;
-                       ath_dbg(common, MCI, "MCI CONT_RST\n");
-               }
        }
 
        if ((mci_int & AR_MCI_INTERRUPT_RX_INVALID_HDR) ||
            (mci_int & AR_MCI_INTERRUPT_CONT_INFO_TIMEOUT))
                mci_int &= ~(AR_MCI_INTERRUPT_RX_INVALID_HDR |
                             AR_MCI_INTERRUPT_CONT_INFO_TIMEOUT);
-
-       if (mci_int_rxmsg & 0xfffffffe)
-               ath_dbg(common, MCI, "MCI not processed mci_int_rxmsg = 0x%x\n",
-                       mci_int_rxmsg);
 }
index 29e3e51..c841444 100644 (file)
@@ -17,6 +17,8 @@
 #ifndef MCI_H
 #define MCI_H
 
+#include "ar9003_mci.h"
+
 #define ATH_MCI_SCHED_BUF_SIZE         (16 * 16) /* 16 entries, 4 dword each */
 #define ATH_MCI_GPM_MAX_ENTRY          16
 #define ATH_MCI_GPM_BUF_SIZE           (ATH_MCI_GPM_MAX_ENTRY * 16)
@@ -113,7 +115,6 @@ struct ath_mci_profile {
        u8 num_bdr;
 };
 
-
 struct ath_mci_buf {
        void *bf_addr;          /* virtual addr of desc */
        dma_addr_t bf_paddr;    /* physical addr of buffer */
@@ -121,10 +122,8 @@ struct ath_mci_buf {
 };
 
 struct ath_mci_coex {
-       atomic_t mci_cal_flag;
        struct ath_mci_buf sched_buf;
        struct ath_mci_buf gpm_buf;
-       u32 bt_cal_start;
 };
 
 void ath_mci_flush_profile(struct ath_mci_profile *mci);
index a427a16..b8c6c38 100644 (file)
@@ -567,10 +567,8 @@ static u8 ath_rc_setvalid_rates(struct ath_rate_priv *ath_rc_priv,
 
 static u8 ath_rc_setvalid_htrates(struct ath_rate_priv *ath_rc_priv,
                                  const struct ath_rate_table *rate_table,
-                                 u8 *mcs_set, u32 capflag)
+                                 struct ath_rateset *rateset, u32 capflag)
 {
-       struct ath_rateset *rateset = (struct ath_rateset *)mcs_set;
-
        u8 i, j, hi = 0;
 
        /* Use intersection of working rates and valid rates */
@@ -1212,7 +1210,7 @@ static void ath_rc_init(struct ath_softc *sc,
 {
        struct ath_rateset *rateset = &ath_rc_priv->neg_rates;
        struct ath_common *common = ath9k_hw_common(sc->sc_ah);
-       u8 *ht_mcs = (u8 *)&ath_rc_priv->neg_ht_rates;
+       struct ath_rateset *ht_mcs = &ath_rc_priv->neg_ht_rates;
        u8 i, j, k, hi = 0, hthi = 0;
 
        /* Initial rate table size. Will change depending
index 6e2f188..80b1856 100644 (file)
 #define AR_SREV_VERSION_9580           0x1C0
 #define AR_SREV_REVISION_9580_10       4 /* AR9580 1.0 */
 #define AR_SREV_VERSION_9462           0x280
-#define AR_SREV_REVISION_9462_10       0
 #define AR_SREV_REVISION_9462_20       2
 
 #define AR_SREV_5416(_ah) \
 #define AR_SREV_9462(_ah) \
        (((_ah)->hw_version.macVersion == AR_SREV_VERSION_9462))
 
-#define AR_SREV_9462_10(_ah) \
-       (((_ah)->hw_version.macVersion == AR_SREV_VERSION_9462) && \
-       ((_ah)->hw_version.macRev == AR_SREV_REVISION_9462_10))
-
 #define AR_SREV_9462_20(_ah) \
        (((_ah)->hw_version.macVersion == AR_SREV_VERSION_9462) && \
        ((_ah)->hw_version.macRev == AR_SREV_REVISION_9462_20))
index 3182408..5dd27d2 100644 (file)
@@ -647,9 +647,8 @@ static u32 ath_lookup_rate(struct ath_softc *sc, struct ath_buf *bf,
        struct sk_buff *skb;
        struct ieee80211_tx_info *tx_info;
        struct ieee80211_tx_rate *rates;
-       struct ath_mci_profile *mci = &sc->btcoex.mci;
        u32 max_4ms_framelen, frmlen;
-       u16 aggr_limit, legacy = 0;
+       u16 aggr_limit, bt_aggr_limit, legacy = 0;
        int i;
 
        skb = bf->bf_mpdu;
@@ -694,14 +693,14 @@ static u32 ath_lookup_rate(struct ath_softc *sc, struct ath_buf *bf,
        if (tx_info->flags & IEEE80211_TX_CTL_RATE_CTRL_PROBE || legacy)
                return 0;
 
-       if ((sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_MCI) && mci->aggr_limit)
-               aggr_limit = (max_4ms_framelen * mci->aggr_limit) >> 4;
-       else if (sc->sc_flags & SC_OP_BT_PRIORITY_DETECTED)
-               aggr_limit = min((max_4ms_framelen * 3) / 8,
-                                (u32)ATH_AMPDU_LIMIT_MAX);
-       else
-               aggr_limit = min(max_4ms_framelen,
-                                (u32)ATH_AMPDU_LIMIT_MAX);
+       aggr_limit = min(max_4ms_framelen, (u32)ATH_AMPDU_LIMIT_MAX);
+
+       /*
+        * Override the default aggregation limit for BTCOEX.
+        */
+       bt_aggr_limit = ath9k_btcoex_aggr_limit(sc, max_4ms_framelen);
+       if (bt_aggr_limit)
+               aggr_limit = bt_aggr_limit;
 
        /*
         * h/w can accept aggregates up to 16 bit lengths (65535).
index 6cfbb41..0cea20e 100644 (file)
@@ -559,6 +559,7 @@ int carl9170_set_hwretry_limit(struct ar9170 *ar, const u32 max_retry);
 int carl9170_upload_key(struct ar9170 *ar, const u8 id, const u8 *mac,
        const u8 ktype, const u8 keyidx, const u8 *keydata, const int keylen);
 int carl9170_disable_key(struct ar9170 *ar, const u8 id);
+int carl9170_set_mac_tpc(struct ar9170 *ar, struct ieee80211_channel *channel);
 
 /* RX */
 void carl9170_rx(struct ar9170 *ar, void *buf, unsigned int len);
@@ -593,7 +594,6 @@ int carl9170_get_noisefloor(struct ar9170 *ar);
 
 /* FW */
 int carl9170_parse_firmware(struct ar9170 *ar);
-int carl9170_fw_fix_eeprom(struct ar9170 *ar);
 
 extern struct ieee80211_rate __carl9170_ratetable[];
 extern int modparam_noht;
index 3de61ad..cffde8d 100644 (file)
@@ -389,39 +389,6 @@ carl9170_find_fw_desc(struct ar9170 *ar, const __u8 *fw_data, const size_t len)
        return (void *)&fw_data[scan - found];
 }
 
-int carl9170_fw_fix_eeprom(struct ar9170 *ar)
-{
-       const struct carl9170fw_fix_desc *fix_desc = NULL;
-       unsigned int i, n, off;
-       u32 *data = (void *)&ar->eeprom;
-
-       fix_desc = carl9170_fw_find_desc(ar, FIX_MAGIC,
-               sizeof(*fix_desc), CARL9170FW_FIX_DESC_CUR_VER);
-
-       if (!fix_desc)
-               return 0;
-
-       n = (le16_to_cpu(fix_desc->head.length) - sizeof(*fix_desc)) /
-           sizeof(struct carl9170fw_fix_entry);
-
-       for (i = 0; i < n; i++) {
-               off = le32_to_cpu(fix_desc->data[i].address) -
-                     AR9170_EEPROM_START;
-
-               if (off >= sizeof(struct ar9170_eeprom) || (off & 3)) {
-                       dev_err(&ar->udev->dev, "Skip invalid entry %d\n", i);
-                       continue;
-               }
-
-               data[off / sizeof(*data)] &=
-                       le32_to_cpu(fix_desc->data[i].mask);
-               data[off / sizeof(*data)] |=
-                       le32_to_cpu(fix_desc->data[i].value);
-       }
-
-       return 0;
-}
-
 int carl9170_parse_firmware(struct ar9170 *ar)
 {
        const struct carl9170fw_desc_head *fw_desc = NULL;
index dfda919..53415bf 100644 (file)
@@ -485,3 +485,38 @@ int carl9170_disable_key(struct ar9170 *ar, const u8 id)
        return carl9170_exec_cmd(ar, CARL9170_CMD_DKEY,
                sizeof(key), (u8 *)&key, 0, NULL);
 }
+
+int carl9170_set_mac_tpc(struct ar9170 *ar, struct ieee80211_channel *channel)
+{
+       unsigned int power, chains;
+
+       if (ar->eeprom.tx_mask != 1)
+               chains = AR9170_TX_PHY_TXCHAIN_2;
+       else
+               chains = AR9170_TX_PHY_TXCHAIN_1;
+
+       switch (channel->band) {
+       case IEEE80211_BAND_2GHZ:
+               power = ar->power_2G_ofdm[0] & 0x3f;
+               break;
+       case IEEE80211_BAND_5GHZ:
+               power = ar->power_5G_leg[0] & 0x3f;
+               break;
+       default:
+               BUG_ON(1);
+       }
+
+       power = min_t(unsigned int, power, ar->hw->conf.power_level * 2);
+
+       carl9170_regwrite_begin(ar);
+       carl9170_regwrite(AR9170_MAC_REG_ACK_TPC,
+                         0x3c1e | power << 20 | chains << 26);
+       carl9170_regwrite(AR9170_MAC_REG_RTS_CTS_TPC,
+                         power << 5 | chains << 11 |
+                         power << 21 | chains << 27);
+       carl9170_regwrite(AR9170_MAC_REG_CFEND_QOSNULL_TPC,
+                         power << 5 | chains << 11 |
+                         power << 21 | chains << 27);
+       carl9170_regwrite_finish();
+       return carl9170_regwrite_result();
+}
index db77421..8d2523b 100644 (file)
@@ -853,11 +853,6 @@ static int carl9170_op_config(struct ieee80211_hw *hw, u32 changed)
                        goto out;
        }
 
-       if (changed & IEEE80211_CONF_CHANGE_POWER) {
-               /* TODO */
-               err = 0;
-       }
-
        if (changed & IEEE80211_CONF_CHANGE_SMPS) {
                /* TODO */
                err = 0;
@@ -891,6 +886,12 @@ static int carl9170_op_config(struct ieee80211_hw *hw, u32 changed)
                        goto out;
        }
 
+       if (changed & IEEE80211_CONF_CHANGE_POWER) {
+               err = carl9170_set_mac_tpc(ar, ar->hw->conf.channel);
+               if (err)
+                       goto out;
+       }
+
 out:
        mutex_unlock(&ar->mutex);
        return err;
@@ -1796,6 +1797,9 @@ void *carl9170_alloc(size_t priv_size)
                ar->noise[i] = -95; /* ATH_DEFAULT_NOISE_FLOOR */
 
        hw->wiphy->flags &= ~WIPHY_FLAG_PS_ON_BY_DEFAULT;
+
+       /* As IBSS Encryption is software-based, IBSS RSN is supported. */
+       hw->wiphy->flags |= WIPHY_FLAG_IBSS_RSN;
        return ar;
 
 err_nomem:
@@ -1931,10 +1935,6 @@ int carl9170_register(struct ar9170 *ar)
        if (err)
                return err;
 
-       err = carl9170_fw_fix_eeprom(ar);
-       if (err)
-               return err;
-
        err = carl9170_parse_eeprom(ar);
        if (err)
                return err;
index 472efc7..b72c09c 100644 (file)
@@ -1426,15 +1426,15 @@ static void carl9170_calc_ctl(struct ar9170 *ar, u32 freq, enum carl9170_bw bw)
 #undef EDGES
 }
 
-static int carl9170_set_power_cal(struct ar9170 *ar, u32 freq,
-                                 enum carl9170_bw bw)
+static void carl9170_set_power_cal(struct ar9170 *ar, u32 freq,
+                                  enum carl9170_bw bw)
 {
        struct ar9170_calibration_target_power_legacy *ctpl;
        struct ar9170_calibration_target_power_ht *ctph;
        u8 *ctpres;
        int ntargets;
        int idx, i, n;
-       u8 ackpower, ackchains, f;
+       u8 f;
        u8 pwr_freqs[AR5416_MAX_NUM_TGT_PWRS];
 
        if (freq < 3000)
@@ -1523,32 +1523,6 @@ static int carl9170_set_power_cal(struct ar9170 *ar, u32 freq,
 
        /* calc. conformance test limits and apply to ar->power*[] */
        carl9170_calc_ctl(ar, freq, bw);
-
-       /* set ACK/CTS TX power */
-       carl9170_regwrite_begin(ar);
-
-       if (ar->eeprom.tx_mask != 1)
-               ackchains = AR9170_TX_PHY_TXCHAIN_2;
-       else
-               ackchains = AR9170_TX_PHY_TXCHAIN_1;
-
-       if (freq < 3000)
-               ackpower = ar->power_2G_ofdm[0] & 0x3f;
-       else
-               ackpower = ar->power_5G_leg[0] & 0x3f;
-
-       carl9170_regwrite(AR9170_MAC_REG_ACK_TPC,
-                         0x3c1e | ackpower << 20 | ackchains << 26);
-       carl9170_regwrite(AR9170_MAC_REG_RTS_CTS_TPC,
-                         ackpower << 5 | ackchains << 11 |
-                         ackpower << 21 | ackchains << 27);
-
-       carl9170_regwrite(AR9170_MAC_REG_CFEND_QOSNULL_TPC,
-                         ackpower << 5 | ackchains << 11 |
-                         ackpower << 21 | ackchains << 27);
-
-       carl9170_regwrite_finish();
-       return carl9170_regwrite_result();
 }
 
 int carl9170_get_noisefloor(struct ar9170 *ar)
@@ -1712,7 +1686,9 @@ int carl9170_set_channel(struct ar9170 *ar, struct ieee80211_channel *channel,
        if (err)
                return err;
 
-       err = carl9170_set_power_cal(ar, channel->center_freq, bw);
+       carl9170_set_power_cal(ar, channel->center_freq, bw);
+
+       err = carl9170_set_mac_tpc(ar, channel);
        if (err)
                return err;
 
index d19a9ee..aed3051 100644 (file)
@@ -719,6 +719,8 @@ static void carl9170_tx_rate_tpc_chains(struct ar9170 *ar,
                else
                        *chains = AR9170_TX_PHY_TXCHAIN_2;
        }
+
+       *tpc = min_t(unsigned int, *tpc, ar->hw->conf.power_level * 2);
 }
 
 static __le32 carl9170_tx_physet(struct ar9170 *ar,
@@ -1234,6 +1236,7 @@ static bool carl9170_tx_ps_drop(struct ar9170 *ar, struct sk_buff *skb)
 {
        struct ieee80211_sta *sta;
        struct carl9170_sta_info *sta_info;
+       struct ieee80211_tx_info *tx_info;
 
        rcu_read_lock();
        sta = __carl9170_get_tx_sta(ar, skb);
@@ -1241,16 +1244,18 @@ static bool carl9170_tx_ps_drop(struct ar9170 *ar, struct sk_buff *skb)
                goto out_rcu;
 
        sta_info = (void *) sta->drv_priv;
-       if (unlikely(sta_info->sleeping)) {
-               struct ieee80211_tx_info *tx_info;
+       tx_info = IEEE80211_SKB_CB(skb);
 
+       if (unlikely(sta_info->sleeping) &&
+           !(tx_info->flags & (IEEE80211_TX_CTL_NO_PS_BUFFER |
+                               IEEE80211_TX_CTL_CLEAR_PS_FILT))) {
                rcu_read_unlock();
 
-               tx_info = IEEE80211_SKB_CB(skb);
                if (tx_info->flags & IEEE80211_TX_CTL_AMPDU)
                        atomic_dec(&ar->tx_ampdu_upload);
 
                tx_info->flags |= IEEE80211_TX_STAT_TX_FILTERED;
+               carl9170_release_dev_space(ar, skb);
                carl9170_tx_status(ar, skb, false);
                return true;
        }
index 7e45ca2..3010cee 100644 (file)
@@ -1533,10 +1533,9 @@ struct net_device *init_atmel_card(unsigned short irq, unsigned long port,
 
        /* Create the network device object. */
        dev = alloc_etherdev(sizeof(*priv));
-       if (!dev) {
-               printk(KERN_ERR "atmel: Couldn't alloc_etherdev\n");
+       if (!dev)
                return NULL;
-       }
+
        if (dev_alloc_name(dev, dev->name) < 0) {
                printk(KERN_ERR "atmel: Couldn't get name!\n");
                goto err_out_free;
index 16e8f80..835462d 100644 (file)
@@ -999,6 +999,12 @@ static inline void b43_write16(struct b43_wldev *dev, u16 offset, u16 value)
        dev->dev->write16(dev->dev, offset, value);
 }
 
+static inline void b43_maskset16(struct b43_wldev *dev, u16 offset, u16 mask,
+                                u16 set)
+{
+       b43_write16(dev, offset, (b43_read16(dev, offset) & mask) | set);
+}
+
 static inline u32 b43_read32(struct b43_wldev *dev, u16 offset)
 {
        return dev->dev->read32(dev->dev, offset);
@@ -1009,6 +1015,12 @@ static inline void b43_write32(struct b43_wldev *dev, u16 offset, u32 value)
        dev->dev->write32(dev->dev, offset, value);
 }
 
+static inline void b43_maskset32(struct b43_wldev *dev, u16 offset, u32 mask,
+                                u32 set)
+{
+       b43_write32(dev, offset, (b43_read32(dev, offset) & mask) | set);
+}
+
 static inline void b43_block_read(struct b43_wldev *dev, void *buffer,
                                 size_t count, u16 offset, u8 reg_width)
 {
index 23ffb1b..5189cf3 100644 (file)
@@ -580,22 +580,14 @@ void b43_tsf_read(struct b43_wldev *dev, u64 *tsf)
 
 static void b43_time_lock(struct b43_wldev *dev)
 {
-       u32 macctl;
-
-       macctl = b43_read32(dev, B43_MMIO_MACCTL);
-       macctl |= B43_MACCTL_TBTTHOLD;
-       b43_write32(dev, B43_MMIO_MACCTL, macctl);
+       b43_maskset32(dev, B43_MMIO_MACCTL, ~0, B43_MACCTL_TBTTHOLD);
        /* Commit the write */
        b43_read32(dev, B43_MMIO_MACCTL);
 }
 
 static void b43_time_unlock(struct b43_wldev *dev)
 {
-       u32 macctl;
-
-       macctl = b43_read32(dev, B43_MMIO_MACCTL);
-       macctl &= ~B43_MACCTL_TBTTHOLD;
-       b43_write32(dev, B43_MMIO_MACCTL, macctl);
+       b43_maskset32(dev, B43_MMIO_MACCTL, ~B43_MACCTL_TBTTHOLD, 0);
        /* Commit the write */
        b43_read32(dev, B43_MMIO_MACCTL);
 }
@@ -2487,10 +2479,8 @@ static int b43_upload_microcode(struct b43_wldev *dev)
        b43_write32(dev, B43_MMIO_GEN_IRQ_REASON, B43_IRQ_ALL);
 
        /* Start the microcode PSM */
-       macctl = b43_read32(dev, B43_MMIO_MACCTL);
-       macctl &= ~B43_MACCTL_PSM_JMP0;
-       macctl |= B43_MACCTL_PSM_RUN;
-       b43_write32(dev, B43_MMIO_MACCTL, macctl);
+       b43_maskset32(dev, B43_MMIO_MACCTL, ~B43_MACCTL_PSM_JMP0,
+                     B43_MACCTL_PSM_RUN);
 
        /* Wait for the microcode to load and respond */
        i = 0;
@@ -2590,10 +2580,9 @@ static int b43_upload_microcode(struct b43_wldev *dev)
        return 0;
 
 error:
-       macctl = b43_read32(dev, B43_MMIO_MACCTL);
-       macctl &= ~B43_MACCTL_PSM_RUN;
-       macctl |= B43_MACCTL_PSM_JMP0;
-       b43_write32(dev, B43_MMIO_MACCTL, macctl);
+       /* Stop the microcode PSM. */
+       b43_maskset32(dev, B43_MMIO_MACCTL, ~B43_MACCTL_PSM_RUN,
+                     B43_MACCTL_PSM_JMP0);
 
        return err;
 }
@@ -2708,11 +2697,8 @@ static int b43_gpio_init(struct b43_wldev *dev)
        struct ssb_device *gpiodev;
        u32 mask, set;
 
-       b43_write32(dev, B43_MMIO_MACCTL, b43_read32(dev, B43_MMIO_MACCTL)
-                   & ~B43_MACCTL_GPOUTSMSK);
-
-       b43_write16(dev, B43_MMIO_GPIO_MASK, b43_read16(dev, B43_MMIO_GPIO_MASK)
-                   | 0x000F);
+       b43_maskset32(dev, B43_MMIO_MACCTL, ~B43_MACCTL_GPOUTSMSK, 0);
+       b43_maskset16(dev, B43_MMIO_GPIO_MASK, ~0, 0xF);
 
        mask = 0x0000001F;
        set = 0x0000000F;
@@ -2800,9 +2786,7 @@ void b43_mac_enable(struct b43_wldev *dev)
        dev->mac_suspended--;
        B43_WARN_ON(dev->mac_suspended < 0);
        if (dev->mac_suspended == 0) {
-               b43_write32(dev, B43_MMIO_MACCTL,
-                           b43_read32(dev, B43_MMIO_MACCTL)
-                           | B43_MACCTL_ENABLED);
+               b43_maskset32(dev, B43_MMIO_MACCTL, ~0, B43_MACCTL_ENABLED);
                b43_write32(dev, B43_MMIO_GEN_IRQ_REASON,
                            B43_IRQ_MAC_SUSPENDED);
                /* Commit writes */
@@ -2823,9 +2807,7 @@ void b43_mac_suspend(struct b43_wldev *dev)
 
        if (dev->mac_suspended == 0) {
                b43_power_saving_ctl_bits(dev, B43_PS_AWAKE);
-               b43_write32(dev, B43_MMIO_MACCTL,
-                           b43_read32(dev, B43_MMIO_MACCTL)
-                           & ~B43_MACCTL_ENABLED);
+               b43_maskset32(dev, B43_MMIO_MACCTL, ~B43_MACCTL_ENABLED, 0);
                /* force pci to flush the write */
                b43_read32(dev, B43_MMIO_MACCTL);
                for (i = 35; i; i--) {
@@ -2931,15 +2913,10 @@ static void b43_adjust_opmode(struct b43_wldev *dev)
         *        so always disable it. If we want to implement PMQ,
         *        we need to enable it here (clear DISCPMQ) in AP mode.
         */
-       if (0  /* ctl & B43_MACCTL_AP */) {
-               b43_write32(dev, B43_MMIO_MACCTL,
-                           b43_read32(dev, B43_MMIO_MACCTL)
-                           & ~B43_MACCTL_DISCPMQ);
-       } else {
-               b43_write32(dev, B43_MMIO_MACCTL,
-                           b43_read32(dev, B43_MMIO_MACCTL)
-                           | B43_MACCTL_DISCPMQ);
-       }
+       if (0  /* ctl & B43_MACCTL_AP */)
+               b43_maskset32(dev, B43_MMIO_MACCTL, ~B43_MACCTL_DISCPMQ, 0);
+       else
+               b43_maskset32(dev, B43_MMIO_MACCTL, ~0, B43_MACCTL_DISCPMQ);
 }
 
 static void b43_rate_memory_write(struct b43_wldev *dev, u16 rate, int is_ofdm)
@@ -3083,10 +3060,8 @@ static int b43_chip_init(struct b43_wldev *dev)
        if (dev->dev->core_rev < 5)
                b43_write32(dev, 0x010C, 0x01000000);
 
-       b43_write32(dev, B43_MMIO_MACCTL, b43_read32(dev, B43_MMIO_MACCTL)
-                   & ~B43_MACCTL_INFRA);
-       b43_write32(dev, B43_MMIO_MACCTL, b43_read32(dev, B43_MMIO_MACCTL)
-                   | B43_MACCTL_INFRA);
+       b43_maskset32(dev, B43_MMIO_MACCTL, ~B43_MACCTL_INFRA, 0);
+       b43_maskset32(dev, B43_MMIO_MACCTL, ~0, B43_MACCTL_INFRA);
 
        /* Probe Response Timeout value */
        /* FIXME: Default to 0, has to be set by ioctl probably... :-/ */
@@ -4564,8 +4539,6 @@ static void b43_set_pretbtt(struct b43_wldev *dev)
 /* Locking: wl->mutex */
 static void b43_wireless_core_exit(struct b43_wldev *dev)
 {
-       u32 macctl;
-
        B43_WARN_ON(dev && b43_status(dev) > B43_STAT_INITIALIZED);
        if (!dev || b43_status(dev) != B43_STAT_INITIALIZED)
                return;
@@ -4576,10 +4549,8 @@ static void b43_wireless_core_exit(struct b43_wldev *dev)
        b43_set_status(dev, B43_STAT_UNINIT);
 
        /* Stop the microcode PSM. */
-       macctl = b43_read32(dev, B43_MMIO_MACCTL);
-       macctl &= ~B43_MACCTL_PSM_RUN;
-       macctl |= B43_MACCTL_PSM_JMP0;
-       b43_write32(dev, B43_MMIO_MACCTL, macctl);
+       b43_maskset32(dev, B43_MMIO_MACCTL, ~B43_MACCTL_PSM_RUN,
+                     B43_MACCTL_PSM_JMP0);
 
        b43_dma_free(dev);
        b43_pio_free(dev);
index bf5a438..1081188 100644 (file)
@@ -85,22 +85,11 @@ static inline bool b43_nphy_ipa(struct b43_wldev *dev)
                (dev->phy.n->ipa5g_on && band == IEEE80211_BAND_5GHZ));
 }
 
-/* http://bcm-v4.sipsolutions.net/802.11/PHY/N/GetIpaGainTbl */
-static const u32 *b43_nphy_get_ipa_gain_table(struct b43_wldev *dev)
+/* http://bcm-v4.sipsolutions.net/802.11/PHY/N/RxCoreGetState */
+static u8 b43_nphy_get_rx_core_state(struct b43_wldev *dev)
 {
-       if (b43_current_band(dev->wl) == IEEE80211_BAND_2GHZ) {
-               if (dev->phy.rev >= 6) {
-                       if (dev->dev->chip_id == 47162)
-                               return txpwrctrl_tx_gain_ipa_rev5;
-                       return txpwrctrl_tx_gain_ipa_rev6;
-               } else if (dev->phy.rev >= 5) {
-                       return txpwrctrl_tx_gain_ipa_rev5;
-               } else {
-                       return txpwrctrl_tx_gain_ipa;
-               }
-       } else {
-               return txpwrctrl_tx_gain_ipa_5g;
-       }
+       return (b43_phy_read(dev, B43_NPHY_RFSEQCA) & B43_NPHY_RFSEQCA_RXEN) >>
+               B43_NPHY_RFSEQCA_RXEN_SHIFT;
 }
 
 /**************************************************
@@ -229,7 +218,7 @@ static void b43_nphy_rf_control_intc_override(struct b43_wldev *dev, u8 field,
 
                reg = (i == 0) ?
                        B43_NPHY_RFCTL_INTC1 : B43_NPHY_RFCTL_INTC2;
-               b43_phy_mask(dev, reg, 0xFBFF);
+               b43_phy_set(dev, reg, 0x400);
 
                switch (field) {
                case 0:
@@ -245,7 +234,7 @@ static void b43_nphy_rf_control_intc_override(struct b43_wldev *dev, u8 field,
                                b43_phy_set(dev, B43_NPHY_RFCTL_CMD,
                                                B43_NPHY_RFCTL_CMD_START);
                                for (j = 0; j < 100; j++) {
-                                       if (b43_phy_read(dev, B43_NPHY_RFCTL_CMD) & B43_NPHY_RFCTL_CMD_START) {
+                                       if (!(b43_phy_read(dev, B43_NPHY_RFCTL_CMD) & B43_NPHY_RFCTL_CMD_START)) {
                                                j = 0;
                                                break;
                                        }
@@ -264,7 +253,7 @@ static void b43_nphy_rf_control_intc_override(struct b43_wldev *dev, u8 field,
                                b43_phy_set(dev, B43_NPHY_RFCTL_CMD,
                                                B43_NPHY_RFCTL_CMD_RXTX);
                                for (j = 0; j < 100; j++) {
-                                       if (b43_phy_read(dev, B43_NPHY_RFCTL_CMD) & B43_NPHY_RFCTL_CMD_RXTX) {
+                                       if (!(b43_phy_read(dev, B43_NPHY_RFCTL_CMD) & B43_NPHY_RFCTL_CMD_RXTX)) {
                                                j = 0;
                                                break;
                                        }
@@ -1231,12 +1220,12 @@ static int b43_nphy_poll_rssi(struct b43_wldev *dev, u8 type, s32 *buf,
        u16 s[2];
 
        if (dev->phy.rev >= 3) {
-               save_regs_phy[0] = b43_phy_read(dev,
+               save_regs_phy[0] = b43_phy_read(dev, B43_NPHY_AFECTL_C1);
+               save_regs_phy[1] = b43_phy_read(dev, B43_NPHY_AFECTL_C2);
+               save_regs_phy[2] = b43_phy_read(dev,
                                                B43_NPHY_RFCTL_LUT_TRSW_UP1);
-               save_regs_phy[1] = b43_phy_read(dev,
+               save_regs_phy[3] = b43_phy_read(dev,
                                                B43_NPHY_RFCTL_LUT_TRSW_UP2);
-               save_regs_phy[2] = b43_phy_read(dev, B43_NPHY_AFECTL_C1);
-               save_regs_phy[3] = b43_phy_read(dev, B43_NPHY_AFECTL_C2);
                save_regs_phy[4] = b43_phy_read(dev, B43_NPHY_AFECTL_OVER1);
                save_regs_phy[5] = b43_phy_read(dev, B43_NPHY_AFECTL_OVER);
                save_regs_phy[6] = b43_phy_read(dev, B43_NPHY_TXF_40CO_B1S0);
@@ -1285,12 +1274,12 @@ static int b43_nphy_poll_rssi(struct b43_wldev *dev, u8 type, s32 *buf,
                b43_phy_write(dev, B43_NPHY_GPIO_SEL, save_regs_phy[8]);
 
        if (dev->phy.rev >= 3) {
+               b43_phy_write(dev, B43_NPHY_AFECTL_C1, save_regs_phy[0]);
+               b43_phy_write(dev, B43_NPHY_AFECTL_C2, save_regs_phy[1]);
                b43_phy_write(dev, B43_NPHY_RFCTL_LUT_TRSW_UP1,
-                               save_regs_phy[0]);
+                               save_regs_phy[2]);
                b43_phy_write(dev, B43_NPHY_RFCTL_LUT_TRSW_UP2,
-                               save_regs_phy[1]);
-               b43_phy_write(dev, B43_NPHY_AFECTL_C1, save_regs_phy[2]);
-               b43_phy_write(dev, B43_NPHY_AFECTL_C2, save_regs_phy[3]);
+                               save_regs_phy[3]);
                b43_phy_write(dev, B43_NPHY_AFECTL_OVER1, save_regs_phy[4]);
                b43_phy_write(dev, B43_NPHY_AFECTL_OVER, save_regs_phy[5]);
                b43_phy_write(dev, B43_NPHY_TXF_40CO_B1S0, save_regs_phy[6]);
@@ -1308,6 +1297,186 @@ static int b43_nphy_poll_rssi(struct b43_wldev *dev, u8 type, s32 *buf,
        return out;
 }
 
+/* http://bcm-v4.sipsolutions.net/802.11/PHY/N/RSSICalRev3 */
+static void b43_nphy_rev3_rssi_cal(struct b43_wldev *dev)
+{
+       struct b43_phy_n *nphy = dev->phy.n;
+
+       u16 saved_regs_phy_rfctl[2];
+       u16 saved_regs_phy[13];
+       u16 regs_to_store[] = {
+               B43_NPHY_AFECTL_OVER1, B43_NPHY_AFECTL_OVER,
+               B43_NPHY_AFECTL_C1, B43_NPHY_AFECTL_C2,
+               B43_NPHY_TXF_40CO_B1S1, B43_NPHY_RFCTL_OVER,
+               B43_NPHY_TXF_40CO_B1S0, B43_NPHY_TXF_40CO_B32S1,
+               B43_NPHY_RFCTL_CMD,
+               B43_NPHY_RFCTL_LUT_TRSW_UP1, B43_NPHY_RFCTL_LUT_TRSW_UP2,
+               B43_NPHY_RFCTL_RSSIO1, B43_NPHY_RFCTL_RSSIO2
+       };
+
+       u16 class;
+
+       u16 clip_state[2];
+       u16 clip_off[2] = { 0xFFFF, 0xFFFF };
+
+       u8 vcm_final = 0;
+       s8 offset[4];
+       s32 results[8][4] = { };
+       s32 results_min[4] = { };
+       s32 poll_results[4] = { };
+
+       u16 *rssical_radio_regs = NULL;
+       u16 *rssical_phy_regs = NULL;
+
+       u16 r; /* routing */
+       u8 rx_core_state;
+       u8 core, i, j;
+
+       class = b43_nphy_classifier(dev, 0, 0);
+       b43_nphy_classifier(dev, 7, 4);
+       b43_nphy_read_clip_detection(dev, clip_state);
+       b43_nphy_write_clip_detection(dev, clip_off);
+
+       saved_regs_phy_rfctl[0] = b43_phy_read(dev, B43_NPHY_RFCTL_INTC1);
+       saved_regs_phy_rfctl[1] = b43_phy_read(dev, B43_NPHY_RFCTL_INTC2);
+       for (i = 0; i < ARRAY_SIZE(regs_to_store); i++)
+               saved_regs_phy[i] = b43_phy_read(dev, regs_to_store[i]);
+
+       b43_nphy_rf_control_intc_override(dev, 0, 0, 7);
+       b43_nphy_rf_control_intc_override(dev, 1, 1, 7);
+       b43_nphy_rf_control_override(dev, 0x1, 0, 0, false);
+       b43_nphy_rf_control_override(dev, 0x2, 1, 0, false);
+       b43_nphy_rf_control_override(dev, 0x80, 1, 0, false);
+       b43_nphy_rf_control_override(dev, 0x40, 1, 0, false);
+
+       if (b43_current_band(dev->wl) == IEEE80211_BAND_5GHZ) {
+               b43_nphy_rf_control_override(dev, 0x20, 0, 0, false);
+               b43_nphy_rf_control_override(dev, 0x10, 1, 0, false);
+       } else {
+               b43_nphy_rf_control_override(dev, 0x10, 0, 0, false);
+               b43_nphy_rf_control_override(dev, 0x20, 1, 0, false);
+       }
+
+       rx_core_state = b43_nphy_get_rx_core_state(dev);
+       for (core = 0; core < 2; core++) {
+               if (!(rx_core_state & (1 << core)))
+                       continue;
+               r = core ? B2056_RX1 : B2056_RX0;
+               b43_nphy_scale_offset_rssi(dev, 0, 0, core + 1, 0, 2);
+               b43_nphy_scale_offset_rssi(dev, 0, 0, core + 1, 1, 2);
+               for (i = 0; i < 8; i++) {
+                       b43_radio_maskset(dev, r | B2056_RX_RSSI_MISC, 0xE3,
+                                       i << 2);
+                       b43_nphy_poll_rssi(dev, 2, results[i], 8);
+               }
+               for (i = 0; i < 4; i++) {
+                       s32 curr;
+                       s32 mind = 40;
+                       s32 minpoll = 249;
+                       u8 minvcm = 0;
+                       if (2 * core != i)
+                               continue;
+                       for (j = 0; j < 8; j++) {
+                               curr = results[j][i] * results[j][i] +
+                                       results[j][i + 1] * results[j][i];
+                               if (curr < mind) {
+                                       mind = curr;
+                                       minvcm = j;
+                               }
+                               if (results[j][i] < minpoll)
+                                       minpoll = results[j][i];
+                       }
+                       vcm_final = minvcm;
+                       results_min[i] = minpoll;
+               }
+               b43_radio_maskset(dev, r | B2056_RX_RSSI_MISC, 0xE3,
+                                 vcm_final << 2);
+               for (i = 0; i < 4; i++) {
+                       if (core != i / 2)
+                               continue;
+                       offset[i] = -results[vcm_final][i];
+                       if (offset[i] < 0)
+                               offset[i] = -((abs(offset[i]) + 4) / 8);
+                       else
+                               offset[i] = (offset[i] + 4) / 8;
+                       if (results_min[i] == 248)
+                               offset[i] = -32;
+                       b43_nphy_scale_offset_rssi(dev, 0, offset[i],
+                                                  (i / 2 == 0) ? 1 : 2,
+                                                  (i % 2 == 0) ? 0 : 1,
+                                                  2);
+               }
+       }
+       for (core = 0; core < 2; core++) {
+               if (!(rx_core_state & (1 << core)))
+                       continue;
+               for (i = 0; i < 2; i++) {
+                       b43_nphy_scale_offset_rssi(dev, 0, 0, core + 1, 0, i);
+                       b43_nphy_scale_offset_rssi(dev, 0, 0, core + 1, 1, i);
+                       b43_nphy_poll_rssi(dev, i, poll_results, 8);
+                       for (j = 0; j < 4; j++) {
+                               if (j / 2 == core)
+                                       offset[j] = 232 - poll_results[j];
+                               if (offset[j] < 0)
+                                       offset[j] = -(abs(offset[j] + 4) / 8);
+                               else
+                                       offset[j] = (offset[j] + 4) / 8;
+                               b43_nphy_scale_offset_rssi(dev, 0,
+                                       offset[2 * core], core + 1, j % 2, i);
+                       }
+               }
+       }
+
+       b43_phy_write(dev, B43_NPHY_RFCTL_INTC1, saved_regs_phy_rfctl[0]);
+       b43_phy_write(dev, B43_NPHY_RFCTL_INTC2, saved_regs_phy_rfctl[1]);
+
+       b43_nphy_force_rf_sequence(dev, B43_RFSEQ_RESET2RX);
+
+       b43_phy_set(dev, B43_NPHY_TXF_40CO_B1S1, 0x1);
+       b43_phy_set(dev, B43_NPHY_RFCTL_CMD, B43_NPHY_RFCTL_CMD_START);
+       b43_phy_mask(dev, B43_NPHY_TXF_40CO_B1S1, ~0x1);
+
+       b43_phy_set(dev, B43_NPHY_RFCTL_OVER, 0x1);
+       b43_phy_set(dev, B43_NPHY_RFCTL_CMD, B43_NPHY_RFCTL_CMD_RXTX);
+       b43_phy_mask(dev, B43_NPHY_TXF_40CO_B1S1, ~0x1);
+
+       for (i = 0; i < ARRAY_SIZE(regs_to_store); i++)
+               b43_phy_write(dev, regs_to_store[i], saved_regs_phy[i]);
+
+       /* Store for future configuration */
+       if (b43_current_band(dev->wl) == IEEE80211_BAND_2GHZ) {
+               rssical_radio_regs = nphy->rssical_cache.rssical_radio_regs_2G;
+               rssical_phy_regs = nphy->rssical_cache.rssical_phy_regs_2G;
+       } else {
+               rssical_radio_regs = nphy->rssical_cache.rssical_radio_regs_5G;
+               rssical_phy_regs = nphy->rssical_cache.rssical_phy_regs_5G;
+       }
+       rssical_radio_regs[0] = b43_radio_read(dev, 0x602B);
+       rssical_radio_regs[0] = b43_radio_read(dev, 0x702B);
+       rssical_phy_regs[0] = b43_phy_read(dev, B43_NPHY_RSSIMC_0I_RSSI_Z);
+       rssical_phy_regs[1] = b43_phy_read(dev, B43_NPHY_RSSIMC_0Q_RSSI_Z);
+       rssical_phy_regs[2] = b43_phy_read(dev, B43_NPHY_RSSIMC_1I_RSSI_Z);
+       rssical_phy_regs[3] = b43_phy_read(dev, B43_NPHY_RSSIMC_1Q_RSSI_Z);
+       rssical_phy_regs[4] = b43_phy_read(dev, B43_NPHY_RSSIMC_0I_RSSI_X);
+       rssical_phy_regs[5] = b43_phy_read(dev, B43_NPHY_RSSIMC_0Q_RSSI_X);
+       rssical_phy_regs[6] = b43_phy_read(dev, B43_NPHY_RSSIMC_1I_RSSI_X);
+       rssical_phy_regs[7] = b43_phy_read(dev, B43_NPHY_RSSIMC_1Q_RSSI_X);
+       rssical_phy_regs[8] = b43_phy_read(dev, B43_NPHY_RSSIMC_0I_RSSI_Y);
+       rssical_phy_regs[9] = b43_phy_read(dev, B43_NPHY_RSSIMC_0Q_RSSI_Y);
+       rssical_phy_regs[10] = b43_phy_read(dev, B43_NPHY_RSSIMC_1I_RSSI_Y);
+       rssical_phy_regs[11] = b43_phy_read(dev, B43_NPHY_RSSIMC_1Q_RSSI_Y);
+
+       /* Remember for which channel we store configuration */
+       if (b43_current_band(dev->wl) == IEEE80211_BAND_2GHZ)
+               nphy->rssical_chanspec_2G.center_freq = dev->phy.channel_freq;
+       else
+               nphy->rssical_chanspec_5G.center_freq = dev->phy.channel_freq;
+
+       /* End of calibration, restore configuration */
+       b43_nphy_classifier(dev, 7, class);
+       b43_nphy_write_clip_detection(dev, clip_state);
+}
+
 /* http://bcm-v4.sipsolutions.net/802.11/PHY/N/RSSICal */
 static void b43_nphy_rev2_rssi_cal(struct b43_wldev *dev, u8 type)
 {
@@ -1472,12 +1641,6 @@ static void b43_nphy_rev2_rssi_cal(struct b43_wldev *dev, u8 type)
        b43_nphy_reset_cca(dev);
 }
 
-/* http://bcm-v4.sipsolutions.net/802.11/PHY/N/RSSICalRev3 */
-static void b43_nphy_rev3_rssi_cal(struct b43_wldev *dev)
-{
-       /* TODO */
-}
-
 /*
  * RSSI Calibration
  * http://bcm-v4.sipsolutions.net/802.11/PHY/N/RSSICal
@@ -2229,27 +2392,12 @@ static void b43_nphy_tx_power_fix(struct b43_wldev *dev)
        */
 
        for (i = 0; i < 2; i++) {
-               if (dev->phy.rev >= 3) {
-                       if (b43_nphy_ipa(dev)) {
-                               txgain = *(b43_nphy_get_ipa_gain_table(dev) +
-                                               txpi[i]);
-                       } else if (b43_current_band(dev->wl) ==
-                                  IEEE80211_BAND_5GHZ) {
-                               /* FIXME: use 5GHz tables */
-                               txgain =
-                                       b43_ntab_tx_gain_rev3plus_2ghz[txpi[i]];
-                       } else {
-                               if (dev->phy.rev >= 5 &&
-                                   sprom->fem.ghz5.extpa_gain == 3)
-                                       ; /* FIXME: 5GHz_txgain_HiPwrEPA */
-                               txgain =
-                                       b43_ntab_tx_gain_rev3plus_2ghz[txpi[i]];
-                       }
+               txgain = *(b43_nphy_get_tx_gain_table(dev) + txpi[i]);
+
+               if (dev->phy.rev >= 3)
                        radio_gain = (txgain >> 16) & 0x1FFFF;
-               } else {
-                       txgain = b43_ntab_tx_gain_rev0_1_2[txpi[i]];
+               else
                        radio_gain = (txgain >> 16) & 0x1FFF;
-               }
 
                if (dev->phy.rev >= 7)
                        dac_gain = (txgain >> 8) & 0x7;
@@ -2420,55 +2568,252 @@ static void b43_nphy_tx_power_ctl_idle_tssi(struct b43_wldev *dev)
        nphy->pwr_ctl_info[1].idle_tssi_2g = (tmp >> 8) & 0xFF;
 }
 
-static void b43_nphy_tx_gain_table_upload(struct b43_wldev *dev)
+/* http://bcm-v4.sipsolutions.net/PHY/N/TxPwrLimitToTbl */
+static void b43_nphy_tx_prepare_adjusted_power_table(struct b43_wldev *dev)
 {
-       struct b43_phy *phy = &dev->phy;
+       struct b43_phy_n *nphy = dev->phy.n;
 
-       const u32 *table = NULL;
-#if 0
-       TODO: b43_ntab_papd_pga_gain_delta_ipa_2*
-       u32 rfpwr_offset;
-       u8 pga_gain;
-       int i;
-#endif
+       u8 idx, delta;
+       u8 i, stf_mode;
 
-       if (phy->rev >= 3) {
-               if (b43_nphy_ipa(dev)) {
-                       table = b43_nphy_get_ipa_gain_table(dev);
+       for (i = 0; i < 4; i++)
+               nphy->adj_pwr_tbl[i] = nphy->tx_power_offset[i];
+
+       for (stf_mode = 0; stf_mode < 4; stf_mode++) {
+               delta = 0;
+               switch (stf_mode) {
+               case 0:
+                       if (dev->phy.is_40mhz && dev->phy.rev >= 5) {
+                               idx = 68;
+                       } else {
+                               delta = 1;
+                               idx = dev->phy.is_40mhz ? 52 : 4;
+                       }
+                       break;
+               case 1:
+                       idx = dev->phy.is_40mhz ? 76 : 28;
+                       break;
+               case 2:
+                       idx = dev->phy.is_40mhz ? 84 : 36;
+                       break;
+               case 3:
+                       idx = dev->phy.is_40mhz ? 92 : 44;
+                       break;
+               }
+
+               for (i = 0; i < 20; i++) {
+                       nphy->adj_pwr_tbl[4 + 4 * i + stf_mode] =
+                               nphy->tx_power_offset[idx];
+                       if (i == 0)
+                               idx += delta;
+                       if (i == 14)
+                               idx += 1 - delta;
+                       if (i == 3 || i == 4 || i == 7 || i == 8 || i == 11 ||
+                           i == 13)
+                               idx += 1;
+               }
+       }
+}
+
+/* http://bcm-v4.sipsolutions.net/802.11/PHY/N/TxPwrCtrlSetup */
+static void b43_nphy_tx_power_ctl_setup(struct b43_wldev *dev)
+{
+       struct b43_phy_n *nphy = dev->phy.n;
+       struct ssb_sprom *sprom = dev->dev->bus_sprom;
+
+       s16 a1[2], b0[2], b1[2];
+       u8 idle[2];
+       s8 target[2];
+       s32 num, den, pwr;
+       u32 regval[64];
+
+       u16 freq = dev->phy.channel_freq;
+       u16 tmp;
+       u16 r; /* routing */
+       u8 i, c;
+
+       if (dev->dev->core_rev == 11 || dev->dev->core_rev == 12) {
+               b43_maskset32(dev, B43_MMIO_MACCTL, ~0, 0x200000);
+               b43_read32(dev, B43_MMIO_MACCTL);
+               udelay(1);
+       }
+
+       if (nphy->hang_avoid)
+               b43_nphy_stay_in_carrier_search(dev, true);
+
+       b43_phy_set(dev, B43_NPHY_TSSIMODE, B43_NPHY_TSSIMODE_EN);
+       if (dev->phy.rev >= 3)
+               b43_phy_mask(dev, B43_NPHY_TXPCTL_CMD,
+                            ~B43_NPHY_TXPCTL_CMD_PCTLEN & 0xFFFF);
+       else
+               b43_phy_set(dev, B43_NPHY_TXPCTL_CMD,
+                           B43_NPHY_TXPCTL_CMD_PCTLEN);
+
+       if (dev->dev->core_rev == 11 || dev->dev->core_rev == 12)
+               b43_maskset32(dev, B43_MMIO_MACCTL, ~0x200000, 0);
+
+       if (sprom->revision < 4) {
+               idle[0] = nphy->pwr_ctl_info[0].idle_tssi_2g;
+               idle[1] = nphy->pwr_ctl_info[1].idle_tssi_2g;
+               target[0] = target[1] = 52;
+               a1[0] = a1[1] = -424;
+               b0[0] = b0[1] = 5612;
+               b1[0] = b1[1] = -1393;
+       } else {
+               if (b43_current_band(dev->wl) == IEEE80211_BAND_2GHZ) {
+                       for (c = 0; c < 2; c++) {
+                               idle[c] = nphy->pwr_ctl_info[c].idle_tssi_2g;
+                               target[c] = sprom->core_pwr_info[c].maxpwr_2g;
+                               a1[c] = sprom->core_pwr_info[c].pa_2g[0];
+                               b0[c] = sprom->core_pwr_info[c].pa_2g[1];
+                               b1[c] = sprom->core_pwr_info[c].pa_2g[2];
+                       }
+               } else if (freq >= 4900 && freq < 5100) {
+                       for (c = 0; c < 2; c++) {
+                               idle[c] = nphy->pwr_ctl_info[c].idle_tssi_5g;
+                               target[c] = sprom->core_pwr_info[c].maxpwr_5gl;
+                               a1[c] = sprom->core_pwr_info[c].pa_5gl[0];
+                               b0[c] = sprom->core_pwr_info[c].pa_5gl[1];
+                               b1[c] = sprom->core_pwr_info[c].pa_5gl[2];
+                       }
+               } else if (freq >= 5100 && freq < 5500) {
+                       for (c = 0; c < 2; c++) {
+                               idle[c] = nphy->pwr_ctl_info[c].idle_tssi_5g;
+                               target[c] = sprom->core_pwr_info[c].maxpwr_5g;
+                               a1[c] = sprom->core_pwr_info[c].pa_5g[0];
+                               b0[c] = sprom->core_pwr_info[c].pa_5g[1];
+                               b1[c] = sprom->core_pwr_info[c].pa_5g[2];
+                       }
+               } else if (freq >= 5500) {
+                       for (c = 0; c < 2; c++) {
+                               idle[c] = nphy->pwr_ctl_info[c].idle_tssi_5g;
+                               target[c] = sprom->core_pwr_info[c].maxpwr_5gh;
+                               a1[c] = sprom->core_pwr_info[c].pa_5gh[0];
+                               b0[c] = sprom->core_pwr_info[c].pa_5gh[1];
+                               b1[c] = sprom->core_pwr_info[c].pa_5gh[2];
+                       }
                } else {
-                       if (b43_current_band(dev->wl) == IEEE80211_BAND_5GHZ) {
-                               if (phy->rev == 3)
-                                       table = b43_ntab_tx_gain_rev3_5ghz;
-                               if (phy->rev == 4)
-                                       table = b43_ntab_tx_gain_rev4_5ghz;
-                               else
-                                       table = b43_ntab_tx_gain_rev5plus_5ghz;
+                       idle[0] = nphy->pwr_ctl_info[0].idle_tssi_5g;
+                       idle[1] = nphy->pwr_ctl_info[1].idle_tssi_5g;
+                       target[0] = target[1] = 52;
+                       a1[0] = a1[1] = -424;
+                       b0[0] = b0[1] = 5612;
+                       b1[0] = b1[1] = -1393;
+               }
+       }
+       /* target[0] = target[1] = nphy->tx_power_max; */
+
+       if (dev->phy.rev >= 3) {
+               if (sprom->fem.ghz2.tssipos)
+                       b43_phy_set(dev, B43_NPHY_TXPCTL_ITSSI, 0x4000);
+               if (dev->phy.rev >= 7) {
+                       for (c = 0; c < 2; c++) {
+                               r = c ? 0x190 : 0x170;
+                               if (b43_nphy_ipa(dev))
+                                       b43_radio_write(dev, r + 0x9, (b43_current_band(dev->wl) == IEEE80211_BAND_2GHZ) ? 0xE : 0xC);
+                       }
+               } else {
+                       if (b43_nphy_ipa(dev)) {
+                               tmp = (b43_current_band(dev->wl) == IEEE80211_BAND_5GHZ) ? 0xC : 0xE;
+                               b43_radio_write(dev,
+                                       B2056_TX0 | B2056_TX_TX_SSI_MUX, tmp);
+                               b43_radio_write(dev,
+                                       B2056_TX1 | B2056_TX_TX_SSI_MUX, tmp);
                        } else {
-                               table = b43_ntab_tx_gain_rev3plus_2ghz;
+                               b43_radio_write(dev,
+                                       B2056_TX0 | B2056_TX_TX_SSI_MUX, 0x11);
+                               b43_radio_write(dev,
+                                       B2056_TX1 | B2056_TX_TX_SSI_MUX, 0x11);
                        }
                }
+       }
+
+       if (dev->dev->core_rev == 11 || dev->dev->core_rev == 12) {
+               b43_maskset32(dev, B43_MMIO_MACCTL, ~0, 0x200000);
+               b43_read32(dev, B43_MMIO_MACCTL);
+               udelay(1);
+       }
+
+       if (dev->phy.rev >= 7) {
+               b43_phy_maskset(dev, B43_NPHY_TXPCTL_CMD,
+                               ~B43_NPHY_TXPCTL_CMD_INIT, 0x19);
+               b43_phy_maskset(dev, B43_NPHY_TXPCTL_INIT,
+                               ~B43_NPHY_TXPCTL_INIT_PIDXI1, 0x19);
        } else {
-               table = b43_ntab_tx_gain_rev0_1_2;
+               b43_phy_maskset(dev, B43_NPHY_TXPCTL_CMD,
+                               ~B43_NPHY_TXPCTL_CMD_INIT, 0x40);
+               if (dev->phy.rev > 1)
+                       b43_phy_maskset(dev, B43_NPHY_TXPCTL_INIT,
+                               ~B43_NPHY_TXPCTL_INIT_PIDXI1, 0x40);
+       }
+
+       if (dev->dev->core_rev == 11 || dev->dev->core_rev == 12)
+               b43_maskset32(dev, B43_MMIO_MACCTL, ~0x200000, 0);
+
+       b43_phy_write(dev, B43_NPHY_TXPCTL_N,
+                     0xF0 << B43_NPHY_TXPCTL_N_TSSID_SHIFT |
+                     3 << B43_NPHY_TXPCTL_N_NPTIL2_SHIFT);
+       b43_phy_write(dev, B43_NPHY_TXPCTL_ITSSI,
+                     idle[0] << B43_NPHY_TXPCTL_ITSSI_0_SHIFT |
+                     idle[1] << B43_NPHY_TXPCTL_ITSSI_1_SHIFT |
+                     B43_NPHY_TXPCTL_ITSSI_BINF);
+       b43_phy_write(dev, B43_NPHY_TXPCTL_TPWR,
+                     target[0] << B43_NPHY_TXPCTL_TPWR_0_SHIFT |
+                     target[1] << B43_NPHY_TXPCTL_TPWR_1_SHIFT);
+
+       for (c = 0; c < 2; c++) {
+               for (i = 0; i < 64; i++) {
+                       num = 8 * (16 * b0[c] + b1[c] * i);
+                       den = 32768 + a1[c] * i;
+                       pwr = max((4 * num + den / 2) / den, -8);
+                       if (dev->phy.rev < 3 && (i <= (31 - idle[c] + 1)))
+                               pwr = max(pwr, target[c] + 1);
+                       regval[i] = pwr;
+               }
+               b43_ntab_write_bulk(dev, B43_NTAB32(26 + c, 0), 64, regval);
        }
+
+       b43_nphy_tx_prepare_adjusted_power_table(dev);
+       /*
+       b43_ntab_write_bulk(dev, B43_NTAB16(26, 64), 84, nphy->adj_pwr_tbl);
+       b43_ntab_write_bulk(dev, B43_NTAB16(27, 64), 84, nphy->adj_pwr_tbl);
+       */
+
+       if (nphy->hang_avoid)
+               b43_nphy_stay_in_carrier_search(dev, false);
+}
+
+static void b43_nphy_tx_gain_table_upload(struct b43_wldev *dev)
+{
+       struct b43_phy *phy = &dev->phy;
+
+       const u32 *table = NULL;
+       u32 rfpwr_offset;
+       u8 pga_gain;
+       int i;
+
+       table = b43_nphy_get_tx_gain_table(dev);
        b43_ntab_write_bulk(dev, B43_NTAB32(26, 192), 128, table);
        b43_ntab_write_bulk(dev, B43_NTAB32(27, 192), 128, table);
 
        if (phy->rev >= 3) {
 #if 0
                nphy->gmval = (table[0] >> 16) & 0x7000;
+#endif
 
                for (i = 0; i < 128; i++) {
                        pga_gain = (table[i] >> 24) & 0xF;
                        if (b43_current_band(dev->wl) == IEEE80211_BAND_2GHZ)
-                               rfpwr_offset = b43_ntab_papd_pga_gain_delta_ipa_2g[pga_gain];
+                               rfpwr_offset =
+                                b43_ntab_papd_pga_gain_delta_ipa_2g[pga_gain];
                        else
-                               rfpwr_offset = b43_ntab_papd_pga_gain_delta_ipa_5g[pga_gain];
+                               rfpwr_offset =
+                                0; /* FIXME */
                        b43_ntab_write(dev, B43_NTAB32(26, 576 + i),
                                       rfpwr_offset);
                        b43_ntab_write(dev, B43_NTAB32(27, 576 + i),
                                       rfpwr_offset);
                }
-#endif
        }
 }
 
@@ -3139,32 +3484,13 @@ static struct nphy_txgains b43_nphy_get_tx_gains(struct b43_wldev *dev)
                        B43_NPHY_TXPCTL_STAT_BIDX_SHIFT;
 
                for (i = 0; i < 2; ++i) {
+                       table = b43_nphy_get_tx_gain_table(dev);
                        if (dev->phy.rev >= 3) {
-                               enum ieee80211_band band =
-                                       b43_current_band(dev->wl);
-
-                               if (b43_nphy_ipa(dev)) {
-                                       table = b43_nphy_get_ipa_gain_table(dev);
-                               } else {
-                                       if (band == IEEE80211_BAND_5GHZ) {
-                                               if (dev->phy.rev == 3)
-                                                       table = b43_ntab_tx_gain_rev3_5ghz;
-                                               else if (dev->phy.rev == 4)
-                                                       table = b43_ntab_tx_gain_rev4_5ghz;
-                                               else
-                                                       table = b43_ntab_tx_gain_rev5plus_5ghz;
-                                       } else {
-                                               table = b43_ntab_tx_gain_rev3plus_2ghz;
-                                       }
-                               }
-
                                target.ipa[i] = (table[index[i]] >> 16) & 0xF;
                                target.pad[i] = (table[index[i]] >> 20) & 0xF;
                                target.pga[i] = (table[index[i]] >> 24) & 0xF;
                                target.txgm[i] = (table[index[i]] >> 28) & 0xF;
                        } else {
-                               table = b43_ntab_tx_gain_rev0_1_2;
-
                                target.ipa[i] = (table[index[i]] >> 16) & 0x3;
                                target.pad[i] = (table[index[i]] >> 18) & 0x3;
                                target.pga[i] = (table[index[i]] >> 20) & 0x7;
@@ -3968,13 +4294,10 @@ static void b43_nphy_superswitch_init(struct b43_wldev *dev, bool init)
 #endif
                }
 
-               b43_write32(dev, B43_MMIO_MACCTL,
-                       b43_read32(dev, B43_MMIO_MACCTL) &
-                       ~B43_MACCTL_GPOUTSMSK);
-               b43_write16(dev, B43_MMIO_GPIO_MASK,
-                       b43_read16(dev, B43_MMIO_GPIO_MASK) | 0xFC00);
-               b43_write16(dev, B43_MMIO_GPIO_CONTROL,
-                       b43_read16(dev, B43_MMIO_GPIO_CONTROL) & ~0xFC00);
+               b43_maskset32(dev, B43_MMIO_MACCTL, ~B43_MACCTL_GPOUTSMSK, 0);
+               b43_maskset16(dev, B43_MMIO_GPIO_MASK, ~0, 0xFC00);
+               b43_maskset16(dev, B43_MMIO_GPIO_CONTROL, (~0xFC00 & 0xFFFF),
+                             0);
 
                if (init) {
                        b43_phy_write(dev, B43_NPHY_RFCTL_LUT_TRSW_LO1, 0x2D8);
@@ -4110,7 +4433,7 @@ int b43_phy_initn(struct b43_wldev *dev)
        b43_nphy_tx_power_ctrl(dev, false);
        b43_nphy_tx_power_fix(dev);
        b43_nphy_tx_power_ctl_idle_tssi(dev);
-       /* TODO N PHY TX Power Control Setup */
+       b43_nphy_tx_power_ctl_setup(dev);
        b43_nphy_tx_gain_table_upload(dev);
 
        if (nphy->phyrxchain != 3)
@@ -4530,8 +4853,7 @@ static void b43_nphy_op_maskset(struct b43_wldev *dev, u16 reg, u16 mask,
 {
        check_phyreg(dev, reg);
        b43_write16(dev, B43_MMIO_PHY_CONTROL, reg);
-       b43_write16(dev, B43_MMIO_PHY_DATA,
-                   (b43_read16(dev, B43_MMIO_PHY_DATA) & mask) | set);
+       b43_maskset16(dev, B43_MMIO_PHY_DATA, mask, set);
 }
 
 static u16 b43_nphy_op_radio_read(struct b43_wldev *dev, u16 reg)
index 5de8f74..fd12b38 100644 (file)
@@ -798,6 +798,7 @@ struct b43_phy_n {
        bool txpwrctrl;
        bool pwg_gain_5ghz;
        u8 tx_pwr_idx[2];
+       s8 tx_power_offset[101];
        u16 adj_pwr_tbl[84];
        u16 txcal_bbmult;
        u16 txiqlocal_bestc[11];
index f7def13..f0d8377 100644 (file)
@@ -2214,7 +2214,7 @@ static const u16 b43_ntab_antswctl2g_r3[4][32] = {
 };
 
 /* TX gain tables */
-const u32 b43_ntab_tx_gain_rev0_1_2[] = {
+static const u32 b43_ntab_tx_gain_rev0_1_2[] = {
        0x03cc2b44, 0x03cc2b42, 0x03cc2a44, 0x03cc2a42,
        0x03cc2944, 0x03c82b44, 0x03c82b42, 0x03c82a44,
        0x03c82a42, 0x03c82944, 0x03c82942, 0x03c82844,
@@ -2249,7 +2249,7 @@ const u32 b43_ntab_tx_gain_rev0_1_2[] = {
        0x03801442, 0x03801344, 0x03801342, 0x00002b00,
 };
 
-const u32 b43_ntab_tx_gain_rev3plus_2ghz[] = {
+static const u32 b43_ntab_tx_gain_rev3plus_2ghz[] = {
        0x1f410044, 0x1f410042, 0x1f410040, 0x1f41003e,
        0x1f41003c, 0x1f41003b, 0x1f410039, 0x1f410037,
        0x1e410044, 0x1e410042, 0x1e410040, 0x1e41003e,
@@ -2284,7 +2284,7 @@ const u32 b43_ntab_tx_gain_rev3plus_2ghz[] = {
        0x1041003c, 0x1041003b, 0x10410039, 0x10410037,
 };
 
-const u32 b43_ntab_tx_gain_rev3_5ghz[] = {
+static const u32 b43_ntab_tx_gain_rev3_5ghz[] = {
        0xcff70044, 0xcff70042, 0xcff70040, 0xcff7003e,
        0xcff7003c, 0xcff7003b, 0xcff70039, 0xcff70037,
        0xcef70044, 0xcef70042, 0xcef70040, 0xcef7003e,
@@ -2319,7 +2319,7 @@ const u32 b43_ntab_tx_gain_rev3_5ghz[] = {
        0xc0f7003c, 0xc0f7003b, 0xc0f70039, 0xc0f70037,
 };
 
-const u32 b43_ntab_tx_gain_rev4_5ghz[] = {
+static const u32 b43_ntab_tx_gain_rev4_5ghz[] = {
        0x2ff20044, 0x2ff20042, 0x2ff20040, 0x2ff2003e,
        0x2ff2003c, 0x2ff2003b, 0x2ff20039, 0x2ff20037,
        0x2ef20044, 0x2ef20042, 0x2ef20040, 0x2ef2003e,
@@ -2354,7 +2354,7 @@ const u32 b43_ntab_tx_gain_rev4_5ghz[] = {
        0x20d2003a, 0x20d20038, 0x20d20036, 0x20d20034,
 };
 
-const u32 b43_ntab_tx_gain_rev5plus_5ghz[] = {
+static const u32 b43_ntab_tx_gain_rev5plus_5ghz[] = {
        0x0f62004a, 0x0f620048, 0x0f620046, 0x0f620044,
        0x0f620042, 0x0f620040, 0x0f62003e, 0x0f62003c,
        0x0e620044, 0x0e620042, 0x0e620040, 0x0e62003e,
@@ -2389,7 +2389,7 @@ const u32 b43_ntab_tx_gain_rev5plus_5ghz[] = {
        0x0062003b, 0x00620039, 0x00620037, 0x00620035,
 };
 
-const u32 txpwrctrl_tx_gain_ipa[] = {
+static const u32 txpwrctrl_tx_gain_ipa[] = {
        0x5ff7002d, 0x5ff7002b, 0x5ff7002a, 0x5ff70029,
        0x5ff70028, 0x5ff70027, 0x5ff70026, 0x5ff70025,
        0x5ef7002d, 0x5ef7002b, 0x5ef7002a, 0x5ef70029,
@@ -2424,7 +2424,7 @@ const u32 txpwrctrl_tx_gain_ipa[] = {
        0x50f70028, 0x50f70027, 0x50f70026, 0x50f70025,
 };
 
-const u32 txpwrctrl_tx_gain_ipa_rev5[] = {
+static const u32 txpwrctrl_tx_gain_ipa_rev5[] = {
        0x1ff7002d, 0x1ff7002b, 0x1ff7002a, 0x1ff70029,
        0x1ff70028, 0x1ff70027, 0x1ff70026, 0x1ff70025,
        0x1ef7002d, 0x1ef7002b, 0x1ef7002a, 0x1ef70029,
@@ -2459,7 +2459,7 @@ const u32 txpwrctrl_tx_gain_ipa_rev5[] = {
        0x10f70028, 0x10f70027, 0x10f70026, 0x10f70025,
 };
 
-const u32 txpwrctrl_tx_gain_ipa_rev6[] = {
+static const u32 txpwrctrl_tx_gain_ipa_rev6[] = {
        0x0ff7002d, 0x0ff7002b, 0x0ff7002a, 0x0ff70029,
        0x0ff70028, 0x0ff70027, 0x0ff70026, 0x0ff70025,
        0x0ef7002d, 0x0ef7002b, 0x0ef7002a, 0x0ef70029,
@@ -2494,7 +2494,7 @@ const u32 txpwrctrl_tx_gain_ipa_rev6[] = {
        0x00f70028, 0x00f70027, 0x00f70026, 0x00f70025,
 };
 
-const u32 txpwrctrl_tx_gain_ipa_5g[] = {
+static const u32 txpwrctrl_tx_gain_ipa_5g[] = {
        0x7ff70035, 0x7ff70033, 0x7ff70032, 0x7ff70031,
        0x7ff7002f, 0x7ff7002e, 0x7ff7002d, 0x7ff7002b,
        0x7ff7002a, 0x7ff70029, 0x7ff70028, 0x7ff70027,
@@ -2529,6 +2529,11 @@ const u32 txpwrctrl_tx_gain_ipa_5g[] = {
        0x70f70021, 0x70f70020, 0x70f70020, 0x70f7001f,
 };
 
+const s8 b43_ntab_papd_pga_gain_delta_ipa_2g[] = {
+       -114, -108, -98, -91, -84, -78, -70, -62,
+       -54, -46, -39, -31, -23, -15, -8, 0
+};
+
 const u16 tbl_iqcal_gainparams[2][9][8] = {
        {
                { 0x000, 0, 0, 2, 0x69, 0x69, 0x69, 0x69 },
@@ -2739,11 +2744,11 @@ const struct nphy_rf_control_override_rev3 tbl_rf_control_override_rev3[] = {
        { 0x0001,  0, 0xE7, 0x7A, 0xEC, 0x7D }, /* field == 0x0002 (fls 2) */
        { 0x0002,  1, 0xE7, 0x7A, 0xEC, 0x7D }, /* field == 0x0004 (fls 3) */
        { 0x0004,  2, 0xE7, 0x7A, 0xEC, 0x7D }, /* field == 0x0008 (fls 4) */
-       { 0x0016,  4, 0xE7, 0x7A, 0xEC, 0x7D }, /* field == 0x0010 (fls 5) */
+       { 0x0010,  4, 0xE7, 0x7A, 0xEC, 0x7D }, /* field == 0x0010 (fls 5) */
        { 0x0020,  5, 0xE7, 0x7A, 0xEC, 0x7D }, /* field == 0x0020 (fls 6) */
        { 0x0040,  6, 0xE7, 0x7A, 0xEC, 0x7D }, /* field == 0x0040 (fls 7) */
-       { 0x0080,  6, 0xE7, 0x7A, 0xEC, 0x7D }, /* field == 0x0080 (fls 8) */
-       { 0x0100,  7, 0xE7, 0x7A, 0xEC, 0x7D }, /* field == 0x0100 (fls 9) */
+       { 0x0080,  7, 0xE7, 0x7A, 0xEC, 0x7D }, /* field == 0x0080 (fls 8) */
+       { 0x0100,  8, 0xE7, 0x7A, 0xEC, 0x7D }, /* field == 0x0100 (fls 9) */
        { 0x0007,  0, 0xE7, 0xF8, 0xEC, 0xFA }, /* field == 0x0200 (fls 10) */
        { 0x0070,  4, 0xE7, 0xF8, 0xEC, 0xFA }, /* field == 0x0400 (fls 11) */
        { 0xE000, 13, 0xE7, 0x7A, 0xEC, 0x7D }, /* field == 0x0800 (fls 12) */
@@ -3126,6 +3131,53 @@ void b43_nphy_rev3plus_tables_init(struct b43_wldev *dev)
                B43_WARN_ON(1);
 }
 
+/* http://bcm-v4.sipsolutions.net/802.11/PHY/N/GetIpaGainTbl */
+static const u32 *b43_nphy_get_ipa_gain_table(struct b43_wldev *dev)
+{
+       if (b43_current_band(dev->wl) == IEEE80211_BAND_2GHZ) {
+               if (dev->phy.rev >= 6) {
+                       if (dev->dev->chip_id == 47162)
+                               return txpwrctrl_tx_gain_ipa_rev5;
+                       return txpwrctrl_tx_gain_ipa_rev6;
+               } else if (dev->phy.rev >= 5) {
+                       return txpwrctrl_tx_gain_ipa_rev5;
+               } else {
+                       return txpwrctrl_tx_gain_ipa;
+               }
+       } else {
+               return txpwrctrl_tx_gain_ipa_5g;
+       }
+}
+
+const u32 *b43_nphy_get_tx_gain_table(struct b43_wldev *dev)
+{
+       enum ieee80211_band band = b43_current_band(dev->wl);
+       struct ssb_sprom *sprom = dev->dev->bus_sprom;
+
+       if (dev->phy.rev < 3)
+               return b43_ntab_tx_gain_rev0_1_2;
+
+       /* rev 3+ */
+       if ((dev->phy.n->ipa2g_on && band == IEEE80211_BAND_2GHZ) ||
+           (dev->phy.n->ipa5g_on && band == IEEE80211_BAND_5GHZ)) {
+               return b43_nphy_get_ipa_gain_table(dev);
+       } else if (b43_current_band(dev->wl) == IEEE80211_BAND_5GHZ) {
+               if (dev->phy.rev == 3)
+                       return b43_ntab_tx_gain_rev3_5ghz;
+               if (dev->phy.rev == 4)
+                       return sprom->fem.ghz5.extpa_gain == 3 ?
+                               b43_ntab_tx_gain_rev4_5ghz :
+                               b43_ntab_tx_gain_rev4_5ghz; /* FIXME */
+               else
+                       return b43_ntab_tx_gain_rev5plus_5ghz;
+       } else {
+               if (dev->phy.rev >= 5 && sprom->fem.ghz5.extpa_gain == 3)
+                       return b43_ntab_tx_gain_rev3plus_2ghz; /* FIXME */
+               else
+                       return b43_ntab_tx_gain_rev3plus_2ghz;
+       }
+}
+
 struct nphy_gain_ctl_workaround_entry *b43_nphy_get_gain_ctl_workaround_ent(
        struct b43_wldev *dev, bool ghz5, bool ext_lna)
 {
index 97038c4..f348953 100644 (file)
@@ -177,16 +177,10 @@ void b43_ntab_write_bulk(struct b43_wldev *dev, u32 offset,
 void b43_nphy_rev0_1_2_tables_init(struct b43_wldev *dev);
 void b43_nphy_rev3plus_tables_init(struct b43_wldev *dev);
 
-extern const u32 b43_ntab_tx_gain_rev0_1_2[];
-extern const u32 b43_ntab_tx_gain_rev3plus_2ghz[];
-extern const u32 b43_ntab_tx_gain_rev3_5ghz[];
-extern const u32 b43_ntab_tx_gain_rev4_5ghz[];
-extern const u32 b43_ntab_tx_gain_rev5plus_5ghz[];
-
-extern const u32 txpwrctrl_tx_gain_ipa[];
-extern const u32 txpwrctrl_tx_gain_ipa_rev5[];
-extern const u32 txpwrctrl_tx_gain_ipa_rev6[];
-extern const u32 txpwrctrl_tx_gain_ipa_5g[];
+const u32 *b43_nphy_get_tx_gain_table(struct b43_wldev *dev);
+
+extern const s8 b43_ntab_papd_pga_gain_delta_ipa_2g[];
+
 extern const u16 tbl_iqcal_gainparams[2][9][8];
 extern const struct nphy_txiqcal_ladder ladder_lo[];
 extern const struct nphy_txiqcal_ladder ladder_iq[];
index cd6375d..c510453 100644 (file)
@@ -26,16 +26,25 @@ config BRCMFMAC
          it'll be called brcmfmac.ko.
 
 config BRCMFMAC_SDIO
-       bool "SDIO bus interface support for FullMAC"
+       bool "SDIO bus interface support for FullMAC driver"
        depends on MMC
        depends on BRCMFMAC
        select FW_LOADER
        default y
        ---help---
          This option enables the SDIO bus interface support for Broadcom
-         FullMAC WLAN driver.
-         Say Y if you want to use brcmfmac for a compatible SDIO interface
-         wireless card.
+         IEEE802.11n embedded FullMAC WLAN driver. Say Y if you want to
+         use the driver for a SDIO wireless card.
+
+config BRCMFMAC_USB
+       bool "USB bus interface support for FullMAC driver"
+       depends on USB
+       depends on BRCMFMAC
+       select FW_LOADER
+       ---help---
+         This option enables the USB bus interface support for Broadcom
+         IEEE802.11n embedded FullMAC WLAN driver. Say Y if you want to
+         use the driver for an USB wireless card.
 
 config BRCMDBG
        bool "Broadcom driver debug functions"
index f41c047..b987920 100644 (file)
@@ -16,7 +16,7 @@
 # CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 
 # common flags
-subdir-ccflags-$(CONFIG_BRCMDBG)       += -DBCMDBG
+subdir-ccflags-$(CONFIG_BRCMDBG)       += -DDEBUG
 
 obj-$(CONFIG_BRCMUTIL) += brcmutil/
 obj-$(CONFIG_BRCMFMAC) += brcmfmac/
index 9ca9ea1..abb4803 100644 (file)
@@ -19,6 +19,8 @@ ccflags-y += \
        -Idrivers/net/wireless/brcm80211/brcmfmac       \
        -Idrivers/net/wireless/brcm80211/include
 
+ccflags-y += -D__CHECK_ENDIAN__
+
 obj-$(CONFIG_BRCMFMAC) += brcmfmac.o
 brcmfmac-objs += \
                wl_cfg80211.o \
@@ -30,5 +32,5 @@ brcmfmac-$(CONFIG_BRCMFMAC_SDIO) += \
                bcmsdh.o \
                bcmsdh_sdmmc.o \
                sdio_chip.o
-
-ccflags-y += -D__CHECK_ENDIAN__
+brcmfmac-$(CONFIG_BRCMFMAC_USB) += \
+               usb.o
index 4bc8d25..e925290 100644 (file)
@@ -15,6 +15,8 @@
  */
 /* ****************** SDIO CARD Interface Functions **************************/
 
+#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
+
 #include <linux/types.h>
 #include <linux/netdevice.h>
 #include <linux/export.h>
index 9b8c0ed..83ca3cc 100644 (file)
@@ -13,6 +13,9 @@
  * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
  * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  */
+
+#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
+
 #include <linux/types.h>
 #include <linux/netdevice.h>
 #include <linux/mmc/sdio.h>
@@ -291,13 +294,14 @@ int brcmf_sdioh_request_buffer(struct brcmf_sdio_dev *sdiodev,
                               struct sk_buff *pkt)
 {
        int status;
-       uint pkt_len = pkt->len;
+       uint pkt_len;
        bool fifo = (fix_inc == SDIOH_DATA_FIX);
 
        brcmf_dbg(TRACE, "Enter\n");
 
        if (pkt == NULL)
                return -EINVAL;
+       pkt_len = pkt->len;
 
        brcmf_pm_resume_wait(sdiodev, &sdiodev->request_buffer_wait);
        if (brcmf_pm_resume_error(sdiodev))
@@ -485,7 +489,7 @@ static int brcmf_ops_sdio_probe(struct sdio_func *func,
                sdiodev->func[0] = func->card->sdio_func[0];
                sdiodev->func[1] = func;
                sdiodev->bus_if = bus_if;
-               bus_if->bus_priv = sdiodev;
+               bus_if->bus_priv.sdio = sdiodev;
                bus_if->type = SDIO_BUS;
                bus_if->align = BRCMF_SDALIGN;
                dev_set_drvdata(&func->card->dev, sdiodev);
@@ -526,7 +530,7 @@ static void brcmf_ops_sdio_remove(struct sdio_func *func)
 
        if (func->num == 2) {
                bus_if = dev_get_drvdata(&func->dev);
-               sdiodev = bus_if->bus_priv;
+               sdiodev = bus_if->bus_priv.sdio;
                brcmf_dbg(TRACE, "F2 found, calling brcmf_sdio_remove...\n");
                brcmf_sdio_remove(sdiodev);
                dev_set_drvdata(&func->card->dev, NULL);
@@ -593,14 +597,14 @@ static struct sdio_driver brcmf_sdmmc_driver = {
 #endif /* CONFIG_PM_SLEEP */
 };
 
-static void __exit brcmf_sdio_exit(void)
+void brcmf_sdio_exit(void)
 {
        brcmf_dbg(TRACE, "Enter\n");
 
        sdio_unregister_driver(&brcmf_sdmmc_driver);
 }
 
-static int __init brcmf_sdio_init(void)
+int brcmf_sdio_init(void)
 {
        int ret;
 
@@ -613,6 +617,3 @@ static int __init brcmf_sdio_init(void)
 
        return ret;
 }
-
-module_init(brcmf_sdio_init);
-module_exit(brcmf_sdio_exit);
index e58ea40..07686a7 100644 (file)
@@ -644,9 +644,9 @@ extern char *brcmf_ifname(struct brcmf_pub *drvr, int idx);
 extern int brcmf_proto_cdc_query_dcmd(struct brcmf_pub *drvr, int ifidx,
                                       uint cmd, void *buf, uint len);
 
-#ifdef BCMDBG
+#ifdef DEBUG
 extern int brcmf_write_to_file(struct brcmf_pub *drvr, const u8 *buf, int size);
-#endif                         /* BCMDBG */
+#endif                         /* DEBUG */
 
 extern int brcmf_ifname2idx(struct brcmf_pub *drvr, char *name);
 extern int brcmf_c_host_event(struct brcmf_pub *drvr, int *idx,
index ad9be24..b7671b3 100644 (file)
@@ -39,8 +39,11 @@ struct dngl_stats {
 /* interface structure between common and bus layer */
 struct brcmf_bus {
        u8 type;                /* bus type */
-       void *bus_priv;         /* pointer to bus private structure */
-       void *drvr;             /* pointer to driver pub structure brcmf_pub */
+       union {
+               struct brcmf_sdio_dev *sdio;
+               struct brcmf_usbdev *usb;
+       } bus_priv;
+       struct brcmf_pub *drvr; /* pointer to driver pub structure brcmf_pub */
        enum brcmf_bus_state state;
        uint maxctl;            /* Max size rxctl request from proto to bus */
        bool drvr_up;           /* Status flag of driver up/down */
@@ -102,4 +105,14 @@ extern int brcmf_bus_start(struct device *dev);
 
 extern int brcmf_add_if(struct device *dev, int ifidx,
                        char *name, u8 *mac_addr);
+
+#ifdef CONFIG_BRCMFMAC_SDIO
+extern void brcmf_sdio_exit(void);
+extern int brcmf_sdio_init(void);
+#endif
+#ifdef CONFIG_BRCMFMAC_USB
+extern void brcmf_usb_exit(void);
+extern int brcmf_usb_init(void);
+#endif
+
 #endif                         /* _BRCMF_BUS_H_ */
index ac8d1f4..b3e3b7f 100644 (file)
@@ -19,6 +19,8 @@
  * For certain dcmd codes, the dongle interprets string data from the host.
  ******************************************************************************/
 
+#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
+
 #include <linux/types.h>
 #include <linux/netdevice.h>
 #include <linux/sched.h>
index a51d8f5..4187435 100644 (file)
@@ -13,6 +13,9 @@
  * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
  * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  */
+
+#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
+
 #include <linux/kernel.h>
 #include <linux/string.h>
 #include <linux/sched.h>
@@ -38,7 +41,7 @@
 #define BRCMF_PKT_FILTER_PATTERN_FIXED_LEN     \
        offsetof(struct brcmf_pkt_filter_pattern_le, mask_and_pattern)
 
-#ifdef BCMDBG
+#ifdef DEBUG
 static const char brcmf_version[] =
        "Dongle Host Driver, version " BRCMF_VERSION_STR "\nCompiled on "
        __DATE__ " at " __TIME__;
@@ -133,7 +136,7 @@ bool brcmf_c_prec_enq(struct device *dev, struct pktq *q,
        return p != NULL;
 }
 
-#ifdef BCMDBG
+#ifdef DEBUG
 static void
 brcmf_c_show_host_event(struct brcmf_event_msg *event, void *event_data)
 {
@@ -399,10 +402,10 @@ brcmf_c_show_host_event(struct brcmf_event_msg *event, void *event_data)
                p = (char *)&buf[sizeof(struct msgtrace_hdr)];
                while ((s = strstr(p, "\n")) != NULL) {
                        *s = '\0';
-                       printk(KERN_DEBUG"%s\n", p);
+                       pr_debug("%s\n", p);
                        p = s + 1;
                }
-               printk(KERN_DEBUG "%s\n", p);
+               pr_debug("%s\n", p);
 
                /* Reset datalen to avoid display below */
                datalen = 0;
@@ -430,7 +433,7 @@ brcmf_c_show_host_event(struct brcmf_event_msg *event, void *event_data)
                brcmf_dbg(EVENT, "\n");
        }
 }
-#endif                         /* BCMDBG */
+#endif                         /* DEBUG */
 
 int
 brcmf_c_host_event(struct brcmf_pub *drvr, int *ifidx, void *pktdata,
@@ -518,9 +521,9 @@ brcmf_c_host_event(struct brcmf_pub *drvr, int *ifidx, void *pktdata,
                break;
        }
 
-#ifdef BCMDBG
+#ifdef DEBUG
        brcmf_c_show_host_event(event, event_data);
-#endif                         /* BCMDBG */
+#endif                         /* DEBUG */
 
        return 0;
 }
index bb26ee3..a2c4576 100644 (file)
 #define BRCMF_BTA_VAL  0x1000
 #define BRCMF_ISCAN_VAL 0x2000
 
-#if defined(BCMDBG)
+#if defined(DEBUG)
 
 #define brcmf_dbg(level, fmt, ...)                                     \
 do {                                                                   \
        if (BRCMF_ERROR_VAL == BRCMF_##level##_VAL) {                   \
                if (brcmf_msg_level & BRCMF_##level##_VAL) {            \
                        if (net_ratelimit())                            \
-                               printk(KERN_DEBUG "%s: " fmt,           \
-                                      __func__, ##__VA_ARGS__);        \
+                               pr_debug("%s: " fmt,                    \
+                                        __func__, ##__VA_ARGS__);      \
                }                                                       \
        } else {                                                        \
                if (brcmf_msg_level & BRCMF_##level##_VAL) {            \
-                       printk(KERN_DEBUG "%s: " fmt,                   \
-                              __func__, ##__VA_ARGS__);                \
+                       pr_debug("%s: " fmt,                            \
+                                __func__, ##__VA_ARGS__);              \
                }                                                       \
        }                                                               \
 } while (0)
@@ -56,7 +56,7 @@ do {                                                                  \
 #define BRCMF_BYTES_ON()       (brcmf_msg_level & BRCMF_BYTES_VAL)
 #define BRCMF_GLOM_ON()                (brcmf_msg_level & BRCMF_GLOM_VAL)
 
-#else  /* (defined BCMDBG) || (defined BCMDBG) */
+#else  /* (defined DEBUG) || (defined DEBUG) */
 
 #define brcmf_dbg(level, fmt, ...) no_printk(fmt, ##__VA_ARGS__)
 
@@ -66,7 +66,13 @@ do {                                                                 \
 #define BRCMF_BYTES_ON()       0
 #define BRCMF_GLOM_ON()                0
 
-#endif                         /* defined(BCMDBG) */
+#endif                         /* defined(DEBUG) */
+
+#define brcmf_dbg_hex_dump(test, data, len, fmt, ...)                  \
+do {                                                                   \
+       if (test)                                                       \
+               brcmu_dbg_hex_dump(data, len, fmt, ##__VA_ARGS__);      \
+} while (0)
 
 extern int brcmf_msg_level;
 
index eb9eb76..c4da058 100644 (file)
@@ -14,6 +14,8 @@
  * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  */
 
+#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
+
 #include <linux/init.h>
 #include <linux/kernel.h>
 #include <linux/kthread.h>
@@ -590,8 +592,8 @@ static void brcmf_ethtool_get_drvinfo(struct net_device *ndev,
        sprintf(info->bus_info, "%s", dev_name(drvr->dev));
 }
 
-static struct ethtool_ops brcmf_ethtool_ops = {
-       .get_drvinfo = brcmf_ethtool_get_drvinfo
+static const struct ethtool_ops brcmf_ethtool_ops = {
+       .get_drvinfo = brcmf_ethtool_get_drvinfo,
 };
 
 static int brcmf_ethtool(struct brcmf_pub *drvr, void __user *uaddr)
@@ -794,18 +796,19 @@ static int brcmf_netdev_open(struct net_device *ndev)
 {
        struct brcmf_if *ifp = netdev_priv(ndev);
        struct brcmf_pub *drvr = ifp->drvr;
+       struct brcmf_bus *bus_if = drvr->bus_if;
        u32 toe_ol;
        s32 ret = 0;
 
        brcmf_dbg(TRACE, "ifidx %d\n", ifp->idx);
 
        if (ifp->idx == 0) {    /* do it only for primary eth0 */
-               /* try to bring up bus */
-               ret = brcmf_bus_start(drvr->dev);
-               if (ret != 0) {
-                       brcmf_dbg(ERROR, "failed with code %d\n", ret);
-                       return -1;
+               /* If bus is not ready, can't continue */
+               if (bus_if->state != BRCMF_BUS_DATA) {
+                       brcmf_dbg(ERROR, "failed bus is not ready\n");
+                       return -EAGAIN;
                }
+
                atomic_set(&drvr->pend_8021x_cnt, 0);
 
                memcpy(ndev->dev_addr, drvr->mac, ETH_ALEN);
@@ -977,12 +980,6 @@ int brcmf_bus_start(struct device *dev)
                return ret;
        }
 
-       /* If bus is not ready, can't come up */
-       if (bus_if->state != BRCMF_BUS_DATA) {
-               brcmf_dbg(ERROR, "failed bus is not ready\n");
-               return -ENODEV;
-       }
-
        brcmf_c_mkiovar("event_msgs", drvr->eventmask, BRCMF_EVENTING_MASK_LEN,
                      iovbuf, sizeof(iovbuf));
        brcmf_proto_cdc_query_dcmd(drvr, 0, BRCMF_C_GET_VAR, iovbuf,
@@ -1019,6 +1016,8 @@ int brcmf_bus_start(struct device *dev)
        if (ret < 0)
                return ret;
 
+       /* signal bus ready */
+       bus_if->state = BRCMF_BUS_DATA;
        return 0;
 }
 
@@ -1107,13 +1106,13 @@ void brcmf_detach(struct device *dev)
                if (drvr->iflist[i])
                        brcmf_del_if(drvr, i);
 
-       cancel_work_sync(&drvr->setmacaddr_work);
-       cancel_work_sync(&drvr->multicast_work);
-
        brcmf_bus_detach(drvr);
 
-       if (drvr->prot)
+       if (drvr->prot) {
+               cancel_work_sync(&drvr->setmacaddr_work);
+               cancel_work_sync(&drvr->multicast_work);
                brcmf_proto_detach(drvr);
+       }
 
        bus_if->drvr = NULL;
        kfree(drvr);
@@ -1146,7 +1145,7 @@ int brcmf_netdev_wait_pend8021x(struct net_device *ndev)
        return pend;
 }
 
-#ifdef BCMDBG
+#ifdef DEBUG
 int brcmf_write_to_file(struct brcmf_pub *drvr, const u8 *buf, int size)
 {
        int ret = 0;
@@ -1180,4 +1179,36 @@ exit:
 
        return ret;
 }
-#endif                         /* BCMDBG */
+#endif                         /* DEBUG */
+
+static int __init brcmfmac_init(void)
+{
+       int ret = 0;
+
+#ifdef CONFIG_BRCMFMAC_SDIO
+       ret = brcmf_sdio_init();
+       if (ret)
+               goto fail;
+#endif
+#ifdef CONFIG_BRCMFMAC_USB
+       ret = brcmf_usb_init();
+       if (ret)
+               goto fail;
+#endif
+
+fail:
+       return ret;
+}
+
+static void __exit brcmfmac_exit(void)
+{
+#ifdef CONFIG_BRCMFMAC_SDIO
+       brcmf_sdio_exit();
+#endif
+#ifdef CONFIG_BRCMFMAC_USB
+       brcmf_usb_exit();
+#endif
+}
+
+module_init(brcmfmac_init);
+module_exit(brcmfmac_exit);
index f7eeee1..2bf5dda 100644 (file)
@@ -14,6 +14,8 @@
  * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  */
 
+#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
+
 #include <linux/types.h>
 #include <linux/kernel.h>
 #include <linux/kthread.h>
@@ -40,7 +42,7 @@
 
 #define DCMD_RESP_TIMEOUT  2000        /* In milli second */
 
-#ifdef BCMDBG
+#ifdef DEBUG
 
 #define BRCMF_TRAP_INFO_SIZE   80
 
@@ -84,7 +86,7 @@ struct rte_console {
        char cbuf[CBUF_LEN];
 };
 
-#endif                         /* BCMDBG */
+#endif                         /* DEBUG */
 #include <chipcommon.h>
 
 #include "dhd_bus.h"
@@ -307,10 +309,10 @@ struct rte_console {
 /* Flags for SDH calls */
 #define F2SYNC (SDIO_REQ_4BYTE | SDIO_REQ_FIXED)
 
-#define BRCMFMAC_FW_NAME       "brcm/brcmfmac.bin"
-#define BRCMFMAC_NV_NAME       "brcm/brcmfmac.txt"
-MODULE_FIRMWARE(BRCMFMAC_FW_NAME);
-MODULE_FIRMWARE(BRCMFMAC_NV_NAME);
+#define BRCMF_SDIO_FW_NAME     "brcm/brcmfmac-sdio.bin"
+#define BRCMF_SDIO_NV_NAME     "brcm/brcmfmac-sdio.txt"
+MODULE_FIRMWARE(BRCMF_SDIO_FW_NAME);
+MODULE_FIRMWARE(BRCMF_SDIO_NV_NAME);
 
 #define BRCMF_IDLE_IMMEDIATE   (-1)    /* Enter idle immediately */
 #define BRCMF_IDLE_ACTIVE      0       /* Do not request any SD clock change
@@ -416,7 +418,7 @@ struct sdpcmd_regs {
        u16 PAD[0x80];
 };
 
-#ifdef BCMDBG
+#ifdef DEBUG
 /* Device console log buffer state */
 struct brcmf_console {
        uint count;             /* Poll interval msec counter */
@@ -426,7 +428,7 @@ struct brcmf_console {
        u8 *buf;                /* Log buffer (host copy) */
        uint last;              /* Last buffer read index */
 };
-#endif                         /* BCMDBG */
+#endif                         /* DEBUG */
 
 struct sdpcm_shared {
        u32 flags;
@@ -507,11 +509,11 @@ struct brcmf_sdio {
        uint polltick;          /* Tick counter */
        uint pollcnt;           /* Count of active polls */
 
-#ifdef BCMDBG
+#ifdef DEBUG
        uint console_interval;
        struct brcmf_console console;   /* Console output polling support */
        uint console_addr;      /* Console address from shared struct */
-#endif                         /* BCMDBG */
+#endif                         /* DEBUG */
 
        uint regfails;          /* Count of R_REG failures */
 
@@ -587,10 +589,10 @@ struct brcmf_sdio {
 #define CLK_PENDING    2       /* Not used yet */
 #define CLK_AVAIL      3
 
-#ifdef BCMDBG
+#ifdef DEBUG
 static int qcount[NUMPRIO];
 static int tx_packets[NUMPRIO];
-#endif                         /* BCMDBG */
+#endif                         /* DEBUG */
 
 #define SDIO_DRIVE_STRENGTH    6       /* in milliamps */
 
@@ -764,12 +766,12 @@ static int brcmf_sdbrcm_htclk(struct brcmf_sdio *bus, bool on, bool pendok)
                bus->clkstate = CLK_AVAIL;
                brcmf_dbg(INFO, "CLKCTL: turned ON\n");
 
-#if defined(BCMDBG)
-               if (bus->alp_only != true) {
+#if defined(DEBUG)
+               if (!bus->alp_only) {
                        if (SBSDIO_ALPONLY(clkctl))
                                brcmf_dbg(ERROR, "HT Clock should be on\n");
                }
-#endif                         /* defined (BCMDBG) */
+#endif                         /* defined (DEBUG) */
 
                bus->activity = true;
        } else {
@@ -814,9 +816,9 @@ static int brcmf_sdbrcm_sdclk(struct brcmf_sdio *bus, bool on)
 /* Transition SD and backplane clock readiness */
 static int brcmf_sdbrcm_clkctl(struct brcmf_sdio *bus, uint target, bool pendok)
 {
-#ifdef BCMDBG
+#ifdef DEBUG
        uint oldstate = bus->clkstate;
-#endif                         /* BCMDBG */
+#endif                         /* DEBUG */
 
        brcmf_dbg(TRACE, "Enter\n");
 
@@ -861,9 +863,9 @@ static int brcmf_sdbrcm_clkctl(struct brcmf_sdio *bus, uint target, bool pendok)
                brcmf_sdbrcm_wd_timer(bus, 0);
                break;
        }
-#ifdef BCMDBG
+#ifdef DEBUG
        brcmf_dbg(INFO, "%d -> %d\n", oldstate, bus->clkstate);
-#endif                         /* BCMDBG */
+#endif                         /* DEBUG */
 
        return 0;
 }
@@ -1279,13 +1281,10 @@ static u8 brcmf_sdbrcm_rxglom(struct brcmf_sdio *bus, u8 rxseq)
                        }
                        return 0;
                }
-#ifdef BCMDBG
-               if (BRCMF_GLOM_ON()) {
-                       printk(KERN_DEBUG "SUPERFRAME:\n");
-                       print_hex_dump_bytes("", DUMP_PREFIX_OFFSET,
-                               pfirst->data, min_t(int, pfirst->len, 48));
-               }
-#endif
+
+               brcmf_dbg_hex_dump(BRCMF_GLOM_ON(),
+                                  pfirst->data, min_t(int, pfirst->len, 48),
+                                  "SUPERFRAME:\n");
 
                /* Validate the superframe header */
                dptr = (u8 *) (pfirst->data);
@@ -1362,13 +1361,8 @@ static u8 brcmf_sdbrcm_rxglom(struct brcmf_sdio *bus, u8 rxseq)
                        check = get_unaligned_le16(dptr + sizeof(u16));
                        chan = SDPCM_PACKET_CHANNEL(&dptr[SDPCM_FRAMETAG_LEN]);
                        doff = SDPCM_DOFFSET_VALUE(&dptr[SDPCM_FRAMETAG_LEN]);
-#ifdef BCMDBG
-                       if (BRCMF_GLOM_ON()) {
-                               printk(KERN_DEBUG "subframe:\n");
-                               print_hex_dump_bytes("", DUMP_PREFIX_OFFSET,
-                                                    dptr, 32);
-                       }
-#endif
+                       brcmf_dbg_hex_dump(BRCMF_GLOM_ON(),
+                                          dptr, 32, "subframe:\n");
 
                        if ((u16)~(sublen ^ check)) {
                                brcmf_dbg(ERROR, "(subframe %d): HW hdr error: len/check 0x%04x/0x%04x\n",
@@ -1433,13 +1427,8 @@ static u8 brcmf_sdbrcm_rxglom(struct brcmf_sdio *bus, u8 rxseq)
                        }
                        rxseq++;
 
-#ifdef BCMDBG
-                       if (BRCMF_BYTES_ON() && BRCMF_DATA_ON()) {
-                               printk(KERN_DEBUG "Rx Subframe Data:\n");
-                               print_hex_dump_bytes("", DUMP_PREFIX_OFFSET,
-                                                    dptr, dlen);
-                       }
-#endif
+                       brcmf_dbg_hex_dump(BRCMF_BYTES_ON() && BRCMF_DATA_ON(),
+                                          dptr, dlen, "Rx Subframe Data:\n");
 
                        __skb_trim(pfirst, sublen);
                        skb_pull(pfirst, doff);
@@ -1457,17 +1446,13 @@ static u8 brcmf_sdbrcm_rxglom(struct brcmf_sdio *bus, u8 rxseq)
                                continue;
                        }
 
-#ifdef BCMDBG
-                       if (BRCMF_GLOM_ON()) {
-                               brcmf_dbg(GLOM, "subframe %d to stack, %p (%p/%d) nxt/lnk %p/%p\n",
-                                         bus->glom.qlen, pfirst, pfirst->data,
-                                         pfirst->len, pfirst->next,
-                                         pfirst->prev);
-                               print_hex_dump_bytes("", DUMP_PREFIX_OFFSET,
-                                               pfirst->data,
-                                               min_t(int, pfirst->len, 32));
-                       }
-#endif                         /* BCMDBG */
+                       brcmf_dbg_hex_dump(BRCMF_GLOM_ON(),
+                                          pfirst->data,
+                                          min_t(int, pfirst->len, 32),
+                                          "subframe %d to stack, %p (%p/%d) nxt/lnk %p/%p\n",
+                                          bus->glom.qlen, pfirst, pfirst->data,
+                                          pfirst->len, pfirst->next,
+                                          pfirst->prev);
                }
                /* sent any remaining packets up */
                if (bus->glom.qlen) {
@@ -1584,12 +1569,8 @@ brcmf_sdbrcm_read_control(struct brcmf_sdio *bus, u8 *hdr, uint len, uint doff)
 
 gotpkt:
 
-#ifdef BCMDBG
-       if (BRCMF_BYTES_ON() && BRCMF_CTL_ON()) {
-               printk(KERN_DEBUG "RxCtrl:\n");
-               print_hex_dump_bytes("", DUMP_PREFIX_OFFSET, bus->rxctl, len);
-       }
-#endif
+       brcmf_dbg_hex_dump(BRCMF_BYTES_ON() && BRCMF_CTL_ON(),
+                          bus->rxctl, len, "RxCtrl:\n");
 
        /* Point to valid data and indicate its length */
        bus->rxctl += doff;
@@ -1818,17 +1799,13 @@ brcmf_sdbrcm_readframes(struct brcmf_sdio *bus, uint maxframes, bool *finished)
                        }
                        bus->tx_max = txmax;
 
-#ifdef BCMDBG
-                       if (BRCMF_BYTES_ON() && BRCMF_DATA_ON()) {
-                               printk(KERN_DEBUG "Rx Data:\n");
-                               print_hex_dump_bytes("", DUMP_PREFIX_OFFSET,
-                                                    rxbuf, len);
-                       } else if (BRCMF_HDRS_ON()) {
-                               printk(KERN_DEBUG "RxHdr:\n");
-                               print_hex_dump_bytes("", DUMP_PREFIX_OFFSET,
-                                                    bus->rxhdr, SDPCM_HDRLEN);
-                       }
-#endif
+                       brcmf_dbg_hex_dump(BRCMF_BYTES_ON() && BRCMF_DATA_ON(),
+                                          rxbuf, len, "Rx Data:\n");
+                       brcmf_dbg_hex_dump(!(BRCMF_BYTES_ON() &&
+                                            BRCMF_DATA_ON()) &&
+                                          BRCMF_HDRS_ON(),
+                                          bus->rxhdr, SDPCM_HDRLEN,
+                                          "RxHdr:\n");
 
                        if (chan == SDPCM_CONTROL_CHANNEL) {
                                brcmf_dbg(ERROR, "(nextlen): readahead on control packet %d?\n",
@@ -1865,13 +1842,9 @@ brcmf_sdbrcm_readframes(struct brcmf_sdio *bus, uint maxframes, bool *finished)
                        brcmf_sdbrcm_rxfail(bus, true, true);
                        continue;
                }
-#ifdef BCMDBG
-               if (BRCMF_BYTES_ON() || BRCMF_HDRS_ON()) {
-                       printk(KERN_DEBUG "RxHdr:\n");
-                       print_hex_dump_bytes("", DUMP_PREFIX_OFFSET,
-                                            bus->rxhdr, SDPCM_HDRLEN);
-               }
-#endif
+               brcmf_dbg_hex_dump(BRCMF_BYTES_ON() || BRCMF_HDRS_ON(),
+                                  bus->rxhdr, SDPCM_HDRLEN, "RxHdr:\n");
+
 
                /* Extract hardware header fields */
                len = get_unaligned_le16(bus->rxhdr);
@@ -2024,13 +1997,8 @@ brcmf_sdbrcm_readframes(struct brcmf_sdio *bus, uint maxframes, bool *finished)
                skb_push(pkt, BRCMF_FIRSTREAD);
                memcpy(pkt->data, bus->rxhdr, BRCMF_FIRSTREAD);
 
-#ifdef BCMDBG
-               if (BRCMF_BYTES_ON() && BRCMF_DATA_ON()) {
-                       printk(KERN_DEBUG "Rx Data:\n");
-                       print_hex_dump_bytes("", DUMP_PREFIX_OFFSET,
-                                            pkt->data, len);
-               }
-#endif
+               brcmf_dbg_hex_dump(BRCMF_BYTES_ON() && BRCMF_DATA_ON(),
+                                  pkt->data, len, "Rx Data:\n");
 
 deliver:
                /* Save superframe descriptor and allocate packet frame */
@@ -2038,14 +2006,9 @@ deliver:
                        if (SDPCM_GLOMDESC(&bus->rxhdr[SDPCM_FRAMETAG_LEN])) {
                                brcmf_dbg(GLOM, "glom descriptor, %d bytes:\n",
                                          len);
-#ifdef BCMDBG
-                               if (BRCMF_GLOM_ON()) {
-                                       printk(KERN_DEBUG "Glom Data:\n");
-                                       print_hex_dump_bytes("",
-                                                            DUMP_PREFIX_OFFSET,
-                                                            pkt->data, len);
-                               }
-#endif
+                               brcmf_dbg_hex_dump(BRCMF_GLOM_ON(),
+                                                  pkt->data, len,
+                                                  "Glom Data:\n");
                                __skb_trim(pkt, len);
                                skb_pull(pkt, SDPCM_HDRLEN);
                                bus->glomd = pkt;
@@ -2078,13 +2041,11 @@ deliver:
                down(&bus->sdsem);
        }
        rxcount = maxframes - rxleft;
-#ifdef BCMDBG
        /* Message if we hit the limit */
        if (!rxleft)
                brcmf_dbg(DATA, "hit rx limit of %d frames\n",
                          maxframes);
        else
-#endif                         /* BCMDBG */
                brcmf_dbg(DATA, "processed %d frames\n", rxcount);
        /* Back off rxseq if awaiting rtx, update rx_seq */
        if (bus->rxskip)
@@ -2098,8 +2059,7 @@ static void
 brcmf_sdbrcm_wait_for_event(struct brcmf_sdio *bus, bool *lockvar)
 {
        up(&bus->sdsem);
-       wait_event_interruptible_timeout(bus->ctrl_wait,
-                                        (*lockvar == false), HZ * 2);
+       wait_event_interruptible_timeout(bus->ctrl_wait, !*lockvar, HZ * 2);
        down(&bus->sdsem);
        return;
 }
@@ -2176,20 +2136,22 @@ static int brcmf_sdbrcm_txpkt(struct brcmf_sdio *bus, struct sk_buff *pkt,
        put_unaligned_le32(swheader, frame + SDPCM_FRAMETAG_LEN);
        put_unaligned_le32(0, frame + SDPCM_FRAMETAG_LEN + sizeof(swheader));
 
-#ifdef BCMDBG
+#ifdef DEBUG
        tx_packets[pkt->priority]++;
-       if (BRCMF_BYTES_ON() &&
-           (((BRCMF_CTL_ON() && (chan == SDPCM_CONTROL_CHANNEL)) ||
-             (BRCMF_DATA_ON() && (chan != SDPCM_CONTROL_CHANNEL))))) {
-               printk(KERN_DEBUG "Tx Frame:\n");
-               print_hex_dump_bytes("", DUMP_PREFIX_OFFSET, frame, len);
-       } else if (BRCMF_HDRS_ON()) {
-               printk(KERN_DEBUG "TxHdr:\n");
-               print_hex_dump_bytes("", DUMP_PREFIX_OFFSET,
-                                    frame, min_t(u16, len, 16));
-       }
 #endif
 
+       brcmf_dbg_hex_dump(BRCMF_BYTES_ON() &&
+                          ((BRCMF_CTL_ON() && chan == SDPCM_CONTROL_CHANNEL) ||
+                           (BRCMF_DATA_ON() && chan != SDPCM_CONTROL_CHANNEL)),
+                          frame, len, "Tx Frame:\n");
+       brcmf_dbg_hex_dump(!(BRCMF_BYTES_ON() &&
+                            ((BRCMF_CTL_ON() &&
+                              chan == SDPCM_CONTROL_CHANNEL) ||
+                             (BRCMF_DATA_ON() &&
+                              chan != SDPCM_CONTROL_CHANNEL))) &&
+                          BRCMF_HDRS_ON(),
+                          frame, min_t(u16, len, 16), "TxHdr:\n");
+
        /* Raise len to next SDIO block to eliminate tail command */
        if (bus->roundup && bus->blocksize && (len > bus->blocksize)) {
                u16 pad = bus->blocksize - (len % bus->blocksize);
@@ -2314,7 +2276,7 @@ static void brcmf_sdbrcm_bus_stop(struct device *dev)
        uint retries;
        int err;
        struct brcmf_bus *bus_if = dev_get_drvdata(dev);
-       struct brcmf_sdio_dev *sdiodev = bus_if->bus_priv;
+       struct brcmf_sdio_dev *sdiodev = bus_if->bus_priv.sdio;
        struct brcmf_sdio *bus = sdiodev->bus;
 
        brcmf_dbg(TRACE, "Enter\n");
@@ -2410,7 +2372,7 @@ static bool brcmf_sdbrcm_dpc(struct brcmf_sdio *bus)
                int err;
                u8 clkctl, devctl = 0;
 
-#ifdef BCMDBG
+#ifdef DEBUG
                /* Check for inconsistent device control */
                devctl = brcmf_sdcard_cfg_read(bus->sdiodev, SDIO_FUNC_1,
                                               SBSDIO_DEVICE_CTL, &err);
@@ -2418,7 +2380,7 @@ static bool brcmf_sdbrcm_dpc(struct brcmf_sdio *bus)
                        brcmf_dbg(ERROR, "error reading DEVCTL: %d\n", err);
                        bus->sdiodev->bus_if->state = BRCMF_BUS_DOWN;
                }
-#endif                         /* BCMDBG */
+#endif                         /* DEBUG */
 
                /* Read CSR, if clock on switch to AVAIL, else ignore */
                clkctl = brcmf_sdcard_cfg_read(bus->sdiodev, SDIO_FUNC_1,
@@ -2664,7 +2626,7 @@ static int brcmf_sdbrcm_bus_txdata(struct device *dev, struct sk_buff *pkt)
        int ret = -EBADE;
        uint datalen, prec;
        struct brcmf_bus *bus_if = dev_get_drvdata(dev);
-       struct brcmf_sdio_dev *sdiodev = bus_if->bus_priv;
+       struct brcmf_sdio_dev *sdiodev = bus_if->bus_priv.sdio;
        struct brcmf_sdio *bus = sdiodev->bus;
 
        brcmf_dbg(TRACE, "Enter\n");
@@ -2684,8 +2646,7 @@ static int brcmf_sdbrcm_bus_txdata(struct device *dev, struct sk_buff *pkt)
 
        /* Priority based enq */
        spin_lock_bh(&bus->txqlock);
-       if (brcmf_c_prec_enq(bus->sdiodev->dev, &bus->txq, pkt, prec) ==
-           false) {
+       if (!brcmf_c_prec_enq(bus->sdiodev->dev, &bus->txq, pkt, prec)) {
                skb_pull(pkt, SDPCM_HDRLEN);
                brcmf_txcomplete(bus->sdiodev->dev, pkt, false);
                brcmu_pkt_buf_free_skb(pkt);
@@ -2701,7 +2662,7 @@ static int brcmf_sdbrcm_bus_txdata(struct device *dev, struct sk_buff *pkt)
                brcmf_txflowcontrol(bus->sdiodev->dev, 0, ON);
        }
 
-#ifdef BCMDBG
+#ifdef DEBUG
        if (pktq_plen(&bus->txq, prec) > qcount[prec])
                qcount[prec] = pktq_plen(&bus->txq, prec);
 #endif
@@ -2774,7 +2735,7 @@ xfer_done:
        return bcmerror;
 }
 
-#ifdef BCMDBG
+#ifdef DEBUG
 #define CONSOLE_LINE_MAX       192
 
 static int brcmf_sdbrcm_readconsole(struct brcmf_sdio *bus)
@@ -2845,14 +2806,14 @@ static int brcmf_sdbrcm_readconsole(struct brcmf_sdio *bus)
                        if (line[n - 1] == '\r')
                                n--;
                        line[n] = 0;
-                       printk(KERN_DEBUG "CONSOLE: %s\n", line);
+                       pr_debug("CONSOLE: %s\n", line);
                }
        }
 break2:
 
        return 0;
 }
-#endif                         /* BCMDBG */
+#endif                         /* DEBUG */
 
 static int brcmf_tx_frame(struct brcmf_sdio *bus, u8 *frame, u16 len)
 {
@@ -2906,7 +2867,7 @@ brcmf_sdbrcm_bus_txctl(struct device *dev, unsigned char *msg, uint msglen)
        u8 doff = 0;
        int ret = -1;
        struct brcmf_bus *bus_if = dev_get_drvdata(dev);
-       struct brcmf_sdio_dev *sdiodev = bus_if->bus_priv;
+       struct brcmf_sdio_dev *sdiodev = bus_if->bus_priv.sdio;
        struct brcmf_sdio *bus = sdiodev->bus;
 
        brcmf_dbg(TRACE, "Enter\n");
@@ -2972,7 +2933,7 @@ brcmf_sdbrcm_bus_txctl(struct device *dev, unsigned char *msg, uint msglen)
 
                brcmf_sdbrcm_wait_for_event(bus, &bus->ctrl_frame_stat);
 
-               if (bus->ctrl_frame_stat == false) {
+               if (!bus->ctrl_frame_stat) {
                        brcmf_dbg(INFO, "ctrl_frame_stat == false\n");
                        ret = 0;
                } else {
@@ -2982,17 +2943,11 @@ brcmf_sdbrcm_bus_txctl(struct device *dev, unsigned char *msg, uint msglen)
        }
 
        if (ret == -1) {
-#ifdef BCMDBG
-               if (BRCMF_BYTES_ON() && BRCMF_CTL_ON()) {
-                       printk(KERN_DEBUG "Tx Frame:\n");
-                       print_hex_dump_bytes("", DUMP_PREFIX_OFFSET,
-                                            frame, len);
-               } else if (BRCMF_HDRS_ON()) {
-                       printk(KERN_DEBUG "TxHdr:\n");
-                       print_hex_dump_bytes("", DUMP_PREFIX_OFFSET,
-                                            frame, min_t(u16, len, 16));
-               }
-#endif
+               brcmf_dbg_hex_dump(BRCMF_BYTES_ON() && BRCMF_CTL_ON(),
+                                  frame, len, "Tx Frame:\n");
+               brcmf_dbg_hex_dump(!(BRCMF_BYTES_ON() && BRCMF_CTL_ON()) &&
+                                  BRCMF_HDRS_ON(),
+                                  frame, min_t(u16, len, 16), "TxHdr:\n");
 
                do {
                        ret = brcmf_tx_frame(bus, frame, len);
@@ -3021,7 +2976,7 @@ brcmf_sdbrcm_bus_rxctl(struct device *dev, unsigned char *msg, uint msglen)
        uint rxlen = 0;
        bool pending;
        struct brcmf_bus *bus_if = dev_get_drvdata(dev);
-       struct brcmf_sdio_dev *sdiodev = bus_if->bus_priv;
+       struct brcmf_sdio_dev *sdiodev = bus_if->bus_priv.sdio;
        struct brcmf_sdio *bus = sdiodev->bus;
 
        brcmf_dbg(TRACE, "Enter\n");
@@ -3040,7 +2995,7 @@ brcmf_sdbrcm_bus_rxctl(struct device *dev, unsigned char *msg, uint msglen)
                          rxlen, msglen);
        } else if (timeleft == 0) {
                brcmf_dbg(ERROR, "resumed on timeout\n");
-       } else if (pending == true) {
+       } else if (pending) {
                brcmf_dbg(CTL, "cancelled\n");
                return -ERESTARTSYS;
        } else {
@@ -3096,9 +3051,9 @@ static int brcmf_sdbrcm_write_vars(struct brcmf_sdio *bus)
        u8 *vbuffer;
        u32 varsizew;
        __le32 varsizew_le;
-#ifdef BCMDBG
+#ifdef DEBUG
        char *nvram_ularray;
-#endif                         /* BCMDBG */
+#endif                         /* DEBUG */
 
        /* Even if there are no vars are to be written, we still
                 need to set the ramsize. */
@@ -3115,7 +3070,7 @@ static int brcmf_sdbrcm_write_vars(struct brcmf_sdio *bus)
                /* Write the vars list */
                bcmerror =
                    brcmf_sdbrcm_membytes(bus, true, varaddr, vbuffer, varsize);
-#ifdef BCMDBG
+#ifdef DEBUG
                /* Verify NVRAM bytes */
                brcmf_dbg(INFO, "Compare NVRAM dl & ul; varsize=%d\n", varsize);
                nvram_ularray = kmalloc(varsize, GFP_ATOMIC);
@@ -3142,7 +3097,7 @@ static int brcmf_sdbrcm_write_vars(struct brcmf_sdio *bus)
                        brcmf_dbg(ERROR, "Download/Upload/Compare of NVRAM ok\n");
 
                kfree(nvram_ularray);
-#endif                         /* BCMDBG */
+#endif                         /* DEBUG */
 
                kfree(vbuffer);
        }
@@ -3245,7 +3200,7 @@ static int brcmf_sdbrcm_download_code_file(struct brcmf_sdio *bus)
 
        brcmf_dbg(INFO, "Enter\n");
 
-       ret = request_firmware(&bus->firmware, BRCMFMAC_FW_NAME,
+       ret = request_firmware(&bus->firmware, BRCMF_SDIO_FW_NAME,
                               &bus->sdiodev->func[2]->dev);
        if (ret) {
                brcmf_dbg(ERROR, "Fail to request firmware %d\n", ret);
@@ -3342,7 +3297,7 @@ static int brcmf_sdbrcm_download_nvram(struct brcmf_sdio *bus)
        char *bufp;
        int ret;
 
-       ret = request_firmware(&bus->firmware, BRCMFMAC_NV_NAME,
+       ret = request_firmware(&bus->firmware, BRCMF_SDIO_NV_NAME,
                               &bus->sdiodev->func[2]->dev);
        if (ret) {
                brcmf_dbg(ERROR, "Fail to request nvram %d\n", ret);
@@ -3432,7 +3387,7 @@ brcmf_sdbrcm_download_firmware(struct brcmf_sdio *bus)
 static int brcmf_sdbrcm_bus_init(struct device *dev)
 {
        struct brcmf_bus *bus_if = dev_get_drvdata(dev);
-       struct brcmf_sdio_dev *sdiodev = bus_if->bus_priv;
+       struct brcmf_sdio_dev *sdiodev = bus_if->bus_priv.sdio;
        struct brcmf_sdio *bus = sdiodev->bus;
        unsigned long timeout;
        uint retries = 0;
@@ -3507,16 +3462,12 @@ static int brcmf_sdbrcm_bus_init(struct device *dev)
 
                brcmf_sdcard_cfg_write(bus->sdiodev, SDIO_FUNC_1,
                                       SBSDIO_WATERMARK, 8, &err);
-
-               /* Set bus state according to enable result */
-               bus_if->state = BRCMF_BUS_DATA;
-       }
-
-       else {
+       } else {
                /* Disable F2 again */
                enable = SDIO_FUNC_ENABLE_1;
                brcmf_sdcard_cfg_write(bus->sdiodev, SDIO_FUNC_0,
                                       SDIO_CCCR_IOEx, enable, NULL);
+               ret = -ENODEV;
        }
 
        /* Restore previous clock setting */
@@ -3524,7 +3475,7 @@ static int brcmf_sdbrcm_bus_init(struct device *dev)
                               SBSDIO_FUNC1_CHIPCLKCSR, saveclk, &err);
 
        /* If we didn't come up, turn off backplane clock */
-       if (bus_if->state != BRCMF_BUS_DATA)
+       if (!ret)
                brcmf_sdbrcm_clkctl(bus, CLK_NONE, false);
 
 exit:
@@ -3569,9 +3520,9 @@ void brcmf_sdbrcm_isr(void *arg)
 
 static bool brcmf_sdbrcm_bus_watchdog(struct brcmf_sdio *bus)
 {
-#ifdef BCMDBG
+#ifdef DEBUG
        struct brcmf_bus *bus_if = dev_get_drvdata(bus->sdiodev->dev);
-#endif /* BCMDBG */
+#endif /* DEBUG */
 
        brcmf_dbg(TIMER, "Enter\n");
 
@@ -3616,7 +3567,7 @@ static bool brcmf_sdbrcm_bus_watchdog(struct brcmf_sdio *bus)
                /* Update interrupt tracking */
                bus->lastintrs = bus->intrcount;
        }
-#ifdef BCMDBG
+#ifdef DEBUG
        /* Poll for console output periodically */
        if (bus_if->state == BRCMF_BUS_DATA &&
            bus->console_interval != 0) {
@@ -3630,7 +3581,7 @@ static bool brcmf_sdbrcm_bus_watchdog(struct brcmf_sdio *bus)
                                bus->console_interval = 0;
                }
        }
-#endif                         /* BCMDBG */
+#endif                         /* DEBUG */
 
        /* On idle timeout clear activity flag and/or turn off clock */
        if ((bus->idletime > 0) && (bus->clkstate == CLK_AVAIL)) {
@@ -3721,11 +3672,8 @@ brcmf_sdbrcm_probe_attach(struct brcmf_sdio *bus, u32 regsva)
        if (brcmf_sdcard_set_sbaddr_window(bus->sdiodev, SI_ENUM_BASE))
                brcmf_dbg(ERROR, "FAILED to return to SI_ENUM_BASE\n");
 
-#ifdef BCMDBG
-       printk(KERN_DEBUG "F1 signature read @0x18000000=0x%4x\n",
-              brcmf_sdcard_reg_read(bus->sdiodev, SI_ENUM_BASE, 4));
-
-#endif                         /* BCMDBG */
+       pr_debug("F1 signature read @0x18000000=0x%4x\n",
+                brcmf_sdcard_reg_read(bus->sdiodev, SI_ENUM_BASE, 4));
 
        /*
         * Force PLL off until brcmf_sdio_chip_attach()
@@ -3944,8 +3892,7 @@ void *brcmf_sdbrcm_probe(u32 regsva, struct brcmf_sdio_dev *sdiodev)
        bus->watchdog_tsk = kthread_run(brcmf_sdbrcm_watchdog_thread,
                                        bus, "brcmf_watchdog");
        if (IS_ERR(bus->watchdog_tsk)) {
-               printk(KERN_WARNING
-                      "brcmf_watchdog thread failed to start\n");
+               pr_warn("brcmf_watchdog thread failed to start\n");
                bus->watchdog_tsk = NULL;
        }
        /* Initialize DPC thread */
@@ -3953,8 +3900,7 @@ void *brcmf_sdbrcm_probe(u32 regsva, struct brcmf_sdio_dev *sdiodev)
        bus->dpc_tsk = kthread_run(brcmf_sdbrcm_dpc_thread,
                                   bus, "brcmf_dpc");
        if (IS_ERR(bus->dpc_tsk)) {
-               printk(KERN_WARNING
-                      "brcmf_dpc thread failed to start\n");
+               pr_warn("brcmf_dpc thread failed to start\n");
                bus->dpc_tsk = NULL;
        }
 
@@ -4031,7 +3977,7 @@ void
 brcmf_sdbrcm_wd_timer(struct brcmf_sdio *bus, uint wdtick)
 {
        /* Totally stop the timer */
-       if (!wdtick && bus->wd_timer_valid == true) {
+       if (!wdtick && bus->wd_timer_valid) {
                del_timer_sync(&bus->timer);
                bus->wd_timer_valid = false;
                bus->save_ms = wdtick;
@@ -4044,7 +3990,7 @@ brcmf_sdbrcm_wd_timer(struct brcmf_sdio *bus, uint wdtick)
 
        if (wdtick) {
                if (bus->save_ms != BRCMF_WD_POLL_MS) {
-                       if (bus->wd_timer_valid == true)
+                       if (bus->wd_timer_valid)
                                /* Stop timer and restart at new value */
                                del_timer_sync(&bus->timer);
 
index 11b2d7c..1534efc 100644 (file)
@@ -15,6 +15,8 @@
  */
 /* ***** SDIO interface chip backplane handle functions ***** */
 
+#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
+
 #include <linux/types.h>
 #include <linux/netdevice.h>
 #include <linux/mmc/card.h>
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/usb.c b/drivers/net/wireless/brcm80211/brcmfmac/usb.c
new file mode 100644 (file)
index 0000000..d4a9e8e
--- /dev/null
@@ -0,0 +1,1623 @@
+/*
+ * Copyright (c) 2011 Broadcom Corporation
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+ * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
+ * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include <linux/init.h>
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/kthread.h>
+#include <linux/slab.h>
+#include <linux/skbuff.h>
+#include <linux/netdevice.h>
+#include <linux/spinlock.h>
+#include <linux/ethtool.h>
+#include <linux/fcntl.h>
+#include <linux/fs.h>
+#include <linux/uaccess.h>
+#include <linux/firmware.h>
+#include <linux/usb.h>
+#include <net/cfg80211.h>
+
+#include <defs.h>
+#include <brcmu_utils.h>
+#include <brcmu_wifi.h>
+#include <dhd_bus.h>
+#include <dhd_dbg.h>
+
+#include "usb_rdl.h"
+#include "usb.h"
+
+#define IOCTL_RESP_TIMEOUT  2000
+
+#define BRCMF_USB_SYNC_TIMEOUT         300     /* ms */
+#define BRCMF_USB_DLIMAGE_SPINWAIT     100     /* in unit of ms */
+#define BRCMF_USB_DLIMAGE_LIMIT                500     /* spinwait limit (ms) */
+
+#define BRCMF_POSTBOOT_ID              0xA123  /* ID to detect if dongle
+                                                  has boot up */
+#define BRCMF_USB_RESETCFG_SPINWAIT    1       /* wait after resetcfg (ms) */
+
+#define BRCMF_USB_NRXQ 50
+#define BRCMF_USB_NTXQ 50
+
+#define CONFIGDESC(usb)         (&((usb)->actconfig)->desc)
+#define IFPTR(usb, idx)         ((usb)->actconfig->interface[(idx)])
+#define IFALTS(usb, idx)        (IFPTR((usb), (idx))->altsetting[0])
+#define IFDESC(usb, idx)        IFALTS((usb), (idx)).desc
+#define IFEPDESC(usb, idx, ep)  (IFALTS((usb), (idx)).endpoint[(ep)]).desc
+
+#define CONTROL_IF              0
+#define BULK_IF                 0
+
+#define BRCMF_USB_CBCTL_WRITE  0
+#define BRCMF_USB_CBCTL_READ   1
+#define BRCMF_USB_MAX_PKT_SIZE 1600
+
+#define BRCMF_USB_43236_FW_NAME        "brcm/brcmfmac43236b.bin"
+
+enum usbdev_suspend_state {
+       USBOS_SUSPEND_STATE_DEVICE_ACTIVE = 0, /* Device is busy, won't allow
+                                                 suspend */
+       USBOS_SUSPEND_STATE_SUSPEND_PENDING,    /* Device is idle, can be
+                                                * suspended. Wating PM to
+                                                * suspend the device
+                                                */
+       USBOS_SUSPEND_STATE_SUSPENDED   /* Device suspended */
+};
+
+struct brcmf_usb_probe_info {
+       void *usbdev_info;
+       struct usb_device *usb; /* USB device pointer from OS */
+       uint rx_pipe, tx_pipe, intr_pipe, rx_pipe2;
+       int intr_size; /* Size of interrupt message */
+       int interval;  /* Interrupt polling interval */
+       int vid;
+       int pid;
+       enum usb_device_speed device_speed;
+       enum usbdev_suspend_state suspend_state;
+       struct usb_interface *intf;
+};
+static struct brcmf_usb_probe_info usbdev_probe_info;
+
+struct brcmf_usb_image {
+       void *data;
+       u32 len;
+};
+static struct brcmf_usb_image g_image = { NULL, 0 };
+
+struct intr_transfer_buf {
+       u32 notification;
+       u32 reserved;
+};
+
+struct brcmf_usbdev_info {
+       struct brcmf_usbdev bus_pub; /* MUST BE FIRST */
+       spinlock_t qlock;
+       struct list_head rx_freeq;
+       struct list_head rx_postq;
+       struct list_head tx_freeq;
+       struct list_head tx_postq;
+       enum usbdev_suspend_state suspend_state;
+       uint rx_pipe, tx_pipe, intr_pipe, rx_pipe2;
+
+       bool activity;
+       int rx_low_watermark;
+       int tx_low_watermark;
+       int tx_high_watermark;
+       bool txoff;
+       bool rxoff;
+       bool txoverride;
+
+       struct brcmf_usbreq *tx_reqs;
+       struct brcmf_usbreq *rx_reqs;
+
+       u8 *image;      /* buffer for combine fw and nvram */
+       int image_len;
+
+       wait_queue_head_t wait;
+       bool waitdone;
+       int sync_urb_status;
+
+       struct usb_device *usbdev;
+       struct device *dev;
+       enum usb_device_speed  device_speed;
+
+       int ctl_in_pipe, ctl_out_pipe;
+       struct urb *ctl_urb; /* URB for control endpoint */
+       struct usb_ctrlrequest ctl_write;
+       struct usb_ctrlrequest ctl_read;
+       u32 ctl_urb_actual_length;
+       int ctl_urb_status;
+       int ctl_completed;
+       wait_queue_head_t ioctl_resp_wait;
+       wait_queue_head_t ctrl_wait;
+       ulong ctl_op;
+
+       bool rxctl_deferrespok;
+
+       struct urb *bulk_urb; /* used for FW download */
+       struct urb *intr_urb; /* URB for interrupt endpoint */
+       int intr_size;          /* Size of interrupt message */
+       int interval;           /* Interrupt polling interval */
+       struct intr_transfer_buf intr; /* Data buffer for interrupt endpoint */
+
+       struct brcmf_usb_probe_info probe_info;
+
+};
+
+static void brcmf_usb_rx_refill(struct brcmf_usbdev_info *devinfo,
+                               struct brcmf_usbreq  *req);
+
+MODULE_AUTHOR("Broadcom Corporation");
+MODULE_DESCRIPTION("Broadcom 802.11n wireless LAN fullmac usb driver.");
+MODULE_SUPPORTED_DEVICE("Broadcom 802.11n WLAN fullmac usb cards");
+MODULE_LICENSE("Dual BSD/GPL");
+
+static struct brcmf_usbdev *brcmf_usb_get_buspub(struct device *dev)
+{
+       struct brcmf_bus *bus_if = dev_get_drvdata(dev);
+       return bus_if->bus_priv.usb;
+}
+
+static struct brcmf_usbdev_info *brcmf_usb_get_businfo(struct device *dev)
+{
+       return brcmf_usb_get_buspub(dev)->devinfo;
+}
+
+#if 0
+static void
+brcmf_usb_txflowcontrol(struct brcmf_usbdev_info *devinfo, bool onoff)
+{
+       dhd_txflowcontrol(devinfo->bus_pub.netdev, 0, onoff);
+}
+#endif
+
+static int brcmf_usb_ioctl_resp_wait(struct brcmf_usbdev_info *devinfo,
+        uint *condition, bool *pending)
+{
+       DECLARE_WAITQUEUE(wait, current);
+       int timeout = IOCTL_RESP_TIMEOUT;
+
+       /* Convert timeout in millsecond to jiffies */
+       timeout = msecs_to_jiffies(timeout);
+       /* Wait until control frame is available */
+       add_wait_queue(&devinfo->ioctl_resp_wait, &wait);
+       set_current_state(TASK_INTERRUPTIBLE);
+
+       smp_mb();
+       while (!(*condition) && (!signal_pending(current) && timeout)) {
+               timeout = schedule_timeout(timeout);
+               /* Wait until control frame is available */
+               smp_mb();
+       }
+
+       if (signal_pending(current))
+               *pending = true;
+
+       set_current_state(TASK_RUNNING);
+       remove_wait_queue(&devinfo->ioctl_resp_wait, &wait);
+
+       return timeout;
+}
+
+static int brcmf_usb_ioctl_resp_wake(struct brcmf_usbdev_info *devinfo)
+{
+       if (waitqueue_active(&devinfo->ioctl_resp_wait))
+               wake_up_interruptible(&devinfo->ioctl_resp_wait);
+
+       return 0;
+}
+
+static void
+brcmf_usb_ctl_complete(struct brcmf_usbdev_info *devinfo, int type, int status)
+{
+
+       if (unlikely(devinfo == NULL))
+               return;
+
+       if (type == BRCMF_USB_CBCTL_READ) {
+               if (status == 0)
+                       devinfo->bus_pub.stats.rx_ctlpkts++;
+               else
+                       devinfo->bus_pub.stats.rx_ctlerrs++;
+       } else if (type == BRCMF_USB_CBCTL_WRITE) {
+               if (status == 0)
+                       devinfo->bus_pub.stats.tx_ctlpkts++;
+               else
+                       devinfo->bus_pub.stats.tx_ctlerrs++;
+       }
+
+       devinfo->ctl_urb_status = status;
+       devinfo->ctl_completed = true;
+       brcmf_usb_ioctl_resp_wake(devinfo);
+}
+
+static void
+brcmf_usb_ctlread_complete(struct urb *urb)
+{
+       struct brcmf_usbdev_info *devinfo =
+               (struct brcmf_usbdev_info *)urb->context;
+
+       devinfo->ctl_urb_actual_length = urb->actual_length;
+       brcmf_usb_ctl_complete(devinfo, BRCMF_USB_CBCTL_READ,
+               urb->status);
+}
+
+static void
+brcmf_usb_ctlwrite_complete(struct urb *urb)
+{
+       struct brcmf_usbdev_info *devinfo =
+               (struct brcmf_usbdev_info *)urb->context;
+
+       brcmf_usb_ctl_complete(devinfo, BRCMF_USB_CBCTL_WRITE,
+               urb->status);
+}
+
+static int brcmf_usb_pnp(struct brcmf_usbdev_info *devinfo, uint state)
+{
+       return 0;
+}
+
+static int
+brcmf_usb_send_ctl(struct brcmf_usbdev_info *devinfo, u8 *buf, int len)
+{
+       int ret;
+       u16 size;
+
+       if (devinfo == NULL || buf == NULL ||
+           len == 0 || devinfo->ctl_urb == NULL)
+               return -EINVAL;
+
+       /* If the USB/HSIC bus in sleep state, wake it up */
+       if (devinfo->suspend_state == USBOS_SUSPEND_STATE_SUSPENDED)
+               if (brcmf_usb_pnp(devinfo, BCMFMAC_USB_PNP_RESUME) != 0) {
+                       brcmf_dbg(ERROR, "Could not Resume the bus!\n");
+                       return -EIO;
+               }
+
+       devinfo->activity = true;
+       size = len;
+       devinfo->ctl_write.wLength = cpu_to_le16p(&size);
+       devinfo->ctl_urb->transfer_buffer_length = size;
+       devinfo->ctl_urb_status = 0;
+       devinfo->ctl_urb_actual_length = 0;
+
+       usb_fill_control_urb(devinfo->ctl_urb,
+               devinfo->usbdev,
+               devinfo->ctl_out_pipe,
+               (unsigned char *) &devinfo->ctl_write,
+               buf, size,
+               (usb_complete_t)brcmf_usb_ctlwrite_complete,
+               devinfo);
+
+       ret = usb_submit_urb(devinfo->ctl_urb, GFP_ATOMIC);
+       if (ret < 0)
+               brcmf_dbg(ERROR, "usb_submit_urb failed %d\n", ret);
+
+       return ret;
+}
+
+static int
+brcmf_usb_recv_ctl(struct brcmf_usbdev_info *devinfo, u8 *buf, int len)
+{
+       int ret;
+       u16 size;
+
+       if ((devinfo == NULL) || (buf == NULL) || (len == 0)
+               || (devinfo->ctl_urb == NULL))
+               return -EINVAL;
+
+       size = len;
+       devinfo->ctl_read.wLength = cpu_to_le16p(&size);
+       devinfo->ctl_urb->transfer_buffer_length = size;
+
+       if (devinfo->rxctl_deferrespok) {
+               /* BMAC model */
+               devinfo->ctl_read.bRequestType = USB_DIR_IN
+                       | USB_TYPE_VENDOR | USB_RECIP_INTERFACE;
+               devinfo->ctl_read.bRequest = DL_DEFER_RESP_OK;
+       } else {
+               /* full dongle model */
+               devinfo->ctl_read.bRequestType = USB_DIR_IN
+                       | USB_TYPE_CLASS | USB_RECIP_INTERFACE;
+               devinfo->ctl_read.bRequest = 1;
+       }
+
+       usb_fill_control_urb(devinfo->ctl_urb,
+               devinfo->usbdev,
+               devinfo->ctl_in_pipe,
+               (unsigned char *) &devinfo->ctl_read,
+               buf, size,
+               (usb_complete_t)brcmf_usb_ctlread_complete,
+               devinfo);
+
+       ret = usb_submit_urb(devinfo->ctl_urb, GFP_ATOMIC);
+       if (ret < 0)
+               brcmf_dbg(ERROR, "usb_submit_urb failed %d\n", ret);
+
+       return ret;
+}
+
+static int brcmf_usb_tx_ctlpkt(struct device *dev, u8 *buf, u32 len)
+{
+       int err = 0;
+       int timeout = 0;
+       bool pending;
+       struct brcmf_usbdev_info *devinfo = brcmf_usb_get_businfo(dev);
+
+       if (devinfo->bus_pub.state != BCMFMAC_USB_STATE_UP) {
+               /* TODO: handle suspend/resume */
+               return -EIO;
+       }
+
+       if (test_and_set_bit(0, &devinfo->ctl_op))
+               return -EIO;
+
+       err = brcmf_usb_send_ctl(devinfo, buf, len);
+       if (err) {
+               brcmf_dbg(ERROR, "fail %d bytes: %d\n", err, len);
+               return err;
+       }
+
+       devinfo->ctl_completed = false;
+       timeout = brcmf_usb_ioctl_resp_wait(devinfo, &devinfo->ctl_completed,
+                                           &pending);
+       clear_bit(0, &devinfo->ctl_op);
+       if (!timeout) {
+               brcmf_dbg(ERROR, "Txctl wait timed out\n");
+               err = -EIO;
+       }
+       return err;
+}
+
+static int brcmf_usb_rx_ctlpkt(struct device *dev, u8 *buf, u32 len)
+{
+       int err = 0;
+       int timeout = 0;
+       bool pending;
+       struct brcmf_usbdev_info *devinfo = brcmf_usb_get_businfo(dev);
+
+       if (devinfo->bus_pub.state != BCMFMAC_USB_STATE_UP) {
+               /* TODO: handle suspend/resume */
+               return -EIO;
+       }
+       if (test_and_set_bit(0, &devinfo->ctl_op))
+               return -EIO;
+
+       err = brcmf_usb_recv_ctl(devinfo, buf, len);
+       if (err) {
+               brcmf_dbg(ERROR, "fail %d bytes: %d\n", err, len);
+               return err;
+       }
+       devinfo->ctl_completed = false;
+       timeout = brcmf_usb_ioctl_resp_wait(devinfo, &devinfo->ctl_completed,
+                                           &pending);
+       err = devinfo->ctl_urb_status;
+       clear_bit(0, &devinfo->ctl_op);
+       if (!timeout) {
+               brcmf_dbg(ERROR, "rxctl wait timed out\n");
+               err = -EIO;
+       }
+       if (!err)
+               return devinfo->ctl_urb_actual_length;
+       else
+               return err;
+}
+
+static struct brcmf_usbreq *brcmf_usb_deq(struct brcmf_usbdev_info *devinfo,
+                                         struct list_head *q)
+{
+       unsigned long flags;
+       struct brcmf_usbreq  *req;
+       spin_lock_irqsave(&devinfo->qlock, flags);
+       if (list_empty(q)) {
+               spin_unlock_irqrestore(&devinfo->qlock, flags);
+               return NULL;
+       }
+       req = list_entry(q->next, struct brcmf_usbreq, list);
+       list_del_init(q->next);
+       spin_unlock_irqrestore(&devinfo->qlock, flags);
+       return req;
+
+}
+
+static void brcmf_usb_enq(struct brcmf_usbdev_info *devinfo,
+                         struct list_head *q, struct brcmf_usbreq *req)
+{
+       unsigned long flags;
+       spin_lock_irqsave(&devinfo->qlock, flags);
+       list_add_tail(&req->list, q);
+       spin_unlock_irqrestore(&devinfo->qlock, flags);
+}
+
+static struct brcmf_usbreq *
+brcmf_usbdev_qinit(struct list_head *q, int qsize)
+{
+       int i;
+       struct brcmf_usbreq *req, *reqs;
+
+       reqs = kzalloc(sizeof(struct brcmf_usbreq) * qsize, GFP_ATOMIC);
+       if (reqs == NULL) {
+               brcmf_dbg(ERROR, "fail to allocate memory!\n");
+               return NULL;
+       }
+       req = reqs;
+
+       for (i = 0; i < qsize; i++) {
+               req->urb = usb_alloc_urb(0, GFP_ATOMIC);
+               if (!req->urb)
+                       goto fail;
+
+               INIT_LIST_HEAD(&req->list);
+               list_add_tail(&req->list, q);
+               req++;
+       }
+       return reqs;
+fail:
+       brcmf_dbg(ERROR, "fail!\n");
+       while (!list_empty(q)) {
+               req = list_entry(q->next, struct brcmf_usbreq, list);
+               if (req && req->urb)
+                       usb_free_urb(req->urb);
+               list_del(q->next);
+       }
+       return NULL;
+
+}
+
+static void brcmf_usb_free_q(struct list_head *q, bool pending)
+{
+       struct brcmf_usbreq *req, *next;
+       int i = 0;
+       list_for_each_entry_safe(req, next, q, list) {
+               if (!req->urb) {
+                       brcmf_dbg(ERROR, "bad req\n");
+                       break;
+               }
+               i++;
+               if (pending) {
+                       usb_kill_urb(req->urb);
+               } else {
+                       usb_free_urb(req->urb);
+                       list_del_init(&req->list);
+               }
+       }
+}
+
+static void brcmf_usb_del_fromq(struct brcmf_usbdev_info *devinfo,
+                               struct brcmf_usbreq *req)
+{
+       unsigned long flags;
+
+       spin_lock_irqsave(&devinfo->qlock, flags);
+       list_del_init(&req->list);
+       spin_unlock_irqrestore(&devinfo->qlock, flags);
+}
+
+
+static void brcmf_usb_tx_complete(struct urb *urb)
+{
+       struct brcmf_usbreq *req = (struct brcmf_usbreq *)urb->context;
+       struct brcmf_usbdev_info *devinfo = req->devinfo;
+
+       brcmf_usb_del_fromq(devinfo, req);
+       if (urb->status == 0)
+               devinfo->bus_pub.stats.tx_packets++;
+       else
+               devinfo->bus_pub.stats.tx_errors++;
+
+       dev_kfree_skb(req->skb);
+       req->skb = NULL;
+       brcmf_usb_enq(devinfo, &devinfo->tx_freeq, req);
+
+}
+
+static void brcmf_usb_rx_complete(struct urb *urb)
+{
+       struct brcmf_usbreq  *req = (struct brcmf_usbreq *)urb->context;
+       struct brcmf_usbdev_info *devinfo = req->devinfo;
+       struct sk_buff *skb;
+       int ifidx = 0;
+
+       brcmf_usb_del_fromq(devinfo, req);
+       skb = req->skb;
+       req->skb = NULL;
+
+       if (urb->status == 0) {
+               devinfo->bus_pub.stats.rx_packets++;
+       } else {
+               devinfo->bus_pub.stats.rx_errors++;
+               dev_kfree_skb(skb);
+               brcmf_usb_enq(devinfo, &devinfo->rx_freeq, req);
+               return;
+       }
+
+       if (devinfo->bus_pub.state == BCMFMAC_USB_STATE_UP) {
+               skb_put(skb, urb->actual_length);
+               if (brcmf_proto_hdrpull(devinfo->dev, &ifidx, skb) != 0) {
+                       brcmf_dbg(ERROR, "rx protocol error\n");
+                       brcmu_pkt_buf_free_skb(skb);
+                       devinfo->bus_pub.bus->dstats.rx_errors++;
+               } else {
+                       brcmf_rx_packet(devinfo->dev, ifidx, skb);
+                       brcmf_usb_rx_refill(devinfo, req);
+               }
+       } else {
+               dev_kfree_skb(skb);
+       }
+       return;
+
+}
+
+static void brcmf_usb_rx_refill(struct brcmf_usbdev_info *devinfo,
+                               struct brcmf_usbreq  *req)
+{
+       struct sk_buff *skb;
+       int ret;
+
+       if (!req || !devinfo)
+               return;
+
+       skb = dev_alloc_skb(devinfo->bus_pub.bus_mtu);
+       if (!skb) {
+               brcmf_usb_enq(devinfo, &devinfo->rx_freeq, req);
+               return;
+       }
+       req->skb = skb;
+
+       usb_fill_bulk_urb(req->urb, devinfo->usbdev, devinfo->rx_pipe,
+                         skb->data, skb_tailroom(skb), brcmf_usb_rx_complete,
+                         req);
+       req->urb->transfer_flags |= URB_ZERO_PACKET;
+       req->devinfo = devinfo;
+
+       ret = usb_submit_urb(req->urb, GFP_ATOMIC);
+       if (ret == 0) {
+               brcmf_usb_enq(devinfo, &devinfo->rx_postq, req);
+       } else {
+               dev_kfree_skb(req->skb);
+               req->skb = NULL;
+               brcmf_usb_enq(devinfo, &devinfo->rx_freeq, req);
+       }
+       return;
+}
+
+static void brcmf_usb_rx_fill_all(struct brcmf_usbdev_info *devinfo)
+{
+       struct brcmf_usbreq *req;
+
+       if (devinfo->bus_pub.state != BCMFMAC_USB_STATE_UP) {
+               brcmf_dbg(ERROR, "bus is not up\n");
+               return;
+       }
+       while ((req = brcmf_usb_deq(devinfo, &devinfo->rx_freeq)) != NULL)
+               brcmf_usb_rx_refill(devinfo, req);
+}
+
+static void
+brcmf_usb_state_change(struct brcmf_usbdev_info *devinfo, int state)
+{
+       struct brcmf_bus *bcmf_bus = devinfo->bus_pub.bus;
+       int old_state;
+
+
+       if (devinfo->bus_pub.state == state)
+               return;
+
+       old_state = devinfo->bus_pub.state;
+       brcmf_dbg(TRACE, "dbus state change from %d to to %d\n",
+                 old_state, state);
+
+       /* Don't update state if it's PnP firmware re-download */
+       if (state != BCMFMAC_USB_STATE_PNP_FWDL) /* TODO */
+               devinfo->bus_pub.state = state;
+
+       if ((old_state  == BCMFMAC_USB_STATE_SLEEP)
+               && (state == BCMFMAC_USB_STATE_UP)) {
+               brcmf_usb_rx_fill_all(devinfo);
+       }
+
+       /* update state of upper layer */
+       if (state == BCMFMAC_USB_STATE_DOWN) {
+               brcmf_dbg(INFO, "DBUS is down\n");
+               bcmf_bus->state = BRCMF_BUS_DOWN;
+       } else {
+               brcmf_dbg(INFO, "DBUS current state=%d\n", state);
+       }
+}
+
+static void
+brcmf_usb_intr_complete(struct urb *urb)
+{
+       struct brcmf_usbdev_info *devinfo =
+                       (struct brcmf_usbdev_info *)urb->context;
+       bool killed;
+
+       if (devinfo == NULL)
+               return;
+
+       if (unlikely(urb->status)) {
+               if (devinfo->suspend_state ==
+                       USBOS_SUSPEND_STATE_SUSPEND_PENDING)
+                       killed = true;
+
+               if ((urb->status == -ENOENT && (!killed))
+                       || urb->status == -ESHUTDOWN ||
+                       urb->status == -ENODEV) {
+                       brcmf_usb_state_change(devinfo, BCMFMAC_USB_STATE_DOWN);
+               }
+       }
+
+       if (devinfo->bus_pub.state == BCMFMAC_USB_STATE_DOWN) {
+               brcmf_dbg(ERROR, "intr cb when DBUS down, ignoring\n");
+               return;
+       }
+
+       if (devinfo->bus_pub.state == BCMFMAC_USB_STATE_UP)
+               usb_submit_urb(devinfo->intr_urb, GFP_ATOMIC);
+}
+
+static int brcmf_usb_tx(struct device *dev, struct sk_buff *skb)
+{
+       struct brcmf_usbdev_info *devinfo = brcmf_usb_get_businfo(dev);
+       struct brcmf_usbreq  *req;
+       int ret;
+
+       if (devinfo->bus_pub.state != BCMFMAC_USB_STATE_UP) {
+               /* TODO: handle suspend/resume */
+               return -EIO;
+       }
+
+       req = brcmf_usb_deq(devinfo, &devinfo->tx_freeq);
+       if (!req) {
+               brcmf_dbg(ERROR, "no req to send\n");
+               return -ENOMEM;
+       }
+       if (!req->urb) {
+               brcmf_dbg(ERROR, "no urb for req %p\n", req);
+               return -ENOBUFS;
+       }
+
+       req->skb = skb;
+       req->devinfo = devinfo;
+       usb_fill_bulk_urb(req->urb, devinfo->usbdev, devinfo->tx_pipe,
+                         skb->data, skb->len, brcmf_usb_tx_complete, req);
+       req->urb->transfer_flags |= URB_ZERO_PACKET;
+       ret = usb_submit_urb(req->urb, GFP_ATOMIC);
+       if (!ret) {
+               brcmf_usb_enq(devinfo, &devinfo->tx_postq, req);
+       } else {
+               req->skb = NULL;
+               brcmf_usb_enq(devinfo, &devinfo->tx_freeq, req);
+       }
+
+       return ret;
+}
+
+
+static int brcmf_usb_up(struct device *dev)
+{
+       struct brcmf_usbdev_info *devinfo = brcmf_usb_get_businfo(dev);
+       u16 ifnum;
+
+       if (devinfo == NULL)
+               return -EINVAL;
+
+       if (devinfo->bus_pub.state == BCMFMAC_USB_STATE_UP)
+               return 0;
+
+       /* If the USB/HSIC bus in sleep state, wake it up */
+       if (devinfo->suspend_state == USBOS_SUSPEND_STATE_SUSPENDED) {
+               if (brcmf_usb_pnp(devinfo, BCMFMAC_USB_PNP_RESUME) != 0) {
+                       brcmf_dbg(ERROR, "Could not Resume the bus!\n");
+                       return -EIO;
+               }
+       }
+       devinfo->activity = true;
+
+       /* Success, indicate devinfo is fully up */
+       brcmf_usb_state_change(devinfo, BCMFMAC_USB_STATE_UP);
+
+       if (devinfo->intr_urb) {
+               int ret;
+
+               usb_fill_int_urb(devinfo->intr_urb, devinfo->usbdev,
+                       devinfo->intr_pipe,
+                       &devinfo->intr,
+                       devinfo->intr_size,
+                       (usb_complete_t)brcmf_usb_intr_complete,
+                       devinfo,
+                       devinfo->interval);
+
+               ret = usb_submit_urb(devinfo->intr_urb, GFP_ATOMIC);
+               if (ret) {
+                       brcmf_dbg(ERROR, "USB_SUBMIT_URB failed with status %d\n",
+                                 ret);
+                       return -EINVAL;
+               }
+       }
+
+       if (devinfo->ctl_urb) {
+               devinfo->ctl_in_pipe = usb_rcvctrlpipe(devinfo->usbdev, 0);
+               devinfo->ctl_out_pipe = usb_sndctrlpipe(devinfo->usbdev, 0);
+
+               ifnum = IFDESC(devinfo->usbdev, CONTROL_IF).bInterfaceNumber;
+
+               /* CTL Write */
+               devinfo->ctl_write.bRequestType =
+                       USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE;
+               devinfo->ctl_write.bRequest = 0;
+               devinfo->ctl_write.wValue = cpu_to_le16(0);
+               devinfo->ctl_write.wIndex = cpu_to_le16p(&ifnum);
+
+               /* CTL Read */
+               devinfo->ctl_read.bRequestType =
+                       USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE;
+               devinfo->ctl_read.bRequest = 1;
+               devinfo->ctl_read.wValue = cpu_to_le16(0);
+               devinfo->ctl_read.wIndex = cpu_to_le16p(&ifnum);
+       }
+       brcmf_usb_rx_fill_all(devinfo);
+       return 0;
+}
+
+static void brcmf_usb_down(struct device *dev)
+{
+       struct brcmf_usbdev_info *devinfo = brcmf_usb_get_businfo(dev);
+
+       if (devinfo == NULL)
+               return;
+
+       brcmf_dbg(TRACE, "enter\n");
+       if (devinfo->bus_pub.state == BCMFMAC_USB_STATE_DOWN)
+               return;
+
+       brcmf_usb_state_change(devinfo, BCMFMAC_USB_STATE_DOWN);
+       if (devinfo->intr_urb)
+               usb_kill_urb(devinfo->intr_urb);
+
+       if (devinfo->ctl_urb)
+               usb_kill_urb(devinfo->ctl_urb);
+
+       if (devinfo->bulk_urb)
+               usb_kill_urb(devinfo->bulk_urb);
+       brcmf_usb_free_q(&devinfo->tx_postq, true);
+
+       brcmf_usb_free_q(&devinfo->rx_postq, true);
+}
+
+static int
+brcmf_usb_sync_wait(struct brcmf_usbdev_info *devinfo, u16 time)
+{
+       int ret;
+       int err = 0;
+       int ms = time;
+
+       ret = wait_event_interruptible_timeout(devinfo->wait,
+               devinfo->waitdone == true, (ms * HZ / 1000));
+
+       if ((devinfo->waitdone == false) || (devinfo->sync_urb_status)) {
+               brcmf_dbg(ERROR, "timeout(%d) or urb err=%d\n",
+                         ret, devinfo->sync_urb_status);
+               err = -EINVAL;
+       }
+       devinfo->waitdone = false;
+       return err;
+}
+
+static void
+brcmf_usb_sync_complete(struct urb *urb)
+{
+       struct brcmf_usbdev_info *devinfo =
+                       (struct brcmf_usbdev_info *)urb->context;
+
+       devinfo->waitdone = true;
+       wake_up_interruptible(&devinfo->wait);
+       devinfo->sync_urb_status = urb->status;
+}
+
+static bool brcmf_usb_dl_cmd(struct brcmf_usbdev_info *devinfo, u8 cmd,
+                            void *buffer, int buflen)
+{
+       int ret = 0;
+       char *tmpbuf;
+       u16 size;
+
+       if ((!devinfo) || (devinfo->ctl_urb == NULL))
+               return false;
+
+       tmpbuf = kmalloc(buflen, GFP_ATOMIC);
+       if (!tmpbuf)
+               return false;
+
+       size = buflen;
+       devinfo->ctl_urb->transfer_buffer_length = size;
+
+       devinfo->ctl_read.wLength = cpu_to_le16p(&size);
+       devinfo->ctl_read.bRequestType = USB_DIR_IN | USB_TYPE_VENDOR |
+               USB_RECIP_INTERFACE;
+       devinfo->ctl_read.bRequest = cmd;
+
+       usb_fill_control_urb(devinfo->ctl_urb,
+               devinfo->usbdev,
+               usb_rcvctrlpipe(devinfo->usbdev, 0),
+               (unsigned char *) &devinfo->ctl_read,
+               (void *) tmpbuf, size,
+               (usb_complete_t)brcmf_usb_sync_complete, devinfo);
+
+       ret = usb_submit_urb(devinfo->ctl_urb, GFP_ATOMIC);
+       if (ret < 0) {
+               brcmf_dbg(ERROR, "usb_submit_urb failed %d\n", ret);
+               kfree(tmpbuf);
+               return false;
+       }
+
+       ret = brcmf_usb_sync_wait(devinfo, BRCMF_USB_SYNC_TIMEOUT);
+       memcpy(buffer, tmpbuf, buflen);
+       kfree(tmpbuf);
+
+       return (ret == 0);
+}
+
+static bool
+brcmf_usb_dlneeded(struct brcmf_usbdev_info *devinfo)
+{
+       struct bootrom_id_le id;
+       u32 chipid, chiprev;
+
+       brcmf_dbg(TRACE, "enter\n");
+
+       if (devinfo == NULL)
+               return false;
+
+       /* Check if firmware downloaded already by querying runtime ID */
+       id.chip = cpu_to_le32(0xDEAD);
+       brcmf_usb_dl_cmd(devinfo, DL_GETVER, &id,
+               sizeof(struct bootrom_id_le));
+
+       chipid = le32_to_cpu(id.chip);
+       chiprev = le32_to_cpu(id.chiprev);
+
+       if ((chipid & 0x4300) == 0x4300)
+               brcmf_dbg(INFO, "chip %x rev 0x%x\n", chipid, chiprev);
+       else
+               brcmf_dbg(INFO, "chip %d rev 0x%x\n", chipid, chiprev);
+       if (chipid == BRCMF_POSTBOOT_ID) {
+               brcmf_dbg(INFO, "firmware already downloaded\n");
+               brcmf_usb_dl_cmd(devinfo, DL_RESETCFG, &id,
+                       sizeof(struct bootrom_id_le));
+               return false;
+       } else {
+               devinfo->bus_pub.attrib.devid = chipid;
+               devinfo->bus_pub.attrib.chiprev = chiprev;
+       }
+       return true;
+}
+
+static int
+brcmf_usb_resetcfg(struct brcmf_usbdev_info *devinfo)
+{
+       struct bootrom_id_le id;
+       u16 wait = 0, wait_time;
+
+       brcmf_dbg(TRACE, "enter\n");
+
+       if (devinfo == NULL)
+               return -EINVAL;
+
+       /* Give dongle chance to boot */
+       wait_time = BRCMF_USB_DLIMAGE_SPINWAIT;
+       while (wait < BRCMF_USB_DLIMAGE_LIMIT) {
+               mdelay(wait_time);
+               wait += wait_time;
+               id.chip = cpu_to_le32(0xDEAD);       /* Get the ID */
+               brcmf_usb_dl_cmd(devinfo, DL_GETVER, &id,
+                       sizeof(struct bootrom_id_le));
+               if (id.chip == cpu_to_le32(BRCMF_POSTBOOT_ID))
+                       break;
+       }
+
+       if (id.chip == cpu_to_le32(BRCMF_POSTBOOT_ID)) {
+               brcmf_dbg(INFO, "download done %d ms postboot chip 0x%x/rev 0x%x\n",
+                         wait, le32_to_cpu(id.chip), le32_to_cpu(id.chiprev));
+
+               brcmf_usb_dl_cmd(devinfo, DL_RESETCFG, &id,
+                       sizeof(struct bootrom_id_le));
+
+               /* XXX this wait may not be necessary */
+               mdelay(BRCMF_USB_RESETCFG_SPINWAIT);
+               return 0;
+       } else {
+               brcmf_dbg(ERROR, "Cannot talk to Dongle. Firmware is not UP, %d ms\n",
+                         wait);
+               return -EINVAL;
+       }
+}
+
+
+static int
+brcmf_usb_dl_send_bulk(struct brcmf_usbdev_info *devinfo, void *buffer, int len)
+{
+       int ret;
+
+       if ((devinfo == NULL) || (devinfo->bulk_urb == NULL))
+               return -EINVAL;
+
+       /* Prepare the URB */
+       usb_fill_bulk_urb(devinfo->bulk_urb, devinfo->usbdev,
+                         devinfo->tx_pipe, buffer, len,
+                         (usb_complete_t)brcmf_usb_sync_complete, devinfo);
+
+       devinfo->bulk_urb->transfer_flags |= URB_ZERO_PACKET;
+
+       ret = usb_submit_urb(devinfo->bulk_urb, GFP_ATOMIC);
+       if (ret) {
+               brcmf_dbg(ERROR, "usb_submit_urb failed %d\n", ret);
+               return ret;
+       }
+       ret = brcmf_usb_sync_wait(devinfo, BRCMF_USB_SYNC_TIMEOUT);
+       return ret;
+}
+
+static int
+brcmf_usb_dl_writeimage(struct brcmf_usbdev_info *devinfo, u8 *fw, int fwlen)
+{
+       unsigned int sendlen, sent, dllen;
+       char *bulkchunk = NULL, *dlpos;
+       struct rdl_state_le state;
+       u32 rdlstate, rdlbytes;
+       int err = 0;
+       brcmf_dbg(TRACE, "fw %p, len %d\n", fw, fwlen);
+
+       bulkchunk = kmalloc(RDL_CHUNK, GFP_ATOMIC);
+       if (bulkchunk == NULL) {
+               err = -ENOMEM;
+               goto fail;
+       }
+
+       /* 1) Prepare USB boot loader for runtime image */
+       brcmf_usb_dl_cmd(devinfo, DL_START, &state,
+                        sizeof(struct rdl_state_le));
+
+       rdlstate = le32_to_cpu(state.state);
+       rdlbytes = le32_to_cpu(state.bytes);
+
+       /* 2) Check we are in the Waiting state */
+       if (rdlstate != DL_WAITING) {
+               brcmf_dbg(ERROR, "Failed to DL_START\n");
+               err = -EINVAL;
+               goto fail;
+       }
+       sent = 0;
+       dlpos = fw;
+       dllen = fwlen;
+
+       /* Get chip id and rev */
+       while (rdlbytes != dllen) {
+               /* Wait until the usb device reports it received all
+                * the bytes we sent */
+               if ((rdlbytes == sent) && (rdlbytes != dllen)) {
+                       if ((dllen-sent) < RDL_CHUNK)
+                               sendlen = dllen-sent;
+                       else
+                               sendlen = RDL_CHUNK;
+
+                       /* simply avoid having to send a ZLP by ensuring we
+                        * never have an even
+                        * multiple of 64
+                        */
+                       if (!(sendlen % 64))
+                               sendlen -= 4;
+
+                       /* send data */
+                       memcpy(bulkchunk, dlpos, sendlen);
+                       if (brcmf_usb_dl_send_bulk(devinfo, bulkchunk,
+                                                  sendlen)) {
+                               brcmf_dbg(ERROR, "send_bulk failed\n");
+                               err = -EINVAL;
+                               goto fail;
+                       }
+
+                       dlpos += sendlen;
+                       sent += sendlen;
+               }
+               if (!brcmf_usb_dl_cmd(devinfo, DL_GETSTATE, &state,
+                                     sizeof(struct rdl_state_le))) {
+                       brcmf_dbg(ERROR, "DL_GETSTATE Failed xxxx\n");
+                       err = -EINVAL;
+                       goto fail;
+               }
+
+               rdlstate = le32_to_cpu(state.state);
+               rdlbytes = le32_to_cpu(state.bytes);
+
+               /* restart if an error is reported */
+               if (rdlstate == DL_BAD_HDR || rdlstate == DL_BAD_CRC) {
+                       brcmf_dbg(ERROR, "Bad Hdr or Bad CRC state %d\n",
+                                 rdlstate);
+                       err = -EINVAL;
+                       goto fail;
+               }
+       }
+
+fail:
+       kfree(bulkchunk);
+       brcmf_dbg(TRACE, "err=%d\n", err);
+       return err;
+}
+
+static int brcmf_usb_dlstart(struct brcmf_usbdev_info *devinfo, u8 *fw, int len)
+{
+       int err;
+
+       brcmf_dbg(TRACE, "enter\n");
+
+       if (devinfo == NULL)
+               return -EINVAL;
+
+       if (devinfo->bus_pub.attrib.devid == 0xDEAD)
+               return -EINVAL;
+
+       err = brcmf_usb_dl_writeimage(devinfo, fw, len);
+       if (err == 0)
+               devinfo->bus_pub.state = BCMFMAC_USB_STATE_DL_DONE;
+       else
+               devinfo->bus_pub.state = BCMFMAC_USB_STATE_DL_PENDING;
+       brcmf_dbg(TRACE, "exit: err=%d\n", err);
+
+       return err;
+}
+
+static int brcmf_usb_dlrun(struct brcmf_usbdev_info *devinfo)
+{
+       struct rdl_state_le state;
+
+       brcmf_dbg(TRACE, "enter\n");
+       if (!devinfo)
+               return -EINVAL;
+
+       if (devinfo->bus_pub.attrib.devid == 0xDEAD)
+               return -EINVAL;
+
+       /* Check we are runnable */
+       brcmf_usb_dl_cmd(devinfo, DL_GETSTATE, &state,
+               sizeof(struct rdl_state_le));
+
+       /* Start the image */
+       if (state.state == cpu_to_le32(DL_RUNNABLE)) {
+               if (!brcmf_usb_dl_cmd(devinfo, DL_GO, &state,
+                       sizeof(struct rdl_state_le)))
+                       return -ENODEV;
+               if (brcmf_usb_resetcfg(devinfo))
+                       return -ENODEV;
+               /* The Dongle may go for re-enumeration. */
+       } else {
+               brcmf_dbg(ERROR, "Dongle not runnable\n");
+               return -EINVAL;
+       }
+       brcmf_dbg(TRACE, "exit\n");
+       return 0;
+}
+
+static bool brcmf_usb_chip_support(int chipid, int chiprev)
+{
+       switch(chipid) {
+       case 43235:
+       case 43236:
+       case 43238:
+               return (chiprev == 3);
+       default:
+               break;
+       }
+       return false;
+}
+
+static int
+brcmf_usb_fw_download(struct brcmf_usbdev_info *devinfo)
+{
+       struct brcmf_usb_attrib *attr;
+       int err;
+
+       brcmf_dbg(TRACE, "enter\n");
+       if (devinfo == NULL)
+               return -ENODEV;
+
+       attr = &devinfo->bus_pub.attrib;
+
+       if (!brcmf_usb_chip_support(attr->devid, attr->chiprev)) {
+               brcmf_dbg(ERROR, "unsupported chip %d rev %d\n",
+                         attr->devid, attr->chiprev);
+               return -EINVAL;
+       }
+
+       if (!devinfo->image) {
+               brcmf_dbg(ERROR, "No firmware!\n");
+               return -ENOENT;
+       }
+
+       err = brcmf_usb_dlstart(devinfo,
+               devinfo->image, devinfo->image_len);
+       if (err == 0)
+               err = brcmf_usb_dlrun(devinfo);
+       return err;
+}
+
+
+static void brcmf_usb_detach(const struct brcmf_usbdev *bus_pub)
+{
+       struct brcmf_usbdev_info *devinfo =
+               (struct brcmf_usbdev_info *)bus_pub;
+
+       brcmf_dbg(TRACE, "devinfo %p\n", devinfo);
+
+       /* store the image globally */
+       g_image.data = devinfo->image;
+       g_image.len = devinfo->image_len;
+
+       /* free the URBS */
+       brcmf_usb_free_q(&devinfo->rx_freeq, false);
+       brcmf_usb_free_q(&devinfo->tx_freeq, false);
+
+       usb_free_urb(devinfo->intr_urb);
+       usb_free_urb(devinfo->ctl_urb);
+       usb_free_urb(devinfo->bulk_urb);
+
+       kfree(devinfo->tx_reqs);
+       kfree(devinfo->rx_reqs);
+       kfree(devinfo);
+}
+
+#define TRX_MAGIC       0x30524448      /* "HDR0" */
+#define TRX_VERSION     1               /* Version 1 */
+#define TRX_MAX_LEN     0x3B0000        /* Max length */
+#define TRX_NO_HEADER   1               /* Do not write TRX header */
+#define TRX_MAX_OFFSET  3               /* Max number of individual files */
+#define TRX_UNCOMP_IMAGE        0x20    /* Trx contains uncompressed image */
+
+struct trx_header_le {
+       __le32 magic;           /* "HDR0" */
+       __le32 len;             /* Length of file including header */
+       __le32 crc32;           /* CRC from flag_version to end of file */
+       __le32 flag_version;    /* 0:15 flags, 16:31 version */
+       __le32 offsets[TRX_MAX_OFFSET]; /* Offsets of partitions from start of
+                                        * header */
+};
+
+static int check_file(const u8 *headers)
+{
+       struct trx_header_le *trx;
+       int actual_len = -1;
+
+       /* Extract trx header */
+       trx = (struct trx_header_le *) headers;
+       if (trx->magic != cpu_to_le32(TRX_MAGIC))
+               return -1;
+
+       headers += sizeof(struct trx_header_le);
+
+       if (le32_to_cpu(trx->flag_version) & TRX_UNCOMP_IMAGE) {
+               actual_len = le32_to_cpu(trx->offsets[TRX_OFFSETS_DLFWLEN_IDX]);
+               return actual_len + sizeof(struct trx_header_le);
+       }
+       return -1;
+}
+
+static int brcmf_usb_get_fw(struct brcmf_usbdev_info *devinfo)
+{
+       s8 *fwname;
+       const struct firmware *fw;
+       int err;
+
+       devinfo->image = g_image.data;
+       devinfo->image_len = g_image.len;
+
+       /*
+        * if we have an image we can leave here.
+        */
+       if (devinfo->image)
+               return 0;
+
+       fwname = BRCMF_USB_43236_FW_NAME;
+
+       err = request_firmware(&fw, fwname, devinfo->dev);
+       if (!fw) {
+               brcmf_dbg(ERROR, "fail to request firmware %s\n", fwname);
+               return err;
+       }
+       if (check_file(fw->data) < 0) {
+               brcmf_dbg(ERROR, "invalid firmware %s\n", fwname);
+               return -EINVAL;
+       }
+
+       devinfo->image = kmalloc(fw->size, GFP_ATOMIC); /* plus nvram */
+       if (!devinfo->image)
+               return -ENOMEM;
+
+       memcpy(devinfo->image, fw->data, fw->size);
+       devinfo->image_len = fw->size;
+
+       release_firmware(fw);
+       return 0;
+}
+
+
+static
+struct brcmf_usbdev *brcmf_usb_attach(int nrxq, int ntxq, struct device *dev)
+{
+       struct brcmf_usbdev_info *devinfo;
+
+       devinfo = kzalloc(sizeof(struct brcmf_usbdev_info), GFP_ATOMIC);
+       if (devinfo == NULL)
+               return NULL;
+
+       devinfo->bus_pub.nrxq = nrxq;
+       devinfo->rx_low_watermark = nrxq / 2;
+       devinfo->bus_pub.devinfo = devinfo;
+       devinfo->bus_pub.ntxq = ntxq;
+
+       /* flow control when too many tx urbs posted */
+       devinfo->tx_low_watermark = ntxq / 4;
+       devinfo->tx_high_watermark = devinfo->tx_low_watermark * 3;
+       devinfo->dev = dev;
+       devinfo->usbdev = usbdev_probe_info.usb;
+       devinfo->tx_pipe = usbdev_probe_info.tx_pipe;
+       devinfo->rx_pipe = usbdev_probe_info.rx_pipe;
+       devinfo->rx_pipe2 = usbdev_probe_info.rx_pipe2;
+       devinfo->intr_pipe = usbdev_probe_info.intr_pipe;
+
+       devinfo->interval = usbdev_probe_info.interval;
+       devinfo->intr_size = usbdev_probe_info.intr_size;
+
+       memcpy(&devinfo->probe_info, &usbdev_probe_info,
+               sizeof(struct brcmf_usb_probe_info));
+       devinfo->bus_pub.bus_mtu = BRCMF_USB_MAX_PKT_SIZE;
+
+       /* Initialize other structure content */
+       init_waitqueue_head(&devinfo->ioctl_resp_wait);
+
+       /* Initialize the spinlocks */
+       spin_lock_init(&devinfo->qlock);
+
+       INIT_LIST_HEAD(&devinfo->rx_freeq);
+       INIT_LIST_HEAD(&devinfo->rx_postq);
+
+       INIT_LIST_HEAD(&devinfo->tx_freeq);
+       INIT_LIST_HEAD(&devinfo->tx_postq);
+
+       devinfo->rx_reqs = brcmf_usbdev_qinit(&devinfo->rx_freeq, nrxq);
+       if (!devinfo->rx_reqs)
+               goto error;
+
+       devinfo->tx_reqs = brcmf_usbdev_qinit(&devinfo->tx_freeq, ntxq);
+       if (!devinfo->tx_reqs)
+               goto error;
+
+       devinfo->intr_urb = usb_alloc_urb(0, GFP_ATOMIC);
+       if (!devinfo->intr_urb) {
+               brcmf_dbg(ERROR, "usb_alloc_urb (intr) failed\n");
+               goto error;
+       }
+       devinfo->ctl_urb = usb_alloc_urb(0, GFP_ATOMIC);
+       if (!devinfo->ctl_urb) {
+               brcmf_dbg(ERROR, "usb_alloc_urb (ctl) failed\n");
+               goto error;
+       }
+       devinfo->rxctl_deferrespok = 0;
+
+       devinfo->bulk_urb = usb_alloc_urb(0, GFP_ATOMIC);
+       if (!devinfo->bulk_urb) {
+               brcmf_dbg(ERROR, "usb_alloc_urb (bulk) failed\n");
+               goto error;
+       }
+
+       init_waitqueue_head(&devinfo->wait);
+       if (!brcmf_usb_dlneeded(devinfo))
+               return &devinfo->bus_pub;
+
+       brcmf_dbg(TRACE, "start fw downloading\n");
+       if (brcmf_usb_get_fw(devinfo))
+               goto error;
+
+       if (brcmf_usb_fw_download(devinfo))
+               goto error;
+
+       return &devinfo->bus_pub;
+
+error:
+       brcmf_dbg(ERROR, "failed!\n");
+       brcmf_usb_detach(&devinfo->bus_pub);
+       return NULL;
+}
+
+static int brcmf_usb_probe_cb(struct device *dev, const char *desc,
+                               u32 bustype, u32 hdrlen)
+{
+       struct brcmf_bus *bus = NULL;
+       struct brcmf_usbdev *bus_pub = NULL;
+       int ret;
+
+
+       bus_pub = brcmf_usb_attach(BRCMF_USB_NRXQ, BRCMF_USB_NTXQ, dev);
+       if (!bus_pub) {
+               ret = -ENODEV;
+               goto fail;
+       }
+
+       bus = kzalloc(sizeof(struct brcmf_bus), GFP_ATOMIC);
+       if (!bus) {
+               ret = -ENOMEM;
+               goto fail;
+       }
+
+       bus_pub->bus = bus;
+       bus->brcmf_bus_txdata = brcmf_usb_tx;
+       bus->brcmf_bus_init = brcmf_usb_up;
+       bus->brcmf_bus_stop = brcmf_usb_down;
+       bus->brcmf_bus_txctl = brcmf_usb_tx_ctlpkt;
+       bus->brcmf_bus_rxctl = brcmf_usb_rx_ctlpkt;
+       bus->type = bustype;
+       bus->bus_priv.usb = bus_pub;
+       dev_set_drvdata(dev, bus);
+
+       /* Attach to the common driver interface */
+       ret = brcmf_attach(hdrlen, dev);
+       if (ret) {
+               brcmf_dbg(ERROR, "dhd_attach failed\n");
+               goto fail;
+       }
+
+       ret = brcmf_bus_start(dev);
+       if (ret == -ENOLINK) {
+               brcmf_dbg(ERROR, "dongle is not responding\n");
+               brcmf_detach(dev);
+               goto fail;
+       }
+
+       /* add interface and open for business */
+       ret = brcmf_add_if(dev, 0, "wlan%d", NULL);
+       if (ret) {
+               brcmf_dbg(ERROR, "Add primary net device interface failed!!\n");
+               brcmf_detach(dev);
+               goto fail;
+       }
+
+       return 0;
+fail:
+       /* Release resources in reverse order */
+       if (bus_pub)
+               brcmf_usb_detach(bus_pub);
+       kfree(bus);
+       return ret;
+}
+
+static void
+brcmf_usb_disconnect_cb(struct brcmf_usbdev *bus_pub)
+{
+       if (!bus_pub)
+               return;
+       brcmf_dbg(TRACE, "enter: bus_pub %p\n", bus_pub);
+
+       brcmf_detach(bus_pub->devinfo->dev);
+       kfree(bus_pub->bus);
+       brcmf_usb_detach(bus_pub);
+
+}
+
+static int
+brcmf_usb_probe(struct usb_interface *intf, const struct usb_device_id *id)
+{
+       int ep;
+       struct usb_endpoint_descriptor *endpoint;
+       int ret = 0;
+       struct usb_device *usb = interface_to_usbdev(intf);
+       int num_of_eps;
+       u8 endpoint_num;
+
+       brcmf_dbg(TRACE, "enter\n");
+
+       usbdev_probe_info.usb = usb;
+       usbdev_probe_info.intf = intf;
+
+       if (id != NULL) {
+               usbdev_probe_info.vid = id->idVendor;
+               usbdev_probe_info.pid = id->idProduct;
+       }
+
+       usb_set_intfdata(intf, &usbdev_probe_info);
+
+       /* Check that the device supports only one configuration */
+       if (usb->descriptor.bNumConfigurations != 1) {
+               ret = -1;
+               goto fail;
+       }
+
+       if (usb->descriptor.bDeviceClass != USB_CLASS_VENDOR_SPEC) {
+               ret = -1;
+               goto fail;
+       }
+
+       /*
+        * Only the BDC interface configuration is supported:
+        *      Device class: USB_CLASS_VENDOR_SPEC
+        *      if0 class: USB_CLASS_VENDOR_SPEC
+        *      if0/ep0: control
+        *      if0/ep1: bulk in
+        *      if0/ep2: bulk out (ok if swapped with bulk in)
+        */
+       if (CONFIGDESC(usb)->bNumInterfaces != 1) {
+               ret = -1;
+               goto fail;
+       }
+
+       /* Check interface */
+       if (IFDESC(usb, CONTROL_IF).bInterfaceClass != USB_CLASS_VENDOR_SPEC ||
+           IFDESC(usb, CONTROL_IF).bInterfaceSubClass != 2 ||
+           IFDESC(usb, CONTROL_IF).bInterfaceProtocol != 0xff) {
+               brcmf_dbg(ERROR, "invalid control interface: class %d, subclass %d, proto %d\n",
+                         IFDESC(usb, CONTROL_IF).bInterfaceClass,
+                         IFDESC(usb, CONTROL_IF).bInterfaceSubClass,
+                         IFDESC(usb, CONTROL_IF).bInterfaceProtocol);
+               ret = -1;
+               goto fail;
+       }
+
+       /* Check control endpoint */
+       endpoint = &IFEPDESC(usb, CONTROL_IF, 0);
+       if ((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK)
+               != USB_ENDPOINT_XFER_INT) {
+               brcmf_dbg(ERROR, "invalid control endpoint %d\n",
+                         endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK);
+               ret = -1;
+               goto fail;
+       }
+
+       endpoint_num = endpoint->bEndpointAddress & USB_ENDPOINT_NUMBER_MASK;
+       usbdev_probe_info.intr_pipe = usb_rcvintpipe(usb, endpoint_num);
+
+       usbdev_probe_info.rx_pipe = 0;
+       usbdev_probe_info.rx_pipe2 = 0;
+       usbdev_probe_info.tx_pipe = 0;
+       num_of_eps = IFDESC(usb, BULK_IF).bNumEndpoints - 1;
+
+       /* Check data endpoints and get pipes */
+       for (ep = 1; ep <= num_of_eps; ep++) {
+               endpoint = &IFEPDESC(usb, BULK_IF, ep);
+               if ((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) !=
+                   USB_ENDPOINT_XFER_BULK) {
+                       brcmf_dbg(ERROR, "invalid data endpoint %d\n", ep);
+                       ret = -1;
+                       goto fail;
+               }
+
+               endpoint_num = endpoint->bEndpointAddress &
+                              USB_ENDPOINT_NUMBER_MASK;
+               if ((endpoint->bEndpointAddress & USB_ENDPOINT_DIR_MASK)
+                       == USB_DIR_IN) {
+                       if (!usbdev_probe_info.rx_pipe) {
+                               usbdev_probe_info.rx_pipe =
+                                       usb_rcvbulkpipe(usb, endpoint_num);
+                       } else {
+                               usbdev_probe_info.rx_pipe2 =
+                                       usb_rcvbulkpipe(usb, endpoint_num);
+                       }
+               } else {
+                       usbdev_probe_info.tx_pipe =
+                                       usb_sndbulkpipe(usb, endpoint_num);
+               }
+       }
+
+       /* Allocate interrupt URB and data buffer */
+       /* RNDIS says 8-byte intr, our old drivers used 4-byte */
+       if (IFEPDESC(usb, CONTROL_IF, 0).wMaxPacketSize == cpu_to_le16(16))
+               usbdev_probe_info.intr_size = 8;
+       else
+               usbdev_probe_info.intr_size = 4;
+
+       usbdev_probe_info.interval = IFEPDESC(usb, CONTROL_IF, 0).bInterval;
+
+       usbdev_probe_info.device_speed = usb->speed;
+       if (usb->speed == USB_SPEED_HIGH)
+               brcmf_dbg(INFO, "Broadcom high speed USB wireless device detected\n");
+       else
+               brcmf_dbg(INFO, "Broadcom full speed USB wireless device detected\n");
+
+       ret = brcmf_usb_probe_cb(&usb->dev, "", USB_BUS, 0);
+       if (ret)
+               goto fail;
+
+       /* Success */
+       return 0;
+
+fail:
+       brcmf_dbg(ERROR, "failed with errno %d\n", ret);
+       usb_set_intfdata(intf, NULL);
+       return ret;
+
+}
+
+static void
+brcmf_usb_disconnect(struct usb_interface *intf)
+{
+       struct usb_device *usb = interface_to_usbdev(intf);
+
+       brcmf_dbg(TRACE, "enter\n");
+       brcmf_usb_disconnect_cb(brcmf_usb_get_buspub(&usb->dev));
+       usb_set_intfdata(intf, NULL);
+}
+
+/*
+ *     only need to signal the bus being down and update the suspend state.
+ */
+static int brcmf_usb_suspend(struct usb_interface *intf, pm_message_t state)
+{
+       struct usb_device *usb = interface_to_usbdev(intf);
+       struct brcmf_usbdev_info *devinfo = brcmf_usb_get_businfo(&usb->dev);
+
+       brcmf_dbg(TRACE, "enter\n");
+       devinfo->bus_pub.state = BCMFMAC_USB_STATE_DOWN;
+       devinfo->suspend_state = USBOS_SUSPEND_STATE_SUSPENDED;
+       return 0;
+}
+
+/*
+ *     mark suspend state active and crank up the bus.
+ */
+static int brcmf_usb_resume(struct usb_interface *intf)
+{
+       struct usb_device *usb = interface_to_usbdev(intf);
+       struct brcmf_usbdev_info *devinfo = brcmf_usb_get_businfo(&usb->dev);
+
+       brcmf_dbg(TRACE, "enter\n");
+       devinfo->suspend_state = USBOS_SUSPEND_STATE_DEVICE_ACTIVE;
+       brcmf_bus_start(&usb->dev);
+       return 0;
+}
+
+#define BRCMF_USB_VENDOR_ID_BROADCOM   0x0a5c
+#define BRCMF_USB_DEVICE_ID_43236      0xbd17
+#define BRCMF_USB_DEVICE_ID_BCMFW      0x0bdc
+
+static struct usb_device_id brcmf_usb_devid_table[] = {
+       { USB_DEVICE(BRCMF_USB_VENDOR_ID_BROADCOM, BRCMF_USB_DEVICE_ID_43236) },
+       /* special entry for device with firmware loaded and running */
+       { USB_DEVICE(BRCMF_USB_VENDOR_ID_BROADCOM, BRCMF_USB_DEVICE_ID_BCMFW) },
+       { }
+};
+MODULE_DEVICE_TABLE(usb, brcmf_usb_devid_table);
+MODULE_FIRMWARE(BRCMF_USB_43236_FW_NAME);
+
+/* TODO: suspend and resume entries */
+static struct usb_driver brcmf_usbdrvr = {
+       .name = KBUILD_MODNAME,
+       .probe = brcmf_usb_probe,
+       .disconnect = brcmf_usb_disconnect,
+       .id_table = brcmf_usb_devid_table,
+       .suspend = brcmf_usb_suspend,
+       .resume = brcmf_usb_resume,
+       .supports_autosuspend = 1
+};
+
+void brcmf_usb_exit(void)
+{
+       usb_deregister(&brcmf_usbdrvr);
+       kfree(g_image.data);
+       g_image.data = NULL;
+       g_image.len = 0;
+}
+
+int brcmf_usb_init(void)
+{
+       return usb_register(&brcmf_usbdrvr);
+}
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/usb.h b/drivers/net/wireless/brcm80211/brcmfmac/usb.h
new file mode 100644 (file)
index 0000000..b31da7b
--- /dev/null
@@ -0,0 +1,84 @@
+/*
+ * Copyright (c) 2011 Broadcom Corporation
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+ * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
+ * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+#ifndef BRCMFMAC_USB_H
+#define BRCMFMAC_USB_H
+
+enum brcmf_usb_state {
+       BCMFMAC_USB_STATE_DL_PENDING,
+       BCMFMAC_USB_STATE_DL_DONE,
+       BCMFMAC_USB_STATE_UP,
+       BCMFMAC_USB_STATE_DOWN,
+       BCMFMAC_USB_STATE_PNP_FWDL,
+       BCMFMAC_USB_STATE_DISCONNECT,
+       BCMFMAC_USB_STATE_SLEEP
+};
+
+enum brcmf_usb_pnp_state {
+       BCMFMAC_USB_PNP_DISCONNECT,
+       BCMFMAC_USB_PNP_SLEEP,
+       BCMFMAC_USB_PNP_RESUME,
+};
+
+struct brcmf_stats {
+       u32 tx_errors;
+       u32 tx_packets;
+       u32 tx_multicast;
+       u32 tx_ctlpkts;
+       u32 tx_ctlerrs;
+       u32 tx_dropped;
+       u32 tx_flushed;
+       u32 rx_errors;
+       u32 rx_packets;
+       u32 rx_multicast;
+       u32 rx_ctlpkts;
+       u32 rx_ctlerrs;
+       u32 rx_dropped;
+       u32 rx_flushed;
+
+};
+
+struct brcmf_usb_attrib {
+       int bustype;
+       int vid;
+       int pid;
+       int devid;
+       int chiprev; /* chip revsion number */
+       int mtu;
+       int nchan; /* Data Channels */
+       int has_2nd_bulk_in_ep;
+};
+
+struct brcmf_usbdev_info;
+
+struct brcmf_usbdev {
+       struct brcmf_bus *bus;
+       struct brcmf_usbdev_info *devinfo;
+       enum brcmf_usb_state state;
+       struct brcmf_stats stats;
+       int ntxq, nrxq, rxsize;
+       u32 bus_mtu;
+       struct brcmf_usb_attrib attrib;
+};
+
+/* IO Request Block (IRB) */
+struct brcmf_usbreq {
+       struct list_head list;
+       struct brcmf_usbdev_info *devinfo;
+       struct urb *urb;
+       struct sk_buff  *skb;
+};
+
+#endif /* BRCMFMAC_USB_H */
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/usb_rdl.h b/drivers/net/wireless/brcm80211/brcmfmac/usb_rdl.h
new file mode 100644 (file)
index 0000000..0a35c51
--- /dev/null
@@ -0,0 +1,75 @@
+/*
+ * Copyright (c) 2011 Broadcom Corporation
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+ * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
+ * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#ifndef _USB_RDL_H
+#define _USB_RDL_H
+
+/* Control messages: bRequest values */
+#define DL_GETSTATE    0       /* returns the rdl_state_t struct */
+#define DL_CHECK_CRC   1       /* currently unused */
+#define DL_GO          2       /* execute downloaded image */
+#define DL_START       3       /* initialize dl state */
+#define DL_REBOOT      4       /* reboot the device in 2 seconds */
+#define DL_GETVER      5       /* returns the bootrom_id_t struct */
+#define DL_GO_PROTECTED        6       /* execute the downloaded code and set reset
+                                * event to occur in 2 seconds.  It is the
+                                * responsibility of the downloaded code to
+                                * clear this event
+                                */
+#define DL_EXEC                7       /* jump to a supplied address */
+#define DL_RESETCFG    8       /* To support single enum on dongle
+                                * - Not used by bootloader
+                                */
+#define DL_DEFER_RESP_OK 9     /* Potentially defer the response to setup
+                                * if resp unavailable
+                                */
+
+/* states */
+#define DL_WAITING     0       /* waiting to rx first pkt */
+#define DL_READY       1       /* hdr was good, waiting for more of the
+                                * compressed image */
+#define DL_BAD_HDR     2       /* hdr was corrupted */
+#define DL_BAD_CRC     3       /* compressed image was corrupted */
+#define DL_RUNNABLE    4       /* download was successful,waiting for go cmd */
+#define DL_START_FAIL  5       /* failed to initialize correctly */
+#define DL_NVRAM_TOOBIG        6       /* host specified nvram data exceeds DL_NVRAM
+                                * value */
+#define DL_IMAGE_TOOBIG        7       /* download image too big (exceeds DATA_START
+                                *  for rdl) */
+
+struct rdl_state_le {
+       __le32 state;
+       __le32 bytes;
+};
+
+struct bootrom_id_le {
+       __le32 chip;    /* Chip id */
+       __le32 chiprev; /* Chip rev */
+       __le32 ramsize; /* Size of  RAM */
+       __le32 remapbase;       /* Current remap base address */
+       __le32 boardtype;       /* Type of board */
+       __le32 boardrev;        /* Board revision */
+};
+
+#define RDL_CHUNK      1500  /* size of each dl transfer */
+
+#define TRX_OFFSETS_DLFWLEN_IDX        0
+#define TRX_OFFSETS_JUMPTO_IDX 1
+#define TRX_OFFSETS_NVM_LEN_IDX        2
+
+#define TRX_OFFSETS_DLBASE_IDX  0
+
+#endif  /* _USB_RDL_H */
index bf11850..15d7f00 100644 (file)
@@ -16,6 +16,8 @@
 
 /* Toplevel file. Relies on dhd_linux.c to send commands to the dongle. */
 
+#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
+
 #include <linux/kernel.h>
 #include <linux/if_arp.h>
 #include <linux/sched.h>
@@ -1374,7 +1376,7 @@ brcmf_cfg80211_connect(struct wiphy *wiphy, struct net_device *ndev,
        memset(&join_params, 0, sizeof(join_params));
        join_params_size = sizeof(join_params.ssid_le);
 
-       ssid.SSID_len = min_t(u32, sizeof(ssid.SSID), sme->ssid_len);
+       ssid.SSID_len = min_t(u32, sizeof(ssid.SSID), (u32)sme->ssid_len);
        memcpy(&join_params.ssid_le.SSID, sme->ssid, ssid.SSID_len);
        memcpy(&ssid.SSID, sme->ssid, ssid.SSID_len);
        join_params.ssid_le.SSID_len = cpu_to_le32(ssid.SSID_len);
@@ -2783,7 +2785,7 @@ static struct wireless_dev *brcmf_alloc_wdev(s32 sizeof_iface,
            wiphy_new(&wl_cfg80211_ops,
                      sizeof(struct brcmf_cfg80211_priv) + sizeof_iface);
        if (!wdev->wiphy) {
-               WL_ERR("Couldn not allocate wiphy device\n");
+               WL_ERR("Could not allocate wiphy device\n");
                err = -ENOMEM;
                goto wiphy_new_out;
        }
@@ -2809,7 +2811,7 @@ static struct wireless_dev *brcmf_alloc_wdev(s32 sizeof_iface,
                                                                 */
        err = wiphy_register(wdev->wiphy);
        if (err < 0) {
-               WL_ERR("Couldn not register wiphy device (%d)\n", err);
+               WL_ERR("Could not register wiphy device (%d)\n", err);
                goto wiphy_register_out;
        }
        return wdev;
@@ -3295,7 +3297,9 @@ static struct brcmf_cfg80211_event_q *brcmf_deq_event(
 }
 
 /*
-** push event to tail of the queue
+*      push event to tail of the queue
+*
+*      remark: this function may not sleep as it is called in atomic context.
 */
 
 static s32
@@ -3304,17 +3308,18 @@ brcmf_enq_event(struct brcmf_cfg80211_priv *cfg_priv, u32 event,
 {
        struct brcmf_cfg80211_event_q *e;
        s32 err = 0;
+       ulong flags;
 
-       e = kzalloc(sizeof(struct brcmf_cfg80211_event_q), GFP_KERNEL);
+       e = kzalloc(sizeof(struct brcmf_cfg80211_event_q), GFP_ATOMIC);
        if (!e)
                return -ENOMEM;
 
        e->etype = event;
        memcpy(&e->emsg, msg, sizeof(struct brcmf_event_msg));
 
-       spin_lock_irq(&cfg_priv->evt_q_lock);
+       spin_lock_irqsave(&cfg_priv->evt_q_lock, flags);
        list_add_tail(&e->evt_q_list, &cfg_priv->evt_q_list);
-       spin_unlock_irq(&cfg_priv->evt_q_lock);
+       spin_unlock_irqrestore(&cfg_priv->evt_q_lock, flags);
 
        return err;
 }
index a613b49..b5d9b36 100644 (file)
@@ -32,63 +32,63 @@ struct brcmf_cfg80211_ibss;
 #define WL_DBG_MASK            ((WL_DBG_INFO | WL_DBG_ERR | WL_DBG_TRACE) | \
                                (WL_DBG_SCAN) | (WL_DBG_CONN))
 
-#define        WL_ERR(fmt, args...)                                    \
+#define        WL_ERR(fmt, ...)                                        \
 do {                                                           \
        if (brcmf_dbg_level & WL_DBG_ERR) {                     \
                if (net_ratelimit()) {                          \
-                       printk(KERN_ERR "ERROR @%s : " fmt,     \
-                               __func__, ##args);              \
+                       pr_err("ERROR @%s : " fmt,              \
+                              __func__, ##__VA_ARGS__);        \
                }                                               \
        }                                                       \
 } while (0)
 
-#if (defined BCMDBG)
-#define        WL_INFO(fmt, args...)                                   \
+#if (defined DEBUG)
+#define        WL_INFO(fmt, ...)                                       \
 do {                                                           \
        if (brcmf_dbg_level & WL_DBG_INFO) {                    \
                if (net_ratelimit()) {                          \
-                       printk(KERN_ERR "INFO @%s : " fmt,      \
-                               __func__, ##args);              \
+                       pr_err("INFO @%s : " fmt,               \
+                              __func__, ##__VA_ARGS__);        \
                }                                               \
        }                                                       \
 } while (0)
 
-#define        WL_TRACE(fmt, args...)                                  \
+#define        WL_TRACE(fmt, ...)                                      \
 do {                                                           \
        if (brcmf_dbg_level & WL_DBG_TRACE) {                   \
                if (net_ratelimit()) {                          \
-                       printk(KERN_ERR "TRACE @%s : " fmt,     \
-                               __func__, ##args);              \
+                       pr_err("TRACE @%s : " fmt,              \
+                              __func__, ##__VA_ARGS__);        \
                }                                               \
        }                                                       \
 } while (0)
 
-#define        WL_SCAN(fmt, args...)                                   \
+#define        WL_SCAN(fmt, ...)                                       \
 do {                                                           \
        if (brcmf_dbg_level & WL_DBG_SCAN) {                    \
                if (net_ratelimit()) {                          \
-                       printk(KERN_ERR "SCAN @%s : " fmt,      \
-                               __func__, ##args);              \
+                       pr_err("SCAN @%s : " fmt,               \
+                              __func__, ##__VA_ARGS__);        \
                }                                               \
        }                                                       \
 } while (0)
 
-#define        WL_CONN(fmt, args...)                                   \
+#define        WL_CONN(fmt, ...)                                       \
 do {                                                           \
        if (brcmf_dbg_level & WL_DBG_CONN) {                    \
                if (net_ratelimit()) {                          \
-                       printk(KERN_ERR "CONN @%s : " fmt,      \
-                               __func__, ##args);              \
+                       pr_err("CONN @%s : " fmt,               \
+                              __func__, ##__VA_ARGS__);        \
                }                                               \
        }                                                       \
 } while (0)
 
-#else /* (defined BCMDBG) */
+#else /* (defined DEBUG) */
 #define        WL_INFO(fmt, args...)
 #define        WL_TRACE(fmt, args...)
 #define        WL_SCAN(fmt, args...)
 #define        WL_CONN(fmt, args...)
-#endif /* (defined BCMDBG) */
+#endif /* (defined DEBUG) */
 
 #define WL_NUM_SCAN_MAX                1
 #define WL_NUM_PMKIDS_MAX      MAXPMKID        /* will be used
index ab9bb11..c93ea35 100644 (file)
 
 #define PCI_FORCEHT(sih) (PCIE(sih) && (ai_get_chip_id(sih) == BCM4716_CHIP_ID))
 
-#ifdef BCMDBG
+#ifdef DEBUG
 #define        SI_MSG(fmt, ...)        pr_debug(fmt, ##__VA_ARGS__)
 #else
 #define        SI_MSG(fmt, ...)        no_printk(fmt, ##__VA_ARGS__)
-#endif                         /* BCMDBG */
+#endif                         /* DEBUG */
 
 #define        GOODCOREADDR(x, b) \
        (((x) >= (b)) && ((x) < ((b) + SI_MAXCORES * SI_CORE_SIZE)) && \
index 30b5887..dbee696 100644 (file)
@@ -915,7 +915,7 @@ brcms_c_ampdu_dotxstatus_complete(struct ampdu_info *ampdu, struct scb *scb,
        struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(p);
        struct wiphy *wiphy = wlc->wiphy;
 
-#ifdef BCMDBG
+#ifdef DEBUG
        u8 hole[AMPDU_MAX_MPDU];
        memset(hole, 0, sizeof(hole));
 #endif
index 2e90a9a..11054ae 100644 (file)
 #define BCMEXTRAHDROOM 172
 
 /* debug/trace */
-#ifdef BCMDBG
+#ifdef DEBUG
 #define        DMA_ERROR(fmt, ...)                                     \
 do {                                                           \
        if (*di->msg_level & 1)                                 \
@@ -193,7 +193,7 @@ do {                                                                \
        no_printk(fmt, ##__VA_ARGS__)
 #define        DMA_TRACE(fmt, ...)                     \
        no_printk(fmt, ##__VA_ARGS__)
-#endif                         /* BCMDBG */
+#endif                         /* DEBUG */
 
 #define        DMA_NONE(fmt, ...)                      \
        no_printk(fmt, ##__VA_ARGS__)
@@ -968,7 +968,7 @@ int dma_rx(struct dma_pub *pub, struct sk_buff_head *skb_list)
                        pktcnt++;
                }
 
-#ifdef BCMDBG
+#ifdef DEBUG
                if (resid > 0) {
                        uint cur;
                        cur =
@@ -979,7 +979,7 @@ int dma_rx(struct dma_pub *pub, struct sk_buff_head *skb_list)
                        DMA_ERROR("rxin %d rxout %d, hw_curr %d\n",
                                   di->rxin, di->rxout, cur);
                }
-#endif                         /* BCMDBG */
+#endif                         /* DEBUG */
 
                if ((di->dma.dmactrlflags & DMA_CTRL_RXMULTI) == 0) {
                        DMA_ERROR("%s: bad frame length (%d)\n",
index 448ab9c..fec0f10 100644 (file)
@@ -15,6 +15,7 @@
  */
 
 #define __UNDEF_NO_VERSION__
+#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 
 #include <linux/etherdevice.h>
 #include <linux/sched.h>
@@ -96,10 +97,10 @@ static struct bcma_device_id brcms_coreid_table[] = {
 };
 MODULE_DEVICE_TABLE(bcma, brcms_coreid_table);
 
-#ifdef BCMDBG
+#ifdef DEBUG
 static int msglevel = 0xdeadbeef;
 module_param(msglevel, int, 0);
-#endif                         /* BCMDBG */
+#endif                         /* DEBUG */
 
 static struct ieee80211_channel brcms_2ghz_chantable[] = {
        CHAN2GHZ(1, 2412, IEEE80211_CHAN_NO_HT40MINUS),
@@ -857,7 +858,7 @@ static void brcms_free(struct brcms_info *wl)
        /* free timers */
        for (t = wl->timers; t; t = next) {
                next = t->next;
-#ifdef BCMDBG
+#ifdef DEBUG
                kfree(t->name);
 #endif
                kfree(t);
@@ -1121,8 +1122,7 @@ static int __devinit brcms_bcma_probe(struct bcma_device *pdev)
 
        wl = brcms_attach(pdev);
        if (!wl) {
-               pr_err("%s: %s: brcms_attach failed!\n", KBUILD_MODNAME,
-                      __func__);
+               pr_err("%s: brcms_attach failed!\n", __func__);
                return -ENODEV;
        }
        return 0;
@@ -1136,8 +1136,8 @@ static int brcms_suspend(struct bcma_device *pdev)
        hw = bcma_get_drvdata(pdev);
        wl = hw->priv;
        if (!wl) {
-               wiphy_err(wl->wiphy,
-                         "brcms_suspend: bcma_get_drvdata failed\n");
+               pr_err("%s: %s: no driver private struct!\n", KBUILD_MODNAME,
+                      __func__);
                return -ENODEV;
        }
 
@@ -1177,13 +1177,13 @@ static int __init brcms_module_init(void)
 {
        int error = -ENODEV;
 
-#ifdef BCMDBG
+#ifdef DEBUG
        if (msglevel != 0xdeadbeef)
                brcm_msg_level = msglevel;
-#endif                         /* BCMDBG */
+#endif                         /* DEBUG */
 
        error = bcma_driver_register(&brcms_bcma_driver);
-       printk(KERN_ERR "%s: register returned %d\n", __func__, error);
+       pr_err("%s: register returned %d\n", __func__, error);
        if (!error)
                return 0;
 
@@ -1367,7 +1367,7 @@ struct brcms_timer *brcms_init_timer(struct brcms_info *wl,
        t->next = wl->timers;
        wl->timers = t;
 
-#ifdef BCMDBG
+#ifdef DEBUG
        t->name = kmalloc(strlen(name) + 1, GFP_ATOMIC);
        if (t->name)
                strcpy(t->name, name);
@@ -1386,7 +1386,7 @@ void brcms_add_timer(struct brcms_timer *t, uint ms, int periodic)
 {
        struct ieee80211_hw *hw = t->wl->pub->ieee_hw;
 
-#ifdef BCMDBG
+#ifdef DEBUG
        if (t->set)
                wiphy_err(hw->wiphy, "%s: Already set. Name: %s, per %d\n",
                          __func__, t->name, periodic);
@@ -1431,7 +1431,7 @@ void brcms_free_timer(struct brcms_timer *t)
 
        if (wl->timers == t) {
                wl->timers = wl->timers->next;
-#ifdef BCMDBG
+#ifdef DEBUG
                kfree(t->name);
 #endif
                kfree(t);
@@ -1443,7 +1443,7 @@ void brcms_free_timer(struct brcms_timer *t)
        while (tmp) {
                if (tmp->next == t) {
                        tmp->next = t->next;
-#ifdef BCMDBG
+#ifdef DEBUG
                        kfree(t->name);
 #endif
                        kfree(t);
index 8f60419..9358bd5 100644 (file)
@@ -40,7 +40,7 @@ struct brcms_timer {
        bool periodic;
        bool set;               /* indicates if timer is active */
        struct brcms_timer *next;       /* for freeing on unload */
-#ifdef BCMDBG
+#ifdef DEBUG
        char *name;             /* Description of the timer */
 #endif
 };
index f6affc6..231ddf4 100644 (file)
@@ -14,6 +14,8 @@
  * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  */
 
+#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
+
 #include <linux/pci_ids.h>
 #include <linux/if_ether.h>
 #include <net/mac80211.h>
@@ -293,11 +295,11 @@ const u8 prio2fifo[NUMPRIO] = {
 
 /* debug/trace */
 uint brcm_msg_level =
-#if defined(BCMDBG)
+#if defined(DEBUG)
        LOG_ERROR_VAL;
 #else
        0;
-#endif                         /* BCMDBG */
+#endif                         /* DEBUG */
 
 /* TX FIFO number to WME/802.1E Access Category */
 static const u8 wme_fifo2ac[] = {
@@ -342,14 +344,14 @@ static const u16 xmtfifo_sz[][NFIFO] = {
        {9, 58, 22, 14, 14, 5},
 };
 
-#ifdef BCMDBG
+#ifdef DEBUG
 static const char * const fifo_names[] = {
        "AC_BK", "AC_BE", "AC_VI", "AC_VO", "BCMC", "ATIM" };
 #else
 static const char fifo_names[6][0];
 #endif
 
-#ifdef BCMDBG
+#ifdef DEBUG
 /* pointer to most recently allocated wl/wlc */
 static struct brcms_c_info *wlc_info_dbg = (struct brcms_c_info *) (NULL);
 #endif
@@ -2899,7 +2901,6 @@ brcms_b_read_objmem(struct brcms_hardware *wlc_hw, uint offset, u32 sel)
                objoff += 2;
 
        return bcma_read16(core, objoff);
-;
 }
 
 static void
@@ -3075,30 +3076,30 @@ static void brcms_c_statsupd(struct brcms_c_info *wlc)
 {
        int i;
        struct macstat macstats;
-#ifdef BCMDBG
+#ifdef DEBUG
        u16 delta;
        u16 rxf0ovfl;
        u16 txfunfl[NFIFO];
-#endif                         /* BCMDBG */
+#endif                         /* DEBUG */
 
        /* if driver down, make no sense to update stats */
        if (!wlc->pub->up)
                return;
 
-#ifdef BCMDBG
+#ifdef DEBUG
        /* save last rx fifo 0 overflow count */
        rxf0ovfl = wlc->core->macstat_snapshot->rxf0ovfl;
 
        /* save last tx fifo  underflow count */
        for (i = 0; i < NFIFO; i++)
                txfunfl[i] = wlc->core->macstat_snapshot->txfunfl[i];
-#endif                         /* BCMDBG */
+#endif                         /* DEBUG */
 
        /* Read mac stats from contiguous shared memory */
        brcms_b_copyfrom_objmem(wlc->hw, M_UCODE_MACSTAT, &macstats,
                                sizeof(struct macstat), OBJADDR_SHM_SEL);
 
-#ifdef BCMDBG
+#ifdef DEBUG
        /* check for rx fifo 0 overflow */
        delta = (u16) (wlc->core->macstat_snapshot->rxf0ovfl - rxf0ovfl);
        if (delta)
@@ -3114,7 +3115,7 @@ static void brcms_c_statsupd(struct brcms_c_info *wlc)
                        wiphy_err(wlc->wiphy, "wl%d: %u tx fifo %d underflows!"
                                  "\n", wlc->pub->unit, delta, i);
        }
-#endif                         /* BCMDBG */
+#endif                         /* DEBUG */
 
        /* merge counters from dma module */
        for (i = 0; i < NFIFO; i++) {
@@ -3246,7 +3247,7 @@ static void brcms_b_coreinit(struct brcms_c_info *wlc)
        }
 
        /* For old ucode, txfifo sizes needs to be modified(increased) */
-       if (fifosz_fixup == true)
+       if (fifosz_fixup)
                brcms_b_corerev_fifofixup(wlc_hw);
 
        /* check txfifo allocations match between ucode and driver */
@@ -5425,7 +5426,7 @@ int brcms_c_set_gmode(struct brcms_c_info *wlc, u8 gmode, bool config)
                return -EINVAL;
 
        /* update configuration value */
-       if (config == true)
+       if (config)
                brcms_c_protection_upd(wlc, BRCMS_PROT_G_USER, gmode);
 
        /* Clear rateset override */
@@ -5765,62 +5766,49 @@ int brcms_c_module_unregister(struct brcms_pub *pub, const char *name,
        return -ENODATA;
 }
 
-#ifdef BCMDBG
-static const char * const supr_reason[] = {
-       "None", "PMQ Entry", "Flush request",
-       "Previous frag failure", "Channel mismatch",
-       "Lifetime Expiry", "Underflow"
-};
-
-static void brcms_c_print_txs_status(u16 s)
-{
-       printk(KERN_DEBUG "[15:12]  %d  frame attempts\n",
-              (s & TX_STATUS_FRM_RTX_MASK) >> TX_STATUS_FRM_RTX_SHIFT);
-       printk(KERN_DEBUG " [11:8]  %d  rts attempts\n",
-              (s & TX_STATUS_RTS_RTX_MASK) >> TX_STATUS_RTS_RTX_SHIFT);
-       printk(KERN_DEBUG "    [7]  %d  PM mode indicated\n",
-              ((s & TX_STATUS_PMINDCTD) ? 1 : 0));
-       printk(KERN_DEBUG "    [6]  %d  intermediate status\n",
-              ((s & TX_STATUS_INTERMEDIATE) ? 1 : 0));
-       printk(KERN_DEBUG "    [5]  %d  AMPDU\n",
-              (s & TX_STATUS_AMPDU) ? 1 : 0);
-       printk(KERN_DEBUG "  [4:2]  %d  Frame Suppressed Reason (%s)\n",
-              ((s & TX_STATUS_SUPR_MASK) >> TX_STATUS_SUPR_SHIFT),
-              supr_reason[(s & TX_STATUS_SUPR_MASK) >> TX_STATUS_SUPR_SHIFT]);
-       printk(KERN_DEBUG "    [1]  %d  acked\n",
-              ((s & TX_STATUS_ACK_RCV) ? 1 : 0));
-}
-#endif                         /* BCMDBG */
-
 void brcms_c_print_txstatus(struct tx_status *txs)
 {
-#if defined(BCMDBG)
-       u16 s = txs->status;
-       u16 ackphyrxsh = txs->ackphyrxsh;
-
-       printk(KERN_DEBUG "\ntxpkt (MPDU) Complete\n");
-
-       printk(KERN_DEBUG "FrameID: %04x   ", txs->frameid);
-       printk(KERN_DEBUG "TxStatus: %04x", s);
-       printk(KERN_DEBUG "\n");
-
-       brcms_c_print_txs_status(s);
-
-       printk(KERN_DEBUG "LastTxTime: %04x ", txs->lasttxtime);
-       printk(KERN_DEBUG "Seq: %04x ", txs->sequence);
-       printk(KERN_DEBUG "PHYTxStatus: %04x ", txs->phyerr);
-       printk(KERN_DEBUG "RxAckRSSI: %04x ",
-              (ackphyrxsh & PRXS1_JSSI_MASK) >> PRXS1_JSSI_SHIFT);
-       printk(KERN_DEBUG "RxAckSQ: %04x",
-              (ackphyrxsh & PRXS1_SQ_MASK) >> PRXS1_SQ_SHIFT);
-       printk(KERN_DEBUG "\n");
-#endif                         /* defined(BCMDBG) */
+       pr_debug("\ntxpkt (MPDU) Complete\n");
+
+       pr_debug("FrameID: %04x   TxStatus: %04x\n", txs->frameid, txs->status);
+
+       pr_debug("[15:12]  %d  frame attempts\n",
+                 (txs->status & TX_STATUS_FRM_RTX_MASK) >>
+                TX_STATUS_FRM_RTX_SHIFT);
+       pr_debug(" [11:8]  %d  rts attempts\n",
+                (txs->status & TX_STATUS_RTS_RTX_MASK) >>
+                TX_STATUS_RTS_RTX_SHIFT);
+       pr_debug("    [7]  %d  PM mode indicated\n",
+                txs->status & TX_STATUS_PMINDCTD ? 1 : 0);
+       pr_debug("    [6]  %d  intermediate status\n",
+                txs->status & TX_STATUS_INTERMEDIATE ? 1 : 0);
+       pr_debug("    [5]  %d  AMPDU\n",
+                txs->status & TX_STATUS_AMPDU ? 1 : 0);
+       pr_debug("  [4:2]  %d  Frame Suppressed Reason (%s)\n",
+                (txs->status & TX_STATUS_SUPR_MASK) >> TX_STATUS_SUPR_SHIFT,
+                (const char *[]) {
+                       "None",
+                       "PMQ Entry",
+                       "Flush request",
+                       "Previous frag failure",
+                       "Channel mismatch",
+                       "Lifetime Expiry",
+                       "Underflow"
+                } [(txs->status & TX_STATUS_SUPR_MASK) >>
+                   TX_STATUS_SUPR_SHIFT]);
+       pr_debug("    [1]  %d  acked\n",
+                txs->status & TX_STATUS_ACK_RCV ? 1 : 0);
+
+       pr_debug("LastTxTime: %04x Seq: %04x PHYTxStatus: %04x RxAckRSSI: %04x RxAckSQ: %04x\n",
+                txs->lasttxtime, txs->sequence, txs->phyerr,
+                (txs->ackphyrxsh & PRXS1_JSSI_MASK) >> PRXS1_JSSI_SHIFT,
+                (txs->ackphyrxsh & PRXS1_SQ_MASK) >> PRXS1_SQ_SHIFT);
 }
 
 bool brcms_c_chipmatch(u16 vendor, u16 device)
 {
        if (vendor != PCI_VENDOR_ID_BROADCOM) {
-               pr_err("chipmatch: unknown vendor id %04x\n", vendor);
+               pr_err("unknown vendor id %04x\n", vendor);
                return false;
        }
 
@@ -5833,11 +5821,11 @@ bool brcms_c_chipmatch(u16 vendor, u16 device)
        if ((device == BCM43236_D11N_ID) || (device == BCM43236_D11N2G_ID))
                return true;
 
-       pr_err("chipmatch: unknown device id %04x\n", device);
+       pr_err("unknown device id %04x\n", device);
        return false;
 }
 
-#if defined(BCMDBG)
+#if defined(DEBUG)
 void brcms_c_print_txdesc(struct d11txh *txh)
 {
        u16 mtcl = le16_to_cpu(txh->MacTxControlLow);
@@ -5871,57 +5859,56 @@ void brcms_c_print_txdesc(struct d11txh *txh)
        struct ieee80211_rts rts = txh->rts_frame;
 
        /* add plcp header along with txh descriptor */
-       printk(KERN_DEBUG "Raw TxDesc + plcp header:\n");
-       print_hex_dump_bytes("", DUMP_PREFIX_OFFSET,
-                            txh, sizeof(struct d11txh) + 48);
-
-       printk(KERN_DEBUG "TxCtlLow: %04x ", mtcl);
-       printk(KERN_DEBUG "TxCtlHigh: %04x ", mtch);
-       printk(KERN_DEBUG "FC: %04x ", mfc);
-       printk(KERN_DEBUG "FES Time: %04x\n", tfest);
-       printk(KERN_DEBUG "PhyCtl: %04x%s ", ptcw,
+       brcmu_dbg_hex_dump(txh, sizeof(struct d11txh) + 48,
+                          "Raw TxDesc + plcp header:\n");
+
+       pr_debug("TxCtlLow: %04x ", mtcl);
+       pr_debug("TxCtlHigh: %04x ", mtch);
+       pr_debug("FC: %04x ", mfc);
+       pr_debug("FES Time: %04x\n", tfest);
+       pr_debug("PhyCtl: %04x%s ", ptcw,
               (ptcw & PHY_TXC_SHORT_HDR) ? " short" : "");
-       printk(KERN_DEBUG "PhyCtl_1: %04x ", ptcw_1);
-       printk(KERN_DEBUG "PhyCtl_1_Fbr: %04x\n", ptcw_1_Fbr);
-       printk(KERN_DEBUG "PhyCtl_1_Rts: %04x ", ptcw_1_Rts);
-       printk(KERN_DEBUG "PhyCtl_1_Fbr_Rts: %04x\n", ptcw_1_FbrRts);
-       printk(KERN_DEBUG "MainRates: %04x ", mainrates);
-       printk(KERN_DEBUG "XtraFrameTypes: %04x ", xtraft);
-       printk(KERN_DEBUG "\n");
+       pr_debug("PhyCtl_1: %04x ", ptcw_1);
+       pr_debug("PhyCtl_1_Fbr: %04x\n", ptcw_1_Fbr);
+       pr_debug("PhyCtl_1_Rts: %04x ", ptcw_1_Rts);
+       pr_debug("PhyCtl_1_Fbr_Rts: %04x\n", ptcw_1_FbrRts);
+       pr_debug("MainRates: %04x ", mainrates);
+       pr_debug("XtraFrameTypes: %04x ", xtraft);
+       pr_debug("\n");
 
        print_hex_dump_bytes("SecIV:", DUMP_PREFIX_OFFSET, iv, sizeof(txh->IV));
        print_hex_dump_bytes("RA:", DUMP_PREFIX_OFFSET,
                             ra, sizeof(txh->TxFrameRA));
 
-       printk(KERN_DEBUG "Fb FES Time: %04x ", tfestfb);
+       pr_debug("Fb FES Time: %04x ", tfestfb);
        print_hex_dump_bytes("Fb RTS PLCP:", DUMP_PREFIX_OFFSET,
                             rtspfb, sizeof(txh->RTSPLCPFallback));
-       printk(KERN_DEBUG "RTS DUR: %04x ", rtsdfb);
+       pr_debug("RTS DUR: %04x ", rtsdfb);
        print_hex_dump_bytes("PLCP:", DUMP_PREFIX_OFFSET,
                             fragpfb, sizeof(txh->FragPLCPFallback));
-       printk(KERN_DEBUG "DUR: %04x", fragdfb);
-       printk(KERN_DEBUG "\n");
+       pr_debug("DUR: %04x", fragdfb);
+       pr_debug("\n");
 
-       printk(KERN_DEBUG "MModeLen: %04x ", mmodelen);
-       printk(KERN_DEBUG "MModeFbrLen: %04x\n", mmodefbrlen);
+       pr_debug("MModeLen: %04x ", mmodelen);
+       pr_debug("MModeFbrLen: %04x\n", mmodefbrlen);
 
-       printk(KERN_DEBUG "FrameID:     %04x\n", tfid);
-       printk(KERN_DEBUG "TxStatus:    %04x\n", txs);
+       pr_debug("FrameID:     %04x\n", tfid);
+       pr_debug("TxStatus:    %04x\n", txs);
 
-       printk(KERN_DEBUG "MaxNumMpdu:  %04x\n", mnmpdu);
-       printk(KERN_DEBUG "MaxAggbyte:  %04x\n", mabyte);
-       printk(KERN_DEBUG "MaxAggbyte_fb:  %04x\n", mabyte_f);
-       printk(KERN_DEBUG "MinByte:     %04x\n", mmbyte);
+       pr_debug("MaxNumMpdu:  %04x\n", mnmpdu);
+       pr_debug("MaxAggbyte:  %04x\n", mabyte);
+       pr_debug("MaxAggbyte_fb:  %04x\n", mabyte_f);
+       pr_debug("MinByte:     %04x\n", mmbyte);
 
        print_hex_dump_bytes("RTS PLCP:", DUMP_PREFIX_OFFSET,
                             rtsph, sizeof(txh->RTSPhyHeader));
        print_hex_dump_bytes("RTS Frame:", DUMP_PREFIX_OFFSET,
                             (u8 *)&rts, sizeof(txh->rts_frame));
-       printk(KERN_DEBUG "\n");
+       pr_debug("\n");
 }
-#endif                         /* defined(BCMDBG) */
+#endif                         /* defined(DEBUG) */
 
-#if defined(BCMDBG)
+#if defined(DEBUG)
 static int
 brcms_c_format_flags(const struct brcms_c_bit_desc *bd, u32 flags, char *buf,
                     int len)
@@ -5975,9 +5962,9 @@ brcms_c_format_flags(const struct brcms_c_bit_desc *bd, u32 flags, char *buf,
 
        return (int)(p - buf);
 }
-#endif                         /* defined(BCMDBG) */
+#endif                         /* defined(DEBUG) */
 
-#if defined(BCMDBG)
+#if defined(DEBUG)
 void brcms_c_print_rxh(struct d11rxhdr *rxh)
 {
        u16 len = rxh->RxFrameSize;
@@ -5999,24 +5986,22 @@ void brcms_c_print_rxh(struct d11rxhdr *rxh)
                {0, NULL}
        };
 
-       printk(KERN_DEBUG "Raw RxDesc:\n");
-       print_hex_dump_bytes("", DUMP_PREFIX_OFFSET, rxh,
-                            sizeof(struct d11rxhdr));
+       brcmu_dbg_hex_dump(rxh, sizeof(struct d11rxhdr), "Raw RxDesc:\n");
 
        brcms_c_format_flags(macstat_flags, macstatus1, flagstr, 64);
 
        snprintf(lenbuf, sizeof(lenbuf), "0x%x", len);
 
-       printk(KERN_DEBUG "RxFrameSize:     %6s (%d)%s\n", lenbuf, len,
+       pr_debug("RxFrameSize:     %6s (%d)%s\n", lenbuf, len,
               (rxh->PhyRxStatus_0 & PRXS0_SHORTH) ? " short preamble" : "");
-       printk(KERN_DEBUG "RxPHYStatus:     %04x %04x %04x %04x\n",
+       pr_debug("RxPHYStatus:     %04x %04x %04x %04x\n",
               phystatus_0, phystatus_1, phystatus_2, phystatus_3);
-       printk(KERN_DEBUG "RxMACStatus:     %x %s\n", macstatus1, flagstr);
-       printk(KERN_DEBUG "RXMACaggtype:    %x\n",
+       pr_debug("RxMACStatus:     %x %s\n", macstatus1, flagstr);
+       pr_debug("RXMACaggtype:    %x\n",
               (macstatus2 & RXS_AGGTYPE_MASK));
-       printk(KERN_DEBUG "RxTSFTime:       %04x\n", rxh->RxTSFTime);
+       pr_debug("RxTSFTime:       %04x\n", rxh->RxTSFTime);
 }
-#endif                         /* defined(BCMDBG) */
+#endif                         /* defined(DEBUG) */
 
 u16 brcms_b_rate_shm_offset(struct brcms_hardware *wlc_hw, u8 rate)
 {
@@ -8354,7 +8339,7 @@ brcms_c_attach(struct brcms_info *wl, struct bcma_device *core, uint unit,
        wlc->wiphy = wl->wiphy;
        pub = wlc->pub;
 
-#if defined(BCMDBG)
+#if defined(DEBUG)
        wlc_info_dbg = wlc;
 #endif
 
index adb136e..8debc74 100644 (file)
@@ -648,10 +648,12 @@ extern void brcms_c_print_txstatus(struct tx_status *txs);
 extern int brcms_b_xmtfifo_sz_get(struct brcms_hardware *wlc_hw, uint fifo,
                   uint *blocks);
 
-#if defined(BCMDBG)
+#if defined(DEBUG)
 extern void brcms_c_print_txdesc(struct d11txh *txh);
 #else
-#define brcms_c_print_txdesc(a)
+static inline void brcms_c_print_txdesc(struct d11txh *txh)
+{
+}
 #endif
 
 extern int brcms_c_set_gmode(struct brcms_c_info *wlc, u8 gmode, bool config);
index a16f1ab..3909574 100644 (file)
@@ -14,6 +14,8 @@
  * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  */
 
+#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
+
 #include <linux/kernel.h>
 #include <linux/delay.h>
 #include <linux/cordic.h>
@@ -17822,8 +17824,6 @@ static void wlc_phy_txpwrctrl_pwr_setup_nphy(struct brcms_phy *pi)
        if (pi->sh->sromrev < 4) {
                idle_tssi[0] = pi->nphy_pwrctrl_info[0].idle_tssi_2g;
                idle_tssi[1] = pi->nphy_pwrctrl_info[1].idle_tssi_2g;
-               target_pwr_qtrdbm[0] = 13 * 4;
-               target_pwr_qtrdbm[1] = 13 * 4;
                a1[0] = -424;
                a1[1] = -424;
                b0[0] = 5612;
@@ -17837,10 +17837,6 @@ static void wlc_phy_txpwrctrl_pwr_setup_nphy(struct brcms_phy *pi)
                case WL_CHAN_FREQ_RANGE_2G:
                        idle_tssi[0] = pi->nphy_pwrctrl_info[0].idle_tssi_2g;
                        idle_tssi[1] = pi->nphy_pwrctrl_info[1].idle_tssi_2g;
-                       target_pwr_qtrdbm[0] =
-                               pi->nphy_pwrctrl_info[0].max_pwr_2g;
-                       target_pwr_qtrdbm[1] =
-                               pi->nphy_pwrctrl_info[1].max_pwr_2g;
                        a1[0] = pi->nphy_pwrctrl_info[0].pwrdet_2g_a1;
                        a1[1] = pi->nphy_pwrctrl_info[1].pwrdet_2g_a1;
                        b0[0] = pi->nphy_pwrctrl_info[0].pwrdet_2g_b0;
@@ -17851,10 +17847,6 @@ static void wlc_phy_txpwrctrl_pwr_setup_nphy(struct brcms_phy *pi)
                case WL_CHAN_FREQ_RANGE_5GL:
                        idle_tssi[0] = pi->nphy_pwrctrl_info[0].idle_tssi_5g;
                        idle_tssi[1] = pi->nphy_pwrctrl_info[1].idle_tssi_5g;
-                       target_pwr_qtrdbm[0] =
-                               pi->nphy_pwrctrl_info[0].max_pwr_5gl;
-                       target_pwr_qtrdbm[1] =
-                               pi->nphy_pwrctrl_info[1].max_pwr_5gl;
                        a1[0] = pi->nphy_pwrctrl_info[0].pwrdet_5gl_a1;
                        a1[1] = pi->nphy_pwrctrl_info[1].pwrdet_5gl_a1;
                        b0[0] = pi->nphy_pwrctrl_info[0].pwrdet_5gl_b0;
@@ -17865,10 +17857,6 @@ static void wlc_phy_txpwrctrl_pwr_setup_nphy(struct brcms_phy *pi)
                case WL_CHAN_FREQ_RANGE_5GM:
                        idle_tssi[0] = pi->nphy_pwrctrl_info[0].idle_tssi_5g;
                        idle_tssi[1] = pi->nphy_pwrctrl_info[1].idle_tssi_5g;
-                       target_pwr_qtrdbm[0] =
-                               pi->nphy_pwrctrl_info[0].max_pwr_5gm;
-                       target_pwr_qtrdbm[1] =
-                               pi->nphy_pwrctrl_info[1].max_pwr_5gm;
                        a1[0] = pi->nphy_pwrctrl_info[0].pwrdet_5gm_a1;
                        a1[1] = pi->nphy_pwrctrl_info[1].pwrdet_5gm_a1;
                        b0[0] = pi->nphy_pwrctrl_info[0].pwrdet_5gm_b0;
@@ -17879,10 +17867,6 @@ static void wlc_phy_txpwrctrl_pwr_setup_nphy(struct brcms_phy *pi)
                case WL_CHAN_FREQ_RANGE_5GH:
                        idle_tssi[0] = pi->nphy_pwrctrl_info[0].idle_tssi_5g;
                        idle_tssi[1] = pi->nphy_pwrctrl_info[1].idle_tssi_5g;
-                       target_pwr_qtrdbm[0] =
-                               pi->nphy_pwrctrl_info[0].max_pwr_5gh;
-                       target_pwr_qtrdbm[1] =
-                               pi->nphy_pwrctrl_info[1].max_pwr_5gh;
                        a1[0] = pi->nphy_pwrctrl_info[0].pwrdet_5gh_a1;
                        a1[1] = pi->nphy_pwrctrl_info[1].pwrdet_5gh_a1;
                        b0[0] = pi->nphy_pwrctrl_info[0].pwrdet_5gh_b0;
@@ -17893,8 +17877,6 @@ static void wlc_phy_txpwrctrl_pwr_setup_nphy(struct brcms_phy *pi)
                default:
                        idle_tssi[0] = pi->nphy_pwrctrl_info[0].idle_tssi_2g;
                        idle_tssi[1] = pi->nphy_pwrctrl_info[1].idle_tssi_2g;
-                       target_pwr_qtrdbm[0] = 13 * 4;
-                       target_pwr_qtrdbm[1] = 13 * 4;
                        a1[0] = -424;
                        a1[1] = -424;
                        b0[0] = 5612;
@@ -17905,6 +17887,7 @@ static void wlc_phy_txpwrctrl_pwr_setup_nphy(struct brcms_phy *pi)
                }
        }
 
+       /* use the provided transmit power */
        target_pwr_qtrdbm[0] = (s8) pi->tx_power_max;
        target_pwr_qtrdbm[1] = (s8) pi->tx_power_max;
 
@@ -19987,12 +19970,11 @@ static void wlc_phy_radio_init_2057(struct brcms_phy *pi)
                switch (pi->pubpi.radiorev) {
                case 5:
 
-                       if (pi->pubpi.radiover == 0x0)
+                       if (NREV_IS(pi->pubpi.phy_rev, 8))
                                regs_2057_ptr = regs_2057_rev5;
-                       else if (pi->pubpi.radiover == 0x1)
+                       else if (NREV_IS(pi->pubpi.phy_rev, 9))
                                regs_2057_ptr = regs_2057_rev5v1;
-                       else
-                               break;
+                       break;
 
                case 7:
 
@@ -21462,7 +21444,7 @@ void wlc_phy_antsel_init(struct brcms_phy_pub *ppi, bool lut_init)
        if (NREV_GE(pi->pubpi.phy_rev, 3)) {
                u16 v0 = 0x211, v1 = 0x222, v2 = 0x144, v3 = 0x188;
 
-               if (lut_init == false)
+               if (!lut_init)
                        return;
 
                if (pi->srom_fem2g.antswctrllut == 0) {
@@ -26434,8 +26416,7 @@ cal_try:
        }
 
        if (bcmerror != 0) {
-               printk(KERN_DEBUG "%s: Failed, cnt = %d\n", __func__,
-                      cal_retry);
+               pr_debug("%s: Failed, cnt = %d\n", __func__, cal_retry);
 
                if (cal_retry < CAL_RETRY_CNT) {
                        cal_retry++;
index 5637436..b96f4b9 100644 (file)
@@ -621,7 +621,7 @@ static inline void cpu_to_le16_buf(u16 *buf, uint nwords)
 /*
  * convert binary srom data into linked list of srom variable items.
  */
-static void
+static int
 _initvars_srom_pci(u8 sromrev, u16 *srom, struct list_head *var_list)
 {
        struct brcms_srom_list_head *entry;
@@ -638,6 +638,9 @@ _initvars_srom_pci(u8 sromrev, u16 *srom, struct list_head *var_list)
 
        /* first store the srom revision */
        entry = kzalloc(sizeof(struct brcms_srom_list_head), GFP_KERNEL);
+       if (!entry)
+               return -ENOMEM;
+
        entry->varid = BRCMS_SROM_REV;
        entry->var_type = BRCMS_SROM_UNUMBER;
        entry->uval = sromrev;
@@ -715,6 +718,8 @@ _initvars_srom_pci(u8 sromrev, u16 *srom, struct list_head *var_list)
 
                entry = kzalloc(sizeof(struct brcms_srom_list_head) +
                                extra_space, GFP_KERNEL);
+               if (!entry)
+                       return -ENOMEM;
                entry->varid = id;
                entry->var_type = type;
                if (flags & SRFL_ETHADDR) {
@@ -754,6 +759,8 @@ _initvars_srom_pci(u8 sromrev, u16 *srom, struct list_head *var_list)
                        entry =
                            kzalloc(sizeof(struct brcms_srom_list_head),
                                    GFP_KERNEL);
+                       if (!entry)
+                               return -ENOMEM;
                        entry->varid = srv->varid+p;
                        entry->var_type = BRCMS_SROM_UNUMBER;
                        entry->uval = val;
@@ -761,6 +768,7 @@ _initvars_srom_pci(u8 sromrev, u16 *srom, struct list_head *var_list)
                }
                pb += psz;
        }
+       return 0;
 }
 
 /*
@@ -906,7 +914,9 @@ int srom_var_init(struct si_pub *sih)
                INIT_LIST_HEAD(&sii->var_list);
 
                /* parse SROM into name=value pairs. */
-               _initvars_srom_pci(sromrev, srom, &sii->var_list);
+               err = _initvars_srom_pci(sromrev, srom, &sii->var_list);
+               if (err)
+                       srom_free_vars(sih);
        }
 
 errout:
index b7537f7..b45ab34 100644 (file)
@@ -14,6 +14,8 @@
  * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  */
 
+#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
+
 #include <linux/netdevice.h>
 #include <linux/module.h>
 
@@ -240,17 +242,35 @@ struct sk_buff *brcmu_pktq_mdeq(struct pktq *pq, uint prec_bmp,
 }
 EXPORT_SYMBOL(brcmu_pktq_mdeq);
 
-#if defined(BCMDBG)
+#if defined(DEBUG)
 /* pretty hex print a pkt buffer chain */
 void brcmu_prpkt(const char *msg, struct sk_buff *p0)
 {
        struct sk_buff *p;
 
        if (msg && (msg[0] != '\0'))
-               printk(KERN_DEBUG "%s:\n", msg);
+               pr_debug("%s:\n", msg);
 
        for (p = p0; p; p = p->next)
                print_hex_dump_bytes("", DUMP_PREFIX_OFFSET, p->data, p->len);
 }
 EXPORT_SYMBOL(brcmu_prpkt);
-#endif                         /* defined(BCMDBG) */
+
+void brcmu_dbg_hex_dump(const void *data, size_t size, const char *fmt, ...)
+{
+       struct va_format vaf;
+       va_list args;
+
+       va_start(args, fmt);
+
+       vaf.fmt = fmt;
+       vaf.va = &args;
+
+       pr_debug("%pV", &vaf);
+
+       va_end(args);
+
+       print_hex_dump_bytes("", DUMP_PREFIX_OFFSET, data, size);
+}
+EXPORT_SYMBOL(brcmu_dbg_hex_dump);
+#endif                         /* defined(DEBUG) */
index ad249a0..477b92a 100644 (file)
@@ -176,10 +176,21 @@ struct ipv4_addr;
 
 /* externs */
 /* format/print */
-#ifdef BCMDBG
+#ifdef DEBUG
 extern void brcmu_prpkt(const char *msg, struct sk_buff *p0);
 #else
 #define brcmu_prpkt(a, b)
-#endif                         /* BCMDBG */
+#endif                         /* DEBUG */
+
+#ifdef DEBUG
+extern __printf(3, 4)
+void brcmu_dbg_hex_dump(const void *data, size_t size, const char *fmt, ...);
+#else
+__printf(3, 4)
+static inline
+void brcmu_dbg_hex_dump(const void *data, size_t size, const char *fmt, ...)
+{
+}
+#endif
 
 #endif                         /* _BRCMU_UTILS_H_ */
index a8bddd8..aa15cc4 100644 (file)
@@ -347,11 +347,9 @@ static int hfa384x_cmd(struct net_device *dev, u16 cmd, u16 param0,
                return -EINTR;
 
        entry = kzalloc(sizeof(*entry), GFP_ATOMIC);
-       if (entry == NULL) {
-               printk(KERN_DEBUG "%s: hfa384x_cmd - kmalloc failed\n",
-                      dev->name);
+       if (entry == NULL)
                return -ENOMEM;
-       }
+
        atomic_set(&entry->usecnt, 1);
        entry->type = CMD_SLEEP;
        entry->cmd = cmd;
@@ -515,11 +513,9 @@ static int hfa384x_cmd_callback(struct net_device *dev, u16 cmd, u16 param0,
        }
 
        entry = kzalloc(sizeof(*entry), GFP_ATOMIC);
-       if (entry == NULL) {
-               printk(KERN_DEBUG "%s: hfa384x_cmd_callback - kmalloc "
-                      "failed\n", dev->name);
+       if (entry == NULL)
                return -ENOMEM;
-       }
+
        atomic_set(&entry->usecnt, 1);
        entry->type = CMD_CALLBACK;
        entry->cmd = cmd;
@@ -2978,11 +2974,9 @@ static int prism2_set_tim(struct net_device *dev, int aid, int set)
        local = iface->local;
 
        new_entry = kzalloc(sizeof(*new_entry), GFP_ATOMIC);
-       if (new_entry == NULL) {
-               printk(KERN_DEBUG "%s: prism2_set_tim: kmalloc failed\n",
-                      local->dev->name);
+       if (new_entry == NULL)
                return -ENOMEM;
-       }
+
        new_entry->aid = aid;
        new_entry->set = set;
 
index a0e5c21..5fd56ad 100644 (file)
@@ -309,13 +309,6 @@ static const long ipw2100_frequencies[] = {
 
 #define FREQ_COUNT     ARRAY_SIZE(ipw2100_frequencies)
 
-static const long ipw2100_rates_11b[] = {
-       1000000,
-       2000000,
-       5500000,
-       11000000
-};
-
 static struct ieee80211_rate ipw2100_bg_rates[] = {
        { .bitrate = 10 },
        { .bitrate = 20, .flags = IEEE80211_RATE_SHORT_PREAMBLE },
@@ -323,7 +316,7 @@ static struct ieee80211_rate ipw2100_bg_rates[] = {
        { .bitrate = 110, .flags = IEEE80211_RATE_SHORT_PREAMBLE },
 };
 
-#define RATE_COUNT ARRAY_SIZE(ipw2100_rates_11b)
+#define RATE_COUNT ARRAY_SIZE(ipw2100_bg_rates)
 
 /* Pre-decl until we get the code solid and then we can clean it up */
 static void ipw2100_tx_send_commands(struct ipw2100_priv *priv);
@@ -3464,11 +3457,8 @@ static int ipw2100_msg_allocate(struct ipw2100_priv *priv)
        priv->msg_buffers =
            kmalloc(IPW_COMMAND_POOL_SIZE * sizeof(struct ipw2100_tx_packet),
                    GFP_KERNEL);
-       if (!priv->msg_buffers) {
-               printk(KERN_ERR DRV_NAME ": %s: PCI alloc failed for msg "
-                      "buffers.\n", priv->net_dev->name);
+       if (!priv->msg_buffers)
                return -ENOMEM;
-       }
 
        for (i = 0; i < IPW_COMMAND_POOL_SIZE; i++) {
                v = pci_alloc_consistent(priv->pci_dev,
@@ -6896,7 +6886,7 @@ static int ipw2100_wx_get_range(struct net_device *dev,
        range->num_bitrates = RATE_COUNT;
 
        for (i = 0; i < RATE_COUNT && i < IW_MAX_BITRATES; i++) {
-               range->bitrate[i] = ipw2100_rates_11b[i];
+               range->bitrate[i] = ipw2100_bg_rates[i].bitrate * 100 * 1000;
        }
 
        range->min_rts = MIN_RTS_THRESHOLD;
@@ -8108,61 +8098,41 @@ static int ipw2100_wx_get_crc_check(struct net_device *dev,
 #endif                         /* CONFIG_IPW2100_MONITOR */
 
 static iw_handler ipw2100_wx_handlers[] = {
-       NULL,                   /* SIOCSIWCOMMIT */
-       ipw2100_wx_get_name,    /* SIOCGIWNAME */
-       NULL,                   /* SIOCSIWNWID */
-       NULL,                   /* SIOCGIWNWID */
-       ipw2100_wx_set_freq,    /* SIOCSIWFREQ */
-       ipw2100_wx_get_freq,    /* SIOCGIWFREQ */
-       ipw2100_wx_set_mode,    /* SIOCSIWMODE */
-       ipw2100_wx_get_mode,    /* SIOCGIWMODE */
-       NULL,                   /* SIOCSIWSENS */
-       NULL,                   /* SIOCGIWSENS */
-       NULL,                   /* SIOCSIWRANGE */
-       ipw2100_wx_get_range,   /* SIOCGIWRANGE */
-       NULL,                   /* SIOCSIWPRIV */
-       NULL,                   /* SIOCGIWPRIV */
-       NULL,                   /* SIOCSIWSTATS */
-       NULL,                   /* SIOCGIWSTATS */
-       NULL,                   /* SIOCSIWSPY */
-       NULL,                   /* SIOCGIWSPY */
-       NULL,                   /* SIOCGIWTHRSPY */
-       NULL,                   /* SIOCWIWTHRSPY */
-       ipw2100_wx_set_wap,     /* SIOCSIWAP */
-       ipw2100_wx_get_wap,     /* SIOCGIWAP */
-       ipw2100_wx_set_mlme,    /* SIOCSIWMLME */
-       NULL,                   /* SIOCGIWAPLIST -- deprecated */
-       ipw2100_wx_set_scan,    /* SIOCSIWSCAN */
-       ipw2100_wx_get_scan,    /* SIOCGIWSCAN */
-       ipw2100_wx_set_essid,   /* SIOCSIWESSID */
-       ipw2100_wx_get_essid,   /* SIOCGIWESSID */
-       ipw2100_wx_set_nick,    /* SIOCSIWNICKN */
-       ipw2100_wx_get_nick,    /* SIOCGIWNICKN */
-       NULL,                   /* -- hole -- */
-       NULL,                   /* -- hole -- */
-       ipw2100_wx_set_rate,    /* SIOCSIWRATE */
-       ipw2100_wx_get_rate,    /* SIOCGIWRATE */
-       ipw2100_wx_set_rts,     /* SIOCSIWRTS */
-       ipw2100_wx_get_rts,     /* SIOCGIWRTS */
-       ipw2100_wx_set_frag,    /* SIOCSIWFRAG */
-       ipw2100_wx_get_frag,    /* SIOCGIWFRAG */
-       ipw2100_wx_set_txpow,   /* SIOCSIWTXPOW */
-       ipw2100_wx_get_txpow,   /* SIOCGIWTXPOW */
-       ipw2100_wx_set_retry,   /* SIOCSIWRETRY */
-       ipw2100_wx_get_retry,   /* SIOCGIWRETRY */
-       ipw2100_wx_set_encode,  /* SIOCSIWENCODE */
-       ipw2100_wx_get_encode,  /* SIOCGIWENCODE */
-       ipw2100_wx_set_power,   /* SIOCSIWPOWER */
-       ipw2100_wx_get_power,   /* SIOCGIWPOWER */
-       NULL,                   /* -- hole -- */
-       NULL,                   /* -- hole -- */
-       ipw2100_wx_set_genie,   /* SIOCSIWGENIE */
-       ipw2100_wx_get_genie,   /* SIOCGIWGENIE */
-       ipw2100_wx_set_auth,    /* SIOCSIWAUTH */
-       ipw2100_wx_get_auth,    /* SIOCGIWAUTH */
-       ipw2100_wx_set_encodeext,       /* SIOCSIWENCODEEXT */
-       ipw2100_wx_get_encodeext,       /* SIOCGIWENCODEEXT */
-       NULL,                   /* SIOCSIWPMKSA */
+       IW_HANDLER(SIOCGIWNAME, ipw2100_wx_get_name),
+       IW_HANDLER(SIOCSIWFREQ, ipw2100_wx_set_freq),
+       IW_HANDLER(SIOCGIWFREQ, ipw2100_wx_get_freq),
+       IW_HANDLER(SIOCSIWMODE, ipw2100_wx_set_mode),
+       IW_HANDLER(SIOCGIWMODE, ipw2100_wx_get_mode),
+       IW_HANDLER(SIOCGIWRANGE, ipw2100_wx_get_range),
+       IW_HANDLER(SIOCSIWAP, ipw2100_wx_set_wap),
+       IW_HANDLER(SIOCGIWAP, ipw2100_wx_get_wap),
+       IW_HANDLER(SIOCSIWMLME, ipw2100_wx_set_mlme),
+       IW_HANDLER(SIOCSIWSCAN, ipw2100_wx_set_scan),
+       IW_HANDLER(SIOCGIWSCAN, ipw2100_wx_get_scan),
+       IW_HANDLER(SIOCSIWESSID, ipw2100_wx_set_essid),
+       IW_HANDLER(SIOCGIWESSID, ipw2100_wx_get_essid),
+       IW_HANDLER(SIOCSIWNICKN, ipw2100_wx_set_nick),
+       IW_HANDLER(SIOCGIWNICKN, ipw2100_wx_get_nick),
+       IW_HANDLER(SIOCSIWRATE, ipw2100_wx_set_rate),
+       IW_HANDLER(SIOCGIWRATE, ipw2100_wx_get_rate),
+       IW_HANDLER(SIOCSIWRTS, ipw2100_wx_set_rts),
+       IW_HANDLER(SIOCGIWRTS, ipw2100_wx_get_rts),
+       IW_HANDLER(SIOCSIWFRAG, ipw2100_wx_set_frag),
+       IW_HANDLER(SIOCGIWFRAG, ipw2100_wx_get_frag),
+       IW_HANDLER(SIOCSIWTXPOW, ipw2100_wx_set_txpow),
+       IW_HANDLER(SIOCGIWTXPOW, ipw2100_wx_get_txpow),
+       IW_HANDLER(SIOCSIWRETRY, ipw2100_wx_set_retry),
+       IW_HANDLER(SIOCGIWRETRY, ipw2100_wx_get_retry),
+       IW_HANDLER(SIOCSIWENCODE, ipw2100_wx_set_encode),
+       IW_HANDLER(SIOCGIWENCODE, ipw2100_wx_get_encode),
+       IW_HANDLER(SIOCSIWPOWER, ipw2100_wx_set_power),
+       IW_HANDLER(SIOCGIWPOWER, ipw2100_wx_get_power),
+       IW_HANDLER(SIOCSIWGENIE, ipw2100_wx_set_genie),
+       IW_HANDLER(SIOCGIWGENIE, ipw2100_wx_get_genie),
+       IW_HANDLER(SIOCSIWAUTH, ipw2100_wx_set_auth),
+       IW_HANDLER(SIOCGIWAUTH, ipw2100_wx_get_auth),
+       IW_HANDLER(SIOCSIWENCODEEXT, ipw2100_wx_set_encodeext),
+       IW_HANDLER(SIOCGIWENCODEEXT, ipw2100_wx_get_encodeext),
 };
 
 #define IPW2100_PRIV_SET_MONITOR       SIOCIWFIRSTPRIV
index d5ef696..3adb240 100644 (file)
@@ -150,10 +150,9 @@ struct net_device *alloc_libipw(int sizeof_priv, int monitor)
        LIBIPW_DEBUG_INFO("Initializing...\n");
 
        dev = alloc_etherdev(sizeof(struct libipw_device) + sizeof_priv);
-       if (!dev) {
-               LIBIPW_ERROR("Unable to allocate network device.\n");
+       if (!dev)
                goto failed;
-       }
+
        ieee = netdev_priv(dev);
 
        ieee->dev = dev;
index 32a9966..c4955d2 100644 (file)
@@ -172,7 +172,7 @@ libipw_rx_frame_mgmt(struct libipw_device *ieee, struct sk_buff *skb,
                        u16 stype)
 {
        if (ieee->iw_mode == IW_MODE_MASTER) {
-               printk(KERN_DEBUG "%s: Master mode not yet suppported.\n",
+               printk(KERN_DEBUG "%s: Master mode not yet supported.\n",
                       ieee->dev->name);
                return 0;
 /*
index 5e1a19f..f767dd1 100644 (file)
@@ -503,3 +503,9 @@ il3945_ucode_general_stats_read(struct file *file, char __user *user_buf,
        kfree(buf);
        return ret;
 }
+
+const struct il_debugfs_ops il3945_debugfs_ops = {
+       .rx_stats_read = il3945_ucode_rx_stats_read,
+       .tx_stats_read = il3945_ucode_tx_stats_read,
+       .general_stats_read = il3945_ucode_general_stats_read,
+};
index 54b2d39..0ccc934 100644 (file)
@@ -140,7 +140,7 @@ il3945_set_ccmp_dynamic_key_info(struct il_priv *il,
        key_flags |= (STA_KEY_FLG_CCMP | STA_KEY_FLG_MAP_KEY_MSK);
        key_flags |= cpu_to_le16(keyconf->keyidx << STA_KEY_FLG_KEYID_POS);
 
-       if (sta_id == il->ctx.bcast_sta_id)
+       if (sta_id == il->hw_params.bcast_id)
                key_flags |= STA_KEY_MULTICAST_MSK;
 
        keyconf->flags |= IEEE80211_KEY_FLAG_GENERATE_IV;
@@ -341,7 +341,7 @@ il3945_send_beacon_cmd(struct il_priv *il)
                return -ENOMEM;
        }
 
-       rate = il_get_lowest_plcp(il, &il->ctx);
+       rate = il_get_lowest_plcp(il);
 
        frame_size = il3945_hw_get_beacon_cmd(il, frame, rate);
 
@@ -512,7 +512,7 @@ il3945_tx_skb(struct il_priv *il, struct sk_buff *skb)
        hdr_len = ieee80211_hdrlen(fc);
 
        /* Find idx into station table for destination station */
-       sta_id = il_sta_id_or_broadcast(il, &il->ctx, info->control.sta);
+       sta_id = il_sta_id_or_broadcast(il, info->control.sta);
        if (sta_id == IL_INVALID_STATION) {
                D_DROP("Dropping - INVALID STATION: %pM\n", hdr->addr1);
                goto drop;
@@ -538,10 +538,7 @@ il3945_tx_skb(struct il_priv *il, struct sk_buff *skb)
 
        idx = il_get_cmd_idx(q, q->write_ptr, 0);
 
-       /* Set up driver data for this TFD */
-       memset(&(txq->txb[q->write_ptr]), 0, sizeof(struct il_tx_info));
-       txq->txb[q->write_ptr].skb = skb;
-       txq->txb[q->write_ptr].ctx = &il->ctx;
+       txq->skbs[q->write_ptr] = skb;
 
        /* Init first empty entry in queue's array of Tx/cmd buffers */
        out_cmd = txq->cmd[idx];
@@ -576,7 +573,6 @@ il3945_tx_skb(struct il_priv *il, struct sk_buff *skb)
        len = (u16) skb->len;
        tx_cmd->len = cpu_to_le16(len);
 
-       il_dbg_log_tx_data_frame(il, len, hdr);
        il_update_stats(il, true, fc, len);
        tx_cmd->tx_flags &= ~TX_CMD_FLG_ANT_A_MSK;
        tx_cmd->tx_flags &= ~TX_CMD_FLG_ANT_B_MSK;
@@ -619,8 +615,7 @@ il3945_tx_skb(struct il_priv *il, struct sk_buff *skb)
 
        /* Add buffer containing Tx command and MAC(!) header to TFD's
         * first entry */
-       il->cfg->ops->lib->txq_attach_buf_to_tfd(il, txq, txcmd_phys, len, 1,
-                                                0);
+       il->ops->txq_attach_buf_to_tfd(il, txq, txcmd_phys, len, 1, 0);
 
        /* Set up TFD's 2nd entry to point directly to remainder of skb,
         * if any (802.11 null frames have no payload). */
@@ -629,8 +624,8 @@ il3945_tx_skb(struct il_priv *il, struct sk_buff *skb)
                phys_addr =
                    pci_map_single(il->pci_dev, skb->data + hdr_len, len,
                                   PCI_DMA_TODEVICE);
-               il->cfg->ops->lib->txq_attach_buf_to_tfd(il, txq, phys_addr,
-                                                        len, 0, U32_PAD(len));
+               il->ops->txq_attach_buf_to_tfd(il, txq, phys_addr, len, 0,
+                                              U32_PAD(len));
        }
 
        /* Tell device the write idx *just past* this latest filled TFD */
@@ -672,15 +667,13 @@ il3945_get_measurement(struct il_priv *il,
        int rc;
        int spectrum_resp_status;
        int duration = le16_to_cpu(params->duration);
-       struct il_rxon_context *ctx = &il->ctx;
 
        if (il_is_associated(il))
                add_time =
                    il_usecs_to_beacons(il,
                                        le64_to_cpu(params->start_time) -
                                        il->_3945.last_tsf,
-                                       le16_to_cpu(ctx->timing.
-                                                   beacon_interval));
+                                       le16_to_cpu(il->timing.beacon_interval));
 
        memset(&spectrum, 0, sizeof(spectrum));
 
@@ -694,15 +687,14 @@ il3945_get_measurement(struct il_priv *il,
        if (il_is_associated(il))
                spectrum.start_time =
                    il_add_beacon_time(il, il->_3945.last_beacon_time, add_time,
-                                      le16_to_cpu(ctx->timing.
-                                                  beacon_interval));
+                                      le16_to_cpu(il->timing.beacon_interval));
        else
                spectrum.start_time = 0;
 
        spectrum.channels[0].duration = cpu_to_le32(duration * TIME_UNIT);
        spectrum.channels[0].channel = params->channel;
        spectrum.channels[0].type = type;
-       if (ctx->active.flags & RXON_FLG_BAND_24G_MSK)
+       if (il->active.flags & RXON_FLG_BAND_24G_MSK)
                spectrum.flags |=
                    RXON_FLG_BAND_24G_MSK | RXON_FLG_AUTO_DETECT_MSK |
                    RXON_FLG_TGG_PROTECT_MSK;
@@ -817,16 +809,16 @@ il3945_hdl_card_state(struct il_priv *il, struct il_rx_buf *rxb)
        _il_wr(il, CSR_UCODE_DRV_GP1_SET, CSR_UCODE_DRV_GP1_BIT_CMD_BLOCKED);
 
        if (flags & HW_CARD_DISABLED)
-               set_bit(S_RF_KILL_HW, &il->status);
+               set_bit(S_RFKILL, &il->status);
        else
-               clear_bit(S_RF_KILL_HW, &il->status);
+               clear_bit(S_RFKILL, &il->status);
 
        il_scan_cancel(il);
 
-       if ((test_bit(S_RF_KILL_HW, &status) !=
-            test_bit(S_RF_KILL_HW, &il->status)))
+       if ((test_bit(S_RFKILL, &status) !=
+            test_bit(S_RFKILL, &il->status)))
                wiphy_rfkill_set_hw_state(il->hw->wiphy,
-                                         test_bit(S_RF_KILL_HW, &il->status));
+                                         test_bit(S_RFKILL, &il->status));
        else
                wake_up(&il->wait_command_queue);
 }
@@ -2150,7 +2142,6 @@ il3945_alive_start(struct il_priv *il)
 {
        int thermal_spin = 0;
        u32 rfkill;
-       struct il_rxon_context *ctx = &il->ctx;
 
        D_INFO("Runtime Alive received.\n");
 
@@ -2175,7 +2166,7 @@ il3945_alive_start(struct il_priv *il)
        D_INFO("RFKILL status: 0x%x\n", rfkill);
 
        if (rfkill & 0x1) {
-               clear_bit(S_RF_KILL_HW, &il->status);
+               clear_bit(S_RFKILL, &il->status);
                /* if RFKILL is not on, then wait for thermal
                 * sensor in adapter to kick in */
                while (il3945_hw_get_temperature(il) == 0) {
@@ -2187,7 +2178,7 @@ il3945_alive_start(struct il_priv *il)
                        D_INFO("Thermal calibration took %dus\n",
                               thermal_spin * 10);
        } else
-               set_bit(S_RF_KILL_HW, &il->status);
+               set_bit(S_RFKILL, &il->status);
 
        /* After the ALIVE response, we can send commands to 3945 uCode */
        set_bit(S_ALIVE, &il->status);
@@ -2206,13 +2197,13 @@ il3945_alive_start(struct il_priv *il)
 
        if (il_is_associated(il)) {
                struct il3945_rxon_cmd *active_rxon =
-                   (struct il3945_rxon_cmd *)(&ctx->active);
+                   (struct il3945_rxon_cmd *)(&il->active);
 
-               ctx->staging.filter_flags |= RXON_FILTER_ASSOC_MSK;
+               il->staging.filter_flags |= RXON_FILTER_ASSOC_MSK;
                active_rxon->filter_flags &= ~RXON_FILTER_ASSOC_MSK;
        } else {
                /* Initialize our rx_config data */
-               il_connection_init_rx_config(il, ctx);
+               il_connection_init_rx_config(il);
        }
 
        /* Configure Bluetooth device coexistence support */
@@ -2221,7 +2212,7 @@ il3945_alive_start(struct il_priv *il)
        set_bit(S_READY, &il->status);
 
        /* Configure the adapter for unassociated operation */
-       il3945_commit_rxon(il, ctx);
+       il3945_commit_rxon(il);
 
        il3945_reg_txpower_periodic(il);
 
@@ -2253,7 +2244,7 @@ __il3945_down(struct il_priv *il)
        del_timer_sync(&il->watchdog);
 
        /* Station information will now be cleared in device */
-       il_clear_ucode_stations(il, NULL);
+       il_clear_ucode_stations(il);
        il_dealloc_bcast_stations(il);
        il_clear_driver_stations(il);
 
@@ -2281,12 +2272,8 @@ __il3945_down(struct il_priv *il)
         * clear all bits but the RF Kill bits and return */
        if (!il_is_init(il)) {
                il->status =
-                   test_bit(S_RF_KILL_HW,
-                            &il->
-                            status) << S_RF_KILL_HW |
-                   test_bit(S_GEO_CONFIGURED,
-                            &il->
-                            status) << S_GEO_CONFIGURED |
+                   test_bit(S_RFKILL, &il->status) << S_RFKILL |
+                   test_bit(S_GEO_CONFIGURED, &il->status) << S_GEO_CONFIGURED |
                    test_bit(S_EXIT_PENDING, &il->status) << S_EXIT_PENDING;
                goto exit;
        }
@@ -2294,25 +2281,30 @@ __il3945_down(struct il_priv *il)
        /* ...otherwise clear out all the status bits but the RF Kill
         * bit and continue taking the NIC down. */
        il->status &=
-           test_bit(S_RF_KILL_HW,
-                    &il->status) << S_RF_KILL_HW | test_bit(S_GEO_CONFIGURED,
-                                                            &il->
-                                                            status) <<
-           S_GEO_CONFIGURED | test_bit(S_FW_ERROR,
-                                       &il->
-                                       status) << S_FW_ERROR |
+           test_bit(S_RFKILL, &il->status) << S_RFKILL |
+           test_bit(S_GEO_CONFIGURED, &il->status) << S_GEO_CONFIGURED |
+           test_bit(S_FW_ERROR, &il->status) << S_FW_ERROR |
            test_bit(S_EXIT_PENDING, &il->status) << S_EXIT_PENDING;
 
+       /*
+        * We disabled and synchronized interrupt, and priv->mutex is taken, so
+        * here is the only thread which will program device registers, but
+        * still have lockdep assertions, so we are taking reg_lock.
+        */
+       spin_lock_irq(&il->reg_lock);
+       /* FIXME: il_grab_nic_access if rfkill is off ? */
+
        il3945_hw_txq_ctx_stop(il);
        il3945_hw_rxq_stop(il);
-
        /* Power-down device's busmaster DMA clocks */
-       il_wr_prph(il, APMG_CLK_DIS_REG, APMG_CLK_VAL_DMA_CLK_RQT);
+       _il_wr_prph(il, APMG_CLK_DIS_REG, APMG_CLK_VAL_DMA_CLK_RQT);
        udelay(5);
-
        /* Stop the device, and put it in low power state */
-       il_apm_stop(il);
+       _il_apm_stop(il);
+
+       spin_unlock_irq(&il->reg_lock);
 
+       il3945_hw_txq_ctx_free(il);
 exit:
        memset(&il->card_alive, 0, sizeof(struct il_alive_resp));
 
@@ -2339,12 +2331,11 @@ il3945_down(struct il_priv *il)
 static int
 il3945_alloc_bcast_station(struct il_priv *il)
 {
-       struct il_rxon_context *ctx = &il->ctx;
        unsigned long flags;
        u8 sta_id;
 
        spin_lock_irqsave(&il->sta_lock, flags);
-       sta_id = il_prep_station(il, ctx, il_bcast_addr, false, NULL);
+       sta_id = il_prep_station(il, il_bcast_addr, false, NULL);
        if (sta_id == IL_INVALID_STATION) {
                IL_ERR("Unable to prepare broadcast station\n");
                spin_unlock_irqrestore(&il->sta_lock, flags);
@@ -2380,9 +2371,9 @@ __il3945_up(struct il_priv *il)
 
        /* If platform's RF_KILL switch is NOT set to KILL */
        if (_il_rd(il, CSR_GP_CNTRL) & CSR_GP_CNTRL_REG_FLAG_HW_RF_KILL_SW)
-               clear_bit(S_RF_KILL_HW, &il->status);
+               clear_bit(S_RFKILL, &il->status);
        else {
-               set_bit(S_RF_KILL_HW, &il->status);
+               set_bit(S_RFKILL, &il->status);
                IL_WARN("Radio disabled by HW RF Kill switch\n");
                return -ENODEV;
        }
@@ -2414,7 +2405,7 @@ __il3945_up(struct il_priv *il)
               il->ucode_data.len);
 
        /* We return success when we resume from suspend and rf_kill is on. */
-       if (test_bit(S_RF_KILL_HW, &il->status))
+       if (test_bit(S_RFKILL, &il->status))
                return 0;
 
        for (i = 0; i < MAX_HW_RESTARTS; i++) {
@@ -2422,7 +2413,7 @@ __il3945_up(struct il_priv *il)
                /* load bootstrap state machine,
                 * load bootstrap program into processor's memory,
                 * prepare to load the "initialize" uCode */
-               rc = il->cfg->ops->lib->load_ucode(il);
+               rc = il->ops->load_ucode(il);
 
                if (rc) {
                        IL_ERR("Unable to set up bootstrap uCode: %d\n", rc);
@@ -2494,15 +2485,15 @@ il3945_rfkill_poll(struct work_struct *data)
 {
        struct il_priv *il =
            container_of(data, struct il_priv, _3945.rfkill_poll.work);
-       bool old_rfkill = test_bit(S_RF_KILL_HW, &il->status);
+       bool old_rfkill = test_bit(S_RFKILL, &il->status);
        bool new_rfkill =
            !(_il_rd(il, CSR_GP_CNTRL) & CSR_GP_CNTRL_REG_FLAG_HW_RF_KILL_SW);
 
        if (new_rfkill != old_rfkill) {
                if (new_rfkill)
-                       set_bit(S_RF_KILL_HW, &il->status);
+                       set_bit(S_RFKILL, &il->status);
                else
-                       clear_bit(S_RF_KILL_HW, &il->status);
+                       clear_bit(S_RFKILL, &il->status);
 
                wiphy_rfkill_set_hw_state(il->hw->wiphy, new_rfkill);
 
@@ -2602,7 +2593,7 @@ il3945_request_scan(struct il_priv *il, struct ieee80211_vif *vif)
        /* We don't build a direct scan probe request; the uCode will do
         * that based on the direct_mask added to each channel entry */
        scan->tx_cmd.tx_flags = TX_CMD_FLG_SEQ_CTL_MSK;
-       scan->tx_cmd.sta_id = il->ctx.bcast_sta_id;
+       scan->tx_cmd.sta_id = il->hw_params.bcast_id;
        scan->tx_cmd.stop_time.life_time = TX_CMD_LIFE_TIME_INFINITE;
 
        /* flags + rate selection */
@@ -2664,14 +2655,12 @@ il3945_request_scan(struct il_priv *il, struct ieee80211_vif *vif)
 void
 il3945_post_scan(struct il_priv *il)
 {
-       struct il_rxon_context *ctx = &il->ctx;
-
        /*
         * Since setting the RXON may have been deferred while
         * performing the scan, fire one off if needed
         */
-       if (memcmp(&ctx->staging, &ctx->active, sizeof(ctx->staging)))
-               il3945_commit_rxon(il, ctx);
+       if (memcmp(&il->staging, &il->active, sizeof(il->staging)))
+               il3945_commit_rxon(il);
 }
 
 static void
@@ -2684,7 +2673,8 @@ il3945_bg_restart(struct work_struct *data)
 
        if (test_and_clear_bit(S_FW_ERROR, &il->status)) {
                mutex_lock(&il->mutex);
-               il->ctx.vif = NULL;
+               /* FIXME: vif can be dereferenced */
+               il->vif = NULL;
                il->is_open = 0;
                mutex_unlock(&il->mutex);
                il3945_down(il);
@@ -2722,13 +2712,12 @@ il3945_post_associate(struct il_priv *il)
 {
        int rc = 0;
        struct ieee80211_conf *conf = NULL;
-       struct il_rxon_context *ctx = &il->ctx;
 
-       if (!ctx->vif || !il->is_open)
+       if (!il->vif || !il->is_open)
                return;
 
-       D_ASSOC("Associated as %d to: %pM\n", ctx->vif->bss_conf.aid,
-               ctx->active.bssid_addr);
+       D_ASSOC("Associated as %d to: %pM\n", il->vif->bss_conf.aid,
+               il->active.bssid_addr);
 
        if (test_bit(S_EXIT_PENDING, &il->status))
                return;
@@ -2737,35 +2726,35 @@ il3945_post_associate(struct il_priv *il)
 
        conf = &il->hw->conf;
 
-       ctx->staging.filter_flags &= ~RXON_FILTER_ASSOC_MSK;
-       il3945_commit_rxon(il, ctx);
+       il->staging.filter_flags &= ~RXON_FILTER_ASSOC_MSK;
+       il3945_commit_rxon(il);
 
-       rc = il_send_rxon_timing(il, ctx);
+       rc = il_send_rxon_timing(il);
        if (rc)
                IL_WARN("C_RXON_TIMING failed - " "Attempting to continue.\n");
 
-       ctx->staging.filter_flags |= RXON_FILTER_ASSOC_MSK;
+       il->staging.filter_flags |= RXON_FILTER_ASSOC_MSK;
 
-       ctx->staging.assoc_id = cpu_to_le16(ctx->vif->bss_conf.aid);
+       il->staging.assoc_id = cpu_to_le16(il->vif->bss_conf.aid);
 
-       D_ASSOC("assoc id %d beacon interval %d\n", ctx->vif->bss_conf.aid,
-               ctx->vif->bss_conf.beacon_int);
+       D_ASSOC("assoc id %d beacon interval %d\n", il->vif->bss_conf.aid,
+               il->vif->bss_conf.beacon_int);
 
-       if (ctx->vif->bss_conf.use_short_preamble)
-               ctx->staging.flags |= RXON_FLG_SHORT_PREAMBLE_MSK;
+       if (il->vif->bss_conf.use_short_preamble)
+               il->staging.flags |= RXON_FLG_SHORT_PREAMBLE_MSK;
        else
-               ctx->staging.flags &= ~RXON_FLG_SHORT_PREAMBLE_MSK;
+               il->staging.flags &= ~RXON_FLG_SHORT_PREAMBLE_MSK;
 
-       if (ctx->staging.flags & RXON_FLG_BAND_24G_MSK) {
-               if (ctx->vif->bss_conf.use_short_slot)
-                       ctx->staging.flags |= RXON_FLG_SHORT_SLOT_MSK;
+       if (il->staging.flags & RXON_FLG_BAND_24G_MSK) {
+               if (il->vif->bss_conf.use_short_slot)
+                       il->staging.flags |= RXON_FLG_SHORT_SLOT_MSK;
                else
-                       ctx->staging.flags &= ~RXON_FLG_SHORT_SLOT_MSK;
+                       il->staging.flags &= ~RXON_FLG_SHORT_SLOT_MSK;
        }
 
-       il3945_commit_rxon(il, ctx);
+       il3945_commit_rxon(il);
 
-       switch (ctx->vif->type) {
+       switch (il->vif->type) {
        case NL80211_IFTYPE_STATION:
                il3945_rate_scale_init(il->hw, IL_AP_ID);
                break;
@@ -2774,7 +2763,7 @@ il3945_post_associate(struct il_priv *il)
                break;
        default:
                IL_ERR("%s Should not be called in %d mode\n", __func__,
-                      ctx->vif->type);
+                     il->vif->type);
                break;
        }
 }
@@ -2793,10 +2782,9 @@ il3945_mac_start(struct ieee80211_hw *hw)
        struct il_priv *il = hw->priv;
        int ret;
 
-       D_MAC80211("enter\n");
-
        /* we should be verifying the device is ready to be opened */
        mutex_lock(&il->mutex);
+       D_MAC80211("enter\n");
 
        /* fetch ucode file from disk, alloc and copy to bus-master buffers ...
         * ucode filename and max sizes are card-specific. */
@@ -2891,8 +2879,7 @@ il3945_mac_tx(struct ieee80211_hw *hw, struct sk_buff *skb)
 void
 il3945_config_ap(struct il_priv *il)
 {
-       struct il_rxon_context *ctx = &il->ctx;
-       struct ieee80211_vif *vif = ctx->vif;
+       struct ieee80211_vif *vif = il->vif;
        int rc = 0;
 
        if (test_bit(S_EXIT_PENDING, &il->status))
@@ -2902,31 +2889,31 @@ il3945_config_ap(struct il_priv *il)
        if (!(il_is_associated(il))) {
 
                /* RXON - unassoc (to set timing command) */
-               ctx->staging.filter_flags &= ~RXON_FILTER_ASSOC_MSK;
-               il3945_commit_rxon(il, ctx);
+               il->staging.filter_flags &= ~RXON_FILTER_ASSOC_MSK;
+               il3945_commit_rxon(il);
 
                /* RXON Timing */
-               rc = il_send_rxon_timing(il, ctx);
+               rc = il_send_rxon_timing(il);
                if (rc)
                        IL_WARN("C_RXON_TIMING failed - "
                                "Attempting to continue.\n");
 
-               ctx->staging.assoc_id = 0;
+               il->staging.assoc_id = 0;
 
                if (vif->bss_conf.use_short_preamble)
-                       ctx->staging.flags |= RXON_FLG_SHORT_PREAMBLE_MSK;
+                       il->staging.flags |= RXON_FLG_SHORT_PREAMBLE_MSK;
                else
-                       ctx->staging.flags &= ~RXON_FLG_SHORT_PREAMBLE_MSK;
+                       il->staging.flags &= ~RXON_FLG_SHORT_PREAMBLE_MSK;
 
-               if (ctx->staging.flags & RXON_FLG_BAND_24G_MSK) {
+               if (il->staging.flags & RXON_FLG_BAND_24G_MSK) {
                        if (vif->bss_conf.use_short_slot)
-                               ctx->staging.flags |= RXON_FLG_SHORT_SLOT_MSK;
+                               il->staging.flags |= RXON_FLG_SHORT_SLOT_MSK;
                        else
-                               ctx->staging.flags &= ~RXON_FLG_SHORT_SLOT_MSK;
+                               il->staging.flags &= ~RXON_FLG_SHORT_SLOT_MSK;
                }
                /* restore RXON assoc */
-               ctx->staging.filter_flags |= RXON_FILTER_ASSOC_MSK;
-               il3945_commit_rxon(il, ctx);
+               il->staging.filter_flags |= RXON_FILTER_ASSOC_MSK;
+               il3945_commit_rxon(il);
        }
        il3945_send_beacon_cmd(il);
 }
@@ -2953,15 +2940,19 @@ il3945_mac_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
         * hardware will then not attempt to decrypt the frames.
         */
        if (vif->type == NL80211_IFTYPE_ADHOC &&
-           !(key->flags & IEEE80211_KEY_FLAG_PAIRWISE))
+           !(key->flags & IEEE80211_KEY_FLAG_PAIRWISE)) {
+               D_MAC80211("leave - IBSS RSN\n");
                return -EOPNOTSUPP;
+       }
 
        static_key = !il_is_associated(il);
 
        if (!static_key) {
-               sta_id = il_sta_id_or_broadcast(il, &il->ctx, sta);
-               if (sta_id == IL_INVALID_STATION)
+               sta_id = il_sta_id_or_broadcast(il, sta);
+               if (sta_id == IL_INVALID_STATION) {
+                       D_MAC80211("leave - station not found\n");
                        return -EINVAL;
+               }
        }
 
        mutex_lock(&il->mutex);
@@ -2986,8 +2977,8 @@ il3945_mac_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
                ret = -EINVAL;
        }
 
+       D_MAC80211("leave ret %d\n", ret);
        mutex_unlock(&il->mutex);
-       D_MAC80211("leave\n");
 
        return ret;
 }
@@ -3002,13 +2993,11 @@ il3945_mac_sta_add(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
        bool is_ap = vif->type == NL80211_IFTYPE_STATION;
        u8 sta_id;
 
-       D_INFO("received request to add station %pM\n", sta->addr);
        mutex_lock(&il->mutex);
-       D_INFO("proceeding to add station %pM\n", sta->addr);
+       D_INFO("station %pM\n", sta->addr);
        sta_priv->common.sta_id = IL_INVALID_STATION;
 
-       ret =
-           il_add_station_common(il, &il->ctx, sta->addr, is_ap, sta, &sta_id);
+       ret = il_add_station_common(il, sta->addr, is_ap, sta, &sta_id);
        if (ret) {
                IL_ERR("Unable to add station %pM (%d)\n", sta->addr, ret);
                /* Should we return success if return code is EEXIST ? */
@@ -3032,7 +3021,6 @@ il3945_configure_filter(struct ieee80211_hw *hw, unsigned int changed_flags,
 {
        struct il_priv *il = hw->priv;
        __le32 filter_or = 0, filter_nand = 0;
-       struct il_rxon_context *ctx = &il->ctx;
 
 #define CHK(test, flag)        do { \
        if (*total_flags & (test))              \
@@ -3052,8 +3040,8 @@ il3945_configure_filter(struct ieee80211_hw *hw, unsigned int changed_flags,
 
        mutex_lock(&il->mutex);
 
-       ctx->staging.filter_flags &= ~filter_nand;
-       ctx->staging.filter_flags |= filter_or;
+       il->staging.filter_flags &= ~filter_nand;
+       il->staging.filter_flags |= filter_or;
 
        /*
         * Not committing directly because hardware can perform a scan,
@@ -3112,11 +3100,9 @@ il3945_store_debug_level(struct device *d, struct device_attribute *attr,
        ret = strict_strtoul(buf, 0, &val);
        if (ret)
                IL_INFO("%s is not in hex or decimal form.\n", buf);
-       else {
+       else
                il->debug_level = val;
-               if (il_alloc_traffic_mem(il))
-                       IL_ERR("Not enough memory to generate traffic log\n");
-       }
+
        return strnlen(buf, count);
 }
 
@@ -3170,9 +3156,8 @@ static ssize_t
 il3945_show_flags(struct device *d, struct device_attribute *attr, char *buf)
 {
        struct il_priv *il = dev_get_drvdata(d);
-       struct il_rxon_context *ctx = &il->ctx;
 
-       return sprintf(buf, "0x%04X\n", ctx->active.flags);
+       return sprintf(buf, "0x%04X\n", il->active.flags);
 }
 
 static ssize_t
@@ -3181,17 +3166,16 @@ il3945_store_flags(struct device *d, struct device_attribute *attr,
 {
        struct il_priv *il = dev_get_drvdata(d);
        u32 flags = simple_strtoul(buf, NULL, 0);
-       struct il_rxon_context *ctx = &il->ctx;
 
        mutex_lock(&il->mutex);
-       if (le32_to_cpu(ctx->staging.flags) != flags) {
+       if (le32_to_cpu(il->staging.flags) != flags) {
                /* Cancel any currently running scans... */
                if (il_scan_cancel_timeout(il, 100))
                        IL_WARN("Could not cancel scan.\n");
                else {
                        D_INFO("Committing rxon.flags = 0x%04X\n", flags);
-                       ctx->staging.flags = cpu_to_le32(flags);
-                       il3945_commit_rxon(il, ctx);
+                       il->staging.flags = cpu_to_le32(flags);
+                       il3945_commit_rxon(il);
                }
        }
        mutex_unlock(&il->mutex);
@@ -3207,9 +3191,8 @@ il3945_show_filter_flags(struct device *d, struct device_attribute *attr,
                         char *buf)
 {
        struct il_priv *il = dev_get_drvdata(d);
-       struct il_rxon_context *ctx = &il->ctx;
 
-       return sprintf(buf, "0x%04X\n", le32_to_cpu(ctx->active.filter_flags));
+       return sprintf(buf, "0x%04X\n", le32_to_cpu(il->active.filter_flags));
 }
 
 static ssize_t
@@ -3217,19 +3200,18 @@ il3945_store_filter_flags(struct device *d, struct device_attribute *attr,
                          const char *buf, size_t count)
 {
        struct il_priv *il = dev_get_drvdata(d);
-       struct il_rxon_context *ctx = &il->ctx;
        u32 filter_flags = simple_strtoul(buf, NULL, 0);
 
        mutex_lock(&il->mutex);
-       if (le32_to_cpu(ctx->staging.filter_flags) != filter_flags) {
+       if (le32_to_cpu(il->staging.filter_flags) != filter_flags) {
                /* Cancel any currently running scans... */
                if (il_scan_cancel_timeout(il, 100))
                        IL_WARN("Could not cancel scan.\n");
                else {
                        D_INFO("Committing rxon.filter_flags = " "0x%04X\n",
                               filter_flags);
-                       ctx->staging.filter_flags = cpu_to_le32(filter_flags);
-                       il3945_commit_rxon(il, ctx);
+                       il->staging.filter_flags = cpu_to_le32(filter_flags);
+                       il3945_commit_rxon(il);
                }
        }
        mutex_unlock(&il->mutex);
@@ -3278,9 +3260,8 @@ il3945_store_measurement(struct device *d, struct device_attribute *attr,
                         const char *buf, size_t count)
 {
        struct il_priv *il = dev_get_drvdata(d);
-       struct il_rxon_context *ctx = &il->ctx;
        struct ieee80211_measurement_params params = {
-               .channel = le16_to_cpu(ctx->active.channel),
+               .channel = le16_to_cpu(il->active.channel),
                .start_time = cpu_to_le64(il->_3945.last_tsf),
                .duration = cpu_to_le16(1),
        };
@@ -3474,7 +3455,7 @@ static struct attribute_group il3945_attribute_group = {
        .attrs = il3945_sysfs_entries,
 };
 
-struct ieee80211_ops il3945_hw_ops = {
+struct ieee80211_ops il3945_mac_ops = {
        .tx = il3945_mac_tx,
        .start = il3945_mac_start,
        .stop = il3945_mac_stop,
@@ -3567,7 +3548,8 @@ il3945_setup_mac(struct il_priv *il)
        /* Tell mac80211 our characteristics */
        hw->flags = IEEE80211_HW_SIGNAL_DBM | IEEE80211_HW_SPECTRUM_MGMT;
 
-       hw->wiphy->interface_modes = il->ctx.interface_modes;
+       hw->wiphy->interface_modes =
+           BIT(NL80211_IFTYPE_STATION) | BIT(NL80211_IFTYPE_ADHOC);
 
        hw->wiphy->flags |=
            WIPHY_FLAG_CUSTOM_REGULATORY | WIPHY_FLAG_DISABLE_BEACON_HINTS |
@@ -3614,50 +3596,35 @@ il3945_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
         * 1. Allocating HW data
         * ********************/
 
-       /* mac80211 allocates memory for this device instance, including
-        *   space for this driver's ilate structure */
-       hw = il_alloc_all(cfg);
-       if (hw == NULL) {
-               pr_err("Can not allocate network device\n");
+       hw = ieee80211_alloc_hw(sizeof(struct il_priv), &il3945_mac_ops);
+       if (!hw) {
                err = -ENOMEM;
                goto out;
        }
        il = hw->priv;
+       il->hw = hw;
        SET_IEEE80211_DEV(hw, &pdev->dev);
 
        il->cmd_queue = IL39_CMD_QUEUE_NUM;
 
-       il->ctx.ctxid = 0;
-
-       il->ctx.rxon_cmd = C_RXON;
-       il->ctx.rxon_timing_cmd = C_RXON_TIMING;
-       il->ctx.rxon_assoc_cmd = C_RXON_ASSOC;
-       il->ctx.qos_cmd = C_QOS_PARAM;
-       il->ctx.ap_sta_id = IL_AP_ID;
-       il->ctx.wep_key_cmd = C_WEPKEY;
-       il->ctx.interface_modes =
-           BIT(NL80211_IFTYPE_STATION) | BIT(NL80211_IFTYPE_ADHOC);
-       il->ctx.ibss_devtype = RXON_DEV_TYPE_IBSS;
-       il->ctx.station_devtype = RXON_DEV_TYPE_ESS;
-       il->ctx.unused_devtype = RXON_DEV_TYPE_ESS;
-
        /*
         * Disabling hardware scan means that mac80211 will perform scans
         * "the hard way", rather than using device's scan.
         */
        if (il3945_mod_params.disable_hw_scan) {
                D_INFO("Disabling hw_scan\n");
-               il3945_hw_ops.hw_scan = NULL;
+               il3945_mac_ops.hw_scan = NULL;
        }
 
        D_INFO("*** LOAD DRIVER ***\n");
        il->cfg = cfg;
+       il->ops = &il3945_ops;
+#ifdef CONFIG_IWLEGACY_DEBUGFS
+       il->debugfs_ops = &il3945_debugfs_ops;
+#endif
        il->pci_dev = pdev;
        il->inta_mask = CSR_INI_SET_MASK;
 
-       if (il_alloc_traffic_mem(il))
-               IL_ERR("Not enough memory to generate traffic log\n");
-
        /***************************
         * 2. Initializing PCI bus
         * *************************/
@@ -3688,7 +3655,7 @@ il3945_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
        /***********************
         * 3. Read REV Register
         * ********************/
-       il->hw_base = pci_iomap(pdev, 0, 0);
+       il->hw_base = pci_ioremap_bar(pdev, 0);
        if (!il->hw_base) {
                err = -ENODEV;
                goto out_pci_release_regions;
@@ -3702,7 +3669,7 @@ il3945_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
         * PCI Tx retries from interfering with C3 CPU state */
        pci_write_config_byte(pdev, 0x41, 0x00);
 
-       /* these spin locks will be used in apm_ops.init and EEPROM access
+       /* these spin locks will be used in apm_init and EEPROM access
         * we should init now
         */
        spin_lock_init(&il->reg_lock);
@@ -3773,8 +3740,7 @@ il3945_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
                goto out_release_irq;
        }
 
-       il_set_rxon_channel(il, &il->bands[IEEE80211_BAND_2GHZ].channels[5],
-                           &il->ctx);
+       il_set_rxon_channel(il, &il->bands[IEEE80211_BAND_2GHZ].channels[5]);
        il3945_setup_deferred_work(il);
        il3945_setup_handlers(il);
        il_power_initialize(il);
@@ -3814,14 +3780,13 @@ out_unset_hw_params:
 out_eeprom_free:
        il_eeprom_free(il);
 out_iounmap:
-       pci_iounmap(pdev, il->hw_base);
+       iounmap(il->hw_base);
 out_pci_release_regions:
        pci_release_regions(pdev);
 out_pci_disable_device:
        pci_set_drvdata(pdev, NULL);
        pci_disable_device(pdev);
 out_ieee80211_free_hw:
-       il_free_traffic_mem(il);
        ieee80211_free_hw(il->hw);
 out:
        return err;
@@ -3889,12 +3854,11 @@ il3945_pci_remove(struct pci_dev *pdev)
         * until now... */
        destroy_workqueue(il->workqueue);
        il->workqueue = NULL;
-       il_free_traffic_mem(il);
 
        free_irq(pdev->irq, il);
        pci_disable_msi(pdev);
 
-       pci_iounmap(pdev, il->hw_base);
+       iounmap(il->hw_base);
        pci_release_regions(pdev);
        pci_disable_device(pdev);
        pci_set_drvdata(pdev, NULL);
index d7a83f2..70bee1a 100644 (file)
@@ -342,7 +342,7 @@ il3945_rs_rate_init(struct il_priv *il, struct ieee80211_sta *sta, u8 sta_id)
        int i;
 
        D_INFO("enter\n");
-       if (sta_id == il->ctx.bcast_sta_id)
+       if (sta_id == il->hw_params.bcast_id)
                goto out;
 
        psta = (struct il3945_sta_priv *)sta->drv_priv;
@@ -927,8 +927,7 @@ il3945_rate_scale_init(struct ieee80211_hw *hw, s32 sta_id)
 
        rcu_read_lock();
 
-       sta =
-           ieee80211_find_sta(il->ctx.vif, il->stations[sta_id].sta.sta.addr);
+       sta = ieee80211_find_sta(il->vif, il->stations[sta_id].sta.sta.addr);
        if (!sta) {
                D_RATE("Unable to find station to initialize rate scaling.\n");
                rcu_read_unlock();
@@ -944,7 +943,7 @@ il3945_rate_scale_init(struct ieee80211_hw *hw, s32 sta_id)
        switch (il->band) {
        case IEEE80211_BAND_2GHZ:
                /* TODO: this always does G, not a regression */
-               if (il->ctx.active.flags & RXON_FLG_TGG_PROTECT_MSK) {
+               if (il->active.flags & RXON_FLG_TGG_PROTECT_MSK) {
                        rs_sta->tgg = 1;
                        rs_sta->expected_tpt = il3945_expected_tpt_g_prot;
                } else
index 1489b15..456f32d 100644 (file)
@@ -57,10 +57,6 @@ il3945_send_led_cmd(struct il_priv *il, struct il_led_cmd *led_cmd)
        return il_send_cmd(il, &cmd);
 }
 
-const struct il_led_ops il3945_led_ops = {
-       .cmd = il3945_send_led_cmd,
-};
-
 #define IL_DECLARE_RATE_INFO(r, ip, in, rp, rn, pp, np)    \
        [RATE_##r##M_IDX] = { RATE_##r##M_PLCP,   \
                                    RATE_##r##M_IEEE,   \
@@ -293,17 +289,17 @@ il3945_tx_queue_reclaim(struct il_priv *il, int txq_id, int idx)
 {
        struct il_tx_queue *txq = &il->txq[txq_id];
        struct il_queue *q = &txq->q;
-       struct il_tx_info *tx_info;
+       struct sk_buff *skb;
 
        BUG_ON(txq_id == IL39_CMD_QUEUE_NUM);
 
        for (idx = il_queue_inc_wrap(idx, q->n_bd); q->read_ptr != idx;
             q->read_ptr = il_queue_inc_wrap(q->read_ptr, q->n_bd)) {
 
-               tx_info = &txq->txb[txq->q.read_ptr];
-               ieee80211_tx_status_irqsafe(il->hw, tx_info->skb);
-               tx_info->skb = NULL;
-               il->cfg->ops->lib->txq_free_tfd(il, txq);
+               skb = txq->skbs[txq->q.read_ptr];
+               ieee80211_tx_status_irqsafe(il->hw, skb);
+               txq->skbs[txq->q.read_ptr] = NULL;
+               il->ops->txq_free_tfd(il, txq);
        }
 
        if (il_queue_space(q) > q->low_mark && txq_id >= 0 &&
@@ -336,7 +332,7 @@ il3945_hdl_tx(struct il_priv *il, struct il_rx_buf *rxb)
        }
 
        txq->time_stamp = jiffies;
-       info = IEEE80211_SKB_CB(txq->txb[txq->q.read_ptr].skb);
+       info = IEEE80211_SKB_CB(txq->skbs[txq->q.read_ptr]);
        ieee80211_tx_info_clear_status(info);
 
        /* Fill the MRR chain with some info about on-chip retransmissions */
@@ -577,8 +573,6 @@ il3945_hdl_rx(struct il_priv *il, struct il_rx_buf *rxb)
                network_packet ? '*' : ' ', le16_to_cpu(rx_hdr->channel),
                rx_status.signal, rx_status.signal, rx_status.rate_idx);
 
-       il_dbg_log_rx_data_frame(il, le16_to_cpu(rx_hdr->len), header);
-
        if (network_packet) {
                il->_3945.last_beacon_time =
                    le32_to_cpu(rx_end->beacon_timestamp);
@@ -660,15 +654,13 @@ il3945_hw_txq_free_tfd(struct il_priv *il, struct il_tx_queue *txq)
                                 PCI_DMA_TODEVICE);
 
        /* free SKB */
-       if (txq->txb) {
-               struct sk_buff *skb;
-
-               skb = txq->txb[txq->q.read_ptr].skb;
+       if (txq->skbs) {
+               struct sk_buff *skb = txq->skbs[txq->q.read_ptr];
 
                /* can be called from irqs-disabled context */
                if (skb) {
                        dev_kfree_skb_any(skb);
-                       txq->txb[txq->q.read_ptr].skb = NULL;
+                       txq->skbs[txq->q.read_ptr] = NULL;
                }
        }
 }
@@ -798,7 +790,6 @@ il3945_rx_init(struct il_priv *il, struct il_rx_queue *rxq)
 static int
 il3945_tx_reset(struct il_priv *il)
 {
-
        /* bypass mode */
        il_wr_prph(il, ALM_SCD_MODE_REG, 0x2);
 
@@ -835,8 +826,7 @@ il3945_tx_reset(struct il_priv *il)
 static int
 il3945_txq_ctx_reset(struct il_priv *il)
 {
-       int rc;
-       int txq_id, slots_num;
+       int rc, txq_id;
 
        il3945_hw_txq_ctx_free(il);
 
@@ -852,10 +842,7 @@ il3945_txq_ctx_reset(struct il_priv *il)
 
        /* Tx queue(s) */
        for (txq_id = 0; txq_id < il->hw_params.max_txq_num; txq_id++) {
-               slots_num =
-                   (txq_id ==
-                    IL39_CMD_QUEUE_NUM) ? TFD_CMD_SLOTS : TFD_TX_CMD_SLOTS;
-               rc = il_tx_queue_init(il, &il->txq[txq_id], slots_num, txq_id);
+               rc = il_tx_queue_init(il, txq_id);
                if (rc) {
                        IL_ERR("Tx %d queue init failed\n", txq_id);
                        goto error;
@@ -960,12 +947,11 @@ il3945_hw_nic_init(struct il_priv *il)
        struct il_rx_queue *rxq = &il->rxq;
 
        spin_lock_irqsave(&il->lock, flags);
-       il->cfg->ops->lib->apm_ops.init(il);
+       il3945_apm_init(il);
        spin_unlock_irqrestore(&il->lock, flags);
 
        il3945_set_pwr_vmain(il);
-
-       il->cfg->ops->lib->apm_ops.config(il);
+       il3945_nic_config(il);
 
        /* Allocate the RX queue, or reset if it is already allocated */
        if (!rxq->bd) {
@@ -1016,7 +1002,7 @@ il3945_hw_txq_ctx_free(struct il_priv *il)
                                il_tx_queue_free(il, txq_id);
 
        /* free tx queue structure */
-       il_txq_mem(il);
+       il_free_txq_mem(il);
 }
 
 void
@@ -1025,18 +1011,17 @@ il3945_hw_txq_ctx_stop(struct il_priv *il)
        int txq_id;
 
        /* stop SCD */
-       il_wr_prph(il, ALM_SCD_MODE_REG, 0);
-       il_wr_prph(il, ALM_SCD_TXFACT_REG, 0);
+       _il_wr_prph(il, ALM_SCD_MODE_REG, 0);
+       _il_wr_prph(il, ALM_SCD_TXFACT_REG, 0);
 
        /* reset TFD queues */
        for (txq_id = 0; txq_id < il->hw_params.max_txq_num; txq_id++) {
-               il_wr(il, FH39_TCSR_CONFIG(txq_id), 0x0);
-               il_poll_bit(il, FH39_TSSR_TX_STATUS,
-                           FH39_TSSR_TX_STATUS_REG_MSK_CHNL_IDLE(txq_id),
-                           1000);
+               _il_wr(il, FH39_TCSR_CONFIG(txq_id), 0x0);
+               _il_poll_bit(il, FH39_TSSR_TX_STATUS,
+                            FH39_TSSR_TX_STATUS_REG_MSK_CHNL_IDLE(txq_id),
+                            FH39_TSSR_TX_STATUS_REG_MSK_CHNL_IDLE(txq_id),
+                            1000);
        }
-
-       il3945_hw_txq_ctx_free(il);
 }
 
 /**
@@ -1388,7 +1373,7 @@ il3945_send_tx_power(struct il_priv *il)
        int rate_idx, i;
        const struct il_channel_info *ch_info = NULL;
        struct il3945_txpowertable_cmd txpower = {
-               .channel = il->ctx.active.channel,
+               .channel = il->active.channel,
        };
        u16 chan;
 
@@ -1397,7 +1382,7 @@ il3945_send_tx_power(struct il_priv *il)
             "TX Power requested while scanning!\n"))
                return -EAGAIN;
 
-       chan = le16_to_cpu(il->ctx.active.channel);
+       chan = le16_to_cpu(il->active.channel);
 
        txpower.band = (il->band == IEEE80211_BAND_5GHZ) ? 0 : 1;
        ch_info = il_get_channel_info(il, il->band, chan);
@@ -1615,7 +1600,7 @@ il3945_hw_reg_comp_txpower_temp(struct il_priv *il)
        }
 
        /* send Txpower command for current channel to ucode */
-       return il->cfg->ops->lib->send_tx_power(il);
+       return il->ops->send_tx_power(il);
 }
 
 int
@@ -1662,7 +1647,7 @@ il3945_hw_reg_set_txpower(struct il_priv *il, s8 power)
 }
 
 static int
-il3945_send_rxon_assoc(struct il_priv *il, struct il_rxon_context *ctx)
+il3945_send_rxon_assoc(struct il_priv *il)
 {
        int rc = 0;
        struct il_rx_pkt *pkt;
@@ -1673,8 +1658,8 @@ il3945_send_rxon_assoc(struct il_priv *il, struct il_rxon_context *ctx)
                .flags = CMD_WANT_SKB,
                .data = &rxon_assoc,
        };
-       const struct il_rxon_cmd *rxon1 = &ctx->staging;
-       const struct il_rxon_cmd *rxon2 = &ctx->active;
+       const struct il_rxon_cmd *rxon1 = &il->staging;
+       const struct il_rxon_cmd *rxon2 = &il->active;
 
        if (rxon1->flags == rxon2->flags &&
            rxon1->filter_flags == rxon2->filter_flags &&
@@ -1684,10 +1669,10 @@ il3945_send_rxon_assoc(struct il_priv *il, struct il_rxon_context *ctx)
                return 0;
        }
 
-       rxon_assoc.flags = ctx->staging.flags;
-       rxon_assoc.filter_flags = ctx->staging.filter_flags;
-       rxon_assoc.ofdm_basic_rates = ctx->staging.ofdm_basic_rates;
-       rxon_assoc.cck_basic_rates = ctx->staging.cck_basic_rates;
+       rxon_assoc.flags = il->staging.flags;
+       rxon_assoc.filter_flags = il->staging.filter_flags;
+       rxon_assoc.ofdm_basic_rates = il->staging.ofdm_basic_rates;
+       rxon_assoc.cck_basic_rates = il->staging.cck_basic_rates;
        rxon_assoc.reserved = 0;
 
        rc = il_send_cmd_sync(il, &cmd);
@@ -1714,11 +1699,11 @@ il3945_send_rxon_assoc(struct il_priv *il, struct il_rxon_context *ctx)
  * a HW tune is required based on the RXON structure changes.
  */
 int
-il3945_commit_rxon(struct il_priv *il, struct il_rxon_context *ctx)
+il3945_commit_rxon(struct il_priv *il)
 {
        /* cast away the const for active_rxon in this function */
-       struct il3945_rxon_cmd *active_rxon = (void *)&ctx->active;
-       struct il3945_rxon_cmd *staging_rxon = (void *)&ctx->staging;
+       struct il3945_rxon_cmd *active_rxon = (void *)&il->active;
+       struct il3945_rxon_cmd *staging_rxon = (void *)&il->staging;
        int rc = 0;
        bool new_assoc = !!(staging_rxon->filter_flags & RXON_FILTER_ASSOC_MSK);
 
@@ -1735,7 +1720,7 @@ il3945_commit_rxon(struct il_priv *il, struct il_rxon_context *ctx)
        staging_rxon->flags &= ~(RXON_FLG_DIS_DIV_MSK | RXON_FLG_ANT_SEL_MSK);
        staging_rxon->flags |= il3945_get_antenna_flags(il);
 
-       rc = il_check_rxon_cmd(il, ctx);
+       rc = il_check_rxon_cmd(il);
        if (rc) {
                IL_ERR("Invalid RXON configuration.  Not committing.\n");
                return -EINVAL;
@@ -1744,8 +1729,8 @@ il3945_commit_rxon(struct il_priv *il, struct il_rxon_context *ctx)
        /* If we don't need to send a full RXON, we can use
         * il3945_rxon_assoc_cmd which is used to reconfigure filter
         * and other flags for the current radio configuration. */
-       if (!il_full_rxon_required(il, &il->ctx)) {
-               rc = il_send_rxon_assoc(il, &il->ctx);
+       if (!il_full_rxon_required(il)) {
+               rc = il_send_rxon_assoc(il);
                if (rc) {
                        IL_ERR("Error setting RXON_ASSOC "
                               "configuration (%d).\n", rc);
@@ -1776,7 +1761,7 @@ il3945_commit_rxon(struct il_priv *il, struct il_rxon_context *ctx)
                active_rxon->reserved4 = 0;
                active_rxon->reserved5 = 0;
                rc = il_send_cmd_pdu(il, C_RXON, sizeof(struct il3945_rxon_cmd),
-                                    &il->ctx.active);
+                                    &il->active);
 
                /* If the mask clearing failed then we set
                 * active_rxon back to what it was previously */
@@ -1786,8 +1771,8 @@ il3945_commit_rxon(struct il_priv *il, struct il_rxon_context *ctx)
                               "configuration (%d).\n", rc);
                        return rc;
                }
-               il_clear_ucode_stations(il, &il->ctx);
-               il_restore_stations(il, &il->ctx);
+               il_clear_ucode_stations(il);
+               il_restore_stations(il);
        }
 
        D_INFO("Sending RXON\n" "* with%s RXON_FILTER_ASSOC_MSK\n"
@@ -1801,7 +1786,7 @@ il3945_commit_rxon(struct il_priv *il, struct il_rxon_context *ctx)
        staging_rxon->reserved4 = 0;
        staging_rxon->reserved5 = 0;
 
-       il_set_rxon_hwcrypto(il, ctx, !il3945_mod_params.sw_crypto);
+       il_set_rxon_hwcrypto(il, !il3945_mod_params.sw_crypto);
 
        /* Apply the new configuration */
        rc = il_send_cmd_pdu(il, C_RXON, sizeof(struct il3945_rxon_cmd),
@@ -1814,8 +1799,8 @@ il3945_commit_rxon(struct il_priv *il, struct il_rxon_context *ctx)
        memcpy(active_rxon, staging_rxon, sizeof(*active_rxon));
 
        if (!new_assoc) {
-               il_clear_ucode_stations(il, &il->ctx);
-               il_restore_stations(il, &il->ctx);
+               il_clear_ucode_stations(il);
+               il_restore_stations(il);
        }
 
        /* If we issue a new RXON command which required a tune then we must
@@ -2185,12 +2170,14 @@ il3945_txpower_set_from_eeprom(struct il_priv *il)
 int
 il3945_hw_rxq_stop(struct il_priv *il)
 {
-       int rc;
+       int ret;
 
-       il_wr(il, FH39_RCSR_CONFIG(0), 0);
-       rc = il_poll_bit(il, FH39_RSSR_STATUS,
-                        FH39_RSSR_CHNL0_RX_STATUS_CHNL_IDLE, 1000);
-       if (rc < 0)
+       _il_wr(il, FH39_RCSR_CONFIG(0), 0);
+       ret = _il_poll_bit(il, FH39_RSSR_STATUS,
+                          FH39_RSSR_CHNL0_RX_STATUS_CHNL_IDLE,
+                          FH39_RSSR_CHNL0_RX_STATUS_CHNL_IDLE,
+                          1000);
+       if (ret < 0)
                IL_ERR("Can't stop Rx DMA.\n");
 
        return 0;
@@ -2258,7 +2245,6 @@ il3945_build_addsta_hcmd(const struct il_addsta_cmd *cmd, u8 * data)
 static int
 il3945_add_bssid_station(struct il_priv *il, const u8 * addr, u8 * sta_id_r)
 {
-       struct il_rxon_context *ctx = &il->ctx;
        int ret;
        u8 sta_id;
        unsigned long flags;
@@ -2266,7 +2252,7 @@ il3945_add_bssid_station(struct il_priv *il, const u8 * addr, u8 * sta_id_r)
        if (sta_id_r)
                *sta_id_r = IL_INVALID_STATION;
 
-       ret = il_add_station_common(il, ctx, addr, 0, NULL, &sta_id);
+       ret = il_add_station_common(il, addr, 0, NULL, &sta_id);
        if (ret) {
                IL_ERR("Unable to add station %pM\n", addr);
                return ret;
@@ -2396,15 +2382,16 @@ il3945_hw_set_hw_params(struct il_priv *il)
                return -ENOMEM;
        }
 
+       il->hw_params.bcast_id = IL3945_BROADCAST_ID;
+
        /* Assign number of Usable TX queues */
-       il->hw_params.max_txq_num = il->cfg->base_params->num_of_queues;
+       il->hw_params.max_txq_num = il->cfg->num_of_queues;
 
        il->hw_params.tfd_size = sizeof(struct il3945_tfd);
        il->hw_params.rx_page_order = get_order(IL_RX_BUF_SIZE_3K);
        il->hw_params.max_rxq_size = RX_QUEUE_SIZE;
        il->hw_params.max_rxq_log = RX_QUEUE_SIZE_LOG;
        il->hw_params.max_stations = IL3945_STATION_COUNT;
-       il->ctx.bcast_sta_id = IL3945_BROADCAST_ID;
 
        il->sta_key_max_num = STA_KEY_MAX_NUM;
 
@@ -2425,7 +2412,7 @@ il3945_hw_get_beacon_cmd(struct il_priv *il, struct il3945_frame *frame,
        tx_beacon_cmd = (struct il3945_tx_beacon_cmd *)&frame->u;
        memset(tx_beacon_cmd, 0, sizeof(*tx_beacon_cmd));
 
-       tx_beacon_cmd->tx.sta_id = il->ctx.bcast_sta_id;
+       tx_beacon_cmd->tx.sta_id = il->hw_params.bcast_id;
        tx_beacon_cmd->tx.stop_time.life_time = TX_CMD_LIFE_TIME_INFINITE;
 
        frame_size =
@@ -2632,76 +2619,31 @@ il3945_load_bsm(struct il_priv *il)
        return 0;
 }
 
-static struct il_hcmd_ops il3945_hcmd = {
-       .rxon_assoc = il3945_send_rxon_assoc,
-       .commit_rxon = il3945_commit_rxon,
-};
-
-static struct il_lib_ops il3945_lib = {
+const struct il_ops il3945_ops = {
        .txq_attach_buf_to_tfd = il3945_hw_txq_attach_buf_to_tfd,
        .txq_free_tfd = il3945_hw_txq_free_tfd,
        .txq_init = il3945_hw_tx_queue_init,
        .load_ucode = il3945_load_bsm,
        .dump_nic_error_log = il3945_dump_nic_error_log,
-       .apm_ops = {
-                   .init = il3945_apm_init,
-                   .config = il3945_nic_config,
-                   },
-       .eeprom_ops = {
-                      .regulatory_bands = {
-                                           EEPROM_REGULATORY_BAND_1_CHANNELS,
-                                           EEPROM_REGULATORY_BAND_2_CHANNELS,
-                                           EEPROM_REGULATORY_BAND_3_CHANNELS,
-                                           EEPROM_REGULATORY_BAND_4_CHANNELS,
-                                           EEPROM_REGULATORY_BAND_5_CHANNELS,
-                                           EEPROM_REGULATORY_BAND_NO_HT40,
-                                           EEPROM_REGULATORY_BAND_NO_HT40,
-                                           },
-                      .acquire_semaphore = il3945_eeprom_acquire_semaphore,
-                      .release_semaphore = il3945_eeprom_release_semaphore,
-                      },
+       .apm_init = il3945_apm_init,
        .send_tx_power = il3945_send_tx_power,
        .is_valid_rtc_data_addr = il3945_hw_valid_rtc_data_addr,
+       .eeprom_acquire_semaphore = il3945_eeprom_acquire_semaphore,
+       .eeprom_release_semaphore = il3945_eeprom_release_semaphore,
 
-#ifdef CONFIG_IWLEGACY_DEBUGFS
-       .debugfs_ops = {
-                       .rx_stats_read = il3945_ucode_rx_stats_read,
-                       .tx_stats_read = il3945_ucode_tx_stats_read,
-                       .general_stats_read = il3945_ucode_general_stats_read,
-                       },
-#endif
-};
-
-static const struct il_legacy_ops il3945_legacy_ops = {
-       .post_associate = il3945_post_associate,
-       .config_ap = il3945_config_ap,
-       .manage_ibss_station = il3945_manage_ibss_station,
-};
+       .rxon_assoc = il3945_send_rxon_assoc,
+       .commit_rxon = il3945_commit_rxon,
 
-static struct il_hcmd_utils_ops il3945_hcmd_utils = {
        .get_hcmd_size = il3945_get_hcmd_size,
        .build_addsta_hcmd = il3945_build_addsta_hcmd,
        .request_scan = il3945_request_scan,
        .post_scan = il3945_post_scan,
-};
 
-static const struct il_ops il3945_ops = {
-       .lib = &il3945_lib,
-       .hcmd = &il3945_hcmd,
-       .utils = &il3945_hcmd_utils,
-       .led = &il3945_led_ops,
-       .legacy = &il3945_legacy_ops,
-       .ieee80211_ops = &il3945_hw_ops,
-};
+       .post_associate = il3945_post_associate,
+       .config_ap = il3945_config_ap,
+       .manage_ibss_station = il3945_manage_ibss_station,
 
-static struct il_base_params il3945_base_params = {
-       .eeprom_size = IL3945_EEPROM_IMG_SIZE,
-       .num_of_queues = IL39_NUM_QUEUES,
-       .pll_cfg_val = CSR39_ANA_PLL_CFG_VAL,
-       .set_l0s = false,
-       .use_bsm = true,
-       .led_compensation = 64,
-       .wd_timeout = IL_DEF_WD_TIMEOUT,
+       .send_led_cmd = il3945_send_led_cmd,
 };
 
 static struct il_cfg il3945_bg_cfg = {
@@ -2711,10 +2653,26 @@ static struct il_cfg il3945_bg_cfg = {
        .ucode_api_min = IL3945_UCODE_API_MIN,
        .sku = IL_SKU_G,
        .eeprom_ver = EEPROM_3945_EEPROM_VERSION,
-       .ops = &il3945_ops,
        .mod_params = &il3945_mod_params,
-       .base_params = &il3945_base_params,
        .led_mode = IL_LED_BLINK,
+
+       .eeprom_size = IL3945_EEPROM_IMG_SIZE,
+       .num_of_queues = IL39_NUM_QUEUES,
+       .pll_cfg_val = CSR39_ANA_PLL_CFG_VAL,
+       .set_l0s = false,
+       .use_bsm = true,
+       .led_compensation = 64,
+       .wd_timeout = IL_DEF_WD_TIMEOUT,
+
+       .regulatory_bands = {
+               EEPROM_REGULATORY_BAND_1_CHANNELS,
+               EEPROM_REGULATORY_BAND_2_CHANNELS,
+               EEPROM_REGULATORY_BAND_3_CHANNELS,
+               EEPROM_REGULATORY_BAND_4_CHANNELS,
+               EEPROM_REGULATORY_BAND_5_CHANNELS,
+               EEPROM_REGULATORY_BAND_NO_HT40,
+               EEPROM_REGULATORY_BAND_NO_HT40,
+       },
 };
 
 static struct il_cfg il3945_abg_cfg = {
@@ -2724,10 +2682,26 @@ static struct il_cfg il3945_abg_cfg = {
        .ucode_api_min = IL3945_UCODE_API_MIN,
        .sku = IL_SKU_A | IL_SKU_G,
        .eeprom_ver = EEPROM_3945_EEPROM_VERSION,
-       .ops = &il3945_ops,
        .mod_params = &il3945_mod_params,
-       .base_params = &il3945_base_params,
        .led_mode = IL_LED_BLINK,
+
+       .eeprom_size = IL3945_EEPROM_IMG_SIZE,
+       .num_of_queues = IL39_NUM_QUEUES,
+       .pll_cfg_val = CSR39_ANA_PLL_CFG_VAL,
+       .set_l0s = false,
+       .use_bsm = true,
+       .led_compensation = 64,
+       .wd_timeout = IL_DEF_WD_TIMEOUT,
+
+       .regulatory_bands = {
+               EEPROM_REGULATORY_BAND_1_CHANNELS,
+               EEPROM_REGULATORY_BAND_2_CHANNELS,
+               EEPROM_REGULATORY_BAND_3_CHANNELS,
+               EEPROM_REGULATORY_BAND_4_CHANNELS,
+               EEPROM_REGULATORY_BAND_5_CHANNELS,
+               EEPROM_REGULATORY_BAND_NO_HT40,
+               EEPROM_REGULATORY_BAND_NO_HT40,
+       },
 };
 
 DEFINE_PCI_DEVICE_TABLE(il3945_hw_card_ids) = {
index 9f42f79..1d45075 100644 (file)
@@ -36,6 +36,8 @@ extern const struct pci_device_id il3945_hw_card_ids[];
 
 #include "common.h"
 
+extern const struct il_ops il3945_ops;
+
 /* Highest firmware API version supported */
 #define IL3945_UCODE_API_MAX 2
 
@@ -249,7 +251,7 @@ extern int il4965_get_temperature(const struct il_priv *il);
 extern void il3945_post_associate(struct il_priv *il);
 extern void il3945_config_ap(struct il_priv *il);
 
-extern int il3945_commit_rxon(struct il_priv *il, struct il_rxon_context *ctx);
+extern int il3945_commit_rxon(struct il_priv *il);
 
 /**
  * il3945_hw_find_station - Find station id for a given BSSID
@@ -261,8 +263,6 @@ extern int il3945_commit_rxon(struct il_priv *il, struct il_rxon_context *ctx);
  */
 extern u8 il3945_hw_find_station(struct il_priv *il, const u8 * bssid);
 
-extern struct ieee80211_ops il3945_hw_ops;
-
 extern __le32 il3945_get_antenna_flags(const struct il_priv *il);
 extern int il3945_init_hw_rate_table(struct il_priv *il);
 extern void il3945_reg_txpower_periodic(struct il_priv *il);
@@ -595,13 +595,7 @@ struct il3945_tfd {
 } __packed;
 
 #ifdef CONFIG_IWLEGACY_DEBUGFS
-ssize_t il3945_ucode_rx_stats_read(struct file *file, char __user *user_buf,
-                                  size_t count, loff_t *ppos);
-ssize_t il3945_ucode_tx_stats_read(struct file *file, char __user *user_buf,
-                                  size_t count, loff_t *ppos);
-ssize_t il3945_ucode_general_stats_read(struct file *file,
-                                       char __user *user_buf, size_t count,
-                                       loff_t *ppos);
+extern const struct il_debugfs_ops il3945_debugfs_ops;
 #endif
 
 #endif
index d3248e3..e78bdef 100644 (file)
@@ -79,18 +79,6 @@ struct stats_general_data {
        u32 beacon_energy_c;
 };
 
-void
-il4965_calib_free_results(struct il_priv *il)
-{
-       int i;
-
-       for (i = 0; i < IL_CALIB_MAX; i++) {
-               kfree(il->calib_results[i].buf);
-               il->calib_results[i].buf = NULL;
-               il->calib_results[i].buf_len = 0;
-       }
-}
-
 /*****************************************************************************
  * RUNTIME calibrations framework
  *****************************************************************************/
@@ -627,13 +615,13 @@ il4965_find_disconn_antenna(struct il_priv *il, u32 * average_sig,
 
        average_sig[0] =
            data->chain_signal_a /
-           il->cfg->base_params->chain_noise_num_beacons;
+           il->cfg->chain_noise_num_beacons;
        average_sig[1] =
            data->chain_signal_b /
-           il->cfg->base_params->chain_noise_num_beacons;
+           il->cfg->chain_noise_num_beacons;
        average_sig[2] =
            data->chain_signal_c /
-           il->cfg->base_params->chain_noise_num_beacons;
+           il->cfg->chain_noise_num_beacons;
 
        if (average_sig[0] >= average_sig[1]) {
                max_average_sig = average_sig[0];
@@ -806,8 +794,6 @@ il4965_chain_noise_calibration(struct il_priv *il, void *stat_resp)
        unsigned long flags;
        struct stats_rx_non_phy *rx_info;
 
-       struct il_rxon_context *ctx = &il->ctx;
-
        if (il->disable_chain_noise_cal)
                return;
 
@@ -833,8 +819,8 @@ il4965_chain_noise_calibration(struct il_priv *il, void *stat_resp)
                return;
        }
 
-       rxon_band24 = !!(ctx->staging.flags & RXON_FLG_BAND_24G_MSK);
-       rxon_chnum = le16_to_cpu(ctx->staging.channel);
+       rxon_band24 = !!(il->staging.flags & RXON_FLG_BAND_24G_MSK);
+       rxon_chnum = le16_to_cpu(il->staging.channel);
 
        stat_band24 =
            !!(((struct il_notif_stats *)stat_resp)->
@@ -888,7 +874,7 @@ il4965_chain_noise_calibration(struct il_priv *il, void *stat_resp)
        /* If this is the "chain_noise_num_beacons", determine:
         * 1)  Disconnected antennas (using signal strengths)
         * 2)  Differential gain (using silence noise) to balance receivers */
-       if (data->beacon_count != il->cfg->base_params->chain_noise_num_beacons)
+       if (data->beacon_count != il->cfg->chain_noise_num_beacons)
                return;
 
        /* Analyze signal for disconnected antenna */
@@ -896,11 +882,11 @@ il4965_chain_noise_calibration(struct il_priv *il, void *stat_resp)
 
        /* Analyze noise for rx balance */
        average_noise[0] =
-           data->chain_noise_a / il->cfg->base_params->chain_noise_num_beacons;
+           data->chain_noise_a / il->cfg->chain_noise_num_beacons;
        average_noise[1] =
-           data->chain_noise_b / il->cfg->base_params->chain_noise_num_beacons;
+           data->chain_noise_b / il->cfg->chain_noise_num_beacons;
        average_noise[2] =
-           data->chain_noise_c / il->cfg->base_params->chain_noise_num_beacons;
+           data->chain_noise_c / il->cfg->chain_noise_num_beacons;
 
        for (i = 0; i < NUM_RX_CHAINS; i++) {
                if (!data->disconn_array[i] &&
@@ -925,8 +911,8 @@ il4965_chain_noise_calibration(struct il_priv *il, void *stat_resp)
        /* Some power changes may have been made during the calibration.
         * Update and commit the RXON
         */
-       if (il->cfg->ops->lib->update_chain_flags)
-               il->cfg->ops->lib->update_chain_flags(il);
+       if (il->ops->update_chain_flags)
+               il->ops->update_chain_flags(il);
 
        data->state = IL_CHAIN_NOISE_DONE;
        il_power_update_mode(il, false);
index 98ec39f..c8153fc 100644 (file)
@@ -744,3 +744,9 @@ il4965_ucode_general_stats_read(struct file *file, char __user *user_buf,
        kfree(buf);
        return ret;
 }
+
+const struct il_debugfs_ops il4965_debugfs_ops = {
+       .rx_stats_read = il4965_ucode_rx_stats_read,
+       .tx_stats_read = il4965_ucode_tx_stats_read,
+       .general_stats_read = il4965_ucode_general_stats_read,
+};
index 1667232..7b54dbb 100644 (file)
@@ -199,18 +199,14 @@ il4965_hw_nic_init(struct il_priv *il)
        struct il_rx_queue *rxq = &il->rxq;
        int ret;
 
-       /* nic_init */
        spin_lock_irqsave(&il->lock, flags);
-       il->cfg->ops->lib->apm_ops.init(il);
-
+       il_apm_init(il);
        /* Set interrupt coalescing calibration timer to default (512 usecs) */
        il_write8(il, CSR_INT_COALESCING, IL_HOST_INT_CALIB_TIMEOUT_DEF);
-
        spin_unlock_irqrestore(&il->lock, flags);
 
        il4965_set_pwr_vmain(il);
-
-       il->cfg->ops->lib->apm_ops.config(il);
+       il4965_nic_config(il);
 
        /* Allocate the RX queue, or reset if it is already allocated */
        if (!rxq->bd) {
@@ -445,11 +441,15 @@ il4965_rx_queue_free(struct il_priv *il, struct il_rx_queue *rxq)
 int
 il4965_rxq_stop(struct il_priv *il)
 {
+       int ret;
 
-       /* stop Rx DMA */
-       il_wr(il, FH49_MEM_RCSR_CHNL0_CONFIG_REG, 0);
-       il_poll_bit(il, FH49_MEM_RSSR_RX_STATUS_REG,
-                   FH49_RSSR_CHNL0_RX_STATUS_CHNL_IDLE, 1000);
+       _il_wr(il, FH49_MEM_RCSR_CHNL0_CONFIG_REG, 0);
+       ret = _il_poll_bit(il, FH49_MEM_RSSR_RX_STATUS_REG,
+                          FH49_RSSR_CHNL0_RX_STATUS_CHNL_IDLE,
+                          FH49_RSSR_CHNL0_RX_STATUS_CHNL_IDLE,
+                          1000);
+       if (ret < 0)
+               IL_ERR("Can't stop Rx DMA.\n");
 
        return 0;
 }
@@ -692,7 +692,6 @@ il4965_hdl_rx(struct il_priv *il, struct il_rx_buf *rxb)
        /* Find max signal strength (dBm) among 3 antenna/receiver chains */
        rx_status.signal = il4965_calc_rssi(il, phy_res);
 
-       il_dbg_log_rx_data_frame(il, len, header);
        D_STATS("Rssi %d, TSF %llu\n", rx_status.signal,
                (unsigned long long)rx_status.mactime);
 
@@ -843,7 +842,6 @@ il4965_request_scan(struct il_priv *il, struct ieee80211_vif *vif)
                .flags = CMD_SIZE_HUGE,
        };
        struct il_scan_cmd *scan;
-       struct il_rxon_context *ctx = &il->ctx;
        u32 rate_flags = 0;
        u16 cmd_len;
        u16 rx_chain = 0;
@@ -859,8 +857,6 @@ il4965_request_scan(struct il_priv *il, struct ieee80211_vif *vif)
 
        lockdep_assert_held(&il->mutex);
 
-       ctx = il_rxon_ctx_from_vif(vif);
-
        if (!il->scan_cmd) {
                il->scan_cmd =
                    kmalloc(sizeof(struct il_scan_cmd) + IL_MAX_SCAN_SIZE,
@@ -919,15 +915,14 @@ il4965_request_scan(struct il_priv *il, struct ieee80211_vif *vif)
                D_SCAN("Start passive scan.\n");
 
        scan->tx_cmd.tx_flags = TX_CMD_FLG_SEQ_CTL_MSK;
-       scan->tx_cmd.sta_id = ctx->bcast_sta_id;
+       scan->tx_cmd.sta_id = il->hw_params.bcast_id;
        scan->tx_cmd.stop_time.life_time = TX_CMD_LIFE_TIME_INFINITE;
 
        switch (il->scan_band) {
        case IEEE80211_BAND_2GHZ:
                scan->flags = RXON_FLG_BAND_24G_MSK | RXON_FLG_AUTO_DETECT_MSK;
                chan_mod =
-                   le32_to_cpu(il->ctx.active.
-                               flags & RXON_FLG_CHANNEL_MODE_MSK) >>
+                   le32_to_cpu(il->active.flags & RXON_FLG_CHANNEL_MODE_MSK) >>
                    RXON_FLG_CHANNEL_MODE_POS;
                if (chan_mod == CHANNEL_MODE_PURE_40) {
                        rate = RATE_6M_PLCP;
@@ -1034,8 +1029,7 @@ il4965_manage_ibss_station(struct il_priv *il, struct ieee80211_vif *vif,
        struct il_vif_priv *vif_priv = (void *)vif->drv_priv;
 
        if (add)
-               return il4965_add_bssid_station(il, vif_priv->ctx,
-                                               vif->bss_conf.bssid,
+               return il4965_add_bssid_station(il, vif->bss_conf.bssid,
                                                &vif_priv->ibss_bssid_sta_id);
        return il_remove_station(il, vif_priv->ibss_bssid_sta_id,
                                 vif->bss_conf.bssid);
@@ -1128,7 +1122,7 @@ il4965_count_chain_bitmap(u32 chain_bitmap)
  * This should not be used for scan command ... it puts data in wrong place.
  */
 void
-il4965_set_rxon_chain(struct il_priv *il, struct il_rxon_context *ctx)
+il4965_set_rxon_chain(struct il_priv *il)
 {
        bool is_single = il4965_is_single_rx_stream(il);
        bool is_cam = !test_bit(S_POWER_PMI, &il->status);
@@ -1164,14 +1158,14 @@ il4965_set_rxon_chain(struct il_priv *il, struct il_rxon_context *ctx)
        rx_chain |= active_rx_cnt << RXON_RX_CHAIN_MIMO_CNT_POS;
        rx_chain |= idle_rx_cnt << RXON_RX_CHAIN_CNT_POS;
 
-       ctx->staging.rx_chain = cpu_to_le16(rx_chain);
+       il->staging.rx_chain = cpu_to_le16(rx_chain);
 
        if (!is_single && active_rx_cnt >= IL_NUM_RX_CHAINS_SINGLE && is_cam)
-               ctx->staging.rx_chain |= RXON_RX_CHAIN_MIMO_FORCE_MSK;
+               il->staging.rx_chain |= RXON_RX_CHAIN_MIMO_FORCE_MSK;
        else
-               ctx->staging.rx_chain &= ~RXON_RX_CHAIN_MIMO_FORCE_MSK;
+               il->staging.rx_chain &= ~RXON_RX_CHAIN_MIMO_FORCE_MSK;
 
-       D_ASSOC("rx_chain=0x%X active=%d idle=%d\n", ctx->staging.rx_chain,
+       D_ASSOC("rx_chain=0x%X active=%d idle=%d\n", il->staging.rx_chain,
                active_rx_cnt, idle_rx_cnt);
 
        WARN_ON(active_rx_cnt == 0 || idle_rx_cnt == 0 ||
@@ -1348,12 +1342,11 @@ il4965_accumulative_stats(struct il_priv *il, __le32 * stats)
 }
 #endif
 
-#define REG_RECALIB_PERIOD (60)
-
 void
 il4965_hdl_stats(struct il_priv *il, struct il_rx_buf *rxb)
 {
-       int change;
+       const int recalib_seconds = 60;
+       bool change;
        struct il_rx_pkt *pkt = rxb_addr(rxb);
 
        D_RX("Statistics notification received (%d vs %d).\n",
@@ -1374,20 +1367,21 @@ il4965_hdl_stats(struct il_priv *il, struct il_rx_buf *rxb)
 
        set_bit(S_STATS, &il->status);
 
-       /* Reschedule the stats timer to occur in
-        * REG_RECALIB_PERIOD seconds to ensure we get a
-        * thermal update even if the uCode doesn't give
-        * us one */
+       /*
+        * Reschedule the stats timer to occur in recalib_seconds to ensure
+        * we get a thermal update even if the uCode doesn't give us one
+        */
        mod_timer(&il->stats_periodic,
-                 jiffies + msecs_to_jiffies(REG_RECALIB_PERIOD * 1000));
+                 jiffies + msecs_to_jiffies(recalib_seconds * 1000));
 
        if (unlikely(!test_bit(S_SCANNING, &il->status)) &&
            (pkt->hdr.cmd == N_STATS)) {
                il4965_rx_calc_noise(il);
                queue_work(il->workqueue, &il->run_time_calib_work);
        }
-       if (il->cfg->ops->lib->temp_ops.temperature && change)
-               il->cfg->ops->lib->temp_ops.temperature(il);
+
+       if (change)
+               il4965_temperature_calib(il);
 }
 
 void
@@ -1457,10 +1451,17 @@ il4965_get_ac_from_tid(u16 tid)
 }
 
 static inline int
-il4965_get_fifo_from_tid(struct il_rxon_context *ctx, u16 tid)
+il4965_get_fifo_from_tid(u16 tid)
 {
+       const u8 ac_to_fifo[] = {
+               IL_TX_FIFO_VO,
+               IL_TX_FIFO_VI,
+               IL_TX_FIFO_BE,
+               IL_TX_FIFO_BK,
+       };
+
        if (likely(tid < ARRAY_SIZE(tid_to_ac)))
-               return ctx->ac_to_fifo[tid_to_ac[tid]];
+               return ac_to_fifo[tid_to_ac[tid]];
 
        /* no support for TIDs 8-15 yet */
        return -EINVAL;
@@ -1639,7 +1640,6 @@ il4965_tx_skb(struct il_priv *il, struct sk_buff *skb)
        struct il_device_cmd *out_cmd;
        struct il_cmd_meta *out_meta;
        struct il_tx_cmd *tx_cmd;
-       struct il_rxon_context *ctx = &il->ctx;
        int txq_id;
        dma_addr_t phys_addr;
        dma_addr_t txcmd_phys;
@@ -1655,9 +1655,6 @@ il4965_tx_skb(struct il_priv *il, struct sk_buff *skb)
        unsigned long flags;
        bool is_agg = false;
 
-       if (info->control.vif)
-               ctx = il_rxon_ctx_from_vif(info->control.vif);
-
        spin_lock_irqsave(&il->lock, flags);
        if (il_is_rfkill(il)) {
                D_DROP("Dropping - RF KILL\n");
@@ -1679,10 +1676,10 @@ il4965_tx_skb(struct il_priv *il, struct sk_buff *skb)
 
        /* For management frames use broadcast id to do not break aggregation */
        if (!ieee80211_is_data(fc))
-               sta_id = ctx->bcast_sta_id;
+               sta_id = il->hw_params.bcast_id;
        else {
                /* Find idx into station table for destination station */
-               sta_id = il_sta_id_or_broadcast(il, ctx, info->control.sta);
+               sta_id = il_sta_id_or_broadcast(il, info->control.sta);
 
                if (sta_id == IL_INVALID_STATION) {
                        D_DROP("Dropping - INVALID STATION: %pM\n", hdr->addr1);
@@ -1696,7 +1693,7 @@ il4965_tx_skb(struct il_priv *il, struct sk_buff *skb)
                sta_priv = (void *)sta->drv_priv;
 
        if (sta_priv && sta_priv->asleep &&
-           (info->flags & IEEE80211_TX_CTL_POLL_RESPONSE)) {
+           (info->flags & IEEE80211_TX_CTL_NO_PS_BUFFER)) {
                /*
                 * This sends an asynchronous command to the device,
                 * but we can rely on it being processed before the
@@ -1709,19 +1706,11 @@ il4965_tx_skb(struct il_priv *il, struct sk_buff *skb)
                il4965_sta_modify_sleep_tx_count(il, sta_id, 1);
        }
 
-       /*
-        * Send this frame after DTIM -- there's a special queue
-        * reserved for this for contexts that support AP mode.
-        */
-       if (info->flags & IEEE80211_TX_CTL_SEND_AFTER_DTIM) {
-               txq_id = ctx->mcast_queue;
-               /*
-                * The microcode will clear the more data
-                * bit in the last frame it transmits.
-                */
-               hdr->frame_control |= cpu_to_le16(IEEE80211_FCTL_MOREDATA);
-       } else
-               txq_id = ctx->ac_to_queue[skb_get_queue_mapping(skb)];
+       /* FIXME: remove me ? */
+       WARN_ON_ONCE(info->flags & IEEE80211_TX_CTL_SEND_AFTER_DTIM);
+
+       /* Access category (AC) is also the queue number */
+       txq_id = skb_get_queue_mapping(skb);
 
        /* irqs already disabled/saved above when locking il->lock */
        spin_lock(&il->sta_lock);
@@ -1763,10 +1752,7 @@ il4965_tx_skb(struct il_priv *il, struct sk_buff *skb)
 
        spin_unlock(&il->sta_lock);
 
-       /* Set up driver data for this TFD */
-       memset(&(txq->txb[q->write_ptr]), 0, sizeof(struct il_tx_info));
-       txq->txb[q->write_ptr].skb = skb;
-       txq->txb[q->write_ptr].ctx = ctx;
+       txq->skbs[q->write_ptr] = skb;
 
        /* Set up first empty entry in queue's array of Tx/cmd buffers */
        out_cmd = txq->cmd[q->write_ptr];
@@ -1798,7 +1784,6 @@ il4965_tx_skb(struct il_priv *il, struct sk_buff *skb)
 
        /* TODO need this for burst mode later on */
        il4965_tx_cmd_build_basic(il, skb, tx_cmd, info, hdr, sta_id);
-       il_dbg_log_tx_data_frame(il, len, hdr);
 
        il4965_tx_cmd_build_rate(il, tx_cmd, info, fc);
 
@@ -1828,8 +1813,7 @@ il4965_tx_skb(struct il_priv *il, struct sk_buff *skb)
        dma_unmap_len_set(out_meta, len, firstlen);
        /* Add buffer containing Tx command and MAC(!) header to TFD's
         * first entry */
-       il->cfg->ops->lib->txq_attach_buf_to_tfd(il, txq, txcmd_phys, firstlen,
-                                                1, 0);
+       il->ops->txq_attach_buf_to_tfd(il, txq, txcmd_phys, firstlen, 1, 0);
 
        if (!ieee80211_has_morefrags(hdr->frame_control)) {
                txq->need_update = 1;
@@ -1845,8 +1829,8 @@ il4965_tx_skb(struct il_priv *il, struct sk_buff *skb)
                phys_addr =
                    pci_map_single(il->pci_dev, skb->data + hdr_len, secondlen,
                                   PCI_DMA_TODEVICE);
-               il->cfg->ops->lib->txq_attach_buf_to_tfd(il, txq, phys_addr,
-                                                        secondlen, 0, 0);
+               il->ops->txq_attach_buf_to_tfd(il, txq, phys_addr, secondlen,
+                                              0, 0);
        }
 
        scratch_phys =
@@ -1866,9 +1850,7 @@ il4965_tx_skb(struct il_priv *il, struct sk_buff *skb)
 
        /* Set up entry for this TFD in Tx byte-count array */
        if (info->flags & IEEE80211_TX_CTL_AMPDU)
-               il->cfg->ops->lib->txq_update_byte_cnt_tbl(il, txq,
-                                                          le16_to_cpu(tx_cmd->
-                                                                      len));
+               il->ops->txq_update_byte_cnt_tbl(il, txq, le16_to_cpu(tx_cmd->len));
 
        pci_dma_sync_single_for_device(il->pci_dev, txcmd_phys, firstlen,
                                       PCI_DMA_BIDIRECTIONAL);
@@ -1957,7 +1939,7 @@ il4965_hw_txq_ctx_free(struct il_priv *il)
        il4965_free_dma_ptr(il, &il->scd_bc_tbls);
 
        /* free tx queue structure */
-       il_txq_mem(il);
+       il_free_txq_mem(il);
 }
 
 /**
@@ -1970,8 +1952,7 @@ il4965_hw_txq_ctx_free(struct il_priv *il)
 int
 il4965_txq_ctx_alloc(struct il_priv *il)
 {
-       int ret;
-       int txq_id, slots_num;
+       int ret, txq_id;
        unsigned long flags;
 
        /* Free all tx/cmd queues and keep-warm buffer */
@@ -2008,10 +1989,7 @@ il4965_txq_ctx_alloc(struct il_priv *il)
 
        /* Alloc and init all Tx queues, including the command queue (#4/#9) */
        for (txq_id = 0; txq_id < il->hw_params.max_txq_num; txq_id++) {
-               slots_num =
-                   (txq_id ==
-                    il->cmd_queue) ? TFD_CMD_SLOTS : TFD_TX_CMD_SLOTS;
-               ret = il_tx_queue_init(il, &il->txq[txq_id], slots_num, txq_id);
+               ret = il_tx_queue_init(il, txq_id);
                if (ret) {
                        IL_ERR("Tx %d queue init failed\n", txq_id);
                        goto error;
@@ -2032,52 +2010,27 @@ error_bc_tbls:
 void
 il4965_txq_ctx_reset(struct il_priv *il)
 {
-       int txq_id, slots_num;
+       int txq_id;
        unsigned long flags;
 
        spin_lock_irqsave(&il->lock, flags);
 
        /* Turn off all Tx DMA fifos */
        il4965_txq_set_sched(il, 0);
-
        /* Tell NIC where to find the "keep warm" buffer */
        il_wr(il, FH49_KW_MEM_ADDR_REG, il->kw.dma >> 4);
 
        spin_unlock_irqrestore(&il->lock, flags);
 
        /* Alloc and init all Tx queues, including the command queue (#4) */
-       for (txq_id = 0; txq_id < il->hw_params.max_txq_num; txq_id++) {
-               slots_num =
-                   txq_id == il->cmd_queue ? TFD_CMD_SLOTS : TFD_TX_CMD_SLOTS;
-               il_tx_queue_reset(il, &il->txq[txq_id], slots_num, txq_id);
-       }
+       for (txq_id = 0; txq_id < il->hw_params.max_txq_num; txq_id++)
+               il_tx_queue_reset(il, txq_id);
 }
 
-/**
- * il4965_txq_ctx_stop - Stop all Tx DMA channels
- */
 void
-il4965_txq_ctx_stop(struct il_priv *il)
+il4965_txq_ctx_unmap(struct il_priv *il)
 {
-       int ch, txq_id;
-       unsigned long flags;
-
-       /* Turn off all Tx DMA fifos */
-       spin_lock_irqsave(&il->lock, flags);
-
-       il4965_txq_set_sched(il, 0);
-
-       /* Stop each Tx DMA channel, and wait for it to be idle */
-       for (ch = 0; ch < il->hw_params.dma_chnl_num; ch++) {
-               il_wr(il, FH49_TCSR_CHNL_TX_CONFIG_REG(ch), 0x0);
-               if (il_poll_bit
-                   (il, FH49_TSSR_TX_STATUS_REG,
-                    FH49_TSSR_TX_STATUS_REG_MSK_CHNL_IDLE(ch), 1000))
-                       IL_ERR("Failing on timeout while stopping"
-                              " DMA channel %d [0x%08x]", ch,
-                              il_rd(il, FH49_TSSR_TX_STATUS_REG));
-       }
-       spin_unlock_irqrestore(&il->lock, flags);
+       int txq_id;
 
        if (!il->txq)
                return;
@@ -2090,6 +2043,30 @@ il4965_txq_ctx_stop(struct il_priv *il)
                        il_tx_queue_unmap(il, txq_id);
 }
 
+/**
+ * il4965_txq_ctx_stop - Stop all Tx DMA channels
+ */
+void
+il4965_txq_ctx_stop(struct il_priv *il)
+{
+       int ch, ret;
+
+       _il_wr_prph(il, IL49_SCD_TXFACT, 0);
+
+       /* Stop each Tx DMA channel, and wait for it to be idle */
+       for (ch = 0; ch < il->hw_params.dma_chnl_num; ch++) {
+               _il_wr(il, FH49_TCSR_CHNL_TX_CONFIG_REG(ch), 0x0);
+               ret =
+                   _il_poll_bit(il, FH49_TSSR_TX_STATUS_REG,
+                                FH49_TSSR_TX_STATUS_REG_MSK_CHNL_IDLE(ch),
+                                FH49_TSSR_TX_STATUS_REG_MSK_CHNL_IDLE(ch),
+                                1000);
+               if (ret < 0)
+                       IL_ERR("Timeout stopping DMA channel %d [0x%08x]",
+                              ch, _il_rd(il, FH49_TSSR_TX_STATUS_REG));
+       }
+}
+
 /*
  * Find first available (lowest unused) Tx Queue, mark it "active".
  * Called only when finding queue for aggregation.
@@ -2163,11 +2140,11 @@ il4965_txq_agg_enable(struct il_priv *il, int txq_id, int tx_fifo, int sta_id,
 
        if ((IL49_FIRST_AMPDU_QUEUE > txq_id) ||
            (IL49_FIRST_AMPDU_QUEUE +
-            il->cfg->base_params->num_of_ampdu_queues <= txq_id)) {
+            il->cfg->num_of_ampdu_queues <= txq_id)) {
                IL_WARN("queue number out of range: %d, must be %d to %d\n",
                        txq_id, IL49_FIRST_AMPDU_QUEUE,
                        IL49_FIRST_AMPDU_QUEUE +
-                       il->cfg->base_params->num_of_ampdu_queues - 1);
+                       il->cfg->num_of_ampdu_queues - 1);
                return -EINVAL;
        }
 
@@ -2230,7 +2207,8 @@ il4965_tx_agg_start(struct il_priv *il, struct ieee80211_vif *vif,
        unsigned long flags;
        struct il_tid_data *tid_data;
 
-       tx_fifo = il4965_get_fifo_from_tid(il_rxon_ctx_from_vif(vif), tid);
+       /* FIXME: warning if tx fifo not found ? */
+       tx_fifo = il4965_get_fifo_from_tid(tid);
        if (unlikely(tx_fifo < 0))
                return tx_fifo;
 
@@ -2290,11 +2268,11 @@ il4965_txq_agg_disable(struct il_priv *il, u16 txq_id, u16 ssn_idx, u8 tx_fifo)
 {
        if ((IL49_FIRST_AMPDU_QUEUE > txq_id) ||
            (IL49_FIRST_AMPDU_QUEUE +
-            il->cfg->base_params->num_of_ampdu_queues <= txq_id)) {
+            il->cfg->num_of_ampdu_queues <= txq_id)) {
                IL_WARN("queue number out of range: %d, must be %d to %d\n",
                        txq_id, IL49_FIRST_AMPDU_QUEUE,
                        IL49_FIRST_AMPDU_QUEUE +
-                       il->cfg->base_params->num_of_ampdu_queues - 1);
+                       il->cfg->num_of_ampdu_queues - 1);
                return -EINVAL;
        }
 
@@ -2323,7 +2301,8 @@ il4965_tx_agg_stop(struct il_priv *il, struct ieee80211_vif *vif,
        int write_ptr, read_ptr;
        unsigned long flags;
 
-       tx_fifo_id = il4965_get_fifo_from_tid(il_rxon_ctx_from_vif(vif), tid);
+       /* FIXME: warning if tx_fifo_id not found ? */
+       tx_fifo_id = il4965_get_fifo_from_tid(tid);
        if (unlikely(tx_fifo_id < 0))
                return tx_fifo_id;
 
@@ -2397,9 +2376,6 @@ il4965_txq_check_empty(struct il_priv *il, int sta_id, u8 tid, int txq_id)
        struct il_queue *q = &il->txq[txq_id].q;
        u8 *addr = il->stations[sta_id].sta.sta.addr;
        struct il_tid_data *tid_data = &il->stations[sta_id].tid[tid];
-       struct il_rxon_context *ctx;
-
-       ctx = &il->ctx;
 
        lockdep_assert_held(&il->sta_lock);
 
@@ -2410,11 +2386,11 @@ il4965_txq_check_empty(struct il_priv *il, int sta_id, u8 tid, int txq_id)
                if (txq_id == tid_data->agg.txq_id &&
                    q->read_ptr == q->write_ptr) {
                        u16 ssn = SEQ_TO_SN(tid_data->seq_number);
-                       int tx_fifo = il4965_get_fifo_from_tid(ctx, tid);
+                       int tx_fifo = il4965_get_fifo_from_tid(tid);
                        D_HT("HW queue empty: continue DELBA flow\n");
                        il4965_txq_agg_disable(il, txq_id, ssn, tx_fifo);
                        tid_data->agg.state = IL_AGG_OFF;
-                       ieee80211_stop_tx_ba_cb_irqsafe(ctx->vif, addr, tid);
+                       ieee80211_stop_tx_ba_cb_irqsafe(il->vif, addr, tid);
                }
                break;
        case IL_EMPTYING_HW_QUEUE_ADDBA:
@@ -2422,7 +2398,7 @@ il4965_txq_check_empty(struct il_priv *il, int sta_id, u8 tid, int txq_id)
                if (tid_data->tfds_in_queue == 0) {
                        D_HT("HW queue empty: continue ADDBA flow\n");
                        tid_data->agg.state = IL_AGG_ON;
-                       ieee80211_start_tx_ba_cb_irqsafe(ctx->vif, addr, tid);
+                       ieee80211_start_tx_ba_cb_irqsafe(il->vif, addr, tid);
                }
                break;
        }
@@ -2431,14 +2407,13 @@ il4965_txq_check_empty(struct il_priv *il, int sta_id, u8 tid, int txq_id)
 }
 
 static void
-il4965_non_agg_tx_status(struct il_priv *il, struct il_rxon_context *ctx,
-                        const u8 *addr1)
+il4965_non_agg_tx_status(struct il_priv *il, const u8 *addr1)
 {
        struct ieee80211_sta *sta;
        struct il_station_priv *sta_priv;
 
        rcu_read_lock();
-       sta = ieee80211_find_sta(ctx->vif, addr1);
+       sta = ieee80211_find_sta(il->vif, addr1);
        if (sta) {
                sta_priv = (void *)sta->drv_priv;
                /* avoid atomic ops if this isn't a client */
@@ -2450,14 +2425,14 @@ il4965_non_agg_tx_status(struct il_priv *il, struct il_rxon_context *ctx,
 }
 
 static void
-il4965_tx_status(struct il_priv *il, struct il_tx_info *tx_info, bool is_agg)
+il4965_tx_status(struct il_priv *il, struct sk_buff *skb, bool is_agg)
 {
-       struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)tx_info->skb->data;
+       struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
 
        if (!is_agg)
-               il4965_non_agg_tx_status(il, tx_info->ctx, hdr->addr1);
+               il4965_non_agg_tx_status(il, hdr->addr1);
 
-       ieee80211_tx_status_irqsafe(il->hw, tx_info->skb);
+       ieee80211_tx_status_irqsafe(il->hw, skb);
 }
 
 int
@@ -2465,9 +2440,9 @@ il4965_tx_queue_reclaim(struct il_priv *il, int txq_id, int idx)
 {
        struct il_tx_queue *txq = &il->txq[txq_id];
        struct il_queue *q = &txq->q;
-       struct il_tx_info *tx_info;
        int nfreed = 0;
        struct ieee80211_hdr *hdr;
+       struct sk_buff *skb;
 
        if (idx >= q->n_bd || il_queue_used(q, idx) == 0) {
                IL_ERR("Read idx for DMA queue txq id (%d), idx %d, "
@@ -2479,20 +2454,19 @@ il4965_tx_queue_reclaim(struct il_priv *il, int txq_id, int idx)
        for (idx = il_queue_inc_wrap(idx, q->n_bd); q->read_ptr != idx;
             q->read_ptr = il_queue_inc_wrap(q->read_ptr, q->n_bd)) {
 
-               tx_info = &txq->txb[txq->q.read_ptr];
+               skb = txq->skbs[txq->q.read_ptr];
 
-               if (WARN_ON_ONCE(tx_info->skb == NULL))
+               if (WARN_ON_ONCE(skb == NULL))
                        continue;
 
-               hdr = (struct ieee80211_hdr *)tx_info->skb->data;
+               hdr = (struct ieee80211_hdr *) skb->data;
                if (ieee80211_is_data_qos(hdr->frame_control))
                        nfreed++;
 
-               il4965_tx_status(il, tx_info,
-                                txq_id >= IL4965_FIRST_AMPDU_QUEUE);
-               tx_info->skb = NULL;
+               il4965_tx_status(il, skb, txq_id >= IL4965_FIRST_AMPDU_QUEUE);
 
-               il->cfg->ops->lib->txq_free_tfd(il, txq);
+               txq->skbs[txq->q.read_ptr] = NULL;
+               il->ops->txq_free_tfd(il, txq);
        }
        return nfreed;
 }
@@ -2555,7 +2529,7 @@ il4965_tx_status_reply_compressed_ba(struct il_priv *il, struct il_ht_agg *agg,
 
        D_TX_REPLY("Bitmap %llx\n", (unsigned long long)bitmap);
 
-       info = IEEE80211_SKB_CB(il->txq[scd_flow].txb[agg->start_idx].skb);
+       info = IEEE80211_SKB_CB(il->txq[scd_flow].skbs[agg->start_idx]);
        memset(&info->status, 0, sizeof(info->status));
        info->flags |= IEEE80211_TX_STAT_ACK;
        info->flags |= IEEE80211_TX_STAT_AMPDU;
@@ -2566,6 +2540,308 @@ il4965_tx_status_reply_compressed_ba(struct il_priv *il, struct il_ht_agg *agg,
        return 0;
 }
 
+static inline bool
+il4965_is_tx_success(u32 status)
+{
+       status &= TX_STATUS_MSK;
+       return (status == TX_STATUS_SUCCESS || status == TX_STATUS_DIRECT_DONE);
+}
+
+static u8
+il4965_find_station(struct il_priv *il, const u8 *addr)
+{
+       int i;
+       int start = 0;
+       int ret = IL_INVALID_STATION;
+       unsigned long flags;
+
+       if (il->iw_mode == NL80211_IFTYPE_ADHOC)
+               start = IL_STA_ID;
+
+       if (is_broadcast_ether_addr(addr))
+               return il->hw_params.bcast_id;
+
+       spin_lock_irqsave(&il->sta_lock, flags);
+       for (i = start; i < il->hw_params.max_stations; i++)
+               if (il->stations[i].used &&
+                   (!compare_ether_addr(il->stations[i].sta.sta.addr, addr))) {
+                       ret = i;
+                       goto out;
+               }
+
+       D_ASSOC("can not find STA %pM total %d\n", addr, il->num_stations);
+
+out:
+       /*
+        * It may be possible that more commands interacting with stations
+        * arrive before we completed processing the adding of
+        * station
+        */
+       if (ret != IL_INVALID_STATION &&
+           (!(il->stations[ret].used & IL_STA_UCODE_ACTIVE) ||
+            ((il->stations[ret].used & IL_STA_UCODE_ACTIVE) &&
+             (il->stations[ret].used & IL_STA_UCODE_INPROGRESS)))) {
+               IL_ERR("Requested station info for sta %d before ready.\n",
+                      ret);
+               ret = IL_INVALID_STATION;
+       }
+       spin_unlock_irqrestore(&il->sta_lock, flags);
+       return ret;
+}
+
+static int
+il4965_get_ra_sta_id(struct il_priv *il, struct ieee80211_hdr *hdr)
+{
+       if (il->iw_mode == NL80211_IFTYPE_STATION)
+               return IL_AP_ID;
+       else {
+               u8 *da = ieee80211_get_DA(hdr);
+
+               return il4965_find_station(il, da);
+       }
+}
+
+static inline u32
+il4965_get_scd_ssn(struct il4965_tx_resp *tx_resp)
+{
+       return le32_to_cpup(&tx_resp->u.status + tx_resp->frame_count) & MAX_SN;
+}
+
+static inline u32
+il4965_tx_status_to_mac80211(u32 status)
+{
+       status &= TX_STATUS_MSK;
+
+       switch (status) {
+       case TX_STATUS_SUCCESS:
+       case TX_STATUS_DIRECT_DONE:
+               return IEEE80211_TX_STAT_ACK;
+       case TX_STATUS_FAIL_DEST_PS:
+               return IEEE80211_TX_STAT_TX_FILTERED;
+       default:
+               return 0;
+       }
+}
+
+/**
+ * il4965_tx_status_reply_tx - Handle Tx response for frames in aggregation queue
+ */
+static int
+il4965_tx_status_reply_tx(struct il_priv *il, struct il_ht_agg *agg,
+                         struct il4965_tx_resp *tx_resp, int txq_id,
+                         u16 start_idx)
+{
+       u16 status;
+       struct agg_tx_status *frame_status = tx_resp->u.agg_status;
+       struct ieee80211_tx_info *info = NULL;
+       struct ieee80211_hdr *hdr = NULL;
+       u32 rate_n_flags = le32_to_cpu(tx_resp->rate_n_flags);
+       int i, sh, idx;
+       u16 seq;
+       if (agg->wait_for_ba)
+               D_TX_REPLY("got tx response w/o block-ack\n");
+
+       agg->frame_count = tx_resp->frame_count;
+       agg->start_idx = start_idx;
+       agg->rate_n_flags = rate_n_flags;
+       agg->bitmap = 0;
+
+       /* num frames attempted by Tx command */
+       if (agg->frame_count == 1) {
+               /* Only one frame was attempted; no block-ack will arrive */
+               status = le16_to_cpu(frame_status[0].status);
+               idx = start_idx;
+
+               D_TX_REPLY("FrameCnt = %d, StartIdx=%d idx=%d\n",
+                          agg->frame_count, agg->start_idx, idx);
+
+               info = IEEE80211_SKB_CB(il->txq[txq_id].skbs[idx]);
+               info->status.rates[0].count = tx_resp->failure_frame + 1;
+               info->flags &= ~IEEE80211_TX_CTL_AMPDU;
+               info->flags |= il4965_tx_status_to_mac80211(status);
+               il4965_hwrate_to_tx_control(il, rate_n_flags, info);
+
+               D_TX_REPLY("1 Frame 0x%x failure :%d\n", status & 0xff,
+                          tx_resp->failure_frame);
+               D_TX_REPLY("Rate Info rate_n_flags=%x\n", rate_n_flags);
+
+               agg->wait_for_ba = 0;
+       } else {
+               /* Two or more frames were attempted; expect block-ack */
+               u64 bitmap = 0;
+               int start = agg->start_idx;
+               struct sk_buff *skb;
+
+               /* Construct bit-map of pending frames within Tx win */
+               for (i = 0; i < agg->frame_count; i++) {
+                       u16 sc;
+                       status = le16_to_cpu(frame_status[i].status);
+                       seq = le16_to_cpu(frame_status[i].sequence);
+                       idx = SEQ_TO_IDX(seq);
+                       txq_id = SEQ_TO_QUEUE(seq);
+
+                       if (status &
+                           (AGG_TX_STATE_FEW_BYTES_MSK |
+                            AGG_TX_STATE_ABORT_MSK))
+                               continue;
+
+                       D_TX_REPLY("FrameCnt = %d, txq_id=%d idx=%d\n",
+                                  agg->frame_count, txq_id, idx);
+
+                       skb = il->txq[txq_id].skbs[idx];
+                       if (WARN_ON_ONCE(skb == NULL))
+                               return -1;
+                       hdr = (struct ieee80211_hdr *) skb->data;
+
+                       sc = le16_to_cpu(hdr->seq_ctrl);
+                       if (idx != (SEQ_TO_SN(sc) & 0xff)) {
+                               IL_ERR("BUG_ON idx doesn't match seq control"
+                                      " idx=%d, seq_idx=%d, seq=%d\n", idx,
+                                      SEQ_TO_SN(sc), hdr->seq_ctrl);
+                               return -1;
+                       }
+
+                       D_TX_REPLY("AGG Frame i=%d idx %d seq=%d\n", i, idx,
+                                  SEQ_TO_SN(sc));
+
+                       sh = idx - start;
+                       if (sh > 64) {
+                               sh = (start - idx) + 0xff;
+                               bitmap = bitmap << sh;
+                               sh = 0;
+                               start = idx;
+                       } else if (sh < -64)
+                               sh = 0xff - (start - idx);
+                       else if (sh < 0) {
+                               sh = start - idx;
+                               start = idx;
+                               bitmap = bitmap << sh;
+                               sh = 0;
+                       }
+                       bitmap |= 1ULL << sh;
+                       D_TX_REPLY("start=%d bitmap=0x%llx\n", start,
+                                  (unsigned long long)bitmap);
+               }
+
+               agg->bitmap = bitmap;
+               agg->start_idx = start;
+               D_TX_REPLY("Frames %d start_idx=%d bitmap=0x%llx\n",
+                          agg->frame_count, agg->start_idx,
+                          (unsigned long long)agg->bitmap);
+
+               if (bitmap)
+                       agg->wait_for_ba = 1;
+       }
+       return 0;
+}
+
+/**
+ * il4965_hdl_tx - Handle standard (non-aggregation) Tx response
+ */
+static void
+il4965_hdl_tx(struct il_priv *il, struct il_rx_buf *rxb)
+{
+       struct il_rx_pkt *pkt = rxb_addr(rxb);
+       u16 sequence = le16_to_cpu(pkt->hdr.sequence);
+       int txq_id = SEQ_TO_QUEUE(sequence);
+       int idx = SEQ_TO_IDX(sequence);
+       struct il_tx_queue *txq = &il->txq[txq_id];
+       struct sk_buff *skb;
+       struct ieee80211_hdr *hdr;
+       struct ieee80211_tx_info *info;
+       struct il4965_tx_resp *tx_resp = (void *)&pkt->u.raw[0];
+       u32 status = le32_to_cpu(tx_resp->u.status);
+       int uninitialized_var(tid);
+       int sta_id;
+       int freed;
+       u8 *qc = NULL;
+       unsigned long flags;
+
+       if (idx >= txq->q.n_bd || il_queue_used(&txq->q, idx) == 0) {
+               IL_ERR("Read idx for DMA queue txq_id (%d) idx %d "
+                      "is out of range [0-%d] %d %d\n", txq_id, idx,
+                      txq->q.n_bd, txq->q.write_ptr, txq->q.read_ptr);
+               return;
+       }
+
+       txq->time_stamp = jiffies;
+
+       skb = txq->skbs[txq->q.read_ptr];
+       info = IEEE80211_SKB_CB(skb);
+       memset(&info->status, 0, sizeof(info->status));
+
+       hdr = (struct ieee80211_hdr *) skb->data;
+       if (ieee80211_is_data_qos(hdr->frame_control)) {
+               qc = ieee80211_get_qos_ctl(hdr);
+               tid = qc[0] & 0xf;
+       }
+
+       sta_id = il4965_get_ra_sta_id(il, hdr);
+       if (txq->sched_retry && unlikely(sta_id == IL_INVALID_STATION)) {
+               IL_ERR("Station not known\n");
+               return;
+       }
+
+       spin_lock_irqsave(&il->sta_lock, flags);
+       if (txq->sched_retry) {
+               const u32 scd_ssn = il4965_get_scd_ssn(tx_resp);
+               struct il_ht_agg *agg = NULL;
+               WARN_ON(!qc);
+
+               agg = &il->stations[sta_id].tid[tid].agg;
+
+               il4965_tx_status_reply_tx(il, agg, tx_resp, txq_id, idx);
+
+               /* check if BAR is needed */
+               if (tx_resp->frame_count == 1 &&
+                   !il4965_is_tx_success(status))
+                       info->flags |= IEEE80211_TX_STAT_AMPDU_NO_BACK;
+
+               if (txq->q.read_ptr != (scd_ssn & 0xff)) {
+                       idx = il_queue_dec_wrap(scd_ssn & 0xff, txq->q.n_bd);
+                       D_TX_REPLY("Retry scheduler reclaim scd_ssn "
+                                  "%d idx %d\n", scd_ssn, idx);
+                       freed = il4965_tx_queue_reclaim(il, txq_id, idx);
+                       if (qc)
+                               il4965_free_tfds_in_queue(il, sta_id, tid,
+                                                         freed);
+
+                       if (il->mac80211_registered &&
+                           il_queue_space(&txq->q) > txq->q.low_mark &&
+                           agg->state != IL_EMPTYING_HW_QUEUE_DELBA)
+                               il_wake_queue(il, txq);
+               }
+       } else {
+               info->status.rates[0].count = tx_resp->failure_frame + 1;
+               info->flags |= il4965_tx_status_to_mac80211(status);
+               il4965_hwrate_to_tx_control(il,
+                                           le32_to_cpu(tx_resp->rate_n_flags),
+                                           info);
+
+               D_TX_REPLY("TXQ %d status %s (0x%08x) "
+                          "rate_n_flags 0x%x retries %d\n", txq_id,
+                          il4965_get_tx_fail_reason(status), status,
+                          le32_to_cpu(tx_resp->rate_n_flags),
+                          tx_resp->failure_frame);
+
+               freed = il4965_tx_queue_reclaim(il, txq_id, idx);
+               if (qc && likely(sta_id != IL_INVALID_STATION))
+                       il4965_free_tfds_in_queue(il, sta_id, tid, freed);
+               else if (sta_id == IL_INVALID_STATION)
+                       D_TX_REPLY("Station not known\n");
+
+               if (il->mac80211_registered &&
+                   il_queue_space(&txq->q) > txq->q.low_mark)
+                       il_wake_queue(il, txq);
+       }
+       if (qc && likely(sta_id != IL_INVALID_STATION))
+               il4965_txq_check_empty(il, sta_id, tid, txq_id);
+
+       il4965_check_abort_status(il, tx_resp->frame_count, status);
+
+       spin_unlock_irqrestore(&il->sta_lock, flags);
+}
+
 /**
  * translate ucode response to mac80211 tx status control values
  */
@@ -2771,8 +3047,7 @@ il4965_sta_alloc_lq(struct il_priv *il, u8 sta_id)
  * Function sleeps.
  */
 int
-il4965_add_bssid_station(struct il_priv *il, struct il_rxon_context *ctx,
-                        const u8 *addr, u8 *sta_id_r)
+il4965_add_bssid_station(struct il_priv *il, const u8 *addr, u8 *sta_id_r)
 {
        int ret;
        u8 sta_id;
@@ -2782,7 +3057,7 @@ il4965_add_bssid_station(struct il_priv *il, struct il_rxon_context *ctx,
        if (sta_id_r)
                *sta_id_r = IL_INVALID_STATION;
 
-       ret = il_add_station_common(il, ctx, addr, 0, NULL, &sta_id);
+       ret = il_add_station_common(il, addr, 0, NULL, &sta_id);
        if (ret) {
                IL_ERR("Unable to add station %pM\n", addr);
                return ret;
@@ -2803,7 +3078,7 @@ il4965_add_bssid_station(struct il_priv *il, struct il_rxon_context *ctx,
                return -ENOMEM;
        }
 
-       ret = il_send_lq_cmd(il, ctx, link_cmd, CMD_SYNC, true);
+       ret = il_send_lq_cmd(il, link_cmd, CMD_SYNC, true);
        if (ret)
                IL_ERR("Link quality command failed (%d)\n", ret);
 
@@ -2815,19 +3090,19 @@ il4965_add_bssid_station(struct il_priv *il, struct il_rxon_context *ctx,
 }
 
 static int
-il4965_static_wepkey_cmd(struct il_priv *il, struct il_rxon_context *ctx,
-                        bool send_if_empty)
+il4965_static_wepkey_cmd(struct il_priv *il, bool send_if_empty)
 {
-       int i, not_empty = 0;
+       int i;
        u8 buff[sizeof(struct il_wep_cmd) +
                sizeof(struct il_wep_key) * WEP_KEYS_MAX];
        struct il_wep_cmd *wep_cmd = (struct il_wep_cmd *)buff;
        size_t cmd_size = sizeof(struct il_wep_cmd);
        struct il_host_cmd cmd = {
-               .id = ctx->wep_key_cmd,
+               .id = C_WEPKEY,
                .data = wep_cmd,
                .flags = CMD_SYNC,
        };
+       bool not_empty = false;
 
        might_sleep();
 
@@ -2835,24 +3110,23 @@ il4965_static_wepkey_cmd(struct il_priv *il, struct il_rxon_context *ctx,
               cmd_size + (sizeof(struct il_wep_key) * WEP_KEYS_MAX));
 
        for (i = 0; i < WEP_KEYS_MAX; i++) {
+               u8 key_size = il->_4965.wep_keys[i].key_size;
+
                wep_cmd->key[i].key_idx = i;
-               if (ctx->wep_keys[i].key_size) {
+               if (key_size) {
                        wep_cmd->key[i].key_offset = i;
-                       not_empty = 1;
-               } else {
+                       not_empty = true;
+               } else
                        wep_cmd->key[i].key_offset = WEP_INVALID_OFFSET;
-               }
 
-               wep_cmd->key[i].key_size = ctx->wep_keys[i].key_size;
-               memcpy(&wep_cmd->key[i].key[3], ctx->wep_keys[i].key,
-                      ctx->wep_keys[i].key_size);
+               wep_cmd->key[i].key_size = key_size;
+               memcpy(&wep_cmd->key[i].key[3], il->_4965.wep_keys[i].key, key_size);
        }
 
        wep_cmd->global_key_type = WEP_KEY_WEP_TYPE;
        wep_cmd->num_keys = WEP_KEYS_MAX;
 
        cmd_size += sizeof(struct il_wep_key) * WEP_KEYS_MAX;
-
        cmd.len = cmd_size;
 
        if (not_empty || send_if_empty)
@@ -2862,66 +3136,66 @@ il4965_static_wepkey_cmd(struct il_priv *il, struct il_rxon_context *ctx,
 }
 
 int
-il4965_restore_default_wep_keys(struct il_priv *il, struct il_rxon_context *ctx)
+il4965_restore_default_wep_keys(struct il_priv *il)
 {
        lockdep_assert_held(&il->mutex);
 
-       return il4965_static_wepkey_cmd(il, ctx, false);
+       return il4965_static_wepkey_cmd(il, false);
 }
 
 int
-il4965_remove_default_wep_key(struct il_priv *il, struct il_rxon_context *ctx,
+il4965_remove_default_wep_key(struct il_priv *il,
                              struct ieee80211_key_conf *keyconf)
 {
        int ret;
+       int idx = keyconf->keyidx;
 
        lockdep_assert_held(&il->mutex);
 
-       D_WEP("Removing default WEP key: idx=%d\n", keyconf->keyidx);
+       D_WEP("Removing default WEP key: idx=%d\n", idx);
 
-       memset(&ctx->wep_keys[keyconf->keyidx], 0, sizeof(ctx->wep_keys[0]));
+       memset(&il->_4965.wep_keys[idx], 0, sizeof(struct il_wep_key));
        if (il_is_rfkill(il)) {
                D_WEP("Not sending C_WEPKEY command due to RFKILL.\n");
                /* but keys in device are clear anyway so return success */
                return 0;
        }
-       ret = il4965_static_wepkey_cmd(il, ctx, 1);
-       D_WEP("Remove default WEP key: idx=%d ret=%d\n", keyconf->keyidx, ret);
+       ret = il4965_static_wepkey_cmd(il, 1);
+       D_WEP("Remove default WEP key: idx=%d ret=%d\n", idx, ret);
 
        return ret;
 }
 
 int
-il4965_set_default_wep_key(struct il_priv *il, struct il_rxon_context *ctx,
+il4965_set_default_wep_key(struct il_priv *il,
                           struct ieee80211_key_conf *keyconf)
 {
        int ret;
+       int len = keyconf->keylen;
+       int idx = keyconf->keyidx;
 
        lockdep_assert_held(&il->mutex);
 
-       if (keyconf->keylen != WEP_KEY_LEN_128 &&
-           keyconf->keylen != WEP_KEY_LEN_64) {
+       if (len != WEP_KEY_LEN_128 && len != WEP_KEY_LEN_64) {
                D_WEP("Bad WEP key length %d\n", keyconf->keylen);
                return -EINVAL;
        }
 
        keyconf->flags &= ~IEEE80211_KEY_FLAG_GENERATE_IV;
        keyconf->hw_key_idx = HW_KEY_DEFAULT;
-       il->stations[ctx->ap_sta_id].keyinfo.cipher = keyconf->cipher;
+       il->stations[IL_AP_ID].keyinfo.cipher = keyconf->cipher;
 
-       ctx->wep_keys[keyconf->keyidx].key_size = keyconf->keylen;
-       memcpy(&ctx->wep_keys[keyconf->keyidx].key, &keyconf->key,
-              keyconf->keylen);
+       il->_4965.wep_keys[idx].key_size = len;
+       memcpy(&il->_4965.wep_keys[idx].key, &keyconf->key, len);
 
-       ret = il4965_static_wepkey_cmd(il, ctx, false);
-       D_WEP("Set default WEP key: len=%d idx=%d ret=%d\n", keyconf->keylen,
-             keyconf->keyidx, ret);
+       ret = il4965_static_wepkey_cmd(il, false);
 
+       D_WEP("Set default WEP key: len=%d idx=%d ret=%d\n", len, idx, ret);
        return ret;
 }
 
 static int
-il4965_set_wep_dynamic_key_info(struct il_priv *il, struct il_rxon_context *ctx,
+il4965_set_wep_dynamic_key_info(struct il_priv *il,
                                struct ieee80211_key_conf *keyconf, u8 sta_id)
 {
        unsigned long flags;
@@ -2939,7 +3213,7 @@ il4965_set_wep_dynamic_key_info(struct il_priv *il, struct il_rxon_context *ctx,
        if (keyconf->keylen == WEP_KEY_LEN_128)
                key_flags |= STA_KEY_FLG_KEY_SIZE_MSK;
 
-       if (sta_id == ctx->bcast_sta_id)
+       if (sta_id == il->hw_params.bcast_id)
                key_flags |= STA_KEY_MULTICAST_MSK;
 
        spin_lock_irqsave(&il->sta_lock, flags);
@@ -2976,7 +3250,6 @@ il4965_set_wep_dynamic_key_info(struct il_priv *il, struct il_rxon_context *ctx,
 
 static int
 il4965_set_ccmp_dynamic_key_info(struct il_priv *il,
-                                struct il_rxon_context *ctx,
                                 struct ieee80211_key_conf *keyconf, u8 sta_id)
 {
        unsigned long flags;
@@ -2989,7 +3262,7 @@ il4965_set_ccmp_dynamic_key_info(struct il_priv *il,
        key_flags |= cpu_to_le16(keyconf->keyidx << STA_KEY_FLG_KEYID_POS);
        key_flags &= ~STA_KEY_FLG_INVALID;
 
-       if (sta_id == ctx->bcast_sta_id)
+       if (sta_id == il->hw_params.bcast_id)
                key_flags |= STA_KEY_MULTICAST_MSK;
 
        keyconf->flags |= IEEE80211_KEY_FLAG_GENERATE_IV;
@@ -3025,7 +3298,6 @@ il4965_set_ccmp_dynamic_key_info(struct il_priv *il,
 
 static int
 il4965_set_tkip_dynamic_key_info(struct il_priv *il,
-                                struct il_rxon_context *ctx,
                                 struct ieee80211_key_conf *keyconf, u8 sta_id)
 {
        unsigned long flags;
@@ -3036,7 +3308,7 @@ il4965_set_tkip_dynamic_key_info(struct il_priv *il,
        key_flags |= cpu_to_le16(keyconf->keyidx << STA_KEY_FLG_KEYID_POS);
        key_flags &= ~STA_KEY_FLG_INVALID;
 
-       if (sta_id == ctx->bcast_sta_id)
+       if (sta_id == il->hw_params.bcast_id)
                key_flags |= STA_KEY_MULTICAST_MSK;
 
        keyconf->flags |= IEEE80211_KEY_FLAG_GENERATE_IV;
@@ -3070,9 +3342,8 @@ il4965_set_tkip_dynamic_key_info(struct il_priv *il,
 }
 
 void
-il4965_update_tkip_key(struct il_priv *il, struct il_rxon_context *ctx,
-                      struct ieee80211_key_conf *keyconf,
-                      struct ieee80211_sta *sta, u32 iv32, u16 * phase1key)
+il4965_update_tkip_key(struct il_priv *il, struct ieee80211_key_conf *keyconf,
+                      struct ieee80211_sta *sta, u32 iv32, u16 *phase1key)
 {
        u8 sta_id;
        unsigned long flags;
@@ -3084,7 +3355,7 @@ il4965_update_tkip_key(struct il_priv *il, struct il_rxon_context *ctx,
                return;
        }
 
-       sta_id = il_sta_id_or_broadcast(il, ctx, sta);
+       sta_id = il_sta_id_or_broadcast(il, sta);
        if (sta_id == IL_INVALID_STATION)
                return;
 
@@ -3102,11 +3373,10 @@ il4965_update_tkip_key(struct il_priv *il, struct il_rxon_context *ctx,
        il_send_add_sta(il, &il->stations[sta_id].sta, CMD_ASYNC);
 
        spin_unlock_irqrestore(&il->sta_lock, flags);
-
 }
 
 int
-il4965_remove_dynamic_key(struct il_priv *il, struct il_rxon_context *ctx,
+il4965_remove_dynamic_key(struct il_priv *il,
                          struct ieee80211_key_conf *keyconf, u8 sta_id)
 {
        unsigned long flags;
@@ -3116,7 +3386,7 @@ il4965_remove_dynamic_key(struct il_priv *il, struct il_rxon_context *ctx,
 
        lockdep_assert_held(&il->mutex);
 
-       ctx->key_mapping_keys--;
+       il->_4965.key_mapping_keys--;
 
        spin_lock_irqsave(&il->sta_lock, flags);
        key_flags = le16_to_cpu(il->stations[sta_id].sta.key.key_flags);
@@ -3167,28 +3437,28 @@ il4965_remove_dynamic_key(struct il_priv *il, struct il_rxon_context *ctx,
 }
 
 int
-il4965_set_dynamic_key(struct il_priv *il, struct il_rxon_context *ctx,
-                      struct ieee80211_key_conf *keyconf, u8 sta_id)
+il4965_set_dynamic_key(struct il_priv *il, struct ieee80211_key_conf *keyconf,
+                      u8 sta_id)
 {
        int ret;
 
        lockdep_assert_held(&il->mutex);
 
-       ctx->key_mapping_keys++;
+       il->_4965.key_mapping_keys++;
        keyconf->hw_key_idx = HW_KEY_DYNAMIC;
 
        switch (keyconf->cipher) {
        case WLAN_CIPHER_SUITE_CCMP:
                ret =
-                   il4965_set_ccmp_dynamic_key_info(il, ctx, keyconf, sta_id);
+                   il4965_set_ccmp_dynamic_key_info(il, keyconf, sta_id);
                break;
        case WLAN_CIPHER_SUITE_TKIP:
                ret =
-                   il4965_set_tkip_dynamic_key_info(il, ctx, keyconf, sta_id);
+                   il4965_set_tkip_dynamic_key_info(il, keyconf, sta_id);
                break;
        case WLAN_CIPHER_SUITE_WEP40:
        case WLAN_CIPHER_SUITE_WEP104:
-               ret = il4965_set_wep_dynamic_key_info(il, ctx, keyconf, sta_id);
+               ret = il4965_set_wep_dynamic_key_info(il, keyconf, sta_id);
                break;
        default:
                IL_ERR("Unknown alg: %s cipher = %x\n", __func__,
@@ -3210,14 +3480,14 @@ il4965_set_dynamic_key(struct il_priv *il, struct il_rxon_context *ctx,
  * device at the next best time.
  */
 int
-il4965_alloc_bcast_station(struct il_priv *il, struct il_rxon_context *ctx)
+il4965_alloc_bcast_station(struct il_priv *il)
 {
        struct il_link_quality_cmd *link_cmd;
        unsigned long flags;
        u8 sta_id;
 
        spin_lock_irqsave(&il->sta_lock, flags);
-       sta_id = il_prep_station(il, ctx, il_bcast_addr, false, NULL);
+       sta_id = il_prep_station(il, il_bcast_addr, false, NULL);
        if (sta_id == IL_INVALID_STATION) {
                IL_ERR("Unable to prepare broadcast station\n");
                spin_unlock_irqrestore(&il->sta_lock, flags);
@@ -3250,11 +3520,11 @@ il4965_alloc_bcast_station(struct il_priv *il, struct il_rxon_context *ctx)
  * code together.
  */
 static int
-il4965_update_bcast_station(struct il_priv *il, struct il_rxon_context *ctx)
+il4965_update_bcast_station(struct il_priv *il)
 {
        unsigned long flags;
        struct il_link_quality_cmd *link_cmd;
-       u8 sta_id = ctx->bcast_sta_id;
+       u8 sta_id = il->hw_params.bcast_id;
 
        link_cmd = il4965_sta_alloc_lq(il, sta_id);
        if (!link_cmd) {
@@ -3276,7 +3546,7 @@ il4965_update_bcast_station(struct il_priv *il, struct il_rxon_context *ctx)
 int
 il4965_update_bcast_stations(struct il_priv *il)
 {
-       return il4965_update_bcast_station(il, &il->ctx);
+       return il4965_update_bcast_station(il);
 }
 
 /**
@@ -3376,10 +3646,10 @@ il4965_sta_modify_sleep_tx_count(struct il_priv *il, int sta_id, int cnt)
 void
 il4965_update_chain_flags(struct il_priv *il)
 {
-       if (il->cfg->ops->hcmd->set_rxon_chain) {
-               il->cfg->ops->hcmd->set_rxon_chain(il, &il->ctx);
-               if (il->ctx.active.rx_chain != il->ctx.staging.rx_chain)
-                       il_commit_rxon(il, &il->ctx);
+       if (il->ops->set_rxon_chain) {
+               il->ops->set_rxon_chain(il);
+               if (il->active.rx_chain != il->staging.rx_chain)
+                       il_commit_rxon(il);
        }
 }
 
@@ -3491,8 +3761,8 @@ il4965_hw_get_beacon_cmd(struct il_priv *il, struct il_frame *frame)
 
        lockdep_assert_held(&il->mutex);
 
-       if (!il->beacon_ctx) {
-               IL_ERR("trying to build beacon w/o beacon context!\n");
+       if (!il->beacon_enabled) {
+               IL_ERR("Trying to build beacon without beaconing enabled\n");
                return 0;
        }
 
@@ -3511,7 +3781,7 @@ il4965_hw_get_beacon_cmd(struct il_priv *il, struct il_frame *frame)
 
        /* Set up TX command fields */
        tx_beacon_cmd->tx.len = cpu_to_le16((u16) frame_size);
-       tx_beacon_cmd->tx.sta_id = il->beacon_ctx->bcast_sta_id;
+       tx_beacon_cmd->tx.sta_id = il->hw_params.bcast_id;
        tx_beacon_cmd->tx.stop_time.life_time = TX_CMD_LIFE_TIME_INFINITE;
        tx_beacon_cmd->tx.tx_flags =
            TX_CMD_FLG_SEQ_CTL_MSK | TX_CMD_FLG_TSF_MSK |
@@ -3522,7 +3792,7 @@ il4965_hw_get_beacon_cmd(struct il_priv *il, struct il_frame *frame)
                              frame_size);
 
        /* Set up packet rate and flags */
-       rate = il_get_lowest_plcp(il, il->beacon_ctx);
+       rate = il_get_lowest_plcp(il);
        il4965_toggle_tx_ant(il, &il->mgmt_tx_ant, il->hw_params.valid_tx_ant);
        rate_flags = BIT(il->mgmt_tx_ant) << RATE_MCS_ANT_POS;
        if ((rate >= IL_FIRST_CCK_RATE) && (rate <= IL_LAST_CCK_RATE))
@@ -3645,15 +3915,13 @@ il4965_hw_txq_free_tfd(struct il_priv *il, struct il_tx_queue *txq)
                                 PCI_DMA_TODEVICE);
 
        /* free SKB */
-       if (txq->txb) {
-               struct sk_buff *skb;
-
-               skb = txq->txb[txq->q.read_ptr].skb;
+       if (txq->skbs) {
+               struct sk_buff *skb = txq->skbs[txq->q.read_ptr];
 
                /* can be called from irqs-disabled context */
                if (skb) {
                        dev_kfree_skb_any(skb);
-                       txq->txb[txq->q.read_ptr].skb = NULL;
+                       txq->skbs[txq->q.read_ptr] = NULL;
                }
        }
 }
@@ -3752,9 +4020,9 @@ il4965_hdl_alive(struct il_priv *il, struct il_rx_buf *rxb)
  * This callback is provided in order to send a stats request.
  *
  * This timer function is continually reset to execute within
- * REG_RECALIB_PERIOD seconds since the last N_STATS
- * was received.  We need to ensure we receive the stats in order
- * to update the temperature used for calibrating the TXPOWER.
+ * 60 seconds since the last N_STATS was received.  We need to
+ * ensure we receive the stats in order to update the temperature
+ * used for calibrating the TXPOWER.
  */
 static void
 il4965_bg_stats_periodic(unsigned long data)
@@ -3804,7 +4072,7 @@ il4965_perform_ct_kill_task(struct il_priv *il)
        _il_rd(il, CSR_UCODE_DRV_GP1);
 
        spin_lock_irqsave(&il->reg_lock, flags);
-       if (!_il_grab_nic_access(il))
+       if (likely(_il_grab_nic_access(il)))
                _il_release_nic_access(il);
        spin_unlock_irqrestore(&il->reg_lock, flags);
 }
@@ -3842,17 +4110,17 @@ il4965_hdl_card_state(struct il_priv *il, struct il_rx_buf *rxb)
                il4965_perform_ct_kill_task(il);
 
        if (flags & HW_CARD_DISABLED)
-               set_bit(S_RF_KILL_HW, &il->status);
+               set_bit(S_RFKILL, &il->status);
        else
-               clear_bit(S_RF_KILL_HW, &il->status);
+               clear_bit(S_RFKILL, &il->status);
 
        if (!(flags & RXON_CARD_DISABLED))
                il_scan_cancel(il);
 
-       if ((test_bit(S_RF_KILL_HW, &status) !=
-            test_bit(S_RF_KILL_HW, &il->status)))
+       if ((test_bit(S_RFKILL, &status) !=
+            test_bit(S_RFKILL, &il->status)))
                wiphy_rfkill_set_hw_state(il->hw->wiphy,
-                                         test_bit(S_RF_KILL_HW, &il->status));
+                                         test_bit(S_RFKILL, &il->status));
        else
                wake_up(&il->wait_command_queue);
 }
@@ -3894,10 +4162,11 @@ il4965_setup_handlers(struct il_priv *il)
        /* Rx handlers */
        il->handlers[N_RX_PHY] = il4965_hdl_rx_phy;
        il->handlers[N_RX_MPDU] = il4965_hdl_rx;
+       il->handlers[N_RX] = il4965_hdl_rx;
        /* block ack */
        il->handlers[N_COMPRESSED_BA] = il4965_hdl_compressed_ba;
-       /* Set up hardware specific Rx handlers */
-       il->cfg->ops->lib->handler_setup(il);
+       /* Tx response */
+       il->handlers[C_TX] = il4965_hdl_tx;
 }
 
 /**
@@ -4127,9 +4396,8 @@ il4965_irq_tasklet(struct il_priv *il)
        /* HW RF KILL switch toggled */
        if (inta & CSR_INT_BIT_RF_KILL) {
                int hw_rf_kill = 0;
-               if (!
-                   (_il_rd(il, CSR_GP_CNTRL) &
-                    CSR_GP_CNTRL_REG_FLAG_HW_RF_KILL_SW))
+
+               if (!(_il_rd(il, CSR_GP_CNTRL) & CSR_GP_CNTRL_REG_FLAG_HW_RF_KILL_SW))
                        hw_rf_kill = 1;
 
                IL_WARN("RF_KILL bit toggled to %s.\n",
@@ -4144,9 +4412,9 @@ il4965_irq_tasklet(struct il_priv *il)
                 */
                if (!test_bit(S_ALIVE, &il->status)) {
                        if (hw_rf_kill)
-                               set_bit(S_RF_KILL_HW, &il->status);
+                               set_bit(S_RFKILL, &il->status);
                        else
-                               clear_bit(S_RF_KILL_HW, &il->status);
+                               clear_bit(S_RFKILL, &il->status);
                        wiphy_rfkill_set_hw_state(il->hw->wiphy, hw_rf_kill);
                }
 
@@ -4270,11 +4538,9 @@ il4965_store_debug_level(struct device *d, struct device_attribute *attr,
        ret = strict_strtoul(buf, 0, &val);
        if (ret)
                IL_ERR("%s is not in hex or decimal form.\n", buf);
-       else {
+       else
                il->debug_level = val;
-               if (il_alloc_traffic_mem(il))
-                       IL_ERR("Not enough memory to generate traffic log\n");
-       }
+
        return strnlen(buf, count);
 }
 
@@ -4799,7 +5065,7 @@ il4965_dump_nic_error_log(struct il_priv *il)
        else
                base = le32_to_cpu(il->card_alive.error_event_table_ptr);
 
-       if (!il->cfg->ops->lib->is_valid_rtc_data_addr(base)) {
+       if (!il->ops->is_valid_rtc_data_addr(base)) {
                IL_ERR("Not valid error log pointer 0x%08X for %s uCode\n",
                       base, (il->ucode_type == UCODE_INIT) ? "Init" : "RT");
                return;
@@ -4979,7 +5245,6 @@ static void
 il4965_alive_start(struct il_priv *il)
 {
        int ret = 0;
-       struct il_rxon_context *ctx = &il->ctx;
 
        D_INFO("Runtime Alive received.\n");
 
@@ -5019,18 +5284,18 @@ il4965_alive_start(struct il_priv *il)
 
        il->active_rate = RATES_MASK;
 
-       if (il_is_associated_ctx(ctx)) {
+       if (il_is_associated(il)) {
                struct il_rxon_cmd *active_rxon =
-                   (struct il_rxon_cmd *)&ctx->active;
+                   (struct il_rxon_cmd *)&il->active;
                /* apply any changes in staging */
-               ctx->staging.filter_flags |= RXON_FILTER_ASSOC_MSK;
+               il->staging.filter_flags |= RXON_FILTER_ASSOC_MSK;
                active_rxon->filter_flags &= ~RXON_FILTER_ASSOC_MSK;
        } else {
                /* Initialize our rx_config data */
-               il_connection_init_rx_config(il, &il->ctx);
+               il_connection_init_rx_config(il);
 
-               if (il->cfg->ops->hcmd->set_rxon_chain)
-                       il->cfg->ops->hcmd->set_rxon_chain(il, ctx);
+               if (il->ops->set_rxon_chain)
+                       il->ops->set_rxon_chain(il);
        }
 
        /* Configure bluetooth coexistence if enabled */
@@ -5041,7 +5306,7 @@ il4965_alive_start(struct il_priv *il)
        set_bit(S_READY, &il->status);
 
        /* Configure the adapter for unassociated operation */
-       il_commit_rxon(il, ctx);
+       il_commit_rxon(il);
 
        /* At this point, the NIC is initialized and operational */
        il4965_rf_kill_ct_config(il);
@@ -5076,7 +5341,21 @@ __il4965_down(struct il_priv *il)
         * to prevent rearm timer */
        del_timer_sync(&il->watchdog);
 
-       il_clear_ucode_stations(il, NULL);
+       il_clear_ucode_stations(il);
+
+       /* FIXME: race conditions ? */
+       spin_lock_irq(&il->sta_lock);
+       /*
+        * Remove all key information that is not stored as part
+        * of station information since mac80211 may not have had
+        * a chance to remove all the keys. When device is
+        * reconfigured by mac80211 after an error all keys will
+        * be reconfigured.
+        */
+       memset(il->_4965.wep_keys, 0, sizeof(il->_4965.wep_keys));
+       il->_4965.key_mapping_keys = 0;
+       spin_unlock_irq(&il->sta_lock);
+
        il_dealloc_bcast_stations(il);
        il_clear_driver_stations(il);
 
@@ -5104,12 +5383,8 @@ __il4965_down(struct il_priv *il)
         * clear all bits but the RF Kill bit and return */
        if (!il_is_init(il)) {
                il->status =
-                   test_bit(S_RF_KILL_HW,
-                            &il->
-                            status) << S_RF_KILL_HW |
-                   test_bit(S_GEO_CONFIGURED,
-                            &il->
-                            status) << S_GEO_CONFIGURED |
+                   test_bit(S_RFKILL, &il->status) << S_RFKILL |
+                   test_bit(S_GEO_CONFIGURED, &il->status) << S_GEO_CONFIGURED |
                    test_bit(S_EXIT_PENDING, &il->status) << S_EXIT_PENDING;
                goto exit;
        }
@@ -5117,28 +5392,32 @@ __il4965_down(struct il_priv *il)
        /* ...otherwise clear out all the status bits but the RF Kill
         * bit and continue taking the NIC down. */
        il->status &=
-           test_bit(S_RF_KILL_HW,
-                    &il->status) << S_RF_KILL_HW | test_bit(S_GEO_CONFIGURED,
-                                                            &il->
-                                                            status) <<
-           S_GEO_CONFIGURED | test_bit(S_FW_ERROR,
-                                       &il->
-                                       status) << S_FW_ERROR |
+           test_bit(S_RFKILL, &il->status) << S_RFKILL |
+           test_bit(S_GEO_CONFIGURED, &il->status) << S_GEO_CONFIGURED |
+           test_bit(S_FW_ERROR, &il->status) << S_FW_ERROR |
            test_bit(S_EXIT_PENDING, &il->status) << S_EXIT_PENDING;
 
+       /*
+        * We disabled and synchronized interrupt, and priv->mutex is taken, so
+        * here is the only thread which will program device registers, but
+        * still have lockdep assertions, so we are taking reg_lock.
+        */
+       spin_lock_irq(&il->reg_lock);
+       /* FIXME: il_grab_nic_access if rfkill is off ? */
+
        il4965_txq_ctx_stop(il);
        il4965_rxq_stop(il);
-
        /* Power-down device's busmaster DMA clocks */
-       il_wr_prph(il, APMG_CLK_DIS_REG, APMG_CLK_VAL_DMA_CLK_RQT);
+       _il_wr_prph(il, APMG_CLK_DIS_REG, APMG_CLK_VAL_DMA_CLK_RQT);
        udelay(5);
-
        /* Make sure (redundant) we've released our request to stay awake */
-       il_clear_bit(il, CSR_GP_CNTRL, CSR_GP_CNTRL_REG_FLAG_MAC_ACCESS_REQ);
-
+       _il_clear_bit(il, CSR_GP_CNTRL, CSR_GP_CNTRL_REG_FLAG_MAC_ACCESS_REQ);
        /* Stop the device, and put it in low power state */
-       il_apm_stop(il);
+       _il_apm_stop(il);
+
+       spin_unlock_irq(&il->reg_lock);
 
+       il4965_txq_ctx_unmap(il);
 exit:
        memset(&il->card_alive, 0, sizeof(struct il_alive_resp));
 
@@ -5159,40 +5438,36 @@ il4965_down(struct il_priv *il)
        il4965_cancel_deferred_work(il);
 }
 
-#define HW_READY_TIMEOUT (50)
 
-static int
+static void
 il4965_set_hw_ready(struct il_priv *il)
 {
-       int ret = 0;
+       int ret;
 
        il_set_bit(il, CSR_HW_IF_CONFIG_REG,
                   CSR_HW_IF_CONFIG_REG_BIT_NIC_READY);
 
        /* See if we got it */
-       ret =
-           _il_poll_bit(il, CSR_HW_IF_CONFIG_REG,
-                        CSR_HW_IF_CONFIG_REG_BIT_NIC_READY,
-                        CSR_HW_IF_CONFIG_REG_BIT_NIC_READY, HW_READY_TIMEOUT);
-       if (ret != -ETIMEDOUT)
+       ret = _il_poll_bit(il, CSR_HW_IF_CONFIG_REG,
+                          CSR_HW_IF_CONFIG_REG_BIT_NIC_READY,
+                          CSR_HW_IF_CONFIG_REG_BIT_NIC_READY,
+                          100);
+       if (ret >= 0)
                il->hw_ready = true;
-       else
-               il->hw_ready = false;
 
-       D_INFO("hardware %s\n", (il->hw_ready == 1) ? "ready" : "not ready");
-       return ret;
+       D_INFO("hardware %s ready\n", (il->hw_ready) ? "" : "not");
 }
 
-static int
+static void
 il4965_prepare_card_hw(struct il_priv *il)
 {
-       int ret = 0;
+       int ret;
 
-       D_INFO("il4965_prepare_card_hw enter\n");
+       il->hw_ready = false;
 
-       ret = il4965_set_hw_ready(il);
+       il4965_set_hw_ready(il);
        if (il->hw_ready)
-               return ret;
+               return;
 
        /* If HW is not ready, prepare the conditions to check again */
        il_set_bit(il, CSR_HW_IF_CONFIG_REG, CSR_HW_IF_CONFIG_REG_PREPARE);
@@ -5205,8 +5480,6 @@ il4965_prepare_card_hw(struct il_priv *il)
        /* HW should be ready by now, check again. */
        if (ret != -ETIMEDOUT)
                il4965_set_hw_ready(il);
-
-       return ret;
 }
 
 #define MAX_HW_RESTARTS 5
@@ -5227,29 +5500,26 @@ __il4965_up(struct il_priv *il)
                return -EIO;
        }
 
-       ret = il4965_alloc_bcast_station(il, &il->ctx);
+       ret = il4965_alloc_bcast_station(il);
        if (ret) {
                il_dealloc_bcast_stations(il);
                return ret;
        }
 
        il4965_prepare_card_hw(il);
-
        if (!il->hw_ready) {
-               IL_WARN("Exit HW not ready\n");
+               IL_ERR("HW not ready\n");
                return -EIO;
        }
 
        /* If platform's RF_KILL switch is NOT set to KILL */
        if (_il_rd(il, CSR_GP_CNTRL) & CSR_GP_CNTRL_REG_FLAG_HW_RF_KILL_SW)
-               clear_bit(S_RF_KILL_HW, &il->status);
-       else
-               set_bit(S_RF_KILL_HW, &il->status);
-
-       if (il_is_rfkill(il)) {
+               clear_bit(S_RFKILL, &il->status);
+       else {
+               set_bit(S_RFKILL, &il->status);
                wiphy_rfkill_set_hw_state(il->hw->wiphy, true);
 
-               il_enable_interrupts(il);
+               il_enable_rfkill_int(il);
                IL_WARN("Radio disabled by HW RF Kill switch\n");
                return 0;
        }
@@ -5288,7 +5558,7 @@ __il4965_up(struct il_priv *il)
                /* load bootstrap state machine,
                 * load bootstrap program into processor's memory,
                 * prepare to load the "initialize" uCode */
-               ret = il->cfg->ops->lib->load_ucode(il);
+               ret = il->ops->load_ucode(il);
 
                if (ret) {
                        IL_ERR("Unable to set up bootstrap uCode: %d\n", ret);
@@ -5329,7 +5599,7 @@ il4965_bg_init_alive_start(struct work_struct *data)
        if (test_bit(S_EXIT_PENDING, &il->status))
                goto out;
 
-       il->cfg->ops->lib->init_alive_start(il);
+       il->ops->init_alive_start(il);
 out:
        mutex_unlock(&il->mutex);
 }
@@ -5381,7 +5651,8 @@ il4965_bg_restart(struct work_struct *data)
 
        if (test_and_clear_bit(S_FW_ERROR, &il->status)) {
                mutex_lock(&il->mutex);
-               il->ctx.vif = NULL;
+               /* FIXME: do we dereference vif without mutex locked ? */
+               il->vif = NULL;
                il->is_open = 0;
 
                __il4965_down(il);
@@ -5450,8 +5721,8 @@ il4965_mac_setup_register(struct il_priv *il, u32 max_probe_length)
        hw->sta_data_size = sizeof(struct il_station_priv);
        hw->vif_data_size = sizeof(struct il_vif_priv);
 
-       hw->wiphy->interface_modes |= il->ctx.interface_modes;
-       hw->wiphy->interface_modes |= il->ctx.exclusive_interface_modes;
+       hw->wiphy->interface_modes =
+           BIT(NL80211_IFTYPE_STATION) | BIT(NL80211_IFTYPE_ADHOC);
 
        hw->wiphy->flags |=
            WIPHY_FLAG_CUSTOM_REGULATORY | WIPHY_FLAG_DISABLE_BEACON_HINTS;
@@ -5578,12 +5849,10 @@ il4965_mac_update_tkip_key(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
                           struct ieee80211_sta *sta, u32 iv32, u16 * phase1key)
 {
        struct il_priv *il = hw->priv;
-       struct il_vif_priv *vif_priv = (void *)vif->drv_priv;
 
        D_MAC80211("enter\n");
 
-       il4965_update_tkip_key(il, vif_priv->ctx, keyconf, sta, iv32,
-                              phase1key);
+       il4965_update_tkip_key(il, keyconf, sta, iv32, phase1key);
 
        D_MAC80211("leave\n");
 }
@@ -5594,8 +5863,6 @@ il4965_mac_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
                   struct ieee80211_key_conf *key)
 {
        struct il_priv *il = hw->priv;
-       struct il_vif_priv *vif_priv = (void *)vif->drv_priv;
-       struct il_rxon_context *ctx = vif_priv->ctx;
        int ret;
        u8 sta_id;
        bool is_default_wep_key = false;
@@ -5607,7 +5874,7 @@ il4965_mac_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
                return -EOPNOTSUPP;
        }
 
-       sta_id = il_sta_id_or_broadcast(il, vif_priv->ctx, sta);
+       sta_id = il_sta_id_or_broadcast(il, sta);
        if (sta_id == IL_INVALID_STATION)
                return -EINVAL;
 
@@ -5623,7 +5890,7 @@ il4965_mac_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
        if ((key->cipher == WLAN_CIPHER_SUITE_WEP40 ||
             key->cipher == WLAN_CIPHER_SUITE_WEP104) && !sta) {
                if (cmd == SET_KEY)
-                       is_default_wep_key = !ctx->key_mapping_keys;
+                       is_default_wep_key = !il->_4965.key_mapping_keys;
                else
                        is_default_wep_key =
                            (key->hw_key_idx == HW_KEY_DEFAULT);
@@ -5632,20 +5899,17 @@ il4965_mac_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
        switch (cmd) {
        case SET_KEY:
                if (is_default_wep_key)
-                       ret =
-                           il4965_set_default_wep_key(il, vif_priv->ctx, key);
+                       ret = il4965_set_default_wep_key(il, key);
                else
-                       ret =
-                           il4965_set_dynamic_key(il, vif_priv->ctx, key,
-                                                  sta_id);
+                       ret = il4965_set_dynamic_key(il, key, sta_id);
 
                D_MAC80211("enable hwcrypto key\n");
                break;
        case DISABLE_KEY:
                if (is_default_wep_key)
-                       ret = il4965_remove_default_wep_key(il, ctx, key);
+                       ret = il4965_remove_default_wep_key(il, key);
                else
-                       ret = il4965_remove_dynamic_key(il, ctx, key, sta_id);
+                       ret = il4965_remove_dynamic_key(il, key, sta_id);
 
                D_MAC80211("disable hwcrypto key\n");
                break;
@@ -5711,7 +5975,6 @@ il4965_mac_sta_add(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
 {
        struct il_priv *il = hw->priv;
        struct il_station_priv *sta_priv = (void *)sta->drv_priv;
-       struct il_vif_priv *vif_priv = (void *)vif->drv_priv;
        bool is_ap = vif->type == NL80211_IFTYPE_STATION;
        int ret;
        u8 sta_id;
@@ -5724,8 +5987,7 @@ il4965_mac_sta_add(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
        atomic_set(&sta_priv->pending_frames, 0);
 
        ret =
-           il_add_station_common(il, vif_priv->ctx, sta->addr, is_ap, sta,
-                                 &sta_id);
+           il_add_station_common(il, sta->addr, is_ap, sta, &sta_id);
        if (ret) {
                IL_ERR("Unable to add station %pM (%d)\n", sta->addr, ret);
                /* Should we return success if return code is EEXIST ? */
@@ -5752,8 +6014,6 @@ il4965_mac_channel_switch(struct ieee80211_hw *hw,
        struct ieee80211_conf *conf = &hw->conf;
        struct ieee80211_channel *channel = ch_switch->channel;
        struct il_ht_config *ht_conf = &il->current_ht_config;
-
-       struct il_rxon_context *ctx = &il->ctx;
        u16 ch;
 
        D_MAC80211("enter\n");
@@ -5768,14 +6028,14 @@ il4965_mac_channel_switch(struct ieee80211_hw *hw,
            test_bit(S_CHANNEL_SWITCH_PENDING, &il->status))
                goto out;
 
-       if (!il_is_associated_ctx(ctx))
+       if (!il_is_associated(il))
                goto out;
 
-       if (!il->cfg->ops->lib->set_channel_switch)
+       if (!il->ops->set_channel_switch)
                goto out;
 
        ch = channel->hw_value;
-       if (le16_to_cpu(ctx->active.channel) == ch)
+       if (le16_to_cpu(il->active.channel) == ch)
                goto out;
 
        ch_info = il_get_channel_info(il, channel->band, ch);
@@ -5789,30 +6049,30 @@ il4965_mac_channel_switch(struct ieee80211_hw *hw,
        il->current_ht_config.smps = conf->smps_mode;
 
        /* Configure HT40 channels */
-       ctx->ht.enabled = conf_is_ht(conf);
-       if (ctx->ht.enabled) {
+       il->ht.enabled = conf_is_ht(conf);
+       if (il->ht.enabled) {
                if (conf_is_ht40_minus(conf)) {
-                       ctx->ht.extension_chan_offset =
+                       il->ht.extension_chan_offset =
                            IEEE80211_HT_PARAM_CHA_SEC_BELOW;
-                       ctx->ht.is_40mhz = true;
+                       il->ht.is_40mhz = true;
                } else if (conf_is_ht40_plus(conf)) {
-                       ctx->ht.extension_chan_offset =
+                       il->ht.extension_chan_offset =
                            IEEE80211_HT_PARAM_CHA_SEC_ABOVE;
-                       ctx->ht.is_40mhz = true;
+                       il->ht.is_40mhz = true;
                } else {
-                       ctx->ht.extension_chan_offset =
+                       il->ht.extension_chan_offset =
                            IEEE80211_HT_PARAM_CHA_SEC_NONE;
-                       ctx->ht.is_40mhz = false;
+                       il->ht.is_40mhz = false;
                }
        } else
-               ctx->ht.is_40mhz = false;
+               il->ht.is_40mhz = false;
 
-       if ((le16_to_cpu(ctx->staging.channel) != ch))
-               ctx->staging.flags = 0;
+       if ((le16_to_cpu(il->staging.channel) != ch))
+               il->staging.flags = 0;
 
-       il_set_rxon_channel(il, channel, ctx);
+       il_set_rxon_channel(il, channel);
        il_set_rxon_ht(il, ht_conf);
-       il_set_flags_for_band(il, ctx, channel->band, ctx->vif);
+       il_set_flags_for_band(il, channel->band, il->vif);
 
        spin_unlock_irq(&il->lock);
 
@@ -5823,10 +6083,10 @@ il4965_mac_channel_switch(struct ieee80211_hw *hw,
         */
        set_bit(S_CHANNEL_SWITCH_PENDING, &il->status);
        il->switch_channel = cpu_to_le16(ch);
-       if (il->cfg->ops->lib->set_channel_switch(il, ch_switch)) {
+       if (il->ops->set_channel_switch(il, ch_switch)) {
                clear_bit(S_CHANNEL_SWITCH_PENDING, &il->status);
                il->switch_channel = 0;
-               ieee80211_chswitch_done(ctx->vif, false);
+               ieee80211_chswitch_done(il->vif, false);
        }
 
 out:
@@ -5860,8 +6120,8 @@ il4965_configure_filter(struct ieee80211_hw *hw, unsigned int changed_flags,
 
        mutex_lock(&il->mutex);
 
-       il->ctx.staging.filter_flags &= ~filter_nand;
-       il->ctx.staging.filter_flags |= filter_or;
+       il->staging.filter_flags &= ~filter_nand;
+       il->staging.filter_flags |= filter_or;
 
        /*
         * Not committing directly because hardware can perform a scan,
@@ -5906,7 +6166,7 @@ il4965_bg_txpower_work(struct work_struct *work)
        /* Regardless of if we are associated, we must reconfigure the
         * TX power since frames can be sent on non-radar channels while
         * not associated */
-       il->cfg->ops->lib->send_tx_power(il);
+       il->ops->send_tx_power(il);
 
        /* Update last_temperature to keep is_calib_needed from running
         * when it isn't needed... */
@@ -6012,6 +6272,28 @@ il4965_tx_queue_set_status(struct il_priv *il, struct il_tx_queue *txq,
               scd_retry ? "BA" : "AC", txq_id, tx_fifo_id);
 }
 
+const struct ieee80211_ops il4965_mac_ops = {
+       .tx = il4965_mac_tx,
+       .start = il4965_mac_start,
+       .stop = il4965_mac_stop,
+       .add_interface = il_mac_add_interface,
+       .remove_interface = il_mac_remove_interface,
+       .change_interface = il_mac_change_interface,
+       .config = il_mac_config,
+       .configure_filter = il4965_configure_filter,
+       .set_key = il4965_mac_set_key,
+       .update_tkip_key = il4965_mac_update_tkip_key,
+       .conf_tx = il_mac_conf_tx,
+       .reset_tsf = il_mac_reset_tsf,
+       .bss_info_changed = il_mac_bss_info_changed,
+       .ampdu_action = il4965_mac_ampdu_action,
+       .hw_scan = il_mac_hw_scan,
+       .sta_add = il4965_mac_sta_add,
+       .sta_remove = il_mac_sta_remove,
+       .channel_switch = il4965_mac_channel_switch,
+       .tx_last_beacon = il_mac_tx_last_beacon,
+};
+
 static int
 il4965_init_drv(struct il_priv *il)
 {
@@ -6036,8 +6318,8 @@ il4965_init_drv(struct il_priv *il)
        il->force_reset.reset_duration = IL_DELAY_NEXT_FORCE_FW_RELOAD;
 
        /* Choose which receivers/antennas to use */
-       if (il->cfg->ops->hcmd->set_rxon_chain)
-               il->cfg->ops->hcmd->set_rxon_chain(il, &il->ctx);
+       if (il->ops->set_rxon_chain)
+               il->ops->set_rxon_chain(il);
 
        il_init_scan_params(il);
 
@@ -6065,7 +6347,6 @@ err:
 static void
 il4965_uninit_drv(struct il_priv *il)
 {
-       il4965_calib_free_results(il);
        il_free_geos(il);
        il_free_channel_map(il);
        kfree(il->scan_cmd);
@@ -6080,9 +6361,37 @@ il4965_hw_detect(struct il_priv *il)
        D_INFO("HW Revision ID = 0x%X\n", il->rev_id);
 }
 
-static int
+static struct il_sensitivity_ranges il4965_sensitivity = {
+       .min_nrg_cck = 97,
+       .max_nrg_cck = 0,       /* not used, set to 0 */
+
+       .auto_corr_min_ofdm = 85,
+       .auto_corr_min_ofdm_mrc = 170,
+       .auto_corr_min_ofdm_x1 = 105,
+       .auto_corr_min_ofdm_mrc_x1 = 220,
+
+       .auto_corr_max_ofdm = 120,
+       .auto_corr_max_ofdm_mrc = 210,
+       .auto_corr_max_ofdm_x1 = 140,
+       .auto_corr_max_ofdm_mrc_x1 = 270,
+
+       .auto_corr_min_cck = 125,
+       .auto_corr_max_cck = 200,
+       .auto_corr_min_cck_mrc = 200,
+       .auto_corr_max_cck_mrc = 400,
+
+       .nrg_th_cck = 100,
+       .nrg_th_ofdm = 100,
+
+       .barker_corr_th_min = 190,
+       .barker_corr_th_min_mrc = 390,
+       .nrg_th_cca = 62,
+};
+
+static void
 il4965_set_hw_params(struct il_priv *il)
 {
+       il->hw_params.bcast_id = IL4965_BROADCAST_ID;
        il->hw_params.max_rxq_size = RX_QUEUE_SIZE;
        il->hw_params.max_rxq_log = RX_QUEUE_SIZE_LOG;
        if (il->cfg->mod_params->amsdu_size_8K)
@@ -6095,20 +6404,37 @@ il4965_set_hw_params(struct il_priv *il)
        if (il->cfg->mod_params->disable_11n)
                il->cfg->sku &= ~IL_SKU_N;
 
-       /* Device-specific setup */
-       return il->cfg->ops->lib->set_hw_params(il);
-}
+       if (il->cfg->mod_params->num_of_queues >= IL_MIN_NUM_QUEUES &&
+           il->cfg->mod_params->num_of_queues <= IL49_NUM_QUEUES)
+               il->cfg->num_of_queues =
+                   il->cfg->mod_params->num_of_queues;
 
-static const u8 il4965_bss_ac_to_fifo[] = {
-       IL_TX_FIFO_VO,
-       IL_TX_FIFO_VI,
-       IL_TX_FIFO_BE,
-       IL_TX_FIFO_BK,
-};
+       il->hw_params.max_txq_num = il->cfg->num_of_queues;
+       il->hw_params.dma_chnl_num = FH49_TCSR_CHNL_NUM;
+       il->hw_params.scd_bc_tbls_size =
+           il->cfg->num_of_queues *
+           sizeof(struct il4965_scd_bc_tbl);
 
-static const u8 il4965_bss_ac_to_queue[] = {
-       0, 1, 2, 3,
-};
+       il->hw_params.tfd_size = sizeof(struct il_tfd);
+       il->hw_params.max_stations = IL4965_STATION_COUNT;
+       il->hw_params.max_data_size = IL49_RTC_DATA_SIZE;
+       il->hw_params.max_inst_size = IL49_RTC_INST_SIZE;
+       il->hw_params.max_bsm_size = BSM_SRAM_SIZE;
+       il->hw_params.ht40_channel = BIT(IEEE80211_BAND_5GHZ);
+
+       il->hw_params.rx_wrt_ptr_reg = FH49_RSCSR_CHNL0_WPTR;
+
+       il->hw_params.tx_chains_num = il4965_num_of_ant(il->cfg->valid_tx_ant);
+       il->hw_params.rx_chains_num = il4965_num_of_ant(il->cfg->valid_rx_ant);
+       il->hw_params.valid_tx_ant = il->cfg->valid_tx_ant;
+       il->hw_params.valid_rx_ant = il->cfg->valid_rx_ant;
+
+       il->hw_params.ct_kill_threshold =
+          CELSIUS_TO_KELVIN(CT_KILL_THRESHOLD_LEGACY);
+
+       il->hw_params.sens = &il4965_sensitivity;
+       il->hw_params.beacon_time_tsf_bits = IL4965_EXT_BEACON_TIME_POS;
+}
 
 static int
 il4965_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
@@ -6124,43 +6450,24 @@ il4965_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
         * 1. Allocating HW data
         ************************/
 
-       hw = il_alloc_all(cfg);
+       hw = ieee80211_alloc_hw(sizeof(struct il_priv), &il4965_mac_ops);
        if (!hw) {
                err = -ENOMEM;
                goto out;
        }
        il = hw->priv;
-       /* At this point both hw and il are allocated. */
-
-       il->ctx.ctxid = 0;
-
-       il->ctx.always_active = true;
-       il->ctx.is_active = true;
-       il->ctx.rxon_cmd = C_RXON;
-       il->ctx.rxon_timing_cmd = C_RXON_TIMING;
-       il->ctx.rxon_assoc_cmd = C_RXON_ASSOC;
-       il->ctx.qos_cmd = C_QOS_PARAM;
-       il->ctx.ap_sta_id = IL_AP_ID;
-       il->ctx.wep_key_cmd = C_WEPKEY;
-       il->ctx.ac_to_fifo = il4965_bss_ac_to_fifo;
-       il->ctx.ac_to_queue = il4965_bss_ac_to_queue;
-       il->ctx.exclusive_interface_modes = BIT(NL80211_IFTYPE_ADHOC);
-       il->ctx.interface_modes = BIT(NL80211_IFTYPE_STATION);
-       il->ctx.ap_devtype = RXON_DEV_TYPE_AP;
-       il->ctx.ibss_devtype = RXON_DEV_TYPE_IBSS;
-       il->ctx.station_devtype = RXON_DEV_TYPE_ESS;
-       il->ctx.unused_devtype = RXON_DEV_TYPE_ESS;
-
+       il->hw = hw;
        SET_IEEE80211_DEV(hw, &pdev->dev);
 
        D_INFO("*** LOAD DRIVER ***\n");
        il->cfg = cfg;
+       il->ops = &il4965_ops;
+#ifdef CONFIG_IWLEGACY_DEBUGFS
+       il->debugfs_ops = &il4965_debugfs_ops;
+#endif
        il->pci_dev = pdev;
        il->inta_mask = CSR_INI_SET_MASK;
 
-       if (il_alloc_traffic_mem(il))
-               IL_ERR("Not enough memory to generate traffic log\n");
-
        /**************************
         * 2. Initializing PCI bus
         **************************/
@@ -6199,7 +6506,7 @@ il4965_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
        /***********************
         * 3. Read REV register
         ***********************/
-       il->hw_base = pci_iomap(pdev, 0, 0);
+       il->hw_base = pci_ioremap_bar(pdev, 0);
        if (!il->hw_base) {
                err = -ENODEV;
                goto out_pci_release_regions;
@@ -6260,10 +6567,7 @@ il4965_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
        /************************
         * 5. Setup HW constants
         ************************/
-       if (il4965_set_hw_params(il)) {
-               IL_ERR("failed to set hw parameters\n");
-               goto out_free_eeprom;
-       }
+       il4965_set_hw_params(il);
 
        /*******************
         * 6. Setup il
@@ -6307,12 +6611,12 @@ il4965_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 
        /* If platform's RF_KILL switch is NOT set to KILL */
        if (_il_rd(il, CSR_GP_CNTRL) & CSR_GP_CNTRL_REG_FLAG_HW_RF_KILL_SW)
-               clear_bit(S_RF_KILL_HW, &il->status);
+               clear_bit(S_RFKILL, &il->status);
        else
-               set_bit(S_RF_KILL_HW, &il->status);
+               set_bit(S_RFKILL, &il->status);
 
        wiphy_rfkill_set_hw_state(il->hw->wiphy,
-                                 test_bit(S_RF_KILL_HW, &il->status));
+                                 test_bit(S_RFKILL, &il->status));
 
        il_power_initialize(il);
 
@@ -6334,14 +6638,13 @@ out_disable_msi:
 out_free_eeprom:
        il_eeprom_free(il);
 out_iounmap:
-       pci_iounmap(pdev, il->hw_base);
+       iounmap(il->hw_base);
 out_pci_release_regions:
        pci_set_drvdata(pdev, NULL);
        pci_release_regions(pdev);
 out_pci_disable_device:
        pci_disable_device(pdev);
 out_ieee80211_free_hw:
-       il_free_traffic_mem(il);
        ieee80211_free_hw(il->hw);
 out:
        return err;
@@ -6412,11 +6715,10 @@ il4965_pci_remove(struct pci_dev *pdev)
         * until now... */
        destroy_workqueue(il->workqueue);
        il->workqueue = NULL;
-       il_free_traffic_mem(il);
 
        free_irq(il->pci_dev->irq, il);
        pci_disable_msi(il->pci_dev);
-       pci_iounmap(pdev, il->hw_base);
+       iounmap(il->hw_base);
        pci_release_regions(pdev);
        pci_disable_device(pdev);
        pci_set_drvdata(pdev, NULL);
index 467d0cb..d7e2856 100644 (file)
@@ -641,13 +641,10 @@ il4965_rs_toggle_antenna(u32 valid_ant, u32 *rate_n_flags,
  * there are no non-GF stations present in the BSS.
  */
 static bool
-il4965_rs_use_green(struct ieee80211_sta *sta)
+il4965_rs_use_green(struct il_priv *il, struct ieee80211_sta *sta)
 {
-       struct il_station_priv *sta_priv = (void *)sta->drv_priv;
-       struct il_rxon_context *ctx = sta_priv->common.ctx;
-
        return (sta->ht_cap.cap & IEEE80211_HT_CAP_GRN_FLD) &&
-           !(ctx->ht.non_gf_sta_present);
+              !il->ht.non_gf_sta_present;
 }
 
 /**
@@ -823,8 +820,6 @@ il4965_rs_tx_status(void *il_r, struct ieee80211_supported_band *sband,
        u32 tx_rate;
        struct il_scale_tbl_info tbl_type;
        struct il_scale_tbl_info *curr_tbl, *other_tbl, *tmp_tbl;
-       struct il_station_priv *sta_priv = (void *)sta->drv_priv;
-       struct il_rxon_context *ctx = sta_priv->common.ctx;
 
        D_RATE("get frame ack response, update rate scale win\n");
 
@@ -892,7 +887,7 @@ il4965_rs_tx_status(void *il_r, struct ieee80211_supported_band *sband,
                lq_sta->missed_rate_counter++;
                if (lq_sta->missed_rate_counter > IL_MISSED_RATE_MAX) {
                        lq_sta->missed_rate_counter = 0;
-                       il_send_lq_cmd(il, ctx, &lq_sta->lq, CMD_ASYNC, false);
+                       il_send_lq_cmd(il, &lq_sta->lq, CMD_ASYNC, false);
                }
                /* Regardless, ignore this status info for outdated rate */
                return;
@@ -1184,8 +1179,6 @@ il4965_rs_switch_to_mimo2(struct il_priv *il, struct il_lq_sta *lq_sta,
        u16 rate_mask;
        s32 rate;
        s8 is_green = lq_sta->is_green;
-       struct il_station_priv *sta_priv = (void *)sta->drv_priv;
-       struct il_rxon_context *ctx = sta_priv->common.ctx;
 
        if (!conf_is_ht(conf) || !sta->ht_cap.ht_supported)
                return -1;
@@ -1206,7 +1199,7 @@ il4965_rs_switch_to_mimo2(struct il_priv *il, struct il_lq_sta *lq_sta,
        tbl->max_search = IL_MAX_SEARCH;
        rate_mask = lq_sta->active_mimo2_rate;
 
-       if (il_is_ht40_tx_allowed(il, ctx, &sta->ht_cap))
+       if (il_is_ht40_tx_allowed(il, &sta->ht_cap))
                tbl->is_ht40 = 1;
        else
                tbl->is_ht40 = 0;
@@ -1240,8 +1233,6 @@ il4965_rs_switch_to_siso(struct il_priv *il, struct il_lq_sta *lq_sta,
        u16 rate_mask;
        u8 is_green = lq_sta->is_green;
        s32 rate;
-       struct il_station_priv *sta_priv = (void *)sta->drv_priv;
-       struct il_rxon_context *ctx = sta_priv->common.ctx;
 
        if (!conf_is_ht(conf) || !sta->ht_cap.ht_supported)
                return -1;
@@ -1254,7 +1245,7 @@ il4965_rs_switch_to_siso(struct il_priv *il, struct il_lq_sta *lq_sta,
        tbl->max_search = IL_MAX_SEARCH;
        rate_mask = lq_sta->active_siso_rate;
 
-       if (il_is_ht40_tx_allowed(il, ctx, &sta->ht_cap))
+       if (il_is_ht40_tx_allowed(il, &sta->ht_cap))
                tbl->is_ht40 = 1;
        else
                tbl->is_ht40 = 0;
@@ -1733,8 +1724,7 @@ il4965_rs_stay_in_table(struct il_lq_sta *lq_sta, bool force_search)
  * setup rate table in uCode
  */
 static void
-il4965_rs_update_rate_tbl(struct il_priv *il, struct il_rxon_context *ctx,
-                         struct il_lq_sta *lq_sta,
+il4965_rs_update_rate_tbl(struct il_priv *il, struct il_lq_sta *lq_sta,
                          struct il_scale_tbl_info *tbl, int idx, u8 is_green)
 {
        u32 rate;
@@ -1742,7 +1732,7 @@ il4965_rs_update_rate_tbl(struct il_priv *il, struct il_rxon_context *ctx,
        /* Update uCode's rate table. */
        rate = il4965_rate_n_flags_from_tbl(il, tbl, idx, is_green);
        il4965_rs_fill_link_cmd(il, lq_sta, rate);
-       il_send_lq_cmd(il, ctx, &lq_sta->lq, CMD_ASYNC, false);
+       il_send_lq_cmd(il, &lq_sta->lq, CMD_ASYNC, false);
 }
 
 /*
@@ -1778,8 +1768,6 @@ il4965_rs_rate_scale_perform(struct il_priv *il, struct sk_buff *skb,
        s32 sr;
        u8 tid = MAX_TID_COUNT;
        struct il_tid_data *tid_data;
-       struct il_station_priv *sta_priv = (void *)sta->drv_priv;
-       struct il_rxon_context *ctx = sta_priv->common.ctx;
 
        D_RATE("rate scale calculate new rate for skb\n");
 
@@ -1815,7 +1803,7 @@ il4965_rs_rate_scale_perform(struct il_priv *il, struct sk_buff *skb,
        if (is_legacy(tbl->lq_type))
                lq_sta->is_green = 0;
        else
-               lq_sta->is_green = il4965_rs_use_green(sta);
+               lq_sta->is_green = il4965_rs_use_green(il, sta);
        is_green = lq_sta->is_green;
 
        /* current tx rate */
@@ -1854,7 +1842,7 @@ il4965_rs_rate_scale_perform(struct il_priv *il, struct sk_buff *skb,
                        tbl = &(lq_sta->lq_info[lq_sta->active_tbl]);
                        /* get "active" rate info */
                        idx = il4965_hwrate_to_plcp_idx(tbl->current_rate);
-                       il4965_rs_update_rate_tbl(il, ctx, lq_sta, tbl, idx,
+                       il4965_rs_update_rate_tbl(il, lq_sta, tbl, idx,
                                                      is_green);
                }
                return;
@@ -2057,8 +2045,7 @@ il4965_rs_rate_scale_perform(struct il_priv *il, struct sk_buff *skb,
 lq_update:
        /* Replace uCode's rate table for the destination station. */
        if (update_lq)
-               il4965_rs_update_rate_tbl(il, ctx, lq_sta, tbl, idx,
-                                             is_green);
+               il4965_rs_update_rate_tbl(il, lq_sta, tbl, idx, is_green);
 
        /* Should we stay with this modulation mode,
         * or search for a new one? */
@@ -2098,7 +2085,7 @@ lq_update:
                        D_RATE("Switch current  mcs: %X idx: %d\n",
                               tbl->current_rate, idx);
                        il4965_rs_fill_link_cmd(il, lq_sta, tbl->current_rate);
-                       il_send_lq_cmd(il, ctx, &lq_sta->lq, CMD_ASYNC, false);
+                       il_send_lq_cmd(il, &lq_sta->lq, CMD_ASYNC, false);
                } else
                        done_search = 1;
        }
@@ -2166,17 +2153,15 @@ il4965_rs_initialize_lq(struct il_priv *il, struct ieee80211_conf *conf,
        int rate_idx;
        int i;
        u32 rate;
-       u8 use_green = il4965_rs_use_green(sta);
+       u8 use_green = il4965_rs_use_green(il, sta);
        u8 active_tbl = 0;
        u8 valid_tx_ant;
        struct il_station_priv *sta_priv;
-       struct il_rxon_context *ctx;
 
        if (!sta || !lq_sta)
                return;
 
        sta_priv = (void *)sta->drv_priv;
-       ctx = sta_priv->common.ctx;
 
        i = lq_sta->last_txrate_idx;
 
@@ -2208,7 +2193,7 @@ il4965_rs_initialize_lq(struct il_priv *il, struct ieee80211_conf *conf,
        il4965_rs_set_expected_tpt_table(lq_sta, tbl);
        il4965_rs_fill_link_cmd(NULL, lq_sta, rate);
        il->stations[lq_sta->lq.sta_id].lq = &lq_sta->lq;
-       il_send_lq_cmd(il, ctx, &lq_sta->lq, CMD_SYNC, true);
+       il_send_lq_cmd(il, &lq_sta->lq, CMD_SYNC, true);
 }
 
 static void
@@ -2341,7 +2326,7 @@ il4965_rs_rate_init(struct il_priv *il, struct ieee80211_sta *sta, u8 sta_id)
        lq_sta->is_dup = 0;
        lq_sta->max_rate_idx = -1;
        lq_sta->missed_rate_counter = IL_MISSED_RATE_MAX;
-       lq_sta->is_green = il4965_rs_use_green(sta);
+       lq_sta->is_green = il4965_rs_use_green(il, sta);
        lq_sta->active_legacy_rate = il->active_rate & ~(0x1000);
        lq_sta->band = il->band;
        /*
@@ -2579,9 +2564,6 @@ il4965_rs_sta_dbgfs_scale_table_write(struct file *file,
        char buf[64];
        size_t buf_size;
        u32 parsed_rate;
-       struct il_station_priv *sta_priv =
-           container_of(lq_sta, struct il_station_priv, lq_sta);
-       struct il_rxon_context *ctx = sta_priv->common.ctx;
 
        il = lq_sta->drv;
        memset(buf, 0, sizeof(buf));
@@ -2603,7 +2585,7 @@ il4965_rs_sta_dbgfs_scale_table_write(struct file *file,
 
        if (lq_sta->dbg_fixed_rate) {
                il4965_rs_fill_link_cmd(NULL, lq_sta, lq_sta->dbg_fixed_rate);
-               il_send_lq_cmd(lq_sta->drv, ctx, &lq_sta->lq, CMD_ASYNC, false);
+               il_send_lq_cmd(lq_sta->drv, &lq_sta->lq, CMD_ASYNC, false);
        }
 
        return count;
index cacbc03..5db1171 100644 (file)
@@ -264,10 +264,6 @@ il4965_led_enable(struct il_priv *il)
        _il_wr(il, CSR_LED_REG, CSR_LED_REG_TRUN_ON);
 }
 
-const struct il_led_ops il4965_led_ops = {
-       .cmd = il4965_send_led_cmd,
-};
-
 static int il4965_send_tx_power(struct il_priv *il);
 static int il4965_hw_get_temperature(struct il_priv *il);
 
@@ -508,7 +504,7 @@ iw4965_is_ht40_channel(__le32 rxon_flags)
                chan_mod == CHANNEL_MODE_MIXED);
 }
 
-static void
+void
 il4965_nic_config(struct il_priv *il)
 {
        unsigned long flags;
@@ -569,82 +565,6 @@ il4965_chain_noise_reset(struct il_priv *il)
        }
 }
 
-static struct il_sensitivity_ranges il4965_sensitivity = {
-       .min_nrg_cck = 97,
-       .max_nrg_cck = 0,       /* not used, set to 0 */
-
-       .auto_corr_min_ofdm = 85,
-       .auto_corr_min_ofdm_mrc = 170,
-       .auto_corr_min_ofdm_x1 = 105,
-       .auto_corr_min_ofdm_mrc_x1 = 220,
-
-       .auto_corr_max_ofdm = 120,
-       .auto_corr_max_ofdm_mrc = 210,
-       .auto_corr_max_ofdm_x1 = 140,
-       .auto_corr_max_ofdm_mrc_x1 = 270,
-
-       .auto_corr_min_cck = 125,
-       .auto_corr_max_cck = 200,
-       .auto_corr_min_cck_mrc = 200,
-       .auto_corr_max_cck_mrc = 400,
-
-       .nrg_th_cck = 100,
-       .nrg_th_ofdm = 100,
-
-       .barker_corr_th_min = 190,
-       .barker_corr_th_min_mrc = 390,
-       .nrg_th_cca = 62,
-};
-
-static void
-il4965_set_ct_threshold(struct il_priv *il)
-{
-       /* want Kelvin */
-       il->hw_params.ct_kill_threshold =
-           CELSIUS_TO_KELVIN(CT_KILL_THRESHOLD_LEGACY);
-}
-
-/**
- * il4965_hw_set_hw_params
- *
- * Called when initializing driver
- */
-static int
-il4965_hw_set_hw_params(struct il_priv *il)
-{
-       if (il->cfg->mod_params->num_of_queues >= IL_MIN_NUM_QUEUES &&
-           il->cfg->mod_params->num_of_queues <= IL49_NUM_QUEUES)
-               il->cfg->base_params->num_of_queues =
-                   il->cfg->mod_params->num_of_queues;
-
-       il->hw_params.max_txq_num = il->cfg->base_params->num_of_queues;
-       il->hw_params.dma_chnl_num = FH49_TCSR_CHNL_NUM;
-       il->hw_params.scd_bc_tbls_size =
-           il->cfg->base_params->num_of_queues *
-           sizeof(struct il4965_scd_bc_tbl);
-       il->hw_params.tfd_size = sizeof(struct il_tfd);
-       il->hw_params.max_stations = IL4965_STATION_COUNT;
-       il->ctx.bcast_sta_id = IL4965_BROADCAST_ID;
-       il->hw_params.max_data_size = IL49_RTC_DATA_SIZE;
-       il->hw_params.max_inst_size = IL49_RTC_INST_SIZE;
-       il->hw_params.max_bsm_size = BSM_SRAM_SIZE;
-       il->hw_params.ht40_channel = BIT(IEEE80211_BAND_5GHZ);
-
-       il->hw_params.rx_wrt_ptr_reg = FH49_RSCSR_CHNL0_WPTR;
-
-       il->hw_params.tx_chains_num = il4965_num_of_ant(il->cfg->valid_tx_ant);
-       il->hw_params.rx_chains_num = il4965_num_of_ant(il->cfg->valid_rx_ant);
-       il->hw_params.valid_tx_ant = il->cfg->valid_tx_ant;
-       il->hw_params.valid_rx_ant = il->cfg->valid_rx_ant;
-
-       il4965_set_ct_threshold(il);
-
-       il->hw_params.sens = &il4965_sensitivity;
-       il->hw_params.beacon_time_tsf_bits = IL4965_EXT_BEACON_TIME_POS;
-
-       return 0;
-}
-
 static s32
 il4965_math_div_round(s32 num, s32 denom, s32 * res)
 {
@@ -1342,7 +1262,6 @@ il4965_send_tx_power(struct il_priv *il)
        u8 band = 0;
        bool is_ht40 = false;
        u8 ctrl_chan_high = 0;
-       struct il_rxon_context *ctx = &il->ctx;
 
        if (WARN_ONCE
            (test_bit(S_SCAN_HW, &il->status),
@@ -1351,16 +1270,16 @@ il4965_send_tx_power(struct il_priv *il)
 
        band = il->band == IEEE80211_BAND_2GHZ;
 
-       is_ht40 = iw4965_is_ht40_channel(ctx->active.flags);
+       is_ht40 = iw4965_is_ht40_channel(il->active.flags);
 
-       if (is_ht40 && (ctx->active.flags & RXON_FLG_CTRL_CHANNEL_LOC_HI_MSK))
+       if (is_ht40 && (il->active.flags & RXON_FLG_CTRL_CHANNEL_LOC_HI_MSK))
                ctrl_chan_high = 1;
 
        cmd.band = band;
-       cmd.channel = ctx->active.channel;
+       cmd.channel = il->active.channel;
 
        ret =
-           il4965_fill_txpower_tbl(il, band, le16_to_cpu(ctx->active.channel),
+           il4965_fill_txpower_tbl(il, band, le16_to_cpu(il->active.channel),
                                    is_ht40, ctrl_chan_high, &cmd.tx_power);
        if (ret)
                goto out;
@@ -1372,12 +1291,12 @@ out:
 }
 
 static int
-il4965_send_rxon_assoc(struct il_priv *il, struct il_rxon_context *ctx)
+il4965_send_rxon_assoc(struct il_priv *il)
 {
        int ret = 0;
        struct il4965_rxon_assoc_cmd rxon_assoc;
-       const struct il_rxon_cmd *rxon1 = &ctx->staging;
-       const struct il_rxon_cmd *rxon2 = &ctx->active;
+       const struct il_rxon_cmd *rxon1 = &il->staging;
+       const struct il_rxon_cmd *rxon2 = &il->active;
 
        if (rxon1->flags == rxon2->flags &&
            rxon1->filter_flags == rxon2->filter_flags &&
@@ -1392,16 +1311,16 @@ il4965_send_rxon_assoc(struct il_priv *il, struct il_rxon_context *ctx)
                return 0;
        }
 
-       rxon_assoc.flags = ctx->staging.flags;
-       rxon_assoc.filter_flags = ctx->staging.filter_flags;
-       rxon_assoc.ofdm_basic_rates = ctx->staging.ofdm_basic_rates;
-       rxon_assoc.cck_basic_rates = ctx->staging.cck_basic_rates;
+       rxon_assoc.flags = il->staging.flags;
+       rxon_assoc.filter_flags = il->staging.filter_flags;
+       rxon_assoc.ofdm_basic_rates = il->staging.ofdm_basic_rates;
+       rxon_assoc.cck_basic_rates = il->staging.cck_basic_rates;
        rxon_assoc.reserved = 0;
        rxon_assoc.ofdm_ht_single_stream_basic_rates =
-           ctx->staging.ofdm_ht_single_stream_basic_rates;
+           il->staging.ofdm_ht_single_stream_basic_rates;
        rxon_assoc.ofdm_ht_dual_stream_basic_rates =
-           ctx->staging.ofdm_ht_dual_stream_basic_rates;
-       rxon_assoc.rx_chain_select_flags = ctx->staging.rx_chain;
+           il->staging.ofdm_ht_dual_stream_basic_rates;
+       rxon_assoc.rx_chain_select_flags = il->staging.rx_chain;
 
        ret =
            il_send_cmd_pdu_async(il, C_RXON_ASSOC, sizeof(rxon_assoc),
@@ -1411,23 +1330,20 @@ il4965_send_rxon_assoc(struct il_priv *il, struct il_rxon_context *ctx)
 }
 
 static int
-il4965_commit_rxon(struct il_priv *il, struct il_rxon_context *ctx)
+il4965_commit_rxon(struct il_priv *il)
 {
        /* cast away the const for active_rxon in this function */
-       struct il_rxon_cmd *active_rxon = (void *)&ctx->active;
+       struct il_rxon_cmd *active_rxon = (void *)&il->active;
        int ret;
-       bool new_assoc = !!(ctx->staging.filter_flags & RXON_FILTER_ASSOC_MSK);
+       bool new_assoc = !!(il->staging.filter_flags & RXON_FILTER_ASSOC_MSK);
 
        if (!il_is_alive(il))
                return -EBUSY;
 
-       if (!ctx->is_active)
-               return 0;
-
        /* always get timestamp with Rx frame */
-       ctx->staging.flags |= RXON_FLG_TSF2HOST_MSK;
+       il->staging.flags |= RXON_FLG_TSF2HOST_MSK;
 
-       ret = il_check_rxon_cmd(il, ctx);
+       ret = il_check_rxon_cmd(il);
        if (ret) {
                IL_ERR("Invalid RXON configuration.  Not committing.\n");
                return -EINVAL;
@@ -1438,7 +1354,7 @@ il4965_commit_rxon(struct il_priv *il, struct il_rxon_context *ctx)
         * abort any previous channel switch if still in process
         */
        if (test_bit(S_CHANNEL_SWITCH_PENDING, &il->status) &&
-           il->switch_channel != ctx->staging.channel) {
+           il->switch_channel != il->staging.channel) {
                D_11H("abort channel switch on %d\n",
                      le16_to_cpu(il->switch_channel));
                il_chswitch_done(il, false);
@@ -1447,15 +1363,15 @@ il4965_commit_rxon(struct il_priv *il, struct il_rxon_context *ctx)
        /* If we don't need to send a full RXON, we can use
         * il_rxon_assoc_cmd which is used to reconfigure filter
         * and other flags for the current radio configuration. */
-       if (!il_full_rxon_required(il, ctx)) {
-               ret = il_send_rxon_assoc(il, ctx);
+       if (!il_full_rxon_required(il)) {
+               ret = il_send_rxon_assoc(il);
                if (ret) {
                        IL_ERR("Error setting RXON_ASSOC (%d)\n", ret);
                        return ret;
                }
 
-               memcpy(active_rxon, &ctx->staging, sizeof(*active_rxon));
-               il_print_rx_config_cmd(il, ctx);
+               memcpy(active_rxon, &il->staging, sizeof(*active_rxon));
+               il_print_rx_config_cmd(il);
                /*
                 * We do not commit tx power settings while channel changing,
                 * do it now if tx power changed.
@@ -1468,12 +1384,12 @@ il4965_commit_rxon(struct il_priv *il, struct il_rxon_context *ctx)
         * an RXON_ASSOC and the new config wants the associated mask enabled,
         * we must clear the associated from the active configuration
         * before we apply the new config */
-       if (il_is_associated_ctx(ctx) && new_assoc) {
+       if (il_is_associated(il) && new_assoc) {
                D_INFO("Toggling associated bit on current RXON\n");
                active_rxon->filter_flags &= ~RXON_FILTER_ASSOC_MSK;
 
                ret =
-                   il_send_cmd_pdu(il, ctx->rxon_cmd,
+                   il_send_cmd_pdu(il, C_RXON,
                                    sizeof(struct il_rxon_cmd), active_rxon);
 
                /* If the mask clearing failed then we set
@@ -1483,9 +1399,9 @@ il4965_commit_rxon(struct il_priv *il, struct il_rxon_context *ctx)
                        IL_ERR("Error clearing ASSOC_MSK (%d)\n", ret);
                        return ret;
                }
-               il_clear_ucode_stations(il, ctx);
-               il_restore_stations(il, ctx);
-               ret = il4965_restore_default_wep_keys(il, ctx);
+               il_clear_ucode_stations(il);
+               il_restore_stations(il);
+               ret = il4965_restore_default_wep_keys(il);
                if (ret) {
                        IL_ERR("Failed to restore WEP keys (%d)\n", ret);
                        return ret;
@@ -1494,9 +1410,9 @@ il4965_commit_rxon(struct il_priv *il, struct il_rxon_context *ctx)
 
        D_INFO("Sending RXON\n" "* with%s RXON_FILTER_ASSOC_MSK\n"
               "* channel = %d\n" "* bssid = %pM\n", (new_assoc ? "" : "out"),
-              le16_to_cpu(ctx->staging.channel), ctx->staging.bssid_addr);
+              le16_to_cpu(il->staging.channel), il->staging.bssid_addr);
 
-       il_set_rxon_hwcrypto(il, ctx, !il->cfg->mod_params->sw_crypto);
+       il_set_rxon_hwcrypto(il, !il->cfg->mod_params->sw_crypto);
 
        /* Apply the new configuration
         * RXON unassoc clears the station table in uCode so restoration of
@@ -1504,17 +1420,17 @@ il4965_commit_rxon(struct il_priv *il, struct il_rxon_context *ctx)
         */
        if (!new_assoc) {
                ret =
-                   il_send_cmd_pdu(il, ctx->rxon_cmd,
-                                   sizeof(struct il_rxon_cmd), &ctx->staging);
+                   il_send_cmd_pdu(il, C_RXON,
+                                   sizeof(struct il_rxon_cmd), &il->staging);
                if (ret) {
                        IL_ERR("Error setting new RXON (%d)\n", ret);
                        return ret;
                }
                D_INFO("Return from !new_assoc RXON.\n");
-               memcpy(active_rxon, &ctx->staging, sizeof(*active_rxon));
-               il_clear_ucode_stations(il, ctx);
-               il_restore_stations(il, ctx);
-               ret = il4965_restore_default_wep_keys(il, ctx);
+               memcpy(active_rxon, &il->staging, sizeof(*active_rxon));
+               il_clear_ucode_stations(il);
+               il_restore_stations(il);
+               ret = il4965_restore_default_wep_keys(il);
                if (ret) {
                        IL_ERR("Failed to restore WEP keys (%d)\n", ret);
                        return ret;
@@ -1526,15 +1442,15 @@ il4965_commit_rxon(struct il_priv *il, struct il_rxon_context *ctx)
                 * RXON assoc doesn't clear the station table in uCode,
                 */
                ret =
-                   il_send_cmd_pdu(il, ctx->rxon_cmd,
-                                   sizeof(struct il_rxon_cmd), &ctx->staging);
+                   il_send_cmd_pdu(il, C_RXON,
+                                   sizeof(struct il_rxon_cmd), &il->staging);
                if (ret) {
                        IL_ERR("Error setting new RXON (%d)\n", ret);
                        return ret;
                }
-               memcpy(active_rxon, &ctx->staging, sizeof(*active_rxon));
+               memcpy(active_rxon, &il->staging, sizeof(*active_rxon));
        }
-       il_print_rx_config_cmd(il, ctx);
+       il_print_rx_config_cmd(il);
 
        il4965_init_sensitivity(il);
 
@@ -1553,7 +1469,6 @@ static int
 il4965_hw_channel_switch(struct il_priv *il,
                         struct ieee80211_channel_switch *ch_switch)
 {
-       struct il_rxon_context *ctx = &il->ctx;
        int rc;
        u8 band = 0;
        bool is_ht40 = false;
@@ -1564,21 +1479,24 @@ il4965_hw_channel_switch(struct il_priv *il,
        u16 ch;
        u32 tsf_low;
        u8 switch_count;
-       u16 beacon_interval = le16_to_cpu(ctx->timing.beacon_interval);
-       struct ieee80211_vif *vif = ctx->vif;
-       band = il->band == IEEE80211_BAND_2GHZ;
+       u16 beacon_interval = le16_to_cpu(il->timing.beacon_interval);
+       struct ieee80211_vif *vif = il->vif;
+       band = (il->band == IEEE80211_BAND_2GHZ);
+
+       if (WARN_ON_ONCE(vif == NULL))
+               return -EIO;
 
-       is_ht40 = iw4965_is_ht40_channel(ctx->staging.flags);
+       is_ht40 = iw4965_is_ht40_channel(il->staging.flags);
 
-       if (is_ht40 && (ctx->staging.flags & RXON_FLG_CTRL_CHANNEL_LOC_HI_MSK))
+       if (is_ht40 && (il->staging.flags & RXON_FLG_CTRL_CHANNEL_LOC_HI_MSK))
                ctrl_chan_high = 1;
 
        cmd.band = band;
        cmd.expect_beacon = 0;
        ch = ch_switch->channel->hw_value;
        cmd.channel = cpu_to_le16(ch);
-       cmd.rxon_flags = ctx->staging.flags;
-       cmd.rxon_filter_flags = ctx->staging.filter_flags;
+       cmd.rxon_flags = il->staging.flags;
+       cmd.rxon_filter_flags = il->staging.filter_flags;
        switch_count = ch_switch->count;
        tsf_low = ch_switch->timestamp & 0x0ffffffff;
        /*
@@ -1611,7 +1529,7 @@ il4965_hw_channel_switch(struct il_priv *il,
                cmd.expect_beacon = il_is_channel_radar(ch_info);
        else {
                IL_ERR("invalid channel switch from %u to %u\n",
-                      ctx->active.channel, ch);
+                      il->active.channel, ch);
                return -EFAULT;
        }
 
@@ -1756,7 +1674,7 @@ il4965_is_temp_calib_needed(struct il_priv *il)
        return 1;
 }
 
-static void
+void
 il4965_temperature_calib(struct il_priv *il)
 {
        s32 temp;
@@ -1815,339 +1733,21 @@ il4965_build_addsta_hcmd(const struct il_addsta_cmd *cmd, u8 * data)
        return (u16) sizeof(struct il4965_addsta_cmd);
 }
 
-static inline u32
-il4965_get_scd_ssn(struct il4965_tx_resp *tx_resp)
-{
-       return le32_to_cpup(&tx_resp->u.status + tx_resp->frame_count) & MAX_SN;
-}
-
-static inline u32
-il4965_tx_status_to_mac80211(u32 status)
-{
-       status &= TX_STATUS_MSK;
-
-       switch (status) {
-       case TX_STATUS_SUCCESS:
-       case TX_STATUS_DIRECT_DONE:
-               return IEEE80211_TX_STAT_ACK;
-       case TX_STATUS_FAIL_DEST_PS:
-               return IEEE80211_TX_STAT_TX_FILTERED;
-       default:
-               return 0;
-       }
-}
-
-static inline bool
-il4965_is_tx_success(u32 status)
-{
-       status &= TX_STATUS_MSK;
-       return (status == TX_STATUS_SUCCESS || status == TX_STATUS_DIRECT_DONE);
-}
-
-/**
- * il4965_tx_status_reply_tx - Handle Tx response for frames in aggregation queue
- */
-static int
-il4965_tx_status_reply_tx(struct il_priv *il, struct il_ht_agg *agg,
-                         struct il4965_tx_resp *tx_resp, int txq_id,
-                         u16 start_idx)
-{
-       u16 status;
-       struct agg_tx_status *frame_status = tx_resp->u.agg_status;
-       struct ieee80211_tx_info *info = NULL;
-       struct ieee80211_hdr *hdr = NULL;
-       u32 rate_n_flags = le32_to_cpu(tx_resp->rate_n_flags);
-       int i, sh, idx;
-       u16 seq;
-       if (agg->wait_for_ba)
-               D_TX_REPLY("got tx response w/o block-ack\n");
-
-       agg->frame_count = tx_resp->frame_count;
-       agg->start_idx = start_idx;
-       agg->rate_n_flags = rate_n_flags;
-       agg->bitmap = 0;
-
-       /* num frames attempted by Tx command */
-       if (agg->frame_count == 1) {
-               /* Only one frame was attempted; no block-ack will arrive */
-               status = le16_to_cpu(frame_status[0].status);
-               idx = start_idx;
-
-               D_TX_REPLY("FrameCnt = %d, StartIdx=%d idx=%d\n",
-                          agg->frame_count, agg->start_idx, idx);
-
-               info = IEEE80211_SKB_CB(il->txq[txq_id].txb[idx].skb);
-               info->status.rates[0].count = tx_resp->failure_frame + 1;
-               info->flags &= ~IEEE80211_TX_CTL_AMPDU;
-               info->flags |= il4965_tx_status_to_mac80211(status);
-               il4965_hwrate_to_tx_control(il, rate_n_flags, info);
-
-               D_TX_REPLY("1 Frame 0x%x failure :%d\n", status & 0xff,
-                          tx_resp->failure_frame);
-               D_TX_REPLY("Rate Info rate_n_flags=%x\n", rate_n_flags);
-
-               agg->wait_for_ba = 0;
-       } else {
-               /* Two or more frames were attempted; expect block-ack */
-               u64 bitmap = 0;
-               int start = agg->start_idx;
-
-               /* Construct bit-map of pending frames within Tx win */
-               for (i = 0; i < agg->frame_count; i++) {
-                       u16 sc;
-                       status = le16_to_cpu(frame_status[i].status);
-                       seq = le16_to_cpu(frame_status[i].sequence);
-                       idx = SEQ_TO_IDX(seq);
-                       txq_id = SEQ_TO_QUEUE(seq);
-
-                       if (status &
-                           (AGG_TX_STATE_FEW_BYTES_MSK |
-                            AGG_TX_STATE_ABORT_MSK))
-                               continue;
-
-                       D_TX_REPLY("FrameCnt = %d, txq_id=%d idx=%d\n",
-                                  agg->frame_count, txq_id, idx);
-
-                       hdr = il_tx_queue_get_hdr(il, txq_id, idx);
-                       if (!hdr) {
-                               IL_ERR("BUG_ON idx doesn't point to valid skb"
-                                      " idx=%d, txq_id=%d\n", idx, txq_id);
-                               return -1;
-                       }
-
-                       sc = le16_to_cpu(hdr->seq_ctrl);
-                       if (idx != (SEQ_TO_SN(sc) & 0xff)) {
-                               IL_ERR("BUG_ON idx doesn't match seq control"
-                                      " idx=%d, seq_idx=%d, seq=%d\n", idx,
-                                      SEQ_TO_SN(sc), hdr->seq_ctrl);
-                               return -1;
-                       }
-
-                       D_TX_REPLY("AGG Frame i=%d idx %d seq=%d\n", i, idx,
-                                  SEQ_TO_SN(sc));
-
-                       sh = idx - start;
-                       if (sh > 64) {
-                               sh = (start - idx) + 0xff;
-                               bitmap = bitmap << sh;
-                               sh = 0;
-                               start = idx;
-                       } else if (sh < -64)
-                               sh = 0xff - (start - idx);
-                       else if (sh < 0) {
-                               sh = start - idx;
-                               start = idx;
-                               bitmap = bitmap << sh;
-                               sh = 0;
-                       }
-                       bitmap |= 1ULL << sh;
-                       D_TX_REPLY("start=%d bitmap=0x%llx\n", start,
-                                  (unsigned long long)bitmap);
-               }
-
-               agg->bitmap = bitmap;
-               agg->start_idx = start;
-               D_TX_REPLY("Frames %d start_idx=%d bitmap=0x%llx\n",
-                          agg->frame_count, agg->start_idx,
-                          (unsigned long long)agg->bitmap);
-
-               if (bitmap)
-                       agg->wait_for_ba = 1;
-       }
-       return 0;
-}
-
-static u8
-il4965_find_station(struct il_priv *il, const u8 * addr)
-{
-       int i;
-       int start = 0;
-       int ret = IL_INVALID_STATION;
-       unsigned long flags;
-
-       if ((il->iw_mode == NL80211_IFTYPE_ADHOC))
-               start = IL_STA_ID;
-
-       if (is_broadcast_ether_addr(addr))
-               return il->ctx.bcast_sta_id;
-
-       spin_lock_irqsave(&il->sta_lock, flags);
-       for (i = start; i < il->hw_params.max_stations; i++)
-               if (il->stations[i].used &&
-                   (!compare_ether_addr(il->stations[i].sta.sta.addr, addr))) {
-                       ret = i;
-                       goto out;
-               }
-
-       D_ASSOC("can not find STA %pM total %d\n", addr, il->num_stations);
-
-out:
-       /*
-        * It may be possible that more commands interacting with stations
-        * arrive before we completed processing the adding of
-        * station
-        */
-       if (ret != IL_INVALID_STATION &&
-           (!(il->stations[ret].used & IL_STA_UCODE_ACTIVE) ||
-            ((il->stations[ret].used & IL_STA_UCODE_ACTIVE) &&
-             (il->stations[ret].used & IL_STA_UCODE_INPROGRESS)))) {
-               IL_ERR("Requested station info for sta %d before ready.\n",
-                      ret);
-               ret = IL_INVALID_STATION;
-       }
-       spin_unlock_irqrestore(&il->sta_lock, flags);
-       return ret;
-}
-
-static int
-il4965_get_ra_sta_id(struct il_priv *il, struct ieee80211_hdr *hdr)
-{
-       if (il->iw_mode == NL80211_IFTYPE_STATION) {
-               return IL_AP_ID;
-       } else {
-               u8 *da = ieee80211_get_DA(hdr);
-               return il4965_find_station(il, da);
-       }
-}
-
-/**
- * il4965_hdl_tx - Handle standard (non-aggregation) Tx response
- */
-static void
-il4965_hdl_tx(struct il_priv *il, struct il_rx_buf *rxb)
-{
-       struct il_rx_pkt *pkt = rxb_addr(rxb);
-       u16 sequence = le16_to_cpu(pkt->hdr.sequence);
-       int txq_id = SEQ_TO_QUEUE(sequence);
-       int idx = SEQ_TO_IDX(sequence);
-       struct il_tx_queue *txq = &il->txq[txq_id];
-       struct ieee80211_hdr *hdr;
-       struct ieee80211_tx_info *info;
-       struct il4965_tx_resp *tx_resp = (void *)&pkt->u.raw[0];
-       u32 status = le32_to_cpu(tx_resp->u.status);
-       int uninitialized_var(tid);
-       int sta_id;
-       int freed;
-       u8 *qc = NULL;
-       unsigned long flags;
-
-       if (idx >= txq->q.n_bd || il_queue_used(&txq->q, idx) == 0) {
-               IL_ERR("Read idx for DMA queue txq_id (%d) idx %d "
-                      "is out of range [0-%d] %d %d\n", txq_id, idx,
-                      txq->q.n_bd, txq->q.write_ptr, txq->q.read_ptr);
-               return;
-       }
-
-       txq->time_stamp = jiffies;
-       info = IEEE80211_SKB_CB(txq->txb[txq->q.read_ptr].skb);
-       memset(&info->status, 0, sizeof(info->status));
-
-       hdr = il_tx_queue_get_hdr(il, txq_id, idx);
-       if (ieee80211_is_data_qos(hdr->frame_control)) {
-               qc = ieee80211_get_qos_ctl(hdr);
-               tid = qc[0] & 0xf;
-       }
-
-       sta_id = il4965_get_ra_sta_id(il, hdr);
-       if (txq->sched_retry && unlikely(sta_id == IL_INVALID_STATION)) {
-               IL_ERR("Station not known\n");
-               return;
-       }
-
-       spin_lock_irqsave(&il->sta_lock, flags);
-       if (txq->sched_retry) {
-               const u32 scd_ssn = il4965_get_scd_ssn(tx_resp);
-               struct il_ht_agg *agg = NULL;
-               WARN_ON(!qc);
-
-               agg = &il->stations[sta_id].tid[tid].agg;
-
-               il4965_tx_status_reply_tx(il, agg, tx_resp, txq_id, idx);
-
-               /* check if BAR is needed */
-               if ((tx_resp->frame_count == 1) &&
-                   !il4965_is_tx_success(status))
-                       info->flags |= IEEE80211_TX_STAT_AMPDU_NO_BACK;
-
-               if (txq->q.read_ptr != (scd_ssn & 0xff)) {
-                       idx = il_queue_dec_wrap(scd_ssn & 0xff, txq->q.n_bd);
-                       D_TX_REPLY("Retry scheduler reclaim scd_ssn "
-                                  "%d idx %d\n", scd_ssn, idx);
-                       freed = il4965_tx_queue_reclaim(il, txq_id, idx);
-                       if (qc)
-                               il4965_free_tfds_in_queue(il, sta_id, tid,
-                                                         freed);
-
-                       if (il->mac80211_registered &&
-                           il_queue_space(&txq->q) > txq->q.low_mark &&
-                           agg->state != IL_EMPTYING_HW_QUEUE_DELBA)
-                               il_wake_queue(il, txq);
-               }
-       } else {
-               info->status.rates[0].count = tx_resp->failure_frame + 1;
-               info->flags |= il4965_tx_status_to_mac80211(status);
-               il4965_hwrate_to_tx_control(il,
-                                           le32_to_cpu(tx_resp->rate_n_flags),
-                                           info);
-
-               D_TX_REPLY("TXQ %d status %s (0x%08x) "
-                          "rate_n_flags 0x%x retries %d\n", txq_id,
-                          il4965_get_tx_fail_reason(status), status,
-                          le32_to_cpu(tx_resp->rate_n_flags),
-                          tx_resp->failure_frame);
-
-               freed = il4965_tx_queue_reclaim(il, txq_id, idx);
-               if (qc && likely(sta_id != IL_INVALID_STATION))
-                       il4965_free_tfds_in_queue(il, sta_id, tid, freed);
-               else if (sta_id == IL_INVALID_STATION)
-                       D_TX_REPLY("Station not known\n");
-
-               if (il->mac80211_registered &&
-                   il_queue_space(&txq->q) > txq->q.low_mark)
-                       il_wake_queue(il, txq);
-       }
-       if (qc && likely(sta_id != IL_INVALID_STATION))
-               il4965_txq_check_empty(il, sta_id, tid, txq_id);
-
-       il4965_check_abort_status(il, tx_resp->frame_count, status);
-
-       spin_unlock_irqrestore(&il->sta_lock, flags);
-}
-
-/* Set up 4965-specific Rx frame reply handlers */
-static void
-il4965_handler_setup(struct il_priv *il)
-{
-       /* Legacy Rx frames */
-       il->handlers[N_RX] = il4965_hdl_rx;
-       /* Tx response */
-       il->handlers[C_TX] = il4965_hdl_tx;
-}
-
-static struct il_hcmd_ops il4965_hcmd = {
-       .rxon_assoc = il4965_send_rxon_assoc,
-       .commit_rxon = il4965_commit_rxon,
-       .set_rxon_chain = il4965_set_rxon_chain,
-};
-
 static void
 il4965_post_scan(struct il_priv *il)
 {
-       struct il_rxon_context *ctx = &il->ctx;
-
        /*
         * Since setting the RXON may have been deferred while
         * performing the scan, fire one off if needed
         */
-       if (memcmp(&ctx->staging, &ctx->active, sizeof(ctx->staging)))
-               il_commit_rxon(il, ctx);
+       if (memcmp(&il->staging, &il->active, sizeof(il->staging)))
+               il_commit_rxon(il);
 }
 
 static void
 il4965_post_associate(struct il_priv *il)
 {
-       struct il_rxon_context *ctx = &il->ctx;
-       struct ieee80211_vif *vif = ctx->vif;
+       struct ieee80211_vif *vif = il->vif;
        struct ieee80211_conf *conf = NULL;
        int ret = 0;
 
@@ -2161,41 +1761,41 @@ il4965_post_associate(struct il_priv *il)
 
        conf = &il->hw->conf;
 
-       ctx->staging.filter_flags &= ~RXON_FILTER_ASSOC_MSK;
-       il_commit_rxon(il, ctx);
+       il->staging.filter_flags &= ~RXON_FILTER_ASSOC_MSK;
+       il_commit_rxon(il);
 
-       ret = il_send_rxon_timing(il, ctx);
+       ret = il_send_rxon_timing(il);
        if (ret)
                IL_WARN("RXON timing - " "Attempting to continue.\n");
 
-       ctx->staging.filter_flags |= RXON_FILTER_ASSOC_MSK;
+       il->staging.filter_flags |= RXON_FILTER_ASSOC_MSK;
 
        il_set_rxon_ht(il, &il->current_ht_config);
 
-       if (il->cfg->ops->hcmd->set_rxon_chain)
-               il->cfg->ops->hcmd->set_rxon_chain(il, ctx);
+       if (il->ops->set_rxon_chain)
+               il->ops->set_rxon_chain(il);
 
-       ctx->staging.assoc_id = cpu_to_le16(vif->bss_conf.aid);
+       il->staging.assoc_id = cpu_to_le16(vif->bss_conf.aid);
 
        D_ASSOC("assoc id %d beacon interval %d\n", vif->bss_conf.aid,
                vif->bss_conf.beacon_int);
 
        if (vif->bss_conf.use_short_preamble)
-               ctx->staging.flags |= RXON_FLG_SHORT_PREAMBLE_MSK;
+               il->staging.flags |= RXON_FLG_SHORT_PREAMBLE_MSK;
        else
-               ctx->staging.flags &= ~RXON_FLG_SHORT_PREAMBLE_MSK;
+               il->staging.flags &= ~RXON_FLG_SHORT_PREAMBLE_MSK;
 
-       if (ctx->staging.flags & RXON_FLG_BAND_24G_MSK) {
+       if (il->staging.flags & RXON_FLG_BAND_24G_MSK) {
                if (vif->bss_conf.use_short_slot)
-                       ctx->staging.flags |= RXON_FLG_SHORT_SLOT_MSK;
+                       il->staging.flags |= RXON_FLG_SHORT_SLOT_MSK;
                else
-                       ctx->staging.flags &= ~RXON_FLG_SHORT_SLOT_MSK;
+                       il->staging.flags &= ~RXON_FLG_SHORT_SLOT_MSK;
        }
 
-       il_commit_rxon(il, ctx);
+       il_commit_rxon(il);
 
        D_ASSOC("Associated as %d to: %pM\n", vif->bss_conf.aid,
-               ctx->active.bssid_addr);
+               il->active.bssid_addr);
 
        switch (vif->type) {
        case NL80211_IFTYPE_STATION:
@@ -2223,8 +1823,7 @@ il4965_post_associate(struct il_priv *il)
 static void
 il4965_config_ap(struct il_priv *il)
 {
-       struct il_rxon_context *ctx = &il->ctx;
-       struct ieee80211_vif *vif = ctx->vif;
+       struct ieee80211_vif *vif = il->vif;
        int ret = 0;
 
        lockdep_assert_held(&il->mutex);
@@ -2233,14 +1832,14 @@ il4965_config_ap(struct il_priv *il)
                return;
 
        /* The following should be done only at AP bring up */
-       if (!il_is_associated_ctx(ctx)) {
+       if (!il_is_associated(il)) {
 
                /* RXON - unassoc (to set timing command) */
-               ctx->staging.filter_flags &= ~RXON_FILTER_ASSOC_MSK;
-               il_commit_rxon(il, ctx);
+               il->staging.filter_flags &= ~RXON_FILTER_ASSOC_MSK;
+               il_commit_rxon(il);
 
                /* RXON Timing */
-               ret = il_send_rxon_timing(il, ctx);
+               ret = il_send_rxon_timing(il);
                if (ret)
                        IL_WARN("RXON timing failed - "
                                "Attempting to continue.\n");
@@ -2248,133 +1847,63 @@ il4965_config_ap(struct il_priv *il)
                /* AP has all antennas */
                il->chain_noise_data.active_chains = il->hw_params.valid_rx_ant;
                il_set_rxon_ht(il, &il->current_ht_config);
-               if (il->cfg->ops->hcmd->set_rxon_chain)
-                       il->cfg->ops->hcmd->set_rxon_chain(il, ctx);
+               if (il->ops->set_rxon_chain)
+                       il->ops->set_rxon_chain(il);
 
-               ctx->staging.assoc_id = 0;
+               il->staging.assoc_id = 0;
 
                if (vif->bss_conf.use_short_preamble)
-                       ctx->staging.flags |= RXON_FLG_SHORT_PREAMBLE_MSK;
+                       il->staging.flags |= RXON_FLG_SHORT_PREAMBLE_MSK;
                else
-                       ctx->staging.flags &= ~RXON_FLG_SHORT_PREAMBLE_MSK;
+                       il->staging.flags &= ~RXON_FLG_SHORT_PREAMBLE_MSK;
 
-               if (ctx->staging.flags & RXON_FLG_BAND_24G_MSK) {
+               if (il->staging.flags & RXON_FLG_BAND_24G_MSK) {
                        if (vif->bss_conf.use_short_slot)
-                               ctx->staging.flags |= RXON_FLG_SHORT_SLOT_MSK;
+                               il->staging.flags |= RXON_FLG_SHORT_SLOT_MSK;
                        else
-                               ctx->staging.flags &= ~RXON_FLG_SHORT_SLOT_MSK;
+                               il->staging.flags &= ~RXON_FLG_SHORT_SLOT_MSK;
                }
                /* need to send beacon cmd before committing assoc RXON! */
                il4965_send_beacon_cmd(il);
                /* restore RXON assoc */
-               ctx->staging.filter_flags |= RXON_FILTER_ASSOC_MSK;
-               il_commit_rxon(il, ctx);
+               il->staging.filter_flags |= RXON_FILTER_ASSOC_MSK;
+               il_commit_rxon(il);
        }
        il4965_send_beacon_cmd(il);
 }
 
-static struct il_hcmd_utils_ops il4965_hcmd_utils = {
-       .get_hcmd_size = il4965_get_hcmd_size,
-       .build_addsta_hcmd = il4965_build_addsta_hcmd,
-       .request_scan = il4965_request_scan,
-       .post_scan = il4965_post_scan,
-};
-
-static struct il_lib_ops il4965_lib = {
-       .set_hw_params = il4965_hw_set_hw_params,
+const struct il_ops il4965_ops = {
        .txq_update_byte_cnt_tbl = il4965_txq_update_byte_cnt_tbl,
        .txq_attach_buf_to_tfd = il4965_hw_txq_attach_buf_to_tfd,
        .txq_free_tfd = il4965_hw_txq_free_tfd,
        .txq_init = il4965_hw_tx_queue_init,
-       .handler_setup = il4965_handler_setup,
        .is_valid_rtc_data_addr = il4965_hw_valid_rtc_data_addr,
        .init_alive_start = il4965_init_alive_start,
        .load_ucode = il4965_load_bsm,
        .dump_nic_error_log = il4965_dump_nic_error_log,
        .dump_fh = il4965_dump_fh,
        .set_channel_switch = il4965_hw_channel_switch,
-       .apm_ops = {
-                   .init = il_apm_init,
-                   .config = il4965_nic_config,
-                   },
-       .eeprom_ops = {
-                      .regulatory_bands = {
-                                           EEPROM_REGULATORY_BAND_1_CHANNELS,
-                                           EEPROM_REGULATORY_BAND_2_CHANNELS,
-                                           EEPROM_REGULATORY_BAND_3_CHANNELS,
-                                           EEPROM_REGULATORY_BAND_4_CHANNELS,
-                                           EEPROM_REGULATORY_BAND_5_CHANNELS,
-                                           EEPROM_4965_REGULATORY_BAND_24_HT40_CHANNELS,
-                                           EEPROM_4965_REGULATORY_BAND_52_HT40_CHANNELS},
-                      .acquire_semaphore = il4965_eeprom_acquire_semaphore,
-                      .release_semaphore = il4965_eeprom_release_semaphore,
-                      },
+       .apm_init = il_apm_init,
        .send_tx_power = il4965_send_tx_power,
        .update_chain_flags = il4965_update_chain_flags,
-       .temp_ops = {
-                    .temperature = il4965_temperature_calib,
-                    },
-#ifdef CONFIG_IWLEGACY_DEBUGFS
-       .debugfs_ops = {
-                       .rx_stats_read = il4965_ucode_rx_stats_read,
-                       .tx_stats_read = il4965_ucode_tx_stats_read,
-                       .general_stats_read = il4965_ucode_general_stats_read,
-                       },
-#endif
-};
+       .eeprom_acquire_semaphore = il4965_eeprom_acquire_semaphore,
+       .eeprom_release_semaphore = il4965_eeprom_release_semaphore,
+
+       .rxon_assoc = il4965_send_rxon_assoc,
+       .commit_rxon = il4965_commit_rxon,
+       .set_rxon_chain = il4965_set_rxon_chain,
+
+       .get_hcmd_size = il4965_get_hcmd_size,
+       .build_addsta_hcmd = il4965_build_addsta_hcmd,
+       .request_scan = il4965_request_scan,
+       .post_scan = il4965_post_scan,
 
-static const struct il_legacy_ops il4965_legacy_ops = {
        .post_associate = il4965_post_associate,
        .config_ap = il4965_config_ap,
        .manage_ibss_station = il4965_manage_ibss_station,
        .update_bcast_stations = il4965_update_bcast_stations,
-};
 
-struct ieee80211_ops il4965_hw_ops = {
-       .tx = il4965_mac_tx,
-       .start = il4965_mac_start,
-       .stop = il4965_mac_stop,
-       .add_interface = il_mac_add_interface,
-       .remove_interface = il_mac_remove_interface,
-       .change_interface = il_mac_change_interface,
-       .config = il_mac_config,
-       .configure_filter = il4965_configure_filter,
-       .set_key = il4965_mac_set_key,
-       .update_tkip_key = il4965_mac_update_tkip_key,
-       .conf_tx = il_mac_conf_tx,
-       .reset_tsf = il_mac_reset_tsf,
-       .bss_info_changed = il_mac_bss_info_changed,
-       .ampdu_action = il4965_mac_ampdu_action,
-       .hw_scan = il_mac_hw_scan,
-       .sta_add = il4965_mac_sta_add,
-       .sta_remove = il_mac_sta_remove,
-       .channel_switch = il4965_mac_channel_switch,
-       .tx_last_beacon = il_mac_tx_last_beacon,
-};
-
-static const struct il_ops il4965_ops = {
-       .lib = &il4965_lib,
-       .hcmd = &il4965_hcmd,
-       .utils = &il4965_hcmd_utils,
-       .led = &il4965_led_ops,
-       .legacy = &il4965_legacy_ops,
-       .ieee80211_ops = &il4965_hw_ops,
-};
-
-static struct il_base_params il4965_base_params = {
-       .eeprom_size = IL4965_EEPROM_IMG_SIZE,
-       .num_of_queues = IL49_NUM_QUEUES,
-       .num_of_ampdu_queues = IL49_NUM_AMPDU_QUEUES,
-       .pll_cfg_val = 0,
-       .set_l0s = true,
-       .use_bsm = true,
-       .led_compensation = 61,
-       .chain_noise_num_beacons = IL4965_CAL_NUM_BEACONS,
-       .wd_timeout = IL_DEF_WD_TIMEOUT,
-       .temperature_kelvin = true,
-       .ucode_tracing = true,
-       .sensitivity_calib_by_driver = true,
-       .chain_noise_calib_by_driver = true,
+       .send_led_cmd = il4965_send_led_cmd,
 };
 
 struct il_cfg il4965_cfg = {
@@ -2387,15 +1916,38 @@ struct il_cfg il4965_cfg = {
        .valid_rx_ant = ANT_ABC,
        .eeprom_ver = EEPROM_4965_EEPROM_VERSION,
        .eeprom_calib_ver = EEPROM_4965_TX_POWER_VERSION,
-       .ops = &il4965_ops,
        .mod_params = &il4965_mod_params,
-       .base_params = &il4965_base_params,
        .led_mode = IL_LED_BLINK,
        /*
         * Force use of chains B and C for scan RX on 5 GHz band
         * because the device has off-channel reception on chain A.
         */
        .scan_rx_antennas[IEEE80211_BAND_5GHZ] = ANT_BC,
+
+       .eeprom_size = IL4965_EEPROM_IMG_SIZE,
+       .num_of_queues = IL49_NUM_QUEUES,
+       .num_of_ampdu_queues = IL49_NUM_AMPDU_QUEUES,
+       .pll_cfg_val = 0,
+       .set_l0s = true,
+       .use_bsm = true,
+       .led_compensation = 61,
+       .chain_noise_num_beacons = IL4965_CAL_NUM_BEACONS,
+       .wd_timeout = IL_DEF_WD_TIMEOUT,
+       .temperature_kelvin = true,
+       .ucode_tracing = true,
+       .sensitivity_calib_by_driver = true,
+       .chain_noise_calib_by_driver = true,
+
+       .regulatory_bands = {
+               EEPROM_REGULATORY_BAND_1_CHANNELS,
+               EEPROM_REGULATORY_BAND_2_CHANNELS,
+               EEPROM_REGULATORY_BAND_3_CHANNELS,
+               EEPROM_REGULATORY_BAND_4_CHANNELS,
+               EEPROM_REGULATORY_BAND_5_CHANNELS,
+               EEPROM_4965_REGULATORY_BAND_24_HT40_CHANNELS,
+               EEPROM_4965_REGULATORY_BAND_52_HT40_CHANNELS
+       },
+
 };
 
 /* Module firmware */
index f280e01..1db6776 100644 (file)
@@ -38,17 +38,16 @@ struct il_rxon_context;
 
 /* configuration for the _4965 devices */
 extern struct il_cfg il4965_cfg;
+extern const struct il_ops il4965_ops;
 
 extern struct il_mod_params il4965_mod_params;
 
-extern struct ieee80211_ops il4965_hw_ops;
-
 /* tx queue */
 void il4965_free_tfds_in_queue(struct il_priv *il, int sta_id, int tid,
                               int freed);
 
 /* RXON */
-void il4965_set_rxon_chain(struct il_priv *il, struct il_rxon_context *ctx);
+void il4965_set_rxon_chain(struct il_priv *il);
 
 /* uCode */
 int il4965_verify_ucode(struct il_priv *il);
@@ -61,6 +60,8 @@ int il4965_rx_init(struct il_priv *il, struct il_rx_queue *rxq);
 int il4965_hw_nic_init(struct il_priv *il);
 int il4965_dump_fh(struct il_priv *il, char **buf, bool display);
 
+void il4965_nic_config(struct il_priv *il);
+
 /* rx */
 void il4965_rx_queue_restock(struct il_priv *il);
 void il4965_rx_replenish(struct il_priv *il);
@@ -68,8 +69,6 @@ void il4965_rx_replenish_now(struct il_priv *il);
 void il4965_rx_queue_free(struct il_priv *il, struct il_rx_queue *rxq);
 int il4965_rxq_stop(struct il_priv *il);
 int il4965_hwrate_to_mac80211_idx(u32 rate_n_flags, enum ieee80211_band band);
-void il4965_hdl_rx(struct il_priv *il, struct il_rx_buf *rxb);
-void il4965_hdl_rx_phy(struct il_priv *il, struct il_rx_buf *rxb);
 void il4965_rx_handle(struct il_priv *il);
 
 /* tx */
@@ -85,7 +84,6 @@ int il4965_tx_agg_start(struct il_priv *il, struct ieee80211_vif *vif,
 int il4965_tx_agg_stop(struct il_priv *il, struct ieee80211_vif *vif,
                       struct ieee80211_sta *sta, u16 tid);
 int il4965_txq_check_empty(struct il_priv *il, int sta_id, u8 tid, int txq_id);
-void il4965_hdl_compressed_ba(struct il_priv *il, struct il_rx_buf *rxb);
 int il4965_tx_queue_reclaim(struct il_priv *il, int txq_id, int idx);
 void il4965_hw_txq_ctx_free(struct il_priv *il);
 int il4965_txq_ctx_alloc(struct il_priv *il);
@@ -107,12 +105,6 @@ void il4965_set_wr_ptrs(struct il_priv *il, int txq_id, u32 idx);
 void il4965_tx_queue_set_status(struct il_priv *il, struct il_tx_queue *txq,
                                int tx_fifo_id, int scd_retry);
 
-/* rx */
-void il4965_hdl_missed_beacon(struct il_priv *il, struct il_rx_buf *rxb);
-bool il4965_good_plcp_health(struct il_priv *il, struct il_rx_pkt *pkt);
-void il4965_hdl_stats(struct il_priv *il, struct il_rx_buf *rxb);
-void il4965_hdl_c_stats(struct il_priv *il, struct il_rx_buf *rxb);
-
 /* scan */
 int il4965_request_scan(struct il_priv *il, struct ieee80211_vif *vif);
 
@@ -134,21 +126,18 @@ il4965_get_tx_fail_reason(u32 status)
 #endif
 
 /* station management */
-int il4965_alloc_bcast_station(struct il_priv *il, struct il_rxon_context *ctx);
-int il4965_add_bssid_station(struct il_priv *il, struct il_rxon_context *ctx,
-                            const u8 *addr, u8 *sta_id_r);
+int il4965_alloc_bcast_station(struct il_priv *il);
+int il4965_add_bssid_station(struct il_priv *il, const u8 *addr, u8 *sta_id_r);
 int il4965_remove_default_wep_key(struct il_priv *il,
-                                 struct il_rxon_context *ctx,
                                  struct ieee80211_key_conf *key);
-int il4965_set_default_wep_key(struct il_priv *il, struct il_rxon_context *ctx,
+int il4965_set_default_wep_key(struct il_priv *il,
                               struct ieee80211_key_conf *key);
-int il4965_restore_default_wep_keys(struct il_priv *il,
-                                   struct il_rxon_context *ctx);
-int il4965_set_dynamic_key(struct il_priv *il, struct il_rxon_context *ctx,
+int il4965_restore_default_wep_keys(struct il_priv *il);
+int il4965_set_dynamic_key(struct il_priv *il,
                           struct ieee80211_key_conf *key, u8 sta_id);
-int il4965_remove_dynamic_key(struct il_priv *il, struct il_rxon_context *ctx,
+int il4965_remove_dynamic_key(struct il_priv *il,
                              struct ieee80211_key_conf *key, u8 sta_id);
-void il4965_update_tkip_key(struct il_priv *il, struct il_rxon_context *ctx,
+void il4965_update_tkip_key(struct il_priv *il,
                            struct ieee80211_key_conf *keyconf,
                            struct ieee80211_sta *sta, u32 iv32,
                            u16 *phase1key);
@@ -279,6 +268,7 @@ il4965_hw_valid_rtc_data_addr(u32 addr)
        ((t) < IL_TX_POWER_TEMPERATURE_MIN || \
         (t) > IL_TX_POWER_TEMPERATURE_MAX)
 
+extern void il4965_temperature_calib(struct il_priv *il);
 /********************* END TEMPERATURE ***************************************/
 
 /********************* START TXPOWER *****************************************/
@@ -937,17 +927,10 @@ void il4965_chain_noise_calibration(struct il_priv *il, void *stat_resp);
 void il4965_sensitivity_calibration(struct il_priv *il, void *resp);
 void il4965_init_sensitivity(struct il_priv *il);
 void il4965_reset_run_time_calib(struct il_priv *il);
-void il4965_calib_free_results(struct il_priv *il);
 
 /* Debug */
 #ifdef CONFIG_IWLEGACY_DEBUGFS
-ssize_t il4965_ucode_rx_stats_read(struct file *file, char __user *user_buf,
-                                  size_t count, loff_t *ppos);
-ssize_t il4965_ucode_tx_stats_read(struct file *file, char __user *user_buf,
-                                  size_t count, loff_t *ppos);
-ssize_t il4965_ucode_general_stats_read(struct file *file,
-                                       char __user *user_buf, size_t count,
-                                       loff_t *ppos);
+extern const struct il_debugfs_ops il4965_debugfs_ops;
 #endif
 
 /****************************/
index 05bd375..fb91972 100644 (file)
@@ -6,45 +6,6 @@ config IWLEGACY
        select LEDS_TRIGGERS
        select MAC80211_LEDS
 
-menu "Debugging Options"
-       depends on IWLEGACY
-
-config IWLEGACY_DEBUG
-       bool "Enable full debugging output in iwlegacy (iwl 3945/4965) drivers"
-       depends on IWLEGACY
-       ---help---
-         This option will enable debug tracing output for the iwlegacy
-         drivers.
-
-         This will result in the kernel module being ~100k larger.  You can
-         control which debug output is sent to the kernel log by setting the
-         value in
-
-               /sys/class/net/wlan0/device/debug_level
-
-         This entry will only exist if this option is enabled.
-
-         To set a value, simply echo an 8-byte hex value to the same file:
-
-                 % echo 0x43fff > /sys/class/net/wlan0/device/debug_level
-
-         You can find the list of debug mask values in:
-                 drivers/net/wireless/iwlegacy/common.h
-
-         If this is your first time using this driver, you should say Y here
-         as the debug information can assist others in helping you resolve
-         any problems you may encounter.
-
-config IWLEGACY_DEBUGFS
-        bool "iwlegacy (iwl 3945/4965) debugfs support"
-        depends on IWLEGACY && MAC80211_DEBUGFS
-        ---help---
-         Enable creation of debugfs files for the iwlegacy drivers. This
-         is a low-impact option that allows getting insight into the
-         driver's state at runtime.
-
-endmenu
-
 config IWL4965
        tristate "Intel Wireless WiFi 4965AGN (iwl4965)"
        depends on PCI && MAC80211
@@ -98,3 +59,42 @@ config IWL3945
          inserted in and removed from the running kernel whenever you want),
          say M here and read <file:Documentation/kbuild/modules.txt>.  The
          module will be called iwl3945.
+
+menu "iwl3945 / iwl4965 Debugging Options"
+       depends on IWLEGACY
+
+config IWLEGACY_DEBUG
+       bool "Enable full debugging output in iwlegacy (iwl 3945/4965) drivers"
+       depends on IWLEGACY
+       ---help---
+         This option will enable debug tracing output for the iwlegacy
+         drivers.
+
+         This will result in the kernel module being ~100k larger.  You can
+         control which debug output is sent to the kernel log by setting the
+         value in
+
+               /sys/class/net/wlan0/device/debug_level
+
+         This entry will only exist if this option is enabled.
+
+         To set a value, simply echo an 8-byte hex value to the same file:
+
+                 % echo 0x43fff > /sys/class/net/wlan0/device/debug_level
+
+         You can find the list of debug mask values in:
+                 drivers/net/wireless/iwlegacy/common.h
+
+         If this is your first time using this driver, you should say Y here
+         as the debug information can assist others in helping you resolve
+         any problems you may encounter.
+
+config IWLEGACY_DEBUGFS
+        bool "iwlegacy (iwl 3945/4965) debugfs support"
+        depends on IWLEGACY && MAC80211_DEBUGFS
+        ---help---
+         Enable creation of debugfs files for the iwlegacy drivers. This
+         is a low-impact option that allows getting insight into the
+         driver's state at runtime.
+
+endmenu
index 36454d0..b42052b 100644 (file)
@@ -81,7 +81,7 @@ il_clear_bit(struct il_priv *p, u32 r, u32 m)
 }
 EXPORT_SYMBOL(il_clear_bit);
 
-int
+bool
 _il_grab_nic_access(struct il_priv *il)
 {
        int ret;
@@ -111,14 +111,15 @@ _il_grab_nic_access(struct il_priv *il)
            _il_poll_bit(il, CSR_GP_CNTRL, CSR_GP_CNTRL_REG_VAL_MAC_ACCESS_EN,
                         (CSR_GP_CNTRL_REG_FLAG_MAC_CLOCK_READY |
                          CSR_GP_CNTRL_REG_FLAG_GOING_TO_SLEEP), 15000);
-       if (ret < 0) {
+       if (unlikely(ret < 0)) {
                val = _il_rd(il, CSR_GP_CNTRL);
-               IL_ERR("MAC is in deep sleep!.  CSR_GP_CNTRL = 0x%08X\n", val);
+               WARN_ONCE(1, "Timeout waiting for ucode processor access "
+                            "(CSR_GP_CNTRL 0x%08x)\n", val);
                _il_wr(il, CSR_RESET, CSR_RESET_REG_FLAG_FORCE_NMI);
-               return -EIO;
+               return false;
        }
 
-       return 0;
+       return true;
 }
 EXPORT_SYMBOL_GPL(_il_grab_nic_access);
 
@@ -160,7 +161,7 @@ il_wr_prph(struct il_priv *il, u32 addr, u32 val)
        unsigned long reg_flags;
 
        spin_lock_irqsave(&il->reg_lock, reg_flags);
-       if (!_il_grab_nic_access(il)) {
+       if (likely(_il_grab_nic_access(il))) {
                _il_wr_prph(il, addr, val);
                _il_release_nic_access(il);
        }
@@ -178,7 +179,6 @@ il_read_targ_mem(struct il_priv *il, u32 addr)
        _il_grab_nic_access(il);
 
        _il_wr(il, HBUS_TARG_MEM_RADDR, addr);
-       rmb();
        value = _il_rd(il, HBUS_TARG_MEM_RDAT);
 
        _il_release_nic_access(il);
@@ -193,9 +193,8 @@ il_write_targ_mem(struct il_priv *il, u32 addr, u32 val)
        unsigned long reg_flags;
 
        spin_lock_irqsave(&il->reg_lock, reg_flags);
-       if (!_il_grab_nic_access(il)) {
+       if (likely(_il_grab_nic_access(il))) {
                _il_wr(il, HBUS_TARG_MEM_WADDR, addr);
-               wmb();
                _il_wr(il, HBUS_TARG_MEM_WDAT, val);
                _il_release_nic_access(il);
        }
@@ -351,7 +350,7 @@ il_send_cmd_sync(struct il_priv *il, struct il_host_cmd *cmd)
                }
        }
 
-       if (test_bit(S_RF_KILL_HW, &il->status)) {
+       if (test_bit(S_RFKILL, &il->status)) {
                IL_ERR("Command %s aborted: RF KILL Switch\n",
                       il_get_cmd_string(cmd->id));
                ret = -ECANCELED;
@@ -512,15 +511,15 @@ il_led_cmd(struct il_priv *il, unsigned long on, unsigned long off)
        }
 
        D_LED("Led blink time compensation=%u\n",
-             il->cfg->base_params->led_compensation);
+             il->cfg->led_compensation);
        led_cmd.on =
            il_blink_compensation(il, on,
-                                 il->cfg->base_params->led_compensation);
+                                 il->cfg->led_compensation);
        led_cmd.off =
            il_blink_compensation(il, off,
-                                 il->cfg->base_params->led_compensation);
+                                 il->cfg->led_compensation);
 
-       ret = il->cfg->ops->led->cmd(il, &led_cmd);
+       ret = il->ops->send_led_cmd(il, &led_cmd);
        if (!ret) {
                il->blink_on = on;
                il->blink_off = off;
@@ -691,7 +690,7 @@ il_eeprom_verify_signature(struct il_priv *il)
 const u8 *
 il_eeprom_query_addr(const struct il_priv *il, size_t offset)
 {
-       BUG_ON(offset >= il->cfg->base_params->eeprom_size);
+       BUG_ON(offset >= il->cfg->eeprom_size);
        return &il->eeprom[offset];
 }
 EXPORT_SYMBOL(il_eeprom_query_addr);
@@ -722,7 +721,7 @@ il_eeprom_init(struct il_priv *il)
        u16 addr;
 
        /* allocate eeprom */
-       sz = il->cfg->base_params->eeprom_size;
+       sz = il->cfg->eeprom_size;
        D_EEPROM("NVM size = %d\n", sz);
        il->eeprom = kzalloc(sz, GFP_KERNEL);
        if (!il->eeprom) {
@@ -731,7 +730,7 @@ il_eeprom_init(struct il_priv *il)
        }
        e = (__le16 *) il->eeprom;
 
-       il->cfg->ops->lib->apm_ops.init(il);
+       il->ops->apm_init(il);
 
        ret = il_eeprom_verify_signature(il);
        if (ret < 0) {
@@ -741,7 +740,7 @@ il_eeprom_init(struct il_priv *il)
        }
 
        /* Make sure driver (instead of uCode) is allowed to read EEPROM */
-       ret = il->cfg->ops->lib->eeprom_ops.acquire_semaphore(il);
+       ret = il->ops->eeprom_acquire_semaphore(il);
        if (ret < 0) {
                IL_ERR("Failed to acquire EEPROM semaphore.\n");
                ret = -ENOENT;
@@ -773,7 +772,7 @@ il_eeprom_init(struct il_priv *il)
 
        ret = 0;
 done:
-       il->cfg->ops->lib->eeprom_ops.release_semaphore(il);
+       il->ops->eeprom_release_semaphore(il);
 
 err:
        if (ret)
@@ -799,8 +798,8 @@ il_init_band_reference(const struct il_priv *il, int eep_band,
                       const struct il_eeprom_channel **eeprom_ch_info,
                       const u8 **eeprom_ch_idx)
 {
-       u32 offset =
-           il->cfg->ops->lib->eeprom_ops.regulatory_bands[eep_band - 1];
+       u32 offset = il->cfg->regulatory_bands[eep_band - 1];
+
        switch (eep_band) {
        case 1:         /* 2.4GHz band */
                *eeprom_ch_count = ARRAY_SIZE(il_eeprom_band_1);
@@ -1001,10 +1000,8 @@ il_init_channel_map(struct il_priv *il)
        }
 
        /* Check if we do have HT40 channels */
-       if (il->cfg->ops->lib->eeprom_ops.regulatory_bands[5] ==
-           EEPROM_REGULATORY_BAND_NO_HT40 &&
-           il->cfg->ops->lib->eeprom_ops.regulatory_bands[6] ==
-           EEPROM_REGULATORY_BAND_NO_HT40)
+       if (il->cfg->regulatory_bands[5] == EEPROM_REGULATORY_BAND_NO_HT40 &&
+           il->cfg->regulatory_bands[6] == EEPROM_REGULATORY_BAND_NO_HT40)
                return 0;
 
        /* Two additional EEPROM bands for 2.4 and 5 GHz HT40 channels */
@@ -1158,9 +1155,9 @@ il_power_set_mode(struct il_priv *il, struct il_powertable_cmd *cmd, bool force)
                if (!(cmd->flags & IL_POWER_DRIVER_ALLOW_SLEEP_MSK))
                        clear_bit(S_POWER_PMI, &il->status);
 
-               if (il->cfg->ops->lib->update_chain_flags && update_chains)
-                       il->cfg->ops->lib->update_chain_flags(il);
-               else if (il->cfg->ops->lib->update_chain_flags)
+               if (il->ops->update_chain_flags && update_chains)
+                       il->ops->update_chain_flags(il);
+               else if (il->ops->update_chain_flags)
                        D_POWER("Cannot update the power, chain noise "
                                "calibration running: %d\n",
                                il->chain_noise_data.state);
@@ -1442,7 +1439,6 @@ u16
 il_get_passive_dwell_time(struct il_priv *il, enum ieee80211_band band,
                          struct ieee80211_vif *vif)
 {
-       struct il_rxon_context *ctx = &il->ctx;
        u16 value;
 
        u16 passive =
@@ -1457,7 +1453,7 @@ il_get_passive_dwell_time(struct il_priv *il, enum ieee80211_band band,
                 * dwell time to be 98% of the smallest beacon interval
                 * (minus 2 * channel tune time)
                 */
-               value = ctx->vif ? ctx->vif->bss_conf.beacon_int : 0;
+               value = il->vif ? il->vif->bss_conf.beacon_int : 0;
                if (value > IL_PASSIVE_DWELL_BASE || !value)
                        value = IL_PASSIVE_DWELL_BASE;
                value = (value * 98) / 100 - IL_CHANNEL_TUNE_TIME * 2;
@@ -1486,9 +1482,6 @@ il_scan_initiate(struct il_priv *il, struct ieee80211_vif *vif)
 
        lockdep_assert_held(&il->mutex);
 
-       if (WARN_ON(!il->cfg->ops->utils->request_scan))
-               return -EOPNOTSUPP;
-
        cancel_delayed_work(&il->scan_check);
 
        if (!il_is_ready_rf(il)) {
@@ -1511,7 +1504,7 @@ il_scan_initiate(struct il_priv *il, struct ieee80211_vif *vif)
        set_bit(S_SCANNING, &il->status);
        il->scan_start = jiffies;
 
-       ret = il->cfg->ops->utils->request_scan(il, vif);
+       ret = il->ops->request_scan(il, vif);
        if (ret) {
                clear_bit(S_SCANNING, &il->status);
                return ret;
@@ -1530,12 +1523,13 @@ il_mac_hw_scan(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
        struct il_priv *il = hw->priv;
        int ret;
 
-       D_MAC80211("enter\n");
-
-       if (req->n_channels == 0)
+       if (req->n_channels == 0) {
+               IL_ERR("Can not scan on no channels.\n");
                return -EINVAL;
+       }
 
        mutex_lock(&il->mutex);
+       D_MAC80211("enter\n");
 
        if (test_bit(S_SCANNING, &il->status)) {
                D_SCAN("Scan already in progress.\n");
@@ -1550,9 +1544,8 @@ il_mac_hw_scan(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
 
        ret = il_scan_initiate(il, vif);
 
-       D_MAC80211("leave\n");
-
 out_unlock:
+       D_MAC80211("leave ret %d\n", ret);
        mutex_unlock(&il->mutex);
 
        return ret;
@@ -1673,7 +1666,7 @@ out_settings:
        il_power_set_mode(il, &il->power_data.sleep_cmd_next, false);
        il_set_tx_power(il, il->tx_power_next, false);
 
-       il->cfg->ops->utils->post_scan(il);
+       il->ops->post_scan(il);
 
 out:
        mutex_unlock(&il->mutex);
@@ -1815,7 +1808,7 @@ il_send_add_sta(struct il_priv *il, struct il_addsta_cmd *sta, u8 flags)
                might_sleep();
        }
 
-       cmd.len = il->cfg->ops->utils->build_addsta_hcmd(sta, data);
+       cmd.len = il->ops->build_addsta_hcmd(sta, data);
        ret = il_send_cmd(il, &cmd);
 
        if (ret || (flags & CMD_ASYNC))
@@ -1832,8 +1825,7 @@ il_send_add_sta(struct il_priv *il, struct il_addsta_cmd *sta, u8 flags)
 EXPORT_SYMBOL(il_send_add_sta);
 
 static void
-il_set_ht_add_station(struct il_priv *il, u8 idx, struct ieee80211_sta *sta,
-                     struct il_rxon_context *ctx)
+il_set_ht_add_station(struct il_priv *il, u8 idx, struct ieee80211_sta *sta)
 {
        struct ieee80211_sta_ht_cap *sta_ht_inf = &sta->ht_cap;
        __le32 sta_flags;
@@ -1874,7 +1866,7 @@ il_set_ht_add_station(struct il_priv *il, u8 idx, struct ieee80211_sta *sta,
            cpu_to_le32((u32) sta_ht_inf->
                        ampdu_density << STA_FLG_AGG_MPDU_DENSITY_POS);
 
-       if (il_is_ht40_tx_allowed(il, ctx, &sta->ht_cap))
+       if (il_is_ht40_tx_allowed(il, &sta->ht_cap))
                sta_flags |= STA_FLG_HT40_EN_MSK;
        else
                sta_flags &= ~STA_FLG_HT40_EN_MSK;
@@ -1890,8 +1882,8 @@ done:
  * should be called with sta_lock held
  */
 u8
-il_prep_station(struct il_priv *il, struct il_rxon_context *ctx,
-               const u8 *addr, bool is_ap, struct ieee80211_sta *sta)
+il_prep_station(struct il_priv *il, const u8 *addr, bool is_ap,
+               struct ieee80211_sta *sta)
 {
        struct il_station_entry *station;
        int i;
@@ -1899,9 +1891,9 @@ il_prep_station(struct il_priv *il, struct il_rxon_context *ctx,
        u16 rate;
 
        if (is_ap)
-               sta_id = ctx->ap_sta_id;
+               sta_id = IL_AP_ID;
        else if (is_broadcast_ether_addr(addr))
-               sta_id = ctx->bcast_sta_id;
+               sta_id = il->hw_params.bcast_id;
        else
                for (i = IL_STA_ID; i < il->hw_params.max_stations; i++) {
                        if (!compare_ether_addr
@@ -1950,22 +1942,14 @@ il_prep_station(struct il_priv *il, struct il_rxon_context *ctx,
        memcpy(station->sta.sta.addr, addr, ETH_ALEN);
        station->sta.mode = 0;
        station->sta.sta.sta_id = sta_id;
-       station->sta.station_flags = ctx->station_flags;
-       station->ctxid = ctx->ctxid;
-
-       if (sta) {
-               struct il_station_priv_common *sta_priv;
-
-               sta_priv = (void *)sta->drv_priv;
-               sta_priv->ctx = ctx;
-       }
+       station->sta.station_flags = 0;
 
        /*
         * OK to call unconditionally, since local stations (IBSS BSSID
         * STA and broadcast STA) pass in a NULL sta, and mac80211
         * doesn't allow HT IBSS.
         */
-       il_set_ht_add_station(il, sta_id, sta, ctx);
+       il_set_ht_add_station(il, sta_id, sta);
 
        /* 3945 only */
        rate = (il->band == IEEE80211_BAND_5GHZ) ? RATE_6M_PLCP : RATE_1M_PLCP;
@@ -1983,9 +1967,8 @@ EXPORT_SYMBOL_GPL(il_prep_station);
  * il_add_station_common -
  */
 int
-il_add_station_common(struct il_priv *il, struct il_rxon_context *ctx,
-                     const u8 *addr, bool is_ap, struct ieee80211_sta *sta,
-                     u8 *sta_id_r)
+il_add_station_common(struct il_priv *il, const u8 *addr, bool is_ap,
+                     struct ieee80211_sta *sta, u8 *sta_id_r)
 {
        unsigned long flags_spin;
        int ret = 0;
@@ -1994,7 +1977,7 @@ il_add_station_common(struct il_priv *il, struct il_rxon_context *ctx,
 
        *sta_id_r = 0;
        spin_lock_irqsave(&il->sta_lock, flags_spin);
-       sta_id = il_prep_station(il, ctx, addr, is_ap, sta);
+       sta_id = il_prep_station(il, addr, is_ap, sta);
        if (sta_id == IL_INVALID_STATION) {
                IL_ERR("Unable to prepare station %pM for addition\n", addr);
                spin_unlock_irqrestore(&il->sta_lock, flags_spin);
@@ -2181,7 +2164,7 @@ EXPORT_SYMBOL_GPL(il_remove_station);
  * the ucode, e.g. unassociated RXON.
  */
 void
-il_clear_ucode_stations(struct il_priv *il, struct il_rxon_context *ctx)
+il_clear_ucode_stations(struct il_priv *il)
 {
        int i;
        unsigned long flags_spin;
@@ -2191,9 +2174,6 @@ il_clear_ucode_stations(struct il_priv *il, struct il_rxon_context *ctx)
 
        spin_lock_irqsave(&il->sta_lock, flags_spin);
        for (i = 0; i < il->hw_params.max_stations; i++) {
-               if (ctx && ctx->ctxid != il->stations[i].ctxid)
-                       continue;
-
                if (il->stations[i].used & IL_STA_UCODE_ACTIVE) {
                        D_INFO("Clearing ucode active for station %d\n", i);
                        il->stations[i].used &= ~IL_STA_UCODE_ACTIVE;
@@ -2216,7 +2196,7 @@ EXPORT_SYMBOL(il_clear_ucode_stations);
  * Function sleeps.
  */
 void
-il_restore_stations(struct il_priv *il, struct il_rxon_context *ctx)
+il_restore_stations(struct il_priv *il)
 {
        struct il_addsta_cmd sta_cmd;
        struct il_link_quality_cmd lq;
@@ -2234,8 +2214,6 @@ il_restore_stations(struct il_priv *il, struct il_rxon_context *ctx)
        D_ASSOC("Restoring all known stations ... start.\n");
        spin_lock_irqsave(&il->sta_lock, flags_spin);
        for (i = 0; i < il->hw_params.max_stations; i++) {
-               if (ctx->ctxid != il->stations[i].ctxid)
-                       continue;
                if ((il->stations[i].used & IL_STA_DRIVER_ACTIVE) &&
                    !(il->stations[i].used & IL_STA_UCODE_ACTIVE)) {
                        D_ASSOC("Restoring sta %pM\n",
@@ -2273,7 +2251,7 @@ il_restore_stations(struct il_priv *il, struct il_rxon_context *ctx)
                         * current LQ command
                         */
                        if (send_lq)
-                               il_send_lq_cmd(il, ctx, &lq, CMD_SYNC, true);
+                               il_send_lq_cmd(il, &lq, CMD_SYNC, true);
                        spin_lock_irqsave(&il->sta_lock, flags_spin);
                        il->stations[i].used &= ~IL_STA_UCODE_INPROGRESS;
                }
@@ -2353,15 +2331,14 @@ il_dump_lq_cmd(struct il_priv *il, struct il_link_quality_cmd *lq)
  * RXON flags are updated and when LQ command is updated.
  */
 static bool
-il_is_lq_table_valid(struct il_priv *il, struct il_rxon_context *ctx,
-                    struct il_link_quality_cmd *lq)
+il_is_lq_table_valid(struct il_priv *il, struct il_link_quality_cmd *lq)
 {
        int i;
 
-       if (ctx->ht.enabled)
+       if (il->ht.enabled)
                return true;
 
-       D_INFO("Channel %u is not an HT channel\n", ctx->active.channel);
+       D_INFO("Channel %u is not an HT channel\n", il->active.channel);
        for (i = 0; i < LINK_QUAL_MAX_RETRY_NUM; i++) {
                if (le32_to_cpu(lq->rs_table[i].rate_n_flags) & RATE_MCS_HT_MSK) {
                        D_INFO("idx %d of LQ expects HT channel\n", i);
@@ -2382,8 +2359,8 @@ il_is_lq_table_valid(struct il_priv *il, struct il_rxon_context *ctx,
  * progress.
  */
 int
-il_send_lq_cmd(struct il_priv *il, struct il_rxon_context *ctx,
-              struct il_link_quality_cmd *lq, u8 flags, bool init)
+il_send_lq_cmd(struct il_priv *il, struct il_link_quality_cmd *lq,
+              u8 flags, bool init)
 {
        int ret = 0;
        unsigned long flags_spin;
@@ -2408,7 +2385,7 @@ il_send_lq_cmd(struct il_priv *il, struct il_rxon_context *ctx,
        il_dump_lq_cmd(il, lq);
        BUG_ON(init && (cmd.flags & CMD_ASYNC));
 
-       if (il_is_lq_table_valid(il, ctx, lq))
+       if (il_is_lq_table_valid(il, lq))
                ret = il_send_cmd(il, &cmd);
        else
                ret = -EINVAL;
@@ -2436,13 +2413,16 @@ il_mac_sta_remove(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
        struct il_station_priv_common *sta_common = (void *)sta->drv_priv;
        int ret;
 
-       D_INFO("received request to remove station %pM\n", sta->addr);
        mutex_lock(&il->mutex);
-       D_INFO("proceeding to remove station %pM\n", sta->addr);
+       D_MAC80211("enter station %pM\n", sta->addr);
+
        ret = il_remove_station(il, sta_common->sta_id, sta->addr);
        if (ret)
                IL_ERR("Error removing station %pM\n", sta->addr);
+
+       D_MAC80211("leave ret %d\n", ret);
        mutex_unlock(&il->mutex);
+
        return ret;
 }
 EXPORT_SYMBOL(il_mac_sta_remove);
@@ -2648,7 +2628,7 @@ il_set_decrypted_flag(struct il_priv *il, struct ieee80211_hdr *hdr,
         * All contexts have the same setting here due to it being
         * a module parameter, so OK to check any context.
         */
-       if (il->ctx.active.filter_flags & RXON_FILTER_DIS_DECRYPT_MSK)
+       if (il->active.filter_flags & RXON_FILTER_DIS_DECRYPT_MSK)
                return 0;
 
        if (!(fc & IEEE80211_FCTL_PROTECTED))
@@ -2739,7 +2719,7 @@ il_tx_queue_unmap(struct il_priv *il, int txq_id)
                return;
 
        while (q->write_ptr != q->read_ptr) {
-               il->cfg->ops->lib->txq_free_tfd(il, txq);
+               il->ops->txq_free_tfd(il, txq);
                q->read_ptr = il_queue_inc_wrap(q->read_ptr, q->n_bd);
        }
 }
@@ -2772,8 +2752,8 @@ il_tx_queue_free(struct il_priv *il, int txq_id)
                                  txq->tfds, txq->q.dma_addr);
 
        /* De-alloc array of per-TFD driver data */
-       kfree(txq->txb);
-       txq->txb = NULL;
+       kfree(txq->skbs);
+       txq->skbs = NULL;
 
        /* deallocate arrays */
        kfree(txq->cmd);
@@ -2907,20 +2887,22 @@ EXPORT_SYMBOL(il_queue_space);
  * il_queue_init - Initialize queue's high/low-water and read/write idxes
  */
 static int
-il_queue_init(struct il_priv *il, struct il_queue *q, int count, int slots_num,
-             u32 id)
+il_queue_init(struct il_priv *il, struct il_queue *q, int slots, u32 id)
 {
-       q->n_bd = count;
-       q->n_win = slots_num;
-       q->id = id;
+       /*
+        * TFD_QUEUE_SIZE_MAX must be power-of-two size, otherwise
+        * il_queue_inc_wrap and il_queue_dec_wrap are broken.
+        */
+       BUILD_BUG_ON(TFD_QUEUE_SIZE_MAX & (TFD_QUEUE_SIZE_MAX - 1));
+       /* FIXME: remove q->n_bd */
+       q->n_bd = TFD_QUEUE_SIZE_MAX;
 
-       /* count must be power-of-two size, otherwise il_queue_inc_wrap
-        * and il_queue_dec_wrap are broken. */
-       BUG_ON(!is_power_of_2(count));
+       q->n_win = slots;
+       q->id = id;
 
-       /* slots_num must be power-of-two size, otherwise
+       /* slots_must be power-of-two size, otherwise
         * il_get_cmd_idx is broken. */
-       BUG_ON(!is_power_of_2(slots_num));
+       BUG_ON(!is_power_of_2(slots));
 
        q->low_mark = q->n_win / 4;
        if (q->low_mark < 4)
@@ -2947,23 +2929,21 @@ il_tx_queue_alloc(struct il_priv *il, struct il_tx_queue *txq, u32 id)
        /* Driver ilate data, only for Tx (not command) queues,
         * not shared with device. */
        if (id != il->cmd_queue) {
-               txq->txb = kcalloc(TFD_QUEUE_SIZE_MAX, sizeof(txq->txb[0]),
-                                  GFP_KERNEL);
-               if (!txq->txb) {
-                       IL_ERR("kmalloc for auxiliary BD "
-                              "structures failed\n");
+               txq->skbs = kcalloc(TFD_QUEUE_SIZE_MAX, sizeof(struct skb *),
+                                   GFP_KERNEL);
+               if (!txq->skbs) {
+                       IL_ERR("Fail to alloc skbs\n");
                        goto error;
                }
-       } else {
-               txq->txb = NULL;
-       }
+       } else
+               txq->skbs = NULL;
 
        /* Circular buffer of transmit frame descriptors (TFDs),
         * shared with device */
        txq->tfds =
            dma_alloc_coherent(dev, tfd_sz, &txq->q.dma_addr, GFP_KERNEL);
        if (!txq->tfds) {
-               IL_ERR("pci_alloc_consistent(%zd) failed\n", tfd_sz);
+               IL_ERR("Fail to alloc TFDs\n");
                goto error;
        }
        txq->q.id = id;
@@ -2971,8 +2951,8 @@ il_tx_queue_alloc(struct il_priv *il, struct il_tx_queue *txq, u32 id)
        return 0;
 
 error:
-       kfree(txq->txb);
-       txq->txb = NULL;
+       kfree(txq->skbs);
+       txq->skbs = NULL;
 
        return -ENOMEM;
 }
@@ -2981,12 +2961,11 @@ error:
  * il_tx_queue_init - Allocate and initialize one tx/cmd queue
  */
 int
-il_tx_queue_init(struct il_priv *il, struct il_tx_queue *txq, int slots_num,
-                u32 txq_id)
+il_tx_queue_init(struct il_priv *il, u32 txq_id)
 {
-       int i, len;
-       int ret;
-       int actual_slots = slots_num;
+       int i, len, ret;
+       int slots, actual_slots;
+       struct il_tx_queue *txq = &il->txq[txq_id];
 
        /*
         * Alloc buffer array for commands (Tx or other types of commands).
@@ -2996,8 +2975,13 @@ il_tx_queue_init(struct il_priv *il, struct il_tx_queue *txq, int slots_num,
         * For normal Tx queues (all other queues), no super-size command
         * space is needed.
         */
-       if (txq_id == il->cmd_queue)
-               actual_slots++;
+       if (txq_id == il->cmd_queue) {
+               slots = TFD_CMD_SLOTS;
+               actual_slots = slots + 1;
+       } else {
+               slots = TFD_TX_CMD_SLOTS;
+               actual_slots = slots;
+       }
 
        txq->meta =
            kzalloc(sizeof(struct il_cmd_meta) * actual_slots, GFP_KERNEL);
@@ -3010,7 +2994,7 @@ il_tx_queue_init(struct il_priv *il, struct il_tx_queue *txq, int slots_num,
        len = sizeof(struct il_device_cmd);
        for (i = 0; i < actual_slots; i++) {
                /* only happens for cmd queue */
-               if (i == slots_num)
+               if (i == slots)
                        len = IL_MAX_CMD_SIZE;
 
                txq->cmd[i] = kmalloc(len, GFP_KERNEL);
@@ -3033,15 +3017,11 @@ il_tx_queue_init(struct il_priv *il, struct il_tx_queue *txq, int slots_num,
        if (txq_id < 4)
                il_set_swq_id(txq, txq_id, txq_id);
 
-       /* TFD_QUEUE_SIZE_MAX must be power-of-two size, otherwise
-        * il_queue_inc_wrap and il_queue_dec_wrap are broken. */
-       BUILD_BUG_ON(TFD_QUEUE_SIZE_MAX & (TFD_QUEUE_SIZE_MAX - 1));
-
        /* Initialize queue's high/low-water marks, and head/tail idxes */
-       il_queue_init(il, &txq->q, TFD_QUEUE_SIZE_MAX, slots_num, txq_id);
+       il_queue_init(il, &txq->q, slots, txq_id);
 
        /* Tell device where to find queue */
-       il->cfg->ops->lib->txq_init(il, txq);
+       il->ops->txq_init(il, txq);
 
        return 0;
 err:
@@ -3056,23 +3036,27 @@ out_free_arrays:
 EXPORT_SYMBOL(il_tx_queue_init);
 
 void
-il_tx_queue_reset(struct il_priv *il, struct il_tx_queue *txq, int slots_num,
-                 u32 txq_id)
+il_tx_queue_reset(struct il_priv *il, u32 txq_id)
 {
-       int actual_slots = slots_num;
+       int slots, actual_slots;
+       struct il_tx_queue *txq = &il->txq[txq_id];
 
-       if (txq_id == il->cmd_queue)
-               actual_slots++;
+       if (txq_id == il->cmd_queue) {
+               slots = TFD_CMD_SLOTS;
+               actual_slots = TFD_CMD_SLOTS + 1;
+       } else {
+               slots = TFD_TX_CMD_SLOTS;
+               actual_slots = TFD_TX_CMD_SLOTS;
+       }
 
        memset(txq->meta, 0, sizeof(struct il_cmd_meta) * actual_slots);
-
        txq->need_update = 0;
 
        /* Initialize queue's high/low-water marks, and head/tail idxes */
-       il_queue_init(il, &txq->q, TFD_QUEUE_SIZE_MAX, slots_num, txq_id);
+       il_queue_init(il, &txq->q, slots, txq_id);
 
        /* Tell device where to find queue */
-       il->cfg->ops->lib->txq_init(il, txq);
+       il->ops->txq_init(il, txq);
 }
 EXPORT_SYMBOL(il_tx_queue_reset);
 
@@ -3100,7 +3084,7 @@ il_enqueue_hcmd(struct il_priv *il, struct il_host_cmd *cmd)
        u32 idx;
        u16 fix_size;
 
-       cmd->len = il->cfg->ops->utils->get_hcmd_size(cmd->id, cmd->len);
+       cmd->len = il->ops->get_hcmd_size(cmd->id, cmd->len);
        fix_size = (u16) (cmd->len + sizeof(out_cmd->hdr));
 
        /* If any of the command structures end up being larger than
@@ -3179,9 +3163,9 @@ il_enqueue_hcmd(struct il_priv *il, struct il_host_cmd *cmd)
 #endif
        txq->need_update = 1;
 
-       if (il->cfg->ops->lib->txq_update_byte_cnt_tbl)
+       if (il->ops->txq_update_byte_cnt_tbl)
                /* Set up entry in queue's byte count circular buffer */
-               il->cfg->ops->lib->txq_update_byte_cnt_tbl(il, txq, 0);
+               il->ops->txq_update_byte_cnt_tbl(il, txq, 0);
 
        phys_addr =
            pci_map_single(il->pci_dev, &out_cmd->hdr, fix_size,
@@ -3189,8 +3173,8 @@ il_enqueue_hcmd(struct il_priv *il, struct il_host_cmd *cmd)
        dma_unmap_addr_set(out_meta, mapping, phys_addr);
        dma_unmap_len_set(out_meta, len, fix_size);
 
-       il->cfg->ops->lib->txq_attach_buf_to_tfd(il, txq, phys_addr, fix_size,
-                                                1, U32_PAD(cmd->len));
+       il->ops->txq_attach_buf_to_tfd(il, txq, phys_addr, fix_size, 1,
+                                           U32_PAD(cmd->len));
 
        /* Increment and update queue's write idx */
        q->write_ptr = il_queue_inc_wrap(q->write_ptr, q->n_bd);
@@ -3332,30 +3316,6 @@ EXPORT_SYMBOL(il_debug_level);
 const u8 il_bcast_addr[ETH_ALEN] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
 EXPORT_SYMBOL(il_bcast_addr);
 
-/* This function both allocates and initializes hw and il. */
-struct ieee80211_hw *
-il_alloc_all(struct il_cfg *cfg)
-{
-       struct il_priv *il;
-       /* mac80211 allocates memory for this device instance, including
-        *   space for this driver's ilate structure */
-       struct ieee80211_hw *hw;
-
-       hw = ieee80211_alloc_hw(sizeof(struct il_priv),
-                               cfg->ops->ieee80211_ops);
-       if (hw == NULL) {
-               pr_err("%s: Can not allocate network device\n", cfg->name);
-               goto out;
-       }
-
-       il = hw->priv;
-       il->hw = hw;
-
-out:
-       return hw;
-}
-EXPORT_SYMBOL(il_alloc_all);
-
 #define MAX_BIT_RATE_40_MHZ 150        /* Mbps */
 #define MAX_BIT_RATE_20_MHZ 72 /* Mbps */
 static void
@@ -3562,10 +3522,9 @@ il_is_channel_extension(struct il_priv *il, enum ieee80211_band band,
 }
 
 bool
-il_is_ht40_tx_allowed(struct il_priv *il, struct il_rxon_context *ctx,
-                     struct ieee80211_sta_ht_cap *ht_cap)
+il_is_ht40_tx_allowed(struct il_priv *il, struct ieee80211_sta_ht_cap *ht_cap)
 {
-       if (!ctx->ht.enabled || !ctx->ht.is_40mhz)
+       if (!il->ht.enabled || !il->ht.is_40mhz)
                return false;
 
        /*
@@ -3581,8 +3540,8 @@ il_is_ht40_tx_allowed(struct il_priv *il, struct il_rxon_context *ctx,
 #endif
 
        return il_is_channel_extension(il, il->band,
-                                      le16_to_cpu(ctx->staging.channel),
-                                      ctx->ht.extension_chan_offset);
+                                      le16_to_cpu(il->staging.channel),
+                                      il->ht.extension_chan_offset);
 }
 EXPORT_SYMBOL(il_is_ht40_tx_allowed);
 
@@ -3621,22 +3580,22 @@ il_adjust_beacon_interval(u16 beacon_val, u16 max_beacon_val)
 }
 
 int
-il_send_rxon_timing(struct il_priv *il, struct il_rxon_context *ctx)
+il_send_rxon_timing(struct il_priv *il)
 {
        u64 tsf;
        s32 interval_tm, rem;
        struct ieee80211_conf *conf = NULL;
        u16 beacon_int;
-       struct ieee80211_vif *vif = ctx->vif;
+       struct ieee80211_vif *vif = il->vif;
 
        conf = &il->hw->conf;
 
        lockdep_assert_held(&il->mutex);
 
-       memset(&ctx->timing, 0, sizeof(struct il_rxon_time_cmd));
+       memset(&il->timing, 0, sizeof(struct il_rxon_time_cmd));
 
-       ctx->timing.timestamp = cpu_to_le64(il->timestamp);
-       ctx->timing.listen_interval = cpu_to_le16(conf->listen_interval);
+       il->timing.timestamp = cpu_to_le64(il->timestamp);
+       il->timing.listen_interval = cpu_to_le16(conf->listen_interval);
 
        beacon_int = vif ? vif->bss_conf.beacon_int : 0;
 
@@ -3644,36 +3603,35 @@ il_send_rxon_timing(struct il_priv *il, struct il_rxon_context *ctx)
         * TODO: For IBSS we need to get atim_win from mac80211,
         *       for now just always use 0
         */
-       ctx->timing.atim_win = 0;
+       il->timing.atim_win = 0;
 
        beacon_int =
            il_adjust_beacon_interval(beacon_int,
                                      il->hw_params.max_beacon_itrvl *
                                      TIME_UNIT);
-       ctx->timing.beacon_interval = cpu_to_le16(beacon_int);
+       il->timing.beacon_interval = cpu_to_le16(beacon_int);
 
        tsf = il->timestamp;    /* tsf is modifed by do_div: copy it */
        interval_tm = beacon_int * TIME_UNIT;
        rem = do_div(tsf, interval_tm);
-       ctx->timing.beacon_init_val = cpu_to_le32(interval_tm - rem);
+       il->timing.beacon_init_val = cpu_to_le32(interval_tm - rem);
 
-       ctx->timing.dtim_period = vif ? (vif->bss_conf.dtim_period ? : 1) : 1;
+       il->timing.dtim_period = vif ? (vif->bss_conf.dtim_period ? : 1) : 1;
 
        D_ASSOC("beacon interval %d beacon timer %d beacon tim %d\n",
-               le16_to_cpu(ctx->timing.beacon_interval),
-               le32_to_cpu(ctx->timing.beacon_init_val),
-               le16_to_cpu(ctx->timing.atim_win));
+               le16_to_cpu(il->timing.beacon_interval),
+               le32_to_cpu(il->timing.beacon_init_val),
+               le16_to_cpu(il->timing.atim_win));
 
-       return il_send_cmd_pdu(il, ctx->rxon_timing_cmd, sizeof(ctx->timing),
-                              &ctx->timing);
+       return il_send_cmd_pdu(il, C_RXON_TIMING, sizeof(il->timing),
+                              &il->timing);
 }
 EXPORT_SYMBOL(il_send_rxon_timing);
 
 void
-il_set_rxon_hwcrypto(struct il_priv *il, struct il_rxon_context *ctx,
-                    int hw_decrypt)
+il_set_rxon_hwcrypto(struct il_priv *il, int hw_decrypt)
 {
-       struct il_rxon_cmd *rxon = &ctx->staging;
+       struct il_rxon_cmd *rxon = &il->staging;
 
        if (hw_decrypt)
                rxon->filter_flags &= ~RXON_FILTER_DIS_DECRYPT_MSK;
@@ -3685,9 +3643,9 @@ EXPORT_SYMBOL(il_set_rxon_hwcrypto);
 
 /* validate RXON structure is valid */
 int
-il_check_rxon_cmd(struct il_priv *il, struct il_rxon_context *ctx)
+il_check_rxon_cmd(struct il_priv *il)
 {
-       struct il_rxon_cmd *rxon = &ctx->staging;
+       struct il_rxon_cmd *rxon = &il->staging;
        bool error = false;
 
        if (rxon->flags & RXON_FLG_BAND_24G_MSK) {
@@ -3765,10 +3723,10 @@ EXPORT_SYMBOL(il_check_rxon_cmd);
  * a new tune (full RXON command, rather than RXON_ASSOC cmd) is required.
  */
 int
-il_full_rxon_required(struct il_priv *il, struct il_rxon_context *ctx)
+il_full_rxon_required(struct il_priv *il)
 {
-       const struct il_rxon_cmd *staging = &ctx->staging;
-       const struct il_rxon_cmd *active = &ctx->active;
+       const struct il_rxon_cmd *staging = &il->staging;
+       const struct il_rxon_cmd *active = &il->active;
 
 #define CHK(cond)                                                      \
        if ((cond)) {                                                   \
@@ -3785,7 +3743,7 @@ il_full_rxon_required(struct il_priv *il, struct il_rxon_context *ctx)
        }
 
        /* These items are only settable from the full RXON command */
-       CHK(!il_is_associated_ctx(ctx));
+       CHK(!il_is_associated(il));
        CHK(compare_ether_addr(staging->bssid_addr, active->bssid_addr));
        CHK(compare_ether_addr(staging->node_addr, active->node_addr));
        CHK(compare_ether_addr
@@ -3819,13 +3777,13 @@ il_full_rxon_required(struct il_priv *il, struct il_rxon_context *ctx)
 EXPORT_SYMBOL(il_full_rxon_required);
 
 u8
-il_get_lowest_plcp(struct il_priv *il, struct il_rxon_context *ctx)
+il_get_lowest_plcp(struct il_priv *il)
 {
        /*
         * Assign the lowest rate -- should really get this from
         * the beacon skb from mac80211.
         */
-       if (ctx->staging.flags & RXON_FLG_BAND_24G_MSK)
+       if (il->staging.flags & RXON_FLG_BAND_24G_MSK)
                return RATE_1M_PLCP;
        else
                return RATE_6M_PLCP;
@@ -3833,12 +3791,11 @@ il_get_lowest_plcp(struct il_priv *il, struct il_rxon_context *ctx)
 EXPORT_SYMBOL(il_get_lowest_plcp);
 
 static void
-_il_set_rxon_ht(struct il_priv *il, struct il_ht_config *ht_conf,
-               struct il_rxon_context *ctx)
+_il_set_rxon_ht(struct il_priv *il, struct il_ht_config *ht_conf)
 {
-       struct il_rxon_cmd *rxon = &ctx->staging;
+       struct il_rxon_cmd *rxon = &il->staging;
 
-       if (!ctx->ht.enabled) {
+       if (!il->ht.enabled) {
                rxon->flags &=
                    ~(RXON_FLG_CHANNEL_MODE_MSK |
                      RXON_FLG_CTRL_CHANNEL_LOC_HI_MSK | RXON_FLG_HT40_PROT_MSK
@@ -3847,19 +3804,19 @@ _il_set_rxon_ht(struct il_priv *il, struct il_ht_config *ht_conf,
        }
 
        rxon->flags |=
-           cpu_to_le32(ctx->ht.protection << RXON_FLG_HT_OPERATING_MODE_POS);
+           cpu_to_le32(il->ht.protection << RXON_FLG_HT_OPERATING_MODE_POS);
 
        /* Set up channel bandwidth:
         * 20 MHz only, 20/40 mixed or pure 40 if ht40 ok */
        /* clear the HT channel mode before set the mode */
        rxon->flags &=
            ~(RXON_FLG_CHANNEL_MODE_MSK | RXON_FLG_CTRL_CHANNEL_LOC_HI_MSK);
-       if (il_is_ht40_tx_allowed(il, ctx, NULL)) {
+       if (il_is_ht40_tx_allowed(il, NULL)) {
                /* pure ht40 */
-               if (ctx->ht.protection == IEEE80211_HT_OP_MODE_PROTECTION_20MHZ) {
+               if (il->ht.protection == IEEE80211_HT_OP_MODE_PROTECTION_20MHZ) {
                        rxon->flags |= RXON_FLG_CHANNEL_MODE_PURE_40;
                        /* Note: control channel is opposite of extension channel */
-                       switch (ctx->ht.extension_chan_offset) {
+                       switch (il->ht.extension_chan_offset) {
                        case IEEE80211_HT_PARAM_CHA_SEC_ABOVE:
                                rxon->flags &=
                                    ~RXON_FLG_CTRL_CHANNEL_LOC_HI_MSK;
@@ -3870,7 +3827,7 @@ _il_set_rxon_ht(struct il_priv *il, struct il_ht_config *ht_conf,
                        }
                } else {
                        /* Note: control channel is opposite of extension channel */
-                       switch (ctx->ht.extension_chan_offset) {
+                       switch (il->ht.extension_chan_offset) {
                        case IEEE80211_HT_PARAM_CHA_SEC_ABOVE:
                                rxon->flags &=
                                    ~(RXON_FLG_CTRL_CHANNEL_LOC_HI_MSK);
@@ -3891,18 +3848,18 @@ _il_set_rxon_ht(struct il_priv *il, struct il_ht_config *ht_conf,
                rxon->flags |= RXON_FLG_CHANNEL_MODE_LEGACY;
        }
 
-       if (il->cfg->ops->hcmd->set_rxon_chain)
-               il->cfg->ops->hcmd->set_rxon_chain(il, ctx);
+       if (il->ops->set_rxon_chain)
+               il->ops->set_rxon_chain(il);
 
        D_ASSOC("rxon flags 0x%X operation mode :0x%X "
                "extension channel offset 0x%x\n", le32_to_cpu(rxon->flags),
-               ctx->ht.protection, ctx->ht.extension_chan_offset);
+               il->ht.protection, il->ht.extension_chan_offset);
 }
 
 void
 il_set_rxon_ht(struct il_priv *il, struct il_ht_config *ht_conf)
 {
-       _il_set_rxon_ht(il, ht_conf, &il->ctx);
+       _il_set_rxon_ht(il, ht_conf);
 }
 EXPORT_SYMBOL(il_set_rxon_ht);
 
@@ -3925,7 +3882,7 @@ il_get_single_channel_number(struct il_priv *il, enum ieee80211_band band)
 
        for (i = min; i < max; i++) {
                channel = il->channel_info[i].channel;
-               if (channel == le16_to_cpu(il->ctx.staging.channel))
+               if (channel == le16_to_cpu(il->staging.channel))
                        continue;
 
                ch_info = il_get_channel_info(il, band, channel);
@@ -3945,20 +3902,19 @@ EXPORT_SYMBOL(il_get_single_channel_number);
  * in the staging RXON flag structure based on the ch->band
  */
 int
-il_set_rxon_channel(struct il_priv *il, struct ieee80211_channel *ch,
-                   struct il_rxon_context *ctx)
+il_set_rxon_channel(struct il_priv *il, struct ieee80211_channel *ch)
 {
        enum ieee80211_band band = ch->band;
        u16 channel = ch->hw_value;
 
-       if (le16_to_cpu(ctx->staging.channel) == channel && il->band == band)
+       if (le16_to_cpu(il->staging.channel) == channel && il->band == band)
                return 0;
 
-       ctx->staging.channel = cpu_to_le16(channel);
+       il->staging.channel = cpu_to_le16(channel);
        if (band == IEEE80211_BAND_5GHZ)
-               ctx->staging.flags &= ~RXON_FLG_BAND_24G_MSK;
+               il->staging.flags &= ~RXON_FLG_BAND_24G_MSK;
        else
-               ctx->staging.flags |= RXON_FLG_BAND_24G_MSK;
+               il->staging.flags |= RXON_FLG_BAND_24G_MSK;
 
        il->band = band;
 
@@ -3969,24 +3925,24 @@ il_set_rxon_channel(struct il_priv *il, struct ieee80211_channel *ch,
 EXPORT_SYMBOL(il_set_rxon_channel);
 
 void
-il_set_flags_for_band(struct il_priv *il, struct il_rxon_context *ctx,
-                     enum ieee80211_band band, struct ieee80211_vif *vif)
+il_set_flags_for_band(struct il_priv *il, enum ieee80211_band band,
+                     struct ieee80211_vif *vif)
 {
        if (band == IEEE80211_BAND_5GHZ) {
-               ctx->staging.flags &=
+               il->staging.flags &=
                    ~(RXON_FLG_BAND_24G_MSK | RXON_FLG_AUTO_DETECT_MSK |
                      RXON_FLG_CCK_MSK);
-               ctx->staging.flags |= RXON_FLG_SHORT_SLOT_MSK;
+               il->staging.flags |= RXON_FLG_SHORT_SLOT_MSK;
        } else {
                /* Copied from il_post_associate() */
                if (vif && vif->bss_conf.use_short_slot)
-                       ctx->staging.flags |= RXON_FLG_SHORT_SLOT_MSK;
+                       il->staging.flags |= RXON_FLG_SHORT_SLOT_MSK;
                else
-                       ctx->staging.flags &= ~RXON_FLG_SHORT_SLOT_MSK;
+                       il->staging.flags &= ~RXON_FLG_SHORT_SLOT_MSK;
 
-               ctx->staging.flags |= RXON_FLG_BAND_24G_MSK;
-               ctx->staging.flags |= RXON_FLG_AUTO_DETECT_MSK;
-               ctx->staging.flags &= ~RXON_FLG_CCK_MSK;
+               il->staging.flags |= RXON_FLG_BAND_24G_MSK;
+               il->staging.flags |= RXON_FLG_AUTO_DETECT_MSK;
+               il->staging.flags &= ~RXON_FLG_CCK_MSK;
        }
 }
 EXPORT_SYMBOL(il_set_flags_for_band);
@@ -3995,69 +3951,60 @@ EXPORT_SYMBOL(il_set_flags_for_band);
  * initialize rxon structure with default values from eeprom
  */
 void
-il_connection_init_rx_config(struct il_priv *il, struct il_rxon_context *ctx)
+il_connection_init_rx_config(struct il_priv *il)
 {
        const struct il_channel_info *ch_info;
 
-       memset(&ctx->staging, 0, sizeof(ctx->staging));
-
-       if (!ctx->vif) {
-               ctx->staging.dev_type = ctx->unused_devtype;
-       } else
-               switch (ctx->vif->type) {
-
-               case NL80211_IFTYPE_STATION:
-                       ctx->staging.dev_type = ctx->station_devtype;
-                       ctx->staging.filter_flags = RXON_FILTER_ACCEPT_GRP_MSK;
-                       break;
-
-               case NL80211_IFTYPE_ADHOC:
-                       ctx->staging.dev_type = ctx->ibss_devtype;
-                       ctx->staging.flags = RXON_FLG_SHORT_PREAMBLE_MSK;
-                       ctx->staging.filter_flags =
-                           RXON_FILTER_BCON_AWARE_MSK |
-                           RXON_FILTER_ACCEPT_GRP_MSK;
-                       break;
-
-               default:
-                       IL_ERR("Unsupported interface type %d\n",
-                              ctx->vif->type);
-                       break;
-               }
+       memset(&il->staging, 0, sizeof(il->staging));
+
+       if (!il->vif) {
+               il->staging.dev_type = RXON_DEV_TYPE_ESS;
+       } else if (il->vif->type == NL80211_IFTYPE_STATION) {
+               il->staging.dev_type = RXON_DEV_TYPE_ESS;
+               il->staging.filter_flags = RXON_FILTER_ACCEPT_GRP_MSK;
+       } else if (il->vif->type == NL80211_IFTYPE_ADHOC) {
+               il->staging.dev_type = RXON_DEV_TYPE_IBSS;
+               il->staging.flags = RXON_FLG_SHORT_PREAMBLE_MSK;
+               il->staging.filter_flags =
+                   RXON_FILTER_BCON_AWARE_MSK | RXON_FILTER_ACCEPT_GRP_MSK;
+       } else {
+               IL_ERR("Unsupported interface type %d\n", il->vif->type);
+               return;
+       }
 
 #if 0
        /* TODO:  Figure out when short_preamble would be set and cache from
         * that */
        if (!hw_to_local(il->hw)->short_preamble)
-               ctx->staging.flags &= ~RXON_FLG_SHORT_PREAMBLE_MSK;
+               il->staging.flags &= ~RXON_FLG_SHORT_PREAMBLE_MSK;
        else
-               ctx->staging.flags |= RXON_FLG_SHORT_PREAMBLE_MSK;
+               il->staging.flags |= RXON_FLG_SHORT_PREAMBLE_MSK;
 #endif
 
        ch_info =
-           il_get_channel_info(il, il->band, le16_to_cpu(ctx->active.channel));
+           il_get_channel_info(il, il->band, le16_to_cpu(il->active.channel));
 
        if (!ch_info)
                ch_info = &il->channel_info[0];
 
-       ctx->staging.channel = cpu_to_le16(ch_info->channel);
+       il->staging.channel = cpu_to_le16(ch_info->channel);
        il->band = ch_info->band;
 
-       il_set_flags_for_band(il, ctx, il->band, ctx->vif);
+       il_set_flags_for_band(il, il->band, il->vif);
 
-       ctx->staging.ofdm_basic_rates =
+       il->staging.ofdm_basic_rates =
            (IL_OFDM_RATES_MASK >> IL_FIRST_OFDM_RATE) & 0xFF;
-       ctx->staging.cck_basic_rates =
+       il->staging.cck_basic_rates =
            (IL_CCK_RATES_MASK >> IL_FIRST_CCK_RATE) & 0xF;
 
        /* clear both MIX and PURE40 mode flag */
-       ctx->staging.flags &=
+       il->staging.flags &=
            ~(RXON_FLG_CHANNEL_MODE_MIXED | RXON_FLG_CHANNEL_MODE_PURE_40);
-       if (ctx->vif)
-               memcpy(ctx->staging.node_addr, ctx->vif->addr, ETH_ALEN);
+       if (il->vif)
+               memcpy(il->staging.node_addr, il->vif->addr, ETH_ALEN);
 
-       ctx->staging.ofdm_ht_single_stream_basic_rates = 0xff;
-       ctx->staging.ofdm_ht_dual_stream_basic_rates = 0xff;
+       il->staging.ofdm_ht_single_stream_basic_rates = 0xff;
+       il->staging.ofdm_ht_dual_stream_basic_rates = 0xff;
 }
 EXPORT_SYMBOL(il_connection_init_rx_config);
 
@@ -4084,10 +4031,10 @@ il_set_rate(struct il_priv *il)
 
        D_RATE("Set active_rate = %0x\n", il->active_rate);
 
-       il->ctx.staging.cck_basic_rates =
+       il->staging.cck_basic_rates =
            (IL_CCK_BASIC_RATES_MASK >> IL_FIRST_CCK_RATE) & 0xF;
 
-       il->ctx.staging.ofdm_basic_rates =
+       il->staging.ofdm_basic_rates =
            (IL_OFDM_BASIC_RATES_MASK >> IL_FIRST_OFDM_RATE) & 0xFF;
 }
 EXPORT_SYMBOL(il_set_rate);
@@ -4095,13 +4042,11 @@ EXPORT_SYMBOL(il_set_rate);
 void
 il_chswitch_done(struct il_priv *il, bool is_success)
 {
-       struct il_rxon_context *ctx = &il->ctx;
-
        if (test_bit(S_EXIT_PENDING, &il->status))
                return;
 
        if (test_and_clear_bit(S_CHANNEL_SWITCH_PENDING, &il->status))
-               ieee80211_chswitch_done(ctx->vif, is_success);
+               ieee80211_chswitch_done(il->vif, is_success);
 }
 EXPORT_SYMBOL(il_chswitch_done);
 
@@ -4110,16 +4055,14 @@ il_hdl_csa(struct il_priv *il, struct il_rx_buf *rxb)
 {
        struct il_rx_pkt *pkt = rxb_addr(rxb);
        struct il_csa_notification *csa = &(pkt->u.csa_notif);
-
-       struct il_rxon_context *ctx = &il->ctx;
-       struct il_rxon_cmd *rxon = (void *)&ctx->active;
+       struct il_rxon_cmd *rxon = (void *)&il->active;
 
        if (!test_bit(S_CHANNEL_SWITCH_PENDING, &il->status))
                return;
 
        if (!le32_to_cpu(csa->status) && csa->channel == il->switch_channel) {
                rxon->channel = csa->channel;
-               ctx->staging.channel = csa->channel;
+               il->staging.channel = csa->channel;
                D_11H("CSA notif: channel %d\n", le16_to_cpu(csa->channel));
                il_chswitch_done(il, true);
        } else {
@@ -4132,9 +4075,9 @@ EXPORT_SYMBOL(il_hdl_csa);
 
 #ifdef CONFIG_IWLEGACY_DEBUG
 void
-il_print_rx_config_cmd(struct il_priv *il, struct il_rxon_context *ctx)
+il_print_rx_config_cmd(struct il_priv *il)
 {
-       struct il_rxon_cmd *rxon = &ctx->staging;
+       struct il_rxon_cmd *rxon = &il->staging;
 
        D_RADIO("RX CONFIG:\n");
        il_print_hex_dump(il, IL_DL_RADIO, (u8 *) rxon, sizeof(*rxon));
@@ -4164,12 +4107,12 @@ il_irq_handle_error(struct il_priv *il)
 
        IL_ERR("Loaded firmware version: %s\n", il->hw->wiphy->fw_version);
 
-       il->cfg->ops->lib->dump_nic_error_log(il);
-       if (il->cfg->ops->lib->dump_fh)
-               il->cfg->ops->lib->dump_fh(il, NULL, false);
+       il->ops->dump_nic_error_log(il);
+       if (il->ops->dump_fh)
+               il->ops->dump_fh(il, NULL, false);
 #ifdef CONFIG_IWLEGACY_DEBUG
        if (il_get_debug_level(il) & IL_DL_FW_ERRORS)
-               il_print_rx_config_cmd(il, &il->ctx);
+               il_print_rx_config_cmd(il);
 #endif
 
        wake_up(&il->wait_command_queue);
@@ -4189,17 +4132,17 @@ il_irq_handle_error(struct il_priv *il)
 EXPORT_SYMBOL(il_irq_handle_error);
 
 static int
-il_apm_stop_master(struct il_priv *il)
+_il_apm_stop_master(struct il_priv *il)
 {
        int ret = 0;
 
        /* stop device's busmaster DMA activity */
-       il_set_bit(il, CSR_RESET, CSR_RESET_REG_FLAG_STOP_MASTER);
+       _il_set_bit(il, CSR_RESET, CSR_RESET_REG_FLAG_STOP_MASTER);
 
        ret =
            _il_poll_bit(il, CSR_RESET, CSR_RESET_REG_FLAG_MASTER_DISABLED,
                         CSR_RESET_REG_FLAG_MASTER_DISABLED, 100);
-       if (ret)
+       if (ret < 0)
                IL_WARN("Master Disable Timed Out, 100 usec\n");
 
        D_INFO("stop master\n");
@@ -4208,15 +4151,17 @@ il_apm_stop_master(struct il_priv *il)
 }
 
 void
-il_apm_stop(struct il_priv *il)
+_il_apm_stop(struct il_priv *il)
 {
+       lockdep_assert_held(&il->reg_lock);
+
        D_INFO("Stop card, put in low power state\n");
 
        /* Stop device's DMA activity */
-       il_apm_stop_master(il);
+       _il_apm_stop_master(il);
 
        /* Reset the entire device */
-       il_set_bit(il, CSR_RESET, CSR_RESET_REG_FLAG_SW_RESET);
+       _il_set_bit(il, CSR_RESET, CSR_RESET_REG_FLAG_SW_RESET);
 
        udelay(10);
 
@@ -4224,7 +4169,18 @@ il_apm_stop(struct il_priv *il)
         * Clear "initialization complete" bit to move adapter from
         * D0A* (powered-up Active) --> D0U* (Uninitialized) state.
         */
-       il_clear_bit(il, CSR_GP_CNTRL, CSR_GP_CNTRL_REG_FLAG_INIT_DONE);
+       _il_clear_bit(il, CSR_GP_CNTRL, CSR_GP_CNTRL_REG_FLAG_INIT_DONE);
+}
+EXPORT_SYMBOL(_il_apm_stop);
+
+void
+il_apm_stop(struct il_priv *il)
+{
+       unsigned long flags;
+
+       spin_lock_irqsave(&il->reg_lock, flags);
+       _il_apm_stop(il);
+       spin_unlock_irqrestore(&il->reg_lock, flags);
 }
 EXPORT_SYMBOL(il_apm_stop);
 
@@ -4276,7 +4232,7 @@ il_apm_init(struct il_priv *il)
         * If not (unlikely), enable L0S, so there is at least some
         *    power savings, even without L1.
         */
-       if (il->cfg->base_params->set_l0s) {
+       if (il->cfg->set_l0s) {
                lctl = il_pcie_link_ctl(il);
                if ((lctl & PCI_CFG_LINK_CTRL_VAL_L1_EN) ==
                    PCI_CFG_LINK_CTRL_VAL_L1_EN) {
@@ -4293,9 +4249,9 @@ il_apm_init(struct il_priv *il)
        }
 
        /* Configure analog phase-lock-loop before activating to D0A */
-       if (il->cfg->base_params->pll_cfg_val)
+       if (il->cfg->pll_cfg_val)
                il_set_bit(il, CSR_ANA_PLL_CFG,
-                          il->cfg->base_params->pll_cfg_val);
+                          il->cfg->pll_cfg_val);
 
        /*
         * Set "initialization complete" bit to move adapter from
@@ -4325,7 +4281,7 @@ il_apm_init(struct il_priv *il)
         * do not disable clocks.  This preserves any hardware bits already
         * set by default in "CLK_CTRL_REG" after reset.
         */
-       if (il->cfg->base_params->use_bsm)
+       if (il->cfg->use_bsm)
                il_wr_prph(il, APMG_CLK_EN_REG,
                           APMG_CLK_VAL_DMA_CLK_RQT | APMG_CLK_VAL_BSM_CLK_RQT);
        else
@@ -4347,14 +4303,13 @@ il_set_tx_power(struct il_priv *il, s8 tx_power, bool force)
        int ret;
        s8 prev_tx_power;
        bool defer;
-       struct il_rxon_context *ctx = &il->ctx;
 
        lockdep_assert_held(&il->mutex);
 
        if (il->tx_power_user_lmt == tx_power && !force)
                return 0;
 
-       if (!il->cfg->ops->lib->send_tx_power)
+       if (!il->ops->send_tx_power)
                return -EOPNOTSUPP;
 
        /* 0 dBm mean 1 milliwatt */
@@ -4378,7 +4333,7 @@ il_set_tx_power(struct il_priv *il, s8 tx_power, bool force)
 
        /* do not set tx power when scanning or channel changing */
        defer = test_bit(S_SCANNING, &il->status) ||
-           memcmp(&ctx->active, &ctx->staging, sizeof(ctx->staging));
+           memcmp(&il->active, &il->staging, sizeof(il->staging));
        if (defer && !force) {
                D_INFO("Deferring tx power set\n");
                return 0;
@@ -4387,7 +4342,7 @@ il_set_tx_power(struct il_priv *il, s8 tx_power, bool force)
        prev_tx_power = il->tx_power_user_lmt;
        il->tx_power_user_lmt = tx_power;
 
-       ret = il->cfg->ops->lib->send_tx_power(il);
+       ret = il->ops->send_tx_power(il);
 
        /* if fail to set tx_power, restore the orig. tx power */
        if (ret) {
@@ -4505,15 +4460,15 @@ il_mac_conf_tx(struct ieee80211_hw *hw, struct ieee80211_vif *vif, u16 queue,
 
        spin_lock_irqsave(&il->lock, flags);
 
-       il->ctx.qos_data.def_qos_parm.ac[q].cw_min =
+       il->qos_data.def_qos_parm.ac[q].cw_min =
            cpu_to_le16(params->cw_min);
-       il->ctx.qos_data.def_qos_parm.ac[q].cw_max =
+       il->qos_data.def_qos_parm.ac[q].cw_max =
            cpu_to_le16(params->cw_max);
-       il->ctx.qos_data.def_qos_parm.ac[q].aifsn = params->aifs;
-       il->ctx.qos_data.def_qos_parm.ac[q].edca_txop =
+       il->qos_data.def_qos_parm.ac[q].aifsn = params->aifs;
+       il->qos_data.def_qos_parm.ac[q].edca_txop =
            cpu_to_le16((params->txop * 32));
 
-       il->ctx.qos_data.def_qos_parm.ac[q].reserved1 = 0;
+       il->qos_data.def_qos_parm.ac[q].reserved1 = 0;
 
        spin_unlock_irqrestore(&il->lock, flags);
 
@@ -4526,60 +4481,36 @@ int
 il_mac_tx_last_beacon(struct ieee80211_hw *hw)
 {
        struct il_priv *il = hw->priv;
+       int ret;
 
-       return il->ibss_manager == IL_IBSS_MANAGER;
-}
-EXPORT_SYMBOL_GPL(il_mac_tx_last_beacon);
-
-static int
-il_set_mode(struct il_priv *il, struct il_rxon_context *ctx)
-{
-       il_connection_init_rx_config(il, ctx);
+       D_MAC80211("enter\n");
 
-       if (il->cfg->ops->hcmd->set_rxon_chain)
-               il->cfg->ops->hcmd->set_rxon_chain(il, ctx);
+       ret = (il->ibss_manager == IL_IBSS_MANAGER);
 
-       return il_commit_rxon(il, ctx);
+       D_MAC80211("leave ret %d\n", ret);
+       return ret;
 }
+EXPORT_SYMBOL_GPL(il_mac_tx_last_beacon);
 
 static int
-il_setup_interface(struct il_priv *il, struct il_rxon_context *ctx)
+il_set_mode(struct il_priv *il)
 {
-       struct ieee80211_vif *vif = ctx->vif;
-       int err;
+       il_connection_init_rx_config(il);
 
-       lockdep_assert_held(&il->mutex);
+       if (il->ops->set_rxon_chain)
+               il->ops->set_rxon_chain(il);
 
-       /*
-        * This variable will be correct only when there's just
-        * a single context, but all code using it is for hardware
-        * that supports only one context.
-        */
-       il->iw_mode = vif->type;
-
-       ctx->is_active = true;
-
-       err = il_set_mode(il, ctx);
-       if (err) {
-               if (!ctx->always_active)
-                       ctx->is_active = false;
-               return err;
-       }
-
-       return 0;
+       return il_commit_rxon(il);
 }
 
 int
 il_mac_add_interface(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
 {
        struct il_priv *il = hw->priv;
-       struct il_vif_priv *vif_priv = (void *)vif->drv_priv;
        int err;
-       u32 modes;
-
-       D_MAC80211("enter: type %d, addr %pM\n", vif->type, vif->addr);
 
        mutex_lock(&il->mutex);
+       D_MAC80211("enter: type %d, addr %pM\n", vif->type, vif->addr);
 
        if (!il_is_ready_rf(il)) {
                IL_WARN("Try to add interface when device not ready\n");
@@ -4587,32 +4518,24 @@ il_mac_add_interface(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
                goto out;
        }
 
-       /* check if busy context is exclusive */
-       if (il->ctx.vif &&
-           (il->ctx.exclusive_interface_modes & BIT(il->ctx.vif->type))) {
-               err = -EINVAL;
-               goto out;
-       }
-
-       modes = il->ctx.interface_modes | il->ctx.exclusive_interface_modes;
-       if (!(modes & BIT(vif->type))) {
+       if (il->vif) {
                err = -EOPNOTSUPP;
                goto out;
        }
 
-       vif_priv->ctx = &il->ctx;
-       il->ctx.vif = vif;
+       il->vif = vif;
+       il->iw_mode = vif->type;
 
-       err = il_setup_interface(il, &il->ctx);
+       err = il_set_mode(il);
        if (err) {
-               il->ctx.vif = NULL;
+               il->vif = NULL;
                il->iw_mode = NL80211_IFTYPE_STATION;
        }
 
 out:
+       D_MAC80211("leave err %d\n", err);
        mutex_unlock(&il->mutex);
 
-       D_MAC80211("leave\n");
        return err;
 }
 EXPORT_SYMBOL(il_mac_add_interface);
@@ -4621,8 +4544,6 @@ static void
 il_teardown_interface(struct il_priv *il, struct ieee80211_vif *vif,
                      bool mode_change)
 {
-       struct il_rxon_context *ctx = il_rxon_ctx_from_vif(vif);
-
        lockdep_assert_held(&il->mutex);
 
        if (il->scan_vif == vif) {
@@ -4630,33 +4551,27 @@ il_teardown_interface(struct il_priv *il, struct ieee80211_vif *vif,
                il_force_scan_end(il);
        }
 
-       if (!mode_change) {
-               il_set_mode(il, ctx);
-               if (!ctx->always_active)
-                       ctx->is_active = false;
-       }
+       if (!mode_change)
+               il_set_mode(il);
+
 }
 
 void
 il_mac_remove_interface(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
 {
        struct il_priv *il = hw->priv;
-       struct il_rxon_context *ctx = il_rxon_ctx_from_vif(vif);
-
-       D_MAC80211("enter\n");
 
        mutex_lock(&il->mutex);
+       D_MAC80211("enter: type %d, addr %pM\n", vif->type, vif->addr);
 
-       WARN_ON(ctx->vif != vif);
-       ctx->vif = NULL;
+       WARN_ON(il->vif != vif);
+       il->vif = NULL;
 
        il_teardown_interface(il, vif, false);
-
        memset(il->bssid, 0, ETH_ALEN);
-       mutex_unlock(&il->mutex);
 
        D_MAC80211("leave\n");
-
+       mutex_unlock(&il->mutex);
 }
 EXPORT_SYMBOL(il_mac_remove_interface);
 
@@ -4666,7 +4581,7 @@ il_alloc_txq_mem(struct il_priv *il)
        if (!il->txq)
                il->txq =
                    kzalloc(sizeof(struct il_tx_queue) *
-                           il->cfg->base_params->num_of_queues, GFP_KERNEL);
+                           il->cfg->num_of_queues, GFP_KERNEL);
        if (!il->txq) {
                IL_ERR("Not enough memory for txq\n");
                return -ENOMEM;
@@ -4676,259 +4591,12 @@ il_alloc_txq_mem(struct il_priv *il)
 EXPORT_SYMBOL(il_alloc_txq_mem);
 
 void
-il_txq_mem(struct il_priv *il)
+il_free_txq_mem(struct il_priv *il)
 {
        kfree(il->txq);
        il->txq = NULL;
 }
-EXPORT_SYMBOL(il_txq_mem);
-
-#ifdef CONFIG_IWLEGACY_DEBUGFS
-
-#define IL_TRAFFIC_DUMP_SIZE   (IL_TRAFFIC_ENTRY_SIZE * IL_TRAFFIC_ENTRIES)
-
-void
-il_reset_traffic_log(struct il_priv *il)
-{
-       il->tx_traffic_idx = 0;
-       il->rx_traffic_idx = 0;
-       if (il->tx_traffic)
-               memset(il->tx_traffic, 0, IL_TRAFFIC_DUMP_SIZE);
-       if (il->rx_traffic)
-               memset(il->rx_traffic, 0, IL_TRAFFIC_DUMP_SIZE);
-}
-
-int
-il_alloc_traffic_mem(struct il_priv *il)
-{
-       u32 traffic_size = IL_TRAFFIC_DUMP_SIZE;
-
-       if (il_debug_level & IL_DL_TX) {
-               if (!il->tx_traffic) {
-                       il->tx_traffic = kzalloc(traffic_size, GFP_KERNEL);
-                       if (!il->tx_traffic)
-                               return -ENOMEM;
-               }
-       }
-       if (il_debug_level & IL_DL_RX) {
-               if (!il->rx_traffic) {
-                       il->rx_traffic = kzalloc(traffic_size, GFP_KERNEL);
-                       if (!il->rx_traffic)
-                               return -ENOMEM;
-               }
-       }
-       il_reset_traffic_log(il);
-       return 0;
-}
-EXPORT_SYMBOL(il_alloc_traffic_mem);
-
-void
-il_free_traffic_mem(struct il_priv *il)
-{
-       kfree(il->tx_traffic);
-       il->tx_traffic = NULL;
-
-       kfree(il->rx_traffic);
-       il->rx_traffic = NULL;
-}
-EXPORT_SYMBOL(il_free_traffic_mem);
-
-void
-il_dbg_log_tx_data_frame(struct il_priv *il, u16 length,
-                        struct ieee80211_hdr *header)
-{
-       __le16 fc;
-       u16 len;
-
-       if (likely(!(il_debug_level & IL_DL_TX)))
-               return;
-
-       if (!il->tx_traffic)
-               return;
-
-       fc = header->frame_control;
-       if (ieee80211_is_data(fc)) {
-               len =
-                   (length >
-                    IL_TRAFFIC_ENTRY_SIZE) ? IL_TRAFFIC_ENTRY_SIZE : length;
-               memcpy((il->tx_traffic +
-                       (il->tx_traffic_idx * IL_TRAFFIC_ENTRY_SIZE)), header,
-                      len);
-               il->tx_traffic_idx =
-                   (il->tx_traffic_idx + 1) % IL_TRAFFIC_ENTRIES;
-       }
-}
-EXPORT_SYMBOL(il_dbg_log_tx_data_frame);
-
-void
-il_dbg_log_rx_data_frame(struct il_priv *il, u16 length,
-                        struct ieee80211_hdr *header)
-{
-       __le16 fc;
-       u16 len;
-
-       if (likely(!(il_debug_level & IL_DL_RX)))
-               return;
-
-       if (!il->rx_traffic)
-               return;
-
-       fc = header->frame_control;
-       if (ieee80211_is_data(fc)) {
-               len =
-                   (length >
-                    IL_TRAFFIC_ENTRY_SIZE) ? IL_TRAFFIC_ENTRY_SIZE : length;
-               memcpy((il->rx_traffic +
-                       (il->rx_traffic_idx * IL_TRAFFIC_ENTRY_SIZE)), header,
-                      len);
-               il->rx_traffic_idx =
-                   (il->rx_traffic_idx + 1) % IL_TRAFFIC_ENTRIES;
-       }
-}
-EXPORT_SYMBOL(il_dbg_log_rx_data_frame);
-
-const char *
-il_get_mgmt_string(int cmd)
-{
-       switch (cmd) {
-               IL_CMD(MANAGEMENT_ASSOC_REQ);
-               IL_CMD(MANAGEMENT_ASSOC_RESP);
-               IL_CMD(MANAGEMENT_REASSOC_REQ);
-               IL_CMD(MANAGEMENT_REASSOC_RESP);
-               IL_CMD(MANAGEMENT_PROBE_REQ);
-               IL_CMD(MANAGEMENT_PROBE_RESP);
-               IL_CMD(MANAGEMENT_BEACON);
-               IL_CMD(MANAGEMENT_ATIM);
-               IL_CMD(MANAGEMENT_DISASSOC);
-               IL_CMD(MANAGEMENT_AUTH);
-               IL_CMD(MANAGEMENT_DEAUTH);
-               IL_CMD(MANAGEMENT_ACTION);
-       default:
-               return "UNKNOWN";
-
-       }
-}
-
-const char *
-il_get_ctrl_string(int cmd)
-{
-       switch (cmd) {
-               IL_CMD(CONTROL_BACK_REQ);
-               IL_CMD(CONTROL_BACK);
-               IL_CMD(CONTROL_PSPOLL);
-               IL_CMD(CONTROL_RTS);
-               IL_CMD(CONTROL_CTS);
-               IL_CMD(CONTROL_ACK);
-               IL_CMD(CONTROL_CFEND);
-               IL_CMD(CONTROL_CFENDACK);
-       default:
-               return "UNKNOWN";
-
-       }
-}
-
-void
-il_clear_traffic_stats(struct il_priv *il)
-{
-       memset(&il->tx_stats, 0, sizeof(struct traffic_stats));
-       memset(&il->rx_stats, 0, sizeof(struct traffic_stats));
-}
-
-/*
- * if CONFIG_IWLEGACY_DEBUGFS defined,
- * il_update_stats function will
- * record all the MGMT, CTRL and DATA pkt for both TX and Rx pass
- * Use debugFs to display the rx/rx_stats
- * if CONFIG_IWLEGACY_DEBUGFS not being defined, then no MGMT and CTRL
- * information will be recorded, but DATA pkt still will be recorded
- * for the reason of il_led.c need to control the led blinking based on
- * number of tx and rx data.
- *
- */
-void
-il_update_stats(struct il_priv *il, bool is_tx, __le16 fc, u16 len)
-{
-       struct traffic_stats *stats;
-
-       if (is_tx)
-               stats = &il->tx_stats;
-       else
-               stats = &il->rx_stats;
-
-       if (ieee80211_is_mgmt(fc)) {
-               switch (fc & cpu_to_le16(IEEE80211_FCTL_STYPE)) {
-               case cpu_to_le16(IEEE80211_STYPE_ASSOC_REQ):
-                       stats->mgmt[MANAGEMENT_ASSOC_REQ]++;
-                       break;
-               case cpu_to_le16(IEEE80211_STYPE_ASSOC_RESP):
-                       stats->mgmt[MANAGEMENT_ASSOC_RESP]++;
-                       break;
-               case cpu_to_le16(IEEE80211_STYPE_REASSOC_REQ):
-                       stats->mgmt[MANAGEMENT_REASSOC_REQ]++;
-                       break;
-               case cpu_to_le16(IEEE80211_STYPE_REASSOC_RESP):
-                       stats->mgmt[MANAGEMENT_REASSOC_RESP]++;
-                       break;
-               case cpu_to_le16(IEEE80211_STYPE_PROBE_REQ):
-                       stats->mgmt[MANAGEMENT_PROBE_REQ]++;
-                       break;
-               case cpu_to_le16(IEEE80211_STYPE_PROBE_RESP):
-                       stats->mgmt[MANAGEMENT_PROBE_RESP]++;
-                       break;
-               case cpu_to_le16(IEEE80211_STYPE_BEACON):
-                       stats->mgmt[MANAGEMENT_BEACON]++;
-                       break;
-               case cpu_to_le16(IEEE80211_STYPE_ATIM):
-                       stats->mgmt[MANAGEMENT_ATIM]++;
-                       break;
-               case cpu_to_le16(IEEE80211_STYPE_DISASSOC):
-                       stats->mgmt[MANAGEMENT_DISASSOC]++;
-                       break;
-               case cpu_to_le16(IEEE80211_STYPE_AUTH):
-                       stats->mgmt[MANAGEMENT_AUTH]++;
-                       break;
-               case cpu_to_le16(IEEE80211_STYPE_DEAUTH):
-                       stats->mgmt[MANAGEMENT_DEAUTH]++;
-                       break;
-               case cpu_to_le16(IEEE80211_STYPE_ACTION):
-                       stats->mgmt[MANAGEMENT_ACTION]++;
-                       break;
-               }
-       } else if (ieee80211_is_ctl(fc)) {
-               switch (fc & cpu_to_le16(IEEE80211_FCTL_STYPE)) {
-               case cpu_to_le16(IEEE80211_STYPE_BACK_REQ):
-                       stats->ctrl[CONTROL_BACK_REQ]++;
-                       break;
-               case cpu_to_le16(IEEE80211_STYPE_BACK):
-                       stats->ctrl[CONTROL_BACK]++;
-                       break;
-               case cpu_to_le16(IEEE80211_STYPE_PSPOLL):
-                       stats->ctrl[CONTROL_PSPOLL]++;
-                       break;
-               case cpu_to_le16(IEEE80211_STYPE_RTS):
-                       stats->ctrl[CONTROL_RTS]++;
-                       break;
-               case cpu_to_le16(IEEE80211_STYPE_CTS):
-                       stats->ctrl[CONTROL_CTS]++;
-                       break;
-               case cpu_to_le16(IEEE80211_STYPE_ACK):
-                       stats->ctrl[CONTROL_ACK]++;
-                       break;
-               case cpu_to_le16(IEEE80211_STYPE_CFEND):
-                       stats->ctrl[CONTROL_CFEND]++;
-                       break;
-               case cpu_to_le16(IEEE80211_STYPE_CFENDACK):
-                       stats->ctrl[CONTROL_CFENDACK]++;
-                       break;
-               }
-       } else {
-               /* data */
-               stats->data_cnt++;
-               stats->data_bytes += len;
-       }
-}
-EXPORT_SYMBOL(il_update_stats);
-#endif
+EXPORT_SYMBOL(il_free_txq_mem);
 
 int
 il_force_reset(struct il_priv *il, bool external)
@@ -4987,15 +4655,18 @@ il_mac_change_interface(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
                        enum nl80211_iftype newtype, bool newp2p)
 {
        struct il_priv *il = hw->priv;
-       struct il_rxon_context *ctx = il_rxon_ctx_from_vif(vif);
-       u32 modes;
        int err;
 
-       newtype = ieee80211_iftype_p2p(newtype, newp2p);
-
        mutex_lock(&il->mutex);
+       D_MAC80211("enter: type %d, addr %pM newtype %d newp2p %d\n",
+                   vif->type, vif->addr, newtype, newp2p);
 
-       if (!ctx->vif || !il_is_ready_rf(il)) {
+       if (newp2p) {
+               err = -EOPNOTSUPP;
+               goto out;
+       }
+
+       if (!il->vif || !il_is_ready_rf(il)) {
                /*
                 * Huh? But wait ... this can maybe happen when
                 * we're in the middle of a firmware restart!
@@ -5004,23 +4675,11 @@ il_mac_change_interface(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
                goto out;
        }
 
-       modes = ctx->interface_modes | ctx->exclusive_interface_modes;
-       if (!(modes & BIT(newtype))) {
-               err = -EOPNOTSUPP;
-               goto out;
-       }
-
-       if ((il->ctx.exclusive_interface_modes & BIT(il->ctx.vif->type)) ||
-           (il->ctx.exclusive_interface_modes & BIT(newtype))) {
-               err = -EINVAL;
-               goto out;
-       }
-
        /* success */
        il_teardown_interface(il, vif, true);
        vif->type = newtype;
-       vif->p2p = newp2p;
-       err = il_setup_interface(il, ctx);
+       vif->p2p = false;
+       err = il_set_mode(il);
        WARN_ON(err);
        /*
         * We've switched internally, but submitting to the
@@ -5032,7 +4691,9 @@ il_mac_change_interface(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
        err = 0;
 
 out:
+       D_MAC80211("leave err %d\n", err);
        mutex_unlock(&il->mutex);
+
        return err;
 }
 EXPORT_SYMBOL(il_mac_change_interface);
@@ -5056,11 +4717,11 @@ il_check_stuck_queue(struct il_priv *il, int cnt)
 
        timeout =
            txq->time_stamp +
-           msecs_to_jiffies(il->cfg->base_params->wd_timeout);
+           msecs_to_jiffies(il->cfg->wd_timeout);
 
        if (time_after(jiffies, timeout)) {
                IL_ERR("Queue %d stuck for %u ms.\n", q->id,
-                      il->cfg->base_params->wd_timeout);
+                      il->cfg->wd_timeout);
                ret = il_force_reset(il, false);
                return (ret == -EAGAIN) ? 0 : 1;
        }
@@ -5088,7 +4749,7 @@ il_bg_watchdog(unsigned long data)
        if (test_bit(S_EXIT_PENDING, &il->status))
                return;
 
-       timeout = il->cfg->base_params->wd_timeout;
+       timeout = il->cfg->wd_timeout;
        if (timeout == 0)
                return;
 
@@ -5115,7 +4776,7 @@ EXPORT_SYMBOL(il_bg_watchdog);
 void
 il_setup_watchdog(struct il_priv *il)
 {
-       unsigned int timeout = il->cfg->base_params->wd_timeout;
+       unsigned int timeout = il->cfg->wd_timeout;
 
        if (timeout)
                mod_timer(&il->watchdog,
@@ -5229,9 +4890,9 @@ il_pci_resume(struct device *device)
                hw_rfkill = true;
 
        if (hw_rfkill)
-               set_bit(S_RF_KILL_HW, &il->status);
+               set_bit(S_RFKILL, &il->status);
        else
-               clear_bit(S_RF_KILL_HW, &il->status);
+               clear_bit(S_RFKILL, &il->status);
 
        wiphy_rfkill_set_hw_state(il->hw->wiphy, hw_rfkill);
 
@@ -5252,28 +4913,25 @@ EXPORT_SYMBOL(il_pm_ops);
 #endif /* CONFIG_PM */
 
 static void
-il_update_qos(struct il_priv *il, struct il_rxon_context *ctx)
+il_update_qos(struct il_priv *il)
 {
        if (test_bit(S_EXIT_PENDING, &il->status))
                return;
 
-       if (!ctx->is_active)
-               return;
-
-       ctx->qos_data.def_qos_parm.qos_flags = 0;
+       il->qos_data.def_qos_parm.qos_flags = 0;
 
-       if (ctx->qos_data.qos_active)
-               ctx->qos_data.def_qos_parm.qos_flags |=
+       if (il->qos_data.qos_active)
+               il->qos_data.def_qos_parm.qos_flags |=
                    QOS_PARAM_FLG_UPDATE_EDCA_MSK;
 
-       if (ctx->ht.enabled)
-               ctx->qos_data.def_qos_parm.qos_flags |= QOS_PARAM_FLG_TGN_MSK;
+       if (il->ht.enabled)
+               il->qos_data.def_qos_parm.qos_flags |= QOS_PARAM_FLG_TGN_MSK;
 
        D_QOS("send QoS cmd with Qos active=%d FLAGS=0x%X\n",
-             ctx->qos_data.qos_active, ctx->qos_data.def_qos_parm.qos_flags);
+             il->qos_data.qos_active, il->qos_data.def_qos_parm.qos_flags);
 
-       il_send_cmd_pdu_async(il, ctx->qos_cmd, sizeof(struct il_qosparam_cmd),
-                             &ctx->qos_data.def_qos_parm, NULL);
+       il_send_cmd_pdu_async(il, C_QOS_PARAM, sizeof(struct il_qosparam_cmd),
+                             &il->qos_data.def_qos_parm, NULL);
 }
 
 /**
@@ -5287,19 +4945,14 @@ il_mac_config(struct ieee80211_hw *hw, u32 changed)
        struct ieee80211_conf *conf = &hw->conf;
        struct ieee80211_channel *channel = conf->channel;
        struct il_ht_config *ht_conf = &il->current_ht_config;
-       struct il_rxon_context *ctx = &il->ctx;
        unsigned long flags = 0;
        int ret = 0;
        u16 ch;
        int scan_active = 0;
        bool ht_changed = false;
 
-       if (WARN_ON(!il->cfg->ops->legacy))
-               return -EOPNOTSUPP;
-
        mutex_lock(&il->mutex);
-
-       D_MAC80211("enter to channel %d changed 0x%X\n", channel->hw_value,
+       D_MAC80211("enter: channel %d changed 0x%X\n", channel->hw_value,
                   changed);
 
        if (unlikely(test_bit(S_SCANNING, &il->status))) {
@@ -5319,8 +4972,8 @@ il_mac_config(struct ieee80211_hw *hw, u32 changed)
                 * set up the SM PS mode to OFF if an HT channel is
                 * configured.
                 */
-               if (il->cfg->ops->hcmd->set_rxon_chain)
-                       il->cfg->ops->hcmd->set_rxon_chain(il, &il->ctx);
+               if (il->ops->set_rxon_chain)
+                       il->ops->set_rxon_chain(il);
        }
 
        /* during scanning mac80211 will delay channel setting until
@@ -5349,48 +5002,48 @@ il_mac_config(struct ieee80211_hw *hw, u32 changed)
                spin_lock_irqsave(&il->lock, flags);
 
                /* Configure HT40 channels */
-               if (ctx->ht.enabled != conf_is_ht(conf)) {
-                       ctx->ht.enabled = conf_is_ht(conf);
+               if (il->ht.enabled != conf_is_ht(conf)) {
+                       il->ht.enabled = conf_is_ht(conf);
                        ht_changed = true;
                }
-               if (ctx->ht.enabled) {
+               if (il->ht.enabled) {
                        if (conf_is_ht40_minus(conf)) {
-                               ctx->ht.extension_chan_offset =
+                               il->ht.extension_chan_offset =
                                    IEEE80211_HT_PARAM_CHA_SEC_BELOW;
-                               ctx->ht.is_40mhz = true;
+                               il->ht.is_40mhz = true;
                        } else if (conf_is_ht40_plus(conf)) {
-                               ctx->ht.extension_chan_offset =
+                               il->ht.extension_chan_offset =
                                    IEEE80211_HT_PARAM_CHA_SEC_ABOVE;
-                               ctx->ht.is_40mhz = true;
+                               il->ht.is_40mhz = true;
                        } else {
-                               ctx->ht.extension_chan_offset =
+                               il->ht.extension_chan_offset =
                                    IEEE80211_HT_PARAM_CHA_SEC_NONE;
-                               ctx->ht.is_40mhz = false;
+                               il->ht.is_40mhz = false;
                        }
                } else
-                       ctx->ht.is_40mhz = false;
+                       il->ht.is_40mhz = false;
 
                /*
                 * Default to no protection. Protection mode will
                 * later be set from BSS config in il_ht_conf
                 */
-               ctx->ht.protection = IEEE80211_HT_OP_MODE_PROTECTION_NONE;
+               il->ht.protection = IEEE80211_HT_OP_MODE_PROTECTION_NONE;
 
                /* if we are switching from ht to 2.4 clear flags
                 * from any ht related info since 2.4 does not
                 * support ht */
-               if ((le16_to_cpu(ctx->staging.channel) != ch))
-                       ctx->staging.flags = 0;
+               if ((le16_to_cpu(il->staging.channel) != ch))
+                       il->staging.flags = 0;
 
-               il_set_rxon_channel(il, channel, ctx);
+               il_set_rxon_channel(il, channel);
                il_set_rxon_ht(il, ht_conf);
 
-               il_set_flags_for_band(il, ctx, channel->band, ctx->vif);
+               il_set_flags_for_band(il, channel->band, il->vif);
 
                spin_unlock_irqrestore(&il->lock, flags);
 
-               if (il->cfg->ops->legacy->update_bcast_stations)
-                       ret = il->cfg->ops->legacy->update_bcast_stations(il);
+               if (il->ops->update_bcast_stations)
+                       ret = il->ops->update_bcast_stations(il);
 
 set_ch_out:
                /* The list of supported rates and rate mask can be different
@@ -5420,16 +5073,17 @@ set_ch_out:
        if (scan_active)
                goto out;
 
-       if (memcmp(&ctx->active, &ctx->staging, sizeof(ctx->staging)))
-               il_commit_rxon(il, ctx);
+       if (memcmp(&il->active, &il->staging, sizeof(il->staging)))
+               il_commit_rxon(il);
        else
                D_INFO("Not re-sending same RXON configuration.\n");
        if (ht_changed)
-               il_update_qos(il, ctx);
+               il_update_qos(il);
 
 out:
-       D_MAC80211("leave\n");
+       D_MAC80211("leave ret %d\n", ret);
        mutex_unlock(&il->mutex);
+
        return ret;
 }
 EXPORT_SYMBOL(il_mac_config);
@@ -5439,26 +5093,18 @@ il_mac_reset_tsf(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
 {
        struct il_priv *il = hw->priv;
        unsigned long flags;
-       struct il_rxon_context *ctx = &il->ctx;
-
-       if (WARN_ON(!il->cfg->ops->legacy))
-               return;
 
        mutex_lock(&il->mutex);
-       D_MAC80211("enter\n");
+       D_MAC80211("enter: type %d, addr %pM\n", vif->type, vif->addr);
 
        spin_lock_irqsave(&il->lock, flags);
-       memset(&il->current_ht_config, 0, sizeof(struct il_ht_config));
-       spin_unlock_irqrestore(&il->lock, flags);
 
-       spin_lock_irqsave(&il->lock, flags);
+       memset(&il->current_ht_config, 0, sizeof(struct il_ht_config));
 
        /* new association get rid of ibss beacon skb */
        if (il->beacon_skb)
                dev_kfree_skb(il->beacon_skb);
-
        il->beacon_skb = NULL;
-
        il->timestamp = 0;
 
        spin_unlock_irqrestore(&il->lock, flags);
@@ -5470,17 +5116,14 @@ il_mac_reset_tsf(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
                return;
        }
 
-       /* we are restarting association process
-        * clear RXON_FILTER_ASSOC_MSK bit
-        */
-       ctx->staging.filter_flags &= ~RXON_FILTER_ASSOC_MSK;
-       il_commit_rxon(il, ctx);
+       /* we are restarting association process */
+       il->staging.filter_flags &= ~RXON_FILTER_ASSOC_MSK;
+       il_commit_rxon(il);
 
        il_set_rate(il);
 
-       mutex_unlock(&il->mutex);
-
        D_MAC80211("leave\n");
+       mutex_unlock(&il->mutex);
 }
 EXPORT_SYMBOL(il_mac_reset_tsf);
 
@@ -5490,16 +5133,15 @@ il_ht_conf(struct il_priv *il, struct ieee80211_vif *vif)
        struct il_ht_config *ht_conf = &il->current_ht_config;
        struct ieee80211_sta *sta;
        struct ieee80211_bss_conf *bss_conf = &vif->bss_conf;
-       struct il_rxon_context *ctx = il_rxon_ctx_from_vif(vif);
 
        D_ASSOC("enter:\n");
 
-       if (!ctx->ht.enabled)
+       if (!il->ht.enabled)
                return;
 
-       ctx->ht.protection =
+       il->ht.protection =
            bss_conf->ht_operation_mode & IEEE80211_HT_OP_MODE_PROTECTION;
-       ctx->ht.non_gf_sta_present =
+       il->ht.non_gf_sta_present =
            !!(bss_conf->
               ht_operation_mode & IEEE80211_HT_OP_MODE_NON_GF_STA_PRSNT);
 
@@ -5548,16 +5190,14 @@ il_ht_conf(struct il_priv *il, struct ieee80211_vif *vif)
 static inline void
 il_set_no_assoc(struct il_priv *il, struct ieee80211_vif *vif)
 {
-       struct il_rxon_context *ctx = il_rxon_ctx_from_vif(vif);
-
        /*
         * inform the ucode that there is no longer an
         * association and that no more packets should be
         * sent
         */
-       ctx->staging.filter_flags &= ~RXON_FILTER_ASSOC_MSK;
-       ctx->staging.assoc_id = 0;
-       il_commit_rxon(il, ctx);
+       il->staging.filter_flags &= ~RXON_FILTER_ASSOC_MSK;
+       il->staging.assoc_id = 0;
+       il_commit_rxon(il);
 }
 
 static void
@@ -5575,8 +5215,8 @@ il_beacon_update(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
 
        lockdep_assert_held(&il->mutex);
 
-       if (!il->beacon_ctx) {
-               IL_ERR("update beacon but no beacon context!\n");
+       if (!il->beacon_enabled) {
+               IL_ERR("update beacon with no beaconing enabled\n");
                dev_kfree_skb(skb);
                return;
        }
@@ -5599,7 +5239,7 @@ il_beacon_update(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
                return;
        }
 
-       il->cfg->ops->legacy->post_associate(il);
+       il->ops->post_associate(il);
 }
 
 void
@@ -5607,17 +5247,13 @@ il_mac_bss_info_changed(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
                        struct ieee80211_bss_conf *bss_conf, u32 changes)
 {
        struct il_priv *il = hw->priv;
-       struct il_rxon_context *ctx = il_rxon_ctx_from_vif(vif);
        int ret;
 
-       if (WARN_ON(!il->cfg->ops->legacy))
-               return;
-
-       D_MAC80211("changes = 0x%X\n", changes);
-
        mutex_lock(&il->mutex);
+       D_MAC80211("enter: changes 0x%x\n", changes);
 
        if (!il_is_alive(il)) {
+               D_MAC80211("leave - not alive\n");
                mutex_unlock(&il->mutex);
                return;
        }
@@ -5626,21 +5262,17 @@ il_mac_bss_info_changed(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
                unsigned long flags;
 
                spin_lock_irqsave(&il->lock, flags);
-               ctx->qos_data.qos_active = bss_conf->qos;
-               il_update_qos(il, ctx);
+               il->qos_data.qos_active = bss_conf->qos;
+               il_update_qos(il);
                spin_unlock_irqrestore(&il->lock, flags);
        }
 
        if (changes & BSS_CHANGED_BEACON_ENABLED) {
-               /*
-                * the add_interface code must make sure we only ever
-                * have a single interface that could be beaconing at
-                * any time.
-                */
+               /* FIXME: can we remove beacon_enabled ? */
                if (vif->bss_conf.enable_beacon)
-                       il->beacon_ctx = ctx;
+                       il->beacon_enabled = true;
                else
-                       il->beacon_ctx = NULL;
+                       il->beacon_enabled = false;
        }
 
        if (changes & BSS_CHANGED_BSSID) {
@@ -5652,23 +5284,20 @@ il_mac_bss_info_changed(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
                 * below/in post_associate will fail.
                 */
                if (il_scan_cancel_timeout(il, 100)) {
-                       IL_WARN("Aborted scan still in progress after 100ms\n");
-                       D_MAC80211("leaving - scan abort failed.\n");
+                       D_MAC80211("leave - scan abort failed\n");
                        mutex_unlock(&il->mutex);
                        return;
                }
 
                /* mac80211 only sets assoc when in STATION mode */
                if (vif->type == NL80211_IFTYPE_ADHOC || bss_conf->assoc) {
-                       memcpy(ctx->staging.bssid_addr, bss_conf->bssid,
+                       memcpy(il->staging.bssid_addr, bss_conf->bssid,
                               ETH_ALEN);
 
                        /* currently needed in a few places */
                        memcpy(il->bssid, bss_conf->bssid, ETH_ALEN);
-               } else {
-                       ctx->staging.filter_flags &= ~RXON_FILTER_ASSOC_MSK;
-               }
-
+               } else
+                       il->staging.filter_flags &= ~RXON_FILTER_ASSOC_MSK;
        }
 
        /*
@@ -5682,21 +5311,21 @@ il_mac_bss_info_changed(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
        if (changes & BSS_CHANGED_ERP_PREAMBLE) {
                D_MAC80211("ERP_PREAMBLE %d\n", bss_conf->use_short_preamble);
                if (bss_conf->use_short_preamble)
-                       ctx->staging.flags |= RXON_FLG_SHORT_PREAMBLE_MSK;
+                       il->staging.flags |= RXON_FLG_SHORT_PREAMBLE_MSK;
                else
-                       ctx->staging.flags &= ~RXON_FLG_SHORT_PREAMBLE_MSK;
+                       il->staging.flags &= ~RXON_FLG_SHORT_PREAMBLE_MSK;
        }
 
        if (changes & BSS_CHANGED_ERP_CTS_PROT) {
                D_MAC80211("ERP_CTS %d\n", bss_conf->use_cts_prot);
                if (bss_conf->use_cts_prot && il->band != IEEE80211_BAND_5GHZ)
-                       ctx->staging.flags |= RXON_FLG_TGG_PROTECT_MSK;
+                       il->staging.flags |= RXON_FLG_TGG_PROTECT_MSK;
                else
-                       ctx->staging.flags &= ~RXON_FLG_TGG_PROTECT_MSK;
+                       il->staging.flags &= ~RXON_FLG_TGG_PROTECT_MSK;
                if (bss_conf->use_cts_prot)
-                       ctx->staging.flags |= RXON_FLG_SELF_CTS_EN;
+                       il->staging.flags |= RXON_FLG_SELF_CTS_EN;
                else
-                       ctx->staging.flags &= ~RXON_FLG_SELF_CTS_EN;
+                       il->staging.flags &= ~RXON_FLG_SELF_CTS_EN;
        }
 
        if (changes & BSS_CHANGED_BASIC_RATES) {
@@ -5706,12 +5335,12 @@ il_mac_bss_info_changed(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
                 * like this here:
                 *
                 if (A-band)
-                ctx->staging.ofdm_basic_rates =
+                il->staging.ofdm_basic_rates =
                 bss_conf->basic_rates;
                 else
-                ctx->staging.ofdm_basic_rates =
+                il->staging.ofdm_basic_rates =
                 bss_conf->basic_rates >> 4;
-                ctx->staging.cck_basic_rates =
+                il->staging.cck_basic_rates =
                 bss_conf->basic_rates & 0xF;
                 */
        }
@@ -5719,8 +5348,8 @@ il_mac_bss_info_changed(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
        if (changes & BSS_CHANGED_HT) {
                il_ht_conf(il, vif);
 
-               if (il->cfg->ops->hcmd->set_rxon_chain)
-                       il->cfg->ops->hcmd->set_rxon_chain(il, ctx);
+               if (il->ops->set_rxon_chain)
+                       il->ops->set_rxon_chain(il);
        }
 
        if (changes & BSS_CHANGED_ASSOC) {
@@ -5729,45 +5358,42 @@ il_mac_bss_info_changed(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
                        il->timestamp = bss_conf->timestamp;
 
                        if (!il_is_rfkill(il))
-                               il->cfg->ops->legacy->post_associate(il);
+                               il->ops->post_associate(il);
                } else
                        il_set_no_assoc(il, vif);
        }
 
-       if (changes && il_is_associated_ctx(ctx) && bss_conf->aid) {
+       if (changes && il_is_associated(il) && bss_conf->aid) {
                D_MAC80211("Changes (%#x) while associated\n", changes);
-               ret = il_send_rxon_assoc(il, ctx);
+               ret = il_send_rxon_assoc(il);
                if (!ret) {
                        /* Sync active_rxon with latest change. */
-                       memcpy((void *)&ctx->active, &ctx->staging,
+                       memcpy((void *)&il->active, &il->staging,
                               sizeof(struct il_rxon_cmd));
                }
        }
 
        if (changes & BSS_CHANGED_BEACON_ENABLED) {
                if (vif->bss_conf.enable_beacon) {
-                       memcpy(ctx->staging.bssid_addr, bss_conf->bssid,
+                       memcpy(il->staging.bssid_addr, bss_conf->bssid,
                               ETH_ALEN);
                        memcpy(il->bssid, bss_conf->bssid, ETH_ALEN);
-                       il->cfg->ops->legacy->config_ap(il);
+                       il->ops->config_ap(il);
                } else
                        il_set_no_assoc(il, vif);
        }
 
        if (changes & BSS_CHANGED_IBSS) {
-               ret =
-                   il->cfg->ops->legacy->manage_ibss_station(il, vif,
-                                                             bss_conf->
-                                                             ibss_joined);
+               ret = il->ops->manage_ibss_station(il, vif,
+                                                  bss_conf->ibss_joined);
                if (ret)
                        IL_ERR("failed to %s IBSS station %pM\n",
                               bss_conf->ibss_joined ? "add" : "remove",
                               bss_conf->bssid);
        }
 
-       mutex_unlock(&il->mutex);
-
        D_MAC80211("leave\n");
+       mutex_unlock(&il->mutex);
 }
 EXPORT_SYMBOL(il_mac_bss_info_changed);
 
index abfa388..5f50177 100644 (file)
@@ -143,12 +143,6 @@ struct il_queue {
                                 * space less than this */
 };
 
-/* One for each TFD */
-struct il_tx_info {
-       struct sk_buff *skb;
-       struct il_rxon_context *ctx;
-};
-
 /**
  * struct il_tx_queue - Tx Queue for DMA
  * @q: generic Rx/Tx queue descriptor
@@ -156,7 +150,7 @@ struct il_tx_info {
  * @cmd: array of command/TX buffer pointers
  * @meta: array of meta data for each command/tx buffer
  * @dma_addr_cmd: physical address of cmd/tx buffer array
- * @txb: array of per-TFD driver data
+ * @skbs: array of per-TFD socket buffer pointers
  * @time_stamp: time (in jiffies) of last read_ptr change
  * @need_update: indicates need to update read/write idx
  * @sched_retry: indicates queue is high-throughput aggregation (HT AGG) enabled
@@ -172,7 +166,7 @@ struct il_tx_queue {
        void *tfds;
        struct il_device_cmd **cmd;
        struct il_cmd_meta *meta;
-       struct il_tx_info *txb;
+       struct sk_buff **skbs;
        unsigned long time_stamp;
        u8 need_update;
        u8 sched_retry;
@@ -431,12 +425,6 @@ struct il_eeprom_calib_info {
 
 #define EEPROM_REGULATORY_BAND_NO_HT40                 (0)
 
-struct il_eeprom_ops {
-       const u32 regulatory_bands[7];
-       int (*acquire_semaphore) (struct il_priv *il);
-       void (*release_semaphore) (struct il_priv *il);
-};
-
 int il_eeprom_init(struct il_priv *il);
 void il_eeprom_free(struct il_priv *il);
 const u8 *il_eeprom_query_addr(const struct il_priv *il, size_t offset);
@@ -735,13 +723,12 @@ struct il_qos_info {
 struct il_station_entry {
        struct il_addsta_cmd sta;
        struct il_tid_data tid[MAX_TID_COUNT];
-       u8 used, ctxid;
+       u8 used;
        struct il_hw_key keyinfo;
        struct il_link_quality_cmd *lq;
 };
 
 struct il_station_priv_common {
-       struct il_rxon_context *ctx;
        u8 sta_id;
 };
 
@@ -752,7 +739,6 @@ struct il_station_priv_common {
  * space for us to put data into.
  */
 struct il_vif_priv {
-       struct il_rxon_context *ctx;
        u8 ibss_bssid_sta_id;
 };
 
@@ -816,6 +802,7 @@ struct il_sensitivity_ranges {
 
 /**
  * struct il_hw_params
+ * @bcast_id: f/w broadcast station ID
  * @max_txq_num: Max # Tx queues supported
  * @dma_chnl_num: Number of Tx DMA/FIFO channels
  * @scd_bc_tbls_size: size of scheduler byte count tables
@@ -836,6 +823,7 @@ struct il_sensitivity_ranges {
  * @struct il_sensitivity_ranges: range of sensitivity values
  */
 struct il_hw_params {
+       u8 bcast_id;
        u8 max_txq_num;
        u8 dma_chnl_num;
        u16 scd_bc_tbls_size;
@@ -968,26 +956,6 @@ enum il4965_chain_noise_state {
        IL_CHAIN_NOISE_DONE,
 };
 
-enum il4965_calib_enabled_state {
-       IL_CALIB_DISABLED = 0,  /* must be 0 */
-       IL_CALIB_ENABLED = 1,
-};
-
-/*
- * enum il_calib
- * defines the order in which results of initial calibrations
- * should be sent to the runtime uCode
- */
-enum il_calib {
-       IL_CALIB_MAX,
-};
-
-/* Opaque calibration results */
-struct il_calib_result {
-       void *buf;
-       size_t buf_len;
-};
-
 enum ucode_type {
        UCODE_NONE = 0,
        UCODE_INIT,
@@ -1152,55 +1120,6 @@ struct il_force_reset {
 
 struct il_rxon_context {
        struct ieee80211_vif *vif;
-
-       const u8 *ac_to_fifo;
-       const u8 *ac_to_queue;
-       u8 mcast_queue;
-
-       /*
-        * We could use the vif to indicate active, but we
-        * also need it to be active during disabling when
-        * we already removed the vif for type setting.
-        */
-       bool always_active, is_active;
-
-       bool ht_need_multiple_chains;
-
-       int ctxid;
-
-       u32 interface_modes, exclusive_interface_modes;
-       u8 unused_devtype, ap_devtype, ibss_devtype, station_devtype;
-
-       /*
-        * We declare this const so it can only be
-        * changed via explicit cast within the
-        * routines that actually update the physical
-        * hardware.
-        */
-       const struct il_rxon_cmd active;
-       struct il_rxon_cmd staging;
-
-       struct il_rxon_time_cmd timing;
-
-       struct il_qos_info qos_data;
-
-       u8 bcast_sta_id, ap_sta_id;
-
-       u8 rxon_cmd, rxon_assoc_cmd, rxon_timing_cmd;
-       u8 qos_cmd;
-       u8 wep_key_cmd;
-
-       struct il_wep_key wep_keys[WEP_KEYS_MAX];
-       u8 key_mapping_keys;
-
-       __le32 station_flags;
-
-       struct {
-               bool non_gf_sta_present;
-               u8 protection;
-               bool enabled, is_40mhz;
-               u8 extension_chan_offset;
-       } ht;
 };
 
 struct il_power_mgr {
@@ -1211,12 +1130,15 @@ struct il_power_mgr {
 };
 
 struct il_priv {
-
-       /* ieee device used by generic ieee processing code */
        struct ieee80211_hw *hw;
        struct ieee80211_channel *ieee_channels;
        struct ieee80211_rate *ieee_rates;
+
        struct il_cfg *cfg;
+       const struct il_ops *ops;
+#ifdef CONFIG_IWLEGACY_DEBUGFS
+       const struct il_debugfs_ops *debugfs_ops;
+#endif
 
        /* temporary frame storage list */
        struct list_head free_frames;
@@ -1253,9 +1175,6 @@ struct il_priv {
        s32 temperature;        /* degrees Kelvin */
        s32 last_temperature;
 
-       /* init calibration results */
-       struct il_calib_result calib_results[IL_CALIB_MAX];
-
        /* Scan related variables */
        unsigned long scan_start;
        unsigned long scan_start_tsf;
@@ -1304,7 +1223,28 @@ struct il_priv {
        u8 ucode_write_complete;        /* the image write is complete */
        char firmware_name[25];
 
-       struct il_rxon_context ctx;
+       struct ieee80211_vif *vif;
+
+       struct il_qos_info qos_data;
+
+       struct {
+               bool enabled;
+               bool is_40mhz;
+               bool non_gf_sta_present;
+               u8 protection;
+               u8 extension_chan_offset;
+       } ht;
+
+       /*
+        * We declare this const so it can only be
+        * changed via explicit cast within the
+        * routines that actually update the physical
+        * hardware.
+        */
+       const struct il_rxon_cmd active;
+       struct il_rxon_cmd staging;
+
+       struct il_rxon_time_cmd timing;
 
        __le16 switch_channel;
 
@@ -1427,6 +1367,9 @@ struct il_priv {
                        u8 phy_calib_chain_noise_reset_cmd;
                        u8 phy_calib_chain_noise_gain_cmd;
 
+                       u8 key_mapping_keys;
+                       struct il_wep_key wep_keys[WEP_KEYS_MAX];
+
                        struct il_notif_stats stats;
 #ifdef CONFIG_IWLEGACY_DEBUGFS
                        struct il_notif_stats accum_stats;
@@ -1449,7 +1392,7 @@ struct il_priv {
        struct work_struct rx_replenish;
        struct work_struct abort_scan;
 
-       struct il_rxon_context *beacon_ctx;
+       bool beacon_enabled;
        struct sk_buff *beacon_skb;
 
        struct work_struct tx_flush;
@@ -1507,30 +1450,10 @@ il_txq_ctx_deactivate(struct il_priv *il, int txq_id)
        clear_bit(txq_id, &il->txq_ctx_active_msk);
 }
 
-static inline struct ieee80211_hdr *
-il_tx_queue_get_hdr(struct il_priv *il, int txq_id, int idx)
-{
-       if (il->txq[txq_id].txb[idx].skb)
-               return (struct ieee80211_hdr *)il->txq[txq_id].txb[idx].skb->
-                   data;
-       return NULL;
-}
-
-static inline struct il_rxon_context *
-il_rxon_ctx_from_vif(struct ieee80211_vif *vif)
-{
-       struct il_vif_priv *vif_priv = (void *)vif->drv_priv;
-
-       return vif_priv->ctx;
-}
-
-#define for_each_context(il, _ctx) \
-       for (_ctx = &il->ctx; _ctx == &il->ctx; _ctx++)
-
 static inline int
 il_is_associated(struct il_priv *il)
 {
-       return (il->ctx.active.filter_flags & RXON_FILTER_ASSOC_MSK) ? 1 : 0;
+       return (il->active.filter_flags & RXON_FILTER_ASSOC_MSK) ? 1 : 0;
 }
 
 static inline int
@@ -1540,12 +1463,6 @@ il_is_any_associated(struct il_priv *il)
 }
 
 static inline int
-il_is_associated_ctx(struct il_rxon_context *ctx)
-{
-       return (ctx->active.filter_flags & RXON_FILTER_ASSOC_MSK) ? 1 : 0;
-}
-
-static inline int
 il_is_channel_valid(const struct il_channel_info *ch_info)
 {
        if (ch_info == NULL)
@@ -1613,25 +1530,6 @@ il_free_pages(struct il_priv *il, unsigned long page)
 #define IL_RX_BUF_SIZE_4K (4 * 1024)
 #define IL_RX_BUF_SIZE_8K (8 * 1024)
 
-struct il_hcmd_ops {
-       int (*rxon_assoc) (struct il_priv *il, struct il_rxon_context *ctx);
-       int (*commit_rxon) (struct il_priv *il, struct il_rxon_context *ctx);
-       void (*set_rxon_chain) (struct il_priv *il,
-                               struct il_rxon_context *ctx);
-};
-
-struct il_hcmd_utils_ops {
-       u16(*get_hcmd_size) (u8 cmd_id, u16 len);
-       u16(*build_addsta_hcmd) (const struct il_addsta_cmd *cmd, u8 *data);
-       int (*request_scan) (struct il_priv *il, struct ieee80211_vif *vif);
-       void (*post_scan) (struct il_priv *il);
-};
-
-struct il_apm_ops {
-       int (*init) (struct il_priv *il);
-       void (*config) (struct il_priv *il);
-};
-
 #ifdef CONFIG_IWLEGACY_DEBUGFS
 struct il_debugfs_ops {
        ssize_t(*rx_stats_read) (struct file *file, char __user *user_buf,
@@ -1644,13 +1542,7 @@ struct il_debugfs_ops {
 };
 #endif
 
-struct il_temp_ops {
-       void (*temperature) (struct il_priv *il);
-};
-
-struct il_lib_ops {
-       /* set hw dependent parameters */
-       int (*set_hw_params) (struct il_priv *il);
+struct il_ops {
        /* Handling TX */
        void (*txq_update_byte_cnt_tbl) (struct il_priv *il,
                                         struct il_tx_queue *txq,
@@ -1660,8 +1552,6 @@ struct il_lib_ops {
                                      u16 len, u8 reset, u8 pad);
        void (*txq_free_tfd) (struct il_priv *il, struct il_tx_queue *txq);
        int (*txq_init) (struct il_priv *il, struct il_tx_queue *txq);
-       /* setup Rx handler */
-       void (*handler_setup) (struct il_priv *il);
        /* alive notification after init uCode load */
        void (*init_alive_start) (struct il_priv *il);
        /* check validity of rtc data address */
@@ -1674,45 +1564,33 @@ struct il_lib_ops {
        int (*set_channel_switch) (struct il_priv *il,
                                   struct ieee80211_channel_switch *ch_switch);
        /* power management */
-       struct il_apm_ops apm_ops;
+       int (*apm_init) (struct il_priv *il);
 
-       /* power */
+       /* tx power */
        int (*send_tx_power) (struct il_priv *il);
        void (*update_chain_flags) (struct il_priv *il);
 
        /* eeprom operations */
-       struct il_eeprom_ops eeprom_ops;
+       int (*eeprom_acquire_semaphore) (struct il_priv *il);
+       void (*eeprom_release_semaphore) (struct il_priv *il);
 
-       /* temperature */
-       struct il_temp_ops temp_ops;
-
-#ifdef CONFIG_IWLEGACY_DEBUGFS
-       struct il_debugfs_ops debugfs_ops;
-#endif
+       int (*rxon_assoc) (struct il_priv *il);
+       int (*commit_rxon) (struct il_priv *il);
+       void (*set_rxon_chain) (struct il_priv *il);
 
-};
-
-struct il_led_ops {
-       int (*cmd) (struct il_priv *il, struct il_led_cmd *led_cmd);
-};
+       u16(*get_hcmd_size) (u8 cmd_id, u16 len);
+       u16(*build_addsta_hcmd) (const struct il_addsta_cmd *cmd, u8 *data);
 
-struct il_legacy_ops {
+       int (*request_scan) (struct il_priv *il, struct ieee80211_vif *vif);
+       void (*post_scan) (struct il_priv *il);
        void (*post_associate) (struct il_priv *il);
        void (*config_ap) (struct il_priv *il);
        /* station management */
        int (*update_bcast_stations) (struct il_priv *il);
        int (*manage_ibss_station) (struct il_priv *il,
                                    struct ieee80211_vif *vif, bool add);
-};
 
-struct il_ops {
-       const struct il_lib_ops *lib;
-       const struct il_hcmd_ops *hcmd;
-       const struct il_hcmd_utils_ops *utils;
-       const struct il_led_ops *led;
-       const struct il_nic_ops *nic;
-       const struct il_legacy_ops *legacy;
-       const struct ieee80211_ops *ieee80211_ops;
+       int (*send_led_cmd) (struct il_priv *il, struct il_led_cmd *led_cmd);
 };
 
 struct il_mod_params {
@@ -1725,37 +1603,6 @@ struct il_mod_params {
        int restart_fw;         /* def: 1 = restart firmware */
 };
 
-/*
- * @led_compensation: compensate on the led on/off time per HW according
- *     to the deviation to achieve the desired led frequency.
- *     The detail algorithm is described in common.c
- * @chain_noise_num_beacons: number of beacons used to compute chain noise
- * @wd_timeout: TX queues watchdog timeout
- * @temperature_kelvin: temperature report by uCode in kelvin
- * @ucode_tracing: support ucode continuous tracing
- * @sensitivity_calib_by_driver: driver has the capability to perform
- *     sensitivity calibration operation
- * @chain_noise_calib_by_driver: driver has the capability to perform
- *     chain noise calibration operation
- */
-struct il_base_params {
-       int eeprom_size;
-       int num_of_queues;      /* def: HW dependent */
-       int num_of_ampdu_queues;        /* def: HW dependent */
-       /* for il_apm_init() */
-       u32 pll_cfg_val;
-       bool set_l0s;
-       bool use_bsm;
-
-       u16 led_compensation;
-       int chain_noise_num_beacons;
-       unsigned int wd_timeout;
-       bool temperature_kelvin;
-       const bool ucode_tracing;
-       const bool sensitivity_calib_by_driver;
-       const bool chain_noise_calib_by_driver;
-};
-
 #define IL_LED_SOLID 11
 #define IL_DEF_LED_INTRVL cpu_to_le32(1000)
 
@@ -1821,7 +1668,6 @@ struct il_cfg {
        unsigned int sku;
        u16 eeprom_ver;
        u16 eeprom_calib_ver;
-       const struct il_ops *ops;
        /* module based parameters which can be set from modprobe cmd */
        const struct il_mod_params *mod_params;
        /* params not likely to change within a device family */
@@ -1829,31 +1675,45 @@ struct il_cfg {
        /* params likely to change within a device family */
        u8 scan_rx_antennas[IEEE80211_NUM_BANDS];
        enum il_led_mode led_mode;
+
+       int eeprom_size;
+       int num_of_queues;              /* def: HW dependent */
+       int num_of_ampdu_queues;        /* def: HW dependent */
+       /* for il_apm_init() */
+       u32 pll_cfg_val;
+       bool set_l0s;
+       bool use_bsm;
+
+       u16 led_compensation;
+       int chain_noise_num_beacons;
+       unsigned int wd_timeout;
+       bool temperature_kelvin;
+       const bool ucode_tracing;
+       const bool sensitivity_calib_by_driver;
+       const bool chain_noise_calib_by_driver;
+
+       const u32 regulatory_bands[7];
 };
 
 /***************************
  *   L i b                 *
  ***************************/
 
-struct ieee80211_hw *il_alloc_all(struct il_cfg *cfg);
 int il_mac_conf_tx(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
                   u16 queue, const struct ieee80211_tx_queue_params *params);
 int il_mac_tx_last_beacon(struct ieee80211_hw *hw);
 
-void il_set_rxon_hwcrypto(struct il_priv *il, struct il_rxon_context *ctx,
-                         int hw_decrypt);
-int il_check_rxon_cmd(struct il_priv *il, struct il_rxon_context *ctx);
-int il_full_rxon_required(struct il_priv *il, struct il_rxon_context *ctx);
-int il_set_rxon_channel(struct il_priv *il, struct ieee80211_channel *ch,
-                       struct il_rxon_context *ctx);
-void il_set_flags_for_band(struct il_priv *il, struct il_rxon_context *ctx,
-                          enum ieee80211_band band, struct ieee80211_vif *vif);
+void il_set_rxon_hwcrypto(struct il_priv *il, int hw_decrypt);
+int il_check_rxon_cmd(struct il_priv *il);
+int il_full_rxon_required(struct il_priv *il);
+int il_set_rxon_channel(struct il_priv *il, struct ieee80211_channel *ch);
+void il_set_flags_for_band(struct il_priv *il, enum ieee80211_band band,
+                          struct ieee80211_vif *vif);
 u8 il_get_single_channel_number(struct il_priv *il, enum ieee80211_band band);
 void il_set_rxon_ht(struct il_priv *il, struct il_ht_config *ht_conf);
-bool il_is_ht40_tx_allowed(struct il_priv *il, struct il_rxon_context *ctx,
+bool il_is_ht40_tx_allowed(struct il_priv *il,
                           struct ieee80211_sta_ht_cap *ht_cap);
-void il_connection_init_rx_config(struct il_priv *il,
-                                 struct il_rxon_context *ctx);
+void il_connection_init_rx_config(struct il_priv *il);
 void il_set_rate(struct il_priv *il);
 int il_set_decrypted_flag(struct il_priv *il, struct ieee80211_hdr *hdr,
                          u32 decrypt_res, struct ieee80211_rx_status *stats);
@@ -1864,60 +1724,24 @@ void il_mac_remove_interface(struct ieee80211_hw *hw,
 int il_mac_change_interface(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
                            enum nl80211_iftype newtype, bool newp2p);
 int il_alloc_txq_mem(struct il_priv *il);
-void il_txq_mem(struct il_priv *il);
+void il_free_txq_mem(struct il_priv *il);
 
 #ifdef CONFIG_IWLEGACY_DEBUGFS
-int il_alloc_traffic_mem(struct il_priv *il);
-void il_free_traffic_mem(struct il_priv *il);
-void il_reset_traffic_log(struct il_priv *il);
-void il_dbg_log_tx_data_frame(struct il_priv *il, u16 length,
-                             struct ieee80211_hdr *header);
-void il_dbg_log_rx_data_frame(struct il_priv *il, u16 length,
-                             struct ieee80211_hdr *header);
-const char *il_get_mgmt_string(int cmd);
-const char *il_get_ctrl_string(int cmd);
-void il_clear_traffic_stats(struct il_priv *il);
-void il_update_stats(struct il_priv *il, bool is_tx, __le16 fc, u16 len);
+extern void il_update_stats(struct il_priv *il, bool is_tx, __le16 fc, u16 len);
 #else
-static inline int
-il_alloc_traffic_mem(struct il_priv *il)
-{
-       return 0;
-}
-
-static inline void
-il_free_traffic_mem(struct il_priv *il)
-{
-}
-
-static inline void
-il_reset_traffic_log(struct il_priv *il)
-{
-}
-
-static inline void
-il_dbg_log_tx_data_frame(struct il_priv *il, u16 length,
-                        struct ieee80211_hdr *header)
-{
-}
-
-static inline void
-il_dbg_log_rx_data_frame(struct il_priv *il, u16 length,
-                        struct ieee80211_hdr *header)
-{
-}
-
 static inline void
 il_update_stats(struct il_priv *il, bool is_tx, __le16 fc, u16 len)
 {
 }
 #endif
+
 /*****************************************************
- * RX handlers.
- * **************************************************/
+ * Handlers
+ ***************************************************/
 void il_hdl_pm_sleep(struct il_priv *il, struct il_rx_buf *rxb);
 void il_hdl_pm_debug_stats(struct il_priv *il, struct il_rx_buf *rxb);
 void il_hdl_error(struct il_priv *il, struct il_rx_buf *rxb);
+void il_hdl_csa(struct il_priv *il, struct il_rx_buf *rxb);
 
 /*****************************************************
 * RX
@@ -1928,25 +1752,20 @@ int il_rx_queue_alloc(struct il_priv *il);
 void il_rx_queue_update_write_ptr(struct il_priv *il, struct il_rx_queue *q);
 int il_rx_queue_space(const struct il_rx_queue *q);
 void il_tx_cmd_complete(struct il_priv *il, struct il_rx_buf *rxb);
-/* Handlers */
+
 void il_hdl_spectrum_measurement(struct il_priv *il, struct il_rx_buf *rxb);
 void il_recover_from_stats(struct il_priv *il, struct il_rx_pkt *pkt);
 void il_chswitch_done(struct il_priv *il, bool is_success);
-void il_hdl_csa(struct il_priv *il, struct il_rx_buf *rxb);
-
-/* TX helpers */
 
 /*****************************************************
 * TX
 ******************************************************/
-void il_txq_update_write_ptr(struct il_priv *il, struct il_tx_queue *txq);
-int il_tx_queue_init(struct il_priv *il, struct il_tx_queue *txq, int slots_num,
-                    u32 txq_id);
-void il_tx_queue_reset(struct il_priv *il, struct il_tx_queue *txq,
-                      int slots_num, u32 txq_id);
-void il_tx_queue_unmap(struct il_priv *il, int txq_id);
-void il_tx_queue_free(struct il_priv *il, int txq_id);
-void il_setup_watchdog(struct il_priv *il);
+extern void il_txq_update_write_ptr(struct il_priv *il, struct il_tx_queue *txq);
+extern int il_tx_queue_init(struct il_priv *il, u32 txq_id);
+extern void il_tx_queue_reset(struct il_priv *il, u32 txq_id);
+extern void il_tx_queue_unmap(struct il_priv *il, int txq_id);
+extern void il_tx_queue_free(struct il_priv *il, int txq_id);
+extern void il_setup_watchdog(struct il_priv *il);
 /*****************************************************
  * TX power
  ****************************************************/
@@ -1956,7 +1775,7 @@ int il_set_tx_power(struct il_priv *il, s8 tx_power, bool force);
  * Rate
  ******************************************************************************/
 
-u8 il_get_lowest_plcp(struct il_priv *il, struct il_rxon_context *ctx);
+u8 il_get_lowest_plcp(struct il_priv *il);
 
 /*******************************************************************************
  * Scanning
@@ -2043,10 +1862,10 @@ extern const struct dev_pm_ops il_pm_ops;
 ******************************************************/
 void il4965_dump_nic_error_log(struct il_priv *il);
 #ifdef CONFIG_IWLEGACY_DEBUG
-void il_print_rx_config_cmd(struct il_priv *il, struct il_rxon_context *ctx);
+void il_print_rx_config_cmd(struct il_priv *il);
 #else
 static inline void
-il_print_rx_config_cmd(struct il_priv *il, struct il_rxon_context *ctx)
+il_print_rx_config_cmd(struct il_priv *il)
 {
 }
 #endif
@@ -2064,7 +1883,7 @@ void il_free_geos(struct il_priv *il);
 #define S_HCMD_ACTIVE  0       /* host command in progress */
 /* 1 is unused (used to be S_HCMD_SYNC_ACTIVE) */
 #define S_INT_ENABLED  2
-#define S_RF_KILL_HW   3
+#define S_RFKILL       3
 #define S_CT_KILL              4
 #define S_INIT         5
 #define S_ALIVE                6
@@ -2103,15 +1922,9 @@ il_is_init(struct il_priv *il)
 }
 
 static inline int
-il_is_rfkill_hw(struct il_priv *il)
-{
-       return test_bit(S_RF_KILL_HW, &il->status);
-}
-
-static inline int
 il_is_rfkill(struct il_priv *il)
 {
-       return il_is_rfkill_hw(il);
+       return test_bit(S_RFKILL, &il->status);
 }
 
 static inline int
@@ -2132,20 +1945,23 @@ il_is_ready_rf(struct il_priv *il)
 
 extern void il_send_bt_config(struct il_priv *il);
 extern int il_send_stats_request(struct il_priv *il, u8 flags, bool clear);
-void il_apm_stop(struct il_priv *il);
+extern void il_apm_stop(struct il_priv *il);
+extern void _il_apm_stop(struct il_priv *il);
+
 int il_apm_init(struct il_priv *il);
 
-int il_send_rxon_timing(struct il_priv *il, struct il_rxon_context *ctx);
+int il_send_rxon_timing(struct il_priv *il);
+
 static inline int
-il_send_rxon_assoc(struct il_priv *il, struct il_rxon_context *ctx)
+il_send_rxon_assoc(struct il_priv *il)
 {
-       return il->cfg->ops->hcmd->rxon_assoc(il, ctx);
+       return il->ops->rxon_assoc(il);
 }
 
 static inline int
-il_commit_rxon(struct il_priv *il, struct il_rxon_context *ctx)
+il_commit_rxon(struct il_priv *il)
 {
-       return il->cfg->ops->hcmd->commit_rxon(il, ctx);
+       return il->ops->commit_rxon(il);
 }
 
 static inline const struct ieee80211_supported_band *
@@ -2166,7 +1982,7 @@ irqreturn_t il_isr(int irq, void *data);
 
 extern void il_set_bit(struct il_priv *p, u32 r, u32 m);
 extern void il_clear_bit(struct il_priv *p, u32 r, u32 m);
-extern int _il_grab_nic_access(struct il_priv *il);
+extern bool _il_grab_nic_access(struct il_priv *il);
 extern int _il_poll_bit(struct il_priv *il, u32 addr, u32 bits, u32 mask, int timeout);
 extern int il_poll_bit(struct il_priv *il, u32 addr, u32 mask, int timeout);
 extern u32 il_rd_prph(struct il_priv *il, u32 reg);
@@ -2177,20 +1993,20 @@ extern void il_write_targ_mem(struct il_priv *il, u32 addr, u32 val);
 static inline void
 _il_write8(struct il_priv *il, u32 ofs, u8 val)
 {
-       iowrite8(val, il->hw_base + ofs);
+       writeb(val, il->hw_base + ofs);
 }
 #define il_write8(il, ofs, val) _il_write8(il, ofs, val)
 
 static inline void
 _il_wr(struct il_priv *il, u32 ofs, u32 val)
 {
-       iowrite32(val, il->hw_base + ofs);
+       writel(val, il->hw_base + ofs);
 }
 
 static inline u32
 _il_rd(struct il_priv *il, u32 ofs)
 {
-       return ioread32(il->hw_base + ofs);
+       return readl(il->hw_base + ofs);
 }
 
 static inline void
@@ -2209,6 +2025,13 @@ static inline void
 _il_release_nic_access(struct il_priv *il)
 {
        _il_clear_bit(il, CSR_GP_CNTRL, CSR_GP_CNTRL_REG_FLAG_MAC_ACCESS_REQ);
+       /*
+        * In above we are reading CSR_GP_CNTRL register, what will flush any
+        * previous writes, but still want write, which clear MAC_ACCESS_REQ
+        * bit, be performed on PCI bus before any other writes scheduled on
+        * different CPUs (after we drop reg_lock).
+        */
+       mmiowb();
 }
 
 static inline u32
@@ -2231,7 +2054,7 @@ il_wr(struct il_priv *il, u32 reg, u32 value)
        unsigned long reg_flags;
 
        spin_lock_irqsave(&il->reg_lock, reg_flags);
-       if (!_il_grab_nic_access(il)) {
+       if (likely(_il_grab_nic_access(il))) {
                _il_wr(il, reg, value);
                _il_release_nic_access(il);
        }
@@ -2242,7 +2065,6 @@ static inline u32
 _il_rd_prph(struct il_priv *il, u32 reg)
 {
        _il_wr(il, HBUS_TARG_PRPH_RADDR, reg | (3 << 24));
-       rmb();
        return _il_rd(il, HBUS_TARG_PRPH_RDAT);
 }
 
@@ -2250,7 +2072,6 @@ static inline void
 _il_wr_prph(struct il_priv *il, u32 addr, u32 val)
 {
        _il_wr(il, HBUS_TARG_PRPH_WADDR, ((addr & 0x0000FFFF) | (3 << 24)));
-       wmb();
        _il_wr(il, HBUS_TARG_PRPH_WDAT, val);
 }
 
@@ -2260,9 +2081,10 @@ il_set_bits_prph(struct il_priv *il, u32 reg, u32 mask)
        unsigned long reg_flags;
 
        spin_lock_irqsave(&il->reg_lock, reg_flags);
-       _il_grab_nic_access(il);
-       _il_wr_prph(il, reg, (_il_rd_prph(il, reg) | mask));
-       _il_release_nic_access(il);
+       if (likely(_il_grab_nic_access(il))) {
+               _il_wr_prph(il, reg, (_il_rd_prph(il, reg) | mask));
+               _il_release_nic_access(il);
+       }
        spin_unlock_irqrestore(&il->reg_lock, reg_flags);
 }
 
@@ -2272,9 +2094,10 @@ il_set_bits_mask_prph(struct il_priv *il, u32 reg, u32 bits, u32 mask)
        unsigned long reg_flags;
 
        spin_lock_irqsave(&il->reg_lock, reg_flags);
-       _il_grab_nic_access(il);
-       _il_wr_prph(il, reg, ((_il_rd_prph(il, reg) & mask) | bits));
-       _il_release_nic_access(il);
+       if (likely(_il_grab_nic_access(il))) {
+               _il_wr_prph(il, reg, ((_il_rd_prph(il, reg) & mask) | bits));
+               _il_release_nic_access(il);
+       }
        spin_unlock_irqrestore(&il->reg_lock, reg_flags);
 }
 
@@ -2285,10 +2108,11 @@ il_clear_bits_prph(struct il_priv *il, u32 reg, u32 mask)
        u32 val;
 
        spin_lock_irqsave(&il->reg_lock, reg_flags);
-       _il_grab_nic_access(il);
-       val = _il_rd_prph(il, reg);
-       _il_wr_prph(il, reg, (val & ~mask));
-       _il_release_nic_access(il);
+       if (likely(_il_grab_nic_access(il))) {
+               val = _il_rd_prph(il, reg);
+               _il_wr_prph(il, reg, (val & ~mask));
+               _il_release_nic_access(il);
+       }
        spin_unlock_irqrestore(&il->reg_lock, reg_flags);
 }
 
@@ -2303,23 +2127,22 @@ il_clear_bits_prph(struct il_priv *il, u32 reg, u32 mask)
                                   (this is for the IBSS BSSID stations) */
 #define IL_STA_BCAST BIT(4)    /* this station is the special bcast station */
 
-void il_restore_stations(struct il_priv *il, struct il_rxon_context *ctx);
-void il_clear_ucode_stations(struct il_priv *il, struct il_rxon_context *ctx);
+void il_restore_stations(struct il_priv *il);
+void il_clear_ucode_stations(struct il_priv *il);
 void il_dealloc_bcast_stations(struct il_priv *il);
 int il_get_free_ucode_key_idx(struct il_priv *il);
 int il_send_add_sta(struct il_priv *il, struct il_addsta_cmd *sta, u8 flags);
-int il_add_station_common(struct il_priv *il, struct il_rxon_context *ctx,
-                         const u8 *addr, bool is_ap,
+int il_add_station_common(struct il_priv *il, const u8 *addr, bool is_ap,
                          struct ieee80211_sta *sta, u8 *sta_id_r);
 int il_remove_station(struct il_priv *il, const u8 sta_id, const u8 * addr);
 int il_mac_sta_remove(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
                      struct ieee80211_sta *sta);
 
-u8 il_prep_station(struct il_priv *il, struct il_rxon_context *ctx,
-                  const u8 *addr, bool is_ap, struct ieee80211_sta *sta);
+u8 il_prep_station(struct il_priv *il, const u8 *addr, bool is_ap,
+                  struct ieee80211_sta *sta);
 
-int il_send_lq_cmd(struct il_priv *il, struct il_rxon_context *ctx,
-                  struct il_link_quality_cmd *lq, u8 flags, bool init);
+int il_send_lq_cmd(struct il_priv *il, struct il_link_quality_cmd *lq,
+                  u8 flags, bool init);
 
 /**
  * il_clear_driver_stations - clear knowledge of all stations from driver
@@ -2334,24 +2157,11 @@ static inline void
 il_clear_driver_stations(struct il_priv *il)
 {
        unsigned long flags;
-       struct il_rxon_context *ctx = &il->ctx;
 
        spin_lock_irqsave(&il->sta_lock, flags);
        memset(il->stations, 0, sizeof(il->stations));
        il->num_stations = 0;
-
        il->ucode_key_table = 0;
-
-       /*
-        * Remove all key information that is not stored as part
-        * of station information since mac80211 may not have had
-        * a chance to remove all the keys. When device is
-        * reconfigured by mac80211 after an error all keys will
-        * be reconfigured.
-        */
-       memset(ctx->wep_keys, 0, sizeof(ctx->wep_keys));
-       ctx->key_mapping_keys = 0;
-
        spin_unlock_irqrestore(&il->sta_lock, flags);
 }
 
@@ -2376,13 +2186,12 @@ il_sta_id(struct ieee80211_sta *sta)
  * inline wraps that pattern.
  */
 static inline int
-il_sta_id_or_broadcast(struct il_priv *il, struct il_rxon_context *context,
-                      struct ieee80211_sta *sta)
+il_sta_id_or_broadcast(struct il_priv *il, struct ieee80211_sta *sta)
 {
        int sta_id;
 
        if (!sta)
-               return context->bcast_sta_id;
+               return il->hw_params.bcast_id;
 
        sta_id = il_sta_id(sta);
 
@@ -2565,10 +2374,10 @@ struct il_rb_status {
        __le32 __unused;        /* 3945 only */
 } __packed;
 
-#define TFD_QUEUE_SIZE_MAX      (256)
-#define TFD_QUEUE_SIZE_BC_DUP  (64)
+#define TFD_QUEUE_SIZE_MAX      256
+#define TFD_QUEUE_SIZE_BC_DUP  64
 #define TFD_QUEUE_BC_SIZE      (TFD_QUEUE_SIZE_MAX + TFD_QUEUE_SIZE_BC_DUP)
-#define IL_TX_DMA_MASK        DMA_BIT_MASK(36)
+#define IL_TX_DMA_MASK         DMA_BIT_MASK(36)
 #define IL_NUM_OF_TBS          20
 
 static inline u8
index b1b8926..2298491 100644 (file)
 
 #include "common.h"
 
+void
+il_clear_traffic_stats(struct il_priv *il)
+{
+       memset(&il->tx_stats, 0, sizeof(struct traffic_stats));
+       memset(&il->rx_stats, 0, sizeof(struct traffic_stats));
+}
+
+/*
+ * il_update_stats function record all the MGMT, CTRL and DATA pkt for
+ * both TX and Rx . Use debugfs to display the rx/rx_stats
+ */
+void
+il_update_stats(struct il_priv *il, bool is_tx, __le16 fc, u16 len)
+{
+       struct traffic_stats *stats;
+
+       if (is_tx)
+               stats = &il->tx_stats;
+       else
+               stats = &il->rx_stats;
+
+       if (ieee80211_is_mgmt(fc)) {
+               switch (fc & cpu_to_le16(IEEE80211_FCTL_STYPE)) {
+               case cpu_to_le16(IEEE80211_STYPE_ASSOC_REQ):
+                       stats->mgmt[MANAGEMENT_ASSOC_REQ]++;
+                       break;
+               case cpu_to_le16(IEEE80211_STYPE_ASSOC_RESP):
+                       stats->mgmt[MANAGEMENT_ASSOC_RESP]++;
+                       break;
+               case cpu_to_le16(IEEE80211_STYPE_REASSOC_REQ):
+                       stats->mgmt[MANAGEMENT_REASSOC_REQ]++;
+                       break;
+               case cpu_to_le16(IEEE80211_STYPE_REASSOC_RESP):
+                       stats->mgmt[MANAGEMENT_REASSOC_RESP]++;
+                       break;
+               case cpu_to_le16(IEEE80211_STYPE_PROBE_REQ):
+                       stats->mgmt[MANAGEMENT_PROBE_REQ]++;
+                       break;
+               case cpu_to_le16(IEEE80211_STYPE_PROBE_RESP):
+                       stats->mgmt[MANAGEMENT_PROBE_RESP]++;
+                       break;
+               case cpu_to_le16(IEEE80211_STYPE_BEACON):
+                       stats->mgmt[MANAGEMENT_BEACON]++;
+                       break;
+               case cpu_to_le16(IEEE80211_STYPE_ATIM):
+                       stats->mgmt[MANAGEMENT_ATIM]++;
+                       break;
+               case cpu_to_le16(IEEE80211_STYPE_DISASSOC):
+                       stats->mgmt[MANAGEMENT_DISASSOC]++;
+                       break;
+               case cpu_to_le16(IEEE80211_STYPE_AUTH):
+                       stats->mgmt[MANAGEMENT_AUTH]++;
+                       break;
+               case cpu_to_le16(IEEE80211_STYPE_DEAUTH):
+                       stats->mgmt[MANAGEMENT_DEAUTH]++;
+                       break;
+               case cpu_to_le16(IEEE80211_STYPE_ACTION):
+                       stats->mgmt[MANAGEMENT_ACTION]++;
+                       break;
+               }
+       } else if (ieee80211_is_ctl(fc)) {
+               switch (fc & cpu_to_le16(IEEE80211_FCTL_STYPE)) {
+               case cpu_to_le16(IEEE80211_STYPE_BACK_REQ):
+                       stats->ctrl[CONTROL_BACK_REQ]++;
+                       break;
+               case cpu_to_le16(IEEE80211_STYPE_BACK):
+                       stats->ctrl[CONTROL_BACK]++;
+                       break;
+               case cpu_to_le16(IEEE80211_STYPE_PSPOLL):
+                       stats->ctrl[CONTROL_PSPOLL]++;
+                       break;
+               case cpu_to_le16(IEEE80211_STYPE_RTS):
+                       stats->ctrl[CONTROL_RTS]++;
+                       break;
+               case cpu_to_le16(IEEE80211_STYPE_CTS):
+                       stats->ctrl[CONTROL_CTS]++;
+                       break;
+               case cpu_to_le16(IEEE80211_STYPE_ACK):
+                       stats->ctrl[CONTROL_ACK]++;
+                       break;
+               case cpu_to_le16(IEEE80211_STYPE_CFEND):
+                       stats->ctrl[CONTROL_CFEND]++;
+                       break;
+               case cpu_to_le16(IEEE80211_STYPE_CFENDACK):
+                       stats->ctrl[CONTROL_CFENDACK]++;
+                       break;
+               }
+       } else {
+               /* data */
+               stats->data_cnt++;
+               stats->data_bytes += len;
+       }
+}
+EXPORT_SYMBOL(il_update_stats);
+
 /* create and remove of files */
 #define DEBUGFS_ADD_FILE(name, parent, mode) do {                      \
        if (!debugfs_create_file(#name, mode, parent, il,               \
@@ -98,6 +193,46 @@ static const struct file_operations il_dbgfs_##name##_ops = {       \
        .llseek = generic_file_llseek,                          \
 };
 
+static const char *
+il_get_mgmt_string(int cmd)
+{
+       switch (cmd) {
+       IL_CMD(MANAGEMENT_ASSOC_REQ);
+       IL_CMD(MANAGEMENT_ASSOC_RESP);
+       IL_CMD(MANAGEMENT_REASSOC_REQ);
+       IL_CMD(MANAGEMENT_REASSOC_RESP);
+       IL_CMD(MANAGEMENT_PROBE_REQ);
+       IL_CMD(MANAGEMENT_PROBE_RESP);
+       IL_CMD(MANAGEMENT_BEACON);
+       IL_CMD(MANAGEMENT_ATIM);
+       IL_CMD(MANAGEMENT_DISASSOC);
+       IL_CMD(MANAGEMENT_AUTH);
+       IL_CMD(MANAGEMENT_DEAUTH);
+       IL_CMD(MANAGEMENT_ACTION);
+       default:
+               return "UNKNOWN";
+
+       }
+}
+
+static const char *
+il_get_ctrl_string(int cmd)
+{
+       switch (cmd) {
+       IL_CMD(CONTROL_BACK_REQ);
+       IL_CMD(CONTROL_BACK);
+       IL_CMD(CONTROL_PSPOLL);
+       IL_CMD(CONTROL_RTS);
+       IL_CMD(CONTROL_CTS);
+       IL_CMD(CONTROL_ACK);
+       IL_CMD(CONTROL_CFEND);
+       IL_CMD(CONTROL_CFENDACK);
+       default:
+               return "UNKNOWN";
+
+       }
+}
+
 static ssize_t
 il_dbgfs_tx_stats_read(struct file *file, char __user *user_buf, size_t count,
                       loff_t *ppos)
@@ -361,7 +496,7 @@ il_dbgfs_nvm_read(struct file *file, char __user *user_buf, size_t count,
        const u8 *ptr;
        char *buf;
        u16 eeprom_ver;
-       size_t eeprom_len = il->cfg->base_params->eeprom_size;
+       size_t eeprom_len = il->cfg->eeprom_size;
        buf_size = 4 * eeprom_len + 256;
 
        if (eeprom_len % 16) {
@@ -495,8 +630,8 @@ il_dbgfs_status_read(struct file *file, char __user *user_buf, size_t count,
            scnprintf(buf + pos, bufsz - pos, "S_INT_ENABLED:\t %d\n",
                      test_bit(S_INT_ENABLED, &il->status));
        pos +=
-           scnprintf(buf + pos, bufsz - pos, "S_RF_KILL_HW:\t %d\n",
-                     test_bit(S_RF_KILL_HW, &il->status));
+           scnprintf(buf + pos, bufsz - pos, "S_RFKILL:\t %d\n",
+                     test_bit(S_RFKILL, &il->status));
        pos +=
            scnprintf(buf + pos, bufsz - pos, "S_CT_KILL:\t\t %d\n",
                      test_bit(S_CT_KILL, &il->status));
@@ -644,12 +779,10 @@ il_dbgfs_qos_read(struct file *file, char __user *user_buf, size_t count,
                  loff_t *ppos)
 {
        struct il_priv *il = file->private_data;
-       struct il_rxon_context *ctx = &il->ctx;
        int pos = 0, i;
        char buf[256];
        const size_t bufsz = sizeof(buf);
 
-       pos += scnprintf(buf + pos, bufsz - pos, "context %d:\n", ctx->ctxid);
        for (i = 0; i < AC_NUM; i++) {
                pos +=
                    scnprintf(buf + pos, bufsz - pos,
@@ -657,10 +790,10 @@ il_dbgfs_qos_read(struct file *file, char __user *user_buf, size_t count,
                pos +=
                    scnprintf(buf + pos, bufsz - pos,
                              "AC[%d]\t%u\t%u\t%u\t%u\n", i,
-                             ctx->qos_data.def_qos_parm.ac[i].cw_min,
-                             ctx->qos_data.def_qos_parm.ac[i].cw_max,
-                             ctx->qos_data.def_qos_parm.ac[i].aifsn,
-                             ctx->qos_data.def_qos_parm.ac[i].edca_txop);
+                             il->qos_data.def_qos_parm.ac[i].cw_min,
+                             il->qos_data.def_qos_parm.ac[i].cw_max,
+                             il->qos_data.def_qos_parm.ac[i].aifsn,
+                             il->qos_data.def_qos_parm.ac[i].edca_txop);
        }
 
        return simple_read_from_buffer(user_buf, count, ppos, buf, pos);
@@ -717,112 +850,6 @@ DEBUGFS_READ_FILE_OPS(qos);
 DEBUGFS_READ_WRITE_FILE_OPS(disable_ht40);
 
 static ssize_t
-il_dbgfs_traffic_log_read(struct file *file, char __user *user_buf,
-                         size_t count, loff_t *ppos)
-{
-       struct il_priv *il = file->private_data;
-       int pos = 0, ofs = 0;
-       int cnt = 0, entry;
-       struct il_tx_queue *txq;
-       struct il_queue *q;
-       struct il_rx_queue *rxq = &il->rxq;
-       char *buf;
-       int bufsz =
-           ((IL_TRAFFIC_ENTRIES * IL_TRAFFIC_ENTRY_SIZE * 64) * 2) +
-           (il->cfg->base_params->num_of_queues * 32 * 8) + 400;
-       const u8 *ptr;
-       ssize_t ret;
-
-       if (!il->txq) {
-               IL_ERR("txq not ready\n");
-               return -EAGAIN;
-       }
-       buf = kzalloc(bufsz, GFP_KERNEL);
-       if (!buf) {
-               IL_ERR("Can not allocate buffer\n");
-               return -ENOMEM;
-       }
-       pos += scnprintf(buf + pos, bufsz - pos, "Tx Queue\n");
-       for (cnt = 0; cnt < il->hw_params.max_txq_num; cnt++) {
-               txq = &il->txq[cnt];
-               q = &txq->q;
-               pos +=
-                   scnprintf(buf + pos, bufsz - pos,
-                             "q[%d]: read_ptr: %u, write_ptr: %u\n", cnt,
-                             q->read_ptr, q->write_ptr);
-       }
-       if (il->tx_traffic && (il_debug_level & IL_DL_TX)) {
-               ptr = il->tx_traffic;
-               pos +=
-                   scnprintf(buf + pos, bufsz - pos, "Tx Traffic idx: %u\n",
-                             il->tx_traffic_idx);
-               for (cnt = 0, ofs = 0; cnt < IL_TRAFFIC_ENTRIES; cnt++) {
-                       for (entry = 0; entry < IL_TRAFFIC_ENTRY_SIZE / 16;
-                            entry++, ofs += 16) {
-                               pos +=
-                                   scnprintf(buf + pos, bufsz - pos, "0x%.4x ",
-                                             ofs);
-                               hex_dump_to_buffer(ptr + ofs, 16, 16, 2,
-                                                  buf + pos, bufsz - pos, 0);
-                               pos += strlen(buf + pos);
-                               if (bufsz - pos > 0)
-                                       buf[pos++] = '\n';
-                       }
-               }
-       }
-
-       pos += scnprintf(buf + pos, bufsz - pos, "Rx Queue\n");
-       pos +=
-           scnprintf(buf + pos, bufsz - pos, "read: %u, write: %u\n",
-                     rxq->read, rxq->write);
-
-       if (il->rx_traffic && (il_debug_level & IL_DL_RX)) {
-               ptr = il->rx_traffic;
-               pos +=
-                   scnprintf(buf + pos, bufsz - pos, "Rx Traffic idx: %u\n",
-                             il->rx_traffic_idx);
-               for (cnt = 0, ofs = 0; cnt < IL_TRAFFIC_ENTRIES; cnt++) {
-                       for (entry = 0; entry < IL_TRAFFIC_ENTRY_SIZE / 16;
-                            entry++, ofs += 16) {
-                               pos +=
-                                   scnprintf(buf + pos, bufsz - pos, "0x%.4x ",
-                                             ofs);
-                               hex_dump_to_buffer(ptr + ofs, 16, 16, 2,
-                                                  buf + pos, bufsz - pos, 0);
-                               pos += strlen(buf + pos);
-                               if (bufsz - pos > 0)
-                                       buf[pos++] = '\n';
-                       }
-               }
-       }
-
-       ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos);
-       kfree(buf);
-       return ret;
-}
-
-static ssize_t
-il_dbgfs_traffic_log_write(struct file *file, const char __user *user_buf,
-                          size_t count, loff_t *ppos)
-{
-       struct il_priv *il = file->private_data;
-       char buf[8];
-       int buf_size;
-       int traffic_log;
-
-       memset(buf, 0, sizeof(buf));
-       buf_size = min(count, sizeof(buf) - 1);
-       if (copy_from_user(buf, user_buf, buf_size))
-               return -EFAULT;
-       if (sscanf(buf, "%d", &traffic_log) != 1)
-               return -EFAULT;
-       if (traffic_log == 0)
-               il_reset_traffic_log(il);
-
-       return count;
-}
-
-static ssize_t
 il_dbgfs_tx_queue_read(struct file *file, char __user *user_buf, size_t count,
                       loff_t *ppos)
 {
@@ -835,7 +862,7 @@ il_dbgfs_tx_queue_read(struct file *file, char __user *user_buf, size_t count,
        int cnt;
        int ret;
        const size_t bufsz =
-           sizeof(char) * 64 * il->cfg->base_params->num_of_queues;
+           sizeof(char) * 64 * il->cfg->num_of_queues;
 
        if (!il->txq) {
                IL_ERR("txq not ready\n");
@@ -903,8 +930,8 @@ il_dbgfs_ucode_rx_stats_read(struct file *file, char __user *user_buf,
                             size_t count, loff_t *ppos)
 {
        struct il_priv *il = file->private_data;
-       return il->cfg->ops->lib->debugfs_ops.rx_stats_read(file, user_buf,
-                                                           count, ppos);
+
+       return il->debugfs_ops->rx_stats_read(file, user_buf, count, ppos);
 }
 
 static ssize_t
@@ -912,8 +939,8 @@ il_dbgfs_ucode_tx_stats_read(struct file *file, char __user *user_buf,
                             size_t count, loff_t *ppos)
 {
        struct il_priv *il = file->private_data;
-       return il->cfg->ops->lib->debugfs_ops.tx_stats_read(file, user_buf,
-                                                           count, ppos);
+
+       return il->debugfs_ops->tx_stats_read(file, user_buf, count, ppos);
 }
 
 static ssize_t
@@ -921,8 +948,8 @@ il_dbgfs_ucode_general_stats_read(struct file *file, char __user *user_buf,
                                  size_t count, loff_t *ppos)
 {
        struct il_priv *il = file->private_data;
-       return il->cfg->ops->lib->debugfs_ops.general_stats_read(file, user_buf,
-                                                                count, ppos);
+
+       return il->debugfs_ops->general_stats_read(file, user_buf, count, ppos);
 }
 
 static ssize_t
@@ -1153,7 +1180,7 @@ il_dbgfs_rxon_flags_read(struct file *file, char __user *user_buf,
        int len = 0;
        char buf[20];
 
-       len = sprintf(buf, "0x%04X\n", le32_to_cpu(il->ctx.active.flags));
+       len = sprintf(buf, "0x%04X\n", le32_to_cpu(il->active.flags));
        return simple_read_from_buffer(user_buf, count, ppos, buf, len);
 }
 
@@ -1167,7 +1194,7 @@ il_dbgfs_rxon_filter_flags_read(struct file *file, char __user *user_buf,
        char buf[20];
 
        len =
-           sprintf(buf, "0x%04X\n", le32_to_cpu(il->ctx.active.filter_flags));
+           sprintf(buf, "0x%04X\n", le32_to_cpu(il->active.filter_flags));
        return simple_read_from_buffer(user_buf, count, ppos, buf, len);
 }
 
@@ -1180,8 +1207,8 @@ il_dbgfs_fh_reg_read(struct file *file, char __user *user_buf, size_t count,
        int pos = 0;
        ssize_t ret = -EFAULT;
 
-       if (il->cfg->ops->lib->dump_fh) {
-               ret = pos = il->cfg->ops->lib->dump_fh(il, &buf, true);
+       if (il->ops->dump_fh) {
+               ret = pos = il->ops->dump_fh(il, &buf, true);
                if (buf) {
                        ret =
                            simple_read_from_buffer(user_buf, count, ppos, buf,
@@ -1298,14 +1325,13 @@ il_dbgfs_wd_timeout_write(struct file *file, const char __user *user_buf,
        if (timeout < 0 || timeout > IL_MAX_WD_TIMEOUT)
                timeout = IL_DEF_WD_TIMEOUT;
 
-       il->cfg->base_params->wd_timeout = timeout;
+       il->cfg->wd_timeout = timeout;
        il_setup_watchdog(il);
        return count;
 }
 
 DEBUGFS_READ_FILE_OPS(rx_stats);
 DEBUGFS_READ_FILE_OPS(tx_stats);
-DEBUGFS_READ_WRITE_FILE_OPS(traffic_log);
 DEBUGFS_READ_FILE_OPS(rx_queue);
 DEBUGFS_READ_FILE_OPS(tx_queue);
 DEBUGFS_READ_FILE_OPS(ucode_rx_stats);
@@ -1359,7 +1385,6 @@ il_dbgfs_register(struct il_priv *il, const char *name)
        DEBUGFS_ADD_FILE(disable_ht40, dir_data, S_IWUSR | S_IRUSR);
        DEBUGFS_ADD_FILE(rx_stats, dir_debug, S_IRUSR);
        DEBUGFS_ADD_FILE(tx_stats, dir_debug, S_IRUSR);
-       DEBUGFS_ADD_FILE(traffic_log, dir_debug, S_IWUSR | S_IRUSR);
        DEBUGFS_ADD_FILE(rx_queue, dir_debug, S_IRUSR);
        DEBUGFS_ADD_FILE(tx_queue, dir_debug, S_IRUSR);
        DEBUGFS_ADD_FILE(power_save_status, dir_debug, S_IRUSR);
@@ -1372,17 +1397,17 @@ il_dbgfs_register(struct il_priv *il, const char *name)
        DEBUGFS_ADD_FILE(ucode_tx_stats, dir_debug, S_IRUSR);
        DEBUGFS_ADD_FILE(ucode_general_stats, dir_debug, S_IRUSR);
 
-       if (il->cfg->base_params->sensitivity_calib_by_driver)
+       if (il->cfg->sensitivity_calib_by_driver)
                DEBUGFS_ADD_FILE(sensitivity, dir_debug, S_IRUSR);
-       if (il->cfg->base_params->chain_noise_calib_by_driver)
+       if (il->cfg->chain_noise_calib_by_driver)
                DEBUGFS_ADD_FILE(chain_noise, dir_debug, S_IRUSR);
        DEBUGFS_ADD_FILE(rxon_flags, dir_debug, S_IWUSR);
        DEBUGFS_ADD_FILE(rxon_filter_flags, dir_debug, S_IWUSR);
        DEBUGFS_ADD_FILE(wd_timeout, dir_debug, S_IWUSR);
-       if (il->cfg->base_params->sensitivity_calib_by_driver)
+       if (il->cfg->sensitivity_calib_by_driver)
                DEBUGFS_ADD_BOOL(disable_sensitivity, dir_rf,
                                 &il->disable_sens_cal);
-       if (il->cfg->base_params->chain_noise_calib_by_driver)
+       if (il->cfg->chain_noise_calib_by_driver)
                DEBUGFS_ADD_BOOL(disable_chain_noise, dir_rf,
                                 &il->disable_chain_noise_cal);
        DEBUGFS_ADD_BOOL(disable_tx_power, dir_rf, &il->disable_tx_power_cal);
index 9dc84a7..afa0bb8 100644 (file)
@@ -1,7 +1,7 @@
 # WIFI
 obj-$(CONFIG_IWLWIFI)  += iwlwifi.o
 iwlwifi-objs           := iwl-agn.o iwl-agn-rs.o iwl-mac80211.o
-iwlwifi-objs           += iwl-ucode.o iwl-agn-tx.o
+iwlwifi-objs           += iwl-ucode.o iwl-agn-tx.o iwl-debug.o
 iwlwifi-objs           += iwl-agn-lib.o iwl-agn-calib.o iwl-io.o
 iwlwifi-objs           += iwl-agn-tt.o iwl-agn-sta.o iwl-agn-rx.o
 
@@ -13,6 +13,7 @@ iwlwifi-objs          += iwl-6000.o
 iwlwifi-objs           += iwl-1000.o
 iwlwifi-objs           += iwl-2000.o
 iwlwifi-objs           += iwl-pci.o
+iwlwifi-objs           += iwl-drv.o
 iwlwifi-objs           += iwl-trans.o
 iwlwifi-objs           += iwl-trans-pcie.o iwl-trans-pcie-rx.o iwl-trans-pcie-tx.o
 
index 1ef7bfc..605ee3d 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2008 - 2011 Intel Corporation. All rights reserved.
+ * Copyright(c) 2008 - 2012 Intel Corporation. All rights reserved.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
@@ -84,13 +84,13 @@ static void iwl1000_set_ct_threshold(struct iwl_priv *priv)
 static void iwl1000_nic_config(struct iwl_priv *priv)
 {
        /* set CSR_HW_CONFIG_REG for uCode use */
-       iwl_set_bit(bus(priv), CSR_HW_IF_CONFIG_REG,
+       iwl_set_bit(trans(priv), CSR_HW_IF_CONFIG_REG,
                    CSR_HW_IF_CONFIG_REG_BIT_RADIO_SI |
                    CSR_HW_IF_CONFIG_REG_BIT_MAC_SI);
 
        /* Setting digital SVR for 1000 card to 1.32V */
        /* locking is acquired in iwl_set_bits_mask_prph() function */
-       iwl_set_bits_mask_prph(bus(priv), APMG_DIGITAL_SVR_REG,
+       iwl_set_bits_mask_prph(trans(priv), APMG_DIGITAL_SVR_REG,
                                APMG_SVR_DIGITAL_VOLTAGE_1_32,
                                ~APMG_SVR_VOLTAGE_CONFIG_BIT_MSK);
 }
@@ -120,7 +120,7 @@ static struct iwl_sensitivity_ranges iwl1000_sensitivity = {
        .nrg_th_cca = 62,
 };
 
-static int iwl1000_hw_set_hw_params(struct iwl_priv *priv)
+static void iwl1000_hw_set_hw_params(struct iwl_priv *priv)
 {
        if (iwlagn_mod_params.num_of_queues >= IWL_MIN_NUM_QUEUES &&
            iwlagn_mod_params.num_of_queues <= IWLAGN_NUM_QUEUES)
@@ -128,10 +128,6 @@ static int iwl1000_hw_set_hw_params(struct iwl_priv *priv)
                        iwlagn_mod_params.num_of_queues;
 
        hw_params(priv).max_txq_num = cfg(priv)->base_params->num_of_queues;
-       priv->contexts[IWL_RXON_CTX_BSS].bcast_sta_id = IWLAGN_BROADCAST_ID;
-
-       hw_params(priv).max_data_size = IWLAGN_RTC_DATA_SIZE;
-       hw_params(priv).max_inst_size = IWLAGN_RTC_INST_SIZE;
 
        hw_params(priv).ht40_channel =  BIT(IEEE80211_BAND_2GHZ);
 
@@ -148,8 +144,6 @@ static int iwl1000_hw_set_hw_params(struct iwl_priv *priv)
 
        /* Set initial sensitivity parameters */
        hw_params(priv).sens = &iwl1000_sensitivity;
-
-       return 0;
 }
 
 static struct iwl_lib_ops iwl1000_lib = {
@@ -195,6 +189,8 @@ static struct iwl_ht_params iwl1000_ht_params = {
        .ucode_api_max = IWL1000_UCODE_API_MAX,                 \
        .ucode_api_ok = IWL1000_UCODE_API_OK,                   \
        .ucode_api_min = IWL1000_UCODE_API_MIN,                 \
+       .max_inst_size = IWLAGN_RTC_INST_SIZE,                  \
+       .max_data_size = IWLAGN_RTC_DATA_SIZE,                  \
        .eeprom_ver = EEPROM_1000_EEPROM_VERSION,               \
        .eeprom_calib_ver = EEPROM_1000_TX_POWER_VERSION,       \
        .lib = &iwl1000_lib,                                    \
@@ -217,6 +213,8 @@ struct iwl_cfg iwl1000_bg_cfg = {
        .ucode_api_max = IWL100_UCODE_API_MAX,                  \
        .ucode_api_ok = IWL100_UCODE_API_OK,                    \
        .ucode_api_min = IWL100_UCODE_API_MIN,                  \
+       .max_inst_size = IWLAGN_RTC_INST_SIZE,                  \
+       .max_data_size = IWLAGN_RTC_DATA_SIZE,                  \
        .eeprom_ver = EEPROM_1000_EEPROM_VERSION,               \
        .eeprom_calib_ver = EEPROM_1000_TX_POWER_VERSION,       \
        .lib = &iwl1000_lib,                                    \
index 0946933..e6e8c79 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2008 - 2011 Intel Corporation. All rights reserved.
+ * Copyright(c) 2008 - 2012 Intel Corporation. All rights reserved.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
@@ -87,7 +87,7 @@ static void iwl2000_nic_config(struct iwl_priv *priv)
        iwl_rf_config(priv);
 
        if (cfg(priv)->iq_invert)
-               iwl_set_bit(bus(priv), CSR_GP_DRIVER_REG,
+               iwl_set_bit(trans(priv), CSR_GP_DRIVER_REG,
                            CSR_GP_DRIVER_REG_BIT_RADIO_IQ_INVER);
 }
 
@@ -116,7 +116,7 @@ static struct iwl_sensitivity_ranges iwl2000_sensitivity = {
        .nrg_th_cca = 62,
 };
 
-static int iwl2000_hw_set_hw_params(struct iwl_priv *priv)
+static void iwl2000_hw_set_hw_params(struct iwl_priv *priv)
 {
        if (iwlagn_mod_params.num_of_queues >= IWL_MIN_NUM_QUEUES &&
            iwlagn_mod_params.num_of_queues <= IWLAGN_NUM_QUEUES)
@@ -124,10 +124,6 @@ static int iwl2000_hw_set_hw_params(struct iwl_priv *priv)
                        iwlagn_mod_params.num_of_queues;
 
        hw_params(priv).max_txq_num = cfg(priv)->base_params->num_of_queues;
-       priv->contexts[IWL_RXON_CTX_BSS].bcast_sta_id = IWLAGN_BROADCAST_ID;
-
-       hw_params(priv).max_data_size = IWL60_RTC_DATA_SIZE;
-       hw_params(priv).max_inst_size = IWL60_RTC_INST_SIZE;
 
        hw_params(priv).ht40_channel =  BIT(IEEE80211_BAND_2GHZ);
 
@@ -144,8 +140,6 @@ static int iwl2000_hw_set_hw_params(struct iwl_priv *priv)
 
        /* Set initial sensitivity parameters */
        hw_params(priv).sens = &iwl2000_sensitivity;
-
-       return 0;
 }
 
 static struct iwl_lib_ops iwl2000_lib = {
@@ -244,6 +238,8 @@ static struct iwl_bt_params iwl2030_bt_params = {
        .ucode_api_max = IWL2000_UCODE_API_MAX,                 \
        .ucode_api_ok = IWL2000_UCODE_API_OK,                   \
        .ucode_api_min = IWL2000_UCODE_API_MIN,                 \
+       .max_inst_size = IWL60_RTC_INST_SIZE,                   \
+       .max_data_size = IWL60_RTC_DATA_SIZE,                   \
        .eeprom_ver = EEPROM_2000_EEPROM_VERSION,               \
        .eeprom_calib_ver = EEPROM_2000_TX_POWER_VERSION,       \
        .lib = &iwl2000_lib,                                    \
@@ -270,6 +266,8 @@ struct iwl_cfg iwl2000_2bgn_d_cfg = {
        .ucode_api_max = IWL2030_UCODE_API_MAX,                 \
        .ucode_api_ok = IWL2030_UCODE_API_OK,                   \
        .ucode_api_min = IWL2030_UCODE_API_MIN,                 \
+       .max_inst_size = IWL60_RTC_INST_SIZE,                   \
+       .max_data_size = IWL60_RTC_DATA_SIZE,                   \
        .eeprom_ver = EEPROM_2000_EEPROM_VERSION,               \
        .eeprom_calib_ver = EEPROM_2000_TX_POWER_VERSION,       \
        .lib = &iwl2030_lib,                                    \
@@ -292,6 +290,8 @@ struct iwl_cfg iwl2030_2bgn_cfg = {
        .ucode_api_max = IWL105_UCODE_API_MAX,                  \
        .ucode_api_ok = IWL105_UCODE_API_OK,                    \
        .ucode_api_min = IWL105_UCODE_API_MIN,                  \
+       .max_inst_size = IWL60_RTC_INST_SIZE,                   \
+       .max_data_size = IWL60_RTC_DATA_SIZE,                   \
        .eeprom_ver = EEPROM_2000_EEPROM_VERSION,               \
        .eeprom_calib_ver = EEPROM_2000_TX_POWER_VERSION,       \
        .lib = &iwl2000_lib,                                    \
@@ -320,6 +320,8 @@ struct iwl_cfg iwl105_bgn_d_cfg = {
        .ucode_api_max = IWL135_UCODE_API_MAX,                  \
        .ucode_api_ok = IWL135_UCODE_API_OK,                    \
        .ucode_api_min = IWL135_UCODE_API_MIN,                  \
+       .max_inst_size = IWL60_RTC_INST_SIZE,                   \
+       .max_data_size = IWL60_RTC_DATA_SIZE,                   \
        .eeprom_ver = EEPROM_2000_EEPROM_VERSION,               \
        .eeprom_calib_ver = EEPROM_2000_TX_POWER_VERSION,       \
        .lib = &iwl2030_lib,                                    \
index b3a365f..1527dec 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2007 - 2011 Intel Corporation. All rights reserved.
+ * Copyright(c) 2007 - 2012 Intel Corporation. All rights reserved.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
@@ -73,7 +73,7 @@ static void iwl5000_nic_config(struct iwl_priv *priv)
         * (PCIe power is lost before PERST# is asserted),
         * causing ME FW to lose ownership and not being able to obtain it back.
         */
-       iwl_set_bits_mask_prph(bus(priv), APMG_PS_CTRL_REG,
+       iwl_set_bits_mask_prph(trans(priv), APMG_PS_CTRL_REG,
                                APMG_PS_CTRL_EARLY_PWR_OFF_RESET_DIS,
                                ~APMG_PS_CTRL_EARLY_PWR_OFF_RESET_DIS);
 
@@ -162,7 +162,7 @@ static void iwl5000_set_ct_threshold(struct iwl_priv *priv)
        hw_params(priv).ct_kill_threshold = CT_KILL_THRESHOLD_LEGACY;
 }
 
-static int iwl5000_hw_set_hw_params(struct iwl_priv *priv)
+static void iwl5000_hw_set_hw_params(struct iwl_priv *priv)
 {
        if (iwlagn_mod_params.num_of_queues >= IWL_MIN_NUM_QUEUES &&
            iwlagn_mod_params.num_of_queues <= IWLAGN_NUM_QUEUES)
@@ -170,10 +170,6 @@ static int iwl5000_hw_set_hw_params(struct iwl_priv *priv)
                        iwlagn_mod_params.num_of_queues;
 
        hw_params(priv).max_txq_num = cfg(priv)->base_params->num_of_queues;
-       priv->contexts[IWL_RXON_CTX_BSS].bcast_sta_id = IWLAGN_BROADCAST_ID;
-
-       hw_params(priv).max_data_size = IWLAGN_RTC_DATA_SIZE;
-       hw_params(priv).max_inst_size = IWLAGN_RTC_INST_SIZE;
 
        hw_params(priv).ht40_channel =  BIT(IEEE80211_BAND_2GHZ) |
                                        BIT(IEEE80211_BAND_5GHZ);
@@ -187,11 +183,9 @@ static int iwl5000_hw_set_hw_params(struct iwl_priv *priv)
 
        /* Set initial sensitivity parameters */
        hw_params(priv).sens = &iwl5000_sensitivity;
-
-       return 0;
 }
 
-static int iwl5150_hw_set_hw_params(struct iwl_priv *priv)
+static void iwl5150_hw_set_hw_params(struct iwl_priv *priv)
 {
        if (iwlagn_mod_params.num_of_queues >= IWL_MIN_NUM_QUEUES &&
            iwlagn_mod_params.num_of_queues <= IWLAGN_NUM_QUEUES)
@@ -199,10 +193,6 @@ static int iwl5150_hw_set_hw_params(struct iwl_priv *priv)
                        iwlagn_mod_params.num_of_queues;
 
        hw_params(priv).max_txq_num = cfg(priv)->base_params->num_of_queues;
-       priv->contexts[IWL_RXON_CTX_BSS].bcast_sta_id = IWLAGN_BROADCAST_ID;
-
-       hw_params(priv).max_data_size = IWLAGN_RTC_DATA_SIZE;
-       hw_params(priv).max_inst_size = IWLAGN_RTC_INST_SIZE;
 
        hw_params(priv).ht40_channel =  BIT(IEEE80211_BAND_2GHZ) |
                                        BIT(IEEE80211_BAND_5GHZ);
@@ -216,8 +206,6 @@ static int iwl5150_hw_set_hw_params(struct iwl_priv *priv)
 
        /* Set initial sensitivity parameters */
        hw_params(priv).sens = &iwl5150_sensitivity;
-
-       return 0;
 }
 
 static void iwl5150_temperature(struct iwl_priv *priv)
@@ -360,6 +348,8 @@ static struct iwl_ht_params iwl5000_ht_params = {
        .fw_name_pre = IWL5000_FW_PRE,                          \
        .ucode_api_max = IWL5000_UCODE_API_MAX,                 \
        .ucode_api_min = IWL5000_UCODE_API_MIN,                 \
+       .max_inst_size = IWLAGN_RTC_INST_SIZE,                  \
+       .max_data_size = IWLAGN_RTC_DATA_SIZE,                  \
        .eeprom_ver = EEPROM_5000_EEPROM_VERSION,               \
        .eeprom_calib_ver = EEPROM_5000_TX_POWER_VERSION,       \
        .lib = &iwl5000_lib,                                    \
@@ -403,6 +393,8 @@ struct iwl_cfg iwl5350_agn_cfg = {
        .fw_name_pre = IWL5000_FW_PRE,
        .ucode_api_max = IWL5000_UCODE_API_MAX,
        .ucode_api_min = IWL5000_UCODE_API_MIN,
+       .max_inst_size = IWLAGN_RTC_INST_SIZE,
+       .max_data_size = IWLAGN_RTC_DATA_SIZE,
        .eeprom_ver = EEPROM_5050_EEPROM_VERSION,
        .eeprom_calib_ver = EEPROM_5050_TX_POWER_VERSION,
        .lib = &iwl5000_lib,
@@ -416,6 +408,8 @@ struct iwl_cfg iwl5350_agn_cfg = {
        .fw_name_pre = IWL5150_FW_PRE,                          \
        .ucode_api_max = IWL5150_UCODE_API_MAX,                 \
        .ucode_api_min = IWL5150_UCODE_API_MIN,                 \
+       .max_inst_size = IWLAGN_RTC_INST_SIZE,                  \
+       .max_data_size = IWLAGN_RTC_DATA_SIZE,                  \
        .eeprom_ver = EEPROM_5050_EEPROM_VERSION,               \
        .eeprom_calib_ver = EEPROM_5050_TX_POWER_VERSION,       \
        .lib = &iwl5150_lib,                                    \
index 54b7533..223e60a 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2008 - 2011 Intel Corporation. All rights reserved.
+ * Copyright(c) 2008 - 2012 Intel Corporation. All rights reserved.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
@@ -82,7 +82,7 @@ static void iwl6050_additional_nic_config(struct iwl_priv *priv)
 {
        /* Indicate calibration version to uCode. */
        if (iwl_eeprom_calib_version(priv->shrd) >= 6)
-               iwl_set_bit(bus(priv), CSR_GP_DRIVER_REG,
+               iwl_set_bit(trans(priv), CSR_GP_DRIVER_REG,
                                CSR_GP_DRIVER_REG_BIT_CALIB_VERSION6);
 }
 
@@ -90,9 +90,9 @@ static void iwl6150_additional_nic_config(struct iwl_priv *priv)
 {
        /* Indicate calibration version to uCode. */
        if (iwl_eeprom_calib_version(priv->shrd) >= 6)
-               iwl_set_bit(bus(priv), CSR_GP_DRIVER_REG,
+               iwl_set_bit(trans(priv), CSR_GP_DRIVER_REG,
                                CSR_GP_DRIVER_REG_BIT_CALIB_VERSION6);
-       iwl_set_bit(bus(priv), CSR_GP_DRIVER_REG,
+       iwl_set_bit(trans(priv), CSR_GP_DRIVER_REG,
                    CSR_GP_DRIVER_REG_BIT_6050_1x2);
 }
 
@@ -104,7 +104,7 @@ static void iwl6000_nic_config(struct iwl_priv *priv)
        /* no locking required for register write */
        if (cfg(priv)->pa_type == IWL_PA_INTERNAL) {
                /* 2x2 IPA phy type */
-               iwl_write32(bus(priv), CSR_GP_DRIVER_REG,
+               iwl_write32(trans(priv), CSR_GP_DRIVER_REG,
                             CSR_GP_DRIVER_REG_BIT_RADIO_SKU_2x2_IPA);
        }
        /* do additional nic configuration if needed */
@@ -137,7 +137,7 @@ static struct iwl_sensitivity_ranges iwl6000_sensitivity = {
        .nrg_th_cca = 62,
 };
 
-static int iwl6000_hw_set_hw_params(struct iwl_priv *priv)
+static void iwl6000_hw_set_hw_params(struct iwl_priv *priv)
 {
        if (iwlagn_mod_params.num_of_queues >= IWL_MIN_NUM_QUEUES &&
            iwlagn_mod_params.num_of_queues <= IWLAGN_NUM_QUEUES)
@@ -145,10 +145,6 @@ static int iwl6000_hw_set_hw_params(struct iwl_priv *priv)
                        iwlagn_mod_params.num_of_queues;
 
        hw_params(priv).max_txq_num = cfg(priv)->base_params->num_of_queues;
-       priv->contexts[IWL_RXON_CTX_BSS].bcast_sta_id = IWLAGN_BROADCAST_ID;
-
-       hw_params(priv).max_data_size = IWL60_RTC_DATA_SIZE;
-       hw_params(priv).max_inst_size = IWL60_RTC_INST_SIZE;
 
        hw_params(priv).ht40_channel =  BIT(IEEE80211_BAND_2GHZ) |
                                        BIT(IEEE80211_BAND_5GHZ);
@@ -167,7 +163,6 @@ static int iwl6000_hw_set_hw_params(struct iwl_priv *priv)
        /* Set initial sensitivity parameters */
        hw_params(priv).sens = &iwl6000_sensitivity;
 
-       return 0;
 }
 
 static int iwl6000_hw_channel_switch(struct iwl_priv *priv,
@@ -351,6 +346,8 @@ static struct iwl_bt_params iwl6000_bt_params = {
        .ucode_api_max = IWL6000G2_UCODE_API_MAX,               \
        .ucode_api_ok = IWL6000G2_UCODE_API_OK,                 \
        .ucode_api_min = IWL6000G2_UCODE_API_MIN,               \
+       .max_inst_size = IWL60_RTC_INST_SIZE,                   \
+       .max_data_size = IWL60_RTC_DATA_SIZE,                   \
        .eeprom_ver = EEPROM_6005_EEPROM_VERSION,               \
        .eeprom_calib_ver = EEPROM_6005_TX_POWER_VERSION,       \
        .lib = &iwl6000_lib,                                    \
@@ -386,11 +383,24 @@ struct iwl_cfg iwl6005_2agn_d_cfg = {
        .ht_params = &iwl6000_ht_params,
 };
 
+struct iwl_cfg iwl6005_2agn_mow1_cfg = {
+       .name = "Intel(R) Centrino(R) Advanced-N 6206 AGN",
+       IWL_DEVICE_6005,
+       .ht_params = &iwl6000_ht_params,
+};
+struct iwl_cfg iwl6005_2agn_mow2_cfg = {
+       .name = "Intel(R) Centrino(R) Advanced-N 6207 AGN",
+       IWL_DEVICE_6005,
+       .ht_params = &iwl6000_ht_params,
+};
+
 #define IWL_DEVICE_6030                                                \
        .fw_name_pre = IWL6030_FW_PRE,                          \
        .ucode_api_max = IWL6000G2_UCODE_API_MAX,               \
        .ucode_api_ok = IWL6000G2_UCODE_API_OK,                 \
        .ucode_api_min = IWL6000G2_UCODE_API_MIN,               \
+       .max_inst_size = IWL60_RTC_INST_SIZE,                   \
+       .max_data_size = IWL60_RTC_DATA_SIZE,                   \
        .eeprom_ver = EEPROM_6030_EEPROM_VERSION,               \
        .eeprom_calib_ver = EEPROM_6030_TX_POWER_VERSION,       \
        .lib = &iwl6030_lib,                                    \
@@ -460,6 +470,8 @@ struct iwl_cfg iwl130_bg_cfg = {
        .ucode_api_max = IWL6000_UCODE_API_MAX,                 \
        .ucode_api_ok = IWL6000_UCODE_API_OK,                   \
        .ucode_api_min = IWL6000_UCODE_API_MIN,                 \
+       .max_inst_size = IWL60_RTC_INST_SIZE,                   \
+       .max_data_size = IWL60_RTC_DATA_SIZE,                   \
        .valid_tx_ant = ANT_BC,         /* .cfg overwrite */    \
        .valid_rx_ant = ANT_BC,         /* .cfg overwrite */    \
        .eeprom_ver = EEPROM_6000_EEPROM_VERSION,               \
@@ -489,6 +501,8 @@ struct iwl_cfg iwl6000i_2bg_cfg = {
        .fw_name_pre = IWL6050_FW_PRE,                          \
        .ucode_api_max = IWL6050_UCODE_API_MAX,                 \
        .ucode_api_min = IWL6050_UCODE_API_MIN,                 \
+       .max_inst_size = IWL60_RTC_INST_SIZE,                   \
+       .max_data_size = IWL60_RTC_DATA_SIZE,                   \
        .valid_tx_ant = ANT_AB,         /* .cfg overwrite */    \
        .valid_rx_ant = ANT_AB,         /* .cfg overwrite */    \
        .lib = &iwl6000_lib,                                    \
@@ -514,6 +528,8 @@ struct iwl_cfg iwl6050_2abg_cfg = {
        .fw_name_pre = IWL6050_FW_PRE,                          \
        .ucode_api_max = IWL6050_UCODE_API_MAX,                 \
        .ucode_api_min = IWL6050_UCODE_API_MIN,                 \
+       .max_inst_size = IWL60_RTC_INST_SIZE,                   \
+       .max_data_size = IWL60_RTC_DATA_SIZE,                   \
        .lib = &iwl6000_lib,                                    \
        .additional_nic_config = iwl6150_additional_nic_config, \
        .eeprom_ver = EEPROM_6150_EEPROM_VERSION,               \
@@ -539,6 +555,8 @@ struct iwl_cfg iwl6000_3agn_cfg = {
        .ucode_api_max = IWL6000_UCODE_API_MAX,
        .ucode_api_ok = IWL6000_UCODE_API_OK,
        .ucode_api_min = IWL6000_UCODE_API_MIN,
+       .max_inst_size = IWL60_RTC_INST_SIZE,
+       .max_data_size = IWL60_RTC_DATA_SIZE,
        .eeprom_ver = EEPROM_6000_EEPROM_VERSION,
        .eeprom_calib_ver = EEPROM_6000_TX_POWER_VERSION,
        .lib = &iwl6000_lib,
index 50ff849..988ee45 100644 (file)
@@ -5,7 +5,7 @@
  *
  * GPL LICENSE SUMMARY
  *
- * Copyright(c) 2008 - 2011 Intel Corporation. All rights reserved.
+ * Copyright(c) 2008 - 2012 Intel Corporation. All rights reserved.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of version 2 of the GNU General Public License as
@@ -30,7 +30,7 @@
  *
  * BSD LICENSE
  *
- * Copyright(c) 2005 - 2011 Intel Corporation. All rights reserved.
+ * Copyright(c) 2005 - 2012 Intel Corporation. All rights reserved.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -68,6 +68,8 @@
 #include "iwl-agn-calib.h"
 #include "iwl-trans.h"
 #include "iwl-agn.h"
+#include "iwl-wifi.h"
+#include "iwl-ucode.h"
 
 /*****************************************************************************
  * INIT calibrations framework
@@ -634,7 +636,7 @@ void iwl_init_sensitivity(struct iwl_priv *priv)
        data->last_bad_plcp_cnt_cck = 0;
        data->last_fa_cnt_cck = 0;
 
-       if (priv->enhance_sensitivity_table)
+       if (nic(priv)->fw.enhance_sensitivity_table)
                ret |= iwl_enhance_sensitivity_write(priv);
        else
                ret |= iwl_sensitivity_write(priv);
@@ -745,7 +747,7 @@ void iwl_sensitivity_calibration(struct iwl_priv *priv)
 
        iwl_sens_auto_corr_ofdm(priv, norm_fa_ofdm, rx_enable_time);
        iwl_sens_energy_cck(priv, norm_fa_cck, rx_enable_time, &statis);
-       if (priv->enhance_sensitivity_table)
+       if (nic(priv)->fw.enhance_sensitivity_table)
                iwl_enhance_sensitivity_write(priv);
        else
                iwl_sensitivity_write(priv);
index 10275ce..9ed6683 100644 (file)
@@ -5,7 +5,7 @@
  *
  * GPL LICENSE SUMMARY
  *
- * Copyright(c) 2008 - 2011 Intel Corporation. All rights reserved.
+ * Copyright(c) 2008 - 2012 Intel Corporation. All rights reserved.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of version 2 of the GNU General Public License as
@@ -30,7 +30,7 @@
  *
  * BSD LICENSE
  *
- * Copyright(c) 2005 - 2011 Intel Corporation. All rights reserved.
+ * Copyright(c) 2005 - 2012 Intel Corporation. All rights reserved.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
index 123ef5e..d0ec0ab 100644 (file)
@@ -5,7 +5,7 @@
  *
  * GPL LICENSE SUMMARY
  *
- * Copyright(c) 2007 - 2011 Intel Corporation. All rights reserved.
+ * Copyright(c) 2007 - 2012 Intel Corporation. All rights reserved.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of version 2 of the GNU General Public License as
@@ -30,7 +30,7 @@
  *
  * BSD LICENSE
  *
- * Copyright(c) 2005 - 2011 Intel Corporation. All rights reserved.
+ * Copyright(c) 2005 - 2012 Intel Corporation. All rights reserved.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
index 64cf439..5be0d36 100644 (file)
@@ -2,7 +2,7 @@
  *
  * GPL LICENSE SUMMARY
  *
- * Copyright(c) 2008 - 2011 Intel Corporation. All rights reserved.
+ * Copyright(c) 2008 - 2012 Intel Corporation. All rights reserved.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of version 2 of the GNU General Public License as
@@ -77,7 +77,7 @@ int iwlagn_send_tx_power(struct iwl_priv *priv)
        tx_power_cmd.flags = IWLAGN_TX_POWER_NO_CLOSED;
        tx_power_cmd.srv_chan_lmt = IWLAGN_TX_POWER_AUTO;
 
-       if (IWL_UCODE_API(priv->ucode_ver) == 1)
+       if (IWL_UCODE_API(nic(priv)->fw.ucode_ver) == 1)
                tx_ant_cfg_cmd = REPLY_TX_POWER_DBM_CMD_V1;
        else
                tx_ant_cfg_cmd = REPLY_TX_POWER_DBM_CMD;
@@ -700,7 +700,7 @@ static void iwlagn_set_kill_msk(struct iwl_priv *priv,
                priv->kill_cts_mask = bt_kill_cts_msg[kill_msk];
 
                /* schedule to send runtime bt_config */
-               queue_work(priv->shrd->workqueue, &priv->bt_runtime_config);
+               queue_work(priv->workqueue, &priv->bt_runtime_config);
        }
 }
 
@@ -745,7 +745,7 @@ int iwlagn_bt_coex_profile_notif(struct iwl_priv *priv,
                                        IWL_BT_COEX_TRAFFIC_LOAD_NONE;
                        }
                        priv->bt_status = coex->bt_status;
-                       queue_work(priv->shrd->workqueue,
+                       queue_work(priv->workqueue,
                                   &priv->bt_traffic_change_work);
                }
        }
@@ -959,7 +959,7 @@ static void iwlagn_wowlan_program_keys(struct ieee80211_hw *hw,
                               struct ieee80211_key_conf *key,
                               void *_data)
 {
-       struct iwl_priv *priv = hw->priv;
+       struct iwl_priv *priv = IWL_MAC80211_GET_DVM(hw);
        struct wowlan_key_data *data = _data;
        struct iwl_rxon_context *ctx = data->ctx;
        struct aes_sc *aes_sc, *aes_tx_sc = NULL;
index 334b5ae..a7d6713 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2005 - 2011 Intel Corporation. All rights reserved.
+ * Copyright(c) 2005 - 2012 Intel Corporation. All rights reserved.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
@@ -38,6 +38,7 @@
 #include "iwl-dev.h"
 #include "iwl-core.h"
 #include "iwl-agn.h"
+#include "iwl-op-mode.h"
 
 #define RS_NAME "iwl-agn-rs"
 
@@ -892,7 +893,7 @@ static void rs_bt_update_lq(struct iwl_priv *priv, struct iwl_rxon_context *ctx,
                rs_fill_link_cmd(priv, lq_sta, tbl->current_rate);
                iwl_send_lq_cmd(priv, ctx, &lq_sta->lq, CMD_ASYNC, false);
 
-               queue_work(priv->shrd->workqueue, &priv->bt_full_concurrency);
+               queue_work(priv->workqueue, &priv->bt_full_concurrency);
        }
 }
 
@@ -909,7 +910,8 @@ static void rs_tx_status(void *priv_r, struct ieee80211_supported_band *sband,
        struct iwl_lq_sta *lq_sta = priv_sta;
        struct iwl_link_quality_cmd *table;
        struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
-       struct iwl_priv *priv = (struct iwl_priv *)priv_r;
+       struct iwl_op_mode *op_mode = (struct iwl_op_mode *)priv_r;
+       struct iwl_priv *priv = IWL_OP_MODE_GET_DVM(op_mode);
        struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
        enum mac80211_rate_control_flags mac_flags;
        u32 tx_rate;
@@ -2737,7 +2739,9 @@ static void rs_get_rate(void *priv_r, struct ieee80211_sta *sta, void *priv_sta,
 
        struct sk_buff *skb = txrc->skb;
        struct ieee80211_supported_band *sband = txrc->sband;
-       struct iwl_priv *priv __maybe_unused = (struct iwl_priv *)priv_r;
+       struct iwl_op_mode *op_mode __maybe_unused =
+                       (struct iwl_op_mode *)priv_r;
+       struct iwl_priv *priv __maybe_unused = IWL_OP_MODE_GET_DVM(op_mode);
        struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
        struct iwl_lq_sta *lq_sta = priv_sta;
        int rate_idx;
@@ -2805,9 +2809,10 @@ static void *rs_alloc_sta(void *priv_rate, struct ieee80211_sta *sta,
                          gfp_t gfp)
 {
        struct iwl_station_priv *sta_priv = (struct iwl_station_priv *) sta->drv_priv;
-       struct iwl_priv *priv;
+       struct iwl_op_mode *op_mode __maybe_unused =
+                       (struct iwl_op_mode *)priv_rate;
+       struct iwl_priv *priv __maybe_unused = IWL_OP_MODE_GET_DVM(op_mode);
 
-       priv = (struct iwl_priv *)priv_rate;
        IWL_DEBUG_RATE(priv, "create station rate scale window\n");
 
        return &sta_priv->lq_sta;
@@ -3074,7 +3079,8 @@ static void rs_free(void *priv_rate)
 static void rs_free_sta(void *priv_r, struct ieee80211_sta *sta,
                        void *priv_sta)
 {
-       struct iwl_priv *priv __maybe_unused = priv_r;
+       struct iwl_op_mode *op_mode __maybe_unused = priv_r;
+       struct iwl_priv *priv __maybe_unused = IWL_OP_MODE_GET_DVM(op_mode);
 
        IWL_DEBUG_RATE(priv, "enter\n");
        IWL_DEBUG_RATE(priv, "leave\n");
index 6675b3c..203b1c1 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2003 - 2011 Intel Corporation. All rights reserved.
+ * Copyright(c) 2003 - 2012 Intel Corporation. All rights reserved.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
index b22b297..30bb5bb 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2003 - 2011 Intel Corporation. All rights reserved.
+ * Copyright(c) 2003 - 2012 Intel Corporation. All rights reserved.
  *
  * Portions of this file are derived from the ipw3945 project, as well
  * as portionhelp of the ieee80211 subsystem header files.
@@ -581,7 +581,7 @@ static int iwlagn_rx_statistics(struct iwl_priv *priv,
        if (unlikely(!test_bit(STATUS_SCANNING, &priv->shrd->status)) &&
            (pkt->hdr.cmd == STATISTICS_NOTIFICATION)) {
                iwlagn_rx_calc_noise(priv);
-               queue_work(priv->shrd->workqueue, &priv->run_time_calib_work);
+               queue_work(priv->workqueue, &priv->run_time_calib_work);
        }
        if (cfg(priv)->lib->temperature && change)
                cfg(priv)->lib->temperature(priv);
@@ -628,16 +628,16 @@ static int iwlagn_rx_card_state_notif(struct iwl_priv *priv,
        if (flags & (SW_CARD_DISABLED | HW_CARD_DISABLED |
                     CT_CARD_DISABLED)) {
 
-               iwl_write32(bus(priv), CSR_UCODE_DRV_GP1_SET,
+               iwl_write32(trans(priv), CSR_UCODE_DRV_GP1_SET,
                            CSR_UCODE_DRV_GP1_BIT_CMD_BLOCKED);
 
-               iwl_write_direct32(bus(priv), HBUS_TARG_MBX_C,
+               iwl_write_direct32(trans(priv), HBUS_TARG_MBX_C,
                                        HBUS_TARG_MBX_C_REG_BIT_CMD_BLOCKED);
 
                if (!(flags & RXON_CARD_DISABLED)) {
-                       iwl_write32(bus(priv), CSR_UCODE_DRV_GP1_CLR,
+                       iwl_write32(trans(priv), CSR_UCODE_DRV_GP1_CLR,
                                    CSR_UCODE_DRV_GP1_BIT_CMD_BLOCKED);
-                       iwl_write_direct32(bus(priv), HBUS_TARG_MBX_C,
+                       iwl_write_direct32(trans(priv), HBUS_TARG_MBX_C,
                                        HBUS_TARG_MBX_C_REG_BIT_CMD_BLOCKED);
                }
                if (flags & CT_CARD_DISABLED)
@@ -1141,10 +1141,11 @@ void iwl_setup_rx_handlers(struct iwl_priv *priv)
 
 }
 
-int iwl_rx_dispatch(struct iwl_priv *priv, struct iwl_rx_mem_buffer *rxb,
+int iwl_rx_dispatch(struct iwl_op_mode *op_mode, struct iwl_rx_mem_buffer *rxb,
                     struct iwl_device_cmd *cmd)
 {
        struct iwl_rx_packet *pkt = rxb_addr(rxb);
+       struct iwl_priv *priv = IWL_OP_MODE_GET_DVM(op_mode);
        int err = 0;
 
        /*
@@ -1172,20 +1173,22 @@ int iwl_rx_dispatch(struct iwl_priv *priv, struct iwl_rx_mem_buffer *rxb,
                wake_up_all(&priv->shrd->notif_waitq);
        }
 
-       if (priv->pre_rx_handler)
+       if (priv->pre_rx_handler &&
+           priv->shrd->ucode_owner == IWL_OWNERSHIP_TM)
                priv->pre_rx_handler(priv, rxb);
-
-       /* Based on type of command response or notification,
-        *   handle those that need handling via function in
-        *   rx_handlers table.  See iwl_setup_rx_handlers() */
-       if (priv->rx_handlers[pkt->hdr.cmd]) {
-               priv->rx_handlers_stats[pkt->hdr.cmd]++;
-               err = priv->rx_handlers[pkt->hdr.cmd] (priv, rxb, cmd);
-       } else {
-               /* No handling needed */
-               IWL_DEBUG_RX(priv,
-                       "No handler needed for %s, 0x%02x\n",
-                       get_cmd_string(pkt->hdr.cmd), pkt->hdr.cmd);
+       else {
+               /* Based on type of command response or notification,
+                *   handle those that need handling via function in
+                *   rx_handlers table.  See iwl_setup_rx_handlers() */
+               if (priv->rx_handlers[pkt->hdr.cmd]) {
+                       priv->rx_handlers_stats[pkt->hdr.cmd]++;
+                       err = priv->rx_handlers[pkt->hdr.cmd] (priv, rxb, cmd);
+               } else {
+                       /* No handling needed */
+                       IWL_DEBUG_RX(priv,
+                               "No handler needed for %s, 0x%02x\n",
+                               get_cmd_string(pkt->hdr.cmd), pkt->hdr.cmd);
+               }
        }
        return err;
 }
index 1c66594..73653a6 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2003 - 2011 Intel Corporation. All rights reserved.
+ * Copyright(c) 2003 - 2012 Intel Corporation. All rights reserved.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
@@ -549,7 +549,7 @@ void iwlagn_config_ht40(struct ieee80211_conf *conf,
 
 int iwlagn_mac_config(struct ieee80211_hw *hw, u32 changed)
 {
-       struct iwl_priv *priv = hw->priv;
+       struct iwl_priv *priv = IWL_MAC80211_GET_DVM(hw);
        struct iwl_rxon_context *ctx;
        struct ieee80211_conf *conf = &hw->conf;
        struct ieee80211_channel *channel = conf->channel;
@@ -805,7 +805,7 @@ void iwlagn_bss_info_changed(struct ieee80211_hw *hw,
                             struct ieee80211_bss_conf *bss_conf,
                             u32 changes)
 {
-       struct iwl_priv *priv = hw->priv;
+       struct iwl_priv *priv = IWL_MAC80211_GET_DVM(hw);
        struct iwl_rxon_context *ctx = iwl_rxon_ctx_from_vif(vif);
        int ret;
        bool force = false;
@@ -900,6 +900,22 @@ void iwlagn_bss_info_changed(struct ieee80211_hw *hw,
                }
        }
 
+       /*
+        * If the ucode decides to do beacon filtering before
+        * association, it will lose beacons that are needed
+        * before sending frames out on passive channels. This
+        * causes association failures on those channels. Enable
+        * receiving beacons in such cases.
+        */
+
+       if (vif->type == NL80211_IFTYPE_STATION) {
+               if (!bss_conf->assoc)
+                       ctx->staging.filter_flags |= RXON_FILTER_BCON_AWARE_MSK;
+               else
+                       ctx->staging.filter_flags &=
+                                                   ~RXON_FILTER_BCON_AWARE_MSK;
+       }
+
        if (force || memcmp(&ctx->staging, &ctx->active, sizeof(ctx->staging)))
                iwlagn_commit_rxon(priv, ctx);
 
index e483cfa..f1298cd 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2003 - 2011 Intel Corporation. All rights reserved.
+ * Copyright(c) 2003 - 2012 Intel Corporation. All rights reserved.
  *
  * Portions of this file are derived from the ipw3945 project, as well
  * as portions of the ieee80211 subsystem header files.
 #include "iwl-trans.h"
 
 /* priv->shrd->sta_lock must be held */
-static void iwl_sta_ucode_activate(struct iwl_priv *priv, u8 sta_id)
+static int iwl_sta_ucode_activate(struct iwl_priv *priv, u8 sta_id)
 {
-
+       if (sta_id >= IWLAGN_STATION_COUNT) {
+               IWL_ERR(priv, "invalid sta_id %u", sta_id);
+               return -EINVAL;
+       }
        if (!(priv->stations[sta_id].used & IWL_STA_DRIVER_ACTIVE))
                IWL_ERR(priv, "ACTIVATE a non DRIVER active station id %u "
                        "addr %pM\n",
@@ -53,6 +56,7 @@ static void iwl_sta_ucode_activate(struct iwl_priv *priv, u8 sta_id)
                IWL_DEBUG_ASSOC(priv, "Added STA id %u addr %pM to uCode\n",
                                sta_id, priv->stations[sta_id].sta.sta.addr);
        }
+       return 0;
 }
 
 static int iwl_process_add_sta_resp(struct iwl_priv *priv,
@@ -77,8 +81,7 @@ static int iwl_process_add_sta_resp(struct iwl_priv *priv,
        switch (pkt->u.add_sta.status) {
        case ADD_STA_SUCCESS_MSK:
                IWL_DEBUG_INFO(priv, "REPLY_ADD_STA PASSED\n");
-               iwl_sta_ucode_activate(priv, sta_id);
-               ret = 0;
+               ret = iwl_sta_ucode_activate(priv, sta_id);
                break;
        case ADD_STA_NO_ROOM_IN_TABLE:
                IWL_ERR(priv, "Adding station %d failed, no room in table.\n",
index b0dff7a..56d7c0e 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2007 - 2011 Intel Corporation. All rights reserved.
+ * Copyright(c) 2007 - 2012 Intel Corporation. All rights reserved.
  *
  * Portions of this file are derived from the ipw3945 project, as well
  * as portions of the ieee80211 subsystem header files.
@@ -178,19 +178,19 @@ static void iwl_tt_check_exit_ct_kill(unsigned long data)
 
        if (tt->state == IWL_TI_CT_KILL) {
                if (priv->thermal_throttle.ct_kill_toggle) {
-                       iwl_write32(bus(priv), CSR_UCODE_DRV_GP1_CLR,
+                       iwl_write32(trans(priv), CSR_UCODE_DRV_GP1_CLR,
                                    CSR_UCODE_DRV_GP1_REG_BIT_CT_KILL_EXIT);
                        priv->thermal_throttle.ct_kill_toggle = false;
                } else {
-                       iwl_write32(bus(priv), CSR_UCODE_DRV_GP1_SET,
+                       iwl_write32(trans(priv), CSR_UCODE_DRV_GP1_SET,
                                    CSR_UCODE_DRV_GP1_REG_BIT_CT_KILL_EXIT);
                        priv->thermal_throttle.ct_kill_toggle = true;
                }
-               iwl_read32(bus(priv), CSR_UCODE_DRV_GP1);
-               spin_lock_irqsave(&bus(priv)->reg_lock, flags);
-               if (!iwl_grab_nic_access(bus(priv)))
-                       iwl_release_nic_access(bus(priv));
-               spin_unlock_irqrestore(&bus(priv)->reg_lock, flags);
+               iwl_read32(trans(priv), CSR_UCODE_DRV_GP1);
+               spin_lock_irqsave(&trans(priv)->reg_lock, flags);
+               if (!iwl_grab_nic_access(trans(priv)))
+                       iwl_release_nic_access(trans(priv));
+               spin_unlock_irqrestore(&trans(priv)->reg_lock, flags);
 
                /* Reschedule the ct_kill timer to occur in
                 * CT_KILL_EXIT_DURATION seconds to ensure we get a
@@ -568,7 +568,7 @@ void iwl_tt_enter_ct_kill(struct iwl_priv *priv)
                return;
 
        IWL_DEBUG_TEMP(priv, "Queueing critical temperature enter.\n");
-       queue_work(priv->shrd->workqueue, &priv->ct_enter);
+       queue_work(priv->workqueue, &priv->ct_enter);
 }
 
 void iwl_tt_exit_ct_kill(struct iwl_priv *priv)
@@ -577,7 +577,7 @@ void iwl_tt_exit_ct_kill(struct iwl_priv *priv)
                return;
 
        IWL_DEBUG_TEMP(priv, "Queueing critical temperature exit.\n");
-       queue_work(priv->shrd->workqueue, &priv->ct_exit);
+       queue_work(priv->workqueue, &priv->ct_exit);
 }
 
 static void iwl_bg_tt_work(struct work_struct *work)
@@ -600,7 +600,7 @@ void iwl_tt_handler(struct iwl_priv *priv)
                return;
 
        IWL_DEBUG_TEMP(priv, "Queueing thermal throttling work.\n");
-       queue_work(priv->shrd->workqueue, &priv->tt_work);
+       queue_work(priv->workqueue, &priv->tt_work);
 }
 
 /* Thermal throttling initialization
index 7282a23..86bbf47 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2007 - 2011 Intel Corporation. All rights reserved.
+ * Copyright(c) 2007 - 2012 Intel Corporation. All rights reserved.
  *
  * Portions of this file are derived from the ipw3945 project, as well
  * as portions of the ieee80211 subsystem header files.
index 63bbc60..5f78567 100644 (file)
@@ -2,7 +2,7 @@
  *
  * GPL LICENSE SUMMARY
  *
- * Copyright(c) 2008 - 2011 Intel Corporation. All rights reserved.
+ * Copyright(c) 2008 - 2012 Intel Corporation. All rights reserved.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of version 2 of the GNU General Public License as
@@ -322,7 +322,7 @@ int iwlagn_tx_skb(struct iwl_priv *priv, struct sk_buff *skb)
                sta_priv = (void *)info->control.sta->drv_priv;
 
        if (sta_priv && sta_priv->asleep &&
-           (info->flags & IEEE80211_TX_CTL_POLL_RESPONSE)) {
+           (info->flags & IEEE80211_TX_CTL_NO_PS_BUFFER)) {
                /*
                 * This sends an asynchronous command to the device,
                 * but we can rely on it being processed before the
@@ -331,6 +331,10 @@ int iwlagn_tx_skb(struct iwl_priv *priv, struct sk_buff *skb)
                 * counter.
                 * For now set the counter to just 1 since we do not
                 * support uAPSD yet.
+                *
+                * FIXME: If we get two non-bufferable frames one
+                * after the other, we might only send out one of
+                * them because this is racy.
                 */
                iwl_sta_modify_sleep_tx_count(priv, sta_id, 1);
        }
@@ -983,7 +987,7 @@ static void iwl_check_abort_status(struct iwl_priv *priv,
        if (frame_count == 1 && status == TX_STATUS_FAIL_RFKILL_FLUSH) {
                IWL_ERR(priv, "Tx flush command to flush out all frames\n");
                if (!test_bit(STATUS_EXIT_PENDING, &priv->shrd->status))
-                       queue_work(priv->shrd->workqueue, &priv->tx_flush);
+                       queue_work(priv->workqueue, &priv->tx_flush);
        }
 }
 
index b5c7c5f..e0fef9f 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2003 - 2011 Intel Corporation. All rights reserved.
+ * Copyright(c) 2003 - 2012 Intel Corporation. All rights reserved.
  *
  * Portions of this file are derived from the ipw3945 project, as well
  * as portions of the ieee80211 subsystem header files.
@@ -34,7 +34,6 @@
 #include <linux/sched.h>
 #include <linux/skbuff.h>
 #include <linux/netdevice.h>
-#include <linux/firmware.h>
 #include <linux/etherdevice.h>
 #include <linux/if_arp.h>
 
@@ -42,6 +41,7 @@
 
 #include <asm/div64.h>
 
+#include "iwl-ucode.h"
 #include "iwl-eeprom.h"
 #include "iwl-wifi.h"
 #include "iwl-dev.h"
@@ -50,8 +50,8 @@
 #include "iwl-agn-calib.h"
 #include "iwl-agn.h"
 #include "iwl-shared.h"
-#include "iwl-bus.h"
 #include "iwl-trans.h"
+#include "iwl-op-mode.h"
 
 /******************************************************************************
  *
@@ -315,7 +315,7 @@ static void iwl_bg_statistics_periodic(unsigned long data)
 
 static void iwl_print_cont_event_trace(struct iwl_priv *priv, u32 base,
                                        u32 start_idx, u32 num_events,
-                                       u32 mode)
+                                       u32 capacity, u32 mode)
 {
        u32 i;
        u32 ptr;        /* SRAM byte address of log data */
@@ -328,87 +328,125 @@ static void iwl_print_cont_event_trace(struct iwl_priv *priv, u32 base,
                ptr = base + (4 * sizeof(u32)) + (start_idx * 3 * sizeof(u32));
 
        /* Make sure device is powered up for SRAM reads */
-       spin_lock_irqsave(&bus(priv)->reg_lock, reg_flags);
-       if (iwl_grab_nic_access(bus(priv))) {
-               spin_unlock_irqrestore(&bus(priv)->reg_lock, reg_flags);
+       spin_lock_irqsave(&trans(priv)->reg_lock, reg_flags);
+       if (iwl_grab_nic_access(trans(priv))) {
+               spin_unlock_irqrestore(&trans(priv)->reg_lock, reg_flags);
                return;
        }
 
        /* Set starting address; reads will auto-increment */
-       iwl_write32(bus(priv), HBUS_TARG_MEM_RADDR, ptr);
+       iwl_write32(trans(priv), HBUS_TARG_MEM_RADDR, ptr);
        rmb();
 
        /*
+        * Refuse to read more than would have fit into the log from
+        * the current start_idx. This used to happen due to the race
+        * described below, but now WARN because the code below should
+        * prevent it from happening here.
+        */
+       if (WARN_ON(num_events > capacity - start_idx))
+               num_events = capacity - start_idx;
+
+       /*
         * "time" is actually "data" for mode 0 (no timestamp).
         * place event id # at far right for easier visual parsing.
         */
        for (i = 0; i < num_events; i++) {
-               ev = iwl_read32(bus(priv), HBUS_TARG_MEM_RDAT);
-               time = iwl_read32(bus(priv), HBUS_TARG_MEM_RDAT);
+               ev = iwl_read32(trans(priv), HBUS_TARG_MEM_RDAT);
+               time = iwl_read32(trans(priv), HBUS_TARG_MEM_RDAT);
                if (mode == 0) {
-                       trace_iwlwifi_dev_ucode_cont_event(priv,
-                                                       0, time, ev);
+                       trace_iwlwifi_dev_ucode_cont_event(priv, 0, time, ev);
                } else {
-                       data = iwl_read32(bus(priv), HBUS_TARG_MEM_RDAT);
-                       trace_iwlwifi_dev_ucode_cont_event(priv,
-                                               time, data, ev);
+                       data = iwl_read32(trans(priv), HBUS_TARG_MEM_RDAT);
+                       trace_iwlwifi_dev_ucode_cont_event(priv, time,
+                                                          data, ev);
                }
        }
        /* Allow device to power down */
-       iwl_release_nic_access(bus(priv));
-       spin_unlock_irqrestore(&bus(priv)->reg_lock, reg_flags);
+       iwl_release_nic_access(trans(priv));
+       spin_unlock_irqrestore(&trans(priv)->reg_lock, reg_flags);
 }
 
 static void iwl_continuous_event_trace(struct iwl_priv *priv)
 {
        u32 capacity;   /* event log capacity in # entries */
+       struct {
+               u32 capacity;
+               u32 mode;
+               u32 wrap_counter;
+               u32 write_counter;
+       } __packed read;
        u32 base;       /* SRAM byte address of event log header */
        u32 mode;       /* 0 - no timestamp, 1 - timestamp recorded */
        u32 num_wraps;  /* # times uCode wrapped to top of log */
        u32 next_entry; /* index of next entry to be written by uCode */
 
-       base = priv->shrd->device_pointers.error_event_table;
+       base = priv->shrd->device_pointers.log_event_table;
        if (iwlagn_hw_valid_rtc_data_addr(base)) {
-               capacity = iwl_read_targ_mem(bus(priv), base);
-               num_wraps = iwl_read_targ_mem(bus(priv),
-                                               base + (2 * sizeof(u32)));
-               mode = iwl_read_targ_mem(bus(priv), base + (1 * sizeof(u32)));
-               next_entry = iwl_read_targ_mem(bus(priv),
-                                               base + (3 * sizeof(u32)));
+               iwl_read_targ_mem_words(trans(priv), base, &read, sizeof(read));
+
+               capacity = read.capacity;
+               mode = read.mode;
+               num_wraps = read.wrap_counter;
+               next_entry = read.write_counter;
        } else
                return;
 
+       /*
+        * Unfortunately, the uCode doesn't use temporary variables.
+        * Therefore, it can happen that we read next_entry == capacity,
+        * which really means next_entry == 0.
+        */
+       if (unlikely(next_entry == capacity))
+               next_entry = 0;
+       /*
+        * Additionally, the uCode increases the write pointer before
+        * the wraps counter, so if the write pointer is smaller than
+        * the old write pointer (wrap occurred) but we read that no
+        * wrap occurred, we actually read between the next_entry and
+        * num_wraps update (this does happen in practice!!) -- take
+        * that into account by increasing num_wraps.
+        */
+       if (unlikely(next_entry < priv->event_log.next_entry &&
+                    num_wraps == priv->event_log.num_wraps))
+               num_wraps++;
+
        if (num_wraps == priv->event_log.num_wraps) {
-               iwl_print_cont_event_trace(priv,
-                                      base, priv->event_log.next_entry,
-                                      next_entry - priv->event_log.next_entry,
-                                      mode);
+               iwl_print_cont_event_trace(
+                       priv, base, priv->event_log.next_entry,
+                       next_entry - priv->event_log.next_entry,
+                       capacity, mode);
+
                priv->event_log.non_wraps_count++;
        } else {
-               if ((num_wraps - priv->event_log.num_wraps) > 1)
+               if (num_wraps - priv->event_log.num_wraps > 1)
                        priv->event_log.wraps_more_count++;
                else
                        priv->event_log.wraps_once_count++;
+
                trace_iwlwifi_dev_ucode_wrap_event(priv,
                                num_wraps - priv->event_log.num_wraps,
                                next_entry, priv->event_log.next_entry);
+
                if (next_entry < priv->event_log.next_entry) {
-                       iwl_print_cont_event_trace(priv, base,
-                              priv->event_log.next_entry,
-                              capacity - priv->event_log.next_entry,
-                              mode);
+                       iwl_print_cont_event_trace(
+                               priv, base, priv->event_log.next_entry,
+                               capacity - priv->event_log.next_entry,
+                               capacity, mode);
 
-                       iwl_print_cont_event_trace(priv, base, 0,
-                               next_entry, mode);
+                       iwl_print_cont_event_trace(
+                               priv, base, 0, next_entry, capacity, mode);
                } else {
-                       iwl_print_cont_event_trace(priv, base,
-                              next_entry, capacity - next_entry,
-                              mode);
+                       iwl_print_cont_event_trace(
+                               priv, base, next_entry,
+                               capacity - next_entry,
+                               capacity, mode);
 
-                       iwl_print_cont_event_trace(priv, base, 0,
-                               next_entry, mode);
+                       iwl_print_cont_event_trace(
+                               priv, base, 0, next_entry, capacity, mode);
                }
        }
+
        priv->event_log.num_wraps = num_wraps;
        priv->event_log.next_entry = next_entry;
 }
@@ -452,7 +490,7 @@ static void iwl_bg_tx_flush(struct work_struct *work)
        iwlagn_dev_txfifo_flush(priv, IWL_DROP_ALL);
 }
 
-static void iwl_init_context(struct iwl_priv *priv, u32 ucode_flags)
+void iwl_init_context(struct iwl_priv *priv, u32 ucode_flags)
 {
        int i;
 
@@ -475,6 +513,7 @@ static void iwl_init_context(struct iwl_priv *priv, u32 ucode_flags)
        priv->contexts[IWL_RXON_CTX_BSS].qos_cmd = REPLY_QOS_PARAM;
        priv->contexts[IWL_RXON_CTX_BSS].ap_sta_id = IWL_AP_ID;
        priv->contexts[IWL_RXON_CTX_BSS].wep_key_cmd = REPLY_WEPKEY;
+       priv->contexts[IWL_RXON_CTX_BSS].bcast_sta_id = IWLAGN_BROADCAST_ID;
        priv->contexts[IWL_RXON_CTX_BSS].exclusive_interface_modes =
                BIT(NL80211_IFTYPE_ADHOC);
        priv->contexts[IWL_RXON_CTX_BSS].interface_modes =
@@ -509,609 +548,6 @@ static void iwl_init_context(struct iwl_priv *priv, u32 ucode_flags)
        BUILD_BUG_ON(NUM_IWL_RXON_CTX != 2);
 }
 
-static void iwl_ucode_callback(const struct firmware *ucode_raw, void *context);
-
-#define UCODE_EXPERIMENTAL_INDEX       100
-#define UCODE_EXPERIMENTAL_TAG         "exp"
-
-static int __must_check iwl_request_firmware(struct iwl_priv *priv, bool first)
-{
-       const char *name_pre = cfg(priv)->fw_name_pre;
-       char tag[8];
-
-       if (first) {
-#ifdef CONFIG_IWLWIFI_DEBUG_EXPERIMENTAL_UCODE
-               priv->fw_index = UCODE_EXPERIMENTAL_INDEX;
-               strcpy(tag, UCODE_EXPERIMENTAL_TAG);
-       } else if (priv->fw_index == UCODE_EXPERIMENTAL_INDEX) {
-#endif
-               priv->fw_index = cfg(priv)->ucode_api_max;
-               sprintf(tag, "%d", priv->fw_index);
-       } else {
-               priv->fw_index--;
-               sprintf(tag, "%d", priv->fw_index);
-       }
-
-       if (priv->fw_index < cfg(priv)->ucode_api_min) {
-               IWL_ERR(priv, "no suitable firmware found!\n");
-               return -ENOENT;
-       }
-
-       sprintf(priv->firmware_name, "%s%s%s", name_pre, tag, ".ucode");
-
-       IWL_DEBUG_INFO(priv, "attempting to load firmware %s'%s'\n",
-                      (priv->fw_index == UCODE_EXPERIMENTAL_INDEX)
-                               ? "EXPERIMENTAL " : "",
-                      priv->firmware_name);
-
-       return request_firmware_nowait(THIS_MODULE, 1, priv->firmware_name,
-                                      bus(priv)->dev,
-                                      GFP_KERNEL, priv, iwl_ucode_callback);
-}
-
-struct iwlagn_firmware_pieces {
-       const void *inst, *data, *init, *init_data, *wowlan_inst, *wowlan_data;
-       size_t inst_size, data_size, init_size, init_data_size,
-              wowlan_inst_size, wowlan_data_size;
-
-       u32 build;
-
-       u32 init_evtlog_ptr, init_evtlog_size, init_errlog_ptr;
-       u32 inst_evtlog_ptr, inst_evtlog_size, inst_errlog_ptr;
-};
-
-static int iwlagn_load_legacy_firmware(struct iwl_priv *priv,
-                                      const struct firmware *ucode_raw,
-                                      struct iwlagn_firmware_pieces *pieces)
-{
-       struct iwl_ucode_header *ucode = (void *)ucode_raw->data;
-       u32 api_ver, hdr_size;
-       const u8 *src;
-
-       priv->ucode_ver = le32_to_cpu(ucode->ver);
-       api_ver = IWL_UCODE_API(priv->ucode_ver);
-
-       switch (api_ver) {
-       default:
-               hdr_size = 28;
-               if (ucode_raw->size < hdr_size) {
-                       IWL_ERR(priv, "File size too small!\n");
-                       return -EINVAL;
-               }
-               pieces->build = le32_to_cpu(ucode->u.v2.build);
-               pieces->inst_size = le32_to_cpu(ucode->u.v2.inst_size);
-               pieces->data_size = le32_to_cpu(ucode->u.v2.data_size);
-               pieces->init_size = le32_to_cpu(ucode->u.v2.init_size);
-               pieces->init_data_size = le32_to_cpu(ucode->u.v2.init_data_size);
-               src = ucode->u.v2.data;
-               break;
-       case 0:
-       case 1:
-       case 2:
-               hdr_size = 24;
-               if (ucode_raw->size < hdr_size) {
-                       IWL_ERR(priv, "File size too small!\n");
-                       return -EINVAL;
-               }
-               pieces->build = 0;
-               pieces->inst_size = le32_to_cpu(ucode->u.v1.inst_size);
-               pieces->data_size = le32_to_cpu(ucode->u.v1.data_size);
-               pieces->init_size = le32_to_cpu(ucode->u.v1.init_size);
-               pieces->init_data_size = le32_to_cpu(ucode->u.v1.init_data_size);
-               src = ucode->u.v1.data;
-               break;
-       }
-
-       /* Verify size of file vs. image size info in file's header */
-       if (ucode_raw->size != hdr_size + pieces->inst_size +
-                               pieces->data_size + pieces->init_size +
-                               pieces->init_data_size) {
-
-               IWL_ERR(priv,
-                       "uCode file size %d does not match expected size\n",
-                       (int)ucode_raw->size);
-               return -EINVAL;
-       }
-
-       pieces->inst = src;
-       src += pieces->inst_size;
-       pieces->data = src;
-       src += pieces->data_size;
-       pieces->init = src;
-       src += pieces->init_size;
-       pieces->init_data = src;
-       src += pieces->init_data_size;
-
-       return 0;
-}
-
-static int iwlagn_load_firmware(struct iwl_priv *priv,
-                               const struct firmware *ucode_raw,
-                               struct iwlagn_firmware_pieces *pieces,
-                               struct iwlagn_ucode_capabilities *capa)
-{
-       struct iwl_tlv_ucode_header *ucode = (void *)ucode_raw->data;
-       struct iwl_ucode_tlv *tlv;
-       size_t len = ucode_raw->size;
-       const u8 *data;
-       int wanted_alternative = iwlagn_mod_params.wanted_ucode_alternative;
-       int tmp;
-       u64 alternatives;
-       u32 tlv_len;
-       enum iwl_ucode_tlv_type tlv_type;
-       const u8 *tlv_data;
-
-       if (len < sizeof(*ucode)) {
-               IWL_ERR(priv, "uCode has invalid length: %zd\n", len);
-               return -EINVAL;
-       }
-
-       if (ucode->magic != cpu_to_le32(IWL_TLV_UCODE_MAGIC)) {
-               IWL_ERR(priv, "invalid uCode magic: 0X%x\n",
-                       le32_to_cpu(ucode->magic));
-               return -EINVAL;
-       }
-
-       /*
-        * Check which alternatives are present, and "downgrade"
-        * when the chosen alternative is not present, warning
-        * the user when that happens. Some files may not have
-        * any alternatives, so don't warn in that case.
-        */
-       alternatives = le64_to_cpu(ucode->alternatives);
-       tmp = wanted_alternative;
-       if (wanted_alternative > 63)
-               wanted_alternative = 63;
-       while (wanted_alternative && !(alternatives & BIT(wanted_alternative)))
-               wanted_alternative--;
-       if (wanted_alternative && wanted_alternative != tmp)
-               IWL_WARN(priv,
-                        "uCode alternative %d not available, choosing %d\n",
-                        tmp, wanted_alternative);
-
-       priv->ucode_ver = le32_to_cpu(ucode->ver);
-       pieces->build = le32_to_cpu(ucode->build);
-       data = ucode->data;
-
-       len -= sizeof(*ucode);
-
-       while (len >= sizeof(*tlv)) {
-               u16 tlv_alt;
-
-               len -= sizeof(*tlv);
-               tlv = (void *)data;
-
-               tlv_len = le32_to_cpu(tlv->length);
-               tlv_type = le16_to_cpu(tlv->type);
-               tlv_alt = le16_to_cpu(tlv->alternative);
-               tlv_data = tlv->data;
-
-               if (len < tlv_len) {
-                       IWL_ERR(priv, "invalid TLV len: %zd/%u\n",
-                               len, tlv_len);
-                       return -EINVAL;
-               }
-               len -= ALIGN(tlv_len, 4);
-               data += sizeof(*tlv) + ALIGN(tlv_len, 4);
-
-               /*
-                * Alternative 0 is always valid.
-                *
-                * Skip alternative TLVs that are not selected.
-                */
-               if (tlv_alt != 0 && tlv_alt != wanted_alternative)
-                       continue;
-
-               switch (tlv_type) {
-               case IWL_UCODE_TLV_INST:
-                       pieces->inst = tlv_data;
-                       pieces->inst_size = tlv_len;
-                       break;
-               case IWL_UCODE_TLV_DATA:
-                       pieces->data = tlv_data;
-                       pieces->data_size = tlv_len;
-                       break;
-               case IWL_UCODE_TLV_INIT:
-                       pieces->init = tlv_data;
-                       pieces->init_size = tlv_len;
-                       break;
-               case IWL_UCODE_TLV_INIT_DATA:
-                       pieces->init_data = tlv_data;
-                       pieces->init_data_size = tlv_len;
-                       break;
-               case IWL_UCODE_TLV_BOOT:
-                       IWL_ERR(priv, "Found unexpected BOOT ucode\n");
-                       break;
-               case IWL_UCODE_TLV_PROBE_MAX_LEN:
-                       if (tlv_len != sizeof(u32))
-                               goto invalid_tlv_len;
-                       capa->max_probe_length =
-                                       le32_to_cpup((__le32 *)tlv_data);
-                       break;
-               case IWL_UCODE_TLV_PAN:
-                       if (tlv_len)
-                               goto invalid_tlv_len;
-                       capa->flags |= IWL_UCODE_TLV_FLAGS_PAN;
-                       break;
-               case IWL_UCODE_TLV_FLAGS:
-                       /* must be at least one u32 */
-                       if (tlv_len < sizeof(u32))
-                               goto invalid_tlv_len;
-                       /* and a proper number of u32s */
-                       if (tlv_len % sizeof(u32))
-                               goto invalid_tlv_len;
-                       /*
-                        * This driver only reads the first u32 as
-                        * right now no more features are defined,
-                        * if that changes then either the driver
-                        * will not work with the new firmware, or
-                        * it'll not take advantage of new features.
-                        */
-                       capa->flags = le32_to_cpup((__le32 *)tlv_data);
-                       break;
-               case IWL_UCODE_TLV_INIT_EVTLOG_PTR:
-                       if (tlv_len != sizeof(u32))
-                               goto invalid_tlv_len;
-                       pieces->init_evtlog_ptr =
-                                       le32_to_cpup((__le32 *)tlv_data);
-                       break;
-               case IWL_UCODE_TLV_INIT_EVTLOG_SIZE:
-                       if (tlv_len != sizeof(u32))
-                               goto invalid_tlv_len;
-                       pieces->init_evtlog_size =
-                                       le32_to_cpup((__le32 *)tlv_data);
-                       break;
-               case IWL_UCODE_TLV_INIT_ERRLOG_PTR:
-                       if (tlv_len != sizeof(u32))
-                               goto invalid_tlv_len;
-                       pieces->init_errlog_ptr =
-                                       le32_to_cpup((__le32 *)tlv_data);
-                       break;
-               case IWL_UCODE_TLV_RUNT_EVTLOG_PTR:
-                       if (tlv_len != sizeof(u32))
-                               goto invalid_tlv_len;
-                       pieces->inst_evtlog_ptr =
-                                       le32_to_cpup((__le32 *)tlv_data);
-                       break;
-               case IWL_UCODE_TLV_RUNT_EVTLOG_SIZE:
-                       if (tlv_len != sizeof(u32))
-                               goto invalid_tlv_len;
-                       pieces->inst_evtlog_size =
-                                       le32_to_cpup((__le32 *)tlv_data);
-                       break;
-               case IWL_UCODE_TLV_RUNT_ERRLOG_PTR:
-                       if (tlv_len != sizeof(u32))
-                               goto invalid_tlv_len;
-                       pieces->inst_errlog_ptr =
-                                       le32_to_cpup((__le32 *)tlv_data);
-                       break;
-               case IWL_UCODE_TLV_ENHANCE_SENS_TBL:
-                       if (tlv_len)
-                               goto invalid_tlv_len;
-                       priv->enhance_sensitivity_table = true;
-                       break;
-               case IWL_UCODE_TLV_WOWLAN_INST:
-                       pieces->wowlan_inst = tlv_data;
-                       pieces->wowlan_inst_size = tlv_len;
-                       break;
-               case IWL_UCODE_TLV_WOWLAN_DATA:
-                       pieces->wowlan_data = tlv_data;
-                       pieces->wowlan_data_size = tlv_len;
-                       break;
-               case IWL_UCODE_TLV_PHY_CALIBRATION_SIZE:
-                       if (tlv_len != sizeof(u32))
-                               goto invalid_tlv_len;
-                       capa->standard_phy_calibration_size =
-                                       le32_to_cpup((__le32 *)tlv_data);
-                       break;
-               default:
-                       IWL_DEBUG_INFO(priv, "unknown TLV: %d\n", tlv_type);
-                       break;
-               }
-       }
-
-       if (len) {
-               IWL_ERR(priv, "invalid TLV after parsing: %zd\n", len);
-               iwl_print_hex_dump(priv, IWL_DL_FW, (u8 *)data, len);
-               return -EINVAL;
-       }
-
-       return 0;
-
- invalid_tlv_len:
-       IWL_ERR(priv, "TLV %d has invalid size: %u\n", tlv_type, tlv_len);
-       iwl_print_hex_dump(priv, IWL_DL_FW, tlv_data, tlv_len);
-
-       return -EINVAL;
-}
-
-/**
- * iwl_ucode_callback - callback when firmware was loaded
- *
- * If loaded successfully, copies the firmware into buffers
- * for the card to fetch (via DMA).
- */
-static void iwl_ucode_callback(const struct firmware *ucode_raw, void *context)
-{
-       struct iwl_priv *priv = context;
-       struct iwl_ucode_header *ucode;
-       int err;
-       struct iwlagn_firmware_pieces pieces;
-       const unsigned int api_max = cfg(priv)->ucode_api_max;
-       unsigned int api_ok = cfg(priv)->ucode_api_ok;
-       const unsigned int api_min = cfg(priv)->ucode_api_min;
-       u32 api_ver;
-       char buildstr[25];
-       u32 build;
-       struct iwlagn_ucode_capabilities ucode_capa = {
-               .max_probe_length = 200,
-               .standard_phy_calibration_size =
-                       IWL_DEFAULT_STANDARD_PHY_CALIBRATE_TBL_SIZE,
-       };
-
-       if (!api_ok)
-               api_ok = api_max;
-
-       memset(&pieces, 0, sizeof(pieces));
-
-       if (!ucode_raw) {
-               if (priv->fw_index <= api_ok)
-                       IWL_ERR(priv,
-                               "request for firmware file '%s' failed.\n",
-                               priv->firmware_name);
-               goto try_again;
-       }
-
-       IWL_DEBUG_INFO(priv, "Loaded firmware file '%s' (%zd bytes).\n",
-                      priv->firmware_name, ucode_raw->size);
-
-       /* Make sure that we got at least the API version number */
-       if (ucode_raw->size < 4) {
-               IWL_ERR(priv, "File size way too small!\n");
-               goto try_again;
-       }
-
-       /* Data from ucode file:  header followed by uCode images */
-       ucode = (struct iwl_ucode_header *)ucode_raw->data;
-
-       if (ucode->ver)
-               err = iwlagn_load_legacy_firmware(priv, ucode_raw, &pieces);
-       else
-               err = iwlagn_load_firmware(priv, ucode_raw, &pieces,
-                                          &ucode_capa);
-
-       if (err)
-               goto try_again;
-
-       api_ver = IWL_UCODE_API(priv->ucode_ver);
-       build = pieces.build;
-
-       /*
-        * api_ver should match the api version forming part of the
-        * firmware filename ... but we don't check for that and only rely
-        * on the API version read from firmware header from here on forward
-        */
-       /* no api version check required for experimental uCode */
-       if (priv->fw_index != UCODE_EXPERIMENTAL_INDEX) {
-               if (api_ver < api_min || api_ver > api_max) {
-                       IWL_ERR(priv,
-                               "Driver unable to support your firmware API. "
-                               "Driver supports v%u, firmware is v%u.\n",
-                               api_max, api_ver);
-                       goto try_again;
-               }
-
-               if (api_ver < api_ok) {
-                       if (api_ok != api_max)
-                               IWL_ERR(priv, "Firmware has old API version, "
-                                       "expected v%u through v%u, got v%u.\n",
-                                       api_ok, api_max, api_ver);
-                       else
-                               IWL_ERR(priv, "Firmware has old API version, "
-                                       "expected v%u, got v%u.\n",
-                                       api_max, api_ver);
-                       IWL_ERR(priv, "New firmware can be obtained from "
-                                     "http://www.intellinuxwireless.org/.\n");
-               }
-       }
-
-       if (build)
-               sprintf(buildstr, " build %u%s", build,
-                      (priv->fw_index == UCODE_EXPERIMENTAL_INDEX)
-                               ? " (EXP)" : "");
-       else
-               buildstr[0] = '\0';
-
-       IWL_INFO(priv, "loaded firmware version %u.%u.%u.%u%s\n",
-                IWL_UCODE_MAJOR(priv->ucode_ver),
-                IWL_UCODE_MINOR(priv->ucode_ver),
-                IWL_UCODE_API(priv->ucode_ver),
-                IWL_UCODE_SERIAL(priv->ucode_ver),
-                buildstr);
-
-       snprintf(priv->hw->wiphy->fw_version,
-                sizeof(priv->hw->wiphy->fw_version),
-                "%u.%u.%u.%u%s",
-                IWL_UCODE_MAJOR(priv->ucode_ver),
-                IWL_UCODE_MINOR(priv->ucode_ver),
-                IWL_UCODE_API(priv->ucode_ver),
-                IWL_UCODE_SERIAL(priv->ucode_ver),
-                buildstr);
-
-       /*
-        * For any of the failures below (before allocating pci memory)
-        * we will try to load a version with a smaller API -- maybe the
-        * user just got a corrupted version of the latest API.
-        */
-
-       IWL_DEBUG_INFO(priv, "f/w package hdr ucode version raw = 0x%x\n",
-                      priv->ucode_ver);
-       IWL_DEBUG_INFO(priv, "f/w package hdr runtime inst size = %Zd\n",
-                      pieces.inst_size);
-       IWL_DEBUG_INFO(priv, "f/w package hdr runtime data size = %Zd\n",
-                      pieces.data_size);
-       IWL_DEBUG_INFO(priv, "f/w package hdr init inst size = %Zd\n",
-                      pieces.init_size);
-       IWL_DEBUG_INFO(priv, "f/w package hdr init data size = %Zd\n",
-                      pieces.init_data_size);
-
-       /* Verify that uCode images will fit in card's SRAM */
-       if (pieces.inst_size > hw_params(priv).max_inst_size) {
-               IWL_ERR(priv, "uCode instr len %Zd too large to fit in\n",
-                       pieces.inst_size);
-               goto try_again;
-       }
-
-       if (pieces.data_size > hw_params(priv).max_data_size) {
-               IWL_ERR(priv, "uCode data len %Zd too large to fit in\n",
-                       pieces.data_size);
-               goto try_again;
-       }
-
-       if (pieces.init_size > hw_params(priv).max_inst_size) {
-               IWL_ERR(priv, "uCode init instr len %Zd too large to fit in\n",
-                       pieces.init_size);
-               goto try_again;
-       }
-
-       if (pieces.init_data_size > hw_params(priv).max_data_size) {
-               IWL_ERR(priv, "uCode init data len %Zd too large to fit in\n",
-                       pieces.init_data_size);
-               goto try_again;
-       }
-
-       /* Allocate ucode buffers for card's bus-master loading ... */
-
-       /* Runtime instructions and 2 copies of data:
-        * 1) unmodified from disk
-        * 2) backup cache for save/restore during power-downs */
-       if (iwl_alloc_fw_desc(bus(priv), &trans(priv)->ucode_rt.code,
-                             pieces.inst, pieces.inst_size))
-               goto err_pci_alloc;
-       if (iwl_alloc_fw_desc(bus(priv), &trans(priv)->ucode_rt.data,
-                             pieces.data, pieces.data_size))
-               goto err_pci_alloc;
-
-       /* Initialization instructions and data */
-       if (pieces.init_size && pieces.init_data_size) {
-               if (iwl_alloc_fw_desc(bus(priv), &trans(priv)->ucode_init.code,
-                                     pieces.init, pieces.init_size))
-                       goto err_pci_alloc;
-               if (iwl_alloc_fw_desc(bus(priv), &trans(priv)->ucode_init.data,
-                                     pieces.init_data, pieces.init_data_size))
-                       goto err_pci_alloc;
-       }
-
-       /* WoWLAN instructions and data */
-       if (pieces.wowlan_inst_size && pieces.wowlan_data_size) {
-               if (iwl_alloc_fw_desc(bus(priv),
-                                     &trans(priv)->ucode_wowlan.code,
-                                     pieces.wowlan_inst,
-                                     pieces.wowlan_inst_size))
-                       goto err_pci_alloc;
-               if (iwl_alloc_fw_desc(bus(priv),
-                                     &trans(priv)->ucode_wowlan.data,
-                                     pieces.wowlan_data,
-                                     pieces.wowlan_data_size))
-                       goto err_pci_alloc;
-       }
-
-       /* Now that we can no longer fail, copy information */
-
-       /*
-        * The (size - 16) / 12 formula is based on the information recorded
-        * for each event, which is of mode 1 (including timestamp) for all
-        * new microcodes that include this information.
-        */
-       priv->init_evtlog_ptr = pieces.init_evtlog_ptr;
-       if (pieces.init_evtlog_size)
-               priv->init_evtlog_size = (pieces.init_evtlog_size - 16)/12;
-       else
-               priv->init_evtlog_size =
-                       cfg(priv)->base_params->max_event_log_size;
-       priv->init_errlog_ptr = pieces.init_errlog_ptr;
-       priv->inst_evtlog_ptr = pieces.inst_evtlog_ptr;
-       if (pieces.inst_evtlog_size)
-               priv->inst_evtlog_size = (pieces.inst_evtlog_size - 16)/12;
-       else
-               priv->inst_evtlog_size =
-                       cfg(priv)->base_params->max_event_log_size;
-       priv->inst_errlog_ptr = pieces.inst_errlog_ptr;
-#ifndef CONFIG_IWLWIFI_P2P
-       ucode_capa.flags &= ~IWL_UCODE_TLV_FLAGS_PAN;
-#endif
-
-       priv->new_scan_threshold_behaviour =
-               !!(ucode_capa.flags & IWL_UCODE_TLV_FLAGS_NEWSCAN);
-
-       if (!(cfg(priv)->sku & EEPROM_SKU_CAP_IPAN_ENABLE))
-               ucode_capa.flags &= ~IWL_UCODE_TLV_FLAGS_PAN;
-
-       /*
-        * if not PAN, then don't support P2P -- might be a uCode
-        * packaging bug or due to the eeprom check above
-        */
-       if (!(ucode_capa.flags & IWL_UCODE_TLV_FLAGS_PAN))
-               ucode_capa.flags &= ~IWL_UCODE_TLV_FLAGS_P2P;
-
-       if (ucode_capa.flags & IWL_UCODE_TLV_FLAGS_PAN) {
-               priv->sta_key_max_num = STA_KEY_MAX_NUM_PAN;
-               priv->shrd->cmd_queue = IWL_IPAN_CMD_QUEUE_NUM;
-       } else {
-               priv->sta_key_max_num = STA_KEY_MAX_NUM;
-               priv->shrd->cmd_queue = IWL_DEFAULT_CMD_QUEUE_NUM;
-       }
-       /*
-        * figure out the offset of chain noise reset and gain commands
-        * base on the size of standard phy calibration commands table size
-        */
-       if (ucode_capa.standard_phy_calibration_size >
-           IWL_MAX_PHY_CALIBRATE_TBL_SIZE)
-               ucode_capa.standard_phy_calibration_size =
-                       IWL_MAX_STANDARD_PHY_CALIBRATE_TBL_SIZE;
-
-       priv->phy_calib_chain_noise_reset_cmd =
-               ucode_capa.standard_phy_calibration_size;
-       priv->phy_calib_chain_noise_gain_cmd =
-               ucode_capa.standard_phy_calibration_size + 1;
-
-       /* initialize all valid contexts */
-       iwl_init_context(priv, ucode_capa.flags);
-
-       /**************************************************
-        * This is still part of probe() in a sense...
-        *
-        * 9. Setup and register with mac80211 and debugfs
-        **************************************************/
-       err = iwlagn_mac_setup_register(priv, &ucode_capa);
-       if (err)
-               goto out_unbind;
-
-       err = iwl_dbgfs_register(priv, DRV_NAME);
-       if (err)
-               IWL_ERR(priv, "failed to create debugfs files. Ignoring error: %d\n", err);
-
-       /* We have our copies now, allow OS release its copies */
-       release_firmware(ucode_raw);
-       complete(&priv->firmware_loading_complete);
-       return;
-
- try_again:
-       /* try next, if any */
-       if (iwl_request_firmware(priv, false))
-               goto out_unbind;
-       release_firmware(ucode_raw);
-       return;
-
- err_pci_alloc:
-       IWL_ERR(priv, "failed to allocate pci memory\n");
-       iwl_dealloc_ucode(trans(priv));
- out_unbind:
-       complete(&priv->firmware_loading_complete);
-       device_release_driver(bus(priv)->dev);
-       release_firmware(ucode_raw);
-}
-
 static void iwl_rf_kill_ct_config(struct iwl_priv *priv)
 {
        struct iwl_ct_kill_config cmd;
@@ -1120,7 +556,7 @@ static void iwl_rf_kill_ct_config(struct iwl_priv *priv)
        int ret = 0;
 
        spin_lock_irqsave(&priv->shrd->lock, flags);
-       iwl_write32(bus(priv), CSR_UCODE_DRV_GP1_CLR,
+       iwl_write32(trans(priv), CSR_UCODE_DRV_GP1_CLR,
                    CSR_UCODE_DRV_GP1_REG_BIT_CT_KILL_EXIT);
        spin_unlock_irqrestore(&priv->shrd->lock, flags);
        priv->thermal_throttle.ct_kill_toggle = false;
@@ -1182,7 +618,7 @@ static int iwlagn_send_tx_ant_config(struct iwl_priv *priv, u8 valid_tx_ant)
          .valid = cpu_to_le32(valid_tx_ant),
        };
 
-       if (IWL_UCODE_API(priv->ucode_ver) > 1) {
+       if (IWL_UCODE_API(nic(priv)->fw.ucode_ver) > 1) {
                IWL_DEBUG_HC(priv, "select valid tx ant: %u\n", valid_tx_ant);
                return iwl_trans_send_cmd_pdu(trans(priv),
                                        TX_ANT_CONFIGURATION_CMD,
@@ -1205,9 +641,6 @@ int iwl_alive_start(struct iwl_priv *priv)
        int ret = 0;
        struct iwl_rxon_context *ctx = &priv->contexts[IWL_RXON_CTX_BSS];
 
-       /*TODO: this should go to the transport layer */
-       iwl_reset_ict(trans(priv));
-
        IWL_DEBUG_INFO(priv, "Runtime Alive received.\n");
 
        /* After the ALIVE response, we can send host commands to the uCode */
@@ -1219,6 +652,11 @@ int iwl_alive_start(struct iwl_priv *priv)
        if (iwl_is_rfkill(priv->shrd))
                return -ERFKILL;
 
+       if (priv->event_log.ucode_trace) {
+               /* start collecting data now */
+               mod_timer(&priv->ucode_trace, jiffies);
+       }
+
        /* download priority table before any calibration request */
        if (cfg(priv)->bt_params &&
            cfg(priv)->bt_params->advanced_bt_coexist) {
@@ -1300,14 +738,14 @@ int iwl_alive_start(struct iwl_priv *priv)
        return iwl_power_update_mode(priv, true);
 }
 
-static void iwl_cancel_deferred_work(struct iwl_priv *priv);
-
-void __iwl_down(struct iwl_priv *priv)
+void iwl_down(struct iwl_priv *priv)
 {
        int exit_pending;
 
        IWL_DEBUG_INFO(priv, DRV_NAME " is going down\n");
 
+       lockdep_assert_held(&priv->shrd->mutex);
+
        iwl_scan_cancel_timeout(priv, 200);
 
        /*
@@ -1365,15 +803,6 @@ void __iwl_down(struct iwl_priv *priv)
        priv->beacon_skb = NULL;
 }
 
-void iwl_down(struct iwl_priv *priv)
-{
-       mutex_lock(&priv->shrd->mutex);
-       __iwl_down(priv);
-       mutex_unlock(&priv->shrd->mutex);
-
-       iwl_cancel_deferred_work(priv);
-}
-
 /*****************************************************************************
  *
  * Workqueue callbacks
@@ -1431,7 +860,7 @@ void iwlagn_prepare_restart(struct iwl_priv *priv)
        bt_status = priv->bt_status;
        bt_is_sco = priv->bt_is_sco;
 
-       __iwl_down(priv);
+       iwl_down(priv);
 
        priv->bt_full_concurrent = bt_full_concurrent;
        priv->bt_ci_compliance = bt_ci_compliance;
@@ -1501,7 +930,7 @@ static void iwlagn_disable_roc_work(struct work_struct *work)
 
 static void iwl_setup_deferred_work(struct iwl_priv *priv)
 {
-       priv->shrd->workqueue = create_singlethread_workqueue(DRV_NAME);
+       priv->workqueue = create_singlethread_workqueue(DRV_NAME);
 
        init_waitqueue_head(&priv->shrd->wait_command_queue);
 
@@ -1532,7 +961,7 @@ static void iwl_setup_deferred_work(struct iwl_priv *priv)
        priv->watchdog.function = iwl_bg_watchdog;
 }
 
-static void iwl_cancel_deferred_work(struct iwl_priv *priv)
+void iwl_cancel_deferred_work(struct iwl_priv *priv)
 {
        if (cfg(priv)->lib->cancel_deferred_work)
                cfg(priv)->lib->cancel_deferred_work(priv);
@@ -1649,18 +1078,11 @@ static void iwl_uninit_drv(struct iwl_priv *priv)
 #endif
 }
 
-
-
-static u32 iwl_hw_detect(struct iwl_priv *priv)
-{
-       return iwl_read32(bus(priv), CSR_HW_REV);
-}
-
 /* Size of one Rx buffer in host DRAM */
 #define IWL_RX_BUF_SIZE_4K (4 * 1024)
 #define IWL_RX_BUF_SIZE_8K (8 * 1024)
 
-static int iwl_set_hw_params(struct iwl_priv *priv)
+static void iwl_set_hw_params(struct iwl_priv *priv)
 {
        if (iwlagn_mod_params.amsdu_size_8K)
                hw_params(priv).rx_page_order =
@@ -1680,39 +1102,39 @@ static int iwl_set_hw_params(struct iwl_priv *priv)
        hw_params(priv).wd_timeout = cfg(priv)->base_params->wd_timeout;
 
        /* Device-specific setup */
-       return cfg(priv)->lib->set_hw_params(priv);
+       cfg(priv)->lib->set_hw_params(priv);
 }
 
 
 
 static void iwl_debug_config(struct iwl_priv *priv)
 {
-       dev_printk(KERN_INFO, bus(priv)->dev, "CONFIG_IWLWIFI_DEBUG "
+       dev_printk(KERN_INFO, trans(priv)->dev, "CONFIG_IWLWIFI_DEBUG "
 #ifdef CONFIG_IWLWIFI_DEBUG
                "enabled\n");
 #else
                "disabled\n");
 #endif
-       dev_printk(KERN_INFO, bus(priv)->dev, "CONFIG_IWLWIFI_DEBUGFS "
+       dev_printk(KERN_INFO, trans(priv)->dev, "CONFIG_IWLWIFI_DEBUGFS "
 #ifdef CONFIG_IWLWIFI_DEBUGFS
                "enabled\n");
 #else
                "disabled\n");
 #endif
-       dev_printk(KERN_INFO, bus(priv)->dev, "CONFIG_IWLWIFI_DEVICE_TRACING "
+       dev_printk(KERN_INFO, trans(priv)->dev, "CONFIG_IWLWIFI_DEVICE_TRACING "
 #ifdef CONFIG_IWLWIFI_DEVICE_TRACING
                "enabled\n");
 #else
                "disabled\n");
 #endif
 
-       dev_printk(KERN_INFO, bus(priv)->dev, "CONFIG_IWLWIFI_DEVICE_TESTMODE "
+       dev_printk(KERN_INFO, trans(priv)->dev, "CONFIG_IWLWIFI_DEVICE_TESTMODE "
 #ifdef CONFIG_IWLWIFI_DEVICE_TESTMODE
                "enabled\n");
 #else
                "disabled\n");
 #endif
-       dev_printk(KERN_INFO, bus(priv)->dev, "CONFIG_IWLWIFI_P2P "
+       dev_printk(KERN_INFO, trans(priv)->dev, "CONFIG_IWLWIFI_P2P "
 #ifdef CONFIG_IWLWIFI_P2P
                "enabled\n");
 #else
@@ -1720,46 +1142,43 @@ static void iwl_debug_config(struct iwl_priv *priv)
 #endif
 }
 
-int iwl_probe(struct iwl_bus *bus, const struct iwl_trans_ops *trans_ops,
-               struct iwl_cfg *cfg)
+static struct iwl_op_mode *iwl_op_mode_dvm_start(struct iwl_trans *trans)
 {
+       struct iwl_fw *fw = &nic(trans)->fw;
        int err = 0;
        struct iwl_priv *priv;
        struct ieee80211_hw *hw;
+       struct iwl_op_mode *op_mode;
        u16 num_mac;
-       u32 hw_rev;
+       u32 ucode_flags;
 
        /************************
         * 1. Allocating HW data
         ************************/
        hw = iwl_alloc_all();
        if (!hw) {
-               pr_err("%s: Cannot allocate network device\n", cfg->name);
+               pr_err("%s: Cannot allocate network device\n",
+                               cfg(trans)->name);
                err = -ENOMEM;
                goto out;
        }
 
-       priv = hw->priv;
-       priv->shrd = &priv->_shrd;
-       bus->shrd = priv->shrd;
-       priv->shrd->bus = bus;
+       op_mode = hw->priv;
+       op_mode->ops = &iwl_dvm_ops;
+       priv = IWL_OP_MODE_GET_DVM(op_mode);
+       priv->shrd = trans->shrd;
        priv->shrd->priv = priv;
 
-       priv->shrd->trans = trans_ops->alloc(priv->shrd);
-       if (priv->shrd->trans == NULL) {
-               err = -ENOMEM;
-               goto out_free_traffic_mem;
-       }
+       iwl_trans_configure(trans(priv), op_mode);
 
        /* At this point both hw and priv are allocated. */
 
-       SET_IEEE80211_DEV(hw, bus(priv)->dev);
+       SET_IEEE80211_DEV(priv->hw, trans(priv)->dev);
 
-       /* what debugging capabilities we have */
+       /* show what debugging capabilities we have */
        iwl_debug_config(priv);
 
        IWL_DEBUG_INFO(priv, "*** LOAD DRIVER ***\n");
-       cfg(priv) = cfg;
 
        /* is antenna coupling more than 35dB ? */
        priv->bt_ant_couple_ok =
@@ -1778,41 +1197,29 @@ int iwl_probe(struct iwl_bus *bus, const struct iwl_trans_ops *trans_ops,
        /* these spin locks will be used in apm_ops.init and EEPROM access
         * we should init now
         */
-       spin_lock_init(&bus(priv)->reg_lock);
+       spin_lock_init(&trans(priv)->reg_lock);
        spin_lock_init(&priv->shrd->lock);
 
-       /*
-        * stop and reset the on-board processor just in case it is in a
-        * strange state ... like being left stranded by a primary kernel
-        * and this is now the kdump kernel trying to start up
-        */
-       iwl_write32(bus(priv), CSR_RESET, CSR_RESET_REG_FLAG_NEVO_RESET);
-
        /***********************
         * 3. Read REV register
         ***********************/
-       hw_rev = iwl_hw_detect(priv);
        IWL_INFO(priv, "Detected %s, REV=0x%X\n",
-               cfg(priv)->name, hw_rev);
+               cfg(priv)->name, trans(priv)->hw_rev);
 
-       err = iwl_trans_request_irq(trans(priv));
+       err = iwl_trans_start_hw(trans(priv));
        if (err)
-               goto out_free_trans;
-
-       if (iwl_trans_prepare_card_hw(trans(priv))) {
-               err = -EIO;
-               IWL_WARN(priv, "Failed, HW not ready\n");
-               goto out_free_trans;
-       }
+               goto out_free_traffic_mem;
 
        /*****************
         * 4. Read EEPROM
         *****************/
        /* Read the EEPROM */
-       err = iwl_eeprom_init(priv, hw_rev);
+       err = iwl_eeprom_init(trans(priv), trans(priv)->hw_rev);
+       /* Reset chip to save power until we load uCode during "up". */
+       iwl_trans_stop_hw(trans(priv));
        if (err) {
                IWL_ERR(priv, "Unable to init EEPROM\n");
-               goto out_free_trans;
+               goto out_free_traffic_mem;
        }
        err = iwl_eeprom_check_version(priv);
        if (err)
@@ -1838,11 +1245,23 @@ int iwl_probe(struct iwl_bus *bus, const struct iwl_trans_ops *trans_ops,
        /************************
         * 5. Setup HW constants
         ************************/
-       if (iwl_set_hw_params(priv)) {
-               err = -ENOENT;
-               IWL_ERR(priv, "failed to set hw parameters\n");
-               goto out_free_eeprom;
-       }
+       iwl_set_hw_params(priv);
+
+       ucode_flags = fw->ucode_capa.flags;
+
+#ifndef CONFIG_IWLWIFI_P2P
+       ucode_flags &= ~IWL_UCODE_TLV_FLAGS_PAN;
+#endif
+       if (!(hw_params(priv).sku & EEPROM_SKU_CAP_IPAN_ENABLE))
+               ucode_flags &= ~IWL_UCODE_TLV_FLAGS_PAN;
+
+       /*
+        * if not PAN, then don't support P2P -- might be a uCode
+        * packaging bug or due to the eeprom check above
+        */
+       if (!(ucode_flags & IWL_UCODE_TLV_FLAGS_PAN))
+               ucode_flags &= ~IWL_UCODE_TLV_FLAGS_P2P;
+
 
        /*******************
         * 6. Setup priv
@@ -1860,51 +1279,68 @@ int iwl_probe(struct iwl_bus *bus, const struct iwl_trans_ops *trans_ops,
        iwl_setup_rx_handlers(priv);
        iwl_testmode_init(priv);
 
-       /*********************************************
-        * 8. Enable interrupts
-        *********************************************/
+       iwl_power_initialize(priv);
+       iwl_tt_initialize(priv);
 
-       iwl_enable_rfkill_int(priv);
+       snprintf(priv->hw->wiphy->fw_version,
+                sizeof(priv->hw->wiphy->fw_version),
+                "%s", fw->fw_version);
 
-       /* If platform's RF_KILL switch is NOT set to KILL */
-       if (iwl_read32(bus(priv),
-                       CSR_GP_CNTRL) & CSR_GP_CNTRL_REG_FLAG_HW_RF_KILL_SW)
-               clear_bit(STATUS_RF_KILL_HW, &priv->shrd->status);
-       else
-               set_bit(STATUS_RF_KILL_HW, &priv->shrd->status);
+       priv->new_scan_threshold_behaviour =
+               !!(ucode_flags & IWL_UCODE_TLV_FLAGS_NEWSCAN);
 
-       wiphy_rfkill_set_hw_state(priv->hw->wiphy,
-               test_bit(STATUS_RF_KILL_HW, &priv->shrd->status));
+       if (ucode_flags & IWL_UCODE_TLV_FLAGS_PAN) {
+               priv->sta_key_max_num = STA_KEY_MAX_NUM_PAN;
+               priv->shrd->cmd_queue = IWL_IPAN_CMD_QUEUE_NUM;
+       } else {
+               priv->sta_key_max_num = STA_KEY_MAX_NUM;
+               priv->shrd->cmd_queue = IWL_DEFAULT_CMD_QUEUE_NUM;
+       }
 
-       iwl_power_initialize(priv);
-       iwl_tt_initialize(priv);
+       priv->phy_calib_chain_noise_reset_cmd =
+               fw->ucode_capa.standard_phy_calibration_size;
+       priv->phy_calib_chain_noise_gain_cmd =
+               fw->ucode_capa.standard_phy_calibration_size + 1;
 
-       init_completion(&priv->firmware_loading_complete);
+       /* initialize all valid contexts */
+       iwl_init_context(priv, ucode_flags);
 
-       err = iwl_request_firmware(priv, true);
+       /**************************************************
+        * This is still part of probe() in a sense...
+        *
+        * 9. Setup and register with mac80211 and debugfs
+        **************************************************/
+       err = iwlagn_mac_setup_register(priv, &fw->ucode_capa);
        if (err)
                goto out_destroy_workqueue;
 
-       return 0;
+       err = iwl_dbgfs_register(priv, DRV_NAME);
+       if (err)
+               IWL_ERR(priv,
+                       "failed to create debugfs files. Ignoring error: %d\n",
+                       err);
+
+       return op_mode;
 
 out_destroy_workqueue:
-       destroy_workqueue(priv->shrd->workqueue);
-       priv->shrd->workqueue = NULL;
+       destroy_workqueue(priv->workqueue);
+       priv->workqueue = NULL;
        iwl_uninit_drv(priv);
 out_free_eeprom:
        iwl_eeprom_free(priv->shrd);
-out_free_trans:
-       iwl_trans_free(trans(priv));
 out_free_traffic_mem:
        iwl_free_traffic_mem(priv);
        ieee80211_free_hw(priv->hw);
 out:
-       return err;
+       op_mode = NULL;
+       return op_mode;
 }
 
-void __devexit iwl_remove(struct iwl_priv * priv)
+static void iwl_op_mode_dvm_stop(struct iwl_op_mode *op_mode)
 {
-       wait_for_completion(&priv->firmware_loading_complete);
+       struct iwl_priv *priv = IWL_OP_MODE_GET_DVM(op_mode);
+
+       wait_for_completion(&nic(priv)->request_firmware_complete);
 
        IWL_DEBUG_INFO(priv, "*** UNLOAD DRIVER ***\n");
 
@@ -1924,22 +1360,20 @@ void __devexit iwl_remove(struct iwl_priv * priv)
        /*This will stop the queues, move the device to low power state */
        iwl_trans_stop_device(trans(priv));
 
-       iwl_dealloc_ucode(trans(priv));
+       iwl_dealloc_ucode(nic(priv));
 
        iwl_eeprom_free(priv->shrd);
 
        /*netif_stop_queue(dev); */
-       flush_workqueue(priv->shrd->workqueue);
+       flush_workqueue(priv->workqueue);
 
        /* ieee80211_unregister_hw calls iwlagn_mac_stop, which flushes
-        * priv->shrd->workqueue... so we can't take down the workqueue
+        * priv->workqueue... so we can't take down the workqueue
         * until now... */
-       destroy_workqueue(priv->shrd->workqueue);
-       priv->shrd->workqueue = NULL;
+       destroy_workqueue(priv->workqueue);
+       priv->workqueue = NULL;
        iwl_free_traffic_mem(priv);
 
-       iwl_trans_free(trans(priv));
-
        iwl_uninit_drv(priv);
 
        dev_kfree_skb(priv->beacon_skb);
@@ -1947,6 +1381,16 @@ void __devexit iwl_remove(struct iwl_priv * priv)
        ieee80211_free_hw(priv->hw);
 }
 
+const struct iwl_op_mode_ops iwl_dvm_ops = {
+       .start = iwl_op_mode_dvm_start,
+       .stop = iwl_op_mode_dvm_stop,
+       .rx = iwl_rx_dispatch,
+       .queue_full = iwl_stop_sw_queue,
+       .queue_not_full = iwl_wake_sw_queue,
+       .hw_rf_kill = iwl_set_hw_rfkill_state,
+       .free_skb = iwl_free_skb,
+       .nic_error = iwl_nic_error,
+};
 
 /*****************************************************************************
  *
@@ -2054,7 +1498,7 @@ MODULE_PARM_DESC(bt_coex_active, "enable wifi/bt co-exist (default: enable)");
 
 module_param_named(led_mode, iwlagn_mod_params.led_mode, int, S_IRUGO);
 MODULE_PARM_DESC(led_mode, "0=system default, "
-               "1=On(RF On)/Off(RF Off), 2=blinking (default: 0)");
+               "1=On(RF On)/Off(RF Off), 2=blinking, 3=Off (default: 0)");
 
 module_param_named(power_save, iwlagn_mod_params.power_save,
                bool, S_IRUGO);
index f84fb3c..cb484e2 100644 (file)
@@ -5,7 +5,7 @@
  *
  * GPL LICENSE SUMMARY
  *
- * Copyright(c) 2008 - 2011 Intel Corporation. All rights reserved.
+ * Copyright(c) 2008 - 2012 Intel Corporation. All rights reserved.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of version 2 of the GNU General Public License as
@@ -30,7 +30,7 @@
  *
  * BSD LICENSE
  *
- * Copyright(c) 2005 - 2011 Intel Corporation. All rights reserved.
+ * Copyright(c) 2005 - 2012 Intel Corporation. All rights reserved.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
 
 #include "iwl-dev.h"
 
-struct iwlagn_ucode_capabilities {
-       u32 max_probe_length;
-       u32 standard_phy_calibration_size;
-       u32 flags;
-};
+struct iwl_ucode_capabilities;
 
 extern struct ieee80211_ops iwlagn_hw_ops;
 
-int iwl_reset_ict(struct iwl_trans *trans);
-
 static inline void iwl_set_calib_hdr(struct iwl_calib_hdr *hdr, u8 cmd)
 {
        hdr->op_code = cmd;
@@ -83,14 +77,23 @@ static inline void iwl_set_calib_hdr(struct iwl_calib_hdr *hdr, u8 cmd)
        hdr->data_valid = 1;
 }
 
-void __iwl_down(struct iwl_priv *priv);
 void iwl_down(struct iwl_priv *priv);
+void iwl_cancel_deferred_work(struct iwl_priv *priv);
 void iwlagn_prepare_restart(struct iwl_priv *priv);
+void iwl_free_skb(struct iwl_op_mode *op_mode, struct sk_buff *skb);
+int __must_check iwl_rx_dispatch(struct iwl_op_mode *op_mode,
+                                struct iwl_rx_mem_buffer *rxb,
+                                struct iwl_device_cmd *cmd);
+void iwl_stop_sw_queue(struct iwl_op_mode *op_mode, u8 ac);
+void iwl_wake_sw_queue(struct iwl_op_mode *op_mode, u8 ac);
+void iwl_set_hw_rfkill_state(struct iwl_op_mode *op_mode, bool state);
+void iwl_stop_sw_queue(struct iwl_op_mode *op_mode, u8 ac);
+void iwl_nic_error(struct iwl_op_mode *op_mode);
 
 /* MAC80211 */
 struct ieee80211_hw *iwl_alloc_all(void);
 int iwlagn_mac_setup_register(struct iwl_priv *priv,
-                             struct iwlagn_ucode_capabilities *capa);
+                             struct iwl_ucode_capabilities *capa);
 void iwlagn_mac_unregister(struct iwl_priv *priv);
 
 /* RXON */
@@ -109,6 +112,7 @@ void iwlagn_config_ht40(struct ieee80211_conf *conf,
 int iwlagn_rx_calib_result(struct iwl_priv *priv,
                            struct iwl_rx_mem_buffer *rxb,
                            struct iwl_device_cmd *cmd);
+void iwl_init_context(struct iwl_priv *priv, u32 ucode_flags);
 
 /* lib */
 int iwlagn_send_tx_power(struct iwl_priv *priv);
@@ -388,4 +392,14 @@ void iwl_testmode_cleanup(struct iwl_priv *priv)
 }
 #endif
 
+#ifdef CONFIG_IWLWIFI_DEBUG
+void iwl_print_rx_config_cmd(struct iwl_priv *priv,
+                            enum iwl_rxon_context_id ctxid);
+#else
+static inline void iwl_print_rx_config_cmd(struct iwl_priv *priv,
+                                          enum iwl_rxon_context_id ctxid)
+{
+}
+#endif
+
 #endif /* __iwl_agn_h__ */
diff --git a/drivers/net/wireless/iwlwifi/iwl-bus.h b/drivers/net/wireless/iwlwifi/iwl-bus.h
deleted file mode 100644 (file)
index 940d503..0000000
+++ /dev/null
@@ -1,209 +0,0 @@
-/******************************************************************************
- *
- * This file is provided under a dual BSD/GPLv2 license.  When using or
- * redistributing this file, you may do so under either license.
- *
- * GPL LICENSE SUMMARY
- *
- * Copyright(c) 2007 - 2011 Intel Corporation. All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of version 2 of the GNU General Public License as
- * published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110,
- * USA
- *
- * The full GNU General Public License is included in this distribution
- * in the file called LICENSE.GPL.
- *
- * Contact Information:
- *  Intel Linux Wireless <ilw@linux.intel.com>
- * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
- *
- * BSD LICENSE
- *
- * Copyright(c) 2005 - 2011 Intel Corporation. All rights reserved.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- *  * Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *  * Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *  * Neither the name Intel Corporation nor the names of its
- *    contributors may be used to endorse or promote products derived
- *    from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- *****************************************************************************/
-#ifndef __iwl_bus_h__
-#define __iwl_bus_h__
-
-#include <linux/types.h>
-#include <linux/spinlock.h>
-
-/**
- * DOC: Bus layer - role and goal
- *
- * iwl-bus.h defines the API to the bus layer of the iwlwifi driver.
- * The bus layer is responsible for doing very basic bus operations that are
- * listed in the iwl_bus_ops structure.
- * The bus layer registers to the bus driver, advertises the supported HW and
- * gets notifications about enumeration, suspend, resume.
- * For the moment, the bus layer is not a linux kernel module as itself, and
- * the module_init function of the driver must call the bus specific
- * registration functions. These functions are listed at the end of this file.
- * For the moment, there is only one implementation of this interface: PCI-e.
- * This implementation is iwl-pci.c
- */
-
-/**
- * DOC: encapsulation and type safety
- *
- * The iwl_bus describes the data that is shared amongst all the bus layer
- * implementations. This data is visible to other layers. Data in the bus
- * specific area is not visible outside the bus specific implementation.
- * iwl_bus holds a pointer to iwl_shared which holds pointer to all the other
- * layers of the driver (iwl_priv, iwl_trans). In fact, this is the way to go
- * when the transport layer needs to call a function of another layer.
- *
- * In order to achieve encapsulation, iwl_priv cannot be dereferenced from the
- * bus layer. Type safety is still kept since functions that gets iwl_priv gets
- * a typed pointer (as opposed to void *).
- */
-
-/**
- * DOC: probe flow
- *
- * The module_init calls the bus specific registration function. The
- * registration to the bus layer will trigger an enumeration of the bus which
- * will call the bus specific probe function.
- * The first thing this function must do is to allocate the memory needed by
- * iwl_bus + the bus_specific data.
- * Once the bus specific probe function has configured the hardware, it
- * chooses the appropriate transport layer and calls iwl_probe that will run
- * the bus independent probe flow.
- *
- * Note: The bus specific code must set the following data in iwl_bus before it
- *       calls iwl_probe:
- *     * bus->dev
- *     * bus->irq
- *     * bus->ops
- */
-
-struct iwl_shared;
-struct iwl_bus;
-
-/**
- * struct iwl_bus_ops - bus specific operations
- * @get_pm_support: must returns true if the bus can go to sleep
- * @apm_config: will be called during the config of the APM
- * @get_hw_id_string: prints the hw_id in the provided buffer
- * @get_hw_id: get hw_id in u32
- * @write8: write a byte to register at offset ofs
- * @write32: write a dword to register at offset ofs
- * @wread32: read a dword at register at offset ofs
- */
-struct iwl_bus_ops {
-       bool (*get_pm_support)(struct iwl_bus *bus);
-       void (*apm_config)(struct iwl_bus *bus);
-       void (*get_hw_id_string)(struct iwl_bus *bus, char buf[], int buf_len);
-       u32 (*get_hw_id)(struct iwl_bus *bus);
-       void (*write8)(struct iwl_bus *bus, u32 ofs, u8 val);
-       void (*write32)(struct iwl_bus *bus, u32 ofs, u32 val);
-       u32 (*read32)(struct iwl_bus *bus, u32 ofs);
-};
-
-/**
- * struct iwl_bus - bus common data
- *
- * This data is common to all bus layer implementations.
- *
- * @dev - pointer to struct device * that represents the device
- * @ops - pointer to iwl_bus_ops
- * @shrd - pointer to iwl_shared which holds shared data from the upper layer
- *     NB: for the time being this needs to be set by the upper layer since
- *     it allocates the shared data
- * @irq - the irq number for the device
- * @reg_lock - protect hw register access
- */
-struct iwl_bus {
-       struct device *dev;
-       const struct iwl_bus_ops *ops;
-       struct iwl_shared *shrd;
-
-       unsigned int irq;
-       spinlock_t reg_lock;
-
-       /* pointer to bus specific struct */
-       /*Ensure that this pointer will always be aligned to sizeof pointer */
-       char bus_specific[0] __attribute__((__aligned__(sizeof(void *))));
-};
-
-static inline bool bus_get_pm_support(struct iwl_bus *bus)
-{
-       return bus->ops->get_pm_support(bus);
-}
-
-static inline void bus_apm_config(struct iwl_bus *bus)
-{
-       bus->ops->apm_config(bus);
-}
-
-static inline void bus_get_hw_id_string(struct iwl_bus *bus, char buf[],
-               int buf_len)
-{
-       bus->ops->get_hw_id_string(bus, buf, buf_len);
-}
-
-static inline u32 bus_get_hw_id(struct iwl_bus *bus)
-{
-       return bus->ops->get_hw_id(bus);
-}
-
-static inline void bus_write8(struct iwl_bus *bus, u32 ofs, u8 val)
-{
-       bus->ops->write8(bus, ofs, val);
-}
-
-static inline void bus_write32(struct iwl_bus *bus, u32 ofs, u32 val)
-{
-       bus->ops->write32(bus, ofs, val);
-}
-
-static inline u32 bus_read32(struct iwl_bus *bus, u32 ofs)
-{
-       return bus->ops->read32(bus, ofs);
-}
-
-/*****************************************************
-* Bus layer registration functions
-******************************************************/
-int __must_check iwl_pci_register_driver(void);
-void iwl_pci_unregister_driver(void);
-
-#endif /* __iwl_bus_h__ */
index e1d7825..1ad14bb 100644 (file)
@@ -5,7 +5,7 @@
  *
  * GPL LICENSE SUMMARY
  *
- * Copyright(c) 2007 - 2011 Intel Corporation. All rights reserved.
+ * Copyright(c) 2007 - 2012 Intel Corporation. All rights reserved.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of version 2 of the GNU General Public License as
@@ -30,7 +30,7 @@
  *
  * BSD LICENSE
  *
- * Copyright(c) 2005 - 2011 Intel Corporation. All rights reserved.
+ * Copyright(c) 2005 - 2012 Intel Corporation. All rights reserved.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -80,6 +80,8 @@ extern struct iwl_cfg iwl6005_2abg_cfg;
 extern struct iwl_cfg iwl6005_2bg_cfg;
 extern struct iwl_cfg iwl6005_2agn_sff_cfg;
 extern struct iwl_cfg iwl6005_2agn_d_cfg;
+extern struct iwl_cfg iwl6005_2agn_mow1_cfg;
+extern struct iwl_cfg iwl6005_2agn_mow2_cfg;
 extern struct iwl_cfg iwl1030_bgn_cfg;
 extern struct iwl_cfg iwl1030_bg_cfg;
 extern struct iwl_cfg iwl6030_2agn_cfg;
index f822ac4..c20618d 100644 (file)
@@ -5,7 +5,7 @@
  *
  * GPL LICENSE SUMMARY
  *
- * Copyright(c) 2005 - 2011 Intel Corporation. All rights reserved.
+ * Copyright(c) 2005 - 2012 Intel Corporation. All rights reserved.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of version 2 of the GNU General Public License as
@@ -30,7 +30,7 @@
  *
  * BSD LICENSE
  *
- * Copyright(c) 2005 - 2011 Intel Corporation. All rights reserved.
+ * Copyright(c) 2005 - 2012 Intel Corporation. All rights reserved.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
index 7bcfa78..275e089 100644 (file)
@@ -2,7 +2,7 @@
  *
  * GPL LICENSE SUMMARY
  *
- * Copyright(c) 2008 - 2011 Intel Corporation. All rights reserved.
+ * Copyright(c) 2008 - 2012 Intel Corporation. All rights reserved.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of version 2 of the GNU General Public License as
 #include "iwl-core.h"
 #include "iwl-io.h"
 #include "iwl-power.h"
-#include "iwl-agn.h"
 #include "iwl-shared.h"
 #include "iwl-agn.h"
 #include "iwl-trans.h"
+#include "iwl-wifi.h"
 
 const u8 iwl_bcast_addr[ETH_ALEN] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
 
@@ -203,10 +203,9 @@ int iwl_init_geos(struct iwl_priv *priv)
 
        if ((priv->bands[IEEE80211_BAND_5GHZ].n_channels == 0) &&
             cfg(priv)->sku & EEPROM_SKU_CAP_BAND_52GHZ) {
-               char buf[32];
-               bus_get_hw_id_string(bus(priv), buf, sizeof(buf));
                IWL_INFO(priv, "Incorrectly detected BG card as ABG. "
-                       "Please send your %s to maintainer.\n", buf);
+                       "Please send your %s to maintainer.\n",
+                       trans(priv)->hw_id_str);
                cfg(priv)->sku &= ~EEPROM_SKU_CAP_BAND_52GHZ;
        }
 
@@ -644,7 +643,7 @@ u8 iwl_get_single_channel_number(struct iwl_priv *priv,
  * NOTE:  Does not commit to the hardware; it sets appropriate bit fields
  * in the staging RXON flag structure based on the ch->band
  */
-int iwl_set_rxon_channel(struct iwl_priv *priv, struct ieee80211_channel *ch,
+void iwl_set_rxon_channel(struct iwl_priv *priv, struct ieee80211_channel *ch,
                         struct iwl_rxon_context *ctx)
 {
        enum ieee80211_band band = ch->band;
@@ -652,7 +651,7 @@ int iwl_set_rxon_channel(struct iwl_priv *priv, struct ieee80211_channel *ch,
 
        if ((le16_to_cpu(ctx->staging.channel) == channel) &&
            (priv->band == band))
-               return 0;
+               return;
 
        ctx->staging.channel = cpu_to_le16(channel);
        if (band == IEEE80211_BAND_5GHZ)
@@ -664,7 +663,6 @@ int iwl_set_rxon_channel(struct iwl_priv *priv, struct ieee80211_channel *ch,
 
        IWL_DEBUG_INFO(priv, "Staging channel set to %d [%d]\n", channel, band);
 
-       return 0;
 }
 
 void iwl_set_flags_for_band(struct iwl_priv *priv,
@@ -832,11 +830,16 @@ void iwl_print_rx_config_cmd(struct iwl_priv *priv,
 }
 #endif
 
-void iwlagn_fw_error(struct iwl_priv *priv, bool ondemand)
+static void iwlagn_fw_error(struct iwl_priv *priv, bool ondemand)
 {
        unsigned int reload_msec;
        unsigned long reload_jiffies;
 
+#ifdef CONFIG_IWLWIFI_DEBUG
+       if (iwl_get_debug_level(priv->shrd) & IWL_DL_FW_ERRORS)
+               iwl_print_rx_config_cmd(priv, IWL_RXON_CTX_BSS);
+#endif
+
        /* Set the FW error flag -- cleared on iwl_down */
        set_bit(STATUS_FW_ERROR, &priv->shrd->status);
 
@@ -876,136 +879,13 @@ void iwlagn_fw_error(struct iwl_priv *priv, bool ondemand)
                if (iwlagn_mod_params.restart_fw) {
                        IWL_DEBUG_FW_ERRORS(priv,
                                  "Restarting adapter due to uCode error.\n");
-                       queue_work(priv->shrd->workqueue, &priv->restart);
+                       queue_work(priv->workqueue, &priv->restart);
                } else
                        IWL_DEBUG_FW_ERRORS(priv,
                                  "Detected FW error, but not restarting\n");
        }
 }
 
-static int iwl_apm_stop_master(struct iwl_priv *priv)
-{
-       int ret = 0;
-
-       /* stop device's busmaster DMA activity */
-       iwl_set_bit(bus(priv), CSR_RESET, CSR_RESET_REG_FLAG_STOP_MASTER);
-
-       ret = iwl_poll_bit(bus(priv), CSR_RESET,
-                       CSR_RESET_REG_FLAG_MASTER_DISABLED,
-                       CSR_RESET_REG_FLAG_MASTER_DISABLED, 100);
-       if (ret)
-               IWL_WARN(priv, "Master Disable Timed Out, 100 usec\n");
-
-       IWL_DEBUG_INFO(priv, "stop master\n");
-
-       return ret;
-}
-
-void iwl_apm_stop(struct iwl_priv *priv)
-{
-       IWL_DEBUG_INFO(priv, "Stop card, put in low power state\n");
-
-       clear_bit(STATUS_DEVICE_ENABLED, &priv->shrd->status);
-
-       /* Stop device's DMA activity */
-       iwl_apm_stop_master(priv);
-
-       /* Reset the entire device */
-       iwl_set_bit(bus(priv), CSR_RESET, CSR_RESET_REG_FLAG_SW_RESET);
-
-       udelay(10);
-
-       /*
-        * Clear "initialization complete" bit to move adapter from
-        * D0A* (powered-up Active) --> D0U* (Uninitialized) state.
-        */
-       iwl_clear_bit(bus(priv), CSR_GP_CNTRL, CSR_GP_CNTRL_REG_FLAG_INIT_DONE);
-}
-
-
-/*
- * Start up NIC's basic functionality after it has been reset
- * (e.g. after platform boot, or shutdown via iwl_apm_stop())
- * NOTE:  This does not load uCode nor start the embedded processor
- */
-int iwl_apm_init(struct iwl_priv *priv)
-{
-       int ret = 0;
-       IWL_DEBUG_INFO(priv, "Init card's basic functions\n");
-
-       /*
-        * Use "set_bit" below rather than "write", to preserve any hardware
-        * bits already set by default after reset.
-        */
-
-       /* Disable L0S exit timer (platform NMI Work/Around) */
-       iwl_set_bit(bus(priv), CSR_GIO_CHICKEN_BITS,
-                         CSR_GIO_CHICKEN_BITS_REG_BIT_DIS_L0S_EXIT_TIMER);
-
-       /*
-        * Disable L0s without affecting L1;
-        *  don't wait for ICH L0s (ICH bug W/A)
-        */
-       iwl_set_bit(bus(priv), CSR_GIO_CHICKEN_BITS,
-                         CSR_GIO_CHICKEN_BITS_REG_BIT_L1A_NO_L0S_RX);
-
-       /* Set FH wait threshold to maximum (HW error during stress W/A) */
-       iwl_set_bit(bus(priv), CSR_DBG_HPET_MEM_REG, CSR_DBG_HPET_MEM_REG_VAL);
-
-       /*
-        * Enable HAP INTA (interrupt from management bus) to
-        * wake device's PCI Express link L1a -> L0s
-        */
-       iwl_set_bit(bus(priv), CSR_HW_IF_CONFIG_REG,
-                                   CSR_HW_IF_CONFIG_REG_BIT_HAP_WAKE_L1A);
-
-       bus_apm_config(bus(priv));
-
-       /* Configure analog phase-lock-loop before activating to D0A */
-       if (cfg(priv)->base_params->pll_cfg_val)
-               iwl_set_bit(bus(priv), CSR_ANA_PLL_CFG,
-                           cfg(priv)->base_params->pll_cfg_val);
-
-       /*
-        * Set "initialization complete" bit to move adapter from
-        * D0U* --> D0A* (powered-up active) state.
-        */
-       iwl_set_bit(bus(priv), CSR_GP_CNTRL, CSR_GP_CNTRL_REG_FLAG_INIT_DONE);
-
-       /*
-        * Wait for clock stabilization; once stabilized, access to
-        * device-internal resources is supported, e.g. iwl_write_prph()
-        * and accesses to uCode SRAM.
-        */
-       ret = iwl_poll_bit(bus(priv), CSR_GP_CNTRL,
-                       CSR_GP_CNTRL_REG_FLAG_MAC_CLOCK_READY,
-                       CSR_GP_CNTRL_REG_FLAG_MAC_CLOCK_READY, 25000);
-       if (ret < 0) {
-               IWL_DEBUG_INFO(priv, "Failed to init the card\n");
-               goto out;
-       }
-
-       /*
-        * Enable DMA clock and wait for it to stabilize.
-        *
-        * Write to "CLK_EN_REG"; "1" bits enable clocks, while "0" bits
-        * do not disable clocks.  This preserves any hardware bits already
-        * set by default in "CLK_CTRL_REG" after reset.
-        */
-       iwl_write_prph(bus(priv), APMG_CLK_EN_REG, APMG_CLK_VAL_DMA_CLK_RQT);
-       udelay(20);
-
-       /* Disable L1-Active */
-       iwl_set_bits_prph(bus(priv), APMG_PCIDEV_STT_REG,
-                         APMG_PCIDEV_STT_VAL_L1_ACT_DIS);
-
-       set_bit(STATUS_DEVICE_ENABLED, &priv->shrd->status);
-
-out:
-       return ret;
-}
-
-
 int iwl_set_tx_power(struct iwl_priv *priv, s8 tx_power, bool force)
 {
        int ret;
@@ -1580,8 +1460,17 @@ __le32 iwl_add_beacon_time(struct iwl_priv *priv, u32 base,
        return cpu_to_le32(res);
 }
 
-void iwl_set_hw_rfkill_state(struct iwl_priv *priv, bool state)
+void iwl_nic_error(struct iwl_op_mode *op_mode)
+{
+       struct iwl_priv *priv = IWL_OP_MODE_GET_DVM(op_mode);
+
+       iwlagn_fw_error(priv, false);
+}
+
+void iwl_set_hw_rfkill_state(struct iwl_op_mode *op_mode, bool state)
 {
+       struct iwl_priv *priv = IWL_OP_MODE_GET_DVM(op_mode);
+
        wiphy_rfkill_set_hw_state(priv->hw->wiphy, state);
 }
 
@@ -1590,8 +1479,9 @@ void iwl_nic_config(struct iwl_priv *priv)
        cfg(priv)->lib->nic_config(priv);
 }
 
-void iwl_free_skb(struct iwl_priv *priv, struct sk_buff *skb)
+void iwl_free_skb(struct iwl_op_mode *op_mode, struct sk_buff *skb)
 {
+       struct iwl_priv *priv = IWL_OP_MODE_GET_DVM(op_mode);
        struct ieee80211_tx_info *info;
 
        info = IEEE80211_SKB_CB(skb);
@@ -1599,12 +1489,16 @@ void iwl_free_skb(struct iwl_priv *priv, struct sk_buff *skb)
        dev_kfree_skb_any(skb);
 }
 
-void iwl_stop_sw_queue(struct iwl_priv *priv, u8 ac)
+void iwl_stop_sw_queue(struct iwl_op_mode *op_mode, u8 ac)
 {
+       struct iwl_priv *priv = IWL_OP_MODE_GET_DVM(op_mode);
+
        ieee80211_stop_queue(priv->hw, ac);
 }
 
-void iwl_wake_sw_queue(struct iwl_priv *priv, u8 ac)
+void iwl_wake_sw_queue(struct iwl_op_mode *op_mode, u8 ac)
 {
+       struct iwl_priv *priv = IWL_OP_MODE_GET_DVM(op_mode);
+
        ieee80211_wake_queue(priv->hw, ac);
 }
index 7bf76ab..42630f5 100644 (file)
@@ -5,7 +5,7 @@
  *
  * GPL LICENSE SUMMARY
  *
- * Copyright(c) 2008 - 2011 Intel Corporation. All rights reserved.
+ * Copyright(c) 2008 - 2012 Intel Corporation. All rights reserved.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of version 2 of the GNU General Public License as
@@ -30,7 +30,7 @@
  *
  * BSD LICENSE
  *
- * Copyright(c) 2005 - 2011 Intel Corporation. All rights reserved.
+ * Copyright(c) 2005 - 2012 Intel Corporation. All rights reserved.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -76,7 +76,7 @@ struct iwl_cmd;
 
 struct iwl_lib_ops {
        /* set hw dependent parameters */
-       int (*set_hw_params)(struct iwl_priv *priv);
+       void (*set_hw_params)(struct iwl_priv *priv);
        /* setup BT Rx handler */
        void (*bt_rx_handler_setup)(struct iwl_priv *priv);
        /* setup BT related deferred work */
@@ -169,7 +169,7 @@ void iwl_set_rxon_hwcrypto(struct iwl_priv *priv, struct iwl_rxon_context *ctx,
                           int hw_decrypt);
 int iwl_check_rxon_cmd(struct iwl_priv *priv, struct iwl_rxon_context *ctx);
 int iwl_full_rxon_required(struct iwl_priv *priv, struct iwl_rxon_context *ctx);
-int iwl_set_rxon_channel(struct iwl_priv *priv, struct ieee80211_channel *ch,
+void iwl_set_rxon_channel(struct iwl_priv *priv, struct ieee80211_channel *ch,
                         struct iwl_rxon_context *ctx);
 void iwl_set_flags_for_band(struct iwl_priv *priv,
                            struct iwl_rxon_context *ctx,
@@ -197,6 +197,8 @@ const char *get_ctrl_string(int cmd);
 void iwl_clear_traffic_stats(struct iwl_priv *priv);
 void iwl_update_stats(struct iwl_priv *priv, bool is_tx, __le16 fc,
                      u16 len);
+void iwl_reset_traffic_log(struct iwl_priv *priv);
+
 #else
 static inline int iwl_alloc_traffic_mem(struct iwl_priv *priv)
 {
@@ -297,12 +299,6 @@ static inline bool iwl_advanced_bt_coexist(struct iwl_priv *priv)
               cfg(priv)->bt_params->advanced_bt_coexist;
 }
 
-static inline void iwl_enable_rfkill_int(struct iwl_priv *priv)
-{
-       IWL_DEBUG_ISR(priv, "Enabling rfkill interrupt\n");
-       iwl_write32(bus(priv), CSR_INT_MASK, CSR_INT_BIT_RF_KILL);
-}
-
 extern bool bt_siso_mode;
 
 #endif /* __iwl_core_h__ */
index fbc3095..5f96ce1 100644 (file)
@@ -5,7 +5,7 @@
  *
  * GPL LICENSE SUMMARY
  *
- * Copyright(c) 2005 - 2011 Intel Corporation. All rights reserved.
+ * Copyright(c) 2005 - 2012 Intel Corporation. All rights reserved.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of version 2 of the GNU General Public License as
@@ -30,7 +30,7 @@
  *
  * BSD LICENSE
  *
- * Copyright(c) 2005 - 2011 Intel Corporation. All rights reserved.
+ * Copyright(c) 2005 - 2012 Intel Corporation. All rights reserved.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
diff --git a/drivers/net/wireless/iwlwifi/iwl-debug.c b/drivers/net/wireless/iwlwifi/iwl-debug.c
new file mode 100644 (file)
index 0000000..4bc2e70
--- /dev/null
@@ -0,0 +1,127 @@
+/******************************************************************************
+ *
+ * This file is provided under a dual BSD/GPLv2 license.  When using or
+ * redistributing this file, you may do so under either license.
+ *
+ * GPL LICENSE SUMMARY
+ *
+ * Copyright(c) 2007 - 2011 Intel Corporation. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of version 2 of the GNU General Public License as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110,
+ * USA
+ *
+ * The full GNU General Public License is included in this distribution
+ * in the file called LICENSE.GPL.
+ *
+ * Contact Information:
+ *  Intel Linux Wireless <ilw@linux.intel.com>
+ * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
+ *
+ * BSD LICENSE
+ *
+ * Copyright(c) 2005 - 2011 Intel Corporation. All rights reserved.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *  * Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  * Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *  * Neither the name Intel Corporation nor the names of its
+ *    contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ *****************************************************************************/
+
+#include <linux/interrupt.h>
+#include "iwl-debug.h"
+
+#define __iwl_fn(fn)                                           \
+void __iwl_ ##fn(struct device *dev, const char *fmt, ...)     \
+{                                                              \
+       struct va_format vaf = {                                \
+               .fmt = fmt,                                     \
+       };                                                      \
+       va_list args;                                           \
+                                                               \
+       va_start(args, fmt);                                    \
+       vaf.va = &args;                                         \
+       dev_ ##fn(dev, "%pV", &vaf);                            \
+       trace_iwlwifi_ ##fn(&vaf);                              \
+       va_end(args);                                           \
+}
+
+__iwl_fn(warn)
+__iwl_fn(info)
+__iwl_fn(crit)
+
+void __iwl_err(struct device *dev, bool rfkill_prefix, bool trace_only,
+               const char *fmt, ...)
+{
+       struct va_format vaf = {
+               .fmt = fmt,
+       };
+       va_list args;
+
+       va_start(args, fmt);
+       vaf.va = &args;
+       if (!trace_only) {
+               if (rfkill_prefix)
+                       dev_err(dev, "(RFKILL) %pV", &vaf);
+               else
+                       dev_err(dev, "%pV", &vaf);
+       }
+       trace_iwlwifi_err(&vaf);
+       va_end(args);
+}
+
+#if defined(CONFIG_IWLWIFI_DEBUG) || defined(CONFIG_IWLWIFI_DEVICE_TRACING)
+void __iwl_dbg(struct iwl_shared *shared, struct device *dev,
+              u32 level, bool limit, const char *function,
+              const char *fmt, ...)
+{
+       struct va_format vaf = {
+               .fmt = fmt,
+       };
+       va_list args;
+
+       va_start(args, fmt);
+       vaf.va = &args;
+#ifdef CONFIG_IWLWIFI_DEBUG
+       if (iwl_get_debug_level(shared) & level &&
+           (!limit || net_ratelimit()))
+               dev_err(dev, "%c %s %pV", in_interrupt() ? 'I' : 'U',
+                       function, &vaf);
+#endif
+       trace_iwlwifi_dbg(level, in_interrupt(), function, &vaf);
+       va_end(args);
+}
+#endif
index f8fc239..01b2330 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2003 - 2011 Intel Corporation. All rights reserved.
+ * Copyright(c) 2003 - 2012 Intel Corporation. All rights reserved.
  *
  * Portions of this file are derived from the ipw3945 project.
  *
 #ifndef __iwl_debug_h__
 #define __iwl_debug_h__
 
-#include "iwl-bus.h"
 #include "iwl-shared.h"
+#include "iwl-devtrace.h"
 
 struct iwl_priv;
 
-/*No matter what is m (priv, bus, trans), this will work */
-#define IWL_ERR(m, f, a...) dev_err(bus(m)->dev, f, ## a)
-#define IWL_WARN(m, f, a...) dev_warn(bus(m)->dev, f, ## a)
-#define IWL_INFO(m, f, a...) dev_info(bus(m)->dev, f, ## a)
-#define IWL_CRIT(m, f, a...) dev_crit(bus(m)->dev, f, ## a)
+void __iwl_err(struct device *dev, bool rfkill_prefix, bool only_trace,
+               const char *fmt, ...);
+void __iwl_warn(struct device *dev, const char *fmt, ...);
+void __iwl_info(struct device *dev, const char *fmt, ...);
+void __iwl_crit(struct device *dev, const char *fmt, ...);
+
+/* No matter what is m (priv, bus, trans), this will work */
+#define IWL_ERR(m, f, a...) __iwl_err(trans(m)->dev, false, false, f, ## a)
+#define IWL_WARN(m, f, a...) __iwl_warn(trans(m)->dev, f, ## a)
+#define IWL_INFO(m, f, a...) __iwl_info(trans(m)->dev, f, ## a)
+#define IWL_CRIT(m, f, a...) __iwl_crit(trans(m)->dev, f, ## a)
+
+#if defined(CONFIG_IWLWIFI_DEBUG) || defined(CONFIG_IWLWIFI_DEVICE_TRACING)
+void __iwl_dbg(struct iwl_shared *shared, struct device *dev,
+              u32 level, bool limit, const char *function,
+              const char *fmt, ...);
+#else
+static inline void
+__iwl_dbg(struct iwl_shared *shared, struct device *dev,
+         u32 level, bool limit, const char *function,
+         const char *fmt, ...)
+{}
+#endif
 
 #define iwl_print_hex_error(m, p, len)                                 \
 do {                                                                   \
@@ -46,53 +64,35 @@ do {                                                                        \
                       DUMP_PREFIX_OFFSET, 16, 1, p, len, 1);           \
 } while (0)
 
-#ifdef CONFIG_IWLWIFI_DEBUG
-#define IWL_DEBUG(m, level, fmt, ...)                                  \
-do {                                                                   \
-       if (iwl_get_debug_level((m)->shrd) & (level))                   \
-               dev_err(bus(m)->dev, "%c %s " fmt,                      \
-                       in_interrupt() ? 'I' : 'U', __func__,           \
-                       ##__VA_ARGS__);                                 \
-} while (0)
-
-#define IWL_DEBUG_LIMIT(m, level, fmt, ...)                            \
-do {                                                                   \
-       if (iwl_get_debug_level((m)->shrd) & (level) &&                 \
-           net_ratelimit())                                            \
-               dev_err(bus(m)->dev, "%c %s " fmt,                      \
-                       in_interrupt() ? 'I' : 'U', __func__,           \
-                       ##__VA_ARGS__);                                 \
-} while (0)
+#define IWL_DEBUG(m, level, fmt, args...)                              \
+       __iwl_dbg((m)->shrd, trans(m)->dev, level, false, __func__, fmt, ##args)
+#define IWL_DEBUG_LIMIT(m, level, fmt, args...)                                \
+       __iwl_dbg((m)->shrd, trans(m)->dev, level, true, __func__, fmt, ##args)
 
+#ifdef CONFIG_IWLWIFI_DEBUG
 #define iwl_print_hex_dump(m, level, p, len)                           \
 do {                                                                   \
        if (iwl_get_debug_level((m)->shrd) & level)                     \
                print_hex_dump(KERN_DEBUG, "iwl data: ",                \
                               DUMP_PREFIX_OFFSET, 16, 1, p, len, 1);   \
 } while (0)
-
-#define IWL_DEBUG_QUIET_RFKILL(p, fmt, ...)                            \
+#define IWL_DEBUG_QUIET_RFKILL(m, fmt, args...)        \
 do {                                                                   \
-       if (!iwl_is_rfkill(p->shrd))                                    \
-               dev_err(bus(p)->dev, "%s%c %s " fmt,                    \
-                       "",                                             \
-                       in_interrupt() ? 'I' : 'U', __func__,           \
-                       ##__VA_ARGS__);                                 \
-       else if (iwl_get_debug_level(p->shrd) & IWL_DL_RADIO)           \
-               dev_err(bus(p)->dev, "%s%c %s " fmt,                    \
-                       "(RFKILL) ",                                    \
-                       in_interrupt() ? 'I' : 'U', __func__,           \
-                       ##__VA_ARGS__);                                 \
+       if (!iwl_is_rfkill((m)->shrd))                                  \
+               IWL_ERR(m, fmt, ##args);                                \
+       else                                                            \
+               __iwl_err(trans(m)->dev, true,                          \
+                         !(iwl_get_debug_level((m)->shrd) & IWL_DL_RADIO),\
+                         fmt, ##args);                                 \
 } while (0)
-
 #else
-#define IWL_DEBUG(m, level, fmt, args...)
-#define IWL_DEBUG_LIMIT(m, level, fmt, args...)
 #define iwl_print_hex_dump(m, level, p, len)
-#define IWL_DEBUG_QUIET_RFKILL(p, fmt, args...)        \
-do {                                                   \
-       if (!iwl_is_rfkill(p->shrd))                    \
-               IWL_ERR(p, fmt, ##args);                \
+#define IWL_DEBUG_QUIET_RFKILL(m, fmt, args...)        \
+do {                                                                   \
+       if (!iwl_is_rfkill((m)->shrd))                                  \
+               IWL_ERR(m, fmt, ##args);                                \
+       else                                                            \
+               __iwl_err(trans(m)->dev, true, true, fmt, ##args);      \
 } while (0)
 #endif                         /* CONFIG_IWLWIFI_DEBUG */
 
index 04a3343..ad74138 100644 (file)
@@ -2,7 +2,7 @@
  *
  * GPL LICENSE SUMMARY
  *
- * Copyright(c) 2008 - 2011 Intel Corporation. All rights reserved.
+ * Copyright(c) 2008 - 2012 Intel Corporation. All rights reserved.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of version 2 of the GNU General Public License as
@@ -40,6 +40,7 @@
 #include "iwl-core.h"
 #include "iwl-io.h"
 #include "iwl-agn.h"
+#include "iwl-wifi.h"
 
 /* create and remove of files */
 #define DEBUGFS_ADD_FILE(name, parent, mode) do {                      \
@@ -234,12 +235,12 @@ static ssize_t iwl_dbgfs_sram_read(struct file *file,
 
        /* default is to dump the entire data segment */
        if (!priv->dbgfs_sram_offset && !priv->dbgfs_sram_len) {
-               struct iwl_trans *trans = trans(priv);
+               struct iwl_nic *nic = nic(priv);
                priv->dbgfs_sram_offset = 0x800000;
-               if (trans->shrd->ucode_type == IWL_UCODE_INIT)
-                       priv->dbgfs_sram_len = trans->ucode_init.data.len;
+               if (nic->shrd->ucode_type == IWL_UCODE_INIT)
+                       priv->dbgfs_sram_len = nic->fw.ucode_init.data.len;
                else
-                       priv->dbgfs_sram_len = trans->ucode_rt.data.len;
+                       priv->dbgfs_sram_len = nic->fw.ucode_rt.data.len;
        }
        len = priv->dbgfs_sram_len;
 
@@ -263,7 +264,7 @@ static ssize_t iwl_dbgfs_sram_read(struct file *file,
        sram = priv->dbgfs_sram_offset & ~0x3;
 
        /* read the first u32 from sram */
-       val = iwl_read_targ_mem(bus(priv), sram);
+       val = iwl_read_targ_mem(trans(priv), sram);
 
        for (; len; len--) {
                /* put the address at the start of every line */
@@ -282,7 +283,7 @@ static ssize_t iwl_dbgfs_sram_read(struct file *file,
                if (++offset == 4) {
                        sram += 4;
                        offset = 0;
-                       val = iwl_read_targ_mem(bus(priv), sram);
+                       val = iwl_read_targ_mem(trans(priv), sram);
                }
 
                /* put in extra spaces and split lines for human readability */
@@ -342,7 +343,7 @@ static ssize_t iwl_dbgfs_wowlan_sram_read(struct file *file,
 
        return simple_read_from_buffer(user_buf, count, ppos,
                                       priv->wowlan_sram,
-                                      trans(priv)->ucode_wowlan.data.len);
+                                      nic(priv)->fw.ucode_wowlan.data.len);
 }
 static ssize_t iwl_dbgfs_stations_read(struct file *file, char __user *user_buf,
                                        size_t count, loff_t *ppos)
@@ -2055,7 +2056,7 @@ static ssize_t iwl_dbgfs_power_save_status_read(struct file *file,
        const size_t bufsz = sizeof(buf);
        u32 pwrsave_status;
 
-       pwrsave_status = iwl_read32(bus(priv), CSR_GP_CNTRL) &
+       pwrsave_status = iwl_read32(trans(priv), CSR_GP_CNTRL) &
                        CSR_GP_REG_POWER_SAVE_STATUS_MSK;
 
        pos += scnprintf(buf + pos, bufsz - pos, "Power Save Status: ");
@@ -2131,9 +2132,10 @@ static ssize_t iwl_dbgfs_ucode_tracing_write(struct file *file,
 
        if (trace) {
                priv->event_log.ucode_trace = true;
-               /* schedule the ucode timer to occur in UCODE_TRACE_PERIOD */
-               mod_timer(&priv->ucode_trace,
-                       jiffies + msecs_to_jiffies(UCODE_TRACE_PERIOD));
+               if (iwl_is_alive(priv->shrd)) {
+                       /* start collecting data now */
+                       mod_timer(&priv->ucode_trace, jiffies);
+               }
        } else {
                priv->event_log.ucode_trace = false;
                del_timer_sync(&priv->ucode_trace);
index e54a4d1..6e5bf0a 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2003 - 2011 Intel Corporation. All rights reserved.
+ * Copyright(c) 2003 - 2012 Intel Corporation. All rights reserved.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
@@ -47,9 +47,9 @@
 #include "iwl-power.h"
 #include "iwl-agn-rs.h"
 #include "iwl-agn-tt.h"
-#include "iwl-bus.h"
 #include "iwl-trans.h"
 #include "iwl-shared.h"
+#include "iwl-op-mode.h"
 
 struct iwl_tx_queue;
 
@@ -292,114 +292,6 @@ struct iwl_vif_priv {
        u8 ibss_bssid_sta_id;
 };
 
-/* v1/v2 uCode file layout */
-struct iwl_ucode_header {
-       __le32 ver;     /* major/minor/API/serial */
-       union {
-               struct {
-                       __le32 inst_size;       /* bytes of runtime code */
-                       __le32 data_size;       /* bytes of runtime data */
-                       __le32 init_size;       /* bytes of init code */
-                       __le32 init_data_size;  /* bytes of init data */
-                       __le32 boot_size;       /* bytes of bootstrap code */
-                       u8 data[0];             /* in same order as sizes */
-               } v1;
-               struct {
-                       __le32 build;           /* build number */
-                       __le32 inst_size;       /* bytes of runtime code */
-                       __le32 data_size;       /* bytes of runtime data */
-                       __le32 init_size;       /* bytes of init code */
-                       __le32 init_data_size;  /* bytes of init data */
-                       __le32 boot_size;       /* bytes of bootstrap code */
-                       u8 data[0];             /* in same order as sizes */
-               } v2;
-       } u;
-};
-
-/*
- * new TLV uCode file layout
- *
- * The new TLV file format contains TLVs, that each specify
- * some piece of data. To facilitate "groups", for example
- * different instruction image with different capabilities,
- * bundled with the same init image, an alternative mechanism
- * is provided:
- * When the alternative field is 0, that means that the item
- * is always valid. When it is non-zero, then it is only
- * valid in conjunction with items of the same alternative,
- * in which case the driver (user) selects one alternative
- * to use.
- */
-
-enum iwl_ucode_tlv_type {
-       IWL_UCODE_TLV_INVALID           = 0, /* unused */
-       IWL_UCODE_TLV_INST              = 1,
-       IWL_UCODE_TLV_DATA              = 2,
-       IWL_UCODE_TLV_INIT              = 3,
-       IWL_UCODE_TLV_INIT_DATA         = 4,
-       IWL_UCODE_TLV_BOOT              = 5,
-       IWL_UCODE_TLV_PROBE_MAX_LEN     = 6, /* a u32 value */
-       IWL_UCODE_TLV_PAN               = 7,
-       IWL_UCODE_TLV_RUNT_EVTLOG_PTR   = 8,
-       IWL_UCODE_TLV_RUNT_EVTLOG_SIZE  = 9,
-       IWL_UCODE_TLV_RUNT_ERRLOG_PTR   = 10,
-       IWL_UCODE_TLV_INIT_EVTLOG_PTR   = 11,
-       IWL_UCODE_TLV_INIT_EVTLOG_SIZE  = 12,
-       IWL_UCODE_TLV_INIT_ERRLOG_PTR   = 13,
-       IWL_UCODE_TLV_ENHANCE_SENS_TBL  = 14,
-       IWL_UCODE_TLV_PHY_CALIBRATION_SIZE = 15,
-       IWL_UCODE_TLV_WOWLAN_INST       = 16,
-       IWL_UCODE_TLV_WOWLAN_DATA       = 17,
-       IWL_UCODE_TLV_FLAGS             = 18,
-};
-
-/**
- * enum iwl_ucode_tlv_flag - ucode API flags
- * @IWL_UCODE_TLV_FLAGS_PAN: This is PAN capable microcode; this previously
- *     was a separate TLV but moved here to save space.
- * @IWL_UCODE_TLV_FLAGS_NEWSCAN: new uCode scan behaviour on hidden SSID,
- *     treats good CRC threshold as a boolean
- * @IWL_UCODE_TLV_FLAGS_MFP: This uCode image supports MFP (802.11w).
- * @IWL_UCODE_TLV_FLAGS_P2P: This uCode image supports P2P.
- */
-enum iwl_ucode_tlv_flag {
-       IWL_UCODE_TLV_FLAGS_PAN         = BIT(0),
-       IWL_UCODE_TLV_FLAGS_NEWSCAN     = BIT(1),
-       IWL_UCODE_TLV_FLAGS_MFP         = BIT(2),
-       IWL_UCODE_TLV_FLAGS_P2P         = BIT(3),
-};
-
-struct iwl_ucode_tlv {
-       __le16 type;            /* see above */
-       __le16 alternative;     /* see comment */
-       __le32 length;          /* not including type/length fields */
-       u8 data[0];
-} __packed;
-
-#define IWL_TLV_UCODE_MAGIC    0x0a4c5749
-
-struct iwl_tlv_ucode_header {
-       /*
-        * The TLV style ucode header is distinguished from
-        * the v1/v2 style header by first four bytes being
-        * zero, as such is an invalid combination of
-        * major/minor/API/serial versions.
-        */
-       __le32 zero;
-       __le32 magic;
-       u8 human_readable[64];
-       __le32 ver;             /* major/minor/API/serial */
-       __le32 build;
-       __le64 alternatives;    /* bitmask of valid alternatives */
-       /*
-        * The data contained herein has a TLV layout,
-        * see above for the TLV header and types.
-        * Note that each TLV is padded to a length
-        * that is a multiple of 4 for alignment.
-        */
-       u8 data[0];
-};
-
 struct iwl_sensitivity_ranges {
        u16 min_nrg_cck;
        u16 max_nrg_cck;
@@ -550,9 +442,6 @@ struct iwl_chain_noise_data {
        u8 state;
 };
 
-#define        EEPROM_SEM_TIMEOUT 10           /* milliseconds */
-#define EEPROM_SEM_RETRY_LIMIT 1000    /* number of attempts (not time) */
-
 enum {
        MEASUREMENT_READY = (1 << 0),
        MEASUREMENT_ACTIVE = (1 << 1),
@@ -661,7 +550,7 @@ struct traffic_stats {
  * schedule the timer to wake up every UCODE_TRACE_PERIOD milliseconds
  * to perform continuous uCode event logging operation if enabled
  */
-#define UCODE_TRACE_PERIOD (100)
+#define UCODE_TRACE_PERIOD (10)
 
 /*
  * iwl_event_log: current uCode event log position
@@ -804,11 +693,11 @@ struct iwl_testmode_trace {
        dma_addr_t dma_addr;
        bool trace_enabled;
 };
-struct iwl_testmode_sram {
+struct iwl_testmode_mem {
        u32 buff_size;
        u32 num_chunks;
        u8 *buff_addr;
-       bool sram_readed;
+       bool read_in_progress;
 };
 #endif
 
@@ -818,10 +707,16 @@ struct iwl_wipan_noa_data {
        u8 data[];
 };
 
+#define IWL_OP_MODE_GET_DVM(_iwl_op_mode) \
+       ((struct iwl_priv *) ((_iwl_op_mode)->op_mode_specific))
+
+#define IWL_MAC80211_GET_DVM(_hw) \
+       ((struct iwl_priv *) ((struct iwl_op_mode *) \
+       (_hw)->priv)->op_mode_specific)
+
 struct iwl_priv {
 
        /*data shared among all the driver's layers */
-       struct iwl_shared _shrd;
        struct iwl_shared *shrd;
 
        /* ieee device used by generic ieee processing code */
@@ -830,6 +725,8 @@ struct iwl_priv {
        struct ieee80211_rate *ieee_rates;
        struct kmem_cache *tx_cmd_pool;
 
+       struct workqueue_struct *workqueue;
+
        enum ieee80211_band band;
 
        void (*pre_rx_handler)(struct iwl_priv *priv,
@@ -894,13 +791,6 @@ struct iwl_priv {
        /* EEPROM MAC addresses */
        struct mac_address addresses[2];
 
-       /* uCode images, save to reload in case of failure */
-       int fw_index;                   /* firmware we're trying to load */
-       u32 ucode_ver;                  /* version of ucode, copy of
-                                          iwl_ucode.ver */
-
-       char firmware_name[25];
-
        struct iwl_rxon_context contexts[NUM_IWL_RXON_CTX];
 
        __le16 switch_channel;
@@ -910,7 +800,6 @@ struct iwl_priv {
        u8 start_calib;
        struct iwl_sensitivity_data sensitivity_data;
        struct iwl_chain_noise_data chain_noise_data;
-       bool enhance_sensitivity_table;
        __le16 sensitivity_tbl[HD_TABLE_SIZE];
        __le16 enhance_sensitivity_tbl[ENHANCE_HD_TABLE_ENTRIES];
 
@@ -978,11 +867,6 @@ struct iwl_priv {
        struct iwl_rx_phy_res last_phy_res;
        bool last_phy_res_valid;
 
-       struct completion firmware_loading_complete;
-
-       u32 init_evtlog_ptr, init_evtlog_size, init_errlog_ptr;
-       u32 inst_evtlog_ptr, inst_evtlog_size, inst_errlog_ptr;
-
        /*
         * chain noise reset and gain commands are the
         * two extra calibration commands follows the standard
@@ -1073,7 +957,7 @@ struct iwl_priv {
        bool led_registered;
 #ifdef CONFIG_IWLWIFI_DEVICE_TESTMODE
        struct iwl_testmode_trace testmode_trace;
-       struct iwl_testmode_sram testmode_sram;
+       struct iwl_testmode_mem testmode_mem;
        u32 tm_fixed_rate;
 #endif
 
index 2a2c8de..91f45e7 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2009 - 2011 Intel Corporation. All rights reserved.
+ * Copyright(c) 2009 - 2012 Intel Corporation. All rights reserved.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
index 9b212a8..96e6233 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2009 - 2011 Intel Corporation. All rights reserved.
+ * Copyright(c) 2009 - 2012 Intel Corporation. All rights reserved.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
 #undef TRACE_EVENT
 #define TRACE_EVENT(name, proto, ...) \
 static inline void trace_ ## name(proto) {}
+#undef DECLARE_EVENT_CLASS
+#define DECLARE_EVENT_CLASS(...)
+#undef DEFINE_EVENT
+#define DEFINE_EVENT(evt_class, name, proto, ...) \
+static inline void trace_ ## name(proto) {}
 #endif
 
 #define PRIV_ENTRY     __field(void *, priv)
@@ -164,6 +169,66 @@ TRACE_EVENT(iwlwifi_dev_ucode_wrap_event,
 );
 
 #undef TRACE_SYSTEM
+#define TRACE_SYSTEM iwlwifi_msg
+
+#define MAX_MSG_LEN    100
+
+DECLARE_EVENT_CLASS(iwlwifi_msg_event,
+       TP_PROTO(struct va_format *vaf),
+       TP_ARGS(vaf),
+       TP_STRUCT__entry(
+               __dynamic_array(char, msg, MAX_MSG_LEN)
+       ),
+       TP_fast_assign(
+               WARN_ON_ONCE(vsnprintf(__get_dynamic_array(msg),
+                                      MAX_MSG_LEN, vaf->fmt,
+                                      *vaf->va) >= MAX_MSG_LEN);
+       ),
+       TP_printk("%s", (char *)__get_dynamic_array(msg))
+);
+
+DEFINE_EVENT(iwlwifi_msg_event, iwlwifi_err,
+       TP_PROTO(struct va_format *vaf),
+       TP_ARGS(vaf)
+);
+
+DEFINE_EVENT(iwlwifi_msg_event, iwlwifi_warn,
+       TP_PROTO(struct va_format *vaf),
+       TP_ARGS(vaf)
+);
+
+DEFINE_EVENT(iwlwifi_msg_event, iwlwifi_info,
+       TP_PROTO(struct va_format *vaf),
+       TP_ARGS(vaf)
+);
+
+DEFINE_EVENT(iwlwifi_msg_event, iwlwifi_crit,
+       TP_PROTO(struct va_format *vaf),
+       TP_ARGS(vaf)
+);
+
+TRACE_EVENT(iwlwifi_dbg,
+       TP_PROTO(u32 level, bool in_interrupt, const char *function,
+                struct va_format *vaf),
+       TP_ARGS(level, in_interrupt, function, vaf),
+       TP_STRUCT__entry(
+               __field(u32, level)
+               __field(u8, in_interrupt)
+               __string(function, function)
+               __dynamic_array(char, msg, MAX_MSG_LEN)
+       ),
+       TP_fast_assign(
+               __entry->level = level;
+               __entry->in_interrupt = in_interrupt;
+               __assign_str(function, function);
+               WARN_ON_ONCE(vsnprintf(__get_dynamic_array(msg),
+                                      MAX_MSG_LEN, vaf->fmt,
+                                      *vaf->va) >= MAX_MSG_LEN);
+       ),
+       TP_printk("%s", (char *)__get_dynamic_array(msg))
+);
+
+#undef TRACE_SYSTEM
 #define TRACE_SYSTEM iwlwifi
 
 TRACE_EVENT(iwlwifi_dev_hcmd,
diff --git a/drivers/net/wireless/iwlwifi/iwl-drv.c b/drivers/net/wireless/iwlwifi/iwl-drv.c
new file mode 100644 (file)
index 0000000..8ff5256
--- /dev/null
@@ -0,0 +1,103 @@
+/******************************************************************************
+ *
+ * This file is provided under a dual BSD/GPLv2 license.  When using or
+ * redistributing this file, you may do so under either license.
+ *
+ * GPL LICENSE SUMMARY
+ *
+ * Copyright(c) 2007 - 2012 Intel Corporation. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of version 2 of the GNU General Public License as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110,
+ * USA
+ *
+ * The full GNU General Public License is included in this distribution
+ * in the file called LICENSE.GPL.
+ *
+ * Contact Information:
+ *  Intel Linux Wireless <ilw@linux.intel.com>
+ * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
+ *
+ * BSD LICENSE
+ *
+ * Copyright(c) 2005 - 2012 Intel Corporation. All rights reserved.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *  * Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  * Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *  * Neither the name Intel Corporation nor the names of its
+ *    contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ *****************************************************************************/
+#include <linux/completion.h>
+
+#include "iwl-drv.h"
+#include "iwl-trans.h"
+#include "iwl-wifi.h"
+#include "iwl-op-mode.h"
+
+int iwl_drv_start(struct iwl_shared *shrd,
+                 struct iwl_trans *trans, struct iwl_cfg *cfg)
+{
+       int ret;
+
+       shrd->cfg = cfg;
+
+       shrd->nic = kzalloc(sizeof(*shrd->nic), GFP_KERNEL);
+       if (!shrd->nic) {
+               dev_printk(KERN_ERR, trans->dev, "Couldn't allocate iwl_nic");
+               return -ENOMEM;
+       }
+       shrd->nic->shrd = shrd;
+
+       init_completion(&shrd->nic->request_firmware_complete);
+
+       ret = iwl_request_firmware(shrd->nic, true);
+
+       if (ret) {
+               dev_printk(KERN_ERR, trans->dev, "Couldn't request the fw");
+               kfree(shrd->nic);
+       }
+
+       return ret;
+}
+
+void iwl_drv_stop(struct iwl_shared *shrd)
+{
+       /* op_mode can be NULL if its start failed */
+       if (shrd->nic->op_mode)
+               iwl_op_mode_stop(shrd->nic->op_mode);
+
+       kfree(shrd->nic);
+}
diff --git a/drivers/net/wireless/iwlwifi/iwl-drv.h b/drivers/net/wireless/iwlwifi/iwl-drv.h
new file mode 100644 (file)
index 0000000..90534a2
--- /dev/null
@@ -0,0 +1,123 @@
+/******************************************************************************
+ *
+ * This file is provided under a dual BSD/GPLv2 license.  When using or
+ * redistributing this file, you may do so under either license.
+ *
+ * GPL LICENSE SUMMARY
+ *
+ * Copyright(c) 2008 - 2012 Intel Corporation. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of version 2 of the GNU General Public License as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110,
+ * USA
+ *
+ * The full GNU General Public License is included in this distribution
+ * in the file called LICENSE.GPL.
+ *
+ * Contact Information:
+ *  Intel Linux Wireless <ilw@linux.intel.com>
+ * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
+ *
+ * BSD LICENSE
+ *
+ * Copyright(c) 2005 - 2012 Intel Corporation. All rights reserved.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *  * Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  * Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *  * Neither the name Intel Corporation nor the names of its
+ *    contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *****************************************************************************/
+
+#ifndef __iwl_drv_h__
+#define __iwl_drv_h__
+
+#include "iwl-shared.h"
+
+/**
+ * DOC: Driver system flows - drv component
+ *
+ * This component implements the system flows such as bus enumeration, bus
+ * removal. Bus dependent parts of system flows (such as iwl_pci_probe) are in
+ * bus specific files (transport files). This is the code that is common among
+ * different buses.
+ *
+ * This component is also in charge of managing the several implementations of
+ * the wifi flows: it will allow to have several fw API implementation. These
+ * different implementations will differ in the way they implement mac80211's
+ * handlers too.
+
+ * The init flow wrt to the drv component looks like this:
+ * 1) The bus specific component is called from module_init
+ * 2) The bus specific component registers the bus driver
+ * 3) The bus driver calls the probe function
+ * 4) The bus specific component configures the bus
+ * 5) The bus specific component calls to the drv bus agnostic part
+ *    (iwl_drv_start)
+ * 6) iwl_drv_start fetches the fw ASYNC, iwl_ucode_callback
+ * 7) iwl_ucode_callback parses the fw file
+ * 8) iwl_ucode_callback starts the wifi implementation to matches the fw
+ */
+
+/**
+ * iwl_drv_start - start the drv
+ *
+ * @shrd: the shrd area
+ * @trans_ops: the ops of the transport
+ * @cfg: device specific constants / virtual functions
+ *
+ * TODO: review the parameters given to this function
+ *
+ * starts the driver: fetches the firmware. This should be called by bus
+ * specific system flows implementations. For example, the bus specific probe
+ * function should do bus related operations only, and then call to this
+ * function.
+ */
+int iwl_drv_start(struct iwl_shared *shrd,
+                 struct iwl_trans *trans, struct iwl_cfg *cfg);
+
+/**
+ * iwl_drv_stop - stop the drv
+ *
+ * @shrd: the shrd area
+ *
+ * TODO: review the parameters given to this function
+ *
+ * Stop the driver. This should be called by bus specific system flows
+ * implementations. For example, the bus specific remove function should first
+ * call this function and then do the bus related operations only.
+ */
+void iwl_drv_stop(struct iwl_shared *shrd);
+
+#endif /* __iwl_drv_h__ */
index c1eda97..07e9378 100644 (file)
@@ -5,7 +5,7 @@
  *
  * GPL LICENSE SUMMARY
  *
- * Copyright(c) 2008 - 2011 Intel Corporation. All rights reserved.
+ * Copyright(c) 2008 - 2012 Intel Corporation. All rights reserved.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of version 2 of the GNU General Public License as
@@ -30,7 +30,7 @@
  *
  * BSD LICENSE
  *
- * Copyright(c) 2005 - 2011 Intel Corporation. All rights reserved.
+ * Copyright(c) 2005 - 2012 Intel Corporation. All rights reserved.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -149,23 +149,27 @@ static const u8 iwl_eeprom_band_7[] = {       /* 5.2 ht40 channel */
  * EEPROM chip, not a single event, so even reads could conflict if they
  * weren't arbitrated by the semaphore.
  */
-static int iwl_eeprom_acquire_semaphore(struct iwl_bus *bus)
+
+#define        EEPROM_SEM_TIMEOUT 10           /* milliseconds */
+#define EEPROM_SEM_RETRY_LIMIT 1000    /* number of attempts (not time) */
+
+static int iwl_eeprom_acquire_semaphore(struct iwl_trans *trans)
 {
        u16 count;
        int ret;
 
        for (count = 0; count < EEPROM_SEM_RETRY_LIMIT; count++) {
                /* Request semaphore */
-               iwl_set_bit(bus, CSR_HW_IF_CONFIG_REG,
+               iwl_set_bit(trans, CSR_HW_IF_CONFIG_REG,
                            CSR_HW_IF_CONFIG_REG_BIT_EEPROM_OWN_SEM);
 
                /* See if we got it */
-               ret = iwl_poll_bit(bus, CSR_HW_IF_CONFIG_REG,
+               ret = iwl_poll_bit(trans, CSR_HW_IF_CONFIG_REG,
                                CSR_HW_IF_CONFIG_REG_BIT_EEPROM_OWN_SEM,
                                CSR_HW_IF_CONFIG_REG_BIT_EEPROM_OWN_SEM,
                                EEPROM_SEM_TIMEOUT);
                if (ret >= 0) {
-                       IWL_DEBUG_EEPROM(bus,
+                       IWL_DEBUG_EEPROM(trans,
                                "Acquired semaphore after %d tries.\n",
                                count+1);
                        return ret;
@@ -175,16 +179,17 @@ static int iwl_eeprom_acquire_semaphore(struct iwl_bus *bus)
        return ret;
 }
 
-static void iwl_eeprom_release_semaphore(struct iwl_bus *bus)
+static void iwl_eeprom_release_semaphore(struct iwl_trans *trans)
 {
-       iwl_clear_bit(bus, CSR_HW_IF_CONFIG_REG,
+       iwl_clear_bit(trans, CSR_HW_IF_CONFIG_REG,
                CSR_HW_IF_CONFIG_REG_BIT_EEPROM_OWN_SEM);
 
 }
 
 static int iwl_eeprom_verify_signature(struct iwl_trans *trans)
 {
-       u32 gp = iwl_read32(bus(trans), CSR_EEPROM_GP) & CSR_EEPROM_GP_VALID_MSK;
+       u32 gp = iwl_read32(trans, CSR_EEPROM_GP) &
+                          CSR_EEPROM_GP_VALID_MSK;
        int ret = 0;
 
        IWL_DEBUG_EEPROM(trans, "EEPROM signature=0x%08x\n", gp);
@@ -303,19 +308,20 @@ void iwl_eeprom_get_mac(const struct iwl_shared *shrd, u8 *mac)
  *
 ******************************************************************************/
 
-static void iwl_set_otp_access(struct iwl_bus *bus, enum iwl_access_mode mode)
+static void iwl_set_otp_access(struct iwl_trans *trans,
+                              enum iwl_access_mode mode)
 {
-       iwl_read32(bus, CSR_OTP_GP_REG);
+       iwl_read32(trans, CSR_OTP_GP_REG);
 
        if (mode == IWL_OTP_ACCESS_ABSOLUTE)
-               iwl_clear_bit(bus, CSR_OTP_GP_REG,
+               iwl_clear_bit(trans, CSR_OTP_GP_REG,
                              CSR_OTP_GP_REG_OTP_ACCESS_MODE);
        else
-               iwl_set_bit(bus, CSR_OTP_GP_REG,
+               iwl_set_bit(trans, CSR_OTP_GP_REG,
                            CSR_OTP_GP_REG_OTP_ACCESS_MODE);
 }
 
-static int iwl_get_nvm_type(struct iwl_bus *bus, u32 hw_rev)
+static int iwl_get_nvm_type(struct iwl_trans *trans, u32 hw_rev)
 {
        u32 otpgp;
        int nvm_type;
@@ -323,7 +329,7 @@ static int iwl_get_nvm_type(struct iwl_bus *bus, u32 hw_rev)
        /* OTP only valid for CP/PP and after */
        switch (hw_rev & CSR_HW_REV_TYPE_MSK) {
        case CSR_HW_REV_TYPE_NONE:
-               IWL_ERR(bus, "Unknown hardware type\n");
+               IWL_ERR(trans, "Unknown hardware type\n");
                return -ENOENT;
        case CSR_HW_REV_TYPE_5300:
        case CSR_HW_REV_TYPE_5350:
@@ -332,7 +338,7 @@ static int iwl_get_nvm_type(struct iwl_bus *bus, u32 hw_rev)
                nvm_type = NVM_DEVICE_TYPE_EEPROM;
                break;
        default:
-               otpgp = iwl_read32(bus, CSR_OTP_GP_REG);
+               otpgp = iwl_read32(trans, CSR_OTP_GP_REG);
                if (otpgp & CSR_OTP_GP_REG_DEVICE_SELECT)
                        nvm_type = NVM_DEVICE_TYPE_OTP;
                else
@@ -342,73 +348,74 @@ static int iwl_get_nvm_type(struct iwl_bus *bus, u32 hw_rev)
        return  nvm_type;
 }
 
-static int iwl_init_otp_access(struct iwl_bus *bus)
+static int iwl_init_otp_access(struct iwl_trans *trans)
 {
        int ret;
 
        /* Enable 40MHz radio clock */
-       iwl_write32(bus, CSR_GP_CNTRL,
-                   iwl_read32(bus, CSR_GP_CNTRL) |
+       iwl_write32(trans, CSR_GP_CNTRL,
+                   iwl_read32(trans, CSR_GP_CNTRL) |
                    CSR_GP_CNTRL_REG_FLAG_INIT_DONE);
 
        /* wait for clock to be ready */
-       ret = iwl_poll_bit(bus, CSR_GP_CNTRL,
+       ret = iwl_poll_bit(trans, CSR_GP_CNTRL,
                                 CSR_GP_CNTRL_REG_FLAG_MAC_CLOCK_READY,
                                 CSR_GP_CNTRL_REG_FLAG_MAC_CLOCK_READY,
                                 25000);
        if (ret < 0)
-               IWL_ERR(bus, "Time out access OTP\n");
+               IWL_ERR(trans, "Time out access OTP\n");
        else {
-               iwl_set_bits_prph(bus, APMG_PS_CTRL_REG,
+               iwl_set_bits_prph(trans, APMG_PS_CTRL_REG,
                                  APMG_PS_CTRL_VAL_RESET_REQ);
                udelay(5);
-               iwl_clear_bits_prph(bus, APMG_PS_CTRL_REG,
+               iwl_clear_bits_prph(trans, APMG_PS_CTRL_REG,
                                    APMG_PS_CTRL_VAL_RESET_REQ);
 
                /*
                 * CSR auto clock gate disable bit -
                 * this is only applicable for HW with OTP shadow RAM
                 */
-               if (cfg(bus)->base_params->shadow_ram_support)
-                       iwl_set_bit(bus, CSR_DBG_LINK_PWR_MGMT_REG,
+               if (cfg(trans)->base_params->shadow_ram_support)
+                       iwl_set_bit(trans, CSR_DBG_LINK_PWR_MGMT_REG,
                                CSR_RESET_LINK_PWR_MGMT_DISABLED);
        }
        return ret;
 }
 
-static int iwl_read_otp_word(struct iwl_bus *bus, u16 addr, __le16 *eeprom_data)
+static int iwl_read_otp_word(struct iwl_trans *trans, u16 addr,
+                            __le16 *eeprom_data)
 {
        int ret = 0;
        u32 r;
        u32 otpgp;
 
-       iwl_write32(bus, CSR_EEPROM_REG,
+       iwl_write32(trans, CSR_EEPROM_REG,
                    CSR_EEPROM_REG_MSK_ADDR & (addr << 1));
-       ret = iwl_poll_bit(bus, CSR_EEPROM_REG,
+       ret = iwl_poll_bit(trans, CSR_EEPROM_REG,
                                 CSR_EEPROM_REG_READ_VALID_MSK,
                                 CSR_EEPROM_REG_READ_VALID_MSK,
                                 IWL_EEPROM_ACCESS_TIMEOUT);
        if (ret < 0) {
-               IWL_ERR(bus, "Time out reading OTP[%d]\n", addr);
+               IWL_ERR(trans, "Time out reading OTP[%d]\n", addr);
                return ret;
        }
-       r = iwl_read32(bus, CSR_EEPROM_REG);
+       r = iwl_read32(trans, CSR_EEPROM_REG);
        /* check for ECC errors: */
-       otpgp = iwl_read32(bus, CSR_OTP_GP_REG);
+       otpgp = iwl_read32(trans, CSR_OTP_GP_REG);
        if (otpgp & CSR_OTP_GP_REG_ECC_UNCORR_STATUS_MSK) {
                /* stop in this case */
                /* set the uncorrectable OTP ECC bit for acknowledgement */
-               iwl_set_bit(bus, CSR_OTP_GP_REG,
+               iwl_set_bit(trans, CSR_OTP_GP_REG,
                        CSR_OTP_GP_REG_ECC_UNCORR_STATUS_MSK);
-               IWL_ERR(bus, "Uncorrectable OTP ECC error, abort OTP read\n");
+               IWL_ERR(trans, "Uncorrectable OTP ECC error, abort OTP read\n");
                return -EINVAL;
        }
        if (otpgp & CSR_OTP_GP_REG_ECC_CORR_STATUS_MSK) {
                /* continue in this case */
                /* set the correctable OTP ECC bit for acknowledgement */
-               iwl_set_bit(bus, CSR_OTP_GP_REG,
+               iwl_set_bit(trans, CSR_OTP_GP_REG,
                                CSR_OTP_GP_REG_ECC_CORR_STATUS_MSK);
-               IWL_ERR(bus, "Correctable OTP ECC error, continue read\n");
+               IWL_ERR(trans, "Correctable OTP ECC error, continue read\n");
        }
        *eeprom_data = cpu_to_le16(r >> 16);
        return 0;
@@ -417,20 +424,20 @@ static int iwl_read_otp_word(struct iwl_bus *bus, u16 addr, __le16 *eeprom_data)
 /*
  * iwl_is_otp_empty: check for empty OTP
  */
-static bool iwl_is_otp_empty(struct iwl_bus *bus)
+static bool iwl_is_otp_empty(struct iwl_trans *trans)
 {
        u16 next_link_addr = 0;
        __le16 link_value;
        bool is_empty = false;
 
        /* locate the beginning of OTP link list */
-       if (!iwl_read_otp_word(bus, next_link_addr, &link_value)) {
+       if (!iwl_read_otp_word(trans, next_link_addr, &link_value)) {
                if (!link_value) {
-                       IWL_ERR(bus, "OTP is empty\n");
+                       IWL_ERR(trans, "OTP is empty\n");
                        is_empty = true;
                }
        } else {
-               IWL_ERR(bus, "Unable to read first block of OTP list.\n");
+               IWL_ERR(trans, "Unable to read first block of OTP list.\n");
                is_empty = true;
        }
 
@@ -447,7 +454,7 @@ static bool iwl_is_otp_empty(struct iwl_bus *bus)
  *   we should read and used to configure the device.
  *   only perform this operation if shadow RAM is disabled
  */
-static int iwl_find_otp_image(struct iwl_bus *bus,
+static int iwl_find_otp_image(struct iwl_trans *trans,
                                        u16 *validblockaddr)
 {
        u16 next_link_addr = 0, valid_addr;
@@ -455,10 +462,10 @@ static int iwl_find_otp_image(struct iwl_bus *bus,
        int usedblocks = 0;
 
        /* set addressing mode to absolute to traverse the link list */
-       iwl_set_otp_access(bus, IWL_OTP_ACCESS_ABSOLUTE);
+       iwl_set_otp_access(trans, IWL_OTP_ACCESS_ABSOLUTE);
 
        /* checking for empty OTP or error */
-       if (iwl_is_otp_empty(bus))
+       if (iwl_is_otp_empty(trans))
                return -EINVAL;
 
        /*
@@ -472,9 +479,9 @@ static int iwl_find_otp_image(struct iwl_bus *bus,
                 */
                valid_addr = next_link_addr;
                next_link_addr = le16_to_cpu(link_value) * sizeof(u16);
-               IWL_DEBUG_EEPROM(bus, "OTP blocks %d addr 0x%x\n",
+               IWL_DEBUG_EEPROM(trans, "OTP blocks %d addr 0x%x\n",
                               usedblocks, next_link_addr);
-               if (iwl_read_otp_word(bus, next_link_addr, &link_value))
+               if (iwl_read_otp_word(trans, next_link_addr, &link_value))
                        return -EINVAL;
                if (!link_value) {
                        /*
@@ -489,10 +496,10 @@ static int iwl_find_otp_image(struct iwl_bus *bus,
                }
                /* more in the link list, continue */
                usedblocks++;
-       } while (usedblocks <= cfg(bus)->base_params->max_ll_items);
+       } while (usedblocks <= cfg(trans)->base_params->max_ll_items);
 
        /* OTP has no valid blocks */
-       IWL_DEBUG_EEPROM(bus, "OTP has no valid blocks\n");
+       IWL_DEBUG_EEPROM(trans, "OTP has no valid blocks\n");
        return -EINVAL;
 }
 
@@ -652,65 +659,62 @@ void iwl_eeprom_enhanced_txpower(struct iwl_priv *priv)
  *
  * NOTE:  This routine uses the non-debug IO access functions.
  */
-int iwl_eeprom_init(struct iwl_priv *priv, u32 hw_rev)
+int iwl_eeprom_init(struct iwl_trans *trans, u32 hw_rev)
 {
-       struct iwl_shared *shrd = priv->shrd;
        __le16 *e;
-       u32 gp = iwl_read32(bus(priv), CSR_EEPROM_GP);
+       u32 gp = iwl_read32(trans, CSR_EEPROM_GP);
        int sz;
        int ret;
        u16 addr;
        u16 validblockaddr = 0;
        u16 cache_addr = 0;
 
-       trans(priv)->nvm_device_type = iwl_get_nvm_type(bus(priv), hw_rev);
-       if (trans(priv)->nvm_device_type == -ENOENT)
+       trans->nvm_device_type = iwl_get_nvm_type(trans, hw_rev);
+       if (trans->nvm_device_type == -ENOENT)
                return -ENOENT;
        /* allocate eeprom */
-       sz = cfg(priv)->base_params->eeprom_size;
-       IWL_DEBUG_EEPROM(priv, "NVM size = %d\n", sz);
-       shrd->eeprom = kzalloc(sz, GFP_KERNEL);
-       if (!shrd->eeprom) {
+       sz = cfg(trans)->base_params->eeprom_size;
+       IWL_DEBUG_EEPROM(trans, "NVM size = %d\n", sz);
+       trans->shrd->eeprom = kzalloc(sz, GFP_KERNEL);
+       if (!trans->shrd->eeprom) {
                ret = -ENOMEM;
                goto alloc_err;
        }
-       e = (__le16 *)shrd->eeprom;
-
-       iwl_apm_init(priv);
+       e = (__le16 *)trans->shrd->eeprom;
 
-       ret = iwl_eeprom_verify_signature(trans(priv));
+       ret = iwl_eeprom_verify_signature(trans);
        if (ret < 0) {
-               IWL_ERR(priv, "EEPROM not found, EEPROM_GP=0x%08x\n", gp);
+               IWL_ERR(trans, "EEPROM not found, EEPROM_GP=0x%08x\n", gp);
                ret = -ENOENT;
                goto err;
        }
 
        /* Make sure driver (instead of uCode) is allowed to read EEPROM */
-       ret = iwl_eeprom_acquire_semaphore(bus(priv));
+       ret = iwl_eeprom_acquire_semaphore(trans);
        if (ret < 0) {
-               IWL_ERR(priv, "Failed to acquire EEPROM semaphore.\n");
+               IWL_ERR(trans, "Failed to acquire EEPROM semaphore.\n");
                ret = -ENOENT;
                goto err;
        }
 
-       if (trans(priv)->nvm_device_type == NVM_DEVICE_TYPE_OTP) {
+       if (trans->nvm_device_type == NVM_DEVICE_TYPE_OTP) {
 
-               ret = iwl_init_otp_access(bus(priv));
+               ret = iwl_init_otp_access(trans);
                if (ret) {
-                       IWL_ERR(priv, "Failed to initialize OTP access.\n");
+                       IWL_ERR(trans, "Failed to initialize OTP access.\n");
                        ret = -ENOENT;
                        goto done;
                }
-               iwl_write32(bus(priv), CSR_EEPROM_GP,
-                           iwl_read32(bus(priv), CSR_EEPROM_GP) &
+               iwl_write32(trans, CSR_EEPROM_GP,
+                           iwl_read32(trans, CSR_EEPROM_GP) &
                            ~CSR_EEPROM_GP_IF_OWNER_MSK);
 
-               iwl_set_bit(bus(priv), CSR_OTP_GP_REG,
+               iwl_set_bit(trans, CSR_OTP_GP_REG,
                             CSR_OTP_GP_REG_ECC_CORR_STATUS_MSK |
                             CSR_OTP_GP_REG_ECC_UNCORR_STATUS_MSK);
                /* traversing the linked list if no shadow ram supported */
-               if (!cfg(priv)->base_params->shadow_ram_support) {
-                       if (iwl_find_otp_image(bus(priv), &validblockaddr)) {
+               if (!cfg(trans)->base_params->shadow_ram_support) {
+                       if (iwl_find_otp_image(trans, &validblockaddr)) {
                                ret = -ENOENT;
                                goto done;
                        }
@@ -719,7 +723,7 @@ int iwl_eeprom_init(struct iwl_priv *priv, u32 hw_rev)
                     addr += sizeof(u16)) {
                        __le16 eeprom_data;
 
-                       ret = iwl_read_otp_word(bus(priv), addr, &eeprom_data);
+                       ret = iwl_read_otp_word(trans, addr, &eeprom_data);
                        if (ret)
                                goto done;
                        e[cache_addr / 2] = eeprom_data;
@@ -730,36 +734,35 @@ int iwl_eeprom_init(struct iwl_priv *priv, u32 hw_rev)
                for (addr = 0; addr < sz; addr += sizeof(u16)) {
                        u32 r;
 
-                       iwl_write32(bus(priv), CSR_EEPROM_REG,
+                       iwl_write32(trans, CSR_EEPROM_REG,
                                    CSR_EEPROM_REG_MSK_ADDR & (addr << 1));
 
-                       ret = iwl_poll_bit(bus(priv), CSR_EEPROM_REG,
+                       ret = iwl_poll_bit(trans, CSR_EEPROM_REG,
                                                  CSR_EEPROM_REG_READ_VALID_MSK,
                                                  CSR_EEPROM_REG_READ_VALID_MSK,
                                                  IWL_EEPROM_ACCESS_TIMEOUT);
                        if (ret < 0) {
-                               IWL_ERR(priv, "Time out reading EEPROM[%d]\n", addr);
+                               IWL_ERR(trans,
+                                       "Time out reading EEPROM[%d]\n", addr);
                                goto done;
                        }
-                       r = iwl_read32(bus(priv), CSR_EEPROM_REG);
+                       r = iwl_read32(trans, CSR_EEPROM_REG);
                        e[addr / 2] = cpu_to_le16(r >> 16);
                }
        }
 
-       IWL_DEBUG_EEPROM(priv, "NVM Type: %s, version: 0x%x\n",
-                      (trans(priv)->nvm_device_type == NVM_DEVICE_TYPE_OTP)
+       IWL_DEBUG_EEPROM(trans, "NVM Type: %s, version: 0x%x\n",
+                      (trans->nvm_device_type == NVM_DEVICE_TYPE_OTP)
                       ? "OTP" : "EEPROM",
-                      iwl_eeprom_query16(shrd, EEPROM_VERSION));
+                      iwl_eeprom_query16(trans->shrd, EEPROM_VERSION));
 
        ret = 0;
 done:
-       iwl_eeprom_release_semaphore(bus(priv));
+       iwl_eeprom_release_semaphore(trans);
 
 err:
        if (ret)
-               iwl_eeprom_free(priv->shrd);
-       /* Reset chip to save power until we load uCode during "up". */
-       iwl_apm_stop(priv);
+               iwl_eeprom_free(trans->shrd);
 alloc_err:
        return ret;
 }
@@ -1072,7 +1075,7 @@ void iwl_rf_config(struct iwl_priv *priv)
 
        /* write radio config values to register */
        if (EEPROM_RF_CFG_TYPE_MSK(radio_cfg) <= EEPROM_RF_CONFIG_TYPE_MAX) {
-               iwl_set_bit(bus(priv), CSR_HW_IF_CONFIG_REG,
+               iwl_set_bit(trans(priv), CSR_HW_IF_CONFIG_REG,
                            EEPROM_RF_CFG_TYPE_MSK(radio_cfg) |
                            EEPROM_RF_CFG_STEP_MSK(radio_cfg) |
                            EEPROM_RF_CFG_DASH_MSK(radio_cfg));
@@ -1084,7 +1087,7 @@ void iwl_rf_config(struct iwl_priv *priv)
                WARN_ON(1);
 
        /* set CSR_HW_CONFIG_REG for uCode use */
-       iwl_set_bit(bus(priv), CSR_HW_IF_CONFIG_REG,
+       iwl_set_bit(trans(priv), CSR_HW_IF_CONFIG_REG,
                    CSR_HW_IF_CONFIG_REG_BIT_RADIO_SI |
                    CSR_HW_IF_CONFIG_REG_BIT_MAC_SI);
 }
index 9fa937e..cbb8611 100644 (file)
@@ -5,7 +5,7 @@
  *
  * GPL LICENSE SUMMARY
  *
- * Copyright(c) 2008 - 2011 Intel Corporation. All rights reserved.
+ * Copyright(c) 2008 - 2012 Intel Corporation. All rights reserved.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of version 2 of the GNU General Public License as
@@ -30,7 +30,7 @@
  *
  * BSD LICENSE
  *
- * Copyright(c) 2005 - 2011 Intel Corporation. All rights reserved.
+ * Copyright(c) 2005 - 2012 Intel Corporation. All rights reserved.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -67,6 +67,7 @@
 
 struct iwl_priv;
 struct iwl_shared;
+struct iwl_trans;
 
 /*
  * EEPROM access time values:
@@ -305,7 +306,7 @@ struct iwl_eeprom_ops {
 };
 
 
-int iwl_eeprom_init(struct iwl_priv *priv, u32 hw_rev);
+int iwl_eeprom_init(struct iwl_trans *trans, u32 hw_rev);
 void iwl_eeprom_free(struct iwl_shared *shrd);
 int  iwl_eeprom_check_version(struct iwl_priv *priv);
 int  iwl_eeprom_check_sku(struct iwl_priv *priv);
index 5bede9d..9020809 100644 (file)
@@ -5,7 +5,7 @@
  *
  * GPL LICENSE SUMMARY
  *
- * Copyright(c) 2005 - 2011 Intel Corporation. All rights reserved.
+ * Copyright(c) 2005 - 2012 Intel Corporation. All rights reserved.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of version 2 of the GNU General Public License as
@@ -30,7 +30,7 @@
  *
  * BSD LICENSE
  *
- * Copyright(c) 2005 - 2011 Intel Corporation. All rights reserved.
+ * Copyright(c) 2005 - 2012 Intel Corporation. All rights reserved.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
index d57ea64..e2e3b5c 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2003 - 2011 Intel Corporation. All rights reserved.
+ * Copyright(c) 2003 - 2012 Intel Corporation. All rights reserved.
  *
  * Portions of this file are derived from the ipw3945 project.
  *
 
 #define IWL_POLL_INTERVAL 10   /* microseconds */
 
-static inline void __iwl_set_bit(struct iwl_bus *bus, u32 reg, u32 mask)
+static inline void __iwl_set_bit(struct iwl_trans *trans, u32 reg, u32 mask)
 {
-       iwl_write32(bus, reg, iwl_read32(bus, reg) | mask);
+       iwl_write32(trans, reg, iwl_read32(trans, reg) | mask);
 }
 
-static inline void __iwl_clear_bit(struct iwl_bus *bus, u32 reg, u32 mask)
+static inline void __iwl_clear_bit(struct iwl_trans *trans, u32 reg, u32 mask)
 {
-       iwl_write32(bus, reg, iwl_read32(bus, reg) & ~mask);
+       iwl_write32(trans, reg, iwl_read32(trans, reg) & ~mask);
 }
 
-void iwl_set_bit(struct iwl_bus *bus, u32 reg, u32 mask)
+void iwl_set_bit(struct iwl_trans *trans, u32 reg, u32 mask)
 {
        unsigned long flags;
 
-       spin_lock_irqsave(&bus->reg_lock, flags);
-       __iwl_set_bit(bus, reg, mask);
-       spin_unlock_irqrestore(&bus->reg_lock, flags);
+       spin_lock_irqsave(&trans->reg_lock, flags);
+       __iwl_set_bit(trans, reg, mask);
+       spin_unlock_irqrestore(&trans->reg_lock, flags);
 }
 
-void iwl_clear_bit(struct iwl_bus *bus, u32 reg, u32 mask)
+void iwl_clear_bit(struct iwl_trans *trans, u32 reg, u32 mask)
 {
        unsigned long flags;
 
-       spin_lock_irqsave(&bus->reg_lock, flags);
-       __iwl_clear_bit(bus, reg, mask);
-       spin_unlock_irqrestore(&bus->reg_lock, flags);
+       spin_lock_irqsave(&trans->reg_lock, flags);
+       __iwl_clear_bit(trans, reg, mask);
+       spin_unlock_irqrestore(&trans->reg_lock, flags);
 }
 
-int iwl_poll_bit(struct iwl_bus *bus, u32 addr,
+int iwl_poll_bit(struct iwl_trans *trans, u32 addr,
                 u32 bits, u32 mask, int timeout)
 {
        int t = 0;
 
        do {
-               if ((iwl_read32(bus, addr) & mask) == (bits & mask))
+               if ((iwl_read32(trans, addr) & mask) == (bits & mask))
                        return t;
                udelay(IWL_POLL_INTERVAL);
                t += IWL_POLL_INTERVAL;
@@ -77,14 +77,15 @@ int iwl_poll_bit(struct iwl_bus *bus, u32 addr,
        return -ETIMEDOUT;
 }
 
-int iwl_grab_nic_access_silent(struct iwl_bus *bus)
+int iwl_grab_nic_access_silent(struct iwl_trans *trans)
 {
        int ret;
 
-       lockdep_assert_held(&bus->reg_lock);
+       lockdep_assert_held(&trans->reg_lock);
 
        /* this bit wakes up the NIC */
-       __iwl_set_bit(bus, CSR_GP_CNTRL, CSR_GP_CNTRL_REG_FLAG_MAC_ACCESS_REQ);
+       __iwl_set_bit(trans, CSR_GP_CNTRL,
+                     CSR_GP_CNTRL_REG_FLAG_MAC_ACCESS_REQ);
 
        /*
         * These bits say the device is running, and should keep running for
@@ -105,70 +106,70 @@ int iwl_grab_nic_access_silent(struct iwl_bus *bus)
         * 5000 series and later (including 1000 series) have non-volatile SRAM,
         * and do not save/restore SRAM when power cycling.
         */
-       ret = iwl_poll_bit(bus, CSR_GP_CNTRL,
+       ret = iwl_poll_bit(trans, CSR_GP_CNTRL,
                           CSR_GP_CNTRL_REG_VAL_MAC_ACCESS_EN,
                           (CSR_GP_CNTRL_REG_FLAG_MAC_CLOCK_READY |
                            CSR_GP_CNTRL_REG_FLAG_GOING_TO_SLEEP), 15000);
        if (ret < 0) {
-               iwl_write32(bus, CSR_RESET, CSR_RESET_REG_FLAG_FORCE_NMI);
+               iwl_write32(trans, CSR_RESET, CSR_RESET_REG_FLAG_FORCE_NMI);
                return -EIO;
        }
 
        return 0;
 }
 
-int iwl_grab_nic_access(struct iwl_bus *bus)
+int iwl_grab_nic_access(struct iwl_trans *trans)
 {
-       int ret = iwl_grab_nic_access_silent(bus);
+       int ret = iwl_grab_nic_access_silent(trans);
        if (ret) {
-               u32 val = iwl_read32(bus, CSR_GP_CNTRL);
-               IWL_ERR(bus,
+               u32 val = iwl_read32(trans, CSR_GP_CNTRL);
+               IWL_ERR(trans,
                        "MAC is in deep sleep!. CSR_GP_CNTRL = 0x%08X\n", val);
        }
 
        return ret;
 }
 
-void iwl_release_nic_access(struct iwl_bus *bus)
+void iwl_release_nic_access(struct iwl_trans *trans)
 {
-       lockdep_assert_held(&bus->reg_lock);
-       __iwl_clear_bit(bus, CSR_GP_CNTRL,
+       lockdep_assert_held(&trans->reg_lock);
+       __iwl_clear_bit(trans, CSR_GP_CNTRL,
                        CSR_GP_CNTRL_REG_FLAG_MAC_ACCESS_REQ);
 }
 
-u32 iwl_read_direct32(struct iwl_bus *bus, u32 reg)
+u32 iwl_read_direct32(struct iwl_trans *trans, u32 reg)
 {
        u32 value;
        unsigned long flags;
 
-       spin_lock_irqsave(&bus->reg_lock, flags);
-       iwl_grab_nic_access(bus);
-       value = iwl_read32(bus, reg);
-       iwl_release_nic_access(bus);
-       spin_unlock_irqrestore(&bus->reg_lock, flags);
+       spin_lock_irqsave(&trans->reg_lock, flags);
+       iwl_grab_nic_access(trans);
+       value = iwl_read32(trans, reg);
+       iwl_release_nic_access(trans);
+       spin_unlock_irqrestore(&trans->reg_lock, flags);
 
        return value;
 }
 
-void iwl_write_direct32(struct iwl_bus *bus, u32 reg, u32 value)
+void iwl_write_direct32(struct iwl_trans *trans, u32 reg, u32 value)
 {
        unsigned long flags;
 
-       spin_lock_irqsave(&bus->reg_lock, flags);
-       if (!iwl_grab_nic_access(bus)) {
-               iwl_write32(bus, reg, value);
-               iwl_release_nic_access(bus);
+       spin_lock_irqsave(&trans->reg_lock, flags);
+       if (!iwl_grab_nic_access(trans)) {
+               iwl_write32(trans, reg, value);
+               iwl_release_nic_access(trans);
        }
-       spin_unlock_irqrestore(&bus->reg_lock, flags);
+       spin_unlock_irqrestore(&trans->reg_lock, flags);
 }
 
-int iwl_poll_direct_bit(struct iwl_bus *bus, u32 addr, u32 mask,
+int iwl_poll_direct_bit(struct iwl_trans *trans, u32 addr, u32 mask,
                        int timeout)
 {
        int t = 0;
 
        do {
-               if ((iwl_read_direct32(bus, addr) & mask) == mask)
+               if ((iwl_read_direct32(trans, addr) & mask) == mask)
                        return t;
                udelay(IWL_POLL_INTERVAL);
                t += IWL_POLL_INTERVAL;
@@ -177,135 +178,135 @@ int iwl_poll_direct_bit(struct iwl_bus *bus, u32 addr, u32 mask,
        return -ETIMEDOUT;
 }
 
-static inline u32 __iwl_read_prph(struct iwl_bus *bus, u32 reg)
+static inline u32 __iwl_read_prph(struct iwl_trans *trans, u32 reg)
 {
-       iwl_write32(bus, HBUS_TARG_PRPH_RADDR, reg | (3 << 24));
+       iwl_write32(trans, HBUS_TARG_PRPH_RADDR, reg | (3 << 24));
        rmb();
-       return iwl_read32(bus, HBUS_TARG_PRPH_RDAT);
+       return iwl_read32(trans, HBUS_TARG_PRPH_RDAT);
 }
 
-static inline void __iwl_write_prph(struct iwl_bus *bus, u32 addr, u32 val)
+static inline void __iwl_write_prph(struct iwl_trans *trans, u32 addr, u32 val)
 {
-       iwl_write32(bus, HBUS_TARG_PRPH_WADDR,
+       iwl_write32(trans, HBUS_TARG_PRPH_WADDR,
                    ((addr & 0x0000FFFF) | (3 << 24)));
        wmb();
-       iwl_write32(bus, HBUS_TARG_PRPH_WDAT, val);
+       iwl_write32(trans, HBUS_TARG_PRPH_WDAT, val);
 }
 
-u32 iwl_read_prph(struct iwl_bus *bus, u32 reg)
+u32 iwl_read_prph(struct iwl_trans *trans, u32 reg)
 {
        unsigned long flags;
        u32 val;
 
-       spin_lock_irqsave(&bus->reg_lock, flags);
-       iwl_grab_nic_access(bus);
-       val = __iwl_read_prph(bus, reg);
-       iwl_release_nic_access(bus);
-       spin_unlock_irqrestore(&bus->reg_lock, flags);
+       spin_lock_irqsave(&trans->reg_lock, flags);
+       iwl_grab_nic_access(trans);
+       val = __iwl_read_prph(trans, reg);
+       iwl_release_nic_access(trans);
+       spin_unlock_irqrestore(&trans->reg_lock, flags);
        return val;
 }
 
-void iwl_write_prph(struct iwl_bus *bus, u32 addr, u32 val)
+void iwl_write_prph(struct iwl_trans *trans, u32 addr, u32 val)
 {
        unsigned long flags;
 
-       spin_lock_irqsave(&bus->reg_lock, flags);
-       if (!iwl_grab_nic_access(bus)) {
-               __iwl_write_prph(bus, addr, val);
-               iwl_release_nic_access(bus);
+       spin_lock_irqsave(&trans->reg_lock, flags);
+       if (!iwl_grab_nic_access(trans)) {
+               __iwl_write_prph(trans, addr, val);
+               iwl_release_nic_access(trans);
        }
-       spin_unlock_irqrestore(&bus->reg_lock, flags);
+       spin_unlock_irqrestore(&trans->reg_lock, flags);
 }
 
-void iwl_set_bits_prph(struct iwl_bus *bus, u32 reg, u32 mask)
+void iwl_set_bits_prph(struct iwl_trans *trans, u32 reg, u32 mask)
 {
        unsigned long flags;
 
-       spin_lock_irqsave(&bus->reg_lock, flags);
-       iwl_grab_nic_access(bus);
-       __iwl_write_prph(bus, reg, __iwl_read_prph(bus, reg) | mask);
-       iwl_release_nic_access(bus);
-       spin_unlock_irqrestore(&bus->reg_lock, flags);
+       spin_lock_irqsave(&trans->reg_lock, flags);
+       iwl_grab_nic_access(trans);
+       __iwl_write_prph(trans, reg, __iwl_read_prph(trans, reg) | mask);
+       iwl_release_nic_access(trans);
+       spin_unlock_irqrestore(&trans->reg_lock, flags);
 }
 
-void iwl_set_bits_mask_prph(struct iwl_bus *bus, u32 reg,
+void iwl_set_bits_mask_prph(struct iwl_trans *trans, u32 reg,
                            u32 bits, u32 mask)
 {
        unsigned long flags;
 
-       spin_lock_irqsave(&bus->reg_lock, flags);
-       iwl_grab_nic_access(bus);
-       __iwl_write_prph(bus, reg,
-                        (__iwl_read_prph(bus, reg) & mask) | bits);
-       iwl_release_nic_access(bus);
-       spin_unlock_irqrestore(&bus->reg_lock, flags);
+       spin_lock_irqsave(&trans->reg_lock, flags);
+       iwl_grab_nic_access(trans);
+       __iwl_write_prph(trans, reg,
+                        (__iwl_read_prph(trans, reg) & mask) | bits);
+       iwl_release_nic_access(trans);
+       spin_unlock_irqrestore(&trans->reg_lock, flags);
 }
 
-void iwl_clear_bits_prph(struct iwl_bus *bus, u32 reg, u32 mask)
+void iwl_clear_bits_prph(struct iwl_trans *trans, u32 reg, u32 mask)
 {
        unsigned long flags;
        u32 val;
 
-       spin_lock_irqsave(&bus->reg_lock, flags);
-       iwl_grab_nic_access(bus);
-       val = __iwl_read_prph(bus, reg);
-       __iwl_write_prph(bus, reg, (val & ~mask));
-       iwl_release_nic_access(bus);
-       spin_unlock_irqrestore(&bus->reg_lock, flags);
+       spin_lock_irqsave(&trans->reg_lock, flags);
+       iwl_grab_nic_access(trans);
+       val = __iwl_read_prph(trans, reg);
+       __iwl_write_prph(trans, reg, (val & ~mask));
+       iwl_release_nic_access(trans);
+       spin_unlock_irqrestore(&trans->reg_lock, flags);
 }
 
-void _iwl_read_targ_mem_words(struct iwl_bus *bus, u32 addr,
+void _iwl_read_targ_mem_words(struct iwl_trans *trans, u32 addr,
                              void *buf, int words)
 {
        unsigned long flags;
        int offs;
        u32 *vals = buf;
 
-       spin_lock_irqsave(&bus->reg_lock, flags);
-       iwl_grab_nic_access(bus);
+       spin_lock_irqsave(&trans->reg_lock, flags);
+       iwl_grab_nic_access(trans);
 
-       iwl_write32(bus, HBUS_TARG_MEM_RADDR, addr);
+       iwl_write32(trans, HBUS_TARG_MEM_RADDR, addr);
        rmb();
 
        for (offs = 0; offs < words; offs++)
-               vals[offs] = iwl_read32(bus, HBUS_TARG_MEM_RDAT);
+               vals[offs] = iwl_read32(trans, HBUS_TARG_MEM_RDAT);
 
-       iwl_release_nic_access(bus);
-       spin_unlock_irqrestore(&bus->reg_lock, flags);
+       iwl_release_nic_access(trans);
+       spin_unlock_irqrestore(&trans->reg_lock, flags);
 }
 
-u32 iwl_read_targ_mem(struct iwl_bus *bus, u32 addr)
+u32 iwl_read_targ_mem(struct iwl_trans *trans, u32 addr)
 {
        u32 value;
 
-       _iwl_read_targ_mem_words(bus, addr, &value, 1);
+       _iwl_read_targ_mem_words(trans, addr, &value, 1);
 
        return value;
 }
 
-int _iwl_write_targ_mem_words(struct iwl_bus *bus, u32 addr,
+int _iwl_write_targ_mem_words(struct iwl_trans *trans, u32 addr,
                                void *buf, int words)
 {
        unsigned long flags;
        int offs, result = 0;
        u32 *vals = buf;
 
-       spin_lock_irqsave(&bus->reg_lock, flags);
-       if (!iwl_grab_nic_access(bus)) {
-               iwl_write32(bus, HBUS_TARG_MEM_WADDR, addr);
+       spin_lock_irqsave(&trans->reg_lock, flags);
+       if (!iwl_grab_nic_access(trans)) {
+               iwl_write32(trans, HBUS_TARG_MEM_WADDR, addr);
                wmb();
 
                for (offs = 0; offs < words; offs++)
-                       iwl_write32(bus, HBUS_TARG_MEM_WDAT, vals[offs]);
-               iwl_release_nic_access(bus);
+                       iwl_write32(trans, HBUS_TARG_MEM_WDAT, vals[offs]);
+               iwl_release_nic_access(trans);
        } else
                result = -EBUSY;
-       spin_unlock_irqrestore(&bus->reg_lock, flags);
+       spin_unlock_irqrestore(&trans->reg_lock, flags);
 
        return result;
 }
 
-int iwl_write_targ_mem(struct iwl_bus *bus, u32 addr, u32 val)
+int iwl_write_targ_mem(struct iwl_trans *trans, u32 addr, u32 val)
 {
-       return _iwl_write_targ_mem_words(bus, addr, &val, 1);
+       return _iwl_write_targ_mem_words(trans, addr, &val, 1);
 }
index aae2eeb..782486f 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2003 - 2011 Intel Corporation. All rights reserved.
+ * Copyright(c) 2003 - 2012 Intel Corporation. All rights reserved.
  *
  * Portions of this file are derived from the ipw3945 project.
  *
 
 #include "iwl-devtrace.h"
 #include "iwl-shared.h"
-#include "iwl-bus.h"
+#include "iwl-trans.h"
 
-static inline void iwl_write8(struct iwl_bus *bus, u32 ofs, u8 val)
+static inline void iwl_write8(struct iwl_trans *trans, u32 ofs, u8 val)
 {
-       trace_iwlwifi_dev_iowrite8(priv(bus), ofs, val);
-       bus_write8(bus, ofs, val);
+       trace_iwlwifi_dev_iowrite8(priv(trans), ofs, val);
+       iwl_trans_write8(trans, ofs, val);
 }
 
-static inline void iwl_write32(struct iwl_bus *bus, u32 ofs, u32 val)
+static inline void iwl_write32(struct iwl_trans *trans, u32 ofs, u32 val)
 {
-       trace_iwlwifi_dev_iowrite32(priv(bus), ofs, val);
-       bus_write32(bus, ofs, val);
+       trace_iwlwifi_dev_iowrite32(priv(trans), ofs, val);
+       iwl_trans_write32(trans, ofs, val);
 }
 
-static inline u32 iwl_read32(struct iwl_bus *bus, u32 ofs)
+static inline u32 iwl_read32(struct iwl_trans *trans, u32 ofs)
 {
-       u32 val = bus_read32(bus, ofs);
-       trace_iwlwifi_dev_ioread32(priv(bus), ofs, val);
+       u32 val = iwl_trans_read32(trans, ofs);
+       trace_iwlwifi_dev_ioread32(priv(trans), ofs, val);
        return val;
 }
 
-void iwl_set_bit(struct iwl_bus *bus, u32 reg, u32 mask);
-void iwl_clear_bit(struct iwl_bus *bus, u32 reg, u32 mask);
+void iwl_set_bit(struct iwl_trans *trans, u32 reg, u32 mask);
+void iwl_clear_bit(struct iwl_trans *trans, u32 reg, u32 mask);
 
-int iwl_poll_bit(struct iwl_bus *bus, u32 addr,
+int iwl_poll_bit(struct iwl_trans *trans, u32 addr,
                 u32 bits, u32 mask, int timeout);
-int iwl_poll_direct_bit(struct iwl_bus *bus, u32 addr, u32 mask,
+int iwl_poll_direct_bit(struct iwl_trans *trans, u32 addr, u32 mask,
                        int timeout);
 
-int iwl_grab_nic_access_silent(struct iwl_bus *bus);
-int iwl_grab_nic_access(struct iwl_bus *bus);
-void iwl_release_nic_access(struct iwl_bus *bus);
+int iwl_grab_nic_access_silent(struct iwl_trans *trans);
+int iwl_grab_nic_access(struct iwl_trans *trans);
+void iwl_release_nic_access(struct iwl_trans *trans);
 
-u32 iwl_read_direct32(struct iwl_bus *bus, u32 reg);
-void iwl_write_direct32(struct iwl_bus *bus, u32 reg, u32 value);
+u32 iwl_read_direct32(struct iwl_trans *trans, u32 reg);
+void iwl_write_direct32(struct iwl_trans *trans, u32 reg, u32 value);
 
 
-u32 iwl_read_prph(struct iwl_bus *bus, u32 reg);
-void iwl_write_prph(struct iwl_bus *bus, u32 addr, u32 val);
-void iwl_set_bits_prph(struct iwl_bus *bus, u32 reg, u32 mask);
-void iwl_set_bits_mask_prph(struct iwl_bus *bus, u32 reg,
+u32 iwl_read_prph(struct iwl_trans *trans, u32 reg);
+void iwl_write_prph(struct iwl_trans *trans, u32 addr, u32 val);
+void iwl_set_bits_prph(struct iwl_trans *trans, u32 reg, u32 mask);
+void iwl_set_bits_mask_prph(struct iwl_trans *trans, u32 reg,
                            u32 bits, u32 mask);
-void iwl_clear_bits_prph(struct iwl_bus *bus, u32 reg, u32 mask);
+void iwl_clear_bits_prph(struct iwl_trans *trans, u32 reg, u32 mask);
 
-void _iwl_read_targ_mem_words(struct iwl_bus *bus, u32 addr,
+void _iwl_read_targ_mem_words(struct iwl_trans *trans, u32 addr,
                              void *buf, int words);
 
-#define iwl_read_targ_mem_words(bus, addr, buf, bufsize)       \
+#define iwl_read_targ_mem_words(trans, addr, buf, bufsize)     \
        do {                                                    \
                BUILD_BUG_ON((bufsize) % sizeof(u32));          \
-               _iwl_read_targ_mem_words(bus, addr, buf,        \
+               _iwl_read_targ_mem_words(trans, addr, buf,      \
                                         (bufsize) / sizeof(u32));\
        } while (0)
 
-int _iwl_write_targ_mem_words(struct iwl_bus *bus, u32 addr,
+int _iwl_write_targ_mem_words(struct iwl_trans *trans, u32 addr,
                              void *buf, int words);
 
-u32 iwl_read_targ_mem(struct iwl_bus *bus, u32 addr);
-int iwl_write_targ_mem(struct iwl_bus *bus, u32 addr, u32 val);
+u32 iwl_read_targ_mem(struct iwl_trans *trans, u32 addr);
+int iwl_write_targ_mem(struct iwl_trans *trans, u32 addr, u32 val);
 #endif
index 14dcbfc..5c7741f 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2003 - 2011 Intel Corporation. All rights reserved.
+ * Copyright(c) 2003 - 2012 Intel Corporation. All rights reserved.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
@@ -71,7 +71,7 @@ static const struct ieee80211_tpt_blink iwl_blink[] = {
 /* Set led register off */
 void iwlagn_led_enable(struct iwl_priv *priv)
 {
-       iwl_write32(bus(priv), CSR_LED_REG, CSR_LED_REG_TRUN_ON);
+       iwl_write32(trans(priv), CSR_LED_REG, CSR_LED_REG_TRUN_ON);
 }
 
 /*
@@ -107,9 +107,10 @@ static int iwl_send_led_cmd(struct iwl_priv *priv, struct iwl_led_cmd *led_cmd)
        };
        u32 reg;
 
-       reg = iwl_read32(bus(priv), CSR_LED_REG);
+       reg = iwl_read32(trans(priv), CSR_LED_REG);
        if (reg != (reg & CSR_LED_BSM_CTRL_MSK))
-               iwl_write32(bus(priv), CSR_LED_REG, reg & CSR_LED_BSM_CTRL_MSK);
+               iwl_write32(trans(priv), CSR_LED_REG,
+                           reg & CSR_LED_BSM_CTRL_MSK);
 
        return iwl_trans_send_cmd(trans(priv), &cmd);
 }
@@ -177,6 +178,10 @@ void iwl_leds_init(struct iwl_priv *priv)
        int mode = iwlagn_mod_params.led_mode;
        int ret;
 
+       if (mode == IWL_LED_DISABLE) {
+               IWL_INFO(priv, "Led disabled\n");
+               return;
+       }
        if (mode == IWL_LED_DEFAULT)
                mode = cfg(priv)->led_mode;
 
@@ -202,7 +207,7 @@ void iwl_leds_init(struct iwl_priv *priv)
                break;
        }
 
-       ret = led_classdev_register(bus(priv)->dev, &priv->led);
+       ret = led_classdev_register(trans(priv)->dev, &priv->led);
        if (ret) {
                kfree(priv->led.name);
                return;
index 2550b3c..b02a853 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2003 - 2011 Intel Corporation. All rights reserved.
+ * Copyright(c) 2003 - 2012 Intel Corporation. All rights reserved.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
index f980e57..03f7705 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2003 - 2011 Intel Corporation. All rights reserved.
+ * Copyright(c) 2003 - 2012 Intel Corporation. All rights reserved.
  *
  * Portions of this file are derived from the ipw3945 project, as well
  * as portions of the ieee80211 subsystem header files.
@@ -35,7 +35,6 @@
 #include <linux/sched.h>
 #include <linux/skbuff.h>
 #include <linux/netdevice.h>
-#include <linux/firmware.h>
 #include <linux/etherdevice.h>
 #include <linux/if_arp.h>
 
@@ -43,6 +42,7 @@
 
 #include <asm/div64.h>
 
+#include "iwl-ucode.h"
 #include "iwl-eeprom.h"
 #include "iwl-wifi.h"
 #include "iwl-dev.h"
@@ -51,8 +51,8 @@
 #include "iwl-agn-calib.h"
 #include "iwl-agn.h"
 #include "iwl-shared.h"
-#include "iwl-bus.h"
 #include "iwl-trans.h"
+#include "iwl-op-mode.h"
 
 /*****************************************************************************
  *
@@ -136,7 +136,7 @@ iwlagn_iface_combinations_p2p[] = {
  * other mac80211 functions grouped here.
  */
 int iwlagn_mac_setup_register(struct iwl_priv *priv,
-                                 struct iwlagn_ucode_capabilities *capa)
+                                 struct iwl_ucode_capabilities *capa)
 {
        int ret;
        struct ieee80211_hw *hw = priv->hw;
@@ -195,8 +195,8 @@ int iwlagn_mac_setup_register(struct iwl_priv *priv,
                            WIPHY_FLAG_DISABLE_BEACON_HINTS |
                            WIPHY_FLAG_IBSS_RSN;
 
-       if (trans(priv)->ucode_wowlan.code.len &&
-           device_can_wakeup(bus(priv)->dev)) {
+       if (nic(priv)->fw.ucode_wowlan.code.len &&
+           device_can_wakeup(trans(priv)->dev)) {
                hw->wiphy->wowlan.flags = WIPHY_WOWLAN_MAGIC_PKT |
                                          WIPHY_WOWLAN_DISCONNECT |
                                          WIPHY_WOWLAN_EAP_IDENTITY_REQ |
@@ -234,7 +234,7 @@ int iwlagn_mac_setup_register(struct iwl_priv *priv,
                priv->hw->wiphy->bands[IEEE80211_BAND_5GHZ] =
                        &priv->bands[IEEE80211_BAND_5GHZ];
 
-       hw->wiphy->hw_version = bus_get_hw_id(bus(priv));
+       hw->wiphy->hw_version = trans(priv)->hw_id;
 
        iwl_leds_init(priv);
 
@@ -296,7 +296,7 @@ static int __iwl_up(struct iwl_priv *priv)
 
  error:
        set_bit(STATUS_EXIT_PENDING, &priv->shrd->status);
-       __iwl_down(priv);
+       iwl_down(priv);
        clear_bit(STATUS_EXIT_PENDING, &priv->shrd->status);
 
        IWL_ERR(priv, "Unable to initialize device.\n");
@@ -305,7 +305,7 @@ static int __iwl_up(struct iwl_priv *priv)
 
 static int iwlagn_mac_start(struct ieee80211_hw *hw)
 {
-       struct iwl_priv *priv = hw->priv;
+       struct iwl_priv *priv = IWL_MAC80211_GET_DVM(hw);
        int ret;
 
        IWL_DEBUG_MAC80211(priv, "enter\n");
@@ -332,7 +332,7 @@ static int iwlagn_mac_start(struct ieee80211_hw *hw)
 
 static void iwlagn_mac_stop(struct ieee80211_hw *hw)
 {
-       struct iwl_priv *priv = hw->priv;
+       struct iwl_priv *priv = IWL_MAC80211_GET_DVM(hw);
 
        IWL_DEBUG_MAC80211(priv, "enter\n");
 
@@ -341,14 +341,19 @@ static void iwlagn_mac_stop(struct ieee80211_hw *hw)
 
        priv->is_open = 0;
 
+       mutex_lock(&priv->shrd->mutex);
        iwl_down(priv);
+       mutex_unlock(&priv->shrd->mutex);
 
-       flush_workqueue(priv->shrd->workqueue);
+       iwl_cancel_deferred_work(priv);
+
+       flush_workqueue(priv->workqueue);
 
        /* User space software may expect getting rfkill changes
-        * even if interface is down */
-       iwl_write32(bus(priv), CSR_INT, 0xFFFFFFFF);
-       iwl_enable_rfkill_int(priv);
+        * even if interface is down, trans->down will leave the RF
+        * kill interrupt enabled
+        */
+       iwl_trans_stop_hw(trans(priv));
 
        IWL_DEBUG_MAC80211(priv, "leave\n");
 }
@@ -357,7 +362,7 @@ static void iwlagn_mac_set_rekey_data(struct ieee80211_hw *hw,
                                      struct ieee80211_vif *vif,
                                      struct cfg80211_gtk_rekey_data *data)
 {
-       struct iwl_priv *priv = hw->priv;
+       struct iwl_priv *priv = IWL_MAC80211_GET_DVM(hw);
 
        if (iwlagn_mod_params.sw_crypto)
                return;
@@ -384,7 +389,7 @@ static void iwlagn_mac_set_rekey_data(struct ieee80211_hw *hw,
 static int iwlagn_mac_suspend(struct ieee80211_hw *hw,
                              struct cfg80211_wowlan *wowlan)
 {
-       struct iwl_priv *priv = hw->priv;
+       struct iwl_priv *priv = IWL_MAC80211_GET_DVM(hw);
        struct iwl_rxon_context *ctx = &priv->contexts[IWL_RXON_CTX_BSS];
        int ret;
 
@@ -405,10 +410,10 @@ static int iwlagn_mac_suspend(struct ieee80211_hw *hw,
        if (ret)
                goto error;
 
-       device_set_wakeup_enable(bus(priv)->dev, true);
+       device_set_wakeup_enable(trans(priv)->dev, true);
 
        /* Now let the ucode operate on its own */
-       iwl_write32(bus(priv), CSR_UCODE_DRV_GP1_SET,
+       iwl_write32(trans(priv), CSR_UCODE_DRV_GP1_SET,
                          CSR_UCODE_DRV_GP1_BIT_D3_CFG_COMPLETE);
 
        goto out;
@@ -426,7 +431,7 @@ static int iwlagn_mac_suspend(struct ieee80211_hw *hw,
 
 static int iwlagn_mac_resume(struct ieee80211_hw *hw)
 {
-       struct iwl_priv *priv = hw->priv;
+       struct iwl_priv *priv = IWL_MAC80211_GET_DVM(hw);
        struct iwl_rxon_context *ctx = &priv->contexts[IWL_RXON_CTX_BSS];
        struct ieee80211_vif *vif;
        unsigned long flags;
@@ -436,32 +441,33 @@ static int iwlagn_mac_resume(struct ieee80211_hw *hw)
        IWL_DEBUG_MAC80211(priv, "enter\n");
        mutex_lock(&priv->shrd->mutex);
 
-       iwl_write32(bus(priv), CSR_UCODE_DRV_GP1_CLR,
+       iwl_write32(trans(priv), CSR_UCODE_DRV_GP1_CLR,
                          CSR_UCODE_DRV_GP1_BIT_D3_CFG_COMPLETE);
 
        base = priv->shrd->device_pointers.error_event_table;
        if (iwlagn_hw_valid_rtc_data_addr(base)) {
-               spin_lock_irqsave(&bus(priv)->reg_lock, flags);
-               ret = iwl_grab_nic_access_silent(bus(priv));
+               spin_lock_irqsave(&trans(priv)->reg_lock, flags);
+               ret = iwl_grab_nic_access_silent(trans(priv));
                if (ret == 0) {
-                       iwl_write32(bus(priv), HBUS_TARG_MEM_RADDR, base);
-                       status = iwl_read32(bus(priv), HBUS_TARG_MEM_RDAT);
-                       iwl_release_nic_access(bus(priv));
+                       iwl_write32(trans(priv), HBUS_TARG_MEM_RADDR, base);
+                       status = iwl_read32(trans(priv), HBUS_TARG_MEM_RDAT);
+                       iwl_release_nic_access(trans(priv));
                }
-               spin_unlock_irqrestore(&bus(priv)->reg_lock, flags);
+               spin_unlock_irqrestore(&trans(priv)->reg_lock, flags);
 
 #ifdef CONFIG_IWLWIFI_DEBUGFS
                if (ret == 0) {
-                       struct iwl_trans *trans = trans(priv);
+                       struct iwl_nic *nic = nic(priv);
                        if (!priv->wowlan_sram)
                                priv->wowlan_sram =
-                                       kzalloc(trans->ucode_wowlan.data.len,
+                                       kzalloc(nic->fw.ucode_wowlan.data.len,
                                                GFP_KERNEL);
 
                        if (priv->wowlan_sram)
                                _iwl_read_targ_mem_words(
-                                       bus(priv), 0x800000, priv->wowlan_sram,
-                                       trans->ucode_wowlan.data.len / 4);
+                                       trans(priv), 0x800000,
+                                       priv->wowlan_sram,
+                                       nic->fw.ucode_wowlan.data.len / 4);
                }
 #endif
        }
@@ -471,7 +477,7 @@ static int iwlagn_mac_resume(struct ieee80211_hw *hw)
 
        priv->shrd->wowlan = false;
 
-       device_set_wakeup_enable(bus(priv)->dev, false);
+       device_set_wakeup_enable(trans(priv)->dev, false);
 
        iwlagn_prepare_restart(priv);
 
@@ -491,7 +497,7 @@ static int iwlagn_mac_resume(struct ieee80211_hw *hw)
 
 static void iwlagn_mac_tx(struct ieee80211_hw *hw, struct sk_buff *skb)
 {
-       struct iwl_priv *priv = hw->priv;
+       struct iwl_priv *priv = IWL_MAC80211_GET_DVM(hw);
 
        IWL_DEBUG_TX(priv, "dev->xmit(%d bytes) at rate 0x%02x\n", skb->len,
                     ieee80211_get_tx_rate(hw, IEEE80211_SKB_CB(skb))->bitrate);
@@ -506,7 +512,7 @@ static void iwlagn_mac_update_tkip_key(struct ieee80211_hw *hw,
                                       struct ieee80211_sta *sta,
                                       u32 iv32, u16 *phase1key)
 {
-       struct iwl_priv *priv = hw->priv;
+       struct iwl_priv *priv = IWL_MAC80211_GET_DVM(hw);
 
        iwl_update_tkip_key(priv, vif, keyconf, sta, iv32, phase1key);
 }
@@ -516,7 +522,7 @@ static int iwlagn_mac_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
                              struct ieee80211_sta *sta,
                              struct ieee80211_key_conf *key)
 {
-       struct iwl_priv *priv = hw->priv;
+       struct iwl_priv *priv = IWL_MAC80211_GET_DVM(hw);
        struct iwl_vif_priv *vif_priv = (void *)vif->drv_priv;
        struct iwl_rxon_context *ctx = vif_priv->ctx;
        int ret;
@@ -620,7 +626,7 @@ static int iwlagn_mac_ampdu_action(struct ieee80211_hw *hw,
                                   struct ieee80211_sta *sta, u16 tid, u16 *ssn,
                                   u8 buf_size)
 {
-       struct iwl_priv *priv = hw->priv;
+       struct iwl_priv *priv = IWL_MAC80211_GET_DVM(hw);
        int ret = -EINVAL;
        struct iwl_station_priv *sta_priv = (void *) sta->drv_priv;
 
@@ -686,7 +692,7 @@ static int iwlagn_mac_sta_add(struct ieee80211_hw *hw,
                              struct ieee80211_vif *vif,
                              struct ieee80211_sta *sta)
 {
-       struct iwl_priv *priv = hw->priv;
+       struct iwl_priv *priv = IWL_MAC80211_GET_DVM(hw);
        struct iwl_station_priv *sta_priv = (void *)sta->drv_priv;
        struct iwl_vif_priv *vif_priv = (void *)vif->drv_priv;
        bool is_ap = vif->type == NL80211_IFTYPE_STATION;
@@ -729,7 +735,7 @@ static int iwlagn_mac_sta_add(struct ieee80211_hw *hw,
 static void iwlagn_mac_channel_switch(struct ieee80211_hw *hw,
                                struct ieee80211_channel_switch *ch_switch)
 {
-       struct iwl_priv *priv = hw->priv;
+       struct iwl_priv *priv = IWL_MAC80211_GET_DVM(hw);
        const struct iwl_channel_info *ch_info;
        struct ieee80211_conf *conf = &hw->conf;
        struct ieee80211_channel *channel = ch_switch->channel;
@@ -816,7 +822,7 @@ static void iwlagn_configure_filter(struct ieee80211_hw *hw,
                                    unsigned int *total_flags,
                                    u64 multicast)
 {
-       struct iwl_priv *priv = hw->priv;
+       struct iwl_priv *priv = IWL_MAC80211_GET_DVM(hw);
        __le32 filter_or = 0, filter_nand = 0;
        struct iwl_rxon_context *ctx;
 
@@ -863,7 +869,7 @@ static void iwlagn_configure_filter(struct ieee80211_hw *hw,
 
 static void iwlagn_mac_flush(struct ieee80211_hw *hw, bool drop)
 {
-       struct iwl_priv *priv = hw->priv;
+       struct iwl_priv *priv = IWL_MAC80211_GET_DVM(hw);
 
        mutex_lock(&priv->shrd->mutex);
        IWL_DEBUG_MAC80211(priv, "enter\n");
@@ -900,7 +906,7 @@ static int iwlagn_mac_remain_on_channel(struct ieee80211_hw *hw,
                                     enum nl80211_channel_type channel_type,
                                     int duration)
 {
-       struct iwl_priv *priv = hw->priv;
+       struct iwl_priv *priv = IWL_MAC80211_GET_DVM(hw);
        struct iwl_rxon_context *ctx = &priv->contexts[IWL_RXON_CTX_PAN];
        int err = 0;
 
@@ -990,7 +996,7 @@ static int iwlagn_mac_remain_on_channel(struct ieee80211_hw *hw,
 
 static int iwlagn_mac_cancel_remain_on_channel(struct ieee80211_hw *hw)
 {
-       struct iwl_priv *priv = hw->priv;
+       struct iwl_priv *priv = IWL_MAC80211_GET_DVM(hw);
 
        if (!(priv->shrd->valid_contexts & BIT(IWL_RXON_CTX_PAN)))
                return -EOPNOTSUPP;
@@ -1010,7 +1016,7 @@ static int iwlagn_mac_tx_sync(struct ieee80211_hw *hw,
                              const u8 *bssid,
                              enum ieee80211_tx_sync_type type)
 {
-       struct iwl_priv *priv = hw->priv;
+       struct iwl_priv *priv = IWL_MAC80211_GET_DVM(hw);
        struct iwl_vif_priv *vif_priv = (void *)vif->drv_priv;
        struct iwl_rxon_context *ctx = vif_priv->ctx;
        int ret;
@@ -1064,7 +1070,7 @@ static void iwlagn_mac_finish_tx_sync(struct ieee80211_hw *hw,
                                   const u8 *bssid,
                                   enum ieee80211_tx_sync_type type)
 {
-       struct iwl_priv *priv = hw->priv;
+       struct iwl_priv *priv = IWL_MAC80211_GET_DVM(hw);
        struct iwl_vif_priv *vif_priv = (void *)vif->drv_priv;
        struct iwl_rxon_context *ctx = vif_priv->ctx;
 
@@ -1088,7 +1094,7 @@ static void iwlagn_mac_finish_tx_sync(struct ieee80211_hw *hw,
 static void iwlagn_mac_rssi_callback(struct ieee80211_hw *hw,
                           enum ieee80211_rssi_event rssi_event)
 {
-       struct iwl_priv *priv = hw->priv;
+       struct iwl_priv *priv = IWL_MAC80211_GET_DVM(hw);
 
        IWL_DEBUG_MAC80211(priv, "enter\n");
        mutex_lock(&priv->shrd->mutex);
@@ -1113,9 +1119,9 @@ static void iwlagn_mac_rssi_callback(struct ieee80211_hw *hw,
 static int iwlagn_mac_set_tim(struct ieee80211_hw *hw,
                           struct ieee80211_sta *sta, bool set)
 {
-       struct iwl_priv *priv = hw->priv;
+       struct iwl_priv *priv = IWL_MAC80211_GET_DVM(hw);
 
-       queue_work(priv->shrd->workqueue, &priv->beacon_update);
+       queue_work(priv->workqueue, &priv->beacon_update);
 
        return 0;
 }
@@ -1124,7 +1130,7 @@ static int iwlagn_mac_conf_tx(struct ieee80211_hw *hw,
                    struct ieee80211_vif *vif, u16 queue,
                    const struct ieee80211_tx_queue_params *params)
 {
-       struct iwl_priv *priv = hw->priv;
+       struct iwl_priv *priv = IWL_MAC80211_GET_DVM(hw);
        struct iwl_vif_priv *vif_priv = (void *)vif->drv_priv;
        struct iwl_rxon_context *ctx = vif_priv->ctx;
        unsigned long flags;
@@ -1167,7 +1173,7 @@ static int iwlagn_mac_conf_tx(struct ieee80211_hw *hw,
 
 static int iwlagn_mac_tx_last_beacon(struct ieee80211_hw *hw)
 {
-       struct iwl_priv *priv = hw->priv;
+       struct iwl_priv *priv = IWL_MAC80211_GET_DVM(hw);
 
        return priv->ibss_manager == IWL_IBSS_MANAGER;
 }
@@ -1221,7 +1227,7 @@ static int iwl_setup_interface(struct iwl_priv *priv,
 static int iwlagn_mac_add_interface(struct ieee80211_hw *hw,
                             struct ieee80211_vif *vif)
 {
-       struct iwl_priv *priv = hw->priv;
+       struct iwl_priv *priv = IWL_MAC80211_GET_DVM(hw);
        struct iwl_vif_priv *vif_priv = (void *)vif->drv_priv;
        struct iwl_rxon_context *tmp, *ctx = NULL;
        int err;
@@ -1318,7 +1324,7 @@ static void iwl_teardown_interface(struct iwl_priv *priv,
 static void iwlagn_mac_remove_interface(struct ieee80211_hw *hw,
                              struct ieee80211_vif *vif)
 {
-       struct iwl_priv *priv = hw->priv;
+       struct iwl_priv *priv = IWL_MAC80211_GET_DVM(hw);
        struct iwl_rxon_context *ctx = iwl_rxon_ctx_from_vif(vif);
 
        IWL_DEBUG_MAC80211(priv, "enter\n");
@@ -1346,7 +1352,7 @@ static int iwlagn_mac_change_interface(struct ieee80211_hw *hw,
                                struct ieee80211_vif *vif,
                                enum nl80211_iftype newtype, bool newp2p)
 {
-       struct iwl_priv *priv = hw->priv;
+       struct iwl_priv *priv = IWL_MAC80211_GET_DVM(hw);
        struct iwl_rxon_context *ctx = iwl_rxon_ctx_from_vif(vif);
        struct iwl_rxon_context *bss_ctx = &priv->contexts[IWL_RXON_CTX_BSS];
        struct iwl_rxon_context *tmp;
@@ -1432,7 +1438,7 @@ static int iwlagn_mac_hw_scan(struct ieee80211_hw *hw,
                    struct ieee80211_vif *vif,
                    struct cfg80211_scan_request *req)
 {
-       struct iwl_priv *priv = hw->priv;
+       struct iwl_priv *priv = IWL_MAC80211_GET_DVM(hw);
        int ret;
 
        IWL_DEBUG_MAC80211(priv, "enter\n");
@@ -1478,7 +1484,7 @@ static int iwlagn_mac_sta_remove(struct ieee80211_hw *hw,
                       struct ieee80211_vif *vif,
                       struct ieee80211_sta *sta)
 {
-       struct iwl_priv *priv = hw->priv;
+       struct iwl_priv *priv = IWL_MAC80211_GET_DVM(hw);
        struct iwl_station_priv *sta_priv = (void *)sta->drv_priv;
        int ret;
 
@@ -1517,7 +1523,7 @@ static void iwlagn_mac_sta_notify(struct ieee80211_hw *hw,
                           enum sta_notify_cmd cmd,
                           struct ieee80211_sta *sta)
 {
-       struct iwl_priv *priv = hw->priv;
+       struct iwl_priv *priv = IWL_MAC80211_GET_DVM(hw);
        struct iwl_station_priv *sta_priv = (void *)sta->drv_priv;
        int sta_id;
 
@@ -1585,15 +1591,18 @@ struct ieee80211_ops iwlagn_hw_ops = {
 struct ieee80211_hw *iwl_alloc_all(void)
 {
        struct iwl_priv *priv;
+       struct iwl_op_mode *op_mode;
        /* mac80211 allocates memory for this device instance, including
         *   space for this driver's private structure */
        struct ieee80211_hw *hw;
 
-       hw = ieee80211_alloc_hw(sizeof(struct iwl_priv), &iwlagn_hw_ops);
+       hw = ieee80211_alloc_hw(sizeof(struct iwl_priv) +
+                               sizeof(struct iwl_op_mode), &iwlagn_hw_ops);
        if (!hw)
                goto out;
 
-       priv = hw->priv;
+       op_mode = hw->priv;
+       priv = IWL_OP_MODE_GET_DVM(op_mode);
        priv->hw = hw;
 
 out:
diff --git a/drivers/net/wireless/iwlwifi/iwl-op-mode.h b/drivers/net/wireless/iwlwifi/iwl-op-mode.h
new file mode 100644 (file)
index 0000000..d4fc9be
--- /dev/null
@@ -0,0 +1,198 @@
+/******************************************************************************
+ *
+ * This file is provided under a dual BSD/GPLv2 license.  When using or
+ * redistributing this file, you may do so under either license.
+ *
+ * GPL LICENSE SUMMARY
+ *
+ * Copyright(c) 2007 - 2012 Intel Corporation. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of version 2 of the GNU General Public License as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110,
+ * USA
+ *
+ * The full GNU General Public License is included in this distribution
+ * in the file called LICENSE.GPL.
+ *
+ * Contact Information:
+ *  Intel Linux Wireless <ilw@linux.intel.com>
+ * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
+ *
+ * BSD LICENSE
+ *
+ * Copyright(c) 2005 - 2012 Intel Corporation. All rights reserved.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *  * Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  * Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *  * Neither the name Intel Corporation nor the names of its
+ *    contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ *****************************************************************************/
+#ifndef __iwl_op_mode_h__
+#define __iwl_op_mode_h__
+
+struct iwl_op_mode;
+struct iwl_trans;
+struct sk_buff;
+struct iwl_device_cmd;
+struct iwl_rx_mem_buffer;
+
+/**
+ * DOC: Operational mode - what is it ?
+ *
+ * The operational mode (a.k.a. op_mode) is the layer that implements
+ * mac80211's handlers. It knows two APIs: mac80211's and the fw's. It uses
+ * the transport API to access the HW. The op_mode doesn't need to know how the
+ * underlying HW works, since the transport layer takes care of that.
+ *
+ * There can be several op_mode: i.e. different fw APIs will require two
+ * different op_modes. This is why the op_mode is virtualized.
+ */
+
+/**
+ * DOC: Life cycle of the Operational mode
+ *
+ * The operational mode has a very simple life cycle.
+ *
+ *     1) The driver layer (iwl-drv.c) chooses the op_mode based on the
+ *        capabilities advertized by the fw file (in TLV format).
+ *     2) The driver layer starts the op_mode (ops->start)
+ *     3) The op_mode registers registers mac80211
+ *     4) The op_mode is governed by mac80211
+ *     5) The driver layer stops the op_mode
+ */
+
+/**
+ * struct iwl_op_mode_ops - op_mode specific operations
+ *
+ * The op_mode exports its ops so that external components can start it and
+ * interact with it. The driver layer typically calls the start and stop
+ * handlers, the transport layer calls the others.
+ *
+ * All the handlers MUST be implemented
+ *
+ * @start: start the op_mode. The transport layer is already allocated.
+ *     May sleep
+ * @stop: stop the op_mode. Must free all the memory allocated.
+ *     May sleep
+ * @rx: Rx notification to the op_mode. rxb is the Rx buffer itself. Cmd is the
+ *     HCMD the this Rx responds to.
+ *     Must be atomic.
+ * @queue_full: notifies that a HW queue is full. Ac is the ac of the queue
+ *     Must be atomic
+ * @queue_not_full: notifies that a HW queue is not full any more.
+ *     Ac is the ac of the queue. Must be atomic
+ * @hw_rf_kill:notifies of a change in the HW rf kill switch. True means that
+ *     the radio is killed. Must be atomic.
+ * @free_skb: allows the transport layer to free skbs that haven't been
+ *     reclaimed by the op_mode. This can happen when the driver is freed and
+ *     there are Tx packets pending in the transport layer.
+ *     Must be atomic
+ * @nic_error: error notification. Must be atomic
+ */
+struct iwl_op_mode_ops {
+       struct iwl_op_mode *(*start)(struct iwl_trans *trans);
+       void (*stop)(struct iwl_op_mode *op_mode);
+       int (*rx)(struct iwl_op_mode *op_mode, struct iwl_rx_mem_buffer *rxb,
+                 struct iwl_device_cmd *cmd);
+       void (*queue_full)(struct iwl_op_mode *op_mode, u8 ac);
+       void (*queue_not_full)(struct iwl_op_mode *op_mode, u8 ac);
+       void (*hw_rf_kill)(struct iwl_op_mode *op_mode, bool state);
+       void (*free_skb)(struct iwl_op_mode *op_mode, struct sk_buff *skb);
+       void (*nic_error)(struct iwl_op_mode *op_mode);
+};
+
+/**
+ * struct iwl_op_mode - operational mode
+ *
+ * This holds an implementation of the mac80211 / fw API.
+ *
+ * @ops - pointer to its own ops
+ */
+struct iwl_op_mode {
+       const struct iwl_op_mode_ops *ops;
+       const struct iwl_trans *trans;
+
+       char op_mode_specific[0] __aligned(sizeof(void *));
+};
+
+static inline void iwl_op_mode_stop(struct iwl_op_mode *op_mode)
+{
+       might_sleep();
+
+       op_mode->ops->stop(op_mode);
+}
+
+static inline int iwl_op_mode_rx(struct iwl_op_mode *op_mode,
+                                 struct iwl_rx_mem_buffer *rxb,
+                                 struct iwl_device_cmd *cmd)
+{
+       return op_mode->ops->rx(op_mode, rxb, cmd);
+}
+
+static inline void iwl_op_mode_queue_full(struct iwl_op_mode *op_mode, u8 ac)
+{
+       op_mode->ops->queue_full(op_mode, ac);
+}
+
+static inline void iwl_op_mode_queue_not_full(struct iwl_op_mode *op_mode,
+                                             u8 ac)
+{
+       op_mode->ops->queue_not_full(op_mode, ac);
+}
+
+static inline void iwl_op_mode_hw_rf_kill(struct iwl_op_mode *op_mode,
+                                         bool state)
+{
+       op_mode->ops->hw_rf_kill(op_mode, state);
+}
+
+static inline void iwl_op_mode_free_skb(struct iwl_op_mode *op_mode,
+                                       struct sk_buff *skb)
+{
+       op_mode->ops->free_skb(op_mode, skb);
+}
+
+static inline void iwl_op_mode_nic_error(struct iwl_op_mode *op_mode)
+{
+       op_mode->ops->nic_error(op_mode);
+}
+
+/*****************************************************
+* Op mode layers implementations
+******************************************************/
+extern const struct iwl_op_mode_ops iwl_dvm_ops;
+
+#endif /* __iwl_op_mode_h__ */
index fb30ea7..06e0041 100644 (file)
@@ -5,7 +5,7 @@
  *
  * GPL LICENSE SUMMARY
  *
- * Copyright(c) 2007 - 2011 Intel Corporation. All rights reserved.
+ * Copyright(c) 2007 - 2012 Intel Corporation. All rights reserved.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of version 2 of the GNU General Public License as
@@ -30,7 +30,7 @@
  *
  * BSD LICENSE
  *
- * Copyright(c) 2005 - 2011 Intel Corporation. All rights reserved.
+ * Copyright(c) 2005 - 2012 Intel Corporation. All rights reserved.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
 #include <linux/pci.h>
 #include <linux/pci-aspm.h>
 
-#include "iwl-bus.h"
 #include "iwl-io.h"
 #include "iwl-shared.h"
 #include "iwl-trans.h"
 #include "iwl-csr.h"
 #include "iwl-cfg.h"
-
-/* PCI registers */
-#define PCI_CFG_RETRY_TIMEOUT  0x041
-#define PCI_CFG_LINK_CTRL_VAL_L0S_EN   0x01
-#define PCI_CFG_LINK_CTRL_VAL_L1_EN    0x02
-
-struct iwl_pci_bus {
-       /* basic pci-network driver stuff */
-       struct pci_dev *pci_dev;
-
-       /* pci hardware address support */
-       void __iomem *hw_base;
-};
-
-#define IWL_BUS_GET_PCI_BUS(_iwl_bus) \
-                       ((struct iwl_pci_bus *) ((_iwl_bus)->bus_specific))
-
-#define IWL_BUS_GET_PCI_DEV(_iwl_bus) \
-                       ((IWL_BUS_GET_PCI_BUS(_iwl_bus))->pci_dev)
-
-static u16 iwl_pciexp_link_ctrl(struct iwl_bus *bus)
-{
-       int pos;
-       u16 pci_lnk_ctl;
-
-       struct pci_dev *pci_dev = IWL_BUS_GET_PCI_DEV(bus);
-
-       pos = pci_pcie_cap(pci_dev);
-       pci_read_config_word(pci_dev, pos + PCI_EXP_LNKCTL, &pci_lnk_ctl);
-       return pci_lnk_ctl;
-}
-
-static bool iwl_pci_is_pm_supported(struct iwl_bus *bus)
-{
-       u16 lctl = iwl_pciexp_link_ctrl(bus);
-
-       return !(lctl & PCI_CFG_LINK_CTRL_VAL_L0S_EN);
-}
-
-static void iwl_pci_apm_config(struct iwl_bus *bus)
-{
-       /*
-        * HW bug W/A for instability in PCIe bus L0S->L1 transition.
-        * Check if BIOS (or OS) enabled L1-ASPM on this device.
-        * If so (likely), disable L0S, so device moves directly L0->L1;
-        *    costs negligible amount of power savings.
-        * If not (unlikely), enable L0S, so there is at least some
-        *    power savings, even without L1.
-        */
-       u16 lctl = iwl_pciexp_link_ctrl(bus);
-
-       if ((lctl & PCI_CFG_LINK_CTRL_VAL_L1_EN) ==
-                               PCI_CFG_LINK_CTRL_VAL_L1_EN) {
-               /* L1-ASPM enabled; disable(!) L0S */
-               iwl_set_bit(bus, CSR_GIO_REG,
-                               CSR_GIO_REG_VAL_L0S_ENABLED);
-               dev_printk(KERN_INFO, bus->dev, "L1 Enabled; Disabling L0S\n");
-       } else {
-               /* L1-ASPM disabled; enable(!) L0S */
-               iwl_clear_bit(bus, CSR_GIO_REG,
-                               CSR_GIO_REG_VAL_L0S_ENABLED);
-               dev_printk(KERN_INFO, bus->dev, "L1 Disabled; Enabling L0S\n");
-       }
-}
-
-static void iwl_pci_get_hw_id_string(struct iwl_bus *bus, char buf[],
-                             int buf_len)
-{
-       struct pci_dev *pci_dev = IWL_BUS_GET_PCI_DEV(bus);
-
-       snprintf(buf, buf_len, "PCI ID: 0x%04X:0x%04X", pci_dev->device,
-                pci_dev->subsystem_device);
-}
-
-static u32 iwl_pci_get_hw_id(struct iwl_bus *bus)
-{
-       struct pci_dev *pci_dev = IWL_BUS_GET_PCI_DEV(bus);
-
-       return (pci_dev->device << 16) + pci_dev->subsystem_device;
-}
-
-static void iwl_pci_write8(struct iwl_bus *bus, u32 ofs, u8 val)
-{
-       iowrite8(val, IWL_BUS_GET_PCI_BUS(bus)->hw_base + ofs);
-}
-
-static void iwl_pci_write32(struct iwl_bus *bus, u32 ofs, u32 val)
-{
-       iowrite32(val, IWL_BUS_GET_PCI_BUS(bus)->hw_base + ofs);
-}
-
-static u32 iwl_pci_read32(struct iwl_bus *bus, u32 ofs)
-{
-       u32 val = ioread32(IWL_BUS_GET_PCI_BUS(bus)->hw_base + ofs);
-       return val;
-}
-
-static const struct iwl_bus_ops bus_ops_pci = {
-       .get_pm_support = iwl_pci_is_pm_supported,
-       .apm_config = iwl_pci_apm_config,
-       .get_hw_id_string = iwl_pci_get_hw_id_string,
-       .get_hw_id = iwl_pci_get_hw_id,
-       .write8 = iwl_pci_write8,
-       .write32 = iwl_pci_write32,
-       .read32 = iwl_pci_read32,
-};
+#include "iwl-drv.h"
+#include "iwl-trans.h"
 
 #define IWL_PCI_DEVICE(dev, subdev, cfg) \
        .vendor = PCI_VENDOR_ID_INTEL,  .device = (dev), \
@@ -263,9 +158,9 @@ static DEFINE_PCI_DEVICE_TABLE(iwl_hw_card_ids) = {
        {IWL_PCI_DEVICE(0x0085, 0x1316, iwl6005_2abg_cfg)},
        {IWL_PCI_DEVICE(0x0082, 0xC020, iwl6005_2agn_sff_cfg)},
        {IWL_PCI_DEVICE(0x0085, 0xC220, iwl6005_2agn_sff_cfg)},
-       {IWL_PCI_DEVICE(0x0082, 0x1341, iwl6005_2agn_d_cfg)},
-       {IWL_PCI_DEVICE(0x0082, 0x1304, iwl6005_2agn_cfg)},/* low 5GHz active */
-       {IWL_PCI_DEVICE(0x0082, 0x1305, iwl6005_2agn_cfg)},/* high 5GHz active */
+       {IWL_PCI_DEVICE(0x0082, 0x4820, iwl6005_2agn_d_cfg)},
+       {IWL_PCI_DEVICE(0x0082, 0x1304, iwl6005_2agn_mow1_cfg)},/* low 5GHz active */
+       {IWL_PCI_DEVICE(0x0082, 0x1305, iwl6005_2agn_mow2_cfg)},/* high 5GHz active */
 
 /* 6x30 Series */
        {IWL_PCI_DEVICE(0x008A, 0x5305, iwl1030_bgn_cfg)},
@@ -346,6 +241,7 @@ static DEFINE_PCI_DEVICE_TABLE(iwl_hw_card_ids) = {
        {IWL_PCI_DEVICE(0x088E, 0x4060, iwl6035_2agn_cfg)},
        {IWL_PCI_DEVICE(0x088F, 0x4260, iwl6035_2agn_cfg)},
        {IWL_PCI_DEVICE(0x088E, 0x4460, iwl6035_2agn_cfg)},
+       {IWL_PCI_DEVICE(0x088E, 0x4860, iwl6035_2agn_cfg)},
 
 /* 105 Series */
        {IWL_PCI_DEVICE(0x0894, 0x0022, iwl105_bgn_cfg)},
@@ -362,132 +258,71 @@ static DEFINE_PCI_DEVICE_TABLE(iwl_hw_card_ids) = {
 };
 MODULE_DEVICE_TABLE(pci, iwl_hw_card_ids);
 
+/* PCI registers */
+#define PCI_CFG_RETRY_TIMEOUT  0x041
+
 static int iwl_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 {
        struct iwl_cfg *cfg = (struct iwl_cfg *)(ent->driver_data);
-       struct iwl_bus *bus;
-       struct iwl_pci_bus *pci_bus;
-       u16 pci_cmd;
+       struct iwl_shared *shrd;
+       struct iwl_trans *iwl_trans;
        int err;
 
-       bus = kzalloc(sizeof(*bus) + sizeof(*pci_bus), GFP_KERNEL);
-       if (!bus) {
+       shrd = kzalloc(sizeof(*iwl_trans->shrd), GFP_KERNEL);
+       if (!shrd) {
                dev_printk(KERN_ERR, &pdev->dev,
-                          "Couldn't allocate iwl_pci_bus");
+                          "Couldn't allocate iwl_shared");
                err = -ENOMEM;
-               goto out_no_pci;
-       }
-
-       pci_bus = IWL_BUS_GET_PCI_BUS(bus);
-       pci_bus->pci_dev = pdev;
-
-       pci_set_drvdata(pdev, bus);
-
-       /* W/A - seems to solve weird behavior. We need to remove this if we
-        * don't want to stay in L1 all the time. This wastes a lot of power */
-       pci_disable_link_state(pdev, PCIE_LINK_STATE_L0S | PCIE_LINK_STATE_L1 |
-                               PCIE_LINK_STATE_CLKPM);
-
-       if (pci_enable_device(pdev)) {
-               err = -ENODEV;
-               goto out_no_pci;
+               goto out_free_bus;
        }
 
-       pci_set_master(pdev);
-
-       err = pci_set_dma_mask(pdev, DMA_BIT_MASK(36));
-       if (!err)
-               err = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(36));
-       if (err) {
-               err = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
-               if (!err)
-                       err = pci_set_consistent_dma_mask(pdev,
-                                                       DMA_BIT_MASK(32));
-               /* both attempts failed: */
-               if (err) {
-                       dev_printk(KERN_ERR, bus->dev,
-                                  "No suitable DMA available.\n");
-                       goto out_pci_disable_device;
-               }
+#ifdef CONFIG_IWLWIFI_IDI
+       iwl_trans = iwl_trans_idi_alloc(shrd, pdev, ent);
+       if (iwl_trans == NULL) {
+               err = -ENOMEM;
+               goto out_free_bus;
        }
 
-       err = pci_request_regions(pdev, DRV_NAME);
-       if (err) {
-               dev_printk(KERN_ERR, bus->dev, "pci_request_regions failed");
-               goto out_pci_disable_device;
-       }
+       shrd->trans = iwl_trans;
+       pci_set_drvdata(pdev, iwl_trans);
 
-       pci_bus->hw_base = pci_iomap(pdev, 0, 0);
-       if (!pci_bus->hw_base) {
-               dev_printk(KERN_ERR, bus->dev, "pci_iomap failed");
-               err = -ENODEV;
-               goto out_pci_release_regions;
+       err = iwl_drv_start(shrd, iwl_trans, cfg);
+#else
+       iwl_trans = iwl_trans_pcie_alloc(shrd, pdev, ent);
+       if (iwl_trans == NULL) {
+               err = -ENOMEM;
+               goto out_free_bus;
        }
 
-       dev_printk(KERN_INFO, &pdev->dev,
-               "pci_resource_len = 0x%08llx\n",
-               (unsigned long long) pci_resource_len(pdev, 0));
-       dev_printk(KERN_INFO, &pdev->dev,
-               "pci_resource_base = %p\n", pci_bus->hw_base);
-
-       dev_printk(KERN_INFO, &pdev->dev,
-               "HW Revision ID = 0x%X\n", pdev->revision);
+       shrd->trans = iwl_trans;
+       pci_set_drvdata(pdev, iwl_trans);
 
-       /* We disable the RETRY_TIMEOUT register (0x41) to keep
-        * PCI Tx retries from interfering with C3 CPU state */
-       pci_write_config_byte(pdev, PCI_CFG_RETRY_TIMEOUT, 0x00);
-
-       err = pci_enable_msi(pdev);
+       err = iwl_drv_start(shrd, iwl_trans, cfg);
+#endif
        if (err)
-               dev_printk(KERN_ERR, &pdev->dev,
-                       "pci_enable_msi failed(0X%x)", err);
-
-       /* TODO: Move this away, not needed if not MSI */
-       /* enable rfkill interrupt: hw bug w/a */
-       pci_read_config_word(pdev, PCI_COMMAND, &pci_cmd);
-       if (pci_cmd & PCI_COMMAND_INTX_DISABLE) {
-               pci_cmd &= ~PCI_COMMAND_INTX_DISABLE;
-               pci_write_config_word(pdev, PCI_COMMAND, pci_cmd);
-       }
-
-       bus->dev = &pdev->dev;
-       bus->irq = pdev->irq;
-       bus->ops = &bus_ops_pci;
+               goto out_free_trans;
 
-       err = iwl_probe(bus, &trans_ops_pcie, cfg);
-       if (err)
-               goto out_disable_msi;
        return 0;
 
-out_disable_msi:
-       pci_disable_msi(pdev);
-       pci_iounmap(pdev, pci_bus->hw_base);
-out_pci_release_regions:
+out_free_trans:
+       iwl_trans_free(iwl_trans);
        pci_set_drvdata(pdev, NULL);
-       pci_release_regions(pdev);
-out_pci_disable_device:
-       pci_disable_device(pdev);
-out_no_pci:
-       kfree(bus);
+out_free_bus:
+       kfree(shrd);
        return err;
 }
 
 static void __devexit iwl_pci_remove(struct pci_dev *pdev)
 {
-       struct iwl_bus *bus = pci_get_drvdata(pdev);
-       struct iwl_pci_bus *pci_bus = IWL_BUS_GET_PCI_BUS(bus);
-       struct pci_dev *pci_dev = IWL_BUS_GET_PCI_DEV(bus);
-       struct iwl_shared *shrd = bus->shrd;
+       struct iwl_trans *iwl_trans = pci_get_drvdata(pdev);
+       struct iwl_shared *shrd = iwl_trans->shrd;
 
-       iwl_remove(shrd->priv);
+       iwl_drv_stop(shrd);
+       iwl_trans_free(shrd->trans);
 
-       pci_disable_msi(pci_dev);
-       pci_iounmap(pci_dev, pci_bus->hw_base);
-       pci_release_regions(pci_dev);
-       pci_disable_device(pci_dev);
-       pci_set_drvdata(pci_dev, NULL);
+       pci_set_drvdata(pdev, NULL);
 
-       kfree(bus);
+       kfree(shrd);
 }
 
 #ifdef CONFIG_PM_SLEEP
@@ -495,22 +330,20 @@ static void __devexit iwl_pci_remove(struct pci_dev *pdev)
 static int iwl_pci_suspend(struct device *device)
 {
        struct pci_dev *pdev = to_pci_dev(device);
-       struct iwl_bus *bus = pci_get_drvdata(pdev);
-       struct iwl_shared *shrd = bus->shrd;
+       struct iwl_trans *iwl_trans = pci_get_drvdata(pdev);
 
        /* Before you put code here, think about WoWLAN. You cannot check here
         * whether WoWLAN is enabled or not, and your code will run even if
         * WoWLAN is enabled - don't kill the NIC, someone may need it in Sx.
         */
 
-       return iwl_trans_suspend(shrd->trans);
+       return iwl_trans_suspend(iwl_trans);
 }
 
 static int iwl_pci_resume(struct device *device)
 {
        struct pci_dev *pdev = to_pci_dev(device);
-       struct iwl_bus *bus = pci_get_drvdata(pdev);
-       struct iwl_shared *shrd = bus->shrd;
+       struct iwl_trans *iwl_trans = pci_get_drvdata(pdev);
 
        /* Before you put code here, think about WoWLAN. You cannot check here
         * whether WoWLAN is enabled or not, and your code will run even if
@@ -523,7 +356,7 @@ static int iwl_pci_resume(struct device *device)
         */
        pci_write_config_byte(pdev, PCI_CFG_RETRY_TIMEOUT, 0x00);
 
-       return iwl_trans_resume(shrd->trans);
+       return iwl_trans_resume(iwl_trans);
 }
 
 static SIMPLE_DEV_PM_OPS(iwl_dev_pm_ops, iwl_pci_suspend, iwl_pci_resume);
index 2b188a6..fd008c4 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2007 - 2011 Intel Corporation. All rights reserved.
+ * Copyright(c) 2007 - 2012 Intel Corporation. All rights reserved.
  *
  * Portions of this file are derived from the ipw3945 project, as well
  * as portions of the ieee80211 subsystem header files.
@@ -436,7 +436,7 @@ int iwl_power_update_mode(struct iwl_priv *priv, bool force)
 /* initialize to default */
 void iwl_power_initialize(struct iwl_priv *priv)
 {
-       priv->power_data.bus_pm = bus_get_pm_support(bus(priv));
+       priv->power_data.bus_pm = trans(priv)->pm_support;
 
        priv->power_data.debug_sleep_level_override = -1;
 
index 5f7b720..07a19fc 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2007 - 2011 Intel Corporation. All rights reserved.
+ * Copyright(c) 2007 - 2012 Intel Corporation. All rights reserved.
  *
  * Portions of this file are derived from the ipw3945 project, as well
  * as portions of the ieee80211 subsystem header files.
index bebdd82..a4d1101 100644 (file)
@@ -5,7 +5,7 @@
  *
  * GPL LICENSE SUMMARY
  *
- * Copyright(c) 2005 - 2011 Intel Corporation. All rights reserved.
+ * Copyright(c) 2005 - 2012 Intel Corporation. All rights reserved.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of version 2 of the GNU General Public License as
@@ -30,7 +30,7 @@
  *
  * BSD LICENSE
  *
- * Copyright(c) 2005 - 2011 Intel Corporation. All rights reserved.
+ * Copyright(c) 2005 - 2012 Intel Corporation. All rights reserved.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
index a645472..42ee1c4 100644 (file)
@@ -2,7 +2,7 @@
  *
  * GPL LICENSE SUMMARY
  *
- * Copyright(c) 2008 - 2011 Intel Corporation. All rights reserved.
+ * Copyright(c) 2008 - 2012 Intel Corporation. All rights reserved.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of version 2 of the GNU General Public License as
@@ -218,7 +218,7 @@ static void iwl_do_scan_abort(struct iwl_priv *priv)
 int iwl_scan_cancel(struct iwl_priv *priv)
 {
        IWL_DEBUG_SCAN(priv, "Queuing abort scan\n");
-       queue_work(priv->shrd->workqueue, &priv->abort_scan);
+       queue_work(priv->workqueue, &priv->abort_scan);
        return 0;
 }
 
@@ -354,7 +354,7 @@ static int iwl_rx_scan_complete_notif(struct iwl_priv *priv,
         */
        set_bit(STATUS_SCAN_COMPLETE, &priv->shrd->status);
        clear_bit(STATUS_SCAN_HW, &priv->shrd->status);
-       queue_work(priv->shrd->workqueue, &priv->scan_completed);
+       queue_work(priv->workqueue, &priv->scan_completed);
 
        if (priv->iw_mode != NL80211_IFTYPE_ADHOC &&
            iwl_advanced_bt_coexist(priv) &&
@@ -374,7 +374,7 @@ static int iwl_rx_scan_complete_notif(struct iwl_priv *priv,
                                IWL_BT_COEX_TRAFFIC_LOAD_NONE;
                }
                priv->bt_status = scan_notif->bt_status;
-               queue_work(priv->shrd->workqueue,
+               queue_work(priv->workqueue,
                           &priv->bt_traffic_change_work);
        }
        return 0;
@@ -414,10 +414,25 @@ static u16 iwl_limit_dwell(struct iwl_priv *priv, u16 dwell_time)
        for_each_context(priv, ctx) {
                u16 value;
 
-               if (!iwl_is_associated_ctx(ctx))
-                       continue;
-               if (ctx->staging.dev_type == RXON_DEV_TYPE_P2P)
+               switch (ctx->staging.dev_type) {
+               case RXON_DEV_TYPE_P2P:
+                       /* no timing constraints */
                        continue;
+               case RXON_DEV_TYPE_ESS:
+               default:
+                       /* timing constraints if associated */
+                       if (!iwl_is_associated_ctx(ctx))
+                               continue;
+                       break;
+               case RXON_DEV_TYPE_CP:
+               case RXON_DEV_TYPE_2STA:
+                       /*
+                        * These seem to always have timers for TBTT
+                        * active in uCode even when not associated yet.
+                        */
+                       break;
+               }
+
                value = ctx->beacon_int;
                if (!value)
                        value = IWL_PASSIVE_DWELL_BASE;
@@ -935,7 +950,7 @@ int __must_check iwl_scan_initiate(struct iwl_priv *priv,
                return ret;
        }
 
-       queue_delayed_work(priv->shrd->workqueue, &priv->scan_check,
+       queue_delayed_work(priv->workqueue, &priv->scan_check,
                           IWL_SCAN_CHECK_WATCHDOG);
 
        return 0;
@@ -948,7 +963,7 @@ int __must_check iwl_scan_initiate(struct iwl_priv *priv,
  */
 void iwl_internal_short_hw_scan(struct iwl_priv *priv)
 {
-       queue_work(priv->shrd->workqueue, &priv->start_internal_scan);
+       queue_work(priv->workqueue, &priv->start_internal_scan);
 }
 
 static void iwl_bg_start_internal_scan(struct work_struct *work)
index dc55cc4..a644162 100644 (file)
@@ -5,7 +5,7 @@
  *
  * GPL LICENSE SUMMARY
  *
- * Copyright(c) 2007 - 2011 Intel Corporation. All rights reserved.
+ * Copyright(c) 2007 - 2012 Intel Corporation. All rights reserved.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of version 2 of the GNU General Public License as
@@ -30,7 +30,7 @@
  *
  * BSD LICENSE
  *
- * Copyright(c) 2005 - 2011 Intel Corporation. All rights reserved.
+ * Copyright(c) 2005 - 2012 Intel Corporation. All rights reserved.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -94,7 +94,6 @@
  * This implementation is iwl-pci.c
  */
 
-struct iwl_bus;
 struct iwl_priv;
 struct iwl_trans;
 struct iwl_sensitivity_ranges;
@@ -102,7 +101,7 @@ struct iwl_trans_ops;
 
 #define DRV_NAME        "iwlwifi"
 #define IWLWIFI_VERSION "in-tree:"
-#define DRV_COPYRIGHT  "Copyright(c) 2003-2011 Intel Corporation"
+#define DRV_COPYRIGHT  "Copyright(c) 2003-2012 Intel Corporation"
 #define DRV_AUTHOR     "<ilw@linux.intel.com>"
 
 extern struct iwl_mod_params iwlagn_mod_params;
@@ -173,8 +172,6 @@ struct iwl_mod_params {
  * @ht40_channel: is 40MHz width possible: BIT(IEEE80211_BAND_XXX)
  * @sku: sku read from EEPROM
  * @rx_page_order: Rx buffer page order
- * @max_inst_size: for ucode use
- * @max_data_size: for ucode use
  * @ct_kill_threshold: temperature threshold - in hw dependent unit
  * @ct_kill_exit_threshold: when to reeable the device - in hw dependent unit
  *     relevant for 1000, 6000 and up
@@ -192,8 +189,6 @@ struct iwl_hw_params {
        bool shadow_reg_enable;
        u16 sku;
        u32 rx_page_order;
-       u32 max_inst_size;
-       u32 max_data_size;
        u32 ct_kill_threshold;
        u32 ct_kill_exit_threshold;
        unsigned int wd_timeout;
@@ -264,11 +259,13 @@ enum iwl_pa_type {
  *                     LED ON  = RF ON
  *                     LED OFF = RF OFF
  *    IWL_LED_BLINK:    adjust led blink rate based on blink table
+ *    IWL_LED_DISABLE: led disabled
  */
 enum iwl_led_mode {
        IWL_LED_DEFAULT,
        IWL_LED_RF_STATE,
        IWL_LED_BLINK,
+       IWL_LED_DISABLE,
 };
 
 /**
@@ -281,6 +278,8 @@ enum iwl_led_mode {
  * @ucode_api_ok: oldest version of the uCode API that is OK to load
  *     without a warning, for use in transitions
  * @ucode_api_min: Lowest version of uCode API supported by driver.
+ * @max_inst_size: The maximal length of the fw inst section
+ * @max_data_size: The maximal length of the fw data section
  * @valid_tx_ant: valid transmit antenna
  * @valid_rx_ant: valid receive antenna
  * @sku: sku information from EEPROM
@@ -318,6 +317,8 @@ struct iwl_cfg {
        const unsigned int ucode_api_max;
        const unsigned int ucode_api_ok;
        const unsigned int ucode_api_min;
+       const u32 max_data_size;
+       const u32 max_inst_size;
        u8   valid_tx_ant;
        u8   valid_rx_ant;
        u16  sku;
@@ -356,8 +357,8 @@ struct iwl_cfg {
  * @cfg: see struct iwl_cfg
  * @priv: pointer to the upper layer data
  * @trans: pointer to the transport layer data
+ * @nic: pointer to the nic data
  * @hw_params: see struct iwl_hw_params
- * @workqueue: the workqueue used by all the layers of the driver
  * @lock: protect general shared data
  * @sta_lock: protects the station table.
  *     If lock and sta_lock are needed, lock must be acquired first.
@@ -383,13 +384,12 @@ struct iwl_shared {
        bool wowlan;
        u8 valid_contexts;
 
-       struct iwl_bus *bus;
        struct iwl_cfg *cfg;
        struct iwl_priv *priv;
        struct iwl_trans *trans;
+       struct iwl_nic *nic;
        struct iwl_hw_params hw_params;
 
-       struct workqueue_struct *workqueue;
        spinlock_t lock;
        spinlock_t sta_lock;
        struct mutex mutex;
@@ -414,10 +414,10 @@ struct iwl_shared {
 
 };
 
-/*Whatever _m is (iwl_trans, iwl_priv, iwl_bus, these macros will work */
+/*Whatever _m is (iwl_trans, iwl_priv, these macros will work */
 #define priv(_m)       ((_m)->shrd->priv)
 #define cfg(_m)                ((_m)->shrd->cfg)
-#define bus(_m)                ((_m)->shrd->bus)
+#define nic(_m)                ((_m)->shrd->nic)
 #define trans(_m)      ((_m)->shrd->trans)
 #define hw_params(_m)  ((_m)->shrd->hw_params)
 
@@ -529,26 +529,11 @@ enum iwl_rxon_context_id {
        NUM_IWL_RXON_CTX
 };
 
-int iwl_probe(struct iwl_bus *bus, const struct iwl_trans_ops *trans_ops,
-               struct iwl_cfg *cfg);
-void __devexit iwl_remove(struct iwl_priv * priv);
-struct iwl_device_cmd;
-int __must_check iwl_rx_dispatch(struct iwl_priv *priv,
-                                struct iwl_rx_mem_buffer *rxb,
-                                struct iwl_device_cmd *cmd);
-
 int iwlagn_hw_valid_rtc_data_addr(u32 addr);
-void iwl_set_hw_rfkill_state(struct iwl_priv *priv, bool state);
 void iwl_nic_config(struct iwl_priv *priv);
-void iwl_free_skb(struct iwl_priv *priv, struct sk_buff *skb);
-void iwl_apm_stop(struct iwl_priv *priv);
-int iwl_apm_init(struct iwl_priv *priv);
-void iwlagn_fw_error(struct iwl_priv *priv, bool ondemand);
 const char *get_cmd_string(u8 cmd);
 bool iwl_check_for_ct_kill(struct iwl_priv *priv);
 
-void iwl_stop_sw_queue(struct iwl_priv *priv, u8 ac);
-void iwl_wake_sw_queue(struct iwl_priv *priv, u8 ac);
 
 /* notification wait support */
 void iwl_abort_notification_waits(struct iwl_shared *shrd);
@@ -568,20 +553,6 @@ void __releases(wait_entry)
 iwl_remove_notification(struct iwl_shared *shrd,
                           struct iwl_notification_wait *wait_entry);
 
-#ifdef CONFIG_IWLWIFI_DEBUGFS
-void iwl_reset_traffic_log(struct iwl_priv *priv);
-#endif /* CONFIG_IWLWIFI_DEBUGFS */
-
-#ifdef CONFIG_IWLWIFI_DEBUG
-void iwl_print_rx_config_cmd(struct iwl_priv *priv,
-                            enum iwl_rxon_context_id ctxid);
-#else
-static inline void iwl_print_rx_config_cmd(struct iwl_priv *priv,
-                                          enum iwl_rxon_context_id ctxid)
-{
-}
-#endif
-
 #define IWL_CMD(x) case x: return #x
 #define IWL_MASK(lo, hi) ((1 << (hi)) | ((1 << (hi)) - (1 << (lo))))
 
index 4a5cddd..23eea06 100644 (file)
@@ -5,7 +5,7 @@
  *
  * GPL LICENSE SUMMARY
  *
- * Copyright(c) 2010 - 2011 Intel Corporation. All rights reserved.
+ * Copyright(c) 2010 - 2012 Intel Corporation. All rights reserved.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of version 2 of the GNU General Public License as
@@ -30,7 +30,7 @@
  *
  * BSD LICENSE
  *
- * Copyright(c) 2010 - 2011 Intel Corporation. All rights reserved.
+ * Copyright(c) 2010 - 2012 Intel Corporation. All rights reserved.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
 #include "iwl-agn.h"
 #include "iwl-testmode.h"
 #include "iwl-trans.h"
-#include "iwl-bus.h"
+#include "iwl-fh.h"
+
+
+/* Periphery registers absolute lower bound. This is used in order to
+ * differentiate registery access through HBUS_TARG_PRPH_* and
+ * HBUS_TARG_MEM_* accesses.
+ */
+#define IWL_TM_ABS_PRPH_START (0xA00000)
 
 /* The TLVs used in the gnl message policy between the kernel module and
  * user space application. iwl_testmode_gnl_msg_policy is to be carried
@@ -109,12 +116,15 @@ struct nla_policy iwl_testmode_gnl_msg_policy[IWL_TM_ATTR_MAX] = {
 
        [IWL_TM_ATTR_UCODE_OWNER] = { .type = NLA_U8, },
 
-       [IWL_TM_ATTR_SRAM_ADDR] = { .type = NLA_U32, },
-       [IWL_TM_ATTR_SRAM_SIZE] = { .type = NLA_U32, },
-       [IWL_TM_ATTR_SRAM_DUMP] = { .type = NLA_UNSPEC, },
+       [IWL_TM_ATTR_MEM_ADDR] = { .type = NLA_U32, },
+       [IWL_TM_ATTR_BUFFER_SIZE] = { .type = NLA_U32, },
+       [IWL_TM_ATTR_BUFFER_DUMP] = { .type = NLA_UNSPEC, },
 
        [IWL_TM_ATTR_FW_VERSION] = { .type = NLA_U32, },
        [IWL_TM_ATTR_DEVICE_ID] = { .type = NLA_U32, },
+       [IWL_TM_ATTR_FW_TYPE] = { .type = NLA_U32, },
+       [IWL_TM_ATTR_FW_INST_SIZE] = { .type = NLA_U32, },
+       [IWL_TM_ATTR_FW_DATA_SIZE] = { .type = NLA_U32, },
 };
 
 /*
@@ -168,7 +178,7 @@ static void iwl_testmode_ucode_rx_pkt(struct iwl_priv *priv,
        skb = cfg80211_testmode_alloc_event_skb(hw->wiphy, 20 + length,
                                                                GFP_ATOMIC);
        if (skb == NULL) {
-               IWL_DEBUG_INFO(priv,
+               IWL_ERR(priv,
                         "Run out of memory for messages to user space ?\n");
                return;
        }
@@ -179,24 +189,24 @@ static void iwl_testmode_ucode_rx_pkt(struct iwl_priv *priv,
 
 nla_put_failure:
        kfree_skb(skb);
-       IWL_DEBUG_INFO(priv, "Ouch, overran buffer, check allocation!\n");
+       IWL_ERR(priv, "Ouch, overran buffer, check allocation!\n");
 }
 
 void iwl_testmode_init(struct iwl_priv *priv)
 {
        priv->pre_rx_handler = iwl_testmode_ucode_rx_pkt;
        priv->testmode_trace.trace_enabled = false;
-       priv->testmode_sram.sram_readed = false;
+       priv->testmode_mem.read_in_progress = false;
 }
 
-static void iwl_sram_cleanup(struct iwl_priv *priv)
+static void iwl_mem_cleanup(struct iwl_priv *priv)
 {
-       if (priv->testmode_sram.sram_readed) {
-               kfree(priv->testmode_sram.buff_addr);
-               priv->testmode_sram.buff_addr = NULL;
-               priv->testmode_sram.buff_size = 0;
-               priv->testmode_sram.num_chunks = 0;
-               priv->testmode_sram.sram_readed = false;
+       if (priv->testmode_mem.read_in_progress) {
+               kfree(priv->testmode_mem.buff_addr);
+               priv->testmode_mem.buff_addr = NULL;
+               priv->testmode_mem.buff_size = 0;
+               priv->testmode_mem.num_chunks = 0;
+               priv->testmode_mem.read_in_progress = false;
        }
 }
 
@@ -205,7 +215,7 @@ static void iwl_trace_cleanup(struct iwl_priv *priv)
        if (priv->testmode_trace.trace_enabled) {
                if (priv->testmode_trace.cpu_addr &&
                    priv->testmode_trace.dma_addr)
-                       dma_free_coherent(bus(priv)->dev,
+                       dma_free_coherent(trans(priv)->dev,
                                        priv->testmode_trace.total_size,
                                        priv->testmode_trace.cpu_addr,
                                        priv->testmode_trace.dma_addr);
@@ -222,9 +232,10 @@ static void iwl_trace_cleanup(struct iwl_priv *priv)
 void iwl_testmode_cleanup(struct iwl_priv *priv)
 {
        iwl_trace_cleanup(priv);
-       iwl_sram_cleanup(priv);
+       iwl_mem_cleanup(priv);
 }
 
+
 /*
  * This function handles the user application commands to the ucode.
  *
@@ -233,35 +244,80 @@ void iwl_testmode_cleanup(struct iwl_priv *priv)
  * host command to the ucode.
  *
  * If any mandatory field is missing, -ENOMSG is replied to the user space
- * application; otherwise, the actual execution result of the host command to
- * ucode is replied.
+ * application; otherwise, waits for the host command to be sent and checks
+ * the return code. In case or error, it is returned, otherwise a reply is
+ * allocated and the reply RX packet
+ * is returned.
  *
  * @hw: ieee80211_hw object that represents the device
  * @tb: gnl message fields from the user space
  */
 static int iwl_testmode_ucode(struct ieee80211_hw *hw, struct nlattr **tb)
 {
-       struct iwl_priv *priv = hw->priv;
+       struct iwl_priv *priv = IWL_MAC80211_GET_DVM(hw);
        struct iwl_host_cmd cmd;
+       struct iwl_rx_packet *pkt;
+       struct sk_buff *skb;
+       void *reply_buf;
+       u32 reply_len;
+       int ret;
+       bool cmd_want_skb;
 
        memset(&cmd, 0, sizeof(struct iwl_host_cmd));
 
        if (!tb[IWL_TM_ATTR_UCODE_CMD_ID] ||
            !tb[IWL_TM_ATTR_UCODE_CMD_DATA]) {
-               IWL_DEBUG_INFO(priv,
-                       "Error finding ucode command mandatory fields\n");
+               IWL_ERR(priv, "Missing ucode command mandatory fields\n");
                return -ENOMSG;
        }
 
-       cmd.flags = CMD_ON_DEMAND;
+       cmd.flags = CMD_ON_DEMAND | CMD_SYNC;
+       cmd_want_skb = nla_get_flag(tb[IWL_TM_ATTR_UCODE_CMD_SKB]);
+       if (cmd_want_skb)
+               cmd.flags |= CMD_WANT_SKB;
+
        cmd.id = nla_get_u8(tb[IWL_TM_ATTR_UCODE_CMD_ID]);
        cmd.data[0] = nla_data(tb[IWL_TM_ATTR_UCODE_CMD_DATA]);
        cmd.len[0] = nla_len(tb[IWL_TM_ATTR_UCODE_CMD_DATA]);
        cmd.dataflags[0] = IWL_HCMD_DFL_NOCOPY;
-       IWL_INFO(priv, "testmode ucode command ID 0x%x, flags 0x%x,"
+       IWL_DEBUG_INFO(priv, "testmode ucode command ID 0x%x, flags 0x%x,"
                                " len %d\n", cmd.id, cmd.flags, cmd.len[0]);
-       /* ok, let's submit the command to ucode */
-       return iwl_trans_send_cmd(trans(priv), &cmd);
+
+       ret = iwl_trans_send_cmd(trans(priv), &cmd);
+       if (ret) {
+               IWL_ERR(priv, "Failed to send hcmd\n");
+               return ret;
+       }
+       if (!cmd_want_skb)
+               return ret;
+
+       /* Handling return of SKB to the user */
+       pkt = (struct iwl_rx_packet *)cmd.reply_page;
+       if (!pkt) {
+               IWL_ERR(priv, "HCMD received a null response packet\n");
+               return ret;
+       }
+
+       reply_len = le32_to_cpu(pkt->len_n_flags) & FH_RSCSR_FRAME_SIZE_MSK;
+       skb = cfg80211_testmode_alloc_reply_skb(hw->wiphy, reply_len + 20);
+       reply_buf = kmalloc(reply_len, GFP_KERNEL);
+       if (!skb || !reply_buf) {
+               kfree_skb(skb);
+               kfree(reply_buf);
+               return -ENOMEM;
+       }
+
+       /* The reply is in a page, that we cannot send to user space. */
+       memcpy(reply_buf, &(pkt->hdr), reply_len);
+       iwl_free_pages(priv->shrd, cmd.reply_page);
+
+       NLA_PUT_U32(skb, IWL_TM_ATTR_COMMAND, IWL_TM_CMD_DEV2APP_UCODE_RX_PKT);
+       NLA_PUT(skb, IWL_TM_ATTR_UCODE_RX_PKT, reply_len, reply_buf);
+       return cfg80211_testmode_reply(skb);
+
+nla_put_failure:
+       IWL_DEBUG_INFO(priv, "Failed creating NL attributes\n");
+       return -ENOMSG;
 }
 
 
@@ -284,84 +340,69 @@ static int iwl_testmode_ucode(struct ieee80211_hw *hw, struct nlattr **tb)
  */
 static int iwl_testmode_reg(struct ieee80211_hw *hw, struct nlattr **tb)
 {
-       struct iwl_priv *priv = hw->priv;
-       u32 ofs, val32;
+       struct iwl_priv *priv = IWL_MAC80211_GET_DVM(hw);
+       u32 ofs, val32, cmd;
        u8 val8;
        struct sk_buff *skb;
        int status = 0;
 
        if (!tb[IWL_TM_ATTR_REG_OFFSET]) {
-               IWL_DEBUG_INFO(priv, "Error finding register offset\n");
+               IWL_ERR(priv, "Missing register offset\n");
                return -ENOMSG;
        }
        ofs = nla_get_u32(tb[IWL_TM_ATTR_REG_OFFSET]);
        IWL_INFO(priv, "testmode register access command offset 0x%x\n", ofs);
 
-       switch (nla_get_u32(tb[IWL_TM_ATTR_COMMAND])) {
+       /* Allow access only to FH/CSR/HBUS in direct mode.
+       Since we don't have the upper bounds for the CSR and HBUS segments,
+       we will use only the upper bound of FH for sanity check. */
+       cmd = nla_get_u32(tb[IWL_TM_ATTR_COMMAND]);
+       if ((cmd == IWL_TM_CMD_APP2DEV_DIRECT_REG_READ32 ||
+               cmd == IWL_TM_CMD_APP2DEV_DIRECT_REG_WRITE32 ||
+               cmd == IWL_TM_CMD_APP2DEV_DIRECT_REG_WRITE8) &&
+               (ofs >= FH_MEM_UPPER_BOUND)) {
+               IWL_ERR(priv, "offset out of segment (0x0 - 0x%x)\n",
+                       FH_MEM_UPPER_BOUND);
+               return -EINVAL;
+       }
+
+       switch (cmd) {
        case IWL_TM_CMD_APP2DEV_DIRECT_REG_READ32:
-               val32 = iwl_read32(bus(priv), ofs);
+               val32 = iwl_read_direct32(trans(priv), ofs);
                IWL_INFO(priv, "32bit value to read 0x%x\n", val32);
 
                skb = cfg80211_testmode_alloc_reply_skb(hw->wiphy, 20);
                if (!skb) {
-                       IWL_DEBUG_INFO(priv, "Error allocating memory\n");
+                       IWL_ERR(priv, "Memory allocation fail\n");
                        return -ENOMEM;
                }
                NLA_PUT_U32(skb, IWL_TM_ATTR_REG_VALUE32, val32);
                status = cfg80211_testmode_reply(skb);
                if (status < 0)
-                       IWL_DEBUG_INFO(priv,
-                                      "Error sending msg : %d\n", status);
+                       IWL_ERR(priv, "Error sending msg : %d\n", status);
                break;
        case IWL_TM_CMD_APP2DEV_DIRECT_REG_WRITE32:
                if (!tb[IWL_TM_ATTR_REG_VALUE32]) {
-                       IWL_DEBUG_INFO(priv,
-                                      "Error finding value to write\n");
+                       IWL_ERR(priv, "Missing value to write\n");
                        return -ENOMSG;
                } else {
                        val32 = nla_get_u32(tb[IWL_TM_ATTR_REG_VALUE32]);
                        IWL_INFO(priv, "32bit value to write 0x%x\n", val32);
-                       iwl_write32(bus(priv), ofs, val32);
+                       iwl_write_direct32(trans(priv), ofs, val32);
                }
                break;
        case IWL_TM_CMD_APP2DEV_DIRECT_REG_WRITE8:
                if (!tb[IWL_TM_ATTR_REG_VALUE8]) {
-                       IWL_DEBUG_INFO(priv, "Error finding value to write\n");
+                       IWL_ERR(priv, "Missing value to write\n");
                        return -ENOMSG;
                } else {
                        val8 = nla_get_u8(tb[IWL_TM_ATTR_REG_VALUE8]);
                        IWL_INFO(priv, "8bit value to write 0x%x\n", val8);
-                       iwl_write8(bus(priv), ofs, val8);
-               }
-               break;
-       case IWL_TM_CMD_APP2DEV_INDIRECT_REG_READ32:
-               val32 = iwl_read_prph(bus(priv), ofs);
-               IWL_INFO(priv, "32bit value to read 0x%x\n", val32);
-
-               skb = cfg80211_testmode_alloc_reply_skb(hw->wiphy, 20);
-               if (!skb) {
-                       IWL_DEBUG_INFO(priv, "Error allocating memory\n");
-                       return -ENOMEM;
-               }
-               NLA_PUT_U32(skb, IWL_TM_ATTR_REG_VALUE32, val32);
-               status = cfg80211_testmode_reply(skb);
-               if (status < 0)
-                       IWL_DEBUG_INFO(priv,
-                                       "Error sending msg : %d\n", status);
-               break;
-       case IWL_TM_CMD_APP2DEV_INDIRECT_REG_WRITE32:
-               if (!tb[IWL_TM_ATTR_REG_VALUE32]) {
-                       IWL_DEBUG_INFO(priv,
-                                       "Error finding value to write\n");
-                       return -ENOMSG;
-               } else {
-                       val32 = nla_get_u32(tb[IWL_TM_ATTR_REG_VALUE32]);
-                       IWL_INFO(priv, "32bit value to write 0x%x\n", val32);
-                       iwl_write_prph(bus(priv), ofs, val32);
+                       iwl_write8(trans(priv), ofs, val8);
                }
                break;
        default:
-               IWL_DEBUG_INFO(priv, "Unknown testmode register command ID\n");
+               IWL_ERR(priv, "Unknown testmode register command ID\n");
                return -ENOSYS;
        }
 
@@ -383,14 +424,13 @@ static int iwl_testmode_cfg_init_calib(struct iwl_priv *priv)
                                      NULL, NULL);
        ret = iwl_init_alive_start(trans(priv));
        if (ret) {
-               IWL_DEBUG_INFO(priv,
-                       "Error configuring init calibration: %d\n", ret);
+               IWL_ERR(priv, "Fail init calibration: %d\n", ret);
                goto cfg_init_calib_error;
        }
 
        ret = iwl_wait_notification(priv->shrd, &calib_wait, 2 * HZ);
        if (ret)
-               IWL_DEBUG_INFO(priv, "Error detecting"
+               IWL_ERR(priv, "Error detecting"
                        " CALIBRATION_COMPLETE_NOTIFICATION: %d\n", ret);
        return ret;
 
@@ -417,12 +457,12 @@ cfg_init_calib_error:
  */
 static int iwl_testmode_driver(struct ieee80211_hw *hw, struct nlattr **tb)
 {
-       struct iwl_priv *priv = hw->priv;
+       struct iwl_priv *priv = IWL_MAC80211_GET_DVM(hw);
        struct iwl_trans *trans = trans(priv);
        struct sk_buff *skb;
        unsigned char *rsp_data_ptr = NULL;
        int status = 0, rsp_data_len = 0;
-       u32 devid;
+       u32 devid, inst_size = 0, data_size = 0;
 
        switch (nla_get_u32(tb[IWL_TM_ATTR_COMMAND])) {
        case IWL_TM_CMD_APP2DEV_GET_DEVICENAME:
@@ -431,8 +471,7 @@ static int iwl_testmode_driver(struct ieee80211_hw *hw, struct nlattr **tb)
                skb = cfg80211_testmode_alloc_reply_skb(hw->wiphy,
                                                        rsp_data_len + 20);
                if (!skb) {
-                       IWL_DEBUG_INFO(priv,
-                                      "Error allocating memory\n");
+                       IWL_ERR(priv, "Memory allocation fail\n");
                        return -ENOMEM;
                }
                NLA_PUT_U32(skb, IWL_TM_ATTR_COMMAND,
@@ -441,15 +480,13 @@ static int iwl_testmode_driver(struct ieee80211_hw *hw, struct nlattr **tb)
                        rsp_data_len, rsp_data_ptr);
                status = cfg80211_testmode_reply(skb);
                if (status < 0)
-                       IWL_DEBUG_INFO(priv, "Error sending msg : %d\n",
-                                      status);
+                       IWL_ERR(priv, "Error sending msg : %d\n", status);
                break;
 
        case IWL_TM_CMD_APP2DEV_LOAD_INIT_FW:
                status = iwl_load_ucode_wait_alive(trans, IWL_UCODE_INIT);
                if (status)
-                       IWL_DEBUG_INFO(priv,
-                               "Error loading init ucode: %d\n", status);
+                       IWL_ERR(priv, "Error loading init ucode: %d\n", status);
                break;
 
        case IWL_TM_CMD_APP2DEV_CFG_INIT_CALIB:
@@ -460,13 +497,13 @@ static int iwl_testmode_driver(struct ieee80211_hw *hw, struct nlattr **tb)
        case IWL_TM_CMD_APP2DEV_LOAD_RUNTIME_FW:
                status = iwl_load_ucode_wait_alive(trans, IWL_UCODE_REGULAR);
                if (status) {
-                       IWL_DEBUG_INFO(priv,
+                       IWL_ERR(priv,
                                "Error loading runtime ucode: %d\n", status);
                        break;
                }
                status = iwl_alive_start(priv);
                if (status)
-                       IWL_DEBUG_INFO(priv,
+                       IWL_ERR(priv,
                                "Error starting the device: %d\n", status);
                break;
 
@@ -475,13 +512,13 @@ static int iwl_testmode_driver(struct ieee80211_hw *hw, struct nlattr **tb)
                iwl_trans_stop_device(trans);
                status = iwl_load_ucode_wait_alive(trans, IWL_UCODE_WOWLAN);
                if (status) {
-                       IWL_DEBUG_INFO(priv,
+                       IWL_ERR(priv,
                                "Error loading WOWLAN ucode: %d\n", status);
                        break;
                }
                status = iwl_alive_start(priv);
                if (status)
-                       IWL_DEBUG_INFO(priv,
+                       IWL_ERR(priv,
                                "Error starting the device: %d\n", status);
                break;
 
@@ -490,8 +527,7 @@ static int iwl_testmode_driver(struct ieee80211_hw *hw, struct nlattr **tb)
                        skb = cfg80211_testmode_alloc_reply_skb(hw->wiphy,
                                cfg(priv)->base_params->eeprom_size + 20);
                        if (!skb) {
-                               IWL_DEBUG_INFO(priv,
-                                      "Error allocating memory\n");
+                               IWL_ERR(priv, "Memory allocation fail\n");
                                return -ENOMEM;
                        }
                        NLA_PUT_U32(skb, IWL_TM_ATTR_COMMAND,
@@ -501,55 +537,87 @@ static int iwl_testmode_driver(struct ieee80211_hw *hw, struct nlattr **tb)
                                priv->shrd->eeprom);
                        status = cfg80211_testmode_reply(skb);
                        if (status < 0)
-                               IWL_DEBUG_INFO(priv,
-                                              "Error sending msg : %d\n",
-                                              status);
+                               IWL_ERR(priv, "Error sending msg : %d\n",
+                                       status);
                } else
                        return -EFAULT;
                break;
 
        case IWL_TM_CMD_APP2DEV_FIXRATE_REQ:
                if (!tb[IWL_TM_ATTR_FIXRATE]) {
-                       IWL_DEBUG_INFO(priv,
-                                      "Error finding fixrate setting\n");
+                       IWL_ERR(priv, "Missing fixrate setting\n");
                        return -ENOMSG;
                }
                priv->tm_fixed_rate = nla_get_u32(tb[IWL_TM_ATTR_FIXRATE]);
                break;
 
        case IWL_TM_CMD_APP2DEV_GET_FW_VERSION:
-               IWL_INFO(priv, "uCode version raw: 0x%x\n", priv->ucode_ver);
+               IWL_INFO(priv, "uCode version raw: 0x%x\n",
+                        nic(priv)->fw.ucode_ver);
 
                skb = cfg80211_testmode_alloc_reply_skb(hw->wiphy, 20);
                if (!skb) {
-                       IWL_DEBUG_INFO(priv, "Error allocating memory\n");
+                       IWL_ERR(priv, "Memory allocation fail\n");
                        return -ENOMEM;
                }
-               NLA_PUT_U32(skb, IWL_TM_ATTR_FW_VERSION, priv->ucode_ver);
+               NLA_PUT_U32(skb, IWL_TM_ATTR_FW_VERSION,
+                           nic(priv)->fw.ucode_ver);
                status = cfg80211_testmode_reply(skb);
                if (status < 0)
-                       IWL_DEBUG_INFO(priv,
-                                       "Error sending msg : %d\n", status);
+                       IWL_ERR(priv, "Error sending msg : %d\n", status);
                break;
 
        case IWL_TM_CMD_APP2DEV_GET_DEVICE_ID:
-               devid = bus_get_hw_id(bus(priv));
+               devid = trans(priv)->hw_id;
                IWL_INFO(priv, "hw version: 0x%x\n", devid);
 
                skb = cfg80211_testmode_alloc_reply_skb(hw->wiphy, 20);
                if (!skb) {
-                       IWL_DEBUG_INFO(priv, "Error allocating memory\n");
+                       IWL_ERR(priv, "Memory allocation fail\n");
                        return -ENOMEM;
                }
                NLA_PUT_U32(skb, IWL_TM_ATTR_DEVICE_ID, devid);
                status = cfg80211_testmode_reply(skb);
                if (status < 0)
-                       IWL_DEBUG_INFO(priv,
-                                       "Error sending msg : %d\n", status);
+                       IWL_ERR(priv, "Error sending msg : %d\n", status);
+               break;
+
+       case IWL_TM_CMD_APP2DEV_GET_FW_INFO:
+               skb = cfg80211_testmode_alloc_reply_skb(hw->wiphy, 20 + 8);
+               if (!skb) {
+                       IWL_ERR(priv, "Memory allocation fail\n");
+                       return -ENOMEM;
+               }
+               switch (priv->shrd->ucode_type) {
+               case IWL_UCODE_REGULAR:
+                       inst_size = nic(priv)->fw.ucode_rt.code.len;
+                       data_size = nic(priv)->fw.ucode_rt.data.len;
+                       break;
+               case IWL_UCODE_INIT:
+                       inst_size = nic(priv)->fw.ucode_init.code.len;
+                       data_size = nic(priv)->fw.ucode_init.data.len;
+                       break;
+               case IWL_UCODE_WOWLAN:
+                       inst_size = nic(priv)->fw.ucode_wowlan.code.len;
+                       data_size = nic(priv)->fw.ucode_wowlan.data.len;
+                       break;
+               case IWL_UCODE_NONE:
+                       IWL_ERR(priv, "No uCode has not been loaded\n");
+                       break;
+               default:
+                       IWL_ERR(priv, "Unsupported uCode type\n");
+                       break;
+               }
+               NLA_PUT_U32(skb, IWL_TM_ATTR_FW_TYPE, priv->shrd->ucode_type);
+               NLA_PUT_U32(skb, IWL_TM_ATTR_FW_INST_SIZE, inst_size);
+               NLA_PUT_U32(skb, IWL_TM_ATTR_FW_DATA_SIZE, data_size);
+               status = cfg80211_testmode_reply(skb);
+               if (status < 0)
+                       IWL_ERR(priv, "Error sending msg : %d\n", status);
                break;
 
        default:
-               IWL_DEBUG_INFO(priv, "Unknown testmode driver command ID\n");
+               IWL_ERR(priv, "Unknown testmode driver command ID\n");
                return -ENOSYS;
        }
        return status;
@@ -574,10 +642,10 @@ nla_put_failure:
  */
 static int iwl_testmode_trace(struct ieee80211_hw *hw, struct nlattr **tb)
 {
-       struct iwl_priv *priv = hw->priv;
+       struct iwl_priv *priv = IWL_MAC80211_GET_DVM(hw);
        struct sk_buff *skb;
        int status = 0;
-       struct device *dev = bus(priv)->dev;
+       struct device *dev = trans(priv)->dev;
 
        switch (nla_get_u32(tb[IWL_TM_ATTR_COMMAND])) {
        case IWL_TM_CMD_APP2DEV_BEGIN_TRACE:
@@ -612,8 +680,7 @@ static int iwl_testmode_trace(struct ieee80211_hw *hw, struct nlattr **tb)
                skb = cfg80211_testmode_alloc_reply_skb(hw->wiphy,
                        sizeof(priv->testmode_trace.dma_addr) + 20);
                if (!skb) {
-                       IWL_DEBUG_INFO(priv,
-                               "Error allocating memory\n");
+                       IWL_ERR(priv, "Memory allocation fail\n");
                        iwl_trace_cleanup(priv);
                        return -ENOMEM;
                }
@@ -622,9 +689,7 @@ static int iwl_testmode_trace(struct ieee80211_hw *hw, struct nlattr **tb)
                        (u64 *)&priv->testmode_trace.dma_addr);
                status = cfg80211_testmode_reply(skb);
                if (status < 0) {
-                       IWL_DEBUG_INFO(priv,
-                                      "Error sending msg : %d\n",
-                                      status);
+                       IWL_ERR(priv, "Error sending msg : %d\n", status);
                }
                priv->testmode_trace.num_chunks =
                        DIV_ROUND_UP(priv->testmode_trace.buff_size,
@@ -635,7 +700,7 @@ static int iwl_testmode_trace(struct ieee80211_hw *hw, struct nlattr **tb)
                iwl_trace_cleanup(priv);
                break;
        default:
-               IWL_DEBUG_INFO(priv, "Unknown testmode mem command ID\n");
+               IWL_ERR(priv, "Unknown testmode mem command ID\n");
                return -ENOSYS;
        }
        return status;
@@ -652,7 +717,7 @@ static int iwl_testmode_trace_dump(struct ieee80211_hw *hw, struct nlattr **tb,
                                   struct sk_buff *skb,
                                   struct netlink_callback *cb)
 {
-       struct iwl_priv *priv = hw->priv;
+       struct iwl_priv *priv = IWL_MAC80211_GET_DVM(hw);
        int idx, length;
 
        if (priv->testmode_trace.trace_enabled &&
@@ -696,11 +761,11 @@ static int iwl_testmode_trace_dump(struct ieee80211_hw *hw, struct nlattr **tb,
  */
 static int iwl_testmode_ownership(struct ieee80211_hw *hw, struct nlattr **tb)
 {
-       struct iwl_priv *priv = hw->priv;
+       struct iwl_priv *priv = IWL_MAC80211_GET_DVM(hw);
        u8 owner;
 
        if (!tb[IWL_TM_ATTR_UCODE_OWNER]) {
-               IWL_DEBUG_INFO(priv, "Error finding ucode owner\n");
+               IWL_ERR(priv, "Missing ucode owner\n");
                return -ENOMSG;
        }
 
@@ -708,9 +773,86 @@ static int iwl_testmode_ownership(struct ieee80211_hw *hw, struct nlattr **tb)
        if ((owner == IWL_OWNERSHIP_DRIVER) || (owner == IWL_OWNERSHIP_TM))
                priv->shrd->ucode_owner = owner;
        else {
-               IWL_DEBUG_INFO(priv, "Invalid owner\n");
+               IWL_ERR(priv, "Invalid owner\n");
+               return -EINVAL;
+       }
+       return 0;
+}
+
+static int iwl_testmode_indirect_read(struct iwl_priv *priv, u32 addr, u32 size)
+{
+       struct iwl_trans *trans = trans(priv);
+       unsigned long flags;
+       int i;
+
+       if (size & 0x3)
                return -EINVAL;
+       priv->testmode_mem.buff_size = size;
+       priv->testmode_mem.buff_addr =
+               kmalloc(priv->testmode_mem.buff_size, GFP_KERNEL);
+       if (priv->testmode_mem.buff_addr == NULL)
+               return -ENOMEM;
+
+       /* Hard-coded periphery absolute address */
+       if (IWL_TM_ABS_PRPH_START <= addr &&
+               addr < IWL_TM_ABS_PRPH_START + PRPH_END) {
+                       spin_lock_irqsave(&trans->reg_lock, flags);
+                       iwl_grab_nic_access(trans);
+                       iwl_write32(trans, HBUS_TARG_PRPH_RADDR,
+                               addr | (3 << 24));
+                       for (i = 0; i < size; i += 4)
+                               *(u32 *)(priv->testmode_mem.buff_addr + i) =
+                                       iwl_read32(trans, HBUS_TARG_PRPH_RDAT);
+                       iwl_release_nic_access(trans);
+                       spin_unlock_irqrestore(&trans->reg_lock, flags);
+       } else { /* target memory (SRAM) */
+               _iwl_read_targ_mem_words(trans, addr,
+                       priv->testmode_mem.buff_addr,
+                       priv->testmode_mem.buff_size / 4);
        }
+
+       priv->testmode_mem.num_chunks =
+               DIV_ROUND_UP(priv->testmode_mem.buff_size, DUMP_CHUNK_SIZE);
+       priv->testmode_mem.read_in_progress = true;
+       return 0;
+
+}
+
+static int iwl_testmode_indirect_write(struct iwl_priv *priv, u32 addr,
+       u32 size, unsigned char *buf)
+{
+       struct iwl_trans *trans = trans(priv);
+       u32 val, i;
+       unsigned long flags;
+
+       if (IWL_TM_ABS_PRPH_START <= addr &&
+               addr < IWL_TM_ABS_PRPH_START + PRPH_END) {
+                       /* Periphery writes can be 1-3 bytes long, or DWORDs */
+                       if (size < 4) {
+                               memcpy(&val, buf, size);
+                               spin_lock_irqsave(&trans->reg_lock, flags);
+                               iwl_grab_nic_access(trans);
+                               iwl_write32(trans, HBUS_TARG_PRPH_WADDR,
+                                           (addr & 0x0000FFFF) |
+                                           ((size - 1) << 24));
+                               iwl_write32(trans, HBUS_TARG_PRPH_WDAT, val);
+                               iwl_release_nic_access(trans);
+                               /* needed after consecutive writes w/o read */
+                               mmiowb();
+                               spin_unlock_irqrestore(&trans->reg_lock, flags);
+                       } else {
+                               if (size % 4)
+                                       return -EINVAL;
+                               for (i = 0; i < size; i += 4)
+                                       iwl_write_prph(trans, addr+i,
+                                               *(u32 *)(buf+i));
+                       }
+       } else if (iwlagn_hw_valid_rtc_data_addr(addr) ||
+               (IWLAGN_RTC_INST_LOWER_BOUND <= addr &&
+               addr < IWLAGN_RTC_INST_UPPER_BOUND)) {
+                       _iwl_write_targ_mem_words(trans, addr, buf, size/4);
+       } else
+               return -EINVAL;
        return 0;
 }
 
@@ -730,83 +872,60 @@ static int iwl_testmode_ownership(struct ieee80211_hw *hw, struct nlattr **tb)
  * @hw: ieee80211_hw object that represents the device
  * @tb: gnl message fields from the user space
  */
-static int iwl_testmode_sram(struct ieee80211_hw *hw, struct nlattr **tb)
+static int iwl_testmode_indirect_mem(struct ieee80211_hw *hw,
+       struct nlattr **tb)
 {
-       struct iwl_priv *priv = hw->priv;
-       u32 base, ofs, size, maxsize;
+       struct iwl_priv *priv = IWL_MAC80211_GET_DVM(hw);
+       u32 addr, size, cmd;
+       unsigned char *buf;
 
-       if (priv->testmode_sram.sram_readed)
+       /* Both read and write should be blocked, for atomicity */
+       if (priv->testmode_mem.read_in_progress)
                return -EBUSY;
 
-       if (!tb[IWL_TM_ATTR_SRAM_ADDR]) {
-               IWL_DEBUG_INFO(priv, "Error finding SRAM offset address\n");
+       cmd = nla_get_u32(tb[IWL_TM_ATTR_COMMAND]);
+       if (!tb[IWL_TM_ATTR_MEM_ADDR]) {
+               IWL_ERR(priv, "Error finding memory offset address\n");
                return -ENOMSG;
        }
-       ofs = nla_get_u32(tb[IWL_TM_ATTR_SRAM_ADDR]);
-       if (!tb[IWL_TM_ATTR_SRAM_SIZE]) {
-               IWL_DEBUG_INFO(priv, "Error finding size for SRAM reading\n");
+       addr = nla_get_u32(tb[IWL_TM_ATTR_MEM_ADDR]);
+       if (!tb[IWL_TM_ATTR_BUFFER_SIZE]) {
+               IWL_ERR(priv, "Error finding size for memory reading\n");
                return -ENOMSG;
        }
-       size = nla_get_u32(tb[IWL_TM_ATTR_SRAM_SIZE]);
-       switch (priv->shrd->ucode_type) {
-       case IWL_UCODE_REGULAR:
-               maxsize = trans(priv)->ucode_rt.data.len;
-               break;
-       case IWL_UCODE_INIT:
-               maxsize = trans(priv)->ucode_init.data.len;
-               break;
-       case IWL_UCODE_WOWLAN:
-               maxsize = trans(priv)->ucode_wowlan.data.len;
-               break;
-       case IWL_UCODE_NONE:
-               IWL_DEBUG_INFO(priv, "Error, uCode does not been loaded\n");
-               return -ENOSYS;
-       default:
-               IWL_DEBUG_INFO(priv, "Error, unsupported uCode type\n");
-               return -ENOSYS;
-       }
-       if ((ofs + size) > maxsize) {
-               IWL_DEBUG_INFO(priv, "Invalid offset/size: out of range\n");
-               return -EINVAL;
-       }
-       priv->testmode_sram.buff_size = (size / 4) * 4;
-       priv->testmode_sram.buff_addr =
-               kmalloc(priv->testmode_sram.buff_size, GFP_KERNEL);
-       if (priv->testmode_sram.buff_addr == NULL) {
-               IWL_DEBUG_INFO(priv, "Error allocating memory\n");
-               return -ENOMEM;
+       size = nla_get_u32(tb[IWL_TM_ATTR_BUFFER_SIZE]);
+
+       if (cmd == IWL_TM_CMD_APP2DEV_INDIRECT_BUFFER_READ)
+               return iwl_testmode_indirect_read(priv, addr,  size);
+       else {
+               if (!tb[IWL_TM_ATTR_BUFFER_DUMP])
+                       return -EINVAL;
+               buf = (unsigned char *) nla_data(tb[IWL_TM_ATTR_BUFFER_DUMP]);
+               return iwl_testmode_indirect_write(priv, addr, size, buf);
        }
-       base = 0x800000;
-       _iwl_read_targ_mem_words(bus(priv), base + ofs,
-                                       priv->testmode_sram.buff_addr,
-                                       priv->testmode_sram.buff_size / 4);
-       priv->testmode_sram.num_chunks =
-               DIV_ROUND_UP(priv->testmode_sram.buff_size, DUMP_CHUNK_SIZE);
-       priv->testmode_sram.sram_readed = true;
-       return 0;
 }
 
-static int iwl_testmode_sram_dump(struct ieee80211_hw *hw, struct nlattr **tb,
+static int iwl_testmode_buffer_dump(struct ieee80211_hw *hw, struct nlattr **tb,
                                   struct sk_buff *skb,
                                   struct netlink_callback *cb)
 {
-       struct iwl_priv *priv = hw->priv;
+       struct iwl_priv *priv = IWL_MAC80211_GET_DVM(hw);
        int idx, length;
 
-       if (priv->testmode_sram.sram_readed) {
+       if (priv->testmode_mem.read_in_progress) {
                idx = cb->args[4];
-               if (idx >= priv->testmode_sram.num_chunks) {
-                       iwl_sram_cleanup(priv);
+               if (idx >= priv->testmode_mem.num_chunks) {
+                       iwl_mem_cleanup(priv);
                        return -ENOENT;
                }
                length = DUMP_CHUNK_SIZE;
-               if (((idx + 1) == priv->testmode_sram.num_chunks) &&
-                   (priv->testmode_sram.buff_size % DUMP_CHUNK_SIZE))
-                       length = priv->testmode_sram.buff_size %
+               if (((idx + 1) == priv->testmode_mem.num_chunks) &&
+                   (priv->testmode_mem.buff_size % DUMP_CHUNK_SIZE))
+                       length = priv->testmode_mem.buff_size %
                                DUMP_CHUNK_SIZE;
 
-               NLA_PUT(skb, IWL_TM_ATTR_SRAM_DUMP, length,
-                       priv->testmode_sram.buff_addr +
+               NLA_PUT(skb, IWL_TM_ATTR_BUFFER_DUMP, length,
+                       priv->testmode_mem.buff_addr +
                        (DUMP_CHUNK_SIZE * idx));
                idx++;
                cb->args[4] = idx;
@@ -841,20 +960,19 @@ static int iwl_testmode_sram_dump(struct ieee80211_hw *hw, struct nlattr **tb,
 int iwlagn_mac_testmode_cmd(struct ieee80211_hw *hw, void *data, int len)
 {
        struct nlattr *tb[IWL_TM_ATTR_MAX];
-       struct iwl_priv *priv = hw->priv;
+       struct iwl_priv *priv = IWL_MAC80211_GET_DVM(hw);
        int result;
 
        result = nla_parse(tb, IWL_TM_ATTR_MAX - 1, data, len,
                        iwl_testmode_gnl_msg_policy);
        if (result != 0) {
-               IWL_DEBUG_INFO(priv,
-                              "Error parsing the gnl message : %d\n", result);
+               IWL_ERR(priv, "Error parsing the gnl message : %d\n", result);
                return result;
        }
 
        /* IWL_TM_ATTR_COMMAND is absolutely mandatory */
        if (!tb[IWL_TM_ATTR_COMMAND]) {
-               IWL_DEBUG_INFO(priv, "Error finding testmode command type\n");
+               IWL_ERR(priv, "Missing testmode command type\n");
                return -ENOMSG;
        }
        /* in case multiple accesses to the device happens */
@@ -868,8 +986,6 @@ int iwlagn_mac_testmode_cmd(struct ieee80211_hw *hw, void *data, int len)
        case IWL_TM_CMD_APP2DEV_DIRECT_REG_READ32:
        case IWL_TM_CMD_APP2DEV_DIRECT_REG_WRITE32:
        case IWL_TM_CMD_APP2DEV_DIRECT_REG_WRITE8:
-       case IWL_TM_CMD_APP2DEV_INDIRECT_REG_READ32:
-       case IWL_TM_CMD_APP2DEV_INDIRECT_REG_WRITE32:
                IWL_DEBUG_INFO(priv, "testmode cmd to register\n");
                result = iwl_testmode_reg(hw, tb);
                break;
@@ -882,6 +998,7 @@ int iwlagn_mac_testmode_cmd(struct ieee80211_hw *hw, void *data, int len)
        case IWL_TM_CMD_APP2DEV_LOAD_WOWLAN_FW:
        case IWL_TM_CMD_APP2DEV_GET_FW_VERSION:
        case IWL_TM_CMD_APP2DEV_GET_DEVICE_ID:
+       case IWL_TM_CMD_APP2DEV_GET_FW_INFO:
                IWL_DEBUG_INFO(priv, "testmode cmd to driver\n");
                result = iwl_testmode_driver(hw, tb);
                break;
@@ -898,13 +1015,15 @@ int iwlagn_mac_testmode_cmd(struct ieee80211_hw *hw, void *data, int len)
                result = iwl_testmode_ownership(hw, tb);
                break;
 
-       case IWL_TM_CMD_APP2DEV_READ_SRAM:
-               IWL_DEBUG_INFO(priv, "testmode sram read cmd to driver\n");
-               result = iwl_testmode_sram(hw, tb);
+       case IWL_TM_CMD_APP2DEV_INDIRECT_BUFFER_READ:
+       case IWL_TM_CMD_APP2DEV_INDIRECT_BUFFER_WRITE:
+               IWL_DEBUG_INFO(priv, "testmode indirect memory cmd "
+                       "to driver\n");
+               result = iwl_testmode_indirect_mem(hw, tb);
                break;
 
        default:
-               IWL_DEBUG_INFO(priv, "Unknown testmode command\n");
+               IWL_ERR(priv, "Unknown testmode command\n");
                result = -ENOSYS;
                break;
        }
@@ -918,7 +1037,7 @@ int iwlagn_mac_testmode_dump(struct ieee80211_hw *hw, struct sk_buff *skb,
                      void *data, int len)
 {
        struct nlattr *tb[IWL_TM_ATTR_MAX];
-       struct iwl_priv *priv = hw->priv;
+       struct iwl_priv *priv = IWL_MAC80211_GET_DVM(hw);
        int result;
        u32 cmd;
 
@@ -929,15 +1048,14 @@ int iwlagn_mac_testmode_dump(struct ieee80211_hw *hw, struct sk_buff *skb,
                result = nla_parse(tb, IWL_TM_ATTR_MAX - 1, data, len,
                                iwl_testmode_gnl_msg_policy);
                if (result) {
-                       IWL_DEBUG_INFO(priv,
-                              "Error parsing the gnl message : %d\n", result);
+                       IWL_ERR(priv,
+                               "Error parsing the gnl message : %d\n", result);
                        return result;
                }
 
                /* IWL_TM_ATTR_COMMAND is absolutely mandatory */
                if (!tb[IWL_TM_ATTR_COMMAND]) {
-                       IWL_DEBUG_INFO(priv,
-                               "Error finding testmode command type\n");
+                       IWL_ERR(priv, "Missing testmode command type\n");
                        return -ENOMSG;
                }
                cmd = nla_get_u32(tb[IWL_TM_ATTR_COMMAND]);
@@ -951,9 +1069,9 @@ int iwlagn_mac_testmode_dump(struct ieee80211_hw *hw, struct sk_buff *skb,
                IWL_DEBUG_INFO(priv, "uCode trace cmd to driver\n");
                result = iwl_testmode_trace_dump(hw, tb, skb, cb);
                break;
-       case IWL_TM_CMD_APP2DEV_DUMP_SRAM:
+       case IWL_TM_CMD_APP2DEV_INDIRECT_BUFFER_DUMP:
                IWL_DEBUG_INFO(priv, "testmode sram dump cmd to driver\n");
-               result = iwl_testmode_sram_dump(hw, tb, skb, cb);
+               result = iwl_testmode_buffer_dump(hw, tb, skb, cb);
                break;
        default:
                result = -EINVAL;
index 26138f1..69b2e80 100644 (file)
@@ -5,7 +5,7 @@
  *
  * GPL LICENSE SUMMARY
  *
- * Copyright(c) 2010 - 2011 Intel Corporation. All rights reserved.
+ * Copyright(c) 2010 - 2012 Intel Corporation. All rights reserved.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of version 2 of the GNU General Public License as
@@ -30,7 +30,7 @@
  *
  * BSD LICENSE
  *
- * Copyright(c) 2010 - 2011 Intel Corporation. All rights reserved.
+ * Copyright(c) 2010 - 2012 Intel Corporation. All rights reserved.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -99,7 +99,7 @@
  *     to user application
  * @IWL_TM_CMD_DEV2APP_UCODE_RX_PKT:
  *     commands from kernel space to multicast the spontaneous messages
- *     to user application
+ *     to user application, or reply of host commands
  * @IWL_TM_CMD_DEV2APP_EEPROM_RSP:
  *     commands from kernel space to carry the eeprom response
  *     to user application
  *     if application has the ownership, the only host command from
  *     testmode will deliver to uCode. Default owner is driver
  *
- * @IWL_TM_CMD_APP2DEV_INDIRECT_REG_READ32:
- * @IWL_TM_CMD_APP2DEV_INDIRECT_REG_WRITE32:
- *     commands from user applicaiton to indirectly access peripheral register
- *
- * @IWL_TM_CMD_APP2DEV_READ_SRAM:
- * @IWL_TM_CMD_APP2DEV_DUMP_SRAM:
- *     commands from user applicaiton to read data in sram
- *
- * @IWL_TM_CMD_APP2DEV_LOAD_WOWLAN_FW: load Weak On Wireless LAN uCode image
+ * @IWL_TM_CMD_APP2DEV_LOAD_WOWLAN_FW: load Wake On Wireless LAN uCode image
  * @IWL_TM_CMD_APP2DEV_GET_FW_VERSION: retrieve uCode version
  * @IWL_TM_CMD_APP2DEV_GET_DEVICE_ID: retrieve ID information in device
- *
+ * @IWL_TM_CMD_APP2DEV_GET_FW_INFO:
+ *     retrieve information of existing loaded uCode image
+ *
+ * @IWL_TM_CMD_APP2DEV_INDIRECT_BUFFER_READ:
+ * @IWL_TM_CMD_APP2DEV_INDIRECT_BUFFER_DUMP:
+ * @IWL_TM_CMD_APP2DEV_INDIRECT_BUFFER_WRITE:
+ *     Commands to read/write data from periphery or SRAM memory ranges.
+ *     Fore reading, a READ command is sent from the userspace and the data
+ *     is returned when the user calls a DUMP command.
+ *     For writing, only a WRITE command is used.
  */
 enum iwl_tm_cmd_t {
        IWL_TM_CMD_APP2DEV_UCODE                = 1,
@@ -140,14 +141,18 @@ enum iwl_tm_cmd_t {
        IWL_TM_CMD_DEV2APP_UCODE_RX_PKT         = 15,
        IWL_TM_CMD_DEV2APP_EEPROM_RSP           = 16,
        IWL_TM_CMD_APP2DEV_OWNERSHIP            = 17,
-       IWL_TM_CMD_APP2DEV_INDIRECT_REG_READ32  = 18,
-       IWL_TM_CMD_APP2DEV_INDIRECT_REG_WRITE32 = 19,
-       IWL_TM_CMD_APP2DEV_READ_SRAM            = 20,
-       IWL_TM_CMD_APP2DEV_DUMP_SRAM            = 21,
+       RESERVED_18                             = 18,
+       RESERVED_19                             = 19,
+       RESERVED_20                             = 20,
+       RESERVED_21                             = 21,
        IWL_TM_CMD_APP2DEV_LOAD_WOWLAN_FW       = 22,
        IWL_TM_CMD_APP2DEV_GET_FW_VERSION       = 23,
        IWL_TM_CMD_APP2DEV_GET_DEVICE_ID        = 24,
-       IWL_TM_CMD_MAX                          = 25,
+       IWL_TM_CMD_APP2DEV_GET_FW_INFO          = 25,
+       IWL_TM_CMD_APP2DEV_INDIRECT_BUFFER_READ = 26,
+       IWL_TM_CMD_APP2DEV_INDIRECT_BUFFER_DUMP = 27,
+       IWL_TM_CMD_APP2DEV_INDIRECT_BUFFER_WRITE = 28,
+       IWL_TM_CMD_MAX                          = 29,
 };
 
 /*
@@ -168,8 +173,6 @@ enum iwl_tm_cmd_t {
  *     When IWL_TM_ATTR_COMMAND is IWL_TM_CMD_APP2DEV_UCODE,
  *     The mandatory fields are :
  *     IWL_TM_ATTR_UCODE_CMD_ID for recognizable command ID;
- *     IWL_TM_ATTR_COMMAND_FLAG for the flags of the commands;
- *     The optional fields are:
  *     IWL_TM_ATTR_UCODE_CMD_DATA for the actual command payload
  *     to the ucode
  *
@@ -218,16 +221,19 @@ enum iwl_tm_cmd_t {
  *     The mandatory fields are:
  *     IWL_TM_ATTR_UCODE_OWNER for the new owner
  *
- * @IWL_TM_ATTR_SRAM_ADDR:
- * @IWL_TM_ATTR_SRAM_SIZE:
- *     When IWL_TM_ATTR_COMMAND is IWL_TM_CMD_APP2DEV_READ_SRAM,
+ * @IWL_TM_ATTR_MEM_ADDR:
+ * @IWL_TM_ATTR_BUFFER_SIZE:
+ *     When IWL_TM_ATTR_COMMAND is IWL_TM_CMD_APP2DEV_INDIRECT_BUFFER_READ
+ *     or IWL_TM_CMD_APP2DEV_INDIRECT_BUFFER_WRITE.
  *     The mandatory fields are:
- *     IWL_TM_ATTR_SRAM_ADDR for the address in sram
- *     IWL_TM_ATTR_SRAM_SIZE for the buffer size of data reading
+ *     IWL_TM_ATTR_MEM_ADDR for the address in SRAM/periphery to read/write
+ *     IWL_TM_ATTR_BUFFER_SIZE for the buffer size of data to read/write.
  *
- * @IWL_TM_ATTR_SRAM_DUMP:
- *     When IWL_TM_ATTR_COMMAND is IWL_TM_CMD_APP2DEV_DUMP_SRAM,
- *     IWL_TM_ATTR_SRAM_DUMP for the data in sram
+ * @IWL_TM_ATTR_BUFFER_DUMP:
+ *     When IWL_TM_ATTR_COMMAND is IWL_TM_CMD_APP2DEV_INDIRECT_BUFFER_DUMP,
+ *     IWL_TM_ATTR_BUFFER_DUMP is used for the data that was read.
+ *     When IWL_TM_ATTR_COMMAND is IWL_TM_CMD_APP2DEV_INDIRECT_BUFFER_WRITE,
+ *     this attribute contains the data to write.
  *
  * @IWL_TM_ATTR_FW_VERSION:
  *     When IWL_TM_ATTR_COMMAND is IWL_TM_CMD_APP2DEV_GET_FW_VERSION,
@@ -237,6 +243,19 @@ enum iwl_tm_cmd_t {
  *     When IWL_TM_ATTR_COMMAND is IWL_TM_CMD_APP2DEV_GET_DEVICE_ID,
  *     IWL_TM_ATTR_DEVICE_ID for the device ID information
  *
+ * @IWL_TM_ATTR_FW_TYPE:
+ * @IWL_TM_ATTR_FW_INST_SIZE:
+ * @IWL_TM_ATTR_FW_DATA_SIZE:
+ *     When IWL_TM_ATTR_COMMAND is IWL_TM_CMD_APP2DEV_GET_FW_INFO,
+ *     The mandatory fields are:
+ *     IWL_TM_ATTR_FW_TYPE for the uCode type (INIT/RUNTIME/...)
+ *     IWL_TM_ATTR_FW_INST_SIZE for the size of instruction section
+ *     IWL_TM_ATTR_FW_DATA_SIZE for the size of data section
+ *
+ * @IWL_TM_ATTR_UCODE_CMD_SKB:
+ *     When IWL_TM_ATTR_COMMAND is IWL_TM_CMD_APP2DEV_UCODE this flag
+ *     indicates that the user wants to receive the response of the command
+ *     in a reply SKB. If it's not present, the response is not returned.
  */
 enum iwl_tm_attr_t {
        IWL_TM_ATTR_NOT_APPLICABLE              = 0,
@@ -254,12 +273,16 @@ enum iwl_tm_attr_t {
        IWL_TM_ATTR_TRACE_DUMP                  = 12,
        IWL_TM_ATTR_FIXRATE                     = 13,
        IWL_TM_ATTR_UCODE_OWNER                 = 14,
-       IWL_TM_ATTR_SRAM_ADDR                   = 15,
-       IWL_TM_ATTR_SRAM_SIZE                   = 16,
-       IWL_TM_ATTR_SRAM_DUMP                   = 17,
+       IWL_TM_ATTR_MEM_ADDR                    = 15,
+       IWL_TM_ATTR_BUFFER_SIZE                 = 16,
+       IWL_TM_ATTR_BUFFER_DUMP                 = 17,
        IWL_TM_ATTR_FW_VERSION                  = 18,
        IWL_TM_ATTR_DEVICE_ID                   = 19,
-       IWL_TM_ATTR_MAX                         = 20,
+       IWL_TM_ATTR_FW_TYPE                     = 20,
+       IWL_TM_ATTR_FW_INST_SIZE                = 21,
+       IWL_TM_ATTR_FW_DATA_SIZE                = 22,
+       IWL_TM_ATTR_UCODE_CMD_SKB               = 23,
+       IWL_TM_ATTR_MAX                         = 24,
 };
 
 /* uCode trace buffer */
@@ -271,4 +294,7 @@ enum iwl_tm_attr_t {
 /* Maximum data size of each dump it packet */
 #define DUMP_CHUNK_SIZE                (PAGE_SIZE - 1024)
 
+/* Address offset of data segment in SRAM */
+#define SRAM_DATA_SEG_OFFSET   0x800000
+
 #endif
index f6debf9..5b26b71 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2003 - 2011 Intel Corporation. All rights reserved.
+ * Copyright(c) 2003 - 2012 Intel Corporation. All rights reserved.
  *
  * Portions of this file are derived from the ipw3945 project, as well
  * as portions of the ieee80211 subsystem header files.
@@ -40,6 +40,7 @@
 #include "iwl-trans.h"
 #include "iwl-debug.h"
 #include "iwl-io.h"
+#include "iwl-op-mode.h"
 
 struct iwl_tx_queue;
 struct iwl_queue;
@@ -201,6 +202,7 @@ struct iwl_tx_queue {
  * @rxq: all the RX queue data
  * @rx_replenish: work that will be called when buffers need to be allocated
  * @trans: pointer to the generic transport area
+ * @irq_requested: true when the irq has been requested
  * @scd_base_addr: scheduler sram base address in SRAM
  * @scd_bc_tbls: pointer to the byte count table of the scheduler
  * @kw: keep warm address
@@ -211,6 +213,8 @@ struct iwl_tx_queue {
  * @txq_ctx_active_msk: what queue is active
  * queue_stopped: tracks what queue is stopped
  * queue_stop_count: tracks what SW queue is stopped
+ * @pci_dev: basic pci-network driver stuff
+ * @hw_base: pci hardware address support
  */
 struct iwl_trans_pcie {
        struct iwl_rx_queue rxq;
@@ -223,9 +227,11 @@ struct iwl_trans_pcie {
        int ict_index;
        u32 inta;
        bool use_ict;
+       bool irq_requested;
        struct tasklet_struct irq_tasklet;
        struct isr_statistics isr_stats;
 
+       spinlock_t irq_lock;
        u32 inta_mask;
        u32 scd_base_addr;
        struct iwl_dma_ptr scd_bc_tbls;
@@ -241,6 +247,10 @@ struct iwl_trans_pcie {
 #define IWL_MAX_HW_QUEUES      32
        unsigned long queue_stopped[BITS_TO_LONGS(IWL_MAX_HW_QUEUES)];
        atomic_t queue_stop_count[4];
+
+       /* PCI bus related data */
+       struct pci_dev *pci_dev;
+       void __iomem *hw_base;
 };
 
 #define IWL_TRANS_GET_PCIE_TRANS(_iwl_trans) \
@@ -258,7 +268,7 @@ void iwl_rx_queue_update_write_ptr(struct iwl_trans *trans,
 /*****************************************************
 * ICT
 ******************************************************/
-int iwl_reset_ict(struct iwl_trans *trans);
+void iwl_reset_ict(struct iwl_trans *trans);
 void iwl_disable_ict(struct iwl_trans *trans);
 int iwl_alloc_isr_ict(struct iwl_trans *trans);
 void iwl_free_isr_ict(struct iwl_trans *trans);
@@ -311,12 +321,12 @@ static inline void iwl_disable_interrupts(struct iwl_trans *trans)
        clear_bit(STATUS_INT_ENABLED, &trans->shrd->status);
 
        /* disable interrupts from uCode/NIC to host */
-       iwl_write32(bus(trans), CSR_INT_MASK, 0x00000000);
+       iwl_write32(trans, CSR_INT_MASK, 0x00000000);
 
        /* acknowledge/clear/reset any interrupts still pending
         * from uCode or flow handler (Rx/Tx DMA) */
-       iwl_write32(bus(trans), CSR_INT, 0xffffffff);
-       iwl_write32(bus(trans), CSR_FH_INT_STATUS, 0xffffffff);
+       iwl_write32(trans, CSR_INT, 0xffffffff);
+       iwl_write32(trans, CSR_FH_INT_STATUS, 0xffffffff);
        IWL_DEBUG_ISR(trans, "Disabled interrupts\n");
 }
 
@@ -327,7 +337,7 @@ static inline void iwl_enable_interrupts(struct iwl_trans *trans)
 
        IWL_DEBUG_ISR(trans, "Enabling interrupts\n");
        set_bit(STATUS_INT_ENABLED, &trans->shrd->status);
-       iwl_write32(bus(trans), CSR_INT_MASK, trans_pcie->inta_mask);
+       iwl_write32(trans, CSR_INT_MASK, trans_pcie->inta_mask);
 }
 
 /*
@@ -365,7 +375,7 @@ static inline void iwl_wake_queue(struct iwl_trans *trans,
 
        if (test_and_clear_bit(hwq, trans_pcie->queue_stopped)) {
                if (atomic_dec_return(&trans_pcie->queue_stop_count[ac]) <= 0) {
-                       iwl_wake_sw_queue(priv(trans), ac);
+                       iwl_op_mode_queue_not_full(trans->op_mode, ac);
                        IWL_DEBUG_TX_QUEUES(trans, "Wake hwq %d ac %d. %s",
                                            hwq, ac, msg);
                } else {
@@ -388,7 +398,7 @@ static inline void iwl_stop_queue(struct iwl_trans *trans,
 
        if (!test_and_set_bit(hwq, trans_pcie->queue_stopped)) {
                if (atomic_inc_return(&trans_pcie->queue_stop_count[ac]) > 0) {
-                       iwl_stop_sw_queue(priv(trans), ac);
+                       iwl_op_mode_queue_full(trans->op_mode, ac);
                        IWL_DEBUG_TX_QUEUES(trans, "Stop hwq %d ac %d"
                                            " stop count %d. %s",
                                            hwq, ac, atomic_read(&trans_pcie->
index 65d1f05..2c910fd 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2003 - 2011 Intel Corporation. All rights reserved.
+ * Copyright(c) 2003 - 2012 Intel Corporation. All rights reserved.
  *
  * Portions of this file are derived from the ipw3945 project, as well
  * as portions of the ieee80211 subsystem header files.
 #include "iwl-core.h"
 #include "iwl-io.h"
 #include "iwl-trans-pcie-int.h"
+#include "iwl-wifi.h"
+#include "iwl-op-mode.h"
+
+#ifdef CONFIG_IWLWIFI_IDI
+#include "iwl-amfh.h"
+#endif
 
 /******************************************************************************
  *
@@ -140,30 +146,30 @@ void iwl_rx_queue_update_write_ptr(struct iwl_trans *trans,
                /* shadow register enabled */
                /* Device expects a multiple of 8 */
                q->write_actual = (q->write & ~0x7);
-               iwl_write32(bus(trans), FH_RSCSR_CHNL0_WPTR, q->write_actual);
+               iwl_write32(trans, FH_RSCSR_CHNL0_WPTR, q->write_actual);
        } else {
                /* If power-saving is in use, make sure device is awake */
                if (test_bit(STATUS_POWER_PMI, &trans->shrd->status)) {
-                       reg = iwl_read32(bus(trans), CSR_UCODE_DRV_GP1);
+                       reg = iwl_read32(trans, CSR_UCODE_DRV_GP1);
 
                        if (reg & CSR_UCODE_DRV_GP1_BIT_MAC_SLEEP) {
                                IWL_DEBUG_INFO(trans,
                                        "Rx queue requesting wakeup,"
                                        " GP1 = 0x%x\n", reg);
-                               iwl_set_bit(bus(trans), CSR_GP_CNTRL,
+                               iwl_set_bit(trans, CSR_GP_CNTRL,
                                        CSR_GP_CNTRL_REG_FLAG_MAC_ACCESS_REQ);
                                goto exit_unlock;
                        }
 
                        q->write_actual = (q->write & ~0x7);
-                       iwl_write_direct32(bus(trans), FH_RSCSR_CHNL0_WPTR,
+                       iwl_write_direct32(trans, FH_RSCSR_CHNL0_WPTR,
                                        q->write_actual);
 
                /* Else device is assumed to be awake */
                } else {
                        /* Device expects a multiple of 8 */
                        q->write_actual = (q->write & ~0x7);
-                       iwl_write_direct32(bus(trans), FH_RSCSR_CHNL0_WPTR,
+                       iwl_write_direct32(trans, FH_RSCSR_CHNL0_WPTR,
                                q->write_actual);
                }
        }
@@ -223,7 +229,7 @@ static void iwlagn_rx_queue_restock(struct iwl_trans *trans)
        /* If the pre-allocated buffer pool is dropping low, schedule to
         * refill it */
        if (rxq->free_count <= RX_LOW_WATERMARK)
-               queue_work(trans->shrd->workqueue, &trans_pcie->rx_replenish);
+               schedule_work(&trans_pcie->rx_replenish);
 
 
        /* If we've added more space for the firmware to place data, tell it.
@@ -308,7 +314,7 @@ static void iwlagn_rx_allocate(struct iwl_trans *trans, gfp_t priority)
                BUG_ON(rxb->page);
                rxb->page = page;
                /* Get physical address of the RB */
-               rxb->page_dma = dma_map_page(bus(trans)->dev, page, 0,
+               rxb->page_dma = dma_map_page(trans->dev, page, 0,
                                PAGE_SIZE << hw_params(trans).rx_page_order,
                                DMA_FROM_DEVICE);
                /* dma address must be no more than 36 bits */
@@ -327,13 +333,14 @@ static void iwlagn_rx_allocate(struct iwl_trans *trans, gfp_t priority)
 
 void iwlagn_rx_replenish(struct iwl_trans *trans)
 {
+       struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
        unsigned long flags;
 
        iwlagn_rx_allocate(trans, GFP_KERNEL);
 
-       spin_lock_irqsave(&trans->shrd->lock, flags);
+       spin_lock_irqsave(&trans_pcie->irq_lock, flags);
        iwlagn_rx_queue_restock(trans);
-       spin_unlock_irqrestore(&trans->shrd->lock, flags);
+       spin_unlock_irqrestore(&trans_pcie->irq_lock, flags);
 }
 
 static void iwlagn_rx_replenish_now(struct iwl_trans *trans)
@@ -347,14 +354,8 @@ void iwl_bg_rx_replenish(struct work_struct *data)
 {
        struct iwl_trans_pcie *trans_pcie =
            container_of(data, struct iwl_trans_pcie, rx_replenish);
-       struct iwl_trans *trans = trans_pcie->trans;
-
-       if (test_bit(STATUS_EXIT_PENDING, &trans->shrd->status))
-               return;
 
-       mutex_lock(&trans->shrd->mutex);
-       iwlagn_rx_replenish(trans);
-       mutex_unlock(&trans->shrd->mutex);
+       iwlagn_rx_replenish(trans_pcie->trans);
 }
 
 /**
@@ -414,7 +415,7 @@ static void iwl_rx_handle(struct iwl_trans *trans)
 
                rxq->queue[i] = NULL;
 
-               dma_unmap_page(bus(trans)->dev, rxb->page_dma,
+               dma_unmap_page(trans->dev, rxb->page_dma,
                               PAGE_SIZE << hw_params(trans).rx_page_order,
                               DMA_FROM_DEVICE);
                pkt = rxb_addr(rxb);
@@ -460,7 +461,7 @@ static void iwl_rx_handle(struct iwl_trans *trans)
                     "reclaim is false, SEQ_RX_FRAME unset: %s\n",
                     get_cmd_string(pkt->hdr.cmd));
 
-               err = iwl_rx_dispatch(priv(trans), rxb, cmd);
+               err = iwl_op_mode_rx(trans->op_mode, rxb, cmd);
 
                /*
                 * XXX: After here, we should always check rxb->page
@@ -485,7 +486,7 @@ static void iwl_rx_handle(struct iwl_trans *trans)
                 * rx_free list for reuse later. */
                spin_lock_irqsave(&rxq->lock, flags);
                if (rxb->page != NULL) {
-                       rxb->page_dma = dma_map_page(bus(trans)->dev, rxb->page,
+                       rxb->page_dma = dma_map_page(trans->dev, rxb->page,
                                0, PAGE_SIZE <<
                                    hw_params(trans).rx_page_order,
                                DMA_FROM_DEVICE);
@@ -590,17 +591,17 @@ static void iwl_dump_nic_error_log(struct iwl_trans *trans)
 {
        u32 base;
        struct iwl_error_event_table table;
-       struct iwl_priv *priv = priv(trans);
+       struct iwl_nic *nic = nic(trans);
        struct iwl_trans_pcie *trans_pcie =
                IWL_TRANS_GET_PCIE_TRANS(trans);
 
        base = trans->shrd->device_pointers.error_event_table;
        if (trans->shrd->ucode_type == IWL_UCODE_INIT) {
                if (!base)
-                       base = priv->init_errlog_ptr;
+                       base = nic->init_errlog_ptr;
        } else {
                if (!base)
-                       base = priv->inst_errlog_ptr;
+                       base = nic->inst_errlog_ptr;
        }
 
        if (!iwlagn_hw_valid_rtc_data_addr(base)) {
@@ -612,7 +613,7 @@ static void iwl_dump_nic_error_log(struct iwl_trans *trans)
                return;
        }
 
-       iwl_read_targ_mem_words(bus(priv), base, &table, sizeof(table));
+       iwl_read_targ_mem_words(trans, base, &table, sizeof(table));
 
        if (ERROR_START_OFFSET <= table.valid * ERROR_ELEM_SIZE) {
                IWL_ERR(trans, "Start IWL Error Log Dump:\n");
@@ -622,7 +623,7 @@ static void iwl_dump_nic_error_log(struct iwl_trans *trans)
 
        trans_pcie->isr_stats.err_code = table.error_id;
 
-       trace_iwlwifi_dev_ucode_error(priv, table.error_id, table.tsf_low,
+       trace_iwlwifi_dev_ucode_error(priv(nic), table.error_id, table.tsf_low,
                                      table.data1, table.data2, table.line,
                                      table.blink1, table.blink2, table.ilink1,
                                      table.ilink2, table.bcon_time, table.gp1,
@@ -670,12 +671,11 @@ static void iwl_dump_nic_error_log(struct iwl_trans *trans)
  */
 static void iwl_irq_handle_error(struct iwl_trans *trans)
 {
-       struct iwl_priv *priv = priv(trans);
        /* W/A for WiFi/WiMAX coex and WiMAX own the RF */
-       if (cfg(priv)->internal_wimax_coex &&
-           (!(iwl_read_prph(bus(trans), APMG_CLK_CTRL_REG) &
+       if (cfg(trans)->internal_wimax_coex &&
+           (!(iwl_read_prph(trans, APMG_CLK_CTRL_REG) &
                        APMS_CLK_VAL_MRB_FUNC_MODE) ||
-            (iwl_read_prph(bus(trans), APMG_PS_CTRL_REG) &
+            (iwl_read_prph(trans, APMG_PS_CTRL_REG) &
                        APMG_PS_CTRL_VAL_RESET_REQ))) {
                /*
                 * Keep the restart process from trying to send host
@@ -683,24 +683,20 @@ static void iwl_irq_handle_error(struct iwl_trans *trans)
                 */
                clear_bit(STATUS_READY, &trans->shrd->status);
                clear_bit(STATUS_HCMD_ACTIVE, &trans->shrd->status);
-               wake_up(&priv->shrd->wait_command_queue);
+               wake_up(&trans->shrd->wait_command_queue);
                IWL_ERR(trans, "RF is used by WiMAX\n");
                return;
        }
 
        IWL_ERR(trans, "Loaded firmware version: %s\n",
-               priv->hw->wiphy->fw_version);
+               nic(trans)->fw.fw_version);
 
        iwl_dump_nic_error_log(trans);
        iwl_dump_csr(trans);
        iwl_dump_fh(trans, NULL, false);
        iwl_dump_nic_event_log(trans, false, NULL, false);
-#ifdef CONFIG_IWLWIFI_DEBUG
-       if (iwl_get_debug_level(trans->shrd) & IWL_DL_FW_ERRORS)
-               iwl_print_rx_config_cmd(priv(trans), IWL_RXON_CTX_BSS);
-#endif
 
-       iwlagn_fw_error(priv, false);
+       iwl_op_mode_nic_error(trans->op_mode);
 }
 
 #define EVENT_START_OFFSET  (4 * sizeof(u32))
@@ -719,7 +715,7 @@ static int iwl_print_event_log(struct iwl_trans *trans, u32 start_idx,
        u32 ptr;        /* SRAM byte address of log data */
        u32 ev, time, data; /* event log data */
        unsigned long reg_flags;
-       struct iwl_priv *priv = priv(trans);
+       struct iwl_nic *nic = nic(trans);
 
        if (num_events == 0)
                return pos;
@@ -727,10 +723,10 @@ static int iwl_print_event_log(struct iwl_trans *trans, u32 start_idx,
        base = trans->shrd->device_pointers.log_event_table;
        if (trans->shrd->ucode_type == IWL_UCODE_INIT) {
                if (!base)
-                       base = priv->init_evtlog_ptr;
+                       base = nic->init_evtlog_ptr;
        } else {
                if (!base)
-                       base = priv->inst_evtlog_ptr;
+                       base = nic->inst_evtlog_ptr;
        }
 
        if (mode == 0)
@@ -741,18 +737,18 @@ static int iwl_print_event_log(struct iwl_trans *trans, u32 start_idx,
        ptr = base + EVENT_START_OFFSET + (start_idx * event_size);
 
        /* Make sure device is powered up for SRAM reads */
-       spin_lock_irqsave(&bus(trans)->reg_lock, reg_flags);
-       iwl_grab_nic_access(bus(trans));
+       spin_lock_irqsave(&trans->reg_lock, reg_flags);
+       iwl_grab_nic_access(trans);
 
        /* Set starting address; reads will auto-increment */
-       iwl_write32(bus(trans), HBUS_TARG_MEM_RADDR, ptr);
+       iwl_write32(trans, HBUS_TARG_MEM_RADDR, ptr);
        rmb();
 
        /* "time" is actually "data" for mode 0 (no timestamp).
        * place event id # at far right for easier visual parsing. */
        for (i = 0; i < num_events; i++) {
-               ev = iwl_read32(bus(trans), HBUS_TARG_MEM_RDAT);
-               time = iwl_read32(bus(trans), HBUS_TARG_MEM_RDAT);
+               ev = iwl_read32(trans, HBUS_TARG_MEM_RDAT);
+               time = iwl_read32(trans, HBUS_TARG_MEM_RDAT);
                if (mode == 0) {
                        /* data, ev */
                        if (bufsz) {
@@ -760,13 +756,13 @@ static int iwl_print_event_log(struct iwl_trans *trans, u32 start_idx,
                                                "EVT_LOG:0x%08x:%04u\n",
                                                time, ev);
                        } else {
-                               trace_iwlwifi_dev_ucode_event(priv, 0,
+                               trace_iwlwifi_dev_ucode_event(priv(trans), 0,
                                        time, ev);
                                IWL_ERR(trans, "EVT_LOG:0x%08x:%04u\n",
                                        time, ev);
                        }
                } else {
-                       data = iwl_read32(bus(trans), HBUS_TARG_MEM_RDAT);
+                       data = iwl_read32(trans, HBUS_TARG_MEM_RDAT);
                        if (bufsz) {
                                pos += scnprintf(*buf + pos, bufsz - pos,
                                                "EVT_LOGT:%010u:0x%08x:%04u\n",
@@ -774,15 +770,15 @@ static int iwl_print_event_log(struct iwl_trans *trans, u32 start_idx,
                        } else {
                                IWL_ERR(trans, "EVT_LOGT:%010u:0x%08x:%04u\n",
                                        time, data, ev);
-                               trace_iwlwifi_dev_ucode_event(priv, time,
+                               trace_iwlwifi_dev_ucode_event(priv(trans), time,
                                        data, ev);
                        }
                }
        }
 
        /* Allow device to power down */
-       iwl_release_nic_access(bus(trans));
-       spin_unlock_irqrestore(&bus(trans)->reg_lock, reg_flags);
+       iwl_release_nic_access(trans);
+       spin_unlock_irqrestore(&trans->reg_lock, reg_flags);
        return pos;
 }
 
@@ -836,17 +832,17 @@ int iwl_dump_nic_event_log(struct iwl_trans *trans, bool full_log,
        u32 logsize;
        int pos = 0;
        size_t bufsz = 0;
-       struct iwl_priv *priv = priv(trans);
+       struct iwl_nic *nic = nic(trans);
 
        base = trans->shrd->device_pointers.log_event_table;
        if (trans->shrd->ucode_type == IWL_UCODE_INIT) {
-               logsize = priv->init_evtlog_size;
+               logsize = nic->init_evtlog_size;
                if (!base)
-                       base = priv->init_evtlog_ptr;
+                       base = nic->init_evtlog_ptr;
        } else {
-               logsize = priv->inst_evtlog_size;
+               logsize = nic->inst_evtlog_size;
                if (!base)
-                       base = priv->inst_evtlog_ptr;
+                       base = nic->inst_evtlog_ptr;
        }
 
        if (!iwlagn_hw_valid_rtc_data_addr(base)) {
@@ -859,10 +855,10 @@ int iwl_dump_nic_event_log(struct iwl_trans *trans, bool full_log,
        }
 
        /* event log header */
-       capacity = iwl_read_targ_mem(bus(trans), base);
-       mode = iwl_read_targ_mem(bus(trans), base + (1 * sizeof(u32)));
-       num_wraps = iwl_read_targ_mem(bus(trans), base + (2 * sizeof(u32)));
-       next_entry = iwl_read_targ_mem(bus(trans), base + (3 * sizeof(u32)));
+       capacity = iwl_read_targ_mem(trans, base);
+       mode = iwl_read_targ_mem(trans, base + (1 * sizeof(u32)));
+       num_wraps = iwl_read_targ_mem(trans, base + (2 * sizeof(u32)));
+       next_entry = iwl_read_targ_mem(trans, base + (3 * sizeof(u32)));
 
        if (capacity > logsize) {
                IWL_ERR(trans, "Log capacity %d is bogus, limit to %d "
@@ -945,7 +941,7 @@ void iwl_irq_tasklet(struct iwl_trans *trans)
        struct isr_statistics *isr_stats = &trans_pcie->isr_stats;
 
 
-       spin_lock_irqsave(&trans->shrd->lock, flags);
+       spin_lock_irqsave(&trans_pcie->irq_lock, flags);
 
        /* Ack/clear/reset pending uCode interrupts.
         * Note:  Some bits in CSR_INT are "OR" of bits in CSR_FH_INT_STATUS,
@@ -958,7 +954,7 @@ void iwl_irq_tasklet(struct iwl_trans *trans)
         * hardware bugs here by ACKing all the possible interrupts so that
         * interrupt coalescing can still be achieved.
         */
-       iwl_write32(bus(trans), CSR_INT,
+       iwl_write32(trans, CSR_INT,
                trans_pcie->inta | ~trans_pcie->inta_mask);
 
        inta = trans_pcie->inta;
@@ -966,7 +962,7 @@ void iwl_irq_tasklet(struct iwl_trans *trans)
 #ifdef CONFIG_IWLWIFI_DEBUG
        if (iwl_get_debug_level(trans->shrd) & IWL_DL_ISR) {
                /* just for debug */
-               inta_mask = iwl_read32(bus(trans), CSR_INT_MASK);
+               inta_mask = iwl_read32(trans, CSR_INT_MASK);
                IWL_DEBUG_ISR(trans, "inta 0x%08x, enabled 0x%08x\n ",
                                inta, inta_mask);
        }
@@ -975,7 +971,7 @@ void iwl_irq_tasklet(struct iwl_trans *trans)
        /* saved interrupt in inta variable now we can reset trans_pcie->inta */
        trans_pcie->inta = 0;
 
-       spin_unlock_irqrestore(&trans->shrd->lock, flags);
+       spin_unlock_irqrestore(&trans_pcie->irq_lock, flags);
 
        /* Now service all interrupt bits discovered above. */
        if (inta & CSR_INT_BIT_HW_ERR) {
@@ -1014,7 +1010,7 @@ void iwl_irq_tasklet(struct iwl_trans *trans)
        /* HW RF KILL switch toggled */
        if (inta & CSR_INT_BIT_RF_KILL) {
                int hw_rf_kill = 0;
-               if (!(iwl_read32(bus(trans), CSR_GP_CNTRL) &
+               if (!(iwl_read32(trans, CSR_GP_CNTRL) &
                                CSR_GP_CNTRL_REG_FLAG_HW_RF_KILL_SW))
                        hw_rf_kill = 1;
 
@@ -1035,7 +1031,7 @@ void iwl_irq_tasklet(struct iwl_trans *trans)
                        else
                                clear_bit(STATUS_RF_KILL_HW,
                                          &trans->shrd->status);
-                       iwl_set_hw_rfkill_state(priv(trans), hw_rf_kill);
+                       iwl_op_mode_hw_rf_kill(trans->op_mode, hw_rf_kill);
                }
 
                handled |= CSR_INT_BIT_RF_KILL;
@@ -1078,12 +1074,12 @@ void iwl_irq_tasklet(struct iwl_trans *trans)
                IWL_DEBUG_ISR(trans, "Rx interrupt\n");
                if (inta & (CSR_INT_BIT_FH_RX | CSR_INT_BIT_SW_RX)) {
                        handled |= (CSR_INT_BIT_FH_RX | CSR_INT_BIT_SW_RX);
-                       iwl_write32(bus(trans), CSR_FH_INT_STATUS,
+                       iwl_write32(trans, CSR_FH_INT_STATUS,
                                        CSR_FH_INT_RX_MASK);
                }
                if (inta & CSR_INT_BIT_RX_PERIODIC) {
                        handled |= CSR_INT_BIT_RX_PERIODIC;
-                       iwl_write32(bus(trans),
+                       iwl_write32(trans,
                                CSR_INT, CSR_INT_BIT_RX_PERIODIC);
                }
                /* Sending RX interrupt require many steps to be done in the
@@ -1098,10 +1094,13 @@ void iwl_irq_tasklet(struct iwl_trans *trans)
                 */
 
                /* Disable periodic interrupt; we use it as just a one-shot. */
-               iwl_write8(bus(trans), CSR_INT_PERIODIC_REG,
+               iwl_write8(trans, CSR_INT_PERIODIC_REG,
                            CSR_INT_PERIODIC_DIS);
+#ifdef CONFIG_IWLWIFI_IDI
+               iwl_amfh_rx_handler();
+#else
                iwl_rx_handle(trans);
-
+#endif
                /*
                 * Enable periodic interrupt in 8 msec only if we received
                 * real RX interrupt (instead of just periodic int), to catch
@@ -1110,7 +1109,7 @@ void iwl_irq_tasklet(struct iwl_trans *trans)
                 * to extend the periodic interrupt; one-shot is enough.
                 */
                if (inta & (CSR_INT_BIT_FH_RX | CSR_INT_BIT_SW_RX))
-                       iwl_write8(bus(trans), CSR_INT_PERIODIC_REG,
+                       iwl_write8(trans, CSR_INT_PERIODIC_REG,
                                    CSR_INT_PERIODIC_ENA);
 
                isr_stats->rx++;
@@ -1118,7 +1117,7 @@ void iwl_irq_tasklet(struct iwl_trans *trans)
 
        /* This "Tx" DMA channel is used only for loading uCode */
        if (inta & CSR_INT_BIT_FH_TX) {
-               iwl_write32(bus(trans), CSR_FH_INT_STATUS, CSR_FH_INT_TX_MASK);
+               iwl_write32(trans, CSR_FH_INT_STATUS, CSR_FH_INT_TX_MASK);
                IWL_DEBUG_ISR(trans, "uCode load interrupt\n");
                isr_stats->tx++;
                handled |= CSR_INT_BIT_FH_TX;
@@ -1142,8 +1141,10 @@ void iwl_irq_tasklet(struct iwl_trans *trans)
        if (test_bit(STATUS_INT_ENABLED, &trans->shrd->status))
                iwl_enable_interrupts(trans);
        /* Re-enable RF_KILL if it occurred */
-       else if (handled & CSR_INT_BIT_RF_KILL)
-               iwl_enable_rfkill_int(priv(trans));
+       else if (handled & CSR_INT_BIT_RF_KILL) {
+               IWL_DEBUG_ISR(trans, "Enabling rfkill interrupt\n");
+               iwl_write32(trans, CSR_INT_MASK, CSR_INT_BIT_RF_KILL);
+       }
 }
 
 /******************************************************************************
@@ -1164,7 +1165,7 @@ void iwl_free_isr_ict(struct iwl_trans *trans)
                IWL_TRANS_GET_PCIE_TRANS(trans);
 
        if (trans_pcie->ict_tbl) {
-               dma_free_coherent(bus(trans)->dev, ICT_SIZE,
+               dma_free_coherent(trans->dev, ICT_SIZE,
                                  trans_pcie->ict_tbl,
                                  trans_pcie->ict_tbl_dma);
                trans_pcie->ict_tbl = NULL;
@@ -1184,7 +1185,7 @@ int iwl_alloc_isr_ict(struct iwl_trans *trans)
                IWL_TRANS_GET_PCIE_TRANS(trans);
 
        trans_pcie->ict_tbl =
-               dma_alloc_coherent(bus(trans)->dev, ICT_SIZE,
+               dma_alloc_coherent(trans->dev, ICT_SIZE,
                                   &trans_pcie->ict_tbl_dma,
                                   GFP_KERNEL);
        if (!trans_pcie->ict_tbl)
@@ -1213,7 +1214,7 @@ int iwl_alloc_isr_ict(struct iwl_trans *trans)
 /* Device is going up inform it about using ICT interrupt table,
  * also we need to tell the driver to start using ICT interrupt.
  */
-int iwl_reset_ict(struct iwl_trans *trans)
+void iwl_reset_ict(struct iwl_trans *trans)
 {
        u32 val;
        unsigned long flags;
@@ -1221,9 +1222,9 @@ int iwl_reset_ict(struct iwl_trans *trans)
                IWL_TRANS_GET_PCIE_TRANS(trans);
 
        if (!trans_pcie->ict_tbl)
-               return 0;
+               return;
 
-       spin_lock_irqsave(&trans->shrd->lock, flags);
+       spin_lock_irqsave(&trans_pcie->irq_lock, flags);
        iwl_disable_interrupts(trans);
 
        memset(trans_pcie->ict_tbl, 0, ICT_SIZE);
@@ -1235,14 +1236,12 @@ int iwl_reset_ict(struct iwl_trans *trans)
 
        IWL_DEBUG_ISR(trans, "CSR_DRAM_INT_TBL_REG =0x%x\n", val);
 
-       iwl_write32(bus(trans), CSR_DRAM_INT_TBL_REG, val);
+       iwl_write32(trans, CSR_DRAM_INT_TBL_REG, val);
        trans_pcie->use_ict = true;
        trans_pcie->ict_index = 0;
-       iwl_write32(bus(trans), CSR_INT, trans_pcie->inta_mask);
+       iwl_write32(trans, CSR_INT, trans_pcie->inta_mask);
        iwl_enable_interrupts(trans);
-       spin_unlock_irqrestore(&trans->shrd->lock, flags);
-
-       return 0;
+       spin_unlock_irqrestore(&trans_pcie->irq_lock, flags);
 }
 
 /* Device is going down disable ict interrupt usage */
@@ -1253,9 +1252,9 @@ void iwl_disable_ict(struct iwl_trans *trans)
 
        unsigned long flags;
 
-       spin_lock_irqsave(&trans->shrd->lock, flags);
+       spin_lock_irqsave(&trans_pcie->irq_lock, flags);
        trans_pcie->use_ict = false;
-       spin_unlock_irqrestore(&trans->shrd->lock, flags);
+       spin_unlock_irqrestore(&trans_pcie->irq_lock, flags);
 }
 
 static irqreturn_t iwl_isr(int irq, void *data)
@@ -1274,17 +1273,17 @@ static irqreturn_t iwl_isr(int irq, void *data)
 
        trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
 
-       spin_lock_irqsave(&trans->shrd->lock, flags);
+       spin_lock_irqsave(&trans_pcie->irq_lock, flags);
 
        /* Disable (but don't clear!) interrupts here to avoid
         *    back-to-back ISRs and sporadic interrupts from our NIC.
         * If we have something to service, the tasklet will re-enable ints.
         * If we *don't* have something, we'll re-enable before leaving here. */
-       inta_mask = iwl_read32(bus(trans), CSR_INT_MASK);  /* just for debug */
-       iwl_write32(bus(trans), CSR_INT_MASK, 0x00000000);
+       inta_mask = iwl_read32(trans, CSR_INT_MASK);  /* just for debug */
+       iwl_write32(trans, CSR_INT_MASK, 0x00000000);
 
        /* Discover which interrupts are active/pending */
-       inta = iwl_read32(bus(trans), CSR_INT);
+       inta = iwl_read32(trans, CSR_INT);
 
        /* Ignore interrupt if there's nothing in NIC to service.
         * This may be due to IRQ shared with another device,
@@ -1303,7 +1302,7 @@ static irqreturn_t iwl_isr(int irq, void *data)
 
 #ifdef CONFIG_IWLWIFI_DEBUG
        if (iwl_get_debug_level(trans->shrd) & (IWL_DL_ISR)) {
-               inta_fh = iwl_read32(bus(trans), CSR_FH_INT_STATUS);
+               inta_fh = iwl_read32(trans, CSR_FH_INT_STATUS);
                IWL_DEBUG_ISR(trans, "ISR inta 0x%08x, enabled 0x%08x, "
                              "fh 0x%08x\n", inta, inta_mask, inta_fh);
        }
@@ -1318,7 +1317,7 @@ static irqreturn_t iwl_isr(int irq, void *data)
                iwl_enable_interrupts(trans);
 
  unplugged:
-       spin_unlock_irqrestore(&trans->shrd->lock, flags);
+       spin_unlock_irqrestore(&trans_pcie->irq_lock, flags);
        return IRQ_HANDLED;
 
  none:
@@ -1328,7 +1327,7 @@ static irqreturn_t iwl_isr(int irq, void *data)
                !trans_pcie->inta)
                iwl_enable_interrupts(trans);
 
-       spin_unlock_irqrestore(&trans->shrd->lock, flags);
+       spin_unlock_irqrestore(&trans_pcie->irq_lock, flags);
        return IRQ_NONE;
 }
 
@@ -1362,15 +1361,15 @@ irqreturn_t iwl_isr_ict(int irq, void *data)
 
        trace_iwlwifi_dev_irq(priv(trans));
 
-       spin_lock_irqsave(&trans->shrd->lock, flags);
+       spin_lock_irqsave(&trans_pcie->irq_lock, flags);
 
        /* Disable (but don't clear!) interrupts here to avoid
         * back-to-back ISRs and sporadic interrupts from our NIC.
         * If we have something to service, the tasklet will re-enable ints.
         * If we *don't* have something, we'll re-enable before leaving here.
         */
-       inta_mask = iwl_read32(bus(trans), CSR_INT_MASK);  /* just for debug */
-       iwl_write32(bus(trans), CSR_INT_MASK, 0x00000000);
+       inta_mask = iwl_read32(trans, CSR_INT_MASK);  /* just for debug */
+       iwl_write32(trans, CSR_INT_MASK, 0x00000000);
 
 
        /* Ignore interrupt if there's nothing in NIC to service.
@@ -1433,7 +1432,7 @@ irqreturn_t iwl_isr_ict(int irq, void *data)
                iwl_enable_interrupts(trans);
        }
 
-       spin_unlock_irqrestore(&trans->shrd->lock, flags);
+       spin_unlock_irqrestore(&trans_pcie->irq_lock, flags);
        return IRQ_HANDLED;
 
  none:
@@ -1444,6 +1443,6 @@ irqreturn_t iwl_isr_ict(int irq, void *data)
            !trans_pcie->inta)
                iwl_enable_interrupts(trans);
 
-       spin_unlock_irqrestore(&trans->shrd->lock, flags);
+       spin_unlock_irqrestore(&trans_pcie->irq_lock, flags);
        return IRQ_NONE;
 }
index bd29568..4e1e74e 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2003 - 2011 Intel Corporation. All rights reserved.
+ * Copyright(c) 2003 - 2012 Intel Corporation. All rights reserved.
  *
  * Portions of this file are derived from the ipw3945 project, as well
  * as portions of the ieee80211 subsystem header files.
@@ -35,6 +35,7 @@
 #include "iwl-prph.h"
 #include "iwl-io.h"
 #include "iwl-agn-hw.h"
+#include "iwl-op-mode.h"
 #include "iwl-trans-pcie-int.h"
 
 #define IWL_TX_CRC_SIZE 4
@@ -100,7 +101,7 @@ void iwl_txq_update_write_ptr(struct iwl_trans *trans, struct iwl_tx_queue *txq)
 
        if (hw_params(trans).shadow_reg_enable) {
                /* shadow register enabled */
-               iwl_write32(bus(trans), HBUS_TARG_WRPTR,
+               iwl_write32(trans, HBUS_TARG_WRPTR,
                            txq->q.write_ptr | (txq_id << 8));
        } else {
                /* if we're trying to save power */
@@ -108,18 +109,18 @@ void iwl_txq_update_write_ptr(struct iwl_trans *trans, struct iwl_tx_queue *txq)
                        /* wake up nic if it's powered down ...
                         * uCode will wake up, and interrupt us again, so next
                         * time we'll skip this part. */
-                       reg = iwl_read32(bus(trans), CSR_UCODE_DRV_GP1);
+                       reg = iwl_read32(trans, CSR_UCODE_DRV_GP1);
 
                        if (reg & CSR_UCODE_DRV_GP1_BIT_MAC_SLEEP) {
                                IWL_DEBUG_INFO(trans,
                                        "Tx queue %d requesting wakeup,"
                                        " GP1 = 0x%x\n", txq_id, reg);
-                               iwl_set_bit(bus(trans), CSR_GP_CNTRL,
+                               iwl_set_bit(trans, CSR_GP_CNTRL,
                                        CSR_GP_CNTRL_REG_FLAG_MAC_ACCESS_REQ);
                                return;
                        }
 
-                       iwl_write_direct32(bus(trans), HBUS_TARG_WRPTR,
+                       iwl_write_direct32(trans, HBUS_TARG_WRPTR,
                                     txq->q.write_ptr | (txq_id << 8));
 
                /*
@@ -128,7 +129,7 @@ void iwl_txq_update_write_ptr(struct iwl_trans *trans, struct iwl_tx_queue *txq)
                 * trying to tx (during RFKILL, we're not trying to tx).
                 */
                } else
-                       iwl_write32(bus(trans), HBUS_TARG_WRPTR,
+                       iwl_write32(trans, HBUS_TARG_WRPTR,
                                    txq->q.write_ptr | (txq_id << 8));
        }
        txq->need_update = 0;
@@ -190,14 +191,14 @@ static void iwlagn_unmap_tfd(struct iwl_trans *trans, struct iwl_cmd_meta *meta,
 
        /* Unmap tx_cmd */
        if (num_tbs)
-               dma_unmap_single(bus(trans)->dev,
+               dma_unmap_single(trans->dev,
                                dma_unmap_addr(meta, mapping),
                                dma_unmap_len(meta, len),
                                DMA_BIDIRECTIONAL);
 
        /* Unmap chunks, if any. */
        for (i = 1; i < num_tbs; i++)
-               dma_unmap_single(bus(trans)->dev, iwl_tfd_tb_get_addr(tfd, i),
+               dma_unmap_single(trans->dev, iwl_tfd_tb_get_addr(tfd, i),
                                iwl_tfd_tb_get_len(tfd, i), dma_dir);
 }
 
@@ -229,7 +230,7 @@ void iwlagn_txq_free_tfd(struct iwl_trans *trans, struct iwl_tx_queue *txq,
                 * freed and that the queue is not empty - free the skb
                 */
                if (skb) {
-                       iwl_free_skb(priv(trans), skb);
+                       iwl_op_mode_free_skb(trans->op_mode, skb);
                        txq->skbs[index] = NULL;
                }
        }
@@ -383,14 +384,14 @@ static int iwlagn_tx_queue_set_q2ratid(struct iwl_trans *trans, u16 ra_tid,
        tbl_dw_addr = trans_pcie->scd_base_addr +
                        SCD_TRANS_TBL_OFFSET_QUEUE(txq_id);
 
-       tbl_dw = iwl_read_targ_mem(bus(trans), tbl_dw_addr);
+       tbl_dw = iwl_read_targ_mem(trans, tbl_dw_addr);
 
        if (txq_id & 0x1)
                tbl_dw = (scd_q2ratid << 16) | (tbl_dw & 0x0000FFFF);
        else
                tbl_dw = scd_q2ratid | (tbl_dw & 0xFFFF0000);
 
-       iwl_write_targ_mem(bus(trans), tbl_dw_addr, tbl_dw);
+       iwl_write_targ_mem(trans, tbl_dw_addr, tbl_dw);
 
        return 0;
 }
@@ -399,7 +400,7 @@ static void iwlagn_tx_queue_stop_scheduler(struct iwl_trans *trans, u16 txq_id)
 {
        /* Simply stop the queue, but don't change any configuration;
         * the SCD_ACT_EN bit is the write-enable mask for the ACTIVE bit. */
-       iwl_write_prph(bus(trans),
+       iwl_write_prph(trans,
                SCD_QUEUE_STATUS_BITS(txq_id),
                (0 << SCD_QUEUE_STTS_REG_POS_ACTIVE)|
                (1 << SCD_QUEUE_STTS_REG_POS_SCD_ACT_EN));
@@ -409,9 +410,9 @@ void iwl_trans_set_wr_ptrs(struct iwl_trans *trans,
                                int txq_id, u32 index)
 {
        IWL_DEBUG_TX_QUEUES(trans, "Q %d  WrPtr: %d", txq_id, index & 0xff);
-       iwl_write_direct32(bus(trans), HBUS_TARG_WRPTR,
+       iwl_write_direct32(trans, HBUS_TARG_WRPTR,
                        (index & 0xff) | (txq_id << 8));
-       iwl_write_prph(bus(trans), SCD_QUEUE_RDPTR(txq_id), index);
+       iwl_write_prph(trans, SCD_QUEUE_RDPTR(txq_id), index);
 }
 
 void iwl_trans_tx_queue_set_status(struct iwl_trans *trans,
@@ -423,7 +424,7 @@ void iwl_trans_tx_queue_set_status(struct iwl_trans *trans,
        int active =
                test_bit(txq_id, &trans_pcie->txq_ctx_active_msk) ? 1 : 0;
 
-       iwl_write_prph(bus(trans), SCD_QUEUE_STATUS_BITS(txq_id),
+       iwl_write_prph(trans, SCD_QUEUE_STATUS_BITS(txq_id),
                        (active << SCD_QUEUE_STTS_REG_POS_ACTIVE) |
                        (tx_fifo_id << SCD_QUEUE_STTS_REG_POS_TXF) |
                        (1 << SCD_QUEUE_STTS_REG_POS_WSL) |
@@ -431,9 +432,12 @@ void iwl_trans_tx_queue_set_status(struct iwl_trans *trans,
 
        txq->sched_retry = scd_retry;
 
-       IWL_DEBUG_TX_QUEUES(trans, "%s %s Queue %d on FIFO %d\n",
-                      active ? "Activate" : "Deactivate",
-                      scd_retry ? "BA" : "AC/CMD", txq_id, tx_fifo_id);
+       if (active)
+               IWL_DEBUG_TX_QUEUES(trans, "Activate %s Queue %d on FIFO %d\n",
+                       scd_retry ? "BA" : "AC/CMD", txq_id, tx_fifo_id);
+       else
+               IWL_DEBUG_TX_QUEUES(trans, "Deactivate %s Queue %d\n",
+                       scd_retry ? "BA" : "AC/CMD", txq_id);
 }
 
 static inline int get_fifo_from_tid(struct iwl_trans_pcie *trans_pcie,
@@ -478,7 +482,7 @@ void iwl_trans_pcie_tx_agg_setup(struct iwl_trans *trans,
        }
 
        txq_id = trans_pcie->agg_txq[sta_id][tid];
-       if (WARN_ON_ONCE(is_agg_txqid_valid(trans, txq_id) == false)) {
+       if (WARN_ON_ONCE(!is_agg_txqid_valid(trans, txq_id))) {
                IWL_ERR(trans,
                        "queue number out of range: %d, must be %d to %d\n",
                        txq_id, IWLAGN_FIRST_AMPDU_QUEUE,
@@ -489,7 +493,7 @@ void iwl_trans_pcie_tx_agg_setup(struct iwl_trans *trans,
 
        ra_tid = BUILD_RAxTID(sta_id, tid);
 
-       spin_lock_irqsave(&trans->shrd->lock, flags);
+       spin_lock_irqsave(&trans_pcie->irq_lock, flags);
 
        /* Stop this Tx queue before configuring it */
        iwlagn_tx_queue_stop_scheduler(trans, txq_id);
@@ -498,10 +502,10 @@ void iwl_trans_pcie_tx_agg_setup(struct iwl_trans *trans,
        iwlagn_tx_queue_set_q2ratid(trans, ra_tid, txq_id);
 
        /* Set this queue as a chain-building queue */
-       iwl_set_bits_prph(bus(trans), SCD_QUEUECHAIN_SEL, (1<<txq_id));
+       iwl_set_bits_prph(trans, SCD_QUEUECHAIN_SEL, (1<<txq_id));
 
        /* enable aggregations for the queue */
-       iwl_set_bits_prph(bus(trans), SCD_AGGR_SEL, (1<<txq_id));
+       iwl_set_bits_prph(trans, SCD_AGGR_SEL, (1<<txq_id));
 
        /* Place first TFD at index corresponding to start sequence number.
         * Assumes that ssn_idx is valid (!= 0xFFF) */
@@ -510,7 +514,7 @@ void iwl_trans_pcie_tx_agg_setup(struct iwl_trans *trans,
        iwl_trans_set_wr_ptrs(trans, txq_id, ssn);
 
        /* Set up Tx window size and frame limit for this queue */
-       iwl_write_targ_mem(bus(trans), trans_pcie->scd_base_addr +
+       iwl_write_targ_mem(trans, trans_pcie->scd_base_addr +
                        SCD_CONTEXT_QUEUE_OFFSET(txq_id) +
                        sizeof(u32),
                        ((frame_limit <<
@@ -520,7 +524,7 @@ void iwl_trans_pcie_tx_agg_setup(struct iwl_trans *trans,
                        SCD_QUEUE_CTX_REG2_FRAME_LIMIT_POS) &
                        SCD_QUEUE_CTX_REG2_FRAME_LIMIT_MSK));
 
-       iwl_set_bits_prph(bus(trans), SCD_INTERRUPT_MASK, (1 << txq_id));
+       iwl_set_bits_prph(trans, SCD_INTERRUPT_MASK, (1 << txq_id));
 
        /* Set up Status area in SRAM, map to Tx DMA/FIFO, activate the queue */
        iwl_trans_tx_queue_set_status(trans, &trans_pcie->txq[txq_id],
@@ -529,7 +533,7 @@ void iwl_trans_pcie_tx_agg_setup(struct iwl_trans *trans,
        trans_pcie->txq[txq_id].sta_id = sta_id;
        trans_pcie->txq[txq_id].tid = tid;
 
-       spin_unlock_irqrestore(&trans->shrd->lock, flags);
+       spin_unlock_irqrestore(&trans_pcie->irq_lock, flags);
 }
 
 /*
@@ -573,7 +577,7 @@ int iwl_trans_pcie_tx_agg_disable(struct iwl_trans *trans, int sta_id, int tid)
        struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
        u8 txq_id = trans_pcie->agg_txq[sta_id][tid];
 
-       if (WARN_ON_ONCE(is_agg_txqid_valid(trans, txq_id) == false)) {
+       if (WARN_ON_ONCE(!is_agg_txqid_valid(trans, txq_id))) {
                IWL_ERR(trans,
                        "queue number out of range: %d, must be %d to %d\n",
                        txq_id, IWLAGN_FIRST_AMPDU_QUEUE,
@@ -584,7 +588,7 @@ int iwl_trans_pcie_tx_agg_disable(struct iwl_trans *trans, int sta_id, int tid)
 
        iwlagn_tx_queue_stop_scheduler(trans, txq_id);
 
-       iwl_clear_bits_prph(bus(trans), SCD_AGGR_SEL, (1 << txq_id));
+       iwl_clear_bits_prph(trans, SCD_AGGR_SEL, (1 << txq_id));
 
        trans_pcie->agg_txq[sta_id][tid] = 0;
        trans_pcie->txq[txq_id].q.read_ptr = 0;
@@ -592,7 +596,7 @@ int iwl_trans_pcie_tx_agg_disable(struct iwl_trans *trans, int sta_id, int tid)
        /* supposes that ssn_idx is valid (!= 0xFFF) */
        iwl_trans_set_wr_ptrs(trans, txq_id, 0);
 
-       iwl_clear_bits_prph(bus(trans), SCD_INTERRUPT_MASK, (1 << txq_id));
+       iwl_clear_bits_prph(trans, SCD_INTERRUPT_MASK, (1 << txq_id));
        iwl_txq_ctx_deactivate(trans_pcie, txq_id);
        iwl_trans_tx_queue_set_status(trans, &trans_pcie->txq[txq_id], 0, 0);
        return 0;
@@ -685,7 +689,7 @@ static int iwl_enqueue_hcmd(struct iwl_trans *trans, struct iwl_host_cmd *cmd)
                is_ct_kill = iwl_check_for_ct_kill(priv(trans));
                if (!is_ct_kill) {
                        IWL_ERR(trans, "Restarting adapter queue is full\n");
-                       iwlagn_fw_error(priv(trans), false);
+                       iwl_op_mode_nic_error(trans->op_mode);
                }
                return -ENOSPC;
        }
@@ -725,9 +729,9 @@ static int iwl_enqueue_hcmd(struct iwl_trans *trans, struct iwl_host_cmd *cmd)
                        le16_to_cpu(out_cmd->hdr.sequence), cmd_size,
                        q->write_ptr, idx, trans->shrd->cmd_queue);
 
-       phys_addr = dma_map_single(bus(trans)->dev, &out_cmd->hdr, copy_size,
+       phys_addr = dma_map_single(trans->dev, &out_cmd->hdr, copy_size,
                                DMA_BIDIRECTIONAL);
-       if (unlikely(dma_mapping_error(bus(trans)->dev, phys_addr))) {
+       if (unlikely(dma_mapping_error(trans->dev, phys_addr))) {
                idx = -ENOMEM;
                goto out;
        }
@@ -748,10 +752,10 @@ static int iwl_enqueue_hcmd(struct iwl_trans *trans, struct iwl_host_cmd *cmd)
                        continue;
                if (!(cmd->dataflags[i] & IWL_HCMD_DFL_NOCOPY))
                        continue;
-               phys_addr = dma_map_single(bus(trans)->dev,
+               phys_addr = dma_map_single(trans->dev,
                                           (void *)cmd->data[i],
                                           cmd->len[i], DMA_BIDIRECTIONAL);
-               if (dma_mapping_error(bus(trans)->dev, phys_addr)) {
+               if (dma_mapping_error(trans->dev, phys_addr)) {
                        iwlagn_unmap_tfd(trans, out_meta,
                                         &txq->tfds[q->write_ptr],
                                         DMA_BIDIRECTIONAL);
@@ -818,7 +822,7 @@ static void iwl_hcmd_queue_reclaim(struct iwl_trans *trans, int txq_id,
                if (nfreed++ > 0) {
                        IWL_ERR(trans, "HCMD skipped: index (%d) %d %d\n", idx,
                                        q->write_ptr, q->read_ptr);
-                       iwlagn_fw_error(priv(trans), false);
+                       iwl_op_mode_nic_error(trans->op_mode);
                }
 
        }
index 324d06d..9f8b239 100644 (file)
@@ -5,7 +5,7 @@
  *
  * GPL LICENSE SUMMARY
  *
- * Copyright(c) 2007 - 2011 Intel Corporation. All rights reserved.
+ * Copyright(c) 2007 - 2012 Intel Corporation. All rights reserved.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of version 2 of the GNU General Public License as
@@ -30,7 +30,7 @@
  *
  * BSD LICENSE
  *
- * Copyright(c) 2005 - 2011 Intel Corporation. All rights reserved.
+ * Copyright(c) 2005 - 2012 Intel Corporation. All rights reserved.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  *****************************************************************************/
+#include <linux/pci.h>
+#include <linux/pci-aspm.h>
 #include <linux/interrupt.h>
 #include <linux/debugfs.h>
+#include <linux/sched.h>
 #include <linux/bitops.h>
 #include <linux/gfp.h>
 
 #include "iwl-shared.h"
 #include "iwl-eeprom.h"
 #include "iwl-agn-hw.h"
+#include "iwl-core.h"
+#include "iwl-ucode.h"
 
 static int iwl_trans_rx_alloc(struct iwl_trans *trans)
 {
        struct iwl_trans_pcie *trans_pcie =
                IWL_TRANS_GET_PCIE_TRANS(trans);
        struct iwl_rx_queue *rxq = &trans_pcie->rxq;
-       struct device *dev = bus(trans)->dev;
+       struct device *dev = trans->dev;
 
        memset(&trans_pcie->rxq, 0, sizeof(trans_pcie->rxq));
 
@@ -122,7 +127,7 @@ static void iwl_trans_rxq_free_rx_bufs(struct iwl_trans *trans)
                /* In the reset function, these buffers may have been allocated
                 * to an SKB, so we need to unmap and free potential storage */
                if (rxq->pool[i].page != NULL) {
-                       dma_unmap_page(bus(trans)->dev, rxq->pool[i].page_dma,
+                       dma_unmap_page(trans->dev, rxq->pool[i].page_dma,
                                PAGE_SIZE << hw_params(trans).rx_page_order,
                                DMA_FROM_DEVICE);
                        __free_pages(rxq->pool[i].page,
@@ -146,17 +151,17 @@ static void iwl_trans_rx_hw_init(struct iwl_trans *trans,
                rb_size = FH_RCSR_RX_CONFIG_REG_VAL_RB_SIZE_4K;
 
        /* Stop Rx DMA */
-       iwl_write_direct32(bus(trans), FH_MEM_RCSR_CHNL0_CONFIG_REG, 0);
+       iwl_write_direct32(trans, FH_MEM_RCSR_CHNL0_CONFIG_REG, 0);
 
        /* Reset driver's Rx queue write index */
-       iwl_write_direct32(bus(trans), FH_RSCSR_CHNL0_RBDCB_WPTR_REG, 0);
+       iwl_write_direct32(trans, FH_RSCSR_CHNL0_RBDCB_WPTR_REG, 0);
 
        /* Tell device where to find RBD circular buffer in DRAM */
-       iwl_write_direct32(bus(trans), FH_RSCSR_CHNL0_RBDCB_BASE_REG,
+       iwl_write_direct32(trans, FH_RSCSR_CHNL0_RBDCB_BASE_REG,
                           (u32)(rxq->bd_dma >> 8));
 
        /* Tell device where in DRAM to update its Rx status */
-       iwl_write_direct32(bus(trans), FH_RSCSR_CHNL0_STTS_WPTR_REG,
+       iwl_write_direct32(trans, FH_RSCSR_CHNL0_STTS_WPTR_REG,
                           rxq->rb_stts_dma >> 4);
 
        /* Enable Rx DMA
@@ -167,7 +172,7 @@ static void iwl_trans_rx_hw_init(struct iwl_trans *trans,
         * RB timeout 0x10
         * 256 RBDs
         */
-       iwl_write_direct32(bus(trans), FH_MEM_RCSR_CHNL0_CONFIG_REG,
+       iwl_write_direct32(trans, FH_MEM_RCSR_CHNL0_CONFIG_REG,
                           FH_RCSR_RX_CONFIG_CHNL_EN_ENABLE_VAL |
                           FH_RCSR_CHNL0_RX_IGNORE_RXF_EMPTY |
                           FH_RCSR_CHNL0_RX_CONFIG_IRQ_DEST_INT_HOST_VAL |
@@ -177,7 +182,7 @@ static void iwl_trans_rx_hw_init(struct iwl_trans *trans,
                           (rfdnlog << FH_RCSR_RX_CONFIG_RBDCB_SIZE_POS));
 
        /* Set interrupt coalescing timer to default (2048 usecs) */
-       iwl_write8(bus(trans), CSR_INT_COALESCING, IWL_HOST_INT_TIMEOUT_DEF);
+       iwl_write8(trans, CSR_INT_COALESCING, IWL_HOST_INT_TIMEOUT_DEF);
 }
 
 static int iwl_rx_init(struct iwl_trans *trans)
@@ -215,10 +220,10 @@ static int iwl_rx_init(struct iwl_trans *trans)
 
        iwl_trans_rx_hw_init(trans, rxq);
 
-       spin_lock_irqsave(&trans->shrd->lock, flags);
+       spin_lock_irqsave(&trans_pcie->irq_lock, flags);
        rxq->need_update = 1;
        iwl_rx_queue_update_write_ptr(trans, rxq);
-       spin_unlock_irqrestore(&trans->shrd->lock, flags);
+       spin_unlock_irqrestore(&trans_pcie->irq_lock, flags);
 
        return 0;
 }
@@ -242,13 +247,13 @@ static void iwl_trans_pcie_rx_free(struct iwl_trans *trans)
        iwl_trans_rxq_free_rx_bufs(trans);
        spin_unlock_irqrestore(&rxq->lock, flags);
 
-       dma_free_coherent(bus(trans)->dev, sizeof(__le32) * RX_QUEUE_SIZE,
+       dma_free_coherent(trans->dev, sizeof(__le32) * RX_QUEUE_SIZE,
                          rxq->bd, rxq->bd_dma);
        memset(&rxq->bd_dma, 0, sizeof(rxq->bd_dma));
        rxq->bd = NULL;
 
        if (rxq->rb_stts)
-               dma_free_coherent(bus(trans)->dev,
+               dma_free_coherent(trans->dev,
                                  sizeof(struct iwl_rb_status),
                                  rxq->rb_stts, rxq->rb_stts_dma);
        else
@@ -261,8 +266,8 @@ static int iwl_trans_rx_stop(struct iwl_trans *trans)
 {
 
        /* stop Rx DMA */
-       iwl_write_direct32(bus(trans), FH_MEM_RCSR_CHNL0_CONFIG_REG, 0);
-       return iwl_poll_direct_bit(bus(trans), FH_MEM_RSSR_RX_STATUS_REG,
+       iwl_write_direct32(trans, FH_MEM_RCSR_CHNL0_CONFIG_REG, 0);
+       return iwl_poll_direct_bit(trans, FH_MEM_RSSR_RX_STATUS_REG,
                            FH_RSSR_CHNL0_RX_STATUS_CHNL_IDLE, 1000);
 }
 
@@ -272,7 +277,7 @@ static inline int iwlagn_alloc_dma_ptr(struct iwl_trans *trans,
        if (WARN_ON(ptr->addr))
                return -EINVAL;
 
-       ptr->addr = dma_alloc_coherent(bus(trans)->dev, size,
+       ptr->addr = dma_alloc_coherent(trans->dev, size,
                                       &ptr->dma, GFP_KERNEL);
        if (!ptr->addr)
                return -ENOMEM;
@@ -286,7 +291,7 @@ static inline void iwlagn_free_dma_ptr(struct iwl_trans *trans,
        if (unlikely(!ptr->addr))
                return;
 
-       dma_free_coherent(bus(trans)->dev, ptr->size, ptr->addr, ptr->dma);
+       dma_free_coherent(trans->dev, ptr->size, ptr->addr, ptr->dma);
        memset(ptr, 0, sizeof(*ptr));
 }
 
@@ -333,7 +338,7 @@ static int iwl_trans_txq_alloc(struct iwl_trans *trans,
 
        /* Circular buffer of transmit frame descriptors (TFDs),
         * shared with device */
-       txq->tfds = dma_alloc_coherent(bus(trans)->dev, tfd_sz,
+       txq->tfds = dma_alloc_coherent(trans->dev, tfd_sz,
                                       &txq->q.dma_addr, GFP_KERNEL);
        if (!txq->tfds) {
                IWL_ERR(trans, "dma_alloc_coherent(%zd) failed\n", tfd_sz);
@@ -389,7 +394,7 @@ static int iwl_trans_txq_init(struct iwl_trans *trans, struct iwl_tx_queue *txq,
         * Tell nic where to find circular buffer of Tx Frame Descriptors for
         * given Tx queue, and enable the DMA channel used for that queue.
         * Circular buffer (TFD queue in DRAM) physical base address */
-       iwl_write_direct32(bus(trans), FH_MEM_CBBC_QUEUE(txq_id),
+       iwl_write_direct32(trans, FH_MEM_CBBC_QUEUE(txq_id),
                             txq->q.dma_addr >> 8);
 
        return 0;
@@ -443,7 +448,7 @@ static void iwl_tx_queue_free(struct iwl_trans *trans, int txq_id)
 {
        struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
        struct iwl_tx_queue *txq = &trans_pcie->txq[txq_id];
-       struct device *dev = bus(trans)->dev;
+       struct device *dev = trans->dev;
        int i;
        if (WARN_ON(!txq))
                return;
@@ -581,16 +586,16 @@ static int iwl_tx_init(struct iwl_trans *trans)
                alloc = true;
        }
 
-       spin_lock_irqsave(&trans->shrd->lock, flags);
+       spin_lock_irqsave(&trans_pcie->irq_lock, flags);
 
        /* Turn off all Tx DMA fifos */
-       iwl_write_prph(bus(trans), SCD_TXFACT, 0);
+       iwl_write_prph(trans, SCD_TXFACT, 0);
 
        /* Tell NIC where to find the "keep warm" buffer */
-       iwl_write_direct32(bus(trans), FH_KW_MEM_ADDR_REG,
+       iwl_write_direct32(trans, FH_KW_MEM_ADDR_REG,
                           trans_pcie->kw.dma >> 4);
 
-       spin_unlock_irqrestore(&trans->shrd->lock, flags);
+       spin_unlock_irqrestore(&trans_pcie->irq_lock, flags);
 
        /* Alloc and init all Tx queues, including the command queue (#4/#9) */
        for (txq_id = 0; txq_id < hw_params(trans).max_txq_num; txq_id++) {
@@ -619,36 +624,207 @@ static void iwl_set_pwr_vmain(struct iwl_trans *trans)
  * to set power to V_AUX, do:
 
                if (pci_pme_capable(priv->pci_dev, PCI_D3cold))
-                       iwl_set_bits_mask_prph(bus(trans), APMG_PS_CTRL_REG,
+                       iwl_set_bits_mask_prph(trans, APMG_PS_CTRL_REG,
                                               APMG_PS_CTRL_VAL_PWR_SRC_VAUX,
                                               ~APMG_PS_CTRL_MSK_PWR_SRC);
  */
 
-       iwl_set_bits_mask_prph(bus(trans), APMG_PS_CTRL_REG,
+       iwl_set_bits_mask_prph(trans, APMG_PS_CTRL_REG,
                               APMG_PS_CTRL_VAL_PWR_SRC_VMAIN,
                               ~APMG_PS_CTRL_MSK_PWR_SRC);
 }
 
+/* PCI registers */
+#define PCI_CFG_RETRY_TIMEOUT  0x041
+#define PCI_CFG_LINK_CTRL_VAL_L0S_EN   0x01
+#define PCI_CFG_LINK_CTRL_VAL_L1_EN    0x02
+
+static u16 iwl_pciexp_link_ctrl(struct iwl_trans *trans)
+{
+       int pos;
+       u16 pci_lnk_ctl;
+       struct iwl_trans_pcie *trans_pcie =
+               IWL_TRANS_GET_PCIE_TRANS(trans);
+
+       struct pci_dev *pci_dev = trans_pcie->pci_dev;
+
+       pos = pci_pcie_cap(pci_dev);
+       pci_read_config_word(pci_dev, pos + PCI_EXP_LNKCTL, &pci_lnk_ctl);
+       return pci_lnk_ctl;
+}
+
+static void iwl_apm_config(struct iwl_trans *trans)
+{
+       /*
+        * HW bug W/A for instability in PCIe bus L0S->L1 transition.
+        * Check if BIOS (or OS) enabled L1-ASPM on this device.
+        * If so (likely), disable L0S, so device moves directly L0->L1;
+        *    costs negligible amount of power savings.
+        * If not (unlikely), enable L0S, so there is at least some
+        *    power savings, even without L1.
+        */
+       u16 lctl = iwl_pciexp_link_ctrl(trans);
+
+       if ((lctl & PCI_CFG_LINK_CTRL_VAL_L1_EN) ==
+                               PCI_CFG_LINK_CTRL_VAL_L1_EN) {
+               /* L1-ASPM enabled; disable(!) L0S */
+               iwl_set_bit(trans, CSR_GIO_REG, CSR_GIO_REG_VAL_L0S_ENABLED);
+               dev_printk(KERN_INFO, trans->dev,
+                          "L1 Enabled; Disabling L0S\n");
+       } else {
+               /* L1-ASPM disabled; enable(!) L0S */
+               iwl_clear_bit(trans, CSR_GIO_REG, CSR_GIO_REG_VAL_L0S_ENABLED);
+               dev_printk(KERN_INFO, trans->dev,
+                          "L1 Disabled; Enabling L0S\n");
+       }
+       trans->pm_support = !(lctl & PCI_CFG_LINK_CTRL_VAL_L0S_EN);
+}
+
+/*
+ * Start up NIC's basic functionality after it has been reset
+ * (e.g. after platform boot, or shutdown via iwl_apm_stop())
+ * NOTE:  This does not load uCode nor start the embedded processor
+ */
+static int iwl_apm_init(struct iwl_trans *trans)
+{
+       int ret = 0;
+       IWL_DEBUG_INFO(trans, "Init card's basic functions\n");
+
+       /*
+        * Use "set_bit" below rather than "write", to preserve any hardware
+        * bits already set by default after reset.
+        */
+
+       /* Disable L0S exit timer (platform NMI Work/Around) */
+       iwl_set_bit(trans, CSR_GIO_CHICKEN_BITS,
+                         CSR_GIO_CHICKEN_BITS_REG_BIT_DIS_L0S_EXIT_TIMER);
+
+       /*
+        * Disable L0s without affecting L1;
+        *  don't wait for ICH L0s (ICH bug W/A)
+        */
+       iwl_set_bit(trans, CSR_GIO_CHICKEN_BITS,
+                         CSR_GIO_CHICKEN_BITS_REG_BIT_L1A_NO_L0S_RX);
+
+       /* Set FH wait threshold to maximum (HW error during stress W/A) */
+       iwl_set_bit(trans, CSR_DBG_HPET_MEM_REG, CSR_DBG_HPET_MEM_REG_VAL);
+
+       /*
+        * Enable HAP INTA (interrupt from management bus) to
+        * wake device's PCI Express link L1a -> L0s
+        */
+       iwl_set_bit(trans, CSR_HW_IF_CONFIG_REG,
+                                   CSR_HW_IF_CONFIG_REG_BIT_HAP_WAKE_L1A);
+
+       iwl_apm_config(trans);
+
+       /* Configure analog phase-lock-loop before activating to D0A */
+       if (cfg(trans)->base_params->pll_cfg_val)
+               iwl_set_bit(trans, CSR_ANA_PLL_CFG,
+                           cfg(trans)->base_params->pll_cfg_val);
+
+       /*
+        * Set "initialization complete" bit to move adapter from
+        * D0U* --> D0A* (powered-up active) state.
+        */
+       iwl_set_bit(trans, CSR_GP_CNTRL, CSR_GP_CNTRL_REG_FLAG_INIT_DONE);
+
+       /*
+        * Wait for clock stabilization; once stabilized, access to
+        * device-internal resources is supported, e.g. iwl_write_prph()
+        * and accesses to uCode SRAM.
+        */
+       ret = iwl_poll_bit(trans, CSR_GP_CNTRL,
+                       CSR_GP_CNTRL_REG_FLAG_MAC_CLOCK_READY,
+                       CSR_GP_CNTRL_REG_FLAG_MAC_CLOCK_READY, 25000);
+       if (ret < 0) {
+               IWL_DEBUG_INFO(trans, "Failed to init the card\n");
+               goto out;
+       }
+
+       /*
+        * Enable DMA clock and wait for it to stabilize.
+        *
+        * Write to "CLK_EN_REG"; "1" bits enable clocks, while "0" bits
+        * do not disable clocks.  This preserves any hardware bits already
+        * set by default in "CLK_CTRL_REG" after reset.
+        */
+       iwl_write_prph(trans, APMG_CLK_EN_REG, APMG_CLK_VAL_DMA_CLK_RQT);
+       udelay(20);
+
+       /* Disable L1-Active */
+       iwl_set_bits_prph(trans, APMG_PCIDEV_STT_REG,
+                         APMG_PCIDEV_STT_VAL_L1_ACT_DIS);
+
+       set_bit(STATUS_DEVICE_ENABLED, &trans->shrd->status);
+
+out:
+       return ret;
+}
+
+static int iwl_apm_stop_master(struct iwl_trans *trans)
+{
+       int ret = 0;
+
+       /* stop device's busmaster DMA activity */
+       iwl_set_bit(trans, CSR_RESET, CSR_RESET_REG_FLAG_STOP_MASTER);
+
+       ret = iwl_poll_bit(trans, CSR_RESET,
+                       CSR_RESET_REG_FLAG_MASTER_DISABLED,
+                       CSR_RESET_REG_FLAG_MASTER_DISABLED, 100);
+       if (ret)
+               IWL_WARN(trans, "Master Disable Timed Out, 100 usec\n");
+
+       IWL_DEBUG_INFO(trans, "stop master\n");
+
+       return ret;
+}
+
+static void iwl_apm_stop(struct iwl_trans *trans)
+{
+       IWL_DEBUG_INFO(trans, "Stop card, put in low power state\n");
+
+       clear_bit(STATUS_DEVICE_ENABLED, &trans->shrd->status);
+
+       /* Stop device's DMA activity */
+       iwl_apm_stop_master(trans);
+
+       /* Reset the entire device */
+       iwl_set_bit(trans, CSR_RESET, CSR_RESET_REG_FLAG_SW_RESET);
+
+       udelay(10);
+
+       /*
+        * Clear "initialization complete" bit to move adapter from
+        * D0A* (powered-up Active) --> D0U* (Uninitialized) state.
+        */
+       iwl_clear_bit(trans, CSR_GP_CNTRL,
+                     CSR_GP_CNTRL_REG_FLAG_INIT_DONE);
+}
+
 static int iwl_nic_init(struct iwl_trans *trans)
 {
+       struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
        unsigned long flags;
 
        /* nic_init */
-       spin_lock_irqsave(&trans->shrd->lock, flags);
-       iwl_apm_init(priv(trans));
+       spin_lock_irqsave(&trans_pcie->irq_lock, flags);
+       iwl_apm_init(trans);
 
        /* Set interrupt coalescing calibration timer to default (512 usecs) */
-       iwl_write8(bus(trans), CSR_INT_COALESCING,
+       iwl_write8(trans, CSR_INT_COALESCING,
                IWL_HOST_INT_CALIB_TIMEOUT_DEF);
 
-       spin_unlock_irqrestore(&trans->shrd->lock, flags);
+       spin_unlock_irqrestore(&trans_pcie->irq_lock, flags);
 
        iwl_set_pwr_vmain(trans);
 
        iwl_nic_config(priv(trans));
 
+#ifndef CONFIG_IWLWIFI_IDI
        /* Allocate the RX queue, or reset if it is already allocated */
        iwl_rx_init(trans);
+#endif
 
        /* Allocate or reset and init all Tx and Command queues */
        if (iwl_tx_init(trans))
@@ -656,7 +832,7 @@ static int iwl_nic_init(struct iwl_trans *trans)
 
        if (hw_params(trans).shadow_reg_enable) {
                /* enable shadow regs in HW */
-               iwl_set_bit(bus(trans), CSR_MAC_SHADOW_REG_CTRL,
+               iwl_set_bit(trans, CSR_MAC_SHADOW_REG_CTRL,
                        0x800FFFFF);
        }
 
@@ -672,11 +848,11 @@ static int iwl_set_hw_ready(struct iwl_trans *trans)
 {
        int ret;
 
-       iwl_set_bit(bus(trans), CSR_HW_IF_CONFIG_REG,
+       iwl_set_bit(trans, CSR_HW_IF_CONFIG_REG,
                CSR_HW_IF_CONFIG_REG_BIT_NIC_READY);
 
        /* See if we got it */
-       ret = iwl_poll_bit(bus(trans), CSR_HW_IF_CONFIG_REG,
+       ret = iwl_poll_bit(trans, CSR_HW_IF_CONFIG_REG,
                                CSR_HW_IF_CONFIG_REG_BIT_NIC_READY,
                                CSR_HW_IF_CONFIG_REG_BIT_NIC_READY,
                                HW_READY_TIMEOUT);
@@ -686,21 +862,22 @@ static int iwl_set_hw_ready(struct iwl_trans *trans)
 }
 
 /* Note: returns standard 0/-ERROR code */
-static int iwl_trans_pcie_prepare_card_hw(struct iwl_trans *trans)
+static int iwl_prepare_card_hw(struct iwl_trans *trans)
 {
        int ret;
 
        IWL_DEBUG_INFO(trans, "iwl_trans_prepare_card_hw enter\n");
 
        ret = iwl_set_hw_ready(trans);
+       /* If the card is ready, exit 0 */
        if (ret >= 0)
                return 0;
 
        /* If HW is not ready, prepare the conditions to check again */
-       iwl_set_bit(bus(trans), CSR_HW_IF_CONFIG_REG,
+       iwl_set_bit(trans, CSR_HW_IF_CONFIG_REG,
                        CSR_HW_IF_CONFIG_REG_PREPARE);
 
-       ret = iwl_poll_bit(bus(trans), CSR_HW_IF_CONFIG_REG,
+       ret = iwl_poll_bit(trans, CSR_HW_IF_CONFIG_REG,
                        ~CSR_HW_IF_CONFIG_REG_BIT_NIC_PREPARE_DONE,
                        CSR_HW_IF_CONFIG_REG_BIT_NIC_PREPARE_DONE, 150000);
 
@@ -767,7 +944,79 @@ static const u8 iwlagn_pan_ac_to_queue[] = {
        7, 6, 5, 4,
 };
 
-static int iwl_trans_pcie_start_device(struct iwl_trans *trans)
+/*
+ * ucode
+ */
+static int iwl_load_section(struct iwl_trans *trans, const char *name,
+                               struct fw_desc *image, u32 dst_addr)
+{
+       dma_addr_t phy_addr = image->p_addr;
+       u32 byte_cnt = image->len;
+       int ret;
+
+       trans->ucode_write_complete = 0;
+
+       iwl_write_direct32(trans,
+               FH_TCSR_CHNL_TX_CONFIG_REG(FH_SRVC_CHNL),
+               FH_TCSR_TX_CONFIG_REG_VAL_DMA_CHNL_PAUSE);
+
+       iwl_write_direct32(trans,
+               FH_SRVC_CHNL_SRAM_ADDR_REG(FH_SRVC_CHNL), dst_addr);
+
+       iwl_write_direct32(trans,
+               FH_TFDIB_CTRL0_REG(FH_SRVC_CHNL),
+               phy_addr & FH_MEM_TFDIB_DRAM_ADDR_LSB_MSK);
+
+       iwl_write_direct32(trans,
+               FH_TFDIB_CTRL1_REG(FH_SRVC_CHNL),
+               (iwl_get_dma_hi_addr(phy_addr)
+                       << FH_MEM_TFDIB_REG1_ADDR_BITSHIFT) | byte_cnt);
+
+       iwl_write_direct32(trans,
+               FH_TCSR_CHNL_TX_BUF_STS_REG(FH_SRVC_CHNL),
+               1 << FH_TCSR_CHNL_TX_BUF_STS_REG_POS_TB_NUM |
+               1 << FH_TCSR_CHNL_TX_BUF_STS_REG_POS_TB_IDX |
+               FH_TCSR_CHNL_TX_BUF_STS_REG_VAL_TFDB_VALID);
+
+       iwl_write_direct32(trans,
+               FH_TCSR_CHNL_TX_CONFIG_REG(FH_SRVC_CHNL),
+               FH_TCSR_TX_CONFIG_REG_VAL_DMA_CHNL_ENABLE       |
+               FH_TCSR_TX_CONFIG_REG_VAL_DMA_CREDIT_DISABLE    |
+               FH_TCSR_TX_CONFIG_REG_VAL_CIRQ_HOST_ENDTFD);
+
+       IWL_DEBUG_FW(trans, "%s uCode section being loaded...\n", name);
+       ret = wait_event_timeout(trans->shrd->wait_command_queue,
+                                trans->ucode_write_complete, 5 * HZ);
+       if (!ret) {
+               IWL_ERR(trans, "Could not load the %s uCode section\n",
+                       name);
+               return -ETIMEDOUT;
+       }
+
+       return 0;
+}
+
+static int iwl_load_given_ucode(struct iwl_trans *trans, struct fw_img *image)
+{
+       int ret = 0;
+
+       ret = iwl_load_section(trans, "INST", &image->code,
+                                  IWLAGN_RTC_INST_LOWER_BOUND);
+       if (ret)
+               return ret;
+
+       ret = iwl_load_section(trans, "DATA", &image->data,
+                                   IWLAGN_RTC_DATA_LOWER_BOUND);
+       if (ret)
+               return ret;
+
+       /* Remove all resets to allow NIC to operate */
+       iwl_write32(trans, CSR_RESET, 0);
+
+       return 0;
+}
+
+static int iwl_trans_pcie_start_fw(struct iwl_trans *trans, struct fw_img *fw)
 {
        int ret;
        struct iwl_trans_pcie *trans_pcie =
@@ -784,25 +1033,25 @@ static int iwl_trans_pcie_start_device(struct iwl_trans *trans)
        trans_pcie->mcast_queue[IWL_RXON_CTX_PAN] = IWL_IPAN_MCAST_QUEUE;
 
        if ((hw_params(trans).sku & EEPROM_SKU_CAP_AMT_ENABLE) &&
-            iwl_trans_pcie_prepare_card_hw(trans)) {
+            iwl_prepare_card_hw(trans)) {
                IWL_WARN(trans, "Exit HW not ready\n");
                return -EIO;
        }
 
        /* If platform's RF_KILL switch is NOT set to KILL */
-       if (iwl_read32(bus(trans), CSR_GP_CNTRL) &
+       if (iwl_read32(trans, CSR_GP_CNTRL) &
                        CSR_GP_CNTRL_REG_FLAG_HW_RF_KILL_SW)
                clear_bit(STATUS_RF_KILL_HW, &trans->shrd->status);
        else
                set_bit(STATUS_RF_KILL_HW, &trans->shrd->status);
 
        if (iwl_is_rfkill(trans->shrd)) {
-               iwl_set_hw_rfkill_state(priv(trans), true);
+               iwl_op_mode_hw_rf_kill(trans->op_mode, true);
                iwl_enable_interrupts(trans);
                return -ERFKILL;
        }
 
-       iwl_write32(bus(trans), CSR_INT, 0xFFFFFFFF);
+       iwl_write32(trans, CSR_INT, 0xFFFFFFFF);
 
        ret = iwl_nic_init(trans);
        if (ret) {
@@ -811,31 +1060,39 @@ static int iwl_trans_pcie_start_device(struct iwl_trans *trans)
        }
 
        /* make sure rfkill handshake bits are cleared */
-       iwl_write32(bus(trans), CSR_UCODE_DRV_GP1_CLR, CSR_UCODE_SW_BIT_RFKILL);
-       iwl_write32(bus(trans), CSR_UCODE_DRV_GP1_CLR,
+       iwl_write32(trans, CSR_UCODE_DRV_GP1_CLR, CSR_UCODE_SW_BIT_RFKILL);
+       iwl_write32(trans, CSR_UCODE_DRV_GP1_CLR,
                    CSR_UCODE_DRV_GP1_BIT_CMD_BLOCKED);
 
        /* clear (again), then enable host interrupts */
-       iwl_write32(bus(trans), CSR_INT, 0xFFFFFFFF);
+       iwl_write32(trans, CSR_INT, 0xFFFFFFFF);
        iwl_enable_interrupts(trans);
 
        /* really make sure rfkill handshake bits are cleared */
-       iwl_write32(bus(trans), CSR_UCODE_DRV_GP1_CLR, CSR_UCODE_SW_BIT_RFKILL);
-       iwl_write32(bus(trans), CSR_UCODE_DRV_GP1_CLR, CSR_UCODE_SW_BIT_RFKILL);
+       iwl_write32(trans, CSR_UCODE_DRV_GP1_CLR, CSR_UCODE_SW_BIT_RFKILL);
+       iwl_write32(trans, CSR_UCODE_DRV_GP1_CLR, CSR_UCODE_SW_BIT_RFKILL);
+
+       /* Load the given image to the HW */
+       iwl_load_given_ucode(trans, fw);
 
        return 0;
 }
 
 /*
  * Activate/Deactivate Tx DMA/FIFO channels according tx fifos mask
- * must be called under priv->shrd->lock and mac access
+ * must be called under the irq lock and with MAC access
  */
 static void iwl_trans_txq_set_sched(struct iwl_trans *trans, u32 mask)
 {
-       iwl_write_prph(bus(trans), SCD_TXFACT, mask);
+       struct iwl_trans_pcie __maybe_unused *trans_pcie =
+               IWL_TRANS_GET_PCIE_TRANS(trans);
+
+       lockdep_assert_held(&trans_pcie->irq_lock);
+
+       iwl_write_prph(trans, SCD_TXFACT, mask);
 }
 
-static void iwl_trans_pcie_tx_start(struct iwl_trans *trans)
+static void iwl_tx_start(struct iwl_trans *trans)
 {
        const struct queue_to_fifo_ac *queue_to_fifo;
        struct iwl_trans_pcie *trans_pcie =
@@ -845,49 +1102,49 @@ static void iwl_trans_pcie_tx_start(struct iwl_trans *trans)
        int i, chan;
        u32 reg_val;
 
-       spin_lock_irqsave(&trans->shrd->lock, flags);
+       spin_lock_irqsave(&trans_pcie->irq_lock, flags);
 
        trans_pcie->scd_base_addr =
-               iwl_read_prph(bus(trans), SCD_SRAM_BASE_ADDR);
+               iwl_read_prph(trans, SCD_SRAM_BASE_ADDR);
        a = trans_pcie->scd_base_addr + SCD_CONTEXT_MEM_LOWER_BOUND;
        /* reset conext data memory */
        for (; a < trans_pcie->scd_base_addr + SCD_CONTEXT_MEM_UPPER_BOUND;
                a += 4)
-               iwl_write_targ_mem(bus(trans), a, 0);
+               iwl_write_targ_mem(trans, a, 0);
        /* reset tx status memory */
        for (; a < trans_pcie->scd_base_addr + SCD_TX_STTS_MEM_UPPER_BOUND;
                a += 4)
-               iwl_write_targ_mem(bus(trans), a, 0);
+               iwl_write_targ_mem(trans, a, 0);
        for (; a < trans_pcie->scd_base_addr +
               SCD_TRANS_TBL_OFFSET_QUEUE(hw_params(trans).max_txq_num);
               a += 4)
-               iwl_write_targ_mem(bus(trans), a, 0);
+               iwl_write_targ_mem(trans, a, 0);
 
-       iwl_write_prph(bus(trans), SCD_DRAM_BASE_ADDR,
+       iwl_write_prph(trans, SCD_DRAM_BASE_ADDR,
                       trans_pcie->scd_bc_tbls.dma >> 10);
 
        /* Enable DMA channel */
        for (chan = 0; chan < FH_TCSR_CHNL_NUM ; chan++)
-               iwl_write_direct32(bus(trans), FH_TCSR_CHNL_TX_CONFIG_REG(chan),
+               iwl_write_direct32(trans, FH_TCSR_CHNL_TX_CONFIG_REG(chan),
                                FH_TCSR_TX_CONFIG_REG_VAL_DMA_CHNL_ENABLE |
                                FH_TCSR_TX_CONFIG_REG_VAL_DMA_CREDIT_ENABLE);
 
        /* Update FH chicken bits */
-       reg_val = iwl_read_direct32(bus(trans), FH_TX_CHICKEN_BITS_REG);
-       iwl_write_direct32(bus(trans), FH_TX_CHICKEN_BITS_REG,
+       reg_val = iwl_read_direct32(trans, FH_TX_CHICKEN_BITS_REG);
+       iwl_write_direct32(trans, FH_TX_CHICKEN_BITS_REG,
                           reg_val | FH_TX_CHICKEN_BITS_SCD_AUTO_RETRY_EN);
 
-       iwl_write_prph(bus(trans), SCD_QUEUECHAIN_SEL,
+       iwl_write_prph(trans, SCD_QUEUECHAIN_SEL,
                SCD_QUEUECHAIN_SEL_ALL(trans));
-       iwl_write_prph(bus(trans), SCD_AGGR_SEL, 0);
+       iwl_write_prph(trans, SCD_AGGR_SEL, 0);
 
        /* initiate the queues */
        for (i = 0; i < hw_params(trans).max_txq_num; i++) {
-               iwl_write_prph(bus(trans), SCD_QUEUE_RDPTR(i), 0);
-               iwl_write_direct32(bus(trans), HBUS_TARG_WRPTR, 0 | (i << 8));
-               iwl_write_targ_mem(bus(trans), trans_pcie->scd_base_addr +
+               iwl_write_prph(trans, SCD_QUEUE_RDPTR(i), 0);
+               iwl_write_direct32(trans, HBUS_TARG_WRPTR, 0 | (i << 8));
+               iwl_write_targ_mem(trans, trans_pcie->scd_base_addr +
                                SCD_CONTEXT_QUEUE_OFFSET(i), 0);
-               iwl_write_targ_mem(bus(trans), trans_pcie->scd_base_addr +
+               iwl_write_targ_mem(trans, trans_pcie->scd_base_addr +
                                SCD_CONTEXT_QUEUE_OFFSET(i) +
                                sizeof(u32),
                                ((SCD_WIN_SIZE <<
@@ -898,7 +1155,7 @@ static void iwl_trans_pcie_tx_start(struct iwl_trans *trans)
                                SCD_QUEUE_CTX_REG2_FRAME_LIMIT_MSK));
        }
 
-       iwl_write_prph(bus(trans), SCD_INTERRUPT_MASK,
+       iwl_write_prph(trans, SCD_INTERRUPT_MASK,
                        IWL_MASK(0, hw_params(trans).max_txq_num));
 
        /* Activate all Tx DMA/FIFO channels */
@@ -941,13 +1198,19 @@ static void iwl_trans_pcie_tx_start(struct iwl_trans *trans)
                                              fifo, 0);
        }
 
-       spin_unlock_irqrestore(&trans->shrd->lock, flags);
+       spin_unlock_irqrestore(&trans_pcie->irq_lock, flags);
 
        /* Enable L1-Active */
-       iwl_clear_bits_prph(bus(trans), APMG_PCIDEV_STT_REG,
+       iwl_clear_bits_prph(trans, APMG_PCIDEV_STT_REG,
                          APMG_PCIDEV_STT_VAL_L1_ACT_DIS);
 }
 
+static void iwl_trans_pcie_fw_alive(struct iwl_trans *trans)
+{
+       iwl_reset_ict(trans);
+       iwl_tx_start(trans);
+}
+
 /**
  * iwlagn_txq_ctx_stop - Stop all Tx DMA channels
  */
@@ -958,23 +1221,23 @@ static int iwl_trans_tx_stop(struct iwl_trans *trans)
        struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
 
        /* Turn off all Tx DMA fifos */
-       spin_lock_irqsave(&trans->shrd->lock, flags);
+       spin_lock_irqsave(&trans_pcie->irq_lock, flags);
 
        iwl_trans_txq_set_sched(trans, 0);
 
        /* Stop each Tx DMA channel, and wait for it to be idle */
        for (ch = 0; ch < FH_TCSR_CHNL_NUM; ch++) {
-               iwl_write_direct32(bus(trans),
+               iwl_write_direct32(trans,
                                   FH_TCSR_CHNL_TX_CONFIG_REG(ch), 0x0);
-               if (iwl_poll_direct_bit(bus(trans), FH_TSSR_TX_STATUS_REG,
+               if (iwl_poll_direct_bit(trans, FH_TSSR_TX_STATUS_REG,
                                    FH_TSSR_TX_STATUS_REG_MSK_CHNL_IDLE(ch),
                                    1000))
                        IWL_ERR(trans, "Failing on timeout while stopping"
                            " DMA channel %d [0x%08x]", ch,
-                           iwl_read_direct32(bus(trans),
+                           iwl_read_direct32(trans,
                                              FH_TSSR_TX_STATUS_REG));
        }
-       spin_unlock_irqrestore(&trans->shrd->lock, flags);
+       spin_unlock_irqrestore(&trans_pcie->irq_lock, flags);
 
        if (!trans_pcie->txq) {
                IWL_WARN(trans, "Stopping tx queues that aren't allocated...");
@@ -994,9 +1257,9 @@ static void iwl_trans_pcie_stop_device(struct iwl_trans *trans)
        struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
 
        /* tell the device to stop sending interrupts */
-       spin_lock_irqsave(&trans->shrd->lock, flags);
+       spin_lock_irqsave(&trans_pcie->irq_lock, flags);
        iwl_disable_interrupts(trans);
-       spin_unlock_irqrestore(&trans->shrd->lock, flags);
+       spin_unlock_irqrestore(&trans_pcie->irq_lock, flags);
 
        /* device going down, Stop using ICT table */
        iwl_disable_ict(trans);
@@ -1010,34 +1273,37 @@ static void iwl_trans_pcie_stop_device(struct iwl_trans *trans)
         */
        if (test_bit(STATUS_DEVICE_ENABLED, &trans->shrd->status)) {
                iwl_trans_tx_stop(trans);
+#ifndef CONFIG_IWLWIFI_IDI
                iwl_trans_rx_stop(trans);
-
+#endif
                /* Power-down device's busmaster DMA clocks */
-               iwl_write_prph(bus(trans), APMG_CLK_DIS_REG,
+               iwl_write_prph(trans, APMG_CLK_DIS_REG,
                               APMG_CLK_VAL_DMA_CLK_RQT);
                udelay(5);
        }
 
        /* Make sure (redundant) we've released our request to stay awake */
-       iwl_clear_bit(bus(trans), CSR_GP_CNTRL,
+       iwl_clear_bit(trans, CSR_GP_CNTRL,
                        CSR_GP_CNTRL_REG_FLAG_MAC_ACCESS_REQ);
 
        /* Stop the device, and put it in low power state */
-       iwl_apm_stop(priv(trans));
+       iwl_apm_stop(trans);
 
        /* Upon stop, the APM issues an interrupt if HW RF kill is set.
         * Clean again the interrupt here
         */
-       spin_lock_irqsave(&trans->shrd->lock, flags);
+       spin_lock_irqsave(&trans_pcie->irq_lock, flags);
        iwl_disable_interrupts(trans);
-       spin_unlock_irqrestore(&trans->shrd->lock, flags);
+       spin_unlock_irqrestore(&trans_pcie->irq_lock, flags);
 
        /* wait to make sure we flush pending tasklet*/
-       synchronize_irq(bus(trans)->irq);
+       synchronize_irq(trans->irq);
        tasklet_kill(&trans_pcie->irq_tasklet);
 
+       cancel_work_sync(&trans_pcie->rx_replenish);
+
        /* stop and reset the on-board processor */
-       iwl_write32(bus(trans), CSR_RESET, CSR_RESET_REG_FLAG_NEVO_RESET);
+       iwl_write32(trans, CSR_RESET, CSR_RESET_REG_FLAG_NEVO_RESET);
 }
 
 static int iwl_trans_pcie_tx(struct iwl_trans *trans, struct sk_buff *skb,
@@ -1134,10 +1400,10 @@ static int iwl_trans_pcie_tx(struct iwl_trans *trans, struct sk_buff *skb,
 
        /* Physical address of this Tx command's header (not MAC header!),
         * within command buffer array. */
-       txcmd_phys = dma_map_single(bus(trans)->dev,
+       txcmd_phys = dma_map_single(trans->dev,
                                    &dev_cmd->hdr, firstlen,
                                    DMA_BIDIRECTIONAL);
-       if (unlikely(dma_mapping_error(bus(trans)->dev, txcmd_phys)))
+       if (unlikely(dma_mapping_error(trans->dev, txcmd_phys)))
                return -1;
        dma_unmap_addr_set(out_meta, mapping, txcmd_phys);
        dma_unmap_len_set(out_meta, len, firstlen);
@@ -1153,10 +1419,10 @@ static int iwl_trans_pcie_tx(struct iwl_trans *trans, struct sk_buff *skb,
         * if any (802.11 null frames have no payload). */
        secondlen = skb->len - hdr_len;
        if (secondlen > 0) {
-               phys_addr = dma_map_single(bus(trans)->dev, skb->data + hdr_len,
+               phys_addr = dma_map_single(trans->dev, skb->data + hdr_len,
                                           secondlen, DMA_TO_DEVICE);
-               if (unlikely(dma_mapping_error(bus(trans)->dev, phys_addr))) {
-                       dma_unmap_single(bus(trans)->dev,
+               if (unlikely(dma_mapping_error(trans->dev, phys_addr))) {
+                       dma_unmap_single(trans->dev,
                                         dma_unmap_addr(out_meta, mapping),
                                         dma_unmap_len(out_meta, len),
                                         DMA_BIDIRECTIONAL);
@@ -1174,7 +1440,7 @@ static int iwl_trans_pcie_tx(struct iwl_trans *trans, struct sk_buff *skb,
                                offsetof(struct iwl_tx_cmd, scratch);
 
        /* take back ownership of DMA buffer to enable update */
-       dma_sync_single_for_cpu(bus(trans)->dev, txcmd_phys, firstlen,
+       dma_sync_single_for_cpu(trans->dev, txcmd_phys, firstlen,
                        DMA_BIDIRECTIONAL);
        tx_cmd->dram_lsb_ptr = cpu_to_le32(scratch_phys);
        tx_cmd->dram_msb_ptr = iwl_get_dma_hi_addr(scratch_phys);
@@ -1188,7 +1454,7 @@ static int iwl_trans_pcie_tx(struct iwl_trans *trans, struct sk_buff *skb,
        /* Set up entry for this TFD in Tx byte-count array */
        iwl_trans_txq_update_byte_cnt_tbl(trans, txq, le16_to_cpu(tx_cmd->len));
 
-       dma_sync_single_for_device(bus(trans)->dev, txcmd_phys, firstlen,
+       dma_sync_single_for_device(trans->dev, txcmd_phys, firstlen,
                        DMA_BIDIRECTIONAL);
 
        trace_iwlwifi_dev_tx(priv(trans),
@@ -1218,13 +1484,7 @@ static int iwl_trans_pcie_tx(struct iwl_trans *trans, struct sk_buff *skb,
        return 0;
 }
 
-static void iwl_trans_pcie_kick_nic(struct iwl_trans *trans)
-{
-       /* Remove all resets to allow NIC to operate */
-       iwl_write32(bus(trans), CSR_RESET, 0);
-}
-
-static int iwl_trans_pcie_request_irq(struct iwl_trans *trans)
+static int iwl_trans_pcie_start_hw(struct iwl_trans *trans)
 {
        struct iwl_trans_pcie *trans_pcie =
                IWL_TRANS_GET_PCIE_TRANS(trans);
@@ -1232,21 +1492,62 @@ static int iwl_trans_pcie_request_irq(struct iwl_trans *trans)
 
        trans_pcie->inta_mask = CSR_INI_SET_MASK;
 
-       tasklet_init(&trans_pcie->irq_tasklet, (void (*)(unsigned long))
-               iwl_irq_tasklet, (unsigned long)trans);
+       if (!trans_pcie->irq_requested) {
+               tasklet_init(&trans_pcie->irq_tasklet, (void (*)(unsigned long))
+                       iwl_irq_tasklet, (unsigned long)trans);
 
-       iwl_alloc_isr_ict(trans);
+               iwl_alloc_isr_ict(trans);
 
-       err = request_irq(bus(trans)->irq, iwl_isr_ict, IRQF_SHARED,
-               DRV_NAME, trans);
+               err = request_irq(trans->irq, iwl_isr_ict, IRQF_SHARED,
+                       DRV_NAME, trans);
+               if (err) {
+                       IWL_ERR(trans, "Error allocating IRQ %d\n",
+                               trans->irq);
+                       goto error;
+               }
+
+               INIT_WORK(&trans_pcie->rx_replenish, iwl_bg_rx_replenish);
+               trans_pcie->irq_requested = true;
+       }
+
+       err = iwl_prepare_card_hw(trans);
        if (err) {
-               IWL_ERR(trans, "Error allocating IRQ %d\n", bus(trans)->irq);
-               iwl_free_isr_ict(trans);
-               return err;
+               IWL_ERR(trans, "Error while preparing HW: %d", err);
+               goto err_free_irq;
        }
 
-       INIT_WORK(&trans_pcie->rx_replenish, iwl_bg_rx_replenish);
-       return 0;
+       iwl_apm_init(trans);
+
+       /* If platform's RF_KILL switch is NOT set to KILL */
+       if (iwl_read32(trans,
+                       CSR_GP_CNTRL) & CSR_GP_CNTRL_REG_FLAG_HW_RF_KILL_SW)
+               clear_bit(STATUS_RF_KILL_HW, &trans->shrd->status);
+       else
+               set_bit(STATUS_RF_KILL_HW, &trans->shrd->status);
+
+       iwl_op_mode_hw_rf_kill(trans->op_mode,
+                               test_bit(STATUS_RF_KILL_HW,
+                                        &trans->shrd->status));
+
+       return err;
+
+err_free_irq:
+       free_irq(trans->irq, trans);
+error:
+       iwl_free_isr_ict(trans);
+       tasklet_kill(&trans_pcie->irq_tasklet);
+       return err;
+}
+
+static void iwl_trans_pcie_stop_hw(struct iwl_trans *trans)
+{
+       iwl_apm_stop(trans);
+
+       iwl_write32(trans, CSR_INT, 0xFFFFFFFF);
+
+       /* Even if we stop the HW, we still want the RF kill interrupt */
+       IWL_DEBUG_ISR(trans, "Enabling rfkill interrupt\n");
+       iwl_write32(trans, CSR_INT_MASK, CSR_INT_BIT_RF_KILL);
 }
 
 static int iwl_trans_pcie_reclaim(struct iwl_trans *trans, int sta_id, int tid,
@@ -1289,13 +1590,42 @@ static int iwl_trans_pcie_reclaim(struct iwl_trans *trans, int sta_id, int tid,
        return 0;
 }
 
+static void iwl_trans_pcie_write8(struct iwl_trans *trans, u32 ofs, u8 val)
+{
+       iowrite8(val, IWL_TRANS_GET_PCIE_TRANS(trans)->hw_base + ofs);
+}
+
+static void iwl_trans_pcie_write32(struct iwl_trans *trans, u32 ofs, u32 val)
+{
+       iowrite32(val, IWL_TRANS_GET_PCIE_TRANS(trans)->hw_base + ofs);
+}
+
+static u32 iwl_trans_pcie_read32(struct iwl_trans *trans, u32 ofs)
+{
+       u32 val = ioread32(IWL_TRANS_GET_PCIE_TRANS(trans)->hw_base + ofs);
+       return val;
+}
+
 static void iwl_trans_pcie_free(struct iwl_trans *trans)
 {
+       struct iwl_trans_pcie *trans_pcie =
+               IWL_TRANS_GET_PCIE_TRANS(trans);
+
        iwl_calib_free_results(trans);
        iwl_trans_pcie_tx_free(trans);
+#ifndef CONFIG_IWLWIFI_IDI
        iwl_trans_pcie_rx_free(trans);
-       free_irq(bus(trans)->irq, trans);
-       iwl_free_isr_ict(trans);
+#endif
+       if (trans_pcie->irq_requested == true) {
+               free_irq(trans->irq, trans);
+               iwl_free_isr_ict(trans);
+       }
+
+       pci_disable_msi(trans_pcie->pci_dev);
+       pci_iounmap(trans_pcie->pci_dev, trans_pcie->hw_base);
+       pci_release_regions(trans_pcie->pci_dev);
+       pci_disable_device(trans_pcie->pci_dev);
+
        trans->shrd->trans = NULL;
        kfree(trans);
 }
@@ -1315,10 +1645,10 @@ static int iwl_trans_pcie_suspend(struct iwl_trans *trans)
         * things already :-)
         */
        if (!trans->shrd->wowlan) {
-               iwl_apm_stop(priv(trans));
+               iwl_apm_stop(trans);
        } else {
                iwl_disable_interrupts(trans);
-               iwl_clear_bit(bus(trans), CSR_GP_CNTRL,
+               iwl_clear_bit(trans, CSR_GP_CNTRL,
                              CSR_GP_CNTRL_REG_FLAG_MAC_ACCESS_REQ);
        }
 
@@ -1331,7 +1661,7 @@ static int iwl_trans_pcie_resume(struct iwl_trans *trans)
 
        iwl_enable_interrupts(trans);
 
-       if (!(iwl_read32(bus(trans), CSR_GP_CNTRL) &
+       if (!(iwl_read32(trans, CSR_GP_CNTRL) &
                                CSR_GP_CNTRL_REG_FLAG_HW_RF_KILL_SW))
                hw_rfkill = true;
 
@@ -1340,7 +1670,7 @@ static int iwl_trans_pcie_resume(struct iwl_trans *trans)
        else
                clear_bit(STATUS_RF_KILL_HW, &trans->shrd->status);
 
-       iwl_set_hw_rfkill_state(priv(trans), hw_rfkill);
+       iwl_op_mode_hw_rf_kill(trans->op_mode, hw_rfkill);
 
        return 0;
 }
@@ -1364,25 +1694,6 @@ static void iwl_trans_pcie_wake_any_queue(struct iwl_trans *trans,
        }
 }
 
-const struct iwl_trans_ops trans_ops_pcie;
-
-static struct iwl_trans *iwl_trans_pcie_alloc(struct iwl_shared *shrd)
-{
-       struct iwl_trans *iwl_trans = kzalloc(sizeof(struct iwl_trans) +
-                                             sizeof(struct iwl_trans_pcie),
-                                             GFP_KERNEL);
-       if (iwl_trans) {
-               struct iwl_trans_pcie *trans_pcie =
-                       IWL_TRANS_GET_PCIE_TRANS(iwl_trans);
-               iwl_trans->ops = &trans_ops_pcie;
-               iwl_trans->shrd = shrd;
-               trans_pcie->trans = iwl_trans;
-               spin_lock_init(&iwl_trans->hcmd_lock);
-       }
-
-       return iwl_trans;
-}
-
 static void iwl_trans_pcie_stop_queue(struct iwl_trans *trans, int txq_id,
                                      const char *msg)
 {
@@ -1446,9 +1757,9 @@ static int iwl_trans_pcie_check_stuck_queue(struct iwl_trans *trans, int cnt)
                IWL_ERR(trans, "Current SW read_ptr %d write_ptr %d\n",
                        q->read_ptr, q->write_ptr);
                IWL_ERR(trans, "Current HW read_ptr %d write_ptr %d\n",
-                       iwl_read_prph(bus(trans), SCD_QUEUE_RDPTR(cnt))
+                       iwl_read_prph(trans, SCD_QUEUE_RDPTR(cnt))
                                & (TFD_QUEUE_SIZE_MAX - 1),
-                       iwl_read_prph(bus(trans), SCD_QUEUE_WRPTR(cnt)));
+                       iwl_read_prph(trans, SCD_QUEUE_WRPTR(cnt)));
                return 1;
        }
 
@@ -1502,7 +1813,7 @@ int iwl_dump_fh(struct iwl_trans *trans, char **buf, bool display)
                        pos += scnprintf(*buf + pos, bufsz - pos,
                                "  %34s: 0X%08x\n",
                                get_fh_string(fh_tbl[i]),
-                               iwl_read_direct32(bus(trans), fh_tbl[i]));
+                               iwl_read_direct32(trans, fh_tbl[i]));
                }
                return pos;
        }
@@ -1511,7 +1822,7 @@ int iwl_dump_fh(struct iwl_trans *trans, char **buf, bool display)
        for (i = 0; i <  ARRAY_SIZE(fh_tbl); i++) {
                IWL_ERR(trans, "  %34s: 0X%08x\n",
                        get_fh_string(fh_tbl[i]),
-                       iwl_read_direct32(bus(trans), fh_tbl[i]));
+                       iwl_read_direct32(trans, fh_tbl[i]));
        }
        return 0;
 }
@@ -1581,7 +1892,7 @@ void iwl_dump_csr(struct iwl_trans *trans)
        for (i = 0; i <  ARRAY_SIZE(csr_tbl); i++) {
                IWL_ERR(trans, "  %25s: 0X%08x\n",
                        get_csr_string(csr_tbl[i]),
-                       iwl_read32(bus(trans), csr_tbl[i]));
+                       iwl_read32(trans, csr_tbl[i]));
        }
 }
 
@@ -1902,13 +2213,12 @@ static int iwl_trans_pcie_dbgfs_register(struct iwl_trans *trans,
 #endif /*CONFIG_IWLWIFI_DEBUGFS */
 
 const struct iwl_trans_ops trans_ops_pcie = {
-       .alloc = iwl_trans_pcie_alloc,
-       .request_irq = iwl_trans_pcie_request_irq,
-       .start_device = iwl_trans_pcie_start_device,
-       .prepare_card_hw = iwl_trans_pcie_prepare_card_hw,
+       .start_hw = iwl_trans_pcie_start_hw,
+       .stop_hw = iwl_trans_pcie_stop_hw,
+       .fw_alive = iwl_trans_pcie_fw_alive,
+       .start_fw = iwl_trans_pcie_start_fw,
        .stop_device = iwl_trans_pcie_stop_device,
 
-       .tx_start = iwl_trans_pcie_tx_start,
        .wake_any_queue = iwl_trans_pcie_wake_any_queue,
 
        .send_cmd = iwl_trans_pcie_send_cmd,
@@ -1920,8 +2230,6 @@ const struct iwl_trans_ops trans_ops_pcie = {
        .tx_agg_alloc = iwl_trans_pcie_tx_agg_alloc,
        .tx_agg_setup = iwl_trans_pcie_tx_agg_setup,
 
-       .kick_nic = iwl_trans_pcie_kick_nic,
-
        .free = iwl_trans_pcie_free,
        .stop_queue = iwl_trans_pcie_stop_queue,
 
@@ -1934,4 +2242,117 @@ const struct iwl_trans_ops trans_ops_pcie = {
        .suspend = iwl_trans_pcie_suspend,
        .resume = iwl_trans_pcie_resume,
 #endif
+       .write8 = iwl_trans_pcie_write8,
+       .write32 = iwl_trans_pcie_write32,
+       .read32 = iwl_trans_pcie_read32,
 };
+
+struct iwl_trans *iwl_trans_pcie_alloc(struct iwl_shared *shrd,
+                                      struct pci_dev *pdev,
+                                      const struct pci_device_id *ent)
+{
+       struct iwl_trans_pcie *trans_pcie;
+       struct iwl_trans *trans;
+       u16 pci_cmd;
+       int err;
+
+       trans = kzalloc(sizeof(struct iwl_trans) +
+                            sizeof(struct iwl_trans_pcie), GFP_KERNEL);
+
+       if (WARN_ON(!trans))
+               return NULL;
+
+       trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
+
+       trans->ops = &trans_ops_pcie;
+       trans->shrd = shrd;
+       trans_pcie->trans = trans;
+       spin_lock_init(&trans->hcmd_lock);
+       spin_lock_init(&trans_pcie->irq_lock);
+
+       /* W/A - seems to solve weird behavior. We need to remove this if we
+        * don't want to stay in L1 all the time. This wastes a lot of power */
+       pci_disable_link_state(pdev, PCIE_LINK_STATE_L0S | PCIE_LINK_STATE_L1 |
+                               PCIE_LINK_STATE_CLKPM);
+
+       if (pci_enable_device(pdev)) {
+               err = -ENODEV;
+               goto out_no_pci;
+       }
+
+       pci_set_master(pdev);
+
+       err = pci_set_dma_mask(pdev, DMA_BIT_MASK(36));
+       if (!err)
+               err = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(36));
+       if (err) {
+               err = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
+               if (!err)
+                       err = pci_set_consistent_dma_mask(pdev,
+                                                       DMA_BIT_MASK(32));
+               /* both attempts failed: */
+               if (err) {
+                       dev_printk(KERN_ERR, &pdev->dev,
+                                  "No suitable DMA available.\n");
+                       goto out_pci_disable_device;
+               }
+       }
+
+       err = pci_request_regions(pdev, DRV_NAME);
+       if (err) {
+               dev_printk(KERN_ERR, &pdev->dev, "pci_request_regions failed");
+               goto out_pci_disable_device;
+       }
+
+       trans_pcie->hw_base = pci_iomap(pdev, 0, 0);
+       if (!trans_pcie->hw_base) {
+               dev_printk(KERN_ERR, &pdev->dev, "pci_iomap failed");
+               err = -ENODEV;
+               goto out_pci_release_regions;
+       }
+
+       dev_printk(KERN_INFO, &pdev->dev,
+               "pci_resource_len = 0x%08llx\n",
+               (unsigned long long) pci_resource_len(pdev, 0));
+       dev_printk(KERN_INFO, &pdev->dev,
+               "pci_resource_base = %p\n", trans_pcie->hw_base);
+
+       dev_printk(KERN_INFO, &pdev->dev,
+               "HW Revision ID = 0x%X\n", pdev->revision);
+
+       /* We disable the RETRY_TIMEOUT register (0x41) to keep
+        * PCI Tx retries from interfering with C3 CPU state */
+       pci_write_config_byte(pdev, PCI_CFG_RETRY_TIMEOUT, 0x00);
+
+       err = pci_enable_msi(pdev);
+       if (err)
+               dev_printk(KERN_ERR, &pdev->dev,
+                       "pci_enable_msi failed(0X%x)", err);
+
+       trans->dev = &pdev->dev;
+       trans->irq = pdev->irq;
+       trans_pcie->pci_dev = pdev;
+       trans->hw_rev = iwl_read32(trans, CSR_HW_REV);
+       trans->hw_id = (pdev->device << 16) + pdev->subsystem_device;
+       snprintf(trans->hw_id_str, sizeof(trans->hw_id_str),
+                "PCI ID: 0x%04X:0x%04X", pdev->device, pdev->subsystem_device);
+
+       /* TODO: Move this away, not needed if not MSI */
+       /* enable rfkill interrupt: hw bug w/a */
+       pci_read_config_word(pdev, PCI_COMMAND, &pci_cmd);
+       if (pci_cmd & PCI_COMMAND_INTX_DISABLE) {
+               pci_cmd &= ~PCI_COMMAND_INTX_DISABLE;
+               pci_write_config_word(pdev, PCI_COMMAND, pci_cmd);
+       }
+
+       return trans;
+
+out_pci_release_regions:
+       pci_release_regions(pdev);
+out_pci_disable_device:
+       pci_disable_device(pdev);
+out_no_pci:
+       kfree(trans);
+       return NULL;
+}
+
index 1b20c4f..506c062 100644 (file)
@@ -5,7 +5,7 @@
  *
  * GPL LICENSE SUMMARY
  *
- * Copyright(c) 2007 - 2011 Intel Corporation. All rights reserved.
+ * Copyright(c) 2007 - 2012 Intel Corporation. All rights reserved.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of version 2 of the GNU General Public License as
@@ -30,7 +30,7 @@
  *
  * BSD LICENSE
  *
- * Copyright(c) 2005 - 2011 Intel Corporation. All rights reserved.
+ * Copyright(c) 2005 - 2012 Intel Corporation. All rights reserved.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
index e6bf3f5..4e7e6c0 100644 (file)
@@ -5,7 +5,7 @@
  *
  * GPL LICENSE SUMMARY
  *
- * Copyright(c) 2007 - 2011 Intel Corporation. All rights reserved.
+ * Copyright(c) 2007 - 2012 Intel Corporation. All rights reserved.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of version 2 of the GNU General Public License as
@@ -30,7 +30,7 @@
  *
  * BSD LICENSE
  *
- * Copyright(c) 2005 - 2011 Intel Corporation. All rights reserved.
+ * Copyright(c) 2005 - 2012 Intel Corporation. All rights reserved.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
 #ifndef __iwl_trans_h__
 #define __iwl_trans_h__
 
-#include <linux/debugfs.h>
-#include <linux/skbuff.h>
+#include <linux/ieee80211.h>
 
 #include "iwl-shared.h"
-#include "iwl-commands.h"
+#include "iwl-debug.h"
 
- /*This file includes the declaration that are exported from the transport
- * layer */
+/**
+ * DOC: Transport layer - what is it ?
+ *
+ * The tranport layer is the layer that deals with the HW directly. It provides
+ * an abstraction of the underlying HW to the upper layer. The transport layer
+ * doesn't provide any policy, algorithm or anything of this kind, but only
+ * mechanisms to make the HW do something.It is not completely stateless but
+ * close to it.
+ * We will have an implementation for each different supported bus.
+ */
+
+/**
+ * DOC: Life cycle of the transport layer
+ *
+ * The transport layer has a very precise life cycle.
+ *
+ *     1) A helper function is called during the module initialization and
+ *        registers the bus driver's ops with the transport's alloc function.
+ *     2) Bus's probe calls to the transport layer's allocation functions.
+ *        Of course this function is bus specific.
+ *     3) This allocation functions will spawn the upper layer which will
+ *        register mac80211.
+ *
+ *     4) At some point (i.e. mac80211's start call), the op_mode will call
+ *        the following sequence:
+ *        start_hw
+ *        start_fw
+ *
+ *     5) Then when finished (or reset):
+ *        stop_fw (a.k.a. stop device for the moment)
+ *        stop_hw
+ *
+ *     6) Eventually, the free function will be called.
+ */
 
 struct iwl_priv;
 struct iwl_shared;
+struct iwl_op_mode;
+struct fw_img;
+struct sk_buff;
+struct dentry;
 
+/**
+ * DOC: Host command section
+ *
+ * A host command is a commaned issued by the upper layer to the fw. There are
+ * several versions of fw that have several APIs. The transport layer is
+ * completely agnostic to these differences.
+ * The transport does provide helper functionnality (i.e. SYNC / ASYNC mode),
+ */
 #define SEQ_TO_SN(seq) (((seq) & IEEE80211_SCTL_SEQ) >> 4)
 #define SN_TO_SEQ(ssn) (((ssn) << 4) & IEEE80211_SCTL_SEQ)
 #define MAX_SN ((IEEE80211_SCTL_SEQ) >> 4)
 
-enum {
+/**
+ * enum CMD_MODE - how to send the host commands ?
+ *
+ * @CMD_SYNC: The caller will be stalled until the fw responds to the command
+ * @CMD_ASYNC: Return right away and don't want for the response
+ * @CMD_WANT_SKB: valid only with CMD_SYNC. The caller needs the buffer of the
+ *     response.
+ * @CMD_ON_DEMAND: This command is sent by the test mode pipe.
+ */
+enum CMD_MODE {
        CMD_SYNC = 0,
        CMD_ASYNC = BIT(0),
        CMD_WANT_SKB = BIT(1),
@@ -104,20 +156,29 @@ struct iwl_device_cmd {
 
 #define IWL_MAX_CMD_TFDS       2
 
+/**
+ * struct iwl_hcmd_dataflag - flag for each one of the chunks of the command
+ *
+ * IWL_HCMD_DFL_NOCOPY: By default, the command is copied to the host command's
+ *     ring. The transport layer doesn't map the command's buffer to DMA, but
+ *     rather copies it to an previously allocated DMA buffer. This flag tells
+ *     the transport layer not to copy the command, but to map the existing
+ *     buffer. This can save memcpy and is worth with very big comamnds.
+ */
 enum iwl_hcmd_dataflag {
        IWL_HCMD_DFL_NOCOPY     = BIT(0),
 };
 
 /**
  * struct iwl_host_cmd - Host command to the uCode
+ *
  * @data: array of chunks that composes the data of the host command
  * @reply_page: pointer to the page that holds the response to the host command
  * @handler_status: return value of the handler of the command
  *     (put in setup_rx_handlers) - valid for SYNC mode only
- * @callback:
- * @flags: can be CMD_* note CMD_WANT_SKB is incompatible withe CMD_ASYNC
+ * @flags: can be CMD_*
  * @len: array of the lenths of the chunks in data
- * @dataflags:
+ * @dataflags: IWL_HCMD_DFL_*
  * @id: id of the host command
  */
 struct iwl_host_cmd {
@@ -133,42 +194,58 @@ struct iwl_host_cmd {
 
 /**
  * struct iwl_trans_ops - transport specific operations
- * @alloc: allocates the meta data (not the queues themselves)
- * @request_irq: requests IRQ - will be called before the FW load in probe flow
- * @start_device: allocates and inits all the resources for the transport
- *                layer.
- * @prepare_card_hw: claim the ownership on the HW. Will be called during
- *                   probe.
- * @tx_start: starts and configures all the Tx fifo - usually done once the fw
- *           is alive.
+ *
+ * All the handlers MUST be implemented
+ *
+ * @start_hw: starts the HW- from that point on, the HW can send interrupts
+ *     May sleep
+ * @stop_hw: stops the HW- from that point on, the HW will be in low power but
+ *     will still issue interrupt if the HW RF kill is triggered.
+ *     May sleep
+ * @start_fw: allocates and inits all the resources for the transport
+ *     layer. Also kick a fw image.
+ *     May sleep
+ * @fw_alive: called when the fw sends alive notification
+ *     May sleep
  * @wake_any_queue: wake all the queues of a specfic context IWL_RXON_CTX_*
  * @stop_device:stops the whole device (embedded CPU put to reset)
+ *     May sleep
  * @send_cmd:send a host command
+ *     May sleep only if CMD_SYNC is set
  * @tx: send an skb
+ *     Must be atomic
  * @reclaim: free packet until ssn. Returns a list of freed packets.
+ *     Must be atomic
  * @tx_agg_alloc: allocate resources for a TX BA session
+ *     May sleep
  * @tx_agg_setup: setup a tx queue for AMPDU - will be called once the HW is
- *                 ready and a successful ADDBA response has been received.
+ *     ready and a successful ADDBA response has been received.
+ *     May sleep
  * @tx_agg_disable: de-configure a Tx queue to send AMPDUs
- * @kick_nic: remove the RESET from the embedded CPU and let it run
+ *     May sleep
  * @free: release all the ressource for the transport layer itself such as
- *        irq, tasklet etc...
+ *     irq, tasklet etc... From this point on, the device may not issue
+ *     any interrupt (incl. RFKILL).
+ *     May sleep
  * @stop_queue: stop a specific queue
  * @check_stuck_queue: check if a specific queue is stuck
  * @wait_tx_queue_empty: wait until all tx queues are empty
+ *     May sleep
  * @dbgfs_register: add the dbgfs files under this directory. Files will be
  *     automatically deleted.
  * @suspend: stop the device unless WoWLAN is configured
  * @resume: resume activity of the device
+ * @write8: write a u8 to a register at offset ofs from the BAR
+ * @write32: write a u32 to a register at offset ofs from the BAR
+ * @read32: read a u32 register at offset ofs from the BAR
  */
 struct iwl_trans_ops {
 
-       struct iwl_trans *(*alloc)(struct iwl_shared *shrd);
-       int (*request_irq)(struct iwl_trans *iwl_trans);
-       int (*start_device)(struct iwl_trans *trans);
-       int (*prepare_card_hw)(struct iwl_trans *trans);
+       int (*start_hw)(struct iwl_trans *iwl_trans);
+       void (*stop_hw)(struct iwl_trans *iwl_trans);
+       int (*start_fw)(struct iwl_trans *trans, struct fw_img *fw);
+       void (*fw_alive)(struct iwl_trans *trans);
        void (*stop_device)(struct iwl_trans *trans);
-       void (*tx_start)(struct iwl_trans *trans);
 
        void (*wake_any_queue)(struct iwl_trans *trans,
                               enum iwl_rxon_context_id ctx,
@@ -191,8 +268,6 @@ struct iwl_trans_ops {
                             enum iwl_rxon_context_id ctx, int sta_id, int tid,
                             int frame_limit, u16 ssn);
 
-       void (*kick_nic)(struct iwl_trans *trans);
-
        void (*free)(struct iwl_trans *trans);
 
        void (*stop_queue)(struct iwl_trans *trans, int q, const char *msg);
@@ -204,18 +279,9 @@ struct iwl_trans_ops {
        int (*suspend)(struct iwl_trans *trans);
        int (*resume)(struct iwl_trans *trans);
 #endif
-};
-
-/* one for each uCode image (inst/data, boot/init/runtime) */
-struct fw_desc {
-       dma_addr_t p_addr;      /* hardware address */
-       void *v_addr;           /* software address */
-       u32 len;                /* size in bytes */
-};
-
-struct fw_img {
-       struct fw_desc code;    /* firmware code image */
-       struct fw_desc data;    /* firmware data image */
+       void (*write8)(struct iwl_trans *trans, u32 ofs, u8 val);
+       void (*write32)(struct iwl_trans *trans, u32 ofs, u32 val);
+       u32 (*read32)(struct iwl_trans *trans, u32 ofs);
 };
 
 /* Opaque calibration results */
@@ -227,67 +293,118 @@ struct iwl_calib_result {
 };
 
 /**
+ * enum iwl_trans_state - state of the transport layer
+ *
+ * @IWL_TRANS_NO_FW: no fw has sent an alive response
+ * @IWL_TRANS_FW_ALIVE: a fw has sent an alive response
+ */
+enum iwl_trans_state {
+       IWL_TRANS_NO_FW = 0,
+       IWL_TRANS_FW_ALIVE      = 1,
+};
+
+/**
  * struct iwl_trans - transport common data
+ *
  * @ops - pointer to iwl_trans_ops
+ * @op_mode - pointer to the op_mode
  * @shrd - pointer to iwl_shared which holds shared data from the upper layer
  * @hcmd_lock: protects HCMD
+ * @reg_lock - protect hw register access
+ * @dev - pointer to struct device * that represents the device
+ * @irq - the irq number for the device
+ * @hw_id: a u32 with the ID of the device / subdevice.
+ *     Set during transport allocation.
+ * @hw_id_str: a string with info about HW ID. Set during transport allocation.
  * @ucode_write_complete: indicates that the ucode has been copied.
- * @ucode_rt: run time ucode image
- * @ucode_init: init ucode image
- * @ucode_wowlan: wake on wireless ucode image (optional)
  * @nvm_device_type: indicates OTP or eeprom
+ * @pm_support: set to true in start_hw if link pm is supported
  * @calib_results: list head for init calibration results
  */
 struct iwl_trans {
        const struct iwl_trans_ops *ops;
+       struct iwl_op_mode *op_mode;
        struct iwl_shared *shrd;
+       enum iwl_trans_state state;
        spinlock_t hcmd_lock;
+       spinlock_t reg_lock;
 
-       u8 ucode_write_complete;        /* the image write is complete */
-       struct fw_img ucode_rt;
-       struct fw_img ucode_init;
-       struct fw_img ucode_wowlan;
+       struct device *dev;
+       unsigned int irq;
+       u32 hw_rev;
+       u32 hw_id;
+       char hw_id_str[52];
+
+       u8 ucode_write_complete;
 
-       /* eeprom related variables */
        int    nvm_device_type;
+       bool pm_support;
 
-       /* init calibration results */
        struct list_head calib_results;
 
        /* pointer to trans specific struct */
        /*Ensure that this pointer will always be aligned to sizeof pointer */
-       char trans_specific[0] __attribute__((__aligned__(sizeof(void *))));
+       char trans_specific[0] __aligned(sizeof(void *));
 };
 
-static inline int iwl_trans_request_irq(struct iwl_trans *trans)
+static inline void iwl_trans_configure(struct iwl_trans *trans,
+                                      struct iwl_op_mode *op_mode)
 {
-       return trans->ops->request_irq(trans);
+       /*
+        * only set the op_mode for the moment. Later on, this function will do
+        * more
+        */
+       trans->op_mode = op_mode;
 }
 
-static inline int iwl_trans_start_device(struct iwl_trans *trans)
+static inline int iwl_trans_start_hw(struct iwl_trans *trans)
 {
-       return trans->ops->start_device(trans);
+       might_sleep();
+
+       return trans->ops->start_hw(trans);
 }
 
-static inline int iwl_trans_prepare_card_hw(struct iwl_trans *trans)
+static inline void iwl_trans_stop_hw(struct iwl_trans *trans)
 {
-       return trans->ops->prepare_card_hw(trans);
+       might_sleep();
+
+       trans->ops->stop_hw(trans);
+
+       trans->state = IWL_TRANS_NO_FW;
 }
 
-static inline void iwl_trans_stop_device(struct iwl_trans *trans)
+static inline void iwl_trans_fw_alive(struct iwl_trans *trans)
 {
-       trans->ops->stop_device(trans);
+       might_sleep();
+
+       trans->ops->fw_alive(trans);
+
+       trans->state = IWL_TRANS_FW_ALIVE;
+}
+
+static inline int iwl_trans_start_fw(struct iwl_trans *trans, struct fw_img *fw)
+{
+       might_sleep();
+
+       return trans->ops->start_fw(trans, fw);
 }
 
-static inline void iwl_trans_tx_start(struct iwl_trans *trans)
+static inline void iwl_trans_stop_device(struct iwl_trans *trans)
 {
-       trans->ops->tx_start(trans);
+       might_sleep();
+
+       trans->ops->stop_device(trans);
+
+       trans->state = IWL_TRANS_NO_FW;
 }
 
 static inline void iwl_trans_wake_any_queue(struct iwl_trans *trans,
                                            enum iwl_rxon_context_id ctx,
                                            const char *msg)
 {
+       if (trans->state != IWL_TRANS_FW_ALIVE)
+               IWL_ERR(trans, "%s bad state = %d", __func__, trans->state);
+
        trans->ops->wake_any_queue(trans, ctx, msg);
 }
 
@@ -295,6 +412,9 @@ static inline void iwl_trans_wake_any_queue(struct iwl_trans *trans,
 static inline int iwl_trans_send_cmd(struct iwl_trans *trans,
                                struct iwl_host_cmd *cmd)
 {
+       if (trans->state != IWL_TRANS_FW_ALIVE)
+               IWL_ERR(trans, "%s bad state = %d", __func__, trans->state);
+
        return trans->ops->send_cmd(trans, cmd);
 }
 
@@ -305,6 +425,9 @@ static inline int iwl_trans_tx(struct iwl_trans *trans, struct sk_buff *skb,
                struct iwl_device_cmd *dev_cmd, enum iwl_rxon_context_id ctx,
                u8 sta_id, u8 tid)
 {
+       if (trans->state != IWL_TRANS_FW_ALIVE)
+               IWL_ERR(trans, "%s bad state = %d", __func__, trans->state);
+
        return trans->ops->tx(trans, skb, dev_cmd, ctx, sta_id, tid);
 }
 
@@ -312,6 +435,9 @@ static inline int iwl_trans_reclaim(struct iwl_trans *trans, int sta_id,
                                 int tid, int txq_id, int ssn, u32 status,
                                 struct sk_buff_head *skbs)
 {
+       if (trans->state != IWL_TRANS_FW_ALIVE)
+               IWL_ERR(trans, "%s bad state = %d", __func__, trans->state);
+
        return trans->ops->reclaim(trans, sta_id, tid, txq_id, ssn,
                                   status, skbs);
 }
@@ -319,12 +445,22 @@ static inline int iwl_trans_reclaim(struct iwl_trans *trans, int sta_id,
 static inline int iwl_trans_tx_agg_disable(struct iwl_trans *trans,
                                            int sta_id, int tid)
 {
+       might_sleep();
+
+       if (trans->state != IWL_TRANS_FW_ALIVE)
+               IWL_ERR(trans, "%s bad state = %d", __func__, trans->state);
+
        return trans->ops->tx_agg_disable(trans, sta_id, tid);
 }
 
 static inline int iwl_trans_tx_agg_alloc(struct iwl_trans *trans,
                                         int sta_id, int tid)
 {
+       might_sleep();
+
+       if (trans->state != IWL_TRANS_FW_ALIVE)
+               IWL_ERR(trans, "%s bad state = %d", __func__, trans->state);
+
        return trans->ops->tx_agg_alloc(trans, sta_id, tid);
 }
 
@@ -334,12 +470,12 @@ static inline void iwl_trans_tx_agg_setup(struct iwl_trans *trans,
                                           int sta_id, int tid,
                                           int frame_limit, u16 ssn)
 {
-       trans->ops->tx_agg_setup(trans, ctx, sta_id, tid, frame_limit, ssn);
-}
+       might_sleep();
 
-static inline void iwl_trans_kick_nic(struct iwl_trans *trans)
-{
-       trans->ops->kick_nic(trans);
+       if (trans->state != IWL_TRANS_FW_ALIVE)
+               IWL_ERR(trans, "%s bad state = %d", __func__, trans->state);
+
+       trans->ops->tx_agg_setup(trans, ctx, sta_id, tid, frame_limit, ssn);
 }
 
 static inline void iwl_trans_free(struct iwl_trans *trans)
@@ -350,16 +486,25 @@ static inline void iwl_trans_free(struct iwl_trans *trans)
 static inline void iwl_trans_stop_queue(struct iwl_trans *trans, int q,
                                        const char *msg)
 {
+       if (trans->state != IWL_TRANS_FW_ALIVE)
+               IWL_ERR(trans, "%s bad state = %d", __func__, trans->state);
+
        trans->ops->stop_queue(trans, q, msg);
 }
 
 static inline int iwl_trans_wait_tx_queue_empty(struct iwl_trans *trans)
 {
+       if (trans->state != IWL_TRANS_FW_ALIVE)
+               IWL_ERR(trans, "%s bad state = %d", __func__, trans->state);
+
        return trans->ops->wait_tx_queue_empty(trans);
 }
 
 static inline int iwl_trans_check_stuck_queue(struct iwl_trans *trans, int q)
 {
+       if (trans->state != IWL_TRANS_FW_ALIVE)
+               IWL_ERR(trans, "%s bad state = %d", __func__, trans->state);
+
        return trans->ops->check_stuck_queue(trans, q);
 }
 static inline int iwl_trans_dbgfs_register(struct iwl_trans *trans,
@@ -380,18 +525,43 @@ static inline int iwl_trans_resume(struct iwl_trans *trans)
 }
 #endif
 
-/*****************************************************
-* Transport layers implementations
-******************************************************/
-extern const struct iwl_trans_ops trans_ops_pcie;
+static inline void iwl_trans_write8(struct iwl_trans *trans, u32 ofs, u8 val)
+{
+       trans->ops->write8(trans, ofs, val);
+}
 
-int iwl_alloc_fw_desc(struct iwl_bus *bus, struct fw_desc *desc,
-                     const void *data, size_t len);
-void iwl_dealloc_ucode(struct iwl_trans *trans);
+static inline void iwl_trans_write32(struct iwl_trans *trans, u32 ofs, u32 val)
+{
+       trans->ops->write32(trans, ofs, val);
+}
+
+static inline u32 iwl_trans_read32(struct iwl_trans *trans, u32 ofs)
+{
+       return trans->ops->read32(trans, ofs);
+}
 
+/*****************************************************
+* Utils functions
+******************************************************/
 int iwl_send_calib_results(struct iwl_trans *trans);
 int iwl_calib_set(struct iwl_trans *trans,
                  const struct iwl_calib_hdr *cmd, int len);
 void iwl_calib_free_results(struct iwl_trans *trans);
 
+/*****************************************************
+* Transport layers implementations + their allocation function
+******************************************************/
+struct pci_dev;
+struct pci_device_id;
+extern const struct iwl_trans_ops trans_ops_pcie;
+struct iwl_trans *iwl_trans_pcie_alloc(struct iwl_shared *shrd,
+                                      struct pci_dev *pdev,
+                                      const struct pci_device_id *ent);
+int __must_check iwl_pci_register_driver(void);
+void iwl_pci_unregister_driver(void);
+
+extern const struct iwl_trans_ops trans_ops_idi;
+struct iwl_trans *iwl_trans_idi_alloc(struct iwl_shared *shrd,
+                                     void *pdev_void,
+                                     const void *ent_void);
 #endif /* __iwl_trans_h__ */
index 36a1b5b..b16efc0 100644 (file)
@@ -2,7 +2,7 @@
  *
  * GPL LICENSE SUMMARY
  *
- * Copyright(c) 2008 - 2011 Intel Corporation. All rights reserved.
+ * Copyright(c) 2008 - 2012 Intel Corporation. All rights reserved.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of version 2 of the GNU General Public License as
@@ -32,7 +32,9 @@
 #include <linux/init.h>
 #include <linux/sched.h>
 #include <linux/dma-mapping.h>
+#include <linux/firmware.h>
 
+#include "iwl-ucode.h"
 #include "iwl-wifi.h"
 #include "iwl-dev.h"
 #include "iwl-core.h"
@@ -42,6 +44,7 @@
 #include "iwl-agn-calib.h"
 #include "iwl-trans.h"
 #include "iwl-fh.h"
+#include "iwl-op-mode.h"
 
 static struct iwl_wimax_coex_event_entry cu_priorities[COEX_NUM_OF_EVENTS] = {
        {COEX_CU_UNASSOC_IDLE_RP, COEX_CU_UNASSOC_IDLE_WP,
@@ -80,29 +83,29 @@ static struct iwl_wimax_coex_event_entry cu_priorities[COEX_NUM_OF_EVENTS] = {
  *
  ******************************************************************************/
 
-static void iwl_free_fw_desc(struct iwl_bus *bus, struct fw_desc *desc)
+static void iwl_free_fw_desc(struct iwl_nic *nic, struct fw_desc *desc)
 {
        if (desc->v_addr)
-               dma_free_coherent(bus->dev, desc->len,
+               dma_free_coherent(trans(nic)->dev, desc->len,
                                  desc->v_addr, desc->p_addr);
        desc->v_addr = NULL;
        desc->len = 0;
 }
 
-static void iwl_free_fw_img(struct iwl_bus *bus, struct fw_img *img)
+static void iwl_free_fw_img(struct iwl_nic *nic, struct fw_img *img)
 {
-       iwl_free_fw_desc(bus, &img->code);
-       iwl_free_fw_desc(bus, &img->data);
+       iwl_free_fw_desc(nic, &img->code);
+       iwl_free_fw_desc(nic, &img->data);
 }
 
-void iwl_dealloc_ucode(struct iwl_trans *trans)
+void iwl_dealloc_ucode(struct iwl_nic *nic)
 {
-       iwl_free_fw_img(bus(trans), &trans->ucode_rt);
-       iwl_free_fw_img(bus(trans), &trans->ucode_init);
-       iwl_free_fw_img(bus(trans), &trans->ucode_wowlan);
+       iwl_free_fw_img(nic, &nic->fw.ucode_rt);
+       iwl_free_fw_img(nic, &nic->fw.ucode_init);
+       iwl_free_fw_img(nic, &nic->fw.ucode_wowlan);
 }
 
-int iwl_alloc_fw_desc(struct iwl_bus *bus, struct fw_desc *desc,
+static int iwl_alloc_fw_desc(struct iwl_nic *nic, struct fw_desc *desc,
                      const void *data, size_t len)
 {
        if (!len) {
@@ -110,7 +113,7 @@ int iwl_alloc_fw_desc(struct iwl_bus *bus, struct fw_desc *desc,
                return -EINVAL;
        }
 
-       desc->v_addr = dma_alloc_coherent(bus->dev, len,
+       desc->v_addr = dma_alloc_coherent(trans(nic)->dev, len,
                                          &desc->p_addr, GFP_KERNEL);
        if (!desc->v_addr)
                return -ENOMEM;
@@ -120,97 +123,22 @@ int iwl_alloc_fw_desc(struct iwl_bus *bus, struct fw_desc *desc,
        return 0;
 }
 
-/*
- * ucode
- */
-static int iwl_load_section(struct iwl_trans *trans, const char *name,
-                               struct fw_desc *image, u32 dst_addr)
-{
-       struct iwl_bus *bus = bus(trans);
-       dma_addr_t phy_addr = image->p_addr;
-       u32 byte_cnt = image->len;
-       int ret;
-
-       trans->ucode_write_complete = 0;
-
-       iwl_write_direct32(bus,
-               FH_TCSR_CHNL_TX_CONFIG_REG(FH_SRVC_CHNL),
-               FH_TCSR_TX_CONFIG_REG_VAL_DMA_CHNL_PAUSE);
-
-       iwl_write_direct32(bus,
-               FH_SRVC_CHNL_SRAM_ADDR_REG(FH_SRVC_CHNL), dst_addr);
-
-       iwl_write_direct32(bus,
-               FH_TFDIB_CTRL0_REG(FH_SRVC_CHNL),
-               phy_addr & FH_MEM_TFDIB_DRAM_ADDR_LSB_MSK);
-
-       iwl_write_direct32(bus,
-               FH_TFDIB_CTRL1_REG(FH_SRVC_CHNL),
-               (iwl_get_dma_hi_addr(phy_addr)
-                       << FH_MEM_TFDIB_REG1_ADDR_BITSHIFT) | byte_cnt);
-
-       iwl_write_direct32(bus,
-               FH_TCSR_CHNL_TX_BUF_STS_REG(FH_SRVC_CHNL),
-               1 << FH_TCSR_CHNL_TX_BUF_STS_REG_POS_TB_NUM |
-               1 << FH_TCSR_CHNL_TX_BUF_STS_REG_POS_TB_IDX |
-               FH_TCSR_CHNL_TX_BUF_STS_REG_VAL_TFDB_VALID);
-
-       iwl_write_direct32(bus,
-               FH_TCSR_CHNL_TX_CONFIG_REG(FH_SRVC_CHNL),
-               FH_TCSR_TX_CONFIG_REG_VAL_DMA_CHNL_ENABLE       |
-               FH_TCSR_TX_CONFIG_REG_VAL_DMA_CREDIT_DISABLE    |
-               FH_TCSR_TX_CONFIG_REG_VAL_CIRQ_HOST_ENDTFD);
-
-       IWL_DEBUG_FW(bus, "%s uCode section being loaded...\n", name);
-       ret = wait_event_timeout(trans->shrd->wait_command_queue,
-                                trans->ucode_write_complete, 5 * HZ);
-       if (!ret) {
-               IWL_ERR(trans, "Could not load the %s uCode section\n",
-                       name);
-               return -ETIMEDOUT;
-       }
-
-       return 0;
-}
-
-static inline struct fw_img *iwl_get_ucode_image(struct iwl_trans *trans,
+static inline struct fw_img *iwl_get_ucode_image(struct iwl_nic *nic,
                                        enum iwl_ucode_type ucode_type)
 {
        switch (ucode_type) {
        case IWL_UCODE_INIT:
-               return &trans->ucode_init;
+               return &nic->fw.ucode_init;
        case IWL_UCODE_WOWLAN:
-               return &trans->ucode_wowlan;
+               return &nic->fw.ucode_wowlan;
        case IWL_UCODE_REGULAR:
-               return &trans->ucode_rt;
+               return &nic->fw.ucode_rt;
        case IWL_UCODE_NONE:
                break;
        }
        return NULL;
 }
 
-static int iwl_load_given_ucode(struct iwl_trans *trans,
-                                  enum iwl_ucode_type ucode_type)
-{
-       int ret = 0;
-       struct fw_img *image = iwl_get_ucode_image(trans, ucode_type);
-
-
-       if (!image) {
-               IWL_ERR(trans, "Invalid ucode requested (%d)\n",
-                       ucode_type);
-               return -EINVAL;
-       }
-
-       ret = iwl_load_section(trans, "INST", &image->code,
-                                  IWLAGN_RTC_INST_LOWER_BOUND);
-       if (ret)
-               return ret;
-
-       return iwl_load_section(trans, "DATA", &image->data,
-                                   IWLAGN_RTC_DATA_LOWER_BOUND);
-}
-
 /*
  *  Calibration
  */
@@ -447,7 +375,7 @@ static int iwl_alive_notify(struct iwl_trans *trans)
        if (!priv->tx_cmd_pool)
                return -ENOMEM;
 
-       iwl_trans_tx_start(trans);
+       iwl_trans_fw_alive(trans);
        for_each_context(priv, ctx)
                ctx->last_tx_rejected = false;
 
@@ -470,23 +398,24 @@ static int iwl_alive_notify(struct iwl_trans *trans)
  *   using sample data 100 bytes apart.  If these sample points are good,
  *   it's a pretty good bet that everything between them is good, too.
  */
-static int iwl_verify_inst_sparse(struct iwl_bus *bus,
+static int iwl_verify_inst_sparse(struct iwl_nic *nic,
                                      struct fw_desc *fw_desc)
 {
+       struct iwl_trans *trans = trans(nic);
        __le32 *image = (__le32 *)fw_desc->v_addr;
        u32 len = fw_desc->len;
        u32 val;
        u32 i;
 
-       IWL_DEBUG_FW(bus, "ucode inst image size is %u\n", len);
+       IWL_DEBUG_FW(nic, "ucode inst image size is %u\n", len);
 
        for (i = 0; i < len; i += 100, image += 100/sizeof(u32)) {
                /* read data comes through single port, auto-incr addr */
                /* NOTE: Use the debugless read so we don't flood kernel log
                 * if IWL_DL_IO is set */
-               iwl_write_direct32(bus, HBUS_TARG_MEM_RADDR,
+               iwl_write_direct32(trans, HBUS_TARG_MEM_RADDR,
                        i + IWLAGN_RTC_INST_LOWER_BOUND);
-               val = iwl_read32(bus, HBUS_TARG_MEM_RDAT);
+               val = iwl_read32(trans, HBUS_TARG_MEM_RDAT);
                if (val != le32_to_cpu(*image))
                        return -EIO;
        }
@@ -494,27 +423,28 @@ static int iwl_verify_inst_sparse(struct iwl_bus *bus,
        return 0;
 }
 
-static void iwl_print_mismatch_inst(struct iwl_bus *bus,
+static void iwl_print_mismatch_inst(struct iwl_nic *nic,
                                    struct fw_desc *fw_desc)
 {
+       struct iwl_trans *trans = trans(nic);
        __le32 *image = (__le32 *)fw_desc->v_addr;
        u32 len = fw_desc->len;
        u32 val;
        u32 offs;
        int errors = 0;
 
-       IWL_DEBUG_FW(bus, "ucode inst image size is %u\n", len);
+       IWL_DEBUG_FW(nic, "ucode inst image size is %u\n", len);
 
-       iwl_write_direct32(bus, HBUS_TARG_MEM_RADDR,
+       iwl_write_direct32(trans, HBUS_TARG_MEM_RADDR,
                           IWLAGN_RTC_INST_LOWER_BOUND);
 
        for (offs = 0;
             offs < len && errors < 20;
             offs += sizeof(u32), image++) {
                /* read data comes through single port, auto-incr addr */
-               val = iwl_read32(bus, HBUS_TARG_MEM_RDAT);
+               val = iwl_read32(trans, HBUS_TARG_MEM_RDAT);
                if (val != le32_to_cpu(*image)) {
-                       IWL_ERR(bus, "uCode INST section at "
+                       IWL_ERR(nic, "uCode INST section at "
                                "offset 0x%x, is 0x%x, s/b 0x%x\n",
                                offs, val, le32_to_cpu(*image));
                        errors++;
@@ -526,24 +456,24 @@ static void iwl_print_mismatch_inst(struct iwl_bus *bus,
  * iwl_verify_ucode - determine which instruction image is in SRAM,
  *    and verify its contents
  */
-static int iwl_verify_ucode(struct iwl_trans *trans,
+static int iwl_verify_ucode(struct iwl_nic *nic,
                            enum iwl_ucode_type ucode_type)
 {
-       struct fw_img *img = iwl_get_ucode_image(trans, ucode_type);
+       struct fw_img *img = iwl_get_ucode_image(nic, ucode_type);
 
        if (!img) {
-               IWL_ERR(trans, "Invalid ucode requested (%d)\n", ucode_type);
+               IWL_ERR(nic, "Invalid ucode requested (%d)\n", ucode_type);
                return -EINVAL;
        }
 
-       if (!iwl_verify_inst_sparse(bus(trans), &img->code)) {
-               IWL_DEBUG_FW(trans, "uCode is good in inst SRAM\n");
+       if (!iwl_verify_inst_sparse(nic, &img->code)) {
+               IWL_DEBUG_FW(nic, "uCode is good in inst SRAM\n");
                return 0;
        }
 
-       IWL_ERR(trans, "UCODE IMAGE IN INSTRUCTION SRAM NOT VALID!!\n");
+       IWL_ERR(nic, "UCODE IMAGE IN INSTRUCTION SRAM NOT VALID!!\n");
 
-       iwl_print_mismatch_inst(bus(trans), &img->code);
+       iwl_print_mismatch_inst(nic, &img->code);
        return -EIO;
 }
 
@@ -647,28 +577,27 @@ int iwl_load_ucode_wait_alive(struct iwl_trans *trans,
 {
        struct iwl_notification_wait alive_wait;
        struct iwl_alive_data alive_data;
+       struct fw_img *fw;
        int ret;
        enum iwl_ucode_type old_type;
 
-       ret = iwl_trans_start_device(trans);
-       if (ret)
-               return ret;
-
        iwl_init_notification_wait(trans->shrd, &alive_wait, REPLY_ALIVE,
                                      iwl_alive_fn, &alive_data);
 
        old_type = trans->shrd->ucode_type;
        trans->shrd->ucode_type = ucode_type;
+       fw = iwl_get_ucode_image(nic(trans), ucode_type);
+
+       if (!fw)
+               return -EINVAL;
 
-       ret = iwl_load_given_ucode(trans, ucode_type);
+       ret = iwl_trans_start_fw(trans, fw);
        if (ret) {
                trans->shrd->ucode_type = old_type;
                iwl_remove_notification(trans->shrd, &alive_wait);
                return ret;
        }
 
-       iwl_trans_kick_nic(trans);
-
        /*
         * Some things may run in the background now, but we
         * just wait for the ALIVE notification here.
@@ -692,7 +621,7 @@ int iwl_load_ucode_wait_alive(struct iwl_trans *trans,
         * skip it for WoWLAN.
         */
        if (ucode_type != IWL_UCODE_WOWLAN) {
-               ret = iwl_verify_ucode(trans, ucode_type);
+               ret = iwl_verify_ucode(nic(trans), ucode_type);
                if (ret) {
                        trans->shrd->ucode_type = old_type;
                        return ret;
@@ -721,7 +650,7 @@ int iwl_run_init_ucode(struct iwl_trans *trans)
        lockdep_assert_held(&trans->shrd->mutex);
 
        /* No init ucode required? Curious, but maybe ok */
-       if (!trans->ucode_init.code.len)
+       if (!nic(trans)->fw.ucode_init.code.len)
                return 0;
 
        if (trans->shrd->ucode_type != IWL_UCODE_NONE)
@@ -756,3 +685,582 @@ int iwl_run_init_ucode(struct iwl_trans *trans)
        iwl_trans_stop_device(trans);
        return ret;
 }
+
+static void iwl_ucode_callback(const struct firmware *ucode_raw, void *context);
+
+#define UCODE_EXPERIMENTAL_TAG         "exp"
+
+int __must_check iwl_request_firmware(struct iwl_nic *nic, bool first)
+{
+       struct iwl_cfg *cfg = cfg(nic);
+       const char *name_pre = cfg->fw_name_pre;
+       char tag[8];
+
+       if (first) {
+#ifdef CONFIG_IWLWIFI_DEBUG_EXPERIMENTAL_UCODE
+               nic->fw_index = UCODE_EXPERIMENTAL_INDEX;
+               strcpy(tag, UCODE_EXPERIMENTAL_TAG);
+       } else if (nic->fw_index == UCODE_EXPERIMENTAL_INDEX) {
+#endif
+               nic->fw_index = cfg->ucode_api_max;
+               sprintf(tag, "%d", nic->fw_index);
+       } else {
+               nic->fw_index--;
+               sprintf(tag, "%d", nic->fw_index);
+       }
+
+       if (nic->fw_index < cfg->ucode_api_min) {
+               IWL_ERR(nic, "no suitable firmware found!\n");
+               return -ENOENT;
+       }
+
+       sprintf(nic->firmware_name, "%s%s%s", name_pre, tag, ".ucode");
+
+       IWL_DEBUG_INFO(nic, "attempting to load firmware %s'%s'\n",
+                      (nic->fw_index == UCODE_EXPERIMENTAL_INDEX)
+                               ? "EXPERIMENTAL " : "",
+                      nic->firmware_name);
+
+       return request_firmware_nowait(THIS_MODULE, 1, nic->firmware_name,
+                                      trans(nic)->dev,
+                                      GFP_KERNEL, nic, iwl_ucode_callback);
+}
+
+struct iwlagn_firmware_pieces {
+       const void *inst, *data, *init, *init_data, *wowlan_inst, *wowlan_data;
+       size_t inst_size, data_size, init_size, init_data_size,
+              wowlan_inst_size, wowlan_data_size;
+
+       u32 init_evtlog_ptr, init_evtlog_size, init_errlog_ptr;
+       u32 inst_evtlog_ptr, inst_evtlog_size, inst_errlog_ptr;
+};
+
+static int iwl_parse_v1_v2_firmware(struct iwl_nic *nic,
+                                      const struct firmware *ucode_raw,
+                                      struct iwlagn_firmware_pieces *pieces)
+{
+       struct iwl_ucode_header *ucode = (void *)ucode_raw->data;
+       u32 api_ver, hdr_size, build;
+       char buildstr[25];
+       const u8 *src;
+
+       nic->fw.ucode_ver = le32_to_cpu(ucode->ver);
+       api_ver = IWL_UCODE_API(nic->fw.ucode_ver);
+
+       switch (api_ver) {
+       default:
+               hdr_size = 28;
+               if (ucode_raw->size < hdr_size) {
+                       IWL_ERR(nic, "File size too small!\n");
+                       return -EINVAL;
+               }
+               build = le32_to_cpu(ucode->u.v2.build);
+               pieces->inst_size = le32_to_cpu(ucode->u.v2.inst_size);
+               pieces->data_size = le32_to_cpu(ucode->u.v2.data_size);
+               pieces->init_size = le32_to_cpu(ucode->u.v2.init_size);
+               pieces->init_data_size = le32_to_cpu(ucode->u.v2.init_data_size);
+               src = ucode->u.v2.data;
+               break;
+       case 0:
+       case 1:
+       case 2:
+               hdr_size = 24;
+               if (ucode_raw->size < hdr_size) {
+                       IWL_ERR(nic, "File size too small!\n");
+                       return -EINVAL;
+               }
+               build = 0;
+               pieces->inst_size = le32_to_cpu(ucode->u.v1.inst_size);
+               pieces->data_size = le32_to_cpu(ucode->u.v1.data_size);
+               pieces->init_size = le32_to_cpu(ucode->u.v1.init_size);
+               pieces->init_data_size = le32_to_cpu(ucode->u.v1.init_data_size);
+               src = ucode->u.v1.data;
+               break;
+       }
+
+       if (build)
+               sprintf(buildstr, " build %u%s", build,
+                      (nic->fw_index == UCODE_EXPERIMENTAL_INDEX)
+                               ? " (EXP)" : "");
+       else
+               buildstr[0] = '\0';
+
+       snprintf(nic->fw.fw_version,
+                sizeof(nic->fw.fw_version),
+                "%u.%u.%u.%u%s",
+                IWL_UCODE_MAJOR(nic->fw.ucode_ver),
+                IWL_UCODE_MINOR(nic->fw.ucode_ver),
+                IWL_UCODE_API(nic->fw.ucode_ver),
+                IWL_UCODE_SERIAL(nic->fw.ucode_ver),
+                buildstr);
+
+       /* Verify size of file vs. image size info in file's header */
+       if (ucode_raw->size != hdr_size + pieces->inst_size +
+                               pieces->data_size + pieces->init_size +
+                               pieces->init_data_size) {
+
+               IWL_ERR(nic,
+                       "uCode file size %d does not match expected size\n",
+                       (int)ucode_raw->size);
+               return -EINVAL;
+       }
+
+       pieces->inst = src;
+       src += pieces->inst_size;
+       pieces->data = src;
+       src += pieces->data_size;
+       pieces->init = src;
+       src += pieces->init_size;
+       pieces->init_data = src;
+       src += pieces->init_data_size;
+
+       return 0;
+}
+
+static int iwl_parse_tlv_firmware(struct iwl_nic *nic,
+                               const struct firmware *ucode_raw,
+                               struct iwlagn_firmware_pieces *pieces,
+                               struct iwl_ucode_capabilities *capa)
+{
+       struct iwl_tlv_ucode_header *ucode = (void *)ucode_raw->data;
+       struct iwl_ucode_tlv *tlv;
+       size_t len = ucode_raw->size;
+       const u8 *data;
+       int wanted_alternative = iwlagn_mod_params.wanted_ucode_alternative;
+       int tmp;
+       u64 alternatives;
+       u32 tlv_len;
+       enum iwl_ucode_tlv_type tlv_type;
+       const u8 *tlv_data;
+       char buildstr[25];
+       u32 build;
+
+       if (len < sizeof(*ucode)) {
+               IWL_ERR(nic, "uCode has invalid length: %zd\n", len);
+               return -EINVAL;
+       }
+
+       if (ucode->magic != cpu_to_le32(IWL_TLV_UCODE_MAGIC)) {
+               IWL_ERR(nic, "invalid uCode magic: 0X%x\n",
+                       le32_to_cpu(ucode->magic));
+               return -EINVAL;
+       }
+
+       /*
+        * Check which alternatives are present, and "downgrade"
+        * when the chosen alternative is not present, warning
+        * the user when that happens. Some files may not have
+        * any alternatives, so don't warn in that case.
+        */
+       alternatives = le64_to_cpu(ucode->alternatives);
+       tmp = wanted_alternative;
+       if (wanted_alternative > 63)
+               wanted_alternative = 63;
+       while (wanted_alternative && !(alternatives & BIT(wanted_alternative)))
+               wanted_alternative--;
+       if (wanted_alternative && wanted_alternative != tmp)
+               IWL_WARN(nic,
+                        "uCode alternative %d not available, choosing %d\n",
+                        tmp, wanted_alternative);
+
+       nic->fw.ucode_ver = le32_to_cpu(ucode->ver);
+       build = le32_to_cpu(ucode->build);
+
+       if (build)
+               sprintf(buildstr, " build %u%s", build,
+                      (nic->fw_index == UCODE_EXPERIMENTAL_INDEX)
+                               ? " (EXP)" : "");
+       else
+               buildstr[0] = '\0';
+
+       snprintf(nic->fw.fw_version,
+                sizeof(nic->fw.fw_version),
+                "%u.%u.%u.%u%s",
+                IWL_UCODE_MAJOR(nic->fw.ucode_ver),
+                IWL_UCODE_MINOR(nic->fw.ucode_ver),
+                IWL_UCODE_API(nic->fw.ucode_ver),
+                IWL_UCODE_SERIAL(nic->fw.ucode_ver),
+                buildstr);
+
+       data = ucode->data;
+
+       len -= sizeof(*ucode);
+
+       while (len >= sizeof(*tlv)) {
+               u16 tlv_alt;
+
+               len -= sizeof(*tlv);
+               tlv = (void *)data;
+
+               tlv_len = le32_to_cpu(tlv->length);
+               tlv_type = le16_to_cpu(tlv->type);
+               tlv_alt = le16_to_cpu(tlv->alternative);
+               tlv_data = tlv->data;
+
+               if (len < tlv_len) {
+                       IWL_ERR(nic, "invalid TLV len: %zd/%u\n",
+                               len, tlv_len);
+                       return -EINVAL;
+               }
+               len -= ALIGN(tlv_len, 4);
+               data += sizeof(*tlv) + ALIGN(tlv_len, 4);
+
+               /*
+                * Alternative 0 is always valid.
+                *
+                * Skip alternative TLVs that are not selected.
+                */
+               if (tlv_alt != 0 && tlv_alt != wanted_alternative)
+                       continue;
+
+               switch (tlv_type) {
+               case IWL_UCODE_TLV_INST:
+                       pieces->inst = tlv_data;
+                       pieces->inst_size = tlv_len;
+                       break;
+               case IWL_UCODE_TLV_DATA:
+                       pieces->data = tlv_data;
+                       pieces->data_size = tlv_len;
+                       break;
+               case IWL_UCODE_TLV_INIT:
+                       pieces->init = tlv_data;
+                       pieces->init_size = tlv_len;
+                       break;
+               case IWL_UCODE_TLV_INIT_DATA:
+                       pieces->init_data = tlv_data;
+                       pieces->init_data_size = tlv_len;
+                       break;
+               case IWL_UCODE_TLV_BOOT:
+                       IWL_ERR(nic, "Found unexpected BOOT ucode\n");
+                       break;
+               case IWL_UCODE_TLV_PROBE_MAX_LEN:
+                       if (tlv_len != sizeof(u32))
+                               goto invalid_tlv_len;
+                       capa->max_probe_length =
+                                       le32_to_cpup((__le32 *)tlv_data);
+                       break;
+               case IWL_UCODE_TLV_PAN:
+                       if (tlv_len)
+                               goto invalid_tlv_len;
+                       capa->flags |= IWL_UCODE_TLV_FLAGS_PAN;
+                       break;
+               case IWL_UCODE_TLV_FLAGS:
+                       /* must be at least one u32 */
+                       if (tlv_len < sizeof(u32))
+                               goto invalid_tlv_len;
+                       /* and a proper number of u32s */
+                       if (tlv_len % sizeof(u32))
+                               goto invalid_tlv_len;
+                       /*
+                        * This driver only reads the first u32 as
+                        * right now no more features are defined,
+                        * if that changes then either the driver
+                        * will not work with the new firmware, or
+                        * it'll not take advantage of new features.
+                        */
+                       capa->flags = le32_to_cpup((__le32 *)tlv_data);
+                       break;
+               case IWL_UCODE_TLV_INIT_EVTLOG_PTR:
+                       if (tlv_len != sizeof(u32))
+                               goto invalid_tlv_len;
+                       pieces->init_evtlog_ptr =
+                                       le32_to_cpup((__le32 *)tlv_data);
+                       break;
+               case IWL_UCODE_TLV_INIT_EVTLOG_SIZE:
+                       if (tlv_len != sizeof(u32))
+                               goto invalid_tlv_len;
+                       pieces->init_evtlog_size =
+                                       le32_to_cpup((__le32 *)tlv_data);
+                       break;
+               case IWL_UCODE_TLV_INIT_ERRLOG_PTR:
+                       if (tlv_len != sizeof(u32))
+                               goto invalid_tlv_len;
+                       pieces->init_errlog_ptr =
+                                       le32_to_cpup((__le32 *)tlv_data);
+                       break;
+               case IWL_UCODE_TLV_RUNT_EVTLOG_PTR:
+                       if (tlv_len != sizeof(u32))
+                               goto invalid_tlv_len;
+                       pieces->inst_evtlog_ptr =
+                                       le32_to_cpup((__le32 *)tlv_data);
+                       break;
+               case IWL_UCODE_TLV_RUNT_EVTLOG_SIZE:
+                       if (tlv_len != sizeof(u32))
+                               goto invalid_tlv_len;
+                       pieces->inst_evtlog_size =
+                                       le32_to_cpup((__le32 *)tlv_data);
+                       break;
+               case IWL_UCODE_TLV_RUNT_ERRLOG_PTR:
+                       if (tlv_len != sizeof(u32))
+                               goto invalid_tlv_len;
+                       pieces->inst_errlog_ptr =
+                                       le32_to_cpup((__le32 *)tlv_data);
+                       break;
+               case IWL_UCODE_TLV_ENHANCE_SENS_TBL:
+                       if (tlv_len)
+                               goto invalid_tlv_len;
+                       nic->fw.enhance_sensitivity_table = true;
+                       break;
+               case IWL_UCODE_TLV_WOWLAN_INST:
+                       pieces->wowlan_inst = tlv_data;
+                       pieces->wowlan_inst_size = tlv_len;
+                       break;
+               case IWL_UCODE_TLV_WOWLAN_DATA:
+                       pieces->wowlan_data = tlv_data;
+                       pieces->wowlan_data_size = tlv_len;
+                       break;
+               case IWL_UCODE_TLV_PHY_CALIBRATION_SIZE:
+                       if (tlv_len != sizeof(u32))
+                               goto invalid_tlv_len;
+                       capa->standard_phy_calibration_size =
+                                       le32_to_cpup((__le32 *)tlv_data);
+                       break;
+               default:
+                       IWL_DEBUG_INFO(nic, "unknown TLV: %d\n", tlv_type);
+                       break;
+               }
+       }
+
+       if (len) {
+               IWL_ERR(nic, "invalid TLV after parsing: %zd\n", len);
+               iwl_print_hex_dump(nic, IWL_DL_FW, (u8 *)data, len);
+               return -EINVAL;
+       }
+
+       return 0;
+
+ invalid_tlv_len:
+       IWL_ERR(nic, "TLV %d has invalid size: %u\n", tlv_type, tlv_len);
+       iwl_print_hex_dump(nic, IWL_DL_FW, tlv_data, tlv_len);
+
+       return -EINVAL;
+}
+
+/**
+ * iwl_ucode_callback - callback when firmware was loaded
+ *
+ * If loaded successfully, copies the firmware into buffers
+ * for the card to fetch (via DMA).
+ */
+static void iwl_ucode_callback(const struct firmware *ucode_raw, void *context)
+{
+       struct iwl_nic *nic = context;
+       struct iwl_cfg *cfg = cfg(nic);
+       struct iwl_fw *fw = &nic->fw;
+       struct iwl_ucode_header *ucode;
+       int err;
+       struct iwlagn_firmware_pieces pieces;
+       const unsigned int api_max = cfg->ucode_api_max;
+       unsigned int api_ok = cfg->ucode_api_ok;
+       const unsigned int api_min = cfg->ucode_api_min;
+       u32 api_ver;
+
+       fw->ucode_capa.max_probe_length = 200;
+       fw->ucode_capa.standard_phy_calibration_size =
+                       IWL_DEFAULT_STANDARD_PHY_CALIBRATE_TBL_SIZE;
+
+       if (!api_ok)
+               api_ok = api_max;
+
+       memset(&pieces, 0, sizeof(pieces));
+
+       if (!ucode_raw) {
+               if (nic->fw_index <= api_ok)
+                       IWL_ERR(nic,
+                               "request for firmware file '%s' failed.\n",
+                               nic->firmware_name);
+               goto try_again;
+       }
+
+       IWL_DEBUG_INFO(nic, "Loaded firmware file '%s' (%zd bytes).\n",
+                      nic->firmware_name, ucode_raw->size);
+
+       /* Make sure that we got at least the API version number */
+       if (ucode_raw->size < 4) {
+               IWL_ERR(nic, "File size way too small!\n");
+               goto try_again;
+       }
+
+       /* Data from ucode file:  header followed by uCode images */
+       ucode = (struct iwl_ucode_header *)ucode_raw->data;
+
+       if (ucode->ver)
+               err = iwl_parse_v1_v2_firmware(nic, ucode_raw, &pieces);
+       else
+               err = iwl_parse_tlv_firmware(nic, ucode_raw, &pieces,
+                                          &fw->ucode_capa);
+
+       if (err)
+               goto try_again;
+
+       api_ver = IWL_UCODE_API(nic->fw.ucode_ver);
+
+       /*
+        * api_ver should match the api version forming part of the
+        * firmware filename ... but we don't check for that and only rely
+        * on the API version read from firmware header from here on forward
+        */
+       /* no api version check required for experimental uCode */
+       if (nic->fw_index != UCODE_EXPERIMENTAL_INDEX) {
+               if (api_ver < api_min || api_ver > api_max) {
+                       IWL_ERR(nic,
+                               "Driver unable to support your firmware API. "
+                               "Driver supports v%u, firmware is v%u.\n",
+                               api_max, api_ver);
+                       goto try_again;
+               }
+
+               if (api_ver < api_ok) {
+                       if (api_ok != api_max)
+                               IWL_ERR(nic, "Firmware has old API version, "
+                                       "expected v%u through v%u, got v%u.\n",
+                                       api_ok, api_max, api_ver);
+                       else
+                               IWL_ERR(nic, "Firmware has old API version, "
+                                       "expected v%u, got v%u.\n",
+                                       api_max, api_ver);
+                       IWL_ERR(nic, "New firmware can be obtained from "
+                                     "http://www.intellinuxwireless.org/.\n");
+               }
+       }
+
+       IWL_INFO(nic, "loaded firmware version %s", nic->fw.fw_version);
+
+       /*
+        * For any of the failures below (before allocating pci memory)
+        * we will try to load a version with a smaller API -- maybe the
+        * user just got a corrupted version of the latest API.
+        */
+
+       IWL_DEBUG_INFO(nic, "f/w package hdr ucode version raw = 0x%x\n",
+                      nic->fw.ucode_ver);
+       IWL_DEBUG_INFO(nic, "f/w package hdr runtime inst size = %Zd\n",
+                      pieces.inst_size);
+       IWL_DEBUG_INFO(nic, "f/w package hdr runtime data size = %Zd\n",
+                      pieces.data_size);
+       IWL_DEBUG_INFO(nic, "f/w package hdr init inst size = %Zd\n",
+                      pieces.init_size);
+       IWL_DEBUG_INFO(nic, "f/w package hdr init data size = %Zd\n",
+                      pieces.init_data_size);
+
+       /* Verify that uCode images will fit in card's SRAM */
+       if (pieces.inst_size > cfg->max_inst_size) {
+               IWL_ERR(nic, "uCode instr len %Zd too large to fit in\n",
+                       pieces.inst_size);
+               goto try_again;
+       }
+
+       if (pieces.data_size > cfg->max_data_size) {
+               IWL_ERR(nic, "uCode data len %Zd too large to fit in\n",
+                       pieces.data_size);
+               goto try_again;
+       }
+
+       if (pieces.init_size > cfg->max_inst_size) {
+               IWL_ERR(nic, "uCode init instr len %Zd too large to fit in\n",
+                       pieces.init_size);
+               goto try_again;
+       }
+
+       if (pieces.init_data_size > cfg->max_data_size) {
+               IWL_ERR(nic, "uCode init data len %Zd too large to fit in\n",
+                       pieces.init_data_size);
+               goto try_again;
+       }
+
+       /* Allocate ucode buffers for card's bus-master loading ... */
+
+       /* Runtime instructions and 2 copies of data:
+        * 1) unmodified from disk
+        * 2) backup cache for save/restore during power-downs */
+       if (iwl_alloc_fw_desc(nic, &nic->fw.ucode_rt.code,
+                             pieces.inst, pieces.inst_size))
+               goto err_pci_alloc;
+       if (iwl_alloc_fw_desc(nic, &nic->fw.ucode_rt.data,
+                             pieces.data, pieces.data_size))
+               goto err_pci_alloc;
+
+       /* Initialization instructions and data */
+       if (pieces.init_size && pieces.init_data_size) {
+               if (iwl_alloc_fw_desc(nic,
+                                     &nic->fw.ucode_init.code,
+                                     pieces.init, pieces.init_size))
+                       goto err_pci_alloc;
+               if (iwl_alloc_fw_desc(nic,
+                                     &nic->fw.ucode_init.data,
+                                     pieces.init_data, pieces.init_data_size))
+                       goto err_pci_alloc;
+       }
+
+       /* WoWLAN instructions and data */
+       if (pieces.wowlan_inst_size && pieces.wowlan_data_size) {
+               if (iwl_alloc_fw_desc(nic,
+                                     &nic->fw.ucode_wowlan.code,
+                                     pieces.wowlan_inst,
+                                     pieces.wowlan_inst_size))
+                       goto err_pci_alloc;
+               if (iwl_alloc_fw_desc(nic,
+                                     &nic->fw.ucode_wowlan.data,
+                                     pieces.wowlan_data,
+                                     pieces.wowlan_data_size))
+                       goto err_pci_alloc;
+       }
+
+       /* Now that we can no longer fail, copy information */
+
+       /*
+        * The (size - 16) / 12 formula is based on the information recorded
+        * for each event, which is of mode 1 (including timestamp) for all
+        * new microcodes that include this information.
+        */
+       nic->init_evtlog_ptr = pieces.init_evtlog_ptr;
+       if (pieces.init_evtlog_size)
+               nic->init_evtlog_size = (pieces.init_evtlog_size - 16)/12;
+       else
+               nic->init_evtlog_size =
+                       cfg->base_params->max_event_log_size;
+       nic->init_errlog_ptr = pieces.init_errlog_ptr;
+       nic->inst_evtlog_ptr = pieces.inst_evtlog_ptr;
+       if (pieces.inst_evtlog_size)
+               nic->inst_evtlog_size = (pieces.inst_evtlog_size - 16)/12;
+       else
+               nic->inst_evtlog_size =
+                       cfg->base_params->max_event_log_size;
+       nic->inst_errlog_ptr = pieces.inst_errlog_ptr;
+
+       /*
+        * figure out the offset of chain noise reset and gain commands
+        * base on the size of standard phy calibration commands table size
+        */
+       if (fw->ucode_capa.standard_phy_calibration_size >
+           IWL_MAX_PHY_CALIBRATE_TBL_SIZE)
+               fw->ucode_capa.standard_phy_calibration_size =
+                       IWL_MAX_STANDARD_PHY_CALIBRATE_TBL_SIZE;
+
+       /* We have our copies now, allow OS release its copies */
+       release_firmware(ucode_raw);
+       complete(&nic->request_firmware_complete);
+
+       nic->op_mode = iwl_dvm_ops.start(nic->shrd->trans);
+
+       if (!nic->op_mode)
+               goto out_unbind;
+
+       return;
+
+ try_again:
+       /* try next, if any */
+       release_firmware(ucode_raw);
+       if (iwl_request_firmware(nic, false))
+               goto out_unbind;
+       return;
+
+ err_pci_alloc:
+       IWL_ERR(nic, "failed to allocate pci memory\n");
+       iwl_dealloc_ucode(nic);
+       release_firmware(ucode_raw);
+ out_unbind:
+       complete(&nic->request_firmware_complete);
+       device_release_driver(trans(nic)->dev);
+}
+
diff --git a/drivers/net/wireless/iwlwifi/iwl-ucode.h b/drivers/net/wireless/iwlwifi/iwl-ucode.h
new file mode 100644 (file)
index 0000000..8bebeb0
--- /dev/null
@@ -0,0 +1,220 @@
+/******************************************************************************
+ *
+ * This file is provided under a dual BSD/GPLv2 license.  When using or
+ * redistributing this file, you may do so under either license.
+ *
+ * GPL LICENSE SUMMARY
+ *
+ * Copyright(c) 2008 - 2012 Intel Corporation. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of version 2 of the GNU General Public License as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110,
+ * USA
+ *
+ * The full GNU General Public License is included in this distribution
+ * in the file called LICENSE.GPL.
+ *
+ * Contact Information:
+ *  Intel Linux Wireless <ilw@linux.intel.com>
+ * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
+ *
+ * BSD LICENSE
+ *
+ * Copyright(c) 2005 - 2012 Intel Corporation. All rights reserved.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *  * Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  * Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *  * Neither the name Intel Corporation nor the names of its
+ *    contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *****************************************************************************/
+
+#ifndef __iwl_ucode_h__
+#define __iwl_ucode_h__
+
+#include <linux/netdevice.h>
+
+/* v1/v2 uCode file layout */
+struct iwl_ucode_header {
+       __le32 ver;     /* major/minor/API/serial */
+       union {
+               struct {
+                       __le32 inst_size;       /* bytes of runtime code */
+                       __le32 data_size;       /* bytes of runtime data */
+                       __le32 init_size;       /* bytes of init code */
+                       __le32 init_data_size;  /* bytes of init data */
+                       __le32 boot_size;       /* bytes of bootstrap code */
+                       u8 data[0];             /* in same order as sizes */
+               } v1;
+               struct {
+                       __le32 build;           /* build number */
+                       __le32 inst_size;       /* bytes of runtime code */
+                       __le32 data_size;       /* bytes of runtime data */
+                       __le32 init_size;       /* bytes of init code */
+                       __le32 init_data_size;  /* bytes of init data */
+                       __le32 boot_size;       /* bytes of bootstrap code */
+                       u8 data[0];             /* in same order as sizes */
+               } v2;
+       } u;
+};
+
+/*
+ * new TLV uCode file layout
+ *
+ * The new TLV file format contains TLVs, that each specify
+ * some piece of data. To facilitate "groups", for example
+ * different instruction image with different capabilities,
+ * bundled with the same init image, an alternative mechanism
+ * is provided:
+ * When the alternative field is 0, that means that the item
+ * is always valid. When it is non-zero, then it is only
+ * valid in conjunction with items of the same alternative,
+ * in which case the driver (user) selects one alternative
+ * to use.
+ */
+
+enum iwl_ucode_tlv_type {
+       IWL_UCODE_TLV_INVALID           = 0, /* unused */
+       IWL_UCODE_TLV_INST              = 1,
+       IWL_UCODE_TLV_DATA              = 2,
+       IWL_UCODE_TLV_INIT              = 3,
+       IWL_UCODE_TLV_INIT_DATA         = 4,
+       IWL_UCODE_TLV_BOOT              = 5,
+       IWL_UCODE_TLV_PROBE_MAX_LEN     = 6, /* a u32 value */
+       IWL_UCODE_TLV_PAN               = 7,
+       IWL_UCODE_TLV_RUNT_EVTLOG_PTR   = 8,
+       IWL_UCODE_TLV_RUNT_EVTLOG_SIZE  = 9,
+       IWL_UCODE_TLV_RUNT_ERRLOG_PTR   = 10,
+       IWL_UCODE_TLV_INIT_EVTLOG_PTR   = 11,
+       IWL_UCODE_TLV_INIT_EVTLOG_SIZE  = 12,
+       IWL_UCODE_TLV_INIT_ERRLOG_PTR   = 13,
+       IWL_UCODE_TLV_ENHANCE_SENS_TBL  = 14,
+       IWL_UCODE_TLV_PHY_CALIBRATION_SIZE = 15,
+       IWL_UCODE_TLV_WOWLAN_INST       = 16,
+       IWL_UCODE_TLV_WOWLAN_DATA       = 17,
+       IWL_UCODE_TLV_FLAGS             = 18,
+};
+
+/**
+ * enum iwl_ucode_tlv_flag - ucode API flags
+ * @IWL_UCODE_TLV_FLAGS_PAN: This is PAN capable microcode; this previously
+ *     was a separate TLV but moved here to save space.
+ * @IWL_UCODE_TLV_FLAGS_NEWSCAN: new uCode scan behaviour on hidden SSID,
+ *     treats good CRC threshold as a boolean
+ * @IWL_UCODE_TLV_FLAGS_MFP: This uCode image supports MFP (802.11w).
+ * @IWL_UCODE_TLV_FLAGS_P2P: This uCode image supports P2P.
+ */
+enum iwl_ucode_tlv_flag {
+       IWL_UCODE_TLV_FLAGS_PAN         = BIT(0),
+       IWL_UCODE_TLV_FLAGS_NEWSCAN     = BIT(1),
+       IWL_UCODE_TLV_FLAGS_MFP         = BIT(2),
+       IWL_UCODE_TLV_FLAGS_P2P         = BIT(3),
+};
+
+struct iwl_ucode_tlv {
+       __le16 type;            /* see above */
+       __le16 alternative;     /* see comment */
+       __le32 length;          /* not including type/length fields */
+       u8 data[0];
+};
+
+#define IWL_TLV_UCODE_MAGIC    0x0a4c5749
+
+struct iwl_tlv_ucode_header {
+       /*
+        * The TLV style ucode header is distinguished from
+        * the v1/v2 style header by first four bytes being
+        * zero, as such is an invalid combination of
+        * major/minor/API/serial versions.
+        */
+       __le32 zero;
+       __le32 magic;
+       u8 human_readable[64];
+       __le32 ver;             /* major/minor/API/serial */
+       __le32 build;
+       __le64 alternatives;    /* bitmask of valid alternatives */
+       /*
+        * The data contained herein has a TLV layout,
+        * see above for the TLV header and types.
+        * Note that each TLV is padded to a length
+        * that is a multiple of 4 for alignment.
+        */
+       u8 data[0];
+};
+
+struct iwl_ucode_capabilities {
+       u32 max_probe_length;
+       u32 standard_phy_calibration_size;
+       u32 flags;
+};
+
+/* one for each uCode image (inst/data, boot/init/runtime) */
+struct fw_desc {
+       dma_addr_t p_addr;      /* hardware address */
+       void *v_addr;           /* software address */
+       u32 len;                /* size in bytes */
+};
+
+struct fw_img {
+       struct fw_desc code;    /* firmware code image */
+       struct fw_desc data;    /* firmware data image */
+};
+
+/**
+ * struct iwl_fw - variables associated with the firmware
+ *
+ * @ucode_ver: ucode version from the ucode file
+ * @fw_version: firmware version string
+ * @ucode_rt: run time ucode image
+ * @ucode_init: init ucode image
+ * @ucode_wowlan: wake on wireless ucode image (optional)
+ * @ucode_capa: capabilities parsed from the ucode file.
+ * @enhance_sensitivity_table: device can do enhanced sensitivity.
+ */
+struct iwl_fw {
+
+       u32 ucode_ver;
+
+       char fw_version[ETHTOOL_BUSINFO_LEN];
+
+       /* ucode images */
+       struct fw_img ucode_rt;
+       struct fw_img ucode_init;
+       struct fw_img ucode_wowlan;
+
+       struct iwl_ucode_capabilities ucode_capa;
+       bool enhance_sensitivity_table;
+};
+
+#endif  /* __iwl_ucode_h__ */
index 1850110..d5cba07 100644 (file)
@@ -5,7 +5,7 @@
  *
  * GPL LICENSE SUMMARY
  *
- * Copyright(c) 2008 - 2011 Intel Corporation. All rights reserved.
+ * Copyright(c) 2008 - 2012 Intel Corporation. All rights reserved.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of version 2 of the GNU General Public License as
@@ -30,7 +30,7 @@
  *
  * BSD LICENSE
  *
- * Copyright(c) 2005 - 2011 Intel Corporation. All rights reserved.
+ * Copyright(c) 2005 - 2012 Intel Corporation. All rights reserved.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
 #define __iwl_wifi_h__
 
 #include "iwl-shared.h"
+#include "iwl-ucode.h"
+
+#define UCODE_EXPERIMENTAL_INDEX       100
+
+/**
+ * struct iwl_nic - nic common data
+ * @fw: the iwl_fw structure
+ * @shrd: pointer to common shared structure
+ * @op_mode: the running op_mode
+ * @fw_index: firmware revision to try loading
+ * @firmware_name: composite filename of ucode file to load
+ * @init_evtlog_ptr: event log offset for init ucode.
+ * @init_evtlog_size: event log size for init ucode.
+ * @init_errlog_ptr: error log offfset for init ucode.
+ * @inst_evtlog_ptr: event log offset for runtime ucode.
+ * @inst_evtlog_size: event log size for runtime ucode.
+ * @inst_errlog_ptr: error log offfset for runtime ucode.
+ * @request_firmware_complete: the firmware has been obtained from user space
+ */
+struct iwl_nic {
+       struct iwl_fw fw;
+
+       struct iwl_shared *shrd;
+       struct iwl_op_mode *op_mode;
+
+       int fw_index;                   /* firmware we're trying to load */
+       char firmware_name[25];         /* name of firmware file to load */
+
+       u32 init_evtlog_ptr, init_evtlog_size, init_errlog_ptr;
+       u32 inst_evtlog_ptr, inst_evtlog_size, inst_errlog_ptr;
+
+       struct completion request_firmware_complete;
+};
+
+
+int __must_check iwl_request_firmware(struct iwl_nic *nic, bool first);
+void iwl_dealloc_ucode(struct iwl_nic *nic);
 
 int iwl_send_bt_env(struct iwl_trans *trans, u8 action, u8 type);
 void iwl_send_prio_tbl(struct iwl_trans *trans);
index abb4805..f5f7070 100644 (file)
@@ -144,7 +144,7 @@ TRACE_EVENT(iwm_tx_packets,
 
        TP_printk(
                IWM_PR_FMT " Tx %spacket: eot %d, seq 0x%x, sta_color 0x%x, "
-               "ra_tid 0x%x, credit_group 0x%x, embeded_packets %d, %d bytes",
+               "ra_tid 0x%x, credit_group 0x%x, embedded_packets %d, %d bytes",
                IWM_PR_ARG, !__entry->eot ? "concatenated " : "",
                __entry->eot, __entry->seq, __entry->color, __entry->ra_tid,
                __entry->credit_group, __entry->npkt, __entry->bytes
index 3f7bf4d..234ee88 100644 (file)
@@ -815,10 +815,9 @@ static int if_cs_probe(struct pcmcia_device *p_dev)
        lbs_deb_enter(LBS_DEB_CS);
 
        card = kzalloc(sizeof(struct if_cs_card), GFP_KERNEL);
-       if (!card) {
-               pr_err("error in kzalloc\n");
+       if (!card)
                goto out;
-       }
+
        card->p_dev = p_dev;
        p_dev->priv = card;
 
index b5fbbc7..74da5f1 100644 (file)
@@ -261,10 +261,8 @@ static int if_usb_probe(struct usb_interface *intf,
        udev = interface_to_usbdev(intf);
 
        cardp = kzalloc(sizeof(struct if_usb_card), GFP_KERNEL);
-       if (!cardp) {
-               pr_err("Out of memory allocating private data\n");
+       if (!cardp)
                goto error;
-       }
 
        setup_timer(&cardp->fw_timeout, if_usb_fw_timeo, (unsigned long)cardp);
        init_waitqueue_head(&cardp->fw_wq);
index aff8b57..7ced130 100644 (file)
@@ -153,10 +153,8 @@ static int if_usb_probe(struct usb_interface *intf,
        udev = interface_to_usbdev(intf);
 
        cardp = kzalloc(sizeof(struct if_usb_card), GFP_KERNEL);
-       if (!cardp) {
-               pr_err("Out of memory allocating private data.\n");
+       if (!cardp)
                goto error;
-       }
 
        setup_timer(&cardp->fw_timeout, if_usb_fw_timeo, (unsigned long)cardp);
        init_waitqueue_head(&cardp->fw_wq);
index 4b9e730..ba16f05 100644 (file)
@@ -592,7 +592,7 @@ static void mac80211_hwsim_tx_frame_nl(struct ieee80211_hw *hw,
        return;
 
 nla_put_failure:
-       printk(KERN_DEBUG "mac80211_hwsim: error occured in %s\n", __func__);
+       printk(KERN_DEBUG "mac80211_hwsim: error occurred in %s\n", __func__);
 }
 
 static bool mac80211_hwsim_tx_frame_no_nl(struct ieee80211_hw *hw,
@@ -1564,7 +1564,7 @@ static int hwsim_cloned_frame_received_nl(struct sk_buff *skb_2,
 
        return 0;
 err:
-       printk(KERN_DEBUG "mac80211_hwsim: error occured in %s\n", __func__);
+       printk(KERN_DEBUG "mac80211_hwsim: error occurred in %s\n", __func__);
        goto out;
 out:
        dev_kfree_skb(skb);
@@ -1580,11 +1580,11 @@ static int hwsim_register_received_nl(struct sk_buff *skb_2,
        wmediumd_pid = info->snd_pid;
 
        printk(KERN_DEBUG "mac80211_hwsim: received a REGISTER, "
-       "switching to wmediumd mode with pid %d\n", info->snd_pid);
+              "switching to wmediumd mode with pid %d\n", info->snd_pid);
 
        return 0;
 out:
-       printk(KERN_DEBUG "mac80211_hwsim: error occured in %s\n", __func__);
+       printk(KERN_DEBUG "mac80211_hwsim: error occurred in %s\n", __func__);
        return -EINVAL;
 }
 
@@ -1647,7 +1647,7 @@ static int hwsim_init_netlink(void)
        return 0;
 
 failure:
-       printk(KERN_DEBUG "mac80211_hwsim: error occured in %s\n", __func__);
+       printk(KERN_DEBUG "mac80211_hwsim: error occurred in %s\n", __func__);
        return -EINVAL;
 }
 
index 079e553..ea6832d 100644 (file)
@@ -182,7 +182,8 @@ mwifiex_11n_aggregate_pkt(struct mwifiex_private *priv,
        skb_reserve(skb_aggr, headroom + sizeof(struct txpd));
        tx_info_aggr =  MWIFIEX_SKB_TXCB(skb_aggr);
 
-       tx_info_aggr->bss_index = tx_info_src->bss_index;
+       tx_info_aggr->bss_type = tx_info_src->bss_type;
+       tx_info_aggr->bss_num = tx_info_src->bss_num;
        skb_aggr->priority = skb_src->priority;
 
        do {
index 5b2972b..a460fb0 100644 (file)
@@ -79,7 +79,7 @@ static int
 mwifiex_cfg80211_del_key(struct wiphy *wiphy, struct net_device *netdev,
                         u8 key_index, bool pairwise, const u8 *mac_addr)
 {
-       struct mwifiex_private *priv = mwifiex_cfg80211_get_priv(wiphy);
+       struct mwifiex_private *priv = mwifiex_netdev_get_priv(netdev);
 
        if (mwifiex_set_encode(priv, NULL, 0, key_index, 1)) {
                wiphy_err(wiphy, "deleting the crypto keys\n");
@@ -122,7 +122,7 @@ mwifiex_cfg80211_set_power_mgmt(struct wiphy *wiphy,
                                struct net_device *dev,
                                bool enabled, int timeout)
 {
-       struct mwifiex_private *priv = mwifiex_cfg80211_get_priv(wiphy);
+       struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev);
        u32 ps_mode;
 
        if (timeout)
@@ -143,10 +143,10 @@ mwifiex_cfg80211_set_default_key(struct wiphy *wiphy, struct net_device *netdev,
                                 u8 key_index, bool unicast,
                                 bool multicast)
 {
-       struct mwifiex_private *priv = mwifiex_cfg80211_get_priv(wiphy);
+       struct mwifiex_private *priv = mwifiex_netdev_get_priv(netdev);
 
        /* Return if WEP key not configured */
-       if (priv->sec_info.wep_status == MWIFIEX_802_11_WEP_DISABLED)
+       if (!priv->sec_info.wep_enabled)
                return 0;
 
        if (mwifiex_set_encode(priv, NULL, 0, key_index, 0)) {
@@ -165,7 +165,7 @@ mwifiex_cfg80211_add_key(struct wiphy *wiphy, struct net_device *netdev,
                         u8 key_index, bool pairwise, const u8 *mac_addr,
                         struct key_params *params)
 {
-       struct mwifiex_private *priv = mwifiex_cfg80211_get_priv(wiphy);
+       struct mwifiex_private *priv = mwifiex_netdev_get_priv(netdev);
 
        if (mwifiex_set_encode(priv, params->key, params->key_len,
                                                        key_index, 0)) {
@@ -376,7 +376,12 @@ mwifiex_cfg80211_set_channel(struct wiphy *wiphy, struct net_device *dev,
                             struct ieee80211_channel *chan,
                             enum nl80211_channel_type channel_type)
 {
-       struct mwifiex_private *priv = mwifiex_cfg80211_get_priv(wiphy);
+       struct mwifiex_private *priv;
+
+       if (dev)
+               priv = mwifiex_netdev_get_priv(dev);
+       else
+               priv = mwifiex_cfg80211_get_priv(wiphy);
 
        if (priv->media_connected) {
                wiphy_err(wiphy, "This setting is valid only when station "
@@ -534,6 +539,11 @@ mwifiex_dump_station_info(struct mwifiex_private *priv,
                ret = -EFAULT;
        }
 
+       /* Get DTIM period information from firmware */
+       mwifiex_send_cmd_sync(priv, HostCmd_CMD_802_11_SNMP_MIB,
+                             HostCmd_ACT_GEN_GET, DTIM_PERIOD_I,
+                             &priv->dtim_period);
+
        /*
         * Bit 0 in tx_htinfo indicates that current Tx rate is 11n rate. Valid
         * MCS index values for us are 0 to 7.
@@ -557,6 +567,22 @@ mwifiex_dump_station_info(struct mwifiex_private *priv,
        /* bit rate is in 500 kb/s units. Convert it to 100kb/s units */
        sinfo->txrate.legacy = rate.rate * 5;
 
+       if (priv->bss_mode == NL80211_IFTYPE_STATION) {
+               sinfo->filled |= STATION_INFO_BSS_PARAM;
+               sinfo->bss_param.flags = 0;
+               if (priv->curr_bss_params.bss_descriptor.cap_info_bitmap &
+                                               WLAN_CAPABILITY_SHORT_PREAMBLE)
+                       sinfo->bss_param.flags |=
+                                       BSS_PARAM_FLAGS_SHORT_PREAMBLE;
+               if (priv->curr_bss_params.bss_descriptor.cap_info_bitmap &
+                                               WLAN_CAPABILITY_SHORT_SLOT_TIME)
+                       sinfo->bss_param.flags |=
+                                       BSS_PARAM_FLAGS_SHORT_SLOT_TIME;
+               sinfo->bss_param.dtim_period = priv->dtim_period;
+               sinfo->bss_param.beacon_interval =
+                       priv->curr_bss_params.bss_descriptor.beacon_period;
+       }
+
        return ret;
 }
 
@@ -846,6 +872,7 @@ mwifiex_cfg80211_assoc(struct mwifiex_private *priv, size_t ssid_len, u8 *ssid,
        priv->sec_info.wpa_enabled = false;
        priv->sec_info.wpa2_enabled = false;
        priv->wep_key_curr_index = 0;
+       priv->sec_info.encryption_mode = 0;
        ret = mwifiex_set_encode(priv, NULL, 0, 0, 1);
 
        if (mode == NL80211_IFTYPE_ADHOC) {
@@ -897,12 +924,6 @@ mwifiex_cfg80211_assoc(struct mwifiex_private *priv, size_t ssid_len, u8 *ssid,
                }
        }
 done:
-       /* Do specific SSID scanning */
-       if (mwifiex_request_scan(priv, &req_ssid)) {
-               dev_err(priv->adapter->dev, "scan error\n");
-               return -EFAULT;
-       }
-
        /*
         * Scan entries are valid for some time (15 sec). So we can save one
         * active scan time if we just try cfg80211_get_bss first. If it fails
@@ -1010,7 +1031,7 @@ static int
 mwifiex_cfg80211_join_ibss(struct wiphy *wiphy, struct net_device *dev,
                           struct cfg80211_ibss_params *params)
 {
-       struct mwifiex_private *priv = mwifiex_cfg80211_get_priv(wiphy);
+       struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev);
        int ret = 0;
 
        if (priv->bss_mode != NL80211_IFTYPE_ADHOC) {
@@ -1048,7 +1069,7 @@ done:
 static int
 mwifiex_cfg80211_leave_ibss(struct wiphy *wiphy, struct net_device *dev)
 {
-       struct mwifiex_private *priv = mwifiex_cfg80211_get_priv(wiphy);
+       struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev);
 
        wiphy_dbg(wiphy, "info: disconnecting from essid %pM\n",
                        priv->cfg_bssid);
@@ -1223,7 +1244,6 @@ struct net_device *mwifiex_add_virtual_intf(struct wiphy *wiphy,
                priv->frame_type = MWIFIEX_DATA_FRAME_TYPE_ETH_II;
                priv->bss_priority = 0;
                priv->bss_role = MWIFIEX_BSS_ROLE_STA;
-               priv->bss_index = 0;
                priv->bss_num = 0;
 
                break;
@@ -1287,10 +1307,7 @@ EXPORT_SYMBOL_GPL(mwifiex_add_virtual_intf);
  */
 int mwifiex_del_virtual_intf(struct wiphy *wiphy, struct net_device *dev)
 {
-       struct mwifiex_private *priv = mwifiex_cfg80211_get_priv(wiphy);
-
-       if (!priv || !dev)
-               return 0;
+       struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev);
 
 #ifdef CONFIG_DEBUG_FS
        mwifiex_dev_debugfs_remove(priv);
index 6e0a3ea..6623db6 100644 (file)
@@ -391,7 +391,8 @@ int mwifiex_process_event(struct mwifiex_adapter *adapter)
 
        if (skb) {
                rx_info = MWIFIEX_SKB_RXCB(skb);
-               rx_info->bss_index = priv->bss_index;
+               rx_info->bss_num = priv->bss_num;
+               rx_info->bss_type = priv->bss_type;
        }
 
        if (eventcause != EVENT_PS_SLEEP && eventcause != EVENT_PS_AWAKE) {
index ae17ce0..3735c77 100644 (file)
@@ -102,7 +102,8 @@ struct mwifiex_wait_queue {
 };
 
 struct mwifiex_rxinfo {
-       u8 bss_index;
+       u8 bss_num;
+       u8 bss_type;
        struct sk_buff *parent;
        u8 use_count;
 };
@@ -110,7 +111,8 @@ struct mwifiex_rxinfo {
 struct mwifiex_txinfo {
        u32 status_code;
        u8 flags;
-       u8 bss_index;
+       u8 bss_num;
+       u8 bss_type;
 };
 
 enum mwifiex_wmm_ac_e {
index 51c5417..c826200 100644 (file)
@@ -86,11 +86,6 @@ enum MWIFIEX_802_11_PRIVACY_FILTER {
        MWIFIEX_802_11_PRIV_FILTER_8021X_WEP
 };
 
-enum MWIFIEX_802_11_WEP_STATUS {
-       MWIFIEX_802_11_WEP_ENABLED,
-       MWIFIEX_802_11_WEP_DISABLED,
-};
-
 #define CAL_SNR(RSSI, NF)              ((s16)((s16)(RSSI)-(s16)(NF)))
 
 #define PROPRIETARY_TLV_BASE_ID                 0x0100
index 1d0ec57..e81bf6e 100644 (file)
@@ -82,7 +82,7 @@ static int mwifiex_init_priv(struct mwifiex_private *priv)
        priv->bcn_avg_factor = DEFAULT_BCN_AVG_FACTOR;
        priv->data_avg_factor = DEFAULT_DATA_AVG_FACTOR;
 
-       priv->sec_info.wep_status = MWIFIEX_802_11_WEP_DISABLED;
+       priv->sec_info.wep_enabled = 0;
        priv->sec_info.authentication_mode = NL80211_AUTHTYPE_OPEN_SYSTEM;
        priv->sec_info.encryption_mode = 0;
        for (i = 0; i < ARRAY_SIZE(priv->wep_key); i++)
@@ -280,6 +280,7 @@ static void mwifiex_init_adapter(struct mwifiex_adapter *adapter)
        adapter->adhoc_awake_period = 0;
        memset(&adapter->arp_filter, 0, sizeof(adapter->arp_filter));
        adapter->arp_filter_size = 0;
+       adapter->channel_type = NL80211_CHAN_HT20;
 }
 
 /*
@@ -527,8 +528,9 @@ static void mwifiex_delete_bss_prio_tbl(struct mwifiex_private *priv)
                cur = &adapter->bss_prio_tbl[i].bss_prio_cur;
                lock = &adapter->bss_prio_tbl[i].bss_prio_lock;
                dev_dbg(adapter->dev, "info: delete BSS priority table,"
-                               " index = %d, i = %d, head = %p, cur = %p\n",
-                             priv->bss_index, i, head, *cur);
+                               " bss_type = %d, bss_num = %d, i = %d,"
+                               " head = %p, cur = %p\n",
+                             priv->bss_type, priv->bss_num, i, head, *cur);
                if (*cur) {
                        spin_lock_irqsave(lock, flags);
                        if (list_empty(head)) {
index 0b0eb5e..ee439fc 100644 (file)
@@ -417,7 +417,7 @@ int mwifiex_cmd_802_11_associate(struct mwifiex_private *priv,
        auth_tlv = (struct mwifiex_ie_types_auth_type *) pos;
        auth_tlv->header.type = cpu_to_le16(TLV_TYPE_AUTH_TYPE);
        auth_tlv->header.len = cpu_to_le16(sizeof(auth_tlv->auth_type));
-       if (priv->sec_info.wep_status == MWIFIEX_802_11_WEP_ENABLED)
+       if (priv->sec_info.wep_enabled)
                auth_tlv->auth_type = cpu_to_le16(
                                (u16) priv->sec_info.authentication_mode);
        else
@@ -1069,8 +1069,7 @@ mwifiex_cmd_802_11_ad_hoc_join(struct mwifiex_private *priv,
        priv->curr_bss_params.bss_descriptor.channel = bss_desc->channel;
        priv->curr_bss_params.band = (u8) bss_desc->bss_band;
 
-       if (priv->sec_info.wep_status == MWIFIEX_802_11_WEP_ENABLED
-           || priv->sec_info.wpa_enabled)
+       if (priv->sec_info.wep_enabled || priv->sec_info.wpa_enabled)
                tmp_cap |= WLAN_CAPABILITY_PRIVACY;
 
        if (IS_SUPPORT_MULTI_BANDS(priv->adapter)) {
index b728f54..790a379 100644 (file)
@@ -424,8 +424,8 @@ mwifiex_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
        struct sk_buff *new_skb;
        struct mwifiex_txinfo *tx_info;
 
-       dev_dbg(priv->adapter->dev, "data: %lu BSS(%d): Data <= kernel\n",
-                               jiffies, priv->bss_index);
+       dev_dbg(priv->adapter->dev, "data: %lu BSS(%d-%d): Data <= kernel\n",
+                               jiffies, priv->bss_type, priv->bss_num);
 
        if (priv->adapter->surprise_removed) {
                kfree_skb(skb);
@@ -458,10 +458,11 @@ mwifiex_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
        }
 
        tx_info = MWIFIEX_SKB_TXCB(skb);
-       tx_info->bss_index = priv->bss_index;
+       tx_info->bss_num = priv->bss_num;
+       tx_info->bss_type = priv->bss_type;
        mwifiex_fill_buffer(skb);
 
-       mwifiex_wmm_add_buf_txqueue(priv->adapter, skb);
+       mwifiex_wmm_add_buf_txqueue(priv, skb);
        atomic_inc(&priv->adapter->tx_pending);
 
        if (atomic_read(&priv->adapter->tx_pending) >= MAX_TX_PENDING) {
@@ -531,8 +532,8 @@ mwifiex_tx_timeout(struct net_device *dev)
 {
        struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev);
 
-       dev_err(priv->adapter->dev, "%lu : Tx timeout, bss_index=%d\n",
-                               jiffies, priv->bss_index);
+       dev_err(priv->adapter->dev, "%lu : Tx timeout, bss_type-num = %d-%d\n",
+                               jiffies, priv->bss_type, priv->bss_num);
        mwifiex_set_trans_start(dev);
        priv->num_tx_timeout++;
 }
@@ -605,18 +606,6 @@ int is_command_pending(struct mwifiex_adapter *adapter)
 }
 
 /*
- * This function returns the correct private structure pointer based
- * upon the BSS number.
- */
-struct mwifiex_private *
-mwifiex_bss_index_to_priv(struct mwifiex_adapter *adapter, u8 bss_index)
-{
-       if (!adapter || (bss_index >= adapter->priv_num))
-               return NULL;
-       return adapter->priv[bss_index];
-}
-
-/*
  * This is the main work queue function.
  *
  * It handles the main process, which in turn handles the complete
index 3186aa4..4c86217 100644 (file)
@@ -217,7 +217,7 @@ struct mwifiex_802_11_security {
        u8 wpa2_enabled;
        u8 wapi_enabled;
        u8 wapi_key_on;
-       enum MWIFIEX_802_11_WEP_STATUS wep_status;
+       u8 wep_enabled;
        u32 authentication_mode;
        u32 encryption_mode;
 };
@@ -352,7 +352,6 @@ struct mwifiex_private;
 
 struct mwifiex_private {
        struct mwifiex_adapter *adapter;
-       u8 bss_index;
        u8 bss_type;
        u8 bss_role;
        u8 bss_priority;
@@ -392,6 +391,7 @@ struct mwifiex_private {
        u8 prev_bssid[ETH_ALEN];
        struct mwifiex_current_bss_params curr_bss_params;
        u16 beacon_period;
+       u8 dtim_period;
        u16 listen_interval;
        u16 atim_window;
        u8 adhoc_channel;
@@ -884,8 +884,6 @@ mwifiex_netdev_get_priv(struct net_device *dev)
        return (struct mwifiex_private *) (*(unsigned long *) netdev_priv(dev));
 }
 
-struct mwifiex_private *mwifiex_bss_index_to_priv(struct mwifiex_adapter
-                                               *adapter, u8 bss_index);
 int mwifiex_init_shutdown_fw(struct mwifiex_private *priv,
                             u32 func_init_shutdown);
 int mwifiex_add_card(void *, struct semaphore *, struct mwifiex_if_ops *, u8);
index 4053509..f4fbad9 100644 (file)
@@ -86,10 +86,8 @@ static int mwifiex_pcie_probe(struct pci_dev *pdev,
                                pdev->vendor, pdev->device, pdev->revision);
 
        card = kzalloc(sizeof(struct pcie_service_card), GFP_KERNEL);
-       if (!card) {
-               pr_err("%s: failed to alloc memory\n", __func__);
+       if (!card)
                return -ENOMEM;
-       }
 
        card->dev = pdev;
 
index 6396d33..8f10038 100644 (file)
@@ -196,9 +196,8 @@ static bool
 mwifiex_is_network_compatible_for_no_sec(struct mwifiex_private *priv,
                                       struct mwifiex_bssdescriptor *bss_desc)
 {
-       if (priv->sec_info.wep_status == MWIFIEX_802_11_WEP_DISABLED
-           && !priv->sec_info.wpa_enabled && !priv->sec_info.wpa2_enabled
-           && ((!bss_desc->bcn_wpa_ie) ||
+       if (!priv->sec_info.wep_enabled && !priv->sec_info.wpa_enabled &&
+           !priv->sec_info.wpa2_enabled && ((!bss_desc->bcn_wpa_ie) ||
                ((*(bss_desc->bcn_wpa_ie)).vend_hdr.element_id !=
            WLAN_EID_WPA))
            && ((!bss_desc->bcn_rsn_ie) ||
@@ -219,9 +218,8 @@ static bool
 mwifiex_is_network_compatible_for_static_wep(struct mwifiex_private *priv,
                                       struct mwifiex_bssdescriptor *bss_desc)
 {
-       if (priv->sec_info.wep_status == MWIFIEX_802_11_WEP_ENABLED
-           && !priv->sec_info.wpa_enabled && !priv->sec_info.wpa2_enabled
-           && bss_desc->privacy) {
+       if (priv->sec_info.wep_enabled && !priv->sec_info.wpa_enabled &&
+           !priv->sec_info.wpa2_enabled && bss_desc->privacy) {
                return true;
        }
        return false;
@@ -235,10 +233,9 @@ static bool
 mwifiex_is_network_compatible_for_wpa(struct mwifiex_private *priv,
                                      struct mwifiex_bssdescriptor *bss_desc)
 {
-       if (priv->sec_info.wep_status == MWIFIEX_802_11_WEP_DISABLED
-           && priv->sec_info.wpa_enabled && !priv->sec_info.wpa2_enabled
-           && ((bss_desc->bcn_wpa_ie) && ((*(bss_desc->bcn_wpa_ie)).vend_hdr.
-                                               element_id == WLAN_EID_WPA))
+       if (!priv->sec_info.wep_enabled && priv->sec_info.wpa_enabled &&
+           !priv->sec_info.wpa2_enabled && ((bss_desc->bcn_wpa_ie) &&
+           ((*(bss_desc->bcn_wpa_ie)).vend_hdr.element_id == WLAN_EID_WPA))
           /*
            * Privacy bit may NOT be set in some APs like
            * LinkSys WRT54G && bss_desc->privacy
@@ -253,8 +250,7 @@ mwifiex_is_network_compatible_for_wpa(struct mwifiex_private *priv,
                        (bss_desc->bcn_rsn_ie) ?
                        (*(bss_desc->bcn_rsn_ie)).
                        ieee_hdr.element_id : 0,
-                       (priv->sec_info.wep_status ==
-                       MWIFIEX_802_11_WEP_ENABLED) ? "e" : "d",
+                       (priv->sec_info.wep_enabled) ? "e" : "d",
                        (priv->sec_info.wpa_enabled) ? "e" : "d",
                        (priv->sec_info.wpa2_enabled) ? "e" : "d",
                        priv->sec_info.encryption_mode,
@@ -272,10 +268,9 @@ static bool
 mwifiex_is_network_compatible_for_wpa2(struct mwifiex_private *priv,
                                       struct mwifiex_bssdescriptor *bss_desc)
 {
-       if (priv->sec_info.wep_status == MWIFIEX_802_11_WEP_DISABLED
-          && !priv->sec_info.wpa_enabled && priv->sec_info.wpa2_enabled
-          && ((bss_desc->bcn_rsn_ie) && ((*(bss_desc->bcn_rsn_ie)).ieee_hdr.
-                                               element_id == WLAN_EID_RSN))
+       if (!priv->sec_info.wep_enabled && !priv->sec_info.wpa_enabled &&
+           priv->sec_info.wpa2_enabled && ((bss_desc->bcn_rsn_ie) &&
+           ((*(bss_desc->bcn_rsn_ie)).ieee_hdr.element_id == WLAN_EID_RSN))
           /*
            * Privacy bit may NOT be set in some APs like
            * LinkSys WRT54G && bss_desc->privacy
@@ -290,8 +285,7 @@ mwifiex_is_network_compatible_for_wpa2(struct mwifiex_private *priv,
                        (bss_desc->bcn_rsn_ie) ?
                        (*(bss_desc->bcn_rsn_ie)).
                        ieee_hdr.element_id : 0,
-                       (priv->sec_info.wep_status ==
-                       MWIFIEX_802_11_WEP_ENABLED) ? "e" : "d",
+                       (priv->sec_info.wep_enabled) ? "e" : "d",
                        (priv->sec_info.wpa_enabled) ? "e" : "d",
                        (priv->sec_info.wpa2_enabled) ? "e" : "d",
                        priv->sec_info.encryption_mode,
@@ -309,10 +303,9 @@ static bool
 mwifiex_is_network_compatible_for_adhoc_aes(struct mwifiex_private *priv,
                                       struct mwifiex_bssdescriptor *bss_desc)
 {
-       if (priv->sec_info.wep_status == MWIFIEX_802_11_WEP_DISABLED
-           && !priv->sec_info.wpa_enabled && !priv->sec_info.wpa2_enabled
-           && ((!bss_desc->bcn_wpa_ie) || ((*(bss_desc->bcn_wpa_ie)).vend_hdr.
-                  element_id != WLAN_EID_WPA))
+       if (!priv->sec_info.wep_enabled && !priv->sec_info.wpa_enabled &&
+           !priv->sec_info.wpa2_enabled && ((!bss_desc->bcn_wpa_ie) ||
+           ((*(bss_desc->bcn_wpa_ie)).vend_hdr.element_id != WLAN_EID_WPA))
            && ((!bss_desc->bcn_rsn_ie) || ((*(bss_desc->bcn_rsn_ie)).ieee_hdr.
                   element_id != WLAN_EID_RSN))
            && !priv->sec_info.encryption_mode
@@ -330,10 +323,9 @@ static bool
 mwifiex_is_network_compatible_for_dynamic_wep(struct mwifiex_private *priv,
                                       struct mwifiex_bssdescriptor *bss_desc)
 {
-       if (priv->sec_info.wep_status == MWIFIEX_802_11_WEP_DISABLED
-           && !priv->sec_info.wpa_enabled && !priv->sec_info.wpa2_enabled
-           && ((!bss_desc->bcn_wpa_ie) || ((*(bss_desc->bcn_wpa_ie)).vend_hdr.
-                  element_id != WLAN_EID_WPA))
+       if (!priv->sec_info.wep_enabled && !priv->sec_info.wpa_enabled &&
+           !priv->sec_info.wpa2_enabled && ((!bss_desc->bcn_wpa_ie) ||
+           ((*(bss_desc->bcn_wpa_ie)).vend_hdr.element_id != WLAN_EID_WPA))
            && ((!bss_desc->bcn_rsn_ie) || ((*(bss_desc->bcn_rsn_ie)).ieee_hdr.
                   element_id != WLAN_EID_RSN))
            && priv->sec_info.encryption_mode
@@ -468,8 +460,7 @@ mwifiex_is_network_compatible(struct mwifiex_private *priv,
                       (bss_desc->bcn_rsn_ie) ?
                       (*(bss_desc->bcn_rsn_ie)).ieee_hdr.
                       element_id : 0,
-                      (priv->sec_info.wep_status ==
-                               MWIFIEX_802_11_WEP_ENABLED) ? "e" : "d",
+                      (priv->sec_info.wep_enabled) ? "e" : "d",
                       (priv->sec_info.wpa_enabled) ? "e" : "d",
                       (priv->sec_info.wpa2_enabled) ? "e" : "d",
                       priv->sec_info.encryption_mode, bss_desc->privacy);
@@ -2001,7 +1992,7 @@ mwifiex_save_curr_bcn(struct mwifiex_private *priv)
 
                kfree(priv->curr_bcn_buf);
                priv->curr_bcn_buf = kmalloc(curr_bss->beacon_buf_size,
-                                               GFP_KERNEL);
+                                               GFP_ATOMIC);
                if (!priv->curr_bcn_buf) {
                        dev_err(priv->adapter->dev,
                                        "failed to alloc curr_bcn_buf\n");
index d39d845..8359027 100644 (file)
@@ -70,10 +70,8 @@ mwifiex_sdio_probe(struct sdio_func *func, const struct sdio_device_id *id)
               func->vendor, func->device, func->class, func->num);
 
        card = kzalloc(sizeof(struct sdio_mmc_card), GFP_KERNEL);
-       if (!card) {
-               pr_err("%s: failed to alloc memory\n", __func__);
+       if (!card)
                return -ENOMEM;
-       }
 
        card->func = func;
 
index 6e443ff..324c651 100644 (file)
@@ -103,7 +103,7 @@ static int mwifiex_cmd_mac_control(struct mwifiex_private *priv,
 static int mwifiex_cmd_802_11_snmp_mib(struct mwifiex_private *priv,
                                       struct host_cmd_ds_command *cmd,
                                       u16 cmd_action, u32 cmd_oid,
-                                      u32 *ul_temp)
+                                      u16 *ul_temp)
 {
        struct host_cmd_ds_802_11_snmp_mib *snmp_mib = &cmd->params.smib;
 
@@ -112,62 +112,18 @@ static int mwifiex_cmd_802_11_snmp_mib(struct mwifiex_private *priv,
        cmd->size = cpu_to_le16(sizeof(struct host_cmd_ds_802_11_snmp_mib)
                - 1 + S_DS_GEN);
 
+       snmp_mib->oid = cpu_to_le16((u16)cmd_oid);
        if (cmd_action == HostCmd_ACT_GEN_GET) {
                snmp_mib->query_type = cpu_to_le16(HostCmd_ACT_GEN_GET);
                snmp_mib->buf_size = cpu_to_le16(MAX_SNMP_BUF_SIZE);
-               cmd->size = cpu_to_le16(le16_to_cpu(cmd->size)
-                       + MAX_SNMP_BUF_SIZE);
+               le16_add_cpu(&cmd->size, MAX_SNMP_BUF_SIZE);
+       } else if (cmd_action == HostCmd_ACT_GEN_SET) {
+               snmp_mib->query_type = cpu_to_le16(HostCmd_ACT_GEN_SET);
+               snmp_mib->buf_size = cpu_to_le16(sizeof(u16));
+               *((__le16 *) (snmp_mib->value)) = cpu_to_le16(*ul_temp);
+               le16_add_cpu(&cmd->size, sizeof(u16));
        }
 
-       switch (cmd_oid) {
-       case FRAG_THRESH_I:
-               snmp_mib->oid = cpu_to_le16((u16) FRAG_THRESH_I);
-               if (cmd_action == HostCmd_ACT_GEN_SET) {
-                       snmp_mib->query_type = cpu_to_le16(HostCmd_ACT_GEN_SET);
-                       snmp_mib->buf_size = cpu_to_le16(sizeof(u16));
-                       *((__le16 *) (snmp_mib->value)) =
-                               cpu_to_le16((u16) *ul_temp);
-                       cmd->size = cpu_to_le16(le16_to_cpu(cmd->size)
-                               + sizeof(u16));
-               }
-               break;
-       case RTS_THRESH_I:
-               snmp_mib->oid = cpu_to_le16((u16) RTS_THRESH_I);
-               if (cmd_action == HostCmd_ACT_GEN_SET) {
-                       snmp_mib->query_type = cpu_to_le16(HostCmd_ACT_GEN_SET);
-                       snmp_mib->buf_size = cpu_to_le16(sizeof(u16));
-                       *(__le16 *) (snmp_mib->value) =
-                               cpu_to_le16((u16) *ul_temp);
-                       cmd->size = cpu_to_le16(le16_to_cpu(cmd->size)
-                               + sizeof(u16));
-               }
-               break;
-
-       case SHORT_RETRY_LIM_I:
-               snmp_mib->oid = cpu_to_le16((u16) SHORT_RETRY_LIM_I);
-               if (cmd_action == HostCmd_ACT_GEN_SET) {
-                       snmp_mib->query_type = cpu_to_le16(HostCmd_ACT_GEN_SET);
-                       snmp_mib->buf_size = cpu_to_le16(sizeof(u16));
-                       *((__le16 *) (snmp_mib->value)) =
-                               cpu_to_le16((u16) *ul_temp);
-                       cmd->size = cpu_to_le16(le16_to_cpu(cmd->size)
-                               + sizeof(u16));
-               }
-               break;
-       case DOT11D_I:
-               snmp_mib->oid = cpu_to_le16((u16) DOT11D_I);
-               if (cmd_action == HostCmd_ACT_GEN_SET) {
-                       snmp_mib->query_type = cpu_to_le16(HostCmd_ACT_GEN_SET);
-                       snmp_mib->buf_size = cpu_to_le16(sizeof(u16));
-                       *((__le16 *) (snmp_mib->value)) =
-                               cpu_to_le16((u16) *ul_temp);
-                       cmd->size = cpu_to_le16(le16_to_cpu(cmd->size)
-                               + sizeof(u16));
-               }
-               break;
-       default:
-               break;
-       }
        dev_dbg(priv->adapter->dev,
                "cmd: SNMP_CMD: Action=0x%x, OID=0x%x, OIDSize=0x%x,"
                " Value=0x%x\n",
index e812db8..0d8618a 100644 (file)
@@ -210,6 +210,9 @@ static int mwifiex_ret_802_11_snmp_mib(struct mwifiex_private *priv,
                        dev_dbg(priv->adapter->dev,
                                "info: SNMP_RESP: TxRetryCount=%u\n", ul_temp);
                        break;
+               case DTIM_PERIOD_I:
+                       dev_dbg(priv->adapter->dev,
+                               "info: SNMP_RESP: DTIM period=%u\n", ul_temp);
                default:
                        break;
                }
index b0fbf5d..866026e 100644 (file)
@@ -471,7 +471,7 @@ int mwifiex_get_bss_info(struct mwifiex_private *priv,
 
        info->bcn_nf_last = priv->bcn_nf_last;
 
-       if (priv->sec_info.wep_status == MWIFIEX_802_11_WEP_ENABLED)
+       if (priv->sec_info.wep_enabled)
                info->wep_status = true;
        else
                info->wep_status = false;
@@ -1020,7 +1020,7 @@ static int mwifiex_sec_ioctl_set_wep_key(struct mwifiex_private *priv,
        wep_key = &priv->wep_key[priv->wep_key_curr_index];
        index = encrypt_key->key_index;
        if (encrypt_key->key_disable) {
-               priv->sec_info.wep_status = MWIFIEX_802_11_WEP_DISABLED;
+               priv->sec_info.wep_enabled = 0;
        } else if (!encrypt_key->key_len) {
                /* Copy the required key as the current key */
                wep_key = &priv->wep_key[index];
@@ -1030,7 +1030,7 @@ static int mwifiex_sec_ioctl_set_wep_key(struct mwifiex_private *priv,
                        return -1;
                }
                priv->wep_key_curr_index = (u16) index;
-               priv->sec_info.wep_status = MWIFIEX_802_11_WEP_ENABLED;
+               priv->sec_info.wep_enabled = 1;
        } else {
                wep_key = &priv->wep_key[index];
                memset(wep_key, 0, sizeof(struct mwifiex_wep_key));
@@ -1040,7 +1040,7 @@ static int mwifiex_sec_ioctl_set_wep_key(struct mwifiex_private *priv,
                       encrypt_key->key_len);
                wep_key->key_index = index;
                wep_key->key_length = encrypt_key->key_len;
-               priv->sec_info.wep_status = MWIFIEX_802_11_WEP_ENABLED;
+               priv->sec_info.wep_enabled = 1;
        }
        if (wep_key->key_length) {
                /* Send request to firmware */
@@ -1050,7 +1050,7 @@ static int mwifiex_sec_ioctl_set_wep_key(struct mwifiex_private *priv,
                if (ret)
                        return ret;
        }
-       if (priv->sec_info.wep_status == MWIFIEX_802_11_WEP_ENABLED)
+       if (priv->sec_info.wep_enabled)
                priv->curr_pkt_filter |= HostCmd_ACT_MAC_WEP_ENABLE;
        else
                priv->curr_pkt_filter &= ~HostCmd_ACT_MAC_WEP_ENABLE;
index 5e1ef7e..d7a5d76 100644 (file)
@@ -43,7 +43,8 @@ int mwifiex_process_rx_packet(struct mwifiex_adapter *adapter,
 {
        int ret;
        struct mwifiex_rxinfo *rx_info = MWIFIEX_SKB_RXCB(skb);
-       struct mwifiex_private *priv = adapter->priv[rx_info->bss_index];
+       struct mwifiex_private *priv = mwifiex_get_priv_by_id(adapter,
+                       rx_info->bss_num, rx_info->bss_type);
        struct rx_packet_hdr *rx_pkt_hdr;
        struct rxpd *local_rx_pd;
        int hdr_chop;
@@ -124,7 +125,8 @@ int mwifiex_process_sta_rx_packet(struct mwifiex_adapter *adapter,
        struct rx_packet_hdr *rx_pkt_hdr;
        u8 ta[ETH_ALEN];
        u16 rx_pkt_type;
-       struct mwifiex_private *priv = adapter->priv[rx_info->bss_index];
+       struct mwifiex_private *priv = mwifiex_get_priv_by_id(adapter,
+                       rx_info->bss_num, rx_info->bss_type);
 
        if (!priv)
                return -1;
index d97facd..94d31a9 100644 (file)
@@ -136,7 +136,8 @@ int mwifiex_send_null_packet(struct mwifiex_private *priv, u8 flags)
                return -1;
 
        tx_info = MWIFIEX_SKB_TXCB(skb);
-       tx_info->bss_index = priv->bss_index;
+       tx_info->bss_num = priv->bss_num;
+       tx_info->bss_type = priv->bss_type;
        skb_reserve(skb, sizeof(struct txpd) + INTF_HEADER_LEN);
        skb_push(skb, sizeof(struct txpd));
 
index d9274a1..9a6eacc 100644 (file)
@@ -48,7 +48,8 @@ int mwifiex_handle_rx_packet(struct mwifiex_adapter *adapter,
        if (!priv)
                priv = mwifiex_get_priv(adapter, MWIFIEX_BSS_ROLE_ANY);
 
-       rx_info->bss_index = priv->bss_index;
+       rx_info->bss_num = priv->bss_num;
+       rx_info->bss_type = priv->bss_type;
 
        return mwifiex_process_sta_rx_packet(adapter, skb);
 }
@@ -130,7 +131,8 @@ int mwifiex_write_data_complete(struct mwifiex_adapter *adapter,
                return 0;
 
        tx_info = MWIFIEX_SKB_TXCB(skb);
-       priv = mwifiex_bss_index_to_priv(adapter, tx_info->bss_index);
+       priv = mwifiex_get_priv_by_id(adapter, tx_info->bss_num,
+                       tx_info->bss_type);
        if (!priv)
                goto done;
 
index 06976f5..9c48f37 100644 (file)
@@ -159,7 +159,8 @@ int mwifiex_recv_packet(struct mwifiex_adapter *adapter, struct sk_buff *skb)
                return -1;
 
        rx_info = MWIFIEX_SKB_RXCB(skb);
-       priv = mwifiex_bss_index_to_priv(adapter, rx_info->bss_index);
+       priv = mwifiex_get_priv_by_id(adapter, rx_info->bss_num,
+                       rx_info->bss_type);
        if (!priv)
                return -1;
 
index 6c239c3..75f79ef 100644 (file)
@@ -599,11 +599,10 @@ mwifiex_is_ralist_valid(struct mwifiex_private *priv,
  * is queued at the list tail.
  */
 void
-mwifiex_wmm_add_buf_txqueue(struct mwifiex_adapter *adapter,
+mwifiex_wmm_add_buf_txqueue(struct mwifiex_private *priv,
                            struct sk_buff *skb)
 {
-       struct mwifiex_txinfo *tx_info = MWIFIEX_SKB_TXCB(skb);
-       struct mwifiex_private *priv = adapter->priv[tx_info->bss_index];
+       struct mwifiex_adapter *adapter = priv->adapter;
        u32 tid;
        struct mwifiex_ra_list_tbl *ra_list;
        u8 ra[ETH_ALEN], tid_down;
index fcea1f6..ec83995 100644 (file)
@@ -80,8 +80,8 @@ mwifiex_wmm_is_ra_list_empty(struct list_head *ra_list_hhead)
        return true;
 }
 
-void mwifiex_wmm_add_buf_txqueue(struct mwifiex_adapter *adapter,
-                                struct sk_buff *skb);
+void mwifiex_wmm_add_buf_txqueue(struct mwifiex_private *priv,
+                                       struct sk_buff *skb);
 void mwifiex_ralist_add(struct mwifiex_private *priv, u8 *ra);
 
 int mwifiex_wmm_lists_empty(struct mwifiex_adapter *adapter);
index dd5aeaf..b48674b 100644 (file)
@@ -402,6 +402,7 @@ static const struct ieee80211_rate mwl8k_rates_50[] = {
 #define MWL8K_CMD_SET_MAC_ADDR         0x0202          /* per-vif */
 #define MWL8K_CMD_SET_RATEADAPT_MODE   0x0203
 #define MWL8K_CMD_GET_WATCHDOG_BITMAP  0x0205
+#define MWL8K_CMD_DEL_MAC_ADDR         0x0206          /* per-vif */
 #define MWL8K_CMD_BSS_START            0x1100          /* per-vif */
 #define MWL8K_CMD_SET_NEW_STN          0x1111          /* per-vif */
 #define MWL8K_CMD_UPDATE_ENCRYPTION    0x1122          /* per-vif */
@@ -1330,7 +1331,7 @@ static int rxq_process(struct ieee80211_hw *hw, int index, int limit)
                                                                wh->addr1);
 
                        if (mwl8k_vif != NULL &&
-                           mwl8k_vif->is_hw_crypto_enabled == true) {
+                           mwl8k_vif->is_hw_crypto_enabled) {
                                /*
                                 * When MMIC ERROR is encountered
                                 * by the firmware, payload is
@@ -1993,8 +1994,7 @@ mwl8k_txq_xmit(struct ieee80211_hw *hw, int index, struct sk_buff *skb)
         */
 
        if (txq->len >= MWL8K_TX_DESCS - 2) {
-               if (mgmtframe == false ||
-                       txq->len == MWL8K_TX_DESCS) {
+               if (!mgmtframe || txq->len == MWL8K_TX_DESCS) {
                        if (start_ba_session) {
                                spin_lock(&priv->stream_lock);
                                mwl8k_remove_stream(hw, stream);
@@ -3430,10 +3430,7 @@ static int mwl8k_cmd_enable_sniffer(struct ieee80211_hw *hw, bool enable)
        return rc;
 }
 
-/*
- * CMD_SET_MAC_ADDR.
- */
-struct mwl8k_cmd_set_mac_addr {
+struct mwl8k_cmd_update_mac_addr {
        struct mwl8k_cmd_pkt header;
        union {
                struct {
@@ -3449,12 +3446,12 @@ struct mwl8k_cmd_set_mac_addr {
 #define MWL8K_MAC_TYPE_PRIMARY_AP              2
 #define MWL8K_MAC_TYPE_SECONDARY_AP            3
 
-static int mwl8k_cmd_set_mac_addr(struct ieee80211_hw *hw,
-                                 struct ieee80211_vif *vif, u8 *mac)
+static int mwl8k_cmd_update_mac_addr(struct ieee80211_hw *hw,
+                                 struct ieee80211_vif *vif, u8 *mac, bool set)
 {
        struct mwl8k_priv *priv = hw->priv;
        struct mwl8k_vif *mwl8k_vif = MWL8K_VIF(vif);
-       struct mwl8k_cmd_set_mac_addr *cmd;
+       struct mwl8k_cmd_update_mac_addr *cmd;
        int mac_type;
        int rc;
 
@@ -3475,7 +3472,11 @@ static int mwl8k_cmd_set_mac_addr(struct ieee80211_hw *hw,
        if (cmd == NULL)
                return -ENOMEM;
 
-       cmd->header.code = cpu_to_le16(MWL8K_CMD_SET_MAC_ADDR);
+       if (set)
+               cmd->header.code = cpu_to_le16(MWL8K_CMD_SET_MAC_ADDR);
+       else
+               cmd->header.code = cpu_to_le16(MWL8K_CMD_DEL_MAC_ADDR);
+
        cmd->header.length = cpu_to_le16(sizeof(*cmd));
        if (priv->ap_fw) {
                cmd->mbss.mac_type = cpu_to_le16(mac_type);
@@ -3491,6 +3492,24 @@ static int mwl8k_cmd_set_mac_addr(struct ieee80211_hw *hw,
 }
 
 /*
+ * MWL8K_CMD_SET_MAC_ADDR.
+ */
+static inline int mwl8k_cmd_set_mac_addr(struct ieee80211_hw *hw,
+                                 struct ieee80211_vif *vif, u8 *mac)
+{
+       return mwl8k_cmd_update_mac_addr(hw, vif, mac, true);
+}
+
+/*
+ * MWL8K_CMD_DEL_MAC_ADDR.
+ */
+static inline int mwl8k_cmd_del_mac_addr(struct ieee80211_hw *hw,
+                                 struct ieee80211_vif *vif, u8 *mac)
+{
+       return mwl8k_cmd_update_mac_addr(hw, vif, mac, false);
+}
+
+/*
  * CMD_SET_RATEADAPT_MODE.
  */
 struct mwl8k_cmd_set_rate_adapt_mode {
@@ -4093,7 +4112,7 @@ static int mwl8k_set_key(struct ieee80211_hw *hw,
                return -EOPNOTSUPP;
 
        if (sta == NULL)
-               addr = hw->wiphy->perm_addr;
+               addr = vif->addr;
        else
                addr = sta->addr;
 
@@ -4542,7 +4561,7 @@ static void mwl8k_remove_interface(struct ieee80211_hw *hw,
        if (priv->ap_fw)
                mwl8k_cmd_set_new_stn_del(hw, vif, vif->addr);
 
-       mwl8k_cmd_set_mac_addr(hw, vif, "\x00\x00\x00\x00\x00\x00");
+       mwl8k_cmd_del_mac_addr(hw, vif, vif->addr);
 
        mwl8k_remove_vif(priv, mwl8k_vif);
 }
index 9fb77d0..dd6c64a 100644 (file)
@@ -941,11 +941,9 @@ void __orinoco_ev_rx(struct net_device *dev, struct hermes *hw)
 
        /* Add desc and skb to rx queue */
        rx_data = kzalloc(sizeof(*rx_data), GFP_ATOMIC);
-       if (!rx_data) {
-               printk(KERN_WARNING "%s: Can't allocate RX packet\n",
-                       dev->name);
+       if (!rx_data)
                goto drop;
-       }
+
        rx_data->desc = desc;
        rx_data->skb = skb;
        list_add_tail(&rx_data->list, &priv->rx_list);
index ae8ce56..f634d45 100644 (file)
@@ -1754,11 +1754,6 @@ static struct usb_driver orinoco_driver = {
        .id_table = ezusb_table,
 };
 
-/* Can't be declared "const" or the whole __initdata section will
- * become const */
-static char version[] __initdata = DRIVER_NAME " " DRIVER_VERSION
-       " (Manuel Estrada Sainz)";
-
 module_usb_driver(orinoco_driver);
 
 MODULE_AUTHOR("Manuel Estrada Sainz");
index af2ca1a..40f4eb7 100644 (file)
@@ -228,6 +228,8 @@ static int p54_add_interface(struct ieee80211_hw *dev,
 {
        struct p54_common *priv = dev->priv;
 
+       vif->driver_flags |= IEEE80211_VIF_BEACON_FILTER;
+
        mutex_lock(&priv->conf_mutex);
        if (priv->mode != NL80211_IFTYPE_MONITOR) {
                mutex_unlock(&priv->conf_mutex);
@@ -734,7 +736,6 @@ struct ieee80211_hw *p54_init_common(size_t priv_data_len)
                     IEEE80211_HW_SIGNAL_DBM |
                     IEEE80211_HW_SUPPORTS_PS |
                     IEEE80211_HW_PS_NULLFUNC_STACK |
-                    IEEE80211_HW_BEACON_FILTER |
                     IEEE80211_HW_REPORTS_TX_ACK_STATUS;
 
        dev->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) |
index 42b97bc..a08a6f0 100644 (file)
@@ -690,7 +690,7 @@ static void p54_tx_80211_header(struct p54_common *priv, struct sk_buff *skb,
        if (!(info->flags & IEEE80211_TX_CTL_ASSIGN_SEQ))
                *flags |= P54_HDR_FLAG_DATA_OUT_SEQNR;
 
-       if (info->flags & IEEE80211_TX_CTL_POLL_RESPONSE)
+       if (info->flags & IEEE80211_TX_CTL_NO_PS_BUFFER)
                *flags |= P54_HDR_FLAG_DATA_OUT_NOCANCEL;
 
        if (info->flags & IEEE80211_TX_CTL_CLEAR_PS_FILT)
index a5224f6..851fa10 100644 (file)
@@ -192,11 +192,9 @@ islpci_mgt_transmit(struct net_device *ndev, int operation, unsigned long oid,
 
        err = -ENOMEM;
        p = buf.mem = kmalloc(frag_len, GFP_KERNEL);
-       if (!buf.mem) {
-               printk(KERN_DEBUG "%s: cannot allocate mgmt frame\n",
-                      ndev->name);
+       if (!buf.mem)
                goto error;
-       }
+
        buf.size = frag_len;
 
        /* create the header directly in the fragment data area */
index a0a7854..299c387 100644 (file)
@@ -163,7 +163,7 @@ config RT2800USB_RT53XX
        depends on EXPERIMENTAL
        ---help---
          This adds support for rt53xx wireless chipset family to the
-         rt2800pci driver.
+         rt2800usb driver.
          Supported chips: RT5370
 
 config RT2800USB_UNKNOWN
index 2571a2f..e5c05d8 100644 (file)
@@ -68,6 +68,7 @@
 #define RF3322                         0x000c
 #define RF3053                         0x000d
 #define RF5370                         0x5370
+#define RF5372                         0x5372
 #define RF5390                         0x5390
 
 /*
  * TX_PIN_CFG:
  */
 #define TX_PIN_CFG                     0x1328
+#define TX_PIN_CFG_PA_PE_DISABLE       0xfcfffff0
 #define TX_PIN_CFG_PA_PE_A0_EN         FIELD32(0x00000001)
 #define TX_PIN_CFG_PA_PE_G0_EN         FIELD32(0x00000002)
 #define TX_PIN_CFG_PA_PE_A1_EN         FIELD32(0x00000004)
 #define TX_PIN_CFG_RFTR_POL            FIELD32(0x00020000)
 #define TX_PIN_CFG_TRSW_EN             FIELD32(0x00040000)
 #define TX_PIN_CFG_TRSW_POL            FIELD32(0x00080000)
+#define TX_PIN_CFG_PA_PE_A2_EN         FIELD32(0x01000000)
+#define TX_PIN_CFG_PA_PE_G2_EN         FIELD32(0x02000000)
+#define TX_PIN_CFG_PA_PE_A2_POL                FIELD32(0x04000000)
+#define TX_PIN_CFG_PA_PE_G2_POL                FIELD32(0x08000000)
+#define TX_PIN_CFG_LNA_PE_A2_EN                FIELD32(0x10000000)
+#define TX_PIN_CFG_LNA_PE_G2_EN                FIELD32(0x20000000)
+#define TX_PIN_CFG_LNA_PE_A2_POL       FIELD32(0x40000000)
+#define TX_PIN_CFG_LNA_PE_G2_POL       FIELD32(0x80000000)
 
 /*
  * TX_BAND_CFG: 0x1 use upper 20MHz, 0x0 use lower 20MHz
@@ -1627,6 +1637,7 @@ struct mac_iveiv_entry {
 
 /*
  * H2M_MAILBOX_CSR: Host-to-MCU Mailbox.
+ * CMD_TOKEN: Command id, 0xff disable status reporting.
  */
 #define H2M_MAILBOX_CSR                        0x7010
 #define H2M_MAILBOX_CSR_ARG0           FIELD32(0x000000ff)
@@ -1636,6 +1647,8 @@ struct mac_iveiv_entry {
 
 /*
  * H2M_MAILBOX_CID:
+ * Free slots contain 0xff. MCU will store command's token to lowest free slot.
+ * If all slots are occupied status will be dropped.
  */
 #define H2M_MAILBOX_CID                        0x7014
 #define H2M_MAILBOX_CID_CMD0           FIELD32(0x000000ff)
@@ -1645,6 +1658,7 @@ struct mac_iveiv_entry {
 
 /*
  * H2M_MAILBOX_STATUS:
+ * Command status will be saved to same slot as command id.
  */
 #define H2M_MAILBOX_STATUS             0x701c
 
@@ -1796,6 +1810,14 @@ struct mac_iveiv_entry {
 #define RFCSR2_RESCAL_EN               FIELD8(0x80)
 
 /*
+ * RFCSR 3:
+ */
+#define RFCSR3_K                       FIELD8(0x0f)
+/* Bits [7-4] for RF3320 (RT3370/RT3390), on other chipsets reserved */
+#define RFCSR3_PA1_BIAS_CCK            FIELD8(0x70);
+#define RFCSR3_PA2_CASCODE_BIAS_CCKK   FIELD8(0x80);
+
+/*
  * FRCSR 5:
  */
 #define RFCSR5_R1                      FIELD8(0x0c)
@@ -1811,10 +1833,12 @@ struct mac_iveiv_entry {
  * RFCSR 7:
  */
 #define RFCSR7_RF_TUNING               FIELD8(0x01)
-#define RFCSR7_R02                             FIELD8(0x07)
-#define RFCSR7_R3                              FIELD8(0x08)
-#define RFCSR7_R45                             FIELD8(0x30)
-#define RFCSR7_R67                             FIELD8(0xc0)
+#define RFCSR7_BIT1                    FIELD8(0x02)
+#define RFCSR7_BIT2                    FIELD8(0x04)
+#define RFCSR7_BIT3                    FIELD8(0x08)
+#define RFCSR7_BIT4                    FIELD8(0x10)
+#define RFCSR7_BIT5                    FIELD8(0x20)
+#define RFCSR7_BITS67                  FIELD8(0xc0)
 
 /*
  * RFCSR 11:
@@ -1839,6 +1863,11 @@ struct mac_iveiv_entry {
 #define RFCSR15_TX_LO2_EN              FIELD8(0x08)
 
 /*
+ * RFCSR 16:
+ */
+#define RFCSR16_TXMIXER_GAIN           FIELD8(0x07)
+
+/*
  * RFCSR 17:
  */
 #define RFCSR17_TXMIXER_GAIN           FIELD8(0x07)
@@ -1867,6 +1896,13 @@ struct mac_iveiv_entry {
 #define RFCSR23_FREQ_OFFSET            FIELD8(0x7f)
 
 /*
+ * RFCSR 24:
+ */
+#define RFCSR24_TX_AGC_FC              FIELD8(0x1f)
+#define RFCSR24_TX_H20M                        FIELD8(0x20)
+#define RFCSR24_TX_CALIB               FIELD8(0x7f)
+
+/*
  * RFCSR 27:
  */
 #define RFCSR27_R1                     FIELD8(0x03)
@@ -1887,6 +1923,7 @@ struct mac_iveiv_entry {
  */
 #define RFCSR31_RX_AGC_FC              FIELD8(0x1f)
 #define RFCSR31_RX_H20M                        FIELD8(0x20)
+#define RFCSR31_RX_CALIB               FIELD8(0x7f)
 
 /*
  * RFCSR 38:
@@ -2093,6 +2130,12 @@ struct mac_iveiv_entry {
 #define EEPROM_RSSI_A2_LNA_A2          FIELD16(0xff00)
 
 /*
+ * EEPROM TXMIXER GAIN A offset (note overlaps with EEPROM RSSI A2).
+ */
+#define EEPROM_TXMIXER_GAIN_A          0x0026
+#define EEPROM_TXMIXER_GAIN_A_VAL      FIELD16(0x0007)
+
+/*
  * EEPROM EIRP Maximum TX power values(unit: dbm)
  */
 #define EEPROM_EIRP_MAX_TX_POWER       0x0027
@@ -2259,6 +2302,12 @@ struct mac_iveiv_entry {
 
 /*
  * MCU mailbox commands.
+ * MCU_SLEEP - go to power-save mode.
+ *             arg1: 1: save as much power as possible, 0: save less power.
+ *             status: 1: success, 2: already asleep,
+ *                     3: maybe MAC is busy so can't finish this task.
+ * MCU_RADIO_OFF
+ *             arg0: 0: do power-saving, NOT turn off radio.
  */
 #define MCU_SLEEP                      0x30
 #define MCU_WAKEUP                     0x31
@@ -2279,7 +2328,10 @@ struct mac_iveiv_entry {
 /*
  * MCU mailbox tokens
  */
-#define TOKEN_WAKUP                    3
+#define TOKEN_SLEEP                    1
+#define TOKEN_RADIO_OFF                        2
+#define TOKEN_WAKEUP                   3
+
 
 /*
  * DMA descriptor defines.
@@ -2422,4 +2474,16 @@ struct mac_iveiv_entry {
  */
 #define EIRP_MAX_TX_POWER_LIMIT        0x50
 
+/*
+ * RT2800 driver data structure
+ */
+struct rt2800_drv_data {
+       u8 calibration_bw20;
+       u8 calibration_bw40;
+       u8 bbp25;
+       u8 bbp26;
+       u8 txmixer_gain_24g;
+       u8 txmixer_gain_5g;
+};
+
 #endif /* RT2800_H */
index 7bef66d..474b5b9 100644 (file)
@@ -402,7 +402,8 @@ int rt2800_load_firmware(struct rt2x00_dev *rt2x00dev,
 
        if (rt2x00_is_pci(rt2x00dev)) {
                if (rt2x00_rt(rt2x00dev, RT3572) ||
-                   rt2x00_rt(rt2x00dev, RT5390)) {
+                   rt2x00_rt(rt2x00dev, RT5390) ||
+                   rt2x00_rt(rt2x00dev, RT5392)) {
                        rt2800_register_read(rt2x00dev, AUX_CTRL, &reg);
                        rt2x00_set_field32(&reg, AUX_CTRL_FORCE_PCIE_CLK, 1);
                        rt2x00_set_field32(&reg, AUX_CTRL_WAKE_PCIE_EN, 1);
@@ -412,18 +413,6 @@ int rt2800_load_firmware(struct rt2x00_dev *rt2x00dev,
        }
 
        /*
-        * Disable DMA, will be reenabled later when enabling
-        * the radio.
-        */
-       rt2800_register_read(rt2x00dev, WPDMA_GLO_CFG, &reg);
-       rt2x00_set_field32(&reg, WPDMA_GLO_CFG_ENABLE_TX_DMA, 0);
-       rt2x00_set_field32(&reg, WPDMA_GLO_CFG_TX_DMA_BUSY, 0);
-       rt2x00_set_field32(&reg, WPDMA_GLO_CFG_ENABLE_RX_DMA, 0);
-       rt2x00_set_field32(&reg, WPDMA_GLO_CFG_RX_DMA_BUSY, 0);
-       rt2x00_set_field32(&reg, WPDMA_GLO_CFG_TX_WRITEBACK_DONE, 1);
-       rt2800_register_write(rt2x00dev, WPDMA_GLO_CFG, reg);
-
-       /*
         * Write firmware to the device.
         */
        rt2800_drv_write_firmware(rt2x00dev, data, len);
@@ -444,10 +433,21 @@ int rt2800_load_firmware(struct rt2x00_dev *rt2x00dev,
        }
 
        /*
+        * Disable DMA, will be reenabled later when enabling
+        * the radio.
+        */
+       rt2800_register_read(rt2x00dev, WPDMA_GLO_CFG, &reg);
+       rt2x00_set_field32(&reg, WPDMA_GLO_CFG_ENABLE_TX_DMA, 0);
+       rt2x00_set_field32(&reg, WPDMA_GLO_CFG_ENABLE_RX_DMA, 0);
+       rt2800_register_write(rt2x00dev, WPDMA_GLO_CFG, reg);
+
+       /*
         * Initialize firmware.
         */
        rt2800_register_write(rt2x00dev, H2M_BBP_AGENT, 0);
        rt2800_register_write(rt2x00dev, H2M_MAILBOX_CSR, 0);
+       if (rt2x00_is_usb(rt2x00dev))
+               rt2800_register_write(rt2x00dev, H2M_INT_SRC, 0);
        msleep(1);
 
        return 0;
@@ -1646,10 +1646,14 @@ static void rt2800_config_channel_rf3xxx(struct rt2x00_dev *rt2x00dev,
                                         struct rf_channel *rf,
                                         struct channel_info *info)
 {
-       u8 rfcsr;
+       struct rt2800_drv_data *drv_data = rt2x00dev->drv_data;
+       u8 rfcsr, calib_tx, calib_rx;
 
        rt2800_rfcsr_write(rt2x00dev, 2, rf->rf1);
-       rt2800_rfcsr_write(rt2x00dev, 3, rf->rf3);
+
+       rt2800_rfcsr_read(rt2x00dev, 3, &rfcsr);
+       rt2x00_set_field8(&rfcsr, RFCSR3_K, rf->rf3);
+       rt2800_rfcsr_write(rt2x00dev, 3, rfcsr);
 
        rt2800_rfcsr_read(rt2x00dev, 6, &rfcsr);
        rt2x00_set_field8(&rfcsr, RFCSR6_R1, rf->rf2);
@@ -1663,16 +1667,82 @@ static void rt2800_config_channel_rf3xxx(struct rt2x00_dev *rt2x00dev,
        rt2x00_set_field8(&rfcsr, RFCSR13_TX_POWER, info->default_power2);
        rt2800_rfcsr_write(rt2x00dev, 13, rfcsr);
 
+       rt2800_rfcsr_read(rt2x00dev, 1, &rfcsr);
+       rt2x00_set_field8(&rfcsr, RFCSR1_RX0_PD, 0);
+       rt2x00_set_field8(&rfcsr, RFCSR1_TX0_PD, 0);
+       if (rt2x00_rt(rt2x00dev, RT3390)) {
+               rt2x00_set_field8(&rfcsr, RFCSR1_RX1_PD,
+                                 rt2x00dev->default_ant.rx_chain_num == 1);
+               rt2x00_set_field8(&rfcsr, RFCSR1_TX1_PD,
+                                 rt2x00dev->default_ant.tx_chain_num == 1);
+       } else {
+               rt2x00_set_field8(&rfcsr, RFCSR1_RX1_PD, 0);
+               rt2x00_set_field8(&rfcsr, RFCSR1_TX1_PD, 0);
+               rt2x00_set_field8(&rfcsr, RFCSR1_RX2_PD, 0);
+               rt2x00_set_field8(&rfcsr, RFCSR1_TX2_PD, 0);
+
+               switch (rt2x00dev->default_ant.tx_chain_num) {
+               case 1:
+                       rt2x00_set_field8(&rfcsr, RFCSR1_TX1_PD, 1);
+                       /* fall through */
+               case 2:
+                       rt2x00_set_field8(&rfcsr, RFCSR1_TX2_PD, 1);
+                       break;
+               }
+
+               switch (rt2x00dev->default_ant.rx_chain_num) {
+               case 1:
+                       rt2x00_set_field8(&rfcsr, RFCSR1_RX1_PD, 1);
+                       /* fall through */
+               case 2:
+                       rt2x00_set_field8(&rfcsr, RFCSR1_RX2_PD, 1);
+                       break;
+               }
+       }
+       rt2800_rfcsr_write(rt2x00dev, 1, rfcsr);
+
+       rt2800_rfcsr_read(rt2x00dev, 30, &rfcsr);
+       rt2x00_set_field8(&rfcsr, RFCSR30_RF_CALIBRATION, 1);
+       rt2800_rfcsr_write(rt2x00dev, 30, rfcsr);
+       msleep(1);
+       rt2x00_set_field8(&rfcsr, RFCSR30_RF_CALIBRATION, 0);
+       rt2800_rfcsr_write(rt2x00dev, 30, rfcsr);
+
        rt2800_rfcsr_read(rt2x00dev, 23, &rfcsr);
        rt2x00_set_field8(&rfcsr, RFCSR23_FREQ_OFFSET, rt2x00dev->freq_offset);
        rt2800_rfcsr_write(rt2x00dev, 23, rfcsr);
 
-       rt2800_rfcsr_write(rt2x00dev, 24,
-                             rt2x00dev->calibration[conf_is_ht40(conf)]);
+       if (rt2x00_rt(rt2x00dev, RT3390)) {
+               calib_tx = conf_is_ht40(conf) ? 0x68 : 0x4f;
+               calib_rx = conf_is_ht40(conf) ? 0x6f : 0x4f;
+       } else {
+               if (conf_is_ht40(conf)) {
+                       calib_tx = drv_data->calibration_bw40;
+                       calib_rx = drv_data->calibration_bw40;
+               } else {
+                       calib_tx = drv_data->calibration_bw20;
+                       calib_rx = drv_data->calibration_bw20;
+               }
+       }
+
+       rt2800_rfcsr_read(rt2x00dev, 24, &rfcsr);
+       rt2x00_set_field8(&rfcsr, RFCSR24_TX_CALIB, calib_tx);
+       rt2800_rfcsr_write(rt2x00dev, 24, rfcsr);
+
+       rt2800_rfcsr_read(rt2x00dev, 31, &rfcsr);
+       rt2x00_set_field8(&rfcsr, RFCSR31_RX_CALIB, calib_rx);
+       rt2800_rfcsr_write(rt2x00dev, 31, rfcsr);
 
        rt2800_rfcsr_read(rt2x00dev, 7, &rfcsr);
        rt2x00_set_field8(&rfcsr, RFCSR7_RF_TUNING, 1);
        rt2800_rfcsr_write(rt2x00dev, 7, rfcsr);
+
+       rt2800_rfcsr_read(rt2x00dev, 30, &rfcsr);
+       rt2x00_set_field8(&rfcsr, RFCSR30_RF_CALIBRATION, 1);
+       rt2800_rfcsr_write(rt2x00dev, 30, rfcsr);
+       msleep(1);
+       rt2x00_set_field8(&rfcsr, RFCSR30_RF_CALIBRATION, 0);
+       rt2800_rfcsr_write(rt2x00dev, 30, rfcsr);
 }
 
 static void rt2800_config_channel_rf3052(struct rt2x00_dev *rt2x00dev,
@@ -1680,12 +1750,13 @@ static void rt2800_config_channel_rf3052(struct rt2x00_dev *rt2x00dev,
                                         struct rf_channel *rf,
                                         struct channel_info *info)
 {
+       struct rt2800_drv_data *drv_data = rt2x00dev->drv_data;
        u8 rfcsr;
        u32 reg;
 
        if (rf->channel <= 14) {
-               rt2800_bbp_write(rt2x00dev, 25, 0x15);
-               rt2800_bbp_write(rt2x00dev, 26, 0x85);
+               rt2800_bbp_write(rt2x00dev, 25, drv_data->bbp25);
+               rt2800_bbp_write(rt2x00dev, 26, drv_data->bbp26);
        } else {
                rt2800_bbp_write(rt2x00dev, 25, 0x09);
                rt2800_bbp_write(rt2x00dev, 26, 0xff);
@@ -1713,8 +1784,7 @@ static void rt2800_config_channel_rf3052(struct rt2x00_dev *rt2x00dev,
        if (rf->channel <= 14) {
                rt2x00_set_field8(&rfcsr, RFCSR12_DR0, 3);
                rt2x00_set_field8(&rfcsr, RFCSR12_TX_POWER,
-                               (info->default_power1 & 0x3) |
-                               ((info->default_power1 & 0xC) << 1));
+                                 info->default_power1);
        } else {
                rt2x00_set_field8(&rfcsr, RFCSR12_DR0, 7);
                rt2x00_set_field8(&rfcsr, RFCSR12_TX_POWER,
@@ -1727,8 +1797,7 @@ static void rt2800_config_channel_rf3052(struct rt2x00_dev *rt2x00dev,
        if (rf->channel <= 14) {
                rt2x00_set_field8(&rfcsr, RFCSR13_DR0, 3);
                rt2x00_set_field8(&rfcsr, RFCSR13_TX_POWER,
-                               (info->default_power2 & 0x3) |
-                               ((info->default_power2 & 0xC) << 1));
+                                 info->default_power2);
        } else {
                rt2x00_set_field8(&rfcsr, RFCSR13_DR0, 7);
                rt2x00_set_field8(&rfcsr, RFCSR13_TX_POWER,
@@ -1738,11 +1807,12 @@ static void rt2800_config_channel_rf3052(struct rt2x00_dev *rt2x00dev,
        rt2800_rfcsr_write(rt2x00dev, 13, rfcsr);
 
        rt2800_rfcsr_read(rt2x00dev, 1, &rfcsr);
-       rt2x00_set_field8(&rfcsr, RFCSR1_RF_BLOCK_EN, 1);
        rt2x00_set_field8(&rfcsr, RFCSR1_RX0_PD, 0);
        rt2x00_set_field8(&rfcsr, RFCSR1_TX0_PD, 0);
        rt2x00_set_field8(&rfcsr, RFCSR1_RX1_PD, 0);
        rt2x00_set_field8(&rfcsr, RFCSR1_TX1_PD, 0);
+       rt2x00_set_field8(&rfcsr, RFCSR1_RX2_PD, 0);
+       rt2x00_set_field8(&rfcsr, RFCSR1_TX2_PD, 0);
        if (test_bit(CAPABILITY_BT_COEXIST, &rt2x00dev->cap_flags)) {
                if (rf->channel <= 14) {
                        rt2x00_set_field8(&rfcsr, RFCSR1_RX0_PD, 1);
@@ -1773,10 +1843,13 @@ static void rt2800_config_channel_rf3052(struct rt2x00_dev *rt2x00dev,
        rt2x00_set_field8(&rfcsr, RFCSR23_FREQ_OFFSET, rt2x00dev->freq_offset);
        rt2800_rfcsr_write(rt2x00dev, 23, rfcsr);
 
-       rt2800_rfcsr_write(rt2x00dev, 24,
-                             rt2x00dev->calibration[conf_is_ht40(conf)]);
-       rt2800_rfcsr_write(rt2x00dev, 31,
-                             rt2x00dev->calibration[conf_is_ht40(conf)]);
+       if (conf_is_ht40(conf)) {
+               rt2800_rfcsr_write(rt2x00dev, 24, drv_data->calibration_bw40);
+               rt2800_rfcsr_write(rt2x00dev, 31, drv_data->calibration_bw40);
+       } else {
+               rt2800_rfcsr_write(rt2x00dev, 24, drv_data->calibration_bw20);
+               rt2800_rfcsr_write(rt2x00dev, 31, drv_data->calibration_bw20);
+       }
 
        if (rf->channel <= 14) {
                rt2800_rfcsr_write(rt2x00dev, 7, 0xd8);
@@ -1784,7 +1857,10 @@ static void rt2800_config_channel_rf3052(struct rt2x00_dev *rt2x00dev,
                rt2800_rfcsr_write(rt2x00dev, 10, 0xf1);
                rt2800_rfcsr_write(rt2x00dev, 11, 0xb9);
                rt2800_rfcsr_write(rt2x00dev, 15, 0x53);
-               rt2800_rfcsr_write(rt2x00dev, 16, 0x4c);
+               rfcsr = 0x4c;
+               rt2x00_set_field8(&rfcsr, RFCSR16_TXMIXER_GAIN,
+                                 drv_data->txmixer_gain_24g);
+               rt2800_rfcsr_write(rt2x00dev, 16, rfcsr);
                rt2800_rfcsr_write(rt2x00dev, 17, 0x23);
                rt2800_rfcsr_write(rt2x00dev, 19, 0x93);
                rt2800_rfcsr_write(rt2x00dev, 20, 0xb3);
@@ -1793,12 +1869,20 @@ static void rt2800_config_channel_rf3052(struct rt2x00_dev *rt2x00dev,
                rt2800_rfcsr_write(rt2x00dev, 27, 0x00);
                rt2800_rfcsr_write(rt2x00dev, 29, 0x9b);
        } else {
-               rt2800_rfcsr_write(rt2x00dev, 7, 0x14);
+               rt2800_rfcsr_read(rt2x00dev, 7, &rfcsr);
+               rt2x00_set_field8(&rfcsr, RFCSR7_BIT2, 1);
+               rt2x00_set_field8(&rfcsr, RFCSR7_BIT3, 0);
+               rt2x00_set_field8(&rfcsr, RFCSR7_BIT4, 1);
+               rt2x00_set_field8(&rfcsr, RFCSR7_BITS67, 0);
+               rt2800_rfcsr_write(rt2x00dev, 7, rfcsr);
                rt2800_rfcsr_write(rt2x00dev, 9, 0xc0);
                rt2800_rfcsr_write(rt2x00dev, 10, 0xf1);
                rt2800_rfcsr_write(rt2x00dev, 11, 0x00);
                rt2800_rfcsr_write(rt2x00dev, 15, 0x43);
-               rt2800_rfcsr_write(rt2x00dev, 16, 0x7a);
+               rfcsr = 0x7a;
+               rt2x00_set_field8(&rfcsr, RFCSR16_TXMIXER_GAIN,
+                                 drv_data->txmixer_gain_5g);
+               rt2800_rfcsr_write(rt2x00dev, 16, rfcsr);
                rt2800_rfcsr_write(rt2x00dev, 17, 0x23);
                if (rf->channel <= 64) {
                        rt2800_rfcsr_write(rt2x00dev, 19, 0xb7);
@@ -1906,7 +1990,8 @@ static void rt2800_config_channel_rf53xx(struct rt2x00_dev *rt2x00dev,
                                                   r55_nonbt_rev[idx]);
                                rt2800_rfcsr_write(rt2x00dev, 59,
                                                   r59_nonbt_rev[idx]);
-                       } else if (rt2x00_rt(rt2x00dev, RT5390)) {
+                       } else if (rt2x00_rt(rt2x00dev, RT5390) ||
+                                          rt2x00_rt(rt2x00dev, RT5392)) {
                                static const char r59_non_bt[] = {0x8f, 0x8f,
                                        0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8d,
                                        0x8a, 0x88, 0x88, 0x87, 0x87, 0x86};
@@ -1956,6 +2041,7 @@ static void rt2800_config_channel(struct rt2x00_dev *rt2x00dev,
                rt2800_config_channel_rf3052(rt2x00dev, conf, rf, info);
                break;
        case RF5370:
+       case RF5372:
        case RF5390:
                rt2800_config_channel_rf53xx(rt2x00dev, conf, rf, info);
                break;
@@ -1972,7 +2058,8 @@ static void rt2800_config_channel(struct rt2x00_dev *rt2x00dev,
        rt2800_bbp_write(rt2x00dev, 86, 0);
 
        if (rf->channel <= 14) {
-               if (!rt2x00_rt(rt2x00dev, RT5390)) {
+               if (!rt2x00_rt(rt2x00dev, RT5390) &&
+                       !rt2x00_rt(rt2x00dev, RT5392)) {
                        if (test_bit(CAPABILITY_EXTERNAL_LNA_BG,
                                     &rt2x00dev->cap_flags)) {
                                rt2800_bbp_write(rt2x00dev, 82, 0x62);
@@ -2414,6 +2501,80 @@ void rt2800_gain_calibration(struct rt2x00_dev *rt2x00dev)
 }
 EXPORT_SYMBOL_GPL(rt2800_gain_calibration);
 
+void rt2800_vco_calibration(struct rt2x00_dev *rt2x00dev)
+{
+       u32     tx_pin;
+       u8      rfcsr;
+
+       /*
+        * A voltage-controlled oscillator(VCO) is an electronic oscillator
+        * designed to be controlled in oscillation frequency by a voltage
+        * input. Maybe the temperature will affect the frequency of
+        * oscillation to be shifted. The VCO calibration will be called
+        * periodically to adjust the frequency to be precision.
+       */
+
+       rt2800_register_read(rt2x00dev, TX_PIN_CFG, &tx_pin);
+       tx_pin &= TX_PIN_CFG_PA_PE_DISABLE;
+       rt2800_register_write(rt2x00dev, TX_PIN_CFG, tx_pin);
+
+       switch (rt2x00dev->chip.rf) {
+       case RF2020:
+       case RF3020:
+       case RF3021:
+       case RF3022:
+       case RF3320:
+       case RF3052:
+               rt2800_rfcsr_read(rt2x00dev, 7, &rfcsr);
+               rt2x00_set_field8(&rfcsr, RFCSR7_RF_TUNING, 1);
+               rt2800_rfcsr_write(rt2x00dev, 7, rfcsr);
+               break;
+       case RF5370:
+       case RF5372:
+       case RF5390:
+               rt2800_rfcsr_read(rt2x00dev, 3, &rfcsr);
+               rt2x00_set_field8(&rfcsr, RFCSR30_RF_CALIBRATION, 1);
+               rt2800_rfcsr_write(rt2x00dev, 3, rfcsr);
+               break;
+       default:
+               return;
+       }
+
+       mdelay(1);
+
+       rt2800_register_read(rt2x00dev, TX_PIN_CFG, &tx_pin);
+       if (rt2x00dev->rf_channel <= 14) {
+               switch (rt2x00dev->default_ant.tx_chain_num) {
+               case 3:
+                       rt2x00_set_field32(&tx_pin, TX_PIN_CFG_PA_PE_G2_EN, 1);
+                       /* fall through */
+               case 2:
+                       rt2x00_set_field32(&tx_pin, TX_PIN_CFG_PA_PE_G1_EN, 1);
+                       /* fall through */
+               case 1:
+               default:
+                       rt2x00_set_field32(&tx_pin, TX_PIN_CFG_PA_PE_G0_EN, 1);
+                       break;
+               }
+       } else {
+               switch (rt2x00dev->default_ant.tx_chain_num) {
+               case 3:
+                       rt2x00_set_field32(&tx_pin, TX_PIN_CFG_PA_PE_A2_EN, 1);
+                       /* fall through */
+               case 2:
+                       rt2x00_set_field32(&tx_pin, TX_PIN_CFG_PA_PE_A1_EN, 1);
+                       /* fall through */
+               case 1:
+               default:
+                       rt2x00_set_field32(&tx_pin, TX_PIN_CFG_PA_PE_A0_EN, 1);
+                       break;
+               }
+       }
+       rt2800_register_write(rt2x00dev, TX_PIN_CFG, tx_pin);
+
+}
+EXPORT_SYMBOL_GPL(rt2800_vco_calibration);
+
 static void rt2800_config_retry_limit(struct rt2x00_dev *rt2x00dev,
                                      struct rt2x00lib_conf *libconf)
 {
@@ -2502,7 +2663,8 @@ static u8 rt2800_get_default_vgc(struct rt2x00_dev *rt2x00dev)
                    rt2x00_rt(rt2x00dev, RT3071) ||
                    rt2x00_rt(rt2x00dev, RT3090) ||
                    rt2x00_rt(rt2x00dev, RT3390) ||
-                   rt2x00_rt(rt2x00dev, RT5390))
+                   rt2x00_rt(rt2x00dev, RT5390) ||
+                   rt2x00_rt(rt2x00dev, RT5392))
                        return 0x1c + (2 * rt2x00dev->lna_gain);
                else
                        return 0x2e + rt2x00dev->lna_gain;
@@ -2637,7 +2799,8 @@ static int rt2800_init_registers(struct rt2x00_dev *rt2x00dev)
        } else if (rt2x00_rt(rt2x00dev, RT3572)) {
                rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000400);
                rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x00080606);
-       } else if (rt2x00_rt(rt2x00dev, RT5390)) {
+       } else if (rt2x00_rt(rt2x00dev, RT5390) ||
+                          rt2x00_rt(rt2x00dev, RT5392)) {
                rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000404);
                rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x00080606);
                rt2800_register_write(rt2x00dev, TX_SW_CFG2, 0x00000000);
@@ -3013,7 +3176,8 @@ static int rt2800_init_bbp(struct rt2x00_dev *rt2x00dev)
                     rt2800_wait_bbp_ready(rt2x00dev)))
                return -EACCES;
 
-       if (rt2x00_rt(rt2x00dev, RT5390)) {
+       if (rt2x00_rt(rt2x00dev, RT5390) ||
+               rt2x00_rt(rt2x00dev, RT5392)) {
                rt2800_bbp_read(rt2x00dev, 4, &value);
                rt2x00_set_field8(&value, BBP4_MAC_IF_CTRL, 1);
                rt2800_bbp_write(rt2x00dev, 4, value);
@@ -3021,19 +3185,22 @@ static int rt2800_init_bbp(struct rt2x00_dev *rt2x00dev)
 
        if (rt2800_is_305x_soc(rt2x00dev) ||
            rt2x00_rt(rt2x00dev, RT3572) ||
-           rt2x00_rt(rt2x00dev, RT5390))
+           rt2x00_rt(rt2x00dev, RT5390) ||
+           rt2x00_rt(rt2x00dev, RT5392))
                rt2800_bbp_write(rt2x00dev, 31, 0x08);
 
        rt2800_bbp_write(rt2x00dev, 65, 0x2c);
        rt2800_bbp_write(rt2x00dev, 66, 0x38);
 
-       if (rt2x00_rt(rt2x00dev, RT5390))
+       if (rt2x00_rt(rt2x00dev, RT5390) ||
+               rt2x00_rt(rt2x00dev, RT5392))
                rt2800_bbp_write(rt2x00dev, 68, 0x0b);
 
        if (rt2x00_rt_rev(rt2x00dev, RT2860, REV_RT2860C)) {
                rt2800_bbp_write(rt2x00dev, 69, 0x16);
                rt2800_bbp_write(rt2x00dev, 73, 0x12);
-       } else if (rt2x00_rt(rt2x00dev, RT5390)) {
+       } else if (rt2x00_rt(rt2x00dev, RT5390) ||
+                          rt2x00_rt(rt2x00dev, RT5392)) {
                rt2800_bbp_write(rt2x00dev, 69, 0x12);
                rt2800_bbp_write(rt2x00dev, 73, 0x13);
                rt2800_bbp_write(rt2x00dev, 75, 0x46);
@@ -3051,7 +3218,8 @@ static int rt2800_init_bbp(struct rt2x00_dev *rt2x00dev)
            rt2x00_rt(rt2x00dev, RT3090) ||
            rt2x00_rt(rt2x00dev, RT3390) ||
            rt2x00_rt(rt2x00dev, RT3572) ||
-           rt2x00_rt(rt2x00dev, RT5390)) {
+           rt2x00_rt(rt2x00dev, RT5390) ||
+           rt2x00_rt(rt2x00dev, RT5392)) {
                rt2800_bbp_write(rt2x00dev, 79, 0x13);
                rt2800_bbp_write(rt2x00dev, 80, 0x05);
                rt2800_bbp_write(rt2x00dev, 81, 0x33);
@@ -3063,64 +3231,88 @@ static int rt2800_init_bbp(struct rt2x00_dev *rt2x00dev)
        }
 
        rt2800_bbp_write(rt2x00dev, 82, 0x62);
-       if (rt2x00_rt(rt2x00dev, RT5390))
+       if (rt2x00_rt(rt2x00dev, RT5390) ||
+               rt2x00_rt(rt2x00dev, RT5392))
                rt2800_bbp_write(rt2x00dev, 83, 0x7a);
        else
                rt2800_bbp_write(rt2x00dev, 83, 0x6a);
 
        if (rt2x00_rt_rev(rt2x00dev, RT2860, REV_RT2860D))
                rt2800_bbp_write(rt2x00dev, 84, 0x19);
-       else if (rt2x00_rt(rt2x00dev, RT5390))
+       else if (rt2x00_rt(rt2x00dev, RT5390) ||
+                        rt2x00_rt(rt2x00dev, RT5392))
                rt2800_bbp_write(rt2x00dev, 84, 0x9a);
        else
                rt2800_bbp_write(rt2x00dev, 84, 0x99);
 
-       if (rt2x00_rt(rt2x00dev, RT5390))
+       if (rt2x00_rt(rt2x00dev, RT5390) ||
+               rt2x00_rt(rt2x00dev, RT5392))
                rt2800_bbp_write(rt2x00dev, 86, 0x38);
        else
                rt2800_bbp_write(rt2x00dev, 86, 0x00);
 
+       if (rt2x00_rt(rt2x00dev, RT5392))
+               rt2800_bbp_write(rt2x00dev, 88, 0x90);
+
        rt2800_bbp_write(rt2x00dev, 91, 0x04);
 
-       if (rt2x00_rt(rt2x00dev, RT5390))
+       if (rt2x00_rt(rt2x00dev, RT5390) ||
+               rt2x00_rt(rt2x00dev, RT5392))
                rt2800_bbp_write(rt2x00dev, 92, 0x02);
        else
                rt2800_bbp_write(rt2x00dev, 92, 0x00);
 
+       if (rt2x00_rt(rt2x00dev, RT5392)) {
+               rt2800_bbp_write(rt2x00dev, 95, 0x9a);
+               rt2800_bbp_write(rt2x00dev, 98, 0x12);
+       }
+
        if (rt2x00_rt_rev_gte(rt2x00dev, RT3070, REV_RT3070F) ||
            rt2x00_rt_rev_gte(rt2x00dev, RT3071, REV_RT3071E) ||
            rt2x00_rt_rev_gte(rt2x00dev, RT3090, REV_RT3090E) ||
            rt2x00_rt_rev_gte(rt2x00dev, RT3390, REV_RT3390E) ||
            rt2x00_rt(rt2x00dev, RT3572) ||
            rt2x00_rt(rt2x00dev, RT5390) ||
+           rt2x00_rt(rt2x00dev, RT5392) ||
            rt2800_is_305x_soc(rt2x00dev))
                rt2800_bbp_write(rt2x00dev, 103, 0xc0);
        else
                rt2800_bbp_write(rt2x00dev, 103, 0x00);
 
-       if (rt2x00_rt(rt2x00dev, RT5390))
+       if (rt2x00_rt(rt2x00dev, RT5390) ||
+               rt2x00_rt(rt2x00dev, RT5392))
                rt2800_bbp_write(rt2x00dev, 104, 0x92);
 
        if (rt2800_is_305x_soc(rt2x00dev))
                rt2800_bbp_write(rt2x00dev, 105, 0x01);
-       else if (rt2x00_rt(rt2x00dev, RT5390))
+       else if (rt2x00_rt(rt2x00dev, RT5390) ||
+                        rt2x00_rt(rt2x00dev, RT5392))
                rt2800_bbp_write(rt2x00dev, 105, 0x3c);
        else
                rt2800_bbp_write(rt2x00dev, 105, 0x05);
 
        if (rt2x00_rt(rt2x00dev, RT5390))
                rt2800_bbp_write(rt2x00dev, 106, 0x03);
+       else if (rt2x00_rt(rt2x00dev, RT5392))
+               rt2800_bbp_write(rt2x00dev, 106, 0x12);
        else
                rt2800_bbp_write(rt2x00dev, 106, 0x35);
 
-       if (rt2x00_rt(rt2x00dev, RT5390))
+       if (rt2x00_rt(rt2x00dev, RT5390) ||
+               rt2x00_rt(rt2x00dev, RT5392))
                rt2800_bbp_write(rt2x00dev, 128, 0x12);
 
+       if (rt2x00_rt(rt2x00dev, RT5392)) {
+               rt2800_bbp_write(rt2x00dev, 134, 0xd0);
+               rt2800_bbp_write(rt2x00dev, 135, 0xf6);
+       }
+
        if (rt2x00_rt(rt2x00dev, RT3071) ||
            rt2x00_rt(rt2x00dev, RT3090) ||
            rt2x00_rt(rt2x00dev, RT3390) ||
            rt2x00_rt(rt2x00dev, RT3572) ||
-           rt2x00_rt(rt2x00dev, RT5390)) {
+           rt2x00_rt(rt2x00dev, RT5390) ||
+           rt2x00_rt(rt2x00dev, RT5392)) {
                rt2800_bbp_read(rt2x00dev, 138, &value);
 
                rt2x00_eeprom_read(rt2x00dev, EEPROM_NIC_CONF0, &eeprom);
@@ -3132,7 +3324,8 @@ static int rt2800_init_bbp(struct rt2x00_dev *rt2x00dev)
                rt2800_bbp_write(rt2x00dev, 138, value);
        }
 
-       if (rt2x00_rt(rt2x00dev, RT5390)) {
+       if (rt2x00_rt(rt2x00dev, RT5390) ||
+               rt2x00_rt(rt2x00dev, RT5392)) {
                int ant, div_mode;
 
                rt2x00_eeprom_read(rt2x00dev, EEPROM_NIC_CONF1, &eeprom);
@@ -3247,6 +3440,7 @@ static u8 rt2800_init_rx_filter(struct rt2x00_dev *rt2x00dev,
 
 static int rt2800_init_rfcsr(struct rt2x00_dev *rt2x00dev)
 {
+       struct rt2800_drv_data *drv_data = rt2x00dev->drv_data;
        u8 rfcsr;
        u8 bbp;
        u32 reg;
@@ -3258,13 +3452,15 @@ static int rt2800_init_rfcsr(struct rt2x00_dev *rt2x00dev)
            !rt2x00_rt(rt2x00dev, RT3390) &&
            !rt2x00_rt(rt2x00dev, RT3572) &&
            !rt2x00_rt(rt2x00dev, RT5390) &&
+           !rt2x00_rt(rt2x00dev, RT5392) &&
            !rt2800_is_305x_soc(rt2x00dev))
                return 0;
 
        /*
         * Init RF calibration.
         */
-       if (rt2x00_rt(rt2x00dev, RT5390)) {
+       if (rt2x00_rt(rt2x00dev, RT5390) ||
+               rt2x00_rt(rt2x00dev, RT5392)) {
                rt2800_rfcsr_read(rt2x00dev, 2, &rfcsr);
                rt2x00_set_field8(&rfcsr, RFCSR2_RESCAL_EN, 1);
                rt2800_rfcsr_write(rt2x00dev, 2, rfcsr);
@@ -3482,6 +3678,66 @@ static int rt2800_init_rfcsr(struct rt2x00_dev *rt2x00dev)
                        rt2800_rfcsr_write(rt2x00dev, 61, 0xdd);
                rt2800_rfcsr_write(rt2x00dev, 62, 0x00);
                rt2800_rfcsr_write(rt2x00dev, 63, 0x00);
+       }       else if (rt2x00_rt(rt2x00dev, RT5392)) {
+                       rt2800_rfcsr_write(rt2x00dev, 1, 0x17);
+                       rt2800_rfcsr_write(rt2x00dev, 2, 0x80);
+                       rt2800_rfcsr_write(rt2x00dev, 3, 0x88);
+                       rt2800_rfcsr_write(rt2x00dev, 5, 0x10);
+                       rt2800_rfcsr_write(rt2x00dev, 6, 0xe0);
+                       rt2800_rfcsr_write(rt2x00dev, 7, 0x00);
+                       rt2800_rfcsr_write(rt2x00dev, 10, 0x53);
+                       rt2800_rfcsr_write(rt2x00dev, 11, 0x4a);
+                       rt2800_rfcsr_write(rt2x00dev, 12, 0x46);
+                       rt2800_rfcsr_write(rt2x00dev, 13, 0x9f);
+                       rt2800_rfcsr_write(rt2x00dev, 14, 0x00);
+                       rt2800_rfcsr_write(rt2x00dev, 15, 0x00);
+                       rt2800_rfcsr_write(rt2x00dev, 16, 0x00);
+                       rt2800_rfcsr_write(rt2x00dev, 18, 0x03);
+                       rt2800_rfcsr_write(rt2x00dev, 19, 0x4d);
+                       rt2800_rfcsr_write(rt2x00dev, 20, 0x00);
+                       rt2800_rfcsr_write(rt2x00dev, 21, 0x8d);
+                       rt2800_rfcsr_write(rt2x00dev, 22, 0x20);
+                       rt2800_rfcsr_write(rt2x00dev, 23, 0x0b);
+                       rt2800_rfcsr_write(rt2x00dev, 24, 0x44);
+                       rt2800_rfcsr_write(rt2x00dev, 25, 0x80);
+                       rt2800_rfcsr_write(rt2x00dev, 26, 0x82);
+                       rt2800_rfcsr_write(rt2x00dev, 27, 0x09);
+                       rt2800_rfcsr_write(rt2x00dev, 28, 0x00);
+                       rt2800_rfcsr_write(rt2x00dev, 29, 0x10);
+                       rt2800_rfcsr_write(rt2x00dev, 30, 0x10);
+                       rt2800_rfcsr_write(rt2x00dev, 31, 0x80);
+                       rt2800_rfcsr_write(rt2x00dev, 32, 0x20);
+                       rt2800_rfcsr_write(rt2x00dev, 33, 0xC0);
+                       rt2800_rfcsr_write(rt2x00dev, 34, 0x07);
+                       rt2800_rfcsr_write(rt2x00dev, 35, 0x12);
+                       rt2800_rfcsr_write(rt2x00dev, 36, 0x00);
+                       rt2800_rfcsr_write(rt2x00dev, 37, 0x08);
+                       rt2800_rfcsr_write(rt2x00dev, 38, 0x89);
+                       rt2800_rfcsr_write(rt2x00dev, 39, 0x1b);
+                       rt2800_rfcsr_write(rt2x00dev, 40, 0x0f);
+                       rt2800_rfcsr_write(rt2x00dev, 41, 0xbb);
+                       rt2800_rfcsr_write(rt2x00dev, 42, 0xd5);
+                       rt2800_rfcsr_write(rt2x00dev, 43, 0x9b);
+                       rt2800_rfcsr_write(rt2x00dev, 44, 0x0e);
+                       rt2800_rfcsr_write(rt2x00dev, 45, 0xa2);
+                       rt2800_rfcsr_write(rt2x00dev, 46, 0x73);
+                       rt2800_rfcsr_write(rt2x00dev, 47, 0x0c);
+                       rt2800_rfcsr_write(rt2x00dev, 48, 0x10);
+                       rt2800_rfcsr_write(rt2x00dev, 49, 0x94);
+                       rt2800_rfcsr_write(rt2x00dev, 50, 0x94);
+                       rt2800_rfcsr_write(rt2x00dev, 51, 0x3a);
+                       rt2800_rfcsr_write(rt2x00dev, 52, 0x48);
+                       rt2800_rfcsr_write(rt2x00dev, 53, 0x44);
+                       rt2800_rfcsr_write(rt2x00dev, 54, 0x38);
+                       rt2800_rfcsr_write(rt2x00dev, 55, 0x43);
+                       rt2800_rfcsr_write(rt2x00dev, 56, 0xa1);
+                       rt2800_rfcsr_write(rt2x00dev, 57, 0x00);
+                       rt2800_rfcsr_write(rt2x00dev, 58, 0x39);
+                       rt2800_rfcsr_write(rt2x00dev, 59, 0x07);
+                       rt2800_rfcsr_write(rt2x00dev, 60, 0x45);
+                       rt2800_rfcsr_write(rt2x00dev, 61, 0x91);
+                       rt2800_rfcsr_write(rt2x00dev, 62, 0x39);
+                       rt2800_rfcsr_write(rt2x00dev, 63, 0x07);
        }
 
        if (rt2x00_rt_rev_lt(rt2x00dev, RT3070, REV_RT3070F)) {
@@ -3535,21 +3791,28 @@ static int rt2800_init_rfcsr(struct rt2x00_dev *rt2x00dev)
         * Set RX Filter calibration for 20MHz and 40MHz
         */
        if (rt2x00_rt(rt2x00dev, RT3070)) {
-               rt2x00dev->calibration[0] =
+               drv_data->calibration_bw20 =
                        rt2800_init_rx_filter(rt2x00dev, false, 0x07, 0x16);
-               rt2x00dev->calibration[1] =
+               drv_data->calibration_bw40 =
                        rt2800_init_rx_filter(rt2x00dev, true, 0x27, 0x19);
        } else if (rt2x00_rt(rt2x00dev, RT3071) ||
                   rt2x00_rt(rt2x00dev, RT3090) ||
                   rt2x00_rt(rt2x00dev, RT3390) ||
                   rt2x00_rt(rt2x00dev, RT3572)) {
-               rt2x00dev->calibration[0] =
+               drv_data->calibration_bw20 =
                        rt2800_init_rx_filter(rt2x00dev, false, 0x07, 0x13);
-               rt2x00dev->calibration[1] =
+               drv_data->calibration_bw40 =
                        rt2800_init_rx_filter(rt2x00dev, true, 0x27, 0x15);
        }
 
-       if (!rt2x00_rt(rt2x00dev, RT5390)) {
+       /*
+        * Save BBP 25 & 26 values for later use in channel switching
+        */
+       rt2800_bbp_read(rt2x00dev, 25, &drv_data->bbp25);
+       rt2800_bbp_read(rt2x00dev, 26, &drv_data->bbp26);
+
+       if (!rt2x00_rt(rt2x00dev, RT5390) &&
+               !rt2x00_rt(rt2x00dev, RT5392)) {
                /*
                 * Set back to initial state
                 */
@@ -3577,7 +3840,8 @@ static int rt2800_init_rfcsr(struct rt2x00_dev *rt2x00dev)
        rt2x00_set_field32(&reg, OPT_14_CSR_BIT0, 1);
        rt2800_register_write(rt2x00dev, OPT_14_CSR, reg);
 
-       if (!rt2x00_rt(rt2x00dev, RT5390)) {
+       if (!rt2x00_rt(rt2x00dev, RT5390) &&
+               !rt2x00_rt(rt2x00dev, RT5392)) {
                rt2800_rfcsr_read(rt2x00dev, 17, &rfcsr);
                rt2x00_set_field8(&rfcsr, RFCSR17_TX_LO1_EN, 0);
                if (rt2x00_rt(rt2x00dev, RT3070) ||
@@ -3588,11 +3852,8 @@ static int rt2800_init_rfcsr(struct rt2x00_dev *rt2x00dev)
                                      &rt2x00dev->cap_flags))
                                rt2x00_set_field8(&rfcsr, RFCSR17_R, 1);
                }
-               rt2x00_eeprom_read(rt2x00dev, EEPROM_TXMIXER_GAIN_BG, &eeprom);
-               if (rt2x00_get_field16(eeprom, EEPROM_TXMIXER_GAIN_BG_VAL) >= 1)
-                       rt2x00_set_field8(&rfcsr, RFCSR17_TXMIXER_GAIN,
-                                       rt2x00_get_field16(eeprom,
-                                               EEPROM_TXMIXER_GAIN_BG_VAL));
+               rt2x00_set_field8(&rfcsr, RFCSR17_TXMIXER_GAIN,
+                                 drv_data->txmixer_gain_24g);
                rt2800_rfcsr_write(rt2x00dev, 17, rfcsr);
        }
 
@@ -3645,7 +3906,8 @@ static int rt2800_init_rfcsr(struct rt2x00_dev *rt2x00dev)
                rt2800_rfcsr_write(rt2x00dev, 27, rfcsr);
        }
 
-       if (rt2x00_rt(rt2x00dev, RT5390)) {
+       if (rt2x00_rt(rt2x00dev, RT5390) ||
+               rt2x00_rt(rt2x00dev, RT5392)) {
                rt2800_rfcsr_read(rt2x00dev, 38, &rfcsr);
                rt2x00_set_field8(&rfcsr, RFCSR38_RX_LO1_EN, 0);
                rt2800_rfcsr_write(rt2x00dev, 38, rfcsr);
@@ -3800,6 +4062,7 @@ EXPORT_SYMBOL_GPL(rt2800_read_eeprom_efuse);
 
 int rt2800_validate_eeprom(struct rt2x00_dev *rt2x00dev)
 {
+       struct rt2800_drv_data *drv_data = rt2x00dev->drv_data;
        u16 word;
        u8 *mac;
        u8 default_lna_gain;
@@ -3883,6 +4146,14 @@ int rt2800_validate_eeprom(struct rt2x00_dev *rt2x00dev)
                rt2x00_set_field16(&word, EEPROM_RSSI_BG_OFFSET1, 0);
        rt2x00_eeprom_write(rt2x00dev, EEPROM_RSSI_BG, word);
 
+       rt2x00_eeprom_read(rt2x00dev, EEPROM_TXMIXER_GAIN_BG, &word);
+       if ((word & 0x00ff) != 0x00ff) {
+               drv_data->txmixer_gain_24g =
+                       rt2x00_get_field16(word, EEPROM_TXMIXER_GAIN_BG_VAL);
+       } else {
+               drv_data->txmixer_gain_24g = 0;
+       }
+
        rt2x00_eeprom_read(rt2x00dev, EEPROM_RSSI_BG2, &word);
        if (abs(rt2x00_get_field16(word, EEPROM_RSSI_BG2_OFFSET2)) > 10)
                rt2x00_set_field16(&word, EEPROM_RSSI_BG2_OFFSET2, 0);
@@ -3892,6 +4163,14 @@ int rt2800_validate_eeprom(struct rt2x00_dev *rt2x00dev)
                                   default_lna_gain);
        rt2x00_eeprom_write(rt2x00dev, EEPROM_RSSI_BG2, word);
 
+       rt2x00_eeprom_read(rt2x00dev, EEPROM_TXMIXER_GAIN_A, &word);
+       if ((word & 0x00ff) != 0x00ff) {
+               drv_data->txmixer_gain_5g =
+                       rt2x00_get_field16(word, EEPROM_TXMIXER_GAIN_A_VAL);
+       } else {
+               drv_data->txmixer_gain_5g = 0;
+       }
+
        rt2x00_eeprom_read(rt2x00dev, EEPROM_RSSI_A, &word);
        if (abs(rt2x00_get_field16(word, EEPROM_RSSI_A_OFFSET0)) > 10)
                rt2x00_set_field16(&word, EEPROM_RSSI_A_OFFSET0, 0);
@@ -3929,7 +4208,8 @@ int rt2800_init_eeprom(struct rt2x00_dev *rt2x00dev)
         * RT53xx: defined in "EEPROM_CHIP_ID" field
         */
        rt2800_register_read(rt2x00dev, MAC_CSR0, &reg);
-       if (rt2x00_get_field32(reg, MAC_CSR0_CHIPSET) == RT5390)
+       if (rt2x00_get_field32(reg, MAC_CSR0_CHIPSET) == RT5390 ||
+               rt2x00_get_field32(reg, MAC_CSR0_CHIPSET) == RT5392)
                rt2x00_eeprom_read(rt2x00dev, EEPROM_CHIP_ID, &value);
        else
                value = rt2x00_get_field16(eeprom, EEPROM_NIC_CONF0_RF_TYPE);
@@ -3947,9 +4227,10 @@ int rt2800_init_eeprom(struct rt2x00_dev *rt2x00dev)
        case RT3390:
        case RT3572:
        case RT5390:
+       case RT5392:
                break;
        default:
-               ERROR(rt2x00dev, "Invalid RT chipset detected.\n");
+               ERROR(rt2x00dev, "Invalid RT chipset 0x%04x detected.\n", rt2x00dev->chip.rt);
                return -ENODEV;
        }
 
@@ -3965,10 +4246,11 @@ int rt2800_init_eeprom(struct rt2x00_dev *rt2x00dev)
        case RF3052:
        case RF3320:
        case RF5370:
+       case RF5372:
        case RF5390:
                break;
        default:
-               ERROR(rt2x00dev, "Invalid RF chipset 0x%x detected.\n",
+               ERROR(rt2x00dev, "Invalid RF chipset 0x%04x detected.\n",
                      rt2x00dev->chip.rf);
                return -ENODEV;
        }
@@ -4271,6 +4553,7 @@ int rt2800_probe_hw_mode(struct rt2x00_dev *rt2x00dev)
                   rt2x00_rf(rt2x00dev, RF3022) ||
                   rt2x00_rf(rt2x00dev, RF3320) ||
                   rt2x00_rf(rt2x00dev, RF5370) ||
+                  rt2x00_rf(rt2x00dev, RF5372) ||
                   rt2x00_rf(rt2x00dev, RF5390)) {
                spec->num_channels = 14;
                spec->channels = rf_vals_3x;
@@ -4347,6 +4630,20 @@ int rt2800_probe_hw_mode(struct rt2x00_dev *rt2x00dev)
                }
        }
 
+       switch (rt2x00dev->chip.rf) {
+       case RF2020:
+       case RF3020:
+       case RF3021:
+       case RF3022:
+       case RF3320:
+       case RF3052:
+       case RF5370:
+       case RF5372:
+       case RF5390:
+               __set_bit(CAPABILITY_VCO_RECALIBRATION, &rt2x00dev->cap_flags);
+               break;
+       }
+
        return 0;
 }
 EXPORT_SYMBOL_GPL(rt2800_probe_hw_mode);
index 8c3c281..419e36c 100644 (file)
@@ -184,6 +184,7 @@ void rt2800_reset_tuner(struct rt2x00_dev *rt2x00dev, struct link_qual *qual);
 void rt2800_link_tuner(struct rt2x00_dev *rt2x00dev, struct link_qual *qual,
                       const u32 count);
 void rt2800_gain_calibration(struct rt2x00_dev *rt2x00dev);
+void rt2800_vco_calibration(struct rt2x00_dev *rt2x00dev);
 
 int rt2800_enable_radio(struct rt2x00_dev *rt2x00dev);
 void rt2800_disable_radio(struct rt2x00_dev *rt2x00dev);
index dc88bae..9375db4 100644 (file)
@@ -480,7 +480,8 @@ static int rt2800pci_init_registers(struct rt2x00_dev *rt2x00dev)
 
        if (rt2x00_is_pcie(rt2x00dev) &&
            (rt2x00_rt(rt2x00dev, RT3572) ||
-            rt2x00_rt(rt2x00dev, RT5390))) {
+            rt2x00_rt(rt2x00dev, RT5390) ||
+            rt2x00_rt(rt2x00dev, RT5392))) {
                rt2x00pci_register_read(rt2x00dev, AUX_CTRL, &reg);
                rt2x00_set_field32(&reg, AUX_CTRL_FORCE_PCIE_CLK, 1);
                rt2x00_set_field32(&reg, AUX_CTRL_WAKE_PCIE_EN, 1);
@@ -489,7 +490,7 @@ static int rt2800pci_init_registers(struct rt2x00_dev *rt2x00dev)
 
        rt2x00pci_register_write(rt2x00dev, PWR_PIN_CFG, 0x00000003);
 
-       rt2x00pci_register_read(rt2x00dev, MAC_SYS_CTRL, &reg);
+       reg = 0;
        rt2x00_set_field32(&reg, MAC_SYS_CTRL_RESET_CSR, 1);
        rt2x00_set_field32(&reg, MAC_SYS_CTRL_RESET_BBP, 1);
        rt2x00pci_register_write(rt2x00dev, MAC_SYS_CTRL, reg);
@@ -501,11 +502,27 @@ static int rt2800pci_init_registers(struct rt2x00_dev *rt2x00dev)
 
 static int rt2800pci_enable_radio(struct rt2x00_dev *rt2x00dev)
 {
+       int retval;
+
        if (unlikely(rt2800_wait_wpdma_ready(rt2x00dev) ||
                     rt2800pci_init_queues(rt2x00dev)))
                return -EIO;
 
-       return rt2800_enable_radio(rt2x00dev);
+       retval = rt2800_enable_radio(rt2x00dev);
+       if (retval)
+               return retval;
+
+       /* After resume MCU_BOOT_SIGNAL will trash these. */
+       rt2x00pci_register_write(rt2x00dev, H2M_MAILBOX_STATUS, ~0);
+       rt2x00pci_register_write(rt2x00dev, H2M_MAILBOX_CID, ~0);
+
+       rt2800_mcu_request(rt2x00dev, MCU_SLEEP, TOKEN_RADIO_OFF, 0xff, 0x02);
+       rt2800pci_mcu_status(rt2x00dev, TOKEN_RADIO_OFF);
+
+       rt2800_mcu_request(rt2x00dev, MCU_WAKEUP, TOKEN_WAKEUP, 0, 0);
+       rt2800pci_mcu_status(rt2x00dev, TOKEN_WAKEUP);
+
+       return retval;
 }
 
 static void rt2800pci_disable_radio(struct rt2x00_dev *rt2x00dev)
@@ -521,14 +538,16 @@ static int rt2800pci_set_state(struct rt2x00_dev *rt2x00dev,
                               enum dev_state state)
 {
        if (state == STATE_AWAKE) {
-               rt2800_mcu_request(rt2x00dev, MCU_WAKEUP, TOKEN_WAKUP, 0, 0x02);
-               rt2800pci_mcu_status(rt2x00dev, TOKEN_WAKUP);
+               rt2800_mcu_request(rt2x00dev, MCU_WAKEUP, TOKEN_WAKEUP,
+                                  0, 0x02);
+               rt2800pci_mcu_status(rt2x00dev, TOKEN_WAKEUP);
        } else if (state == STATE_SLEEP) {
                rt2x00pci_register_write(rt2x00dev, H2M_MAILBOX_STATUS,
                                         0xffffffff);
                rt2x00pci_register_write(rt2x00dev, H2M_MAILBOX_CID,
                                         0xffffffff);
-               rt2800_mcu_request(rt2x00dev, MCU_SLEEP, 0x01, 0xff, 0x01);
+               rt2800_mcu_request(rt2x00dev, MCU_SLEEP, TOKEN_SLEEP,
+                                  0xff, 0x01);
        }
 
        return 0;
@@ -541,13 +560,6 @@ static int rt2800pci_set_device_state(struct rt2x00_dev *rt2x00dev,
 
        switch (state) {
        case STATE_RADIO_ON:
-               /*
-                * Before the radio can be enabled, the device first has
-                * to be woken up. After that it needs a bit of time
-                * to be fully awake and then the radio can be enabled.
-                */
-               rt2800pci_set_state(rt2x00dev, STATE_AWAKE);
-               msleep(1);
                retval = rt2800pci_enable_radio(rt2x00dev);
                break;
        case STATE_RADIO_OFF:
@@ -1050,6 +1062,7 @@ static const struct rt2x00lib_ops rt2800pci_rt2x00_ops = {
        .reset_tuner            = rt2800_reset_tuner,
        .link_tuner             = rt2800_link_tuner,
        .gain_calibration       = rt2800_gain_calibration,
+       .vco_calibration        = rt2800_vco_calibration,
        .start_queue            = rt2800pci_start_queue,
        .kick_queue             = rt2800pci_kick_queue,
        .stop_queue             = rt2800pci_stop_queue,
@@ -1093,6 +1106,7 @@ static const struct data_queue_desc rt2800pci_queue_bcn = {
 
 static const struct rt2x00_ops rt2800pci_ops = {
        .name                   = KBUILD_MODNAME,
+       .drv_data_size          = sizeof(struct rt2800_drv_data),
        .max_sta_intf           = 1,
        .max_ap_intf            = 8,
        .eeprom_size            = EEPROM_SIZE,
index 262ee9e..2c11137 100644 (file)
@@ -226,9 +226,7 @@ static int rt2800usb_init_registers(struct rt2x00_dev *rt2x00dev)
        rt2x00usb_register_read(rt2x00dev, PBF_SYS_CTRL, &reg);
        rt2x00usb_register_write(rt2x00dev, PBF_SYS_CTRL, reg & ~0x00002000);
 
-       rt2x00usb_register_write(rt2x00dev, PWR_PIN_CFG, 0x00000003);
-
-       rt2x00usb_register_read(rt2x00dev, MAC_SYS_CTRL, &reg);
+       reg = 0;
        rt2x00_set_field32(&reg, MAC_SYS_CTRL_RESET_CSR, 1);
        rt2x00_set_field32(&reg, MAC_SYS_CTRL_RESET_BBP, 1);
        rt2x00usb_register_write(rt2x00dev, MAC_SYS_CTRL, reg);
@@ -783,6 +781,7 @@ static const struct rt2x00lib_ops rt2800usb_rt2x00_ops = {
        .reset_tuner            = rt2800_reset_tuner,
        .link_tuner             = rt2800_link_tuner,
        .gain_calibration       = rt2800_gain_calibration,
+       .vco_calibration        = rt2800_vco_calibration,
        .watchdog               = rt2800usb_watchdog,
        .start_queue            = rt2800usb_start_queue,
        .kick_queue             = rt2x00usb_kick_queue,
@@ -829,6 +828,7 @@ static const struct data_queue_desc rt2800usb_queue_bcn = {
 
 static const struct rt2x00_ops rt2800usb_ops = {
        .name                   = KBUILD_MODNAME,
+       .drv_data_size          = sizeof(struct rt2800_drv_data),
        .max_sta_intf           = 1,
        .max_ap_intf            = 8,
        .eeprom_size            = EEPROM_SIZE,
@@ -922,6 +922,7 @@ static struct usb_device_id rt2800usb_device_table[] = {
        { USB_DEVICE(0x07d1, 0x3c13) },
        { USB_DEVICE(0x07d1, 0x3c15) },
        { USB_DEVICE(0x07d1, 0x3c16) },
+       { USB_DEVICE(0x2001, 0x3c1b) },
        /* Draytek */
        { USB_DEVICE(0x07fa, 0x7712) },
        /* DVICO */
@@ -1101,12 +1102,26 @@ static struct usb_device_id rt2800usb_device_table[] = {
        { USB_DEVICE(0x5a57, 0x0284) },
 #endif
 #ifdef CONFIG_RT2800USB_RT53XX
+       /* Alpha */
+       { USB_DEVICE(0x2001, 0x3c15) },
+       { USB_DEVICE(0x2001, 0x3c19) },
+       /* Arcadyan */
+       { USB_DEVICE(0x043e, 0x7a12) },
        /* Azurewave */
        { USB_DEVICE(0x13d3, 0x3329) },
        { USB_DEVICE(0x13d3, 0x3365) },
+       /* LG innotek */
+       { USB_DEVICE(0x043e, 0x7a22) },
+       /* Panasonic */
+       { USB_DEVICE(0x04da, 0x1801) },
+       { USB_DEVICE(0x04da, 0x1800) },
+       /* Philips */
+       { USB_DEVICE(0x0471, 0x2104) },
        /* Ralink */
        { USB_DEVICE(0x148f, 0x5370) },
        { USB_DEVICE(0x148f, 0x5372) },
+       /* Unknown */
+       { USB_DEVICE(0x04da, 0x23f6) },
 #endif
 #ifdef CONFIG_RT2800USB_UNKNOWN
        /*
index b03b22c..65275ef 100644 (file)
@@ -192,6 +192,7 @@ struct rt2x00_chip {
 #define RT3593         0x3593
 #define RT3883         0x3883  /* WSOC */
 #define RT5390         0x5390  /* 2.4GHz */
+#define RT5392         0x5392  /* 2.4GHz */
 
        u16 rf;
        u16 rev;
@@ -355,6 +356,11 @@ struct link {
         * Work structure for scheduling periodic AGC adjustments.
         */
        struct delayed_work agc_work;
+
+       /*
+        * Work structure for scheduling periodic VCO calibration.
+        */
+       struct delayed_work vco_work;
 };
 
 enum rt2x00_delayed_flags {
@@ -579,6 +585,7 @@ struct rt2x00lib_ops {
        void (*link_tuner) (struct rt2x00_dev *rt2x00dev,
                            struct link_qual *qual, const u32 count);
        void (*gain_calibration) (struct rt2x00_dev *rt2x00dev);
+       void (*vco_calibration) (struct rt2x00_dev *rt2x00dev);
 
        /*
         * Data queue handlers.
@@ -647,6 +654,7 @@ struct rt2x00lib_ops {
  */
 struct rt2x00_ops {
        const char *name;
+       const unsigned int drv_data_size;
        const unsigned int max_sta_intf;
        const unsigned int max_ap_intf;
        const unsigned int eeprom_size;
@@ -721,6 +729,7 @@ enum rt2x00_capability_flags {
        CAPABILITY_EXTERNAL_LNA_BG,
        CAPABILITY_DOUBLE_ANTENNA,
        CAPABILITY_BT_COEXIST,
+       CAPABILITY_VCO_RECALIBRATION,
 };
 
 /*
@@ -742,6 +751,11 @@ struct rt2x00_dev {
        const struct rt2x00_ops *ops;
 
        /*
+        * Driver data.
+        */
+       void *drv_data;
+
+       /*
         * IEEE80211 control structure.
         */
        struct ieee80211_hw *hw;
@@ -886,18 +900,11 @@ struct rt2x00_dev {
        u8 rssi_offset;
 
        /*
-        * Frequency offset (for rt61pci & rt73usb).
+        * Frequency offset.
         */
        u8 freq_offset;
 
        /*
-        * Calibration information (for rt2800usb & rt2800pci).
-        * [0] -> BW20
-        * [1] -> BW40
-        */
-       u8 calibration[2];
-
-       /*
         * Association id.
         */
        u16 aid;
@@ -979,6 +986,11 @@ struct rt2x00_dev {
        struct tasklet_struct autowake_tasklet;
 
        /*
+        * Used for VCO periodic calibration.
+        */
+       int rf_channel;
+
+       /*
         * Protect the interrupt mask register.
         */
        spinlock_t irqmask_lock;
index b704e5b..d7c0f86 100644 (file)
@@ -232,6 +232,9 @@ void rt2x00lib_config(struct rt2x00_dev *rt2x00dev,
                memcpy(&libconf.channel,
                       &rt2x00dev->spec.channels_info[hw_value],
                       sizeof(libconf.channel));
+
+               /* Used for VCO periodic calibration */
+               rt2x00dev->rf_channel = libconf.rf.channel;
        }
 
        if (test_bit(REQUIRE_PS_AUTOWAKE, &rt2x00dev->cap_flags) &&
index d2a1ea9..49a51b4 100644 (file)
@@ -88,6 +88,8 @@ int rt2x00lib_enable_radio(struct rt2x00_dev *rt2x00dev)
        rt2x00queue_start_queues(rt2x00dev);
        rt2x00link_start_tuner(rt2x00dev);
        rt2x00link_start_agc(rt2x00dev);
+       if (test_bit(CAPABILITY_VCO_RECALIBRATION, &rt2x00dev->cap_flags))
+               rt2x00link_start_vcocal(rt2x00dev);
 
        /*
         * Start watchdog monitoring.
@@ -111,6 +113,8 @@ void rt2x00lib_disable_radio(struct rt2x00_dev *rt2x00dev)
         * Stop all queues
         */
        rt2x00link_stop_agc(rt2x00dev);
+       if (test_bit(CAPABILITY_VCO_RECALIBRATION, &rt2x00dev->cap_flags))
+               rt2x00link_stop_vcocal(rt2x00dev);
        rt2x00link_stop_tuner(rt2x00dev);
        rt2x00queue_stop_queues(rt2x00dev);
        rt2x00queue_flush_queues(rt2x00dev, true);
@@ -1121,6 +1125,18 @@ int rt2x00lib_probe_dev(struct rt2x00_dev *rt2x00dev)
 {
        int retval = -ENOMEM;
 
+       /*
+        * Allocate the driver data memory, if necessary.
+        */
+       if (rt2x00dev->ops->drv_data_size > 0) {
+               rt2x00dev->drv_data = kzalloc(rt2x00dev->ops->drv_data_size,
+                                             GFP_KERNEL);
+               if (!rt2x00dev->drv_data) {
+                       retval = -ENOMEM;
+                       goto exit;
+               }
+       }
+
        spin_lock_init(&rt2x00dev->irqmask_lock);
        mutex_init(&rt2x00dev->csr_mutex);
 
@@ -1262,6 +1278,12 @@ void rt2x00lib_remove_dev(struct rt2x00_dev *rt2x00dev)
         * Free queue structures.
         */
        rt2x00queue_free(rt2x00dev);
+
+       /*
+        * Free the driver data.
+        */
+       if (rt2x00dev->drv_data)
+               kfree(rt2x00dev->drv_data);
 }
 EXPORT_SYMBOL_GPL(rt2x00lib_remove_dev);
 
index 4cdf247..78bd43b 100644 (file)
@@ -33,6 +33,7 @@
 #define WATCHDOG_INTERVAL      round_jiffies_relative(HZ)
 #define LINK_TUNE_INTERVAL     round_jiffies_relative(HZ)
 #define AGC_INTERVAL           round_jiffies_relative(4 * HZ)
+#define VCO_INTERVAL           round_jiffies_relative(10 * HZ) /* 10 sec */
 
 /*
  * rt2x00_rate: Per rate device information
@@ -278,12 +279,24 @@ void rt2x00link_stop_watchdog(struct rt2x00_dev *rt2x00dev);
 void rt2x00link_start_agc(struct rt2x00_dev *rt2x00dev);
 
 /**
+ * rt2x00link_start_vcocal - Start periodic VCO calibration
+ * @rt2x00dev: Pointer to &struct rt2x00_dev.
+ */
+void rt2x00link_start_vcocal(struct rt2x00_dev *rt2x00dev);
+
+/**
  * rt2x00link_stop_agc - Stop periodic gain calibration
  * @rt2x00dev: Pointer to &struct rt2x00_dev.
  */
 void rt2x00link_stop_agc(struct rt2x00_dev *rt2x00dev);
 
 /**
+ * rt2x00link_stop_vcocal - Stop periodic VCO calibration
+ * @rt2x00dev: Pointer to &struct rt2x00_dev.
+ */
+void rt2x00link_stop_vcocal(struct rt2x00_dev *rt2x00dev);
+
+/**
  * rt2x00link_register - Initialize link tuning & watchdog functionality
  * @rt2x00dev: Pointer to &struct rt2x00_dev.
  *
index ea10b00..8368aab 100644 (file)
@@ -447,11 +447,27 @@ void rt2x00link_start_agc(struct rt2x00_dev *rt2x00dev)
                                             AGC_INTERVAL);
 }
 
+void rt2x00link_start_vcocal(struct rt2x00_dev *rt2x00dev)
+{
+       struct link *link = &rt2x00dev->link;
+
+       if (test_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags) &&
+           rt2x00dev->ops->lib->vco_calibration)
+               ieee80211_queue_delayed_work(rt2x00dev->hw,
+                                            &link->vco_work,
+                                            VCO_INTERVAL);
+}
+
 void rt2x00link_stop_agc(struct rt2x00_dev *rt2x00dev)
 {
        cancel_delayed_work_sync(&rt2x00dev->link.agc_work);
 }
 
+void rt2x00link_stop_vcocal(struct rt2x00_dev *rt2x00dev)
+{
+       cancel_delayed_work_sync(&rt2x00dev->link.vco_work);
+}
+
 static void rt2x00link_agc(struct work_struct *work)
 {
        struct rt2x00_dev *rt2x00dev =
@@ -473,9 +489,32 @@ static void rt2x00link_agc(struct work_struct *work)
                                             AGC_INTERVAL);
 }
 
+static void rt2x00link_vcocal(struct work_struct *work)
+{
+       struct rt2x00_dev *rt2x00dev =
+           container_of(work, struct rt2x00_dev, link.vco_work.work);
+       struct link *link = &rt2x00dev->link;
+
+       /*
+        * When the radio is shutting down we should
+        * immediately cease the VCO calibration.
+        */
+       if (!test_bit(DEVICE_STATE_ENABLED_RADIO, &rt2x00dev->flags))
+               return;
+
+       rt2x00dev->ops->lib->vco_calibration(rt2x00dev);
+
+       if (test_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags))
+               ieee80211_queue_delayed_work(rt2x00dev->hw,
+                                            &link->vco_work,
+                                            VCO_INTERVAL);
+}
+
 void rt2x00link_register(struct rt2x00_dev *rt2x00dev)
 {
        INIT_DELAYED_WORK(&rt2x00dev->link.agc_work, rt2x00link_agc);
+       if (test_bit(CAPABILITY_VCO_RECALIBRATION, &rt2x00dev->cap_flags))
+               INIT_DELAYED_WORK(&rt2x00dev->link.vco_work, rt2x00link_vcocal);
        INIT_DELAYED_WORK(&rt2x00dev->link.watchdog_work, rt2x00link_watchdog);
        INIT_DELAYED_WORK(&rt2x00dev->link.work, rt2x00link_tuner);
 }
index d6c42e6..cefac6a 100644 (file)
@@ -49,6 +49,11 @@ config RTLWIFI
        depends on RTL8192CE || RTL8192CU || RTL8192SE || RTL8192DE
        default m
 
+config RTLWIFI_DEBUG
+       bool "Additional debugging output"
+       depends on RTL8192CE || RTL8192CU || RTL8192SE || RTL8192DE
+       default y
+
 config RTL8192C_COMMON
        tristate
        depends on RTL8192CE || RTL8192CU
index 8d6eb0f..5100235 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2009-2010  Realtek Corporation.
+ * Copyright(c) 2009-2012  Realtek Corporation.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
  *
  *****************************************************************************/
 
-#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
-
-#include <linux/ip.h>
-#include <linux/module.h>
 #include "wifi.h"
 #include "rc.h"
 #include "base.h"
 #include "ps.h"
 #include "regd.h"
 
+#include <linux/ip.h>
+#include <linux/module.h>
+
 /*
- *NOTICE!!!: This file will be very big, we hsould
- *keep it clear under follwing roles:
+ *NOTICE!!!: This file will be very big, we should
+ *keep it clear under following roles:
  *
- *This file include follwing part, so, if you add new
+ *This file include following parts, so, if you add new
  *functions into this file, please check which part it
  *should includes. or check if you should add new part
  *for this file:
@@ -211,7 +210,7 @@ static void _rtl_init_hw_ht_capab(struct ieee80211_hw *hw,
         */
        if (get_rf_type(rtlphy) == RF_1T2R || get_rf_type(rtlphy) == RF_2T2R) {
 
-               RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, ("1T2R or 2T2R\n"));
+               RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "1T2R or 2T2R\n");
 
                ht_cap->mcs.rx_mask[0] = 0xFF;
                ht_cap->mcs.rx_mask[1] = 0xFF;
@@ -220,7 +219,7 @@ static void _rtl_init_hw_ht_capab(struct ieee80211_hw *hw,
                ht_cap->mcs.rx_highest = cpu_to_le16(MAX_BIT_RATE_40MHZ_MCS15);
        } else if (get_rf_type(rtlphy) == RF_1T1R) {
 
-               RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, ("1T1R\n"));
+               RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "1T1R\n");
 
                ht_cap->mcs.rx_mask[0] = 0xFF;
                ht_cap->mcs.rx_mask[1] = 0x00;
@@ -302,15 +301,13 @@ static void _rtl_init_mac80211(struct ieee80211_hw *hw)
                        /* <4> set mac->sband to wiphy->sband */
                        hw->wiphy->bands[IEEE80211_BAND_5GHZ] = sband;
                } else {
-                       RT_TRACE(rtlpriv, COMP_INIT, DBG_EMERG,
-                                ("Err BAND %d\n",
-                                rtlhal->current_bandtype));
+                       RT_TRACE(rtlpriv, COMP_INIT, DBG_EMERG, "Err BAND %d\n",
+                                rtlhal->current_bandtype);
                }
        }
        /* <5> set hw caps */
        hw->flags = IEEE80211_HW_SIGNAL_DBM |
            IEEE80211_HW_RX_INCLUDES_FCS |
-           IEEE80211_HW_BEACON_FILTER |
            IEEE80211_HW_AMPDU_AGGREGATION |
            IEEE80211_HW_CONNECTION_MONITOR |
            /* IEEE80211_HW_SUPPORTS_CQM_RSSI | */
@@ -413,6 +410,7 @@ void rtl_init_rfkill(struct ieee80211_hw *hw)
 
        wiphy_rfkill_start_polling(hw->wiphy);
 }
+EXPORT_SYMBOL(rtl_init_rfkill);
 
 void rtl_deinit_rfkill(struct ieee80211_hw *hw)
 {
@@ -436,13 +434,13 @@ int rtl_init_core(struct ieee80211_hw *hw)
         * mac80211 hw  in _rtl_init_mac80211.
         */
        if (rtl_regd_init(hw, rtl_reg_notifier)) {
-               RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, ("REGD init failed\n"));
+               RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "REGD init failed\n");
                return 1;
        } else {
                /* CRDA regd hint must after init CRDA */
                if (regulatory_hint(hw->wiphy, rtlpriv->regd.alpha2)) {
                        RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
-                                ("regulatory_hint fail\n"));
+                                "regulatory_hint fail\n");
                }
        }
 
@@ -922,17 +920,17 @@ bool rtl_action_proc(struct ieee80211_hw *hw, struct sk_buff *skb, u8 is_tx)
                                return false;
 
                        RT_TRACE(rtlpriv, (COMP_SEND | COMP_RECV), DBG_DMESG,
-                                ("%s ACT_ADDBAREQ From :%pM\n",
-                                 is_tx ? "Tx" : "Rx", hdr->addr2));
+                                "%s ACT_ADDBAREQ From :%pM\n",
+                                is_tx ? "Tx" : "Rx", hdr->addr2);
                        break;
                case ACT_ADDBARSP:
                        RT_TRACE(rtlpriv, (COMP_SEND | COMP_RECV), DBG_DMESG,
-                                ("%s ACT_ADDBARSP From :%pM\n",
-                                 is_tx ? "Tx" : "Rx", hdr->addr2));
+                                "%s ACT_ADDBARSP From :%pM\n",
+                                is_tx ? "Tx" : "Rx", hdr->addr2);
                        break;
                case ACT_DELBA:
                        RT_TRACE(rtlpriv, (COMP_SEND | COMP_RECV), DBG_DMESG,
-                                ("ACT_ADDBADEL From :%pM\n", hdr->addr2));
+                                "ACT_ADDBADEL From :%pM\n", hdr->addr2);
                        break;
                }
                break;
@@ -975,8 +973,8 @@ u8 rtl_is_special_data(struct ieee80211_hw *hw, struct sk_buff *skb, u8 is_tx)
                                 * 67 : UDP BOOTP server
                                 */
                                RT_TRACE(rtlpriv, (COMP_SEND | COMP_RECV),
-                                        DBG_DMESG, ("dhcp %s !!\n",
-                                                    (is_tx) ? "Tx" : "Rx"));
+                                        DBG_DMESG, "dhcp %s !!\n",
+                                        is_tx ? "Tx" : "Rx");
 
                                if (is_tx) {
                                        rtl_lps_leave(hw);
@@ -996,7 +994,7 @@ u8 rtl_is_special_data(struct ieee80211_hw *hw, struct sk_buff *skb, u8 is_tx)
                return true;
        } else if (ETH_P_PAE == ether_type) {
                RT_TRACE(rtlpriv, (COMP_SEND | COMP_RECV), DBG_DMESG,
-                        ("802.1X %s EAPOL pkt!!\n", (is_tx) ? "Tx" : "Rx"));
+                        "802.1X %s EAPOL pkt!!\n", is_tx ? "Tx" : "Rx");
 
                if (is_tx) {
                        rtl_lps_leave(hw);
@@ -1036,9 +1034,8 @@ int rtl_tx_agg_start(struct ieee80211_hw *hw,
                return -ENXIO;
        tid_data = &sta_entry->tids[tid];
 
-       RT_TRACE(rtlpriv, COMP_SEND, DBG_DMESG,
-                ("on ra = %pM tid = %d seq:%d\n", sta->addr, tid,
-                tid_data->seq_number));
+       RT_TRACE(rtlpriv, COMP_SEND, DBG_DMESG, "on ra = %pM tid = %d seq:%d\n",
+                sta->addr, tid, tid_data->seq_number);
 
        *ssn = tid_data->seq_number;
        tid_data->agg.agg_state = RTL_AGG_START;
@@ -1059,12 +1056,12 @@ int rtl_tx_agg_stop(struct ieee80211_hw *hw,
                return -EINVAL;
 
        if (!sta->addr) {
-               RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, ("ra = NULL\n"));
+               RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "ra = NULL\n");
                return -EINVAL;
        }
 
-       RT_TRACE(rtlpriv, COMP_SEND, DBG_DMESG,
-                ("on ra = %pM tid = %d\n", sta->addr, tid));
+       RT_TRACE(rtlpriv, COMP_SEND, DBG_DMESG, "on ra = %pM tid = %d\n",
+                sta->addr, tid);
 
        if (unlikely(tid >= MAX_TID_COUNT))
                return -EINVAL;
@@ -1087,12 +1084,12 @@ int rtl_tx_agg_oper(struct ieee80211_hw *hw,
                return -EINVAL;
 
        if (!sta->addr) {
-               RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, ("ra = NULL\n"));
+               RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "ra = NULL\n");
                return -EINVAL;
        }
 
-       RT_TRACE(rtlpriv, COMP_SEND, DBG_DMESG,
-                ("on ra = %pM tid = %d\n", sta->addr, tid));
+       RT_TRACE(rtlpriv, COMP_SEND, DBG_DMESG, "on ra = %pM tid = %d\n",
+                sta->addr, tid);
 
        if (unlikely(tid >= MAX_TID_COUNT))
                return -EINVAL;
@@ -1474,29 +1471,29 @@ void rtl_recognize_peer(struct ieee80211_hw *hw, u8 *data, unsigned int len)
                (memcmp(mac->bssid, ap5_6, 3) == 0) ||
                vendor == PEER_ATH) {
                vendor = PEER_ATH;
-               RT_TRACE(rtlpriv, COMP_MAC80211, DBG_LOUD, ("=>ath find\n"));
+               RT_TRACE(rtlpriv, COMP_MAC80211, DBG_LOUD, "=>ath find\n");
        } else if ((memcmp(mac->bssid, ap4_4, 3) == 0) ||
                (memcmp(mac->bssid, ap4_5, 3) == 0) ||
                (memcmp(mac->bssid, ap4_1, 3) == 0) ||
                (memcmp(mac->bssid, ap4_2, 3) == 0) ||
                (memcmp(mac->bssid, ap4_3, 3) == 0) ||
                vendor == PEER_RAL) {
-               RT_TRACE(rtlpriv, COMP_MAC80211, DBG_LOUD, ("=>ral findn\n"));
+               RT_TRACE(rtlpriv, COMP_MAC80211, DBG_LOUD, "=>ral find\n");
                vendor = PEER_RAL;
        } else if (memcmp(mac->bssid, ap6_1, 3) == 0 ||
                vendor == PEER_CISCO) {
                vendor = PEER_CISCO;
-               RT_TRACE(rtlpriv, COMP_MAC80211, DBG_LOUD, ("=>cisco find\n"));
+               RT_TRACE(rtlpriv, COMP_MAC80211, DBG_LOUD, "=>cisco find\n");
        } else if ((memcmp(mac->bssid, ap3_1, 3) == 0) ||
                (memcmp(mac->bssid, ap3_2, 3) == 0) ||
                (memcmp(mac->bssid, ap3_3, 3) == 0) ||
                vendor == PEER_BROAD) {
-               RT_TRACE(rtlpriv, COMP_MAC80211, DBG_LOUD, ("=>broad find\n"));
+               RT_TRACE(rtlpriv, COMP_MAC80211, DBG_LOUD, "=>broad find\n");
                vendor = PEER_BROAD;
        } else if (memcmp(mac->bssid, ap7_1, 3) == 0 ||
                vendor == PEER_MARV) {
                vendor = PEER_MARV;
-               RT_TRACE(rtlpriv, COMP_MAC80211, DBG_LOUD, ("=>marv find\n"));
+               RT_TRACE(rtlpriv, COMP_MAC80211, DBG_LOUD, "=>marv find\n");
        }
 
        mac->vendor = vendor;
index f66b575..5a23a6d 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2009-2010  Realtek Corporation.
+ * Copyright(c) 2009-2012  Realtek Corporation.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
index dc36d74..5c7d579 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2009-2010  Realtek Corporation.
+ * Copyright(c) 2009-2012  Realtek Corporation.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
@@ -27,8 +27,6 @@
  *
  *****************************************************************************/
 
-#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
-
 #include <linux/export.h>
 #include "wifi.h"
 #include "cam.h"
@@ -55,10 +53,10 @@ static void rtl_cam_program_entry(struct ieee80211_hw *hw, u32 entry_no,
        u8 entry_i;
 
        RT_TRACE(rtlpriv, COMP_SEC, DBG_LOUD,
-                ("key_cont_128:\n %x:%x:%x:%x:%x:%x\n",
-                 key_cont_128[0], key_cont_128[1],
-                 key_cont_128[2], key_cont_128[3],
-                 key_cont_128[4], key_cont_128[5]));
+                "key_cont_128:\n %x:%x:%x:%x:%x:%x\n",
+                key_cont_128[0], key_cont_128[1],
+                key_cont_128[2], key_cont_128[3],
+                key_cont_128[4], key_cont_128[5]);
 
        for (entry_i = 0; entry_i < CAM_CONTENT_COUNT; entry_i++) {
                target_command = entry_i + CAM_CONTENT_COUNT * entry_no;
@@ -73,14 +71,12 @@ static void rtl_cam_program_entry(struct ieee80211_hw *hw, u32 entry_no,
                        rtl_write_dword(rtlpriv, rtlpriv->cfg->maps[RWCAM],
                                        target_command);
 
+                       RT_TRACE(rtlpriv, COMP_SEC, DBG_LOUD, "WRITE %x: %x\n",
+                                rtlpriv->cfg->maps[WCAMI], target_content);
                        RT_TRACE(rtlpriv, COMP_SEC, DBG_LOUD,
-                                ("WRITE %x: %x\n",
-                                 rtlpriv->cfg->maps[WCAMI], target_content));
-                       RT_TRACE(rtlpriv, COMP_SEC, DBG_LOUD,
-                                ("The Key ID is %d\n", entry_no));
-                       RT_TRACE(rtlpriv, COMP_SEC, DBG_LOUD,
-                                ("WRITE %x: %x\n",
-                                 rtlpriv->cfg->maps[RWCAM], target_command));
+                                "The Key ID is %d\n", entry_no);
+                       RT_TRACE(rtlpriv, COMP_SEC, DBG_LOUD, "WRITE %x: %x\n",
+                                rtlpriv->cfg->maps[RWCAM], target_command);
 
                } else if (entry_i == 1) {
 
@@ -94,10 +90,10 @@ static void rtl_cam_program_entry(struct ieee80211_hw *hw, u32 entry_no,
                        rtl_write_dword(rtlpriv, rtlpriv->cfg->maps[RWCAM],
                                        target_command);
 
-                       RT_TRACE(rtlpriv, COMP_SEC, DBG_LOUD,
-                                ("WRITE A4: %x\n", target_content));
-                       RT_TRACE(rtlpriv, COMP_SEC, DBG_LOUD,
-                                ("WRITE A0: %x\n", target_command));
+                       RT_TRACE(rtlpriv, COMP_SEC, DBG_LOUD, "WRITE A4: %x\n",
+                                target_content);
+                       RT_TRACE(rtlpriv, COMP_SEC, DBG_LOUD, "WRITE A0: %x\n",
+                                target_command);
 
                } else {
 
@@ -114,15 +110,15 @@ static void rtl_cam_program_entry(struct ieee80211_hw *hw, u32 entry_no,
                                        target_command);
                        udelay(100);
 
-                       RT_TRACE(rtlpriv, COMP_SEC, DBG_LOUD,
-                                ("WRITE A4: %x\n", target_content));
-                       RT_TRACE(rtlpriv, COMP_SEC, DBG_LOUD,
-                                ("WRITE A0: %x\n", target_command));
+                       RT_TRACE(rtlpriv, COMP_SEC, DBG_LOUD, "WRITE A4: %x\n",
+                                target_content);
+                       RT_TRACE(rtlpriv, COMP_SEC, DBG_LOUD, "WRITE A0: %x\n",
+                                target_command);
                }
        }
 
-       RT_TRACE(rtlpriv, COMP_SEC, DBG_LOUD,
-                ("after set key, usconfig:%x\n", us_config));
+       RT_TRACE(rtlpriv, COMP_SEC, DBG_LOUD, "after set key, usconfig:%x\n",
+                us_config);
 }
 
 u8 rtl_cam_add_one_entry(struct ieee80211_hw *hw, u8 *mac_addr,
@@ -133,14 +129,13 @@ u8 rtl_cam_add_one_entry(struct ieee80211_hw *hw, u8 *mac_addr,
        struct rtl_priv *rtlpriv = rtl_priv(hw);
 
        RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG,
-                ("EntryNo:%x, ulKeyId=%x, ulEncAlg=%x, "
-                 "ulUseDK=%x MacAddr %pM\n",
-                 ul_entry_idx, ul_key_id, ul_enc_alg,
-                 ul_default_key, mac_addr));
+                "EntryNo:%x, ulKeyId=%x, ulEncAlg=%x, ulUseDK=%x MacAddr %pM\n",
+                ul_entry_idx, ul_key_id, ul_enc_alg,
+                ul_default_key, mac_addr);
 
        if (ul_key_id == TOTAL_CAM_ENTRY) {
                RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
-                        ("<=== ulKeyId exceed!\n"));
+                        "<=== ulKeyId exceed!\n");
                return 0;
        }
 
@@ -153,7 +148,7 @@ u8 rtl_cam_add_one_entry(struct ieee80211_hw *hw, u8 *mac_addr,
        rtl_cam_program_entry(hw, ul_entry_idx, mac_addr,
                              (u8 *) key_content, us_config);
 
-       RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG, ("<===\n"));
+       RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG, "<===\n");
 
        return 1;
 
@@ -166,7 +161,7 @@ int rtl_cam_delete_one_entry(struct ieee80211_hw *hw,
        u32 ul_command;
        struct rtl_priv *rtlpriv = rtl_priv(hw);
 
-       RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG, ("key_idx:%d\n", ul_key_id));
+       RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG, "key_idx:%d\n", ul_key_id);
 
        ul_command = ul_key_id * CAM_CONTENT_COUNT;
        ul_command = ul_command | BIT(31) | BIT(16);
@@ -175,9 +170,9 @@ int rtl_cam_delete_one_entry(struct ieee80211_hw *hw,
        rtl_write_dword(rtlpriv, rtlpriv->cfg->maps[RWCAM], ul_command);
 
        RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG,
-                ("rtl_cam_delete_one_entry(): WRITE A4: %x\n", 0));
+                "rtl_cam_delete_one_entry(): WRITE A4: %x\n", 0);
        RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG,
-                ("rtl_cam_delete_one_entry(): WRITE A0: %x\n", ul_command));
+                "rtl_cam_delete_one_entry(): WRITE A0: %x\n", ul_command);
 
        return 0;
 
@@ -229,9 +224,9 @@ void rtl_cam_mark_invalid(struct ieee80211_hw *hw, u8 uc_index)
        rtl_write_dword(rtlpriv, rtlpriv->cfg->maps[RWCAM], ul_command);
 
        RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG,
-                ("rtl_cam_mark_invalid(): WRITE A4: %x\n", ul_content));
+                "rtl_cam_mark_invalid(): WRITE A4: %x\n", ul_content);
        RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG,
-                ("rtl_cam_mark_invalid(): WRITE A0: %x\n", ul_command));
+                "rtl_cam_mark_invalid(): WRITE A0: %x\n", ul_command);
 }
 EXPORT_SYMBOL(rtl_cam_mark_invalid);
 
@@ -279,11 +274,11 @@ void rtl_cam_empty_entry(struct ieee80211_hw *hw, u8 uc_index)
                rtl_write_dword(rtlpriv, rtlpriv->cfg->maps[RWCAM], ul_command);
 
                RT_TRACE(rtlpriv, COMP_SEC, DBG_LOUD,
-                        ("rtl_cam_empty_entry(): WRITE A4: %x\n",
-                         ul_content));
+                        "rtl_cam_empty_entry(): WRITE A4: %x\n",
+                        ul_content);
                RT_TRACE(rtlpriv, COMP_SEC, DBG_LOUD,
-                        ("rtl_cam_empty_entry(): WRITE A0: %x\n",
-                         ul_command));
+                        "rtl_cam_empty_entry(): WRITE A0: %x\n",
+                        ul_command);
        }
 
 }
@@ -297,8 +292,7 @@ u8 rtl_cam_get_free_entry(struct ieee80211_hw *hw, u8 *sta_addr)
        u8 i, *addr;
 
        if (NULL == sta_addr) {
-               RT_TRACE(rtlpriv, COMP_SEC, DBG_EMERG,
-                       ("sta_addr is NULL.\n"));
+               RT_TRACE(rtlpriv, COMP_SEC, DBG_EMERG, "sta_addr is NULL\n");
                return TOTAL_CAM_ENTRY;
        }
        /* Does STA already exist? */
@@ -311,8 +305,8 @@ u8 rtl_cam_get_free_entry(struct ieee80211_hw *hw, u8 *sta_addr)
        for (entry_idx = 4; entry_idx < TOTAL_CAM_ENTRY; entry_idx++) {
                if ((bitmap & BIT(0)) == 0) {
                        RT_TRACE(rtlpriv, COMP_SEC, DBG_EMERG,
-                               ("-----hwsec_cam_bitmap: 0x%x entry_idx=%d\n",
-                                rtlpriv->sec.hwsec_cam_bitmap, entry_idx));
+                                "-----hwsec_cam_bitmap: 0x%x entry_idx=%d\n",
+                                rtlpriv->sec.hwsec_cam_bitmap, entry_idx);
                        rtlpriv->sec.hwsec_cam_bitmap |= BIT(0) << entry_idx;
                        memcpy(rtlpriv->sec.hwsec_cam_sta_addr[entry_idx],
                               sta_addr, ETH_ALEN);
@@ -331,14 +325,13 @@ void rtl_cam_del_entry(struct ieee80211_hw *hw, u8 *sta_addr)
        u8 i, *addr;
 
        if (NULL == sta_addr) {
-               RT_TRACE(rtlpriv, COMP_SEC, DBG_EMERG,
-                       ("sta_addr is NULL.\n"));
+               RT_TRACE(rtlpriv, COMP_SEC, DBG_EMERG, "sta_addr is NULL\n");
        }
 
        if ((sta_addr[0]|sta_addr[1]|sta_addr[2]|sta_addr[3]|\
                                sta_addr[4]|sta_addr[5]) == 0) {
                RT_TRACE(rtlpriv, COMP_SEC, DBG_EMERG,
-                       ("sta_addr is 00:00:00:00:00:00.\n"));
+                        "sta_addr is 00:00:00:00:00:00\n");
                return;
        }
        /* Does STA already exist? */
index c62da4e..35e0008 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2009-2010  Realtek Corporation.
+ * Copyright(c) 2009-2012  Realtek Corporation.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
index 3f0f056..278e9f9 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2009-2010  Realtek Corporation.
+ * Copyright(c) 2009-2012  Realtek Corporation.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
 #include "core.h"
 #include "cam.h"
 #include "base.h"
+#include "pci.h"
 #include "ps.h"
 
+#include <linux/export.h>
+
+void rtl_fw_cb(const struct firmware *firmware, void *context)
+{
+       struct ieee80211_hw *hw = context;
+       struct rtl_priv *rtlpriv = rtl_priv(hw);
+       int err;
+
+       RT_TRACE(rtlpriv, COMP_ERR, DBG_LOUD,
+                        "Firmware callback routine entered!\n");
+       complete(&rtlpriv->firmware_loading_complete);
+       if (!firmware) {
+               pr_err("Firmware %s not available\n", rtlpriv->cfg->fw_name);
+               rtlpriv->max_fw_size = 0;
+               return;
+       }
+       if (firmware->size > rtlpriv->max_fw_size) {
+               RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
+                        "Firmware is too big!\n");
+               release_firmware(firmware);
+               return;
+       }
+       memcpy(rtlpriv->rtlhal.pfirmware, firmware->data, firmware->size);
+       rtlpriv->rtlhal.fwsize = firmware->size;
+       release_firmware(firmware);
+
+       err = ieee80211_register_hw(hw);
+       if (err) {
+               RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
+                        "Can't register mac80211 hw\n");
+               return;
+       } else {
+               rtlpriv->mac80211.mac80211_registered = 1;
+       }
+       set_bit(RTL_STATUS_INTERFACE_START, &rtlpriv->status);
+
+       /*init rfkill */
+       rtl_init_rfkill(hw);
+}
+EXPORT_SYMBOL(rtl_fw_cb);
+
 /*mutex for start & stop is must here. */
 static int rtl_op_start(struct ieee80211_hw *hw)
 {
@@ -112,9 +154,11 @@ static int rtl_op_add_interface(struct ieee80211_hw *hw,
        struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
        int err = 0;
 
+       vif->driver_flags |= IEEE80211_VIF_BEACON_FILTER;
+
        if (mac->vif) {
                RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
-                        ("vif has been set!! mac->vif = 0x%p\n", mac->vif));
+                        "vif has been set!! mac->vif = 0x%p\n", mac->vif);
                return -EOPNOTSUPP;
        }
 
@@ -125,7 +169,7 @@ static int rtl_op_add_interface(struct ieee80211_hw *hw,
        case NL80211_IFTYPE_STATION:
                if (mac->beacon_enabled == 1) {
                        RT_TRACE(rtlpriv, COMP_MAC80211, DBG_LOUD,
-                                ("NL80211_IFTYPE_STATION\n"));
+                                "NL80211_IFTYPE_STATION\n");
                        mac->beacon_enabled = 0;
                        rtlpriv->cfg->ops->update_interrupt_mask(hw, 0,
                                        rtlpriv->cfg->maps
@@ -134,7 +178,7 @@ static int rtl_op_add_interface(struct ieee80211_hw *hw,
                break;
        case NL80211_IFTYPE_ADHOC:
                RT_TRACE(rtlpriv, COMP_MAC80211, DBG_LOUD,
-                        ("NL80211_IFTYPE_ADHOC\n"));
+                        "NL80211_IFTYPE_ADHOC\n");
 
                mac->link_state = MAC80211_LINKED;
                rtlpriv->cfg->ops->set_bcn_reg(hw);
@@ -148,7 +192,7 @@ static int rtl_op_add_interface(struct ieee80211_hw *hw,
                break;
        case NL80211_IFTYPE_AP:
                RT_TRACE(rtlpriv, COMP_MAC80211, DBG_LOUD,
-                        ("NL80211_IFTYPE_AP\n"));
+                        "NL80211_IFTYPE_AP\n");
 
                mac->link_state = MAC80211_LINKED;
                rtlpriv->cfg->ops->set_bcn_reg(hw);
@@ -161,7 +205,7 @@ static int rtl_op_add_interface(struct ieee80211_hw *hw,
                break;
        default:
                RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                        ("operation mode %d is not support!\n", vif->type));
+                        "operation mode %d is not supported!\n", vif->type);
                err = -EOPNOTSUPP;
                goto out;
        }
@@ -221,7 +265,7 @@ static int rtl_op_config(struct ieee80211_hw *hw, u32 changed)
        mutex_lock(&rtlpriv->locks.conf_mutex);
        if (changed & IEEE80211_CONF_CHANGE_LISTEN_INTERVAL) {  /*BIT(2)*/
                RT_TRACE(rtlpriv, COMP_MAC80211, DBG_LOUD,
-                        ("IEEE80211_CONF_CHANGE_LISTEN_INTERVAL\n"));
+                        "IEEE80211_CONF_CHANGE_LISTEN_INTERVAL\n");
        }
 
        /*For IPS */
@@ -264,8 +308,8 @@ static int rtl_op_config(struct ieee80211_hw *hw, u32 changed)
 
        if (changed & IEEE80211_CONF_CHANGE_RETRY_LIMITS) {
                RT_TRACE(rtlpriv, COMP_MAC80211, DBG_LOUD,
-                        ("IEEE80211_CONF_CHANGE_RETRY_LIMITS %x\n",
-                         hw->conf.long_frame_max_tx_count));
+                        "IEEE80211_CONF_CHANGE_RETRY_LIMITS %x\n",
+                        hw->conf.long_frame_max_tx_count);
                mac->retry_long = hw->conf.long_frame_max_tx_count;
                mac->retry_short = hw->conf.long_frame_max_tx_count;
                rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_RETRY_LIMIT,
@@ -320,7 +364,7 @@ static int rtl_op_config(struct ieee80211_hw *hw, u32 changed)
                default:
                        mac->bw_40 = false;
                        RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                                       ("switch case not processed\n"));
+                                "switch case not processed\n");
                        break;
                }
 
@@ -369,12 +413,12 @@ static void rtl_op_configure_filter(struct ieee80211_hw *hw,
                        mac->rx_conf |= rtlpriv->cfg->maps[MAC_RCR_AM] |
                            rtlpriv->cfg->maps[MAC_RCR_AB];
                        RT_TRACE(rtlpriv, COMP_MAC80211, DBG_LOUD,
-                                ("Enable receive multicast frame.\n"));
+                                "Enable receive multicast frame\n");
                } else {
                        mac->rx_conf &= ~(rtlpriv->cfg->maps[MAC_RCR_AM] |
                                          rtlpriv->cfg->maps[MAC_RCR_AB]);
                        RT_TRACE(rtlpriv, COMP_MAC80211, DBG_LOUD,
-                                ("Disable receive multicast frame.\n"));
+                                "Disable receive multicast frame\n");
                }
        }
 
@@ -382,11 +426,11 @@ static void rtl_op_configure_filter(struct ieee80211_hw *hw,
                if (*new_flags & FIF_FCSFAIL) {
                        mac->rx_conf |= rtlpriv->cfg->maps[MAC_RCR_ACRC32];
                        RT_TRACE(rtlpriv, COMP_MAC80211, DBG_LOUD,
-                                ("Enable receive FCS error frame.\n"));
+                                "Enable receive FCS error frame\n");
                } else {
                        mac->rx_conf &= ~rtlpriv->cfg->maps[MAC_RCR_ACRC32];
                        RT_TRACE(rtlpriv, COMP_MAC80211, DBG_LOUD,
-                                ("Disable receive FCS error frame.\n"));
+                                "Disable receive FCS error frame\n");
                }
        }
 
@@ -409,11 +453,11 @@ static void rtl_op_configure_filter(struct ieee80211_hw *hw,
                        mac->rx_conf |= rtlpriv->cfg->maps[MAC_RCR_ACF];
 
                        RT_TRACE(rtlpriv, COMP_MAC80211, DBG_LOUD,
-                                ("Enable receive control frame.\n"));
+                                "Enable receive control frame\n");
                } else {
                        mac->rx_conf &= ~rtlpriv->cfg->maps[MAC_RCR_ACF];
                        RT_TRACE(rtlpriv, COMP_MAC80211, DBG_LOUD,
-                                ("Disable receive control frame.\n"));
+                                "Disable receive control frame\n");
                }
        }
 
@@ -421,11 +465,11 @@ static void rtl_op_configure_filter(struct ieee80211_hw *hw,
                if (*new_flags & FIF_OTHER_BSS) {
                        mac->rx_conf |= rtlpriv->cfg->maps[MAC_RCR_AAP];
                        RT_TRACE(rtlpriv, COMP_MAC80211, DBG_LOUD,
-                                ("Enable receive other BSS's frame.\n"));
+                                "Enable receive other BSS's frame\n");
                } else {
                        mac->rx_conf &= ~rtlpriv->cfg->maps[MAC_RCR_AAP];
                        RT_TRACE(rtlpriv, COMP_MAC80211, DBG_LOUD,
-                                ("Disable receive other BSS's frame.\n"));
+                                "Disable receive other BSS's frame\n");
                }
        }
 }
@@ -456,7 +500,7 @@ static int rtl_op_sta_add(struct ieee80211_hw *hw,
                        sta_entry->wireless_mode = WIRELESS_MODE_G;
 
                RT_TRACE(rtlpriv, COMP_MAC80211, DBG_DMESG,
-                       ("Add sta addr is %pM\n", sta->addr));
+                        "Add sta addr is %pM\n", sta->addr);
                rtlpriv->cfg->ops->update_rate_tbl(hw, sta, 0);
        }
        return 0;
@@ -469,7 +513,7 @@ static int rtl_op_sta_remove(struct ieee80211_hw *hw,
        struct rtl_sta_info *sta_entry;
        if (sta) {
                RT_TRACE(rtlpriv, COMP_MAC80211, DBG_DMESG,
-                       ("Remove sta addr is %pM\n", sta->addr));
+                        "Remove sta addr is %pM\n", sta->addr);
                sta_entry = (struct rtl_sta_info *) sta->drv_priv;
                sta_entry->wireless_mode = 0;
                sta_entry->ratr_index = 0;
@@ -514,7 +558,7 @@ static int rtl_op_conf_tx(struct ieee80211_hw *hw,
 
        if (queue >= AC_MAX) {
                RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
-                        ("queue number %d is incorrect!\n", queue));
+                        "queue number %d is incorrect!\n", queue);
                return -EINVAL;
        }
 
@@ -547,7 +591,7 @@ static void rtl_op_bss_info_changed(struct ieee80211_hw *hw,
                     bss_conf->enable_beacon)) {
                        if (mac->beacon_enabled == 0) {
                                RT_TRACE(rtlpriv, COMP_MAC80211, DBG_DMESG,
-                                        ("BSS_CHANGED_BEACON_ENABLED\n"));
+                                        "BSS_CHANGED_BEACON_ENABLED\n");
 
                                /*start hw beacon interrupt. */
                                /*rtlpriv->cfg->ops->set_bcn_reg(hw); */
@@ -565,7 +609,7 @@ static void rtl_op_bss_info_changed(struct ieee80211_hw *hw,
                        !bss_conf->enable_beacon)) {
                        if (mac->beacon_enabled == 1) {
                                RT_TRACE(rtlpriv, COMP_MAC80211, DBG_DMESG,
-                                        ("ADHOC DISABLE BEACON\n"));
+                                        "ADHOC DISABLE BEACON\n");
 
                                mac->beacon_enabled = 0;
                                rtlpriv->cfg->ops->update_interrupt_mask(hw, 0,
@@ -575,7 +619,7 @@ static void rtl_op_bss_info_changed(struct ieee80211_hw *hw,
                }
                if (changed & BSS_CHANGED_BEACON_INT) {
                        RT_TRACE(rtlpriv, COMP_BEACON, DBG_TRACE,
-                                ("BSS_CHANGED_BEACON_INT\n"));
+                                "BSS_CHANGED_BEACON_INT\n");
                        mac->beacon_interval = bss_conf->beacon_int;
                        rtlpriv->cfg->ops->set_bcn_intv(hw);
                }
@@ -604,7 +648,7 @@ static void rtl_op_bss_info_changed(struct ieee80211_hw *hw,
                        if (mac->opmode == NL80211_IFTYPE_STATION && sta)
                                rtlpriv->cfg->ops->update_rate_tbl(hw, sta, 0);
                        RT_TRACE(rtlpriv, COMP_MAC80211, DBG_DMESG,
-                                ("BSS_CHANGED_ASSOC\n"));
+                                "BSS_CHANGED_ASSOC\n");
                } else {
                        if (mac->link_state == MAC80211_LINKED)
                                rtl_lps_leave(hw);
@@ -619,20 +663,20 @@ static void rtl_op_bss_info_changed(struct ieee80211_hw *hw,
                        mac->vendor = PEER_UNKNOWN;
 
                        RT_TRACE(rtlpriv, COMP_MAC80211, DBG_DMESG,
-                                ("BSS_CHANGED_UN_ASSOC\n"));
+                                "BSS_CHANGED_UN_ASSOC\n");
                }
        }
 
        if (changed & BSS_CHANGED_ERP_CTS_PROT) {
                RT_TRACE(rtlpriv, COMP_MAC80211, DBG_TRACE,
-                        ("BSS_CHANGED_ERP_CTS_PROT\n"));
+                        "BSS_CHANGED_ERP_CTS_PROT\n");
                mac->use_cts_protect = bss_conf->use_cts_prot;
        }
 
        if (changed & BSS_CHANGED_ERP_PREAMBLE) {
                RT_TRACE(rtlpriv, COMP_MAC80211, DBG_LOUD,
-                        ("BSS_CHANGED_ERP_PREAMBLE use short preamble:%x\n",
-                         bss_conf->use_short_preamble));
+                        "BSS_CHANGED_ERP_PREAMBLE use short preamble:%x\n",
+                        bss_conf->use_short_preamble);
 
                mac->short_preamble = bss_conf->use_short_preamble;
                rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_ACK_PREAMBLE,
@@ -641,7 +685,7 @@ static void rtl_op_bss_info_changed(struct ieee80211_hw *hw,
 
        if (changed & BSS_CHANGED_ERP_SLOT) {
                RT_TRACE(rtlpriv, COMP_MAC80211, DBG_TRACE,
-                        ("BSS_CHANGED_ERP_SLOT\n"));
+                        "BSS_CHANGED_ERP_SLOT\n");
 
                if (bss_conf->use_short_slot)
                        mac->slot_time = RTL_SLOT_TIME_9;
@@ -653,8 +697,7 @@ static void rtl_op_bss_info_changed(struct ieee80211_hw *hw,
        }
 
        if (changed & BSS_CHANGED_HT) {
-               RT_TRACE(rtlpriv, COMP_MAC80211, DBG_TRACE,
-                        ("BSS_CHANGED_HT\n"));
+               RT_TRACE(rtlpriv, COMP_MAC80211, DBG_TRACE, "BSS_CHANGED_HT\n");
                rcu_read_lock();
                sta = get_sta(hw, vif, bss_conf->bssid);
                if (sta) {
@@ -683,8 +726,8 @@ static void rtl_op_bss_info_changed(struct ieee80211_hw *hw,
                rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_BSSID,
                                              (u8 *) bss_conf->bssid);
 
-               RT_TRACE(rtlpriv, COMP_MAC80211, DBG_DMESG,
-                        ("%pM\n", bss_conf->bssid));
+               RT_TRACE(rtlpriv, COMP_MAC80211, DBG_DMESG, "%pM\n",
+                        bss_conf->bssid);
 
                mac->vendor = PEER_UNKNOWN;
                memcpy(mac->bssid, bss_conf->bssid, 6);
@@ -831,30 +874,30 @@ static int rtl_op_ampdu_action(struct ieee80211_hw *hw,
        switch (action) {
        case IEEE80211_AMPDU_TX_START:
                RT_TRACE(rtlpriv, COMP_MAC80211, DBG_TRACE,
-                        ("IEEE80211_AMPDU_TX_START: TID:%d\n", tid));
+                        "IEEE80211_AMPDU_TX_START: TID:%d\n", tid);
                return rtl_tx_agg_start(hw, sta, tid, ssn);
                break;
        case IEEE80211_AMPDU_TX_STOP:
                RT_TRACE(rtlpriv, COMP_MAC80211, DBG_TRACE,
-                        ("IEEE80211_AMPDU_TX_STOP: TID:%d\n", tid));
+                        "IEEE80211_AMPDU_TX_STOP: TID:%d\n", tid);
                return rtl_tx_agg_stop(hw, sta, tid);
                break;
        case IEEE80211_AMPDU_TX_OPERATIONAL:
                RT_TRACE(rtlpriv, COMP_MAC80211, DBG_TRACE,
-                        ("IEEE80211_AMPDU_TX_OPERATIONAL:TID:%d\n", tid));
+                        "IEEE80211_AMPDU_TX_OPERATIONAL:TID:%d\n", tid);
                rtl_tx_agg_oper(hw, sta, tid);
                break;
        case IEEE80211_AMPDU_RX_START:
                RT_TRACE(rtlpriv, COMP_MAC80211, DBG_TRACE,
-                        ("IEEE80211_AMPDU_RX_START:TID:%d\n", tid));
+                        "IEEE80211_AMPDU_RX_START:TID:%d\n", tid);
                break;
        case IEEE80211_AMPDU_RX_STOP:
                RT_TRACE(rtlpriv, COMP_MAC80211, DBG_TRACE,
-                        ("IEEE80211_AMPDU_RX_STOP:TID:%d\n", tid));
+                        "IEEE80211_AMPDU_RX_STOP:TID:%d\n", tid);
                break;
        default:
                RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                        ("IEEE80211_AMPDU_ERR!!!!:\n"));
+                        "IEEE80211_AMPDU_ERR!!!!:\n");
                return -EOPNOTSUPP;
        }
        return 0;
@@ -867,7 +910,7 @@ static void rtl_op_sw_scan_start(struct ieee80211_hw *hw)
 
        mac->act_scanning = true;
 
-       RT_TRACE(rtlpriv, COMP_MAC80211, DBG_LOUD, ("\n"));
+       RT_TRACE(rtlpriv, COMP_MAC80211, DBG_LOUD, "\n");
 
        if (mac->link_state == MAC80211_LINKED) {
                rtl_lps_leave(hw);
@@ -888,7 +931,7 @@ static void rtl_op_sw_scan_complete(struct ieee80211_hw *hw)
        struct rtl_priv *rtlpriv = rtl_priv(hw);
        struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
 
-       RT_TRACE(rtlpriv, COMP_MAC80211, DBG_LOUD, ("\n"));
+       RT_TRACE(rtlpriv, COMP_MAC80211, DBG_LOUD, "\n");
        mac->act_scanning = false;
        /* Dual mac */
        rtlpriv->rtlhal.load_imrandiqk_setting_for2g = false;
@@ -921,13 +964,13 @@ static int rtl_op_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
 
        if (rtlpriv->cfg->mod_params->sw_crypto || rtlpriv->sec.use_sw_sec) {
                RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
-                        ("not open hw encryption\n"));
+                        "not open hw encryption\n");
                return -ENOSPC; /*User disabled HW-crypto */
        }
        RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG,
-                ("%s hardware based encryption for keyidx: %d, mac: %pM\n",
-                 cmd == SET_KEY ? "Using" : "Disabling", key->keyidx,
-                 sta ? sta->addr : bcast_addr));
+                "%s hardware based encryption for keyidx: %d, mac: %pM\n",
+                cmd == SET_KEY ? "Using" : "Disabling", key->keyidx,
+                sta ? sta->addr : bcast_addr);
        rtlpriv->sec.being_setkey = true;
        rtl_ips_nic_on(hw);
        mutex_lock(&rtlpriv->locks.conf_mutex);
@@ -936,24 +979,23 @@ static int rtl_op_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
        switch (key->cipher) {
        case WLAN_CIPHER_SUITE_WEP40:
                key_type = WEP40_ENCRYPTION;
-               RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG, ("alg:WEP40\n"));
+               RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG, "alg:WEP40\n");
                break;
        case WLAN_CIPHER_SUITE_WEP104:
-               RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG,
-                        ("alg:WEP104\n"));
+               RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG, "alg:WEP104\n");
                key_type = WEP104_ENCRYPTION;
                break;
        case WLAN_CIPHER_SUITE_TKIP:
                key_type = TKIP_ENCRYPTION;
-               RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG, ("alg:TKIP\n"));
+               RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG, "alg:TKIP\n");
                break;
        case WLAN_CIPHER_SUITE_CCMP:
                key_type = AESCCMP_ENCRYPTION;
-               RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG, ("alg:CCMP\n"));
+               RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG, "alg:CCMP\n");
                break;
        default:
-               RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                        ("alg_err:%x!!!!:\n", key->cipher));
+               RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "alg_err:%x!!!!\n",
+                        key->cipher);
                goto out_unlock;
        }
        if (key_type == WEP40_ENCRYPTION ||
@@ -995,8 +1037,8 @@ static int rtl_op_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
                                wep_only = true;
                        rtlpriv->sec.pairwise_enc_algorithm = key_type;
                        RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG,
-                               ("set enable_hw_sec, key_type:%x(OPEN:0 WEP40:1"
-                               " TKIP:2 AES:4 WEP104:5)\n", key_type));
+                                "set enable_hw_sec, key_type:%x(OPEN:0 WEP40:1 TKIP:2 AES:4 WEP104:5)\n",
+                                key_type);
                        rtlpriv->cfg->ops->enable_hw_sec(hw);
                }
        }
@@ -1005,7 +1047,7 @@ static int rtl_op_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
        case SET_KEY:
                if (wep_only) {
                        RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG,
-                                ("set WEP(group/pairwise) key\n"));
+                                "set WEP(group/pairwise) key\n");
                        /* Pairwise key with an assigned MAC address. */
                        rtlpriv->sec.pairwise_enc_algorithm = key_type;
                        rtlpriv->sec.group_enc_algorithm = key_type;
@@ -1016,7 +1058,7 @@ static int rtl_op_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
                        memcpy(mac_addr, zero_addr, ETH_ALEN);
                } else if (group_key) { /* group key */
                        RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG,
-                                ("set group key\n"));
+                                "set group key\n");
                        /* group key */
                        rtlpriv->sec.group_enc_algorithm = key_type;
                        /*set local buf about group key. */
@@ -1026,10 +1068,10 @@ static int rtl_op_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
                        memcpy(mac_addr, bcast_addr, ETH_ALEN);
                } else {        /* pairwise key */
                        RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG,
-                                ("set pairwise key\n"));
+                                "set pairwise key\n");
                        if (!sta) {
-                               RT_ASSERT(false, ("pairwise key withnot"
-                                                 "mac_addr\n"));
+                               RT_ASSERT(false,
+                                         "pairwise key without mac_addr\n");
 
                                err = -EOPNOTSUPP;
                                goto out_unlock;
@@ -1056,7 +1098,7 @@ static int rtl_op_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
                break;
        case DISABLE_KEY:
                RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG,
-                        ("disable key delete one entry\n"));
+                        "disable key delete one entry\n");
                /*set local buf about wep key. */
                if (mac->opmode == NL80211_IFTYPE_AP) {
                        if (sta)
@@ -1077,7 +1119,7 @@ static int rtl_op_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
                break;
        default:
                RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                        ("cmd_err:%x!!!!:\n", cmd));
+                        "cmd_err:%x!!!!\n", cmd);
        }
 out_unlock:
        mutex_unlock(&rtlpriv->locks.conf_mutex);
@@ -1106,8 +1148,8 @@ static void rtl_op_rfkill_poll(struct ieee80211_hw *hw)
                        rtlpriv->rfkill.rfkill_state = radio_state;
 
                        RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG,
-                                (KERN_INFO "wireless radio switch turned %s\n",
-                                 radio_state ? "on" : "off"));
+                                "wireless radio switch turned %s\n",
+                                radio_state ? "on" : "off");
 
                        blocked = (rtlpriv->rfkill.rfkill_state == 1) ? 0 : 1;
                        wiphy_rfkill_set_hw_state(hw->wiphy, blocked);
index f02824a..2fe46a1 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2009-2010  Realtek Corporation.
+ * Copyright(c) 2009-2012  Realtek Corporation.
  *
  * Tmis program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
@@ -30,8 +30,6 @@
 #ifndef __RTL_CORE_H__
 #define __RTL_CORE_H__
 
-#include <net/mac80211.h>
-
 #define RTL_SUPPORTED_FILTERS          \
        (FIF_PROMISC_IN_BSS | \
        FIF_ALLMULTI | FIF_CONTROL | \
@@ -42,4 +40,6 @@
 #define RTL_SUPPORTED_CTRL_FILTER      0xFF
 
 extern const struct ieee80211_ops rtl_ops;
+void rtl_fw_cb(const struct firmware *firmware, void *context);
+
 #endif
index 1b5cb71..bdda9b2 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2009-2010  Realtek Corporation.
+ * Copyright(c) 2009-2012  Realtek Corporation.
  *
  * Tmis program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
@@ -28,6 +28,8 @@
 
 #include "wifi.h"
 
+#include <linux/moduleparam.h>
+
 void rtl_dbgp_flag_init(struct ieee80211_hw *hw)
 {
        struct rtl_priv *rtlpriv = rtl_priv(hw);
index 160dd06..07493d2 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2009-2010  Realtek Corporation.
+ * Copyright(c) 2009-2012  Realtek Corporation.
  *
  * Tmis program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
@@ -156,53 +156,78 @@ enum dbgp_flag_e {
        DBGP_TYPE_MAX
 };
 
-#define RT_ASSERT(_exp, fmt)                           \
-       do {                                            \
-               if (!(_exp)) {                  \
-                       printk(KERN_DEBUG "%s:%s(): ", KBUILD_MODNAME, \
-                       __func__);                      \
-                       printk fmt;                     \
-               } \
-       } while (0);
-
-#define RT_TRACE(rtlpriv, comp, level, fmt)\
-       do { \
-               if (unlikely(((comp) & rtlpriv->dbg.global_debugcomponents) && \
-                       ((level) <= rtlpriv->dbg.global_debuglevel))) {\
-                       printk(KERN_DEBUG "%s:%s():<%lx-%x> ", KBUILD_MODNAME, \
-                       __func__, in_interrupt(), in_atomic()); \
-                       printk fmt;                             \
-               } \
-       } while (0);
-
-#define RTPRINT(rtlpriv, dbgtype, dbgflag, printstr)   \
-       do {                                            \
-               if (unlikely(rtlpriv->dbg.dbgp_type[dbgtype] & dbgflag)) { \
-                       printk(KERN_DEBUG "%s: ", KBUILD_MODNAME);      \
-                       printk printstr;                \
-               }                                       \
-       } while (0);
-
-#define RT_PRINT_DATA(rtlpriv, _comp, _level, _titlestring, _hexdata, \
-               _hexdatalen) \
-       do {\
-               if (unlikely(((_comp) & rtlpriv->dbg.global_debugcomponents) &&\
-                       (_level <= rtlpriv->dbg.global_debuglevel)))    { \
-                       int __i;                                        \
-                       u8*     ptr = (u8 *)_hexdata;                   \
-                       printk(KERN_DEBUG "%s: ", KBUILD_MODNAME);      \
-                       printk("In process \"%s\" (pid %i):", current->comm,\
-                                       current->pid); \
-                       printk(_titlestring);           \
-                       for (__i = 0; __i < (int)_hexdatalen; __i++) {  \
-                               printk("%02X%s", ptr[__i], (((__i + 1) % 4)\
-                                                       == 0) ? "  " : " ");\
-                               if (((__i + 1) % 16) == 0)              \
-                                       printk("\n");                   \
-                       }                               \
-                       printk(KERN_DEBUG "\n");                        \
-               } \
-       } while (0);
+#ifdef CONFIG_RTLWIFI_DEBUG
+
+#define RT_ASSERT(_exp, fmt, ...)                                      \
+do {                                                                   \
+       if (!(_exp)) {                                                  \
+               printk(KERN_DEBUG KBUILD_MODNAME ":%s(): " fmt,         \
+                      __func__, ##__VA_ARGS__);                        \
+       }                                                               \
+} while (0)
+
+#define RT_TRACE(rtlpriv, comp, level, fmt, ...)                       \
+do {                                                                   \
+       if (unlikely(((comp) & rtlpriv->dbg.global_debugcomponents) &&  \
+                    ((level) <= rtlpriv->dbg.global_debuglevel))) {    \
+               printk(KERN_DEBUG KBUILD_MODNAME ":%s():<%lx-%x> " fmt, \
+                      __func__, in_interrupt(), in_atomic(),           \
+                      ##__VA_ARGS__);                                  \
+       }                                                               \
+} while (0)
+
+#define RTPRINT(rtlpriv, dbgtype, dbgflag, fmt, ...)                   \
+do {                                                                   \
+       if (unlikely(rtlpriv->dbg.dbgp_type[dbgtype] & dbgflag)) {      \
+               printk(KERN_DEBUG KBUILD_MODNAME ": " fmt,              \
+                      ##__VA_ARGS__);                                  \
+       }                                                               \
+} while (0)
+
+#define RT_PRINT_DATA(rtlpriv, _comp, _level, _titlestring, _hexdata,  \
+                     _hexdatalen)                                      \
+do {                                                                   \
+       if (unlikely(((_comp) & rtlpriv->dbg.global_debugcomponents) && \
+                    (_level <= rtlpriv->dbg.global_debuglevel))) {     \
+               printk(KERN_DEBUG "%s: In process \"%s\" (pid %i): %s\n", \
+                      KBUILD_MODNAME, current->comm, current->pid,     \
+                      _titlestring);                                   \
+               print_hex_dump_bytes("", DUMP_PREFIX_NONE,              \
+                                    _hexdata, _hexdatalen);            \
+       }                                                               \
+} while (0)
+
+#else
+
+struct rtl_priv;
+
+__printf(2, 3)
+static inline void RT_ASSERT(int exp, const char *fmt, ...)
+{
+}
+
+__printf(4, 5)
+static inline void RT_TRACE(struct rtl_priv *rtlpriv,
+                           int comp, int level,
+                           const char *fmt, ...)
+{
+}
+
+__printf(4, 5)
+static inline void RTPRINT(struct rtl_priv *rtlpriv,
+                          int dbgtype, int dbgflag,
+                          const char *fmt, ...)
+{
+}
+
+static inline void RT_PRINT_DATA(struct rtl_priv *rtlpriv,
+                                int comp, int level,
+                                const char *titlestring,
+                                const void *hexdata, size_t hexdatalen)
+{
+}
+
+#endif
 
 void rtl_dbgp_flag_init(struct ieee80211_hw *hw);
 #endif
index ed1058b..1f14380 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2009-2010  Realtek Corporation.
+ * Copyright(c) 2009-2012  Realtek Corporation.
  *
  * Tmis program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
@@ -162,8 +162,8 @@ void efuse_write_1byte(struct ieee80211_hw *hw, u16 address, u8 value)
        const u32 efuse_len =
                rtlpriv->cfg->maps[EFUSE_REAL_CONTENT_SIZE];
 
-       RT_TRACE(rtlpriv, COMP_EFUSE, DBG_LOUD,
-                ("Addr=%x Data =%x\n", address, value));
+       RT_TRACE(rtlpriv, COMP_EFUSE, DBG_LOUD, "Addr=%x Data =%x\n",
+                address, value);
 
        if (address < efuse_len) {
                rtl_write_byte(rtlpriv, rtlpriv->cfg->maps[EFUSE_CTRL], value);
@@ -252,8 +252,8 @@ void read_efuse(struct ieee80211_hw *hw, u16 _offset, u16 _size_byte, u8 *pbuf)
 
        if ((_offset + _size_byte) > rtlpriv->cfg->maps[EFUSE_HWSET_MAX_SIZE]) {
                RT_TRACE(rtlpriv, COMP_EFUSE, DBG_LOUD,
-                        ("read_efuse(): Invalid offset(%#x) with read "
-                         "bytes(%#x)!!\n", _offset, _size_byte));
+                        "read_efuse(): Invalid offset(%#x) with read bytes(%#x)!!\n",
+                        _offset, _size_byte);
                return;
        }
 
@@ -280,7 +280,7 @@ void read_efuse(struct ieee80211_hw *hw, u16 _offset, u16 _size_byte, u8 *pbuf)
        if (*rtemp8 != 0xFF) {
                efuse_utilized++;
                RTPRINT(rtlpriv, FEEPROM, EFUSE_READ_ALL,
-                       ("Addr=%d\n", efuse_addr));
+                       "Addr=%d\n", efuse_addr);
                efuse_addr++;
        }
 
@@ -290,13 +290,13 @@ void read_efuse(struct ieee80211_hw *hw, u16 _offset, u16 _size_byte, u8 *pbuf)
                if (offset < efuse_max_section) {
                        wren = (*rtemp8 & 0x0f);
                        RTPRINT(rtlpriv, FEEPROM, EFUSE_READ_ALL,
-                               ("offset-%d Worden=%x\n", offset, wren));
+                               "offset-%d Worden=%x\n", offset, wren);
 
                        for (i = 0; i < EFUSE_MAX_WORD_UNIT; i++) {
                                if (!(wren & 0x01)) {
                                        RTPRINT(rtlpriv, FEEPROM,
-                                               EFUSE_READ_ALL, ("Addr=%d\n",
-                                                                efuse_addr));
+                                               EFUSE_READ_ALL,
+                                               "Addr=%d\n", efuse_addr);
 
                                        read_efuse_byte(hw, efuse_addr, rtemp8);
                                        efuse_addr++;
@@ -308,8 +308,8 @@ void read_efuse(struct ieee80211_hw *hw, u16 _offset, u16 _size_byte, u8 *pbuf)
                                                break;
 
                                        RTPRINT(rtlpriv, FEEPROM,
-                                               EFUSE_READ_ALL, ("Addr=%d\n",
-                                                                efuse_addr));
+                                               EFUSE_READ_ALL,
+                                               "Addr=%d\n", efuse_addr);
 
                                        read_efuse_byte(hw, efuse_addr, rtemp8);
                                        efuse_addr++;
@@ -326,7 +326,7 @@ void read_efuse(struct ieee80211_hw *hw, u16 _offset, u16 _size_byte, u8 *pbuf)
                }
 
                RTPRINT(rtlpriv, FEEPROM, EFUSE_READ_ALL,
-                       ("Addr=%d\n", efuse_addr));
+                       "Addr=%d\n", efuse_addr);
                read_efuse_byte(hw, efuse_addr, rtemp8);
                if (*rtemp8 != 0xFF && (efuse_addr < efuse_len)) {
                        efuse_utilized++;
@@ -395,9 +395,8 @@ bool efuse_shadow_update_chk(struct ieee80211_hw *hw)
                result = false;
 
        RT_TRACE(rtlpriv, COMP_EFUSE, DBG_LOUD,
-                ("efuse_shadow_update_chk(): totalbytes(%#x), "
-                 "hdr_num(%#x), words_need(%#x), efuse_used(%d)\n",
-                 totalbytes, hdr_num, words_need, efuse_used));
+                "efuse_shadow_update_chk(): totalbytes(%#x), hdr_num(%#x), words_need(%#x), efuse_used(%d)\n",
+                totalbytes, hdr_num, words_need, efuse_used);
 
        return result;
 }
@@ -434,7 +433,7 @@ bool efuse_shadow_update(struct ieee80211_hw *hw)
        u8 word_en = 0x0F;
        u8 first_pg = false;
 
-       RT_TRACE(rtlpriv, COMP_EFUSE, DBG_LOUD, ("--->\n"));
+       RT_TRACE(rtlpriv, COMP_EFUSE, DBG_LOUD, "--->\n");
 
        if (!efuse_shadow_update_chk(hw)) {
                efuse_read_all_map(hw, &rtlefuse->efuse_map[EFUSE_INIT_MAP][0]);
@@ -443,7 +442,7 @@ bool efuse_shadow_update(struct ieee80211_hw *hw)
                       rtlpriv->cfg->maps[EFUSE_HWSET_MAX_SIZE]);
 
                RT_TRACE(rtlpriv, COMP_EFUSE, DBG_LOUD,
-                        ("<---efuse out of capacity!!\n"));
+                        "<---efuse out of capacity!!\n");
                return false;
        }
        efuse_power_switch(hw, true, true);
@@ -478,12 +477,12 @@ bool efuse_shadow_update(struct ieee80211_hw *hw)
                               &rtlefuse->efuse_map[EFUSE_MODIFY_MAP][base],
                               8);
                        RT_PRINT_DATA(rtlpriv, COMP_INIT, DBG_LOUD,
-                                     ("U-efuse\n"), tmpdata, 8);
+                                     "U-efuse", tmpdata, 8);
 
                        if (!efuse_pg_packet_write(hw, (u8) offset, word_en,
                                                   tmpdata)) {
                                RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
-                                        ("PG section(%#x) fail!!\n", offset));
+                                        "PG section(%#x) fail!!\n", offset);
                                break;
                        }
                }
@@ -497,7 +496,7 @@ bool efuse_shadow_update(struct ieee80211_hw *hw)
               &rtlefuse->efuse_map[EFUSE_INIT_MAP][0],
               rtlpriv->cfg->maps[EFUSE_HWSET_MAX_SIZE]);
 
-       RT_TRACE(rtlpriv, COMP_EFUSE, DBG_LOUD, ("<---\n"));
+       RT_TRACE(rtlpriv, COMP_EFUSE, DBG_LOUD, "<---\n");
        return true;
 }
 
@@ -634,8 +633,8 @@ static int efuse_one_byte_write(struct ieee80211_hw *hw, u16 addr, u8 data)
        struct rtl_priv *rtlpriv = rtl_priv(hw);
        u8 tmpidx = 0;
 
-       RT_TRACE(rtlpriv, COMP_EFUSE, DBG_LOUD,
-                ("Addr = %x Data=%x\n", addr, data));
+       RT_TRACE(rtlpriv, COMP_EFUSE, DBG_LOUD, "Addr = %x Data=%x\n",
+                addr, data);
 
        rtl_write_byte(rtlpriv,
                       rtlpriv->cfg->maps[EFUSE_CTRL] + 1, (u8) (addr & 0xff));
@@ -778,7 +777,7 @@ static void efuse_write_data_case1(struct ieee80211_hw *hw, u16 *efuse_addr,
                                dataempty = false;
                }
 
-               if (dataempty == false) {
+               if (!dataempty) {
                        *efuse_addr = *efuse_addr + (tmp_word_cnts * 2) + 1;
                        *write_state = PG_STATE_HEADER;
                } else {
@@ -851,7 +850,7 @@ static void efuse_write_data_case1(struct ieee80211_hw *hw, u16 *efuse_addr,
                        }
                }
        }
-       RTPRINT(rtlpriv, FEEPROM, EFUSE_PG, ("efuse PG_STATE_HEADER-1\n"));
+       RTPRINT(rtlpriv, FEEPROM, EFUSE_PG,  "efuse PG_STATE_HEADER-1\n");
 }
 
 static void efuse_write_data_case2(struct ieee80211_hw *hw, u16 *efuse_addr,
@@ -916,7 +915,7 @@ static void efuse_write_data_case2(struct ieee80211_hw *hw, u16 *efuse_addr,
                }
 
                RTPRINT(rtlpriv, FEEPROM, EFUSE_PG,
-                       ("efuse PG_STATE_HEADER-2\n"));
+                       "efuse PG_STATE_HEADER-2\n");
        }
 }
 
@@ -936,7 +935,7 @@ static int efuse_pg_packet_write(struct ieee80211_hw *hw,
        if (efuse_get_current_size(hw) >=
            (EFUSE_MAX_SIZE - EFUSE_OOB_PROTECT_BYTES)) {
                RTPRINT(rtlpriv, FEEPROM, EFUSE_PG,
-                       ("efuse_pg_packet_write error\n"));
+                       "efuse_pg_packet_write error\n");
                return false;
        }
 
@@ -948,7 +947,7 @@ static int efuse_pg_packet_write(struct ieee80211_hw *hw,
        efuse_word_enable_data_read(word_en, data, target_pkt.data);
        target_word_cnts = efuse_calculate_word_cnts(target_pkt.word_en);
 
-       RTPRINT(rtlpriv, FEEPROM, EFUSE_PG, ("efuse Power ON\n"));
+       RTPRINT(rtlpriv, FEEPROM, EFUSE_PG,  "efuse Power ON\n");
 
        while (continual && (efuse_addr <
               (EFUSE_MAX_SIZE - EFUSE_OOB_PROTECT_BYTES))) {
@@ -956,7 +955,7 @@ static int efuse_pg_packet_write(struct ieee80211_hw *hw,
                if (write_state == PG_STATE_HEADER) {
                        badworden = 0x0F;
                        RTPRINT(rtlpriv, FEEPROM, EFUSE_PG,
-                               ("efuse PG_STATE_HEADER\n"));
+                               "efuse PG_STATE_HEADER\n");
 
                        if (efuse_one_byte_read(hw, efuse_addr, &efuse_data) &&
                            (efuse_data != 0xFF))
@@ -976,7 +975,7 @@ static int efuse_pg_packet_write(struct ieee80211_hw *hw,
 
                } else if (write_state == PG_STATE_DATA) {
                        RTPRINT(rtlpriv, FEEPROM, EFUSE_PG,
-                               ("efuse PG_STATE_DATA\n"));
+                               "efuse PG_STATE_DATA\n");
                        badworden =
                            efuse_word_enable_data_write(hw, efuse_addr + 1,
                                                         target_pkt.word_en,
@@ -999,14 +998,14 @@ static int efuse_pg_packet_write(struct ieee80211_hw *hw,
                                        result = false;
                                }
                                RTPRINT(rtlpriv, FEEPROM, EFUSE_PG,
-                                       ("efuse PG_STATE_HEADER-3\n"));
+                                       "efuse PG_STATE_HEADER-3\n");
                        }
                }
        }
 
        if (efuse_addr >= (EFUSE_MAX_SIZE - EFUSE_OOB_PROTECT_BYTES)) {
                RT_TRACE(rtlpriv, COMP_EFUSE, DBG_LOUD,
-                        ("efuse_addr(%#x) Out of size!!\n", efuse_addr));
+                        "efuse_addr(%#x) Out of size!!\n", efuse_addr);
        }
 
        return true;
@@ -1046,8 +1045,8 @@ static u8 efuse_word_enable_data_write(struct ieee80211_hw *hw,
        u8 tmpdata[8];
 
        memset(tmpdata, 0xff, PGPKT_DATA_SIZE);
-       RT_TRACE(rtlpriv, COMP_EFUSE, DBG_LOUD,
-                ("word_en = %x efuse_addr=%x\n", word_en, efuse_addr));
+       RT_TRACE(rtlpriv, COMP_EFUSE, DBG_LOUD, "word_en = %x efuse_addr=%x\n",
+                word_en, efuse_addr);
 
        if (!(word_en & BIT(0))) {
                tmpaddr = start_addr;
index 164daba..2bdea9a 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2009-2010  Realtek Corporation.
+ * Copyright(c) 2009-2012  Realtek Corporation.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
index 9245d88..07dd38e 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2009-2010  Realtek Corporation.
+ * Copyright(c) 2009-2012  Realtek Corporation.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
  *
  *****************************************************************************/
 
-#include <linux/export.h>
-#include "core.h"
 #include "wifi.h"
+#include "core.h"
 #include "pci.h"
 #include "base.h"
 #include "ps.h"
 #include "efuse.h"
+#include <linux/export.h>
 
 static const u16 pcibridge_vendors[PCI_BRIDGE_VENDOR_MAX] = {
        PCI_VENDOR_ID_INTEL,
@@ -170,7 +170,7 @@ static void _rtl_pci_update_default_setting(struct ieee80211_hw *hw)
                break;
        default:
                RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                        ("switch case not process\n"));
+                        "switch case not processed\n");
                break;
        }
 
@@ -198,7 +198,7 @@ static bool _rtl_pci_platform_switch_device_pci_aspm(
 }
 
 /*When we set 0x01 to enable clk request. Set 0x0 to disable clk req.*/
-static bool _rtl_pci_switch_clk_req(struct ieee80211_hw *hw, u8 value)
+static void _rtl_pci_switch_clk_req(struct ieee80211_hw *hw, u8 value)
 {
        struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
        struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
@@ -207,8 +207,6 @@ static bool _rtl_pci_switch_clk_req(struct ieee80211_hw *hw, u8 value)
 
        if (rtlhal->hw_type == HARDWARE_TYPE_RTL8192SE)
                udelay(100);
-
-       return true;
 }
 
 /*Disable RTL8192SE ASPM & Disable Pci Bridge ASPM*/
@@ -232,7 +230,7 @@ static void rtl_pci_disable_aspm(struct ieee80211_hw *hw)
 
        if (pcibridge_vendor == PCI_BRIDGE_VENDOR_UNKNOWN) {
                RT_TRACE(rtlpriv, COMP_POWER, DBG_TRACE,
-                        ("PCI(Bridge) UNKNOWN.\n"));
+                        "PCI(Bridge) UNKNOWN\n");
 
                return;
        }
@@ -286,7 +284,7 @@ static void rtl_pci_enable_aspm(struct ieee80211_hw *hw)
 
        if (pcibridge_vendor == PCI_BRIDGE_VENDOR_UNKNOWN) {
                RT_TRACE(rtlpriv, COMP_POWER, DBG_TRACE,
-                        ("PCI(Bridge) UNKNOWN.\n"));
+                        "PCI(Bridge) UNKNOWN\n");
                return;
        }
 
@@ -303,11 +301,10 @@ static void rtl_pci_enable_aspm(struct ieee80211_hw *hw)
                              u_pcibridge_aspmsetting);
 
        RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
-                ("PlatformEnableASPM():PciBridge busnumber[%x], "
-                 "DevNumbe[%x], funcnumber[%x], Write reg[%x] = %x\n",
-                 pcibridge_busnum, pcibridge_devnum, pcibridge_funcnum,
-                 (pcipriv->ndis_adapter.pcibridge_pciehdr_offset + 0x10),
-                 u_pcibridge_aspmsetting));
+                "PlatformEnableASPM():PciBridge busnumber[%x], DevNumbe[%x], funcnumber[%x], Write reg[%x] = %x\n",
+                pcibridge_busnum, pcibridge_devnum, pcibridge_funcnum,
+                (pcipriv->ndis_adapter.pcibridge_pciehdr_offset + 0x10),
+                u_pcibridge_aspmsetting);
 
        udelay(50);
 
@@ -382,9 +379,8 @@ static void rtl_pci_parse_configuration(struct pci_dev *pdev,
        pci_read_config_byte(pdev, pos + PCI_EXP_LNKCTL, &linkctrl_reg);
        pcipriv->ndis_adapter.linkctrl_reg = linkctrl_reg;
 
-       RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
-                ("Link Control Register =%x\n",
-                 pcipriv->ndis_adapter.linkctrl_reg));
+       RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, "Link Control Register =%x\n",
+                pcipriv->ndis_adapter.linkctrl_reg);
 
        pci_read_config_byte(pdev, 0x98, &tmp);
        tmp |= BIT(4);
@@ -551,11 +547,10 @@ static void _rtl_pci_tx_isr(struct ieee80211_hw *hw, int prio)
                        skb_pull(skb, EM_HDR_LEN);
 
                RT_TRACE(rtlpriv, (COMP_INTR | COMP_SEND), DBG_TRACE,
-                        ("new ring->idx:%d, "
-                         "free: skb_queue_len:%d, free: seq:%x\n",
-                         ring->idx,
-                         skb_queue_len(&ring->queue),
-                         *(u16 *) (skb->data + 22)));
+                        "new ring->idx:%d, free: skb_queue_len:%d, free: seq:%x\n",
+                        ring->idx,
+                        skb_queue_len(&ring->queue),
+                        *(u16 *) (skb->data + 22));
 
                if (prio == TXCMD_QUEUE) {
                        dev_kfree_skb(skb);
@@ -593,11 +588,9 @@ static void _rtl_pci_tx_isr(struct ieee80211_hw *hw, int prio)
                                == 2) {
 
                        RT_TRACE(rtlpriv, COMP_ERR, DBG_LOUD,
-                                       ("more desc left, wake"
-                                        "skb_queue@%d,ring->idx = %d,"
-                                        "skb_queue_len = 0x%d\n",
-                                        prio, ring->idx,
-                                        skb_queue_len(&ring->queue)));
+                                "more desc left, wake skb_queue@%d, ring->idx = %d, skb_queue_len = 0x%d\n",
+                                prio, ring->idx,
+                                skb_queue_len(&ring->queue));
 
                        ieee80211_wake_queue(hw,
                                        skb_get_queue_mapping
@@ -657,6 +650,8 @@ static void _rtl_receive_one(struct ieee80211_hw *hw, struct sk_buff *skb,
                return;
 
        uskb = dev_alloc_skb(skb->len + 128);
+       if (!uskb)
+               return;         /* exit if allocation failed */
        memcpy(IEEE80211_SKB_RXCB(uskb), &rx_status, sizeof(rx_status));
        pdata = (u8 *)skb_put(uskb, skb->len);
        memcpy(pdata, skb->data, skb->len);
@@ -709,9 +704,8 @@ static void _rtl_pci_rx_interrupt(struct ieee80211_hw *hw)
 
                new_skb = dev_alloc_skb(rtlpci->rxbuffersize);
                if (unlikely(!new_skb)) {
-                       RT_TRACE(rtlpriv, (COMP_INTR | COMP_RECV),
-                                DBG_DMESG,
-                                ("can't alloc skb for rx\n"));
+                       RT_TRACE(rtlpriv, (COMP_INTR | COMP_RECV), DBG_DMESG,
+                                "can't alloc skb for rx\n");
                        goto done;
                }
 
@@ -796,38 +790,37 @@ static irqreturn_t _rtl_pci_interrupt(int irq, void *dev_id)
        /*<1> beacon related */
        if (inta & rtlpriv->cfg->maps[RTL_IMR_TBDOK]) {
                RT_TRACE(rtlpriv, COMP_INTR, DBG_TRACE,
-                        ("beacon ok interrupt!\n"));
+                        "beacon ok interrupt!\n");
        }
 
        if (unlikely(inta & rtlpriv->cfg->maps[RTL_IMR_TBDER])) {
                RT_TRACE(rtlpriv, COMP_INTR, DBG_TRACE,
-                        ("beacon err interrupt!\n"));
+                        "beacon err interrupt!\n");
        }
 
        if (inta & rtlpriv->cfg->maps[RTL_IMR_BDOK]) {
-               RT_TRACE(rtlpriv, COMP_INTR, DBG_TRACE,
-                        ("beacon interrupt!\n"));
+               RT_TRACE(rtlpriv, COMP_INTR, DBG_TRACE, "beacon interrupt!\n");
        }
 
        if (inta & rtlpriv->cfg->maps[RTL_IMR_BcnInt]) {
                RT_TRACE(rtlpriv, COMP_INTR, DBG_TRACE,
-                        ("prepare beacon for interrupt!\n"));
+                        "prepare beacon for interrupt!\n");
                tasklet_schedule(&rtlpriv->works.irq_prepare_bcn_tasklet);
        }
 
        /*<3> Tx related */
        if (unlikely(inta & rtlpriv->cfg->maps[RTL_IMR_TXFOVW]))
-               RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING, ("IMR_TXFOVW!\n"));
+               RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING, "IMR_TXFOVW!\n");
 
        if (inta & rtlpriv->cfg->maps[RTL_IMR_MGNTDOK]) {
                RT_TRACE(rtlpriv, COMP_INTR, DBG_TRACE,
-                        ("Manage ok interrupt!\n"));
+                        "Manage ok interrupt!\n");
                _rtl_pci_tx_isr(hw, MGNT_QUEUE);
        }
 
        if (inta & rtlpriv->cfg->maps[RTL_IMR_HIGHDOK]) {
                RT_TRACE(rtlpriv, COMP_INTR, DBG_TRACE,
-                        ("HIGH_QUEUE ok interrupt!\n"));
+                        "HIGH_QUEUE ok interrupt!\n");
                _rtl_pci_tx_isr(hw, HIGH_QUEUE);
        }
 
@@ -835,7 +828,7 @@ static irqreturn_t _rtl_pci_interrupt(int irq, void *dev_id)
                rtlpriv->link_info.num_tx_inperiod++;
 
                RT_TRACE(rtlpriv, COMP_INTR, DBG_TRACE,
-                        ("BK Tx OK interrupt!\n"));
+                        "BK Tx OK interrupt!\n");
                _rtl_pci_tx_isr(hw, BK_QUEUE);
        }
 
@@ -843,7 +836,7 @@ static irqreturn_t _rtl_pci_interrupt(int irq, void *dev_id)
                rtlpriv->link_info.num_tx_inperiod++;
 
                RT_TRACE(rtlpriv, COMP_INTR, DBG_TRACE,
-                        ("BE TX OK interrupt!\n"));
+                        "BE TX OK interrupt!\n");
                _rtl_pci_tx_isr(hw, BE_QUEUE);
        }
 
@@ -851,7 +844,7 @@ static irqreturn_t _rtl_pci_interrupt(int irq, void *dev_id)
                rtlpriv->link_info.num_tx_inperiod++;
 
                RT_TRACE(rtlpriv, COMP_INTR, DBG_TRACE,
-                        ("VI TX OK interrupt!\n"));
+                        "VI TX OK interrupt!\n");
                _rtl_pci_tx_isr(hw, VI_QUEUE);
        }
 
@@ -859,7 +852,7 @@ static irqreturn_t _rtl_pci_interrupt(int irq, void *dev_id)
                rtlpriv->link_info.num_tx_inperiod++;
 
                RT_TRACE(rtlpriv, COMP_INTR, DBG_TRACE,
-                        ("Vo TX OK interrupt!\n"));
+                        "Vo TX OK interrupt!\n");
                _rtl_pci_tx_isr(hw, VO_QUEUE);
        }
 
@@ -868,25 +861,25 @@ static irqreturn_t _rtl_pci_interrupt(int irq, void *dev_id)
                        rtlpriv->link_info.num_tx_inperiod++;
 
                        RT_TRACE(rtlpriv, COMP_INTR, DBG_TRACE,
-                                       ("CMD TX OK interrupt!\n"));
+                                "CMD TX OK interrupt!\n");
                        _rtl_pci_tx_isr(hw, TXCMD_QUEUE);
                }
        }
 
        /*<2> Rx related */
        if (inta & rtlpriv->cfg->maps[RTL_IMR_ROK]) {
-               RT_TRACE(rtlpriv, COMP_INTR, DBG_TRACE, ("Rx ok interrupt!\n"));
+               RT_TRACE(rtlpriv, COMP_INTR, DBG_TRACE, "Rx ok interrupt!\n");
                _rtl_pci_rx_interrupt(hw);
        }
 
        if (unlikely(inta & rtlpriv->cfg->maps[RTL_IMR_RDU])) {
                RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
-                        ("rx descriptor unavailable!\n"));
+                        "rx descriptor unavailable!\n");
                _rtl_pci_rx_interrupt(hw);
        }
 
        if (unlikely(inta & rtlpriv->cfg->maps[RTL_IMR_RXFOVW])) {
-               RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING, ("rx overflow !\n"));
+               RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING, "rx overflow !\n");
                _rtl_pci_rx_interrupt(hw);
        }
 
@@ -1028,7 +1021,7 @@ static int _rtl_pci_init_tx_ring(struct ieee80211_hw *hw,
 
        if (!ring || (unsigned long)ring & 0xFF) {
                RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                        ("Cannot allocate TX ring (prio = %d)\n", prio));
+                        "Cannot allocate TX ring (prio = %d)\n", prio);
                return -ENOMEM;
        }
 
@@ -1039,8 +1032,8 @@ static int _rtl_pci_init_tx_ring(struct ieee80211_hw *hw,
        rtlpci->tx_ring[prio].entries = entries;
        skb_queue_head_init(&rtlpci->tx_ring[prio].queue);
 
-       RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
-                ("queue:%d, ring_addr:%p\n", prio, ring));
+       RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "queue:%d, ring_addr:%p\n",
+                prio, ring);
 
        for (i = 0; i < entries; i++) {
                nextdescaddress = (u32) dma +
@@ -1078,7 +1071,7 @@ static int _rtl_pci_init_rx_ring(struct ieee80211_hw *hw)
                if (!rtlpci->rx_ring[rx_queue_idx].desc ||
                    (unsigned long)rtlpci->rx_ring[rx_queue_idx].desc & 0xFF) {
                        RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                                ("Cannot allocate RX ring\n"));
+                                "Cannot allocate RX ring\n");
                        return -ENOMEM;
                }
 
@@ -1155,10 +1148,12 @@ static void _rtl_pci_free_tx_ring(struct ieee80211_hw *hw,
                ring->idx = (ring->idx + 1) % ring->entries;
        }
 
-       pci_free_consistent(rtlpci->pdev,
-                           sizeof(*ring->desc) * ring->entries,
-                           ring->desc, ring->dma);
-       ring->desc = NULL;
+       if (ring->desc) {
+               pci_free_consistent(rtlpci->pdev,
+                                   sizeof(*ring->desc) * ring->entries,
+                                   ring->desc, ring->dma);
+               ring->desc = NULL;
+       }
 }
 
 static void _rtl_pci_free_rx_ring(struct rtl_pci *rtlpci)
@@ -1182,12 +1177,14 @@ static void _rtl_pci_free_rx_ring(struct rtl_pci *rtlpci)
                        kfree_skb(skb);
                }
 
-               pci_free_consistent(rtlpci->pdev,
+               if (rtlpci->rx_ring[rx_queue_idx].desc) {
+                       pci_free_consistent(rtlpci->pdev,
                                    sizeof(*rtlpci->rx_ring[rx_queue_idx].
                                           desc) * rtlpci->rxringcount,
                                    rtlpci->rx_ring[rx_queue_idx].desc,
                                    rtlpci->rx_ring[rx_queue_idx].dma);
-               rtlpci->rx_ring[rx_queue_idx].desc = NULL;
+                       rtlpci->rx_ring[rx_queue_idx].desc = NULL;
+               }
        }
 }
 
@@ -1355,7 +1352,7 @@ static int rtl_pci_tx(struct ieee80211_hw *hw, struct sk_buff *skb,
        u8 temp_one = 1;
 
        if (ieee80211_is_auth(fc)) {
-               RT_TRACE(rtlpriv, COMP_SEND, DBG_DMESG, ("MAC80211_LINKING\n"));
+               RT_TRACE(rtlpriv, COMP_SEND, DBG_DMESG, "MAC80211_LINKING\n");
                rtl_ips_nic_on(hw);
        }
 
@@ -1388,10 +1385,9 @@ static int rtl_pci_tx(struct ieee80211_hw *hw, struct sk_buff *skb,
 
        if ((own == 1) && (hw_queue != BEACON_QUEUE)) {
                RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
-                        ("No more TX desc@%d, ring->idx = %d,"
-                         "idx = %d, skb_queue_len = 0x%d\n",
-                         hw_queue, ring->idx, idx,
-                         skb_queue_len(&ring->queue)));
+                        "No more TX desc@%d, ring->idx = %d, idx = %d, skb_queue_len = 0x%d\n",
+                        hw_queue, ring->idx, idx,
+                        skb_queue_len(&ring->queue));
 
                spin_unlock_irqrestore(&rtlpriv->locks.irq_th_lock, flags);
                return skb->len;
@@ -1426,11 +1422,9 @@ static int rtl_pci_tx(struct ieee80211_hw *hw, struct sk_buff *skb,
            hw_queue != BEACON_QUEUE) {
 
                RT_TRACE(rtlpriv, COMP_ERR, DBG_LOUD,
-                        ("less desc left, stop skb_queue@%d, "
-                         "ring->idx = %d,"
-                         "idx = %d, skb_queue_len = 0x%d\n",
-                         hw_queue, ring->idx, idx,
-                         skb_queue_len(&ring->queue)));
+                        "less desc left, stop skb_queue@%d, ring->idx = %d, idx = %d, skb_queue_len = 0x%d\n",
+                        hw_queue, ring->idx, idx,
+                        skb_queue_len(&ring->queue));
 
                ieee80211_stop_queue(hw, skb_get_queue_mapping(skb));
        }
@@ -1497,7 +1491,7 @@ static int rtl_pci_init(struct ieee80211_hw *hw, struct pci_dev *pdev)
        err = _rtl_pci_init_trx_ring(hw);
        if (err) {
                RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                        ("tx ring initialization failed"));
+                        "tx ring initialization failed\n");
                return err;
        }
 
@@ -1519,12 +1513,12 @@ static int rtl_pci_start(struct ieee80211_hw *hw)
        err = rtlpriv->cfg->ops->hw_init(hw);
        if (err) {
                RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
-                        ("Failed to config hardware!\n"));
+                        "Failed to config hardware!\n");
                return err;
        }
 
        rtlpriv->cfg->ops->enable_interrupt(hw);
-       RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, ("enable_interrupt OK\n"));
+       RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "enable_interrupt OK\n");
 
        rtl_init_rx_config(hw);
 
@@ -1535,7 +1529,7 @@ static int rtl_pci_start(struct ieee80211_hw *hw)
 
        rtlpci->up_first_time = false;
 
-       RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, ("OK\n"));
+       RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "OK\n");
        return 0;
 }
 
@@ -1573,6 +1567,9 @@ static void rtl_pci_stop(struct ieee80211_hw *hw)
 
        rtlpci->driver_is_goingto_unload = true;
        rtlpriv->cfg->ops->hw_disable(hw);
+       /* some things are not needed if firmware not available */
+       if (!rtlpriv->max_fw_size)
+               return;
        rtlpriv->cfg->ops->led_control(hw, LED_CTL_POWER_OFF);
 
        spin_lock_irqsave(&rtlpriv->locks.rf_ps_lock, flags);
@@ -1622,20 +1619,20 @@ static bool _rtl_pci_find_adapter(struct pci_dev *pdev,
                switch (revisionid) {
                case RTL_PCI_REVISION_ID_8192PCIE:
                        RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
-                                ("8192 PCI-E is found - "
-                                 "vid/did=%x/%x\n", venderid, deviceid));
+                                "8192 PCI-E is found - vid/did=%x/%x\n",
+                                venderid, deviceid);
                        rtlhal->hw_type = HARDWARE_TYPE_RTL8192E;
                        break;
                case RTL_PCI_REVISION_ID_8192SE:
                        RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
-                                ("8192SE is found - "
-                                 "vid/did=%x/%x\n", venderid, deviceid));
+                                "8192SE is found - vid/did=%x/%x\n",
+                                venderid, deviceid);
                        rtlhal->hw_type = HARDWARE_TYPE_RTL8192SE;
                        break;
                default:
                        RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
-                                ("Err: Unknown device - "
-                                 "vid/did=%x/%x\n", venderid, deviceid));
+                                "Err: Unknown device - vid/did=%x/%x\n",
+                                venderid, deviceid);
                        rtlhal->hw_type = HARDWARE_TYPE_RTL8192SE;
                        break;
 
@@ -1646,18 +1643,18 @@ static bool _rtl_pci_find_adapter(struct pci_dev *pdev,
                   deviceid == RTL_PCI_8188CE_DID) {
                rtlhal->hw_type = HARDWARE_TYPE_RTL8192CE;
                RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
-                        ("8192C PCI-E is found - "
-                         "vid/did=%x/%x\n", venderid, deviceid));
+                        "8192C PCI-E is found - vid/did=%x/%x\n",
+                        venderid, deviceid);
        } else if (deviceid == RTL_PCI_8192DE_DID ||
                   deviceid == RTL_PCI_8192DE_DID2) {
                rtlhal->hw_type = HARDWARE_TYPE_RTL8192DE;
                RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
-                        ("8192D PCI-E is found - "
-                         "vid/did=%x/%x\n", venderid, deviceid));
+                        "8192D PCI-E is found - vid/did=%x/%x\n",
+                        venderid, deviceid);
        } else {
                RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
-                        ("Err: Unknown device -"
-                         " vid/did=%x/%x\n", venderid, deviceid));
+                        "Err: Unknown device - vid/did=%x/%x\n",
+                        venderid, deviceid);
 
                rtlhal->hw_type = RTL_DEFAULT_HARDWARE_TYPE;
        }
@@ -1665,19 +1662,18 @@ static bool _rtl_pci_find_adapter(struct pci_dev *pdev,
        if (rtlhal->hw_type == HARDWARE_TYPE_RTL8192DE) {
                if (revisionid == 0 || revisionid == 1) {
                        if (revisionid == 0) {
-                               RT_TRACE(rtlpriv, COMP_INIT,
-                                        DBG_LOUD, ("Find 92DE MAC0.\n"));
+                               RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
+                                        "Find 92DE MAC0\n");
                                rtlhal->interfaceindex = 0;
                        } else if (revisionid == 1) {
                                RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
-                                       ("Find 92DE MAC1.\n"));
+                                        "Find 92DE MAC1\n");
                                rtlhal->interfaceindex = 1;
                        }
                } else {
                        RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
-                               ("Unknown device - "
-                               "VendorID/DeviceID=%x/%x, Revision=%x\n",
-                               venderid, deviceid, revisionid));
+                                "Unknown device - VendorID/DeviceID=%x/%x, Revision=%x\n",
+                                venderid, deviceid, revisionid);
                        rtlhal->interfaceindex = 0;
                }
        }
@@ -1693,8 +1689,8 @@ static bool _rtl_pci_find_adapter(struct pci_dev *pdev,
                        if (bridge_pdev->vendor == pcibridge_vendors[tmp]) {
                                pcipriv->ndis_adapter.pcibridge_vendor = tmp;
                                RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
-                                        ("Pci Bridge Vendor is found index:"
-                                        " %d\n", tmp));
+                                        "Pci Bridge Vendor is found index: %d\n",
+                                        tmp);
                                break;
                        }
                }
@@ -1723,23 +1719,21 @@ static bool _rtl_pci_find_adapter(struct pci_dev *pdev,
        }
 
        RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
-                ("pcidev busnumber:devnumber:funcnumber:"
-                 "vendor:link_ctl %d:%d:%d:%x:%x\n",
-                 pcipriv->ndis_adapter.busnumber,
-                 pcipriv->ndis_adapter.devnumber,
-                 pcipriv->ndis_adapter.funcnumber,
-                 pdev->vendor, pcipriv->ndis_adapter.linkctrl_reg));
+                "pcidev busnumber:devnumber:funcnumber:vendor:link_ctl %d:%d:%d:%x:%x\n",
+                pcipriv->ndis_adapter.busnumber,
+                pcipriv->ndis_adapter.devnumber,
+                pcipriv->ndis_adapter.funcnumber,
+                pdev->vendor, pcipriv->ndis_adapter.linkctrl_reg);
 
        RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
-                ("pci_bridge busnumber:devnumber:funcnumber:vendor:"
-                 "pcie_cap:link_ctl_reg:amd %d:%d:%d:%x:%x:%x:%x\n",
-                 pcipriv->ndis_adapter.pcibridge_busnum,
-                 pcipriv->ndis_adapter.pcibridge_devnum,
-                 pcipriv->ndis_adapter.pcibridge_funcnum,
-                 pcibridge_vendors[pcipriv->ndis_adapter.pcibridge_vendor],
-                 pcipriv->ndis_adapter.pcibridge_pciehdr_offset,
-                 pcipriv->ndis_adapter.pcibridge_linkctrlreg,
-                 pcipriv->ndis_adapter.amd_l1_patch));
+                "pci_bridge busnumber:devnumber:funcnumber:vendor:pcie_cap:link_ctl_reg:amd %d:%d:%d:%x:%x:%x:%x\n",
+                pcipriv->ndis_adapter.pcibridge_busnum,
+                pcipriv->ndis_adapter.pcibridge_devnum,
+                pcipriv->ndis_adapter.pcibridge_funcnum,
+                pcibridge_vendors[pcipriv->ndis_adapter.pcibridge_vendor],
+                pcipriv->ndis_adapter.pcibridge_pciehdr_offset,
+                pcipriv->ndis_adapter.pcibridge_linkctrlreg,
+                pcipriv->ndis_adapter.amd_l1_patch);
 
        rtl_pci_parse_configuration(pdev, hw);
 
@@ -1759,18 +1753,17 @@ int __devinit rtl_pci_probe(struct pci_dev *pdev,
 
        err = pci_enable_device(pdev);
        if (err) {
-               RT_ASSERT(false,
-                         ("%s : Cannot enable new PCI device\n",
-                          pci_name(pdev)));
+               RT_ASSERT(false, "%s : Cannot enable new PCI device\n",
+                         pci_name(pdev));
                return err;
        }
 
        if (!pci_set_dma_mask(pdev, DMA_BIT_MASK(32))) {
                if (pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32))) {
-                       RT_ASSERT(false, ("Unable to obtain 32bit DMA "
-                                         "for consistent allocations\n"));
-                       pci_disable_device(pdev);
-                       return -ENOMEM;
+                       RT_ASSERT(false,
+                                 "Unable to obtain 32bit DMA for consistent allocations\n");
+                       err = -ENOMEM;
+                       goto fail1;
                }
        }
 
@@ -1780,7 +1773,7 @@ int __devinit rtl_pci_probe(struct pci_dev *pdev,
                                sizeof(struct rtl_priv), &rtl_ops);
        if (!hw) {
                RT_ASSERT(false,
-                         ("%s : ieee80211 alloc failed\n", pci_name(pdev)));
+                         "%s : ieee80211 alloc failed\n", pci_name(pdev));
                err = -ENOMEM;
                goto fail1;
        }
@@ -1791,6 +1784,7 @@ int __devinit rtl_pci_probe(struct pci_dev *pdev,
        rtlpriv = hw->priv;
        pcipriv = (void *)rtlpriv->priv;
        pcipriv->dev.pdev = pdev;
+       init_completion(&rtlpriv->firmware_loading_complete);
 
        /* init cfg & intf_ops */
        rtlpriv->rtlhal.interface = INTF_PCI;
@@ -1810,8 +1804,8 @@ int __devinit rtl_pci_probe(struct pci_dev *pdev,
        /* MEM map */
        err = pci_request_regions(pdev, KBUILD_MODNAME);
        if (err) {
-               RT_ASSERT(false, ("Can't obtain PCI resources\n"));
-               return err;
+               RT_ASSERT(false, "Can't obtain PCI resources\n");
+               goto fail1;
        }
 
        pmem_start = pci_resource_start(pdev, rtlpriv->cfg->bar_id);
@@ -1823,15 +1817,15 @@ int __devinit rtl_pci_probe(struct pci_dev *pdev,
                        (unsigned long)pci_iomap(pdev,
                        rtlpriv->cfg->bar_id, pmem_len);
        if (rtlpriv->io.pci_mem_start == 0) {
-               RT_ASSERT(false, ("Can't map PCI mem\n"));
+               RT_ASSERT(false, "Can't map PCI mem\n");
+               err = -ENOMEM;
                goto fail2;
        }
 
        RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
-                ("mem mapped space: start: 0x%08lx len:%08lx "
-                 "flags:%08lx, after map:0x%08lx\n",
-                 pmem_start, pmem_len, pmem_flags,
-                 rtlpriv->io.pci_mem_start));
+                "mem mapped space: start: 0x%08lx len:%08lx flags:%08lx, after map:0x%08lx\n",
+                pmem_start, pmem_len, pmem_flags,
+                rtlpriv->io.pci_mem_start);
 
        /* Disable Clk Request */
        pci_write_config_byte(pdev, 0x81, 0);
@@ -1841,8 +1835,10 @@ int __devinit rtl_pci_probe(struct pci_dev *pdev,
        pci_write_config_byte(pdev, 0x04, 0x07);
 
        /* find adapter */
-       if (!_rtl_pci_find_adapter(pdev, hw))
+       if (!_rtl_pci_find_adapter(pdev, hw)) {
+               err = -ENODEV;
                goto fail3;
+       }
 
        /* Init IO handler */
        _rtl_pci_io_handler_init(&pdev->dev, hw);
@@ -1851,8 +1847,8 @@ int __devinit rtl_pci_probe(struct pci_dev *pdev,
        rtlpriv->cfg->ops->read_eeprom_info(hw);
 
        if (rtlpriv->cfg->ops->init_sw_vars(hw)) {
-               RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                        ("Can't init_sw_vars.\n"));
+               RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "Can't init_sw_vars\n");
+               err = -ENODEV;
                goto fail3;
        }
 
@@ -1865,69 +1861,55 @@ int __devinit rtl_pci_probe(struct pci_dev *pdev,
        err = rtl_init_core(hw);
        if (err) {
                RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                        ("Can't allocate sw for mac80211.\n"));
+                        "Can't allocate sw for mac80211\n");
                goto fail3;
        }
 
        /* Init PCI sw */
        err = rtl_pci_init(hw, pdev);
        if (err) {
-               RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                        ("Failed to init PCI.\n"));
-               goto fail3;
-       }
-
-       err = ieee80211_register_hw(hw);
-       if (err) {
-               RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                        ("Can't register mac80211 hw.\n"));
+               RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "Failed to init PCI\n");
                goto fail3;
-       } else {
-               rtlpriv->mac80211.mac80211_registered = 1;
        }
 
        err = sysfs_create_group(&pdev->dev.kobj, &rtl_attribute_group);
        if (err) {
                RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                        ("failed to create sysfs device attributes\n"));
+                        "failed to create sysfs device attributes\n");
                goto fail3;
        }
 
-       /*init rfkill */
-       rtl_init_rfkill(hw);
-
        rtlpci = rtl_pcidev(pcipriv);
        err = request_irq(rtlpci->pdev->irq, &_rtl_pci_interrupt,
                          IRQF_SHARED, KBUILD_MODNAME, hw);
        if (err) {
                RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
-                        ("%s: failed to register IRQ handler\n",
-                         wiphy_name(hw->wiphy)));
+                        "%s: failed to register IRQ handler\n",
+                        wiphy_name(hw->wiphy));
                goto fail3;
-       } else {
-               rtlpci->irq_alloc = 1;
        }
+       rtlpci->irq_alloc = 1;
 
-       set_bit(RTL_STATUS_INTERFACE_START, &rtlpriv->status);
        return 0;
 
 fail3:
-       pci_set_drvdata(pdev, NULL);
        rtl_deinit_core(hw);
        _rtl_pci_io_handler_release(hw);
-       ieee80211_free_hw(hw);
 
        if (rtlpriv->io.pci_mem_start != 0)
                pci_iounmap(pdev, (void __iomem *)rtlpriv->io.pci_mem_start);
 
 fail2:
        pci_release_regions(pdev);
+       complete(&rtlpriv->firmware_loading_complete);
 
 fail1:
-
+       if (hw)
+               ieee80211_free_hw(hw);
+       pci_set_drvdata(pdev, NULL);
        pci_disable_device(pdev);
 
-       return -ENODEV;
+       return err;
 
 }
 EXPORT_SYMBOL(rtl_pci_probe);
@@ -1940,6 +1922,8 @@ void rtl_pci_disconnect(struct pci_dev *pdev)
        struct rtl_pci *rtlpci = rtl_pcidev(pcipriv);
        struct rtl_mac *rtlmac = rtl_mac(rtlpriv);
 
+       /* just in case driver is removed before firmware callback */
+       wait_for_completion(&rtlpriv->firmware_loading_complete);
        clear_bit(RTL_STATUS_INTERFACE_START, &rtlpriv->status);
 
        sysfs_remove_group(&pdev->dev.kobj, &rtl_attribute_group);
index ebe0b42..241448f 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2009-2010  Realtek Corporation.
+ * Copyright(c) 2009-2012  Realtek Corporation.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
@@ -239,7 +239,6 @@ int __devinit rtl_pci_probe(struct pci_dev *pdev,
 void rtl_pci_disconnect(struct pci_dev *pdev);
 int rtl_pci_suspend(struct device *dev);
 int rtl_pci_resume(struct device *dev);
-
 static inline u8 pci_read8_sync(struct rtl_priv *rtlpriv, u32 addr)
 {
        return readb((u8 __iomem *) rtlpriv->io.pci_mem_start + addr);
index 130fdd9..5b9c3b5 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2009-2010  Realtek Corporation.
+ * Copyright(c) 2009-2012  Realtek Corporation.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
@@ -44,10 +44,11 @@ bool rtl_ps_enable_nic(struct ieee80211_hw *hw)
 
        if (is_hal_stop(rtlhal))
                RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
-                        ("Driver is already down!\n"));
+                        "Driver is already down!\n");
 
        /*<2> Enable Adapter */
-       rtlpriv->cfg->ops->hw_init(hw);
+       if (rtlpriv->cfg->ops->hw_init(hw))
+               return 1;
        RT_CLEAR_PS_LEVEL(ppsc, RT_RF_OFF_LEVL_HALT_NIC);
 
        /*<3> Enable Interrupt */
@@ -104,8 +105,7 @@ bool rtl_ps_set_rf_state(struct ieee80211_hw *hw,
 
        case ERFOFF:
 
-               if ((changesource == RF_CHANGE_BY_HW)
-                   && (ppsc->hwradiooff == false)) {
+               if ((changesource == RF_CHANGE_BY_HW) && !ppsc->hwradiooff) {
                        ppsc->hwradiooff = true;
                }
 
@@ -120,7 +120,7 @@ bool rtl_ps_set_rf_state(struct ieee80211_hw *hw,
 
        default:
                RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                        ("switch case not process\n"));
+                        "switch case not processed\n");
                break;
        }
 
@@ -176,7 +176,7 @@ void rtl_ips_nic_off_wq_callback(void *data)
 
        if (mac->opmode != NL80211_IFTYPE_STATION) {
                RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
-                        ("not station return\n"));
+                        "not station return\n");
                return;
        }
 
@@ -207,7 +207,7 @@ void rtl_ips_nic_off_wq_callback(void *data)
                    (mac->link_state == MAC80211_NOLINK) &&
                    !mac->act_scanning) {
                        RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
-                                ("IPSEnter(): Turn off RF.\n"));
+                                "IPSEnter(): Turn off RF\n");
 
                        ppsc->inactive_pwrstate = ERFOFF;
                        ppsc->in_powersavemode = true;
@@ -280,8 +280,7 @@ static bool rtl_get_fwlps_doze(struct ieee80211_hw *hw)
 
        if (ps_timediff < 2000) {
                RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
-                        ("Delay enter Fw LPS for DHCP, ARP,"
-                         " or EAPOL exchanging state.\n"));
+                        "Delay enter Fw LPS for DHCP, ARP, or EAPOL exchanging state\n");
                return false;
        }
 
@@ -328,8 +327,8 @@ static void rtl_lps_set_psmode(struct ieee80211_hw *hw, u8 rt_psmode)
                bool fw_current_inps;
                if (ppsc->dot11_psmode == EACTIVE) {
                        RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG,
-                                ("FW LPS leave ps_mode:%x\n",
-                                 FW_PS_ACTIVE_MODE));
+                                "FW LPS leave ps_mode:%x\n",
+                                FW_PS_ACTIVE_MODE);
 
                        rpwm_val = 0x0C;        /* RF on */
                        fw_pwrmode = FW_PS_ACTIVE_MODE;
@@ -347,8 +346,8 @@ static void rtl_lps_set_psmode(struct ieee80211_hw *hw, u8 rt_psmode)
                } else {
                        if (rtl_get_fwlps_doze(hw)) {
                                RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG,
-                                               ("FW LPS enter ps_mode:%x\n",
-                                                ppsc->fwctrl_psmode));
+                                        "FW LPS enter ps_mode:%x\n",
+                                        ppsc->fwctrl_psmode);
 
                                rpwm_val = 0x02;        /* RF off */
                                fw_current_inps = true;
@@ -402,7 +401,7 @@ void rtl_lps_enter(struct ieee80211_hw *hw)
        if (mac->cnt_after_linked >= 2) {
                if (ppsc->dot11_psmode == EACTIVE) {
                        RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
-                                       ("Enter 802.11 power save mode...\n"));
+                                "Enter 802.11 power save mode...\n");
 
                        rtl_lps_set_psmode(hw, EAUTOPS);
                }
@@ -434,7 +433,7 @@ void rtl_lps_leave(struct ieee80211_hw *hw)
                        }
 
                        RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
-                                ("Busy Traffic,Leave 802.11 power save..\n"));
+                                "Busy Traffic,Leave 802.11 power save..\n");
 
                        rtl_lps_set_psmode(hw, EACTIVE);
                }
@@ -518,8 +517,8 @@ void rtl_swlps_beacon(struct ieee80211_hw *hw, void *data, unsigned int len)
                queue_delayed_work(rtlpriv->works.rtl_wq,
                                &rtlpriv->works.ps_work, MSECS(5));
        } else {
-               RT_TRACE(rtlpriv, COMP_POWER, DBG_DMESG, ("u_bufferd: %x, "
-                               "m_buffered: %x\n", u_buffed, m_buffed));
+               RT_TRACE(rtlpriv, COMP_POWER, DBG_DMESG,
+                        "u_bufferd: %x, m_buffered: %x\n", u_buffed, m_buffed);
        }
 }
 
@@ -607,8 +606,8 @@ void rtl_swlps_rf_sleep(struct ieee80211_hw *hw)
         * sleep  = dtim_period, that meaons, we should
         * awake before every dtim */
        RT_TRACE(rtlpriv, COMP_POWER, DBG_DMESG,
-                ("dtim_counter:%x will sleep :%d"
-                " beacon_intv\n", rtlpriv->psc.dtim_counter, sleep_intv));
+                "dtim_counter:%x will sleep :%d beacon_intv\n",
+                rtlpriv->psc.dtim_counter, sleep_intv);
 
        /* we tested that 40ms is enough for sw & hw sw delay */
        queue_delayed_work(rtlpriv->works.rtl_wq, &rtlpriv->works.ps_rfon_wq,
index 84628e6..1357856 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2009-2010  Realtek Corporation.
+ * Copyright(c) 2009-2012  Realtek Corporation.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
index 539df66..c66f08a 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2009-2010  Realtek Corporation.
+ * Copyright(c) 2009-2012  Realtek Corporation.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
@@ -251,7 +251,7 @@ static void *rtl_rate_alloc_sta(void *ppriv,
        rate_priv = kzalloc(sizeof(struct rtl_rate_priv), gfp);
        if (!rate_priv) {
                RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                        ("Unable to allocate private rc structure\n"));
+                        "Unable to allocate private rc structure\n");
                return NULL;
        }
 
index 4afa2c2..4d61761 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2009-2010  Realtek Corporation.
+ * Copyright(c) 2009-2012  Realtek Corporation.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
index 9fedb1f..c1608cd 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2009-2010  Realtek Corporation.
+ * Copyright(c) 2009-2012  Realtek Corporation.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
@@ -398,13 +398,11 @@ int rtl_regd_init(struct ieee80211_hw *hw,
        rtlpriv->regd.country_code = rtlpriv->efuse.channel_plan;
 
        RT_TRACE(rtlpriv, COMP_REGD, DBG_TRACE,
-                (KERN_DEBUG "rtl: EEPROM regdomain: 0x%0x\n",
-                 rtlpriv->regd.country_code));
+                "rtl: EEPROM regdomain: 0x%0x\n", rtlpriv->regd.country_code);
 
        if (rtlpriv->regd.country_code >= COUNTRY_CODE_MAX) {
                RT_TRACE(rtlpriv, COMP_REGD, DBG_DMESG,
-                        (KERN_DEBUG "rtl: EEPROM indicates invalid contry code"
-                         "world wide 13 should be used\n"));
+                        "rtl: EEPROM indicates invalid contry code, world wide 13 should be used\n");
 
                rtlpriv->regd.country_code = COUNTRY_CODE_WORLD_WIDE_13;
        }
@@ -420,8 +418,8 @@ int rtl_regd_init(struct ieee80211_hw *hw,
        }
 
        RT_TRACE(rtlpriv, COMP_REGD, DBG_TRACE,
-                (KERN_DEBUG "rtl: Country alpha2 being used: %c%c\n",
-                 rtlpriv->regd.alpha2[0], rtlpriv->regd.alpha2[1]));
+                "rtl: Country alpha2 being used: %c%c\n",
+                rtlpriv->regd.alpha2[0], rtlpriv->regd.alpha2[1]);
 
        _rtl_regd_init_wiphy(&rtlpriv->regd, wiphy, reg_notifier);
 
@@ -433,7 +431,7 @@ int rtl_reg_notifier(struct wiphy *wiphy, struct regulatory_request *request)
        struct ieee80211_hw *hw = wiphy_to_ieee80211_hw(wiphy);
        struct rtl_priv *rtlpriv = rtl_priv(hw);
 
-       RT_TRACE(rtlpriv, COMP_REGD, DBG_LOUD, ("\n"));
+       RT_TRACE(rtlpriv, COMP_REGD, DBG_LOUD, "\n");
 
        return _rtl_reg_notifier_apply(wiphy, request, &rtlpriv->regd);
 }
index d231189..70ef2f4 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2009-2010  Realtek Corporation.
+ * Copyright(c) 2009-2012  Realtek Corporation.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
index 72a98ca..a644735 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2009-2010  Realtek Corporation.
+ * Copyright(c) 2009-2012  Realtek Corporation.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
@@ -246,16 +246,15 @@ static void rtl92c_dm_false_alarm_counter_statistics(struct ieee80211_hw *hw)
        rtl_set_bbreg(hw, RCCK0_FALSEALARMREPORT, 0x0000c000, 2);
 
        RT_TRACE(rtlpriv, COMP_DIG, DBG_TRACE,
-                ("cnt_parity_fail = %d, cnt_rate_illegal = %d, "
-                 "cnt_crc8_fail = %d, cnt_mcs_fail = %d\n",
-                 falsealm_cnt->cnt_parity_fail,
-                 falsealm_cnt->cnt_rate_illegal,
-                 falsealm_cnt->cnt_crc8_fail, falsealm_cnt->cnt_mcs_fail));
+                "cnt_parity_fail = %d, cnt_rate_illegal = %d, cnt_crc8_fail = %d, cnt_mcs_fail = %d\n",
+                falsealm_cnt->cnt_parity_fail,
+                falsealm_cnt->cnt_rate_illegal,
+                falsealm_cnt->cnt_crc8_fail, falsealm_cnt->cnt_mcs_fail);
 
        RT_TRACE(rtlpriv, COMP_DIG, DBG_TRACE,
-                ("cnt_ofdm_fail = %x, cnt_cck_fail = %x, cnt_all = %x\n",
-                 falsealm_cnt->cnt_ofdm_fail,
-                 falsealm_cnt->cnt_cck_fail, falsealm_cnt->cnt_all));
+                "cnt_ofdm_fail = %x, cnt_cck_fail = %x, cnt_all = %x\n",
+                falsealm_cnt->cnt_ofdm_fail,
+                falsealm_cnt->cnt_cck_fail, falsealm_cnt->cnt_all);
 }
 
 static void rtl92c_dm_ctrl_initgain_by_fa(struct ieee80211_hw *hw)
@@ -313,8 +312,8 @@ static void rtl92c_dm_ctrl_initgain_by_rssi(struct ieee80211_hw *hw)
                    dm_digtable.backoff_val;
 
        RT_TRACE(rtlpriv, COMP_DIG, DBG_TRACE,
-                ("rssi_val_min = %x backoff_val %x\n",
-                 dm_digtable.rssi_val_min, dm_digtable.backoff_val));
+                "rssi_val_min = %x backoff_val %x\n",
+                dm_digtable.rssi_val_min, dm_digtable.backoff_val);
 
        rtl92c_dm_write_dig(hw);
 }
@@ -330,8 +329,8 @@ static void rtl92c_dm_initial_gain_multi_sta(struct ieee80211_hw *hw)
        if (mac->opmode == NL80211_IFTYPE_ADHOC)
                multi_sta = true;
 
-       if ((multi_sta == false) || (dm_digtable.cursta_connectctate !=
-                                    DIG_STA_DISCONNECT)) {
+       if (!multi_sta ||
+           dm_digtable.cursta_connectctate != DIG_STA_DISCONNECT) {
                initialized = false;
                dm_digtable.dig_ext_port_stage = DIG_EXT_PORT_STAGE_MAX;
                return;
@@ -364,10 +363,9 @@ static void rtl92c_dm_initial_gain_multi_sta(struct ieee80211_hw *hw)
        }
 
        RT_TRACE(rtlpriv, COMP_DIG, DBG_TRACE,
-                ("curmultista_connectstate = "
-                 "%x dig_ext_port_stage %x\n",
-                 dm_digtable.curmultista_connectstate,
-                 dm_digtable.dig_ext_port_stage));
+                "curmultista_connectstate = %x dig_ext_port_stage %x\n",
+                dm_digtable.curmultista_connectstate,
+                dm_digtable.dig_ext_port_stage);
 }
 
 static void rtl92c_dm_initial_gain_sta(struct ieee80211_hw *hw)
@@ -375,10 +373,9 @@ static void rtl92c_dm_initial_gain_sta(struct ieee80211_hw *hw)
        struct rtl_priv *rtlpriv = rtl_priv(hw);
 
        RT_TRACE(rtlpriv, COMP_DIG, DBG_TRACE,
-                ("presta_connectstate = %x,"
-                 " cursta_connectctate = %x\n",
-                 dm_digtable.presta_connectstate,
-                 dm_digtable.cursta_connectctate));
+                "presta_connectstate = %x, cursta_connectctate = %x\n",
+                dm_digtable.presta_connectstate,
+                dm_digtable.cursta_connectctate);
 
        if (dm_digtable.presta_connectstate == dm_digtable.cursta_connectctate
            || dm_digtable.cursta_connectctate == DIG_STA_BEFORE_CONNECT
@@ -464,11 +461,11 @@ static void rtl92c_dm_cck_packet_detection_thresh(struct ieee80211_hw *hw)
                dm_digtable.pre_cck_pd_state = dm_digtable.cur_cck_pd_state;
        }
 
-       RT_TRACE(rtlpriv, COMP_DIG, DBG_TRACE,
-                ("CCKPDStage=%x\n", dm_digtable.cur_cck_pd_state));
+       RT_TRACE(rtlpriv, COMP_DIG, DBG_TRACE, "CCKPDStage=%x\n",
+                dm_digtable.cur_cck_pd_state);
 
-       RT_TRACE(rtlpriv, COMP_DIG, DBG_TRACE,
-                ("is92C=%x\n", IS_92C_SERIAL(rtlhal->version)));
+       RT_TRACE(rtlpriv, COMP_DIG, DBG_TRACE, "is92C=%x\n",
+                IS_92C_SERIAL(rtlhal->version));
 }
 
 static void rtl92c_dm_ctrl_initgain_by_twoport(struct ieee80211_hw *hw)
@@ -519,10 +516,9 @@ void rtl92c_dm_write_dig(struct ieee80211_hw *hw)
        struct rtl_priv *rtlpriv = rtl_priv(hw);
 
        RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD,
-                ("cur_igvalue = 0x%x, "
-                 "pre_igvalue = 0x%x, backoff_val = %d\n",
-                 dm_digtable.cur_igvalue, dm_digtable.pre_igvalue,
-                 dm_digtable.backoff_val));
+                "cur_igvalue = 0x%x, pre_igvalue = 0x%x, backoff_val = %d\n",
+                dm_digtable.cur_igvalue, dm_digtable.pre_igvalue,
+                dm_digtable.backoff_val);
 
        if (dm_digtable.pre_igvalue != dm_digtable.cur_igvalue) {
                rtl_set_bbreg(hw, ROFDM0_XAAGCCORE1, 0x7f,
@@ -676,15 +672,14 @@ static void rtl92c_dm_txpower_tracking_callback_thermalmeter(struct ieee80211_hw
 
        rtlpriv->dm.txpower_trackinginit = true;
        RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
-                ("rtl92c_dm_txpower_tracking_callback_thermalmeter\n"));
+                "rtl92c_dm_txpower_tracking_callback_thermalmeter\n");
 
        thermalvalue = (u8) rtl_get_rfreg(hw, RF90_PATH_A, RF_T_METER, 0x1f);
 
        RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
-                ("Readback Thermal Meter = 0x%x pre thermal meter 0x%x "
-                 "eeprom_thermalmeter 0x%x\n",
-                 thermalvalue, rtlpriv->dm.thermalvalue,
-                 rtlefuse->eeprom_thermalmeter));
+                "Readback Thermal Meter = 0x%x pre thermal meter 0x%x eeprom_thermalmeter 0x%x\n",
+                thermalvalue, rtlpriv->dm.thermalvalue,
+                rtlefuse->eeprom_thermalmeter);
 
        rtl92c_phy_ap_calibrate(hw, (thermalvalue -
                                     rtlefuse->eeprom_thermalmeter));
@@ -702,10 +697,9 @@ static void rtl92c_dm_txpower_tracking_callback_thermalmeter(struct ieee80211_hw
                                ofdm_index_old[0] = (u8) i;
 
                                RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
-                                       ("Initial pathA ele_d reg0x%x = 0x%lx, "
-                                        "ofdm_index=0x%x\n",
+                                        "Initial pathA ele_d reg0x%x = 0x%lx, ofdm_index=0x%x\n",
                                         ROFDM0_XATXIQIMBALANCE,
-                                        ele_d, ofdm_index_old[0]));
+                                        ele_d, ofdm_index_old[0]);
                                break;
                        }
                }
@@ -719,11 +713,10 @@ static void rtl92c_dm_txpower_tracking_callback_thermalmeter(struct ieee80211_hw
                                    MASKOFDM_D)) {
 
                                        RT_TRACE(rtlpriv, COMP_POWER_TRACKING,
-                                          DBG_LOUD,
-                                          ("Initial pathB ele_d reg0x%x = "
-                                          "0x%lx, ofdm_index=0x%x\n",
-                                          ROFDM0_XBTXIQIMBALANCE, ele_d,
-                                          ofdm_index_old[1]));
+                                                DBG_LOUD,
+                                                "Initial pathB ele_d reg0x%x = 0x%lx, ofdm_index=0x%x\n",
+                                                ROFDM0_XBTXIQIMBALANCE, ele_d,
+                                                ofdm_index_old[1]);
                                        break;
                                }
                        }
@@ -741,11 +734,10 @@ static void rtl92c_dm_txpower_tracking_callback_thermalmeter(struct ieee80211_hw
 
                                        RT_TRACE(rtlpriv, COMP_POWER_TRACKING,
                                                 DBG_LOUD,
-                                                ("Initial reg0x%x = 0x%lx, "
-                                                 "cck_index=0x%x, ch 14 %d\n",
-                                                 RCCK0_TXFILTER2, temp_cck,
-                                                 cck_index_old,
-                                                 rtlpriv->dm.cck_inch14));
+                                                "Initial reg0x%x = 0x%lx, cck_index=0x%x, ch 14 %d\n",
+                                                RCCK0_TXFILTER2, temp_cck,
+                                                cck_index_old,
+                                                rtlpriv->dm.cck_inch14);
                                        break;
                                }
                        } else {
@@ -757,11 +749,10 @@ static void rtl92c_dm_txpower_tracking_callback_thermalmeter(struct ieee80211_hw
 
                                        RT_TRACE(rtlpriv, COMP_POWER_TRACKING,
                                                 DBG_LOUD,
-                                                ("Initial reg0x%x = 0x%lx, "
-                                                 "cck_index=0x%x, ch14 %d\n",
-                                                 RCCK0_TXFILTER2, temp_cck,
-                                                 cck_index_old,
-                                                 rtlpriv->dm.cck_inch14));
+                                                "Initial reg0x%x = 0x%lx, cck_index=0x%x, ch14 %d\n",
+                                                RCCK0_TXFILTER2, temp_cck,
+                                                cck_index_old,
+                                                rtlpriv->dm.cck_inch14);
                                        break;
                                }
                        }
@@ -790,12 +781,10 @@ static void rtl92c_dm_txpower_tracking_callback_thermalmeter(struct ieee80211_hw
                    (rtlpriv->dm.thermalvalue_iqk - thermalvalue);
 
                RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
-                       ("Readback Thermal Meter = 0x%x pre thermal meter 0x%x "
-                        "eeprom_thermalmeter 0x%x delta 0x%x "
-                        "delta_lck 0x%x delta_iqk 0x%x\n",
+                        "Readback Thermal Meter = 0x%x pre thermal meter 0x%x eeprom_thermalmeter 0x%x delta 0x%x delta_lck 0x%x delta_iqk 0x%x\n",
                         thermalvalue, rtlpriv->dm.thermalvalue,
                         rtlefuse->eeprom_thermalmeter, delta, delta_lck,
-                        delta_iqk));
+                        delta_iqk);
 
                if (delta_lck > 1) {
                        rtlpriv->dm.thermalvalue_lck = thermalvalue;
@@ -815,18 +804,15 @@ static void rtl92c_dm_txpower_tracking_callback_thermalmeter(struct ieee80211_hw
 
                        if (is2t) {
                                RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
-                                        ("temp OFDM_A_index=0x%x, "
-                                         "OFDM_B_index=0x%x,"
-                                         "cck_index=0x%x\n",
-                                         rtlpriv->dm.ofdm_index[0],
-                                         rtlpriv->dm.ofdm_index[1],
-                                         rtlpriv->dm.cck_index));
+                                        "temp OFDM_A_index=0x%x, OFDM_B_index=0x%x, cck_index=0x%x\n",
+                                        rtlpriv->dm.ofdm_index[0],
+                                        rtlpriv->dm.ofdm_index[1],
+                                        rtlpriv->dm.cck_index);
                        } else {
                                RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
-                                        ("temp OFDM_A_index=0x%x,"
-                                         "cck_index=0x%x\n",
-                                         rtlpriv->dm.ofdm_index[0],
-                                         rtlpriv->dm.cck_index));
+                                        "temp OFDM_A_index=0x%x, cck_index=0x%x\n",
+                                        rtlpriv->dm.ofdm_index[0],
+                                        rtlpriv->dm.cck_index);
                        }
 
                        if (thermalvalue > rtlefuse->eeprom_thermalmeter) {
@@ -918,16 +904,13 @@ static void rtl92c_dm_txpower_tracking_callback_thermalmeter(struct ieee80211_hw
 
                        if (is2t) {
                                RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
-                                        ("new OFDM_A_index=0x%x, "
-                                         "OFDM_B_index=0x%x,"
-                                         "cck_index=0x%x\n",
-                                         ofdm_index[0], ofdm_index[1],
-                                         cck_index));
+                                        "new OFDM_A_index=0x%x, OFDM_B_index=0x%x, cck_index=0x%x\n",
+                                        ofdm_index[0], ofdm_index[1],
+                                        cck_index);
                        } else {
                                RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
-                                        ("new OFDM_A_index=0x%x,"
-                                         "cck_index=0x%x\n",
-                                         ofdm_index[0], cck_index));
+                                        "new OFDM_A_index=0x%x, cck_index=0x%x\n",
+                                        ofdm_index[0], cck_index);
                        }
                }
 
@@ -1085,7 +1068,7 @@ static void rtl92c_dm_txpower_tracking_callback_thermalmeter(struct ieee80211_hw
                        rtlpriv->dm.thermalvalue = thermalvalue;
        }
 
-       RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD, ("<===\n"));
+       RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD, "<===\n");
 
 }
 
@@ -1098,8 +1081,8 @@ static void rtl92c_dm_initialize_txpower_tracking_thermalmeter(
        rtlpriv->dm.txpower_trackinginit = false;
 
        RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
-                ("pMgntInfo->txpower_tracking = %d\n",
-                 rtlpriv->dm.txpower_tracking));
+                "pMgntInfo->txpower_tracking = %d\n",
+                rtlpriv->dm.txpower_tracking);
 }
 
 static void rtl92c_dm_initialize_txpower_tracking(struct ieee80211_hw *hw)
@@ -1125,12 +1108,12 @@ static void rtl92c_dm_check_txpower_tracking_thermal_meter(
                rtl_set_rfreg(hw, RF90_PATH_A, RF_T_METER, RFREG_OFFSET_MASK,
                              0x60);
                RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
-                        ("Trigger 92S Thermal Meter!!\n"));
+                        "Trigger 92S Thermal Meter!!\n");
                tm_trigger = 1;
                return;
        } else {
                RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
-                        ("Schedule TxPowerTracking direct call!!\n"));
+                        "Schedule TxPowerTracking direct call!!\n");
                rtl92c_dm_txpower_tracking_directcall(hw);
                tm_trigger = 0;
        }
@@ -1169,13 +1152,13 @@ static void rtl92c_dm_refresh_rate_adaptive_mask(struct ieee80211_hw *hw)
 
        if (is_hal_stop(rtlhal)) {
                RT_TRACE(rtlpriv, COMP_RATE, DBG_LOUD,
-                        ("<---- driver is going to unload\n"));
+                        "<---- driver is going to unload\n");
                return;
        }
 
        if (!rtlpriv->dm.useramask) {
                RT_TRACE(rtlpriv, COMP_RATE, DBG_LOUD,
-                       ("<---- driver does not control rate adaptive mask\n"));
+                        "<---- driver does not control rate adaptive mask\n");
                return;
        }
 
@@ -1210,14 +1193,13 @@ static void rtl92c_dm_refresh_rate_adaptive_mask(struct ieee80211_hw *hw)
                        p_ra->ratr_state = DM_RATR_STA_LOW;
 
                if (p_ra->pre_ratr_state != p_ra->ratr_state) {
+                       RT_TRACE(rtlpriv, COMP_RATE, DBG_LOUD, "RSSI = %ld\n",
+                                rtlpriv->dm.undecorated_smoothed_pwdb);
                        RT_TRACE(rtlpriv, COMP_RATE, DBG_LOUD,
-                                ("RSSI = %ld\n",
-                                 rtlpriv->dm.undecorated_smoothed_pwdb));
+                                "RSSI_LEVEL = %d\n", p_ra->ratr_state);
                        RT_TRACE(rtlpriv, COMP_RATE, DBG_LOUD,
-                                ("RSSI_LEVEL = %d\n", p_ra->ratr_state));
-                       RT_TRACE(rtlpriv, COMP_RATE, DBG_LOUD,
-                                ("PreState = %d, CurState = %d\n",
-                                 p_ra->pre_ratr_state, p_ra->ratr_state));
+                                "PreState = %d, CurState = %d\n",
+                                p_ra->pre_ratr_state, p_ra->ratr_state);
 
                        rcu_read_lock();
                        sta = ieee80211_find_sta(mac->vif, mac->bssid);
@@ -1316,8 +1298,7 @@ static void rtl92c_dm_dynamic_bb_powersaving(struct ieee80211_hw *hw)
        if (((mac->link_state == MAC80211_NOLINK)) &&
            (rtlpriv->dm.entry_min_undecoratedsmoothed_pwdb == 0)) {
                dm_pstable.rssi_val_min = 0;
-               RT_TRACE(rtlpriv, DBG_LOUD, DBG_LOUD,
-                        ("Not connected to any\n"));
+               RT_TRACE(rtlpriv, DBG_LOUD, DBG_LOUD, "Not connected to any\n");
        }
 
        if (mac->link_state == MAC80211_LINKED) {
@@ -1325,22 +1306,22 @@ static void rtl92c_dm_dynamic_bb_powersaving(struct ieee80211_hw *hw)
                        dm_pstable.rssi_val_min =
                            rtlpriv->dm.entry_min_undecoratedsmoothed_pwdb;
                        RT_TRACE(rtlpriv, DBG_LOUD, DBG_LOUD,
-                                ("AP Client PWDB = 0x%lx\n",
-                                 dm_pstable.rssi_val_min));
+                                "AP Client PWDB = 0x%lx\n",
+                                dm_pstable.rssi_val_min);
                } else {
                        dm_pstable.rssi_val_min =
                            rtlpriv->dm.undecorated_smoothed_pwdb;
                        RT_TRACE(rtlpriv, DBG_LOUD, DBG_LOUD,
-                                ("STA Default Port PWDB = 0x%lx\n",
-                                 dm_pstable.rssi_val_min));
+                                "STA Default Port PWDB = 0x%lx\n",
+                                dm_pstable.rssi_val_min);
                }
        } else {
                dm_pstable.rssi_val_min =
                    rtlpriv->dm.entry_min_undecoratedsmoothed_pwdb;
 
                RT_TRACE(rtlpriv, DBG_LOUD, DBG_LOUD,
-                        ("AP Ext Port PWDB = 0x%lx\n",
-                         dm_pstable.rssi_val_min));
+                        "AP Ext Port PWDB = 0x%lx\n",
+                        dm_pstable.rssi_val_min);
        }
 
        if (IS_92C_SERIAL(rtlhal->version))
@@ -1381,7 +1362,7 @@ void rtl92c_dm_dynamic_txpower(struct ieee80211_hw *hw)
        if ((mac->link_state < MAC80211_LINKED) &&
            (rtlpriv->dm.entry_min_undecoratedsmoothed_pwdb == 0)) {
                RT_TRACE(rtlpriv, COMP_POWER, DBG_TRACE,
-                        ("Not connected to any\n"));
+                        "Not connected to any\n");
 
                rtlpriv->dm.dynamic_txhighpower_lvl = TXHIGHPWRLEVEL_NORMAL;
 
@@ -1394,28 +1375,28 @@ void rtl92c_dm_dynamic_txpower(struct ieee80211_hw *hw)
                        undecorated_smoothed_pwdb =
                            rtlpriv->dm.entry_min_undecoratedsmoothed_pwdb;
                        RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
-                                ("AP Client PWDB = 0x%lx\n",
-                                 undecorated_smoothed_pwdb));
+                                "AP Client PWDB = 0x%lx\n",
+                                undecorated_smoothed_pwdb);
                } else {
                        undecorated_smoothed_pwdb =
                            rtlpriv->dm.undecorated_smoothed_pwdb;
                        RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
-                                ("STA Default Port PWDB = 0x%lx\n",
-                                 undecorated_smoothed_pwdb));
+                                "STA Default Port PWDB = 0x%lx\n",
+                                undecorated_smoothed_pwdb);
                }
        } else {
                undecorated_smoothed_pwdb =
                    rtlpriv->dm.entry_min_undecoratedsmoothed_pwdb;
 
                RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
-                        ("AP Ext Port PWDB = 0x%lx\n",
-                         undecorated_smoothed_pwdb));
+                        "AP Ext Port PWDB = 0x%lx\n",
+                        undecorated_smoothed_pwdb);
        }
 
        if (undecorated_smoothed_pwdb >= TX_POWER_NEAR_FIELD_THRESH_LVL2) {
                rtlpriv->dm.dynamic_txhighpower_lvl = TXHIGHPWRLEVEL_LEVEL1;
                RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
-                        ("TXHIGHPWRLEVEL_LEVEL1 (TxPwr=0x0)\n"));
+                        "TXHIGHPWRLEVEL_LEVEL1 (TxPwr=0x0)\n");
        } else if ((undecorated_smoothed_pwdb <
                    (TX_POWER_NEAR_FIELD_THRESH_LVL2 - 3)) &&
                   (undecorated_smoothed_pwdb >=
@@ -1423,18 +1404,18 @@ void rtl92c_dm_dynamic_txpower(struct ieee80211_hw *hw)
 
                rtlpriv->dm.dynamic_txhighpower_lvl = TXHIGHPWRLEVEL_LEVEL1;
                RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
-                        ("TXHIGHPWRLEVEL_LEVEL1 (TxPwr=0x10)\n"));
+                        "TXHIGHPWRLEVEL_LEVEL1 (TxPwr=0x10)\n");
        } else if (undecorated_smoothed_pwdb <
                   (TX_POWER_NEAR_FIELD_THRESH_LVL1 - 5)) {
                rtlpriv->dm.dynamic_txhighpower_lvl = TXHIGHPWRLEVEL_NORMAL;
                RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
-                        ("TXHIGHPWRLEVEL_NORMAL\n"));
+                        "TXHIGHPWRLEVEL_NORMAL\n");
        }
 
        if ((rtlpriv->dm.dynamic_txhighpower_lvl != rtlpriv->dm.last_dtp_lvl)) {
                RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
-                        ("PHY_SetTxPowerLevel8192S() Channel = %d\n",
-                         rtlphy->current_channel));
+                        "PHY_SetTxPowerLevel8192S() Channel = %d\n",
+                        rtlphy->current_channel);
                rtl92c_phy_set_txpower_level(hw, rtlphy->current_channel);
        }
 
index b9736d3..2178e37 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2009-2010  Realtek Corporation.
+ * Copyright(c) 2009-2012  Realtek Corporation.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
index 931d979..c20b3c3 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2009-2010  Realtek Corporation.
+ * Copyright(c) 2009-2012  Realtek Corporation.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
  *
  *****************************************************************************/
 
-#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
-
-#include <linux/firmware.h>
-#include <linux/export.h>
 #include "../wifi.h"
 #include "../pci.h"
 #include "../base.h"
 #include "../rtl8192ce/reg.h"
 #include "../rtl8192ce/def.h"
 #include "fw_common.h"
+#include <linux/export.h>
 
 static void _rtl92c_enable_fw_download(struct ieee80211_hw *hw, bool enable)
 {
@@ -172,7 +169,7 @@ static void _rtl92c_write_fw(struct ieee80211_hw *hw,
        struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
        u8 *bufferPtr = (u8 *) buffer;
 
-       RT_TRACE(rtlpriv, COMP_FW, DBG_TRACE, ("FW size is %d bytes,\n", size));
+       RT_TRACE(rtlpriv, COMP_FW, DBG_TRACE, "FW size is %d bytes\n", size);
 
        if (IS_CHIP_VER_B(version)) {
                u32 pageNums, remainSize;
@@ -186,7 +183,7 @@ static void _rtl92c_write_fw(struct ieee80211_hw *hw,
 
                if (pageNums > 4) {
                        RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                                ("Page numbers should not greater then 4\n"));
+                                "Page numbers should not greater then 4\n");
                }
 
                for (page = 0; page < pageNums; page++) {
@@ -219,13 +216,12 @@ static int _rtl92c_fw_free_to_go(struct ieee80211_hw *hw)
 
        if (counter >= FW_8192C_POLLING_TIMEOUT_COUNT) {
                RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                        ("chksum report faill ! REG_MCUFWDL:0x%08x .\n",
-                         value32));
+                        "chksum report faill ! REG_MCUFWDL:0x%08x\n", value32);
                return -EIO;
        }
 
        RT_TRACE(rtlpriv, COMP_FW, DBG_TRACE,
-                ("Checksum report OK ! REG_MCUFWDL:0x%08x .\n", value32));
+                "Checksum report OK ! REG_MCUFWDL:0x%08x\n", value32);
 
        value32 = rtl_read_dword(rtlpriv, REG_MCUFWDL);
        value32 |= MCUFWDL_RDY;
@@ -238,9 +234,8 @@ static int _rtl92c_fw_free_to_go(struct ieee80211_hw *hw)
                value32 = rtl_read_dword(rtlpriv, REG_MCUFWDL);
                if (value32 & WINTINI_RDY) {
                        RT_TRACE(rtlpriv, COMP_FW, DBG_TRACE,
-                                ("Polling FW ready success!!"
-                                " REG_MCUFWDL:0x%08x .\n",
-                                value32));
+                                "Polling FW ready success!! REG_MCUFWDL:0x%08x\n",
+                                value32);
                        return 0;
                }
 
@@ -249,7 +244,7 @@ static int _rtl92c_fw_free_to_go(struct ieee80211_hw *hw)
        } while (counter++ < FW_8192C_POLLING_TIMEOUT_COUNT);
 
        RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                ("Polling FW ready fail!! REG_MCUFWDL:0x%08x .\n", value32));
+                "Polling FW ready fail!! REG_MCUFWDL:0x%08x\n", value32);
        return -EIO;
 }
 
@@ -262,20 +257,19 @@ int rtl92c_download_fw(struct ieee80211_hw *hw)
        u32 fwsize;
        enum version_8192c version = rtlhal->version;
 
-       if (!rtlhal->pfirmware)
+       if (rtlpriv->max_fw_size == 0 || !rtlhal->pfirmware)
                return 1;
 
-       pr_info("Loading firmware file %s\n", rtlpriv->cfg->fw_name);
        pfwheader = (struct rtl92c_firmware_header *)rtlhal->pfirmware;
        pfwdata = (u8 *) rtlhal->pfirmware;
        fwsize = rtlhal->fwsize;
 
        if (IS_FW_HEADER_EXIST(pfwheader)) {
                RT_TRACE(rtlpriv, COMP_FW, DBG_DMESG,
-                        ("Firmware Version(%d), Signature(%#x),Size(%d)\n",
+                        "Firmware Version(%d), Signature(%#x),Size(%d)\n",
                         le16_to_cpu(pfwheader->version),
                         le16_to_cpu(pfwheader->signature),
-                        (uint)sizeof(struct rtl92c_firmware_header)));
+                        (uint)sizeof(struct rtl92c_firmware_header));
 
                pfwdata = pfwdata + sizeof(struct rtl92c_firmware_header);
                fwsize = fwsize - sizeof(struct rtl92c_firmware_header);
@@ -287,10 +281,10 @@ int rtl92c_download_fw(struct ieee80211_hw *hw)
 
        if (_rtl92c_fw_free_to_go(hw)) {
                RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                        ("Firmware is not ready to run!\n"));
+                        "Firmware is not ready to run!\n");
        } else {
                RT_TRACE(rtlpriv, COMP_FW, DBG_TRACE,
-                        ("Firmware is ready to run!\n"));
+                        "Firmware is ready to run!\n");
        }
 
        return 0;
@@ -328,22 +322,22 @@ static void _rtl92c_fill_h2c_command(struct ieee80211_hw *hw,
        unsigned long flag;
        u8 idx;
 
-       RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, ("come in\n"));
+       RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, "come in\n");
 
        while (true) {
                spin_lock_irqsave(&rtlpriv->locks.h2c_lock, flag);
                if (rtlhal->h2c_setinprogress) {
                        RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD,
-                                ("H2C set in progress! Wait to set.."
-                                 "element_id(%d).\n", element_id));
+                                "H2C set in progress! Wait to set..element_id(%d)\n",
+                                element_id);
 
                        while (rtlhal->h2c_setinprogress) {
                                spin_unlock_irqrestore(&rtlpriv->locks.h2c_lock,
                                                       flag);
                                h2c_waitcounter++;
                                RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD,
-                                        ("Wait 100 us (%d times)...\n",
-                                         h2c_waitcounter));
+                                        "Wait 100 us (%d times)...\n",
+                                        h2c_waitcounter);
                                udelay(100);
 
                                if (h2c_waitcounter > 1000)
@@ -363,8 +357,7 @@ static void _rtl92c_fill_h2c_command(struct ieee80211_hw *hw,
                wait_writeh2c_limmit--;
                if (wait_writeh2c_limmit == 0) {
                        RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                                ("Write H2C fail because no trigger "
-                                 "for FW INT!\n"));
+                                "Write H2C fail because no trigger for FW INT!\n");
                        break;
                }
 
@@ -388,7 +381,7 @@ static void _rtl92c_fill_h2c_command(struct ieee80211_hw *hw,
                        break;
                default:
                        RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                                ("switch case not process\n"));
+                                "switch case not processed\n");
                        break;
                }
 
@@ -398,8 +391,8 @@ static void _rtl92c_fill_h2c_command(struct ieee80211_hw *hw,
                        wait_h2c_limmit--;
                        if (wait_h2c_limmit == 0) {
                                RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD,
-                                        ("Wating too long for FW read "
-                                         "clear HMEBox(%d)!\n", boxnum));
+                                        "Waiting too long for FW read clear HMEBox(%d)!\n",
+                                        boxnum);
                                break;
                        }
 
@@ -408,14 +401,14 @@ static void _rtl92c_fill_h2c_command(struct ieee80211_hw *hw,
                        isfw_read = _rtl92c_check_fw_read_last_h2c(hw, boxnum);
                        u1b_tmp = rtl_read_byte(rtlpriv, 0x1BF);
                        RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD,
-                                ("Wating for FW read clear HMEBox(%d)!!! "
-                                 "0x1BF = %2x\n", boxnum, u1b_tmp));
+                                "Waiting for FW read clear HMEBox(%d)!!! 0x1BF = %2x\n",
+                                boxnum, u1b_tmp);
                }
 
                if (!isfw_read) {
                        RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD,
-                                ("Write H2C register BOX[%d] fail!!!!! "
-                                 "Fw do not read.\n", boxnum));
+                                "Write H2C register BOX[%d] fail!!!!! Fw do not read\n",
+                                boxnum);
                        break;
                }
 
@@ -423,8 +416,8 @@ static void _rtl92c_fill_h2c_command(struct ieee80211_hw *hw,
                memset(boxextcontent, 0, sizeof(boxextcontent));
                boxcontent[0] = element_id;
                RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD,
-                        ("Write element_id box_reg(%4x) = %2x\n",
-                         box_reg, element_id));
+                        "Write element_id box_reg(%4x) = %2x\n",
+                        box_reg, element_id);
 
                switch (cmd_len) {
                case 1:
@@ -493,7 +486,7 @@ static void _rtl92c_fill_h2c_command(struct ieee80211_hw *hw,
                        break;
                default:
                        RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                                ("switch case not process\n"));
+                                "switch case not processed\n");
                        break;
                }
 
@@ -504,29 +497,22 @@ static void _rtl92c_fill_h2c_command(struct ieee80211_hw *hw,
                        rtlhal->last_hmeboxnum = 0;
 
                RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD,
-                        ("pHalData->last_hmeboxnum  = %d\n",
-                         rtlhal->last_hmeboxnum));
+                        "pHalData->last_hmeboxnum  = %d\n",
+                        rtlhal->last_hmeboxnum);
        }
 
        spin_lock_irqsave(&rtlpriv->locks.h2c_lock, flag);
        rtlhal->h2c_setinprogress = false;
        spin_unlock_irqrestore(&rtlpriv->locks.h2c_lock, flag);
 
-       RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, ("go out\n"));
+       RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, "go out\n");
 }
 
 void rtl92c_fill_h2c_cmd(struct ieee80211_hw *hw,
                         u8 element_id, u32 cmd_len, u8 *p_cmdbuffer)
 {
-       struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
        u32 tmp_cmdbuf[2];
 
-       if (rtlhal->fw_ready == false) {
-               RT_ASSERT(false, ("return H2C cmd because of Fw "
-                                 "download fail!!!\n"));
-               return;
-       }
-
        memset(tmp_cmdbuf, 0, 8);
        memcpy(tmp_cmdbuf, p_cmdbuffer, cmd_len);
        _rtl92c_fill_h2c_command(hw, element_id, cmd_len, (u8 *)&tmp_cmdbuf);
@@ -547,7 +533,7 @@ void rtl92c_firmware_selfreset(struct ieee80211_hw *hw)
        while (u1b_tmp & BIT(2)) {
                delay--;
                if (delay == 0) {
-                       RT_ASSERT(false, ("8051 reset fail.\n"));
+                       RT_ASSERT(false, "8051 reset fail\n");
                        break;
                }
                udelay(50);
@@ -562,7 +548,7 @@ void rtl92c_set_fw_pwrmode_cmd(struct ieee80211_hw *hw, u8 mode)
        u8 u1_h2c_set_pwrmode[3] = {0};
        struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
 
-       RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD, ("FW LPS mode = %d\n", mode));
+       RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD, "FW LPS mode = %d\n", mode);
 
        SET_H2CCMD_PWRMODE_PARM_MODE(u1_h2c_set_pwrmode, mode);
        SET_H2CCMD_PWRMODE_PARM_SMART_PS(u1_h2c_set_pwrmode, 1);
@@ -570,7 +556,7 @@ void rtl92c_set_fw_pwrmode_cmd(struct ieee80211_hw *hw, u8 mode)
                                              ppsc->reg_max_lps_awakeintvl);
 
        RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_DMESG,
-                     "rtl92c_set_fw_rsvdpagepkt(): u1_h2c_set_pwrmode\n",
+                     "rtl92c_set_fw_rsvdpagepkt(): u1_h2c_set_pwrmode",
                      u1_h2c_set_pwrmode, 3);
        rtl92c_fill_h2c_cmd(hw, H2C_SETPWRMODE, 3, u1_h2c_set_pwrmode);
 
@@ -780,14 +766,16 @@ void rtl92c_set_fw_rsvdpagepkt(struct ieee80211_hw *hw, bool dl_finished)
        totalpacketlen = TOTAL_RESERVED_PKT_LEN;
 
        RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_LOUD,
-                     "rtl92c_set_fw_rsvdpagepkt(): HW_VAR_SET_TX_CMD: ALL\n",
+                     "rtl92c_set_fw_rsvdpagepkt(): HW_VAR_SET_TX_CMD: ALL",
                      &reserved_page_packet[0], totalpacketlen);
        RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_DMESG,
-                     "rtl92c_set_fw_rsvdpagepkt(): HW_VAR_SET_TX_CMD: ALL\n",
+                     "rtl92c_set_fw_rsvdpagepkt(): HW_VAR_SET_TX_CMD: ALL",
                      u1RsvdPageLoc, 3);
 
 
        skb = dev_alloc_skb(totalpacketlen);
+       if (!skb)
+               return;
        memcpy((u8 *) skb_put(skb, totalpacketlen),
               &reserved_page_packet, totalpacketlen);
 
@@ -798,15 +786,14 @@ void rtl92c_set_fw_rsvdpagepkt(struct ieee80211_hw *hw, bool dl_finished)
 
        if (dlok) {
                RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
-                        ("Set RSVD page location to Fw.\n"));
+                        "Set RSVD page location to Fw\n");
                RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_DMESG,
-                               "H2C_RSVDPAGE:\n",
-                               u1RsvdPageLoc, 3);
+                             "H2C_RSVDPAGE", u1RsvdPageLoc, 3);
                rtl92c_fill_h2c_cmd(hw, H2C_RSVDPAGE,
                                    sizeof(u1RsvdPageLoc), u1RsvdPageLoc);
        } else
                RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
-                        ("Set RSVD page location to Fw FAIL!!!!!!.\n"));
+                        "Set RSVD page location to Fw FAIL!!!!!!\n");
 }
 EXPORT_SYMBOL(rtl92c_set_fw_rsvdpagepkt);
 
index cec5a3a..780ea5b 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2009-2010  Realtek Corporation.
+ * Copyright(c) 2009-2012  Realtek Corporation.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
index 605ff19..918b1d1 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2009-2010  Realtek Corporation.
+ * Copyright(c) 2009-2012  Realtek Corporation.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
@@ -27,8 +27,8 @@
  *
  *****************************************************************************/
 
-#include <linux/module.h>
 #include "../wifi.h"
+#include <linux/module.h>
 
 
 MODULE_AUTHOR("lizhaoming      <chaoming_li@realsil.com.cn>");
index 1f07558..1eec3a0 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2009-2010  Realtek Corporation.
+ * Copyright(c) 2009-2012  Realtek Corporation.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
@@ -42,16 +42,15 @@ u32 rtl92c_phy_query_bb_reg(struct ieee80211_hw *hw, u32 regaddr, u32 bitmask)
        struct rtl_priv *rtlpriv = rtl_priv(hw);
        u32 returnvalue, originalvalue, bitshift;
 
-       RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, ("regaddr(%#x), "
-                                              "bitmask(%#x)\n", regaddr,
-                                              bitmask));
+       RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, "regaddr(%#x), bitmask(%#x)\n",
+                regaddr, bitmask);
        originalvalue = rtl_read_dword(rtlpriv, regaddr);
        bitshift = _rtl92c_phy_calculate_bit_shift(bitmask);
        returnvalue = (originalvalue & bitmask) >> bitshift;
 
-       RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, ("BBR MASK=0x%x "
-                                              "Addr[0x%x]=0x%x\n", bitmask,
-                                              regaddr, originalvalue));
+       RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
+                "BBR MASK=0x%x Addr[0x%x]=0x%x\n",
+                bitmask, regaddr, originalvalue);
 
        return returnvalue;
 
@@ -64,9 +63,9 @@ void rtl92c_phy_set_bb_reg(struct ieee80211_hw *hw,
        struct rtl_priv *rtlpriv = rtl_priv(hw);
        u32 originalvalue, bitshift;
 
-       RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, ("regaddr(%#x), bitmask(%#x),"
-                                              " data(%#x)\n", regaddr, bitmask,
-                                              data));
+       RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
+                "regaddr(%#x), bitmask(%#x), data(%#x)\n",
+                regaddr, bitmask, data);
 
        if (bitmask != MASKDWORD) {
                originalvalue = rtl_read_dword(rtlpriv, regaddr);
@@ -76,9 +75,9 @@ void rtl92c_phy_set_bb_reg(struct ieee80211_hw *hw,
 
        rtl_write_dword(rtlpriv, regaddr, data);
 
-       RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, ("regaddr(%#x), bitmask(%#x),"
-                                              " data(%#x)\n", regaddr, bitmask,
-                                              data));
+       RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
+                "regaddr(%#x), bitmask(%#x), data(%#x)\n",
+                regaddr, bitmask, data);
 
 }
 EXPORT_SYMBOL(rtl92c_phy_set_bb_reg);
@@ -86,7 +85,7 @@ EXPORT_SYMBOL(rtl92c_phy_set_bb_reg);
 u32 _rtl92c_phy_fw_rf_serial_read(struct ieee80211_hw *hw,
                                  enum radio_path rfpath, u32 offset)
 {
-       RT_ASSERT(false, ("deprecated!\n"));
+       RT_ASSERT(false, "deprecated!\n");
        return 0;
 
 }
@@ -96,7 +95,7 @@ void _rtl92c_phy_fw_rf_serial_write(struct ieee80211_hw *hw,
                                    enum radio_path rfpath, u32 offset,
                                    u32 data)
 {
-       RT_ASSERT(false, ("deprecated!\n"));
+       RT_ASSERT(false, "deprecated!\n");
 }
 EXPORT_SYMBOL(_rtl92c_phy_fw_rf_serial_write);
 
@@ -114,7 +113,7 @@ u32 _rtl92c_phy_rf_serial_read(struct ieee80211_hw *hw,
        offset &= 0x3f;
        newoffset = offset;
        if (RT_CANNOT_IO(hw)) {
-               RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, ("return all one\n"));
+               RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "return all one\n");
                return 0xFFFFFFFF;
        }
        tmplong = rtl_get_bbreg(hw, RFPGA0_XA_HSSIPARAMETER2, MASKDWORD);
@@ -144,9 +143,8 @@ u32 _rtl92c_phy_rf_serial_read(struct ieee80211_hw *hw,
        else
                retvalue = rtl_get_bbreg(hw, pphyreg->rflssi_readback,
                                         BLSSIREADBACKDATA);
-       RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, ("RFR-%d Addr[0x%x]=0x%x\n",
-                                              rfpath, pphyreg->rflssi_readback,
-                                              retvalue));
+       RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, "RFR-%d Addr[0x%x]=0x%x\n",
+                rfpath, pphyreg->rflssi_readback, retvalue);
        return retvalue;
 }
 EXPORT_SYMBOL(_rtl92c_phy_rf_serial_read);
@@ -162,16 +160,15 @@ void _rtl92c_phy_rf_serial_write(struct ieee80211_hw *hw,
        struct bb_reg_def *pphyreg = &rtlphy->phyreg_def[rfpath];
 
        if (RT_CANNOT_IO(hw)) {
-               RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, ("stop\n"));
+               RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "stop\n");
                return;
        }
        offset &= 0x3f;
        newoffset = offset;
        data_and_addr = ((newoffset << 20) | (data & 0x000fffff)) & 0x0fffffff;
        rtl_set_bbreg(hw, pphyreg->rf3wire_offset, MASKDWORD, data_and_addr);
-       RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, ("RFW-%d Addr[0x%x]=0x%x\n",
-                                              rfpath, pphyreg->rf3wire_offset,
-                                              data_and_addr));
+       RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, "RFW-%d Addr[0x%x]=0x%x\n",
+                rfpath, pphyreg->rf3wire_offset, data_and_addr);
 }
 EXPORT_SYMBOL(_rtl92c_phy_rf_serial_write);
 
@@ -180,7 +177,7 @@ u32 _rtl92c_phy_calculate_bit_shift(u32 bitmask)
        u32 i;
 
        for (i = 0; i <= 31; i++) {
-               if (((bitmask >> i) & 0x1) == 1)
+               if ((bitmask >> i) & 0x1)
                        break;
        }
        return i;
@@ -216,30 +213,30 @@ bool _rtl92c_phy_bb8192c_config_parafile(struct ieee80211_hw *hw)
        struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
        bool rtstatus;
 
-       RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, ("==>\n"));
+       RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, "==>\n");
        rtstatus = rtlpriv->cfg->ops->config_bb_with_headerfile(hw,
                                                 BASEBAND_CONFIG_PHY_REG);
-       if (rtstatus != true) {
-               RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, ("Write BB Reg Fail!!"));
+       if (!rtstatus) {
+               RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "Write BB Reg Fail!!\n");
                return false;
        }
        if (rtlphy->rf_type == RF_1T2R) {
                _rtl92c_phy_bb_config_1t(hw);
-               RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, ("Config to 1T!!\n"));
+               RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, "Config to 1T!!\n");
        }
        if (rtlefuse->autoload_failflag == false) {
                rtlphy->pwrgroup_cnt = 0;
                rtstatus = rtlpriv->cfg->ops->config_bb_with_pgheaderfile(hw,
                                                   BASEBAND_CONFIG_PHY_REG);
        }
-       if (rtstatus != true) {
-               RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, ("BB_PG Reg Fail!!"));
+       if (!rtstatus) {
+               RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "BB_PG Reg Fail!!\n");
                return false;
        }
        rtstatus = rtlpriv->cfg->ops->config_bb_with_headerfile(hw,
                                                 BASEBAND_CONFIG_AGC_TAB);
-       if (rtstatus != true) {
-               RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, ("AGC Table Fail\n"));
+       if (!rtstatus) {
+               RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "AGC Table Fail\n");
                return false;
        }
        rtlphy->cck_high_power = (bool) (rtl_get_bbreg(hw,
@@ -256,121 +253,51 @@ void _rtl92c_store_pwrIndex_diffrate_offset(struct ieee80211_hw *hw,
 {
        struct rtl_priv *rtlpriv = rtl_priv(hw);
        struct rtl_phy *rtlphy = &(rtlpriv->phy);
+       int index;
+
+       if (regaddr == RTXAGC_A_RATE18_06)
+               index = 0;
+       else if (regaddr == RTXAGC_A_RATE54_24)
+               index = 1;
+       else if (regaddr == RTXAGC_A_CCK1_MCS32)
+               index = 6;
+       else if (regaddr == RTXAGC_B_CCK11_A_CCK2_11 && bitmask == 0xffffff00)
+               index = 7;
+       else if (regaddr == RTXAGC_A_MCS03_MCS00)
+               index = 2;
+       else if (regaddr == RTXAGC_A_MCS07_MCS04)
+               index = 3;
+       else if (regaddr == RTXAGC_A_MCS11_MCS08)
+               index = 4;
+       else if (regaddr == RTXAGC_A_MCS15_MCS12)
+               index = 5;
+       else if (regaddr == RTXAGC_B_RATE18_06)
+               index = 8;
+       else if (regaddr == RTXAGC_B_RATE54_24)
+               index = 9;
+       else if (regaddr == RTXAGC_B_CCK1_55_MCS32)
+               index = 14;
+       else if (regaddr == RTXAGC_B_CCK11_A_CCK2_11 && bitmask == 0x000000ff)
+               index = 15;
+       else if (regaddr == RTXAGC_B_MCS03_MCS00)
+               index = 10;
+       else if (regaddr == RTXAGC_B_MCS07_MCS04)
+               index = 11;
+       else if (regaddr == RTXAGC_B_MCS11_MCS08)
+               index = 12;
+       else if (regaddr == RTXAGC_B_MCS15_MCS12)
+               index = 13;
+       else
+               return;
 
-       if (regaddr == RTXAGC_A_RATE18_06) {
-               rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][0] = data;
-               RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
-                        ("MCSTxPowerLevelOriginalOffset[%d][0] = 0x%x\n",
-                         rtlphy->pwrgroup_cnt,
-                         rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][0]));
-       }
-       if (regaddr == RTXAGC_A_RATE54_24) {
-               rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][1] = data;
-               RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
-                        ("MCSTxPowerLevelOriginalOffset[%d][1] = 0x%x\n",
-                         rtlphy->pwrgroup_cnt,
-                         rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][1]));
-       }
-       if (regaddr == RTXAGC_A_CCK1_MCS32) {
-               rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][6] = data;
-               RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
-                        ("MCSTxPowerLevelOriginalOffset[%d][6] = 0x%x\n",
-                         rtlphy->pwrgroup_cnt,
-                         rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][6]));
-       }
-       if (regaddr == RTXAGC_B_CCK11_A_CCK2_11 && bitmask == 0xffffff00) {
-               rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][7] = data;
-               RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
-                        ("MCSTxPowerLevelOriginalOffset[%d][7] = 0x%x\n",
-                         rtlphy->pwrgroup_cnt,
-                         rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][7]));
-       }
-       if (regaddr == RTXAGC_A_MCS03_MCS00) {
-               rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][2] = data;
-               RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
-                        ("MCSTxPowerLevelOriginalOffset[%d][2] = 0x%x\n",
-                         rtlphy->pwrgroup_cnt,
-                         rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][2]));
-       }
-       if (regaddr == RTXAGC_A_MCS07_MCS04) {
-               rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][3] = data;
-               RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
-                        ("MCSTxPowerLevelOriginalOffset[%d][3] = 0x%x\n",
-                         rtlphy->pwrgroup_cnt,
-                         rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][3]));
-       }
-       if (regaddr == RTXAGC_A_MCS11_MCS08) {
-               rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][4] = data;
-               RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
-                        ("MCSTxPowerLevelOriginalOffset[%d][4] = 0x%x\n",
-                         rtlphy->pwrgroup_cnt,
-                         rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][4]));
-       }
-       if (regaddr == RTXAGC_A_MCS15_MCS12) {
-               rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][5] = data;
-               RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
-                        ("MCSTxPowerLevelOriginalOffset[%d][5] = 0x%x\n",
-                         rtlphy->pwrgroup_cnt,
-                         rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][5]));
-       }
-       if (regaddr == RTXAGC_B_RATE18_06) {
-               rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][8] = data;
-               RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
-                        ("MCSTxPowerLevelOriginalOffset[%d][8] = 0x%x\n",
-                         rtlphy->pwrgroup_cnt,
-                         rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][8]));
-       }
-       if (regaddr == RTXAGC_B_RATE54_24) {
-               rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][9] = data;
-               RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
-                        ("MCSTxPowerLevelOriginalOffset[%d][9] = 0x%x\n",
-                         rtlphy->pwrgroup_cnt,
-                         rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][9]));
-       }
-       if (regaddr == RTXAGC_B_CCK1_55_MCS32) {
-               rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][14] = data;
-               RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
-                        ("MCSTxPowerLevelOriginalOffset[%d][14] = 0x%x\n",
-                         rtlphy->pwrgroup_cnt,
-                         rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][14]));
-       }
-       if (regaddr == RTXAGC_B_CCK11_A_CCK2_11 && bitmask == 0x000000ff) {
-               rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][15] = data;
-               RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
-                        ("MCSTxPowerLevelOriginalOffset[%d][15] = 0x%x\n",
-                         rtlphy->pwrgroup_cnt,
-                         rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][15]));
-       }
-       if (regaddr == RTXAGC_B_MCS03_MCS00) {
-               rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][10] = data;
-               RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
-                        ("MCSTxPowerLevelOriginalOffset[%d][10] = 0x%x\n",
-                         rtlphy->pwrgroup_cnt,
-                         rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][10]));
-       }
-       if (regaddr == RTXAGC_B_MCS07_MCS04) {
-               rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][11] = data;
-               RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
-                        ("MCSTxPowerLevelOriginalOffset[%d][11] = 0x%x\n",
-                         rtlphy->pwrgroup_cnt,
-                         rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][11]));
-       }
-       if (regaddr == RTXAGC_B_MCS11_MCS08) {
-               rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][12] = data;
-               RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
-                        ("MCSTxPowerLevelOriginalOffset[%d][12] = 0x%x\n",
-                         rtlphy->pwrgroup_cnt,
-                         rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][12]));
-       }
-       if (regaddr == RTXAGC_B_MCS15_MCS12) {
-               rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][13] = data;
-               RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
-                        ("MCSTxPowerLevelOriginalOffset[%d][13] = 0x%x\n",
-                         rtlphy->pwrgroup_cnt,
-                         rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][13]));
+       rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][index] = data;
+       RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
+                "MCSTxPowerLevelOriginalOffset[%d][%d] = 0x%x\n",
+                rtlphy->pwrgroup_cnt, index,
+                rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][index]);
 
+       if (index == 13)
                rtlphy->pwrgroup_cnt++;
-       }
 }
 EXPORT_SYMBOL(_rtl92c_store_pwrIndex_diffrate_offset);
 
@@ -389,12 +316,11 @@ void rtl92c_phy_get_hw_reg_originalvalue(struct ieee80211_hw *hw)
            (u8) rtl_get_bbreg(hw, ROFDM0_XDAGCCORE1, MASKBYTE0);
 
        RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
-                ("Default initial gain (c50=0x%x, "
-                 "c58=0x%x, c60=0x%x, c68=0x%x\n",
-                 rtlphy->default_initialgain[0],
-                 rtlphy->default_initialgain[1],
-                 rtlphy->default_initialgain[2],
-                 rtlphy->default_initialgain[3]));
+                "Default initial gain (c50=0x%x, c58=0x%x, c60=0x%x, c68=0x%x\n",
+                rtlphy->default_initialgain[0],
+                rtlphy->default_initialgain[1],
+                rtlphy->default_initialgain[2],
+                rtlphy->default_initialgain[3]);
 
        rtlphy->framesync = (u8) rtl_get_bbreg(hw,
                                               ROFDM0_RXDETECTOR3, MASKBYTE0);
@@ -402,8 +328,8 @@ void rtl92c_phy_get_hw_reg_originalvalue(struct ieee80211_hw *hw)
                                              ROFDM0_RXDETECTOR2, MASKDWORD);
 
        RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
-                ("Default framesync (0x%x) = 0x%x\n",
-                 ROFDM0_RXDETECTOR3, rtlphy->framesync));
+                "Default framesync (0x%x) = 0x%x\n",
+                ROFDM0_RXDETECTOR3, rtlphy->framesync);
 }
 
 void _rtl92c_phy_init_bb_rf_register_definition(struct ieee80211_hw *hw)
@@ -584,7 +510,7 @@ void rtl92c_phy_set_txpower_level(struct ieee80211_hw *hw, u8 channel)
        struct rtl_efuse *rtlefuse = rtl_efuse(rtlpriv);
        u8 cckpowerlevel[2], ofdmpowerlevel[2];
 
-       if (rtlefuse->txpwr_fromeprom == false)
+       if (!rtlefuse->txpwr_fromeprom)
                return;
        _rtl92c_get_txpower_index(hw, channel,
                                  &cckpowerlevel[0], &ofdmpowerlevel[0]);
@@ -615,8 +541,8 @@ bool rtl92c_phy_update_txpower_dbm(struct ieee80211_hw *hw, long power_indbm)
        else
                ofdmtxpwridx = 0;
        RT_TRACE(rtlpriv, COMP_TXAGC, DBG_TRACE,
-                ("%lx dBm, ccktxpwridx = %d, ofdmtxpwridx = %d\n",
-                 power_indbm, ccktxpwridx, ofdmtxpwridx));
+                "%lx dBm, ccktxpwridx = %d, ofdmtxpwridx = %d\n",
+                power_indbm, ccktxpwridx, ofdmtxpwridx);
        for (idx = 0; idx < 14; idx++) {
                for (rf_path = 0; rf_path < 2; rf_path++) {
                        rtlefuse->txpwrlevel_cck[rf_path][idx] = ccktxpwridx;
@@ -710,7 +636,7 @@ void rtl92c_phy_scan_operation_backup(struct ieee80211_hw *hw, u8 operation)
                        break;
                default:
                        RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                                ("Unknown Scan Backup operation.\n"));
+                                "Unknown Scan Backup operation\n");
                        break;
                }
        }
@@ -732,7 +658,7 @@ void rtl92c_phy_set_bw_mode(struct ieee80211_hw *hw,
                rtlpriv->cfg->ops->phy_set_bw_mode_callback(hw);
        } else {
                RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
-                        ("FALSE driver sleep or unload\n"));
+                        "FALSE driver sleep or unload\n");
                rtlphy->set_bwmode_inprogress = false;
                rtlphy->current_chan_bw = tmp_bw;
        }
@@ -747,7 +673,7 @@ void rtl92c_phy_sw_chnl_callback(struct ieee80211_hw *hw)
        u32 delay;
 
        RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE,
-                ("switch to channel%d\n", rtlphy->current_channel));
+                "switch to channel%d\n", rtlphy->current_channel);
        if (is_hal_stop(rtlhal))
                return;
        do {
@@ -765,7 +691,7 @@ void rtl92c_phy_sw_chnl_callback(struct ieee80211_hw *hw)
                }
                break;
        } while (true);
-       RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE, ("<==\n"));
+       RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE, "<==\n");
 }
 EXPORT_SYMBOL(rtl92c_phy_sw_chnl_callback);
 
@@ -780,19 +706,18 @@ u8 rtl92c_phy_sw_chnl(struct ieee80211_hw *hw)
        if (rtlphy->set_bwmode_inprogress)
                return 0;
        RT_ASSERT((rtlphy->current_channel <= 14),
-                 ("WIRELESS_MODE_G but channel>14"));
+                 "WIRELESS_MODE_G but channel>14\n");
        rtlphy->sw_chnl_inprogress = true;
        rtlphy->sw_chnl_stage = 0;
        rtlphy->sw_chnl_step = 0;
        if (!(is_hal_stop(rtlhal)) && !(RT_CANNOT_IO(hw))) {
                rtl92c_phy_sw_chnl_callback(hw);
                RT_TRACE(rtlpriv, COMP_CHAN, DBG_LOUD,
-                        ("sw_chnl_inprogress false schdule workitem\n"));
+                        "sw_chnl_inprogress false schdule workitem\n");
                rtlphy->sw_chnl_inprogress = false;
        } else {
                RT_TRACE(rtlpriv, COMP_CHAN, DBG_LOUD,
-                        ("sw_chnl_inprogress false driver sleep or"
-                         " unload\n"));
+                        "sw_chnl_inprogress false driver sleep or unload\n");
                rtlphy->sw_chnl_inprogress = false;
        }
        return 1;
@@ -807,7 +732,7 @@ static bool _rtl92c_phy_set_sw_chnl_cmdarray(struct swchnlcmd *cmdtable,
        struct swchnlcmd *pcmd;
 
        if (cmdtable == NULL) {
-               RT_ASSERT(false, ("cmdtable cannot be NULL.\n"));
+               RT_ASSERT(false, "cmdtable cannot be NULL\n");
                return false;
        }
 
@@ -853,7 +778,7 @@ bool _rtl92c_phy_sw_chnl_step_by_step(struct ieee80211_hw *hw,
        rfdependcmdcnt = 0;
 
        RT_ASSERT((channel >= 1 && channel <= 14),
-                 ("illegal channel for Zebra: %d\n", channel));
+                 "invalid channel for Zebra: %d\n", channel);
 
        _rtl92c_phy_set_sw_chnl_cmdarray(rfdependcmd, rfdependcmdcnt++,
                                         MAX_RFDEPENDCMD_CNT, CMDID_RF_WRITEREG,
@@ -916,7 +841,7 @@ bool _rtl92c_phy_sw_chnl_step_by_step(struct ieee80211_hw *hw,
                        break;
                default:
                        RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                                ("switch case not process\n"));
+                                "switch case not processed\n");
                        break;
                }
 
@@ -1920,23 +1845,23 @@ bool rtl92c_phy_set_io_cmd(struct ieee80211_hw *hw, enum io_type iotype)
        bool postprocessing = false;
 
        RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE,
-                ("-->IO Cmd(%#x), set_io_inprogress(%d)\n",
-                 iotype, rtlphy->set_io_inprogress));
+                "-->IO Cmd(%#x), set_io_inprogress(%d)\n",
+                iotype, rtlphy->set_io_inprogress);
        do {
                switch (iotype) {
                case IO_CMD_RESUME_DM_BY_SCAN:
                        RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE,
-                                ("[IO CMD] Resume DM after scan.\n"));
+                                "[IO CMD] Resume DM after scan\n");
                        postprocessing = true;
                        break;
                case IO_CMD_PAUSE_DM_BY_SCAN:
                        RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE,
-                                ("[IO CMD] Pause DM before scan.\n"));
+                                "[IO CMD] Pause DM before scan\n");
                        postprocessing = true;
                        break;
                default:
                        RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                                ("switch case not process\n"));
+                                "switch case not processed\n");
                        break;
                }
        } while (false);
@@ -1947,7 +1872,7 @@ bool rtl92c_phy_set_io_cmd(struct ieee80211_hw *hw, enum io_type iotype)
                return false;
        }
        rtl92c_phy_set_io(hw);
-       RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE, ("<--IO Type(%#x)\n", iotype));
+       RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE, "<--IO Type(%#x)\n", iotype);
        return true;
 }
 EXPORT_SYMBOL(rtl92c_phy_set_io_cmd);
@@ -1958,8 +1883,8 @@ void rtl92c_phy_set_io(struct ieee80211_hw *hw)
        struct rtl_phy *rtlphy = &(rtlpriv->phy);
 
        RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE,
-                ("--->Cmd(%#x), set_io_inprogress(%d)\n",
-                 rtlphy->current_io_type, rtlphy->set_io_inprogress));
+                "--->Cmd(%#x), set_io_inprogress(%d)\n",
+                rtlphy->current_io_type, rtlphy->set_io_inprogress);
        switch (rtlphy->current_io_type) {
        case IO_CMD_RESUME_DM_BY_SCAN:
                dm_digtable.cur_igvalue = rtlphy->initgain_backup.xaagccore1;
@@ -1973,12 +1898,12 @@ void rtl92c_phy_set_io(struct ieee80211_hw *hw)
                break;
        default:
                RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                        ("switch case not process\n"));
+                        "switch case not processed\n");
                break;
        }
        rtlphy->set_io_inprogress = false;
-       RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE,
-                ("<---(%#x)\n", rtlphy->current_io_type));
+       RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE, "<---(%#x)\n",
+                rtlphy->current_io_type);
 }
 EXPORT_SYMBOL(rtl92c_phy_set_io);
 
@@ -2018,7 +1943,7 @@ void _rtl92c_phy_set_rf_sleep(struct ieee80211_hw *hw)
                rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE3);
                rtl_write_byte(rtlpriv, REG_TXPAUSE, 0x00);
                RT_TRACE(rtlpriv, COMP_POWER, DBG_TRACE,
-                        ("Switch RF timeout !!!.\n"));
+                        "Switch RF timeout !!!\n");
                return;
        }
        rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE2);
index 9a264c0..cec10d6 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2009-2010  Realtek Corporation.
+ * Copyright(c) 2009-2012  Realtek Corporation.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
index 9fc804d..04c3aef 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2009-2010  Realtek Corporation.
+ * Copyright(c) 2009-2012  Realtek Corporation.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
index 2df33e5..27b3af8 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2009-2010  Realtek Corporation.
+ * Copyright(c) 2009-2012  Realtek Corporation.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
@@ -54,7 +54,7 @@ void rtl92ce_dm_dynamic_txpower(struct ieee80211_hw *hw)
        if ((mac->link_state < MAC80211_LINKED) &&
            (rtlpriv->dm.entry_min_undecoratedsmoothed_pwdb == 0)) {
                RT_TRACE(rtlpriv, COMP_POWER, DBG_TRACE,
-                        ("Not connected to any\n"));
+                        "Not connected to any\n");
 
                rtlpriv->dm.dynamic_txhighpower_lvl = TXHIGHPWRLEVEL_NORMAL;
 
@@ -67,28 +67,28 @@ void rtl92ce_dm_dynamic_txpower(struct ieee80211_hw *hw)
                        undecorated_smoothed_pwdb =
                            rtlpriv->dm.entry_min_undecoratedsmoothed_pwdb;
                        RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
-                                ("AP Client PWDB = 0x%lx\n",
-                                 undecorated_smoothed_pwdb));
+                                "AP Client PWDB = 0x%lx\n",
+                                undecorated_smoothed_pwdb);
                } else {
                        undecorated_smoothed_pwdb =
                            rtlpriv->dm.undecorated_smoothed_pwdb;
                        RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
-                                ("STA Default Port PWDB = 0x%lx\n",
-                                 undecorated_smoothed_pwdb));
+                                "STA Default Port PWDB = 0x%lx\n",
+                                undecorated_smoothed_pwdb);
                }
        } else {
                undecorated_smoothed_pwdb =
                    rtlpriv->dm.entry_min_undecoratedsmoothed_pwdb;
 
                RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
-                        ("AP Ext Port PWDB = 0x%lx\n",
-                         undecorated_smoothed_pwdb));
+                        "AP Ext Port PWDB = 0x%lx\n",
+                        undecorated_smoothed_pwdb);
        }
 
        if (undecorated_smoothed_pwdb >= TX_POWER_NEAR_FIELD_THRESH_LVL2) {
                rtlpriv->dm.dynamic_txhighpower_lvl = TXHIGHPWRLEVEL_LEVEL1;
                RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
-                        ("TXHIGHPWRLEVEL_LEVEL1 (TxPwr=0x0)\n"));
+                        "TXHIGHPWRLEVEL_LEVEL1 (TxPwr=0x0)\n");
        } else if ((undecorated_smoothed_pwdb <
                    (TX_POWER_NEAR_FIELD_THRESH_LVL2 - 3)) &&
                   (undecorated_smoothed_pwdb >=
@@ -96,18 +96,18 @@ void rtl92ce_dm_dynamic_txpower(struct ieee80211_hw *hw)
 
                rtlpriv->dm.dynamic_txhighpower_lvl = TXHIGHPWRLEVEL_LEVEL1;
                RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
-                        ("TXHIGHPWRLEVEL_LEVEL1 (TxPwr=0x10)\n"));
+                        "TXHIGHPWRLEVEL_LEVEL1 (TxPwr=0x10)\n");
        } else if (undecorated_smoothed_pwdb <
                   (TX_POWER_NEAR_FIELD_THRESH_LVL1 - 5)) {
                rtlpriv->dm.dynamic_txhighpower_lvl = TXHIGHPWRLEVEL_NORMAL;
                RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
-                        ("TXHIGHPWRLEVEL_NORMAL\n"));
+                        "TXHIGHPWRLEVEL_NORMAL\n");
        }
 
        if ((rtlpriv->dm.dynamic_txhighpower_lvl != rtlpriv->dm.last_dtp_lvl)) {
                RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
-                        ("PHY_SetTxPowerLevel8192S() Channel = %d\n",
-                         rtlphy->current_channel));
+                        "PHY_SetTxPowerLevel8192S() Channel = %d\n",
+                        rtlphy->current_channel);
                rtl92c_phy_set_txpower_level(hw, rtlphy->current_channel);
        }
 
index 07dd955..26747fa 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2009-2010  Realtek Corporation.
+ * Copyright(c) 2009-2012  Realtek Corporation.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
index a3deaef..5c4d9bc 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2009-2010  Realtek Corporation.
+ * Copyright(c) 2009-2012  Realtek Corporation.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
@@ -141,7 +141,7 @@ void rtl92ce_get_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)
                }
        default:
                RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                        ("switch case not process\n"));
+                        "switch case not processed\n");
                break;
        }
 }
@@ -207,7 +207,7 @@ void rtl92ce_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)
                        u8 e_aci;
 
                        RT_TRACE(rtlpriv, COMP_MLME, DBG_LOUD,
-                                ("HW_VAR_SLOT_TIME %x\n", val[0]));
+                                "HW_VAR_SLOT_TIME %x\n", val[0]);
 
                        rtl_write_byte(rtlpriv, REG_SLOT, val[0]);
 
@@ -246,8 +246,8 @@ void rtl92ce_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)
                                *val = min_spacing_to_set;
 
                                RT_TRACE(rtlpriv, COMP_MLME, DBG_LOUD,
-                                        ("Set HW_VAR_AMPDU_MIN_SPACE: %#x\n",
-                                         mac->min_space_cfg));
+                                        "Set HW_VAR_AMPDU_MIN_SPACE: %#x\n",
+                                        mac->min_space_cfg);
 
                                rtl_write_byte(rtlpriv, REG_AMPDU_MIN_SPACE,
                                               mac->min_space_cfg);
@@ -261,8 +261,8 @@ void rtl92ce_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)
                        mac->min_space_cfg |= (density_to_set << 3);
 
                        RT_TRACE(rtlpriv, COMP_MLME, DBG_LOUD,
-                                ("Set HW_VAR_SHORTGI_DENSITY: %#x\n",
-                                 mac->min_space_cfg));
+                                "Set HW_VAR_SHORTGI_DENSITY: %#x\n",
+                                mac->min_space_cfg);
 
                        rtl_write_byte(rtlpriv, REG_AMPDU_MIN_SPACE,
                                       mac->min_space_cfg);
@@ -310,8 +310,8 @@ void rtl92ce_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)
                                }
 
                                RT_TRACE(rtlpriv, COMP_MLME, DBG_LOUD,
-                                        ("Set HW_VAR_AMPDU_FACTOR: %#x\n",
-                                         factor_toset));
+                                        "Set HW_VAR_AMPDU_FACTOR: %#x\n",
+                                        factor_toset);
                        }
                        break;
                }
@@ -348,8 +348,8 @@ void rtl92ce_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)
                                        break;
                                default:
                                        RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
-                                                ("HW_VAR_ACM_CTRL acm set "
-                                                 "failed: eACI is %d\n", acm));
+                                                "HW_VAR_ACM_CTRL acm set failed: eACI is %d\n",
+                                                acm);
                                        break;
                                }
                        } else {
@@ -365,14 +365,14 @@ void rtl92ce_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)
                                        break;
                                default:
                                        RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                                                ("switch case not process\n"));
+                                                "switch case not processed\n");
                                        break;
                                }
                        }
 
                        RT_TRACE(rtlpriv, COMP_QOS, DBG_TRACE,
-                                ("SetHwReg8190pci(): [HW_VAR_ACM_CTRL] "
-                                 "Write 0x%X\n", acm_ctrl));
+                                "SetHwReg8190pci(): [HW_VAR_ACM_CTRL] Write 0x%X\n",
+                                acm_ctrl);
                        rtl_write_byte(rtlpriv, REG_ACMHWCTRL, acm_ctrl);
                        break;
                }
@@ -507,8 +507,8 @@ void rtl92ce_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)
 
                }
        default:
-               RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, ("switch case "
-                                                       "not process\n"));
+               RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
+                        "switch case not processed\n");
                break;
        }
 }
@@ -530,8 +530,8 @@ static bool _rtl92ce_llt_write(struct ieee80211_hw *hw, u32 address, u32 data)
 
                if (count > POLLING_LLT_THRESHOLD) {
                        RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                                ("Failed to polling write LLT done at "
-                                 "address %d!\n", address));
+                                "Failed to polling write LLT done at address %d!\n",
+                                address);
                        status = false;
                        break;
                }
@@ -669,18 +669,15 @@ static bool _rtl92ce_init_mac(struct ieee80211_hw *hw)
        udelay(2);
 
        retry = 0;
-       RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, ("reg0xec:%x:%x\n",
-                                               rtl_read_dword(rtlpriv, 0xEC),
-                                               bytetmp));
+       RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "reg0xec:%x:%x\n",
+                rtl_read_dword(rtlpriv, 0xEC), bytetmp);
 
        while ((bytetmp & BIT(0)) && retry < 1000) {
                retry++;
                udelay(50);
                bytetmp = rtl_read_byte(rtlpriv, REG_APS_FSMCO + 1);
-               RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, ("reg0xec:%x:%x\n",
-                                                       rtl_read_dword(rtlpriv,
-                                                                      0xEC),
-                                                       bytetmp));
+               RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "reg0xec:%x:%x\n",
+                        rtl_read_dword(rtlpriv, 0xEC), bytetmp);
                udelay(50);
        }
 
@@ -696,7 +693,7 @@ static bool _rtl92ce_init_mac(struct ieee80211_hw *hw)
 
        rtl_write_word(rtlpriv, REG_CR, 0x2ff);
 
-       if (_rtl92ce_llt_table_init(hw) == false)
+       if (!_rtl92ce_llt_table_init(hw))
                return false;
 
        rtl_write_dword(rtlpriv, REG_HISR, 0xffffffff);
@@ -864,13 +861,13 @@ void rtl92ce_enable_hw_security_config(struct ieee80211_hw *hw)
        u8 sec_reg_value;
 
        RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
-                ("PairwiseEncAlgorithm = %d GroupEncAlgorithm = %d\n",
-                 rtlpriv->sec.pairwise_enc_algorithm,
-                 rtlpriv->sec.group_enc_algorithm));
+                "PairwiseEncAlgorithm = %d GroupEncAlgorithm = %d\n",
+                rtlpriv->sec.pairwise_enc_algorithm,
+                rtlpriv->sec.group_enc_algorithm);
 
        if (rtlpriv->cfg->mod_params->sw_crypto || rtlpriv->sec.use_sw_sec) {
-               RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG, ("not open "
-                                                       "hw encryption\n"));
+               RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG,
+                        "not open hw encryption\n");
                return;
        }
 
@@ -886,7 +883,7 @@ void rtl92ce_enable_hw_security_config(struct ieee80211_hw *hw)
        rtl_write_byte(rtlpriv, REG_CR + 1, 0x02);
 
        RT_TRACE(rtlpriv, COMP_SEC, DBG_LOUD,
-                ("The SECR-value %x\n", sec_reg_value));
+                "The SECR-value %x\n", sec_reg_value);
 
        rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_WPA_CONFIG, &sec_reg_value);
 
@@ -909,8 +906,8 @@ int rtl92ce_hw_init(struct ieee80211_hw *hw)
        rtlpci->being_init_adapter = true;
        rtlpriv->intf_ops->disable_aspm(hw);
        rtstatus = _rtl92ce_init_mac(hw);
-       if (rtstatus != true) {
-               RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, ("Init MAC failed\n"));
+       if (!rtstatus) {
+               RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "Init MAC failed\n");
                err = 1;
                return err;
        }
@@ -918,13 +915,9 @@ int rtl92ce_hw_init(struct ieee80211_hw *hw)
        err = rtl92c_download_fw(hw);
        if (err) {
                RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
-                        ("Failed to download FW. Init HW "
-                         "without FW now..\n"));
+                        "Failed to download FW. Init HW without FW now..\n");
                err = 1;
-               rtlhal->fw_ready = false;
                return err;
-       } else {
-               rtlhal->fw_ready = true;
        }
 
        rtlhal->last_hmeboxnum = 0;
@@ -968,12 +961,12 @@ int rtl92ce_hw_init(struct ieee80211_hw *hw)
        tmp_u1b = efuse_read_1byte(hw, 0x1FA);
        if (!(tmp_u1b & BIT(0))) {
                rtl_set_rfreg(hw, RF90_PATH_A, 0x15, 0x0F, 0x05);
-               RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, ("PA BIAS path A\n"));
+               RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, "PA BIAS path A\n");
        }
 
        if (!(tmp_u1b & BIT(1)) && is92c) {
                rtl_set_rfreg(hw, RF90_PATH_B, 0x15, 0x0F, 0x05);
-               RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, ("PA BIAS path B\n"));
+               RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, "PA BIAS path B\n");
        }
 
        if (!(tmp_u1b & BIT(4))) {
@@ -982,7 +975,7 @@ int rtl92ce_hw_init(struct ieee80211_hw *hw)
                rtl_write_byte(rtlpriv, 0x16, tmp_u1b | 0x80);
                udelay(10);
                rtl_write_byte(rtlpriv, 0x16, tmp_u1b | 0x90);
-               RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, ("under 1.5V\n"));
+               RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, "under 1.5V\n");
        }
        rtl92c_dm_init(hw);
        rtlpci->being_init_adapter = false;
@@ -995,6 +988,7 @@ static enum version_8192c _rtl92ce_read_chip_version(struct ieee80211_hw *hw)
        struct rtl_phy *rtlphy = &(rtlpriv->phy);
        enum version_8192c version = VERSION_UNKNOWN;
        u32 value32;
+       const char *versionid;
 
        value32 = rtl_read_dword(rtlpriv, REG_SYS_CFG);
        if (value32 & TRP_VAUX_EN) {
@@ -1007,27 +1001,25 @@ static enum version_8192c _rtl92ce_read_chip_version(struct ieee80211_hw *hw)
 
        switch (version) {
        case VERSION_B_CHIP_92C:
-               RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
-                        ("Chip Version ID: VERSION_B_CHIP_92C.\n"));
+               versionid = "B_CHIP_92C";
                break;
        case VERSION_B_CHIP_88C:
-               RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
-                        ("Chip Version ID: VERSION_B_CHIP_88C.\n"));
+               versionid = "B_CHIP_88C";
                break;
        case VERSION_A_CHIP_92C:
-               RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
-                        ("Chip Version ID: VERSION_A_CHIP_92C.\n"));
+               versionid = "A_CHIP_92C";
                break;
        case VERSION_A_CHIP_88C:
-               RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
-                        ("Chip Version ID: VERSION_A_CHIP_88C.\n"));
+               versionid = "A_CHIP_88C";
                break;
        default:
-               RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                        ("Chip Version ID: Unknown. Bug?\n"));
+               versionid = "Unknown. Bug?";
                break;
        }
 
+       RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
+                "Chip Version ID: %s\n", versionid);
+
        switch (version & 0x3) {
        case CHIP_88C:
                rtlphy->rf_type = RF_1T1R;
@@ -1041,13 +1033,12 @@ static enum version_8192c _rtl92ce_read_chip_version(struct ieee80211_hw *hw)
        default:
                rtlphy->rf_type = RF_1T1R;
                RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                        ("ERROR RF_Type is set!!"));
+                        "ERROR RF_Type is set!!\n");
                break;
        }
 
-       RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
-                ("Chip RF Type: %s\n", (rtlphy->rf_type == RF_2T2R) ?
-                 "RF_2T2R" : "RF_1T1R"));
+       RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "Chip RF Type: %s\n",
+                rtlphy->rf_type == RF_2T2R ? "RF_2T2R" : "RF_1T1R");
 
        return version;
 }
@@ -1069,8 +1060,8 @@ static int _rtl92ce_set_media_status(struct ieee80211_hw *hw,
                _rtl92ce_disable_bcn_sub_func(hw);
        } else {
                RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
-                        ("Set HW_VAR_MEDIA_STATUS: "
-                         "No such media status(%x).\n", type));
+                        "Set HW_VAR_MEDIA_STATUS: No such media status(%x)\n",
+                        type);
        }
 
        switch (type) {
@@ -1078,27 +1069,27 @@ static int _rtl92ce_set_media_status(struct ieee80211_hw *hw,
                bt_msr |= MSR_NOLINK;
                ledaction = LED_CTL_LINK;
                RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
-                        ("Set Network type to NO LINK!\n"));
+                        "Set Network type to NO LINK!\n");
                break;
        case NL80211_IFTYPE_ADHOC:
                bt_msr |= MSR_ADHOC;
                RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
-                        ("Set Network type to Ad Hoc!\n"));
+                        "Set Network type to Ad Hoc!\n");
                break;
        case NL80211_IFTYPE_STATION:
                bt_msr |= MSR_INFRA;
                ledaction = LED_CTL_LINK;
                RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
-                        ("Set Network type to STA!\n"));
+                        "Set Network type to STA!\n");
                break;
        case NL80211_IFTYPE_AP:
                bt_msr |= MSR_AP;
                RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
-                        ("Set Network type to AP!\n"));
+                        "Set Network type to AP!\n");
                break;
        default:
                RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                        ("Network type %d not support!\n", type));
+                        "Network type %d not supported!\n", type);
                return 1;
                break;
 
@@ -1126,7 +1117,7 @@ void rtl92ce_set_check_bssid(struct ieee80211_hw *hw, bool check_bssid)
                rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_RCR,
                                              (u8 *) (&reg_rcr));
                _rtl92ce_set_bcn_ctrl_reg(hw, 0, BIT(4));
-       } else if (check_bssid == false) {
+       } else if (!check_bssid) {
                reg_rcr &= (~(RCR_CBSSID_DATA | RCR_CBSSID_BCN));
                _rtl92ce_set_bcn_ctrl_reg(hw, BIT(4), 0);
                rtlpriv->cfg->ops->set_hw_reg(hw,
@@ -1171,7 +1162,7 @@ void rtl92ce_set_qos(struct ieee80211_hw *hw, int aci)
                rtl_write_dword(rtlpriv, REG_EDCA_VO_PARAM, 0x2f3222);
                break;
        default:
-               RT_ASSERT(false, ("invalid aci: %d !\n", aci));
+               RT_ASSERT(false, "invalid aci: %d !\n", aci);
                break;
        }
 }
@@ -1199,7 +1190,6 @@ static void _rtl92ce_poweroff_adapter(struct ieee80211_hw *hw)
 {
        struct rtl_priv *rtlpriv = rtl_priv(hw);
        struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
-       struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
        u8 u1b_tmp;
        u32 u4b_tmp;
 
@@ -1210,7 +1200,7 @@ static void _rtl92ce_poweroff_adapter(struct ieee80211_hw *hw)
        rtl_write_byte(rtlpriv, REG_APSD_CTRL, 0x40);
        rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE2);
        rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE0);
-       if ((rtl_read_byte(rtlpriv, REG_MCUFWDL) & BIT(7)) && rtlhal->fw_ready)
+       if (rtl_read_byte(rtlpriv, REG_MCUFWDL) & BIT(7))
                rtl92c_firmware_selfreset(hw);
        rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN + 1, 0x51);
        rtl_write_byte(rtlpriv, REG_MCUFWDL, 0x00);
@@ -1300,7 +1290,7 @@ void rtl92ce_set_beacon_interval(struct ieee80211_hw *hw)
        u16 bcn_interval = mac->beacon_interval;
 
        RT_TRACE(rtlpriv, COMP_BEACON, DBG_DMESG,
-                ("beacon_interval:%d\n", bcn_interval));
+                "beacon_interval:%d\n", bcn_interval);
        rtl92ce_disable_interrupt(hw);
        rtl_write_word(rtlpriv, REG_BCN_INTERVAL, bcn_interval);
        rtl92ce_enable_interrupt(hw);
@@ -1312,8 +1302,8 @@ void rtl92ce_update_interrupt_mask(struct ieee80211_hw *hw,
        struct rtl_priv *rtlpriv = rtl_priv(hw);
        struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
 
-       RT_TRACE(rtlpriv, COMP_INTR, DBG_LOUD,
-                ("add_msr:%x, rm_msr:%x\n", add_msr, rm_msr));
+       RT_TRACE(rtlpriv, COMP_INTR, DBG_LOUD, "add_msr:%x, rm_msr:%x\n",
+                add_msr, rm_msr);
 
        if (add_msr)
                rtlpci->irq_mask[0] |= add_msr;
@@ -1367,25 +1357,24 @@ static void _rtl92ce_read_txpower_info_from_hwpg(struct ieee80211_hw *hw,
        for (rf_path = 0; rf_path < 2; rf_path++)
                for (i = 0; i < 3; i++)
                        RTPRINT(rtlpriv, FINIT, INIT_EEPROM,
-                               ("RF(%d) EEPROM CCK Area(%d) = 0x%x\n", rf_path,
-                                i,
-                                rtlefuse->
-                                eeprom_chnlarea_txpwr_cck[rf_path][i]));
+                               "RF(%d) EEPROM CCK Area(%d) = 0x%x\n",
+                               rf_path, i,
+                               rtlefuse->
+                               eeprom_chnlarea_txpwr_cck[rf_path][i]);
        for (rf_path = 0; rf_path < 2; rf_path++)
                for (i = 0; i < 3; i++)
                        RTPRINT(rtlpriv, FINIT, INIT_EEPROM,
-                               ("RF(%d) EEPROM HT40 1S Area(%d) = 0x%x\n",
-                                rf_path, i,
-                                rtlefuse->
-                                eeprom_chnlarea_txpwr_ht40_1s[rf_path][i]));
+                               "RF(%d) EEPROM HT40 1S Area(%d) = 0x%x\n",
+                               rf_path, i,
+                               rtlefuse->
+                               eeprom_chnlarea_txpwr_ht40_1s[rf_path][i]);
        for (rf_path = 0; rf_path < 2; rf_path++)
                for (i = 0; i < 3; i++)
                        RTPRINT(rtlpriv, FINIT, INIT_EEPROM,
-                               ("RF(%d) EEPROM HT40 2S Diff Area(%d) = 0x%x\n",
-                                rf_path, i,
-                                rtlefuse->
-                                eeprom_chnlarea_txpwr_ht40_2sdiif[rf_path]
-                                [i]));
+                               "RF(%d) EEPROM HT40 2S Diff Area(%d) = 0x%x\n",
+                               rf_path, i,
+                               rtlefuse->
+                               eeprom_chnlarea_txpwr_ht40_2sdiif[rf_path][i]);
 
        for (rf_path = 0; rf_path < 2; rf_path++) {
                for (i = 0; i < 14; i++) {
@@ -1416,11 +1405,11 @@ static void _rtl92ce_read_txpower_info_from_hwpg(struct ieee80211_hw *hw,
 
                for (i = 0; i < 14; i++) {
                        RTPRINT(rtlpriv, FINIT, INIT_TxPower,
-                               ("RF(%d)-Ch(%d) [CCK / HT40_1S / HT40_2S] = "
-                                "[0x%x / 0x%x / 0x%x]\n", rf_path, i,
-                                rtlefuse->txpwrlevel_cck[rf_path][i],
-                                rtlefuse->txpwrlevel_ht40_1s[rf_path][i],
-                                rtlefuse->txpwrlevel_ht40_2s[rf_path][i]));
+                               "RF(%d)-Ch(%d) [CCK / HT40_1S / HT40_2S] = [0x%x / 0x%x / 0x%x]\n",
+                               rf_path, i,
+                               rtlefuse->txpwrlevel_cck[rf_path][i],
+                               rtlefuse->txpwrlevel_ht40_1s[rf_path][i],
+                               rtlefuse->txpwrlevel_ht40_2s[rf_path][i]);
                }
        }
 
@@ -1457,13 +1446,13 @@ static void _rtl92ce_read_txpower_info_from_hwpg(struct ieee80211_hw *hw,
                        }
 
                        RTPRINT(rtlpriv, FINIT, INIT_TxPower,
-                               ("RF-%d pwrgroup_ht20[%d] = 0x%x\n",
-                                rf_path, i,
-                                rtlefuse->pwrgroup_ht20[rf_path][i]));
+                               "RF-%d pwrgroup_ht20[%d] = 0x%x\n",
+                               rf_path, i,
+                               rtlefuse->pwrgroup_ht20[rf_path][i]);
                        RTPRINT(rtlpriv, FINIT, INIT_TxPower,
-                               ("RF-%d pwrgroup_ht40[%d] = 0x%x\n",
-                                rf_path, i,
-                                rtlefuse->pwrgroup_ht40[rf_path][i]));
+                               "RF-%d pwrgroup_ht40[%d] = 0x%x\n",
+                               rf_path, i,
+                               rtlefuse->pwrgroup_ht40[rf_path][i]);
                }
        }
 
@@ -1502,27 +1491,27 @@ static void _rtl92ce_read_txpower_info_from_hwpg(struct ieee80211_hw *hw,
 
        for (i = 0; i < 14; i++)
                RTPRINT(rtlpriv, FINIT, INIT_TxPower,
-                       ("RF-A Ht20 to HT40 Diff[%d] = 0x%x\n", i,
-                        rtlefuse->txpwr_ht20diff[RF90_PATH_A][i]));
+                       "RF-A Ht20 to HT40 Diff[%d] = 0x%x\n",
+                       i, rtlefuse->txpwr_ht20diff[RF90_PATH_A][i]);
        for (i = 0; i < 14; i++)
                RTPRINT(rtlpriv, FINIT, INIT_TxPower,
-                       ("RF-A Legacy to Ht40 Diff[%d] = 0x%x\n", i,
-                        rtlefuse->txpwr_legacyhtdiff[RF90_PATH_A][i]));
+                       "RF-A Legacy to Ht40 Diff[%d] = 0x%x\n",
+                       i, rtlefuse->txpwr_legacyhtdiff[RF90_PATH_A][i]);
        for (i = 0; i < 14; i++)
                RTPRINT(rtlpriv, FINIT, INIT_TxPower,
-                       ("RF-B Ht20 to HT40 Diff[%d] = 0x%x\n", i,
-                        rtlefuse->txpwr_ht20diff[RF90_PATH_B][i]));
+                       "RF-B Ht20 to HT40 Diff[%d] = 0x%x\n",
+                       i, rtlefuse->txpwr_ht20diff[RF90_PATH_B][i]);
        for (i = 0; i < 14; i++)
                RTPRINT(rtlpriv, FINIT, INIT_TxPower,
-                       ("RF-B Legacy to HT40 Diff[%d] = 0x%x\n", i,
-                        rtlefuse->txpwr_legacyhtdiff[RF90_PATH_B][i]));
+                       "RF-B Legacy to HT40 Diff[%d] = 0x%x\n",
+                       i, rtlefuse->txpwr_legacyhtdiff[RF90_PATH_B][i]);
 
        if (!autoload_fail)
                rtlefuse->eeprom_regulatory = (hwinfo[RF_OPTION1] & 0x7);
        else
                rtlefuse->eeprom_regulatory = 0;
        RTPRINT(rtlpriv, FINIT, INIT_TxPower,
-               ("eeprom_regulatory = 0x%x\n", rtlefuse->eeprom_regulatory));
+               "eeprom_regulatory = 0x%x\n", rtlefuse->eeprom_regulatory);
 
        if (!autoload_fail) {
                rtlefuse->eeprom_tssi[RF90_PATH_A] = hwinfo[EEPROM_TSSI_A];
@@ -1531,10 +1520,9 @@ static void _rtl92ce_read_txpower_info_from_hwpg(struct ieee80211_hw *hw,
                rtlefuse->eeprom_tssi[RF90_PATH_A] = EEPROM_DEFAULT_TSSI;
                rtlefuse->eeprom_tssi[RF90_PATH_B] = EEPROM_DEFAULT_TSSI;
        }
-       RTPRINT(rtlpriv, FINIT, INIT_TxPower,
-               ("TSSI_A = 0x%x, TSSI_B = 0x%x\n",
-                rtlefuse->eeprom_tssi[RF90_PATH_A],
-                rtlefuse->eeprom_tssi[RF90_PATH_B]));
+       RTPRINT(rtlpriv, FINIT, INIT_TxPower, "TSSI_A = 0x%x, TSSI_B = 0x%x\n",
+               rtlefuse->eeprom_tssi[RF90_PATH_A],
+               rtlefuse->eeprom_tssi[RF90_PATH_B]);
 
        if (!autoload_fail)
                tempval = hwinfo[EEPROM_THERMAL_METER];
@@ -1547,7 +1535,7 @@ static void _rtl92ce_read_txpower_info_from_hwpg(struct ieee80211_hw *hw,
 
        rtlefuse->thermalmeter[0] = rtlefuse->eeprom_thermalmeter;
        RTPRINT(rtlpriv, FINIT, INIT_TxPower,
-               ("thermalmeter = 0x%x\n", rtlefuse->eeprom_thermalmeter));
+               "thermalmeter = 0x%x\n", rtlefuse->eeprom_thermalmeter);
 }
 
 static void _rtl92ce_read_adapter_info(struct ieee80211_hw *hw)
@@ -1567,19 +1555,19 @@ static void _rtl92ce_read_adapter_info(struct ieee80211_hw *hw)
                       HWSET_MAX_SIZE);
        } else if (rtlefuse->epromtype == EEPROM_93C46) {
                RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                        ("RTL819X Not boot from eeprom, check it !!"));
+                        "RTL819X Not boot from eeprom, check it !!");
        }
 
-       RT_PRINT_DATA(rtlpriv, COMP_INIT, DBG_DMESG, ("MAP\n"),
+       RT_PRINT_DATA(rtlpriv, COMP_INIT, DBG_DMESG, "MAP",
                      hwinfo, HWSET_MAX_SIZE);
 
        eeprom_id = *((u16 *)&hwinfo[0]);
        if (eeprom_id != RTL8190_EEPROM_ID) {
                RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
-                        ("EEPROM ID(%#x) is invalid!!\n", eeprom_id));
+                        "EEPROM ID(%#x) is invalid!!\n", eeprom_id);
                rtlefuse->autoload_failflag = true;
        } else {
-               RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, ("Autoload OK\n"));
+               RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "Autoload OK\n");
                rtlefuse->autoload_failflag = false;
        }
 
@@ -1591,8 +1579,7 @@ static void _rtl92ce_read_adapter_info(struct ieee80211_hw *hw)
                *((u16 *) (&rtlefuse->dev_addr[i])) = usvalue;
        }
 
-       RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
-                ("%pM\n", rtlefuse->dev_addr));
+       RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "%pM\n", rtlefuse->dev_addr);
 
        _rtl92ce_read_txpower_info_from_hwpg(hw,
                                             rtlefuse->autoload_failflag,
@@ -1608,7 +1595,7 @@ static void _rtl92ce_read_adapter_info(struct ieee80211_hw *hw)
        rtlefuse->eeprom_oemid = *(u8 *)&hwinfo[EEPROM_CUSTOMER_ID];
 
        RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
-                ("EEPROM Customer ID: 0x%2x\n", rtlefuse->eeprom_oemid));
+                "EEPROM Customer ID: 0x%2x\n", rtlefuse->eeprom_oemid);
 
        /* set channel paln to world wide 13 */
        rtlefuse->channel_plan = COUNTRY_CODE_WORLD_WIDE_13;
@@ -1662,7 +1649,7 @@ static void _rtl92ce_hal_customized_behavior(struct ieee80211_hw *hw)
                break;
        }
        RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
-                ("RT Customized ID: 0x%02X\n", rtlhal->oem_id));
+                "RT Customized ID: 0x%02X\n", rtlhal->oem_id);
 }
 
 void rtl92ce_read_eeprom_info(struct ieee80211_hw *hw)
@@ -1679,22 +1666,22 @@ void rtl92ce_read_eeprom_info(struct ieee80211_hw *hw)
        else
                rtlpriv->dm.rfpath_rxenable[0] =
                    rtlpriv->dm.rfpath_rxenable[1] = true;
-       RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, ("VersionID = 0x%4x\n",
-                                               rtlhal->version));
+       RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "VersionID = 0x%4x\n",
+                rtlhal->version);
        tmp_u1b = rtl_read_byte(rtlpriv, REG_9346CR);
        if (tmp_u1b & BIT(4)) {
-               RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, ("Boot from EEPROM\n"));
+               RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "Boot from EEPROM\n");
                rtlefuse->epromtype = EEPROM_93C46;
        } else {
-               RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, ("Boot from EFUSE\n"));
+               RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "Boot from EFUSE\n");
                rtlefuse->epromtype = EEPROM_BOOT_EFUSE;
        }
        if (tmp_u1b & BIT(5)) {
-               RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, ("Autoload OK\n"));
+               RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "Autoload OK\n");
                rtlefuse->autoload_failflag = false;
                _rtl92ce_read_adapter_info(hw);
        } else {
-               RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, ("Autoload ERR!!\n"));
+               RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "Autoload ERR!!\n");
        }
        _rtl92ce_hal_customized_behavior(hw);
 }
@@ -1790,8 +1777,8 @@ static void rtl92ce_update_hal_rate_table(struct ieee80211_hw *hw,
 
        rtl_write_dword(rtlpriv, REG_ARFR0 + ratr_index * 4, ratr_value);
 
-       RT_TRACE(rtlpriv, COMP_RATR, DBG_DMESG,
-                ("%x\n", rtl_read_dword(rtlpriv, REG_ARFR0)));
+       RT_TRACE(rtlpriv, COMP_RATR, DBG_DMESG, "%x\n",
+                rtl_read_dword(rtlpriv, REG_ARFR0));
 }
 
 static void rtl92ce_update_hal_rate_mask(struct ieee80211_hw *hw,
@@ -1919,16 +1906,15 @@ static void rtl92ce_update_hal_rate_mask(struct ieee80211_hw *hw,
                break;
        }
        RT_TRACE(rtlpriv, COMP_RATR, DBG_DMESG,
-                ("ratr_bitmap :%x\n", ratr_bitmap));
+                "ratr_bitmap :%x\n", ratr_bitmap);
        *(u32 *)&rate_mask = EF4BYTE((ratr_bitmap & 0x0fffffff) |
                                     (ratr_index << 28));
        rate_mask[4] = macid | (shortgi ? 0x20 : 0x00) | 0x80;
-       RT_TRACE(rtlpriv, COMP_RATR, DBG_DMESG, ("Rate_index:%x, "
-                                                "ratr_val:%x, %x:%x:%x:%x:%x\n",
-                                                ratr_index, ratr_bitmap,
-                                                rate_mask[0], rate_mask[1],
-                                                rate_mask[2], rate_mask[3],
-                                                rate_mask[4]));
+       RT_TRACE(rtlpriv, COMP_RATR, DBG_DMESG,
+                "Rate_index:%x, ratr_val:%x, %x:%x:%x:%x:%x\n",
+                ratr_index, ratr_bitmap,
+                rate_mask[0], rate_mask[1], rate_mask[2], rate_mask[3],
+                rate_mask[4]);
        rtl92c_fill_h2c_cmd(hw, H2C_RA_MASK, 5, rate_mask);
 
        if (macid != 0)
@@ -1994,15 +1980,14 @@ bool rtl92ce_gpio_radio_on_off_checking(struct ieee80211_hw *hw, u8 *valid)
 
        if ((ppsc->hwradiooff) && (e_rfpowerstate_toset == ERFON)) {
                RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG,
-                        ("GPIOChangeRF  - HW Radio ON, RF ON\n"));
+                        "GPIOChangeRF  - HW Radio ON, RF ON\n");
 
                e_rfpowerstate_toset = ERFON;
                ppsc->hwradiooff = false;
                actuallyset = true;
-       } else if ((ppsc->hwradiooff == false)
-                  && (e_rfpowerstate_toset == ERFOFF)) {
+       } else if (!ppsc->hwradiooff && (e_rfpowerstate_toset == ERFOFF)) {
                RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG,
-                        ("GPIOChangeRF  - HW Radio OFF, RF OFF\n"));
+                        "GPIOChangeRF  - HW Radio OFF, RF OFF\n");
 
                e_rfpowerstate_toset = ERFOFF;
                ppsc->hwradiooff = true;
@@ -2053,7 +2038,7 @@ void rtl92ce_set_key(struct ieee80211_hw *hw, u32 key_index,
                u8 cam_offset = 0;
                u8 clear_number = 5;
 
-               RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG, ("clear_all\n"));
+               RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG, "clear_all\n");
 
                for (idx = 0; idx < clear_number; idx++) {
                        rtl_cam_mark_invalid(hw, cam_offset + idx);
@@ -2081,8 +2066,8 @@ void rtl92ce_set_key(struct ieee80211_hw *hw, u32 key_index,
                        enc_algo = CAM_AES;
                        break;
                default:
-                       RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, ("switch case "
-                                       "not process\n"));
+                       RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
+                                "switch case not processed\n");
                        enc_algo = CAM_TKIP;
                        break;
                }
@@ -2100,9 +2085,8 @@ void rtl92ce_set_key(struct ieee80211_hw *hw, u32 key_index,
                                                                 p_macaddr);
                                        if (entry_id >=  TOTAL_CAM_ENTRY) {
                                                RT_TRACE(rtlpriv, COMP_SEC,
-                                                    DBG_EMERG,
-                                                    ("Can not find free hw"
-                                                    " security cam entry\n"));
+                                                        DBG_EMERG,
+                                                        "Can not find free hw security cam entry\n");
                                                return;
                                        }
                                } else {
@@ -2116,31 +2100,31 @@ void rtl92ce_set_key(struct ieee80211_hw *hw, u32 key_index,
 
                if (rtlpriv->sec.key_len[key_index] == 0) {
                        RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG,
-                                ("delete one entry, entry_id is %d\n",
-                                entry_id));
+                                "delete one entry, entry_id is %d\n",
+                                entry_id);
                        if (mac->opmode == NL80211_IFTYPE_AP)
                                rtl_cam_del_entry(hw, p_macaddr);
                        rtl_cam_delete_one_entry(hw, p_macaddr, entry_id);
                } else {
                        RT_TRACE(rtlpriv, COMP_SEC, DBG_LOUD,
-                                ("The insert KEY length is %d\n",
-                                 rtlpriv->sec.key_len[PAIRWISE_KEYIDX]));
+                                "The insert KEY length is %d\n",
+                                rtlpriv->sec.key_len[PAIRWISE_KEYIDX]);
                        RT_TRACE(rtlpriv, COMP_SEC, DBG_LOUD,
-                                ("The insert KEY  is %x %x\n",
-                                 rtlpriv->sec.key_buf[0][0],
-                                 rtlpriv->sec.key_buf[0][1]));
+                                "The insert KEY is %x %x\n",
+                                rtlpriv->sec.key_buf[0][0],
+                                rtlpriv->sec.key_buf[0][1]);
 
                        RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG,
-                                ("add one entry\n"));
+                                "add one entry\n");
                        if (is_pairwise) {
                                RT_PRINT_DATA(rtlpriv, COMP_SEC, DBG_LOUD,
-                                             "Pairwiase Key content :",
+                                             "Pairwise Key content",
                                              rtlpriv->sec.pairwise_key,
                                              rtlpriv->sec.
                                              key_len[PAIRWISE_KEYIDX]);
 
                                RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG,
-                                        ("set Pairwiase key\n"));
+                                        "set Pairwise key\n");
 
                                rtl_cam_add_one_entry(hw, macaddr, key_index,
                                                      entry_id, enc_algo,
@@ -2149,7 +2133,7 @@ void rtl92ce_set_key(struct ieee80211_hw *hw, u32 key_index,
                                                      key_buf[key_index]);
                        } else {
                                RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG,
-                                        ("set group key\n"));
+                                        "set group key\n");
 
                                if (mac->opmode == NL80211_IFTYPE_ADHOC) {
                                        rtl_cam_add_one_entry(hw,
index 07dbe3e..52a3aea 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2009-2010  Realtek Corporation.
+ * Copyright(c) 2009-2012  Realtek Corporation.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
index 28a1a70..8283e9b 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2009-2010  Realtek Corporation.
+ * Copyright(c) 2009-2012  Realtek Corporation.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
@@ -45,8 +45,8 @@ void rtl92ce_sw_led_on(struct ieee80211_hw *hw, struct rtl_led *pled)
        u8 ledcfg;
        struct rtl_priv *rtlpriv = rtl_priv(hw);
 
-       RT_TRACE(rtlpriv, COMP_LED, DBG_LOUD,
-                ("LedAddr:%X ledpin=%d\n", REG_LEDCFG2, pled->ledpin));
+       RT_TRACE(rtlpriv, COMP_LED, DBG_LOUD, "LedAddr:%X ledpin=%d\n",
+                REG_LEDCFG2, pled->ledpin);
 
        ledcfg = rtl_read_byte(rtlpriv, REG_LEDCFG2);
 
@@ -62,7 +62,7 @@ void rtl92ce_sw_led_on(struct ieee80211_hw *hw, struct rtl_led *pled)
                break;
        default:
                RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                        ("switch case not process\n"));
+                        "switch case not processed\n");
                break;
        }
        pled->ledon = true;
@@ -74,8 +74,8 @@ void rtl92ce_sw_led_off(struct ieee80211_hw *hw, struct rtl_led *pled)
        struct rtl_pci_priv *pcipriv = rtl_pcipriv(hw);
        u8 ledcfg;
 
-       RT_TRACE(rtlpriv, COMP_LED, DBG_LOUD,
-                ("LedAddr:%X ledpin=%d\n", REG_LEDCFG2, pled->ledpin));
+       RT_TRACE(rtlpriv, COMP_LED, DBG_LOUD, "LedAddr:%X ledpin=%d\n",
+                REG_LEDCFG2, pled->ledpin);
 
        ledcfg = rtl_read_byte(rtlpriv, REG_LEDCFG2);
 
@@ -97,7 +97,7 @@ void rtl92ce_sw_led_off(struct ieee80211_hw *hw, struct rtl_led *pled)
                break;
        default:
                RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                        ("switch case not process\n"));
+                        "switch case not processed\n");
                break;
        }
        pled->ledon = false;
@@ -145,7 +145,7 @@ void rtl92ce_led_control(struct ieee80211_hw *hw,
             ledaction == LED_CTL_POWER_ON)) {
                return;
        }
-       RT_TRACE(rtlpriv, COMP_LED, DBG_LOUD, ("ledaction %d.\n",
-                               ledaction));
+       RT_TRACE(rtlpriv, COMP_LED, DBG_LOUD, "ledaction %d\n",
+                ledaction);
        _rtl92ce_sw_led_control(hw, ledaction);
 }
index 7dfccea..c576106 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2009-2010  Realtek Corporation.
+ * Copyright(c) 2009-2012  Realtek Corporation.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
index 3b585aa..88deae6 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2009-2010  Realtek Corporation.
+ * Copyright(c) 2009-2012  Realtek Corporation.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
@@ -47,9 +47,9 @@ u32 rtl92c_phy_query_rf_reg(struct ieee80211_hw *hw,
        u32 original_value, readback_value, bitshift;
        struct rtl_phy *rtlphy = &(rtlpriv->phy);
 
-       RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, ("regaddr(%#x), "
-                                              "rfpath(%#x), bitmask(%#x)\n",
-                                              regaddr, rfpath, bitmask));
+       RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
+                "regaddr(%#x), rfpath(%#x), bitmask(%#x)\n",
+                regaddr, rfpath, bitmask);
 
        spin_lock(&rtlpriv->locks.rf_lock);
 
@@ -67,9 +67,8 @@ u32 rtl92c_phy_query_rf_reg(struct ieee80211_hw *hw,
        spin_unlock(&rtlpriv->locks.rf_lock);
 
        RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
-                ("regaddr(%#x), rfpath(%#x), "
-                 "bitmask(%#x), original_value(%#x)\n",
-                 regaddr, rfpath, bitmask, original_value));
+                "regaddr(%#x), rfpath(%#x), bitmask(%#x), original_value(%#x)\n",
+                regaddr, rfpath, bitmask, original_value);
 
        return readback_value;
 }
@@ -121,8 +120,8 @@ void rtl92ce_phy_set_rf_reg(struct ieee80211_hw *hw,
        u32 original_value, bitshift;
 
        RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
-                ("regaddr(%#x), bitmask(%#x), data(%#x), rfpath(%#x)\n",
-                 regaddr, bitmask, data, rfpath));
+                "regaddr(%#x), bitmask(%#x), data(%#x), rfpath(%#x)\n",
+                regaddr, bitmask, data, rfpath);
 
        spin_lock(&rtlpriv->locks.rf_lock);
 
@@ -153,10 +152,9 @@ void rtl92ce_phy_set_rf_reg(struct ieee80211_hw *hw,
 
        spin_unlock(&rtlpriv->locks.rf_lock);
 
-       RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, ("regaddr(%#x), "
-                                              "bitmask(%#x), data(%#x), "
-                                              "rfpath(%#x)\n", regaddr,
-                                              bitmask, data, rfpath));
+       RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
+                "regaddr(%#x), bitmask(%#x), data(%#x), rfpath(%#x)\n",
+                regaddr, bitmask, data, rfpath);
 }
 
 static bool _rtl92c_phy_config_mac_with_headerfile(struct ieee80211_hw *hw)
@@ -166,11 +164,10 @@ static bool _rtl92c_phy_config_mac_with_headerfile(struct ieee80211_hw *hw)
        u32 arraylength;
        u32 *ptrarray;
 
-       RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, ("Read Rtl819XMACPHY_Array\n"));
+       RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, "Read Rtl819XMACPHY_Array\n");
        arraylength = MAC_2T_ARRAYLENGTH;
        ptrarray = RTL8192CEMAC_2T_ARRAY;
-       RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
-                ("Img:RTL8192CEMAC_2T_ARRAY\n"));
+       RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, "Img:RTL8192CEMAC_2T_ARRAY\n");
        for (i = 0; i < arraylength; i = i + 2)
                rtl_write_byte(rtlpriv, ptrarray[i], (u8) ptrarray[i + 1]);
        return true;
@@ -215,10 +212,9 @@ bool _rtl92ce_phy_config_bb_with_headerfile(struct ieee80211_hw *hw,
                                      phy_regarray_table[i + 1]);
                        udelay(1);
                        RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
-                                ("The phy_regarray_table[0] is %x"
-                                 " Rtl819XPHY_REGArray[1] is %x\n",
-                                 phy_regarray_table[i],
-                                 phy_regarray_table[i + 1]));
+                                "The phy_regarray_table[0] is %x Rtl819XPHY_REGArray[1] is %x\n",
+                                phy_regarray_table[i],
+                                phy_regarray_table[i + 1]);
                }
        } else if (configtype == BASEBAND_CONFIG_AGC_TAB) {
                for (i = 0; i < agctab_arraylen; i = i + 2) {
@@ -226,10 +222,9 @@ bool _rtl92ce_phy_config_bb_with_headerfile(struct ieee80211_hw *hw,
                                      agctab_array_table[i + 1]);
                        udelay(1);
                        RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
-                                ("The agctab_array_table[0] is "
-                                 "%x Rtl819XPHY_REGArray[1] is %x\n",
-                                 agctab_array_table[i],
-                                 agctab_array_table[i + 1]));
+                                "The agctab_array_table[0] is %x Rtl819XPHY_REGArray[1] is %x\n",
+                                agctab_array_table[i],
+                                agctab_array_table[i + 1]);
                }
        }
        return true;
@@ -269,7 +264,7 @@ bool _rtl92ce_phy_config_bb_with_pgheaderfile(struct ieee80211_hw *hw,
        } else {
 
                RT_TRACE(rtlpriv, COMP_SEND, DBG_TRACE,
-                        ("configtype != BaseBand_Config_PHY_REG\n"));
+                        "configtype != BaseBand_Config_PHY_REG\n");
        }
        return true;
 }
@@ -291,20 +286,20 @@ bool rtl92c_phy_config_rf_with_headerfile(struct ieee80211_hw *hw,
                radiob_arraylen = RADIOB_2TARRAYLENGTH;
                radiob_array_table = RTL8192CE_RADIOB_2TARRAY;
                RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
-                        ("Radio_A:RTL8192CERADIOA_2TARRAY\n"));
+                        "Radio_A:RTL8192CERADIOA_2TARRAY\n");
                RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
-                        ("Radio_B:RTL8192CE_RADIOB_2TARRAY\n"));
+                        "Radio_B:RTL8192CE_RADIOB_2TARRAY\n");
        } else {
                radioa_arraylen = RADIOA_1TARRAYLENGTH;
                radioa_array_table = RTL8192CE_RADIOA_1TARRAY;
                radiob_arraylen = RADIOB_1TARRAYLENGTH;
                radiob_array_table = RTL8192CE_RADIOB_1TARRAY;
                RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
-                        ("Radio_A:RTL8192CE_RADIOA_1TARRAY\n"));
+                        "Radio_A:RTL8192CE_RADIOA_1TARRAY\n");
                RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
-                        ("Radio_B:RTL8192CE_RADIOB_1TARRAY\n"));
+                        "Radio_B:RTL8192CE_RADIOB_1TARRAY\n");
        }
-       RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, ("Radio No %x\n", rfpath));
+       RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, "Radio No %x\n", rfpath);
        switch (rfpath) {
        case RF90_PATH_A:
                for (i = 0; i < radioa_arraylen; i = i + 2) {
@@ -352,11 +347,11 @@ bool rtl92c_phy_config_rf_with_headerfile(struct ieee80211_hw *hw,
                break;
        case RF90_PATH_C:
                RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                        ("switch case not process\n"));
+                        "switch case not processed\n");
                break;
        case RF90_PATH_D:
                RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                        ("switch case not process\n"));
+                        "switch case not processed\n");
                break;
        }
        return true;
@@ -371,10 +366,9 @@ void rtl92ce_phy_set_bw_mode_callback(struct ieee80211_hw *hw)
        u8 reg_bw_opmode;
        u8 reg_prsr_rsc;
 
-       RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE,
-                ("Switch to %s bandwidth\n",
-                 rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20 ?
-                 "20MHz" : "40MHz"))
+       RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE, "Switch to %s bandwidth\n",
+                rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20 ?
+                "20MHz" : "40MHz");
 
        if (is_hal_stop(rtlhal)) {
                rtlphy->set_bwmode_inprogress = false;
@@ -398,7 +392,7 @@ void rtl92ce_phy_set_bw_mode_callback(struct ieee80211_hw *hw)
                break;
        default:
                RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                        ("unknown bandwidth: %#X\n", rtlphy->current_chan_bw));
+                        "unknown bandwidth: %#X\n", rtlphy->current_chan_bw);
                break;
        }
 
@@ -423,12 +417,12 @@ void rtl92ce_phy_set_bw_mode_callback(struct ieee80211_hw *hw)
                break;
        default:
                RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                        ("unknown bandwidth: %#X\n", rtlphy->current_chan_bw));
+                        "unknown bandwidth: %#X\n", rtlphy->current_chan_bw);
                break;
        }
        rtl92ce_phy_rf6052_set_bandwidth(hw, rtlphy->current_chan_bw);
        rtlphy->set_bwmode_inprogress = false;
-       RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE, ("<==\n"));
+       RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE, "<==\n");
 }
 
 void _rtl92ce_phy_lc_calibrate(struct ieee80211_hw *hw, bool is2t)
@@ -499,7 +493,7 @@ static void _rtl92ce_phy_set_rf_sleep(struct ieee80211_hw *hw)
                rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE3);
                rtl_write_byte(rtlpriv, REG_TXPAUSE, 0x00);
                RT_TRACE(rtlpriv, COMP_POWER, DBG_TRACE,
-                        ("Switch RF timeout !!!.\n"));
+                        "Switch RF timeout !!!\n");
                return;
        }
        rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE2);
@@ -526,18 +520,17 @@ static bool _rtl92ce_phy_set_rf_power_state(struct ieee80211_hw *hw,
                                do {
                                        InitializeCount++;
                                        RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG,
-                                                ("IPS Set eRf nic enable\n"));
+                                                "IPS Set eRf nic enable\n");
                                        rtstatus = rtl_ps_enable_nic(hw);
-                               } while ((rtstatus != true)
-                                        && (InitializeCount < 10));
+                               } while (!rtstatus && (InitializeCount < 10));
                                RT_CLEAR_PS_LEVEL(ppsc,
                                                  RT_RF_OFF_LEVL_HALT_NIC);
                        } else {
                                RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG,
-                                        ("Set ERFON sleeped:%d ms\n",
-                                         jiffies_to_msecs(jiffies -
-                                                  ppsc->
-                                                  last_sleep_jiffies)));
+                                        "Set ERFON sleeped:%d ms\n",
+                                        jiffies_to_msecs(jiffies -
+                                                         ppsc->
+                                                         last_sleep_jiffies));
                                ppsc->last_awake_jiffies = jiffies;
                                rtl92ce_phy_set_rf_on(hw);
                        }
@@ -553,7 +546,7 @@ static bool _rtl92ce_phy_set_rf_power_state(struct ieee80211_hw *hw,
        case ERFOFF:{
                        if (ppsc->reg_rfps_level & RT_RF_OFF_LEVL_HALT_NIC) {
                                RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG,
-                                        ("IPS Set eRf nic disable\n"));
+                                        "IPS Set eRf nic disable\n");
                                rtl_ps_disable_nic(hw);
                                RT_SET_PS_LEVEL(ppsc, RT_RF_OFF_LEVL_HALT_NIC);
                        } else {
@@ -578,35 +571,33 @@ static bool _rtl92ce_phy_set_rf_power_state(struct ieee80211_hw *hw,
                                        continue;
                                } else {
                                        RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
-                                                ("eRf Off/Sleep: %d times "
-                                                 "TcbBusyQueue[%d] =%d before "
-                                                 "doze!\n", (i + 1), queue_id,
-                                                 skb_queue_len(&ring->queue)));
+                                                "eRf Off/Sleep: %d times TcbBusyQueue[%d] =%d before doze!\n",
+                                                i + 1, queue_id,
+                                                skb_queue_len(&ring->queue));
 
                                        udelay(10);
                                        i++;
                                }
                                if (i >= MAX_DOZE_WAITING_TIMES_9x) {
                                        RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
-                                                ("\n ERFSLEEP: %d times "
-                                                 "TcbBusyQueue[%d] = %d !\n",
-                                                 MAX_DOZE_WAITING_TIMES_9x,
-                                                 queue_id,
-                                                 skb_queue_len(&ring->queue)));
+                                                "ERFSLEEP: %d times TcbBusyQueue[%d] = %d !\n",
+                                                MAX_DOZE_WAITING_TIMES_9x,
+                                                queue_id,
+                                                skb_queue_len(&ring->queue));
                                        break;
                                }
                        }
                        RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG,
-                                ("Set ERFSLEEP awaked:%d ms\n",
-                                 jiffies_to_msecs(jiffies -
-                                                  ppsc->last_awake_jiffies)));
+                                "Set ERFSLEEP awaked:%d ms\n",
+                                jiffies_to_msecs(jiffies -
+                                                 ppsc->last_awake_jiffies));
                        ppsc->last_sleep_jiffies = jiffies;
                        _rtl92ce_phy_set_rf_sleep(hw);
                        break;
                }
        default:
                RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                        ("switch case not process\n"));
+                        "switch case not processed\n");
                bresult = false;
                break;
        }
index be2c92a..d5e3b70 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2009-2010  Realtek Corporation.
+ * Copyright(c) 2009-2012  Realtek Corporation.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
index ba5ff04..43806d9 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2009-2010  Realtek Corporation.
+ * Copyright(c) 2009-2012  Realtek Corporation.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
index d3b01e6..54c7614 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2009-2010  Realtek Corporation.
+ * Copyright(c) 2009-2012  Realtek Corporation.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
@@ -56,7 +56,7 @@ void rtl92ce_phy_rf6052_set_bandwidth(struct ieee80211_hw *hw, u8 bandwidth)
                break;
        default:
                RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                        ("unknown bandwidth: %#X\n", bandwidth));
+                        "unknown bandwidth: %#X\n", bandwidth);
                break;
        }
 }
@@ -123,8 +123,8 @@ void rtl92ce_phy_rf6052_set_cck_txpower(struct ieee80211_hw *hw,
        rtl_set_bbreg(hw, RTXAGC_A_CCK1_MCS32, MASKBYTE1, tmpval);
 
        RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
-               ("CCK PWR 1M (rf-A) = 0x%x (reg 0x%x)\n", tmpval,
-                RTXAGC_A_CCK1_MCS32));
+               "CCK PWR 1M (rf-A) = 0x%x (reg 0x%x)\n",
+               tmpval, RTXAGC_A_CCK1_MCS32);
 
        tmpval = tx_agc[RF90_PATH_A] >> 8;
 
@@ -133,22 +133,22 @@ void rtl92ce_phy_rf6052_set_cck_txpower(struct ieee80211_hw *hw,
        rtl_set_bbreg(hw, RTXAGC_B_CCK11_A_CCK2_11, 0xffffff00, tmpval);
 
        RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
-               ("CCK PWR 2~11M (rf-A) = 0x%x (reg 0x%x)\n", tmpval,
-                RTXAGC_B_CCK11_A_CCK2_11));
+               "CCK PWR 2~11M (rf-A) = 0x%x (reg 0x%x)\n",
+               tmpval, RTXAGC_B_CCK11_A_CCK2_11);
 
        tmpval = tx_agc[RF90_PATH_B] >> 24;
        rtl_set_bbreg(hw, RTXAGC_B_CCK11_A_CCK2_11, MASKBYTE0, tmpval);
 
        RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
-               ("CCK PWR 11M (rf-B) = 0x%x (reg 0x%x)\n", tmpval,
-                RTXAGC_B_CCK11_A_CCK2_11));
+               "CCK PWR 11M (rf-B) = 0x%x (reg 0x%x)\n",
+               tmpval, RTXAGC_B_CCK11_A_CCK2_11);
 
        tmpval = tx_agc[RF90_PATH_B] & 0x00ffffff;
        rtl_set_bbreg(hw, RTXAGC_B_CCK1_55_MCS32, 0xffffff00, tmpval);
 
        RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
-               ("CCK PWR 1~5.5M (rf-B) = 0x%x (reg 0x%x)\n", tmpval,
-                RTXAGC_B_CCK1_55_MCS32));
+               "CCK PWR 1~5.5M (rf-B) = 0x%x (reg 0x%x)\n",
+               tmpval, RTXAGC_B_CCK1_55_MCS32);
 }
 
 static void rtl92c_phy_get_power_base(struct ieee80211_hw *hw,
@@ -171,8 +171,8 @@ static void rtl92c_phy_get_power_base(struct ieee80211_hw *hw,
                    (powerBase0 << 8) | powerBase0;
                *(ofdmbase + i) = powerBase0;
                RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
-                       (" [OFDM power base index rf(%c) = 0x%x]\n",
-                        ((i == 0) ? 'A' : 'B'), *(ofdmbase + i)));
+                       " [OFDM power base index rf(%c) = 0x%x]\n",
+                       i == 0 ? 'A' : 'B', *(ofdmbase + i));
        }
 
        for (i = 0; i < 2; i++) {
@@ -187,8 +187,8 @@ static void rtl92c_phy_get_power_base(struct ieee80211_hw *hw,
                *(mcsbase + i) = powerBase1;
 
                RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
-                       (" [MCS power base index rf(%c) = 0x%x]\n",
-                        ((i == 0) ? 'A' : 'B'), *(mcsbase + i)));
+                       " [MCS power base index rf(%c) = 0x%x]\n",
+                       i == 0 ? 'A' : 'B', *(mcsbase + i));
        }
 }
 
@@ -215,9 +215,8 @@ static void _rtl92c_get_txpower_writeval_by_regulatory(struct ieee80211_hw *hw,
                            + ((index < 2) ? powerBase0[rf] : powerBase1[rf]);
 
                        RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
-                               ("RTK better performance, "
-                                "writeVal(%c) = 0x%x\n",
-                                ((rf == 0) ? 'A' : 'B'), writeVal));
+                               "RTK better performance, writeVal(%c) = 0x%x\n",
+                               rf == 0 ? 'A' : 'B', writeVal);
                        break;
                case 1:
                        if (rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20_40) {
@@ -225,9 +224,8 @@ static void _rtl92c_get_txpower_writeval_by_regulatory(struct ieee80211_hw *hw,
                                            powerBase1[rf]);
 
                                RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
-                                       ("Realtek regulatory, 40MHz, "
-                                        "writeVal(%c) = 0x%x\n",
-                                        ((rf == 0) ? 'A' : 'B'), writeVal));
+                                       "Realtek regulatory, 40MHz, writeVal(%c) = 0x%x\n",
+                                       rf == 0 ? 'A' : 'B', writeVal);
                        } else {
                                if (rtlphy->pwrgroup_cnt == 1)
                                        chnlgroup = 0;
@@ -249,9 +247,8 @@ static void _rtl92c_get_txpower_writeval_by_regulatory(struct ieee80211_hw *hw,
                                                              powerBase1[rf]);
 
                                RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
-                                       ("Realtek regulatory, 20MHz, "
-                                        "writeVal(%c) = 0x%x\n",
-                                        ((rf == 0) ? 'A' : 'B'), writeVal));
+                                       "Realtek regulatory, 20MHz, writeVal(%c) = 0x%x\n",
+                                       rf == 0 ? 'A' : 'B', writeVal);
                        }
                        break;
                case 2:
@@ -259,27 +256,24 @@ static void _rtl92c_get_txpower_writeval_by_regulatory(struct ieee80211_hw *hw,
                            ((index < 2) ? powerBase0[rf] : powerBase1[rf]);
 
                        RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
-                               ("Better regulatory, "
-                                "writeVal(%c) = 0x%x\n",
-                                ((rf == 0) ? 'A' : 'B'), writeVal));
+                               "Better regulatory, writeVal(%c) = 0x%x\n",
+                               rf == 0 ? 'A' : 'B', writeVal);
                        break;
                case 3:
                        chnlgroup = 0;
 
                        if (rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20_40) {
                                RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
-                                       ("customer's limit, 40MHz "
-                                        "rf(%c) = 0x%x\n",
-                                        ((rf == 0) ? 'A' : 'B'),
-                                        rtlefuse->pwrgroup_ht40[rf][channel -
-                                                                    1]));
+                                       "customer's limit, 40MHz rf(%c) = 0x%x\n",
+                                       rf == 0 ? 'A' : 'B',
+                                       rtlefuse->pwrgroup_ht40[rf][channel -
+                                                                   1]);
                        } else {
                                RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
-                                       ("customer's limit, 20MHz "
-                                        "rf(%c) = 0x%x\n",
-                                        ((rf == 0) ? 'A' : 'B'),
-                                        rtlefuse->pwrgroup_ht20[rf][channel -
-                                                                    1]));
+                                       "customer's limit, 20MHz rf(%c) = 0x%x\n",
+                                       rf == 0 ? 'A' : 'B',
+                                       rtlefuse->pwrgroup_ht20[rf][channel -
+                                                                   1]);
                        }
                        for (i = 0; i < 4; i++) {
                                pwr_diff_limit[i] =
@@ -311,15 +305,15 @@ static void _rtl92c_get_txpower_writeval_by_regulatory(struct ieee80211_hw *hw,
                            (pwr_diff_limit[1] << 8) | (pwr_diff_limit[0]);
 
                        RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
-                               ("Customer's limit rf(%c) = 0x%x\n",
-                                ((rf == 0) ? 'A' : 'B'), customer_limit));
+                               "Customer's limit rf(%c) = 0x%x\n",
+                               rf == 0 ? 'A' : 'B', customer_limit);
 
                        writeVal = customer_limit +
                            ((index < 2) ? powerBase0[rf] : powerBase1[rf]);
 
                        RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
-                               ("Customer, writeVal rf(%c)= 0x%x\n",
-                                ((rf == 0) ? 'A' : 'B'), writeVal));
+                               "Customer, writeVal rf(%c)= 0x%x\n",
+                               rf == 0 ? 'A' : 'B', writeVal);
                        break;
                default:
                        chnlgroup = 0;
@@ -329,9 +323,8 @@ static void _rtl92c_get_txpower_writeval_by_regulatory(struct ieee80211_hw *hw,
                            + ((index < 2) ? powerBase0[rf] : powerBase1[rf]);
 
                        RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
-                               ("RTK better performance, writeVal "
-                                "rf(%c) = 0x%x\n",
-                                ((rf == 0) ? 'A' : 'B'), writeVal));
+                               "RTK better performance, writeVal rf(%c) = 0x%x\n",
+                               rf == 0 ? 'A' : 'B', writeVal);
                        break;
                }
 
@@ -383,7 +376,7 @@ static void _rtl92c_write_ofdm_power_reg(struct ieee80211_hw *hw,
                rtl_set_bbreg(hw, regoffset, MASKDWORD, writeVal);
 
                RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
-                       ("Set 0x%x = %08x\n", regoffset, writeVal));
+                       "Set 0x%x = %08x\n", regoffset, writeVal);
 
                if (((get_rf_type(rtlphy) == RF_2T2R) &&
                     (regoffset == RTXAGC_A_MCS15_MCS12 ||
@@ -510,14 +503,14 @@ static bool _rtl92ce_phy_rf6052_config_parafile(struct ieee80211_hw *hw)
                        break;
                }
 
-               if (rtstatus != true) {
+               if (!rtstatus) {
                        RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
-                                ("Radio[%d] Fail!!", rfpath));
+                                "Radio[%d] Fail!!\n", rfpath);
                        return false;
                }
 
        }
 
-       RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, ("<---\n"));
+       RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, "<---\n");
        return rtstatus;
 }
index 39ff036..6c8d56e 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2009-2010  Realtek Corporation.
+ * Copyright(c) 2009-2012  Realtek Corporation.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
index 89ef698..2c3b733 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2009-2010  Realtek Corporation.
+ * Copyright(c) 2009-2012  Realtek Corporation.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
@@ -27,9 +27,6 @@
  *
  *****************************************************************************/
 
-#include <linux/vmalloc.h>
-#include <linux/module.h>
-
 #include "../wifi.h"
 #include "../core.h"
 #include "../pci.h"
@@ -43,6 +40,8 @@
 #include "trx.h"
 #include "led.h"
 
+#include <linux/module.h>
+
 static void rtl92c_init_aspm_vars(struct ieee80211_hw *hw)
 {
        struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
@@ -92,9 +91,7 @@ int rtl92c_init_sw_vars(struct ieee80211_hw *hw)
        int err;
        struct rtl_priv *rtlpriv = rtl_priv(hw);
        struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
-       const struct firmware *firmware;
        struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
-       char *fw_name = NULL;
 
        rtl8192ce_bt_reg_init(hw);
 
@@ -159,33 +156,27 @@ int rtl92c_init_sw_vars(struct ieee80211_hw *hw)
        rtlpriv->rtlhal.pfirmware = vzalloc(0x4000);
        if (!rtlpriv->rtlhal.pfirmware) {
                RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                        ("Can't alloc buffer for fw.\n"));
+                        "Can't alloc buffer for fw\n");
                return 1;
        }
 
        /* request fw */
        if (IS_VENDOR_UMC_A_CUT(rtlhal->version) &&
            !IS_92C_SERIAL(rtlhal->version))
-               fw_name = "rtlwifi/rtl8192cfwU.bin";
+               rtlpriv->cfg->fw_name = "rtlwifi/rtl8192cfwU.bin";
        else if (IS_81xxC_VENDOR_UMC_B_CUT(rtlhal->version))
-               fw_name = "rtlwifi/rtl8192cfwU_B.bin";
-       else
-               fw_name = rtlpriv->cfg->fw_name;
-       err = request_firmware(&firmware, fw_name, rtlpriv->io.dev);
+               rtlpriv->cfg->fw_name = "rtlwifi/rtl8192cfwU_B.bin";
+
+       rtlpriv->max_fw_size = 0x4000;
+       pr_info("Using firmware %s\n", rtlpriv->cfg->fw_name);
+       err = request_firmware_nowait(THIS_MODULE, 1, rtlpriv->cfg->fw_name,
+                                     rtlpriv->io.dev, GFP_KERNEL, hw,
+                                     rtl_fw_cb);
        if (err) {
                RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                        ("Failed to request firmware!\n"));
-               return 1;
-       }
-       if (firmware->size > 0x4000) {
-               RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                        ("Firmware is too big!\n"));
-               release_firmware(firmware);
+                        "Failed to request firmware!\n");
                return 1;
        }
-       memcpy(rtlpriv->rtlhal.pfirmware, firmware->data, firmware->size);
-       rtlpriv->rtlhal.fwsize = firmware->size;
-       release_firmware(firmware);
 
        return 0;
 }
@@ -404,7 +395,7 @@ static int __init rtl92ce_module_init(void)
 
        ret = pci_register_driver(&rtl92ce_driver);
        if (ret)
-               RT_ASSERT(false, (": No device found\n"));
+               RT_ASSERT(false, "No device found\n");
 
        return ret;
 }
index b7dc326..d2367a5 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2009-2010  Realtek Corporation.
+ * Copyright(c) 2009-2012  Realtek Corporation.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
index ba938b9..752f943 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2009-2010  Realtek Corporation.
+ * Copyright(c) 2009-2012  Realtek Corporation.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
index 3a6e8b6..8b79161 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2009-2010  Realtek Corporation.
+ * Copyright(c) 2009-2012  Realtek Corporation.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
index 4fb5ae2..37b1363 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2009-2010  Realtek Corporation.
+ * Copyright(c) 2009-2012  Realtek Corporation.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
@@ -725,7 +725,7 @@ void rtl92ce_tx_fill_desc(struct ieee80211_hw *hw,
                if (ieee80211_is_data_qos(fc)) {
                        if (mac->rdg_en) {
                                RT_TRACE(rtlpriv, COMP_SEND, DBG_TRACE,
-                                        ("Enable RDG function.\n"));
+                                        "Enable RDG function\n");
                                SET_TX_DESC_RDG_ENABLE(pdesc, 1);
                                SET_TX_DESC_HTC(pdesc, 1);
                        }
@@ -763,7 +763,7 @@ void rtl92ce_tx_fill_desc(struct ieee80211_hw *hw,
                SET_TX_DESC_BMC(pdesc, 1);
        }
 
-       RT_TRACE(rtlpriv, COMP_SEND, DBG_TRACE, ("\n"));
+       RT_TRACE(rtlpriv, COMP_SEND, DBG_TRACE, "\n");
 }
 
 void rtl92ce_tx_fill_cmddesc(struct ieee80211_hw *hw,
@@ -821,8 +821,7 @@ void rtl92ce_tx_fill_cmddesc(struct ieee80211_hw *hw,
        }
 
        RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_LOUD,
-                     "H2C Tx Cmd Content\n",
-                     pdesc, TX_DESC_SIZE);
+                     "H2C Tx Cmd Content", pdesc, TX_DESC_SIZE);
 }
 
 void rtl92ce_set_desc(u8 *pdesc, bool istx, u8 desc_name, u8 *val)
@@ -837,8 +836,8 @@ void rtl92ce_set_desc(u8 *pdesc, bool istx, u8 desc_name, u8 *val)
                        SET_TX_DESC_NEXT_DESC_ADDRESS(pdesc, *(u32 *) val);
                        break;
                default:
-                       RT_ASSERT(false, ("ERR txdesc :%d"
-                                         " not process\n", desc_name));
+                       RT_ASSERT(false, "ERR txdesc :%d not process\n",
+                                 desc_name);
                        break;
                }
        } else {
@@ -857,8 +856,8 @@ void rtl92ce_set_desc(u8 *pdesc, bool istx, u8 desc_name, u8 *val)
                        SET_RX_DESC_EOR(pdesc, 1);
                        break;
                default:
-                       RT_ASSERT(false, ("ERR rxdesc :%d "
-                                         "not process\n", desc_name));
+                       RT_ASSERT(false, "ERR rxdesc :%d not process\n",
+                                 desc_name);
                        break;
                }
        }
@@ -877,8 +876,8 @@ u32 rtl92ce_get_desc(u8 *p_desc, bool istx, u8 desc_name)
                        ret = GET_TX_DESC_TX_BUFFER_ADDRESS(p_desc);
                        break;
                default:
-                       RT_ASSERT(false, ("ERR txdesc :%d "
-                                         "not process\n", desc_name));
+                       RT_ASSERT(false, "ERR txdesc :%d not process\n",
+                                 desc_name);
                        break;
                }
        } else {
@@ -891,8 +890,8 @@ u32 rtl92ce_get_desc(u8 *p_desc, bool istx, u8 desc_name)
                        ret = GET_RX_DESC_PKT_LEN(pdesc);
                        break;
                default:
-                       RT_ASSERT(false, ("ERR rxdesc :%d "
-                                         "not process\n", desc_name));
+                       RT_ASSERT(false, "ERR rxdesc :%d not process\n",
+                                 desc_name);
                        break;
                }
        }
index c8977a5..efb9ab2 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2009-2010  Realtek Corporation.
+ * Copyright(c) 2009-2012  Realtek Corporation.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
index d097efb..f916555 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2009-2010  Realtek Corporation.
+ * Copyright(c) 2009-2012  Realtek Corporation.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
index f311bae..6fd39ea 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2009-2010  Realtek Corporation.
+ * Copyright(c) 2009-2012  Realtek Corporation.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
@@ -52,7 +52,7 @@ void rtl92cu_dm_dynamic_txpower(struct ieee80211_hw *hw)
        if ((mac->link_state < MAC80211_LINKED) &&
            (rtlpriv->dm.entry_min_undecoratedsmoothed_pwdb == 0)) {
                RT_TRACE(rtlpriv, COMP_POWER, DBG_TRACE,
-                        ("Not connected to any\n"));
+                        "Not connected to any\n");
 
                rtlpriv->dm.dynamic_txhighpower_lvl = TXHIGHPWRLEVEL_NORMAL;
 
@@ -65,28 +65,28 @@ void rtl92cu_dm_dynamic_txpower(struct ieee80211_hw *hw)
                        undecorated_smoothed_pwdb =
                            rtlpriv->dm.entry_min_undecoratedsmoothed_pwdb;
                        RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
-                                ("AP Client PWDB = 0x%lx\n",
-                                 undecorated_smoothed_pwdb));
+                                "AP Client PWDB = 0x%lx\n",
+                                undecorated_smoothed_pwdb);
                } else {
                        undecorated_smoothed_pwdb =
                            rtlpriv->dm.undecorated_smoothed_pwdb;
                        RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
-                                ("STA Default Port PWDB = 0x%lx\n",
-                                 undecorated_smoothed_pwdb));
+                                "STA Default Port PWDB = 0x%lx\n",
+                                undecorated_smoothed_pwdb);
                }
        } else {
                undecorated_smoothed_pwdb =
                    rtlpriv->dm.entry_min_undecoratedsmoothed_pwdb;
 
                RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
-                        ("AP Ext Port PWDB = 0x%lx\n",
-                         undecorated_smoothed_pwdb));
+                        "AP Ext Port PWDB = 0x%lx\n",
+                        undecorated_smoothed_pwdb);
        }
 
        if (undecorated_smoothed_pwdb >= TX_POWER_NEAR_FIELD_THRESH_LVL2) {
                rtlpriv->dm.dynamic_txhighpower_lvl = TXHIGHPWRLEVEL_LEVEL1;
                RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
-                        ("TXHIGHPWRLEVEL_LEVEL1 (TxPwr=0x0)\n"));
+                        "TXHIGHPWRLEVEL_LEVEL1 (TxPwr=0x0)\n");
        } else if ((undecorated_smoothed_pwdb <
                    (TX_POWER_NEAR_FIELD_THRESH_LVL2 - 3)) &&
                   (undecorated_smoothed_pwdb >=
@@ -94,18 +94,18 @@ void rtl92cu_dm_dynamic_txpower(struct ieee80211_hw *hw)
 
                rtlpriv->dm.dynamic_txhighpower_lvl = TXHIGHPWRLEVEL_LEVEL1;
                RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
-                        ("TXHIGHPWRLEVEL_LEVEL1 (TxPwr=0x10)\n"));
+                        "TXHIGHPWRLEVEL_LEVEL1 (TxPwr=0x10)\n");
        } else if (undecorated_smoothed_pwdb <
                   (TX_POWER_NEAR_FIELD_THRESH_LVL1 - 5)) {
                rtlpriv->dm.dynamic_txhighpower_lvl = TXHIGHPWRLEVEL_NORMAL;
                RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
-                        ("TXHIGHPWRLEVEL_NORMAL\n"));
+                        "TXHIGHPWRLEVEL_NORMAL\n");
        }
 
        if ((rtlpriv->dm.dynamic_txhighpower_lvl != rtlpriv->dm.last_dtp_lvl)) {
                RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
-                        ("PHY_SetTxPowerLevel8192S() Channel = %d\n",
-                         rtlphy->current_channel));
+                        "PHY_SetTxPowerLevel8192S() Channel = %d\n",
+                        rtlphy->current_channel);
                rtl92c_phy_set_txpower_level(hw, rtlphy->current_channel);
        }
 
index 7f966c6..d947e7d 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2009-2010  Realtek Corporation.
+ * Copyright(c) 2009-2012  Realtek Corporation.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
index 124cf63..0c74d4f 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2009-2010  Realtek Corporation. All rights reserved.
+ * Copyright(c) 2009-2012  Realtek Corporation. All rights reserved.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
@@ -27,8 +27,6 @@
  *
  *****************************************************************************/
 
-#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
-
 #include "../wifi.h"
 #include "../efuse.h"
 #include "../base.h"
@@ -162,24 +160,24 @@ static void _rtl92cu_read_txpower_info_from_hwpg(struct ieee80211_hw *hw,
        for (rf_path = 0; rf_path < 2; rf_path++)
                for (i = 0; i < 3; i++)
                        RTPRINT(rtlpriv, FINIT, INIT_EEPROM,
-                               ("RF(%d) EEPROM CCK Area(%d) = 0x%x\n", rf_path,
-                                i, rtlefuse->
-                                eeprom_chnlarea_txpwr_cck[rf_path][i]));
+                               "RF(%d) EEPROM CCK Area(%d) = 0x%x\n",
+                               rf_path, i,
+                               rtlefuse->
+                               eeprom_chnlarea_txpwr_cck[rf_path][i]);
        for (rf_path = 0; rf_path < 2; rf_path++)
                for (i = 0; i < 3; i++)
                        RTPRINT(rtlpriv, FINIT, INIT_EEPROM,
-                               ("RF(%d) EEPROM HT40 1S Area(%d) = 0x%x\n",
-                                rf_path, i,
-                                rtlefuse->
-                                eeprom_chnlarea_txpwr_ht40_1s[rf_path][i]));
+                               "RF(%d) EEPROM HT40 1S Area(%d) = 0x%x\n",
+                               rf_path, i,
+                               rtlefuse->
+                               eeprom_chnlarea_txpwr_ht40_1s[rf_path][i]);
        for (rf_path = 0; rf_path < 2; rf_path++)
                for (i = 0; i < 3; i++)
                        RTPRINT(rtlpriv, FINIT, INIT_EEPROM,
-                               ("RF(%d) EEPROM HT40 2S Diff Area(%d) = 0x%x\n",
-                                rf_path, i,
-                                rtlefuse->
-                                eeprom_chnlarea_txpwr_ht40_2sdiif[rf_path]
-                                [i]));
+                               "RF(%d) EEPROM HT40 2S Diff Area(%d) = 0x%x\n",
+                               rf_path, i,
+                               rtlefuse->
+                               eeprom_chnlarea_txpwr_ht40_2sdiif[rf_path][i]);
        for (rf_path = 0; rf_path < 2; rf_path++) {
                for (i = 0; i < 14; i++) {
                        index = _rtl92c_get_chnl_group((u8) i);
@@ -205,11 +203,10 @@ static void _rtl92cu_read_txpower_info_from_hwpg(struct ieee80211_hw *hw,
                }
                for (i = 0; i < 14; i++) {
                        RTPRINT(rtlpriv, FINIT, INIT_TxPower,
-                               ("RF(%d)-Ch(%d) [CCK / HT40_1S / HT40_2S] = "
-                                "[0x%x / 0x%x / 0x%x]\n", rf_path, i,
-                                rtlefuse->txpwrlevel_cck[rf_path][i],
-                                rtlefuse->txpwrlevel_ht40_1s[rf_path][i],
-                                rtlefuse->txpwrlevel_ht40_2s[rf_path][i]));
+                               "RF(%d)-Ch(%d) [CCK / HT40_1S / HT40_2S] = [0x%x / 0x%x / 0x%x]\n", rf_path, i,
+                               rtlefuse->txpwrlevel_cck[rf_path][i],
+                               rtlefuse->txpwrlevel_ht40_1s[rf_path][i],
+                               rtlefuse->txpwrlevel_ht40_2s[rf_path][i]);
                }
        }
        for (i = 0; i < 3; i++) {
@@ -242,13 +239,13 @@ static void _rtl92cu_read_txpower_info_from_hwpg(struct ieee80211_hw *hw,
                                      & 0xf0) >> 4);
                        }
                        RTPRINT(rtlpriv, FINIT, INIT_TxPower,
-                               ("RF-%d pwrgroup_ht20[%d] = 0x%x\n",
-                                rf_path, i,
-                                rtlefuse->pwrgroup_ht20[rf_path][i]));
+                               "RF-%d pwrgroup_ht20[%d] = 0x%x\n",
+                               rf_path, i,
+                               rtlefuse->pwrgroup_ht20[rf_path][i]);
                        RTPRINT(rtlpriv, FINIT, INIT_TxPower,
-                               ("RF-%d pwrgroup_ht40[%d] = 0x%x\n",
-                                rf_path, i,
-                                rtlefuse->pwrgroup_ht40[rf_path][i]));
+                               "RF-%d pwrgroup_ht40[%d] = 0x%x\n",
+                               rf_path, i,
+                               rtlefuse->pwrgroup_ht40[rf_path][i]);
                }
        }
        for (i = 0; i < 14; i++) {
@@ -277,26 +274,26 @@ static void _rtl92cu_read_txpower_info_from_hwpg(struct ieee80211_hw *hw,
            rtlefuse->txpwr_legacyhtdiff[RF90_PATH_A][7];
        for (i = 0; i < 14; i++)
                RTPRINT(rtlpriv, FINIT, INIT_TxPower,
-                       ("RF-A Ht20 to HT40 Diff[%d] = 0x%x\n", i,
-                        rtlefuse->txpwr_ht20diff[RF90_PATH_A][i]));
+                       "RF-A Ht20 to HT40 Diff[%d] = 0x%x\n",
+                       i, rtlefuse->txpwr_ht20diff[RF90_PATH_A][i]);
        for (i = 0; i < 14; i++)
                RTPRINT(rtlpriv, FINIT, INIT_TxPower,
-                       ("RF-A Legacy to Ht40 Diff[%d] = 0x%x\n", i,
-                        rtlefuse->txpwr_legacyhtdiff[RF90_PATH_A][i]));
+                       "RF-A Legacy to Ht40 Diff[%d] = 0x%x\n",
+                       i, rtlefuse->txpwr_legacyhtdiff[RF90_PATH_A][i]);
        for (i = 0; i < 14; i++)
                RTPRINT(rtlpriv, FINIT, INIT_TxPower,
-                       ("RF-B Ht20 to HT40 Diff[%d] = 0x%x\n", i,
-                        rtlefuse->txpwr_ht20diff[RF90_PATH_B][i]));
+                       "RF-B Ht20 to HT40 Diff[%d] = 0x%x\n",
+                       i, rtlefuse->txpwr_ht20diff[RF90_PATH_B][i]);
        for (i = 0; i < 14; i++)
                RTPRINT(rtlpriv, FINIT, INIT_TxPower,
-                       ("RF-B Legacy to HT40 Diff[%d] = 0x%x\n", i,
-                        rtlefuse->txpwr_legacyhtdiff[RF90_PATH_B][i]));
+                       "RF-B Legacy to HT40 Diff[%d] = 0x%x\n",
+                       i, rtlefuse->txpwr_legacyhtdiff[RF90_PATH_B][i]);
        if (!autoload_fail)
                rtlefuse->eeprom_regulatory = (hwinfo[RF_OPTION1] & 0x7);
        else
                rtlefuse->eeprom_regulatory = 0;
        RTPRINT(rtlpriv, FINIT, INIT_TxPower,
-               ("eeprom_regulatory = 0x%x\n", rtlefuse->eeprom_regulatory));
+               "eeprom_regulatory = 0x%x\n", rtlefuse->eeprom_regulatory);
        if (!autoload_fail) {
                rtlefuse->eeprom_tssi[RF90_PATH_A] = hwinfo[EEPROM_TSSI_A];
                rtlefuse->eeprom_tssi[RF90_PATH_B] = hwinfo[EEPROM_TSSI_B];
@@ -305,9 +302,9 @@ static void _rtl92cu_read_txpower_info_from_hwpg(struct ieee80211_hw *hw,
                rtlefuse->eeprom_tssi[RF90_PATH_B] = EEPROM_DEFAULT_TSSI;
        }
        RTPRINT(rtlpriv, FINIT, INIT_TxPower,
-               ("TSSI_A = 0x%x, TSSI_B = 0x%x\n",
-                rtlefuse->eeprom_tssi[RF90_PATH_A],
-                rtlefuse->eeprom_tssi[RF90_PATH_B]));
+               "TSSI_A = 0x%x, TSSI_B = 0x%x\n",
+               rtlefuse->eeprom_tssi[RF90_PATH_A],
+               rtlefuse->eeprom_tssi[RF90_PATH_B]);
        if (!autoload_fail)
                tempval = hwinfo[EEPROM_THERMAL_METER];
        else
@@ -320,7 +317,7 @@ static void _rtl92cu_read_txpower_info_from_hwpg(struct ieee80211_hw *hw,
                rtlefuse->apk_thermalmeterignore = true;
        rtlefuse->thermalmeter[0] = rtlefuse->eeprom_thermalmeter;
        RTPRINT(rtlpriv, FINIT, INIT_TxPower,
-               ("thermalmeter = 0x%x\n", rtlefuse->eeprom_thermalmeter));
+               "thermalmeter = 0x%x\n", rtlefuse->eeprom_thermalmeter);
 }
 
 static void _rtl92cu_read_board_type(struct ieee80211_hw *hw, u8 *contents)
@@ -340,144 +337,8 @@ static void _rtl92cu_read_board_type(struct ieee80211_hw *hw, u8 *contents)
        if (IS_HIGHT_PA(rtlefuse->board_type))
                rtlefuse->external_pa = 1;
        pr_info("Board Type %x\n", rtlefuse->board_type);
-
-#ifdef CONFIG_ANTENNA_DIVERSITY
-       /* Antenna Diversity setting. */
-       if (registry_par->antdiv_cfg == 2) /* 2: From Efuse */
-               rtl_efuse->antenna_cfg = (contents[EEPROM_RF_OPT1]&0x18)>>3;
-       else
-               rtl_efuse->antenna_cfg = registry_par->antdiv_cfg; /* 0:OFF, */
-
-       pr_info("Antenna Config %x\n", rtl_efuse->antenna_cfg);
-#endif
-}
-
-#ifdef CONFIG_BT_COEXIST
-static void _update_bt_param(_adapter *padapter)
-{
-       struct btcoexist_priv    *pbtpriv = &(padapter->halpriv.bt_coexist);
-       struct registry_priv    *registry_par = &padapter->registrypriv;
-       if (2 != registry_par->bt_iso) {
-               /* 0:Low, 1:High, 2:From Efuse */
-               pbtpriv->BT_Ant_isolation = registry_par->bt_iso;
-       }
-       if (registry_par->bt_sco == 1) {
-               /* 0:Idle, 1:None-SCO, 2:SCO, 3:From Counter, 4.Busy,
-                * 5.OtherBusy */
-               pbtpriv->BT_Service = BT_OtherAction;
-       } else if (registry_par->bt_sco == 2) {
-               pbtpriv->BT_Service = BT_SCO;
-       } else if (registry_par->bt_sco == 4) {
-               pbtpriv->BT_Service = BT_Busy;
-       } else if (registry_par->bt_sco == 5) {
-               pbtpriv->BT_Service = BT_OtherBusy;
-       } else {
-               pbtpriv->BT_Service = BT_Idle;
-       }
-       pbtpriv->BT_Ampdu = registry_par->bt_ampdu;
-       pbtpriv->bCOBT = _TRUE;
-       pbtpriv->BtEdcaUL = 0;
-       pbtpriv->BtEdcaDL = 0;
-       pbtpriv->BtRssiState = 0xff;
-       pbtpriv->bInitSet = _FALSE;
-       pbtpriv->bBTBusyTraffic = _FALSE;
-       pbtpriv->bBTTrafficModeSet = _FALSE;
-       pbtpriv->bBTNonTrafficModeSet = _FALSE;
-       pbtpriv->CurrentState = 0;
-       pbtpriv->PreviousState = 0;
-       pr_info("BT Coexistance = %s\n",
-               (pbtpriv->BT_Coexist == _TRUE) ? "enable" : "disable");
-       if (pbtpriv->BT_Coexist) {
-               if (pbtpriv->BT_Ant_Num == Ant_x2)
-                       pr_info("BlueTooth BT_Ant_Num = Antx2\n");
-               else if (pbtpriv->BT_Ant_Num == Ant_x1)
-                       pr_info("BlueTooth BT_Ant_Num = Antx1\n");
-               switch (pbtpriv->BT_CoexistType) {
-               case BT_2Wire:
-                       pr_info("BlueTooth BT_CoexistType = BT_2Wire\n");
-                       break;
-               case BT_ISSC_3Wire:
-                       pr_info("BlueTooth BT_CoexistType = BT_ISSC_3Wire\n");
-                       break;
-               case BT_Accel:
-                       pr_info("BlueTooth BT_CoexistType = BT_Accel\n");
-                       break;
-               case BT_CSR_BC4:
-                       pr_info("BlueTooth BT_CoexistType = BT_CSR_BC4\n");
-                       break;
-               case BT_CSR_BC8:
-                       pr_info("BlueTooth BT_CoexistType = BT_CSR_BC8\n");
-                       break;
-               case BT_RTL8756:
-                       pr_info("BlueTooth BT_CoexistType = BT_RTL8756\n");
-                       break;
-               default:
-                       pr_info("BlueTooth BT_CoexistType = Unknown\n");
-                       break;
-               }
-               pr_info("BlueTooth BT_Ant_isolation = %d\n",
-                       pbtpriv->BT_Ant_isolation);
-               switch (pbtpriv->BT_Service) {
-               case BT_OtherAction:
-                       pr_info("BlueTooth BT_Service = BT_OtherAction\n");
-                       break;
-               case BT_SCO:
-                       pr_info("BlueTooth BT_Service = BT_SCO\n");
-                       break;
-               case BT_Busy:
-                       pr_info("BlueTooth BT_Service = BT_Busy\n");
-                       break;
-               case BT_OtherBusy:
-                       pr_info("BlueTooth BT_Service = BT_OtherBusy\n");
-                       break;
-               default:
-                       pr_info("BlueTooth BT_Service = BT_Idle\n");
-                       break;
-               }
-               pr_info("BT_RadioSharedType = 0x%x\n",
-                       pbtpriv->BT_RadioSharedType);
-       }
 }
 
-#define GET_BT_COEXIST(priv) (&priv->bt_coexist)
-
-static void _rtl92cu_read_bluetooth_coexistInfo(struct ieee80211_hw *hw,
-                                               u8 *contents,
-                                               bool bautoloadfailed);
-{
-       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);
-       bool isNormal = IS_NORMAL_CHIP(pHalData->VersionID);
-       struct btcoexist_priv    *pbtpriv = &pHalData->bt_coexist;
-       u8      rf_opt4;
-
-       _rtw_memset(pbtpriv, 0, sizeof(struct btcoexist_priv));
-       if (AutoloadFail) {
-               pbtpriv->BT_Coexist = _FALSE;
-               pbtpriv->BT_CoexistType = BT_2Wire;
-               pbtpriv->BT_Ant_Num = Ant_x2;
-               pbtpriv->BT_Ant_isolation = 0;
-               pbtpriv->BT_RadioSharedType = BT_Radio_Shared;
-               return;
-       }
-       if (isNormal) {
-               if (pHalData->BoardType == BOARD_USB_COMBO)
-                       pbtpriv->BT_Coexist = _TRUE;
-               else
-                       pbtpriv->BT_Coexist = ((PROMContent[EEPROM_RF_OPT3] &
-                                             0x20) >> 5); /* bit[5] */
-               rf_opt4 = PROMContent[EEPROM_RF_OPT4];
-               pbtpriv->BT_CoexistType = ((rf_opt4&0xe)>>1); /* bit [3:1] */
-               pbtpriv->BT_Ant_Num = (rf_opt4&0x1); /* bit [0] */
-               pbtpriv->BT_Ant_isolation = ((rf_opt4&0x10)>>4); /* bit [4] */
-               pbtpriv->BT_RadioSharedType = ((rf_opt4&0x20)>>5); /* bit [5] */
-       } else {
-               pbtpriv->BT_Coexist = (PROMContent[EEPROM_RF_OPT4] >> 4) ?
-                                      _TRUE : _FALSE;
-       }
-       _update_bt_param(Adapter);
-}
-#endif
-
 static void _rtl92cu_read_adapter_info(struct ieee80211_hw *hw)
 {
        struct rtl_priv *rtlpriv = rtl_priv(hw);
@@ -494,17 +355,17 @@ static void _rtl92cu_read_adapter_info(struct ieee80211_hw *hw)
                       HWSET_MAX_SIZE);
        } else if (rtlefuse->epromtype == EEPROM_93C46) {
                RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                        ("RTL819X Not boot from eeprom, check it !!"));
+                        "RTL819X Not boot from eeprom, check it !!\n");
        }
-       RT_PRINT_DATA(rtlpriv, COMP_INIT, DBG_LOUD, ("MAP\n"),
+       RT_PRINT_DATA(rtlpriv, COMP_INIT, DBG_LOUD, "MAP",
                      hwinfo, HWSET_MAX_SIZE);
        eeprom_id = le16_to_cpu(*((__le16 *)&hwinfo[0]));
        if (eeprom_id != RTL8190_EEPROM_ID) {
                RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                        ("EEPROM ID(%#x) is invalid!!\n", eeprom_id));
+                        "EEPROM ID(%#x) is invalid!!\n", eeprom_id);
                rtlefuse->autoload_failflag = true;
        } else {
-               RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, ("Autoload OK\n"));
+               RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "Autoload OK\n");
                rtlefuse->autoload_failflag = false;
        }
        if (rtlefuse->autoload_failflag)
@@ -518,16 +379,15 @@ static void _rtl92cu_read_adapter_info(struct ieee80211_hw *hw)
                                           rtlefuse->autoload_failflag, hwinfo);
        rtlefuse->eeprom_vid = le16_to_cpu(*(__le16 *)&hwinfo[EEPROM_VID]);
        rtlefuse->eeprom_did = le16_to_cpu(*(__le16 *)&hwinfo[EEPROM_DID]);
-       RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
-                (" VID = 0x%02x PID = 0x%02x\n",
-                rtlefuse->eeprom_vid, rtlefuse->eeprom_did));
+       RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, " VID = 0x%02x PID = 0x%02x\n",
+                rtlefuse->eeprom_vid, rtlefuse->eeprom_did);
        rtlefuse->eeprom_channelplan = *(u8 *)&hwinfo[EEPROM_CHANNELPLAN];
        rtlefuse->eeprom_version =
                         le16_to_cpu(*(__le16 *)&hwinfo[EEPROM_VERSION]);
        rtlefuse->txpwr_fromeprom = true;
        rtlefuse->eeprom_oemid = *(u8 *)&hwinfo[EEPROM_CUSTOMER_ID];
-       RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
-                ("EEPROM Customer ID: 0x%2x\n", rtlefuse->eeprom_oemid));
+       RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "EEPROM Customer ID: 0x%2x\n",
+                rtlefuse->eeprom_oemid);
        if (rtlhal->oem_id == RT_CID_DEFAULT) {
                switch (rtlefuse->eeprom_oemid) {
                case EEPROM_CID_DEFAULT:
@@ -554,10 +414,6 @@ static void _rtl92cu_read_adapter_info(struct ieee80211_hw *hw)
                }
        }
        _rtl92cu_read_board_type(hw, hwinfo);
-#ifdef CONFIG_BT_COEXIST
-       _rtl92cu_read_bluetooth_coexistInfo(hw, hwinfo,
-                                           rtlefuse->autoload_failflag);
-#endif
 }
 
 static void _rtl92cu_hal_customized_behavior(struct ieee80211_hw *hw)
@@ -579,8 +435,8 @@ static void _rtl92cu_hal_customized_behavior(struct ieee80211_hw *hw)
        default:
                break;
        }
-       RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
-                ("RT Customized ID: 0x%02X\n", rtlhal->oem_id));
+       RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "RT Customized ID: 0x%02X\n",
+                rtlhal->oem_id);
 }
 
 void rtl92cu_read_eeprom_info(struct ieee80211_hw *hw)
@@ -596,11 +452,11 @@ void rtl92cu_read_eeprom_info(struct ieee80211_hw *hw)
        tmp_u1b = rtl_read_byte(rtlpriv, REG_9346CR);
        rtlefuse->epromtype = (tmp_u1b & BOOT_FROM_EEPROM) ?
                               EEPROM_93C46 : EEPROM_BOOT_EFUSE;
-       RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, ("Boot from %s\n",
-                (tmp_u1b & BOOT_FROM_EEPROM) ? "EERROM" : "EFUSE"));
+       RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "Boot from %s\n",
+                tmp_u1b & BOOT_FROM_EEPROM ? "EERROM" : "EFUSE");
        rtlefuse->autoload_failflag = (tmp_u1b & EEPROM_EN) ? false : true;
-       RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, ("Autoload %s\n",
-                (tmp_u1b & EEPROM_EN) ? "OK!!" : "ERR!!"));
+       RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "Autoload %s\n",
+                tmp_u1b & EEPROM_EN ? "OK!!" : "ERR!!");
        _rtl92cu_read_adapter_info(hw);
        _rtl92cu_hal_customized_behavior(hw);
        return;
@@ -618,13 +474,12 @@ static int _rtl92cu_init_power_on(struct ieee80211_hw *hw)
        do {
                if (rtl_read_byte(rtlpriv, REG_APS_FSMCO) & PFM_ALDN) {
                        RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
-                                ("Autoload Done!\n"));
+                                "Autoload Done!\n");
                        break;
                }
                if (pollingCount++ > 100) {
                        RT_TRACE(rtlpriv, COMP_INIT, DBG_EMERG,
-                                ("Failed to polling REG_APS_FSMCO[PFM_ALDN]"
-                                " done!\n"));
+                                "Failed to polling REG_APS_FSMCO[PFM_ALDN] done!\n");
                        return -ENODEV;
                }
        } while (true);
@@ -639,8 +494,8 @@ static int _rtl92cu_init_power_on(struct ieee80211_hw *hw)
                value8 |= LDV12_EN;
                rtl_write_byte(rtlpriv, REG_LDOV12D_CTRL, value8);
                RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
-                        (" power-on :REG_LDOV12D_CTRL Reg0x21:0x%02x.\n",
-                        value8));
+                        " power-on :REG_LDOV12D_CTRL Reg0x21:0x%02x\n",
+                        value8);
                udelay(100);
                value8 = rtl_read_byte(rtlpriv, REG_SYS_ISO_CTRL);
                value8 &= ~ISO_MD2PP;
@@ -658,8 +513,7 @@ static int _rtl92cu_init_power_on(struct ieee80211_hw *hw)
                }
                if (pollingCount++ > 100) {
                        RT_TRACE(rtlpriv, COMP_INIT, DBG_EMERG,
-                                ("Failed to polling REG_APS_FSMCO[APFM_ONMAC]"
-                                " done!\n"));
+                                "Failed to polling REG_APS_FSMCO[APFM_ONMAC] done!\n");
                        return -ENODEV;
                }
        } while (true);
@@ -877,8 +731,8 @@ static void _rtl92cu_init_chipN_three_out_ep_priority(struct ieee80211_hw *hw,
                hiQ     = QUEUE_HIGH;
        }
        _rtl92c_init_chipN_reg_priority(hw, beQ, bkQ, viQ, voQ, mgtQ, hiQ);
-       RT_TRACE(rtlpriv, COMP_INIT, DBG_EMERG,
-                ("Tx queue select :0x%02x..\n", queue_sel));
+       RT_TRACE(rtlpriv, COMP_INIT, DBG_EMERG, "Tx queue select :0x%02x..\n",
+                queue_sel);
 }
 
 static void _rtl92cu_init_chipN_queue_priority(struct ieee80211_hw *hw,
@@ -937,8 +791,8 @@ static void _rtl92cu_init_chipT_queue_priority(struct ieee80211_hw *hw,
                break;
        }
        rtl_write_byte(rtlpriv, (REG_TRXDMA_CTRL+1), hq_sele);
-       RT_TRACE(rtlpriv, COMP_INIT, DBG_EMERG,
-                ("Tx queue select :0x%02x..\n", hq_sele));
+       RT_TRACE(rtlpriv, COMP_INIT, DBG_EMERG, "Tx queue select :0x%02x..\n",
+                hq_sele);
 }
 
 static void _rtl92cu_init_queue_priority(struct ieee80211_hw *hw,
@@ -998,7 +852,7 @@ static int _rtl92cu_init_mac(struct ieee80211_hw *hw)
 
        if (err) {
                RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                       ("Failed to init power on!\n"));
+                        "Failed to init power on!\n");
                return err;
        }
        if (!wmm_enable) {
@@ -1010,7 +864,7 @@ static int _rtl92cu_init_mac(struct ieee80211_hw *hw)
        }
        if (false == rtl92c_init_llt_table(hw, boundary)) {
                RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                       ("Failed to init LLT Table!\n"));
+                        "Failed to init LLT Table!\n");
                return -EINVAL;
        }
        _rtl92cu_init_queue_reserved_page(hw, wmm_enable, out_ep_nums,
@@ -1043,12 +897,12 @@ void rtl92cu_enable_hw_security_config(struct ieee80211_hw *hw)
        struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
 
        RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
-                ("PairwiseEncAlgorithm = %d GroupEncAlgorithm = %d\n",
-                 rtlpriv->sec.pairwise_enc_algorithm,
-                 rtlpriv->sec.group_enc_algorithm));
+                "PairwiseEncAlgorithm = %d GroupEncAlgorithm = %d\n",
+                rtlpriv->sec.pairwise_enc_algorithm,
+                rtlpriv->sec.group_enc_algorithm);
        if (rtlpriv->cfg->mod_params->sw_crypto || rtlpriv->sec.use_sw_sec) {
                RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG,
-                        ("not open sw encryption\n"));
+                        "not open sw encryption\n");
                return;
        }
        sec_reg_value = SCR_TxEncEnable | SCR_RxDecEnable;
@@ -1059,8 +913,8 @@ void rtl92cu_enable_hw_security_config(struct ieee80211_hw *hw)
        if (IS_NORMAL_CHIP(rtlhal->version))
                sec_reg_value |= (SCR_RXBCUSEDK | SCR_TXBCUSEDK);
        rtl_write_byte(rtlpriv, REG_CR + 1, 0x02);
-       RT_TRACE(rtlpriv, COMP_SEC, DBG_LOUD,
-                ("The SECR-value %x\n", sec_reg_value));
+       RT_TRACE(rtlpriv, COMP_SEC, DBG_LOUD, "The SECR-value %x\n",
+                sec_reg_value);
        rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_WPA_CONFIG, &sec_reg_value);
 }
 
@@ -1111,34 +965,6 @@ static void _InitPABias(struct ieee80211_hw *hw)
        }
 }
 
-static void _InitAntenna_Selection(struct ieee80211_hw *hw)
-{
-#ifdef CONFIG_ANTENNA_DIVERSITY
-       struct rtl_priv *rtlpriv = rtl_priv(hw);
-       struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
-       struct rtl_phy *rtlphy = &(rtlpriv->phy);
-
-       if (pHalData->AntDivCfg == 0)
-               return;
-
-       if (rtlphy->rf_type == RF_1T1R) {
-               rtl_write_dword(rtlpriv, REG_LEDCFG0,
-                               rtl_read_dword(rtlpriv,
-                               REG_LEDCFG0)|BIT(23));
-               rtl_set_bbreg(hw, rFPGA0_XAB_RFPARAMETER, BIT(13), 0x01);
-               if (rtl_get_bbreg(hw, RFPGA0_XA_RFINTERFACEOE, 0x300) ==
-                   Antenna_A)
-                       pHalData->CurAntenna = Antenna_A;
-               else
-                       pHalData->CurAntenna = Antenna_B;
-       }
-#endif
-}
-
-static void _dump_registers(struct ieee80211_hw *hw)
-{
-}
-
 static void _update_mac_setting(struct ieee80211_hw *hw)
 {
        struct rtl_priv *rtlpriv = rtl_priv(hw);
@@ -1163,18 +989,15 @@ int rtl92cu_hw_init(struct ieee80211_hw *hw)
        rtlhal->hw_type = HARDWARE_TYPE_RTL8192CU;
        err = _rtl92cu_init_mac(hw);
        if (err) {
-               RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, ("init mac failed!\n"));
+               RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "init mac failed!\n");
                return err;
        }
        err = rtl92c_download_fw(hw);
        if (err) {
                RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
-                        ("Failed to download FW. Init HW without FW now..\n"));
+                        "Failed to download FW. Init HW without FW now..\n");
                err = 1;
-               rtlhal->fw_ready = false;
                return err;
-       } else {
-               rtlhal->fw_ready = true;
        }
        rtlhal->last_hmeboxnum = 0; /* h2c */
        _rtl92cu_phy_param_tab_init(hw);
@@ -1209,10 +1032,8 @@ int rtl92cu_hw_init(struct ieee80211_hw *hw)
        }
        _rtl92cu_hw_configure(hw);
        _InitPABias(hw);
-       _InitAntenna_Selection(hw);
        _update_mac_setting(hw);
        rtl92c_dm_init(hw);
-       _dump_registers(hw);
        return err;
 }
 
@@ -1270,24 +1091,21 @@ static void  _ResetDigitalProcedure1(struct ieee80211_hw *hw, bool bWithoutHWSM)
                if (rtl_read_byte(rtlpriv, REG_MCUFWDL) & BIT(1)) {
                        /* reset MCU ready status */
                        rtl_write_byte(rtlpriv, REG_MCUFWDL, 0);
-                       if (rtlhal->fw_ready) {
-                               /* 8051 reset by self */
-                               rtl_write_byte(rtlpriv, REG_HMETFR+3, 0x20);
-                               while ((retry_cnts++ < 100) &&
-                                      (FEN_CPUEN & rtl_read_word(rtlpriv,
-                                      REG_SYS_FUNC_EN))) {
-                                       udelay(50);
-                               }
-                               if (retry_cnts >= 100) {
-                                       RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                                               ("#####=> 8051 reset failed!.."
-                                               ".......................\n"););
-                                       /* if 8051 reset fail, reset MAC. */
-                                       rtl_write_byte(rtlpriv,
-                                                      REG_SYS_FUNC_EN + 1,
-                                                      0x50);
-                                       udelay(100);
-                               }
+                       /* 8051 reset by self */
+                       rtl_write_byte(rtlpriv, REG_HMETFR+3, 0x20);
+                       while ((retry_cnts++ < 100) &&
+                              (FEN_CPUEN & rtl_read_word(rtlpriv,
+                              REG_SYS_FUNC_EN))) {
+                               udelay(50);
+                       }
+                       if (retry_cnts >= 100) {
+                               RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
+                                        "#####=> 8051 reset failed!.........................\n");
+                               /* if 8051 reset fail, reset MAC. */
+                               rtl_write_byte(rtlpriv,
+                                              REG_SYS_FUNC_EN + 1,
+                                              0x50);
+                               udelay(100);
                        }
                }
                /* Reset MAC and Enable 8051 */
@@ -1495,35 +1313,36 @@ static int _rtl92cu_set_media_status(struct ieee80211_hw *hw,
                _rtl92cu_resume_tx_beacon(hw);
                _rtl92cu_disable_bcn_sub_func(hw);
        } else {
-               RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING, ("Set HW_VAR_MEDIA_"
-                        "STATUS:No such media status(%x).\n", type));
+               RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
+                        "Set HW_VAR_MEDIA_STATUS:No such media status(%x)\n",
+                        type);
        }
        switch (type) {
        case NL80211_IFTYPE_UNSPECIFIED:
                bt_msr |= MSR_NOLINK;
                ledaction = LED_CTL_LINK;
                RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
-                        ("Set Network type to NO LINK!\n"));
+                        "Set Network type to NO LINK!\n");
                break;
        case NL80211_IFTYPE_ADHOC:
                bt_msr |= MSR_ADHOC;
                RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
-                        ("Set Network type to Ad Hoc!\n"));
+                        "Set Network type to Ad Hoc!\n");
                break;
        case NL80211_IFTYPE_STATION:
                bt_msr |= MSR_INFRA;
                ledaction = LED_CTL_LINK;
                RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
-                        ("Set Network type to STA!\n"));
+                        "Set Network type to STA!\n");
                break;
        case NL80211_IFTYPE_AP:
                bt_msr |= MSR_AP;
                RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
-                        ("Set Network type to AP!\n"));
+                        "Set Network type to AP!\n");
                break;
        default:
                RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                        ("Network type %d not support!\n", type));
+                        "Network type %d not supported!\n", type);
                goto error_out;
        }
        rtl_write_byte(rtlpriv, (MSR), bt_msr);
@@ -1684,8 +1503,8 @@ void rtl92cu_set_beacon_related_registers(struct ieee80211_hw *hw)
        value32 |= TSFRST;
        rtl_write_dword(rtlpriv, REG_TCR, value32);
        RT_TRACE(rtlpriv, COMP_INIT|COMP_BEACON, DBG_LOUD,
-                ("SetBeaconRelatedRegisters8192CUsb(): Set TCR(%x)\n",
-                value32));
+                "SetBeaconRelatedRegisters8192CUsb(): Set TCR(%x)\n",
+                value32);
        /* TODO: Modify later (Find the right parameters)
         * NOTE: Fix test chip's bug (about contention windows's randomness) */
        if ((mac->opmode == NL80211_IFTYPE_ADHOC) ||
@@ -1702,8 +1521,8 @@ void rtl92cu_set_beacon_interval(struct ieee80211_hw *hw)
        struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
        u16 bcn_interval = mac->beacon_interval;
 
-       RT_TRACE(rtlpriv, COMP_BEACON, DBG_DMESG,
-                ("beacon_interval:%d\n", bcn_interval));
+       RT_TRACE(rtlpriv, COMP_BEACON, DBG_DMESG, "beacon_interval:%d\n",
+                bcn_interval);
        rtl_write_word(rtlpriv, REG_BCN_INTERVAL, bcn_interval);
 }
 
@@ -1767,7 +1586,7 @@ void rtl92cu_get_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)
                break;
        default:
                RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                        ("switch case not process\n"));
+                        "switch case not processed\n");
                break;
        }
 }
@@ -1827,8 +1646,7 @@ void rtl92cu_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)
                        rtl_write_byte(rtlpriv, REG_MAC_SPEC_SIFS + 1, val[0]);
                        rtl_write_byte(rtlpriv, REG_R2T_SIFS+1, val[0]);
                        rtl_write_byte(rtlpriv, REG_T2T_SIFS+1, val[0]);
-                       RT_TRACE(rtlpriv, COMP_MLME, DBG_LOUD,
-                                ("HW_VAR_SIFS\n"));
+                       RT_TRACE(rtlpriv, COMP_MLME, DBG_LOUD, "HW_VAR_SIFS\n");
                        break;
                }
        case HW_VAR_SLOT_TIME:{
@@ -1837,7 +1655,7 @@ void rtl92cu_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)
 
                        rtl_write_byte(rtlpriv, REG_SLOT, val[0]);
                        RT_TRACE(rtlpriv, COMP_MLME, DBG_LOUD,
-                                ("HW_VAR_SLOT_TIME %x\n", val[0]));
+                                "HW_VAR_SLOT_TIME %x\n", val[0]);
                        if (QOS_MODE) {
                                for (e_aci = 0; e_aci < AC_MAX; e_aci++)
                                        rtlpriv->cfg->ops->set_hw_reg(hw,
@@ -1901,8 +1719,8 @@ void rtl92cu_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)
                                                     min_spacing_to_set);
                                *val = min_spacing_to_set;
                                RT_TRACE(rtlpriv, COMP_MLME, DBG_LOUD,
-                                       ("Set HW_VAR_AMPDU_MIN_SPACE: %#x\n",
-                                       mac->min_space_cfg));
+                                        "Set HW_VAR_AMPDU_MIN_SPACE: %#x\n",
+                                        mac->min_space_cfg);
                                rtl_write_byte(rtlpriv, REG_AMPDU_MIN_SPACE,
                                               mac->min_space_cfg);
                        }
@@ -1916,8 +1734,8 @@ void rtl92cu_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)
                        mac->min_space_cfg &= 0x07;
                        mac->min_space_cfg |= (density_to_set << 3);
                        RT_TRACE(rtlpriv, COMP_MLME, DBG_LOUD,
-                                ("Set HW_VAR_SHORTGI_DENSITY: %#x\n",
-                                 mac->min_space_cfg));
+                                "Set HW_VAR_SHORTGI_DENSITY: %#x\n",
+                                mac->min_space_cfg);
                        rtl_write_byte(rtlpriv, REG_AMPDU_MIN_SPACE,
                                       mac->min_space_cfg);
                        break;
@@ -1950,8 +1768,8 @@ void rtl92cu_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)
                                                       p_regtoset[index]);
                                }
                                RT_TRACE(rtlpriv, COMP_MLME, DBG_LOUD,
-                                        ("Set HW_VAR_AMPDU_FACTOR: %#x\n",
-                                         factor_toset));
+                                        "Set HW_VAR_AMPDU_FACTOR: %#x\n",
+                                        factor_toset);
                        }
                        break;
                }
@@ -1969,8 +1787,8 @@ void rtl92cu_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)
                                         AC_PARAM_ECW_MAX_OFFSET);
                        u4b_ac_param |= (u32) tx_op << AC_PARAM_TXOP_OFFSET;
                        RT_TRACE(rtlpriv, COMP_MLME, DBG_LOUD,
-                                ("queue:%x, ac_param:%x\n", e_aci,
-                                 u4b_ac_param));
+                                "queue:%x, ac_param:%x\n",
+                                e_aci, u4b_ac_param);
                        switch (e_aci) {
                        case AC1_BK:
                                rtl_write_dword(rtlpriv, REG_EDCA_BK_PARAM,
@@ -1989,8 +1807,9 @@ void rtl92cu_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)
                                                u4b_ac_param);
                                break;
                        default:
-                               RT_ASSERT(false, ("SetHwReg8185(): invalid"
-                                         " aci: %d !\n", e_aci));
+                               RT_ASSERT(false,
+                                         "SetHwReg8185(): invalid aci: %d !\n",
+                                         e_aci);
                                break;
                        }
                        if (rtlusb->acm_method != eAcmWay2_SW)
@@ -2020,8 +1839,8 @@ void rtl92cu_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)
                                        break;
                                default:
                                        RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
-                                                ("HW_VAR_ACM_CTRL acm set "
-                                                 "failed: eACI is %d\n", acm));
+                                                "HW_VAR_ACM_CTRL acm set failed: eACI is %d\n",
+                                                acm);
                                        break;
                                }
                        } else {
@@ -2037,13 +1856,13 @@ void rtl92cu_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)
                                        break;
                                default:
                                        RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                                                ("switch case not process\n"));
+                                                "switch case not processed\n");
                                        break;
                                }
                        }
                        RT_TRACE(rtlpriv, COMP_QOS, DBG_TRACE,
-                                ("SetHwReg8190pci(): [HW_VAR_ACM_CTRL] "
-                                 "Write 0x%X\n", acm_ctrl));
+                                "SetHwReg8190pci(): [HW_VAR_ACM_CTRL] Write 0x%X\n",
+                                acm_ctrl);
                        rtl_write_byte(rtlpriv, REG_ACMHWCTRL, acm_ctrl);
                        break;
                }
@@ -2051,7 +1870,7 @@ void rtl92cu_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)
                        rtl_write_dword(rtlpriv, REG_RCR, ((u32 *) (val))[0]);
                        mac->rx_conf = ((u32 *) (val))[0];
                        RT_TRACE(rtlpriv, COMP_RECV, DBG_DMESG,
-                                ("### Set RCR(0x%08x) ###\n", mac->rx_conf));
+                                "### Set RCR(0x%08x) ###\n", mac->rx_conf);
                        break;
                }
        case HW_VAR_RETRY_LIMIT:{
@@ -2060,8 +1879,9 @@ void rtl92cu_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)
                        rtl_write_word(rtlpriv, REG_RL,
                                       retry_limit << RETRY_LIMIT_SHORT_SHIFT |
                                       retry_limit << RETRY_LIMIT_LONG_SHIFT);
-                       RT_TRACE(rtlpriv, COMP_MLME, DBG_DMESG, ("Set HW_VAR_R"
-                                "ETRY_LIMIT(0x%08x)\n", retry_limit));
+                       RT_TRACE(rtlpriv, COMP_MLME, DBG_DMESG,
+                                "Set HW_VAR_RETRY_LIMIT(0x%08x)\n",
+                                retry_limit);
                        break;
                }
        case HW_VAR_DUAL_TSF_RST:
@@ -2165,8 +1985,8 @@ void rtl92cu_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)
                rtl_write_word(rtlpriv, REG_RXFLTMAP2, *(u16 *)val);
                break;
        default:
-               RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, ("switch case "
-                                                       "not process\n"));
+               RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
+                        "switch case not processed\n");
                break;
        }
 }
@@ -2239,8 +2059,8 @@ void rtl92cu_update_hal_rate_table(struct ieee80211_hw *hw,
                               (shortgi_rate << 4) | (shortgi_rate);
        }
        rtl_write_dword(rtlpriv, REG_ARFR0 + ratr_index * 4, ratr_value);
-       RT_TRACE(rtlpriv, COMP_RATR, DBG_DMESG, ("%x\n", rtl_read_dword(rtlpriv,
-                REG_ARFR0)));
+       RT_TRACE(rtlpriv, COMP_RATR, DBG_DMESG, "%x\n",
+                rtl_read_dword(rtlpriv, REG_ARFR0));
 }
 
 void rtl92cu_update_hal_rate_mask(struct ieee80211_hw *hw, u8 rssi_level)
@@ -2344,17 +2164,16 @@ void rtl92cu_update_hal_rate_mask(struct ieee80211_hw *hw, u8 rssi_level)
                        ratr_bitmap &= 0x0f0ff0ff;
                break;
        }
-       RT_TRACE(rtlpriv, COMP_RATR, DBG_DMESG, ("ratr_bitmap :%x\n",
-                ratr_bitmap));
+       RT_TRACE(rtlpriv, COMP_RATR, DBG_DMESG, "ratr_bitmap :%x\n",
+                ratr_bitmap);
        *(u32 *)&rate_mask = ((ratr_bitmap & 0x0fffffff) |
                                      ratr_index << 28);
        rate_mask[4] = macid | (shortgi ? 0x20 : 0x00) | 0x80;
-       RT_TRACE(rtlpriv, COMP_RATR, DBG_DMESG, ("Rate_index:%x, "
-                                               "ratr_val:%x, %x:%x:%x:%x:%x\n",
-                                               ratr_index, ratr_bitmap,
-                                               rate_mask[0], rate_mask[1],
-                                               rate_mask[2], rate_mask[3],
-                                               rate_mask[4]));
+       RT_TRACE(rtlpriv, COMP_RATR, DBG_DMESG,
+                "Rate_index:%x, ratr_val:%x, %x:%x:%x:%x:%x\n",
+                ratr_index, ratr_bitmap,
+                rate_mask[0], rate_mask[1], rate_mask[2], rate_mask[3],
+                rate_mask[4]);
        rtl92c_fill_h2c_cmd(hw, H2C_RA_MASK, 5, rate_mask);
 }
 
@@ -2404,7 +2223,7 @@ bool rtl92cu_gpio_radio_on_off_checking(struct ieee80211_hw *hw, u8 * valid)
                        e_rfpowerstate_toset = (u1tmp & BIT(7)) ?
                                               ERFOFF : ERFON;
                        RT_TRACE(rtlpriv, COMP_POWER, DBG_DMESG,
-                                ("pwrdown, 0x5c(BIT7)=%02x\n", u1tmp));
+                                "pwrdown, 0x5c(BIT7)=%02x\n", u1tmp);
                } else {
                        rtl_write_byte(rtlpriv, REG_MAC_PINMUX_CFG,
                                       rtl_read_byte(rtlpriv,
@@ -2413,27 +2232,26 @@ bool rtl92cu_gpio_radio_on_off_checking(struct ieee80211_hw *hw, u8 * valid)
                        e_rfpowerstate_toset  = (u1tmp & BIT(3)) ?
                                                 ERFON : ERFOFF;
                        RT_TRACE(rtlpriv, COMP_POWER, DBG_DMESG,
-                               ("GPIO_IN=%02x\n", u1tmp));
+                                "GPIO_IN=%02x\n", u1tmp);
                }
-               RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD, ("N-SS RF =%x\n",
-                        e_rfpowerstate_toset));
+               RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD, "N-SS RF =%x\n",
+                        e_rfpowerstate_toset);
        }
        if ((ppsc->hwradiooff) && (e_rfpowerstate_toset == ERFON)) {
-               RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD, ("GPIOChangeRF  - HW "
-                        "Radio ON, RF ON\n"));
+               RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
+                        "GPIOChangeRF  - HW Radio ON, RF ON\n");
                ppsc->hwradiooff = false;
                actuallyset = true;
        } else if ((!ppsc->hwradiooff) && (e_rfpowerstate_toset  ==
                    ERFOFF)) {
-               RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD, ("GPIOChangeRF  - HW"
-                        " Radio OFF\n"));
+               RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
+                        "GPIOChangeRF  - HW Radio OFF\n");
                ppsc->hwradiooff = true;
                actuallyset = true;
        } else {
-               RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD ,
-                        ("pHalData->bHwRadioOff and eRfPowerStateToSet do not"
-                        " match: pHalData->bHwRadioOff %x, eRfPowerStateToSet "
-                        "%x\n", ppsc->hwradiooff, e_rfpowerstate_toset));
+               RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
+                        "pHalData->bHwRadioOff and eRfPowerStateToSet do not match: pHalData->bHwRadioOff %x, eRfPowerStateToSet %x\n",
+                        ppsc->hwradiooff, e_rfpowerstate_toset);
        }
        if (actuallyset) {
                ppsc->hwradiooff = true;
index 32f85cb..f41a3aa 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2009-2010  Realtek Corporation.
+ * Copyright(c) 2009-2012  Realtek Corporation.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
index 2ff9d83..75a2deb 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2009-2010  Realtek Corporation. All rights reserved.
+ * Copyright(c) 2009-2012  Realtek Corporation. All rights reserved.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
@@ -47,8 +47,8 @@ void rtl92cu_sw_led_on(struct ieee80211_hw *hw, struct rtl_led *pled)
        u8 ledcfg;
        struct rtl_priv *rtlpriv = rtl_priv(hw);
 
-       RT_TRACE(rtlpriv, COMP_LED, DBG_LOUD,
-                ("LedAddr:%X ledpin=%d\n", REG_LEDCFG2, pled->ledpin));
+       RT_TRACE(rtlpriv, COMP_LED, DBG_LOUD, "LedAddr:%X ledpin=%d\n",
+                REG_LEDCFG2, pled->ledpin);
        ledcfg = rtl_read_byte(rtlpriv, REG_LEDCFG2);
        switch (pled->ledpin) {
        case LED_PIN_GPIO0:
@@ -62,7 +62,7 @@ void rtl92cu_sw_led_on(struct ieee80211_hw *hw, struct rtl_led *pled)
                break;
        default:
                RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                        ("switch case not process\n"));
+                        "switch case not processed\n");
                break;
        }
        pled->ledon = true;
@@ -74,8 +74,8 @@ void rtl92cu_sw_led_off(struct ieee80211_hw *hw, struct rtl_led *pled)
        struct rtl_usb_priv *usbpriv = rtl_usbpriv(hw);
        u8 ledcfg;
 
-       RT_TRACE(rtlpriv, COMP_LED, DBG_LOUD,
-                ("LedAddr:%X ledpin=%d\n", REG_LEDCFG2, pled->ledpin));
+       RT_TRACE(rtlpriv, COMP_LED, DBG_LOUD, "LedAddr:%X ledpin=%d\n",
+                REG_LEDCFG2, pled->ledpin);
        ledcfg = rtl_read_byte(rtlpriv, REG_LEDCFG2);
        switch (pled->ledpin) {
        case LED_PIN_GPIO0:
@@ -95,7 +95,7 @@ void rtl92cu_sw_led_off(struct ieee80211_hw *hw, struct rtl_led *pled)
                break;
        default:
                RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                        ("switch case not process\n"));
+                        "switch case not processed\n");
                break;
        }
        pled->ledon = false;
@@ -136,7 +136,6 @@ void rtl92cu_led_control(struct ieee80211_hw *hw,
             ledaction == LED_CTL_POWER_ON)) {
                return;
        }
-       RT_TRACE(rtlpriv, COMP_LED, DBG_LOUD, ("ledaction %d,\n",
-                               ledaction));
+       RT_TRACE(rtlpriv, COMP_LED, DBG_LOUD, "ledaction %d\n", ledaction);
        _rtl92cu_sw_led_control(hw, ledaction);
 }
index decaee4..0f37227 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2009-2010  Realtek Corporation. All rights reserved.
+ * Copyright(c) 2009-2012  Realtek Corporation. All rights reserved.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
index 9e0c8fc..025bdc2 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2009-2010  Realtek Corporation. All rights reserved.
+ * Copyright(c) 2009-2012  Realtek Corporation. All rights reserved.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
  *
 ****************************************************************************/
 
-#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
-
-#include <linux/module.h>
-
 #include "../wifi.h"
 #include "../pci.h"
 #include "../usb.h"
@@ -44,6 +40,8 @@
 #include "mac.h"
 #include "trx.h"
 
+#include <linux/module.h>
+
 /* macro to shorten lines */
 
 #define LINK_Q ui_link_quality
@@ -57,6 +55,7 @@ void rtl92c_read_chip_version(struct ieee80211_hw *hw)
        struct rtl_phy *rtlphy = &(rtlpriv->phy);
        struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
        enum version_8192c chip_version = VERSION_UNKNOWN;
+       const char *versionid;
        u32 value32;
 
        value32 = rtl_read_dword(rtlpriv, REG_SYS_CFG);
@@ -84,88 +83,69 @@ void rtl92c_read_chip_version(struct ieee80211_hw *hw)
                }
        }
        rtlhal->version  = (enum version_8192c)chip_version;
-       pr_info("rtl8192cu: Chip version 0x%x\n", chip_version);
+       pr_info("Chip version 0x%x\n", chip_version);
        switch (rtlhal->version) {
        case VERSION_NORMAL_TSMC_CHIP_92C_1T2R:
-               RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
-                ("Chip Version ID: VERSION_B_CHIP_92C.\n"));
+               versionid = "NORMAL_B_CHIP_92C";
                break;
        case VERSION_NORMAL_TSMC_CHIP_92C:
-               RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
-                       ("Chip Version ID: VERSION_NORMAL_TSMC_CHIP_92C.\n"));
+               versionid = "NORMAL_TSMC_CHIP_92C";
                break;
        case VERSION_NORMAL_TSMC_CHIP_88C:
-               RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
-                       ("Chip Version ID: VERSION_NORMAL_TSMC_CHIP_88C.\n"));
+               versionid = "NORMAL_TSMC_CHIP_88C";
                break;
        case VERSION_NORMAL_UMC_CHIP_92C_1T2R_A_CUT:
-               RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
-                       ("Chip Version ID: VERSION_NORMAL_UMC_CHIP_i"
-                       "92C_1T2R_A_CUT.\n"));
+               versionid = "NORMAL_UMC_CHIP_i92C_1T2R_A_CUT";
                break;
        case VERSION_NORMAL_UMC_CHIP_92C_A_CUT:
-               RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
-                       ("Chip Version ID: VERSION_NORMAL_UMC_CHIP_"
-                       "92C_A_CUT.\n"));
+               versionid = "NORMAL_UMC_CHIP_92C_A_CUT";
                break;
        case VERSION_NORMAL_UMC_CHIP_88C_A_CUT:
-               RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
-                       ("Chip Version ID: VERSION_NORMAL_UMC_CHIP"
-                       "_88C_A_CUT.\n"));
+               versionid = "NORMAL_UMC_CHIP_88C_A_CUT";
                break;
        case VERSION_NORMAL_UMC_CHIP_92C_1T2R_B_CUT:
-               RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
-                       ("Chip Version ID: VERSION_NORMAL_UMC_CHIP"
-                       "_92C_1T2R_B_CUT.\n"));
+               versionid = "NORMAL_UMC_CHIP_92C_1T2R_B_CUT";
                break;
        case VERSION_NORMAL_UMC_CHIP_92C_B_CUT:
-               RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
-                       ("Chip Version ID: VERSION_NORMAL_UMC_CHIP"
-                       "_92C_B_CUT.\n"));
+               versionid = "NORMAL_UMC_CHIP_92C_B_CUT";
                break;
        case VERSION_NORMAL_UMC_CHIP_88C_B_CUT:
-               RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
-                       ("Chip Version ID: VERSION_NORMAL_UMC_CHIP"
-                       "_88C_B_CUT.\n"));
+               versionid = "NORMAL_UMC_CHIP_88C_B_CUT";
                break;
        case VERSION_NORMA_UMC_CHIP_8723_1T1R_A_CUT:
-               RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
-                       ("Chip Version ID: VERSION_NORMA_UMC_CHIP"
-                       "_8723_1T1R_A_CUT.\n"));
+               versionid = "NORMAL_UMC_CHIP_8723_1T1R_A_CUT";
                break;
        case VERSION_NORMA_UMC_CHIP_8723_1T1R_B_CUT:
-               RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
-                       ("Chip Version ID: VERSION_NORMA_UMC_CHIP"
-                       "_8723_1T1R_B_CUT.\n"));
+               versionid = "NORMAL_UMC_CHIP_8723_1T1R_B_CUT";
                break;
        case VERSION_TEST_CHIP_92C:
-               RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
-                       ("Chip Version ID: VERSION_TEST_CHIP_92C.\n"));
+               versionid = "TEST_CHIP_92C";
                break;
        case VERSION_TEST_CHIP_88C:
-               RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
-                       ("Chip Version ID: VERSION_TEST_CHIP_88C.\n"));
+               versionid = "TEST_CHIP_88C";
                break;
        default:
-               RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
-                       ("Chip Version ID: ???????????????.\n"));
+               versionid = "UNKNOWN";
                break;
        }
+       RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
+                "Chip Version ID: %s\n", versionid);
+
        if (IS_92C_SERIAL(rtlhal->version))
                rtlphy->rf_type =
                         (IS_92C_1T2R(rtlhal->version)) ? RF_1T2R : RF_2T2R;
        else
                rtlphy->rf_type = RF_1T1R;
        RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
-                ("Chip RF Type: %s\n", (rtlphy->rf_type == RF_2T2R) ?
-                 "RF_2T2R" : "RF_1T1R"));
+                "Chip RF Type: %s\n",
+                rtlphy->rf_type == RF_2T2R ? "RF_2T2R" : "RF_1T1R");
        if (get_rf_type(rtlphy) == RF_1T1R)
                rtlpriv->dm.rfpath_rxenable[0] = true;
        else
                rtlpriv->dm.rfpath_rxenable[0] =
                    rtlpriv->dm.rfpath_rxenable[1] = true;
-       RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, ("VersionID = 0x%4x\n",
-                                               rtlhal->version));
+       RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "VersionID = 0x%4x\n",
+                rtlhal->version);
 }
 
 /**
@@ -192,9 +172,8 @@ bool rtl92c_llt_write(struct ieee80211_hw *hw, u32 address, u32 data)
                        break;
                if (count > POLLING_LLT_THRESHOLD) {
                        RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                                ("Failed to polling write LLT done at"
-                                " address %d! _LLT_OP_VALUE(%x)\n",
-                                address, _LLT_OP_VALUE(value)));
+                                "Failed to polling write LLT done at address %d! _LLT_OP_VALUE(%x)\n",
+                                address, _LLT_OP_VALUE(value));
                        status = false;
                        break;
                }
@@ -272,7 +251,7 @@ void rtl92c_set_key(struct ieee80211_hw *hw, u32 key_index,
                u8 cam_offset = 0;
                u8 clear_number = 5;
 
-               RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG, ("clear_all\n"));
+               RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG, "clear_all\n");
                for (idx = 0; idx < clear_number; idx++) {
                        rtl_cam_mark_invalid(hw, cam_offset + idx);
                        rtl_cam_empty_entry(hw, cam_offset + idx);
@@ -298,7 +277,7 @@ void rtl92c_set_key(struct ieee80211_hw *hw, u32 key_index,
                        break;
                default:
                        RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                               ("iillegal switch case\n"));
+                                "illegal switch case\n");
                        enc_algo = CAM_TKIP;
                        break;
                }
@@ -317,26 +296,26 @@ void rtl92c_set_key(struct ieee80211_hw *hw, u32 key_index,
                }
                if (rtlpriv->sec.key_len[key_index] == 0) {
                        RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG,
-                                ("delete one entry\n"));
+                                "delete one entry\n");
                        rtl_cam_delete_one_entry(hw, p_macaddr, entry_id);
                } else {
                        RT_TRACE(rtlpriv, COMP_SEC, DBG_LOUD,
-                                ("The insert KEY length is %d\n",
-                                 rtlpriv->sec.key_len[PAIRWISE_KEYIDX]));
+                                "The insert KEY length is %d\n",
+                                rtlpriv->sec.key_len[PAIRWISE_KEYIDX]);
                        RT_TRACE(rtlpriv, COMP_SEC, DBG_LOUD,
-                                ("The insert KEY  is %x %x\n",
-                                 rtlpriv->sec.key_buf[0][0],
-                                 rtlpriv->sec.key_buf[0][1]));
+                                "The insert KEY is %x %x\n",
+                                rtlpriv->sec.key_buf[0][0],
+                                rtlpriv->sec.key_buf[0][1]);
                        RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG,
-                                ("add one entry\n"));
+                                "add one entry\n");
                        if (is_pairwise) {
                                RT_PRINT_DATA(rtlpriv, COMP_SEC, DBG_LOUD,
-                                             "Pairwiase Key content :",
+                                             "Pairwise Key content",
                                              rtlpriv->sec.pairwise_key,
                                              rtlpriv->sec.
                                              key_len[PAIRWISE_KEYIDX]);
                                RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG,
-                                        ("set Pairwiase key\n"));
+                                        "set Pairwise key\n");
 
                                rtl_cam_add_one_entry(hw, macaddr, key_index,
                                                entry_id, enc_algo,
@@ -345,7 +324,7 @@ void rtl92c_set_key(struct ieee80211_hw *hw, u32 key_index,
                                                key_buf[key_index]);
                        } else {
                                RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG,
-                                        ("set group key\n"));
+                                        "set group key\n");
                                if (mac->opmode == NL80211_IFTYPE_ADHOC) {
                                        rtl_cam_add_one_entry(hw,
                                                rtlefuse->dev_addr,
@@ -421,8 +400,8 @@ void rtl92c_set_qos(struct ieee80211_hw *hw, int aci)
            AC_PARAM_ECW_MAX_OFFSET;
        u4b_ac_param |= (u32) le16_to_cpu(mac->ac[aci].tx_op) <<
                         AC_PARAM_TXOP_OFFSET;
-       RT_TRACE(rtlpriv, COMP_QOS, DBG_LOUD,
-                ("queue:%x, ac_param:%x\n", aci, u4b_ac_param));
+       RT_TRACE(rtlpriv, COMP_QOS, DBG_LOUD, "queue:%x, ac_param:%x\n",
+                aci, u4b_ac_param);
        switch (aci) {
        case AC1_BK:
                rtl_write_dword(rtlpriv, REG_EDCA_BK_PARAM, u4b_ac_param);
@@ -437,7 +416,7 @@ void rtl92c_set_qos(struct ieee80211_hw *hw, int aci)
                rtl_write_dword(rtlpriv, REG_EDCA_VO_PARAM, u4b_ac_param);
                break;
        default:
-               RT_ASSERT(false, ("invalid aci: %d !\n", aci));
+               RT_ASSERT(false, "invalid aci: %d !\n", aci);
                break;
        }
 }
@@ -453,14 +432,14 @@ void rtl92c_set_mac_addr(struct ieee80211_hw *hw, const u8 *addr)
        for (i = 0 ; i < ETH_ALEN ; i++)
                rtl_write_byte(rtlpriv, (REG_MACID + i), *(addr+i));
 
-       RT_TRACE(rtlpriv, COMP_CMD, DBG_DMESG, ("MAC Address: %02X-%02X-%02X-"
-               "%02X-%02X-%02X\n",
-               rtl_read_byte(rtlpriv, REG_MACID),
-               rtl_read_byte(rtlpriv, REG_MACID+1),
-               rtl_read_byte(rtlpriv, REG_MACID+2),
-               rtl_read_byte(rtlpriv, REG_MACID+3),
-               rtl_read_byte(rtlpriv, REG_MACID+4),
-               rtl_read_byte(rtlpriv, REG_MACID+5)));
+       RT_TRACE(rtlpriv, COMP_CMD, DBG_DMESG,
+                "MAC Address: %02X-%02X-%02X-%02X-%02X-%02X\n",
+                rtl_read_byte(rtlpriv, REG_MACID),
+                rtl_read_byte(rtlpriv, REG_MACID+1),
+                rtl_read_byte(rtlpriv, REG_MACID+2),
+                rtl_read_byte(rtlpriv, REG_MACID+3),
+                rtl_read_byte(rtlpriv, REG_MACID+4),
+                rtl_read_byte(rtlpriv, REG_MACID+5));
 }
 
 void rtl92c_init_driver_info_size(struct ieee80211_hw *hw, u8 size)
@@ -478,26 +457,26 @@ int rtl92c_set_network_type(struct ieee80211_hw *hw, enum nl80211_iftype type)
        case NL80211_IFTYPE_UNSPECIFIED:
                value = NT_NO_LINK;
                RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
-                       ("Set Network type to NO LINK!\n"));
+                        "Set Network type to NO LINK!\n");
                break;
        case NL80211_IFTYPE_ADHOC:
                value = NT_LINK_AD_HOC;
                RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
-                       ("Set Network type to Ad Hoc!\n"));
+                        "Set Network type to Ad Hoc!\n");
                break;
        case NL80211_IFTYPE_STATION:
                value = NT_LINK_AP;
                RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
-                       ("Set Network type to STA!\n"));
+                        "Set Network type to STA!\n");
                break;
        case NL80211_IFTYPE_AP:
                value = NT_AS_AP;
                RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
-                       ("Set Network type to AP!\n"));
+                        "Set Network type to AP!\n");
                break;
        default:
                RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
-                       ("Network type %d not support!\n", type));
+                        "Network type %d not supported!\n", type);
                return -EOPNOTSUPP;
        }
        rtl_write_byte(rtlpriv, (REG_CR + 2), value);
index 626d88e..bf53652 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2009-2010  Realtek Corporation. All rights reserved.
+ * Copyright(c) 2009-2012  Realtek Corporation. All rights reserved.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
index e49cf22..34e5630 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2009-2010  Realtek Corporation.
+ * Copyright(c) 2009-2012  Realtek Corporation.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
@@ -44,9 +44,9 @@ u32 rtl92cu_phy_query_rf_reg(struct ieee80211_hw *hw,
        u32 original_value, readback_value, bitshift;
        struct rtl_phy *rtlphy = &(rtlpriv->phy);
 
-       RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, ("regaddr(%#x), "
-                                              "rfpath(%#x), bitmask(%#x)\n",
-                                              regaddr, rfpath, bitmask));
+       RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
+                "regaddr(%#x), rfpath(%#x), bitmask(%#x)\n",
+                regaddr, rfpath, bitmask);
        if (rtlphy->rf_mode != RF_OP_BY_FW) {
                original_value = _rtl92c_phy_rf_serial_read(hw,
                                                            rfpath, regaddr);
@@ -57,9 +57,8 @@ u32 rtl92cu_phy_query_rf_reg(struct ieee80211_hw *hw,
        bitshift = _rtl92c_phy_calculate_bit_shift(bitmask);
        readback_value = (original_value & bitmask) >> bitshift;
        RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
-                ("regaddr(%#x), rfpath(%#x), "
-                 "bitmask(%#x), original_value(%#x)\n",
-                 regaddr, rfpath, bitmask, original_value));
+                "regaddr(%#x), rfpath(%#x), bitmask(%#x), original_value(%#x)\n",
+                regaddr, rfpath, bitmask, original_value);
        return readback_value;
 }
 
@@ -72,8 +71,8 @@ void rtl92cu_phy_set_rf_reg(struct ieee80211_hw *hw,
        u32 original_value, bitshift;
 
        RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
-                ("regaddr(%#x), bitmask(%#x), data(%#x), rfpath(%#x)\n",
-                 regaddr, bitmask, data, rfpath));
+                "regaddr(%#x), bitmask(%#x), data(%#x), rfpath(%#x)\n",
+                regaddr, bitmask, data, rfpath);
        if (rtlphy->rf_mode != RF_OP_BY_FW) {
                if (bitmask != RFREG_OFFSET_MASK) {
                        original_value = _rtl92c_phy_rf_serial_read(hw,
@@ -97,9 +96,9 @@ void rtl92cu_phy_set_rf_reg(struct ieee80211_hw *hw,
                }
                _rtl92c_phy_fw_rf_serial_write(hw, rfpath, regaddr, data);
        }
-       RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, ("regaddr(%#x), "
-                                              "bitmask(%#x), data(%#x), rfpath(%#x)\n",
-                                              regaddr, bitmask, data, rfpath));
+       RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
+                "regaddr(%#x), bitmask(%#x), data(%#x), rfpath(%#x)\n",
+                regaddr, bitmask, data, rfpath);
 }
 
 bool rtl92cu_phy_mac_config(struct ieee80211_hw *hw)
@@ -152,11 +151,10 @@ bool _rtl92cu_phy_config_mac_with_headerfile(struct ieee80211_hw *hw)
        u32 arraylength;
        u32 *ptrarray;
 
-       RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, ("Read Rtl819XMACPHY_Array\n"));
+       RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, "Read Rtl819XMACPHY_Array\n");
        arraylength =  rtlphy->hwparam_tables[MAC_REG].length ;
        ptrarray = rtlphy->hwparam_tables[MAC_REG].pdata;
-       RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
-                ("Img:RTL8192CEMAC_2T_ARRAY\n"));
+       RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, "Img:RTL8192CEMAC_2T_ARRAY\n");
        for (i = 0; i < arraylength; i = i + 2)
                rtl_write_byte(rtlpriv, ptrarray[i], (u8) ptrarray[i + 1]);
        return true;
@@ -202,10 +200,9 @@ bool _rtl92cu_phy_config_bb_with_headerfile(struct ieee80211_hw *hw,
                                      phy_regarray_table[i + 1]);
                        udelay(1);
                        RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
-                                ("The phy_regarray_table[0] is %x"
-                                 " Rtl819XPHY_REGArray[1] is %x\n",
-                                 phy_regarray_table[i],
-                                 phy_regarray_table[i + 1]));
+                                "The phy_regarray_table[0] is %x Rtl819XPHY_REGArray[1] is %x\n",
+                                phy_regarray_table[i],
+                                phy_regarray_table[i + 1]);
                }
        } else if (configtype == BASEBAND_CONFIG_AGC_TAB) {
                for (i = 0; i < agctab_arraylen; i = i + 2) {
@@ -213,10 +210,9 @@ bool _rtl92cu_phy_config_bb_with_headerfile(struct ieee80211_hw *hw,
                                      agctab_array_table[i + 1]);
                        udelay(1);
                        RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
-                                ("The agctab_array_table[0] is "
-                                 "%x Rtl819XPHY_REGArray[1] is %x\n",
-                                 agctab_array_table[i],
-                                 agctab_array_table[i + 1]));
+                                "The agctab_array_table[0] is %x Rtl819XPHY_REGArray[1] is %x\n",
+                                agctab_array_table[i],
+                                agctab_array_table[i + 1]);
                }
        }
        return true;
@@ -255,7 +251,7 @@ bool _rtl92cu_phy_config_bb_with_pgheaderfile(struct ieee80211_hw *hw,
                }
        } else {
                RT_TRACE(rtlpriv, COMP_SEND, DBG_TRACE,
-                        ("configtype != BaseBand_Config_PHY_REG\n"));
+                        "configtype != BaseBand_Config_PHY_REG\n");
        }
        return true;
 }
@@ -277,20 +273,20 @@ bool rtl92cu_phy_config_rf_with_headerfile(struct ieee80211_hw *hw,
                radiob_arraylen = rtlphy->hwparam_tables[RADIOB_2T].length;
                radiob_array_table = rtlphy->hwparam_tables[RADIOB_2T].pdata;
                RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
-                        ("Radio_A:RTL8192CERADIOA_2TARRAY\n"));
+                        "Radio_A:RTL8192CERADIOA_2TARRAY\n");
                RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
-                        ("Radio_B:RTL8192CE_RADIOB_2TARRAY\n"));
+                        "Radio_B:RTL8192CE_RADIOB_2TARRAY\n");
        } else {
                radioa_arraylen = rtlphy->hwparam_tables[RADIOA_1T].length;
                radioa_array_table = rtlphy->hwparam_tables[RADIOA_1T].pdata;
                radiob_arraylen = rtlphy->hwparam_tables[RADIOB_1T].length;
                radiob_array_table = rtlphy->hwparam_tables[RADIOB_1T].pdata;
                RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
-                        ("Radio_A:RTL8192CE_RADIOA_1TARRAY\n"));
+                        "Radio_A:RTL8192CE_RADIOA_1TARRAY\n");
                RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
-                        ("Radio_B:RTL8192CE_RADIOB_1TARRAY\n"));
+                        "Radio_B:RTL8192CE_RADIOB_1TARRAY\n");
        }
-       RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, ("Radio No %x\n", rfpath));
+       RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, "Radio No %x\n", rfpath);
        switch (rfpath) {
        case RF90_PATH_A:
                for (i = 0; i < radioa_arraylen; i = i + 2) {
@@ -338,11 +334,11 @@ bool rtl92cu_phy_config_rf_with_headerfile(struct ieee80211_hw *hw,
                break;
        case RF90_PATH_C:
                RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                        ("switch case not process\n"));
+                        "switch case not processed\n");
                break;
        case RF90_PATH_D:
                RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                        ("switch case not process\n"));
+                        "switch case not processed\n");
                break;
        }
        return true;
@@ -357,10 +353,9 @@ void rtl92cu_phy_set_bw_mode_callback(struct ieee80211_hw *hw)
        u8 reg_bw_opmode;
        u8 reg_prsr_rsc;
 
-       RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE,
-                ("Switch to %s bandwidth\n",
-                 rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20 ?
-                 "20MHz" : "40MHz"))
+       RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE, "Switch to %s bandwidth\n",
+                rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20 ?
+                "20MHz" : "40MHz");
        if (is_hal_stop(rtlhal)) {
                rtlphy->set_bwmode_inprogress = false;
                return;
@@ -381,7 +376,7 @@ void rtl92cu_phy_set_bw_mode_callback(struct ieee80211_hw *hw)
                break;
        default:
                RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                        ("unknown bandwidth: %#X\n", rtlphy->current_chan_bw));
+                        "unknown bandwidth: %#X\n", rtlphy->current_chan_bw);
                break;
        }
        switch (rtlphy->current_chan_bw) {
@@ -403,12 +398,12 @@ void rtl92cu_phy_set_bw_mode_callback(struct ieee80211_hw *hw)
                break;
        default:
                RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                        ("unknown bandwidth: %#X\n", rtlphy->current_chan_bw));
+                        "unknown bandwidth: %#X\n", rtlphy->current_chan_bw);
                break;
        }
        rtl92cu_phy_rf6052_set_bandwidth(hw, rtlphy->current_chan_bw);
        rtlphy->set_bwmode_inprogress = false;
-       RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE, ("<==\n"));
+       RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE, "<==\n");
 }
 
 void rtl92cu_bb_block_on(struct ieee80211_hw *hw)
@@ -480,18 +475,16 @@ static bool _rtl92cu_phy_set_rf_power_state(struct ieee80211_hw *hw,
                        do {
                                InitializeCount++;
                                RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG,
-                                        ("IPS Set eRf nic enable\n"));
+                                        "IPS Set eRf nic enable\n");
                                rtstatus = rtl_ps_enable_nic(hw);
-                       } while ((rtstatus != true)
-                                && (InitializeCount < 10));
+                       } while (!rtstatus && (InitializeCount < 10));
                        RT_CLEAR_PS_LEVEL(ppsc,
                                          RT_RF_OFF_LEVL_HALT_NIC);
                } else {
                        RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG,
-                                ("Set ERFON sleeped:%d ms\n",
-                                 jiffies_to_msecs(jiffies -
-                                                  ppsc->
-                                                  last_sleep_jiffies)));
+                                "Set ERFON sleeped:%d ms\n",
+                                jiffies_to_msecs(jiffies -
+                                                 ppsc->last_sleep_jiffies));
                        ppsc->last_awake_jiffies = jiffies;
                        rtl92ce_phy_set_rf_on(hw);
                }
@@ -513,27 +506,25 @@ static bool _rtl92cu_phy_set_rf_power_state(struct ieee80211_hw *hw,
                                continue;
                        } else {
                                RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
-                                        ("eRf Off/Sleep: %d times "
-                                         "TcbBusyQueue[%d] "
-                                         "=%d before doze!\n", (i + 1),
-                                         queue_id,
-                                         skb_queue_len(&ring->queue)));
+                                        "eRf Off/Sleep: %d times TcbBusyQueue[%d] =%d before doze!\n",
+                                        i + 1,
+                                        queue_id,
+                                        skb_queue_len(&ring->queue));
                                udelay(10);
                                i++;
                        }
                        if (i >= MAX_DOZE_WAITING_TIMES_9x) {
                                RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
-                                        ("\nERFOFF: %d times "
-                                         "TcbBusyQueue[%d] = %d !\n",
-                                         MAX_DOZE_WAITING_TIMES_9x,
-                                         queue_id,
-                                         skb_queue_len(&ring->queue)));
+                                        "ERFOFF: %d times TcbBusyQueue[%d] = %d !\n",
+                                        MAX_DOZE_WAITING_TIMES_9x,
+                                        queue_id,
+                                        skb_queue_len(&ring->queue));
                                break;
                        }
                }
                if (ppsc->reg_rfps_level & RT_RF_OFF_LEVL_HALT_NIC) {
                        RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG,
-                                ("IPS Set eRf nic disable\n"));
+                                "IPS Set eRf nic disable\n");
                        rtl_ps_disable_nic(hw);
                        RT_SET_PS_LEVEL(ppsc, RT_RF_OFF_LEVL_HALT_NIC);
                } else {
@@ -557,33 +548,30 @@ static bool _rtl92cu_phy_set_rf_power_state(struct ieee80211_hw *hw,
                                continue;
                        } else {
                                RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
-                                        ("eRf Off/Sleep: %d times "
-                                         "TcbBusyQueue[%d] =%d before "
-                                         "doze!\n", (i + 1), queue_id,
-                                         skb_queue_len(&ring->queue)));
+                                        "eRf Off/Sleep: %d times TcbBusyQueue[%d] =%d before doze!\n",
+                                        i + 1, queue_id,
+                                        skb_queue_len(&ring->queue));
                                udelay(10);
                                i++;
                        }
                        if (i >= MAX_DOZE_WAITING_TIMES_9x) {
                                RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
-                                        ("\n ERFSLEEP: %d times "
-                                         "TcbBusyQueue[%d] = %d !\n",
-                                         MAX_DOZE_WAITING_TIMES_9x,
-                                         queue_id,
-                                         skb_queue_len(&ring->queue)));
+                                        "ERFSLEEP: %d times TcbBusyQueue[%d] = %d !\n",
+                                        MAX_DOZE_WAITING_TIMES_9x,
+                                        queue_id,
+                                        skb_queue_len(&ring->queue));
                                break;
                        }
                }
                RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG,
-                        ("Set ERFSLEEP awaked:%d ms\n",
-                         jiffies_to_msecs(jiffies -
-                                          ppsc->last_awake_jiffies)));
+                        "Set ERFSLEEP awaked:%d ms\n",
+                        jiffies_to_msecs(jiffies - ppsc->last_awake_jiffies));
                ppsc->last_sleep_jiffies = jiffies;
                _rtl92c_phy_set_rf_sleep(hw);
                break;
        default:
                RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                        ("switch case not process\n"));
+                        "switch case not processed\n");
                bresult = false;
                break;
        }
index ff81a61..42b0686 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2009-2010  Realtek Corporation.
+ * Copyright(c) 2009-2012  Realtek Corporation.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
index 7f1be61..8b81465 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2009-2010  Realtek Corporation.
+ * Copyright(c) 2009-2012  Realtek Corporation.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
index 1e851aa..506b9a0 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2009-2010  Realtek Corporation.
+ * Copyright(c) 2009-2012  Realtek Corporation.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
@@ -56,7 +56,7 @@ void rtl92cu_phy_rf6052_set_bandwidth(struct ieee80211_hw *hw, u8 bandwidth)
                break;
        default:
                RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                        ("unknown bandwidth: %#X\n", bandwidth));
+                        "unknown bandwidth: %#X\n", bandwidth);
                break;
        }
 }
@@ -140,26 +140,26 @@ void rtl92cu_phy_rf6052_set_cck_txpower(struct ieee80211_hw *hw,
        rtl_set_bbreg(hw, RTXAGC_A_CCK1_MCS32, MASKBYTE1, tmpval);
 
        RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
-               ("CCK PWR 1M (rf-A) = 0x%x (reg 0x%x)\n", tmpval,
-                RTXAGC_A_CCK1_MCS32));
+               "CCK PWR 1M (rf-A) = 0x%x (reg 0x%x)\n",
+               tmpval, RTXAGC_A_CCK1_MCS32);
 
        tmpval = tx_agc[RF90_PATH_A] >> 8;
        if (mac->mode == WIRELESS_MODE_B)
                tmpval = tmpval & 0xff00ffff;
        rtl_set_bbreg(hw, RTXAGC_B_CCK11_A_CCK2_11, 0xffffff00, tmpval);
        RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
-               ("CCK PWR 2~11M (rf-A) = 0x%x (reg 0x%x)\n", tmpval,
-                RTXAGC_B_CCK11_A_CCK2_11));
+               "CCK PWR 2~11M (rf-A) = 0x%x (reg 0x%x)\n",
+               tmpval, RTXAGC_B_CCK11_A_CCK2_11);
        tmpval = tx_agc[RF90_PATH_B] >> 24;
        rtl_set_bbreg(hw, RTXAGC_B_CCK11_A_CCK2_11, MASKBYTE0, tmpval);
        RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
-               ("CCK PWR 11M (rf-B) = 0x%x (reg 0x%x)\n", tmpval,
-                RTXAGC_B_CCK11_A_CCK2_11));
+               "CCK PWR 11M (rf-B) = 0x%x (reg 0x%x)\n",
+               tmpval, RTXAGC_B_CCK11_A_CCK2_11);
        tmpval = tx_agc[RF90_PATH_B] & 0x00ffffff;
        rtl_set_bbreg(hw, RTXAGC_B_CCK1_55_MCS32, 0xffffff00, tmpval);
        RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
-               ("CCK PWR 1~5.5M (rf-B) = 0x%x (reg 0x%x)\n", tmpval,
-                RTXAGC_B_CCK1_55_MCS32));
+               "CCK PWR 1~5.5M (rf-B) = 0x%x (reg 0x%x)\n",
+               tmpval, RTXAGC_B_CCK1_55_MCS32);
 }
 
 static void rtl92c_phy_get_power_base(struct ieee80211_hw *hw,
@@ -181,8 +181,8 @@ static void rtl92c_phy_get_power_base(struct ieee80211_hw *hw,
                    (powerBase0 << 8) | powerBase0;
                *(ofdmbase + i) = powerBase0;
                RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
-                       (" [OFDM power base index rf(%c) = 0x%x]\n",
-                        ((i == 0) ? 'A' : 'B'), *(ofdmbase + i)));
+                       " [OFDM power base index rf(%c) = 0x%x]\n",
+                       i == 0 ? 'A' : 'B', *(ofdmbase + i));
        }
        for (i = 0; i < 2; i++) {
                if (rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20) {
@@ -194,8 +194,8 @@ static void rtl92c_phy_get_power_base(struct ieee80211_hw *hw,
                    (powerBase1 << 16) | (powerBase1 << 8) | powerBase1;
                *(mcsbase + i) = powerBase1;
                RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
-                       (" [MCS power base index rf(%c) = 0x%x]\n",
-                        ((i == 0) ? 'A' : 'B'), *(mcsbase + i)));
+                       " [MCS power base index rf(%c) = 0x%x]\n",
+                       i == 0 ? 'A' : 'B', *(mcsbase + i));
        }
 }
 
@@ -219,8 +219,8 @@ static void _rtl92c_get_txpower_writeval_by_regulatory(struct ieee80211_hw *hw,
                            [chnlgroup][index + (rf ? 8 : 0)]
                            + ((index < 2) ? powerBase0[rf] : powerBase1[rf]);
                        RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
-                               ("RTK better performance,writeVal(%c) = 0x%x\n",
-                               ((rf == 0) ? 'A' : 'B'), writeVal));
+                               "RTK better performance,writeVal(%c) = 0x%x\n",
+                               rf == 0 ? 'A' : 'B', writeVal);
                        break;
                case 1:
                        if (rtlphy->pwrgroup_cnt == 1)
@@ -244,32 +244,31 @@ static void _rtl92c_get_txpower_writeval_by_regulatory(struct ieee80211_hw *hw,
                                        ((index < 2) ? powerBase0[rf] :
                                        powerBase1[rf]);
                        RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
-                               ("Realtek regulatory, 20MHz, "
-                               "writeVal(%c) = 0x%x\n",
-                               ((rf == 0) ? 'A' : 'B'), writeVal));
+                               "Realtek regulatory, 20MHz, writeVal(%c) = 0x%x\n",
+                               rf == 0 ? 'A' : 'B', writeVal);
                        break;
                case 2:
                        writeVal = ((index < 2) ? powerBase0[rf] :
                                   powerBase1[rf]);
                        RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
-                               ("Better regulatory,writeVal(%c) = 0x%x\n",
-                                ((rf == 0) ? 'A' : 'B'), writeVal));
+                               "Better regulatory,writeVal(%c) = 0x%x\n",
+                               rf == 0 ? 'A' : 'B', writeVal);
                        break;
                case 3:
                        chnlgroup = 0;
                        if (rtlphy->current_chan_bw ==
                            HT_CHANNEL_WIDTH_20_40) {
                                RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
-                                       ("customer's limit, 40MHzrf(%c) = "
-                                       "0x%x\n", ((rf == 0) ? 'A' : 'B'),
+                                       "customer's limit, 40MHzrf(%c) = 0x%x\n",
+                                       rf == 0 ? 'A' : 'B',
                                        rtlefuse->pwrgroup_ht40[rf]
-                                       [channel - 1]));
+                                       [channel - 1]);
                        } else {
                                RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
-                                       ("customer's limit, 20MHz rf(%c) = "
-                                       "0x%x\n", ((rf == 0) ? 'A' : 'B'),
+                                       "customer's limit, 20MHz rf(%c) = 0x%x\n",
+                                       rf == 0 ? 'A' : 'B',
                                        rtlefuse->pwrgroup_ht20[rf]
-                                       [channel - 1]));
+                                       [channel - 1]);
                        }
                        for (i = 0; i < 4; i++) {
                                pwr_diff_limit[i] =
@@ -297,22 +296,22 @@ static void _rtl92c_get_txpower_writeval_by_regulatory(struct ieee80211_hw *hw,
                            (pwr_diff_limit[2] << 16) |
                            (pwr_diff_limit[1] << 8) | (pwr_diff_limit[0]);
                        RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
-                               ("Customer's limit rf(%c) = 0x%x\n",
-                                ((rf == 0) ? 'A' : 'B'), customer_limit));
+                               "Customer's limit rf(%c) = 0x%x\n",
+                               rf == 0 ? 'A' : 'B', customer_limit);
                        writeVal = customer_limit + ((index < 2) ?
                                   powerBase0[rf] : powerBase1[rf]);
                        RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
-                               ("Customer, writeVal rf(%c)= 0x%x\n",
-                                ((rf == 0) ? 'A' : 'B'), writeVal));
+                               "Customer, writeVal rf(%c)= 0x%x\n",
+                               rf == 0 ? 'A' : 'B', writeVal);
                        break;
                default:
                        chnlgroup = 0;
                        writeVal = rtlphy->mcs_txpwrlevel_origoffset[chnlgroup]
                                   [index + (rf ? 8 : 0)] + ((index < 2) ?
                                   powerBase0[rf] : powerBase1[rf]);
-                       RTPRINT(rtlpriv, FPHY, PHY_TXPWR, ("RTK better "
-                               "performance, writeValrf(%c) = 0x%x\n",
-                               ((rf == 0) ? 'A' : 'B'), writeVal));
+                       RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
+                               "RTK better performance, writeValrf(%c) = 0x%x\n",
+                               rf == 0 ? 'A' : 'B', writeVal);
                        break;
                }
                if (rtlpriv->dm.dynamic_txhighpower_lvl ==
@@ -365,7 +364,7 @@ static void _rtl92c_write_ofdm_power_reg(struct ieee80211_hw *hw,
                        regoffset = regoffset_b[index];
                rtl_set_bbreg(hw, regoffset, MASKDWORD, writeVal);
                RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
-                       ("Set 0x%x = %08x\n", regoffset, writeVal));
+                       "Set 0x%x = %08x\n", regoffset, writeVal);
                if (((get_rf_type(rtlphy) == RF_2T2R) &&
                     (regoffset == RTXAGC_A_MCS15_MCS12 ||
                      regoffset == RTXAGC_B_MCS15_MCS12)) ||
@@ -480,13 +479,13 @@ static bool _rtl92c_phy_rf6052_config_parafile(struct ieee80211_hw *hw)
                                      BRFSI_RFENV << 16, u4_regvalue);
                        break;
                }
-               if (rtstatus != true) {
+               if (!rtstatus) {
                        RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
-                                ("Radio[%d] Fail!!", rfpath));
+                                "Radio[%d] Fail!!", rfpath);
                        goto phy_rf_cfg_fail;
                }
        }
-       RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, ("<---\n"));
+       RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, "<---\n");
        return rtstatus;
 phy_rf_cfg_fail:
        return rtstatus;
index 500a209..090fd33 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2009-2010  Realtek Corporation.
+ * Copyright(c) 2009-2012  Realtek Corporation.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
index 6d2ca77..82c8528 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2009-2010  Realtek Corporation. All rights reserved.
+ * Copyright(c) 2009-2012  Realtek Corporation. All rights reserved.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
@@ -41,7 +41,6 @@
 #include "trx.h"
 #include "led.h"
 #include "hw.h"
-#include <linux/vmalloc.h>
 #include <linux/module.h>
 
 MODULE_AUTHOR("Georgia         <georgia@realtek.com>");
@@ -54,7 +53,6 @@ MODULE_FIRMWARE("rtlwifi/rtl8192cufw.bin");
 static int rtl92cu_init_sw_vars(struct ieee80211_hw *hw)
 {
        struct rtl_priv *rtlpriv = rtl_priv(hw);
-       const struct firmware *firmware;
        int err;
 
        rtlpriv->dm.dm_initialgain_enable = true;
@@ -62,29 +60,21 @@ static int rtl92cu_init_sw_vars(struct ieee80211_hw *hw)
        rtlpriv->dm.disable_framebursting = false;
        rtlpriv->dm.thermalvalue = 0;
        rtlpriv->dbg.global_debuglevel = rtlpriv->cfg->mod_params->debug;
-       rtlpriv->rtlhal.pfirmware = vmalloc(0x4000);
+
+       /* for firmware buf */
+       rtlpriv->rtlhal.pfirmware = vzalloc(0x4000);
        if (!rtlpriv->rtlhal.pfirmware) {
                RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                        ("Can't alloc buffer for fw.\n"));
+                        "Can't alloc buffer for fw\n");
                return 1;
        }
-       /* request fw */
-       err = request_firmware(&firmware, rtlpriv->cfg->fw_name,
-                       rtlpriv->io.dev);
-       if (err) {
-               RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                        ("Failed to request firmware!\n"));
-               return 1;
-       }
-       if (firmware->size > 0x4000) {
-               RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                        ("Firmware is too big!\n"));
-               release_firmware(firmware);
-               return 1;
-       }
-       memcpy(rtlpriv->rtlhal.pfirmware, firmware->data, firmware->size);
-       rtlpriv->rtlhal.fwsize = firmware->size;
-       release_firmware(firmware);
+
+       pr_info("Loading firmware %s\n", rtlpriv->cfg->fw_name);
+       rtlpriv->max_fw_size = 0x4000;
+       err = request_firmware_nowait(THIS_MODULE, 1,
+                                     rtlpriv->cfg->fw_name, rtlpriv->io.dev,
+                                     GFP_KERNEL, hw, rtl_fw_cb);
+
 
        return 0;
 }
index 43b1177..a1310ab 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2009-2010  Realtek Corporation. All rights reserved.
+ * Copyright(c) 2009-2012  Realtek Corporation. All rights reserved.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
index d57ef5e..966be51 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2009-2010  Realtek Corporation.
+ * Copyright(c) 2009-2012  Realtek Corporation.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
index c3d5cd8..4b020e9 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2009-2010  Realtek Corporation. All rights reserved.
+ * Copyright(c) 2009-2012  Realtek Corporation. All rights reserved.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
index b3cc7b9..21bc827 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2009-2010  Realtek Corporation. All rights reserved.
+ * Copyright(c) 2009-2012  Realtek Corporation. All rights reserved.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
@@ -108,7 +108,7 @@ static void _TwoOutEpMapping(struct ieee80211_hw *hw, bool bIsChipB,
 
        if (bwificfg) { /* for WMM */
                RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
-                        ("USB Chip-B & WMM Setting.....\n"));
+                        "USB Chip-B & WMM Setting.....\n");
                ep_map->ep_mapping[RTL_TXQ_BE]  = 2;
                ep_map->ep_mapping[RTL_TXQ_BK]  = 3;
                ep_map->ep_mapping[RTL_TXQ_VI]  = 3;
@@ -118,7 +118,7 @@ static void _TwoOutEpMapping(struct ieee80211_hw *hw, bool bIsChipB,
                ep_map->ep_mapping[RTL_TXQ_HI]  = 2;
        } else { /* typical setting */
                RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
-                        ("USB typical Setting.....\n"));
+                        "USB typical Setting.....\n");
                ep_map->ep_mapping[RTL_TXQ_BE]  = 3;
                ep_map->ep_mapping[RTL_TXQ_BK]  = 3;
                ep_map->ep_mapping[RTL_TXQ_VI]  = 2;
@@ -135,7 +135,7 @@ static void _ThreeOutEpMapping(struct ieee80211_hw *hw, bool  bwificfg,
        struct rtl_priv *rtlpriv = rtl_priv(hw);
        if (bwificfg) { /* for WMM */
                RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
-                        ("USB 3EP Setting for WMM.....\n"));
+                        "USB 3EP Setting for WMM.....\n");
                ep_map->ep_mapping[RTL_TXQ_BE]  = 5;
                ep_map->ep_mapping[RTL_TXQ_BK]  = 3;
                ep_map->ep_mapping[RTL_TXQ_VI]  = 3;
@@ -145,7 +145,7 @@ static void _ThreeOutEpMapping(struct ieee80211_hw *hw, bool  bwificfg,
                ep_map->ep_mapping[RTL_TXQ_HI]  = 2;
        } else { /* typical setting */
                RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
-                        ("USB 3EP Setting for typical.....\n"));
+                        "USB 3EP Setting for typical.....\n");
                ep_map->ep_mapping[RTL_TXQ_BE]  = 5;
                ep_map->ep_mapping[RTL_TXQ_BK]  = 5;
                ep_map->ep_mapping[RTL_TXQ_VI]  = 3;
@@ -244,8 +244,8 @@ u16 rtl8192cu_mq_to_hwq(__le16 fc, u16 mac80211_queue_index)
                break;
        default:
                hw_queue_index = RTL_TXQ_BE;
-               RT_ASSERT(false, ("QSLT_BE queue, skb_queue:%d\n",
-                         mac80211_queue_index));
+               RT_ASSERT(false, "QSLT_BE queue, skb_queue:%d\n",
+                         mac80211_queue_index);
                break;
        }
 out:
@@ -270,23 +270,23 @@ static enum rtl_desc_qsel _rtl8192cu_mq_to_descq(struct ieee80211_hw *hw,
        case 0: /* VO */
                qsel = QSLT_VO;
                RT_TRACE(rtlpriv, COMP_USB, DBG_DMESG,
-                        ("VO queue, set qsel = 0x%x\n", QSLT_VO));
+                        "VO queue, set qsel = 0x%x\n", QSLT_VO);
                break;
        case 1: /* VI */
                qsel = QSLT_VI;
                RT_TRACE(rtlpriv, COMP_USB, DBG_DMESG,
-                        ("VI queue, set qsel = 0x%x\n", QSLT_VI));
+                        "VI queue, set qsel = 0x%x\n", QSLT_VI);
                break;
        case 3: /* BK */
                qsel = QSLT_BK;
                RT_TRACE(rtlpriv, COMP_USB, DBG_DMESG,
-                        ("BK queue, set qsel = 0x%x\n", QSLT_BK));
+                        "BK queue, set qsel = 0x%x\n", QSLT_BK);
                break;
        case 2: /* BE */
        default:
                qsel = QSLT_BE;
                RT_TRACE(rtlpriv, COMP_USB, DBG_DMESG,
-                        ("BE queue, set qsel = 0x%x\n", QSLT_BE));
+                        "BE queue, set qsel = 0x%x\n", QSLT_BE);
                break;
        }
 out:
@@ -422,17 +422,17 @@ static void _rtl_rx_process(struct ieee80211_hw *hw, struct sk_buff *skb)
        bv = ieee80211_is_probe_resp(fc);
        if (bv)
                RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
-                        ("Got probe response frame.\n"));
+                        "Got probe response frame\n");
        if (ieee80211_is_beacon(fc))
-               RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
-                        ("Got beacon frame.\n"));
+               RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "Got beacon frame\n");
        if (ieee80211_is_data(fc))
-               RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, ("Got data frame.\n"));
+               RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "Got data frame\n");
        RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
-                ("Fram: fc = 0x%X addr1 = 0x%02X:0x%02X:0x%02X:0x%02X:0x%02X:"
-                "0x%02X\n", fc, (u32)hdr->addr1[0], (u32)hdr->addr1[1],
-                (u32)hdr->addr1[2], (u32)hdr->addr1[3], (u32)hdr->addr1[4],
-                (u32)hdr->addr1[5]));
+                "Fram: fc = 0x%X addr1 = 0x%02X:0x%02X:0x%02X:0x%02X:0x%02X:0x%02X\n",
+                fc,
+                (u32)hdr->addr1[0], (u32)hdr->addr1[1],
+                (u32)hdr->addr1[2], (u32)hdr->addr1[3],
+                (u32)hdr->addr1[4], (u32)hdr->addr1[5]);
        memcpy(IEEE80211_SKB_RXCB(skb), rx_status, sizeof(*rx_status));
        ieee80211_rx_irqsafe(hw, skb);
 }
@@ -594,7 +594,7 @@ void rtl92cu_tx_fill_desc(struct ieee80211_hw *hw,
        if (ieee80211_is_data_qos(fc)) {
                if (mac->rdg_en) {
                        RT_TRACE(rtlpriv, COMP_SEND, DBG_TRACE,
-                                ("Enable RDG function.\n"));
+                                "Enable RDG function\n");
                        SET_TX_DESC_RDG_ENABLE(txdesc, 1);
                        SET_TX_DESC_HTC(txdesc, 1);
                }
@@ -620,7 +620,7 @@ void rtl92cu_tx_fill_desc(struct ieee80211_hw *hw,
                SET_TX_DESC_BMC(txdesc, 1);
        _rtl_fill_usb_tx_desc(txdesc);
        _rtl_tx_desc_checksum(txdesc);
-       RT_TRACE(rtlpriv, COMP_SEND, DBG_TRACE, (" %s ==>\n", __func__));
+       RT_TRACE(rtlpriv, COMP_SEND, DBG_TRACE, "==>\n");
 }
 
 void rtl92cu_fill_fake_txdesc(struct ieee80211_hw *hw, u8 * pDesc,
@@ -677,7 +677,7 @@ void rtl92cu_tx_fill_cmddesc(struct ieee80211_hw *hw,
                SET_TX_DESC_HWSEQ_EN(pdesc, 1);
                SET_TX_DESC_PKT_ID(pdesc, 8);
        }
-       RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_LOUD, "H2C Tx Cmd Content\n",
+       RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_LOUD, "H2C Tx Cmd Content",
                      pdesc, RTL_TX_DESC_SIZE);
 }
 
index 53de5f6..332b06e 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2009-2010  Realtek Corporation. All rights reserved.
+ * Copyright(c) 2009-2012  Realtek Corporation. All rights reserved.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
index 9463047..eafdf76 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2009-2010  Realtek Corporation.
+ * Copyright(c) 2009-2012  Realtek Corporation.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
index 3cd0736..4737018 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2009-2010  Realtek Corporation.
+ * Copyright(c) 2009-2012  Realtek Corporation.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
@@ -246,23 +246,21 @@ static void rtl92d_dm_false_alarm_counter_statistics(struct ieee80211_hw *hw)
                rtl_set_bbreg(hw, RCCK0_FALSEALARMREPORT, 0x0000c000, 2);
                rtl92d_release_cckandrw_pagea_ctl(hw, &flag);
        }
-       RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD, ("Cnt_Fast_Fsync_fail = %x, "
-                "Cnt_SB_Search_fail = %x\n",
+       RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD,
+                "Cnt_Fast_Fsync_fail = %x, Cnt_SB_Search_fail = %x\n",
                 falsealm_cnt->cnt_fast_fsync_fail,
-                falsealm_cnt->cnt_sb_search_fail));
-       RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD, ("Cnt_Parity_Fail = %x, "
-                "Cnt_Rate_Illegal = %x, Cnt_Crc8_fail = %x, "
-                "Cnt_Mcs_fail = %x\n",
+                falsealm_cnt->cnt_sb_search_fail);
+       RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD,
+                "Cnt_Parity_Fail = %x, Cnt_Rate_Illegal = %x, Cnt_Crc8_fail = %x, Cnt_Mcs_fail = %x\n",
                 falsealm_cnt->cnt_parity_fail,
                 falsealm_cnt->cnt_rate_illegal,
                 falsealm_cnt->cnt_crc8_fail,
-                falsealm_cnt->cnt_mcs_fail));
+                falsealm_cnt->cnt_mcs_fail);
        RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD,
-                ("Cnt_Ofdm_fail = %x, " "Cnt_Cck_fail = %x, "
-                "Cnt_all = %x\n",
+                "Cnt_Ofdm_fail = %x, Cnt_Cck_fail = %x, Cnt_all = %x\n",
                 falsealm_cnt->cnt_ofdm_fail,
                 falsealm_cnt->cnt_cck_fail,
-                falsealm_cnt->cnt_all));
+                falsealm_cnt->cnt_all);
 }
 
 static void rtl92d_dm_find_minimum_rssi(struct ieee80211_hw *hw)
@@ -275,7 +273,7 @@ static void rtl92d_dm_find_minimum_rssi(struct ieee80211_hw *hw)
            (rtlpriv->dm.UNDEC_SM_PWDB == 0)) {
                de_digtable.min_undecorated_pwdb_for_dm = 0;
                RT_TRACE(rtlpriv, COMP_BB_POWERSAVING, DBG_LOUD,
-                        ("Not connected to any\n"));
+                        "Not connected to any\n");
        }
        if (mac->link_state >= MAC80211_LINKED) {
                if (mac->opmode == NL80211_IFTYPE_AP ||
@@ -283,25 +281,25 @@ static void rtl92d_dm_find_minimum_rssi(struct ieee80211_hw *hw)
                        de_digtable.min_undecorated_pwdb_for_dm =
                            rtlpriv->dm.UNDEC_SM_PWDB;
                        RT_TRACE(rtlpriv, COMP_BB_POWERSAVING, DBG_LOUD,
-                                ("AP Client PWDB = 0x%lx\n",
-                                 rtlpriv->dm.UNDEC_SM_PWDB));
+                                "AP Client PWDB = 0x%lx\n",
+                                rtlpriv->dm.UNDEC_SM_PWDB);
                } else {
                        de_digtable.min_undecorated_pwdb_for_dm =
                            rtlpriv->dm.undecorated_smoothed_pwdb;
                        RT_TRACE(rtlpriv, COMP_BB_POWERSAVING, DBG_LOUD,
-                                ("STA Default Port PWDB = 0x%x\n",
-                                 de_digtable.min_undecorated_pwdb_for_dm));
+                                "STA Default Port PWDB = 0x%x\n",
+                                de_digtable.min_undecorated_pwdb_for_dm);
                }
        } else {
                de_digtable.min_undecorated_pwdb_for_dm =
                    rtlpriv->dm.UNDEC_SM_PWDB;
                RT_TRACE(rtlpriv, COMP_BB_POWERSAVING, DBG_LOUD,
-                        ("AP Ext Port or disconnet PWDB = 0x%x\n",
-                         de_digtable.min_undecorated_pwdb_for_dm));
+                        "AP Ext Port or disconnect PWDB = 0x%x\n",
+                        de_digtable.min_undecorated_pwdb_for_dm);
        }
 
-       RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD, ("MinUndecoratedPWDBForDM =%d\n",
-                       de_digtable.min_undecorated_pwdb_for_dm));
+       RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD, "MinUndecoratedPWDBForDM =%d\n",
+                de_digtable.min_undecorated_pwdb_for_dm);
 }
 
 static void rtl92d_dm_cck_packet_detection_thresh(struct ieee80211_hw *hw)
@@ -340,14 +338,14 @@ static void rtl92d_dm_cck_packet_detection_thresh(struct ieee80211_hw *hw)
                }
                de_digtable.pre_cck_pd_state = de_digtable.cur_cck_pd_state;
        }
-       RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD, ("CurSTAConnectState=%s\n",
-                (de_digtable.cursta_connectctate == DIG_STA_CONNECT ?
-                "DIG_STA_CONNECT " : "DIG_STA_DISCONNECT")));
-       RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD, ("CCKPDStage=%s\n",
-                (de_digtable.cur_cck_pd_state == CCK_PD_STAGE_LOWRSSI ?
-                "Low RSSI " : "High RSSI ")));
-       RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD, ("is92d single phy =%x\n",
-                IS_92D_SINGLEPHY(rtlpriv->rtlhal.version)));
+       RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD, "CurSTAConnectState=%s\n",
+                de_digtable.cursta_connectctate == DIG_STA_CONNECT ?
+                "DIG_STA_CONNECT " : "DIG_STA_DISCONNECT");
+       RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD, "CCKPDStage=%s\n",
+                de_digtable.cur_cck_pd_state == CCK_PD_STAGE_LOWRSSI ?
+                "Low RSSI " : "High RSSI ");
+       RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD, "is92d single phy =%x\n",
+                IS_92D_SINGLEPHY(rtlpriv->rtlhal.version));
 
 }
 
@@ -355,12 +353,12 @@ void rtl92d_dm_write_dig(struct ieee80211_hw *hw)
 {
        struct rtl_priv *rtlpriv = rtl_priv(hw);
 
-       RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD, ("cur_igvalue = 0x%x, "
-                "pre_igvalue = 0x%x, backoff_val = %d\n",
+       RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD,
+                "cur_igvalue = 0x%x, pre_igvalue = 0x%x, backoff_val = %d\n",
                 de_digtable.cur_igvalue, de_digtable.pre_igvalue,
-                de_digtable.backoff_val));
+                de_digtable.backoff_val);
        if (de_digtable.dig_enable_flag == false) {
-               RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD, ("DIG is disabled\n"));
+               RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD, "DIG is disabled\n");
                de_digtable.pre_igvalue = 0x17;
                return;
        }
@@ -377,22 +375,21 @@ static void rtl92d_early_mode_enabled(struct rtl_priv *rtlpriv)
 {
        if ((rtlpriv->mac80211.link_state >= MAC80211_LINKED) &&
            (rtlpriv->mac80211.vendor == PEER_CISCO)) {
-               RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD,
-                        ("IOT_PEER = CISCO\n"));
+               RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD, "IOT_PEER = CISCO\n");
                if (de_digtable.last_min_undecorated_pwdb_for_dm >= 50
                    && de_digtable.min_undecorated_pwdb_for_dm < 50) {
                        rtl_write_byte(rtlpriv, REG_EARLY_MODE_CONTROL, 0x00);
                        RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD,
-                                ("Early Mode Off\n"));
+                                "Early Mode Off\n");
                } else if (de_digtable.last_min_undecorated_pwdb_for_dm <= 55 &&
                           de_digtable.min_undecorated_pwdb_for_dm > 55) {
                        rtl_write_byte(rtlpriv, REG_EARLY_MODE_CONTROL, 0x0f);
                        RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD,
-                                ("Early Mode On\n"));
+                                "Early Mode On\n");
                }
        } else if (!(rtl_read_byte(rtlpriv, REG_EARLY_MODE_CONTROL) & 0xf)) {
                rtl_write_byte(rtlpriv, REG_EARLY_MODE_CONTROL, 0x0f);
-               RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD, ("Early Mode On\n"));
+               RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD, "Early Mode On\n");
        }
 }
 
@@ -402,13 +399,13 @@ static void rtl92d_dm_dig(struct ieee80211_hw *hw)
        u8 value_igi = de_digtable.cur_igvalue;
        struct false_alarm_statistics *falsealm_cnt = &(rtlpriv->falsealm_cnt);
 
-       RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD, ("==>\n"));
+       RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD, "==>\n");
        if (rtlpriv->rtlhal.earlymode_enable) {
                rtl92d_early_mode_enabled(rtlpriv);
                de_digtable.last_min_undecorated_pwdb_for_dm =
                                 de_digtable.min_undecorated_pwdb_for_dm;
        }
-       if (rtlpriv->dm.dm_initialgain_enable == false)
+       if (!rtlpriv->dm.dm_initialgain_enable)
                return;
 
        /* because we will send data pkt when scanning
@@ -421,7 +418,7 @@ static void rtl92d_dm_dig(struct ieee80211_hw *hw)
        /* Not STA mode return tmp */
        if (rtlpriv->mac80211.opmode != NL80211_IFTYPE_STATION)
                return;
-       RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD, ("progress\n"));
+       RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD, "progress\n");
        /* Decide the current status and if modify initial gain or not */
        if (rtlpriv->mac80211.link_state >= MAC80211_LINKED)
                de_digtable.cursta_connectctate = DIG_STA_CONNECT;
@@ -438,16 +435,16 @@ static void rtl92d_dm_dig(struct ieee80211_hw *hw)
        else if (falsealm_cnt->cnt_all >= DM_DIG_FA_TH2)
                value_igi += 2;
        RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD,
-                ("dm_DIG() Before: large_fa_hit=%d, forbidden_igi=%x\n",
-                de_digtable.large_fa_hit, de_digtable.forbidden_igi));
+                "dm_DIG() Before: large_fa_hit=%d, forbidden_igi=%x\n",
+                de_digtable.large_fa_hit, de_digtable.forbidden_igi);
        RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD,
-                ("dm_DIG() Before: Recover_cnt=%d, rx_gain_range_min=%x\n",
-                de_digtable.recover_cnt, de_digtable.rx_gain_range_min));
+                "dm_DIG() Before: Recover_cnt=%d, rx_gain_range_min=%x\n",
+                de_digtable.recover_cnt, de_digtable.rx_gain_range_min);
 
        /* deal with abnorally large false alarm */
        if (falsealm_cnt->cnt_all > 10000) {
                RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD,
-                        ("dm_DIG(): Abnornally false alarm case.\n"));
+                        "dm_DIG(): Abnormally false alarm case\n");
 
                de_digtable.large_fa_hit++;
                if (de_digtable.forbidden_igi < de_digtable.cur_igvalue) {
@@ -486,11 +483,11 @@ static void rtl92d_dm_dig(struct ieee80211_hw *hw)
                }
        }
        RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD,
-                ("dm_DIG() After: large_fa_hit=%d, forbidden_igi=%x\n",
-                 de_digtable.large_fa_hit, de_digtable.forbidden_igi));
+                "dm_DIG() After: large_fa_hit=%d, forbidden_igi=%x\n",
+                de_digtable.large_fa_hit, de_digtable.forbidden_igi);
        RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD,
-                ("dm_DIG() After: recover_cnt=%d, rx_gain_range_min=%x\n",
-                 de_digtable.recover_cnt, de_digtable.rx_gain_range_min));
+                "dm_DIG() After: recover_cnt=%d, rx_gain_range_min=%x\n",
+                de_digtable.recover_cnt, de_digtable.rx_gain_range_min);
 
        if (value_igi > DM_DIG_MAX)
                value_igi = DM_DIG_MAX;
@@ -500,7 +497,7 @@ static void rtl92d_dm_dig(struct ieee80211_hw *hw)
        rtl92d_dm_write_dig(hw);
        if (rtlpriv->rtlhal.current_bandtype != BAND_ON_5G)
                rtl92d_dm_cck_packet_detection_thresh(hw);
-       RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD, ("<<==\n"));
+       RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD, "<<==\n");
 }
 
 static void rtl92d_dm_init_dynamic_txpower(struct ieee80211_hw *hw)
@@ -528,7 +525,7 @@ static void rtl92d_dm_dynamic_txpower(struct ieee80211_hw *hw)
        if ((mac->link_state < MAC80211_LINKED) &&
            (rtlpriv->dm.UNDEC_SM_PWDB == 0)) {
                RT_TRACE(rtlpriv, COMP_POWER, DBG_TRACE,
-                        ("Not connected to any\n"));
+                        "Not connected to any\n");
                rtlpriv->dm.dynamic_txhighpower_lvl = TXHIGHPWRLEVEL_NORMAL;
                rtlpriv->dm.last_dtp_lvl = TXHIGHPWRLEVEL_NORMAL;
                return;
@@ -538,40 +535,40 @@ static void rtl92d_dm_dynamic_txpower(struct ieee80211_hw *hw)
                        undecorated_smoothed_pwdb =
                            rtlpriv->dm.UNDEC_SM_PWDB;
                        RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
-                                ("IBSS Client PWDB = 0x%lx\n",
-                                 undecorated_smoothed_pwdb));
+                                "IBSS Client PWDB = 0x%lx\n",
+                                undecorated_smoothed_pwdb);
                } else {
                        undecorated_smoothed_pwdb =
                            rtlpriv->dm.undecorated_smoothed_pwdb;
                        RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
-                                ("STA Default Port PWDB = 0x%lx\n",
-                                 undecorated_smoothed_pwdb));
+                                "STA Default Port PWDB = 0x%lx\n",
+                                undecorated_smoothed_pwdb);
                }
        } else {
                undecorated_smoothed_pwdb =
                    rtlpriv->dm.UNDEC_SM_PWDB;
 
                RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
-                        ("AP Ext Port PWDB = 0x%lx\n",
-                         undecorated_smoothed_pwdb));
+                        "AP Ext Port PWDB = 0x%lx\n",
+                        undecorated_smoothed_pwdb);
        }
        if (rtlhal->current_bandtype == BAND_ON_5G) {
                if (undecorated_smoothed_pwdb >= 0x33) {
                        rtlpriv->dm.dynamic_txhighpower_lvl =
                                                 TXHIGHPWRLEVEL_LEVEL2;
                        RT_TRACE(rtlpriv, COMP_HIPWR, DBG_LOUD,
-                                ("5G:TxHighPwrLevel_Level2 (TxPwr=0x0)\n"));
+                                "5G:TxHighPwrLevel_Level2 (TxPwr=0x0)\n");
                } else if ((undecorated_smoothed_pwdb < 0x33)
                           && (undecorated_smoothed_pwdb >= 0x2b)) {
                        rtlpriv->dm.dynamic_txhighpower_lvl =
                                                 TXHIGHPWRLEVEL_LEVEL1;
                        RT_TRACE(rtlpriv, COMP_HIPWR, DBG_LOUD,
-                                ("5G:TxHighPwrLevel_Level1 (TxPwr=0x10)\n"));
+                                "5G:TxHighPwrLevel_Level1 (TxPwr=0x10)\n");
                } else if (undecorated_smoothed_pwdb < 0x2b) {
                        rtlpriv->dm.dynamic_txhighpower_lvl =
                                                 TXHIGHPWRLEVEL_NORMAL;
                        RT_TRACE(rtlpriv, COMP_HIPWR, DBG_LOUD,
-                                ("5G:TxHighPwrLevel_Normal\n"));
+                                "5G:TxHighPwrLevel_Normal\n");
                }
        } else {
                if (undecorated_smoothed_pwdb >=
@@ -579,7 +576,7 @@ static void rtl92d_dm_dynamic_txpower(struct ieee80211_hw *hw)
                        rtlpriv->dm.dynamic_txhighpower_lvl =
                                                 TXHIGHPWRLEVEL_LEVEL2;
                        RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
-                                ("TXHIGHPWRLEVEL_LEVEL1 (TxPwr=0x0)\n"));
+                                "TXHIGHPWRLEVEL_LEVEL1 (TxPwr=0x0)\n");
                } else
                    if ((undecorated_smoothed_pwdb <
                         (TX_POWER_NEAR_FIELD_THRESH_LVL2 - 3))
@@ -589,19 +586,19 @@ static void rtl92d_dm_dynamic_txpower(struct ieee80211_hw *hw)
                        rtlpriv->dm.dynamic_txhighpower_lvl =
                                                 TXHIGHPWRLEVEL_LEVEL1;
                        RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
-                                ("TXHIGHPWRLEVEL_LEVEL1 (TxPwr=0x10)\n"));
+                                "TXHIGHPWRLEVEL_LEVEL1 (TxPwr=0x10)\n");
                } else if (undecorated_smoothed_pwdb <
                           (TX_POWER_NEAR_FIELD_THRESH_LVL1 - 5)) {
                        rtlpriv->dm.dynamic_txhighpower_lvl =
                                                 TXHIGHPWRLEVEL_NORMAL;
                        RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
-                                ("TXHIGHPWRLEVEL_NORMAL\n"));
+                                "TXHIGHPWRLEVEL_NORMAL\n");
                }
        }
        if ((rtlpriv->dm.dynamic_txhighpower_lvl != rtlpriv->dm.last_dtp_lvl)) {
                RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
-                        ("PHY_SetTxPowerLevel8192S() Channel = %d\n",
-                         rtlphy->current_channel));
+                        "PHY_SetTxPowerLevel8192S() Channel = %d\n",
+                        rtlphy->current_channel);
                rtl92d_phy_set_txpower_level(hw, rtlphy->current_channel);
        }
        rtlpriv->dm.last_dtp_lvl = rtlpriv->dm.dynamic_txhighpower_lvl;
@@ -717,7 +714,7 @@ static void rtl92d_dm_rxgain_tracking_thermalmeter(struct ieee80211_hw *hw)
        u4tmp = (index_mapping[(rtlpriv->efuse.eeprom_thermalmeter -
                                rtlpriv->dm.thermalvalue_rxgain)]) << 12;
        RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
-                ("===> Rx Gain %x\n", u4tmp));
+                "===> Rx Gain %x\n", u4tmp);
        for (i = RF90_PATH_A; i < rtlpriv->phy.num_total_rfpath; i++)
                rtl_set_rfreg(hw, i, 0x3C, BRFREGOFFSETMASK,
                              (rtlpriv->phy.reg_rf3c[i] & (~(0xF000))) | u4tmp);
@@ -741,27 +738,22 @@ static void rtl92d_bandtype_2_4G(struct ieee80211_hw *hw, long *temp_cckg,
                        if (!memcmp((void *)&temp_cck,
                            (void *)&cckswing_table_ch14[i][2], 4)) {
                                *cck_index_old = (u8) i;
-                               RT_TRACE(rtlpriv,
-                                        COMP_POWER_TRACKING,
-                                        DBG_LOUD,
-                                        ("Initial reg0x%x = 0x%lx, "
-                                         "cck_index=0x%x, ch 14 %d\n",
-                                         RCCK0_TXFILTER2,
-                                         temp_cck, *cck_index_old,
-                                         rtlpriv->dm.cck_inch14));
+                               RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
+                                        "Initial reg0x%x = 0x%lx, cck_index=0x%x, ch 14 %d\n",
+                                        RCCK0_TXFILTER2, temp_cck,
+                                        *cck_index_old,
+                                        rtlpriv->dm.cck_inch14);
                                break;
                        }
                } else {
                        if (!memcmp((void *) &temp_cck,
                            &cckswing_table_ch1ch13[i][2], 4)) {
                                *cck_index_old = (u8) i;
-                               RT_TRACE(rtlpriv, COMP_POWER_TRACKING,
-                                        DBG_LOUD,
-                                        ("Initial reg0x%x = 0x%lx, "
-                                        "cck_index = 0x%x, ch14 %d\n",
-                                        RCCK0_TXFILTER2,
-                                        temp_cck, *cck_index_old,
-                                        rtlpriv->dm.cck_inch14));
+                               RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
+                                        "Initial reg0x%x = 0x%lx, cck_index = 0x%x, ch14 %d\n",
+                                        RCCK0_TXFILTER2, temp_cck,
+                                        *cck_index_old,
+                                        rtlpriv->dm.cck_inch14);
                                break;
                        }
                }
@@ -884,12 +876,12 @@ static void rtl92d_dm_txpower_tracking_callback_thermalmeter(
        };
 
        rtlpriv->dm.txpower_trackinginit = true;
-       RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD, ("\n"));
+       RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD, "\n");
        thermalvalue = (u8) rtl_get_rfreg(hw, RF90_PATH_A, RF_T_METER, 0xf800);
        RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
-                ("Readback Thermal Meter = 0x%x pre thermal meter 0x%x "
-                "eeprom_thermalmeter 0x%x\n", thermalvalue,
-                rtlpriv->dm.thermalvalue, rtlefuse->eeprom_thermalmeter));
+                "Readback Thermal Meter = 0x%x pre thermal meter 0x%x eeprom_thermalmeter 0x%x\n",
+                thermalvalue,
+                rtlpriv->dm.thermalvalue, rtlefuse->eeprom_thermalmeter);
        rtl92d_phy_ap_calibrate(hw, (thermalvalue -
                                     rtlefuse->eeprom_thermalmeter));
        if (is2t)
@@ -904,10 +896,9 @@ static void rtl92d_dm_txpower_tracking_callback_thermalmeter(
                                ofdm_index_old[0] = (u8) i;
 
                                RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
-                                        ("Initial pathA ele_d reg0x%x = 0x%lx,"
-                                        " ofdm_index=0x%x\n",
+                                        "Initial pathA ele_d reg0x%x = 0x%lx, ofdm_index=0x%x\n",
                                         ROFDM0_XATxIQIMBALANCE,
-                                        ele_d, ofdm_index_old[0]));
+                                        ele_d, ofdm_index_old[0]);
                                break;
                        }
                }
@@ -920,11 +911,9 @@ static void rtl92d_dm_txpower_tracking_callback_thermalmeter(
                                        ofdm_index_old[1] = (u8) i;
                                        RT_TRACE(rtlpriv, COMP_POWER_TRACKING,
                                                 DBG_LOUD,
-                                                ("Initial pathB ele_d reg "
-                                                "0x%x = 0x%lx, ofdm_index "
-                                                "= 0x%x\n",
+                                                "Initial pathB ele_d reg 0x%x = 0x%lx, ofdm_index = 0x%x\n",
                                                 ROFDM0_XBTxIQIMBALANCE, ele_d,
-                                                ofdm_index_old[1]));
+                                                ofdm_index_old[1]);
                                        break;
                                }
                        }
@@ -952,7 +941,7 @@ static void rtl92d_dm_txpower_tracking_callback_thermalmeter(
                                rtlpriv->dm.ofdm_index[i] = ofdm_index_old[i];
                        rtlpriv->dm.cck_index = cck_index_old;
                        RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
-                                ("reload ofdm index for band switch\n"));
+                                "reload ofdm index for band switch\n");
                }
                rtlpriv->dm.thermalvalue_avg
                            [rtlpriv->dm.thermalvalue_avg_index] = thermalvalue;
@@ -995,12 +984,10 @@ static void rtl92d_dm_txpower_tracking_callback_thermalmeter(
                        (thermalvalue - rtlpriv->dm.thermalvalue_rxgain) :
                        (rtlpriv->dm.thermalvalue_rxgain - thermalvalue);
                RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
-                        ("Readback Thermal Meter = 0x%x pre thermal meter 0x%x"
-                         " eeprom_thermalmeter 0x%x delta 0x%x "
-                         "delta_lck 0x%x delta_iqk 0x%x\n",
-                         thermalvalue, rtlpriv->dm.thermalvalue,
-                         rtlefuse->eeprom_thermalmeter, delta, delta_lck,
-                         delta_iqk));
+                        "Readback Thermal Meter = 0x%x pre thermal meter 0x%x eeprom_thermalmeter 0x%x delta 0x%x delta_lck 0x%x delta_iqk 0x%x\n",
+                        thermalvalue, rtlpriv->dm.thermalvalue,
+                        rtlefuse->eeprom_thermalmeter, delta, delta_lck,
+                        delta_iqk);
                if ((delta_lck > rtlefuse->delta_lck) &&
                    (rtlefuse->delta_lck != 0)) {
                        rtlpriv->dm.thermalvalue_lck = thermalvalue;
@@ -1036,17 +1023,15 @@ static void rtl92d_dm_txpower_tracking_callback_thermalmeter(
                        }
                        if (is2t) {
                                RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
-                                        ("temp OFDM_A_index=0x%x, OFDM_B_index"
-                                        " = 0x%x,cck_index=0x%x\n",
-                                         rtlpriv->dm.ofdm_index[0],
-                                         rtlpriv->dm.ofdm_index[1],
-                                         rtlpriv->dm.cck_index));
+                                        "temp OFDM_A_index=0x%x, OFDM_B_index = 0x%x,cck_index=0x%x\n",
+                                        rtlpriv->dm.ofdm_index[0],
+                                        rtlpriv->dm.ofdm_index[1],
+                                        rtlpriv->dm.cck_index);
                        } else {
                                RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
-                                        ("temp OFDM_A_index=0x%x,cck_index = "
-                                        "0x%x\n",
-                                         rtlpriv->dm.ofdm_index[0],
-                                                       rtlpriv->dm.cck_index));
+                                        "temp OFDM_A_index=0x%x,cck_index = 0x%x\n",
+                                        rtlpriv->dm.ofdm_index[0],
+                                        rtlpriv->dm.cck_index);
                        }
                        for (i = 0; i < rf; i++) {
                                if (ofdm_index[i] > OFDM_TABLE_SIZE_92D - 1)
@@ -1070,15 +1055,13 @@ static void rtl92d_dm_txpower_tracking_callback_thermalmeter(
                        }
                        if (is2t) {
                                RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
-                                        ("new OFDM_A_index=0x%x, OFDM_B_index "
-                                        "= 0x%x, cck_index=0x%x\n",
+                                        "new OFDM_A_index=0x%x, OFDM_B_index = 0x%x, cck_index=0x%x\n",
                                         ofdm_index[0], ofdm_index[1],
-                                        cck_index));
+                                        cck_index);
                        } else {
                                RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
-                                        ("new OFDM_A_index=0x%x,cck_index = "
-                                        "0x%x\n",
-                                         ofdm_index[0], cck_index));
+                                        "new OFDM_A_index=0x%x,cck_index = 0x%x\n",
+                                        ofdm_index[0], cck_index);
                        }
                        ele_d = (ofdmswing_table[(u8) ofdm_index[0]] &
                                                 0xFFC00000) >> 22;
@@ -1124,12 +1107,10 @@ static void rtl92d_dm_txpower_tracking_callback_thermalmeter(
                        }
 
                        RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
-                                ("TxPwrTracking for interface %d path A: X ="
-                                " 0x%lx, Y = 0x%lx ele_A = 0x%lx ele_C = "
-                                "0x%lx ele_D = 0x%lx 0xe94 = 0x%lx 0xe9c = "
-                                "0x%lx\n", rtlhal->interfaceindex,
+                                "TxPwrTracking for interface %d path A: X = 0x%lx, Y = 0x%lx ele_A = 0x%lx ele_C = 0x%lx ele_D = 0x%lx 0xe94 = 0x%lx 0xe9c = 0x%lx\n",
+                                rtlhal->interfaceindex,
                                 val_x, val_y, ele_a, ele_c, ele_d,
-                                val_x, val_y));
+                                val_x, val_y);
 
                        if (rtlhal->current_bandtype == BAND_ON_2_4G) {
                                /* Adjust CCK according to IQK result */
@@ -1232,20 +1213,16 @@ static void rtl92d_dm_txpower_tracking_callback_thermalmeter(
                                                      BIT(28), 0x00);
                                }
                                RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
-                                        ("TxPwrTracking path B: X = 0x%lx, "
-                                        "Y = 0x%lx ele_A = 0x%lx ele_C = 0x"
-                                        "%lx ele_D = 0x%lx 0xeb4 = 0x%lx "
-                                        "0xebc = 0x%lx\n",
-                                         val_x, val_y, ele_a, ele_c,
-                                         ele_d, val_x, val_y));
+                                        "TxPwrTracking path B: X = 0x%lx, Y = 0x%lx ele_A = 0x%lx ele_C = 0x%lx ele_D = 0x%lx 0xeb4 = 0x%lx 0xebc = 0x%lx\n",
+                                        val_x, val_y, ele_a, ele_c,
+                                        ele_d, val_x, val_y);
                        }
                        RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
-                                ("TxPwrTracking 0xc80 = 0x%x, 0xc94 = "
-                                "0x%x RF 0x24 = 0x%x\n",
+                                "TxPwrTracking 0xc80 = 0x%x, 0xc94 = 0x%x RF 0x24 = 0x%x\n",
                                 rtl_get_bbreg(hw, 0xc80, BMASKDWORD),
                                 rtl_get_bbreg(hw, 0xc94, BMASKDWORD),
                                 rtl_get_rfreg(hw, RF90_PATH_A, 0x24,
-                                BRFREGOFFSETMASK)));
+                                              BRFREGOFFSETMASK));
                }
                if ((delta_iqk > rtlefuse->delta_iqk) &&
                    (rtlefuse->delta_iqk != 0)) {
@@ -1262,7 +1239,7 @@ static void rtl92d_dm_txpower_tracking_callback_thermalmeter(
                        rtlpriv->dm.thermalvalue = thermalvalue;
        }
 
-       RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD, ("<===\n"));
+       RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD, "<===\n");
 }
 
 static void rtl92d_dm_initialize_txpower_tracking(struct ieee80211_hw *hw)
@@ -1273,8 +1250,8 @@ static void rtl92d_dm_initialize_txpower_tracking(struct ieee80211_hw *hw)
        rtlpriv->dm.txpower_trackinginit = false;
        rtlpriv->dm.txpower_track_control = true;
        RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
-                ("pMgntInfo->txpower_tracking = %d\n",
-                rtlpriv->dm.txpower_tracking));
+                "pMgntInfo->txpower_tracking = %d\n",
+                rtlpriv->dm.txpower_tracking);
 }
 
 void rtl92d_dm_check_txpower_tracking_thermal_meter(struct ieee80211_hw *hw)
@@ -1289,12 +1266,12 @@ void rtl92d_dm_check_txpower_tracking_thermal_meter(struct ieee80211_hw *hw)
                rtl_set_rfreg(hw, RF90_PATH_A, RF_T_METER, BIT(17) |
                              BIT(16), 0x03);
                RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
-                        ("Trigger 92S Thermal Meter!!\n"));
+                        "Trigger 92S Thermal Meter!!\n");
                tm_trigger = 1;
                return;
        } else {
                RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
-                        ("Schedule TxPowerTracking direct call!!\n"));
+                        "Schedule TxPowerTracking direct call!!\n");
                rtl92d_dm_txpower_tracking_callback_thermalmeter(hw);
                tm_trigger = 0;
        }
index 6935465..91030ec 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2009-2010  Realtek Corporation.
+ * Copyright(c) 2009-2012  Realtek Corporation.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
index 82f060b..f548a8d 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2009-2010  Realtek Corporation.
+ * Copyright(c) 2009-2012  Realtek Corporation.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
@@ -124,14 +124,14 @@ static void _rtl92d_write_fw(struct ieee80211_hw *hw,
        u32 pagenums, remainSize;
        u32 page, offset;
 
-       RT_TRACE(rtlpriv, COMP_FW, DBG_TRACE, ("FW size is %d bytes,\n", size));
+       RT_TRACE(rtlpriv, COMP_FW, DBG_TRACE, "FW size is %d bytes,\n", size);
        if (rtlhal->hw_type == HARDWARE_TYPE_RTL8192DE)
                _rtl92d_fill_dummy(bufferPtr, &size);
        pagenums = size / FW_8192D_PAGE_SIZE;
        remainSize = size % FW_8192D_PAGE_SIZE;
        if (pagenums > 8) {
                RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                        ("Page numbers should not greater then 8\n"));
+                        "Page numbers should not greater then 8\n");
        }
        for (page = 0; page < pagenums; page++) {
                offset = page * FW_8192D_PAGE_SIZE;
@@ -158,12 +158,12 @@ static int _rtl92d_fw_free_to_go(struct ieee80211_hw *hw)
                 (!(value32 & FWDL_ChkSum_rpt)));
        if (counter >= FW_8192D_POLLING_TIMEOUT_COUNT) {
                RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                        ("chksum report faill ! REG_MCUFWDL:0x%08x .\n",
-                        value32));
+                        "chksum report faill ! REG_MCUFWDL:0x%08x\n",
+                        value32);
                return -EIO;
        }
        RT_TRACE(rtlpriv, COMP_FW, DBG_TRACE,
-                ("Checksum report OK ! REG_MCUFWDL:0x%08x .\n", value32));
+                "Checksum report OK ! REG_MCUFWDL:0x%08x\n", value32);
        value32 = rtl_read_dword(rtlpriv, REG_MCUFWDL);
        value32 |= MCUFWDL_RDY;
        rtl_write_dword(rtlpriv, REG_MCUFWDL, value32);
@@ -186,9 +186,9 @@ void rtl92d_firmware_selfreset(struct ieee80211_hw *hw)
                udelay(50);
                u1b_tmp = rtl_read_byte(rtlpriv, REG_SYS_FUNC_EN + 1);
        }
-       RT_ASSERT((delay > 0), ("8051 reset failed!\n"));
+       RT_ASSERT((delay > 0), "8051 reset failed!\n");
        RT_TRACE(rtlpriv, COMP_FW, DBG_DMESG,
-                ("=====> 8051 reset success (%d) .\n", delay));
+                "=====> 8051 reset success (%d)\n", delay);
 }
 
 static int _rtl92d_fw_init(struct ieee80211_hw *hw)
@@ -197,7 +197,7 @@ static int _rtl92d_fw_init(struct ieee80211_hw *hw)
        struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
        u32 counter;
 
-       RT_TRACE(rtlpriv, COMP_FW, DBG_DMESG, ("FW already have download\n"));
+       RT_TRACE(rtlpriv, COMP_FW, DBG_DMESG, "FW already have download\n");
        /* polling for FW ready */
        counter = 0;
        do {
@@ -205,10 +205,9 @@ static int _rtl92d_fw_init(struct ieee80211_hw *hw)
                        if (rtl_read_byte(rtlpriv, FW_MAC0_READY) &
                            MAC0_READY) {
                                RT_TRACE(rtlpriv, COMP_FW, DBG_DMESG,
-                                        ("Polling FW ready success!! "
-                                        "REG_MCUFWDL: 0x%x .\n",
+                                        "Polling FW ready success!! REG_MCUFWDL: 0x%x\n",
                                         rtl_read_byte(rtlpriv,
-                                        FW_MAC0_READY)));
+                                                      FW_MAC0_READY));
                                return 0;
                        }
                        udelay(5);
@@ -216,10 +215,9 @@ static int _rtl92d_fw_init(struct ieee80211_hw *hw)
                        if (rtl_read_byte(rtlpriv, FW_MAC1_READY) &
                            MAC1_READY) {
                                RT_TRACE(rtlpriv, COMP_FW, DBG_DMESG,
-                                        ("Polling FW ready success!! "
-                                        "REG_MCUFWDL: 0x%x .\n",
+                                        "Polling FW ready success!! REG_MCUFWDL: 0x%x\n",
                                         rtl_read_byte(rtlpriv,
-                                                      FW_MAC1_READY)));
+                                                      FW_MAC1_READY));
                                return 0;
                        }
                        udelay(5);
@@ -228,18 +226,16 @@ static int _rtl92d_fw_init(struct ieee80211_hw *hw)
 
        if (rtlhal->interfaceindex == 0) {
                RT_TRACE(rtlpriv, COMP_FW, DBG_DMESG,
-                        ("Polling FW ready fail!! MAC0 FW init not ready: "
-                        "0x%x .\n",
-                        rtl_read_byte(rtlpriv, FW_MAC0_READY)));
+                        "Polling FW ready fail!! MAC0 FW init not ready: 0x%x\n",
+                        rtl_read_byte(rtlpriv, FW_MAC0_READY));
        } else {
                RT_TRACE(rtlpriv, COMP_FW, DBG_DMESG,
-                        ("Polling FW ready fail!! MAC1 FW init not ready: "
-                        "0x%x .\n",
-                        rtl_read_byte(rtlpriv, FW_MAC1_READY)));
+                        "Polling FW ready fail!! MAC1 FW init not ready: 0x%x\n",
+                        rtl_read_byte(rtlpriv, FW_MAC1_READY));
        }
        RT_TRACE(rtlpriv, COMP_FW, DBG_DMESG,
-                ("Polling FW ready fail!! REG_MCUFWDL:0x%08ul .\n",
-                rtl_read_dword(rtlpriv, REG_MCUFWDL)));
+                "Polling FW ready fail!! REG_MCUFWDL:0x%08ul\n",
+                rtl_read_dword(rtlpriv, REG_MCUFWDL));
        return -1;
 }
 
@@ -257,20 +253,20 @@ int rtl92d_download_fw(struct ieee80211_hw *hw)
        bool fw_downloaded = false, fwdl_in_process = false;
        unsigned long flags;
 
-       if (!rtlhal->pfirmware)
+       if (rtlpriv->max_fw_size == 0 || !rtlhal->pfirmware)
                return 1;
        fwsize = rtlhal->fwsize;
        pfwheader = (u8 *) rtlhal->pfirmware;
        pfwdata = (u8 *) rtlhal->pfirmware;
        rtlhal->fw_version = (u16) GET_FIRMWARE_HDR_VERSION(pfwheader);
        rtlhal->fw_subversion = (u16) GET_FIRMWARE_HDR_SUB_VER(pfwheader);
-       RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, (" FirmwareVersion(%d),"
-                "FirmwareSubVersion(%d), Signature(%#x)\n",
-                rtlhal->fw_version,    rtlhal->fw_subversion,
-                GET_FIRMWARE_HDR_SIGNATURE(pfwheader)));
+       RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
+                "FirmwareVersion(%d), FirmwareSubVersion(%d), Signature(%#x)\n",
+                rtlhal->fw_version, rtlhal->fw_subversion,
+                GET_FIRMWARE_HDR_SIGNATURE(pfwheader));
        if (IS_FW_HEADER_EXIST(pfwheader)) {
                RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
-                        ("Shift 32 bytes for FW header!!\n"));
+                        "Shift 32 bytes for FW header!!\n");
                pfwdata = pfwdata + 32;
                fwsize = fwsize - 32;
        }
@@ -302,8 +298,7 @@ int rtl92d_download_fw(struct ieee80211_hw *hw)
                                break;
                        else
                                RT_TRACE(rtlpriv, COMP_FW, DBG_DMESG,
-                                        ("Wait for another mac "
-                                        "download fw\n"));
+                                        "Wait for another mac download fw\n");
                }
                spin_lock_irqsave(&globalmutex_for_fwdownload, flags);
                value = rtl_read_byte(rtlpriv, 0x1f);
@@ -337,11 +332,10 @@ int rtl92d_download_fw(struct ieee80211_hw *hw)
        spin_unlock_irqrestore(&globalmutex_for_fwdownload, flags);
        if (err) {
                RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                        ("fw is not ready to run!\n"));
+                        "fw is not ready to run!\n");
                goto exit;
        } else {
-               RT_TRACE(rtlpriv, COMP_FW, DBG_TRACE,
-                        ("fw is ready to run!\n"));
+               RT_TRACE(rtlpriv, COMP_FW, DBG_TRACE, "fw is ready to run!\n");
        }
 exit:
        err = _rtl92d_fw_init(hw);
@@ -381,24 +375,24 @@ static void _rtl92d_fill_h2c_command(struct ieee80211_hw *hw,
 
        if (ppsc->rfpwr_state == ERFOFF || ppsc->inactive_pwrstate == ERFOFF) {
                RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD,
-                        ("Return as RF is off!!!\n"));
+                        "Return as RF is off!!!\n");
                return;
        }
-       RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, ("come in\n"));
+       RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, "come in\n");
        while (true) {
                spin_lock_irqsave(&rtlpriv->locks.h2c_lock, flag);
                if (rtlhal->h2c_setinprogress) {
                        RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD,
-                                ("H2C set in progress! Wait to set.."
-                                "element_id(%d).\n", element_id));
+                                "H2C set in progress! Wait to set..element_id(%d)\n",
+                                element_id);
 
                        while (rtlhal->h2c_setinprogress) {
                                spin_unlock_irqrestore(&rtlpriv->locks.h2c_lock,
                                                       flag);
                                h2c_waitcounter++;
                                RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD,
-                                        ("Wait 100 us (%d times)...\n",
-                                        h2c_waitcounter));
+                                        "Wait 100 us (%d times)...\n",
+                                        h2c_waitcounter);
                                udelay(100);
 
                                if (h2c_waitcounter > 1000)
@@ -418,8 +412,7 @@ static void _rtl92d_fill_h2c_command(struct ieee80211_hw *hw,
                wait_writeh2c_limmit--;
                if (wait_writeh2c_limmit == 0) {
                        RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                                ("Write H2C fail because no trigger "
-                                "for FW INT!\n"));
+                                "Write H2C fail because no trigger for FW INT!\n");
                        break;
                }
                boxnum = rtlhal->last_hmeboxnum;
@@ -442,7 +435,7 @@ static void _rtl92d_fill_h2c_command(struct ieee80211_hw *hw,
                        break;
                default:
                        RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                                ("switch case not process\n"));
+                                "switch case not processed\n");
                        break;
                }
                isfw_read = _rtl92d_check_fw_read_last_h2c(hw, boxnum);
@@ -450,29 +443,29 @@ static void _rtl92d_fill_h2c_command(struct ieee80211_hw *hw,
                        wait_h2c_limmit--;
                        if (wait_h2c_limmit == 0) {
                                RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD,
-                                        ("Wating too long for FW read "
-                                        "clear HMEBox(%d)!\n", boxnum));
+                                        "Waiting too long for FW read clear HMEBox(%d)!\n",
+                                        boxnum);
                                break;
                        }
                        udelay(10);
                        isfw_read = _rtl92d_check_fw_read_last_h2c(hw, boxnum);
                        u1b_tmp = rtl_read_byte(rtlpriv, 0x1BF);
                        RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD,
-                                ("Wating for FW read clear HMEBox(%d)!!! "
-                                "0x1BF = %2x\n", boxnum, u1b_tmp));
+                                "Waiting for FW read clear HMEBox(%d)!!! 0x1BF = %2x\n",
+                                boxnum, u1b_tmp);
                }
                if (!isfw_read) {
                        RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD,
-                                ("Write H2C register BOX[%d] fail!!!!! "
-                                "Fw do not read.\n", boxnum));
+                                "Write H2C register BOX[%d] fail!!!!! Fw do not read.\n",
+                                boxnum);
                        break;
                }
                memset(boxcontent, 0, sizeof(boxcontent));
                memset(boxextcontent, 0, sizeof(boxextcontent));
                boxcontent[0] = element_id;
                RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD,
-                        ("Write element_id box_reg(%4x) = %2x\n",
-                        box_reg, element_id));
+                        "Write element_id box_reg(%4x) = %2x\n",
+                        box_reg, element_id);
                switch (cmd_len) {
                case 1:
                        boxcontent[0] &= ~(BIT(7));
@@ -519,7 +512,7 @@ static void _rtl92d_fill_h2c_command(struct ieee80211_hw *hw,
                        break;
                default:
                        RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                               ("switch case not process\n"));
+                                "switch case not processed\n");
                        break;
                }
                bwrite_sucess = true;
@@ -527,26 +520,20 @@ static void _rtl92d_fill_h2c_command(struct ieee80211_hw *hw,
                if (rtlhal->last_hmeboxnum == 4)
                        rtlhal->last_hmeboxnum = 0;
                RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD,
-                        ("pHalData->last_hmeboxnum  = %d\n",
-                         rtlhal->last_hmeboxnum));
+                        "pHalData->last_hmeboxnum  = %d\n",
+                        rtlhal->last_hmeboxnum);
        }
        spin_lock_irqsave(&rtlpriv->locks.h2c_lock, flag);
        rtlhal->h2c_setinprogress = false;
        spin_unlock_irqrestore(&rtlpriv->locks.h2c_lock, flag);
-       RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, ("go out\n"));
+       RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, "go out\n");
 }
 
 void rtl92d_fill_h2c_cmd(struct ieee80211_hw *hw,
                         u8 element_id, u32 cmd_len, u8 *cmdbuffer)
 {
-       struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
        u32 tmp_cmdbuf[2];
 
-       if (rtlhal->fw_ready == false) {
-               RT_ASSERT(false, ("return H2C cmd because of Fw "
-                                 "download fail!!!\n"));
-               return;
-       }
        memset(tmp_cmdbuf, 0, 8);
        memcpy(tmp_cmdbuf, cmdbuffer, cmd_len);
        _rtl92d_fill_h2c_command(hw, element_id, cmd_len, (u8 *)&tmp_cmdbuf);
@@ -559,13 +546,13 @@ void rtl92d_set_fw_pwrmode_cmd(struct ieee80211_hw *hw, u8 mode)
        u8 u1_h2c_set_pwrmode[3] = { 0 };
        struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
 
-       RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD, ("FW LPS mode = %d\n", mode));
+       RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD, "FW LPS mode = %d\n", mode);
        SET_H2CCMD_PWRMODE_PARM_MODE(u1_h2c_set_pwrmode, mode);
        SET_H2CCMD_PWRMODE_PARM_SMART_PS(u1_h2c_set_pwrmode, 1);
        SET_H2CCMD_PWRMODE_PARM_BCN_PASS_TIME(u1_h2c_set_pwrmode,
                                              ppsc->reg_max_lps_awakeintvl);
        RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_DMESG,
-                     "rtl92d_set_fw_rsvdpagepkt(): u1_h2c_set_pwrmode\n",
+                     "rtl92d_set_fw_rsvdpagepkt(): u1_h2c_set_pwrmode",
                      u1_h2c_set_pwrmode, 3);
        rtl92d_fill_h2c_cmd(hw, H2C_SETPWRMODE, 3, u1_h2c_set_pwrmode);
 }
@@ -757,28 +744,32 @@ void rtl92d_set_fw_rsvdpagepkt(struct ieee80211_hw *hw, bool dl_finished)
        SET_H2CCMD_RSVDPAGE_LOC_PROBE_RSP(u1RsvdPageLoc, PROBERSP_PG);
        totalpacketlen = TOTAL_RESERVED_PKT_LEN;
        RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_LOUD,
-                     "rtl92d_set_fw_rsvdpagepkt(): HW_VAR_SET_TX_CMD: ALL\n",
+                     "rtl92d_set_fw_rsvdpagepkt(): HW_VAR_SET_TX_CMD: ALL",
                      &reserved_page_packet[0], totalpacketlen);
        RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_DMESG,
-                     "rtl92d_set_fw_rsvdpagepkt(): HW_VAR_SET_TX_CMD: ALL\n",
+                     "rtl92d_set_fw_rsvdpagepkt(): HW_VAR_SET_TX_CMD: ALL",
                      u1RsvdPageLoc, 3);
        skb = dev_alloc_skb(totalpacketlen);
-       memcpy((u8 *) skb_put(skb, totalpacketlen), &reserved_page_packet,
-               totalpacketlen);
-       rtstatus = _rtl92d_cmd_send_packet(hw, skb);
+       if (!skb) {
+               dlok = false;
+       } else {
+               memcpy((u8 *) skb_put(skb, totalpacketlen),
+                       &reserved_page_packet, totalpacketlen);
+               rtstatus = _rtl92d_cmd_send_packet(hw, skb);
 
-       if (rtstatus)
-               dlok = true;
+               if (rtstatus)
+                       dlok = true;
+       }
        if (dlok) {
                RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
-                       ("Set RSVD page location to Fw.\n"));
+                        "Set RSVD page location to Fw\n");
                RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_DMESG,
-                             "H2C_RSVDPAGE:\n", u1RsvdPageLoc, 3);
+                             "H2C_RSVDPAGE", u1RsvdPageLoc, 3);
                rtl92d_fill_h2c_cmd(hw, H2C_RSVDPAGE,
                        sizeof(u1RsvdPageLoc), u1RsvdPageLoc);
        } else
                RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
-                       ("Set RSVD page location to Fw FAIL!!!!!!.\n"));
+                        "Set RSVD page location to Fw FAIL!!!!!!\n");
 }
 
 void rtl92d_set_fw_joinbss_report_cmd(struct ieee80211_hw *hw, u8 mstatus)
index 0c4d489..1ffacdd 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2009-2010  Realtek Corporation.
+ * Copyright(c) 2009-2012  Realtek Corporation.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
index 9d89d7c..509f5af 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2009-2010  Realtek Corporation.
+ * Copyright(c) 2009-2012  Realtek Corporation.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
@@ -166,7 +166,7 @@ void rtl92de_get_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)
                break;
        default:
                RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                        ("switch case not process\n"));
+                        "switch case not processed\n");
                break;
        }
 }
@@ -230,7 +230,7 @@ void rtl92de_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)
                u8 e_aci;
 
                RT_TRACE(rtlpriv, COMP_MLME, DBG_LOUD,
-                        ("HW_VAR_SLOT_TIME %x\n", val[0]));
+                        "HW_VAR_SLOT_TIME %x\n", val[0]);
                rtl_write_byte(rtlpriv, REG_SLOT, val[0]);
                for (e_aci = 0; e_aci < AC_MAX; e_aci++)
                        rtlpriv->cfg->ops->set_hw_reg(hw,
@@ -261,8 +261,8 @@ void rtl92de_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)
                                              min_spacing_to_set);
                        *val = min_spacing_to_set;
                        RT_TRACE(rtlpriv, COMP_MLME, DBG_LOUD,
-                                ("Set HW_VAR_AMPDU_MIN_SPACE: %#x\n",
-                                mac->min_space_cfg));
+                                "Set HW_VAR_AMPDU_MIN_SPACE: %#x\n",
+                                mac->min_space_cfg);
                        rtl_write_byte(rtlpriv, REG_AMPDU_MIN_SPACE,
                                       mac->min_space_cfg);
                }
@@ -275,8 +275,8 @@ void rtl92de_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)
                mac->min_space_cfg = rtlpriv->rtlhal.minspace_cfg;
                mac->min_space_cfg |= (density_to_set << 3);
                RT_TRACE(rtlpriv, COMP_MLME, DBG_LOUD,
-                        ("Set HW_VAR_SHORTGI_DENSITY: %#x\n",
-                        mac->min_space_cfg));
+                        "Set HW_VAR_SHORTGI_DENSITY: %#x\n",
+                        mac->min_space_cfg);
                rtl_write_byte(rtlpriv, REG_AMPDU_MIN_SPACE,
                               mac->min_space_cfg);
                break;
@@ -310,8 +310,8 @@ void rtl92de_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)
                        }
                        rtl_write_dword(rtlpriv, REG_AGGLEN_LMT, regtoSet);
                        RT_TRACE(rtlpriv, COMP_MLME, DBG_LOUD,
-                                ("Set HW_VAR_AMPDU_FACTOR: %#x\n",
-                                factor_toset));
+                                "Set HW_VAR_AMPDU_FACTOR: %#x\n",
+                                factor_toset);
                }
                break;
        }
@@ -344,8 +344,8 @@ void rtl92de_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)
                                break;
                        default:
                                RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
-                                        ("HW_VAR_ACM_CTRL acm set "
-                                        "failed: eACI is %d\n", acm));
+                                        "HW_VAR_ACM_CTRL acm set failed: eACI is %d\n",
+                                        acm);
                                break;
                        }
                } else {
@@ -361,13 +361,13 @@ void rtl92de_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)
                                break;
                        default:
                                RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                                        ("switch case not process\n"));
+                                        "switch case not processed\n");
                                break;
                        }
                }
                RT_TRACE(rtlpriv, COMP_QOS, DBG_TRACE,
-                        ("SetHwReg8190pci(): [HW_VAR_ACM_CTRL] "
-                        "Write 0x%X\n", acm_ctrl));
+                        "SetHwReg8190pci(): [HW_VAR_ACM_CTRL] Write 0x%X\n",
+                        acm_ctrl);
                rtl_write_byte(rtlpriv, REG_ACMHWCTRL, acm_ctrl);
                break;
        }
@@ -502,7 +502,7 @@ void rtl92de_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)
        }
        default:
                RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                        ("switch case not process\n"));
+                        "switch case not processed\n");
                break;
        }
 }
@@ -522,8 +522,8 @@ static bool _rtl92de_llt_write(struct ieee80211_hw *hw, u32 address, u32 data)
                        break;
                if (count > POLLING_LLT_THRESHOLD) {
                        RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                                ("Failed to polling write LLT done at "
-                                 "address %d!\n", address));
+                                "Failed to polling write LLT done at address %d!\n",
+                                address);
                        status = false;
                        break;
                }
@@ -707,7 +707,7 @@ static bool _rtl92de_init_mac(struct ieee80211_hw *hw)
 
        /* System init */
        /* 18.  LLT_table_init(Adapter);  */
-       if (_rtl92de_llt_table_init(hw) == false)
+       if (!_rtl92de_llt_table_init(hw))
                return false;
 
        /* Clear interrupt and enable interrupt */
@@ -879,12 +879,12 @@ void rtl92de_enable_hw_security_config(struct ieee80211_hw *hw)
        u8 sec_reg_value;
 
        RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
-                ("PairwiseEncAlgorithm = %d GroupEncAlgorithm = %d\n",
-                 rtlpriv->sec.pairwise_enc_algorithm,
-                 rtlpriv->sec.group_enc_algorithm));
+                "PairwiseEncAlgorithm = %d GroupEncAlgorithm = %d\n",
+                rtlpriv->sec.pairwise_enc_algorithm,
+                rtlpriv->sec.group_enc_algorithm);
        if (rtlpriv->cfg->mod_params->sw_crypto || rtlpriv->sec.use_sw_sec) {
                RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG,
-                        ("not open hw encryption\n"));
+                        "not open hw encryption\n");
                return;
        }
        sec_reg_value = SCR_TXENCENABLE | SCR_RXENCENABLE;
@@ -895,7 +895,7 @@ void rtl92de_enable_hw_security_config(struct ieee80211_hw *hw)
        sec_reg_value |= (SCR_RXBCUSEDK | SCR_TXBCUSEDK);
        rtl_write_byte(rtlpriv, REG_CR + 1, 0x02);
        RT_TRACE(rtlpriv, COMP_SEC, DBG_LOUD,
-                ("The SECR-value %x\n", sec_reg_value));
+                "The SECR-value %x\n", sec_reg_value);
        rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_WPA_CONFIG, &sec_reg_value);
 }
 
@@ -920,8 +920,8 @@ int rtl92de_hw_init(struct ieee80211_hw *hw)
        rtl92d_phy_reset_iqk_result(hw);
        /* rtlpriv->intf_ops->disable_aspm(hw); */
        rtstatus = _rtl92de_init_mac(hw);
-       if (rtstatus != true) {
-               RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, ("Init MAC failed\n"));
+       if (!rtstatus) {
+               RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "Init MAC failed\n");
                err = 1;
                spin_unlock_irqrestore(&globalmutex_for_power_and_efuse, flags);
                return err;
@@ -930,12 +930,8 @@ int rtl92de_hw_init(struct ieee80211_hw *hw)
        spin_unlock_irqrestore(&globalmutex_for_power_and_efuse, flags);
        if (err) {
                RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
-                        ("Failed to download FW. Init HW "
-                        "without FW..\n"));
-               rtlhal->fw_ready = false;
+                        "Failed to download FW. Init HW without FW..\n");
                return 1;
-       } else {
-               rtlhal->fw_ready = true;
        }
        rtlhal->last_hmeboxnum = 0;
        rtlpriv->psc.fw_current_inpsmode = false;
@@ -946,7 +942,7 @@ int rtl92de_hw_init(struct ieee80211_hw *hw)
 
        if (rtlhal->earlymode_enable) {
                RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
-                        ("EarlyMode Enabled!!!\n"));
+                        "EarlyMode Enabled!!!\n");
 
                tmp_u1b = rtl_read_byte(rtlpriv, 0x4d0);
                tmp_u1b = tmp_u1b | 0x1f;
@@ -1064,10 +1060,10 @@ static enum version_8192d _rtl92de_read_chip_version(struct ieee80211_hw *hw)
        value32 = rtl_read_dword(rtlpriv, REG_SYS_CFG);
        if (!(value32 & 0x000f0000)) {
                version = VERSION_TEST_CHIP_92D_SINGLEPHY;
-               RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, ("TEST CHIP!!!\n"));
+               RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "TEST CHIP!!!\n");
        } else {
                version = VERSION_NORMAL_CHIP_92D_SINGLEPHY;
-               RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, ("Normal CHIP!!!\n"));
+               RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "Normal CHIP!!!\n");
        }
        return version;
 }
@@ -1092,8 +1088,8 @@ static int _rtl92de_set_media_status(struct ieee80211_hw *hw,
                _rtl92de_disable_bcn_sub_func(hw);
        } else {
                RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
-                        ("Set HW_VAR_MEDIA_STATUS: No such media "
-                        "status(%x).\n", type));
+                        "Set HW_VAR_MEDIA_STATUS: No such media status(%x)\n",
+                        type);
        }
        bcnfunc_enable = rtl_read_byte(rtlpriv, REG_BCN_CTRL);
        switch (type) {
@@ -1102,30 +1098,30 @@ static int _rtl92de_set_media_status(struct ieee80211_hw *hw,
                ledaction = LED_CTL_LINK;
                bcnfunc_enable &= 0xF7;
                RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
-                        ("Set Network type to NO LINK!\n"));
+                        "Set Network type to NO LINK!\n");
                break;
        case NL80211_IFTYPE_ADHOC:
                bt_msr |= MSR_ADHOC;
                bcnfunc_enable |= 0x08;
                RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
-                        ("Set Network type to Ad Hoc!\n"));
+                        "Set Network type to Ad Hoc!\n");
                break;
        case NL80211_IFTYPE_STATION:
                bt_msr |= MSR_INFRA;
                ledaction = LED_CTL_LINK;
                bcnfunc_enable &= 0xF7;
                RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
-                        ("Set Network type to STA!\n"));
+                        "Set Network type to STA!\n");
                break;
        case NL80211_IFTYPE_AP:
                bt_msr |= MSR_AP;
                bcnfunc_enable |= 0x08;
                RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
-                        ("Set Network type to AP!\n"));
+                        "Set Network type to AP!\n");
                break;
        default:
                RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                        ("Network type %d not support!\n", type));
+                        "Network type %d not supported!\n", type);
                return 1;
                break;
 
@@ -1151,7 +1147,7 @@ void rtl92de_set_check_bssid(struct ieee80211_hw *hw, bool check_bssid)
                reg_rcr |= (RCR_CBSSID_DATA | RCR_CBSSID_BCN);
                rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_RCR, (u8 *)(&reg_rcr));
                _rtl92de_set_bcn_ctrl_reg(hw, 0, BIT(4));
-       } else if (check_bssid == false) {
+       } else if (!check_bssid) {
                reg_rcr &= (~(RCR_CBSSID_DATA | RCR_CBSSID_BCN));
                _rtl92de_set_bcn_ctrl_reg(hw, BIT(4), 0);
                rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_RCR, (u8 *)(&reg_rcr));
@@ -1189,7 +1185,7 @@ void rtl92d_linked_set_reg(struct ieee80211_hw *hw)
        indexforchannel = rtl92d_get_rightchnlplace_for_iqk(channel);
        if (!rtlphy->iqk_matrix_regsetting[indexforchannel].iqk_done) {
                RT_TRACE(rtlpriv, COMP_SCAN | COMP_INIT, DBG_DMESG,
-                               ("Do IQK for channel:%d.\n", channel));
+                        "Do IQK for channel:%d\n", channel);
                rtl92d_phy_iq_calibrate(hw);
        }
 }
@@ -1214,7 +1210,7 @@ void rtl92de_set_qos(struct ieee80211_hw *hw, int aci)
                rtl_write_dword(rtlpriv, REG_EDCA_VO_PARAM, 0x2f3222);
                break;
        default:
-               RT_ASSERT(false, ("invalid aci: %d !\n", aci));
+               RT_ASSERT(false, "invalid aci: %d !\n", aci);
                break;
        }
 }
@@ -1305,8 +1301,8 @@ static void _rtl92de_poweroff_adapter(struct ieee80211_hw *hw)
        rtl_write_byte(rtlpriv, REG_APS_FSMCO + 1, 0x10);
 
        RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
-                ("In PowerOff,reg0x%x=%X\n", REG_SPS0_CTRL,
-                 rtl_read_byte(rtlpriv, REG_SPS0_CTRL)));
+                "In PowerOff,reg0x%x=%X\n",
+                REG_SPS0_CTRL, rtl_read_byte(rtlpriv, REG_SPS0_CTRL));
        /* r.   Note: for PCIe interface, PON will not turn */
        /* off m-bias and BandGap in PCIe suspend mode.  */
 
@@ -1319,7 +1315,7 @@ static void _rtl92de_poweroff_adapter(struct ieee80211_hw *hw)
                spin_unlock_irqrestore(&globalmutex_power, flags);
        }
 
-       RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, ("<=======\n"));
+       RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "<=======\n");
 }
 
 void rtl92de_card_disable(struct ieee80211_hw *hw)
@@ -1377,7 +1373,7 @@ void rtl92de_card_disable(struct ieee80211_hw *hw)
        rtl_write_byte(rtlpriv, REG_PCIE_CTRL_REG + 1, 0xff);
        udelay(50);
        rtl_write_byte(rtlpriv, REG_CR, 0x0);
-       RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, ("==> Do power off.......\n"));
+       RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "==> Do power off.......\n");
        if (rtl92d_phy_check_poweroff(hw))
                _rtl92de_poweroff_adapter(hw);
        return;
@@ -1425,7 +1421,7 @@ void rtl92de_set_beacon_interval(struct ieee80211_hw *hw)
        u16 bcn_interval = mac->beacon_interval;
 
        RT_TRACE(rtlpriv, COMP_BEACON, DBG_DMESG,
-                ("beacon_interval:%d\n", bcn_interval));
+                "beacon_interval:%d\n", bcn_interval);
        /* rtl92de_disable_interrupt(hw); */
        rtl_write_word(rtlpriv, REG_BCN_INTERVAL, bcn_interval);
        /* rtl92de_enable_interrupt(hw); */
@@ -1437,8 +1433,8 @@ void rtl92de_update_interrupt_mask(struct ieee80211_hw *hw,
        struct rtl_priv *rtlpriv = rtl_priv(hw);
        struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
 
-       RT_TRACE(rtlpriv, COMP_INTR, DBG_LOUD,
-                ("add_msr:%x, rm_msr:%x\n", add_msr, rm_msr));
+       RT_TRACE(rtlpriv, COMP_INTR, DBG_LOUD, "add_msr:%x, rm_msr:%x\n",
+                add_msr, rm_msr);
        if (add_msr)
                rtlpci->irq_mask[0] |= add_msr;
        if (rm_msr)
@@ -1615,9 +1611,9 @@ static void _rtl92de_read_txpower_info(struct ieee80211_hw *hw,
                        rtlefuse->internal_pa_5g[1] =
                                !((hwinfo[EEPROM_TSSI_B_5G] & BIT(6)) >> 6);
                        RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
-                                ("Is D cut,Internal PA0 %d Internal PA1 %d\n",
+                                "Is D cut,Internal PA0 %d Internal PA1 %d\n",
                                 rtlefuse->internal_pa_5g[0],
-                                rtlefuse->internal_pa_5g[1]))
+                                rtlefuse->internal_pa_5g[1]);
                }
                rtlefuse->eeprom_c9 = hwinfo[EEPROM_RF_OPT6];
                rtlefuse->eeprom_cc = hwinfo[EEPROM_RF_OPT7];
@@ -1667,14 +1663,14 @@ static void _rtl92de_read_txpower_info(struct ieee80211_hw *hw,
        if (rtlefuse->eeprom_c9 == 0xFF)
                rtlefuse->eeprom_c9 = 0x00;
        RT_TRACE(rtlpriv, COMP_INTR, DBG_LOUD,
-                ("EEPROMRegulatory = 0x%x\n", rtlefuse->eeprom_regulatory));
+                "EEPROMRegulatory = 0x%x\n", rtlefuse->eeprom_regulatory);
        RT_TRACE(rtlpriv, COMP_INTR, DBG_LOUD,
-                ("ThermalMeter = 0x%x\n", rtlefuse->eeprom_thermalmeter));
+                "ThermalMeter = 0x%x\n", rtlefuse->eeprom_thermalmeter);
        RT_TRACE(rtlpriv, COMP_INTR, DBG_LOUD,
-                ("CrystalCap = 0x%x\n", rtlefuse->crystalcap));
+                "CrystalCap = 0x%x\n", rtlefuse->crystalcap);
        RT_TRACE(rtlpriv, COMP_INTR, DBG_LOUD,
-                ("Delta_IQK = 0x%x Delta_LCK = 0x%x\n", rtlefuse->delta_iqk,
-                rtlefuse->delta_lck));
+                "Delta_IQK = 0x%x Delta_LCK = 0x%x\n",
+                rtlefuse->delta_iqk, rtlefuse->delta_lck);
 
        for (rfPath = 0; rfPath < RF6052_MAX_PATH; rfPath++) {
                for (ch = 0; ch < CHANNEL_MAX_NUMBER; ch++) {
@@ -1710,11 +1706,11 @@ static void _rtl92de_read_macphymode_from_prom(struct ieee80211_hw *hw,
        if (macphy_crvalue & BIT(3)) {
                rtlhal->macphymode = SINGLEMAC_SINGLEPHY;
                RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
-                        ("MacPhyMode SINGLEMAC_SINGLEPHY\n"));
+                        "MacPhyMode SINGLEMAC_SINGLEPHY\n");
        } else {
                rtlhal->macphymode = DUALMAC_DUALPHY;
                RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
-                        ("MacPhyMode DUALMAC_DUALPHY\n"));
+                        "MacPhyMode DUALMAC_DUALPHY\n");
        }
 }
 
@@ -1741,15 +1737,15 @@ static void _rtl92de_efuse_update_chip_version(struct ieee80211_hw *hw)
        switch (chipvalue) {
        case 0xAA55:
                chipver |= CHIP_92D_C_CUT;
-               RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, ("C-CUT!!!\n"));
+               RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "C-CUT!!!\n");
                break;
        case 0x9966:
                chipver |= CHIP_92D_D_CUT;
-               RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, ("D-CUT!!!\n"));
+               RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "D-CUT!!!\n");
                break;
        default:
                chipver |= CHIP_92D_D_CUT;
-               RT_TRACE(rtlpriv, COMP_INIT, DBG_EMERG, ("Unkown CUT!\n"));
+               RT_TRACE(rtlpriv, COMP_INIT, DBG_EMERG, "Unkown CUT!\n");
                break;
        }
        rtlpriv->rtlhal.version = chipver;
@@ -1775,23 +1771,23 @@ static void _rtl92de_read_adapter_info(struct ieee80211_hw *hw)
                       HWSET_MAX_SIZE);
        } else if (rtlefuse->epromtype == EEPROM_93C46) {
                RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                        ("RTL819X Not boot from eeprom, check it !!"));
+                        "RTL819X Not boot from eeprom, check it !!\n");
        }
-       RT_PRINT_DATA(rtlpriv, COMP_INIT, DBG_DMESG, ("MAP\n"),
+       RT_PRINT_DATA(rtlpriv, COMP_INIT, DBG_DMESG, "MAP",
                      hwinfo, HWSET_MAX_SIZE);
 
        eeprom_id = *((u16 *)&hwinfo[0]);
        if (eeprom_id != RTL8190_EEPROM_ID) {
                RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
-                        ("EEPROM ID(%#x) is invalid!!\n", eeprom_id));
+                        "EEPROM ID(%#x) is invalid!!\n", eeprom_id);
                rtlefuse->autoload_failflag = true;
        } else {
-               RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, ("Autoload OK\n"));
+               RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "Autoload OK\n");
                rtlefuse->autoload_failflag = false;
        }
        if (rtlefuse->autoload_failflag) {
                RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                        ("RTL819X Not boot from eeprom, check it !!"));
+                        "RTL819X Not boot from eeprom, check it !!\n");
                return;
        }
        rtlefuse->eeprom_oemid = *(u8 *)&hwinfo[EEPROM_CUSTOMER_ID];
@@ -1802,16 +1798,15 @@ static void _rtl92de_read_adapter_info(struct ieee80211_hw *hw)
        rtlefuse->eeprom_did = *(u16 *)&hwinfo[EEPROM_DID];
        rtlefuse->eeprom_svid = *(u16 *)&hwinfo[EEPROM_SVID];
        rtlefuse->eeprom_smid = *(u16 *)&hwinfo[EEPROM_SMID];
+       RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "EEPROMId = 0x%4x\n", eeprom_id);
        RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
-                ("EEPROMId = 0x%4x\n", eeprom_id));
-       RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
-                ("EEPROM VID = 0x%4x\n", rtlefuse->eeprom_vid));
+                "EEPROM VID = 0x%4x\n", rtlefuse->eeprom_vid);
        RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
-                ("EEPROM DID = 0x%4x\n", rtlefuse->eeprom_did));
+                "EEPROM DID = 0x%4x\n", rtlefuse->eeprom_did);
        RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
-                ("EEPROM SVID = 0x%4x\n", rtlefuse->eeprom_svid));
+                "EEPROM SVID = 0x%4x\n", rtlefuse->eeprom_svid);
        RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
-                ("EEPROM SMID = 0x%4x\n", rtlefuse->eeprom_smid));
+                "EEPROM SMID = 0x%4x\n", rtlefuse->eeprom_smid);
 
        /* Read Permanent MAC address */
        if (rtlhal->interfaceindex == 0) {
@@ -1827,8 +1822,7 @@ static void _rtl92de_read_adapter_info(struct ieee80211_hw *hw)
        }
        rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_ETHER_ADDR,
                                      rtlefuse->dev_addr);
-       RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
-                ("%pM\n", rtlefuse->dev_addr));
+       RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "%pM\n", rtlefuse->dev_addr);
        _rtl92de_read_txpower_info(hw, rtlefuse->autoload_failflag, hwinfo);
 
        /* Read Channel Plan */
@@ -1849,7 +1843,7 @@ static void _rtl92de_read_adapter_info(struct ieee80211_hw *hw)
        rtlefuse->eeprom_version = *(u16 *)&hwinfo[EEPROM_VERSION];
        rtlefuse->txpwr_fromeprom = true;
        RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
-                ("EEPROM Customer ID: 0x%2x\n", rtlefuse->eeprom_oemid));
+                "EEPROM Customer ID: 0x%2x\n", rtlefuse->eeprom_oemid);
 }
 
 void rtl92de_read_eeprom_info(struct ieee80211_hw *hw)
@@ -1863,19 +1857,19 @@ void rtl92de_read_eeprom_info(struct ieee80211_hw *hw)
        tmp_u1b = rtl_read_byte(rtlpriv, REG_9346CR);
        rtlefuse->autoload_status = tmp_u1b;
        if (tmp_u1b & BIT(4)) {
-               RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, ("Boot from EEPROM\n"));
+               RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "Boot from EEPROM\n");
                rtlefuse->epromtype = EEPROM_93C46;
        } else {
-               RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, ("Boot from EFUSE\n"));
+               RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "Boot from EFUSE\n");
                rtlefuse->epromtype = EEPROM_BOOT_EFUSE;
        }
        if (tmp_u1b & BIT(5)) {
-               RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, ("Autoload OK\n"));
+               RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "Autoload OK\n");
 
                rtlefuse->autoload_failflag = false;
                _rtl92de_read_adapter_info(hw);
        } else {
-               RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, ("Autoload ERR!!\n"));
+               RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "Autoload ERR!!\n");
        }
        return;
 }
@@ -1958,8 +1952,8 @@ static void rtl92de_update_hal_rate_table(struct ieee80211_hw *hw,
                    (shortgi_rate << 4) | (shortgi_rate);
        }
        rtl_write_dword(rtlpriv, REG_ARFR0 + ratr_index * 4, ratr_value);
-       RT_TRACE(rtlpriv, COMP_RATR, DBG_DMESG,
-                ("%x\n", rtl_read_dword(rtlpriv, REG_ARFR0)));
+       RT_TRACE(rtlpriv, COMP_RATR, DBG_DMESG, "%x\n",
+                rtl_read_dword(rtlpriv, REG_ARFR0));
 }
 
 static void rtl92de_update_hal_rate_mask(struct ieee80211_hw *hw,
@@ -2092,8 +2086,8 @@ static void rtl92de_update_hal_rate_mask(struct ieee80211_hw *hw,
        value[0] = (ratr_bitmap & 0x0fffffff) | (ratr_index << 28);
        value[1] = macid | (shortgi ? 0x20 : 0x00) | 0x80;
        RT_TRACE(rtlpriv, COMP_RATR, DBG_DMESG,
-                ("ratr_bitmap :%x value0:%x value1:%x\n",
-                 ratr_bitmap, value[0], value[1]));
+                "ratr_bitmap :%x value0:%x value1:%x\n",
+                ratr_bitmap, value[0], value[1]);
        rtl92d_fill_h2c_cmd(hw, H2C_RA_MASK, 5, (u8 *) value);
        if (macid != 0)
                sta_entry->ratr_index = ratr_index;
@@ -2153,14 +2147,13 @@ bool rtl92de_gpio_radio_on_off_checking(struct ieee80211_hw *hw, u8 *valid)
        e_rfpowerstate_toset = (u1tmp & BIT(3)) ? ERFON : ERFOFF;
        if (ppsc->hwradiooff && (e_rfpowerstate_toset == ERFON)) {
                RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG,
-                        ("GPIOChangeRF  - HW Radio ON, RF ON\n"));
+                        "GPIOChangeRF  - HW Radio ON, RF ON\n");
                e_rfpowerstate_toset = ERFON;
                ppsc->hwradiooff = false;
                actuallyset = true;
-       } else if ((ppsc->hwradiooff == false)
-               && (e_rfpowerstate_toset == ERFOFF)) {
+       } else if (!ppsc->hwradiooff && (e_rfpowerstate_toset == ERFOFF)) {
                RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG,
-                        ("GPIOChangeRF  - HW Radio OFF, RF OFF\n"));
+                        "GPIOChangeRF  - HW Radio OFF, RF OFF\n");
                e_rfpowerstate_toset = ERFOFF;
                ppsc->hwradiooff = true;
                actuallyset = true;
@@ -2204,7 +2197,7 @@ void rtl92de_set_key(struct ieee80211_hw *hw, u32 key_index,
                u8 idx;
                u8 cam_offset = 0;
                u8 clear_number = 5;
-               RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG, ("clear_all\n"));
+               RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG, "clear_all\n");
                for (idx = 0; idx < clear_number; idx++) {
                        rtl_cam_mark_invalid(hw, cam_offset + idx);
                        rtl_cam_empty_entry(hw, cam_offset + idx);
@@ -2230,8 +2223,8 @@ void rtl92de_set_key(struct ieee80211_hw *hw, u32 key_index,
                        enc_algo = CAM_AES;
                        break;
                default:
-                       RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, ("switch case "
-                                               "not process\n"));
+                       RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
+                                "switch case not processed\n");
                        enc_algo = CAM_TKIP;
                        break;
                }
@@ -2248,9 +2241,8 @@ void rtl92de_set_key(struct ieee80211_hw *hw, u32 key_index,
                                                                 p_macaddr);
                                        if (entry_id >=  TOTAL_CAM_ENTRY) {
                                                RT_TRACE(rtlpriv, COMP_SEC,
-                                                        DBG_EMERG, ("Can not "
-                                                        "find free hw security"
-                                                        " cam entry\n"));
+                                                        DBG_EMERG,
+                                                        "Can not find free hw security cam entry\n");
                                                return;
                                        }
                                } else {
@@ -2262,29 +2254,29 @@ void rtl92de_set_key(struct ieee80211_hw *hw, u32 key_index,
                }
                if (rtlpriv->sec.key_len[key_index] == 0) {
                        RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG,
-                                ("delete one entry, entry_id is %d\n",
-                                entry_id));
+                                "delete one entry, entry_id is %d\n",
+                                entry_id);
                        if (mac->opmode == NL80211_IFTYPE_AP)
                                rtl_cam_del_entry(hw, p_macaddr);
                        rtl_cam_delete_one_entry(hw, p_macaddr, entry_id);
                } else {
                        RT_TRACE(rtlpriv, COMP_SEC, DBG_LOUD,
-                                ("The insert KEY length is %d\n",
-                                 rtlpriv->sec.key_len[PAIRWISE_KEYIDX]));
+                                "The insert KEY length is %d\n",
+                                rtlpriv->sec.key_len[PAIRWISE_KEYIDX]);
                        RT_TRACE(rtlpriv, COMP_SEC, DBG_LOUD,
-                                ("The insert KEY  is %x %x\n",
-                                 rtlpriv->sec.key_buf[0][0],
-                                 rtlpriv->sec.key_buf[0][1]));
+                                "The insert KEY is %x %x\n",
+                                rtlpriv->sec.key_buf[0][0],
+                                rtlpriv->sec.key_buf[0][1]);
                        RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG,
-                                ("add one entry\n"));
+                                "add one entry\n");
                        if (is_pairwise) {
                                RT_PRINT_DATA(rtlpriv, COMP_SEC, DBG_LOUD,
-                                             "Pairwiase Key content :",
+                                             "Pairwise Key content",
                                              rtlpriv->sec.pairwise_key,
                                              rtlpriv->
                                              sec.key_len[PAIRWISE_KEYIDX]);
                                RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG,
-                                        ("set Pairwiase key\n"));
+                                        "set Pairwise key\n");
                                rtl_cam_add_one_entry(hw, macaddr, key_index,
                                                      entry_id, enc_algo,
                                                      CAM_CONFIG_NO_USEDK,
@@ -2292,7 +2284,7 @@ void rtl92de_set_key(struct ieee80211_hw *hw, u32 key_index,
                                                      sec.key_buf[key_index]);
                        } else {
                                RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG,
-                                        ("set group key\n"));
+                                        "set group key\n");
                                if (mac->opmode == NL80211_IFTYPE_ADHOC) {
                                        rtl_cam_add_one_entry(hw,
                                                rtlefuse->dev_addr,
index ad44ffa..7c9f7a2 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2009-2010  Realtek Corporation.
+ * Copyright(c) 2009-2012  Realtek Corporation.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
index f1552f4..76a57ae 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2009-2010  Realtek Corporation.
+ * Copyright(c) 2009-2012  Realtek Corporation.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
@@ -45,8 +45,8 @@ void rtl92de_sw_led_on(struct ieee80211_hw *hw, struct rtl_led *pled)
        u8 ledcfg;
        struct rtl_priv *rtlpriv = rtl_priv(hw);
 
-       RT_TRACE(rtlpriv, COMP_LED, DBG_LOUD,
-                ("LedAddr:%X ledpin=%d\n", REG_LEDCFG2, pled->ledpin));
+       RT_TRACE(rtlpriv, COMP_LED, DBG_LOUD, "LedAddr:%X ledpin=%d\n",
+                REG_LEDCFG2, pled->ledpin);
 
        switch (pled->ledpin) {
        case LED_PIN_GPIO0:
@@ -71,7 +71,7 @@ void rtl92de_sw_led_on(struct ieee80211_hw *hw, struct rtl_led *pled)
                break;
        default:
                RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                        ("switch case not process\n"));
+                        "switch case not processed\n");
                break;
        }
        pled->ledon = true;
@@ -83,8 +83,8 @@ void rtl92de_sw_led_off(struct ieee80211_hw *hw, struct rtl_led *pled)
        struct rtl_pci_priv *pcipriv = rtl_pcipriv(hw);
        u8 ledcfg;
 
-       RT_TRACE(rtlpriv, COMP_LED, DBG_LOUD,
-                ("LedAddr:%X ledpin=%d\n", REG_LEDCFG2, pled->ledpin));
+       RT_TRACE(rtlpriv, COMP_LED, DBG_LOUD, "LedAddr:%X ledpin=%d\n",
+                REG_LEDCFG2, pled->ledpin);
 
        ledcfg = rtl_read_byte(rtlpriv, REG_LEDCFG2);
 
@@ -106,7 +106,7 @@ void rtl92de_sw_led_off(struct ieee80211_hw *hw, struct rtl_led *pled)
                break;
        default:
                RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                        ("switch case not process\n"));
+                        "switch case not processed\n");
                break;
        }
        pled->ledon = false;
@@ -153,7 +153,7 @@ void rtl92de_led_control(struct ieee80211_hw *hw, enum led_ctl_mode ledaction)
             ledaction == LED_CTL_POWER_ON)) {
                return;
        }
-       RT_TRACE(rtlpriv, COMP_LED, DBG_LOUD, ("ledaction %d,\n", ledaction));
+       RT_TRACE(rtlpriv, COMP_LED, DBG_LOUD, "ledaction %d,\n", ledaction);
 
        _rtl92ce_sw_led_control(hw, ledaction);
 }
index 57f4a3c..a29df30 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2009-2010  Realtek Corporation.
+ * Copyright(c) 2009-2012  Realtek Corporation.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
index 0883349..34591ee 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2009-2010  Realtek Corporation.
+ * Copyright(c) 2009-2012  Realtek Corporation.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
@@ -204,8 +204,8 @@ u32 rtl92d_phy_query_bb_reg(struct ieee80211_hw *hw, u32 regaddr, u32 bitmask)
        u32 returnvalue, originalvalue, bitshift;
        u8 dbi_direct;
 
-       RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, ("regaddr(%#x), "
-               "bitmask(%#x)\n", regaddr, bitmask));
+       RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, "regaddr(%#x), bitmask(%#x)\n",
+                regaddr, bitmask);
        if (rtlhal->during_mac1init_radioa || rtlhal->during_mac0init_radiob) {
                /* mac1 use phy0 read radio_b. */
                /* mac0 use phy1 read radio_b. */
@@ -220,8 +220,9 @@ u32 rtl92d_phy_query_bb_reg(struct ieee80211_hw *hw, u32 regaddr, u32 bitmask)
        }
        bitshift = _rtl92d_phy_calculate_bit_shift(bitmask);
        returnvalue = (originalvalue & bitmask) >> bitshift;
-       RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, ("BBR MASK=0x%x "
-               "Addr[0x%x]=0x%x\n", bitmask, regaddr, originalvalue));
+       RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
+                "BBR MASK=0x%x Addr[0x%x]=0x%x\n",
+                bitmask, regaddr, originalvalue);
        return returnvalue;
 }
 
@@ -233,8 +234,9 @@ void rtl92d_phy_set_bb_reg(struct ieee80211_hw *hw,
        u8 dbi_direct = 0;
        u32 originalvalue, bitshift;
 
-       RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, ("regaddr(%#x), bitmask(%#x),"
-               " data(%#x)\n", regaddr, bitmask, data));
+       RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
+                "regaddr(%#x), bitmask(%#x), data(%#x)\n",
+                regaddr, bitmask, data);
        if (rtlhal->during_mac1init_radioa)
                dbi_direct = BIT(3);
        else if (rtlhal->during_mac0init_radiob)
@@ -255,8 +257,9 @@ void rtl92d_phy_set_bb_reg(struct ieee80211_hw *hw,
                rtl92de_write_dword_dbi(hw, (u16) regaddr, data, dbi_direct);
        else
                rtl_write_dword(rtlpriv, regaddr, data);
-       RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, ("regaddr(%#x), bitmask(%#x),"
-                " data(%#x)\n", regaddr, bitmask, data));
+       RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
+                "regaddr(%#x), bitmask(%#x), data(%#x)\n",
+                regaddr, bitmask, data);
 }
 
 static u32 _rtl92d_phy_rf_serial_read(struct ieee80211_hw *hw,
@@ -300,8 +303,8 @@ static u32 _rtl92d_phy_rf_serial_read(struct ieee80211_hw *hw,
        else
                retvalue = rtl_get_bbreg(hw, pphyreg->rflssi_readback,
                        BLSSIREADBACKDATA);
-       RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, ("RFR-%d Addr[0x%x] = 0x%x\n",
-                rfpath, pphyreg->rflssi_readback, retvalue));
+       RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, "RFR-%d Addr[0x%x] = 0x%x\n",
+                rfpath, pphyreg->rflssi_readback, retvalue);
        return retvalue;
 }
 
@@ -319,8 +322,8 @@ static void _rtl92d_phy_rf_serial_write(struct ieee80211_hw *hw,
        /* T65 RF */
        data_and_addr = ((newoffset << 20) | (data & 0x000fffff)) & 0x0fffffff;
        rtl_set_bbreg(hw, pphyreg->rf3wire_offset, BMASKDWORD, data_and_addr);
-       RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, ("RFW-%d Addr[0x%x]=0x%x\n",
-               rfpath, pphyreg->rf3wire_offset, data_and_addr));
+       RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, "RFW-%d Addr[0x%x]=0x%x\n",
+                rfpath, pphyreg->rf3wire_offset, data_and_addr);
 }
 
 u32 rtl92d_phy_query_rf_reg(struct ieee80211_hw *hw,
@@ -330,17 +333,17 @@ u32 rtl92d_phy_query_rf_reg(struct ieee80211_hw *hw,
        u32 original_value, readback_value, bitshift;
        unsigned long flags;
 
-       RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, ("regaddr(%#x), "
-               "rfpath(%#x), bitmask(%#x)\n",
-               regaddr, rfpath, bitmask));
+       RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
+                "regaddr(%#x), rfpath(%#x), bitmask(%#x)\n",
+                regaddr, rfpath, bitmask);
        spin_lock_irqsave(&rtlpriv->locks.rf_lock, flags);
        original_value = _rtl92d_phy_rf_serial_read(hw, rfpath, regaddr);
        bitshift = _rtl92d_phy_calculate_bit_shift(bitmask);
        readback_value = (original_value & bitmask) >> bitshift;
        spin_unlock_irqrestore(&rtlpriv->locks.rf_lock, flags);
-       RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, ("regaddr(%#x), rfpath(%#x), "
-               "bitmask(%#x), original_value(%#x)\n",
-               regaddr, rfpath, bitmask, original_value));
+       RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
+                "regaddr(%#x), rfpath(%#x), bitmask(%#x), original_value(%#x)\n",
+                regaddr, rfpath, bitmask, original_value);
        return readback_value;
 }
 
@@ -353,8 +356,8 @@ void rtl92d_phy_set_rf_reg(struct ieee80211_hw *hw, enum radio_path rfpath,
        unsigned long flags;
 
        RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
-               ("regaddr(%#x), bitmask(%#x), data(%#x), rfpath(%#x)\n",
-               regaddr, bitmask, data, rfpath));
+                "regaddr(%#x), bitmask(%#x), data(%#x), rfpath(%#x)\n",
+                regaddr, bitmask, data, rfpath);
        if (bitmask == 0)
                return;
        spin_lock_irqsave(&rtlpriv->locks.rf_lock, flags);
@@ -369,9 +372,9 @@ void rtl92d_phy_set_rf_reg(struct ieee80211_hw *hw, enum radio_path rfpath,
                _rtl92d_phy_rf_serial_write(hw, rfpath, regaddr, data);
        }
        spin_unlock_irqrestore(&rtlpriv->locks.rf_lock, flags);
-       RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, ("regaddr(%#x), "
-               "bitmask(%#x), data(%#x), rfpath(%#x)\n",
-               regaddr, bitmask, data, rfpath));
+       RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
+                "regaddr(%#x), bitmask(%#x), data(%#x), rfpath(%#x)\n",
+                regaddr, bitmask, data, rfpath);
 }
 
 bool rtl92d_phy_mac_config(struct ieee80211_hw *hw)
@@ -381,10 +384,10 @@ bool rtl92d_phy_mac_config(struct ieee80211_hw *hw)
        u32 arraylength;
        u32 *ptrarray;
 
-       RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, ("Read Rtl819XMACPHY_Array\n"));
+       RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, "Read Rtl819XMACPHY_Array\n");
        arraylength = MAC_2T_ARRAYLENGTH;
        ptrarray = rtl8192de_mac_2tarray;
-       RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, ("Img:Rtl819XMAC_Array\n"));
+       RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, "Img:Rtl819XMAC_Array\n");
        for (i = 0; i < arraylength; i = i + 2)
                rtl_write_byte(rtlpriv, ptrarray[i], (u8) ptrarray[i + 1]);
        if (rtlpriv->rtlhal.macphymode == SINGLEMAC_SINGLEPHY) {
@@ -561,25 +564,25 @@ static bool _rtl92d_phy_config_bb_with_headerfile(struct ieee80211_hw *hw,
                agctab_arraylen = AGCTAB_ARRAYLENGTH;
                agctab_array_table = rtl8192de_agctab_array;
                RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
-                        (" ===> phy:MAC0, Rtl819XAGCTAB_Array\n"));
+                        " ===> phy:MAC0, Rtl819XAGCTAB_Array\n");
        } else {
                if (rtlhal->current_bandtype == BAND_ON_2_4G) {
                        agctab_arraylen = AGCTAB_2G_ARRAYLENGTH;
                        agctab_array_table = rtl8192de_agctab_2garray;
                        RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
-                                (" ===> phy:MAC1, Rtl819XAGCTAB_2GArray\n"));
+                                " ===> phy:MAC1, Rtl819XAGCTAB_2GArray\n");
                } else {
                        agctab_5garraylen = AGCTAB_5G_ARRAYLENGTH;
                        agctab_5garray_table = rtl8192de_agctab_5garray;
                        RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
-                                (" ===> phy:MAC1, Rtl819XAGCTAB_5GArray\n"));
+                                " ===> phy:MAC1, Rtl819XAGCTAB_5GArray\n");
 
                }
        }
        phy_reg_arraylen = PHY_REG_2T_ARRAYLENGTH;
        phy_regarray_table = rtl8192de_phy_reg_2tarray;
        RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
-                (" ===> phy:Rtl819XPHY_REG_Array_PG\n"));
+                " ===> phy:Rtl819XPHY_REG_Array_PG\n");
        if (configtype == BASEBAND_CONFIG_PHY_REG) {
                for (i = 0; i < phy_reg_arraylen; i = i + 2) {
                        if (phy_regarray_table[i] == 0xfe)
@@ -598,10 +601,9 @@ static bool _rtl92d_phy_config_bb_with_headerfile(struct ieee80211_hw *hw,
                                      phy_regarray_table[i + 1]);
                        udelay(1);
                        RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
-                                ("The phy_regarray_table[0] is %x"
-                                 " Rtl819XPHY_REGArray[1] is %x\n",
-                                 phy_regarray_table[i],
-                                 phy_regarray_table[i + 1]));
+                                "The phy_regarray_table[0] is %x Rtl819XPHY_REGArray[1] is %x\n",
+                                phy_regarray_table[i],
+                                phy_regarray_table[i + 1]);
                }
        } else if (configtype == BASEBAND_CONFIG_AGC_TAB) {
                if (rtlhal->interfaceindex == 0) {
@@ -613,15 +615,12 @@ static bool _rtl92d_phy_config_bb_with_headerfile(struct ieee80211_hw *hw,
                                 * setting. */
                                udelay(1);
                                RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
-                                        ("The Rtl819XAGCTAB_Array_"
-                                        "Table[0] is %ul "
-                                        "Rtl819XPHY_REGArray[1] is %ul\n",
+                                        "The Rtl819XAGCTAB_Array_Table[0] is %ul Rtl819XPHY_REGArray[1] is %ul\n",
                                         agctab_array_table[i],
-                                        agctab_array_table[i + 1]));
+                                        agctab_array_table[i + 1]);
                        }
                        RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
-                                ("Normal Chip, MAC0, load "
-                                "Rtl819XAGCTAB_Array\n"));
+                                "Normal Chip, MAC0, load Rtl819XAGCTAB_Array\n");
                } else {
                        if (rtlhal->current_bandtype == BAND_ON_2_4G) {
                                for (i = 0; i < agctab_arraylen; i = i + 2) {
@@ -632,14 +631,12 @@ static bool _rtl92d_phy_config_bb_with_headerfile(struct ieee80211_hw *hw,
                                         * setting. */
                                        udelay(1);
                                        RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
-                                                ("The Rtl819XAGCTAB_Array_"
-                                                "Table[0] is %ul Rtl819XPHY_"
-                                                "REGArray[1] is %ul\n",
+                                                "The Rtl819XAGCTAB_Array_Table[0] is %ul Rtl819XPHY_REGArray[1] is %ul\n",
                                                 agctab_array_table[i],
-                                                agctab_array_table[i + 1]));
+                                                agctab_array_table[i + 1]);
                                }
                                RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
-                                        ("Load Rtl819XAGCTAB_2GArray\n"));
+                                        "Load Rtl819XAGCTAB_2GArray\n");
                        } else {
                                for (i = 0; i < agctab_5garraylen; i = i + 2) {
                                        rtl_set_bbreg(hw,
@@ -650,14 +647,12 @@ static bool _rtl92d_phy_config_bb_with_headerfile(struct ieee80211_hw *hw,
                                         * setting. */
                                        udelay(1);
                                        RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
-                                                ("The Rtl819XAGCTAB_5GArray_"
-                                                "Table[0] is %ul Rtl819XPHY_"
-                                                "REGArray[1] is %ul\n",
+                                                "The Rtl819XAGCTAB_5GArray_Table[0] is %ul Rtl819XPHY_REGArray[1] is %ul\n",
                                                 agctab_5garray_table[i],
-                                                agctab_5garray_table[i + 1]));
+                                                agctab_5garray_table[i + 1]);
                                }
                                RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
-                                       ("Load Rtl819XAGCTAB_5GArray\n"));
+                                        "Load Rtl819XAGCTAB_5GArray\n");
                        }
                }
        }
@@ -670,152 +665,51 @@ static void _rtl92d_store_pwrindex_diffrate_offset(struct ieee80211_hw *hw,
 {
        struct rtl_priv *rtlpriv = rtl_priv(hw);
        struct rtl_phy *rtlphy = &(rtlpriv->phy);
+       int index;
+
+       if (regaddr == RTXAGC_A_RATE18_06)
+               index = 0;
+       else if (regaddr == RTXAGC_A_RATE54_24)
+               index = 1;
+       else if (regaddr == RTXAGC_A_CCK1_MCS32)
+               index = 6;
+       else if (regaddr == RTXAGC_B_CCK11_A_CCK2_11 && bitmask == 0xffffff00)
+               index = 7;
+       else if (regaddr == RTXAGC_A_MCS03_MCS00)
+               index = 2;
+       else if (regaddr == RTXAGC_A_MCS07_MCS04)
+               index = 3;
+       else if (regaddr == RTXAGC_A_MCS11_MCS08)
+               index = 4;
+       else if (regaddr == RTXAGC_A_MCS15_MCS12)
+               index = 5;
+       else if (regaddr == RTXAGC_B_RATE18_06)
+               index = 8;
+       else if (regaddr == RTXAGC_B_RATE54_24)
+               index = 9;
+       else if (regaddr == RTXAGC_B_CCK1_55_MCS32)
+               index = 14;
+       else if (regaddr == RTXAGC_B_CCK11_A_CCK2_11 && bitmask == 0x000000ff)
+               index = 15;
+       else if (regaddr == RTXAGC_B_MCS03_MCS00)
+               index = 10;
+       else if (regaddr == RTXAGC_B_MCS07_MCS04)
+               index = 11;
+       else if (regaddr == RTXAGC_B_MCS11_MCS08)
+               index = 12;
+       else if (regaddr == RTXAGC_B_MCS15_MCS12)
+               index = 13;
+       else
+               return;
 
-       if (regaddr == RTXAGC_A_RATE18_06) {
-               rtlphy->mcs_txpwrlevel_origoffset[rtlphy->pwrgroup_cnt][0] =
-                                                                        data;
-               RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
-                        ("MCSTxPowerLevelOriginalOffset[%d][0] = 0x%ulx\n",
-                        rtlphy->pwrgroup_cnt,
-                        rtlphy->mcs_txpwrlevel_origoffset
-                        [rtlphy->pwrgroup_cnt][0]));
-       }
-       if (regaddr == RTXAGC_A_RATE54_24) {
-               rtlphy->mcs_txpwrlevel_origoffset[rtlphy->pwrgroup_cnt][1] =
-                                                                        data;
-               RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
-                        ("MCSTxPowerLevelOriginalOffset[%d][1] = 0x%ulx\n",
-                        rtlphy->pwrgroup_cnt,
-                        rtlphy->mcs_txpwrlevel_origoffset
-                        [rtlphy->pwrgroup_cnt][1]));
-       }
-       if (regaddr == RTXAGC_A_CCK1_MCS32) {
-               rtlphy->mcs_txpwrlevel_origoffset[rtlphy->pwrgroup_cnt][6] =
-                                                                        data;
-               RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
-                        ("MCSTxPowerLevelOriginalOffset[%d][6] = 0x%ulx\n",
-                        rtlphy->pwrgroup_cnt,
-                        rtlphy->mcs_txpwrlevel_origoffset
-                        [rtlphy->pwrgroup_cnt][6]));
-       }
-       if (regaddr == RTXAGC_B_CCK11_A_CCK2_11 && bitmask == 0xffffff00) {
-               rtlphy->mcs_txpwrlevel_origoffset[rtlphy->pwrgroup_cnt][7] =
-                                                                        data;
-               RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
-                        ("MCSTxPowerLevelOriginalOffset[%d][7] = 0x%ulx\n",
-                        rtlphy->pwrgroup_cnt,
-                        rtlphy->mcs_txpwrlevel_origoffset
-                        [rtlphy->pwrgroup_cnt][7]));
-       }
-       if (regaddr == RTXAGC_A_MCS03_MCS00) {
-               rtlphy->mcs_txpwrlevel_origoffset[rtlphy->pwrgroup_cnt][2] =
-                                                                        data;
-               RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
-                        ("MCSTxPowerLevelOriginalOffset[%d][2] = 0x%ulx\n",
-                        rtlphy->pwrgroup_cnt,
-                        rtlphy->mcs_txpwrlevel_origoffset
-                        [rtlphy->pwrgroup_cnt][2]));
-       }
-       if (regaddr == RTXAGC_A_MCS07_MCS04) {
-               rtlphy->mcs_txpwrlevel_origoffset[rtlphy->pwrgroup_cnt][3] =
-                                                                        data;
-               RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
-                        ("MCSTxPowerLevelOriginalOffset[%d][3] = 0x%ulx\n",
-                        rtlphy->pwrgroup_cnt,
-                        rtlphy->mcs_txpwrlevel_origoffset
-                        [rtlphy->pwrgroup_cnt][3]));
-       }
-       if (regaddr == RTXAGC_A_MCS11_MCS08) {
-               rtlphy->mcs_txpwrlevel_origoffset[rtlphy->pwrgroup_cnt][4] =
-                                                                        data;
-               RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
-                        ("MCSTxPowerLevelOriginalOffset[%d][4] = 0x%ulx\n",
-                        rtlphy->pwrgroup_cnt,
-                        rtlphy->mcs_txpwrlevel_origoffset
-                        [rtlphy->pwrgroup_cnt][4]));
-       }
-       if (regaddr == RTXAGC_A_MCS15_MCS12) {
-               rtlphy->mcs_txpwrlevel_origoffset[rtlphy->pwrgroup_cnt][5] =
-                                                                        data;
-               RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
-                        ("MCSTxPowerLevelOriginalOffset[%d][5] = 0x%ulx\n",
-                        rtlphy->pwrgroup_cnt,
-                        rtlphy->mcs_txpwrlevel_origoffset
-                        [rtlphy->pwrgroup_cnt][5]));
-       }
-       if (regaddr == RTXAGC_B_RATE18_06) {
-               rtlphy->mcs_txpwrlevel_origoffset[rtlphy->pwrgroup_cnt][8] =
-                                                                        data;
-               RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
-                        ("MCSTxPowerLevelOriginalOffset[%d][8] = 0x%ulx\n",
-                        rtlphy->pwrgroup_cnt,
-                        rtlphy->mcs_txpwrlevel_origoffset
-                        [rtlphy->pwrgroup_cnt][8]));
-       }
-       if (regaddr == RTXAGC_B_RATE54_24) {
-               rtlphy->mcs_txpwrlevel_origoffset[rtlphy->pwrgroup_cnt][9] =
-                                                                        data;
-               RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
-                        ("MCSTxPowerLevelOriginalOffset[%d][9] = 0x%ulx\n",
-                        rtlphy->pwrgroup_cnt,
-                        rtlphy->mcs_txpwrlevel_origoffset
-                        [rtlphy->pwrgroup_cnt][9]));
-       }
-       if (regaddr == RTXAGC_B_CCK1_55_MCS32) {
-               rtlphy->mcs_txpwrlevel_origoffset[rtlphy->pwrgroup_cnt][14] =
-                                                                        data;
-               RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
-                        ("MCSTxPowerLevelOriginalOffset[%d][14] = 0x%ulx\n",
-                        rtlphy->pwrgroup_cnt,
-                        rtlphy->mcs_txpwrlevel_origoffset
-                        [rtlphy->pwrgroup_cnt][14]));
-       }
-       if (regaddr == RTXAGC_B_CCK11_A_CCK2_11 && bitmask == 0x000000ff) {
-               rtlphy->mcs_txpwrlevel_origoffset[rtlphy->pwrgroup_cnt][15] =
-                                                                        data;
-               RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
-                        ("MCSTxPowerLevelOriginalOffset[%d][15] = 0x%ulx\n",
-                        rtlphy->pwrgroup_cnt,
-                        rtlphy->mcs_txpwrlevel_origoffset
-                        [rtlphy->pwrgroup_cnt][15]));
-       }
-       if (regaddr == RTXAGC_B_MCS03_MCS00) {
-               rtlphy->mcs_txpwrlevel_origoffset[rtlphy->pwrgroup_cnt][10] =
-                                                                        data;
-               RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
-                        ("MCSTxPowerLevelOriginalOffset[%d][10] = 0x%ulx\n",
-                        rtlphy->pwrgroup_cnt,
-                        rtlphy->mcs_txpwrlevel_origoffset
-                        [rtlphy->pwrgroup_cnt][10]));
-       }
-       if (regaddr == RTXAGC_B_MCS07_MCS04) {
-               rtlphy->mcs_txpwrlevel_origoffset[rtlphy->pwrgroup_cnt][11] =
-                                                                        data;
-               RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
-                        ("MCSTxPowerLevelOriginalOffset[%d][11] = 0x%ulx\n",
-                        rtlphy->pwrgroup_cnt,
-                        rtlphy->mcs_txpwrlevel_origoffset
-                        [rtlphy->pwrgroup_cnt][11]));
-       }
-       if (regaddr == RTXAGC_B_MCS11_MCS08) {
-               rtlphy->mcs_txpwrlevel_origoffset[rtlphy->pwrgroup_cnt][12] =
-                                                                        data;
-               RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
-                        ("MCSTxPowerLevelOriginalOffset[%d][12] = 0x%ulx\n",
-                         rtlphy->pwrgroup_cnt,
-                         rtlphy->mcs_txpwrlevel_origoffset
-                                       [rtlphy->pwrgroup_cnt][12]));
-       }
-       if (regaddr == RTXAGC_B_MCS15_MCS12) {
-               rtlphy->mcs_txpwrlevel_origoffset[rtlphy->pwrgroup_cnt][13] =
-                                                                        data;
-               RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
-                        ("MCSTxPowerLevelOriginalOffset[%d][13] = 0x%ulx\n",
-                         rtlphy->pwrgroup_cnt,
-                         rtlphy->mcs_txpwrlevel_origoffset
-                                       [rtlphy->pwrgroup_cnt][13]));
+       rtlphy->mcs_txpwrlevel_origoffset[rtlphy->pwrgroup_cnt][index] = data;
+       RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
+                "MCSTxPowerLevelOriginalOffset[%d][%d] = 0x%ulx\n",
+                rtlphy->pwrgroup_cnt, index,
+                rtlphy->mcs_txpwrlevel_origoffset
+                [rtlphy->pwrgroup_cnt][index]);
+       if (index == 13)
                rtlphy->pwrgroup_cnt++;
-       }
 }
 
 static bool _rtl92d_phy_config_bb_with_pgheaderfile(struct ieee80211_hw *hw,
@@ -849,7 +743,7 @@ static bool _rtl92d_phy_config_bb_with_pgheaderfile(struct ieee80211_hw *hw,
                }
        } else {
                RT_TRACE(rtlpriv, COMP_SEND, DBG_TRACE,
-                        ("configtype != BaseBand_Config_PHY_REG\n"));
+                        "configtype != BaseBand_Config_PHY_REG\n");
        }
        return true;
 }
@@ -861,17 +755,17 @@ static bool _rtl92d_phy_bb_config(struct ieee80211_hw *hw)
        struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
        bool rtstatus = true;
 
-       RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, ("==>\n"));
+       RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, "==>\n");
        rtstatus = _rtl92d_phy_config_bb_with_headerfile(hw,
                BASEBAND_CONFIG_PHY_REG);
-       if (rtstatus != true) {
-               RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, ("Write BB Reg Fail!!"));
+       if (!rtstatus) {
+               RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "Write BB Reg Fail!!\n");
                return false;
        }
 
        /* if (rtlphy->rf_type == RF_1T2R) {
         *      _rtl92c_phy_bb_config_1t(hw);
-        *     RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, ("Config to 1T!!\n"));
+        *     RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, "Config to 1T!!\n");
         *} */
 
        if (rtlefuse->autoload_failflag == false) {
@@ -879,14 +773,14 @@ static bool _rtl92d_phy_bb_config(struct ieee80211_hw *hw)
                rtstatus = _rtl92d_phy_config_bb_with_pgheaderfile(hw,
                        BASEBAND_CONFIG_PHY_REG);
        }
-       if (rtstatus != true) {
-               RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, ("BB_PG Reg Fail!!"));
+       if (!rtstatus) {
+               RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "BB_PG Reg Fail!!\n");
                return false;
        }
        rtstatus = _rtl92d_phy_config_bb_with_headerfile(hw,
                BASEBAND_CONFIG_AGC_TAB);
-       if (rtstatus != true) {
-               RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, ("AGC Table Fail\n"));
+       if (!rtstatus) {
+               RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "AGC Table Fail\n");
                return false;
        }
        rtlphy->cck_high_power = (bool) (rtl_get_bbreg(hw,
@@ -951,19 +845,17 @@ bool rtl92d_phy_config_rf_with_headerfile(struct ieee80211_hw *hw,
                radiob_array_table = rtl8192de_radiob_2t_int_paarray;
        }
        RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
-                ("PHY_ConfigRFWithHeaderFile() "
-                "Radio_A:Rtl819XRadioA_1TArray\n"));
+                "PHY_ConfigRFWithHeaderFile() Radio_A:Rtl819XRadioA_1TArray\n");
        RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
-                ("PHY_ConfigRFWithHeaderFile() "
-                "Radio_B:Rtl819XRadioB_1TArray\n"));
-       RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, ("Radio No %x\n", rfpath));
+                "PHY_ConfigRFWithHeaderFile() Radio_B:Rtl819XRadioB_1TArray\n");
+       RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, "Radio No %x\n", rfpath);
 
        /* this only happens when DMDP, mac0 start on 2.4G,
         * mac1 start on 5G, mac 0 has to set phy0&phy1
         * pathA or mac1 has to set phy0&phy1 pathA */
        if ((content == radiob_txt) && (rfpath == RF90_PATH_A)) {
                RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
-                        (" ===> althougth Path A, we load radiob.txt\n"));
+                        " ===> althougth Path A, we load radiob.txt\n");
                radioa_arraylen = radiob_arraylen;
                radioa_array_table = radiob_array_table;
        }
@@ -1022,11 +914,11 @@ bool rtl92d_phy_config_rf_with_headerfile(struct ieee80211_hw *hw,
                break;
        case RF90_PATH_C:
                RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                        ("switch case not process\n"));
+                        "switch case not processed\n");
                break;
        case RF90_PATH_D:
                RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                        ("switch case not process\n"));
+                        "switch case not processed\n");
                break;
        }
        return true;
@@ -1046,19 +938,18 @@ void rtl92d_phy_get_hw_reg_originalvalue(struct ieee80211_hw *hw)
        rtlphy->default_initialgain[3] =
            (u8) rtl_get_bbreg(hw, ROFDM0_XDAGCCORE1, BMASKBYTE0);
        RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
-                ("Default initial gain (c50=0x%x, "
-                 "c58=0x%x, c60=0x%x, c68=0x%x\n",
-                 rtlphy->default_initialgain[0],
-                 rtlphy->default_initialgain[1],
-                 rtlphy->default_initialgain[2],
-                 rtlphy->default_initialgain[3]));
+                "Default initial gain (c50=0x%x, c58=0x%x, c60=0x%x, c68=0x%x\n",
+                rtlphy->default_initialgain[0],
+                rtlphy->default_initialgain[1],
+                rtlphy->default_initialgain[2],
+                rtlphy->default_initialgain[3]);
        rtlphy->framesync = (u8)rtl_get_bbreg(hw, ROFDM0_RXDETECTOR3,
                                              BMASKBYTE0);
        rtlphy->framesync_c34 = rtl_get_bbreg(hw, ROFDM0_RXDETECTOR2,
                                              BMASKDWORD);
        RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
-                ("Default framesync (0x%x) = 0x%x\n",
-                 ROFDM0_RXDETECTOR3, rtlphy->framesync));
+                "Default framesync (0x%x) = 0x%x\n",
+                ROFDM0_RXDETECTOR3, rtlphy->framesync);
 }
 
 static void _rtl92d_get_txpower_index(struct ieee80211_hw *hw, u8 channel,
@@ -1137,7 +1028,7 @@ void rtl92d_phy_set_txpower_level(struct ieee80211_hw *hw, u8 channel)
        struct rtl_priv *rtlpriv = rtl_priv(hw);
        u8 cckpowerlevel[2], ofdmpowerlevel[2];
 
-       if (rtlefuse->txpwr_fromeprom == false)
+       if (!rtlefuse->txpwr_fromeprom)
                return;
        channel = _rtl92c_phy_get_rightchnlplace(channel);
        _rtl92d_get_txpower_index(hw, channel, &cckpowerlevel[0],
@@ -1172,7 +1063,7 @@ void rtl92d_phy_scan_operation_backup(struct ieee80211_hw *hw, u8 operation)
                        break;
                default:
                        RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                                ("Unknown Scan Backup operation.\n"));
+                                "Unknown Scan Backup operation\n");
                        break;
                }
        }
@@ -1193,14 +1084,13 @@ void rtl92d_phy_set_bw_mode(struct ieee80211_hw *hw,
                return;
        if ((is_hal_stop(rtlhal)) || (RT_CANNOT_IO(hw))) {
                RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
-                        ("FALSE driver sleep or unload\n"));
+                        "FALSE driver sleep or unload\n");
                return;
        }
        rtlphy->set_bwmode_inprogress = true;
-       RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE,
-                ("Switch to %s bandwidth\n",
-                 rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20 ?
-                 "20MHz" : "40MHz"));
+       RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE, "Switch to %s bandwidth\n",
+                rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20 ?
+                "20MHz" : "40MHz");
        reg_bw_opmode = rtl_read_byte(rtlpriv, REG_BWOPMODE);
        reg_prsr_rsc = rtl_read_byte(rtlpriv, REG_RRSR + 2);
        switch (rtlphy->current_chan_bw) {
@@ -1218,7 +1108,7 @@ void rtl92d_phy_set_bw_mode(struct ieee80211_hw *hw,
                break;
        default:
                RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                        ("unknown bandwidth: %#X\n", rtlphy->current_chan_bw));
+                        "unknown bandwidth: %#X\n", rtlphy->current_chan_bw);
                break;
        }
        switch (rtlphy->current_chan_bw) {
@@ -1250,13 +1140,13 @@ void rtl92d_phy_set_bw_mode(struct ieee80211_hw *hw,
                break;
        default:
                RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                        ("unknown bandwidth: %#X\n", rtlphy->current_chan_bw));
+                        "unknown bandwidth: %#X\n", rtlphy->current_chan_bw);
                break;
 
        }
        rtl92d_phy_rf6052_set_bandwidth(hw, rtlphy->current_chan_bw);
        rtlphy->set_bwmode_inprogress = false;
-       RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE, ("<==\n"));
+       RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE, "<==\n");
 }
 
 static void _rtl92d_phy_stop_trx_before_changeband(struct ieee80211_hw *hw)
@@ -1273,7 +1163,7 @@ static void rtl92d_phy_switch_wirelessband(struct ieee80211_hw *hw, u8 band)
        struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
        u8 value8;
 
-       RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, ("==>\n"));
+       RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "==>\n");
        rtlhal->bandset = band;
        rtlhal->current_bandtype = band;
        if (IS_92D_SINGLEPHY(rtlhal->version))
@@ -1283,13 +1173,13 @@ static void rtl92d_phy_switch_wirelessband(struct ieee80211_hw *hw, u8 band)
        /* reconfig BB/RF according to wireless mode */
        if (rtlhal->current_bandtype == BAND_ON_2_4G) {
                /* BB & RF Config */
-               RT_TRACE(rtlpriv, COMP_CMD, DBG_DMESG, ("====>2.4G\n"));
+               RT_TRACE(rtlpriv, COMP_CMD, DBG_DMESG, "====>2.4G\n");
                if (rtlhal->interfaceindex == 1)
                        _rtl92d_phy_config_bb_with_headerfile(hw,
                                BASEBAND_CONFIG_AGC_TAB);
        } else {
                /* 5G band */
-               RT_TRACE(rtlpriv, COMP_CMD, DBG_DMESG, ("====>5G\n"));
+               RT_TRACE(rtlpriv, COMP_CMD, DBG_DMESG, "====>5G\n");
                if (rtlhal->interfaceindex == 1)
                        _rtl92d_phy_config_bb_with_headerfile(hw,
                                BASEBAND_CONFIG_AGC_TAB);
@@ -1317,7 +1207,7 @@ static void rtl92d_phy_switch_wirelessband(struct ieee80211_hw *hw, u8 band)
                        0 ? REG_MAC0 : REG_MAC1), value8);
        }
        mdelay(1);
-       RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, ("<==Switch Band OK.\n"));
+       RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "<==Switch Band OK\n");
 }
 
 static void _rtl92d_phy_reload_imr_setting(struct ieee80211_hw *hw,
@@ -1329,9 +1219,9 @@ static void _rtl92d_phy_reload_imr_setting(struct ieee80211_hw *hw,
        u8 group, i;
        unsigned long flag = 0;
 
-       RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, ("====>path %d\n", rfpath));
+       RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, "====>path %d\n", rfpath);
        if (rtlpriv->rtlhal.current_bandtype == BAND_ON_5G) {
-               RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, ("====>5G\n"));
+               RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, "====>5G\n");
                rtl_set_bbreg(hw, RFPGA0_RFMOD, BIT(25) | BIT(24), 0);
                rtl_set_bbreg(hw, RFPGA0_ANALOGPARAMETER4, 0x00f00000, 0xf);
                /* fc area 0xd2c */
@@ -1353,14 +1243,13 @@ static void _rtl92d_phy_reload_imr_setting(struct ieee80211_hw *hw,
        } else {
                /* G band. */
                RT_TRACE(rtlpriv, COMP_SCAN, DBG_LOUD,
-                        ("Load RF IMR parameters for G band. IMR already "
-                        "setting %d\n",
-                         rtlpriv->rtlhal.load_imrandiqk_setting_for2g));
-               RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, ("====>2.4G\n"));
+                        "Load RF IMR parameters for G band. IMR already setting %d\n",
+                        rtlpriv->rtlhal.load_imrandiqk_setting_for2g);
+               RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, "====>2.4G\n");
                if (!rtlpriv->rtlhal.load_imrandiqk_setting_for2g) {
                        RT_TRACE(rtlpriv, COMP_SCAN, DBG_LOUD,
-                               ("Load RF IMR parameters "
-                               "for G band. %d\n", rfpath));
+                                "Load RF IMR parameters for G band. %d\n",
+                                rfpath);
                        rtl92d_acquire_cckandrw_pagea_ctl(hw, &flag);
                        rtl_set_bbreg(hw, RFPGA0_RFMOD, BIT(25) | BIT(24), 0);
                        rtl_set_bbreg(hw, RFPGA0_ANALOGPARAMETER4,
@@ -1378,7 +1267,7 @@ static void _rtl92d_phy_reload_imr_setting(struct ieee80211_hw *hw,
                        rtl92d_release_cckandrw_pagea_ctl(hw, &flag);
                }
        }
-       RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, ("<====\n"));
+       RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, "<====\n");
 }
 
 static void _rtl92d_phy_enable_rf_env(struct ieee80211_hw *hw,
@@ -1388,7 +1277,7 @@ static void _rtl92d_phy_enable_rf_env(struct ieee80211_hw *hw,
        struct rtl_phy *rtlphy = &(rtlpriv->phy);
        struct bb_reg_def *pphyreg = &rtlphy->phyreg_def[rfpath];
 
-       RT_TRACE(rtlpriv, COMP_RF, DBG_LOUD, ("====>\n"));
+       RT_TRACE(rtlpriv, COMP_RF, DBG_LOUD, "====>\n");
        /*----Store original RFENV control type----*/
        switch (rfpath) {
        case RF90_PATH_A:
@@ -1414,7 +1303,7 @@ static void _rtl92d_phy_enable_rf_env(struct ieee80211_hw *hw,
        /*Set 0 to 12 bits for 8255 */
        rtl_set_bbreg(hw, pphyreg->rfhssi_para2, B3WIREDATALENGTH, 0x0);
        udelay(1);
-       RT_TRACE(rtlpriv, COMP_RF, DBG_LOUD, ("<====\n"));
+       RT_TRACE(rtlpriv, COMP_RF, DBG_LOUD, "<====\n");
 }
 
 static void _rtl92d_phy_restore_rf_env(struct ieee80211_hw *hw, u8 rfpath,
@@ -1424,7 +1313,7 @@ static void _rtl92d_phy_restore_rf_env(struct ieee80211_hw *hw, u8 rfpath,
        struct rtl_phy *rtlphy = &(rtlpriv->phy);
        struct bb_reg_def *pphyreg = &rtlphy->phyreg_def[rfpath];
 
-       RT_TRACE(rtlpriv, COMP_RF, DBG_LOUD, ("=====>\n"));
+       RT_TRACE(rtlpriv, COMP_RF, DBG_LOUD, "=====>\n");
        /*----Restore RFENV control type----*/ ;
        switch (rfpath) {
        case RF90_PATH_A:
@@ -1437,7 +1326,7 @@ static void _rtl92d_phy_restore_rf_env(struct ieee80211_hw *hw, u8 rfpath,
                              *pu4_regval);
                break;
        }
-       RT_TRACE(rtlpriv, COMP_RF, DBG_LOUD, ("<=====\n"));
+       RT_TRACE(rtlpriv, COMP_RF, DBG_LOUD, "<=====\n");
 }
 
 static void _rtl92d_phy_switch_rf_setting(struct ieee80211_hw *hw, u8 channel)
@@ -1451,13 +1340,13 @@ static void _rtl92d_phy_switch_rf_setting(struct ieee80211_hw *hw, u8 channel)
        bool need_pwr_down = false, internal_pa = false;
        u32 u4regvalue, mask = 0x1C000, value = 0, u4tmp, u4tmp2;
 
-       RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, ("====>\n"));
+       RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, "====>\n");
        /* config path A for 5G */
        if (rtlhal->current_bandtype == BAND_ON_5G) {
-               RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, ("====>5G\n"));
+               RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, "====>5G\n");
                u4tmp = curveindex_5g[channel - 1];
-               RTPRINT(rtlpriv, FINIT, INIT_IQK, ("ver 1 set RF-A, 5G, "
-                       "0x28 = 0x%x !!\n", u4tmp));
+               RTPRINT(rtlpriv, FINIT, INIT_IQK,
+                       "ver 1 set RF-A, 5G, 0x28 = 0x%x !!\n", u4tmp);
                for (i = 0; i < RF_CHNL_NUM_5G; i++) {
                        if (channel == rf_chnl_5g[i] && channel <= 140)
                                index = 0;
@@ -1503,12 +1392,13 @@ static void _rtl92d_phy_switch_rf_setting(struct ieee80211_hw *hw, u8 channel)
                                              rf_reg_pram_c_5g[index][i]);
                        }
                        RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
-                               ("offset 0x%x value 0x%x "
-                               "path %d index %d readback 0x%x\n",
-                               rf_reg_for_c_cut_5g[i],
-                               rf_reg_pram_c_5g[index][i], path,
-                               index, rtl_get_rfreg(hw, (enum radio_path)path,
-                               rf_reg_for_c_cut_5g[i], BRFREGOFFSETMASK)));
+                                "offset 0x%x value 0x%x path %d index %d readback 0x%x\n",
+                                rf_reg_for_c_cut_5g[i],
+                                rf_reg_pram_c_5g[index][i],
+                                path, index,
+                                rtl_get_rfreg(hw, (enum radio_path)path,
+                                              rf_reg_for_c_cut_5g[i],
+                                              BRFREGOFFSETMASK));
                }
                if (need_pwr_down)
                        _rtl92d_phy_restore_rf_env(hw, path, &u4regvalue);
@@ -1541,11 +1431,10 @@ static void _rtl92d_phy_switch_rf_setting(struct ieee80211_hw *hw, u8 channel)
                                                BRFREGOFFSETMASK,
                                                rf_pram_c_5g_int_pa[index][i]);
                                        RT_TRACE(rtlpriv, COMP_RF, DBG_LOUD,
-                                                ("offset 0x%x value 0x%x "
-                                                "path %d index %d\n",
+                                                "offset 0x%x value 0x%x path %d index %d\n",
                                                 rf_for_c_cut_5g_internal_pa[i],
                                                 rf_pram_c_5g_int_pa[index][i],
-                                                rfpath, index));
+                                                rfpath, index);
                                }
                        } else {
                                rtl_set_rfreg(hw, (enum radio_path)rfpath, 0x0B,
@@ -1553,10 +1442,10 @@ static void _rtl92d_phy_switch_rf_setting(struct ieee80211_hw *hw, u8 channel)
                        }
                }
        } else if (rtlhal->current_bandtype == BAND_ON_2_4G) {
-               RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, ("====>2.4G\n"));
+               RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, "====>2.4G\n");
                u4tmp = curveindex_2g[channel - 1];
-               RTPRINT(rtlpriv, FINIT, INIT_IQK, ("ver 3 set RF-B, 2G, "
-                       "0x28 = 0x%x !!\n", u4tmp));
+               RTPRINT(rtlpriv, FINIT, INIT_IQK,
+                       "ver 3 set RF-B, 2G, 0x28 = 0x%x !!\n", u4tmp);
                if (channel == 1 || channel == 2 || channel == 4 || channel == 9
                    || channel == 10 || channel == 11 || channel == 12)
                        index = 0;
@@ -1590,18 +1479,17 @@ static void _rtl92d_phy_switch_rf_setting(struct ieee80211_hw *hw, u8 channel)
                                              rf_reg_param_for_c_cut_2g
                                              [index][i]);
                        RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
-                               ("offset 0x%x value 0x%x mak 0x%x path %d "
-                               "index %d readback 0x%x\n",
-                               rf_reg_for_c_cut_2g[i],
-                               rf_reg_param_for_c_cut_2g[index][i],
-                               rf_reg_mask_for_c_cut_2g[i], path, index,
-                               rtl_get_rfreg(hw, (enum radio_path)path,
-                               rf_reg_for_c_cut_2g[i],
-                               BRFREGOFFSETMASK)));
+                                "offset 0x%x value 0x%x mak 0x%x path %d index %d readback 0x%x\n",
+                                rf_reg_for_c_cut_2g[i],
+                                rf_reg_param_for_c_cut_2g[index][i],
+                                rf_reg_mask_for_c_cut_2g[i], path, index,
+                                rtl_get_rfreg(hw, (enum radio_path)path,
+                                              rf_reg_for_c_cut_2g[i],
+                                              BRFREGOFFSETMASK));
                }
                RTPRINT(rtlpriv, FINIT, INIT_IQK,
-                       ("cosa ver 3 set RF-B, 2G, 0x28 = 0x%x !!\n",
-                       rf_syn_g4_for_c_cut_2g | (u4tmp << 11)));
+                       "cosa ver 3 set RF-B, 2G, 0x28 = 0x%x !!\n",
+                       rf_syn_g4_for_c_cut_2g | (u4tmp << 11));
 
                rtl_set_rfreg(hw, (enum radio_path)path, RF_SYN_G4,
                              BRFREGOFFSETMASK,
@@ -1611,7 +1499,7 @@ static void _rtl92d_phy_switch_rf_setting(struct ieee80211_hw *hw, u8 channel)
                if (rtlhal->during_mac0init_radiob)
                        rtl92d_phy_powerdown_anotherphy(hw, true);
        }
-       RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, ("<====\n"));
+       RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, "<====\n");
 }
 
 u8 rtl92d_get_rightchnlplace_for_iqk(u8 chnl)
@@ -1648,9 +1536,9 @@ static u8 _rtl92d_phy_patha_iqk(struct ieee80211_hw *hw, bool configpathb)
        u32 regeac, rege94, rege9c, regea4;
        u8 result = 0;
 
-       RTPRINT(rtlpriv, FINIT, INIT_IQK, ("Path A IQK!\n"));
+       RTPRINT(rtlpriv, FINIT, INIT_IQK,  "Path A IQK!\n");
        /* path-A IQK setting */
-       RTPRINT(rtlpriv, FINIT, INIT_IQK, ("Path-A IQK setting!\n"));
+       RTPRINT(rtlpriv, FINIT, INIT_IQK,  "Path-A IQK setting!\n");
        if (rtlhal->interfaceindex == 0) {
                rtl_set_bbreg(hw, 0xe30, BMASKDWORD, 0x10008c1f);
                rtl_set_bbreg(hw, 0xe34, BMASKDWORD, 0x10008c1f);
@@ -1668,26 +1556,26 @@ static u8 _rtl92d_phy_patha_iqk(struct ieee80211_hw *hw, bool configpathb)
                rtl_set_bbreg(hw, 0xe5c, BMASKDWORD, 0x28160206);
        }
        /* LO calibration setting */
-       RTPRINT(rtlpriv, FINIT, INIT_IQK, ("LO calibration setting!\n"));
+       RTPRINT(rtlpriv, FINIT, INIT_IQK,  "LO calibration setting!\n");
        rtl_set_bbreg(hw, 0xe4c, BMASKDWORD, 0x00462911);
        /* One shot, path A LOK & IQK */
-       RTPRINT(rtlpriv, FINIT, INIT_IQK, ("One shot, path A LOK & IQK!\n"));
+       RTPRINT(rtlpriv, FINIT, INIT_IQK,  "One shot, path A LOK & IQK!\n");
        rtl_set_bbreg(hw, 0xe48, BMASKDWORD, 0xf9000000);
        rtl_set_bbreg(hw, 0xe48, BMASKDWORD, 0xf8000000);
        /* delay x ms */
        RTPRINT(rtlpriv, FINIT, INIT_IQK,
-               ("Delay %d ms for One shot, path A LOK & IQK.\n",
-               IQK_DELAY_TIME));
+               "Delay %d ms for One shot, path A LOK & IQK\n",
+               IQK_DELAY_TIME);
        mdelay(IQK_DELAY_TIME);
        /* Check failed */
        regeac = rtl_get_bbreg(hw, 0xeac, BMASKDWORD);
-       RTPRINT(rtlpriv, FINIT, INIT_IQK, ("0xeac = 0x%x\n", regeac));
+       RTPRINT(rtlpriv, FINIT, INIT_IQK,  "0xeac = 0x%x\n", regeac);
        rege94 = rtl_get_bbreg(hw, 0xe94, BMASKDWORD);
-       RTPRINT(rtlpriv, FINIT, INIT_IQK, ("0xe94 = 0x%x\n", rege94));
+       RTPRINT(rtlpriv, FINIT, INIT_IQK,  "0xe94 = 0x%x\n", rege94);
        rege9c = rtl_get_bbreg(hw, 0xe9c, BMASKDWORD);
-       RTPRINT(rtlpriv, FINIT, INIT_IQK, ("0xe9c = 0x%x\n", rege9c));
+       RTPRINT(rtlpriv, FINIT, INIT_IQK,  "0xe9c = 0x%x\n", rege9c);
        regea4 = rtl_get_bbreg(hw, 0xea4, BMASKDWORD);
-       RTPRINT(rtlpriv, FINIT, INIT_IQK, ("0xea4 = 0x%x\n", regea4));
+       RTPRINT(rtlpriv, FINIT, INIT_IQK,  "0xea4 = 0x%x\n", regea4);
        if (!(regeac & BIT(28)) && (((rege94 & 0x03FF0000) >> 16) != 0x142) &&
            (((rege9c & 0x03FF0000) >> 16) != 0x42))
                result |= 0x01;
@@ -1698,7 +1586,7 @@ static u8 _rtl92d_phy_patha_iqk(struct ieee80211_hw *hw, bool configpathb)
            (((regeac & 0x03FF0000) >> 16) != 0x36))
                result |= 0x02;
        else
-               RTPRINT(rtlpriv, FINIT, INIT_IQK, ("Path A Rx IQK fail!!\n"));
+               RTPRINT(rtlpriv, FINIT, INIT_IQK,  "Path A Rx IQK fail!!\n");
        return result;
 }
 
@@ -1719,9 +1607,9 @@ static u8 _rtl92d_phy_patha_iqk_5g_normal(struct ieee80211_hw *hw,
                TxOKBit = BIT(31);
                RxOKBit = BIT(30);
        }
-       RTPRINT(rtlpriv, FINIT, INIT_IQK, ("Path A IQK!\n"));
+       RTPRINT(rtlpriv, FINIT, INIT_IQK,  "Path A IQK!\n");
        /* path-A IQK setting */
-       RTPRINT(rtlpriv, FINIT, INIT_IQK, ("Path-A IQK setting!\n"));
+       RTPRINT(rtlpriv, FINIT, INIT_IQK,  "Path-A IQK setting!\n");
        rtl_set_bbreg(hw, 0xe30, BMASKDWORD, 0x18008c1f);
        rtl_set_bbreg(hw, 0xe34, BMASKDWORD, 0x18008c1f);
        rtl_set_bbreg(hw, 0xe38, BMASKDWORD, 0x82140307);
@@ -1734,7 +1622,7 @@ static u8 _rtl92d_phy_patha_iqk_5g_normal(struct ieee80211_hw *hw,
                rtl_set_bbreg(hw, 0xe5c, BMASKDWORD, 0x68110000);
        }
        /* LO calibration setting */
-       RTPRINT(rtlpriv, FINIT, INIT_IQK, ("LO calibration setting!\n"));
+       RTPRINT(rtlpriv, FINIT, INIT_IQK,  "LO calibration setting!\n");
        rtl_set_bbreg(hw, 0xe4c, BMASKDWORD, 0x00462911);
        /* path-A PA on */
        rtl_set_bbreg(hw, RFPGA0_XAB_RFINTERFACESW, BMASKDWORD, 0x07000f60);
@@ -1742,29 +1630,29 @@ static u8 _rtl92d_phy_patha_iqk_5g_normal(struct ieee80211_hw *hw,
        for (i = 0; i < retrycount; i++) {
                /* One shot, path A LOK & IQK */
                RTPRINT(rtlpriv, FINIT, INIT_IQK,
-                       ("One shot, path A LOK & IQK!\n"));
+                       "One shot, path A LOK & IQK!\n");
                rtl_set_bbreg(hw, 0xe48, BMASKDWORD, 0xf9000000);
                rtl_set_bbreg(hw, 0xe48, BMASKDWORD, 0xf8000000);
                /* delay x ms */
                RTPRINT(rtlpriv, FINIT, INIT_IQK,
-                       ("Delay %d ms for One shot, path A LOK & IQK.\n",
-                       IQK_DELAY_TIME));
+                       "Delay %d ms for One shot, path A LOK & IQK.\n",
+                       IQK_DELAY_TIME);
                mdelay(IQK_DELAY_TIME * 10);
                /* Check failed */
                regeac = rtl_get_bbreg(hw, 0xeac, BMASKDWORD);
-               RTPRINT(rtlpriv, FINIT, INIT_IQK, ("0xeac = 0x%x\n", regeac));
+               RTPRINT(rtlpriv, FINIT, INIT_IQK,  "0xeac = 0x%x\n", regeac);
                rege94 = rtl_get_bbreg(hw, 0xe94, BMASKDWORD);
-               RTPRINT(rtlpriv, FINIT, INIT_IQK, ("0xe94 = 0x%x\n", rege94));
+               RTPRINT(rtlpriv, FINIT, INIT_IQK,  "0xe94 = 0x%x\n", rege94);
                rege9c = rtl_get_bbreg(hw, 0xe9c, BMASKDWORD);
-               RTPRINT(rtlpriv, FINIT, INIT_IQK, ("0xe9c = 0x%x\n", rege9c));
+               RTPRINT(rtlpriv, FINIT, INIT_IQK,  "0xe9c = 0x%x\n", rege9c);
                regea4 = rtl_get_bbreg(hw, 0xea4, BMASKDWORD);
-               RTPRINT(rtlpriv, FINIT, INIT_IQK, ("0xea4 = 0x%x\n", regea4));
+               RTPRINT(rtlpriv, FINIT, INIT_IQK,  "0xea4 = 0x%x\n", regea4);
                if (!(regeac & TxOKBit) &&
                     (((rege94 & 0x03FF0000) >> 16) != 0x142)) {
                        result |= 0x01;
                } else { /* if Tx not OK, ignore Rx */
                        RTPRINT(rtlpriv, FINIT, INIT_IQK,
-                               ("Path A Tx IQK fail!!\n"));
+                               "Path A Tx IQK fail!!\n");
                        continue;
                }
 
@@ -1775,7 +1663,7 @@ static u8 _rtl92d_phy_patha_iqk_5g_normal(struct ieee80211_hw *hw,
                        break;
                } else {
                        RTPRINT(rtlpriv, FINIT, INIT_IQK,
-                               ("Path A Rx IQK fail!!\n"));
+                               "Path A Rx IQK fail!!\n");
                }
        }
        /* path A PA off */
@@ -1793,27 +1681,26 @@ static u8 _rtl92d_phy_pathb_iqk(struct ieee80211_hw *hw)
        u32 regeac, regeb4, regebc, regec4, regecc;
        u8 result = 0;
 
-       RTPRINT(rtlpriv, FINIT, INIT_IQK, ("Path B IQK!\n"));
+       RTPRINT(rtlpriv, FINIT, INIT_IQK,  "Path B IQK!\n");
        /* One shot, path B LOK & IQK */
-       RTPRINT(rtlpriv, FINIT, INIT_IQK, ("One shot, path A LOK & IQK!\n"));
+       RTPRINT(rtlpriv, FINIT, INIT_IQK,  "One shot, path A LOK & IQK!\n");
        rtl_set_bbreg(hw, 0xe60, BMASKDWORD, 0x00000002);
        rtl_set_bbreg(hw, 0xe60, BMASKDWORD, 0x00000000);
        /* delay x ms  */
        RTPRINT(rtlpriv, FINIT, INIT_IQK,
-               ("Delay %d ms for One shot, path B LOK & IQK.\n",
-               IQK_DELAY_TIME));
+               "Delay %d ms for One shot, path B LOK & IQK\n", IQK_DELAY_TIME);
        mdelay(IQK_DELAY_TIME);
        /* Check failed */
        regeac = rtl_get_bbreg(hw, 0xeac, BMASKDWORD);
-       RTPRINT(rtlpriv, FINIT, INIT_IQK, ("0xeac = 0x%x\n", regeac));
+       RTPRINT(rtlpriv, FINIT, INIT_IQK,  "0xeac = 0x%x\n", regeac);
        regeb4 = rtl_get_bbreg(hw, 0xeb4, BMASKDWORD);
-       RTPRINT(rtlpriv, FINIT, INIT_IQK, ("0xeb4 = 0x%x\n", regeb4));
+       RTPRINT(rtlpriv, FINIT, INIT_IQK,  "0xeb4 = 0x%x\n", regeb4);
        regebc = rtl_get_bbreg(hw, 0xebc, BMASKDWORD);
-       RTPRINT(rtlpriv, FINIT, INIT_IQK, ("0xebc = 0x%x\n", regebc));
+       RTPRINT(rtlpriv, FINIT, INIT_IQK,  "0xebc = 0x%x\n", regebc);
        regec4 = rtl_get_bbreg(hw, 0xec4, BMASKDWORD);
-       RTPRINT(rtlpriv, FINIT, INIT_IQK, ("0xec4 = 0x%x\n", regec4));
+       RTPRINT(rtlpriv, FINIT, INIT_IQK,  "0xec4 = 0x%x\n", regec4);
        regecc = rtl_get_bbreg(hw, 0xecc, BMASKDWORD);
-       RTPRINT(rtlpriv, FINIT, INIT_IQK, ("0xecc = 0x%x\n", regecc));
+       RTPRINT(rtlpriv, FINIT, INIT_IQK,  "0xecc = 0x%x\n", regecc);
        if (!(regeac & BIT(31)) && (((regeb4 & 0x03FF0000) >> 16) != 0x142) &&
            (((regebc & 0x03FF0000) >> 16) != 0x42))
                result |= 0x01;
@@ -1823,7 +1710,7 @@ static u8 _rtl92d_phy_pathb_iqk(struct ieee80211_hw *hw)
            (((regecc & 0x03FF0000) >> 16) != 0x36))
                result |= 0x02;
        else
-               RTPRINT(rtlpriv, FINIT, INIT_IQK, ("Path B Rx IQK fail!!\n"));
+               RTPRINT(rtlpriv, FINIT, INIT_IQK,  "Path B Rx IQK fail!!\n");
        return result;
 }
 
@@ -1837,9 +1724,9 @@ static u8 _rtl92d_phy_pathb_iqk_5g_normal(struct ieee80211_hw *hw)
        u8 i;
        u8 retrycount = 2;
 
-       RTPRINT(rtlpriv, FINIT, INIT_IQK, ("Path B IQK!\n"));
+       RTPRINT(rtlpriv, FINIT, INIT_IQK,  "Path B IQK!\n");
        /* path-A IQK setting */
-       RTPRINT(rtlpriv, FINIT, INIT_IQK, ("Path-A IQK setting!\n"));
+       RTPRINT(rtlpriv, FINIT, INIT_IQK,  "Path-A IQK setting!\n");
        rtl_set_bbreg(hw, 0xe30, BMASKDWORD, 0x18008c1f);
        rtl_set_bbreg(hw, 0xe34, BMASKDWORD, 0x18008c1f);
        rtl_set_bbreg(hw, 0xe38, BMASKDWORD, 0x82110000);
@@ -1852,7 +1739,7 @@ static u8 _rtl92d_phy_pathb_iqk_5g_normal(struct ieee80211_hw *hw)
        rtl_set_bbreg(hw, 0xe5c, BMASKDWORD, 0x68160960);
 
        /* LO calibration setting */
-       RTPRINT(rtlpriv, FINIT, INIT_IQK, ("LO calibration setting!\n"));
+       RTPRINT(rtlpriv, FINIT, INIT_IQK,  "LO calibration setting!\n");
        rtl_set_bbreg(hw, 0xe4c, BMASKDWORD, 0x00462911);
 
        /* path-B PA on */
@@ -1862,26 +1749,26 @@ static u8 _rtl92d_phy_pathb_iqk_5g_normal(struct ieee80211_hw *hw)
        for (i = 0; i < retrycount; i++) {
                /* One shot, path B LOK & IQK */
                RTPRINT(rtlpriv, FINIT, INIT_IQK,
-                       ("One shot, path A LOK & IQK!\n"));
+                       "One shot, path A LOK & IQK!\n");
                rtl_set_bbreg(hw, 0xe48, BMASKDWORD, 0xfa000000);
                rtl_set_bbreg(hw, 0xe48, BMASKDWORD, 0xf8000000);
 
                /* delay x ms */
                RTPRINT(rtlpriv, FINIT, INIT_IQK,
-                       ("Delay %d ms for One shot, path B LOK & IQK.\n", 10));
+                       "Delay %d ms for One shot, path B LOK & IQK.\n", 10);
                mdelay(IQK_DELAY_TIME * 10);
 
                /* Check failed */
                regeac = rtl_get_bbreg(hw, 0xeac, BMASKDWORD);
-               RTPRINT(rtlpriv, FINIT, INIT_IQK, ("0xeac = 0x%x\n", regeac));
+               RTPRINT(rtlpriv, FINIT, INIT_IQK,  "0xeac = 0x%x\n", regeac);
                regeb4 = rtl_get_bbreg(hw, 0xeb4, BMASKDWORD);
-               RTPRINT(rtlpriv, FINIT, INIT_IQK, ("0xeb4 = 0x%x\n", regeb4));
+               RTPRINT(rtlpriv, FINIT, INIT_IQK,  "0xeb4 = 0x%x\n", regeb4);
                regebc = rtl_get_bbreg(hw, 0xebc, BMASKDWORD);
-               RTPRINT(rtlpriv, FINIT, INIT_IQK, ("0xebc = 0x%x\n", regebc));
+               RTPRINT(rtlpriv, FINIT, INIT_IQK,  "0xebc = 0x%x\n", regebc);
                regec4 = rtl_get_bbreg(hw, 0xec4, BMASKDWORD);
-               RTPRINT(rtlpriv, FINIT, INIT_IQK, ("0xec4 = 0x%x\n", regec4));
+               RTPRINT(rtlpriv, FINIT, INIT_IQK,  "0xec4 = 0x%x\n", regec4);
                regecc = rtl_get_bbreg(hw, 0xecc, BMASKDWORD);
-               RTPRINT(rtlpriv, FINIT, INIT_IQK, ("0xecc = 0x%x\n", regecc));
+               RTPRINT(rtlpriv, FINIT, INIT_IQK,  "0xecc = 0x%x\n", regecc);
                if (!(regeac & BIT(31)) &&
                    (((regeb4 & 0x03FF0000) >> 16) != 0x142))
                        result |= 0x01;
@@ -1893,7 +1780,7 @@ static u8 _rtl92d_phy_pathb_iqk_5g_normal(struct ieee80211_hw *hw)
                        break;
                } else {
                        RTPRINT(rtlpriv, FINIT, INIT_IQK,
-                               ("Path B Rx IQK fail!!\n"));
+                               "Path B Rx IQK fail!!\n");
                }
        }
 
@@ -1912,7 +1799,7 @@ static void _rtl92d_phy_save_adda_registers(struct ieee80211_hw *hw,
        struct rtl_priv *rtlpriv = rtl_priv(hw);
        u32 i;
 
-       RTPRINT(rtlpriv, FINIT, INIT_IQK, ("Save ADDA parameters.\n"));
+       RTPRINT(rtlpriv, FINIT, INIT_IQK,  "Save ADDA parameters.\n");
        for (i = 0; i < regnum; i++)
                adda_backup[i] = rtl_get_bbreg(hw, adda_reg[i], BMASKDWORD);
 }
@@ -1923,7 +1810,7 @@ static void _rtl92d_phy_save_mac_registers(struct ieee80211_hw *hw,
        struct rtl_priv *rtlpriv = rtl_priv(hw);
        u32 i;
 
-       RTPRINT(rtlpriv, FINIT, INIT_IQK, ("Save MAC parameters.\n"));
+       RTPRINT(rtlpriv, FINIT, INIT_IQK,  "Save MAC parameters.\n");
        for (i = 0; i < (IQK_MAC_REG_NUM - 1); i++)
                macbackup[i] = rtl_read_byte(rtlpriv, macreg[i]);
        macbackup[i] = rtl_read_dword(rtlpriv, macreg[i]);
@@ -1937,7 +1824,7 @@ static void _rtl92d_phy_reload_adda_registers(struct ieee80211_hw *hw,
        u32 i;
 
        RTPRINT(rtlpriv, FINIT, INIT_IQK,
-               ("Reload ADDA power saving parameters !\n"));
+               "Reload ADDA power saving parameters !\n");
        for (i = 0; i < regnum; i++)
                rtl_set_bbreg(hw, adda_reg[i], BMASKDWORD, adda_backup[i]);
 }
@@ -1948,7 +1835,7 @@ static void _rtl92d_phy_reload_mac_registers(struct ieee80211_hw *hw,
        struct rtl_priv *rtlpriv = rtl_priv(hw);
        u32 i;
 
-       RTPRINT(rtlpriv, FINIT, INIT_IQK, ("Reload MAC parameters !\n"));
+       RTPRINT(rtlpriv, FINIT, INIT_IQK,  "Reload MAC parameters !\n");
        for (i = 0; i < (IQK_MAC_REG_NUM - 1); i++)
                rtl_write_byte(rtlpriv, macreg[i], (u8) macbackup[i]);
        rtl_write_byte(rtlpriv, macreg[i], macbackup[i]);
@@ -1961,7 +1848,7 @@ static void _rtl92d_phy_path_adda_on(struct ieee80211_hw *hw,
        u32 pathon;
        u32 i;
 
-       RTPRINT(rtlpriv, FINIT, INIT_IQK, ("ADDA ON.\n"));
+       RTPRINT(rtlpriv, FINIT, INIT_IQK,  "ADDA ON.\n");
        pathon = patha_on ? 0x04db25a4 : 0x0b1b25a4;
        if (patha_on)
                pathon = rtlpriv->rtlhal.interfaceindex == 0 ?
@@ -1976,7 +1863,7 @@ static void _rtl92d_phy_mac_setting_calibration(struct ieee80211_hw *hw,
        struct rtl_priv *rtlpriv = rtl_priv(hw);
        u32 i;
 
-       RTPRINT(rtlpriv, FINIT, INIT_IQK, ("MAC settings for Calibration.\n"));
+       RTPRINT(rtlpriv, FINIT, INIT_IQK,  "MAC settings for Calibration.\n");
        rtl_write_byte(rtlpriv, macreg[0], 0x3F);
 
        for (i = 1; i < (IQK_MAC_REG_NUM - 1); i++)
@@ -1988,7 +1875,7 @@ static void _rtl92d_phy_mac_setting_calibration(struct ieee80211_hw *hw,
 static void _rtl92d_phy_patha_standby(struct ieee80211_hw *hw)
 {
        struct rtl_priv *rtlpriv = rtl_priv(hw);
-       RTPRINT(rtlpriv, FINIT, INIT_IQK, ("Path-A standby mode!\n"));
+       RTPRINT(rtlpriv, FINIT, INIT_IQK,  "Path-A standby mode!\n");
 
        rtl_set_bbreg(hw, 0xe28, BMASKDWORD, 0x0);
        rtl_set_bbreg(hw, RFPGA0_XA_LSSIPARAMETER, BMASKDWORD, 0x00010000);
@@ -2001,7 +1888,7 @@ static void _rtl92d_phy_pimode_switch(struct ieee80211_hw *hw, bool pi_mode)
        u32 mode;
 
        RTPRINT(rtlpriv, FINIT, INIT_IQK,
-               ("BB Switch to %s mode!\n", (pi_mode ? "PI" : "SI")));
+               "BB Switch to %s mode!\n", pi_mode ? "PI" : "SI");
        mode = pi_mode ? 0x01000100 : 0x01000000;
        rtl_set_bbreg(hw, 0x820, BMASKDWORD, mode);
        rtl_set_bbreg(hw, 0x828, BMASKDWORD, mode);
@@ -2033,12 +1920,12 @@ static void _rtl92d_phy_iq_calibrate(struct ieee80211_hw *hw, long result[][8],
        const u32 retrycount = 2;
        u32 bbvalue;
 
-       RTPRINT(rtlpriv, FINIT, INIT_IQK, ("IQK for 2.4G :Start!!!\n"));
+       RTPRINT(rtlpriv, FINIT, INIT_IQK,  "IQK for 2.4G :Start!!!\n");
        if (t == 0) {
                bbvalue = rtl_get_bbreg(hw, RFPGA0_RFMOD, BMASKDWORD);
-               RTPRINT(rtlpriv, FINIT, INIT_IQK, ("==>0x%08x\n", bbvalue));
-               RTPRINT(rtlpriv, FINIT, INIT_IQK, ("IQ Calibration for %s\n",
-                       (is2t ? "2T2R" : "1T1R")));
+               RTPRINT(rtlpriv, FINIT, INIT_IQK,  "==>0x%08x\n", bbvalue);
+               RTPRINT(rtlpriv, FINIT, INIT_IQK, "IQ Calibration for %s\n",
+                       is2t ? "2T2R" : "1T1R");
 
                /*  Save ADDA parameters, turn Path A ADDA on */
                _rtl92d_phy_save_adda_registers(hw, adda_reg,
@@ -2076,7 +1963,7 @@ static void _rtl92d_phy_iq_calibrate(struct ieee80211_hw *hw, long result[][8],
        if (is2t)
                rtl_set_bbreg(hw, 0xb6c, BMASKDWORD, 0x0f600000);
        /* IQ calibration setting */
-       RTPRINT(rtlpriv, FINIT, INIT_IQK, ("IQK setting!\n"));
+       RTPRINT(rtlpriv, FINIT, INIT_IQK,  "IQK setting!\n");
        rtl_set_bbreg(hw, 0xe28, BMASKDWORD, 0x80800000);
        rtl_set_bbreg(hw, 0xe40, BMASKDWORD, 0x01007c00);
        rtl_set_bbreg(hw, 0xe44, BMASKDWORD, 0x01004800);
@@ -2084,7 +1971,7 @@ static void _rtl92d_phy_iq_calibrate(struct ieee80211_hw *hw, long result[][8],
                patha_ok = _rtl92d_phy_patha_iqk(hw, is2t);
                if (patha_ok == 0x03) {
                        RTPRINT(rtlpriv, FINIT, INIT_IQK,
-                               ("Path A IQK Success!!\n"));
+                               "Path A IQK Success!!\n");
                        result[t][0] = (rtl_get_bbreg(hw, 0xe94, BMASKDWORD) &
                                        0x3FF0000) >> 16;
                        result[t][1] = (rtl_get_bbreg(hw, 0xe9c, BMASKDWORD) &
@@ -2097,7 +1984,7 @@ static void _rtl92d_phy_iq_calibrate(struct ieee80211_hw *hw, long result[][8],
                } else if (i == (retrycount - 1) && patha_ok == 0x01) {
                        /* Tx IQK OK */
                        RTPRINT(rtlpriv, FINIT, INIT_IQK,
-                               ("Path A IQK Only  Tx Success!!\n"));
+                               "Path A IQK Only  Tx Success!!\n");
 
                        result[t][0] = (rtl_get_bbreg(hw, 0xe94, BMASKDWORD) &
                                        0x3FF0000) >> 16;
@@ -2106,7 +1993,7 @@ static void _rtl92d_phy_iq_calibrate(struct ieee80211_hw *hw, long result[][8],
                }
        }
        if (0x00 == patha_ok)
-               RTPRINT(rtlpriv, FINIT, INIT_IQK, ("Path A IQK failed!!\n"));
+               RTPRINT(rtlpriv, FINIT, INIT_IQK,  "Path A IQK failed!!\n");
        if (is2t) {
                _rtl92d_phy_patha_standby(hw);
                /* Turn Path B ADDA on */
@@ -2115,7 +2002,7 @@ static void _rtl92d_phy_iq_calibrate(struct ieee80211_hw *hw, long result[][8],
                        pathb_ok = _rtl92d_phy_pathb_iqk(hw);
                        if (pathb_ok == 0x03) {
                                RTPRINT(rtlpriv, FINIT, INIT_IQK,
-                                       ("Path B IQK Success!!\n"));
+                                       "Path B IQK Success!!\n");
                                result[t][4] = (rtl_get_bbreg(hw, 0xeb4,
                                               BMASKDWORD) & 0x3FF0000) >> 16;
                                result[t][5] = (rtl_get_bbreg(hw, 0xebc,
@@ -2128,7 +2015,7 @@ static void _rtl92d_phy_iq_calibrate(struct ieee80211_hw *hw, long result[][8],
                        } else if (i == (retrycount - 1) && pathb_ok == 0x01) {
                                /* Tx IQK OK */
                                RTPRINT(rtlpriv, FINIT, INIT_IQK,
-                                       ("Path B Only Tx IQK Success!!\n"));
+                                       "Path B Only Tx IQK Success!!\n");
                                result[t][4] = (rtl_get_bbreg(hw, 0xeb4,
                                               BMASKDWORD) & 0x3FF0000) >> 16;
                                result[t][5] = (rtl_get_bbreg(hw, 0xebc,
@@ -2137,12 +2024,12 @@ static void _rtl92d_phy_iq_calibrate(struct ieee80211_hw *hw, long result[][8],
                }
                if (0x00 == pathb_ok)
                        RTPRINT(rtlpriv, FINIT, INIT_IQK,
-                               ("Path B IQK failed!!\n"));
+                               "Path B IQK failed!!\n");
        }
 
        /* Back to BB mode, load original value */
        RTPRINT(rtlpriv, FINIT, INIT_IQK,
-               ("IQK:Back to BB mode, load original value!\n"));
+               "IQK:Back to BB mode, load original value!\n");
 
        rtl_set_bbreg(hw, 0xe28, BMASKDWORD, 0);
        if (t != 0) {
@@ -2167,7 +2054,7 @@ static void _rtl92d_phy_iq_calibrate(struct ieee80211_hw *hw, long result[][8],
                rtl_set_bbreg(hw, 0xe30, BMASKDWORD, 0x01008c00);
                rtl_set_bbreg(hw, 0xe34, BMASKDWORD, 0x01008c00);
        }
-       RTPRINT(rtlpriv, FINIT, INIT_IQK, ("<==\n"));
+       RTPRINT(rtlpriv, FINIT, INIT_IQK,  "<==\n");
 }
 
 static void _rtl92d_phy_iq_calibrate_5g_normal(struct ieee80211_hw *hw,
@@ -2199,13 +2086,13 @@ static void _rtl92d_phy_iq_calibrate_5g_normal(struct ieee80211_hw *hw,
        /* Note: IQ calibration must be performed after loading
         * PHY_REG.txt , and radio_a, radio_b.txt */
 
-       RTPRINT(rtlpriv, FINIT, INIT_IQK, ("IQK for 5G NORMAL:Start!!!\n"));
+       RTPRINT(rtlpriv, FINIT, INIT_IQK,  "IQK for 5G NORMAL:Start!!!\n");
        mdelay(IQK_DELAY_TIME * 20);
        if (t == 0) {
                bbvalue = rtl_get_bbreg(hw, RFPGA0_RFMOD, BMASKDWORD);
-               RTPRINT(rtlpriv, FINIT, INIT_IQK, ("==>0x%08x\n", bbvalue));
-               RTPRINT(rtlpriv, FINIT, INIT_IQK, ("IQ Calibration for %s\n",
-                       (is2t ? "2T2R" : "1T1R")));
+               RTPRINT(rtlpriv, FINIT, INIT_IQK,  "==>0x%08x\n", bbvalue);
+               RTPRINT(rtlpriv, FINIT, INIT_IQK, "IQ Calibration for %s\n",
+                       is2t ? "2T2R" : "1T1R");
                /* Save ADDA parameters, turn Path A ADDA on */
                _rtl92d_phy_save_adda_registers(hw, adda_reg,
                                                rtlphy->adda_backup,
@@ -2242,13 +2129,13 @@ static void _rtl92d_phy_iq_calibrate_5g_normal(struct ieee80211_hw *hw,
        if (is2t)
                rtl_set_bbreg(hw, 0xb6c, BMASKDWORD, 0x0f600000);
        /* IQ calibration setting  */
-       RTPRINT(rtlpriv, FINIT, INIT_IQK, ("IQK setting!\n"));
+       RTPRINT(rtlpriv, FINIT, INIT_IQK,  "IQK setting!\n");
        rtl_set_bbreg(hw, 0xe28, BMASKDWORD, 0x80800000);
        rtl_set_bbreg(hw, 0xe40, BMASKDWORD, 0x10007c00);
        rtl_set_bbreg(hw, 0xe44, BMASKDWORD, 0x01004800);
        patha_ok = _rtl92d_phy_patha_iqk_5g_normal(hw, is2t);
        if (patha_ok == 0x03) {
-               RTPRINT(rtlpriv, FINIT, INIT_IQK, ("Path A IQK Success!!\n"));
+               RTPRINT(rtlpriv, FINIT, INIT_IQK,  "Path A IQK Success!!\n");
                result[t][0] = (rtl_get_bbreg(hw, 0xe94, BMASKDWORD) &
                                0x3FF0000) >> 16;
                result[t][1] = (rtl_get_bbreg(hw, 0xe9c, BMASKDWORD) &
@@ -2259,14 +2146,14 @@ static void _rtl92d_phy_iq_calibrate_5g_normal(struct ieee80211_hw *hw,
                                0x3FF0000) >> 16;
        } else if (patha_ok == 0x01) {  /* Tx IQK OK */
                RTPRINT(rtlpriv, FINIT, INIT_IQK,
-                       ("Path A IQK Only  Tx Success!!\n"));
+                       "Path A IQK Only  Tx Success!!\n");
 
                result[t][0] = (rtl_get_bbreg(hw, 0xe94, BMASKDWORD) &
                                0x3FF0000) >> 16;
                result[t][1] = (rtl_get_bbreg(hw, 0xe9c, BMASKDWORD) &
                                0x3FF0000) >> 16;
        } else {
-               RTPRINT(rtlpriv, FINIT, INIT_IQK, ("Path A IQK Fail!!\n"));
+               RTPRINT(rtlpriv, FINIT, INIT_IQK,  "Path A IQK Fail!!\n");
        }
        if (is2t) {
                /* _rtl92d_phy_patha_standby(hw); */
@@ -2275,7 +2162,7 @@ static void _rtl92d_phy_iq_calibrate_5g_normal(struct ieee80211_hw *hw,
                pathb_ok = _rtl92d_phy_pathb_iqk_5g_normal(hw);
                if (pathb_ok == 0x03) {
                        RTPRINT(rtlpriv, FINIT, INIT_IQK,
-                               ("Path B IQK Success!!\n"));
+                               "Path B IQK Success!!\n");
                        result[t][4] = (rtl_get_bbreg(hw, 0xeb4, BMASKDWORD) &
                             0x3FF0000) >> 16;
                        result[t][5] = (rtl_get_bbreg(hw, 0xebc, BMASKDWORD) &
@@ -2286,20 +2173,20 @@ static void _rtl92d_phy_iq_calibrate_5g_normal(struct ieee80211_hw *hw,
                             0x3FF0000) >> 16;
                } else if (pathb_ok == 0x01) { /* Tx IQK OK */
                        RTPRINT(rtlpriv, FINIT, INIT_IQK,
-                               ("Path B Only Tx IQK Success!!\n"));
+                               "Path B Only Tx IQK Success!!\n");
                        result[t][4] = (rtl_get_bbreg(hw, 0xeb4, BMASKDWORD) &
                             0x3FF0000) >> 16;
                        result[t][5] = (rtl_get_bbreg(hw, 0xebc, BMASKDWORD) &
                             0x3FF0000) >> 16;
                } else {
                        RTPRINT(rtlpriv, FINIT, INIT_IQK,
-                               ("Path B IQK failed!!\n"));
+                               "Path B IQK failed!!\n");
                }
        }
 
        /* Back to BB mode, load original value */
        RTPRINT(rtlpriv, FINIT, INIT_IQK,
-               ("IQK:Back to BB mode, load original value!\n"));
+               "IQK:Back to BB mode, load original value!\n");
        rtl_set_bbreg(hw, 0xe28, BMASKDWORD, 0);
        if (t != 0) {
                if (is2t)
@@ -2321,7 +2208,7 @@ static void _rtl92d_phy_iq_calibrate_5g_normal(struct ieee80211_hw *hw,
                                                  rtlphy->adda_backup,
                                                  IQK_ADDA_REG_NUM);
        }
-       RTPRINT(rtlpriv, FINIT, INIT_IQK, ("<==\n"));
+       RTPRINT(rtlpriv, FINIT, INIT_IQK,  "<==\n");
 }
 
 static bool _rtl92d_phy_simularity_compare(struct ieee80211_hw *hw,
@@ -2395,8 +2282,7 @@ static void _rtl92d_phy_patha_fill_iqk_matrix(struct ieee80211_hw *hw,
            rtlhal->macphymode == DUALMAC_DUALPHY;
 
        RTPRINT(rtlpriv, FINIT, INIT_IQK,
-               ("Path A IQ Calibration %s !\n",
-               (iqk_ok) ? "Success" : "Failed"));
+               "Path A IQ Calibration %s !\n", iqk_ok ? "Success" : "Failed");
        if (final_candidate == 0xFF) {
                return;
        } else if (iqk_ok) {
@@ -2406,8 +2292,9 @@ static void _rtl92d_phy_patha_fill_iqk_matrix(struct ieee80211_hw *hw,
                if ((val_x & 0x00000200) != 0)
                        val_x = val_x | 0xFFFFFC00;
                tx0_a = (val_x * oldval_0) >> 8;
-               RTPRINT(rtlpriv, FINIT, INIT_IQK, ("X = 0x%x, tx0_a = 0x%x,"
-                       " oldval_0 0x%x\n",     val_x, tx0_a, oldval_0));
+               RTPRINT(rtlpriv, FINIT, INIT_IQK,
+                       "X = 0x%x, tx0_a = 0x%x, oldval_0 0x%x\n",
+                       val_x, tx0_a, oldval_0);
                rtl_set_bbreg(hw, ROFDM0_XATxIQIMBALANCE, 0x3FF, tx0_a);
                rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD, BIT(24),
                              ((val_x * oldval_0 >> 7) & 0x1));
@@ -2419,8 +2306,9 @@ static void _rtl92d_phy_patha_fill_iqk_matrix(struct ieee80211_hw *hw,
                        rtlhal->current_bandtype == BAND_ON_5G)
                        val_y += 3;
                tx0_c = (val_y * oldval_0) >> 8;
-               RTPRINT(rtlpriv, FINIT, INIT_IQK, ("Y = 0x%lx, tx0_c = 0x%lx\n",
-                       val_y, tx0_c));
+               RTPRINT(rtlpriv, FINIT, INIT_IQK,
+                       "Y = 0x%lx, tx0_c = 0x%lx\n",
+                       val_y, tx0_c);
                rtl_set_bbreg(hw, ROFDM0_XCTxAFE, 0xF0000000,
                              ((tx0_c & 0x3C0) >> 6));
                rtl_set_bbreg(hw, ROFDM0_XATxIQIMBALANCE, 0x003F0000,
@@ -2428,11 +2316,11 @@ static void _rtl92d_phy_patha_fill_iqk_matrix(struct ieee80211_hw *hw,
                if (is2t)
                        rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD, BIT(26),
                                      ((val_y * oldval_0 >> 7) & 0x1));
-               RTPRINT(rtlpriv, FINIT, INIT_IQK, ("0xC80 = 0x%x\n",
-                        rtl_get_bbreg(hw, ROFDM0_XATxIQIMBALANCE,
-                                      BMASKDWORD)));
+               RTPRINT(rtlpriv, FINIT, INIT_IQK, "0xC80 = 0x%x\n",
+                       rtl_get_bbreg(hw, ROFDM0_XATxIQIMBALANCE,
+                                     BMASKDWORD));
                if (txonly) {
-                       RTPRINT(rtlpriv, FINIT, INIT_IQK, ("only Tx OK\n"));
+                       RTPRINT(rtlpriv, FINIT, INIT_IQK,  "only Tx OK\n");
                        return;
                }
                reg = result[final_candidate][2];
@@ -2452,8 +2340,8 @@ static void _rtl92d_phy_pathb_fill_iqk_matrix(struct ieee80211_hw *hw,
        u32 oldval_1, val_x, tx1_a, reg;
        long val_y, tx1_c;
 
-       RTPRINT(rtlpriv, FINIT, INIT_IQK, ("Path B IQ Calibration %s !\n",
-                (iqk_ok) ? "Success" : "Failed"));
+       RTPRINT(rtlpriv, FINIT, INIT_IQK, "Path B IQ Calibration %s !\n",
+               iqk_ok ? "Success" : "Failed");
        if (final_candidate == 0xFF) {
                return;
        } else if (iqk_ok) {
@@ -2463,8 +2351,8 @@ static void _rtl92d_phy_pathb_fill_iqk_matrix(struct ieee80211_hw *hw,
                if ((val_x & 0x00000200) != 0)
                        val_x = val_x | 0xFFFFFC00;
                tx1_a = (val_x * oldval_1) >> 8;
-               RTPRINT(rtlpriv, FINIT, INIT_IQK, ("X = 0x%x, tx1_a = 0x%x\n",
-                       val_x, tx1_a));
+               RTPRINT(rtlpriv, FINIT, INIT_IQK, "X = 0x%x, tx1_a = 0x%x\n",
+                       val_x, tx1_a);
                rtl_set_bbreg(hw, ROFDM0_XBTxIQIMBALANCE, 0x3FF, tx1_a);
                rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD, BIT(28),
                              ((val_x * oldval_1 >> 7) & 0x1));
@@ -2474,8 +2362,8 @@ static void _rtl92d_phy_pathb_fill_iqk_matrix(struct ieee80211_hw *hw,
                if (rtlhal->current_bandtype == BAND_ON_5G)
                        val_y += 3;
                tx1_c = (val_y * oldval_1) >> 8;
-               RTPRINT(rtlpriv, FINIT, INIT_IQK, ("Y = 0x%lx, tx1_c = 0x%lx\n",
-                       val_y, tx1_c));
+               RTPRINT(rtlpriv, FINIT, INIT_IQK, "Y = 0x%lx, tx1_c = 0x%lx\n",
+                       val_y, tx1_c);
                rtl_set_bbreg(hw, ROFDM0_XDTxAFE, 0xF0000000,
                              ((tx1_c & 0x3C0) >> 6));
                rtl_set_bbreg(hw, ROFDM0_XBTxIQIMBALANCE, 0x003F0000,
@@ -2507,7 +2395,7 @@ void rtl92d_phy_iq_calibrate(struct ieee80211_hw *hw)
        unsigned long flag = 0;
 
        RTPRINT(rtlpriv, FINIT, INIT_IQK,
-               ("IQK:Start!!!channel %d\n", rtlphy->current_channel));
+               "IQK:Start!!!channel %d\n", rtlphy->current_channel);
        for (i = 0; i < 8; i++) {
                result[0][i] = 0;
                result[1][i] = 0;
@@ -2521,7 +2409,7 @@ void rtl92d_phy_iq_calibrate(struct ieee80211_hw *hw)
        is23simular = false;
        is13simular = false;
        RTPRINT(rtlpriv, FINIT, INIT_IQK,
-               ("IQK !!!currentband %d\n", rtlhal->current_bandtype));
+               "IQK !!!currentband %d\n", rtlhal->current_bandtype);
        rtl92d_acquire_cckandrw_pagea_ctl(hw, &flag);
        for (i = 0; i < 3; i++) {
                if (rtlhal->current_bandtype == BAND_ON_5G) {
@@ -2573,10 +2461,9 @@ void rtl92d_phy_iq_calibrate(struct ieee80211_hw *hw)
                regec4 = result[i][6];
                regecc = result[i][7];
                RTPRINT(rtlpriv, FINIT, INIT_IQK,
-                       ("IQK: rege94=%lx rege9c=%lx regea4=%lx regeac=%lx "
-                       "regeb4=%lx regebc=%lx regec4=%lx regecc=%lx\n ",
+                       "IQK: rege94=%lx rege9c=%lx regea4=%lx regeac=%lx regeb4=%lx regebc=%lx regec4=%lx regecc=%lx\n",
                        rege94, rege9c, regea4, regeac, regeb4, regebc, regec4,
-                       regecc));
+                       regecc);
        }
        if (final_candidate != 0xff) {
                rtlphy->reg_e94 = rege94 = result[final_candidate][0];
@@ -2588,12 +2475,11 @@ void rtl92d_phy_iq_calibrate(struct ieee80211_hw *hw)
                regec4 = result[final_candidate][6];
                regecc = result[final_candidate][7];
                RTPRINT(rtlpriv, FINIT, INIT_IQK,
-                       ("IQK: final_candidate is %x\n", final_candidate));
+                       "IQK: final_candidate is %x\n", final_candidate);
                RTPRINT(rtlpriv, FINIT, INIT_IQK,
-                       ("IQK: rege94=%lx rege9c=%lx regea4=%lx regeac=%lx "
-                       "regeb4=%lx regebc=%lx regec4=%lx regecc=%lx\n ",
+                       "IQK: rege94=%lx rege9c=%lx regea4=%lx regeac=%lx regeb4=%lx regebc=%lx regec4=%lx regecc=%lx\n",
                        rege94, rege9c, regea4, regeac, regeb4, regebc, regec4,
-                       regecc));
+                       regecc);
                patha_ok = pathb_ok = true;
        } else {
                rtlphy->reg_e94 = rtlphy->reg_eb4 = 0x100; /* X default value */
@@ -2618,7 +2504,7 @@ void rtl92d_phy_iq_calibrate(struct ieee80211_hw *hw)
                        true;
 
                RT_TRACE(rtlpriv, COMP_SCAN | COMP_MLME, DBG_LOUD,
-                        ("\nIQK OK indexforchannel %d.\n", indexforchannel));
+                        "IQK OK indexforchannel %d\n", indexforchannel);
        }
 }
 
@@ -2629,17 +2515,17 @@ void rtl92d_phy_reload_iqk_setting(struct ieee80211_hw *hw, u8 channel)
        struct rtl_hal *rtlhal = &(rtlpriv->rtlhal);
        u8 indexforchannel;
 
-       RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, ("channel %d\n", channel));
+       RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, "channel %d\n", channel);
        /*------Do IQK for normal chip and test chip 5G band------- */
        indexforchannel = rtl92d_get_rightchnlplace_for_iqk(channel);
-       RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD,
-               ("indexforchannel %d done %d\n", indexforchannel,
-               rtlphy->iqk_matrix_regsetting[indexforchannel].iqk_done));
+       RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, "indexforchannel %d done %d\n",
+                indexforchannel,
+                rtlphy->iqk_matrix_regsetting[indexforchannel].iqk_done);
        if (0 && !rtlphy->iqk_matrix_regsetting[indexforchannel].iqk_done &&
                rtlphy->need_iqk) {
                /* Re Do IQK. */
                RT_TRACE(rtlpriv, COMP_SCAN | COMP_INIT, DBG_LOUD,
-                        ("Do IQK Matrix reg for channel:%d....\n", channel));
+                        "Do IQK Matrix reg for channel:%d....\n", channel);
                rtl92d_phy_iq_calibrate(hw);
        } else {
                /* Just load the value. */
@@ -2647,8 +2533,8 @@ void rtl92d_phy_reload_iqk_setting(struct ieee80211_hw *hw, u8 channel)
                if (((!rtlhal->load_imrandiqk_setting_for2g) &&
                    indexforchannel == 0) || indexforchannel > 0) {
                        RT_TRACE(rtlpriv, COMP_SCAN, DBG_LOUD,
-                                ("Just Read IQK Matrix reg for channel:%d"
-                                "....\n", channel));
+                                "Just Read IQK Matrix reg for channel:%d....\n",
+                                channel);
                        if ((rtlphy->iqk_matrix_regsetting[indexforchannel].
                             value[0] != NULL)
                                /*&&(regea4 != 0) */)
@@ -2672,7 +2558,7 @@ void rtl92d_phy_reload_iqk_setting(struct ieee80211_hw *hw, u8 channel)
                }
        }
        rtlphy->need_iqk = false;
-       RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, ("<====\n"));
+       RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, "<====\n");
 }
 
 static u32 _rtl92d_phy_get_abs(u32 val1, u32 val2)
@@ -2727,8 +2613,8 @@ static void _rtl92d_phy_calc_curvindex(struct ieee80211_hw *hw,
                        }
                }
                smallest_abs_val = 0xffffffff;
-               RTPRINT(rtlpriv, FINIT, INIT_IQK, ("curveindex[%d] = %x\n", i,
-                       curveindex[i]));
+               RTPRINT(rtlpriv, FINIT, INIT_IQK, "curveindex[%d] = %x\n",
+                       i, curveindex[i]);
        }
 }
 
@@ -2743,14 +2629,14 @@ static void _rtl92d_phy_reload_lck_setting(struct ieee80211_hw *hw,
        u32 u4tmp = 0, u4regvalue = 0;
        bool bneed_powerdown_radio = false;
 
-       RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, ("path %d\n", erfpath));
-       RTPRINT(rtlpriv, FINIT, INIT_IQK, ("band type = %d\n",
-               rtlpriv->rtlhal.current_bandtype));
-       RTPRINT(rtlpriv, FINIT, INIT_IQK, ("channel = %d\n", channel));
+       RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, "path %d\n", erfpath);
+       RTPRINT(rtlpriv, FINIT, INIT_IQK, "band type = %d\n",
+               rtlpriv->rtlhal.current_bandtype);
+       RTPRINT(rtlpriv, FINIT, INIT_IQK,  "channel = %d\n", channel);
        if (rtlpriv->rtlhal.current_bandtype == BAND_ON_5G) {/* Path-A for 5G */
                u4tmp = curveindex_5g[channel-1];
                RTPRINT(rtlpriv, FINIT, INIT_IQK,
-                       ("ver 1 set RF-A, 5G,   0x28 = 0x%ulx !!\n", u4tmp));
+                       "ver 1 set RF-A, 5G,    0x28 = 0x%ulx !!\n", u4tmp);
                if (rtlpriv->rtlhal.macphymode == DUALMAC_DUALPHY &&
                        rtlpriv->rtlhal.interfaceindex == 1) {
                        bneed_powerdown_radio =
@@ -2769,7 +2655,7 @@ static void _rtl92d_phy_reload_lck_setting(struct ieee80211_hw *hw,
        } else if (rtlpriv->rtlhal.current_bandtype == BAND_ON_2_4G) {
                u4tmp = curveindex_2g[channel-1];
                RTPRINT(rtlpriv, FINIT, INIT_IQK,
-                       ("ver 3 set RF-B, 2G, 0x28 = 0x%ulx !!\n", u4tmp));
+                       "ver 3 set RF-B, 2G, 0x28 = 0x%ulx !!\n", u4tmp);
                if (rtlpriv->rtlhal.macphymode == DUALMAC_DUALPHY &&
                        rtlpriv->rtlhal.interfaceindex == 0) {
                        bneed_powerdown_radio =
@@ -2781,14 +2667,14 @@ static void _rtl92d_phy_reload_lck_setting(struct ieee80211_hw *hw,
                }
                rtl_set_rfreg(hw, erfpath, RF_SYN_G4, 0x3f800, u4tmp);
                RTPRINT(rtlpriv, FINIT, INIT_IQK,
-                       ("ver 3 set RF-B, 2G, 0x28 = 0x%ulx !!\n",
-                       rtl_get_rfreg(hw,  erfpath, RF_SYN_G4, 0x3f800)));
+                       "ver 3 set RF-B, 2G, 0x28 = 0x%ulx !!\n",
+                       rtl_get_rfreg(hw,  erfpath, RF_SYN_G4, 0x3f800));
                if (bneed_powerdown_radio)
                        _rtl92d_phy_restore_rf_env(hw, erfpath, &u4regvalue);
                if (rtlpriv->rtlhal.during_mac0init_radiob)
                        rtl92d_phy_powerdown_anotherphy(hw, true);
        }
-       RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, ("<====\n"));
+       RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, "<====\n");
 }
 
 static void _rtl92d_phy_lc_calibrate_sw(struct ieee80211_hw *hw, bool is2t)
@@ -2836,20 +2722,20 @@ static void _rtl92d_phy_lc_calibrate_sw(struct ieee80211_hw *hw, bool is2t)
                                              RF_SYN_G6, BRFREGOFFSETMASK);
                }
                RTPRINT(rtlpriv, FINIT, INIT_IQK,
-                       ("PHY_LCK finish delay for %d ms=2\n", timecount));
+                       "PHY_LCK finish delay for %d ms=2\n", timecount);
                u4tmp = rtl_get_rfreg(hw, index, RF_SYN_G4, BRFREGOFFSETMASK);
                if (index == 0 && rtlhal->interfaceindex == 0) {
                        RTPRINT(rtlpriv, FINIT, INIT_IQK,
-                               ("path-A / 5G LCK\n"));
+                               "path-A / 5G LCK\n");
                } else {
                        RTPRINT(rtlpriv, FINIT, INIT_IQK,
-                               ("path-B / 2.4G LCK\n"));
+                               "path-B / 2.4G LCK\n");
                }
                memset(&curvecount_val[0], 0, CV_CURVE_CNT * 2);
                /* Set LC calibration off */
                rtl_set_rfreg(hw, (enum radio_path)index, RF_CHNLBW,
                              0x08000, 0x0);
-               RTPRINT(rtlpriv, FINIT, INIT_IQK, ("set RF 0x18[15] = 0\n"));
+               RTPRINT(rtlpriv, FINIT, INIT_IQK,  "set RF 0x18[15] = 0\n");
                /* save Curve-counting number */
                for (i = 0; i < CV_CURVE_CNT; i++) {
                        u32 readval = 0, readval2 = 0;
@@ -2899,7 +2785,7 @@ static void _rtl92d_phy_lc_calibrate(struct ieee80211_hw *hw, bool is2t)
 {
        struct rtl_priv *rtlpriv = rtl_priv(hw);
 
-       RTPRINT(rtlpriv, FINIT, INIT_IQK, ("cosa PHY_LCK ver=2\n"));
+       RTPRINT(rtlpriv, FINIT, INIT_IQK,  "cosa PHY_LCK ver=2\n");
        _rtl92d_phy_lc_calibrate_sw(hw, is2t);
 }
 
@@ -2917,8 +2803,8 @@ void rtl92d_phy_lc_calibrate(struct ieee80211_hw *hw)
 
        rtlphy->lck_inprogress = true;
        RTPRINT(rtlpriv, FINIT, INIT_IQK,
-               ("LCK:Start!!! currentband %x delay %d ms\n",
-                rtlhal->current_bandtype, timecount));
+               "LCK:Start!!! currentband %x delay %d ms\n",
+               rtlhal->current_bandtype, timecount);
        if (IS_92D_SINGLEPHY(rtlhal->version)) {
                _rtl92d_phy_lc_calibrate(hw, true);
        } else {
@@ -2926,7 +2812,7 @@ void rtl92d_phy_lc_calibrate(struct ieee80211_hw *hw)
                _rtl92d_phy_lc_calibrate(hw, false);
        }
        rtlphy->lck_inprogress = false;
-       RTPRINT(rtlpriv, FINIT, INIT_IQK, ("LCK:Finish!!!\n"));
+       RTPRINT(rtlpriv, FINIT, INIT_IQK,  "LCK:Finish!!!\n");
 }
 
 void rtl92d_phy_ap_calibrate(struct ieee80211_hw *hw, char delta)
@@ -2941,7 +2827,7 @@ static bool _rtl92d_phy_set_sw_chnl_cmdarray(struct swchnlcmd *cmdtable,
        struct swchnlcmd *pcmd;
 
        if (cmdtable == NULL) {
-               RT_ASSERT(false, ("cmdtable cannot be NULL.\n"));
+               RT_ASSERT(false, "cmdtable cannot be NULL\n");
                return false;
        }
        if (cmdtableidx >= cmdtablesz)
@@ -2962,10 +2848,10 @@ void rtl92d_phy_reset_iqk_result(struct ieee80211_hw *hw)
        u8 i;
 
        RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
-                       ("settings regs %d default regs %d\n",
-                       (int)(sizeof(rtlphy->iqk_matrix_regsetting) /
-                       sizeof(struct iqk_matrix_regs)),
-                       IQK_MATRIX_REG_NUM));
+                "settings regs %d default regs %d\n",
+                (int)(sizeof(rtlphy->iqk_matrix_regsetting) /
+                      sizeof(struct iqk_matrix_regs)),
+                IQK_MATRIX_REG_NUM);
        /* 0xe94, 0xe9c, 0xea4, 0xeac, 0xeb4, 0xebc, 0xec4, 0xecc */
        for (i = 0; i < IQK_MATRIX_SETTINGS_NUM; i++) {
                rtlphy->iqk_matrix_regsetting[i].value[0][0] = 0x100;
@@ -3084,7 +2970,7 @@ static bool _rtl92d_phy_sw_chnl_step_by_step(struct ieee80211_hw *hw,
                        break;
                default:
                        RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                                ("switch case not process\n"));
+                                "switch case not processed\n");
                        break;
                }
                break;
@@ -3111,7 +2997,7 @@ u8 rtl92d_phy_sw_chnl(struct ieee80211_hw *hw)
 
        if ((is_hal_stop(rtlhal)) || (RT_CANNOT_IO(hw))) {
                RT_TRACE(rtlpriv, COMP_CHAN, DBG_LOUD,
-                        ("sw_chnl_inprogress false driver sleep or unload\n"));
+                        "sw_chnl_inprogress false driver sleep or unload\n");
                return 0;
        }
        while (rtlphy->lck_inprogress && timecount < timeout) {
@@ -3133,19 +3019,18 @@ u8 rtl92d_phy_sw_chnl(struct ieee80211_hw *hw)
                 * 5G and 2.4G band. */
                if (channel <= 14)
                        return 0;
-               RT_ASSERT((channel > 14), ("5G but channel<=14"));
+               RT_ASSERT((channel > 14), "5G but channel<=14\n");
                break;
        case BAND_ON_2_4G:
                /* Get first channel error when change between
                 * 5G and 2.4G band. */
                if (channel > 14)
                        return 0;
-               RT_ASSERT((channel <= 14), ("2G but channel>14"));
+               RT_ASSERT((channel <= 14), "2G but channel>14\n");
                break;
        default:
-               RT_ASSERT(false,
-                         ("Invalid WirelessMode(%#x)!!\n",
-                          rtlpriv->mac80211.mode));
+               RT_ASSERT(false, "Invalid WirelessMode(%#x)!!\n",
+                         rtlpriv->mac80211.mode);
                break;
        }
        rtlphy->sw_chnl_inprogress = true;
@@ -3154,7 +3039,7 @@ u8 rtl92d_phy_sw_chnl(struct ieee80211_hw *hw)
        rtlphy->sw_chnl_stage = 0;
        rtlphy->sw_chnl_step = 0;
        RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE,
-                ("switch to channel%d\n", rtlphy->current_channel));
+                "switch to channel%d\n", rtlphy->current_channel);
 
        do {
                if (!rtlphy->sw_chnl_inprogress)
@@ -3171,7 +3056,7 @@ u8 rtl92d_phy_sw_chnl(struct ieee80211_hw *hw)
                }
                break;
        } while (true);
-       RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE, ("<==\n"));
+       RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE, "<==\n");
        rtlphy->sw_chnl_inprogress = false;
        return 1;
 }
@@ -3182,8 +3067,8 @@ static void rtl92d_phy_set_io(struct ieee80211_hw *hw)
        struct rtl_phy *rtlphy = &(rtlpriv->phy);
 
        RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE,
-                ("--->Cmd(%#x), set_io_inprogress(%d)\n",
-                rtlphy->current_io_type, rtlphy->set_io_inprogress));
+                "--->Cmd(%#x), set_io_inprogress(%d)\n",
+                rtlphy->current_io_type, rtlphy->set_io_inprogress);
        switch (rtlphy->current_io_type) {
        case IO_CMD_RESUME_DM_BY_SCAN:
                de_digtable.cur_igvalue = rtlphy->initgain_backup.xaagccore1;
@@ -3197,12 +3082,12 @@ static void rtl92d_phy_set_io(struct ieee80211_hw *hw)
                break;
        default:
                RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                        ("switch case not process\n"));
+                        "switch case not processed\n");
                break;
        }
        rtlphy->set_io_inprogress = false;
-       RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE,
-                ("<---(%#x)\n", rtlphy->current_io_type));
+       RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE, "<---(%#x)\n",
+                rtlphy->current_io_type);
 }
 
 bool rtl92d_phy_set_io_cmd(struct ieee80211_hw *hw, enum io_type iotype)
@@ -3212,23 +3097,23 @@ bool rtl92d_phy_set_io_cmd(struct ieee80211_hw *hw, enum io_type iotype)
        bool postprocessing = false;
 
        RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE,
-                ("-->IO Cmd(%#x), set_io_inprogress(%d)\n",
-                iotype, rtlphy->set_io_inprogress));
+                "-->IO Cmd(%#x), set_io_inprogress(%d)\n",
+                iotype, rtlphy->set_io_inprogress);
        do {
                switch (iotype) {
                case IO_CMD_RESUME_DM_BY_SCAN:
                        RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE,
-                                ("[IO CMD] Resume DM after scan.\n"));
+                                "[IO CMD] Resume DM after scan\n");
                        postprocessing = true;
                        break;
                case IO_CMD_PAUSE_DM_BY_SCAN:
                        RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE,
-                                ("[IO CMD] Pause DM before scan.\n"));
+                                "[IO CMD] Pause DM before scan\n");
                        postprocessing = true;
                        break;
                default:
                        RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                                ("switch case not process\n"));
+                                "switch case not processed\n");
                        break;
                }
        } while (false);
@@ -3239,7 +3124,7 @@ bool rtl92d_phy_set_io_cmd(struct ieee80211_hw *hw, enum io_type iotype)
                return false;
        }
        rtl92d_phy_set_io(hw);
-       RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE, ("<--IO Type(%#x)\n", iotype));
+       RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE, "<--IO Type(%#x)\n", iotype);
        return true;
 }
 
@@ -3297,7 +3182,7 @@ static void _rtl92d_phy_set_rfsleep(struct ieee80211_hw *hw)
                rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE3);
                rtl_write_byte(rtlpriv, REG_TXPAUSE, 0x00);
                RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
-                       ("Fail !!! Switch RF timeout.\n"));
+                        "Fail !!! Switch RF timeout\n");
                return;
        }
        /* e.   For PCIE: SYS_FUNC_EN 0x02[7:0] = 0xE2 reset BB TRX function */
@@ -3332,20 +3217,18 @@ bool rtl92d_phy_set_rf_power_state(struct ieee80211_hw *hw,
                        do {
                                InitializeCount++;
                                RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG,
-                                        ("IPS Set eRf nic enable\n"));
+                                        "IPS Set eRf nic enable\n");
                                rtstatus = rtl_ps_enable_nic(hw);
-                       } while ((rtstatus != true) &&
-                                (InitializeCount < 10));
+                       } while (!rtstatus && (InitializeCount < 10));
 
                        RT_CLEAR_PS_LEVEL(ppsc,
                                          RT_RF_OFF_LEVL_HALT_NIC);
                } else {
                        RT_TRACE(rtlpriv, COMP_POWER, DBG_DMESG,
-                                ("awake, sleeped:%d ms state_"
-                                "inap:%x\n",
+                                "awake, sleeped:%d ms state_inap:%x\n",
                                 jiffies_to_msecs(jiffies -
-                                ppsc->last_sleep_jiffies),
-                                rtlpriv->psc.state_inap));
+                                                 ppsc->last_sleep_jiffies),
+                                rtlpriv->psc.state_inap);
                        ppsc->last_awake_jiffies = jiffies;
                        _rtl92d_phy_set_rfon(hw);
                }
@@ -3360,7 +3243,7 @@ bool rtl92d_phy_set_rf_power_state(struct ieee80211_hw *hw,
        case ERFOFF:
                if (ppsc->reg_rfps_level & RT_RF_OFF_LEVL_HALT_NIC) {
                        RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG,
-                                ("IPS Set eRf nic disable\n"));
+                                "IPS Set eRf nic disable\n");
                        rtl_ps_disable_nic(hw);
                        RT_SET_PS_LEVEL(ppsc, RT_RF_OFF_LEVL_HALT_NIC);
                } else {
@@ -3385,41 +3268,40 @@ bool rtl92d_phy_set_rf_power_state(struct ieee80211_hw *hw,
                                continue;
                        } else if (rtlpci->pdev->current_state != PCI_D0) {
                                RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
-                                        ("eRf Off/Sleep: %d times TcbBusyQueu"
-                                        "e[%d] !=0 but lower power state!\n",
-                                        (i + 1), queue_id));
+                                        "eRf Off/Sleep: %d times TcbBusyQueue[%d] !=0 but lower power state!\n",
+                                        i + 1, queue_id);
                                break;
                        } else {
                                RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
-                                        ("eRf Off/Sleep: %d times TcbBusyQueu"
-                                        "e[%d] =%d "
-                                        "before doze!\n", (i + 1), queue_id,
-                                         skb_queue_len(&ring->queue)));
+                                        "eRf Off/Sleep: %d times TcbBusyQueue[%d] =%d before doze!\n",
+                                        i + 1, queue_id,
+                                        skb_queue_len(&ring->queue));
                                udelay(10);
                                i++;
                        }
 
                        if (i >= MAX_DOZE_WAITING_TIMES_9x) {
                                RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
-                                        ("\nERFOFF: %d times TcbBusyQueue[%d] "
-                                        "= %d !\n",
-                                         MAX_DOZE_WAITING_TIMES_9x, queue_id,
-                                         skb_queue_len(&ring->queue)));
+                                        "ERFOFF: %d times TcbBusyQueue[%d] = %d !\n",
+                                        MAX_DOZE_WAITING_TIMES_9x, queue_id,
+                                        skb_queue_len(&ring->queue));
                                break;
                        }
                }
                RT_TRACE(rtlpriv, COMP_POWER, DBG_DMESG,
-                        ("Set rfsleep awaked:%d ms\n",
-                        jiffies_to_msecs(jiffies - ppsc->last_awake_jiffies)));
-               RT_TRACE(rtlpriv, COMP_POWER, DBG_DMESG, ("sleep awaked:%d ms "
-                        "state_inap:%x\n", jiffies_to_msecs(jiffies -
-                        ppsc->last_awake_jiffies), rtlpriv->psc.state_inap));
+                        "Set rfsleep awaked:%d ms\n",
+                        jiffies_to_msecs(jiffies - ppsc->last_awake_jiffies));
+               RT_TRACE(rtlpriv, COMP_POWER, DBG_DMESG,
+                        "sleep awaked:%d ms state_inap:%x\n",
+                        jiffies_to_msecs(jiffies -
+                                         ppsc->last_awake_jiffies),
+                        rtlpriv->psc.state_inap);
                ppsc->last_sleep_jiffies = jiffies;
                _rtl92d_phy_set_rfsleep(hw);
                break;
        default:
                RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                        ("switch case not process\n"));
+                        "switch case not processed\n");
                bresult = false;
                break;
        }
@@ -3437,17 +3319,17 @@ void rtl92d_phy_config_macphymode(struct ieee80211_hw *hw)
        switch (rtlhal->macphymode) {
        case DUALMAC_DUALPHY:
                RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
-                        ("MacPhyMode: DUALMAC_DUALPHY\n"));
+                        "MacPhyMode: DUALMAC_DUALPHY\n");
                rtl_write_byte(rtlpriv, offset, 0xF3);
                break;
        case SINGLEMAC_SINGLEPHY:
                RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
-                        ("MacPhyMode: SINGLEMAC_SINGLEPHY\n"));
+                        "MacPhyMode: SINGLEMAC_SINGLEPHY\n");
                rtl_write_byte(rtlpriv, offset, 0xF4);
                break;
        case DUALMAC_SINGLEPHY:
                RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
-                        ("MacPhyMode: DUALMAC_SINGLEPHY\n"));
+                        "MacPhyMode: DUALMAC_SINGLEPHY\n");
                rtl_write_byte(rtlpriv, offset, 0xF1);
                break;
        }
@@ -3578,7 +3460,7 @@ void rtl92d_phy_set_poweron(struct ieee80211_hw *hw)
                        }
                }
                if (i == 200)
-                       RT_ASSERT(false, ("Another mac power off over time\n"));
+                       RT_ASSERT(false, "Another mac power off over time\n");
        }
 }
 
@@ -3615,7 +3497,7 @@ void rtl92d_update_bbrf_configuration(struct ieee80211_hw *hw)
        struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
        u8 rfpath, i;
 
-       RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, ("==>\n"));
+       RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "==>\n");
        /* r_select_5G for path_A/B 0 for 2.4G, 1 for 5G */
        if (rtlhal->current_bandtype == BAND_ON_2_4G) {
                /* r_select_5G for path_A/B,0x878 */
@@ -3764,7 +3646,7 @@ void rtl92d_update_bbrf_configuration(struct ieee80211_hw *hw)
                } else {
                        rtl92d_phy_enable_anotherphy(hw, false);
                        RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
-                                ("MAC1 use DBI to update 0x888"));
+                                "MAC1 use DBI to update 0x888\n");
                        /* 0x888 */
                        rtl92de_write_dword_dbi(hw, RFPGA0_ADDALLOCKEN,
                                                rtl92de_read_dword_dbi(hw,
@@ -3789,9 +3671,9 @@ void rtl92d_update_bbrf_configuration(struct ieee80211_hw *hw)
                        BRFREGOFFSETMASK);
        }
        for (i = 0; i < 2; i++)
-               RT_TRACE(rtlpriv, COMP_RF, DBG_LOUD, ("RF 0x18 = 0x%x\n",
-                         rtlphy->rfreg_chnlval[i]));
-       RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, ("<==\n"));
+               RT_TRACE(rtlpriv, COMP_RF, DBG_LOUD, "RF 0x18 = 0x%x\n",
+                        rtlphy->rfreg_chnlval[i]);
+       RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "<==\n");
 
 }
 
index a52c824..f074952 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2009-2010  Realtek Corporation.
+ * Copyright(c) 2009-2012  Realtek Corporation.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
index 131acc3..9bc4623 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2009-2010  Realtek Corporation.
+ * Copyright(c) 2009-2012  Realtek Corporation.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
index db27ceb..3066a7f 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2009-2010  Realtek Corporation.
+ * Copyright(c) 2009-2012  Realtek Corporation.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
@@ -50,8 +50,8 @@ void rtl92d_phy_rf6052_set_bandwidth(struct ieee80211_hw *hw, u8 bandwidth)
                                      BIT(11), 0x01);
 
                        RT_TRACE(rtlpriv, COMP_RF, DBG_LOUD,
-                                ("20M RF 0x18 = 0x%x\n",
-                                rtlphy->rfreg_chnlval[rfpath]));
+                                "20M RF 0x18 = 0x%x\n",
+                                rtlphy->rfreg_chnlval[rfpath]);
                }
 
                break;
@@ -62,13 +62,13 @@ void rtl92d_phy_rf6052_set_bandwidth(struct ieee80211_hw *hw, u8 bandwidth)
                        rtl_set_rfreg(hw, rfpath, RF_CHNLBW, BIT(10) | BIT(11),
                                      0x00);
                        RT_TRACE(rtlpriv, COMP_RF, DBG_LOUD,
-                                ("40M RF 0x18 = 0x%x\n",
-                                rtlphy->rfreg_chnlval[rfpath]));
+                                "40M RF 0x18 = 0x%x\n",
+                                rtlphy->rfreg_chnlval[rfpath]);
                }
                break;
        default:
                RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                        ("unknown bandwidth: %#X\n", bandwidth));
+                        "unknown bandwidth: %#X\n", bandwidth);
                break;
        }
 }
@@ -127,23 +127,23 @@ void rtl92d_phy_rf6052_set_cck_txpower(struct ieee80211_hw *hw,
        tmpval = tx_agc[RF90_PATH_A] & 0xff;
        rtl_set_bbreg(hw, RTXAGC_A_CCK1_MCS32, BMASKBYTE1, tmpval);
        RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
-               ("CCK PWR 1M (rf-A) = 0x%x (reg 0x%x)\n", tmpval,
-               RTXAGC_A_CCK1_MCS32));
+               "CCK PWR 1M (rf-A) = 0x%x (reg 0x%x)\n",
+               tmpval, RTXAGC_A_CCK1_MCS32);
        tmpval = tx_agc[RF90_PATH_A] >> 8;
        rtl_set_bbreg(hw, RTXAGC_B_CCK11_A_CCK2_11, 0xffffff00, tmpval);
        RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
-               ("CCK PWR 2~11M (rf-A) = 0x%x (reg 0x%x)\n", tmpval,
-               RTXAGC_B_CCK11_A_CCK2_11));
+               "CCK PWR 2~11M (rf-A) = 0x%x (reg 0x%x)\n",
+               tmpval, RTXAGC_B_CCK11_A_CCK2_11);
        tmpval = tx_agc[RF90_PATH_B] >> 24;
        rtl_set_bbreg(hw, RTXAGC_B_CCK11_A_CCK2_11, BMASKBYTE0, tmpval);
        RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
-               ("CCK PWR 11M (rf-B) = 0x%x (reg 0x%x)\n", tmpval,
-               RTXAGC_B_CCK11_A_CCK2_11));
+               "CCK PWR 11M (rf-B) = 0x%x (reg 0x%x)\n",
+               tmpval, RTXAGC_B_CCK11_A_CCK2_11);
        tmpval = tx_agc[RF90_PATH_B] & 0x00ffffff;
        rtl_set_bbreg(hw, RTXAGC_B_CCK1_55_MCS32, 0xffffff00, tmpval);
        RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
-               ("CCK PWR 1~5.5M (rf-B) = 0x%x (reg 0x%x)\n", tmpval,
-               RTXAGC_B_CCK1_55_MCS32));
+               "CCK PWR 1~5.5M (rf-B) = 0x%x (reg 0x%x)\n",
+               tmpval, RTXAGC_B_CCK1_55_MCS32);
 }
 
 static void _rtl92d_phy_get_power_base(struct ieee80211_hw *hw,
@@ -165,8 +165,8 @@ static void _rtl92d_phy_get_power_base(struct ieee80211_hw *hw,
                    (powerbase0 << 8) | powerbase0;
                *(ofdmbase + i) = powerbase0;
                RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
-                       (" [OFDM power base index rf(%c) = 0x%x]\n",
-                       ((i == 0) ? 'A' : 'B'), *(ofdmbase + i)));
+                       " [OFDM power base index rf(%c) = 0x%x]\n",
+                       i == 0 ? 'A' : 'B', *(ofdmbase + i));
        }
 
        for (i = 0; i < 2; i++) {
@@ -179,8 +179,8 @@ static void _rtl92d_phy_get_power_base(struct ieee80211_hw *hw,
                             (powerbase1 << 8) | powerbase1;
                *(mcsbase + i) = powerbase1;
                RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
-                       (" [MCS power base index rf(%c) = 0x%x]\n",
-                       ((i == 0) ? 'A' : 'B'), *(mcsbase + i)));
+                       " [MCS power base index rf(%c) = 0x%x]\n",
+                       i == 0 ? 'A' : 'B', *(mcsbase + i));
        }
 }
 
@@ -232,9 +232,9 @@ static void _rtl92d_get_txpower_writeval_by_regulatory(struct ieee80211_hw *hw,
                                        (rf ? 8 : 0)] + ((index < 2) ?
                                        powerbase0[rf] :
                                        powerbase1[rf]);
-                       RTPRINT(rtlpriv, FPHY, PHY_TXPWR, ("RTK better "
-                               "performance, writeval(%c) = 0x%x\n",
-                               ((rf == 0) ? 'A' : 'B'), writeval));
+                       RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
+                               "RTK better performance, writeval(%c) = 0x%x\n",
+                               rf == 0 ? 'A' : 'B', writeval);
                        break;
                case 1:
                        if (rtlphy->pwrgroup_cnt == 1)
@@ -253,33 +253,31 @@ static void _rtl92d_get_txpower_writeval_by_regulatory(struct ieee80211_hw *hw,
                                                powerbase0[rf] :
                                                powerbase1[rf]);
                                RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
-                                       ("Realtek regulatory, "
-                                       "20MHz, writeval(%c) = 0x%x\n",
-                                       ((rf == 0) ? 'A' : 'B'),
-                                       writeval));
+                                       "Realtek regulatory, 20MHz, writeval(%c) = 0x%x\n",
+                                       rf == 0 ? 'A' : 'B', writeval);
                        }
                        break;
                case 2:
                        writeval = ((index < 2) ? powerbase0[rf] :
                                   powerbase1[rf]);
-                       RTPRINT(rtlpriv, FPHY, PHY_TXPWR, ("Better regulatory, "
-                               "writeval(%c) = 0x%x\n",
-                               ((rf == 0) ? 'A' : 'B'), writeval));
+                       RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
+                               "Better regulatory, writeval(%c) = 0x%x\n",
+                               rf == 0 ? 'A' : 'B', writeval);
                        break;
                case 3:
                        chnlgroup = 0;
                        if (rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20_40) {
                                RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
-                                       ("customer's limit, 40MHz rf(%c) = "
-                                       "0x%x\n", ((rf == 0) ? 'A' : 'B'),
+                                       "customer's limit, 40MHz rf(%c) = 0x%x\n",
+                                       rf == 0 ? 'A' : 'B',
                                        rtlefuse->pwrgroup_ht40[rf]
-                                       [channel - 1]));
+                                       [channel - 1]);
                        } else {
                                RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
-                                       ("customer's limit, 20MHz rf(%c) = "
-                                       "0x%x\n", ((rf == 0) ? 'A' : 'B'),
+                                       "customer's limit, 20MHz rf(%c) = 0x%x\n",
+                                       rf == 0 ? 'A' : 'B',
                                        rtlefuse->pwrgroup_ht20[rf]
-                                       [channel - 1]));
+                                       [channel - 1]);
                        }
                        for (i = 0; i < 4; i++) {
                                pwr_diff_limit[i] =
@@ -308,13 +306,13 @@ static void _rtl92d_get_txpower_writeval_by_regulatory(struct ieee80211_hw *hw,
                                         (pwr_diff_limit[1] << 8) |
                                         (pwr_diff_limit[0]);
                        RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
-                               ("Customer's limit rf(%c) = 0x%x\n",
-                               ((rf == 0) ? 'A' : 'B'), customer_limit));
+                               "Customer's limit rf(%c) = 0x%x\n",
+                               rf == 0 ? 'A' : 'B', customer_limit);
                        writeval = customer_limit + ((index < 2) ?
                                   powerbase0[rf] : powerbase1[rf]);
                        RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
-                               ("Customer, writeval rf(%c)= 0x%x\n",
-                               ((rf == 0) ? 'A' : 'B'), writeval));
+                               "Customer, writeval rf(%c)= 0x%x\n",
+                               rf == 0 ? 'A' : 'B', writeval);
                        break;
                default:
                        chnlgroup = 0;
@@ -323,9 +321,8 @@ static void _rtl92d_get_txpower_writeval_by_regulatory(struct ieee80211_hw *hw,
                                   (rf ? 8 : 0)] + ((index < 2) ?
                                   powerbase0[rf] : powerbase1[rf]);
                        RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
-                               ("RTK better performance, writeval "
-                               "rf(%c) = 0x%x\n",
-                               ((rf == 0) ? 'A' : 'B'), writeval));
+                               "RTK better performance, writeval rf(%c) = 0x%x\n",
+                               rf == 0 ? 'A' : 'B', writeval);
                        break;
                }
                *(p_outwriteval + rf) = writeval;
@@ -367,7 +364,7 @@ static void _rtl92d_write_ofdm_power_reg(struct ieee80211_hw *hw,
                        regoffset = regoffset_b[index];
                rtl_set_bbreg(hw, regoffset, BMASKDWORD, writeval);
                RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
-                       ("Set 0x%x = %08x\n", regoffset, writeval));
+                       "Set 0x%x = %08x\n", regoffset, writeval);
                if (((get_rf_type(rtlphy) == RF_2T2R) &&
                    (regoffset == RTXAGC_A_MCS15_MCS12 ||
                    regoffset == RTXAGC_B_MCS15_MCS12)) ||
@@ -423,11 +420,11 @@ bool rtl92d_phy_enable_anotherphy(struct ieee80211_hw *hw, bool bmac0)
 
        rtlhal->during_mac0init_radiob = false;
        rtlhal->during_mac1init_radioa = false;
-       RT_TRACE(rtlpriv, COMP_RF, DBG_LOUD, ("===>\n"));
+       RT_TRACE(rtlpriv, COMP_RF, DBG_LOUD, "===>\n");
        /* MAC0 Need PHY1 load radio_b.txt . Driver use DBI to write. */
        u1btmp = rtl_read_byte(rtlpriv, mac_reg);
        if (!(u1btmp & mac_on_bit)) {
-               RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, ("enable BB & RF\n"));
+               RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "enable BB & RF\n");
                /* Enable BB and RF power */
                rtl92de_write_dword_dbi(hw, REG_SYS_ISO_CTRL,
                        rtl92de_read_dword_dbi(hw, REG_SYS_ISO_CTRL, direct) |
@@ -437,7 +434,7 @@ bool rtl92d_phy_enable_anotherphy(struct ieee80211_hw *hw, bool bmac0)
                 * and radio_b.txt has been load. */
                bresult = false;
        }
-       RT_TRACE(rtlpriv, COMP_RF, DBG_LOUD, ("<===\n"));
+       RT_TRACE(rtlpriv, COMP_RF, DBG_LOUD, "<===\n");
        return bresult;
 
 }
@@ -453,17 +450,17 @@ void rtl92d_phy_powerdown_anotherphy(struct ieee80211_hw *hw, bool bmac0)
 
        rtlhal->during_mac0init_radiob = false;
        rtlhal->during_mac1init_radioa = false;
-       RT_TRACE(rtlpriv, COMP_RF, DBG_LOUD, ("====>\n"));
+       RT_TRACE(rtlpriv, COMP_RF, DBG_LOUD, "====>\n");
        /* check MAC0 enable or not again now, if
         * enabled, not power down radio A. */
        u1btmp = rtl_read_byte(rtlpriv, mac_reg);
        if (!(u1btmp & mac_on_bit)) {
-               RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, ("power down\n"));
+               RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "power down\n");
                /* power down RF radio A according to YuNan's advice. */
                rtl92de_write_dword_dbi(hw, RFPGA0_XA_LSSIPARAMETER,
                                        0x00000000, direct);
        }
-       RT_TRACE(rtlpriv, COMP_RF, DBG_LOUD, ("<====\n"));
+       RT_TRACE(rtlpriv, COMP_RF, DBG_LOUD, "<====\n");
 }
 
 bool rtl92d_phy_rf6052_config(struct ieee80211_hw *hw)
@@ -604,9 +601,9 @@ bool rtl92d_phy_rf6052_config(struct ieee80211_hw *hw)
                                      u4_regvalue);
                        break;
                }
-               if (rtstatus != true) {
+               if (!rtstatus) {
                        RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
-                               ("Radio[%d] Fail!!", rfpath));
+                                "Radio[%d] Fail!!", rfpath);
                        goto phy_rf_cfg_fail;
                }
 
@@ -620,7 +617,7 @@ bool rtl92d_phy_rf6052_config(struct ieee80211_hw *hw)
                rtl92d_phy_powerdown_anotherphy(hw, false);
        else if (need_pwrdown_radiob)
                rtl92d_phy_powerdown_anotherphy(hw, true);
-       RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, ("<---\n"));
+       RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, "<---\n");
        return rtstatus;
 
 phy_rf_cfg_fail:
index 74b9cfc..0fe1a48 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2009-2010  Realtek Corporation.
+ * Copyright(c) 2009-2012  Realtek Corporation.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
index 7911c9c..4898c50 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2009-2010  Realtek Corporation.
+ * Copyright(c) 2009-2012  Realtek Corporation.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
  *
  *****************************************************************************/
 
-#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
-
-#include <linux/vmalloc.h>
-#include <linux/module.h>
-
 #include "../wifi.h"
 #include "../core.h"
 #include "../pci.h"
@@ -44,6 +39,8 @@
 #include "trx.h"
 #include "led.h"
 
+#include <linux/module.h>
+
 static void rtl92d_init_aspm_vars(struct ieee80211_hw *hw)
 {
        struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
@@ -94,7 +91,6 @@ static int rtl92d_init_sw_vars(struct ieee80211_hw *hw)
        u8 tid;
        struct rtl_priv *rtlpriv = rtl_priv(hw);
        struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
-       const struct firmware *firmware;
        static int header_print;
 
        rtlpriv->dm.dm_initialgain_enable = true;
@@ -154,9 +150,9 @@ static int rtl92d_init_sw_vars(struct ieee80211_hw *hw)
        rtlpriv->psc.swctrl_lps = rtlpriv->cfg->mod_params->swctrl_lps;
        rtlpriv->psc.fwctrl_lps = rtlpriv->cfg->mod_params->fwctrl_lps;
        if (!rtlpriv->psc.inactiveps)
-               pr_info("rtl8192ce: Power Save off (module option)\n");
+               pr_info("Power Save off (module option)\n");
        if (!rtlpriv->psc.fwctrl_lps)
-               pr_info("rtl8192ce: FW Power Save off (module option)\n");
+               pr_info("FW Power Save off (module option)\n");
        rtlpriv->psc.reg_fwctrl_lps = 3;
        rtlpriv->psc.reg_max_lps_awakeintvl = 5;
        /* for ASPM, you can close aspm through
@@ -170,41 +166,38 @@ static int rtl92d_init_sw_vars(struct ieee80211_hw *hw)
        else if (rtlpriv->psc.reg_fwctrl_lps == 3)
                rtlpriv->psc.fwctrl_psmode = FW_PS_DTIM_MODE;
 
+       /* for early mode */
+       rtlpriv->rtlhal.earlymode_enable = true;
+       for (tid = 0; tid < 8; tid++)
+               skb_queue_head_init(&rtlpriv->mac80211.skb_waitq[tid]);
+
+       /* Only load firmware for first MAC */
+       if (header_print)
+               return 0;
+
        /* for firmware buf */
        rtlpriv->rtlhal.pfirmware = vzalloc(0x8000);
        if (!rtlpriv->rtlhal.pfirmware) {
                RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                        ("Can't alloc buffer for fw.\n"));
+                        "Can't alloc buffer for fw\n");
                return 1;
        }
 
-       if (!header_print) {
-               pr_info("Driver for Realtek RTL8192DE WLAN interface\n");
-               pr_info("Loading firmware file %s\n", rtlpriv->cfg->fw_name);
-               header_print++;
-       }
+       rtlpriv->max_fw_size = 0x8000;
+       pr_info("Driver for Realtek RTL8192DE WLAN interface\n");
+       pr_info("Loading firmware file %s\n", rtlpriv->cfg->fw_name);
+       header_print++;
+
        /* request fw */
-       err = request_firmware(&firmware, rtlpriv->cfg->fw_name,
-                              rtlpriv->io.dev);
+       err = request_firmware_nowait(THIS_MODULE, 1, rtlpriv->cfg->fw_name,
+                                     rtlpriv->io.dev, GFP_KERNEL, hw,
+                                     rtl_fw_cb);
        if (err) {
                RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                        ("Failed to request firmware!\n"));
-               return 1;
-       }
-       if (firmware->size > 0x8000) {
-               RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                        ("Firmware is too big!\n"));
-               release_firmware(firmware);
+                        "Failed to request firmware!\n");
                return 1;
        }
-       memcpy(rtlpriv->rtlhal.pfirmware, firmware->data, firmware->size);
-       rtlpriv->rtlhal.fwsize = firmware->size;
-       release_firmware(firmware);
 
-       /* for early mode */
-       rtlpriv->rtlhal.earlymode_enable = true;
-       for (tid = 0; tid < 8; tid++)
-               skb_queue_head_init(&rtlpriv->mac80211.skb_waitq[tid]);
        return 0;
 }
 
@@ -424,7 +417,7 @@ static int __init rtl92de_module_init(void)
 
        ret = pci_register_driver(&rtl92de_driver);
        if (ret)
-               RT_ASSERT(false, (": No device found\n"));
+               RT_ASSERT(false, "No device found\n");
        return ret;
 }
 
index c95e47d..0e6035b 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2009-2010  Realtek Corporation.
+ * Copyright(c) 2009-2012  Realtek Corporation.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
index bad7f94..8ea6f52 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2009-2010  Realtek Corporation.
+ * Copyright(c) 2009-2012  Realtek Corporation.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
index 93f30ca..8b724a8 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2009-2010  Realtek Corporation.
+ * Copyright(c) 2009-2012  Realtek Corporation.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
index 3637c0c..a7f6126 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2009-2010  Realtek Corporation.
+ * Copyright(c) 2009-2012  Realtek Corporation.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
@@ -602,8 +602,8 @@ void rtl92de_tx_fill_desc(struct ieee80211_hw *hw,
                                           EM_HDR_LEN);
                        if (ptcb_desc->empkt_num) {
                                RT_TRACE(rtlpriv, COMP_SEND, DBG_LOUD,
-                                        ("Insert 8 byte.pTcb->EMPktNum:%d\n",
-                                         ptcb_desc->empkt_num));
+                                        "Insert 8 byte.pTcb->EMPktNum:%d\n",
+                                        ptcb_desc->empkt_num);
                                _rtl92de_insert_emcontent(ptcb_desc,
                                                          (u8 *)(skb->data));
                        }
@@ -700,7 +700,7 @@ void rtl92de_tx_fill_desc(struct ieee80211_hw *hw,
                if (ieee80211_is_data_qos(fc)) {
                        if (mac->rdg_en) {
                                RT_TRACE(rtlpriv, COMP_SEND, DBG_TRACE,
-                                       ("Enable RDG function.\n"));
+                                        "Enable RDG function\n");
                                SET_TX_DESC_RDG_ENABLE(pdesc, 1);
                                SET_TX_DESC_HTC(pdesc, 1);
                        }
@@ -726,7 +726,7 @@ void rtl92de_tx_fill_desc(struct ieee80211_hw *hw,
                SET_TX_DESC_PKT_ID(pdesc, 8);
        }
        SET_TX_DESC_MORE_FRAG(pdesc, (lastseg ? 0 : 1));
-       RT_TRACE(rtlpriv, COMP_SEND, DBG_TRACE, ("\n"));
+       RT_TRACE(rtlpriv, COMP_SEND, DBG_TRACE, "\n");
 }
 
 void rtl92de_tx_fill_cmddesc(struct ieee80211_hw *hw,
@@ -776,7 +776,7 @@ void rtl92de_tx_fill_cmddesc(struct ieee80211_hw *hw,
        }
 
        RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_LOUD,
-                     "H2C Tx Cmd Content\n", pdesc, TX_DESC_SIZE);
+                     "H2C Tx Cmd Content", pdesc, TX_DESC_SIZE);
        wmb();
        SET_TX_DESC_OWN(pdesc, 1);
 }
@@ -793,8 +793,8 @@ void rtl92de_set_desc(u8 *pdesc, bool istx, u8 desc_name, u8 *val)
                        SET_TX_DESC_NEXT_DESC_ADDRESS(pdesc, *(u32 *) val);
                        break;
                default:
-                       RT_ASSERT(false, ("ERR txdesc :%d"
-                                         " not process\n", desc_name));
+                       RT_ASSERT(false, "ERR txdesc :%d not process\n",
+                                 desc_name);
                        break;
                }
        } else {
@@ -813,8 +813,8 @@ void rtl92de_set_desc(u8 *pdesc, bool istx, u8 desc_name, u8 *val)
                        SET_RX_DESC_EOR(pdesc, 1);
                        break;
                default:
-                       RT_ASSERT(false, ("ERR rxdesc :%d "
-                                         "not process\n", desc_name));
+                       RT_ASSERT(false, "ERR rxdesc :%d not process\n",
+                                 desc_name);
                        break;
                }
        }
@@ -833,8 +833,8 @@ u32 rtl92de_get_desc(u8 *p_desc, bool istx, u8 desc_name)
                        ret = GET_TX_DESC_TX_BUFFER_ADDRESS(p_desc);
                        break;
                default:
-                       RT_ASSERT(false, ("ERR txdesc :%d "
-                                         "not process\n", desc_name));
+                       RT_ASSERT(false, "ERR txdesc :%d not process\n",
+                                 desc_name);
                        break;
                }
        } else {
@@ -847,8 +847,8 @@ u32 rtl92de_get_desc(u8 *p_desc, bool istx, u8 desc_name)
                        ret = GET_RX_DESC_PKT_LEN(pdesc);
                        break;
                default:
-                       RT_ASSERT(false, ("ERR rxdesc :%d "
-                                         "not process\n", desc_name));
+                       RT_ASSERT(false, "ERR rxdesc :%d not process\n",
+                                 desc_name);
                        break;
                }
        }
index 4d55d0b..0dc736c 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2009-2010  Realtek Corporation.
+ * Copyright(c) 2009-2012  Realtek Corporation.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
index c6c0448..d1b0a1e 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2009-2010  Realtek Corporation.
+ * Copyright(c) 2009-2012  Realtek Corporation.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
index 4203a85..fbabae1 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2009-2010  Realtek Corporation.
+ * Copyright(c) 2009-2012  Realtek Corporation.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
@@ -170,9 +170,9 @@ static void _rtl92s_dm_txpowertracking_callback_thermalmeter(
        thermalvalue = (u8)rtl_get_rfreg(hw, RF90_PATH_A, RF_T_METER, 0x1f);
 
        RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
-                ("Readback Thermal Meter = 0x%x pre thermal meter 0x%x "
-                 "eeprom_thermalmeter 0x%x\n", thermalvalue,
-                 rtlpriv->dm.thermalvalue, rtlefuse->eeprom_thermalmeter));
+                "Readback Thermal Meter = 0x%x pre thermal meter 0x%x eeprom_thermal meter 0x%x\n",
+                thermalvalue,
+                rtlpriv->dm.thermalvalue, rtlefuse->eeprom_thermalmeter);
 
        if (thermalvalue) {
                rtlpriv->dm.thermalvalue = thermalvalue;
@@ -282,11 +282,11 @@ static void _rtl92s_dm_refresh_rateadaptive_mask(struct ieee80211_hw *hw)
                }
 
                if (ra->pre_ratr_state != ra->ratr_state) {
-                       RT_TRACE(rtlpriv, COMP_RATE, DBG_LOUD, ("RSSI = %ld "
-                               "RSSI_LEVEL = %d PreState = %d, CurState = %d\n",
-                               rtlpriv->dm.undecorated_smoothed_pwdb,
-                               ra->ratr_state,
-                               ra->pre_ratr_state, ra->ratr_state));
+                       RT_TRACE(rtlpriv, COMP_RATE, DBG_LOUD,
+                                "RSSI = %ld RSSI_LEVEL = %d PreState = %d, CurState = %d\n",
+                                rtlpriv->dm.undecorated_smoothed_pwdb,
+                                ra->ratr_state,
+                                ra->pre_ratr_state, ra->ratr_state);
 
                        rtlpriv->cfg->ops->update_rate_tbl(hw, sta,
                                                           ra->ratr_state);
@@ -586,7 +586,7 @@ static void _rtl92s_dm_dynamic_txpower(struct ieee80211_hw *hw)
        if ((mac->link_state < MAC80211_LINKED) &&
            (rtlpriv->dm.entry_min_undecoratedsmoothed_pwdb == 0)) {
                RT_TRACE(rtlpriv, COMP_POWER, DBG_TRACE,
-                        ("Not connected to any\n"));
+                        "Not connected to any\n");
 
                rtlpriv->dm.dynamic_txhighpower_lvl = TX_HIGHPWR_LEVEL_NORMAL;
 
@@ -599,22 +599,22 @@ static void _rtl92s_dm_dynamic_txpower(struct ieee80211_hw *hw)
                        undecorated_smoothed_pwdb =
                            rtlpriv->dm.entry_min_undecoratedsmoothed_pwdb;
                        RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
-                                ("AP Client PWDB = 0x%lx\n",
-                                 undecorated_smoothed_pwdb));
+                                "AP Client PWDB = 0x%lx\n",
+                                undecorated_smoothed_pwdb);
                } else {
                        undecorated_smoothed_pwdb =
                            rtlpriv->dm.undecorated_smoothed_pwdb;
                        RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
-                                ("STA Default Port PWDB = 0x%lx\n",
-                                 undecorated_smoothed_pwdb));
+                                "STA Default Port PWDB = 0x%lx\n",
+                                undecorated_smoothed_pwdb);
                }
        } else {
                undecorated_smoothed_pwdb =
                    rtlpriv->dm.entry_min_undecoratedsmoothed_pwdb;
 
                RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
-                        ("AP Ext Port PWDB = 0x%lx\n",
-                         undecorated_smoothed_pwdb));
+                        "AP Ext Port PWDB = 0x%lx\n",
+                        undecorated_smoothed_pwdb);
        }
 
        txpwr_threshold_lv2 = TX_POWER_NEAR_FIELD_THRESH_LVL2;
index 9051a55..e1b19a6 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2009-2010  Realtek Corporation.
+ * Copyright(c) 2009-2012  Realtek Corporation.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
index 3fda6b1..380e7d4 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2009-2010  Realtek Corporation.
+ * Copyright(c) 2009-2012  Realtek Corporation.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
@@ -66,7 +66,7 @@ static bool _rtl92s_firmware_enable_cpu(struct ieee80211_hw *hw)
                cpustatus = rtl_read_byte(rtlpriv, TCR);
                if (cpustatus & IMEM_RDY) {
                        RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
-                               ("IMEM Ready after CPU has refilled.\n"));
+                                "IMEM Ready after CPU has refilled\n");
                        break;
                }
 
@@ -120,9 +120,8 @@ static u8 _rtl92s_firmware_header_map_rftype(struct ieee80211_hw *hw)
                return 0x22;
                break;
        default:
-               RT_TRACE(rtlpriv, COMP_INIT, DBG_EMERG,
-                        ("Unknown RF type(%x)\n",
-                        rtlphy->rf_type));
+               RT_TRACE(rtlpriv, COMP_INIT, DBG_EMERG, "Unknown RF type(%x)\n",
+                        rtlphy->rf_type);
                break;
        }
        return 0x22;
@@ -177,7 +176,7 @@ static bool _rtl92s_firmware_downloadcode(struct ieee80211_hw *hw,
 
        if (buffer_len >= MAX_FIRMWARE_CODE_SIZE) {
                RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                       ("Size over FIRMWARE_CODE_SIZE!\n"));
+                        "Size over FIRMWARE_CODE_SIZE!\n");
 
                return false;
        }
@@ -231,8 +230,8 @@ static bool _rtl92s_firmware_checkready(struct ieee80211_hw *hw,
        short pollingcnt = 1000;
        bool rtstatus = true;
 
-       RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, ("LoadStaus(%d)\n",
-                loadfw_status));
+       RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
+                "LoadStaus(%d)\n", loadfw_status);
 
        firmware->fwstatus = (enum fw_status)loadfw_status;
 
@@ -248,8 +247,8 @@ static bool _rtl92s_firmware_checkready(struct ieee80211_hw *hw,
 
                if (!(cpustatus & IMEM_CHK_RPT) || (pollingcnt <= 0)) {
                        RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                                ("FW_STATUS_LOAD_IMEM"
-                                " FAIL CPU, Status=%x\r\n", cpustatus));
+                                "FW_STATUS_LOAD_IMEM FAIL CPU, Status=%x\n",
+                                cpustatus);
                        goto status_check_fail;
                }
                break;
@@ -266,16 +265,16 @@ static bool _rtl92s_firmware_checkready(struct ieee80211_hw *hw,
 
                if (!(cpustatus & EMEM_CHK_RPT) || (pollingcnt <= 0)) {
                        RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                                ("FW_STATUS_LOAD_EMEM"
-                                " FAIL CPU, Status=%x\r\n", cpustatus));
+                                "FW_STATUS_LOAD_EMEM FAIL CPU, Status=%x\n",
+                                cpustatus);
                        goto status_check_fail;
                }
 
                /* Turn On CPU */
                rtstatus = _rtl92s_firmware_enable_cpu(hw);
-               if (rtstatus != true) {
+               if (!rtstatus) {
                        RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                                ("Enable CPU fail!\n"));
+                                "Enable CPU fail!\n");
                        goto status_check_fail;
                }
                break;
@@ -291,14 +290,14 @@ static bool _rtl92s_firmware_checkready(struct ieee80211_hw *hw,
 
                if (!(cpustatus & DMEM_CODE_DONE) || (pollingcnt <= 0)) {
                        RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                                ("Polling  DMEM code done"
-                                " fail ! cpustatus(%#x)\n", cpustatus));
+                                "Polling DMEM code done fail ! cpustatus(%#x)\n",
+                                cpustatus);
                        goto status_check_fail;
                }
 
                RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
-                        ("DMEM code download success,"
-                       " cpustatus(%#x)\n", cpustatus));
+                        "DMEM code download success, cpustatus(%#x)\n",
+                        cpustatus);
 
                /* Prevent Delay too much and being scheduled out */
                /* Polling Load Firmware ready */
@@ -311,14 +310,14 @@ static bool _rtl92s_firmware_checkready(struct ieee80211_hw *hw,
                } while (pollingcnt--);
 
                RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
-                        ("Polling Load Firmware ready,"
-                       " cpustatus(%x)\n",     cpustatus));
+                        "Polling Load Firmware ready, cpustatus(%x)\n",
+                        cpustatus);
 
                if (((cpustatus & LOAD_FW_READY) != LOAD_FW_READY) ||
                    (pollingcnt <= 0)) {
                        RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                                ("Polling Load Firmware"
-                               " ready fail ! cpustatus(%x)\n", cpustatus));
+                                "Polling Load Firmware ready fail ! cpustatus(%x)\n",
+                                cpustatus);
                        goto status_check_fail;
                }
 
@@ -332,7 +331,7 @@ static bool _rtl92s_firmware_checkready(struct ieee80211_hw *hw,
                                RCR_APP_ICV | RCR_APP_MIC));
 
                RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
-                        ("Current RCR settings(%#x)\n", tmpu4b));
+                        "Current RCR settings(%#x)\n", tmpu4b);
 
                /* Set to normal mode. */
                rtl_write_byte(rtlpriv, LBKMD_SEL, LBK_NORMAL);
@@ -340,14 +339,15 @@ static bool _rtl92s_firmware_checkready(struct ieee80211_hw *hw,
 
        default:
                RT_TRACE(rtlpriv, COMP_INIT, DBG_EMERG,
-                        ("Unknown status check!\n"));
+                        "Unknown status check!\n");
                rtstatus = false;
                break;
        }
 
 status_check_fail:
-       RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, ("loadfw_status(%d), "
-                "rtstatus(%x)\n", loadfw_status, rtstatus));
+       RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
+                "loadfw_status(%d), rtstatus(%x)\n",
+                loadfw_status, rtstatus);
        return rtstatus;
 }
 
@@ -364,7 +364,7 @@ int rtl92s_download_fw(struct ieee80211_hw *hw)
        u8 fwstatus = FW_STATUS_INIT;
        bool rtstatus = true;
 
-       if (!rtlhal->pfirmware)
+       if (rtlpriv->max_fw_size == 0 || !rtlhal->pfirmware)
                return 1;
 
        firmware = (struct rt_firmware *)rtlhal->pfirmware;
@@ -378,17 +378,17 @@ int rtl92s_download_fw(struct ieee80211_hw *hw)
        firmware->firmwareversion =  byte(pfwheader->version, 0);
        firmware->pfwheader->fwpriv.hci_sel = 1;/* pcie */
 
-       RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, ("signature:%x, version:"
-                "%x, size:%x,"
-                "imemsize:%x, sram size:%x\n", pfwheader->signature,
+       RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
+                "signature:%x, version:%x, size:%x, imemsize:%x, sram size:%x\n",
+                pfwheader->signature,
                 pfwheader->version, pfwheader->dmem_size,
-                pfwheader->img_imem_size, pfwheader->img_sram_size));
+                pfwheader->img_imem_size, pfwheader->img_sram_size);
 
        /* 2. Retrieve IMEM image. */
        if ((pfwheader->img_imem_size == 0) || (pfwheader->img_imem_size >
            sizeof(firmware->fw_imem))) {
                RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                       ("memory for data image is less than IMEM required\n"));
+                        "memory for data image is less than IMEM required\n");
                goto fail;
        } else {
                puc_mappedfile += fwhdr_size;
@@ -401,7 +401,7 @@ int rtl92s_download_fw(struct ieee80211_hw *hw)
        /* 3. Retriecve EMEM image. */
        if (pfwheader->img_sram_size > sizeof(firmware->fw_emem)) {
                RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                       ("memory for data image is less than EMEM required\n"));
+                        "memory for data image is less than EMEM required\n");
                goto fail;
        } else {
                puc_mappedfile += firmware->fw_imem_len;
@@ -436,7 +436,7 @@ int rtl92s_download_fw(struct ieee80211_hw *hw)
                        break;
                default:
                        RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                                       ("Unexpected Download step!!\n"));
+                                "Unexpected Download step!!\n");
                        goto fail;
                        break;
                }
@@ -445,15 +445,15 @@ int rtl92s_download_fw(struct ieee80211_hw *hw)
                rtstatus = _rtl92s_firmware_downloadcode(hw, puc_mappedfile,
                                ul_filelength);
 
-               if (rtstatus != true) {
-                       RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, ("fail!\n"));
+               if (!rtstatus) {
+                       RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "fail!\n");
                        goto fail;
                }
 
                /* <3> Check whether load FW process is ready */
                rtstatus = _rtl92s_firmware_checkready(hw, fwstatus);
-               if (rtstatus != true) {
-                       RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, ("fail!\n"));
+               if (!rtstatus) {
+                       RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "fail!\n");
                        goto fail;
                }
 
index 74cc503..b4afff6 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2009-2010  Realtek Corporation.
+ * Copyright(c) 2009-2012  Realtek Corporation.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
@@ -30,6 +30,7 @@
 #define __REALTEK_FIRMWARE92S_H__
 
 #define RTL8190_MAX_FIRMWARE_CODE_SIZE         64000
+#define RTL8190_MAX_RAW_FIRMWARE_CODE_SIZE     90000
 #define RTL8190_CPU_START_OFFSET               0x80
 /* Firmware Local buffer size. 64k */
 #define        MAX_FIRMWARE_CODE_SIZE                  0xFF00
@@ -217,7 +218,7 @@ struct rt_firmware {
        u8 fw_emem[RTL8190_MAX_FIRMWARE_CODE_SIZE];
        u32 fw_imem_len;
        u32 fw_emem_len;
-       u8 sz_fw_tmpbuffer[164000];
+       u8 sz_fw_tmpbuffer[RTL8190_MAX_RAW_FIRMWARE_CODE_SIZE];
        u32 sz_fw_tmpbufferlen;
        u16 cmdpacket_fragthresold;
 };
index c474486..b141c35 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2009-2010  Realtek Corporation.
+ * Copyright(c) 2009-2012  Realtek Corporation.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
@@ -27,8 +27,6 @@
  *
  *****************************************************************************/
 
-#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
-
 #include "../wifi.h"
 #include "../efuse.h"
 #include "../base.h"
@@ -80,8 +78,8 @@ void rtl92se_get_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)
                        break;
                }
        default: {
-                       RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                                ("switch case not process\n"));
+               RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
+                        "switch case not processed\n");
                        break;
                }
        }
@@ -140,7 +138,7 @@ void rtl92se_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)
                        u8 e_aci;
 
                        RT_TRACE(rtlpriv, COMP_MLME, DBG_LOUD,
-                                ("HW_VAR_SLOT_TIME %x\n", val[0]));
+                                "HW_VAR_SLOT_TIME %x\n", val[0]);
 
                        rtl_write_byte(rtlpriv, SLOT_TIME, val[0]);
 
@@ -185,8 +183,8 @@ void rtl92se_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)
                                *val = min_spacing_to_set;
 
                                RT_TRACE(rtlpriv, COMP_MLME, DBG_LOUD,
-                                        ("Set HW_VAR_AMPDU_MIN_SPACE: %#x\n",
-                                         mac->min_space_cfg));
+                                        "Set HW_VAR_AMPDU_MIN_SPACE: %#x\n",
+                                        mac->min_space_cfg);
 
                                rtl_write_byte(rtlpriv, AMPDU_MIN_SPACE,
                                               mac->min_space_cfg);
@@ -201,8 +199,8 @@ void rtl92se_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)
                        mac->min_space_cfg |= (density_to_set << 3);
 
                        RT_TRACE(rtlpriv, COMP_MLME, DBG_LOUD,
-                                ("Set HW_VAR_SHORTGI_DENSITY: %#x\n",
-                                 mac->min_space_cfg));
+                                "Set HW_VAR_SHORTGI_DENSITY: %#x\n",
+                                mac->min_space_cfg);
 
                        rtl_write_byte(rtlpriv, AMPDU_MIN_SPACE,
                                       mac->min_space_cfg);
@@ -244,8 +242,8 @@ void rtl92se_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)
                                rtl_write_byte(rtlpriv, AGGLEN_LMT_H, regtoset);
 
                                RT_TRACE(rtlpriv, COMP_MLME, DBG_LOUD,
-                                        ("Set HW_VAR_AMPDU_FACTOR: %#x\n",
-                                         factor_toset));
+                                        "Set HW_VAR_AMPDU_FACTOR: %#x\n",
+                                        factor_toset);
                        }
                        break;
                }
@@ -282,8 +280,8 @@ void rtl92se_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)
                                        break;
                                default:
                                        RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
-                                                ("HW_VAR_ACM_CTRL acm set "
-                                                 "failed: eACI is %d\n", acm));
+                                                "HW_VAR_ACM_CTRL acm set failed: eACI is %d\n",
+                                                acm);
                                        break;
                                }
                        } else {
@@ -299,13 +297,13 @@ void rtl92se_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)
                                        break;
                                default:
                                        RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                                                ("switch case not process\n"));
+                                                "switch case not processed\n");
                                        break;
                                }
                        }
 
                        RT_TRACE(rtlpriv, COMP_QOS, DBG_TRACE,
-                                ("HW_VAR_ACM_CTRL Write 0x%X\n", acm_ctrl));
+                                "HW_VAR_ACM_CTRL Write 0x%X\n", acm_ctrl);
                        rtl_write_byte(rtlpriv, AcmHwCtrl, acm_ctrl);
                        break;
                }
@@ -404,7 +402,7 @@ void rtl92se_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)
                }
        default:
                RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                        ("switch case not process\n"));
+                        "switch case not processed\n");
                break;
        }
 
@@ -415,14 +413,14 @@ void rtl92se_enable_hw_security_config(struct ieee80211_hw *hw)
        struct rtl_priv *rtlpriv = rtl_priv(hw);
        u8 sec_reg_value = 0x0;
 
-       RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, ("PairwiseEncAlgorithm = %d "
-                "GroupEncAlgorithm = %d\n",
+       RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
+                "PairwiseEncAlgorithm = %d GroupEncAlgorithm = %d\n",
                 rtlpriv->sec.pairwise_enc_algorithm,
-                rtlpriv->sec.group_enc_algorithm));
+                rtlpriv->sec.group_enc_algorithm);
 
        if (rtlpriv->cfg->mod_params->sw_crypto || rtlpriv->sec.use_sw_sec) {
                RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG,
-                        ("not open hw encryption\n"));
+                        "not open hw encryption\n");
                return;
        }
 
@@ -433,8 +431,8 @@ void rtl92se_enable_hw_security_config(struct ieee80211_hw *hw)
                sec_reg_value |= SCR_RXUSEDK;
        }
 
-       RT_TRACE(rtlpriv, COMP_SEC, DBG_LOUD, ("The SECR-value %x\n",
-                       sec_reg_value));
+       RT_TRACE(rtlpriv, COMP_SEC, DBG_LOUD, "The SECR-value %x\n",
+                sec_reg_value);
 
        rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_WPA_CONFIG, &sec_reg_value);
 
@@ -718,8 +716,8 @@ static void _rtl92se_macconfig_before_fwdownload(struct ieee80211_hw *hw)
 
        if (pollingcnt <= 0) {
                RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                        ("Polling TXDMA_INIT_VALUE "
-                        "timeout!! Current TCR(%#x)\n", tmpu1b));
+                        "Polling TXDMA_INIT_VALUE timeout!! Current TCR(%#x)\n",
+                        tmpu1b);
                tmpu1b = rtl_read_byte(rtlpriv, CMDR);
                rtl_write_byte(rtlpriv, CMDR, tmpu1b & (~TXDMA_EN));
                udelay(2);
@@ -870,10 +868,10 @@ static void _rtl92se_macconfig_after_fwdownload(struct ieee80211_hw *hw)
 
                /* Change Program timing */
                rtl_write_byte(rtlpriv, REG_EFUSE_CTRL + 3, 0x72);
-               RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, ("EFUSE CONFIG OK\n"));
+               RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "EFUSE CONFIG OK\n");
        }
 
-       RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, ("OK\n"));
+       RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "OK\n");
 
 }
 
@@ -951,12 +949,9 @@ int rtl92se_hw_init(struct ieee80211_hw *hw)
        rtstatus = rtl92s_download_fw(hw);
        if (!rtstatus) {
                RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
-                        ("Failed to download FW. "
-                        "Init HW without FW now.., Please copy FW into"
-                        "/lib/firmware/rtlwifi\n"));
-               rtlhal->fw_ready = false;
-       } else {
-               rtlhal->fw_ready = true;
+                        "Failed to download FW. Init HW without FW now... "
+                        "Please copy FW into /lib/firmware/rtlwifi\n");
+               return 1;
        }
 
        /* After FW download, we have to reset MAC register */
@@ -967,8 +962,8 @@ int rtl92se_hw_init(struct ieee80211_hw *hw)
        rtlhal->fwcmd_ioparam = rtl_read_dword(rtlpriv, LBUS_ADDR_MASK);
 
        /* 3. Initialize MAC/PHY Config by MACPHY_reg.txt */
-       if (rtl92s_phy_mac_config(hw) != true) {
-               RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, ("MAC Config failed\n"));
+       if (!rtl92s_phy_mac_config(hw)) {
+               RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "MAC Config failed\n");
                return rtstatus;
        }
 
@@ -977,8 +972,8 @@ int rtl92se_hw_init(struct ieee80211_hw *hw)
        rtl_write_dword(rtlpriv, CMDR, 0x37FC);
 
        /* 4. Initialize BB After MAC Config PHY_reg.txt, AGC_Tab.txt */
-       if (rtl92s_phy_bb_config(hw) != true) {
-               RT_TRACE(rtlpriv, COMP_INIT, DBG_EMERG, ("BB Config failed\n"));
+       if (!rtl92s_phy_bb_config(hw)) {
+               RT_TRACE(rtlpriv, COMP_INIT, DBG_EMERG, "BB Config failed\n");
                return rtstatus;
        }
 
@@ -1013,8 +1008,8 @@ int rtl92se_hw_init(struct ieee80211_hw *hw)
        else
                rtl_write_byte(rtlpriv, RF_CTRL, 0x07);
 
-       if (rtl92s_phy_rf_config(hw) != true) {
-               RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, ("RF Config failed\n"));
+       if (!rtl92s_phy_rf_config(hw)) {
+               RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "RF Config failed\n");
                return rtstatus;
        }
 
@@ -1110,7 +1105,7 @@ void rtl92se_set_check_bssid(struct ieee80211_hw *hw, bool check_bssid)
        if (check_bssid) {
                reg_rcr |= (RCR_CBSSID);
                rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_RCR, (u8 *)(&reg_rcr));
-       } else if (check_bssid == false) {
+       } else if (!check_bssid) {
                reg_rcr &= (~RCR_CBSSID);
                rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_RCR, (u8 *)(&reg_rcr));
        }
@@ -1129,26 +1124,26 @@ static int _rtl92se_set_media_status(struct ieee80211_hw *hw,
        case NL80211_IFTYPE_UNSPECIFIED:
                bt_msr |= (MSR_LINK_NONE << MSR_LINK_SHIFT);
                RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
-                        ("Set Network type to NO LINK!\n"));
+                        "Set Network type to NO LINK!\n");
                break;
        case NL80211_IFTYPE_ADHOC:
                bt_msr |= (MSR_LINK_ADHOC << MSR_LINK_SHIFT);
                RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
-                        ("Set Network type to Ad Hoc!\n"));
+                        "Set Network type to Ad Hoc!\n");
                break;
        case NL80211_IFTYPE_STATION:
                bt_msr |= (MSR_LINK_MANAGED << MSR_LINK_SHIFT);
                RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
-                        ("Set Network type to STA!\n"));
+                        "Set Network type to STA!\n");
                break;
        case NL80211_IFTYPE_AP:
                bt_msr |= (MSR_LINK_MASTER << MSR_LINK_SHIFT);
                RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
-                        ("Set Network type to AP!\n"));
+                        "Set Network type to AP!\n");
                break;
        default:
                RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                        ("Network type %d not support!\n", type));
+                        "Network type %d not supported!\n", type);
                return 1;
                break;
 
@@ -1202,7 +1197,7 @@ void rtl92se_set_qos(struct ieee80211_hw *hw, int aci)
                rtl_write_dword(rtlpriv, EDCAPARA_VO, 0x2f3222);
                break;
        default:
-               RT_ASSERT(false, ("invalid aci: %d !\n", aci));
+               RT_ASSERT(false, "invalid aci: %d !\n", aci);
                break;
        }
 }
@@ -1219,9 +1214,14 @@ void rtl92se_enable_interrupt(struct ieee80211_hw *hw)
 
 void rtl92se_disable_interrupt(struct ieee80211_hw *hw)
 {
-       struct rtl_priv *rtlpriv = rtl_priv(hw);
-       struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
+       struct rtl_priv *rtlpriv;
+       struct rtl_pci *rtlpci;
 
+       rtlpriv = rtl_priv(hw);
+       /* if firmware not available, no interrupts */
+       if (!rtlpriv || !rtlpriv->max_fw_size)
+               return;
+       rtlpci = rtl_pcidev(rtl_pcipriv(hw));
        rtl_write_dword(rtlpriv, INTA_MASK, 0);
        rtl_write_dword(rtlpriv, INTA_MASK + 4, 0);
 
@@ -1583,8 +1583,8 @@ void rtl92se_update_interrupt_mask(struct ieee80211_hw *hw,
        struct rtl_priv *rtlpriv = rtl_priv(hw);
        struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
 
-       RT_TRACE(rtlpriv, COMP_INTR, DBG_LOUD,
-                ("add_msr:%x, rm_msr:%x\n", add_msr, rm_msr));
+       RT_TRACE(rtlpriv, COMP_INTR, DBG_LOUD, "add_msr:%x, rm_msr:%x\n",
+                add_msr, rm_msr);
 
        if (add_msr)
                rtlpci->irq_mask[0] |= add_msr;
@@ -1627,7 +1627,7 @@ static void _rtl92se_read_adapter_info(struct ieee80211_hw *hw)
 
        if (rtlefuse->epromtype == EEPROM_93C46) {
                RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                        ("RTL819X Not boot from eeprom, check it !!"));
+                        "RTL819X Not boot from eeprom, check it !!\n");
        } else if (rtlefuse->epromtype == EEPROM_BOOT_EFUSE) {
                rtl_efuse_shadow_map_update(hw);
 
@@ -1636,16 +1636,16 @@ static void _rtl92se_read_adapter_info(struct ieee80211_hw *hw)
                        HWSET_MAX_SIZE_92S);
        }
 
-       RT_PRINT_DATA(rtlpriv, COMP_INIT, DBG_DMESG, ("MAP\n"),
+       RT_PRINT_DATA(rtlpriv, COMP_INIT, DBG_DMESG, "MAP",
                      hwinfo, HWSET_MAX_SIZE_92S);
 
        eeprom_id = *((u16 *)&hwinfo[0]);
        if (eeprom_id != RTL8190_EEPROM_ID) {
                RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
-                        ("EEPROM ID(%#x) is invalid!!\n", eeprom_id));
+                        "EEPROM ID(%#x) is invalid!!\n", eeprom_id);
                rtlefuse->autoload_failflag = true;
        } else {
-               RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, ("Autoload OK\n"));
+               RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "Autoload OK\n");
                rtlefuse->autoload_failflag = false;
        }
 
@@ -1663,15 +1663,15 @@ static void _rtl92se_read_adapter_info(struct ieee80211_hw *hw)
        rtlefuse->eeprom_version = *(u16 *)&hwinfo[EEPROM_VERSION];
 
        RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
-                       ("EEPROMId = 0x%4x\n", eeprom_id));
+                "EEPROMId = 0x%4x\n", eeprom_id);
        RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
-                       ("EEPROM VID = 0x%4x\n", rtlefuse->eeprom_vid));
+                "EEPROM VID = 0x%4x\n", rtlefuse->eeprom_vid);
        RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
-                       ("EEPROM DID = 0x%4x\n", rtlefuse->eeprom_did));
+                "EEPROM DID = 0x%4x\n", rtlefuse->eeprom_did);
        RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
-                       ("EEPROM SVID = 0x%4x\n", rtlefuse->eeprom_svid));
+                "EEPROM SVID = 0x%4x\n", rtlefuse->eeprom_svid);
        RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
-                       ("EEPROM SMID = 0x%4x\n", rtlefuse->eeprom_smid));
+                "EEPROM SMID = 0x%4x\n", rtlefuse->eeprom_smid);
 
        for (i = 0; i < 6; i += 2) {
                usvalue = *(u16 *)&hwinfo[EEPROM_MAC_ADDR + i];
@@ -1681,8 +1681,7 @@ static void _rtl92se_read_adapter_info(struct ieee80211_hw *hw)
        for (i = 0; i < 6; i++)
                rtl_write_byte(rtlpriv, MACIDR0 + i, rtlefuse->dev_addr[i]);
 
-       RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
-                ("%pM\n", rtlefuse->dev_addr));
+       RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "%pM\n", rtlefuse->dev_addr);
 
        /* Get Tx Power Level by Channel */
        /* Read Tx power of Channel 1 ~ 14 from EEPROM. */
@@ -1707,23 +1706,24 @@ static void _rtl92se_read_adapter_info(struct ieee80211_hw *hw)
        for (rf_path = 0; rf_path < 2; rf_path++)
                for (i = 0; i < 3; i++)
                        RTPRINT(rtlpriv, FINIT, INIT_EEPROM,
-                               ("RF(%d) EEPROM CCK Area(%d) = 0x%x\n", rf_path,
-                               i, rtlefuse->eeprom_chnlarea_txpwr_cck
-                                       [rf_path][i]));
+                               "RF(%d) EEPROM CCK Area(%d) = 0x%x\n",
+                               rf_path, i,
+                               rtlefuse->eeprom_chnlarea_txpwr_cck
+                               [rf_path][i]);
        for (rf_path = 0; rf_path < 2; rf_path++)
                for (i = 0; i < 3; i++)
                        RTPRINT(rtlpriv, FINIT, INIT_EEPROM,
-                               ("RF(%d) EEPROM HT40 1S Area(%d) = 0x%x\n",
-                                rf_path, i,
-                                rtlefuse->eeprom_chnlarea_txpwr_ht40_1s
-                                               [rf_path][i]));
+                               "RF(%d) EEPROM HT40 1S Area(%d) = 0x%x\n",
+                               rf_path, i,
+                               rtlefuse->eeprom_chnlarea_txpwr_ht40_1s
+                               [rf_path][i]);
        for (rf_path = 0; rf_path < 2; rf_path++)
                for (i = 0; i < 3; i++)
                        RTPRINT(rtlpriv, FINIT, INIT_EEPROM,
-                               ("RF(%d) EEPROM HT40 2S Diff Area(%d) = 0x%x\n",
-                                rf_path, i,
-                                rtlefuse->eeprom_chnlarea_txpwr_ht40_2sdiif
-                                       [rf_path][i]));
+                               "RF(%d) EEPROM HT40 2S Diff Area(%d) = 0x%x\n",
+                               rf_path, i,
+                               rtlefuse->eeprom_chnlarea_txpwr_ht40_2sdiif
+                               [rf_path][i]);
 
        for (rf_path = 0; rf_path < 2; rf_path++) {
 
@@ -1754,11 +1754,11 @@ static void _rtl92se_read_adapter_info(struct ieee80211_hw *hw)
 
                for (i = 0; i < 14; i++) {
                        RTPRINT(rtlpriv, FINIT, INIT_TxPower,
-                               ("RF(%d)-Ch(%d) [CCK / HT40_1S / HT40_2S] = "
-                                "[0x%x / 0x%x / 0x%x]\n", rf_path, i,
-                                rtlefuse->txpwrlevel_cck[rf_path][i],
-                                rtlefuse->txpwrlevel_ht40_1s[rf_path][i],
-                                rtlefuse->txpwrlevel_ht40_2s[rf_path][i]));
+                               "RF(%d)-Ch(%d) [CCK / HT40_1S / HT40_2S] = [0x%x / 0x%x / 0x%x]\n",
+                               rf_path, i,
+                               rtlefuse->txpwrlevel_cck[rf_path][i],
+                               rtlefuse->txpwrlevel_ht40_1s[rf_path][i],
+                               rtlefuse->txpwrlevel_ht40_2s[rf_path][i]);
                }
        }
 
@@ -1791,13 +1791,13 @@ static void _rtl92se_read_adapter_info(struct ieee80211_hw *hw)
                                0xf0) >> 4);
 
                        RTPRINT(rtlpriv, FINIT, INIT_TxPower,
-                               ("RF-%d pwrgroup_ht20[%d] = 0x%x\n",
-                                rf_path, i,
-                                rtlefuse->pwrgroup_ht20[rf_path][i]));
+                               "RF-%d pwrgroup_ht20[%d] = 0x%x\n",
+                               rf_path, i,
+                               rtlefuse->pwrgroup_ht20[rf_path][i]);
                        RTPRINT(rtlpriv, FINIT, INIT_TxPower,
-                               ("RF-%d pwrgroup_ht40[%d] = 0x%x\n",
-                                rf_path, i,
-                                rtlefuse->pwrgroup_ht40[rf_path][i]));
+                               "RF-%d pwrgroup_ht40[%d] = 0x%x\n",
+                               rf_path, i,
+                               rtlefuse->pwrgroup_ht40[rf_path][i]);
                        }
        }
 
@@ -1852,27 +1852,27 @@ static void _rtl92se_read_adapter_info(struct ieee80211_hw *hw)
                                 (hwinfo[EEPROM_REGULATORY] & 0x1);
        }
        RTPRINT(rtlpriv, FINIT, INIT_TxPower,
-               ("eeprom_regulatory = 0x%x\n", rtlefuse->eeprom_regulatory));
+               "eeprom_regulatory = 0x%x\n", rtlefuse->eeprom_regulatory);
 
        for (i = 0; i < 14; i++)
                RTPRINT(rtlpriv, FINIT, INIT_TxPower,
-                       ("RF-A Ht20 to HT40 Diff[%d] = 0x%x\n", i,
-                        rtlefuse->txpwr_ht20diff[RF90_PATH_A][i]));
+                       "RF-A Ht20 to HT40 Diff[%d] = 0x%x\n",
+                       i, rtlefuse->txpwr_ht20diff[RF90_PATH_A][i]);
        for (i = 0; i < 14; i++)
                RTPRINT(rtlpriv, FINIT, INIT_TxPower,
-                       ("RF-A Legacy to Ht40 Diff[%d] = 0x%x\n", i,
-                        rtlefuse->txpwr_legacyhtdiff[RF90_PATH_A][i]));
+                       "RF-A Legacy to Ht40 Diff[%d] = 0x%x\n",
+                       i, rtlefuse->txpwr_legacyhtdiff[RF90_PATH_A][i]);
        for (i = 0; i < 14; i++)
                RTPRINT(rtlpriv, FINIT, INIT_TxPower,
-                       ("RF-B Ht20 to HT40 Diff[%d] = 0x%x\n", i,
-                        rtlefuse->txpwr_ht20diff[RF90_PATH_B][i]));
+                       "RF-B Ht20 to HT40 Diff[%d] = 0x%x\n",
+                       i, rtlefuse->txpwr_ht20diff[RF90_PATH_B][i]);
        for (i = 0; i < 14; i++)
                RTPRINT(rtlpriv, FINIT, INIT_TxPower,
-                       ("RF-B Legacy to HT40 Diff[%d] = 0x%x\n", i,
-                        rtlefuse->txpwr_legacyhtdiff[RF90_PATH_B][i]));
+                       "RF-B Legacy to HT40 Diff[%d] = 0x%x\n",
+                       i, rtlefuse->txpwr_legacyhtdiff[RF90_PATH_B][i]);
 
-       RTPRINT(rtlpriv, FINIT, INIT_TxPower, ("TxPwrSafetyFlag = %d\n",
-               rtlefuse->txpwr_safetyflag));
+       RTPRINT(rtlpriv, FINIT, INIT_TxPower,
+               "TxPwrSafetyFlag = %d\n", rtlefuse->txpwr_safetyflag);
 
        /* Read RF-indication and Tx Power gain
         * index diff of legacy to HT OFDM rate. */
@@ -1881,8 +1881,8 @@ static void _rtl92se_read_adapter_info(struct ieee80211_hw *hw)
        rtlefuse->legacy_httxpowerdiff =
                rtlefuse->txpwr_legacyhtdiff[RF90_PATH_A][0];
 
-       RTPRINT(rtlpriv, FINIT, INIT_TxPower, ("TxPowerDiff = %#x\n",
-               rtlefuse->eeprom_txpowerdiff));
+       RTPRINT(rtlpriv, FINIT, INIT_TxPower,
+               "TxPowerDiff = %#x\n", rtlefuse->eeprom_txpowerdiff);
 
        /* Get TSSI value for each path. */
        usvalue = *(u16 *)&hwinfo[EEPROM_TSSI_A];
@@ -1890,16 +1890,16 @@ static void _rtl92se_read_adapter_info(struct ieee80211_hw *hw)
        usvalue = *(u8 *)&hwinfo[EEPROM_TSSI_B];
        rtlefuse->eeprom_tssi[RF90_PATH_B] = (u8)(usvalue & 0xff);
 
-       RTPRINT(rtlpriv, FINIT, INIT_TxPower, ("TSSI_A = 0x%x, TSSI_B = 0x%x\n",
-                rtlefuse->eeprom_tssi[RF90_PATH_A],
-                rtlefuse->eeprom_tssi[RF90_PATH_B]));
+       RTPRINT(rtlpriv, FINIT, INIT_TxPower, "TSSI_A = 0x%x, TSSI_B = 0x%x\n",
+               rtlefuse->eeprom_tssi[RF90_PATH_A],
+               rtlefuse->eeprom_tssi[RF90_PATH_B]);
 
        /* Read antenna tx power offset of B/C/D to A  from EEPROM */
        /* and read ThermalMeter from EEPROM */
        tempval = *(u8 *)&hwinfo[EEPROM_THERMALMETER];
        rtlefuse->eeprom_thermalmeter = tempval;
-       RTPRINT(rtlpriv, FINIT, INIT_TxPower, ("thermalmeter = 0x%x\n",
-               rtlefuse->eeprom_thermalmeter));
+       RTPRINT(rtlpriv, FINIT, INIT_TxPower,
+               "thermalmeter = 0x%x\n", rtlefuse->eeprom_thermalmeter);
 
        /* ThermalMeter, BIT(0)~3 for RFIC1, BIT(4)~7 for RFIC2 */
        rtlefuse->thermalmeter[0] = (rtlefuse->eeprom_thermalmeter & 0x1f);
@@ -1915,8 +1915,8 @@ static void _rtl92se_read_adapter_info(struct ieee80211_hw *hw)
        /* Version ID, Channel plan */
        rtlefuse->eeprom_channelplan = *(u8 *)&hwinfo[EEPROM_CHANNELPLAN];
        rtlefuse->txpwr_fromeprom = true;
-       RTPRINT(rtlpriv, FINIT, INIT_TxPower, ("EEPROM ChannelPlan = 0x%4x\n",
-               rtlefuse->eeprom_channelplan));
+       RTPRINT(rtlpriv, FINIT, INIT_TxPower,
+               "EEPROM ChannelPlan = 0x%4x\n", rtlefuse->eeprom_channelplan);
 
        /* Read Customer ID or Board Type!!! */
        tempval = *(u8 *)&hwinfo[EEPROM_BOARDTYPE];
@@ -1937,14 +1937,14 @@ static void _rtl92se_read_adapter_info(struct ieee80211_hw *hw)
                if (!(tempval & BIT(0))) {
                        rtlefuse->b1x1_recvcombine = true;
                        RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
-                               ("RF_TYPE=1T2R but only 1SS\n"));
+                                "RF_TYPE=1T2R but only 1SS\n");
                }
        }
        rtlefuse->b1ss_support = rtlefuse->b1x1_recvcombine;
        rtlefuse->eeprom_oemid = *(u8 *)&hwinfo[EEPROM_CUSTOMID];
 
-       RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, ("EEPROM Customer ID: 0x%2x",
-                       rtlefuse->eeprom_oemid));
+       RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "EEPROM Customer ID: 0x%2x",
+                rtlefuse->eeprom_oemid);
 
        /* set channel paln to world wide 13 */
        rtlefuse->channel_plan = COUNTRY_CODE_WORLD_WIDE_13;
@@ -1959,19 +1959,19 @@ void rtl92se_read_eeprom_info(struct ieee80211_hw *hw)
        tmp_u1b = rtl_read_byte(rtlpriv, EPROM_CMD);
 
        if (tmp_u1b & BIT(4)) {
-               RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, ("Boot from EEPROM\n"));
+               RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "Boot from EEPROM\n");
                rtlefuse->epromtype = EEPROM_93C46;
        } else {
-               RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, ("Boot from EFUSE\n"));
+               RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "Boot from EFUSE\n");
                rtlefuse->epromtype = EEPROM_BOOT_EFUSE;
        }
 
        if (tmp_u1b & BIT(5)) {
-               RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, ("Autoload OK\n"));
+               RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "Autoload OK\n");
                rtlefuse->autoload_failflag = false;
                _rtl92se_read_adapter_info(hw);
        } else {
-               RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, ("Autoload ERR!!\n"));
+               RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "Autoload ERR!!\n");
                rtlefuse->autoload_failflag = true;
        }
 }
@@ -2071,8 +2071,8 @@ static void rtl92se_update_hal_rate_table(struct ieee80211_hw *hw,
        else
                rtl92s_phy_set_fw_cmd(hw, FW_CMD_RA_REFRESH_BG);
 
-       RT_TRACE(rtlpriv, COMP_RATR, DBG_DMESG,
-                ("%x\n", rtl_read_dword(rtlpriv, ARFR0)));
+       RT_TRACE(rtlpriv, COMP_RATR, DBG_DMESG, "%x\n",
+                rtl_read_dword(rtlpriv, ARFR0));
 }
 
 static void rtl92se_update_hal_rate_mask(struct ieee80211_hw *hw,
@@ -2224,8 +2224,8 @@ static void rtl92se_update_hal_rate_mask(struct ieee80211_hw *hw,
 
        mask |= (bmulticast ? 1 : 0) << 9 | (macid & 0x1f) << 4 | (band & 0xf);
 
-       RT_TRACE(rtlpriv, COMP_RATR, DBG_TRACE, ("mask = %x, bitmap = %x\n",
-                       mask, ratr_bitmap));
+       RT_TRACE(rtlpriv, COMP_RATR, DBG_TRACE, "mask = %x, bitmap = %x\n",
+                mask, ratr_bitmap);
        rtl_write_dword(rtlpriv, 0x2c4, ratr_bitmap);
        rtl_write_dword(rtlpriv, WFM5, (FW_RA_UPDATE_MASK | (mask << 8)));
 
@@ -2301,14 +2301,14 @@ bool rtl92se_gpio_radio_on_off_checking(struct ieee80211_hw *hw, u8 *valid)
 
        if ((ppsc->hwradiooff) && (rfpwr_toset == ERFON)) {
                RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG,
-                        ("RFKILL-HW Radio ON, RF ON\n"));
+                        "RFKILL-HW Radio ON, RF ON\n");
 
                rfpwr_toset = ERFON;
                ppsc->hwradiooff = false;
                actuallyset = true;
-       } else if ((ppsc->hwradiooff == false) && (rfpwr_toset == ERFOFF)) {
-               RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG,
-                        ("RFKILL-HW Radio OFF, RF OFF\n"));
+       } else if ((!ppsc->hwradiooff) && (rfpwr_toset == ERFOFF)) {
+               RT_TRACE(rtlpriv, COMP_RF,
+                        DBG_DMESG, "RFKILL-HW Radio OFF, RF OFF\n");
 
                rfpwr_toset = ERFOFF;
                ppsc->hwradiooff = true;
@@ -2372,7 +2372,7 @@ void rtl92se_set_key(struct ieee80211_hw *hw, u32 key_index, u8 *p_macaddr,
                u8 cam_offset = 0;
                u8 clear_number = 5;
 
-               RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG, ("clear_all\n"));
+               RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG, "clear_all\n");
 
                for (idx = 0; idx < clear_number; idx++) {
                        rtl_cam_mark_invalid(hw, cam_offset + idx);
@@ -2401,7 +2401,7 @@ void rtl92se_set_key(struct ieee80211_hw *hw, u32 key_index, u8 *p_macaddr,
                        break;
                default:
                        RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                                       ("switch case not process\n"));
+                                "switch case not processed\n");
                        enc_algo = CAM_TKIP;
                        break;
                }
@@ -2419,9 +2419,8 @@ void rtl92se_set_key(struct ieee80211_hw *hw, u32 key_index, u8 *p_macaddr,
                                                                 p_macaddr);
                                        if (entry_id >=  TOTAL_CAM_ENTRY) {
                                                RT_TRACE(rtlpriv,
-                                                  COMP_SEC, DBG_EMERG,
-                                                  ("Can not find free hw"
-                                                  " security cam entry\n"));
+                                                        COMP_SEC, DBG_EMERG,
+                                                        "Can not find free hw security cam entry\n");
                                                return;
                                        }
                                } else {
@@ -2435,30 +2434,31 @@ void rtl92se_set_key(struct ieee80211_hw *hw, u32 key_index, u8 *p_macaddr,
 
                if (rtlpriv->sec.key_len[key_index] == 0) {
                        RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG,
-                                ("delete one entry, entry_id is %d\n",
-                                entry_id));
+                                "delete one entry, entry_id is %d\n",
+                                entry_id);
                        if (mac->opmode == NL80211_IFTYPE_AP)
                                rtl_cam_del_entry(hw, p_macaddr);
                        rtl_cam_delete_one_entry(hw, p_macaddr, entry_id);
                } else {
                        RT_TRACE(rtlpriv, COMP_SEC, DBG_LOUD,
-                                ("The insert KEY length is %d\n",
-                                 rtlpriv->sec.key_len[PAIRWISE_KEYIDX]));
+                                "The insert KEY length is %d\n",
+                                rtlpriv->sec.key_len[PAIRWISE_KEYIDX]);
                        RT_TRACE(rtlpriv, COMP_SEC, DBG_LOUD,
-                                ("The insert KEY  is %x %x\n",
-                                 rtlpriv->sec.key_buf[0][0],
-                                 rtlpriv->sec.key_buf[0][1]));
+                                "The insert KEY is %x %x\n",
+                                rtlpriv->sec.key_buf[0][0],
+                                rtlpriv->sec.key_buf[0][1]);
 
                        RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG,
-                                ("add one entry\n"));
+                                "add one entry\n");
                        if (is_pairwise) {
                                RT_PRINT_DATA(rtlpriv, COMP_SEC, DBG_LOUD,
-                                     "Pairwiase Key content :",
-                                      rtlpriv->sec.pairwise_key,
-                                      rtlpriv->sec.key_len[PAIRWISE_KEYIDX]);
+                                             "Pairwise Key content",
+                                             rtlpriv->sec.pairwise_key,
+                                             rtlpriv->sec.
+                                             key_len[PAIRWISE_KEYIDX]);
 
                                RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG,
-                                        ("set Pairwiase key\n"));
+                                        "set Pairwise key\n");
 
                                rtl_cam_add_one_entry(hw, macaddr, key_index,
                                        entry_id, enc_algo,
@@ -2466,7 +2466,7 @@ void rtl92se_set_key(struct ieee80211_hw *hw, u32 key_index, u8 *p_macaddr,
                                        rtlpriv->sec.key_buf[key_index]);
                        } else {
                                RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG,
-                                        ("set group key\n"));
+                                        "set group key\n");
 
                                if (mac->opmode == NL80211_IFTYPE_ADHOC) {
                                        rtl_cam_add_one_entry(hw,
index 6160a9b..1886c26 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2009-2010  Realtek Corporation.
+ * Copyright(c) 2009-2012  Realtek Corporation.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
index e3fe7c9..44949b5 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2009-2010  Realtek Corporation.
+ * Copyright(c) 2009-2012  Realtek Corporation.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
@@ -52,8 +52,8 @@ void rtl92se_sw_led_on(struct ieee80211_hw *hw, struct rtl_led *pled)
        u8 ledcfg;
        struct rtl_priv *rtlpriv = rtl_priv(hw);
 
-       RT_TRACE(rtlpriv, COMP_LED, DBG_LOUD,
-                ("LedAddr:%X ledpin=%d\n", LEDCFG, pled->ledpin));
+       RT_TRACE(rtlpriv, COMP_LED, DBG_LOUD, "LedAddr:%X ledpin=%d\n",
+                LEDCFG, pled->ledpin);
 
        ledcfg = rtl_read_byte(rtlpriv, LEDCFG);
 
@@ -68,7 +68,7 @@ void rtl92se_sw_led_on(struct ieee80211_hw *hw, struct rtl_led *pled)
                break;
        default:
                RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                        ("switch case not process\n"));
+                        "switch case not processed\n");
                break;
        }
        pled->ledon = true;
@@ -76,12 +76,15 @@ void rtl92se_sw_led_on(struct ieee80211_hw *hw, struct rtl_led *pled)
 
 void rtl92se_sw_led_off(struct ieee80211_hw *hw, struct rtl_led *pled)
 {
-       struct rtl_priv *rtlpriv = rtl_priv(hw);
+       struct rtl_priv *rtlpriv;
        struct rtl_pci_priv *pcipriv = rtl_pcipriv(hw);
        u8 ledcfg;
 
-       RT_TRACE(rtlpriv, COMP_LED, DBG_LOUD,
-                ("LedAddr:%X ledpin=%d\n", LEDCFG, pled->ledpin));
+       rtlpriv = rtl_priv(hw);
+       if (!rtlpriv || rtlpriv->max_fw_size)
+               return;
+       RT_TRACE(rtlpriv, COMP_LED, DBG_LOUD, "LedAddr:%X ledpin=%d\n",
+                LEDCFG, pled->ledpin);
 
        ledcfg = rtl_read_byte(rtlpriv, LEDCFG);
 
@@ -101,7 +104,7 @@ void rtl92se_sw_led_off(struct ieee80211_hw *hw, struct rtl_led *pled)
                break;
        default:
                RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                        ("switch case not process\n"));
+                        "switch case not processed\n");
                break;
        }
        pled->ledon = false;
@@ -141,8 +144,7 @@ void rtl92se_led_control(struct ieee80211_hw *hw, enum led_ctl_mode ledaction)
            ledaction == LED_CTL_POWER_ON)) {
                return;
        }
-       RT_TRACE(rtlpriv, COMP_LED, DBG_LOUD, ("ledaction %d,\n",
-                ledaction));
+       RT_TRACE(rtlpriv, COMP_LED, DBG_LOUD, "ledaction %d\n", ledaction);
 
        _rtl92se_sw_led_control(hw, ledaction);
 }
index 8cce387..2182dbe 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2009-2010  Realtek Corporation.
+ * Copyright(c) 2009-2012  Realtek Corporation.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
index f10ac1a..4a49992 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2009-2010  Realtek Corporation.
+ * Copyright(c) 2009-2012  Realtek Corporation.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
@@ -27,8 +27,6 @@
  *
  *****************************************************************************/
 
-#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
-
 #include "../wifi.h"
 #include "../pci.h"
 #include "../ps.h"
@@ -58,16 +56,15 @@ u32 rtl92s_phy_query_bb_reg(struct ieee80211_hw *hw, u32 regaddr, u32 bitmask)
        struct rtl_priv *rtlpriv = rtl_priv(hw);
        u32 returnvalue = 0, originalvalue, bitshift;
 
-       RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, ("regaddr(%#x), bitmask(%#x)\n",
-                       regaddr, bitmask));
+       RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, "regaddr(%#x), bitmask(%#x)\n",
+                regaddr, bitmask);
 
        originalvalue = rtl_read_dword(rtlpriv, regaddr);
        bitshift = _rtl92s_phy_calculate_bit_shift(bitmask);
        returnvalue = (originalvalue & bitmask) >> bitshift;
 
-       RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
-                ("BBR MASK=0x%x Addr[0x%x]=0x%x\n",
-                bitmask, regaddr, originalvalue));
+       RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, "BBR MASK=0x%x Addr[0x%x]=0x%x\n",
+                bitmask, regaddr, originalvalue);
 
        return returnvalue;
 
@@ -79,8 +76,9 @@ void rtl92s_phy_set_bb_reg(struct ieee80211_hw *hw, u32 regaddr, u32 bitmask,
        struct rtl_priv *rtlpriv = rtl_priv(hw);
        u32 originalvalue, bitshift;
 
-       RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, ("regaddr(%#x), bitmask(%#x),"
-                       " data(%#x)\n", regaddr, bitmask, data));
+       RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
+                "regaddr(%#x), bitmask(%#x), data(%#x)\n",
+                regaddr, bitmask, data);
 
        if (bitmask != MASKDWORD) {
                originalvalue = rtl_read_dword(rtlpriv, regaddr);
@@ -90,8 +88,9 @@ void rtl92s_phy_set_bb_reg(struct ieee80211_hw *hw, u32 regaddr, u32 bitmask,
 
        rtl_write_dword(rtlpriv, regaddr, data);
 
-       RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, ("regaddr(%#x), bitmask(%#x),"
-                       " data(%#x)\n", regaddr, bitmask, data));
+       RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
+                "regaddr(%#x), bitmask(%#x), data(%#x)\n",
+                regaddr, bitmask, data);
 
 }
 
@@ -149,8 +148,8 @@ static u32 _rtl92s_phy_rf_serial_read(struct ieee80211_hw *hw,
        retvalue = rtl_get_bbreg(hw, pphyreg->rflssi_readback,
                                 BLSSI_READBACK_DATA);
 
-       RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, ("RFR-%d Addr[0x%x]=0x%x\n",
-                rfpath, pphyreg->rflssi_readback, retvalue));
+       RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, "RFR-%d Addr[0x%x]=0x%x\n",
+                rfpath, pphyreg->rflssi_readback, retvalue);
 
        return retvalue;
 
@@ -172,8 +171,8 @@ static void _rtl92s_phy_rf_serial_write(struct ieee80211_hw *hw,
        data_and_addr = ((newoffset << 20) | (data & 0x000fffff)) & 0x0fffffff;
        rtl_set_bbreg(hw, pphyreg->rf3wire_offset, MASKDWORD, data_and_addr);
 
-       RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, ("RFW-%d Addr[0x%x]=0x%x\n",
-                rfpath, pphyreg->rf3wire_offset, data_and_addr));
+       RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, "RFW-%d Addr[0x%x]=0x%x\n",
+                rfpath, pphyreg->rf3wire_offset, data_and_addr);
 }
 
 
@@ -183,8 +182,9 @@ u32 rtl92s_phy_query_rf_reg(struct ieee80211_hw *hw, enum radio_path rfpath,
        struct rtl_priv *rtlpriv = rtl_priv(hw);
        u32 original_value, readback_value, bitshift;
 
-       RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, ("regaddr(%#x), rfpath(%#x), "
-                "bitmask(%#x)\n", regaddr, rfpath, bitmask));
+       RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
+                "regaddr(%#x), rfpath(%#x), bitmask(%#x)\n",
+                regaddr, rfpath, bitmask);
 
        spin_lock(&rtlpriv->locks.rf_lock);
 
@@ -195,9 +195,9 @@ u32 rtl92s_phy_query_rf_reg(struct ieee80211_hw *hw, enum radio_path rfpath,
 
        spin_unlock(&rtlpriv->locks.rf_lock);
 
-       RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, ("regaddr(%#x), rfpath(%#x), "
-                "bitmask(%#x), original_value(%#x)\n", regaddr, rfpath,
-                bitmask, original_value));
+       RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
+                "regaddr(%#x), rfpath(%#x), bitmask(%#x), original_value(%#x)\n",
+                regaddr, rfpath, bitmask, original_value);
 
        return readback_value;
 }
@@ -212,8 +212,9 @@ void rtl92s_phy_set_rf_reg(struct ieee80211_hw *hw, enum radio_path rfpath,
        if (!((rtlphy->rf_pathmap >> rfpath) & 0x1))
                return;
 
-       RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, ("regaddr(%#x), bitmask(%#x),"
-                " data(%#x), rfpath(%#x)\n", regaddr, bitmask, data, rfpath));
+       RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
+                "regaddr(%#x), bitmask(%#x), data(%#x), rfpath(%#x)\n",
+                regaddr, bitmask, data, rfpath);
 
        spin_lock(&rtlpriv->locks.rf_lock);
 
@@ -228,8 +229,9 @@ void rtl92s_phy_set_rf_reg(struct ieee80211_hw *hw, enum radio_path rfpath,
 
        spin_unlock(&rtlpriv->locks.rf_lock);
 
-       RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, ("regaddr(%#x), bitmask(%#x), "
-                "data(%#x), rfpath(%#x)\n", regaddr, bitmask, data, rfpath));
+       RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
+                "regaddr(%#x), bitmask(%#x), data(%#x), rfpath(%#x)\n",
+                regaddr, bitmask, data, rfpath);
 
 }
 
@@ -249,7 +251,7 @@ void rtl92s_phy_scan_operation_backup(struct ieee80211_hw *hw,
                        break;
                default:
                        RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                                ("Unknown operation.\n"));
+                                "Unknown operation\n");
                        break;
                }
        }
@@ -264,9 +266,9 @@ void rtl92s_phy_set_bw_mode(struct ieee80211_hw *hw,
        struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
        u8 reg_bw_opmode;
 
-       RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE, ("Switch to %s bandwidth\n",
-                 rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20 ?
-                 "20MHz" : "40MHz"));
+       RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE, "Switch to %s bandwidth\n",
+                rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20 ?
+                "20MHz" : "40MHz");
 
        if (rtlphy->set_bwmode_inprogress)
                return;
@@ -290,8 +292,7 @@ void rtl92s_phy_set_bw_mode(struct ieee80211_hw *hw,
                break;
        default:
                RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                        ("unknown bandwidth: %#X\n",
-                        rtlphy->current_chan_bw));
+                        "unknown bandwidth: %#X\n", rtlphy->current_chan_bw);
                break;
        }
 
@@ -316,13 +317,13 @@ void rtl92s_phy_set_bw_mode(struct ieee80211_hw *hw,
                break;
        default:
                RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                        ("unknown bandwidth: %#X\n", rtlphy->current_chan_bw));
+                        "unknown bandwidth: %#X\n", rtlphy->current_chan_bw);
                break;
        }
 
        rtl92s_phy_rf6052_set_bandwidth(hw, rtlphy->current_chan_bw);
        rtlphy->set_bwmode_inprogress = false;
-       RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE, ("<==\n"));
+       RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE, "<==\n");
 }
 
 static bool _rtl92s_phy_set_sw_chnl_cmdarray(struct swchnlcmd *cmdtable,
@@ -332,7 +333,7 @@ static bool _rtl92s_phy_set_sw_chnl_cmdarray(struct swchnlcmd *cmdtable,
        struct swchnlcmd *pcmd;
 
        if (cmdtable == NULL) {
-               RT_ASSERT(false, ("cmdtable cannot be NULL.\n"));
+               RT_ASSERT(false, "cmdtable cannot be NULL\n");
                return false;
        }
 
@@ -377,7 +378,7 @@ static bool _rtl92s_phy_sw_chnl_step_by_step(struct ieee80211_hw *hw,
        rfdependcmdcnt = 0;
 
        RT_ASSERT((channel >= 1 && channel <= 14),
-                 ("illegal channel for Zebra: %d\n", channel));
+                 "invalid channel for Zebra: %d\n", channel);
 
        _rtl92s_phy_set_sw_chnl_cmdarray(rfdependcmd, rfdependcmdcnt++,
                                         MAX_RFDEPENDCMD_CNT, CMDID_RF_WRITEREG,
@@ -438,7 +439,7 @@ static bool _rtl92s_phy_sw_chnl_step_by_step(struct ieee80211_hw *hw,
                        break;
                default:
                        RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                                ("switch case not process\n"));
+                                "switch case not processed\n");
                        break;
                }
 
@@ -458,9 +459,8 @@ u8 rtl92s_phy_sw_chnl(struct ieee80211_hw *hw)
        u32 delay;
        bool ret;
 
-       RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE,
-                ("switch to channel%d\n",
-                rtlphy->current_channel));
+       RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE, "switch to channel%d\n",
+                rtlphy->current_channel);
 
        if (rtlphy->sw_chnl_inprogress)
                return 0;
@@ -496,7 +496,7 @@ u8 rtl92s_phy_sw_chnl(struct ieee80211_hw *hw)
 
        rtlphy->sw_chnl_inprogress = false;
 
-       RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE, ("<==\n"));
+       RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE, "<==\n");
 
        return 1;
 }
@@ -556,20 +556,19 @@ bool rtl92s_phy_set_rf_power_state(struct ieee80211_hw *hw,
                                do {
                                        InitializeCount++;
                                        RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG,
-                                                ("IPS Set eRf nic enable\n"));
+                                                "IPS Set eRf nic enable\n");
                                        rtstatus = rtl_ps_enable_nic(hw);
-                               } while ((rtstatus != true) &&
-                                        (InitializeCount < 10));
+                               } while (!rtstatus && (InitializeCount < 10));
 
                                RT_CLEAR_PS_LEVEL(ppsc,
                                                  RT_RF_OFF_LEVL_HALT_NIC);
                        } else {
                                RT_TRACE(rtlpriv, COMP_POWER, DBG_DMESG,
-                                        ("awake, sleeped:%d ms "
-                                       "state_inap:%x\n",
-                                       jiffies_to_msecs(jiffies -
-                                       ppsc->last_sleep_jiffies),
-                                       rtlpriv->psc.state_inap));
+                                        "awake, sleeped:%d ms state_inap:%x\n",
+                                        jiffies_to_msecs(jiffies -
+                                                         ppsc->
+                                                         last_sleep_jiffies),
+                                        rtlpriv->psc.state_inap);
                                ppsc->last_awake_jiffies = jiffies;
                                rtl_write_word(rtlpriv, CMDR, 0x37FC);
                                rtl_write_byte(rtlpriv, TXPAUSE, 0x00);
@@ -587,7 +586,7 @@ bool rtl92s_phy_set_rf_power_state(struct ieee80211_hw *hw,
        case ERFOFF:{
                        if (ppsc->reg_rfps_level & RT_RF_OFF_LEVL_HALT_NIC) {
                                RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG,
-                                        ("IPS Set eRf nic disable\n"));
+                                        "IPS Set eRf nic disable\n");
                                rtl_ps_disable_nic(hw);
                                RT_SET_PS_LEVEL(ppsc, RT_RF_OFF_LEVL_HALT_NIC);
                        } else {
@@ -613,11 +612,9 @@ bool rtl92s_phy_set_rf_power_state(struct ieee80211_hw *hw,
                                        continue;
                                } else {
                                        RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
-                                                ("eRf Off/Sleep: "
-                                                "%d times TcbBusyQueue[%d] = "
-                                                "%d before doze!\n",
-                                                (i + 1), queue_id,
-                                                skb_queue_len(&ring->queue)));
+                                                "eRf Off/Sleep: %d times TcbBusyQueue[%d] = %d before doze!\n",
+                                                i + 1, queue_id,
+                                                skb_queue_len(&ring->queue));
 
                                        udelay(10);
                                        i++;
@@ -625,31 +622,30 @@ bool rtl92s_phy_set_rf_power_state(struct ieee80211_hw *hw,
 
                                if (i >= MAX_DOZE_WAITING_TIMES_9x) {
                                        RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
-                                                ("\nERFOFF: %d times"
-                                                "TcbBusyQueue[%d] = %d !\n",
+                                                "ERFOFF: %d times TcbBusyQueue[%d] = %d !\n",
                                                 MAX_DOZE_WAITING_TIMES_9x,
                                                 queue_id,
-                                                skb_queue_len(&ring->queue)));
+                                                skb_queue_len(&ring->queue));
                                        break;
                                }
                        }
 
                        RT_TRACE(rtlpriv, COMP_POWER, DBG_DMESG,
-                                ("Set ERFSLEEP awaked:%d ms\n",
+                                "Set ERFSLEEP awaked:%d ms\n",
                                 jiffies_to_msecs(jiffies -
-                                ppsc->last_awake_jiffies)));
+                                                 ppsc->last_awake_jiffies));
 
                        RT_TRACE(rtlpriv, COMP_POWER, DBG_DMESG,
-                                ("sleep awaked:%d ms "
-                               "state_inap:%x\n", jiffies_to_msecs(jiffies -
-                               ppsc->last_awake_jiffies),
-                               rtlpriv->psc.state_inap));
+                                "sleep awaked:%d ms state_inap:%x\n",
+                                jiffies_to_msecs(jiffies -
+                                                 ppsc->last_awake_jiffies),
+                                rtlpriv->psc.state_inap);
                        ppsc->last_sleep_jiffies = jiffies;
                        _rtl92se_phy_set_rf_sleep(hw);
            break;
        default:
                RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                        ("switch case not process\n"));
+                        "switch case not processed\n");
                bresult = false;
                break;
        }
@@ -681,30 +677,28 @@ static void _rtl92s_store_pwrindex_diffrate_offset(struct ieee80211_hw *hw,
 {
        struct rtl_priv *rtlpriv = rtl_priv(hw);
        struct rtl_phy *rtlphy = &(rtlpriv->phy);
+       int index;
 
        if (reg_addr == RTXAGC_RATE18_06)
-               rtlphy->mcs_txpwrlevel_origoffset[rtlphy->pwrgroup_cnt][0] =
-                                                                        data;
-       if (reg_addr == RTXAGC_RATE54_24)
-               rtlphy->mcs_txpwrlevel_origoffset[rtlphy->pwrgroup_cnt][1] =
-                                                                        data;
-       if (reg_addr == RTXAGC_CCK_MCS32)
-               rtlphy->mcs_txpwrlevel_origoffset[rtlphy->pwrgroup_cnt][6] =
-                                                                        data;
-       if (reg_addr == RTXAGC_MCS03_MCS00)
-               rtlphy->mcs_txpwrlevel_origoffset[rtlphy->pwrgroup_cnt][2] =
-                                                                        data;
-       if (reg_addr == RTXAGC_MCS07_MCS04)
-               rtlphy->mcs_txpwrlevel_origoffset[rtlphy->pwrgroup_cnt][3] =
-                                                                        data;
-       if (reg_addr == RTXAGC_MCS11_MCS08)
-               rtlphy->mcs_txpwrlevel_origoffset[rtlphy->pwrgroup_cnt][4] =
-                                                                        data;
-       if (reg_addr == RTXAGC_MCS15_MCS12) {
-               rtlphy->mcs_txpwrlevel_origoffset[rtlphy->pwrgroup_cnt][5] =
-                                                                        data;
+               index = 0;
+       else if (reg_addr == RTXAGC_RATE54_24)
+               index = 1;
+       else if (reg_addr == RTXAGC_CCK_MCS32)
+               index = 6;
+       else if (reg_addr == RTXAGC_MCS03_MCS00)
+               index = 2;
+       else if (reg_addr == RTXAGC_MCS07_MCS04)
+               index = 3;
+       else if (reg_addr == RTXAGC_MCS11_MCS08)
+               index = 4;
+       else if (reg_addr == RTXAGC_MCS15_MCS12)
+               index = 5;
+       else
+               return;
+
+       rtlphy->mcs_txpwrlevel_origoffset[rtlphy->pwrgroup_cnt][index] = data;
+       if (index == 5)
                rtlphy->pwrgroup_cnt++;
-       }
 }
 
 static void _rtl92s_phy_init_register_definition(struct ieee80211_hw *hw)
@@ -993,9 +987,9 @@ static bool _rtl92s_phy_bb_config_parafile(struct ieee80211_hw *hw)
                rtstatus = false;
        }
 
-       if (rtstatus != true) {
+       if (!rtstatus) {
                RT_TRACE(rtlpriv, COMP_INIT, DBG_EMERG,
-                        ("Write BB Reg Fail!!"));
+                        "Write BB Reg Fail!!\n");
                goto phy_BB8190_Config_ParaFile_Fail;
        }
 
@@ -1007,17 +1001,16 @@ static bool _rtl92s_phy_bb_config_parafile(struct ieee80211_hw *hw)
                rtstatus = _rtl92s_phy_config_bb_with_pg(hw,
                                                 BASEBAND_CONFIG_PHY_REG);
        }
-       if (rtstatus != true) {
+       if (!rtstatus) {
                RT_TRACE(rtlpriv, COMP_INIT, DBG_EMERG,
-                        ("_rtl92s_phy_bb_config_parafile(): "
-                        "BB_PG Reg Fail!!"));
+                        "_rtl92s_phy_bb_config_parafile(): BB_PG Reg Fail!!\n");
                goto phy_BB8190_Config_ParaFile_Fail;
        }
 
        /* 3. BB AGC table Initialization */
        rtstatus = _rtl92s_phy_config_bb(hw, BASEBAND_CONFIG_AGC_TAB);
 
-       if (rtstatus != true) {
+       if (!rtstatus) {
                pr_err("%s(): AGC Table Fail\n", __func__);
                goto phy_BB8190_Config_ParaFile_Fail;
        }
@@ -1053,7 +1046,7 @@ u8 rtl92s_phy_config_rf(struct ieee80211_hw *hw, enum radio_path rfpath)
                radio_b_tblen = RADIOB_ARRAYLENGTH;
        }
 
-       RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, ("Radio No %x\n", rfpath));
+       RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "Radio No %x\n", rfpath);
        rtstatus = true;
 
        switch (rfpath) {
@@ -1175,11 +1168,11 @@ bool rtl92s_phy_bb_config(struct ieee80211_hw *hw)
            (rtlphy->rf_type == RF_2T2R && rf_num != 2) ||
            (rtlphy->rf_type == RF_2T2R_GREEN && rf_num != 2)) {
                RT_TRACE(rtlpriv, COMP_INIT, DBG_EMERG,
-                        ("RF_Type(%x) does not match "
-                        "RF_Num(%x)!!\n", rtlphy->rf_type, rf_num));
+                        "RF_Type(%x) does not match RF_Num(%x)!!\n",
+                        rtlphy->rf_type, rf_num);
                RT_TRACE(rtlpriv, COMP_INIT, DBG_EMERG,
-                        ("path1 0x%x, path2 0x%x, pathmap "
-                         "0x%x\n", path1, path2, pathmap));
+                        "path1 0x%x, path2 0x%x, pathmap 0x%x\n",
+                        path1, path2, pathmap);
        }
 
        return rtstatus;
@@ -1214,20 +1207,20 @@ void rtl92s_phy_get_hw_reg_originalvalue(struct ieee80211_hw *hw)
                        ROFDM0_XCAGCCORE1, MASKBYTE0);
        rtlphy->default_initialgain[3] = rtl_get_bbreg(hw,
                        ROFDM0_XDAGCCORE1, MASKBYTE0);
-       RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, ("Default initial gain "
-                "(c50=0x%x, c58=0x%x, c60=0x%x, c68=0x%x)\n",
+       RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
+                "Default initial gain (c50=0x%x, c58=0x%x, c60=0x%x, c68=0x%x)\n",
                 rtlphy->default_initialgain[0],
                 rtlphy->default_initialgain[1],
                 rtlphy->default_initialgain[2],
-                rtlphy->default_initialgain[3]));
+                rtlphy->default_initialgain[3]);
 
        /* read framesync */
        rtlphy->framesync = rtl_get_bbreg(hw, ROFDM0_RXDETECTOR3, MASKBYTE0);
        rtlphy->framesync_c34 = rtl_get_bbreg(hw, ROFDM0_RXDETECTOR2,
                                              MASKDWORD);
        RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
-                ("Default framesync (0x%x) = 0x%x\n",
-                ROFDM0_RXDETECTOR3, rtlphy->framesync));
+                "Default framesync (0x%x) = 0x%x\n",
+                ROFDM0_RXDETECTOR3, rtlphy->framesync);
 
 }
 
@@ -1274,7 +1267,7 @@ void rtl92s_phy_set_txpower(struct ieee80211_hw *hw, u8   channel)
        /* [0]:RF-A, [1]:RF-B */
        u8 cckpowerlevel[2], ofdmpowerLevel[2];
 
-       if (rtlefuse->txpwr_fromeprom == false)
+       if (!rtlefuse->txpwr_fromeprom)
                return;
 
        /* Mainly we use RF-A Tx Power to write the Tx Power registers,
@@ -1287,10 +1280,9 @@ void rtl92s_phy_set_txpower(struct ieee80211_hw *hw, u8  channel)
                        &ofdmpowerLevel[0]);
 
        RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
-                       ("Channel-%d, cckPowerLevel (A / B) = "
-                       "0x%x / 0x%x,   ofdmPowerLevel (A / B) = 0x%x / 0x%x\n",
-                       channel, cckpowerlevel[0], cckpowerlevel[1],
-                       ofdmpowerLevel[0], ofdmpowerLevel[1]));
+                "Channel-%d, cckPowerLevel (A / B) = 0x%x / 0x%x, ofdmPowerLevel (A / B) = 0x%x / 0x%x\n",
+                channel, cckpowerlevel[0], cckpowerlevel[1],
+                ofdmpowerLevel[0], ofdmpowerLevel[1]);
 
        _rtl92s_phy_ccxpower_indexcheck(hw, channel, &cckpowerlevel[0],
                        &ofdmpowerLevel[0]);
@@ -1316,7 +1308,7 @@ void rtl92s_phy_chk_fwcmd_iodone(struct ieee80211_hw *hw)
        } while (--pollingcnt);
 
        if (pollingcnt == 0)
-               RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, ("Set FW Cmd fail!!\n"));
+               RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "Set FW Cmd fail!!\n");
 }
 
 
@@ -1345,20 +1337,17 @@ static void _rtl92s_phy_set_fwcmd_io(struct ieee80211_hw *hw)
 
        switch (rtlhal->current_fwcmd_io) {
        case FW_CMD_RA_RESET:
-               RT_TRACE(rtlpriv, COMP_CMD, DBG_DMESG,
-                        ("FW_CMD_RA_RESET\n"));
+               RT_TRACE(rtlpriv, COMP_CMD, DBG_DMESG, "FW_CMD_RA_RESET\n");
                rtl_write_dword(rtlpriv, WFM5, FW_RA_RESET);
                rtl92s_phy_chk_fwcmd_iodone(hw);
                break;
        case FW_CMD_RA_ACTIVE:
-               RT_TRACE(rtlpriv, COMP_CMD, DBG_DMESG,
-                        ("FW_CMD_RA_ACTIVE\n"));
+               RT_TRACE(rtlpriv, COMP_CMD, DBG_DMESG, "FW_CMD_RA_ACTIVE\n");
                rtl_write_dword(rtlpriv, WFM5, FW_RA_ACTIVE);
                rtl92s_phy_chk_fwcmd_iodone(hw);
                break;
        case FW_CMD_RA_REFRESH_N:
-               RT_TRACE(rtlpriv, COMP_CMD, DBG_DMESG,
-                        ("FW_CMD_RA_REFRESH_N\n"));
+               RT_TRACE(rtlpriv, COMP_CMD, DBG_DMESG, "FW_CMD_RA_REFRESH_N\n");
                input = FW_RA_REFRESH;
                rtl_write_dword(rtlpriv, WFM5, input);
                rtl92s_phy_chk_fwcmd_iodone(hw);
@@ -1367,7 +1356,7 @@ static void _rtl92s_phy_set_fwcmd_io(struct ieee80211_hw *hw)
                break;
        case FW_CMD_RA_REFRESH_BG:
                RT_TRACE(rtlpriv, COMP_CMD, DBG_DMESG,
-                        ("FW_CMD_RA_REFRESH_BG\n"));
+                        "FW_CMD_RA_REFRESH_BG\n");
                rtl_write_dword(rtlpriv, WFM5, FW_RA_REFRESH);
                rtl92s_phy_chk_fwcmd_iodone(hw);
                rtl_write_dword(rtlpriv, WFM5, FW_RA_DISABLE_RSSI_MASK);
@@ -1375,21 +1364,20 @@ static void _rtl92s_phy_set_fwcmd_io(struct ieee80211_hw *hw)
                break;
        case FW_CMD_RA_REFRESH_N_COMB:
                RT_TRACE(rtlpriv, COMP_CMD, DBG_DMESG,
-                        ("FW_CMD_RA_REFRESH_N_COMB\n"));
+                        "FW_CMD_RA_REFRESH_N_COMB\n");
                input = FW_RA_IOT_N_COMB;
                rtl_write_dword(rtlpriv, WFM5, input);
                rtl92s_phy_chk_fwcmd_iodone(hw);
                break;
        case FW_CMD_RA_REFRESH_BG_COMB:
                RT_TRACE(rtlpriv, COMP_CMD, DBG_DMESG,
-                        ("FW_CMD_RA_REFRESH_BG_COMB\n"));
+                        "FW_CMD_RA_REFRESH_BG_COMB\n");
                input = FW_RA_IOT_BG_COMB;
                rtl_write_dword(rtlpriv, WFM5, input);
                rtl92s_phy_chk_fwcmd_iodone(hw);
                break;
        case FW_CMD_IQK_ENABLE:
-               RT_TRACE(rtlpriv, COMP_CMD, DBG_DMESG,
-                        ("FW_CMD_IQK_ENABLE\n"));
+               RT_TRACE(rtlpriv, COMP_CMD, DBG_DMESG, "FW_CMD_IQK_ENABLE\n");
                rtl_write_dword(rtlpriv, WFM5, FW_IQK_ENABLE);
                rtl92s_phy_chk_fwcmd_iodone(hw);
                break;
@@ -1424,8 +1412,7 @@ static void _rtl92s_phy_set_fwcmd_io(struct ieee80211_hw *hw)
                rtl_set_bbreg(hw, RCCK0_CCA, MASKBYTE2, 0xcd);
                break;
        case FW_CMD_LPS_ENTER:
-               RT_TRACE(rtlpriv, COMP_CMD, DBG_DMESG,
-                        ("FW_CMD_LPS_ENTER\n"));
+               RT_TRACE(rtlpriv, COMP_CMD, DBG_DMESG, "FW_CMD_LPS_ENTER\n");
                current_aid = rtlpriv->mac80211.assoc_id;
                rtl_write_dword(rtlpriv, WFM5, (FW_LPS_ENTER |
                                ((current_aid | 0xc000) << 8)));
@@ -1434,20 +1421,18 @@ static void _rtl92s_phy_set_fwcmd_io(struct ieee80211_hw *hw)
                 * turbo mode until driver leave LPS */
                break;
        case FW_CMD_LPS_LEAVE:
-               RT_TRACE(rtlpriv, COMP_CMD, DBG_DMESG,
-                        ("FW_CMD_LPS_LEAVE\n"));
+               RT_TRACE(rtlpriv, COMP_CMD, DBG_DMESG, "FW_CMD_LPS_LEAVE\n");
                rtl_write_dword(rtlpriv, WFM5, FW_LPS_LEAVE);
                rtl92s_phy_chk_fwcmd_iodone(hw);
                break;
        case FW_CMD_ADD_A2_ENTRY:
-               RT_TRACE(rtlpriv, COMP_CMD, DBG_DMESG,
-                        ("FW_CMD_ADD_A2_ENTRY\n"));
+               RT_TRACE(rtlpriv, COMP_CMD, DBG_DMESG, "FW_CMD_ADD_A2_ENTRY\n");
                rtl_write_dword(rtlpriv, WFM5, FW_ADD_A2_ENTRY);
                rtl92s_phy_chk_fwcmd_iodone(hw);
                break;
        case FW_CMD_CTRL_DM_BY_DRIVER:
                RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD,
-                        ("FW_CMD_CTRL_DM_BY_DRIVER\n"));
+                        "FW_CMD_CTRL_DM_BY_DRIVER\n");
                rtl_write_dword(rtlpriv, WFM5, FW_CTRL_DM_BY_DRIVER);
                rtl92s_phy_chk_fwcmd_iodone(hw);
                break;
@@ -1472,8 +1457,8 @@ bool rtl92s_phy_set_fw_cmd(struct ieee80211_hw *hw, enum fwcmd_iotype fw_cmdio)
        bool bPostProcessing = false;
 
        RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD,
-                       ("Set FW Cmd(%#x), set_fwcmd_inprogress(%d)\n",
-                       fw_cmdio, rtlhal->set_fwcmd_inprogress));
+                "Set FW Cmd(%#x), set_fwcmd_inprogress(%d)\n",
+                fw_cmdio, rtlhal->set_fwcmd_inprogress);
 
        do {
                /* We re-map to combined FW CMD ones if firmware version */
@@ -1501,7 +1486,7 @@ bool rtl92s_phy_set_fw_cmd(struct ieee80211_hw *hw, enum fwcmd_iotype fw_cmdio)
                 * DM map table in the future. */
                switch (fw_cmdio) {
                case FW_CMD_RA_INIT:
-                       RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, ("RA init!!\n"));
+                       RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, "RA init!!\n");
                        fw_cmdmap |= FW_RA_INIT_CTL;
                        FW_CMD_IO_SET(rtlpriv, fw_cmdmap);
                        /* Clear control flag to sync with FW. */
@@ -1509,7 +1494,7 @@ bool rtl92s_phy_set_fw_cmd(struct ieee80211_hw *hw, enum fwcmd_iotype fw_cmdio)
                        break;
                case FW_CMD_DIG_DISABLE:
                        RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD,
-                                ("Set DIG disable!!\n"));
+                                "Set DIG disable!!\n");
                        fw_cmdmap &= ~FW_DIG_ENABLE_CTL;
                        FW_CMD_IO_SET(rtlpriv, fw_cmdmap);
                        break;
@@ -1517,14 +1502,14 @@ bool rtl92s_phy_set_fw_cmd(struct ieee80211_hw *hw, enum fwcmd_iotype fw_cmdio)
                case FW_CMD_DIG_RESUME:
                        if (!(rtlpriv->dm.dm_flag & HAL_DM_DIG_DISABLE)) {
                                RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD,
-                                       ("Set DIG enable or resume!!\n"));
+                                        "Set DIG enable or resume!!\n");
                                fw_cmdmap |= (FW_DIG_ENABLE_CTL | FW_SS_CTL);
                                FW_CMD_IO_SET(rtlpriv, fw_cmdmap);
                        }
                        break;
                case FW_CMD_DIG_HALT:
                        RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD,
-                                ("Set DIG halt!!\n"));
+                                "Set DIG halt!!\n");
                        fw_cmdmap &= ~(FW_DIG_ENABLE_CTL | FW_SS_CTL);
                        FW_CMD_IO_SET(rtlpriv, fw_cmdmap);
                        break;
@@ -1540,9 +1525,8 @@ bool rtl92s_phy_set_fw_cmd(struct ieee80211_hw *hw, enum fwcmd_iotype fw_cmdio)
                                     (rtlefuse->thermalmeter[0] << 16));
 
                        RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD,
-                                ("Set TxPwr tracking!! "
-                                "FwCmdMap(%#x), FwParam(%#x)\n",
-                                fw_cmdmap, fw_param));
+                                "Set TxPwr tracking!! FwCmdMap(%#x), FwParam(%#x)\n",
+                                fw_cmdmap, fw_param);
 
                        FW_CMD_PARA_SET(rtlpriv, fw_param);
                        FW_CMD_IO_SET(rtlpriv, fw_cmdmap);
@@ -1563,9 +1547,8 @@ bool rtl92s_phy_set_fw_cmd(struct ieee80211_hw *hw, enum fwcmd_iotype fw_cmdio)
                        fw_param &= FW_RA_PARAM_CLR;
 
                        RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD,
-                                ("[FW CMD] [New Version] "
-                                "Set RA/IOT Comb in n mode!! FwCmdMap(%#x), "
-                                "FwParam(%#x)\n", fw_cmdmap, fw_param));
+                                "[FW CMD] [New Version] Set RA/IOT Comb in n mode!! FwCmdMap(%#x), FwParam(%#x)\n",
+                                fw_cmdmap, fw_param);
 
                        FW_CMD_PARA_SET(rtlpriv, fw_param);
                        FW_CMD_IO_SET(rtlpriv, fw_cmdmap);
@@ -1635,7 +1618,7 @@ bool rtl92s_phy_set_fw_cmd(struct ieee80211_hw *hw, enum fwcmd_iotype fw_cmdio)
                        break;
                case FW_CMD_HIGH_PWR_ENABLE:
                        if (!(rtlpriv->dm.dm_flag & HAL_DM_HIPWR_DISABLE) &&
-                               (rtlpriv->dm.dynamic_txpower_enable != true)) {
+                           !rtlpriv->dm.dynamic_txpower_enable) {
                                fw_cmdmap |= (FW_HIGH_PWR_ENABLE_CTL |
                                              FW_SS_CTL);
                                FW_CMD_IO_SET(rtlpriv, fw_cmdmap);
@@ -1652,7 +1635,7 @@ bool rtl92s_phy_set_fw_cmd(struct ieee80211_hw *hw, enum fwcmd_iotype fw_cmdio)
                        break;
                case FW_CMD_PAPE_CONTROL:
                        RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD,
-                                ("[FW CMD] Set PAPE Control\n"));
+                                "[FW CMD] Set PAPE Control\n");
                        fw_cmdmap &= ~FW_PAPE_CTL_BY_SW_HW;
 
                        FW_CMD_IO_SET(rtlpriv, fw_cmdmap);
index 37e504a..ac03877 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2009-2010  Realtek Corporation.
+ * Copyright(c) 2009-2012  Realtek Corporation.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
index 11f125c..84d1181 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2009-2010  Realtek Corporation.
+ * Copyright(c) 2009-2012  Realtek Corporation.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
index 0ad50fe..08c2f56 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2009-2010  Realtek Corporation.
+ * Copyright(c) 2009-2012  Realtek Corporation.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
@@ -27,8 +27,6 @@
  *
  *****************************************************************************/
 
-#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
-
 #include "../wifi.h"
 #include "reg.h"
 #include "def.h"
@@ -123,13 +121,13 @@ static void _rtl92s_get_powerbase(struct ieee80211_hw *hw, u8 *p_pwrlevel,
        }
 
        if (rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20_40) {
-               RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD, ("40MHz finalpwr_idx "
-                       "(A / B) = 0x%x / 0x%x\n", p_final_pwridx[0],
-                       p_final_pwridx[1]));
+               RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
+                        "40MHz finalpwr_idx (A / B) = 0x%x / 0x%x\n",
+                        p_final_pwridx[0], p_final_pwridx[1]);
        } else {
-               RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD, ("20MHz finalpwr_idx "
-                       "(A / B) = 0x%x / 0x%x\n", p_final_pwridx[0],
-                        p_final_pwridx[1]));
+               RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
+                        "20MHz finalpwr_idx (A / B) = 0x%x / 0x%x\n",
+                        p_final_pwridx[0], p_final_pwridx[1]);
        }
 }
 
@@ -153,9 +151,8 @@ static void _rtl92s_set_antennadiff(struct ieee80211_hw *hw,
                        ant_pwr_diff = -8;
 
                RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
-                        ("Antenna Diff from RF-B "
-                       "to RF-A = %d (0x%x)\n", ant_pwr_diff,
-                        ant_pwr_diff & 0xf));
+                        "Antenna Diff from RF-B to RF-A = %d (0x%x)\n",
+                        ant_pwr_diff, ant_pwr_diff & 0xf);
 
                ant_pwr_diff &= 0xf;
        }
@@ -172,9 +169,8 @@ static void _rtl92s_set_antennadiff(struct ieee80211_hw *hw,
        rtl_set_bbreg(hw, RFPGA0_TXGAINSTAGE, (BXBTXAGC | BXCTXAGC | BXDTXAGC),
                      u4reg_val);
 
-       RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
-                ("Write BCD-Diff(0x%x) = 0x%x\n",
-                RFPGA0_TXGAINSTAGE, u4reg_val));
+       RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD, "Write BCD-Diff(0x%x) = 0x%x\n",
+                RFPGA0_TXGAINSTAGE, u4reg_val);
 }
 
 static void _rtl92s_get_txpower_writeval_byregulatory(struct ieee80211_hw *hw,
@@ -201,8 +197,7 @@ static void _rtl92s_get_txpower_writeval_byregulatory(struct ieee80211_hw *hw,
                                ((index < 2) ? pwrbase0 : pwrbase1);
 
                RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
-                        ("RTK better performance, "
-                        "writeval = 0x%x\n", writeval));
+                        "RTK better performance, writeval = 0x%x\n", writeval);
                break;
        case 1:
                /* Realtek regulatory increase power diff defined
@@ -211,8 +206,8 @@ static void _rtl92s_get_txpower_writeval_byregulatory(struct ieee80211_hw *hw,
                        writeval = ((index < 2) ? pwrbase0 : pwrbase1);
 
                        RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
-                                ("Realtek regulatory, "
-                                "40MHz, writeval = 0x%x\n", writeval));
+                                "Realtek regulatory, 40MHz, writeval = 0x%x\n",
+                                writeval);
                } else {
                        if (rtlphy->pwrgroup_cnt == 1)
                                chnlgroup = 0;
@@ -234,16 +229,15 @@ static void _rtl92s_get_txpower_writeval_byregulatory(struct ieee80211_hw *hw,
                                        pwrbase0 : pwrbase1);
 
                        RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
-                                ("Realtek regulatory, "
-                                "20MHz, writeval = 0x%x\n", writeval));
+                                "Realtek regulatory, 20MHz, writeval = 0x%x\n",
+                                writeval);
                }
                break;
        case 2:
                /* Better regulatory don't increase any power diff */
                writeval = ((index < 2) ? pwrbase0 : pwrbase1);
                RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
-                        ("Better regulatory, "
-                        "writeval = 0x%x\n", writeval));
+                        "Better regulatory, writeval = 0x%x\n", writeval);
                break;
        case 3:
                /* Customer defined power diff. increase power diff
@@ -252,14 +246,14 @@ static void _rtl92s_get_txpower_writeval_byregulatory(struct ieee80211_hw *hw,
 
                if (rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20_40) {
                        RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
-                               ("customer's limit, 40MHz = 0x%x\n",
-                               rtlefuse->pwrgroup_ht40
-                               [RF90_PATH_A][chnl - 1]));
+                                "customer's limit, 40MHz = 0x%x\n",
+                                rtlefuse->pwrgroup_ht40
+                                [RF90_PATH_A][chnl - 1]);
                } else {
                        RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
-                               ("customer's limit, 20MHz = 0x%x\n",
-                               rtlefuse->pwrgroup_ht20
-                               [RF90_PATH_A][chnl - 1]));
+                                "customer's limit, 20MHz = 0x%x\n",
+                                rtlefuse->pwrgroup_ht20
+                                [RF90_PATH_A][chnl - 1]);
                }
 
                for (i = 0; i < 4; i++) {
@@ -293,22 +287,19 @@ static void _rtl92s_get_txpower_writeval_byregulatory(struct ieee80211_hw *hw,
                                (pwrdiff_limit[1] << 8) |
                                (pwrdiff_limit[0]);
                RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
-                        ("Customer's limit = 0x%x\n",
-                        customer_limit));
+                        "Customer's limit = 0x%x\n", customer_limit);
 
                writeval = customer_limit + ((index < 2) ?
                                             pwrbase0 : pwrbase1);
                RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
-                        ("Customer, writeval = "
-                        "0x%x\n", writeval));
+                        "Customer, writeval = 0x%x\n", writeval);
                break;
        default:
                chnlgroup = 0;
                writeval = rtlphy->mcs_txpwrlevel_origoffset[chnlgroup][index] +
                                ((index < 2) ? pwrbase0 : pwrbase1);
                RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
-                        ("RTK better performance, "
-                        "writeval = 0x%x\n", writeval));
+                        "RTK better performance, writeval = 0x%x\n", writeval);
                break;
        }
 
@@ -508,7 +499,7 @@ bool rtl92s_phy_rf6052_config(struct ieee80211_hw *hw)
                        break;
                }
 
-               if (rtstatus != true) {
+               if (!rtstatus) {
                        pr_err("Radio[%d] Fail!!\n", rfpath);
                        goto fail;
                }
@@ -541,8 +532,7 @@ void rtl92s_phy_rf6052_set_bandwidth(struct ieee80211_hw *hw, u8 bandwidth)
                break;
        default:
                RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                        ("unknown bandwidth: %#X\n",
-                        bandwidth));
+                        "unknown bandwidth: %#X\n", bandwidth);
                break;
        }
 }
index 3843baa..8a29eb9 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2009-2010  Realtek Corporation.
+ * Copyright(c) 2009-2012  Realtek Corporation.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
index 78723cf..f1b3600 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2009-2010  Realtek Corporation.
+ * Copyright(c) 2009-2012  Realtek Corporation.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
  *
  *****************************************************************************/
 
-#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
-
-#include <linux/vmalloc.h>
-#include <linux/module.h>
-
 #include "../wifi.h"
 #include "../core.h"
 #include "../pci.h"
+#include "../base.h"
+#include "../pci.h"
 #include "reg.h"
 #include "def.h"
 #include "phy.h"
@@ -45,6 +42,8 @@
 #include "trx.h"
 #include "led.h"
 
+#include <linux/module.h>
+
 static void rtl92s_init_aspm_vars(struct ieee80211_hw *hw)
 {
        struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
@@ -89,12 +88,54 @@ static void rtl92s_init_aspm_vars(struct ieee80211_hw *hw)
        rtlpci->const_support_pciaspm = 2;
 }
 
+static void rtl92se_fw_cb(const struct firmware *firmware, void *context)
+{
+       struct ieee80211_hw *hw = context;
+       struct rtl_pci_priv *pcipriv = rtl_pcipriv(hw);
+       struct rtl_priv *rtlpriv = rtl_priv(hw);
+       struct rtl_pci *rtlpci = rtl_pcidev(pcipriv);
+       struct rt_firmware *pfirmware = NULL;
+       int err;
+
+       RT_TRACE(rtlpriv, COMP_ERR, DBG_LOUD,
+                        "Firmware callback routine entered!\n");
+       complete(&rtlpriv->firmware_loading_complete);
+       if (!firmware) {
+               pr_err("Firmware %s not available\n", rtlpriv->cfg->fw_name);
+               rtlpriv->max_fw_size = 0;
+               return;
+       }
+       if (firmware->size > rtlpriv->max_fw_size) {
+               RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
+                        "Firmware is too big!\n");
+               rtlpriv->max_fw_size = 0;
+               release_firmware(firmware);
+               return;
+       }
+       pfirmware = (struct rt_firmware *)rtlpriv->rtlhal.pfirmware;
+       memcpy(pfirmware->sz_fw_tmpbuffer, firmware->data, firmware->size);
+       pfirmware->sz_fw_tmpbufferlen = firmware->size;
+       release_firmware(firmware);
+
+       err = ieee80211_register_hw(hw);
+       if (err) {
+               RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
+                        "Can't register mac80211 hw\n");
+               return;
+       } else {
+               rtlpriv->mac80211.mac80211_registered = 1;
+       }
+       rtlpci->irq_alloc = 1;
+       set_bit(RTL_STATUS_INTERFACE_START, &rtlpriv->status);
+
+       /*init rfkill */
+       rtl_init_rfkill(hw);
+}
+
 static int rtl92s_init_sw_vars(struct ieee80211_hw *hw)
 {
        struct rtl_priv *rtlpriv = rtl_priv(hw);
        struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
-       const struct firmware *firmware;
-       struct rt_firmware *pfirmware = NULL;
        int err = 0;
        u16 earlyrxthreshold = 7;
 
@@ -168,9 +209,9 @@ static int rtl92s_init_sw_vars(struct ieee80211_hw *hw)
        rtlpriv->psc.swctrl_lps = rtlpriv->cfg->mod_params->swctrl_lps;
        rtlpriv->psc.fwctrl_lps = rtlpriv->cfg->mod_params->fwctrl_lps;
        if (!rtlpriv->psc.inactiveps)
-               pr_info("rtl8192ce: Power Save off (module option)\n");
+               pr_info("Power Save off (module option)\n");
        if (!rtlpriv->psc.fwctrl_lps)
-               pr_info("rtl8192ce: FW Power Save off (module option)\n");
+               pr_info("FW Power Save off (module option)\n");
        rtlpriv->psc.reg_fwctrl_lps = 3;
        rtlpriv->psc.reg_max_lps_awakeintvl = 5;
        /* for ASPM, you can close aspm through
@@ -186,33 +227,22 @@ static int rtl92s_init_sw_vars(struct ieee80211_hw *hw)
 
        /* for firmware buf */
        rtlpriv->rtlhal.pfirmware = vzalloc(sizeof(struct rt_firmware));
-       if (!rtlpriv->rtlhal.pfirmware) {
-               RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                        ("Can't alloc buffer for fw.\n"));
+       if (!rtlpriv->rtlhal.pfirmware)
                return 1;
-       }
+
+       rtlpriv->max_fw_size = RTL8190_MAX_RAW_FIRMWARE_CODE_SIZE;
 
        pr_info("Driver for Realtek RTL8192SE/RTL8191SE\n"
                "Loading firmware %s\n", rtlpriv->cfg->fw_name);
        /* request fw */
-       err = request_firmware(&firmware, rtlpriv->cfg->fw_name,
-                       rtlpriv->io.dev);
+       err = request_firmware_nowait(THIS_MODULE, 1, rtlpriv->cfg->fw_name,
+                                     rtlpriv->io.dev, GFP_KERNEL, hw,
+                                     rtl92se_fw_cb);
        if (err) {
                RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                        ("Failed to request firmware!\n"));
+                        "Failed to request firmware!\n");
                return 1;
        }
-       if (firmware->size > sizeof(struct rt_firmware)) {
-               RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                        ("Firmware is too big!\n"));
-               release_firmware(firmware);
-               return 1;
-       }
-
-       pfirmware = (struct rt_firmware *)rtlpriv->rtlhal.pfirmware;
-       memcpy(pfirmware->sz_fw_tmpbuffer, firmware->data, firmware->size);
-       pfirmware->sz_fw_tmpbufferlen = firmware->size;
-       release_firmware(firmware);
 
        return err;
 }
@@ -426,7 +456,7 @@ static int __init rtl92se_module_init(void)
 
        ret = pci_register_driver(&rtl92se_driver);
        if (ret)
-               RT_ASSERT(false, (": No device found\n"));
+               RT_ASSERT(false, "No device found\n");
 
        return ret;
 }
index fc4eb28..2eb8886 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2009-2010  Realtek Corporation.
+ * Copyright(c) 2009-2012  Realtek Corporation.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
index 154185b..f1a73f7 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2009-2010  Realtek Corporation.
+ * Copyright(c) 2009-2012  Realtek Corporation.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
index b4ed6d9..2feb73b 100644 (file)
@@ -1,5 +1,5 @@
 /******************************************************************************
- * Copyright(c) 2008 - 2010 Realtek Corporation. All rights reserved.
+ * Copyright(c) 2008 - 2012 Realtek Corporation. All rights reserved.
  *
  * This program is distributed in the hope that it will be useful, but WITHOUT
  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
index fbebe3e..2fd3d13 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2009-2010  Realtek Corporation.
+ * Copyright(c) 2009-2012  Realtek Corporation.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
@@ -756,7 +756,7 @@ void rtl92se_tx_fill_desc(struct ieee80211_hw *hw,
        /* DOWRD 8 */
        SET_TX_DESC_TX_BUFFER_ADDRESS(pdesc, cpu_to_le32(mapping));
 
-       RT_TRACE(rtlpriv, COMP_SEND, DBG_TRACE, ("\n"));
+       RT_TRACE(rtlpriv, COMP_SEND, DBG_TRACE, "\n");
 }
 
 void rtl92se_tx_fill_cmddesc(struct ieee80211_hw *hw, u8 *pdesc,
@@ -823,8 +823,8 @@ void rtl92se_set_desc(u8 *pdesc, bool istx, u8 desc_name, u8 *val)
                        SET_TX_DESC_NEXT_DESC_ADDRESS(pdesc, *(u32 *) val);
                        break;
                default:
-                       RT_ASSERT(false, ("ERR txdesc :%d not process\n",
-                                 desc_name));
+                       RT_ASSERT(false, "ERR txdesc :%d not process\n",
+                                 desc_name);
                        break;
                }
        } else {
@@ -843,8 +843,8 @@ void rtl92se_set_desc(u8 *pdesc, bool istx, u8 desc_name, u8 *val)
                        SET_RX_STATUS_DESC_EOR(pdesc, 1);
                        break;
                default:
-                       RT_ASSERT(false, ("ERR rxdesc :%d not process\n",
-                                 desc_name));
+                       RT_ASSERT(false, "ERR rxdesc :%d not process\n",
+                                 desc_name);
                        break;
                }
        }
@@ -863,8 +863,8 @@ u32 rtl92se_get_desc(u8 *desc, bool istx, u8 desc_name)
                        ret = GET_TX_DESC_TX_BUFFER_ADDRESS(desc);
                        break;
                default:
-                       RT_ASSERT(false, ("ERR txdesc :%d not process\n",
-                                 desc_name));
+                       RT_ASSERT(false, "ERR txdesc :%d not process\n",
+                                 desc_name);
                        break;
                }
        } else {
@@ -876,8 +876,8 @@ u32 rtl92se_get_desc(u8 *desc, bool istx, u8 desc_name)
                        ret = GET_RX_STATUS_DESC_PKT_LEN(desc);
                        break;
                default:
-                       RT_ASSERT(false, ("ERR rxdesc :%d not process\n",
-                                 desc_name));
+                       RT_ASSERT(false, "ERR rxdesc :%d not process\n",
+                                 desc_name);
                        break;
                }
        }
index 05862c5..011e7b0 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2009-2010  Realtek Corporation.
+ * Copyright(c) 2009-2012  Realtek Corporation.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
index e956fa7..ffcf89f 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2009-2011  Realtek Corporation. All rights reserved.
+ * Copyright(c) 2009-2012  Realtek Corporation. All rights reserved.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
  *
  *****************************************************************************/
 
-#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
-
-#include <linux/usb.h>
-#include <linux/export.h>
-#include "core.h"
 #include "wifi.h"
+#include "core.h"
 #include "usb.h"
 #include "base.h"
 #include "ps.h"
 #include "rtl8192c/fw_common.h"
+#include <linux/export.h>
 
 #define        REALTEK_USB_VENQT_READ                  0xC0
 #define        REALTEK_USB_VENQT_WRITE                 0x40
@@ -276,14 +273,14 @@ static int _rtl_usb_init_tx(struct ieee80211_hw *hw)
                                                    ? USB_HIGH_SPEED_BULK_SIZE
                                                    : USB_FULL_SPEED_BULK_SIZE;
 
-       RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, ("USB Max Bulk-out Size=%d\n",
-                rtlusb->max_bulk_out_size));
+       RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "USB Max Bulk-out Size=%d\n",
+                rtlusb->max_bulk_out_size);
 
        for (i = 0; i < __RTL_TXQ_NUM; i++) {
                u32 ep_num = rtlusb->ep_map.ep_mapping[i];
                if (!ep_num) {
                        RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
-                                ("Invalid endpoint map setting!\n"));
+                                "Invalid endpoint map setting!\n");
                        return -EINVAL;
                }
        }
@@ -345,9 +342,9 @@ static int _rtl_usb_init(struct ieee80211_hw *hw)
                        rtlusb->out_ep_nums++;
 
                RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
-                        ("USB EP(0x%02x), MaxPacketSize=%d ,Interval=%d.\n",
+                        "USB EP(0x%02x), MaxPacketSize=%d, Interval=%d\n",
                         pep_desc->bEndpointAddress, pep_desc->wMaxPacketSize,
-                        pep_desc->bInterval));
+                        pep_desc->bInterval);
        }
        if (rtlusb->in_ep_nums <  rtlpriv->cfg->usb_interface_cfg->in_ep_num)
                return -EINVAL ;
@@ -414,7 +411,7 @@ static struct sk_buff *_rtl_prep_rx_urb(struct ieee80211_hw *hw,
                               gfp_mask);
        if (!skb) {
                RT_TRACE(rtlpriv, COMP_USB, DBG_EMERG,
-                        ("Failed to __dev_alloc_skb!!\n"))
+                        "Failed to __dev_alloc_skb!!\n");
                return ERR_PTR(-ENOMEM);
        }
 
@@ -520,12 +517,14 @@ static void _rtl_usb_rx_process_noagg(struct ieee80211_hw *hw,
                        u8 *pdata;
 
                        uskb = dev_alloc_skb(skb->len + 128);
-                       memcpy(IEEE80211_SKB_RXCB(uskb), &rx_status,
-                              sizeof(rx_status));
-                       pdata = (u8 *)skb_put(uskb, skb->len);
-                       memcpy(pdata, skb->data, skb->len);
+                       if (uskb) {     /* drop packet on allocation failure */
+                               memcpy(IEEE80211_SKB_RXCB(uskb), &rx_status,
+                                      sizeof(rx_status));
+                               pdata = (u8 *)skb_put(uskb, skb->len);
+                               memcpy(pdata, skb->data, skb->len);
+                               ieee80211_rx_irqsafe(hw, uskb);
+                       }
                        dev_kfree_skb_any(skb);
-                       ieee80211_rx_irqsafe(hw, uskb);
                } else {
                        dev_kfree_skb_any(skb);
                }
@@ -575,7 +574,7 @@ static void _rtl_rx_completed(struct urb *_urb)
                        if (IS_ERR(_skb)) {
                                err = PTR_ERR(_skb);
                                RT_TRACE(rtlpriv, COMP_USB, DBG_EMERG,
-                                       ("Can't allocate skb for bulk IN!\n"));
+                                        "Can't allocate skb for bulk IN!\n");
                                return;
                        }
                        skb = _skb;
@@ -632,14 +631,14 @@ static int _rtl_usb_receive(struct ieee80211_hw *hw)
                urb = usb_alloc_urb(0, GFP_KERNEL);
                if (!urb) {
                        RT_TRACE(rtlpriv, COMP_USB, DBG_EMERG,
-                                ("Failed to alloc URB!!\n"))
+                                "Failed to alloc URB!!\n");
                        goto err_out;
                }
 
                skb = _rtl_prep_rx_urb(hw, rtlusb, urb, GFP_KERNEL);
                if (IS_ERR(skb)) {
                        RT_TRACE(rtlpriv, COMP_USB, DBG_EMERG,
-                                ("Failed to prep_rx_urb!!\n"))
+                                "Failed to prep_rx_urb!!\n");
                        err = PTR_ERR(skb);
                        goto err_out;
                }
@@ -665,15 +664,17 @@ static int rtl_usb_start(struct ieee80211_hw *hw)
        struct rtl_usb *rtlusb = rtl_usbdev(rtl_usbpriv(hw));
 
        err = rtlpriv->cfg->ops->hw_init(hw);
-       rtl_init_rx_config(hw);
+       if (!err) {
+               rtl_init_rx_config(hw);
 
-       /* Enable software */
-       SET_USB_START(rtlusb);
-       /* should after adapter start and interrupt enable. */
-       set_hal_start(rtlhal);
+               /* Enable software */
+               SET_USB_START(rtlusb);
+               /* should after adapter start and interrupt enable. */
+               set_hal_start(rtlhal);
 
-       /* Start bulk IN */
-       _rtl_usb_receive(hw);
+               /* Start bulk IN */
+               _rtl_usb_receive(hw);
+       }
 
        return err;
 }
@@ -745,7 +746,7 @@ static void _rtl_submit_tx_urb(struct ieee80211_hw *hw, struct urb *_urb)
                struct sk_buff *skb;
 
                RT_TRACE(rtlpriv, COMP_USB, DBG_EMERG,
-                        ("Failed to submit urb.\n"));
+                        "Failed to submit urb\n");
                usb_unanchor_urb(_urb);
                skb = (struct sk_buff *)_urb->context;
                kfree_skb(skb);
@@ -768,7 +769,7 @@ static int _usb_tx_post(struct ieee80211_hw *hw, struct urb *urb,
 
        if (urb->status) {
                RT_TRACE(rtlpriv, COMP_USB, DBG_EMERG,
-                        ("Urb has error status 0x%X\n", urb->status));
+                        "Urb has error status 0x%X\n", urb->status);
                goto out;
        }
        /*  TODO:       statistics */
@@ -805,7 +806,7 @@ static struct urb *_rtl_usb_tx_urb_setup(struct ieee80211_hw *hw,
        _urb = usb_alloc_urb(0, GFP_ATOMIC);
        if (!_urb) {
                RT_TRACE(rtlpriv, COMP_USB, DBG_EMERG,
-                        ("Can't allocate URB for bulk out!\n"));
+                        "Can't allocate URB for bulk out!\n");
                kfree_skb(skb);
                return NULL;
        }
@@ -830,7 +831,7 @@ static void _rtl_usb_transmit(struct ieee80211_hw *hw, struct sk_buff *skb,
        WARN_ON(NULL == rtlusb->usb_tx_aggregate_hdl);
        if (unlikely(IS_USB_STOP(rtlusb))) {
                RT_TRACE(rtlpriv, COMP_USB, DBG_EMERG,
-                        ("USB device is stopping...\n"));
+                        "USB device is stopping...\n");
                kfree_skb(skb);
                return;
        }
@@ -840,7 +841,7 @@ static void _rtl_usb_transmit(struct ieee80211_hw *hw, struct sk_buff *skb,
        _urb = _rtl_usb_tx_urb_setup(hw, _skb, ep_num);
        if (unlikely(!_urb)) {
                RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                        ("Can't allocate urb. Drop skb!\n"));
+                        "Can't allocate urb. Drop skb!\n");
                return;
        }
        urb_list = &rtlusb->tx_pending[ep_num];
@@ -865,7 +866,7 @@ static void _rtl_usb_tx_preprocess(struct ieee80211_hw *hw, struct sk_buff *skb,
 
        memset(&tcb_desc, 0, sizeof(struct rtl_tcb_desc));
        if (ieee80211_is_auth(fc)) {
-               RT_TRACE(rtlpriv, COMP_SEND, DBG_DMESG, ("MAC80211_LINKING\n"));
+               RT_TRACE(rtlpriv, COMP_SEND, DBG_DMESG, "MAC80211_LINKING\n");
                rtl_ips_nic_on(hw);
        }
 
@@ -946,10 +947,11 @@ int __devinit rtl_usb_probe(struct usb_interface *intf,
        hw = ieee80211_alloc_hw(sizeof(struct rtl_priv) +
                                sizeof(struct rtl_usb_priv), &rtl_ops);
        if (!hw) {
-               RT_ASSERT(false, ("%s : ieee80211 alloc failed\n", __func__));
+               RT_ASSERT(false, "ieee80211 alloc failed\n");
                return -ENOMEM;
        }
        rtlpriv = hw->priv;
+       init_completion(&rtlpriv->firmware_loading_complete);
        SET_IEEE80211_DEV(hw, &intf->dev);
        udev = interface_to_usbdev(intf);
        usb_get_dev(udev);
@@ -969,8 +971,7 @@ int __devinit rtl_usb_probe(struct usb_interface *intf,
        /*like read eeprom and so on */
        rtlpriv->cfg->ops->read_eeprom_info(hw);
        if (rtlpriv->cfg->ops->init_sw_vars(hw)) {
-               RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                        ("Can't init_sw_vars.\n"));
+               RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "Can't init_sw_vars\n");
                goto error_out;
        }
        rtlpriv->cfg->ops->init_sw_leds(hw);
@@ -980,28 +981,16 @@ int __devinit rtl_usb_probe(struct usb_interface *intf,
        err = rtl_init_core(hw);
        if (err) {
                RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                        ("Can't allocate sw for mac80211.\n"));
+                        "Can't allocate sw for mac80211\n");
                goto error_out;
        }
 
-       /*init rfkill */
-       /* rtl_init_rfkill(hw); */
-
-       err = ieee80211_register_hw(hw);
-       if (err) {
-               RT_TRACE(rtlpriv, COMP_INIT, DBG_EMERG,
-                        ("Can't register mac80211 hw.\n"));
-               goto error_out;
-       } else {
-               rtlpriv->mac80211.mac80211_registered = 1;
-       }
-       set_bit(RTL_STATUS_INTERFACE_START, &rtlpriv->status);
        return 0;
 error_out:
        rtl_deinit_core(hw);
        _rtl_usb_io_handler_release(hw);
-       ieee80211_free_hw(hw);
        usb_put_dev(udev);
+       complete(&rtlpriv->firmware_loading_complete);
        return -ENODEV;
 }
 EXPORT_SYMBOL(rtl_usb_probe);
@@ -1015,6 +1004,9 @@ void rtl_usb_disconnect(struct usb_interface *intf)
 
        if (unlikely(!rtlpriv))
                return;
+
+       /* just in case driver is removed before firmware callback */
+       wait_for_completion(&rtlpriv->firmware_loading_complete);
        /*ieee80211_unregister_hw will call ops_stop */
        if (rtlmac->mac80211_registered == 1) {
                ieee80211_unregister_hw(hw);
index d2a63fb..43846b3 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2009-2011  Realtek Corporation. All rights reserved.
+ * Copyright(c) 2009-2012  Realtek Corporation. All rights reserved.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
@@ -28,7 +28,6 @@
 #ifndef __RTL_USB_H__
 #define __RTL_USB_H__
 
-#include <linux/usb.h>
 #include <linux/skbuff.h>
 
 #define RTL_RX_DESC_SIZE               24
index cdaf142..b591614 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2009-2010  Realtek Corporation.
+ * Copyright(c) 2009-2012  Realtek Corporation.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
 #ifndef __RTL_WIFI_H__
 #define __RTL_WIFI_H__
 
+#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
+
 #include <linux/sched.h>
 #include <linux/firmware.h>
 #include <linux/etherdevice.h>
 #include <linux/vmalloc.h>
 #include <linux/usb.h>
 #include <net/mac80211.h>
+#include <linux/completion.h>
 #include "debug.h"
 
 #define RF_CHANGE_BY_INIT                      0
@@ -1045,7 +1048,6 @@ struct rtl_hal {
        u16 fw_subversion;
        bool h2c_setinprogress;
        u8 last_hmeboxnum;
-       bool fw_ready;
        /*Reserve page start offset except beacon in TxQ. */
        u8 fw_rsvdpage_startoffset;
        u8 h2c_txcmd_seq;
@@ -1591,6 +1593,7 @@ struct rtl_debug {
 };
 
 struct rtl_priv {
+       struct completion firmware_loading_complete;
        struct rtl_locks locks;
        struct rtl_works works;
        struct rtl_mac mac80211;
@@ -1612,6 +1615,7 @@ struct rtl_priv {
        struct rtl_rate_priv *rate_priv;
 
        struct rtl_debug dbg;
+       int max_fw_size;
 
        /*
         *hal_cfg : for diff cards
index 58b4f93..a5c6328 100644 (file)
@@ -6,3 +6,5 @@ wl1251_sdio-objs        += sdio.o
 obj-$(CONFIG_WL1251)           += wl1251.o
 obj-$(CONFIG_WL1251_SPI)       += wl1251_spi.o
 obj-$(CONFIG_WL1251_SDIO)      += wl1251_sdio.o
+
+ccflags-y += -D__CHECK_ENDIAN__
index d729daf..a2e5241 100644 (file)
@@ -464,8 +464,6 @@ static int wl1251_boot_upload_nvs(struct wl1251 *wl)
                val = (nvs_ptr[0] | (nvs_ptr[1] << 8)
                       | (nvs_ptr[2] << 16) | (nvs_ptr[3] << 24));
 
-               val = cpu_to_le32(val);
-
                wl1251_debug(DEBUG_BOOT,
                             "nvs write table 0x%x: 0x%x",
                             nvs_start, val);
index c545e9d..d382877 100644 (file)
 
 static inline u32 wl1251_read32(struct wl1251 *wl, int addr)
 {
-       u32 response;
-
-       wl->if_ops->read(wl, addr, &response, sizeof(u32));
+       wl->if_ops->read(wl, addr, &wl->buffer_32, sizeof(wl->buffer_32));
 
-       return response;
+       return le32_to_cpu(wl->buffer_32);
 }
 
 static inline void wl1251_write32(struct wl1251 *wl, int addr, u32 val)
 {
-       wl->if_ops->write(wl, addr, &val, sizeof(u32));
+       wl->buffer_32 = cpu_to_le32(val);
+       wl->if_ops->write(wl, addr, &wl->buffer_32, sizeof(wl->buffer_32));
 }
 
 static inline u32 wl1251_read_elp(struct wl1251 *wl, int addr)
index ba3268e..41302c7 100644 (file)
@@ -514,6 +514,9 @@ static int wl1251_op_add_interface(struct ieee80211_hw *hw,
        struct wl1251 *wl = hw->priv;
        int ret = 0;
 
+       vif->driver_flags |= IEEE80211_VIF_BEACON_FILTER |
+                            IEEE80211_VIF_SUPPORTS_CQM_RSSI;
+
        wl1251_debug(DEBUG_MAC80211, "mac80211 add interface type %d mac %pM",
                     vif->type, vif->addr);
 
@@ -1338,9 +1341,7 @@ int wl1251_init_ieee80211(struct wl1251 *wl)
 
        wl->hw->flags = IEEE80211_HW_SIGNAL_DBM |
                IEEE80211_HW_SUPPORTS_PS |
-               IEEE80211_HW_BEACON_FILTER |
-               IEEE80211_HW_SUPPORTS_UAPSD |
-               IEEE80211_HW_SUPPORTS_CQM_RSSI;
+               IEEE80211_HW_SUPPORTS_UAPSD;
 
        wl->hw->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) |
                                         BIT(NL80211_IFTYPE_ADHOC);
index a77f1bb..9d8f581 100644 (file)
@@ -380,7 +380,7 @@ struct wl1251 {
        struct wl1251_stats stats;
        struct wl1251_debugfs debugfs;
 
-       u32 buffer_32;
+       __le32 buffer_32;
        u32 buffer_cmd;
        u8 buffer_busyword[WL1251_BUSY_WORD_LEN];
        struct wl1251_rx_descriptor *rx_descriptor;
index fe67262..98f289c 100644 (file)
@@ -11,3 +11,5 @@ obj-$(CONFIG_WL12XX_SDIO)             += wl12xx_sdio.o
 
 # small builtin driver bit
 obj-$(CONFIG_WL12XX_PLATFORM_DATA)     += wl12xx_platform_data.o
+
+ccflags-y += -D__CHECK_ENDIAN__
index 7537c40..bc96db0 100644 (file)
 #include "reg.h"
 #include "ps.h"
 
-int wl1271_acx_wake_up_conditions(struct wl1271 *wl, struct wl12xx_vif *wlvif)
+int wl1271_acx_wake_up_conditions(struct wl1271 *wl, struct wl12xx_vif *wlvif,
+                                 u8 wake_up_event, u8 listen_interval)
 {
        struct acx_wake_up_condition *wake_up;
        int ret;
 
-       wl1271_debug(DEBUG_ACX, "acx wake up conditions");
+       wl1271_debug(DEBUG_ACX, "acx wake up conditions (wake_up_event %d listen_interval %d)",
+                    wake_up_event, listen_interval);
 
        wake_up = kzalloc(sizeof(*wake_up), GFP_KERNEL);
        if (!wake_up) {
@@ -48,8 +50,8 @@ int wl1271_acx_wake_up_conditions(struct wl1271 *wl, struct wl12xx_vif *wlvif)
        }
 
        wake_up->role_id = wlvif->role_id;
-       wake_up->wake_up_event = wl->conf.conn.wake_up_event;
-       wake_up->listen_interval = wl->conf.conn.listen_interval;
+       wake_up->wake_up_event = wake_up_event;
+       wake_up->listen_interval = listen_interval;
 
        ret = wl1271_cmd_configure(wl, ACX_WAKE_UP_CONDITIONS,
                                   wake_up, sizeof(*wake_up));
@@ -1459,9 +1461,10 @@ out:
        return ret;
 }
 
-int wl1271_acx_tsf_info(struct wl1271 *wl, u64 *mactime)
+int wl12xx_acx_tsf_info(struct wl1271 *wl, struct wl12xx_vif *wlvif,
+                       u64 *mactime)
 {
-       struct wl1271_acx_fw_tsf_information *tsf_info;
+       struct wl12xx_acx_fw_tsf_information *tsf_info;
        int ret;
 
        tsf_info = kzalloc(sizeof(*tsf_info), GFP_KERNEL);
@@ -1470,6 +1473,8 @@ int wl1271_acx_tsf_info(struct wl1271 *wl, u64 *mactime)
                goto out;
        }
 
+       tsf_info->role_id = wlvif->role_id;
+
        ret = wl1271_cmd_interrogate(wl, ACX_TSF_INFO,
                                     tsf_info, sizeof(*tsf_info));
        if (ret < 0) {
index 69892b4..a28fc04 100644 (file)
@@ -995,15 +995,17 @@ struct wl1271_acx_ba_receiver_setup {
        u8 padding[2];
 } __packed;
 
-struct wl1271_acx_fw_tsf_information {
+struct wl12xx_acx_fw_tsf_information {
        struct acx_header header;
 
+       u8 role_id;
+       u8 padding1[3];
        __le32 current_tsf_high;
        __le32 current_tsf_low;
        __le32 last_bttt_high;
        __le32 last_tbtt_low;
        u8 last_dtim_count;
-       u8 padding[3];
+       u8 padding2[3];
 } __packed;
 
 struct wl1271_acx_ps_rx_streaming {
@@ -1151,79 +1153,81 @@ struct wl12xx_acx_config_hangover {
 } __packed;
 
 enum {
-       ACX_WAKE_UP_CONDITIONS      = 0x0002,
-       ACX_MEM_CFG                 = 0x0003,
-       ACX_SLOT                    = 0x0004,
-       ACX_AC_CFG                  = 0x0007,
-       ACX_MEM_MAP                 = 0x0008,
-       ACX_AID                     = 0x000A,
-       ACX_MEDIUM_USAGE            = 0x000F,
-       ACX_TX_QUEUE_CFG            = 0x0011, /* FIXME: only used by wl1251 */
-       ACX_STATISTICS              = 0x0013, /* Debug API */
-       ACX_PWR_CONSUMPTION_STATISTICS = 0x0014,
-       ACX_FEATURE_CFG             = 0x0015,
-       ACX_TID_CFG                 = 0x001A,
-       ACX_PS_RX_STREAMING         = 0x001B,
-       ACX_BEACON_FILTER_OPT       = 0x001F,
-       ACX_NOISE_HIST              = 0x0021,
-       ACX_HDK_VERSION             = 0x0022, /* ??? */
-       ACX_PD_THRESHOLD            = 0x0023,
-       ACX_TX_CONFIG_OPT           = 0x0024,
-       ACX_CCA_THRESHOLD           = 0x0025,
-       ACX_EVENT_MBOX_MASK         = 0x0026,
-       ACX_CONN_MONIT_PARAMS       = 0x002D,
-       ACX_BCN_DTIM_OPTIONS        = 0x0031,
-       ACX_SG_ENABLE               = 0x0032,
-       ACX_SG_CFG                  = 0x0033,
-       ACX_FM_COEX_CFG             = 0x0034,
-       ACX_BEACON_FILTER_TABLE     = 0x0038,
-       ACX_ARP_IP_FILTER           = 0x0039,
-       ACX_ROAMING_STATISTICS_TBL  = 0x003B,
-       ACX_RATE_POLICY             = 0x003D,
-       ACX_CTS_PROTECTION          = 0x003E,
-       ACX_SLEEP_AUTH              = 0x003F,
-       ACX_PREAMBLE_TYPE           = 0x0040,
-       ACX_ERROR_CNT               = 0x0041,
-       ACX_IBSS_FILTER             = 0x0044,
-       ACX_SERVICE_PERIOD_TIMEOUT  = 0x0045,
-       ACX_TSF_INFO                = 0x0046,
-       ACX_CONFIG_PS_WMM           = 0x0049,
-       ACX_ENABLE_RX_DATA_FILTER   = 0x004A,
-       ACX_SET_RX_DATA_FILTER      = 0x004B,
-       ACX_GET_DATA_FILTER_STATISTICS = 0x004C,
-       ACX_RX_CONFIG_OPT           = 0x004E,
-       ACX_FRAG_CFG                = 0x004F,
-       ACX_BET_ENABLE              = 0x0050,
-       ACX_RSSI_SNR_TRIGGER        = 0x0051,
-       ACX_RSSI_SNR_WEIGHTS        = 0x0052,
-       ACX_KEEP_ALIVE_MODE         = 0x0053,
-       ACX_SET_KEEP_ALIVE_CONFIG   = 0x0054,
-       ACX_BA_SESSION_INIT_POLICY  = 0x0055,
-       ACX_BA_SESSION_RX_SETUP     = 0x0056,
-       ACX_PEER_HT_CAP             = 0x0057,
-       ACX_HT_BSS_OPERATION        = 0x0058,
-       ACX_COEX_ACTIVITY           = 0x0059,
-       ACX_BURST_MODE              = 0x005C,
-       ACX_SET_RATE_MGMT_PARAMS    = 0x005D,
-       ACX_SET_RATE_ADAPT_PARAMS   = 0x0060,
-       ACX_SET_DCO_ITRIM_PARAMS    = 0x0061,
-       ACX_GEN_FW_CMD              = 0x0070,
-       ACX_HOST_IF_CFG_BITMAP      = 0x0071,
-       ACX_MAX_TX_FAILURE          = 0x0072,
-       ACX_UPDATE_INCONNECTION_STA_LIST = 0x0073,
-       DOT11_RX_MSDU_LIFE_TIME     = 0x1004,
-       DOT11_CUR_TX_PWR            = 0x100D,
-       DOT11_RX_DOT11_MODE         = 0x1012,
-       DOT11_RTS_THRESHOLD         = 0x1013,
-       DOT11_GROUP_ADDRESS_TBL     = 0x1014,
-       ACX_PM_CONFIG               = 0x1016,
-       ACX_CONFIG_PS               = 0x1017,
-       ACX_CONFIG_HANGOVER         = 0x1018,
+       ACX_WAKE_UP_CONDITIONS           = 0x0000,
+       ACX_MEM_CFG                      = 0x0001,
+       ACX_SLOT                         = 0x0002,
+       ACX_AC_CFG                       = 0x0003,
+       ACX_MEM_MAP                      = 0x0004,
+       ACX_AID                          = 0x0005,
+       ACX_MEDIUM_USAGE                 = 0x0006,
+       ACX_STATISTICS                   = 0x0007,
+       ACX_PWR_CONSUMPTION_STATISTICS   = 0x0008,
+       ACX_TID_CFG                      = 0x0009,
+       ACX_PS_RX_STREAMING              = 0x000A,
+       ACX_BEACON_FILTER_OPT            = 0x000B,
+       ACX_NOISE_HIST                   = 0x000C,
+       ACX_HDK_VERSION                  = 0x000D,
+       ACX_PD_THRESHOLD                 = 0x000E,
+       ACX_TX_CONFIG_OPT                = 0x000F,
+       ACX_CCA_THRESHOLD                = 0x0010,
+       ACX_EVENT_MBOX_MASK              = 0x0011,
+       ACX_CONN_MONIT_PARAMS            = 0x0012,
+       ACX_DISABLE_BROADCASTS           = 0x0013,
+       ACX_BCN_DTIM_OPTIONS             = 0x0014,
+       ACX_SG_ENABLE                    = 0x0015,
+       ACX_SG_CFG                       = 0x0016,
+       ACX_FM_COEX_CFG                  = 0x0017,
+       ACX_BEACON_FILTER_TABLE          = 0x0018,
+       ACX_ARP_IP_FILTER                = 0x0019,
+       ACX_ROAMING_STATISTICS_TBL       = 0x001A,
+       ACX_RATE_POLICY                  = 0x001B,
+       ACX_CTS_PROTECTION               = 0x001C,
+       ACX_SLEEP_AUTH                   = 0x001D,
+       ACX_PREAMBLE_TYPE                = 0x001E,
+       ACX_ERROR_CNT                    = 0x001F,
+       ACX_IBSS_FILTER                  = 0x0020,
+       ACX_SERVICE_PERIOD_TIMEOUT       = 0x0021,
+       ACX_TSF_INFO                     = 0x0022,
+       ACX_CONFIG_PS_WMM                = 0x0023,
+       ACX_ENABLE_RX_DATA_FILTER        = 0x0024,
+       ACX_SET_RX_DATA_FILTER           = 0x0025,
+       ACX_GET_DATA_FILTER_STATISTICS   = 0x0026,
+       ACX_RX_CONFIG_OPT                = 0x0027,
+       ACX_FRAG_CFG                     = 0x0028,
+       ACX_BET_ENABLE                   = 0x0029,
+       ACX_RSSI_SNR_TRIGGER             = 0x002A,
+       ACX_RSSI_SNR_WEIGHTS             = 0x002B,
+       ACX_KEEP_ALIVE_MODE              = 0x002C,
+       ACX_SET_KEEP_ALIVE_CONFIG        = 0x002D,
+       ACX_BA_SESSION_INIT_POLICY       = 0x002E,
+       ACX_BA_SESSION_RX_SETUP          = 0x002F,
+       ACX_PEER_HT_CAP                  = 0x0030,
+       ACX_HT_BSS_OPERATION             = 0x0031,
+       ACX_COEX_ACTIVITY                = 0x0032,
+       ACX_BURST_MODE                   = 0x0033,
+       ACX_SET_RATE_MGMT_PARAMS         = 0x0034,
+       ACX_GET_RATE_MGMT_PARAMS         = 0x0035,
+       ACX_SET_RATE_ADAPT_PARAMS        = 0x0036,
+       ACX_SET_DCO_ITRIM_PARAMS         = 0x0037,
+       ACX_GEN_FW_CMD                   = 0x0038,
+       ACX_HOST_IF_CFG_BITMAP           = 0x0039,
+       ACX_MAX_TX_FAILURE               = 0x003A,
+       ACX_UPDATE_INCONNECTION_STA_LIST = 0x003B,
+       DOT11_RX_MSDU_LIFE_TIME          = 0x003C,
+       DOT11_CUR_TX_PWR                 = 0x003D,
+       DOT11_RTS_THRESHOLD              = 0x003E,
+       DOT11_GROUP_ADDRESS_TBL          = 0x003F,
+       ACX_PM_CONFIG                    = 0x0040,
+       ACX_CONFIG_PS                    = 0x0041,
+       ACX_CONFIG_HANGOVER              = 0x0042,
+       ACX_FEATURE_CFG                  = 0x0043,
+       ACX_PROTECTION_CFG               = 0x0044,
 };
 
 
 int wl1271_acx_wake_up_conditions(struct wl1271 *wl,
-                                 struct wl12xx_vif *wlvif);
+                                 struct wl12xx_vif *wlvif,
+                                 u8 wake_up_event, u8 listen_interval);
 int wl1271_acx_sleep_auth(struct wl1271 *wl, u8 sleep_auth);
 int wl1271_acx_tx_power(struct wl1271 *wl, struct wl12xx_vif *wlvif,
                        int power);
@@ -1296,7 +1300,8 @@ int wl12xx_acx_set_ba_initiator_policy(struct wl1271 *wl,
                                       struct wl12xx_vif *wlvif);
 int wl12xx_acx_set_ba_receiver_session(struct wl1271 *wl, u8 tid_index,
                                       u16 ssn, bool enable, u8 peer_hlid);
-int wl1271_acx_tsf_info(struct wl1271 *wl, u64 *mactime);
+int wl12xx_acx_tsf_info(struct wl1271 *wl, struct wl12xx_vif *wlvif,
+                       u64 *mactime);
 int wl1271_acx_ps_rx_streaming(struct wl1271 *wl, struct wl12xx_vif *wlvif,
                               bool enable);
 int wl1271_acx_ap_max_tx_retry(struct wl1271 *wl, struct wl12xx_vif *wlvif);
index 8f9cf5a..954101d 100644 (file)
 #include "event.h"
 #include "rx.h"
 
-static struct wl1271_partition_set part_table[PART_TABLE_LEN] = {
-       [PART_DOWN] = {
-               .mem = {
-                       .start = 0x00000000,
-                       .size  = 0x000177c0
-               },
-               .reg = {
-                       .start = REGISTERS_BASE,
-                       .size  = 0x00008800
-               },
-               .mem2 = {
-                       .start = 0x00000000,
-                       .size  = 0x00000000
-               },
-               .mem3 = {
-                       .start = 0x00000000,
-                       .size  = 0x00000000
-               },
-       },
-
-       [PART_WORK] = {
-               .mem = {
-                       .start = 0x00040000,
-                       .size  = 0x00014fc0
-               },
-               .reg = {
-                       .start = REGISTERS_BASE,
-                       .size  = 0x0000a000
-               },
-               .mem2 = {
-                       .start = 0x003004f8,
-                       .size  = 0x00000004
-               },
-               .mem3 = {
-                       .start = 0x00040404,
-                       .size  = 0x00000000
-               },
-       },
-
-       [PART_DRPW] = {
-               .mem = {
-                       .start = 0x00040000,
-                       .size  = 0x00014fc0
-               },
-               .reg = {
-                       .start = DRPW_BASE,
-                       .size  = 0x00006000
-               },
-               .mem2 = {
-                       .start = 0x00000000,
-                       .size  = 0x00000000
-               },
-               .mem3 = {
-                       .start = 0x00000000,
-                       .size  = 0x00000000
-               }
-       }
-};
-
 static void wl1271_boot_set_ecpu_ctrl(struct wl1271 *wl, u32 flag)
 {
        u32 cpu_ctrl;
@@ -181,13 +122,13 @@ static int wl1271_boot_upload_firmware_chunk(struct wl1271 *wl, void *buf,
                return -ENOMEM;
        }
 
-       memcpy(&partition, &part_table[PART_DOWN], sizeof(partition));
+       memcpy(&partition, &wl12xx_part_table[PART_DOWN], sizeof(partition));
        partition.mem.start = dest;
        wl1271_set_partition(wl, &partition);
 
        /* 10.1 set partition limit and chunk num */
        chunk_num = 0;
-       partition_limit = part_table[PART_DOWN].mem.size;
+       partition_limit = wl12xx_part_table[PART_DOWN].mem.size;
 
        while (chunk_num < fw_data_len / CHUNK_SIZE) {
                /* 10.2 update partition, if needed */
@@ -195,7 +136,7 @@ static int wl1271_boot_upload_firmware_chunk(struct wl1271 *wl, void *buf,
                if (addr > partition_limit) {
                        addr = dest + chunk_num * CHUNK_SIZE;
                        partition_limit = chunk_num * CHUNK_SIZE +
-                               part_table[PART_DOWN].mem.size;
+                               wl12xx_part_table[PART_DOWN].mem.size;
                        partition.mem.start = addr;
                        wl1271_set_partition(wl, &partition);
                }
@@ -317,12 +258,12 @@ static int wl1271_boot_upload_nvs(struct wl1271 *wl)
        }
 
        /* update current MAC address to NVS */
-       nvs_ptr[11] = wl->mac_addr[0];
-       nvs_ptr[10] = wl->mac_addr[1];
-       nvs_ptr[6] = wl->mac_addr[2];
-       nvs_ptr[5] = wl->mac_addr[3];
-       nvs_ptr[4] = wl->mac_addr[4];
-       nvs_ptr[3] = wl->mac_addr[5];
+       nvs_ptr[11] = wl->addresses[0].addr[0];
+       nvs_ptr[10] = wl->addresses[0].addr[1];
+       nvs_ptr[6] = wl->addresses[0].addr[2];
+       nvs_ptr[5] = wl->addresses[0].addr[3];
+       nvs_ptr[4] = wl->addresses[0].addr[4];
+       nvs_ptr[3] = wl->addresses[0].addr[5];
 
        /*
         * Layout before the actual NVS tables:
@@ -383,7 +324,7 @@ static int wl1271_boot_upload_nvs(struct wl1271 *wl)
        nvs_len -= nvs_ptr - (u8 *)wl->nvs;
 
        /* Now we must set the partition correctly */
-       wl1271_set_partition(wl, &part_table[PART_WORK]);
+       wl1271_set_partition(wl, &wl12xx_part_table[PART_WORK]);
 
        /* Copy the NVS tables to a new block to ensure alignment */
        nvs_aligned = kmemdup(nvs_ptr, nvs_len, GFP_KERNEL);
@@ -492,7 +433,7 @@ static int wl1271_boot_run_firmware(struct wl1271 *wl)
        wl->event_box_addr = wl1271_read32(wl, REG_EVENT_MAILBOX_PTR);
 
        /* set the working partition to its "running" mode offset */
-       wl1271_set_partition(wl, &part_table[PART_WORK]);
+       wl1271_set_partition(wl, &wl12xx_part_table[PART_WORK]);
 
        wl1271_debug(DEBUG_MAILBOX, "cmd_box_addr 0x%x event_box_addr 0x%x",
                     wl->cmd_box_addr, wl->event_box_addr);
@@ -507,8 +448,7 @@ static int wl1271_boot_run_firmware(struct wl1271 *wl)
        /* unmask required mbox events  */
        wl->event_mask = BSS_LOSE_EVENT_ID |
                SCAN_COMPLETE_EVENT_ID |
-               PS_REPORT_EVENT_ID |
-               DISCONNECT_EVENT_COMPLETE_ID |
+               ROLE_STOP_COMPLETE_EVENT_ID |
                RSSI_SNR_TRIGGER_0_EVENT_ID |
                PSPOLL_DELIVERY_FAILURE_EVENT_ID |
                SOFT_GEMINI_SENSE_EVENT_ID |
@@ -547,19 +487,6 @@ static int wl1271_boot_write_irq_polarity(struct wl1271 *wl)
        return 0;
 }
 
-static void wl1271_boot_hw_version(struct wl1271 *wl)
-{
-       u32 fuse;
-
-       if (wl->chip.id == CHIP_ID_1283_PG20)
-               fuse = wl1271_top_reg_read(wl, WL128X_REG_FUSE_DATA_2_1);
-       else
-               fuse = wl1271_top_reg_read(wl, WL127X_REG_FUSE_DATA_2_1);
-       fuse = (fuse & PG_VER_MASK) >> PG_VER_OFFSET;
-
-       wl->hw_pg_ver = (s8)fuse;
-}
-
 static int wl128x_switch_tcxo_to_fref(struct wl1271 *wl)
 {
        u16 spare_reg;
@@ -698,7 +625,7 @@ static int wl127x_boot_clk(struct wl1271 *wl)
        u32 pause;
        u32 clk;
 
-       if (((wl->hw_pg_ver & PG_MAJOR_VER_MASK) >> PG_MAJOR_VER_OFFSET) < 3)
+       if (WL127X_PG_GET_MAJOR(wl->hw_pg_ver) < 3)
                wl->quirks |= WL12XX_QUIRK_END_OF_TRANSACTION;
 
        if (wl->ref_clock == CONF_REF_CLK_19_2_E ||
@@ -753,8 +680,6 @@ int wl1271_load_firmware(struct wl1271 *wl)
        u32 tmp, clk;
        int selected_clock = -1;
 
-       wl1271_boot_hw_version(wl);
-
        if (wl->chip.id == CHIP_ID_1283_PG20) {
                ret = wl128x_boot_clk(wl, &selected_clock);
                if (ret < 0)
@@ -769,7 +694,7 @@ int wl1271_load_firmware(struct wl1271 *wl)
        wl1271_write32(wl, WELP_ARM_COMMAND, WELP_ARM_COMMAND_VAL);
        udelay(500);
 
-       wl1271_set_partition(wl, &part_table[PART_DRPW]);
+       wl1271_set_partition(wl, &wl12xx_part_table[PART_DRPW]);
 
        /* Read-modify-write DRPW_SCRATCH_START register (see next state)
           to be used by DRPw FW. The RTRIM value will be added by the FW
@@ -788,7 +713,7 @@ int wl1271_load_firmware(struct wl1271 *wl)
 
        wl1271_write32(wl, DRPW_SCRATCH_START, clk);
 
-       wl1271_set_partition(wl, &part_table[PART_WORK]);
+       wl1271_set_partition(wl, &wl12xx_part_table[PART_WORK]);
 
        /* Disable interrupts */
        wl1271_write32(wl, ACX_REG_INTERRUPT_MASK, WL1271_ACX_INTR_ALL);
index 06dad93..c3adc09 100644 (file)
@@ -55,16 +55,6 @@ struct wl1271_static_data {
 #define OCP_REG_CLK_POLARITY 0x0cb2
 #define OCP_REG_CLK_PULL     0x0cb4
 
-#define WL127X_REG_FUSE_DATA_2_1    0x050a
-#define WL128X_REG_FUSE_DATA_2_1    0x2152
-#define PG_VER_MASK          0x3c
-#define PG_VER_OFFSET        2
-
-#define PG_MAJOR_VER_MASK    0x3
-#define PG_MAJOR_VER_OFFSET  0x0
-#define PG_MINOR_VER_MASK    0xc
-#define PG_MINOR_VER_OFFSET  0x2
-
 #define CMD_MBOX_ADDRESS     0x407B4
 
 #define POLARITY_LOW         BIT(1)
index 25990bd..b776d9d 100644 (file)
@@ -566,7 +566,7 @@ static int wl12xx_cmd_role_stop_dev(struct wl1271 *wl,
                goto out_free;
        }
 
-       ret = wl1271_cmd_wait_for_event(wl, DISCONNECT_EVENT_COMPLETE_ID);
+       ret = wl1271_cmd_wait_for_event(wl, ROLE_STOP_COMPLETE_EVENT_ID);
        if (ret < 0) {
                wl1271_error("cmd role stop dev event completion error");
                goto out_free;
@@ -715,6 +715,8 @@ int wl12xx_cmd_role_start_ap(struct wl1271 *wl, struct wl12xx_vif *wlvif)
        cmd->ap.beacon_interval = cpu_to_le16(wlvif->beacon_int);
        cmd->ap.dtim_interval = bss_conf->dtim_period;
        cmd->ap.beacon_expiry = WL1271_AP_DEF_BEACON_EXP;
+       /* FIXME: Change when adding DFS */
+       cmd->ap.reset_tsf = 1;  /* By default reset AP TSF */
        cmd->channel = wlvif->channel;
 
        if (!bss_conf->hidden_ssid) {
@@ -994,7 +996,7 @@ out:
 }
 
 int wl1271_cmd_ps_mode(struct wl1271 *wl, struct wl12xx_vif *wlvif,
-                      u8 ps_mode)
+                      u8 ps_mode, u16 auto_ps_timeout)
 {
        struct wl1271_cmd_ps_params *ps_params = NULL;
        int ret = 0;
@@ -1009,6 +1011,7 @@ int wl1271_cmd_ps_mode(struct wl1271 *wl, struct wl12xx_vif *wlvif,
 
        ps_params->role_id = wlvif->role_id;
        ps_params->ps_mode = ps_mode;
+       ps_params->auto_ps_timeout = auto_ps_timeout;
 
        ret = wl1271_cmd_send(wl, CMD_SET_PS_MODE, ps_params,
                              sizeof(*ps_params), 0);
@@ -1022,13 +1025,15 @@ out:
        return ret;
 }
 
-int wl1271_cmd_template_set(struct wl1271 *wl, u16 template_id,
-                           void *buf, size_t buf_len, int index, u32 rates)
+int wl1271_cmd_template_set(struct wl1271 *wl, u8 role_id,
+                           u16 template_id, void *buf, size_t buf_len,
+                           int index, u32 rates)
 {
        struct wl1271_cmd_template_set *cmd;
        int ret = 0;
 
-       wl1271_debug(DEBUG_CMD, "cmd template_set %d", template_id);
+       wl1271_debug(DEBUG_CMD, "cmd template_set %d (role %d)",
+                    template_id, role_id);
 
        WARN_ON(buf_len > WL1271_CMD_TEMPL_MAX_SIZE);
        buf_len = min_t(size_t, buf_len, WL1271_CMD_TEMPL_MAX_SIZE);
@@ -1039,6 +1044,8 @@ int wl1271_cmd_template_set(struct wl1271 *wl, u16 template_id,
                goto out;
        }
 
+       /* during initialization wlvif is NULL */
+       cmd->role_id = role_id;
        cmd->len = cpu_to_le16(buf_len);
        cmd->template_type = template_id;
        cmd->enabled_rates = cpu_to_le32(rates);
@@ -1082,7 +1089,8 @@ int wl12xx_cmd_build_null_data(struct wl1271 *wl, struct wl12xx_vif *wlvif)
                ptr = skb->data;
        }
 
-       ret = wl1271_cmd_template_set(wl, CMD_TEMPL_NULL_DATA, ptr, size, 0,
+       ret = wl1271_cmd_template_set(wl, wlvif->role_id,
+                                     CMD_TEMPL_NULL_DATA, ptr, size, 0,
                                      wlvif->basic_rate);
 
 out:
@@ -1105,7 +1113,7 @@ int wl12xx_cmd_build_klv_null_data(struct wl1271 *wl,
        if (!skb)
                goto out;
 
-       ret = wl1271_cmd_template_set(wl, CMD_TEMPL_KLV,
+       ret = wl1271_cmd_template_set(wl, wlvif->role_id, CMD_TEMPL_KLV,
                                      skb->data, skb->len,
                                      CMD_TEMPL_KLV_IDX_NULL_DATA,
                                      wlvif->basic_rate);
@@ -1130,7 +1138,8 @@ int wl1271_cmd_build_ps_poll(struct wl1271 *wl, struct wl12xx_vif *wlvif,
        if (!skb)
                goto out;
 
-       ret = wl1271_cmd_template_set(wl, CMD_TEMPL_PS_POLL, skb->data,
+       ret = wl1271_cmd_template_set(wl, wlvif->role_id,
+                                     CMD_TEMPL_PS_POLL, skb->data,
                                      skb->len, 0, wlvif->basic_rate_set);
 
 out:
@@ -1138,9 +1147,10 @@ out:
        return ret;
 }
 
-int wl1271_cmd_build_probe_req(struct wl1271 *wl, struct wl12xx_vif *wlvif,
+int wl12xx_cmd_build_probe_req(struct wl1271 *wl, struct wl12xx_vif *wlvif,
+                              u8 role_id, u8 band,
                               const u8 *ssid, size_t ssid_len,
-                              const u8 *ie, size_t ie_len, u8 band)
+                              const u8 *ie, size_t ie_len)
 {
        struct ieee80211_vif *vif = wl12xx_wlvif_to_vif(wlvif);
        struct sk_buff *skb;
@@ -1158,10 +1168,12 @@ int wl1271_cmd_build_probe_req(struct wl1271 *wl, struct wl12xx_vif *wlvif,
 
        rate = wl1271_tx_min_rate_get(wl, wlvif->bitrate_masks[band]);
        if (band == IEEE80211_BAND_2GHZ)
-               ret = wl1271_cmd_template_set(wl, CMD_TEMPL_CFG_PROBE_REQ_2_4,
+               ret = wl1271_cmd_template_set(wl, role_id,
+                                             CMD_TEMPL_CFG_PROBE_REQ_2_4,
                                              skb->data, skb->len, 0, rate);
        else
-               ret = wl1271_cmd_template_set(wl, CMD_TEMPL_CFG_PROBE_REQ_5,
+               ret = wl1271_cmd_template_set(wl, role_id,
+                                             CMD_TEMPL_CFG_PROBE_REQ_5,
                                              skb->data, skb->len, 0, rate);
 
 out:
@@ -1186,10 +1198,12 @@ struct sk_buff *wl1271_cmd_build_ap_probe_req(struct wl1271 *wl,
 
        rate = wl1271_tx_min_rate_get(wl, wlvif->bitrate_masks[wlvif->band]);
        if (wlvif->band == IEEE80211_BAND_2GHZ)
-               ret = wl1271_cmd_template_set(wl, CMD_TEMPL_CFG_PROBE_REQ_2_4,
+               ret = wl1271_cmd_template_set(wl, wlvif->role_id,
+                                             CMD_TEMPL_CFG_PROBE_REQ_2_4,
                                              skb->data, skb->len, 0, rate);
        else
-               ret = wl1271_cmd_template_set(wl, CMD_TEMPL_CFG_PROBE_REQ_5,
+               ret = wl1271_cmd_template_set(wl, wlvif->role_id,
+                                             CMD_TEMPL_CFG_PROBE_REQ_5,
                                              skb->data, skb->len, 0, rate);
 
        if (ret < 0)
@@ -1199,32 +1213,34 @@ out:
        return skb;
 }
 
-int wl1271_cmd_build_arp_rsp(struct wl1271 *wl, struct wl12xx_vif *wlvif,
-                            __be32 ip_addr)
+int wl1271_cmd_build_arp_rsp(struct wl1271 *wl, struct wl12xx_vif *wlvif)
 {
-       int ret;
+       int ret, extra;
+       u16 fc;
        struct ieee80211_vif *vif = wl12xx_wlvif_to_vif(wlvif);
-       struct wl12xx_arp_rsp_template tmpl;
+       struct sk_buff *skb;
+       struct wl12xx_arp_rsp_template *tmpl;
        struct ieee80211_hdr_3addr *hdr;
        struct arphdr *arp_hdr;
 
-       memset(&tmpl, 0, sizeof(tmpl));
+       skb = dev_alloc_skb(sizeof(*hdr) + sizeof(__le16) + sizeof(*tmpl) +
+                           WL1271_EXTRA_SPACE_MAX);
+       if (!skb) {
+               wl1271_error("failed to allocate buffer for arp rsp template");
+               return -ENOMEM;
+       }
 
-       /* mac80211 header */
-       hdr = &tmpl.hdr;
-       hdr->frame_control = cpu_to_le16(IEEE80211_FTYPE_DATA |
-                                        IEEE80211_STYPE_DATA |
-                                        IEEE80211_FCTL_TODS);
-       memcpy(hdr->addr1, vif->bss_conf.bssid, ETH_ALEN);
-       memcpy(hdr->addr2, vif->addr, ETH_ALEN);
-       memset(hdr->addr3, 0xff, ETH_ALEN);
+       skb_reserve(skb, sizeof(*hdr) + WL1271_EXTRA_SPACE_MAX);
+
+       tmpl = (struct wl12xx_arp_rsp_template *)skb_put(skb, sizeof(*tmpl));
+       memset(tmpl, 0, sizeof(tmpl));
 
        /* llc layer */
-       memcpy(tmpl.llc_hdr, rfc1042_header, sizeof(rfc1042_header));
-       tmpl.llc_type = cpu_to_be16(ETH_P_ARP);
+       memcpy(tmpl->llc_hdr, rfc1042_header, sizeof(rfc1042_header));
+       tmpl->llc_type = cpu_to_be16(ETH_P_ARP);
 
        /* arp header */
-       arp_hdr = &tmpl.arp_hdr;
+       arp_hdr = &tmpl->arp_hdr;
        arp_hdr->ar_hrd = cpu_to_be16(ARPHRD_ETHER);
        arp_hdr->ar_pro = cpu_to_be16(ETH_P_IP);
        arp_hdr->ar_hln = ETH_ALEN;
@@ -1232,13 +1248,59 @@ int wl1271_cmd_build_arp_rsp(struct wl1271 *wl, struct wl12xx_vif *wlvif,
        arp_hdr->ar_op = cpu_to_be16(ARPOP_REPLY);
 
        /* arp payload */
-       memcpy(tmpl.sender_hw, vif->addr, ETH_ALEN);
-       tmpl.sender_ip = ip_addr;
+       memcpy(tmpl->sender_hw, vif->addr, ETH_ALEN);
+       tmpl->sender_ip = wlvif->ip_addr;
 
-       ret = wl1271_cmd_template_set(wl, CMD_TEMPL_ARP_RSP,
-                                     &tmpl, sizeof(tmpl), 0,
-                                     wlvif->basic_rate);
+       /* encryption space */
+       switch (wlvif->encryption_type) {
+       case KEY_TKIP:
+               extra = WL1271_EXTRA_SPACE_TKIP;
+               break;
+       case KEY_AES:
+               extra = WL1271_EXTRA_SPACE_AES;
+               break;
+       case KEY_NONE:
+       case KEY_WEP:
+       case KEY_GEM:
+               extra = 0;
+               break;
+       default:
+               wl1271_warning("Unknown encryption type: %d",
+                              wlvif->encryption_type);
+               ret = -EINVAL;
+               goto out;
+       }
+
+       if (extra) {
+               u8 *space = skb_push(skb, extra);
+               memset(space, 0, extra);
+       }
+
+       /* QoS header - BE */
+       if (wlvif->sta.qos)
+               memset(skb_push(skb, sizeof(__le16)), 0, sizeof(__le16));
 
+       /* mac80211 header */
+       hdr = (struct ieee80211_hdr_3addr *)skb_push(skb, sizeof(*hdr));
+       memset(hdr, 0, sizeof(hdr));
+       fc = IEEE80211_FTYPE_DATA | IEEE80211_FCTL_TODS;
+       if (wlvif->sta.qos)
+               fc |= IEEE80211_STYPE_QOS_DATA;
+       else
+               fc |= IEEE80211_STYPE_DATA;
+       if (wlvif->encryption_type != KEY_NONE)
+               fc |= IEEE80211_FCTL_PROTECTED;
+
+       hdr->frame_control = cpu_to_le16(fc);
+       memcpy(hdr->addr1, vif->bss_conf.bssid, ETH_ALEN);
+       memcpy(hdr->addr2, vif->addr, ETH_ALEN);
+       memset(hdr->addr3, 0xff, ETH_ALEN);
+
+       ret = wl1271_cmd_template_set(wl, wlvif->role_id, CMD_TEMPL_ARP_RSP,
+                                     skb->data, skb->len, 0,
+                                     wlvif->basic_rate);
+out:
+       dev_kfree_skb(skb);
        return ret;
 }
 
@@ -1260,7 +1322,8 @@ int wl1271_build_qos_null_data(struct wl1271 *wl, struct ieee80211_vif *vif)
        /* FIXME: not sure what priority to use here */
        template.qos_ctrl = cpu_to_le16(0);
 
-       return wl1271_cmd_template_set(wl, CMD_TEMPL_QOS_NULL_DATA, &template,
+       return wl1271_cmd_template_set(wl, wlvif->role_id,
+                                      CMD_TEMPL_QOS_NULL_DATA, &template,
                                       sizeof(template), 0,
                                       wlvif->basic_rate);
 }
@@ -1744,6 +1807,7 @@ out:
 }
 
 int wl12xx_cmd_channel_switch(struct wl1271 *wl,
+                             struct wl12xx_vif *wlvif,
                              struct ieee80211_channel_switch *ch_switch)
 {
        struct wl12xx_cmd_channel_switch *cmd;
@@ -1757,10 +1821,13 @@ int wl12xx_cmd_channel_switch(struct wl1271 *wl,
                goto out;
        }
 
+       cmd->role_id = wlvif->role_id;
        cmd->channel = ch_switch->channel->hw_value;
        cmd->switch_time = ch_switch->count;
-       cmd->tx_suspend = ch_switch->block_tx;
-       cmd->flush = 0; /* this value is ignored by the FW */
+       cmd->stop_tx = ch_switch->block_tx;
+
+       /* FIXME: control from mac80211 in the future */
+       cmd->post_switch_tx_disable = 0;  /* Enable TX on the target channel */
 
        ret = wl1271_cmd_send(wl, CMD_CHANNEL_SWITCH, cmd, sizeof(*cmd), 0);
        if (ret < 0) {
index 3f7d0b9..de217d9 100644 (file)
@@ -51,22 +51,23 @@ int wl1271_cmd_interrogate(struct wl1271 *wl, u16 id, void *buf, size_t len);
 int wl1271_cmd_configure(struct wl1271 *wl, u16 id, void *buf, size_t len);
 int wl1271_cmd_data_path(struct wl1271 *wl, bool enable);
 int wl1271_cmd_ps_mode(struct wl1271 *wl, struct wl12xx_vif *wlvif,
-                      u8 ps_mode);
+                      u8 ps_mode, u16 auto_ps_timeout);
 int wl1271_cmd_read_memory(struct wl1271 *wl, u32 addr, void *answer,
                           size_t len);
-int wl1271_cmd_template_set(struct wl1271 *wl, u16 template_id,
-                           void *buf, size_t buf_len, int index, u32 rates);
+int wl1271_cmd_template_set(struct wl1271 *wl, u8 role_id,
+                           u16 template_id, void *buf, size_t buf_len,
+                           int index, u32 rates);
 int wl12xx_cmd_build_null_data(struct wl1271 *wl, struct wl12xx_vif *wlvif);
 int wl1271_cmd_build_ps_poll(struct wl1271 *wl, struct wl12xx_vif *wlvif,
                             u16 aid);
-int wl1271_cmd_build_probe_req(struct wl1271 *wl, struct wl12xx_vif *wlvif,
+int wl12xx_cmd_build_probe_req(struct wl1271 *wl, struct wl12xx_vif *wlvif,
+                              u8 role_id, u8 band,
                               const u8 *ssid, size_t ssid_len,
-                              const u8 *ie, size_t ie_len, u8 band);
+                              const u8 *ie, size_t ie_len);
 struct sk_buff *wl1271_cmd_build_ap_probe_req(struct wl1271 *wl,
                                              struct wl12xx_vif *wlvif,
                                              struct sk_buff *skb);
-int wl1271_cmd_build_arp_rsp(struct wl1271 *wl, struct wl12xx_vif *wlvif,
-                            __be32 ip_addr);
+int wl1271_cmd_build_arp_rsp(struct wl1271 *wl, struct wl12xx_vif *wlvif);
 int wl1271_build_qos_null_data(struct wl1271 *wl, struct ieee80211_vif *vif);
 int wl12xx_cmd_build_klv_null_data(struct wl1271 *wl,
                                   struct wl12xx_vif *wlvif);
@@ -89,6 +90,7 @@ int wl12xx_cmd_config_fwlog(struct wl1271 *wl);
 int wl12xx_cmd_start_fwlog(struct wl1271 *wl);
 int wl12xx_cmd_stop_fwlog(struct wl1271 *wl);
 int wl12xx_cmd_channel_switch(struct wl1271 *wl,
+                             struct wl12xx_vif *wlvif,
                              struct ieee80211_channel_switch *ch_switch);
 int wl12xx_cmd_stop_channel_switch(struct wl1271 *wl);
 int wl12xx_allocate_link(struct wl1271 *wl, struct wl12xx_vif *wlvif,
@@ -96,62 +98,65 @@ int wl12xx_allocate_link(struct wl1271 *wl, struct wl12xx_vif *wlvif,
 void wl12xx_free_link(struct wl1271 *wl, struct wl12xx_vif *wlvif, u8 *hlid);
 
 enum wl1271_commands {
-       CMD_INTERROGATE     = 1,    /*use this to read information elements*/
-       CMD_CONFIGURE       = 2,    /*use this to write information elements*/
-       CMD_ENABLE_RX       = 3,
-       CMD_ENABLE_TX       = 4,
-       CMD_DISABLE_RX      = 5,
-       CMD_DISABLE_TX      = 6,
-       CMD_SCAN            = 8,
-       CMD_STOP_SCAN       = 9,
-       CMD_SET_KEYS        = 12,
-       CMD_READ_MEMORY     = 13,
-       CMD_WRITE_MEMORY    = 14,
-       CMD_SET_TEMPLATE    = 19,
-       CMD_TEST            = 23,
-       CMD_NOISE_HIST      = 28,
-       CMD_QUIET_ELEMENT_SET_STATE  = 29,
-       CMD_SET_BCN_MODE    = 33,
-       CMD_MEASUREMENT      = 34,
-       CMD_STOP_MEASUREMENT = 35,
-       CMD_SET_PS_MODE      = 37,
-       CMD_CHANNEL_SWITCH   = 38,
-       CMD_STOP_CHANNEL_SWICTH = 39,
-       CMD_AP_DISCOVERY     = 40,
-       CMD_STOP_AP_DISCOVERY = 41,
-       CMD_HEALTH_CHECK     = 45,
-       CMD_DEBUG            = 46,
-       CMD_TRIGGER_SCAN_TO  = 47,
-       CMD_CONNECTION_SCAN_CFG      = 48,
-       CMD_CONNECTION_SCAN_SSID_CFG = 49,
-       CMD_START_PERIODIC_SCAN      = 50,
-       CMD_STOP_PERIODIC_SCAN       = 51,
-       CMD_SET_PEER_STATE           = 52,
-       CMD_REMAIN_ON_CHANNEL        = 53,
-       CMD_CANCEL_REMAIN_ON_CHANNEL = 54,
-
-       CMD_CONFIG_FWLOGGER          = 55,
-       CMD_START_FWLOGGER           = 56,
-       CMD_STOP_FWLOGGER            = 57,
-
-       /* AP commands */
-       CMD_ADD_PEER                 = 62,
-       CMD_REMOVE_PEER              = 63,
+       CMD_INTERROGATE = 1, /* use this to read information elements */
+       CMD_CONFIGURE   = 2, /* use this to write information elements */
+       CMD_ENABLE_RX   = 3,
+       CMD_ENABLE_TX   = 4,
+       CMD_DISABLE_RX  = 5,
+       CMD_DISABLE_TX  = 6,
+       CMD_SCAN        = 7,
+       CMD_STOP_SCAN   = 8,
+       CMD_SET_KEYS    = 9,
+       CMD_READ_MEMORY = 10,
+       CMD_WRITE_MEMORY        = 11,
+       CMD_SET_TEMPLATE        = 12,
+       CMD_TEST                = 13,
+       CMD_NOISE_HIST          = 14,
+       CMD_QUIET_ELEMENT_SET_STATE = 15,
+       CMD_SET_BCN_MODE        = 16,
+
+       CMD_MEASUREMENT         = 17,
+       CMD_STOP_MEASUREMENT    = 18,
+       CMD_SET_PS_MODE         = 19,
+       CMD_CHANNEL_SWITCH      = 20,
+       CMD_STOP_CHANNEL_SWICTH = 21,
+       CMD_AP_DISCOVERY        = 22,
+       CMD_STOP_AP_DISCOVERY   = 23,
+       CMD_HEALTH_CHECK        = 24,
+       CMD_DEBUG               = 25,
+       CMD_TRIGGER_SCAN_TO     = 26,
+       CMD_CONNECTION_SCAN_CFG = 27,
+       CMD_CONNECTION_SCAN_SSID_CFG    = 28,
+       CMD_START_PERIODIC_SCAN = 29,
+       CMD_STOP_PERIODIC_SCAN  = 30,
+       CMD_SET_PEER_STATE      = 31,
+       CMD_REMAIN_ON_CHANNEL   = 32,
+       CMD_CANCEL_REMAIN_ON_CHANNEL    = 33,
+       CMD_CONFIG_FWLOGGER             = 34,
+       CMD_START_FWLOGGER                      = 35,
+       CMD_STOP_FWLOGGER                       = 36,
+
+       /* Access point commands */
+       CMD_ADD_PEER            = 37,
+       CMD_REMOVE_PEER         = 38,
 
        /* Role API */
-       CMD_ROLE_ENABLE              = 70,
-       CMD_ROLE_DISABLE             = 71,
-       CMD_ROLE_START               = 72,
-       CMD_ROLE_STOP                = 73,
+       CMD_ROLE_ENABLE         = 39,
+       CMD_ROLE_DISABLE        = 40,
+       CMD_ROLE_START          = 41,
+       CMD_ROLE_STOP           = 42,
 
-       /* WIFI Direct */
-       CMD_WFD_START_DISCOVERY      = 80,
-       CMD_WFD_STOP_DISCOVERY       = 81,
-       CMD_WFD_ATTRIBUTE_CONFIG     = 82,
+       /* DFS */
+       CMD_START_RADAR_DETECTION       = 43,
+       CMD_STOP_RADAR_DETECTION        = 44,
 
-       CMD_NOP                      = 100,
+       /* WIFI Direct */
+       CMD_WFD_START_DISCOVERY = 45,
+       CMD_WFD_STOP_DISCOVERY  = 46,
+       CMD_WFD_ATTRIBUTE_CONFIG        = 47,
+       CMD_NOP                 = 48,
+       CMD_LAST_COMMAND,
 
-       NUM_COMMANDS,
        MAX_COMMAND_ID = 0xFFFF,
 };
 
@@ -191,7 +196,7 @@ enum cmd_templ {
 /* unit ms */
 #define WL1271_COMMAND_TIMEOUT     2000
 #define WL1271_CMD_TEMPL_DFLT_SIZE 252
-#define WL1271_CMD_TEMPL_MAX_SIZE  548
+#define WL1271_CMD_TEMPL_MAX_SIZE  512
 #define WL1271_EVENT_TIMEOUT       750
 
 struct wl1271_cmd_header {
@@ -339,7 +344,9 @@ struct wl12xx_cmd_role_start {
                        u8 ssid_len;
                        u8 ssid[IEEE80211_MAX_SSID_LEN];
 
-                       u8 padding_1[5];
+                       u8 reset_tsf;
+
+                       u8 padding_1[4];
                } __packed ap;
        };
 } __packed;
@@ -364,14 +371,18 @@ struct cmd_enabledisable_path {
 struct wl1271_cmd_template_set {
        struct wl1271_cmd_header header;
 
-       __le16 len;
+       u8 role_id;
        u8 template_type;
+       __le16 len;
        u8 index;  /* relevant only for KLV_TEMPLATE type */
+       u8 padding[3];
+
        __le32 enabled_rates;
        u8 short_retry_limit;
        u8 long_retry_limit;
        u8 aflags;
        u8 reserved;
+
        u8 template_data[WL1271_CMD_TEMPL_MAX_SIZE];
 } __packed;
 
@@ -388,6 +399,7 @@ struct wl1271_tim {
 } __packed;
 
 enum wl1271_cmd_ps_mode {
+       STATION_AUTO_PS_MODE,   /* Dynamic Power Save */
        STATION_ACTIVE_MODE,
        STATION_POWER_SAVE_MODE
 };
@@ -397,7 +409,7 @@ struct wl1271_cmd_ps_params {
 
        u8 role_id;
        u8 ps_mode; /* STATION_* */
-       u8 padding[2];
+       u16 auto_ps_timeout;
 } __packed;
 
 /* HW encryption keys */
@@ -695,14 +707,18 @@ struct wl12xx_cmd_stop_fwlog {
 struct wl12xx_cmd_channel_switch {
        struct wl1271_cmd_header header;
 
+       u8 role_id;
+
        /* The new serving channel */
        u8 channel;
        /* Relative time of the serving channel switch in TBTT units */
        u8 switch_time;
-       /* 1: Suspend TX till switch time; 0: Do not suspend TX */
-       u8 tx_suspend;
-       /* 1: Flush TX at switch time; 0: Do not flush */
-       u8 flush;
+       /* Stop the role TX, should expect it after radar detection */
+       u8 stop_tx;
+       /* The target channel tx status 1-stopped 0-open*/
+       u8 post_switch_tx_disable;
+
+       u8 padding[3];
 } __packed;
 
 struct wl12xx_cmd_stop_channel_switch {
index 1bcfb01..cc50faa 100644 (file)
@@ -66,7 +66,8 @@ enum {
 };
 
 enum {
-       CONF_HW_RXTX_RATE_MCS7 = 0,
+       CONF_HW_RXTX_RATE_MCS7_SGI = 0,
+       CONF_HW_RXTX_RATE_MCS7,
        CONF_HW_RXTX_RATE_MCS6,
        CONF_HW_RXTX_RATE_MCS5,
        CONF_HW_RXTX_RATE_MCS4,
@@ -91,6 +92,10 @@ enum {
        CONF_HW_RXTX_RATE_UNSUPPORTED = 0xff
 };
 
+/* Rates between and including these are MCS rates */
+#define CONF_HW_RXTX_RATE_MCS_MIN CONF_HW_RXTX_RATE_MCS7_SGI
+#define CONF_HW_RXTX_RATE_MCS_MAX CONF_HW_RXTX_RATE_MCS0
+
 enum {
        CONF_SG_DISABLE = 0,
        CONF_SG_PROTECTIVE,
@@ -312,6 +317,10 @@ enum {
        CONF_AP_BT_ACL_VAL_BT_SERVE_TIME,
        CONF_AP_BT_ACL_VAL_WL_SERVE_TIME,
 
+       /* CTS Diluting params */
+       CONF_SG_CTS_DILUTED_BAD_RX_PACKETS_TH,
+       CONF_SG_CTS_CHOP_IN_DUAL_ANT_SCO_MASTER,
+
        CONF_SG_TEMP_PARAM_1,
        CONF_SG_TEMP_PARAM_2,
        CONF_SG_TEMP_PARAM_3,
@@ -810,6 +819,19 @@ struct conf_conn_settings {
        u8 listen_interval;
 
        /*
+        * Firmware wakeup conditions during suspend
+        * Range: CONF_WAKE_UP_EVENT_*
+        */
+       u8 suspend_wake_up_event;
+
+       /*
+        * Listen interval during suspend.
+        * Currently will be in DTIMs (1-10)
+        *
+        */
+       u8 suspend_listen_interval;
+
+       /*
         * Enable or disable the beacon filtering.
         *
         * Range: CONF_BCN_FILT_MODE_*
@@ -868,13 +890,6 @@ struct conf_conn_settings {
        u8 ps_poll_threshold;
 
        /*
-        * PS Poll failure recovery ACTIVE period length
-        *
-        * Range: u32 (ms)
-        */
-       u32 ps_poll_recovery_period;
-
-       /*
         * Configuration of signal average weights.
         */
        struct conf_sig_weights sig_weights;
@@ -922,6 +937,18 @@ struct conf_conn_settings {
        u8 psm_entry_nullfunc_retries;
 
        /*
+        * Specifies the dynamic PS timeout in ms that will be used
+        * by the FW when in AUTO_PS mode
+        */
+       u16 dynamic_ps_timeout;
+
+       /*
+        * Specifies whether dynamic PS should be disabled and PSM forced.
+        * This is required for certain WiFi certification tests.
+        */
+       u8 forced_ps;
+
+       /*
         *
         * Specifies the interval of the connection keep-alive null-func
         * frame in ms.
@@ -1055,6 +1082,14 @@ struct conf_scan_settings {
         */
        u16 num_probe_reqs;
 
+       /*
+        * Scan trigger (split scan) timeout. The FW will split the scan
+        * operation into slices of the given time and allow the FW to schedule
+        * other tasks in between.
+        *
+        * Range: u32 Microsecs
+        */
+       u32 split_scan_timeout;
 };
 
 struct conf_sched_scan_settings {
index b85fd8c..ec0fdc2 100644 (file)
@@ -51,6 +51,7 @@ enum {
        DEBUG_FILTERS   = BIT(15),
        DEBUG_ADHOC     = BIT(16),
        DEBUG_AP        = BIT(17),
+       DEBUG_PROBE     = BIT(18),
        DEBUG_MASTER    = (DEBUG_ADHOC | DEBUG_AP),
        DEBUG_ALL       = ~0,
 };
index 15eb3a9..e1cf727 100644 (file)
@@ -113,7 +113,7 @@ static void wl1271_debugfs_update_stats(struct wl1271 *wl)
        if (ret < 0)
                goto out;
 
-       if (wl->state == WL1271_STATE_ON &&
+       if (wl->state == WL1271_STATE_ON && !wl->plt &&
            time_after(jiffies, wl->stats.fw_stats_update +
                       msecs_to_jiffies(WL1271_DEBUGFS_STATS_LIFETIME))) {
                wl1271_acx_statistics(wl, wl->stats.fw_stats);
@@ -312,6 +312,181 @@ static const struct file_operations start_recovery_ops = {
        .llseek = default_llseek,
 };
 
+static ssize_t dynamic_ps_timeout_read(struct file *file, char __user *user_buf,
+                         size_t count, loff_t *ppos)
+{
+       struct wl1271 *wl = file->private_data;
+
+       return wl1271_format_buffer(user_buf, count,
+                                   ppos, "%d\n",
+                                   wl->conf.conn.dynamic_ps_timeout);
+}
+
+static ssize_t dynamic_ps_timeout_write(struct file *file,
+                                   const char __user *user_buf,
+                                   size_t count, loff_t *ppos)
+{
+       struct wl1271 *wl = file->private_data;
+       struct wl12xx_vif *wlvif;
+       unsigned long value;
+       int ret;
+
+       ret = kstrtoul_from_user(user_buf, count, 10, &value);
+       if (ret < 0) {
+               wl1271_warning("illegal value in dynamic_ps");
+               return -EINVAL;
+       }
+
+       if (value < 1 || value > 65535) {
+               wl1271_warning("dyanmic_ps_timeout is not in valid range");
+               return -ERANGE;
+       }
+
+       mutex_lock(&wl->mutex);
+
+       wl->conf.conn.dynamic_ps_timeout = value;
+
+       if (wl->state == WL1271_STATE_OFF)
+               goto out;
+
+       ret = wl1271_ps_elp_wakeup(wl);
+       if (ret < 0)
+               goto out;
+
+       /* In case we're already in PSM, trigger it again to set new timeout
+        * immediately without waiting for re-association
+        */
+
+       wl12xx_for_each_wlvif_sta(wl, wlvif) {
+               if (test_bit(WLVIF_FLAG_IN_PS, &wlvif->flags))
+                       wl1271_ps_set_mode(wl, wlvif, STATION_AUTO_PS_MODE);
+       }
+
+       wl1271_ps_elp_sleep(wl);
+
+out:
+       mutex_unlock(&wl->mutex);
+       return count;
+}
+
+static const struct file_operations dynamic_ps_timeout_ops = {
+       .read = dynamic_ps_timeout_read,
+       .write = dynamic_ps_timeout_write,
+       .open = wl1271_open_file_generic,
+       .llseek = default_llseek,
+};
+
+static ssize_t forced_ps_read(struct file *file, char __user *user_buf,
+                         size_t count, loff_t *ppos)
+{
+       struct wl1271 *wl = file->private_data;
+
+       return wl1271_format_buffer(user_buf, count,
+                                   ppos, "%d\n",
+                                   wl->conf.conn.forced_ps);
+}
+
+static ssize_t forced_ps_write(struct file *file,
+                                   const char __user *user_buf,
+                                   size_t count, loff_t *ppos)
+{
+       struct wl1271 *wl = file->private_data;
+       struct wl12xx_vif *wlvif;
+       unsigned long value;
+       int ret, ps_mode;
+
+       ret = kstrtoul_from_user(user_buf, count, 10, &value);
+       if (ret < 0) {
+               wl1271_warning("illegal value in forced_ps");
+               return -EINVAL;
+       }
+
+       if (value != 1 && value != 0) {
+               wl1271_warning("forced_ps should be either 0 or 1");
+               return -ERANGE;
+       }
+
+       mutex_lock(&wl->mutex);
+
+       if (wl->conf.conn.forced_ps == value)
+               goto out;
+
+       wl->conf.conn.forced_ps = value;
+
+       if (wl->state == WL1271_STATE_OFF)
+               goto out;
+
+       ret = wl1271_ps_elp_wakeup(wl);
+       if (ret < 0)
+               goto out;
+
+       /* In case we're already in PSM, trigger it again to switch mode
+        * immediately without waiting for re-association
+        */
+
+       ps_mode = value ? STATION_POWER_SAVE_MODE : STATION_AUTO_PS_MODE;
+
+       wl12xx_for_each_wlvif_sta(wl, wlvif) {
+               if (test_bit(WLVIF_FLAG_IN_PS, &wlvif->flags))
+                       wl1271_ps_set_mode(wl, wlvif, ps_mode);
+       }
+
+       wl1271_ps_elp_sleep(wl);
+
+out:
+       mutex_unlock(&wl->mutex);
+       return count;
+}
+
+static const struct file_operations forced_ps_ops = {
+       .read = forced_ps_read,
+       .write = forced_ps_write,
+       .open = wl1271_open_file_generic,
+       .llseek = default_llseek,
+};
+
+static ssize_t split_scan_timeout_read(struct file *file, char __user *user_buf,
+                         size_t count, loff_t *ppos)
+{
+       struct wl1271 *wl = file->private_data;
+
+       return wl1271_format_buffer(user_buf, count,
+                                   ppos, "%d\n",
+                                   wl->conf.scan.split_scan_timeout / 1000);
+}
+
+static ssize_t split_scan_timeout_write(struct file *file,
+                                   const char __user *user_buf,
+                                   size_t count, loff_t *ppos)
+{
+       struct wl1271 *wl = file->private_data;
+       unsigned long value;
+       int ret;
+
+       ret = kstrtoul_from_user(user_buf, count, 10, &value);
+       if (ret < 0) {
+               wl1271_warning("illegal value in split_scan_timeout");
+               return -EINVAL;
+       }
+
+       if (value == 0)
+               wl1271_info("split scan will be disabled");
+
+       mutex_lock(&wl->mutex);
+
+       wl->conf.scan.split_scan_timeout = value * 1000;
+
+       mutex_unlock(&wl->mutex);
+       return count;
+}
+
+static const struct file_operations split_scan_timeout_ops = {
+       .read = split_scan_timeout_read,
+       .write = split_scan_timeout_write,
+       .open = wl1271_open_file_generic,
+       .llseek = default_llseek,
+};
+
 static ssize_t driver_state_read(struct file *file, char __user *user_buf,
                                 size_t count, loff_t *ppos)
 {
@@ -446,6 +621,7 @@ static ssize_t vifs_state_read(struct file *file, char __user *user_buf,
                        VIF_STATE_PRINT_INT(sta.basic_rate_idx);
                        VIF_STATE_PRINT_INT(sta.ap_rate_idx);
                        VIF_STATE_PRINT_INT(sta.p2p_rate_idx);
+                       VIF_STATE_PRINT_INT(sta.qos);
                } else {
                        VIF_STATE_PRINT_INT(ap.global_hlid);
                        VIF_STATE_PRINT_INT(ap.bcast_hlid);
@@ -471,7 +647,6 @@ static ssize_t vifs_state_read(struct file *file, char __user *user_buf,
                VIF_STATE_PRINT_INT(default_key);
                VIF_STATE_PRINT_INT(aid);
                VIF_STATE_PRINT_INT(session_counter);
-               VIF_STATE_PRINT_INT(ps_poll_failures);
                VIF_STATE_PRINT_INT(psm_entry_retry);
                VIF_STATE_PRINT_INT(power_level);
                VIF_STATE_PRINT_INT(rssi_thold);
@@ -562,6 +737,64 @@ static const struct file_operations dtim_interval_ops = {
        .llseek = default_llseek,
 };
 
+
+
+static ssize_t suspend_dtim_interval_read(struct file *file,
+                                         char __user *user_buf,
+                                         size_t count, loff_t *ppos)
+{
+       struct wl1271 *wl = file->private_data;
+       u8 value;
+
+       if (wl->conf.conn.suspend_wake_up_event == CONF_WAKE_UP_EVENT_DTIM ||
+           wl->conf.conn.suspend_wake_up_event == CONF_WAKE_UP_EVENT_N_DTIM)
+               value = wl->conf.conn.suspend_listen_interval;
+       else
+               value = 0;
+
+       return wl1271_format_buffer(user_buf, count, ppos, "%d\n", value);
+}
+
+static ssize_t suspend_dtim_interval_write(struct file *file,
+                                          const char __user *user_buf,
+                                          size_t count, loff_t *ppos)
+{
+       struct wl1271 *wl = file->private_data;
+       unsigned long value;
+       int ret;
+
+       ret = kstrtoul_from_user(user_buf, count, 10, &value);
+       if (ret < 0) {
+               wl1271_warning("illegal value for suspend_dtim_interval");
+               return -EINVAL;
+       }
+
+       if (value < 1 || value > 10) {
+               wl1271_warning("suspend_dtim value is not in valid range");
+               return -ERANGE;
+       }
+
+       mutex_lock(&wl->mutex);
+
+       wl->conf.conn.suspend_listen_interval = value;
+       /* for some reason there are different event types for 1 and >1 */
+       if (value == 1)
+               wl->conf.conn.suspend_wake_up_event = CONF_WAKE_UP_EVENT_DTIM;
+       else
+               wl->conf.conn.suspend_wake_up_event = CONF_WAKE_UP_EVENT_N_DTIM;
+
+       mutex_unlock(&wl->mutex);
+       return count;
+}
+
+
+static const struct file_operations suspend_dtim_interval_ops = {
+       .read = suspend_dtim_interval_read,
+       .write = suspend_dtim_interval_write,
+       .open = wl1271_open_file_generic,
+       .llseek = default_llseek,
+};
+
 static ssize_t beacon_interval_read(struct file *file, char __user *user_buf,
                                    size_t count, loff_t *ppos)
 {
@@ -886,8 +1119,12 @@ static int wl1271_debugfs_add_files(struct wl1271 *wl,
        DEBUGFS_ADD(driver_state, rootdir);
        DEBUGFS_ADD(vifs_state, rootdir);
        DEBUGFS_ADD(dtim_interval, rootdir);
+       DEBUGFS_ADD(suspend_dtim_interval, rootdir);
        DEBUGFS_ADD(beacon_interval, rootdir);
        DEBUGFS_ADD(beacon_filtering, rootdir);
+       DEBUGFS_ADD(dynamic_ps_timeout, rootdir);
+       DEBUGFS_ADD(forced_ps, rootdir);
+       DEBUGFS_ADD(split_scan_timeout, rootdir);
 
        streaming = debugfs_create_dir("rx_streaming", rootdir);
        if (!streaming || IS_ERR(streaming))
index d3280df..c953717 100644 (file)
 #include "scan.h"
 #include "wl12xx_80211.h"
 
-void wl1271_pspoll_work(struct work_struct *work)
-{
-       struct ieee80211_vif *vif;
-       struct wl12xx_vif *wlvif;
-       struct delayed_work *dwork;
-       struct wl1271 *wl;
-       int ret;
-
-       dwork = container_of(work, struct delayed_work, work);
-       wlvif = container_of(dwork, struct wl12xx_vif, pspoll_work);
-       vif = container_of((void *)wlvif, struct ieee80211_vif, drv_priv);
-       wl = wlvif->wl;
-
-       wl1271_debug(DEBUG_EVENT, "pspoll work");
-
-       mutex_lock(&wl->mutex);
-
-       if (unlikely(wl->state == WL1271_STATE_OFF))
-               goto out;
-
-       if (!test_and_clear_bit(WLVIF_FLAG_PSPOLL_FAILURE, &wlvif->flags))
-               goto out;
-
-       if (!test_bit(WLVIF_FLAG_STA_ASSOCIATED, &wlvif->flags))
-               goto out;
-
-       /*
-        * if we end up here, then we were in powersave when the pspoll
-        * delivery failure occurred, and no-one changed state since, so
-        * we should go back to powersave.
-        */
-       ret = wl1271_ps_elp_wakeup(wl);
-       if (ret < 0)
-               goto out;
-
-       wl1271_ps_set_mode(wl, wlvif, STATION_POWER_SAVE_MODE,
-                          wlvif->basic_rate, true);
-
-       wl1271_ps_elp_sleep(wl);
-out:
-       mutex_unlock(&wl->mutex);
-};
-
-static void wl1271_event_pspoll_delivery_fail(struct wl1271 *wl,
-                                             struct wl12xx_vif *wlvif)
-{
-       int delay = wl->conf.conn.ps_poll_recovery_period;
-       int ret;
-
-       wlvif->ps_poll_failures++;
-       if (wlvif->ps_poll_failures == 1)
-               wl1271_info("AP with dysfunctional ps-poll, "
-                           "trying to work around it.");
-
-       /* force active mode receive data from the AP */
-       if (test_bit(WLVIF_FLAG_PSM, &wlvif->flags)) {
-               ret = wl1271_ps_set_mode(wl, wlvif, STATION_ACTIVE_MODE,
-                                        wlvif->basic_rate, true);
-               if (ret < 0)
-                       return;
-               set_bit(WLVIF_FLAG_PSPOLL_FAILURE, &wlvif->flags);
-               ieee80211_queue_delayed_work(wl->hw, &wlvif->pspoll_work,
-                                            msecs_to_jiffies(delay));
-       }
-
-       /*
-        * If already in active mode, lets we should be getting data from
-        * the AP right away. If we enter PSM too fast after this, and data
-        * remains on the AP, we will get another event like this, and we'll
-        * go into active once more.
-        */
-}
-
-static int wl1271_event_ps_report(struct wl1271 *wl,
-                                 struct wl12xx_vif *wlvif,
-                                 struct event_mailbox *mbox,
-                                 bool *beacon_loss)
-{
-       int ret = 0;
-       u32 total_retries = wl->conf.conn.psm_entry_retries;
-
-       wl1271_debug(DEBUG_EVENT, "ps_status: 0x%x", mbox->ps_status);
-
-       switch (mbox->ps_status) {
-       case EVENT_ENTER_POWER_SAVE_FAIL:
-               wl1271_debug(DEBUG_PSM, "PSM entry failed");
-
-               if (!test_bit(WLVIF_FLAG_PSM, &wlvif->flags)) {
-                       /* remain in active mode */
-                       wlvif->psm_entry_retry = 0;
-                       break;
-               }
-
-               if (wlvif->psm_entry_retry < total_retries) {
-                       wlvif->psm_entry_retry++;
-                       ret = wl1271_ps_set_mode(wl, wlvif,
-                                                STATION_POWER_SAVE_MODE,
-                                                wlvif->basic_rate, true);
-               } else {
-                       wl1271_info("No ack to nullfunc from AP.");
-                       wlvif->psm_entry_retry = 0;
-                       *beacon_loss = true;
-               }
-               break;
-       case EVENT_ENTER_POWER_SAVE_SUCCESS:
-               wlvif->psm_entry_retry = 0;
-
-               /*
-                * BET has only a minor effect in 5GHz and masks
-                * channel switch IEs, so we only enable BET on 2.4GHz
-               */
-               if (wlvif->band == IEEE80211_BAND_2GHZ)
-                       /* enable beacon early termination */
-                       ret = wl1271_acx_bet_enable(wl, wlvif, true);
-
-               if (wlvif->ps_compl) {
-                       complete(wlvif->ps_compl);
-                       wlvif->ps_compl = NULL;
-               }
-               break;
-       default:
-               break;
-       }
-
-       return ret;
-}
-
 static void wl1271_event_rssi_trigger(struct wl1271 *wl,
                                      struct wl12xx_vif *wlvif,
                                      struct event_mailbox *mbox)
@@ -205,21 +78,13 @@ static void wl1271_stop_ba_event(struct wl1271 *wl, struct wl12xx_vif *wlvif)
 static void wl12xx_event_soft_gemini_sense(struct wl1271 *wl,
                                               u8 enable)
 {
-       struct ieee80211_vif *vif;
        struct wl12xx_vif *wlvif;
 
        if (enable) {
-               /* disable dynamic PS when requested by the firmware */
-               wl12xx_for_each_wlvif_sta(wl, wlvif) {
-                       vif = wl12xx_wlvif_to_vif(wlvif);
-                       ieee80211_disable_dyn_ps(vif);
-               }
                set_bit(WL1271_FLAG_SOFT_GEMINI, &wl->flags);
        } else {
                clear_bit(WL1271_FLAG_SOFT_GEMINI, &wl->flags);
                wl12xx_for_each_wlvif_sta(wl, wlvif) {
-                       vif = wl12xx_wlvif_to_vif(wlvif);
-                       ieee80211_enable_dyn_ps(vif);
                        wl1271_recalc_rx_streaming(wl, wlvif);
                }
        }
@@ -237,7 +102,6 @@ static int wl1271_event_process(struct wl1271 *wl, struct event_mailbox *mbox)
 {
        struct ieee80211_vif *vif;
        struct wl12xx_vif *wlvif;
-       int ret;
        u32 vector;
        bool beacon_loss = false;
        bool disconnect_sta = false;
@@ -293,21 +157,6 @@ static int wl1271_event_process(struct wl1271 *wl, struct event_mailbox *mbox)
                beacon_loss = true;
        }
 
-       if (vector & PS_REPORT_EVENT_ID) {
-               wl1271_debug(DEBUG_EVENT, "PS_REPORT_EVENT");
-               wl12xx_for_each_wlvif_sta(wl, wlvif) {
-                       ret = wl1271_event_ps_report(wl, wlvif,
-                                                    mbox, &beacon_loss);
-                       if (ret < 0)
-                               return ret;
-               }
-       }
-
-       if (vector & PSPOLL_DELIVERY_FAILURE_EVENT_ID)
-               wl12xx_for_each_wlvif_sta(wl, wlvif) {
-                       wl1271_event_pspoll_delivery_fail(wl, wlvif);
-               }
-
        if (vector & RSSI_SNR_TRIGGER_0_EVENT_ID) {
                /* TODO: check actual multi-role support */
                wl1271_debug(DEBUG_EVENT, "RSSI_SNR_TRIGGER_0_EVENT");
@@ -344,7 +193,6 @@ static int wl1271_event_process(struct wl1271 *wl, struct event_mailbox *mbox)
 
                /* TODO: configure only the relevant vif */
                wl12xx_for_each_wlvif_sta(wl, wlvif) {
-                       struct ieee80211_vif *vif = wl12xx_wlvif_to_vif(wlvif);
                        bool success;
 
                        if (!test_and_clear_bit(WLVIF_FLAG_CS_PROGRESS,
@@ -352,6 +200,8 @@ static int wl1271_event_process(struct wl1271 *wl, struct event_mailbox *mbox)
                                continue;
 
                        success = mbox->channel_switch_status ? false : true;
+                       vif = wl12xx_wlvif_to_vif(wlvif);
+
                        ieee80211_chswitch_done(vif, success);
                }
        }
index 1d878ba..057d193 100644 (file)
@@ -51,10 +51,10 @@ enum {
        SCAN_COMPLETE_EVENT_ID                   = BIT(10),
        WFD_DISCOVERY_COMPLETE_EVENT_ID          = BIT(11),
        AP_DISCOVERY_COMPLETE_EVENT_ID           = BIT(12),
-       PS_REPORT_EVENT_ID                       = BIT(13),
+       RESERVED1                                = BIT(13),
        PSPOLL_DELIVERY_FAILURE_EVENT_ID         = BIT(14),
-       DISCONNECT_EVENT_COMPLETE_ID             = BIT(15),
-       /* BIT(16) is reserved */
+       ROLE_STOP_COMPLETE_EVENT_ID              = BIT(15),
+       RADAR_DETECTED_EVENT_ID                  = BIT(16),
        CHANNEL_SWITCH_COMPLETE_EVENT_ID         = BIT(17),
        BSS_LOSE_EVENT_ID                        = BIT(18),
        REGAINED_BSS_EVENT_ID                    = BIT(19),
@@ -94,9 +94,9 @@ struct event_mailbox {
        u8 soft_gemini_sense_info;
        u8 soft_gemini_protective_info;
        s8 rssi_snr_trigger_metric[NUM_OF_RSSI_SNR_TRIGGERS];
-       u8 channel_switch_status;
+       u8 change_auto_mode_timeout;
        u8 scheduled_scan_status;
-       u8 ps_status;
+       u8 reserved4;
        /* tuned channel (roc) */
        u8 roc_channel;
 
@@ -119,17 +119,21 @@ struct event_mailbox {
        u8 rx_ba_allowed;
        u8 reserved_6[2];
 
+       /* Channel switch results */
+
+       u8 channel_switch_role_id;
+       u8 channel_switch_status;
+       u8 reserved_7[2];
+
        u8 ps_poll_delivery_failure_role_ids;
        u8 stopped_role_ids;
        u8 started_role_ids;
-       u8 change_auto_mode_timeout;
 
-       u8 reserved_7[12];
+       u8 reserved_8[9];
 } __packed;
 
 int wl1271_event_unmask(struct wl1271 *wl);
 void wl1271_event_mbox_config(struct wl1271 *wl);
 int wl1271_event_handle(struct wl1271 *wl, u8 mbox);
-void wl1271_pspoll_work(struct work_struct *work);
 
 #endif
index ca7ee59..203fbeb 100644 (file)
 int wl1271_init_templates_config(struct wl1271 *wl)
 {
        int ret, i;
+       size_t max_size;
 
        /* send empty templates for fw memory reservation */
-       ret = wl1271_cmd_template_set(wl, CMD_TEMPL_CFG_PROBE_REQ_2_4, NULL,
-                                     WL1271_CMD_TEMPL_DFLT_SIZE,
+       ret = wl1271_cmd_template_set(wl, WL12XX_INVALID_ROLE_ID,
+                                     CMD_TEMPL_CFG_PROBE_REQ_2_4, NULL,
+                                     WL1271_CMD_TEMPL_MAX_SIZE,
                                      0, WL1271_RATE_AUTOMATIC);
        if (ret < 0)
                return ret;
 
-       ret = wl1271_cmd_template_set(wl, CMD_TEMPL_CFG_PROBE_REQ_5,
-                                     NULL, WL1271_CMD_TEMPL_DFLT_SIZE, 0,
+       ret = wl1271_cmd_template_set(wl, WL12XX_INVALID_ROLE_ID,
+                                     CMD_TEMPL_CFG_PROBE_REQ_5,
+                                     NULL, WL1271_CMD_TEMPL_MAX_SIZE, 0,
                                      WL1271_RATE_AUTOMATIC);
        if (ret < 0)
                return ret;
 
-       ret = wl1271_cmd_template_set(wl, CMD_TEMPL_NULL_DATA, NULL,
+       ret = wl1271_cmd_template_set(wl, WL12XX_INVALID_ROLE_ID,
+                                     CMD_TEMPL_NULL_DATA, NULL,
                                      sizeof(struct wl12xx_null_data_template),
                                      0, WL1271_RATE_AUTOMATIC);
        if (ret < 0)
                return ret;
 
-       ret = wl1271_cmd_template_set(wl, CMD_TEMPL_PS_POLL, NULL,
+       ret = wl1271_cmd_template_set(wl, WL12XX_INVALID_ROLE_ID,
+                                     CMD_TEMPL_PS_POLL, NULL,
                                      sizeof(struct wl12xx_ps_poll_template),
                                      0, WL1271_RATE_AUTOMATIC);
        if (ret < 0)
                return ret;
 
-       ret = wl1271_cmd_template_set(wl, CMD_TEMPL_QOS_NULL_DATA, NULL,
+       ret = wl1271_cmd_template_set(wl, WL12XX_INVALID_ROLE_ID,
+                                     CMD_TEMPL_QOS_NULL_DATA, NULL,
                                      sizeof
                                      (struct ieee80211_qos_hdr),
                                      0, WL1271_RATE_AUTOMATIC);
        if (ret < 0)
                return ret;
 
-       ret = wl1271_cmd_template_set(wl, CMD_TEMPL_PROBE_RESPONSE, NULL,
+       ret = wl1271_cmd_template_set(wl, WL12XX_INVALID_ROLE_ID,
+                                     CMD_TEMPL_PROBE_RESPONSE, NULL,
                                      WL1271_CMD_TEMPL_DFLT_SIZE,
                                      0, WL1271_RATE_AUTOMATIC);
        if (ret < 0)
                return ret;
 
-       ret = wl1271_cmd_template_set(wl, CMD_TEMPL_BEACON, NULL,
+       ret = wl1271_cmd_template_set(wl, WL12XX_INVALID_ROLE_ID,
+                                     CMD_TEMPL_BEACON, NULL,
                                      WL1271_CMD_TEMPL_DFLT_SIZE,
                                      0, WL1271_RATE_AUTOMATIC);
        if (ret < 0)
                return ret;
 
-       ret = wl1271_cmd_template_set(wl, CMD_TEMPL_ARP_RSP, NULL,
-                                     sizeof
-                                     (struct wl12xx_arp_rsp_template),
+       max_size = sizeof(struct wl12xx_arp_rsp_template) +
+                  WL1271_EXTRA_SPACE_MAX;
+       ret = wl1271_cmd_template_set(wl, WL12XX_INVALID_ROLE_ID,
+                                     CMD_TEMPL_ARP_RSP, NULL,
+                                     max_size,
                                      0, WL1271_RATE_AUTOMATIC);
        if (ret < 0)
                return ret;
@@ -93,19 +103,22 @@ int wl1271_init_templates_config(struct wl1271 *wl)
         * Put very large empty placeholders for all templates. These
         * reserve memory for later.
         */
-       ret = wl1271_cmd_template_set(wl, CMD_TEMPL_AP_PROBE_RESPONSE, NULL,
+       ret = wl1271_cmd_template_set(wl, WL12XX_INVALID_ROLE_ID,
+                                     CMD_TEMPL_AP_PROBE_RESPONSE, NULL,
                                      WL1271_CMD_TEMPL_MAX_SIZE,
                                      0, WL1271_RATE_AUTOMATIC);
        if (ret < 0)
                return ret;
 
-       ret = wl1271_cmd_template_set(wl, CMD_TEMPL_AP_BEACON, NULL,
+       ret = wl1271_cmd_template_set(wl, WL12XX_INVALID_ROLE_ID,
+                                     CMD_TEMPL_AP_BEACON, NULL,
                                      WL1271_CMD_TEMPL_MAX_SIZE,
                                      0, WL1271_RATE_AUTOMATIC);
        if (ret < 0)
                return ret;
 
-       ret = wl1271_cmd_template_set(wl, CMD_TEMPL_DEAUTH_AP, NULL,
+       ret = wl1271_cmd_template_set(wl, WL12XX_INVALID_ROLE_ID,
+                                     CMD_TEMPL_DEAUTH_AP, NULL,
                                      sizeof
                                      (struct wl12xx_disconn_template),
                                      0, WL1271_RATE_AUTOMATIC);
@@ -113,7 +126,8 @@ int wl1271_init_templates_config(struct wl1271 *wl)
                return ret;
 
        for (i = 0; i < CMD_TEMPL_KLV_IDX_MAX; i++) {
-               ret = wl1271_cmd_template_set(wl, CMD_TEMPL_KLV, NULL,
+               ret = wl1271_cmd_template_set(wl, WL12XX_INVALID_ROLE_ID,
+                                             CMD_TEMPL_KLV, NULL,
                                              sizeof(struct ieee80211_qos_hdr),
                                              i, WL1271_RATE_AUTOMATIC);
                if (ret < 0)
@@ -140,7 +154,8 @@ static int wl1271_ap_init_deauth_template(struct wl1271 *wl,
                                             IEEE80211_STYPE_DEAUTH);
 
        rate = wl1271_tx_min_rate_get(wl, wlvif->basic_rate_set);
-       ret = wl1271_cmd_template_set(wl, CMD_TEMPL_DEAUTH_AP,
+       ret = wl1271_cmd_template_set(wl, wlvif->role_id,
+                                     CMD_TEMPL_DEAUTH_AP,
                                      tmpl, sizeof(*tmpl), 0, rate);
 
 out:
@@ -172,7 +187,8 @@ static int wl1271_ap_init_null_template(struct wl1271 *wl,
        memcpy(nullfunc->addr3, vif->addr, ETH_ALEN);
 
        rate = wl1271_tx_min_rate_get(wl, wlvif->basic_rate_set);
-       ret = wl1271_cmd_template_set(wl, CMD_TEMPL_NULL_DATA, nullfunc,
+       ret = wl1271_cmd_template_set(wl, wlvif->role_id,
+                                     CMD_TEMPL_NULL_DATA, nullfunc,
                                      sizeof(*nullfunc), 0, rate);
 
 out:
@@ -204,7 +220,8 @@ static int wl1271_ap_init_qos_null_template(struct wl1271 *wl,
        memcpy(qosnull->addr3, vif->addr, ETH_ALEN);
 
        rate = wl1271_tx_min_rate_get(wl, wlvif->basic_rate_set);
-       ret = wl1271_cmd_template_set(wl, CMD_TEMPL_QOS_NULL_DATA, qosnull,
+       ret = wl1271_cmd_template_set(wl, wlvif->role_id,
+                                     CMD_TEMPL_QOS_NULL_DATA, qosnull,
                                      sizeof(*qosnull), 0, rate);
 
 out:
index 079ad38..c574a3b 100644 (file)
 #define OCP_STATUS_REQ_FAILED 0x20000
 #define OCP_STATUS_RESP_ERROR 0x30000
 
+struct wl1271_partition_set wl12xx_part_table[PART_TABLE_LEN] = {
+       [PART_DOWN] = {
+               .mem = {
+                       .start = 0x00000000,
+                       .size  = 0x000177c0
+               },
+               .reg = {
+                       .start = REGISTERS_BASE,
+                       .size  = 0x00008800
+               },
+               .mem2 = {
+                       .start = 0x00000000,
+                       .size  = 0x00000000
+               },
+               .mem3 = {
+                       .start = 0x00000000,
+                       .size  = 0x00000000
+               },
+       },
+
+       [PART_WORK] = {
+               .mem = {
+                       .start = 0x00040000,
+                       .size  = 0x00014fc0
+               },
+               .reg = {
+                       .start = REGISTERS_BASE,
+                       .size  = 0x0000a000
+               },
+               .mem2 = {
+                       .start = 0x003004f8,
+                       .size  = 0x00000004
+               },
+               .mem3 = {
+                       .start = 0x00040404,
+                       .size  = 0x00000000
+               },
+       },
+
+       [PART_DRPW] = {
+               .mem = {
+                       .start = 0x00040000,
+                       .size  = 0x00014fc0
+               },
+               .reg = {
+                       .start = DRPW_BASE,
+                       .size  = 0x00006000
+               },
+               .mem2 = {
+                       .start = 0x00000000,
+                       .size  = 0x00000000
+               },
+               .mem3 = {
+                       .start = 0x00000000,
+                       .size  = 0x00000000
+               }
+       }
+};
+
 bool wl1271_set_block_size(struct wl1271 *wl)
 {
        if (wl->if_ops->set_block_size) {
index d398cbc..4fb3dab 100644 (file)
@@ -43,6 +43,8 @@
 
 #define HW_ACCESS_PRAM_MAX_RANGE       0x3c000
 
+extern struct wl1271_partition_set wl12xx_part_table[PART_TABLE_LEN];
+
 struct wl1271;
 
 void wl1271_disable_interrupts(struct wl1271 *wl);
index d5f55a1..adf9bbc 100644 (file)
@@ -1,3 +1,4 @@
+
 /*
  * This file is part of wl1271
  *
@@ -115,6 +116,9 @@ static struct conf_drv_settings default_conf = {
                        [CONF_AP_CONNECTION_PROTECTION_TIME] = 0,
                        [CONF_AP_BT_ACL_VAL_BT_SERVE_TIME] = 25,
                        [CONF_AP_BT_ACL_VAL_WL_SERVE_TIME] = 25,
+                       /* CTS Diluting params */
+                       [CONF_SG_CTS_DILUTED_BAD_RX_PACKETS_TH] = 0,
+                       [CONF_SG_CTS_CHOP_IN_DUAL_ANT_SCO_MASTER] = 0,
                },
                .state = CONF_SG_PROTECTIVE,
        },
@@ -217,6 +221,8 @@ static struct conf_drv_settings default_conf = {
        .conn = {
                .wake_up_event               = CONF_WAKE_UP_EVENT_DTIM,
                .listen_interval             = 1,
+               .suspend_wake_up_event       = CONF_WAKE_UP_EVENT_N_DTIM,
+               .suspend_listen_interval     = 3,
                .bcn_filt_mode               = CONF_BCN_FILT_MODE_ENABLED,
                .bcn_filt_ie_count           = 2,
                .bcn_filt_ie = {
@@ -235,12 +241,13 @@ static struct conf_drv_settings default_conf = {
                .broadcast_timeout           = 20000,
                .rx_broadcast_in_ps          = 1,
                .ps_poll_threshold           = 10,
-               .ps_poll_recovery_period     = 700,
                .bet_enable                  = CONF_BET_MODE_ENABLE,
                .bet_max_consecutive         = 50,
                .psm_entry_retries           = 8,
                .psm_exit_retries            = 16,
                .psm_entry_nullfunc_retries  = 3,
+               .dynamic_ps_timeout          = 100,
+               .forced_ps                   = false,
                .keep_alive_interval         = 55000,
                .max_listen_interval         = 20,
        },
@@ -265,6 +272,7 @@ static struct conf_drv_settings default_conf = {
                .min_dwell_time_passive       = 100000,
                .max_dwell_time_passive       = 100000,
                .num_probe_reqs               = 2,
+               .split_scan_timeout           = 50000,
        },
        .sched_scan = {
                /* sched_scan requires dwell times in TU instead of TU/1000 */
@@ -672,8 +680,6 @@ static int wl1271_plt_init(struct wl1271 *wl)
                if (ret < 0)
                        return ret;
        }
-       if (ret < 0)
-               return ret;
 
        /* Chip-specific initializations */
        ret = wl1271_chip_specific_init(wl);
@@ -985,16 +991,70 @@ out:
        return IRQ_HANDLED;
 }
 
-static int wl1271_fetch_firmware(struct wl1271 *wl)
+struct vif_counter_data {
+       u8 counter;
+
+       struct ieee80211_vif *cur_vif;
+       bool cur_vif_running;
+};
+
+static void wl12xx_vif_count_iter(void *data, u8 *mac,
+                                 struct ieee80211_vif *vif)
+{
+       struct vif_counter_data *counter = data;
+
+       counter->counter++;
+       if (counter->cur_vif == vif)
+               counter->cur_vif_running = true;
+}
+
+/* caller must not hold wl->mutex, as it might deadlock */
+static void wl12xx_get_vif_count(struct ieee80211_hw *hw,
+                              struct ieee80211_vif *cur_vif,
+                              struct vif_counter_data *data)
+{
+       memset(data, 0, sizeof(*data));
+       data->cur_vif = cur_vif;
+
+       ieee80211_iterate_active_interfaces(hw,
+                                           wl12xx_vif_count_iter, data);
+}
+
+static int wl12xx_fetch_firmware(struct wl1271 *wl, bool plt)
 {
        const struct firmware *fw;
        const char *fw_name;
+       enum wl12xx_fw_type fw_type;
        int ret;
 
-       if (wl->chip.id == CHIP_ID_1283_PG20)
-               fw_name = WL128X_FW_NAME;
-       else
-               fw_name = WL127X_FW_NAME;
+       if (plt) {
+               fw_type = WL12XX_FW_TYPE_PLT;
+               if (wl->chip.id == CHIP_ID_1283_PG20)
+                       fw_name = WL128X_PLT_FW_NAME;
+               else
+                       fw_name = WL127X_PLT_FW_NAME;
+       } else {
+               /*
+                * we can't call wl12xx_get_vif_count() here because
+                * wl->mutex is taken, so use the cached last_vif_count value
+                */
+               if (wl->last_vif_count > 1) {
+                       fw_type = WL12XX_FW_TYPE_MULTI;
+                       if (wl->chip.id == CHIP_ID_1283_PG20)
+                               fw_name = WL128X_FW_NAME_MULTI;
+                       else
+                               fw_name = WL127X_FW_NAME_MULTI;
+               } else {
+                       fw_type = WL12XX_FW_TYPE_NORMAL;
+                       if (wl->chip.id == CHIP_ID_1283_PG20)
+                               fw_name = WL128X_FW_NAME_SINGLE;
+                       else
+                               fw_name = WL127X_FW_NAME_SINGLE;
+               }
+       }
+
+       if (wl->fw_type == fw_type)
+               return 0;
 
        wl1271_debug(DEBUG_BOOT, "booting firmware %s", fw_name);
 
@@ -1013,6 +1073,7 @@ static int wl1271_fetch_firmware(struct wl1271 *wl)
        }
 
        vfree(wl->fw);
+       wl->fw_type = WL12XX_FW_TYPE_NONE;
        wl->fw_len = fw->size;
        wl->fw = vmalloc(wl->fw_len);
 
@@ -1024,7 +1085,7 @@ static int wl1271_fetch_firmware(struct wl1271 *wl)
 
        memcpy(wl->fw, fw->data, wl->fw_len);
        ret = 0;
-
+       wl->fw_type = fw_type;
 out:
        release_firmware(fw);
 
@@ -1152,7 +1213,7 @@ static void wl1271_recovery_work(struct work_struct *work)
 
        mutex_lock(&wl->mutex);
 
-       if (wl->state != WL1271_STATE_ON)
+       if (wl->state != WL1271_STATE_ON || wl->plt)
                goto out_unlock;
 
        /* Avoid a recursive recovery */
@@ -1232,10 +1293,9 @@ static int wl1271_setup(struct wl1271 *wl)
        return 0;
 }
 
-static int wl1271_chip_wakeup(struct wl1271 *wl)
+static int wl12xx_set_power_on(struct wl1271 *wl)
 {
-       struct wl1271_partition_set partition;
-       int ret = 0;
+       int ret;
 
        msleep(WL1271_PRE_POWER_ON_SLEEP);
        ret = wl1271_power_on(wl);
@@ -1245,20 +1305,22 @@ static int wl1271_chip_wakeup(struct wl1271 *wl)
        wl1271_io_reset(wl);
        wl1271_io_init(wl);
 
-       /* We don't need a real memory partition here, because we only want
-        * to use the registers at this point. */
-       memset(&partition, 0, sizeof(partition));
-       partition.reg.start = REGISTERS_BASE;
-       partition.reg.size = REGISTERS_DOWN_SIZE;
-       wl1271_set_partition(wl, &partition);
+       wl1271_set_partition(wl, &wl12xx_part_table[PART_DOWN]);
 
        /* ELP module wake up */
        wl1271_fw_wakeup(wl);
 
-       /* whal_FwCtrl_BootSm() */
+out:
+       return ret;
+}
 
-       /* 0. read chip id from CHIP_ID */
-       wl->chip.id = wl1271_read32(wl, CHIP_ID_B);
+static int wl12xx_chip_wakeup(struct wl1271 *wl, bool plt)
+{
+       int ret = 0;
+
+       ret = wl12xx_set_power_on(wl);
+       if (ret < 0)
+               goto out;
 
        /*
         * For wl127x based devices we could use the default block
@@ -1307,11 +1369,9 @@ static int wl1271_chip_wakeup(struct wl1271 *wl)
                goto out;
        }
 
-       if (wl->fw == NULL) {
-               ret = wl1271_fetch_firmware(wl);
-               if (ret < 0)
-                       goto out;
-       }
+       ret = wl12xx_fetch_firmware(wl, plt);
+       if (ret < 0)
+               goto out;
 
        /* No NVS from netlink, try to get it from the filesystem */
        if (wl->nvs == NULL) {
@@ -1343,7 +1403,7 @@ int wl1271_plt_start(struct wl1271 *wl)
 
        while (retries) {
                retries--;
-               ret = wl1271_chip_wakeup(wl);
+               ret = wl12xx_chip_wakeup(wl, true);
                if (ret < 0)
                        goto power_off;
 
@@ -1355,7 +1415,8 @@ int wl1271_plt_start(struct wl1271 *wl)
                if (ret < 0)
                        goto irq_disable;
 
-               wl->state = WL1271_STATE_PLT;
+               wl->plt = true;
+               wl->state = WL1271_STATE_ON;
                wl1271_notice("firmware booted in PLT mode (%s)",
                              wl->chip.fw_ver_str);
 
@@ -1391,41 +1452,51 @@ out:
        return ret;
 }
 
-static int __wl1271_plt_stop(struct wl1271 *wl)
+int wl1271_plt_stop(struct wl1271 *wl)
 {
        int ret = 0;
 
        wl1271_notice("power down");
 
-       if (wl->state != WL1271_STATE_PLT) {
+       /*
+        * Interrupts must be disabled before setting the state to OFF.
+        * Otherwise, the interrupt handler might be called and exit without
+        * reading the interrupt status.
+        */
+       wl1271_disable_interrupts(wl);
+       mutex_lock(&wl->mutex);
+       if (!wl->plt) {
+               mutex_unlock(&wl->mutex);
+
+               /*
+                * This will not necessarily enable interrupts as interrupts
+                * may have been disabled when op_stop was called. It will,
+                * however, balance the above call to disable_interrupts().
+                */
+               wl1271_enable_interrupts(wl);
+
                wl1271_error("cannot power down because not in PLT "
                             "state: %d", wl->state);
                ret = -EBUSY;
                goto out;
        }
 
-       wl1271_power_off(wl);
-
-       wl->state = WL1271_STATE_OFF;
-       wl->rx_counter = 0;
-
        mutex_unlock(&wl->mutex);
-       wl1271_disable_interrupts(wl);
+
        wl1271_flush_deferred_work(wl);
        cancel_work_sync(&wl->netstack_work);
        cancel_work_sync(&wl->recovery_work);
-       mutex_lock(&wl->mutex);
-out:
-       return ret;
-}
-
-int wl1271_plt_stop(struct wl1271 *wl)
-{
-       int ret;
+       cancel_delayed_work_sync(&wl->elp_work);
 
        mutex_lock(&wl->mutex);
-       ret = __wl1271_plt_stop(wl);
+       wl1271_power_off(wl);
+       wl->flags = 0;
+       wl->state = WL1271_STATE_OFF;
+       wl->plt = false;
+       wl->rx_counter = 0;
        mutex_unlock(&wl->mutex);
+
+out:
        return ret;
 }
 
@@ -1574,38 +1645,16 @@ static int wl1271_configure_suspend_sta(struct wl1271 *wl,
        if (ret < 0)
                goto out_unlock;
 
-       /* enter psm if needed*/
-       if (!test_bit(WLVIF_FLAG_PSM, &wlvif->flags)) {
-               DECLARE_COMPLETION_ONSTACK(compl);
+       ret = wl1271_acx_wake_up_conditions(wl, wlvif,
+                                   wl->conf.conn.suspend_wake_up_event,
+                                   wl->conf.conn.suspend_listen_interval);
 
-               wlvif->ps_compl = &compl;
-               ret = wl1271_ps_set_mode(wl, wlvif, STATION_POWER_SAVE_MODE,
-                                  wlvif->basic_rate, true);
-               if (ret < 0)
-                       goto out_sleep;
-
-               /* we must unlock here so we will be able to get events */
-               wl1271_ps_elp_sleep(wl);
-               mutex_unlock(&wl->mutex);
-
-               ret = wait_for_completion_timeout(
-                       &compl, msecs_to_jiffies(WL1271_PS_COMPLETE_TIMEOUT));
+       if (ret < 0)
+               wl1271_error("suspend: set wake up conditions failed: %d", ret);
 
-               mutex_lock(&wl->mutex);
-               if (ret <= 0) {
-                       wl1271_warning("couldn't enter ps mode!");
-                       ret = -EBUSY;
-                       goto out_cleanup;
-               }
 
-               ret = wl1271_ps_elp_wakeup(wl);
-               if (ret < 0)
-                       goto out_cleanup;
-       }
-out_sleep:
        wl1271_ps_elp_sleep(wl);
-out_cleanup:
-       wlvif->ps_compl = NULL;
+
 out_unlock:
        mutex_unlock(&wl->mutex);
        return ret;
@@ -1648,11 +1697,11 @@ static int wl1271_configure_suspend(struct wl1271 *wl,
 static void wl1271_configure_resume(struct wl1271 *wl,
                                    struct wl12xx_vif *wlvif)
 {
-       int ret;
-       bool is_sta = wlvif->bss_type == BSS_TYPE_STA_BSS;
+       int ret = 0;
        bool is_ap = wlvif->bss_type == BSS_TYPE_AP_BSS;
+       bool is_sta = wlvif->bss_type == BSS_TYPE_STA_BSS;
 
-       if (!is_sta && !is_ap)
+       if ((!is_ap) && (!is_sta))
                return;
 
        mutex_lock(&wl->mutex);
@@ -1661,12 +1710,16 @@ static void wl1271_configure_resume(struct wl1271 *wl,
                goto out;
 
        if (is_sta) {
-               /* exit psm if it wasn't configured */
-               if (!test_bit(WLVIF_FLAG_PSM_REQUESTED, &wlvif->flags))
-                       wl1271_ps_set_mode(wl, wlvif, STATION_ACTIVE_MODE,
-                                          wlvif->basic_rate, true);
+               ret = wl1271_acx_wake_up_conditions(wl, wlvif,
+                                   wl->conf.conn.wake_up_event,
+                                   wl->conf.conn.listen_interval);
+
+               if (ret < 0)
+                       wl1271_error("resume: wake up conditions failed: %d",
+                                    ret);
+
        } else if (is_ap) {
-               wl1271_acx_beacon_filter_opt(wl, wlvif, false);
+               ret = wl1271_acx_beacon_filter_opt(wl, wlvif, false);
        }
 
        wl1271_ps_elp_sleep(wl);
@@ -1709,9 +1762,6 @@ static int wl1271_op_suspend(struct ieee80211_hw *hw,
 
        wl1271_enable_interrupts(wl);
        flush_work(&wl->tx_work);
-       wl12xx_for_each_wlvif(wl, wlvif) {
-               flush_delayed_work(&wlvif->pspoll_work);
-       }
        flush_delayed_work(&wl->elp_work);
 
        return 0;
@@ -1778,11 +1828,25 @@ static void wl1271_op_stop(struct ieee80211_hw *hw)
 
        wl1271_debug(DEBUG_MAC80211, "mac80211 stop");
 
+       /*
+        * Interrupts must be disabled before setting the state to OFF.
+        * Otherwise, the interrupt handler might be called and exit without
+        * reading the interrupt status.
+        */
+       wl1271_disable_interrupts(wl);
        mutex_lock(&wl->mutex);
        if (wl->state == WL1271_STATE_OFF) {
                mutex_unlock(&wl->mutex);
+
+               /*
+                * This will not necessarily enable interrupts as interrupts
+                * may have been disabled when op_stop was called. It will,
+                * however, balance the above call to disable_interrupts().
+                */
+               wl1271_enable_interrupts(wl);
                return;
        }
+
        /*
         * this must be before the cancel_work calls below, so that the work
         * functions don't perform further work.
@@ -1794,7 +1858,6 @@ static void wl1271_op_stop(struct ieee80211_hw *hw)
        list_del(&wl->list);
        mutex_unlock(&wl_list_mutex);
 
-       wl1271_disable_interrupts(wl);
        wl1271_flush_deferred_work(wl);
        cancel_delayed_work_sync(&wl->scan_complete_work);
        cancel_work_sync(&wl->netstack_work);
@@ -1969,7 +2032,6 @@ static int wl12xx_init_vif_data(struct wl1271 *wl, struct ieee80211_vif *vif)
                  wl1271_rx_streaming_enable_work);
        INIT_WORK(&wlvif->rx_streaming_disable_work,
                  wl1271_rx_streaming_disable_work);
-       INIT_DELAYED_WORK(&wlvif->pspoll_work, wl1271_pspoll_work);
        INIT_LIST_HEAD(&wlvif->list);
 
        setup_timer(&wlvif->rx_streaming_timer, wl1271_rx_streaming_timer,
@@ -1986,7 +2048,7 @@ static bool wl12xx_init_fw(struct wl1271 *wl)
 
        while (retries) {
                retries--;
-               ret = wl1271_chip_wakeup(wl);
+               ret = wl12xx_chip_wakeup(wl, false);
                if (ret < 0)
                        goto power_off;
 
@@ -2051,30 +2113,77 @@ static bool wl12xx_dev_role_started(struct wl12xx_vif *wlvif)
        return wlvif->dev_hlid != WL12XX_INVALID_LINK_ID;
 }
 
+/*
+ * Check whether a fw switch (i.e. moving from one loaded
+ * fw to another) is needed. This function is also responsible
+ * for updating wl->last_vif_count, so it must be called before
+ * loading a non-plt fw (so the correct fw (single-role/multi-role)
+ * will be used).
+ */
+static bool wl12xx_need_fw_change(struct wl1271 *wl,
+                                 struct vif_counter_data vif_counter_data,
+                                 bool add)
+{
+       enum wl12xx_fw_type current_fw = wl->fw_type;
+       u8 vif_count = vif_counter_data.counter;
+
+       if (test_bit(WL1271_FLAG_VIF_CHANGE_IN_PROGRESS, &wl->flags))
+               return false;
+
+       /* increase the vif count if this is a new vif */
+       if (add && !vif_counter_data.cur_vif_running)
+               vif_count++;
+
+       wl->last_vif_count = vif_count;
+
+       /* no need for fw change if the device is OFF */
+       if (wl->state == WL1271_STATE_OFF)
+               return false;
+
+       if (vif_count > 1 && current_fw == WL12XX_FW_TYPE_NORMAL)
+               return true;
+       if (vif_count <= 1 && current_fw == WL12XX_FW_TYPE_MULTI)
+               return true;
+
+       return false;
+}
+
+/*
+ * Enter "forced psm". Make sure the sta is in psm against the ap,
+ * to make the fw switch a bit more disconnection-persistent.
+ */
+static void wl12xx_force_active_psm(struct wl1271 *wl)
+{
+       struct wl12xx_vif *wlvif;
+
+       wl12xx_for_each_wlvif_sta(wl, wlvif) {
+               wl1271_ps_set_mode(wl, wlvif, STATION_POWER_SAVE_MODE);
+       }
+}
+
 static int wl1271_op_add_interface(struct ieee80211_hw *hw,
                                   struct ieee80211_vif *vif)
 {
        struct wl1271 *wl = hw->priv;
        struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
+       struct vif_counter_data vif_count;
        int ret = 0;
        u8 role_type;
        bool booted = false;
 
+       vif->driver_flags |= IEEE80211_VIF_BEACON_FILTER |
+                            IEEE80211_VIF_SUPPORTS_CQM_RSSI;
+
        wl1271_debug(DEBUG_MAC80211, "mac80211 add interface type %d mac %pM",
                     ieee80211_vif_type_p2p(vif), vif->addr);
 
+       wl12xx_get_vif_count(hw, vif, &vif_count);
+
        mutex_lock(&wl->mutex);
        ret = wl1271_ps_elp_wakeup(wl);
        if (ret < 0)
                goto out_unlock;
 
-       if (wl->vif) {
-               wl1271_debug(DEBUG_MAC80211,
-                            "multiple vifs are not supported yet");
-               ret = -EBUSY;
-               goto out;
-       }
-
        /*
         * in some very corner case HW recovery scenarios its possible to
         * get here before __wl1271_op_remove_interface is complete, so
@@ -2086,6 +2195,7 @@ static int wl1271_op_add_interface(struct ieee80211_hw *hw,
                goto out;
        }
 
+
        ret = wl12xx_init_vif_data(wl, vif);
        if (ret < 0)
                goto out;
@@ -2097,6 +2207,13 @@ static int wl1271_op_add_interface(struct ieee80211_hw *hw,
                goto out;
        }
 
+       if (wl12xx_need_fw_change(wl, vif_count, true)) {
+               wl12xx_force_active_psm(wl);
+               mutex_unlock(&wl->mutex);
+               wl1271_recovery_work(&wl->recovery_work);
+               return 0;
+       }
+
        /*
         * TODO: after the nvs issue will be solved, move this block
         * to start(), and make sure here the driver is ON.
@@ -2106,7 +2223,7 @@ static int wl1271_op_add_interface(struct ieee80211_hw *hw,
                 * we still need this in order to configure the fw
                 * while uploading the nvs
                 */
-               memcpy(wl->mac_addr, vif->addr, ETH_ALEN);
+               memcpy(wl->addresses[0].addr, vif->addr, ETH_ALEN);
 
                booted = wl12xx_init_fw(wl);
                if (!booted) {
@@ -2139,7 +2256,6 @@ static int wl1271_op_add_interface(struct ieee80211_hw *hw,
        if (ret < 0)
                goto out;
 
-       wl->vif = vif;
        list_add(&wlvif->list, &wl->wlvif_list);
        set_bit(WLVIF_FLAG_INITIALIZED, &wlvif->flags);
 
@@ -2172,18 +2288,12 @@ static void __wl1271_op_remove_interface(struct wl1271 *wl,
        if (!test_and_clear_bit(WLVIF_FLAG_INITIALIZED, &wlvif->flags))
                return;
 
-       wl->vif = NULL;
-
        /* because of hardware recovery, we may get here twice */
        if (wl->state != WL1271_STATE_ON)
                return;
 
        wl1271_info("down");
 
-       /* enable dyn ps just in case (if left on due to fw crash etc) */
-       if (wlvif->bss_type == BSS_TYPE_STA_BSS)
-               ieee80211_enable_dyn_ps(vif);
-
        if (wl->scan.state != WL1271_SCAN_STATE_IDLE &&
            wl->scan_vif == vif) {
                wl->scan.state = WL1271_SCAN_STATE_IDLE;
@@ -2250,10 +2360,10 @@ deinit:
                wl->sta_count--;
 
        mutex_unlock(&wl->mutex);
+
        del_timer_sync(&wlvif->rx_streaming_timer);
        cancel_work_sync(&wlvif->rx_streaming_enable_work);
        cancel_work_sync(&wlvif->rx_streaming_disable_work);
-       cancel_delayed_work_sync(&wlvif->pspoll_work);
 
        mutex_lock(&wl->mutex);
 }
@@ -2264,7 +2374,10 @@ static void wl1271_op_remove_interface(struct ieee80211_hw *hw,
        struct wl1271 *wl = hw->priv;
        struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
        struct wl12xx_vif *iter;
+       struct vif_counter_data vif_count;
+       bool cancel_recovery = true;
 
+       wl12xx_get_vif_count(hw, vif, &vif_count);
        mutex_lock(&wl->mutex);
 
        if (wl->state == WL1271_STATE_OFF ||
@@ -2283,20 +2396,33 @@ static void wl1271_op_remove_interface(struct ieee80211_hw *hw,
                break;
        }
        WARN_ON(iter != wlvif);
+       if (wl12xx_need_fw_change(wl, vif_count, false)) {
+               wl12xx_force_active_psm(wl);
+               wl12xx_queue_recovery_work(wl);
+               cancel_recovery = false;
+       }
 out:
        mutex_unlock(&wl->mutex);
-       cancel_work_sync(&wl->recovery_work);
+       if (cancel_recovery)
+               cancel_work_sync(&wl->recovery_work);
 }
 
 static int wl12xx_op_change_interface(struct ieee80211_hw *hw,
                                      struct ieee80211_vif *vif,
                                      enum nl80211_iftype new_type, bool p2p)
 {
+       struct wl1271 *wl = hw->priv;
+       int ret;
+
+       set_bit(WL1271_FLAG_VIF_CHANGE_IN_PROGRESS, &wl->flags);
        wl1271_op_remove_interface(hw, vif);
 
        vif->type = ieee80211_iftype_p2p(new_type, p2p);
        vif->p2p = p2p;
-       return wl1271_op_add_interface(hw, vif);
+       ret = wl1271_op_add_interface(hw, vif);
+
+       clear_bit(WL1271_FLAG_VIF_CHANGE_IN_PROGRESS, &wl->flags);
+       return ret;
 }
 
 static int wl1271_join(struct wl1271 *wl, struct wl12xx_vif *wlvif,
@@ -2317,6 +2443,9 @@ static int wl1271_join(struct wl1271 *wl, struct wl12xx_vif *wlvif,
        if (test_bit(WLVIF_FLAG_STA_ASSOCIATED, &wlvif->flags))
                wl1271_info("JOIN while associated.");
 
+       /* clear encryption type */
+       wlvif->encryption_type = KEY_NONE;
+
        if (set_assoc)
                set_bit(WLVIF_FLAG_STA_ASSOCIATED, &wlvif->flags);
 
@@ -2500,38 +2629,41 @@ static int wl12xx_config_vif(struct wl1271 *wl, struct wl12xx_vif *wlvif,
                }
        }
 
-       /*
-        * if mac80211 changes the PSM mode, make sure the mode is not
-        * incorrectly changed after the pspoll failure active window.
-        */
-       if (changed & IEEE80211_CONF_CHANGE_PS)
-               clear_bit(WLVIF_FLAG_PSPOLL_FAILURE, &wlvif->flags);
+       if ((changed & IEEE80211_CONF_CHANGE_PS) && !is_ap) {
 
-       if (conf->flags & IEEE80211_CONF_PS &&
-           !test_bit(WLVIF_FLAG_PSM_REQUESTED, &wlvif->flags)) {
-               set_bit(WLVIF_FLAG_PSM_REQUESTED, &wlvif->flags);
+               if ((conf->flags & IEEE80211_CONF_PS) &&
+                   test_bit(WLVIF_FLAG_STA_ASSOCIATED, &wlvif->flags) &&
+                   !test_bit(WLVIF_FLAG_IN_PS, &wlvif->flags)) {
 
-               /*
-                * We enter PSM only if we're already associated.
-                * If we're not, we'll enter it when joining an SSID,
-                * through the bss_info_changed() hook.
-                */
-               if (test_bit(WLVIF_FLAG_STA_ASSOCIATED, &wlvif->flags)) {
-                       wl1271_debug(DEBUG_PSM, "psm enabled");
-                       ret = wl1271_ps_set_mode(wl, wlvif,
-                                                STATION_POWER_SAVE_MODE,
-                                                wlvif->basic_rate, true);
-               }
-       } else if (!(conf->flags & IEEE80211_CONF_PS) &&
-                  test_bit(WLVIF_FLAG_PSM_REQUESTED, &wlvif->flags)) {
-               wl1271_debug(DEBUG_PSM, "psm disabled");
+                       int ps_mode;
+                       char *ps_mode_str;
 
-               clear_bit(WLVIF_FLAG_PSM_REQUESTED, &wlvif->flags);
+                       if (wl->conf.conn.forced_ps) {
+                               ps_mode = STATION_POWER_SAVE_MODE;
+                               ps_mode_str = "forced";
+                       } else {
+                               ps_mode = STATION_AUTO_PS_MODE;
+                               ps_mode_str = "auto";
+                       }
+
+                       wl1271_debug(DEBUG_PSM, "%s ps enabled", ps_mode_str);
+
+                       ret = wl1271_ps_set_mode(wl, wlvif, ps_mode);
+
+                       if (ret < 0)
+                               wl1271_warning("enter %s ps failed %d",
+                                              ps_mode_str, ret);
+
+               } else if (!(conf->flags & IEEE80211_CONF_PS) &&
+                          test_bit(WLVIF_FLAG_IN_PS, &wlvif->flags)) {
+
+                       wl1271_debug(DEBUG_PSM, "auto ps disabled");
 
-               if (test_bit(WLVIF_FLAG_PSM, &wlvif->flags))
                        ret = wl1271_ps_set_mode(wl, wlvif,
-                                                STATION_ACTIVE_MODE,
-                                                wlvif->basic_rate, true);
+                                                STATION_ACTIVE_MODE);
+                       if (ret < 0)
+                               wl1271_warning("exit auto ps failed %d", ret);
+               }
        }
 
        if (conf->power_level != wlvif->power_level) {
@@ -2971,6 +3103,21 @@ static int wl1271_op_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
                        wl1271_error("Could not add or replace key");
                        goto out_sleep;
                }
+
+               /*
+                * reconfiguring arp response if the unicast (or common)
+                * encryption key type was changed
+                */
+               if (wlvif->bss_type == BSS_TYPE_STA_BSS &&
+                   (sta || key_type == KEY_WEP) &&
+                   wlvif->encryption_type != key_type) {
+                       wlvif->encryption_type = key_type;
+                       ret = wl1271_cmd_build_arp_rsp(wl, wlvif);
+                       if (ret < 0) {
+                               wl1271_warning("build arp rsp failed: %d", ret);
+                               goto out_sleep;
+                       }
+               }
                break;
 
        case DISABLE_KEY:
@@ -3040,10 +3187,6 @@ static int wl1271_op_hw_scan(struct ieee80211_hw *hw,
                goto out_sleep;
        }
 
-       /* cancel ROC before scanning */
-       if (wl12xx_dev_role_started(wlvif))
-               wl12xx_stop_dev(wl, wlvif);
-
        ret = wl1271_scan(hw->priv, vif, ssid, len, req);
 out_sleep:
        wl1271_ps_elp_sleep(wl);
@@ -3105,6 +3248,11 @@ static int wl1271_op_sched_scan_start(struct ieee80211_hw *hw,
 
        mutex_lock(&wl->mutex);
 
+       if (wl->state == WL1271_STATE_OFF) {
+               ret = -EAGAIN;
+               goto out;
+       }
+
        ret = wl1271_ps_elp_wakeup(wl);
        if (ret < 0)
                goto out;
@@ -3136,6 +3284,9 @@ static void wl1271_op_sched_scan_stop(struct ieee80211_hw *hw,
 
        mutex_lock(&wl->mutex);
 
+       if (wl->state == WL1271_STATE_OFF)
+               goto out;
+
        ret = wl1271_ps_elp_wakeup(wl);
        if (ret < 0)
                goto out;
@@ -3263,6 +3414,7 @@ static void wl12xx_remove_vendor_ie(struct sk_buff *skb,
 static int wl1271_ap_set_probe_resp_tmpl(struct wl1271 *wl, u32 rates,
                                         struct ieee80211_vif *vif)
 {
+       struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
        struct sk_buff *skb;
        int ret;
 
@@ -3270,7 +3422,7 @@ static int wl1271_ap_set_probe_resp_tmpl(struct wl1271 *wl, u32 rates,
        if (!skb)
                return -EOPNOTSUPP;
 
-       ret = wl1271_cmd_template_set(wl,
+       ret = wl1271_cmd_template_set(wl, wlvif->role_id,
                                      CMD_TEMPL_AP_PROBE_RESPONSE,
                                      skb->data,
                                      skb->len, 0,
@@ -3294,7 +3446,7 @@ static int wl1271_ap_set_probe_resp_tmpl_legacy(struct wl1271 *wl,
 
        /* no need to change probe response if the SSID is set correctly */
        if (wlvif->ssid_len > 0)
-               return wl1271_cmd_template_set(wl,
+               return wl1271_cmd_template_set(wl, wlvif->role_id,
                                               CMD_TEMPL_AP_PROBE_RESPONSE,
                                               probe_rsp_data,
                                               probe_rsp_len, 0,
@@ -3331,7 +3483,7 @@ static int wl1271_ap_set_probe_resp_tmpl_legacy(struct wl1271 *wl,
               ptr, probe_rsp_len - (ptr - probe_rsp_data));
        templ_len += probe_rsp_len - (ptr - probe_rsp_data);
 
-       return wl1271_cmd_template_set(wl,
+       return wl1271_cmd_template_set(wl, wlvif->role_id,
                                       CMD_TEMPL_AP_PROBE_RESPONSE,
                                       probe_rsp_templ,
                                       templ_len, 0,
@@ -3428,7 +3580,7 @@ static int wl1271_bss_beacon_info_changed(struct wl1271 *wl,
                min_rate = wl1271_tx_min_rate_get(wl, wlvif->basic_rate_set);
                tmpl_id = is_ap ? CMD_TEMPL_AP_BEACON :
                                  CMD_TEMPL_BEACON;
-               ret = wl1271_cmd_template_set(wl, tmpl_id,
+               ret = wl1271_cmd_template_set(wl, wlvif->role_id, tmpl_id,
                                              beacon->data,
                                              beacon->len, 0,
                                              min_rate);
@@ -3467,7 +3619,7 @@ static int wl1271_bss_beacon_info_changed(struct wl1271 *wl,
                                                beacon->len,
                                                min_rate);
                else
-                       ret = wl1271_cmd_template_set(wl,
+                       ret = wl1271_cmd_template_set(wl, wlvif->role_id,
                                                CMD_TEMPL_PROBE_RESPONSE,
                                                beacon->data,
                                                beacon->len, 0,
@@ -3631,7 +3783,8 @@ static void wl1271_bss_info_changed_sta(struct wl1271 *wl,
                wlvif->rssi_thold = bss_conf->cqm_rssi_thold;
        }
 
-       if (changed & BSS_CHANGED_BSSID)
+       if (changed & BSS_CHANGED_BSSID &&
+           (is_ibss || bss_conf->assoc))
                if (!is_zero_ether_addr(bss_conf->bssid)) {
                        ret = wl12xx_cmd_build_null_data(wl, wlvif);
                        if (ret < 0)
@@ -3670,8 +3823,6 @@ sta_not_found:
                        wlvif->aid = bss_conf->aid;
                        set_assoc = true;
 
-                       wlvif->ps_poll_failures = 0;
-
                        /*
                         * use basic rates from AP, and determine lowest rate
                         * to use with control frames.
@@ -3731,9 +3882,6 @@ sta_not_found:
                        dev_kfree_skb(wlvif->probereq);
                        wlvif->probereq = NULL;
 
-                       /* re-enable dynamic ps - just in case */
-                       ieee80211_enable_dyn_ps(vif);
-
                        /* revert back to minimum rates for the current band */
                        wl1271_set_band_rate(wl, wlvif);
                        wlvif->basic_rate =
@@ -3807,34 +3955,6 @@ sta_not_found:
        if (ret < 0)
                goto out;
 
-       if (changed & BSS_CHANGED_ARP_FILTER) {
-               __be32 addr = bss_conf->arp_addr_list[0];
-               WARN_ON(wlvif->bss_type != BSS_TYPE_STA_BSS);
-
-               if (bss_conf->arp_addr_cnt == 1 &&
-                   bss_conf->arp_filter_enabled) {
-                       /*
-                        * The template should have been configured only upon
-                        * association. however, it seems that the correct ip
-                        * isn't being set (when sending), so we have to
-                        * reconfigure the template upon every ip change.
-                        */
-                       ret = wl1271_cmd_build_arp_rsp(wl, wlvif, addr);
-                       if (ret < 0) {
-                               wl1271_warning("build arp rsp failed: %d", ret);
-                               goto out;
-                       }
-
-                       ret = wl1271_acx_arp_ip_filter(wl, wlvif,
-                               ACX_ARP_FILTER_ARP_FILTERING,
-                               addr);
-               } else
-                       ret = wl1271_acx_arp_ip_filter(wl, wlvif, 0, addr);
-
-               if (ret < 0)
-                       goto out;
-       }
-
        if (do_join) {
                ret = wl1271_join(wl, wlvif, set_assoc);
                if (ret < 0) {
@@ -3860,19 +3980,6 @@ sta_not_found:
                        if (ret < 0)
                                goto out;
                }
-
-               /* If we want to go in PSM but we're not there yet */
-               if (test_bit(WLVIF_FLAG_PSM_REQUESTED, &wlvif->flags) &&
-                   !test_bit(WLVIF_FLAG_PSM, &wlvif->flags)) {
-                       enum wl1271_cmd_ps_mode mode;
-
-                       mode = STATION_POWER_SAVE_MODE;
-                       ret = wl1271_ps_set_mode(wl, wlvif, mode,
-                                                wlvif->basic_rate,
-                                                true);
-                       if (ret < 0)
-                               goto out;
-               }
        }
 
        /* Handle new association with HT. Do this after join. */
@@ -3914,6 +4021,41 @@ sta_not_found:
                }
        }
 
+       /* Handle arp filtering. Done after join. */
+       if ((changed & BSS_CHANGED_ARP_FILTER) ||
+           (!is_ibss && (changed & BSS_CHANGED_QOS))) {
+               __be32 addr = bss_conf->arp_addr_list[0];
+               wlvif->sta.qos = bss_conf->qos;
+               WARN_ON(wlvif->bss_type != BSS_TYPE_STA_BSS);
+
+               if (bss_conf->arp_addr_cnt == 1 &&
+                   bss_conf->arp_filter_enabled) {
+                       wlvif->ip_addr = addr;
+                       /*
+                        * The template should have been configured only upon
+                        * association. however, it seems that the correct ip
+                        * isn't being set (when sending), so we have to
+                        * reconfigure the template upon every ip change.
+                        */
+                       ret = wl1271_cmd_build_arp_rsp(wl, wlvif);
+                       if (ret < 0) {
+                               wl1271_warning("build arp rsp failed: %d", ret);
+                               goto out;
+                       }
+
+                       ret = wl1271_acx_arp_ip_filter(wl, wlvif,
+                               (ACX_ARP_FILTER_ARP_FILTERING |
+                                ACX_ARP_FILTER_AUTO_ARP),
+                               addr);
+               } else {
+                       wlvif->ip_addr = 0;
+                       ret = wl1271_acx_arp_ip_filter(wl, wlvif, 0, addr);
+               }
+
+               if (ret < 0)
+                       goto out;
+       }
+
 out:
        return;
 }
@@ -4009,6 +4151,7 @@ static u64 wl1271_op_get_tsf(struct ieee80211_hw *hw,
 {
 
        struct wl1271 *wl = hw->priv;
+       struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
        u64 mactime = ULLONG_MAX;
        int ret;
 
@@ -4023,7 +4166,7 @@ static u64 wl1271_op_get_tsf(struct ieee80211_hw *hw,
        if (ret < 0)
                goto out;
 
-       ret = wl1271_acx_tsf_info(wl, &mactime);
+       ret = wl12xx_acx_tsf_info(wl, wlvif, &mactime);
        if (ret < 0)
                goto out_sleep;
 
@@ -4370,7 +4513,7 @@ static void wl12xx_op_channel_switch(struct ieee80211_hw *hw,
 
        /* TODO: change mac80211 to pass vif as param */
        wl12xx_for_each_wlvif_sta(wl, wlvif) {
-               ret = wl12xx_cmd_channel_switch(wl, ch_switch);
+               ret = wl12xx_cmd_channel_switch(wl, wlvif, ch_switch);
 
                if (!ret)
                        set_bit(WLVIF_FLAG_CS_PROGRESS, &wlvif->flags);
@@ -4464,6 +4607,7 @@ static struct ieee80211_channel wl1271_channels[] = {
 /* mapping to indexes for wl1271_rates */
 static const u8 wl1271_rate_to_idx_2ghz[] = {
        /* MCS rates are used only with 11n */
+       7,                            /* CONF_HW_RXTX_RATE_MCS7_SGI */
        7,                            /* CONF_HW_RXTX_RATE_MCS7 */
        6,                            /* CONF_HW_RXTX_RATE_MCS6 */
        5,                            /* CONF_HW_RXTX_RATE_MCS5 */
@@ -4585,6 +4729,7 @@ static struct ieee80211_channel wl1271_channels_5ghz[] = {
 /* mapping to indexes for wl1271_rates_5ghz */
 static const u8 wl1271_rate_to_idx_5ghz[] = {
        /* MCS rates are used only with 11n */
+       7,                            /* CONF_HW_RXTX_RATE_MCS7_SGI */
        7,                            /* CONF_HW_RXTX_RATE_MCS7 */
        6,                            /* CONF_HW_RXTX_RATE_MCS6 */
        5,                            /* CONF_HW_RXTX_RATE_MCS5 */
@@ -4825,13 +4970,120 @@ static struct bin_attribute fwlog_attr = {
        .read = wl1271_sysfs_read_fwlog,
 };
 
+static bool wl12xx_mac_in_fuse(struct wl1271 *wl)
+{
+       bool supported = false;
+       u8 major, minor;
+
+       if (wl->chip.id == CHIP_ID_1283_PG20) {
+               major = WL128X_PG_GET_MAJOR(wl->hw_pg_ver);
+               minor = WL128X_PG_GET_MINOR(wl->hw_pg_ver);
+
+               /* in wl128x we have the MAC address if the PG is >= (2, 1) */
+               if (major > 2 || (major == 2 && minor >= 1))
+                       supported = true;
+       } else {
+               major = WL127X_PG_GET_MAJOR(wl->hw_pg_ver);
+               minor = WL127X_PG_GET_MINOR(wl->hw_pg_ver);
+
+               /* in wl127x we have the MAC address if the PG is >= (3, 1) */
+               if (major == 3 && minor >= 1)
+                       supported = true;
+       }
+
+       wl1271_debug(DEBUG_PROBE,
+                    "PG Ver major = %d minor = %d, MAC %s present",
+                    major, minor, supported ? "is" : "is not");
+
+       return supported;
+}
+
+static void wl12xx_derive_mac_addresses(struct wl1271 *wl,
+                                       u32 oui, u32 nic, int n)
+{
+       int i;
+
+       wl1271_debug(DEBUG_PROBE, "base address: oui %06x nic %06x, n %d",
+                    oui, nic, n);
+
+       if (nic + n - 1 > 0xffffff)
+               wl1271_warning("NIC part of the MAC address wraps around!");
+
+       for (i = 0; i < n; i++) {
+               wl->addresses[i].addr[0] = (u8)(oui >> 16);
+               wl->addresses[i].addr[1] = (u8)(oui >> 8);
+               wl->addresses[i].addr[2] = (u8) oui;
+               wl->addresses[i].addr[3] = (u8)(nic >> 16);
+               wl->addresses[i].addr[4] = (u8)(nic >> 8);
+               wl->addresses[i].addr[5] = (u8) nic;
+               nic++;
+       }
+
+       wl->hw->wiphy->n_addresses = n;
+       wl->hw->wiphy->addresses = wl->addresses;
+}
+
+static void wl12xx_get_fuse_mac(struct wl1271 *wl)
+{
+       u32 mac1, mac2;
+
+       wl1271_set_partition(wl, &wl12xx_part_table[PART_DRPW]);
+
+       mac1 = wl1271_read32(wl, WL12XX_REG_FUSE_BD_ADDR_1);
+       mac2 = wl1271_read32(wl, WL12XX_REG_FUSE_BD_ADDR_2);
+
+       /* these are the two parts of the BD_ADDR */
+       wl->fuse_oui_addr = ((mac2 & 0xffff) << 8) +
+               ((mac1 & 0xff000000) >> 24);
+       wl->fuse_nic_addr = mac1 & 0xffffff;
+
+       wl1271_set_partition(wl, &wl12xx_part_table[PART_DOWN]);
+}
+
+static int wl12xx_get_hw_info(struct wl1271 *wl)
+{
+       int ret;
+       u32 die_info;
+
+       ret = wl12xx_set_power_on(wl);
+       if (ret < 0)
+               goto out;
+
+       wl->chip.id = wl1271_read32(wl, CHIP_ID_B);
+
+       if (wl->chip.id == CHIP_ID_1283_PG20)
+               die_info = wl1271_top_reg_read(wl, WL128X_REG_FUSE_DATA_2_1);
+       else
+               die_info = wl1271_top_reg_read(wl, WL127X_REG_FUSE_DATA_2_1);
+
+       wl->hw_pg_ver = (s8) (die_info & PG_VER_MASK) >> PG_VER_OFFSET;
+
+       if (!wl12xx_mac_in_fuse(wl)) {
+               wl->fuse_oui_addr = 0;
+               wl->fuse_nic_addr = 0;
+       } else {
+               wl12xx_get_fuse_mac(wl);
+       }
+
+       wl1271_power_off(wl);
+out:
+       return ret;
+}
+
 static int wl1271_register_hw(struct wl1271 *wl)
 {
        int ret;
+       u32 oui_addr = 0, nic_addr = 0;
 
        if (wl->mac80211_registered)
                return 0;
 
+       ret = wl12xx_get_hw_info(wl);
+       if (ret < 0) {
+               wl1271_error("couldn't get hw info");
+               goto out;
+       }
+
        ret = wl1271_fetch_nvs(wl);
        if (ret == 0) {
                /* NOTE: The wl->nvs->nvs element must be first, in
@@ -4840,20 +5092,25 @@ static int wl1271_register_hw(struct wl1271 *wl)
                 */
                u8 *nvs_ptr = (u8 *)wl->nvs;
 
-               wl->mac_addr[0] = nvs_ptr[11];
-               wl->mac_addr[1] = nvs_ptr[10];
-               wl->mac_addr[2] = nvs_ptr[6];
-               wl->mac_addr[3] = nvs_ptr[5];
-               wl->mac_addr[4] = nvs_ptr[4];
-               wl->mac_addr[5] = nvs_ptr[3];
+               oui_addr =
+                       (nvs_ptr[11] << 16) + (nvs_ptr[10] << 8) + nvs_ptr[6];
+               nic_addr =
+                       (nvs_ptr[5] << 16) + (nvs_ptr[4] << 8) + nvs_ptr[3];
        }
 
-       SET_IEEE80211_PERM_ADDR(wl->hw, wl->mac_addr);
+       /* if the MAC address is zeroed in the NVS derive from fuse */
+       if (oui_addr == 0 && nic_addr == 0) {
+               oui_addr = wl->fuse_oui_addr;
+               /* fuse has the BD_ADDR, the WLAN addresses are the next two */
+               nic_addr = wl->fuse_nic_addr + 1;
+       }
+
+       wl12xx_derive_mac_addresses(wl, oui_addr, nic_addr, 2);
 
        ret = ieee80211_register_hw(wl->hw);
        if (ret < 0) {
                wl1271_error("unable to register mac80211 hw: %d", ret);
-               return ret;
+               goto out;
        }
 
        wl->mac80211_registered = true;
@@ -4864,13 +5121,14 @@ static int wl1271_register_hw(struct wl1271 *wl)
 
        wl1271_notice("loaded");
 
-       return 0;
+out:
+       return ret;
 }
 
 static void wl1271_unregister_hw(struct wl1271 *wl)
 {
-       if (wl->state == WL1271_STATE_PLT)
-               __wl1271_plt_stop(wl);
+       if (wl->plt)
+               wl1271_plt_stop(wl);
 
        unregister_netdevice_notifier(&wl1271_dev_notifier);
        ieee80211_unregister_hw(wl->hw);
@@ -4889,7 +5147,7 @@ static int wl1271_init_ieee80211(struct wl1271 *wl)
        };
 
        /* The tx descriptor buffer and the TKIP space. */
-       wl->hw->extra_tx_headroom = WL1271_TKIP_IV_SPACE +
+       wl->hw->extra_tx_headroom = WL1271_EXTRA_SPACE_TKIP +
                sizeof(struct wl1271_tx_hw_descr);
 
        /* unit us */
@@ -4898,17 +5156,17 @@ static int wl1271_init_ieee80211(struct wl1271 *wl)
        wl->hw->max_listen_interval = wl->conf.conn.max_listen_interval;
 
        wl->hw->flags = IEEE80211_HW_SIGNAL_DBM |
-               IEEE80211_HW_BEACON_FILTER |
                IEEE80211_HW_SUPPORTS_PS |
+               IEEE80211_HW_SUPPORTS_DYNAMIC_PS |
                IEEE80211_HW_SUPPORTS_UAPSD |
                IEEE80211_HW_HAS_RATE_CONTROL |
                IEEE80211_HW_CONNECTION_MONITOR |
-               IEEE80211_HW_SUPPORTS_CQM_RSSI |
                IEEE80211_HW_REPORTS_TX_ACK_STATUS |
                IEEE80211_HW_SPECTRUM_MGMT |
                IEEE80211_HW_AP_LINK_PS |
                IEEE80211_HW_AMPDU_AGGREGATION |
-               IEEE80211_HW_TX_AMPDU_SETUP_IN_HW;
+               IEEE80211_HW_TX_AMPDU_SETUP_IN_HW |
+               IEEE80211_HW_SCAN_WHILE_IDLE;
 
        wl->hw->wiphy->cipher_suites = cipher_suites;
        wl->hw->wiphy->n_cipher_suites = ARRAY_SIZE(cipher_suites);
@@ -4924,10 +5182,10 @@ static int wl1271_init_ieee80211(struct wl1271 *wl)
         * should be the maximum length possible for a template, without
         * the IEEE80211 header of the template
         */
-       wl->hw->wiphy->max_scan_ie_len = WL1271_CMD_TEMPL_DFLT_SIZE -
+       wl->hw->wiphy->max_scan_ie_len = WL1271_CMD_TEMPL_MAX_SIZE -
                        sizeof(struct ieee80211_header);
 
-       wl->hw->wiphy->max_sched_scan_ie_len = WL1271_CMD_TEMPL_DFLT_SIZE -
+       wl->hw->wiphy->max_sched_scan_ie_len = WL1271_CMD_TEMPL_MAX_SIZE -
                sizeof(struct ieee80211_header);
 
        wl->hw->wiphy->flags |= WIPHY_FLAG_AP_UAPSD;
@@ -5021,7 +5279,6 @@ static struct ieee80211_hw *wl1271_alloc_hw(void)
        wl->rx_counter = 0;
        wl->power_level = WL1271_DEFAULT_POWER_LEVEL;
        wl->band = IEEE80211_BAND_2GHZ;
-       wl->vif = NULL;
        wl->flags = 0;
        wl->sg_enabled = true;
        wl->hw_pg_ver = -1;
@@ -5046,6 +5303,7 @@ static struct ieee80211_hw *wl1271_alloc_hw(void)
        spin_lock_init(&wl->wl_lock);
 
        wl->state = WL1271_STATE_OFF;
+       wl->fw_type = WL12XX_FW_TYPE_NONE;
        mutex_init(&wl->mutex);
 
        /* Apply default driver configuration. */
@@ -5113,6 +5371,7 @@ static int wl1271_free_hw(struct wl1271 *wl)
 
        vfree(wl->fw);
        wl->fw = NULL;
+       wl->fw_type = WL12XX_FW_TYPE_NONE;
        kfree(wl->nvs);
        wl->nvs = NULL;
 
@@ -5299,7 +5558,7 @@ module_param_named(debug_level, wl12xx_debug_level, uint, S_IRUSR | S_IWUSR);
 MODULE_PARM_DESC(debug_level, "wl12xx debugging level");
 
 module_param_named(fwlog, fwlog_param, charp, 0);
-MODULE_PARM_DESC(keymap,
+MODULE_PARM_DESC(fwlog,
                 "FW logger options: continuous, ondemand, dbgpins or disable");
 
 module_param(bug_on_recovery, bool, S_IRUSR | S_IWUSR);
index a2bdacd..23d6750 100644 (file)
@@ -56,7 +56,7 @@ void wl1271_elp_work(struct work_struct *work)
                if (wlvif->bss_type == BSS_TYPE_AP_BSS)
                        goto out;
 
-               if (!test_bit(WLVIF_FLAG_PSM, &wlvif->flags) &&
+               if (!test_bit(WLVIF_FLAG_IN_PS, &wlvif->flags) &&
                    test_bit(WLVIF_FLAG_IN_USE, &wlvif->flags))
                        goto out;
        }
@@ -84,7 +84,7 @@ void wl1271_ps_elp_sleep(struct wl1271 *wl)
                if (wlvif->bss_type == BSS_TYPE_AP_BSS)
                        return;
 
-               if (!test_bit(WLVIF_FLAG_PSM, &wlvif->flags) &&
+               if (!test_bit(WLVIF_FLAG_IN_PS, &wlvif->flags) &&
                    test_bit(WLVIF_FLAG_IN_USE, &wlvif->flags))
                        return;
        }
@@ -160,28 +160,39 @@ out:
 }
 
 int wl1271_ps_set_mode(struct wl1271 *wl, struct wl12xx_vif *wlvif,
-                      enum wl1271_cmd_ps_mode mode, u32 rates, bool send)
+                      enum wl1271_cmd_ps_mode mode)
 {
        int ret;
+       u16 timeout = wl->conf.conn.dynamic_ps_timeout;
 
        switch (mode) {
+       case STATION_AUTO_PS_MODE:
        case STATION_POWER_SAVE_MODE:
-               wl1271_debug(DEBUG_PSM, "entering psm");
+               wl1271_debug(DEBUG_PSM, "entering psm (mode=%d,timeout=%u)",
+                            mode, timeout);
 
-               ret = wl1271_acx_wake_up_conditions(wl, wlvif);
+               ret = wl1271_acx_wake_up_conditions(wl, wlvif,
+                                           wl->conf.conn.wake_up_event,
+                                           wl->conf.conn.listen_interval);
                if (ret < 0) {
                        wl1271_error("couldn't set wake up conditions");
                        return ret;
                }
 
-               ret = wl1271_cmd_ps_mode(wl, wlvif, STATION_POWER_SAVE_MODE);
+               ret = wl1271_cmd_ps_mode(wl, wlvif, mode, timeout);
                if (ret < 0)
                        return ret;
 
-               set_bit(WLVIF_FLAG_PSM, &wlvif->flags);
+               set_bit(WLVIF_FLAG_IN_PS, &wlvif->flags);
+
+               /* enable beacon early termination. Not relevant for 5GHz */
+               if (wlvif->band == IEEE80211_BAND_2GHZ) {
+                       ret = wl1271_acx_bet_enable(wl, wlvif, true);
+                       if (ret < 0)
+                               return ret;
+               }
                break;
        case STATION_ACTIVE_MODE:
-       default:
                wl1271_debug(DEBUG_PSM, "leaving psm");
 
                /* disable beacon early termination */
@@ -191,12 +202,15 @@ int wl1271_ps_set_mode(struct wl1271 *wl, struct wl12xx_vif *wlvif,
                                return ret;
                }
 
-               ret = wl1271_cmd_ps_mode(wl, wlvif, STATION_ACTIVE_MODE);
+               ret = wl1271_cmd_ps_mode(wl, wlvif, mode, 0);
                if (ret < 0)
                        return ret;
 
-               clear_bit(WLVIF_FLAG_PSM, &wlvif->flags);
+               clear_bit(WLVIF_FLAG_IN_PS, &wlvif->flags);
                break;
+       default:
+               wl1271_warning("trying to set ps to unsupported mode %d", mode);
+               ret = -EINVAL;
        }
 
        return ret;
index a12052f..5f19d4f 100644 (file)
@@ -28,7 +28,7 @@
 #include "acx.h"
 
 int wl1271_ps_set_mode(struct wl1271 *wl, struct wl12xx_vif *wlvif,
-                      enum wl1271_cmd_ps_mode mode, u32 rates, bool send);
+                      enum wl1271_cmd_ps_mode mode);
 void wl1271_ps_elp_sleep(struct wl1271 *wl);
 int wl1271_ps_elp_wakeup(struct wl1271 *wl);
 void wl1271_elp_work(struct work_struct *work);
index df34d59..340db32 100644 (file)
@@ -525,4 +525,31 @@ b12-b0 - Supported Rate indicator bits as defined below.
  */
 #define INTR_TRIG_TX_PROC1 BIT(18)
 
+#define WL127X_REG_FUSE_DATA_2_1       0x050a
+#define WL128X_REG_FUSE_DATA_2_1       0x2152
+#define PG_VER_MASK                    0x3c
+#define PG_VER_OFFSET                  2
+
+#define WL127X_PG_MAJOR_VER_MASK       0x3
+#define WL127X_PG_MAJOR_VER_OFFSET     0x0
+#define WL127X_PG_MINOR_VER_MASK       0xc
+#define WL127X_PG_MINOR_VER_OFFSET     0x2
+
+#define WL128X_PG_MAJOR_VER_MASK       0xc
+#define WL128X_PG_MAJOR_VER_OFFSET     0x2
+#define WL128X_PG_MINOR_VER_MASK       0x3
+#define WL128X_PG_MINOR_VER_OFFSET     0x0
+
+#define WL127X_PG_GET_MAJOR(pg_ver) ((pg_ver & WL127X_PG_MAJOR_VER_MASK) >> \
+                                    WL127X_PG_MAJOR_VER_OFFSET)
+#define WL127X_PG_GET_MINOR(pg_ver) ((pg_ver & WL127X_PG_MINOR_VER_MASK) >> \
+                                    WL127X_PG_MINOR_VER_OFFSET)
+#define WL128X_PG_GET_MAJOR(pg_ver) ((pg_ver & WL128X_PG_MAJOR_VER_MASK) >> \
+                                    WL128X_PG_MAJOR_VER_OFFSET)
+#define WL128X_PG_GET_MINOR(pg_ver) ((pg_ver & WL128X_PG_MINOR_VER_MASK) >> \
+                                    WL128X_PG_MINOR_VER_OFFSET)
+
+#define WL12XX_REG_FUSE_BD_ADDR_1      0x00310eb4
+#define WL12XX_REG_FUSE_BD_ADDR_2      0x00310eb8
+
 #endif
index 4fbd2a7..cfa6071 100644 (file)
@@ -113,7 +113,7 @@ static int wl1271_rx_handle_data(struct wl1271 *wl, u8 *data, u32 length,
         * In PLT mode we seem to get frames and mac80211 warns about them,
         * workaround this by not retrieving them at all.
         */
-       if (unlikely(wl->state == WL1271_STATE_PLT))
+       if (unlikely(wl->plt))
                return -EINVAL;
 
        /* the data read starts with the descriptor */
index e24111e..e43a6b2 100644 (file)
@@ -38,7 +38,6 @@ void wl1271_scan_complete_work(struct work_struct *work)
        struct ieee80211_vif *vif;
        struct wl12xx_vif *wlvif;
        int ret;
-       bool is_sta, is_ibss;
 
        dwork = container_of(work, struct delayed_work, work);
        wl = container_of(dwork, struct wl1271, scan_complete_work);
@@ -70,15 +69,6 @@ void wl1271_scan_complete_work(struct work_struct *work)
                wl1271_cmd_build_ap_probe_req(wl, wlvif, wlvif->probereq);
        }
 
-       /* return to ROC if needed */
-       is_sta = (wlvif->bss_type == BSS_TYPE_STA_BSS);
-       is_ibss = (wlvif->bss_type == BSS_TYPE_IBSS);
-       if (((is_sta && !test_bit(WLVIF_FLAG_STA_ASSOCIATED, &wlvif->flags)) ||
-            (is_ibss && !test_bit(WLVIF_FLAG_IBSS_JOINED, &wlvif->flags))) &&
-           !test_bit(wlvif->dev_role_id, wl->roc_map)) {
-               /* restore remain on channel */
-               wl12xx_start_dev(wl, wlvif);
-       }
        wl1271_ps_elp_sleep(wl);
 
        if (wl->scan.failed) {
@@ -182,14 +172,23 @@ static int wl1271_scan_send(struct wl1271 *wl, struct ieee80211_vif *vif,
                goto out;
        }
 
+       if (wl->conf.scan.split_scan_timeout)
+               scan_options |= WL1271_SCAN_OPT_SPLIT_SCAN;
+
        if (passive)
                scan_options |= WL1271_SCAN_OPT_PASSIVE;
 
-       if (WARN_ON(wlvif->role_id == WL12XX_INVALID_ROLE_ID)) {
+       if (wlvif->bss_type == BSS_TYPE_AP_BSS ||
+           test_bit(WLVIF_FLAG_STA_ASSOCIATED, &wlvif->flags))
+               cmd->params.role_id = wlvif->role_id;
+       else
+               cmd->params.role_id = wlvif->dev_role_id;
+
+       if (WARN_ON(cmd->params.role_id == WL12XX_INVALID_ROLE_ID)) {
                ret = -EINVAL;
                goto out;
        }
-       cmd->params.role_id = wlvif->role_id;
+
        cmd->params.scan_options = cpu_to_le16(scan_options);
 
        cmd->params.n_ch = wl1271_get_scan_channels(wl, wl->scan.req,
@@ -202,7 +201,7 @@ static int wl1271_scan_send(struct wl1271 *wl, struct ieee80211_vif *vif,
 
        cmd->params.tx_rate = cpu_to_le32(basic_rate);
        cmd->params.n_probe_reqs = wl->conf.scan.num_probe_reqs;
-       cmd->params.tid_trigger = 0;
+       cmd->params.tid_trigger = CONF_TX_AC_ANY_TID;
        cmd->params.scan_tag = WL1271_SCAN_DEFAULT_TAG;
 
        if (band == IEEE80211_BAND_2GHZ)
@@ -217,16 +216,17 @@ static int wl1271_scan_send(struct wl1271 *wl, struct ieee80211_vif *vif,
 
        memcpy(cmd->addr, vif->addr, ETH_ALEN);
 
-       ret = wl1271_cmd_build_probe_req(wl, wlvif, wl->scan.ssid,
-                                        wl->scan.ssid_len, wl->scan.req->ie,
-                                        wl->scan.req->ie_len, band);
+       ret = wl12xx_cmd_build_probe_req(wl, wlvif,
+                                        cmd->params.role_id, band,
+                                        wl->scan.ssid, wl->scan.ssid_len,
+                                        wl->scan.req->ie,
+                                        wl->scan.req->ie_len);
        if (ret < 0) {
                wl1271_error("PROBE request template failed");
                goto out;
        }
 
-       /* disable the timeout */
-       trigger->timeout = 0;
+       trigger->timeout = cpu_to_le32(wl->conf.scan.split_scan_timeout);
        ret = wl1271_cmd_send(wl, CMD_TRIGGER_SCAN_TO, trigger,
                              sizeof(*trigger), 0);
        if (ret < 0) {
@@ -658,11 +658,13 @@ int wl1271_scan_sched_scan_config(struct wl1271 *wl,
        }
 
        if (!force_passive && cfg->active[0]) {
-               ret = wl1271_cmd_build_probe_req(wl, wlvif, req->ssids[0].ssid,
+               u8 band = IEEE80211_BAND_2GHZ;
+               ret = wl12xx_cmd_build_probe_req(wl, wlvif,
+                                                wlvif->dev_role_id, band,
+                                                req->ssids[0].ssid,
                                                 req->ssids[0].ssid_len,
-                                                ies->ie[IEEE80211_BAND_2GHZ],
-                                                ies->len[IEEE80211_BAND_2GHZ],
-                                                IEEE80211_BAND_2GHZ);
+                                                ies->ie[band],
+                                                ies->len[band]);
                if (ret < 0) {
                        wl1271_error("2.4GHz PROBE request template failed");
                        goto out;
@@ -670,11 +672,13 @@ int wl1271_scan_sched_scan_config(struct wl1271 *wl,
        }
 
        if (!force_passive && cfg->active[1]) {
-               ret = wl1271_cmd_build_probe_req(wl, wlvif, req->ssids[0].ssid,
+               u8 band = IEEE80211_BAND_5GHZ;
+               ret = wl12xx_cmd_build_probe_req(wl, wlvif,
+                                                wlvif->dev_role_id, band,
+                                                req->ssids[0].ssid,
                                                 req->ssids[0].ssid_len,
-                                                ies->ie[IEEE80211_BAND_5GHZ],
-                                                ies->len[IEEE80211_BAND_5GHZ],
-                                                IEEE80211_BAND_5GHZ);
+                                                ies->ie[band],
+                                                ies->len[band]);
                if (ret < 0) {
                        wl1271_error("5GHz PROBE request template failed");
                        goto out;
index a7ed43d..96ff457 100644 (file)
@@ -48,7 +48,7 @@ void wl1271_scan_sched_scan_results(struct wl1271 *wl);
 #define WL1271_SCAN_CURRENT_TX_PWR     0
 #define WL1271_SCAN_OPT_ACTIVE         0
 #define WL1271_SCAN_OPT_PASSIVE               1
-#define WL1271_SCAN_OPT_TRIGGERED_SCAN 2
+#define WL1271_SCAN_OPT_SPLIT_SCAN     2
 #define WL1271_SCAN_OPT_PRIORITY_HIGH  4
 /* scan even if we fail to enter psm */
 #define WL1271_SCAN_OPT_FORCE          8
index 468a505..4b3c327 100644 (file)
@@ -74,6 +74,8 @@ static void wl12xx_sdio_raw_read(struct device *child, int addr, void *buf,
        struct wl12xx_sdio_glue *glue = dev_get_drvdata(child->parent);
        struct sdio_func *func = dev_to_sdio_func(glue->dev);
 
+       sdio_claim_host(func);
+
        if (unlikely(addr == HW_ACCESS_ELP_CTRL_REG_ADDR)) {
                ((u8 *)buf)[0] = sdio_f0_readb(func, addr, &ret);
                dev_dbg(child->parent, "sdio read 52 addr 0x%x, byte 0x%02x\n",
@@ -88,6 +90,8 @@ static void wl12xx_sdio_raw_read(struct device *child, int addr, void *buf,
                        addr, len);
        }
 
+       sdio_release_host(func);
+
        if (ret)
                dev_err(child->parent, "sdio read failed (%d)\n", ret);
 }
@@ -99,6 +103,8 @@ static void wl12xx_sdio_raw_write(struct device *child, int addr, void *buf,
        struct wl12xx_sdio_glue *glue = dev_get_drvdata(child->parent);
        struct sdio_func *func = dev_to_sdio_func(glue->dev);
 
+       sdio_claim_host(func);
+
        if (unlikely(addr == HW_ACCESS_ELP_CTRL_REG_ADDR)) {
                sdio_f0_writeb(func, ((u8 *)buf)[0], addr, &ret);
                dev_dbg(child->parent, "sdio write 52 addr 0x%x, byte 0x%02x\n",
@@ -113,6 +119,8 @@ static void wl12xx_sdio_raw_write(struct device *child, int addr, void *buf,
                        ret = sdio_memcpy_toio(func, addr, buf, len);
        }
 
+       sdio_release_host(func);
+
        if (ret)
                dev_err(child->parent, "sdio write failed (%d)\n", ret);
 }
@@ -136,6 +144,7 @@ static int wl12xx_sdio_power_on(struct wl12xx_sdio_glue *glue)
 
        sdio_claim_host(func);
        sdio_enable_func(func);
+       sdio_release_host(func);
 
 out:
        return ret;
@@ -146,6 +155,7 @@ static int wl12xx_sdio_power_off(struct wl12xx_sdio_glue *glue)
        int ret;
        struct sdio_func *func = dev_to_sdio_func(glue->dev);
 
+       sdio_claim_host(func);
        sdio_disable_func(func);
        sdio_release_host(func);
 
@@ -314,9 +324,6 @@ static int wl1271_suspend(struct device *dev)
                        dev_err(dev, "error while trying to keep power\n");
                        goto out;
                }
-
-               /* release host */
-               sdio_release_host(func);
        }
 out:
        return ret;
@@ -324,15 +331,7 @@ out:
 
 static int wl1271_resume(struct device *dev)
 {
-       struct sdio_func *func = dev_to_sdio_func(dev);
-       struct wl12xx_sdio_glue *glue = sdio_get_drvdata(func);
-       struct wl1271 *wl = platform_get_drvdata(glue->core);
-
        dev_dbg(dev, "wl1271 resume\n");
-       if (wl->wow_enabled) {
-               /* claim back host */
-               sdio_claim_host(func);
-       }
 
        return 0;
 }
@@ -371,5 +370,9 @@ module_exit(wl1271_exit);
 MODULE_LICENSE("GPL");
 MODULE_AUTHOR("Luciano Coelho <coelho@ti.com>");
 MODULE_AUTHOR("Juuso Oikarinen <juuso.oikarinen@nokia.com>");
-MODULE_FIRMWARE(WL127X_FW_NAME);
-MODULE_FIRMWARE(WL128X_FW_NAME);
+MODULE_FIRMWARE(WL127X_FW_NAME_SINGLE);
+MODULE_FIRMWARE(WL127X_FW_NAME_MULTI);
+MODULE_FIRMWARE(WL127X_PLT_FW_NAME);
+MODULE_FIRMWARE(WL128X_FW_NAME_SINGLE);
+MODULE_FIRMWARE(WL128X_FW_NAME_MULTI);
+MODULE_FIRMWARE(WL128X_PLT_FW_NAME);
index 92caa7c..2fc18a8 100644 (file)
@@ -433,6 +433,10 @@ module_exit(wl1271_exit);
 MODULE_LICENSE("GPL");
 MODULE_AUTHOR("Luciano Coelho <coelho@ti.com>");
 MODULE_AUTHOR("Juuso Oikarinen <juuso.oikarinen@nokia.com>");
-MODULE_FIRMWARE(WL127X_FW_NAME);
-MODULE_FIRMWARE(WL128X_FW_NAME);
+MODULE_FIRMWARE(WL127X_FW_NAME_SINGLE);
+MODULE_FIRMWARE(WL127X_FW_NAME_MULTI);
+MODULE_FIRMWARE(WL127X_PLT_FW_NAME);
+MODULE_FIRMWARE(WL128X_FW_NAME_SINGLE);
+MODULE_FIRMWARE(WL128X_FW_NAME_MULTI);
+MODULE_FIRMWARE(WL128X_PLT_FW_NAME);
 MODULE_ALIAS("spi:wl1271");
index 25093c0..1e93bb9 100644 (file)
@@ -30,6 +30,7 @@
 #include "acx.h"
 #include "reg.h"
 #include "ps.h"
+#include "io.h"
 
 #define WL1271_TM_MAX_DATA_LENGTH 1024
 
@@ -41,6 +42,7 @@ enum wl1271_tm_commands {
        WL1271_TM_CMD_NVS_PUSH,         /* Not in use. Keep to not break ABI */
        WL1271_TM_CMD_SET_PLT_MODE,
        WL1271_TM_CMD_RECOVER,
+       WL1271_TM_CMD_GET_MAC,
 
        __WL1271_TM_CMD_AFTER_LAST
 };
@@ -264,6 +266,52 @@ static int wl1271_tm_cmd_recover(struct wl1271 *wl, struct nlattr *tb[])
        return 0;
 }
 
+static int wl12xx_tm_cmd_get_mac(struct wl1271 *wl, struct nlattr *tb[])
+{
+       struct sk_buff *skb;
+       u8 mac_addr[ETH_ALEN];
+       int ret = 0;
+
+       mutex_lock(&wl->mutex);
+
+       if (!wl->plt) {
+               ret = -EINVAL;
+               goto out;
+       }
+
+       if (wl->fuse_oui_addr == 0 && wl->fuse_nic_addr == 0) {
+               ret = -EOPNOTSUPP;
+               goto out;
+       }
+
+       mac_addr[0] = (u8)(wl->fuse_oui_addr >> 16);
+       mac_addr[1] = (u8)(wl->fuse_oui_addr >> 8);
+       mac_addr[2] = (u8) wl->fuse_oui_addr;
+       mac_addr[3] = (u8)(wl->fuse_nic_addr >> 16);
+       mac_addr[4] = (u8)(wl->fuse_nic_addr >> 8);
+       mac_addr[5] = (u8) wl->fuse_nic_addr;
+
+       skb = cfg80211_testmode_alloc_reply_skb(wl->hw->wiphy, ETH_ALEN);
+       if (!skb) {
+               ret = -ENOMEM;
+               goto out;
+       }
+
+       NLA_PUT(skb, WL1271_TM_ATTR_DATA, ETH_ALEN, mac_addr);
+       ret = cfg80211_testmode_reply(skb);
+       if (ret < 0)
+               goto out;
+
+out:
+       mutex_unlock(&wl->mutex);
+       return ret;
+
+nla_put_failure:
+       kfree_skb(skb);
+       ret = -EMSGSIZE;
+       goto out;
+}
+
 int wl1271_tm_cmd(struct ieee80211_hw *hw, void *data, int len)
 {
        struct wl1271 *wl = hw->priv;
@@ -288,6 +336,8 @@ int wl1271_tm_cmd(struct ieee80211_hw *hw, void *data, int len)
                return wl1271_tm_cmd_set_plt_mode(wl, tb);
        case WL1271_TM_CMD_RECOVER:
                return wl1271_tm_cmd_recover(wl, tb);
+       case WL1271_TM_CMD_GET_MAC:
+               return wl12xx_tm_cmd_get_mac(wl, tb);
        default:
                return -EOPNOTSUPP;
        }
index 4508ccd..6446e4d 100644 (file)
@@ -77,35 +77,6 @@ static void wl1271_free_tx_id(struct wl1271 *wl, int id)
        }
 }
 
-static int wl1271_tx_update_filters(struct wl1271 *wl,
-                                   struct wl12xx_vif *wlvif,
-                                   struct sk_buff *skb)
-{
-       struct ieee80211_hdr *hdr;
-       int ret;
-
-       hdr = (struct ieee80211_hdr *)skb->data;
-
-       /*
-        * stop bssid-based filtering before transmitting authentication
-        * requests. this way the hw will never drop authentication
-        * responses coming from BSSIDs it isn't familiar with (e.g. on
-        * roaming)
-        */
-       if (!ieee80211_is_auth(hdr->frame_control))
-               return 0;
-
-       if (wlvif->dev_hlid != WL12XX_INVALID_LINK_ID)
-               goto out;
-
-       wl1271_debug(DEBUG_CMD, "starting device role for roaming");
-       ret = wl12xx_start_dev(wl, wlvif);
-       if (ret < 0)
-               goto out;
-out:
-       return 0;
-}
-
 static void wl1271_tx_ap_update_inconnection_sta(struct wl1271 *wl,
                                                 struct sk_buff *skb)
 {
@@ -187,8 +158,6 @@ u8 wl12xx_tx_get_hlid(struct wl1271 *wl, struct wl12xx_vif *wlvif,
        if (wlvif->bss_type == BSS_TYPE_AP_BSS)
                return wl12xx_tx_get_hlid_ap(wl, wlvif, skb);
 
-       wl1271_tx_update_filters(wl, wlvif, skb);
-
        if ((test_bit(WLVIF_FLAG_STA_ASSOCIATED, &wlvif->flags) ||
             test_bit(WLVIF_FLAG_IBSS_JOINED, &wlvif->flags)) &&
            !ieee80211_is_auth(hdr->frame_control) &&
@@ -286,16 +255,20 @@ static void wl1271_tx_fill_hdr(struct wl1271 *wl, struct wl12xx_vif *wlvif,
        int aligned_len, ac, rate_idx;
        s64 hosttime;
        u16 tx_attr = 0;
+       __le16 frame_control;
+       struct ieee80211_hdr *hdr;
+       u8 *frame_start;
        bool is_dummy;
 
        desc = (struct wl1271_tx_hw_descr *) skb->data;
+       frame_start = (u8 *)(desc + 1);
+       hdr = (struct ieee80211_hdr *)(frame_start + extra);
+       frame_control = hdr->frame_control;
 
        /* relocate space for security header */
        if (extra) {
-               void *framestart = skb->data + sizeof(*desc);
-               u16 fc = *(u16 *)(framestart + extra);
-               int hdrlen = ieee80211_hdrlen(cpu_to_le16(fc));
-               memmove(framestart, framestart + extra, hdrlen);
+               int hdrlen = ieee80211_hdrlen(frame_control);
+               memmove(frame_start, hdr, hdrlen);
        }
 
        /* configure packet life time */
@@ -384,6 +357,11 @@ static void wl1271_tx_fill_hdr(struct wl1271 *wl, struct wl12xx_vif *wlvif,
                             desc->wl127x_mem.total_mem_blocks);
        }
 
+       /* for WEP shared auth - no fw encryption is needed */
+       if (ieee80211_is_auth(frame_control) &&
+           ieee80211_has_protected(frame_control))
+               tx_attr |= TX_HW_ATTR_HOST_ENCRYPT;
+
        desc->tx_attr = cpu_to_le16(tx_attr);
 }
 
@@ -408,7 +386,7 @@ static int wl1271_prepare_tx_frame(struct wl1271 *wl, struct wl12xx_vif *wlvif,
 
        if (info->control.hw_key &&
            info->control.hw_key->cipher == WLAN_CIPHER_SUITE_TKIP)
-               extra = WL1271_TKIP_IV_SPACE;
+               extra = WL1271_EXTRA_SPACE_TKIP;
 
        if (info->control.hw_key) {
                bool is_wep;
@@ -795,6 +773,18 @@ out:
        mutex_unlock(&wl->mutex);
 }
 
+static u8 wl1271_tx_get_rate_flags(u8 rate_class_index)
+{
+       u8 flags = 0;
+
+       if (rate_class_index >= CONF_HW_RXTX_RATE_MCS_MIN &&
+           rate_class_index <= CONF_HW_RXTX_RATE_MCS_MAX)
+               flags |= IEEE80211_TX_RC_MCS;
+       if (rate_class_index == CONF_HW_RXTX_RATE_MCS7_SGI)
+               flags |= IEEE80211_TX_RC_SHORT_GI;
+       return flags;
+}
+
 static void wl1271_tx_complete_packet(struct wl1271 *wl,
                                      struct wl1271_tx_hw_res_descr *result)
 {
@@ -804,6 +794,7 @@ static void wl1271_tx_complete_packet(struct wl1271 *wl,
        struct sk_buff *skb;
        int id = result->id;
        int rate = -1;
+       u8 rate_flags = 0;
        u8 retries = 0;
 
        /* check for id legality */
@@ -830,6 +821,7 @@ static void wl1271_tx_complete_packet(struct wl1271 *wl,
                        info->flags |= IEEE80211_TX_STAT_ACK;
                rate = wl1271_rate_to_idx(result->rate_class_index,
                                          wlvif->band);
+               rate_flags = wl1271_tx_get_rate_flags(result->rate_class_index);
                retries = result->ack_failures;
        } else if (result->status == TX_RETRY_EXCEEDED) {
                wl->stats.excessive_retries++;
@@ -838,7 +830,7 @@ static void wl1271_tx_complete_packet(struct wl1271 *wl,
 
        info->status.rates[0].idx = rate;
        info->status.rates[0].count = retries;
-       info->status.rates[0].flags = 0;
+       info->status.rates[0].flags = rate_flags;
        info->status.ack_signal = -1;
 
        wl->stats.retry_count += result->ack_failures;
@@ -869,8 +861,9 @@ static void wl1271_tx_complete_packet(struct wl1271 *wl,
        if (info->control.hw_key &&
            info->control.hw_key->cipher == WLAN_CIPHER_SUITE_TKIP) {
                int hdrlen = ieee80211_get_hdrlen_from_skb(skb);
-               memmove(skb->data + WL1271_TKIP_IV_SPACE, skb->data, hdrlen);
-               skb_pull(skb, WL1271_TKIP_IV_SPACE);
+               memmove(skb->data + WL1271_EXTRA_SPACE_TKIP, skb->data,
+                       hdrlen);
+               skb_pull(skb, WL1271_EXTRA_SPACE_TKIP);
        }
 
        wl1271_debug(DEBUG_TX, "tx status id %u skb 0x%p failures %u rate 0x%x"
@@ -1012,9 +1005,9 @@ void wl12xx_tx_reset(struct wl1271 *wl, bool reset_tx_queues)
                            info->control.hw_key->cipher ==
                            WLAN_CIPHER_SUITE_TKIP) {
                                int hdrlen = ieee80211_get_hdrlen_from_skb(skb);
-                               memmove(skb->data + WL1271_TKIP_IV_SPACE,
+                               memmove(skb->data + WL1271_EXTRA_SPACE_TKIP,
                                        skb->data, hdrlen);
-                               skb_pull(skb, WL1271_TKIP_IV_SPACE);
+                               skb_pull(skb, WL1271_EXTRA_SPACE_TKIP);
                        }
 
                        info->status.rates[0].idx = -1;
index 2dbb24e..e3977b5 100644 (file)
@@ -39,6 +39,7 @@
 #define TX_HW_ATTR_LAST_WORD_PAD         (BIT(10) | BIT(11))
 #define TX_HW_ATTR_TX_CMPLT_REQ          BIT(12)
 #define TX_HW_ATTR_TX_DUMMY_REQ          BIT(13)
+#define TX_HW_ATTR_HOST_ENCRYPT          BIT(14)
 
 #define TX_HW_ATTR_OFST_SAVE_RETRIES     0
 #define TX_HW_ATTR_OFST_HEADER_PAD       1
@@ -51,7 +52,9 @@
 #define TX_HW_RESULT_QUEUE_LEN_MASK      0xf
 
 #define WL1271_TX_ALIGN_TO 4
-#define WL1271_TKIP_IV_SPACE 4
+#define WL1271_EXTRA_SPACE_TKIP 4
+#define WL1271_EXTRA_SPACE_AES  8
+#define WL1271_EXTRA_SPACE_MAX  8
 
 /* Used for management frames and dummy packets */
 #define WL1271_TID_MGMT 7
index b2b09cd..9035241 100644 (file)
 #include "conf.h"
 #include "ini.h"
 
-#define WL127X_FW_NAME "ti-connectivity/wl127x-fw-3.bin"
-#define WL128X_FW_NAME "ti-connectivity/wl128x-fw-3.bin"
+#define WL127X_FW_NAME_MULTI "ti-connectivity/wl127x-fw-4-mr.bin"
+#define WL127X_FW_NAME_SINGLE "ti-connectivity/wl127x-fw-4-sr.bin"
+
+#define WL128X_FW_NAME_MULTI "ti-connectivity/wl128x-fw-4-mr.bin"
+#define WL128X_FW_NAME_SINGLE "ti-connectivity/wl128x-fw-4-sr.bin"
+
+#define WL127X_PLT_FW_NAME "ti-connectivity/wl127x-fw-4-plt.bin"
+#define WL128X_PLT_FW_NAME "ti-connectivity/wl128x-fw-4-plt.bin"
 
 /*
  * wl127x and wl128x are using the same NVS file name. However, the
 enum wl1271_state {
        WL1271_STATE_OFF,
        WL1271_STATE_ON,
-       WL1271_STATE_PLT,
+};
+
+enum wl12xx_fw_type {
+       WL12XX_FW_TYPE_NONE,
+       WL12XX_FW_TYPE_NORMAL,
+       WL12XX_FW_TYPE_MULTI,
+       WL12XX_FW_TYPE_PLT,
 };
 
 enum wl1271_partition_type {
@@ -247,6 +259,7 @@ enum wl12xx_flags {
        WL1271_FLAG_PENDING_WORK,
        WL1271_FLAG_SOFT_GEMINI,
        WL1271_FLAG_RECOVERY_IN_PROGRESS,
+       WL1271_FLAG_VIF_CHANGE_IN_PROGRESS,
 };
 
 enum wl12xx_vif_flags {
@@ -254,8 +267,7 @@ enum wl12xx_vif_flags {
        WLVIF_FLAG_STA_ASSOCIATED,
        WLVIF_FLAG_IBSS_JOINED,
        WLVIF_FLAG_AP_STARTED,
-       WLVIF_FLAG_PSM,
-       WLVIF_FLAG_PSM_REQUESTED,
+       WLVIF_FLAG_IN_PS,
        WLVIF_FLAG_STA_STATE_SENT,
        WLVIF_FLAG_RX_STREAMING_STARTED,
        WLVIF_FLAG_PSPOLL_FAILURE,
@@ -295,6 +307,9 @@ struct wl1271 {
        spinlock_t wl_lock;
 
        enum wl1271_state state;
+       enum wl12xx_fw_type fw_type;
+       bool plt;
+       u8 last_vif_count;
        struct mutex mutex;
 
        unsigned long flags;
@@ -313,7 +328,12 @@ struct wl1271 {
 
        s8 hw_pg_ver;
 
-       u8 mac_addr[ETH_ALEN];
+       /* address read from the fuse ROM */
+       u32 fuse_oui_addr;
+       u32 fuse_nic_addr;
+
+       /* we have up to 2 MAC addresses */
+       struct mac_address addresses[2];
        int channel;
        u8 system_hlid;
 
@@ -425,8 +445,6 @@ struct wl1271 {
        struct wl12xx_fw_status *fw_status;
        struct wl1271_tx_hw_res_if *tx_res_if;
 
-       struct ieee80211_vif *vif;
-
        /* Current chipset configuration */
        struct conf_drv_settings conf;
 
@@ -503,6 +521,8 @@ struct wl12xx_vif {
                        u8 basic_rate_idx;
                        u8 ap_rate_idx;
                        u8 p2p_rate_idx;
+
+                       bool qos;
                } sta;
                struct {
                        u8 global_hlid;
@@ -560,12 +580,6 @@ struct wl12xx_vif {
        /* Session counter for the chipset */
        int session_counter;
 
-       struct completion *ps_compl;
-       struct delayed_work pspoll_work;
-
-       /* counter for ps-poll delivery failures */
-       int ps_poll_failures;
-
        /* retry counter for PSM entries */
        u8 psm_entry_retry;
 
@@ -575,6 +589,10 @@ struct wl12xx_vif {
        int rssi_thold;
        int last_rssi_event;
 
+       /* save the current encryption type for auto-arp config */
+       u8 encryption_type;
+       __be32 ip_addr;
+
        /* RX BA constraint value */
        bool ba_support;
        bool ba_allowed;
index 8f0ffaf..22b0bc9 100644 (file)
@@ -117,7 +117,7 @@ struct wl12xx_ps_poll_template {
 } __packed;
 
 struct wl12xx_arp_rsp_template {
-       struct ieee80211_hdr_3addr hdr;
+       /* not including ieee80211 header */
 
        u8 llc_hdr[sizeof(rfc1042_header)];
        __be16 llc_type;
index 98a574a..9fcde36 100644 (file)
@@ -306,9 +306,19 @@ int zd_op_start(struct ieee80211_hw *hw)
        r = set_mc_hash(mac);
        if (r)
                goto disable_int;
+
+       /* Wait after setting the multicast hash table and powering on
+        * the radio otherwise interface bring up will fail. This matches
+        * what the vendor driver did.
+        */
+       msleep(10);
+
        r = zd_chip_switch_radio_on(chip);
-       if (r < 0)
+       if (r < 0) {
+               dev_err(zd_chip_dev(chip),
+                       "%s: failed to set radio on\n", __func__);
                goto disable_int;
+       }
        r = zd_chip_enable_rxtx(chip);
        if (r < 0)
                goto disable_radio;
index 59effac..2596401 100644 (file)
@@ -1639,10 +1639,8 @@ static int __init netback_init(void)
 
        xen_netbk_group_nr = num_online_cpus();
        xen_netbk = vzalloc(sizeof(struct xen_netbk) * xen_netbk_group_nr);
-       if (!xen_netbk) {
-               printk(KERN_ALERT "%s: out of memory\n", __func__);
+       if (!xen_netbk)
                return -ENOMEM;
-       }
 
        for (group = 0; group < xen_netbk_group_nr; group++) {
                struct xen_netbk *netbk = &xen_netbk[group];
index 698b905..b161750 100644 (file)
@@ -489,6 +489,7 @@ static int xennet_start_xmit(struct sk_buff *skb, struct net_device *dev)
        int frags = skb_shinfo(skb)->nr_frags;
        unsigned int offset = offset_in_page(data);
        unsigned int len = skb_headlen(skb);
+       unsigned long flags;
 
        frags += DIV_ROUND_UP(offset + len, PAGE_SIZE);
        if (unlikely(frags > MAX_SKB_FRAGS + 1)) {
@@ -498,12 +499,12 @@ static int xennet_start_xmit(struct sk_buff *skb, struct net_device *dev)
                goto drop;
        }
 
-       spin_lock_irq(&np->tx_lock);
+       spin_lock_irqsave(&np->tx_lock, flags);
 
        if (unlikely(!netif_carrier_ok(dev) ||
                     (frags > 1 && !xennet_can_sg(dev)) ||
                     netif_needs_gso(skb, netif_skb_features(skb)))) {
-               spin_unlock_irq(&np->tx_lock);
+               spin_unlock_irqrestore(&np->tx_lock, flags);
                goto drop;
        }
 
@@ -574,7 +575,7 @@ static int xennet_start_xmit(struct sk_buff *skb, struct net_device *dev)
        if (!netfront_tx_slot_available(np))
                netif_stop_queue(dev);
 
-       spin_unlock_irq(&np->tx_lock);
+       spin_unlock_irqrestore(&np->tx_lock, flags);
 
        return NETDEV_TX_OK;
 
@@ -1228,6 +1229,33 @@ static int xennet_set_features(struct net_device *dev,
        return 0;
 }
 
+static irqreturn_t xennet_interrupt(int irq, void *dev_id)
+{
+       struct net_device *dev = dev_id;
+       struct netfront_info *np = netdev_priv(dev);
+       unsigned long flags;
+
+       spin_lock_irqsave(&np->tx_lock, flags);
+
+       if (likely(netif_carrier_ok(dev))) {
+               xennet_tx_buf_gc(dev);
+               /* Under tx_lock: protects access to rx shared-ring indexes. */
+               if (RING_HAS_UNCONSUMED_RESPONSES(&np->rx))
+                       napi_schedule(&np->napi);
+       }
+
+       spin_unlock_irqrestore(&np->tx_lock, flags);
+
+       return IRQ_HANDLED;
+}
+
+#ifdef CONFIG_NET_POLL_CONTROLLER
+static void xennet_poll_controller(struct net_device *dev)
+{
+       xennet_interrupt(0, dev);
+}
+#endif
+
 static const struct net_device_ops xennet_netdev_ops = {
        .ndo_open            = xennet_open,
        .ndo_uninit          = xennet_uninit,
@@ -1239,6 +1267,9 @@ static const struct net_device_ops xennet_netdev_ops = {
        .ndo_validate_addr   = eth_validate_addr,
        .ndo_fix_features    = xennet_fix_features,
        .ndo_set_features    = xennet_set_features,
+#ifdef CONFIG_NET_POLL_CONTROLLER
+       .ndo_poll_controller = xennet_poll_controller,
+#endif
 };
 
 static struct net_device * __devinit xennet_create_dev(struct xenbus_device *dev)
@@ -1248,11 +1279,8 @@ static struct net_device * __devinit xennet_create_dev(struct xenbus_device *dev
        struct netfront_info *np;
 
        netdev = alloc_etherdev(sizeof(struct netfront_info));
-       if (!netdev) {
-               printk(KERN_WARNING "%s> alloc_etherdev failed.\n",
-                      __func__);
+       if (!netdev)
                return ERR_PTR(-ENOMEM);
-       }
 
        np                   = netdev_priv(netdev);
        np->xbdev            = dev;
@@ -1448,26 +1476,6 @@ static int xen_net_read_mac(struct xenbus_device *dev, u8 mac[])
        return 0;
 }
 
-static irqreturn_t xennet_interrupt(int irq, void *dev_id)
-{
-       struct net_device *dev = dev_id;
-       struct netfront_info *np = netdev_priv(dev);
-       unsigned long flags;
-
-       spin_lock_irqsave(&np->tx_lock, flags);
-
-       if (likely(netif_carrier_ok(dev))) {
-               xennet_tx_buf_gc(dev);
-               /* Under tx_lock: protects access to rx shared-ring indexes. */
-               if (RING_HAS_UNCONSUMED_RESPONSES(&np->rx))
-                       napi_schedule(&np->napi);
-       }
-
-       spin_unlock_irqrestore(&np->tx_lock, flags);
-
-       return IRQ_HANDLED;
-}
-
 static int setup_netfront(struct xenbus_device *dev, struct netfront_info *info)
 {
        struct xen_netif_tx_sring *txs;
index 06c3642..1f74a77 100644 (file)
@@ -28,6 +28,8 @@
  */
 #include <linux/platform_device.h>
 #include <linux/module.h>
+#include <linux/types.h>
+#include <linux/firmware.h>
 #include <linux/nfc.h>
 #include <net/nfc/nci.h>
 #include <net/nfc/nci_core.h>
 #define NFCWILINK_OFFSET_LEN_IN_HDR    1
 #define NFCWILINK_LEN_SIZE             2
 #define NFCWILINK_REGISTER_TIMEOUT     8000    /* 8 sec */
+#define NFCWILINK_CMD_TIMEOUT          5000    /* 5 sec */
+
+#define BTS_FILE_NAME_MAX_SIZE         40
+#define BTS_FILE_HDR_MAGIC             0x42535442
+#define BTS_FILE_CMD_MAX_LEN           0xff
+#define BTS_FILE_ACTION_TYPE_SEND_CMD  1
+
+#define NCI_VS_NFCC_INFO_CMD_GID       0x2f
+#define NCI_VS_NFCC_INFO_CMD_OID       0x12
+#define NCI_VS_NFCC_INFO_RSP_GID       0x4f
+#define NCI_VS_NFCC_INFO_RSP_OID       0x12
 
 struct nfcwilink_hdr {
-       u8 chnl;
-       u8 opcode;
-       u16 len;
+       __u8 chnl;
+       __u8 opcode;
+       __le16 len;
+} __packed;
+
+struct nci_vs_nfcc_info_cmd {
+       __u8 gid;
+       __u8 oid;
+       __u8 plen;
+} __packed;
+
+struct nci_vs_nfcc_info_rsp {
+       __u8 gid;
+       __u8 oid;
+       __u8 plen;
+       __u8 status;
+       __u8 hw_id;
+       __u8 sw_ver_x;
+       __u8 sw_ver_z;
+       __u8 patch_id;
+} __packed;
+
+struct bts_file_hdr {
+       __le32 magic;
+       __le32 ver;
+       __u8 rfu[24];
+       __u8 actions[0];
+} __packed;
+
+struct bts_file_action {
+       __le16 type;
+       __le16 len;
+       __u8 data[0];
 } __packed;
 
 struct nfcwilink {
@@ -54,14 +97,241 @@ struct nfcwilink {
 
        char                            st_register_cb_status;
        long                            (*st_write) (struct sk_buff *);
-       struct completion               st_register_completed;
+
+       struct completion               completed;
+
+       struct nci_vs_nfcc_info_rsp     nfcc_info;
 };
 
 /* NFCWILINK driver flags */
 enum {
        NFCWILINK_RUNNING,
+       NFCWILINK_FW_DOWNLOAD,
 };
 
+static int nfcwilink_send(struct sk_buff *skb);
+
+static inline struct sk_buff *nfcwilink_skb_alloc(unsigned int len, gfp_t how)
+{
+       struct sk_buff *skb;
+
+       skb = alloc_skb(len + NFCWILINK_HDR_LEN, how);
+       if (skb)
+               skb_reserve(skb, NFCWILINK_HDR_LEN);
+
+       return skb;
+}
+
+static void nfcwilink_fw_download_receive(struct nfcwilink *drv,
+                                               struct sk_buff *skb)
+{
+       struct nci_vs_nfcc_info_rsp *rsp = (void *)skb->data;
+
+       /* Detect NCI_VS_NFCC_INFO_RSP and store the result */
+       if ((skb->len > 3) && (rsp->gid == NCI_VS_NFCC_INFO_RSP_GID) &&
+               (rsp->oid == NCI_VS_NFCC_INFO_RSP_OID)) {
+               memcpy(&drv->nfcc_info, rsp,
+                       sizeof(struct nci_vs_nfcc_info_rsp));
+       }
+
+       kfree_skb(skb);
+
+       complete(&drv->completed);
+}
+
+static int nfcwilink_get_bts_file_name(struct nfcwilink *drv, char *file_name)
+{
+       struct nci_vs_nfcc_info_cmd *cmd;
+       struct sk_buff *skb;
+       unsigned long comp_ret;
+       int rc;
+
+       nfc_dev_dbg(&drv->pdev->dev, "get_bts_file_name entry");
+
+       skb = nfcwilink_skb_alloc(sizeof(struct nci_vs_nfcc_info_cmd),
+                                       GFP_KERNEL);
+       if (!skb) {
+               nfc_dev_err(&drv->pdev->dev,
+                               "no memory for nci_vs_nfcc_info_cmd");
+               return -ENOMEM;
+       }
+
+       skb->dev = (void *)drv->ndev;
+
+       cmd = (struct nci_vs_nfcc_info_cmd *)
+                       skb_put(skb, sizeof(struct nci_vs_nfcc_info_cmd));
+       cmd->gid = NCI_VS_NFCC_INFO_CMD_GID;
+       cmd->oid = NCI_VS_NFCC_INFO_CMD_OID;
+       cmd->plen = 0;
+
+       drv->nfcc_info.plen = 0;
+
+       rc = nfcwilink_send(skb);
+       if (rc)
+               return rc;
+
+       comp_ret = wait_for_completion_timeout(&drv->completed,
+                               msecs_to_jiffies(NFCWILINK_CMD_TIMEOUT));
+       nfc_dev_dbg(&drv->pdev->dev, "wait_for_completion_timeout returned %ld",
+                       comp_ret);
+       if (comp_ret == 0) {
+               nfc_dev_err(&drv->pdev->dev,
+                               "timeout on wait_for_completion_timeout");
+               return -ETIMEDOUT;
+       }
+
+       nfc_dev_dbg(&drv->pdev->dev, "nci_vs_nfcc_info_rsp: plen %d, status %d",
+                       drv->nfcc_info.plen,
+                       drv->nfcc_info.status);
+
+       if ((drv->nfcc_info.plen != 5) || (drv->nfcc_info.status != 0)) {
+               nfc_dev_err(&drv->pdev->dev,
+                               "invalid nci_vs_nfcc_info_rsp");
+               return -EINVAL;
+       }
+
+       snprintf(file_name, BTS_FILE_NAME_MAX_SIZE,
+                       "TINfcInit_%d.%d.%d.%d.bts",
+                       drv->nfcc_info.hw_id,
+                       drv->nfcc_info.sw_ver_x,
+                       drv->nfcc_info.sw_ver_z,
+                       drv->nfcc_info.patch_id);
+
+       nfc_dev_info(&drv->pdev->dev, "nfcwilink FW file name: %s", file_name);
+
+       return 0;
+}
+
+static int nfcwilink_send_bts_cmd(struct nfcwilink *drv, __u8 *data, int len)
+{
+       struct nfcwilink_hdr *hdr = (struct nfcwilink_hdr *)data;
+       struct sk_buff *skb;
+       unsigned long comp_ret;
+       int rc;
+
+       nfc_dev_dbg(&drv->pdev->dev, "send_bts_cmd entry");
+
+       /* verify valid cmd for the NFC channel */
+       if ((len <= sizeof(struct nfcwilink_hdr)) ||
+               (len > BTS_FILE_CMD_MAX_LEN) ||
+               (hdr->chnl != NFCWILINK_CHNL) ||
+               (hdr->opcode != NFCWILINK_OPCODE)) {
+               nfc_dev_err(&drv->pdev->dev,
+                       "ignoring invalid bts cmd, len %d, chnl %d, opcode %d",
+                       len, hdr->chnl, hdr->opcode);
+               return 0;
+       }
+
+       /* remove the ST header */
+       len -= sizeof(struct nfcwilink_hdr);
+       data += sizeof(struct nfcwilink_hdr);
+
+       skb = nfcwilink_skb_alloc(len, GFP_KERNEL);
+       if (!skb) {
+               nfc_dev_err(&drv->pdev->dev, "no memory for bts cmd");
+               return -ENOMEM;
+       }
+
+       skb->dev = (void *)drv->ndev;
+
+       memcpy(skb_put(skb, len), data, len);
+
+       rc = nfcwilink_send(skb);
+       if (rc)
+               return rc;
+
+       comp_ret = wait_for_completion_timeout(&drv->completed,
+                               msecs_to_jiffies(NFCWILINK_CMD_TIMEOUT));
+       nfc_dev_dbg(&drv->pdev->dev, "wait_for_completion_timeout returned %ld",
+                       comp_ret);
+       if (comp_ret == 0) {
+               nfc_dev_err(&drv->pdev->dev,
+                               "timeout on wait_for_completion_timeout");
+               return -ETIMEDOUT;
+       }
+
+       return 0;
+}
+
+static int nfcwilink_download_fw(struct nfcwilink *drv)
+{
+       unsigned char file_name[BTS_FILE_NAME_MAX_SIZE];
+       const struct firmware *fw;
+       __u16 action_type, action_len;
+       __u8 *ptr;
+       int len, rc;
+
+       nfc_dev_dbg(&drv->pdev->dev, "download_fw entry");
+
+       set_bit(NFCWILINK_FW_DOWNLOAD, &drv->flags);
+
+       rc = nfcwilink_get_bts_file_name(drv, file_name);
+       if (rc)
+               goto exit;
+
+       rc = request_firmware(&fw, file_name, &drv->pdev->dev);
+       if (rc) {
+               nfc_dev_err(&drv->pdev->dev, "request_firmware failed %d", rc);
+
+               /* if the file is not found, don't exit with failure */
+               if (rc == -ENOENT)
+                       rc = 0;
+
+               goto exit;
+       }
+
+       len = fw->size;
+       ptr = (__u8 *)fw->data;
+
+       if ((len == 0) || (ptr == NULL)) {
+               nfc_dev_dbg(&drv->pdev->dev,
+                               "request_firmware returned size %d", len);
+               goto release_fw;
+       }
+
+       if (__le32_to_cpu(((struct bts_file_hdr *)ptr)->magic) !=
+                       BTS_FILE_HDR_MAGIC) {
+               nfc_dev_err(&drv->pdev->dev, "wrong bts magic number");
+               rc = -EINVAL;
+               goto release_fw;
+       }
+
+       /* remove the BTS header */
+       len -= sizeof(struct bts_file_hdr);
+       ptr += sizeof(struct bts_file_hdr);
+
+       while (len > 0) {
+               action_type =
+                       __le16_to_cpu(((struct bts_file_action *)ptr)->type);
+               action_len =
+                       __le16_to_cpu(((struct bts_file_action *)ptr)->len);
+
+               nfc_dev_dbg(&drv->pdev->dev, "bts_file_action type %d, len %d",
+                               action_type, action_len);
+
+               switch (action_type) {
+               case BTS_FILE_ACTION_TYPE_SEND_CMD:
+                       rc = nfcwilink_send_bts_cmd(drv,
+                                       ((struct bts_file_action *)ptr)->data,
+                                       action_len);
+                       if (rc)
+                               goto release_fw;
+                       break;
+               }
+
+               /* advance to the next action */
+               len -= (sizeof(struct bts_file_action) + action_len);
+               ptr += (sizeof(struct bts_file_action) + action_len);
+       }
+
+release_fw:
+       release_firmware(fw);
+
+exit:
+       clear_bit(NFCWILINK_FW_DOWNLOAD, &drv->flags);
+       return rc;
+}
+
 /* Called by ST when registration is complete */
 static void nfcwilink_register_complete(void *priv_data, char data)
 {
@@ -73,7 +343,7 @@ static void nfcwilink_register_complete(void *priv_data, char data)
        drv->st_register_cb_status = data;
 
        /* complete the wait in nfc_st_open() */
-       complete(&drv->st_register_completed);
+       complete(&drv->completed);
 }
 
 /* Called by ST when receive data is available */
@@ -96,6 +366,11 @@ static long nfcwilink_receive(void *priv_data, struct sk_buff *skb)
        (apart for the chnl byte, which is not received in the hdr) */
        skb_pull(skb, (NFCWILINK_HDR_LEN-1));
 
+       if (test_bit(NFCWILINK_FW_DOWNLOAD, &drv->flags)) {
+               nfcwilink_fw_download_receive(drv, skb);
+               return 0;
+       }
+
        skb->dev = (void *) drv->ndev;
 
        /* Forward skb to NCI core layer */
@@ -136,14 +411,14 @@ static int nfcwilink_open(struct nci_dev *ndev)
 
        nfcwilink_proto.priv_data = drv;
 
-       init_completion(&drv->st_register_completed);
+       init_completion(&drv->completed);
        drv->st_register_cb_status = -EINPROGRESS;
 
        rc = st_register(&nfcwilink_proto);
        if (rc < 0) {
                if (rc == -EINPROGRESS) {
                        comp_ret = wait_for_completion_timeout(
-                       &drv->st_register_completed,
+                       &drv->completed,
                        msecs_to_jiffies(NFCWILINK_REGISTER_TIMEOUT));
 
                        nfc_dev_dbg(&drv->pdev->dev,
@@ -171,6 +446,12 @@ static int nfcwilink_open(struct nci_dev *ndev)
        BUG_ON(nfcwilink_proto.write == NULL);
        drv->st_write = nfcwilink_proto.write;
 
+       if (nfcwilink_download_fw(drv)) {
+               nfc_dev_err(&drv->pdev->dev, "nfcwilink_download_fw failed %d",
+                               rc);
+               /* open should succeed, even if the FW download failed */
+       }
+
        goto exit;
 
 clear_exit:
@@ -208,11 +489,13 @@ static int nfcwilink_send(struct sk_buff *skb)
 
        nfc_dev_dbg(&drv->pdev->dev, "send entry, len %d", skb->len);
 
-       if (!test_bit(NFCWILINK_RUNNING, &drv->flags))
-               return -EBUSY;
+       if (!test_bit(NFCWILINK_RUNNING, &drv->flags)) {
+               kfree_skb(skb);
+               return -EINVAL;
+       }
 
        /* add the ST hdr to the start of the buffer */
-       hdr.len = skb->len;
+       hdr.len = cpu_to_le16(skb->len);
        memcpy(skb_push(skb, NFCWILINK_HDR_LEN), &hdr, NFCWILINK_HDR_LEN);
 
        /* Insert skb to shared transport layer's transmit queue.
@@ -239,7 +522,7 @@ static int nfcwilink_probe(struct platform_device *pdev)
 {
        static struct nfcwilink *drv;
        int rc;
-       u32 protocols;
+       __u32 protocols;
 
        nfc_dev_dbg(&pdev->dev, "probe entry");
 
index 6476547..f722c5f 100644 (file)
@@ -2161,6 +2161,24 @@ DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_BROADCOM,
                        PCI_DEVICE_ID_NX2_5709S,
                        quirk_brcm_570x_limit_vpd);
 
+static void __devinit quirk_brcm_5719_limit_mrrs(struct pci_dev *dev)
+{
+       u32 rev;
+
+       pci_read_config_dword(dev, 0xf4, &rev);
+
+       /* Only CAP the MRRS if the device is a 5719 A0 */
+       if (rev == 0x05719000) {
+               int readrq = pcie_get_readrq(dev);
+               if (readrq > 2048)
+                       pcie_set_readrq(dev, 2048);
+       }
+}
+
+DECLARE_PCI_FIXUP_ENABLE(PCI_VENDOR_ID_BROADCOM,
+                        PCI_DEVICE_ID_TIGON3_5719,
+                        quirk_brcm_5719_limit_mrrs);
+
 /* Originally in EDAC sources for i82875P:
  * Intel tells BIOS developers to hide device 6 which
  * configures the overflow device access containing
index 4abc79d..ec7921b 100644 (file)
@@ -906,6 +906,7 @@ void qeth_prepare_ipa_cmd(struct qeth_card *, struct qeth_cmd_buffer *, char);
 struct qeth_cmd_buffer *qeth_wait_for_buffer(struct qeth_channel *);
 int qeth_mdio_read(struct net_device *, int, int);
 int qeth_snmp_command(struct qeth_card *, char __user *);
+int qeth_query_oat_command(struct qeth_card *, char __user *);
 struct qeth_cmd_buffer *qeth_get_adapter_cmd(struct qeth_card *, __u32, __u32);
 int qeth_default_setadapterparms_cb(struct qeth_card *, struct qeth_reply *,
                                        unsigned long);
index 9c3f38d..cbb1018 100644 (file)
@@ -26,6 +26,7 @@
 #include <asm/ebcdic.h>
 #include <asm/io.h>
 #include <asm/sysinfo.h>
+#include <asm/compat.h>
 
 #include "qeth_core.h"
 
@@ -677,6 +678,7 @@ void qeth_release_buffer(struct qeth_channel *channel,
        iob->callback = qeth_send_control_data_cb;
        iob->rc = 0;
        spin_unlock_irqrestore(&channel->iob_lock, flags);
+       wake_up(&channel->wait_q);
 }
 EXPORT_SYMBOL_GPL(qeth_release_buffer);
 
@@ -4402,6 +4404,104 @@ int qeth_snmp_command(struct qeth_card *card, char __user *udata)
 }
 EXPORT_SYMBOL_GPL(qeth_snmp_command);
 
+static int qeth_setadpparms_query_oat_cb(struct qeth_card *card,
+               struct qeth_reply *reply, unsigned long data)
+{
+       struct qeth_ipa_cmd *cmd;
+       struct qeth_qoat_priv *priv;
+       char *resdata;
+       int resdatalen;
+
+       QETH_CARD_TEXT(card, 3, "qoatcb");
+
+       cmd = (struct qeth_ipa_cmd *)data;
+       priv = (struct qeth_qoat_priv *)reply->param;
+       resdatalen = cmd->data.setadapterparms.hdr.cmdlength;
+       resdata = (char *)data + 28;
+
+       if (resdatalen > (priv->buffer_len - priv->response_len)) {
+               cmd->hdr.return_code = IPA_RC_FFFF;
+               return 0;
+       }
+
+       memcpy((priv->buffer + priv->response_len), resdata,
+               resdatalen);
+       priv->response_len += resdatalen;
+
+       if (cmd->data.setadapterparms.hdr.seq_no <
+           cmd->data.setadapterparms.hdr.used_total)
+               return 1;
+       return 0;
+}
+
+int qeth_query_oat_command(struct qeth_card *card, char __user *udata)
+{
+       int rc = 0;
+       struct qeth_cmd_buffer *iob;
+       struct qeth_ipa_cmd *cmd;
+       struct qeth_query_oat *oat_req;
+       struct qeth_query_oat_data oat_data;
+       struct qeth_qoat_priv priv;
+       void __user *tmp;
+
+       QETH_CARD_TEXT(card, 3, "qoatcmd");
+
+       if (!qeth_adp_supported(card, IPA_SETADP_QUERY_OAT)) {
+               rc = -EOPNOTSUPP;
+               goto out;
+       }
+
+       if (copy_from_user(&oat_data, udata,
+           sizeof(struct qeth_query_oat_data))) {
+                       rc = -EFAULT;
+                       goto out;
+       }
+
+       priv.buffer_len = oat_data.buffer_len;
+       priv.response_len = 0;
+       priv.buffer =  kzalloc(oat_data.buffer_len, GFP_KERNEL);
+       if (!priv.buffer) {
+               rc = -ENOMEM;
+               goto out;
+       }
+
+       iob = qeth_get_adapter_cmd(card, IPA_SETADP_QUERY_OAT,
+                                  sizeof(struct qeth_ipacmd_setadpparms_hdr) +
+                                  sizeof(struct qeth_query_oat));
+       cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
+       oat_req = &cmd->data.setadapterparms.data.query_oat;
+       oat_req->subcmd_code = oat_data.command;
+
+       rc = qeth_send_ipa_cmd(card, iob, qeth_setadpparms_query_oat_cb,
+                              &priv);
+       if (!rc) {
+               if (is_compat_task())
+                       tmp = compat_ptr(oat_data.ptr);
+               else
+                       tmp = (void __user *)(unsigned long)oat_data.ptr;
+
+               if (copy_to_user(tmp, priv.buffer,
+                   priv.response_len)) {
+                       rc = -EFAULT;
+                       goto out_free;
+               }
+
+               oat_data.response_len = priv.response_len;
+
+               if (copy_to_user(udata, &oat_data,
+                   sizeof(struct qeth_query_oat_data)))
+                       rc = -EFAULT;
+       } else
+               if (rc == IPA_RC_FFFF)
+                       rc = -EFAULT;
+
+out_free:
+       kfree(priv.buffer);
+out:
+       return rc;
+}
+EXPORT_SYMBOL_GPL(qeth_query_oat_command);
+
 static inline int qeth_get_qdio_q_format(struct qeth_card *card)
 {
        switch (card->info.type) {
index e5a9d1c..578e19a 100644 (file)
@@ -249,6 +249,7 @@ enum qeth_ipa_setadp_cmd {
        IPA_SETADP_SET_PROMISC_MODE             = 0x00000800L,
        IPA_SETADP_SET_DIAG_ASSIST              = 0x00002000L,
        IPA_SETADP_SET_ACCESS_CONTROL           = 0x00010000L,
+       IPA_SETADP_QUERY_OAT                    = 0x00080000L,
 };
 enum qeth_ipa_mac_ops {
        CHANGE_ADDR_READ_MAC            = 0,
@@ -398,6 +399,17 @@ struct qeth_set_access_ctrl {
        __u32 subcmd_code;
 } __attribute__((packed));
 
+struct qeth_query_oat {
+       __u32 subcmd_code;
+       __u8 reserved[12];
+} __packed;
+
+struct qeth_qoat_priv {
+       __u32 buffer_len;
+       __u32 response_len;
+       char *buffer;
+};
+
 struct qeth_ipacmd_setadpparms_hdr {
        __u32 supp_hw_cmds;
        __u32 reserved1;
@@ -417,6 +429,7 @@ struct qeth_ipacmd_setadpparms {
                struct qeth_change_addr change_addr;
                struct qeth_snmp_cmd snmp;
                struct qeth_set_access_ctrl set_access_ctrl;
+               struct qeth_query_oat query_oat;
                __u32 mode;
        } data;
 } __attribute__ ((packed));
index c129671..e5c9cf1 100644 (file)
@@ -75,6 +75,9 @@ static int qeth_l2_do_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
                        mii_data->val_out = qeth_mdio_read(dev,
                                mii_data->phy_id, mii_data->reg_num);
                break;
+       case SIOC_QETH_QUERY_OAT:
+               rc = qeth_query_oat_command(card, rq->ifr_ifru.ifru_data);
+               break;
        default:
                rc = -EOPNOTSUPP;
        }
index 9648e4e..73bf888 100644 (file)
@@ -28,6 +28,8 @@
 
 #include <net/ip.h>
 #include <net/arp.h>
+#include <net/route.h>
+#include <net/ip6_fib.h>
 #include <net/ip6_checksum.h>
 #include <net/iucv/af_iucv.h>
 
@@ -2743,6 +2745,9 @@ static int qeth_l3_do_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
                                                        mii_data->phy_id,
                                                        mii_data->reg_num);
                break;
+       case SIOC_QETH_QUERY_OAT:
+               rc = qeth_query_oat_command(card, rq->ifr_ifru.ifru_data);
+               break;
        default:
                rc = -EOPNOTSUPP;
        }
@@ -2832,7 +2837,6 @@ static void qeth_l3_fill_af_iucv_hdr(struct qeth_card *card,
 static void qeth_l3_fill_header(struct qeth_card *card, struct qeth_hdr *hdr,
                struct sk_buff *skb, int ipv, int cast_type)
 {
-       struct neighbour *n = NULL;
        struct dst_entry *dst;
 
        memset(hdr, 0, sizeof(struct qeth_hdr));
@@ -2855,33 +2859,29 @@ static void qeth_l3_fill_header(struct qeth_card *card, struct qeth_hdr *hdr,
 
        rcu_read_lock();
        dst = skb_dst(skb);
-       if (dst)
-               n = dst_get_neighbour_noref(dst);
        if (ipv == 4) {
+               struct rtable *rt = (struct rtable *) dst;
+               __be32 *pkey = &ip_hdr(skb)->daddr;
+
+               if (rt->rt_gateway)
+                       pkey = &rt->rt_gateway;
+
                /* IPv4 */
                hdr->hdr.l3.flags = qeth_l3_get_qeth_hdr_flags4(cast_type);
                memset(hdr->hdr.l3.dest_addr, 0, 12);
-               if (n) {
-                       *((u32 *) (&hdr->hdr.l3.dest_addr[12])) =
-                           *((u32 *) n->primary_key);
-               } else {
-                       /* fill in destination address used in ip header */
-                       *((u32 *) (&hdr->hdr.l3.dest_addr[12])) =
-                                                       ip_hdr(skb)->daddr;
-               }
+               *((__be32 *) (&hdr->hdr.l3.dest_addr[12])) = *pkey;
        } else if (ipv == 6) {
+               struct rt6_info *rt = (struct rt6_info *) dst;
+               struct in6_addr *pkey = &ipv6_hdr(skb)->daddr;
+
+               if (!ipv6_addr_any(&rt->rt6i_gateway))
+                       pkey = &rt->rt6i_gateway;
+
                /* IPv6 */
                hdr->hdr.l3.flags = qeth_l3_get_qeth_hdr_flags6(cast_type);
                if (card->info.type == QETH_CARD_TYPE_IQD)
                        hdr->hdr.l3.flags &= ~QETH_HDR_PASSTHRU;
-               if (n) {
-                       memcpy(hdr->hdr.l3.dest_addr,
-                              n->primary_key, 16);
-               } else {
-                       /* fill in destination address used in ip header */
-                       memcpy(hdr->hdr.l3.dest_addr,
-                              &ipv6_hdr(skb)->daddr, 16);
-               }
+               memcpy(hdr->hdr.l3.dest_addr, pkey, 16);
        } else {
                /* passthrough */
                if ((skb->dev->type == ARPHRD_IEEE802_TR) &&
index 399cda0..c12702b 100644 (file)
@@ -7,7 +7,7 @@
 
 /* Current FCoE HSI version number composed of two fields (16 bit) */
 /* Implies on a change broken previous HSI */
-#define FCOE_HSI_MAJOR_VERSION (1)
+#define FCOE_HSI_MAJOR_VERSION (2)
 /* Implies on a change which does not broken previous HSI */
 #define FCOE_HSI_MINOR_VERSION (1)
 
index 1923a25..afd5709 100644 (file)
@@ -1716,15 +1716,19 @@ void bnx2fc_init_task(struct bnx2fc_cmd *io_req,
 
        /* Tx only */
        bd_count = bd_tbl->bd_valid;
+       cached_sge = &task->rxwr_only.union_ctx.read_info.sgl_ctx.cached_sge;
        if (task_type == FCOE_TASK_TYPE_WRITE) {
                if ((dev_type == TYPE_DISK) && (bd_count == 1)) {
                        struct fcoe_bd_ctx *fcoe_bd_tbl = bd_tbl->bd_tbl;
 
                        task->txwr_only.sgl_ctx.cached_sge.cur_buf_addr.lo =
+                       cached_sge->cur_buf_addr.lo =
                                        fcoe_bd_tbl->buf_addr_lo;
                        task->txwr_only.sgl_ctx.cached_sge.cur_buf_addr.hi =
+                       cached_sge->cur_buf_addr.hi =
                                        fcoe_bd_tbl->buf_addr_hi;
                        task->txwr_only.sgl_ctx.cached_sge.cur_buf_rem =
+                       cached_sge->cur_buf_rem =
                                        fcoe_bd_tbl->buf_len;
 
                        task->txwr_rxrd.const_ctx.init_flags |= 1 <<
@@ -1790,11 +1794,13 @@ void bnx2fc_init_task(struct bnx2fc_cmd *io_req,
        task->rxwr_txrd.var_ctx.rx_id = 0xffff;
 
        /* Rx Only */
-       cached_sge = &task->rxwr_only.union_ctx.read_info.sgl_ctx.cached_sge;
+       if (task_type != FCOE_TASK_TYPE_READ)
+               return;
+
        sgl = &task->rxwr_only.union_ctx.read_info.sgl_ctx.sgl;
        bd_count = bd_tbl->bd_valid;
-       if (task_type == FCOE_TASK_TYPE_READ &&
-           dev_type == TYPE_DISK) {
+
+       if (dev_type == TYPE_DISK) {
                if (bd_count == 1) {
 
                        struct fcoe_bd_ctx *fcoe_bd_tbl = bd_tbl->bd_tbl;
index e5a2e0e..b58fef7 100644 (file)
@@ -13,6 +13,9 @@
 #include <linux/ssb/ssb_driver_chipcommon.h>
 #include <linux/delay.h>
 #include <linux/export.h>
+#ifdef CONFIG_BCM47XX
+#include <asm/mach-bcm47xx/nvram.h>
+#endif
 
 #include "ssb_private.h"
 
@@ -92,10 +95,6 @@ static void ssb_pmu0_pllinit_r0(struct ssb_chipcommon *cc,
        u32 pmuctl, tmp, pllctl;
        unsigned int i;
 
-       if ((bus->chip_id == 0x5354) && !crystalfreq) {
-               /* The 5354 crystal freq is 25MHz */
-               crystalfreq = 25000;
-       }
        if (crystalfreq)
                e = pmu0_plltab_find_entry(crystalfreq);
        if (!e)
@@ -321,7 +320,11 @@ static void ssb_pmu_pll_init(struct ssb_chipcommon *cc)
        u32 crystalfreq = 0; /* in kHz. 0 = keep default freq. */
 
        if (bus->bustype == SSB_BUSTYPE_SSB) {
-               /* TODO: The user may override the crystal frequency. */
+#ifdef CONFIG_BCM47XX
+               char buf[20];
+               if (nvram_getenv("xtalfreq", buf, sizeof(buf)) >= 0)
+                       crystalfreq = simple_strtoul(buf, NULL, 0);
+#endif
        }
 
        switch (bus->chip_id) {
@@ -330,7 +333,11 @@ static void ssb_pmu_pll_init(struct ssb_chipcommon *cc)
                ssb_pmu1_pllinit_r0(cc, crystalfreq);
                break;
        case 0x4328:
+               ssb_pmu0_pllinit_r0(cc, crystalfreq);
+               break;
        case 0x5354:
+               if (crystalfreq == 0)
+                       crystalfreq = 25000;
                ssb_pmu0_pllinit_r0(cc, crystalfreq);
                break;
        case 0x4322:
@@ -607,3 +614,34 @@ void ssb_pmu_set_ldo_paref(struct ssb_chipcommon *cc, bool on)
 
 EXPORT_SYMBOL(ssb_pmu_set_ldo_voltage);
 EXPORT_SYMBOL(ssb_pmu_set_ldo_paref);
+
+u32 ssb_pmu_get_cpu_clock(struct ssb_chipcommon *cc)
+{
+       struct ssb_bus *bus = cc->dev->bus;
+
+       switch (bus->chip_id) {
+       case 0x5354:
+               /* 5354 chip uses a non programmable PLL of frequency 240MHz */
+               return 240000000;
+       default:
+               ssb_printk(KERN_ERR PFX
+                          "ERROR: PMU cpu clock unknown for device %04X\n",
+                          bus->chip_id);
+               return 0;
+       }
+}
+
+u32 ssb_pmu_get_controlclock(struct ssb_chipcommon *cc)
+{
+       struct ssb_bus *bus = cc->dev->bus;
+
+       switch (bus->chip_id) {
+       case 0x5354:
+               return 120000000;
+       default:
+               ssb_printk(KERN_ERR PFX
+                          "ERROR: PMU controlclock unknown for device %04X\n",
+                          bus->chip_id);
+               return 0;
+       }
+}
index ced5015..7e2ddc0 100644 (file)
@@ -208,6 +208,9 @@ u32 ssb_cpu_clock(struct ssb_mipscore *mcore)
        struct ssb_bus *bus = mcore->dev->bus;
        u32 pll_type, n, m, rate = 0;
 
+       if (bus->chipco.capabilities & SSB_CHIPCO_CAP_PMU)
+               return ssb_pmu_get_cpu_clock(&bus->chipco);
+
        if (bus->extif.dev) {
                ssb_extif_get_clockcontrol(&bus->extif, &pll_type, &n, &m);
        } else if (bus->chipco.dev) {
index bb6317f..2a0a1b9 100644 (file)
@@ -1094,6 +1094,9 @@ u32 ssb_clockspeed(struct ssb_bus *bus)
        u32 plltype;
        u32 clkctl_n, clkctl_m;
 
+       if (bus->chipco.capabilities & SSB_CHIPCO_CAP_PMU)
+               return ssb_pmu_get_controlclock(&bus->chipco);
+
        if (ssb_extif_available(&bus->extif))
                ssb_extif_get_clockcontrol(&bus->extif, &plltype,
                                           &clkctl_n, &clkctl_m);
index 973223f..befa89e 100644 (file)
@@ -523,7 +523,13 @@ static void sprom_extract_r45(struct ssb_sprom *out, const u16 *in)
 static void sprom_extract_r8(struct ssb_sprom *out, const u16 *in)
 {
        int i;
-       u16 v;
+       u16 v, o;
+       u16 pwr_info_offset[] = {
+               SSB_SROM8_PWR_INFO_CORE0, SSB_SROM8_PWR_INFO_CORE1,
+               SSB_SROM8_PWR_INFO_CORE2, SSB_SROM8_PWR_INFO_CORE3
+       };
+       BUILD_BUG_ON(ARRAY_SIZE(pwr_info_offset) !=
+                       ARRAY_SIZE(out->core_pwr_info));
 
        /* extract the MAC address */
        for (i = 0; i < 3; i++) {
@@ -607,6 +613,38 @@ static void sprom_extract_r8(struct ssb_sprom *out, const u16 *in)
        memcpy(&out->antenna_gain.ghz5, &out->antenna_gain.ghz24,
               sizeof(out->antenna_gain.ghz5));
 
+       /* Extract cores power info info */
+       for (i = 0; i < ARRAY_SIZE(pwr_info_offset); i++) {
+               o = pwr_info_offset[i];
+               SPEX(core_pwr_info[i].itssi_2g, o + SSB_SROM8_2G_MAXP_ITSSI,
+                       SSB_SPROM8_2G_ITSSI, SSB_SPROM8_2G_ITSSI_SHIFT);
+               SPEX(core_pwr_info[i].maxpwr_2g, o + SSB_SROM8_2G_MAXP_ITSSI,
+                       SSB_SPROM8_2G_MAXP, 0);
+
+               SPEX(core_pwr_info[i].pa_2g[0], o + SSB_SROM8_2G_PA_0, ~0, 0);
+               SPEX(core_pwr_info[i].pa_2g[1], o + SSB_SROM8_2G_PA_1, ~0, 0);
+               SPEX(core_pwr_info[i].pa_2g[2], o + SSB_SROM8_2G_PA_2, ~0, 0);
+
+               SPEX(core_pwr_info[i].itssi_5g, o + SSB_SROM8_5G_MAXP_ITSSI,
+                       SSB_SPROM8_5G_ITSSI, SSB_SPROM8_5G_ITSSI_SHIFT);
+               SPEX(core_pwr_info[i].maxpwr_5g, o + SSB_SROM8_5G_MAXP_ITSSI,
+                       SSB_SPROM8_5G_MAXP, 0);
+               SPEX(core_pwr_info[i].maxpwr_5gh, o + SSB_SPROM8_5GHL_MAXP,
+                       SSB_SPROM8_5GH_MAXP, 0);
+               SPEX(core_pwr_info[i].maxpwr_5gl, o + SSB_SPROM8_5GHL_MAXP,
+                       SSB_SPROM8_5GL_MAXP, SSB_SPROM8_5GL_MAXP_SHIFT);
+
+               SPEX(core_pwr_info[i].pa_5gl[0], o + SSB_SROM8_5GL_PA_0, ~0, 0);
+               SPEX(core_pwr_info[i].pa_5gl[1], o + SSB_SROM8_5GL_PA_1, ~0, 0);
+               SPEX(core_pwr_info[i].pa_5gl[2], o + SSB_SROM8_5GL_PA_2, ~0, 0);
+               SPEX(core_pwr_info[i].pa_5g[0], o + SSB_SROM8_5G_PA_0, ~0, 0);
+               SPEX(core_pwr_info[i].pa_5g[1], o + SSB_SROM8_5G_PA_1, ~0, 0);
+               SPEX(core_pwr_info[i].pa_5g[2], o + SSB_SROM8_5G_PA_2, ~0, 0);
+               SPEX(core_pwr_info[i].pa_5gh[0], o + SSB_SROM8_5GH_PA_0, ~0, 0);
+               SPEX(core_pwr_info[i].pa_5gh[1], o + SSB_SROM8_5GH_PA_1, ~0, 0);
+               SPEX(core_pwr_info[i].pa_5gh[2], o + SSB_SROM8_5GH_PA_2, ~0, 0);
+       }
+
        /* Extract FEM info */
        SPEX(fem.ghz2.tssipos, SSB_SPROM8_FEM2G,
                SSB_SROM8_FEM_TSSIPOS, SSB_SROM8_FEM_TSSIPOS_SHIFT);
index 3e84487..266c7c5 100644 (file)
@@ -318,6 +318,9 @@ int ssb_bus_scan(struct ssb_bus *bus,
                        bus->chip_package = 0;
                }
        }
+       ssb_printk(KERN_INFO PFX "Found chip with id 0x%04X, rev 0x%02X and "
+                  "package 0x%02X\n", bus->chip_id, bus->chip_rev,
+                  bus->chip_package);
        if (!bus->nr_devices)
                bus->nr_devices = chipid_to_nrcores(bus->chip_id);
        if (bus->nr_devices > ARRAY_SIZE(bus->devices)) {
index 7765301..a305550 100644 (file)
@@ -207,4 +207,8 @@ static inline void b43_pci_ssb_bridge_exit(void)
 }
 #endif /* CONFIG_SSB_B43_PCI_BRIDGE */
 
+/* driver_chipcommon_pmu.c */
+extern u32 ssb_pmu_get_cpu_clock(struct ssb_chipcommon *cc);
+extern u32 ssb_pmu_get_controlclock(struct ssb_chipcommon *cc);
+
 #endif /* LINUX_SSB_PRIVATE_H_ */
index 2c4069f..b055731 100644 (file)
@@ -5177,7 +5177,7 @@ static int et131x_set_mac_addr(struct net_device *netdev, void *new_mac)
 
        /* Make sure the requested MAC is valid */
        if (!is_valid_ether_addr(address->sa_data))
-               return -EINVAL;
+               return -EADDRNOTAVAIL;
 
        et131x_disable_txrx(netdev);
        et131x_handle_send_interrupt(adapter);
index 917bbb0..7569aa0 100644 (file)
@@ -2211,11 +2211,8 @@ struct net_device *init_ft1000_card(struct pcmcia_device *link,
        ft1000InitProc(dev);
        ft1000_card_present = 1;
        SET_ETHTOOL_OPS(dev, &ops);
-       printk(KERN_INFO
-                  "ft1000: %s: addr 0x%04lx irq %d, MAC addr %02x:%02x:%02x:%02x:%02x:%02x\n",
-                  dev->name, dev->base_addr, dev->irq, dev->dev_addr[0],
-                  dev->dev_addr[1], dev->dev_addr[2], dev->dev_addr[3],
-                  dev->dev_addr[4], dev->dev_addr[5]);
+       printk(KERN_INFO "ft1000: %s: addr 0x%04lx irq %d, MAC addr %pM\n",
+                       dev->name, dev->base_addr, dev->irq, dev->dev_addr);
        return dev;
 
 err_unreg:
index 2faee2d..a2cbb29 100644 (file)
@@ -229,7 +229,6 @@ static int wl_adapter_resume(struct pcmcia_device *link)
 void wl_adapter_insert(struct pcmcia_device *link)
 {
        struct net_device *dev;
-       int i;
        int ret;
        /*--------------------------------------------------------------------*/
 
@@ -266,10 +265,8 @@ void wl_adapter_insert(struct pcmcia_device *link)
 
        register_wlags_sysfs(dev);
 
-       printk(KERN_INFO "%s: Wireless, io_addr %#03lx, irq %d, ""mac_address ",
-               dev->name, dev->base_addr, dev->irq);
-       for (i = 0; i < ETH_ALEN; i++)
-               printk("%02X%c", dev->dev_addr[i], ((i < (ETH_ALEN-1)) ? ':' : '\n'));
+       printk(KERN_INFO "%s: Wireless, io_addr %#03lx, irq %d, mac_address"
+               " %pM\n", dev->name, dev->base_addr, dev->irq, dev->dev_addr);
 
        DBG_LEAVE(DbgInfo);
        return;
index f7daeea..57c8b48 100644 (file)
@@ -22,7 +22,7 @@
 #include <linux/ppp_channel.h>
 #include <linux/ppp_defs.h>
 #include <linux/slab.h>
-#include <linux/if_ppp.h>
+#include <linux/ppp-ioctl.h>
 #include <linux/skbuff.h>
 
 #include "network.h"
index ef92869..2ffa0b7 100644 (file)
@@ -21,7 +21,7 @@
 #include <linux/mutex.h>
 #include <linux/ppp_defs.h>
 #include <linux/if.h>
-#include <linux/if_ppp.h>
+#include <linux/ppp-ioctl.h>
 #include <linux/sched.h>
 #include <linux/serial.h>
 #include <linux/slab.h>
index a26bea1..10d8cd9 100644 (file)
@@ -34,7 +34,7 @@
 #include <linux/fs.h>
 #include <linux/file.h>
 #include <linux/ppp_defs.h>
-#include <linux/if_ppp.h>
+#include <linux/ppp-ioctl.h>
 #include <linux/if_pppox.h>
 #include <linux/mtio.h>
 #include <linux/auto_fs.h>
index 49c1704..b1bea03 100644 (file)
@@ -67,4 +67,9 @@
 
 #define SO_WIFI_STATUS         41
 #define SCM_WIFI_STATUS        SO_WIFI_STATUS
+#define SO_PEEK_OFF            42
+
+/* Instruct lower device to use last 4-bytes of skb data as FCS */
+#define SO_NOFCS               43
+
 #endif /* __ASM_GENERIC_SOCKET_H */
index c94e717..a255553 100644 (file)
@@ -238,6 +238,7 @@ header-y += magic.h
 header-y += major.h
 header-y += map_to_7segment.h
 header-y += matroxfb.h
+header-y += mdio.h
 header-y += media.h
 header-y += mempolicy.h
 header-y += meye.h
@@ -304,6 +305,7 @@ header-y += poll.h
 header-y += posix_types.h
 header-y += ppdev.h
 header-y += ppp-comp.h
+header-y += ppp-ioctl.h
 header-y += ppp_defs.h
 header-y += pps.h
 header-y += prctl.h
index 83c209f..b9f65fb 100644 (file)
@@ -136,6 +136,7 @@ struct bcma_device {
        bool dev_registered;
 
        u8 core_index;
+       u8 core_unit;
 
        u32 addr;
        u32 wrap;
@@ -195,6 +196,7 @@ struct bcma_bus {
        struct list_head cores;
        u8 nr_cores;
        u8 init_done:1;
+       u8 num;
 
        struct bcma_drv_cc drv_cc;
        struct bcma_drv_pci drv_pci;
index a33086a..e72938b 100644 (file)
 #define BCMA_CC_FLASH_CFG              0x0128
 #define  BCMA_CC_FLASH_CFG_DS          0x0010  /* Data size, 0=8bit, 1=16bit */
 #define BCMA_CC_FLASH_WAITCNT          0x012C
+#define BCMA_CC_SROM_CONTROL           0x0190
+#define  BCMA_CC_SROM_CONTROL_START    0x80000000
+#define  BCMA_CC_SROM_CONTROL_BUSY     0x80000000
+#define  BCMA_CC_SROM_CONTROL_OPCODE   0x60000000
+#define  BCMA_CC_SROM_CONTROL_OP_READ  0x00000000
+#define  BCMA_CC_SROM_CONTROL_OP_WRITE 0x20000000
+#define  BCMA_CC_SROM_CONTROL_OP_WRDIS 0x40000000
+#define  BCMA_CC_SROM_CONTROL_OP_WREN  0x60000000
+#define  BCMA_CC_SROM_CONTROL_OTPSEL   0x00000010
+#define  BCMA_CC_SROM_CONTROL_LOCK     0x00000008
+#define  BCMA_CC_SROM_CONTROL_SIZE_MASK        0x00000006
+#define  BCMA_CC_SROM_CONTROL_SIZE_1K  0x00000000
+#define  BCMA_CC_SROM_CONTROL_SIZE_4K  0x00000002
+#define  BCMA_CC_SROM_CONTROL_SIZE_16K 0x00000004
+#define  BCMA_CC_SROM_CONTROL_SIZE_SHIFT       1
+#define  BCMA_CC_SROM_CONTROL_PRESENT  0x00000001
 /* 0x1E0 is defined as shared BCMA_CLKCTLST */
 #define BCMA_CC_HW_WORKAROUND          0x01E4 /* Hardware workaround (rev >= 20) */
 #define BCMA_CC_UART0_DATA             0x0300
index 3871b66..46c71e2 100644 (file)
@@ -53,6 +53,35 @@ struct pci_dev;
 #define  BCMA_CORE_PCI_SBTOPCI1_MASK           0xFC000000
 #define BCMA_CORE_PCI_SBTOPCI2                 0x0108  /* Backplane to PCI translation 2 (sbtopci2) */
 #define  BCMA_CORE_PCI_SBTOPCI2_MASK           0xC0000000
+#define BCMA_CORE_PCI_CONFIG_ADDR              0x0120  /* pcie config space access */
+#define BCMA_CORE_PCI_CONFIG_DATA              0x0124  /* pcie config space access */
+#define BCMA_CORE_PCI_MDIO_CONTROL             0x0128  /* controls the mdio access */
+#define  BCMA_CORE_PCI_MDIOCTL_DIVISOR_MASK    0x7f    /* clock to be used on MDIO */
+#define  BCMA_CORE_PCI_MDIOCTL_DIVISOR_VAL     0x2
+#define  BCMA_CORE_PCI_MDIOCTL_PREAM_EN                0x80    /* Enable preamble sequnce */
+#define  BCMA_CORE_PCI_MDIOCTL_ACCESS_DONE     0x100   /* Tranaction complete */
+#define BCMA_CORE_PCI_MDIO_DATA                        0x012c  /* Data to the mdio access */
+#define  BCMA_CORE_PCI_MDIODATA_MASK           0x0000ffff /* data 2 bytes */
+#define  BCMA_CORE_PCI_MDIODATA_TA             0x00020000 /* Turnaround */
+#define  BCMA_CORE_PCI_MDIODATA_REGADDR_SHF_OLD        18      /* Regaddr shift (rev < 10) */
+#define  BCMA_CORE_PCI_MDIODATA_REGADDR_MASK_OLD       0x003c0000 /* Regaddr Mask (rev < 10) */
+#define  BCMA_CORE_PCI_MDIODATA_DEVADDR_SHF_OLD        22      /* Physmedia devaddr shift (rev < 10) */
+#define  BCMA_CORE_PCI_MDIODATA_DEVADDR_MASK_OLD       0x0fc00000 /* Physmedia devaddr Mask (rev < 10) */
+#define  BCMA_CORE_PCI_MDIODATA_REGADDR_SHF    18      /* Regaddr shift */
+#define  BCMA_CORE_PCI_MDIODATA_REGADDR_MASK   0x007c0000 /* Regaddr Mask */
+#define  BCMA_CORE_PCI_MDIODATA_DEVADDR_SHF    23      /* Physmedia devaddr shift */
+#define  BCMA_CORE_PCI_MDIODATA_DEVADDR_MASK   0x0f800000 /* Physmedia devaddr Mask */
+#define  BCMA_CORE_PCI_MDIODATA_WRITE          0x10000000 /* write Transaction */
+#define  BCMA_CORE_PCI_MDIODATA_READ           0x20000000 /* Read Transaction */
+#define  BCMA_CORE_PCI_MDIODATA_START          0x40000000 /* start of Transaction */
+#define  BCMA_CORE_PCI_MDIODATA_DEV_ADDR       0x0     /* dev address for serdes */
+#define  BCMA_CORE_PCI_MDIODATA_BLK_ADDR       0x1F    /* blk address for serdes */
+#define  BCMA_CORE_PCI_MDIODATA_DEV_PLL                0x1d    /* SERDES PLL Dev */
+#define  BCMA_CORE_PCI_MDIODATA_DEV_TX         0x1e    /* SERDES TX Dev */
+#define  BCMA_CORE_PCI_MDIODATA_DEV_RX         0x1f    /* SERDES RX Dev */
+#define BCMA_CORE_PCI_PCIEIND_ADDR             0x0130  /* indirect access to the internal register */
+#define BCMA_CORE_PCI_PCIEIND_DATA             0x0134  /* Data to/from the internal regsiter */
+#define BCMA_CORE_PCI_CLKREQENCTRL             0x0138  /*  >= rev 6, Clkreq rdma control */
 #define BCMA_CORE_PCI_PCICFG0                  0x0400  /* PCI config space 0 (rev >= 8) */
 #define BCMA_CORE_PCI_PCICFG1                  0x0500  /* PCI config space 1 (rev >= 8) */
 #define BCMA_CORE_PCI_PCICFG2                  0x0600  /* PCI config space 2 (rev >= 8) */
@@ -72,20 +101,114 @@ struct pci_dev;
 #define  BCMA_CORE_PCI_SBTOPCI_RC_READL                0x00000010 /* Memory read line */
 #define  BCMA_CORE_PCI_SBTOPCI_RC_READM                0x00000020 /* Memory read multiple */
 
+/* PCIE protocol PHY diagnostic registers */
+#define BCMA_CORE_PCI_PLP_MODEREG              0x200   /* Mode */
+#define BCMA_CORE_PCI_PLP_STATUSREG            0x204   /* Status */
+#define  BCMA_CORE_PCI_PLP_POLARITYINV_STAT    0x10    /* Status reg PCIE_PLP_STATUSREG */
+#define BCMA_CORE_PCI_PLP_LTSSMCTRLREG         0x208   /* LTSSM control */
+#define BCMA_CORE_PCI_PLP_LTLINKNUMREG         0x20c   /* Link Training Link number */
+#define BCMA_CORE_PCI_PLP_LTLANENUMREG         0x210   /* Link Training Lane number */
+#define BCMA_CORE_PCI_PLP_LTNFTSREG            0x214   /* Link Training N_FTS */
+#define BCMA_CORE_PCI_PLP_ATTNREG              0x218   /* Attention */
+#define BCMA_CORE_PCI_PLP_ATTNMASKREG          0x21C   /* Attention Mask */
+#define BCMA_CORE_PCI_PLP_RXERRCTR             0x220   /* Rx Error */
+#define BCMA_CORE_PCI_PLP_RXFRMERRCTR          0x224   /* Rx Framing Error */
+#define BCMA_CORE_PCI_PLP_RXERRTHRESHREG       0x228   /* Rx Error threshold */
+#define BCMA_CORE_PCI_PLP_TESTCTRLREG          0x22C   /* Test Control reg */
+#define BCMA_CORE_PCI_PLP_SERDESCTRLOVRDREG    0x230   /* SERDES Control Override */
+#define BCMA_CORE_PCI_PLP_TIMINGOVRDREG                0x234   /* Timing param override */
+#define BCMA_CORE_PCI_PLP_RXTXSMDIAGREG                0x238   /* RXTX State Machine Diag */
+#define BCMA_CORE_PCI_PLP_LTSSMDIAGREG         0x23C   /* LTSSM State Machine Diag */
+
+/* PCIE protocol DLLP diagnostic registers */
+#define BCMA_CORE_PCI_DLLP_LCREG               0x100   /* Link Control */
+#define BCMA_CORE_PCI_DLLP_LSREG               0x104   /* Link Status */
+#define BCMA_CORE_PCI_DLLP_LAREG               0x108   /* Link Attention */
+#define  BCMA_CORE_PCI_DLLP_LSREG_LINKUP       (1 << 16)
+#define BCMA_CORE_PCI_DLLP_LAMASKREG           0x10C   /* Link Attention Mask */
+#define BCMA_CORE_PCI_DLLP_NEXTTXSEQNUMREG     0x110   /* Next Tx Seq Num */
+#define BCMA_CORE_PCI_DLLP_ACKEDTXSEQNUMREG    0x114   /* Acked Tx Seq Num */
+#define BCMA_CORE_PCI_DLLP_PURGEDTXSEQNUMREG   0x118   /* Purged Tx Seq Num */
+#define BCMA_CORE_PCI_DLLP_RXSEQNUMREG         0x11C   /* Rx Sequence Number */
+#define BCMA_CORE_PCI_DLLP_LRREG               0x120   /* Link Replay */
+#define BCMA_CORE_PCI_DLLP_LACKTOREG           0x124   /* Link Ack Timeout */
+#define BCMA_CORE_PCI_DLLP_PMTHRESHREG         0x128   /* Power Management Threshold */
+#define BCMA_CORE_PCI_DLLP_RTRYWPREG           0x12C   /* Retry buffer write ptr */
+#define BCMA_CORE_PCI_DLLP_RTRYRPREG           0x130   /* Retry buffer Read ptr */
+#define BCMA_CORE_PCI_DLLP_RTRYPPREG           0x134   /* Retry buffer Purged ptr */
+#define BCMA_CORE_PCI_DLLP_RTRRWREG            0x138   /* Retry buffer Read/Write */
+#define BCMA_CORE_PCI_DLLP_ECTHRESHREG         0x13C   /* Error Count Threshold */
+#define BCMA_CORE_PCI_DLLP_TLPERRCTRREG                0x140   /* TLP Error Counter */
+#define BCMA_CORE_PCI_DLLP_ERRCTRREG           0x144   /* Error Counter */
+#define BCMA_CORE_PCI_DLLP_NAKRXCTRREG         0x148   /* NAK Received Counter */
+#define BCMA_CORE_PCI_DLLP_TESTREG             0x14C   /* Test */
+#define BCMA_CORE_PCI_DLLP_PKTBIST             0x150   /* Packet BIST */
+#define BCMA_CORE_PCI_DLLP_PCIE11              0x154   /* DLLP PCIE 1.1 reg */
+
+/* SERDES RX registers */
+#define BCMA_CORE_PCI_SERDES_RX_CTRL           1       /* Rx cntrl */
+#define  BCMA_CORE_PCI_SERDES_RX_CTRL_FORCE    0x80    /* rxpolarity_force */
+#define  BCMA_CORE_PCI_SERDES_RX_CTRL_POLARITY 0x40    /* rxpolarity_value */
+#define BCMA_CORE_PCI_SERDES_RX_TIMER1         2       /* Rx Timer1 */
+#define BCMA_CORE_PCI_SERDES_RX_CDR            6       /* CDR */
+#define BCMA_CORE_PCI_SERDES_RX_CDRBW          7       /* CDR BW */
+
+/* SERDES PLL registers */
+#define BCMA_CORE_PCI_SERDES_PLL_CTRL          1       /* PLL control reg */
+#define BCMA_CORE_PCI_PLL_CTRL_FREQDET_EN      0x4000  /* bit 14 is FREQDET on */
+
 /* PCIcore specific boardflags */
 #define BCMA_CORE_PCI_BFL_NOPCI                        0x00000400 /* Board leaves PCI floating */
 
+/* PCIE Config space accessing MACROS */
+#define BCMA_CORE_PCI_CFG_BUS_SHIFT            24      /* Bus shift */
+#define BCMA_CORE_PCI_CFG_SLOT_SHIFT           19      /* Slot/Device shift */
+#define BCMA_CORE_PCI_CFG_FUN_SHIFT            16      /* Function shift */
+#define BCMA_CORE_PCI_CFG_OFF_SHIFT            0       /* Register shift */
+
+#define BCMA_CORE_PCI_CFG_BUS_MASK             0xff    /* Bus mask */
+#define BCMA_CORE_PCI_CFG_SLOT_MASK            0x1f    /* Slot/Device mask */
+#define BCMA_CORE_PCI_CFG_FUN_MASK             7       /* Function mask */
+#define BCMA_CORE_PCI_CFG_OFF_MASK             0xfff   /* Register mask */
+
+/* PCIE Root Capability Register bits (Host mode only) */
+#define BCMA_CORE_PCI_RC_CRS_VISIBILITY                0x0001
+
+struct bcma_drv_pci;
+
+#ifdef CONFIG_BCMA_DRIVER_PCI_HOSTMODE
+struct bcma_drv_pci_host {
+       struct bcma_drv_pci *pdev;
+
+       u32 host_cfg_addr;
+       spinlock_t cfgspace_lock;
+
+       struct pci_controller pci_controller;
+       struct pci_ops pci_ops;
+       struct resource mem_resource;
+       struct resource io_resource;
+};
+#endif
+
 struct bcma_drv_pci {
        struct bcma_device *core;
        u8 setup_done:1;
+       u8 hostmode:1;
+
+#ifdef CONFIG_BCMA_DRIVER_PCI_HOSTMODE
+       struct bcma_drv_pci_host *host_controller;
+#endif
 };
 
 /* Register access */
 #define pcicore_read32(pc, offset)             bcma_read32((pc)->core, offset)
 #define pcicore_write32(pc, offset, val)       bcma_write32((pc)->core, offset, val)
 
-extern void bcma_core_pci_init(struct bcma_drv_pci *pc);
+extern void __devinit bcma_core_pci_init(struct bcma_drv_pci *pc);
 extern int bcma_core_pci_irq_ctl(struct bcma_drv_pci *pc,
                                 struct bcma_device *core, bool enable);
 
+extern int bcma_core_pci_pcibios_map_irq(const struct pci_dev *dev);
+extern int bcma_core_pci_plat_dev_init(struct pci_dev *dev);
+
 #endif /* LINUX_BCMA_DRIVER_PCI_H_ */
index 9faae2a..5a71d57 100644 (file)
 #define  BCMA_PCI_GPIO_XTAL            0x40    /* PCI config space GPIO 14 for Xtal powerup */
 #define  BCMA_PCI_GPIO_PLL             0x80    /* PCI config space GPIO 15 for PLL powerdown */
 
+/* SiliconBackplane Address Map.
+ * All regions may not exist on all chips.
+ */
+#define BCMA_SOC_SDRAM_BASE            0x00000000U     /* Physical SDRAM */
+#define BCMA_SOC_PCI_MEM               0x08000000U     /* Host Mode sb2pcitranslation0 (64 MB) */
+#define BCMA_SOC_PCI_MEM_SZ            (64 * 1024 * 1024)
+#define BCMA_SOC_PCI_CFG               0x0c000000U     /* Host Mode sb2pcitranslation1 (64 MB) */
+#define BCMA_SOC_SDRAM_SWAPPED         0x10000000U     /* Byteswapped Physical SDRAM */
+#define BCMA_SOC_SDRAM_R2              0x80000000U     /* Region 2 for sdram (512 MB) */
+
+
+#define BCMA_SOC_PCI_DMA               0x40000000U     /* Client Mode sb2pcitranslation2 (1 GB) */
+#define BCMA_SOC_PCI_DMA2              0x80000000U     /* Client Mode sb2pcitranslation2 (1 GB) */
+#define BCMA_SOC_PCI_DMA_SZ            0x40000000U     /* Client Mode sb2pcitranslation2 size in bytes */
+#define BCMA_SOC_PCIE_DMA_L32          0x00000000U     /* PCIE Client Mode sb2pcitranslation2
+                                                        * (2 ZettaBytes), low 32 bits
+                                                        */
+#define BCMA_SOC_PCIE_DMA_H32          0x80000000U     /* PCIE Client Mode sb2pcitranslation2
+                                                        * (2 ZettaBytes), high 32 bits
+                                                        */
+
+#define BCMA_SOC_PCI1_MEM              0x40000000U     /* Host Mode sb2pcitranslation0 (64 MB) */
+#define BCMA_SOC_PCI1_CFG              0x44000000U     /* Host Mode sb2pcitranslation1 (64 MB) */
+#define BCMA_SOC_PCIE1_DMA_H32         0xc0000000U     /* PCIE Client Mode sb2pcitranslation2
+                                                        * (2 ZettaBytes), high 32 bits
+                                                        */
+
 #endif /* LINUX_BCMA_REGS_H_ */
index a0969fc..5d2efe7 100644 (file)
@@ -92,7 +92,7 @@ void can_bus_off(struct net_device *dev);
 
 void can_put_echo_skb(struct sk_buff *skb, struct net_device *dev,
                      unsigned int idx);
-void can_get_echo_skb(struct net_device *dev, unsigned int idx);
+unsigned int can_get_echo_skb(struct net_device *dev, unsigned int idx);
 void can_free_echo_skb(struct net_device *dev, unsigned int idx);
 
 struct sk_buff *alloc_can_skb(struct net_device *dev, struct can_frame **cf);
index 710c043..eaf95a0 100644 (file)
@@ -376,8 +376,10 @@ static inline unsigned int dccp_hdr_len(const struct sk_buff *skb)
 /**
  * struct dccp_request_sock  -  represent DCCP-specific connection request
  * @dreq_inet_rsk: structure inherited from
- * @dreq_iss: initial sequence number sent on the Response (RFC 4340, 7.1)
- * @dreq_isr: initial sequence number received on the Request
+ * @dreq_iss: initial sequence number, sent on the first Response (RFC 4340, 7.1)
+ * @dreq_gss: greatest sequence number sent (for retransmitted Responses)
+ * @dreq_isr: initial sequence number received in the first Request
+ * @dreq_gsr: greatest sequence number received (for retransmitted Request(s))
  * @dreq_service: service code present on the Request (there is just one)
  * @dreq_featneg: feature negotiation options for this connection
  * The following two fields are analogous to the ones in dccp_sock:
@@ -387,7 +389,9 @@ static inline unsigned int dccp_hdr_len(const struct sk_buff *skb)
 struct dccp_request_sock {
        struct inet_request_sock dreq_inet_rsk;
        __u64                    dreq_iss;
+       __u64                    dreq_gss;
        __u64                    dreq_isr;
+       __u64                    dreq_gsr;
        __be32                   dreq_service;
        struct list_head         dreq_featneg;
        __u32                    dreq_timestamp_echo;
index 05955cf..8a18358 100644 (file)
@@ -140,17 +140,18 @@ static inline void random_ether_addr(u8 *addr)
 }
 
 /**
- * dev_hw_addr_random - Create random MAC and set device flag
+ * eth_hw_addr_random - Generate software assigned random Ethernet and
+ * set device flag
  * @dev: pointer to net_device structure
- * @hwaddr: Pointer to a six-byte array containing the Ethernet address
  *
- * Generate random MAC to be used by a device and set addr_assign_type
- * so the state can be read by sysfs and be used by udev.
+ * Generate a random Ethernet address (MAC) to be used by a net device
+ * and set addr_assign_type so the state can be read by sysfs and be
+ * used by userspace.
  */
-static inline void dev_hw_addr_random(struct net_device *dev, u8 *hwaddr)
+static inline void eth_hw_addr_random(struct net_device *dev)
 {
        dev->addr_assign_type |= NET_ADDR_RANDOM;
-       random_ether_addr(hwaddr);
+       random_ether_addr(dev->dev_addr);
 }
 
 /**
index da5b2de..e1d9e0e 100644 (file)
@@ -30,10 +30,15 @@ struct ethtool_cmd {
                                 * access it */
        __u8    duplex;         /* Duplex, half or full */
        __u8    port;           /* Which connector port */
-       __u8    phy_address;
+       __u8    phy_address;    /* MDIO PHY address (PRTAD for clause 45).
+                                * May be read-only or read-write
+                                * depending on the driver.
+                                */
        __u8    transceiver;    /* Which transceiver to use */
        __u8    autoneg;        /* Enable or disable autonegotiation */
-       __u8    mdio_support;
+       __u8    mdio_support;   /* MDIO protocols supported.  Read-only.
+                                * Not set by all drivers.
+                                */
        __u32   maxtxpkt;       /* Tx pkts before generating tx int */
        __u32   maxrxpkt;       /* Rx pkts before generating rx int */
        __u16   speed_hi;       /* The forced speed (upper
@@ -59,6 +64,20 @@ static inline __u32 ethtool_cmd_speed(const struct ethtool_cmd *ep)
        return (ep->speed_hi << 16) | ep->speed;
 }
 
+/* Device supports clause 22 register access to PHY or peripherals
+ * using the interface defined in <linux/mii.h>.  This should not be
+ * set if there are known to be no such peripherals present or if
+ * the driver only emulates clause 22 registers for compatibility.
+ */
+#define ETH_MDIO_SUPPORTS_C22  1
+
+/* Device supports clause 45 register access to PHY or peripherals
+ * using the interface defined in <linux/mii.h> and <linux/mdio.h>.
+ * This should not be set if there are known to be no such peripherals
+ * present.
+ */
+#define ETH_MDIO_SUPPORTS_C45  2
+
 #define ETHTOOL_FWVERS_LEN     32
 #define ETHTOOL_BUSINFO_LEN    32
 /* these strings are set to whatever the driver author decides... */
index 06b6ef6..f995c66 100644 (file)
@@ -80,6 +80,8 @@
                                         * skbs on transmit */
 #define IFF_UNICAST_FLT        0x20000         /* Supports unicast filtering   */
 #define IFF_TEAM_PORT  0x40000         /* device used as team port */
+#define IFF_SUPP_NOFCS 0x80000         /* device supports sending custom FCS */
+
 
 #define IF_GET_IFACE   0x0001          /* for querying only */
 #define IF_GET_PROTO   0x0002
index c9ad383..9048fab 100644 (file)
@@ -1,173 +1 @@
-/*
- * if_ppp.h - Point-to-Point Protocol definitions.
- *
- * Copyright (c) 1989 Carnegie Mellon University.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms are permitted
- * provided that the above copyright notice and this paragraph are
- * duplicated in all such forms and that any documentation,
- * advertising materials, and other materials related to such
- * distribution and use acknowledge that the software was developed
- * by Carnegie Mellon University.  The name of the
- * University may not be used to endorse or promote products derived
- * from this software without specific prior written permission.
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
- * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
- *
- */
-
-/*
- *  ==FILEVERSION 20050812==
- *
- *  NOTE TO MAINTAINERS:
- *     If you modify this file at all, please set the above date.
- *     if_ppp.h is shipped with a PPP distribution as well as with the kernel;
- *     if everyone increases the FILEVERSION number above, then scripts
- *     can do the right thing when deciding whether to install a new if_ppp.h
- *     file.  Don't change the format of that line otherwise, so the
- *     installation script can recognize it.
- */
-
-#ifndef _IF_PPP_H_
-#define _IF_PPP_H_
-
-#include <linux/types.h>
-#include <linux/compiler.h>
-
-/*
- * Packet sizes
- */
-
-#define        PPP_MTU         1500    /* Default MTU (size of Info field) */
-#define PPP_MAXMRU     65000   /* Largest MRU we allow */
-#define PROTO_IPX      0x002b  /* protocol numbers */
-#define PROTO_DNA_RT    0x0027  /* DNA Routing */
-
-
-/*
- * Bit definitions for flags.
- */
-
-#define SC_COMP_PROT   0x00000001      /* protocol compression (output) */
-#define SC_COMP_AC     0x00000002      /* header compression (output) */
-#define        SC_COMP_TCP     0x00000004      /* TCP (VJ) compression (output) */
-#define SC_NO_TCP_CCID 0x00000008      /* disable VJ connection-id comp. */
-#define SC_REJ_COMP_AC 0x00000010      /* reject adrs/ctrl comp. on input */
-#define SC_REJ_COMP_TCP        0x00000020      /* reject TCP (VJ) comp. on input */
-#define SC_CCP_OPEN    0x00000040      /* Look at CCP packets */
-#define SC_CCP_UP      0x00000080      /* May send/recv compressed packets */
-#define SC_ENABLE_IP   0x00000100      /* IP packets may be exchanged */
-#define SC_LOOP_TRAFFIC        0x00000200      /* send traffic to pppd */
-#define SC_MULTILINK   0x00000400      /* do multilink encapsulation */
-#define SC_MP_SHORTSEQ 0x00000800      /* use short MP sequence numbers */
-#define SC_COMP_RUN    0x00001000      /* compressor has been inited */
-#define SC_DECOMP_RUN  0x00002000      /* decompressor has been inited */
-#define SC_MP_XSHORTSEQ        0x00004000      /* transmit short MP seq numbers */
-#define SC_DEBUG       0x00010000      /* enable debug messages */
-#define SC_LOG_INPKT   0x00020000      /* log contents of good pkts recvd */
-#define SC_LOG_OUTPKT  0x00040000      /* log contents of pkts sent */
-#define SC_LOG_RAWIN   0x00080000      /* log all chars received */
-#define SC_LOG_FLUSH   0x00100000      /* log all chars flushed */
-#define        SC_SYNC         0x00200000      /* synchronous serial mode */
-#define        SC_MUST_COMP    0x00400000      /* no uncompressed packets may be sent or received */
-#define        SC_MASK         0x0f600fff      /* bits that user can change */
-
-/* state bits */
-#define SC_XMIT_BUSY   0x10000000      /* (used by isdn_ppp?) */
-#define SC_RCV_ODDP    0x08000000      /* have rcvd char with odd parity */
-#define SC_RCV_EVNP    0x04000000      /* have rcvd char with even parity */
-#define SC_RCV_B7_1    0x02000000      /* have rcvd char with bit 7 = 1 */
-#define SC_RCV_B7_0    0x01000000      /* have rcvd char with bit 7 = 0 */
-#define SC_DC_FERROR   0x00800000      /* fatal decomp error detected */
-#define SC_DC_ERROR    0x00400000      /* non-fatal decomp error detected */
-
-/*
- * Ioctl definitions.
- */
-
-struct npioctl {
-       int             protocol;       /* PPP protocol, e.g. PPP_IP */
-       enum NPmode     mode;
-};
-
-/* Structure describing a CCP configuration option, for PPPIOCSCOMPRESS */
-struct ppp_option_data {
-       __u8    __user *ptr;
-       __u32   length;
-       int     transmit;
-};
-
-struct ifpppstatsreq {
-       struct ifreq     b;
-       struct ppp_stats stats;                 /* statistic information */
-};
-
-struct ifpppcstatsreq {
-       struct ifreq          b;
-       struct ppp_comp_stats stats;
-};
-
-/* For PPPIOCGL2TPSTATS */
-struct pppol2tp_ioc_stats {
-       __u16           tunnel_id;      /* redundant */
-       __u16           session_id;     /* if zero, get tunnel stats */
-       __u32           using_ipsec:1;  /* valid only for session_id == 0 */
-       __aligned_u64   tx_packets;
-       __aligned_u64   tx_bytes;
-       __aligned_u64   tx_errors;
-       __aligned_u64   rx_packets;
-       __aligned_u64   rx_bytes;
-       __aligned_u64   rx_seq_discards;
-       __aligned_u64   rx_oos_packets;
-       __aligned_u64   rx_errors;
-};
-
-#define ifr__name       b.ifr_ifrn.ifrn_name
-#define stats_ptr       b.ifr_ifru.ifru_data
-
-/*
- * Ioctl definitions.
- */
-
-#define        PPPIOCGFLAGS    _IOR('t', 90, int)      /* get configuration flags */
-#define        PPPIOCSFLAGS    _IOW('t', 89, int)      /* set configuration flags */
-#define        PPPIOCGASYNCMAP _IOR('t', 88, int)      /* get async map */
-#define        PPPIOCSASYNCMAP _IOW('t', 87, int)      /* set async map */
-#define        PPPIOCGUNIT     _IOR('t', 86, int)      /* get ppp unit number */
-#define        PPPIOCGRASYNCMAP _IOR('t', 85, int)     /* get receive async map */
-#define        PPPIOCSRASYNCMAP _IOW('t', 84, int)     /* set receive async map */
-#define        PPPIOCGMRU      _IOR('t', 83, int)      /* get max receive unit */
-#define        PPPIOCSMRU      _IOW('t', 82, int)      /* set max receive unit */
-#define        PPPIOCSMAXCID   _IOW('t', 81, int)      /* set VJ max slot ID */
-#define PPPIOCGXASYNCMAP _IOR('t', 80, ext_accm) /* get extended ACCM */
-#define PPPIOCSXASYNCMAP _IOW('t', 79, ext_accm) /* set extended ACCM */
-#define PPPIOCXFERUNIT _IO('t', 78)            /* transfer PPP unit */
-#define PPPIOCSCOMPRESS        _IOW('t', 77, struct ppp_option_data)
-#define PPPIOCGNPMODE  _IOWR('t', 76, struct npioctl) /* get NP mode */
-#define PPPIOCSNPMODE  _IOW('t', 75, struct npioctl)  /* set NP mode */
-#define PPPIOCSPASS    _IOW('t', 71, struct sock_fprog) /* set pass filter */
-#define PPPIOCSACTIVE  _IOW('t', 70, struct sock_fprog) /* set active filt */
-#define PPPIOCGDEBUG   _IOR('t', 65, int)      /* Read debug level */
-#define PPPIOCSDEBUG   _IOW('t', 64, int)      /* Set debug level */
-#define PPPIOCGIDLE    _IOR('t', 63, struct ppp_idle) /* get idle time */
-#define PPPIOCNEWUNIT  _IOWR('t', 62, int)     /* create new ppp unit */
-#define PPPIOCATTACH   _IOW('t', 61, int)      /* attach to ppp unit */
-#define PPPIOCDETACH   _IOW('t', 60, int)      /* detach from ppp unit/chan */
-#define PPPIOCSMRRU    _IOW('t', 59, int)      /* set multilink MRU */
-#define PPPIOCCONNECT  _IOW('t', 58, int)      /* connect channel to unit */
-#define PPPIOCDISCONN  _IO('t', 57)            /* disconnect channel */
-#define PPPIOCATTCHAN  _IOW('t', 56, int)      /* attach to ppp channel */
-#define PPPIOCGCHAN    _IOR('t', 55, int)      /* get ppp channel number */
-#define PPPIOCGL2TPSTATS _IOR('t', 54, struct pppol2tp_ioc_stats)
-
-#define SIOCGPPPSTATS   (SIOCDEVPRIVATE + 0)
-#define SIOCGPPPVER     (SIOCDEVPRIVATE + 1)   /* NEVER change this!! */
-#define SIOCGPPPCSTATS  (SIOCDEVPRIVATE + 2)
-
-#if !defined(ifr_mtu)
-#define ifr_mtu        ifr_ifru.ifru_metric
-#endif
-
-#endif /* _IF_PPP_H_ */
+#include <linux/ppp-ioctl.h>
index 01129c0..e0337f1 100644 (file)
@@ -111,6 +111,7 @@ struct in_addr {
 #define MCAST_LEAVE_SOURCE_GROUP       47
 #define MCAST_MSFILTER                 48
 #define IP_MULTICAST_ALL               49
+#define IP_UNICAST_IF                  50
 
 #define MCAST_EXCLUDE  0
 #define MCAST_INCLUDE  1
index 097a34b..5c83d9e 100644 (file)
@@ -271,6 +271,7 @@ struct in6_flowlabel_req {
 #define IPV6_ORIGDSTADDR        74
 #define IPV6_RECVORIGDSTADDR    IPV6_ORIGDSTADDR
 #define IPV6_TRANSPARENT        75
+#define IPV6_UNICAST_IF         76
 
 /*
  * Multicast Routing:
index 6318268..8260ef7 100644 (file)
@@ -233,6 +233,11 @@ static inline struct ipv6hdr *ipipv6_hdr(const struct sk_buff *skb)
        return (struct ipv6hdr *)skb_transport_header(skb);
 }
 
+static inline __u8 ipv6_tclass(const struct ipv6hdr *iph)
+{
+       return (ntohl(*(__be32 *)iph) >> 20) & 0xff;
+}
+
 /* 
    This structure contains results of exthdrs parsing
    as offsets from skb->nh.
@@ -324,6 +329,7 @@ struct ipv6_pinfo {
                                __unused_2:6;
        __s16                   mcast_hops:9;
 #endif
+       int                     ucast_oif;
        int                     mcast_oif;
 
        /* pktoption flags */
@@ -360,7 +366,7 @@ struct ipv6_pinfo {
                                dontfrag:1;
        __u8                    min_hopcount;
        __u8                    tclass;
-       __u8                    padding;
+       __u8                    rcv_tclass;
 
        __u32                   dst_cookie;
 
index 4ccf95d..292f27a 100644 (file)
@@ -187,7 +187,7 @@ typedef struct {
 #endif
 
 #include <linux/ppp_defs.h>
-#include <linux/if_ppp.h>
+#include <linux/ppp-ioctl.h>
 
 #include <linux/isdn_ppp.h>
 #endif
index b1494ac..dfb9479 100644 (file)
@@ -10,6 +10,7 @@
 #ifndef __LINUX_MDIO_H__
 #define __LINUX_MDIO_H__
 
+#include <linux/types.h>
 #include <linux/mii.h>
 
 /* MDIO Manageable Devices (MMDs). */
@@ -273,6 +274,8 @@ static inline __u16 mdio_phy_id_c45(int prtad, int devad)
        return MDIO_PHY_ID_C45 | (prtad << 5) | devad;
 }
 
+#ifdef __KERNEL__
+
 static inline bool mdio_phy_id_is_c45(int phy_id)
 {
        return (phy_id & MDIO_PHY_ID_C45) && !(phy_id & ~MDIO_PHY_ID_C45_MASK);
@@ -288,11 +291,6 @@ static inline __u16 mdio_phy_id_devad(int phy_id)
        return phy_id & MDIO_PHY_ID_DEVAD;
 }
 
-#define MDIO_SUPPORTS_C22              1
-#define MDIO_SUPPORTS_C45              2
-
-#ifdef __KERNEL__ 
-
 /**
  * struct mdio_if_info - Ethernet controller MDIO interface
  * @prtad: PRTAD of the PHY (%MDIO_PRTAD_NONE if not present/unknown)
@@ -321,6 +319,8 @@ struct mdio_if_info {
 
 #define MDIO_PRTAD_NONE                        (-1)
 #define MDIO_DEVAD_NONE                        (-1)
+#define MDIO_SUPPORTS_C22              1
+#define MDIO_SUPPORTS_C45              2
 #define MDIO_EMULATE_C22               4
 
 struct ethtool_cmd;
index bee8fa2..091f9e7 100644 (file)
@@ -212,7 +212,10 @@ struct mlx4_wqe_ctrl_seg {
         * [1]   SE (solicited event)
         * [0]   FL (force loopback)
         */
-       __be32                  srcrb_flags;
+       union {
+               __be32                  srcrb_flags;
+               __be16                  srcrb_flags16[2];
+       };
        /*
         * imm is immediate data for send/RDMA write w/ immediate;
         * also invalidation key for send with invalidate; input
index b299230..be60c7f 100644 (file)
@@ -206,6 +206,7 @@ struct proto_ops {
                                      int offset, size_t size, int flags);
        ssize_t         (*splice_read)(struct socket *sock,  loff_t *ppos,
                                       struct pipe_inode_info *pipe, size_t len, unsigned int flags);
+       void            (*set_peek_off)(struct sock *sk, int val);
 };
 
 #define DECLARE_SOCKADDR(type, dst, src)       \
index 77f5202..5ac3212 100644 (file)
@@ -54,6 +54,8 @@ enum {
        NETIF_F_RXCSUM_BIT,             /* Receive checksumming offload */
        NETIF_F_NOCACHE_COPY_BIT,       /* Use no-cache copyfromuser */
        NETIF_F_LOOPBACK_BIT,           /* Enable loopback */
+       NETIF_F_RXFCS_BIT,              /* Append FCS to skb pkt data */
+       NETIF_F_RXALL_BIT,              /* Receive errored frames too */
 
        /*
         * Add your fresh new feature above and remember to update
@@ -98,6 +100,8 @@ enum {
 #define NETIF_F_TSO            __NETIF_F(TSO)
 #define NETIF_F_UFO            __NETIF_F(UFO)
 #define NETIF_F_VLAN_CHALLENGED        __NETIF_F(VLAN_CHALLENGED)
+#define NETIF_F_RXFCS          __NETIF_F(RXFCS)
+#define NETIF_F_RXALL          __NETIF_F(RXALL)
 
 /* Features valid for ethtool to change */
 /* = all defined minus driver/device-class-related */
index 0eac07c..4d279c5 100644 (file)
@@ -1082,7 +1082,8 @@ struct net_device {
        const struct header_ops *header_ops;
 
        unsigned int            flags;  /* interface flags (a la BSD)   */
-       unsigned int            priv_flags; /* Like 'flags' but invisible to userspace. */
+       unsigned int            priv_flags; /* Like 'flags' but invisible to userspace.
+                                            * See if.h for definitions. */
        unsigned short          gflags;
        unsigned short          padded; /* How much padding added by alloc_netdev() */
 
@@ -2556,6 +2557,8 @@ extern void               dev_load(struct net *net, const char *name);
 extern void            dev_mcast_init(void);
 extern struct rtnl_link_stats64 *dev_get_stats(struct net_device *dev,
                                               struct rtnl_link_stats64 *storage);
+extern void netdev_stats_to_stats64(struct rtnl_link_stats64 *stats64,
+                                   const struct net_device_stats *netdev_stats);
 
 extern int             netdev_max_backlog;
 extern int             netdev_tstamp_prequeue;
@@ -2650,6 +2653,11 @@ static inline int netif_is_bond_slave(struct net_device *dev)
        return dev->flags & IFF_SLAVE && dev->priv_flags & IFF_BONDING;
 }
 
+static inline bool netif_supports_nofcs(struct net_device *dev)
+{
+       return dev->priv_flags & IFF_SUPP_NOFCS;
+}
+
 extern struct pernet_operations __net_initdata loopback_net_ops;
 
 /* Logging, debugging and troubleshooting/diagnostic helpers. */
index debf1ae..d498a44 100644 (file)
@@ -43,6 +43,7 @@ enum ctattr_type {
        CTA_ZONE,
        CTA_SECCTX,
        CTA_TIMESTAMP,
+       CTA_MARK_MASK,
        __CTA_MAX
 };
 #define CTA_MAX (__CTA_MAX - 1)
index 52e4895..a2092f5 100644 (file)
@@ -225,6 +225,7 @@ struct netlink_callback {
        int                     (*dump)(struct sk_buff * skb,
                                        struct netlink_callback *cb);
        int                     (*done)(struct netlink_callback *cb);
+       void                    *data;
        u16                     family;
        u16                     min_dump_alloc;
        unsigned int            prev_seq, seq;
@@ -237,22 +238,8 @@ struct netlink_notify {
        int protocol;
 };
 
-static __inline__ struct nlmsghdr *
-__nlmsg_put(struct sk_buff *skb, u32 pid, u32 seq, int type, int len, int flags)
-{
-       struct nlmsghdr *nlh;
-       int size = NLMSG_LENGTH(len);
-
-       nlh = (struct nlmsghdr*)skb_put(skb, NLMSG_ALIGN(size));
-       nlh->nlmsg_type = type;
-       nlh->nlmsg_len = size;
-       nlh->nlmsg_flags = flags;
-       nlh->nlmsg_pid = pid;
-       nlh->nlmsg_seq = seq;
-       if (!__builtin_constant_p(size) || NLMSG_ALIGN(size) - size != 0)
-               memset(NLMSG_DATA(nlh) + len, 0, NLMSG_ALIGN(size) - size);
-       return nlh;
-}
+struct nlmsghdr *
+__nlmsg_put(struct sk_buff *skb, u32 pid, u32 seq, int type, int len, int flags);
 
 #define NLMSG_NEW(skb, pid, seq, type, len, flags) \
 ({     if (unlikely(skb_tailroom(skb) < (int)NLMSG_SPACE(len))) \
@@ -262,11 +249,16 @@ __nlmsg_put(struct sk_buff *skb, u32 pid, u32 seq, int type, int len, int flags)
 #define NLMSG_PUT(skb, pid, seq, type, len) \
        NLMSG_NEW(skb, pid, seq, type, len, 0)
 
+struct netlink_dump_control {
+       int (*dump)(struct sk_buff *skb, struct netlink_callback *);
+       int (*done)(struct netlink_callback*);
+       void *data;
+       u16 min_dump_alloc;
+};
+
 extern int netlink_dump_start(struct sock *ssk, struct sk_buff *skb,
                              const struct nlmsghdr *nlh,
-                             int (*dump)(struct sk_buff *skb, struct netlink_callback*),
-                             int (*done)(struct netlink_callback*),
-                             u16 min_dump_alloc);
+                             struct netlink_dump_control *control);
 
 
 #define NL_NONROOT_RECV 0x1
index 01d4e5d..b4999ab 100644 (file)
@@ -89,6 +89,8 @@ enum nfc_commands {
  * @NFC_ATTR_TARGET_SEL_RES: NFC-A targets extra information (useful if the
  *     target is not NFC-Forum compliant)
  * @NFC_ATTR_TARGET_NFCID1: NFC-A targets identifier, max 10 bytes
+ * @NFC_ATTR_TARGET_SENSB_RES: NFC-B targets extra information, max 12 bytes
+ * @NFC_ATTR_TARGET_SENSF_RES: NFC-F targets extra information, max 18 bytes
  * @NFC_ATTR_COMM_MODE: Passive or active mode
  * @NFC_ATTR_RF_MODE: Initiator or target
  */
@@ -101,6 +103,8 @@ enum nfc_attrs {
        NFC_ATTR_TARGET_SENS_RES,
        NFC_ATTR_TARGET_SEL_RES,
        NFC_ATTR_TARGET_NFCID1,
+       NFC_ATTR_TARGET_SENSB_RES,
+       NFC_ATTR_TARGET_SENSF_RES,
        NFC_ATTR_COMM_MODE,
        NFC_ATTR_RF_MODE,
 /* private: internal use only */
@@ -109,6 +113,9 @@ enum nfc_attrs {
 #define NFC_ATTR_MAX (__NFC_ATTR_AFTER_LAST - 1)
 
 #define NFC_DEVICE_NAME_MAXSIZE 8
+#define NFC_NFCID1_MAXSIZE 10
+#define NFC_SENSB_RES_MAXSIZE 12
+#define NFC_SENSF_RES_MAXSIZE 18
 
 /* NFC protocols */
 #define NFC_PROTO_JEWEL                1
index 0f5ff37..be35a68 100644 (file)
  * @NL80211_CMD_DEL_KEY: delete a key identified by %NL80211_ATTR_KEY_IDX
  *     or %NL80211_ATTR_MAC.
  *
- * @NL80211_CMD_GET_BEACON: retrieve beacon information (returned in a
- *     %NL80222_CMD_NEW_BEACON message)
- * @NL80211_CMD_SET_BEACON: set the beacon on an access point interface
- *     using the %NL80211_ATTR_BEACON_INTERVAL, %NL80211_ATTR_DTIM_PERIOD,
- *     %NL80211_ATTR_BEACON_HEAD and %NL80211_ATTR_BEACON_TAIL attributes.
- *     Following attributes are provided for drivers that generate full Beacon
- *     and Probe Response frames internally: %NL80211_ATTR_SSID,
+ * @NL80211_CMD_GET_BEACON: (not used)
+ * @NL80211_CMD_SET_BEACON: change the beacon on an access point interface
+ *     using the %NL80211_ATTR_BEACON_HEAD and %NL80211_ATTR_BEACON_TAIL
+ *     attributes. For drivers that generate the beacon and probe responses
+ *     internally, the following attributes must be provided: %NL80211_ATTR_IE,
+ *     %NL80211_ATTR_IE_PROBE_RESP and %NL80211_ATTR_IE_ASSOC_RESP.
+ * @NL80211_CMD_START_AP: Start AP operation on an AP interface, parameters
+ *     are like for %NL80211_CMD_SET_BEACON, and additionally parameters that
+ *     do not change are used, these include %NL80211_ATTR_BEACON_INTERVAL,
+ *     %NL80211_ATTR_DTIM_PERIOD, %NL80211_ATTR_SSID,
  *     %NL80211_ATTR_HIDDEN_SSID, %NL80211_ATTR_CIPHERS_PAIRWISE,
  *     %NL80211_ATTR_CIPHER_GROUP, %NL80211_ATTR_WPA_VERSIONS,
- *     %NL80211_ATTR_AKM_SUITES, %NL80211_ATTR_PRIVACY,
- *     %NL80211_ATTR_AUTH_TYPE, %NL80211_ATTR_IE, %NL80211_ATTR_IE_PROBE_RESP,
- *     %NL80211_ATTR_IE_ASSOC_RESP.
- * @NL80211_CMD_NEW_BEACON: add a new beacon to an access point interface,
- *     parameters are like for %NL80211_CMD_SET_BEACON.
- * @NL80211_CMD_DEL_BEACON: remove the beacon, stop sending it
+ *     %NL80211_ATTR_AKM_SUITES, %NL80211_ATTR_PRIVACY and
+ *     %NL80211_ATTR_AUTH_TYPE.
+ * @NL80211_CMD_NEW_BEACON: old alias for %NL80211_CMD_START_AP
+ * @NL80211_CMD_STOP_AP: Stop AP operation on the given interface
+ * @NL80211_CMD_DEL_BEACON: old alias for %NL80211_CMD_STOP_AP
  *
  * @NL80211_CMD_GET_STATION: Get station attributes for station identified by
  *     %NL80211_ATTR_MAC on the interface identified by %NL80211_ATTR_IFINDEX.
@@ -565,8 +567,10 @@ enum nl80211_commands {
 
        NL80211_CMD_GET_BEACON,
        NL80211_CMD_SET_BEACON,
-       NL80211_CMD_NEW_BEACON,
-       NL80211_CMD_DEL_BEACON,
+       NL80211_CMD_START_AP,
+       NL80211_CMD_NEW_BEACON = NL80211_CMD_START_AP,
+       NL80211_CMD_STOP_AP,
+       NL80211_CMD_DEL_BEACON = NL80211_CMD_STOP_AP,
 
        NL80211_CMD_GET_STATION,
        NL80211_CMD_SET_STATION,
@@ -1475,6 +1479,7 @@ enum nl80211_attrs {
 #define NL80211_ATTR_FEATURE_FLAGS NL80211_ATTR_FEATURE_FLAGS
 
 #define NL80211_MAX_SUPP_RATES                 32
+#define NL80211_MAX_SUPP_HT_RATES              77
 #define NL80211_MAX_SUPP_REG_RULES             32
 #define NL80211_TKIP_DATA_OFFSET_ENCR_KEY      0
 #define NL80211_TKIP_DATA_OFFSET_TX_MIC_KEY    16
@@ -2104,6 +2109,9 @@ enum nl80211_mntr_flags {
  * TUs) during which a mesh STA can send only one Action frame containing a
  * PERR element.
  *
+ * @NL80211_MESHCONF_FORWARDING: set Mesh STA as forwarding or non-forwarding
+ * or forwarding entity (default is TRUE - forwarding entity)
+ *
  * @NL80211_MESHCONF_ATTR_MAX: highest possible mesh configuration attribute
  *
  * @__NL80211_MESHCONF_ATTR_AFTER_LAST: internal use
@@ -2128,6 +2136,7 @@ enum nl80211_meshconf_params {
        NL80211_MESHCONF_HWMP_RANN_INTERVAL,
        NL80211_MESHCONF_GATE_ANNOUNCEMENTS,
        NL80211_MESHCONF_HWMP_PERR_MIN_INTERVAL,
+       NL80211_MESHCONF_FORWARDING,
 
        /* keep last */
        __NL80211_MESHCONF_ATTR_AFTER_LAST,
@@ -2401,12 +2410,15 @@ enum nl80211_key_attributes {
  *     in an array of rates as defined in IEEE 802.11 7.3.2.2 (u8 values with
  *     1 = 500 kbps) but without the IE length restriction (at most
  *     %NL80211_MAX_SUPP_RATES in a single array).
+ * @NL80211_TXRATE_MCS: HT (MCS) rates allowed for TX rate selection
+ *     in an array of MCS numbers.
  * @__NL80211_TXRATE_AFTER_LAST: internal
  * @NL80211_TXRATE_MAX: highest TX rate attribute
  */
 enum nl80211_tx_rate_attributes {
        __NL80211_TXRATE_INVALID,
        NL80211_TXRATE_LEGACY,
+       NL80211_TXRATE_MCS,
 
        /* keep last */
        __NL80211_TXRATE_AFTER_LAST,
index 31d77af..3329965 100644 (file)
 #define PCI_DEVICE_ID_NX2_57711E       0x1650
 #define PCI_DEVICE_ID_TIGON3_5705      0x1653
 #define PCI_DEVICE_ID_TIGON3_5705_2    0x1654
+#define PCI_DEVICE_ID_TIGON3_5719      0x1657
 #define PCI_DEVICE_ID_TIGON3_5721      0x1659
 #define PCI_DEVICE_ID_TIGON3_5722      0x165a
 #define PCI_DEVICE_ID_TIGON3_5723      0x165b
index 0d5b793..410b33d 100644 (file)
@@ -127,6 +127,27 @@ struct tc_multiq_qopt {
        __u16   max_bands;              /* Maximum number of queues */
 };
 
+/* PLUG section */
+
+#define TCQ_PLUG_BUFFER                0
+#define TCQ_PLUG_RELEASE_ONE           1
+#define TCQ_PLUG_RELEASE_INDEFINITE    2
+#define TCQ_PLUG_LIMIT                 3
+
+struct tc_plug_qopt {
+       /* TCQ_PLUG_BUFFER: Inset a plug into the queue and
+        *  buffer any incoming packets
+        * TCQ_PLUG_RELEASE_ONE: Dequeue packets from queue head
+        *   to beginning of the next plug.
+        * TCQ_PLUG_RELEASE_INDEFINITE: Dequeue all packets from queue.
+        *   Stop buffering packets until the next TCQ_PLUG_BUFFER
+        *   command is received (just act as a pass-thru queue).
+        * TCQ_PLUG_LIMIT: Increase/decrease queue size
+        */
+       int             action;
+       __u32           limit;
+};
+
 /* TBF section */
 
 struct tc_tbf_qopt {
index b8d4ddd..e53ff65 100644 (file)
@@ -1,42 +1,12 @@
 /*
  * ppp-comp.h - Definitions for doing PPP packet compression.
  *
- * Copyright (c) 1994 The Australian National University.
- * All rights reserved.
+ * Copyright 1994-1998 Paul Mackerras.
  *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation is hereby granted, provided that the above copyright
- * notice appears in all copies.  This software is provided without any
- * warranty, express or implied. The Australian National University
- * makes no representations about the suitability of this software for
- * any purpose.
- *
- * IN NO EVENT SHALL THE AUSTRALIAN NATIONAL UNIVERSITY BE LIABLE TO ANY
- * PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF
- * THE AUSTRALIAN NATIONAL UNIVERSITY HAVE BEEN ADVISED OF THE POSSIBILITY
- * OF SUCH DAMAGE.
- *
- * THE AUSTRALIAN NATIONAL UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES,
- * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- * AND FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE AUSTRALIAN NATIONAL UNIVERSITY HAS NO
- * OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS,
- * OR MODIFICATIONS.
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU General Public License
+ *  version 2 as published by the Free Software Foundation.
  */
-
-/*
- *  ==FILEVERSION 980319==
- *
- *  NOTE TO MAINTAINERS:
- *     If you modify this file at all, please set the above date.
- *     ppp-comp.h is shipped with a PPP distribution as well as with the kernel;
- *     if everyone increases the FILEVERSION number above, then scripts
- *     can do the right thing when deciding whether to install a new ppp-comp.h
- *     file.  Don't change the format of that line otherwise, so the
- *     installation script can recognize it.
- */
-
 #ifndef _NET_PPP_COMP_H
 #define _NET_PPP_COMP_H
 
diff --git a/include/linux/ppp-ioctl.h b/include/linux/ppp-ioctl.h
new file mode 100644 (file)
index 0000000..2d9a885
--- /dev/null
@@ -0,0 +1,119 @@
+/*
+ * ppp-ioctl.h - PPP ioctl definitions.
+ *
+ * Copyright 1999-2002 Paul Mackerras.
+ *
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU General Public License
+ *  version 2 as published by the Free Software Foundation.
+ */
+#ifndef _PPP_IOCTL_H
+#define _PPP_IOCTL_H
+
+#include <linux/types.h>
+#include <linux/compiler.h>
+
+/*
+ * Bit definitions for flags argument to PPPIOCGFLAGS/PPPIOCSFLAGS.
+ */
+#define SC_COMP_PROT   0x00000001      /* protocol compression (output) */
+#define SC_COMP_AC     0x00000002      /* header compression (output) */
+#define        SC_COMP_TCP     0x00000004      /* TCP (VJ) compression (output) */
+#define SC_NO_TCP_CCID 0x00000008      /* disable VJ connection-id comp. */
+#define SC_REJ_COMP_AC 0x00000010      /* reject adrs/ctrl comp. on input */
+#define SC_REJ_COMP_TCP        0x00000020      /* reject TCP (VJ) comp. on input */
+#define SC_CCP_OPEN    0x00000040      /* Look at CCP packets */
+#define SC_CCP_UP      0x00000080      /* May send/recv compressed packets */
+#define SC_ENABLE_IP   0x00000100      /* IP packets may be exchanged */
+#define SC_LOOP_TRAFFIC        0x00000200      /* send traffic to pppd */
+#define SC_MULTILINK   0x00000400      /* do multilink encapsulation */
+#define SC_MP_SHORTSEQ 0x00000800      /* use short MP sequence numbers */
+#define SC_COMP_RUN    0x00001000      /* compressor has been inited */
+#define SC_DECOMP_RUN  0x00002000      /* decompressor has been inited */
+#define SC_MP_XSHORTSEQ        0x00004000      /* transmit short MP seq numbers */
+#define SC_DEBUG       0x00010000      /* enable debug messages */
+#define SC_LOG_INPKT   0x00020000      /* log contents of good pkts recvd */
+#define SC_LOG_OUTPKT  0x00040000      /* log contents of pkts sent */
+#define SC_LOG_RAWIN   0x00080000      /* log all chars received */
+#define SC_LOG_FLUSH   0x00100000      /* log all chars flushed */
+#define        SC_SYNC         0x00200000      /* synchronous serial mode */
+#define        SC_MUST_COMP    0x00400000      /* no uncompressed packets may be sent or received */
+#define        SC_MASK         0x0f600fff      /* bits that user can change */
+
+/* state bits */
+#define SC_XMIT_BUSY   0x10000000      /* (used by isdn_ppp?) */
+#define SC_RCV_ODDP    0x08000000      /* have rcvd char with odd parity */
+#define SC_RCV_EVNP    0x04000000      /* have rcvd char with even parity */
+#define SC_RCV_B7_1    0x02000000      /* have rcvd char with bit 7 = 1 */
+#define SC_RCV_B7_0    0x01000000      /* have rcvd char with bit 7 = 0 */
+#define SC_DC_FERROR   0x00800000      /* fatal decomp error detected */
+#define SC_DC_ERROR    0x00400000      /* non-fatal decomp error detected */
+
+/* Used with PPPIOCGNPMODE/PPPIOCSNPMODE */
+struct npioctl {
+       int             protocol;       /* PPP protocol, e.g. PPP_IP */
+       enum NPmode     mode;
+};
+
+/* Structure describing a CCP configuration option, for PPPIOCSCOMPRESS */
+struct ppp_option_data {
+       __u8    __user *ptr;
+       __u32   length;
+       int     transmit;
+};
+
+/* For PPPIOCGL2TPSTATS */
+struct pppol2tp_ioc_stats {
+       __u16           tunnel_id;      /* redundant */
+       __u16           session_id;     /* if zero, get tunnel stats */
+       __u32           using_ipsec:1;  /* valid only for session_id == 0 */
+       __aligned_u64   tx_packets;
+       __aligned_u64   tx_bytes;
+       __aligned_u64   tx_errors;
+       __aligned_u64   rx_packets;
+       __aligned_u64   rx_bytes;
+       __aligned_u64   rx_seq_discards;
+       __aligned_u64   rx_oos_packets;
+       __aligned_u64   rx_errors;
+};
+
+/*
+ * Ioctl definitions.
+ */
+
+#define        PPPIOCGFLAGS    _IOR('t', 90, int)      /* get configuration flags */
+#define        PPPIOCSFLAGS    _IOW('t', 89, int)      /* set configuration flags */
+#define        PPPIOCGASYNCMAP _IOR('t', 88, int)      /* get async map */
+#define        PPPIOCSASYNCMAP _IOW('t', 87, int)      /* set async map */
+#define        PPPIOCGUNIT     _IOR('t', 86, int)      /* get ppp unit number */
+#define        PPPIOCGRASYNCMAP _IOR('t', 85, int)     /* get receive async map */
+#define        PPPIOCSRASYNCMAP _IOW('t', 84, int)     /* set receive async map */
+#define        PPPIOCGMRU      _IOR('t', 83, int)      /* get max receive unit */
+#define        PPPIOCSMRU      _IOW('t', 82, int)      /* set max receive unit */
+#define        PPPIOCSMAXCID   _IOW('t', 81, int)      /* set VJ max slot ID */
+#define PPPIOCGXASYNCMAP _IOR('t', 80, ext_accm) /* get extended ACCM */
+#define PPPIOCSXASYNCMAP _IOW('t', 79, ext_accm) /* set extended ACCM */
+#define PPPIOCXFERUNIT _IO('t', 78)            /* transfer PPP unit */
+#define PPPIOCSCOMPRESS        _IOW('t', 77, struct ppp_option_data)
+#define PPPIOCGNPMODE  _IOWR('t', 76, struct npioctl) /* get NP mode */
+#define PPPIOCSNPMODE  _IOW('t', 75, struct npioctl)  /* set NP mode */
+#define PPPIOCSPASS    _IOW('t', 71, struct sock_fprog) /* set pass filter */
+#define PPPIOCSACTIVE  _IOW('t', 70, struct sock_fprog) /* set active filt */
+#define PPPIOCGDEBUG   _IOR('t', 65, int)      /* Read debug level */
+#define PPPIOCSDEBUG   _IOW('t', 64, int)      /* Set debug level */
+#define PPPIOCGIDLE    _IOR('t', 63, struct ppp_idle) /* get idle time */
+#define PPPIOCNEWUNIT  _IOWR('t', 62, int)     /* create new ppp unit */
+#define PPPIOCATTACH   _IOW('t', 61, int)      /* attach to ppp unit */
+#define PPPIOCDETACH   _IOW('t', 60, int)      /* detach from ppp unit/chan */
+#define PPPIOCSMRRU    _IOW('t', 59, int)      /* set multilink MRU */
+#define PPPIOCCONNECT  _IOW('t', 58, int)      /* connect channel to unit */
+#define PPPIOCDISCONN  _IO('t', 57)            /* disconnect channel */
+#define PPPIOCATTCHAN  _IOW('t', 56, int)      /* attach to ppp channel */
+#define PPPIOCGCHAN    _IOR('t', 55, int)      /* get ppp channel number */
+#define PPPIOCGL2TPSTATS _IOR('t', 54, struct pppol2tp_ioc_stats)
+
+#define SIOCGPPPSTATS   (SIOCDEVPRIVATE + 0)
+#define SIOCGPPPVER     (SIOCDEVPRIVATE + 1)   /* NEVER change this!! */
+#define SIOCGPPPCSTATS  (SIOCDEVPRIVATE + 2)
+
+#endif /* _PPP_IOCTL_H */
index 0f93ed6..ba416f6 100644 (file)
@@ -1,44 +1,14 @@
 /*
  * ppp_defs.h - PPP definitions.
  *
- * Copyright (c) 1994 The Australian National University.
- * All rights reserved.
+ * Copyright 1994-2000 Paul Mackerras.
  *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation is hereby granted, provided that the above copyright
- * notice appears in all copies.  This software is provided without any
- * warranty, express or implied. The Australian National University
- * makes no representations about the suitability of this software for
- * any purpose.
- *
- * IN NO EVENT SHALL THE AUSTRALIAN NATIONAL UNIVERSITY BE LIABLE TO ANY
- * PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF
- * THE AUSTRALIAN NATIONAL UNIVERSITY HAVE BEEN ADVISED OF THE POSSIBILITY
- * OF SUCH DAMAGE.
- *
- * THE AUSTRALIAN NATIONAL UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES,
- * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- * AND FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE AUSTRALIAN NATIONAL UNIVERSITY HAS NO
- * OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS,
- * OR MODIFICATIONS.
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU General Public License
+ *  version 2 as published by the Free Software Foundation.
  */
-
 #include <linux/types.h>
 
-/*
- *  ==FILEVERSION 20000114==
- *
- *  NOTE TO MAINTAINERS:
- *     If you modify this file at all, please set the above date.
- *     ppp_defs.h is shipped with a PPP distribution as well as with the kernel;
- *     if everyone increases the FILEVERSION number above, then scripts
- *     can do the right thing when deciding whether to install a new ppp_defs.h
- *     file.  Don't change the format of that line otherwise, so the
- *     installation script can recognize it.
- */
-
 #ifndef _PPP_DEFS_H_
 #define _PPP_DEFS_H_
 
index 2076acf..b17d765 100644 (file)
@@ -20,6 +20,7 @@ struct sh_eth_plat_data {
        unsigned char mac_addr[6];
        unsigned no_ether_link:1;
        unsigned ether_link_active_low:1;
+       unsigned needs_init:1;
 };
 
 #endif
index ae86ade..79ef820 100644 (file)
@@ -361,6 +361,7 @@ typedef unsigned char *sk_buff_data_t;
  *             ports.
  *     @wifi_acked_valid: wifi_acked was set
  *     @wifi_acked: whether frame was acked on wifi or not
+ *     @no_fcs:  Request NIC to treat last 4 bytes as Ethernet FCS
  *     @dma_cookie: a cookie to one of several possible DMA operations
  *             done by skb DMA functions
  *     @secmark: security marking
@@ -438,6 +439,11 @@ struct sk_buff {
 #endif
 
        int                     skb_iif;
+
+       __u32                   rxhash;
+
+       __u16                   vlan_tci;
+
 #ifdef CONFIG_NET_SCHED
        __u16                   tc_index;       /* traffic control index */
 #ifdef CONFIG_NET_CLS_ACT
@@ -445,8 +451,6 @@ struct sk_buff {
 #endif
 #endif
 
-       __u32                   rxhash;
-
        __u16                   queue_mapping;
        kmemcheck_bitfield_begin(flags2);
 #ifdef CONFIG_IPV6_NDISC_NODETYPE
@@ -456,7 +460,8 @@ struct sk_buff {
        __u8                    l4_rxhash:1;
        __u8                    wifi_acked_valid:1;
        __u8                    wifi_acked:1;
-       /* 10/12 bit hole (depending on ndisc_nodetype presence) */
+       __u8                    no_fcs:1;
+       /* 9/11 bit hole (depending on ndisc_nodetype presence) */
        kmemcheck_bitfield_end(flags2);
 
 #ifdef CONFIG_NET_DMA
@@ -470,8 +475,6 @@ struct sk_buff {
                __u32           dropcount;
        };
 
-       __u16                   vlan_tci;
-
        sk_buff_data_t          transport_header;
        sk_buff_data_t          network_header;
        sk_buff_data_t          mac_header;
@@ -876,6 +879,24 @@ static inline struct sk_buff *skb_peek(const struct sk_buff_head *list_)
 }
 
 /**
+ *     skb_peek_next - peek skb following the given one from a queue
+ *     @skb: skb to start from
+ *     @list_: list to peek at
+ *
+ *     Returns %NULL when the end of the list is met or a pointer to the
+ *     next element. The reference count is not incremented and the
+ *     reference is therefore volatile. Use with caution.
+ */
+static inline struct sk_buff *skb_peek_next(struct sk_buff *skb,
+               const struct sk_buff_head *list_)
+{
+       struct sk_buff *next = skb->next;
+       if (next == (struct sk_buff *)list_)
+               next = NULL;
+       return next;
+}
+
+/**
  *     skb_peek_tail - peek at the tail of an &sk_buff_head
  *     @list_: list to peek at
  *
@@ -2055,7 +2076,7 @@ static inline void skb_frag_add_head(struct sk_buff *skb, struct sk_buff *frag)
        for (iter = skb_shinfo(skb)->frag_list; iter; iter = iter->next)
 
 extern struct sk_buff *__skb_recv_datagram(struct sock *sk, unsigned flags,
-                                          int *peeked, int *err);
+                                          int *peeked, int *off, int *err);
 extern struct sk_buff *skb_recv_datagram(struct sock *sk, unsigned flags,
                                         int noblock, int *err);
 extern unsigned int    datagram_poll(struct file *file, struct socket *sock,
index c1241c4..8ee8af4 100644 (file)
@@ -232,6 +232,7 @@ enum
        LINUX_MIB_TCPTIMEWAITOVERFLOW,          /* TCPTimeWaitOverflow */
        LINUX_MIB_TCPREQQFULLDOCOOKIES,         /* TCPReqQFullDoCookies */
        LINUX_MIB_TCPREQQFULLDROP,              /* TCPReqQFullDrop */
+       LINUX_MIB_TCPRETRANSFAIL,               /* TCPRetransFail */
        __LINUX_MIB_MAX
 };
 
index dcf35b0..bbc2612 100644 (file)
@@ -16,6 +16,12 @@ struct pcmcia_device;
 struct ssb_bus;
 struct ssb_driver;
 
+struct ssb_sprom_core_pwr_info {
+       u8 itssi_2g, itssi_5g;
+       u8 maxpwr_2g, maxpwr_5gl, maxpwr_5g, maxpwr_5gh;
+       u16 pa_2g[3], pa_5gl[3], pa_5g[3], pa_5gh[3];
+};
+
 struct ssb_sprom {
        u8 revision;
        u8 il0mac[6];           /* MAC address for 802.11b/g */
@@ -82,6 +88,8 @@ struct ssb_sprom {
        u16 boardflags2_hi;     /* Board flags (bits 48-63) */
        /* TODO store board flags in a single u64 */
 
+       struct ssb_sprom_core_pwr_info core_pwr_info[4];
+
        /* Antenna gain values for up to 4 antennas
         * on each band. Values in dBm/4 (Q5.2). Negative gain means the
         * loss in the connectors is bigger than the gain. */
index c814ae6..40b1ef8 100644 (file)
 #define SSB_SPROM8_TS_SLP_OPT_CORRX    0x00B6
 #define SSB_SPROM8_FOC_HWIQ_IQSWP      0x00B8
 #define SSB_SPROM8_PHYCAL_TEMPDELTA    0x00BA
+
+/* There are 4 blocks with power info sharing the same layout */
+#define SSB_SROM8_PWR_INFO_CORE0       0x00C0
+#define SSB_SROM8_PWR_INFO_CORE1       0x00E0
+#define SSB_SROM8_PWR_INFO_CORE2       0x0100
+#define SSB_SROM8_PWR_INFO_CORE3       0x0120
+
+#define SSB_SROM8_2G_MAXP_ITSSI                0x00
+#define  SSB_SPROM8_2G_MAXP            0x00FF
+#define  SSB_SPROM8_2G_ITSSI           0xFF00
+#define  SSB_SPROM8_2G_ITSSI_SHIFT     8
+#define SSB_SROM8_2G_PA_0              0x02    /* 2GHz power amp settings */
+#define SSB_SROM8_2G_PA_1              0x04
+#define SSB_SROM8_2G_PA_2              0x06
+#define SSB_SROM8_5G_MAXP_ITSSI                0x08    /* 5GHz ITSSI and 5.3GHz Max Power */
+#define  SSB_SPROM8_5G_MAXP            0x00FF
+#define  SSB_SPROM8_5G_ITSSI           0xFF00
+#define  SSB_SPROM8_5G_ITSSI_SHIFT     8
+#define SSB_SPROM8_5GHL_MAXP           0x0A    /* 5.2GHz and 5.8GHz Max Power */
+#define  SSB_SPROM8_5GH_MAXP           0x00FF
+#define  SSB_SPROM8_5GL_MAXP           0xFF00
+#define  SSB_SPROM8_5GL_MAXP_SHIFT     8
+#define SSB_SROM8_5G_PA_0              0x0C    /* 5.3GHz power amp settings */
+#define SSB_SROM8_5G_PA_1              0x0E
+#define SSB_SROM8_5G_PA_2              0x10
+#define SSB_SROM8_5GL_PA_0             0x12    /* 5.2GHz power amp settings */
+#define SSB_SROM8_5GL_PA_1             0x14
+#define SSB_SROM8_5GL_PA_2             0x16
+#define SSB_SROM8_5GH_PA_0             0x18    /* 5.8GHz power amp settings */
+#define SSB_SROM8_5GH_PA_1             0x1A
+#define SSB_SROM8_5GH_PA_2             0x1C
+
+/* TODO: Make it deprecated */
 #define SSB_SPROM8_MAXP_BG             0x00C0  /* Max Power 2GHz in path 1 */
 #define  SSB_SPROM8_MAXP_BG_MASK       0x00FF  /* Mask for Max Power 2GHz */
 #define  SSB_SPROM8_ITSSI_BG           0xFF00  /* Mask for path 1 itssi_bg */
 #define SSB_SPROM8_PA1HIB0             0x00D8  /* 5.8GHz power amp settings */
 #define SSB_SPROM8_PA1HIB1             0x00DA
 #define SSB_SPROM8_PA1HIB2             0x00DC
+
 #define SSB_SPROM8_CCK2GPO             0x0140  /* CCK power offset */
 #define SSB_SPROM8_OFDM2GPO            0x0142  /* 2.4GHz OFDM power offset */
 #define SSB_SPROM8_OFDM5GPO            0x0146  /* 5.3GHz OFDM power offset */
index 3c7ffdb..b6c62d2 100644 (file)
@@ -464,7 +464,7 @@ struct tcp_sock {
        const struct tcp_sock_af_ops    *af_specific;
 
 /* TCP MD5 Signature Option information */
-       struct tcp_md5sig_info  *md5sig_info;
+       struct tcp_md5sig_info  __rcu *md5sig_info;
 #endif
 
        /* When the cookie options are generated and exchanged, then this
@@ -487,8 +487,7 @@ struct tcp_timewait_sock {
        u32                       tw_ts_recent;
        long                      tw_ts_recent_stamp;
 #ifdef CONFIG_TCP_MD5SIG
-       u16                       tw_md5_keylen;
-       u8                        tw_md5_key[TCP_MD5SIG_MAXKEYLEN];
+       struct tcp_md5sig_key   *tw_md5_key;
 #endif
        /* Few sockets in timewait have cookies; in that case, then this
         * object holds a reference to them (tw_cookie_values->kref).
index f68dce2..757a176 100644 (file)
@@ -160,7 +160,6 @@ extern void addrconf_prefix_rcv(struct net_device *dev,
 extern int ipv6_sock_ac_join(struct sock *sk,int ifindex, const struct in6_addr *addr);
 extern int ipv6_sock_ac_drop(struct sock *sk,int ifindex, const struct in6_addr *addr);
 extern void ipv6_sock_ac_close(struct sock *sk);
-extern int inet6_ac_check(struct sock *sk, const struct in6_addr *addr, int ifindex);
 
 extern int ipv6_dev_ac_inc(struct net_device *dev, const struct in6_addr *addr);
 extern int __ipv6_dev_ac_dec(struct inet6_dev *idev, const struct in6_addr *addr);
index 0013dc8..4a1f3fb 100644 (file)
@@ -15,14 +15,14 @@ static inline u32 arp_hashfn(u32 key, const struct net_device *dev, u32 hash_rnd
        return val * hash_rnd;
 }
 
-static inline struct neighbour *__ipv4_neigh_lookup(struct neigh_table *tbl, struct net_device *dev, u32 key)
+static inline struct neighbour *__ipv4_neigh_lookup(struct net_device *dev, u32 key)
 {
        struct neigh_hash_table *nht;
        struct neighbour *n;
        u32 hash_val;
 
        rcu_read_lock_bh();
-       nht = rcu_dereference_bh(tbl->nht);
+       nht = rcu_dereference_bh(arp_tbl.nht);
        hash_val = arp_hashfn(key, dev, nht->hash_rnd[0]) >> (32 - nht->hash_shift);
        for (n = rcu_dereference_bh(nht->hash_buckets[hash_val]);
             n != NULL;
index 8d55251..6db8ecf 100644 (file)
@@ -138,6 +138,7 @@ struct cfhsi {
        u8 *rx_ptr;
        u8 *tx_buf;
        u8 *rx_buf;
+       u8 *rx_flip_buf;
        spinlock_t lock;
        int flow_off_sent;
        u32 q_low_mark;
index a067d30..0178c74 100644 (file)
@@ -120,6 +120,7 @@ enum ieee80211_channel_flags {
  * @band: band this channel belongs to.
  * @max_antenna_gain: maximum antenna gain in dBi
  * @max_power: maximum transmission power (in dBm)
+ * @max_reg_power: maximum regulatory transmission power (in dBm)
  * @beacon_found: helper to regulatory code to indicate when a beacon
  *     has been found on this channel. Use regulatory_hint_found_beacon()
  *     to enable this, this is useful only on 5 GHz band.
@@ -133,6 +134,7 @@ struct ieee80211_channel {
        u32 flags;
        int max_antenna_gain;
        int max_power;
+       int max_reg_power;
        bool beacon_found;
        u32 orig_flags;
        int orig_mag, orig_mpwr;
@@ -364,25 +366,13 @@ struct cfg80211_crypto_settings {
 };
 
 /**
- * struct beacon_parameters - beacon parameters
- *
- * Used to configure the beacon for an interface.
- *
+ * struct cfg80211_beacon_data - beacon data
  * @head: head portion of beacon (before TIM IE)
  *     or %NULL if not changed
  * @tail: tail portion of beacon (after TIM IE)
  *     or %NULL if not changed
- * @interval: beacon interval or zero if not changed
- * @dtim_period: DTIM period or zero if not changed
  * @head_len: length of @head
  * @tail_len: length of @tail
- * @ssid: SSID to be used in the BSS (note: may be %NULL if not provided from
- *     user space)
- * @ssid_len: length of @ssid
- * @hidden_ssid: whether to hide the SSID in Beacon/Probe Response frames
- * @crypto: crypto settings
- * @privacy: the BSS uses privacy
- * @auth_type: Authentication type (algorithm)
  * @beacon_ies: extra information element(s) to add into Beacon frames or %NULL
  * @beacon_ies_len: length of beacon_ies in octets
  * @proberesp_ies: extra information element(s) to add into Probe Response
@@ -394,24 +384,46 @@ struct cfg80211_crypto_settings {
  * @probe_resp_len: length of probe response template (@probe_resp)
  * @probe_resp: probe response template (AP mode only)
  */
-struct beacon_parameters {
-       u8 *head, *tail;
-       int interval, dtim_period;
-       int head_len, tail_len;
+struct cfg80211_beacon_data {
+       const u8 *head, *tail;
+       const u8 *beacon_ies;
+       const u8 *proberesp_ies;
+       const u8 *assocresp_ies;
+       const u8 *probe_resp;
+
+       size_t head_len, tail_len;
+       size_t beacon_ies_len;
+       size_t proberesp_ies_len;
+       size_t assocresp_ies_len;
+       size_t probe_resp_len;
+};
+
+/**
+ * struct cfg80211_ap_settings - AP configuration
+ *
+ * Used to configure an AP interface.
+ *
+ * @beacon: beacon data
+ * @beacon_interval: beacon interval
+ * @dtim_period: DTIM period
+ * @ssid: SSID to be used in the BSS (note: may be %NULL if not provided from
+ *     user space)
+ * @ssid_len: length of @ssid
+ * @hidden_ssid: whether to hide the SSID in Beacon/Probe Response frames
+ * @crypto: crypto settings
+ * @privacy: the BSS uses privacy
+ * @auth_type: Authentication type (algorithm)
+ */
+struct cfg80211_ap_settings {
+       struct cfg80211_beacon_data beacon;
+
+       int beacon_interval, dtim_period;
        const u8 *ssid;
        size_t ssid_len;
        enum nl80211_hidden_ssid hidden_ssid;
        struct cfg80211_crypto_settings crypto;
        bool privacy;
        enum nl80211_auth_type auth_type;
-       const u8 *beacon_ies;
-       size_t beacon_ies_len;
-       const u8 *proberesp_ies;
-       size_t proberesp_ies_len;
-       const u8 *assocresp_ies;
-       size_t assocresp_ies_len;
-       int probe_resp_len;
-       u8 *probe_resp;
 };
 
 /**
@@ -796,6 +808,7 @@ struct mesh_config {
         * mesh gate, but not necessarily using the gate announcement protocol.
         * Still keeping the same nomenclature to be in sync with the spec. */
        bool  dot11MeshGateAnnouncementProtocol;
+       bool dot11MeshForwarding;
 };
 
 /**
@@ -1036,10 +1049,6 @@ const u8 *ieee80211_bss_get_ie(struct cfg80211_bss *bss, u8 ie);
  * @key_len: length of WEP key for shared key authentication
  * @key_idx: index of WEP key for shared key authentication
  * @key: WEP key for shared key authentication
- * @local_state_change: This is a request for a local state only, i.e., no
- *     Authentication frame is to be transmitted and authentication state is
- *     to be changed without having to wait for a response from the peer STA
- *     (AP).
  */
 struct cfg80211_auth_request {
        struct cfg80211_bss *bss;
@@ -1048,7 +1057,6 @@ struct cfg80211_auth_request {
        enum nl80211_auth_type auth_type;
        const u8 *key;
        u8 key_len, key_idx;
-       bool local_state_change;
 };
 
 /**
@@ -1065,7 +1073,11 @@ enum cfg80211_assoc_req_flags {
  *
  * This structure provides information needed to complete IEEE 802.11
  * (re)association.
- * @bss: The BSS to associate with.
+ * @bss: The BSS to associate with. If the call is successful the driver
+ *     is given a reference that it must release, normally via a call to
+ *     cfg80211_send_rx_assoc(), or, if association timed out, with a
+ *     call to cfg80211_put_bss() (in addition to calling
+ *     cfg80211_send_assoc_timeout())
  * @ie: Extra IEs to add to (Re)Association Request frame or %NULL
  * @ie_len: Length of ie buffer in octets
  * @use_mfp: Use management frame protection (IEEE 802.11w) in this association
@@ -1093,19 +1105,16 @@ struct cfg80211_assoc_request {
  * This structure provides information needed to complete IEEE 802.11
  * deauthentication.
  *
- * @bss: the BSS to deauthenticate from
+ * @bssid: the BSSID of the BSS to deauthenticate from
  * @ie: Extra IEs to add to Deauthentication frame or %NULL
  * @ie_len: Length of ie buffer in octets
  * @reason_code: The reason code for the deauthentication
- * @local_state_change: This is a request for a local state only, i.e., no
- *     Deauthentication frame is to be transmitted.
  */
 struct cfg80211_deauth_request {
-       struct cfg80211_bss *bss;
+       const u8 *bssid;
        const u8 *ie;
        size_t ie_len;
        u16 reason_code;
-       bool local_state_change;
 };
 
 /**
@@ -1148,6 +1157,10 @@ struct cfg80211_disassoc_request {
  * @beacon_interval: beacon interval to use
  * @privacy: this is a protected network, keys will be configured
  *     after joining
+ * @control_port: whether user space controls IEEE 802.1X port, i.e.,
+ *     sets/clears %NL80211_STA_FLAG_AUTHORIZED. If true, the driver is
+ *     required to assume that the port is unauthorized until authorized by
+ *     user space. Otherwise, port is marked authorized by default.
  * @basic_rates: bitmap of basic rates to use when creating the IBSS
  * @mcast_rate: per-band multicast rate index + 1 (0: disabled)
  */
@@ -1162,6 +1175,7 @@ struct cfg80211_ibss_params {
        u32 basic_rates;
        bool channel_fixed;
        bool privacy;
+       bool control_port;
        int mcast_rate[IEEE80211_NUM_BANDS];
 };
 
@@ -1229,8 +1243,7 @@ enum wiphy_params_flags {
 struct cfg80211_bitrate_mask {
        struct {
                u32 legacy;
-               /* TODO: add support for masking MCS rates; e.g.: */
-               /* u8 mcs[IEEE80211_HT_MCS_MASK_LEN]; */
+               u8 mcs[IEEE80211_HT_MCS_MASK_LEN];
        } control[IEEE80211_NUM_BANDS];
 };
 /**
@@ -1515,11 +1528,11 @@ struct cfg80211_ops {
                                        struct net_device *netdev,
                                        u8 key_index);
 
-       int     (*add_beacon)(struct wiphy *wiphy, struct net_device *dev,
-                             struct beacon_parameters *info);
-       int     (*set_beacon)(struct wiphy *wiphy, struct net_device *dev,
-                             struct beacon_parameters *info);
-       int     (*del_beacon)(struct wiphy *wiphy, struct net_device *dev);
+       int     (*start_ap)(struct wiphy *wiphy, struct net_device *dev,
+                           struct cfg80211_ap_settings *settings);
+       int     (*change_beacon)(struct wiphy *wiphy, struct net_device *dev,
+                                struct cfg80211_beacon_data *info);
+       int     (*stop_ap)(struct wiphy *wiphy, struct net_device *dev);
 
 
        int     (*add_station)(struct wiphy *wiphy, struct net_device *dev,
@@ -1574,11 +1587,9 @@ struct cfg80211_ops {
        int     (*assoc)(struct wiphy *wiphy, struct net_device *dev,
                         struct cfg80211_assoc_request *req);
        int     (*deauth)(struct wiphy *wiphy, struct net_device *dev,
-                         struct cfg80211_deauth_request *req,
-                         void *cookie);
+                         struct cfg80211_deauth_request *req);
        int     (*disassoc)(struct wiphy *wiphy, struct net_device *dev,
-                           struct cfg80211_disassoc_request *req,
-                           void *cookie);
+                           struct cfg80211_disassoc_request *req);
 
        int     (*connect)(struct wiphy *wiphy, struct net_device *dev,
                           struct cfg80211_connect_params *sme);
@@ -2204,8 +2215,6 @@ struct cfg80211_conn;
 struct cfg80211_internal_bss;
 struct cfg80211_cached_keys;
 
-#define MAX_AUTH_BSSES         4
-
 /**
  * struct wireless_dev - wireless per-netdev state
  *
@@ -2269,8 +2278,6 @@ struct wireless_dev {
        struct list_head event_list;
        spinlock_t event_lock;
 
-       struct cfg80211_internal_bss *authtry_bsses[MAX_AUTH_BSSES];
-       struct cfg80211_internal_bss *auth_bsses[MAX_AUTH_BSSES];
        struct cfg80211_internal_bss *current_bss; /* associated / joined */
        struct ieee80211_channel *channel;
 
@@ -2725,6 +2732,20 @@ struct cfg80211_bss *cfg80211_get_mesh(struct wiphy *wiphy,
                                       struct ieee80211_channel *channel,
                                       const u8 *meshid, size_t meshidlen,
                                       const u8 *meshcfg);
+/**
+ * cfg80211_ref_bss - reference BSS struct
+ * @bss: the BSS struct to reference
+ *
+ * Increments the refcount of the given BSS struct.
+ */
+void cfg80211_ref_bss(struct cfg80211_bss *bss);
+
+/**
+ * cfg80211_put_bss - unref BSS struct
+ * @bss: the BSS struct
+ *
+ * Decrements the refcount of the given BSS struct.
+ */
 void cfg80211_put_bss(struct cfg80211_bss *bss);
 
 /**
@@ -2762,20 +2783,10 @@ void cfg80211_send_rx_auth(struct net_device *dev, const u8 *buf, size_t len);
 void cfg80211_send_auth_timeout(struct net_device *dev, const u8 *addr);
 
 /**
- * __cfg80211_auth_canceled - notify cfg80211 that authentication was canceled
- * @dev: network device
- * @addr: The MAC address of the device with which the authentication timed out
- *
- * When a pending authentication had no action yet, the driver may decide
- * to not send a deauth frame, but in that case must calls this function
- * to tell cfg80211 about this decision. It is only valid to call this
- * function within the deauth() callback.
- */
-void __cfg80211_auth_canceled(struct net_device *dev, const u8 *addr);
-
-/**
  * cfg80211_send_rx_assoc - notification of processed association
  * @dev: network device
+ * @bss: the BSS struct association was requested for, the struct reference
+ *     is owned by cfg80211 after this call
  * @buf: (re)association response frame (header + body)
  * @len: length of the frame data
  *
@@ -2784,7 +2795,8 @@ void __cfg80211_auth_canceled(struct net_device *dev, const u8 *addr);
  * function or cfg80211_send_assoc_timeout() to indicate the result of
  * cfg80211_ops::assoc() call. This function may sleep.
  */
-void cfg80211_send_rx_assoc(struct net_device *dev, const u8 *buf, size_t len);
+void cfg80211_send_rx_assoc(struct net_device *dev, struct cfg80211_bss *bss,
+                           const u8 *buf, size_t len);
 
 /**
  * cfg80211_send_assoc_timeout - notification of timed out association
index 2cd66d0..f55c980 100644 (file)
@@ -72,8 +72,8 @@ struct dcbnl_rtnl_ops {
        void (*getpfccfg)(struct net_device *, int, u8 *);
        u8   (*setall)(struct net_device *);
        u8   (*getcap)(struct net_device *, int, u8 *);
-       u8   (*getnumtcs)(struct net_device *, int, u8 *);
-       u8   (*setnumtcs)(struct net_device *, int, u8);
+       int  (*getnumtcs)(struct net_device *, int, u8 *);
+       int  (*setnumtcs)(struct net_device *, int, u8);
        u8   (*getpfcstate)(struct net_device *);
        void (*setpfcstate)(struct net_device *, u8);
        void (*getbcncfg)(struct net_device *, int, u32 *);
index 298521e..814af0b 100644 (file)
@@ -3,6 +3,7 @@
 
 #include <linux/dn.h>
 #include <net/sock.h>
+#include <net/flow.h>
 #include <asm/byteorder.h>
 #include <asm/unaligned.h>
 
index 7db3299..ccb6888 100644 (file)
@@ -131,35 +131,8 @@ extern void genl_unregister_mc_group(struct genl_family *family,
 extern void genl_notify(struct sk_buff *skb, struct net *net, u32 pid,
                        u32 group, struct nlmsghdr *nlh, gfp_t flags);
 
-/**
- * genlmsg_put - Add generic netlink header to netlink message
- * @skb: socket buffer holding the message
- * @pid: netlink pid the message is addressed to
- * @seq: sequence number (usually the one of the sender)
- * @family: generic netlink family
- * @flags netlink message flags
- * @cmd: generic netlink command
- *
- * Returns pointer to user specific header
- */
-static inline void *genlmsg_put(struct sk_buff *skb, u32 pid, u32 seq,
-                               struct genl_family *family, int flags, u8 cmd)
-{
-       struct nlmsghdr *nlh;
-       struct genlmsghdr *hdr;
-
-       nlh = nlmsg_put(skb, pid, seq, family->id, GENL_HDRLEN +
-                       family->hdrsize, flags);
-       if (nlh == NULL)
-               return NULL;
-
-       hdr = nlmsg_data(nlh);
-       hdr->cmd = cmd;
-       hdr->version = family->version;
-       hdr->reserved = 0;
-
-       return (char *) hdr + GENL_HDRLEN;
-}
+void *genlmsg_put(struct sk_buff *skb, u32 pid, u32 seq,
+                               struct genl_family *family, int flags, u8 cmd);
 
 /**
  * genlmsg_nlhdr - Obtain netlink header from user specified header
index e3e4051..ae17e13 100644 (file)
@@ -132,6 +132,7 @@ struct rtable;
  * @tos - TOS
  * @mc_ttl - Multicasting TTL
  * @is_icsk - is this an inet_connection_sock?
+ * @uc_index - Unicast outgoing device index
  * @mc_index - Multicast device index
  * @mc_list - Group array
  * @cork - info to build ip hdr on each ip frag while socket is corked
@@ -167,6 +168,8 @@ struct inet_sock {
                                transparent:1,
                                mc_all:1,
                                nodefrag:1;
+       __u8                    rcv_tos;
+       int                     uc_index;
        int                     mc_index;
        __be32                  mc_addr;
        struct ip_mc_socklist __rcu     *mc_list;
index 0954ec9..2e1d5ec 100644 (file)
@@ -113,6 +113,7 @@ struct iucv_sock {
        spinlock_t              accept_q_lock;
        struct sock             *parent;
        struct iucv_path        *path;
+       struct net_device       *hs_dev;
        struct sk_buff_head     send_skb_q;
        struct sk_buff_head     backlog_skb_q;
        struct sock_msg_q       message_q;
@@ -131,6 +132,7 @@ struct iucv_sock {
 /* iucv socket options (SOL_IUCV) */
 #define SO_IPRMDATA_MSG        0x0080          /* send/recv IPRM_DATA msgs */
 #define SO_MSGLIMIT    0x1000          /* get/set IUCV MSGLIMIT */
+#define SO_MSGSIZE     0x0800          /* get maximum msgsize */
 
 /* iucv related control messages (scm) */
 #define SCM_IUCV_TRGCLS        0x0001          /* target class control message */
index d49928b..7477f02 100644 (file)
@@ -341,9 +341,9 @@ struct ieee80211_bss_conf {
  *     used to indicate that a frame was already retried due to PS
  * @IEEE80211_TX_INTFL_DONT_ENCRYPT: completely internal to mac80211,
  *     used to indicate frame should not be encrypted
- * @IEEE80211_TX_CTL_POLL_RESPONSE: This frame is a response to a poll
- *     frame (PS-Poll or uAPSD) and should be sent although the station
- *     is in powersave mode.
+ * @IEEE80211_TX_CTL_NO_PS_BUFFER: This frame is a response to a poll
+ *     frame (PS-Poll or uAPSD) or a non-bufferable MMPDU and must
+ *     be sent although the station is in powersave mode.
  * @IEEE80211_TX_CTL_MORE_FRAMES: More frames will be passed to the
  *     transmit function after the current frame, this can be used
  *     by drivers to kick the DMA queue only if unset or when the
@@ -399,7 +399,7 @@ enum mac80211_tx_control_flags {
        IEEE80211_TX_INTFL_NEED_TXPROCESSING    = BIT(14),
        IEEE80211_TX_INTFL_RETRIED              = BIT(15),
        IEEE80211_TX_INTFL_DONT_ENCRYPT         = BIT(16),
-       IEEE80211_TX_CTL_POLL_RESPONSE          = BIT(17),
+       IEEE80211_TX_CTL_NO_PS_BUFFER           = BIT(17),
        IEEE80211_TX_CTL_MORE_FRAMES            = BIT(18),
        IEEE80211_TX_INTFL_RETRANSMISSION       = BIT(19),
        /* hole at 20, use later */
@@ -425,7 +425,7 @@ enum mac80211_tx_control_flags {
        IEEE80211_TX_CTL_SEND_AFTER_DTIM | IEEE80211_TX_CTL_AMPDU |           \
        IEEE80211_TX_STAT_TX_FILTERED | IEEE80211_TX_STAT_ACK |               \
        IEEE80211_TX_STAT_AMPDU | IEEE80211_TX_STAT_AMPDU_NO_BACK |           \
-       IEEE80211_TX_CTL_RATE_CTRL_PROBE | IEEE80211_TX_CTL_POLL_RESPONSE |   \
+       IEEE80211_TX_CTL_RATE_CTRL_PROBE | IEEE80211_TX_CTL_NO_PS_BUFFER |    \
        IEEE80211_TX_CTL_MORE_FRAMES | IEEE80211_TX_CTL_LDPC |                \
        IEEE80211_TX_CTL_STBC | IEEE80211_TX_STATUS_EOSP)
 
@@ -852,6 +852,21 @@ struct ieee80211_channel_switch {
 };
 
 /**
+ * enum ieee80211_vif_flags - virtual interface flags
+ *
+ * @IEEE80211_VIF_BEACON_FILTER: the device performs beacon filtering
+ *     on this virtual interface to avoid unnecessary CPU wakeups
+ * @IEEE80211_VIF_SUPPORTS_CQM_RSSI: the device can do connection quality
+ *     monitoring on this virtual interface -- i.e. it can monitor
+ *     connection quality related parameters, such as the RSSI level and
+ *     provide notifications if configured trigger levels are reached.
+ */
+enum ieee80211_vif_flags {
+       IEEE80211_VIF_BEACON_FILTER             = BIT(0),
+       IEEE80211_VIF_SUPPORTS_CQM_RSSI         = BIT(1),
+};
+
+/**
  * struct ieee80211_vif - per-interface data
  *
  * Data in this structure is continually present for driver
@@ -863,6 +878,10 @@ struct ieee80211_channel_switch {
  * @addr: address of this interface
  * @p2p: indicates whether this AP or STA interface is a p2p
  *     interface, i.e. a GO or p2p-sta respectively
+ * @driver_flags: flags/capabilities the driver has for this interface,
+ *     these need to be set (or cleared) when the interface is added
+ *     or, if supported by the driver, the interface type is changed
+ *     at runtime, mac80211 will never touch this field
  * @drv_priv: data area for driver use, will always be aligned to
  *     sizeof(void *).
  */
@@ -871,6 +890,7 @@ struct ieee80211_vif {
        struct ieee80211_bss_conf bss_conf;
        u8 addr[ETH_ALEN];
        bool p2p;
+       u32 driver_flags;
        /* must be last */
        u8 drv_priv[0] __attribute__((__aligned__(sizeof(void *))));
 };
@@ -962,6 +982,25 @@ enum set_key_cmd {
 };
 
 /**
+ * enum ieee80211_sta_state - station state
+ *
+ * @IEEE80211_STA_NOTEXIST: station doesn't exist at all,
+ *     this is a special state for add/remove transitions
+ * @IEEE80211_STA_NONE: station exists without special state
+ * @IEEE80211_STA_AUTH: station is authenticated
+ * @IEEE80211_STA_ASSOC: station is associated
+ * @IEEE80211_STA_AUTHORIZED: station is authorized (802.1X)
+ */
+enum ieee80211_sta_state {
+       /* NOTE: These need to be ordered correctly! */
+       IEEE80211_STA_NOTEXIST,
+       IEEE80211_STA_NONE,
+       IEEE80211_STA_AUTH,
+       IEEE80211_STA_ASSOC,
+       IEEE80211_STA_AUTHORIZED,
+};
+
+/**
  * struct ieee80211_sta - station table entry
  *
  * A station table entry represents a station we are possibly
@@ -1079,10 +1118,6 @@ enum sta_notify_cmd {
  * @IEEE80211_HW_MFP_CAPABLE:
  *     Hardware supports management frame protection (MFP, IEEE 802.11w).
  *
- * @IEEE80211_HW_BEACON_FILTER:
- *     Hardware supports dropping of irrelevant beacon frames to
- *     avoid waking up cpu.
- *
  * @IEEE80211_HW_SUPPORTS_STATIC_SMPS:
  *     Hardware supports static spatial multiplexing powersave,
  *     ie. can turn off all but one chain even on HT connections
@@ -1108,11 +1143,6 @@ enum sta_notify_cmd {
  *      When this flag is set, signaling beacon-loss will cause an immediate
  *      change to disassociated state.
  *
- * @IEEE80211_HW_SUPPORTS_CQM_RSSI:
- *     Hardware can do connection quality monitoring - i.e. it can monitor
- *     connection quality related parameters, such as the RSSI level and
- *     provide notifications if configured trigger levels are reached.
- *
  * @IEEE80211_HW_NEED_DTIM_PERIOD:
  *     This device needs to know the DTIM period for the BSS before
  *     associating.
@@ -1134,6 +1164,10 @@ enum sta_notify_cmd {
  * @IEEE80211_HW_TX_AMPDU_SETUP_IN_HW: The device handles TX A-MPDU session
  *     setup strictly in HW. mac80211 should not attempt to do this in
  *     software.
+ *
+ * @IEEE80211_HW_SCAN_WHILE_IDLE: The device can do hw scan while
+ *     being idle (i.e. mac80211 doesn't have to go idle-off during the
+ *     the scan).
  */
 enum ieee80211_hw_flags {
        IEEE80211_HW_HAS_RATE_CONTROL                   = 1<<0,
@@ -1150,16 +1184,17 @@ enum ieee80211_hw_flags {
        IEEE80211_HW_PS_NULLFUNC_STACK                  = 1<<11,
        IEEE80211_HW_SUPPORTS_DYNAMIC_PS                = 1<<12,
        IEEE80211_HW_MFP_CAPABLE                        = 1<<13,
-       IEEE80211_HW_BEACON_FILTER                      = 1<<14,
+       /* reuse bit 14 */
        IEEE80211_HW_SUPPORTS_STATIC_SMPS               = 1<<15,
        IEEE80211_HW_SUPPORTS_DYNAMIC_SMPS              = 1<<16,
        IEEE80211_HW_SUPPORTS_UAPSD                     = 1<<17,
        IEEE80211_HW_REPORTS_TX_ACK_STATUS              = 1<<18,
        IEEE80211_HW_CONNECTION_MONITOR                 = 1<<19,
-       IEEE80211_HW_SUPPORTS_CQM_RSSI                  = 1<<20,
+       /* reuse bit 20 */
        IEEE80211_HW_SUPPORTS_PER_STA_GTK               = 1<<21,
        IEEE80211_HW_AP_LINK_PS                         = 1<<22,
        IEEE80211_HW_TX_AMPDU_SETUP_IN_HW               = 1<<23,
+       IEEE80211_HW_SCAN_WHILE_IDLE                    = 1<<24,
 };
 
 /**
@@ -1446,8 +1481,8 @@ void ieee80211_free_txskb(struct ieee80211_hw *hw, struct sk_buff *skb);
  * way the host will only receive beacons where some relevant information
  * (for example ERP protection or WMM settings) have changed.
  *
- * Beacon filter support is advertised with the %IEEE80211_HW_BEACON_FILTER
- * hardware capability. The driver needs to enable beacon filter support
+ * Beacon filter support is advertised with the %IEEE80211_VIF_BEACON_FILTER
+ * interface capability. The driver needs to enable beacon filter support
  * whenever power save is enabled, that is %IEEE80211_CONF_PS is set. When
  * power save is enabled, the stack will not check for beacon loss and the
  * driver needs to notify about loss of beacons with ieee80211_beacon_loss().
@@ -1599,7 +1634,7 @@ void ieee80211_free_txskb(struct ieee80211_hw *hw, struct sk_buff *skb);
  * the station sends a PS-Poll or a uAPSD trigger frame, mac80211
  * will inform the driver of this with the @allow_buffered_frames
  * callback; this callback is optional. mac80211 will then transmit
- * the frames as usual and set the %IEEE80211_TX_CTL_POLL_RESPONSE
+ * the frames as usual and set the %IEEE80211_TX_CTL_NO_PS_BUFFER
  * on each frame. The last frame in the service period (or the only
  * response to a PS-Poll) also has %IEEE80211_TX_STATUS_EOSP set to
  * indicate that it ends the service period; as this frame must have
@@ -1607,6 +1642,9 @@ void ieee80211_free_txskb(struct ieee80211_hw *hw, struct sk_buff *skb);
  * When TX status is reported for this frame, the service period is
  * marked has having ended and a new one can be started by the peer.
  *
+ * Additionally, non-bufferable MMPDUs can also be transmitted by
+ * mac80211 with the %IEEE80211_TX_CTL_NO_PS_BUFFER set in them.
+ *
  * Another race condition can happen on some devices like iwlwifi
  * when there are frames queued for the station and it wakes up
  * or polls; the frames that are already queued could end up being
@@ -1963,6 +2001,13 @@ enum ieee80211_frame_release_type {
  *     in AP mode, this callback will not be called when the flag
  *     %IEEE80211_HW_AP_LINK_PS is set. Must be atomic.
  *
+ * @sta_state: Notifies low level driver about state transition of a
+ *     station (which can be the AP, a client, IBSS/WDS/mesh peer etc.)
+ *     This callback is mutually exclusive with @sta_add/@sta_remove.
+ *     It must not fail for down transitions but may fail for transitions
+ *     up the list of states.
+ *     The callback can sleep.
+ *
  * @conf_tx: Configure TX queue parameters (EDCF (aifs, cw_min, cw_max),
  *     bursting) for a hardware TX queue.
  *     Returns a negative error code on failure.
@@ -2098,7 +2143,7 @@ enum ieee80211_frame_release_type {
  * @allow_buffered_frames: Prepare device to allow the given number of frames
  *     to go out to the given station. The frames will be sent by mac80211
  *     via the usual TX path after this call. The TX information for frames
- *     released will also have the %IEEE80211_TX_CTL_POLL_RESPONSE flag set
+ *     released will also have the %IEEE80211_TX_CTL_NO_PS_BUFFER flag set
  *     and the last one will also have %IEEE80211_TX_STATUS_EOSP set. In case
  *     frames from multiple TIDs are released and the driver might reorder
  *     them between the TIDs, it must set the %IEEE80211_TX_STATUS_EOSP flag
@@ -2182,6 +2227,10 @@ struct ieee80211_ops {
                          struct ieee80211_sta *sta);
        void (*sta_notify)(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
                        enum sta_notify_cmd, struct ieee80211_sta *sta);
+       int (*sta_state)(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
+                        struct ieee80211_sta *sta,
+                        enum ieee80211_sta_state old_state,
+                        enum ieee80211_sta_state new_state);
        int (*conf_tx)(struct ieee80211_hw *hw,
                       struct ieee80211_vif *vif, u16 queue,
                       const struct ieee80211_tx_queue_params *params);
@@ -3316,7 +3365,7 @@ struct sk_buff *ieee80211_ap_probereq_get(struct ieee80211_hw *hw,
  *
  * @vif: &struct ieee80211_vif pointer from the add_interface callback.
  *
- * When beacon filtering is enabled with %IEEE80211_HW_BEACON_FILTER and
+ * When beacon filtering is enabled with %IEEE80211_VIF_BEACON_FILTER and
  * %IEEE80211_CONF_PS is set, the driver needs to inform whenever the
  * hardware is not receiving beacons with this function.
  */
@@ -3327,7 +3376,7 @@ void ieee80211_beacon_loss(struct ieee80211_vif *vif);
  *
  * @vif: &struct ieee80211_vif pointer from the add_interface callback.
  *
- * When beacon filtering is enabled with %IEEE80211_HW_BEACON_FILTER, and
+ * When beacon filtering is enabled with %IEEE80211_VIF_BEACON_FILTER, and
  * %IEEE80211_CONF_PS and %IEEE80211_HW_CONNECTION_MONITOR are set, the driver
  * needs to inform if the connection to the AP has been lost.
  *
@@ -3397,7 +3446,7 @@ void ieee80211_enable_dyn_ps(struct ieee80211_vif *vif);
  * @rssi_event: the RSSI trigger event type
  * @gfp: context flags
  *
- * When the %IEEE80211_HW_SUPPORTS_CQM_RSSI is set, and a connection quality
+ * When the %IEEE80211_VIF_SUPPORTS_CQM_RSSI is set, and a connection quality
  * monitoring is configured with an rssi threshold, the driver will inform
  * whenever the rssi level reaches the threshold.
  */
@@ -3540,6 +3589,7 @@ struct ieee80211_tx_rate_control {
        bool rts, short_preamble;
        u8 max_rate_idx;
        u32 rate_idx_mask;
+       u8 rate_idx_mcs_mask[IEEE80211_HT_MCS_MASK_LEN];
        bool bss;
 };
 
index e3133c2..6f9c25a 100644 (file)
@@ -133,7 +133,6 @@ extern void                 ndisc_send_rs(struct net_device *dev,
                                              const struct in6_addr *daddr);
 
 extern void                    ndisc_send_redirect(struct sk_buff *skb,
-                                                   struct neighbour *neigh,
                                                    const struct in6_addr *target);
 
 extern int                     ndisc_mc_map(const struct in6_addr *addr, char *buf,
index cb1f350..f394fe5 100644 (file)
@@ -441,41 +441,6 @@ static inline int nlmsg_report(const struct nlmsghdr *nlh)
        nla_for_each_attr(pos, nlmsg_attrdata(nlh, hdrlen), \
                          nlmsg_attrlen(nlh, hdrlen), rem)
 
-#if 0
-/* FIXME: Enable once all users have been converted */
-
-/**
- * __nlmsg_put - Add a new netlink message to an skb
- * @skb: socket buffer to store message in
- * @pid: netlink process id
- * @seq: sequence number of message
- * @type: message type
- * @payload: length of message payload
- * @flags: message flags
- *
- * The caller is responsible to ensure that the skb provides enough
- * tailroom for both the netlink header and payload.
- */
-static inline struct nlmsghdr *__nlmsg_put(struct sk_buff *skb, u32 pid,
-                                          u32 seq, int type, int payload,
-                                          int flags)
-{
-       struct nlmsghdr *nlh;
-
-       nlh = (struct nlmsghdr *) skb_put(skb, nlmsg_total_size(payload));
-       nlh->nlmsg_type = type;
-       nlh->nlmsg_len = nlmsg_msg_size(payload);
-       nlh->nlmsg_flags = flags;
-       nlh->nlmsg_pid = pid;
-       nlh->nlmsg_seq = seq;
-
-       memset((unsigned char *) nlmsg_data(nlh) + payload, 0,
-              nlmsg_padlen(payload));
-
-       return nlh;
-}
-#endif
-
 /**
  * nlmsg_put - Add a new netlink message to an skb
  * @skb: socket buffer to store message in
index 2be95e2..276094b 100644 (file)
 #define NCI_DISC_MAP_MODE_POLL                                 0x01
 #define NCI_DISC_MAP_MODE_LISTEN                               0x02
 
+/* NCI Discover Notification Type */
+#define NCI_DISCOVER_NTF_TYPE_LAST                             0x00
+#define NCI_DISCOVER_NTF_TYPE_LAST_NFCC                                0x01
+#define NCI_DISCOVER_NTF_TYPE_MORE                             0x02
+
 /* NCI Deactivation Type */
 #define NCI_DEACTIVATE_TYPE_IDLE_MODE                          0x00
 #define NCI_DEACTIVATE_TYPE_SLEEP_MODE                         0x01
@@ -207,6 +212,13 @@ struct nci_rf_disc_cmd {
        struct disc_config              disc_configs[NCI_MAX_NUM_RF_CONFIGS];
 } __packed;
 
+#define NCI_OP_RF_DISCOVER_SELECT_CMD  nci_opcode_pack(NCI_GID_RF_MGMT, 0x04)
+struct nci_rf_discover_select_cmd {
+       __u8    rf_discovery_id;
+       __u8    rf_protocol;
+       __u8    rf_interface;
+} __packed;
+
 #define NCI_OP_RF_DEACTIVATE_CMD       nci_opcode_pack(NCI_GID_RF_MGMT, 0x06)
 struct nci_rf_deactivate_cmd {
        __u8    type;
@@ -244,6 +256,8 @@ struct nci_core_init_rsp_2 {
 
 #define NCI_OP_RF_DISCOVER_RSP         nci_opcode_pack(NCI_GID_RF_MGMT, 0x03)
 
+#define NCI_OP_RF_DISCOVER_SELECT_RSP  nci_opcode_pack(NCI_GID_RF_MGMT, 0x04)
+
 #define NCI_OP_RF_DEACTIVATE_RSP       nci_opcode_pack(NCI_GID_RF_MGMT, 0x06)
 
 /* --------------------------- */
@@ -260,13 +274,15 @@ struct nci_core_conn_credit_ntf {
        struct conn_credit_entry        conn_entries[NCI_MAX_NUM_CONN];
 } __packed;
 
+#define NCI_OP_CORE_GENERIC_ERROR_NTF  nci_opcode_pack(NCI_GID_CORE, 0x07)
+
 #define NCI_OP_CORE_INTF_ERROR_NTF     nci_opcode_pack(NCI_GID_CORE, 0x08)
 struct nci_core_intf_error_ntf {
        __u8    status;
        __u8    conn_id;
 } __packed;
 
-#define NCI_OP_RF_INTF_ACTIVATED_NTF   nci_opcode_pack(NCI_GID_RF_MGMT, 0x05)
+#define NCI_OP_RF_DISCOVER_NTF         nci_opcode_pack(NCI_GID_RF_MGMT, 0x03)
 struct rf_tech_specific_params_nfca_poll {
        __u16   sens_res;
        __u8    nfcid1_len;     /* 0, 4, 7, or 10 Bytes */
@@ -275,11 +291,43 @@ struct rf_tech_specific_params_nfca_poll {
        __u8    sel_res;
 } __packed;
 
+struct rf_tech_specific_params_nfcb_poll {
+       __u8    sensb_res_len;
+       __u8    sensb_res[12];  /* 11 or 12 Bytes */
+} __packed;
+
+struct rf_tech_specific_params_nfcf_poll {
+       __u8    bit_rate;
+       __u8    sensf_res_len;
+       __u8    sensf_res[18];  /* 16 or 18 Bytes */
+} __packed;
+
+struct nci_rf_discover_ntf {
+       __u8    rf_discovery_id;
+       __u8    rf_protocol;
+       __u8    rf_tech_and_mode;
+       __u8    rf_tech_specific_params_len;
+
+       union {
+               struct rf_tech_specific_params_nfca_poll nfca_poll;
+               struct rf_tech_specific_params_nfcb_poll nfcb_poll;
+               struct rf_tech_specific_params_nfcf_poll nfcf_poll;
+       } rf_tech_specific_params;
+
+       __u8    ntf_type;
+} __packed;
+
+#define NCI_OP_RF_INTF_ACTIVATED_NTF   nci_opcode_pack(NCI_GID_RF_MGMT, 0x05)
 struct activation_params_nfca_poll_iso_dep {
        __u8    rats_res_len;
        __u8    rats_res[20];
 };
 
+struct activation_params_nfcb_poll_iso_dep {
+       __u8    attrib_res_len;
+       __u8    attrib_res[50];
+};
+
 struct nci_rf_intf_activated_ntf {
        __u8    rf_discovery_id;
        __u8    rf_interface;
@@ -291,6 +339,8 @@ struct nci_rf_intf_activated_ntf {
 
        union {
                struct rf_tech_specific_params_nfca_poll nfca_poll;
+               struct rf_tech_specific_params_nfcb_poll nfcb_poll;
+               struct rf_tech_specific_params_nfcf_poll nfcf_poll;
        } rf_tech_specific_params;
 
        __u8    data_exch_rf_tech_and_mode;
@@ -300,6 +350,7 @@ struct nci_rf_intf_activated_ntf {
 
        union {
                struct activation_params_nfca_poll_iso_dep nfca_poll_iso_dep;
+               struct activation_params_nfcb_poll_iso_dep nfcb_poll_iso_dep;
        } activation_params;
 
 } __packed;
index bccd89e..86fee8b 100644 (file)
 #include <net/nfc/nfc.h>
 #include <net/nfc/nci.h>
 
-/* NCI device state */
-enum {
+/* NCI device flags */
+enum nci_flag {
        NCI_INIT,
        NCI_UP,
+       NCI_DATA_EXCHANGE,
+       NCI_DATA_EXCHANGE_TO,
+};
+
+/* NCI device states */
+enum nci_state {
+       NCI_IDLE,
        NCI_DISCOVERY,
+       NCI_W4_ALL_DISCOVERIES,
+       NCI_W4_HOST_SELECT,
        NCI_POLL_ACTIVE,
-       NCI_DATA_EXCHANGE,
 };
 
 /* NCI timeouts */
 #define NCI_RESET_TIMEOUT                      5000
 #define NCI_INIT_TIMEOUT                       5000
 #define NCI_RF_DISC_TIMEOUT                    5000
-#define NCI_RF_DEACTIVATE_TIMEOUT              5000
+#define NCI_RF_DISC_SELECT_TIMEOUT             5000
+#define NCI_RF_DEACTIVATE_TIMEOUT              30000
 #define NCI_CMD_TIMEOUT                                5000
+#define NCI_DATA_TIMEOUT                       700
 
 struct nci_dev;
 
@@ -59,6 +69,7 @@ struct nci_ops {
 };
 
 #define NCI_MAX_SUPPORTED_RF_INTERFACES                4
+#define NCI_MAX_DISCOVERED_TARGETS             10
 
 /* NCI Core structures */
 struct nci_dev {
@@ -68,12 +79,14 @@ struct nci_dev {
        int                     tx_headroom;
        int                     tx_tailroom;
 
+       atomic_t                state;
        unsigned long           flags;
 
        atomic_t                cmd_cnt;
        atomic_t                credits_cnt;
 
        struct timer_list       cmd_timer;
+       struct timer_list       data_timer;
 
        struct workqueue_struct *cmd_wq;
        struct work_struct      cmd_work;
@@ -96,9 +109,11 @@ struct nci_dev {
        void                    *driver_data;
 
        __u32                   poll_prots;
-       __u32                   target_available_prots;
        __u32                   target_active_prot;
 
+       struct nfc_target       targets[NCI_MAX_DISCOVERED_TARGETS];
+       int                     n_targets;
+
        /* received during NCI_OP_CORE_RESET_RSP */
        __u8                    nci_ver;
 
@@ -169,6 +184,7 @@ int nci_send_cmd(struct nci_dev *ndev, __u16 opcode, __u8 plen, void *payload);
 int nci_send_data(struct nci_dev *ndev, __u8 conn_id, struct sk_buff *skb);
 void nci_data_exchange_complete(struct nci_dev *ndev, struct sk_buff *skb,
                                int err);
+void nci_clear_target_list(struct nci_dev *ndev);
 
 /* ----- NCI requests ----- */
 #define NCI_REQ_DONE           0
index 8696b77..d253278 100644 (file)
@@ -24,6 +24,7 @@
 #ifndef __NET_NFC_H
 #define __NET_NFC_H
 
+#include <linux/nfc.h>
 #include <linux/device.h>
 #include <linux/skbuff.h>
 
@@ -65,7 +66,6 @@ struct nfc_ops {
 
 #define NFC_TARGET_IDX_ANY -1
 #define NFC_MAX_GT_LEN 48
-#define NFC_MAX_NFCID1_LEN 10
 
 struct nfc_target {
        u32 idx;
@@ -73,7 +73,11 @@ struct nfc_target {
        u16 sens_res;
        u8 sel_res;
        u8 nfcid1_len;
-       u8 nfcid1[NFC_MAX_NFCID1_LEN];
+       u8 nfcid1[NFC_NFCID1_MAXSIZE];
+       u8 sensb_res_len;
+       u8 sensb_res[NFC_SENSB_RES_MAXSIZE];
+       u8 sensf_res_len;
+       u8 sensf_res[NFC_SENSF_RES_MAXSIZE];
 };
 
 struct nfc_genl_data {
@@ -83,7 +87,6 @@ struct nfc_genl_data {
 
 struct nfc_dev {
        unsigned idx;
-       unsigned target_idx;
        struct nfc_target *targets;
        int n_targets;
        int targets_generation;
index 91c1c8b..ba761e7 100644 (file)
@@ -357,6 +357,7 @@ struct sock {
        struct page             *sk_sndmsg_page;
        struct sk_buff          *sk_send_head;
        __u32                   sk_sndmsg_off;
+       __s32                   sk_peek_off;
        int                     sk_write_pending;
 #ifdef CONFIG_SECURITY
        void                    *sk_security;
@@ -373,6 +374,30 @@ struct sock {
        void                    (*sk_destruct)(struct sock *sk);
 };
 
+static inline int sk_peek_offset(struct sock *sk, int flags)
+{
+       if ((flags & MSG_PEEK) && (sk->sk_peek_off >= 0))
+               return sk->sk_peek_off;
+       else
+               return 0;
+}
+
+static inline void sk_peek_offset_bwd(struct sock *sk, int val)
+{
+       if (sk->sk_peek_off >= 0) {
+               if (sk->sk_peek_off >= val)
+                       sk->sk_peek_off -= val;
+               else
+                       sk->sk_peek_off = 0;
+       }
+}
+
+static inline void sk_peek_offset_fwd(struct sock *sk, int val)
+{
+       if (sk->sk_peek_off >= 0)
+               sk->sk_peek_off += val;
+}
+
 /*
  * Hashed lists helper routines
  */
@@ -590,6 +615,10 @@ enum sock_flags {
        SOCK_RXQ_OVFL,
        SOCK_ZEROCOPY, /* buffers from userspace */
        SOCK_WIFI_STATUS, /* push wifi status to userspace */
+       SOCK_NOFCS, /* Tell NIC not to do the Ethernet FCS.
+                    * Will use last 4 bytes of packet sent from
+                    * user-space instead.
+                    */
 };
 
 static inline void sock_copy_flags(struct sock *nsk, struct sock *osk)
index 2d80c29..8607e6a 100644 (file)
@@ -1138,35 +1138,27 @@ static inline void tcp_clear_all_retrans_hints(struct tcp_sock *tp)
 /* MD5 Signature */
 struct crypto_hash;
 
+union tcp_md5_addr {
+       struct in_addr  a4;
+#if IS_ENABLED(CONFIG_IPV6)
+       struct in6_addr a6;
+#endif
+};
+
 /* - key database */
 struct tcp_md5sig_key {
-       u8                      *key;
+       struct hlist_node       node;
        u8                      keylen;
-};
-
-struct tcp4_md5sig_key {
-       struct tcp_md5sig_key   base;
-       __be32                  addr;
-};
-
-struct tcp6_md5sig_key {
-       struct tcp_md5sig_key   base;
-#if 0
-       u32                     scope_id;       /* XXX */
-#endif
-       struct in6_addr         addr;
+       u8                      family; /* AF_INET or AF_INET6 */
+       union tcp_md5_addr      addr;
+       u8                      key[TCP_MD5SIG_MAXKEYLEN];
+       struct rcu_head         rcu;
 };
 
 /* - sock block */
 struct tcp_md5sig_info {
-       struct tcp4_md5sig_key  *keys4;
-#if IS_ENABLED(CONFIG_IPV6)
-       struct tcp6_md5sig_key  *keys6;
-       u32                     entries6;
-       u32                     alloced6;
-#endif
-       u32                     entries4;
-       u32                     alloced4;
+       struct hlist_head       head;
+       struct rcu_head         rcu;
 };
 
 /* - pseudo header */
@@ -1203,19 +1195,25 @@ extern int tcp_v4_md5_hash_skb(char *md5_hash, struct tcp_md5sig_key *key,
                               const struct sock *sk,
                               const struct request_sock *req,
                               const struct sk_buff *skb);
-extern struct tcp_md5sig_key * tcp_v4_md5_lookup(struct sock *sk,
-                                                struct sock *addr_sk);
-extern int tcp_v4_md5_do_add(struct sock *sk, __be32 addr, u8 *newkey,
-                            u8 newkeylen);
-extern int tcp_v4_md5_do_del(struct sock *sk, __be32 addr);
+extern int tcp_md5_do_add(struct sock *sk, const union tcp_md5_addr *addr,
+                         int family, const u8 *newkey,
+                         u8 newkeylen, gfp_t gfp);
+extern int tcp_md5_do_del(struct sock *sk, const union tcp_md5_addr *addr,
+                         int family);
+extern struct tcp_md5sig_key *tcp_v4_md5_lookup(struct sock *sk,
+                                        struct sock *addr_sk);
 
 #ifdef CONFIG_TCP_MD5SIG
-#define tcp_twsk_md5_key(twsk) ((twsk)->tw_md5_keylen ?                 \
-                                &(struct tcp_md5sig_key) {              \
-                                       .key = (twsk)->tw_md5_key,       \
-                                       .keylen = (twsk)->tw_md5_keylen, \
-                               } : NULL)
+extern struct tcp_md5sig_key *tcp_md5_do_lookup(struct sock *sk,
+                       const union tcp_md5_addr *addr, int family);
+#define tcp_twsk_md5_key(twsk) ((twsk)->tw_md5_key)
 #else
+static inline struct tcp_md5sig_key *tcp_md5_do_lookup(struct sock *sk,
+                                        const union tcp_md5_addr *addr,
+                                        int family)
+{
+       return NULL;
+}
 #define tcp_twsk_md5_key(twsk) NULL
 #endif
 
@@ -1471,10 +1469,6 @@ struct tcp_sock_af_ops {
                                                  const struct sock *sk,
                                                  const struct request_sock *req,
                                                  const struct sk_buff *skb);
-       int                     (*md5_add) (struct sock *sk,
-                                           struct sock *addr_sk,
-                                           u8 *newkey,
-                                           u8 len);
        int                     (*md5_parse) (struct sock *sk,
                                              char __user *optval,
                                              int optlen);
index 89174e2..96239e7 100644 (file)
@@ -1566,11 +1566,6 @@ extern struct xfrm_algo_desc *xfrm_calg_get_byname(const char *name, int probe);
 extern struct xfrm_algo_desc *xfrm_aead_get_byname(const char *name, int icv_len,
                                                   int probe);
 
-struct hash_desc;
-struct scatterlist;
-typedef int (icv_update_fn_t)(struct hash_desc *, struct scatterlist *,
-                             unsigned int);
-
 static inline int xfrm_addr_cmp(const xfrm_address_t *a,
                                const xfrm_address_t *b,
                                int family)
index 127fe70..5de42ea 100644 (file)
@@ -330,6 +330,8 @@ static netdev_tx_t clip_start_xmit(struct sk_buff *skb,
        struct atmarp_entry *entry;
        struct neighbour *n;
        struct atm_vcc *vcc;
+       struct rtable *rt;
+       __be32 *daddr;
        int old;
        unsigned long flags;
 
@@ -340,7 +342,12 @@ static netdev_tx_t clip_start_xmit(struct sk_buff *skb,
                dev->stats.tx_dropped++;
                return NETDEV_TX_OK;
        }
-       n = dst_get_neighbour_noref(dst);
+       rt = (struct rtable *) dst;
+       if (rt->rt_gateway)
+               daddr = &rt->rt_gateway;
+       else
+               daddr = &ip_hdr(skb)->daddr;
+       n = dst_neigh_lookup(dst, daddr);
        if (!n) {
                pr_err("NO NEIGHBOUR !\n");
                dev_kfree_skb(skb);
@@ -360,7 +367,7 @@ static netdev_tx_t clip_start_xmit(struct sk_buff *skb,
                        dev_kfree_skb(skb);
                        dev->stats.tx_dropped++;
                }
-               return NETDEV_TX_OK;
+               goto out_release_neigh;
        }
        pr_debug("neigh %p, vccs %p\n", entry, entry->vccs);
        ATM_SKB(skb)->vcc = vcc = entry->vccs->vcc;
@@ -379,14 +386,14 @@ static netdev_tx_t clip_start_xmit(struct sk_buff *skb,
        old = xchg(&entry->vccs->xoff, 1);      /* assume XOFF ... */
        if (old) {
                pr_warning("XOFF->XOFF transition\n");
-               return NETDEV_TX_OK;
+               goto out_release_neigh;
        }
        dev->stats.tx_packets++;
        dev->stats.tx_bytes += skb->len;
        vcc->send(vcc, skb);
        if (atm_may_send(vcc, 0)) {
                entry->vccs->xoff = 0;
-               return NETDEV_TX_OK;
+               goto out_release_neigh;
        }
        spin_lock_irqsave(&clip_priv->xoff_lock, flags);
        netif_stop_queue(dev);  /* XOFF -> throttle immediately */
@@ -398,6 +405,8 @@ static netdev_tx_t clip_start_xmit(struct sk_buff *skb,
           of the brief netif_stop_queue. If this isn't true or if it
           changes, use netif_wake_queue instead. */
        spin_unlock_irqrestore(&clip_priv->xoff_lock, flags);
+out_release_neigh:
+       neigh_release(n);
        return NETDEV_TX_OK;
 }
 
index df35d9a..614d3fc 100644 (file)
@@ -44,7 +44,7 @@
 #include <linux/atmdev.h>
 #include <linux/capability.h>
 #include <linux/ppp_defs.h>
-#include <linux/if_ppp.h>
+#include <linux/ppp-ioctl.h>
 #include <linux/ppp_channel.h>
 #include <linux/atmppp.h>
 
index ce68611..4e392eb 100644 (file)
@@ -1,5 +1,5 @@
 #
-# Copyright (C) 2007-2011 B.A.T.M.A.N. contributors:
+# Copyright (C) 2007-2012 B.A.T.M.A.N. contributors:
 #
 # Marek Lindner, Simon Wunderlich
 #
diff --git a/net/batman-adv/bat_algo.h b/net/batman-adv/bat_algo.h
new file mode 100644 (file)
index 0000000..9852a68
--- /dev/null
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2011-2012 B.A.T.M.A.N. contributors:
+ *
+ * Marek Lindner
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of version 2 of the GNU General Public
+ * License as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA
+ *
+ */
+
+#ifndef _NET_BATMAN_ADV_BAT_ALGO_H_
+#define _NET_BATMAN_ADV_BAT_ALGO_H_
+
+int bat_iv_init(void);
+
+#endif /* _NET_BATMAN_ADV_BAT_ALGO_H_ */
index d0af9bf..c3b0548 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010-2011 B.A.T.M.A.N. contributors:
+ * Copyright (C) 2010-2012 B.A.T.M.A.N. contributors:
  *
  * Marek Lindner
  *
@@ -221,6 +221,11 @@ static void debug_log_cleanup(struct bat_priv *bat_priv)
 }
 #endif
 
+static int bat_algorithms_open(struct inode *inode, struct file *file)
+{
+       return single_open(file, bat_algo_seq_print_text, NULL);
+}
+
 static int originators_open(struct inode *inode, struct file *file)
 {
        struct net_device *net_dev = (struct net_device *)inode->i_private;
@@ -274,6 +279,7 @@ struct bat_debuginfo bat_debuginfo_##_name = {      \
                }                               \
 };
 
+static BAT_DEBUGINFO(routing_algos, S_IRUGO, bat_algorithms_open);
 static BAT_DEBUGINFO(originators, S_IRUGO, originators_open);
 static BAT_DEBUGINFO(gateways, S_IRUGO, gateways_open);
 static BAT_DEBUGINFO(softif_neigh, S_IRUGO, softif_neigh_open);
@@ -293,9 +299,25 @@ static struct bat_debuginfo *mesh_debuginfos[] = {
 
 void debugfs_init(void)
 {
+       struct bat_debuginfo *bat_debug;
+       struct dentry *file;
+
        bat_debugfs = debugfs_create_dir(DEBUGFS_BAT_SUBDIR, NULL);
        if (bat_debugfs == ERR_PTR(-ENODEV))
                bat_debugfs = NULL;
+
+       if (!bat_debugfs)
+               goto out;
+
+       bat_debug = &bat_debuginfo_routing_algos;
+       file = debugfs_create_file(bat_debug->attr.name,
+                                  S_IFREG | bat_debug->attr.mode,
+                                  bat_debugfs, NULL, &bat_debug->fops);
+       if (!file)
+               pr_err("Can't add debugfs file: %s\n", bat_debug->attr.name);
+
+out:
+       return;
 }
 
 void debugfs_destroy(void)
index bc9cda3..d605c67 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010-2011 B.A.T.M.A.N. contributors:
+ * Copyright (C) 2010-2012 B.A.T.M.A.N. contributors:
  *
  * Marek Lindner
  *
index 3512e25..2b66dae 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2007-2011 B.A.T.M.A.N. contributors:
+ * Copyright (C) 2007-2012 B.A.T.M.A.N. contributors:
  *
  * Marek Lindner, Simon Wunderlich
  *
@@ -20,7 +20,6 @@
  */
 
 #include "main.h"
-#include "bat_ogm.h"
 #include "translation-table.h"
 #include "ring_buffer.h"
 #include "originator.h"
@@ -29,8 +28,9 @@
 #include "gateway_client.h"
 #include "hard-interface.h"
 #include "send.h"
+#include "bat_algo.h"
 
-void bat_ogm_init(struct hard_iface *hard_iface)
+static void bat_iv_ogm_init(struct hard_iface *hard_iface)
 {
        struct batman_ogm_packet *batman_ogm_packet;
 
@@ -38,25 +38,25 @@ void bat_ogm_init(struct hard_iface *hard_iface)
        hard_iface->packet_buff = kmalloc(hard_iface->packet_len, GFP_ATOMIC);
 
        batman_ogm_packet = (struct batman_ogm_packet *)hard_iface->packet_buff;
-       batman_ogm_packet->packet_type = BAT_OGM;
-       batman_ogm_packet->version = COMPAT_VERSION;
+       batman_ogm_packet->header.packet_type = BAT_OGM;
+       batman_ogm_packet->header.version = COMPAT_VERSION;
+       batman_ogm_packet->header.ttl = 2;
        batman_ogm_packet->flags = NO_FLAGS;
-       batman_ogm_packet->ttl = 2;
        batman_ogm_packet->tq = TQ_MAX_VALUE;
        batman_ogm_packet->tt_num_changes = 0;
        batman_ogm_packet->ttvn = 0;
 }
 
-void bat_ogm_init_primary(struct hard_iface *hard_iface)
+static void bat_iv_ogm_init_primary(struct hard_iface *hard_iface)
 {
        struct batman_ogm_packet *batman_ogm_packet;
 
        batman_ogm_packet = (struct batman_ogm_packet *)hard_iface->packet_buff;
        batman_ogm_packet->flags = PRIMARIES_FIRST_HOP;
-       batman_ogm_packet->ttl = TTL;
+       batman_ogm_packet->header.ttl = TTL;
 }
 
-void bat_ogm_update_mac(struct hard_iface *hard_iface)
+static void bat_iv_ogm_update_mac(struct hard_iface *hard_iface)
 {
        struct batman_ogm_packet *batman_ogm_packet;
 
@@ -68,7 +68,7 @@ void bat_ogm_update_mac(struct hard_iface *hard_iface)
 }
 
 /* when do we schedule our own ogm to be sent */
-static unsigned long bat_ogm_emit_send_time(const struct bat_priv *bat_priv)
+static unsigned long bat_iv_ogm_emit_send_time(const struct bat_priv *bat_priv)
 {
        return jiffies + msecs_to_jiffies(
                   atomic_read(&bat_priv->orig_interval) -
@@ -76,7 +76,7 @@ static unsigned long bat_ogm_emit_send_time(const struct bat_priv *bat_priv)
 }
 
 /* when do we schedule a ogm packet to be sent */
-static unsigned long bat_ogm_fwd_send_time(void)
+static unsigned long bat_iv_ogm_fwd_send_time(void)
 {
        return jiffies + msecs_to_jiffies(random32() % (JITTER/2));
 }
@@ -89,8 +89,8 @@ static uint8_t hop_penalty(uint8_t tq, const struct bat_priv *bat_priv)
 }
 
 /* is there another aggregated packet here? */
-static int bat_ogm_aggr_packet(int buff_pos, int packet_len,
-                              int tt_num_changes)
+static int bat_iv_ogm_aggr_packet(int buff_pos, int packet_len,
+                                 int tt_num_changes)
 {
        int next_buff_pos = buff_pos + BATMAN_OGM_LEN + tt_len(tt_num_changes);
 
@@ -99,8 +99,8 @@ static int bat_ogm_aggr_packet(int buff_pos, int packet_len,
 }
 
 /* send a batman ogm to a given interface */
-static void bat_ogm_send_to_if(struct forw_packet *forw_packet,
-                              struct hard_iface *hard_iface)
+static void bat_iv_ogm_send_to_if(struct forw_packet *forw_packet,
+                                 struct hard_iface *hard_iface)
 {
        struct bat_priv *bat_priv = netdev_priv(hard_iface->soft_iface);
        char *fwd_str;
@@ -117,8 +117,8 @@ static void bat_ogm_send_to_if(struct forw_packet *forw_packet,
        batman_ogm_packet = (struct batman_ogm_packet *)forw_packet->skb->data;
 
        /* adjust all flags and log packets */
-       while (bat_ogm_aggr_packet(buff_pos, forw_packet->packet_len,
-                                  batman_ogm_packet->tt_num_changes)) {
+       while (bat_iv_ogm_aggr_packet(buff_pos, forw_packet->packet_len,
+                                     batman_ogm_packet->tt_num_changes)) {
 
                /* we might have aggregated direct link packets with an
                 * ordinary base packet */
@@ -137,7 +137,7 @@ static void bat_ogm_send_to_if(struct forw_packet *forw_packet,
                        fwd_str, (packet_num > 0 ? "aggregated " : ""),
                        batman_ogm_packet->orig,
                        ntohl(batman_ogm_packet->seqno),
-                       batman_ogm_packet->tq, batman_ogm_packet->ttl,
+                       batman_ogm_packet->tq, batman_ogm_packet->header.ttl,
                        (batman_ogm_packet->flags & DIRECTLINK ?
                         "on" : "off"),
                        batman_ogm_packet->ttvn, hard_iface->net_dev->name,
@@ -157,7 +157,7 @@ static void bat_ogm_send_to_if(struct forw_packet *forw_packet,
 }
 
 /* send a batman ogm packet */
-void bat_ogm_emit(struct forw_packet *forw_packet)
+static void bat_iv_ogm_emit(struct forw_packet *forw_packet)
 {
        struct hard_iface *hard_iface;
        struct net_device *soft_iface;
@@ -188,7 +188,7 @@ void bat_ogm_emit(struct forw_packet *forw_packet)
 
        /* multihomed peer assumed */
        /* non-primary OGMs are only broadcasted on their interface */
-       if ((directlink && (batman_ogm_packet->ttl == 1)) ||
+       if ((directlink && (batman_ogm_packet->header.ttl == 1)) ||
            (forw_packet->own && (forw_packet->if_incoming != primary_if))) {
 
                /* FIXME: what about aggregated packets ? */
@@ -198,7 +198,7 @@ void bat_ogm_emit(struct forw_packet *forw_packet)
                        (forw_packet->own ? "Sending own" : "Forwarding"),
                        batman_ogm_packet->orig,
                        ntohl(batman_ogm_packet->seqno),
-                       batman_ogm_packet->ttl,
+                       batman_ogm_packet->header.ttl,
                        forw_packet->if_incoming->net_dev->name,
                        forw_packet->if_incoming->net_dev->dev_addr);
 
@@ -216,7 +216,7 @@ void bat_ogm_emit(struct forw_packet *forw_packet)
                if (hard_iface->soft_iface != soft_iface)
                        continue;
 
-               bat_ogm_send_to_if(forw_packet, hard_iface);
+               bat_iv_ogm_send_to_if(forw_packet, hard_iface);
        }
        rcu_read_unlock();
 
@@ -226,13 +226,13 @@ out:
 }
 
 /* return true if new_packet can be aggregated with forw_packet */
-static bool bat_ogm_can_aggregate(const struct batman_ogm_packet
+static bool bat_iv_ogm_can_aggregate(const struct batman_ogm_packet
                                                        *new_batman_ogm_packet,
-                                 struct bat_priv *bat_priv,
-                                 int packet_len, unsigned long send_time,
-                                 bool directlink,
-                                 const struct hard_iface *if_incoming,
-                                 const struct forw_packet *forw_packet)
+                                    struct bat_priv *bat_priv,
+                                    int packet_len, unsigned long send_time,
+                                    bool directlink,
+                                    const struct hard_iface *if_incoming,
+                                    const struct forw_packet *forw_packet)
 {
        struct batman_ogm_packet *batman_ogm_packet;
        int aggregated_bytes = forw_packet->packet_len + packet_len;
@@ -272,7 +272,7 @@ static bool bat_ogm_can_aggregate(const struct batman_ogm_packet
                 * are flooded through the net  */
                if ((!directlink) &&
                    (!(batman_ogm_packet->flags & DIRECTLINK)) &&
-                   (batman_ogm_packet->ttl != 1) &&
+                   (batman_ogm_packet->header.ttl != 1) &&
 
                    /* own packets originating non-primary
                     * interfaces leave only that interface */
@@ -285,7 +285,7 @@ static bool bat_ogm_can_aggregate(const struct batman_ogm_packet
                /* if the incoming packet is sent via this one
                 * interface only - we still can aggregate */
                if ((directlink) &&
-                   (new_batman_ogm_packet->ttl == 1) &&
+                   (new_batman_ogm_packet->header.ttl == 1) &&
                    (forw_packet->if_incoming == if_incoming) &&
 
                    /* packets from direct neighbors or
@@ -306,11 +306,11 @@ out:
 }
 
 /* create a new aggregated packet and add this packet to it */
-static void bat_ogm_aggregate_new(const unsigned char *packet_buff,
-                                 int packet_len, unsigned long send_time,
-                                 bool direct_link,
-                                 struct hard_iface *if_incoming,
-                                 int own_packet)
+static void bat_iv_ogm_aggregate_new(const unsigned char *packet_buff,
+                                    int packet_len, unsigned long send_time,
+                                    bool direct_link,
+                                    struct hard_iface *if_incoming,
+                                    int own_packet)
 {
        struct bat_priv *bat_priv = netdev_priv(if_incoming->soft_iface);
        struct forw_packet *forw_packet_aggr;
@@ -385,9 +385,9 @@ out:
 }
 
 /* aggregate a new packet into the existing ogm packet */
-static void bat_ogm_aggregate(struct forw_packet *forw_packet_aggr,
-                             const unsigned char *packet_buff,
-                             int packet_len, bool direct_link)
+static void bat_iv_ogm_aggregate(struct forw_packet *forw_packet_aggr,
+                                const unsigned char *packet_buff,
+                                int packet_len, bool direct_link)
 {
        unsigned char *skb_buff;
 
@@ -402,10 +402,10 @@ static void bat_ogm_aggregate(struct forw_packet *forw_packet_aggr,
                        (1 << forw_packet_aggr->num_packets);
 }
 
-static void bat_ogm_queue_add(struct bat_priv *bat_priv,
-                             unsigned char *packet_buff,
-                             int packet_len, struct hard_iface *if_incoming,
-                             int own_packet, unsigned long send_time)
+static void bat_iv_ogm_queue_add(struct bat_priv *bat_priv,
+                                unsigned char *packet_buff,
+                                int packet_len, struct hard_iface *if_incoming,
+                                int own_packet, unsigned long send_time)
 {
        /**
         * _aggr -> pointer to the packet we want to aggregate with
@@ -425,11 +425,11 @@ static void bat_ogm_queue_add(struct bat_priv *bat_priv,
        if ((atomic_read(&bat_priv->aggregated_ogms)) && (!own_packet)) {
                hlist_for_each_entry(forw_packet_pos, tmp_node,
                                     &bat_priv->forw_bat_list, list) {
-                       if (bat_ogm_can_aggregate(batman_ogm_packet,
-                                                 bat_priv, packet_len,
-                                                 send_time, direct_link,
-                                                 if_incoming,
-                                                 forw_packet_pos)) {
+                       if (bat_iv_ogm_can_aggregate(batman_ogm_packet,
+                                                    bat_priv, packet_len,
+                                                    send_time, direct_link,
+                                                    if_incoming,
+                                                    forw_packet_pos)) {
                                forw_packet_aggr = forw_packet_pos;
                                break;
                        }
@@ -451,27 +451,27 @@ static void bat_ogm_queue_add(struct bat_priv *bat_priv,
                    (atomic_read(&bat_priv->aggregated_ogms)))
                        send_time += msecs_to_jiffies(MAX_AGGREGATION_MS);
 
-               bat_ogm_aggregate_new(packet_buff, packet_len,
-                                     send_time, direct_link,
-                                     if_incoming, own_packet);
+               bat_iv_ogm_aggregate_new(packet_buff, packet_len,
+                                        send_time, direct_link,
+                                        if_incoming, own_packet);
        } else {
-               bat_ogm_aggregate(forw_packet_aggr, packet_buff, packet_len,
-                                 direct_link);
+               bat_iv_ogm_aggregate(forw_packet_aggr, packet_buff,
+                                    packet_len, direct_link);
                spin_unlock_bh(&bat_priv->forw_bat_list_lock);
        }
 }
 
-static void bat_ogm_forward(struct orig_node *orig_node,
-                           const struct ethhdr *ethhdr,
-                           struct batman_ogm_packet *batman_ogm_packet,
-                           int directlink, struct hard_iface *if_incoming)
+static void bat_iv_ogm_forward(struct orig_node *orig_node,
+                              const struct ethhdr *ethhdr,
+                              struct batman_ogm_packet *batman_ogm_packet,
+                              int directlink, struct hard_iface *if_incoming)
 {
        struct bat_priv *bat_priv = netdev_priv(if_incoming->soft_iface);
        struct neigh_node *router;
        uint8_t in_tq, in_ttl, tq_avg = 0;
        uint8_t tt_num_changes;
 
-       if (batman_ogm_packet->ttl <= 1) {
+       if (batman_ogm_packet->header.ttl <= 1) {
                bat_dbg(DBG_BATMAN, bat_priv, "ttl exceeded\n");
                return;
        }
@@ -479,10 +479,10 @@ static void bat_ogm_forward(struct orig_node *orig_node,
        router = orig_node_get_router(orig_node);
 
        in_tq = batman_ogm_packet->tq;
-       in_ttl = batman_ogm_packet->ttl;
+       in_ttl = batman_ogm_packet->header.ttl;
        tt_num_changes = batman_ogm_packet->tt_num_changes;
 
-       batman_ogm_packet->ttl--;
+       batman_ogm_packet->header.ttl--;
        memcpy(batman_ogm_packet->prev_sender, ethhdr->h_source, ETH_ALEN);
 
        /* rebroadcast tq of our best ranking neighbor to ensure the rebroadcast
@@ -494,7 +494,8 @@ static void bat_ogm_forward(struct orig_node *orig_node,
                        batman_ogm_packet->tq = router->tq_avg;
 
                        if (router->last_ttl)
-                               batman_ogm_packet->ttl = router->last_ttl - 1;
+                               batman_ogm_packet->header.ttl =
+                                       router->last_ttl - 1;
                }
 
                tq_avg = router->tq_avg;
@@ -510,7 +511,7 @@ static void bat_ogm_forward(struct orig_node *orig_node,
                "Forwarding packet: tq_orig: %i, tq_avg: %i, "
                "tq_forw: %i, ttl_orig: %i, ttl_forw: %i\n",
                in_tq, tq_avg, batman_ogm_packet->tq, in_ttl - 1,
-               batman_ogm_packet->ttl);
+               batman_ogm_packet->header.ttl);
 
        batman_ogm_packet->seqno = htonl(batman_ogm_packet->seqno);
        batman_ogm_packet->tt_crc = htons(batman_ogm_packet->tt_crc);
@@ -522,12 +523,13 @@ static void bat_ogm_forward(struct orig_node *orig_node,
        else
                batman_ogm_packet->flags &= ~DIRECTLINK;
 
-       bat_ogm_queue_add(bat_priv, (unsigned char *)batman_ogm_packet,
-                         BATMAN_OGM_LEN + tt_len(tt_num_changes),
-                         if_incoming, 0, bat_ogm_fwd_send_time());
+       bat_iv_ogm_queue_add(bat_priv, (unsigned char *)batman_ogm_packet,
+                            BATMAN_OGM_LEN + tt_len(tt_num_changes),
+                            if_incoming, 0, bat_iv_ogm_fwd_send_time());
 }
 
-void bat_ogm_schedule(struct hard_iface *hard_iface, int tt_num_changes)
+static void bat_iv_ogm_schedule(struct hard_iface *hard_iface,
+                               int tt_num_changes)
 {
        struct bat_priv *bat_priv = netdev_priv(hard_iface->soft_iface);
        struct batman_ogm_packet *batman_ogm_packet;
@@ -564,21 +566,22 @@ void bat_ogm_schedule(struct hard_iface *hard_iface, int tt_num_changes)
        atomic_inc(&hard_iface->seqno);
 
        slide_own_bcast_window(hard_iface);
-       bat_ogm_queue_add(bat_priv, hard_iface->packet_buff,
-                         hard_iface->packet_len, hard_iface, 1,
-                         bat_ogm_emit_send_time(bat_priv));
+       bat_iv_ogm_queue_add(bat_priv, hard_iface->packet_buff,
+                            hard_iface->packet_len, hard_iface, 1,
+                            bat_iv_ogm_emit_send_time(bat_priv));
 
        if (primary_if)
                hardif_free_ref(primary_if);
 }
 
-static void bat_ogm_orig_update(struct bat_priv *bat_priv,
-                               struct orig_node *orig_node,
-                               const struct ethhdr *ethhdr,
-                               const struct batman_ogm_packet
+static void bat_iv_ogm_orig_update(struct bat_priv *bat_priv,
+                                  struct orig_node *orig_node,
+                                  const struct ethhdr *ethhdr,
+                                  const struct batman_ogm_packet
                                                        *batman_ogm_packet,
-                               struct hard_iface *if_incoming,
-                               const unsigned char *tt_buff, int is_duplicate)
+                                  struct hard_iface *if_incoming,
+                                  const unsigned char *tt_buff,
+                                  int is_duplicate)
 {
        struct neigh_node *neigh_node = NULL, *tmp_neigh_node = NULL;
        struct neigh_node *router = NULL;
@@ -642,8 +645,8 @@ static void bat_ogm_orig_update(struct bat_priv *bat_priv,
        spin_unlock_bh(&neigh_node->tq_lock);
 
        if (!is_duplicate) {
-               orig_node->last_ttl = batman_ogm_packet->ttl;
-               neigh_node->last_ttl = batman_ogm_packet->ttl;
+               orig_node->last_ttl = batman_ogm_packet->header.ttl;
+               neigh_node->last_ttl = batman_ogm_packet->header.ttl;
        }
 
        bonding_candidate_add(orig_node, neigh_node);
@@ -683,7 +686,7 @@ update_tt:
        /* I have to check for transtable changes only if the OGM has been
         * sent through a primary interface */
        if (((batman_ogm_packet->orig != ethhdr->h_source) &&
-            (batman_ogm_packet->ttl > 2)) ||
+            (batman_ogm_packet->header.ttl > 2)) ||
            (batman_ogm_packet->flags & PRIMARIES_FIRST_HOP))
                tt_update_orig(bat_priv, orig_node, tt_buff,
                               batman_ogm_packet->tt_num_changes,
@@ -713,10 +716,10 @@ out:
                neigh_node_free_ref(router);
 }
 
-static int bat_ogm_calc_tq(struct orig_node *orig_node,
-                          struct orig_node *orig_neigh_node,
-                          struct batman_ogm_packet *batman_ogm_packet,
-                          struct hard_iface *if_incoming)
+static int bat_iv_ogm_calc_tq(struct orig_node *orig_node,
+                             struct orig_node *orig_neigh_node,
+                             struct batman_ogm_packet *batman_ogm_packet,
+                             struct hard_iface *if_incoming)
 {
        struct bat_priv *bat_priv = netdev_priv(if_incoming->soft_iface);
        struct neigh_node *neigh_node = NULL, *tmp_neigh_node;
@@ -825,10 +828,10 @@ out:
  *  -1 the packet is old and has been received while the seqno window
  *     was protected. Caller should drop it.
  */
-static int bat_ogm_update_seqnos(const struct ethhdr *ethhdr,
-                                const struct batman_ogm_packet
+static int bat_iv_ogm_update_seqnos(const struct ethhdr *ethhdr,
+                                   const struct batman_ogm_packet
                                                        *batman_ogm_packet,
-                                const struct hard_iface *if_incoming)
+                                   const struct hard_iface *if_incoming)
 {
        struct bat_priv *bat_priv = netdev_priv(if_incoming->soft_iface);
        struct orig_node *orig_node;
@@ -890,10 +893,10 @@ out:
        return ret;
 }
 
-static void bat_ogm_process(const struct ethhdr *ethhdr,
-                           struct batman_ogm_packet *batman_ogm_packet,
-                           const unsigned char *tt_buff,
-                           struct hard_iface *if_incoming)
+static void bat_iv_ogm_process(const struct ethhdr *ethhdr,
+                              struct batman_ogm_packet *batman_ogm_packet,
+                              const unsigned char *tt_buff,
+                              struct hard_iface *if_incoming)
 {
        struct bat_priv *bat_priv = netdev_priv(if_incoming->soft_iface);
        struct hard_iface *hard_iface;
@@ -918,7 +921,7 @@ static void bat_ogm_process(const struct ethhdr *ethhdr,
         * packet in an aggregation.  Here we expect that the padding
         * is always zero (or not 0x01)
         */
-       if (batman_ogm_packet->packet_type != BAT_OGM)
+       if (batman_ogm_packet->header.packet_type != BAT_OGM)
                return;
 
        /* could be changed by schedule_own_packet() */
@@ -938,8 +941,8 @@ static void bat_ogm_process(const struct ethhdr *ethhdr,
                batman_ogm_packet->prev_sender, batman_ogm_packet->seqno,
                batman_ogm_packet->ttvn, batman_ogm_packet->tt_crc,
                batman_ogm_packet->tt_num_changes, batman_ogm_packet->tq,
-               batman_ogm_packet->ttl, batman_ogm_packet->version,
-               has_directlink_flag);
+               batman_ogm_packet->header.ttl,
+               batman_ogm_packet->header.version, has_directlink_flag);
 
        rcu_read_lock();
        list_for_each_entry_rcu(hard_iface, &hardif_list, list) {
@@ -966,10 +969,10 @@ static void bat_ogm_process(const struct ethhdr *ethhdr,
        }
        rcu_read_unlock();
 
-       if (batman_ogm_packet->version != COMPAT_VERSION) {
+       if (batman_ogm_packet->header.version != COMPAT_VERSION) {
                bat_dbg(DBG_BATMAN, bat_priv,
                        "Drop packet: incompatible batman version (%i)\n",
-                       batman_ogm_packet->version);
+                       batman_ogm_packet->header.version);
                return;
        }
 
@@ -1031,8 +1034,8 @@ static void bat_ogm_process(const struct ethhdr *ethhdr,
        if (!orig_node)
                return;
 
-       is_duplicate = bat_ogm_update_seqnos(ethhdr, batman_ogm_packet,
-                                            if_incoming);
+       is_duplicate = bat_iv_ogm_update_seqnos(ethhdr, batman_ogm_packet,
+                                               if_incoming);
 
        if (is_duplicate == -1) {
                bat_dbg(DBG_BATMAN, bat_priv,
@@ -1081,8 +1084,8 @@ static void bat_ogm_process(const struct ethhdr *ethhdr,
                goto out_neigh;
        }
 
-       is_bidirectional = bat_ogm_calc_tq(orig_node, orig_neigh_node,
-                                          batman_ogm_packet, if_incoming);
+       is_bidirectional = bat_iv_ogm_calc_tq(orig_node, orig_neigh_node,
+                                             batman_ogm_packet, if_incoming);
 
        bonding_save_primary(orig_node, orig_neigh_node, batman_ogm_packet);
 
@@ -1091,17 +1094,17 @@ static void bat_ogm_process(const struct ethhdr *ethhdr,
        if (is_bidirectional &&
            (!is_duplicate ||
             ((orig_node->last_real_seqno == batman_ogm_packet->seqno) &&
-             (orig_node->last_ttl - 3 <= batman_ogm_packet->ttl))))
-               bat_ogm_orig_update(bat_priv, orig_node, ethhdr,
-                                   batman_ogm_packet, if_incoming,
-                                   tt_buff, is_duplicate);
+             (orig_node->last_ttl - 3 <= batman_ogm_packet->header.ttl))))
+               bat_iv_ogm_orig_update(bat_priv, orig_node, ethhdr,
+                                      batman_ogm_packet, if_incoming,
+                                      tt_buff, is_duplicate);
 
        /* is single hop (direct) neighbor */
        if (is_single_hop_neigh) {
 
                /* mark direct link on incoming interface */
-               bat_ogm_forward(orig_node, ethhdr, batman_ogm_packet,
-                               1, if_incoming);
+               bat_iv_ogm_forward(orig_node, ethhdr, batman_ogm_packet,
+                                  1, if_incoming);
 
                bat_dbg(DBG_BATMAN, bat_priv, "Forwarding packet: "
                        "rebroadcast neighbor packet with direct link flag\n");
@@ -1123,7 +1126,8 @@ static void bat_ogm_process(const struct ethhdr *ethhdr,
 
        bat_dbg(DBG_BATMAN, bat_priv,
                "Forwarding packet: rebroadcast originator packet\n");
-       bat_ogm_forward(orig_node, ethhdr, batman_ogm_packet, 0, if_incoming);
+       bat_iv_ogm_forward(orig_node, ethhdr, batman_ogm_packet,
+                          0, if_incoming);
 
 out_neigh:
        if ((orig_neigh_node) && (!is_single_hop_neigh))
@@ -1139,13 +1143,17 @@ out:
        orig_node_free_ref(orig_node);
 }
 
-void bat_ogm_receive(const struct ethhdr *ethhdr, unsigned char *packet_buff,
-                    int packet_len, struct hard_iface *if_incoming)
+static void bat_iv_ogm_receive(struct hard_iface *if_incoming,
+                              struct sk_buff *skb)
 {
        struct batman_ogm_packet *batman_ogm_packet;
-       int buff_pos = 0;
-       unsigned char *tt_buff;
+       struct ethhdr *ethhdr;
+       int buff_pos = 0, packet_len;
+       unsigned char *tt_buff, *packet_buff;
 
+       packet_len = skb_headlen(skb);
+       ethhdr = (struct ethhdr *)skb_mac_header(skb);
+       packet_buff = skb->data;
        batman_ogm_packet = (struct batman_ogm_packet *)packet_buff;
 
        /* unpack the aggregated packets and process them one by one */
@@ -1157,14 +1165,29 @@ void bat_ogm_receive(const struct ethhdr *ethhdr, unsigned char *packet_buff,
 
                tt_buff = packet_buff + buff_pos + BATMAN_OGM_LEN;
 
-               bat_ogm_process(ethhdr, batman_ogm_packet,
-                               tt_buff, if_incoming);
+               bat_iv_ogm_process(ethhdr, batman_ogm_packet,
+                                  tt_buff, if_incoming);
 
                buff_pos += BATMAN_OGM_LEN +
                                tt_len(batman_ogm_packet->tt_num_changes);
 
                batman_ogm_packet = (struct batman_ogm_packet *)
                                                (packet_buff + buff_pos);
-       } while (bat_ogm_aggr_packet(buff_pos, packet_len,
-                                    batman_ogm_packet->tt_num_changes));
+       } while (bat_iv_ogm_aggr_packet(buff_pos, packet_len,
+                                       batman_ogm_packet->tt_num_changes));
+}
+
+static struct bat_algo_ops batman_iv __read_mostly = {
+       .name = "BATMAN IV",
+       .bat_ogm_init = bat_iv_ogm_init,
+       .bat_ogm_init_primary = bat_iv_ogm_init_primary,
+       .bat_ogm_update_mac = bat_iv_ogm_update_mac,
+       .bat_ogm_schedule = bat_iv_ogm_schedule,
+       .bat_ogm_emit = bat_iv_ogm_emit,
+       .bat_ogm_receive = bat_iv_ogm_receive,
+};
+
+int __init bat_iv_init(void)
+{
+       return bat_algo_register(&batman_iv);
 }
diff --git a/net/batman-adv/bat_ogm.h b/net/batman-adv/bat_ogm.h
deleted file mode 100644 (file)
index 69329c1..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Copyright (C) 2007-2011 B.A.T.M.A.N. contributors:
- *
- * Marek Lindner, Simon Wunderlich
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
- * 02110-1301, USA
- *
- */
-
-#ifndef _NET_BATMAN_ADV_OGM_H_
-#define _NET_BATMAN_ADV_OGM_H_
-
-#include "main.h"
-
-void bat_ogm_init(struct hard_iface *hard_iface);
-void bat_ogm_init_primary(struct hard_iface *hard_iface);
-void bat_ogm_update_mac(struct hard_iface *hard_iface);
-void bat_ogm_schedule(struct hard_iface *hard_iface, int tt_num_changes);
-void bat_ogm_emit(struct forw_packet *forw_packet);
-void bat_ogm_receive(const struct ethhdr *ethhdr, unsigned char *packet_buff,
-                    int packet_len, struct hard_iface *if_incoming);
-
-#endif /* _NET_BATMAN_ADV_OGM_H_ */
index c25492f..b00101d 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010-2011 B.A.T.M.A.N. contributors:
+ * Copyright (C) 2010-2012 B.A.T.M.A.N. contributors:
  *
  * Marek Lindner
  *
@@ -272,6 +272,13 @@ static ssize_t store_vis_mode(struct kobject *kobj, struct attribute *attr,
        return count;
 }
 
+static ssize_t show_bat_algo(struct kobject *kobj, struct attribute *attr,
+                           char *buff)
+{
+       struct bat_priv *bat_priv = kobj_to_batpriv(kobj);
+       return sprintf(buff, "%s\n", bat_priv->bat_algo_ops->name);
+}
+
 static void post_gw_deselect(struct net_device *net_dev)
 {
        struct bat_priv *bat_priv = netdev_priv(net_dev);
@@ -314,11 +321,11 @@ static ssize_t store_gw_mode(struct kobject *kobj, struct attribute *attr,
                gw_mode_tmp = GW_MODE_OFF;
 
        if (strncmp(buff, GW_MODE_CLIENT_NAME,
-                  strlen(GW_MODE_CLIENT_NAME)) == 0)
+                   strlen(GW_MODE_CLIENT_NAME)) == 0)
                gw_mode_tmp = GW_MODE_CLIENT;
 
        if (strncmp(buff, GW_MODE_SERVER_NAME,
-                  strlen(GW_MODE_SERVER_NAME)) == 0)
+                   strlen(GW_MODE_SERVER_NAME)) == 0)
                gw_mode_tmp = GW_MODE_SERVER;
 
        if (gw_mode_tmp < 0) {
@@ -382,6 +389,7 @@ BAT_ATTR_BOOL(bonding, S_IRUGO | S_IWUSR, NULL);
 BAT_ATTR_BOOL(fragmentation, S_IRUGO | S_IWUSR, update_min_mtu);
 BAT_ATTR_BOOL(ap_isolation, S_IRUGO | S_IWUSR, NULL);
 static BAT_ATTR(vis_mode, S_IRUGO | S_IWUSR, show_vis_mode, store_vis_mode);
+static BAT_ATTR(routing_algo, S_IRUGO, show_bat_algo, NULL);
 static BAT_ATTR(gw_mode, S_IRUGO | S_IWUSR, show_gw_mode, store_gw_mode);
 BAT_ATTR_UINT(orig_interval, S_IRUGO | S_IWUSR, 2 * JITTER, INT_MAX, NULL);
 BAT_ATTR_UINT(hop_penalty, S_IRUGO | S_IWUSR, 0, TQ_MAX_VALUE, NULL);
@@ -399,6 +407,7 @@ static struct bat_attribute *mesh_attrs[] = {
        &bat_attr_fragmentation,
        &bat_attr_ap_isolation,
        &bat_attr_vis_mode,
+       &bat_attr_routing_algo,
        &bat_attr_gw_mode,
        &bat_attr_orig_interval,
        &bat_attr_hop_penalty,
index a3f75a7..fece77a 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010-2011 B.A.T.M.A.N. contributors:
+ * Copyright (C) 2010-2012 B.A.T.M.A.N. contributors:
  *
  * Marek Lindner
  *
index 9bc63b2..6d0aa21 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2006-2011 B.A.T.M.A.N. contributors:
+ * Copyright (C) 2006-2012 B.A.T.M.A.N. contributors:
  *
  * Simon Wunderlich, Marek Lindner
  *
@@ -154,8 +154,8 @@ int bit_get_packet(void *priv, unsigned long *seq_bits,
 
        /* sequence number is much newer, probably missed a lot of packets */
 
-       if ((seq_num_diff >= TQ_LOCAL_WINDOW_SIZE)
-               && (seq_num_diff < EXPECTED_SEQNO_RANGE)) {
+       if ((seq_num_diff >= TQ_LOCAL_WINDOW_SIZE) &&
+           (seq_num_diff < EXPECTED_SEQNO_RANGE)) {
                bat_dbg(DBG_BATMAN, bat_priv,
                        "We missed a lot of packets (%i) !\n",
                        seq_num_diff - 1);
@@ -170,8 +170,8 @@ int bit_get_packet(void *priv, unsigned long *seq_bits,
         * packet should be dropped without calling this function if the
         * seqno window is protected. */
 
-       if ((seq_num_diff <= -TQ_LOCAL_WINDOW_SIZE)
-               || (seq_num_diff >= EXPECTED_SEQNO_RANGE)) {
+       if ((seq_num_diff <= -TQ_LOCAL_WINDOW_SIZE) ||
+           (seq_num_diff >= EXPECTED_SEQNO_RANGE)) {
 
                bat_dbg(DBG_BATMAN, bat_priv,
                        "Other host probably restarted!\n");
index 9c04422..c613572 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2006-2011 B.A.T.M.A.N. contributors:
+ * Copyright (C) 2006-2012 B.A.T.M.A.N. contributors:
  *
  * Simon Wunderlich, Marek Lindner
  *
index 24403a7..0fa8e2d 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2009-2011 B.A.T.M.A.N. contributors:
+ * Copyright (C) 2009-2012 B.A.T.M.A.N. contributors:
  *
  * Marek Lindner
  *
@@ -396,7 +396,7 @@ void gw_node_purge(struct bat_priv *bat_priv)
 {
        struct gw_node *gw_node, *curr_gw;
        struct hlist_node *node, *node_tmp;
-       unsigned long timeout = 2 * PURGE_TIMEOUT * HZ;
+       unsigned long timeout = msecs_to_jiffies(2 * PURGE_TIMEOUT);
        int do_deselect = 0;
 
        curr_gw = gw_get_selected_gw_node(bat_priv);
@@ -629,7 +629,7 @@ bool gw_is_dhcp_target(struct sk_buff *skb, unsigned int *header_len)
 
        /* check for bootp port */
        if ((ntohs(ethhdr->h_proto) == ETH_P_IP) &&
-            (ntohs(udphdr->dest) != 67))
+           (ntohs(udphdr->dest) != 67))
                return false;
 
        if ((ntohs(ethhdr->h_proto) == ETH_P_IPV6) &&
index e1edba0..bf56a5a 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2009-2011 B.A.T.M.A.N. contributors:
+ * Copyright (C) 2009-2012 B.A.T.M.A.N. contributors:
  *
  * Marek Lindner
  *
index c4ac7b0..3ccb9c8 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2009-2011 B.A.T.M.A.N. contributors:
+ * Copyright (C) 2009-2012 B.A.T.M.A.N. contributors:
  *
  * Marek Lindner
  *
@@ -93,7 +93,7 @@ static bool parse_gw_bandwidth(struct net_device *net_dev, char *buff,
                        multi = 1024;
 
                if ((strnicmp(tmp_ptr, "kbit", 4) == 0) ||
-                       (multi > 1))
+                   (multi > 1))
                        *tmp_ptr = '\0';
        }
 
@@ -118,7 +118,7 @@ static bool parse_gw_bandwidth(struct net_device *net_dev, char *buff,
                                multi = 1024;
 
                        if ((strnicmp(tmp_ptr, "kbit", 4) == 0) ||
-                               (multi > 1))
+                           (multi > 1))
                                *tmp_ptr = '\0';
                }
 
index 55e527a..b8fb11c 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2009-2011 B.A.T.M.A.N. contributors:
+ * Copyright (C) 2009-2012 B.A.T.M.A.N. contributors:
  *
  * Marek Lindner
  *
index 7704df4..409d027 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2007-2011 B.A.T.M.A.N. contributors:
+ * Copyright (C) 2007-2012 B.A.T.M.A.N. contributors:
  *
  * Marek Lindner, Simon Wunderlich
  *
@@ -28,7 +28,6 @@
 #include "bat_sysfs.h"
 #include "originator.h"
 #include "hash.h"
-#include "bat_ogm.h"
 
 #include <linux/if_arp.h>
 
@@ -147,7 +146,7 @@ static void primary_if_select(struct bat_priv *bat_priv,
        if (!new_hard_iface)
                return;
 
-       bat_ogm_init_primary(new_hard_iface);
+       bat_priv->bat_algo_ops->bat_ogm_init_primary(new_hard_iface);
        primary_if_update_addr(bat_priv);
 }
 
@@ -233,7 +232,7 @@ static void hardif_activate_interface(struct hard_iface *hard_iface)
 
        bat_priv = netdev_priv(hard_iface->soft_iface);
 
-       bat_ogm_update_mac(hard_iface);
+       bat_priv->bat_algo_ops->bat_ogm_update_mac(hard_iface);
        hard_iface->if_status = IF_TO_BE_ACTIVATED;
 
        /**
@@ -281,6 +280,14 @@ int hardif_enable_interface(struct hard_iface *hard_iface,
        if (!atomic_inc_not_zero(&hard_iface->refcount))
                goto out;
 
+       /* hard-interface is part of a bridge */
+       if (hard_iface->net_dev->priv_flags & IFF_BRIDGE_PORT)
+               pr_err("You are about to enable batman-adv on '%s' which "
+                      "already is part of a bridge. Unless you know exactly "
+                      "what you are doing this is probably wrong and won't "
+                      "work the way you think it would.\n",
+                      hard_iface->net_dev->name);
+
        soft_iface = dev_get_by_name(&init_net, iface_name);
 
        if (!soft_iface) {
@@ -307,7 +314,7 @@ int hardif_enable_interface(struct hard_iface *hard_iface,
        hard_iface->soft_iface = soft_iface;
        bat_priv = netdev_priv(hard_iface->soft_iface);
 
-       bat_ogm_init(hard_iface);
+       bat_priv->bat_algo_ops->bat_ogm_init(hard_iface);
 
        if (!hard_iface->packet_buff) {
                bat_err(hard_iface->soft_iface, "Can't add interface packet "
@@ -334,23 +341,23 @@ int hardif_enable_interface(struct hard_iface *hard_iface,
        if (atomic_read(&bat_priv->fragmentation) && hard_iface->net_dev->mtu <
                ETH_DATA_LEN + BAT_HEADER_LEN)
                bat_info(hard_iface->soft_iface,
-                       "The MTU of interface %s is too small (%i) to handle "
-                       "the transport of batman-adv packets. Packets going "
-                       "over this interface will be fragmented on layer2 "
-                       "which could impact the performance. Setting the MTU "
-                       "to %zi would solve the problem.\n",
-                       hard_iface->net_dev->name, hard_iface->net_dev->mtu,
-                       ETH_DATA_LEN + BAT_HEADER_LEN);
+                        "The MTU of interface %s is too small (%i) to handle "
+                        "the transport of batman-adv packets. Packets going "
+                        "over this interface will be fragmented on layer2 "
+                        "which could impact the performance. Setting the MTU "
+                        "to %zi would solve the problem.\n",
+                        hard_iface->net_dev->name, hard_iface->net_dev->mtu,
+                        ETH_DATA_LEN + BAT_HEADER_LEN);
 
        if (!atomic_read(&bat_priv->fragmentation) && hard_iface->net_dev->mtu <
                ETH_DATA_LEN + BAT_HEADER_LEN)
                bat_info(hard_iface->soft_iface,
-                       "The MTU of interface %s is too small (%i) to handle "
-                       "the transport of batman-adv packets. If you experience"
-                       " problems getting traffic through try increasing the "
-                       "MTU to %zi.\n",
-                       hard_iface->net_dev->name, hard_iface->net_dev->mtu,
-                       ETH_DATA_LEN + BAT_HEADER_LEN);
+                        "The MTU of interface %s is too small (%i) to handle "
+                        "the transport of batman-adv packets. If you "
+                        "experience problems getting traffic through try "
+                        "increasing the MTU to %zi.\n",
+                        hard_iface->net_dev->name, hard_iface->net_dev->mtu,
+                        ETH_DATA_LEN + BAT_HEADER_LEN);
 
        if (hardif_is_iface_up(hard_iface))
                hardif_activate_interface(hard_iface);
@@ -527,9 +534,10 @@ static int hard_if_event(struct notifier_block *this,
                        goto hardif_put;
 
                check_known_mac_addr(hard_iface->net_dev);
-               bat_ogm_update_mac(hard_iface);
 
                bat_priv = netdev_priv(hard_iface->soft_iface);
+               bat_priv->bat_algo_ops->bat_ogm_update_mac(hard_iface);
+
                primary_if = primary_if_get_selected(bat_priv);
                if (!primary_if)
                        goto hardif_put;
@@ -572,8 +580,8 @@ static int batman_skb_recv(struct sk_buff *skb, struct net_device *dev,
                goto err_free;
 
        /* expect a valid ethernet header here. */
-       if (unlikely(skb->mac_len != sizeof(struct ethhdr)
-                               || !skb_mac_header(skb)))
+       if (unlikely(skb->mac_len != sizeof(struct ethhdr) ||
+                    !skb_mac_header(skb)))
                goto err_free;
 
        if (!hard_iface->soft_iface)
@@ -590,17 +598,17 @@ static int batman_skb_recv(struct sk_buff *skb, struct net_device *dev,
 
        batman_ogm_packet = (struct batman_ogm_packet *)skb->data;
 
-       if (batman_ogm_packet->version != COMPAT_VERSION) {
+       if (batman_ogm_packet->header.version != COMPAT_VERSION) {
                bat_dbg(DBG_BATMAN, bat_priv,
                        "Drop packet: incompatible batman version (%i)\n",
-                       batman_ogm_packet->version);
+                       batman_ogm_packet->header.version);
                goto err_free;
        }
 
        /* all receive handlers return whether they received or reused
         * the supplied skb. if not, we have to free the skb. */
 
-       switch (batman_ogm_packet->packet_type) {
+       switch (batman_ogm_packet->header.packet_type) {
                /* batman originator packet */
        case BAT_OGM:
                ret = recv_bat_ogm_packet(skb, hard_iface);
index 67f78d1..e68c565 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2007-2011 B.A.T.M.A.N. contributors:
+ * Copyright (C) 2007-2012 B.A.T.M.A.N. contributors:
  *
  * Marek Lindner, Simon Wunderlich
  *
index d1da29d..117687b 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2006-2011 B.A.T.M.A.N. contributors:
+ * Copyright (C) 2006-2012 B.A.T.M.A.N. contributors:
  *
  * Simon Wunderlich, Marek Lindner
  *
index 4768717..d4bd786 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2006-2011 B.A.T.M.A.N. contributors:
+ * Copyright (C) 2006-2012 B.A.T.M.A.N. contributors:
  *
  * Simon Wunderlich, Marek Lindner
  *
index d9c1e7b..9b755f9 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2007-2011 B.A.T.M.A.N. contributors:
+ * Copyright (C) 2007-2012 B.A.T.M.A.N. contributors:
  *
  * Marek Lindner
  *
@@ -191,7 +191,7 @@ static ssize_t bat_socket_write(struct file *file, const char __user *buff,
                goto free_skb;
        }
 
-       if (icmp_packet->packet_type != BAT_ICMP) {
+       if (icmp_packet->header.packet_type != BAT_ICMP) {
                bat_dbg(DBG_BATMAN, bat_priv,
                        "Error - can't send packet from char device: "
                        "got bogus packet type (expected: BAT_ICMP)\n");
@@ -209,9 +209,9 @@ static ssize_t bat_socket_write(struct file *file, const char __user *buff,
 
        icmp_packet->uid = socket_client->index;
 
-       if (icmp_packet->version != COMPAT_VERSION) {
+       if (icmp_packet->header.version != COMPAT_VERSION) {
                icmp_packet->msg_type = PARAMETER_PROBLEM;
-               icmp_packet->version = COMPAT_VERSION;
+               icmp_packet->header.version = COMPAT_VERSION;
                bat_socket_add_packet(socket_client, icmp_packet, packet_len);
                goto free_skb;
        }
index 462b190..380ed4c 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2007-2011 B.A.T.M.A.N. contributors:
+ * Copyright (C) 2007-2012 B.A.T.M.A.N. contributors:
  *
  * Marek Lindner
  *
index fb87bdc..08f3b3a 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2007-2011 B.A.T.M.A.N. contributors:
+ * Copyright (C) 2007-2012 B.A.T.M.A.N. contributors:
  *
  * Marek Lindner, Simon Wunderlich
  *
 #include "gateway_client.h"
 #include "vis.h"
 #include "hash.h"
+#include "bat_algo.h"
 
 
 /* List manipulations on hardif_list have to be rtnl_lock()'ed,
  * list traversals just rcu-locked */
 struct list_head hardif_list;
+char bat_routing_algo[20] = "BATMAN IV";
+static struct hlist_head bat_algo_list;
 
 unsigned char broadcast_addr[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
 
@@ -45,6 +48,9 @@ struct workqueue_struct *bat_event_workqueue;
 static int __init batman_init(void)
 {
        INIT_LIST_HEAD(&hardif_list);
+       INIT_HLIST_HEAD(&bat_algo_list);
+
+       bat_iv_init();
 
        /* the name should not be longer than 10 chars - see
         * http://lwn.net/Articles/23634/ */
@@ -170,9 +176,110 @@ int is_my_mac(const uint8_t *addr)
        }
        rcu_read_unlock();
        return 0;
+}
+
+static struct bat_algo_ops *bat_algo_get(char *name)
+{
+       struct bat_algo_ops *bat_algo_ops = NULL, *bat_algo_ops_tmp;
+       struct hlist_node *node;
+
+       hlist_for_each_entry(bat_algo_ops_tmp, node, &bat_algo_list, list) {
+               if (strcmp(bat_algo_ops_tmp->name, name) != 0)
+                       continue;
+
+               bat_algo_ops = bat_algo_ops_tmp;
+               break;
+       }
+
+       return bat_algo_ops;
+}
+
+int bat_algo_register(struct bat_algo_ops *bat_algo_ops)
+{
+       struct bat_algo_ops *bat_algo_ops_tmp;
+       int ret = -1;
+
+       bat_algo_ops_tmp = bat_algo_get(bat_algo_ops->name);
+       if (bat_algo_ops_tmp) {
+               pr_info("Trying to register already registered routing "
+                       "algorithm: %s\n", bat_algo_ops->name);
+               goto out;
+       }
+
+       /* all algorithms must implement all ops (for now) */
+       if (!bat_algo_ops->bat_ogm_init ||
+           !bat_algo_ops->bat_ogm_init_primary ||
+           !bat_algo_ops->bat_ogm_update_mac ||
+           !bat_algo_ops->bat_ogm_schedule ||
+           !bat_algo_ops->bat_ogm_emit ||
+           !bat_algo_ops->bat_ogm_receive) {
+               pr_info("Routing algo '%s' does not implement required ops\n",
+                       bat_algo_ops->name);
+               goto out;
+       }
+
+       INIT_HLIST_NODE(&bat_algo_ops->list);
+       hlist_add_head(&bat_algo_ops->list, &bat_algo_list);
+       ret = 0;
+
+out:
+       return ret;
+}
+
+int bat_algo_select(struct bat_priv *bat_priv, char *name)
+{
+       struct bat_algo_ops *bat_algo_ops;
+       int ret = -1;
+
+       bat_algo_ops = bat_algo_get(name);
+       if (!bat_algo_ops)
+               goto out;
+
+       bat_priv->bat_algo_ops = bat_algo_ops;
+       ret = 0;
+
+out:
+       return ret;
+}
+
+int bat_algo_seq_print_text(struct seq_file *seq, void *offset)
+{
+       struct bat_algo_ops *bat_algo_ops;
+       struct hlist_node *node;
+
+       seq_printf(seq, "Available routing algorithms:\n");
+
+       hlist_for_each_entry(bat_algo_ops, node, &bat_algo_list, list) {
+               seq_printf(seq, "%s\n", bat_algo_ops->name);
+       }
+
+       return 0;
+}
+
+static int param_set_ra(const char *val, const struct kernel_param *kp)
+{
+       struct bat_algo_ops *bat_algo_ops;
 
+       bat_algo_ops = bat_algo_get((char *)val);
+       if (!bat_algo_ops) {
+               pr_err("Routing algorithm '%s' is not supported\n", val);
+               return -EINVAL;
+       }
+
+       return param_set_copystring(val, kp);
 }
 
+static const struct kernel_param_ops param_ops_ra = {
+       .set = param_set_ra,
+       .get = param_get_string,
+};
+
+static struct kparam_string __param_string_ra = {
+       .maxlen = sizeof(bat_routing_algo),
+       .string = bat_routing_algo,
+};
+
+module_param_cb(routing_algo, &param_ops_ra, &__param_string_ra, 0644);
 module_init(batman_init);
 module_exit(batman_exit);
 
index 86354e0..1468788 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2007-2011 B.A.T.M.A.N. contributors:
+ * Copyright (C) 2007-2012 B.A.T.M.A.N. contributors:
  *
  * Marek Lindner, Simon Wunderlich
  *
@@ -28,7 +28,7 @@
 #define DRIVER_DEVICE "batman-adv"
 
 #ifndef SOURCE_VERSION
-#define SOURCE_VERSION "2012.0.0"
+#define SOURCE_VERSION "2012.1.0"
 #endif
 
 /* B.A.T.M.A.N. parameters */
 
 /* purge originators after time in seconds if no valid packet comes in
  * -> TODO: check influence on TQ_LOCAL_WINDOW_SIZE */
-#define PURGE_TIMEOUT 200
-#define TT_LOCAL_TIMEOUT 3600 /* in seconds */
-#define TT_CLIENT_ROAM_TIMEOUT 600
+#define PURGE_TIMEOUT 200000 /* 200 seconds */
+#define TT_LOCAL_TIMEOUT 3600000 /* in miliseconds */
+#define TT_CLIENT_ROAM_TIMEOUT 600000 /* in miliseconds */
 /* sliding packet range of received originator messages in sequence numbers
  * (should be a multiple of our word size) */
 #define TQ_LOCAL_WINDOW_SIZE 64
-#define TT_REQUEST_TIMEOUT 3 /* seconds we have to keep pending tt_req */
+#define TT_REQUEST_TIMEOUT 3000 /* miliseconds we have to keep
+                                * pending tt_req */
 
 #define TQ_GLOBAL_WINDOW_SIZE 5
 #define TQ_LOCAL_BIDRECT_SEND_MINIMUM 1
@@ -56,8 +57,8 @@
 
 #define TT_OGM_APPEND_MAX 3 /* number of OGMs sent with the last tt diff */
 
-#define ROAMING_MAX_TIME 20 /* Time in which a client can roam at most
-                            * ROAMING_MAX_COUNT times */
+#define ROAMING_MAX_TIME 20000 /* Time in which a client can roam at most
+                               * ROAMING_MAX_COUNT times in miliseconds*/
 #define ROAMING_MAX_COUNT 5
 
 #define NO_FLAGS 0
@@ -147,6 +148,7 @@ enum dbg_level {
 #include <linux/seq_file.h>
 #include "types.h"
 
+extern char bat_routing_algo[];
 extern struct list_head hardif_list;
 
 extern unsigned char broadcast_addr[];
@@ -157,6 +159,9 @@ void mesh_free(struct net_device *soft_iface);
 void inc_module_count(void);
 void dec_module_count(void);
 int is_my_mac(const uint8_t *addr);
+int bat_algo_register(struct bat_algo_ops *bat_algo_ops);
+int bat_algo_select(struct bat_priv *bat_priv, char *name);
+int bat_algo_seq_print_text(struct seq_file *seq, void *offset);
 
 #ifdef CONFIG_BATMAN_ADV_DEBUG
 int debug_log(struct bat_priv *bat_priv, const char *fmt, ...) __printf(2, 3);
@@ -202,6 +207,17 @@ static inline int compare_eth(const void *data1, const void *data2)
        return (memcmp(data1, data2, ETH_ALEN) == 0 ? 1 : 0);
 }
 
+/**
+ * has_timed_out - compares current time (jiffies) and timestamp + timeout
+ * @timestamp:         base value to compare with (in jiffies)
+ * @timeout:           added to base value before comparing (in milliseconds)
+ *
+ * Returns true if current time is after timestamp + timeout
+ */
+static inline bool has_timed_out(unsigned long timestamp, unsigned int timeout)
+{
+       return time_is_before_jiffies(timestamp + msecs_to_jiffies(timeout));
+}
 
 #define atomic_dec_not_zero(v) atomic_add_unless((v), -1, 0)
 
index 0bc2045..371cc93 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2009-2011 B.A.T.M.A.N. contributors:
+ * Copyright (C) 2009-2012 B.A.T.M.A.N. contributors:
  *
  * Marek Lindner, Simon Wunderlich
  *
@@ -143,7 +143,7 @@ static void orig_node_free_rcu(struct rcu_head *rcu)
 
        frag_list_free(&orig_node->frag_list);
        tt_global_del_orig(orig_node->bat_priv, orig_node,
-                           "originator timed out");
+                          "originator timed out");
 
        kfree(orig_node->tt_buff);
        kfree(orig_node->bcast_own);
@@ -219,6 +219,7 @@ struct orig_node *get_orig_node(struct bat_priv *bat_priv, const uint8_t *addr)
        /* extra reference for return */
        atomic_set(&orig_node->refcount, 2);
 
+       orig_node->tt_initialised = false;
        orig_node->tt_poss_change = false;
        orig_node->bat_priv = bat_priv;
        memcpy(orig_node->orig, addr, ETH_ALEN);
@@ -281,8 +282,7 @@ static bool purge_orig_neighbors(struct bat_priv *bat_priv,
        hlist_for_each_entry_safe(neigh_node, node, node_tmp,
                                  &orig_node->neigh_list, list) {
 
-               if ((time_after(jiffies,
-                       neigh_node->last_valid + PURGE_TIMEOUT * HZ)) ||
+               if ((has_timed_out(neigh_node->last_valid, PURGE_TIMEOUT)) ||
                    (neigh_node->if_incoming->if_status == IF_INACTIVE) ||
                    (neigh_node->if_incoming->if_status == IF_NOT_IN_USE) ||
                    (neigh_node->if_incoming->if_status == IF_TO_BE_REMOVED)) {
@@ -326,18 +326,15 @@ static bool purge_orig_node(struct bat_priv *bat_priv,
 {
        struct neigh_node *best_neigh_node;
 
-       if (time_after(jiffies,
-               orig_node->last_valid + 2 * PURGE_TIMEOUT * HZ)) {
-
+       if (has_timed_out(orig_node->last_valid, 2 * PURGE_TIMEOUT)) {
                bat_dbg(DBG_BATMAN, bat_priv,
                        "Originator timeout: originator %pM, last_valid %lu\n",
                        orig_node->orig, (orig_node->last_valid / HZ));
                return true;
        } else {
                if (purge_orig_neighbors(bat_priv, orig_node,
-                                                       &best_neigh_node)) {
+                                        &best_neigh_node))
                        update_route(bat_priv, orig_node, best_neigh_node);
-               }
        }
 
        return false;
@@ -371,8 +368,8 @@ static void _purge_orig(struct bat_priv *bat_priv)
                                continue;
                        }
 
-                       if (time_after(jiffies, orig_node->last_frag_packet +
-                                               msecs_to_jiffies(FRAG_TIMEOUT)))
+                       if (has_timed_out(orig_node->last_frag_packet,
+                                         FRAG_TIMEOUT))
                                frag_list_free(&orig_node->frag_list);
                }
                spin_unlock_bh(list_lock);
index 67765ff..3fe2eda 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2007-2011 B.A.T.M.A.N. contributors:
+ * Copyright (C) 2007-2012 B.A.T.M.A.N. contributors:
  *
  * Marek Lindner, Simon Wunderlich
  *
index 4d9e54c..441f3db 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2007-2011 B.A.T.M.A.N. contributors:
+ * Copyright (C) 2007-2012 B.A.T.M.A.N. contributors:
  *
  * Marek Lindner, Simon Wunderlich
  *
@@ -90,10 +90,14 @@ enum tt_client_flags {
        TT_CLIENT_PENDING = 1 << 10
 };
 
-struct batman_ogm_packet {
+struct batman_header {
        uint8_t  packet_type;
        uint8_t  version;  /* batman version field */
        uint8_t  ttl;
+} __packed;
+
+struct batman_ogm_packet {
+       struct batman_header header;
        uint8_t  flags;    /* 0x40: DIRECTLINK flag, 0x20 VIS_SERVER flag... */
        uint32_t seqno;
        uint8_t  orig[6];
@@ -108,9 +112,7 @@ struct batman_ogm_packet {
 #define BATMAN_OGM_LEN sizeof(struct batman_ogm_packet)
 
 struct icmp_packet {
-       uint8_t  packet_type;
-       uint8_t  version;  /* batman version field */
-       uint8_t  ttl;
+       struct batman_header header;
        uint8_t  msg_type; /* see ICMP message types above */
        uint8_t  dst[6];
        uint8_t  orig[6];
@@ -124,9 +126,7 @@ struct icmp_packet {
 /* icmp_packet_rr must start with all fields from imcp_packet
  * as this is assumed by code that handles ICMP packets */
 struct icmp_packet_rr {
-       uint8_t  packet_type;
-       uint8_t  version;  /* batman version field */
-       uint8_t  ttl;
+       struct batman_header header;
        uint8_t  msg_type; /* see ICMP message types above */
        uint8_t  dst[6];
        uint8_t  orig[6];
@@ -137,17 +137,13 @@ struct icmp_packet_rr {
 } __packed;
 
 struct unicast_packet {
-       uint8_t  packet_type;
-       uint8_t  version;  /* batman version field */
-       uint8_t  ttl;
+       struct batman_header header;
        uint8_t  ttvn; /* destination translation table version number */
        uint8_t  dest[6];
 } __packed;
 
 struct unicast_frag_packet {
-       uint8_t  packet_type;
-       uint8_t  version;  /* batman version field */
-       uint8_t  ttl;
+       struct batman_header header;
        uint8_t  ttvn; /* destination translation table version number */
        uint8_t  dest[6];
        uint8_t  flags;
@@ -157,18 +153,14 @@ struct unicast_frag_packet {
 } __packed;
 
 struct bcast_packet {
-       uint8_t  packet_type;
-       uint8_t  version;  /* batman version field */
-       uint8_t  ttl;
+       struct batman_header header;
        uint8_t  reserved;
        uint32_t seqno;
        uint8_t  orig[6];
 } __packed;
 
 struct vis_packet {
-       uint8_t  packet_type;
-       uint8_t  version;        /* batman version field */
-       uint8_t  ttl;            /* TTL */
+       struct batman_header header;
        uint8_t  vis_type;       /* which type of vis-participant sent this? */
        uint32_t seqno;          /* sequence number */
        uint8_t  entries;        /* number of entries behind this struct */
@@ -179,9 +171,7 @@ struct vis_packet {
 } __packed;
 
 struct tt_query_packet {
-       uint8_t  packet_type;
-       uint8_t  version;  /* batman version field */
-       uint8_t  ttl;
+       struct batman_header header;
        /* the flag field is a combination of:
         * - TT_REQUEST or TT_RESPONSE
         * - TT_FULL_TABLE */
@@ -202,9 +192,7 @@ struct tt_query_packet {
 } __packed;
 
 struct roam_adv_packet {
-       uint8_t  packet_type;
-       uint8_t  version;
-       uint8_t  ttl;
+       struct batman_header header;
        uint8_t  reserved;
        uint8_t  dst[ETH_ALEN];
        uint8_t  src[ETH_ALEN];
index f1ccfa7..fd63951 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2007-2011 B.A.T.M.A.N. contributors:
+ * Copyright (C) 2007-2012 B.A.T.M.A.N. contributors:
  *
  * Marek Lindner
  *
index 7cdfe62..8b58bd8 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2007-2011 B.A.T.M.A.N. contributors:
+ * Copyright (C) 2007-2012 B.A.T.M.A.N. contributors:
  *
  * Marek Lindner
  *
index 773e606..f535155 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2007-2011 B.A.T.M.A.N. contributors:
+ * Copyright (C) 2007-2012 B.A.T.M.A.N. contributors:
  *
  * Marek Lindner, Simon Wunderlich
  *
@@ -29,7 +29,6 @@
 #include "originator.h"
 #include "vis.h"
 #include "unicast.h"
-#include "bat_ogm.h"
 
 void slide_own_bcast_window(struct hard_iface *hard_iface)
 {
@@ -73,7 +72,7 @@ static void _update_route(struct bat_priv *bat_priv,
                bat_dbg(DBG_ROUTES, bat_priv, "Deleting route towards: %pM\n",
                        orig_node->orig);
                tt_global_del_orig(bat_priv, orig_node,
-                                   "Deleted route towards originator");
+                                  "Deleted route towards originator");
 
        /* route added */
        } else if ((!curr_router) && (neigh_node)) {
@@ -230,10 +229,9 @@ void bonding_save_primary(const struct orig_node *orig_node,
 int window_protected(struct bat_priv *bat_priv, int32_t seq_num_diff,
                     unsigned long *last_reset)
 {
-       if ((seq_num_diff <= -TQ_LOCAL_WINDOW_SIZE)
-               || (seq_num_diff >= EXPECTED_SEQNO_RANGE)) {
-               if (time_after(jiffies, *last_reset +
-                       msecs_to_jiffies(RESET_PROTECTION_MS))) {
+       if ((seq_num_diff <= -TQ_LOCAL_WINDOW_SIZE) ||
+           (seq_num_diff >= EXPECTED_SEQNO_RANGE)) {
+               if (has_timed_out(*last_reset, RESET_PROTECTION_MS)) {
 
                        *last_reset = jiffies;
                        bat_dbg(DBG_BATMAN, bat_priv,
@@ -248,6 +246,7 @@ int window_protected(struct bat_priv *bat_priv, int32_t seq_num_diff,
 
 int recv_bat_ogm_packet(struct sk_buff *skb, struct hard_iface *hard_iface)
 {
+       struct bat_priv *bat_priv = netdev_priv(hard_iface->soft_iface);
        struct ethhdr *ethhdr;
 
        /* drop packet if it has not necessary minimum size */
@@ -272,9 +271,7 @@ int recv_bat_ogm_packet(struct sk_buff *skb, struct hard_iface *hard_iface)
        if (skb_linearize(skb) < 0)
                return NET_RX_DROP;
 
-       ethhdr = (struct ethhdr *)skb_mac_header(skb);
-
-       bat_ogm_receive(ethhdr, skb->data, skb_headlen(skb), hard_iface);
+       bat_priv->bat_algo_ops->bat_ogm_receive(hard_iface, skb);
 
        kfree_skb(skb);
        return NET_RX_SUCCESS;
@@ -320,7 +317,7 @@ static int recv_my_icmp_packet(struct bat_priv *bat_priv,
        memcpy(icmp_packet->dst, icmp_packet->orig, ETH_ALEN);
        memcpy(icmp_packet->orig, primary_if->net_dev->dev_addr, ETH_ALEN);
        icmp_packet->msg_type = ECHO_REPLY;
-       icmp_packet->ttl = TTL;
+       icmp_packet->header.ttl = TTL;
 
        send_skb_packet(skb, router->if_incoming, router->addr);
        ret = NET_RX_SUCCESS;
@@ -376,7 +373,7 @@ static int recv_icmp_ttl_exceeded(struct bat_priv *bat_priv,
        memcpy(icmp_packet->dst, icmp_packet->orig, ETH_ALEN);
        memcpy(icmp_packet->orig, primary_if->net_dev->dev_addr, ETH_ALEN);
        icmp_packet->msg_type = TTL_EXCEEDED;
-       icmp_packet->ttl = TTL;
+       icmp_packet->header.ttl = TTL;
 
        send_skb_packet(skb, router->if_incoming, router->addr);
        ret = NET_RX_SUCCESS;
@@ -432,7 +429,7 @@ int recv_icmp_packet(struct sk_buff *skb, struct hard_iface *recv_if)
        if ((hdr_size == sizeof(struct icmp_packet_rr)) &&
            (icmp_packet->rr_cur < BAT_RR_LEN)) {
                memcpy(&(icmp_packet->rr[icmp_packet->rr_cur]),
-                       ethhdr->h_dest, ETH_ALEN);
+                      ethhdr->h_dest, ETH_ALEN);
                icmp_packet->rr_cur++;
        }
 
@@ -441,7 +438,7 @@ int recv_icmp_packet(struct sk_buff *skb, struct hard_iface *recv_if)
                return recv_my_icmp_packet(bat_priv, skb, hdr_size);
 
        /* TTL exceeded */
-       if (icmp_packet->ttl < 2)
+       if (icmp_packet->header.ttl < 2)
                return recv_icmp_ttl_exceeded(bat_priv, skb);
 
        /* get routing information */
@@ -460,7 +457,7 @@ int recv_icmp_packet(struct sk_buff *skb, struct hard_iface *recv_if)
        icmp_packet = (struct icmp_packet_rr *)skb->data;
 
        /* decrement ttl */
-       icmp_packet->ttl--;
+       icmp_packet->header.ttl--;
 
        /* route it */
        send_skb_packet(skb, router->if_incoming, router->addr);
@@ -815,7 +812,7 @@ int route_unicast_packet(struct sk_buff *skb, struct hard_iface *recv_if)
        unicast_packet = (struct unicast_packet *)skb->data;
 
        /* TTL exceeded */
-       if (unicast_packet->ttl < 2) {
+       if (unicast_packet->header.ttl < 2) {
                pr_debug("Warning - can't forward unicast packet from %pM to "
                         "%pM: ttl exceeded\n", ethhdr->h_source,
                         unicast_packet->dest);
@@ -840,7 +837,7 @@ int route_unicast_packet(struct sk_buff *skb, struct hard_iface *recv_if)
 
        unicast_packet = (struct unicast_packet *)skb->data;
 
-       if (unicast_packet->packet_type == BAT_UNICAST &&
+       if (unicast_packet->header.packet_type == BAT_UNICAST &&
            atomic_read(&bat_priv->fragmentation) &&
            skb->len > neigh_node->if_incoming->net_dev->mtu) {
                ret = frag_send_skb(skb, bat_priv,
@@ -848,7 +845,7 @@ int route_unicast_packet(struct sk_buff *skb, struct hard_iface *recv_if)
                goto out;
        }
 
-       if (unicast_packet->packet_type == BAT_UNICAST_FRAG &&
+       if (unicast_packet->header.packet_type == BAT_UNICAST_FRAG &&
            frag_can_reassemble(skb, neigh_node->if_incoming->net_dev->mtu)) {
 
                ret = frag_reassemble_skb(skb, bat_priv, &new_skb);
@@ -867,7 +864,7 @@ int route_unicast_packet(struct sk_buff *skb, struct hard_iface *recv_if)
        }
 
        /* decrement ttl */
-       unicast_packet->ttl--;
+       unicast_packet->header.ttl--;
 
        /* route it */
        send_skb_packet(skb, neigh_node->if_incoming, neigh_node->addr);
@@ -1041,7 +1038,7 @@ int recv_bcast_packet(struct sk_buff *skb, struct hard_iface *recv_if)
        if (is_my_mac(bcast_packet->orig))
                goto out;
 
-       if (bcast_packet->ttl < 2)
+       if (bcast_packet->header.ttl < 2)
                goto out;
 
        orig_node = orig_hash_find(bat_priv, bcast_packet->orig);
index 7aaee0f..92ac100 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2007-2011 B.A.T.M.A.N. contributors:
+ * Copyright (C) 2007-2012 B.A.T.M.A.N. contributors:
  *
  * Marek Lindner, Simon Wunderlich
  *
index 8a684eb..4137580 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2007-2011 B.A.T.M.A.N. contributors:
+ * Copyright (C) 2007-2012 B.A.T.M.A.N. contributors:
  *
  * Marek Lindner, Simon Wunderlich
  *
@@ -28,7 +28,6 @@
 #include "vis.h"
 #include "gateway_common.h"
 #include "originator.h"
-#include "bat_ogm.h"
 
 static void send_outstanding_bcast_packet(struct work_struct *work);
 
@@ -168,7 +167,7 @@ void schedule_bat_ogm(struct hard_iface *hard_iface)
        if (primary_if)
                hardif_free_ref(primary_if);
 
-       bat_ogm_schedule(hard_iface, tt_num_changes);
+       bat_priv->bat_algo_ops->bat_ogm_schedule(hard_iface, tt_num_changes);
 }
 
 static void forw_packet_free(struct forw_packet *forw_packet)
@@ -234,7 +233,7 @@ int add_bcast_packet_to_list(struct bat_priv *bat_priv,
 
        /* as we have a copy now, it is safe to decrease the TTL */
        bcast_packet = (struct bcast_packet *)newskb->data;
-       bcast_packet->ttl--;
+       bcast_packet->header.ttl--;
 
        skb_reset_mac_header(newskb);
 
@@ -318,7 +317,7 @@ void send_outstanding_bat_ogm_packet(struct work_struct *work)
        if (atomic_read(&bat_priv->mesh_state) == MESH_DEACTIVATING)
                goto out;
 
-       bat_ogm_emit(forw_packet);
+       bat_priv->bat_algo_ops->bat_ogm_emit(forw_packet);
 
        /**
         * we have to have at least one packet in the queue
index c8ca3ef..824ef06 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2007-2011 B.A.T.M.A.N. contributors:
+ * Copyright (C) 2007-2012 B.A.T.M.A.N. contributors:
  *
  * Marek Lindner, Simon Wunderlich
  *
index 987c75a..8fb16d2 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2007-2011 B.A.T.M.A.N. contributors:
+ * Copyright (C) 2007-2012 B.A.T.M.A.N. contributors:
  *
  * Marek Lindner, Simon Wunderlich
  *
@@ -396,8 +396,8 @@ void softif_neigh_purge(struct bat_priv *bat_priv)
                hlist_for_each_entry_safe(softif_neigh, node_tmp, node_tmp2,
                                          &softif_neigh_vid->softif_neigh_list,
                                          list) {
-                       if ((!time_after(jiffies, softif_neigh->last_seen +
-                               msecs_to_jiffies(SOFTIF_NEIGH_TIMEOUT))) &&
+                       if ((!has_timed_out(softif_neigh->last_seen,
+                                           SOFTIF_NEIGH_TIMEOUT)) &&
                            (atomic_read(&bat_priv->mesh_state) == MESH_ACTIVE))
                                continue;
 
@@ -457,10 +457,10 @@ static void softif_batman_recv(struct sk_buff *skb, struct net_device *dev,
                batman_ogm_packet = (struct batman_ogm_packet *)
                                                        (skb->data + ETH_HLEN);
 
-       if (batman_ogm_packet->version != COMPAT_VERSION)
+       if (batman_ogm_packet->header.version != COMPAT_VERSION)
                goto out;
 
-       if (batman_ogm_packet->packet_type != BAT_OGM)
+       if (batman_ogm_packet->header.packet_type != BAT_OGM)
                goto out;
 
        if (!(batman_ogm_packet->flags & PRIMARIES_FIRST_HOP))
@@ -541,6 +541,7 @@ static int interface_set_mac_addr(struct net_device *dev, void *p)
        }
 
        memcpy(dev->dev_addr, addr->sa_data, ETH_ALEN);
+       dev->addr_assign_type &= ~NET_ADDR_RANDOM;
        return 0;
 }
 
@@ -632,11 +633,11 @@ static int interface_tx(struct sk_buff *skb, struct net_device *soft_iface)
                        goto dropped;
 
                bcast_packet = (struct bcast_packet *)skb->data;
-               bcast_packet->version = COMPAT_VERSION;
-               bcast_packet->ttl = TTL;
+               bcast_packet->header.version = COMPAT_VERSION;
+               bcast_packet->header.ttl = TTL;
 
                /* batman packet type: broadcast */
-               bcast_packet->packet_type = BAT_BCAST;
+               bcast_packet->header.packet_type = BAT_BCAST;
 
                /* hw address of first interface is the orig mac because only
                 * this mac is known throughout the mesh */
@@ -725,8 +726,8 @@ void interface_rx(struct net_device *soft_iface,
                skb_push(skb, hdr_size);
                unicast_packet = (struct unicast_packet *)skb->data;
 
-               if ((unicast_packet->packet_type != BAT_UNICAST) &&
-                   (unicast_packet->packet_type != BAT_UNICAST_FRAG))
+               if ((unicast_packet->header.packet_type != BAT_UNICAST) &&
+                   (unicast_packet->header.packet_type != BAT_UNICAST_FRAG))
                        goto dropped;
 
                skb_reset_mac_header(skb);
@@ -783,7 +784,6 @@ static const struct net_device_ops bat_netdev_ops = {
 static void interface_setup(struct net_device *dev)
 {
        struct bat_priv *priv = netdev_priv(dev);
-       char dev_addr[ETH_ALEN];
 
        ether_setup(dev);
 
@@ -800,8 +800,7 @@ static void interface_setup(struct net_device *dev)
        dev->hard_header_len = BAT_HEADER_LEN;
 
        /* generate random address */
-       random_ether_addr(dev_addr);
-       memcpy(dev->dev_addr, dev_addr, ETH_ALEN);
+       eth_hw_addr_random(dev);
 
        SET_ETHTOOL_OPS(dev, &bat_ethtool_ops);
 
@@ -855,6 +854,10 @@ struct net_device *softif_create(const char *name)
        bat_priv->primary_if = NULL;
        bat_priv->num_ifaces = 0;
 
+       ret = bat_algo_select(bat_priv, bat_routing_algo);
+       if (ret < 0)
+               goto unreg_soft_iface;
+
        ret = sysfs_add_meshif(soft_iface);
        if (ret < 0)
                goto unreg_soft_iface;
index 001546f..756eab5 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2007-2011 B.A.T.M.A.N. contributors:
+ * Copyright (C) 2007-2012 B.A.T.M.A.N. contributors:
  *
  * Marek Lindner
  *
index ab8dea8..c950705 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2007-2011 B.A.T.M.A.N. contributors:
+ * Copyright (C) 2007-2012 B.A.T.M.A.N. contributors:
  *
  * Marek Lindner, Simon Wunderlich
  *
@@ -108,14 +108,6 @@ static struct tt_global_entry *tt_global_hash_find(struct bat_priv *bat_priv,
 
 }
 
-static bool is_out_of_time(unsigned long starting_time, unsigned long timeout)
-{
-       unsigned long deadline;
-       deadline = starting_time + msecs_to_jiffies(timeout);
-
-       return time_after(jiffies, deadline);
-}
-
 static void tt_local_entry_free_ref(struct tt_local_entry *tt_local_entry)
 {
        if (atomic_dec_and_test(&tt_local_entry->common.refcount))
@@ -218,6 +210,11 @@ void tt_local_add(struct net_device *soft_iface, const uint8_t *addr,
        if (compare_eth(addr, soft_iface->dev_addr))
                tt_local_entry->common.flags |= TT_CLIENT_NOPURGE;
 
+       /* The local entry has to be marked as NEW to avoid to send it in
+        * a full table response going out before the next ttvn increment
+        * (consistency check) */
+       tt_local_entry->common.flags |= TT_CLIENT_NEW;
+
        hash_added = hash_add(bat_priv->tt_local_hash, compare_tt, choose_orig,
                         &tt_local_entry->common,
                         &tt_local_entry->common.hash_entry);
@@ -230,11 +227,6 @@ void tt_local_add(struct net_device *soft_iface, const uint8_t *addr,
 
        tt_local_event(bat_priv, addr, tt_local_entry->common.flags);
 
-       /* The local entry has to be marked as NEW to avoid to send it in
-        * a full table response going out before the next ttvn increment
-        * (consistency check) */
-       tt_local_entry->common.flags |= TT_CLIENT_NEW;
-
        /* remove address from global hash if present */
        tt_global_entry = tt_global_hash_find(bat_priv, addr);
 
@@ -269,7 +261,7 @@ int tt_changes_fill_buffer(struct bat_priv *bat_priv,
        atomic_set(&bat_priv->tt_local_changes, 0);
 
        list_for_each_entry_safe(entry, safe, &bat_priv->tt_changes_list,
-                       list) {
+                                list) {
                if (count < tot_changes) {
                        memcpy(buff + tt_len(count),
                               &entry->change, sizeof(struct tt_change));
@@ -341,17 +333,17 @@ int tt_local_seq_print_text(struct seq_file *seq, void *offset)
                hlist_for_each_entry_rcu(tt_common_entry, node,
                                         head, hash_entry) {
                        seq_printf(seq, " * %pM [%c%c%c%c%c]\n",
-                                       tt_common_entry->addr,
-                                       (tt_common_entry->flags &
-                                        TT_CLIENT_ROAM ? 'R' : '.'),
-                                       (tt_common_entry->flags &
-                                        TT_CLIENT_NOPURGE ? 'P' : '.'),
-                                       (tt_common_entry->flags &
-                                        TT_CLIENT_NEW ? 'N' : '.'),
-                                       (tt_common_entry->flags &
-                                        TT_CLIENT_PENDING ? 'X' : '.'),
-                                       (tt_common_entry->flags &
-                                        TT_CLIENT_WIFI ? 'W' : '.'));
+                                  tt_common_entry->addr,
+                                  (tt_common_entry->flags &
+                                   TT_CLIENT_ROAM ? 'R' : '.'),
+                                  (tt_common_entry->flags &
+                                   TT_CLIENT_NOPURGE ? 'P' : '.'),
+                                  (tt_common_entry->flags &
+                                   TT_CLIENT_NEW ? 'N' : '.'),
+                                  (tt_common_entry->flags &
+                                   TT_CLIENT_PENDING ? 'X' : '.'),
+                                  (tt_common_entry->flags &
+                                   TT_CLIENT_WIFI ? 'W' : '.'));
                }
                rcu_read_unlock();
        }
@@ -363,7 +355,7 @@ out:
 
 static void tt_local_set_pending(struct bat_priv *bat_priv,
                                 struct tt_local_entry *tt_local_entry,
-                                uint16_t flags)
+                                uint16_t flags, const char *message)
 {
        tt_local_event(bat_priv, tt_local_entry->common.addr,
                       tt_local_entry->common.flags | flags);
@@ -372,6 +364,9 @@ static void tt_local_set_pending(struct bat_priv *bat_priv,
         * to be kept in the table in order to send it in a full table
         * response issued before the net ttvn increment (consistency check) */
        tt_local_entry->common.flags |= TT_CLIENT_PENDING;
+
+       bat_dbg(DBG_TT, bat_priv, "Local tt entry (%pM) pending to be removed: "
+               "%s\n", tt_local_entry->common.addr, message);
 }
 
 void tt_local_remove(struct bat_priv *bat_priv, const uint8_t *addr,
@@ -384,10 +379,7 @@ void tt_local_remove(struct bat_priv *bat_priv, const uint8_t *addr,
                goto out;
 
        tt_local_set_pending(bat_priv, tt_local_entry, TT_CLIENT_DEL |
-                            (roaming ? TT_CLIENT_ROAM : NO_FLAGS));
-
-       bat_dbg(DBG_TT, bat_priv, "Local tt entry (%pM) pending to be removed: "
-               "%s\n", tt_local_entry->common.addr, message);
+                            (roaming ? TT_CLIENT_ROAM : NO_FLAGS), message);
 out:
        if (tt_local_entry)
                tt_local_entry_free_ref(tt_local_entry);
@@ -420,15 +412,12 @@ static void tt_local_purge(struct bat_priv *bat_priv)
                        if (tt_local_entry->common.flags & TT_CLIENT_PENDING)
                                continue;
 
-                       if (!is_out_of_time(tt_local_entry->last_seen,
-                                           TT_LOCAL_TIMEOUT * 1000))
+                       if (!has_timed_out(tt_local_entry->last_seen,
+                                          TT_LOCAL_TIMEOUT))
                                continue;
 
                        tt_local_set_pending(bat_priv, tt_local_entry,
-                                            TT_CLIENT_DEL);
-                       bat_dbg(DBG_TT, bat_priv, "Local tt entry (%pM) "
-                               "pending to be removed: timed out\n",
-                               tt_local_entry->common.addr);
+                                            TT_CLIENT_DEL, "timed out");
                }
                spin_unlock_bh(list_lock);
        }
@@ -614,7 +603,7 @@ int tt_global_seq_print_text(struct seq_file *seq, void *offset)
                                                       struct tt_global_entry,
                                                       common);
                        seq_printf(seq, " * %pM  (%3u) via %pM     (%3u)   "
-                                       "[%c%c%c]\n",
+                                       "[%c%c]\n",
                                        tt_global_entry->common.addr,
                                        tt_global_entry->ttvn,
                                        tt_global_entry->orig_node->orig,
@@ -624,8 +613,6 @@ int tt_global_seq_print_text(struct seq_file *seq, void *offset)
                                        (tt_global_entry->common.flags &
                                         TT_CLIENT_ROAM ? 'R' : '.'),
                                        (tt_global_entry->common.flags &
-                                        TT_CLIENT_PENDING ? 'X' : '.'),
-                                       (tt_global_entry->common.flags &
                                         TT_CLIENT_WIFI ? 'W' : '.'));
                }
                rcu_read_unlock();
@@ -665,29 +652,31 @@ void tt_global_del(struct bat_priv *bat_priv,
        struct tt_local_entry *tt_local_entry = NULL;
 
        tt_global_entry = tt_global_hash_find(bat_priv, addr);
-       if (!tt_global_entry)
+       if (!tt_global_entry || tt_global_entry->orig_node != orig_node)
                goto out;
 
-       if (tt_global_entry->orig_node == orig_node) {
-               if (roaming) {
-                       /* if we are deleting a global entry due to a roam
-                        * event, there are two possibilities:
-                        * 1) the client roamed from node A to node B => we mark
-                        *    it with TT_CLIENT_ROAM, we start a timer and we
-                        *    wait for node B to claim it. In case of timeout
-                        *    the entry is purged.
-                        * 2) the client roamed to us => we can directly delete
-                        *    the global entry, since it is useless now. */
-                       tt_local_entry = tt_local_hash_find(bat_priv,
-                                                           tt_global_entry->common.addr);
-                       if (!tt_local_entry) {
-                               tt_global_entry->common.flags |= TT_CLIENT_ROAM;
-                               tt_global_entry->roam_at = jiffies;
-                               goto out;
-                       }
-               }
-               _tt_global_del(bat_priv, tt_global_entry, message);
+       if (!roaming)
+               goto out_del;
+
+       /* if we are deleting a global entry due to a roam
+        * event, there are two possibilities:
+        * 1) the client roamed from node A to node B => we mark
+        *    it with TT_CLIENT_ROAM, we start a timer and we
+        *    wait for node B to claim it. In case of timeout
+        *    the entry is purged.
+        * 2) the client roamed to us => we can directly delete
+        *    the global entry, since it is useless now. */
+       tt_local_entry = tt_local_hash_find(bat_priv,
+                                           tt_global_entry->common.addr);
+       if (!tt_local_entry) {
+               tt_global_entry->common.flags |= TT_CLIENT_ROAM;
+               tt_global_entry->roam_at = jiffies;
+               goto out;
        }
+
+out_del:
+       _tt_global_del(bat_priv, tt_global_entry, message);
+
 out:
        if (tt_global_entry)
                tt_global_entry_free_ref(tt_global_entry);
@@ -715,7 +704,7 @@ void tt_global_del_orig(struct bat_priv *bat_priv,
 
                spin_lock_bh(list_lock);
                hlist_for_each_entry_safe(tt_common_entry, node, safe,
-                                        head, hash_entry) {
+                                         head, hash_entry) {
                        tt_global_entry = container_of(tt_common_entry,
                                                       struct tt_global_entry,
                                                       common);
@@ -733,6 +722,7 @@ void tt_global_del_orig(struct bat_priv *bat_priv,
                spin_unlock_bh(list_lock);
        }
        atomic_set(&orig_node->tt_size, 0);
+       orig_node->tt_initialised = false;
 }
 
 static void tt_global_roam_purge(struct bat_priv *bat_priv)
@@ -757,8 +747,8 @@ static void tt_global_roam_purge(struct bat_priv *bat_priv)
                                                       common);
                        if (!(tt_global_entry->common.flags & TT_CLIENT_ROAM))
                                continue;
-                       if (!is_out_of_time(tt_global_entry->roam_at,
-                                           TT_CLIENT_ROAM_TIMEOUT * 1000))
+                       if (!has_timed_out(tt_global_entry->roam_at,
+                                          TT_CLIENT_ROAM_TIMEOUT))
                                continue;
 
                        bat_dbg(DBG_TT, bat_priv, "Deleting global "
@@ -846,11 +836,6 @@ struct orig_node *transtable_search(struct bat_priv *bat_priv,
        if (!atomic_inc_not_zero(&tt_global_entry->orig_node->refcount))
                goto out;
 
-       /* A global client marked as PENDING has already moved from that
-        * originator */
-       if (tt_global_entry->common.flags & TT_CLIENT_PENDING)
-               goto out;
-
        orig_node = tt_global_entry->orig_node;
 
 out:
@@ -977,8 +962,7 @@ static void tt_req_purge(struct bat_priv *bat_priv)
 
        spin_lock_bh(&bat_priv->tt_req_list_lock);
        list_for_each_entry_safe(node, safe, &bat_priv->tt_req_list, list) {
-               if (is_out_of_time(node->issued_at,
-                   TT_REQUEST_TIMEOUT * 1000)) {
+               if (has_timed_out(node->issued_at, TT_REQUEST_TIMEOUT)) {
                        list_del(&node->list);
                        kfree(node);
                }
@@ -996,8 +980,8 @@ static struct tt_req_node *new_tt_req_node(struct bat_priv *bat_priv,
        spin_lock_bh(&bat_priv->tt_req_list_lock);
        list_for_each_entry(tt_req_node_tmp, &bat_priv->tt_req_list, list) {
                if (compare_eth(tt_req_node_tmp, orig_node) &&
-                   !is_out_of_time(tt_req_node_tmp->issued_at,
-                                   TT_REQUEST_TIMEOUT * 1000))
+                   !has_timed_out(tt_req_node_tmp->issued_at,
+                                  TT_REQUEST_TIMEOUT))
                        goto unlock;
        }
 
@@ -1134,11 +1118,11 @@ static int send_tt_request(struct bat_priv *bat_priv,
        tt_request = (struct tt_query_packet *)skb_put(skb,
                                sizeof(struct tt_query_packet));
 
-       tt_request->packet_type = BAT_TT_QUERY;
-       tt_request->version = COMPAT_VERSION;
+       tt_request->header.packet_type = BAT_TT_QUERY;
+       tt_request->header.version = COMPAT_VERSION;
        memcpy(tt_request->src, primary_if->net_dev->dev_addr, ETH_ALEN);
        memcpy(tt_request->dst, dst_orig_node->orig, ETH_ALEN);
-       tt_request->ttl = TTL;
+       tt_request->header.ttl = TTL;
        tt_request->ttvn = ttvn;
        tt_request->tt_data = tt_crc;
        tt_request->flags = TT_REQUEST;
@@ -1264,9 +1248,9 @@ static bool send_other_tt_response(struct bat_priv *bat_priv,
                tt_response = (struct tt_query_packet *)skb->data;
        }
 
-       tt_response->packet_type = BAT_TT_QUERY;
-       tt_response->version = COMPAT_VERSION;
-       tt_response->ttl = TTL;
+       tt_response->header.packet_type = BAT_TT_QUERY;
+       tt_response->header.version = COMPAT_VERSION;
+       tt_response->header.ttl = TTL;
        memcpy(tt_response->src, req_dst_orig_node->orig, ETH_ALEN);
        memcpy(tt_response->dst, tt_request->src, ETH_ALEN);
        tt_response->flags = TT_RESPONSE;
@@ -1381,9 +1365,9 @@ static bool send_my_tt_response(struct bat_priv *bat_priv,
                tt_response = (struct tt_query_packet *)skb->data;
        }
 
-       tt_response->packet_type = BAT_TT_QUERY;
-       tt_response->version = COMPAT_VERSION;
-       tt_response->ttl = TTL;
+       tt_response->header.packet_type = BAT_TT_QUERY;
+       tt_response->header.version = COMPAT_VERSION;
+       tt_response->header.ttl = TTL;
        memcpy(tt_response->src, primary_if->net_dev->dev_addr, ETH_ALEN);
        memcpy(tt_response->dst, tt_request->src, ETH_ALEN);
        tt_response->flags = TT_RESPONSE;
@@ -1450,6 +1434,7 @@ static void _tt_update_changes(struct bat_priv *bat_priv,
                                 */
                                return;
        }
+       orig_node->tt_initialised = true;
 }
 
 static void tt_fill_gtable(struct bat_priv *bat_priv,
@@ -1589,8 +1574,7 @@ static void tt_roam_purge(struct bat_priv *bat_priv)
 
        spin_lock_bh(&bat_priv->tt_roam_list_lock);
        list_for_each_entry_safe(node, safe, &bat_priv->tt_roam_list, list) {
-               if (!is_out_of_time(node->first_time,
-                                   ROAMING_MAX_TIME * 1000))
+               if (!has_timed_out(node->first_time, ROAMING_MAX_TIME))
                        continue;
 
                list_del(&node->list);
@@ -1617,8 +1601,7 @@ static bool tt_check_roam_count(struct bat_priv *bat_priv,
                if (!compare_eth(tt_roam_node->addr, client))
                        continue;
 
-               if (is_out_of_time(tt_roam_node->first_time,
-                                  ROAMING_MAX_TIME * 1000))
+               if (has_timed_out(tt_roam_node->first_time, ROAMING_MAX_TIME))
                        continue;
 
                if (!atomic_dec_not_zero(&tt_roam_node->counter))
@@ -1669,9 +1652,9 @@ void send_roam_adv(struct bat_priv *bat_priv, uint8_t *client,
        roam_adv_packet = (struct roam_adv_packet *)skb_put(skb,
                                        sizeof(struct roam_adv_packet));
 
-       roam_adv_packet->packet_type = BAT_ROAM_ADV;
-       roam_adv_packet->version = COMPAT_VERSION;
-       roam_adv_packet->ttl = TTL;
+       roam_adv_packet->header.packet_type = BAT_ROAM_ADV;
+       roam_adv_packet->header.version = COMPAT_VERSION;
+       roam_adv_packet->header.ttl = TTL;
        primary_if = primary_if_get_selected(bat_priv);
        if (!primary_if)
                goto out;
@@ -1854,8 +1837,10 @@ void tt_update_orig(struct bat_priv *bat_priv, struct orig_node *orig_node,
        uint8_t orig_ttvn = (uint8_t)atomic_read(&orig_node->last_ttvn);
        bool full_table = true;
 
-       /* the ttvn increased by one -> we can apply the attached changes */
-       if (ttvn - orig_ttvn == 1) {
+       /* orig table not initialised AND first diff is in the OGM OR the ttvn
+        * increased by one -> we can apply the attached changes */
+       if ((!orig_node->tt_initialised && ttvn == 1) ||
+           ttvn - orig_ttvn == 1) {
                /* the OGM could not contain the changes due to their size or
                 * because they have already been sent TT_OGM_APPEND_MAX times.
                 * In this case send a tt request */
@@ -1889,7 +1874,8 @@ void tt_update_orig(struct bat_priv *bat_priv, struct orig_node *orig_node,
        } else {
                /* if we missed more than one change or our tables are not
                 * in sync anymore -> request fresh tt data */
-               if (ttvn != orig_ttvn || orig_node->tt_crc != tt_crc) {
+               if (!orig_node->tt_initialised || ttvn != orig_ttvn ||
+                   orig_node->tt_crc != tt_crc) {
 request_table:
                        bat_dbg(DBG_TT, bat_priv, "TT inconsistency for %pM. "
                                "Need to retrieve the correct information "
index 30efd49..c753633 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2007-2011 B.A.T.M.A.N. contributors:
+ * Copyright (C) 2007-2012 B.A.T.M.A.N. contributors:
  *
  * Marek Lindner, Simon Wunderlich
  *
index e9eb043..302efb5 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2007-2011 B.A.T.M.A.N. contributors:
+ * Copyright (C) 2007-2012 B.A.T.M.A.N. contributors:
  *
  * Marek Lindner, Simon Wunderlich
  *
@@ -81,6 +81,7 @@ struct orig_node {
        int16_t tt_buff_len;
        spinlock_t tt_buff_lock; /* protects tt_buff */
        atomic_t tt_size;
+       bool tt_initialised;
        /* The tt_poss_change flag is used to detect an ongoing roaming phase.
         * If true, then I sent a Roaming_adv to this orig_node and I have to
         * inspect every packet directed to it to check whether it is still
@@ -205,6 +206,7 @@ struct bat_priv {
        atomic_t gw_reselect;
        struct hard_iface __rcu *primary_if;  /* rcu protected pointer */
        struct vis_info *my_vis_info;
+       struct bat_algo_ops *bat_algo_ops;
 };
 
 struct socket_client {
@@ -343,4 +345,23 @@ struct softif_neigh {
        struct rcu_head rcu;
 };
 
+struct bat_algo_ops {
+       struct hlist_node list;
+       char *name;
+       /* init OGM when hard-interface is enabled */
+       void (*bat_ogm_init)(struct hard_iface *hard_iface);
+       /* init primary OGM when primary interface is selected */
+       void (*bat_ogm_init_primary)(struct hard_iface *hard_iface);
+       /* init mac addresses of the OGM belonging to this hard-interface */
+       void (*bat_ogm_update_mac)(struct hard_iface *hard_iface);
+       /* prepare a new outgoing OGM for the send queue */
+       void (*bat_ogm_schedule)(struct hard_iface *hard_iface,
+                                int tt_num_changes);
+       /* send scheduled OGM */
+       void (*bat_ogm_emit)(struct forw_packet *forw_packet);
+       /* receive incoming OGM */
+       void (*bat_ogm_receive)(struct hard_iface *if_incoming,
+                               struct sk_buff *skb);
+};
+
 #endif /* _NET_BATMAN_ADV_TYPES_H_ */
index 07d1c1d..0897dfa 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010-2011 B.A.T.M.A.N. contributors:
+ * Copyright (C) 2010-2012 B.A.T.M.A.N. contributors:
  *
  * Andreas Langer
  *
@@ -67,7 +67,7 @@ static struct sk_buff *frag_merge_packet(struct list_head *head,
 
        memmove(skb->data + uni_diff, skb->data, hdr_len);
        unicast_packet = (struct unicast_packet *) skb_pull(skb, uni_diff);
-       unicast_packet->packet_type = BAT_UNICAST;
+       unicast_packet->header.packet_type = BAT_UNICAST;
 
        return skb;
 
@@ -251,9 +251,9 @@ int frag_send_skb(struct sk_buff *skb, struct bat_priv *bat_priv,
 
        memcpy(frag1, &tmp_uc, sizeof(tmp_uc));
 
-       frag1->ttl--;
-       frag1->version = COMPAT_VERSION;
-       frag1->packet_type = BAT_UNICAST_FRAG;
+       frag1->header.ttl--;
+       frag1->header.version = COMPAT_VERSION;
+       frag1->header.packet_type = BAT_UNICAST_FRAG;
 
        memcpy(frag1->orig, primary_if->net_dev->dev_addr, ETH_ALEN);
        memcpy(frag2, frag1, sizeof(*frag2));
@@ -320,11 +320,11 @@ find_router:
 
        unicast_packet = (struct unicast_packet *)skb->data;
 
-       unicast_packet->version = COMPAT_VERSION;
+       unicast_packet->header.version = COMPAT_VERSION;
        /* batman packet type: unicast */
-       unicast_packet->packet_type = BAT_UNICAST;
+       unicast_packet->header.packet_type = BAT_UNICAST;
        /* set unicast ttl */
-       unicast_packet->ttl = TTL;
+       unicast_packet->header.ttl = TTL;
        /* copy the destination for faster routing */
        memcpy(unicast_packet->dest, orig_node->orig, ETH_ALEN);
        /* set the destination tt version number */
@@ -335,7 +335,7 @@ find_router:
            data_len + sizeof(*unicast_packet) >
                                neigh_node->if_incoming->net_dev->mtu) {
                /* send frag skb decreases ttl */
-               unicast_packet->ttl++;
+               unicast_packet->header.ttl++;
                ret = frag_send_skb(skb, bat_priv,
                                    neigh_node->if_incoming, neigh_node->addr);
                goto out;
index 8fd5535..a9faf6b 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010-2011 B.A.T.M.A.N. contributors:
+ * Copyright (C) 2010-2012 B.A.T.M.A.N. contributors:
  *
  * Andreas Langer
  *
index cc3b9f2..c4a5b8c 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008-2011 B.A.T.M.A.N. contributors:
+ * Copyright (C) 2008-2012 B.A.T.M.A.N. contributors:
  *
  * Simon Wunderlich
  *
@@ -617,7 +617,7 @@ static int generate_vis_packet(struct bat_priv *bat_priv)
        packet->vis_type = atomic_read(&bat_priv->vis_mode);
 
        memcpy(packet->target_orig, broadcast_addr, ETH_ALEN);
-       packet->ttl = TTL;
+       packet->header.ttl = TTL;
        packet->seqno = htonl(ntohl(packet->seqno) + 1);
        packet->entries = 0;
        skb_trim(info->skb_packet, sizeof(*packet));
@@ -714,8 +714,7 @@ static void purge_vis_packets(struct bat_priv *bat_priv)
                        if (info == bat_priv->my_vis_info)
                                continue;
 
-                       if (time_after(jiffies,
-                                      info->first_seen + VIS_TIMEOUT * HZ)) {
+                       if (has_timed_out(info->first_seen, VIS_TIMEOUT)) {
                                hlist_del(node);
                                send_list_del(info);
                                kref_put(&info->refcount, free_info);
@@ -818,19 +817,19 @@ static void send_vis_packet(struct bat_priv *bat_priv, struct vis_info *info)
                goto out;
 
        packet = (struct vis_packet *)info->skb_packet->data;
-       if (packet->ttl < 2) {
+       if (packet->header.ttl < 2) {
                pr_debug("Error - can't send vis packet: ttl exceeded\n");
                goto out;
        }
 
        memcpy(packet->sender_orig, primary_if->net_dev->dev_addr, ETH_ALEN);
-       packet->ttl--;
+       packet->header.ttl--;
 
        if (is_broadcast_ether_addr(packet->target_orig))
                broadcast_vis_packet(bat_priv, info);
        else
                unicast_vis_packet(bat_priv, info);
-       packet->ttl++; /* restore TTL */
+       packet->header.ttl++; /* restore TTL */
 
 out:
        if (primary_if)
@@ -910,9 +909,9 @@ int vis_init(struct bat_priv *bat_priv)
        INIT_LIST_HEAD(&bat_priv->my_vis_info->send_list);
        kref_init(&bat_priv->my_vis_info->refcount);
        bat_priv->my_vis_info->bat_priv = bat_priv;
-       packet->version = COMPAT_VERSION;
-       packet->packet_type = BAT_VIS;
-       packet->ttl = TTL;
+       packet->header.version = COMPAT_VERSION;
+       packet->header.packet_type = BAT_VIS;
+       packet->header.ttl = TTL;
        packet->seqno = 0;
        packet->entries = 0;
 
index 31b820d..ee2e46e 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008-2011 B.A.T.M.A.N. contributors:
+ * Copyright (C) 2008-2012 B.A.T.M.A.N. contributors:
  *
  * Simon Wunderlich, Marek Lindner
  *
@@ -22,7 +22,8 @@
 #ifndef _NET_BATMAN_ADV_VIS_H_
 #define _NET_BATMAN_ADV_VIS_H_
 
-#define VIS_TIMEOUT            200     /* timeout of vis packets in seconds */
+#define VIS_TIMEOUT            200000  /* timeout of vis packets
+                                        * in miliseconds */
 
 int vis_seq_print_text(struct seq_file *seq, void *offset);
 void receive_server_sync_packet(struct bat_priv *bat_priv,
index 71773b0..ba829de 100644 (file)
@@ -167,10 +167,11 @@ static int br_set_mac_address(struct net_device *dev, void *p)
        struct sockaddr *addr = p;
 
        if (!is_valid_ether_addr(addr->sa_data))
-               return -EINVAL;
+               return -EADDRNOTAVAIL;
 
        spin_lock_bh(&br->lock);
        if (compare_ether_addr(dev->dev_addr, addr->sa_data)) {
+               dev->addr_assign_type &= ~NET_ADDR_RANDOM;
                memcpy(dev->dev_addr, addr->sa_data, ETH_ALEN);
                br_fdb_change_mac_address(br, addr->sa_data);
                br_stp_change_bridge_id(br, addr->sa_data);
@@ -334,7 +335,7 @@ void br_dev_setup(struct net_device *dev)
 {
        struct net_bridge *br = netdev_priv(dev);
 
-       random_ether_addr(dev->dev_addr);
+       eth_hw_addr_random(dev);
        ether_setup(dev);
 
        dev->netdev_ops = &br_netdev_ops;
index 82c5706..aa6f716 100644 (file)
@@ -162,7 +162,6 @@ void caif_flow_cb(struct sk_buff *skb)
 static int transmit(struct cflayer *layer, struct cfpkt *pkt)
 {
        int err, high = 0, qlen = 0;
-       struct caif_dev_common *caifdev;
        struct caif_device_entry *caifd =
            container_of(layer, struct caif_device_entry, layer);
        struct sk_buff *skb;
@@ -174,7 +173,6 @@ static int transmit(struct cflayer *layer, struct cfpkt *pkt)
        skb->dev = caifd->netdev;
        skb_reset_network_header(skb);
        skb->protocol = htons(ETH_P_CAIF);
-       caifdev = netdev_priv(caifd->netdev);
 
        /* Check if we need to handle xoff */
        if (likely(caifd->netdev->tx_queue_len == 0))
index a97d97a..5016fa5 100644 (file)
@@ -43,34 +43,9 @@ enum caif_states {
 #define TX_FLOW_ON_BIT 1
 #define RX_FLOW_ON_BIT 2
 
-static struct dentry *debugfsdir;
-
-#ifdef CONFIG_DEBUG_FS
-struct debug_fs_counter {
-       atomic_t caif_nr_socks;
-       atomic_t caif_sock_create;
-       atomic_t num_connect_req;
-       atomic_t num_connect_resp;
-       atomic_t num_connect_fail_resp;
-       atomic_t num_disconnect;
-       atomic_t num_remote_shutdown_ind;
-       atomic_t num_tx_flow_off_ind;
-       atomic_t num_tx_flow_on_ind;
-       atomic_t num_rx_flow_off;
-       atomic_t num_rx_flow_on;
-};
-static struct debug_fs_counter cnt;
-#define        dbfs_atomic_inc(v) atomic_inc_return(v)
-#define        dbfs_atomic_dec(v) atomic_dec_return(v)
-#else
-#define        dbfs_atomic_inc(v) 0
-#define        dbfs_atomic_dec(v) 0
-#endif
-
 struct caifsock {
        struct sock sk; /* must be first member */
        struct cflayer layer;
-       char name[CAIF_LAYER_NAME_SZ]; /* Used for debugging */
        u32 flow_state;
        struct caif_connect_request conn_req;
        struct mutex readlock;
@@ -161,7 +136,6 @@ static int caif_queue_rcv_skb(struct sock *sk, struct sk_buff *skb)
                                        atomic_read(&cf_sk->sk.sk_rmem_alloc),
                                        sk_rcvbuf_lowwater(cf_sk));
                set_rx_flow_off(cf_sk);
-               dbfs_atomic_inc(&cnt.num_rx_flow_off);
                caif_flow_ctrl(sk, CAIF_MODEMCMD_FLOW_OFF_REQ);
        }
 
@@ -172,7 +146,6 @@ static int caif_queue_rcv_skb(struct sock *sk, struct sk_buff *skb)
                set_rx_flow_off(cf_sk);
                if (net_ratelimit())
                        pr_debug("sending flow OFF due to rmem_schedule\n");
-               dbfs_atomic_inc(&cnt.num_rx_flow_off);
                caif_flow_ctrl(sk, CAIF_MODEMCMD_FLOW_OFF_REQ);
        }
        skb->dev = NULL;
@@ -233,14 +206,12 @@ static void caif_ctrl_cb(struct cflayer *layr,
        switch (flow) {
        case CAIF_CTRLCMD_FLOW_ON_IND:
                /* OK from modem to start sending again */
-               dbfs_atomic_inc(&cnt.num_tx_flow_on_ind);
                set_tx_flow_on(cf_sk);
                cf_sk->sk.sk_state_change(&cf_sk->sk);
                break;
 
        case CAIF_CTRLCMD_FLOW_OFF_IND:
                /* Modem asks us to shut up */
-               dbfs_atomic_inc(&cnt.num_tx_flow_off_ind);
                set_tx_flow_off(cf_sk);
                cf_sk->sk.sk_state_change(&cf_sk->sk);
                break;
@@ -249,7 +220,6 @@ static void caif_ctrl_cb(struct cflayer *layr,
                /* We're now connected */
                caif_client_register_refcnt(&cf_sk->layer,
                                                cfsk_hold, cfsk_put);
-               dbfs_atomic_inc(&cnt.num_connect_resp);
                cf_sk->sk.sk_state = CAIF_CONNECTED;
                set_tx_flow_on(cf_sk);
                cf_sk->sk.sk_state_change(&cf_sk->sk);
@@ -263,7 +233,6 @@ static void caif_ctrl_cb(struct cflayer *layr,
 
        case CAIF_CTRLCMD_INIT_FAIL_RSP:
                /* Connect request failed */
-               dbfs_atomic_inc(&cnt.num_connect_fail_resp);
                cf_sk->sk.sk_err = ECONNREFUSED;
                cf_sk->sk.sk_state = CAIF_DISCONNECTED;
                cf_sk->sk.sk_shutdown = SHUTDOWN_MASK;
@@ -277,7 +246,6 @@ static void caif_ctrl_cb(struct cflayer *layr,
 
        case CAIF_CTRLCMD_REMOTE_SHUTDOWN_IND:
                /* Modem has closed this connection, or device is down. */
-               dbfs_atomic_inc(&cnt.num_remote_shutdown_ind);
                cf_sk->sk.sk_shutdown = SHUTDOWN_MASK;
                cf_sk->sk.sk_err = ECONNRESET;
                set_rx_flow_on(cf_sk);
@@ -297,7 +265,6 @@ static void caif_check_flow_release(struct sock *sk)
                return;
 
        if (atomic_read(&sk->sk_rmem_alloc) <= sk_rcvbuf_lowwater(cf_sk)) {
-                       dbfs_atomic_inc(&cnt.num_rx_flow_on);
                        set_rx_flow_on(cf_sk);
                        caif_flow_ctrl(sk, CAIF_MODEMCMD_FLOW_ON_REQ);
        }
@@ -856,7 +823,6 @@ static int caif_connect(struct socket *sock, struct sockaddr *uaddr,
        /*ifindex = id of the interface.*/
        cf_sk->conn_req.ifindex = cf_sk->sk.sk_bound_dev_if;
 
-       dbfs_atomic_inc(&cnt.num_connect_req);
        cf_sk->layer.receive = caif_sktrecv_cb;
 
        err = caif_connect_client(sock_net(sk), &cf_sk->conn_req,
@@ -945,8 +911,6 @@ static int caif_release(struct socket *sock)
        spin_unlock_bh(&sk->sk_receive_queue.lock);
        sock->sk = NULL;
 
-       dbfs_atomic_inc(&cnt.num_disconnect);
-
        WARN_ON(IS_ERR(cf_sk->debugfs_socket_dir));
        if (cf_sk->debugfs_socket_dir != NULL)
                debugfs_remove_recursive(cf_sk->debugfs_socket_dir);
@@ -1054,14 +1018,12 @@ static void caif_sock_destructor(struct sock *sk)
                return;
        }
        sk_stream_kill_queues(&cf_sk->sk);
-       dbfs_atomic_dec(&cnt.caif_nr_socks);
        caif_free_client(&cf_sk->layer);
 }
 
 static int caif_create(struct net *net, struct socket *sock, int protocol,
                        int kern)
 {
-       int num;
        struct sock *sk = NULL;
        struct caifsock *cf_sk = NULL;
        static struct proto prot = {.name = "PF_CAIF",
@@ -1122,34 +1084,6 @@ static int caif_create(struct net *net, struct socket *sock, int protocol,
        cf_sk->sk.sk_priority = CAIF_PRIO_NORMAL;
        cf_sk->conn_req.link_selector = CAIF_LINK_LOW_LATENCY;
        cf_sk->conn_req.protocol = protocol;
-       /* Increase the number of sockets created. */
-       dbfs_atomic_inc(&cnt.caif_nr_socks);
-       num = dbfs_atomic_inc(&cnt.caif_sock_create);
-#ifdef CONFIG_DEBUG_FS
-       if (!IS_ERR(debugfsdir)) {
-
-               /* Fill in some information concerning the misc socket. */
-               snprintf(cf_sk->name, sizeof(cf_sk->name), "cfsk%d", num);
-
-               cf_sk->debugfs_socket_dir =
-                       debugfs_create_dir(cf_sk->name, debugfsdir);
-
-               debugfs_create_u32("sk_state", S_IRUSR | S_IWUSR,
-                               cf_sk->debugfs_socket_dir,
-                               (u32 *) &cf_sk->sk.sk_state);
-               debugfs_create_u32("flow_state", S_IRUSR | S_IWUSR,
-                               cf_sk->debugfs_socket_dir, &cf_sk->flow_state);
-               debugfs_create_u32("sk_rmem_alloc", S_IRUSR | S_IWUSR,
-                               cf_sk->debugfs_socket_dir,
-                               (u32 *) &cf_sk->sk.sk_rmem_alloc);
-               debugfs_create_u32("sk_wmem_alloc", S_IRUSR | S_IWUSR,
-                               cf_sk->debugfs_socket_dir,
-                               (u32 *) &cf_sk->sk.sk_wmem_alloc);
-               debugfs_create_u32("identity", S_IRUSR | S_IWUSR,
-                               cf_sk->debugfs_socket_dir,
-                               (u32 *) &cf_sk->layer.id);
-       }
-#endif
        release_sock(&cf_sk->sk);
        return 0;
 }
@@ -1161,7 +1095,7 @@ static struct net_proto_family caif_family_ops = {
        .owner = THIS_MODULE,
 };
 
-static int af_caif_init(void)
+static int __init caif_sktinit_module(void)
 {
        int err = sock_register(&caif_family_ops);
        if (!err)
@@ -1169,54 +1103,9 @@ static int af_caif_init(void)
        return 0;
 }
 
-static int __init caif_sktinit_module(void)
-{
-#ifdef CONFIG_DEBUG_FS
-       debugfsdir = debugfs_create_dir("caif_sk", NULL);
-       if (!IS_ERR(debugfsdir)) {
-               debugfs_create_u32("num_sockets", S_IRUSR | S_IWUSR,
-                               debugfsdir,
-                               (u32 *) &cnt.caif_nr_socks);
-               debugfs_create_u32("num_create", S_IRUSR | S_IWUSR,
-                               debugfsdir,
-                               (u32 *) &cnt.caif_sock_create);
-               debugfs_create_u32("num_connect_req", S_IRUSR | S_IWUSR,
-                               debugfsdir,
-                               (u32 *) &cnt.num_connect_req);
-               debugfs_create_u32("num_connect_resp", S_IRUSR | S_IWUSR,
-                               debugfsdir,
-                               (u32 *) &cnt.num_connect_resp);
-               debugfs_create_u32("num_connect_fail_resp", S_IRUSR | S_IWUSR,
-                               debugfsdir,
-                               (u32 *) &cnt.num_connect_fail_resp);
-               debugfs_create_u32("num_disconnect", S_IRUSR | S_IWUSR,
-                               debugfsdir,
-                               (u32 *) &cnt.num_disconnect);
-               debugfs_create_u32("num_remote_shutdown_ind",
-                               S_IRUSR | S_IWUSR, debugfsdir,
-                               (u32 *) &cnt.num_remote_shutdown_ind);
-               debugfs_create_u32("num_tx_flow_off_ind", S_IRUSR | S_IWUSR,
-                               debugfsdir,
-                               (u32 *) &cnt.num_tx_flow_off_ind);
-               debugfs_create_u32("num_tx_flow_on_ind", S_IRUSR | S_IWUSR,
-                               debugfsdir,
-                               (u32 *) &cnt.num_tx_flow_on_ind);
-               debugfs_create_u32("num_rx_flow_off", S_IRUSR | S_IWUSR,
-                               debugfsdir,
-                               (u32 *) &cnt.num_rx_flow_off);
-               debugfs_create_u32("num_rx_flow_on", S_IRUSR | S_IWUSR,
-                               debugfsdir,
-                               (u32 *) &cnt.num_rx_flow_on);
-       }
-#endif
-       return af_caif_init();
-}
-
 static void __exit caif_sktexit_module(void)
 {
        sock_unregister(PF_CAIF);
-       if (debugfsdir != NULL)
-               debugfs_remove_recursive(debugfsdir);
 }
 module_init(caif_sktinit_module);
 module_exit(caif_sktexit_module);
index 8656909..e866234 100644 (file)
@@ -72,14 +72,12 @@ static void robust_list_del(struct list_head *delete_node)
 static int chnl_recv_cb(struct cflayer *layr, struct cfpkt *pkt)
 {
        struct sk_buff *skb;
-       struct chnl_net *priv  = container_of(layr, struct chnl_net, chnl);
+       struct chnl_net *priv;
        int pktlen;
-       int err = 0;
        const u8 *ip_version;
        u8 buf;
 
        priv = container_of(layr, struct chnl_net, chnl);
-
        if (!priv)
                return -EINVAL;
 
@@ -95,8 +93,7 @@ static int chnl_recv_cb(struct cflayer *layr, struct cfpkt *pkt)
 
        /* check the version of IP */
        ip_version = skb_header_pointer(skb, 0, 1, &buf);
-       if (!ip_version)
-               return -EINVAL;
+
        switch (*ip_version >> 4) {
        case 4:
                skb->protocol = htons(ETH_P_IP);
@@ -105,6 +102,7 @@ static int chnl_recv_cb(struct cflayer *layr, struct cfpkt *pkt)
                skb->protocol = htons(ETH_P_IPV6);
                break;
        default:
+               priv->netdev->stats.rx_errors++;
                return -EINVAL;
        }
 
@@ -123,7 +121,7 @@ static int chnl_recv_cb(struct cflayer *layr, struct cfpkt *pkt)
        priv->netdev->stats.rx_packets++;
        priv->netdev->stats.rx_bytes += pktlen;
 
-       return err;
+       return 0;
 }
 
 static int delete_device(struct chnl_net *dev)
@@ -221,11 +219,13 @@ static int chnl_net_start_xmit(struct sk_buff *skb, struct net_device *dev)
 
        if (skb->len > priv->netdev->mtu) {
                pr_warn("Size of skb exceeded MTU\n");
+               dev->stats.tx_errors++;
                return -ENOSPC;
        }
 
        if (!priv->flowenabled) {
                pr_debug("dropping packets flow off\n");
+               dev->stats.tx_dropped++;
                return NETDEV_TX_BUSY;
        }
 
@@ -240,8 +240,7 @@ static int chnl_net_start_xmit(struct sk_buff *skb, struct net_device *dev)
        /* Send the packet down the stack. */
        result = priv->chnl.dn->transmit(priv->chnl.dn, pkt);
        if (result) {
-               if (result == -EAGAIN)
-                       result = NETDEV_TX_BUSY;
+               dev->stats.tx_dropped++;
                return result;
        }
 
index 68bbf9f..d3cf12f 100644 (file)
@@ -132,6 +132,8 @@ out_noerr:
  *     __skb_recv_datagram - Receive a datagram skbuff
  *     @sk: socket
  *     @flags: MSG_ flags
+ *     @off: an offset in bytes to peek skb from. Returns an offset
+ *           within an skb where data actually starts
  *     @peeked: returns non-zero if this packet has been seen before
  *     @err: error code returned
  *
@@ -158,7 +160,7 @@ out_noerr:
  *     the standard around please.
  */
 struct sk_buff *__skb_recv_datagram(struct sock *sk, unsigned flags,
-                                   int *peeked, int *err)
+                                   int *peeked, int *off, int *err)
 {
        struct sk_buff *skb;
        long timeo;
@@ -180,21 +182,25 @@ struct sk_buff *__skb_recv_datagram(struct sock *sk, unsigned flags,
                 * However, this function was correct in any case. 8)
                 */
                unsigned long cpu_flags;
+               struct sk_buff_head *queue = &sk->sk_receive_queue;
 
-               spin_lock_irqsave(&sk->sk_receive_queue.lock, cpu_flags);
-               skb = skb_peek(&sk->sk_receive_queue);
-               if (skb) {
+               spin_lock_irqsave(&queue->lock, cpu_flags);
+               skb_queue_walk(queue, skb) {
                        *peeked = skb->peeked;
                        if (flags & MSG_PEEK) {
+                               if (*off >= skb->len) {
+                                       *off -= skb->len;
+                                       continue;
+                               }
                                skb->peeked = 1;
                                atomic_inc(&skb->users);
                        } else
-                               __skb_unlink(skb, &sk->sk_receive_queue);
-               }
-               spin_unlock_irqrestore(&sk->sk_receive_queue.lock, cpu_flags);
+                               __skb_unlink(skb, queue);
 
-               if (skb)
+                       spin_unlock_irqrestore(&queue->lock, cpu_flags);
                        return skb;
+               }
+               spin_unlock_irqrestore(&queue->lock, cpu_flags);
 
                /* User doesn't want to wait */
                error = -EAGAIN;
@@ -214,10 +220,10 @@ EXPORT_SYMBOL(__skb_recv_datagram);
 struct sk_buff *skb_recv_datagram(struct sock *sk, unsigned flags,
                                  int noblock, int *err)
 {
-       int peeked;
+       int peeked, off = 0;
 
        return __skb_recv_datagram(sk, flags | (noblock ? MSG_DONTWAIT : 0),
-                                  &peeked, err);
+                                  &peeked, &off, err);
 }
 EXPORT_SYMBOL(skb_recv_datagram);
 
index 6ca32f6..5ef3b65 100644 (file)
@@ -446,7 +446,7 @@ void __dev_remove_pack(struct packet_type *pt)
                }
        }
 
-       printk(KERN_WARNING "dev_remove_pack: %p not found.\n", pt);
+       pr_warn("dev_remove_pack: %p not found\n", pt);
 out:
        spin_unlock(&ptype_lock);
 }
@@ -1039,8 +1039,7 @@ rollback:
                        memcpy(dev->name, oldname, IFNAMSIZ);
                        goto rollback;
                } else {
-                       printk(KERN_ERR
-                              "%s: name change rollback failed: %d.\n",
+                       pr_err("%s: name change rollback failed: %d\n",
                               dev->name, ret);
                }
        }
@@ -1139,9 +1138,8 @@ void dev_load(struct net *net, const char *name)
                no_module = request_module("netdev-%s", name);
        if (no_module && capable(CAP_SYS_MODULE)) {
                if (!request_module("%s", name))
-                       pr_err("Loading kernel module for a network device "
-"with CAP_SYS_MODULE (deprecated).  Use CAP_NET_ADMIN and alias netdev-%s "
-"instead\n", name);
+                       pr_err("Loading kernel module for a network device with CAP_SYS_MODULE (deprecated).  Use CAP_NET_ADMIN and alias netdev-%s instead.\n",
+                              name);
        }
 }
 EXPORT_SYMBOL(dev_load);
@@ -1655,10 +1653,9 @@ static void dev_queue_xmit_nit(struct sk_buff *skb, struct net_device *dev)
                        if (skb_network_header(skb2) < skb2->data ||
                            skb2->network_header > skb2->tail) {
                                if (net_ratelimit())
-                                       printk(KERN_CRIT "protocol %04x is "
-                                              "buggy, dev %s\n",
-                                              ntohs(skb2->protocol),
-                                              dev->name);
+                                       pr_crit("protocol %04x is buggy, dev %s\n",
+                                               ntohs(skb2->protocol),
+                                               dev->name);
                                skb_reset_network_header(skb2);
                        }
 
@@ -1691,9 +1688,7 @@ static void netif_setup_tc(struct net_device *dev, unsigned int txq)
 
        /* If TC0 is invalidated disable TC mapping */
        if (tc->offset + tc->count > txq) {
-               pr_warning("Number of in use tx queues changed "
-                          "invalidating tc mappings. Priority "
-                          "traffic classification disabled!\n");
+               pr_warn("Number of in use tx queues changed invalidating tc mappings. Priority traffic classification disabled!\n");
                dev->num_tc = 0;
                return;
        }
@@ -1704,11 +1699,8 @@ static void netif_setup_tc(struct net_device *dev, unsigned int txq)
 
                tc = &dev->tc_to_txq[q];
                if (tc->offset + tc->count > txq) {
-                       pr_warning("Number of in use tx queues "
-                                  "changed. Priority %i to tc "
-                                  "mapping %i is no longer valid "
-                                  "setting map to 0\n",
-                                  i, q);
+                       pr_warn("Number of in use tx queues changed. Priority %i to tc mapping %i is no longer valid. Setting map to 0\n",
+                               i, q);
                        netdev_set_prio_tc_map(dev, i, 0);
                }
        }
@@ -2014,8 +2006,7 @@ EXPORT_SYMBOL(skb_gso_segment);
 void netdev_rx_csum_fault(struct net_device *dev)
 {
        if (net_ratelimit()) {
-               printk(KERN_ERR "%s: hw csum failure.\n",
-                       dev ? dev->name : "<unknown>");
+               pr_err("%s: hw csum failure\n", dev ? dev->name : "<unknown>");
                dump_stack();
        }
 }
@@ -2332,9 +2323,9 @@ static inline u16 dev_cap_txqueue(struct net_device *dev, u16 queue_index)
 {
        if (unlikely(queue_index >= dev->real_num_tx_queues)) {
                if (net_ratelimit()) {
-                       pr_warning("%s selects TX queue %d, but "
-                               "real number of TX queues is %d\n",
-                               dev->name, queue_index, dev->real_num_tx_queues);
+                       pr_warn("%s selects TX queue %d, but real number of TX queues is %d\n",
+                               dev->name, queue_index,
+                               dev->real_num_tx_queues);
                }
                return 0;
        }
@@ -2578,16 +2569,16 @@ int dev_queue_xmit(struct sk_buff *skb)
                        }
                        HARD_TX_UNLOCK(dev, txq);
                        if (net_ratelimit())
-                               printk(KERN_CRIT "Virtual device %s asks to "
-                                      "queue packet!\n", dev->name);
+                               pr_crit("Virtual device %s asks to queue packet!\n",
+                                       dev->name);
                } else {
                        /* Recursion is detected! It is possible,
                         * unfortunately
                         */
 recursion_alert:
                        if (net_ratelimit())
-                               printk(KERN_CRIT "Dead loop on virtual device "
-                                      "%s, fix it urgently!\n", dev->name);
+                               pr_crit("Dead loop on virtual device %s, fix it urgently!\n",
+                                       dev->name);
                }
        }
 
@@ -3069,8 +3060,8 @@ static int ing_filter(struct sk_buff *skb, struct netdev_queue *rxq)
 
        if (unlikely(MAX_RED_LOOP < ttl++)) {
                if (net_ratelimit())
-                       pr_warning( "Redir loop detected Dropping packet (%d->%d)\n",
-                              skb->skb_iif, dev->ifindex);
+                       pr_warn("Redir loop detected Dropping packet (%d->%d)\n",
+                               skb->skb_iif, dev->ifindex);
                return TC_ACT_SHOT;
        }
 
@@ -4497,16 +4488,15 @@ static int __dev_set_promiscuity(struct net_device *dev, int inc)
                        dev->flags &= ~IFF_PROMISC;
                else {
                        dev->promiscuity -= inc;
-                       printk(KERN_WARNING "%s: promiscuity touches roof, "
-                               "set promiscuity failed, promiscuity feature "
-                               "of device might be broken.\n", dev->name);
+                       pr_warn("%s: promiscuity touches roof, set promiscuity failed. promiscuity feature of device might be broken.\n",
+                               dev->name);
                        return -EOVERFLOW;
                }
        }
        if (dev->flags != old_flags) {
-               printk(KERN_INFO "device %s %s promiscuous mode\n",
-                      dev->name, (dev->flags & IFF_PROMISC) ? "entered" :
-                                                              "left");
+               pr_info("device %s %s promiscuous mode\n",
+                       dev->name,
+                       dev->flags & IFF_PROMISC ? "entered" : "left");
                if (audit_enabled) {
                        current_uid_gid(&uid, &gid);
                        audit_log(current->audit_context, GFP_ATOMIC,
@@ -4579,9 +4569,8 @@ int dev_set_allmulti(struct net_device *dev, int inc)
                        dev->flags &= ~IFF_ALLMULTI;
                else {
                        dev->allmulti -= inc;
-                       printk(KERN_WARNING "%s: allmulti touches roof, "
-                               "set allmulti failed, allmulti feature of "
-                               "device might be broken.\n", dev->name);
+                       pr_warn("%s: allmulti touches roof, set allmulti failed. allmulti feature of device might be broken.\n",
+                               dev->name);
                        return -EOVERFLOW;
                }
        }
@@ -5238,8 +5227,8 @@ static void rollback_registered_many(struct list_head *head)
                 * devices and proceed with the remaining.
                 */
                if (dev->reg_state == NETREG_UNINITIALIZED) {
-                       pr_debug("unregister_netdevice: device %s/%p never "
-                                "was registered\n", dev->name, dev);
+                       pr_debug("unregister_netdevice: device %s/%p never was registered\n",
+                                dev->name, dev);
 
                        WARN_ON(1);
                        list_del(&dev->unreg_list);
@@ -5471,7 +5460,7 @@ static int netif_alloc_rx_queues(struct net_device *dev)
 
        rx = kcalloc(count, sizeof(struct netdev_rx_queue), GFP_KERNEL);
        if (!rx) {
-               pr_err("netdev: Unable to allocate %u rx queues.\n", count);
+               pr_err("netdev: Unable to allocate %u rx queues\n", count);
                return -ENOMEM;
        }
        dev->_rx = rx;
@@ -5505,8 +5494,7 @@ static int netif_alloc_netdev_queues(struct net_device *dev)
 
        tx = kcalloc(count, sizeof(struct netdev_queue), GFP_KERNEL);
        if (!tx) {
-               pr_err("netdev: Unable to allocate %u tx queues.\n",
-                      count);
+               pr_err("netdev: Unable to allocate %u tx queues\n", count);
                return -ENOMEM;
        }
        dev->_tx = tx;
@@ -5765,10 +5753,8 @@ static void netdev_wait_allrefs(struct net_device *dev)
                refcnt = netdev_refcnt_read(dev);
 
                if (time_after(jiffies, warning_time + 10 * HZ)) {
-                       printk(KERN_EMERG "unregister_netdevice: "
-                              "waiting for %s to become free. Usage "
-                              "count = %d\n",
-                              dev->name, refcnt);
+                       pr_emerg("unregister_netdevice: waiting for %s to become free. Usage count = %d\n",
+                                dev->name, refcnt);
                        warning_time = jiffies;
                }
        }
@@ -5819,7 +5805,7 @@ void netdev_run_todo(void)
                list_del(&dev->todo_list);
 
                if (unlikely(dev->reg_state != NETREG_UNREGISTERING)) {
-                       printk(KERN_ERR "network todo '%s' but state %d\n",
+                       pr_err("network todo '%s' but state %d\n",
                               dev->name, dev->reg_state);
                        dump_stack();
                        continue;
@@ -5848,12 +5834,12 @@ void netdev_run_todo(void)
 /* Convert net_device_stats to rtnl_link_stats64.  They have the same
  * fields in the same order, with only the type differing.
  */
-static void netdev_stats_to_stats64(struct rtnl_link_stats64 *stats64,
-                                   const struct net_device_stats *netdev_stats)
+void netdev_stats_to_stats64(struct rtnl_link_stats64 *stats64,
+                            const struct net_device_stats *netdev_stats)
 {
 #if BITS_PER_LONG == 64
-        BUILD_BUG_ON(sizeof(*stats64) != sizeof(*netdev_stats));
-        memcpy(stats64, netdev_stats, sizeof(*stats64));
+       BUILD_BUG_ON(sizeof(*stats64) != sizeof(*netdev_stats));
+       memcpy(stats64, netdev_stats, sizeof(*stats64));
 #else
        size_t i, n = sizeof(*stats64) / sizeof(u64);
        const unsigned long *src = (const unsigned long *)netdev_stats;
@@ -5865,6 +5851,7 @@ static void netdev_stats_to_stats64(struct rtnl_link_stats64 *stats64,
                dst[i] = src[i];
 #endif
 }
+EXPORT_SYMBOL(netdev_stats_to_stats64);
 
 /**
  *     dev_get_stats   - get network device statistics
@@ -5935,15 +5922,13 @@ struct net_device *alloc_netdev_mqs(int sizeof_priv, const char *name,
        BUG_ON(strlen(name) >= sizeof(dev->name));
 
        if (txqs < 1) {
-               pr_err("alloc_netdev: Unable to allocate device "
-                      "with zero queues.\n");
+               pr_err("alloc_netdev: Unable to allocate device with zero queues\n");
                return NULL;
        }
 
 #ifdef CONFIG_RPS
        if (rxqs < 1) {
-               pr_err("alloc_netdev: Unable to allocate device "
-                      "with zero RX queues.\n");
+               pr_err("alloc_netdev: Unable to allocate device with zero RX queues\n");
                return NULL;
        }
 #endif
@@ -5959,7 +5944,7 @@ struct net_device *alloc_netdev_mqs(int sizeof_priv, const char *name,
 
        p = kzalloc(alloc_size, GFP_KERNEL);
        if (!p) {
-               printk(KERN_ERR "alloc_netdev: Unable to allocate device.\n");
+               pr_err("alloc_netdev: Unable to allocate device\n");
                return NULL;
        }
 
@@ -6492,8 +6477,8 @@ static void __net_exit default_device_exit(struct net *net)
                snprintf(fb_name, IFNAMSIZ, "dev%d", dev->ifindex);
                err = dev_change_net_namespace(dev, &init_net, fb_name);
                if (err) {
-                       printk(KERN_EMERG "%s: failed to move %s to init_net: %d\n",
-                               __func__, dev->name, err);
+                       pr_emerg("%s: failed to move %s to init_net: %d\n",
+                                __func__, dev->name, err);
                        BUG();
                }
        }
index 3f79db1..6d6d7d2 100644 (file)
@@ -73,6 +73,8 @@ static const char netdev_features_strings[NETDEV_FEATURE_COUNT][ETH_GSTRING_LEN]
        [NETIF_F_RXCSUM_BIT] =           "rx-checksum",
        [NETIF_F_NOCACHE_COPY_BIT] =     "tx-nocache-copy",
        [NETIF_F_LOOPBACK_BIT] =         "loopback",
+       [NETIF_F_RXFCS_BIT] =            "rx-fcs",
+       [NETIF_F_RXALL_BIT] =            "rx-all",
 };
 
 static int ethtool_get_features(struct net_device *dev, void __user *useraddr)
index 2a83914..0a68045 100644 (file)
@@ -2167,6 +2167,35 @@ nla_put_failure:
        return -EMSGSIZE;
 }
 
+static int pneigh_fill_info(struct sk_buff *skb, struct pneigh_entry *pn,
+                           u32 pid, u32 seq, int type, unsigned int flags,
+                           struct neigh_table *tbl)
+{
+       struct nlmsghdr *nlh;
+       struct ndmsg *ndm;
+
+       nlh = nlmsg_put(skb, pid, seq, type, sizeof(*ndm), flags);
+       if (nlh == NULL)
+               return -EMSGSIZE;
+
+       ndm = nlmsg_data(nlh);
+       ndm->ndm_family  = tbl->family;
+       ndm->ndm_pad1    = 0;
+       ndm->ndm_pad2    = 0;
+       ndm->ndm_flags   = pn->flags | NTF_PROXY;
+       ndm->ndm_type    = NDA_DST;
+       ndm->ndm_ifindex = pn->dev->ifindex;
+       ndm->ndm_state   = NUD_NONE;
+
+       NLA_PUT(skb, NDA_DST, tbl->key_len, pn->key);
+
+       return nlmsg_end(skb, nlh);
+
+nla_put_failure:
+       nlmsg_cancel(skb, nlh);
+       return -EMSGSIZE;
+}
+
 static void neigh_update_notify(struct neighbour *neigh)
 {
        call_netevent_notifiers(NETEVENT_NEIGH_UPDATE, neigh);
@@ -2216,23 +2245,78 @@ out:
        return rc;
 }
 
+static int pneigh_dump_table(struct neigh_table *tbl, struct sk_buff *skb,
+                            struct netlink_callback *cb)
+{
+       struct pneigh_entry *n;
+       struct net *net = sock_net(skb->sk);
+       int rc, h, s_h = cb->args[3];
+       int idx, s_idx = idx = cb->args[4];
+
+       read_lock_bh(&tbl->lock);
+
+       for (h = 0; h <= PNEIGH_HASHMASK; h++) {
+               if (h < s_h)
+                       continue;
+               if (h > s_h)
+                       s_idx = 0;
+               for (n = tbl->phash_buckets[h], idx = 0; n; n = n->next) {
+                       if (dev_net(n->dev) != net)
+                               continue;
+                       if (idx < s_idx)
+                               goto next;
+                       if (pneigh_fill_info(skb, n, NETLINK_CB(cb->skb).pid,
+                                           cb->nlh->nlmsg_seq,
+                                           RTM_NEWNEIGH,
+                                           NLM_F_MULTI, tbl) <= 0) {
+                               read_unlock_bh(&tbl->lock);
+                               rc = -1;
+                               goto out;
+                       }
+               next:
+                       idx++;
+               }
+       }
+
+       read_unlock_bh(&tbl->lock);
+       rc = skb->len;
+out:
+       cb->args[3] = h;
+       cb->args[4] = idx;
+       return rc;
+
+}
+
 static int neigh_dump_info(struct sk_buff *skb, struct netlink_callback *cb)
 {
        struct neigh_table *tbl;
        int t, family, s_t;
+       int proxy = 0;
+       int err = 0;
 
        read_lock(&neigh_tbl_lock);
        family = ((struct rtgenmsg *) nlmsg_data(cb->nlh))->rtgen_family;
+
+       /* check for full ndmsg structure presence, family member is
+        * the same for both structures
+        */
+       if (nlmsg_len(cb->nlh) >= sizeof(struct ndmsg) &&
+           ((struct ndmsg *) nlmsg_data(cb->nlh))->ndm_flags == NTF_PROXY)
+               proxy = 1;
+
        s_t = cb->args[0];
 
-       for (tbl = neigh_tables, t = 0; tbl; tbl = tbl->next, t++) {
+       for (tbl = neigh_tables, t = 0; tbl && (err >= 0);
+            tbl = tbl->next, t++) {
                if (t < s_t || (family && tbl->family != family))
                        continue;
                if (t > s_t)
                        memset(&cb->args[1], 0, sizeof(cb->args) -
                                                sizeof(cb->args[0]));
-               if (neigh_dump_table(tbl, skb, cb) < 0)
-                       break;
+               if (proxy)
+                       err = pneigh_dump_table(tbl, skb, cb);
+               else
+                       err = neigh_dump_table(tbl, skb, cb);
        }
        read_unlock(&neigh_tbl_lock);
 
index ddefc51..3d84fb9 100644 (file)
@@ -9,6 +9,8 @@
  * Copyright (C) 2002  Red Hat, Inc.
  */
 
+#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
+
 #include <linux/moduleparam.h>
 #include <linux/netdevice.h>
 #include <linux/etherdevice.h>
@@ -45,9 +47,11 @@ static atomic_t trapped;
 #define NETPOLL_RX_ENABLED  1
 #define NETPOLL_RX_DROP     2
 
-#define MAX_SKB_SIZE \
-               (MAX_UDP_CHUNK + sizeof(struct udphdr) + \
-                               sizeof(struct iphdr) + sizeof(struct ethhdr))
+#define MAX_SKB_SIZE                                                   \
+       (sizeof(struct ethhdr) +                                        \
+        sizeof(struct iphdr) +                                         \
+        sizeof(struct udphdr) +                                        \
+        MAX_UDP_CHUNK)
 
 static void zap_completion_queue(void);
 static void arp_reply(struct sk_buff *skb);
@@ -55,6 +59,13 @@ static void arp_reply(struct sk_buff *skb);
 static unsigned int carrier_timeout = 4;
 module_param(carrier_timeout, uint, 0644);
 
+#define np_info(np, fmt, ...)                          \
+       pr_info("%s: " fmt, np->name, ##__VA_ARGS__)
+#define np_err(np, fmt, ...)                           \
+       pr_err("%s: " fmt, np->name, ##__VA_ARGS__)
+#define np_notice(np, fmt, ...)                                \
+       pr_notice("%s: " fmt, np->name, ##__VA_ARGS__)
+
 static void queue_process(struct work_struct *work)
 {
        struct netpoll_info *npinfo =
@@ -627,18 +638,12 @@ out:
 
 void netpoll_print_options(struct netpoll *np)
 {
-       printk(KERN_INFO "%s: local port %d\n",
-                        np->name, np->local_port);
-       printk(KERN_INFO "%s: local IP %pI4\n",
-                        np->name, &np->local_ip);
-       printk(KERN_INFO "%s: interface '%s'\n",
-                        np->name, np->dev_name);
-       printk(KERN_INFO "%s: remote port %d\n",
-                        np->name, np->remote_port);
-       printk(KERN_INFO "%s: remote IP %pI4\n",
-                        np->name, &np->remote_ip);
-       printk(KERN_INFO "%s: remote ethernet address %pM\n",
-                        np->name, np->remote_mac);
+       np_info(np, "local port %d\n", np->local_port);
+       np_info(np, "local IP %pI4\n", &np->local_ip);
+       np_info(np, "interface '%s'\n", np->dev_name);
+       np_info(np, "remote port %d\n", np->remote_port);
+       np_info(np, "remote IP %pI4\n", &np->remote_ip);
+       np_info(np, "remote ethernet address %pM\n", np->remote_mac);
 }
 EXPORT_SYMBOL(netpoll_print_options);
 
@@ -680,8 +685,7 @@ int netpoll_parse_options(struct netpoll *np, char *opt)
                        goto parse_failed;
                *delim = 0;
                if (*cur == ' ' || *cur == '\t')
-                       printk(KERN_INFO "%s: warning: whitespace"
-                                       "is not allowed\n", np->name);
+                       np_info(np, "warning: whitespace is not allowed\n");
                np->remote_port = simple_strtol(cur, NULL, 10);
                cur = delim;
        }
@@ -705,8 +709,7 @@ int netpoll_parse_options(struct netpoll *np, char *opt)
        return 0;
 
  parse_failed:
-       printk(KERN_INFO "%s: couldn't parse config at '%s'!\n",
-              np->name, cur);
+       np_info(np, "couldn't parse config at '%s'!\n", cur);
        return -1;
 }
 EXPORT_SYMBOL(netpoll_parse_options);
@@ -721,8 +724,8 @@ int __netpoll_setup(struct netpoll *np)
 
        if ((ndev->priv_flags & IFF_DISABLE_NETPOLL) ||
            !ndev->netdev_ops->ndo_poll_controller) {
-               printk(KERN_ERR "%s: %s doesn't support polling, aborting.\n",
-                      np->name, np->dev_name);
+               np_err(np, "%s doesn't support polling, aborting\n",
+                      np->dev_name);
                err = -ENOTSUPP;
                goto out;
        }
@@ -785,14 +788,12 @@ int netpoll_setup(struct netpoll *np)
        if (np->dev_name)
                ndev = dev_get_by_name(&init_net, np->dev_name);
        if (!ndev) {
-               printk(KERN_ERR "%s: %s doesn't exist, aborting.\n",
-                      np->name, np->dev_name);
+               np_err(np, "%s doesn't exist, aborting\n", np->dev_name);
                return -ENODEV;
        }
 
        if (ndev->master) {
-               printk(KERN_ERR "%s: %s is a slave device, aborting.\n",
-                      np->name, np->dev_name);
+               np_err(np, "%s is a slave device, aborting\n", np->dev_name);
                err = -EBUSY;
                goto put;
        }
@@ -800,16 +801,14 @@ int netpoll_setup(struct netpoll *np)
        if (!netif_running(ndev)) {
                unsigned long atmost, atleast;
 
-               printk(KERN_INFO "%s: device %s not up yet, forcing it\n",
-                      np->name, np->dev_name);
+               np_info(np, "device %s not up yet, forcing it\n", np->dev_name);
 
                rtnl_lock();
                err = dev_open(ndev);
                rtnl_unlock();
 
                if (err) {
-                       printk(KERN_ERR "%s: failed to open %s\n",
-                              np->name, ndev->name);
+                       np_err(np, "failed to open %s\n", ndev->name);
                        goto put;
                }
 
@@ -817,9 +816,7 @@ int netpoll_setup(struct netpoll *np)
                atmost = jiffies + carrier_timeout * HZ;
                while (!netif_carrier_ok(ndev)) {
                        if (time_after(jiffies, atmost)) {
-                               printk(KERN_NOTICE
-                                      "%s: timeout waiting for carrier\n",
-                                      np->name);
+                               np_notice(np, "timeout waiting for carrier\n");
                                break;
                        }
                        msleep(1);
@@ -831,9 +828,7 @@ int netpoll_setup(struct netpoll *np)
                 */
 
                if (time_before(jiffies, atleast)) {
-                       printk(KERN_NOTICE "%s: carrier detect appears"
-                              " untrustworthy, waiting 4 seconds\n",
-                              np->name);
+                       np_notice(np, "carrier detect appears untrustworthy, waiting 4 seconds\n");
                        msleep(4000);
                }
        }
@@ -844,15 +839,15 @@ int netpoll_setup(struct netpoll *np)
 
                if (!in_dev || !in_dev->ifa_list) {
                        rcu_read_unlock();
-                       printk(KERN_ERR "%s: no IP address for %s, aborting\n",
-                              np->name, np->dev_name);
+                       np_err(np, "no IP address for %s, aborting\n",
+                              np->dev_name);
                        err = -EDESTADDRREQ;
                        goto put;
                }
 
                np->local_ip = in_dev->ifa_list->ifa_local;
                rcu_read_unlock();
-               printk(KERN_INFO "%s: local IP %pI4\n", np->name, &np->local_ip);
+               np_info(np, "local IP %pI4\n", &np->local_ip);
        }
 
        np->dev = ndev;
index f965dce..1a63c6e 100644 (file)
@@ -1133,6 +1133,8 @@ static const struct nla_policy ifla_vf_policy[IFLA_VF_MAX+1] = {
                                    .len = sizeof(struct ifla_vf_vlan) },
        [IFLA_VF_TX_RATE]       = { .type = NLA_BINARY,
                                    .len = sizeof(struct ifla_vf_tx_rate) },
+       [IFLA_VF_SPOOFCHK]      = { .type = NLA_BINARY,
+                                   .len = sizeof(struct ifla_vf_spoofchk) },
 };
 
 static const struct nla_policy ifla_port_policy[IFLA_PORT_MAX+1] = {
@@ -2019,8 +2021,13 @@ static int rtnetlink_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh)
 
                __rtnl_unlock();
                rtnl = net->rtnl;
-               err = netlink_dump_start(rtnl, skb, nlh, dumpit,
-                                        NULL, min_dump_alloc);
+               {
+                       struct netlink_dump_control c = {
+                               .dump           = dumpit,
+                               .min_dump_alloc = min_dump_alloc,
+                       };
+                       err = netlink_dump_start(rtnl, skb, nlh, &c);
+               }
                rtnl_lock();
                return err;
        }
index da0c97f..6eb656a 100644 (file)
@@ -592,6 +592,7 @@ static void __copy_skb_header(struct sk_buff *new, const struct sk_buff *old)
        new->rxhash             = old->rxhash;
        new->ooo_okay           = old->ooo_okay;
        new->l4_rxhash          = old->l4_rxhash;
+       new->no_fcs             = old->no_fcs;
 #ifdef CONFIG_XFRM
        new->sp                 = secpath_get(old->sp);
 #endif
@@ -2906,7 +2907,7 @@ int skb_gro_receive(struct sk_buff **head, struct sk_buff *skb)
        nskb->prev = p;
 
        nskb->data_len += p->len;
-       nskb->truesize += p->len;
+       nskb->truesize += p->truesize;
        nskb->len += p->len;
 
        *head = nskb;
@@ -2916,6 +2917,7 @@ int skb_gro_receive(struct sk_buff **head, struct sk_buff *skb)
        p = nskb;
 
 merge:
+       p->truesize += skb->truesize - len;
        if (offset > headlen) {
                unsigned int eat = offset - headlen;
 
index 02f8dfe..216719c 100644 (file)
@@ -793,6 +793,17 @@ set_rcvbuf:
                sock_valbool_flag(sk, SOCK_WIFI_STATUS, valbool);
                break;
 
+       case SO_PEEK_OFF:
+               if (sock->ops->set_peek_off)
+                       sock->ops->set_peek_off(sk, val);
+               else
+                       ret = -EOPNOTSUPP;
+               break;
+
+       case SO_NOFCS:
+               sock_valbool_flag(sk, SOCK_NOFCS, valbool);
+               break;
+
        default:
                ret = -ENOPROTOOPT;
                break;
@@ -1018,6 +1029,15 @@ int sock_getsockopt(struct socket *sock, int level, int optname,
                v.val = !!sock_flag(sk, SOCK_WIFI_STATUS);
                break;
 
+       case SO_PEEK_OFF:
+               if (!sock->ops->set_peek_off)
+                       return -EOPNOTSUPP;
+
+               v.val = sk->sk_peek_off;
+               break;
+       case SO_NOFCS:
+               v.val = !!sock_flag(sk, SOCK_NOFCS);
+               break;
        default:
                return -ENOPROTOOPT;
        }
@@ -2092,6 +2112,7 @@ void sock_init_data(struct socket *sock, struct sock *sk)
 
        sk->sk_sndmsg_page      =       NULL;
        sk->sk_sndmsg_off       =       0;
+       sk->sk_peek_off         =       -1;
 
        sk->sk_peer_pid         =       NULL;
        sk->sk_peer_cred        =       NULL;
index 5606273..70bfaf2 100644 (file)
@@ -98,6 +98,7 @@ static void ccid3_update_send_interval(struct ccid3_hc_tx_sock *hc)
 {
        hc->tx_t_ipi = scaled_div32(((u64)hc->tx_s) << 6, hc->tx_x);
 
+       DCCP_BUG_ON(hc->tx_t_ipi == 0);
        ccid3_pr_debug("t_ipi=%u, s=%u, X=%u\n", hc->tx_t_ipi,
                       hc->tx_s, (unsigned)(hc->tx_x >> 6));
 }
@@ -236,8 +237,6 @@ static void ccid3_hc_tx_no_feedback_timer(unsigned long data)
                 *
                 *  Note that X_recv is scaled by 2^6 while X_calc is not
                 */
-               BUG_ON(hc->tx_p && !hc->tx_x_calc);
-
                if (hc->tx_x_calc > (hc->tx_x_recv >> 5))
                        hc->tx_x_recv =
                                max(hc->tx_x_recv / 2,
index 1c67fe8..caf6e17 100644 (file)
@@ -300,7 +300,8 @@ static void dccp_v4_err(struct sk_buff *skb, u32 info)
                 */
                WARN_ON(req->sk);
 
-               if (seq != dccp_rsk(req)->dreq_iss) {
+               if (!between48(seq, dccp_rsk(req)->dreq_iss,
+                                   dccp_rsk(req)->dreq_gss)) {
                        NET_INC_STATS_BH(net, LINUX_MIB_OUTOFWINDOWICMPS);
                        goto out;
                }
@@ -639,11 +640,12 @@ int dccp_v4_conn_request(struct sock *sk, struct sk_buff *skb)
         *
         * Set S.ISR, S.GSR, S.SWL, S.SWH from packet or Init Cookie
         *
-        * In fact we defer setting S.GSR, S.SWL, S.SWH to
-        * dccp_create_openreq_child.
+        * Setting S.SWL/S.SWH to is deferred to dccp_create_openreq_child().
         */
        dreq->dreq_isr     = dcb->dccpd_seq;
+       dreq->dreq_gsr     = dreq->dreq_isr;
        dreq->dreq_iss     = dccp_v4_init_sequence(skb);
+       dreq->dreq_gss     = dreq->dreq_iss;
        dreq->dreq_service = service;
 
        if (dccp_v4_send_response(sk, req, NULL))
index ce903f7..4dc588f 100644 (file)
@@ -193,7 +193,8 @@ static void dccp_v6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
                 */
                WARN_ON(req->sk != NULL);
 
-               if (seq != dccp_rsk(req)->dreq_iss) {
+               if (!between48(seq, dccp_rsk(req)->dreq_iss,
+                                   dccp_rsk(req)->dreq_gss)) {
                        NET_INC_STATS_BH(net, LINUX_MIB_OUTOFWINDOWICMPS);
                        goto out;
                }
@@ -440,11 +441,12 @@ static int dccp_v6_conn_request(struct sock *sk, struct sk_buff *skb)
         *
         *   Set S.ISR, S.GSR, S.SWL, S.SWH from packet or Init Cookie
         *
-        *   In fact we defer setting S.GSR, S.SWL, S.SWH to
-        *   dccp_create_openreq_child.
+        * Setting S.SWL/S.SWH to is deferred to dccp_create_openreq_child().
         */
        dreq->dreq_isr     = dcb->dccpd_seq;
+       dreq->dreq_gsr     = dreq->dreq_isr;
        dreq->dreq_iss     = dccp_v6_init_sequence(skb);
+       dreq->dreq_gss     = dreq->dreq_iss;
        dreq->dreq_service = service;
 
        if (dccp_v6_send_response(sk, req, NULL))
index 5a7f90b..ea850ce 100644 (file)
@@ -127,9 +127,11 @@ struct sock *dccp_create_openreq_child(struct sock *sk,
                 *    activation below, as these windows all depend on the local
                 *    and remote Sequence Window feature values (7.5.2).
                 */
-               newdp->dccps_gss = newdp->dccps_iss = dreq->dreq_iss;
+               newdp->dccps_iss = dreq->dreq_iss;
+               newdp->dccps_gss = dreq->dreq_gss;
                newdp->dccps_gar = newdp->dccps_iss;
-               newdp->dccps_gsr = newdp->dccps_isr = dreq->dreq_isr;
+               newdp->dccps_isr = dreq->dreq_isr;
+               newdp->dccps_gsr = dreq->dreq_gsr;
 
                /*
                 * Activate features: initialise CCIDs, sequence windows etc.
@@ -164,9 +166,9 @@ struct sock *dccp_check_req(struct sock *sk, struct sk_buff *skb,
        /* Check for retransmitted REQUEST */
        if (dccp_hdr(skb)->dccph_type == DCCP_PKT_REQUEST) {
 
-               if (after48(DCCP_SKB_CB(skb)->dccpd_seq, dreq->dreq_isr)) {
+               if (after48(DCCP_SKB_CB(skb)->dccpd_seq, dreq->dreq_gsr)) {
                        dccp_pr_debug("Retransmitted REQUEST\n");
-                       dreq->dreq_isr = DCCP_SKB_CB(skb)->dccpd_seq;
+                       dreq->dreq_gsr = DCCP_SKB_CB(skb)->dccpd_seq;
                        /*
                         * Send another RESPONSE packet
                         * To protect against Request floods, increment retrans
@@ -186,12 +188,14 @@ struct sock *dccp_check_req(struct sock *sk, struct sk_buff *skb,
                goto drop;
 
        /* Invalid ACK */
-       if (DCCP_SKB_CB(skb)->dccpd_ack_seq != dreq->dreq_iss) {
+       if (!between48(DCCP_SKB_CB(skb)->dccpd_ack_seq,
+                               dreq->dreq_iss, dreq->dreq_gss)) {
                dccp_pr_debug("Invalid ACK number: ack_seq=%llu, "
-                             "dreq_iss=%llu\n",
+                             "dreq_iss=%llu, dreq_gss=%llu\n",
                              (unsigned long long)
                              DCCP_SKB_CB(skb)->dccpd_ack_seq,
-                             (unsigned long long) dreq->dreq_iss);
+                             (unsigned long long) dreq->dreq_iss,
+                             (unsigned long long) dreq->dreq_gss);
                goto drop;
        }
 
index dede3ed..7873673 100644 (file)
@@ -408,10 +408,10 @@ struct sk_buff *dccp_make_response(struct sock *sk, struct dst_entry *dst,
        skb_dst_set(skb, dst_clone(dst));
 
        dreq = dccp_rsk(req);
-       if (inet_rsk(req)->acked)       /* increase ISS upon retransmission */
-               dccp_inc_seqno(&dreq->dreq_iss);
+       if (inet_rsk(req)->acked)       /* increase GSS upon retransmission */
+               dccp_inc_seqno(&dreq->dreq_gss);
        DCCP_SKB_CB(skb)->dccpd_type = DCCP_PKT_RESPONSE;
-       DCCP_SKB_CB(skb)->dccpd_seq  = dreq->dreq_iss;
+       DCCP_SKB_CB(skb)->dccpd_seq  = dreq->dreq_gss;
 
        /* Resolve feature dependencies resulting from choice of CCID */
        if (dccp_feat_server_ccid_dependencies(dreq))
@@ -429,8 +429,8 @@ struct sk_buff *dccp_make_response(struct sock *sk, struct dst_entry *dst,
                           DCCP_SKB_CB(skb)->dccpd_opt_len) / 4;
        dh->dccph_type  = DCCP_PKT_RESPONSE;
        dh->dccph_x     = 1;
-       dccp_hdr_set_seq(dh, dreq->dreq_iss);
-       dccp_hdr_set_ack(dccp_hdr_ack_bits(skb), dreq->dreq_isr);
+       dccp_hdr_set_seq(dh, dreq->dreq_gss);
+       dccp_hdr_set_ack(dccp_hdr_ack_bits(skb), dreq->dreq_gsr);
        dccp_hdr_response(skb)->dccph_resp_service = dreq->dreq_service;
 
        dccp_csum_outgoing(skb);
index befe426..ee7013f 100644 (file)
@@ -205,17 +205,23 @@ static int dn_neigh_output_packet(struct sk_buff *skb)
        struct neighbour *neigh = dst_get_neighbour_noref(dst);
        struct net_device *dev = neigh->dev;
        char mac_addr[ETH_ALEN];
+       unsigned int seq;
+       int err;
 
        dn_dn2eth(mac_addr, rt->rt_local_src);
-       if (dev_hard_header(skb, dev, ntohs(skb->protocol), neigh->ha,
-                           mac_addr, skb->len) >= 0)
-               return dev_queue_xmit(skb);
-
-       if (net_ratelimit())
-               printk(KERN_DEBUG "dn_neigh_output_packet: oops, can't send packet\n");
-
-       kfree_skb(skb);
-       return -EINVAL;
+       do {
+               seq = read_seqbegin(&neigh->ha_lock);
+               err = dev_hard_header(skb, dev, ntohs(skb->protocol),
+                                     neigh->ha, mac_addr, skb->len);
+       } while (read_seqretry(&neigh->ha_lock, seq));
+
+       if (err >= 0)
+               err = dev_queue_xmit(skb);
+       else {
+               kfree_skb(skb);
+               err = -EINVAL;
+       }
+       return err;
 }
 
 static int dn_long_output(struct neighbour *neigh, struct sk_buff *skb)
index f31ce72..80a3de4 100644 (file)
@@ -724,11 +724,10 @@ static int dn_output(struct sk_buff *skb)
        struct dn_route *rt = (struct dn_route *)dst;
        struct net_device *dev = dst->dev;
        struct dn_skb_cb *cb = DN_SKB_CB(skb);
-       struct neighbour *neigh;
 
        int err = -EINVAL;
 
-       if ((neigh = dst_get_neighbour_noref(dst)) == NULL)
+       if (dst_get_neighbour_noref(dst) == NULL)
                goto error;
 
        skb->dev = dev;
index a246836..a93af86 100644 (file)
@@ -288,6 +288,8 @@ int eth_mac_addr(struct net_device *dev, void *p)
        if (!is_valid_ether_addr(addr->sa_data))
                return -EADDRNOTAVAIL;
        memcpy(dev->dev_addr, addr->sa_data, ETH_ALEN);
+       /* if device marked as NET_ADDR_RANDOM, reset it */
+       dev->addr_assign_type &= ~NET_ADDR_RANDOM;
        return 0;
 }
 EXPORT_SYMBOL(eth_mac_addr);
index e4ecc1e..3685158 100644 (file)
@@ -55,6 +55,7 @@
 #include <linux/module.h>
 #include <linux/moduleparam.h>
 #include <linux/netdevice.h>
+#include <linux/etherdevice.h>
 #include <net/af_ieee802154.h>
 #include <net/ieee802154.h>
 #include <net/ieee802154_netdev.h>
@@ -924,19 +925,6 @@ drop:
        return -EINVAL;
 }
 
-static int lowpan_set_address(struct net_device *dev, void *p)
-{
-       struct sockaddr *sa = p;
-
-       if (netif_running(dev))
-               return -EBUSY;
-
-       /* TODO: validate addr */
-       memcpy(dev->dev_addr, sa->sa_data, dev->addr_len);
-
-       return 0;
-}
-
 static int lowpan_get_mac_header_length(struct sk_buff *skb)
 {
        /*
@@ -1062,7 +1050,7 @@ static struct header_ops lowpan_header_ops = {
 
 static const struct net_device_ops lowpan_netdev_ops = {
        .ndo_start_xmit         = lowpan_xmit,
-       .ndo_set_mac_address    = lowpan_set_address,
+       .ndo_set_mac_address    = eth_mac_addr,
 };
 
 static void lowpan_setup(struct net_device *dev)
index f7b5670..e588a34 100644 (file)
@@ -381,6 +381,7 @@ lookup_protocol:
        inet->mc_all    = 1;
        inet->mc_index  = 0;
        inet->mc_list   = NULL;
+       inet->rcv_tos   = 0;
 
        sk_refcnt_debug_inc(sk);
 
index fcf2818..8d25a1c 100644 (file)
@@ -960,9 +960,12 @@ static int inet_diag_rcv_msg_compat(struct sk_buff *skb, struct nlmsghdr *nlh)
                            inet_diag_bc_audit(nla_data(attr), nla_len(attr)))
                                return -EINVAL;
                }
-
-               return netlink_dump_start(sock_diag_nlsk, skb, nlh,
-                                         inet_diag_dump_compat, NULL, 0);
+               {
+                       struct netlink_dump_control c = {
+                               .dump = inet_diag_dump_compat,
+                       };
+                       return netlink_dump_start(sock_diag_nlsk, skb, nlh, &c);
+               }
        }
 
        return inet_diag_get_exact_compat(skb, nlh);
@@ -985,9 +988,12 @@ static int inet_diag_handler_dump(struct sk_buff *skb, struct nlmsghdr *h)
                            inet_diag_bc_audit(nla_data(attr), nla_len(attr)))
                                return -EINVAL;
                }
-
-               return netlink_dump_start(sock_diag_nlsk, skb, h,
-                                         inet_diag_dump, NULL, 0);
+               {
+                       struct netlink_dump_control c = {
+                               .dump = inet_diag_dump,
+                       };
+                       return netlink_dump_start(sock_diag_nlsk, skb, h, &c);
+               }
        }
 
        return inet_diag_get_exact(skb, h, (struct inet_diag_req_v2 *)NLMSG_DATA(h));
index 38673d2..6ef66af 100644 (file)
@@ -730,15 +730,16 @@ static netdev_tx_t ipgre_tunnel_xmit(struct sk_buff *skb, struct net_device *dev
 
                if (skb->protocol == htons(ETH_P_IP)) {
                        rt = skb_rtable(skb);
-                       if ((dst = rt->rt_gateway) == 0)
-                               goto tx_error_icmp;
+                       dst = rt->rt_gateway;
                }
 #if IS_ENABLED(CONFIG_IPV6)
                else if (skb->protocol == htons(ETH_P_IPV6)) {
-                       struct neighbour *neigh = dst_get_neighbour_noref(skb_dst(skb));
                        const struct in6_addr *addr6;
+                       struct neighbour *neigh;
+                       bool do_tx_error_icmp;
                        int addr_type;
 
+                       neigh = dst_neigh_lookup(skb_dst(skb), &ipv6_hdr(skb)->daddr);
                        if (neigh == NULL)
                                goto tx_error;
 
@@ -751,9 +752,14 @@ static netdev_tx_t ipgre_tunnel_xmit(struct sk_buff *skb, struct net_device *dev
                        }
 
                        if ((addr_type & IPV6_ADDR_COMPATv4) == 0)
+                               do_tx_error_icmp = true;
+                       else {
+                               do_tx_error_icmp = false;
+                               dst = addr6->s6_addr32[3];
+                       }
+                       neigh_release(neigh);
+                       if (do_tx_error_icmp)
                                goto tx_error_icmp;
-
-                       dst = addr6->s6_addr32[3];
                }
 #endif
                else
@@ -914,9 +920,10 @@ static netdev_tx_t ipgre_tunnel_xmit(struct sk_buff *skb, struct net_device *dev
        __IPTUNNEL_XMIT(tstats, &dev->stats);
        return NETDEV_TX_OK;
 
+#if IS_ENABLED(CONFIG_IPV6)
 tx_error_icmp:
        dst_link_failure(skb);
-
+#endif
 tx_error:
        dev->stats.tx_errors++;
        dev_kfree_skb(skb);
@@ -1529,7 +1536,7 @@ static int ipgre_newlink(struct net *src_net, struct net_device *dev, struct nla
                return -EEXIST;
 
        if (dev->type == ARPHRD_ETHER && !tb[IFLA_ADDRESS])
-               random_ether_addr(dev->dev_addr);
+               eth_hw_addr_random(dev);
 
        mtu = ipgre_tunnel_bind_dev(dev);
        if (!tb[IFLA_MTU])
index 8aa87c1..ca50d9f 100644 (file)
@@ -469,6 +469,7 @@ static int do_ip_setsockopt(struct sock *sk, int level,
                             (1<<IP_ROUTER_ALERT) | (1<<IP_FREEBIND) |
                             (1<<IP_PASSSEC) | (1<<IP_TRANSPARENT) |
                             (1<<IP_MINTTL) | (1<<IP_NODEFRAG))) ||
+           optname == IP_UNICAST_IF ||
            optname == IP_MULTICAST_TTL ||
            optname == IP_MULTICAST_ALL ||
            optname == IP_MULTICAST_LOOP ||
@@ -628,6 +629,35 @@ static int do_ip_setsockopt(struct sock *sk, int level,
                        goto e_inval;
                inet->mc_loop = !!val;
                break;
+       case IP_UNICAST_IF:
+       {
+               struct net_device *dev = NULL;
+               int ifindex;
+
+               if (optlen != sizeof(int))
+                       goto e_inval;
+
+               ifindex = (__force int)ntohl((__force __be32)val);
+               if (ifindex == 0) {
+                       inet->uc_index = 0;
+                       err = 0;
+                       break;
+               }
+
+               dev = dev_get_by_index(sock_net(sk), ifindex);
+               err = -EADDRNOTAVAIL;
+               if (!dev)
+                       break;
+               dev_put(dev);
+
+               err = -EINVAL;
+               if (sk->sk_bound_dev_if)
+                       break;
+
+               inet->uc_index = ifindex;
+               err = 0;
+               break;
+       }
        case IP_MULTICAST_IF:
        {
                struct ip_mreqn mreq;
@@ -1178,6 +1208,9 @@ static int do_ip_getsockopt(struct sock *sk, int level, int optname,
        case IP_MULTICAST_LOOP:
                val = inet->mc_loop;
                break;
+       case IP_UNICAST_IF:
+               val = (__force int)htonl((__u32) inet->uc_index);
+               break;
        case IP_MULTICAST_IF:
        {
                struct in_addr addr;
@@ -1256,6 +1289,10 @@ static int do_ip_getsockopt(struct sock *sk, int level, int optname,
                        int hlim = inet->mc_ttl;
                        put_cmsg(&msg, SOL_IP, IP_TTL, sizeof(hlim), &hlim);
                }
+               if (inet->cmsg_flags & IP_CMSG_TOS) {
+                       int tos = inet->rcv_tos;
+                       put_cmsg(&msg, SOL_IP, IP_TOS, sizeof(tos), &tos);
+               }
                len -= msg.msg_controllen;
                return put_user(len, optlen);
        }
index 22a1993..f84ebff 100644 (file)
@@ -454,8 +454,7 @@ static netdev_tx_t ipip_tunnel_xmit(struct sk_buff *skb, struct net_device *dev)
                        dev->stats.tx_fifo_errors++;
                        goto tx_error;
                }
-               if ((dst = rt->rt_gateway) == 0)
-                       goto tx_error_icmp;
+               dst = rt->rt_gateway;
        }
 
        rt = ip_route_output_ports(dev_net(dev), &fl4, NULL,
index b072386..4398a45 100644 (file)
@@ -556,7 +556,8 @@ static int ping_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,
                        ipc.oif = inet->mc_index;
                if (!saddr)
                        saddr = inet->mc_addr;
-       }
+       } else if (!ipc.oif)
+               ipc.oif = inet->uc_index;
 
        flowi4_init_output(&fl4, ipc.oif, sk->sk_mark, tos,
                           RT_SCOPE_UNIVERSE, sk->sk_protocol,
index 6afc807..02d6107 100644 (file)
@@ -256,6 +256,7 @@ static const struct snmp_mib snmp4_net_list[] = {
        SNMP_MIB_ITEM("TCPTimeWaitOverflow", LINUX_MIB_TCPTIMEWAITOVERFLOW),
        SNMP_MIB_ITEM("TCPReqQFullDoCookies", LINUX_MIB_TCPREQQFULLDOCOOKIES),
        SNMP_MIB_ITEM("TCPReqQFullDrop", LINUX_MIB_TCPREQQFULLDROP),
+       SNMP_MIB_ITEM("TCPRetransFail", LINUX_MIB_TCPRETRANSFAIL),
        SNMP_MIB_SENTINEL
 };
 
index 3ccda5a..ab46630 100644 (file)
@@ -563,7 +563,8 @@ static int raw_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,
                        ipc.oif = inet->mc_index;
                if (!saddr)
                        saddr = inet->mc_addr;
-       }
+       } else if (!ipc.oif)
+               ipc.oif = inet->uc_index;
 
        flowi4_init_output(&fl4, ipc.oif, sk->sk_mark, tos,
                           RT_SCOPE_UNIVERSE,
index bcacf54..0489ced 100644 (file)
@@ -1117,12 +1117,17 @@ static struct neighbour *ipv4_neigh_lookup(const struct dst_entry *dst, const vo
        static const __be32 inaddr_any = 0;
        struct net_device *dev = dst->dev;
        const __be32 *pkey = daddr;
+       const struct rtable *rt;
        struct neighbour *n;
 
+       rt = (const struct rtable *) dst;
+
        if (dev->flags & (IFF_LOOPBACK | IFF_POINTOPOINT))
                pkey = &inaddr_any;
+       else if (rt->rt_gateway)
+               pkey = (const __be32 *) &rt->rt_gateway;
 
-       n = __ipv4_neigh_lookup(&arp_tbl, dev, *(__force u32 *)pkey);
+       n = __ipv4_neigh_lookup(dev, *(__force u32 *)pkey);
        if (n)
                return n;
        return neigh_create(&arp_tbl, pkey, dev);
index 94d683a..94abee8 100644 (file)
@@ -90,16 +90,8 @@ EXPORT_SYMBOL(sysctl_tcp_low_latency);
 
 
 #ifdef CONFIG_TCP_MD5SIG
-static struct tcp_md5sig_key *tcp_v4_md5_do_lookup(struct sock *sk,
-                                                  __be32 addr);
-static int tcp_v4_md5_hash_hdr(char *md5_hash, struct tcp_md5sig_key *key,
+static int tcp_v4_md5_hash_hdr(char *md5_hash, const struct tcp_md5sig_key *key,
                               __be32 daddr, __be32 saddr, const struct tcphdr *th);
-#else
-static inline
-struct tcp_md5sig_key *tcp_v4_md5_do_lookup(struct sock *sk, __be32 addr)
-{
-       return NULL;
-}
 #endif
 
 struct inet_hashinfo tcp_hashinfo;
@@ -601,6 +593,10 @@ static void tcp_v4_send_reset(struct sock *sk, struct sk_buff *skb)
        struct ip_reply_arg arg;
 #ifdef CONFIG_TCP_MD5SIG
        struct tcp_md5sig_key *key;
+       const __u8 *hash_location = NULL;
+       unsigned char newhash[16];
+       int genhash;
+       struct sock *sk1 = NULL;
 #endif
        struct net *net;
 
@@ -631,7 +627,36 @@ static void tcp_v4_send_reset(struct sock *sk, struct sk_buff *skb)
        arg.iov[0].iov_len  = sizeof(rep.th);
 
 #ifdef CONFIG_TCP_MD5SIG
-       key = sk ? tcp_v4_md5_do_lookup(sk, ip_hdr(skb)->saddr) : NULL;
+       hash_location = tcp_parse_md5sig_option(th);
+       if (!sk && hash_location) {
+               /*
+                * active side is lost. Try to find listening socket through
+                * source port, and then find md5 key through listening socket.
+                * we are not loose security here:
+                * Incoming packet is checked with md5 hash with finding key,
+                * no RST generated if md5 hash doesn't match.
+                */
+               sk1 = __inet_lookup_listener(dev_net(skb_dst(skb)->dev),
+                                            &tcp_hashinfo, ip_hdr(skb)->daddr,
+                                            ntohs(th->source), inet_iif(skb));
+               /* don't send rst if it can't find key */
+               if (!sk1)
+                       return;
+               rcu_read_lock();
+               key = tcp_md5_do_lookup(sk1, (union tcp_md5_addr *)
+                                       &ip_hdr(skb)->saddr, AF_INET);
+               if (!key)
+                       goto release_sk1;
+
+               genhash = tcp_v4_md5_hash_skb(newhash, key, NULL, NULL, skb);
+               if (genhash || memcmp(hash_location, newhash, 16) != 0)
+                       goto release_sk1;
+       } else {
+               key = sk ? tcp_md5_do_lookup(sk, (union tcp_md5_addr *)
+                                            &ip_hdr(skb)->saddr,
+                                            AF_INET) : NULL;
+       }
+
        if (key) {
                rep.opt[0] = htonl((TCPOPT_NOP << 24) |
                                   (TCPOPT_NOP << 16) |
@@ -664,6 +689,14 @@ static void tcp_v4_send_reset(struct sock *sk, struct sk_buff *skb)
 
        TCP_INC_STATS_BH(net, TCP_MIB_OUTSEGS);
        TCP_INC_STATS_BH(net, TCP_MIB_OUTRSTS);
+
+#ifdef CONFIG_TCP_MD5SIG
+release_sk1:
+       if (sk1) {
+               rcu_read_unlock();
+               sock_put(sk1);
+       }
+#endif
 }
 
 /* The code following below sending ACKs in SYN-RECV and TIME-WAIT states
@@ -764,7 +797,8 @@ static void tcp_v4_reqsk_send_ack(struct sock *sk, struct sk_buff *skb,
                        tcp_rsk(req)->rcv_isn + 1, req->rcv_wnd,
                        req->ts_recent,
                        0,
-                       tcp_v4_md5_do_lookup(sk, ip_hdr(skb)->daddr),
+                       tcp_md5_do_lookup(sk, (union tcp_md5_addr *)&ip_hdr(skb)->daddr,
+                                         AF_INET),
                        inet_rsk(req)->no_srccheck ? IP_REPLY_ARG_NOSRCCHECK : 0,
                        ip_hdr(skb)->tos);
 }
@@ -881,153 +915,137 @@ static struct ip_options_rcu *tcp_v4_save_options(struct sock *sk,
  */
 
 /* Find the Key structure for an address.  */
-static struct tcp_md5sig_key *
-                       tcp_v4_md5_do_lookup(struct sock *sk, __be32 addr)
+struct tcp_md5sig_key *tcp_md5_do_lookup(struct sock *sk,
+                                        const union tcp_md5_addr *addr,
+                                        int family)
 {
        struct tcp_sock *tp = tcp_sk(sk);
-       int i;
-
-       if (!tp->md5sig_info || !tp->md5sig_info->entries4)
+       struct tcp_md5sig_key *key;
+       struct hlist_node *pos;
+       unsigned int size = sizeof(struct in_addr);
+       struct tcp_md5sig_info *md5sig;
+
+       /* caller either holds rcu_read_lock() or socket lock */
+       md5sig = rcu_dereference_check(tp->md5sig_info,
+                                      sock_owned_by_user(sk));
+       if (!md5sig)
                return NULL;
-       for (i = 0; i < tp->md5sig_info->entries4; i++) {
-               if (tp->md5sig_info->keys4[i].addr == addr)
-                       return &tp->md5sig_info->keys4[i].base;
+#if IS_ENABLED(CONFIG_IPV6)
+       if (family == AF_INET6)
+               size = sizeof(struct in6_addr);
+#endif
+       hlist_for_each_entry_rcu(key, pos, &md5sig->head, node) {
+               if (key->family != family)
+                       continue;
+               if (!memcmp(&key->addr, addr, size))
+                       return key;
        }
        return NULL;
 }
+EXPORT_SYMBOL(tcp_md5_do_lookup);
 
 struct tcp_md5sig_key *tcp_v4_md5_lookup(struct sock *sk,
                                         struct sock *addr_sk)
 {
-       return tcp_v4_md5_do_lookup(sk, inet_sk(addr_sk)->inet_daddr);
+       union tcp_md5_addr *addr;
+
+       addr = (union tcp_md5_addr *)&inet_sk(addr_sk)->inet_daddr;
+       return tcp_md5_do_lookup(sk, addr, AF_INET);
 }
 EXPORT_SYMBOL(tcp_v4_md5_lookup);
 
 static struct tcp_md5sig_key *tcp_v4_reqsk_md5_lookup(struct sock *sk,
                                                      struct request_sock *req)
 {
-       return tcp_v4_md5_do_lookup(sk, inet_rsk(req)->rmt_addr);
+       union tcp_md5_addr *addr;
+
+       addr = (union tcp_md5_addr *)&inet_rsk(req)->rmt_addr;
+       return tcp_md5_do_lookup(sk, addr, AF_INET);
 }
 
 /* This can be called on a newly created socket, from other files */
-int tcp_v4_md5_do_add(struct sock *sk, __be32 addr,
-                     u8 *newkey, u8 newkeylen)
+int tcp_md5_do_add(struct sock *sk, const union tcp_md5_addr *addr,
+                  int family, const u8 *newkey, u8 newkeylen, gfp_t gfp)
 {
        /* Add Key to the list */
        struct tcp_md5sig_key *key;
        struct tcp_sock *tp = tcp_sk(sk);
-       struct tcp4_md5sig_key *keys;
+       struct tcp_md5sig_info *md5sig;
 
-       key = tcp_v4_md5_do_lookup(sk, addr);
+       key = tcp_md5_do_lookup(sk, (union tcp_md5_addr *)&addr, AF_INET);
        if (key) {
                /* Pre-existing entry - just update that one. */
-               kfree(key->key);
-               key->key = newkey;
+               memcpy(key->key, newkey, newkeylen);
                key->keylen = newkeylen;
-       } else {
-               struct tcp_md5sig_info *md5sig;
-
-               if (!tp->md5sig_info) {
-                       tp->md5sig_info = kzalloc(sizeof(*tp->md5sig_info),
-                                                 GFP_ATOMIC);
-                       if (!tp->md5sig_info) {
-                               kfree(newkey);
-                               return -ENOMEM;
-                       }
-                       sk_nocaps_add(sk, NETIF_F_GSO_MASK);
-               }
+               return 0;
+       }
 
-               md5sig = tp->md5sig_info;
-               if (md5sig->entries4 == 0 &&
-                   tcp_alloc_md5sig_pool(sk) == NULL) {
-                       kfree(newkey);
+       md5sig = rcu_dereference_protected(tp->md5sig_info,
+                                          sock_owned_by_user(sk));
+       if (!md5sig) {
+               md5sig = kmalloc(sizeof(*md5sig), gfp);
+               if (!md5sig)
                        return -ENOMEM;
-               }
-
-               if (md5sig->alloced4 == md5sig->entries4) {
-                       keys = kmalloc((sizeof(*keys) *
-                                       (md5sig->entries4 + 1)), GFP_ATOMIC);
-                       if (!keys) {
-                               kfree(newkey);
-                               if (md5sig->entries4 == 0)
-                                       tcp_free_md5sig_pool();
-                               return -ENOMEM;
-                       }
 
-                       if (md5sig->entries4)
-                               memcpy(keys, md5sig->keys4,
-                                      sizeof(*keys) * md5sig->entries4);
+               sk_nocaps_add(sk, NETIF_F_GSO_MASK);
+               INIT_HLIST_HEAD(&md5sig->head);
+               rcu_assign_pointer(tp->md5sig_info, md5sig);
+       }
 
-                       /* Free old key list, and reference new one */
-                       kfree(md5sig->keys4);
-                       md5sig->keys4 = keys;
-                       md5sig->alloced4++;
-               }
-               md5sig->entries4++;
-               md5sig->keys4[md5sig->entries4 - 1].addr        = addr;
-               md5sig->keys4[md5sig->entries4 - 1].base.key    = newkey;
-               md5sig->keys4[md5sig->entries4 - 1].base.keylen = newkeylen;
+       key = sock_kmalloc(sk, sizeof(*key), gfp);
+       if (!key)
+               return -ENOMEM;
+       if (hlist_empty(&md5sig->head) && !tcp_alloc_md5sig_pool(sk)) {
+               sock_kfree_s(sk, key, sizeof(*key));
+               return -ENOMEM;
        }
-       return 0;
-}
-EXPORT_SYMBOL(tcp_v4_md5_do_add);
 
-static int tcp_v4_md5_add_func(struct sock *sk, struct sock *addr_sk,
-                              u8 *newkey, u8 newkeylen)
-{
-       return tcp_v4_md5_do_add(sk, inet_sk(addr_sk)->inet_daddr,
-                                newkey, newkeylen);
+       memcpy(key->key, newkey, newkeylen);
+       key->keylen = newkeylen;
+       key->family = family;
+       memcpy(&key->addr, addr,
+              (family == AF_INET6) ? sizeof(struct in6_addr) :
+                                     sizeof(struct in_addr));
+       hlist_add_head_rcu(&key->node, &md5sig->head);
+       return 0;
 }
+EXPORT_SYMBOL(tcp_md5_do_add);
 
-int tcp_v4_md5_do_del(struct sock *sk, __be32 addr)
+int tcp_md5_do_del(struct sock *sk, const union tcp_md5_addr *addr, int family)
 {
        struct tcp_sock *tp = tcp_sk(sk);
-       int i;
-
-       for (i = 0; i < tp->md5sig_info->entries4; i++) {
-               if (tp->md5sig_info->keys4[i].addr == addr) {
-                       /* Free the key */
-                       kfree(tp->md5sig_info->keys4[i].base.key);
-                       tp->md5sig_info->entries4--;
-
-                       if (tp->md5sig_info->entries4 == 0) {
-                               kfree(tp->md5sig_info->keys4);
-                               tp->md5sig_info->keys4 = NULL;
-                               tp->md5sig_info->alloced4 = 0;
-                               tcp_free_md5sig_pool();
-                       } else if (tp->md5sig_info->entries4 != i) {
-                               /* Need to do some manipulation */
-                               memmove(&tp->md5sig_info->keys4[i],
-                                       &tp->md5sig_info->keys4[i+1],
-                                       (tp->md5sig_info->entries4 - i) *
-                                        sizeof(struct tcp4_md5sig_key));
-                       }
-                       return 0;
-               }
-       }
-       return -ENOENT;
+       struct tcp_md5sig_key *key;
+       struct tcp_md5sig_info *md5sig;
+
+       key = tcp_md5_do_lookup(sk, (union tcp_md5_addr *)&addr, AF_INET);
+       if (!key)
+               return -ENOENT;
+       hlist_del_rcu(&key->node);
+       atomic_sub(sizeof(*key), &sk->sk_omem_alloc);
+       kfree_rcu(key, rcu);
+       md5sig = rcu_dereference_protected(tp->md5sig_info,
+                                          sock_owned_by_user(sk));
+       if (hlist_empty(&md5sig->head))
+               tcp_free_md5sig_pool();
+       return 0;
 }
-EXPORT_SYMBOL(tcp_v4_md5_do_del);
+EXPORT_SYMBOL(tcp_md5_do_del);
 
-static void tcp_v4_clear_md5_list(struct sock *sk)
+void tcp_clear_md5_list(struct sock *sk)
 {
        struct tcp_sock *tp = tcp_sk(sk);
+       struct tcp_md5sig_key *key;
+       struct hlist_node *pos, *n;
+       struct tcp_md5sig_info *md5sig;
 
-       /* Free each key, then the set of key keys,
-        * the crypto element, and then decrement our
-        * hold on the last resort crypto.
-        */
-       if (tp->md5sig_info->entries4) {
-               int i;
-               for (i = 0; i < tp->md5sig_info->entries4; i++)
-                       kfree(tp->md5sig_info->keys4[i].base.key);
-               tp->md5sig_info->entries4 = 0;
+       md5sig = rcu_dereference_protected(tp->md5sig_info, 1);
+
+       if (!hlist_empty(&md5sig->head))
                tcp_free_md5sig_pool();
-       }
-       if (tp->md5sig_info->keys4) {
-               kfree(tp->md5sig_info->keys4);
-               tp->md5sig_info->keys4 = NULL;
-               tp->md5sig_info->alloced4  = 0;
+       hlist_for_each_entry_safe(key, pos, n, &md5sig->head, node) {
+               hlist_del_rcu(&key->node);
+               atomic_sub(sizeof(*key), &sk->sk_omem_alloc);
+               kfree_rcu(key, rcu);
        }
 }
 
@@ -1036,7 +1054,6 @@ static int tcp_v4_parse_md5_keys(struct sock *sk, char __user *optval,
 {
        struct tcp_md5sig cmd;
        struct sockaddr_in *sin = (struct sockaddr_in *)&cmd.tcpm_addr;
-       u8 *newkey;
 
        if (optlen < sizeof(cmd))
                return -EINVAL;
@@ -1047,32 +1064,16 @@ static int tcp_v4_parse_md5_keys(struct sock *sk, char __user *optval,
        if (sin->sin_family != AF_INET)
                return -EINVAL;
 
-       if (!cmd.tcpm_key || !cmd.tcpm_keylen) {
-               if (!tcp_sk(sk)->md5sig_info)
-                       return -ENOENT;
-               return tcp_v4_md5_do_del(sk, sin->sin_addr.s_addr);
-       }
+       if (!cmd.tcpm_key || !cmd.tcpm_keylen)
+               return tcp_md5_do_del(sk, (union tcp_md5_addr *)&sin->sin_addr.s_addr,
+                                     AF_INET);
 
        if (cmd.tcpm_keylen > TCP_MD5SIG_MAXKEYLEN)
                return -EINVAL;
 
-       if (!tcp_sk(sk)->md5sig_info) {
-               struct tcp_sock *tp = tcp_sk(sk);
-               struct tcp_md5sig_info *p;
-
-               p = kzalloc(sizeof(*p), sk->sk_allocation);
-               if (!p)
-                       return -EINVAL;
-
-               tp->md5sig_info = p;
-               sk_nocaps_add(sk, NETIF_F_GSO_MASK);
-       }
-
-       newkey = kmemdup(cmd.tcpm_key, cmd.tcpm_keylen, sk->sk_allocation);
-       if (!newkey)
-               return -ENOMEM;
-       return tcp_v4_md5_do_add(sk, sin->sin_addr.s_addr,
-                                newkey, cmd.tcpm_keylen);
+       return tcp_md5_do_add(sk, (union tcp_md5_addr *)&sin->sin_addr.s_addr,
+                             AF_INET, cmd.tcpm_key, cmd.tcpm_keylen,
+                             GFP_KERNEL);
 }
 
 static int tcp_v4_md5_hash_pseudoheader(struct tcp_md5sig_pool *hp,
@@ -1098,7 +1099,7 @@ static int tcp_v4_md5_hash_pseudoheader(struct tcp_md5sig_pool *hp,
        return crypto_hash_update(&hp->md5_desc, &sg, sizeof(*bp));
 }
 
-static int tcp_v4_md5_hash_hdr(char *md5_hash, struct tcp_md5sig_key *key,
+static int tcp_v4_md5_hash_hdr(char *md5_hash, const struct tcp_md5sig_key *key,
                               __be32 daddr, __be32 saddr, const struct tcphdr *th)
 {
        struct tcp_md5sig_pool *hp;
@@ -1198,7 +1199,8 @@ static int tcp_v4_inbound_md5_hash(struct sock *sk, const struct sk_buff *skb)
        int genhash;
        unsigned char newhash[16];
 
-       hash_expected = tcp_v4_md5_do_lookup(sk, iph->saddr);
+       hash_expected = tcp_md5_do_lookup(sk, (union tcp_md5_addr *)&iph->saddr,
+                                         AF_INET);
        hash_location = tcp_parse_md5sig_option(th);
 
        /* We've parsed the options - do we have a hash? */
@@ -1461,6 +1463,7 @@ struct sock *tcp_v4_syn_recv_sock(struct sock *sk, struct sk_buff *skb,
        ireq->opt             = NULL;
        newinet->mc_index     = inet_iif(skb);
        newinet->mc_ttl       = ip_hdr(skb)->ttl;
+       newinet->rcv_tos      = ip_hdr(skb)->tos;
        inet_csk(newsk)->icsk_ext_hdr_len = 0;
        if (inet_opt)
                inet_csk(newsk)->icsk_ext_hdr_len = inet_opt->opt.optlen;
@@ -1486,7 +1489,8 @@ struct sock *tcp_v4_syn_recv_sock(struct sock *sk, struct sk_buff *skb,
 
 #ifdef CONFIG_TCP_MD5SIG
        /* Copy over the MD5 key from the original socket */
-       key = tcp_v4_md5_do_lookup(sk, newinet->inet_daddr);
+       key = tcp_md5_do_lookup(sk, (union tcp_md5_addr *)&newinet->inet_daddr,
+                               AF_INET);
        if (key != NULL) {
                /*
                 * We're using one, so create a matching key
@@ -1494,10 +1498,8 @@ struct sock *tcp_v4_syn_recv_sock(struct sock *sk, struct sk_buff *skb,
                 * memory, then we end up not copying the key
                 * across. Shucks.
                 */
-               char *newkey = kmemdup(key->key, key->keylen, GFP_ATOMIC);
-               if (newkey != NULL)
-                       tcp_v4_md5_do_add(newsk, newinet->inet_daddr,
-                                         newkey, key->keylen);
+               tcp_md5_do_add(newsk, (union tcp_md5_addr *)&newinet->inet_daddr,
+                              AF_INET, key->key, key->keylen, GFP_ATOMIC);
                sk_nocaps_add(newsk, NETIF_F_GSO_MASK);
        }
 #endif
@@ -1858,7 +1860,6 @@ EXPORT_SYMBOL(ipv4_specific);
 static const struct tcp_sock_af_ops tcp_sock_ipv4_specific = {
        .md5_lookup             = tcp_v4_md5_lookup,
        .calc_md5_hash          = tcp_v4_md5_hash_skb,
-       .md5_add                = tcp_v4_md5_add_func,
        .md5_parse              = tcp_v4_parse_md5_keys,
 };
 #endif
@@ -1947,8 +1948,8 @@ void tcp_v4_destroy_sock(struct sock *sk)
 #ifdef CONFIG_TCP_MD5SIG
        /* Clean up the MD5 key list, if any */
        if (tp->md5sig_info) {
-               tcp_v4_clear_md5_list(sk);
-               kfree(tp->md5sig_info);
+               tcp_clear_md5_list(sk);
+               kfree_rcu(tp->md5sig_info, rcu);
                tp->md5sig_info = NULL;
        }
 #endif
index 550e755..3cabafb 100644 (file)
@@ -359,13 +359,11 @@ void tcp_time_wait(struct sock *sk, int state, int timeo)
                 */
                do {
                        struct tcp_md5sig_key *key;
-                       memset(tcptw->tw_md5_key, 0, sizeof(tcptw->tw_md5_key));
-                       tcptw->tw_md5_keylen = 0;
+                       tcptw->tw_md5_key = NULL;
                        key = tp->af_specific->md5_lookup(sk, sk);
                        if (key != NULL) {
-                               memcpy(&tcptw->tw_md5_key, key->key, key->keylen);
-                               tcptw->tw_md5_keylen = key->keylen;
-                               if (tcp_alloc_md5sig_pool(sk) == NULL)
+                               tcptw->tw_md5_key = kmemdup(key, sizeof(*key), GFP_ATOMIC);
+                               if (tcptw->tw_md5_key && tcp_alloc_md5sig_pool(sk) == NULL)
                                        BUG();
                        }
                } while (0);
@@ -405,8 +403,10 @@ void tcp_twsk_destructor(struct sock *sk)
 {
 #ifdef CONFIG_TCP_MD5SIG
        struct tcp_timewait_sock *twsk = tcp_twsk(sk);
-       if (twsk->tw_md5_keylen)
+       if (twsk->tw_md5_key) {
                tcp_free_md5sig_pool();
+               kfree_rcu(twsk->tw_md5_key, rcu);
+       }
 #endif
 }
 EXPORT_SYMBOL_GPL(tcp_twsk_destructor);
index 4ff3b6d..364784a 100644 (file)
@@ -2306,8 +2306,10 @@ begin_fwd:
                if (sacked & (TCPCB_SACKED_ACKED|TCPCB_SACKED_RETRANS))
                        continue;
 
-               if (tcp_retransmit_skb(sk, skb))
+               if (tcp_retransmit_skb(sk, skb)) {
+                       NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_TCPRETRANSFAIL);
                        return;
+               }
                NET_INC_STATS_BH(sock_net(sk), mib_idx);
 
                if (inet_csk(sk)->icsk_ca_state == TCP_CA_Recovery)
index 5d075b5..7c41ab8 100644 (file)
@@ -917,7 +917,8 @@ int udp_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,
                if (!saddr)
                        saddr = inet->mc_addr;
                connected = 0;
-       }
+       } else if (!ipc.oif)
+               ipc.oif = inet->uc_index;
 
        if (connected)
                rt = (struct rtable *)sk_dst_check(sk, 0);
@@ -1166,7 +1167,7 @@ int udp_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,
        struct sockaddr_in *sin = (struct sockaddr_in *)msg->msg_name;
        struct sk_buff *skb;
        unsigned int ulen, copied;
-       int peeked;
+       int peeked, off = 0;
        int err;
        int is_udplite = IS_UDPLITE(sk);
        bool slow;
@@ -1182,7 +1183,7 @@ int udp_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,
 
 try_again:
        skb = __skb_recv_datagram(sk, flags | (noblock ? MSG_DONTWAIT : 0),
-                                 &peeked, &err);
+                                 &peeked, &off, &err);
        if (!skb)
                goto out;
 
index 273f48d..5605f9d 100644 (file)
@@ -214,6 +214,7 @@ lookup_protocol:
        inet->mc_ttl    = 1;
        inet->mc_index  = 0;
        inet->mc_list   = NULL;
+       inet->rcv_tos   = 0;
 
        if (ipv4_config.no_pmtu_disc)
                inet->pmtudisc = IP_PMTUDISC_DONT;
index 59402b4..db00d27 100644 (file)
@@ -211,35 +211,6 @@ void ipv6_sock_ac_close(struct sock *sk)
        rcu_read_unlock();
 }
 
-#if 0
-/* The function is not used, which is funny. Apparently, author
- * supposed to use it to filter out datagrams inside udp/raw but forgot.
- *
- * It is OK, anycasts are not special comparing to delivery to unicasts.
- */
-
-int inet6_ac_check(struct sock *sk, struct in6_addr *addr, int ifindex)
-{
-       struct ipv6_ac_socklist *pac;
-       struct ipv6_pinfo *np = inet6_sk(sk);
-       int     found;
-
-       found = 0;
-       read_lock(&ipv6_sk_ac_lock);
-       for (pac=np->ipv6_ac_list; pac; pac=pac->acl_next) {
-               if (ifindex && pac->acl_ifindex != ifindex)
-                       continue;
-               found = ipv6_addr_equal(&pac->acl_addr, addr);
-               if (found)
-                       break;
-       }
-       read_unlock(&ipv6_sk_ac_lock);
-
-       return found;
-}
-
-#endif
-
 static void aca_put(struct ifacaddr6 *ac)
 {
        if (atomic_dec_and_test(&ac->aca_refcnt)) {
index 251e7cd..76832c8 100644 (file)
@@ -485,7 +485,7 @@ int datagram_recv_ctl(struct sock *sk, struct msghdr *msg, struct sk_buff *skb)
        }
 
        if (np->rxopt.bits.rxtclass) {
-               int tclass = (ntohl(*(__be32 *)ipv6_hdr(skb)) >> 20) & 0xff;
+               int tclass = ipv6_tclass(ipv6_hdr(skb));
                put_cmsg(msg, SOL_IPV6, IPV6_TCLASS, sizeof(tclass), &tclass);
        }
 
index 01d46bf..af88934 100644 (file)
@@ -468,6 +468,8 @@ void icmpv6_send(struct sk_buff *skb, u8 type, u8 code, __u32 info)
 
        if (!fl6.flowi6_oif && ipv6_addr_is_multicast(&fl6.daddr))
                fl6.flowi6_oif = np->mcast_oif;
+       else if (!fl6.flowi6_oif)
+               fl6.flowi6_oif = np->ucast_oif;
 
        dst = icmpv6_route_lookup(net, skb, sk, &fl6);
        if (IS_ERR(dst))
@@ -553,6 +555,8 @@ static void icmpv6_echo_reply(struct sk_buff *skb)
 
        if (!fl6.flowi6_oif && ipv6_addr_is_multicast(&fl6.daddr))
                fl6.flowi6_oif = np->mcast_oif;
+       else if (!fl6.flowi6_oif)
+               fl6.flowi6_oif = np->ucast_oif;
 
        err = ip6_dst_lookup(sk, &dst, &fl6);
        if (err)
index b82bcde..5b27fbc 100644 (file)
@@ -1552,11 +1552,20 @@ static int fib6_age(struct rt6_info *rt, void *arg)
                    time_after_eq(now, rt->dst.lastuse + gc_args.timeout)) {
                        RT6_TRACE("aging clone %p\n", rt);
                        return -1;
-               } else if ((rt->rt6i_flags & RTF_GATEWAY) &&
-                          (!(dst_get_neighbour_noref_raw(&rt->dst)->flags & NTF_ROUTER))) {
-                       RT6_TRACE("purging route %p via non-router but gateway\n",
-                                 rt);
-                       return -1;
+               } else if (rt->rt6i_flags & RTF_GATEWAY) {
+                       struct neighbour *neigh;
+                       __u8 neigh_flags = 0;
+
+                       neigh = dst_neigh_lookup(&rt->dst, &rt->rt6i_gateway);
+                       if (neigh) {
+                               neigh_flags = neigh->flags;
+                               neigh_release(neigh);
+                       }
+                       if (neigh_flags & NTF_ROUTER) {
+                               RT6_TRACE("purging route %p via non-router but gateway\n",
+                                         rt);
+                               return -1;
+                       }
                }
                gc_args.more++;
        }
index d97e071..7a98fc2 100644 (file)
@@ -388,7 +388,6 @@ int ip6_forward(struct sk_buff *skb)
        struct ipv6hdr *hdr = ipv6_hdr(skb);
        struct inet6_skb_parm *opt = IP6CB(skb);
        struct net *net = dev_net(dst->dev);
-       struct neighbour *n;
        u32 mtu;
 
        if (net->ipv6.devconf_all->forwarding == 0)
@@ -463,8 +462,7 @@ int ip6_forward(struct sk_buff *skb)
           send redirects to source routed frames.
           We don't send redirects to frames decapsulated from IPsec.
         */
-       n = dst_get_neighbour_noref(dst);
-       if (skb->dev == dst->dev && n && opt->srcrt == 0 && !skb_sec_path(skb)) {
+       if (skb->dev == dst->dev && opt->srcrt == 0 && !skb_sec_path(skb)) {
                struct in6_addr *target = NULL;
                struct rt6_info *rt;
 
@@ -474,8 +472,8 @@ int ip6_forward(struct sk_buff *skb)
                 */
 
                rt = (struct rt6_info *) dst;
-               if ((rt->rt6i_flags & RTF_GATEWAY))
-                       target = (struct in6_addr*)&n->primary_key;
+               if (rt->rt6i_flags & RTF_GATEWAY)
+                       target = &rt->rt6i_gateway;
                else
                        target = &hdr->daddr;
 
@@ -486,7 +484,7 @@ int ip6_forward(struct sk_buff *skb)
                   and by source (inside ndisc_send_redirect)
                 */
                if (inet_peer_xrlim_allow(rt->rt6i_peer, 1*HZ))
-                       ndisc_send_redirect(skb, n, target);
+                       ndisc_send_redirect(skb, target);
        } else {
                int addrtype = ipv6_addr_type(&hdr->saddr);
 
index 18a2719..63dd1f8 100644 (file)
@@ -516,6 +516,36 @@ done:
                retv = 0;
                break;
 
+       case IPV6_UNICAST_IF:
+       {
+               struct net_device *dev = NULL;
+               int ifindex;
+
+               if (optlen != sizeof(int))
+                       goto e_inval;
+
+               ifindex = (__force int)ntohl((__force __be32)val);
+               if (ifindex == 0) {
+                       np->ucast_oif = 0;
+                       retv = 0;
+                       break;
+               }
+
+               dev = dev_get_by_index(net, ifindex);
+               retv = -EADDRNOTAVAIL;
+               if (!dev)
+                       break;
+               dev_put(dev);
+
+               retv = -EINVAL;
+               if (sk->sk_bound_dev_if)
+                       break;
+
+               np->ucast_oif = ifindex;
+               retv = 0;
+               break;
+       }
+
        case IPV6_MULTICAST_IF:
                if (sk->sk_type == SOCK_STREAM)
                        break;
@@ -987,6 +1017,10 @@ static int do_ipv6_getsockopt(struct sock *sk, int level, int optname,
                                int hlim = np->mcast_hops;
                                put_cmsg(&msg, SOL_IPV6, IPV6_HOPLIMIT, sizeof(hlim), &hlim);
                        }
+                       if (np->rxopt.bits.rxtclass) {
+                               int tclass = np->rcv_tclass;
+                               put_cmsg(&msg, SOL_IPV6, IPV6_TCLASS, sizeof(tclass), &tclass);
+                       }
                        if (np->rxopt.bits.rxoinfo) {
                                struct in6_pktinfo src_info;
                                src_info.ipi6_ifindex = np->mcast_oif ? np->mcast_oif :
@@ -1160,6 +1194,10 @@ static int do_ipv6_getsockopt(struct sock *sk, int level, int optname,
                val = np->mcast_oif;
                break;
 
+       case IPV6_UNICAST_IF:
+               val = (__force int)htonl((__u32) np->ucast_oif);
+               break;
+
        case IPV6_MTU_DISCOVER:
                val = np->pmtudisc;
                break;
index c964958..3dcdb81 100644 (file)
@@ -1223,11 +1223,17 @@ static void ndisc_router_discovery(struct sk_buff *skb)
 
        rt = rt6_get_dflt_router(&ipv6_hdr(skb)->saddr, skb->dev);
 
-       if (rt)
-               neigh = dst_get_neighbour_noref(&rt->dst);
-
+       if (rt) {
+               neigh = dst_neigh_lookup(&rt->dst, &ipv6_hdr(skb)->saddr);
+               if (!neigh) {
+                       ND_PRINTK0(KERN_ERR
+                                  "ICMPv6 RA: %s() got default router without neighbour.\n",
+                                  __func__);
+                       dst_release(&rt->dst);
+                       return;
+               }
+       }
        if (rt && lifetime == 0) {
-               neigh_clone(neigh);
                ip6_del_rt(rt);
                rt = NULL;
        }
@@ -1244,7 +1250,7 @@ static void ndisc_router_discovery(struct sk_buff *skb)
                        return;
                }
 
-               neigh = dst_get_neighbour_noref(&rt->dst);
+               neigh = dst_neigh_lookup(&rt->dst, &ipv6_hdr(skb)->saddr);
                if (neigh == NULL) {
                        ND_PRINTK0(KERN_ERR
                                   "ICMPv6 RA: %s() got default router without neighbour.\n",
@@ -1411,7 +1417,7 @@ skip_routeinfo:
 out:
        if (rt)
                dst_release(&rt->dst);
-       else if (neigh)
+       if (neigh)
                neigh_release(neigh);
 }
 
@@ -1506,8 +1512,7 @@ static void ndisc_redirect_rcv(struct sk_buff *skb)
        }
 }
 
-void ndisc_send_redirect(struct sk_buff *skb, struct neighbour *neigh,
-                        const struct in6_addr *target)
+void ndisc_send_redirect(struct sk_buff *skb, const struct in6_addr *target)
 {
        struct net_device *dev = skb->dev;
        struct net *net = dev_net(dev);
@@ -1566,6 +1571,13 @@ void ndisc_send_redirect(struct sk_buff *skb, struct neighbour *neigh,
                goto release;
 
        if (dev->addr_len) {
+               struct neighbour *neigh = dst_neigh_lookup(skb_dst(skb), target);
+               if (!neigh) {
+                       ND_PRINTK2(KERN_WARNING
+                                  "ICMPv6 Redirect: no neigh for target address\n");
+                       goto release;
+               }
+
                read_lock_bh(&neigh->lock);
                if (neigh->nud_state & NUD_VALID) {
                        memcpy(ha_buf, neigh->ha, dev->addr_len);
@@ -1574,6 +1586,8 @@ void ndisc_send_redirect(struct sk_buff *skb, struct neighbour *neigh,
                        len += ndisc_opt_addr_space(dev);
                } else
                        read_unlock_bh(&neigh->lock);
+
+               neigh_release(neigh);
        }
 
        rd_len = min_t(unsigned int,
index d02f7e4..5bddea7 100644 (file)
@@ -856,6 +856,8 @@ static int rawv6_sendmsg(struct kiocb *iocb, struct sock *sk,
 
        if (!fl6.flowi6_oif && ipv6_addr_is_multicast(&fl6.daddr))
                fl6.flowi6_oif = np->mcast_oif;
+       else if (!fl6.flowi6_oif)
+               fl6.flowi6_oif = np->ucast_oif;
        security_sk_classify_flow(sk, flowi6_to_flowi(&fl6));
 
        dst = ip6_dst_lookup_flow(sk, &fl6, final_p, true);
index b69fae7..9447bd6 100644 (file)
@@ -336,12 +336,11 @@ static int ip6_frag_queue(struct frag_queue *fq, struct sk_buff *skb,
        }
 
 found:
-       /* RFC5722, Section 4:
-        *                                  When reassembling an IPv6 datagram, if
+       /* RFC5722, Section 4, amended by Errata ID : 3089
+        *                          When reassembling an IPv6 datagram, if
         *   one or more its constituent fragments is determined to be an
         *   overlapping fragment, the entire datagram (and any constituent
-        *   fragments, including those not yet received) MUST be silently
-        *   discarded.
+        *   fragments) MUST be silently discarded.
         */
 
        /* Check for overlap with preceding fragment. */
index 8c2e3ab..92be12b 100644 (file)
@@ -121,9 +121,22 @@ static u32 *ipv6_cow_metrics(struct dst_entry *dst, unsigned long old)
        return p;
 }
 
+static inline const void *choose_neigh_daddr(struct rt6_info *rt, const void *daddr)
+{
+       struct in6_addr *p = &rt->rt6i_gateway;
+
+       if (!ipv6_addr_any(p))
+               return (const void *) p;
+       return daddr;
+}
+
 static struct neighbour *ip6_neigh_lookup(const struct dst_entry *dst, const void *daddr)
 {
-       struct neighbour *n = __ipv6_neigh_lookup(&nd_tbl, dst->dev, daddr);
+       struct rt6_info *rt = (struct rt6_info *) dst;
+       struct neighbour *n;
+
+       daddr = choose_neigh_daddr(rt, daddr);
+       n = __ipv6_neigh_lookup(&nd_tbl, dst->dev, daddr);
        if (n)
                return n;
        return neigh_create(&nd_tbl, daddr, dst->dev);
index 133768e..c4ffd17 100644 (file)
@@ -680,9 +680,10 @@ static netdev_tx_t ipip6_tunnel_xmit(struct sk_buff *skb,
        /* ISATAP (RFC4214) - must come before 6to4 */
        if (dev->priv_flags & IFF_ISATAP) {
                struct neighbour *neigh = NULL;
+               bool do_tx_error = false;
 
                if (skb_dst(skb))
-                       neigh = dst_get_neighbour_noref(skb_dst(skb));
+                       neigh = dst_neigh_lookup(skb_dst(skb), &iph6->daddr);
 
                if (neigh == NULL) {
                        if (net_ratelimit())
@@ -697,6 +698,10 @@ static netdev_tx_t ipip6_tunnel_xmit(struct sk_buff *skb,
                     ipv6_addr_is_isatap(addr6))
                        dst = addr6->s6_addr32[3];
                else
+                       do_tx_error = true;
+
+               neigh_release(neigh);
+               if (do_tx_error)
                        goto tx_error;
        }
 
@@ -705,9 +710,10 @@ static netdev_tx_t ipip6_tunnel_xmit(struct sk_buff *skb,
 
        if (!dst) {
                struct neighbour *neigh = NULL;
+               bool do_tx_error = false;
 
                if (skb_dst(skb))
-                       neigh = dst_get_neighbour_noref(skb_dst(skb));
+                       neigh = dst_neigh_lookup(skb_dst(skb), &iph6->daddr);
 
                if (neigh == NULL) {
                        if (net_ratelimit())
@@ -723,10 +729,14 @@ static netdev_tx_t ipip6_tunnel_xmit(struct sk_buff *skb,
                        addr_type = ipv6_addr_type(addr6);
                }
 
-               if ((addr_type & IPV6_ADDR_COMPATv4) == 0)
-                       goto tx_error_icmp;
+               if ((addr_type & IPV6_ADDR_COMPATv4) != 0)
+                       dst = addr6->s6_addr32[3];
+               else
+                       do_tx_error = true;
 
-               dst = addr6->s6_addr32[3];
+               neigh_release(neigh);
+               if (do_tx_error)
+                       goto tx_error;
        }
 
        rt = ip_route_output_ports(dev_net(dev), &fl4, NULL,
index 3edd05a..12c6ece 100644 (file)
@@ -540,19 +540,7 @@ static void tcp_v6_reqsk_destructor(struct request_sock *req)
 static struct tcp_md5sig_key *tcp_v6_md5_do_lookup(struct sock *sk,
                                                   const struct in6_addr *addr)
 {
-       struct tcp_sock *tp = tcp_sk(sk);
-       int i;
-
-       BUG_ON(tp == NULL);
-
-       if (!tp->md5sig_info || !tp->md5sig_info->entries6)
-               return NULL;
-
-       for (i = 0; i < tp->md5sig_info->entries6; i++) {
-               if (ipv6_addr_equal(&tp->md5sig_info->keys6[i].addr, addr))
-                       return &tp->md5sig_info->keys6[i].base;
-       }
-       return NULL;
+       return tcp_md5_do_lookup(sk, (union tcp_md5_addr *)addr, AF_INET6);
 }
 
 static struct tcp_md5sig_key *tcp_v6_md5_lookup(struct sock *sk,
@@ -567,136 +555,11 @@ static struct tcp_md5sig_key *tcp_v6_reqsk_md5_lookup(struct sock *sk,
        return tcp_v6_md5_do_lookup(sk, &inet6_rsk(req)->rmt_addr);
 }
 
-static int tcp_v6_md5_do_add(struct sock *sk, const struct in6_addr *peer,
-                            char *newkey, u8 newkeylen)
-{
-       /* Add key to the list */
-       struct tcp_md5sig_key *key;
-       struct tcp_sock *tp = tcp_sk(sk);
-       struct tcp6_md5sig_key *keys;
-
-       key = tcp_v6_md5_do_lookup(sk, peer);
-       if (key) {
-               /* modify existing entry - just update that one */
-               kfree(key->key);
-               key->key = newkey;
-               key->keylen = newkeylen;
-       } else {
-               /* reallocate new list if current one is full. */
-               if (!tp->md5sig_info) {
-                       tp->md5sig_info = kzalloc(sizeof(*tp->md5sig_info), GFP_ATOMIC);
-                       if (!tp->md5sig_info) {
-                               kfree(newkey);
-                               return -ENOMEM;
-                       }
-                       sk_nocaps_add(sk, NETIF_F_GSO_MASK);
-               }
-               if (tp->md5sig_info->entries6 == 0 &&
-                       tcp_alloc_md5sig_pool(sk) == NULL) {
-                       kfree(newkey);
-                       return -ENOMEM;
-               }
-               if (tp->md5sig_info->alloced6 == tp->md5sig_info->entries6) {
-                       keys = kmalloc((sizeof (tp->md5sig_info->keys6[0]) *
-                                      (tp->md5sig_info->entries6 + 1)), GFP_ATOMIC);
-
-                       if (!keys) {
-                               kfree(newkey);
-                               if (tp->md5sig_info->entries6 == 0)
-                                       tcp_free_md5sig_pool();
-                               return -ENOMEM;
-                       }
-
-                       if (tp->md5sig_info->entries6)
-                               memmove(keys, tp->md5sig_info->keys6,
-                                       (sizeof (tp->md5sig_info->keys6[0]) *
-                                        tp->md5sig_info->entries6));
-
-                       kfree(tp->md5sig_info->keys6);
-                       tp->md5sig_info->keys6 = keys;
-                       tp->md5sig_info->alloced6++;
-               }
-
-               tp->md5sig_info->keys6[tp->md5sig_info->entries6].addr = *peer;
-               tp->md5sig_info->keys6[tp->md5sig_info->entries6].base.key = newkey;
-               tp->md5sig_info->keys6[tp->md5sig_info->entries6].base.keylen = newkeylen;
-
-               tp->md5sig_info->entries6++;
-       }
-       return 0;
-}
-
-static int tcp_v6_md5_add_func(struct sock *sk, struct sock *addr_sk,
-                              u8 *newkey, __u8 newkeylen)
-{
-       return tcp_v6_md5_do_add(sk, &inet6_sk(addr_sk)->daddr,
-                                newkey, newkeylen);
-}
-
-static int tcp_v6_md5_do_del(struct sock *sk, const struct in6_addr *peer)
-{
-       struct tcp_sock *tp = tcp_sk(sk);
-       int i;
-
-       for (i = 0; i < tp->md5sig_info->entries6; i++) {
-               if (ipv6_addr_equal(&tp->md5sig_info->keys6[i].addr, peer)) {
-                       /* Free the key */
-                       kfree(tp->md5sig_info->keys6[i].base.key);
-                       tp->md5sig_info->entries6--;
-
-                       if (tp->md5sig_info->entries6 == 0) {
-                               kfree(tp->md5sig_info->keys6);
-                               tp->md5sig_info->keys6 = NULL;
-                               tp->md5sig_info->alloced6 = 0;
-                               tcp_free_md5sig_pool();
-                       } else {
-                               /* shrink the database */
-                               if (tp->md5sig_info->entries6 != i)
-                                       memmove(&tp->md5sig_info->keys6[i],
-                                               &tp->md5sig_info->keys6[i+1],
-                                               (tp->md5sig_info->entries6 - i)
-                                               * sizeof (tp->md5sig_info->keys6[0]));
-                       }
-                       return 0;
-               }
-       }
-       return -ENOENT;
-}
-
-static void tcp_v6_clear_md5_list (struct sock *sk)
-{
-       struct tcp_sock *tp = tcp_sk(sk);
-       int i;
-
-       if (tp->md5sig_info->entries6) {
-               for (i = 0; i < tp->md5sig_info->entries6; i++)
-                       kfree(tp->md5sig_info->keys6[i].base.key);
-               tp->md5sig_info->entries6 = 0;
-               tcp_free_md5sig_pool();
-       }
-
-       kfree(tp->md5sig_info->keys6);
-       tp->md5sig_info->keys6 = NULL;
-       tp->md5sig_info->alloced6 = 0;
-
-       if (tp->md5sig_info->entries4) {
-               for (i = 0; i < tp->md5sig_info->entries4; i++)
-                       kfree(tp->md5sig_info->keys4[i].base.key);
-               tp->md5sig_info->entries4 = 0;
-               tcp_free_md5sig_pool();
-       }
-
-       kfree(tp->md5sig_info->keys4);
-       tp->md5sig_info->keys4 = NULL;
-       tp->md5sig_info->alloced4 = 0;
-}
-
 static int tcp_v6_parse_md5_keys (struct sock *sk, char __user *optval,
                                  int optlen)
 {
        struct tcp_md5sig cmd;
        struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)&cmd.tcpm_addr;
-       u8 *newkey;
 
        if (optlen < sizeof(cmd))
                return -EINVAL;
@@ -708,36 +571,22 @@ static int tcp_v6_parse_md5_keys (struct sock *sk, char __user *optval,
                return -EINVAL;
 
        if (!cmd.tcpm_keylen) {
-               if (!tcp_sk(sk)->md5sig_info)
-                       return -ENOENT;
                if (ipv6_addr_v4mapped(&sin6->sin6_addr))
-                       return tcp_v4_md5_do_del(sk, sin6->sin6_addr.s6_addr32[3]);
-               return tcp_v6_md5_do_del(sk, &sin6->sin6_addr);
+                       return tcp_md5_do_del(sk, (union tcp_md5_addr *)&sin6->sin6_addr.s6_addr32[3],
+                                             AF_INET);
+               return tcp_md5_do_del(sk, (union tcp_md5_addr *)&sin6->sin6_addr,
+                                     AF_INET6);
        }
 
        if (cmd.tcpm_keylen > TCP_MD5SIG_MAXKEYLEN)
                return -EINVAL;
 
-       if (!tcp_sk(sk)->md5sig_info) {
-               struct tcp_sock *tp = tcp_sk(sk);
-               struct tcp_md5sig_info *p;
-
-               p = kzalloc(sizeof(struct tcp_md5sig_info), GFP_KERNEL);
-               if (!p)
-                       return -ENOMEM;
+       if (ipv6_addr_v4mapped(&sin6->sin6_addr))
+               return tcp_md5_do_add(sk, (union tcp_md5_addr *)&sin6->sin6_addr.s6_addr32[3],
+                                     AF_INET, cmd.tcpm_key, cmd.tcpm_keylen, GFP_KERNEL);
 
-               tp->md5sig_info = p;
-               sk_nocaps_add(sk, NETIF_F_GSO_MASK);
-       }
-
-       newkey = kmemdup(cmd.tcpm_key, cmd.tcpm_keylen, GFP_KERNEL);
-       if (!newkey)
-               return -ENOMEM;
-       if (ipv6_addr_v4mapped(&sin6->sin6_addr)) {
-               return tcp_v4_md5_do_add(sk, sin6->sin6_addr.s6_addr32[3],
-                                        newkey, cmd.tcpm_keylen);
-       }
-       return tcp_v6_md5_do_add(sk, &sin6->sin6_addr, newkey, cmd.tcpm_keylen);
+       return tcp_md5_do_add(sk, (union tcp_md5_addr *)&sin6->sin6_addr,
+                             AF_INET6, cmd.tcpm_key, cmd.tcpm_keylen, GFP_KERNEL);
 }
 
 static int tcp_v6_md5_hash_pseudoheader(struct tcp_md5sig_pool *hp,
@@ -1074,6 +923,13 @@ static void tcp_v6_send_reset(struct sock *sk, struct sk_buff *skb)
        const struct tcphdr *th = tcp_hdr(skb);
        u32 seq = 0, ack_seq = 0;
        struct tcp_md5sig_key *key = NULL;
+#ifdef CONFIG_TCP_MD5SIG
+       const __u8 *hash_location = NULL;
+       struct ipv6hdr *ipv6h = ipv6_hdr(skb);
+       unsigned char newhash[16];
+       int genhash;
+       struct sock *sk1 = NULL;
+#endif
 
        if (th->rst)
                return;
@@ -1082,8 +938,32 @@ static void tcp_v6_send_reset(struct sock *sk, struct sk_buff *skb)
                return;
 
 #ifdef CONFIG_TCP_MD5SIG
-       if (sk)
-               key = tcp_v6_md5_do_lookup(sk, &ipv6_hdr(skb)->saddr);
+       hash_location = tcp_parse_md5sig_option(th);
+       if (!sk && hash_location) {
+               /*
+                * active side is lost. Try to find listening socket through
+                * source port, and then find md5 key through listening socket.
+                * we are not loose security here:
+                * Incoming packet is checked with md5 hash with finding key,
+                * no RST generated if md5 hash doesn't match.
+                */
+               sk1 = inet6_lookup_listener(dev_net(skb_dst(skb)->dev),
+                                          &tcp_hashinfo, &ipv6h->daddr,
+                                          ntohs(th->source), inet6_iif(skb));
+               if (!sk1)
+                       return;
+
+               rcu_read_lock();
+               key = tcp_v6_md5_do_lookup(sk1, &ipv6h->saddr);
+               if (!key)
+                       goto release_sk1;
+
+               genhash = tcp_v6_md5_hash_skb(newhash, key, NULL, NULL, skb);
+               if (genhash || memcmp(hash_location, newhash, 16) != 0)
+                       goto release_sk1;
+       } else {
+               key = sk ? tcp_v6_md5_do_lookup(sk, &ipv6h->saddr) : NULL;
+       }
 #endif
 
        if (th->ack)
@@ -1093,6 +973,14 @@ static void tcp_v6_send_reset(struct sock *sk, struct sk_buff *skb)
                          (th->doff << 2);
 
        tcp_v6_send_response(skb, seq, ack_seq, 0, 0, key, 1, 0);
+
+#ifdef CONFIG_TCP_MD5SIG
+release_sk1:
+       if (sk1) {
+               rcu_read_unlock();
+               sock_put(sk1);
+       }
+#endif
 }
 
 static void tcp_v6_send_ack(struct sk_buff *skb, u32 seq, u32 ack, u32 win, u32 ts,
@@ -1394,6 +1282,7 @@ static struct sock * tcp_v6_syn_recv_sock(struct sock *sk, struct sk_buff *skb,
                newnp->opt         = NULL;
                newnp->mcast_oif   = inet6_iif(skb);
                newnp->mcast_hops  = ipv6_hdr(skb)->hop_limit;
+               newnp->rcv_tclass  = ipv6_tclass(ipv6_hdr(skb));
 
                /*
                 * No need to charge this sock to the relevant IPv6 refcnt debug socks count
@@ -1472,6 +1361,7 @@ static struct sock * tcp_v6_syn_recv_sock(struct sock *sk, struct sk_buff *skb,
        newnp->opt        = NULL;
        newnp->mcast_oif  = inet6_iif(skb);
        newnp->mcast_hops = ipv6_hdr(skb)->hop_limit;
+       newnp->rcv_tclass = ipv6_tclass(ipv6_hdr(skb));
 
        /* Clone native IPv6 options from listening socket (if any)
 
@@ -1510,10 +1400,8 @@ static struct sock * tcp_v6_syn_recv_sock(struct sock *sk, struct sk_buff *skb,
                 * memory, then we end up not copying the key
                 * across. Shucks.
                 */
-               char *newkey = kmemdup(key->key, key->keylen, GFP_ATOMIC);
-               if (newkey != NULL)
-                       tcp_v6_md5_do_add(newsk, &newnp->daddr,
-                                         newkey, key->keylen);
+               tcp_md5_do_add(newsk, (union tcp_md5_addr *)&newnp->daddr,
+                              AF_INET6, key->key, key->keylen, GFP_ATOMIC);
        }
 #endif
 
@@ -1676,6 +1564,8 @@ ipv6_pktoptions:
                        np->mcast_oif = inet6_iif(opt_skb);
                if (np->rxopt.bits.rxhlim || np->rxopt.bits.rxohlim)
                        np->mcast_hops = ipv6_hdr(opt_skb)->hop_limit;
+               if (np->rxopt.bits.rxtclass)
+                       np->rcv_tclass = ipv6_tclass(ipv6_hdr(skb));
                if (ipv6_opt_accepted(sk, opt_skb)) {
                        skb_set_owner_r(opt_skb, sk);
                        opt_skb = xchg(&np->pktoptions, opt_skb);
@@ -1898,7 +1788,6 @@ static const struct inet_connection_sock_af_ops ipv6_specific = {
 static const struct tcp_sock_af_ops tcp_sock_ipv6_specific = {
        .md5_lookup     =       tcp_v6_md5_lookup,
        .calc_md5_hash  =       tcp_v6_md5_hash_skb,
-       .md5_add        =       tcp_v6_md5_add_func,
        .md5_parse      =       tcp_v6_parse_md5_keys,
 };
 #endif
@@ -1930,7 +1819,6 @@ static const struct inet_connection_sock_af_ops ipv6_mapped = {
 static const struct tcp_sock_af_ops tcp_sock_ipv6_mapped_specific = {
        .md5_lookup     =       tcp_v4_md5_lookup,
        .calc_md5_hash  =       tcp_v4_md5_hash_skb,
-       .md5_add        =       tcp_v6_md5_add_func,
        .md5_parse      =       tcp_v6_parse_md5_keys,
 };
 #endif
@@ -2004,11 +1892,6 @@ static int tcp_v6_init_sock(struct sock *sk)
 
 static void tcp_v6_destroy_sock(struct sock *sk)
 {
-#ifdef CONFIG_TCP_MD5SIG
-       /* Clean up the MD5 key list */
-       if (tcp_sk(sk)->md5sig_info)
-               tcp_v6_clear_md5_list(sk);
-#endif
        tcp_v4_destroy_sock(sk);
        inet6_destroy_sock(sk);
 }
index 4f96b5c..37b0699 100644 (file)
@@ -342,7 +342,7 @@ int udpv6_recvmsg(struct kiocb *iocb, struct sock *sk,
        struct inet_sock *inet = inet_sk(sk);
        struct sk_buff *skb;
        unsigned int ulen, copied;
-       int peeked;
+       int peeked, off = 0;
        int err;
        int is_udplite = IS_UDPLITE(sk);
        int is_udp4;
@@ -359,7 +359,7 @@ int udpv6_recvmsg(struct kiocb *iocb, struct sock *sk,
 
 try_again:
        skb = __skb_recv_datagram(sk, flags | (noblock ? MSG_DONTWAIT : 0),
-                                 &peeked, &err);
+                                 &peeked, &off, &err);
        if (!skb)
                goto out;
 
@@ -1130,7 +1130,8 @@ do_udp_sendmsg:
        if (!fl6.flowi6_oif && ipv6_addr_is_multicast(&fl6.daddr)) {
                fl6.flowi6_oif = np->mcast_oif;
                connected = 0;
-       }
+       } else if (!fl6.flowi6_oif)
+               fl6.flowi6_oif = np->ucast_oif;
 
        security_sk_classify_flow(sk, flowi6_to_flowi(&fl6));
 
index 4eeff89..8755a30 100644 (file)
@@ -146,7 +146,7 @@ static int __xfrm6_output(struct sk_buff *skb)
                return -EMSGSIZE;
        }
 
-       if ((x && x->props.mode == XFRM_MODE_TUNNEL) &&
+       if (x->props.mode == XFRM_MODE_TUNNEL &&
            ((skb->len > mtu && !skb_is_gso(skb)) ||
                dst_allfrag(skb_dst(skb)))) {
                        return ip6_fragment(skb, x->outer_mode->afinfo->output_finish);
index 979ecb2..564eb0b 100644 (file)
 #include <linux/init.h>
 
 #include <linux/ppp_defs.h>
-#include <linux/if_ppp.h>
+#include <linux/ppp-ioctl.h>
 #include <linux/ppp_channel.h>
 
 #include <net/irda/irda.h>
index d5c5b8f..98d1f0b 100644 (file)
@@ -90,6 +90,7 @@ do {                                                                  \
 
 static void iucv_sock_kill(struct sock *sk);
 static void iucv_sock_close(struct sock *sk);
+static void iucv_sever_path(struct sock *, int);
 
 static int afiucv_hs_rcv(struct sk_buff *skb, struct net_device *dev,
        struct packet_type *pt, struct net_device *orig_dev);
@@ -130,17 +131,6 @@ static inline void low_nmcpy(unsigned char *dst, char *src)
        memcpy(&dst[8], src, 8);
 }
 
-static void iucv_skb_queue_purge(struct sk_buff_head *list)
-{
-       struct sk_buff *skb;
-
-       while ((skb = skb_dequeue(list)) != NULL) {
-               if (skb->dev)
-                       dev_put(skb->dev);
-               kfree_skb(skb);
-       }
-}
-
 static int afiucv_pm_prepare(struct device *dev)
 {
 #ifdef CONFIG_PM_DEBUG
@@ -175,17 +165,13 @@ static int afiucv_pm_freeze(struct device *dev)
        read_lock(&iucv_sk_list.lock);
        sk_for_each(sk, node, &iucv_sk_list.head) {
                iucv = iucv_sk(sk);
-               iucv_skb_queue_purge(&iucv->send_skb_q);
+               skb_queue_purge(&iucv->send_skb_q);
                skb_queue_purge(&iucv->backlog_skb_q);
                switch (sk->sk_state) {
                case IUCV_DISCONN:
                case IUCV_CLOSING:
                case IUCV_CONNECTED:
-                       if (iucv->path) {
-                               err = pr_iucv->path_sever(iucv->path, NULL);
-                               iucv_path_free(iucv->path);
-                               iucv->path = NULL;
-                       }
+                       iucv_sever_path(sk, 0);
                        break;
                case IUCV_OPEN:
                case IUCV_BOUND:
@@ -194,6 +180,8 @@ static int afiucv_pm_freeze(struct device *dev)
                default:
                        break;
                }
+               skb_queue_purge(&iucv->send_skb_q);
+               skb_queue_purge(&iucv->backlog_skb_q);
        }
        read_unlock(&iucv_sk_list.lock);
        return err;
@@ -338,7 +326,6 @@ static void iucv_sock_wake_msglim(struct sock *sk)
 static int afiucv_hs_send(struct iucv_message *imsg, struct sock *sock,
                   struct sk_buff *skb, u8 flags)
 {
-       struct net *net = sock_net(sock);
        struct iucv_sock *iucv = iucv_sk(sock);
        struct af_iucv_trans_hdr *phs_hdr;
        struct sk_buff *nskb;
@@ -375,10 +362,10 @@ static int afiucv_hs_send(struct iucv_message *imsg, struct sock *sock,
        if (imsg)
                memcpy(&phs_hdr->iucv_hdr, imsg, sizeof(struct iucv_message));
 
-       skb->dev = dev_get_by_index(net, sock->sk_bound_dev_if);
+       skb->dev = iucv->hs_dev;
        if (!skb->dev)
                return -ENODEV;
-       if (!(skb->dev->flags & IFF_UP))
+       if (!(skb->dev->flags & IFF_UP) || !netif_carrier_ok(skb->dev))
                return -ENETDOWN;
        if (skb->len > skb->dev->mtu) {
                if (sock->sk_type == SOCK_SEQPACKET)
@@ -393,15 +380,14 @@ static int afiucv_hs_send(struct iucv_message *imsg, struct sock *sock,
                return -ENOMEM;
        skb_queue_tail(&iucv->send_skb_q, nskb);
        err = dev_queue_xmit(skb);
-       if (err) {
+       if (net_xmit_eval(err)) {
                skb_unlink(nskb, &iucv->send_skb_q);
-               dev_put(nskb->dev);
                kfree_skb(nskb);
        } else {
                atomic_sub(confirm_recv, &iucv->msg_recv);
                WARN_ON(atomic_read(&iucv->msg_recv) < 0);
        }
-       return err;
+       return net_xmit_eval(err);
 }
 
 static struct sock *__iucv_get_sock_by_name(char *nm)
@@ -447,13 +433,33 @@ static void iucv_sock_kill(struct sock *sk)
        sock_put(sk);
 }
 
+/* Terminate an IUCV path */
+static void iucv_sever_path(struct sock *sk, int with_user_data)
+{
+       unsigned char user_data[16];
+       struct iucv_sock *iucv = iucv_sk(sk);
+       struct iucv_path *path = iucv->path;
+
+       if (iucv->path) {
+               iucv->path = NULL;
+               if (with_user_data) {
+                       low_nmcpy(user_data, iucv->src_name);
+                       high_nmcpy(user_data, iucv->dst_name);
+                       ASCEBC(user_data, sizeof(user_data));
+                       pr_iucv->path_sever(path, user_data);
+               } else
+                       pr_iucv->path_sever(path, NULL);
+               iucv_path_free(path);
+       }
+}
+
 /* Close an IUCV socket */
 static void iucv_sock_close(struct sock *sk)
 {
-       unsigned char user_data[16];
        struct iucv_sock *iucv = iucv_sk(sk);
        unsigned long timeo;
-       int err, blen;
+       int err = 0;
+       int blen;
        struct sk_buff *skb;
 
        lock_sock(sk);
@@ -480,7 +486,7 @@ static void iucv_sock_close(struct sock *sk)
                sk->sk_state = IUCV_CLOSING;
                sk->sk_state_change(sk);
 
-               if (!skb_queue_empty(&iucv->send_skb_q)) {
+               if (!err && !skb_queue_empty(&iucv->send_skb_q)) {
                        if (sock_flag(sk, SOCK_LINGER) && sk->sk_lingertime)
                                timeo = sk->sk_lingertime;
                        else
@@ -494,25 +500,20 @@ static void iucv_sock_close(struct sock *sk)
                sk->sk_state = IUCV_CLOSED;
                sk->sk_state_change(sk);
 
-               if (iucv->path) {
-                       low_nmcpy(user_data, iucv->src_name);
-                       high_nmcpy(user_data, iucv->dst_name);
-                       ASCEBC(user_data, sizeof(user_data));
-                       pr_iucv->path_sever(iucv->path, user_data);
-                       iucv_path_free(iucv->path);
-                       iucv->path = NULL;
-               }
-
                sk->sk_err = ECONNRESET;
                sk->sk_state_change(sk);
 
-               iucv_skb_queue_purge(&iucv->send_skb_q);
+               skb_queue_purge(&iucv->send_skb_q);
                skb_queue_purge(&iucv->backlog_skb_q);
-               break;
 
-       default:
-               /* nothing to do here */
-               break;
+       default:   /* fall through */
+               iucv_sever_path(sk, 1);
+       }
+
+       if (iucv->hs_dev) {
+               dev_put(iucv->hs_dev);
+               iucv->hs_dev = NULL;
+               sk->sk_bound_dev_if = 0;
        }
 
        /* mark socket for deletion by iucv_sock_kill() */
@@ -706,7 +707,6 @@ static int iucv_sock_bind(struct socket *sock, struct sockaddr *addr,
                goto done_unlock;
 
        /* Bind the socket */
-
        if (pr_iucv)
                if (!memcmp(sa->siucv_user_id, iucv_userid, 8))
                        goto vm_bind; /* VM IUCV transport */
@@ -720,6 +720,8 @@ static int iucv_sock_bind(struct socket *sock, struct sockaddr *addr,
                        memcpy(iucv->src_name, sa->siucv_name, 8);
                        memcpy(iucv->src_user_id, sa->siucv_user_id, 8);
                        sk->sk_bound_dev_if = dev->ifindex;
+                       iucv->hs_dev = dev;
+                       dev_hold(dev);
                        sk->sk_state = IUCV_BOUND;
                        iucv->transport = AF_IUCV_TRANS_HIPER;
                        if (!iucv->msglimit)
@@ -894,11 +896,8 @@ static int iucv_sock_connect(struct socket *sock, struct sockaddr *addr,
        if (sk->sk_state == IUCV_DISCONN || sk->sk_state == IUCV_CLOSED)
                err = -ECONNREFUSED;
 
-       if (err && iucv->transport == AF_IUCV_TRANS_IUCV) {
-               pr_iucv->path_sever(iucv->path, NULL);
-               iucv_path_free(iucv->path);
-               iucv->path = NULL;
-       }
+       if (err && iucv->transport == AF_IUCV_TRANS_IUCV)
+               iucv_sever_path(sk, 0);
 
 done:
        release_sock(sk);
@@ -1124,8 +1123,10 @@ static int iucv_sock_sendmsg(struct kiocb *iocb, struct socket *sock,
                        noblock, &err);
        else
                skb = sock_alloc_send_skb(sk, len, noblock, &err);
-       if (!skb)
+       if (!skb) {
+               err = -ENOMEM;
                goto out;
+       }
        if (iucv->transport == AF_IUCV_TRANS_HIPER)
                skb_reserve(skb, sizeof(struct af_iucv_trans_hdr) + ETH_HLEN);
        if (memcpy_fromiovec(skb_put(skb, len), msg->msg_iov, len)) {
@@ -1148,6 +1149,7 @@ static int iucv_sock_sendmsg(struct kiocb *iocb, struct socket *sock,
        /* increment and save iucv message tag for msg_completion cbk */
        txmsg.tag = iucv->send_tag++;
        memcpy(CB_TAG(skb), &txmsg.tag, CB_TAG_LEN);
+
        if (iucv->transport == AF_IUCV_TRANS_HIPER) {
                atomic_inc(&iucv->msg_sent);
                err = afiucv_hs_send(&txmsg, sk, skb, 0);
@@ -1202,8 +1204,6 @@ release:
        return len;
 
 fail:
-       if (skb->dev)
-               dev_put(skb->dev);
        kfree_skb(skb);
 out:
        release_sock(sk);
@@ -1396,7 +1396,14 @@ static int iucv_sock_recvmsg(struct kiocb *iocb, struct socket *sock,
                }
 
                kfree_skb(skb);
-               atomic_inc(&iucv->msg_recv);
+               if (iucv->transport == AF_IUCV_TRANS_HIPER) {
+                       atomic_inc(&iucv->msg_recv);
+                       if (atomic_read(&iucv->msg_recv) > iucv->msglimit) {
+                               WARN_ON(1);
+                               iucv_sock_close(sk);
+                               return -EFAULT;
+                       }
+               }
 
                /* Queue backlog skbs */
                spin_lock_bh(&iucv->message_q.lock);
@@ -1486,7 +1493,7 @@ unsigned int iucv_sock_poll(struct file *file, struct socket *sock,
        if (sk->sk_state == IUCV_DISCONN)
                mask |= POLLIN;
 
-       if (sock_writeable(sk))
+       if (sock_writeable(sk) && iucv_below_msglim(sk))
                mask |= POLLOUT | POLLWRNORM | POLLWRBAND;
        else
                set_bit(SOCK_ASYNC_NOSPACE, &sk->sk_socket->flags);
@@ -1565,13 +1572,6 @@ static int iucv_sock_release(struct socket *sock)
 
        iucv_sock_close(sk);
 
-       /* Unregister with IUCV base support */
-       if (iucv_sk(sk)->path) {
-               pr_iucv->path_sever(iucv_sk(sk)->path, NULL);
-               iucv_path_free(iucv_sk(sk)->path);
-               iucv_sk(sk)->path = NULL;
-       }
-
        sock_orphan(sk);
        iucv_sock_kill(sk);
        return err;
@@ -1633,7 +1633,8 @@ static int iucv_sock_getsockopt(struct socket *sock, int level, int optname,
 {
        struct sock *sk = sock->sk;
        struct iucv_sock *iucv = iucv_sk(sk);
-       int val, len;
+       unsigned int val;
+       int len;
 
        if (level != SOL_IUCV)
                return -ENOPROTOOPT;
@@ -1656,6 +1657,13 @@ static int iucv_sock_getsockopt(struct socket *sock, int level, int optname,
                                           : iucv->msglimit;    /* default */
                release_sock(sk);
                break;
+       case SO_MSGSIZE:
+               if (sk->sk_state == IUCV_OPEN)
+                       return -EBADFD;
+               val = (iucv->hs_dev) ? iucv->hs_dev->mtu -
+                               sizeof(struct af_iucv_trans_hdr) - ETH_HLEN :
+                               0x7fffffff;
+               break;
        default:
                return -ENOPROTOOPT;
        }
@@ -1750,8 +1758,7 @@ static int iucv_callback_connreq(struct iucv_path *path,
        path->msglim = iucv->msglimit;
        err = pr_iucv->path_accept(path, &af_iucv_handler, nuser_data, nsk);
        if (err) {
-               err = pr_iucv->path_sever(path, user_data);
-               iucv_path_free(path);
+               iucv_sever_path(nsk, 1);
                iucv_sock_kill(nsk);
                goto fail;
        }
@@ -1828,6 +1835,7 @@ static void iucv_callback_txdone(struct iucv_path *path,
        struct sk_buff *list_skb = list->next;
        unsigned long flags;
 
+       bh_lock_sock(sk);
        if (!skb_queue_empty(list)) {
                spin_lock_irqsave(&list->lock, flags);
 
@@ -1849,7 +1857,6 @@ static void iucv_callback_txdone(struct iucv_path *path,
                        iucv_sock_wake_msglim(sk);
                }
        }
-       BUG_ON(!this);
 
        if (sk->sk_state == IUCV_CLOSING) {
                if (skb_queue_empty(&iucv_sk(sk)->send_skb_q)) {
@@ -1857,6 +1864,7 @@ static void iucv_callback_txdone(struct iucv_path *path,
                        sk->sk_state_change(sk);
                }
        }
+       bh_unlock_sock(sk);
 
 }
 
@@ -1864,9 +1872,15 @@ static void iucv_callback_connrej(struct iucv_path *path, u8 ipuser[16])
 {
        struct sock *sk = path->private;
 
+       if (sk->sk_state == IUCV_CLOSED)
+               return;
+
+       bh_lock_sock(sk);
+       iucv_sever_path(sk, 1);
        sk->sk_state = IUCV_DISCONN;
 
        sk->sk_state_change(sk);
+       bh_unlock_sock(sk);
 }
 
 /* called if the other communication side shuts down its RECV direction;
@@ -1954,6 +1968,8 @@ static int afiucv_hs_callback_syn(struct sock *sk, struct sk_buff *skb)
        memcpy(niucv->src_name, iucv->src_name, 8);
        memcpy(niucv->src_user_id, iucv->src_user_id, 8);
        nsk->sk_bound_dev_if = sk->sk_bound_dev_if;
+       niucv->hs_dev = iucv->hs_dev;
+       dev_hold(niucv->hs_dev);
        afiucv_swap_src_dest(skb);
        trans_hdr->flags = AF_IUCV_FLAG_SYN | AF_IUCV_FLAG_ACK;
        trans_hdr->window = niucv->msglimit;
@@ -2022,12 +2038,15 @@ static int afiucv_hs_callback_fin(struct sock *sk, struct sk_buff *skb)
        struct iucv_sock *iucv = iucv_sk(sk);
 
        /* other end of connection closed */
-       if (iucv) {
-               bh_lock_sock(sk);
+       if (!iucv)
+               goto out;
+       bh_lock_sock(sk);
+       if (sk->sk_state == IUCV_CONNECTED) {
                sk->sk_state = IUCV_DISCONN;
                sk->sk_state_change(sk);
-               bh_unlock_sock(sk);
        }
+       bh_unlock_sock(sk);
+out:
        kfree_skb(skb);
        return NET_RX_SUCCESS;
 }
@@ -2172,11 +2191,11 @@ static int afiucv_hs_rcv(struct sk_buff *skb, struct net_device *dev,
                break;
        case (AF_IUCV_FLAG_WIN):
                err = afiucv_hs_callback_win(sk, skb);
-               if (skb->len > sizeof(struct af_iucv_trans_hdr))
-                       err = afiucv_hs_callback_rx(sk, skb);
-               else
-                       kfree(skb);
-               break;
+               if (skb->len == sizeof(struct af_iucv_trans_hdr)) {
+                       kfree_skb(skb);
+                       break;
+               }
+               /* fall through */
        case 0:
                /* plain data frame */
                memcpy(CB_TRGCLS(skb), &trans_hdr->iucv_hdr.class,
@@ -2202,65 +2221,64 @@ static void afiucv_hs_callback_txnotify(struct sk_buff *skb,
        struct iucv_sock *iucv = NULL;
        struct sk_buff_head *list;
        struct sk_buff *list_skb;
-       struct sk_buff *this = NULL;
+       struct sk_buff *nskb;
        unsigned long flags;
        struct hlist_node *node;
 
-       read_lock(&iucv_sk_list.lock);
+       read_lock_irqsave(&iucv_sk_list.lock, flags);
        sk_for_each(sk, node, &iucv_sk_list.head)
                if (sk == isk) {
                        iucv = iucv_sk(sk);
                        break;
                }
-       read_unlock(&iucv_sk_list.lock);
+       read_unlock_irqrestore(&iucv_sk_list.lock, flags);
 
-       if (!iucv)
+       if (!iucv || sock_flag(sk, SOCK_ZAPPED))
                return;
 
-       bh_lock_sock(sk);
        list = &iucv->send_skb_q;
-       list_skb = list->next;
+       spin_lock_irqsave(&list->lock, flags);
        if (skb_queue_empty(list))
                goto out_unlock;
-
-       spin_lock_irqsave(&list->lock, flags);
+       list_skb = list->next;
+       nskb = list_skb->next;
        while (list_skb != (struct sk_buff *)list) {
                if (skb_shinfo(list_skb) == skb_shinfo(skb)) {
-                       this = list_skb;
                        switch (n) {
                        case TX_NOTIFY_OK:
-                               __skb_unlink(this, list);
+                               __skb_unlink(list_skb, list);
+                               kfree_skb(list_skb);
                                iucv_sock_wake_msglim(sk);
-                               dev_put(this->dev);
-                               kfree_skb(this);
                                break;
                        case TX_NOTIFY_PENDING:
                                atomic_inc(&iucv->pendings);
                                break;
                        case TX_NOTIFY_DELAYED_OK:
-                               __skb_unlink(this, list);
+                               __skb_unlink(list_skb, list);
                                atomic_dec(&iucv->pendings);
                                if (atomic_read(&iucv->pendings) <= 0)
                                        iucv_sock_wake_msglim(sk);
-                               dev_put(this->dev);
-                               kfree_skb(this);
+                               kfree_skb(list_skb);
                                break;
                        case TX_NOTIFY_UNREACHABLE:
                        case TX_NOTIFY_DELAYED_UNREACHABLE:
                        case TX_NOTIFY_TPQFULL: /* not yet used */
                        case TX_NOTIFY_GENERALERROR:
                        case TX_NOTIFY_DELAYED_GENERALERROR:
-                               __skb_unlink(this, list);
-                               dev_put(this->dev);
-                               kfree_skb(this);
-                               sk->sk_state = IUCV_DISCONN;
-                               sk->sk_state_change(sk);
+                               __skb_unlink(list_skb, list);
+                               kfree_skb(list_skb);
+                               if (sk->sk_state == IUCV_CONNECTED) {
+                                       sk->sk_state = IUCV_DISCONN;
+                                       sk->sk_state_change(sk);
+                               }
                                break;
                        }
                        break;
                }
-               list_skb = list_skb->next;
+               list_skb = nskb;
+               nskb = nskb->next;
        }
+out_unlock:
        spin_unlock_irqrestore(&list->lock, flags);
 
        if (sk->sk_state == IUCV_CLOSING) {
@@ -2270,8 +2288,6 @@ static void afiucv_hs_callback_txnotify(struct sk_buff *skb,
                }
        }
 
-out_unlock:
-       bh_unlock_sock(sk);
 }
 static const struct proto_ops iucv_sock_ops = {
        .family         = PF_IUCV,
index d2726a7..63fe5f3 100644 (file)
@@ -64,7 +64,7 @@ static int l2tp_eth_dev_init(struct net_device *dev)
        struct l2tp_eth *priv = netdev_priv(dev);
 
        priv->dev = dev;
-       random_ether_addr(dev->dev_addr);
+       eth_hw_addr_random(dev);
        memset(&dev->broadcast[0], 0xff, 6);
 
        return 0;
index 8a90d75..96bc7a6 100644 (file)
@@ -82,7 +82,7 @@
 #include <net/sock.h>
 #include <linux/ppp_channel.h>
 #include <linux/ppp_defs.h>
-#include <linux/if_ppp.h>
+#include <linux/ppp-ioctl.h>
 #include <linux/file.h>
 #include <linux/hash.h>
 #include <linux/sort.h>
index d540c3b..1be7a45 100644 (file)
@@ -9,7 +9,7 @@ mac80211-y := \
        scan.o offchannel.o \
        ht.o agg-tx.o agg-rx.o \
        ibss.o \
-       mlme.o work.o \
+       work.o \
        iface.o \
        rate.o \
        michael.o \
@@ -25,7 +25,7 @@ mac80211-y := \
        wme.o \
        event.o \
        chan.o \
-       driver-trace.o
+       driver-trace.o mlme.o
 
 mac80211-$(CONFIG_MAC80211_LEDS) += led.o
 mac80211-$(CONFIG_MAC80211_DEBUGFS) += \
index 296620d..6a77d4c 100644 (file)
@@ -489,27 +489,13 @@ static int ieee80211_get_station(struct wiphy *wiphy, struct net_device *dev,
        return ret;
 }
 
-static void ieee80211_config_ap_ssid(struct ieee80211_sub_if_data *sdata,
-                                    struct beacon_parameters *params)
-{
-       struct ieee80211_bss_conf *bss_conf = &sdata->vif.bss_conf;
-
-       bss_conf->ssid_len = params->ssid_len;
-
-       if (params->ssid_len)
-               memcpy(bss_conf->ssid, params->ssid, params->ssid_len);
-
-       bss_conf->hidden_ssid =
-               (params->hidden_ssid != NL80211_HIDDEN_SSID_NOT_IN_USE);
-}
-
 static int ieee80211_set_probe_resp(struct ieee80211_sub_if_data *sdata,
-                                   u8 *resp, size_t resp_len)
+                                   const u8 *resp, size_t resp_len)
 {
        struct sk_buff *new, *old;
 
        if (!resp || !resp_len)
-               return -EINVAL;
+               return 1;
 
        old = rtnl_dereference(sdata->u.ap.probe_resp);
 
@@ -520,50 +506,28 @@ static int ieee80211_set_probe_resp(struct ieee80211_sub_if_data *sdata,
        memcpy(skb_put(new, resp_len), resp, resp_len);
 
        rcu_assign_pointer(sdata->u.ap.probe_resp, new);
-       synchronize_rcu();
-
-       if (old)
+       if (old) {
+               /* TODO: use call_rcu() */
+               synchronize_rcu();
                dev_kfree_skb(old);
+       }
 
        return 0;
 }
 
-/*
- * This handles both adding a beacon and setting new beacon info
- */
-static int ieee80211_config_beacon(struct ieee80211_sub_if_data *sdata,
-                                  struct beacon_parameters *params)
+static int ieee80211_assign_beacon(struct ieee80211_sub_if_data *sdata,
+                                  struct cfg80211_beacon_data *params)
 {
        struct beacon_data *new, *old;
        int new_head_len, new_tail_len;
-       int size;
-       int err = -EINVAL;
-       u32 changed = 0;
+       int size, err;
+       u32 changed = BSS_CHANGED_BEACON;
 
        old = rtnl_dereference(sdata->u.ap.beacon);
 
-       /* head must not be zero-length */
-       if (params->head && !params->head_len)
-               return -EINVAL;
-
-       /*
-        * This is a kludge. beacon interval should really be part
-        * of the beacon information.
-        */
-       if (params->interval &&
-           (sdata->vif.bss_conf.beacon_int != params->interval)) {
-               sdata->vif.bss_conf.beacon_int = params->interval;
-               ieee80211_bss_info_change_notify(sdata,
-                                                BSS_CHANGED_BEACON_INT);
-       }
-
        /* Need to have a beacon head if we don't have one yet */
        if (!params->head && !old)
-               return err;
-
-       /* sorry, no way to start beaconing without dtim period */
-       if (!params->dtim_period && !old)
-               return err;
+               return -EINVAL;
 
        /* new or old head? */
        if (params->head)
@@ -586,12 +550,6 @@ static int ieee80211_config_beacon(struct ieee80211_sub_if_data *sdata,
 
        /* start filling the new info now */
 
-       /* new or old dtim period? */
-       if (params->dtim_period)
-               new->dtim_period = params->dtim_period;
-       else
-               new->dtim_period = old->dtim_period;
-
        /*
         * pointers go into the block we allocated,
         * memory is | beacon_data | head | tail |
@@ -614,46 +572,37 @@ static int ieee80211_config_beacon(struct ieee80211_sub_if_data *sdata,
                if (old)
                        memcpy(new->tail, old->tail, new_tail_len);
 
-       sdata->vif.bss_conf.dtim_period = new->dtim_period;
-
-       rcu_assign_pointer(sdata->u.ap.beacon, new);
-
-       synchronize_rcu();
-
-       kfree(old);
-
        err = ieee80211_set_probe_resp(sdata, params->probe_resp,
                                       params->probe_resp_len);
-       if (!err)
+       if (err < 0)
+               return err;
+       if (err == 0)
                changed |= BSS_CHANGED_AP_PROBE_RESP;
 
-       ieee80211_config_ap_ssid(sdata, params);
-       changed |= BSS_CHANGED_BEACON_ENABLED |
-                  BSS_CHANGED_BEACON |
-                  BSS_CHANGED_SSID;
+       rcu_assign_pointer(sdata->u.ap.beacon, new);
 
-       ieee80211_bss_info_change_notify(sdata, changed);
-       return 0;
+       if (old)
+               kfree_rcu(old, rcu_head);
+
+       return changed;
 }
 
-static int ieee80211_add_beacon(struct wiphy *wiphy, struct net_device *dev,
-                               struct beacon_parameters *params)
+static int ieee80211_start_ap(struct wiphy *wiphy, struct net_device *dev,
+                             struct cfg80211_ap_settings *params)
 {
-       struct ieee80211_sub_if_data *sdata;
+       struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
        struct beacon_data *old;
        struct ieee80211_sub_if_data *vlan;
-       int ret;
-
-       sdata = IEEE80211_DEV_TO_SUB_IF(dev);
+       u32 changed = BSS_CHANGED_BEACON_INT |
+                     BSS_CHANGED_BEACON_ENABLED |
+                     BSS_CHANGED_BEACON |
+                     BSS_CHANGED_SSID;
+       int err;
 
        old = rtnl_dereference(sdata->u.ap.beacon);
        if (old)
                return -EALREADY;
 
-       ret = ieee80211_config_beacon(sdata, params);
-       if (ret)
-               return ret;
-
        /*
         * Apply control port protocol, this allows us to
         * not encrypt dynamic WEP control frames.
@@ -667,14 +616,32 @@ static int ieee80211_add_beacon(struct wiphy *wiphy, struct net_device *dev,
                        params->crypto.control_port_no_encrypt;
        }
 
+       sdata->vif.bss_conf.beacon_int = params->beacon_interval;
+       sdata->vif.bss_conf.dtim_period = params->dtim_period;
+
+       sdata->vif.bss_conf.ssid_len = params->ssid_len;
+       if (params->ssid_len)
+               memcpy(sdata->vif.bss_conf.ssid, params->ssid,
+                      params->ssid_len);
+       sdata->vif.bss_conf.hidden_ssid =
+               (params->hidden_ssid != NL80211_HIDDEN_SSID_NOT_IN_USE);
+
+       err = ieee80211_assign_beacon(sdata, &params->beacon);
+       if (err < 0)
+               return err;
+       changed |= err;
+
+       ieee80211_bss_info_change_notify(sdata, changed);
+
        return 0;
 }
 
-static int ieee80211_set_beacon(struct wiphy *wiphy, struct net_device *dev,
-                               struct beacon_parameters *params)
+static int ieee80211_change_beacon(struct wiphy *wiphy, struct net_device *dev,
+                                  struct cfg80211_beacon_data *params)
 {
        struct ieee80211_sub_if_data *sdata;
        struct beacon_data *old;
+       int err;
 
        sdata = IEEE80211_DEV_TO_SUB_IF(dev);
 
@@ -682,10 +649,14 @@ static int ieee80211_set_beacon(struct wiphy *wiphy, struct net_device *dev,
        if (!old)
                return -ENOENT;
 
-       return ieee80211_config_beacon(sdata, params);
+       err = ieee80211_assign_beacon(sdata, params);
+       if (err < 0)
+               return err;
+       ieee80211_bss_info_change_notify(sdata, err);
+       return 0;
 }
 
-static int ieee80211_del_beacon(struct wiphy *wiphy, struct net_device *dev)
+static int ieee80211_stop_ap(struct wiphy *wiphy, struct net_device *dev)
 {
        struct ieee80211_sub_if_data *sdata;
        struct beacon_data *old;
@@ -697,10 +668,11 @@ static int ieee80211_del_beacon(struct wiphy *wiphy, struct net_device *dev)
                return -ENOENT;
 
        RCU_INIT_POINTER(sdata->u.ap.beacon, NULL);
-       synchronize_rcu();
-       kfree(old);
+
+       kfree_rcu(old, rcu_head);
 
        ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BEACON_ENABLED);
+
        return 0;
 }
 
@@ -776,12 +748,10 @@ static int sta_apply_parameters(struct ieee80211_local *local,
 
                if (set & BIT(NL80211_STA_FLAG_AUTHENTICATED) &&
                    !test_sta_flag(sta, WLAN_STA_AUTH)) {
-                       ret = sta_info_move_state_checked(sta,
-                                       IEEE80211_STA_AUTH);
+                       ret = sta_info_move_state(sta, IEEE80211_STA_AUTH);
                        if (ret)
                                return ret;
-                       ret = sta_info_move_state_checked(sta,
-                                       IEEE80211_STA_ASSOC);
+                       ret = sta_info_move_state(sta, IEEE80211_STA_ASSOC);
                        if (ret)
                                return ret;
                }
@@ -789,11 +759,9 @@ static int sta_apply_parameters(struct ieee80211_local *local,
 
        if (mask & BIT(NL80211_STA_FLAG_AUTHORIZED)) {
                if (set & BIT(NL80211_STA_FLAG_AUTHORIZED))
-                       ret = sta_info_move_state_checked(sta,
-                                       IEEE80211_STA_AUTHORIZED);
+                       ret = sta_info_move_state(sta, IEEE80211_STA_AUTHORIZED);
                else if (test_sta_flag(sta, WLAN_STA_AUTHORIZED))
-                       ret = sta_info_move_state_checked(sta,
-                                       IEEE80211_STA_ASSOC);
+                       ret = sta_info_move_state(sta, IEEE80211_STA_ASSOC);
                if (ret)
                        return ret;
        }
@@ -805,12 +773,10 @@ static int sta_apply_parameters(struct ieee80211_local *local,
 
                if (!(set & BIT(NL80211_STA_FLAG_AUTHENTICATED)) &&
                    test_sta_flag(sta, WLAN_STA_AUTH)) {
-                       ret = sta_info_move_state_checked(sta,
-                                       IEEE80211_STA_AUTH);
+                       ret = sta_info_move_state(sta, IEEE80211_STA_AUTH);
                        if (ret)
                                return ret;
-                       ret = sta_info_move_state_checked(sta,
-                                       IEEE80211_STA_NONE);
+                       ret = sta_info_move_state(sta, IEEE80211_STA_NONE);
                        if (ret)
                                return ret;
                }
@@ -944,8 +910,8 @@ static int ieee80211_add_station(struct wiphy *wiphy, struct net_device *dev,
        if (!sta)
                return -ENOMEM;
 
-       sta_info_move_state(sta, IEEE80211_STA_AUTH);
-       sta_info_move_state(sta, IEEE80211_STA_ASSOC);
+       sta_info_pre_move_state(sta, IEEE80211_STA_AUTH);
+       sta_info_pre_move_state(sta, IEEE80211_STA_ASSOC);
 
        err = sta_apply_parameters(local, sta, params);
        if (err) {
@@ -1001,6 +967,7 @@ static int ieee80211_change_station(struct wiphy *wiphy,
        struct ieee80211_local *local = wiphy_priv(wiphy);
        struct sta_info *sta;
        struct ieee80211_sub_if_data *vlansdata;
+       int err;
 
        mutex_lock(&local->sta_mtx);
 
@@ -1040,7 +1007,11 @@ static int ieee80211_change_station(struct wiphy *wiphy,
                ieee80211_send_layer2_update(sta);
        }
 
-       sta_apply_parameters(local, sta, params);
+       err = sta_apply_parameters(local, sta, params);
+       if (err) {
+               mutex_unlock(&local->sta_mtx);
+               return err;
+       }
 
        if (test_sta_flag(sta, WLAN_STA_TDLS_PEER) && params->supported_rates)
                rate_control_rate_init(sta);
@@ -1341,6 +1312,8 @@ static int ieee80211_update_mesh_config(struct wiphy *wiphy,
                conf->dot11MeshHWMPRannInterval =
                        nconf->dot11MeshHWMPRannInterval;
        }
+       if (_chg_mesh_attr(NL80211_MESHCONF_FORWARDING, mask))
+               conf->dot11MeshForwarding = nconf->dot11MeshForwarding;
        return 0;
 }
 
@@ -1622,19 +1595,15 @@ static int ieee80211_assoc(struct wiphy *wiphy, struct net_device *dev,
 }
 
 static int ieee80211_deauth(struct wiphy *wiphy, struct net_device *dev,
-                           struct cfg80211_deauth_request *req,
-                           void *cookie)
+                           struct cfg80211_deauth_request *req)
 {
-       return ieee80211_mgd_deauth(IEEE80211_DEV_TO_SUB_IF(dev),
-                                   req, cookie);
+       return ieee80211_mgd_deauth(IEEE80211_DEV_TO_SUB_IF(dev), req);
 }
 
 static int ieee80211_disassoc(struct wiphy *wiphy, struct net_device *dev,
-                             struct cfg80211_disassoc_request *req,
-                             void *cookie)
+                             struct cfg80211_disassoc_request *req)
 {
-       return ieee80211_mgd_disassoc(IEEE80211_DEV_TO_SUB_IF(dev),
-                                     req, cookie);
+       return ieee80211_mgd_disassoc(IEEE80211_DEV_TO_SUB_IF(dev), req);
 }
 
 static int ieee80211_join_ibss(struct wiphy *wiphy, struct net_device *dev,
@@ -1868,7 +1837,6 @@ static int ieee80211_set_cqm_rssi_config(struct wiphy *wiphy,
                                         s32 rssi_thold, u32 rssi_hyst)
 {
        struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
-       struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
        struct ieee80211_vif *vif = &sdata->vif;
        struct ieee80211_bss_conf *bss_conf = &vif->bss_conf;
 
@@ -1879,14 +1847,9 @@ static int ieee80211_set_cqm_rssi_config(struct wiphy *wiphy,
        bss_conf->cqm_rssi_thold = rssi_thold;
        bss_conf->cqm_rssi_hyst = rssi_hyst;
 
-       if (!(local->hw.flags & IEEE80211_HW_SUPPORTS_CQM_RSSI)) {
-               if (sdata->vif.type != NL80211_IFTYPE_STATION)
-                       return -EOPNOTSUPP;
-               return 0;
-       }
-
        /* tell the driver upon association, unless already associated */
-       if (sdata->u.mgd.associated)
+       if (sdata->u.mgd.associated &&
+           sdata->vif.driver_flags & IEEE80211_VIF_SUPPORTS_CQM_RSSI)
                ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_CQM);
 
        return 0;
@@ -1907,8 +1870,11 @@ static int ieee80211_set_bitrate_mask(struct wiphy *wiphy,
                        return ret;
        }
 
-       for (i = 0; i < IEEE80211_NUM_BANDS; i++)
+       for (i = 0; i < IEEE80211_NUM_BANDS; i++) {
                sdata->rc_rateidx_mask[i] = mask->control[i].legacy;
+               memcpy(sdata->rc_rateidx_mcs_mask[i], mask->control[i].mcs,
+                      sizeof(mask->control[i].mcs));
+       }
 
        return 0;
 }
@@ -2030,7 +1996,7 @@ ieee80211_offchan_tx_done(struct ieee80211_work *wk, struct sk_buff *skb)
        if (wk->offchan_tx.wait && !wk->offchan_tx.status)
                cfg80211_mgmt_tx_status(wk->sdata->dev,
                                        (unsigned long) wk->offchan_tx.frame,
-                                       wk->ie, wk->ie_len, false, GFP_KERNEL);
+                                       wk->data, wk->data_len, false, GFP_KERNEL);
 
        return WORK_DONE_DESTROY;
 }
@@ -2181,8 +2147,8 @@ static int ieee80211_mgmt_tx(struct wiphy *wiphy, struct net_device *dev,
        wk->done = ieee80211_offchan_tx_done;
        wk->offchan_tx.frame = skb;
        wk->offchan_tx.wait = wait;
-       wk->ie_len = len;
-       memcpy(wk->ie, buf, len);
+       wk->data_len = len;
+       memcpy(wk->data, buf, len);
 
        ieee80211_add_work(wk);
        return 0;
@@ -2701,9 +2667,9 @@ struct cfg80211_ops mac80211_config_ops = {
        .get_key = ieee80211_get_key,
        .set_default_key = ieee80211_config_default_key,
        .set_default_mgmt_key = ieee80211_config_default_mgmt_key,
-       .add_beacon = ieee80211_add_beacon,
-       .set_beacon = ieee80211_set_beacon,
-       .del_beacon = ieee80211_del_beacon,
+       .start_ap = ieee80211_start_ap,
+       .change_beacon = ieee80211_change_beacon,
+       .stop_ap = ieee80211_stop_ap,
        .add_station = ieee80211_add_station,
        .del_station = ieee80211_del_station,
        .change_station = ieee80211_change_station,
index 889c3e9..d1f7abd 100644 (file)
@@ -20,23 +20,29 @@ __ieee80211_get_channel_mode(struct ieee80211_local *local,
                if (!ieee80211_sdata_running(sdata))
                        continue;
 
-               if (sdata->vif.type == NL80211_IFTYPE_MONITOR)
+               switch (sdata->vif.type) {
+               case NL80211_IFTYPE_MONITOR:
                        continue;
-
-               if (sdata->vif.type == NL80211_IFTYPE_STATION &&
-                   !sdata->u.mgd.associated)
-                       continue;
-
-               if (sdata->vif.type == NL80211_IFTYPE_ADHOC) {
+               case NL80211_IFTYPE_STATION:
+                       if (!sdata->u.mgd.associated)
+                               continue;
+                       break;
+               case NL80211_IFTYPE_ADHOC:
                        if (!sdata->u.ibss.ssid_len)
                                continue;
                        if (!sdata->u.ibss.fixed_channel)
                                return CHAN_MODE_HOPPING;
-               }
-
-               if (sdata->vif.type == NL80211_IFTYPE_AP &&
-                   !sdata->u.ap.beacon)
+                       break;
+               case NL80211_IFTYPE_AP_VLAN:
+                       /* will also have _AP interface */
                        continue;
+               case NL80211_IFTYPE_AP:
+                       if (!sdata->u.ap.beacon)
+                               continue;
+                       break;
+               default:
+                       break;
+               }
 
                return CHAN_MODE_FIXED;
        }
index 90baea5..483e96e 100644 (file)
@@ -247,8 +247,6 @@ static ssize_t hwflags_read(struct file *file, char __user *user_buf,
                sf += snprintf(buf + sf, mxln - sf, "SUPPORTS_DYNAMIC_PS\n");
        if (local->hw.flags & IEEE80211_HW_MFP_CAPABLE)
                sf += snprintf(buf + sf, mxln - sf, "MFP_CAPABLE\n");
-       if (local->hw.flags & IEEE80211_HW_BEACON_FILTER)
-               sf += snprintf(buf + sf, mxln - sf, "BEACON_FILTER\n");
        if (local->hw.flags & IEEE80211_HW_SUPPORTS_STATIC_SMPS)
                sf += snprintf(buf + sf, mxln - sf, "SUPPORTS_STATIC_SMPS\n");
        if (local->hw.flags & IEEE80211_HW_SUPPORTS_DYNAMIC_SMPS)
@@ -259,14 +257,14 @@ static ssize_t hwflags_read(struct file *file, char __user *user_buf,
                sf += snprintf(buf + sf, mxln - sf, "REPORTS_TX_ACK_STATUS\n");
        if (local->hw.flags & IEEE80211_HW_CONNECTION_MONITOR)
                sf += snprintf(buf + sf, mxln - sf, "CONNECTION_MONITOR\n");
-       if (local->hw.flags & IEEE80211_HW_SUPPORTS_CQM_RSSI)
-               sf += snprintf(buf + sf, mxln - sf, "SUPPORTS_CQM_RSSI\n");
        if (local->hw.flags & IEEE80211_HW_SUPPORTS_PER_STA_GTK)
                sf += snprintf(buf + sf, mxln - sf, "SUPPORTS_PER_STA_GTK\n");
        if (local->hw.flags & IEEE80211_HW_AP_LINK_PS)
                sf += snprintf(buf + sf, mxln - sf, "AP_LINK_PS\n");
        if (local->hw.flags & IEEE80211_HW_TX_AMPDU_SETUP_IN_HW)
                sf += snprintf(buf + sf, mxln - sf, "TX_AMPDU_SETUP_IN_HW\n");
+       if (local->hw.flags & IEEE80211_HW_SCAN_WHILE_IDLE)
+               sf += snprintf(buf + sf, mxln - sf, "SCAN_WHILE_IDLE\n");
 
        rv = simple_read_from_buffer(user_buf, count, ppos, buf, strlen(buf));
        kfree(buf);
index 176c08f..510ed1d 100644 (file)
@@ -87,6 +87,21 @@ static ssize_t ieee80211_if_fmt_##name(                                      \
 #define IEEE80211_IF_FMT_SIZE(name, field)                             \
                IEEE80211_IF_FMT(name, field, "%zd\n")
 
+#define IEEE80211_IF_FMT_HEXARRAY(name, field)                         \
+static ssize_t ieee80211_if_fmt_##name(                                        \
+       const struct ieee80211_sub_if_data *sdata,                      \
+       char *buf, int buflen)                                          \
+{                                                                      \
+       char *p = buf;                                                  \
+       int i;                                                          \
+       for (i = 0; i < sizeof(sdata->field); i++) {                    \
+               p += scnprintf(p, buflen + buf - p, "%.2x ",            \
+                                sdata->field[i]);                      \
+       }                                                               \
+       p += scnprintf(p, buflen + buf - p, "\n");                      \
+       return p - buf;                                                 \
+}
+
 #define IEEE80211_IF_FMT_ATOMIC(name, field)                           \
 static ssize_t ieee80211_if_fmt_##name(                                        \
        const struct ieee80211_sub_if_data *sdata,                      \
@@ -148,6 +163,11 @@ IEEE80211_IF_FILE(rc_rateidx_mask_2ghz, rc_rateidx_mask[IEEE80211_BAND_2GHZ],
                  HEX);
 IEEE80211_IF_FILE(rc_rateidx_mask_5ghz, rc_rateidx_mask[IEEE80211_BAND_5GHZ],
                  HEX);
+IEEE80211_IF_FILE(rc_rateidx_mcs_mask_2ghz,
+                 rc_rateidx_mcs_mask[IEEE80211_BAND_2GHZ], HEXARRAY);
+IEEE80211_IF_FILE(rc_rateidx_mcs_mask_5ghz,
+                 rc_rateidx_mcs_mask[IEEE80211_BAND_5GHZ], HEXARRAY);
+
 IEEE80211_IF_FILE(flags, flags, HEX);
 IEEE80211_IF_FILE(state, state, LHEX);
 IEEE80211_IF_FILE(channel_type, vif.bss_conf.channel_type, DEC);
@@ -422,6 +442,7 @@ IEEE80211_IF_FILE(dot11MeshGateAnnouncementProtocol,
                u.mesh.mshcfg.dot11MeshGateAnnouncementProtocol, DEC);
 IEEE80211_IF_FILE(dot11MeshHWMPRannInterval,
                u.mesh.mshcfg.dot11MeshHWMPRannInterval, DEC);
+IEEE80211_IF_FILE(dot11MeshForwarding, u.mesh.mshcfg.dot11MeshForwarding, DEC);
 #endif
 
 
@@ -441,6 +462,8 @@ static void add_sta_files(struct ieee80211_sub_if_data *sdata)
        DEBUGFS_ADD(channel_type);
        DEBUGFS_ADD(rc_rateidx_mask_2ghz);
        DEBUGFS_ADD(rc_rateidx_mask_5ghz);
+       DEBUGFS_ADD(rc_rateidx_mcs_mask_2ghz);
+       DEBUGFS_ADD(rc_rateidx_mcs_mask_5ghz);
 
        DEBUGFS_ADD(bssid);
        DEBUGFS_ADD(aid);
@@ -458,6 +481,8 @@ static void add_ap_files(struct ieee80211_sub_if_data *sdata)
        DEBUGFS_ADD(channel_type);
        DEBUGFS_ADD(rc_rateidx_mask_2ghz);
        DEBUGFS_ADD(rc_rateidx_mask_5ghz);
+       DEBUGFS_ADD(rc_rateidx_mcs_mask_2ghz);
+       DEBUGFS_ADD(rc_rateidx_mcs_mask_5ghz);
 
        DEBUGFS_ADD(num_sta_authorized);
        DEBUGFS_ADD(num_sta_ps);
@@ -468,6 +493,12 @@ static void add_ap_files(struct ieee80211_sub_if_data *sdata)
 
 static void add_ibss_files(struct ieee80211_sub_if_data *sdata)
 {
+       DEBUGFS_ADD(channel_type);
+       DEBUGFS_ADD(rc_rateidx_mask_2ghz);
+       DEBUGFS_ADD(rc_rateidx_mask_5ghz);
+       DEBUGFS_ADD(rc_rateidx_mcs_mask_2ghz);
+       DEBUGFS_ADD(rc_rateidx_mcs_mask_5ghz);
+
        DEBUGFS_ADD_MODE(tsf, 0600);
 }
 
@@ -479,6 +510,8 @@ static void add_wds_files(struct ieee80211_sub_if_data *sdata)
        DEBUGFS_ADD(channel_type);
        DEBUGFS_ADD(rc_rateidx_mask_2ghz);
        DEBUGFS_ADD(rc_rateidx_mask_5ghz);
+       DEBUGFS_ADD(rc_rateidx_mcs_mask_2ghz);
+       DEBUGFS_ADD(rc_rateidx_mcs_mask_5ghz);
 
        DEBUGFS_ADD(peer);
 }
@@ -491,6 +524,8 @@ static void add_vlan_files(struct ieee80211_sub_if_data *sdata)
        DEBUGFS_ADD(channel_type);
        DEBUGFS_ADD(rc_rateidx_mask_2ghz);
        DEBUGFS_ADD(rc_rateidx_mask_5ghz);
+       DEBUGFS_ADD(rc_rateidx_mcs_mask_2ghz);
+       DEBUGFS_ADD(rc_rateidx_mcs_mask_5ghz);
 }
 
 static void add_monitor_files(struct ieee80211_sub_if_data *sdata)
index d86217d..6d45804 100644 (file)
@@ -63,14 +63,15 @@ static ssize_t sta_flags_read(struct file *file, char __user *userbuf,
        test_sta_flag(sta, WLAN_STA_##flg) ? #flg "\n" : ""
 
        int res = scnprintf(buf, sizeof(buf),
-                           "%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s",
+                           "%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s",
                            TEST(AUTH), TEST(ASSOC), TEST(PS_STA),
                            TEST(PS_DRIVER), TEST(AUTHORIZED),
                            TEST(SHORT_PREAMBLE),
                            TEST(WME), TEST(WDS), TEST(CLEAR_PS_FILT),
                            TEST(MFP), TEST(BLOCK_BA), TEST(PSPOLL),
                            TEST(UAPSD), TEST(SP), TEST(TDLS_PEER),
-                           TEST(TDLS_PEER_AUTH), TEST(RATE_CONTROL));
+                           TEST(TDLS_PEER_AUTH), TEST(4ADDR_EVENT),
+                           TEST(INSERTED), TEST(RATE_CONTROL));
 #undef TEST
        return simple_read_from_buffer(userbuf, count, ppos, buf, res);
 }
index e8960ae..70dfb64 100644 (file)
@@ -253,6 +253,7 @@ static inline int drv_set_key(struct ieee80211_local *local,
 
        might_sleep();
 
+       sdata = get_bss_sdata(sdata);
        check_sdata_in_driver(sdata);
 
        trace_drv_set_key(local, cmd, sdata, sta, key);
@@ -272,6 +273,7 @@ static inline void drv_update_tkip_key(struct ieee80211_local *local,
        if (sta)
                ista = &sta->sta;
 
+       sdata = get_bss_sdata(sdata);
        check_sdata_in_driver(sdata);
 
        trace_drv_update_tkip_key(local, sdata, conf, ista, iv32);
@@ -476,6 +478,37 @@ static inline void drv_sta_remove(struct ieee80211_local *local,
        trace_drv_return_void(local);
 }
 
+static inline __must_check
+int drv_sta_state(struct ieee80211_local *local,
+                 struct ieee80211_sub_if_data *sdata,
+                 struct sta_info *sta,
+                 enum ieee80211_sta_state old_state,
+                 enum ieee80211_sta_state new_state)
+{
+       int ret = 0;
+
+       might_sleep();
+
+       sdata = get_bss_sdata(sdata);
+       check_sdata_in_driver(sdata);
+
+       trace_drv_sta_state(local, sdata, &sta->sta, old_state, new_state);
+       if (local->ops->sta_state) {
+               ret = local->ops->sta_state(&local->hw, &sdata->vif, &sta->sta,
+                                           old_state, new_state);
+       } else if (old_state == IEEE80211_STA_AUTH &&
+                  new_state == IEEE80211_STA_ASSOC) {
+               ret = drv_sta_add(local, sdata, &sta->sta);
+               if (ret == 0)
+                       sta->uploaded = true;
+       } else if (old_state == IEEE80211_STA_ASSOC &&
+                  new_state == IEEE80211_STA_AUTH) {
+               drv_sta_remove(local, sdata, &sta->sta);
+       }
+       trace_drv_return_int(local, ret);
+       return ret;
+}
+
 static inline int drv_conf_tx(struct ieee80211_local *local,
                              struct ieee80211_sub_if_data *sdata, u16 queue,
                              const struct ieee80211_tx_queue_params *params)
index 6e9df8f..384e2f0 100644 (file)
@@ -635,6 +635,38 @@ TRACE_EVENT(drv_sta_notify,
        )
 );
 
+TRACE_EVENT(drv_sta_state,
+       TP_PROTO(struct ieee80211_local *local,
+                struct ieee80211_sub_if_data *sdata,
+                struct ieee80211_sta *sta,
+                enum ieee80211_sta_state old_state,
+                enum ieee80211_sta_state new_state),
+
+       TP_ARGS(local, sdata, sta, old_state, new_state),
+
+       TP_STRUCT__entry(
+               LOCAL_ENTRY
+               VIF_ENTRY
+               STA_ENTRY
+               __field(u32, old_state)
+               __field(u32, new_state)
+       ),
+
+       TP_fast_assign(
+               LOCAL_ASSIGN;
+               VIF_ASSIGN;
+               STA_ASSIGN;
+               __entry->old_state = old_state;
+               __entry->new_state = new_state;
+       ),
+
+       TP_printk(
+               LOCAL_PR_FMT  VIF_PR_FMT  STA_PR_FMT " state: %d->%d",
+               LOCAL_PR_ARG, VIF_PR_ARG, STA_PR_ARG,
+               __entry->old_state, __entry->new_state
+       )
+);
+
 TRACE_EVENT(drv_sta_add,
        TP_PROTO(struct ieee80211_local *local,
                 struct ieee80211_sub_if_data *sdata,
index a464396..7f9ac57 100644 (file)
@@ -20,7 +20,6 @@
 #include <linux/etherdevice.h>
 #include <linux/rtnetlink.h>
 #include <net/mac80211.h>
-#include <asm/unaligned.h>
 
 #include "ieee80211_i.h"
 #include "driver-ops.h"
 #define IEEE80211_IBSS_MAX_STA_ENTRIES 128
 
 
-static void ieee80211_rx_mgmt_auth_ibss(struct ieee80211_sub_if_data *sdata,
-                                       struct ieee80211_mgmt *mgmt,
-                                       size_t len)
-{
-       u16 auth_alg, auth_transaction;
-
-       lockdep_assert_held(&sdata->u.ibss.mtx);
-
-       if (len < 24 + 6)
-               return;
-
-       auth_alg = le16_to_cpu(mgmt->u.auth.auth_alg);
-       auth_transaction = le16_to_cpu(mgmt->u.auth.auth_transaction);
-
-       /*
-        * IEEE 802.11 standard does not require authentication in IBSS
-        * networks and most implementations do not seem to use it.
-        * However, try to reply to authentication attempts if someone
-        * has actually implemented this.
-        */
-       if (auth_alg == WLAN_AUTH_OPEN && auth_transaction == 1)
-               ieee80211_send_auth(sdata, 2, WLAN_AUTH_OPEN, NULL, 0,
-                                   sdata->u.ibss.bssid, NULL, 0, 0);
-}
-
 static void __ieee80211_sta_join_ibss(struct ieee80211_sub_if_data *sdata,
                                      const u8 *bssid, const int beacon_int,
                                      struct ieee80211_channel *chan,
@@ -276,7 +250,8 @@ static void ieee80211_sta_join_ibss(struct ieee80211_sub_if_data *sdata,
                                  cbss->tsf);
 }
 
-static struct sta_info *ieee80211_ibss_finish_sta(struct sta_info *sta)
+static struct sta_info *ieee80211_ibss_finish_sta(struct sta_info *sta,
+                                                 bool auth)
        __acquires(RCU)
 {
        struct ieee80211_sub_if_data *sdata = sta->sdata;
@@ -290,22 +265,34 @@ static struct sta_info *ieee80211_ibss_finish_sta(struct sta_info *sta)
                    addr, sdata->name);
 #endif
 
-       sta_info_move_state(sta, IEEE80211_STA_AUTH);
-       sta_info_move_state(sta, IEEE80211_STA_ASSOC);
-       sta_info_move_state(sta, IEEE80211_STA_AUTHORIZED);
+       sta_info_pre_move_state(sta, IEEE80211_STA_AUTH);
+       sta_info_pre_move_state(sta, IEEE80211_STA_ASSOC);
+       /* authorize the station only if the network is not RSN protected. If
+        * not wait for the userspace to authorize it */
+       if (!sta->sdata->u.ibss.control_port)
+               sta_info_pre_move_state(sta, IEEE80211_STA_AUTHORIZED);
 
        rate_control_rate_init(sta);
 
        /* If it fails, maybe we raced another insertion? */
        if (sta_info_insert_rcu(sta))
                return sta_info_get(sdata, addr);
+       if (auth) {
+#ifdef CONFIG_MAC80211_IBSS_DEBUG
+               printk(KERN_DEBUG "TX Auth SA=%pM DA=%pM BSSID=%pM"
+                      "(auth_transaction=1)\n", sdata->vif.addr,
+                      sdata->u.ibss.bssid, addr);
+#endif
+               ieee80211_send_auth(sdata, 1, WLAN_AUTH_OPEN, NULL, 0,
+                                   addr, sdata->u.ibss.bssid, NULL, 0, 0);
+       }
        return sta;
 }
 
 static struct sta_info *
 ieee80211_ibss_add_sta(struct ieee80211_sub_if_data *sdata,
                       const u8 *bssid, const u8 *addr,
-                      u32 supp_rates)
+                      u32 supp_rates, bool auth)
        __acquires(RCU)
 {
        struct ieee80211_if_ibss *ifibss = &sdata->u.ibss;
@@ -347,7 +334,42 @@ ieee80211_ibss_add_sta(struct ieee80211_sub_if_data *sdata,
        sta->sta.supp_rates[band] = supp_rates |
                        ieee80211_mandatory_rates(local, band);
 
-       return ieee80211_ibss_finish_sta(sta);
+       return ieee80211_ibss_finish_sta(sta, auth);
+}
+
+static void ieee80211_rx_mgmt_auth_ibss(struct ieee80211_sub_if_data *sdata,
+                                       struct ieee80211_mgmt *mgmt,
+                                       size_t len)
+{
+       u16 auth_alg, auth_transaction;
+
+       lockdep_assert_held(&sdata->u.ibss.mtx);
+
+       if (len < 24 + 6)
+               return;
+
+       auth_alg = le16_to_cpu(mgmt->u.auth.auth_alg);
+       auth_transaction = le16_to_cpu(mgmt->u.auth.auth_transaction);
+
+       if (auth_alg != WLAN_AUTH_OPEN || auth_transaction != 1)
+               return;
+#ifdef CONFIG_MAC80211_IBSS_DEBUG
+       printk(KERN_DEBUG "%s: RX Auth SA=%pM DA=%pM BSSID=%pM."
+              "(auth_transaction=%d)\n",
+              sdata->name, mgmt->sa, mgmt->da, mgmt->bssid, auth_transaction);
+#endif
+       sta_info_destroy_addr(sdata, mgmt->sa);
+       ieee80211_ibss_add_sta(sdata, mgmt->bssid, mgmt->sa, 0, false);
+       rcu_read_unlock();
+
+       /*
+        * IEEE 802.11 standard does not require authentication in IBSS
+        * networks and most implementations do not seem to use it.
+        * However, try to reply to authentication attempts if someone
+        * has actually implemented this.
+        */
+       ieee80211_send_auth(sdata, 2, WLAN_AUTH_OPEN, NULL, 0,
+                           mgmt->sa, sdata->u.ibss.bssid, NULL, 0, 0);
 }
 
 static void ieee80211_rx_bss_info(struct ieee80211_sub_if_data *sdata,
@@ -412,7 +434,7 @@ static void ieee80211_rx_bss_info(struct ieee80211_sub_if_data *sdata,
                        } else {
                                rcu_read_unlock();
                                sta = ieee80211_ibss_add_sta(sdata, mgmt->bssid,
-                                               mgmt->sa, supp_rates);
+                                               mgmt->sa, supp_rates, true);
                        }
                }
 
@@ -540,7 +562,7 @@ static void ieee80211_rx_bss_info(struct ieee80211_sub_if_data *sdata,
                ieee80211_sta_join_ibss(sdata, bss);
                supp_rates = ieee80211_sta_get_rates(local, elems, band);
                ieee80211_ibss_add_sta(sdata, mgmt->bssid, mgmt->sa,
-                                      supp_rates);
+                                      supp_rates, true);
                rcu_read_unlock();
        }
 
@@ -643,8 +665,7 @@ static void ieee80211_sta_merge_ibss(struct ieee80211_sub_if_data *sdata)
               "IBSS networks with same SSID (merge)\n", sdata->name);
 
        ieee80211_request_internal_scan(sdata,
-                       ifibss->ssid, ifibss->ssid_len,
-                       ifibss->fixed_channel ? ifibss->channel : NULL);
+                       ifibss->ssid, ifibss->ssid_len, NULL);
 }
 
 static void ieee80211_sta_create_ibss(struct ieee80211_sub_if_data *sdata)
@@ -855,9 +876,6 @@ static void ieee80211_rx_mgmt_probe_resp(struct ieee80211_sub_if_data *sdata,
        size_t baselen;
        struct ieee802_11_elems elems;
 
-       if (memcmp(mgmt->da, sdata->vif.addr, ETH_ALEN))
-               return; /* ignore ProbeResp to foreign address */
-
        baselen = (u8 *) mgmt->u.probe_resp.variable - (u8 *) mgmt;
        if (baselen > len)
                return;
@@ -945,7 +963,7 @@ void ieee80211_ibss_work(struct ieee80211_sub_if_data *sdata)
                list_del(&sta->list);
                spin_unlock_bh(&ifibss->incomplete_lock);
 
-               ieee80211_ibss_finish_sta(sta);
+               ieee80211_ibss_finish_sta(sta, true);
                rcu_read_unlock();
                spin_lock_bh(&ifibss->incomplete_lock);
        }
@@ -1059,6 +1077,7 @@ int ieee80211_ibss_join(struct ieee80211_sub_if_data *sdata,
                sdata->u.ibss.fixed_bssid = false;
 
        sdata->u.ibss.privacy = params->privacy;
+       sdata->u.ibss.control_port = params->control_port;
        sdata->u.ibss.basic_rates = params->basic_rates;
        memcpy(sdata->vif.bss_conf.mcast_rate, params->mcast_rate,
               sizeof(params->mcast_rate));
index 2f0642d..cee0c74 100644 (file)
@@ -228,7 +228,7 @@ struct ieee80211_rx_data {
 struct beacon_data {
        u8 *head, *tail;
        int head_len, tail_len;
-       int dtim_period;
+       struct rcu_head rcu_head;
 };
 
 struct ieee80211_if_ap {
@@ -280,10 +280,6 @@ struct mesh_preq_queue {
 
 enum ieee80211_work_type {
        IEEE80211_WORK_ABORT,
-       IEEE80211_WORK_DIRECT_PROBE,
-       IEEE80211_WORK_AUTH,
-       IEEE80211_WORK_ASSOC_BEACON_WAIT,
-       IEEE80211_WORK_ASSOC,
        IEEE80211_WORK_REMAIN_ON_CHANNEL,
        IEEE80211_WORK_OFFCHANNEL_TX,
 };
@@ -316,36 +312,10 @@ struct ieee80211_work {
        unsigned long timeout;
        enum ieee80211_work_type type;
 
-       u8 filter_ta[ETH_ALEN];
-
        bool started;
 
        union {
                struct {
-                       int tries;
-                       u16 algorithm, transaction;
-                       u8 ssid[IEEE80211_MAX_SSID_LEN];
-                       u8 ssid_len;
-                       u8 key[WLAN_KEY_LEN_WEP104];
-                       u8 key_len, key_idx;
-                       bool privacy;
-                       bool synced;
-               } probe_auth;
-               struct {
-                       struct cfg80211_bss *bss;
-                       const u8 *supp_rates;
-                       const u8 *ht_information_ie;
-                       enum ieee80211_smps_mode smps;
-                       int tries;
-                       u16 capability;
-                       u8 prev_bssid[ETH_ALEN];
-                       u8 ssid[IEEE80211_MAX_SSID_LEN];
-                       u8 ssid_len;
-                       u8 supp_rates_len;
-                       bool wmm_used, use_11n, uapsd_used;
-                       bool synced;
-               } assoc;
-               struct {
                        u32 duration;
                } remain;
                struct {
@@ -355,9 +325,8 @@ struct ieee80211_work {
                } offchan_tx;
        };
 
-       int ie_len;
-       /* must be last */
-       u8 ie[0];
+       size_t data_len;
+       u8 data[];
 };
 
 /* flags used in struct ieee80211_if_managed.flags */
@@ -373,6 +342,43 @@ enum ieee80211_sta_flags {
        IEEE80211_STA_RESET_SIGNAL_AVE  = BIT(9),
 };
 
+struct ieee80211_mgd_auth_data {
+       struct cfg80211_bss *bss;
+       unsigned long timeout;
+       int tries;
+       u16 algorithm, expected_transaction;
+
+       u8 key[WLAN_KEY_LEN_WEP104];
+       u8 key_len, key_idx;
+       bool synced;
+       bool done;
+
+       size_t ie_len;
+       u8 ie[];
+};
+
+struct ieee80211_mgd_assoc_data {
+       struct cfg80211_bss *bss;
+       const u8 *supp_rates;
+       const u8 *ht_information_ie;
+
+       unsigned long timeout;
+       int tries;
+
+       u16 capability;
+       u8 prev_bssid[ETH_ALEN];
+       u8 ssid[IEEE80211_MAX_SSID_LEN];
+       u8 ssid_len;
+       u8 supp_rates_len;
+       bool wmm_used, uapsd_used;
+       bool have_beacon;
+       bool sent_assoc;
+       bool synced;
+
+       size_t ie_len;
+       u8 ie[];
+};
+
 struct ieee80211_if_managed {
        struct timer_list timer;
        struct timer_list conn_mon_timer;
@@ -389,6 +395,8 @@ struct ieee80211_if_managed {
 
        struct mutex mtx;
        struct cfg80211_bss *associated;
+       struct ieee80211_mgd_auth_data *auth_data;
+       struct ieee80211_mgd_assoc_data *assoc_data;
 
        u8 bssid[ETH_ALEN];
 
@@ -470,6 +478,8 @@ struct ieee80211_if_ibss {
        bool fixed_channel;
        bool privacy;
 
+       bool control_port;
+
        u8 bssid[ETH_ALEN];
        u8 ssid[IEEE80211_MAX_SSID_LEN];
        u8 ssid_len, ie_len;
@@ -646,6 +656,7 @@ struct ieee80211_sub_if_data {
 
        /* bitmap of allowed (non-MCS) rate indexes for rate control */
        u32 rc_rateidx_mask[IEEE80211_NUM_BANDS];
+       u8  rc_rateidx_mcs_mask[IEEE80211_NUM_BANDS][IEEE80211_HT_MCS_MASK_LEN];
 
        union {
                struct ieee80211_if_ap ap;
@@ -769,7 +780,6 @@ struct ieee80211_local {
        struct list_head work_list;
        struct timer_list work_timer;
        struct work_struct work_work;
-       struct sk_buff_head work_skb_queue;
 
        /*
         * private workqueue to mac80211. mac80211 makes this accessible
@@ -1118,12 +1128,6 @@ static inline struct ieee80211_local *hw_to_local(
        return container_of(hw, struct ieee80211_local, hw);
 }
 
-static inline struct ieee80211_hw *local_to_hw(
-       struct ieee80211_local *local)
-{
-       return &local->hw;
-}
-
 
 static inline int ieee80211_bssid_match(const u8 *raddr, const u8 *addr)
 {
@@ -1146,11 +1150,9 @@ int ieee80211_mgd_auth(struct ieee80211_sub_if_data *sdata,
 int ieee80211_mgd_assoc(struct ieee80211_sub_if_data *sdata,
                        struct cfg80211_assoc_request *req);
 int ieee80211_mgd_deauth(struct ieee80211_sub_if_data *sdata,
-                        struct cfg80211_deauth_request *req,
-                        void *cookie);
+                        struct cfg80211_deauth_request *req);
 int ieee80211_mgd_disassoc(struct ieee80211_sub_if_data *sdata,
-                          struct cfg80211_disassoc_request *req,
-                          void *cookie);
+                          struct cfg80211_disassoc_request *req);
 void ieee80211_send_pspoll(struct ieee80211_local *local,
                           struct ieee80211_sub_if_data *sdata);
 void ieee80211_recalc_ps(struct ieee80211_local *local, s32 latency);
@@ -1168,6 +1170,7 @@ void ieee80211_sta_rx_queued_mgmt(struct ieee80211_sub_if_data *sdata,
                                  struct sk_buff *skb);
 void ieee80211_sta_reset_beacon_monitor(struct ieee80211_sub_if_data *sdata);
 void ieee80211_sta_reset_conn_monitor(struct ieee80211_sub_if_data *sdata);
+void ieee80211_mgd_teardown(struct ieee80211_sub_if_data *sdata);
 
 /* IBSS code */
 void ieee80211_ibss_notify_scan_completed(struct ieee80211_local *local);
@@ -1396,7 +1399,7 @@ void ieee80211_add_pending_skbs_fn(struct ieee80211_local *local,
 void ieee80211_send_auth(struct ieee80211_sub_if_data *sdata,
                         u16 transaction, u16 auth_alg,
                         u8 *extra, size_t extra_len, const u8 *bssid,
-                        const u8 *key, u8 key_len, u8 key_idx);
+                        const u8 *da, const u8 *key, u8 key_len, u8 key_idx);
 int ieee80211_build_preq_ies(struct ieee80211_local *local, u8 *buffer,
                             const u8 *ie, size_t ie_len,
                             enum ieee80211_band band, u32 rate_mask,
@@ -1436,8 +1439,6 @@ void ieee80211_work_init(struct ieee80211_local *local);
 void ieee80211_add_work(struct ieee80211_work *wk);
 void free_work(struct ieee80211_work *wk);
 void ieee80211_work_purge(struct ieee80211_sub_if_data *sdata);
-ieee80211_rx_result ieee80211_work_rx_mgmt(struct ieee80211_sub_if_data *sdata,
-                                          struct sk_buff *skb);
 int ieee80211_wk_remain_on_channel(struct ieee80211_sub_if_data *sdata,
                                   struct ieee80211_channel *chan,
                                   enum nl80211_channel_type channel_type,
index 8e2137b..620ca8d 100644 (file)
@@ -318,9 +318,9 @@ static int ieee80211_do_open(struct net_device *dev, bool coming_up)
                        goto err_del_interface;
                }
 
-               sta_info_move_state(sta, IEEE80211_STA_AUTH);
-               sta_info_move_state(sta, IEEE80211_STA_ASSOC);
-               sta_info_move_state(sta, IEEE80211_STA_AUTHORIZED);
+               sta_info_pre_move_state(sta, IEEE80211_STA_AUTH);
+               sta_info_pre_move_state(sta, IEEE80211_STA_ASSOC);
+               sta_info_pre_move_state(sta, IEEE80211_STA_AUTHORIZED);
 
                res = sta_info_insert(sta);
                if (res) {
@@ -644,6 +644,8 @@ static void ieee80211_teardown_sdata(struct net_device *dev)
 
        if (ieee80211_vif_is_mesh(&sdata->vif))
                mesh_rmc_free(sdata);
+       else if (sdata->vif.type == NL80211_IFTYPE_STATION)
+               ieee80211_mgd_teardown(sdata);
 
        flushed = sta_info_flush(local, sdata);
        WARN_ON(flushed);
@@ -1181,6 +1183,13 @@ int ieee80211_if_add(struct ieee80211_local *local, const char *name,
                sband = local->hw.wiphy->bands[i];
                sdata->rc_rateidx_mask[i] =
                        sband ? (1 << sband->n_bitrates) - 1 : 0;
+               if (sband)
+                       memcpy(sdata->rc_rateidx_mcs_mask[i],
+                              sband->ht_cap.mcs.rx_mask,
+                              sizeof(sdata->rc_rateidx_mcs_mask[i]));
+               else
+                       memset(sdata->rc_rateidx_mcs_mask[i], 0,
+                              sizeof(sdata->rc_rateidx_mcs_mask[i]));
        }
 
        /* setup type-dependent data */
@@ -1303,7 +1312,9 @@ u32 __ieee80211_recalc_idle(struct ieee80211_local *local)
 
                /* do not count disabled managed interfaces */
                if (sdata->vif.type == NL80211_IFTYPE_STATION &&
-                   !sdata->u.mgd.associated) {
+                   !sdata->u.mgd.associated &&
+                   !sdata->u.mgd.auth_data &&
+                   !sdata->u.mgd.assoc_data) {
                        sdata->vif.bss_conf.idle = true;
                        continue;
                }
@@ -1323,7 +1334,8 @@ u32 __ieee80211_recalc_idle(struct ieee80211_local *local)
                wk->sdata->vif.bss_conf.idle = false;
        }
 
-       if (local->scan_sdata) {
+       if (local->scan_sdata &&
+           !(local->hw.flags & IEEE80211_HW_SCAN_WHILE_IDLE)) {
                scanning = true;
                local->scan_sdata->vif.bss_conf.idle = false;
        }
index 87a8974..5bb600d 100644 (file)
@@ -17,6 +17,7 @@
 #include <linux/slab.h>
 #include <linux/export.h>
 #include <net/mac80211.h>
+#include <asm/unaligned.h>
 #include "ieee80211_i.h"
 #include "driver-ops.h"
 #include "debugfs_key.h"
@@ -54,14 +55,6 @@ static void assert_key_lock(struct ieee80211_local *local)
        lockdep_assert_held(&local->key_mtx);
 }
 
-static struct ieee80211_sta *get_sta_for_key(struct ieee80211_key *key)
-{
-       if (key->sta)
-               return &key->sta->sta;
-
-       return NULL;
-}
-
 static void increment_tailroom_need_count(struct ieee80211_sub_if_data *sdata)
 {
        /*
@@ -95,7 +88,7 @@ static void increment_tailroom_need_count(struct ieee80211_sub_if_data *sdata)
 static int ieee80211_key_enable_hw_accel(struct ieee80211_key *key)
 {
        struct ieee80211_sub_if_data *sdata;
-       struct ieee80211_sta *sta;
+       struct sta_info *sta;
        int ret;
 
        might_sleep();
@@ -105,7 +98,7 @@ static int ieee80211_key_enable_hw_accel(struct ieee80211_key *key)
 
        assert_key_lock(key->local);
 
-       sta = get_sta_for_key(key);
+       sta = key->sta;
 
        /*
         * If this is a per-STA GTK, check if it
@@ -115,6 +108,9 @@ static int ieee80211_key_enable_hw_accel(struct ieee80211_key *key)
            !(key->local->hw.flags & IEEE80211_HW_SUPPORTS_PER_STA_GTK))
                goto out_unsupported;
 
+       if (sta && !sta->uploaded)
+               goto out_unsupported;
+
        sdata = key->sdata;
        if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) {
                /*
@@ -123,12 +119,10 @@ static int ieee80211_key_enable_hw_accel(struct ieee80211_key *key)
                 */
                if (!(key->conf.flags & IEEE80211_KEY_FLAG_PAIRWISE))
                        goto out_unsupported;
-               sdata = container_of(sdata->bss,
-                                    struct ieee80211_sub_if_data,
-                                    u.ap);
        }
 
-       ret = drv_set_key(key->local, SET_KEY, sdata, sta, &key->conf);
+       ret = drv_set_key(key->local, SET_KEY, sdata,
+                         sta ? &sta->sta : NULL, &key->conf);
 
        if (!ret) {
                key->flags |= KEY_FLAG_UPLOADED_TO_HARDWARE;
@@ -147,7 +141,8 @@ static int ieee80211_key_enable_hw_accel(struct ieee80211_key *key)
        if (ret != -ENOSPC && ret != -EOPNOTSUPP)
                wiphy_err(key->local->hw.wiphy,
                          "failed to set key (%d, %pM) to hardware (%d)\n",
-                         key->conf.keyidx, sta ? sta->addr : bcast_addr, ret);
+                         key->conf.keyidx,
+                         sta ? sta->sta.addr : bcast_addr, ret);
 
  out_unsupported:
        switch (key->conf.cipher) {
@@ -166,7 +161,7 @@ static int ieee80211_key_enable_hw_accel(struct ieee80211_key *key)
 static void ieee80211_key_disable_hw_accel(struct ieee80211_key *key)
 {
        struct ieee80211_sub_if_data *sdata;
-       struct ieee80211_sta *sta;
+       struct sta_info *sta;
        int ret;
 
        might_sleep();
@@ -179,7 +174,7 @@ static void ieee80211_key_disable_hw_accel(struct ieee80211_key *key)
        if (!(key->flags & KEY_FLAG_UPLOADED_TO_HARDWARE))
                return;
 
-       sta = get_sta_for_key(key);
+       sta = key->sta;
        sdata = key->sdata;
 
        if (!((key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_MMIC) ||
@@ -187,18 +182,14 @@ static void ieee80211_key_disable_hw_accel(struct ieee80211_key *key)
              (key->conf.flags & IEEE80211_KEY_FLAG_PUT_IV_SPACE)))
                increment_tailroom_need_count(sdata);
 
-       if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN)
-               sdata = container_of(sdata->bss,
-                                    struct ieee80211_sub_if_data,
-                                    u.ap);
-
        ret = drv_set_key(key->local, DISABLE_KEY, sdata,
-                         sta, &key->conf);
+                         sta ? &sta->sta : NULL, &key->conf);
 
        if (ret)
                wiphy_err(key->local->hw.wiphy,
                          "failed to remove key (%d, %pM) from hardware (%d)\n",
-                         key->conf.keyidx, sta ? sta->addr : bcast_addr, ret);
+                         key->conf.keyidx,
+                         sta ? sta->sta.addr : bcast_addr, ret);
 
        key->flags &= ~KEY_FLAG_UPLOADED_TO_HARDWARE;
 }
index b142bd4..36fa805 100644 (file)
@@ -155,7 +155,8 @@ int ieee80211_hw_config(struct ieee80211_local *local, u32 changed)
                power = chan->max_power;
        else
                power = local->power_constr_level ?
-                       (chan->max_power - local->power_constr_level) :
+                       min(chan->max_power,
+                               (chan->max_reg_power  - local->power_constr_level)) :
                        chan->max_power;
 
        if (local->user_power_level >= 0)
@@ -198,15 +199,7 @@ void ieee80211_bss_info_change_notify(struct ieee80211_sub_if_data *sdata,
                return;
 
        if (sdata->vif.type == NL80211_IFTYPE_STATION) {
-               /*
-                * While not associated, claim a BSSID of all-zeroes
-                * so that drivers don't do any weird things with the
-                * BSSID at that time.
-                */
-               if (sdata->vif.bss_conf.assoc)
-                       sdata->vif.bss_conf.bssid = sdata->u.mgd.bssid;
-               else
-                       sdata->vif.bss_conf.bssid = zero;
+               sdata->vif.bss_conf.bssid = sdata->u.mgd.bssid;
        } else if (sdata->vif.type == NL80211_IFTYPE_ADHOC)
                sdata->vif.bss_conf.bssid = sdata->u.ibss.bssid;
        else if (sdata->vif.type == NL80211_IFTYPE_AP)
@@ -293,11 +286,11 @@ static void ieee80211_tasklet_handler(unsigned long data)
                        /* Clear skb->pkt_type in order to not confuse kernel
                         * netstack. */
                        skb->pkt_type = 0;
-                       ieee80211_rx(local_to_hw(local), skb);
+                       ieee80211_rx(&local->hw, skb);
                        break;
                case IEEE80211_TX_STATUS_MSG:
                        skb->pkt_type = 0;
-                       ieee80211_tx_status(local_to_hw(local), skb);
+                       ieee80211_tx_status(&local->hw, skb);
                        break;
                case IEEE80211_EOSP_MSG:
                        eosp_data = (void *)skb->cb;
@@ -534,6 +527,9 @@ struct ieee80211_hw *ieee80211_alloc_hw(size_t priv_data_len,
        int priv_size, i;
        struct wiphy *wiphy;
 
+       if (WARN_ON(ops->sta_state && (ops->sta_add || ops->sta_remove)))
+               return NULL;
+
        /* Ensure 32-byte alignment of our private data and hw private data.
         * We use the wiphy priv data for both our ieee80211_local and for
         * the driver's private data
@@ -672,7 +668,7 @@ struct ieee80211_hw *ieee80211_alloc_hw(size_t priv_data_len,
 
        ieee80211_hw_roc_setup(local);
 
-       return local_to_hw(local);
+       return &local->hw;
 }
 EXPORT_SYMBOL(ieee80211_alloc_hw);
 
@@ -701,6 +697,9 @@ int ieee80211_register_hw(struct ieee80211_hw *hw)
            )
                return -EINVAL;
 
+       if ((hw->flags & IEEE80211_HW_SCAN_WHILE_IDLE) && !local->ops->hw_scan)
+               return -EINVAL;
+
        if (hw->max_report_rates == 0)
                hw->max_report_rates = hw->max_rates;
 
index bd14bd2..c7e5c49 100644 (file)
@@ -13,7 +13,6 @@
 
 #include <linux/types.h>
 #include <linux/jhash.h>
-#include <asm/unaligned.h>
 #include "ieee80211_i.h"
 
 
index 54df1b2..31bc762 100644 (file)
@@ -8,6 +8,7 @@
  */
 
 #include <linux/slab.h>
+#include <asm/unaligned.h>
 #include "wme.h"
 #include "mesh.h"
 
@@ -575,7 +576,7 @@ static void hwmp_preq_frame_process(struct ieee80211_sub_if_data *sdata,
                        ifmsh->mshstats.dropped_frames_ttl++;
        }
 
-       if (forward) {
+       if (forward && ifmsh->mshcfg.dot11MeshForwarding) {
                u32 preq_id;
                u8 hopcount, flags;
 
index edf167e..dc51669 100644 (file)
@@ -336,7 +336,7 @@ static void mesh_path_move_to_queue(struct mesh_path *gate_mpath,
 }
 
 
-static struct mesh_path *path_lookup(struct mesh_table *tbl, u8 *dst,
+static struct mesh_path *mpath_lookup(struct mesh_table *tbl, u8 *dst,
                                          struct ieee80211_sub_if_data *sdata)
 {
        struct mesh_path *mpath;
@@ -371,12 +371,12 @@ static struct mesh_path *path_lookup(struct mesh_table *tbl, u8 *dst,
  */
 struct mesh_path *mesh_path_lookup(u8 *dst, struct ieee80211_sub_if_data *sdata)
 {
-       return path_lookup(rcu_dereference(mesh_paths), dst, sdata);
+       return mpath_lookup(rcu_dereference(mesh_paths), dst, sdata);
 }
 
 struct mesh_path *mpp_path_lookup(u8 *dst, struct ieee80211_sub_if_data *sdata)
 {
-       return path_lookup(rcu_dereference(mpp_paths), dst, sdata);
+       return mpath_lookup(rcu_dereference(mpp_paths), dst, sdata);
 }
 
 
index a172517..8806e5e 100644 (file)
@@ -96,9 +96,9 @@ static struct sta_info *mesh_plink_alloc(struct ieee80211_sub_if_data *sdata,
        if (!sta)
                return NULL;
 
-       sta_info_move_state(sta, IEEE80211_STA_AUTH);
-       sta_info_move_state(sta, IEEE80211_STA_ASSOC);
-       sta_info_move_state(sta, IEEE80211_STA_AUTHORIZED);
+       sta_info_pre_move_state(sta, IEEE80211_STA_AUTH);
+       sta_info_pre_move_state(sta, IEEE80211_STA_ASSOC);
+       sta_info_pre_move_state(sta, IEEE80211_STA_AUTHORIZED);
 
        set_sta_flag(sta, WLAN_STA_WME);
 
index 295be92..caf97f5 100644 (file)
 #include "rate.h"
 #include "led.h"
 
+#define IEEE80211_AUTH_TIMEOUT (HZ / 5)
+#define IEEE80211_AUTH_MAX_TRIES 3
+#define IEEE80211_AUTH_WAIT_ASSOC (HZ * 5)
+#define IEEE80211_ASSOC_TIMEOUT (HZ / 5)
+#define IEEE80211_ASSOC_MAX_TRIES 3
+
 static int max_nullfunc_tries = 2;
 module_param(max_nullfunc_tries, int, 0644);
 MODULE_PARM_DESC(max_nullfunc_tries,
@@ -82,6 +88,8 @@ MODULE_PARM_DESC(probe_wait_ms,
 #define TMR_RUNNING_TIMER      0
 #define TMR_RUNNING_CHANSW     1
 
+#define DEAUTH_DISASSOC_LEN    (24 /* hdr */ + 2 /* reason */)
+
 /*
  * All cfg80211 functions have to be called outside a locked
  * section so that they can acquire a lock themselves... This
@@ -97,6 +105,15 @@ enum rx_mgmt_action {
 
        /* caller must call cfg80211_send_disassoc() */
        RX_MGMT_CFG80211_DISASSOC,
+
+       /* caller must call cfg80211_send_rx_auth() */
+       RX_MGMT_CFG80211_RX_AUTH,
+
+       /* caller must call cfg80211_send_rx_assoc() */
+       RX_MGMT_CFG80211_RX_ASSOC,
+
+       /* caller must call cfg80211_send_assoc_timeout() */
+       RX_MGMT_CFG80211_ASSOC_TIMEOUT,
 };
 
 /* utils */
@@ -115,8 +132,7 @@ static inline void ASSERT_MGD_MTX(struct ieee80211_if_managed *ifmgd)
  * has happened -- the work that runs from this timer will
  * do that.
  */
-static void run_again(struct ieee80211_if_managed *ifmgd,
-                            unsigned long timeout)
+static void run_again(struct ieee80211_if_managed *ifmgd, unsigned long timeout)
 {
        ASSERT_MGD_MTX(ifmgd);
 
@@ -127,7 +143,7 @@ static void run_again(struct ieee80211_if_managed *ifmgd,
 
 void ieee80211_sta_reset_beacon_monitor(struct ieee80211_sub_if_data *sdata)
 {
-       if (sdata->local->hw.flags & IEEE80211_HW_BEACON_FILTER)
+       if (sdata->vif.driver_flags & IEEE80211_VIF_BEACON_FILTER)
                return;
 
        mod_timer(&sdata->u.mgd.bcn_mon_timer,
@@ -284,48 +300,356 @@ static u32 ieee80211_enable_ht(struct ieee80211_sub_if_data *sdata,
 
 /* frame sending functions */
 
-static void ieee80211_send_deauth_disassoc(struct ieee80211_sub_if_data *sdata,
-                                          const u8 *bssid, u16 stype, u16 reason,
-                                          void *cookie, bool send_frame)
+static int ieee80211_compatible_rates(const u8 *supp_rates, int supp_rates_len,
+                                     struct ieee80211_supported_band *sband,
+                                     u32 *rates)
+{
+       int i, j, count;
+       *rates = 0;
+       count = 0;
+       for (i = 0; i < supp_rates_len; i++) {
+               int rate = (supp_rates[i] & 0x7F) * 5;
+
+               for (j = 0; j < sband->n_bitrates; j++)
+                       if (sband->bitrates[j].bitrate == rate) {
+                               *rates |= BIT(j);
+                               count++;
+                               break;
+                       }
+       }
+
+       return count;
+}
+
+static void ieee80211_add_ht_ie(struct ieee80211_sub_if_data *sdata,
+                               struct sk_buff *skb, const u8 *ht_info_ie,
+                               struct ieee80211_supported_band *sband,
+                               struct ieee80211_channel *channel,
+                               enum ieee80211_smps_mode smps)
+{
+       struct ieee80211_ht_info *ht_info;
+       u8 *pos;
+       u32 flags = channel->flags;
+       u16 cap;
+       struct ieee80211_sta_ht_cap ht_cap;
+
+       BUILD_BUG_ON(sizeof(ht_cap) != sizeof(sband->ht_cap));
+
+       if (!sband->ht_cap.ht_supported)
+               return;
+
+       if (!ht_info_ie)
+               return;
+
+       if (ht_info_ie[1] < sizeof(struct ieee80211_ht_info))
+               return;
+
+       memcpy(&ht_cap, &sband->ht_cap, sizeof(ht_cap));
+       ieee80211_apply_htcap_overrides(sdata, &ht_cap);
+
+       ht_info = (struct ieee80211_ht_info *)(ht_info_ie + 2);
+
+       /* determine capability flags */
+       cap = ht_cap.cap;
+
+       switch (ht_info->ht_param & IEEE80211_HT_PARAM_CHA_SEC_OFFSET) {
+       case IEEE80211_HT_PARAM_CHA_SEC_ABOVE:
+               if (flags & IEEE80211_CHAN_NO_HT40PLUS) {
+                       cap &= ~IEEE80211_HT_CAP_SUP_WIDTH_20_40;
+                       cap &= ~IEEE80211_HT_CAP_SGI_40;
+               }
+               break;
+       case IEEE80211_HT_PARAM_CHA_SEC_BELOW:
+               if (flags & IEEE80211_CHAN_NO_HT40MINUS) {
+                       cap &= ~IEEE80211_HT_CAP_SUP_WIDTH_20_40;
+                       cap &= ~IEEE80211_HT_CAP_SGI_40;
+               }
+               break;
+       }
+
+       /* set SM PS mode properly */
+       cap &= ~IEEE80211_HT_CAP_SM_PS;
+       switch (smps) {
+       case IEEE80211_SMPS_AUTOMATIC:
+       case IEEE80211_SMPS_NUM_MODES:
+               WARN_ON(1);
+       case IEEE80211_SMPS_OFF:
+               cap |= WLAN_HT_CAP_SM_PS_DISABLED <<
+                       IEEE80211_HT_CAP_SM_PS_SHIFT;
+               break;
+       case IEEE80211_SMPS_STATIC:
+               cap |= WLAN_HT_CAP_SM_PS_STATIC <<
+                       IEEE80211_HT_CAP_SM_PS_SHIFT;
+               break;
+       case IEEE80211_SMPS_DYNAMIC:
+               cap |= WLAN_HT_CAP_SM_PS_DYNAMIC <<
+                       IEEE80211_HT_CAP_SM_PS_SHIFT;
+               break;
+       }
+
+       /* reserve and fill IE */
+       pos = skb_put(skb, sizeof(struct ieee80211_ht_cap) + 2);
+       ieee80211_ie_build_ht_cap(pos, &ht_cap, cap);
+}
+
+static void ieee80211_send_assoc(struct ieee80211_sub_if_data *sdata)
 {
        struct ieee80211_local *local = sdata->local;
        struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
+       struct ieee80211_mgd_assoc_data *assoc_data = ifmgd->assoc_data;
        struct sk_buff *skb;
        struct ieee80211_mgmt *mgmt;
+       u8 *pos, qos_info;
+       size_t offset = 0, noffset;
+       int i, count, rates_len, supp_rates_len;
+       u16 capab;
+       struct ieee80211_supported_band *sband;
+       u32 rates = 0;
+       struct ieee80211_bss *bss = (void *)assoc_data->bss->priv;
 
-       skb = dev_alloc_skb(local->hw.extra_tx_headroom + sizeof(*mgmt));
+       lockdep_assert_held(&ifmgd->mtx);
+
+       sband = local->hw.wiphy->bands[local->oper_channel->band];
+
+       if (assoc_data->supp_rates_len) {
+               /*
+                * Get all rates supported by the device and the AP as
+                * some APs don't like getting a superset of their rates
+                * in the association request (e.g. D-Link DAP 1353 in
+                * b-only mode)...
+                */
+               rates_len = ieee80211_compatible_rates(assoc_data->supp_rates,
+                                                      assoc_data->supp_rates_len,
+                                                      sband, &rates);
+       } else {
+               /*
+                * In case AP not provide any supported rates information
+                * before association, we send information element(s) with
+                * all rates that we support.
+                */
+               rates = ~0;
+               rates_len = sband->n_bitrates;
+       }
+
+       skb = alloc_skb(local->hw.extra_tx_headroom +
+                       sizeof(*mgmt) + /* bit too much but doesn't matter */
+                       2 + assoc_data->ssid_len + /* SSID */
+                       4 + rates_len + /* (extended) rates */
+                       4 + /* power capability */
+                       2 + 2 * sband->n_channels + /* supported channels */
+                       2 + sizeof(struct ieee80211_ht_cap) + /* HT */
+                       assoc_data->ie_len + /* extra IEs */
+                       9, /* WMM */
+                       GFP_KERNEL);
        if (!skb)
                return;
 
        skb_reserve(skb, local->hw.extra_tx_headroom);
 
+       capab = WLAN_CAPABILITY_ESS;
+
+       if (sband->band == IEEE80211_BAND_2GHZ) {
+               if (!(local->hw.flags & IEEE80211_HW_2GHZ_SHORT_SLOT_INCAPABLE))
+                       capab |= WLAN_CAPABILITY_SHORT_SLOT_TIME;
+               if (!(local->hw.flags & IEEE80211_HW_2GHZ_SHORT_PREAMBLE_INCAPABLE))
+                       capab |= WLAN_CAPABILITY_SHORT_PREAMBLE;
+       }
+
+       if (assoc_data->capability & WLAN_CAPABILITY_PRIVACY)
+               capab |= WLAN_CAPABILITY_PRIVACY;
+
+       if ((assoc_data->capability & WLAN_CAPABILITY_SPECTRUM_MGMT) &&
+           (local->hw.flags & IEEE80211_HW_SPECTRUM_MGMT))
+               capab |= WLAN_CAPABILITY_SPECTRUM_MGMT;
+
        mgmt = (struct ieee80211_mgmt *) skb_put(skb, 24);
        memset(mgmt, 0, 24);
+       memcpy(mgmt->da, assoc_data->bss->bssid, ETH_ALEN);
+       memcpy(mgmt->sa, sdata->vif.addr, ETH_ALEN);
+       memcpy(mgmt->bssid, assoc_data->bss->bssid, ETH_ALEN);
+
+       if (!is_zero_ether_addr(assoc_data->prev_bssid)) {
+               skb_put(skb, 10);
+               mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT |
+                                                 IEEE80211_STYPE_REASSOC_REQ);
+               mgmt->u.reassoc_req.capab_info = cpu_to_le16(capab);
+               mgmt->u.reassoc_req.listen_interval =
+                               cpu_to_le16(local->hw.conf.listen_interval);
+               memcpy(mgmt->u.reassoc_req.current_ap, assoc_data->prev_bssid,
+                      ETH_ALEN);
+       } else {
+               skb_put(skb, 4);
+               mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT |
+                                                 IEEE80211_STYPE_ASSOC_REQ);
+               mgmt->u.assoc_req.capab_info = cpu_to_le16(capab);
+               mgmt->u.assoc_req.listen_interval =
+                               cpu_to_le16(local->hw.conf.listen_interval);
+       }
+
+       /* SSID */
+       pos = skb_put(skb, 2 + assoc_data->ssid_len);
+       *pos++ = WLAN_EID_SSID;
+       *pos++ = assoc_data->ssid_len;
+       memcpy(pos, assoc_data->ssid, assoc_data->ssid_len);
+
+       /* add all rates which were marked to be used above */
+       supp_rates_len = rates_len;
+       if (supp_rates_len > 8)
+               supp_rates_len = 8;
+
+       pos = skb_put(skb, supp_rates_len + 2);
+       *pos++ = WLAN_EID_SUPP_RATES;
+       *pos++ = supp_rates_len;
+
+       count = 0;
+       for (i = 0; i < sband->n_bitrates; i++) {
+               if (BIT(i) & rates) {
+                       int rate = sband->bitrates[i].bitrate;
+                       *pos++ = (u8) (rate / 5);
+                       if (++count == 8)
+                               break;
+               }
+       }
+
+       if (rates_len > count) {
+               pos = skb_put(skb, rates_len - count + 2);
+               *pos++ = WLAN_EID_EXT_SUPP_RATES;
+               *pos++ = rates_len - count;
+
+               for (i++; i < sband->n_bitrates; i++) {
+                       if (BIT(i) & rates) {
+                               int rate = sband->bitrates[i].bitrate;
+                               *pos++ = (u8) (rate / 5);
+                       }
+               }
+       }
+
+       if (capab & WLAN_CAPABILITY_SPECTRUM_MGMT) {
+               /* 1. power capabilities */
+               pos = skb_put(skb, 4);
+               *pos++ = WLAN_EID_PWR_CAPABILITY;
+               *pos++ = 2;
+               *pos++ = 0; /* min tx power */
+               *pos++ = local->oper_channel->max_power; /* max tx power */
+
+               /* 2. supported channels */
+               /* TODO: get this in reg domain format */
+               pos = skb_put(skb, 2 * sband->n_channels + 2);
+               *pos++ = WLAN_EID_SUPPORTED_CHANNELS;
+               *pos++ = 2 * sband->n_channels;
+               for (i = 0; i < sband->n_channels; i++) {
+                       *pos++ = ieee80211_frequency_to_channel(
+                                       sband->channels[i].center_freq);
+                       *pos++ = 1; /* one channel in the subband*/
+               }
+       }
+
+       /* if present, add any custom IEs that go before HT */
+       if (assoc_data->ie_len && assoc_data->ie) {
+               static const u8 before_ht[] = {
+                       WLAN_EID_SSID,
+                       WLAN_EID_SUPP_RATES,
+                       WLAN_EID_EXT_SUPP_RATES,
+                       WLAN_EID_PWR_CAPABILITY,
+                       WLAN_EID_SUPPORTED_CHANNELS,
+                       WLAN_EID_RSN,
+                       WLAN_EID_QOS_CAPA,
+                       WLAN_EID_RRM_ENABLED_CAPABILITIES,
+                       WLAN_EID_MOBILITY_DOMAIN,
+                       WLAN_EID_SUPPORTED_REGULATORY_CLASSES,
+               };
+               noffset = ieee80211_ie_split(assoc_data->ie, assoc_data->ie_len,
+                                            before_ht, ARRAY_SIZE(before_ht),
+                                            offset);
+               pos = skb_put(skb, noffset - offset);
+               memcpy(pos, assoc_data->ie + offset, noffset - offset);
+               offset = noffset;
+       }
+
+       if (!(ifmgd->flags & IEEE80211_STA_DISABLE_11N) &&
+           bss->wmm_used && local->hw.queues >= 4)
+               ieee80211_add_ht_ie(sdata, skb, assoc_data->ht_information_ie,
+                                   sband, local->oper_channel, ifmgd->ap_smps);
+
+       /* if present, add any custom non-vendor IEs that go after HT */
+       if (assoc_data->ie_len && assoc_data->ie) {
+               noffset = ieee80211_ie_split_vendor(assoc_data->ie,
+                                                   assoc_data->ie_len,
+                                                   offset);
+               pos = skb_put(skb, noffset - offset);
+               memcpy(pos, assoc_data->ie + offset, noffset - offset);
+               offset = noffset;
+       }
+
+       if (assoc_data->wmm_used && local->hw.queues >= 4) {
+               if (assoc_data->uapsd_used) {
+                       qos_info = local->uapsd_queues;
+                       qos_info |= (local->uapsd_max_sp_len <<
+                                    IEEE80211_WMM_IE_STA_QOSINFO_SP_SHIFT);
+               } else {
+                       qos_info = 0;
+               }
+
+               pos = skb_put(skb, 9);
+               *pos++ = WLAN_EID_VENDOR_SPECIFIC;
+               *pos++ = 7; /* len */
+               *pos++ = 0x00; /* Microsoft OUI 00:50:F2 */
+               *pos++ = 0x50;
+               *pos++ = 0xf2;
+               *pos++ = 2; /* WME */
+               *pos++ = 0; /* WME info */
+               *pos++ = 1; /* WME ver */
+               *pos++ = qos_info;
+       }
+
+       /* add any remaining custom (i.e. vendor specific here) IEs */
+       if (assoc_data->ie_len && assoc_data->ie) {
+               noffset = assoc_data->ie_len;
+               pos = skb_put(skb, noffset - offset);
+               memcpy(pos, assoc_data->ie + offset, noffset - offset);
+       }
+
+       IEEE80211_SKB_CB(skb)->flags |= IEEE80211_TX_INTFL_DONT_ENCRYPT;
+       ieee80211_tx_skb(sdata, skb);
+}
+
+static void ieee80211_send_deauth_disassoc(struct ieee80211_sub_if_data *sdata,
+                                          const u8 *bssid, u16 stype,
+                                          u16 reason, bool send_frame,
+                                          u8 *frame_buf)
+{
+       struct ieee80211_local *local = sdata->local;
+       struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
+       struct sk_buff *skb;
+       struct ieee80211_mgmt *mgmt = (void *)frame_buf;
+
+       /* build frame */
+       mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT | stype);
+       mgmt->duration = 0; /* initialize only */
+       mgmt->seq_ctrl = 0; /* initialize only */
        memcpy(mgmt->da, bssid, ETH_ALEN);
        memcpy(mgmt->sa, sdata->vif.addr, ETH_ALEN);
        memcpy(mgmt->bssid, bssid, ETH_ALEN);
-       mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT | stype);
-       skb_put(skb, 2);
        /* u.deauth.reason_code == u.disassoc.reason_code */
        mgmt->u.deauth.reason_code = cpu_to_le16(reason);
 
-       if (stype == IEEE80211_STYPE_DEAUTH)
-               if (cookie)
-                       __cfg80211_send_deauth(sdata->dev, (u8 *)mgmt, skb->len);
-               else
-                       cfg80211_send_deauth(sdata->dev, (u8 *)mgmt, skb->len);
-       else
-               if (cookie)
-                       __cfg80211_send_disassoc(sdata->dev, (u8 *)mgmt, skb->len);
-               else
-                       cfg80211_send_disassoc(sdata->dev, (u8 *)mgmt, skb->len);
-       if (!(ifmgd->flags & IEEE80211_STA_MFP_ENABLED))
-               IEEE80211_SKB_CB(skb)->flags |= IEEE80211_TX_INTFL_DONT_ENCRYPT;
+       if (send_frame) {
+               skb = dev_alloc_skb(local->hw.extra_tx_headroom +
+                                   DEAUTH_DISASSOC_LEN);
+               if (!skb)
+                       return;
+
+               skb_reserve(skb, local->hw.extra_tx_headroom);
 
-       if (send_frame)
+               /* copy in frame */
+               memcpy(skb_put(skb, DEAUTH_DISASSOC_LEN),
+                      mgmt, DEAUTH_DISASSOC_LEN);
+
+               if (!(ifmgd->flags & IEEE80211_STA_MFP_ENABLED))
+                       IEEE80211_SKB_CB(skb)->flags |=
+                               IEEE80211_TX_INTFL_DONT_ENCRYPT;
                ieee80211_tx_skb(sdata, skb);
-       else
-               kfree_skb(skb);
+       }
 }
 
 void ieee80211_send_pspoll(struct ieee80211_local *local,
@@ -547,7 +871,7 @@ static void ieee80211_handle_pwr_constr(struct ieee80211_sub_if_data *sdata,
        if (pwr_constr_elem_len != 1)
                return;
 
-       if ((*pwr_constr_elem <= conf->channel->max_power) &&
+       if ((*pwr_constr_elem <= conf->channel->max_reg_power) &&
            (*pwr_constr_elem != sdata->local->power_constr_level)) {
                sdata->local->power_constr_level = *pwr_constr_elem;
                ieee80211_hw_config(sdata->local, 0);
@@ -1043,7 +1367,7 @@ static void ieee80211_set_associated(struct ieee80211_sub_if_data *sdata,
        bss_info_changed |= BSS_CHANGED_BSSID;
 
        /* Tell the driver to monitor connection quality (if supported) */
-       if ((local->hw.flags & IEEE80211_HW_SUPPORTS_CQM_RSSI) &&
+       if (sdata->vif.driver_flags & IEEE80211_VIF_SUPPORTS_CQM_RSSI &&
            bss_conf->cqm_rssi_thold)
                bss_info_changed |= BSS_CHANGED_CQM;
 
@@ -1065,7 +1389,8 @@ static void ieee80211_set_associated(struct ieee80211_sub_if_data *sdata,
 }
 
 static void ieee80211_set_disassoc(struct ieee80211_sub_if_data *sdata,
-                                  bool remove_sta, bool tx)
+                                  u16 stype, u16 reason, bool tx,
+                                  u8 *frame_buf)
 {
        struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
        struct ieee80211_local *local = sdata->local;
@@ -1075,6 +1400,9 @@ static void ieee80211_set_disassoc(struct ieee80211_sub_if_data *sdata,
 
        ASSERT_MGD_MTX(ifmgd);
 
+       if (WARN_ON_ONCE(tx && !frame_buf))
+               return;
+
        if (WARN_ON(!ifmgd->associated))
                return;
 
@@ -1108,6 +1436,19 @@ static void ieee80211_set_disassoc(struct ieee80211_sub_if_data *sdata,
        }
        mutex_unlock(&local->sta_mtx);
 
+       /* deauthenticate/disassociate now */
+       if (tx || frame_buf)
+               ieee80211_send_deauth_disassoc(sdata, bssid, stype, reason,
+                                              tx, frame_buf);
+
+       /* flush out frame */
+       if (tx)
+               drv_flush(local, false);
+
+       /* remove AP and TDLS peers */
+       sta_info_flush(local, sdata);
+
+       /* finally reset all BSS / config parameters */
        changed |= ieee80211_reset_erp_info(sdata);
 
        ieee80211_led_assoc(local, 0);
@@ -1147,10 +1488,6 @@ static void ieee80211_set_disassoc(struct ieee80211_sub_if_data *sdata,
        changed |= BSS_CHANGED_BSSID | BSS_CHANGED_HT;
        ieee80211_bss_info_change_notify(sdata, changed);
 
-       /* remove AP and TDLS peers */
-       if (remove_sta)
-               sta_info_flush(local, sdata);
-
        del_timer_sync(&sdata->u.mgd.conn_mon_timer);
        del_timer_sync(&sdata->u.mgd.bcn_mon_timer);
        del_timer_sync(&sdata->u.mgd.timer);
@@ -1347,6 +1684,7 @@ static void __ieee80211_connection_loss(struct ieee80211_sub_if_data *sdata)
        struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
        struct ieee80211_local *local = sdata->local;
        u8 bssid[ETH_ALEN];
+       u8 frame_buf[DEAUTH_DISASSOC_LEN];
 
        mutex_lock(&ifmgd->mtx);
        if (!ifmgd->associated) {
@@ -1359,17 +1697,16 @@ static void __ieee80211_connection_loss(struct ieee80211_sub_if_data *sdata)
        printk(KERN_DEBUG "%s: Connection to AP %pM lost.\n",
               sdata->name, bssid);
 
-       ieee80211_set_disassoc(sdata, true, true);
+       ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DEAUTH,
+                              WLAN_REASON_DISASSOC_DUE_TO_INACTIVITY,
+                              false, frame_buf);
        mutex_unlock(&ifmgd->mtx);
 
        /*
         * must be outside lock due to cfg80211,
         * but that's not a problem.
         */
-       ieee80211_send_deauth_disassoc(sdata, bssid,
-                                      IEEE80211_STYPE_DEAUTH,
-                                      WLAN_REASON_DISASSOC_DUE_TO_INACTIVITY,
-                                      NULL, true);
+       cfg80211_send_deauth(sdata->dev, frame_buf, DEAUTH_DISASSOC_LEN);
 
        mutex_lock(&local->mtx);
        ieee80211_recalc_idle(local);
@@ -1423,6 +1760,135 @@ void ieee80211_connection_loss(struct ieee80211_vif *vif)
 EXPORT_SYMBOL(ieee80211_connection_loss);
 
 
+static void ieee80211_destroy_auth_data(struct ieee80211_sub_if_data *sdata,
+                                       bool assoc)
+{
+       struct ieee80211_mgd_auth_data *auth_data = sdata->u.mgd.auth_data;
+
+       lockdep_assert_held(&sdata->u.mgd.mtx);
+
+       if (auth_data->synced)
+               drv_finish_tx_sync(sdata->local, sdata,
+                                  auth_data->bss->bssid,
+                                  IEEE80211_TX_SYNC_AUTH);
+
+       if (!assoc) {
+               sta_info_destroy_addr(sdata, auth_data->bss->bssid);
+
+               memset(sdata->u.mgd.bssid, 0, ETH_ALEN);
+               ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BSSID);
+       }
+
+       cfg80211_put_bss(auth_data->bss);
+       kfree(auth_data);
+       sdata->u.mgd.auth_data = NULL;
+}
+
+static void ieee80211_auth_challenge(struct ieee80211_sub_if_data *sdata,
+                                    struct ieee80211_mgmt *mgmt, size_t len)
+{
+       struct ieee80211_mgd_auth_data *auth_data = sdata->u.mgd.auth_data;
+       u8 *pos;
+       struct ieee802_11_elems elems;
+
+       pos = mgmt->u.auth.variable;
+       ieee802_11_parse_elems(pos, len - (pos - (u8 *) mgmt), &elems);
+       if (!elems.challenge)
+               return;
+       auth_data->expected_transaction = 4;
+       ieee80211_send_auth(sdata, 3, auth_data->algorithm,
+                           elems.challenge - 2, elems.challenge_len + 2,
+                           auth_data->bss->bssid, auth_data->bss->bssid,
+                           auth_data->key, auth_data->key_len,
+                           auth_data->key_idx);
+}
+
+static enum rx_mgmt_action __must_check
+ieee80211_rx_mgmt_auth(struct ieee80211_sub_if_data *sdata,
+                      struct ieee80211_mgmt *mgmt, size_t len)
+{
+       struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
+       u8 bssid[ETH_ALEN];
+       u16 auth_alg, auth_transaction, status_code;
+       struct sta_info *sta;
+
+       lockdep_assert_held(&ifmgd->mtx);
+
+       if (len < 24 + 6)
+               return RX_MGMT_NONE;
+
+       if (!ifmgd->auth_data || ifmgd->auth_data->done)
+               return RX_MGMT_NONE;
+
+       memcpy(bssid, ifmgd->auth_data->bss->bssid, ETH_ALEN);
+
+       if (memcmp(bssid, mgmt->bssid, ETH_ALEN))
+               return RX_MGMT_NONE;
+
+       auth_alg = le16_to_cpu(mgmt->u.auth.auth_alg);
+       auth_transaction = le16_to_cpu(mgmt->u.auth.auth_transaction);
+       status_code = le16_to_cpu(mgmt->u.auth.status_code);
+
+       if (auth_alg != ifmgd->auth_data->algorithm ||
+           auth_transaction != ifmgd->auth_data->expected_transaction)
+               return RX_MGMT_NONE;
+
+       if (status_code != WLAN_STATUS_SUCCESS) {
+               printk(KERN_DEBUG "%s: %pM denied authentication (status %d)\n",
+                      sdata->name, mgmt->sa, status_code);
+               goto out;
+       }
+
+       switch (ifmgd->auth_data->algorithm) {
+       case WLAN_AUTH_OPEN:
+       case WLAN_AUTH_LEAP:
+       case WLAN_AUTH_FT:
+               break;
+       case WLAN_AUTH_SHARED_KEY:
+               if (ifmgd->auth_data->expected_transaction != 4) {
+                       ieee80211_auth_challenge(sdata, mgmt, len);
+                       /* need another frame */
+                       return RX_MGMT_NONE;
+               }
+               break;
+       default:
+               WARN_ONCE(1, "invalid auth alg %d",
+                         ifmgd->auth_data->algorithm);
+               return RX_MGMT_NONE;
+       }
+
+       printk(KERN_DEBUG "%s: authenticated\n", sdata->name);
+ out:
+       if (ifmgd->auth_data->synced)
+               drv_finish_tx_sync(sdata->local, sdata, bssid,
+                                  IEEE80211_TX_SYNC_AUTH);
+       ifmgd->auth_data->synced = false;
+       ifmgd->auth_data->done = true;
+       ifmgd->auth_data->timeout = jiffies + IEEE80211_AUTH_WAIT_ASSOC;
+       run_again(ifmgd, ifmgd->auth_data->timeout);
+
+       /* move station state to auth */
+       mutex_lock(&sdata->local->sta_mtx);
+       sta = sta_info_get(sdata, bssid);
+       if (!sta) {
+               WARN_ONCE(1, "%s: STA %pM not found", sdata->name, bssid);
+               goto out_err;
+       }
+       if (sta_info_move_state(sta, IEEE80211_STA_AUTH)) {
+               printk(KERN_DEBUG "%s: failed moving %pM to auth\n",
+                      sdata->name, bssid);
+               goto out_err;
+       }
+       mutex_unlock(&sdata->local->sta_mtx);
+
+       return RX_MGMT_CFG80211_RX_AUTH;
+ out_err:
+       mutex_unlock(&sdata->local->sta_mtx);
+       /* ignore frame -- wait for timeout */
+       return RX_MGMT_NONE;
+}
+
+
 static enum rx_mgmt_action __must_check
 ieee80211_rx_mgmt_deauth(struct ieee80211_sub_if_data *sdata,
                         struct ieee80211_mgmt *mgmt, size_t len)
@@ -1431,10 +1897,14 @@ ieee80211_rx_mgmt_deauth(struct ieee80211_sub_if_data *sdata,
        const u8 *bssid = NULL;
        u16 reason_code;
 
+       lockdep_assert_held(&ifmgd->mtx);
+
        if (len < 24 + 2)
                return RX_MGMT_NONE;
 
-       ASSERT_MGD_MTX(ifmgd);
+       if (!ifmgd->associated ||
+           memcmp(mgmt->bssid, ifmgd->associated->bssid, ETH_ALEN))
+               return RX_MGMT_NONE;
 
        bssid = ifmgd->associated->bssid;
 
@@ -1443,7 +1913,8 @@ ieee80211_rx_mgmt_deauth(struct ieee80211_sub_if_data *sdata,
        printk(KERN_DEBUG "%s: deauthenticated from %pM (Reason: %u)\n",
                        sdata->name, bssid, reason_code);
 
-       ieee80211_set_disassoc(sdata, true, false);
+       ieee80211_set_disassoc(sdata, 0, 0, false, NULL);
+
        mutex_lock(&sdata->local->mtx);
        ieee80211_recalc_idle(sdata->local);
        mutex_unlock(&sdata->local->mtx);
@@ -1459,15 +1930,13 @@ ieee80211_rx_mgmt_disassoc(struct ieee80211_sub_if_data *sdata,
        struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
        u16 reason_code;
 
-       if (len < 24 + 2)
-               return RX_MGMT_NONE;
-
-       ASSERT_MGD_MTX(ifmgd);
+       lockdep_assert_held(&ifmgd->mtx);
 
-       if (WARN_ON(!ifmgd->associated))
+       if (len < 24 + 2)
                return RX_MGMT_NONE;
 
-       if (WARN_ON(memcmp(ifmgd->associated->bssid, mgmt->sa, ETH_ALEN)))
+       if (!ifmgd->associated ||
+           memcmp(mgmt->bssid, ifmgd->associated->bssid, ETH_ALEN))
                return RX_MGMT_NONE;
 
        reason_code = le16_to_cpu(mgmt->u.disassoc.reason_code);
@@ -1475,10 +1944,12 @@ ieee80211_rx_mgmt_disassoc(struct ieee80211_sub_if_data *sdata,
        printk(KERN_DEBUG "%s: disassociated from %pM (Reason: %u)\n",
                        sdata->name, mgmt->sa, reason_code);
 
-       ieee80211_set_disassoc(sdata, true, false);
+       ieee80211_set_disassoc(sdata, 0, 0, false, NULL);
+
        mutex_lock(&sdata->local->mtx);
        ieee80211_recalc_idle(sdata->local);
        mutex_unlock(&sdata->local->mtx);
+
        return RX_MGMT_CFG80211_DISASSOC;
 }
 
@@ -1524,15 +1995,37 @@ static void ieee80211_get_rates(struct ieee80211_supported_band *sband,
        }
 }
 
-static bool ieee80211_assoc_success(struct ieee80211_work *wk,
+static void ieee80211_destroy_assoc_data(struct ieee80211_sub_if_data *sdata,
+                                        bool assoc)
+{
+       struct ieee80211_mgd_assoc_data *assoc_data = sdata->u.mgd.assoc_data;
+
+       lockdep_assert_held(&sdata->u.mgd.mtx);
+
+       if (assoc_data->synced)
+               drv_finish_tx_sync(sdata->local, sdata,
+                                  assoc_data->bss->bssid,
+                                  IEEE80211_TX_SYNC_ASSOC);
+
+       if (!assoc) {
+               sta_info_destroy_addr(sdata, assoc_data->bss->bssid);
+
+               memset(sdata->u.mgd.bssid, 0, ETH_ALEN);
+               ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BSSID);
+       }
+
+       kfree(assoc_data);
+       sdata->u.mgd.assoc_data = NULL;
+}
+
+static bool ieee80211_assoc_success(struct ieee80211_sub_if_data *sdata,
+                                   struct cfg80211_bss *cbss,
                                    struct ieee80211_mgmt *mgmt, size_t len)
 {
-       struct ieee80211_sub_if_data *sdata = wk->sdata;
        struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
        struct ieee80211_local *local = sdata->local;
        struct ieee80211_supported_band *sband;
        struct sta_info *sta;
-       struct cfg80211_bss *cbss = wk->assoc.bss;
        u8 *pos;
        u32 rates, basic_rates;
        u16 capab_info, aid;
@@ -1581,20 +2074,15 @@ static bool ieee80211_assoc_success(struct ieee80211_work *wk,
         * station info was already allocated and inserted before
         * the association and should be available to us
         */
-       sta = sta_info_get_rx(sdata, cbss->bssid);
+       sta = sta_info_get(sdata, cbss->bssid);
        if (WARN_ON(!sta)) {
                mutex_unlock(&sdata->local->sta_mtx);
                return false;
        }
 
-       sta_info_move_state(sta, IEEE80211_STA_AUTH);
-       sta_info_move_state(sta, IEEE80211_STA_ASSOC);
-       if (!(ifmgd->flags & IEEE80211_STA_CONTROL_PORT))
-               sta_info_move_state(sta, IEEE80211_STA_AUTHORIZED);
-
        rates = 0;
        basic_rates = 0;
-       sband = local->hw.wiphy->bands[wk->chan->band];
+       sband = local->hw.wiphy->bands[local->oper_channel->band];
 
        ieee80211_get_rates(sband, elems.supp_rates, elems.supp_rates_len,
                            &rates, &basic_rates, &have_higher_than_11mbit,
@@ -1615,11 +2103,11 @@ static bool ieee80211_assoc_success(struct ieee80211_work *wk,
                basic_rates = BIT(min_rate_index);
        }
 
-       sta->sta.supp_rates[wk->chan->band] = rates;
+       sta->sta.supp_rates[local->oper_channel->band] = rates;
        sdata->vif.bss_conf.basic_rates = basic_rates;
 
        /* cf. IEEE 802.11 9.2.12 */
-       if (wk->chan->band == IEEE80211_BAND_2GHZ &&
+       if (local->oper_channel->band == IEEE80211_BAND_2GHZ &&
            have_higher_than_11mbit)
                sdata->flags |= IEEE80211_SDATA_OPERATING_GMODE;
        else
@@ -1639,15 +2127,22 @@ static bool ieee80211_assoc_success(struct ieee80211_work *wk,
        if (elems.wmm_param)
                set_sta_flag(sta, WLAN_STA_WME);
 
-       /* sta_info_reinsert will also unlock the mutex lock */
-       err = sta_info_reinsert(sta);
-       sta = NULL;
+       err = sta_info_move_state(sta, IEEE80211_STA_AUTH);
+       if (!err)
+               err = sta_info_move_state(sta, IEEE80211_STA_ASSOC);
+       if (!err && !(ifmgd->flags & IEEE80211_STA_CONTROL_PORT))
+               err = sta_info_move_state(sta, IEEE80211_STA_AUTHORIZED);
        if (err) {
-               printk(KERN_DEBUG "%s: failed to insert STA entry for"
-                      " the AP (error %d)\n", sdata->name, err);
+               printk(KERN_DEBUG
+                      "%s: failed to move station %pM to desired state\n",
+                      sdata->name, sta->sta.addr);
+               WARN_ON(__sta_info_destroy(sta));
+               mutex_unlock(&sdata->local->sta_mtx);
                return false;
        }
 
+       mutex_unlock(&sdata->local->sta_mtx);
+
        /*
         * Always handle WMM once after association regardless
         * of the first value the AP uses. Setting -1 here has
@@ -1662,8 +2157,6 @@ static bool ieee80211_assoc_success(struct ieee80211_work *wk,
        else
                ieee80211_set_wmm_default(sdata);
 
-       local->oper_channel = wk->chan;
-
        if (elems.ht_info_elem && elems.wmm_param &&
            (sdata->local->hw.queues >= 4) &&
            !(ifmgd->flags & IEEE80211_STA_DISABLE_11N))
@@ -1694,7 +2187,96 @@ static bool ieee80211_assoc_success(struct ieee80211_work *wk,
        return true;
 }
 
+static enum rx_mgmt_action __must_check
+ieee80211_rx_mgmt_assoc_resp(struct ieee80211_sub_if_data *sdata,
+                            struct ieee80211_mgmt *mgmt, size_t len,
+                            struct cfg80211_bss **bss)
+{
+       struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
+       struct ieee80211_mgd_assoc_data *assoc_data = ifmgd->assoc_data;
+       u16 capab_info, status_code, aid;
+       struct ieee802_11_elems elems;
+       u8 *pos;
+       bool reassoc;
+
+       lockdep_assert_held(&ifmgd->mtx);
+
+       if (!assoc_data)
+               return RX_MGMT_NONE;
+       if (memcmp(assoc_data->bss->bssid, mgmt->bssid, ETH_ALEN))
+               return RX_MGMT_NONE;
+
+       /*
+        * AssocResp and ReassocResp have identical structure, so process both
+        * of them in this function.
+        */
+
+       if (len < 24 + 6)
+               return RX_MGMT_NONE;
+
+       reassoc = ieee80211_is_reassoc_req(mgmt->frame_control);
+       capab_info = le16_to_cpu(mgmt->u.assoc_resp.capab_info);
+       status_code = le16_to_cpu(mgmt->u.assoc_resp.status_code);
+       aid = le16_to_cpu(mgmt->u.assoc_resp.aid);
+
+       printk(KERN_DEBUG "%s: RX %sssocResp from %pM (capab=0x%x "
+              "status=%d aid=%d)\n",
+              sdata->name, reassoc ? "Rea" : "A", mgmt->sa,
+              capab_info, status_code, (u16)(aid & ~(BIT(15) | BIT(14))));
+
+       pos = mgmt->u.assoc_resp.variable;
+       ieee802_11_parse_elems(pos, len - (pos - (u8 *) mgmt), &elems);
+
+       if (status_code == WLAN_STATUS_ASSOC_REJECTED_TEMPORARILY &&
+           elems.timeout_int && elems.timeout_int_len == 5 &&
+           elems.timeout_int[0] == WLAN_TIMEOUT_ASSOC_COMEBACK) {
+               u32 tu, ms;
+               tu = get_unaligned_le32(elems.timeout_int + 1);
+               ms = tu * 1024 / 1000;
+               printk(KERN_DEBUG "%s: %pM rejected association temporarily; "
+                      "comeback duration %u TU (%u ms)\n",
+                      sdata->name, mgmt->sa, tu, ms);
+               assoc_data->timeout = jiffies + msecs_to_jiffies(ms);
+               if (ms > IEEE80211_ASSOC_TIMEOUT)
+                       run_again(ifmgd, assoc_data->timeout);
+               return RX_MGMT_NONE;
+       }
+
+       *bss = assoc_data->bss;
+
+       if (status_code != WLAN_STATUS_SUCCESS) {
+               printk(KERN_DEBUG "%s: %pM denied association (code=%d)\n",
+                      sdata->name, mgmt->sa, status_code);
+               ieee80211_destroy_assoc_data(sdata, false);
+       } else {
+               printk(KERN_DEBUG "%s: associated\n", sdata->name);
+
+               /* tell driver about sync done first */
+               if (assoc_data->synced) {
+                       drv_finish_tx_sync(sdata->local, sdata,
+                                          assoc_data->bss->bssid,
+                                          IEEE80211_TX_SYNC_ASSOC);
+                       assoc_data->synced = false;
+               }
 
+               if (!ieee80211_assoc_success(sdata, *bss, mgmt, len)) {
+                       /* oops -- internal error -- send timeout for now */
+                       ieee80211_destroy_assoc_data(sdata, true);
+                       sta_info_destroy_addr(sdata, mgmt->bssid);
+                       cfg80211_put_bss(*bss);
+                       return RX_MGMT_CFG80211_ASSOC_TIMEOUT;
+               }
+
+               /*
+                * destroy assoc_data afterwards, as otherwise an idle
+                * recalc after assoc_data is NULL but before associated
+                * is set can cause the interface to go idle
+                */
+               ieee80211_destroy_assoc_data(sdata, true);
+       }
+
+       return RX_MGMT_CFG80211_RX_ASSOC;
+}
 static void ieee80211_rx_bss_info(struct ieee80211_sub_if_data *sdata,
                                  struct ieee80211_mgmt *mgmt,
                                  size_t len,
@@ -1708,7 +2290,9 @@ static void ieee80211_rx_bss_info(struct ieee80211_sub_if_data *sdata,
        struct ieee80211_channel *channel;
        bool need_ps = false;
 
-       if (sdata->u.mgd.associated) {
+       if (sdata->u.mgd.associated &&
+           memcmp(mgmt->bssid, sdata->u.mgd.associated->bssid,
+                  ETH_ALEN) == 0) {
                bss = (void *)sdata->u.mgd.associated->priv;
                /* not previously set so we may need to recalc */
                need_ps = !bss->dtim_period;
@@ -1778,6 +2362,15 @@ static void ieee80211_rx_mgmt_probe_resp(struct ieee80211_sub_if_data *sdata,
        if (ifmgd->associated &&
            memcmp(mgmt->bssid, ifmgd->associated->bssid, ETH_ALEN) == 0)
                ieee80211_reset_ap_probe(sdata);
+
+       if (ifmgd->auth_data && !ifmgd->auth_data->bss->proberesp_ies &&
+           memcmp(mgmt->bssid, ifmgd->auth_data->bss->bssid, ETH_ALEN) == 0) {
+               /* got probe response, continue with auth */
+               printk(KERN_DEBUG "%s: direct probe responded\n", sdata->name);
+               ifmgd->auth_data->tries = 0;
+               ifmgd->auth_data->timeout = jiffies;
+               run_again(ifmgd, ifmgd->auth_data->timeout);
+       }
 }
 
 /*
@@ -1817,7 +2410,7 @@ static void ieee80211_rx_mgmt_beacon(struct ieee80211_sub_if_data *sdata,
        u32 ncrc;
        u8 *bssid;
 
-       ASSERT_MGD_MTX(ifmgd);
+       lockdep_assert_held(&ifmgd->mtx);
 
        /* Process beacon from the current BSS */
        baselen = (u8 *) mgmt->u.beacon.variable - (u8 *) mgmt;
@@ -1827,21 +2420,25 @@ static void ieee80211_rx_mgmt_beacon(struct ieee80211_sub_if_data *sdata,
        if (rx_status->freq != local->hw.conf.channel->center_freq)
                return;
 
-       /*
-        * We might have received a number of frames, among them a
-        * disassoc frame and a beacon...
-        */
-       if (!ifmgd->associated)
-               return;
+       if (ifmgd->assoc_data && !ifmgd->assoc_data->have_beacon &&
+           memcmp(mgmt->bssid, ifmgd->assoc_data->bss->bssid, ETH_ALEN) == 0) {
+               ieee802_11_parse_elems(mgmt->u.beacon.variable,
+                                      len - baselen, &elems);
 
-       bssid = ifmgd->associated->bssid;
+               ieee80211_rx_bss_info(sdata, mgmt, len, rx_status, &elems,
+                                     false);
+               ifmgd->assoc_data->have_beacon = true;
+               ifmgd->assoc_data->sent_assoc = false;
+               /* continue assoc process */
+               ifmgd->assoc_data->timeout = jiffies;
+               run_again(ifmgd, ifmgd->assoc_data->timeout);
+               return;
+       }
 
-       /*
-        * And in theory even frames from a different AP we were just
-        * associated to a split-second ago!
-        */
-       if (memcmp(bssid, mgmt->bssid, ETH_ALEN) != 0)
+       if (!ifmgd->associated ||
+           memcmp(mgmt->bssid, ifmgd->associated->bssid, ETH_ALEN))
                return;
+       bssid = ifmgd->associated->bssid;
 
        /* Track average RSSI from the Beacon frames of the current AP */
        ifmgd->last_beacon_signal = rx_status->signal;
@@ -1882,7 +2479,7 @@ static void ieee80211_rx_mgmt_beacon(struct ieee80211_sub_if_data *sdata,
 
        if (bss_conf->cqm_rssi_thold &&
            ifmgd->count_beacon_signal >= IEEE80211_SIGNAL_AVE_MIN_COUNT &&
-           !(local->hw.flags & IEEE80211_HW_SUPPORTS_CQM_RSSI)) {
+           !(sdata->vif.driver_flags & IEEE80211_VIF_SUPPORTS_CQM_RSSI)) {
                int sig = ifmgd->ave_beacon_signal / 16;
                int last_event = ifmgd->last_cqm_event_signal;
                int thold = bss_conf->cqm_rssi_thold;
@@ -2025,6 +2622,7 @@ void ieee80211_sta_rx_queued_mgmt(struct ieee80211_sub_if_data *sdata,
        struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
        struct ieee80211_rx_status *rx_status;
        struct ieee80211_mgmt *mgmt;
+       struct cfg80211_bss *bss = NULL;
        enum rx_mgmt_action rma = RX_MGMT_NONE;
        u16 fc;
 
@@ -2034,92 +2632,59 @@ void ieee80211_sta_rx_queued_mgmt(struct ieee80211_sub_if_data *sdata,
 
        mutex_lock(&ifmgd->mtx);
 
-       if (ifmgd->associated &&
-           memcmp(ifmgd->associated->bssid, mgmt->bssid, ETH_ALEN) == 0) {
-               switch (fc & IEEE80211_FCTL_STYPE) {
-               case IEEE80211_STYPE_BEACON:
-                       ieee80211_rx_mgmt_beacon(sdata, mgmt, skb->len,
-                                                rx_status);
-                       break;
-               case IEEE80211_STYPE_PROBE_RESP:
-                       ieee80211_rx_mgmt_probe_resp(sdata, skb);
-                       break;
-               case IEEE80211_STYPE_DEAUTH:
-                       rma = ieee80211_rx_mgmt_deauth(sdata, mgmt, skb->len);
-                       break;
-               case IEEE80211_STYPE_DISASSOC:
-                       rma = ieee80211_rx_mgmt_disassoc(sdata, mgmt, skb->len);
-                       break;
-               case IEEE80211_STYPE_ACTION:
-                       switch (mgmt->u.action.category) {
-                       case WLAN_CATEGORY_SPECTRUM_MGMT:
-                               ieee80211_sta_process_chanswitch(sdata,
-                                               &mgmt->u.action.u.chan_switch.sw_elem,
-                                               (void *)ifmgd->associated->priv,
-                                               rx_status->mactime);
-                               break;
-                       }
-               }
-               mutex_unlock(&ifmgd->mtx);
-
-               switch (rma) {
-               case RX_MGMT_NONE:
-                       /* no action */
-                       break;
-               case RX_MGMT_CFG80211_DEAUTH:
-                       cfg80211_send_deauth(sdata->dev, (u8 *)mgmt, skb->len);
-                       break;
-               case RX_MGMT_CFG80211_DISASSOC:
-                       cfg80211_send_disassoc(sdata->dev, (u8 *)mgmt, skb->len);
+       switch (fc & IEEE80211_FCTL_STYPE) {
+       case IEEE80211_STYPE_BEACON:
+               ieee80211_rx_mgmt_beacon(sdata, mgmt, skb->len, rx_status);
+               break;
+       case IEEE80211_STYPE_PROBE_RESP:
+               ieee80211_rx_mgmt_probe_resp(sdata, skb);
+               break;
+       case IEEE80211_STYPE_AUTH:
+               rma = ieee80211_rx_mgmt_auth(sdata, mgmt, skb->len);
+               break;
+       case IEEE80211_STYPE_DEAUTH:
+               rma = ieee80211_rx_mgmt_deauth(sdata, mgmt, skb->len);
+               break;
+       case IEEE80211_STYPE_DISASSOC:
+               rma = ieee80211_rx_mgmt_disassoc(sdata, mgmt, skb->len);
+               break;
+       case IEEE80211_STYPE_ASSOC_RESP:
+       case IEEE80211_STYPE_REASSOC_RESP:
+               rma = ieee80211_rx_mgmt_assoc_resp(sdata, mgmt, skb->len, &bss);
+               break;
+       case IEEE80211_STYPE_ACTION:
+               switch (mgmt->u.action.category) {
+               case WLAN_CATEGORY_SPECTRUM_MGMT:
+                       ieee80211_sta_process_chanswitch(sdata,
+                                       &mgmt->u.action.u.chan_switch.sw_elem,
+                                       (void *)ifmgd->associated->priv,
+                                       rx_status->mactime);
                        break;
-               default:
-                       WARN(1, "unexpected: %d", rma);
                }
-               return;
        }
-
        mutex_unlock(&ifmgd->mtx);
 
-       if (skb->len >= 24 + 2 /* mgmt + deauth reason */ &&
-           (fc & IEEE80211_FCTL_STYPE) == IEEE80211_STYPE_DEAUTH) {
-               struct ieee80211_local *local = sdata->local;
-               struct ieee80211_work *wk;
-
-               mutex_lock(&local->mtx);
-               list_for_each_entry(wk, &local->work_list, list) {
-                       if (wk->sdata != sdata)
-                               continue;
-
-                       if (wk->type != IEEE80211_WORK_ASSOC &&
-                           wk->type != IEEE80211_WORK_ASSOC_BEACON_WAIT)
-                               continue;
-
-                       if (memcmp(mgmt->bssid, wk->filter_ta, ETH_ALEN))
-                               continue;
-                       if (memcmp(mgmt->sa, wk->filter_ta, ETH_ALEN))
-                               continue;
-
-                       /*
-                        * Printing the message only here means we can't
-                        * spuriously print it, but it also means that it
-                        * won't be printed when the frame comes in before
-                        * we even tried to associate or in similar cases.
-                        *
-                        * Ultimately, I suspect cfg80211 should print the
-                        * messages instead.
-                        */
-                       printk(KERN_DEBUG
-                              "%s: deauthenticated from %pM (Reason: %u)\n",
-                              sdata->name, mgmt->bssid,
-                              le16_to_cpu(mgmt->u.deauth.reason_code));
-
-                       list_del_rcu(&wk->list);
-                       free_work(wk);
-                       break;
-               }
-               mutex_unlock(&local->mtx);
-
+       switch (rma) {
+       case RX_MGMT_NONE:
+               /* no action */
+               break;
+       case RX_MGMT_CFG80211_DEAUTH:
                cfg80211_send_deauth(sdata->dev, (u8 *)mgmt, skb->len);
+               break;
+       case RX_MGMT_CFG80211_DISASSOC:
+               cfg80211_send_disassoc(sdata->dev, (u8 *)mgmt, skb->len);
+               break;
+       case RX_MGMT_CFG80211_RX_AUTH:
+               cfg80211_send_rx_auth(sdata->dev, (u8 *)mgmt, skb->len);
+               break;
+       case RX_MGMT_CFG80211_RX_ASSOC:
+               cfg80211_send_rx_assoc(sdata->dev, bss, (u8 *)mgmt, skb->len);
+               break;
+       case RX_MGMT_CFG80211_ASSOC_TIMEOUT:
+               cfg80211_send_assoc_timeout(sdata->dev, mgmt->bssid);
+               break;
+       default:
+               WARN(1, "unexpected: %d", rma);
        }
 }
 
@@ -2143,19 +2708,20 @@ static void ieee80211_sta_connection_lost(struct ieee80211_sub_if_data *sdata,
 {
        struct ieee80211_local *local = sdata->local;
        struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
+       u8 frame_buf[DEAUTH_DISASSOC_LEN];
 
        ifmgd->flags &= ~(IEEE80211_STA_CONNECTION_POLL |
                          IEEE80211_STA_BEACON_POLL);
 
-       ieee80211_set_disassoc(sdata, true, true);
+       ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DEAUTH, reason,
+                              false, frame_buf);
        mutex_unlock(&ifmgd->mtx);
+
        /*
         * must be outside lock due to cfg80211,
         * but that's not a problem.
         */
-       ieee80211_send_deauth_disassoc(sdata, bssid,
-                       IEEE80211_STYPE_DEAUTH, reason,
-                       NULL, true);
+       cfg80211_send_deauth(sdata->dev, frame_buf, DEAUTH_DISASSOC_LEN);
 
        mutex_lock(&local->mtx);
        ieee80211_recalc_idle(local);
@@ -2164,14 +2730,160 @@ static void ieee80211_sta_connection_lost(struct ieee80211_sub_if_data *sdata,
        mutex_lock(&ifmgd->mtx);
 }
 
+static int ieee80211_probe_auth(struct ieee80211_sub_if_data *sdata)
+{
+       struct ieee80211_local *local = sdata->local;
+       struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
+       struct ieee80211_mgd_auth_data *auth_data = ifmgd->auth_data;
+
+       lockdep_assert_held(&ifmgd->mtx);
+
+       if (WARN_ON_ONCE(!auth_data))
+               return -EINVAL;
+
+       if (!auth_data->synced) {
+               int ret = drv_tx_sync(local, sdata, auth_data->bss->bssid,
+                                     IEEE80211_TX_SYNC_AUTH);
+               if (ret)
+                       return ret;
+       }
+       auth_data->synced = true;
+
+       auth_data->tries++;
+
+       if (auth_data->tries > IEEE80211_AUTH_MAX_TRIES) {
+               printk(KERN_DEBUG "%s: authentication with %pM timed out\n",
+                      sdata->name, auth_data->bss->bssid);
+
+               /*
+                * Most likely AP is not in the range so remove the
+                * bss struct for that AP.
+                */
+               cfg80211_unlink_bss(local->hw.wiphy, auth_data->bss);
+
+               return -ETIMEDOUT;
+       }
+
+       if (auth_data->bss->proberesp_ies) {
+               printk(KERN_DEBUG "%s: send auth to %pM (try %d/%d)\n",
+                      sdata->name, auth_data->bss->bssid, auth_data->tries,
+                      IEEE80211_AUTH_MAX_TRIES);
+
+               auth_data->expected_transaction = 2;
+               ieee80211_send_auth(sdata, 1, auth_data->algorithm,
+                                   auth_data->ie, auth_data->ie_len,
+                                   auth_data->bss->bssid,
+                                   auth_data->bss->bssid, NULL, 0, 0);
+       } else {
+               const u8 *ssidie;
+
+               printk(KERN_DEBUG "%s: direct probe to %pM (try %d/%i)\n",
+                      sdata->name, auth_data->bss->bssid, auth_data->tries,
+                      IEEE80211_AUTH_MAX_TRIES);
+
+               ssidie = ieee80211_bss_get_ie(auth_data->bss, WLAN_EID_SSID);
+               if (!ssidie)
+                       return -EINVAL;
+               /*
+                * Direct probe is sent to broadcast address as some APs
+                * will not answer to direct packet in unassociated state.
+                */
+               ieee80211_send_probe_req(sdata, NULL, ssidie + 2, ssidie[1],
+                                        NULL, 0, (u32) -1, true, false);
+       }
+
+       auth_data->timeout = jiffies + IEEE80211_AUTH_TIMEOUT;
+       run_again(ifmgd, auth_data->timeout);
+
+       return 0;
+}
+
+static int ieee80211_do_assoc(struct ieee80211_sub_if_data *sdata)
+{
+       struct ieee80211_mgd_assoc_data *assoc_data = sdata->u.mgd.assoc_data;
+       struct ieee80211_local *local = sdata->local;
+
+       lockdep_assert_held(&sdata->u.mgd.mtx);
+
+       if (!assoc_data->synced) {
+               int ret = drv_tx_sync(local, sdata, assoc_data->bss->bssid,
+                                     IEEE80211_TX_SYNC_ASSOC);
+               if (ret)
+                       return ret;
+       }
+       assoc_data->synced = true;
+
+       assoc_data->tries++;
+       if (assoc_data->tries > IEEE80211_ASSOC_MAX_TRIES) {
+               printk(KERN_DEBUG "%s: association with %pM timed out\n",
+                      sdata->name, assoc_data->bss->bssid);
+
+               /*
+                * Most likely AP is not in the range so remove the
+                * bss struct for that AP.
+                */
+               cfg80211_unlink_bss(local->hw.wiphy, assoc_data->bss);
+
+               return -ETIMEDOUT;
+       }
+
+       printk(KERN_DEBUG "%s: associate with %pM (try %d/%d)\n",
+              sdata->name, assoc_data->bss->bssid, assoc_data->tries,
+              IEEE80211_ASSOC_MAX_TRIES);
+       ieee80211_send_assoc(sdata);
+
+       assoc_data->timeout = jiffies + IEEE80211_ASSOC_TIMEOUT;
+       run_again(&sdata->u.mgd, assoc_data->timeout);
+
+       return 0;
+}
+
 void ieee80211_sta_work(struct ieee80211_sub_if_data *sdata)
 {
        struct ieee80211_local *local = sdata->local;
        struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
 
-       /* then process the rest of the work */
        mutex_lock(&ifmgd->mtx);
 
+       if (ifmgd->auth_data &&
+           time_after(jiffies, ifmgd->auth_data->timeout)) {
+               if (ifmgd->auth_data->done) {
+                       /*
+                        * ok ... we waited for assoc but userspace didn't,
+                        * so let's just kill the auth data
+                        */
+                       ieee80211_destroy_auth_data(sdata, false);
+               } else if (ieee80211_probe_auth(sdata)) {
+                       u8 bssid[ETH_ALEN];
+
+                       memcpy(bssid, ifmgd->auth_data->bss->bssid, ETH_ALEN);
+
+                       ieee80211_destroy_auth_data(sdata, false);
+
+                       mutex_unlock(&ifmgd->mtx);
+                       cfg80211_send_auth_timeout(sdata->dev, bssid);
+                       mutex_lock(&ifmgd->mtx);
+               }
+       } else if (ifmgd->auth_data)
+               run_again(ifmgd, ifmgd->auth_data->timeout);
+
+       if (ifmgd->assoc_data &&
+           time_after(jiffies, ifmgd->assoc_data->timeout)) {
+               if (!ifmgd->assoc_data->have_beacon ||
+                   ieee80211_do_assoc(sdata)) {
+                       u8 bssid[ETH_ALEN];
+
+                       memcpy(bssid, ifmgd->assoc_data->bss->bssid, ETH_ALEN);
+
+                       ieee80211_destroy_assoc_data(sdata, false);
+
+                       mutex_unlock(&ifmgd->mtx);
+                       cfg80211_send_assoc_timeout(sdata->dev, bssid);
+                       mutex_lock(&ifmgd->mtx);
+               }
+       } else if (ifmgd->assoc_data)
+               run_again(ifmgd, ifmgd->assoc_data->timeout);
+
        if (ifmgd->flags & (IEEE80211_STA_BEACON_POLL |
                            IEEE80211_STA_CONNECTION_POLL) &&
            ifmgd->associated) {
@@ -2247,6 +2959,10 @@ void ieee80211_sta_work(struct ieee80211_sub_if_data *sdata)
        }
 
        mutex_unlock(&ifmgd->mtx);
+
+       mutex_lock(&local->mtx);
+       ieee80211_recalc_idle(local);
+       mutex_unlock(&local->mtx);
 }
 
 static void ieee80211_sta_bcn_mon_timer(unsigned long data)
@@ -2286,13 +3002,17 @@ static void ieee80211_sta_monitor_work(struct work_struct *work)
 
 static void ieee80211_restart_sta_timer(struct ieee80211_sub_if_data *sdata)
 {
+       u32 flags;
+
        if (sdata->vif.type == NL80211_IFTYPE_STATION) {
                sdata->u.mgd.flags &= ~(IEEE80211_STA_BEACON_POLL |
                                        IEEE80211_STA_CONNECTION_POLL);
 
                /* let's probe the connection once */
-               ieee80211_queue_work(&sdata->local->hw,
-                          &sdata->u.mgd.monitor_work);
+               flags = sdata->local->hw.flags;
+               if (!(flags & IEEE80211_HW_CONNECTION_MONITOR))
+                       ieee80211_queue_work(&sdata->local->hw,
+                                            &sdata->u.mgd.monitor_work);
                /* and do all the other regular work too */
                ieee80211_queue_work(&sdata->local->hw, &sdata->work);
        }
@@ -2356,7 +3076,6 @@ void ieee80211_sta_restart(struct ieee80211_sub_if_data *sdata)
                add_timer(&ifmgd->chswitch_timer);
        ieee80211_sta_reset_beacon_monitor(sdata);
        ieee80211_restart_sta_timer(sdata);
-       ieee80211_queue_work(&sdata->local->hw, &sdata->u.mgd.monitor_work);
 }
 #endif
 
@@ -2419,53 +3138,24 @@ int ieee80211_max_network_latency(struct notifier_block *nb,
 }
 
 /* config hooks */
-static enum work_done_result
-ieee80211_probe_auth_done(struct ieee80211_work *wk,
-                         struct sk_buff *skb)
-{
-       struct ieee80211_local *local = wk->sdata->local;
-
-       if (!skb) {
-               cfg80211_send_auth_timeout(wk->sdata->dev, wk->filter_ta);
-               goto destroy;
-       }
-
-       if (wk->type == IEEE80211_WORK_AUTH) {
-               cfg80211_send_rx_auth(wk->sdata->dev, skb->data, skb->len);
-               goto destroy;
-       }
-
-       mutex_lock(&wk->sdata->u.mgd.mtx);
-       ieee80211_rx_mgmt_probe_resp(wk->sdata, skb);
-       mutex_unlock(&wk->sdata->u.mgd.mtx);
-
-       wk->type = IEEE80211_WORK_AUTH;
-       wk->probe_auth.tries = 0;
-       return WORK_DONE_REQUEUE;
- destroy:
-       if (wk->probe_auth.synced)
-               drv_finish_tx_sync(local, wk->sdata, wk->filter_ta,
-                                  IEEE80211_TX_SYNC_AUTH);
-
-       return WORK_DONE_DESTROY;
-}
-
 int ieee80211_mgd_auth(struct ieee80211_sub_if_data *sdata,
                       struct cfg80211_auth_request *req)
 {
-       const u8 *ssid;
-       struct ieee80211_work *wk;
+       struct ieee80211_local *local = sdata->local;
+       struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
+       struct ieee80211_mgd_auth_data *auth_data;
+       struct sta_info *sta;
        u16 auth_alg;
+       int err;
 
-       if (req->local_state_change)
-               return 0; /* no need to update mac80211 state */
+       /* prepare auth data structure */
 
        switch (req->auth_type) {
        case NL80211_AUTHTYPE_OPEN_SYSTEM:
                auth_alg = WLAN_AUTH_OPEN;
                break;
        case NL80211_AUTHTYPE_SHARED_KEY:
-               if (IS_ERR(sdata->local->wep_tx_tfm))
+               if (IS_ERR(local->wep_tx_tfm))
                        return -EOPNOTSUPP;
                auth_alg = WLAN_AUTH_SHARED_KEY;
                break;
@@ -2479,171 +3169,142 @@ int ieee80211_mgd_auth(struct ieee80211_sub_if_data *sdata,
                return -EOPNOTSUPP;
        }
 
-       wk = kzalloc(sizeof(*wk) + req->ie_len, GFP_KERNEL);
-       if (!wk)
+       auth_data = kzalloc(sizeof(*auth_data) + req->ie_len, GFP_KERNEL);
+       if (!auth_data)
                return -ENOMEM;
 
-       memcpy(wk->filter_ta, req->bss->bssid, ETH_ALEN);
+       auth_data->bss = req->bss;
 
        if (req->ie && req->ie_len) {
-               memcpy(wk->ie, req->ie, req->ie_len);
-               wk->ie_len = req->ie_len;
+               memcpy(auth_data->ie, req->ie, req->ie_len);
+               auth_data->ie_len = req->ie_len;
        }
 
        if (req->key && req->key_len) {
-               wk->probe_auth.key_len = req->key_len;
-               wk->probe_auth.key_idx = req->key_idx;
-               memcpy(wk->probe_auth.key, req->key, req->key_len);
+               auth_data->key_len = req->key_len;
+               auth_data->key_idx = req->key_idx;
+               memcpy(auth_data->key, req->key, req->key_len);
        }
 
-       ssid = ieee80211_bss_get_ie(req->bss, WLAN_EID_SSID);
-       memcpy(wk->probe_auth.ssid, ssid + 2, ssid[1]);
-       wk->probe_auth.ssid_len = ssid[1];
-
-       wk->probe_auth.algorithm = auth_alg;
-       wk->probe_auth.privacy = req->bss->capability & WLAN_CAPABILITY_PRIVACY;
-
-       /* if we already have a probe, don't probe again */
-       if (req->bss->proberesp_ies)
-               wk->type = IEEE80211_WORK_AUTH;
-       else
-               wk->type = IEEE80211_WORK_DIRECT_PROBE;
-       wk->chan = req->bss->channel;
-       wk->chan_type = NL80211_CHAN_NO_HT;
-       wk->sdata = sdata;
-       wk->done = ieee80211_probe_auth_done;
-
-       ieee80211_add_work(wk);
-       return 0;
-}
-
-/* create and insert a dummy station entry */
-static int ieee80211_pre_assoc(struct ieee80211_sub_if_data *sdata,
-                               u8 *bssid) {
-       struct sta_info *sta;
-       int err;
+       auth_data->algorithm = auth_alg;
 
-       sta = sta_info_alloc(sdata, bssid, GFP_KERNEL);
-       if (!sta)
-               return -ENOMEM;
+       /* try to authenticate/probe */
 
-       sta->dummy = true;
+       mutex_lock(&ifmgd->mtx);
 
-       err = sta_info_insert(sta);
-       sta = NULL;
-       if (err) {
-               printk(KERN_DEBUG "%s: failed to insert Dummy STA entry for"
-                      " the AP (error %d)\n", sdata->name, err);
-               return err;
+       if ((ifmgd->auth_data && !ifmgd->auth_data->done) ||
+           ifmgd->assoc_data) {
+               err = -EBUSY;
+               goto err_free;
        }
 
-       return 0;
-}
+       if (ifmgd->auth_data)
+               ieee80211_destroy_auth_data(sdata, false);
 
-static enum work_done_result ieee80211_assoc_done(struct ieee80211_work *wk,
-                                                 struct sk_buff *skb)
-{
-       struct ieee80211_local *local = wk->sdata->local;
-       struct ieee80211_mgmt *mgmt;
-       struct ieee80211_rx_status *rx_status;
-       struct ieee802_11_elems elems;
-       struct cfg80211_bss *cbss = wk->assoc.bss;
-       u16 status;
+       /* prep auth_data so we don't go into idle on disassoc */
+       ifmgd->auth_data = auth_data;
 
-       if (!skb) {
-               sta_info_destroy_addr(wk->sdata, cbss->bssid);
-               cfg80211_send_assoc_timeout(wk->sdata->dev, wk->filter_ta);
-               goto destroy;
-       }
+       if (ifmgd->associated)
+               ieee80211_set_disassoc(sdata, 0, 0, false, NULL);
 
-       if (wk->type == IEEE80211_WORK_ASSOC_BEACON_WAIT) {
-               mutex_lock(&wk->sdata->u.mgd.mtx);
-               rx_status = (void *) skb->cb;
-               ieee802_11_parse_elems(skb->data + 24 + 12, skb->len - 24 - 12, &elems);
-               ieee80211_rx_bss_info(wk->sdata, (void *)skb->data, skb->len, rx_status,
-                                     &elems, true);
-               mutex_unlock(&wk->sdata->u.mgd.mtx);
+       printk(KERN_DEBUG "%s: authenticate with %pM\n",
+              sdata->name, req->bss->bssid);
 
-               wk->type = IEEE80211_WORK_ASSOC;
-               /* not really done yet */
-               return WORK_DONE_REQUEUE;
-       }
+       mutex_lock(&local->mtx);
+       ieee80211_recalc_idle(sdata->local);
+       mutex_unlock(&local->mtx);
 
-       mgmt = (void *)skb->data;
-       status = le16_to_cpu(mgmt->u.assoc_resp.status_code);
+       /* switch to the right channel */
+       local->oper_channel = req->bss->channel;
+       ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_CHANNEL);
 
-       if (status == WLAN_STATUS_SUCCESS) {
-               if (wk->assoc.synced)
-                       drv_finish_tx_sync(local, wk->sdata, wk->filter_ta,
-                                          IEEE80211_TX_SYNC_ASSOC);
+       /* set BSSID */
+       memcpy(ifmgd->bssid, req->bss->bssid, ETH_ALEN);
+       ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BSSID);
 
-               mutex_lock(&wk->sdata->u.mgd.mtx);
-               if (!ieee80211_assoc_success(wk, mgmt, skb->len)) {
-                       mutex_unlock(&wk->sdata->u.mgd.mtx);
-                       /* oops -- internal error -- send timeout for now */
-                       sta_info_destroy_addr(wk->sdata, cbss->bssid);
-                       cfg80211_send_assoc_timeout(wk->sdata->dev,
-                                                   wk->filter_ta);
-                       return WORK_DONE_DESTROY;
-               }
+       /* add station entry */
+       sta = sta_info_alloc(sdata, req->bss->bssid, GFP_KERNEL);
+       if (!sta) {
+               err = -ENOMEM;
+               goto err_clear;
+       }
 
-               mutex_unlock(&wk->sdata->u.mgd.mtx);
-       } else {
-               /* assoc failed - destroy the dummy station entry */
-               sta_info_destroy_addr(wk->sdata, cbss->bssid);
+       err = sta_info_insert(sta);
+       if (err) {
+               printk(KERN_DEBUG
+                      "%s: failed to insert STA entry for the AP %pM (error %d)\n",
+                      sdata->name, req->bss->bssid, err);
+               goto err_clear;
        }
 
-       cfg80211_send_rx_assoc(wk->sdata->dev, skb->data, skb->len);
- destroy:
-       if (wk->assoc.synced)
-               drv_finish_tx_sync(local, wk->sdata, wk->filter_ta,
-                                  IEEE80211_TX_SYNC_ASSOC);
+       err = ieee80211_probe_auth(sdata);
+       if (err) {
+               if (auth_data->synced)
+                       drv_finish_tx_sync(local, sdata, req->bss->bssid,
+                                          IEEE80211_TX_SYNC_AUTH);
+               sta_info_destroy_addr(sdata, req->bss->bssid);
+               goto err_clear;
+       }
+
+       /* hold our own reference */
+       cfg80211_ref_bss(auth_data->bss);
+       err = 0;
+       goto out_unlock;
+
+ err_clear:
+       ifmgd->auth_data = NULL;
+ err_free:
+       kfree(auth_data);
+ out_unlock:
+       mutex_unlock(&ifmgd->mtx);
 
-       return WORK_DONE_DESTROY;
+       return err;
 }
 
 int ieee80211_mgd_assoc(struct ieee80211_sub_if_data *sdata,
                        struct cfg80211_assoc_request *req)
 {
+       struct ieee80211_local *local = sdata->local;
        struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
        struct ieee80211_bss *bss = (void *)req->bss->priv;
-       struct ieee80211_work *wk;
-       const u8 *ssid;
+       struct ieee80211_mgd_assoc_data *assoc_data;
+       struct sta_info *sta;
+       const u8 *ssidie;
        int i, err;
 
+       ssidie = ieee80211_bss_get_ie(req->bss, WLAN_EID_SSID);
+       if (!ssidie)
+               return -EINVAL;
+
+       assoc_data = kzalloc(sizeof(*assoc_data) + req->ie_len, GFP_KERNEL);
+       if (!assoc_data)
+               return -ENOMEM;
+
        mutex_lock(&ifmgd->mtx);
-       if (ifmgd->associated) {
-               if (!req->prev_bssid ||
-                   memcmp(req->prev_bssid, ifmgd->associated->bssid,
-                          ETH_ALEN)) {
-                       /*
-                        * We are already associated and the request was not a
-                        * reassociation request from the current BSS, so
-                        * reject it.
-                        */
-                       mutex_unlock(&ifmgd->mtx);
-                       return -EALREADY;
-               }
 
-               /* Trying to reassociate - clear previous association state */
-               ieee80211_set_disassoc(sdata, true, false);
+       if (ifmgd->associated)
+               ieee80211_set_disassoc(sdata, 0, 0, false, NULL);
+
+       if (ifmgd->auth_data && !ifmgd->auth_data->done) {
+               err = -EBUSY;
+               goto err_free;
        }
-       mutex_unlock(&ifmgd->mtx);
 
-       wk = kzalloc(sizeof(*wk) + req->ie_len, GFP_KERNEL);
-       if (!wk)
-               return -ENOMEM;
+       if (ifmgd->assoc_data) {
+               err = -EBUSY;
+               goto err_free;
+       }
 
-       /*
-        * create a dummy station info entry in order
-        * to start accepting incoming EAPOL packets from the station
-        */
-       err = ieee80211_pre_assoc(sdata, req->bss->bssid);
-       if (err) {
-               kfree(wk);
-               return err;
+       if (ifmgd->auth_data) {
+               bool match;
+
+               /* keep sta info, bssid if matching */
+               match = memcmp(ifmgd->bssid, req->bss->bssid, ETH_ALEN) == 0;
+               ieee80211_destroy_auth_data(sdata, match);
        }
 
+       /* prepare assoc data */
+
        ifmgd->flags &= ~IEEE80211_STA_DISABLE_11N;
        ifmgd->flags &= ~IEEE80211_STA_NULLFUNC_ACKED;
 
@@ -2655,7 +3316,6 @@ int ieee80211_mgd_assoc(struct ieee80211_sub_if_data *sdata,
                    req->crypto.ciphers_pairwise[i] == WLAN_CIPHER_SUITE_WEP104)
                        ifmgd->flags |= IEEE80211_STA_DISABLE_11N;
 
-
        if (req->flags & ASSOC_REQ_DISABLE_HT)
                ifmgd->flags |= IEEE80211_STA_DISABLE_11N;
 
@@ -2664,16 +3324,12 @@ int ieee80211_mgd_assoc(struct ieee80211_sub_if_data *sdata,
               sizeof(ifmgd->ht_capa_mask));
 
        if (req->ie && req->ie_len) {
-               memcpy(wk->ie, req->ie, req->ie_len);
-               wk->ie_len = req->ie_len;
-       } else
-               wk->ie_len = 0;
-
-       wk->assoc.bss = req->bss;
+               memcpy(assoc_data->ie, req->ie, req->ie_len);
+               assoc_data->ie_len = req->ie_len;
+       }
 
-       memcpy(wk->filter_ta, req->bss->bssid, ETH_ALEN);
+       assoc_data->bss = req->bss;
 
-       /* new association always uses requested smps mode */
        if (ifmgd->req_smps == IEEE80211_SMPS_AUTOMATIC) {
                if (ifmgd->powersave)
                        ifmgd->ap_smps = IEEE80211_SMPS_DYNAMIC;
@@ -2682,7 +3338,6 @@ int ieee80211_mgd_assoc(struct ieee80211_sub_if_data *sdata,
        } else
                ifmgd->ap_smps = ifmgd->req_smps;
 
-       wk->assoc.smps = ifmgd->ap_smps;
        /*
         * IEEE802.11n does not allow TKIP/WEP as pairwise ciphers in HT mode.
         * We still associate in non-HT mode (11a/b/g) if any one of these
@@ -2690,39 +3345,27 @@ int ieee80211_mgd_assoc(struct ieee80211_sub_if_data *sdata,
         * We can set this to true for non-11n hardware, that'll be checked
         * separately along with the peer capabilities.
         */
-       wk->assoc.use_11n = !(ifmgd->flags & IEEE80211_STA_DISABLE_11N);
-       wk->assoc.capability = req->bss->capability;
-       wk->assoc.wmm_used = bss->wmm_used;
-       wk->assoc.supp_rates = bss->supp_rates;
-       wk->assoc.supp_rates_len = bss->supp_rates_len;
-       wk->assoc.ht_information_ie =
+       assoc_data->capability = req->bss->capability;
+       assoc_data->wmm_used = bss->wmm_used;
+       assoc_data->supp_rates = bss->supp_rates;
+       assoc_data->supp_rates_len = bss->supp_rates_len;
+       assoc_data->ht_information_ie =
                ieee80211_bss_get_ie(req->bss, WLAN_EID_HT_INFORMATION);
 
        if (bss->wmm_used && bss->uapsd_supported &&
            (sdata->local->hw.flags & IEEE80211_HW_SUPPORTS_UAPSD)) {
-               wk->assoc.uapsd_used = true;
+               assoc_data->uapsd_used = true;
                ifmgd->flags |= IEEE80211_STA_UAPSD_ENABLED;
        } else {
-               wk->assoc.uapsd_used = false;
+               assoc_data->uapsd_used = false;
                ifmgd->flags &= ~IEEE80211_STA_UAPSD_ENABLED;
        }
 
-       ssid = ieee80211_bss_get_ie(req->bss, WLAN_EID_SSID);
-       memcpy(wk->assoc.ssid, ssid + 2, ssid[1]);
-       wk->assoc.ssid_len = ssid[1];
+       memcpy(assoc_data->ssid, ssidie + 2, ssidie[1]);
+       assoc_data->ssid_len = ssidie[1];
 
        if (req->prev_bssid)
-               memcpy(wk->assoc.prev_bssid, req->prev_bssid, ETH_ALEN);
-
-       wk->chan = req->bss->channel;
-       wk->chan_type = NL80211_CHAN_NO_HT;
-       wk->sdata = sdata;
-       wk->done = ieee80211_assoc_done;
-       if (!bss->dtim_period &&
-           sdata->local->hw.flags & IEEE80211_HW_NEED_DTIM_PERIOD)
-               wk->type = IEEE80211_WORK_ASSOC_BEACON_WAIT;
-       else
-               wk->type = IEEE80211_WORK_ASSOC;
+               memcpy(assoc_data->prev_bssid, req->prev_bssid, ETH_ALEN);
 
        if (req->use_mfp) {
                ifmgd->mfp = IEEE80211_MFP_REQUIRED;
@@ -2740,91 +3383,105 @@ int ieee80211_mgd_assoc(struct ieee80211_sub_if_data *sdata,
        sdata->control_port_protocol = req->crypto.control_port_ethertype;
        sdata->control_port_no_encrypt = req->crypto.control_port_no_encrypt;
 
-       ieee80211_add_work(wk);
-       return 0;
-}
+       /* kick off associate process */
 
-int ieee80211_mgd_deauth(struct ieee80211_sub_if_data *sdata,
-                        struct cfg80211_deauth_request *req,
-                        void *cookie)
-{
-       struct ieee80211_local *local = sdata->local;
-       struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
-       u8 bssid[ETH_ALEN];
-       bool assoc_bss = false;
+       ifmgd->assoc_data = assoc_data;
 
-       mutex_lock(&ifmgd->mtx);
+       mutex_lock(&local->mtx);
+       ieee80211_recalc_idle(sdata->local);
+       mutex_unlock(&local->mtx);
 
-       memcpy(bssid, req->bss->bssid, ETH_ALEN);
-       if (ifmgd->associated == req->bss) {
-               ieee80211_set_disassoc(sdata, false, true);
-               mutex_unlock(&ifmgd->mtx);
-               assoc_bss = true;
-       } else {
-               bool not_auth_yet = false;
-               struct ieee80211_work *tmp, *wk = NULL;
+       /* switch to the right channel */
+       local->oper_channel = req->bss->channel;
+       ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_CHANNEL);
 
-               mutex_unlock(&ifmgd->mtx);
+       rcu_read_lock();
+       sta = sta_info_get(sdata, req->bss->bssid);
+       rcu_read_unlock();
 
-               mutex_lock(&local->mtx);
-               list_for_each_entry(tmp, &local->work_list, list) {
-                       if (tmp->sdata != sdata)
-                               continue;
+       if (!sta) {
+               /* set BSSID */
+               memcpy(ifmgd->bssid, req->bss->bssid, ETH_ALEN);
+               ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BSSID);
 
-                       if (tmp->type != IEEE80211_WORK_DIRECT_PROBE &&
-                           tmp->type != IEEE80211_WORK_AUTH &&
-                           tmp->type != IEEE80211_WORK_ASSOC &&
-                           tmp->type != IEEE80211_WORK_ASSOC_BEACON_WAIT)
-                               continue;
+               sta = sta_info_alloc(sdata, req->bss->bssid, GFP_KERNEL);
+               if (!sta) {
+                       err = -ENOMEM;
+                       goto err_clear;
+               }
 
-                       if (memcmp(req->bss->bssid, tmp->filter_ta, ETH_ALEN))
-                               continue;
+               sta_info_pre_move_state(sta, IEEE80211_STA_AUTH);
 
-                       not_auth_yet = tmp->type == IEEE80211_WORK_DIRECT_PROBE;
-                       list_del_rcu(&tmp->list);
-                       synchronize_rcu();
-                       wk = tmp;
-                       break;
-               }
-               mutex_unlock(&local->mtx);
-
-               if (wk && wk->type == IEEE80211_WORK_ASSOC) {
-                       /* clean up dummy sta & TX sync */
-                       sta_info_destroy_addr(wk->sdata, wk->filter_ta);
-                       if (wk->assoc.synced)
-                               drv_finish_tx_sync(local, wk->sdata,
-                                                  wk->filter_ta,
-                                                  IEEE80211_TX_SYNC_ASSOC);
-               } else if (wk && wk->type == IEEE80211_WORK_AUTH) {
-                       if (wk->probe_auth.synced)
-                               drv_finish_tx_sync(local, wk->sdata,
-                                                  wk->filter_ta,
-                                                  IEEE80211_TX_SYNC_AUTH);
+               err = sta_info_insert(sta);
+               sta = NULL;
+               if (err) {
+                       printk(KERN_DEBUG
+                              "%s: failed to insert STA entry for the AP (error %d)\n",
+                              sdata->name, err);
+                       goto err_clear;
                }
-               kfree(wk);
+       } else
+               WARN_ON_ONCE(memcmp(ifmgd->bssid, req->bss->bssid, ETH_ALEN));
 
+       if (!bss->dtim_period &&
+           sdata->local->hw.flags & IEEE80211_HW_NEED_DTIM_PERIOD) {
                /*
-                * If somebody requests authentication and we haven't
-                * sent out an auth frame yet there's no need to send
-                * out a deauth frame either. If the state was PROBE,
-                * then this is the case. If it's AUTH we have sent a
-                * frame, and if it's IDLE we have completed the auth
-                * process already.
+                * Wait up to one beacon interval ...
+                * should this be more if we miss one?
                 */
-               if (not_auth_yet) {
-                       __cfg80211_auth_canceled(sdata->dev, bssid);
-                       return 0;
-               }
+               printk(KERN_DEBUG "%s: waiting for beacon from %pM\n",
+                      sdata->name, ifmgd->bssid);
+               assoc_data->timeout = jiffies +
+                               TU_TO_EXP_TIME(req->bss->beacon_interval);
+       } else {
+               assoc_data->have_beacon = true;
+               assoc_data->sent_assoc = false;
+               assoc_data->timeout = jiffies;
+       }
+       run_again(ifmgd, assoc_data->timeout);
+
+       err = 0;
+       goto out;
+ err_clear:
+       ifmgd->assoc_data = NULL;
+ err_free:
+       kfree(assoc_data);
+ out:
+       mutex_unlock(&ifmgd->mtx);
+
+       return err;
+}
+
+int ieee80211_mgd_deauth(struct ieee80211_sub_if_data *sdata,
+                        struct cfg80211_deauth_request *req)
+{
+       struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
+       u8 frame_buf[DEAUTH_DISASSOC_LEN];
+
+       mutex_lock(&ifmgd->mtx);
+
+       if (ifmgd->auth_data) {
+               ieee80211_destroy_auth_data(sdata, false);
+               mutex_unlock(&ifmgd->mtx);
+               return 0;
        }
 
-       printk(KERN_DEBUG "%s: deauthenticating from %pM by local choice (reason=%d)\n",
-              sdata->name, bssid, req->reason_code);
+       printk(KERN_DEBUG
+              "%s: deauthenticating from %pM by local choice (reason=%d)\n",
+              sdata->name, req->bssid, req->reason_code);
 
-       ieee80211_send_deauth_disassoc(sdata, bssid, IEEE80211_STYPE_DEAUTH,
-                                      req->reason_code, cookie,
-                                      !req->local_state_change);
-       if (assoc_bss)
-               sta_info_flush(sdata->local, sdata);
+       if (ifmgd->associated &&
+           memcmp(ifmgd->associated->bssid, req->bssid, ETH_ALEN) == 0)
+               ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DEAUTH,
+                                      req->reason_code, true, frame_buf);
+       else
+               ieee80211_send_deauth_disassoc(sdata, req->bssid,
+                                              IEEE80211_STYPE_DEAUTH,
+                                              req->reason_code, true,
+                                              frame_buf);
+       mutex_unlock(&ifmgd->mtx);
+
+       __cfg80211_send_deauth(sdata->dev, frame_buf, DEAUTH_DISASSOC_LEN);
 
        mutex_lock(&sdata->local->mtx);
        ieee80211_recalc_idle(sdata->local);
@@ -2834,11 +3491,11 @@ int ieee80211_mgd_deauth(struct ieee80211_sub_if_data *sdata,
 }
 
 int ieee80211_mgd_disassoc(struct ieee80211_sub_if_data *sdata,
-                          struct cfg80211_disassoc_request *req,
-                          void *cookie)
+                          struct cfg80211_disassoc_request *req)
 {
        struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
        u8 bssid[ETH_ALEN];
+       u8 frame_buf[DEAUTH_DISASSOC_LEN];
 
        mutex_lock(&ifmgd->mtx);
 
@@ -2857,14 +3514,12 @@ int ieee80211_mgd_disassoc(struct ieee80211_sub_if_data *sdata,
               sdata->name, req->bss->bssid, req->reason_code);
 
        memcpy(bssid, req->bss->bssid, ETH_ALEN);
-       ieee80211_set_disassoc(sdata, false, true);
-
+       ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DISASSOC,
+                              req->reason_code, !req->local_state_change,
+                              frame_buf);
        mutex_unlock(&ifmgd->mtx);
 
-       ieee80211_send_deauth_disassoc(sdata, req->bss->bssid,
-                       IEEE80211_STYPE_DISASSOC, req->reason_code,
-                       cookie, !req->local_state_change);
-       sta_info_flush(sdata->local, sdata);
+       __cfg80211_send_disassoc(sdata->dev, frame_buf, DEAUTH_DISASSOC_LEN);
 
        mutex_lock(&sdata->local->mtx);
        ieee80211_recalc_idle(sdata->local);
@@ -2873,6 +3528,19 @@ int ieee80211_mgd_disassoc(struct ieee80211_sub_if_data *sdata,
        return 0;
 }
 
+void ieee80211_mgd_teardown(struct ieee80211_sub_if_data *sdata)
+{
+       struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
+
+       mutex_lock(&ifmgd->mtx);
+       if (ifmgd->assoc_data)
+               ieee80211_destroy_assoc_data(sdata, false);
+       if (ifmgd->auth_data)
+               ieee80211_destroy_auth_data(sdata, false);
+       del_timer_sync(&ifmgd->timer);
+       mutex_unlock(&ifmgd->mtx);
+}
+
 void ieee80211_cqm_rssi_notify(struct ieee80211_vif *vif,
                               enum nl80211_cqm_rssi_threshold_event rssi_event,
                               gfp_t gfp)
index 596efaf..ef8eba1 100644 (file)
@@ -98,13 +98,12 @@ int __ieee80211_suspend(struct ieee80211_hw *hw, struct cfg80211_wowlan *wowlan)
        mutex_lock(&local->sta_mtx);
        list_for_each_entry(sta, &local->sta_list, list) {
                if (sta->uploaded) {
-                       sdata = sta->sdata;
-                       if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN)
-                               sdata = container_of(sdata->bss,
-                                            struct ieee80211_sub_if_data,
-                                            u.ap);
+                       enum ieee80211_sta_state state;
 
-                       drv_sta_remove(local, sdata, &sta->sta);
+                       state = sta->sta_state;
+                       for (; state > IEEE80211_STA_NOTEXIST; state--)
+                               WARN_ON(drv_sta_state(local, sta->sdata, sta,
+                                                     state, state - 1));
                }
 
                mesh_plink_quiesce(sta);
index f9b8e81..b4f7600 100644 (file)
@@ -159,7 +159,6 @@ static struct rate_control_ref *rate_control_alloc(const char *name,
        ref = kmalloc(sizeof(struct rate_control_ref), GFP_KERNEL);
        if (!ref)
                goto fail_ref;
-       kref_init(&ref->kref);
        ref->local = local;
        ref->ops = ieee80211_rate_control_ops_get(name);
        if (!ref->ops)
@@ -184,11 +183,8 @@ fail_ref:
        return NULL;
 }
 
-static void rate_control_release(struct kref *kref)
+static void rate_control_free(struct rate_control_ref *ctrl_ref)
 {
-       struct rate_control_ref *ctrl_ref;
-
-       ctrl_ref = container_of(kref, struct rate_control_ref, kref);
        ctrl_ref->ops->free(ctrl_ref->priv);
 
 #ifdef CONFIG_MAC80211_DEBUGFS
@@ -293,8 +289,8 @@ bool rate_control_send_low(struct ieee80211_sta *sta,
 }
 EXPORT_SYMBOL(rate_control_send_low);
 
-static void rate_idx_match_mask(struct ieee80211_tx_rate *rate,
-                               int n_bitrates, u32 mask)
+static bool rate_idx_match_legacy_mask(struct ieee80211_tx_rate *rate,
+                                      int n_bitrates, u32 mask)
 {
        int j;
 
@@ -303,7 +299,7 @@ static void rate_idx_match_mask(struct ieee80211_tx_rate *rate,
                if (mask & (1 << j)) {
                        /* Okay, found a suitable rate. Use it. */
                        rate->idx = j;
-                       return;
+                       return true;
                }
        }
 
@@ -312,6 +308,112 @@ static void rate_idx_match_mask(struct ieee80211_tx_rate *rate,
                if (mask & (1 << j)) {
                        /* Okay, found a suitable rate. Use it. */
                        rate->idx = j;
+                       return true;
+               }
+       }
+       return false;
+}
+
+static bool rate_idx_match_mcs_mask(struct ieee80211_tx_rate *rate,
+                                   u8 mcs_mask[IEEE80211_HT_MCS_MASK_LEN])
+{
+       int i, j;
+       int ridx, rbit;
+
+       ridx = rate->idx / 8;
+       rbit = rate->idx % 8;
+
+       /* sanity check */
+       if (ridx < 0 || ridx >= IEEE80211_HT_MCS_MASK_LEN)
+               return false;
+
+       /* See whether the selected rate or anything below it is allowed. */
+       for (i = ridx; i >= 0; i--) {
+               for (j = rbit; j >= 0; j--)
+                       if (mcs_mask[i] & BIT(j)) {
+                               rate->idx = i * 8 + j;
+                               return true;
+                       }
+               rbit = 7;
+       }
+
+       /* Try to find a higher rate that would be allowed */
+       ridx = (rate->idx + 1) / 8;
+       rbit = (rate->idx + 1) % 8;
+
+       for (i = ridx; i < IEEE80211_HT_MCS_MASK_LEN; i++) {
+               for (j = rbit; j < 8; j++)
+                       if (mcs_mask[i] & BIT(j)) {
+                               rate->idx = i * 8 + j;
+                               return true;
+                       }
+               rbit = 0;
+       }
+       return false;
+}
+
+
+
+static void rate_idx_match_mask(struct ieee80211_tx_rate *rate,
+                               struct ieee80211_tx_rate_control *txrc,
+                               u32 mask,
+                               u8 mcs_mask[IEEE80211_HT_MCS_MASK_LEN])
+{
+       struct ieee80211_tx_rate alt_rate;
+
+       /* handle HT rates */
+       if (rate->flags & IEEE80211_TX_RC_MCS) {
+               if (rate_idx_match_mcs_mask(rate, mcs_mask))
+                       return;
+
+               /* also try the legacy rates. */
+               alt_rate.idx = 0;
+               /* keep protection flags */
+               alt_rate.flags = rate->flags &
+                                (IEEE80211_TX_RC_USE_RTS_CTS |
+                                 IEEE80211_TX_RC_USE_CTS_PROTECT |
+                                 IEEE80211_TX_RC_USE_SHORT_PREAMBLE);
+               alt_rate.count = rate->count;
+               if (rate_idx_match_legacy_mask(&alt_rate,
+                                              txrc->sband->n_bitrates,
+                                              mask)) {
+                       *rate = alt_rate;
+                       return;
+               }
+       } else {
+               struct sk_buff *skb = txrc->skb;
+               struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
+               __le16 fc;
+
+               /* handle legacy rates */
+               if (rate_idx_match_legacy_mask(rate, txrc->sband->n_bitrates,
+                                              mask))
+                       return;
+
+               /* if HT BSS, and we handle a data frame, also try HT rates */
+               if (txrc->bss_conf->channel_type == NL80211_CHAN_NO_HT)
+                       return;
+
+               fc = hdr->frame_control;
+               if (!ieee80211_is_data(fc))
+                       return;
+
+               alt_rate.idx = 0;
+               /* keep protection flags */
+               alt_rate.flags = rate->flags &
+                                (IEEE80211_TX_RC_USE_RTS_CTS |
+                                 IEEE80211_TX_RC_USE_CTS_PROTECT |
+                                 IEEE80211_TX_RC_USE_SHORT_PREAMBLE);
+               alt_rate.count = rate->count;
+
+               alt_rate.flags |= IEEE80211_TX_RC_MCS;
+
+               if ((txrc->bss_conf->channel_type == NL80211_CHAN_HT40MINUS) ||
+                   (txrc->bss_conf->channel_type == NL80211_CHAN_HT40PLUS))
+                       alt_rate.flags |= IEEE80211_TX_RC_40_MHZ_WIDTH;
+
+               if (rate_idx_match_mcs_mask(&alt_rate, mcs_mask)) {
+                       *rate = alt_rate;
                        return;
                }
        }
@@ -335,6 +437,7 @@ void rate_control_get_rate(struct ieee80211_sub_if_data *sdata,
        struct ieee80211_tx_info *info = IEEE80211_SKB_CB(txrc->skb);
        int i;
        u32 mask;
+       u8 mcs_mask[IEEE80211_HT_MCS_MASK_LEN];
 
        if (sta && test_sta_flag(sta, WLAN_STA_RATE_CONTROL)) {
                ista = &sta->sta;
@@ -358,10 +461,14 @@ void rate_control_get_rate(struct ieee80211_sub_if_data *sdata,
         * the common case.
         */
        mask = sdata->rc_rateidx_mask[info->band];
+       memcpy(mcs_mask, sdata->rc_rateidx_mcs_mask[info->band],
+              sizeof(mcs_mask));
        if (mask != (1 << txrc->sband->n_bitrates) - 1) {
                if (sta) {
                        /* Filter out rates that the STA does not support */
                        mask &= sta->sta.supp_rates[info->band];
+                       for (i = 0; i < sizeof(mcs_mask); i++)
+                               mcs_mask[i] &= sta->sta.ht_cap.mcs.rx_mask[i];
                }
                /*
                 * Make sure the rate index selected for each TX rate is
@@ -372,32 +479,18 @@ void rate_control_get_rate(struct ieee80211_sub_if_data *sdata,
                        /* Skip invalid rates */
                        if (info->control.rates[i].idx < 0)
                                break;
-                       /* Rate masking supports only legacy rates for now */
-                       if (info->control.rates[i].flags & IEEE80211_TX_RC_MCS)
-                               continue;
-                       rate_idx_match_mask(&info->control.rates[i],
-                                           txrc->sband->n_bitrates, mask);
+                       rate_idx_match_mask(&info->control.rates[i], txrc,
+                                           mask, mcs_mask);
                }
        }
 
        BUG_ON(info->control.rates[0].idx < 0);
 }
 
-struct rate_control_ref *rate_control_get(struct rate_control_ref *ref)
-{
-       kref_get(&ref->kref);
-       return ref;
-}
-
-void rate_control_put(struct rate_control_ref *ref)
-{
-       kref_put(&ref->kref, rate_control_release);
-}
-
 int ieee80211_init_rate_ctrl_alg(struct ieee80211_local *local,
                                 const char *name)
 {
-       struct rate_control_ref *ref, *old;
+       struct rate_control_ref *ref;
 
        ASSERT_RTNL();
 
@@ -417,12 +510,8 @@ int ieee80211_init_rate_ctrl_alg(struct ieee80211_local *local,
                return -ENOENT;
        }
 
-       old = local->rate_ctrl;
+       WARN_ON(local->rate_ctrl);
        local->rate_ctrl = ref;
-       if (old) {
-               rate_control_put(old);
-               sta_info_flush(local, NULL);
-       }
 
        wiphy_debug(local->hw.wiphy, "Selected rate control algorithm '%s'\n",
                    ref->ops->name);
@@ -440,6 +529,6 @@ void rate_control_deinitialize(struct ieee80211_local *local)
                return;
 
        local->rate_ctrl = NULL;
-       rate_control_put(ref);
+       rate_control_free(ref);
 }
 
index 80cfc00..fbb1efd 100644 (file)
@@ -14,7 +14,6 @@
 #include <linux/netdevice.h>
 #include <linux/skbuff.h>
 #include <linux/types.h>
-#include <linux/kref.h>
 #include <net/mac80211.h>
 #include "ieee80211_i.h"
 #include "sta_info.h"
@@ -23,14 +22,11 @@ struct rate_control_ref {
        struct ieee80211_local *local;
        struct rate_control_ops *ops;
        void *priv;
-       struct kref kref;
 };
 
 void rate_control_get_rate(struct ieee80211_sub_if_data *sdata,
                           struct sta_info *sta,
                           struct ieee80211_tx_rate_control *txrc);
-struct rate_control_ref *rate_control_get(struct rate_control_ref *ref);
-void rate_control_put(struct rate_control_ref *ref);
 
 static inline void rate_control_tx_status(struct ieee80211_local *local,
                                          struct ieee80211_supported_band *sband,
index 5a5e504..7a4ff02 100644 (file)
@@ -19,6 +19,7 @@
 #include <linux/export.h>
 #include <net/mac80211.h>
 #include <net/ieee80211_radiotap.h>
+#include <asm/unaligned.h>
 
 #include "ieee80211_i.h"
 #include "driver-ops.h"
@@ -859,7 +860,12 @@ ieee80211_rx_h_check(struct ieee80211_rx_data *rx)
                     rx->sdata->vif.type != NL80211_IFTYPE_ADHOC &&
                     rx->sdata->vif.type != NL80211_IFTYPE_WDS &&
                     (!rx->sta || !test_sta_flag(rx->sta, WLAN_STA_ASSOC)))) {
-               if (rx->sta && rx->sta->dummy &&
+               /*
+                * accept port control frames from the AP even when it's not
+                * yet marked ASSOC to prevent a race where we don't set the
+                * assoc bit quickly enough before it sends the first frame
+                */
+               if (rx->sta && rx->sdata->vif.type == NL80211_IFTYPE_STATION &&
                    ieee80211_is_data_present(hdr->frame_control)) {
                        u16 ethertype;
                        u8 *payload;
@@ -1145,19 +1151,15 @@ static void ap_sta_ps_start(struct sta_info *sta)
 
 static void ap_sta_ps_end(struct sta_info *sta)
 {
-       struct ieee80211_sub_if_data *sdata = sta->sdata;
-
-       atomic_dec(&sdata->bss->num_sta_ps);
-
 #ifdef CONFIG_MAC80211_VERBOSE_PS_DEBUG
        printk(KERN_DEBUG "%s: STA %pM aid %d exits power save mode\n",
-              sdata->name, sta->sta.addr, sta->sta.aid);
+              sta->sdata->name, sta->sta.addr, sta->sta.aid);
 #endif /* CONFIG_MAC80211_VERBOSE_PS_DEBUG */
 
        if (test_sta_flag(sta, WLAN_STA_PS_DRIVER)) {
 #ifdef CONFIG_MAC80211_VERBOSE_PS_DEBUG
                printk(KERN_DEBUG "%s: STA %pM aid %d driver-ps-blocked\n",
-                      sdata->name, sta->sta.addr, sta->sta.aid);
+                      sta->sdata->name, sta->sta.addr, sta->sta.aid);
 #endif /* CONFIG_MAC80211_VERBOSE_PS_DEBUG */
                return;
        }
@@ -2180,9 +2182,6 @@ ieee80211_rx_h_mgmt_check(struct ieee80211_rx_data *rx)
        if (rx->sdata->vif.type == NL80211_IFTYPE_AP &&
            ieee80211_is_beacon(mgmt->frame_control) &&
            !(rx->flags & IEEE80211_RX_BEACON_REPORTED)) {
-               struct ieee80211_rx_status *status;
-
-               status = IEEE80211_SKB_RXCB(rx->skb);
                cfg80211_report_obss_beacon(rx->local->hw.wiphy,
                                            rx->skb->data, rx->skb->len,
                                            status->freq, GFP_ATOMIC);
@@ -2486,14 +2485,9 @@ static ieee80211_rx_result debug_noinline
 ieee80211_rx_h_mgmt(struct ieee80211_rx_data *rx)
 {
        struct ieee80211_sub_if_data *sdata = rx->sdata;
-       ieee80211_rx_result rxs;
        struct ieee80211_mgmt *mgmt = (void *)rx->skb->data;
        __le16 stype;
 
-       rxs = ieee80211_work_rx_mgmt(rx->sdata, rx->skb);
-       if (rxs != RX_CONTINUE)
-               return rxs;
-
        stype = mgmt->frame_control & cpu_to_le16(IEEE80211_FCTL_STYPE);
 
        if (!ieee80211_vif_is_mesh(&sdata->vif) &&
@@ -2502,10 +2496,13 @@ ieee80211_rx_h_mgmt(struct ieee80211_rx_data *rx)
                return RX_DROP_MONITOR;
 
        switch (stype) {
+       case cpu_to_le16(IEEE80211_STYPE_AUTH):
        case cpu_to_le16(IEEE80211_STYPE_BEACON):
        case cpu_to_le16(IEEE80211_STYPE_PROBE_RESP):
                /* process for all: mesh, mlme, ibss */
                break;
+       case cpu_to_le16(IEEE80211_STYPE_ASSOC_RESP):
+       case cpu_to_le16(IEEE80211_STYPE_REASSOC_RESP):
        case cpu_to_le16(IEEE80211_STYPE_DEAUTH):
        case cpu_to_le16(IEEE80211_STYPE_DISASSOC):
                if (is_multicast_ether_addr(mgmt->da) &&
@@ -2517,7 +2514,6 @@ ieee80211_rx_h_mgmt(struct ieee80211_rx_data *rx)
                        return RX_DROP_MONITOR;
                break;
        case cpu_to_le16(IEEE80211_STYPE_PROBE_REQ):
-       case cpu_to_le16(IEEE80211_STYPE_AUTH):
                /* process only for ibss */
                if (sdata->vif.type != NL80211_IFTYPE_ADHOC)
                        return RX_DROP_MONITOR;
@@ -2956,7 +2952,7 @@ static void __ieee80211_rx_handle_packet(struct ieee80211_hw *hw,
        if (ieee80211_is_data(fc)) {
                prev_sta = NULL;
 
-               for_each_sta_info_rx(local, hdr->addr2, sta, tmp) {
+               for_each_sta_info(local, hdr->addr2, sta, tmp) {
                        if (!prev_sta) {
                                prev_sta = sta;
                                continue;
@@ -3000,7 +2996,7 @@ static void __ieee80211_rx_handle_packet(struct ieee80211_hw *hw,
                        continue;
                }
 
-               rx.sta = sta_info_get_bss_rx(prev, hdr->addr2);
+               rx.sta = sta_info_get_bss(prev, hdr->addr2);
                rx.sdata = prev;
                ieee80211_prepare_and_rx_handle(&rx, skb, false);
 
@@ -3008,7 +3004,7 @@ static void __ieee80211_rx_handle_packet(struct ieee80211_hw *hw,
        }
 
        if (prev) {
-               rx.sta = sta_info_get_bss_rx(prev, hdr->addr2);
+               rx.sta = sta_info_get_bss(prev, hdr->addr2);
                rx.sdata = prev;
 
                if (ieee80211_prepare_and_rx_handle(&rx, skb, true))
index ff11f6b..cd0f265 100644 (file)
@@ -100,25 +100,6 @@ struct sta_info *sta_info_get(struct ieee80211_sub_if_data *sdata,
        sta = rcu_dereference_check(local->sta_hash[STA_HASH(addr)],
                                    lockdep_is_held(&local->sta_mtx));
        while (sta) {
-               if (sta->sdata == sdata && !sta->dummy &&
-                   memcmp(sta->sta.addr, addr, ETH_ALEN) == 0)
-                       break;
-               sta = rcu_dereference_check(sta->hnext,
-                                           lockdep_is_held(&local->sta_mtx));
-       }
-       return sta;
-}
-
-/* get a station info entry even if it is a dummy station*/
-struct sta_info *sta_info_get_rx(struct ieee80211_sub_if_data *sdata,
-                             const u8 *addr)
-{
-       struct ieee80211_local *local = sdata->local;
-       struct sta_info *sta;
-
-       sta = rcu_dereference_check(local->sta_hash[STA_HASH(addr)],
-                                   lockdep_is_held(&local->sta_mtx));
-       while (sta) {
                if (sta->sdata == sdata &&
                    memcmp(sta->sta.addr, addr, ETH_ALEN) == 0)
                        break;
@@ -143,30 +124,6 @@ struct sta_info *sta_info_get_bss(struct ieee80211_sub_if_data *sdata,
        while (sta) {
                if ((sta->sdata == sdata ||
                     (sta->sdata->bss && sta->sdata->bss == sdata->bss)) &&
-                   !sta->dummy &&
-                   memcmp(sta->sta.addr, addr, ETH_ALEN) == 0)
-                       break;
-               sta = rcu_dereference_check(sta->hnext,
-                                           lockdep_is_held(&local->sta_mtx));
-       }
-       return sta;
-}
-
-/*
- * Get sta info either from the specified interface
- * or from one of its vlans (including dummy stations)
- */
-struct sta_info *sta_info_get_bss_rx(struct ieee80211_sub_if_data *sdata,
-                                 const u8 *addr)
-{
-       struct ieee80211_local *local = sdata->local;
-       struct sta_info *sta;
-
-       sta = rcu_dereference_check(local->sta_hash[STA_HASH(addr)],
-                                   lockdep_is_held(&local->sta_mtx));
-       while (sta) {
-               if ((sta->sdata == sdata ||
-                    (sta->sdata->bss && sta->sdata->bss == sdata->bss)) &&
                    memcmp(sta->sta.addr, addr, ETH_ALEN) == 0)
                        break;
                sta = rcu_dereference_check(sta->hnext,
@@ -208,10 +165,8 @@ struct sta_info *sta_info_get_by_idx(struct ieee80211_sub_if_data *sdata,
  */
 void sta_info_free(struct ieee80211_local *local, struct sta_info *sta)
 {
-       if (sta->rate_ctrl) {
+       if (sta->rate_ctrl)
                rate_control_free_sta(sta);
-               rate_control_put(sta->rate_ctrl);
-       }
 
 #ifdef CONFIG_MAC80211_VERBOSE_DEBUG
        wiphy_debug(local->hw.wiphy, "Destroyed STA %pM\n", sta->sta.addr);
@@ -264,13 +219,11 @@ static int sta_prepare_rate_control(struct ieee80211_local *local,
        if (local->hw.flags & IEEE80211_HW_HAS_RATE_CONTROL)
                return 0;
 
-       sta->rate_ctrl = rate_control_get(local->rate_ctrl);
+       sta->rate_ctrl = local->rate_ctrl;
        sta->rate_ctrl_priv = rate_control_alloc_sta(sta->rate_ctrl,
                                                     &sta->sta, gfp);
-       if (!sta->rate_ctrl_priv) {
-               rate_control_put(sta->rate_ctrl);
+       if (!sta->rate_ctrl_priv)
                return -ENOMEM;
-       }
 
        return 0;
 }
@@ -297,6 +250,8 @@ struct sta_info *sta_info_alloc(struct ieee80211_sub_if_data *sdata,
        sta->sdata = sdata;
        sta->last_rx = jiffies;
 
+       sta->sta_state = IEEE80211_STA_NONE;
+
        do_posix_clock_monotonic_gettime(&uptime);
        sta->last_connected = uptime.tv_sec;
        ewma_init(&sta->avg_signal, 1024, 8);
@@ -353,6 +308,43 @@ static int sta_info_insert_check(struct sta_info *sta)
        return 0;
 }
 
+static int sta_info_insert_drv_state(struct ieee80211_local *local,
+                                    struct ieee80211_sub_if_data *sdata,
+                                    struct sta_info *sta)
+{
+       enum ieee80211_sta_state state;
+       int err = 0;
+
+       for (state = IEEE80211_STA_NOTEXIST; state < sta->sta_state; state++) {
+               err = drv_sta_state(local, sdata, sta, state, state + 1);
+               if (err)
+                       break;
+       }
+
+       if (!err) {
+               /*
+                * Drivers using legacy sta_add/sta_remove callbacks only
+                * get uploaded set to true after sta_add is called.
+                */
+               if (!local->ops->sta_add)
+                       sta->uploaded = true;
+               return 0;
+       }
+
+       if (sdata->vif.type == NL80211_IFTYPE_ADHOC) {
+               printk(KERN_DEBUG
+                      "%s: failed to move IBSS STA %pM to state %d (%d) - keeping it anyway.\n",
+                      sdata->name, sta->sta.addr, state + 1, err);
+               err = 0;
+       }
+
+       /* unwind on error */
+       for (; state > IEEE80211_STA_NOTEXIST; state--)
+               WARN_ON(drv_sta_state(local, sdata, sta, state, state - 1));
+
+       return err;
+}
+
 /*
  * should be called with sta_mtx locked
  * this function replaces the mutex lock
@@ -362,70 +354,43 @@ static int sta_info_insert_finish(struct sta_info *sta) __acquires(RCU)
 {
        struct ieee80211_local *local = sta->local;
        struct ieee80211_sub_if_data *sdata = sta->sdata;
-       struct sta_info *exist_sta;
-       bool dummy_reinsert = false;
+       struct station_info sinfo;
        int err = 0;
 
        lockdep_assert_held(&local->sta_mtx);
 
-       /*
-        * check if STA exists already.
-        * only accept a scenario of a second call to sta_info_insert_finish
-        * with a dummy station entry that was inserted earlier
-        * in that case - assume that the dummy station flag should
-        * be removed.
-        */
-       exist_sta = sta_info_get_bss_rx(sdata, sta->sta.addr);
-       if (exist_sta) {
-               if (exist_sta == sta && sta->dummy) {
-                       dummy_reinsert = true;
-               } else {
-                       err = -EEXIST;
-                       goto out_err;
-               }
+       /* check if STA exists already */
+       if (sta_info_get_bss(sdata, sta->sta.addr)) {
+               err = -EEXIST;
+               goto out_err;
        }
 
-       if (!sta->dummy || dummy_reinsert) {
-               /* notify driver */
-               err = drv_sta_add(local, sdata, &sta->sta);
-               if (err) {
-                       if (sdata->vif.type != NL80211_IFTYPE_ADHOC)
-                               goto out_err;
-                       printk(KERN_DEBUG "%s: failed to add IBSS STA %pM to "
-                                         "driver (%d) - keeping it anyway.\n",
-                              sdata->name, sta->sta.addr, err);
-               } else
-                       sta->uploaded = true;
-       }
+       /* notify driver */
+       err = sta_info_insert_drv_state(local, sdata, sta);
+       if (err)
+               goto out_err;
 
-       if (!dummy_reinsert) {
-               local->num_sta++;
-               local->sta_generation++;
-               smp_mb();
+       local->num_sta++;
+       local->sta_generation++;
+       smp_mb();
 
-               /* make the station visible */
-               sta_info_hash_add(local, sta);
+       /* make the station visible */
+       sta_info_hash_add(local, sta);
 
-               list_add(&sta->list, &local->sta_list);
-       } else {
-               sta->dummy = false;
-       }
+       list_add(&sta->list, &local->sta_list);
 
-       if (!sta->dummy) {
-               struct station_info sinfo;
+       set_sta_flag(sta, WLAN_STA_INSERTED);
 
-               ieee80211_sta_debugfs_add(sta);
-               rate_control_add_sta_debugfs(sta);
+       ieee80211_sta_debugfs_add(sta);
+       rate_control_add_sta_debugfs(sta);
 
-               memset(&sinfo, 0, sizeof(sinfo));
-               sinfo.filled = 0;
-               sinfo.generation = local->sta_generation;
-               cfg80211_new_sta(sdata->dev, sta->sta.addr, &sinfo, GFP_KERNEL);
-       }
+       memset(&sinfo, 0, sizeof(sinfo));
+       sinfo.filled = 0;
+       sinfo.generation = local->sta_generation;
+       cfg80211_new_sta(sdata->dev, sta->sta.addr, &sinfo, GFP_KERNEL);
 
 #ifdef CONFIG_MAC80211_VERBOSE_DEBUG
-       wiphy_debug(local->hw.wiphy, "Inserted %sSTA %pM\n",
-                       sta->dummy ? "dummy " : "", sta->sta.addr);
+       wiphy_debug(local->hw.wiphy, "Inserted STA %pM\n", sta->sta.addr);
 #endif /* CONFIG_MAC80211_VERBOSE_DEBUG */
 
        /* move reference to rcu-protected */
@@ -477,25 +442,6 @@ int sta_info_insert(struct sta_info *sta)
        return err;
 }
 
-/* Caller must hold sta->local->sta_mtx */
-int sta_info_reinsert(struct sta_info *sta)
-{
-       struct ieee80211_local *local = sta->local;
-       int err = 0;
-
-       err = sta_info_insert_check(sta);
-       if (err) {
-               mutex_unlock(&local->sta_mtx);
-               return err;
-       }
-
-       might_sleep();
-
-       err = sta_info_insert_finish(sta);
-       rcu_read_unlock();
-       return err;
-}
-
 static inline void __bss_tim_set(struct ieee80211_if_ap *bss, u16 aid)
 {
        /*
@@ -711,7 +657,7 @@ static bool sta_info_cleanup_expire_buffered(struct ieee80211_local *local,
        return have_buffered;
 }
 
-static int __must_check __sta_info_destroy(struct sta_info *sta)
+int __must_check __sta_info_destroy(struct sta_info *sta)
 {
        struct ieee80211_local *local;
        struct ieee80211_sub_if_data *sdata;
@@ -726,6 +672,8 @@ static int __must_check __sta_info_destroy(struct sta_info *sta)
        local = sta->local;
        sdata = sta->sdata;
 
+       lockdep_assert_held(&local->sta_mtx);
+
        /*
         * Before removing the station from the driver and
         * rate control, it might still start new aggregation
@@ -750,33 +698,24 @@ static int __must_check __sta_info_destroy(struct sta_info *sta)
 
        sta->dead = true;
 
-       if (test_sta_flag(sta, WLAN_STA_PS_STA) ||
-           test_sta_flag(sta, WLAN_STA_PS_DRIVER)) {
-               BUG_ON(!sdata->bss);
-
-               clear_sta_flag(sta, WLAN_STA_PS_STA);
-               clear_sta_flag(sta, WLAN_STA_PS_DRIVER);
-
-               atomic_dec(&sdata->bss->num_sta_ps);
-               sta_info_recalc_tim(sta);
-       }
-
        local->num_sta--;
        local->sta_generation++;
 
        if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN)
                RCU_INIT_POINTER(sdata->u.vlan.sta, NULL);
 
-       while (sta->sta_state > IEEE80211_STA_NONE)
-               sta_info_move_state(sta, sta->sta_state - 1);
+       while (sta->sta_state > IEEE80211_STA_NONE) {
+               ret = sta_info_move_state(sta, sta->sta_state - 1);
+               if (ret) {
+                       WARN_ON_ONCE(1);
+                       break;
+               }
+       }
 
        if (sta->uploaded) {
-               if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN)
-                       sdata = container_of(sdata->bss,
-                                            struct ieee80211_sub_if_data,
-                                            u.ap);
-               drv_sta_remove(local, sdata, &sta->sta);
-               sdata = sta->sdata;
+               ret = drv_sta_state(local, sdata, sta, IEEE80211_STA_NONE,
+                                   IEEE80211_STA_NOTEXIST);
+               WARN_ON_ONCE(ret != 0);
        }
 
        /*
@@ -787,6 +726,15 @@ static int __must_check __sta_info_destroy(struct sta_info *sta)
         */
        synchronize_rcu();
 
+       if (test_sta_flag(sta, WLAN_STA_PS_STA)) {
+               BUG_ON(!sdata->bss);
+
+               clear_sta_flag(sta, WLAN_STA_PS_STA);
+
+               atomic_dec(&sdata->bss->num_sta_ps);
+               sta_info_recalc_tim(sta);
+       }
+
        for (ac = 0; ac < IEEE80211_NUM_ACS; ac++) {
                local->total_ps_buffered -= skb_queue_len(&sta->ps_tx_buf[ac]);
                __skb_queue_purge(&sta->ps_tx_buf[ac]);
@@ -815,35 +763,20 @@ static int __must_check __sta_info_destroy(struct sta_info *sta)
        }
 #endif
 
-       /* There could be some memory leaks because of ampdu tx pending queue
-        * not being freed before destroying the station info.
-        *
-        * Make sure that such queues are purged before freeing the station
-        * info.
-        * TODO: We have to somehow postpone the full destruction
-        * until the aggregation stop completes. Refer
-        * http://thread.gmane.org/gmane.linux.kernel.wireless.general/81936
+       /*
+        * Destroy aggregation state here. It would be nice to wait for the
+        * driver to finish aggregation stop and then clean up, but for now
+        * drivers have to handle aggregation stop being requested, followed
+        * directly by station destruction.
         */
-
-       mutex_lock(&sta->ampdu_mlme.mtx);
-
        for (i = 0; i < STA_TID_NUM; i++) {
-               tid_tx = rcu_dereference_protected_tid_tx(sta, i);
+               tid_tx = rcu_dereference_raw(sta->ampdu_mlme.tid_tx[i]);
                if (!tid_tx)
                        continue;
-               if (skb_queue_len(&tid_tx->pending)) {
-#ifdef CONFIG_MAC80211_HT_DEBUG
-                       wiphy_debug(local->hw.wiphy, "TX A-MPDU  purging %d "
-                               "packets for tid=%d\n",
-                               skb_queue_len(&tid_tx->pending), i);
-#endif /* CONFIG_MAC80211_HT_DEBUG */
-                       __skb_queue_purge(&tid_tx->pending);
-               }
-               kfree_rcu(tid_tx, rcu_head);
+               __skb_queue_purge(&tid_tx->pending);
+               kfree(tid_tx);
        }
 
-       mutex_unlock(&sta->ampdu_mlme.mtx);
-
        sta_info_free(local, sta);
 
        return 0;
@@ -855,7 +788,7 @@ int sta_info_destroy_addr(struct ieee80211_sub_if_data *sdata, const u8 *addr)
        int ret;
 
        mutex_lock(&sdata->local->sta_mtx);
-       sta = sta_info_get_rx(sdata, addr);
+       sta = sta_info_get(sdata, addr);
        ret = __sta_info_destroy(sta);
        mutex_unlock(&sdata->local->sta_mtx);
 
@@ -869,7 +802,7 @@ int sta_info_destroy_addr_bss(struct ieee80211_sub_if_data *sdata,
        int ret;
 
        mutex_lock(&sdata->local->sta_mtx);
-       sta = sta_info_get_bss_rx(sdata, addr);
+       sta = sta_info_get_bss(sdata, addr);
        ret = __sta_info_destroy(sta);
        mutex_unlock(&sdata->local->sta_mtx);
 
@@ -932,8 +865,10 @@ int sta_info_flush(struct ieee80211_local *local,
 
        mutex_lock(&local->sta_mtx);
        list_for_each_entry_safe(sta, tmp, &local->sta_list, list) {
-               if (!sdata || sdata == sta->sdata)
+               if (!sdata || sdata == sta->sdata) {
                        WARN_ON(__sta_info_destroy(sta));
+                       ret++;
+               }
        }
        mutex_unlock(&local->sta_mtx);
 
@@ -1009,9 +944,11 @@ EXPORT_SYMBOL(ieee80211_find_sta);
 static void clear_sta_ps_flags(void *_sta)
 {
        struct sta_info *sta = _sta;
+       struct ieee80211_sub_if_data *sdata = sta->sdata;
 
        clear_sta_flag(sta, WLAN_STA_PS_DRIVER);
-       clear_sta_flag(sta, WLAN_STA_PS_STA);
+       if (test_and_clear_sta_flag(sta, WLAN_STA_PS_STA))
+               atomic_dec(&sdata->bss->num_sta_ps);
 }
 
 /* powersave support code */
@@ -1113,7 +1050,7 @@ static void ieee80211_send_null_response(struct ieee80211_sub_if_data *sdata,
         * exchange. Also set EOSP to indicate this packet
         * ends the poll/service period.
         */
-       info->flags |= IEEE80211_TX_CTL_POLL_RESPONSE |
+       info->flags |= IEEE80211_TX_CTL_NO_PS_BUFFER |
                       IEEE80211_TX_STATUS_EOSP |
                       IEEE80211_TX_CTL_REQ_TX_STATUS;
 
@@ -1240,7 +1177,7 @@ ieee80211_sta_ps_deliver_response(struct sta_info *sta,
                         * STA may still remain is PS mode after this frame
                         * exchange.
                         */
-                       info->flags |= IEEE80211_TX_CTL_POLL_RESPONSE;
+                       info->flags |= IEEE80211_TX_CTL_NO_PS_BUFFER;
 
                        /*
                         * Use MoreData flag to indicate whether there are
@@ -1410,28 +1347,68 @@ void ieee80211_sta_set_buffered(struct ieee80211_sta *pubsta,
 }
 EXPORT_SYMBOL(ieee80211_sta_set_buffered);
 
-int sta_info_move_state_checked(struct sta_info *sta,
-                               enum ieee80211_sta_state new_state)
+int sta_info_move_state(struct sta_info *sta,
+                       enum ieee80211_sta_state new_state)
 {
        might_sleep();
 
        if (sta->sta_state == new_state)
                return 0;
 
+       /* check allowed transitions first */
+
+       switch (new_state) {
+       case IEEE80211_STA_NONE:
+               if (sta->sta_state != IEEE80211_STA_AUTH)
+                       return -EINVAL;
+               break;
+       case IEEE80211_STA_AUTH:
+               if (sta->sta_state != IEEE80211_STA_NONE &&
+                   sta->sta_state != IEEE80211_STA_ASSOC)
+                       return -EINVAL;
+               break;
+       case IEEE80211_STA_ASSOC:
+               if (sta->sta_state != IEEE80211_STA_AUTH &&
+                   sta->sta_state != IEEE80211_STA_AUTHORIZED)
+                       return -EINVAL;
+               break;
+       case IEEE80211_STA_AUTHORIZED:
+               if (sta->sta_state != IEEE80211_STA_ASSOC)
+                       return -EINVAL;
+               break;
+       default:
+               WARN(1, "invalid state %d", new_state);
+               return -EINVAL;
+       }
+
+#ifdef CONFIG_MAC80211_VERBOSE_DEBUG
+       printk(KERN_DEBUG "%s: moving STA %pM to state %d\n",
+               sta->sdata->name, sta->sta.addr, new_state);
+#endif
+
+       /*
+        * notify the driver before the actual changes so it can
+        * fail the transition
+        */
+       if (test_sta_flag(sta, WLAN_STA_INSERTED)) {
+               int err = drv_sta_state(sta->local, sta->sdata, sta,
+                                       sta->sta_state, new_state);
+               if (err)
+                       return err;
+       }
+
+       /* reflect the change in all state variables */
+
        switch (new_state) {
        case IEEE80211_STA_NONE:
                if (sta->sta_state == IEEE80211_STA_AUTH)
                        clear_bit(WLAN_STA_AUTH, &sta->_flags);
-               else
-                       return -EINVAL;
                break;
        case IEEE80211_STA_AUTH:
                if (sta->sta_state == IEEE80211_STA_NONE)
                        set_bit(WLAN_STA_AUTH, &sta->_flags);
                else if (sta->sta_state == IEEE80211_STA_ASSOC)
                        clear_bit(WLAN_STA_ASSOC, &sta->_flags);
-               else
-                       return -EINVAL;
                break;
        case IEEE80211_STA_ASSOC:
                if (sta->sta_state == IEEE80211_STA_AUTH) {
@@ -1440,24 +1417,19 @@ int sta_info_move_state_checked(struct sta_info *sta,
                        if (sta->sdata->vif.type == NL80211_IFTYPE_AP)
                                atomic_dec(&sta->sdata->u.ap.num_sta_authorized);
                        clear_bit(WLAN_STA_AUTHORIZED, &sta->_flags);
-               } else
-                       return -EINVAL;
+               }
                break;
        case IEEE80211_STA_AUTHORIZED:
                if (sta->sta_state == IEEE80211_STA_ASSOC) {
                        if (sta->sdata->vif.type == NL80211_IFTYPE_AP)
                                atomic_inc(&sta->sdata->u.ap.num_sta_authorized);
                        set_bit(WLAN_STA_AUTHORIZED, &sta->_flags);
-               } else
-                       return -EINVAL;
+               }
                break;
        default:
-               WARN(1, "invalid state %d", new_state);
-               return -EINVAL;
+               break;
        }
 
-       printk(KERN_DEBUG "%s: moving STA %pM to state %d\n",
-               sta->sdata->name, sta->sta.addr, new_state);
        sta->sta_state = new_state;
 
        return 0;
index bfed851..23a97c9 100644 (file)
@@ -52,6 +52,7 @@
  * @WLAN_STA_SP: Station is in a service period, so don't try to
  *     reply to other uAPSD trigger frames or PS-Poll.
  * @WLAN_STA_4ADDR_EVENT: 4-addr event was already sent for this frame.
+ * @WLAN_STA_INSERTED: This station is inserted into the hash table.
  * @WLAN_STA_RATE_CONTROL: rate control was initialized for this station.
  */
 enum ieee80211_sta_info_flags {
@@ -72,17 +73,10 @@ enum ieee80211_sta_info_flags {
        WLAN_STA_UAPSD,
        WLAN_STA_SP,
        WLAN_STA_4ADDR_EVENT,
+       WLAN_STA_INSERTED,
        WLAN_STA_RATE_CONTROL,
 };
 
-enum ieee80211_sta_state {
-       /* NOTE: These need to be ordered correctly! */
-       IEEE80211_STA_NONE,
-       IEEE80211_STA_AUTH,
-       IEEE80211_STA_ASSOC,
-       IEEE80211_STA_AUTHORIZED,
-};
-
 #define STA_TID_NUM 16
 #define ADDBA_RESP_INTERVAL HZ
 #define HT_AGG_MAX_RETRIES             15
@@ -273,8 +267,6 @@ struct sta_ampdu_mlme {
  * @dead: set to true when sta is unlinked
  * @uploaded: set to true when sta is uploaded to the driver
  * @lost_packets: number of consecutive lost packets
- * @dummy: indicate a dummy station created for receiving
- *     EAP frames before association
  * @sta: station information we share with the driver
  * @sta_state: duplicates information about station state (for debug)
  * @beacon_loss_count: number of times beacon loss has triggered
@@ -372,9 +364,6 @@ struct sta_info {
        unsigned int lost_packets;
        unsigned int beacon_loss_count;
 
-       /* should be right in front of sta to be in the same cache line */
-       bool dummy;
-
        /* keep last! */
        struct ieee80211_sta sta;
 };
@@ -429,13 +418,17 @@ static inline int test_and_set_sta_flag(struct sta_info *sta,
        return test_and_set_bit(flag, &sta->_flags);
 }
 
-int sta_info_move_state_checked(struct sta_info *sta,
-                               enum ieee80211_sta_state new_state);
+int sta_info_move_state(struct sta_info *sta,
+                       enum ieee80211_sta_state new_state);
 
-static inline void sta_info_move_state(struct sta_info *sta,
-                                      enum ieee80211_sta_state new_state)
+static inline void sta_info_pre_move_state(struct sta_info *sta,
+                                          enum ieee80211_sta_state new_state)
 {
-       int ret = sta_info_move_state_checked(sta, new_state);
+       int ret;
+
+       WARN_ON_ONCE(test_sta_flag(sta, WLAN_STA_INSERTED));
+
+       ret = sta_info_move_state(sta, new_state);
        WARN_ON_ONCE(ret);
 }
 
@@ -472,15 +465,9 @@ rcu_dereference_protected_tid_tx(struct sta_info *sta, int tid)
 struct sta_info *sta_info_get(struct ieee80211_sub_if_data *sdata,
                              const u8 *addr);
 
-struct sta_info *sta_info_get_rx(struct ieee80211_sub_if_data *sdata,
-                             const u8 *addr);
-
 struct sta_info *sta_info_get_bss(struct ieee80211_sub_if_data *sdata,
                                  const u8 *addr);
 
-struct sta_info *sta_info_get_bss_rx(struct ieee80211_sub_if_data *sdata,
-                                 const u8 *addr);
-
 static inline
 void for_each_sta_info_type_check(struct ieee80211_local *local,
                                  const u8 *addr,
@@ -489,23 +476,7 @@ void for_each_sta_info_type_check(struct ieee80211_local *local,
 {
 }
 
-#define for_each_sta_info(local, _addr, _sta, nxt)                     \
-       for (   /* initialise loop */                                   \
-               _sta = rcu_dereference(local->sta_hash[STA_HASH(_addr)]),\
-               nxt = _sta ? rcu_dereference(_sta->hnext) : NULL;       \
-               /* typecheck */                                         \
-               for_each_sta_info_type_check(local, (_addr), _sta, nxt),\
-               /* continue condition */                                \
-               _sta;                                                   \
-               /* advance loop */                                      \
-               _sta = nxt,                                             \
-               nxt = _sta ? rcu_dereference(_sta->hnext) : NULL        \
-            )                                                          \
-       /* run code only if address matches and it's not a dummy sta */ \
-       if (memcmp(_sta->sta.addr, (_addr), ETH_ALEN) == 0 &&           \
-               !_sta->dummy)
-
-#define for_each_sta_info_rx(local, _addr, _sta, nxt)                  \
+#define for_each_sta_info(local, _addr, _sta, nxt)                     \
        for (   /* initialise loop */                                   \
                _sta = rcu_dereference(local->sta_hash[STA_HASH(_addr)]),\
                nxt = _sta ? rcu_dereference(_sta->hnext) : NULL;       \
@@ -544,8 +515,8 @@ void sta_info_free(struct ieee80211_local *local, struct sta_info *sta);
  */
 int sta_info_insert(struct sta_info *sta);
 int sta_info_insert_rcu(struct sta_info *sta) __acquires(RCU);
-int sta_info_reinsert(struct sta_info *sta);
 
+int __must_check __sta_info_destroy(struct sta_info *sta);
 int sta_info_destroy_addr(struct ieee80211_sub_if_data *sdata,
                          const u8 *addr);
 int sta_info_destroy_addr_bss(struct ieee80211_sub_if_data *sdata,
index 30c265c..c928e4a 100644 (file)
@@ -11,6 +11,7 @@
 
 #include <linux/export.h>
 #include <net/mac80211.h>
+#include <asm/unaligned.h>
 #include "ieee80211_i.h"
 #include "rate.h"
 #include "mesh.h"
@@ -350,7 +351,6 @@ void ieee80211_tx_status(struct ieee80211_hw *hw, struct sk_buff *skb)
        bool send_to_cooked;
        bool acked;
        struct ieee80211_bar *bar;
-       u16 tid;
        int rtap_len;
 
        for (i = 0; i < IEEE80211_TX_MAX_RATES; i++) {
@@ -412,7 +412,7 @@ void ieee80211_tx_status(struct ieee80211_hw *hw, struct sk_buff *skb)
                }
 
                if (!acked && ieee80211_is_back_req(fc)) {
-                       u16 control;
+                       u16 tid, control;
 
                        /*
                         * BAR failed, store the last SSN and retry sending
@@ -516,7 +516,8 @@ void ieee80211_tx_status(struct ieee80211_hw *hw, struct sk_buff *skb)
 
                if (ieee80211_is_nullfunc(hdr->frame_control) ||
                    ieee80211_is_qos_nullfunc(hdr->frame_control)) {
-                       bool acked = info->flags & IEEE80211_TX_STAT_ACK;
+                       acked = info->flags & IEEE80211_TX_STAT_ACK;
+
                        cfg80211_probe_status(skb->dev, hdr->addr1,
                                              cookie, acked, GFP_ATOMIC);
                } else {
index e05667c..570737d 100644 (file)
@@ -448,18 +448,23 @@ ieee80211_tx_h_unicast_ps_buf(struct ieee80211_tx_data *tx)
        struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)tx->skb->data;
        struct ieee80211_local *local = tx->local;
 
-       if (unlikely(!sta ||
-                    ieee80211_is_probe_resp(hdr->frame_control) ||
-                    ieee80211_is_auth(hdr->frame_control) ||
-                    ieee80211_is_assoc_resp(hdr->frame_control) ||
-                    ieee80211_is_reassoc_resp(hdr->frame_control)))
+       if (unlikely(!sta))
                return TX_CONTINUE;
 
        if (unlikely((test_sta_flag(sta, WLAN_STA_PS_STA) ||
                      test_sta_flag(sta, WLAN_STA_PS_DRIVER)) &&
-                    !(info->flags & IEEE80211_TX_CTL_POLL_RESPONSE))) {
+                    !(info->flags & IEEE80211_TX_CTL_NO_PS_BUFFER))) {
                int ac = skb_get_queue_mapping(tx->skb);
 
+               /* only deauth, disassoc and action are bufferable MMPDUs */
+               if (ieee80211_is_mgmt(hdr->frame_control) &&
+                   !ieee80211_is_deauth(hdr->frame_control) &&
+                   !ieee80211_is_disassoc(hdr->frame_control) &&
+                   !ieee80211_is_action(hdr->frame_control)) {
+                       info->flags |= IEEE80211_TX_CTL_NO_PS_BUFFER;
+                       return TX_CONTINUE;
+               }
+
 #ifdef CONFIG_MAC80211_VERBOSE_PS_DEBUG
                printk(KERN_DEBUG "STA %pM aid %d: PS buffer for AC %d\n",
                       sta->sta.addr, sta->sta.aid, ac);
@@ -625,7 +630,7 @@ ieee80211_tx_h_rate_ctrl(struct ieee80211_tx_data *tx)
                         tx->local->hw.wiphy->frag_threshold);
 
        /* set up the tx rate control struct we give the RC algo */
-       txrc.hw = local_to_hw(tx->local);
+       txrc.hw = &tx->local->hw;
        txrc.sband = sband;
        txrc.bss_conf = &tx->sdata->vif.bss_conf;
        txrc.skb = tx->skb;
@@ -635,6 +640,9 @@ ieee80211_tx_h_rate_ctrl(struct ieee80211_tx_data *tx)
                txrc.max_rate_idx = -1;
        else
                txrc.max_rate_idx = fls(txrc.rate_idx_mask) - 1;
+       memcpy(txrc.rate_idx_mcs_mask,
+              tx->sdata->rc_rateidx_mcs_mask[tx->channel->band],
+              sizeof(txrc.rate_idx_mcs_mask));
        txrc.bss = (tx->sdata->vif.type == NL80211_IFTYPE_AP ||
                    tx->sdata->vif.type == NL80211_IFTYPE_MESH_POINT ||
                    tx->sdata->vif.type == NL80211_IFTYPE_ADHOC);
@@ -2203,7 +2211,8 @@ void ieee80211_tx_pending(unsigned long data)
 
 /* functions for drivers to get certain frames */
 
-static void ieee80211_beacon_add_tim(struct ieee80211_if_ap *bss,
+static void ieee80211_beacon_add_tim(struct ieee80211_sub_if_data *sdata,
+                                    struct ieee80211_if_ap *bss,
                                     struct sk_buff *skb,
                                     struct beacon_data *beacon)
 {
@@ -2220,7 +2229,7 @@ static void ieee80211_beacon_add_tim(struct ieee80211_if_ap *bss,
                                          IEEE80211_MAX_AID+1);
 
        if (bss->dtim_count == 0)
-               bss->dtim_count = beacon->dtim_period - 1;
+               bss->dtim_count = sdata->vif.bss_conf.dtim_period - 1;
        else
                bss->dtim_count--;
 
@@ -2228,7 +2237,7 @@ static void ieee80211_beacon_add_tim(struct ieee80211_if_ap *bss,
        *pos++ = WLAN_EID_TIM;
        *pos++ = 4;
        *pos++ = bss->dtim_count;
-       *pos++ = beacon->dtim_period;
+       *pos++ = sdata->vif.bss_conf.dtim_period;
 
        if (bss->dtim_count == 0 && !skb_queue_empty(&bss->ps_bc_buf))
                aid0 = 1;
@@ -2321,12 +2330,14 @@ struct sk_buff *ieee80211_beacon_get_tim(struct ieee80211_hw *hw,
                         * of the tim bitmap in mac80211 and the driver.
                         */
                        if (local->tim_in_locked_section) {
-                               ieee80211_beacon_add_tim(ap, skb, beacon);
+                               ieee80211_beacon_add_tim(sdata, ap, skb,
+                                                        beacon);
                        } else {
                                unsigned long flags;
 
                                spin_lock_irqsave(&local->tim_lock, flags);
-                               ieee80211_beacon_add_tim(ap, skb, beacon);
+                               ieee80211_beacon_add_tim(sdata, ap, skb,
+                                                        beacon);
                                spin_unlock_irqrestore(&local->tim_lock, flags);
                        }
 
@@ -2431,6 +2442,8 @@ struct sk_buff *ieee80211_beacon_get_tim(struct ieee80211_hw *hw,
                txrc.max_rate_idx = -1;
        else
                txrc.max_rate_idx = fls(txrc.rate_idx_mask) - 1;
+       memcpy(txrc.rate_idx_mcs_mask, sdata->rc_rateidx_mcs_mask[band],
+              sizeof(txrc.rate_idx_mcs_mask));
        txrc.bss = true;
        rate_control_get_rate(sdata, NULL, &txrc);
 
index 9919892..f6e4cef 100644 (file)
@@ -753,7 +753,7 @@ void ieee80211_set_wmm_default(struct ieee80211_sub_if_data *sdata)
        use_11b = (local->hw.conf.channel->band == IEEE80211_BAND_2GHZ) &&
                 !(sdata->flags & IEEE80211_SDATA_OPERATING_GMODE);
 
-       for (queue = 0; queue < local_to_hw(local)->queues; queue++) {
+       for (queue = 0; queue < local->hw.queues; queue++) {
                /* Set defaults according to 802.11-2007 Table 7-37 */
                aCWmax = 1023;
                if (use_11b)
@@ -862,8 +862,8 @@ u32 ieee80211_mandatory_rates(struct ieee80211_local *local,
 
 void ieee80211_send_auth(struct ieee80211_sub_if_data *sdata,
                         u16 transaction, u16 auth_alg,
-                        u8 *extra, size_t extra_len, const u8 *bssid,
-                        const u8 *key, u8 key_len, u8 key_idx)
+                        u8 *extra, size_t extra_len, const u8 *da,
+                        const u8 *bssid, const u8 *key, u8 key_len, u8 key_idx)
 {
        struct ieee80211_local *local = sdata->local;
        struct sk_buff *skb;
@@ -881,7 +881,7 @@ void ieee80211_send_auth(struct ieee80211_sub_if_data *sdata,
        memset(mgmt, 0, 24 + 6);
        mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT |
                                          IEEE80211_STYPE_AUTH);
-       memcpy(mgmt->da, bssid, ETH_ALEN);
+       memcpy(mgmt->da, da, ETH_ALEN);
        memcpy(mgmt->sa, sdata->vif.addr, ETH_ALEN);
        memcpy(mgmt->bssid, bssid, ETH_ALEN);
        mgmt->u.auth.auth_alg = cpu_to_le16(auth_alg);
@@ -1185,13 +1185,12 @@ int ieee80211_reconfig(struct ieee80211_local *local)
        mutex_lock(&local->sta_mtx);
        list_for_each_entry(sta, &local->sta_list, list) {
                if (sta->uploaded) {
-                       sdata = sta->sdata;
-                       if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN)
-                               sdata = container_of(sdata->bss,
-                                            struct ieee80211_sub_if_data,
-                                            u.ap);
+                       enum ieee80211_sta_state state;
 
-                       WARN_ON(drv_sta_add(local, sdata, &sta->sta));
+                       for (state = IEEE80211_STA_NOTEXIST;
+                            state < sta->sta_state - 1; state++)
+                               WARN_ON(drv_sta_state(local, sta->sdata, sta,
+                                                     state, state + 1));
                }
        }
        mutex_unlock(&local->sta_mtx);
@@ -1272,6 +1271,21 @@ int ieee80211_reconfig(struct ieee80211_local *local)
        ieee80211_recalc_ps(local, -1);
 
        /*
+        * The sta might be in psm against the ap (e.g. because
+        * this was the state before a hw restart), so we
+        * explicitly send a null packet in order to make sure
+        * it'll sync against the ap (and get out of psm).
+        */
+       if (!(local->hw.conf.flags & IEEE80211_CONF_PS)) {
+               list_for_each_entry(sdata, &local->interfaces, list) {
+                       if (sdata->vif.type != NL80211_IFTYPE_STATION)
+                               continue;
+
+                       ieee80211_send_nullfunc(local, sdata, 0);
+               }
+       }
+
+       /*
         * Clear the WLAN_STA_BLOCK_BA flag so new aggregation
         * sessions can be established after a resume.
         *
index c6dd01a..c6e230e 100644 (file)
 #include "rate.h"
 #include "driver-ops.h"
 
-#define IEEE80211_AUTH_TIMEOUT (HZ / 5)
-#define IEEE80211_AUTH_MAX_TRIES 3
-#define IEEE80211_ASSOC_TIMEOUT (HZ / 5)
-#define IEEE80211_ASSOC_MAX_TRIES 3
-
 enum work_action {
-       WORK_ACT_MISMATCH,
        WORK_ACT_NONE,
        WORK_ACT_TIMEOUT,
-       WORK_ACT_DONE,
 };
 
 
@@ -71,464 +64,6 @@ void free_work(struct ieee80211_work *wk)
        kfree_rcu(wk, rcu_head);
 }
 
-static int ieee80211_compatible_rates(const u8 *supp_rates, int supp_rates_len,
-                                     struct ieee80211_supported_band *sband,
-                                     u32 *rates)
-{
-       int i, j, count;
-       *rates = 0;
-       count = 0;
-       for (i = 0; i < supp_rates_len; i++) {
-               int rate = (supp_rates[i] & 0x7F) * 5;
-
-               for (j = 0; j < sband->n_bitrates; j++)
-                       if (sband->bitrates[j].bitrate == rate) {
-                               *rates |= BIT(j);
-                               count++;
-                               break;
-                       }
-       }
-
-       return count;
-}
-
-/* frame sending functions */
-
-static void ieee80211_add_ht_ie(struct ieee80211_sub_if_data *sdata,
-                               struct sk_buff *skb, const u8 *ht_info_ie,
-                               struct ieee80211_supported_band *sband,
-                               struct ieee80211_channel *channel,
-                               enum ieee80211_smps_mode smps)
-{
-       struct ieee80211_ht_info *ht_info;
-       u8 *pos;
-       u32 flags = channel->flags;
-       u16 cap;
-       struct ieee80211_sta_ht_cap ht_cap;
-
-       BUILD_BUG_ON(sizeof(ht_cap) != sizeof(sband->ht_cap));
-
-       if (!sband->ht_cap.ht_supported)
-               return;
-
-       if (!ht_info_ie)
-               return;
-
-       if (ht_info_ie[1] < sizeof(struct ieee80211_ht_info))
-               return;
-
-       memcpy(&ht_cap, &sband->ht_cap, sizeof(ht_cap));
-       ieee80211_apply_htcap_overrides(sdata, &ht_cap);
-
-       ht_info = (struct ieee80211_ht_info *)(ht_info_ie + 2);
-
-       /* determine capability flags */
-       cap = ht_cap.cap;
-
-       switch (ht_info->ht_param & IEEE80211_HT_PARAM_CHA_SEC_OFFSET) {
-       case IEEE80211_HT_PARAM_CHA_SEC_ABOVE:
-               if (flags & IEEE80211_CHAN_NO_HT40PLUS) {
-                       cap &= ~IEEE80211_HT_CAP_SUP_WIDTH_20_40;
-                       cap &= ~IEEE80211_HT_CAP_SGI_40;
-               }
-               break;
-       case IEEE80211_HT_PARAM_CHA_SEC_BELOW:
-               if (flags & IEEE80211_CHAN_NO_HT40MINUS) {
-                       cap &= ~IEEE80211_HT_CAP_SUP_WIDTH_20_40;
-                       cap &= ~IEEE80211_HT_CAP_SGI_40;
-               }
-               break;
-       }
-
-       /* set SM PS mode properly */
-       cap &= ~IEEE80211_HT_CAP_SM_PS;
-       switch (smps) {
-       case IEEE80211_SMPS_AUTOMATIC:
-       case IEEE80211_SMPS_NUM_MODES:
-               WARN_ON(1);
-       case IEEE80211_SMPS_OFF:
-               cap |= WLAN_HT_CAP_SM_PS_DISABLED <<
-                       IEEE80211_HT_CAP_SM_PS_SHIFT;
-               break;
-       case IEEE80211_SMPS_STATIC:
-               cap |= WLAN_HT_CAP_SM_PS_STATIC <<
-                       IEEE80211_HT_CAP_SM_PS_SHIFT;
-               break;
-       case IEEE80211_SMPS_DYNAMIC:
-               cap |= WLAN_HT_CAP_SM_PS_DYNAMIC <<
-                       IEEE80211_HT_CAP_SM_PS_SHIFT;
-               break;
-       }
-
-       /* reserve and fill IE */
-       pos = skb_put(skb, sizeof(struct ieee80211_ht_cap) + 2);
-       ieee80211_ie_build_ht_cap(pos, &ht_cap, cap);
-}
-
-static void ieee80211_send_assoc(struct ieee80211_sub_if_data *sdata,
-                                struct ieee80211_work *wk)
-{
-       struct ieee80211_local *local = sdata->local;
-       struct sk_buff *skb;
-       struct ieee80211_mgmt *mgmt;
-       u8 *pos, qos_info;
-       size_t offset = 0, noffset;
-       int i, count, rates_len, supp_rates_len;
-       u16 capab;
-       struct ieee80211_supported_band *sband;
-       u32 rates = 0;
-
-       sband = local->hw.wiphy->bands[wk->chan->band];
-
-       if (wk->assoc.supp_rates_len) {
-               /*
-                * Get all rates supported by the device and the AP as
-                * some APs don't like getting a superset of their rates
-                * in the association request (e.g. D-Link DAP 1353 in
-                * b-only mode)...
-                */
-               rates_len = ieee80211_compatible_rates(wk->assoc.supp_rates,
-                                                      wk->assoc.supp_rates_len,
-                                                      sband, &rates);
-       } else {
-               /*
-                * In case AP not provide any supported rates information
-                * before association, we send information element(s) with
-                * all rates that we support.
-                */
-               rates = ~0;
-               rates_len = sband->n_bitrates;
-       }
-
-       skb = alloc_skb(local->hw.extra_tx_headroom +
-                       sizeof(*mgmt) + /* bit too much but doesn't matter */
-                       2 + wk->assoc.ssid_len + /* SSID */
-                       4 + rates_len + /* (extended) rates */
-                       4 + /* power capability */
-                       2 + 2 * sband->n_channels + /* supported channels */
-                       2 + sizeof(struct ieee80211_ht_cap) + /* HT */
-                       wk->ie_len + /* extra IEs */
-                       9, /* WMM */
-                       GFP_KERNEL);
-       if (!skb)
-               return;
-
-       skb_reserve(skb, local->hw.extra_tx_headroom);
-
-       capab = WLAN_CAPABILITY_ESS;
-
-       if (sband->band == IEEE80211_BAND_2GHZ) {
-               if (!(local->hw.flags & IEEE80211_HW_2GHZ_SHORT_SLOT_INCAPABLE))
-                       capab |= WLAN_CAPABILITY_SHORT_SLOT_TIME;
-               if (!(local->hw.flags & IEEE80211_HW_2GHZ_SHORT_PREAMBLE_INCAPABLE))
-                       capab |= WLAN_CAPABILITY_SHORT_PREAMBLE;
-       }
-
-       if (wk->assoc.capability & WLAN_CAPABILITY_PRIVACY)
-               capab |= WLAN_CAPABILITY_PRIVACY;
-
-       if ((wk->assoc.capability & WLAN_CAPABILITY_SPECTRUM_MGMT) &&
-           (local->hw.flags & IEEE80211_HW_SPECTRUM_MGMT))
-               capab |= WLAN_CAPABILITY_SPECTRUM_MGMT;
-
-       mgmt = (struct ieee80211_mgmt *) skb_put(skb, 24);
-       memset(mgmt, 0, 24);
-       memcpy(mgmt->da, wk->filter_ta, ETH_ALEN);
-       memcpy(mgmt->sa, sdata->vif.addr, ETH_ALEN);
-       memcpy(mgmt->bssid, wk->filter_ta, ETH_ALEN);
-
-       if (!is_zero_ether_addr(wk->assoc.prev_bssid)) {
-               skb_put(skb, 10);
-               mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT |
-                                                 IEEE80211_STYPE_REASSOC_REQ);
-               mgmt->u.reassoc_req.capab_info = cpu_to_le16(capab);
-               mgmt->u.reassoc_req.listen_interval =
-                               cpu_to_le16(local->hw.conf.listen_interval);
-               memcpy(mgmt->u.reassoc_req.current_ap, wk->assoc.prev_bssid,
-                      ETH_ALEN);
-       } else {
-               skb_put(skb, 4);
-               mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT |
-                                                 IEEE80211_STYPE_ASSOC_REQ);
-               mgmt->u.assoc_req.capab_info = cpu_to_le16(capab);
-               mgmt->u.assoc_req.listen_interval =
-                               cpu_to_le16(local->hw.conf.listen_interval);
-       }
-
-       /* SSID */
-       pos = skb_put(skb, 2 + wk->assoc.ssid_len);
-       *pos++ = WLAN_EID_SSID;
-       *pos++ = wk->assoc.ssid_len;
-       memcpy(pos, wk->assoc.ssid, wk->assoc.ssid_len);
-
-       /* add all rates which were marked to be used above */
-       supp_rates_len = rates_len;
-       if (supp_rates_len > 8)
-               supp_rates_len = 8;
-
-       pos = skb_put(skb, supp_rates_len + 2);
-       *pos++ = WLAN_EID_SUPP_RATES;
-       *pos++ = supp_rates_len;
-
-       count = 0;
-       for (i = 0; i < sband->n_bitrates; i++) {
-               if (BIT(i) & rates) {
-                       int rate = sband->bitrates[i].bitrate;
-                       *pos++ = (u8) (rate / 5);
-                       if (++count == 8)
-                               break;
-               }
-       }
-
-       if (rates_len > count) {
-               pos = skb_put(skb, rates_len - count + 2);
-               *pos++ = WLAN_EID_EXT_SUPP_RATES;
-               *pos++ = rates_len - count;
-
-               for (i++; i < sband->n_bitrates; i++) {
-                       if (BIT(i) & rates) {
-                               int rate = sband->bitrates[i].bitrate;
-                               *pos++ = (u8) (rate / 5);
-                       }
-               }
-       }
-
-       if (capab & WLAN_CAPABILITY_SPECTRUM_MGMT) {
-               /* 1. power capabilities */
-               pos = skb_put(skb, 4);
-               *pos++ = WLAN_EID_PWR_CAPABILITY;
-               *pos++ = 2;
-               *pos++ = 0; /* min tx power */
-               *pos++ = wk->chan->max_power; /* max tx power */
-
-               /* 2. supported channels */
-               /* TODO: get this in reg domain format */
-               pos = skb_put(skb, 2 * sband->n_channels + 2);
-               *pos++ = WLAN_EID_SUPPORTED_CHANNELS;
-               *pos++ = 2 * sband->n_channels;
-               for (i = 0; i < sband->n_channels; i++) {
-                       *pos++ = ieee80211_frequency_to_channel(
-                                       sband->channels[i].center_freq);
-                       *pos++ = 1; /* one channel in the subband*/
-               }
-       }
-
-       /* if present, add any custom IEs that go before HT */
-       if (wk->ie_len && wk->ie) {
-               static const u8 before_ht[] = {
-                       WLAN_EID_SSID,
-                       WLAN_EID_SUPP_RATES,
-                       WLAN_EID_EXT_SUPP_RATES,
-                       WLAN_EID_PWR_CAPABILITY,
-                       WLAN_EID_SUPPORTED_CHANNELS,
-                       WLAN_EID_RSN,
-                       WLAN_EID_QOS_CAPA,
-                       WLAN_EID_RRM_ENABLED_CAPABILITIES,
-                       WLAN_EID_MOBILITY_DOMAIN,
-                       WLAN_EID_SUPPORTED_REGULATORY_CLASSES,
-               };
-               noffset = ieee80211_ie_split(wk->ie, wk->ie_len,
-                                            before_ht, ARRAY_SIZE(before_ht),
-                                            offset);
-               pos = skb_put(skb, noffset - offset);
-               memcpy(pos, wk->ie + offset, noffset - offset);
-               offset = noffset;
-       }
-
-       if (wk->assoc.use_11n && wk->assoc.wmm_used &&
-           local->hw.queues >= 4)
-               ieee80211_add_ht_ie(sdata, skb, wk->assoc.ht_information_ie,
-                                   sband, wk->chan, wk->assoc.smps);
-
-       /* if present, add any custom non-vendor IEs that go after HT */
-       if (wk->ie_len && wk->ie) {
-               noffset = ieee80211_ie_split_vendor(wk->ie, wk->ie_len,
-                                                   offset);
-               pos = skb_put(skb, noffset - offset);
-               memcpy(pos, wk->ie + offset, noffset - offset);
-               offset = noffset;
-       }
-
-       if (wk->assoc.wmm_used && local->hw.queues >= 4) {
-               if (wk->assoc.uapsd_used) {
-                       qos_info = local->uapsd_queues;
-                       qos_info |= (local->uapsd_max_sp_len <<
-                                    IEEE80211_WMM_IE_STA_QOSINFO_SP_SHIFT);
-               } else {
-                       qos_info = 0;
-               }
-
-               pos = skb_put(skb, 9);
-               *pos++ = WLAN_EID_VENDOR_SPECIFIC;
-               *pos++ = 7; /* len */
-               *pos++ = 0x00; /* Microsoft OUI 00:50:F2 */
-               *pos++ = 0x50;
-               *pos++ = 0xf2;
-               *pos++ = 2; /* WME */
-               *pos++ = 0; /* WME info */
-               *pos++ = 1; /* WME ver */
-               *pos++ = qos_info;
-       }
-
-       /* add any remaining custom (i.e. vendor specific here) IEs */
-       if (wk->ie_len && wk->ie) {
-               noffset = wk->ie_len;
-               pos = skb_put(skb, noffset - offset);
-               memcpy(pos, wk->ie + offset, noffset - offset);
-       }
-
-       IEEE80211_SKB_CB(skb)->flags |= IEEE80211_TX_INTFL_DONT_ENCRYPT;
-       ieee80211_tx_skb(sdata, skb);
-}
-
-static void ieee80211_remove_auth_bss(struct ieee80211_local *local,
-                                     struct ieee80211_work *wk)
-{
-       struct cfg80211_bss *cbss;
-       u16 capa_val = WLAN_CAPABILITY_ESS;
-
-       if (wk->probe_auth.privacy)
-               capa_val |= WLAN_CAPABILITY_PRIVACY;
-
-       cbss = cfg80211_get_bss(local->hw.wiphy, wk->chan, wk->filter_ta,
-                               wk->probe_auth.ssid, wk->probe_auth.ssid_len,
-                               WLAN_CAPABILITY_ESS | WLAN_CAPABILITY_PRIVACY,
-                               capa_val);
-       if (!cbss)
-               return;
-
-       cfg80211_unlink_bss(local->hw.wiphy, cbss);
-       cfg80211_put_bss(cbss);
-}
-
-static enum work_action __must_check
-ieee80211_direct_probe(struct ieee80211_work *wk)
-{
-       struct ieee80211_sub_if_data *sdata = wk->sdata;
-       struct ieee80211_local *local = sdata->local;
-
-       if (!wk->probe_auth.synced) {
-               int ret = drv_tx_sync(local, sdata, wk->filter_ta,
-                                     IEEE80211_TX_SYNC_AUTH);
-               if (ret)
-                       return WORK_ACT_TIMEOUT;
-       }
-       wk->probe_auth.synced = true;
-
-       wk->probe_auth.tries++;
-       if (wk->probe_auth.tries > IEEE80211_AUTH_MAX_TRIES) {
-               printk(KERN_DEBUG "%s: direct probe to %pM timed out\n",
-                      sdata->name, wk->filter_ta);
-
-               /*
-                * Most likely AP is not in the range so remove the
-                * bss struct for that AP.
-                */
-               ieee80211_remove_auth_bss(local, wk);
-
-               return WORK_ACT_TIMEOUT;
-       }
-
-       printk(KERN_DEBUG "%s: direct probe to %pM (try %d/%i)\n",
-              sdata->name, wk->filter_ta, wk->probe_auth.tries,
-              IEEE80211_AUTH_MAX_TRIES);
-
-       /*
-        * Direct probe is sent to broadcast address as some APs
-        * will not answer to direct packet in unassociated state.
-        */
-       ieee80211_send_probe_req(sdata, NULL, wk->probe_auth.ssid,
-                                wk->probe_auth.ssid_len, NULL, 0,
-                                (u32) -1, true, false);
-
-       wk->timeout = jiffies + IEEE80211_AUTH_TIMEOUT;
-       run_again(local, wk->timeout);
-
-       return WORK_ACT_NONE;
-}
-
-
-static enum work_action __must_check
-ieee80211_authenticate(struct ieee80211_work *wk)
-{
-       struct ieee80211_sub_if_data *sdata = wk->sdata;
-       struct ieee80211_local *local = sdata->local;
-
-       if (!wk->probe_auth.synced) {
-               int ret = drv_tx_sync(local, sdata, wk->filter_ta,
-                                     IEEE80211_TX_SYNC_AUTH);
-               if (ret)
-                       return WORK_ACT_TIMEOUT;
-       }
-       wk->probe_auth.synced = true;
-
-       wk->probe_auth.tries++;
-       if (wk->probe_auth.tries > IEEE80211_AUTH_MAX_TRIES) {
-               printk(KERN_DEBUG "%s: authentication with %pM"
-                      " timed out\n", sdata->name, wk->filter_ta);
-
-               /*
-                * Most likely AP is not in the range so remove the
-                * bss struct for that AP.
-                */
-               ieee80211_remove_auth_bss(local, wk);
-
-               return WORK_ACT_TIMEOUT;
-       }
-
-       printk(KERN_DEBUG "%s: authenticate with %pM (try %d)\n",
-              sdata->name, wk->filter_ta, wk->probe_auth.tries);
-
-       ieee80211_send_auth(sdata, 1, wk->probe_auth.algorithm, wk->ie,
-                           wk->ie_len, wk->filter_ta, NULL, 0, 0);
-       wk->probe_auth.transaction = 2;
-
-       wk->timeout = jiffies + IEEE80211_AUTH_TIMEOUT;
-       run_again(local, wk->timeout);
-
-       return WORK_ACT_NONE;
-}
-
-static enum work_action __must_check
-ieee80211_associate(struct ieee80211_work *wk)
-{
-       struct ieee80211_sub_if_data *sdata = wk->sdata;
-       struct ieee80211_local *local = sdata->local;
-
-       if (!wk->assoc.synced) {
-               int ret = drv_tx_sync(local, sdata, wk->filter_ta,
-                                     IEEE80211_TX_SYNC_ASSOC);
-               if (ret)
-                       return WORK_ACT_TIMEOUT;
-       }
-       wk->assoc.synced = true;
-
-       wk->assoc.tries++;
-       if (wk->assoc.tries > IEEE80211_ASSOC_MAX_TRIES) {
-               printk(KERN_DEBUG "%s: association with %pM"
-                      " timed out\n",
-                      sdata->name, wk->filter_ta);
-
-               /*
-                * Most likely AP is not in the range so remove the
-                * bss struct for that AP.
-                */
-               if (wk->assoc.bss)
-                       cfg80211_unlink_bss(local->hw.wiphy, wk->assoc.bss);
-
-               return WORK_ACT_TIMEOUT;
-       }
-
-       printk(KERN_DEBUG "%s: associate with %pM (try %d)\n",
-              sdata->name, wk->filter_ta, wk->assoc.tries);
-       ieee80211_send_assoc(sdata, wk);
-
-       wk->timeout = jiffies + IEEE80211_ASSOC_TIMEOUT;
-       run_again(local, wk->timeout);
-
-       return WORK_ACT_NONE;
-}
-
 static enum work_action __must_check
 ieee80211_remain_on_channel_timeout(struct ieee80211_work *wk)
 {
@@ -568,300 +103,6 @@ ieee80211_offchannel_tx(struct ieee80211_work *wk)
        return WORK_ACT_TIMEOUT;
 }
 
-static enum work_action __must_check
-ieee80211_assoc_beacon_wait(struct ieee80211_work *wk)
-{
-       if (wk->started)
-               return WORK_ACT_TIMEOUT;
-
-       /*
-        * Wait up to one beacon interval ...
-        * should this be more if we miss one?
-        */
-       printk(KERN_DEBUG "%s: waiting for beacon from %pM\n",
-              wk->sdata->name, wk->filter_ta);
-       wk->timeout = TU_TO_EXP_TIME(wk->assoc.bss->beacon_interval);
-       return WORK_ACT_NONE;
-}
-
-static void ieee80211_auth_challenge(struct ieee80211_work *wk,
-                                    struct ieee80211_mgmt *mgmt,
-                                    size_t len)
-{
-       struct ieee80211_sub_if_data *sdata = wk->sdata;
-       u8 *pos;
-       struct ieee802_11_elems elems;
-
-       pos = mgmt->u.auth.variable;
-       ieee802_11_parse_elems(pos, len - (pos - (u8 *) mgmt), &elems);
-       if (!elems.challenge)
-               return;
-       ieee80211_send_auth(sdata, 3, wk->probe_auth.algorithm,
-                           elems.challenge - 2, elems.challenge_len + 2,
-                           wk->filter_ta, wk->probe_auth.key,
-                           wk->probe_auth.key_len, wk->probe_auth.key_idx);
-       wk->probe_auth.transaction = 4;
-}
-
-static enum work_action __must_check
-ieee80211_rx_mgmt_auth(struct ieee80211_work *wk,
-                      struct ieee80211_mgmt *mgmt, size_t len)
-{
-       u16 auth_alg, auth_transaction, status_code;
-
-       if (wk->type != IEEE80211_WORK_AUTH)
-               return WORK_ACT_MISMATCH;
-
-       if (len < 24 + 6)
-               return WORK_ACT_NONE;
-
-       auth_alg = le16_to_cpu(mgmt->u.auth.auth_alg);
-       auth_transaction = le16_to_cpu(mgmt->u.auth.auth_transaction);
-       status_code = le16_to_cpu(mgmt->u.auth.status_code);
-
-       if (auth_alg != wk->probe_auth.algorithm ||
-           auth_transaction != wk->probe_auth.transaction)
-               return WORK_ACT_NONE;
-
-       if (status_code != WLAN_STATUS_SUCCESS) {
-               printk(KERN_DEBUG "%s: %pM denied authentication (status %d)\n",
-                      wk->sdata->name, mgmt->sa, status_code);
-               return WORK_ACT_DONE;
-       }
-
-       switch (wk->probe_auth.algorithm) {
-       case WLAN_AUTH_OPEN:
-       case WLAN_AUTH_LEAP:
-       case WLAN_AUTH_FT:
-               break;
-       case WLAN_AUTH_SHARED_KEY:
-               if (wk->probe_auth.transaction != 4) {
-                       ieee80211_auth_challenge(wk, mgmt, len);
-                       /* need another frame */
-                       return WORK_ACT_NONE;
-               }
-               break;
-       default:
-               WARN_ON(1);
-               return WORK_ACT_NONE;
-       }
-
-       printk(KERN_DEBUG "%s: authenticated\n", wk->sdata->name);
-       return WORK_ACT_DONE;
-}
-
-static enum work_action __must_check
-ieee80211_rx_mgmt_assoc_resp(struct ieee80211_work *wk,
-                            struct ieee80211_mgmt *mgmt, size_t len,
-                            bool reassoc)
-{
-       struct ieee80211_sub_if_data *sdata = wk->sdata;
-       struct ieee80211_local *local = sdata->local;
-       u16 capab_info, status_code, aid;
-       struct ieee802_11_elems elems;
-       u8 *pos;
-
-       if (wk->type != IEEE80211_WORK_ASSOC)
-               return WORK_ACT_MISMATCH;
-
-       /*
-        * AssocResp and ReassocResp have identical structure, so process both
-        * of them in this function.
-        */
-
-       if (len < 24 + 6)
-               return WORK_ACT_NONE;
-
-       capab_info = le16_to_cpu(mgmt->u.assoc_resp.capab_info);
-       status_code = le16_to_cpu(mgmt->u.assoc_resp.status_code);
-       aid = le16_to_cpu(mgmt->u.assoc_resp.aid);
-
-       printk(KERN_DEBUG "%s: RX %sssocResp from %pM (capab=0x%x "
-              "status=%d aid=%d)\n",
-              sdata->name, reassoc ? "Rea" : "A", mgmt->sa,
-              capab_info, status_code, (u16)(aid & ~(BIT(15) | BIT(14))));
-
-       pos = mgmt->u.assoc_resp.variable;
-       ieee802_11_parse_elems(pos, len - (pos - (u8 *) mgmt), &elems);
-
-       if (status_code == WLAN_STATUS_ASSOC_REJECTED_TEMPORARILY &&
-           elems.timeout_int && elems.timeout_int_len == 5 &&
-           elems.timeout_int[0] == WLAN_TIMEOUT_ASSOC_COMEBACK) {
-               u32 tu, ms;
-               tu = get_unaligned_le32(elems.timeout_int + 1);
-               ms = tu * 1024 / 1000;
-               printk(KERN_DEBUG "%s: %pM rejected association temporarily; "
-                      "comeback duration %u TU (%u ms)\n",
-                      sdata->name, mgmt->sa, tu, ms);
-               wk->timeout = jiffies + msecs_to_jiffies(ms);
-               if (ms > IEEE80211_ASSOC_TIMEOUT)
-                       run_again(local, wk->timeout);
-               return WORK_ACT_NONE;
-       }
-
-       if (status_code != WLAN_STATUS_SUCCESS)
-               printk(KERN_DEBUG "%s: %pM denied association (code=%d)\n",
-                      sdata->name, mgmt->sa, status_code);
-       else
-               printk(KERN_DEBUG "%s: associated\n", sdata->name);
-
-       return WORK_ACT_DONE;
-}
-
-static enum work_action __must_check
-ieee80211_rx_mgmt_probe_resp(struct ieee80211_work *wk,
-                            struct ieee80211_mgmt *mgmt, size_t len,
-                            struct ieee80211_rx_status *rx_status)
-{
-       struct ieee80211_sub_if_data *sdata = wk->sdata;
-       struct ieee80211_local *local = sdata->local;
-       size_t baselen;
-
-       ASSERT_WORK_MTX(local);
-
-       if (wk->type != IEEE80211_WORK_DIRECT_PROBE)
-               return WORK_ACT_MISMATCH;
-
-       if (len < 24 + 12)
-               return WORK_ACT_NONE;
-
-       baselen = (u8 *) mgmt->u.probe_resp.variable - (u8 *) mgmt;
-       if (baselen > len)
-               return WORK_ACT_NONE;
-
-       printk(KERN_DEBUG "%s: direct probe responded\n", sdata->name);
-       return WORK_ACT_DONE;
-}
-
-static enum work_action __must_check
-ieee80211_rx_mgmt_beacon(struct ieee80211_work *wk,
-                        struct ieee80211_mgmt *mgmt, size_t len)
-{
-       struct ieee80211_sub_if_data *sdata = wk->sdata;
-       struct ieee80211_local *local = sdata->local;
-
-       ASSERT_WORK_MTX(local);
-
-       if (wk->type != IEEE80211_WORK_ASSOC_BEACON_WAIT)
-               return WORK_ACT_MISMATCH;
-
-       if (len < 24 + 12)
-               return WORK_ACT_NONE;
-
-       printk(KERN_DEBUG "%s: beacon received\n", sdata->name);
-       return WORK_ACT_DONE;
-}
-
-static void ieee80211_work_rx_queued_mgmt(struct ieee80211_local *local,
-                                         struct sk_buff *skb)
-{
-       struct ieee80211_rx_status *rx_status;
-       struct ieee80211_mgmt *mgmt;
-       struct ieee80211_work *wk;
-       enum work_action rma = WORK_ACT_NONE;
-       u16 fc;
-
-       rx_status = (struct ieee80211_rx_status *) skb->cb;
-       mgmt = (struct ieee80211_mgmt *) skb->data;
-       fc = le16_to_cpu(mgmt->frame_control);
-
-       mutex_lock(&local->mtx);
-
-       list_for_each_entry(wk, &local->work_list, list) {
-               const u8 *bssid = NULL;
-
-               switch (wk->type) {
-               case IEEE80211_WORK_DIRECT_PROBE:
-               case IEEE80211_WORK_AUTH:
-               case IEEE80211_WORK_ASSOC:
-               case IEEE80211_WORK_ASSOC_BEACON_WAIT:
-                       bssid = wk->filter_ta;
-                       break;
-               default:
-                       continue;
-               }
-
-               /*
-                * Before queuing, we already verified mgmt->sa,
-                * so this is needed just for matching.
-                */
-               if (compare_ether_addr(bssid, mgmt->bssid))
-                       continue;
-
-               switch (fc & IEEE80211_FCTL_STYPE) {
-               case IEEE80211_STYPE_BEACON:
-                       rma = ieee80211_rx_mgmt_beacon(wk, mgmt, skb->len);
-                       break;
-               case IEEE80211_STYPE_PROBE_RESP:
-                       rma = ieee80211_rx_mgmt_probe_resp(wk, mgmt, skb->len,
-                                                          rx_status);
-                       break;
-               case IEEE80211_STYPE_AUTH:
-                       rma = ieee80211_rx_mgmt_auth(wk, mgmt, skb->len);
-                       break;
-               case IEEE80211_STYPE_ASSOC_RESP:
-                       rma = ieee80211_rx_mgmt_assoc_resp(wk, mgmt,
-                                                          skb->len, false);
-                       break;
-               case IEEE80211_STYPE_REASSOC_RESP:
-                       rma = ieee80211_rx_mgmt_assoc_resp(wk, mgmt,
-                                                          skb->len, true);
-                       break;
-               default:
-                       WARN_ON(1);
-                       rma = WORK_ACT_NONE;
-               }
-
-               /*
-                * We've either received an unexpected frame, or we have
-                * multiple work items and need to match the frame to the
-                * right one.
-                */
-               if (rma == WORK_ACT_MISMATCH)
-                       continue;
-
-               /*
-                * We've processed this frame for that work, so it can't
-                * belong to another work struct.
-                * NB: this is also required for correctness for 'rma'!
-                */
-               break;
-       }
-
-       switch (rma) {
-       case WORK_ACT_MISMATCH:
-               /* ignore this unmatched frame */
-               break;
-       case WORK_ACT_NONE:
-               break;
-       case WORK_ACT_DONE:
-               list_del_rcu(&wk->list);
-               break;
-       default:
-               WARN(1, "unexpected: %d", rma);
-       }
-
-       mutex_unlock(&local->mtx);
-
-       if (rma != WORK_ACT_DONE)
-               goto out;
-
-       switch (wk->done(wk, skb)) {
-       case WORK_DONE_DESTROY:
-               free_work(wk);
-               break;
-       case WORK_DONE_REQUEUE:
-               synchronize_rcu();
-               wk->started = false; /* restart */
-               mutex_lock(&local->mtx);
-               list_add_tail(&wk->list, &local->work_list);
-               mutex_unlock(&local->mtx);
-       }
-
- out:
-       kfree_skb(skb);
-}
-
 static void ieee80211_work_timer(unsigned long data)
 {
        struct ieee80211_local *local = (void *) data;
@@ -876,7 +117,6 @@ static void ieee80211_work_work(struct work_struct *work)
 {
        struct ieee80211_local *local =
                container_of(work, struct ieee80211_local, work_work);
-       struct sk_buff *skb;
        struct ieee80211_work *wk, *tmp;
        LIST_HEAD(free_work);
        enum work_action rma;
@@ -892,10 +132,6 @@ static void ieee80211_work_work(struct work_struct *work)
        if (WARN(local->suspended, "work scheduled while going to suspend\n"))
                return;
 
-       /* first process frames to avoid timing out while a frame is pending */
-       while ((skb = skb_dequeue(&local->work_skb_queue)))
-               ieee80211_work_rx_queued_mgmt(local, skb);
-
        mutex_lock(&local->mtx);
 
        ieee80211_recalc_idle(local);
@@ -946,24 +182,12 @@ static void ieee80211_work_work(struct work_struct *work)
                case IEEE80211_WORK_ABORT:
                        rma = WORK_ACT_TIMEOUT;
                        break;
-               case IEEE80211_WORK_DIRECT_PROBE:
-                       rma = ieee80211_direct_probe(wk);
-                       break;
-               case IEEE80211_WORK_AUTH:
-                       rma = ieee80211_authenticate(wk);
-                       break;
-               case IEEE80211_WORK_ASSOC:
-                       rma = ieee80211_associate(wk);
-                       break;
                case IEEE80211_WORK_REMAIN_ON_CHANNEL:
                        rma = ieee80211_remain_on_channel_timeout(wk);
                        break;
                case IEEE80211_WORK_OFFCHANNEL_TX:
                        rma = ieee80211_offchannel_tx(wk);
                        break;
-               case IEEE80211_WORK_ASSOC_BEACON_WAIT:
-                       rma = ieee80211_assoc_beacon_wait(wk);
-                       break;
                }
 
                wk->started = started;
@@ -1051,7 +275,6 @@ void ieee80211_work_init(struct ieee80211_local *local)
        setup_timer(&local->work_timer, ieee80211_work_timer,
                    (unsigned long)local);
        INIT_WORK(&local->work_work, ieee80211_work_work);
-       skb_queue_head_init(&local->work_skb_queue);
 }
 
 void ieee80211_work_purge(struct ieee80211_sub_if_data *sdata)
@@ -1085,43 +308,6 @@ void ieee80211_work_purge(struct ieee80211_sub_if_data *sdata)
        mutex_unlock(&local->mtx);
 }
 
-ieee80211_rx_result ieee80211_work_rx_mgmt(struct ieee80211_sub_if_data *sdata,
-                                          struct sk_buff *skb)
-{
-       struct ieee80211_local *local = sdata->local;
-       struct ieee80211_mgmt *mgmt;
-       struct ieee80211_work *wk;
-       u16 fc;
-
-       if (skb->len < 24)
-               return RX_DROP_MONITOR;
-
-       mgmt = (struct ieee80211_mgmt *) skb->data;
-       fc = le16_to_cpu(mgmt->frame_control);
-
-       list_for_each_entry_rcu(wk, &local->work_list, list) {
-               if (sdata != wk->sdata)
-                       continue;
-               if (compare_ether_addr(wk->filter_ta, mgmt->sa))
-                       continue;
-               if (compare_ether_addr(wk->filter_ta, mgmt->bssid))
-                       continue;
-
-               switch (fc & IEEE80211_FCTL_STYPE) {
-               case IEEE80211_STYPE_AUTH:
-               case IEEE80211_STYPE_PROBE_RESP:
-               case IEEE80211_STYPE_ASSOC_RESP:
-               case IEEE80211_STYPE_REASSOC_RESP:
-               case IEEE80211_STYPE_BEACON:
-                       skb_queue_tail(&local->work_skb_queue, skb);
-                       ieee80211_queue_work(&local->hw, &local->work_work);
-                       return RX_QUEUED;
-               }
-       }
-
-       return RX_CONTINUE;
-}
-
 static enum work_done_result ieee80211_remain_done(struct ieee80211_work *wk,
                                                   struct sk_buff *skb)
 {
index 32dbf0f..e7f90e7 100644 (file)
@@ -1162,9 +1162,13 @@ ip_set_dump(struct sock *ctnl, struct sk_buff *skb,
        if (unlikely(protocol_failed(attr)))
                return -IPSET_ERR_PROTOCOL;
 
-       return netlink_dump_start(ctnl, skb, nlh,
-                                 ip_set_dump_start,
-                                 ip_set_dump_done, 0);
+       {
+               struct netlink_dump_control c = {
+                       .dump = ip_set_dump_start,
+                       .done = ip_set_dump_done,
+               };
+               return netlink_dump_start(ctnl, skb, nlh, &c);
+       }
 }
 
 /* Add, del and test */
index 30c9d4c..04fb409 100644 (file)
@@ -691,9 +691,18 @@ static int ctnetlink_done(struct netlink_callback *cb)
 {
        if (cb->args[1])
                nf_ct_put((struct nf_conn *)cb->args[1]);
+       if (cb->data)
+               kfree(cb->data);
        return 0;
 }
 
+struct ctnetlink_dump_filter {
+       struct {
+               u_int32_t val;
+               u_int32_t mask;
+       } mark;
+};
+
 static int
 ctnetlink_dump_table(struct sk_buff *skb, struct netlink_callback *cb)
 {
@@ -703,7 +712,9 @@ ctnetlink_dump_table(struct sk_buff *skb, struct netlink_callback *cb)
        struct hlist_nulls_node *n;
        struct nfgenmsg *nfmsg = nlmsg_data(cb->nlh);
        u_int8_t l3proto = nfmsg->nfgen_family;
-
+#ifdef CONFIG_NF_CONNTRACK_MARK
+       const struct ctnetlink_dump_filter *filter = cb->data;
+#endif
        spin_lock_bh(&nf_conntrack_lock);
        last = (struct nf_conn *)cb->args[1];
        for (; cb->args[0] < net->ct.htable_size; cb->args[0]++) {
@@ -723,6 +734,12 @@ restart:
                                        continue;
                                cb->args[1] = 0;
                        }
+#ifdef CONFIG_NF_CONNTRACK_MARK
+                       if (filter && !((ct->mark & filter->mark.mask) ==
+                                       filter->mark.val)) {
+                               continue;
+                       }
+#endif
                        if (ctnetlink_fill_info(skb, NETLINK_CB(cb->skb).pid,
                                                cb->nlh->nlmsg_seq,
                                                NFNL_MSG_TYPE(
@@ -894,6 +911,7 @@ static const struct nla_policy ct_nla_policy[CTA_MAX+1] = {
        [CTA_NAT_DST]           = { .type = NLA_NESTED },
        [CTA_TUPLE_MASTER]      = { .type = NLA_NESTED },
        [CTA_ZONE]              = { .type = NLA_U16 },
+       [CTA_MARK_MASK]         = { .type = NLA_U32 },
 };
 
 static int
@@ -977,9 +995,28 @@ ctnetlink_get_conntrack(struct sock *ctnl, struct sk_buff *skb,
        u16 zone;
        int err;
 
-       if (nlh->nlmsg_flags & NLM_F_DUMP)
-               return netlink_dump_start(ctnl, skb, nlh, ctnetlink_dump_table,
-                                         ctnetlink_done, 0);
+       if (nlh->nlmsg_flags & NLM_F_DUMP) {
+               struct netlink_dump_control c = {
+                       .dump = ctnetlink_dump_table,
+                       .done = ctnetlink_done,
+               };
+#ifdef CONFIG_NF_CONNTRACK_MARK
+               if (cda[CTA_MARK] && cda[CTA_MARK_MASK]) {
+                       struct ctnetlink_dump_filter *filter;
+
+                       filter = kzalloc(sizeof(struct ctnetlink_dump_filter),
+                                        GFP_ATOMIC);
+                       if (filter == NULL)
+                               return -ENOMEM;
+
+                       filter->mark.val = ntohl(nla_get_be32(cda[CTA_MARK]));
+                       filter->mark.mask =
+                               ntohl(nla_get_be32(cda[CTA_MARK_MASK]));
+                       c.data = filter;
+               }
+#endif
+               return netlink_dump_start(ctnl, skb, nlh, &c);
+       }
 
        err = ctnetlink_parse_zone(cda[CTA_ZONE], &zone);
        if (err < 0)
@@ -1836,9 +1873,11 @@ ctnetlink_get_expect(struct sock *ctnl, struct sk_buff *skb,
        int err;
 
        if (nlh->nlmsg_flags & NLM_F_DUMP) {
-               return netlink_dump_start(ctnl, skb, nlh,
-                                         ctnetlink_exp_dump_table,
-                                         ctnetlink_exp_done, 0);
+               struct netlink_dump_control c = {
+                       .dump = ctnetlink_exp_dump_table,
+                       .done = ctnetlink_exp_done,
+               };
+               return netlink_dump_start(ctnl, skb, nlh, &c);
        }
 
        err = ctnetlink_parse_zone(cda[CTA_EXPECT_ZONE], &zone);
index 11ba013..3eb348b 100644 (file)
@@ -171,8 +171,10 @@ nfnl_acct_get(struct sock *nfnl, struct sk_buff *skb,
        char *acct_name;
 
        if (nlh->nlmsg_flags & NLM_F_DUMP) {
-               return netlink_dump_start(nfnl, skb, nlh, nfnl_acct_dump,
-                                         NULL, 0);
+               struct netlink_dump_control c = {
+                       .dump = nfnl_acct_dump,
+               };
+               return netlink_dump_start(nfnl, skb, nlh, &c);
        }
 
        if (!tb[NFACCT_NAME])
index 629b061..32bb753 100644 (file)
@@ -1645,6 +1645,24 @@ static void netlink_destroy_callback(struct netlink_callback *cb)
        kfree(cb);
 }
 
+struct nlmsghdr *
+__nlmsg_put(struct sk_buff *skb, u32 pid, u32 seq, int type, int len, int flags)
+{
+       struct nlmsghdr *nlh;
+       int size = NLMSG_LENGTH(len);
+
+       nlh = (struct nlmsghdr*)skb_put(skb, NLMSG_ALIGN(size));
+       nlh->nlmsg_type = type;
+       nlh->nlmsg_len = size;
+       nlh->nlmsg_flags = flags;
+       nlh->nlmsg_pid = pid;
+       nlh->nlmsg_seq = seq;
+       if (!__builtin_constant_p(size) || NLMSG_ALIGN(size) - size != 0)
+               memset(NLMSG_DATA(nlh) + len, 0, NLMSG_ALIGN(size) - size);
+       return nlh;
+}
+EXPORT_SYMBOL(__nlmsg_put);
+
 /*
  * It looks a bit ugly.
  * It would be better to create kernel thread.
@@ -1718,10 +1736,7 @@ errout_skb:
 
 int netlink_dump_start(struct sock *ssk, struct sk_buff *skb,
                       const struct nlmsghdr *nlh,
-                      int (*dump)(struct sk_buff *skb,
-                                  struct netlink_callback *),
-                      int (*done)(struct netlink_callback *),
-                      u16 min_dump_alloc)
+                      struct netlink_dump_control *control)
 {
        struct netlink_callback *cb;
        struct sock *sk;
@@ -1732,10 +1747,11 @@ int netlink_dump_start(struct sock *ssk, struct sk_buff *skb,
        if (cb == NULL)
                return -ENOBUFS;
 
-       cb->dump = dump;
-       cb->done = done;
+       cb->dump = control->dump;
+       cb->done = control->done;
        cb->nlh = nlh;
-       cb->min_dump_alloc = min_dump_alloc;
+       cb->data = control->data;
+       cb->min_dump_alloc = control->min_dump_alloc;
        atomic_inc(&skb->users);
        cb->skb = skb;
 
index c29d256..9f40441 100644 (file)
@@ -498,6 +498,37 @@ int genl_unregister_family(struct genl_family *family)
 }
 EXPORT_SYMBOL(genl_unregister_family);
 
+/**
+ * genlmsg_put - Add generic netlink header to netlink message
+ * @skb: socket buffer holding the message
+ * @pid: netlink pid the message is addressed to
+ * @seq: sequence number (usually the one of the sender)
+ * @family: generic netlink family
+ * @flags netlink message flags
+ * @cmd: generic netlink command
+ *
+ * Returns pointer to user specific header
+ */
+void *genlmsg_put(struct sk_buff *skb, u32 pid, u32 seq,
+                               struct genl_family *family, int flags, u8 cmd)
+{
+       struct nlmsghdr *nlh;
+       struct genlmsghdr *hdr;
+
+       nlh = nlmsg_put(skb, pid, seq, family->id, GENL_HDRLEN +
+                       family->hdrsize, flags);
+       if (nlh == NULL)
+               return NULL;
+
+       hdr = nlmsg_data(nlh);
+       hdr->cmd = cmd;
+       hdr->version = family->version;
+       hdr->reserved = 0;
+
+       return (char *) hdr + GENL_HDRLEN;
+}
+EXPORT_SYMBOL(genlmsg_put);
+
 static int genl_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh)
 {
        struct genl_ops *ops;
@@ -532,8 +563,13 @@ static int genl_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh)
                        return -EOPNOTSUPP;
 
                genl_unlock();
-               err = netlink_dump_start(net->genl_sock, skb, nlh,
-                                        ops->dumpit, ops->done, 0);
+               {
+                       struct netlink_dump_control c = {
+                               .dump = ops->dumpit,
+                               .done = ops->done,
+                       };
+                       err = netlink_dump_start(net->genl_sock, skb, nlh, &c);
+               }
                genl_lock();
                return err;
        }
index 3ddf6e6..6089aca 100644 (file)
@@ -431,15 +431,10 @@ EXPORT_SYMBOL(nfc_alloc_recv_skb);
 int nfc_targets_found(struct nfc_dev *dev, struct nfc_target *targets,
                                                        int n_targets)
 {
-       int i;
-
        pr_debug("dev_name=%s n_targets=%d\n", dev_name(&dev->dev), n_targets);
 
        dev->polling = false;
 
-       for (i = 0; i < n_targets; i++)
-               targets[i].idx = dev->target_idx++;
-
        spin_lock_bh(&dev->targets_lock);
 
        dev->targets_generation++;
index 7650139..a47e90c 100644 (file)
@@ -216,6 +216,39 @@ static void nci_rf_discover_req(struct nci_dev *ndev, unsigned long opt)
                &cmd);
 }
 
+struct nci_rf_discover_select_param {
+       __u8    rf_discovery_id;
+       __u8    rf_protocol;
+};
+
+static void nci_rf_discover_select_req(struct nci_dev *ndev, unsigned long opt)
+{
+       struct nci_rf_discover_select_param *param =
+                               (struct nci_rf_discover_select_param *)opt;
+       struct nci_rf_discover_select_cmd cmd;
+
+       cmd.rf_discovery_id = param->rf_discovery_id;
+       cmd.rf_protocol = param->rf_protocol;
+
+       switch (cmd.rf_protocol) {
+       case NCI_RF_PROTOCOL_ISO_DEP:
+               cmd.rf_interface = NCI_RF_INTERFACE_ISO_DEP;
+               break;
+
+       case NCI_RF_PROTOCOL_NFC_DEP:
+               cmd.rf_interface = NCI_RF_INTERFACE_NFC_DEP;
+               break;
+
+       default:
+               cmd.rf_interface = NCI_RF_INTERFACE_FRAME;
+               break;
+       }
+
+       nci_send_cmd(ndev, NCI_OP_RF_DISCOVER_SELECT_CMD,
+                       sizeof(struct nci_rf_discover_select_cmd),
+                       &cmd);
+}
+
 static void nci_rf_deactivate_req(struct nci_dev *ndev, unsigned long opt)
 {
        struct nci_rf_deactivate_cmd cmd;
@@ -264,6 +297,8 @@ static int nci_open_device(struct nci_dev *ndev)
 
        if (!rc) {
                set_bit(NCI_UP, &ndev->flags);
+               nci_clear_target_list(ndev);
+               atomic_set(&ndev->state, NCI_IDLE);
        } else {
                /* Init failed, cleanup */
                skb_queue_purge(&ndev->cmd_q);
@@ -286,6 +321,7 @@ static int nci_close_device(struct nci_dev *ndev)
 
        if (!test_and_clear_bit(NCI_UP, &ndev->flags)) {
                del_timer_sync(&ndev->cmd_timer);
+               del_timer_sync(&ndev->data_timer);
                mutex_unlock(&ndev->req_lock);
                return 0;
        }
@@ -331,6 +367,15 @@ static void nci_cmd_timer(unsigned long arg)
        queue_work(ndev->cmd_wq, &ndev->cmd_work);
 }
 
+/* NCI data exchange timer function */
+static void nci_data_timer(unsigned long arg)
+{
+       struct nci_dev *ndev = (void *) arg;
+
+       set_bit(NCI_DATA_EXCHANGE_TO, &ndev->flags);
+       queue_work(ndev->rx_wq, &ndev->rx_work);
+}
+
 static int nci_dev_up(struct nfc_dev *nfc_dev)
 {
        struct nci_dev *ndev = nfc_get_drvdata(nfc_dev);
@@ -350,7 +395,8 @@ static int nci_start_poll(struct nfc_dev *nfc_dev, __u32 protocols)
        struct nci_dev *ndev = nfc_get_drvdata(nfc_dev);
        int rc;
 
-       if (test_bit(NCI_DISCOVERY, &ndev->flags)) {
+       if ((atomic_read(&ndev->state) == NCI_DISCOVERY) ||
+               (atomic_read(&ndev->state) == NCI_W4_ALL_DISCOVERIES)) {
                pr_err("unable to start poll, since poll is already active\n");
                return -EBUSY;
        }
@@ -360,8 +406,9 @@ static int nci_start_poll(struct nfc_dev *nfc_dev, __u32 protocols)
                return -EBUSY;
        }
 
-       if (test_bit(NCI_POLL_ACTIVE, &ndev->flags)) {
-               pr_debug("target is active, implicitly deactivate...\n");
+       if ((atomic_read(&ndev->state) == NCI_W4_HOST_SELECT) ||
+               (atomic_read(&ndev->state) == NCI_POLL_ACTIVE)) {
+               pr_debug("target active or w4 select, implicitly deactivate\n");
 
                rc = nci_request(ndev, nci_rf_deactivate_req, 0,
                        msecs_to_jiffies(NCI_RF_DEACTIVATE_TIMEOUT));
@@ -382,7 +429,8 @@ static void nci_stop_poll(struct nfc_dev *nfc_dev)
 {
        struct nci_dev *ndev = nfc_get_drvdata(nfc_dev);
 
-       if (!test_bit(NCI_DISCOVERY, &ndev->flags)) {
+       if ((atomic_read(&ndev->state) != NCI_DISCOVERY) &&
+               (atomic_read(&ndev->state) != NCI_W4_ALL_DISCOVERIES)) {
                pr_err("unable to stop poll, since poll is not active\n");
                return;
        }
@@ -395,10 +443,15 @@ static int nci_activate_target(struct nfc_dev *nfc_dev, __u32 target_idx,
                                __u32 protocol)
 {
        struct nci_dev *ndev = nfc_get_drvdata(nfc_dev);
+       struct nci_rf_discover_select_param param;
+       struct nfc_target *target = NULL;
+       int i;
+       int rc = 0;
 
        pr_debug("target_idx %d, protocol 0x%x\n", target_idx, protocol);
 
-       if (!test_bit(NCI_POLL_ACTIVE, &ndev->flags)) {
+       if ((atomic_read(&ndev->state) != NCI_W4_HOST_SELECT) &&
+               (atomic_read(&ndev->state) != NCI_POLL_ACTIVE)) {
                pr_err("there is no available target to activate\n");
                return -EINVAL;
        }
@@ -408,16 +461,47 @@ static int nci_activate_target(struct nfc_dev *nfc_dev, __u32 target_idx,
                return -EBUSY;
        }
 
-       if (!(ndev->target_available_prots & (1 << protocol))) {
+       for (i = 0; i < ndev->n_targets; i++) {
+               if (ndev->targets[i].idx == target_idx) {
+                       target = &ndev->targets[i];
+                       break;
+               }
+       }
+
+       if (!target) {
+               pr_err("unable to find the selected target\n");
+               return -EINVAL;
+       }
+
+       if (!(target->supported_protocols & (1 << protocol))) {
                pr_err("target does not support the requested protocol 0x%x\n",
                       protocol);
                return -EINVAL;
        }
 
-       ndev->target_active_prot = protocol;
-       ndev->target_available_prots = 0;
+       if (atomic_read(&ndev->state) == NCI_W4_HOST_SELECT) {
+               param.rf_discovery_id = target->idx;
 
-       return 0;
+               if (protocol == NFC_PROTO_JEWEL)
+                       param.rf_protocol = NCI_RF_PROTOCOL_T1T;
+               else if (protocol == NFC_PROTO_MIFARE)
+                       param.rf_protocol = NCI_RF_PROTOCOL_T2T;
+               else if (protocol == NFC_PROTO_FELICA)
+                       param.rf_protocol = NCI_RF_PROTOCOL_T3T;
+               else if (protocol == NFC_PROTO_ISO14443)
+                       param.rf_protocol = NCI_RF_PROTOCOL_ISO_DEP;
+               else
+                       param.rf_protocol = NCI_RF_PROTOCOL_NFC_DEP;
+
+               rc = nci_request(ndev, nci_rf_discover_select_req,
+                               (unsigned long)&param,
+                               msecs_to_jiffies(NCI_RF_DISC_SELECT_TIMEOUT));
+       }
+
+       if (!rc)
+               ndev->target_active_prot = protocol;
+
+       return rc;
 }
 
 static void nci_deactivate_target(struct nfc_dev *nfc_dev, __u32 target_idx)
@@ -433,7 +517,7 @@ static void nci_deactivate_target(struct nfc_dev *nfc_dev, __u32 target_idx)
 
        ndev->target_active_prot = 0;
 
-       if (test_bit(NCI_POLL_ACTIVE, &ndev->flags)) {
+       if (atomic_read(&ndev->state) == NCI_POLL_ACTIVE) {
                nci_request(ndev, nci_rf_deactivate_req, 0,
                        msecs_to_jiffies(NCI_RF_DEACTIVATE_TIMEOUT));
        }
@@ -585,6 +669,8 @@ int nci_register_device(struct nci_dev *ndev)
 
        setup_timer(&ndev->cmd_timer, nci_cmd_timer,
                        (unsigned long) ndev);
+       setup_timer(&ndev->data_timer, nci_data_timer,
+                       (unsigned long) ndev);
 
        mutex_init(&ndev->req_lock);
 
@@ -722,6 +808,9 @@ static void nci_tx_work(struct work_struct *work)
                         nci_plen(skb->data));
 
                nci_send_frame(skb);
+
+               mod_timer(&ndev->data_timer,
+                       jiffies + msecs_to_jiffies(NCI_DATA_TIMEOUT));
        }
 }
 
@@ -753,6 +842,15 @@ static void nci_rx_work(struct work_struct *work)
                        break;
                }
        }
+
+       /* check if a data exchange timout has occurred */
+       if (test_bit(NCI_DATA_EXCHANGE_TO, &ndev->flags)) {
+               /* complete the data exchange transaction, if exists */
+               if (test_bit(NCI_DATA_EXCHANGE, &ndev->flags))
+                       nci_data_exchange_complete(ndev, NULL, -ETIMEDOUT);
+
+               clear_bit(NCI_DATA_EXCHANGE_TO, &ndev->flags);
+       }
 }
 
 /* ----- NCI TX CMD worker thread ----- */
index e5756b3..7880ae9 100644 (file)
@@ -44,6 +44,10 @@ void nci_data_exchange_complete(struct nci_dev *ndev,
 
        pr_debug("len %d, err %d\n", skb ? skb->len : 0, err);
 
+       /* data exchange is complete, stop the data timer */
+       del_timer_sync(&ndev->data_timer);
+       clear_bit(NCI_DATA_EXCHANGE_TO, &ndev->flags);
+
        if (cb) {
                ndev->data_exchange_cb = NULL;
                ndev->data_exchange_cb_context = 0;
index b16a8dc..03e7b46 100644 (file)
@@ -71,6 +71,20 @@ static void nci_core_conn_credits_ntf_packet(struct nci_dev *ndev,
                queue_work(ndev->tx_wq, &ndev->tx_work);
 }
 
+static void nci_core_generic_error_ntf_packet(struct nci_dev *ndev,
+                                               struct sk_buff *skb)
+{
+       __u8 status = skb->data[0];
+
+       pr_debug("status 0x%x\n", status);
+
+       if (atomic_read(&ndev->state) == NCI_W4_HOST_SELECT) {
+               /* Activation failed, so complete the request
+               (the state remains the same) */
+               nci_req_complete(ndev, status);
+       }
+}
+
 static void nci_core_conn_intf_error_ntf_packet(struct nci_dev *ndev,
                                                struct sk_buff *skb)
 {
@@ -86,12 +100,9 @@ static void nci_core_conn_intf_error_ntf_packet(struct nci_dev *ndev,
 }
 
 static __u8 *nci_extract_rf_params_nfca_passive_poll(struct nci_dev *ndev,
-                       struct nci_rf_intf_activated_ntf *ntf, __u8 *data)
+                       struct rf_tech_specific_params_nfca_poll *nfca_poll,
+                       __u8 *data)
 {
-       struct rf_tech_specific_params_nfca_poll *nfca_poll;
-
-       nfca_poll = &ntf->rf_tech_specific_params.nfca_poll;
-
        nfca_poll->sens_res = __le16_to_cpu(*((__u16 *)data));
        data += 2;
 
@@ -115,15 +126,213 @@ static __u8 *nci_extract_rf_params_nfca_passive_poll(struct nci_dev *ndev,
        return data;
 }
 
+static __u8 *nci_extract_rf_params_nfcb_passive_poll(struct nci_dev *ndev,
+                       struct rf_tech_specific_params_nfcb_poll *nfcb_poll,
+                       __u8 *data)
+{
+       nfcb_poll->sensb_res_len = *data++;
+
+       pr_debug("sensb_res_len %d\n", nfcb_poll->sensb_res_len);
+
+       memcpy(nfcb_poll->sensb_res, data, nfcb_poll->sensb_res_len);
+       data += nfcb_poll->sensb_res_len;
+
+       return data;
+}
+
+static __u8 *nci_extract_rf_params_nfcf_passive_poll(struct nci_dev *ndev,
+                       struct rf_tech_specific_params_nfcf_poll *nfcf_poll,
+                       __u8 *data)
+{
+       nfcf_poll->bit_rate = *data++;
+       nfcf_poll->sensf_res_len = *data++;
+
+       pr_debug("bit_rate %d, sensf_res_len %d\n",
+               nfcf_poll->bit_rate, nfcf_poll->sensf_res_len);
+
+       memcpy(nfcf_poll->sensf_res, data, nfcf_poll->sensf_res_len);
+       data += nfcf_poll->sensf_res_len;
+
+       return data;
+}
+
+static int nci_add_new_protocol(struct nci_dev *ndev,
+                               struct nfc_target *target,
+                               __u8 rf_protocol,
+                               __u8 rf_tech_and_mode,
+                               void *params)
+{
+       struct rf_tech_specific_params_nfca_poll *nfca_poll;
+       struct rf_tech_specific_params_nfcb_poll *nfcb_poll;
+       struct rf_tech_specific_params_nfcf_poll *nfcf_poll;
+       __u32 protocol;
+
+       if (rf_protocol == NCI_RF_PROTOCOL_T2T)
+               protocol = NFC_PROTO_MIFARE_MASK;
+       else if (rf_protocol == NCI_RF_PROTOCOL_ISO_DEP)
+               protocol = NFC_PROTO_ISO14443_MASK;
+       else if (rf_protocol == NCI_RF_PROTOCOL_T3T)
+               protocol = NFC_PROTO_FELICA_MASK;
+       else
+               protocol = 0;
+
+       if (!(protocol & ndev->poll_prots)) {
+               pr_err("the target found does not have the desired protocol\n");
+               return -EPROTO;
+       }
+
+       if (rf_tech_and_mode == NCI_NFC_A_PASSIVE_POLL_MODE) {
+               nfca_poll = (struct rf_tech_specific_params_nfca_poll *)params;
+
+               target->sens_res = nfca_poll->sens_res;
+               target->sel_res = nfca_poll->sel_res;
+               target->nfcid1_len = nfca_poll->nfcid1_len;
+               if (target->nfcid1_len > 0) {
+                       memcpy(target->nfcid1, nfca_poll->nfcid1,
+                               target->nfcid1_len);
+               }
+       } else if (rf_tech_and_mode == NCI_NFC_B_PASSIVE_POLL_MODE) {
+               nfcb_poll = (struct rf_tech_specific_params_nfcb_poll *)params;
+
+               target->sensb_res_len = nfcb_poll->sensb_res_len;
+               if (target->sensb_res_len > 0) {
+                       memcpy(target->sensb_res, nfcb_poll->sensb_res,
+                               target->sensb_res_len);
+               }
+       } else if (rf_tech_and_mode == NCI_NFC_F_PASSIVE_POLL_MODE) {
+               nfcf_poll = (struct rf_tech_specific_params_nfcf_poll *)params;
+
+               target->sensf_res_len = nfcf_poll->sensf_res_len;
+               if (target->sensf_res_len > 0) {
+                       memcpy(target->sensf_res, nfcf_poll->sensf_res,
+                               target->sensf_res_len);
+               }
+       } else {
+               pr_err("unsupported rf_tech_and_mode 0x%x\n", rf_tech_and_mode);
+               return -EPROTO;
+       }
+
+       target->supported_protocols |= protocol;
+
+       pr_debug("protocol 0x%x\n", protocol);
+
+       return 0;
+}
+
+static void nci_add_new_target(struct nci_dev *ndev,
+                               struct nci_rf_discover_ntf *ntf)
+{
+       struct nfc_target *target;
+       int i, rc;
+
+       for (i = 0; i < ndev->n_targets; i++) {
+               target = &ndev->targets[i];
+               if (target->idx == ntf->rf_discovery_id) {
+                       /* This target already exists, add the new protocol */
+                       nci_add_new_protocol(ndev, target, ntf->rf_protocol,
+                                               ntf->rf_tech_and_mode,
+                                               &ntf->rf_tech_specific_params);
+                       return;
+               }
+       }
+
+       /* This is a new target, check if we've enough room */
+       if (ndev->n_targets == NCI_MAX_DISCOVERED_TARGETS) {
+               pr_debug("not enough room, ignoring new target...\n");
+               return;
+       }
+
+       target = &ndev->targets[ndev->n_targets];
+
+       rc = nci_add_new_protocol(ndev, target, ntf->rf_protocol,
+                                       ntf->rf_tech_and_mode,
+                                       &ntf->rf_tech_specific_params);
+       if (!rc) {
+               target->idx = ntf->rf_discovery_id;
+               ndev->n_targets++;
+
+               pr_debug("target_idx %d, n_targets %d\n", target->idx,
+                               ndev->n_targets);
+       }
+}
+
+void nci_clear_target_list(struct nci_dev *ndev)
+{
+       memset(ndev->targets, 0,
+               (sizeof(struct nfc_target)*NCI_MAX_DISCOVERED_TARGETS));
+
+       ndev->n_targets = 0;
+}
+
+static void nci_rf_discover_ntf_packet(struct nci_dev *ndev,
+                                       struct sk_buff *skb)
+{
+       struct nci_rf_discover_ntf ntf;
+       __u8 *data = skb->data;
+       bool add_target = true;
+
+       ntf.rf_discovery_id = *data++;
+       ntf.rf_protocol = *data++;
+       ntf.rf_tech_and_mode = *data++;
+       ntf.rf_tech_specific_params_len = *data++;
+
+       pr_debug("rf_discovery_id %d\n", ntf.rf_discovery_id);
+       pr_debug("rf_protocol 0x%x\n", ntf.rf_protocol);
+       pr_debug("rf_tech_and_mode 0x%x\n", ntf.rf_tech_and_mode);
+       pr_debug("rf_tech_specific_params_len %d\n",
+                       ntf.rf_tech_specific_params_len);
+
+       if (ntf.rf_tech_specific_params_len > 0) {
+               switch (ntf.rf_tech_and_mode) {
+               case NCI_NFC_A_PASSIVE_POLL_MODE:
+                       data = nci_extract_rf_params_nfca_passive_poll(ndev,
+                               &(ntf.rf_tech_specific_params.nfca_poll), data);
+                       break;
+
+               case NCI_NFC_B_PASSIVE_POLL_MODE:
+                       data = nci_extract_rf_params_nfcb_passive_poll(ndev,
+                               &(ntf.rf_tech_specific_params.nfcb_poll), data);
+                       break;
+
+               case NCI_NFC_F_PASSIVE_POLL_MODE:
+                       data = nci_extract_rf_params_nfcf_passive_poll(ndev,
+                               &(ntf.rf_tech_specific_params.nfcf_poll), data);
+                       break;
+
+               default:
+                       pr_err("unsupported rf_tech_and_mode 0x%x\n",
+                              ntf.rf_tech_and_mode);
+                       data += ntf.rf_tech_specific_params_len;
+                       add_target = false;
+               }
+       }
+
+       ntf.ntf_type = *data++;
+       pr_debug("ntf_type %d\n", ntf.ntf_type);
+
+       if (add_target == true)
+               nci_add_new_target(ndev, &ntf);
+
+       if (ntf.ntf_type == NCI_DISCOVER_NTF_TYPE_MORE) {
+               atomic_set(&ndev->state, NCI_W4_ALL_DISCOVERIES);
+       } else {
+               atomic_set(&ndev->state, NCI_W4_HOST_SELECT);
+               nfc_targets_found(ndev->nfc_dev, ndev->targets,
+                                       ndev->n_targets);
+       }
+}
+
 static int nci_extract_activation_params_iso_dep(struct nci_dev *ndev,
                        struct nci_rf_intf_activated_ntf *ntf, __u8 *data)
 {
        struct activation_params_nfca_poll_iso_dep *nfca_poll;
+       struct activation_params_nfcb_poll_iso_dep *nfcb_poll;
 
        switch (ntf->activation_rf_tech_and_mode) {
        case NCI_NFC_A_PASSIVE_POLL_MODE:
                nfca_poll = &ntf->activation_params.nfca_poll_iso_dep;
                nfca_poll->rats_res_len = *data++;
+               pr_debug("rats_res_len %d\n", nfca_poll->rats_res_len);
                if (nfca_poll->rats_res_len > 0) {
                        memcpy(nfca_poll->rats_res,
                                data,
@@ -131,52 +340,47 @@ static int nci_extract_activation_params_iso_dep(struct nci_dev *ndev,
                }
                break;
 
+       case NCI_NFC_B_PASSIVE_POLL_MODE:
+               nfcb_poll = &ntf->activation_params.nfcb_poll_iso_dep;
+               nfcb_poll->attrib_res_len = *data++;
+               pr_debug("attrib_res_len %d\n",
+                       nfcb_poll->attrib_res_len);
+               if (nfcb_poll->attrib_res_len > 0) {
+                       memcpy(nfcb_poll->attrib_res,
+                               data,
+                               nfcb_poll->attrib_res_len);
+               }
+               break;
+
        default:
                pr_err("unsupported activation_rf_tech_and_mode 0x%x\n",
                       ntf->activation_rf_tech_and_mode);
-               return -EPROTO;
+               return NCI_STATUS_RF_PROTOCOL_ERROR;
        }
 
-       return 0;
+       return NCI_STATUS_OK;
 }
 
-static void nci_target_found(struct nci_dev *ndev,
-                               struct nci_rf_intf_activated_ntf *ntf)
+static void nci_target_auto_activated(struct nci_dev *ndev,
+                                       struct nci_rf_intf_activated_ntf *ntf)
 {
-       struct nfc_target nfc_tgt;
+       struct nfc_target *target;
+       int rc;
 
-       if (ntf->rf_protocol == NCI_RF_PROTOCOL_T2T)    /* T2T MifareUL */
-               nfc_tgt.supported_protocols = NFC_PROTO_MIFARE_MASK;
-       else if (ntf->rf_protocol == NCI_RF_PROTOCOL_ISO_DEP)   /* 4A */
-               nfc_tgt.supported_protocols = NFC_PROTO_ISO14443_MASK;
-       else
-               nfc_tgt.supported_protocols = 0;
-
-       nfc_tgt.sens_res = ntf->rf_tech_specific_params.nfca_poll.sens_res;
-       nfc_tgt.sel_res = ntf->rf_tech_specific_params.nfca_poll.sel_res;
-       nfc_tgt.nfcid1_len = ntf->rf_tech_specific_params.nfca_poll.nfcid1_len;
-       if (nfc_tgt.nfcid1_len > 0) {
-               memcpy(nfc_tgt.nfcid1,
-                       ntf->rf_tech_specific_params.nfca_poll.nfcid1,
-                       nfc_tgt.nfcid1_len);
-       }
+       target = &ndev->targets[ndev->n_targets];
 
-       if (!(nfc_tgt.supported_protocols & ndev->poll_prots)) {
-               pr_debug("the target found does not have the desired protocol\n");
+       rc = nci_add_new_protocol(ndev, target, ntf->rf_protocol,
+                                       ntf->activation_rf_tech_and_mode,
+                                       &ntf->rf_tech_specific_params);
+       if (rc)
                return;
-       }
 
-       pr_debug("new target found,  supported_protocols 0x%x\n",
-                nfc_tgt.supported_protocols);
+       target->idx = ntf->rf_discovery_id;
+       ndev->n_targets++;
 
-       ndev->target_available_prots = nfc_tgt.supported_protocols;
-       ndev->max_data_pkt_payload_size = ntf->max_data_pkt_payload_size;
-       ndev->initial_num_credits = ntf->initial_num_credits;
+       pr_debug("target_idx %d, n_targets %d\n", target->idx, ndev->n_targets);
 
-       /* set the available credits to initial value */
-       atomic_set(&ndev->credits_cnt, ndev->initial_num_credits);
-
-       nfc_targets_found(ndev->nfc_dev, &nfc_tgt, 1);
+       nfc_targets_found(ndev->nfc_dev, ndev->targets, ndev->n_targets);
 }
 
 static void nci_rf_intf_activated_ntf_packet(struct nci_dev *ndev,
@@ -184,10 +388,7 @@ static void nci_rf_intf_activated_ntf_packet(struct nci_dev *ndev,
 {
        struct nci_rf_intf_activated_ntf ntf;
        __u8 *data = skb->data;
-       int err = 0;
-
-       clear_bit(NCI_DISCOVERY, &ndev->flags);
-       set_bit(NCI_POLL_ACTIVE, &ndev->flags);
+       int err = NCI_STATUS_OK;
 
        ntf.rf_discovery_id = *data++;
        ntf.rf_interface = *data++;
@@ -212,13 +413,24 @@ static void nci_rf_intf_activated_ntf_packet(struct nci_dev *ndev,
                switch (ntf.activation_rf_tech_and_mode) {
                case NCI_NFC_A_PASSIVE_POLL_MODE:
                        data = nci_extract_rf_params_nfca_passive_poll(ndev,
-                               &ntf, data);
+                               &(ntf.rf_tech_specific_params.nfca_poll), data);
+                       break;
+
+               case NCI_NFC_B_PASSIVE_POLL_MODE:
+                       data = nci_extract_rf_params_nfcb_passive_poll(ndev,
+                               &(ntf.rf_tech_specific_params.nfcb_poll), data);
+                       break;
+
+               case NCI_NFC_F_PASSIVE_POLL_MODE:
+                       data = nci_extract_rf_params_nfcf_passive_poll(ndev,
+                               &(ntf.rf_tech_specific_params.nfcf_poll), data);
                        break;
 
                default:
                        pr_err("unsupported activation_rf_tech_and_mode 0x%x\n",
                               ntf.activation_rf_tech_and_mode);
-                       return;
+                       err = NCI_STATUS_RF_PROTOCOL_ERROR;
+                       goto exit;
                }
        }
 
@@ -250,12 +462,30 @@ static void nci_rf_intf_activated_ntf_packet(struct nci_dev *ndev,
                default:
                        pr_err("unsupported rf_interface 0x%x\n",
                               ntf.rf_interface);
-                       return;
+                       err = NCI_STATUS_RF_PROTOCOL_ERROR;
+                       break;
                }
        }
 
-       if (!err)
-               nci_target_found(ndev, &ntf);
+exit:
+       if (err == NCI_STATUS_OK) {
+               ndev->max_data_pkt_payload_size = ntf.max_data_pkt_payload_size;
+               ndev->initial_num_credits = ntf.initial_num_credits;
+
+               /* set the available credits to initial value */
+               atomic_set(&ndev->credits_cnt, ndev->initial_num_credits);
+       }
+
+       if (atomic_read(&ndev->state) == NCI_DISCOVERY) {
+               /* A single target was found and activated automatically */
+               atomic_set(&ndev->state, NCI_POLL_ACTIVE);
+               if (err == NCI_STATUS_OK)
+                       nci_target_auto_activated(ndev, &ntf);
+       } else {        /* ndev->state == NCI_W4_HOST_SELECT */
+               /* A selected target was activated, so complete the request */
+               atomic_set(&ndev->state, NCI_POLL_ACTIVE);
+               nci_req_complete(ndev, err);
+       }
 }
 
 static void nci_rf_deactivate_ntf_packet(struct nci_dev *ndev,
@@ -265,9 +495,6 @@ static void nci_rf_deactivate_ntf_packet(struct nci_dev *ndev,
 
        pr_debug("entry, type 0x%x, reason 0x%x\n", ntf->type, ntf->reason);
 
-       clear_bit(NCI_POLL_ACTIVE, &ndev->flags);
-       ndev->target_active_prot = 0;
-
        /* drop tx data queue */
        skb_queue_purge(&ndev->tx_q);
 
@@ -280,6 +507,10 @@ static void nci_rf_deactivate_ntf_packet(struct nci_dev *ndev,
        /* complete the data exchange transaction, if exists */
        if (test_bit(NCI_DATA_EXCHANGE, &ndev->flags))
                nci_data_exchange_complete(ndev, NULL, -EIO);
+
+       nci_clear_target_list(ndev);
+       atomic_set(&ndev->state, NCI_IDLE);
+       nci_req_complete(ndev, NCI_STATUS_OK);
 }
 
 void nci_ntf_packet(struct nci_dev *ndev, struct sk_buff *skb)
@@ -300,10 +531,18 @@ void nci_ntf_packet(struct nci_dev *ndev, struct sk_buff *skb)
                nci_core_conn_credits_ntf_packet(ndev, skb);
                break;
 
+       case NCI_OP_CORE_GENERIC_ERROR_NTF:
+               nci_core_generic_error_ntf_packet(ndev, skb);
+               break;
+
        case NCI_OP_CORE_INTF_ERROR_NTF:
                nci_core_conn_intf_error_ntf_packet(ndev, skb);
                break;
 
+       case NCI_OP_RF_DISCOVER_NTF:
+               nci_rf_discover_ntf_packet(ndev, skb);
+               break;
+
        case NCI_OP_RF_INTF_ACTIVATED_NTF:
                nci_rf_intf_activated_ntf_packet(ndev, skb);
                break;
index 2840ae2..aa63b1e 100644 (file)
@@ -137,11 +137,23 @@ static void nci_rf_disc_rsp_packet(struct nci_dev *ndev, struct sk_buff *skb)
        pr_debug("status 0x%x\n", status);
 
        if (status == NCI_STATUS_OK)
-               set_bit(NCI_DISCOVERY, &ndev->flags);
+               atomic_set(&ndev->state, NCI_DISCOVERY);
 
        nci_req_complete(ndev, status);
 }
 
+static void nci_rf_disc_select_rsp_packet(struct nci_dev *ndev,
+                                               struct sk_buff *skb)
+{
+       __u8 status = skb->data[0];
+
+       pr_debug("status 0x%x\n", status);
+
+       /* Complete the request on intf_activated_ntf or generic_error_ntf */
+       if (status != NCI_STATUS_OK)
+               nci_req_complete(ndev, status);
+}
+
 static void nci_rf_deactivate_rsp_packet(struct nci_dev *ndev,
                                        struct sk_buff *skb)
 {
@@ -149,9 +161,13 @@ static void nci_rf_deactivate_rsp_packet(struct nci_dev *ndev,
 
        pr_debug("status 0x%x\n", status);
 
-       clear_bit(NCI_DISCOVERY, &ndev->flags);
-
-       nci_req_complete(ndev, status);
+       /* If target was active, complete the request only in deactivate_ntf */
+       if ((status != NCI_STATUS_OK) ||
+               (atomic_read(&ndev->state) != NCI_POLL_ACTIVE)) {
+               nci_clear_target_list(ndev);
+               atomic_set(&ndev->state, NCI_IDLE);
+               nci_req_complete(ndev, status);
+       }
 }
 
 void nci_rsp_packet(struct nci_dev *ndev, struct sk_buff *skb)
@@ -187,6 +203,10 @@ void nci_rsp_packet(struct nci_dev *ndev, struct sk_buff *skb)
                nci_rf_disc_rsp_packet(ndev, skb);
                break;
 
+       case NCI_OP_RF_DISCOVER_SELECT_RSP:
+               nci_rf_disc_select_rsp_packet(ndev, skb);
+               break;
+
        case NCI_OP_RF_DEACTIVATE_RSP:
                nci_rf_deactivate_rsp_packet(ndev, skb);
                break;
index 6989dfa..07f0348 100644 (file)
@@ -70,6 +70,12 @@ static int nfc_genl_send_target(struct sk_buff *msg, struct nfc_target *target,
        if (target->nfcid1_len > 0)
                NLA_PUT(msg, NFC_ATTR_TARGET_NFCID1, target->nfcid1_len,
                                target->nfcid1);
+       if (target->sensb_res_len > 0)
+               NLA_PUT(msg, NFC_ATTR_TARGET_SENSB_RES, target->sensb_res_len,
+                               target->sensb_res);
+       if (target->sensf_res_len > 0)
+               NLA_PUT(msg, NFC_ATTR_TARGET_SENSF_RES, target->sensf_res_len,
+                               target->sensf_res);
 
        return genlmsg_end(msg, hdr);
 
index 2e2f8c6..5325439 100644 (file)
@@ -92,18 +92,6 @@ static int rawsock_connect(struct socket *sock, struct sockaddr *_addr,
                goto error;
        }
 
-       if (addr->target_idx > dev->target_idx - 1 ||
-               addr->target_idx < dev->target_idx - dev->n_targets) {
-               rc = -EINVAL;
-               goto error;
-       }
-
-       if (addr->target_idx > dev->target_idx - 1 ||
-               addr->target_idx < dev->target_idx - dev->n_targets) {
-               rc = -EINVAL;
-               goto error;
-       }
-
        rc = nfc_activate_target(dev, addr->target_idx, addr->nfc_protocol);
        if (rc)
                goto put_dev;
index 322b8d2..b6b1d7d 100644 (file)
@@ -66,6 +66,7 @@ static int internal_dev_mac_addr(struct net_device *dev, void *p)
 
        if (!is_valid_ether_addr(addr->sa_data))
                return -EADDRNOTAVAIL;
+       dev->addr_assign_type &= ~NET_ADDR_RANDOM;
        memcpy(dev->dev_addr, addr->sa_data, dev->addr_len);
        return 0;
 }
@@ -145,7 +146,7 @@ static void do_setup(struct net_device *netdev)
        netdev->vlan_features = netdev->features;
        netdev->features |= NETIF_F_HW_VLAN_TX;
        netdev->hw_features = netdev->features & ~NETIF_F_LLTX;
-       random_ether_addr(netdev->dev_addr);
+       eth_hw_addr_random(netdev);
 }
 
 static struct vport *internal_dev_create(const struct vport_parms *parms)
index 2dbb32b..ae2d484 100644 (file)
@@ -1459,6 +1459,7 @@ static int packet_sendmsg_spkt(struct kiocb *iocb, struct socket *sock,
        struct net_device *dev;
        __be16 proto = 0;
        int err;
+       int extra_len = 0;
 
        /*
         *      Get and verify the address.
@@ -1493,8 +1494,16 @@ retry:
         * raw protocol and you must do your own fragmentation at this level.
         */
 
+       if (unlikely(sock_flag(sk, SOCK_NOFCS))) {
+               if (!netif_supports_nofcs(dev)) {
+                       err = -EPROTONOSUPPORT;
+                       goto out_unlock;
+               }
+               extra_len = 4; /* We're doing our own CRC */
+       }
+
        err = -EMSGSIZE;
-       if (len > dev->mtu + dev->hard_header_len + VLAN_HLEN)
+       if (len > dev->mtu + dev->hard_header_len + VLAN_HLEN + extra_len)
                goto out_unlock;
 
        if (!skb) {
@@ -1526,7 +1535,7 @@ retry:
                goto retry;
        }
 
-       if (len > (dev->mtu + dev->hard_header_len)) {
+       if (len > (dev->mtu + dev->hard_header_len + extra_len)) {
                /* Earlier code assumed this would be a VLAN pkt,
                 * double-check this now that we have the actual
                 * packet in hand.
@@ -1548,6 +1557,9 @@ retry:
        if (err < 0)
                goto out_unlock;
 
+       if (unlikely(extra_len == 4))
+               skb->no_fcs = 1;
+
        dev_queue_xmit(skb);
        rcu_read_unlock();
        return len;
@@ -2209,6 +2221,7 @@ static int packet_snd(struct socket *sock,
        struct packet_sock *po = pkt_sk(sk);
        unsigned short gso_type = 0;
        int hlen, tlen;
+       int extra_len = 0;
 
        /*
         *      Get and verify the address.
@@ -2288,8 +2301,16 @@ static int packet_snd(struct socket *sock,
                }
        }
 
+       if (unlikely(sock_flag(sk, SOCK_NOFCS))) {
+               if (!netif_supports_nofcs(dev)) {
+                       err = -EPROTONOSUPPORT;
+                       goto out_unlock;
+               }
+               extra_len = 4; /* We're doing our own CRC */
+       }
+
        err = -EMSGSIZE;
-       if (!gso_type && (len > dev->mtu + reserve + VLAN_HLEN))
+       if (!gso_type && (len > dev->mtu + reserve + VLAN_HLEN + extra_len))
                goto out_unlock;
 
        err = -ENOBUFS;
@@ -2315,7 +2336,7 @@ static int packet_snd(struct socket *sock,
        if (err < 0)
                goto out_free;
 
-       if (!gso_type && (len > dev->mtu + reserve)) {
+       if (!gso_type && (len > dev->mtu + reserve + extra_len)) {
                /* Earlier code assumed this would be a VLAN pkt,
                 * double-check this now that we have the actual
                 * packet in hand.
@@ -2353,6 +2374,9 @@ static int packet_snd(struct socket *sock,
                len += vnet_hdr_len;
        }
 
+       if (unlikely(extra_len == 4))
+               skb->no_fcs = 1;
+
        /*
         *      Now send it
         */
index 2590e91..75b58f8 100644 (file)
@@ -260,6 +260,32 @@ config NET_SCH_INGRESS
          To compile this code as a module, choose M here: the
          module will be called sch_ingress.
 
+config NET_SCH_PLUG
+       tristate "Plug network traffic until release (PLUG)"
+       ---help---
+
+         This queuing discipline allows userspace to plug/unplug a network
+         output queue, using the netlink interface.  When it receives an
+         enqueue command it inserts a plug into the outbound queue that
+         causes following packets to enqueue until a dequeue command arrives
+         over netlink, causing the plug to be removed and resuming the normal
+         packet flow.
+
+         This module also provides a generic "network output buffering"
+         functionality (aka output commit), wherein upon arrival of a dequeue
+         command, only packets up to the first plug are released for delivery.
+         The Remus HA project uses this module to enable speculative execution
+         of virtual machines by allowing the generated network output to be rolled
+         back if needed.
+
+         For more information, please refer to http://wiki.xensource.com/xenwiki/Remus
+
+         Say Y here if you are using this kernel for Xen dom0 and
+         want to protect Xen guests with Remus.
+
+         To compile this code as a module, choose M here: the
+         module will be called sch_plug.
+
 comment "Classification"
 
 config NET_CLS
index dc5889c..8cdf4e2 100644 (file)
@@ -33,6 +33,7 @@ obj-$(CONFIG_NET_SCH_MULTIQ)  += sch_multiq.o
 obj-$(CONFIG_NET_SCH_ATM)      += sch_atm.o
 obj-$(CONFIG_NET_SCH_NETEM)    += sch_netem.o
 obj-$(CONFIG_NET_SCH_DRR)      += sch_drr.o
+obj-$(CONFIG_NET_SCH_PLUG)     += sch_plug.o
 obj-$(CONFIG_NET_SCH_MQPRIO)   += sch_mqprio.o
 obj-$(CONFIG_NET_SCH_CHOKE)    += sch_choke.o
 obj-$(CONFIG_NET_SCH_QFQ)      += sch_qfq.o
diff --git a/net/sched/sch_plug.c b/net/sched/sch_plug.c
new file mode 100644 (file)
index 0000000..89f8fcf
--- /dev/null
@@ -0,0 +1,233 @@
+/*
+ * sch_plug.c Queue traffic until an explicit release command
+ *
+ *             This program is free software; you can redistribute it and/or
+ *             modify it under the terms of the GNU General Public License
+ *             as published by the Free Software Foundation; either version
+ *             2 of the License, or (at your option) any later version.
+ *
+ * There are two ways to use this qdisc:
+ * 1. A simple "instantaneous" plug/unplug operation, by issuing an alternating
+ *    sequence of TCQ_PLUG_BUFFER & TCQ_PLUG_RELEASE_INDEFINITE commands.
+ *
+ * 2. For network output buffering (a.k.a output commit) functionality.
+ *    Output commit property is commonly used by applications using checkpoint
+ *    based fault-tolerance to ensure that the checkpoint from which a system
+ *    is being restored is consistent w.r.t outside world.
+ *
+ *    Consider for e.g. Remus - a Virtual Machine checkpointing system,
+ *    wherein a VM is checkpointed, say every 50ms. The checkpoint is replicated
+ *    asynchronously to the backup host, while the VM continues executing the
+ *    next epoch speculatively.
+ *
+ *    The following is a typical sequence of output buffer operations:
+ *       1.At epoch i, start_buffer(i)
+ *       2. At end of epoch i (i.e. after 50ms):
+ *          2.1 Stop VM and take checkpoint(i).
+ *          2.2 start_buffer(i+1) and Resume VM
+ *       3. While speculatively executing epoch(i+1), asynchronously replicate
+ *          checkpoint(i) to backup host.
+ *       4. When checkpoint_ack(i) is received from backup, release_buffer(i)
+ *    Thus, this Qdisc would receive the following sequence of commands:
+ *       TCQ_PLUG_BUFFER (epoch i)
+ *       .. TCQ_PLUG_BUFFER (epoch i+1)
+ *       ....TCQ_PLUG_RELEASE_ONE (epoch i)
+ *       ......TCQ_PLUG_BUFFER (epoch i+2)
+ *       ........
+ */
+
+#include <linux/module.h>
+#include <linux/types.h>
+#include <linux/kernel.h>
+#include <linux/errno.h>
+#include <linux/netdevice.h>
+#include <linux/skbuff.h>
+#include <net/pkt_sched.h>
+
+/*
+ * State of the queue, when used for network output buffering:
+ *
+ *                 plug(i+1)            plug(i)          head
+ * ------------------+--------------------+---------------->
+ *                   |                    |
+ *                   |                    |
+ * pkts_current_epoch| pkts_last_epoch    |pkts_to_release
+ * ----------------->|<--------+--------->|+--------------->
+ *                   v                    v
+ *
+ */
+
+struct plug_sched_data {
+       /* If true, the dequeue function releases all packets
+        * from head to end of the queue. The queue turns into
+        * a pass-through queue for newly arriving packets.
+        */
+       bool unplug_indefinite;
+
+       /* Queue Limit in bytes */
+       u32 limit;
+
+       /* Number of packets (output) from the current speculatively
+        * executing epoch.
+        */
+       u32 pkts_current_epoch;
+
+       /* Number of packets corresponding to the recently finished
+        * epoch. These will be released when we receive a
+        * TCQ_PLUG_RELEASE_ONE command. This command is typically
+        * issued after committing a checkpoint at the target.
+        */
+       u32 pkts_last_epoch;
+
+       /*
+        * Number of packets from the head of the queue, that can
+        * be released (committed checkpoint).
+        */
+       u32 pkts_to_release;
+};
+
+static int plug_enqueue(struct sk_buff *skb, struct Qdisc *sch)
+{
+       struct plug_sched_data *q = qdisc_priv(sch);
+
+       if (likely(sch->qstats.backlog + skb->len <= q->limit)) {
+               if (!q->unplug_indefinite)
+                       q->pkts_current_epoch++;
+               return qdisc_enqueue_tail(skb, sch);
+       }
+
+       return qdisc_reshape_fail(skb, sch);
+}
+
+static struct sk_buff *plug_dequeue(struct Qdisc *sch)
+{
+       struct plug_sched_data *q = qdisc_priv(sch);
+
+       if (qdisc_is_throttled(sch))
+               return NULL;
+
+       if (!q->unplug_indefinite) {
+               if (!q->pkts_to_release) {
+                       /* No more packets to dequeue. Block the queue
+                        * and wait for the next release command.
+                        */
+                       qdisc_throttled(sch);
+                       return NULL;
+               }
+               q->pkts_to_release--;
+       }
+
+       return qdisc_dequeue_head(sch);
+}
+
+static int plug_init(struct Qdisc *sch, struct nlattr *opt)
+{
+       struct plug_sched_data *q = qdisc_priv(sch);
+
+       q->pkts_current_epoch = 0;
+       q->pkts_last_epoch = 0;
+       q->pkts_to_release = 0;
+       q->unplug_indefinite = false;
+
+       if (opt == NULL) {
+               /* We will set a default limit of 100 pkts (~150kB)
+                * in case tx_queue_len is not available. The
+                * default value is completely arbitrary.
+                */
+               u32 pkt_limit = qdisc_dev(sch)->tx_queue_len ? : 100;
+               q->limit = pkt_limit * psched_mtu(qdisc_dev(sch));
+       } else {
+               struct tc_plug_qopt *ctl = nla_data(opt);
+
+               if (nla_len(opt) < sizeof(*ctl))
+                       return -EINVAL;
+
+               q->limit = ctl->limit;
+       }
+
+       qdisc_throttled(sch);
+       return 0;
+}
+
+/* Receives 4 types of messages:
+ * TCQ_PLUG_BUFFER: Inset a plug into the queue and
+ *  buffer any incoming packets
+ * TCQ_PLUG_RELEASE_ONE: Dequeue packets from queue head
+ *   to beginning of the next plug.
+ * TCQ_PLUG_RELEASE_INDEFINITE: Dequeue all packets from queue.
+ *   Stop buffering packets until the next TCQ_PLUG_BUFFER
+ *   command is received (just act as a pass-thru queue).
+ * TCQ_PLUG_LIMIT: Increase/decrease queue size
+ */
+static int plug_change(struct Qdisc *sch, struct nlattr *opt)
+{
+       struct plug_sched_data *q = qdisc_priv(sch);
+       struct tc_plug_qopt *msg;
+
+       if (opt == NULL)
+               return -EINVAL;
+
+       msg = nla_data(opt);
+       if (nla_len(opt) < sizeof(*msg))
+               return -EINVAL;
+
+       switch (msg->action) {
+       case TCQ_PLUG_BUFFER:
+               /* Save size of the current buffer */
+               q->pkts_last_epoch = q->pkts_current_epoch;
+               q->pkts_current_epoch = 0;
+               if (q->unplug_indefinite)
+                       qdisc_throttled(sch);
+               q->unplug_indefinite = false;
+               break;
+       case TCQ_PLUG_RELEASE_ONE:
+               /* Add packets from the last complete buffer to the
+                * packets to be released set.
+                */
+               q->pkts_to_release += q->pkts_last_epoch;
+               q->pkts_last_epoch = 0;
+               qdisc_unthrottled(sch);
+               netif_schedule_queue(sch->dev_queue);
+               break;
+       case TCQ_PLUG_RELEASE_INDEFINITE:
+               q->unplug_indefinite = true;
+               q->pkts_to_release = 0;
+               q->pkts_last_epoch = 0;
+               q->pkts_current_epoch = 0;
+               qdisc_unthrottled(sch);
+               netif_schedule_queue(sch->dev_queue);
+               break;
+       case TCQ_PLUG_LIMIT:
+               /* Limit is supplied in bytes */
+               q->limit = msg->limit;
+               break;
+       default:
+               return -EINVAL;
+       }
+
+       return 0;
+}
+
+static struct Qdisc_ops plug_qdisc_ops __read_mostly = {
+       .id          =       "plug",
+       .priv_size   =       sizeof(struct plug_sched_data),
+       .enqueue     =       plug_enqueue,
+       .dequeue     =       plug_dequeue,
+       .peek        =       qdisc_peek_head,
+       .init        =       plug_init,
+       .change      =       plug_change,
+       .owner       =       THIS_MODULE,
+};
+
+static int __init plug_module_init(void)
+{
+       return register_qdisc(&plug_qdisc_ops);
+}
+
+static void __exit plug_module_exit(void)
+{
+       unregister_qdisc(&plug_qdisc_ops);
+}
+module_init(plug_module_init)
+module_exit(plug_module_exit)
+MODULE_LICENSE("GPL");
index 8eb87b1..e00441a 100644 (file)
@@ -157,39 +157,14 @@ u32 tipc_bclink_get_last_sent(void)
        return bcl->fsm_msg_cnt;
 }
 
-/**
- * bclink_set_gap - set gap according to contents of current deferred pkt queue
- *
- * Called with 'node' locked, bc_lock unlocked
- */
-
-static void bclink_set_gap(struct tipc_node *n_ptr)
-{
-       struct sk_buff *buf = n_ptr->bclink.deferred_head;
-
-       n_ptr->bclink.gap_after = n_ptr->bclink.gap_to =
-               mod(n_ptr->bclink.last_in);
-       if (unlikely(buf != NULL))
-               n_ptr->bclink.gap_to = mod(buf_seqno(buf) - 1);
-}
-
-/**
- * bclink_ack_allowed - test if ACK or NACK message can be sent at this moment
- *
- * This mechanism endeavours to prevent all nodes in network from trying
- * to ACK or NACK at the same time.
- *
- * Note: TIPC uses a different trigger to distribute ACKs than it does to
- *       distribute NACKs, but tries to use the same spacing (divide by 16).
- */
-
-static int bclink_ack_allowed(u32 n)
+static void bclink_update_last_sent(struct tipc_node *node, u32 seqno)
 {
-       return (n % TIPC_MIN_LINK_WIN) == tipc_own_tag;
+       node->bclink.last_sent = less_eq(node->bclink.last_sent, seqno) ?
+                                               seqno : node->bclink.last_sent;
 }
 
 
-/**
+/*
  * tipc_bclink_retransmit_to - get most recent node to request retransmission
  *
  * Called with bc_lock locked
@@ -281,7 +256,7 @@ void tipc_bclink_acknowledge(struct tipc_node *n_ptr, u32 acked)
                if (bcbuf_acks(crs) == 0) {
                        bcl->first_out = next;
                        bcl->out_queue_size--;
-                       buf_discard(crs);
+                       kfree_skb(crs);
                        released = 1;
                }
                crs = next;
@@ -300,140 +275,94 @@ exit:
        spin_unlock_bh(&bc_lock);
 }
 
-/**
- * bclink_send_ack - unicast an ACK msg
+/*
+ * tipc_bclink_update_link_state - update broadcast link state
  *
  * tipc_net_lock and node lock set
  */
 
-static void bclink_send_ack(struct tipc_node *n_ptr)
+void tipc_bclink_update_link_state(struct tipc_node *n_ptr, u32 last_sent)
 {
-       struct tipc_link *l_ptr = n_ptr->active_links[n_ptr->addr & 1];
+       struct sk_buff *buf;
 
-       if (l_ptr != NULL)
-               tipc_link_send_proto_msg(l_ptr, STATE_MSG, 0, 0, 0, 0, 0);
-}
+       /* Ignore "stale" link state info */
 
-/**
- * bclink_send_nack- broadcast a NACK msg
- *
- * tipc_net_lock and node lock set
- */
+       if (less_eq(last_sent, n_ptr->bclink.last_in))
+               return;
 
-static void bclink_send_nack(struct tipc_node *n_ptr)
-{
-       struct sk_buff *buf;
-       struct tipc_msg *msg;
+       /* Update link synchronization state; quit if in sync */
+
+       bclink_update_last_sent(n_ptr, last_sent);
+
+       if (n_ptr->bclink.last_sent == n_ptr->bclink.last_in)
+               return;
+
+       /* Update out-of-sync state; quit if loss is still unconfirmed */
+
+       if ((++n_ptr->bclink.oos_state) == 1) {
+               if (n_ptr->bclink.deferred_size < (TIPC_MIN_LINK_WIN / 2))
+                       return;
+               n_ptr->bclink.oos_state++;
+       }
 
-       if (!less(n_ptr->bclink.gap_after, n_ptr->bclink.gap_to))
+       /* Don't NACK if one has been recently sent (or seen) */
+
+       if (n_ptr->bclink.oos_state & 0x1)
                return;
 
+       /* Send NACK */
+
        buf = tipc_buf_acquire(INT_H_SIZE);
        if (buf) {
-               msg = buf_msg(buf);
+               struct tipc_msg *msg = buf_msg(buf);
+
                tipc_msg_init(msg, BCAST_PROTOCOL, STATE_MSG,
-                        INT_H_SIZE, n_ptr->addr);
+                             INT_H_SIZE, n_ptr->addr);
                msg_set_non_seq(msg, 1);
                msg_set_mc_netid(msg, tipc_net_id);
-               msg_set_bcast_ack(msg, mod(n_ptr->bclink.last_in));
-               msg_set_bcgap_after(msg, n_ptr->bclink.gap_after);
-               msg_set_bcgap_to(msg, n_ptr->bclink.gap_to);
-               msg_set_bcast_tag(msg, tipc_own_tag);
+               msg_set_bcast_ack(msg, n_ptr->bclink.last_in);
+               msg_set_bcgap_after(msg, n_ptr->bclink.last_in);
+               msg_set_bcgap_to(msg, n_ptr->bclink.deferred_head
+                                ? buf_seqno(n_ptr->bclink.deferred_head) - 1
+                                : n_ptr->bclink.last_sent);
 
+               spin_lock_bh(&bc_lock);
                tipc_bearer_send(&bcbearer->bearer, buf, NULL);
                bcl->stats.sent_nacks++;
-               buf_discard(buf);
-
-               /*
-                * Ensure we doesn't send another NACK msg to the node
-                * until 16 more deferred messages arrive from it
-                * (i.e. helps prevent all nodes from NACK'ing at same time)
-                */
+               spin_unlock_bh(&bc_lock);
+               kfree_skb(buf);
 
-               n_ptr->bclink.nack_sync = tipc_own_tag;
+               n_ptr->bclink.oos_state++;
        }
 }
 
-/**
- * tipc_bclink_check_gap - send a NACK if a sequence gap exists
+/*
+ * bclink_peek_nack - monitor retransmission requests sent by other nodes
  *
- * tipc_net_lock and node lock set
- */
-
-void tipc_bclink_check_gap(struct tipc_node *n_ptr, u32 last_sent)
-{
-       if (!n_ptr->bclink.supported ||
-           less_eq(last_sent, mod(n_ptr->bclink.last_in)))
-               return;
-
-       bclink_set_gap(n_ptr);
-       if (n_ptr->bclink.gap_after == n_ptr->bclink.gap_to)
-               n_ptr->bclink.gap_to = last_sent;
-       bclink_send_nack(n_ptr);
-}
-
-/**
- * tipc_bclink_peek_nack - process a NACK msg meant for another node
+ * Delay any upcoming NACK by this node if another node has already
+ * requested the first message this node is going to ask for.
  *
  * Only tipc_net_lock set.
  */
 
-static void tipc_bclink_peek_nack(u32 dest, u32 sender_tag, u32 gap_after, u32 gap_to)
+static void bclink_peek_nack(struct tipc_msg *msg)
 {
-       struct tipc_node *n_ptr = tipc_node_find(dest);
-       u32 my_after, my_to;
+       struct tipc_node *n_ptr = tipc_node_find(msg_destnode(msg));
 
-       if (unlikely(!n_ptr || !tipc_node_is_up(n_ptr)))
+       if (unlikely(!n_ptr))
                return;
+
        tipc_node_lock(n_ptr);
-       /*
-        * Modify gap to suppress unnecessary NACKs from this node
-        */
-       my_after = n_ptr->bclink.gap_after;
-       my_to = n_ptr->bclink.gap_to;
-
-       if (less_eq(gap_after, my_after)) {
-               if (less(my_after, gap_to) && less(gap_to, my_to))
-                       n_ptr->bclink.gap_after = gap_to;
-               else if (less_eq(my_to, gap_to))
-                       n_ptr->bclink.gap_to = n_ptr->bclink.gap_after;
-       } else if (less_eq(gap_after, my_to)) {
-               if (less_eq(my_to, gap_to))
-                       n_ptr->bclink.gap_to = gap_after;
-       } else {
-               /*
-                * Expand gap if missing bufs not in deferred queue:
-                */
-               struct sk_buff *buf = n_ptr->bclink.deferred_head;
-               u32 prev = n_ptr->bclink.gap_to;
 
-               for (; buf; buf = buf->next) {
-                       u32 seqno = buf_seqno(buf);
+       if (n_ptr->bclink.supported &&
+           (n_ptr->bclink.last_in != n_ptr->bclink.last_sent) &&
+           (n_ptr->bclink.last_in == msg_bcgap_after(msg)))
+               n_ptr->bclink.oos_state = 2;
 
-                       if (mod(seqno - prev) != 1) {
-                               buf = NULL;
-                               break;
-                       }
-                       if (seqno == gap_after)
-                               break;
-                       prev = seqno;
-               }
-               if (buf == NULL)
-                       n_ptr->bclink.gap_to = gap_after;
-       }
-       /*
-        * Some nodes may send a complementary NACK now:
-        */
-       if (bclink_ack_allowed(sender_tag + 1)) {
-               if (n_ptr->bclink.gap_to != n_ptr->bclink.gap_after) {
-                       bclink_send_nack(n_ptr);
-                       bclink_set_gap(n_ptr);
-               }
-       }
        tipc_node_unlock(n_ptr);
 }
 
-/**
+/*
  * tipc_bclink_send_msg - broadcast a packet to all nodes in cluster
  */
 
@@ -445,7 +374,7 @@ int tipc_bclink_send_msg(struct sk_buff *buf)
 
        if (!bclink->bcast_nodes.count) {
                res = msg_data_sz(buf_msg(buf));
-               buf_discard(buf);
+               kfree_skb(buf);
                goto exit;
        }
 
@@ -460,7 +389,33 @@ exit:
        return res;
 }
 
-/**
+/*
+ * bclink_accept_pkt - accept an incoming, in-sequence broadcast packet
+ *
+ * Called with both sending node's lock and bc_lock taken.
+ */
+
+static void bclink_accept_pkt(struct tipc_node *node, u32 seqno)
+{
+       bclink_update_last_sent(node, seqno);
+       node->bclink.last_in = seqno;
+       node->bclink.oos_state = 0;
+       bcl->stats.recv_info++;
+
+       /*
+        * Unicast an ACK periodically, ensuring that
+        * all nodes in the cluster don't ACK at the same time
+        */
+
+       if (((seqno - tipc_own_addr) % TIPC_MIN_LINK_WIN) == 0) {
+               tipc_link_send_proto_msg(
+                       node->active_links[node->addr & 1],
+                       STATE_MSG, 0, 0, 0, 0, 0);
+               bcl->stats.sent_acks++;
+       }
+}
+
+/*
  * tipc_bclink_recv_pkt - receive a broadcast packet, and deliver upwards
  *
  * tipc_net_lock is read_locked, no other locks set
@@ -472,7 +427,7 @@ void tipc_bclink_recv_pkt(struct sk_buff *buf)
        struct tipc_node *node;
        u32 next_in;
        u32 seqno;
-       struct sk_buff *deferred;
+       int deferred;
 
        /* Screen out unwanted broadcast messages */
 
@@ -487,6 +442,8 @@ void tipc_bclink_recv_pkt(struct sk_buff *buf)
        if (unlikely(!node->bclink.supported))
                goto unlock;
 
+       /* Handle broadcast protocol message */
+
        if (unlikely(msg_user(msg) == BCAST_PROTOCOL)) {
                if (msg_type(msg) != STATE_MSG)
                        goto unlock;
@@ -501,89 +458,118 @@ void tipc_bclink_recv_pkt(struct sk_buff *buf)
                        spin_unlock_bh(&bc_lock);
                } else {
                        tipc_node_unlock(node);
-                       tipc_bclink_peek_nack(msg_destnode(msg),
-                                             msg_bcast_tag(msg),
-                                             msg_bcgap_after(msg),
-                                             msg_bcgap_to(msg));
+                       bclink_peek_nack(msg);
                }
                goto exit;
        }
 
        /* Handle in-sequence broadcast message */
 
-receive:
-       next_in = mod(node->bclink.last_in + 1);
        seqno = msg_seqno(msg);
+       next_in = mod(node->bclink.last_in + 1);
 
        if (likely(seqno == next_in)) {
-               bcl->stats.recv_info++;
-               node->bclink.last_in++;
-               bclink_set_gap(node);
-               if (unlikely(bclink_ack_allowed(seqno))) {
-                       bclink_send_ack(node);
-                       bcl->stats.sent_acks++;
-               }
+receive:
+               /* Deliver message to destination */
+
                if (likely(msg_isdata(msg))) {
+                       spin_lock_bh(&bc_lock);
+                       bclink_accept_pkt(node, seqno);
+                       spin_unlock_bh(&bc_lock);
                        tipc_node_unlock(node);
                        if (likely(msg_mcast(msg)))
                                tipc_port_recv_mcast(buf, NULL);
                        else
-                               buf_discard(buf);
+                               kfree_skb(buf);
                } else if (msg_user(msg) == MSG_BUNDLER) {
+                       spin_lock_bh(&bc_lock);
+                       bclink_accept_pkt(node, seqno);
                        bcl->stats.recv_bundles++;
                        bcl->stats.recv_bundled += msg_msgcnt(msg);
+                       spin_unlock_bh(&bc_lock);
                        tipc_node_unlock(node);
                        tipc_link_recv_bundle(buf);
                } else if (msg_user(msg) == MSG_FRAGMENTER) {
+                       int ret = tipc_link_recv_fragment(&node->bclink.defragm,
+                                                     &buf, &msg);
+                       if (ret < 0)
+                               goto unlock;
+                       spin_lock_bh(&bc_lock);
+                       bclink_accept_pkt(node, seqno);
                        bcl->stats.recv_fragments++;
-                       if (tipc_link_recv_fragment(&node->bclink.defragm,
-                                                   &buf, &msg))
+                       if (ret > 0)
                                bcl->stats.recv_fragmented++;
+                       spin_unlock_bh(&bc_lock);
                        tipc_node_unlock(node);
                        tipc_net_route_msg(buf);
                } else if (msg_user(msg) == NAME_DISTRIBUTOR) {
+                       spin_lock_bh(&bc_lock);
+                       bclink_accept_pkt(node, seqno);
+                       spin_unlock_bh(&bc_lock);
                        tipc_node_unlock(node);
                        tipc_named_recv(buf);
                } else {
+                       spin_lock_bh(&bc_lock);
+                       bclink_accept_pkt(node, seqno);
+                       spin_unlock_bh(&bc_lock);
                        tipc_node_unlock(node);
-                       buf_discard(buf);
+                       kfree_skb(buf);
                }
                buf = NULL;
+
+               /* Determine new synchronization state */
+
                tipc_node_lock(node);
-               deferred = node->bclink.deferred_head;
-               if (deferred && (buf_seqno(deferred) == mod(next_in + 1))) {
-                       buf = deferred;
-                       msg = buf_msg(buf);
-                       node->bclink.deferred_head = deferred->next;
-                       goto receive;
-               }
-       } else if (less(next_in, seqno)) {
-               u32 gap_after = node->bclink.gap_after;
-               u32 gap_to = node->bclink.gap_to;
-
-               if (tipc_link_defer_pkt(&node->bclink.deferred_head,
-                                       &node->bclink.deferred_tail,
-                                       buf)) {
-                       node->bclink.nack_sync++;
-                       bcl->stats.deferred_recv++;
-                       if (seqno == mod(gap_after + 1))
-                               node->bclink.gap_after = seqno;
-                       else if (less(gap_after, seqno) && less(seqno, gap_to))
-                               node->bclink.gap_to = seqno;
+               if (unlikely(!tipc_node_is_up(node)))
+                       goto unlock;
+
+               if (node->bclink.last_in == node->bclink.last_sent)
+                       goto unlock;
+
+               if (!node->bclink.deferred_head) {
+                       node->bclink.oos_state = 1;
+                       goto unlock;
                }
+
+               msg = buf_msg(node->bclink.deferred_head);
+               seqno = msg_seqno(msg);
+               next_in = mod(next_in + 1);
+               if (seqno != next_in)
+                       goto unlock;
+
+               /* Take in-sequence message from deferred queue & deliver it */
+
+               buf = node->bclink.deferred_head;
+               node->bclink.deferred_head = buf->next;
+               node->bclink.deferred_size--;
+               goto receive;
+       }
+
+       /* Handle out-of-sequence broadcast message */
+
+       if (less(next_in, seqno)) {
+               deferred = tipc_link_defer_pkt(&node->bclink.deferred_head,
+                                              &node->bclink.deferred_tail,
+                                              buf);
+               node->bclink.deferred_size += deferred;
+               bclink_update_last_sent(node, seqno);
                buf = NULL;
-               if (bclink_ack_allowed(node->bclink.nack_sync)) {
-                       if (gap_to != gap_after)
-                               bclink_send_nack(node);
-                       bclink_set_gap(node);
-               }
-       } else {
+       } else
+               deferred = 0;
+
+       spin_lock_bh(&bc_lock);
+
+       if (deferred)
+               bcl->stats.deferred_recv++;
+       else
                bcl->stats.duplicates++;
-       }
+
+       spin_unlock_bh(&bc_lock);
+
 unlock:
        tipc_node_unlock(node);
 exit:
-       buf_discard(buf);
+       kfree_skb(buf);
 }
 
 u32 tipc_bclink_acks_missing(struct tipc_node *n_ptr)
index b009666..5571394 100644 (file)
@@ -96,7 +96,7 @@ int  tipc_bclink_send_msg(struct sk_buff *buf);
 void tipc_bclink_recv_pkt(struct sk_buff *buf);
 u32  tipc_bclink_get_last_sent(void);
 u32  tipc_bclink_acks_missing(struct tipc_node *n_ptr);
-void tipc_bclink_check_gap(struct tipc_node *n_ptr, u32 seqno);
+void tipc_bclink_update_link_state(struct tipc_node *n_ptr, u32 last_sent);
 int  tipc_bclink_stats(char *stats_buf, const u32 buf_size);
 int  tipc_bclink_reset_stats(void);
 int  tipc_bclink_set_queue_limits(u32 limit);
index 329fb65..5dfd89c 100644 (file)
@@ -435,7 +435,7 @@ int tipc_enable_bearer(const char *name, u32 disc_domain, u32 priority)
        u32 i;
        int res = -EINVAL;
 
-       if (tipc_mode != TIPC_NET_MODE) {
+       if (!tipc_own_addr) {
                warn("Bearer <%s> rejected, not supported in standalone mode\n",
                     name);
                return -ENOPROTOOPT;
@@ -456,8 +456,7 @@ int tipc_enable_bearer(const char *name, u32 disc_domain, u32 priority)
                warn("Bearer <%s> rejected, illegal discovery domain\n", name);
                return -EINVAL;
        }
-       if ((priority < TIPC_MIN_LINK_PRI ||
-            priority > TIPC_MAX_LINK_PRI) &&
+       if ((priority > TIPC_MAX_LINK_PRI) &&
            (priority != TIPC_MEDIA_LINK_PRI)) {
                warn("Bearer <%s> rejected, illegal priority\n", name);
                return -EINVAL;
index 4785bf2..f76d3b1 100644 (file)
@@ -179,7 +179,7 @@ static struct sk_buff *cfg_set_own_addr(void)
        if (!tipc_addr_node_valid(addr))
                return tipc_cfg_reply_error_string(TIPC_CFG_INVALID_VALUE
                                                   " (node address)");
-       if (tipc_mode == TIPC_NET_MODE)
+       if (tipc_own_addr)
                return tipc_cfg_reply_error_string(TIPC_CFG_NOT_SUPPORTED
                                                   " (cannot change node address once assigned)");
 
@@ -218,7 +218,7 @@ static struct sk_buff *cfg_set_max_publications(void)
                return tipc_cfg_reply_error_string(TIPC_CFG_TLV_ERROR);
 
        value = ntohl(*(__be32 *)TLV_DATA(req_tlv_area));
-       if (value != delimit(value, 1, 65535))
+       if (value < 1 || value > 65535)
                return tipc_cfg_reply_error_string(TIPC_CFG_INVALID_VALUE
                                                   " (max publications must be 1-65535)");
        tipc_max_publications = value;
@@ -233,7 +233,7 @@ static struct sk_buff *cfg_set_max_subscriptions(void)
                return tipc_cfg_reply_error_string(TIPC_CFG_TLV_ERROR);
 
        value = ntohl(*(__be32 *)TLV_DATA(req_tlv_area));
-       if (value != delimit(value, 1, 65535))
+       if (value < 1 || value > 65535)
                return tipc_cfg_reply_error_string(TIPC_CFG_INVALID_VALUE
                                                   " (max subscriptions must be 1-65535");
        tipc_max_subscriptions = value;
@@ -249,14 +249,11 @@ static struct sk_buff *cfg_set_max_ports(void)
        value = ntohl(*(__be32 *)TLV_DATA(req_tlv_area));
        if (value == tipc_max_ports)
                return tipc_cfg_reply_none();
-       if (value != delimit(value, 127, 65535))
+       if (value < 127 || value > 65535)
                return tipc_cfg_reply_error_string(TIPC_CFG_INVALID_VALUE
                                                   " (max ports must be 127-65535)");
-       if (tipc_mode != TIPC_NOT_RUNNING)
-               return tipc_cfg_reply_error_string(TIPC_CFG_NOT_SUPPORTED
-                       " (cannot change max ports while TIPC is active)");
-       tipc_max_ports = value;
-       return tipc_cfg_reply_none();
+       return tipc_cfg_reply_error_string(TIPC_CFG_NOT_SUPPORTED
+               " (cannot change max ports while TIPC is active)");
 }
 
 static struct sk_buff *cfg_set_netid(void)
@@ -268,10 +265,10 @@ static struct sk_buff *cfg_set_netid(void)
        value = ntohl(*(__be32 *)TLV_DATA(req_tlv_area));
        if (value == tipc_net_id)
                return tipc_cfg_reply_none();
-       if (value != delimit(value, 1, 9999))
+       if (value < 1 || value > 9999)
                return tipc_cfg_reply_error_string(TIPC_CFG_INVALID_VALUE
                                                   " (network id must be 1-9999)");
-       if (tipc_mode == TIPC_NET_MODE)
+       if (tipc_own_addr)
                return tipc_cfg_reply_error_string(TIPC_CFG_NOT_SUPPORTED
                        " (cannot change network id once TIPC has joined a network)");
        tipc_net_id = value;
@@ -481,7 +478,7 @@ int tipc_cfg_init(void)
 
        seq.type = TIPC_CFG_SRV;
        seq.lower = seq.upper = tipc_own_addr;
-       res = tipc_nametbl_publish_rsv(config_port_ref, TIPC_ZONE_SCOPE, &seq);
+       res = tipc_publish(config_port_ref, TIPC_ZONE_SCOPE, &seq);
        if (res)
                goto failed;
 
index 2691cd5..68eba03 100644 (file)
@@ -53,7 +53,6 @@
 
 /* global variables used by multiple sub-systems within TIPC */
 
-int tipc_mode = TIPC_NOT_RUNNING;
 int tipc_random;
 
 const char tipc_alphabet[] =
@@ -125,11 +124,6 @@ int tipc_core_start_net(unsigned long addr)
 
 static void tipc_core_stop(void)
 {
-       if (tipc_mode != TIPC_NODE_MODE)
-               return;
-
-       tipc_mode = TIPC_NOT_RUNNING;
-
        tipc_netlink_stop();
        tipc_handler_stop();
        tipc_cfg_stop();
@@ -148,11 +142,7 @@ static int tipc_core_start(void)
 {
        int res;
 
-       if (tipc_mode != TIPC_NOT_RUNNING)
-               return -ENOPROTOOPT;
-
        get_random_bytes(&tipc_random, sizeof(tipc_random));
-       tipc_mode = TIPC_NODE_MODE;
 
        res = tipc_handler_start();
        if (!res)
index 2761af3..13837e0 100644 (file)
@@ -130,13 +130,6 @@ void tipc_msg_dbg(struct print_buf *, struct tipc_msg *, const char *);
 #define ELINKCONG EAGAIN       /* link congestion <=> resource unavailable */
 
 /*
- * TIPC operating mode routines
- */
-#define TIPC_NOT_RUNNING  0
-#define TIPC_NODE_MODE    1
-#define TIPC_NET_MODE     2
-
-/*
  * Global configuration variables
  */
 
@@ -151,7 +144,6 @@ extern int tipc_remote_management;
  * Other global variables
  */
 
-extern int tipc_mode;
 extern int tipc_random;
 extern const char tipc_alphabet[];
 
@@ -168,16 +160,6 @@ extern void tipc_netlink_stop(void);
 extern int  tipc_socket_init(void);
 extern void tipc_socket_stop(void);
 
-static inline int delimit(int val, int min, int max)
-{
-       if (val > max)
-               return max;
-       if (val < min)
-               return min;
-       return val;
-}
-
-
 /*
  * TIPC timer and signal code
  */
@@ -279,28 +261,4 @@ static inline struct tipc_msg *buf_msg(struct sk_buff *skb)
 
 extern struct sk_buff *tipc_buf_acquire(u32 size);
 
-/**
- * buf_discard - frees a TIPC message buffer
- * @skb: message buffer
- *
- * Frees a message buffer.  If passed NULL, just returns.
- */
-
-static inline void buf_discard(struct sk_buff *skb)
-{
-       kfree_skb(skb);
-}
-
-/**
- * buf_linearize - convert a TIPC message buffer into a single contiguous piece
- * @skb: message buffer
- *
- * Returns 0 on success.
- */
-
-static inline int buf_linearize(struct sk_buff *skb)
-{
-       return skb_linearize(skb);
-}
-
 #endif
index a00e5f8..c630a21 100644 (file)
@@ -82,6 +82,7 @@ static struct sk_buff *tipc_disc_init_msg(u32 type,
                msg = buf_msg(buf);
                tipc_msg_init(msg, LINK_CONFIG, type, INT_H_SIZE, dest_domain);
                msg_set_non_seq(msg, 1);
+               msg_set_node_sig(msg, tipc_random);
                msg_set_dest_domain(msg, dest_domain);
                msg_set_bc_netid(msg, tipc_net_id);
                b_ptr->media->addr2msg(&b_ptr->addr, msg_media_addr(msg));
@@ -121,20 +122,22 @@ void tipc_disc_recv_msg(struct sk_buff *buf, struct tipc_bearer *b_ptr)
 {
        struct tipc_node *n_ptr;
        struct tipc_link *link;
-       struct tipc_media_addr media_addr, *addr;
+       struct tipc_media_addr media_addr;
        struct sk_buff *rbuf;
        struct tipc_msg *msg = buf_msg(buf);
        u32 dest = msg_dest_domain(msg);
        u32 orig = msg_prevnode(msg);
        u32 net_id = msg_bc_netid(msg);
        u32 type = msg_type(msg);
+       u32 signature = msg_node_sig(msg);
+       int addr_mismatch;
        int link_fully_up;
 
        media_addr.broadcast = 1;
        b_ptr->media->msg2addr(&media_addr, msg_media_addr(msg));
-       buf_discard(buf);
+       kfree_skb(buf);
 
-       /* Validate discovery message from requesting node */
+       /* Ensure message from node is valid and communication is permitted */
        if (net_id != tipc_net_id)
                return;
        if (media_addr.broadcast)
@@ -162,15 +165,50 @@ void tipc_disc_recv_msg(struct sk_buff *buf, struct tipc_bearer *b_ptr)
        }
        tipc_node_lock(n_ptr);
 
+       /* Prepare to validate requesting node's signature and media address */
        link = n_ptr->links[b_ptr->identity];
+       addr_mismatch = (link != NULL) &&
+               memcmp(&link->media_addr, &media_addr, sizeof(media_addr));
 
-       /* Create a link endpoint for this bearer, if necessary */
-       if (!link) {
-               link = tipc_link_create(n_ptr, b_ptr, &media_addr);
-               if (!link) {
+       /*
+        * Ensure discovery message's signature is correct
+        *
+        * If signature is incorrect and there is no working link to the node,
+        * accept the new signature but invalidate all existing links to the
+        * node so they won't re-activate without a new discovery message.
+        *
+        * If signature is incorrect and the requested link to the node is
+        * working, accept the new signature. (This is an instance of delayed
+        * rediscovery, where a link endpoint was able to re-establish contact
+        * with its peer endpoint on a node that rebooted before receiving a
+        * discovery message from that node.)
+        *
+        * If signature is incorrect and there is a working link to the node
+        * that is not the requested link, reject the request (must be from
+        * a duplicate node).
+        */
+       if (signature != n_ptr->signature) {
+               if (n_ptr->working_links == 0) {
+                       struct tipc_link *curr_link;
+                       int i;
+
+                       for (i = 0; i < MAX_BEARERS; i++) {
+                               curr_link = n_ptr->links[i];
+                               if (curr_link) {
+                                       memset(&curr_link->media_addr, 0,
+                                              sizeof(media_addr));
+                                       tipc_link_reset(curr_link);
+                               }
+                       }
+                       addr_mismatch = (link != NULL);
+               } else if (tipc_link_is_up(link) && !addr_mismatch) {
+                       /* delayed rediscovery */
+               } else {
+                       disc_dupl_alert(b_ptr, orig, &media_addr);
                        tipc_node_unlock(n_ptr);
                        return;
                }
+               n_ptr->signature = signature;
        }
 
        /*
@@ -183,17 +221,26 @@ void tipc_disc_recv_msg(struct sk_buff *buf, struct tipc_bearer *b_ptr)
         * the new media address and reset the link to ensure it starts up
         * cleanly.
         */
-       addr = &link->media_addr;
-       if (memcmp(addr, &media_addr, sizeof(*addr))) {
-               if (tipc_link_is_up(link) || (!link->started)) {
+
+       if (addr_mismatch) {
+               if (tipc_link_is_up(link)) {
                        disc_dupl_alert(b_ptr, orig, &media_addr);
                        tipc_node_unlock(n_ptr);
                        return;
+               } else {
+                       memcpy(&link->media_addr, &media_addr,
+                              sizeof(media_addr));
+                       tipc_link_reset(link);
+               }
+       }
+
+       /* Create a link endpoint for this bearer, if necessary */
+       if (!link) {
+               link = tipc_link_create(n_ptr, b_ptr, &media_addr);
+               if (!link) {
+                       tipc_node_unlock(n_ptr);
+                       return;
                }
-               warn("Resetting link <%s>, peer interface address changed\n",
-                    link->name);
-               memcpy(addr, &media_addr, sizeof(*addr));
-               tipc_link_reset(link);
        }
 
        /* Accept discovery message & send response, if necessary */
@@ -203,7 +250,7 @@ void tipc_disc_recv_msg(struct sk_buff *buf, struct tipc_bearer *b_ptr)
                rbuf = tipc_disc_init_msg(DSC_RESP_MSG, orig, b_ptr);
                if (rbuf) {
                        b_ptr->media->send_msg(rbuf, b_ptr, &media_addr);
-                       buf_discard(rbuf);
+                       kfree_skb(rbuf);
                }
        }
 
@@ -349,7 +396,7 @@ void tipc_disc_delete(struct tipc_link_req *req)
 {
        k_cancel_timer(&req->timer);
        k_term_timer(&req->timer);
-       buf_discard(req->buf);
+       kfree_skb(req->buf);
        kfree(req);
 }
 
index ac1832a..b4b9b30 100644 (file)
@@ -484,7 +484,7 @@ static void link_release_outqueue(struct tipc_link *l_ptr)
 
        while (buf) {
                next = buf->next;
-               buf_discard(buf);
+               kfree_skb(buf);
                buf = next;
        }
        l_ptr->first_out = NULL;
@@ -503,7 +503,7 @@ void tipc_link_reset_fragments(struct tipc_link *l_ptr)
 
        while (buf) {
                next = buf->next;
-               buf_discard(buf);
+               kfree_skb(buf);
                buf = next;
        }
        l_ptr->defragm_buf = NULL;
@@ -522,20 +522,20 @@ void tipc_link_stop(struct tipc_link *l_ptr)
        buf = l_ptr->oldest_deferred_in;
        while (buf) {
                next = buf->next;
-               buf_discard(buf);
+               kfree_skb(buf);
                buf = next;
        }
 
        buf = l_ptr->first_out;
        while (buf) {
                next = buf->next;
-               buf_discard(buf);
+               kfree_skb(buf);
                buf = next;
        }
 
        tipc_link_reset_fragments(l_ptr);
 
-       buf_discard(l_ptr->proto_msg_queue);
+       kfree_skb(l_ptr->proto_msg_queue);
        l_ptr->proto_msg_queue = NULL;
 }
 
@@ -571,12 +571,12 @@ void tipc_link_reset(struct tipc_link *l_ptr)
        /* Clean up all queues: */
 
        link_release_outqueue(l_ptr);
-       buf_discard(l_ptr->proto_msg_queue);
+       kfree_skb(l_ptr->proto_msg_queue);
        l_ptr->proto_msg_queue = NULL;
        buf = l_ptr->oldest_deferred_in;
        while (buf) {
                struct sk_buff *next = buf->next;
-               buf_discard(buf);
+               kfree_skb(buf);
                buf = next;
        }
        if (!list_empty(&l_ptr->waiting_ports))
@@ -810,7 +810,7 @@ static int link_bundle_buf(struct tipc_link *l_ptr,
        skb_copy_to_linear_data_offset(bundler, to_pos, buf->data, size);
        msg_set_size(bundler_msg, to_pos + size);
        msg_set_msgcnt(bundler_msg, msg_msgcnt(bundler_msg) + 1);
-       buf_discard(buf);
+       kfree_skb(buf);
        l_ptr->stats.sent_bundled++;
        return 1;
 }
@@ -871,17 +871,15 @@ int tipc_link_send_buf(struct tipc_link *l_ptr, struct sk_buff *buf)
        u32 queue_limit = l_ptr->queue_limit[imp];
        u32 max_packet = l_ptr->max_pkt;
 
-       msg_set_prevnode(msg, tipc_own_addr);   /* If routed message */
-
        /* Match msg importance against queue limits: */
 
        if (unlikely(queue_size >= queue_limit)) {
                if (imp <= TIPC_CRITICAL_IMPORTANCE) {
                        link_schedule_port(l_ptr, msg_origport(msg), size);
-                       buf_discard(buf);
+                       kfree_skb(buf);
                        return -ELINKCONG;
                }
-               buf_discard(buf);
+               kfree_skb(buf);
                if (imp > CONN_MANAGER) {
                        warn("Resetting link <%s>, send queue full", l_ptr->name);
                        tipc_link_reset(l_ptr);
@@ -968,10 +966,10 @@ int tipc_link_send(struct sk_buff *buf, u32 dest, u32 selector)
                if (l_ptr)
                        res = tipc_link_send_buf(l_ptr, buf);
                else
-                       buf_discard(buf);
+                       kfree_skb(buf);
                tipc_node_unlock(n_ptr);
        } else {
-               buf_discard(buf);
+               kfree_skb(buf);
        }
        read_unlock_bh(&tipc_net_lock);
        return res;
@@ -1018,7 +1016,7 @@ void tipc_link_send_names(struct list_head *message_list, u32 dest)
 
        list_for_each_safe(buf, temp_buf, ((struct sk_buff *)message_list)) {
                list_del((struct list_head *)buf);
-               buf_discard(buf);
+               kfree_skb(buf);
        }
 }
 
@@ -1262,7 +1260,7 @@ again:
 error:
                                for (; buf_chain; buf_chain = buf) {
                                        buf = buf_chain->next;
-                                       buf_discard(buf_chain);
+                                       kfree_skb(buf_chain);
                                }
                                return -EFAULT;
                        }
@@ -1316,7 +1314,7 @@ error:
                        tipc_node_unlock(node);
                        for (; buf_chain; buf_chain = buf) {
                                buf = buf_chain->next;
-                               buf_discard(buf_chain);
+                               kfree_skb(buf_chain);
                        }
                        goto again;
                }
@@ -1324,7 +1322,7 @@ error:
 reject:
                for (; buf_chain; buf_chain = buf) {
                        buf = buf_chain->next;
-                       buf_discard(buf_chain);
+                       kfree_skb(buf_chain);
                }
                return tipc_port_reject_sections(sender, hdr, msg_sect, num_sect,
                                                 total_len, TIPC_ERR_NO_NODE);
@@ -1390,7 +1388,7 @@ u32 tipc_link_push_packet(struct tipc_link *l_ptr)
                msg_set_bcast_ack(buf_msg(buf), l_ptr->owner->bclink.last_in);
                if (tipc_bearer_send(l_ptr->b_ptr, buf, &l_ptr->media_addr)) {
                        l_ptr->unacked_window = 0;
-                       buf_discard(buf);
+                       kfree_skb(buf);
                        l_ptr->proto_msg_queue = NULL;
                        return 0;
                } else {
@@ -1501,13 +1499,13 @@ static void link_retransmit_failure(struct tipc_link *l_ptr,
                tipc_node_lock(n_ptr);
 
                tipc_addr_string_fill(addr_string, n_ptr->addr);
-               info("Multicast link info for %s\n", addr_string);
+               info("Broadcast link info for %s\n", addr_string);
+               info("Supportable: %d,  ", n_ptr->bclink.supportable);
                info("Supported: %d,  ", n_ptr->bclink.supported);
                info("Acked: %u\n", n_ptr->bclink.acked);
                info("Last in: %u,  ", n_ptr->bclink.last_in);
-               info("Gap after: %u,  ", n_ptr->bclink.gap_after);
-               info("Gap to: %u\n", n_ptr->bclink.gap_to);
-               info("Nack sync: %u\n\n", n_ptr->bclink.nack_sync);
+               info("Oos state: %u,  ", n_ptr->bclink.oos_state);
+               info("Last sent: %u\n", n_ptr->bclink.last_sent);
 
                tipc_k_signal((Handler)link_reset_all, (unsigned long)n_ptr->addr);
 
@@ -1679,7 +1677,7 @@ void tipc_recv_msg(struct sk_buff *head, struct tipc_bearer *b_ptr)
 
                /* Ensure message data is a single contiguous unit */
 
-               if (unlikely(buf_linearize(buf)))
+               if (unlikely(skb_linearize(buf)))
                        goto cont;
 
                /* Handle arrival of a non-unicast link message */
@@ -1736,7 +1734,7 @@ void tipc_recv_msg(struct sk_buff *head, struct tipc_bearer *b_ptr)
 
                /* Release acked messages */
 
-               if (tipc_node_is_up(n_ptr) && n_ptr->bclink.supported)
+               if (n_ptr->bclink.supported)
                        tipc_bclink_acknowledge(n_ptr, msg_bcast_ack(msg));
 
                crs = l_ptr->first_out;
@@ -1744,7 +1742,7 @@ void tipc_recv_msg(struct sk_buff *head, struct tipc_bearer *b_ptr)
                       less_eq(buf_seqno(crs), ackd)) {
                        struct sk_buff *next = crs->next;
 
-                       buf_discard(crs);
+                       kfree_skb(crs);
                        crs = next;
                        released++;
                }
@@ -1773,52 +1771,56 @@ protocol_check:
                                if (unlikely(l_ptr->oldest_deferred_in))
                                        head = link_insert_deferred_queue(l_ptr,
                                                                          head);
-                               if (likely(msg_is_dest(msg, tipc_own_addr))) {
 deliver:
-                                       if (likely(msg_isdata(msg))) {
-                                               tipc_node_unlock(n_ptr);
-                                               tipc_port_recv_msg(buf);
-                                               continue;
+                               if (likely(msg_isdata(msg))) {
+                                       tipc_node_unlock(n_ptr);
+                                       tipc_port_recv_msg(buf);
+                                       continue;
+                               }
+                               switch (msg_user(msg)) {
+                                       int ret;
+                               case MSG_BUNDLER:
+                                       l_ptr->stats.recv_bundles++;
+                                       l_ptr->stats.recv_bundled +=
+                                               msg_msgcnt(msg);
+                                       tipc_node_unlock(n_ptr);
+                                       tipc_link_recv_bundle(buf);
+                                       continue;
+                               case NAME_DISTRIBUTOR:
+                                       tipc_node_unlock(n_ptr);
+                                       tipc_named_recv(buf);
+                                       continue;
+                               case CONN_MANAGER:
+                                       tipc_node_unlock(n_ptr);
+                                       tipc_port_recv_proto_msg(buf);
+                                       continue;
+                               case MSG_FRAGMENTER:
+                                       l_ptr->stats.recv_fragments++;
+                                       ret = tipc_link_recv_fragment(
+                                               &l_ptr->defragm_buf,
+                                               &buf, &msg);
+                                       if (ret == 1) {
+                                               l_ptr->stats.recv_fragmented++;
+                                               goto deliver;
                                        }
-                                       switch (msg_user(msg)) {
-                                       case MSG_BUNDLER:
-                                               l_ptr->stats.recv_bundles++;
-                                               l_ptr->stats.recv_bundled +=
-                                                       msg_msgcnt(msg);
-                                               tipc_node_unlock(n_ptr);
-                                               tipc_link_recv_bundle(buf);
-                                               continue;
-                                       case NAME_DISTRIBUTOR:
-                                               tipc_node_unlock(n_ptr);
-                                               tipc_named_recv(buf);
-                                               continue;
-                                       case CONN_MANAGER:
-                                               tipc_node_unlock(n_ptr);
-                                               tipc_port_recv_proto_msg(buf);
-                                               continue;
-                                       case MSG_FRAGMENTER:
-                                               l_ptr->stats.recv_fragments++;
-                                               if (tipc_link_recv_fragment(&l_ptr->defragm_buf,
-                                                                           &buf, &msg)) {
-                                                       l_ptr->stats.recv_fragmented++;
+                                       if (ret == -1)
+                                               l_ptr->next_in_no--;
+                                       break;
+                               case CHANGEOVER_PROTOCOL:
+                                       type = msg_type(msg);
+                                       if (link_recv_changeover_msg(&l_ptr,
+                                                                    &buf)) {
+                                               msg = buf_msg(buf);
+                                               seq_no = msg_seqno(msg);
+                                               if (type == ORIGINAL_MSG)
                                                        goto deliver;
-                                               }
-                                               break;
-                                       case CHANGEOVER_PROTOCOL:
-                                               type = msg_type(msg);
-                                               if (link_recv_changeover_msg(&l_ptr, &buf)) {
-                                                       msg = buf_msg(buf);
-                                                       seq_no = msg_seqno(msg);
-                                                       if (type == ORIGINAL_MSG)
-                                                               goto deliver;
-                                                       goto protocol_check;
-                                               }
-                                               break;
-                                       default:
-                                               buf_discard(buf);
-                                               buf = NULL;
-                                               break;
+                                               goto protocol_check;
                                        }
+                                       break;
+                               default:
+                                       kfree_skb(buf);
+                                       buf = NULL;
+                                       break;
                                }
                                tipc_node_unlock(n_ptr);
                                tipc_net_route_msg(buf);
@@ -1847,23 +1849,22 @@ deliver:
                }
                tipc_node_unlock(n_ptr);
 cont:
-               buf_discard(buf);
+               kfree_skb(buf);
        }
        read_unlock_bh(&tipc_net_lock);
 }
 
 /*
- * link_defer_buf(): Sort a received out-of-sequence packet
- *                   into the deferred reception queue.
- * Returns the increase of the queue length,i.e. 0 or 1
+ * tipc_link_defer_pkt - Add out-of-sequence message to deferred reception queue
+ *
+ * Returns increase in queue length (i.e. 0 or 1)
  */
 
-u32 tipc_link_defer_pkt(struct sk_buff **head,
-                       struct sk_buff **tail,
+u32 tipc_link_defer_pkt(struct sk_buff **head, struct sk_buff **tail,
                        struct sk_buff *buf)
 {
-       struct sk_buff *prev = NULL;
-       struct sk_buff *crs = *head;
+       struct sk_buff *queue_buf;
+       struct sk_buff **prev;
        u32 seq_no = buf_seqno(buf);
 
        buf->next = NULL;
@@ -1881,31 +1882,30 @@ u32 tipc_link_defer_pkt(struct sk_buff **head,
                return 1;
        }
 
-       /* Scan through queue and sort it in */
-       do {
-               struct tipc_msg *msg = buf_msg(crs);
+       /* Locate insertion point in queue, then insert; discard if duplicate */
+       prev = head;
+       queue_buf = *head;
+       for (;;) {
+               u32 curr_seqno = buf_seqno(queue_buf);
 
-               if (less(seq_no, msg_seqno(msg))) {
-                       buf->next = crs;
-                       if (prev)
-                               prev->next = buf;
-                       else
-                               *head = buf;
-                       return 1;
+               if (seq_no == curr_seqno) {
+                       kfree_skb(buf);
+                       return 0;
                }
-               if (seq_no == msg_seqno(msg))
+
+               if (less(seq_no, curr_seqno))
                        break;
-               prev = crs;
-               crs = crs->next;
-       } while (crs);
 
-       /* Message is a duplicate of an existing message */
+               prev = &queue_buf->next;
+               queue_buf = queue_buf->next;
+       }
 
-       buf_discard(buf);
-       return 0;
+       buf->next = queue_buf;
+       *prev = buf;
+       return 1;
 }
 
-/**
+/*
  * link_handle_out_of_seq_msg - handle arrival of out-of-sequence packet
  */
 
@@ -1930,7 +1930,7 @@ static void link_handle_out_of_seq_msg(struct tipc_link *l_ptr,
 
        if (less(seq_no, mod(l_ptr->next_in_no))) {
                l_ptr->stats.duplicates++;
-               buf_discard(buf);
+               kfree_skb(buf);
                return;
        }
 
@@ -1956,6 +1956,13 @@ void tipc_link_send_proto_msg(struct tipc_link *l_ptr, u32 msg_typ,
        u32 msg_size = sizeof(l_ptr->proto_msg);
        int r_flag;
 
+       /* Discard any previous message that was deferred due to congestion */
+
+       if (l_ptr->proto_msg_queue) {
+               kfree_skb(l_ptr->proto_msg_queue);
+               l_ptr->proto_msg_queue = NULL;
+       }
+
        if (link_blocked(l_ptr))
                return;
 
@@ -1964,9 +1971,11 @@ void tipc_link_send_proto_msg(struct tipc_link *l_ptr, u32 msg_typ,
        if ((l_ptr->owner->block_setup) && (msg_typ != RESET_MSG))
                return;
 
+       /* Create protocol message with "out-of-sequence" sequence number */
+
        msg_set_type(msg, msg_typ);
        msg_set_net_plane(msg, l_ptr->b_ptr->net_plane);
-       msg_set_bcast_ack(msg, mod(l_ptr->owner->bclink.last_in));
+       msg_set_bcast_ack(msg, l_ptr->owner->bclink.last_in);
        msg_set_last_bcast(msg, tipc_bclink_get_last_sent());
 
        if (msg_typ == STATE_MSG) {
@@ -2020,44 +2029,36 @@ void tipc_link_send_proto_msg(struct tipc_link *l_ptr, u32 msg_typ,
        r_flag = (l_ptr->owner->working_links > tipc_link_is_up(l_ptr));
        msg_set_redundant_link(msg, r_flag);
        msg_set_linkprio(msg, l_ptr->priority);
-
-       /* Ensure sequence number will not fit : */
+       msg_set_size(msg, msg_size);
 
        msg_set_seqno(msg, mod(l_ptr->next_out_no + (0xffff/2)));
 
-       /* Congestion? */
-
-       if (tipc_bearer_congested(l_ptr->b_ptr, l_ptr)) {
-               if (!l_ptr->proto_msg_queue) {
-                       l_ptr->proto_msg_queue =
-                               tipc_buf_acquire(sizeof(l_ptr->proto_msg));
-               }
-               buf = l_ptr->proto_msg_queue;
-               if (!buf)
-                       return;
-               skb_copy_to_linear_data(buf, msg, sizeof(l_ptr->proto_msg));
-               return;
-       }
-
-       /* Message can be sent */
-
        buf = tipc_buf_acquire(msg_size);
        if (!buf)
                return;
 
        skb_copy_to_linear_data(buf, msg, sizeof(l_ptr->proto_msg));
-       msg_set_size(buf_msg(buf), msg_size);
 
-       if (tipc_bearer_send(l_ptr->b_ptr, buf, &l_ptr->media_addr)) {
-               l_ptr->unacked_window = 0;
-               buf_discard(buf);
+       /* Defer message if bearer is already congested */
+
+       if (tipc_bearer_congested(l_ptr->b_ptr, l_ptr)) {
+               l_ptr->proto_msg_queue = buf;
                return;
        }
 
-       /* New congestion */
-       tipc_bearer_schedule(l_ptr->b_ptr, l_ptr);
-       l_ptr->proto_msg_queue = buf;
-       l_ptr->stats.bearer_congs++;
+       /* Defer message if attempting to send results in bearer congestion */
+
+       if (!tipc_bearer_send(l_ptr->b_ptr, buf, &l_ptr->media_addr)) {
+               tipc_bearer_schedule(l_ptr->b_ptr, l_ptr);
+               l_ptr->proto_msg_queue = buf;
+               l_ptr->stats.bearer_congs++;
+               return;
+       }
+
+       /* Discard message if it was sent successfully */
+
+       l_ptr->unacked_window = 0;
+       kfree_skb(buf);
 }
 
 /*
@@ -2105,6 +2106,8 @@ static void link_recv_proto_msg(struct tipc_link *l_ptr, struct sk_buff *buf)
                        l_ptr->owner->block_setup = WAIT_NODE_DOWN;
                }
 
+               link_state_event(l_ptr, RESET_MSG);
+
                /* fall thru' */
        case ACTIVATE_MSG:
                /* Update link settings according other endpoint's values */
@@ -2127,16 +2130,22 @@ static void link_recv_proto_msg(struct tipc_link *l_ptr, struct sk_buff *buf)
                } else {
                        l_ptr->max_pkt = l_ptr->max_pkt_target;
                }
-               l_ptr->owner->bclink.supported = (max_pkt_info != 0);
+               l_ptr->owner->bclink.supportable = (max_pkt_info != 0);
 
-               link_state_event(l_ptr, msg_type(msg));
+               /* Synchronize broadcast link info, if not done previously */
+
+               if (!tipc_node_is_up(l_ptr->owner)) {
+                       l_ptr->owner->bclink.last_sent =
+                               l_ptr->owner->bclink.last_in =
+                               msg_last_bcast(msg);
+                       l_ptr->owner->bclink.oos_state = 0;
+               }
 
                l_ptr->peer_session = msg_session(msg);
                l_ptr->peer_bearer_id = msg_bearer_id(msg);
 
-               /* Synchronize broadcast sequence numbers */
-               if (!tipc_node_redundant_links(l_ptr->owner))
-                       l_ptr->owner->bclink.last_in = mod(msg_last_bcast(msg));
+               if (msg_type(msg) == ACTIVATE_MSG)
+                       link_state_event(l_ptr, ACTIVATE_MSG);
                break;
        case STATE_MSG:
 
@@ -2177,7 +2186,9 @@ static void link_recv_proto_msg(struct tipc_link *l_ptr, struct sk_buff *buf)
 
                /* Protocol message before retransmits, reduce loss risk */
 
-               tipc_bclink_check_gap(l_ptr->owner, msg_last_bcast(msg));
+               if (l_ptr->owner->bclink.supported)
+                       tipc_bclink_update_link_state(l_ptr->owner,
+                                                     msg_last_bcast(msg));
 
                if (rec_gap || (msg_probe(msg))) {
                        tipc_link_send_proto_msg(l_ptr, STATE_MSG,
@@ -2191,7 +2202,7 @@ static void link_recv_proto_msg(struct tipc_link *l_ptr, struct sk_buff *buf)
                break;
        }
 exit:
-       buf_discard(buf);
+       kfree_skb(buf);
 }
 
 
@@ -2389,7 +2400,7 @@ static int link_recv_changeover_msg(struct tipc_link **l_ptr,
                        warn("Link changeover error, duplicate msg dropped\n");
                        goto exit;
                }
-               buf_discard(tunnel_buf);
+               kfree_skb(tunnel_buf);
                return 1;
        }
 
@@ -2421,7 +2432,7 @@ static int link_recv_changeover_msg(struct tipc_link **l_ptr,
        } else {
                *buf = buf_extract(tunnel_buf, INT_H_SIZE);
                if (*buf != NULL) {
-                       buf_discard(tunnel_buf);
+                       kfree_skb(tunnel_buf);
                        return 1;
                } else {
                        warn("Link changeover error, original msg dropped\n");
@@ -2429,7 +2440,7 @@ static int link_recv_changeover_msg(struct tipc_link **l_ptr,
        }
 exit:
        *buf = NULL;
-       buf_discard(tunnel_buf);
+       kfree_skb(tunnel_buf);
        return 0;
 }
 
@@ -2451,7 +2462,7 @@ void tipc_link_recv_bundle(struct sk_buff *buf)
                pos += align(msg_size(buf_msg(obuf)));
                tipc_net_route_msg(obuf);
        }
-       buf_discard(buf);
+       kfree_skb(buf);
 }
 
 /*
@@ -2500,11 +2511,11 @@ static int link_send_long_buf(struct tipc_link *l_ptr, struct sk_buff *buf)
                }
                fragm = tipc_buf_acquire(fragm_sz + INT_H_SIZE);
                if (fragm == NULL) {
-                       buf_discard(buf);
+                       kfree_skb(buf);
                        while (buf_chain) {
                                buf = buf_chain;
                                buf_chain = buf_chain->next;
-                               buf_discard(buf);
+                               kfree_skb(buf);
                        }
                        return -ENOMEM;
                }
@@ -2521,7 +2532,7 @@ static int link_send_long_buf(struct tipc_link *l_ptr, struct sk_buff *buf)
                crs += fragm_sz;
                msg_set_type(&fragm_hdr, FRAGMENT);
        }
-       buf_discard(buf);
+       kfree_skb(buf);
 
        /* Append chain of fragments to send queue & send them */
 
@@ -2608,7 +2619,7 @@ int tipc_link_recv_fragment(struct sk_buff **pending, struct sk_buff **fb,
                if (msg_type(imsg) == TIPC_MCAST_MSG)
                        max = TIPC_MAX_USER_MSG_SIZE + MCAST_H_SIZE;
                if (msg_size(imsg) > max) {
-                       buf_discard(fbuf);
+                       kfree_skb(fbuf);
                        return 0;
                }
                pbuf = tipc_buf_acquire(msg_size(imsg));
@@ -2623,9 +2634,11 @@ int tipc_link_recv_fragment(struct sk_buff **pending, struct sk_buff **fb,
                        set_fragm_size(pbuf, fragm_sz);
                        set_expected_frags(pbuf, exp_fragm_cnt - 1);
                } else {
-                       warn("Link unable to reassemble fragmented message\n");
+                       dbg("Link unable to reassemble fragmented message\n");
+                       kfree_skb(fbuf);
+                       return -1;
                }
-               buf_discard(fbuf);
+               kfree_skb(fbuf);
                return 0;
        } else if (pbuf && (msg_type(fragm) != FIRST_FRAGMENT)) {
                u32 dsz = msg_data_sz(fragm);
@@ -2634,7 +2647,7 @@ int tipc_link_recv_fragment(struct sk_buff **pending, struct sk_buff **fb,
                u32 exp_frags = get_expected_frags(pbuf) - 1;
                skb_copy_to_linear_data_offset(pbuf, crs,
                                               msg_data(fragm), dsz);
-               buf_discard(fbuf);
+               kfree_skb(fbuf);
 
                /* Is message complete? */
 
@@ -2651,7 +2664,7 @@ int tipc_link_recv_fragment(struct sk_buff **pending, struct sk_buff **fb,
                set_expected_frags(pbuf, exp_frags);
                return 0;
        }
-       buf_discard(fbuf);
+       kfree_skb(fbuf);
        return 0;
 }
 
@@ -2682,7 +2695,7 @@ static void link_check_defragm_bufs(struct tipc_link *l_ptr)
                                prev->next = buf->next;
                        else
                                l_ptr->defragm_buf = buf->next;
-                       buf_discard(buf);
+                       kfree_skb(buf);
                }
                buf = next;
        }
@@ -3057,7 +3070,7 @@ struct sk_buff *tipc_link_cmd_show_stats(const void *req_tlv_area, int req_tlv_s
        str_len = tipc_link_stats((char *)TLV_DATA(req_tlv_area),
                                  (char *)TLV_DATA(rep_tlv), MAX_LINK_STATS_INFO);
        if (!str_len) {
-               buf_discard(buf);
+               kfree_skb(buf);
                return tipc_cfg_reply_error_string("link not found");
        }
 
index 952c39f..895c6e5 100644 (file)
@@ -304,7 +304,7 @@ struct sk_buff *tipc_log_resize_cmd(const void *req_tlv_area, int req_tlv_space)
                return tipc_cfg_reply_error_string(TIPC_CFG_TLV_ERROR);
 
        value = ntohl(*(__be32 *)TLV_DATA(req_tlv_area));
-       if (value != delimit(value, 0, 32768))
+       if (value > 32768)
                return tipc_cfg_reply_error_string(TIPC_CFG_INVALID_VALUE
                                                   " (log size must be 0-32768)");
        if (tipc_log_resize(value))
index 3e4d3e2..e3afe16 100644 (file)
@@ -106,7 +106,7 @@ int tipc_msg_build(struct tipc_msg *hdr, struct iovec const *msg_sect,
        if (likely(res))
                return dsz;
 
-       buf_discard(*buf);
+       kfree_skb(*buf);
        *buf = NULL;
        return -EFAULT;
 }
index 7b0cda1..eba524e 100644 (file)
@@ -384,11 +384,6 @@ static inline void msg_set_destnode(struct tipc_msg *m, u32 a)
        msg_set_word(m, 7, a);
 }
 
-static inline int msg_is_dest(struct tipc_msg *m, u32 d)
-{
-       return msg_short(m) || (msg_destnode(m) == d);
-}
-
 static inline u32 msg_nametype(struct tipc_msg *m)
 {
        return msg_word(m, 8);
@@ -517,6 +512,16 @@ static inline void msg_set_seq_gap(struct tipc_msg *m, u32 n)
        msg_set_bits(m, 1, 16, 0x1fff, n);
 }
 
+static inline u32 msg_node_sig(struct tipc_msg *m)
+{
+       return msg_bits(m, 1, 0, 0xffff);
+}
+
+static inline void msg_set_node_sig(struct tipc_msg *m, u32 n)
+{
+       msg_set_bits(m, 1, 0, 0xffff, n);
+}
+
 
 /*
  * Word 2
index 98ebb37..d57da61 100644 (file)
@@ -120,7 +120,7 @@ static void named_cluster_distribute(struct sk_buff *buf)
                }
        }
 
-       buf_discard(buf);
+       kfree_skb(buf);
 }
 
 /**
@@ -239,9 +239,6 @@ exit:
  *
  * Invoked for each publication issued by a newly failed node.
  * Removes publication structure from name table & deletes it.
- * In rare cases the link may have come back up again when this
- * function is called, and we have two items representing the same
- * publication. Nudge this item's key to distinguish it from the other.
  */
 
 static void named_purge_publ(struct publication *publ)
@@ -249,7 +246,6 @@ static void named_purge_publ(struct publication *publ)
        struct publication *p;
 
        write_lock_bh(&tipc_nametbl_lock);
-       publ->key += 1222345;
        p = tipc_nametbl_remove_publ(publ->type, publ->lower,
                                     publ->node, publ->ref, publ->key);
        if (p)
@@ -316,7 +312,7 @@ void tipc_named_recv(struct sk_buff *buf)
                item++;
        }
        write_unlock_bh(&tipc_nametbl_lock);
-       buf_discard(buf);
+       kfree_skb(buf);
 }
 
 /**
index 89eb562..c6a1ae3 100644 (file)
@@ -114,10 +114,8 @@ struct name_table {
 };
 
 static struct name_table table;
-static atomic_t rsv_publ_ok = ATOMIC_INIT(0);
 DEFINE_RWLOCK(tipc_nametbl_lock);
 
-
 static int hash(int x)
 {
        return x & (tipc_nametbl_size - 1);
@@ -270,6 +268,13 @@ static struct publication *tipc_nameseq_insert_publ(struct name_seq *nseq,
                }
 
                info = sseq->info;
+
+               /* Check if an identical publication already exists */
+               list_for_each_entry(publ, &info->zone_list, zone_list) {
+                       if ((publ->ref == port) && (publ->key == key) &&
+                           (!publ->node || (publ->node == node)))
+                               return NULL;
+               }
        } else {
                u32 inspos;
                struct sub_seq *freesseq;
@@ -534,10 +539,17 @@ struct publication *tipc_nametbl_remove_publ(u32 type, u32 lower,
 }
 
 /*
- * tipc_nametbl_translate - translate name to port id
+ * tipc_nametbl_translate - perform name translation
+ *
+ * On entry, 'destnode' is the search domain used during translation.
  *
- * Note: on entry 'destnode' is the search domain used during translation;
- *       on exit it passes back the node address of the matching port (if any)
+ * On exit:
+ * - if name translation is deferred to another node/cluster/zone,
+ *   leaves 'destnode' unchanged (will be non-zero) and returns 0
+ * - if name translation is attempted and succeeds, sets 'destnode'
+ *   to publishing node and returns port reference (will be non-zero)
+ * - if name translation is attempted and fails, sets 'destnode' to 0
+ *   and returns 0
  */
 
 u32 tipc_nametbl_translate(u32 type, u32 instance, u32 *destnode)
@@ -547,6 +559,7 @@ u32 tipc_nametbl_translate(u32 type, u32 instance, u32 *destnode)
        struct publication *publ;
        struct name_seq *seq;
        u32 ref = 0;
+       u32 node = 0;
 
        if (!tipc_in_scope(*destnode, tipc_own_addr))
                return 0;
@@ -604,11 +617,12 @@ u32 tipc_nametbl_translate(u32 type, u32 instance, u32 *destnode)
        }
 
        ref = publ->ref;
-       *destnode = publ->node;
+       node = publ->node;
 no_match:
        spin_unlock_bh(&seq->lock);
 not_found:
        read_unlock_bh(&tipc_nametbl_lock);
+       *destnode = node;
        return ref;
 }
 
@@ -665,22 +679,7 @@ exit:
        return res;
 }
 
-/**
- * tipc_nametbl_publish_rsv - publish port name using a reserved name type
- */
-
-int tipc_nametbl_publish_rsv(u32 ref, unsigned int scope,
-                       struct tipc_name_seq const *seq)
-{
-       int res;
-
-       atomic_inc(&rsv_publ_ok);
-       res = tipc_publish(ref, scope, seq);
-       atomic_dec(&rsv_publ_ok);
-       return res;
-}
-
-/**
+/*
  * tipc_nametbl_publish - add name publication to network name tables
  */
 
@@ -694,11 +693,6 @@ struct publication *tipc_nametbl_publish(u32 type, u32 lower, u32 upper,
                     tipc_max_publications);
                return NULL;
        }
-       if ((type < TIPC_RESERVED_TYPES) && !atomic_read(&rsv_publ_ok)) {
-               warn("Publication failed, reserved name {%u,%u,%u}\n",
-                    type, lower, upper);
-               return NULL;
-       }
 
        write_lock_bh(&tipc_nametbl_lock);
        table.local_publ_count++;
index 8086b42..207d59e 100644 (file)
@@ -91,8 +91,6 @@ struct sk_buff *tipc_nametbl_get(const void *req_tlv_area, int req_tlv_space);
 u32 tipc_nametbl_translate(u32 type, u32 instance, u32 *node);
 int tipc_nametbl_mc_translate(u32 type, u32 lower, u32 upper, u32 limit,
                         struct tipc_port_list *dports);
-int tipc_nametbl_publish_rsv(u32 ref, unsigned int scope,
-                       struct tipc_name_seq const *seq);
 struct publication *tipc_nametbl_publish(u32 type, u32 lower, u32 upper,
                                    u32 scope, u32 port_ref, u32 key);
 int tipc_nametbl_withdraw(u32 type, u32 lower, u32 ref, u32 key);
index 61afee7..d4531b0 100644 (file)
@@ -117,7 +117,7 @@ static void net_route_named_msg(struct sk_buff *buf)
        u32 dport;
 
        if (!msg_named(msg)) {
-               buf_discard(buf);
+               kfree_skb(buf);
                return;
        }
 
@@ -161,7 +161,7 @@ void tipc_net_route_msg(struct sk_buff *buf)
                        tipc_port_recv_proto_msg(buf);
                        break;
                default:
-                       buf_discard(buf);
+                       kfree_skb(buf);
                }
                return;
        }
@@ -175,14 +175,10 @@ int tipc_net_start(u32 addr)
 {
        char addr_string[16];
 
-       if (tipc_mode != TIPC_NODE_MODE)
-               return -ENOPROTOOPT;
-
        tipc_subscr_stop();
        tipc_cfg_stop();
 
        tipc_own_addr = addr;
-       tipc_mode = TIPC_NET_MODE;
        tipc_named_reinit();
        tipc_port_reinit();
 
@@ -201,10 +197,9 @@ void tipc_net_stop(void)
 {
        struct tipc_node *node, *t_node;
 
-       if (tipc_mode != TIPC_NET_MODE)
+       if (!tipc_own_addr)
                return;
        write_lock_bh(&tipc_net_lock);
-       tipc_mode = TIPC_NODE_MODE;
        tipc_bearer_stop();
        tipc_bclink_stop();
        list_for_each_entry_safe(node, t_node, &tipc_node_list, list)
index 6b226fa..a34cabc 100644 (file)
@@ -39,6 +39,8 @@
 #include "node.h"
 #include "name_distr.h"
 
+#define NODE_HTABLE_SIZE 512
+
 static void node_lost_contact(struct tipc_node *n_ptr);
 static void node_established_contact(struct tipc_node *n_ptr);
 
@@ -49,9 +51,19 @@ LIST_HEAD(tipc_node_list);
 static u32 tipc_num_nodes;
 
 static atomic_t tipc_num_links = ATOMIC_INIT(0);
-u32 tipc_own_tag;
 
-/**
+/*
+ * A trivial power-of-two bitmask technique is used for speed, since this
+ * operation is done for every incoming TIPC packet. The number of hash table
+ * entries has been chosen so that no hash chain exceeds 8 nodes and will
+ * usually be much smaller (typically only a single node).
+ */
+static inline unsigned int tipc_hashfn(u32 addr)
+{
+       return addr & (NODE_HTABLE_SIZE - 1);
+}
+
+/*
  * tipc_node_find - locate specified node object, if it exists
  */
 
@@ -113,6 +125,7 @@ struct tipc_node *tipc_node_create(u32 addr)
        }
        list_add_tail(&n_ptr->list, &temp_node->list);
        n_ptr->block_setup = WAIT_PEER_DOWN;
+       n_ptr->signature = INVALID_NODE_SIG;
 
        tipc_num_nodes++;
 
@@ -253,63 +266,14 @@ void tipc_node_detach_link(struct tipc_node *n_ptr, struct tipc_link *l_ptr)
        n_ptr->link_cnt--;
 }
 
-/*
- * Routing table management - five cases to handle:
- *
- * 1: A link towards a zone/cluster external node comes up.
- *    => Send a multicast message updating routing tables of all
- *    system nodes within own cluster that the new destination
- *    can be reached via this node.
- *    (node.establishedContact()=>cluster.multicastNewRoute())
- *
- * 2: A link towards a slave node comes up.
- *    => Send a multicast message updating routing tables of all
- *    system nodes within own cluster that the new destination
- *    can be reached via this node.
- *    (node.establishedContact()=>cluster.multicastNewRoute())
- *    => Send a  message to the slave node about existence
- *    of all system nodes within cluster:
- *    (node.establishedContact()=>cluster.sendLocalRoutes())
- *
- * 3: A new cluster local system node becomes available.
- *    => Send message(s) to this particular node containing
- *    information about all cluster external and slave
- *     nodes which can be reached via this node.
- *    (node.establishedContact()==>network.sendExternalRoutes())
- *    (node.establishedContact()==>network.sendSlaveRoutes())
- *    => Send messages to all directly connected slave nodes
- *    containing information about the existence of the new node
- *    (node.establishedContact()=>cluster.multicastNewRoute())
- *
- * 4: The link towards a zone/cluster external node or slave
- *    node goes down.
- *    => Send a multcast message updating routing tables of all
- *    nodes within cluster that the new destination can not any
- *    longer be reached via this node.
- *    (node.lostAllLinks()=>cluster.bcastLostRoute())
- *
- * 5: A cluster local system node becomes unavailable.
- *    => Remove all references to this node from the local
- *    routing tables. Note: This is a completely node
- *    local operation.
- *    (node.lostAllLinks()=>network.removeAsRouter())
- *    => Send messages to all directly connected slave nodes
- *    containing information about loss of the node
- *    (node.establishedContact()=>cluster.multicastLostRoute())
- *
- */
-
 static void node_established_contact(struct tipc_node *n_ptr)
 {
        tipc_k_signal((Handler)tipc_named_node_up, n_ptr->addr);
 
-       /* Syncronize broadcast acks */
-       n_ptr->bclink.acked = tipc_bclink_get_last_sent();
-
-       if (n_ptr->bclink.supported) {
+       if (n_ptr->bclink.supportable) {
+               n_ptr->bclink.acked = tipc_bclink_get_last_sent();
                tipc_bclink_add_node(n_ptr->addr);
-               if (n_ptr->addr < tipc_own_addr)
-                       tipc_own_tag++;
+               n_ptr->bclink.supported = 1;
        }
 }
 
@@ -338,22 +302,20 @@ static void node_lost_contact(struct tipc_node *n_ptr)
        /* Flush broadcast link info associated with lost node */
 
        if (n_ptr->bclink.supported) {
-               n_ptr->bclink.gap_after = n_ptr->bclink.gap_to = 0;
                while (n_ptr->bclink.deferred_head) {
                        struct sk_buff *buf = n_ptr->bclink.deferred_head;
                        n_ptr->bclink.deferred_head = buf->next;
-                       buf_discard(buf);
+                       kfree_skb(buf);
                }
+               n_ptr->bclink.deferred_size = 0;
 
                if (n_ptr->bclink.defragm) {
-                       buf_discard(n_ptr->bclink.defragm);
+                       kfree_skb(n_ptr->bclink.defragm);
                        n_ptr->bclink.defragm = NULL;
                }
 
                tipc_bclink_remove_node(n_ptr->addr);
                tipc_bclink_acknowledge(n_ptr, INVALID_LINK_SEQ);
-               if (n_ptr->addr < tipc_own_addr)
-                       tipc_own_tag--;
 
                n_ptr->bclink.supported = 0;
        }
@@ -444,12 +406,12 @@ struct sk_buff *tipc_node_get_links(const void *req_tlv_area, int req_tlv_space)
                return tipc_cfg_reply_error_string(TIPC_CFG_INVALID_VALUE
                                                   " (network address)");
 
-       if (tipc_mode != TIPC_NET_MODE)
+       if (!tipc_own_addr)
                return tipc_cfg_reply_none();
 
        read_lock_bh(&tipc_net_lock);
 
-       /* Get space for all unicast links + multicast link */
+       /* Get space for all unicast links + broadcast link */
 
        payload_size = TLV_SPACE(sizeof(link_info)) *
                (atomic_read(&tipc_num_links) + 1);
index 0b1c5f8..72561c9 100644 (file)
 #include "net.h"
 #include "bearer.h"
 
+/*
+ * Out-of-range value for node signature
+ */
+#define INVALID_NODE_SIG 0x10000
+
 /* Flags used to block (re)establishment of contact with a neighboring node */
 
 #define WAIT_PEER_DOWN 0x0001  /* wait to see that peer's links are down */
  * @block_setup: bit mask of conditions preventing link establishment to node
  * @link_cnt: number of links to node
  * @permit_changeover: non-zero if node has redundant links to this system
+ * @signature: node instance identifier
  * @bclink: broadcast-related info
+ *    @supportable: non-zero if node supports TIPC b'cast link capability
  *    @supported: non-zero if node supports TIPC b'cast capability
  *    @acked: sequence # of last outbound b'cast message acknowledged by node
  *    @last_in: sequence # of last in-sequence b'cast message received from node
- *    @gap_after: sequence # of last message not requiring a NAK request
- *    @gap_to: sequence # of last message requiring a NAK request
- *    @nack_sync: counter that determines when NAK requests should be sent
+ *    @last_sent: sequence # of last b'cast message sent by node
+ *    @oos_state: state tracker for handling OOS b'cast messages
+ *    @deferred_size: number of OOS b'cast messages in deferred queue
  *    @deferred_head: oldest OOS b'cast message received from node
  *    @deferred_tail: newest OOS b'cast message received from node
  *    @defragm: list of partially reassembled b'cast message fragments from node
@@ -85,35 +92,23 @@ struct tipc_node {
        int working_links;
        int block_setup;
        int permit_changeover;
+       u32 signature;
        struct {
-               int supported;
+               u8 supportable;
+               u8 supported;
                u32 acked;
                u32 last_in;
-               u32 gap_after;
-               u32 gap_to;
-               u32 nack_sync;
+               u32 last_sent;
+               u32 oos_state;
+               u32 deferred_size;
                struct sk_buff *deferred_head;
                struct sk_buff *deferred_tail;
                struct sk_buff *defragm;
        } bclink;
 };
 
-#define NODE_HTABLE_SIZE 512
 extern struct list_head tipc_node_list;
 
-/*
- * A trivial power-of-two bitmask technique is used for speed, since this
- * operation is done for every incoming TIPC packet. The number of hash table
- * entries has been chosen so that no hash chain exceeds 8 nodes and will
- * usually be much smaller (typically only a single node).
- */
-static inline unsigned int tipc_hashfn(u32 addr)
-{
-       return addr & (NODE_HTABLE_SIZE - 1);
-}
-
-extern u32 tipc_own_tag;
-
 struct tipc_node *tipc_node_find(u32 addr);
 struct tipc_node *tipc_node_create(u32 addr);
 void tipc_node_delete(struct tipc_node *n_ptr);
index d91efc6..94d2904 100644 (file)
@@ -116,13 +116,13 @@ int tipc_multicast(u32 ref, struct tipc_name_seq const *seq,
                        ibuf = skb_copy(buf, GFP_ATOMIC);
                        if (ibuf == NULL) {
                                tipc_port_list_free(&dports);
-                               buf_discard(buf);
+                               kfree_skb(buf);
                                return -ENOMEM;
                        }
                }
                res = tipc_bclink_send_msg(buf);
                if ((res < 0) && (dports.count != 0))
-                       buf_discard(ibuf);
+                       kfree_skb(ibuf);
        } else {
                ibuf = buf;
        }
@@ -187,7 +187,7 @@ void tipc_port_recv_mcast(struct sk_buff *buf, struct tipc_port_list *dp)
                }
        }
 exit:
-       buf_discard(buf);
+       kfree_skb(buf);
        tipc_port_list_free(dp);
 }
 
@@ -400,15 +400,16 @@ int tipc_reject_msg(struct sk_buff *buf, u32 err)
 
        /* send self-abort message when rejecting on a connected port */
        if (msg_connected(msg)) {
-               struct sk_buff *abuf = NULL;
                struct tipc_port *p_ptr = tipc_port_lock(msg_destport(msg));
 
                if (p_ptr) {
+                       struct sk_buff *abuf = NULL;
+
                        if (p_ptr->connected)
                                abuf = port_build_self_abort_msg(p_ptr, err);
                        tipc_port_unlock(p_ptr);
+                       tipc_net_route_msg(abuf);
                }
-               tipc_net_route_msg(abuf);
        }
 
        /* send returned message & dispose of rejected message */
@@ -419,7 +420,7 @@ int tipc_reject_msg(struct sk_buff *buf, u32 err)
        else
                tipc_link_send(rbuf, src_node, msg_link_selector(rmsg));
 exit:
-       buf_discard(buf);
+       kfree_skb(buf);
        return data_sz;
 }
 
@@ -567,7 +568,7 @@ void tipc_port_recv_proto_msg(struct sk_buff *buf)
        tipc_port_unlock(p_ptr);
 exit:
        tipc_net_route_msg(r_buf);
-       buf_discard(buf);
+       kfree_skb(buf);
 }
 
 static void port_print(struct tipc_port *p_ptr, struct print_buf *buf, int full_id)
@@ -758,7 +759,7 @@ static void port_dispatcher_sigh(void *dummy)
                        }
                }
                if (buf)
-                       buf_discard(buf);
+                       kfree_skb(buf);
                buf = next;
                continue;
 err:
@@ -812,7 +813,7 @@ err:
                        }
                }
                if (buf)
-                       buf_discard(buf);
+                       kfree_skb(buf);
                buf = next;
                continue;
 reject:
@@ -1053,8 +1054,6 @@ int tipc_connect2port(u32 ref, struct tipc_portid const *peer)
        msg = &p_ptr->phdr;
        msg_set_destnode(msg, peer->node);
        msg_set_destport(msg, peer->ref);
-       msg_set_orignode(msg, tipc_own_addr);
-       msg_set_origport(msg, p_ptr->ref);
        msg_set_type(msg, TIPC_CONN_MSG);
        msg_set_lookup_scope(msg, 0);
        msg_set_hdr_sz(msg, SHORT_H_SIZE);
@@ -1132,6 +1131,49 @@ int tipc_shutdown(u32 ref)
        return tipc_disconnect(ref);
 }
 
+/**
+ * tipc_port_recv_msg - receive message from lower layer and deliver to port user
+ */
+
+int tipc_port_recv_msg(struct sk_buff *buf)
+{
+       struct tipc_port *p_ptr;
+       struct tipc_msg *msg = buf_msg(buf);
+       u32 destport = msg_destport(msg);
+       u32 dsz = msg_data_sz(msg);
+       u32 err;
+
+       /* forward unresolved named message */
+       if (unlikely(!destport)) {
+               tipc_net_route_msg(buf);
+               return dsz;
+       }
+
+       /* validate destination & pass to port, otherwise reject message */
+       p_ptr = tipc_port_lock(destport);
+       if (likely(p_ptr)) {
+               if (likely(p_ptr->connected)) {
+                       if ((unlikely(msg_origport(msg) !=
+                                     tipc_peer_port(p_ptr))) ||
+                           (unlikely(msg_orignode(msg) !=
+                                     tipc_peer_node(p_ptr))) ||
+                           (unlikely(!msg_connected(msg)))) {
+                               err = TIPC_ERR_NO_PORT;
+                               tipc_port_unlock(p_ptr);
+                               goto reject;
+                       }
+               }
+               err = p_ptr->dispatcher(p_ptr, buf);
+               tipc_port_unlock(p_ptr);
+               if (likely(!err))
+                       return dsz;
+       } else {
+               err = TIPC_ERR_NO_PORT;
+       }
+reject:
+       return tipc_reject_msg(buf, err);
+}
+
 /*
  *  tipc_port_recv_sections(): Concatenate and deliver sectioned
  *                        message for this node.
@@ -1210,8 +1252,6 @@ int tipc_send2name(u32 ref, struct tipc_name const *name, unsigned int domain,
 
        msg = &p_ptr->phdr;
        msg_set_type(msg, TIPC_NAMED_MSG);
-       msg_set_orignode(msg, tipc_own_addr);
-       msg_set_origport(msg, ref);
        msg_set_hdr_sz(msg, NAMED_H_SIZE);
        msg_set_nametype(msg, name->type);
        msg_set_nameinst(msg, name->instance);
@@ -1220,7 +1260,7 @@ int tipc_send2name(u32 ref, struct tipc_name const *name, unsigned int domain,
        msg_set_destnode(msg, destnode);
        msg_set_destport(msg, destport);
 
-       if (likely(destport)) {
+       if (likely(destport || destnode)) {
                if (likely(destnode == tipc_own_addr))
                        res = tipc_port_recv_sections(p_ptr, num_sect,
                                                      msg_sect, total_len);
@@ -1261,8 +1301,6 @@ int tipc_send2port(u32 ref, struct tipc_portid const *dest,
        msg = &p_ptr->phdr;
        msg_set_type(msg, TIPC_DIRECT_MSG);
        msg_set_lookup_scope(msg, 0);
-       msg_set_orignode(msg, tipc_own_addr);
-       msg_set_origport(msg, ref);
        msg_set_destnode(msg, dest->node);
        msg_set_destport(msg, dest->ref);
        msg_set_hdr_sz(msg, BASIC_H_SIZE);
@@ -1301,8 +1339,6 @@ int tipc_send_buf2port(u32 ref, struct tipc_portid const *dest,
 
        msg = &p_ptr->phdr;
        msg_set_type(msg, TIPC_DIRECT_MSG);
-       msg_set_orignode(msg, tipc_own_addr);
-       msg_set_origport(msg, ref);
        msg_set_destnode(msg, dest->node);
        msg_set_destport(msg, dest->ref);
        msg_set_hdr_sz(msg, BASIC_H_SIZE);
index f751807..9b88531 100644 (file)
@@ -205,6 +205,7 @@ int tipc_disconnect_port(struct tipc_port *tp_ptr);
 /*
  * TIPC messaging routines
  */
+int tipc_port_recv_msg(struct sk_buff *buf);
 int tipc_send(u32 portref, unsigned int num_sect, struct iovec const *msg_sect,
              unsigned int total_len);
 
@@ -271,45 +272,4 @@ static inline int tipc_port_congested(struct tipc_port *p_ptr)
        return (p_ptr->sent - p_ptr->acked) >= (TIPC_FLOW_CONTROL_WIN * 2);
 }
 
-/**
- * tipc_port_recv_msg - receive message from lower layer and deliver to port user
- */
-
-static inline int tipc_port_recv_msg(struct sk_buff *buf)
-{
-       struct tipc_port *p_ptr;
-       struct tipc_msg *msg = buf_msg(buf);
-       u32 destport = msg_destport(msg);
-       u32 dsz = msg_data_sz(msg);
-       u32 err;
-
-       /* forward unresolved named message */
-       if (unlikely(!destport)) {
-               tipc_net_route_msg(buf);
-               return dsz;
-       }
-
-       /* validate destination & pass to port, otherwise reject message */
-       p_ptr = tipc_port_lock(destport);
-       if (likely(p_ptr)) {
-               if (likely(p_ptr->connected)) {
-                       if ((unlikely(msg_origport(msg) != tipc_peer_port(p_ptr))) ||
-                           (unlikely(msg_orignode(msg) != tipc_peer_node(p_ptr))) ||
-                           (unlikely(!msg_connected(msg)))) {
-                               err = TIPC_ERR_NO_PORT;
-                               tipc_port_unlock(p_ptr);
-                               goto reject;
-                       }
-               }
-               err = p_ptr->dispatcher(p_ptr, buf);
-               tipc_port_unlock(p_ptr);
-               if (likely(!err))
-                       return dsz;
-       } else {
-               err = TIPC_ERR_NO_PORT;
-       }
-reject:
-       return tipc_reject_msg(buf, err);
-}
-
 #endif
index e2f7c5d..29e957f 100644 (file)
@@ -126,7 +126,7 @@ static atomic_t tipc_queue_size = ATOMIC_INIT(0);
 
 static void advance_rx_queue(struct sock *sk)
 {
-       buf_discard(__skb_dequeue(&sk->sk_receive_queue));
+       kfree_skb(__skb_dequeue(&sk->sk_receive_queue));
        atomic_dec(&tipc_queue_size);
 }
 
@@ -142,7 +142,7 @@ static void discard_rx_queue(struct sock *sk)
 
        while ((buf = __skb_dequeue(&sk->sk_receive_queue))) {
                atomic_dec(&tipc_queue_size);
-               buf_discard(buf);
+               kfree_skb(buf);
        }
 }
 
@@ -288,7 +288,7 @@ static int release(struct socket *sock)
                        break;
                atomic_dec(&tipc_queue_size);
                if (TIPC_SKB_CB(buf)->handle != 0)
-                       buf_discard(buf);
+                       kfree_skb(buf);
                else {
                        if ((sock->state == SS_CONNECTING) ||
                            (sock->state == SS_CONNECTED)) {
@@ -355,6 +355,9 @@ static int bind(struct socket *sock, struct sockaddr *uaddr, int uaddr_len)
        else if (addr->addrtype != TIPC_ADDR_NAMESEQ)
                return -EAFNOSUPPORT;
 
+       if (addr->addr.nameseq.type < TIPC_RESERVED_TYPES)
+               return -EACCES;
+
        return (addr->scope > 0) ?
                tipc_publish(portref, addr->scope, &addr->addr.nameseq) :
                tipc_withdraw(portref, -addr->scope, &addr->addr.nameseq);
@@ -1612,7 +1615,7 @@ restart:
                if (buf) {
                        atomic_dec(&tipc_queue_size);
                        if (TIPC_SKB_CB(buf)->handle != 0) {
-                               buf_discard(buf);
+                               kfree_skb(buf);
                                goto restart;
                        }
                        tipc_disconnect(tport->ref);
index 8c49566..b2964e9 100644 (file)
@@ -552,7 +552,7 @@ int tipc_subscr_start(void)
        if (res)
                goto failed;
 
-       res = tipc_nametbl_publish_rsv(topsrv.setup_port, TIPC_NODE_SCOPE, &seq);
+       res = tipc_publish(topsrv.setup_port, TIPC_NODE_SCOPE, &seq);
        if (res) {
                tipc_deleteport(topsrv.setup_port);
                topsrv.setup_port = 0;
index 85d3bb7..8ee85aa 100644 (file)
@@ -530,6 +530,16 @@ static int unix_seqpacket_sendmsg(struct kiocb *, struct socket *,
 static int unix_seqpacket_recvmsg(struct kiocb *, struct socket *,
                                  struct msghdr *, size_t, int);
 
+static void unix_set_peek_off(struct sock *sk, int val)
+{
+       struct unix_sock *u = unix_sk(sk);
+
+       mutex_lock(&u->readlock);
+       sk->sk_peek_off = val;
+       mutex_unlock(&u->readlock);
+}
+
+
 static const struct proto_ops unix_stream_ops = {
        .family =       PF_UNIX,
        .owner =        THIS_MODULE,
@@ -549,6 +559,7 @@ static const struct proto_ops unix_stream_ops = {
        .recvmsg =      unix_stream_recvmsg,
        .mmap =         sock_no_mmap,
        .sendpage =     sock_no_sendpage,
+       .set_peek_off = unix_set_peek_off,
 };
 
 static const struct proto_ops unix_dgram_ops = {
@@ -570,6 +581,7 @@ static const struct proto_ops unix_dgram_ops = {
        .recvmsg =      unix_dgram_recvmsg,
        .mmap =         sock_no_mmap,
        .sendpage =     sock_no_sendpage,
+       .set_peek_off = unix_set_peek_off,
 };
 
 static const struct proto_ops unix_seqpacket_ops = {
@@ -591,6 +603,7 @@ static const struct proto_ops unix_seqpacket_ops = {
        .recvmsg =      unix_seqpacket_recvmsg,
        .mmap =         sock_no_mmap,
        .sendpage =     sock_no_sendpage,
+       .set_peek_off = unix_set_peek_off,
 };
 
 static struct proto unix_proto = {
@@ -1756,6 +1769,7 @@ static int unix_dgram_recvmsg(struct kiocb *iocb, struct socket *sock,
        int noblock = flags & MSG_DONTWAIT;
        struct sk_buff *skb;
        int err;
+       int peeked, skip;
 
        err = -EOPNOTSUPP;
        if (flags&MSG_OOB)
@@ -1769,7 +1783,9 @@ static int unix_dgram_recvmsg(struct kiocb *iocb, struct socket *sock,
                goto out;
        }
 
-       skb = skb_recv_datagram(sk, flags, noblock, &err);
+       skip = sk_peek_offset(sk, flags);
+
+       skb = __skb_recv_datagram(sk, flags, &peeked, &skip, &err);
        if (!skb) {
                unix_state_lock(sk);
                /* Signal EOF on disconnected non-blocking SEQPACKET socket. */
@@ -1786,12 +1802,12 @@ static int unix_dgram_recvmsg(struct kiocb *iocb, struct socket *sock,
        if (msg->msg_name)
                unix_copy_addr(msg, skb->sk);
 
-       if (size > skb->len)
-               size = skb->len;
-       else if (size < skb->len)
+       if (size > skb->len - skip)
+               size = skb->len - skip;
+       else if (size < skb->len - skip)
                msg->msg_flags |= MSG_TRUNC;
 
-       err = skb_copy_datagram_iovec(skb, 0, msg->msg_iov, size);
+       err = skb_copy_datagram_iovec(skb, skip, msg->msg_iov, size);
        if (err)
                goto out_free;
 
@@ -1808,6 +1824,8 @@ static int unix_dgram_recvmsg(struct kiocb *iocb, struct socket *sock,
        if (!(flags & MSG_PEEK)) {
                if (UNIXCB(skb).fp)
                        unix_detach_fds(siocb->scm, skb);
+
+               sk_peek_offset_bwd(sk, skb->len);
        } else {
                /* It is questionable: on PEEK we could:
                   - do not return fds - good, but too simple 8)
@@ -1821,10 +1839,13 @@ static int unix_dgram_recvmsg(struct kiocb *iocb, struct socket *sock,
                   clearly however!
 
                */
+
+               sk_peek_offset_fwd(sk, size);
+
                if (UNIXCB(skb).fp)
                        siocb->scm->fp = scm_fp_dup(UNIXCB(skb).fp);
        }
-       err = size;
+       err = (flags & MSG_TRUNC) ? skb->len - skip : size;
 
        scm_recv(sock, msg, siocb->scm, flags);
 
@@ -1884,6 +1905,7 @@ static int unix_stream_recvmsg(struct kiocb *iocb, struct socket *sock,
        int target;
        int err = 0;
        long timeo;
+       int skip;
 
        err = -EINVAL;
        if (sk->sk_state != TCP_ESTABLISHED)
@@ -1913,12 +1935,15 @@ static int unix_stream_recvmsg(struct kiocb *iocb, struct socket *sock,
                goto out;
        }
 
+       skip = sk_peek_offset(sk, flags);
+
        do {
                int chunk;
                struct sk_buff *skb;
 
                unix_state_lock(sk);
                skb = skb_peek(&sk->sk_receive_queue);
+again:
                if (skb == NULL) {
                        unix_sk(sk)->recursion_level = 0;
                        if (copied >= target)
@@ -1953,6 +1978,13 @@ static int unix_stream_recvmsg(struct kiocb *iocb, struct socket *sock,
                        unix_state_unlock(sk);
                        break;
                }
+
+               if (skip >= skb->len) {
+                       skip -= skb->len;
+                       skb = skb_peek_next(skb, &sk->sk_receive_queue);
+                       goto again;
+               }
+
                unix_state_unlock(sk);
 
                if (check_creds) {
@@ -1972,8 +2004,8 @@ static int unix_stream_recvmsg(struct kiocb *iocb, struct socket *sock,
                        sunaddr = NULL;
                }
 
-               chunk = min_t(unsigned int, skb->len, size);
-               if (memcpy_toiovec(msg->msg_iov, skb->data, chunk)) {
+               chunk = min_t(unsigned int, skb->len - skip, size);
+               if (memcpy_toiovec(msg->msg_iov, skb->data + skip, chunk)) {
                        if (copied == 0)
                                copied = -EFAULT;
                        break;
@@ -1985,6 +2017,8 @@ static int unix_stream_recvmsg(struct kiocb *iocb, struct socket *sock,
                if (!(flags & MSG_PEEK)) {
                        skb_pull(skb, chunk);
 
+                       sk_peek_offset_bwd(sk, chunk);
+
                        if (UNIXCB(skb).fp)
                                unix_detach_fds(siocb->scm, skb);
 
@@ -2002,6 +2036,8 @@ static int unix_stream_recvmsg(struct kiocb *iocb, struct socket *sock,
                        if (UNIXCB(skb).fp)
                                siocb->scm->fp = scm_fp_dup(UNIXCB(skb).fp);
 
+                       sk_peek_offset_fwd(sk, chunk);
+
                        break;
                }
        } while (size);
index 6b7697f..4195555 100644 (file)
@@ -301,10 +301,12 @@ static int unix_diag_handler_dump(struct sk_buff *skb, struct nlmsghdr *h)
        if (nlmsg_len(h) < hdrlen)
                return -EINVAL;
 
-       if (h->nlmsg_flags & NLM_F_DUMP)
-               return netlink_dump_start(sock_diag_nlsk, skb, h,
-                                         unix_diag_dump, NULL, 0);
-       else
+       if (h->nlmsg_flags & NLM_F_DUMP) {
+               struct netlink_dump_control c = {
+                       .dump = unix_diag_dump,
+               };
+               return netlink_dump_start(sock_diag_nlsk, skb, h, &c);
+       } else
                return unix_diag_get_exact(skb, h, (struct unix_diag_req *)NLMSG_DATA(h));
 }
 
index 43ad9c8..3ac2dd0 100644 (file)
@@ -144,11 +144,6 @@ static inline struct cfg80211_internal_bss *bss_from_pub(struct cfg80211_bss *pu
        return container_of(pub, struct cfg80211_internal_bss, pub);
 }
 
-static inline void cfg80211_ref_bss(struct cfg80211_internal_bss *bss)
-{
-       kref_get(&bss->ref);
-}
-
 static inline void cfg80211_hold_bss(struct cfg80211_internal_bss *bss)
 {
        atomic_inc(&bss->hold);
@@ -325,15 +320,13 @@ int __cfg80211_mlme_auth(struct cfg80211_registered_device *rdev,
                         const u8 *bssid,
                         const u8 *ssid, int ssid_len,
                         const u8 *ie, int ie_len,
-                        const u8 *key, int key_len, int key_idx,
-                        bool local_state_change);
+                        const u8 *key, int key_len, int key_idx);
 int cfg80211_mlme_auth(struct cfg80211_registered_device *rdev,
                       struct net_device *dev, struct ieee80211_channel *chan,
                       enum nl80211_auth_type auth_type, const u8 *bssid,
                       const u8 *ssid, int ssid_len,
                       const u8 *ie, int ie_len,
-                      const u8 *key, int key_len, int key_idx,
-                      bool local_state_change);
+                      const u8 *key, int key_len, int key_idx);
 int __cfg80211_mlme_assoc(struct cfg80211_registered_device *rdev,
                          struct net_device *dev,
                          struct ieee80211_channel *chan,
@@ -421,7 +414,8 @@ void __cfg80211_disconnected(struct net_device *dev, const u8 *ie,
                             size_t ie_len, u16 reason, bool from_ap);
 void cfg80211_sme_scan_done(struct net_device *dev);
 void cfg80211_sme_rx_auth(struct net_device *dev, const u8 *buf, size_t len);
-void cfg80211_sme_disassoc(struct net_device *dev, int idx);
+void cfg80211_sme_disassoc(struct net_device *dev,
+                          struct cfg80211_internal_bss *bss);
 void __cfg80211_scan_done(struct work_struct *wk);
 void ___cfg80211_scan_done(struct cfg80211_registered_device *rdev, bool leak);
 void __cfg80211_sched_scan_results(struct work_struct *wk);
index 8c550df..9d3e3b6 100644 (file)
@@ -55,6 +55,7 @@ const struct mesh_config default_mesh_config = {
        .min_discovery_timeout = MESH_MIN_DISCOVERY_TIMEOUT,
        .dot11MeshHWMPRannInterval = MESH_RANN_INTERVAL,
        .dot11MeshGateAnnouncementProtocol = false,
+       .dot11MeshForwarding = true,
 };
 
 const struct mesh_setup default_mesh_setup = {
index 438dfc1..fb1e721 100644 (file)
@@ -20,40 +20,18 @@ void cfg80211_send_rx_auth(struct net_device *dev, const u8 *buf, size_t len)
        struct wireless_dev *wdev = dev->ieee80211_ptr;
        struct wiphy *wiphy = wdev->wiphy;
        struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
-       struct ieee80211_mgmt *mgmt = (struct ieee80211_mgmt *)buf;
-       u8 *bssid = mgmt->bssid;
-       int i;
-       u16 status = le16_to_cpu(mgmt->u.auth.status_code);
-       bool done = false;
 
        wdev_lock(wdev);
 
-       for (i = 0; i < MAX_AUTH_BSSES; i++) {
-               if (wdev->authtry_bsses[i] &&
-                   memcmp(wdev->authtry_bsses[i]->pub.bssid, bssid,
-                                                       ETH_ALEN) == 0) {
-                       if (status == WLAN_STATUS_SUCCESS) {
-                               wdev->auth_bsses[i] = wdev->authtry_bsses[i];
-                       } else {
-                               cfg80211_unhold_bss(wdev->authtry_bsses[i]);
-                               cfg80211_put_bss(&wdev->authtry_bsses[i]->pub);
-                       }
-                       wdev->authtry_bsses[i] = NULL;
-                       done = true;
-                       break;
-               }
-       }
-
-       if (done) {
-               nl80211_send_rx_auth(rdev, dev, buf, len, GFP_KERNEL);
-               cfg80211_sme_rx_auth(dev, buf, len);
-       }
+       nl80211_send_rx_auth(rdev, dev, buf, len, GFP_KERNEL);
+       cfg80211_sme_rx_auth(dev, buf, len);
 
        wdev_unlock(wdev);
 }
 EXPORT_SYMBOL(cfg80211_send_rx_auth);
 
-void cfg80211_send_rx_assoc(struct net_device *dev, const u8 *buf, size_t len)
+void cfg80211_send_rx_assoc(struct net_device *dev, struct cfg80211_bss *bss,
+                           const u8 *buf, size_t len)
 {
        u16 status_code;
        struct wireless_dev *wdev = dev->ieee80211_ptr;
@@ -61,8 +39,7 @@ void cfg80211_send_rx_assoc(struct net_device *dev, const u8 *buf, size_t len)
        struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
        struct ieee80211_mgmt *mgmt = (struct ieee80211_mgmt *)buf;
        u8 *ie = mgmt->u.assoc_resp.variable;
-       int i, ieoffs = offsetof(struct ieee80211_mgmt, u.assoc_resp.variable);
-       struct cfg80211_internal_bss *bss = NULL;
+       int ieoffs = offsetof(struct ieee80211_mgmt, u.assoc_resp.variable);
 
        wdev_lock(wdev);
 
@@ -75,43 +52,20 @@ void cfg80211_send_rx_assoc(struct net_device *dev, const u8 *buf, size_t len)
         * frame instead of reassoc.
         */
        if (status_code != WLAN_STATUS_SUCCESS && wdev->conn &&
-           cfg80211_sme_failed_reassoc(wdev))
+           cfg80211_sme_failed_reassoc(wdev)) {
+               cfg80211_put_bss(bss);
                goto out;
+       }
 
        nl80211_send_rx_assoc(rdev, dev, buf, len, GFP_KERNEL);
 
-       if (status_code == WLAN_STATUS_SUCCESS) {
-               for (i = 0; i < MAX_AUTH_BSSES; i++) {
-                       if (!wdev->auth_bsses[i])
-                               continue;
-                       if (memcmp(wdev->auth_bsses[i]->pub.bssid, mgmt->bssid,
-                                  ETH_ALEN) == 0) {
-                               bss = wdev->auth_bsses[i];
-                               wdev->auth_bsses[i] = NULL;
-                               /* additional reference to drop hold */
-                               cfg80211_ref_bss(bss);
-                               break;
-                       }
-               }
-
-               /*
-                * We might be coming here because the driver reported
-                * a successful association at the same time as the
-                * user requested a deauth. In that case, we will have
-                * removed the BSS from the auth_bsses list due to the
-                * deauth request when the assoc response makes it. If
-                * the two code paths acquire the lock the other way
-                * around, that's just the standard situation of a
-                * deauth being requested while connected.
-                */
-               if (!bss)
-                       goto out;
-       } else if (wdev->conn) {
+       if (status_code != WLAN_STATUS_SUCCESS && wdev->conn) {
                cfg80211_sme_failed_assoc(wdev);
                /*
                 * do not call connect_result() now because the
                 * sme will schedule work that does it later.
                 */
+               cfg80211_put_bss(bss);
                goto out;
        }
 
@@ -124,17 +78,10 @@ void cfg80211_send_rx_assoc(struct net_device *dev, const u8 *buf, size_t len)
                wdev->sme_state = CFG80211_SME_CONNECTING;
        }
 
-       /* this consumes one bss reference (unless bss is NULL) */
+       /* this consumes the bss reference */
        __cfg80211_connect_result(dev, mgmt->bssid, NULL, 0, ie, len - ieoffs,
                                  status_code,
-                                 status_code == WLAN_STATUS_SUCCESS,
-                                 bss ? &bss->pub : NULL);
-       /* drop hold now, and also reference acquired above */
-       if (bss) {
-               cfg80211_unhold_bss(bss);
-               cfg80211_put_bss(&bss->pub);
-       }
-
+                                 status_code == WLAN_STATUS_SUCCESS, bss);
  out:
        wdev_unlock(wdev);
 }
@@ -148,8 +95,7 @@ void __cfg80211_send_deauth(struct net_device *dev,
        struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
        struct ieee80211_mgmt *mgmt = (struct ieee80211_mgmt *)buf;
        const u8 *bssid = mgmt->bssid;
-       int i;
-       bool found = false, was_current = false;
+       bool was_current = false;
 
        ASSERT_WDEV_LOCK(wdev);
 
@@ -158,32 +104,9 @@ void __cfg80211_send_deauth(struct net_device *dev,
                cfg80211_unhold_bss(wdev->current_bss);
                cfg80211_put_bss(&wdev->current_bss->pub);
                wdev->current_bss = NULL;
-               found = true;
                was_current = true;
-       } else for (i = 0; i < MAX_AUTH_BSSES; i++) {
-               if (wdev->auth_bsses[i] &&
-                   memcmp(wdev->auth_bsses[i]->pub.bssid, bssid, ETH_ALEN) == 0) {
-                       cfg80211_unhold_bss(wdev->auth_bsses[i]);
-                       cfg80211_put_bss(&wdev->auth_bsses[i]->pub);
-                       wdev->auth_bsses[i] = NULL;
-                       found = true;
-                       break;
-               }
-               if (wdev->authtry_bsses[i] &&
-                   memcmp(wdev->authtry_bsses[i]->pub.bssid, bssid,
-                          ETH_ALEN) == 0 &&
-                   memcmp(mgmt->sa, dev->dev_addr, ETH_ALEN) == 0) {
-                       cfg80211_unhold_bss(wdev->authtry_bsses[i]);
-                       cfg80211_put_bss(&wdev->authtry_bsses[i]->pub);
-                       wdev->authtry_bsses[i] = NULL;
-                       found = true;
-                       break;
-               }
        }
 
-       if (!found)
-               return;
-
        nl80211_send_deauth(rdev, dev, buf, len, GFP_KERNEL);
 
        if (wdev->sme_state == CFG80211_SME_CONNECTED && was_current) {
@@ -220,10 +143,8 @@ void __cfg80211_send_disassoc(struct net_device *dev,
        struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
        struct ieee80211_mgmt *mgmt = (struct ieee80211_mgmt *)buf;
        const u8 *bssid = mgmt->bssid;
-       int i;
        u16 reason_code;
        bool from_ap;
-       bool done = false;
 
        ASSERT_WDEV_LOCK(wdev);
 
@@ -234,16 +155,10 @@ void __cfg80211_send_disassoc(struct net_device *dev,
 
        if (wdev->current_bss &&
            memcmp(wdev->current_bss->pub.bssid, bssid, ETH_ALEN) == 0) {
-               for (i = 0; i < MAX_AUTH_BSSES; i++) {
-                       if (wdev->authtry_bsses[i] || wdev->auth_bsses[i])
-                               continue;
-                       wdev->auth_bsses[i] = wdev->current_bss;
-                       wdev->current_bss = NULL;
-                       done = true;
-                       cfg80211_sme_disassoc(dev, i);
-                       break;
-               }
-               WARN_ON(!done);
+               cfg80211_sme_disassoc(dev, wdev->current_bss);
+               cfg80211_unhold_bss(wdev->current_bss);
+               cfg80211_put_bss(&wdev->current_bss->pub);
+               wdev->current_bss = NULL;
        } else
                WARN_ON(1);
 
@@ -287,34 +202,6 @@ void cfg80211_send_unprot_disassoc(struct net_device *dev, const u8 *buf,
 }
 EXPORT_SYMBOL(cfg80211_send_unprot_disassoc);
 
-static void __cfg80211_auth_remove(struct wireless_dev *wdev, const u8 *addr)
-{
-       int i;
-       bool done = false;
-
-       ASSERT_WDEV_LOCK(wdev);
-
-       for (i = 0; addr && i < MAX_AUTH_BSSES; i++) {
-               if (wdev->authtry_bsses[i] &&
-                   memcmp(wdev->authtry_bsses[i]->pub.bssid,
-                          addr, ETH_ALEN) == 0) {
-                       cfg80211_unhold_bss(wdev->authtry_bsses[i]);
-                       cfg80211_put_bss(&wdev->authtry_bsses[i]->pub);
-                       wdev->authtry_bsses[i] = NULL;
-                       done = true;
-                       break;
-               }
-       }
-
-       WARN_ON(!done);
-}
-
-void __cfg80211_auth_canceled(struct net_device *dev, const u8 *addr)
-{
-       __cfg80211_auth_remove(dev->ieee80211_ptr, addr);
-}
-EXPORT_SYMBOL(__cfg80211_auth_canceled);
-
 void cfg80211_send_auth_timeout(struct net_device *dev, const u8 *addr)
 {
        struct wireless_dev *wdev = dev->ieee80211_ptr;
@@ -329,8 +216,6 @@ void cfg80211_send_auth_timeout(struct net_device *dev, const u8 *addr)
                                          WLAN_STATUS_UNSPECIFIED_FAILURE,
                                          false, NULL);
 
-       __cfg80211_auth_remove(wdev, addr);
-
        wdev_unlock(wdev);
 }
 EXPORT_SYMBOL(cfg80211_send_auth_timeout);
@@ -340,8 +225,6 @@ void cfg80211_send_assoc_timeout(struct net_device *dev, const u8 *addr)
        struct wireless_dev *wdev = dev->ieee80211_ptr;
        struct wiphy *wiphy = wdev->wiphy;
        struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
-       int i;
-       bool done = false;
 
        wdev_lock(wdev);
 
@@ -351,20 +234,6 @@ void cfg80211_send_assoc_timeout(struct net_device *dev, const u8 *addr)
                                          WLAN_STATUS_UNSPECIFIED_FAILURE,
                                          false, NULL);
 
-       for (i = 0; addr && i < MAX_AUTH_BSSES; i++) {
-               if (wdev->auth_bsses[i] &&
-                   memcmp(wdev->auth_bsses[i]->pub.bssid,
-                          addr, ETH_ALEN) == 0) {
-                       cfg80211_unhold_bss(wdev->auth_bsses[i]);
-                       cfg80211_put_bss(&wdev->auth_bsses[i]->pub);
-                       wdev->auth_bsses[i] = NULL;
-                       done = true;
-                       break;
-               }
-       }
-
-       WARN_ON(!done);
-
        wdev_unlock(wdev);
 }
 EXPORT_SYMBOL(cfg80211_send_assoc_timeout);
@@ -403,13 +272,11 @@ int __cfg80211_mlme_auth(struct cfg80211_registered_device *rdev,
                         const u8 *bssid,
                         const u8 *ssid, int ssid_len,
                         const u8 *ie, int ie_len,
-                        const u8 *key, int key_len, int key_idx,
-                        bool local_state_change)
+                        const u8 *key, int key_len, int key_idx)
 {
        struct wireless_dev *wdev = dev->ieee80211_ptr;
        struct cfg80211_auth_request req;
-       struct cfg80211_internal_bss *bss;
-       int i, err, slot = -1, nfree = 0;
+       int err;
 
        ASSERT_WDEV_LOCK(wdev);
 
@@ -421,20 +288,8 @@ int __cfg80211_mlme_auth(struct cfg80211_registered_device *rdev,
            memcmp(bssid, wdev->current_bss->pub.bssid, ETH_ALEN) == 0)
                return -EALREADY;
 
-       for (i = 0; i < MAX_AUTH_BSSES; i++) {
-               if (wdev->authtry_bsses[i] &&
-                   memcmp(bssid, wdev->authtry_bsses[i]->pub.bssid,
-                                               ETH_ALEN) == 0)
-                       return -EALREADY;
-               if (wdev->auth_bsses[i] &&
-                   memcmp(bssid, wdev->auth_bsses[i]->pub.bssid,
-                                               ETH_ALEN) == 0)
-                       return -EALREADY;
-       }
-
        memset(&req, 0, sizeof(req));
 
-       req.local_state_change = local_state_change;
        req.ie = ie;
        req.ie_len = ie_len;
        req.auth_type = auth_type;
@@ -446,39 +301,9 @@ int __cfg80211_mlme_auth(struct cfg80211_registered_device *rdev,
        if (!req.bss)
                return -ENOENT;
 
-       bss = bss_from_pub(req.bss);
-
-       for (i = 0; i < MAX_AUTH_BSSES; i++) {
-               if (!wdev->auth_bsses[i] && !wdev->authtry_bsses[i]) {
-                       slot = i;
-                       nfree++;
-               }
-       }
-
-       /* we need one free slot for disassoc and one for this auth */
-       if (nfree < 2) {
-               err = -ENOSPC;
-               goto out;
-       }
-
-       if (local_state_change)
-               wdev->auth_bsses[slot] = bss;
-       else
-               wdev->authtry_bsses[slot] = bss;
-       cfg80211_hold_bss(bss);
-
        err = rdev->ops->auth(&rdev->wiphy, dev, &req);
-       if (err) {
-               if (local_state_change)
-                       wdev->auth_bsses[slot] = NULL;
-               else
-                       wdev->authtry_bsses[slot] = NULL;
-               cfg80211_unhold_bss(bss);
-       }
 
- out:
-       if (err)
-               cfg80211_put_bss(req.bss);
+       cfg80211_put_bss(req.bss);
        return err;
 }
 
@@ -487,15 +312,14 @@ int cfg80211_mlme_auth(struct cfg80211_registered_device *rdev,
                       enum nl80211_auth_type auth_type, const u8 *bssid,
                       const u8 *ssid, int ssid_len,
                       const u8 *ie, int ie_len,
-                      const u8 *key, int key_len, int key_idx,
-                      bool local_state_change)
+                      const u8 *key, int key_len, int key_idx)
 {
        int err;
 
        wdev_lock(dev->ieee80211_ptr);
        err = __cfg80211_mlme_auth(rdev, dev, chan, auth_type, bssid,
                                   ssid, ssid_len, ie, ie_len,
-                                  key, key_len, key_idx, local_state_change);
+                                  key, key_len, key_idx);
        wdev_unlock(dev->ieee80211_ptr);
 
        return err;
@@ -530,8 +354,7 @@ int __cfg80211_mlme_assoc(struct cfg80211_registered_device *rdev,
 {
        struct wireless_dev *wdev = dev->ieee80211_ptr;
        struct cfg80211_assoc_request req;
-       struct cfg80211_internal_bss *bss;
-       int i, err, slot = -1;
+       int err;
        bool was_connected = false;
 
        ASSERT_WDEV_LOCK(wdev);
@@ -573,26 +396,14 @@ int __cfg80211_mlme_assoc(struct cfg80211_registered_device *rdev,
                return -ENOENT;
        }
 
-       bss = bss_from_pub(req.bss);
-
-       for (i = 0; i < MAX_AUTH_BSSES; i++) {
-               if (bss == wdev->auth_bsses[i]) {
-                       slot = i;
-                       break;
-               }
-       }
+       err = rdev->ops->assoc(&rdev->wiphy, dev, &req);
 
-       if (slot < 0) {
-               err = -ENOTCONN;
-               goto out;
+       if (err) {
+               if (was_connected)
+                       wdev->sme_state = CFG80211_SME_CONNECTED;
+               cfg80211_put_bss(req.bss);
        }
 
-       err = rdev->ops->assoc(&rdev->wiphy, dev, &req);
- out:
-       if (err && was_connected)
-               wdev->sme_state = CFG80211_SME_CONNECTED;
-       /* still a reference in wdev->auth_bsses[slot] */
-       cfg80211_put_bss(req.bss);
        return err;
 }
 
@@ -624,36 +435,27 @@ int __cfg80211_mlme_deauth(struct cfg80211_registered_device *rdev,
                           bool local_state_change)
 {
        struct wireless_dev *wdev = dev->ieee80211_ptr;
-       struct cfg80211_deauth_request req;
-       int i;
+       struct cfg80211_deauth_request req = {
+               .bssid = bssid,
+               .reason_code = reason,
+               .ie = ie,
+               .ie_len = ie_len,
+       };
 
        ASSERT_WDEV_LOCK(wdev);
 
-       memset(&req, 0, sizeof(req));
-       req.reason_code = reason;
-       req.local_state_change = local_state_change;
-       req.ie = ie;
-       req.ie_len = ie_len;
-       if (wdev->current_bss &&
-           memcmp(wdev->current_bss->pub.bssid, bssid, ETH_ALEN) == 0) {
-               req.bss = &wdev->current_bss->pub;
-       } else for (i = 0; i < MAX_AUTH_BSSES; i++) {
-               if (wdev->auth_bsses[i] &&
-                   memcmp(bssid, wdev->auth_bsses[i]->pub.bssid, ETH_ALEN) == 0) {
-                       req.bss = &wdev->auth_bsses[i]->pub;
-                       break;
-               }
-               if (wdev->authtry_bsses[i] &&
-                   memcmp(bssid, wdev->authtry_bsses[i]->pub.bssid, ETH_ALEN) == 0) {
-                       req.bss = &wdev->authtry_bsses[i]->pub;
-                       break;
+       if (local_state_change) {
+               if (wdev->current_bss &&
+                   memcmp(wdev->current_bss->pub.bssid, bssid, ETH_ALEN) == 0) {
+                       cfg80211_unhold_bss(wdev->current_bss);
+                       cfg80211_put_bss(&wdev->current_bss->pub);
+                       wdev->current_bss = NULL;
                }
-       }
 
-       if (!req.bss)
-               return -ENOTCONN;
+               return 0;
+       }
 
-       return rdev->ops->deauth(&rdev->wiphy, dev, &req, wdev);
+       return rdev->ops->deauth(&rdev->wiphy, dev, &req);
 }
 
 int cfg80211_mlme_deauth(struct cfg80211_registered_device *rdev,
@@ -698,7 +500,7 @@ static int __cfg80211_mlme_disassoc(struct cfg80211_registered_device *rdev,
        else
                return -ENOTCONN;
 
-       return rdev->ops->disassoc(&rdev->wiphy, dev, &req, wdev);
+       return rdev->ops->disassoc(&rdev->wiphy, dev, &req);
 }
 
 int cfg80211_mlme_disassoc(struct cfg80211_registered_device *rdev,
@@ -722,7 +524,7 @@ void cfg80211_mlme_down(struct cfg80211_registered_device *rdev,
 {
        struct wireless_dev *wdev = dev->ieee80211_ptr;
        struct cfg80211_deauth_request req;
-       int i;
+       u8 bssid[ETH_ALEN];
 
        ASSERT_WDEV_LOCK(wdev);
 
@@ -734,35 +536,17 @@ void cfg80211_mlme_down(struct cfg80211_registered_device *rdev,
        req.ie = NULL;
        req.ie_len = 0;
 
-       if (wdev->current_bss) {
-               req.bss = &wdev->current_bss->pub;
-               rdev->ops->deauth(&rdev->wiphy, dev, &req, wdev);
-               if (wdev->current_bss) {
-                       cfg80211_unhold_bss(wdev->current_bss);
-                       cfg80211_put_bss(&wdev->current_bss->pub);
-                       wdev->current_bss = NULL;
-               }
-       }
+       if (!wdev->current_bss)
+               return;
 
-       for (i = 0; i < MAX_AUTH_BSSES; i++) {
-               if (wdev->auth_bsses[i]) {
-                       req.bss = &wdev->auth_bsses[i]->pub;
-                       rdev->ops->deauth(&rdev->wiphy, dev, &req, wdev);
-                       if (wdev->auth_bsses[i]) {
-                               cfg80211_unhold_bss(wdev->auth_bsses[i]);
-                               cfg80211_put_bss(&wdev->auth_bsses[i]->pub);
-                               wdev->auth_bsses[i] = NULL;
-                       }
-               }
-               if (wdev->authtry_bsses[i]) {
-                       req.bss = &wdev->authtry_bsses[i]->pub;
-                       rdev->ops->deauth(&rdev->wiphy, dev, &req, wdev);
-                       if (wdev->authtry_bsses[i]) {
-                               cfg80211_unhold_bss(wdev->authtry_bsses[i]);
-                               cfg80211_put_bss(&wdev->authtry_bsses[i]->pub);
-                               wdev->authtry_bsses[i] = NULL;
-                       }
-               }
+       memcpy(bssid, wdev->current_bss->pub.bssid, ETH_ALEN);
+       req.bssid = bssid;
+       rdev->ops->deauth(&rdev->wiphy, dev, &req);
+
+       if (wdev->current_bss) {
+               cfg80211_unhold_bss(wdev->current_bss);
+               cfg80211_put_bss(&wdev->current_bss->pub);
+               wdev->current_bss = NULL;
        }
 }
 
index afeea32..1998c36 100644 (file)
@@ -427,10 +427,9 @@ static int nl80211_parse_key_new(struct nlattr *key, struct key_parse *k)
 
        if (tb[NL80211_KEY_DEFAULT_TYPES]) {
                struct nlattr *kdt[NUM_NL80211_KEY_DEFAULT_TYPES];
-               int err = nla_parse_nested(kdt,
-                                          NUM_NL80211_KEY_DEFAULT_TYPES - 1,
-                                          tb[NL80211_KEY_DEFAULT_TYPES],
-                                          nl80211_key_default_policy);
+               err = nla_parse_nested(kdt, NUM_NL80211_KEY_DEFAULT_TYPES - 1,
+                                      tb[NL80211_KEY_DEFAULT_TYPES],
+                                      nl80211_key_default_policy);
                if (err)
                        return err;
 
@@ -872,7 +871,7 @@ static int nl80211_send_wiphy(struct sk_buff *msg, u32 pid, u32 seq, int flags,
        CMD(add_virtual_intf, NEW_INTERFACE);
        CMD(change_virtual_intf, SET_INTERFACE);
        CMD(add_key, NEW_KEY);
-       CMD(add_beacon, NEW_BEACON);
+       CMD(start_ap, START_AP);
        CMD(add_station, NEW_STATION);
        CMD(add_mpath, NEW_MPATH);
        CMD(update_mesh_config, SET_MESH_CONFIG);
@@ -2076,15 +2075,10 @@ static int nl80211_del_key(struct sk_buff *skb, struct genl_info *info)
        return err;
 }
 
-static int nl80211_addset_beacon(struct sk_buff *skb, struct genl_info *info)
+static int nl80211_parse_beacon(struct genl_info *info,
+                               struct cfg80211_beacon_data *bcn)
 {
-        int (*call)(struct wiphy *wiphy, struct net_device *dev,
-                   struct beacon_parameters *info);
-       struct cfg80211_registered_device *rdev = info->user_ptr[0];
-       struct net_device *dev = info->user_ptr[1];
-       struct wireless_dev *wdev = dev->ieee80211_ptr;
-       struct beacon_parameters params;
-       int haveinfo = 0, err;
+       bool haveinfo = false;
 
        if (!is_valid_ie_attr(info->attrs[NL80211_ATTR_BEACON_TAIL]) ||
            !is_valid_ie_attr(info->attrs[NL80211_ATTR_IE]) ||
@@ -2092,149 +2086,183 @@ static int nl80211_addset_beacon(struct sk_buff *skb, struct genl_info *info)
            !is_valid_ie_attr(info->attrs[NL80211_ATTR_IE_ASSOC_RESP]))
                return -EINVAL;
 
-       if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP &&
-           dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO)
-               return -EOPNOTSUPP;
-
-       memset(&params, 0, sizeof(params));
-
-       switch (info->genlhdr->cmd) {
-       case NL80211_CMD_NEW_BEACON:
-               /* these are required for NEW_BEACON */
-               if (!info->attrs[NL80211_ATTR_BEACON_INTERVAL] ||
-                   !info->attrs[NL80211_ATTR_DTIM_PERIOD] ||
-                   !info->attrs[NL80211_ATTR_BEACON_HEAD])
-                       return -EINVAL;
-
-               params.interval =
-                       nla_get_u32(info->attrs[NL80211_ATTR_BEACON_INTERVAL]);
-               params.dtim_period =
-                       nla_get_u32(info->attrs[NL80211_ATTR_DTIM_PERIOD]);
-
-               err = cfg80211_validate_beacon_int(rdev, params.interval);
-               if (err)
-                       return err;
-
-               /*
-                * In theory, some of these attributes could be required for
-                * NEW_BEACON, but since they were not used when the command was
-                * originally added, keep them optional for old user space
-                * programs to work with drivers that do not need the additional
-                * information.
-                */
-               if (info->attrs[NL80211_ATTR_SSID]) {
-                       params.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]);
-                       params.ssid_len =
-                               nla_len(info->attrs[NL80211_ATTR_SSID]);
-                       if (params.ssid_len == 0 ||
-                           params.ssid_len > IEEE80211_MAX_SSID_LEN)
-                               return -EINVAL;
-               }
-
-               if (info->attrs[NL80211_ATTR_HIDDEN_SSID]) {
-                       params.hidden_ssid = nla_get_u32(
-                               info->attrs[NL80211_ATTR_HIDDEN_SSID]);
-                       if (params.hidden_ssid !=
-                           NL80211_HIDDEN_SSID_NOT_IN_USE &&
-                           params.hidden_ssid !=
-                           NL80211_HIDDEN_SSID_ZERO_LEN &&
-                           params.hidden_ssid !=
-                           NL80211_HIDDEN_SSID_ZERO_CONTENTS)
-                               return -EINVAL;
-               }
-
-               params.privacy = !!info->attrs[NL80211_ATTR_PRIVACY];
-
-               if (info->attrs[NL80211_ATTR_AUTH_TYPE]) {
-                       params.auth_type = nla_get_u32(
-                               info->attrs[NL80211_ATTR_AUTH_TYPE]);
-                       if (!nl80211_valid_auth_type(params.auth_type))
-                               return -EINVAL;
-               } else
-                       params.auth_type = NL80211_AUTHTYPE_AUTOMATIC;
-
-               err = nl80211_crypto_settings(rdev, info, &params.crypto,
-                                             NL80211_MAX_NR_CIPHER_SUITES);
-               if (err)
-                       return err;
-
-               call = rdev->ops->add_beacon;
-               break;
-       case NL80211_CMD_SET_BEACON:
-               call = rdev->ops->set_beacon;
-               break;
-       default:
-               WARN_ON(1);
-               return -EOPNOTSUPP;
-       }
-
-       if (!call)
-               return -EOPNOTSUPP;
+       memset(bcn, 0, sizeof(*bcn));
 
        if (info->attrs[NL80211_ATTR_BEACON_HEAD]) {
-               params.head = nla_data(info->attrs[NL80211_ATTR_BEACON_HEAD]);
-               params.head_len =
-                   nla_len(info->attrs[NL80211_ATTR_BEACON_HEAD]);
-               haveinfo = 1;
+               bcn->head = nla_data(info->attrs[NL80211_ATTR_BEACON_HEAD]);
+               bcn->head_len = nla_len(info->attrs[NL80211_ATTR_BEACON_HEAD]);
+               if (!bcn->head_len)
+                       return -EINVAL;
+               haveinfo = true;
        }
 
        if (info->attrs[NL80211_ATTR_BEACON_TAIL]) {
-               params.tail = nla_data(info->attrs[NL80211_ATTR_BEACON_TAIL]);
-               params.tail_len =
+               bcn->tail = nla_data(info->attrs[NL80211_ATTR_BEACON_TAIL]);
+               bcn->tail_len =
                    nla_len(info->attrs[NL80211_ATTR_BEACON_TAIL]);
-               haveinfo = 1;
+               haveinfo = true;
        }
 
        if (!haveinfo)
                return -EINVAL;
 
        if (info->attrs[NL80211_ATTR_IE]) {
-               params.beacon_ies = nla_data(info->attrs[NL80211_ATTR_IE]);
-               params.beacon_ies_len = nla_len(info->attrs[NL80211_ATTR_IE]);
+               bcn->beacon_ies = nla_data(info->attrs[NL80211_ATTR_IE]);
+               bcn->beacon_ies_len = nla_len(info->attrs[NL80211_ATTR_IE]);
        }
 
        if (info->attrs[NL80211_ATTR_IE_PROBE_RESP]) {
-               params.proberesp_ies =
+               bcn->proberesp_ies =
                        nla_data(info->attrs[NL80211_ATTR_IE_PROBE_RESP]);
-               params.proberesp_ies_len =
+               bcn->proberesp_ies_len =
                        nla_len(info->attrs[NL80211_ATTR_IE_PROBE_RESP]);
        }
 
        if (info->attrs[NL80211_ATTR_IE_ASSOC_RESP]) {
-               params.assocresp_ies =
+               bcn->assocresp_ies =
                        nla_data(info->attrs[NL80211_ATTR_IE_ASSOC_RESP]);
-               params.assocresp_ies_len =
+               bcn->assocresp_ies_len =
                        nla_len(info->attrs[NL80211_ATTR_IE_ASSOC_RESP]);
        }
 
        if (info->attrs[NL80211_ATTR_PROBE_RESP]) {
-               params.probe_resp =
+               bcn->probe_resp =
                        nla_data(info->attrs[NL80211_ATTR_PROBE_RESP]);
-               params.probe_resp_len =
+               bcn->probe_resp_len =
                        nla_len(info->attrs[NL80211_ATTR_PROBE_RESP]);
        }
 
-       err = call(&rdev->wiphy, dev, &params);
-       if (!err && params.interval)
-               wdev->beacon_interval = params.interval;
+       return 0;
+}
+
+static int nl80211_start_ap(struct sk_buff *skb, struct genl_info *info)
+{
+       struct cfg80211_registered_device *rdev = info->user_ptr[0];
+       struct net_device *dev = info->user_ptr[1];
+       struct wireless_dev *wdev = dev->ieee80211_ptr;
+       struct cfg80211_ap_settings params;
+       int err;
+
+       if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP &&
+           dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO)
+               return -EOPNOTSUPP;
+
+       if (!rdev->ops->start_ap)
+               return -EOPNOTSUPP;
+
+       if (wdev->beacon_interval)
+               return -EALREADY;
+
+       memset(&params, 0, sizeof(params));
+
+       /* these are required for START_AP */
+       if (!info->attrs[NL80211_ATTR_BEACON_INTERVAL] ||
+           !info->attrs[NL80211_ATTR_DTIM_PERIOD] ||
+           !info->attrs[NL80211_ATTR_BEACON_HEAD])
+               return -EINVAL;
+
+       err = nl80211_parse_beacon(info, &params.beacon);
+       if (err)
+               return err;
+
+       params.beacon_interval =
+               nla_get_u32(info->attrs[NL80211_ATTR_BEACON_INTERVAL]);
+       params.dtim_period =
+               nla_get_u32(info->attrs[NL80211_ATTR_DTIM_PERIOD]);
+
+       err = cfg80211_validate_beacon_int(rdev, params.beacon_interval);
+       if (err)
+               return err;
+
+       /*
+        * In theory, some of these attributes should be required here
+        * but since they were not used when the command was originally
+        * added, keep them optional for old user space programs to let
+        * them continue to work with drivers that do not need the
+        * additional information -- drivers must check!
+        */
+       if (info->attrs[NL80211_ATTR_SSID]) {
+               params.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]);
+               params.ssid_len =
+                       nla_len(info->attrs[NL80211_ATTR_SSID]);
+               if (params.ssid_len == 0 ||
+                   params.ssid_len > IEEE80211_MAX_SSID_LEN)
+                       return -EINVAL;
+       }
+
+       if (info->attrs[NL80211_ATTR_HIDDEN_SSID]) {
+               params.hidden_ssid = nla_get_u32(
+                       info->attrs[NL80211_ATTR_HIDDEN_SSID]);
+               if (params.hidden_ssid != NL80211_HIDDEN_SSID_NOT_IN_USE &&
+                   params.hidden_ssid != NL80211_HIDDEN_SSID_ZERO_LEN &&
+                   params.hidden_ssid != NL80211_HIDDEN_SSID_ZERO_CONTENTS)
+                       return -EINVAL;
+       }
+
+       params.privacy = !!info->attrs[NL80211_ATTR_PRIVACY];
+
+       if (info->attrs[NL80211_ATTR_AUTH_TYPE]) {
+               params.auth_type = nla_get_u32(
+                       info->attrs[NL80211_ATTR_AUTH_TYPE]);
+               if (!nl80211_valid_auth_type(params.auth_type))
+                       return -EINVAL;
+       } else
+               params.auth_type = NL80211_AUTHTYPE_AUTOMATIC;
+
+       err = nl80211_crypto_settings(rdev, info, &params.crypto,
+                                     NL80211_MAX_NR_CIPHER_SUITES);
+       if (err)
+               return err;
+
+       err = rdev->ops->start_ap(&rdev->wiphy, dev, &params);
+       if (!err)
+               wdev->beacon_interval = params.beacon_interval;
        return err;
 }
 
-static int nl80211_del_beacon(struct sk_buff *skb, struct genl_info *info)
+static int nl80211_set_beacon(struct sk_buff *skb, struct genl_info *info)
 {
        struct cfg80211_registered_device *rdev = info->user_ptr[0];
        struct net_device *dev = info->user_ptr[1];
        struct wireless_dev *wdev = dev->ieee80211_ptr;
+       struct cfg80211_beacon_data params;
        int err;
 
-       if (!rdev->ops->del_beacon)
+       if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP &&
+           dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO)
+               return -EOPNOTSUPP;
+
+       if (!rdev->ops->change_beacon)
+               return -EOPNOTSUPP;
+
+       if (!wdev->beacon_interval)
+               return -EINVAL;
+
+       err = nl80211_parse_beacon(info, &params);
+       if (err)
+               return err;
+
+       return rdev->ops->change_beacon(&rdev->wiphy, dev, &params);
+}
+
+static int nl80211_stop_ap(struct sk_buff *skb, struct genl_info *info)
+{
+       struct cfg80211_registered_device *rdev = info->user_ptr[0];
+       struct net_device *dev = info->user_ptr[1];
+       struct wireless_dev *wdev = dev->ieee80211_ptr;
+       int err;
+
+       if (!rdev->ops->stop_ap)
                return -EOPNOTSUPP;
 
        if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP &&
            dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO)
                return -EOPNOTSUPP;
 
-       err = rdev->ops->del_beacon(&rdev->wiphy, dev);
+       if (!wdev->beacon_interval)
+               return -ENOENT;
+
+       err = rdev->ops->stop_ap(&rdev->wiphy, dev);
        if (!err)
                wdev->beacon_interval = 0;
        return err;
@@ -2655,13 +2683,6 @@ static int nl80211_set_station(struct sk_buff *skb, struct genl_info *info)
                break;
        case NL80211_IFTYPE_P2P_CLIENT:
        case NL80211_IFTYPE_STATION:
-               /* disallow things sta doesn't support */
-               if (params.plink_action)
-                       return -EINVAL;
-               if (params.ht_capa)
-                       return -EINVAL;
-               if (params.listen_interval >= 0)
-                       return -EINVAL;
                /*
                 * Don't allow userspace to change the TDLS_PEER flag,
                 * but silently ignore attempts to change it since we
@@ -2669,7 +2690,15 @@ static int nl80211_set_station(struct sk_buff *skb, struct genl_info *info)
                 * to change the flag.
                 */
                params.sta_flags_mask &= ~BIT(NL80211_STA_FLAG_TDLS_PEER);
-
+               /* fall through */
+       case NL80211_IFTYPE_ADHOC:
+               /* disallow things sta doesn't support */
+               if (params.plink_action)
+                       return -EINVAL;
+               if (params.ht_capa)
+                       return -EINVAL;
+               if (params.listen_interval >= 0)
+                       return -EINVAL;
                /* reject any changes other than AUTHORIZED */
                if (params.sta_flags_mask & ~BIT(NL80211_STA_FLAG_AUTHORIZED))
                        return -EINVAL;
@@ -3259,6 +3288,8 @@ static int nl80211_get_mesh_config(struct sk_buff *skb,
                        cur_params.dot11MeshHWMPRannInterval);
        NLA_PUT_U8(msg, NL80211_MESHCONF_GATE_ANNOUNCEMENTS,
                        cur_params.dot11MeshGateAnnouncementProtocol);
+       NLA_PUT_U8(msg, NL80211_MESHCONF_FORWARDING,
+                       cur_params.dot11MeshForwarding);
        nla_nest_end(msg, pinfoattr);
        genlmsg_end(msg, hdr);
        return genlmsg_reply(msg, info);
@@ -3290,6 +3321,7 @@ static const struct nla_policy nl80211_meshconf_params_policy[NL80211_MESHCONF_A
        [NL80211_MESHCONF_HWMP_ROOTMODE] = { .type = NLA_U8 },
        [NL80211_MESHCONF_HWMP_RANN_INTERVAL] = { .type = NLA_U16 },
        [NL80211_MESHCONF_GATE_ANNOUNCEMENTS] = { .type = NLA_U8 },
+       [NL80211_MESHCONF_FORWARDING] = { .type = NLA_U8 },
 };
 
 static const struct nla_policy
@@ -3379,6 +3411,8 @@ do {\
                        dot11MeshGateAnnouncementProtocol, mask,
                        NL80211_MESHCONF_GATE_ANNOUNCEMENTS,
                        nla_get_u8);
+       FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshForwarding,
+                       mask, NL80211_MESHCONF_FORWARDING, nla_get_u8);
        if (mask_out)
                *mask_out = mask;
 
@@ -4079,7 +4113,6 @@ static int nl80211_send_bss(struct sk_buff *msg, struct netlink_callback *cb,
        struct cfg80211_bss *res = &intbss->pub;
        void *hdr;
        struct nlattr *bss;
-       int i;
 
        ASSERT_WDEV_LOCK(wdev);
 
@@ -4132,13 +4165,6 @@ static int nl80211_send_bss(struct sk_buff *msg, struct netlink_callback *cb,
                if (intbss == wdev->current_bss)
                        NLA_PUT_U32(msg, NL80211_BSS_STATUS,
                                    NL80211_BSS_STATUS_ASSOCIATED);
-               else for (i = 0; i < MAX_AUTH_BSSES; i++) {
-                       if (intbss != wdev->auth_bsses[i])
-                               continue;
-                       NLA_PUT_U32(msg, NL80211_BSS_STATUS,
-                                   NL80211_BSS_STATUS_AUTHENTICATED);
-                       break;
-               }
                break;
        case NL80211_IFTYPE_ADHOC:
                if (intbss == wdev->current_bss)
@@ -4406,10 +4432,16 @@ static int nl80211_authenticate(struct sk_buff *skb, struct genl_info *info)
 
        local_state_change = !!info->attrs[NL80211_ATTR_LOCAL_STATE_CHANGE];
 
+       /*
+        * Since we no longer track auth state, ignore
+        * requests to only change local state.
+        */
+       if (local_state_change)
+               return 0;
+
        return cfg80211_mlme_auth(rdev, dev, chan, auth_type, bssid,
                                  ssid, ssid_len, ie, ie_len,
-                                 key.p.key, key.p.key_len, key.idx,
-                                 local_state_change);
+                                 key.p.key, key.p.key_len, key.idx);
 }
 
 static int nl80211_crypto_settings(struct cfg80211_registered_device *rdev,
@@ -4781,7 +4813,6 @@ static int nl80211_join_ibss(struct sk_buff *skb, struct genl_info *info)
                        nla_len(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]);
                struct ieee80211_supported_band *sband =
                        wiphy->bands[ibss.channel->band];
-               int err;
 
                err = ieee80211_get_ratemask(sband, rates, n_rates,
                                             &ibss.basic_rates);
@@ -4801,6 +4832,9 @@ static int nl80211_join_ibss(struct sk_buff *skb, struct genl_info *info)
                        return PTR_ERR(connkeys);
        }
 
+       ibss.control_port =
+               nla_get_flag(info->attrs[NL80211_ATTR_CONTROL_PORT]);
+
        err = cfg80211_join_ibss(rdev, dev, &ibss, connkeys);
        if (err)
                kfree(connkeys);
@@ -5390,9 +5424,39 @@ static u32 rateset_to_mask(struct ieee80211_supported_band *sband,
        return mask;
 }
 
+static bool ht_rateset_to_mask(struct ieee80211_supported_band *sband,
+                              u8 *rates, u8 rates_len,
+                              u8 mcs[IEEE80211_HT_MCS_MASK_LEN])
+{
+       u8 i;
+
+       memset(mcs, 0, IEEE80211_HT_MCS_MASK_LEN);
+
+       for (i = 0; i < rates_len; i++) {
+               int ridx, rbit;
+
+               ridx = rates[i] / 8;
+               rbit = BIT(rates[i] % 8);
+
+               /* check validity */
+               if ((ridx < 0) || (ridx >= IEEE80211_HT_MCS_MASK_LEN))
+                       return false;
+
+               /* check availability */
+               if (sband->ht_cap.mcs.rx_mask[ridx] & rbit)
+                       mcs[ridx] |= rbit;
+               else
+                       return false;
+       }
+
+       return true;
+}
+
 static const struct nla_policy nl80211_txattr_policy[NL80211_TXRATE_MAX + 1] = {
        [NL80211_TXRATE_LEGACY] = { .type = NLA_BINARY,
                                    .len = NL80211_MAX_SUPP_RATES },
+       [NL80211_TXRATE_MCS] = { .type = NLA_BINARY,
+                                .len = NL80211_MAX_SUPP_HT_RATES },
 };
 
 static int nl80211_set_tx_bitrate_mask(struct sk_buff *skb,
@@ -5418,12 +5482,20 @@ static int nl80211_set_tx_bitrate_mask(struct sk_buff *skb,
                sband = rdev->wiphy.bands[i];
                mask.control[i].legacy =
                        sband ? (1 << sband->n_bitrates) - 1 : 0;
+               if (sband)
+                       memcpy(mask.control[i].mcs,
+                              sband->ht_cap.mcs.rx_mask,
+                              sizeof(mask.control[i].mcs));
+               else
+                       memset(mask.control[i].mcs, 0,
+                              sizeof(mask.control[i].mcs));
        }
 
        /*
         * The nested attribute uses enum nl80211_band as the index. This maps
         * directly to the enum ieee80211_band values used in cfg80211.
         */
+       BUILD_BUG_ON(NL80211_MAX_SUPP_HT_RATES > IEEE80211_HT_MCS_MASK_LEN * 8);
        nla_for_each_nested(tx_rates, info->attrs[NL80211_ATTR_TX_RATES], rem)
        {
                enum ieee80211_band band = nla_type(tx_rates);
@@ -5439,7 +5511,28 @@ static int nl80211_set_tx_bitrate_mask(struct sk_buff *skb,
                                sband,
                                nla_data(tb[NL80211_TXRATE_LEGACY]),
                                nla_len(tb[NL80211_TXRATE_LEGACY]));
-                       if (mask.control[band].legacy == 0)
+               }
+               if (tb[NL80211_TXRATE_MCS]) {
+                       if (!ht_rateset_to_mask(
+                                       sband,
+                                       nla_data(tb[NL80211_TXRATE_MCS]),
+                                       nla_len(tb[NL80211_TXRATE_MCS]),
+                                       mask.control[band].mcs))
+                               return -EINVAL;
+               }
+
+               if (mask.control[band].legacy == 0) {
+                       /* don't allow empty legacy rates if HT
+                        * is not even supported. */
+                       if (!rdev->wiphy.bands[band]->ht_cap.ht_supported)
+                               return -EINVAL;
+
+                       for (i = 0; i < IEEE80211_HT_MCS_MASK_LEN; i++)
+                               if (mask.control[band].mcs[i])
+                                       break;
+
+                       /* legacy and mcs rates may not be both empty */
+                       if (i == IEEE80211_HT_MCS_MASK_LEN)
                                return -EINVAL;
                }
        }
@@ -6293,23 +6386,23 @@ static struct genl_ops nl80211_ops[] = {
                .cmd = NL80211_CMD_SET_BEACON,
                .policy = nl80211_policy,
                .flags = GENL_ADMIN_PERM,
-               .doit = nl80211_addset_beacon,
+               .doit = nl80211_set_beacon,
                .internal_flags = NL80211_FLAG_NEED_NETDEV |
                                  NL80211_FLAG_NEED_RTNL,
        },
        {
-               .cmd = NL80211_CMD_NEW_BEACON,
+               .cmd = NL80211_CMD_START_AP,
                .policy = nl80211_policy,
                .flags = GENL_ADMIN_PERM,
-               .doit = nl80211_addset_beacon,
+               .doit = nl80211_start_ap,
                .internal_flags = NL80211_FLAG_NEED_NETDEV |
                                  NL80211_FLAG_NEED_RTNL,
        },
        {
-               .cmd = NL80211_CMD_DEL_BEACON,
+               .cmd = NL80211_CMD_STOP_AP,
                .policy = nl80211_policy,
                .flags = GENL_ADMIN_PERM,
-               .doit = nl80211_del_beacon,
+               .doit = nl80211_stop_ap,
                .internal_flags = NL80211_FLAG_NEED_NETDEV |
                                  NL80211_FLAG_NEED_RTNL,
        },
index f65feaa..e9a0ac8 100644 (file)
@@ -882,23 +882,8 @@ static void handle_channel(struct wiphy *wiphy,
        chan->flags = flags | bw_flags | map_regdom_flags(reg_rule->flags);
        chan->max_antenna_gain = min(chan->orig_mag,
                (int) MBI_TO_DBI(power_rule->max_antenna_gain));
-       if (chan->orig_mpwr) {
-               /*
-                * Devices that have their own custom regulatory domain
-                * but also use WIPHY_FLAG_STRICT_REGULATORY will follow the
-                * passed country IE power settings.
-                */
-               if (initiator == NL80211_REGDOM_SET_BY_COUNTRY_IE &&
-                   wiphy->flags & WIPHY_FLAG_CUSTOM_REGULATORY &&
-                   wiphy->flags & WIPHY_FLAG_STRICT_REGULATORY) {
-                       chan->max_power =
-                               MBM_TO_DBM(power_rule->max_eirp);
-               } else {
-                       chan->max_power = min(chan->orig_mpwr,
-                               (int) MBM_TO_DBM(power_rule->max_eirp));
-               }
-       } else
-               chan->max_power = (int) MBM_TO_DBM(power_rule->max_eirp);
+       chan->max_reg_power = (int) MBM_TO_DBM(power_rule->max_eirp);
+       chan->max_power = min(chan->max_power, chan->max_reg_power);
 }
 
 static void handle_band(struct wiphy *wiphy,
index 31119e3..afde7e5 100644 (file)
@@ -861,6 +861,18 @@ cfg80211_inform_bss_frame(struct wiphy *wiphy,
 }
 EXPORT_SYMBOL(cfg80211_inform_bss_frame);
 
+void cfg80211_ref_bss(struct cfg80211_bss *pub)
+{
+       struct cfg80211_internal_bss *bss;
+
+       if (!pub)
+               return;
+
+       bss = container_of(pub, struct cfg80211_internal_bss, pub);
+       kref_get(&bss->ref);
+}
+EXPORT_SYMBOL(cfg80211_ref_bss);
+
 void cfg80211_put_bss(struct cfg80211_bss *pub)
 {
        struct cfg80211_internal_bss *bss;
index 7b9ecae..f7e937f 100644 (file)
@@ -179,7 +179,7 @@ static int cfg80211_conn_do_work(struct wireless_dev *wdev)
                                            params->ssid, params->ssid_len,
                                            NULL, 0,
                                            params->key, params->key_len,
-                                           params->key_idx, false);
+                                           params->key_idx);
        case CFG80211_CONN_ASSOCIATE_NEXT:
                BUG_ON(!rdev->ops->assoc);
                wdev->conn->state = CFG80211_CONN_ASSOCIATING;
@@ -477,6 +477,7 @@ void __cfg80211_connect_result(struct net_device *dev, const u8 *bssid,
                kfree(wdev->connect_keys);
                wdev->connect_keys = NULL;
                wdev->ssid_len = 0;
+               cfg80211_put_bss(bss);
                return;
        }
 
@@ -701,31 +702,10 @@ void __cfg80211_disconnected(struct net_device *dev, const u8 *ie,
        wdev->ssid_len = 0;
 
        if (wdev->conn) {
-               const u8 *bssid;
-               int ret;
-
                kfree(wdev->conn->ie);
                wdev->conn->ie = NULL;
                kfree(wdev->conn);
                wdev->conn = NULL;
-
-               /*
-                * If this disconnect was due to a disassoc, we
-                * we might still have an auth BSS around. For
-                * the userspace SME that's currently expected,
-                * but for the kernel SME (nl80211 CONNECT or
-                * wireless extensions) we want to clear up all
-                * state.
-                */
-               for (i = 0; i < MAX_AUTH_BSSES; i++) {
-                       if (!wdev->auth_bsses[i])
-                               continue;
-                       bssid = wdev->auth_bsses[i]->pub.bssid;
-                       ret = __cfg80211_mlme_deauth(rdev, dev, bssid, NULL, 0,
-                                               WLAN_REASON_DEAUTH_LEAVING,
-                                               false);
-                       WARN(ret, "deauth failed: %d\n", ret);
-               }
        }
 
        nl80211_send_disconnected(rdev, dev, reason, ie, ie_len, from_ap);
@@ -1012,7 +992,8 @@ int cfg80211_disconnect(struct cfg80211_registered_device *rdev,
        return err;
 }
 
-void cfg80211_sme_disassoc(struct net_device *dev, int idx)
+void cfg80211_sme_disassoc(struct net_device *dev,
+                          struct cfg80211_internal_bss *bss)
 {
        struct wireless_dev *wdev = dev->ieee80211_ptr;
        struct cfg80211_registered_device *rdev = wiphy_to_dev(wdev->wiphy);
@@ -1031,16 +1012,8 @@ void cfg80211_sme_disassoc(struct net_device *dev, int idx)
         * want it any more so deauthenticate too.
         */
 
-       if (!wdev->auth_bsses[idx])
-               return;
+       memcpy(bssid, bss->pub.bssid, ETH_ALEN);
 
-       memcpy(bssid, wdev->auth_bsses[idx]->pub.bssid, ETH_ALEN);
-       if (__cfg80211_mlme_deauth(rdev, dev, bssid,
-                                  NULL, 0, WLAN_REASON_DEAUTH_LEAVING,
-                                  false)) {
-               /* whatever -- assume gone anyway */
-               cfg80211_unhold_bss(wdev->auth_bsses[idx]);
-               cfg80211_put_bss(&wdev->auth_bsses[idx]->pub);
-               wdev->auth_bsses[idx] = NULL;
-       }
+       __cfg80211_mlme_deauth(rdev, dev, bssid, NULL, 0,
+                              WLAN_REASON_DEAUTH_LEAVING, false);
 }
index 66b84fb..7128dde 100644 (file)
@@ -2299,8 +2299,13 @@ static int xfrm_user_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh)
                if (link->dump == NULL)
                        return -EINVAL;
 
-               return netlink_dump_start(net->xfrm.nlsk, skb, nlh,
-                                         link->dump, link->done, 0);
+               {
+                       struct netlink_dump_control c = {
+                               .dump = link->dump,
+                               .done = link->done,
+                       };
+                       return netlink_dump_start(net->xfrm.nlsk, skb, nlh, &c);
+               }
        }
 
        err = nlmsg_parse(nlh, xfrm_msg_min[type], attrs, XFRMA_MAX,